PanBadge/tama.lst

3459 lines
145 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: 0410006f j 840 <handle_reset>
4: 00000000 .word 0x00000000
8: 000008fe .word 0x000008fe
c: 000008b2 .word 0x000008b2
...
30: 000008b2 .word 0x000008b2
34: 00000000 .word 0x00000000
38: 000008b2 .word 0x000008b2
3c: 00000000 .word 0x00000000
40: 000008b2 .word 0x000008b2
44: 000008b2 .word 0x000008b2
48: 000008b2 .word 0x000008b2
4c: 000008b2 .word 0x000008b2
50: 000008b2 .word 0x000008b2
54: 000008b2 .word 0x000008b2
58: 000008b2 .word 0x000008b2
5c: 000008b2 .word 0x000008b2
60: 000008b2 .word 0x000008b2
64: 000008b2 .word 0x000008b2
68: 000008b2 .word 0x000008b2
6c: 000008b2 .word 0x000008b2
70: 000008b2 .word 0x000008b2
74: 000008b2 .word 0x000008b2
78: 000008b2 .word 0x000008b2
7c: 000008b2 .word 0x000008b2
80: 000008b2 .word 0x000008b2
84: 000008b2 .word 0x000008b2
88: 000008b2 .word 0x000008b2
8c: 000008b2 .word 0x000008b2
90: 000008b2 .word 0x000008b2
94: 000008b2 .word 0x000008b2
98: 000008b2 .word 0x000008b2
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.f19bf6d4+0xc8af>
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: c2818513 addi a0,gp,-984 # 20000024 <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 <beep>:
// ----------------------------------------------------------------- helpers
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)
{
3a4: 1131 addi sp,sp,-20
3a6: c622 sw s0,12(sp)
3a8: 842e mv s0,a1
if (freq == 0) { Delay_Ms(ms); return; }
uint32_t half = 500000u / freq; // half-period in us
3aa: 85aa mv a1,a0
3ac: 0007a537 lui a0,0x7a
3b0: 12050513 addi a0,a0,288 # 7a120 <tama.c.f19bf6d4+0x76a0f>
{
3b4: c806 sw ra,16(sp)
3b6: c426 sw s1,8(sp)
uint32_t half = 500000u / freq; // half-period in us
3b8: 39c5 jal a8 <__hidden___udivsi3>
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
3ba: 00541793 slli a5,s0,0x5
3be: 8f81 sub a5,a5,s0
3c0: 078a slli a5,a5,0x2
3c2: 97a2 add a5,a5,s0
3c4: 00151413 slli s0,a0,0x1
uint32_t half = 500000u / freq; // half-period in us
3c8: 84aa mv s1,a0
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
3ca: 85a2 mv a1,s0
3cc: 00379513 slli a0,a5,0x3
3d0: 39e1 jal a8 <__hidden___udivsi3>
for (uint32_t i = 0; i < cycles; i++) {
funDigitalWrite(BUZZER, FUN_HIGH);
Delay_Us(half);
3d2: 9426 add s0,s0,s1
3d4: 00141793 slli a5,s0,0x1
uint32_t cycles = ((uint32_t)ms * 1000u) / (half * 2u);
3d8: 872a mv a4,a0
Delay_Us(half);
3da: c03e sw a5,0(sp)
for (uint32_t i = 0; i < cycles; i++) {
3dc: 4401 li s0,0
Delay_Us(half);
3de: 4502 lw a0,0(sp)
funDigitalWrite(BUZZER, FUN_HIGH);
3e0: 400114b7 lui s1,0x40011
3e4: c23a sw a4,4(sp)
3e6: 4691 li a3,4
3e8: 40048493 addi s1,s1,1024 # 40011400 <_eusrstack+0x20010c00>
3ec: c894 sw a3,16(s1)
Delay_Us(half);
3ee: 3d91 jal 242 <DelaySysTick>
funDigitalWrite(BUZZER, FUN_LOW);
Delay_Us(half);
3f0: 4502 lw a0,0(sp)
funDigitalWrite(BUZZER, FUN_LOW);
3f2: 000406b7 lui a3,0x40
3f6: c894 sw a3,16(s1)
Delay_Us(half);
3f8: 35a9 jal 242 <DelaySysTick>
for (uint32_t i = 0; i < cycles; i++) {
3fa: 4712 lw a4,4(sp)
3fc: 0405 addi s0,s0,1
3fe: fe8710e3 bne a4,s0,3de <beep+0x3a>
}
}
402: 40c2 lw ra,16(sp)
404: 4432 lw s0,12(sp)
406: 44a2 lw s1,8(sp)
408: 0151 addi sp,sp,20
40a: 8082 ret
0000040c <led_blink>:
static void led_blink(void)
{
40c: 1161 addi sp,sp,-8
40e: c022 sw s0,0(sp)
funDigitalWrite(LED_PIN, FUN_HIGH);
410: 40011437 lui s0,0x40011
{
414: c206 sw ra,4(sp)
funDigitalWrite(LED_PIN, FUN_HIGH);
416: 80040413 addi s0,s0,-2048 # 40010800 <_eusrstack+0x20010000>
41a: 4789 li a5,2
Delay_Ms(30);
41c: 0002c537 lui a0,0x2c
funDigitalWrite(LED_PIN, FUN_HIGH);
420: c81c sw a5,16(s0)
Delay_Ms(30);
422: f2050513 addi a0,a0,-224 # 2bf20 <tama.c.f19bf6d4+0x2880f>
426: 3d31 jal 242 <DelaySysTick>
funDigitalWrite(LED_PIN, FUN_LOW);
428: 000207b7 lui a5,0x20
}
42c: 4092 lw ra,4(sp)
funDigitalWrite(LED_PIN, FUN_LOW);
42e: c81c sw a5,16(s0)
}
430: 4402 lw s0,0(sp)
432: 0121 addi sp,sp,8
434: 8082 ret
00000436 <pet_reset>:
static void pet_reset(void)
{
pet.satiety = 80;
436: 645a5737 lui a4,0x645a5
43a: 05070713 addi a4,a4,80 # 645a5050 <_eusrstack+0x445a4850>
43e: c0e1ae23 sw a4,-996(gp) # 20000018 <pet>
pet.happy = 80;
pet.energy = 90;
pet.hygiene = 100;
pet.health = 100;
442: c1c18793 addi a5,gp,-996 # 20000018 <pet>
446: 06400713 li a4,100
44a: 00e78223 sb a4,4(a5) # 20004 <tama.c.f19bf6d4+0x1c8f3>
pet.age_min = 0;
pet.poop = 0;
pet.sleeping = 0;
pet.alive = 1;
44e: 4705 li a4,1
pet.age_min = 0;
450: 00079323 sh zero,6(a5)
pet.poop = 0;
454: 00079423 sh zero,8(a5)
pet.alive = 1;
458: 00e78523 sb a4,10(a5)
screen = SCR_MAIN;
45c: c0018c23 sb zero,-1000(gp) # 20000014 <screen>
cursor = 0;
460: c0018ba3 sb zero,-1001(gp) # 20000013 <cursor>
}
464: 8082 ret
00000466 <read_buttons>:
static Buttons read_buttons(void)
{
// active-low: pressed reads 0
Buttons b;
b.ok = !funDigitalRead(BTN_OK);
466: 400117b7 lui a5,0x40011
46a: 4788 lw a0,8(a5)
b.left = !funDigitalRead(BTN_LEFT);
46c: 40078793 addi a5,a5,1024 # 40011400 <_eusrstack+0x20010c00>
470: 4798 lw a4,8(a5)
b.right = !funDigitalRead(BTN_RIGHT);
472: 479c lw a5,8(a5)
b.ok = !funDigitalRead(BTN_OK);
474: fff54513 not a0,a0
b.left = !funDigitalRead(BTN_LEFT);
478: 8319 srli a4,a4,0x6
47a: fff74713 not a4,a4
b.right = !funDigitalRead(BTN_RIGHT);
47e: 8395 srli a5,a5,0x5
480: fff7c793 not a5,a5
return b;
484: 8b05 andi a4,a4,1
486: 8905 andi a0,a0,1
488: 0722 slli a4,a4,0x8
48a: 8b85 andi a5,a5,1
{
48c: 1171 addi sp,sp,-4
return b;
48e: 07c2 slli a5,a5,0x10
490: 8d59 or a0,a0,a4
}
492: 8d5d or a0,a0,a5
494: 0111 addi sp,sp,4
496: 8082 ret
00000498 <ssd1306_drawstr.constprop.0>:
}
/*
* draw a string to the display
*/
void ssd1306_drawstr(int x, int y, const char *str, uint8_t color)
498: 1101 addi sp,sp,-32
49a: cc22 sw s0,24(sp)
49c: ca26 sw s1,20(sp)
49e: ce06 sw ra,28(sp)
4a0: 842a mv s0,a0
4a2: 832e mv t1,a1
4a4: 84b2 mv s1,a2
{
uint8_t c;
while((c=*str++))
4a6: 0004c283 lbu t0,0(s1)
4aa: 0485 addi s1,s1,1
4ac: 04028d63 beqz t0,506 <ssd1306_drawstr.constprop.0+0x6e>
4b0: 4701 li a4,0
d = fontdata[(chr<<3)+i];
4b2: 00329793 slli a5,t0,0x3
4b6: 6689 lui a3,0x2
4b8: ba068693 addi a3,a3,-1120 # 1ba0 <fontdata>
4bc: 97ba add a5,a5,a4
4be: 97b6 add a5,a5,a3
4c0: 0007c683 lbu a3,0(a5)
4c4: 4781 li a5,0
ssd1306_drawPixel(x+j, y+i, col);
4c6: 0076d613 srli a2,a3,0x7
4ca: 00e305b3 add a1,t1,a4
4ce: 00f40533 add a0,s0,a5
4d2: c816 sw t0,16(sp)
4d4: c636 sw a3,12(sp)
4d6: c43a sw a4,8(sp)
4d8: c21a sw t1,4(sp)
4da: c03e sw a5,0(sp)
4dc: 3571 jal 368 <ssd1306_drawPixel>
d <<= 1;
4de: 46b2 lw a3,12(sp)
for(j=0;j<8;j++)
4e0: 4782 lw a5,0(sp)
4e2: 4621 li a2,8
d <<= 1;
4e4: 0686 slli a3,a3,0x1
for(j=0;j<8;j++)
4e6: 0785 addi a5,a5,1
4e8: 4312 lw t1,4(sp)
4ea: 4722 lw a4,8(sp)
4ec: 42c2 lw t0,16(sp)
d <<= 1;
4ee: 0ff6f693 zext.b a3,a3
for(j=0;j<8;j++)
4f2: fcc79ae3 bne a5,a2,4c6 <ssd1306_drawstr.constprop.0+0x2e>
for(i=0;i<8;i++)
4f6: 0705 addi a4,a4,1
4f8: faf71de3 bne a4,a5,4b2 <ssd1306_drawstr.constprop.0+0x1a>
{
ssd1306_drawchar(x, y, c, color);
x += 8;
4fc: 9432 add s0,s0,a2
if(x>120)
4fe: 07800793 li a5,120
502: fa87d2e3 bge a5,s0,4a6 <ssd1306_drawstr.constprop.0+0xe>
break;
}
}
506: 40f2 lw ra,28(sp)
508: 4462 lw s0,24(sp)
50a: 44d2 lw s1,20(sp)
50c: 6105 addi sp,sp,32
50e: 8082 ret
00000510 <draw_center_str>:
{
510: 862e mv a2,a1
int len = 0;
512: 4701 li a4,0
while (s[len]) len++;
514: 00e607b3 add a5,a2,a4
518: 0007c783 lbu a5,0(a5)
51c: eb99 bnez a5,532 <draw_center_str+0x22>
int x = (SSD1306_W - len * 8) / 2;
51e: 47c1 li a5,16
520: 8f99 sub a5,a5,a4
522: 078a slli a5,a5,0x2
if (x < 0) x = 0;
524: fff7c713 not a4,a5
528: 877d srai a4,a4,0x1f
ssd1306_drawstr(x, y, s, 1);
52a: 85aa mv a1,a0
52c: 00e7f533 and a0,a5,a4
530: b7a5 j 498 <ssd1306_drawstr.constprop.0>
while (s[len]) len++;
532: 0705 addi a4,a4,1
534: b7c5 j 514 <draw_center_str+0x4>
00000536 <ssd1306_drawFastHLine.constprop.0>:
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
536: 07f00713 li a4,127
53a: 04a76263 bltu a4,a0,57e <ssd1306_drawFastHLine.constprop.0+0x48>
53e: 03f00793 li a5,63
542: 02b7ee63 bltu a5,a1,57e <ssd1306_drawFastHLine.constprop.0+0x48>
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
546: 1141 addi sp,sp,-16
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
548: fff60793 addi a5,a2,-1
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color)
54c: c422 sw s0,8(sp)
54e: c606 sw ra,12(sp)
550: c226 sw s1,4(sp)
if((x+w-1) >= SSD1306_W) w = SSD1306_W-x;
552: 97aa add a5,a5,a0
554: 842a mv s0,a0
556: 00f77563 bgeu a4,a5,560 <ssd1306_drawFastHLine.constprop.0+0x2a>
55a: 08000613 li a2,128
55e: 8e09 sub a2,a2,a0
560: 00c404b3 add s1,s0,a2
564: 8522 mv a0,s0
ssd1306_drawPixel(x++, y, color);
566: 4605 li a2,1
568: c02e sw a1,0(sp)
56a: 0405 addi s0,s0,1
56c: 3bf5 jal 368 <ssd1306_drawPixel>
while (w--)
56e: 4582 lw a1,0(sp)
570: fe849ae3 bne s1,s0,564 <ssd1306_drawFastHLine.constprop.0+0x2e>
}
574: 40b2 lw ra,12(sp)
576: 4422 lw s0,8(sp)
578: 4492 lw s1,4(sp)
57a: 0141 addi sp,sp,16
57c: 8082 ret
57e: 8082 ret
00000580 <ssd1306_drawFastVLine.constprop.0>:
if((x >= SSD1306_W) || (y >= SSD1306_H)) return;
580: 07f00793 li a5,127
584: 02a7cf63 blt a5,a0,5c2 <ssd1306_drawFastVLine.constprop.0+0x42>
void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color)
588: 1141 addi sp,sp,-16
58a: c422 sw s0,8(sp)
58c: c606 sw ra,12(sp)
58e: c226 sw s1,4(sp)
if((y+h-1) >= SSD1306_H) h = SSD1306_H-y;
590: 00c587b3 add a5,a1,a2
594: 04000713 li a4,64
598: 842e mv s0,a1
59a: 00f75463 bge a4,a5,5a2 <ssd1306_drawFastVLine.constprop.0+0x22>
59e: 40b70633 sub a2,a4,a1
5a2: 008604b3 add s1,a2,s0
while(h--)
5a6: 00941763 bne s0,s1,5b4 <ssd1306_drawFastVLine.constprop.0+0x34>
}
5aa: 40b2 lw ra,12(sp)
5ac: 4422 lw s0,8(sp)
5ae: 4492 lw s1,4(sp)
5b0: 0141 addi sp,sp,16
5b2: 8082 ret
ssd1306_drawPixel(x, y++, color);
5b4: 85a2 mv a1,s0
5b6: 4605 li a2,1
5b8: c02a sw a0,0(sp)
5ba: 337d jal 368 <ssd1306_drawPixel>
5bc: 4502 lw a0,0(sp)
5be: 0405 addi s0,s0,1
5c0: b7dd j 5a6 <ssd1306_drawFastVLine.constprop.0+0x26>
5c2: 8082 ret
000005c4 <ssd1306_drawRect.constprop.0>:
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
5c4: 1131 addi sp,sp,-20
5c6: c426 sw s1,8(sp)
5c8: 84b2 mv s1,a2
ssd1306_drawFastVLine(x, y, h, color);
5ca: 8636 mv a2,a3
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color)
5cc: c806 sw ra,16(sp)
5ce: c622 sw s0,12(sp)
5d0: c236 sw a3,4(sp)
5d2: 842a mv s0,a0
5d4: c02e sw a1,0(sp)
ssd1306_drawFastVLine(x, y, h, color);
5d6: 376d jal 580 <ssd1306_drawFastVLine.constprop.0>
ssd1306_drawFastVLine(x+w-1, y, h, color);
5d8: 4612 lw a2,4(sp)
5da: 4582 lw a1,0(sp)
5dc: fff48513 addi a0,s1,-1
5e0: 9522 add a0,a0,s0
5e2: 3f79 jal 580 <ssd1306_drawFastVLine.constprop.0>
ssd1306_drawFastHLine(x, y, w, color);
5e4: 4582 lw a1,0(sp)
5e6: 8626 mv a2,s1
5e8: 8522 mv a0,s0
5ea: 37b1 jal 536 <ssd1306_drawFastHLine.constprop.0>
ssd1306_drawFastHLine(x, y+h-1, w, color);
5ec: 4782 lw a5,0(sp)
5ee: 8522 mv a0,s0
}
5f0: 4432 lw s0,12(sp)
ssd1306_drawFastHLine(x, y+h-1, w, color);
5f2: fff78593 addi a1,a5,-1
5f6: 4792 lw a5,4(sp)
}
5f8: 40c2 lw ra,16(sp)
ssd1306_drawFastHLine(x, y+h-1, w, color);
5fa: 8626 mv a2,s1
}
5fc: 44a2 lw s1,8(sp)
ssd1306_drawFastHLine(x, y+h-1, w, color);
5fe: 95be add a1,a1,a5
}
600: 0151 addi sp,sp,20
ssd1306_drawFastHLine(x, y+h-1, w, color);
602: bf15 j 536 <ssd1306_drawFastHLine.constprop.0>
00000604 <draw_bar>:
{
604: 1121 addi sp,sp,-24
606: c822 sw s0,16(sp)
608: c626 sw s1,12(sp)
60a: 842a mv s0,a0
60c: 84b2 mv s1,a2
ssd1306_drawstr(0, y, label, 1);
60e: 862e mv a2,a1
610: 85aa mv a1,a0
612: 4501 li a0,0
{
614: ca06 sw ra,20(sp)
ssd1306_drawstr(0, y, label, 1);
616: 3549 jal 498 <ssd1306_drawstr.constprop.0>
ssd1306_drawRect(bx, y, bw, 7, 1);
618: 03000513 li a0,48
61c: 469d li a3,7
61e: 04c00613 li a2,76
622: 85a2 mv a1,s0
624: 3745 jal 5c4 <ssd1306_drawRect.constprop.0>
int fill = (val * (bw - 2)) / 100;
626: 00349513 slli a0,s1,0x3
62a: 9526 add a0,a0,s1
62c: 050a slli a0,a0,0x2
62e: 9526 add a0,a0,s1
630: 0506 slli a0,a0,0x1
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
632: 06300793 li a5,99
636: 02a7df63 bge a5,a0,674 <draw_bar+0x70>
63a: 00140793 addi a5,s0,1
int fill = (val * (bw - 2)) / 100;
63e: 06400593 li a1,100
if (fill > 0) ssd1306_fillRect(bx + 1, y + 1, fill, 5, 1);
642: c03e sw a5,0(sp)
int fill = (val * (bw - 2)) / 100;
644: 3cb1 jal a0 <__divsi3>
646: 4782 lw a5,0(sp)
648: 872a mv a4,a0
64a: 0419 addi s0,s0,6
64c: 03170693 addi a3,a4,49
m=x;
650: 03100493 li s1,49
654: 8526 mv a0,s1
ssd1306_drawPixel(m++, n, color);
656: 85be mv a1,a5
658: 4605 li a2,1
65a: c436 sw a3,8(sp)
65c: c23a sw a4,4(sp)
65e: c03e sw a5,0(sp)
660: 3321 jal 368 <ssd1306_drawPixel>
while(w--)
662: 46a2 lw a3,8(sp)
ssd1306_drawPixel(m++, n, color);
664: 0485 addi s1,s1,1
while(w--)
666: 4782 lw a5,0(sp)
668: 4712 lw a4,4(sp)
66a: fed495e3 bne s1,a3,654 <draw_bar+0x50>
n++;
66e: 0785 addi a5,a5,1
while(h--)
670: fc879ee3 bne a5,s0,64c <draw_bar+0x48>
}
674: 40d2 lw ra,20(sp)
676: 4442 lw s0,16(sp)
678: 44b2 lw s1,12(sp)
67a: 0161 addi sp,sp,24
67c: 8082 ret
0000067e <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) {
67e: fd810113 addi sp,sp,-40
682: 00e587b3 add a5,a1,a4
686: d222 sw s0,36(sp)
688: d026 sw s1,32(sp)
68a: c82a sw a0,16(sp)
68c: ca32 sw a2,20(sp)
uint32_t bytes_to_draw = width / 8;
68e: 0036d413 srli s0,a3,0x3
692: c63e sw a5,12(sp)
694: 4381 li t2,0
uint32_t v_mask = 1 << (y_absolute & 7);
696: 0075f793 andi a5,a1,7
69a: 4705 li a4,1
69c: 00f717b3 sll a5,a4,a5
6a0: c03e sw a5,0(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
6a2: 47d2 lw a5,20(sp)
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
6a4: 4681 li a3,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
6a6: 979e add a5,a5,t2
6a8: cc3e sw a5,24(sp)
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
6aa: 0035d793 srli a5,a1,0x3
6ae: 079e slli a5,a5,0x7
6b0: ce3e sw a5,28(sp)
uint32_t input_byte = input[byte + line * bytes_to_draw];
6b2: 47e2 lw a5,24(sp)
x_absolute = x + 8 * byte + pixel;
6b4: 00369293 slli t0,a3,0x3
for (pixel = 0; pixel < 8; pixel++) {
6b8: 4701 li a4,0
uint32_t input_byte = input[byte + line * bytes_to_draw];
6ba: 97b6 add a5,a5,a3
6bc: 0007c783 lbu a5,0(a5)
6c0: c23e sw a5,4(sp)
x_absolute = x + 8 * byte + pixel;
6c2: 47c2 lw a5,16(sp)
6c4: 92be add t0,t0,a5
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
6c6: 47f2 lw a5,28(sp)
6c8: 005784b3 add s1,a5,t0
if (x_absolute >= SSD1306_W) {
6cc: 00e287b3 add a5,t0,a4
6d0: 07f00613 li a2,127
6d4: 04f66463 bltu a2,a5,71c <ssd1306_drawImage.constprop.0+0x9e>
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
6d8: 4512 lw a0,4(sp)
6da: 08000793 li a5,128
6de: 40e7d7b3 sra a5,a5,a4
6e2: 8fe9 and a5,a5,a0
buffer_addr = x_absolute + SSD1306_W * (y_absolute / 8);
6e4: 00e48633 add a2,s1,a4
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
6e8: c2818513 addi a0,gp,-984 # 20000024 <ssd1306_buffer>
6ec: 9532 add a0,a0,a2
6ee: 00014303 lbu t1,0(sp)
uint8_t input_pixel = input_byte & (0x80 >> pixel); // MSB first (default)
6f2: c43e sw a5,8(sp)
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
6f4: 00054783 lbu a5,0(a0)
6f8: fff34613 not a2,t1
for (pixel = 0; pixel < 8; pixel++) {
6fc: 0705 addi a4,a4,1
ssd1306_buffer[buffer_addr] = (ssd1306_buffer[buffer_addr] & ~v_mask) | (input_pixel ? v_mask : 0);
6fe: 8e7d and a2,a2,a5
700: 47a2 lw a5,8(sp)
702: 00f037b3 snez a5,a5
706: 40f007b3 neg a5,a5
70a: 00f37333 and t1,t1,a5
70e: 00666633 or a2,a2,t1
712: 00c50023 sb a2,0(a0)
for (pixel = 0; pixel < 8; pixel++) {
716: 47a1 li a5,8
718: faf71ae3 bne a4,a5,6cc <ssd1306_drawImage.constprop.0+0x4e>
for (uint32_t byte = 0; byte < bytes_to_draw; byte++) {
71c: 0685 addi a3,a3,1
71e: f8d41ae3 bne s0,a3,6b2 <ssd1306_drawImage.constprop.0+0x34>
for (uint32_t line = 0; line < height; line++) {
722: 47b2 lw a5,12(sp)
724: 0585 addi a1,a1,1
726: 93a2 add t2,t2,s0
728: 00b78663 beq a5,a1,734 <ssd1306_drawImage.constprop.0+0xb6>
if (y_absolute >= SSD1306_H) {
72c: 04000793 li a5,64
730: f6f593e3 bne a1,a5,696 <ssd1306_drawImage.constprop.0+0x18>
}
734: 5412 lw s0,36(sp)
736: 5482 lw s1,32(sp)
738: 02810113 addi sp,sp,40
73c: 8082 ret
0000073e <internal_handle_input.constprop.0>:
uint32_t dmd0 = *dmdata0;
73e: e00007b7 lui a5,0xe0000
742: 0f47a783 lw a5,244(a5) # e00000f4 <_eusrstack+0xbffff8f4>
}
746: 8082 ret
00000748 <_write.constprop.0>:
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
748: e00007b7 lui a5,0xe0000
74c: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
750: 4398 lw a4,0(a5)
WEAK int _write(int fd, const char *buf, int size)
752: 1121 addi sp,sp,-24
754: ca06 sw ra,20(sp)
756: c822 sw s0,16(sp)
758: c626 sw s1,12(sp)
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
75a: 0c077713 andi a4,a4,192
75e: 0c000693 li a3,192
762: 00d70b63 beq a4,a3,778 <_write.constprop.0+0x30>
char buffer[4] = { 0 };
766: c402 sw zero,8(sp)
768: 842e mv s0,a1
if( size == 0 )
76a: eddd bnez a1,828 <_write.constprop.0+0xe0>
lastdmd = (*DMDATA0);
76c: 439c lw a5,0(a5)
if( lastdmd && !(lastdmd&0x80) ) internal_handle_input( (uint32_t*)DMDATA0 );
76e: c789 beqz a5,778 <_write.constprop.0+0x30>
770: 0807f793 andi a5,a5,128
774: e391 bnez a5,778 <_write.constprop.0+0x30>
776: 37e1 jal 73e <internal_handle_input.constprop.0>
if( ( *DMDATA0 & 0xc0 ) == 0xc0 ) return 0;
778: 4401 li s0,0
}
77a: 40d2 lw ra,20(sp)
77c: 8522 mv a0,s0
77e: 4442 lw s0,16(sp)
780: 44b2 lw s1,12(sp)
782: 0161 addi sp,sp,24
784: 8082 ret
int tosend = size - place;
786: 409407b3 sub a5,s0,s1
if( tosend > 7 ) tosend = 7;
78a: 471d li a4,7
78c: 00f75363 bge a4,a5,792 <_write.constprop.0+0x4a>
790: 87ba mv a5,a4
792: 001006b7 lui a3,0x100
while( ( lastdmd = (*DMDATA0) ) & 0x80 )
796: e0000737 lui a4,0xe0000
if( tosend > 7 ) tosend = 7;
79a: 0685 addi a3,a3,1 # 100001 <tama.c.f19bf6d4+0xfc8f0>
while( ( lastdmd = (*DMDATA0) ) & 0x80 )
79c: 0f470713 addi a4,a4,244 # e00000f4 <_eusrstack+0xbffff8f4>
7a0: 4310 lw a2,0(a4)
7a2: 08067593 andi a1,a2,128
7a6: e1a5 bnez a1,806 <_write.constprop.0+0xbe>
if( lastdmd ) internal_handle_input( (uint32_t*)DMDATA0 );
7a8: c611 beqz a2,7b4 <_write.constprop.0+0x6c>
7aa: c22a sw a0,4(sp)
7ac: c03e sw a5,0(sp)
7ae: 3f41 jal 73e <internal_handle_input.constprop.0>
7b0: 4512 lw a0,4(sp)
7b2: 4782 lw a5,0(sp)
7b4: 0034 addi a3,sp,8
if( tosend > 7 ) tosend = 7;
7b6: 470d li a4,3
7b8: 85b6 mv a1,a3
while( t < tosend )
7ba: 04f74d63 blt a4,a5,814 <_write.constprop.0+0xcc>
*DMDATA1 = *(uint32_t*)&(buffer[0]);
7be: 46a2 lw a3,8(sp)
7c0: e0000737 lui a4,0xe0000
while( t < tosend && t < 3 )
7c4: 460d li a2,3
*DMDATA1 = *(uint32_t*)&(buffer[0]);
7c6: 0ed72c23 sw a3,248(a4) # e00000f8 <_eusrstack+0xbffff8f8>
7ca: 009506b3 add a3,a0,s1
t = 0;
7ce: 4701 li a4,0
buffer[t+1] = buf[t+place];
7d0: 0006c283 lbu t0,0(a3)
7d4: 0705 addi a4,a4,1
7d6: 00e58333 add t1,a1,a4
7da: 00530023 sb t0,0(t1)
while( t < tosend && t < 3 )
7de: 00e78563 beq a5,a4,7e8 <_write.constprop.0+0xa0>
7e2: 0685 addi a3,a3,1
7e4: fec716e3 bne a4,a2,7d0 <_write.constprop.0+0x88>
buffer[0] = 0x80 | (tosend + 4);
7e8: 00478713 addi a4,a5,4
7ec: f8076713 ori a4,a4,-128
7f0: 00e10423 sb a4,8(sp)
*DMDATA0 = *(uint32_t*)&(buffer[0]);
7f4: 46a2 lw a3,8(sp)
7f6: e0000737 lui a4,0xe0000
place += tosend;
7fa: 94be add s1,s1,a5
*DMDATA0 = *(uint32_t*)&(buffer[0]);
7fc: 0ed72a23 sw a3,244(a4) # e00000f4 <_eusrstack+0xbffff8f4>
while( place < size )
800: f884c3e3 blt s1,s0,786 <_write.constprop.0+0x3e>
804: bf9d j 77a <_write.constprop.0+0x32>
if( timeout-- == 0 )
806: 16fd addi a3,a3,-1
808: fec1 bnez a3,7a0 <_write.constprop.0+0x58>
*DMDATA0 |= 0xc0;
80a: 431c lw a5,0(a4)
80c: 0c07e793 ori a5,a5,192
810: c31c sw a5,0(a4)
return 0;
812: b79d j 778 <_write.constprop.0+0x30>
buffer[t-3] = buf[t+place];
814: 00e48633 add a2,s1,a4
818: 962a add a2,a2,a0
81a: 00064603 lbu a2,0(a2)
t++;
81e: 0705 addi a4,a4,1
820: 0685 addi a3,a3,1
buffer[t-3] = buf[t+place];
822: fec68fa3 sb a2,-1(a3)
826: bf51 j 7ba <_write.constprop.0+0x72>
828: 4481 li s1,0
82a: bfd9 j 800 <_write.constprop.0+0xb8>
0000082c <__puts_uart>:
{
82c: 1161 addi sp,sp,-8
82e: c022 sw s0,0(sp)
830: c206 sw ra,4(sp)
832: 842e mv s0,a1
_write( 0, s, len );
834: 3f11 jal 748 <_write.constprop.0>
}
836: 4092 lw ra,4(sp)
838: 8522 mv a0,s0
83a: 4402 lw s0,0(sp)
83c: 0121 addi sp,sp,8
83e: 8082 ret
00000840 <handle_reset>:
asm volatile( "\n\
840: 20000197 auipc gp,0x20000
844: bbc18193 addi gp,gp,-1092 # 200003fc <__global_pointer$>
848: 40418113 addi sp,gp,1028 # 20000800 <_eusrstack>
84c: 6509 lui a0,0x2
84e: 88050513 addi a0,a0,-1920 # 1880 <icon_feed+0x14>
852: 30051073 csrw mstatus,a0
856: fffff697 auipc a3,0xfffff
85a: 7aa68693 addi a3,a3,1962 # 0 <InterruptVector>
85e: 0036e693 ori a3,a3,3
862: 30569073 csrw mtvec,a3
asm volatile(
866: c0c18513 addi a0,gp,-1012 # 20000008 <anim_exp>
86a: 02818593 addi a1,gp,40 # 20000424 <_ebss>
86e: 4601 li a2,0
870: 00b55663 bge a0,a1,87c <handle_reset+0x3c>
874: c110 sw a2,0(a0)
876: 0511 addi a0,a0,4
878: feb54ee3 blt a0,a1,874 <handle_reset+0x34>
87c: 00002517 auipc a0,0x2
880: c8c50513 addi a0,a0,-884 # 2508 <_data_lma>
884: c0418593 addi a1,gp,-1020 # 20000000 <spr_poop>
888: c0c18613 addi a2,gp,-1012 # 20000008 <anim_exp>
88c: 00c58863 beq a1,a2,89c <handle_reset+0x5c>
890: 4114 lw a3,0(a0)
892: c194 sw a3,0(a1)
894: 0511 addi a0,a0,4
896: 0591 addi a1,a1,4
898: fec59ae3 bne a1,a2,88c <handle_reset+0x4c>
SysTick->CTLR = 1;
89c: e000f7b7 lui a5,0xe000f
8a0: 4705 li a4,1
8a2: c398 sw a4,0(a5)
asm volatile(
8a4: 6785 lui a5,0x1
8a6: d9a78793 addi a5,a5,-614 # d9a <main>
8aa: 34179073 csrw mepc,a5
8ae: 30200073 mret
000008b2 <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));
8b2: 34102573 csrr a0,mepc
PrintHex( __get_MEPC() ); // "addr2line -e debugprintfdemo.elf 0x000007e6" ---> debugprintfdemo.c:45
8b6: 3a0d jal 1e8 <PrintHex>
__ASM volatile( ADD_ARCH_ZICSR "csrr %0, mstatus": "=r"(result) );
8b8: 30002573 csrr a0,mstatus
PrintHex( __get_MSTATUS() );
8bc: 3235 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) );
8be: 34302573 csrr a0,mtval
PrintHex( __get_MTVAL() );
8c2: 321d jal 1e8 <PrintHex>
__ASM volatile( ADD_ARCH_ZICSR "csrr %0," "mcause": "=r"(result));
8c4: 34202573 csrr a0,mcause
PrintHex( __get_MCAUSE() );
8c8: 3205 jal 1e8 <PrintHex>
while( (*DMDATA0) & 0x80 );
8ca: e00007b7 lui a5,0xe0000
8ce: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
8d2: 4398 lw a4,0(a5)
8d4: 08077713 andi a4,a4,128
8d8: ff6d bnez a4,8d2 <ADC1_2_IRQHandler+0x20>
*DMDATA0 = 0x0a85;
8da: 6705 lui a4,0x1
8dc: a8570713 addi a4,a4,-1403 # a85 <mini_vpprintf+0x167>
8e0: c398 sw a4,0(a5)
while( (*DMDATA0) & 0x80 );
8e2: e00007b7 lui a5,0xe0000
8e6: 0f478793 addi a5,a5,244 # e00000f4 <_eusrstack+0xbffff8f4>
8ea: 4398 lw a4,0(a5)
8ec: 08077713 andi a4,a4,128
8f0: ff6d bnez a4,8ea <ADC1_2_IRQHandler+0x38>
*DMDATA0 = 0xaaaaaa83;
8f2: aaaab737 lui a4,0xaaaab
8f6: a8370713 addi a4,a4,-1405 # aaaaaa83 <_eusrstack+0x8aaaa283>
8fa: c398 sw a4,0(a5)
asm volatile( "1: j 1b" );
8fc: a001 j 8fc <ADC1_2_IRQHandler+0x4a>
000008fe <NMI_Handler>:
RCC->INTR |= RCC_CSSC; // clear the clock security int flag
8fe: 40021737 lui a4,0x40021
902: 471c lw a5,8(a4)
904: 008006b7 lui a3,0x800
908: 8fd5 or a5,a5,a3
90a: c71c sw a5,8(a4)
0000090c <strlen>:
for (; *s; s++);
90c: 87aa mv a5,a0
90e: 0007c703 lbu a4,0(a5)
912: e701 bnez a4,91a <strlen+0xe>
}
914: 40a78533 sub a0,a5,a0
918: 8082 ret
for (; *s; s++);
91a: 0785 addi a5,a5,1
91c: bfcd j 90e <strlen+0x2>
0000091e <mini_vpprintf>:
{
91e: fa410113 addi sp,sp,-92
922: caa2 sw s0,84(sp)
924: c8a6 sw s1,80(sp)
926: cc86 sw ra,88(sp)
928: c02a sw a0,0(sp)
92a: c22e sw a1,4(sp)
92c: 8432 mv s0,a2
92e: 84b6 mv s1,a3
if(puts == (void*)0) {
930: e509 bnez a0,93a <mini_vpprintf+0x1c>
puts = _puts; buf = (void*)0;
932: 1a800793 li a5,424
936: c202 sw zero,4(sp)
938: c03e sw a5,0(sp)
int n = 0;
93a: ca02 sw zero,20(sp)
while ((ch=*(fmt++))) {
93c: 00044783 lbu a5,0(s0)
940: 00140713 addi a4,s0,1
944: 00f10fa3 sb a5,31(sp)
948: eb81 bnez a5,958 <mini_vpprintf+0x3a>
}
94a: 40e6 lw ra,88(sp)
94c: 4456 lw s0,84(sp)
94e: 4552 lw a0,20(sp)
950: 44c6 lw s1,80(sp)
952: 05c10113 addi sp,sp,92
956: 8082 ret
958: c63a sw a4,12(sp)
if (ch!='%') {
95a: 02500693 li a3,37
95e: 02d78063 beq a5,a3,97e <mini_vpprintf+0x60>
len = puts(&ch, len, buf);
962: 4612 lw a2,4(sp)
964: 4782 lw a5,0(sp)
966: 4585 li a1,1
968: 01f10513 addi a0,sp,31
96c: 9782 jalr a5
while ((ch=*(fmt++))) {
96e: 4732 lw a4,12(sp)
970: c426 sw s1,8(sp)
972: 843a mv s0,a4
n = n + len;
974: 47d2 lw a5,20(sp)
976: 44a2 lw s1,8(sp)
978: 97aa add a5,a5,a0
97a: ca3e sw a5,20(sp)
97c: b7c1 j 93c <mini_vpprintf+0x1e>
ch=*(fmt++);
97e: 00144783 lbu a5,1(s0)
if (ch == '0') pad_char = '0';
982: 03000693 li a3,48
ch=*(fmt++);
986: 00240713 addi a4,s0,2
98a: 00f10fa3 sb a5,31(sp)
if (ch == '0') pad_char = '0';
98e: c63e sw a5,12(sp)
990: 08d79363 bne a5,a3,a16 <mini_vpprintf+0xf8>
ch=*(fmt++);
994: 843a mv s0,a4
996: 4681 li a3,0
998: 4701 li a4,0
while (ch >= '0' && ch <= '9') {
99a: 45a5 li a1,9
99c: a819 j 9b2 <mini_vpprintf+0x94>
pad_to = pad_to * 10 + (ch - '0');
99e: 00271793 slli a5,a4,0x2
9a2: 97ba add a5,a5,a4
9a4: 0786 slli a5,a5,0x1
ch=*(fmt++);
9a6: 0405 addi s0,s0,1
pad_to = pad_to * 10 + (ch - '0');
9a8: 00f60733 add a4,a2,a5
ch=*(fmt++);
9ac: fff44783 lbu a5,-1(s0)
9b0: 4685 li a3,1
while (ch >= '0' && ch <= '9') {
9b2: fd078613 addi a2,a5,-48
9b6: 0ff67513 zext.b a0,a2
9ba: fea5f2e3 bgeu a1,a0,99e <mini_vpprintf+0x80>
9be: c299 beqz a3,9c4 <mini_vpprintf+0xa6>
9c0: 00f10fa3 sb a5,31(sp)
if(pad_to > (signed int) sizeof(bf)) {
9c4: c83a sw a4,16(sp)
9c6: 46e1 li a3,24
9c8: 00e6d363 bge a3,a4,9ce <mini_vpprintf+0xb0>
9cc: c836 sw a3,16(sp)
if (ch == 'l') {
9ce: 06c00613 li a2,108
char l = 0;
9d2: 4681 li a3,0
if (ch == 'l') {
9d4: 00c79863 bne a5,a2,9e4 <mini_vpprintf+0xc6>
ch=*(fmt++);
9d8: 00044783 lbu a5,0(s0)
l = 1;
9dc: 4685 li a3,1
ch=*(fmt++);
9de: 0405 addi s0,s0,1
9e0: 00f10fa3 sb a5,31(sp)
switch (ch) {
9e4: 01f14603 lbu a2,31(sp)
9e8: 06400793 li a5,100
9ec: 06f60563 beq a2,a5,a56 <mini_vpprintf+0x138>
9f0: 02c7e763 bltu a5,a2,a1e <mini_vpprintf+0x100>
9f4: 05800793 li a5,88
9f8: 0af60263 beq a2,a5,a9c <mini_vpprintf+0x17e>
9fc: 06300793 li a5,99
a00: 0cf60063 beq a2,a5,ac0 <mini_vpprintf+0x1a2>
a04: d239 beqz a2,94a <mini_vpprintf+0x2c>
len = puts(&ch, len, buf);
a06: 4612 lw a2,4(sp)
a08: 4782 lw a5,0(sp)
a0a: 4585 li a1,1
a0c: 01f10513 addi a0,sp,31
a10: 9782 jalr a5
break;
a12: c426 sw s1,8(sp)
a14: b785 j 974 <mini_vpprintf+0x56>
char pad_char = ' ';
a16: 02000693 li a3,32
a1a: c636 sw a3,12(sp)
a1c: bfa5 j 994 <mini_vpprintf+0x76>
switch (ch) {
a1e: 07500793 li a5,117
a22: 02f60a63 beq a2,a5,a56 <mini_vpprintf+0x138>
a26: 07800793 li a5,120
a2a: 06f60963 beq a2,a5,a9c <mini_vpprintf+0x17e>
a2e: 07300793 li a5,115
a32: fcf61ae3 bne a2,a5,a06 <mini_vpprintf+0xe8>
ptr = va_arg(va, char*);
a36: 00448793 addi a5,s1,4
a3a: 4084 lw s1,0(s1)
a3c: cc3a sw a4,24(sp)
a3e: c43e sw a5,8(sp)
len = mini_strlen(ptr);
a40: 8526 mv a0,s1
a42: 35e9 jal 90c <strlen>
if (pad_to > 0) {
a44: 4762 lw a4,24(sp)
len = mini_strlen(ptr);
a46: 85aa mv a1,a0
if (pad_to > 0) {
a48: 08e05963 blez a4,ada <mini_vpprintf+0x1bc>
len = mini_pad(ptr, len, pad_char, pad_to, bf);
a4c: 46c2 lw a3,16(sp)
a4e: 4632 lw a2,12(sp)
a50: 1838 addi a4,sp,56
a52: 8526 mv a0,s1
a54: a025 j a7c <mini_vpprintf+0x15e>
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
a56: 00448793 addi a5,s1,4
a5a: c43e sw a5,8(sp)
if(l) {
a5c: ca85 beqz a3,a8c <mini_vpprintf+0x16e>
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
a5e: f8b60613 addi a2,a2,-117
a62: 1018 addi a4,sp,32
a64: 00163693 seqz a3,a2
a68: 4088 lw a0,0(s1)
a6a: 4601 li a2,0
a6c: 45a9 li a1,10
a6e: fe6ff0ef jal 254 <mini_itoa.part.0>
len = mini_pad(bf2, len, pad_char, pad_to, bf);
a72: 46c2 lw a3,16(sp)
a74: 4632 lw a2,12(sp)
a76: 1838 addi a4,sp,56
a78: 85aa mv a1,a0
len = mini_pad(bf2, len, pad_char, pad_to, bf);
a7a: 1008 addi a0,sp,32
a7c: ea2ff0ef jal 11e <mini_pad>
len = puts(bf, len, buf);
a80: 4612 lw a2,4(sp)
len = mini_pad(bf2, len, pad_char, pad_to, bf);
a82: 85aa mv a1,a0
len = puts(bf, len, buf);
a84: 1828 addi a0,sp,56
a86: 4782 lw a5,0(sp)
a88: 9782 jalr a5
break;
a8a: b5ed j 974 <mini_vpprintf+0x56>
if(ch == 'u') {
a8c: 07500793 li a5,117
a90: 1018 addi a4,sp,32
a92: 4685 li a3,1
a94: fcf60ae3 beq a2,a5,a68 <mini_vpprintf+0x14a>
if (radix > 16)
a98: 4681 li a3,0
a9a: b7f9 j a68 <mini_vpprintf+0x14a>
if(l) {
a9c: 4088 lw a0,0(s1)
len = mini_itoa(va_arg(va, unsigned long), 16, (ch=='X'), 1, bf2);
a9e: fa860613 addi a2,a2,-88
len = mini_itoa(va_arg(va, unsigned long), 10, 0, (ch=='u'), bf2);
aa2: 00448793 addi a5,s1,4
aa6: 1018 addi a4,sp,32
aa8: 4685 li a3,1
aaa: 00163613 seqz a2,a2
aae: 45c1 li a1,16
ab0: c43e sw a5,8(sp)
if (radix > 16)
ab2: fa2ff0ef jal 254 <mini_itoa.part.0>
len = mini_pad(bf2, len, pad_char, pad_to, bf);
ab6: 46c2 lw a3,16(sp)
ab8: 4632 lw a2,12(sp)
aba: 85aa mv a1,a0
abc: 1838 addi a4,sp,56
abe: bf75 j a7a <mini_vpprintf+0x15c>
ch = (char)(va_arg(va, int));
ac0: 00448793 addi a5,s1,4
ac4: c43e sw a5,8(sp)
ac6: 409c lw a5,0(s1)
len = mini_pad(&ch, 1, pad_char, pad_to, bf);
ac8: 46c2 lw a3,16(sp)
aca: 4632 lw a2,12(sp)
ch = (char)(va_arg(va, int));
acc: 00f10fa3 sb a5,31(sp)
len = mini_pad(&ch, 1, pad_char, pad_to, bf);
ad0: 1838 addi a4,sp,56
ad2: 4585 li a1,1
ad4: 01f10513 addi a0,sp,31
ad8: b755 j a7c <mini_vpprintf+0x15e>
len = puts(ptr, len, buf);
ada: 4612 lw a2,4(sp)
adc: 8526 mv a0,s1
ade: b765 j a86 <mini_vpprintf+0x168>
00000ae0 <printf>:
{
ae0: 1111 addi sp,sp,-28
ae2: c632 sw a2,12(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
ae4: 862a mv a2,a0
ae6: 6505 lui a0,0x1
{
ae8: c42e sw a1,8(sp)
aea: c836 sw a3,16(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
aec: 4581 li a1,0
va_start( args, format );
aee: 0034 addi a3,sp,8
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
af0: 82c50513 addi a0,a0,-2004 # 82c <__puts_uart>
{
af4: c206 sw ra,4(sp)
af6: ca3a sw a4,20(sp)
af8: cc3e sw a5,24(sp)
va_start( args, format );
afa: c036 sw a3,0(sp)
int ret_status = mini_vpprintf(__puts_uart, 0, format, args);
afc: 350d jal 91e <mini_vpprintf>
}
afe: 4092 lw ra,4(sp)
b00: 0171 addi sp,sp,28
b02: 8082 ret
00000b04 <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]);
b04: 6789 lui a5,0x2
b06: 050a slli a0,a0,0x2
b08: b8c78793 addi a5,a5,-1140 # 1b8c <errstr>
b0c: 97aa add a5,a5,a0
b0e: 438c lw a1,0(a5)
b10: 6505 lui a0,0x1
uint8_t ssd1306_i2c_error(uint8_t err)
b12: 1171 addi sp,sp,-4
printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]);
b14: 68450513 addi a0,a0,1668 # 1684 <main+0x8ea>
uint8_t ssd1306_i2c_error(uint8_t err)
b18: c006 sw ra,0(sp)
printf("ssd1306_i2c_error - timeout waiting for %s\n\r", errstr[err]);
b1a: 37d9 jal ae0 <printf>
// reset & initialize I2C
ssd1306_i2c_setup();
return 1;
}
b1c: 4082 lw ra,0(sp)
b1e: 0111 addi sp,sp,4
ssd1306_i2c_setup();
b20: ff4ff06f j 314 <ssd1306_i2c_setup>
00000b24 <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)
b24: 1171 addi sp,sp,-4
{
int32_t timeout;
// wait for not busy
timeout = TIMEOUT_MAX;
b26: 6761 lui a4,0x18
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
b28: 400057b7 lui a5,0x40005
uint8_t ssd1306_i2c_send(uint8_t addr, const uint8_t *data, int sz)
b2c: c006 sw ra,0(sp)
timeout = TIMEOUT_MAX;
b2e: 6a070713 addi a4,a4,1696 # 186a0 <tama.c.f19bf6d4+0x14f8f>
while((I2C1->STAR2 & I2C_STAR2_BUSY) && (timeout--));
b32: 40078793 addi a5,a5,1024 # 40005400 <_eusrstack+0x20004c00>
b36: 567d li a2,-1
b38: 0187d683 lhu a3,24(a5)
b3c: 8a89 andi a3,a3,2
b3e: c6e1 beqz a3,c06 <ssd1306_i2c_send.constprop.0+0xe2>
b40: 177d addi a4,a4,-1
b42: fec71be3 bne a4,a2,b38 <ssd1306_i2c_send.constprop.0+0x14>
if(timeout==-1)
return ssd1306_i2c_error(0);
b46: 4501 li a0,0
b48: a821 j b60 <ssd1306_i2c_send.constprop.0+0x3c>
b4a: 67e1 lui a5,0x18
b4c: 6a178793 addi a5,a5,1697 # 186a1 <tama.c.f19bf6d4+0x14f90>
// send data one byte at a time
while(sz--)
{
// wait for TX Empty
timeout = TIMEOUT_MAX;
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
b50: 01475683 lhu a3,20(a4)
b54: 0806f693 andi a3,a3,128
b58: e699 bnez a3,b66 <ssd1306_i2c_send.constprop.0+0x42>
b5a: 17fd addi a5,a5,-1
b5c: fbf5 bnez a5,b50 <ssd1306_i2c_send.constprop.0+0x2c>
if(timeout==-1)
return ssd1306_i2c_error(3);
b5e: 450d li a0,3
return ssd1306_i2c_error(1);
b60: 3755 jal b04 <ssd1306_i2c_error.isra.0>
return ssd1306_i2c_error(0);
b62: 4505 li a0,1
b64: a889 j bb6 <ssd1306_i2c_send.constprop.0+0x92>
// send command
I2C1->DATAR = *data++;
b66: 00054783 lbu a5,0(a0)
b6a: 0505 addi a0,a0,1
b6c: 00f71823 sh a5,16(a4)
while(sz--)
b70: fca59de3 bne a1,a0,b4a <ssd1306_i2c_send.constprop.0+0x26>
}
// wait for tx complete
timeout = TIMEOUT_MAX;
b74: 66e1 lui a3,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
b76: 40005737 lui a4,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
b7a: 00070637 lui a2,0x70
timeout = TIMEOUT_MAX;
b7e: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.f19bf6d4+0x14f8f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
b82: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
b86: 08460613 addi a2,a2,132 # 70084 <tama.c.f19bf6d4+0x6c973>
b8a: 55fd li a1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
b8c: 01475503 lhu a0,20(a4)
b90: 01875783 lhu a5,24(a4)
b94: 07c2 slli a5,a5,0x10
b96: 8fc9 or a5,a5,a0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (timeout--));
b98: 8ff1 and a5,a5,a2
b9a: 00c78763 beq a5,a2,ba8 <ssd1306_i2c_send.constprop.0+0x84>
b9e: 16fd addi a3,a3,-1
ba0: feb696e3 bne a3,a1,b8c <ssd1306_i2c_send.constprop.0+0x68>
if(timeout==-1)
return ssd1306_i2c_error(4);
ba4: 4511 li a0,4
ba6: bf6d j b60 <ssd1306_i2c_send.constprop.0+0x3c>
// set STOP condition
I2C1->CTLR1 |= I2C_CTLR1_STOP;
ba8: 00075783 lhu a5,0(a4)
// we're happy
return 0;
bac: 4501 li a0,0
I2C1->CTLR1 |= I2C_CTLR1_STOP;
bae: 2007e793 ori a5,a5,512
bb2: 00f71023 sh a5,0(a4)
}
bb6: 4082 lw ra,0(sp)
bb8: 0111 addi sp,sp,4
bba: 8082 ret
while(!(I2C1->STAR1 & I2C_STAR1_TXE) && (timeout--));
bbc: 40005737 lui a4,0x40005
bc0: 95aa add a1,a1,a0
bc2: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
bc6: b76d j b70 <ssd1306_i2c_send.constprop.0+0x4c>
I2C1->DATAR = addr<<1;
bc8: 07800793 li a5,120
bcc: 00f71823 sh a5,16(a4)
timeout = TIMEOUT_MAX;
bd0: 6661 lui a2,0x18
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
bd2: 400056b7 lui a3,0x40005
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
bd6: 00070737 lui a4,0x70
timeout = TIMEOUT_MAX;
bda: 6a060613 addi a2,a2,1696 # 186a0 <tama.c.f19bf6d4+0x14f8f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
bde: 40068693 addi a3,a3,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
be2: 08270713 addi a4,a4,130 # 70082 <tama.c.f19bf6d4+0x6c971>
be6: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
be8: 0146d283 lhu t0,20(a3)
bec: 0186d783 lhu a5,24(a3)
bf0: 07c2 slli a5,a5,0x10
bf2: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (timeout--));
bf6: 8ff9 and a5,a5,a4
bf8: fce782e3 beq a5,a4,bbc <ssd1306_i2c_send.constprop.0+0x98>
bfc: 167d addi a2,a2,-1
bfe: fe6615e3 bne a2,t1,be8 <ssd1306_i2c_send.constprop.0+0xc4>
return ssd1306_i2c_error(2);
c02: 4509 li a0,2
c04: bfb1 j b60 <ssd1306_i2c_send.constprop.0+0x3c>
I2C1->CTLR1 |= I2C_CTLR1_START;
c06: 0007d703 lhu a4,0(a5)
timeout = TIMEOUT_MAX;
c0a: 66e1 lui a3,0x18
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
c0c: 00030637 lui a2,0x30
I2C1->CTLR1 |= I2C_CTLR1_START;
c10: 10076713 ori a4,a4,256
c14: 00e79023 sh a4,0(a5)
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c18: 40005737 lui a4,0x40005
timeout = TIMEOUT_MAX;
c1c: 6a068693 addi a3,a3,1696 # 186a0 <tama.c.f19bf6d4+0x14f8f>
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c20: 40070713 addi a4,a4,1024 # 40005400 <_eusrstack+0x20004c00>
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
c24: 0605 addi a2,a2,1 # 30001 <tama.c.f19bf6d4+0x2c8f0>
c26: 537d li t1,-1
uint32_t status = I2C1->STAR1 | (I2C1->STAR2<<16);
c28: 01475283 lhu t0,20(a4)
c2c: 01875783 lhu a5,24(a4)
c30: 07c2 slli a5,a5,0x10
c32: 0057e7b3 or a5,a5,t0
while((!ssd1306_i2c_chk_evt(SSD1306_I2C_EVENT_MASTER_MODE_SELECT)) && (timeout--));
c36: 8ff1 and a5,a5,a2
c38: f8c788e3 beq a5,a2,bc8 <ssd1306_i2c_send.constprop.0+0xa4>
c3c: 16fd addi a3,a3,-1
c3e: fe6695e3 bne a3,t1,c28 <ssd1306_i2c_send.constprop.0+0x104>
return ssd1306_i2c_error(1);
c42: 4505 li a0,1
c44: bf31 j b60 <ssd1306_i2c_send.constprop.0+0x3c>
00000c46 <ssd1306_cmd>:
{
c46: fd810113 addi sp,sp,-40
/* build command or data packets */
if(cmd)
{
pkt[0] = 0;
pkt[1] = *data;
c4a: 00a100a3 sb a0,1(sp)
else
{
pkt[0] = 0x40;
memcpy(&pkt[1], data, sz);
}
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
c4e: 4589 li a1,2
c50: 850a mv a0,sp
c52: d206 sw ra,36(sp)
pkt[0] = 0;
c54: 00010023 sb zero,0(sp)
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
c58: 35f1 jal b24 <ssd1306_i2c_send.constprop.0>
}
c5a: 5092 lw ra,36(sp)
c5c: 02810113 addi sp,sp,40
c60: 8082 ret
00000c62 <mini_vsnprintf>:
{
c62: 1131 addi sp,sp,-20
c64: c806 sw ra,16(sp)
c66: c622 sw s0,12(sp)
b.buffer = buffer;
c68: c02a sw a0,0(sp)
b.pbuffer = buffer;
c6a: c22a sw a0,4(sp)
b.buffer_len = buffer_len;
c6c: c42e sw a1,8(sp)
if(buffer_len == 0) buffer = (void*) 0;
c6e: c19d beqz a1,c94 <mini_vsnprintf+0x32>
int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va);
c70: 00a037b3 snez a5,a0
c74: 40f007b3 neg a5,a5
c78: 842a mv s0,a0
c7a: 00f175b3 and a1,sp,a5
c7e: 1a800513 li a0,424
c82: 3971 jal 91e <mini_vpprintf>
if(buffer == (void*) 0) {
c84: c401 beqz s0,c8c <mini_vsnprintf+0x2a>
return b.pbuffer - b.buffer;
c86: 4512 lw a0,4(sp)
c88: 4782 lw a5,0(sp)
c8a: 8d1d sub a0,a0,a5
}
c8c: 40c2 lw ra,16(sp)
c8e: 4432 lw s0,12(sp)
c90: 0151 addi sp,sp,20
c92: 8082 ret
c94: 4401 li s0,0
int n = mini_vpprintf(_puts, (buffer != (void*)0)?&b:(void*)0, fmt, va);
c96: 4581 li a1,0
c98: b7dd j c7e <mini_vsnprintf+0x1c>
00000c9a <snprintf>:
{
c9a: 1131 addi sp,sp,-20
c9c: c436 sw a3,8(sp)
va_start( args, format );
c9e: 0034 addi a3,sp,8
{
ca0: c206 sw ra,4(sp)
ca2: c63a sw a4,12(sp)
ca4: c83e sw a5,16(sp)
va_start( args, format );
ca6: c036 sw a3,0(sp)
int ret = mini_vsnprintf( buffer, buffer_len, format, args );
ca8: 3f6d jal c62 <mini_vsnprintf>
}
caa: 4092 lw ra,4(sp)
cac: 0151 addi sp,sp,20
cae: 8082 ret
00000cb0 <memset>:
WEAK void *memset(void *dest, int c, size_t n) { unsigned char *s = dest; for (; n; n--, s++) *s = c; return dest; }
cb0: 962a add a2,a2,a0
cb2: 87aa mv a5,a0
cb4: 00c79363 bne a5,a2,cba <memset+0xa>
cb8: 8082 ret
cba: 00b78023 sb a1,0(a5)
cbe: 0785 addi a5,a5,1
cc0: bfd5 j cb4 <memset+0x4>
00000cc2 <ssd1306_setbuf.constprop.0>:
memset(ssd1306_buffer, color ? 0xFF : 0x00, sizeof(ssd1306_buffer));
cc2: 40000613 li a2,1024
cc6: 4581 li a1,0
cc8: c2818513 addi a0,gp,-984 # 20000024 <ssd1306_buffer>
ccc: b7d5 j cb0 <memset>
00000cce <memcpy>:
for (; n; n--) *d++ = *s++;
cce: 4781 li a5,0
cd0: 00f61363 bne a2,a5,cd6 <memcpy+0x8>
}
cd4: 8082 ret
for (; n; n--) *d++ = *s++;
cd6: 00f58733 add a4,a1,a5
cda: 00074683 lbu a3,0(a4)
cde: 00f50733 add a4,a0,a5
ce2: 0785 addi a5,a5,1
ce4: 00d70023 sb a3,0(a4)
ce8: b7e5 j cd0 <memcpy+0x2>
00000cea <ssd1306_refresh>:
{
cea: 7179 addi sp,sp,-48
ssd1306_cmd(SSD1306_COLUMNADDR);
cec: 02100513 li a0,33
{
cf0: d606 sw ra,44(sp)
cf2: d422 sw s0,40(sp)
cf4: d226 sw s1,36(sp)
ssd1306_cmd(SSD1306_COLUMNADDR);
cf6: 3f81 jal c46 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET); // Column start address (0 = reset)
cf8: 4501 li a0,0
cfa: 37b1 jal c46 <ssd1306_cmd>
ssd1306_cmd(SSD1306_OFFSET+SSD1306_W-1); // Column end address (127 = reset)
cfc: 07f00513 li a0,127
d00: 3799 jal c46 <ssd1306_cmd>
ssd1306_cmd(SSD1306_PAGEADDR);
d02: 02200513 li a0,34
d06: 3781 jal c46 <ssd1306_cmd>
ssd1306_cmd(0); // Page start address (0 = reset)
d08: 4501 li a0,0
d0a: 3f35 jal c46 <ssd1306_cmd>
ssd1306_cmd(7); // Page end address
d0c: 451d li a0,7
d0e: c2818413 addi s0,gp,-984 # 20000024 <ssd1306_buffer>
d12: 3f15 jal c46 <ssd1306_cmd>
for(i=0;i<sizeof(ssd1306_buffer);i+=SSD1306_PSZ)
d14: 40040493 addi s1,s0,1024
pkt[0] = 0x40;
d18: 04000793 li a5,64
memcpy(&pkt[1], data, sz);
d1c: 85a2 mv a1,s0
d1e: 02000613 li a2,32
d22: 00110513 addi a0,sp,1
pkt[0] = 0x40;
d26: 00f10023 sb a5,0(sp)
memcpy(&pkt[1], data, sz);
d2a: 3755 jal cce <memcpy>
return ssd1306_i2c_send(SSD1306_I2C_ADDR, pkt, sz+1);
d2c: 02100593 li a1,33
d30: 850a mv a0,sp
d32: 02040413 addi s0,s0,32
d36: 33fd jal b24 <ssd1306_i2c_send.constprop.0>
d38: fe9410e3 bne s0,s1,d18 <ssd1306_refresh+0x2e>
}
d3c: 50b2 lw ra,44(sp)
d3e: 5422 lw s0,40(sp)
d40: 5492 lw s1,36(sp)
d42: 6145 addi sp,sp,48
d44: 8082 ret
00000d46 <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
d46: 400227b7 lui a5,0x40022
d4a: 4705 li a4,1
d4c: 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;
d4e: 400217b7 lui a5,0x40021
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
d52: 01080737 lui a4,0x1080
RCC->CFGR0 = BASE_CFGR0;
d56: 0007a223 sw zero,4(a5) # 40021004 <_eusrstack+0x20020804>
RCC->CTLR = BASE_CTLR | RCC_HSION | RCC_PLLON; // Use HSI, enable PLL.
d5a: 08170713 addi a4,a4,129 # 1080081 <tama.c.f19bf6d4+0x107c970>
d5e: 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.
d60: 009f0737 lui a4,0x9f0
d64: 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
d66: 4398 lw a4,0(a5)
d68: 00671693 slli a3,a4,0x6
d6c: fe06dde3 bgez a3,d66 <SystemInit+0x20>
#if defined(CH32H41x)
RCC->PLLCFGR |= RCC_SYSPLL_GATE;
#endif
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
d70: 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
d72: 400216b7 lui a3,0x40021
uint32_t tmp32 = RCC->CFGR0 & ~(0x03); // clr the SW
d76: 9b71 andi a4,a4,-4
RCC->CFGR0 = tmp32 | RCC_SW_PLL; // Select PLL as system clock source
d78: 00276713 ori a4,a4,2
d7c: c3d8 sw a4,4(a5)
while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source
d7e: 4721 li a4,8
d80: 42dc lw a5,4(a3)
d82: 8bb1 andi a5,a5,12
d84: fee79ee3 bne a5,a4,d80 <SystemInit+0x3a>
*DMDATA1 = 0x00;
d88: e00007b7 lui a5,0xe0000
d8c: 0e07ac23 sw zero,248(a5) # e00000f8 <_eusrstack+0xbffff8f8>
*DMDATA0 = 0x80;
d90: 08000713 li a4,128
d94: 0ee7aa23 sw a4,244(a5)
SetupDebugPrintf();
#endif
#if defined(FUNCONF_SUPPORT_CONSTRUCTORS) && FUNCONF_SUPPORT_CONSTRUCTORS
CallConstructors();
#endif
}
d98: 8082 ret
00000d9a <main>:
}
}
// ----------------------------------------------------------------- main
int main(void)
{
d9a: 7139 addi sp,sp,-64
d9c: de06 sw ra,60(sp)
d9e: dc22 sw s0,56(sp)
da0: da26 sw s1,52(sp)
SystemInit();
da2: 3755 jal d46 <SystemInit>
funGpioInitAll();
da4: 400214b7 lui s1,0x40021
da8: 4c9c lw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
daa: 40011437 lui s0,0x40011
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
dae: 76fd lui a3,0xfffff
funGpioInitAll();
db0: 0357e793 ori a5,a5,53
db4: cc9c sw a5,24(s1)
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
db6: 80040793 addi a5,s0,-2048 # 40010800 <_eusrstack+0x20010000>
dba: 4398 lw a4,0(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
dbc: 0ff68693 addi a3,a3,255 # fffff0ff <_eusrstack+0xdfffe8ff>
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
dc0: f1000637 lui a2,0xf1000
funPinMode(LED_PIN, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
dc4: f0f77713 andi a4,a4,-241
dc8: 01076713 ori a4,a4,16
dcc: c398 sw a4,0(a5)
funDigitalWrite(LED_PIN, FUN_LOW);
dce: 00020737 lui a4,0x20
dd2: cb98 sw a4,16(a5)
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
dd4: 40040793 addi a5,s0,1024
dd8: 4398 lw a4,0(a5)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
dda: 167d addi a2,a2,-1 # f0ffffff <_eusrstack+0xd0fff7ff>
gpio_setup();
Delay_Ms(120); // let the OLED rail settle
ddc: 000b0537 lui a0,0xb0
funPinMode(BUZZER, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP);
de0: 8f75 and a4,a4,a3
de2: 10076713 ori a4,a4,256
de6: c398 sw a4,0(a5)
funDigitalWrite(BUZZER, FUN_LOW);
de8: 00040737 lui a4,0x40
dec: cb98 sw a4,16(a5)
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
dee: 4018 lw a4,0(s0)
Delay_Ms(120); // let the OLED rail settle
df0: c8050513 addi a0,a0,-896 # afc80 <tama.c.f19bf6d4+0xac56f>
funPinMode(BTN_OK, GPIO_CNF_IN_PUPD);
df4: 9b41 andi a4,a4,-16
df6: 00876713 ori a4,a4,8
dfa: c018 sw a4,0(s0)
funPinMode(BTN_LEFT, GPIO_CNF_IN_PUPD);
dfc: 4398 lw a4,0(a5)
dfe: 8f71 and a4,a4,a2
e00: 08000637 lui a2,0x8000
e04: 8f51 or a4,a4,a2
e06: c398 sw a4,0(a5)
funPinMode(BTN_RIGHT, GPIO_CNF_IN_PUPD);
e08: 4398 lw a4,0(a5)
e0a: ff100637 lui a2,0xff100
e0e: 167d addi a2,a2,-1 # ff0fffff <_eusrstack+0xdf0ff7ff>
e10: 8f71 and a4,a4,a2
e12: 00800637 lui a2,0x800
e16: 8f51 or a4,a4,a2
e18: c398 sw a4,0(a5)
funDigitalWrite(BTN_OK, FUN_HIGH);
e1a: 4705 li a4,1
e1c: c818 sw a4,16(s0)
funDigitalWrite(BTN_LEFT, FUN_HIGH);
e1e: 04000713 li a4,64
e22: cb98 sw a4,16(a5)
funDigitalWrite(BTN_RIGHT, FUN_HIGH);
e24: 02000713 li a4,32
e28: cb98 sw a4,16(a5)
Delay_Ms(120); // let the OLED rail settle
e2a: c18ff0ef jal 242 <DelaySysTick>
* init I2C and GPIO
*/
uint8_t ssd1306_i2c_init(void)
{
// Enable GPIOC and I2C
RCC->APB1PCENR |= RCC_APB1Periph_I2C1;
e2e: 4cdc lw a5,28(s1)
e30: 00200737 lui a4,0x200
e34: 8fd9 or a5,a5,a4
e36: 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;
e38: 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));
e3a: 777d lui a4,0xfffff
e3c: 0ff70693 addi a3,a4,255 # fffff0ff <_eusrstack+0xdfffe8ff>
RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO;
e40: 0117e793 ori a5,a5,17
e44: cc9c sw a5,24(s1)
GPIOC->CFGLR &= ~(0xf<<(4*1));
e46: 401c lw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
e48: 6705 lui a4,0x1
e4a: d0070713 addi a4,a4,-768 # d00 <ssd1306_refresh+0x16>
GPIOC->CFGLR &= ~(0xf<<(4*1));
e4e: f0f7f793 andi a5,a5,-241
e52: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*1);
e54: 401c lw a5,0(s0)
e56: 0d07e793 ori a5,a5,208
e5a: c01c sw a5,0(s0)
GPIOC->CFGLR &= ~(0xf<<(4*2));
e5c: 401c lw a5,0(s0)
e5e: 8ff5 and a5,a5,a3
e60: c01c sw a5,0(s0)
GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_OD_AF)<<(4*2);
e62: 401c lw a5,0(s0)
e64: 8fd9 or a5,a5,a4
e66: 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;
e68: 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();
e6a: caaff0ef jal 314 <ssd1306_i2c_setup>
e6e: 3a040413 addi s0,s0,928 # 23a0 <ssd1306_init_array>
ssd1306_setbuf(0);
e72: 3d81 jal cc2 <ssd1306_setbuf.constprop.0>
while(*cmd_list != SSD1306_TERMINATE_CMDS)
e74: 00044503 lbu a0,0(s0)
e78: 0ff00793 li a5,255
e7c: 00f51463 bne a0,a5,e84 <main+0xea>
{
if(ssd1306_cmd(*cmd_list++))
return 1;
}
ssd1306_refresh();
e80: 35ad jal cea <ssd1306_refresh>
#endif
return 0;
e82: a021 j e8a <main+0xf0>
if(ssd1306_cmd(*cmd_list++))
e84: 0405 addi s0,s0,1
e86: 33c1 jal c46 <ssd1306_cmd>
e88: d575 beqz a0,e74 <main+0xda>
// 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();
e8a: dacff0ef jal 436 <pet_reset>
ssd1306_setbuf(0);
e8e: 3d15 jal cc2 <ssd1306_setbuf.constprop.0>
draw_center_str(4, "PANAGOTCHI");
e90: 6585 lui a1,0x1
e92: 6b858593 addi a1,a1,1720 # 16b8 <main+0x91e>
e96: 4511 li a0,4
e98: e78ff0ef jal 510 <draw_center_str>
ssd1306_drawImage(48, 16, pana_idle, PANA_W, PANA_H, 0);
e9c: 02000713 li a4,32
ea0: 6609 lui a2,0x2
ea2: 86ba mv a3,a4
ea4: 3bc60613 addi a2,a2,956 # 23bc <pana_idle>
ea8: 45c1 li a1,16
eaa: 03000513 li a0,48
eae: fd0ff0ef jal 67e <ssd1306_drawImage.constprop.0>
draw_center_str(52, "press any key");
eb2: 6585 lui a1,0x1
eb4: 6c458593 addi a1,a1,1732 # 16c4 <main+0x92a>
eb8: 03400513 li a0,52
ebc: e54ff0ef jal 510 <draw_center_str>
ssd1306_refresh();
ec0: 352d jal cea <ssd1306_refresh>
beep(659, 80); beep(784, 80); beep(988, 120);
ec2: 05000593 li a1,80
ec6: 29300513 li a0,659
eca: cdaff0ef jal 3a4 <beep>
ece: 05000593 li a1,80
ed2: 31000513 li a0,784
ed6: cceff0ef jal 3a4 <beep>
eda: 07800593 li a1,120
ede: 3dc00513 li a0,988
ee2: cc2ff0ef jal 3a4 <beep>
ee6: 0c800413 li s0,200
Buttons b = read_buttons();
eea: d7cff0ef jal 466 <read_buttons>
eee: 00855713 srli a4,a0,0x8
ef2: 01055793 srli a5,a0,0x10
ef6: 02e100a3 sb a4,33(sp)
if (b.ok || b.left || b.right) break;
efa: 8f49 or a4,a4,a0
Buttons b = read_buttons();
efc: 02f10123 sb a5,34(sp)
if (b.ok || b.left || b.right) break;
f00: 8fd9 or a5,a5,a4
Buttons b = read_buttons();
f02: 02a10023 sb a0,32(sp)
if (b.ok || b.left || b.right) break;
f06: 0ff7f793 zext.b a5,a5
f0a: eb81 bnez a5,f1a <main+0x180>
Delay_Ms(20);
f0c: 6575 lui a0,0x1d
f0e: 4c050513 addi a0,a0,1216 # 1d4c0 <tama.c.f19bf6d4+0x19daf>
for (int i = 0; i < 200; i++) {
f12: 147d addi s0,s0,-1
Delay_Ms(20);
f14: b2eff0ef jal 242 <DelaySysTick>
for (int i = 0; i < 200; i++) {
f18: f869 bnez s0,eea <main+0x150>
beep(659, 80); beep(784, 80); beep(988, 120);
f1a: 4701 li a4,0
f1c: 4481 li s1,0
f1e: 4401 li s0,0
f20: c03a sw a4,0(sp)
splash();
Buttons prev = {0, 0, 0};
while (1) {
Buttons b = read_buttons();
f22: d44ff0ef jal 466 <read_buttons>
f26: 01055793 srli a5,a0,0x10
f2a: 0ff57713 zext.b a4,a0
f2e: c23a sw a4,4(sp)
f30: 00f10f23 sb a5,30(sp)
f34: 0ff7f793 zext.b a5,a5
f38: 00855693 srli a3,a0,0x8
f3c: c63e sw a5,12(sp)
uint8_t ok_edge = b.ok && !prev.ok;
f3e: 4792 lw a5,4(sp)
Buttons b = read_buttons();
f40: 0ff6f713 zext.b a4,a3
f44: 00d10ea3 sb a3,29(sp)
f48: c43a sw a4,8(sp)
f4a: 00a10e23 sb a0,28(sp)
uint8_t ok_edge = b.ok && !prev.ok;
f4e: 4702 lw a4,0(sp)
f50: 4681 li a3,0
f52: c399 beqz a5,f58 <main+0x1be>
f54: 00143693 seqz a3,s0
uint8_t left_edge = b.left && !prev.left;
f58: 4622 lw a2,8(sp)
f5a: 4781 li a5,0
f5c: c219 beqz a2,f62 <main+0x1c8>
f5e: 0014b793 seqz a5,s1
uint8_t right_edge = b.right && !prev.right;
f62: 45b2 lw a1,12(sp)
f64: 4601 li a2,0
f66: c199 beqz a1,f6c <main+0x1d2>
f68: 00173613 seqz a2,a4
prev = b;
switch (screen) {
f6c: c181c583 lbu a1,-1000(gp) # 20000014 <screen>
f70: c1c18493 addi s1,gp,-996 # 20000018 <pet>
f74: c02e sw a1,0(sp)
f76: 4502 lw a0,0(sp)
f78: 4585 li a1,1
f7a: 40b50163 beq a0,a1,137c <main+0x5e2>
f7e: 4589 li a1,2
f80: 4ab50463 beq a0,a1,1428 <main+0x68e>
f84: 1c051d63 bnez a0,115e <main+0x3c4>
case SCR_MAIN:
if (left_edge) {
f88: c395 beqz a5,fac <main+0x212>
cursor = (cursor + ICON_COUNT - 1) % ICON_COUNT;
f8a: c171c503 lbu a0,-1001(gp) # 20000013 <cursor>
f8e: 4599 li a1,6
f90: ca32 sw a2,20(sp)
f92: 0515 addi a0,a0,5
f94: c836 sw a3,16(sp)
f96: 962ff0ef jal f8 <__modsi3>
f9a: c0a18ba3 sb a0,-1001(gp) # 20000013 <cursor>
beep(1047, 25);
f9e: 45e5 li a1,25
fa0: 41700513 li a0,1047
fa4: c00ff0ef jal 3a4 <beep>
fa8: 4652 lw a2,20(sp)
faa: 46c2 lw a3,16(sp)
}
if (right_edge) {
fac: c205 beqz a2,fcc <main+0x232>
cursor = (cursor + 1) % ICON_COUNT;
fae: c171c503 lbu a0,-1001(gp) # 20000013 <cursor>
fb2: 4599 li a1,6
fb4: c836 sw a3,16(sp)
fb6: 0505 addi a0,a0,1
fb8: 940ff0ef jal f8 <__modsi3>
fbc: c0a18ba3 sb a0,-1001(gp) # 20000013 <cursor>
beep(1047, 25);
fc0: 45e5 li a1,25
fc2: 41700513 li a0,1047
fc6: bdeff0ef jal 3a4 <beep>
fca: 46c2 lw a3,16(sp)
}
if (ok_edge) do_action(cursor);
fcc: c6ad beqz a3,1036 <main+0x29c>
switch (act) {
fce: c171c783 lbu a5,-1001(gp) # 20000013 <cursor>
fd2: 4695 li a3,5
fd4: 06f6e163 bltu a3,a5,1036 <main+0x29c>
fd8: 6685 lui a3,0x1
fda: 078a slli a5,a5,0x2
fdc: 7b468693 addi a3,a3,1972 # 17b4 <main+0xa1a>
fe0: 97b6 add a5,a5,a3
fe2: 439c lw a5,0(a5)
fe4: 8782 jr a5
pet.satiety = clamp100(pet.satiety + 30);
fe6: 00048783 lb a5,0(s1) # 40021000 <_eusrstack+0x20020800>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
fea: 06400713 li a4,100
pet.satiety = clamp100(pet.satiety + 30);
fee: 07f9 addi a5,a5,30
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
ff0: 1af75a63 bge a4,a5,11a4 <main+0x40a>
ff4: 87ba mv a5,a4
ff6: 00f48023 sb a5,0(s1)
pet.hygiene = clamp100(pet.hygiene - 5);
ffa: 00348783 lb a5,3(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
ffe: 06400713 li a4,100
pet.hygiene = clamp100(pet.hygiene - 5);
1002: 17ed addi a5,a5,-5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1004: 1af75563 bge a4,a5,11ae <main+0x414>
1008: 87ba mv a5,a4
100a: 00f481a3 sb a5,3(s1)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
100e: 4711 li a4,4
1010: c0e18623 sb a4,-1012(gp) # 20000008 <anim_exp>
beep(880, 60); beep(1175, 80);
1014: 03c00593 li a1,60
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1018: 4731 li a4,12
beep(880, 60); beep(1175, 80);
101a: 37000513 li a0,880
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
101e: c0e18b23 sb a4,-1002(gp) # 20000012 <anim_timer>
beep(880, 60); beep(1175, 80);
1022: b82ff0ef jal 3a4 <beep>
1026: 05000593 li a1,80
102a: 49700513 li a0,1175
beep(988, 60); beep(1319, 60); beep(1568, 90);
102e: b76ff0ef jal 3a4 <beep>
led_blink();
1032: bdaff0ef jal 40c <led_blink>
ssd1306_setbuf(0);
1036: 3171 jal cc2 <ssd1306_setbuf.constprop.0>
draw_center_str(0, menu_labels[cursor]);
1038: c171c783 lbu a5,-1001(gp) # 20000013 <cursor>
103c: 4501 li a0,0
103e: c83e sw a5,16(sp)
1040: 4742 lw a4,16(sp)
1042: 6789 lui a5,0x2
1044: 47078793 addi a5,a5,1136 # 2470 <menu_labels>
1048: 070a slli a4,a4,0x2
104a: 97ba add a5,a5,a4
104c: 438c lw a1,0(a5)
104e: cc2ff0ef jal 510 <draw_center_str>
if (pet.alive && pet.health < 30 && (frame & 8))
1052: 00a4c783 lbu a5,10(s1)
1056: ca3e sw a5,20(sp)
1058: c38d beqz a5,107a <main+0x2e0>
105a: 00448703 lb a4,4(s1)
105e: 47f5 li a5,29
1060: 00e7cd63 blt a5,a4,107a <main+0x2e0>
1064: c101a783 lw a5,-1008(gp) # 2000000c <frame>
1068: 8ba1 andi a5,a5,8
106a: cb81 beqz a5,107a <main+0x2e0>
ssd1306_drawstr(0, 0, "!", 1);
106c: 6605 lui a2,0x1
106e: 6d460613 addi a2,a2,1748 # 16d4 <main+0x93a>
1072: 4581 li a1,0
1074: 4501 li a0,0
1076: c22ff0ef jal 498 <ssd1306_drawstr.constprop.0>
beep(pet.sleeping ? 440 : 660, 120);
107a: 4401 li s0,0
107c: 8522 mv a0,s0
ssd1306_drawPixel(x++, y, color);
107e: 4605 li a2,1
1080: 45a9 li a1,10
1082: ae6ff0ef jal 368 <ssd1306_drawPixel>
1086: 0405 addi s0,s0,1
while (w--)
1088: 08000793 li a5,128
108c: fef418e3 bne s0,a5,107c <main+0x2e2>
if (pet.sleeping) {
1090: 0094c403 lbu s0,9(s1)
1094: 24040763 beqz s0,12e2 <main+0x548>
ssd1306_drawstr(px + PANA_W - 2, 14, "z", 1);
1098: 6605 lui a2,0x1
109a: 6d860613 addi a2,a2,1752 # 16d8 <main+0x93e>
109e: 45b9 li a1,14
10a0: 04e00513 li a0,78
10a4: bf4ff0ef jal 498 <ssd1306_drawstr.constprop.0>
ssd1306_drawstr(px + PANA_W + 4, 12, "Z", 1);
10a8: 6605 lui a2,0x1
10aa: 6dc60613 addi a2,a2,1756 # 16dc <main+0x942>
10ae: 45b1 li a1,12
10b0: 05400513 li a0,84
10b4: be4ff0ef jal 498 <ssd1306_drawstr.constprop.0>
10b8: 03000313 li t1,48
px = 48; py = 16;
10bc: 42c1 li t0,16
if (!pet.alive) return EXP_DEAD;
10be: 4752 lw a4,20(sp)
10c0: 4799 li a5,6
10c2: c719 beqz a4,10d0 <main+0x336>
if (anim_timer) return anim_exp;
10c4: c161c783 lbu a5,-1002(gp) # 20000012 <anim_timer>
10c8: 24078663 beqz a5,1314 <main+0x57a>
10cc: c0c1c783 lbu a5,-1012(gp) # 20000008 <anim_exp>
ssd1306_drawImage(px, py, pana_frames[current_expression()],
10d0: 6709 lui a4,0x2
10d2: 45470713 addi a4,a4,1108 # 2454 <pana_frames>
10d6: 078a slli a5,a5,0x2
10d8: 97ba add a5,a5,a4
10da: 4390 lw a2,0(a5)
10dc: 02000713 li a4,32
10e0: 86ba mv a3,a4
10e2: 8596 mv a1,t0
10e4: 851a mv a0,t1
10e6: d98ff0ef jal 67e <ssd1306_drawImage.constprop.0>
10ea: 4401 li s0,0
10ec: 8522 mv a0,s0
ssd1306_drawPixel(x++, y, color);
10ee: 4605 li a2,1
10f0: 02e00593 li a1,46
10f4: a74ff0ef jal 368 <ssd1306_drawPixel>
10f8: 0405 addi s0,s0,1
while (w--)
10fa: 08000793 li a5,128
10fe: fef417e3 bne s0,a5,10ec <main+0x352>
for (uint8_t i = 0; i < pet.poop; i++)
1102: 0084c783 lbu a5,8(s1)
1106: 4702 lw a4,0(sp)
1108: 24f76663 bltu a4,a5,1354 <main+0x5ba>
110c: 4401 li s0,0
ssd1306_drawImage(x, 48, menu_icons[i], ICON_W, ICON_H, 0);
110e: 00241793 slli a5,s0,0x2
1112: 00878733 add a4,a5,s0
1116: 070a slli a4,a4,0x2
1118: 00870333 add t1,a4,s0
111c: 6709 lui a4,0x2
111e: 43c70713 addi a4,a4,1084 # 243c <menu_icons>
1122: 97ba add a5,a5,a4
1124: 4390 lw a2,0(a5)
1126: 4741 li a4,16
1128: 86ba mv a3,a4
112a: 00330513 addi a0,t1,3
112e: 03000593 li a1,48
1132: c01a sw t1,0(sp)
1134: d4aff0ef jal 67e <ssd1306_drawImage.constprop.0>
if (i == cursor)
1138: 4742 lw a4,16(sp)
113a: 0ff47793 zext.b a5,s0
113e: 4302 lw t1,0(sp)
1140: 00f71a63 bne a4,a5,1154 <main+0x3ba>
ssd1306_drawRect(x - 2, 46, ICON_W + 3, ICON_H + 2, 1);
1144: 46c9 li a3,18
1146: 464d li a2,19
1148: 02e00593 li a1,46
114c: 00130513 addi a0,t1,1
1150: c74ff0ef jal 5c4 <ssd1306_drawRect.constprop.0>
for (uint8_t i = 0; i < ICON_COUNT; i++) {
1154: 0405 addi s0,s0,1
1156: 4799 li a5,6
1158: faf41be3 bne s0,a5,110e <main+0x374>
ssd1306_refresh();
115c: 3679 jal cea <ssd1306_refresh>
}
draw_dead();
break;
}
if (anim_timer) anim_timer--;
115e: c161c783 lbu a5,-1002(gp) # 20000012 <anim_timer>
1162: c781 beqz a5,116a <main+0x3d0>
1164: 17fd addi a5,a5,-1
1166: c0f18b23 sb a5,-1002(gp) # 20000012 <anim_timer>
// advance game time independent of which screen is showing
if (pet.alive && ++tick_acc >= TICK_FRAMES) {
116a: 00a4c783 lbu a5,10(s1)
116e: cf81 beqz a5,1186 <main+0x3ec>
1170: c141d783 lhu a5,-1004(gp) # 20000010 <tick_acc>
1174: 03100693 li a3,49
1178: 0785 addi a5,a5,1
117a: 07c2 slli a5,a5,0x10
117c: 83c1 srli a5,a5,0x10
117e: 30f6e763 bltu a3,a5,148c <main+0x6f2>
1182: c0f19a23 sh a5,-1004(gp) # 20000010 <tick_acc>
tick_acc = 0;
game_tick();
}
frame++;
1186: c101a783 lw a5,-1008(gp) # 2000000c <frame>
Delay_Ms(FRAME_MS);
118a: 00058537 lui a0,0x58
118e: e4050513 addi a0,a0,-448 # 57e40 <tama.c.f19bf6d4+0x5472f>
frame++;
1192: 0785 addi a5,a5,1
1194: c0f1a823 sw a5,-1008(gp) # 2000000c <frame>
Delay_Ms(FRAME_MS);
1198: 8aaff0ef jal 242 <DelaySysTick>
prev = b;
119c: 4732 lw a4,12(sp)
119e: 44a2 lw s1,8(sp)
11a0: 4412 lw s0,4(sp)
while (1) {
11a2: bbbd j f20 <main+0x186>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
11a4: fff7c713 not a4,a5
11a8: 877d srai a4,a4,0x1f
11aa: 8ff9 and a5,a5,a4
11ac: b5a9 j ff6 <main+0x25c>
11ae: fff7c713 not a4,a5
11b2: 877d srai a4,a4,0x1f
11b4: 8ff9 and a5,a5,a4
11b6: bd91 j 100a <main+0x270>
if (pet.energy < 15) { beep(220, 120); break; } // too tired
11b8: 00248703 lb a4,2(s1)
11bc: 47b9 li a5,14
11be: 00e7c963 blt a5,a4,11d0 <main+0x436>
11c2: 07800593 li a1,120
11c6: 0dc00513 li a0,220
beep(659, 40);
11ca: 9daff0ef jal 3a4 <beep>
break;
11ce: b5a5 j 1036 <main+0x29c>
pet.happy = clamp100(pet.happy + 25);
11d0: 00148783 lb a5,1(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
11d4: 06400693 li a3,100
pet.happy = clamp100(pet.happy + 25);
11d8: 07e5 addi a5,a5,25
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
11da: 04f6d563 bge a3,a5,1224 <main+0x48a>
11de: 87b6 mv a5,a3
11e0: 00f480a3 sb a5,1(s1)
pet.energy = clamp100(pet.energy - 12);
11e4: ff470793 addi a5,a4,-12
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
11e8: 06400713 li a4,100
11ec: 00f75363 bge a4,a5,11f2 <main+0x458>
11f0: 87ba mv a5,a4
11f2: 00f48123 sb a5,2(s1)
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
11f6: 4709 li a4,2
11f8: c0e18623 sb a4,-1012(gp) # 20000008 <anim_exp>
beep(988, 60); beep(1319, 60); beep(1568, 90);
11fc: 03c00593 li a1,60
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1200: 4731 li a4,12
beep(988, 60); beep(1319, 60); beep(1568, 90);
1202: 3dc00513 li a0,988
static void react(uint8_t exp) { anim_exp = exp; anim_timer = ANIM_FRAMES; }
1206: c0e18b23 sb a4,-1002(gp) # 20000012 <anim_timer>
beep(988, 60); beep(1319, 60); beep(1568, 90);
120a: 99aff0ef jal 3a4 <beep>
120e: 03c00593 li a1,60
1212: 52700513 li a0,1319
1216: 98eff0ef jal 3a4 <beep>
121a: 05a00593 li a1,90
121e: 62000513 li a0,1568
1222: b531 j 102e <main+0x294>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1224: fff7c693 not a3,a5
1228: 86fd srai a3,a3,0x1f
122a: 8ff5 and a5,a5,a3
122c: bf55 j 11e0 <main+0x446>
pet.sleeping = !pet.sleeping;
122e: 0094c503 lbu a0,9(s1)
beep(pet.sleeping ? 440 : 660, 120);
1232: 07800593 li a1,120
pet.sleeping = !pet.sleeping;
1236: 00153793 seqz a5,a0
beep(pet.sleeping ? 440 : 660, 120);
123a: 00a03533 snez a0,a0
123e: 40a00533 neg a0,a0
1242: 0dc57513 andi a0,a0,220
pet.sleeping = !pet.sleeping;
1246: 00f484a3 sb a5,9(s1)
beep(pet.sleeping ? 440 : 660, 120);
124a: 1b850513 addi a0,a0,440
124e: bfb5 j 11ca <main+0x430>
pet.happy = clamp100(pet.happy + 5);
1250: c1c18693 addi a3,gp,-996 # 20000018 <pet>
1254: 00148783 lb a5,1(s1)
pet.hygiene = 100;
1258: 06400713 li a4,100
pet.poop = 0;
125c: 00048423 sb zero,8(s1)
pet.hygiene = 100;
1260: 00e481a3 sb a4,3(s1)
pet.happy = clamp100(pet.happy + 5);
1264: 0795 addi a5,a5,5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1266: 02f75063 bge a4,a5,1286 <main+0x4ec>
126a: 87ba mv a5,a4
beep(1319, 50); beep(1047, 50);
126c: 03200593 li a1,50
1270: 52700513 li a0,1319
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1274: 00f680a3 sb a5,1(a3)
beep(1319, 50); beep(1047, 50);
1278: 92cff0ef jal 3a4 <beep>
127c: 03200593 li a1,50
1280: 41700513 li a0,1047
1284: b799 j 11ca <main+0x430>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1286: fff7c713 not a4,a5
128a: 877d srai a4,a4,0x1f
128c: 8ff9 and a5,a5,a4
128e: bff9 j 126c <main+0x4d2>
pet.health = clamp100(pet.health + 35);
1290: 00448783 lb a5,4(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1294: 06400713 li a4,100
pet.health = clamp100(pet.health + 35);
1298: 02378793 addi a5,a5,35
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
129c: 02f75663 bge a4,a5,12c8 <main+0x52e>
12a0: 87ba mv a5,a4
beep(784, 60); beep(1047, 60); beep(1319, 90);
12a2: 03c00593 li a1,60
12a6: 31000513 li a0,784
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12aa: 00f48223 sb a5,4(s1)
beep(784, 60); beep(1047, 60); beep(1319, 90);
12ae: 8f6ff0ef jal 3a4 <beep>
12b2: 03c00593 li a1,60
12b6: 41700513 li a0,1047
12ba: 8eaff0ef jal 3a4 <beep>
12be: 05a00593 li a1,90
12c2: 52700513 li a0,1319
12c6: b3a5 j 102e <main+0x294>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
12c8: fff7c713 not a4,a5
12cc: 877d srai a4,a4,0x1f
12ce: 8ff9 and a5,a5,a4
12d0: bfc9 j 12a2 <main+0x508>
screen = SCR_STATS;
12d2: 4785 li a5,1
12d4: c0f18c23 sb a5,-1000(gp) # 20000014 <screen>
beep(659, 40);
12d8: 02800593 li a1,40
12dc: 29300513 li a0,659
12e0: b5ed j 11ca <main+0x430>
uint32_t t = frame % 80;
12e2: c101a283 lw t0,-1008(gp) # 2000000c <frame>
12e6: 05000593 li a1,80
12ea: 8516 mv a0,t0
12ec: cc16 sw t0,24(sp)
12ee: de7fe0ef jal d4 <__umodsi3>
px = (t < 40) ? 30 + t : 30 + (80 - t); // 30..70..30
12f2: 02700793 li a5,39
12f6: 42e2 lw t0,24(sp)
12f8: 01e50313 addi t1,a0,30
12fc: 00a7f663 bgeu a5,a0,1308 <main+0x56e>
1300: 06e00793 li a5,110
1304: 40a78333 sub t1,a5,a0
py = 14 + ((frame % 16) < 8 ? 0 : 1);
1308: 0082f293 andi t0,t0,8
130c: 005032b3 snez t0,t0
1310: 02b9 addi t0,t0,14
1312: b375 j 10be <main+0x324>
if (pet.sleeping) return EXP_SLEEP;
1314: 4795 li a5,5
1316: da041de3 bnez s0,10d0 <main+0x336>
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
131a: 00448683 lb a3,4(s1)
131e: 4775 li a4,29
return EXP_SAD;
1320: 478d li a5,3
if (pet.health < 30 || pet.happy < 25 || pet.satiety < 20)
1322: dad757e3 bge a4,a3,10d0 <main+0x336>
1326: 00148683 lb a3,1(s1)
132a: 4761 li a4,24
132c: dad752e3 bge a4,a3,10d0 <main+0x336>
1330: 00048683 lb a3,0(s1)
1334: 474d li a4,19
1336: d8d75de3 bge a4,a3,10d0 <main+0x336>
if ((frame % 50) < 4) return EXP_BLINK;
133a: c101a503 lw a0,-1008(gp) # 2000000c <frame>
133e: 03200593 li a1,50
1342: cc16 sw t0,24(sp)
1344: ca1a sw t1,20(sp)
1346: d8ffe0ef jal d4 <__umodsi3>
134a: 42e2 lw t0,24(sp)
134c: 4352 lw t1,20(sp)
134e: 00453793 sltiu a5,a0,4
1352: bbbd j 10d0 <main+0x336>
ssd1306_drawImage(8 + i * 12, 38, spr_poop, 8, 8, 0);
1354: 4782 lw a5,0(sp)
1356: 4721 li a4,8
1358: 00179513 slli a0,a5,0x1
135c: 953e add a0,a0,a5
135e: 050a slli a0,a0,0x2
1360: 86ba mv a3,a4
1362: c0418613 addi a2,gp,-1020 # 20000000 <spr_poop>
1366: 02600593 li a1,38
136a: 953a add a0,a0,a4
136c: b12ff0ef jal 67e <ssd1306_drawImage.constprop.0>
for (uint8_t i = 0; i < pet.poop; i++)
1370: 4782 lw a5,0(sp)
1372: 0785 addi a5,a5,1
1374: 0ff7f793 zext.b a5,a5
1378: c03e sw a5,0(sp)
137a: b361 j 1102 <main+0x368>
if (ok_edge || left_edge || right_edge) {
137c: 8fd5 or a5,a5,a3
137e: 8fd1 or a5,a5,a2
1380: cb81 beqz a5,1390 <main+0x5f6>
beep(880, 30);
1382: 45f9 li a1,30
1384: 37000513 li a0,880
screen = SCR_MAIN;
1388: c0018c23 sb zero,-1000(gp) # 20000014 <screen>
beep(880, 30);
138c: 818ff0ef jal 3a4 <beep>
ssd1306_setbuf(0);
1390: 933ff0ef jal cc2 <ssd1306_setbuf.constprop.0>
draw_center_str(0, "-- STATUS --");
1394: 6585 lui a1,0x1
1396: 6e058593 addi a1,a1,1760 # 16e0 <main+0x946>
139a: 4501 li a0,0
139c: 974ff0ef jal 510 <draw_center_str>
draw_bar(10, "FOOD", pet.satiety);
13a0: 00048603 lb a2,0(s1)
13a4: 6585 lui a1,0x1
13a6: 6f058593 addi a1,a1,1776 # 16f0 <main+0x956>
13aa: 4529 li a0,10
13ac: a58ff0ef jal 604 <draw_bar>
draw_bar(19, "FUN ", pet.happy);
13b0: 00148603 lb a2,1(s1)
13b4: 6585 lui a1,0x1
13b6: 6f858593 addi a1,a1,1784 # 16f8 <main+0x95e>
13ba: 454d li a0,19
13bc: a48ff0ef jal 604 <draw_bar>
draw_bar(28, "ENGY", pet.energy);
13c0: 00248603 lb a2,2(s1)
13c4: 6585 lui a1,0x1
13c6: 70058593 addi a1,a1,1792 # 1700 <main+0x966>
13ca: 4571 li a0,28
13cc: a38ff0ef jal 604 <draw_bar>
draw_bar(37, "WASH", pet.hygiene);
13d0: 00348603 lb a2,3(s1)
13d4: 6585 lui a1,0x1
13d6: 70858593 addi a1,a1,1800 # 1708 <main+0x96e>
13da: 02500513 li a0,37
13de: a26ff0ef jal 604 <draw_bar>
draw_bar(46, "HLTH", pet.health);
13e2: 00448603 lb a2,4(s1)
13e6: 6585 lui a1,0x1
13e8: 71058593 addi a1,a1,1808 # 1710 <main+0x976>
13ec: 02e00513 li a0,46
13f0: a14ff0ef jal 604 <draw_bar>
snprintf(line, sizeof(line), "Age %u %s", pet.age_min,
13f4: 0094c783 lbu a5,9(s1)
13f8: 0064d683 lhu a3,6(s1)
13fc: c395 beqz a5,1420 <main+0x686>
13fe: 6705 lui a4,0x1
1400: 6b470713 addi a4,a4,1716 # 16b4 <main+0x91a>
1404: 6605 lui a2,0x1
1406: 71860613 addi a2,a2,1816 # 1718 <main+0x97e>
140a: 45c5 li a1,17
140c: 1008 addi a0,sp,32
140e: 88dff0ef jal c9a <snprintf>
ssd1306_drawstr(0, 56, line, 1);
1412: 1010 addi a2,sp,32
1414: 03800593 li a1,56
1418: 4501 li a0,0
141a: 87eff0ef jal 498 <ssd1306_drawstr.constprop.0>
ssd1306_refresh();
141e: bb3d j 115c <main+0x3c2>
snprintf(line, sizeof(line), "Age %u %s", pet.age_min,
1420: 6705 lui a4,0x1
1422: 6b070713 addi a4,a4,1712 # 16b0 <main+0x916>
1426: bff9 j 1404 <main+0x66a>
if (ok_edge) { // start a new pet
1428: ce99 beqz a3,1446 <main+0x6ac>
pet_reset();
142a: 80cff0ef jal 436 <pet_reset>
beep(659, 80); beep(988, 120);
142e: 05000593 li a1,80
1432: 29300513 li a0,659
1436: f6ffe0ef jal 3a4 <beep>
143a: 07800593 li a1,120
143e: 3dc00513 li a0,988
1442: f63fe0ef jal 3a4 <beep>
ssd1306_setbuf(0);
1446: 87dff0ef jal cc2 <ssd1306_setbuf.constprop.0>
ssd1306_drawImage(48, 8, spr_grave, 32, 32, 0);
144a: 02000713 li a4,32
144e: 6609 lui a2,0x2
1450: 86ba mv a3,a4
1452: 48860613 addi a2,a2,1160 # 2488 <spr_grave>
1456: 45a1 li a1,8
1458: 03000513 li a0,48
145c: a22ff0ef jal 67e <ssd1306_drawImage.constprop.0>
draw_center_str(44, "R.I.P.");
1460: 6585 lui a1,0x1
1462: 72458593 addi a1,a1,1828 # 1724 <main+0x98a>
1466: 02c00513 li a0,44
146a: 8a6ff0ef jal 510 <draw_center_str>
snprintf(line, sizeof(line), "lived %u min", pet.age_min);
146e: 0064d683 lhu a3,6(s1)
1472: 6605 lui a2,0x1
1474: 72c60613 addi a2,a2,1836 # 172c <main+0x992>
1478: 45c5 li a1,17
147a: 1008 addi a0,sp,32
147c: 81fff0ef jal c9a <snprintf>
draw_center_str(52, line);
1480: 100c addi a1,sp,32
1482: 03400513 li a0,52
1486: 88aff0ef jal 510 <draw_center_str>
148a: b9c9 j 115c <main+0x3c2>
pet.age_min++;
148c: 0064d303 lhu t1,6(s1)
if (pet.sleeping) {
1490: 0094c503 lbu a0,9(s1)
tick_acc = 0;
1494: c0019a23 sh zero,-1004(gp) # 20000010 <tick_acc>
pet.age_min++;
1498: 0305 addi t1,t1,1
149a: 0342 slli t1,t1,0x10
149c: 01035313 srli t1,t1,0x10
14a0: 00649323 sh t1,6(s1)
pet.satiety = clamp100(pet.satiety - 1);
14a4: 00048703 lb a4,0(s1)
pet.energy = clamp100(pet.energy + 10);
14a8: 00248783 lb a5,2(s1)
14ac: 06400593 li a1,100
if (pet.sleeping) {
14b0: 14050163 beqz a0,15f2 <main+0x858>
pet.energy = clamp100(pet.energy + 10);
14b4: 00a78693 addi a3,a5,10
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
14b8: 12d5d363 bge a1,a3,15de <main+0x844>
14bc: 86ae mv a3,a1
14be: 06e2 slli a3,a3,0x18
14c0: 86e1 srai a3,a3,0x18
pet.energy = clamp100(pet.energy + 10);
14c2: 00d48123 sb a3,2(s1)
pet.satiety = clamp100(pet.satiety - 1);
14c6: 177d addi a4,a4,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
14c8: 06400613 li a2,100
14cc: 10e65e63 bge a2,a4,15e8 <main+0x84e>
14d0: 8732 mv a4,a2
14d2: 0762 slli a4,a4,0x18
14d4: 8761 srai a4,a4,0x18
pet.satiety = clamp100(pet.satiety - 1);
14d6: 00e48023 sb a4,0(s1)
if (pet.energy >= 100) pet.sleeping = 0; // wakes when rested
14da: 05900613 li a2,89
14de: 00f65763 bge a2,a5,14ec <main+0x752>
14e2: 000484a3 sb zero,9(s1)
14e6: 06400693 li a3,100
14ea: 4501 li a0,0
pet.hygiene = clamp100(pet.hygiene - 1);
14ec: 00348583 lb a1,3(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
14f0: 06400793 li a5,100
pet.hygiene = clamp100(pet.hygiene - 1);
14f4: fff58613 addi a2,a1,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
14f8: 14c7dc63 bge a5,a2,1650 <main+0x8b6>
14fc: 863e mv a2,a5
14fe: 0662 slli a2,a2,0x18
1500: 8661 srai a2,a2,0x18
pet.hygiene = clamp100(pet.hygiene - 1);
1502: 00c481a3 sb a2,3(s1)
if (!pet.sleeping && pet.poop < 3 &&
1506: e115 bnez a0,152a <main+0x790>
1508: 0084c503 lbu a0,8(s1)
150c: 4789 li a5,2
150e: 00a7ee63 bltu a5,a0,152a <main+0x790>
((pet.age_min * 7u + frame) & 0x0F) == 0)
1512: 00331793 slli a5,t1,0x3
1516: 406787b3 sub a5,a5,t1
151a: c101a303 lw t1,-1008(gp) # 2000000c <frame>
151e: 979a add a5,a5,t1
1520: 8bbd andi a5,a5,15
if (!pet.sleeping && pet.poop < 3 &&
1522: e781 bnez a5,152a <main+0x790>
pet.poop++;
1524: 0505 addi a0,a0,1
1526: 00a48423 sb a0,8(s1)
if (pet.poop) pet.happy = clamp100(pet.happy - pet.poop);
152a: 0084c503 lbu a0,8(s1)
152e: c919 beqz a0,1544 <main+0x7aa>
1530: 00148783 lb a5,1(s1)
1534: 8f89 sub a5,a5,a0
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1536: 06400513 li a0,100
153a: 12f55063 bge a0,a5,165a <main+0x8c0>
153e: 87aa mv a5,a0
1540: 00f480a3 sb a5,1(s1)
if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1);
1544: 47d1 li a5,20
1546: 00b7cc63 blt a5,a1,155e <main+0x7c4>
154a: 00148783 lb a5,1(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
154e: 06400593 li a1,100
if (pet.hygiene < 20) pet.happy = clamp100(pet.happy - 1);
1552: 17fd addi a5,a5,-1
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1554: 10f5d863 bge a1,a5,1664 <main+0x8ca>
1558: 87ae mv a5,a1
155a: 00f480a3 sb a5,1(s1)
if (pet.hygiene < lo) lo = pet.hygiene;
155e: 0014c583 lbu a1,1(s1)
1562: 87ae mv a5,a1
1564: 05e2 slli a1,a1,0x18
1566: 85e1 srai a1,a1,0x18
1568: 00b65363 bge a2,a1,156e <main+0x7d4>
156c: 87b2 mv a5,a2
156e: 01879613 slli a2,a5,0x18
1572: 8661 srai a2,a2,0x18
1574: 00c75363 bge a4,a2,157a <main+0x7e0>
1578: 87ba mv a5,a4
157a: 01879713 slli a4,a5,0x18
157e: 8761 srai a4,a4,0x18
1580: 00e6d363 bge a3,a4,1586 <main+0x7ec>
1584: 87b6 mv a5,a3
1586: 01879713 slli a4,a5,0x18
158a: 8761 srai a4,a4,0x18
if (lo < 15) pet.health = clamp100(pet.health - 5);
158c: 46b9 li a3,14
158e: 00448783 lb a5,4(s1)
1592: 0ce6ce63 blt a3,a4,166e <main+0x8d4>
1596: 17ed addi a5,a5,-5
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1598: 06400713 li a4,100
159c: 0cf75f63 bge a4,a5,167a <main+0x8e0>
15a0: 87ba mv a5,a4
15a2: 00f48223 sb a5,4(s1)
if (pet.health <= 0) {
15a6: 00448783 lb a5,4(s1)
15aa: bcf04ee3 bgtz a5,1186 <main+0x3ec>
screen = SCR_DEAD;
15ae: 4709 li a4,2
beep(330, 200); beep(247, 200); beep(165, 400);
15b0: 0c800593 li a1,200
15b4: 14a00513 li a0,330
screen = SCR_DEAD;
15b8: c0e18c23 sb a4,-1000(gp) # 20000014 <screen>
pet.alive = 0;
15bc: 00048523 sb zero,10(s1)
beep(330, 200); beep(247, 200); beep(165, 400);
15c0: de5fe0ef jal 3a4 <beep>
15c4: 0c800593 li a1,200
15c8: 0f700513 li a0,247
15cc: dd9fe0ef jal 3a4 <beep>
15d0: 19000593 li a1,400
15d4: 0a500513 li a0,165
15d8: dcdfe0ef jal 3a4 <beep>
15dc: b66d j 1186 <main+0x3ec>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
15de: fff6c613 not a2,a3
15e2: 867d srai a2,a2,0x1f
15e4: 8ef1 and a3,a3,a2
15e6: bde1 j 14be <main+0x724>
15e8: fff74613 not a2,a4
15ec: 867d srai a2,a2,0x1f
15ee: 8f71 and a4,a4,a2
15f0: b5cd j 14d2 <main+0x738>
pet.satiety = clamp100(pet.satiety - 3);
15f2: 1775 addi a4,a4,-3
pet.happy = clamp100(pet.happy - 2);
15f4: 00148603 lb a2,1(s1)
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
15f8: 02e5dd63 bge a1,a4,1632 <main+0x898>
15fc: 872e mv a4,a1
15fe: 0762 slli a4,a4,0x18
1600: 8761 srai a4,a4,0x18
pet.satiety = clamp100(pet.satiety - 3);
1602: 00e48023 sb a4,0(s1)
pet.energy = clamp100(pet.energy - 2);
1606: 17f9 addi a5,a5,-2
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
1608: 06400693 li a3,100
160c: 02f6d863 bge a3,a5,163c <main+0x8a2>
1610: 87b6 mv a5,a3
1612: 01879693 slli a3,a5,0x18
1616: 86e1 srai a3,a3,0x18
pet.energy = clamp100(pet.energy - 2);
1618: 00d48123 sb a3,2(s1)
pet.happy = clamp100(pet.happy - 2);
161c: 1679 addi a2,a2,-2
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
161e: 06400793 li a5,100
1622: 02c7d263 bge a5,a2,1646 <main+0x8ac>
1626: 863e mv a2,a5
1628: c1c18793 addi a5,gp,-996 # 20000018 <pet>
162c: 00c780a3 sb a2,1(a5)
1630: bd75 j 14ec <main+0x752>
1632: fff74693 not a3,a4
1636: 86fd srai a3,a3,0x1f
1638: 8f75 and a4,a4,a3
163a: b7d1 j 15fe <main+0x864>
163c: fff7c693 not a3,a5
1640: 86fd srai a3,a3,0x1f
1642: 8ff5 and a5,a5,a3
1644: b7f9 j 1612 <main+0x878>
1646: fff64793 not a5,a2
164a: 87fd srai a5,a5,0x1f
164c: 8e7d and a2,a2,a5
164e: bfe9 j 1628 <main+0x88e>
1650: fff64793 not a5,a2
1654: 87fd srai a5,a5,0x1f
1656: 8e7d and a2,a2,a5
1658: b55d j 14fe <main+0x764>
165a: fff7c513 not a0,a5
165e: 857d srai a0,a0,0x1f
1660: 8fe9 and a5,a5,a0
1662: bdf9 j 1540 <main+0x7a6>
1664: fff7c593 not a1,a5
1668: 85fd srai a1,a1,0x1f
166a: 8fed and a5,a5,a1
166c: b5fd j 155a <main+0x7c0>
else if (lo > 50) pet.health = clamp100(pet.health + 2);
166e: 03200693 li a3,50
1672: f2e6dae3 bge a3,a4,15a6 <main+0x80c>
1676: 0789 addi a5,a5,2
1678: b705 j 1598 <main+0x7fe>
static int8_t clamp100(int v) { return v < 0 ? 0 : (v > 100 ? 100 : v); }
167a: fff7c713 not a4,a5
167e: 877d srai a4,a4,0x1f
1680: 8ff9 and a5,a5,a4
1682: b705 j 15a2 <main+0x808>
1684: 31647373 .insn 4, 0x31647373
1688: 5f363033 .insn 4, 0x5f363033
168c: 3269 jal 1016 <main+0x27c>
168e: 72655f63 bge a0,t1,1dcc <fontdata+0x22c>
1692: 6f72 .insn 2, 0x6f72
1694: 2072 .insn 2, 0x2072
1696: 202d jal 16c0 <main+0x926>
1698: 6974 .insn 2, 0x6974
169a: 656d lui a0,0x1b
169c: 2074756f jal a0,490a2 <tama.c.f19bf6d4+0x45991>
16a0: 74696177 .insn 4, 0x74696177
16a4: 6e69 lui t3,0x1a
16a6: 6f662067 .insn 4, 0x6f662067
16aa: 2072 .insn 2, 0x2072
16ac: 7325 lui t1,0xfffe9
16ae: 0d0a slli s10,s10,0x2
16b0: 0000 unimp
16b2: 0000 unimp
16b4: 7a5a .insn 2, 0x7a5a
16b6: 007a c.slli zero,0x1e
16b8: 4150 lw a2,4(a0)
16ba: 414e lw sp,208(sp)
16bc: 43544f47 .insn 4, 0x43544f47
16c0: 4948 lw a0,20(a0)
16c2: 0000 unimp
16c4: 7270 .insn 2, 0x7270
16c6: 7365 lui t1,0xffff9
16c8: 6e612073 .insn 4, 0x6e612073
16cc: 2079 jal 175a <main+0x9c0>
16ce: 0079656b .insn 4, 0x0079656b
16d2: 0000 unimp
16d4: 0021 c.nop 8
16d6: 0000 unimp
16d8: 007a c.slli zero,0x1e
16da: 0000 unimp
16dc: 005a c.slli zero,0x16
16de: 0000 unimp
16e0: 2d2d jal 1d1a <fontdata+0x17a>
16e2: 5320 lw s0,96(a4)
16e4: 4154 lw a3,4(a0)
16e6: 5554 lw a3,44(a0)
16e8: 2d2d2053 .insn 4, 0x2d2d2053
16ec: 0000 unimp
16ee: 0000 unimp
16f0: 4f46 lw t5,80(sp)
16f2: 0000444f .insn 4, 0x444f
16f6: 0000 unimp
16f8: 5546 lw a0,112(sp)
16fa: 204e .insn 2, 0x204e
16fc: 0000 unimp
16fe: 0000 unimp
1700: 4e45 li t3,17
1702: 00005947 .insn 4, 0x5947
1706: 0000 unimp
1708: 48534157 .insn 4, 0x48534157
170c: 0000 unimp
170e: 0000 unimp
1710: 4c48 lw a0,28(s0)
1712: 4854 lw a3,20(s0)
1714: 0000 unimp
1716: 0000 unimp
1718: 6741 lui a4,0x10
171a: 2065 jal 17c2 <main+0xa28>
171c: 7525 lui a0,0xfffe9
171e: 2020 .insn 2, 0x2020
1720: 7325 lui t1,0xfffe9
1722: 0000 unimp
1724: 2e52 .insn 2, 0x2e52
1726: 2e49 jal 1ab8 <pana_happy+0x2c>
1728: 2e50 .insn 2, 0x2e50
172a: 0000 unimp
172c: 696c .insn 2, 0x696c
172e: 6576 .insn 2, 0x6576
1730: 2064 .insn 2, 0x2064
1732: 7525 lui a0,0xfffe9
1734: 6d20 .insn 2, 0x6d20
1736: 6e69 lui t3,0x1a
1738: 0000 unimp
173a: 0000 unimp
173c: 6f6e .insn 2, 0x6f6e
173e: 2074 .insn 2, 0x2074
1740: 7562 .insn 2, 0x7562
1742: 00007973 .insn 4, 0x7973
1746: 0000 unimp
1748: 616d addi sp,sp,240
174a: 72657473 .insn 4, 0x72657473
174e: 6d20 .insn 2, 0x6d20
1750: 0065646f jal s0,57756 <tama.c.f19bf6d4+0x54045>
1754: 7274 .insn 2, 0x7274
1756: 6e61 lui t3,0x18
1758: 74696d73 .insn 4, 0x74696d73
175c: 6d20 .insn 2, 0x6d20
175e: 0065646f jal s0,57764 <tama.c.f19bf6d4+0x54053>
1762: 0000 unimp
1764: 7874 .insn 2, 0x7874
1766: 6520 .insn 2, 0x6520
1768: 706d c.lui zero,0xffffb
176a: 7974 .insn 2, 0x7974
176c: 0000 unimp
176e: 0000 unimp
1770: 7274 .insn 2, 0x7274
1772: 6e61 lui t3,0x18
1774: 74696d73 .insn 4, 0x74696d73
1778: 6320 .insn 2, 0x6320
177a: 6c706d6f jal s10,8640 <tama.c.f19bf6d4+0x4f2f>
177e: 7465 lui s0,0xffff9
1780: 0065 c.nop 25
1782: 0000 unimp
1784: 4546 lw a0,80(sp)
1786: 4445 li s0,17
1788: 0000 unimp
178a: 0000 unimp
178c: 4c50 lw a2,28(s0)
178e: 5941 li s2,-16
1790: 0000 unimp
1792: 0000 unimp
1794: 45454c53 .insn 4, 0x45454c53
1798: 0050 addi a2,sp,4
179a: 0000 unimp
179c: 41454c43 .insn 4, 0x41454c43
17a0: 004e c.slli zero,0x13
17a2: 0000 unimp
17a4: 4548 lw a0,12(a0)
17a6: 4c41 li s8,16
17a8: 0000 unimp
17aa: 0000 unimp
17ac: 54415453 .insn 4, 0x54415453
17b0: 00000053 .insn 4, 0x0053
17b4: 0fe6 slli t6,t6,0x19
17b6: 0000 unimp
17b8: 11b8 addi a4,sp,232
17ba: 0000 unimp
17bc: 122e slli tp,tp,0x2b
17be: 0000 unimp
17c0: 1250 addi a2,sp,292
17c2: 0000 unimp
17c4: 1290 addi a2,sp,352
17c6: 0000 unimp
17c8: 12d2 slli t0,t0,0x34
...
000017cc <icon_stats>:
17cc: 0000 0000 0000 c000 c000 c000 c006 c006 ................
17dc: d806 d806 d836 d836 d836 d836 0000 0000 ....6.6.6.6.....
000017ec <icon_heal>:
17ec: 0000 8000 f007 f80f 3c1c 3e3c 0e30 0e30 .........<<>0.0.
17fc: 0f70 0e30 3e3c 3e3c fc1f f80f f007 8000 p.0.<><>........
0000180c <icon_clean>:
180c: 0000 0000 8000 8000 c001 c001 f007 f80d ................
181c: f80d f808 fc1d f80d f80f f80f f007 8000 ................
0000182c <icon_sleep>:
182c: 0000 0000 0000 0004 000c 001c 0018 001c ................
183c: 003c 001c 001e 001f e80f f007 8000 0000 <...............
0000184c <icon_play>:
184c: 0000 0000 7007 0000 7c1f 7e3f 7e3f 7e3f .....p...|?~?~?~
185c: 0000 7e3f 7e3f 7e3f 7c1f 0000 7007 0000 ..?~?~?~.|...p..
0000186c <icon_feed>:
186c: 0000 0000 a000 9001 e00f f01b f83b f831 ............;.1.
187c: f83b fc7b f83f f83f f83f f01f e00f 0001 ;.{.?.?.?.......
0000188c <pana_dead>:
...
1894: 0001 8000 e00f f007 f01f f80f f01f f80f ................
18a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
18b4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
18c4: ff07 f0ff bb0f f8ee d70f f8f5 ef0f f8fb ................
18d4: d70f f8f5 bb1f fcee ff0f f8ff ff0f f8ff ................
18e4: ff0f f8ff f00f f807 ff07 f0ff ff07 f0ff ................
18f4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1904: 1f00 00fc 0000 0080 ........
0000190c <pana_sleep>:
...
1914: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1924: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1934: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1944: ff07 f0ff ff0f f8ff ff0f f8ff ff0f f8ff ................
1954: 010f 78c0 ff1f fcff ff0f f8ff ff0f f87f ...x............
1964: fc0f f81f ff0f f87f ff07 f0ff ff07 f0ff ................
1974: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1984: 1f00 00fc 0000 0080 ........
0000198c <pana_eat>:
...
1994: 0001 8000 e00f f007 f01f f80f f01f f80f ................
19a4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
19b4: ff1f f8ff ff0f f0ff ff03 e0ff ef07 f0fb ................
19c4: 8307 f0e0 930f f8e4 110f 78c4 830f f8e0 ...........x....
19d4: 830f f8e0 ef1f fcfb ff0f f87f fc0f f81f ................
19e4: fc0f f81f f80f f80f fc07 f01f fc07 f01f ................
19f4: ff03 e07f ff01 c0ff ff00 80ff 7f00 00ff ................
1a04: 1f00 00fc 0000 0080 ........
00001a0c <pana_sad>:
...
1a14: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1a24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1a34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1a44: ff07 f0ff ef0f f8fb 830f f8e0 930f f8e4 ................
1a54: 110f 78c4 831f fce0 830f f860 ec0f f81b ...x......`.....
1a64: ff0f f87f fc0f f81f f707 f0f7 fb07 f0ef ................
1a74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1a84: 1f00 00fc 0000 0080 ........
00001a8c <pana_happy>:
...
1a94: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1aa4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1ab4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1ac4: ff07 f0ff ff0f f8ff ef0f f8fb d70f f8f5 ................
1ad4: ff0f f8ff ff1f fcff ff0f f8ff f80f f80f ................
1ae4: fb0f f8ef f70f f8f7 fc07 f01f ff07 f0ff ................
1af4: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1b04: 1f00 00fc 0000 0080 ........
00001b0c <pana_blink>:
...
1b14: 0001 8000 e00f f007 f01f f80f f01f f80f ................
1b24: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
1b34: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
1b44: ff07 f0ff ff0f f8ff ff0f f8ff 010f 78c0 ...............x
1b54: ff0f f8ff ff1f fcff ff0f f87f fc0f f81f ................
1b64: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................
1b74: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
1b84: 1f00 00fc 0000 0080 ........
00001b8c <errstr>:
1b8c: 173c 0000 1748 0000 1754 0000 1764 0000 <...H...T...d...
1b9c: 1770 0000 p...
00001ba0 <fontdata>:
...
1ba8: 817e 81a5 99bd 7e81 ff7e ffdb e7c3 7eff ~......~~......~
1bb8: fe6c fefe 387c 0010 3810 fe7c 387c 0010 l...|8...8|.|8..
1bc8: 7c38 fe38 d6fe 3810 3810 fe7c 7cfe 3810 8|8....8.8|..|.8
1bd8: 0000 3c18 183c 0000 ffff c3e7 e7c3 ffff ...<<...........
1be8: 3c00 4266 6642 003c c3ff bd99 99bd ffc3 .<fBBf<.........
1bf8: 070f 7d0f cccc 78cc 663c 6666 183c 187e ...}...x<fff<.~.
1c08: 333f 303f 7030 e0f0 637f 637f 6763 c0e6 ?3?00p...c.ccg..
1c18: db18 e73c 3ce7 18db e080 fef8 e0f8 0080 ..<..<..........
1c28: 0e02 fe3e 0e3e 0002 3c18 187e 7e18 183c ..>.>....<~..~<.
1c38: 6666 6666 0066 0066 db7f 7bdb 1b1b 001b fffff.f....{....
1c48: 613e 663c 3c66 7c86 0000 0000 7e7e 007e >a<ff<.|....~~~.
1c58: 3c18 187e 3c7e ff18 3c18 187e 1818 0018 .<~.~<...<~.....
1c68: 1818 1818 3c7e 0018 1800 fe0c 180c 0000 ....~<..........
1c78: 3000 fe60 3060 0000 0000 c0c0 fec0 0000 .0`.`0..........
1c88: 2400 ff66 2466 0000 1800 7e3c ffff 0000 .$f.f$....<~....
1c98: ff00 7eff 183c 0000 0000 0000 0000 0000 ...~<...........
1ca8: 3c18 183c 0018 0018 6666 0024 0000 0000 .<<.....ff$.....
1cb8: 6c6c 6cfe 6cfe 006c 3e18 3c60 7c06 0018 ll.l.ll..>`<.|..
1cc8: c600 18cc 6630 00c6 6c38 7638 ccdc 0076 ....0f..8l8v..v.
1cd8: 1818 0030 0000 0000 180c 3030 1830 000c ..0.......000...
1ce8: 1830 0c0c 180c 0030 6600 ff3c 663c 0000 0.....0..f<.<f..
1cf8: 1800 7e18 1818 0000 0000 0000 1800 3018 ...~...........0
1d08: 0000 7e00 0000 0000 0000 0000 1800 0018 ...~............
1d18: 0c06 3018 c060 0080 6c38 d6c6 6cc6 0038 ...0`...8l...l8.
1d28: 3818 1818 1818 007e c67c 1c06 6630 00fe .8....~.|...0f..
1d38: c67c 3c06 c606 007c 3c1c cc6c 0cfe 001e |..<..|..<l.....
1d48: c0fe fcc0 c606 007c 6038 fcc0 c6c6 007c ......|.8`....|.
1d58: c6fe 180c 3030 0030 c67c 7cc6 c6c6 007c ....000.|..|..|.
1d68: c67c 7ec6 0c06 0078 1800 0018 1800 0018 |..~..x.........
1d78: 1800 0018 1800 3018 0c06 3018 0c18 0006 .......0...0....
1d88: 0000 007e 7e00 0000 3060 0c18 3018 0060 ..~..~..`0...0`.
1d98: c67c 180c 0018 0018 c67c dede c0de 0078 |.......|.....x.
1da8: 6c38 fec6 c6c6 00c6 66fc 7c66 6666 00fc 8l.......ff|ff..
1db8: 663c c0c0 66c0 003c 6cf8 6666 6c66 00f8 <f...f<..lfffl..
1dc8: 62fe 7868 6268 00fe 62fe 7868 6068 00f0 .bhxhb...bhxh`..
1dd8: 663c c0c0 66ce 003a c6c6 fec6 c6c6 00c6 <f...f:.........
1de8: 183c 1818 1818 003c 0c1e 0c0c cccc 0078 <.....<.......x.
1df8: 66e6 786c 666c 00e6 60f0 6060 6662 00fe .flxlf...```bf..
1e08: eec6 fefe c6d6 00c6 e6c6 def6 c6ce 00c6 ................
1e18: c67c c6c6 c6c6 007c 66fc 7c66 6060 00f0 |.....|..ff|``..
1e28: c67c c6c6 cec6 0e7c 66fc 7c66 666c 00e6 |.....|..ff|lf..
1e38: 663c 1830 660c 003c 7e7e 185a 1818 003c <f0..f<.~~Z...<.
1e48: c6c6 c6c6 c6c6 007c c6c6 c6c6 6cc6 0038 ......|......l8.
1e58: c6c6 d6c6 fed6 006c c6c6 386c c66c 00c6 ......l...l8l...
1e68: 6666 3c66 1818 003c c6fe 188c 6632 00fe fff<..<.....2f..
1e78: 303c 3030 3030 003c 60c0 1830 060c 0002 <00000<..`0.....
1e88: 0c3c 0c0c 0c0c 003c 3810 c66c 0000 0000 <.....<..8l.....
1e98: 0000 0000 0000 ff00 1830 000c 0000 0000 ........0.......
1ea8: 0000 0c78 cc7c 0076 60e0 667c 6666 00dc ..x.|.v..`|fff..
1eb8: 0000 c67c c6c0 007c 0c1c cc7c cccc 0076 ..|...|...|...v.
1ec8: 0000 c67c c0fe 007c 663c f860 6060 00f0 ..|...|.<f`.``..
1ed8: 0000 cc76 7ccc f80c 60e0 766c 6666 00e6 ..v..|...`lvff..
1ee8: 0018 1838 1818 003c 0006 0606 6606 3c66 ..8...<......ff<
1ef8: 60e0 6c66 6c78 00e6 1838 1818 1818 003c .`flxl..8.....<.
1f08: 0000 feec d6d6 00d6 0000 66dc 6666 0066 ...........ffff.
1f18: 0000 c67c c6c6 007c 0000 66dc 7c66 f060 ..|...|....ff|`.
1f28: 0000 cc76 7ccc 1e0c 0000 76dc 6060 00f0 ..v..|.....v``..
1f38: 0000 c07e 067c 00fc 3030 30fc 3630 001c ..~.|...00.006..
1f48: 0000 cccc cccc 0076 0000 c6c6 6cc6 0038 ......v......l8.
1f58: 0000 d6c6 fed6 006c 0000 6cc6 6c38 00c6 ......l....l8l..
1f68: 0000 c6c6 7ec6 fc06 0000 4c7e 3218 007e .....~....~L.2~.
1f78: 180e 7018 1818 000e 1818 1818 1818 0018 ...p............
1f88: 1870 0e18 1818 0070 dc76 0000 0000 0000 p.....p.v.......
1f98: 1000 6c38 c6c6 00fe c67c c0c0 7cc6 780c ..8l....|....|.x
1fa8: 00cc cccc cccc 0076 180c c67c c0fe 007c ......v...|...|.
1fb8: 827c 0c78 cc7c 0076 00c6 0c78 cc7c 0076 |.x.|.v...x.|.v.
1fc8: 1830 0c78 cc7c 0076 3030 0c78 cc7c 0076 0.x.|.v.00x.|.v.
1fd8: 0000 c07e 7ec0 380c 827c c67c c0fe 007c ..~..~.8|.|...|.
1fe8: 00c6 c67c c0fe 007c 1830 c67c c0fe 007c ..|...|.0.|...|.
1ff8: 0066 1838 1818 003c 827c 1838 1818 003c f.8...<.|.8...<.
2008: 1830 3800 1818 003c 38c6 c66c c6fe 00c6 0..8..<..8l.....
2018: 6c38 c67c c6fe 00c6 3018 c0fe c0f8 00fe 8l|......0......
2028: 0000 187e d87e 007e 6c3e fecc cccc 00ce ..~.~.~.>l......
2038: 827c c67c c6c6 007c 00c6 c67c c6c6 007c |.|...|...|...|.
2048: 1830 c67c c6c6 007c 8478 cc00 cccc 0076 0.|...|.x.....v.
2058: 3060 cccc cccc 0076 00c6 c6c6 7ec6 fc06 `0....v......~..
2068: 38c6 c66c 6cc6 0038 00c6 c6c6 c6c6 007c .8l..l8.......|.
2078: 1818 c07e 7ec0 1818 6c38 f064 6660 00fc ..~..~..8ld.`f..
2088: 6666 7e3c 7e18 1818 ccf8 facc cfc6 c7c6 ff<~.~..........
2098: 1b0e 3c18 d818 0070 3018 0c78 cc7c 0076 ...<..p..0x.|.v.
20a8: 180c 3800 1818 003c 180c c67c c6c6 007c ...8..<...|...|.
20b8: 3018 cccc cccc 0076 dc76 dc00 6666 0066 .0....v.v...fff.
20c8: dc76 e600 def6 00ce 6c3c 3e6c 7e00 0000 v.......<ll>.~..
20d8: 6c38 386c 7c00 0000 0018 1818 6330 003e 8ll8.|......0c>.
20e8: 0000 fe00 c0c0 0000 0000 fe00 0606 0000 ................
20f8: e663 7e6c 6633 0fcc e663 7a6c 6a36 06df c.l~3f..c.lz6j..
2108: 0018 1818 3c3c 0018 3300 cc66 3366 0000 ....<<...3f.f3..
2118: cc00 3366 cc66 0000 8822 8822 8822 8822 ..f3f...".".".".
2128: aa55 aa55 aa55 aa55 dd77 dd77 dd77 dd77 U.U.U.U.w.w.w.w.
2138: 1818 1818 1818 1818 1818 1818 18f8 1818 ................
2148: 1818 18f8 18f8 1818 3636 3636 36f6 3636 ........6666.666
2158: 0000 0000 36fe 3636 0000 18f8 18f8 1818 .....666........
2168: 3636 06f6 36f6 3636 3636 3636 3636 3636 66...66666666666
2178: 0000 06fe 36f6 3636 3636 06f6 00fe 0000 .....66666......
2188: 3636 3636 00fe 0000 1818 18f8 00f8 0000 6666............
2198: 0000 0000 18f8 1818 1818 1818 001f 0000 ................
21a8: 1818 1818 00ff 0000 0000 0000 18ff 1818 ................
21b8: 1818 1818 181f 1818 0000 0000 00ff 0000 ................
21c8: 1818 1818 18ff 1818 1818 181f 181f 1818 ................
21d8: 3636 3636 3637 3636 3636 3037 003f 0000 666676666670?...
21e8: 0000 303f 3637 3636 3636 00f7 00ff 0000 ..?0766666......
21f8: 0000 00ff 36f7 3636 3636 3037 3637 3636 .....66666707666
2208: 0000 00ff 00ff 0000 3636 00f7 36f7 3636 ........66...666
2218: 1818 00ff 00ff 0000 3636 3636 00ff 0000 ........6666....
2228: 0000 00ff 18ff 1818 0000 0000 36ff 3636 .............666
2238: 3636 3636 003f 0000 1818 181f 001f 0000 6666?...........
2248: 0000 181f 181f 1818 0000 0000 363f 3636 ............?666
2258: 3636 3636 36ff 3636 1818 18ff 18ff 1818 6666.666........
2268: 1818 1818 00f8 0000 0000 0000 181f 1818 ................
2278: ffff ffff ffff ffff 0000 0000 ffff ffff ................
2288: f0f0 f0f0 f0f0 f0f0 0f0f 0f0f 0f0f 0f0f ................
2298: ffff ffff 0000 0000 0000 dc76 dcc8 0076 ..........v...v.
22a8: cc78 d8cc c6cc 00cc c6fe c0c0 c0c0 00c0 x...............
22b8: 0000 6cfe 6c6c 006c c6fe 3060 c660 00fe ...llll...`0`...
22c8: 0000 d87e d8d8 0070 0000 6666 6666 c07c ..~...p...ffff|.
22d8: 7600 18dc 1818 0018 187e 663c 3c66 7e18 .v......~.<ff<.~
22e8: 6c38 fec6 6cc6 0038 6c38 c6c6 6c6c 00ee 8l...l8.8l..ll..
22f8: 180e 3e0c 6666 003c 0000 db7e 7edb 0000 ...>ff<...~..~..
2308: 0c06 db7e 7edb c060 301e 7e60 3060 001e ..~..~`..0`~`0..
2318: 7c00 c6c6 c6c6 00c6 fe00 fe00 fe00 0000 .|..............
2328: 1818 187e 0018 007e 1830 180c 0030 007e ..~...~.0...0.~.
2338: 180c 1830 000c 007e 1b0e 181b 1818 1818 ..0...~.........
2348: 1818 1818 d818 70d8 1800 7e00 1800 0000 .......p...~....
2358: 7600 00dc dc76 0000 6c38 386c 0000 0000 .v..v...8ll8....
2368: 0000 1800 0018 0000 0000 1800 0000 0000 ................
2378: 0c0f 0c0c 6cec 1c3c 366c 3636 0036 0000 .....l<.l6666...
2388: 0c78 3018 007c 0000 0000 3c3c 3c3c 0000 x..0|.....<<<<..
...
000023a0 <ssd1306_init_array>:
23a0: d5ae a880 d33f 4000 148d 0020 c8a1 12da ....?..@.. .....
23b0: 8f81 f1d9 40db a6a4 ffaf 0000 .....@......
000023bc <pana_idle>:
...
23c4: 0001 8000 e00f f007 f01f f80f f01f f80f ................
23d4: f01f f80f f83f fc9f ff1f f8ff ff1f f8ff ....?...........
23e4: ff1f f8ff ff0f f0ff ff03 e0ff ff07 f0ff ................
23f4: ef07 f0fb 830f f8e0 930f f8e4 110f 78c4 ...............x
2404: 830f f8e0 831f fce0 ef0f f87b fc0f f81f ..........{.....
2414: ff0f f87f ff0f f8ff f807 f00f ff07 f0ff ................
2424: ff03 e0ff ff01 c0ff ff00 80ff 7f00 00ff ................
2434: 1f00 00fc 0000 0080 ........
0000243c <menu_icons>:
243c: 186c 0000 184c 0000 182c 0000 180c 0000 l...L...,.......
244c: 17ec 0000 17cc 0000 ........
00002454 <pana_frames>:
2454: 23bc 0000 1b0c 0000 1a8c 0000 1a0c 0000 .#..............
2464: 198c 0000 190c 0000 188c 0000 ............
00002470 <menu_labels>:
2470: 1784 0000 178c 0000 1794 0000 179c 0000 ................
2480: 17a4 0000 17ac 0000 ........
00002488 <spr_grave>:
...
2490: ff00 00fc ff03 00ff ff07 80ff 1f06 80e1 ................
24a0: 3006 8031 3006 8031 3f06 00c3 3306 0003 .01..01..?...3..
24b0: 3106 0083 3006 00c3 0006 0006 0f06 0006 .1...0..........
24c0: ff07 80ff ff0f c0ff ff1f e0ff ff3f f0ff ............?...
24d0: ff7f f8ff ffff fcff ffff fcff f000 00f0 ................
24e0: ff03 00f0 ff0f 00fc 0000 0000 0000 0000 ................
...