You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2740 lines
92 KiB

3 years ago
  1. shiftin_try6_wLED.ino.elf: file format elf32-avr
  2. Disassembly of section .text:
  3. 00000000 <__vectors>:
  4. 0: 0c 94 a2 00 jmp 0x144 ; 0x144 <__ctors_end>
  5. 4: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  6. 8: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  7. c: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  8. 10: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  9. 14: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  10. 18: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  11. 1c: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  12. 20: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  13. 24: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  14. 28: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  15. 2c: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  16. 30: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  17. 34: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  18. 38: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  19. 3c: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  20. 40: 0c 94 75 04 jmp 0x8ea ; 0x8ea <__vector_16>
  21. 44: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  22. 48: 0c 94 43 04 jmp 0x886 ; 0x886 <__vector_18>
  23. 4c: 0c 94 1d 04 jmp 0x83a ; 0x83a <__vector_19>
  24. 50: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  25. 54: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  26. 58: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  27. 5c: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  28. 60: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  29. 64: 0c 94 ca 00 jmp 0x194 ; 0x194 <__bad_interrupt>
  30. 00000068 <__trampolines_end>:
  31. 68: 00 00 nop
  32. 6a: 00 00 nop
  33. 6c: 24 00 .word 0x0024 ; ????
  34. 6e: 27 00 .word 0x0027 ; ????
  35. 70: 2a 00 .word 0x002a ; ????
  36. 00000072 <port_to_output_PGM>:
  37. 72: 00 00 00 00 25 00 28 00 2b 00 ....%.(.+.
  38. 0000007c <port_to_input_PGM>:
  39. 7c: 00 00 00 00 23 00 26 00 29 00 ....#.&.).
  40. 00000086 <digital_pin_to_port_PGM>:
  41. 86: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................
  42. 96: 03 03 03 03 ....
  43. 0000009a <digital_pin_to_bit_mask_PGM>:
  44. 9a: 01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02 ..... @...... ..
  45. aa: 04 08 10 20 ...
  46. 000000ae <digital_pin_to_timer_PGM>:
  47. ae: 00 00 00 08 00 02 01 00 00 03 04 07 00 00 00 00 ................
  48. be: 00 00 00 00 ....
  49. 000000c2 <charTable>:
  50. c2: 7e 30 6d 79 33 5b 5f 70 7f 7b 77 1f 0d 3d 4f 47 ~0my3[_p.{w..=OG
  51. ...
  52. ee: 80 01 80 00 7e 30 6d 79 33 5b 5f 70 7f 7b 00 00 ....~0my3[_p.{..
  53. fe: 00 00 00 00 00 77 1f 0d 3d 4f 47 00 37 00 00 00 .....w..=OG.7...
  54. 10e: 0e 00 00 00 67 00 00 00 00 00 00 00 00 00 00 00 ....g...........
  55. 11e: 00 00 00 08 00 77 1f 0d 3d 4f 47 00 37 00 00 00 .....w..=OG.7...
  56. 12e: 0e 00 15 1d 67 00 00 00 00 00 00 00 00 00 00 00 ....g...........
  57. 13e: 00 00 00 00 ....
  58. 00000142 <__ctors_start>:
  59. 142: bf 04 cpc r11, r15
  60. 00000144 <__ctors_end>:
  61. 144: 11 24 eor r1, r1
  62. 146: 1f be out 0x3f, r1 ; 63
  63. 148: cf ef ldi r28, 0xFF ; 255
  64. 14a: d8 e0 ldi r29, 0x08 ; 8
  65. 14c: de bf out 0x3e, r29 ; 62
  66. 14e: cd bf out 0x3d, r28 ; 61
  67. 00000150 <__do_copy_data>:
  68. 150: 11 e0 ldi r17, 0x01 ; 1
  69. 152: a0 e0 ldi r26, 0x00 ; 0
  70. 154: b1 e0 ldi r27, 0x01 ; 1
  71. 156: e4 e5 ldi r30, 0x54 ; 84
  72. 158: ff e0 ldi r31, 0x0F ; 15
  73. 15a: 02 c0 rjmp .+4 ; 0x160 <__do_copy_data+0x10>
  74. 15c: 05 90 lpm r0, Z+
  75. 15e: 0d 92 st X+, r0
  76. 160: a6 31 cpi r26, 0x16 ; 22
  77. 162: b1 07 cpc r27, r17
  78. 164: d9 f7 brne .-10 ; 0x15c <__do_copy_data+0xc>
  79. 00000166 <__do_clear_bss>:
  80. 166: 22 e0 ldi r18, 0x02 ; 2
  81. 168: a6 e1 ldi r26, 0x16 ; 22
  82. 16a: b1 e0 ldi r27, 0x01 ; 1
  83. 16c: 01 c0 rjmp .+2 ; 0x170 <.do_clear_bss_start>
  84. 0000016e <.do_clear_bss_loop>:
  85. 16e: 1d 92 st X+, r1
  86. 00000170 <.do_clear_bss_start>:
  87. 170: ac 33 cpi r26, 0x3C ; 60
  88. 172: b2 07 cpc r27, r18
  89. 174: e1 f7 brne .-8 ; 0x16e <.do_clear_bss_loop>
  90. 00000176 <__do_global_ctors>:
  91. 176: 10 e0 ldi r17, 0x00 ; 0
  92. 178: c2 ea ldi r28, 0xA2 ; 162
  93. 17a: d0 e0 ldi r29, 0x00 ; 0
  94. 17c: 04 c0 rjmp .+8 ; 0x186 <__do_global_ctors+0x10>
  95. 17e: 21 97 sbiw r28, 0x01 ; 1
  96. 180: fe 01 movw r30, r28
  97. 182: 0e 94 9d 07 call 0xf3a ; 0xf3a <__tablejump2__>
  98. 186: c1 3a cpi r28, 0xA1 ; 161
  99. 188: d1 07 cpc r29, r17
  100. 18a: c9 f7 brne .-14 ; 0x17e <__do_global_ctors+0x8>
  101. 18c: 0e 94 7a 05 call 0xaf4 ; 0xaf4 <main>
  102. 190: 0c 94 a8 07 jmp 0xf50 ; 0xf50 <_exit>
  103. 00000194 <__bad_interrupt>:
  104. 194: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
  105. 00000198 <Print::write(unsigned char const*, unsigned int)>:
  106. // Public Methods //////////////////////////////////////////////////////////////
  107. /* default implementation: may be overridden */
  108. size_t Print::write(const uint8_t *buffer, size_t size)
  109. {
  110. 198: cf 92 push r12
  111. 19a: df 92 push r13
  112. 19c: ef 92 push r14
  113. 19e: ff 92 push r15
  114. 1a0: 0f 93 push r16
  115. 1a2: 1f 93 push r17
  116. 1a4: cf 93 push r28
  117. 1a6: df 93 push r29
  118. 1a8: 6c 01 movw r12, r24
  119. 1aa: 7a 01 movw r14, r20
  120. 1ac: 8b 01 movw r16, r22
  121. size_t n = 0;
  122. 1ae: c0 e0 ldi r28, 0x00 ; 0
  123. 1b0: d0 e0 ldi r29, 0x00 ; 0
  124. while (size--) {
  125. 1b2: ce 15 cp r28, r14
  126. 1b4: df 05 cpc r29, r15
  127. 1b6: 89 f0 breq .+34 ; 0x1da <Print::write(unsigned char const*, unsigned int)+0x42>
  128. if (write(*buffer++)) n++;
  129. 1b8: d8 01 movw r26, r16
  130. 1ba: 6d 91 ld r22, X+
  131. 1bc: 8d 01 movw r16, r26
  132. 1be: d6 01 movw r26, r12
  133. 1c0: ed 91 ld r30, X+
  134. 1c2: fc 91 ld r31, X
  135. 1c4: 01 90 ld r0, Z+
  136. 1c6: f0 81 ld r31, Z
  137. 1c8: e0 2d mov r30, r0
  138. 1ca: c6 01 movw r24, r12
  139. 1cc: 09 95 icall
  140. 1ce: 89 2b or r24, r25
  141. 1d0: 11 f4 brne .+4 ; 0x1d6 <Print::write(unsigned char const*, unsigned int)+0x3e>
  142. 1d2: 7e 01 movw r14, r28
  143. 1d4: 02 c0 rjmp .+4 ; 0x1da <Print::write(unsigned char const*, unsigned int)+0x42>
  144. 1d6: 21 96 adiw r28, 0x01 ; 1
  145. 1d8: ec cf rjmp .-40 ; 0x1b2 <Print::write(unsigned char const*, unsigned int)+0x1a>
  146. else break;
  147. }
  148. return n;
  149. }
  150. 1da: c7 01 movw r24, r14
  151. 1dc: df 91 pop r29
  152. 1de: cf 91 pop r28
  153. 1e0: 1f 91 pop r17
  154. 1e2: 0f 91 pop r16
  155. 1e4: ff 90 pop r15
  156. 1e6: ef 90 pop r14
  157. 1e8: df 90 pop r13
  158. 1ea: cf 90 pop r12
  159. 1ec: 08 95 ret
  160. 000001ee <Print::flush()>:
  161. size_t println(unsigned long, int = DEC);
  162. size_t println(double, int = 2);
  163. size_t println(const Printable&);
  164. size_t println(void);
  165. virtual void flush() { /* Empty implementation for backward compatibility */ }
  166. 1ee: 08 95 ret
  167. 000001f0 <Print::availableForWrite()>:
  168. return write((const uint8_t *)buffer, size);
  169. }
  170. // default to zero, meaning "a single write may block"
  171. // should be overriden by subclasses with buffering
  172. virtual int availableForWrite() { return 0; }
  173. 1f0: 80 e0 ldi r24, 0x00 ; 0
  174. 1f2: 90 e0 ldi r25, 0x00 ; 0
  175. 1f4: 08 95 ret
  176. 000001f6 <HardwareSerial::availableForWrite()>:
  177. {
  178. #if (SERIAL_TX_BUFFER_SIZE>256)
  179. uint8_t oldSREG = SREG;
  180. cli();
  181. #endif
  182. tx_buffer_index_t head = _tx_buffer_head;
  183. 1f6: fc 01 movw r30, r24
  184. 1f8: 53 8d ldd r21, Z+27 ; 0x1b
  185. tx_buffer_index_t tail = _tx_buffer_tail;
  186. 1fa: 44 8d ldd r20, Z+28 ; 0x1c
  187. 1fc: 25 2f mov r18, r21
  188. 1fe: 30 e0 ldi r19, 0x00 ; 0
  189. 200: 84 2f mov r24, r20
  190. 202: 90 e0 ldi r25, 0x00 ; 0
  191. #if (SERIAL_TX_BUFFER_SIZE>256)
  192. SREG = oldSREG;
  193. #endif
  194. if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
  195. 204: 82 1b sub r24, r18
  196. 206: 93 0b sbc r25, r19
  197. 208: 54 17 cp r21, r20
  198. 20a: 10 f0 brcs .+4 ; 0x210 <HardwareSerial::availableForWrite()+0x1a>
  199. 20c: cf 96 adiw r24, 0x3f ; 63
  200. 20e: 08 95 ret
  201. return tail - head - 1;
  202. 210: 01 97 sbiw r24, 0x01 ; 1
  203. }
  204. 212: 08 95 ret
  205. 00000214 <HardwareSerial::read()>:
  206. return _rx_buffer[_rx_buffer_tail];
  207. }
  208. }
  209. int HardwareSerial::read(void)
  210. {
  211. 214: fc 01 movw r30, r24
  212. // if the head isn't ahead of the tail, we don't have any characters
  213. if (_rx_buffer_head == _rx_buffer_tail) {
  214. 216: 91 8d ldd r25, Z+25 ; 0x19
  215. 218: 82 8d ldd r24, Z+26 ; 0x1a
  216. 21a: 98 17 cp r25, r24
  217. 21c: 61 f0 breq .+24 ; 0x236 <HardwareSerial::read()+0x22>
  218. return -1;
  219. } else {
  220. unsigned char c = _rx_buffer[_rx_buffer_tail];
  221. 21e: 82 8d ldd r24, Z+26 ; 0x1a
  222. 220: df 01 movw r26, r30
  223. 222: a8 0f add r26, r24
  224. 224: b1 1d adc r27, r1
  225. 226: 5d 96 adiw r26, 0x1d ; 29
  226. 228: 8c 91 ld r24, X
  227. _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
  228. 22a: 92 8d ldd r25, Z+26 ; 0x1a
  229. 22c: 9f 5f subi r25, 0xFF ; 255
  230. 22e: 9f 73 andi r25, 0x3F ; 63
  231. 230: 92 8f std Z+26, r25 ; 0x1a
  232. return c;
  233. 232: 90 e0 ldi r25, 0x00 ; 0
  234. 234: 08 95 ret
  235. int HardwareSerial::read(void)
  236. {
  237. // if the head isn't ahead of the tail, we don't have any characters
  238. if (_rx_buffer_head == _rx_buffer_tail) {
  239. return -1;
  240. 236: 8f ef ldi r24, 0xFF ; 255
  241. 238: 9f ef ldi r25, 0xFF ; 255
  242. } else {
  243. unsigned char c = _rx_buffer[_rx_buffer_tail];
  244. _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
  245. return c;
  246. }
  247. }
  248. 23a: 08 95 ret
  249. 0000023c <HardwareSerial::peek()>:
  250. {
  251. return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
  252. }
  253. int HardwareSerial::peek(void)
  254. {
  255. 23c: fc 01 movw r30, r24
  256. if (_rx_buffer_head == _rx_buffer_tail) {
  257. 23e: 91 8d ldd r25, Z+25 ; 0x19
  258. 240: 82 8d ldd r24, Z+26 ; 0x1a
  259. 242: 98 17 cp r25, r24
  260. 244: 31 f0 breq .+12 ; 0x252 <HardwareSerial::peek()+0x16>
  261. return -1;
  262. } else {
  263. return _rx_buffer[_rx_buffer_tail];
  264. 246: 82 8d ldd r24, Z+26 ; 0x1a
  265. 248: e8 0f add r30, r24
  266. 24a: f1 1d adc r31, r1
  267. 24c: 85 8d ldd r24, Z+29 ; 0x1d
  268. 24e: 90 e0 ldi r25, 0x00 ; 0
  269. 250: 08 95 ret
  270. }
  271. int HardwareSerial::peek(void)
  272. {
  273. if (_rx_buffer_head == _rx_buffer_tail) {
  274. return -1;
  275. 252: 8f ef ldi r24, 0xFF ; 255
  276. 254: 9f ef ldi r25, 0xFF ; 255
  277. } else {
  278. return _rx_buffer[_rx_buffer_tail];
  279. }
  280. }
  281. 256: 08 95 ret
  282. 00000258 <HardwareSerial::available()>:
  283. // clear any received data
  284. _rx_buffer_head = _rx_buffer_tail;
  285. }
  286. int HardwareSerial::available(void)
  287. {
  288. 258: fc 01 movw r30, r24
  289. return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
  290. 25a: 91 8d ldd r25, Z+25 ; 0x19
  291. 25c: 22 8d ldd r18, Z+26 ; 0x1a
  292. 25e: 89 2f mov r24, r25
  293. 260: 90 e0 ldi r25, 0x00 ; 0
  294. 262: 80 5c subi r24, 0xC0 ; 192
  295. 264: 9f 4f sbci r25, 0xFF ; 255
  296. 266: 82 1b sub r24, r18
  297. 268: 91 09 sbc r25, r1
  298. }
  299. 26a: 8f 73 andi r24, 0x3F ; 63
  300. 26c: 99 27 eor r25, r25
  301. 26e: 08 95 ret
  302. 00000270 <Serial0_available()>:
  303. #endif
  304. // Function that can be weakly referenced by serialEventRun to prevent
  305. // pulling in this file if it's not otherwise used.
  306. bool Serial0_available() {
  307. return Serial.available();
  308. 270: 87 e4 ldi r24, 0x47 ; 71
  309. 272: 91 e0 ldi r25, 0x01 ; 1
  310. 274: 0e 94 2c 01 call 0x258 ; 0x258 <HardwareSerial::available()>
  311. 278: 21 e0 ldi r18, 0x01 ; 1
  312. 27a: 89 2b or r24, r25
  313. 27c: 09 f4 brne .+2 ; 0x280 <Serial0_available()+0x10>
  314. 27e: 20 e0 ldi r18, 0x00 ; 0
  315. }
  316. 280: 82 2f mov r24, r18
  317. 282: 08 95 ret
  318. 00000284 <HardwareSerial::_tx_udr_empty_irq()>:
  319. }
  320. // Actual interrupt handlers //////////////////////////////////////////////////////////////
  321. void HardwareSerial::_tx_udr_empty_irq(void)
  322. {
  323. 284: fc 01 movw r30, r24
  324. // If interrupts are enabled, there must be more data in the output
  325. // buffer. Send the next byte
  326. unsigned char c = _tx_buffer[_tx_buffer_tail];
  327. 286: 84 8d ldd r24, Z+28 ; 0x1c
  328. 288: df 01 movw r26, r30
  329. 28a: a8 0f add r26, r24
  330. 28c: b1 1d adc r27, r1
  331. 28e: a3 5a subi r26, 0xA3 ; 163
  332. 290: bf 4f sbci r27, 0xFF ; 255
  333. 292: 2c 91 ld r18, X
  334. _tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_TX_BUFFER_SIZE;
  335. 294: 84 8d ldd r24, Z+28 ; 0x1c
  336. 296: 90 e0 ldi r25, 0x00 ; 0
  337. 298: 01 96 adiw r24, 0x01 ; 1
  338. 29a: 8f 73 andi r24, 0x3F ; 63
  339. 29c: 99 27 eor r25, r25
  340. 29e: 84 8f std Z+28, r24 ; 0x1c
  341. *_udr = c;
  342. 2a0: a6 89 ldd r26, Z+22 ; 0x16
  343. 2a2: b7 89 ldd r27, Z+23 ; 0x17
  344. 2a4: 2c 93 st X, r18
  345. // clear the TXC bit -- "can be cleared by writing a one to its bit
  346. // location". This makes sure flush() won't return until the bytes
  347. // actually got written
  348. sbi(*_ucsra, TXC0);
  349. 2a6: a0 89 ldd r26, Z+16 ; 0x10
  350. 2a8: b1 89 ldd r27, Z+17 ; 0x11
  351. 2aa: 8c 91 ld r24, X
  352. 2ac: 80 64 ori r24, 0x40 ; 64
  353. 2ae: 8c 93 st X, r24
  354. if (_tx_buffer_head == _tx_buffer_tail) {
  355. 2b0: 93 8d ldd r25, Z+27 ; 0x1b
  356. 2b2: 84 8d ldd r24, Z+28 ; 0x1c
  357. 2b4: 98 13 cpse r25, r24
  358. 2b6: 06 c0 rjmp .+12 ; 0x2c4 <HardwareSerial::_tx_udr_empty_irq()+0x40>
  359. // Buffer empty, so disable interrupts
  360. cbi(*_ucsrb, UDRIE0);
  361. 2b8: 02 88 ldd r0, Z+18 ; 0x12
  362. 2ba: f3 89 ldd r31, Z+19 ; 0x13
  363. 2bc: e0 2d mov r30, r0
  364. 2be: 80 81 ld r24, Z
  365. 2c0: 8f 7d andi r24, 0xDF ; 223
  366. 2c2: 80 83 st Z, r24
  367. 2c4: 08 95 ret
  368. 000002c6 <HardwareSerial::write(unsigned char)>:
  369. // If we get here, nothing is queued anymore (DRIE is disabled) and
  370. // the hardware finished tranmission (TXC is set).
  371. }
  372. size_t HardwareSerial::write(uint8_t c)
  373. {
  374. 2c6: ef 92 push r14
  375. 2c8: ff 92 push r15
  376. 2ca: 0f 93 push r16
  377. 2cc: 1f 93 push r17
  378. 2ce: cf 93 push r28
  379. 2d0: df 93 push r29
  380. 2d2: ec 01 movw r28, r24
  381. _written = true;
  382. 2d4: 81 e0 ldi r24, 0x01 ; 1
  383. 2d6: 88 8f std Y+24, r24 ; 0x18
  384. // If the buffer and the data register is empty, just write the byte
  385. // to the data register and be done. This shortcut helps
  386. // significantly improve the effective datarate at high (>
  387. // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown.
  388. if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
  389. 2d8: 9b 8d ldd r25, Y+27 ; 0x1b
  390. 2da: 8c 8d ldd r24, Y+28 ; 0x1c
  391. 2dc: 98 13 cpse r25, r24
  392. 2de: 05 c0 rjmp .+10 ; 0x2ea <HardwareSerial::write(unsigned char)+0x24>
  393. 2e0: e8 89 ldd r30, Y+16 ; 0x10
  394. 2e2: f9 89 ldd r31, Y+17 ; 0x11
  395. 2e4: 80 81 ld r24, Z
  396. 2e6: 85 fd sbrc r24, 5
  397. 2e8: 24 c0 rjmp .+72 ; 0x332 <HardwareSerial::write(unsigned char)+0x6c>
  398. 2ea: f6 2e mov r15, r22
  399. *_udr = c;
  400. sbi(*_ucsra, TXC0);
  401. return 1;
  402. }
  403. tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE;
  404. 2ec: 0b 8d ldd r16, Y+27 ; 0x1b
  405. 2ee: 10 e0 ldi r17, 0x00 ; 0
  406. 2f0: 0f 5f subi r16, 0xFF ; 255
  407. 2f2: 1f 4f sbci r17, 0xFF ; 255
  408. 2f4: 0f 73 andi r16, 0x3F ; 63
  409. 2f6: 11 27 eor r17, r17
  410. 2f8: e0 2e mov r14, r16
  411. // If the output buffer is full, there's nothing for it other than to
  412. // wait for the interrupt handler to empty it a bit
  413. while (i == _tx_buffer_tail) {
  414. 2fa: 8c 8d ldd r24, Y+28 ; 0x1c
  415. 2fc: e8 12 cpse r14, r24
  416. 2fe: 0c c0 rjmp .+24 ; 0x318 <HardwareSerial::write(unsigned char)+0x52>
  417. if (bit_is_clear(SREG, SREG_I)) {
  418. 300: 0f b6 in r0, 0x3f ; 63
  419. 302: 07 fc sbrc r0, 7
  420. 304: fa cf rjmp .-12 ; 0x2fa <HardwareSerial::write(unsigned char)+0x34>
  421. // Interrupts are disabled, so we'll have to poll the data
  422. // register empty flag ourselves. If it is set, pretend an
  423. // interrupt has happened and call the handler to free up
  424. // space for us.
  425. if(bit_is_set(*_ucsra, UDRE0))
  426. 306: e8 89 ldd r30, Y+16 ; 0x10
  427. 308: f9 89 ldd r31, Y+17 ; 0x11
  428. 30a: 80 81 ld r24, Z
  429. 30c: 85 ff sbrs r24, 5
  430. 30e: f5 cf rjmp .-22 ; 0x2fa <HardwareSerial::write(unsigned char)+0x34>
  431. _tx_udr_empty_irq();
  432. 310: ce 01 movw r24, r28
  433. 312: 0e 94 42 01 call 0x284 ; 0x284 <HardwareSerial::_tx_udr_empty_irq()>
  434. 316: f1 cf rjmp .-30 ; 0x2fa <HardwareSerial::write(unsigned char)+0x34>
  435. } else {
  436. // nop, the interrupt handler will free up space for us
  437. }
  438. }
  439. _tx_buffer[_tx_buffer_head] = c;
  440. 318: 8b 8d ldd r24, Y+27 ; 0x1b
  441. 31a: fe 01 movw r30, r28
  442. 31c: e8 0f add r30, r24
  443. 31e: f1 1d adc r31, r1
  444. 320: e3 5a subi r30, 0xA3 ; 163
  445. 322: ff 4f sbci r31, 0xFF ; 255
  446. 324: f0 82 st Z, r15
  447. _tx_buffer_head = i;
  448. 326: 0b 8f std Y+27, r16 ; 0x1b
  449. sbi(*_ucsrb, UDRIE0);
  450. 328: ea 89 ldd r30, Y+18 ; 0x12
  451. 32a: fb 89 ldd r31, Y+19 ; 0x13
  452. 32c: 80 81 ld r24, Z
  453. 32e: 80 62 ori r24, 0x20 ; 32
  454. 330: 07 c0 rjmp .+14 ; 0x340 <HardwareSerial::write(unsigned char)+0x7a>
  455. // If the buffer and the data register is empty, just write the byte
  456. // to the data register and be done. This shortcut helps
  457. // significantly improve the effective datarate at high (>
  458. // 500kbit/s) bitrates, where interrupt overhead becomes a slowdown.
  459. if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
  460. *_udr = c;
  461. 332: ee 89 ldd r30, Y+22 ; 0x16
  462. 334: ff 89 ldd r31, Y+23 ; 0x17
  463. 336: 60 83 st Z, r22
  464. sbi(*_ucsra, TXC0);
  465. 338: e8 89 ldd r30, Y+16 ; 0x10
  466. 33a: f9 89 ldd r31, Y+17 ; 0x11
  467. 33c: 80 81 ld r24, Z
  468. 33e: 80 64 ori r24, 0x40 ; 64
  469. 340: 80 83 st Z, r24
  470. _tx_buffer_head = i;
  471. sbi(*_ucsrb, UDRIE0);
  472. return 1;
  473. }
  474. 342: 81 e0 ldi r24, 0x01 ; 1
  475. 344: 90 e0 ldi r25, 0x00 ; 0
  476. 346: df 91 pop r29
  477. 348: cf 91 pop r28
  478. 34a: 1f 91 pop r17
  479. 34c: 0f 91 pop r16
  480. 34e: ff 90 pop r15
  481. 350: ef 90 pop r14
  482. 352: 08 95 ret
  483. 00000354 <HardwareSerial::flush()>:
  484. if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
  485. return tail - head - 1;
  486. }
  487. void HardwareSerial::flush()
  488. {
  489. 354: cf 93 push r28
  490. 356: df 93 push r29
  491. 358: ec 01 movw r28, r24
  492. // If we have never written a byte, no need to flush. This special
  493. // case is needed since there is no way to force the TXC (transmit
  494. // complete) bit to 1 during initialization
  495. if (!_written)
  496. 35a: 88 8d ldd r24, Y+24 ; 0x18
  497. 35c: 88 23 and r24, r24
  498. 35e: c9 f0 breq .+50 ; 0x392 <HardwareSerial::flush()+0x3e>
  499. return;
  500. while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
  501. 360: ea 89 ldd r30, Y+18 ; 0x12
  502. 362: fb 89 ldd r31, Y+19 ; 0x13
  503. 364: 80 81 ld r24, Z
  504. 366: 85 fd sbrc r24, 5
  505. 368: 05 c0 rjmp .+10 ; 0x374 <HardwareSerial::flush()+0x20>
  506. 36a: a8 89 ldd r26, Y+16 ; 0x10
  507. 36c: b9 89 ldd r27, Y+17 ; 0x11
  508. 36e: 8c 91 ld r24, X
  509. 370: 86 fd sbrc r24, 6
  510. 372: 0f c0 rjmp .+30 ; 0x392 <HardwareSerial::flush()+0x3e>
  511. if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
  512. 374: 0f b6 in r0, 0x3f ; 63
  513. 376: 07 fc sbrc r0, 7
  514. 378: f5 cf rjmp .-22 ; 0x364 <HardwareSerial::flush()+0x10>
  515. 37a: 80 81 ld r24, Z
  516. 37c: 85 ff sbrs r24, 5
  517. 37e: f2 cf rjmp .-28 ; 0x364 <HardwareSerial::flush()+0x10>
  518. // Interrupts are globally disabled, but the DR empty
  519. // interrupt should be enabled, so poll the DR empty flag to
  520. // prevent deadlock
  521. if (bit_is_set(*_ucsra, UDRE0))
  522. 380: a8 89 ldd r26, Y+16 ; 0x10
  523. 382: b9 89 ldd r27, Y+17 ; 0x11
  524. 384: 8c 91 ld r24, X
  525. 386: 85 ff sbrs r24, 5
  526. 388: ed cf rjmp .-38 ; 0x364 <HardwareSerial::flush()+0x10>
  527. _tx_udr_empty_irq();
  528. 38a: ce 01 movw r24, r28
  529. 38c: 0e 94 42 01 call 0x284 ; 0x284 <HardwareSerial::_tx_udr_empty_irq()>
  530. 390: e7 cf rjmp .-50 ; 0x360 <HardwareSerial::flush()+0xc>
  531. }
  532. // If we get here, nothing is queued anymore (DRIE is disabled) and
  533. // the hardware finished tranmission (TXC is set).
  534. }
  535. 392: df 91 pop r29
  536. 394: cf 91 pop r28
  537. 396: 08 95 ret
  538. 00000398 <serialEventRun()>:
  539. #endif
  540. void serialEventRun(void)
  541. {
  542. #if defined(HAVE_HWSERIAL0)
  543. if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
  544. 398: 80 e0 ldi r24, 0x00 ; 0
  545. 39a: 90 e0 ldi r25, 0x00 ; 0
  546. 39c: 89 2b or r24, r25
  547. 39e: 29 f0 breq .+10 ; 0x3aa <serialEventRun()+0x12>
  548. 3a0: 0e 94 38 01 call 0x270 ; 0x270 <Serial0_available()>
  549. 3a4: 81 11 cpse r24, r1
  550. 3a6: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
  551. 3aa: 08 95 ret
  552. 000003ac <turnOffPWM>:
  553. //
  554. //static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
  555. //static inline void turnOffPWM(uint8_t timer)
  556. static void turnOffPWM(uint8_t timer)
  557. {
  558. switch (timer)
  559. 3ac: 83 30 cpi r24, 0x03 ; 3
  560. 3ae: 81 f0 breq .+32 ; 0x3d0 <turnOffPWM+0x24>
  561. 3b0: 28 f4 brcc .+10 ; 0x3bc <turnOffPWM+0x10>
  562. 3b2: 81 30 cpi r24, 0x01 ; 1
  563. 3b4: 99 f0 breq .+38 ; 0x3dc <turnOffPWM+0x30>
  564. 3b6: 82 30 cpi r24, 0x02 ; 2
  565. 3b8: a1 f0 breq .+40 ; 0x3e2 <turnOffPWM+0x36>
  566. 3ba: 08 95 ret
  567. 3bc: 87 30 cpi r24, 0x07 ; 7
  568. 3be: a9 f0 breq .+42 ; 0x3ea <turnOffPWM+0x3e>
  569. 3c0: 88 30 cpi r24, 0x08 ; 8
  570. 3c2: b9 f0 breq .+46 ; 0x3f2 <turnOffPWM+0x46>
  571. 3c4: 84 30 cpi r24, 0x04 ; 4
  572. 3c6: d1 f4 brne .+52 ; 0x3fc <turnOffPWM+0x50>
  573. {
  574. #if defined(TCCR1A) && defined(COM1A1)
  575. case TIMER1A: cbi(TCCR1A, COM1A1); break;
  576. #endif
  577. #if defined(TCCR1A) && defined(COM1B1)
  578. case TIMER1B: cbi(TCCR1A, COM1B1); break;
  579. 3c8: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
  580. 3cc: 8f 7d andi r24, 0xDF ; 223
  581. 3ce: 03 c0 rjmp .+6 ; 0x3d6 <turnOffPWM+0x2a>
  582. static void turnOffPWM(uint8_t timer)
  583. {
  584. switch (timer)
  585. {
  586. #if defined(TCCR1A) && defined(COM1A1)
  587. case TIMER1A: cbi(TCCR1A, COM1A1); break;
  588. 3d0: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
  589. 3d4: 8f 77 andi r24, 0x7F ; 127
  590. #endif
  591. #if defined(TCCR1A) && defined(COM1B1)
  592. case TIMER1B: cbi(TCCR1A, COM1B1); break;
  593. 3d6: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
  594. 3da: 08 95 ret
  595. #if defined(TCCR2) && defined(COM21)
  596. case TIMER2: cbi(TCCR2, COM21); break;
  597. #endif
  598. #if defined(TCCR0A) && defined(COM0A1)
  599. case TIMER0A: cbi(TCCR0A, COM0A1); break;
  600. 3dc: 84 b5 in r24, 0x24 ; 36
  601. 3de: 8f 77 andi r24, 0x7F ; 127
  602. 3e0: 02 c0 rjmp .+4 ; 0x3e6 <turnOffPWM+0x3a>
  603. #endif
  604. #if defined(TCCR0A) && defined(COM0B1)
  605. case TIMER0B: cbi(TCCR0A, COM0B1); break;
  606. 3e2: 84 b5 in r24, 0x24 ; 36
  607. 3e4: 8f 7d andi r24, 0xDF ; 223
  608. 3e6: 84 bd out 0x24, r24 ; 36
  609. 3e8: 08 95 ret
  610. #endif
  611. #if defined(TCCR2A) && defined(COM2A1)
  612. case TIMER2A: cbi(TCCR2A, COM2A1); break;
  613. 3ea: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
  614. 3ee: 8f 77 andi r24, 0x7F ; 127
  615. 3f0: 03 c0 rjmp .+6 ; 0x3f8 <turnOffPWM+0x4c>
  616. #endif
  617. #if defined(TCCR2A) && defined(COM2B1)
  618. case TIMER2B: cbi(TCCR2A, COM2B1); break;
  619. 3f2: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
  620. 3f6: 8f 7d andi r24, 0xDF ; 223
  621. 3f8: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
  622. 3fc: 08 95 ret
  623. 000003fe <digitalRead>:
  624. SREG = oldSREG;
  625. }
  626. int digitalRead(uint8_t pin)
  627. {
  628. 3fe: cf 93 push r28
  629. 400: df 93 push r29
  630. uint8_t timer = digitalPinToTimer(pin);
  631. 402: 28 2f mov r18, r24
  632. 404: 30 e0 ldi r19, 0x00 ; 0
  633. 406: f9 01 movw r30, r18
  634. 408: e2 55 subi r30, 0x52 ; 82
  635. 40a: ff 4f sbci r31, 0xFF ; 255
  636. 40c: 84 91 lpm r24, Z
  637. uint8_t bit = digitalPinToBitMask(pin);
  638. 40e: f9 01 movw r30, r18
  639. 410: e6 56 subi r30, 0x66 ; 102
  640. 412: ff 4f sbci r31, 0xFF ; 255
  641. 414: d4 91 lpm r29, Z
  642. uint8_t port = digitalPinToPort(pin);
  643. 416: f9 01 movw r30, r18
  644. 418: ea 57 subi r30, 0x7A ; 122
  645. 41a: ff 4f sbci r31, 0xFF ; 255
  646. 41c: c4 91 lpm r28, Z
  647. if (port == NOT_A_PIN) return LOW;
  648. 41e: cc 23 and r28, r28
  649. 420: 91 f0 breq .+36 ; 0x446 <__LOCK_REGION_LENGTH__+0x46>
  650. // If the pin that support PWM output, we need to turn it off
  651. // before getting a digital reading.
  652. if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  653. 422: 81 11 cpse r24, r1
  654. 424: 0e 94 d6 01 call 0x3ac ; 0x3ac <turnOffPWM>
  655. if (*portInputRegister(port) & bit) return HIGH;
  656. 428: ec 2f mov r30, r28
  657. 42a: f0 e0 ldi r31, 0x00 ; 0
  658. 42c: ee 0f add r30, r30
  659. 42e: ff 1f adc r31, r31
  660. 430: e4 58 subi r30, 0x84 ; 132
  661. 432: ff 4f sbci r31, 0xFF ; 255
  662. 434: a5 91 lpm r26, Z+
  663. 436: b4 91 lpm r27, Z
  664. 438: ec 91 ld r30, X
  665. 43a: ed 23 and r30, r29
  666. 43c: 81 e0 ldi r24, 0x01 ; 1
  667. 43e: 90 e0 ldi r25, 0x00 ; 0
  668. 440: 21 f4 brne .+8 ; 0x44a <__LOCK_REGION_LENGTH__+0x4a>
  669. 442: 80 e0 ldi r24, 0x00 ; 0
  670. 444: 02 c0 rjmp .+4 ; 0x44a <__LOCK_REGION_LENGTH__+0x4a>
  671. {
  672. uint8_t timer = digitalPinToTimer(pin);
  673. uint8_t bit = digitalPinToBitMask(pin);
  674. uint8_t port = digitalPinToPort(pin);
  675. if (port == NOT_A_PIN) return LOW;
  676. 446: 80 e0 ldi r24, 0x00 ; 0
  677. 448: 90 e0 ldi r25, 0x00 ; 0
  678. // before getting a digital reading.
  679. if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  680. if (*portInputRegister(port) & bit) return HIGH;
  681. return LOW;
  682. }
  683. 44a: df 91 pop r29
  684. 44c: cf 91 pop r28
  685. 44e: 08 95 ret
  686. 00000450 <digitalWrite>:
  687. #endif
  688. }
  689. }
  690. void digitalWrite(uint8_t pin, uint8_t val)
  691. {
  692. 450: 1f 93 push r17
  693. 452: cf 93 push r28
  694. 454: df 93 push r29
  695. uint8_t timer = digitalPinToTimer(pin);
  696. 456: 28 2f mov r18, r24
  697. 458: 30 e0 ldi r19, 0x00 ; 0
  698. 45a: f9 01 movw r30, r18
  699. 45c: e2 55 subi r30, 0x52 ; 82
  700. 45e: ff 4f sbci r31, 0xFF ; 255
  701. 460: 84 91 lpm r24, Z
  702. uint8_t bit = digitalPinToBitMask(pin);
  703. 462: f9 01 movw r30, r18
  704. 464: e6 56 subi r30, 0x66 ; 102
  705. 466: ff 4f sbci r31, 0xFF ; 255
  706. 468: d4 91 lpm r29, Z
  707. uint8_t port = digitalPinToPort(pin);
  708. 46a: f9 01 movw r30, r18
  709. 46c: ea 57 subi r30, 0x7A ; 122
  710. 46e: ff 4f sbci r31, 0xFF ; 255
  711. 470: c4 91 lpm r28, Z
  712. volatile uint8_t *out;
  713. if (port == NOT_A_PIN) return;
  714. 472: cc 23 and r28, r28
  715. 474: c9 f0 breq .+50 ; 0x4a8 <digitalWrite+0x58>
  716. 476: 16 2f mov r17, r22
  717. // If the pin that support PWM output, we need to turn it off
  718. // before doing a digital write.
  719. if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  720. 478: 81 11 cpse r24, r1
  721. 47a: 0e 94 d6 01 call 0x3ac ; 0x3ac <turnOffPWM>
  722. out = portOutputRegister(port);
  723. 47e: ec 2f mov r30, r28
  724. 480: f0 e0 ldi r31, 0x00 ; 0
  725. 482: ee 0f add r30, r30
  726. 484: ff 1f adc r31, r31
  727. 486: ee 58 subi r30, 0x8E ; 142
  728. 488: ff 4f sbci r31, 0xFF ; 255
  729. 48a: a5 91 lpm r26, Z+
  730. 48c: b4 91 lpm r27, Z
  731. uint8_t oldSREG = SREG;
  732. 48e: 8f b7 in r24, 0x3f ; 63
  733. cli();
  734. 490: f8 94 cli
  735. if (val == LOW) {
  736. 492: 11 11 cpse r17, r1
  737. 494: 05 c0 rjmp .+10 ; 0x4a0 <digitalWrite+0x50>
  738. *out &= ~bit;
  739. 496: 9c 91 ld r25, X
  740. 498: ed 2f mov r30, r29
  741. 49a: e0 95 com r30
  742. 49c: e9 23 and r30, r25
  743. 49e: 02 c0 rjmp .+4 ; 0x4a4 <digitalWrite+0x54>
  744. } else {
  745. *out |= bit;
  746. 4a0: ec 91 ld r30, X
  747. 4a2: ed 2b or r30, r29
  748. 4a4: ec 93 st X, r30
  749. }
  750. SREG = oldSREG;
  751. 4a6: 8f bf out 0x3f, r24 ; 63
  752. }
  753. 4a8: df 91 pop r29
  754. 4aa: cf 91 pop r28
  755. 4ac: 1f 91 pop r17
  756. 4ae: 08 95 ret
  757. 000004b0 <pinMode>:
  758. #define ARDUINO_MAIN
  759. #include "wiring_private.h"
  760. #include "pins_arduino.h"
  761. void pinMode(uint8_t pin, uint8_t mode)
  762. {
  763. 4b0: cf 93 push r28
  764. 4b2: df 93 push r29
  765. uint8_t bit = digitalPinToBitMask(pin);
  766. 4b4: 90 e0 ldi r25, 0x00 ; 0
  767. 4b6: fc 01 movw r30, r24
  768. 4b8: e6 56 subi r30, 0x66 ; 102
  769. 4ba: ff 4f sbci r31, 0xFF ; 255
  770. 4bc: 24 91 lpm r18, Z
  771. uint8_t port = digitalPinToPort(pin);
  772. 4be: fc 01 movw r30, r24
  773. 4c0: ea 57 subi r30, 0x7A ; 122
  774. 4c2: ff 4f sbci r31, 0xFF ; 255
  775. 4c4: 84 91 lpm r24, Z
  776. volatile uint8_t *reg, *out;
  777. if (port == NOT_A_PIN) return;
  778. 4c6: 88 23 and r24, r24
  779. 4c8: 61 f1 breq .+88 ; 0x522 <pinMode+0x72>
  780. // JWS: can I let the optimizer do this?
  781. reg = portModeRegister(port);
  782. 4ca: 90 e0 ldi r25, 0x00 ; 0
  783. 4cc: 88 0f add r24, r24
  784. 4ce: 99 1f adc r25, r25
  785. 4d0: fc 01 movw r30, r24
  786. 4d2: e8 59 subi r30, 0x98 ; 152
  787. 4d4: ff 4f sbci r31, 0xFF ; 255
  788. 4d6: c5 91 lpm r28, Z+
  789. 4d8: d4 91 lpm r29, Z
  790. out = portOutputRegister(port);
  791. 4da: fc 01 movw r30, r24
  792. 4dc: ee 58 subi r30, 0x8E ; 142
  793. 4de: ff 4f sbci r31, 0xFF ; 255
  794. 4e0: a5 91 lpm r26, Z+
  795. 4e2: b4 91 lpm r27, Z
  796. if (mode == INPUT) {
  797. 4e4: 61 11 cpse r22, r1
  798. 4e6: 09 c0 rjmp .+18 ; 0x4fa <pinMode+0x4a>
  799. uint8_t oldSREG = SREG;
  800. 4e8: 9f b7 in r25, 0x3f ; 63
  801. cli();
  802. 4ea: f8 94 cli
  803. *reg &= ~bit;
  804. 4ec: 88 81 ld r24, Y
  805. 4ee: 20 95 com r18
  806. 4f0: 82 23 and r24, r18
  807. 4f2: 88 83 st Y, r24
  808. *out &= ~bit;
  809. 4f4: ec 91 ld r30, X
  810. 4f6: 2e 23 and r18, r30
  811. 4f8: 0b c0 rjmp .+22 ; 0x510 <pinMode+0x60>
  812. SREG = oldSREG;
  813. } else if (mode == INPUT_PULLUP) {
  814. 4fa: 62 30 cpi r22, 0x02 ; 2
  815. 4fc: 61 f4 brne .+24 ; 0x516 <pinMode+0x66>
  816. uint8_t oldSREG = SREG;
  817. 4fe: 9f b7 in r25, 0x3f ; 63
  818. cli();
  819. 500: f8 94 cli
  820. *reg &= ~bit;
  821. 502: 38 81 ld r19, Y
  822. 504: 82 2f mov r24, r18
  823. 506: 80 95 com r24
  824. 508: 83 23 and r24, r19
  825. 50a: 88 83 st Y, r24
  826. *out |= bit;
  827. 50c: ec 91 ld r30, X
  828. 50e: 2e 2b or r18, r30
  829. 510: 2c 93 st X, r18
  830. SREG = oldSREG;
  831. 512: 9f bf out 0x3f, r25 ; 63
  832. 514: 06 c0 rjmp .+12 ; 0x522 <pinMode+0x72>
  833. } else {
  834. uint8_t oldSREG = SREG;
  835. 516: 8f b7 in r24, 0x3f ; 63
  836. cli();
  837. 518: f8 94 cli
  838. *reg |= bit;
  839. 51a: e8 81 ld r30, Y
  840. 51c: 2e 2b or r18, r30
  841. 51e: 28 83 st Y, r18
  842. SREG = oldSREG;
  843. 520: 8f bf out 0x3f, r24 ; 63
  844. }
  845. }
  846. 522: df 91 pop r29
  847. 524: cf 91 pop r28
  848. 526: 08 95 ret
  849. 00000528 <micros>:
  850. return m;
  851. }
  852. unsigned long micros() {
  853. unsigned long m;
  854. uint8_t oldSREG = SREG, t;
  855. 528: 3f b7 in r19, 0x3f ; 63
  856. cli();
  857. 52a: f8 94 cli
  858. m = timer0_overflow_count;
  859. 52c: 80 91 1d 01 lds r24, 0x011D ; 0x80011d <timer0_overflow_count>
  860. 530: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <timer0_overflow_count+0x1>
  861. 534: a0 91 1f 01 lds r26, 0x011F ; 0x80011f <timer0_overflow_count+0x2>
  862. 538: b0 91 20 01 lds r27, 0x0120 ; 0x800120 <timer0_overflow_count+0x3>
  863. #if defined(TCNT0)
  864. t = TCNT0;
  865. 53c: 26 b5 in r18, 0x26 ; 38
  866. #else
  867. #error TIMER 0 not defined
  868. #endif
  869. #ifdef TIFR0
  870. if ((TIFR0 & _BV(TOV0)) && (t < 255))
  871. 53e: a8 9b sbis 0x15, 0 ; 21
  872. 540: 05 c0 rjmp .+10 ; 0x54c <micros+0x24>
  873. 542: 2f 3f cpi r18, 0xFF ; 255
  874. 544: 19 f0 breq .+6 ; 0x54c <micros+0x24>
  875. m++;
  876. 546: 01 96 adiw r24, 0x01 ; 1
  877. 548: a1 1d adc r26, r1
  878. 54a: b1 1d adc r27, r1
  879. #else
  880. if ((TIFR & _BV(TOV0)) && (t < 255))
  881. m++;
  882. #endif
  883. SREG = oldSREG;
  884. 54c: 3f bf out 0x3f, r19 ; 63
  885. return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
  886. 54e: ba 2f mov r27, r26
  887. 550: a9 2f mov r26, r25
  888. 552: 98 2f mov r25, r24
  889. 554: 88 27 eor r24, r24
  890. 556: 82 0f add r24, r18
  891. 558: 91 1d adc r25, r1
  892. 55a: a1 1d adc r26, r1
  893. 55c: b1 1d adc r27, r1
  894. 55e: bc 01 movw r22, r24
  895. 560: cd 01 movw r24, r26
  896. 562: 42 e0 ldi r20, 0x02 ; 2
  897. 564: 66 0f add r22, r22
  898. 566: 77 1f adc r23, r23
  899. 568: 88 1f adc r24, r24
  900. 56a: 99 1f adc r25, r25
  901. 56c: 4a 95 dec r20
  902. 56e: d1 f7 brne .-12 ; 0x564 <micros+0x3c>
  903. }
  904. 570: 08 95 ret
  905. 00000572 <checkCLKandBIN()>:
  906. //sample on falling edge (middle of bit)
  907. }
  908. void checkCLKandBIN(void){
  909. 572: 0f 93 push r16
  910. 574: 1f 93 push r17
  911. 576: cf 93 push r28
  912. 578: df 93 push r29
  913. #endif
  914. // busy wait
  915. __asm__ __volatile__ (
  916. 57a: 03 e2 ldi r16, 0x23 ; 35
  917. 57c: 10 e0 ldi r17, 0x00 ; 0
  918. * clk++
  919. * sample hzbinary
  920. * while clk low do nothing
  921. */
  922. //milliscompare = millis();
  923. while((hzclkval = digitalRead(hzclk)) == HIGH){
  924. 57e: 87 e0 ldi r24, 0x07 ; 7
  925. 580: 0e 94 ff 01 call 0x3fe ; 0x3fe <digitalRead>
  926. 584: d8 2f mov r29, r24
  927. 586: 80 93 16 01 sts 0x0116, r24 ; 0x800116 <__data_end>
  928. 58a: 81 30 cpi r24, 0x01 ; 1
  929. 58c: b9 f4 brne .+46 ; 0x5bc <checkCLKandBIN()+0x4a>
  930. if(readyet == 0){
  931. 58e: 80 91 17 01 lds r24, 0x0117 ; 0x800117 <readyet>
  932. 592: 81 11 cpse r24, r1
  933. 594: 0f c0 rjmp .+30 ; 0x5b4 <checkCLKandBIN()+0x42>
  934. hzbinval[clkval] = digitalRead(hzbinary);
  935. 596: c0 91 46 01 lds r28, 0x0146 ; 0x800146 <clkval>
  936. 59a: 86 e0 ldi r24, 0x06 ; 6
  937. 59c: 0e 94 ff 01 call 0x3fe ; 0x3fe <digitalRead>
  938. 5a0: ec 2f mov r30, r28
  939. 5a2: f0 e0 ldi r31, 0x00 ; 0
  940. 5a4: ed 5d subi r30, 0xDD ; 221
  941. 5a6: fe 4f sbci r31, 0xFE ; 254
  942. 5a8: 80 83 st Z, r24
  943. clkval++;
  944. 5aa: cf 5f subi r28, 0xFF ; 255
  945. 5ac: c0 93 46 01 sts 0x0146, r28 ; 0x800146 <clkval>
  946. readyet = 1;
  947. 5b0: d0 93 17 01 sts 0x0117, r29 ; 0x800117 <readyet>
  948. 5b4: c8 01 movw r24, r16
  949. 5b6: 01 97 sbiw r24, 0x01 ; 1
  950. 5b8: f1 f7 brne .-4 ; 0x5b6 <checkCLKandBIN()+0x44>
  951. 5ba: e1 cf rjmp .-62 ; 0x57e <checkCLKandBIN()+0xc>
  952. }
  953. delayMicroseconds(10);
  954. }
  955. while((hzclkval = digitalRead(hzclk)) == LOW){
  956. 5bc: 87 e0 ldi r24, 0x07 ; 7
  957. 5be: 0e 94 ff 01 call 0x3fe ; 0x3fe <digitalRead>
  958. 5c2: 80 93 16 01 sts 0x0116, r24 ; 0x800116 <__data_end>
  959. 5c6: 81 11 cpse r24, r1
  960. 5c8: 03 c0 rjmp .+6 ; 0x5d0 <checkCLKandBIN()+0x5e>
  961. delayMicroseconds(1);
  962. readyet = 0;
  963. 5ca: 10 92 17 01 sts 0x0117, r1 ; 0x800117 <readyet>
  964. 5ce: f6 cf rjmp .-20 ; 0x5bc <checkCLKandBIN()+0x4a>
  965. //would be nice to add a picture to this source code (waveform)
  966. //or oscope picture
  967. //why isn't this possible?
  968. }
  969. 5d0: df 91 pop r29
  970. 5d2: cf 91 pop r28
  971. 5d4: 1f 91 pop r17
  972. 5d6: 0f 91 pop r16
  973. 5d8: 08 95 ret
  974. 000005da <LedControl::spiTransfer(int, unsigned char, unsigned char)>:
  975. v|=B10000000;
  976. status[offset+digit]=v;
  977. spiTransfer(addr, digit+1,v);
  978. }
  979. void LedControl::spiTransfer(int addr, volatile byte opcode, volatile byte data) {
  980. 5da: 2f 92 push r2
  981. 5dc: 3f 92 push r3
  982. 5de: 4f 92 push r4
  983. 5e0: 5f 92 push r5
  984. 5e2: 6f 92 push r6
  985. 5e4: 7f 92 push r7
  986. 5e6: 8f 92 push r8
  987. 5e8: 9f 92 push r9
  988. 5ea: af 92 push r10
  989. 5ec: bf 92 push r11
  990. 5ee: cf 92 push r12
  991. 5f0: df 92 push r13
  992. 5f2: ef 92 push r14
  993. 5f4: ff 92 push r15
  994. 5f6: 0f 93 push r16
  995. 5f8: 1f 93 push r17
  996. 5fa: cf 93 push r28
  997. 5fc: df 93 push r29
  998. 5fe: 00 d0 rcall .+0 ; 0x600 <LedControl::spiTransfer(int, unsigned char, unsigned char)+0x26>
  999. 600: cd b7 in r28, 0x3d ; 61
  1000. 602: de b7 in r29, 0x3e ; 62
  1001. 604: 8c 01 movw r16, r24
  1002. 606: 49 83 std Y+1, r20 ; 0x01
  1003. 608: 2a 83 std Y+2, r18 ; 0x02
  1004. //Create an array with the data to shift out
  1005. int offset=addr*2;
  1006. 60a: 66 0f add r22, r22
  1007. 60c: 77 1f adc r23, r23
  1008. int maxbytes=maxDevices*2;
  1009. 60e: f8 01 movw r30, r16
  1010. 610: ea 5a subi r30, 0xAA ; 170
  1011. 612: ff 4f sbci r31, 0xFF ; 255
  1012. 614: e0 80 ld r14, Z
  1013. 616: f1 80 ldd r15, Z+1 ; 0x01
  1014. 618: ee 0c add r14, r14
  1015. 61a: ff 1c adc r15, r15
  1016. 61c: f8 01 movw r30, r16
  1017. 61e: cf 01 movw r24, r30
  1018. 620: 80 1b sub r24, r16
  1019. 622: 91 0b sbc r25, r17
  1020. for(int i=0;i<maxbytes;i++)
  1021. 624: 8e 15 cp r24, r14
  1022. 626: 9f 05 cpc r25, r15
  1023. 628: 14 f4 brge .+4 ; 0x62e <LedControl::spiTransfer(int, unsigned char, unsigned char)+0x54>
  1024. spidata[i]=(byte)0;
  1025. 62a: 11 92 st Z+, r1
  1026. 62c: f8 cf rjmp .-16 ; 0x61e <LedControl::spiTransfer(int, unsigned char, unsigned char)+0x44>
  1027. //put our device data into the array
  1028. spidata[offset+1]=opcode;
  1029. 62e: 89 81 ldd r24, Y+1 ; 0x01
  1030. 630: f8 01 movw r30, r16
  1031. 632: e6 0f add r30, r22
  1032. 634: f7 1f adc r31, r23
  1033. 636: 81 83 std Z+1, r24 ; 0x01
  1034. spidata[offset]=data;
  1035. 638: 8a 81 ldd r24, Y+2 ; 0x02
  1036. 63a: 80 83 st Z, r24
  1037. //enable the line
  1038. digitalWrite(SPI_CS,LOW);
  1039. 63c: 58 01 movw r10, r16
  1040. 63e: 84 e5 ldi r24, 0x54 ; 84
  1041. 640: a8 0e add r10, r24
  1042. 642: b1 1c adc r11, r1
  1043. 644: 60 e0 ldi r22, 0x00 ; 0
  1044. 646: f5 01 movw r30, r10
  1045. 648: 80 81 ld r24, Z
  1046. 64a: 0e 94 28 02 call 0x450 ; 0x450 <digitalWrite>
  1047. 64e: e0 0e add r14, r16
  1048. 650: f1 1e adc r15, r17
  1049. //Now shift out the data
  1050. for(int i=maxbytes;i>0;i--)
  1051. shiftOut(SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1]);
  1052. 652: 48 01 movw r8, r16
  1053. 654: f2 e5 ldi r31, 0x52 ; 82
  1054. 656: 8f 0e add r8, r31
  1055. 658: 91 1c adc r9, r1
  1056. 65a: 38 01 movw r6, r16
  1057. 65c: 80 e5 ldi r24, 0x50 ; 80
  1058. 65e: 68 0e add r6, r24
  1059. 660: 71 1c adc r7, r1
  1060. 662: c7 01 movw r24, r14
  1061. 664: 80 1b sub r24, r16
  1062. 666: 91 0b sbc r25, r17
  1063. spidata[offset+1]=opcode;
  1064. spidata[offset]=data;
  1065. //enable the line
  1066. digitalWrite(SPI_CS,LOW);
  1067. //Now shift out the data
  1068. for(int i=maxbytes;i>0;i--)
  1069. 668: 18 16 cp r1, r24
  1070. 66a: 19 06 cpc r1, r25
  1071. 66c: 24 f5 brge .+72 ; 0x6b6 <LedControl::spiTransfer(int, unsigned char, unsigned char)+0xdc>
  1072. shiftOut(SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1]);
  1073. 66e: f7 01 movw r30, r14
  1074. 670: c2 90 ld r12, -Z
  1075. 672: 7f 01 movw r14, r30
  1076. 674: f4 01 movw r30, r8
  1077. 676: 30 80 ld r3, Z
  1078. 678: f3 01 movw r30, r6
  1079. 67a: 20 80 ld r2, Z
  1080. 67c: 87 e0 ldi r24, 0x07 ; 7
  1081. 67e: 48 2e mov r4, r24
  1082. 680: 51 2c mov r5, r1
  1083. for (i = 0; i < 8; i++) {
  1084. if (bitOrder == LSBFIRST)
  1085. digitalWrite(dataPin, !!(val & (1 << i)));
  1086. else
  1087. digitalWrite(dataPin, !!(val & (1 << (7 - i))));
  1088. 682: d1 2c mov r13, r1
  1089. 684: b6 01 movw r22, r12
  1090. 686: 04 2c mov r0, r4
  1091. 688: 02 c0 rjmp .+4 ; 0x68e <LedControl::spiTransfer(int, unsigned char, unsigned char)+0xb4>
  1092. 68a: 75 95 asr r23
  1093. 68c: 67 95 ror r22
  1094. 68e: 0a 94 dec r0
  1095. 690: e2 f7 brpl .-8 ; 0x68a <LedControl::spiTransfer(int, unsigned char, unsigned char)+0xb0>
  1096. 692: 61 70 andi r22, 0x01 ; 1
  1097. 694: 77 27 eor r23, r23
  1098. 696: 82 2d mov r24, r2
  1099. 698: 0e 94 28 02 call 0x450 ; 0x450 <digitalWrite>
  1100. digitalWrite(clockPin, HIGH);
  1101. 69c: 61 e0 ldi r22, 0x01 ; 1
  1102. 69e: 83 2d mov r24, r3
  1103. 6a0: 0e 94 28 02 call 0x450 ; 0x450 <digitalWrite>
  1104. digitalWrite(clockPin, LOW);
  1105. 6a4: 60 e0 ldi r22, 0x00 ; 0
  1106. 6a6: 83 2d mov r24, r3
  1107. 6a8: 0e 94 28 02 call 0x450 ; 0x450 <digitalWrite>
  1108. 6ac: f1 e0 ldi r31, 0x01 ; 1
  1109. 6ae: 4f 1a sub r4, r31
  1110. 6b0: 51 08 sbc r5, r1
  1111. 6b2: 40 f7 brcc .-48 ; 0x684 <LedControl::spiTransfer(int, unsigned char, unsigned char)+0xaa>
  1112. 6b4: d6 cf rjmp .-84 ; 0x662 <LedControl::spiTransfer(int, unsigned char, unsigned char)+0x88>
  1113. //latch the data onto the display
  1114. digitalWrite(SPI_CS,HIGH);
  1115. 6b6: 61 e0 ldi r22, 0x01 ; 1
  1116. 6b8: f5 01 movw r30, r10
  1117. 6ba: 80 81 ld r24, Z
  1118. }
  1119. 6bc: 0f 90 pop r0
  1120. 6be: 0f 90 pop r0
  1121. 6c0: df 91 pop r29
  1122. 6c2: cf 91 pop r28
  1123. 6c4: 1f 91 pop r17
  1124. 6c6: 0f 91 pop r16
  1125. 6c8: ff 90 pop r15
  1126. 6ca: ef 90 pop r14
  1127. 6cc: df 90 pop r13
  1128. 6ce: cf 90 pop r12
  1129. 6d0: bf 90 pop r11
  1130. 6d2: af 90 pop r10
  1131. 6d4: 9f 90 pop r9
  1132. 6d6: 8f 90 pop r8
  1133. 6d8: 7f 90 pop r7
  1134. 6da: 6f 90 pop r6
  1135. 6dc: 5f 90 pop r5
  1136. 6de: 4f 90 pop r4
  1137. 6e0: 3f 90 pop r3
  1138. 6e2: 2f 90 pop r2
  1139. digitalWrite(SPI_CS,LOW);
  1140. //Now shift out the data
  1141. for(int i=maxbytes;i>0;i--)
  1142. shiftOut(SPI_MOSI,SPI_CLK,MSBFIRST,spidata[i-1]);
  1143. //latch the data onto the display
  1144. digitalWrite(SPI_CS,HIGH);
  1145. 6e4: 0c 94 28 02 jmp 0x450 ; 0x450 <digitalWrite>
  1146. 000006e8 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]>:
  1147. void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
  1148. int offset;
  1149. byte v;
  1150. if(addr<0 || addr>=maxDevices)
  1151. 6e8: 20 91 3a 02 lds r18, 0x023A ; 0x80023a <lc+0x56>
  1152. 6ec: 30 91 3b 02 lds r19, 0x023B ; 0x80023b <lc+0x57>
  1153. 6f0: 12 16 cp r1, r18
  1154. 6f2: 13 06 cpc r1, r19
  1155. 6f4: b4 f4 brge .+44 ; 0x722 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]+0x3a>
  1156. return;
  1157. if(digit<0 || digit>7 || value>15)
  1158. 6f6: 88 30 cpi r24, 0x08 ; 8
  1159. 6f8: 91 05 cpc r25, r1
  1160. 6fa: 98 f4 brcc .+38 ; 0x722 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]+0x3a>
  1161. 6fc: 60 31 cpi r22, 0x10 ; 16
  1162. 6fe: 88 f4 brcc .+34 ; 0x722 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]+0x3a>
  1163. return;
  1164. offset=addr*8;
  1165. v=pgm_read_byte_near(charTable + value);
  1166. 700: e6 2f mov r30, r22
  1167. 702: f0 e0 ldi r31, 0x00 ; 0
  1168. 704: ee 53 subi r30, 0x3E ; 62
  1169. 706: ff 4f sbci r31, 0xFF ; 255
  1170. 708: 24 91 lpm r18, Z
  1171. if(dp)
  1172. v|=B10000000;
  1173. status[offset+digit]=v;
  1174. 70a: fc 01 movw r30, r24
  1175. 70c: ec 51 subi r30, 0x1C ; 28
  1176. 70e: fe 4f sbci r31, 0xFE ; 254
  1177. 710: 20 8b std Z+16, r18 ; 0x10
  1178. spiTransfer(addr, digit+1,v);
  1179. 712: 41 e0 ldi r20, 0x01 ; 1
  1180. 714: 48 0f add r20, r24
  1181. 716: 60 e0 ldi r22, 0x00 ; 0
  1182. 718: 70 e0 ldi r23, 0x00 ; 0
  1183. 71a: 84 ee ldi r24, 0xE4 ; 228
  1184. 71c: 91 e0 ldi r25, 0x01 ; 1
  1185. 71e: 0c 94 ed 02 jmp 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1186. 722: 08 95 ret
  1187. 00000724 <LedControl::clearDisplay(int)>:
  1188. return;
  1189. if(intensity>=0 && intensity<16)
  1190. spiTransfer(addr, OP_INTENSITY,intensity);
  1191. }
  1192. void LedControl::clearDisplay(int addr) {
  1193. 724: cf 92 push r12
  1194. 726: df 92 push r13
  1195. 728: ef 92 push r14
  1196. 72a: ff 92 push r15
  1197. 72c: 0f 93 push r16
  1198. 72e: 1f 93 push r17
  1199. 730: cf 93 push r28
  1200. 732: df 93 push r29
  1201. int offset;
  1202. if(addr<0 || addr>=maxDevices)
  1203. 734: 77 fd sbrc r23, 7
  1204. 736: 23 c0 rjmp .+70 ; 0x77e <LedControl::clearDisplay(int)+0x5a>
  1205. 738: fc 01 movw r30, r24
  1206. 73a: ea 5a subi r30, 0xAA ; 170
  1207. 73c: ff 4f sbci r31, 0xFF ; 255
  1208. 73e: 20 81 ld r18, Z
  1209. 740: 31 81 ldd r19, Z+1 ; 0x01
  1210. 742: 62 17 cp r22, r18
  1211. 744: 73 07 cpc r23, r19
  1212. 746: dc f4 brge .+54 ; 0x77e <LedControl::clearDisplay(int)+0x5a>
  1213. 748: eb 01 movw r28, r22
  1214. 74a: 7c 01 movw r14, r24
  1215. return;
  1216. offset=addr*8;
  1217. 74c: 6b 01 movw r12, r22
  1218. 74e: 83 e0 ldi r24, 0x03 ; 3
  1219. 750: cc 0c add r12, r12
  1220. 752: dd 1c adc r13, r13
  1221. 754: 8a 95 dec r24
  1222. 756: e1 f7 brne .-8 ; 0x750 <LedControl::clearDisplay(int)+0x2c>
  1223. 758: 01 e0 ldi r16, 0x01 ; 1
  1224. 75a: 10 e0 ldi r17, 0x00 ; 0
  1225. 75c: f8 01 movw r30, r16
  1226. 75e: ec 0d add r30, r12
  1227. 760: fd 1d adc r31, r13
  1228. 762: ee 0d add r30, r14
  1229. 764: ff 1d adc r31, r15
  1230. for(int i=0;i<8;i++) {
  1231. status[offset+i]=0;
  1232. 766: 17 86 std Z+15, r1 ; 0x0f
  1233. spiTransfer(addr, i+1,status[offset+i]);
  1234. 768: 20 e0 ldi r18, 0x00 ; 0
  1235. 76a: 40 2f mov r20, r16
  1236. 76c: be 01 movw r22, r28
  1237. 76e: c7 01 movw r24, r14
  1238. 770: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1239. 774: 0f 5f subi r16, 0xFF ; 255
  1240. 776: 1f 4f sbci r17, 0xFF ; 255
  1241. int offset;
  1242. if(addr<0 || addr>=maxDevices)
  1243. return;
  1244. offset=addr*8;
  1245. for(int i=0;i<8;i++) {
  1246. 778: 09 30 cpi r16, 0x09 ; 9
  1247. 77a: 11 05 cpc r17, r1
  1248. 77c: 79 f7 brne .-34 ; 0x75c <LedControl::clearDisplay(int)+0x38>
  1249. status[offset+i]=0;
  1250. spiTransfer(addr, i+1,status[offset+i]);
  1251. }
  1252. }
  1253. 77e: df 91 pop r29
  1254. 780: cf 91 pop r28
  1255. 782: 1f 91 pop r17
  1256. 784: 0f 91 pop r16
  1257. 786: ff 90 pop r15
  1258. 788: ef 90 pop r14
  1259. 78a: df 90 pop r13
  1260. 78c: cf 90 pop r12
  1261. 78e: 08 95 ret
  1262. 00000790 <Print::write(char const*) [clone .constprop.10]>:
  1263. int getWriteError() { return write_error; }
  1264. void clearWriteError() { setWriteError(0); }
  1265. virtual size_t write(uint8_t) = 0;
  1266. size_t write(const char *str) {
  1267. if (str == NULL) return 0;
  1268. 790: 00 97 sbiw r24, 0x00 ; 0
  1269. 792: 69 f0 breq .+26 ; 0x7ae <Print::write(char const*) [clone .constprop.10]+0x1e>
  1270. return write((const uint8_t *)str, strlen(str));
  1271. 794: fc 01 movw r30, r24
  1272. 796: 01 90 ld r0, Z+
  1273. 798: 00 20 and r0, r0
  1274. 79a: e9 f7 brne .-6 ; 0x796 <Print::write(char const*) [clone .constprop.10]+0x6>
  1275. 79c: 31 97 sbiw r30, 0x01 ; 1
  1276. 79e: af 01 movw r20, r30
  1277. 7a0: 48 1b sub r20, r24
  1278. 7a2: 59 0b sbc r21, r25
  1279. 7a4: bc 01 movw r22, r24
  1280. 7a6: 87 e4 ldi r24, 0x47 ; 71
  1281. 7a8: 91 e0 ldi r25, 0x01 ; 1
  1282. 7aa: 0c 94 cc 00 jmp 0x198 ; 0x198 <Print::write(unsigned char const*, unsigned int)>
  1283. }
  1284. 7ae: 80 e0 ldi r24, 0x00 ; 0
  1285. 7b0: 90 e0 ldi r25, 0x00 ; 0
  1286. 7b2: 08 95 ret
  1287. 000007b4 <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]>:
  1288. return n;
  1289. }
  1290. // Private Methods /////////////////////////////////////////////////////////////
  1291. size_t Print::printNumber(unsigned long n, uint8_t base)
  1292. 7b4: 8f 92 push r8
  1293. 7b6: 9f 92 push r9
  1294. 7b8: af 92 push r10
  1295. 7ba: bf 92 push r11
  1296. 7bc: 0f 93 push r16
  1297. 7be: 1f 93 push r17
  1298. 7c0: cf 93 push r28
  1299. 7c2: df 93 push r29
  1300. 7c4: cd b7 in r28, 0x3d ; 61
  1301. 7c6: de b7 in r29, 0x3e ; 62
  1302. 7c8: a1 97 sbiw r28, 0x21 ; 33
  1303. 7ca: 0f b6 in r0, 0x3f ; 63
  1304. 7cc: f8 94 cli
  1305. 7ce: de bf out 0x3e, r29 ; 62
  1306. 7d0: 0f be out 0x3f, r0 ; 63
  1307. 7d2: cd bf out 0x3d, r28 ; 61
  1308. {
  1309. char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  1310. char *str = &buf[sizeof(buf) - 1];
  1311. *str = '\0';
  1312. 7d4: 19 a2 std Y+33, r1 ; 0x21
  1313. // prevent crash if called with base == 1
  1314. if (base < 2) base = 10;
  1315. 7d6: 42 30 cpi r20, 0x02 ; 2
  1316. 7d8: 08 f4 brcc .+2 ; 0x7dc <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]+0x28>
  1317. 7da: 4a e0 ldi r20, 0x0A ; 10
  1318. 7dc: 8e 01 movw r16, r28
  1319. 7de: 0f 5d subi r16, 0xDF ; 223
  1320. 7e0: 1f 4f sbci r17, 0xFF ; 255
  1321. do {
  1322. char c = n % base;
  1323. 7e2: 84 2e mov r8, r20
  1324. 7e4: 91 2c mov r9, r1
  1325. 7e6: a1 2c mov r10, r1
  1326. 7e8: b1 2c mov r11, r1
  1327. 7ea: a5 01 movw r20, r10
  1328. 7ec: 94 01 movw r18, r8
  1329. 7ee: 0e 94 67 07 call 0xece ; 0xece <__udivmodsi4>
  1330. 7f2: e6 2f mov r30, r22
  1331. n /= base;
  1332. 7f4: b9 01 movw r22, r18
  1333. 7f6: ca 01 movw r24, r20
  1334. *--str = c < 10 ? c + '0' : c + 'A' - 10;
  1335. 7f8: 01 50 subi r16, 0x01 ; 1
  1336. 7fa: 11 09 sbc r17, r1
  1337. 7fc: ea 30 cpi r30, 0x0A ; 10
  1338. 7fe: 14 f4 brge .+4 ; 0x804 <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]+0x50>
  1339. 800: e0 5d subi r30, 0xD0 ; 208
  1340. 802: 01 c0 rjmp .+2 ; 0x806 <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]+0x52>
  1341. 804: e9 5c subi r30, 0xC9 ; 201
  1342. 806: d8 01 movw r26, r16
  1343. 808: ec 93 st X, r30
  1344. *str = '\0';
  1345. // prevent crash if called with base == 1
  1346. if (base < 2) base = 10;
  1347. do {
  1348. 80a: 23 2b or r18, r19
  1349. 80c: 24 2b or r18, r20
  1350. 80e: 25 2b or r18, r21
  1351. 810: 61 f7 brne .-40 ; 0x7ea <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]+0x36>
  1352. n /= base;
  1353. *--str = c < 10 ? c + '0' : c + 'A' - 10;
  1354. } while(n);
  1355. return write(str);
  1356. 812: c8 01 movw r24, r16
  1357. 814: 0e 94 c8 03 call 0x790 ; 0x790 <Print::write(char const*) [clone .constprop.10]>
  1358. }
  1359. 818: a1 96 adiw r28, 0x21 ; 33
  1360. 81a: 0f b6 in r0, 0x3f ; 63
  1361. 81c: f8 94 cli
  1362. 81e: de bf out 0x3e, r29 ; 62
  1363. 820: 0f be out 0x3f, r0 ; 63
  1364. 822: cd bf out 0x3d, r28 ; 61
  1365. 824: df 91 pop r29
  1366. 826: cf 91 pop r28
  1367. 828: 1f 91 pop r17
  1368. 82a: 0f 91 pop r16
  1369. 82c: bf 90 pop r11
  1370. 82e: af 90 pop r10
  1371. 830: 9f 90 pop r9
  1372. 832: 8f 90 pop r8
  1373. 834: 08 95 ret
  1374. 00000836 <__cxa_pure_virtual>:
  1375. extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
  1376. void __cxa_pure_virtual(void) {
  1377. // We might want to write some diagnostics to uart in this case
  1378. //std::terminate();
  1379. abort();
  1380. 836: 0e 94 a3 07 call 0xf46 ; 0xf46 <abort>
  1381. 0000083a <__vector_19>:
  1382. #elif defined(USART_UDRE_vect)
  1383. ISR(USART_UDRE_vect)
  1384. #else
  1385. #error "Don't know what the Data Register Empty vector is called for Serial"
  1386. #endif
  1387. {
  1388. 83a: 1f 92 push r1
  1389. 83c: 0f 92 push r0
  1390. 83e: 0f b6 in r0, 0x3f ; 63
  1391. 840: 0f 92 push r0
  1392. 842: 11 24 eor r1, r1
  1393. 844: 2f 93 push r18
  1394. 846: 3f 93 push r19
  1395. 848: 4f 93 push r20
  1396. 84a: 5f 93 push r21
  1397. 84c: 6f 93 push r22
  1398. 84e: 7f 93 push r23
  1399. 850: 8f 93 push r24
  1400. 852: 9f 93 push r25
  1401. 854: af 93 push r26
  1402. 856: bf 93 push r27
  1403. 858: ef 93 push r30
  1404. 85a: ff 93 push r31
  1405. Serial._tx_udr_empty_irq();
  1406. 85c: 87 e4 ldi r24, 0x47 ; 71
  1407. 85e: 91 e0 ldi r25, 0x01 ; 1
  1408. 860: 0e 94 42 01 call 0x284 ; 0x284 <HardwareSerial::_tx_udr_empty_irq()>
  1409. }
  1410. 864: ff 91 pop r31
  1411. 866: ef 91 pop r30
  1412. 868: bf 91 pop r27
  1413. 86a: af 91 pop r26
  1414. 86c: 9f 91 pop r25
  1415. 86e: 8f 91 pop r24
  1416. 870: 7f 91 pop r23
  1417. 872: 6f 91 pop r22
  1418. 874: 5f 91 pop r21
  1419. 876: 4f 91 pop r20
  1420. 878: 3f 91 pop r19
  1421. 87a: 2f 91 pop r18
  1422. 87c: 0f 90 pop r0
  1423. 87e: 0f be out 0x3f, r0 ; 63
  1424. 880: 0f 90 pop r0
  1425. 882: 1f 90 pop r1
  1426. 884: 18 95 reti
  1427. 00000886 <__vector_18>:
  1428. #elif defined(USART_RXC_vect)
  1429. ISR(USART_RXC_vect) // ATmega8
  1430. #else
  1431. #error "Don't know what the Data Received vector is called for Serial"
  1432. #endif
  1433. {
  1434. 886: 1f 92 push r1
  1435. 888: 0f 92 push r0
  1436. 88a: 0f b6 in r0, 0x3f ; 63
  1437. 88c: 0f 92 push r0
  1438. 88e: 11 24 eor r1, r1
  1439. 890: 2f 93 push r18
  1440. 892: 8f 93 push r24
  1441. 894: 9f 93 push r25
  1442. 896: ef 93 push r30
  1443. 898: ff 93 push r31
  1444. // Actual interrupt handlers //////////////////////////////////////////////////////////////
  1445. void HardwareSerial::_rx_complete_irq(void)
  1446. {
  1447. if (bit_is_clear(*_ucsra, UPE0)) {
  1448. 89a: e0 91 57 01 lds r30, 0x0157 ; 0x800157 <Serial+0x10>
  1449. 89e: f0 91 58 01 lds r31, 0x0158 ; 0x800158 <Serial+0x11>
  1450. 8a2: 80 81 ld r24, Z
  1451. 8a4: e0 91 5d 01 lds r30, 0x015D ; 0x80015d <Serial+0x16>
  1452. 8a8: f0 91 5e 01 lds r31, 0x015E ; 0x80015e <Serial+0x17>
  1453. 8ac: 82 fd sbrc r24, 2
  1454. 8ae: 12 c0 rjmp .+36 ; 0x8d4 <__vector_18+0x4e>
  1455. // No Parity error, read byte and store it in the buffer if there is
  1456. // room
  1457. unsigned char c = *_udr;
  1458. 8b0: 90 81 ld r25, Z
  1459. rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
  1460. 8b2: 80 91 60 01 lds r24, 0x0160 ; 0x800160 <Serial+0x19>
  1461. 8b6: 8f 5f subi r24, 0xFF ; 255
  1462. 8b8: 8f 73 andi r24, 0x3F ; 63
  1463. // if we should be storing the received character into the location
  1464. // just before the tail (meaning that the head would advance to the
  1465. // current location of the tail), we're about to overflow the buffer
  1466. // and so we don't write the character or advance the head.
  1467. if (i != _rx_buffer_tail) {
  1468. 8ba: 20 91 61 01 lds r18, 0x0161 ; 0x800161 <Serial+0x1a>
  1469. 8be: 82 17 cp r24, r18
  1470. 8c0: 51 f0 breq .+20 ; 0x8d6 <__vector_18+0x50>
  1471. _rx_buffer[_rx_buffer_head] = c;
  1472. 8c2: e0 91 60 01 lds r30, 0x0160 ; 0x800160 <Serial+0x19>
  1473. 8c6: f0 e0 ldi r31, 0x00 ; 0
  1474. 8c8: e9 5b subi r30, 0xB9 ; 185
  1475. 8ca: fe 4f sbci r31, 0xFE ; 254
  1476. 8cc: 95 8f std Z+29, r25 ; 0x1d
  1477. _rx_buffer_head = i;
  1478. 8ce: 80 93 60 01 sts 0x0160, r24 ; 0x800160 <Serial+0x19>
  1479. 8d2: 01 c0 rjmp .+2 ; 0x8d6 <__vector_18+0x50>
  1480. }
  1481. } else {
  1482. // Parity error, read byte but discard it
  1483. *_udr;
  1484. 8d4: 80 81 ld r24, Z
  1485. Serial._rx_complete_irq();
  1486. }
  1487. 8d6: ff 91 pop r31
  1488. 8d8: ef 91 pop r30
  1489. 8da: 9f 91 pop r25
  1490. 8dc: 8f 91 pop r24
  1491. 8de: 2f 91 pop r18
  1492. 8e0: 0f 90 pop r0
  1493. 8e2: 0f be out 0x3f, r0 ; 63
  1494. 8e4: 0f 90 pop r0
  1495. 8e6: 1f 90 pop r1
  1496. 8e8: 18 95 reti
  1497. 000008ea <__vector_16>:
  1498. #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
  1499. ISR(TIM0_OVF_vect)
  1500. #else
  1501. ISR(TIMER0_OVF_vect)
  1502. #endif
  1503. {
  1504. 8ea: 1f 92 push r1
  1505. 8ec: 0f 92 push r0
  1506. 8ee: 0f b6 in r0, 0x3f ; 63
  1507. 8f0: 0f 92 push r0
  1508. 8f2: 11 24 eor r1, r1
  1509. 8f4: 2f 93 push r18
  1510. 8f6: 3f 93 push r19
  1511. 8f8: 8f 93 push r24
  1512. 8fa: 9f 93 push r25
  1513. 8fc: af 93 push r26
  1514. 8fe: bf 93 push r27
  1515. // copy these to local variables so they can be stored in registers
  1516. // (volatile variables must be read from memory on every access)
  1517. unsigned long m = timer0_millis;
  1518. 900: 80 91 19 01 lds r24, 0x0119 ; 0x800119 <timer0_millis>
  1519. 904: 90 91 1a 01 lds r25, 0x011A ; 0x80011a <timer0_millis+0x1>
  1520. 908: a0 91 1b 01 lds r26, 0x011B ; 0x80011b <timer0_millis+0x2>
  1521. 90c: b0 91 1c 01 lds r27, 0x011C ; 0x80011c <timer0_millis+0x3>
  1522. unsigned char f = timer0_fract;
  1523. 910: 30 91 18 01 lds r19, 0x0118 ; 0x800118 <timer0_fract>
  1524. m += MILLIS_INC;
  1525. f += FRACT_INC;
  1526. 914: 23 e0 ldi r18, 0x03 ; 3
  1527. 916: 23 0f add r18, r19
  1528. if (f >= FRACT_MAX) {
  1529. 918: 2d 37 cpi r18, 0x7D ; 125
  1530. 91a: 20 f4 brcc .+8 ; 0x924 <__stack+0x25>
  1531. // copy these to local variables so they can be stored in registers
  1532. // (volatile variables must be read from memory on every access)
  1533. unsigned long m = timer0_millis;
  1534. unsigned char f = timer0_fract;
  1535. m += MILLIS_INC;
  1536. 91c: 01 96 adiw r24, 0x01 ; 1
  1537. 91e: a1 1d adc r26, r1
  1538. 920: b1 1d adc r27, r1
  1539. 922: 05 c0 rjmp .+10 ; 0x92e <__stack+0x2f>
  1540. f += FRACT_INC;
  1541. if (f >= FRACT_MAX) {
  1542. f -= FRACT_MAX;
  1543. 924: 26 e8 ldi r18, 0x86 ; 134
  1544. 926: 23 0f add r18, r19
  1545. m += 1;
  1546. 928: 02 96 adiw r24, 0x02 ; 2
  1547. 92a: a1 1d adc r26, r1
  1548. 92c: b1 1d adc r27, r1
  1549. }
  1550. timer0_fract = f;
  1551. 92e: 20 93 18 01 sts 0x0118, r18 ; 0x800118 <timer0_fract>
  1552. timer0_millis = m;
  1553. 932: 80 93 19 01 sts 0x0119, r24 ; 0x800119 <timer0_millis>
  1554. 936: 90 93 1a 01 sts 0x011A, r25 ; 0x80011a <timer0_millis+0x1>
  1555. 93a: a0 93 1b 01 sts 0x011B, r26 ; 0x80011b <timer0_millis+0x2>
  1556. 93e: b0 93 1c 01 sts 0x011C, r27 ; 0x80011c <timer0_millis+0x3>
  1557. timer0_overflow_count++;
  1558. 942: 80 91 1d 01 lds r24, 0x011D ; 0x80011d <timer0_overflow_count>
  1559. 946: 90 91 1e 01 lds r25, 0x011E ; 0x80011e <timer0_overflow_count+0x1>
  1560. 94a: a0 91 1f 01 lds r26, 0x011F ; 0x80011f <timer0_overflow_count+0x2>
  1561. 94e: b0 91 20 01 lds r27, 0x0120 ; 0x800120 <timer0_overflow_count+0x3>
  1562. 952: 01 96 adiw r24, 0x01 ; 1
  1563. 954: a1 1d adc r26, r1
  1564. 956: b1 1d adc r27, r1
  1565. 958: 80 93 1d 01 sts 0x011D, r24 ; 0x80011d <timer0_overflow_count>
  1566. 95c: 90 93 1e 01 sts 0x011E, r25 ; 0x80011e <timer0_overflow_count+0x1>
  1567. 960: a0 93 1f 01 sts 0x011F, r26 ; 0x80011f <timer0_overflow_count+0x2>
  1568. 964: b0 93 20 01 sts 0x0120, r27 ; 0x800120 <timer0_overflow_count+0x3>
  1569. }
  1570. 968: bf 91 pop r27
  1571. 96a: af 91 pop r26
  1572. 96c: 9f 91 pop r25
  1573. 96e: 8f 91 pop r24
  1574. 970: 3f 91 pop r19
  1575. 972: 2f 91 pop r18
  1576. 974: 0f 90 pop r0
  1577. 976: 0f be out 0x3f, r0 ; 63
  1578. 978: 0f 90 pop r0
  1579. 97a: 1f 90 pop r1
  1580. 97c: 18 95 reti
  1581. 0000097e <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832>:
  1582. 97e: cf 93 push r28
  1583. 980: df 93 push r29
  1584. size_t printNumber(unsigned long, uint8_t);
  1585. size_t printFloat(double, uint8_t);
  1586. protected:
  1587. void setWriteError(int err = 1) { write_error = err; }
  1588. public:
  1589. Print() : write_error(0) {}
  1590. 982: 10 92 4a 01 sts 0x014A, r1 ; 0x80014a <Serial+0x3>
  1591. 986: 10 92 49 01 sts 0x0149, r1 ; 0x800149 <Serial+0x2>
  1592. public:
  1593. virtual int available() = 0;
  1594. virtual int read() = 0;
  1595. virtual int peek() = 0;
  1596. Stream() {_timeout=1000;}
  1597. 98a: 88 ee ldi r24, 0xE8 ; 232
  1598. 98c: 93 e0 ldi r25, 0x03 ; 3
  1599. 98e: a0 e0 ldi r26, 0x00 ; 0
  1600. 990: b0 e0 ldi r27, 0x00 ; 0
  1601. 992: 80 93 4b 01 sts 0x014B, r24 ; 0x80014b <Serial+0x4>
  1602. 996: 90 93 4c 01 sts 0x014C, r25 ; 0x80014c <Serial+0x5>
  1603. 99a: a0 93 4d 01 sts 0x014D, r26 ; 0x80014d <Serial+0x6>
  1604. 99e: b0 93 4e 01 sts 0x014E, r27 ; 0x80014e <Serial+0x7>
  1605. volatile uint8_t *ucsrc, volatile uint8_t *udr) :
  1606. _ubrrh(ubrrh), _ubrrl(ubrrl),
  1607. _ucsra(ucsra), _ucsrb(ucsrb), _ucsrc(ucsrc),
  1608. _udr(udr),
  1609. _rx_buffer_head(0), _rx_buffer_tail(0),
  1610. _tx_buffer_head(0), _tx_buffer_tail(0)
  1611. 9a2: 84 e0 ldi r24, 0x04 ; 4
  1612. 9a4: 91 e0 ldi r25, 0x01 ; 1
  1613. 9a6: 90 93 48 01 sts 0x0148, r25 ; 0x800148 <Serial+0x1>
  1614. 9aa: 80 93 47 01 sts 0x0147, r24 ; 0x800147 <Serial>
  1615. 9ae: 85 ec ldi r24, 0xC5 ; 197
  1616. 9b0: 90 e0 ldi r25, 0x00 ; 0
  1617. 9b2: 90 93 54 01 sts 0x0154, r25 ; 0x800154 <Serial+0xd>
  1618. 9b6: 80 93 53 01 sts 0x0153, r24 ; 0x800153 <Serial+0xc>
  1619. 9ba: 84 ec ldi r24, 0xC4 ; 196
  1620. 9bc: 90 e0 ldi r25, 0x00 ; 0
  1621. 9be: 90 93 56 01 sts 0x0156, r25 ; 0x800156 <Serial+0xf>
  1622. 9c2: 80 93 55 01 sts 0x0155, r24 ; 0x800155 <Serial+0xe>
  1623. 9c6: 80 ec ldi r24, 0xC0 ; 192
  1624. 9c8: 90 e0 ldi r25, 0x00 ; 0
  1625. 9ca: 90 93 58 01 sts 0x0158, r25 ; 0x800158 <Serial+0x11>
  1626. 9ce: 80 93 57 01 sts 0x0157, r24 ; 0x800157 <Serial+0x10>
  1627. 9d2: 81 ec ldi r24, 0xC1 ; 193
  1628. 9d4: 90 e0 ldi r25, 0x00 ; 0
  1629. 9d6: 90 93 5a 01 sts 0x015A, r25 ; 0x80015a <Serial+0x13>
  1630. 9da: 80 93 59 01 sts 0x0159, r24 ; 0x800159 <Serial+0x12>
  1631. 9de: 82 ec ldi r24, 0xC2 ; 194
  1632. 9e0: 90 e0 ldi r25, 0x00 ; 0
  1633. 9e2: 90 93 5c 01 sts 0x015C, r25 ; 0x80015c <Serial+0x15>
  1634. 9e6: 80 93 5b 01 sts 0x015B, r24 ; 0x80015b <Serial+0x14>
  1635. 9ea: 86 ec ldi r24, 0xC6 ; 198
  1636. 9ec: 90 e0 ldi r25, 0x00 ; 0
  1637. 9ee: 90 93 5e 01 sts 0x015E, r25 ; 0x80015e <Serial+0x17>
  1638. 9f2: 80 93 5d 01 sts 0x015D, r24 ; 0x80015d <Serial+0x16>
  1639. 9f6: 10 92 60 01 sts 0x0160, r1 ; 0x800160 <Serial+0x19>
  1640. 9fa: 10 92 61 01 sts 0x0161, r1 ; 0x800161 <Serial+0x1a>
  1641. 9fe: 10 92 62 01 sts 0x0162, r1 ; 0x800162 <Serial+0x1b>
  1642. a02: 10 92 63 01 sts 0x0163, r1 ; 0x800163 <Serial+0x1c>
  1643. #define OP_SCANLIMIT 11
  1644. #define OP_SHUTDOWN 12
  1645. #define OP_DISPLAYTEST 15
  1646. LedControl::LedControl(int dataPin, int clkPin, int csPin, int numDevices) {
  1647. SPI_MOSI=dataPin;
  1648. a06: cc e0 ldi r28, 0x0C ; 12
  1649. a08: d0 e0 ldi r29, 0x00 ; 0
  1650. a0a: d0 93 35 02 sts 0x0235, r29 ; 0x800235 <lc+0x51>
  1651. a0e: c0 93 34 02 sts 0x0234, r28 ; 0x800234 <lc+0x50>
  1652. SPI_CLK=clkPin;
  1653. a12: 8b e0 ldi r24, 0x0B ; 11
  1654. a14: 90 e0 ldi r25, 0x00 ; 0
  1655. a16: 90 93 37 02 sts 0x0237, r25 ; 0x800237 <lc+0x53>
  1656. a1a: 80 93 36 02 sts 0x0236, r24 ; 0x800236 <lc+0x52>
  1657. SPI_CS=csPin;
  1658. a1e: 8a e0 ldi r24, 0x0A ; 10
  1659. a20: 90 e0 ldi r25, 0x00 ; 0
  1660. a22: 90 93 39 02 sts 0x0239, r25 ; 0x800239 <lc+0x55>
  1661. a26: 80 93 38 02 sts 0x0238, r24 ; 0x800238 <lc+0x54>
  1662. if(numDevices<=0 || numDevices>8 )
  1663. numDevices=8;
  1664. maxDevices=numDevices;
  1665. a2a: 81 e0 ldi r24, 0x01 ; 1
  1666. a2c: 90 e0 ldi r25, 0x00 ; 0
  1667. a2e: 90 93 3b 02 sts 0x023B, r25 ; 0x80023b <lc+0x57>
  1668. a32: 80 93 3a 02 sts 0x023A, r24 ; 0x80023a <lc+0x56>
  1669. pinMode(SPI_MOSI,OUTPUT);
  1670. a36: 61 e0 ldi r22, 0x01 ; 1
  1671. a38: 8c e0 ldi r24, 0x0C ; 12
  1672. a3a: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1673. pinMode(SPI_CLK,OUTPUT);
  1674. a3e: 61 e0 ldi r22, 0x01 ; 1
  1675. a40: 80 91 36 02 lds r24, 0x0236 ; 0x800236 <lc+0x52>
  1676. a44: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1677. pinMode(SPI_CS,OUTPUT);
  1678. a48: 61 e0 ldi r22, 0x01 ; 1
  1679. a4a: 80 91 38 02 lds r24, 0x0238 ; 0x800238 <lc+0x54>
  1680. a4e: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1681. digitalWrite(SPI_CS,HIGH);
  1682. a52: 61 e0 ldi r22, 0x01 ; 1
  1683. a54: 80 91 38 02 lds r24, 0x0238 ; 0x800238 <lc+0x54>
  1684. a58: 0e 94 28 02 call 0x450 ; 0x450 <digitalWrite>
  1685. SPI_MOSI=dataPin;
  1686. a5c: d0 93 35 02 sts 0x0235, r29 ; 0x800235 <lc+0x51>
  1687. a60: c0 93 34 02 sts 0x0234, r28 ; 0x800234 <lc+0x50>
  1688. a64: e4 ef ldi r30, 0xF4 ; 244
  1689. a66: f1 e0 ldi r31, 0x01 ; 1
  1690. for(int i=0;i<64;i++)
  1691. status[i]=0x00;
  1692. a68: 11 92 st Z+, r1
  1693. pinMode(SPI_MOSI,OUTPUT);
  1694. pinMode(SPI_CLK,OUTPUT);
  1695. pinMode(SPI_CS,OUTPUT);
  1696. digitalWrite(SPI_CS,HIGH);
  1697. SPI_MOSI=dataPin;
  1698. for(int i=0;i<64;i++)
  1699. a6a: 82 e0 ldi r24, 0x02 ; 2
  1700. a6c: e4 33 cpi r30, 0x34 ; 52
  1701. a6e: f8 07 cpc r31, r24
  1702. a70: d9 f7 brne .-10 ; 0xa68 <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0xea>
  1703. a72: c0 e0 ldi r28, 0x00 ; 0
  1704. a74: d0 e0 ldi r29, 0x00 ; 0
  1705. status[i]=0x00;
  1706. for(int i=0;i<maxDevices;i++) {
  1707. a76: 80 91 3a 02 lds r24, 0x023A ; 0x80023a <lc+0x56>
  1708. a7a: 90 91 3b 02 lds r25, 0x023B ; 0x80023b <lc+0x57>
  1709. a7e: c8 17 cp r28, r24
  1710. a80: d9 07 cpc r29, r25
  1711. a82: ac f5 brge .+106 ; 0xaee <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0x170>
  1712. spiTransfer(i,OP_DISPLAYTEST,0);
  1713. a84: 20 e0 ldi r18, 0x00 ; 0
  1714. a86: 4f e0 ldi r20, 0x0F ; 15
  1715. a88: be 01 movw r22, r28
  1716. a8a: 84 ee ldi r24, 0xE4 ; 228
  1717. a8c: 91 e0 ldi r25, 0x01 ; 1
  1718. a8e: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1719. else
  1720. spiTransfer(addr, OP_SHUTDOWN,1);
  1721. }
  1722. void LedControl::setScanLimit(int addr, int limit) {
  1723. if(addr<0 || addr>=maxDevices)
  1724. a92: d7 fd sbrc r29, 7
  1725. a94: 0e c0 rjmp .+28 ; 0xab2 <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0x134>
  1726. a96: 80 91 3a 02 lds r24, 0x023A ; 0x80023a <lc+0x56>
  1727. a9a: 90 91 3b 02 lds r25, 0x023B ; 0x80023b <lc+0x57>
  1728. a9e: c8 17 cp r28, r24
  1729. aa0: d9 07 cpc r29, r25
  1730. aa2: 3c f4 brge .+14 ; 0xab2 <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0x134>
  1731. return;
  1732. if(limit>=0 && limit<8)
  1733. spiTransfer(addr, OP_SCANLIMIT,limit);
  1734. aa4: 27 e0 ldi r18, 0x07 ; 7
  1735. aa6: 4b e0 ldi r20, 0x0B ; 11
  1736. aa8: be 01 movw r22, r28
  1737. aaa: 84 ee ldi r24, 0xE4 ; 228
  1738. aac: 91 e0 ldi r25, 0x01 ; 1
  1739. aae: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1740. for(int i=0;i<maxDevices;i++) {
  1741. spiTransfer(i,OP_DISPLAYTEST,0);
  1742. //scanlimit is set to max on startup
  1743. setScanLimit(i,7);
  1744. //decode is done in source
  1745. spiTransfer(i,OP_DECODEMODE,0);
  1746. ab2: 20 e0 ldi r18, 0x00 ; 0
  1747. ab4: 49 e0 ldi r20, 0x09 ; 9
  1748. ab6: be 01 movw r22, r28
  1749. ab8: 84 ee ldi r24, 0xE4 ; 228
  1750. aba: 91 e0 ldi r25, 0x01 ; 1
  1751. abc: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1752. clearDisplay(i);
  1753. ac0: be 01 movw r22, r28
  1754. ac2: 84 ee ldi r24, 0xE4 ; 228
  1755. ac4: 91 e0 ldi r25, 0x01 ; 1
  1756. ac6: 0e 94 92 03 call 0x724 ; 0x724 <LedControl::clearDisplay(int)>
  1757. int LedControl::getDeviceCount() {
  1758. return maxDevices;
  1759. }
  1760. void LedControl::shutdown(int addr, bool b) {
  1761. if(addr<0 || addr>=maxDevices)
  1762. aca: d7 fd sbrc r29, 7
  1763. acc: 0e c0 rjmp .+28 ; 0xaea <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0x16c>
  1764. ace: 80 91 3a 02 lds r24, 0x023A ; 0x80023a <lc+0x56>
  1765. ad2: 90 91 3b 02 lds r25, 0x023B ; 0x80023b <lc+0x57>
  1766. ad6: c8 17 cp r28, r24
  1767. ad8: d9 07 cpc r29, r25
  1768. ada: 3c f4 brge .+14 ; 0xaea <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0x16c>
  1769. return;
  1770. if(b)
  1771. spiTransfer(addr, OP_SHUTDOWN,0);
  1772. adc: 20 e0 ldi r18, 0x00 ; 0
  1773. ade: 4c e0 ldi r20, 0x0C ; 12
  1774. ae0: be 01 movw r22, r28
  1775. ae2: 84 ee ldi r24, 0xE4 ; 228
  1776. ae4: 91 e0 ldi r25, 0x01 ; 1
  1777. ae6: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1778. pinMode(SPI_CS,OUTPUT);
  1779. digitalWrite(SPI_CS,HIGH);
  1780. SPI_MOSI=dataPin;
  1781. for(int i=0;i<64;i++)
  1782. status[i]=0x00;
  1783. for(int i=0;i<maxDevices;i++) {
  1784. aea: 21 96 adiw r28, 0x01 ; 1
  1785. aec: c4 cf rjmp .-120 ; 0xa76 <global constructors keyed to 65535_0_shiftin_try6_wLED.ino.cpp.o.1832+0xf8>
  1786. aee: df 91 pop r29
  1787. af0: cf 91 pop r28
  1788. af2: 08 95 ret
  1789. 00000af4 <main>:
  1790. void init()
  1791. {
  1792. // this needs to be called before setup() or some functions won't
  1793. // work there
  1794. sei();
  1795. af4: 78 94 sei
  1796. // on the ATmega168, timer 0 is also used for fast hardware pwm
  1797. // (using phase-correct PWM would mean that timer 0 overflowed half as often
  1798. // resulting in different millis() behavior on the ATmega8 and ATmega168)
  1799. #if defined(TCCR0A) && defined(WGM01)
  1800. sbi(TCCR0A, WGM01);
  1801. af6: 84 b5 in r24, 0x24 ; 36
  1802. af8: 82 60 ori r24, 0x02 ; 2
  1803. afa: 84 bd out 0x24, r24 ; 36
  1804. sbi(TCCR0A, WGM00);
  1805. afc: 84 b5 in r24, 0x24 ; 36
  1806. afe: 81 60 ori r24, 0x01 ; 1
  1807. b00: 84 bd out 0x24, r24 ; 36
  1808. // this combination is for the standard atmega8
  1809. sbi(TCCR0, CS01);
  1810. sbi(TCCR0, CS00);
  1811. #elif defined(TCCR0B) && defined(CS01) && defined(CS00)
  1812. // this combination is for the standard 168/328/1280/2560
  1813. sbi(TCCR0B, CS01);
  1814. b02: 85 b5 in r24, 0x25 ; 37
  1815. b04: 82 60 ori r24, 0x02 ; 2
  1816. b06: 85 bd out 0x25, r24 ; 37
  1817. sbi(TCCR0B, CS00);
  1818. b08: 85 b5 in r24, 0x25 ; 37
  1819. b0a: 81 60 ori r24, 0x01 ; 1
  1820. b0c: 85 bd out 0x25, r24 ; 37
  1821. // enable timer 0 overflow interrupt
  1822. #if defined(TIMSK) && defined(TOIE0)
  1823. sbi(TIMSK, TOIE0);
  1824. #elif defined(TIMSK0) && defined(TOIE0)
  1825. sbi(TIMSK0, TOIE0);
  1826. b0e: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7e006e>
  1827. b12: 81 60 ori r24, 0x01 ; 1
  1828. b14: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__TEXT_REGION_LENGTH__+0x7e006e>
  1829. // this is better for motors as it ensures an even waveform
  1830. // note, however, that fast pwm mode can achieve a frequency of up
  1831. // 8 MHz (with a 16 MHz clock) at 50% duty cycle
  1832. #if defined(TCCR1B) && defined(CS11) && defined(CS10)
  1833. TCCR1B = 0;
  1834. b18: 10 92 81 00 sts 0x0081, r1 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  1835. // set timer 1 prescale factor to 64
  1836. sbi(TCCR1B, CS11);
  1837. b1c: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  1838. b20: 82 60 ori r24, 0x02 ; 2
  1839. b22: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  1840. #if F_CPU >= 8000000L
  1841. sbi(TCCR1B, CS10);
  1842. b26: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  1843. b2a: 81 60 ori r24, 0x01 ; 1
  1844. b2c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
  1845. sbi(TCCR1, CS10);
  1846. #endif
  1847. #endif
  1848. // put timer 1 in 8-bit phase correct pwm mode
  1849. #if defined(TCCR1A) && defined(WGM10)
  1850. sbi(TCCR1A, WGM10);
  1851. b30: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
  1852. b34: 81 60 ori r24, 0x01 ; 1
  1853. b36: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7e0080>
  1854. // set timer 2 prescale factor to 64
  1855. #if defined(TCCR2) && defined(CS22)
  1856. sbi(TCCR2, CS22);
  1857. #elif defined(TCCR2B) && defined(CS22)
  1858. sbi(TCCR2B, CS22);
  1859. b3a: 80 91 b1 00 lds r24, 0x00B1 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7e00b1>
  1860. b3e: 84 60 ori r24, 0x04 ; 4
  1861. b40: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7e00b1>
  1862. // configure timer 2 for phase correct pwm (8-bit)
  1863. #if defined(TCCR2) && defined(WGM20)
  1864. sbi(TCCR2, WGM20);
  1865. #elif defined(TCCR2A) && defined(WGM20)
  1866. sbi(TCCR2A, WGM20);
  1867. b44: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
  1868. b48: 81 60 ori r24, 0x01 ; 1
  1869. b4a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7e00b0>
  1870. #endif
  1871. #if defined(ADCSRA)
  1872. // set a2d prescaler so we are inside the desired 50-200 KHz range.
  1873. #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
  1874. sbi(ADCSRA, ADPS2);
  1875. b4e: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1876. b52: 84 60 ori r24, 0x04 ; 4
  1877. b54: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1878. sbi(ADCSRA, ADPS1);
  1879. b58: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1880. b5c: 82 60 ori r24, 0x02 ; 2
  1881. b5e: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1882. sbi(ADCSRA, ADPS0);
  1883. b62: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1884. b66: 81 60 ori r24, 0x01 ; 1
  1885. b68: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1886. cbi(ADCSRA, ADPS2);
  1887. cbi(ADCSRA, ADPS1);
  1888. sbi(ADCSRA, ADPS0);
  1889. #endif
  1890. // enable a2d conversions
  1891. sbi(ADCSRA, ADEN);
  1892. b6c: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1893. b70: 80 68 ori r24, 0x80 ; 128
  1894. b72: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7e007a>
  1895. // here so they can be used as normal digital i/o; they will be
  1896. // reconnected in Serial.begin()
  1897. #if defined(UCSRB)
  1898. UCSRB = 0;
  1899. #elif defined(UCSR0B)
  1900. UCSR0B = 0;
  1901. b76: 10 92 c1 00 sts 0x00C1, r1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
  1902. void setup() {
  1903. // put your setup code here, to run once:
  1904. pinMode(hzclk, INPUT);
  1905. b7a: 60 e0 ldi r22, 0x00 ; 0
  1906. b7c: 87 e0 ldi r24, 0x07 ; 7
  1907. b7e: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1908. pinMode(hzbinary, INPUT);
  1909. b82: 60 e0 ldi r22, 0x00 ; 0
  1910. b84: 86 e0 ldi r24, 0x06 ; 6
  1911. b86: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1912. pinMode(sigLED, OUTPUT);
  1913. b8a: 61 e0 ldi r22, 0x01 ; 1
  1914. b8c: 8b e0 ldi r24, 0x0B ; 11
  1915. b8e: 0e 94 58 02 call 0x4b0 ; 0x4b0 <pinMode>
  1916. void HardwareSerial::begin(unsigned long baud, byte config)
  1917. {
  1918. // Try u2x mode first
  1919. uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  1920. *_ucsra = 1 << U2X0;
  1921. b92: e0 91 57 01 lds r30, 0x0157 ; 0x800157 <Serial+0x10>
  1922. b96: f0 91 58 01 lds r31, 0x0158 ; 0x800158 <Serial+0x11>
  1923. b9a: 82 e0 ldi r24, 0x02 ; 2
  1924. b9c: 80 83 st Z, r24
  1925. *_ucsra = 0;
  1926. baud_setting = (F_CPU / 8 / baud - 1) / 2;
  1927. }
  1928. // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  1929. *_ubrrh = baud_setting >> 8;
  1930. b9e: e0 91 53 01 lds r30, 0x0153 ; 0x800153 <Serial+0xc>
  1931. ba2: f0 91 54 01 lds r31, 0x0154 ; 0x800154 <Serial+0xd>
  1932. ba6: 10 82 st Z, r1
  1933. *_ubrrl = baud_setting;
  1934. ba8: e0 91 55 01 lds r30, 0x0155 ; 0x800155 <Serial+0xe>
  1935. bac: f0 91 56 01 lds r31, 0x0156 ; 0x800156 <Serial+0xf>
  1936. bb0: 80 e1 ldi r24, 0x10 ; 16
  1937. bb2: 80 83 st Z, r24
  1938. _written = false;
  1939. bb4: 10 92 5f 01 sts 0x015F, r1 ; 0x80015f <Serial+0x18>
  1940. //set the data bits, parity, and stop bits
  1941. #if defined(__AVR_ATmega8__)
  1942. config |= 0x80; // select UCSRC register (shared with UBRRH)
  1943. #endif
  1944. *_ucsrc = config;
  1945. bb8: e0 91 5b 01 lds r30, 0x015B ; 0x80015b <Serial+0x14>
  1946. bbc: f0 91 5c 01 lds r31, 0x015C ; 0x80015c <Serial+0x15>
  1947. bc0: 86 e0 ldi r24, 0x06 ; 6
  1948. bc2: 80 83 st Z, r24
  1949. sbi(*_ucsrb, RXEN0);
  1950. bc4: e0 91 59 01 lds r30, 0x0159 ; 0x800159 <Serial+0x12>
  1951. bc8: f0 91 5a 01 lds r31, 0x015A ; 0x80015a <Serial+0x13>
  1952. bcc: 80 81 ld r24, Z
  1953. bce: 80 61 ori r24, 0x10 ; 16
  1954. bd0: 80 83 st Z, r24
  1955. sbi(*_ucsrb, TXEN0);
  1956. bd2: e0 91 59 01 lds r30, 0x0159 ; 0x800159 <Serial+0x12>
  1957. bd6: f0 91 5a 01 lds r31, 0x015A ; 0x80015a <Serial+0x13>
  1958. bda: 80 81 ld r24, Z
  1959. bdc: 88 60 ori r24, 0x08 ; 8
  1960. bde: 80 83 st Z, r24
  1961. sbi(*_ucsrb, RXCIE0);
  1962. be0: e0 91 59 01 lds r30, 0x0159 ; 0x800159 <Serial+0x12>
  1963. be4: f0 91 5a 01 lds r31, 0x015A ; 0x80015a <Serial+0x13>
  1964. be8: 80 81 ld r24, Z
  1965. bea: 80 68 ori r24, 0x80 ; 128
  1966. bec: 80 83 st Z, r24
  1967. cbi(*_ucsrb, UDRIE0);
  1968. bee: e0 91 59 01 lds r30, 0x0159 ; 0x800159 <Serial+0x12>
  1969. bf2: f0 91 5a 01 lds r31, 0x015A ; 0x80015a <Serial+0x13>
  1970. bf6: 80 81 ld r24, Z
  1971. bf8: 8f 7d andi r24, 0xDF ; 223
  1972. bfa: 80 83 st Z, r24
  1973. int LedControl::getDeviceCount() {
  1974. return maxDevices;
  1975. }
  1976. void LedControl::shutdown(int addr, bool b) {
  1977. if(addr<0 || addr>=maxDevices)
  1978. bfc: 80 91 3a 02 lds r24, 0x023A ; 0x80023a <lc+0x56>
  1979. c00: 90 91 3b 02 lds r25, 0x023B ; 0x80023b <lc+0x57>
  1980. c04: 18 16 cp r1, r24
  1981. c06: 19 06 cpc r1, r25
  1982. c08: 44 f4 brge .+16 ; 0xc1a <main+0x126>
  1983. return;
  1984. if(b)
  1985. spiTransfer(addr, OP_SHUTDOWN,0);
  1986. else
  1987. spiTransfer(addr, OP_SHUTDOWN,1);
  1988. c0a: 21 e0 ldi r18, 0x01 ; 1
  1989. c0c: 4c e0 ldi r20, 0x0C ; 12
  1990. c0e: 60 e0 ldi r22, 0x00 ; 0
  1991. c10: 70 e0 ldi r23, 0x00 ; 0
  1992. c12: 84 ee ldi r24, 0xE4 ; 228
  1993. c14: 91 e0 ldi r25, 0x01 ; 1
  1994. c16: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  1995. if(limit>=0 && limit<8)
  1996. spiTransfer(addr, OP_SCANLIMIT,limit);
  1997. }
  1998. void LedControl::setIntensity(int addr, int intensity) {
  1999. if(addr<0 || addr>=maxDevices)
  2000. c1a: 80 91 3a 02 lds r24, 0x023A ; 0x80023a <lc+0x56>
  2001. c1e: 90 91 3b 02 lds r25, 0x023B ; 0x80023b <lc+0x57>
  2002. c22: 18 16 cp r1, r24
  2003. c24: 19 06 cpc r1, r25
  2004. c26: 44 f4 brge .+16 ; 0xc38 <main+0x144>
  2005. return;
  2006. if(intensity>=0 && intensity<16)
  2007. spiTransfer(addr, OP_INTENSITY,intensity);
  2008. c28: 28 e0 ldi r18, 0x08 ; 8
  2009. c2a: 4a e0 ldi r20, 0x0A ; 10
  2010. c2c: 60 e0 ldi r22, 0x00 ; 0
  2011. c2e: 70 e0 ldi r23, 0x00 ; 0
  2012. c30: 84 ee ldi r24, 0xE4 ; 228
  2013. c32: 91 e0 ldi r25, 0x01 ; 1
  2014. c34: 0e 94 ed 02 call 0x5da ; 0x5da <LedControl::spiTransfer(int, unsigned char, unsigned char)>
  2015. */
  2016. lc.shutdown(0,false);
  2017. /* Set the brightness to a medium values */
  2018. lc.setIntensity(0,8);
  2019. /* and clear the display */
  2020. lc.clearDisplay(0);
  2021. c38: 60 e0 ldi r22, 0x00 ; 0
  2022. c3a: 70 e0 ldi r23, 0x00 ; 0
  2023. c3c: 84 ee ldi r24, 0xE4 ; 228
  2024. c3e: 91 e0 ldi r25, 0x01 ; 1
  2025. c40: 0e 94 92 03 call 0x724 ; 0x724 <LedControl::clearDisplay(int)>
  2026. }
  2027. void ConvertArraytoBin (void){
  2028. for(x=4;x<21;x++){
  2029. if(hzbinval[x] == 1){
  2030. bitfieldA.mainstwo = bitfieldA.mainstwo | (0b0000000000000000000001 << (x - 3));
  2031. c44: ee 24 eor r14, r14
  2032. c46: e3 94 inc r14
  2033. c48: f1 2c mov r15, r1
  2034. if(v<0) {
  2035. negative=true;
  2036. v=v*-1;
  2037. }
  2038. ones=v%10;
  2039. v=v/10;
  2040. c4a: ca e0 ldi r28, 0x0A ; 10
  2041. c4c: d0 e0 ldi r29, 0x00 ; 0
  2042. //direct port reads
  2043. if(temp == 5047){
  2044. temp = 5998; //something, something, premature optimization...
  2045. }
  2046. if(temp == 5048){
  2047. temp = 6000; //LUTs
  2048. c4e: 30 e7 ldi r19, 0x70 ; 112
  2049. c50: c3 2e mov r12, r19
  2050. c52: 37 e1 ldi r19, 0x17 ; 23
  2051. c54: d3 2e mov r13, r19
  2052. //results in a clock that is right most of the time.
  2053. //but wrong every 20 or so counts
  2054. //todo: fix timing of duino by removing digital read for
  2055. //direct port reads
  2056. if(temp == 5047){
  2057. temp = 5998; //something, something, premature optimization...
  2058. c56: 4e e6 ldi r20, 0x6E ; 110
  2059. c58: 24 2e mov r2, r20
  2060. c5a: 47 e1 ldi r20, 0x17 ; 23
  2061. c5c: 34 2e mov r3, r20
  2062. #endif
  2063. // busy wait
  2064. __asm__ __volatile__ (
  2065. c5e: 0b e8 ldi r16, 0x8B ; 139
  2066. c60: 11 e0 ldi r17, 0x01 ; 1
  2067. }
  2068. void loop() {
  2069. if(digitalRead(hzbinary) == LOW){
  2070. c62: 86 e0 ldi r24, 0x06 ; 6
  2071. c64: 0e 94 ff 01 call 0x3fe ; 0x3fe <digitalRead>
  2072. c68: 89 2b or r24, r25
  2073. c6a: 09 f0 breq .+2 ; 0xc6e <main+0x17a>
  2074. c6c: 16 c1 rjmp .+556 ; 0xe9a <main+0x3a6>
  2075. //this handles one clk cycle each
  2076. //need to read 20 cycles
  2077. clkval = 0;
  2078. c6e: 10 92 46 01 sts 0x0146, r1 ; 0x800146 <clkval>
  2079. checkCLKandBIN();checkCLKandBIN();checkCLKandBIN();
  2080. c72: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2081. c76: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2082. c7a: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2083. checkCLKandBIN();checkCLKandBIN();checkCLKandBIN();
  2084. c7e: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2085. c82: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2086. c86: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2087. checkCLKandBIN();checkCLKandBIN();checkCLKandBIN();
  2088. c8a: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2089. c8e: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2090. c92: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2091. checkCLKandBIN();checkCLKandBIN();checkCLKandBIN();
  2092. c96: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2093. c9a: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2094. c9e: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2095. checkCLKandBIN();checkCLKandBIN();checkCLKandBIN();
  2096. ca2: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2097. ca6: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2098. caa: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2099. checkCLKandBIN();
  2100. cae: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2101. checkCLKandBIN();
  2102. cb2: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2103. checkCLKandBIN();
  2104. cb6: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2105. checkCLKandBIN();
  2106. cba: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2107. checkCLKandBIN();
  2108. cbe: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2109. checkCLKandBIN();
  2110. cc2: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2111. checkCLKandBIN();
  2112. cc6: 0e 94 b9 02 call 0x572 ; 0x572 <checkCLKandBIN()>
  2113. cca: 80 91 42 01 lds r24, 0x0142 ; 0x800142 <bitfieldA>
  2114. cce: 20 91 43 01 lds r18, 0x0143 ; 0x800143 <bitfieldA+0x1>
  2115. cd2: 92 2f mov r25, r18
  2116. cd4: 9f 73 andi r25, 0x3F ; 63
  2117. cd6: 24 e0 ldi r18, 0x04 ; 4
  2118. lc.setDigit(0,1,(byte)tens,false);
  2119. lc.setDigit(0,0,(byte)ones,false);
  2120. }
  2121. void ConvertArraytoBin (void){
  2122. for(x=4;x<21;x++){
  2123. cd8: 25 31 cpi r18, 0x15 ; 21
  2124. cda: a9 f0 breq .+42 ; 0xd06 <main+0x212>
  2125. if(hzbinval[x] == 1){
  2126. cdc: 42 2f mov r20, r18
  2127. cde: 50 e0 ldi r21, 0x00 ; 0
  2128. ce0: fa 01 movw r30, r20
  2129. ce2: ed 5d subi r30, 0xDD ; 221
  2130. ce4: fe 4f sbci r31, 0xFE ; 254
  2131. ce6: 30 81 ld r19, Z
  2132. ce8: 31 30 cpi r19, 0x01 ; 1
  2133. cea: 59 f4 brne .+22 ; 0xd02 <main+0x20e>
  2134. bitfieldA.mainstwo = bitfieldA.mainstwo | (0b0000000000000000000001 << (x - 3));
  2135. cec: 43 50 subi r20, 0x03 ; 3
  2136. cee: 51 09 sbc r21, r1
  2137. cf0: b7 01 movw r22, r14
  2138. cf2: 02 c0 rjmp .+4 ; 0xcf8 <main+0x204>
  2139. cf4: 66 0f add r22, r22
  2140. cf6: 77 1f adc r23, r23
  2141. cf8: 4a 95 dec r20
  2142. cfa: e2 f7 brpl .-8 ; 0xcf4 <main+0x200>
  2143. cfc: 86 2b or r24, r22
  2144. cfe: 97 2b or r25, r23
  2145. d00: 9f 73 andi r25, 0x3F ; 63
  2146. d02: 2f 5f subi r18, 0xFF ; 255
  2147. d04: e9 cf rjmp .-46 ; 0xcd8 <main+0x1e4>
  2148. d06: 80 93 42 01 sts 0x0142, r24 ; 0x800142 <bitfieldA>
  2149. d0a: 39 2f mov r19, r25
  2150. d0c: 3f 73 andi r19, 0x3F ; 63
  2151. d0e: 90 91 43 01 lds r25, 0x0143 ; 0x800143 <bitfieldA+0x1>
  2152. d12: 90 7c andi r25, 0xC0 ; 192
  2153. d14: 93 2b or r25, r19
  2154. d16: 90 93 43 01 sts 0x0143, r25 ; 0x800143 <bitfieldA+0x1>
  2155. d1a: 20 93 41 01 sts 0x0141, r18 ; 0x800141 <x>
  2156. }
  2157. }
  2158. //Serial.println(bitfieldA.mainstwo,BIN);
  2159. temp = bitfieldA.mainstwo >> 1;
  2160. d1e: 9c 01 movw r18, r24
  2161. d20: 3f 73 andi r19, 0x3F ; 63
  2162. d22: 35 95 asr r19
  2163. d24: 27 95 ror r18
  2164. //almost, but no cigar. has timing issues.
  2165. //ugly hack time
  2166. temp = temp & 0b1011111111111;
  2167. d26: 37 71 andi r19, 0x17 ; 23
  2168. //results in a clock that is right most of the time.
  2169. //but wrong every 20 or so counts
  2170. //todo: fix timing of duino by removing digital read for
  2171. //direct port reads
  2172. if(temp == 5047){
  2173. d28: 27 3b cpi r18, 0xB7 ; 183
  2174. d2a: 73 e1 ldi r23, 0x13 ; 19
  2175. d2c: 37 07 cpc r19, r23
  2176. d2e: 29 f0 breq .+10 ; 0xd3a <main+0x246>
  2177. temp = bitfieldA.mainstwo >> 1;
  2178. //almost, but no cigar. has timing issues.
  2179. //ugly hack time
  2180. temp = temp & 0b1011111111111;
  2181. d30: 30 93 22 01 sts 0x0122, r19 ; 0x800122 <temp+0x1>
  2182. d34: 20 93 21 01 sts 0x0121, r18 ; 0x800121 <temp>
  2183. d38: 04 c0 rjmp .+8 ; 0xd42 <main+0x24e>
  2184. //results in a clock that is right most of the time.
  2185. //but wrong every 20 or so counts
  2186. //todo: fix timing of duino by removing digital read for
  2187. //direct port reads
  2188. if(temp == 5047){
  2189. temp = 5998; //something, something, premature optimization...
  2190. d3a: 30 92 22 01 sts 0x0122, r3 ; 0x800122 <temp+0x1>
  2191. d3e: 20 92 21 01 sts 0x0121, r2 ; 0x800121 <temp>
  2192. }
  2193. if(temp == 5048){
  2194. d42: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <temp>
  2195. d46: 90 91 22 01 lds r25, 0x0122 ; 0x800122 <temp+0x1>
  2196. d4a: 88 3b cpi r24, 0xB8 ; 184
  2197. d4c: 93 41 sbci r25, 0x13 ; 19
  2198. d4e: 21 f4 brne .+8 ; 0xd58 <main+0x264>
  2199. temp = 6000; //LUTs
  2200. d50: d0 92 22 01 sts 0x0122, r13 ; 0x800122 <temp+0x1>
  2201. d54: c0 92 21 01 sts 0x0121, r12 ; 0x800121 <temp>
  2202. n = -n;
  2203. return printNumber(n, 10) + t;
  2204. }
  2205. return printNumber(n, 10);
  2206. } else {
  2207. return printNumber(n, base);
  2208. d58: 60 91 21 01 lds r22, 0x0121 ; 0x800121 <temp>
  2209. d5c: 70 91 22 01 lds r23, 0x0122 ; 0x800122 <temp+0x1>
  2210. d60: 07 2e mov r0, r23
  2211. d62: 00 0c add r0, r0
  2212. d64: 88 0b sbc r24, r24
  2213. d66: 99 0b sbc r25, r25
  2214. d68: 42 e0 ldi r20, 0x02 ; 2
  2215. d6a: 0e 94 da 03 call 0x7b4 ; 0x7b4 <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]>
  2216. return x.printTo(*this);
  2217. }
  2218. size_t Print::println(void)
  2219. {
  2220. return write("\r\n");
  2221. d6e: 82 e1 ldi r24, 0x12 ; 18
  2222. d70: 91 e0 ldi r25, 0x01 ; 1
  2223. d72: 0e 94 c8 03 call 0x790 ; 0x790 <Print::write(char const*) [clone .constprop.10]>
  2224. }
  2225. Serial.println(temp,BIN);
  2226. Serial.println(temp,DEC);
  2227. d76: 40 90 21 01 lds r4, 0x0121 ; 0x800121 <temp>
  2228. d7a: 50 90 22 01 lds r5, 0x0122 ; 0x800122 <temp+0x1>
  2229. return print((unsigned long) b, base);
  2230. }
  2231. size_t Print::print(int n, int base)
  2232. {
  2233. return print((long) n, base);
  2234. d7e: 05 2c mov r0, r5
  2235. d80: 00 0c add r0, r0
  2236. d82: 66 08 sbc r6, r6
  2237. d84: 77 08 sbc r7, r7
  2238. size_t Print::print(long n, int base)
  2239. {
  2240. if (base == 0) {
  2241. return write(n);
  2242. } else if (base == 10) {
  2243. if (n < 0) {
  2244. d86: 77 fe sbrs r7, 7
  2245. d88: 14 c0 rjmp .+40 ; 0xdb2 <main+0x2be>
  2246. return write(str);
  2247. }
  2248. size_t Print::print(char c)
  2249. {
  2250. return write(c);
  2251. d8a: e0 91 47 01 lds r30, 0x0147 ; 0x800147 <Serial>
  2252. d8e: f0 91 48 01 lds r31, 0x0148 ; 0x800148 <Serial+0x1>
  2253. d92: 01 90 ld r0, Z+
  2254. d94: f0 81 ld r31, Z
  2255. d96: e0 2d mov r30, r0
  2256. d98: 6d e2 ldi r22, 0x2D ; 45
  2257. d9a: 87 e4 ldi r24, 0x47 ; 71
  2258. d9c: 91 e0 ldi r25, 0x01 ; 1
  2259. d9e: 09 95 icall
  2260. if (base == 0) {
  2261. return write(n);
  2262. } else if (base == 10) {
  2263. if (n < 0) {
  2264. int t = print('-');
  2265. n = -n;
  2266. da0: 66 27 eor r22, r22
  2267. da2: 77 27 eor r23, r23
  2268. da4: cb 01 movw r24, r22
  2269. da6: 64 19 sub r22, r4
  2270. da8: 75 09 sbc r23, r5
  2271. daa: 86 09 sbc r24, r6
  2272. dac: 97 09 sbc r25, r7
  2273. return printNumber(n, 10) + t;
  2274. dae: 4a e0 ldi r20, 0x0A ; 10
  2275. db0: 03 c0 rjmp .+6 ; 0xdb8 <main+0x2c4>
  2276. }
  2277. return printNumber(n, 10);
  2278. db2: 4a e0 ldi r20, 0x0A ; 10
  2279. db4: c3 01 movw r24, r6
  2280. db6: b2 01 movw r22, r4
  2281. db8: 0e 94 da 03 call 0x7b4 ; 0x7b4 <Print::printNumber(unsigned long, unsigned char) [clone .constprop.7]>
  2282. return x.printTo(*this);
  2283. }
  2284. size_t Print::println(void)
  2285. {
  2286. return write("\r\n");
  2287. dbc: 82 e1 ldi r24, 0x12 ; 18
  2288. dbe: 91 e0 ldi r25, 0x01 ; 1
  2289. dc0: 0e 94 c8 03 call 0x790 ; 0x790 <Print::write(char const*) [clone .constprop.10]>
  2290. return write(s.c_str(), s.length());
  2291. }
  2292. size_t Print::print(const char str[])
  2293. {
  2294. return write(str);
  2295. dc4: 83 e1 ldi r24, 0x13 ; 19
  2296. dc6: 91 e0 ldi r25, 0x01 ; 1
  2297. dc8: 0e 94 c8 03 call 0x790 ; 0x790 <Print::write(char const*) [clone .constprop.10]>
  2298. Serial.print("\n");
  2299. lc.clearDisplay(0);
  2300. dcc: 60 e0 ldi r22, 0x00 ; 0
  2301. dce: 70 e0 ldi r23, 0x00 ; 0
  2302. dd0: 84 ee ldi r24, 0xE4 ; 228
  2303. dd2: 91 e0 ldi r25, 0x01 ; 1
  2304. dd4: 0e 94 92 03 call 0x724 ; 0x724 <LedControl::clearDisplay(int)>
  2305. printNumber(temp);
  2306. dd8: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <temp>
  2307. ddc: 90 91 22 01 lds r25, 0x0122 ; 0x800122 <temp+0x1>
  2308. int tens;
  2309. int hundreds;
  2310. int thousands;
  2311. boolean negative;
  2312. if(v < -9999 || v > 9999)
  2313. de0: 9c 01 movw r18, r24
  2314. de2: 21 5f subi r18, 0xF1 ; 241
  2315. de4: 38 4d sbci r19, 0xD8 ; 216
  2316. de6: 2f 31 cpi r18, 0x1F ; 31
  2317. de8: 3e 44 sbci r19, 0x4E ; 78
  2318. dea: 30 f5 brcc .+76 ; 0xe38 <main+0x344>
  2319. dec: 97 ff sbrs r25, 7
  2320. dee: 03 c0 rjmp .+6 ; 0xdf6 <main+0x302>
  2321. df0: 91 95 neg r25
  2322. df2: 81 95 neg r24
  2323. df4: 91 09 sbc r25, r1
  2324. if(v<0) {
  2325. negative=true;
  2326. v=v*-1;
  2327. }
  2328. ones=v%10;
  2329. v=v/10;
  2330. df6: be 01 movw r22, r28
  2331. df8: 0e 94 53 07 call 0xea6 ; 0xea6 <__divmodhi4>
  2332. dfc: 78 2e mov r7, r24
  2333. tens=v%10;
  2334. v=v/10;
  2335. dfe: cb 01 movw r24, r22
  2336. e00: be 01 movw r22, r28
  2337. e02: 0e 94 53 07 call 0xea6 ; 0xea6 <__divmodhi4>
  2338. e06: 68 2e mov r6, r24
  2339. hundreds=v%10;
  2340. v=v/10;
  2341. e08: cb 01 movw r24, r22
  2342. e0a: be 01 movw r22, r28
  2343. e0c: 0e 94 53 07 call 0xea6 ; 0xea6 <__divmodhi4>
  2344. e10: 58 2e mov r5, r24
  2345. else {
  2346. //print a blank in the sign column
  2347. lc.setChar(0,4,' ',false);
  2348. }*/
  2349. //Now print the number digit by digit
  2350. lc.setDigit(0,3,(byte)thousands,false);
  2351. e12: 83 e0 ldi r24, 0x03 ; 3
  2352. e14: 90 e0 ldi r25, 0x00 ; 0
  2353. e16: 0e 94 74 03 call 0x6e8 ; 0x6e8 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]>
  2354. lc.setDigit(0,2,(byte)hundreds,false);
  2355. e1a: 65 2d mov r22, r5
  2356. e1c: 82 e0 ldi r24, 0x02 ; 2
  2357. e1e: 90 e0 ldi r25, 0x00 ; 0
  2358. e20: 0e 94 74 03 call 0x6e8 ; 0x6e8 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]>
  2359. lc.setDigit(0,1,(byte)tens,false);
  2360. e24: 66 2d mov r22, r6
  2361. e26: 81 e0 ldi r24, 0x01 ; 1
  2362. e28: 90 e0 ldi r25, 0x00 ; 0
  2363. e2a: 0e 94 74 03 call 0x6e8 ; 0x6e8 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]>
  2364. lc.setDigit(0,0,(byte)ones,false);
  2365. e2e: 67 2d mov r22, r7
  2366. e30: 80 e0 ldi r24, 0x00 ; 0
  2367. e32: 90 e0 ldi r25, 0x00 ; 0
  2368. e34: 0e 94 74 03 call 0x6e8 ; 0x6e8 <LedControl::setDigit(int, int, unsigned char, bool) [clone .constprop.15]>
  2369. return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
  2370. }
  2371. void delay(unsigned long ms)
  2372. {
  2373. uint32_t start = micros();
  2374. e38: 0e 94 94 02 call 0x528 ; 0x528 <micros>
  2375. e3c: 4b 01 movw r8, r22
  2376. e3e: 5c 01 movw r10, r24
  2377. e40: 8a ef ldi r24, 0xFA ; 250
  2378. e42: 48 2e mov r4, r24
  2379. e44: 51 2c mov r5, r1
  2380. e46: 61 2c mov r6, r1
  2381. e48: 71 2c mov r7, r1
  2382. while (ms > 0) {
  2383. yield();
  2384. while ( ms > 0 && (micros() - start) >= 1000) {
  2385. e4a: 0e 94 94 02 call 0x528 ; 0x528 <micros>
  2386. e4e: dc 01 movw r26, r24
  2387. e50: cb 01 movw r24, r22
  2388. e52: 88 19 sub r24, r8
  2389. e54: 99 09 sbc r25, r9
  2390. e56: aa 09 sbc r26, r10
  2391. e58: bb 09 sbc r27, r11
  2392. e5a: 88 3e cpi r24, 0xE8 ; 232
  2393. e5c: 93 40 sbci r25, 0x03 ; 3
  2394. e5e: a1 05 cpc r26, r1
  2395. e60: b1 05 cpc r27, r1
  2396. e62: 58 f0 brcs .+22 ; 0xe7a <main+0x386>
  2397. ms--;
  2398. e64: 61 e0 ldi r22, 0x01 ; 1
  2399. e66: 46 1a sub r4, r22
  2400. e68: 51 08 sbc r5, r1
  2401. e6a: 61 08 sbc r6, r1
  2402. e6c: 71 08 sbc r7, r1
  2403. start += 1000;
  2404. e6e: 78 ee ldi r23, 0xE8 ; 232
  2405. e70: 87 0e add r8, r23
  2406. e72: 73 e0 ldi r23, 0x03 ; 3
  2407. e74: 97 1e adc r9, r23
  2408. e76: a1 1c adc r10, r1
  2409. e78: b1 1c adc r11, r1
  2410. {
  2411. uint32_t start = micros();
  2412. while (ms > 0) {
  2413. yield();
  2414. while ( ms > 0 && (micros() - start) >= 1000) {
  2415. e7a: 41 14 cp r4, r1
  2416. e7c: 51 04 cpc r5, r1
  2417. e7e: 61 04 cpc r6, r1
  2418. e80: 71 04 cpc r7, r1
  2419. e82: 19 f7 brne .-58 ; 0xe4a <main+0x356>
  2420. checkCLKandBIN();
  2421. checkCLKandBIN();
  2422. checkCLKandBIN();
  2423. //Serial.println(clkval); //outputs 19 or 20
  2424. ConvertArraytoBin();
  2425. mainsfreq = 0;
  2426. e84: 10 92 45 01 sts 0x0145, r1 ; 0x800145 <mainsfreq+0x1>
  2427. e88: 10 92 44 01 sts 0x0144, r1 ; 0x800144 <mainsfreq>
  2428. bitfieldA.mainstwo = 0;
  2429. e8c: 10 92 42 01 sts 0x0142, r1 ; 0x800142 <bitfieldA>
  2430. e90: 80 91 43 01 lds r24, 0x0143 ; 0x800143 <bitfieldA+0x1>
  2431. e94: 80 7c andi r24, 0xC0 ; 192
  2432. e96: 80 93 43 01 sts 0x0143, r24 ; 0x800143 <bitfieldA+0x1>
  2433. #endif
  2434. // busy wait
  2435. __asm__ __volatile__ (
  2436. e9a: c8 01 movw r24, r16
  2437. e9c: 01 97 sbiw r24, 0x01 ; 1
  2438. e9e: f1 f7 brne .-4 ; 0xe9c <main+0x3a8>
  2439. setup();
  2440. for (;;) {
  2441. loop();
  2442. if (serialEventRun) serialEventRun();
  2443. ea0: 0e 94 cc 01 call 0x398 ; 0x398 <serialEventRun()>
  2444. ea4: de ce rjmp .-580 ; 0xc62 <main+0x16e>
  2445. 00000ea6 <__divmodhi4>:
  2446. ea6: 97 fb bst r25, 7
  2447. ea8: 07 2e mov r0, r23
  2448. eaa: 16 f4 brtc .+4 ; 0xeb0 <__divmodhi4+0xa>
  2449. eac: 00 94 com r0
  2450. eae: 07 d0 rcall .+14 ; 0xebe <__divmodhi4_neg1>
  2451. eb0: 77 fd sbrc r23, 7
  2452. eb2: 09 d0 rcall .+18 ; 0xec6 <__divmodhi4_neg2>
  2453. eb4: 0e 94 89 07 call 0xf12 ; 0xf12 <__udivmodhi4>
  2454. eb8: 07 fc sbrc r0, 7
  2455. eba: 05 d0 rcall .+10 ; 0xec6 <__divmodhi4_neg2>
  2456. ebc: 3e f4 brtc .+14 ; 0xecc <__divmodhi4_exit>
  2457. 00000ebe <__divmodhi4_neg1>:
  2458. ebe: 90 95 com r25
  2459. ec0: 81 95 neg r24
  2460. ec2: 9f 4f sbci r25, 0xFF ; 255
  2461. ec4: 08 95 ret
  2462. 00000ec6 <__divmodhi4_neg2>:
  2463. ec6: 70 95 com r23
  2464. ec8: 61 95 neg r22
  2465. eca: 7f 4f sbci r23, 0xFF ; 255
  2466. 00000ecc <__divmodhi4_exit>:
  2467. ecc: 08 95 ret
  2468. 00000ece <__udivmodsi4>:
  2469. ece: a1 e2 ldi r26, 0x21 ; 33
  2470. ed0: 1a 2e mov r1, r26
  2471. ed2: aa 1b sub r26, r26
  2472. ed4: bb 1b sub r27, r27
  2473. ed6: fd 01 movw r30, r26
  2474. ed8: 0d c0 rjmp .+26 ; 0xef4 <__udivmodsi4_ep>
  2475. 00000eda <__udivmodsi4_loop>:
  2476. eda: aa 1f adc r26, r26
  2477. edc: bb 1f adc r27, r27
  2478. ede: ee 1f adc r30, r30
  2479. ee0: ff 1f adc r31, r31
  2480. ee2: a2 17 cp r26, r18
  2481. ee4: b3 07 cpc r27, r19
  2482. ee6: e4 07 cpc r30, r20
  2483. ee8: f5 07 cpc r31, r21
  2484. eea: 20 f0 brcs .+8 ; 0xef4 <__udivmodsi4_ep>
  2485. eec: a2 1b sub r26, r18
  2486. eee: b3 0b sbc r27, r19
  2487. ef0: e4 0b sbc r30, r20
  2488. ef2: f5 0b sbc r31, r21
  2489. 00000ef4 <__udivmodsi4_ep>:
  2490. ef4: 66 1f adc r22, r22
  2491. ef6: 77 1f adc r23, r23
  2492. ef8: 88 1f adc r24, r24
  2493. efa: 99 1f adc r25, r25
  2494. efc: 1a 94 dec r1
  2495. efe: 69 f7 brne .-38 ; 0xeda <__udivmodsi4_loop>
  2496. f00: 60 95 com r22
  2497. f02: 70 95 com r23
  2498. f04: 80 95 com r24
  2499. f06: 90 95 com r25
  2500. f08: 9b 01 movw r18, r22
  2501. f0a: ac 01 movw r20, r24
  2502. f0c: bd 01 movw r22, r26
  2503. f0e: cf 01 movw r24, r30
  2504. f10: 08 95 ret
  2505. 00000f12 <__udivmodhi4>:
  2506. f12: aa 1b sub r26, r26
  2507. f14: bb 1b sub r27, r27
  2508. f16: 51 e1 ldi r21, 0x11 ; 17
  2509. f18: 07 c0 rjmp .+14 ; 0xf28 <__udivmodhi4_ep>
  2510. 00000f1a <__udivmodhi4_loop>:
  2511. f1a: aa 1f adc r26, r26
  2512. f1c: bb 1f adc r27, r27
  2513. f1e: a6 17 cp r26, r22
  2514. f20: b7 07 cpc r27, r23
  2515. f22: 10 f0 brcs .+4 ; 0xf28 <__udivmodhi4_ep>
  2516. f24: a6 1b sub r26, r22
  2517. f26: b7 0b sbc r27, r23
  2518. 00000f28 <__udivmodhi4_ep>:
  2519. f28: 88 1f adc r24, r24
  2520. f2a: 99 1f adc r25, r25
  2521. f2c: 5a 95 dec r21
  2522. f2e: a9 f7 brne .-22 ; 0xf1a <__udivmodhi4_loop>
  2523. f30: 80 95 com r24
  2524. f32: 90 95 com r25
  2525. f34: bc 01 movw r22, r24
  2526. f36: cd 01 movw r24, r26
  2527. f38: 08 95 ret
  2528. 00000f3a <__tablejump2__>:
  2529. f3a: ee 0f add r30, r30
  2530. f3c: ff 1f adc r31, r31
  2531. f3e: 05 90 lpm r0, Z+
  2532. f40: f4 91 lpm r31, Z
  2533. f42: e0 2d mov r30, r0
  2534. f44: 09 94 ijmp
  2535. 00000f46 <abort>:
  2536. f46: 81 e0 ldi r24, 0x01 ; 1
  2537. f48: 90 e0 ldi r25, 0x00 ; 0
  2538. f4a: f8 94 cli
  2539. f4c: 0c 94 a8 07 jmp 0xf50 ; 0xf50 <_exit>
  2540. 00000f50 <_exit>:
  2541. f50: f8 94 cli
  2542. 00000f52 <__stop_program>:
  2543. f52: ff cf rjmp .-2 ; 0xf52 <__stop_program>