MK25-RAMBo13a_lang_base: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 f4 50 jmp 0xa1e8 ; 0xa1e8 <__dtors_end> 4: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 8: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 10: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 14: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 18: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 1c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 20: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 24: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 28: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 2c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 30: 0c 94 e6 86 jmp 0x10dcc ; 0x10dcc <__vector_12> 34: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 38: 0d 94 77 13 jmp 0x226ee ; 0x226ee <__vector_14> 3c: 0d 94 bb 10 jmp 0x22176 ; 0x22176 <__vector_15> 40: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 44: 0d 94 68 1b jmp 0x236d0 ; 0x236d0 <__vector_17> 48: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 4c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 50: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 54: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 58: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 5c: 0c 94 e3 76 jmp 0xedc6 ; 0xedc6 <__vector_23> 60: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 64: 0c 94 62 63 jmp 0xc6c4 ; 0xc6c4 <__vector_25> 68: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 6c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 70: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 74: 0c 94 51 bc jmp 0x178a2 ; 0x178a2 <__vector_29> 78: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 7c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 80: 0d 94 c5 15 jmp 0x22b8a ; 0x22b8a <__vector_32> 84: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 88: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 8c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 90: 0c 94 1e 63 jmp 0xc63c ; 0xc63c <__vector_36> 94: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 98: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 9c: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> a0: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> a4: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> a8: 0d 94 9f 0d jmp 0x21b3e ; 0x21b3e <__vector_42> ac: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> b0: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> b4: 0d 94 81 0d jmp 0x21b02 ; 0x21b02 <__vector_45> b8: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> bc: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> c0: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> c4: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> c8: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> cc: 0d 94 41 0d jmp 0x21a82 ; 0x21a82 <__vector_51> d0: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> d4: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> d8: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> dc: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> e0: 0c 94 25 51 jmp 0xa24a ; 0xa24a <__bad_interrupt> 000000e4 <__loc_sec_start>: ... 00000100 <_SEC_LANG>: 100: 5f 53 45 43 5f 4c 41 4e 47 00 00 00 00 00 00 00 _SEC_LANG....... ... 00003600 <__loc_pri_start>: 3600: ff ff .word 0xffff ; ???? 3602: 53 6f ori r21, 0xF3 ; 243 3604: 6d 65 ori r22, 0x5D ; 93 3606: 20 70 andi r18, 0x00 ; 0 3608: 72 6f ori r23, 0xF2 ; 242 360a: 62 6c ori r22, 0xC2 ; 194 360c: 65 6d ori r22, 0xD5 ; 213 360e: 20 65 ori r18, 0x50 ; 80 3610: 6e 63 ori r22, 0x3E ; 62 3612: 6f 75 andi r22, 0x5F ; 95 3614: 6e 74 andi r22, 0x4E ; 78 3616: 65 72 andi r22, 0x25 ; 37 3618: 65 64 ori r22, 0x45 ; 69 361a: 2c 20 and r2, r12 361c: 5a 2d mov r21, r10 361e: 6c 65 ori r22, 0x5C ; 92 3620: 76 65 ori r23, 0x56 ; 86 3622: 6c 69 ori r22, 0x9C ; 156 3624: 6e 67 ori r22, 0x7E ; 126 3626: 20 65 ori r18, 0x50 ; 80 3628: 6e 66 ori r22, 0x6E ; 110 362a: 6f 72 andi r22, 0x2F ; 47 362c: 63 65 ori r22, 0x53 ; 83 362e: 64 20 and r6, r4 3630: 2e 2e mov r2, r30 3632: 2e 00 .word 0x002e ; ???? 00003634 : 3634: ff ff 4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c ..Mesh bed level 3644: 69 6e 67 20 66 61 69 6c 65 64 2e 20 50 72 69 6e ing failed. Prin 3654: 74 20 63 61 6e 63 65 6c 65 64 2e 00 t canceled.. 00003660 : 3660: ff ff 48 65 61 74 69 6e 67 20 64 69 73 61 62 6c ..Heating disabl 3670: 65 64 20 62 79 20 73 61 66 65 74 79 20 74 69 6d ed by safety tim 3680: 65 72 2e 00 er.. 00003684 : 3684: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 3694: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 36a4: 6c 65 76 65 6c 2e 00 level.. 000036ab : 36ab: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 36bb: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 36cb: 6c 65 76 65 6c 2e 20 50 6c 65 61 73 65 20 72 65 level. Please re 36db: 2d 73 6c 69 63 65 20 74 68 65 20 6d 6f 64 65 6c -slice the model 36eb: 20 61 67 61 69 6e 2e 00 again.. 000036f3 : 36f3: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 3703: 66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d for a newer firm 3713: 77 61 72 65 2e 00 ware.. 00003719 : 3719: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 3729: 66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d for a newer firm 3739: 77 61 72 65 2e 20 50 6c 65 61 73 65 20 75 70 64 ware. Please upd 3749: 61 74 65 20 74 68 65 20 66 69 72 6d 77 61 72 65 ate the firmware 3759: 2e 00 .. 0000375b : 375b: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 376b: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 377b: 70 72 69 6e 74 65 72 20 74 79 70 65 2e 00 printer type.. 00003789 : 3789: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 3799: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 37a9: 70 72 69 6e 74 65 72 20 74 79 70 65 2e 20 50 6c printer type. Pl 37b9: 65 61 73 65 20 72 65 2d 73 6c 69 63 65 20 74 68 ease re-slice th 37c9: 65 20 6d 6f 64 65 6c 20 61 67 61 69 6e 2e 00 e model again.. 000037d8 : 37d8: ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 ..Press the knob 37e8: 20 74 6f 20 70 72 65 68 65 61 74 20 6e 6f 7a 7a to preheat nozz 37f8: 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e le and continue. ... 00003809 : 3809: ff ff 50 6c 65 61 73 65 20 70 72 65 73 73 20 74 ..Please press t 3819: 68 65 20 6b 6e 6f 62 20 74 6f 20 75 6e 6c 6f 61 he knob to unloa 3829: 64 20 66 69 6c 61 6d 65 6e 74 00 d filament. 00003834 : 3834: ff ff 61 6e 64 20 70 72 65 73 73 20 74 68 65 20 ..and press the 3844: 6b 6e 6f 62 00 knob. 00003849 : 3849: ff ff 49 6e 73 65 72 74 20 66 69 6c 61 6d 65 6e ..Insert filamen 3859: 74 00 t. 0000385b : 385b: ff ff 43 6f 6c 6f 72 20 6e 6f 74 20 63 6f 72 72 ..Color not corr 386b: 65 63 74 00 ect. 0000386f : 386f: ff ff 46 69 6c 61 6d 65 6e 74 20 6e 6f 74 20 6c ..Filament not l 387f: 6f 61 64 65 64 00 oaded. 00003885 : 3885: ff ff 43 68 61 6e 67 65 64 20 63 6f 72 72 65 63 ..Changed correc 3895: 74 6c 79 00 tly. 00003899 : 3899: ff ff 4c 6f 61 64 69 6e 67 20 63 6f 6c 6f 72 00 ..Loading color. 000038a9 : 38a9: ff ff 43 68 61 6e 67 65 20 73 75 63 63 65 73 73 ..Change success 38b9: 21 00 !. 000038bb : 38bb: ff ff 50 6c 65 61 73 65 20 6f 70 65 6e 20 69 64 ..Please open id 38cb: 6c 65 72 20 61 6e 64 20 72 65 6d 6f 76 65 20 66 ler and remove f 38db: 69 6c 61 6d 65 6e 74 20 6d 61 6e 75 61 6c 6c 79 ilament manually 38eb: 2e 00 .. 000038ed : 38ed: ff ff 57 61 73 20 66 69 6c 61 6d 65 6e 74 20 75 ..Was filament u 38fd: 6e 6c 6f 61 64 20 73 75 63 63 65 73 73 66 75 6c nload successful 390d: 3f 00 ?. 0000390f : 390f: ff ff 50 6c 65 61 73 65 20 75 70 67 72 61 64 65 ..Please upgrade 391f: 2e 00 .. 00003921 : 3921: ff ff 4e 65 77 20 66 69 72 6d 77 61 72 65 20 76 ..New firmware v 3931: 65 72 73 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 ersion available 3941: 3a 00 :. 00003943 : 3943: ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 50 49 ..Waiting for PI 3953: 4e 44 41 20 70 72 6f 62 65 20 63 6f 6f 6c 69 6e NDA probe coolin 3963: 67 00 g. 00003965 : 3965: ff ff 50 6c 65 61 73 65 20 77 61 69 74 00 ..Please wait. 00003973 : 3973: ff ff 4e 6f 20 6d 6f 76 65 2e 00 ..No move.. 0000397e : 397e: ff ff 57 61 69 74 20 66 6f 72 20 75 73 65 72 2e ..Wait for user. 398e: 2e 2e 00 ... 00003991 : 3991: ff ff 53 74 61 62 6c 65 20 61 6d 62 69 65 6e 74 ..Stable ambient 39a1: 20 74 65 6d 70 65 72 61 74 75 72 65 20 32 31 2d temperature 21- 39b1: 32 36 43 20 69 73 20 6e 65 65 64 65 64 20 61 20 26C is needed a 39c1: 72 69 67 69 64 20 73 74 61 6e 64 20 69 73 20 72 rigid stand is r 39d1: 65 71 75 69 72 65 64 2e 00 equired.. 000039da : 39da: ff ff 50 6c 65 61 73 65 20 72 75 6e 20 58 59 5a ..Please run XYZ 39ea: 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 69 72 calibration fir 39fa: 73 74 2e 00 st.. 000039fe : 39fe: ff ff 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 ..Bed leveling f 3a0e: 61 69 6c 65 64 2e 20 53 65 6e 73 6f 72 20 64 69 ailed. Sensor di 3a1e: 64 6e 27 74 20 74 72 69 67 67 65 72 2e 20 44 65 dn't trigger. De 3a2e: 62 72 69 73 20 6f 6e 20 6e 6f 7a 7a 6c 65 3f 20 bris on nozzle? 3a3e: 57 61 69 74 69 6e 67 20 66 6f 72 20 72 65 73 65 Waiting for rese 3a4e: 74 2e 00 t.. 00003a51 : 3a51: ff ff 50 72 65 68 65 61 74 20 74 68 65 20 6e 6f ..Preheat the no 3a61: 7a 7a 6c 65 21 00 zzle!. 00003a67 : 3a67: ff ff 45 52 52 4f 52 3a 00 ..ERROR:. 00003a70 : 3a70: ff ff 59 20 64 69 73 74 61 6e 63 65 20 66 72 6f ..Y distance fro 3a80: 6d 20 6d 69 6e 00 m min. 00003a86 : 3a86: ff ff 4c 65 66 74 00 ..Left. 00003a8d : 3a8d: ff ff 52 69 67 68 74 00 ..Right. 00003a95 : 3a95: ff ff 4d 65 61 73 75 72 65 64 20 73 6b 65 77 00 ..Measured skew. 00003aa5 : 3aa5: ff ff 53 6c 69 67 68 74 20 73 6b 65 77 00 ..Slight skew. 00003ab3 : 3ab3: ff ff 53 65 76 65 72 65 20 73 6b 65 77 00 ..Severe skew. 00003ac1 : 3ac1: ff ff 5b 30 3b 30 5d 20 70 6f 69 6e 74 20 6f 66 ..[0;0] point of 3ad1: 66 73 65 74 00 fset. 00003ad6 : 3ad6: ff ff 41 64 6a 75 73 74 69 6e 67 20 5a 00 ..Adjusting Z. 00003ae4 : 3ae4: ff ff 52 65 61 72 20 73 69 64 65 20 5b e4 6d 5d ..Rear side [.m] ... 00003af5 : 3af5: ff ff 46 72 6f 6e 74 20 73 69 64 65 5b e4 6d 5d ..Front side[.m] ... 00003b06 : 3b06: ff ff 52 69 67 68 74 20 73 69 64 65 5b e4 6d 5d ..Right side[.m] ... 00003b17 : 3b17: ff ff 4c 65 66 74 20 73 69 64 65 20 5b e4 6d 5d ..Left side [.m] ... 00003b28 : 3b28: ff ff 53 65 74 20 74 65 6d 70 65 72 61 74 75 72 ..Set temperatur 3b38: 65 3a 00 e:. 00003b3b : 3b3b: ff ff 41 72 65 20 6c 65 66 74 20 61 6e 64 20 72 ..Are left and r 3b4b: 69 67 68 74 20 5a 2d 63 61 72 72 69 61 67 65 73 ight Z-carriages 3b5b: 20 61 6c 6c 20 75 70 3f 00 all up?. 00003b64 : 3b64: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 58 59 ..Calibrating XY 3b74: 5a 2e 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e Z. Rotate the kn 3b84: 6f 62 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 5a ob to move the Z 3b94: 20 63 61 72 72 69 61 67 65 20 75 70 20 74 6f 20 carriage up to 3ba4: 74 68 65 20 65 6e 64 20 73 74 6f 70 70 65 72 73 the end stoppers 3bb4: 2e 20 43 6c 69 63 6b 20 77 68 65 6e 20 64 6f 6e . Click when don 3bc4: 65 2e 00 e.. 00003bc7 : 3bc7: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 2e ..Calibrating Z. 3bd7: 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e 6f 62 Rotate the knob 3be7: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 5a 20 63 to move the Z c 3bf7: 61 72 72 69 61 67 65 20 75 70 20 74 6f 20 74 68 arriage up to th 3c07: 65 20 65 6e 64 20 73 74 6f 70 70 65 72 73 2e 20 e end stoppers. 3c17: 43 6c 69 63 6b 20 77 68 65 6e 20 64 6f 6e 65 2e Click when done. ... 00003c28 : 3c28: ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 ..PINDA calibrat 3c38: 69 6f 6e 20 66 61 69 6c 65 64 00 ion failed. 00003c43 : 3c43: ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 ..PINDA calibrat 3c53: 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20 ion is finished 3c63: 61 6e 64 20 61 63 74 69 76 65 2e 20 49 74 20 63 and active. It c 3c73: 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 69 an be disabled i 3c83: 6e 20 6d 65 6e 75 20 53 65 74 74 69 6e 67 73 2d n menu Settings- 3c93: 3e 50 49 4e 44 41 20 63 61 6c 2e 00 >PINDA cal.. 00003c9f : 3c9f: ff ff 45 78 74 72 75 64 65 72 00 ..Extruder. 00003caa : 3caa: ff ff 4d 6f 76 65 20 5a 00 ..Move Z. 00003cb3 : 3cb3: ff ff 4d 6f 76 65 20 59 00 ..Move Y. 00003cbc : 3cbc: ff ff 4d 6f 76 65 20 58 00 ..Move X. 00003cc5 : 3cc5: ff ff 53 68 65 65 74 20 25 2e 37 73 0a 5a 20 6f ..Sheet %.7s.Z o 3cd5: 66 66 73 65 74 3a 20 25 2b 31 2e 33 66 6d 6d 0a ffset: %+1.3fmm. 3ce5: 25 63 43 6f 6e 74 69 6e 75 65 0a 25 63 52 65 73 %cContinue.%cRes 3cf5: 65 74 00 et. 00003cf8 : 3cf8: ff ff 50 6c 65 61 73 65 20 6c 6f 61 64 20 66 69 ..Please load fi 3d08: 6c 61 6d 65 6e 74 20 66 69 72 73 74 2e 00 lament first.. 00003d16 : 3d16: ff ff 53 65 6c 65 63 74 20 66 69 6c 61 6d 65 6e ..Select filamen 3d26: 74 3a 00 t:. 00003d29 : 3d29: ff ff 43 61 6e 63 65 6c 00 ..Cancel. 00003d32 : 3d32: ff ff 52 75 6e 6e 69 6e 67 20 57 69 7a 61 72 64 ..Running Wizard 3d42: 20 77 69 6c 6c 20 64 65 6c 65 74 65 20 63 75 72 will delete cur 3d52: 72 65 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e rent calibration 3d62: 20 72 65 73 75 6c 74 73 20 61 6e 64 20 73 74 61 results and sta 3d72: 72 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 rt from the begi 3d82: 6e 6e 69 6e 67 2e 00 nning.. 00003d89 : 3d89: ff ff 50 72 65 68 65 61 74 69 6e 67 20 6e 6f 7a ..Preheating noz 3d99: 7a 6c 65 2e 20 50 6c 65 61 73 65 20 77 61 69 74 zle. Please wait 3da9: 2e 00 .. 00003dab : 3dab: ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20 ..Please insert 3dbb: 66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68 filament into th 3dcb: 65 20 65 78 74 72 75 64 65 72 2c 20 74 68 65 6e e extruder, then 3ddb: 20 70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 20 press the knob 3deb: 74 6f 20 6c 6f 61 64 20 69 74 2e 00 to load it.. 00003df7 : 3df7: ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20 ..Please insert 3e07: 66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68 filament into th 3e17: 65 20 66 69 72 73 74 20 74 75 62 65 20 6f 66 20 e first tube of 3e27: 74 68 65 20 4d 4d 55 2c 20 74 68 65 6e 20 70 72 the MMU, then pr 3e37: 65 73 73 20 74 68 65 20 6b 6e 6f 62 20 74 6f 20 ess the knob to 3e47: 6c 6f 61 64 20 69 74 2e 00 load it.. 00003e50 : 3e50: ff ff 54 68 65 20 70 72 69 6e 74 65 72 20 77 69 ..The printer wi 3e60: 6c 6c 20 73 74 61 72 74 20 70 72 69 6e 74 69 6e ll start printin 3e70: 67 20 61 20 7a 69 67 2d 7a 61 67 20 6c 69 6e 65 g a zig-zag line 3e80: 2e 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e 6f . Rotate the kno 3e90: 62 20 75 6e 74 69 6c 20 79 6f 75 20 72 65 61 63 b until you reac 3ea0: 68 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 68 65 h the optimal he 3eb0: 69 67 68 74 2e 20 43 68 65 63 6b 20 74 68 65 20 ight. Check the 3ec0: 70 69 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 pictures in the 3ed0: 68 61 6e 64 62 6f 6f 6b 20 28 43 61 6c 69 62 72 handbook (Calibr 3ee0: 61 74 69 6f 6e 20 63 68 61 70 74 65 72 29 2e 00 ation chapter).. 00003ef0 : 3ef0: ff ff 53 65 6c 65 63 74 20 74 65 6d 70 65 72 61 ..Select tempera 3f00: 74 75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68 ture which match 3f10: 65 73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c es your material 3f20: 2e 00 .. 00003f22 : 3f22: ff ff 53 65 6c 65 63 74 20 61 20 66 69 6c 61 6d ..Select a filam 3f32: 65 6e 74 20 66 6f 72 20 74 68 65 20 46 69 72 73 ent for the Firs 3f42: 74 20 4c 61 79 65 72 20 43 61 6c 69 62 72 61 74 t Layer Calibrat 3f52: 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 20 69 ion and select i 3f62: 74 20 69 6e 20 74 68 65 20 6f 6e 2d 73 63 72 65 t in the on-scre 3f72: 65 6e 20 6d 65 6e 75 2e 00 en menu.. 00003f7b : 3f7b: ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 63 61 6c ..Now I will cal 3f8b: 69 62 72 61 74 65 20 64 69 73 74 61 6e 63 65 20 ibrate distance 3f9b: 62 65 74 77 65 65 6e 20 74 69 70 20 6f 66 20 74 between tip of t 3fab: 68 65 20 6e 6f 7a 7a 6c 65 20 61 6e 64 20 68 65 he nozzle and he 3fbb: 61 74 62 65 64 20 73 75 72 66 61 63 65 2e 00 atbed surface.. 00003fca : 3fca: ff ff 5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 ..Z calibration 3fda: 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 20 52 75 6e recommended. Run 3fea: 20 69 74 20 6e 6f 77 3f 00 it now?. 00003ff3 : 3ff3: ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20 ..Please remove 4003: 73 74 65 65 6c 20 73 68 65 65 74 20 66 72 6f 6d steel sheet from 4013: 20 68 65 61 74 62 65 64 2e 00 heatbed.. 0000401d : 401d: ff ff 49 73 20 73 74 65 65 6c 20 73 68 65 65 74 ..Is steel sheet 402d: 20 6f 6e 20 68 65 61 74 62 65 64 3f 00 on heatbed?. 0000403a : 403a: ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 20 6f ..Please check o 404a: 75 72 20 68 61 6e 64 62 6f 6f 6b 20 61 6e 64 20 ur handbook and 405a: 66 69 78 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e fix the problem. 406a: 20 54 68 65 6e 20 72 65 73 75 6d 65 20 74 68 65 Then resume the 407a: 20 57 69 7a 61 72 64 20 62 79 20 72 65 62 6f 6f Wizard by reboo 408a: 74 69 6e 67 20 74 68 65 20 70 72 69 6e 74 65 72 ting the printer 409a: 2e 00 .. 0000409c : 409c: ff ff 41 6c 6c 20 69 73 20 64 6f 6e 65 2e 20 48 ..All is done. H 40ac: 61 70 70 79 20 70 72 69 6e 74 69 6e 67 21 00 appy printing!. 000040bb : 40bb: ff ff 59 6f 75 20 63 61 6e 20 61 6c 77 61 79 73 ..You can always 40cb: 20 72 65 73 75 6d 65 20 74 68 65 20 57 69 7a 61 resume the Wiza 40db: 72 64 20 66 72 6f 6d 20 43 61 6c 69 62 72 61 74 rd from Calibrat 40eb: 69 6f 6e 20 2d 3e 20 57 69 7a 61 72 64 2e 00 ion -> Wizard.. 000040fa : 40fa: ff ff 49 66 20 79 6f 75 20 68 61 76 65 20 61 64 ..If you have ad 410a: 64 69 74 69 6f 6e 61 6c 20 73 74 65 65 6c 20 73 ditional steel s 411a: 68 65 65 74 73 2c 20 63 61 6c 69 62 72 61 74 65 heets, calibrate 412a: 20 74 68 65 69 72 20 70 72 65 73 65 74 73 20 69 their presets i 413a: 6e 20 53 65 74 74 69 6e 67 73 20 2d 20 48 57 20 n Settings - HW 414a: 53 65 74 75 70 20 2d 20 53 74 65 65 6c 20 73 68 Setup - Steel sh 415a: 65 65 74 73 2e 00 eets.. 00004160 : 4160: ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 68 ..Please clean h 4170: 65 61 74 62 65 64 20 61 6e 64 20 74 68 65 6e 20 eatbed and then 4180: 70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 2e 00 press the knob.. 00004190 : 4190: ff ff 44 6f 20 79 6f 75 20 77 61 6e 74 20 74 6f ..Do you want to 41a0: 20 72 65 70 65 61 74 20 6c 61 73 74 20 73 74 65 repeat last ste 41b0: 70 20 74 6f 20 72 65 61 64 6a 75 73 74 20 64 69 p to readjust di 41c0: 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 6e stance between n 41d0: 6f 7a 7a 6c 65 20 61 6e 64 20 68 65 61 74 62 65 ozzle and heatbe 41e0: 64 3f 00 d?. 000041e3 : 41e3: ff ff 53 65 6c 65 63 74 20 6e 6f 7a 7a 6c 65 20 ..Select nozzle 41f3: 70 72 65 68 65 61 74 20 74 65 6d 70 65 72 61 74 preheat temperat 4203: 75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68 65 ure which matche 4213: 73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c 2e s your material. ... 00004224 : 4224: ff ff 49 73 20 66 69 6c 61 6d 65 6e 74 20 6c 6f ..Is filament lo 4234: 61 64 65 64 3f 00 aded?. 0000423a : 423a: ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 70 72 65 ..Now I will pre 424a: 68 65 61 74 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20 heat nozzle for 425a: 50 4c 41 2e 00 PLA.. 0000425f : 425f: ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 7a 20 63 ..I will run z c 426f: 61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77 2e 00 alibration now.. 0000427f : 427f: ff ff 4e 6f 77 20 72 65 6d 6f 76 65 20 74 68 65 ..Now remove the 428f: 20 74 65 73 74 20 70 72 69 6e 74 20 66 72 6f 6d test print from 429f: 20 73 74 65 65 6c 20 73 68 65 65 74 2e 00 steel sheet.. 000042ad : 42ad: ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20 ..Please remove 42bd: 73 68 69 70 70 69 6e 67 20 68 65 6c 70 65 72 73 shipping helpers 42cd: 20 66 69 72 73 74 2e 00 first.. 000042d5 : 42d5: ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 78 79 7a ..I will run xyz 42e5: 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77 calibration now 42f5: 2e 20 49 74 20 77 69 6c 6c 20 74 61 6b 65 20 75 . It will take u 4305: 70 20 74 6f 20 32 34 20 6d 69 6e 73 2e 00 p to 24 mins.. 00004313 : 4313: ff ff 46 69 72 73 74 2c 20 49 20 77 69 6c 6c 20 ..First, I will 4323: 72 75 6e 20 74 68 65 20 73 65 6c 66 74 65 73 74 run the selftest 4333: 20 74 6f 20 63 68 65 63 6b 20 6d 6f 73 74 20 63 to check most c 4343: 6f 6d 6d 6f 6e 20 61 73 73 65 6d 62 6c 79 20 70 ommon assembly p 4353: 72 6f 62 6c 65 6d 73 2e 00 roblems.. 0000435c : 435c: ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20 ..Hi, I am your 436c: 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69 Original Prusa i 437c: 33 20 70 72 69 6e 74 65 72 2e 20 57 6f 75 6c 64 3 printer. Would 438c: 20 79 6f 75 20 6c 69 6b 65 20 6d 65 20 74 6f 20 you like me to 439c: 67 75 69 64 65 20 79 6f 75 20 74 68 72 6f 75 67 guide you throug 43ac: 68 20 74 68 65 20 73 65 74 75 70 20 70 72 6f 63 h the setup proc 43bc: 65 73 73 3f 00 ess?. 000043c1 : 43c1: ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20 ..Hi, I am your 43d1: 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69 Original Prusa i 43e1: 33 20 70 72 69 6e 74 65 72 2e 20 49 20 77 69 6c 3 printer. I wil 43f1: 6c 20 67 75 69 64 65 20 79 6f 75 20 74 68 72 6f l guide you thro 4401: 75 67 68 20 61 20 73 68 6f 72 74 20 73 65 74 75 ugh a short setu 4411: 70 20 70 72 6f 63 65 73 73 2c 20 69 6e 20 77 68 p process, in wh 4421: 69 63 68 20 74 68 65 20 5a 2d 61 78 69 73 20 77 ich the Z-axis w 4431: 69 6c 6c 20 62 65 20 63 61 6c 69 62 72 61 74 65 ill be calibrate 4441: 64 2e 20 54 68 65 6e 2c 20 79 6f 75 20 77 69 6c d. Then, you wil 4451: 6c 20 62 65 20 72 65 61 64 79 20 74 6f 20 70 72 l be ready to pr 4461: 69 6e 74 2e 00 int.. 00004466 : 4466: ff ff 50 61 75 73 65 00 ..Pause. 0000446e : 446e: ff ff 46 53 20 41 63 74 69 6f 6e 00 ..FS Action. 0000447a : 447a: ff ff 43 6f 6e 74 2e 00 ..Cont.. 00004482 : 4482: ff ff 46 2e 20 6a 61 6d 20 64 65 74 65 63 74 00 ..F. jam detect. 00004492 : 4492: ff ff 46 2e 20 61 75 74 6f 6c 6f 61 64 00 ..F. autoload. 000044a0 : 44a0: ff ff 46 2e 20 72 75 6e 6f 75 74 00 ..F. runout. 000044ac : 44ac: ff ff 43 75 74 74 65 72 00 ..Cutter. 000044b5 : 44b5: ff ff 46 61 6e 20 73 70 65 65 64 00 ..Fan speed. 000044c1 : 44c1: ff ff 42 65 64 00 ..Bed. 000044c7 : 44c7: ff ff 46 61 6e 73 20 63 68 65 63 6b 00 ..Fans check. 000044d4 : 44d4: ff ff 4d 6f 64 65 6c 00 ..Model. 000044dc : 44dc: ff ff 4e 6f 7a 7a 6c 65 00 ..Nozzle. 000044e5 : 44e5: ff ff 50 6c 65 61 73 65 20 75 6e 6c 6f 61 64 20 ..Please unload 44f5: 74 68 65 20 66 69 6c 61 6d 65 6e 74 20 66 69 72 the filament fir 4505: 73 74 2c 20 74 68 65 6e 20 72 65 70 65 61 74 20 st, then repeat 4515: 74 68 69 73 20 61 63 74 69 6f 6e 2e 00 this action.. 00004522 : 4522: ff ff 43 68 65 63 6b 73 00 ..Checks. 0000452b : 452b: ff ff 4e 6f 7a 7a 6c 65 20 64 2e 00 ..Nozzle d.. 00004537 : 4537: ff ff 41 6c 70 68 61 62 65 74 00 ..Alphabet. 00004542 : 4542: ff ff 53 6f 72 74 00 ..Sort. 00004549 : 4549: ff ff 54 69 6d 65 00 ..Time. 00004550 : 4550: ff ff 4e 6f 72 6d 61 6c 00 ..Normal. 00004559 : 4559: ff ff 53 44 20 63 61 72 64 00 ..SD card. 00004563 : 4563: ff ff 53 65 6c 65 63 74 20 6c 61 6e 67 75 61 67 ..Select languag 4573: 65 00 e. 00004575 : 4575: ff ff 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 00 ..Nozzle change. 00004585 : 4585: ff ff 48 57 20 53 65 74 75 70 00 ..HW Setup. 00004590 : 4590: ff ff 4c 6f 61 64 69 6e 67 20 54 65 73 74 00 ..Loading Test. 0000459f : 459f: ff ff 44 69 73 61 62 6c 65 20 73 74 65 70 70 65 ..Disable steppe 45af: 72 73 00 rs. 000045b2 : 45b2: ff ff 4d 6f 76 65 20 61 78 69 73 00 ..Move axis. 000045be : 45be: ff ff 54 65 6d 70 65 72 61 74 75 72 65 00 ..Temperature. 000045cc : 45cc: ff ff 50 49 4e 44 41 20 63 61 6c 2e 00 ..PINDA cal.. 000045d9 : 45d9: ff ff 52 65 73 65 74 20 58 59 5a 20 63 61 6c 69 ..Reset XYZ cali 45e9: 62 72 2e 00 br.. 000045ed : 45ed: ff ff 53 68 6f 77 20 65 6e 64 20 73 74 6f 70 73 ..Show end stops ... 000045fe : 45fe: ff ff 50 49 44 20 63 61 6c 69 62 72 61 74 69 6f ..PID calibratio 460e: 6e 00 n. 00004610 : 4610: ff ff 42 65 64 20 6c 65 76 65 6c 20 63 6f 72 72 ..Bed level corr 4620: 65 63 74 00 ect. 00004624 : 4624: ff ff 4d 65 73 68 20 42 65 64 20 4c 65 76 65 6c ..Mesh Bed Level 4634: 69 6e 67 00 ing. 00004638 : 4638: ff ff 43 61 6c 69 62 72 61 74 65 20 5a 00 ..Calibrate Z. 00004646 : 4646: ff ff 43 61 6c 69 62 72 61 74 65 20 58 59 5a 00 ..Calibrate XYZ. 00004656 : 4656: ff ff 53 65 6c 66 74 65 73 74 00 ..Selftest. 00004661 : 4661: ff ff 57 69 7a 61 72 64 00 ..Wizard. 0000466a : 466a: ff ff 54 65 73 74 69 6e 67 20 66 69 6c 61 6d 65 ..Testing filame 467a: 6e 74 00 nt. 0000467d : 467d: ff ff 4c 6f 61 64 20 41 6c 6c 00 ..Load All. 00004688 : 4688: ff ff 50 6c 65 61 73 65 20 70 75 6c 6c 20 6f 75 ..Please pull ou 4698: 74 20 66 69 6c 61 6d 65 6e 74 20 69 6d 6d 65 64 t filament immed 46a8: 69 61 74 65 6c 79 00 iately. 000046af : 46af: ff ff 52 65 73 65 74 00 ..Reset. 000046b7 : 46b7: ff ff 52 65 6e 61 6d 65 00 ..Rename. 000046c0 : 46c0: ff ff 46 69 72 73 74 20 6c 61 79 65 72 20 63 61 ..First layer ca 46d0: 6c 2e 00 l.. 000046d3 : 46d3: ff ff 53 65 6c 65 63 74 00 ..Select. 000046dc : 46dc: ff ff 53 74 65 65 6c 20 73 68 65 65 74 73 00 ..Steel sheets. 000046eb : 46eb: ff ff 53 75 70 70 6f 72 74 00 ..Support. 000046f5 : 46f5: ff ff 46 61 69 6c 20 73 74 61 74 73 20 4d 4d 55 ..Fail stats MMU ... 00004706 : 4706: ff ff 46 61 69 6c 20 73 74 61 74 73 00 ..Fail stats. 00004713 : 4713: ff ff 53 74 61 74 69 73 74 69 63 73 00 ..Statistics. 00004720 : 4720: ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 00 ..Calibration. 0000472e : 472e: ff ff 41 75 74 6f 4c 6f 61 64 20 66 69 6c 61 6d ..AutoLoad filam 473e: 65 6e 74 00 ent. 00004742 : 4742: ff ff 4c 6f 61 64 20 66 69 6c 61 6d 65 6e 74 00 ..Load filament. 00004752 : 4752: ff ff 55 6e 6c 6f 61 64 20 66 69 6c 61 6d 65 6e ..Unload filamen 4762: 74 00 t. 00004764 : 4764: ff ff 4c 6f 61 64 20 74 6f 20 6e 6f 7a 7a 6c 65 ..Load to nozzle ... 00004775 : 4775: ff ff 50 72 65 6c 6f 61 64 20 74 6f 20 4d 4d 55 ..Preload to MMU ... 00004786 : 4786: ff ff 4e 6f 20 53 44 20 63 61 72 64 00 ..No SD card. 00004793 : 4793: ff ff 50 72 69 6e 74 20 66 72 6f 6d 20 53 44 00 ..Print from SD. 000047a3 : 47a3: ff ff 52 65 73 75 6d 65 20 70 72 69 6e 74 00 ..Resume print. 000047b2 : 47b2: ff ff 50 61 75 73 65 20 70 72 69 6e 74 00 ..Pause print. 000047c0 : 47c0: ff ff 53 65 74 20 52 65 61 64 79 00 ..Set Ready. 000047cc : 47cc: ff ff 53 65 74 20 6e 6f 74 20 52 65 61 64 79 00 ..Set not Ready. 000047dc : 47dc: ff ff 50 72 65 68 65 61 74 00 ..Preheat. 000047e6 : 47e6: ff ff 54 75 6e 65 00 ..Tune. 000047ed : 47ed: ff ff 4c 69 76 65 20 61 64 6a 75 73 74 20 5a 00 ..Live adjust Z. 000047fd : 47fd: ff ff 52 65 70 72 69 6e 74 00 ..Reprint. 00004807 : 4807: ff ff 49 6e 66 6f 20 73 63 72 65 65 6e 00 ..Info screen. 00004815 : 4815: ff ff 41 73 73 69 73 74 00 ..Assist. 0000481e : 481e: ff ff 4f 6e 63 65 00 ..Once. 00004825 : 4825: ff ff 53 6f 75 6e 64 00 ..Sound. 0000482d : 482d: ff ff 4c 6f 75 64 00 ..Loud. 00004834 : 4834: ff ff 46 69 6c 2e 20 73 65 6e 73 6f 72 00 ..Fil. sensor. 00004842 : 4842: ff ff 43 68 61 6e 67 65 20 66 69 6c 61 6d 65 6e ..Change filamen 4852: 74 00 t. 00004854 : 4854: ff ff 46 6c 6f 77 00 ..Flow. 0000485b : 485b: ff ff 53 70 65 65 64 00 ..Speed. 00004863 : 4863: ff ff 4d 61 67 6e 65 74 73 20 63 6f 6d 70 2e 00 ..Magnets comp.. 00004873 : 4873: ff ff 4e 2f 41 00 ..N/A. 00004879 : 4879: ff ff 5a 2d 70 72 6f 62 65 20 6e 72 2e 00 ..Z-probe nr.. 00004887 : 4887: ff ff 4d 65 73 68 00 ..Mesh. 0000488e : 488e: ff ff 53 65 74 74 69 6e 67 73 00 ..Settings. 00004899 : 4899: ff ff 59 65 73 00 ..Yes. 0000489f : 489f: ff ff 4e 6f 00 ..No. 000048a4 : 48a4: ff ff 53 74 6f 70 20 70 72 69 6e 74 00 ..Stop print. 000048b1 : 48b1: ff ff 43 68 65 63 6b 69 6e 67 20 66 69 6c 65 00 ..Checking file. 000048c1 : 48c1: ff ff 46 69 6c 65 20 69 6e 63 6f 6d 70 6c 65 74 ..File incomplet 48d1: 65 2e 00 e.. 000048d4 : 48d4: ff ff 84 52 65 66 72 65 73 68 00 ...Refresh. 000048df : 48df: ff ff 4d 61 69 6e 00 ..Main. 000048e6 : 48e6: ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 6e 6f ..Waiting for no 48f6: 7a 7a 6c 65 20 61 6e 64 20 62 65 64 20 63 6f 6f zzle and bed coo 4906: 6c 69 6e 67 00 ling. 0000490b : 490b: ff ff 53 65 6c 66 74 65 73 74 20 4f 4b 00 ..Selftest OK. 00004919 : 4919: ff ff 53 65 6c 66 74 65 73 74 20 73 74 61 72 74 ..Selftest start ... 0000492a : 492a: ff ff 53 77 61 70 70 65 64 00 ..Swapped. 00004934 : 4934: ff ff 46 72 6f 6e 74 2f 6c 65 66 74 20 66 61 6e ..Front/left fan 4944: 73 00 s. 00004946 : 4946: ff ff 41 78 69 73 00 ..Axis. 0000494d : 494d: ff ff 41 78 69 73 20 6c 65 6e 67 74 68 00 ..Axis length. 0000495b : 495b: ff ff 4c 6f 6f 73 65 20 70 75 6c 6c 65 79 00 ..Loose pulley. 0000496a : 496a: ff ff 45 6e 64 73 74 6f 70 20 6e 6f 74 20 68 69 ..Endstop not hi 497a: 74 00 t. 0000497c : 497c: ff ff 45 6e 64 73 74 6f 70 00 ..Endstop. 00004986 : 4986: ff ff 4d 6f 74 6f 72 00 ..Motor. 0000498e : 498e: ff ff 45 6e 64 73 74 6f 70 73 00 ..Endstops. 00004999 : 4999: ff ff 57 69 72 69 6e 67 20 65 72 72 6f 72 00 ..Wiring error. 000049a8 : 49a8: ff ff 42 65 64 2f 48 65 61 74 65 72 00 ..Bed/Heater. 000049b5 : 49b5: ff ff 4e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 00 ..Not connected. 000049c5 : 49c5: ff ff 48 65 61 74 65 72 2f 54 68 65 72 6d 69 73 ..Heater/Thermis 49d5: 74 6f 72 00 tor. 000049d9 : 49d9: ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 3a 00 ..Please check:. 000049e9 : 49e9: ff ff 53 65 6c 66 74 65 73 74 20 65 72 72 6f 72 ..Selftest error 49f9: 21 00 !. 000049fb : 49fb: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 4a0b: 72 00 r. 00004a0d : 4a0d: ff ff 50 72 69 6e 74 20 66 61 6e 3a 00 ..Print fan:. 00004a1a : 4a1a: ff ff 48 6f 74 65 6e 64 20 66 61 6e 3a 00 ..Hotend fan:. 00004a28 : 4a28: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 68 6f ..Calibrating ho 4a38: 6d 65 00 me. 00004a3b : 4a3b: ff ff 53 65 6c 66 74 65 73 74 20 66 61 69 6c 65 ..Selftest faile 4a4b: 64 00 d. 00004a4d : 4a4d: ff ff 41 6c 6c 20 63 6f 72 72 65 63 74 00 ..All correct. 00004a5b : 4a5b: ff ff 43 68 65 63 6b 69 6e 67 20 73 65 6e 73 6f ..Checking senso 4a6b: 72 73 00 rs. 00004a6e : 4a6e: ff ff 43 68 65 63 6b 69 6e 67 20 68 6f 74 65 6e ..Checking hoten 4a7e: 64 00 d. 00004a80 : 4a80: ff ff 43 68 65 63 6b 69 6e 67 20 62 65 64 00 ..Checking bed. 00004a8f : 4a8f: ff ff 43 68 65 63 6b 69 6e 67 20 5a 20 61 78 69 ..Checking Z axi 4a9f: 73 00 s. 00004aa1 : 4aa1: ff ff 43 68 65 63 6b 69 6e 67 20 59 20 61 78 69 ..Checking Y axi 4ab1: 73 00 s. 00004ab3 : 4ab3: ff ff 43 68 65 63 6b 69 6e 67 20 58 20 61 78 69 ..Checking X axi 4ac3: 73 00 s. 00004ac5 : 4ac5: ff ff 43 68 65 63 6b 69 6e 67 20 65 6e 64 73 74 ..Checking endst 4ad5: 6f 70 73 00 ops. 00004ad9 : 4ad9: ff ff 43 61 72 64 20 72 65 6d 6f 76 65 64 00 ..Card removed. 00004ae8 : 4ae8: ff ff 42 61 63 6b 00 ..Back. 00004aef : 4aef: ff ff 41 75 74 6f 20 70 6f 77 65 72 00 ..Auto power. 00004afc : 4afc: ff ff 53 69 6c 65 6e 74 00 ..Silent. 00004b05 : 4b05: ff ff 4d 6f 64 65 00 ..Mode. 00004b0c : 4b0c: ff ff 48 69 67 68 20 70 6f 77 65 72 00 ..High power. 00004b19 : 4b19: ff ff 53 74 72 69 63 74 00 ..Strict. 00004b22 : 4b22: ff ff 57 61 72 6e 00 ..Warn. 00004b29 : 4b29: ff ff 4e 6f 6e 65 00 ..None. 00004b30 : 4b30: ff ff 48 6f 74 65 6e 64 20 61 74 20 32 38 30 43 ..Hotend at 280C 4b40: 21 20 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 64 ! Nozzle changed 4b50: 20 61 6e 64 20 74 69 67 68 74 65 6e 65 64 20 74 and tightened t 4b60: 6f 20 73 70 65 63 73 3f 00 o specs?. 00004b69 : 4b69: ff ff 46 6f 72 20 61 20 4e 6f 7a 7a 6c 65 20 63 ..For a Nozzle c 4b79: 68 61 6e 67 65 20 70 6c 65 61 73 65 20 72 65 61 hange please rea 4b89: 64 0a 70 72 75 73 61 2e 69 6f 2f 6e 6f 7a 7a 6c d.prusa.io/nozzl 4b99: 65 2d 6d 6b 33 73 00 e-mk3s. 00004ba0 : 4ba0: ff ff 50 49 44 20 63 61 6c 2e 20 66 69 6e 69 73 ..PID cal. finis 4bb0: 68 65 64 00 hed. 00004bb4 : 4bb4: ff ff 50 49 44 20 63 61 6c 2e 00 ..PID cal.. 00004bbf : 4bbf: ff ff 50 72 69 6e 74 20 70 61 75 73 65 64 00 ..Print paused. 00004bce : 4bce: ff ff 50 72 69 6e 74 20 61 62 6f 72 74 65 64 00 ..Print aborted. 00004bde : 4bde: ff ff 43 6f 70 79 20 73 65 6c 65 63 74 65 64 20 ..Copy selected 4bee: 6c 61 6e 67 75 61 67 65 3f 00 language?. 00004bf8 : 4bf8: ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65 ..Nozzle diamete 4c08: 72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 r differs from t 4c18: 68 65 20 47 2d 63 6f 64 65 2e 00 he G-code.. 00004c23 : 4c23: ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65 ..Nozzle diamete 4c33: 72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 r differs from t 4c43: 68 65 20 47 2d 63 6f 64 65 2e 20 50 6c 65 61 73 he G-code. Pleas 4c53: 65 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 e check the valu 4c63: 65 20 69 6e 20 73 65 74 74 69 6e 67 73 2e 00 e in settings.. 00004c72 : 4c72: ff ff 54 68 65 72 65 20 69 73 20 6e 6f 20 66 69 ..There is no fi 4c82: 6c 61 6d 65 6e 74 20 6c 6f 61 64 65 64 2e 00 lament loaded.. 00004c91 : 4c91: ff ff 54 68 65 72 65 20 69 73 20 73 74 69 6c 6c ..There is still 4ca1: 20 61 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 a need to make 4cb1: 5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 20 50 Z calibration. P 4cc1: 6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65 lease follow the 4cd1: 20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72 manual, chapter 4ce1: 20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65 First steps, se 4cf1: 63 74 69 6f 6e 20 43 61 6c 69 62 72 61 74 69 6f ction Calibratio 4d01: 6e 20 66 6c 6f 77 2e 00 n flow.. 00004d09 : 4d09: ff ff 50 72 69 6e 74 65 72 20 68 61 73 20 6e 6f ..Printer has no 4d19: 74 20 62 65 65 6e 20 63 61 6c 69 62 72 61 74 65 t been calibrate 4d29: 64 20 79 65 74 2e 20 50 6c 65 61 73 65 20 66 6f d yet. Please fo 4d39: 6c 6c 6f 77 20 74 68 65 20 6d 61 6e 75 61 6c 2c llow the manual, 4d49: 20 63 68 61 70 74 65 72 20 46 69 72 73 74 20 73 chapter First s 4d59: 74 65 70 73 2c 20 73 65 63 74 69 6f 6e 20 43 61 teps, section Ca 4d69: 6c 69 62 72 61 74 69 6f 6e 20 66 6c 6f 77 2e 00 libration flow.. 00004d79 : 4d79: ff ff 53 65 6c 66 74 65 73 74 20 77 69 6c 6c 20 ..Selftest will 4d89: 62 65 20 72 75 6e 20 74 6f 20 63 61 6c 69 62 72 be run to calibr 4d99: 61 74 65 20 61 63 63 75 72 61 74 65 20 73 65 6e ate accurate sen 4da9: 73 6f 72 6c 65 73 73 20 72 65 68 6f 6d 69 6e 67 sorless rehoming 4db9: 2e 00 .. 00004dbb : 4dbb: ff ff 4f 6c 64 20 73 65 74 74 69 6e 67 73 20 66 ..Old settings f 4dcb: 6f 75 6e 64 2e 20 44 65 66 61 75 6c 74 20 50 49 ound. Default PI 4ddb: 44 2c 20 45 73 74 65 70 73 20 65 74 63 2e 20 77 D, Esteps etc. w 4deb: 69 6c 6c 20 62 65 20 73 65 74 2e 00 ill be set.. 00004df7 : 4df7: ff ff 57 61 72 6e 69 6e 67 3a 20 62 6f 74 68 20 ..Warning: both 4e07: 70 72 69 6e 74 65 72 20 74 79 70 65 20 61 6e 64 printer type and 4e17: 20 6d 6f 74 68 65 72 62 6f 61 72 64 20 74 79 70 motherboard typ 4e27: 65 20 63 68 61 6e 67 65 64 2e 00 e changed.. 00004e32 : 4e32: ff ff 57 61 72 6e 69 6e 67 3a 20 70 72 69 6e 74 ..Warning: print 4e42: 65 72 20 74 79 70 65 20 63 68 61 6e 67 65 64 2e er type changed. ... 00004e53 : 4e53: ff ff 57 61 72 6e 69 6e 67 3a 20 6d 6f 74 68 65 ..Warning: mothe 4e63: 72 62 6f 61 72 64 20 74 79 70 65 20 63 68 61 6e rboard type chan 4e73: 67 65 64 2e 00 ged.. 00004e78 : 4e78: ff ff 53 68 65 65 74 00 ..Sheet. 00004e80 : 4e80: ff ff 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 ..Unexpected err 4e90: 6f 72 20 6f 63 63 75 72 72 65 64 2e 00 or occurred.. 00004e9d : 4e9d: ff ff 4d 36 30 30 20 46 69 6c 61 6d 65 6e 74 20 ..M600 Filament 4ead: 43 68 61 6e 67 65 2e 20 4c 6f 61 64 20 61 20 6e Change. Load a n 4ebd: 65 77 20 66 69 6c 61 6d 65 6e 74 20 6f 72 20 65 ew filament or e 4ecd: 6a 65 63 74 20 74 68 65 20 6f 6c 64 20 6f 6e 65 ject the old one 4edd: 2e 00 .. 00004edf : 4edf: ff ff 52 65 6d 6f 76 65 20 74 68 65 20 65 6a 65 ..Remove the eje 4eef: 63 74 65 64 20 66 69 6c 61 6d 65 6e 74 20 66 72 cted filament fr 4eff: 6f 6d 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 om the front of 4f0f: 74 68 65 20 4d 4d 55 2e 00 the MMU.. 00004f18 : 4f18: ff ff 46 69 6c 61 6d 65 6e 74 20 64 65 74 65 63 ..Filament detec 4f28: 74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c 79 ted unexpectedly 4f38: 2e 20 45 6e 73 75 72 65 20 6e 6f 20 66 69 6c 61 . Ensure no fila 4f48: 6d 65 6e 74 20 69 73 20 6c 6f 61 64 65 64 2e 20 ment is loaded. 4f58: 43 68 65 63 6b 20 74 68 65 20 73 65 6e 73 6f 72 Check the sensor 4f68: 73 20 61 6e 64 20 77 69 72 69 6e 67 2e 00 s and wiring.. 00004f76 : 4f76: ff ff 49 6e 74 65 72 6e 61 6c 20 72 75 6e 74 69 ..Internal runti 4f86: 6d 65 20 65 72 72 6f 72 2e 20 54 72 79 20 72 65 me error. Try re 4f96: 73 65 74 74 69 6e 67 20 74 68 65 20 4d 4d 55 20 setting the MMU 4fa6: 6f 72 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 or updating the 4fb6: 66 69 72 6d 77 61 72 65 2e 00 firmware.. 00004fc0 : 4fc0: ff ff 4d 4d 55 20 46 57 20 76 65 72 73 69 6f 6e ..MMU FW version 4fd0: 20 69 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 is incompatible 4fe0: 20 77 69 74 68 20 70 72 69 6e 74 65 72 20 46 57 with printer FW 4ff0: 2e 55 70 64 61 74 65 20 74 6f 20 76 65 72 73 69 .Update to versi 5000: 6f 6e 20 33 2e 30 2e 33 2e 00 on 3.0.3.. 0000500a : 500a: ff ff 4d 4d 55 20 46 69 72 6d 77 61 72 65 20 69 ..MMU Firmware i 501a: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 2c 20 70 nternal error, p 502a: 6c 65 61 73 65 20 72 65 73 65 74 20 74 68 65 20 lease reset the 503a: 4d 4d 55 2e 00 MMU.. 0000503f : 503f: ff ff 52 65 71 75 65 73 74 65 64 20 66 69 6c 61 ..Requested fila 504f: 6d 65 6e 74 20 74 6f 6f 6c 20 69 73 20 6e 6f 74 ment tool is not 505f: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 available on th 506f: 69 73 20 68 61 72 64 77 61 72 65 2e 20 43 68 65 is hardware. Che 507f: 63 6b 20 74 68 65 20 47 2d 63 6f 64 65 20 66 6f ck the G-code fo 508f: 72 20 74 6f 6f 6c 20 69 6e 64 65 78 20 6f 75 74 r tool index out 509f: 20 6f 66 20 72 61 6e 67 65 20 28 54 30 2d 54 34 of range (T0-T4 50af: 29 2e 00 ).. 000050b2 : 50b2: ff ff 43 61 6e 6e 6f 74 20 70 65 72 66 6f 72 6d ..Cannot perform 50c2: 20 74 68 65 20 61 63 74 69 6f 6e 2c 20 66 69 6c the action, fil 50d2: 61 6d 65 6e 74 20 69 73 20 61 6c 72 65 61 64 79 ament is already 50e2: 20 6c 6f 61 64 65 64 2e 20 55 6e 6c 6f 61 64 20 loaded. Unload 50f2: 69 74 20 66 69 72 73 74 2e 00 it first.. 000050fc : 50fc: ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e ..MMU not respon 510c: 64 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20 ding correctly. 511c: 43 68 65 63 6b 20 74 68 65 20 77 69 72 69 6e 67 Check the wiring 512c: 20 61 6e 64 20 63 6f 6e 6e 65 63 74 6f 72 73 2e and connectors. ... 0000513d : 513d: ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e ..MMU not respon 514d: 64 69 6e 67 2e 20 43 68 65 63 6b 20 74 68 65 20 ding. Check the 515d: 77 69 72 69 6e 67 20 61 6e 64 20 63 6f 6e 6e 65 wiring and conne 516d: 63 74 6f 72 73 2e 00 ctors.. 00005174 : 5174: ff ff 4d 6f 72 65 20 64 65 74 61 69 6c 73 20 6f ..More details o 5184: 6e 6c 69 6e 65 2e 00 nline.. 0000518b : 518b: ff ff 54 68 65 20 49 64 6c 65 72 20 63 61 6e 6e ..The Idler cann 519b: 6f 74 20 68 6f 6d 65 20 70 72 6f 70 65 72 6c 79 ot home properly 51ab: 2e 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 79 74 . Check for anyt 51bb: 68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 69 74 hing blocking it 51cb: 73 20 6d 6f 76 65 6d 65 6e 74 2e 00 s movement.. 000051d7 : 51d7: ff ff 43 61 6e 27 74 20 6d 6f 76 65 20 53 65 6c ..Can't move Sel 51e7: 65 63 74 6f 72 20 6f 72 20 49 64 6c 65 72 2e 00 ector or Idler.. 000051f7 : 51f7: ff ff 54 68 65 20 53 65 6c 65 63 74 6f 72 20 63 ..The Selector c 5207: 61 6e 6e 6f 74 20 68 6f 6d 65 20 70 72 6f 70 65 annot home prope 5217: 72 6c 79 2e 20 43 68 65 63 6b 20 66 6f 72 20 61 rly. Check for a 5227: 6e 79 74 68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 nything blocking 5237: 20 69 74 73 20 6d 6f 76 65 6d 65 6e 74 2e 00 its movement.. 00005246 : 5246: ff ff 4c 6f 61 64 69 6e 67 20 74 6f 20 65 78 74 ..Loading to ext 5256: 72 75 64 65 72 20 66 61 69 6c 65 64 2e 20 49 6e ruder failed. In 5266: 73 70 65 63 74 20 74 68 65 20 66 69 6c 61 6d 65 spect the filame 5276: 6e 74 20 74 69 70 20 73 68 61 70 65 2e 20 52 65 nt tip shape. Re 5286: 66 69 6e 65 20 74 68 65 20 73 65 6e 73 6f 72 20 fine the sensor 5296: 63 61 6c 69 62 72 61 74 69 6f 6e 2c 20 69 66 20 calibration, if 52a6: 6e 65 65 64 65 64 2e 00 needed.. 000052ae : 52ae: ff ff 53 65 6c 65 63 74 6f 72 20 63 61 6e 27 74 ..Selector can't 52be: 20 6d 6f 76 65 20 64 75 65 20 74 6f 20 46 49 4e move due to FIN 52ce: 44 41 20 64 65 74 65 63 74 69 6e 67 20 61 20 66 DA detecting a f 52de: 69 6c 61 6d 65 6e 74 2e 20 4d 61 6b 65 20 73 75 ilament. Make su 52ee: 72 65 20 6e 6f 20 66 69 6c 61 6d 65 6e 74 20 69 re no filament i 52fe: 73 20 69 6e 20 53 65 6c 65 63 74 6f 72 20 61 6e s in Selector an 530e: 64 20 46 49 4e 44 41 20 77 6f 72 6b 73 20 70 72 d FINDA works pr 531e: 6f 70 65 72 6c 79 2e 00 operly.. 00005326 : 5326: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 5336: 72 20 74 72 69 67 67 65 72 65 64 20 74 6f 6f 20 r triggered too 5346: 65 61 72 6c 79 20 77 68 69 6c 65 20 6c 6f 61 64 early while load 5356: 69 6e 67 20 74 6f 20 65 78 74 72 75 64 65 72 2e ing to extruder. 5366: 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 6e Check there isn 5376: 27 74 20 61 6e 79 74 68 69 6e 67 20 73 74 75 63 't anything stuc 5386: 6b 20 69 6e 20 50 54 46 45 20 74 75 62 65 2e 20 k in PTFE tube. 5396: 43 68 65 63 6b 20 74 68 61 74 20 73 65 6e 73 6f Check that senso 53a6: 72 20 72 65 61 64 73 20 70 72 6f 70 65 72 6c 79 r reads properly 53b6: 2e 00 .. 000053b8 : 53b8: ff ff 50 75 6c 6c 65 79 20 6d 6f 74 6f 72 20 73 ..Pulley motor s 53c8: 74 61 6c 6c 65 64 2e 20 45 6e 73 75 72 65 20 74 talled. Ensure t 53d8: 68 65 20 70 75 6c 6c 65 79 20 63 61 6e 20 6d 6f he pulley can mo 53e8: 76 65 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 ve and check the 53f8: 20 77 69 72 69 6e 67 2e 00 wiring.. 00005401 : 5401: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 5411: 72 20 64 69 64 6e 27 74 20 73 77 69 74 63 68 20 r didn't switch 5421: 6f 66 66 20 77 68 69 6c 65 20 75 6e 6c 6f 61 64 off while unload 5431: 69 6e 67 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e ing filament. En 5441: 73 75 72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61 sure filament ca 5451: 6e 20 6d 6f 76 65 20 61 6e 64 20 74 68 65 20 73 n move and the s 5461: 65 6e 73 6f 72 20 77 6f 72 6b 73 2e 00 ensor works.. 0000546e : 546e: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 547e: 72 20 64 69 64 6e 27 74 20 74 72 69 67 67 65 72 r didn't trigger 548e: 20 77 68 69 6c 65 20 6c 6f 61 64 69 6e 67 20 74 while loading t 549e: 68 65 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e 73 he filament. Ens 54ae: 75 72 65 20 74 68 65 20 73 65 6e 73 6f 72 20 69 ure the sensor i 54be: 73 20 63 61 6c 69 62 72 61 74 65 64 20 61 6e 64 s calibrated and 54ce: 20 74 68 65 20 66 69 6c 61 6d 65 6e 74 20 72 65 the filament re 54de: 61 63 68 65 64 20 69 74 2e 00 ached it.. 000054e8 : 54e8: ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 73 ..FINDA didn't s 54f8: 77 69 74 63 68 20 6f 66 66 20 77 68 69 6c 65 20 witch off while 5508: 75 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65 unloading filame 5518: 6e 74 2e 20 54 72 79 20 75 6e 6c 6f 61 64 69 6e nt. Try unloadin 5528: 67 20 6d 61 6e 75 61 6c 6c 79 2e 20 45 6e 73 75 g manually. Ensu 5538: 72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61 6e 20 re filament can 5548: 6d 6f 76 65 20 61 6e 64 20 46 49 4e 44 41 20 77 move and FINDA w 5558: 6f 72 6b 73 2e 00 orks.. 0000555e : 555e: ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 74 ..FINDA didn't t 556e: 72 69 67 67 65 72 20 77 68 69 6c 65 20 6c 6f 61 rigger while loa 557e: 64 69 6e 67 20 74 68 65 20 66 69 6c 61 6d 65 6e ding the filamen 558e: 74 2e 20 45 6e 73 75 72 65 20 74 68 65 20 66 69 t. Ensure the fi 559e: 6c 61 6d 65 6e 74 20 63 61 6e 20 6d 6f 76 65 20 lament can move 55ae: 61 6e 64 20 46 49 4e 44 41 20 77 6f 72 6b 73 2e and FINDA works. ... 000055bf : 55bf: ff ff 44 69 73 61 62 6c 65 00 ..Disable. 000055c9 : 55c9: ff ff 53 74 6f 70 00 ..Stop. 000055d0 : 55d0: ff ff 4c 6f 61 64 00 ..Load. 000055d7 : 55d7: ff ff 55 6e 6c 6f 61 64 00 ..Unload. 000055e0 : 55e0: ff ff 52 65 73 65 74 4d 4d 55 00 ..ResetMMU. 000055eb : 55eb: ff ff 52 65 74 72 79 00 ..Retry. 000055f3 : 55f3: ff ff 53 65 6e 73 69 74 69 76 69 74 79 00 ..Sensitivity. 00005601 : 5601: ff ff 44 6f 6e 65 00 ..Done. 00005608 : 5608: ff ff 52 65 73 75 6d 69 6e 67 20 70 72 69 6e 74 ..Resuming print ... 00005619 : 5619: ff ff 50 49 4e 44 41 20 48 65 61 74 69 6e 67 00 ..PINDA Heating. 00005629 : 5629: ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 20 64 6f ..Calibration do 5639: 6e 65 00 ne. 0000563c : 563c: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 00 ..Calibrating Z. 0000564c : 564c: ff ff 42 65 64 20 64 6f 6e 65 00 ..Bed done. 00005657 : 5657: ff ff 42 65 64 20 48 65 61 74 69 6e 67 00 ..Bed Heating. 00005665 : 5665: ff ff 48 65 61 74 69 6e 67 20 64 6f 6e 65 2e 00 ..Heating done.. 00005675 : 5675: ff ff 48 65 61 74 69 6e 67 00 ..Heating. 0000567f : 567f: ff ff 54 6f 74 61 6c 00 ..Total. 00005687 : 5687: ff ff 4c 61 73 74 20 70 72 69 6e 74 00 ..Last print. 00005694 : 5694: ff ff 4d 4d 55 20 66 61 69 6c 73 00 ..MMU fails. 000056a0 : 56a0: ff ff 4d 4d 55 20 6c 6f 61 64 20 66 61 69 6c 73 ..MMU load fails ... 000056b1 : 56b1: ff ff 4d 4d 55 20 70 6f 77 65 72 20 66 61 69 6c ..MMU power fail 56c1: 73 00 s. 000056c3 : 56c3: ff ff 4d 61 74 65 72 69 61 6c 20 63 68 61 6e 67 ..Material chang 56d3: 65 73 00 es. 000056d6 : 56d6: ff ff 4c 61 73 74 20 70 72 69 6e 74 20 66 61 69 ..Last print fai 56e6: 6c 75 72 65 73 00 lures. 000056ec : 56ec: ff ff 54 6f 74 61 6c 20 66 61 69 6c 75 72 65 73 ..Total failures ... 000056fd : 56fd: ff ff 46 69 6c 2e 20 72 75 6e 6f 75 74 73 00 ..Fil. runouts. 0000570c : 570c: ff ff 54 65 6d 70 65 72 61 74 75 72 65 73 00 ..Temperatures. 0000571b : 571b: ff ff 53 65 6e 73 6f 72 20 69 6e 66 6f 00 ..Sensor info. 00005729 : 5729: ff ff 45 78 74 72 75 64 65 72 20 69 6e 66 6f 00 ..Extruder info. 00005739 : 5739: ff ff 58 59 5a 20 63 61 6c 2e 20 64 65 74 61 69 ..XYZ cal. detai 5749: 6c 73 00 ls. 0000574c : 574c: ff ff 50 72 69 6e 74 65 72 20 49 50 20 41 64 64 ..Printer IP Add 575c: 72 3a 00 r:. 0000575f : 575f: ff ff 75 6e 6b 6e 6f 77 6e 00 ..unknown. 00005769 : 5769: ff ff 4d 4d 55 20 63 6f 6e 6e 65 63 74 65 64 00 ..MMU connected. 00005779 : 5779: ff ff 44 61 74 65 3a 00 ..Date:. 00005781 : 5781: ff ff 74 6f 20 75 6e 6c 6f 61 64 20 66 69 6c 61 ..to unload fila 5791: 6d 65 6e 74 00 ment. 00005796 : 5796: ff ff 74 6f 20 6c 6f 61 64 20 66 69 6c 61 6d 65 ..to load filame 57a6: 6e 74 00 nt. 000057a9 : 57a9: ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 ..Press the knob ... 000057ba : 57ba: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 57ca: 63 75 74 00 cut. 000057ce : 57ce: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 57de: 65 6a 65 63 74 00 eject. 000057e4 : 57e4: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 57f4: 75 6e 6c 6f 61 64 00 unload. 000057fb : 57fb: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 580b: 6c 6f 61 64 00 load. 00005810 : 5810: ff ff 43 6f 6f 6c 64 6f 77 6e 00 ..Cooldown. 0000581b : 581b: ff ff 46 69 6c 61 6d 65 6e 74 20 65 78 74 72 75 ..Filament extru 582b: 64 69 6e 67 20 26 20 77 69 74 68 20 63 6f 72 72 ding & with corr 583b: 65 63 74 20 63 6f 6c 6f 72 3f 00 ect color?. 00005846 : 5846: ff ff 45 6a 65 63 74 00 ..Eject. 0000584e : 584e: ff ff 41 75 74 6f 6c 6f 61 64 69 6e 67 20 66 69 ..Autoloading fi 585e: 6c 61 6d 65 6e 74 20 69 73 20 61 63 74 69 76 65 lament is active 586e: 2c 20 6a 75 73 74 20 70 72 65 73 73 20 74 68 65 , just press the 587e: 20 6b 6e 6f 62 20 61 6e 64 20 69 6e 73 65 72 74 knob and insert 588e: 20 66 69 6c 61 6d 65 6e 74 2e 2e 2e 00 filament.... 0000589b : 589b: ff ff 54 6f 74 61 6c 20 66 69 6c 61 6d 65 6e 74 ..Total filament ... 000058ac : 58ac: ff ff 54 6f 74 61 6c 20 70 72 69 6e 74 20 74 69 ..Total print ti 58bc: 6d 65 00 me. 000058bf : 58bf: ff ff 46 69 6c 61 6d 65 6e 74 20 75 73 65 64 00 ..Filament used. 000058cf : 58cf: ff ff 50 72 69 6e 74 20 74 69 6d 65 00 ..Print time. 000058dc : 58dc: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 53 65 ..Feeding to FSe 58ec: 6e 73 6f 72 00 nsor. 000058f1 : 58f1: ff ff 4d 6f 76 69 6e 67 20 73 65 6c 65 63 74 6f ..Moving selecto 5901: 72 00 r. 00005903 : 5903: ff ff 48 6f 6d 69 6e 67 00 ..Homing. 0000590c : 590c: ff ff 52 65 74 72 61 63 74 20 66 72 6f 6d 20 46 ..Retract from F 591c: 49 4e 44 41 00 INDA. 00005921 : 5921: ff ff 45 6a 65 63 74 69 6e 67 20 66 69 6c 61 6d ..Ejecting filam 5931: 65 6e 74 00 ent. 00005935 : 5935: ff ff 50 61 72 6b 69 6e 67 20 73 65 6c 65 63 74 ..Parking select 5945: 6f 72 00 or. 00005948 : 5948: ff ff 52 65 74 75 72 6e 69 6e 67 20 73 65 6c 65 ..Returning sele 5958: 63 74 6f 72 00 ctor. 0000595d : 595d: ff ff 50 65 72 66 6f 72 6d 69 6e 67 20 63 75 74 ..Performing cut ... 0000596e : 596e: ff ff 50 75 73 68 69 6e 67 20 66 69 6c 61 6d 65 ..Pushing filame 597e: 6e 74 00 nt. 00005981 : 5981: ff ff 50 72 65 70 61 72 69 6e 67 20 62 6c 61 64 ..Preparing blad 5991: 65 00 e. 00005993 : 5993: ff ff 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 2e ..Selecting fil. 59a3: 20 73 6c 6f 74 00 slot. 000059a9 : 59a9: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61 ..Unloading fila 59b9: 6d 65 6e 74 00 ment. 000059be : 59be: ff ff 45 52 52 20 54 4d 43 20 66 61 69 6c 65 64 ..ERR TMC failed ... 000059cf : 59cf: ff ff 45 52 52 20 48 65 6c 70 20 66 69 6c 61 6d ..ERR Help filam 59df: 65 6e 74 00 ent. 000059e3 : 59e3: ff ff 45 52 52 20 49 6e 74 65 72 6e 61 6c 00 ..ERR Internal. 000059f2 : 59f2: ff ff 45 52 52 20 57 61 69 74 20 66 6f 72 20 55 ..ERR Wait for U 5a02: 73 65 72 00 ser. 00005a06 : 5a06: ff ff 46 69 6e 69 73 68 69 6e 67 20 6d 6f 76 65 ..Finishing move 5a16: 6d 65 6e 74 73 00 ments. 00005a1c : 5a1c: ff ff 41 76 6f 69 64 69 6e 67 20 67 72 69 6e 64 ..Avoiding grind ... 00005a2d : 5a2d: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 6e 6f 7a ..Feeding to noz 5a3d: 7a 6c 65 00 zle. 00005a41 : 5a41: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 65 78 74 ..Feeding to ext 5a51: 72 75 64 65 72 00 ruder. 00005a57 : 5a57: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 49 4e ..Feeding to FIN 5a67: 44 41 00 DA. 00005a6a : 5a6a: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 70 ..Unloading to p 5a7a: 75 6c 6c 65 79 00 ulley. 00005a80 : 5a80: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 46 ..Unloading to F 5a90: 49 4e 44 41 00 INDA. 00005a95 : 5a95: ff ff 44 69 73 65 6e 67 61 67 69 6e 67 20 69 64 ..Disengaging id 5aa5: 6c 65 72 00 ler. 00005aa9 : 5aa9: ff ff 45 6e 67 61 67 69 6e 67 20 69 64 6c 65 72 ..Engaging idler ... 00005aba : 5aba: ff ff 4f 4b 00 ..OK. 00005abf <_ZN4MMU2L23MSG_TITLE_UNKNOWN_ERRORE.lto_priv.483>: 5abf: ff ff 55 4e 4b 4e 4f 57 4e 20 45 52 52 4f 52 00 ..UNKNOWN ERROR. 00005acf <_ZN4MMU2L25MSG_TITLE_FILAMENT_CHANGEE.lto_priv.482>: 5acf: ff ff 46 49 4c 41 4d 45 4e 54 20 43 48 41 4e 47 ..FILAMENT CHANG 5adf: 45 00 E. 00005ae1 <_ZN4MMU2L26MSG_TITLE_FILAMENT_EJECTEDE.lto_priv.481>: 5ae1: ff ff 46 49 4c 41 4d 45 4e 54 20 45 4a 45 43 54 ..FILAMENT EJECT 5af1: 45 44 00 ED. 00005af4 <_ZN4MMU2L25MSG_TITLE_UNLOAD_MANUALLYE.lto_priv.480>: 5af4: ff ff 55 4e 4c 4f 41 44 20 4d 41 4e 55 41 4c 4c ..UNLOAD MANUALL 5b04: 59 00 Y. 00005b06 <_ZN4MMU2L26MSG_TITLE_FW_RUNTIME_ERRORE.lto_priv.479>: 5b06: ff ff 46 57 20 52 55 4e 54 49 4d 45 20 45 52 52 ..FW RUNTIME ERR 5b16: 4f 52 00 OR. 00005b19 <_ZN4MMU2L26MSG_TITLE_FW_UPDATE_NEEDEDE.lto_priv.478>: 5b19: ff ff 4d 4d 55 20 46 57 20 55 50 44 41 54 45 20 ..MMU FW UPDATE 5b29: 4e 45 45 44 45 44 00 NEEDED. 00005b30 <_ZN4MMU2L20MSG_TITLE_QUEUE_FULLE.lto_priv.477>: 5b30: ff ff 51 55 45 55 45 20 46 55 4c 4c 00 ..QUEUE FULL. 00005b3d <_ZN4MMU2L22MSG_TITLE_INVALID_TOOLE.lto_priv.476>: 5b3d: ff ff 49 4e 56 41 4c 49 44 20 54 4f 4f 4c 00 ..INVALID TOOL. 00005b4c <_ZN4MMU2L33MSG_TITLE_FILAMENT_ALREADY_LOADEDE.lto_priv.475>: 5b4c: ff ff 46 49 4c 2e 20 41 4c 52 45 41 44 59 20 4c ..FIL. ALREADY L 5b5c: 4f 41 44 45 44 00 OADED. 00005b62 <_ZN4MMU2L29MSG_TITLE_COMMUNICATION_ERRORE.lto_priv.474>: 5b62: ff ff 43 4f 4d 4d 55 4e 49 43 41 54 49 4f 4e 20 ..COMMUNICATION 5b72: 45 52 52 4f 52 00 ERROR. 00005b78 <_ZN4MMU2L28MSG_TITLE_MMU_NOT_RESPONDINGE.lto_priv.473>: 5b78: ff ff 4d 4d 55 20 4e 4f 54 20 52 45 53 50 4f 4e ..MMU NOT RESPON 5b88: 44 49 4e 47 00 DING. 00005b8d <_ZN4MMU2L23MSG_TITLE_MMU_MCU_ERRORE.lto_priv.472>: 5b8d: ff ff 4d 4d 55 20 4d 43 55 20 45 52 52 4f 52 00 ..MMU MCU ERROR. 00005b9d <_ZN4MMU2L25MSG_TITLE_SELFTEST_FAILEDE.lto_priv.471>: 5b9d: ff ff 4d 4d 55 20 53 45 4c 46 54 45 53 54 20 46 ..MMU SELFTEST F 5bad: 41 49 4c 45 44 00 AILED. 00005bb3 <_ZN4MMU2L28MSG_TITLE_TMC_DRIVER_SHORTEDE.lto_priv.470>: 5bb3: ff ff 54 4d 43 20 44 52 49 56 45 52 20 53 48 4f ..TMC DRIVER SHO 5bc3: 52 54 45 44 00 RTED. 00005bc8 <_ZN4MMU2L32MSG_TITLE_TMC_UNDERVOLTAGE_ERRORE.lto_priv.469>: 5bc8: ff ff 54 4d 43 20 55 4e 44 45 52 56 4f 4c 54 41 ..TMC UNDERVOLTA 5bd8: 47 45 20 45 52 52 00 GE ERR. 00005bdf <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_RESETE.lto_priv.468>: 5bdf: ff ff 54 4d 43 20 44 52 49 56 45 52 20 52 45 53 ..TMC DRIVER RES 5bef: 45 54 00 ET. 00005bf2 <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_ERRORE.lto_priv.467>: 5bf2: ff ff 54 4d 43 20 44 52 49 56 45 52 20 45 52 52 ..TMC DRIVER ERR 5c02: 4f 52 00 OR. 00005c05 <_ZN4MMU2L28MSG_TITLE_TMC_OVERHEAT_ERRORE.lto_priv.466>: 5c05: ff ff 54 4d 43 20 4f 56 45 52 48 45 41 54 20 45 ..TMC OVERHEAT E 5c15: 52 52 4f 52 00 RROR. 00005c1a <_ZN4MMU2L33MSG_TITLE_TMC_WARNING_TMC_TOO_HOTE.lto_priv.465>: 5c1a: ff ff 57 41 52 4e 49 4e 47 20 54 4d 43 20 54 4f ..WARNING TMC TO 5c2a: 4f 20 48 4f 54 00 O HOT. 00005c30 <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_MOVEE.lto_priv.464>: 5c30: ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 4d ..IDLER CANNOT M 5c40: 4f 56 45 00 OVE. 00005c44 <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_HOMEE.lto_priv.463>: 5c44: ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 48 ..IDLER CANNOT H 5c54: 4f 4d 45 00 OME. 00005c58 <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_MOVEE.lto_priv.462>: 5c58: ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f ..SELECTOR CANNO 5c68: 54 20 4d 4f 56 45 00 T MOVE. 00005c6f <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_HOMEE.lto_priv.461>: 5c6f: ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f ..SELECTOR CANNO 5c7f: 54 20 48 4f 4d 45 00 T HOME. 00005c86 <_ZN4MMU2L33MSG_TITLE_LOAD_TO_EXTRUDER_FAILEDE.lto_priv.460>: 5c86: ff ff 4c 4f 41 44 20 54 4f 20 45 58 54 52 2e 20 ..LOAD TO EXTR. 5c96: 46 41 49 4c 45 44 00 FAILED. 00005c9d <_ZN4MMU2L23MSG_TITLE_INSPECT_FINDAE.lto_priv.459>: 5c9d: ff ff 49 4e 53 50 45 43 54 20 46 49 4e 44 41 00 ..INSPECT FINDA. 00005cad <_ZN4MMU2L27MSG_TITLE_FSENSOR_TOO_EARLYE.lto_priv.458>: 5cad: ff ff 46 53 45 4e 53 4f 52 20 54 4f 4f 20 45 41 ..FSENSOR TOO EA 5cbd: 52 4c 59 00 RLY. 00005cc1 <_ZN4MMU2L28MSG_TITLE_PULLEY_CANNOT_MOVEE.lto_priv.457>: 5cc1: ff ff 50 55 4c 4c 45 59 20 43 41 4e 4e 4f 54 20 ..PULLEY CANNOT 5cd1: 4d 4f 56 45 00 MOVE. 00005cd6 <_ZN4MMU2L32MSG_TITLE_FSENSOR_FILAMENT_STUCKE.lto_priv.456>: 5cd6: ff ff 46 53 45 4e 53 4f 52 20 46 49 4c 2e 20 53 ..FSENSOR FIL. S 5ce6: 54 55 43 4b 00 TUCK. 00005ceb <_ZN4MMU2L31MSG_TITLE_FSENSOR_DIDNT_TRIGGERE.lto_priv.455>: 5ceb: ff ff 46 53 45 4e 53 4f 52 20 44 49 44 4e 54 20 ..FSENSOR DIDNT 5cfb: 54 52 49 47 47 2e 00 TRIGG.. 00005d02 <_ZN4MMU2L30MSG_TITLE_FINDA_FILAMENT_STUCKE.lto_priv.454>: 5d02: ff ff 46 49 4e 44 41 20 46 49 4c 41 4d 2e 20 53 ..FINDA FILAM. S 5d12: 54 55 43 4b 00 TUCK. 00005d17 <_ZN4MMU2L29MSG_TITLE_FINDA_DIDNT_TRIGGERE.lto_priv.453>: 5d17: ff ff 46 49 4e 44 41 20 44 49 44 4e 54 20 54 52 ..FINDA DIDNT TR 5d27: 49 47 47 45 52 00 IGGER. 00005d2d : 5d2d: ff ff 4e 6f 74 20 73 70 69 6e 6e 69 6e 67 00 ..Not spinning. 00005d3c : 5d3c: ff ff 53 70 69 6e 6e 69 6e 67 00 ..Spinning. 00005d47 : 5d47: ff ff 4c 65 66 74 20 68 6f 74 65 6e 64 20 66 61 ..Left hotend fa 5d57: 6e 3f 00 n?. 00005d5a : 5d5a: ff ff 46 72 6f 6e 74 20 70 72 69 6e 74 20 66 61 ..Front print fa 5d6a: 6e 3f 00 n?. 00005d6d : 5d6d: ff ff 46 61 6e 20 74 65 73 74 00 ..Fan test. 00005d78 : 5d78: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5d88: 6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 53 6b 65 n all right. Ske 5d98: 77 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 65 63 w will be correc 5da8: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ted automaticall 5db8: 79 2e 00 y.. 00005dbb : 5dbb: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5dcb: 6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 58 2f 59 n all right. X/Y 5ddb: 20 61 78 65 73 20 61 72 65 20 73 6c 69 67 68 74 axes are slight 5deb: 6c 79 20 73 6b 65 77 65 64 2e 20 47 6f 6f 64 20 ly skewed. Good 5dfb: 6a 6f 62 21 00 job!. 00005e00 : 5e00: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5e10: 6e 20 6f 6b 2e 20 58 2f 59 20 61 78 65 73 20 61 n ok. X/Y axes a 5e20: 72 65 20 70 65 72 70 65 6e 64 69 63 75 6c 61 72 re perpendicular 5e30: 2e 20 43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e . Congratulation 5e40: 73 21 00 s!. 00005e43 : 5e43: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5e53: 6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 52 n compromised. R 5e63: 69 67 68 74 20 66 72 6f 6e 74 20 63 61 6c 69 62 ight front calib 5e73: 72 61 74 69 6f 6e 20 70 6f 69 6e 74 20 6e 6f 74 ration point not 5e83: 20 72 65 61 63 68 61 62 6c 65 2e 00 reachable.. 00005e8f : 5e8f: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5e9f: 6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 46 n compromised. F 5eaf: 72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e ront calibration 5ebf: 20 70 6f 69 6e 74 73 20 6e 6f 74 20 72 65 61 63 points not reac 5ecf: 68 61 62 6c 65 2e 00 hable.. 00005ed6 : 5ed6: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5ee6: 6e 20 66 61 69 6c 65 64 2e 20 52 69 67 68 74 20 n failed. Right 5ef6: 66 72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f front calibratio 5f06: 6e 20 70 6f 69 6e 74 20 6e 6f 74 20 72 65 61 63 n point not reac 5f16: 68 61 62 6c 65 2e 00 hable.. 00005f1d : 5f1d: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5f2d: 6e 20 66 61 69 6c 65 64 2e 20 46 72 6f 6e 74 20 n failed. Front 5f3d: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 5f4d: 74 73 20 6e 6f 74 20 72 65 61 63 68 61 62 6c 65 ts not reachable 5f5d: 2e 00 .. 00005f5f : 5f5f: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5f6f: 6e 20 66 61 69 6c 65 64 2e 20 50 6c 65 61 73 65 n failed. Please 5f7f: 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 6d 61 6e consult the man 5f8f: 75 61 6c 2e 00 ual.. 00005f94 : 5f94: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5fa4: 6e 20 66 61 69 6c 65 64 2e 20 42 65 64 20 63 61 n failed. Bed ca 5fb4: 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e 74 20 libration point 5fc4: 77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 00 was not found.. 00005fd3 : 5fd3: ff ff 50 6c 65 61 73 65 20 70 6c 61 63 65 20 73 ..Please place s 5fe3: 74 65 65 6c 20 73 68 65 65 74 20 6f 6e 20 68 65 teel sheet on he 5ff3: 61 74 62 65 64 2e 00 atbed.. 00005ffa : 5ffa: ff ff 44 69 73 74 61 6e 63 65 20 62 65 74 77 65 ..Distance betwe 600a: 65 6e 20 74 69 70 20 6f 66 20 74 68 65 20 6e 6f en tip of the no 601a: 7a 7a 6c 65 20 61 6e 64 20 74 68 65 20 62 65 64 zzle and the bed 602a: 20 73 75 72 66 61 63 65 20 68 61 73 20 6e 6f 74 surface has not 603a: 20 62 65 65 6e 20 73 65 74 20 79 65 74 2e 20 50 been set yet. P 604a: 6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65 lease follow the 605a: 20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72 manual, chapter 606a: 20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65 First steps, se 607a: 63 74 69 6f 6e 20 46 69 72 73 74 20 6c 61 79 65 ction First laye 608a: 72 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 00 r calibration.. 00006099 : 6099: ff ff 50 6c 61 63 65 20 61 20 73 68 65 65 74 20 ..Place a sheet 60a9: 6f 66 20 70 61 70 65 72 20 75 6e 64 65 72 20 74 of paper under t 60b9: 68 65 20 6e 6f 7a 7a 6c 65 20 64 75 72 69 6e 67 he nozzle during 60c9: 20 74 68 65 20 63 61 6c 69 62 72 61 74 69 6f 6e the calibration 60d9: 20 6f 66 20 66 69 72 73 74 20 34 20 70 6f 69 6e of first 4 poin 60e9: 74 73 2e 20 49 66 20 74 68 65 20 6e 6f 7a 7a 6c ts. If the nozzl 60f9: 65 20 63 61 74 63 68 65 73 20 74 68 65 20 70 61 e catches the pa 6109: 70 65 72 2c 20 70 6f 77 65 72 20 6f 66 66 20 74 per, power off t 6119: 68 65 20 70 72 69 6e 74 65 72 20 69 6d 6d 65 64 he printer immed 6129: 69 61 74 65 6c 79 2e 00 iately.. 00006131 : 6131: ff ff 53 65 61 72 63 68 69 6e 67 20 62 65 64 20 ..Searching bed 6141: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 6151: 74 00 t. 00006153 : 6153: ff ff 4d 65 61 73 75 72 69 6e 67 20 72 65 66 65 ..Measuring refe 6163: 72 65 6e 63 65 20 68 65 69 67 68 74 20 6f 66 20 rence height of 6173: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 6183: 74 00 t. 00006185 : 6185: ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 74 ..Please clean t 6195: 68 65 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20 63 61 he nozzle for ca 61a5: 6c 69 62 72 61 74 69 6f 6e 2e 20 43 6c 69 63 6b libration. Click 61b5: 20 77 68 65 6e 20 64 6f 6e 65 2e 00 when done.. 000061c1 : 61c1: ff ff 41 75 74 6f 20 68 6f 6d 65 00 ..Auto home. 000061cd : 61cd: ff ff 43 75 74 20 66 69 6c 61 6d 65 6e 74 00 ..Cut filament. 000061dc : 61dc: ff ff 45 6a 65 63 74 20 66 72 6f 6d 20 4d 4d 55 ..Eject from MMU ... 000061ed : 61ed: ff ff 4c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65 ..Loading filame 61fd: 6e 74 00 nt. 00006200 : 6200: ff ff 4d 4d 55 20 52 65 74 72 79 3a 20 52 65 73 ..MMU Retry: Res 6210: 74 6f 72 69 6e 67 20 74 65 6d 70 65 72 61 74 75 toring temperatu 6220: 72 65 2e 2e 2e 00 re.... 00006226 : 6226: ff ff 53 6f 72 74 69 6e 67 20 66 69 6c 65 73 00 ..Sorting files. 00006236 : 6236: ff ff 53 6f 6d 65 20 66 69 6c 65 73 20 77 69 6c ..Some files wil 6246: 6c 20 6e 6f 74 20 62 65 20 73 6f 72 74 65 64 2e l not be sorted. 6256: 20 4d 61 78 2e 20 4e 6f 2e 20 6f 66 20 66 69 6c Max. No. of fil 6266: 65 73 20 69 6e 20 31 20 66 6f 6c 64 65 72 20 66 es in 1 folder f 6276: 6f 72 20 73 6f 72 74 69 6e 67 20 69 73 20 31 30 or sorting is 10 6286: 30 2e 00 0.. 00006289 : 6289: ff ff 53 54 4f 50 50 45 44 2e 00 ..STOPPED.. 00006294 : 6294: ff ff 4f 66 66 00 ..Off. 0000629a : 629a: ff ff 4f 6e 00 ..On. 0000629f <__loc_pri_end>: 629f: 65 6e ori r22, 0xE5 ; 229 62a1: 71 75 andi r23, 0x51 ; 81 62a3: 65 69 ori r22, 0x95 ; 149 62a5: 6e 67 ori r22, 0x7E ; 126 62a7: 20 22 and r2, r16 ... 000062aa : 62aa: 44 6f 6e 65 20 70 72 69 6e 74 69 6e 67 20 66 69 Done printing fi 62ba: 6c 65 00 le. 000062bd : 62bd: 4e 6f 20 4c 69 6e 65 20 4e 75 6d 62 65 72 20 77 No Line Number w 62cd: 69 74 68 20 63 68 65 63 6b 73 75 6d 2c 20 4c 61 ith checksum, La 62dd: 73 74 20 4c 69 6e 65 3a 20 00 st Line: . 000062e7 : 62e7: 4e 6f 20 43 68 65 63 6b 73 75 6d 20 77 69 74 68 No Checksum with 62f7: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 2c 20 4c 61 line number, La 6307: 73 74 20 4c 69 6e 65 3a 20 00 st Line: . 00006311 : 6311: 63 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 checksum mismatc 6321: 68 2c 20 4c 61 73 74 20 4c 69 6e 65 3a 20 00 h, Last Line: . 00006330 : 6330: 4c 69 6e 65 20 4e 75 6d 62 65 72 20 69 73 20 6e Line Number is n 6340: 6f 74 20 4c 61 73 74 20 4c 69 6e 65 20 4e 75 6d ot Last Line Num 6350: 62 65 72 2b 31 2c 20 4c 61 73 74 20 4c 69 6e 65 ber+1, Last Line 6360: 3a 20 00 : . 00006363 : 6363: 25 75 20 62 79 74 65 73 20 77 72 69 74 74 65 6e %u bytes written 6373: 20 74 6f 20 25 53 20 61 74 20 61 64 64 72 65 73 to %S at addres 6383: 73 20 30 78 25 30 38 78 0a 00 s 0x%08x.. 0000638d : 638d: 44 25 64 20 2d 20 52 65 61 64 2f 57 72 69 74 65 D%d - Read/Write 639d: 20 25 53 0a 00 %S.. 000063a2 <__c.2310>: 63a2: 3f 3f 00 ??. 000063a5 <__c.2308>: 63a5: 52 6f 6d 61 6e 61 00 Romana. 000063ac <__c.2305>: 63ac: 48 72 76 61 74 73 6b 69 00 Hrvatski. 000063b5 <__c.2302>: 63b5: 4d 61 67 79 61 72 00 Magyar. 000063bc <__c.2299>: 63bc: 53 6c 6f 76 65 6e 63 69 6e 61 00 Slovencina. 000063c7 <__c.2296>: 63c7: 4e 6f 72 73 6b 00 Norsk. 000063cd <__c.2293>: 63cd: 53 76 65 6e 73 6b 61 00 Svenska. 000063d5 <__c.2290>: 63d5: 4e 65 64 65 72 6c 61 6e 64 73 00 Nederlands. 000063e0 <__c.2287>: 63e0: 50 6f 6c 73 6b 69 00 Polski. 000063e7 <__c.2284>: 63e7: 49 74 61 6c 69 61 6e 6f 00 Italiano. 000063f0 <__c.2281>: 63f0: 46 72 61 6e 63 61 69 73 00 Francais. 000063f9 <__c.2278>: 63f9: 45 73 70 61 6e 6f 6c 00 Espanol. 00006401 <__c.2275>: 6401: 44 65 75 74 73 63 68 00 Deutsch. 00006409 <__c.2272>: 6409: 43 65 73 74 69 6e 61 00 Cestina. 00006411 <__c.2269>: 6411: 45 6e 67 6c 69 73 68 00 English. 00006419 : 6419: 20 43 6f 75 6e 74 20 58 3a 20 00 Count X: . 00006424 : 6424: 45 30 3a 25 64 20 52 50 4d 20 50 52 4e 31 3a 25 E0:%d RPM PRN1:% 6434: 64 20 52 50 4d 20 45 30 40 3a 25 75 20 50 52 4e d RPM E0@:%u PRN 6444: 31 40 3a 25 75 0a 00 1@:%u.. 0000644b : 644b: 52 65 73 65 6e 64 00 Resend. 00006452 : 6452: 25 53 3a 20 25 6c 64 0a 25 53 0a 00 %S: %ld.%S.. 0000645e : 645e: 2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 69 66 69 63 //action:notific 646e: 61 74 69 6f 6e 20 25 53 0a 00 ation %S.. 00006478 : 6478: 46 69 6c 61 6d 65 6e 74 20 72 75 6e 6f 75 74 20 Filament runout 6488: 64 65 74 65 63 74 65 64 21 00 detected!. 00006492 : 6492: 64 69 73 61 62 6c 65 64 00 disabled. 0000649b : 649b: 65 6e 61 62 6c 65 64 00 enabled. 000064a3 : 64a3: 45 45 50 52 4f 4d 00 EEPROM. 000064aa : 64aa: 53 52 41 4d 00 SRAM. 000064af : 64af: 44 2d 31 20 2d 20 45 6e 64 6c 65 73 73 20 6c 6f D-1 - Endless lo 64bf: 6f 70 0a 00 op.. 000064c3 : 64c3: 41 63 74 69 76 65 20 45 78 74 72 75 64 65 72 3a Active Extruder: 64d3: 20 30 00 0. 000064d6 : 64d6: 49 6e 76 61 6c 69 64 20 65 78 74 72 75 64 65 72 Invalid extruder ... 000064e7 : 64e7: 4d 32 32 30 20 53 25 64 00 M220 S%d. 000064f0 : 64f0: 53 44 20 70 72 69 6e 74 69 6e 67 20 62 79 74 65 SD printing byte 6500: 20 00 . 00006502 : 6502: 25 75 00 %u. 00006505 : 6505: 55 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a Unknown command: 6515: 20 22 00 ". 00006518 <_ZZ16process_commandsvE3__c__55_>: 6518: 4d 32 30 30 20 49 6e 76 61 6c 69 64 20 65 78 74 M200 Invalid ext 6528: 72 75 64 65 72 20 00 ruder . 0000652f : 652f: 7a 5f 6d 61 78 3a 20 00 z_max: . 00006537 : 6537: 7a 5f 6d 69 6e 3a 20 00 z_min: . 0000653f <_ZZ16process_commandsvE3__c__54_>: 653f: 79 5f 6d 69 6e 3a 20 00 y_min: . 00006547 : 6547: 54 52 49 47 47 45 52 45 44 00 TRIGGERED. 00006551 : 6551: 6f 70 65 6e 00 open. 00006556 <_ZZ16process_commandsvE3__c__53_>: 6556: 78 5f 6d 69 6e 3a 20 00 x_min: . 0000655e <_ZZ16process_commandsvE3__c__52_>: 655e: 52 65 70 6f 72 74 69 6e 67 20 65 6e 64 73 74 6f Reporting endsto 656e: 70 20 73 74 61 74 75 73 00 p status. 00006577 : 6577: 4d 31 31 32 20 63 61 6c 6c 65 64 2e 20 45 6d 65 M112 called. Eme 6587: 72 67 65 6e 63 79 20 53 74 6f 70 2e 00 rgency Stop.. 00006594 : 6594: 2f 2f 61 63 74 69 6f 6e 3a 75 76 6c 6f 5f 72 65 //action:uvlo_re 65a4: 63 6f 76 65 72 79 5f 72 65 61 64 79 00 covery_ready. 000065b1 <_ZZ16process_commandsvE3__c__38_>: 65b1: 25 53 3a 25 6c 75 20 63 6d 0a 25 53 3a 25 6c 75 %S:%lu cm.%S:%lu 65c1: 20 6d 69 6e 0a 00 min.. 000065c7 <_ZZ16process_commandsvE3__c__37_>: 65c7: 53 49 4c 45 4e 54 00 SILENT. 000065ce <_ZZ16process_commandsvE3__c__36_>: 65ce: 4e 4f 52 4d 41 4c 00 NORMAL. 000065d5 <_ZZ16process_commandsvE3__c__35_>: 65d5: 25 53 20 4d 4f 44 45 3a 20 50 65 72 63 65 6e 74 %S MODE: Percent 65e5: 20 64 6f 6e 65 3a 20 25 68 68 64 3b 20 70 72 69 done: %hhd; pri 65f5: 6e 74 20 74 69 6d 65 20 72 65 6d 61 69 6e 69 6e nt time remainin 6605: 67 20 69 6e 20 6d 69 6e 73 3a 20 25 64 3b 20 43 g in mins: %d; C 6615: 68 61 6e 67 65 20 69 6e 20 6d 69 6e 73 3a 20 25 hange in mins: % 6625: 64 0a 00 d.. 00006628 <_ZZ16process_commandsvE3__c__34_>: 6628: 50 72 69 6e 74 65 72 53 74 61 74 65 3a 20 25 64 PrinterState: %d 6638: 0a 00 .. 0000663a <_ZZ16process_commandsvE3__c__30_>: 663a: 45 6e 64 20 66 69 6c 65 20 6c 69 73 74 00 End file list. 00006648 <_ZZ16process_commandsvE3__c__29_>: 6648: 42 65 67 69 6e 20 66 69 6c 65 20 6c 69 73 74 00 Begin file list. 00006658 : 6658: 55 6e 6b 6e 6f 77 6e 20 25 63 20 63 6f 64 65 3a Unknown %c code: 6668: 20 25 73 0a 00 %s.. 0000666d <_ZZ16process_commandsvE3__c__27_>: 666d: 0a 50 49 4e 44 41 20 74 65 6d 70 65 72 61 74 75 .PINDA temperatu 667d: 72 65 3a 20 25 2e 31 66 20 5a 20 73 68 69 66 74 re: %.1f Z shift 668d: 20 28 6d 6d 29 3a 20 25 2e 33 66 00 (mm): %.3f. 00006699 <_ZZ16process_commandsvE3__c__26_>: 6699: 0a 53 74 65 70 3a 20 25 64 2f 36 0a 00 .Step: %d/6.. 000066a6 <_ZZ16process_commandsvE3__c__25_>: 66a6: 0a 53 74 65 70 3a 20 25 64 2f 36 20 28 73 6b 69 .Step: %d/6 (ski 66b6: 70 70 65 64 29 0a 50 49 4e 44 41 20 74 65 6d 70 pped).PINDA temp 66c6: 65 72 61 74 75 72 65 3a 20 25 64 20 5a 20 73 68 erature: %d Z sh 66d6: 69 66 74 20 28 6d 6d 29 3a 30 0a 00 ift (mm):0.. 000066e2 <_ZZ16process_commandsvE3__c__24_>: 66e2: 0a 5a 45 52 4f 3a 20 25 2e 33 66 0a 00 .ZERO: %.3f.. 000066ef <_ZZ16process_commandsvE3__c__23_>: 66ef: 73 74 61 72 74 20 74 65 6d 70 65 72 61 74 75 72 start temperatur 66ff: 65 3a 20 25 2e 31 66 0a 00 e: %.1f.. 00006708 <_ZZ16process_commandsvE3__c__20_>: 6708: 25 64 20 20 25 2e 32 66 00 %d %.2f. 00006711 <_ZZ16process_commandsvE3__c__19_>: 6711: 25 53 20 58 3a 20 25 2e 35 66 20 59 3a 20 25 2e %S X: %.5f Y: %. 6721: 35 66 20 5a 3a 20 25 2e 35 66 0a 00 5f Z: %.5f.. 0000672d <_ZZ16process_commandsvE3__c__18_>: 672d: 53 6c 65 65 70 2e 2e 2e 00 Sleep.... 00006736 : 6736: 45 30 3a 25 64 20 52 50 4d 0a 50 52 4e 30 3a 25 E0:%d RPM.PRN0:% 6746: 64 20 52 50 4d 0a 00 d RPM.. 0000674d : 674d: 31 2f 39 00 1/9. 00006751 : 6751: 47 39 30 00 G90. 00006755 : 6755: 4d 31 30 37 00 M107. 0000675a : 675a: 25 36 2e 32 66 6d 6d 00 %6.2fmm. 00006762 : 6762: 25 53 0a 25 53 0a 25 53 3a 0a 25 53 3a 00 %S.%S.%S:.%S:. 00006770 : 6770: 25 33 2e 32 66 81 00 %3.2f.. 00006777 : 6777: 25 2d 31 34 2e 31 34 53 3a 0a 25 53 0a 25 2d 31 %-14.14S:.%S.%-1 6787: 34 2e 31 34 53 3a 25 33 2e 32 66 81 0a 25 2d 31 4.14S:%3.2f..%-1 6797: 34 2e 31 34 53 3a 25 33 2e 32 66 81 00 4.14S:%3.2f.. 000067a4 : 67a4: 20 20 30 00 0. 000067a8 : 67a8: 20 20 31 00 1. 000067ac : 67ac: 42 3a 20 25 33 64 20 20 20 20 20 58 64 3a 25 36 B: %3d Xd:%6 67bc: 64 0a 53 3a 20 25 33 64 20 20 20 20 20 59 64 3a d.S: %3d Yd: 67cc: 25 36 64 00 %6d. 000067d0 : 67d0: 46 49 4e 44 41 00 FINDA. 000067d6 : 67d6: 50 49 4e 44 41 00 PINDA. 000067dc : 67dc: 57 69 7a 61 72 64 20 65 6e 64 20 73 74 61 74 65 Wizard end state 67ec: 3a 20 25 64 0a 00 : %d.. 000067f2 : 67f2: 53 70 6f 6f 6c 4a 6f 69 6e 00 SpoolJoin. 000067fc : 67fc: 46 69 72 6d 77 61 72 65 00 Firmware. 00006805 : 6805: 53 75 70 65 72 50 49 4e 44 41 00 SuperPINDA. 00006810 : 6810: 48 42 65 64 20 6f 6e 20 6c 6f 61 64 00 HBed on load. 0000681d : 681d: 46 6c 61 73 68 41 69 72 00 FlashAir. 00006826 : 6826: 45 72 72 3a 48 4f 54 45 4e 44 20 46 41 4e 20 45 Err:HOTEND FAN E 6836: 52 52 4f 52 00 RROR. 0000683b : 683b: 2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 64 //action:resumed ... 0000684c : 684c: 2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 00 //action:resume. 0000685c : 685c: 2f 2f 61 63 74 69 6f 6e 3a 72 65 61 64 79 00 //action:ready. 0000686b : 686b: 2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 5f 72 65 61 //action:not_rea 687b: 64 79 00 dy. 0000687e : 687e: 2f 2f 61 63 74 69 6f 6e 3a 63 61 6e 63 65 6c 00 //action:cancel. 0000688e : 688e: 4d 38 34 00 M84. 00006892 : 6892: 4f 4b 00 OK. 00006895 : 6895: 4c 43 44 20 73 74 61 74 75 73 20 63 68 61 6e 67 LCD status chang 68a5: 65 64 00 ed. 000068a8 <_ZZN10CardReader7releaseEvE3__c.lto_priv.495>: 68a8: 53 44 20 63 61 72 64 20 72 65 6c 65 61 73 65 64 SD card released ... 000068b9 : 68b9: 2f 2f 61 63 74 69 6f 6e 3a 73 74 61 72 74 00 //action:start. 000068c8 : 68c8: 47 39 31 00 G91. 000068cc : 68cc: 4d 37 30 32 00 M702. 000068d1 : 68d1: 47 32 38 20 57 00 G28 W. 000068d7 : 68d7: 4d 35 30 30 00 M500. 000068dc : 68dc: 42 61 64 20 69 6e 74 65 72 72 75 70 74 00 Bad interrupt. 000068ea : 68ea: 57 61 74 63 68 64 6f 67 20 74 69 6d 65 6f 75 74 Watchdog timeout ... 000068fb : 68fb: 53 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 68 61 Static memory ha 690b: 73 0a 62 65 65 6e 20 6f 76 65 72 77 72 69 74 74 s.been overwritt 691b: 65 6e 00 en. 0000691e : 691e: 46 49 52 4d 57 41 52 45 20 43 52 41 53 48 21 0a FIRMWARE CRASH!. 692e: 43 72 61 73 68 20 72 65 61 73 6f 6e 3a 0a 00 Crash reason:.. 0000693d : 693d: 20 20 50 6c 61 6e 6e 65 72 42 75 66 66 65 72 42 PlannerBufferB 694d: 79 74 65 73 3a 20 00 ytes: . 00006954 : 6954: 20 46 72 65 65 20 4d 65 6d 6f 72 79 3a 20 00 Free Memory: . 00006963 : 6963: 20 7c 20 41 75 74 68 6f 72 3a 20 00 | Author: . 0000696f : 696f: 20 4c 61 73 74 20 55 70 64 61 74 65 64 3a 20 00 Last Updated: . 0000697f : 697f: 20 53 6f 66 74 77 61 72 65 20 52 65 73 65 74 00 Software Reset. 0000698f : 698f: 20 57 61 74 63 68 64 6f 67 20 52 65 73 65 74 00 Watchdog Reset. 0000699f : 699f: 20 42 72 6f 77 6e 20 6f 75 74 20 52 65 73 65 74 Brown out Reset ... 000069b0 : 69b0: 20 45 78 74 65 72 6e 61 6c 20 52 65 73 65 74 00 External Reset. 000069c0 : 69c0: 50 6f 77 65 72 55 70 00 PowerUp. 000069c8 : 69c8: 65 72 72 6f 72 20 77 72 69 74 69 6e 67 20 74 6f error writing to 69d8: 20 66 69 6c 65 00 file. 000069de : 69de: 44 6f 6e 65 20 73 61 76 69 6e 67 20 66 69 6c 65 Done saving file 69ee: 2e 00 .. 000069f0 : 69f0: 6f 6b 00 ok. 000069f3 : 69f3: 46 69 6c 61 6d 65 6e 74 00 Filament. 000069fc : 69fc: 88 00 .. 000069fe : 69fe: 20 74 6f 6f 20 6c 6f 6e 67 20 65 78 74 72 75 73 too long extrus 6a0e: 69 6f 6e 20 70 72 65 76 65 6e 74 65 64 00 ion prevented. 00006a1c : 6a1c: 20 63 6f 6c 64 20 65 78 74 72 75 73 69 6f 6e 20 cold extrusion 6a2c: 70 72 65 76 65 6e 74 65 64 00 prevented. 00006a36 : 6a36: 4d 6f 76 65 20 61 62 6f 72 74 65 64 00 Move aborted. 00006a43 : 6a43: 45 72 72 3a 50 52 49 4e 54 20 46 41 4e 20 45 52 Err:PRINT FAN ER 6a53: 52 4f 52 00 ROR. 00006a57 : 6a57: 25 63 25 33 64 2f 25 64 81 00 %c%3d/%d.. 00006a61 : 6a61: 5a 25 36 2e 32 66 25 63 00 Z%6.2f%c. 00006a6a : 6a6a: 5a 20 20 20 2d 2d 2d 20 00 Z --- . 00006a73 : 6a73: 86 25 33 64 25 25 00 .%3d%%. 00006a7a : 6a7a: 2d 2d 2d 25 25 00 ---%%. 00006a80 : 6a80: 25 33 64 25 25 00 %3d%%. 00006a86 : 6a86: 20 53 44 00 SD. 00006a8a : 6a8a: 20 20 20 00 . 00006a8e : 6a8e: 20 48 4f 00 HO. 00006a92 : 6a92: 20 46 52 4d 20 00 FRM . 00006a98 : 6a98: 87 2d 2d 3a 2d 2d 20 20 00 .--:-- . 00006aa1 : 6aa1: 87 25 33 75 68 20 25 63 25 63 00 .%3uh %c%c. 00006aac : 6aac: 87 25 30 32 75 3a 25 30 32 75 25 63 25 63 00 .%02u:%02u%c%c. 00006abb : 6abb: 2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 64 00 //action:paused. 00006acb : 6acb: 2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 00 //action:pause. 00006ada <_ZZL16lcd_support_menuvE3__c__16_>: 6ada: 44 75 6d 70 20 74 6f 20 73 65 72 69 61 6c 00 Dump to serial. 00006ae9 : 6ae9: 68 65 6c 70 2e 70 72 75 73 61 33 64 2e 63 6f 6d help.prusa3d.com ... 00006afa : 6afa: 66 6f 72 75 6d 2e 70 72 75 73 61 33 64 2e 63 6f forum.prusa3d.co 6b0a: 6d 00 m. 00006b0c : 6b0c: 70 72 75 73 61 33 64 2e 63 6f 6d 00 prusa3d.com. 00006b18 : 6b18: 4d 37 30 31 00 M701. 00006b1d : 6b1d: 25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a %S:.%18.2fm .%S: 6b2d: 0a 25 31 30 6c 64 64 20 25 30 32 64 68 20 25 30 .%10ldd %02dh %0 6b3d: 32 64 6d 00 2dm. 00006b41 : 6b41: 25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a %S:.%18.2fm .%S: 6b51: 0a 25 31 30 6c 64 68 20 25 30 32 64 6d 20 25 30 .%10ldh %02dm %0 6b61: 32 64 73 00 2ds. 00006b65 : 6b65: 4d 65 61 73 75 72 65 64 20 73 6b 65 77 73 3a 20 Measured skews: 6b75: 25 66 20 25 66 0a 00 %f %f.. 00006b7c : 6b7c: 46 69 74 74 69 6e 67 20 66 61 69 6c 65 64 20 3d Fitting failed = 6b8c: 3e 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 61 > calibration fa 6b9c: 69 6c 65 64 2e 0a 00 iled... 00006ba3 : 6ba3: 43 61 6c 69 62 72 61 74 69 6f 6e 20 73 75 63 63 Calibration succ 6bb3: 65 73 73 2e 0a 00 ess... 00006bb9 : 6bb9: 41 6c 6c 20 34 20 63 61 6c 69 62 72 61 74 69 6f All 4 calibratio 6bc9: 6e 20 70 6f 69 6e 74 73 20 66 6f 75 6e 64 2e 0a n points found.. ... 00006bda : 6bda: 31 2f 34 00 1/4. 00006bde : 6bde: 31 2f 34 00 1/4. 00006be2 : 6be2: 31 2f 39 00 1/9. 00006be6 : 6be6: 50 72 75 73 61 20 69 33 20 4d 4b 32 2e 35 20 4f Prusa i3 MK2.5 O 6bf6: 4b 2e 00 K.. 00006bf9 : 6bf9: 53 44 20 63 61 72 64 20 6f 6b 00 SD card ok. 00006c04 : 6c04: 6f 70 65 6e 52 6f 6f 74 20 66 61 69 6c 65 64 00 openRoot failed. 00006c14 : 6c14: 76 6f 6c 75 6d 65 2e 69 6e 69 74 20 66 61 69 6c volume.init fail 6c24: 65 64 00 ed. 00006c27 : 6c27: 53 44 20 69 6e 69 74 20 66 61 69 6c 00 SD init fail. 00006c34 : 6c34: 6f 70 65 6e 20 66 61 69 6c 65 64 2c 20 46 69 6c open failed, Fil 6c44: 65 3a 20 00 e: . 00006c48 : 6c48: 43 61 6e 6e 6f 74 20 65 6e 74 65 72 20 73 75 62 Cannot enter sub 6c58: 64 69 72 3a 20 00 dir: . 00006c5e : 6c5e: 4d 36 30 30 00 M600. 00006c63 : 6c63: 4d 32 34 00 M24. 00006c67 : 6c67: 4d 32 33 20 25 73 00 M23 %s. 00006c6e : 6c6e: 50 72 69 6e 74 65 72 20 73 74 6f 70 70 65 64 20 Printer stopped 6c7e: 64 75 65 20 74 6f 20 65 72 72 6f 72 73 2e 20 53 due to errors. S 6c8e: 75 70 65 72 76 69 73 69 6f 6e 20 72 65 71 75 69 upervision requi 6c9e: 72 65 64 2e 00 red.. 00006ca3 : 6ca3: 47 31 20 45 25 2d 2e 33 66 20 46 32 37 30 30 00 G1 E%-.3f F2700. 00006cb3 : 6cb3: 4d 38 33 00 M83. 00006cb7 <__noloc_end>: 6cb7: 08 4a sbci r16, 0xA8 ; 168 6cb9: d7 3b cpi r29, 0xB7 ; 183 6cbb: 3b ce rjmp .-906 ; 0x6933 6cbd: 01 6e ori r16, 0xE1 ; 225 6cbf: 84 bc out 0x24, r8 ; 36 6cc1: bf fd .word 0xfdbf ; ???? 6cc3: c1 2f mov r28, r17 6cc5: 3d 6c ori r19, 0xCD ; 205 6cc7: 74 31 cpi r23, 0x14 ; 20 6cc9: 9a bd out 0x2a, r25 ; 42 6ccb: 56 83 std Z+6, r21 ; 0x06 6ccd: 3d da rcall .-2950 ; 0x6149 6ccf: 3d 00 .word 0x003d ; ???? 6cd1: c7 7f andi r28, 0xF7 ; 247 6cd3: 11 be out 0x31, r1 ; 49 6cd5: d9 e4 ldi r29, 0x49 ; 73 6cd7: bb 4c sbci r27, 0xCB ; 203 6cd9: 3e 91 ld r19, -X 6cdb: 6b aa std Y+51, r6 ; 0x33 6cdd: aa be out 0x3a, r10 ; 58 6cdf: 00 00 nop 6ce1: 00 80 ld r0, Z 6ce3: 3f 05 cpc r19, r15 6ce5: a8 4c sbci r26, 0xC8 ; 200 6ce7: cd b2 in r12, 0x1d ; 29 6ce9: d4 4e sbci r29, 0xE4 ; 228 6ceb: b9 38 cpi r27, 0x89 ; 137 6ced: 36 a9 ldd r19, Z+54 ; 0x36 6cef: 02 0c add r0, r2 6cf1: 50 b9 out 0x00, r21 ; 0 6cf3: 91 86 std Z+9, r9 ; 0x09 6cf5: 88 08 sbc r8, r8 6cf7: 3c a6 std Y+44, r3 ; 0x2c 6cf9: aa aa std Y+50, r10 ; 0x32 6cfb: 2a be out 0x3a, r2 ; 58 6cfd: 00 00 nop 6cff: 00 80 ld r0, Z 6d01: 3f 07 cpc r19, r31 6d03: 63 42 sbci r22, 0x23 ; 35 6d05: 36 b7 in r19, 0x36 ; 54 6d07: 9b d8 rcall .-3786 ; 0x5e3f 6d09: a7 1a sub r10, r23 6d0b: 39 68 ori r19, 0x89 ; 137 6d0d: 56 18 sub r5, r6 6d0f: ae ba out 0x1e, r10 ; 30 6d11: ab 55 subi r26, 0x5B ; 91 6d13: 8c 1d adc r24, r12 6d15: 3c b7 in r19, 0x3c ; 60 6d17: cc 57 subi r28, 0x7C ; 124 6d19: 63 bd out 0x23, r22 ; 35 6d1b: 6d ed ldi r22, 0xDD ; 221 6d1d: fd 75 andi r31, 0x5D ; 93 6d1f: 3e f6 brtc .-114 ; 0x6caf 6d21: 17 72 andi r17, 0x27 ; 39 6d23: 31 bf out 0x31, r19 ; 49 6d25: 00 00 nop 6d27: 00 80 ld r0, Z 6d29: 3f 08 sbc r3, r15 6d2b: 00 00 nop 6d2d: 00 be out 0x30, r0 ; 48 6d2f: 92 24 eor r9, r2 6d31: 49 12 cpse r4, r25 6d33: 3e ab std Y+54, r19 ; 0x36 6d35: aa aa std Y+50, r10 ; 0x32 6d37: 2a be out 0x3a, r2 ; 58 6d39: cd cc rjmp .-1638 ; 0x66d5 <_ZZ16process_commandsvE3__c__25_+0x2f> 6d3b: cc 4c sbci r28, 0xCC ; 204 6d3d: 3e 00 .word 0x003e ; ???? 6d3f: 00 00 nop 6d41: 80 be out 0x30, r8 ; 48 6d43: ab aa std Y+51, r10 ; 0x33 6d45: aa aa std Y+50, r10 ; 0x32 6d47: 3e 00 .word 0x003e ; ???? 6d49: 00 00 nop 6d4b: 00 bf out 0x30, r16 ; 48 6d4d: 00 00 nop 6d4f: 00 80 ld r0, Z 6d51: 3f 00 .word 0x003f ; ???? 6d53: 00 00 nop 6d55: 00 00 nop 6d57: 08 41 sbci r16, 0x18 ; 24 6d59: 78 d3 rcall .+1776 ; 0x744b 6d5b: bb 43 sbci r27, 0x3B ; 59 6d5d: 87 d1 rcall .+782 ; 0x706d <__trampolines_start+0x2e9> 6d5f: 13 3d cpi r17, 0xD3 ; 211 6d61: 19 0e add r1, r25 6d63: 3c c3 rjmp .+1656 ; 0x73dd 6d65: bd 42 sbci r27, 0x2D ; 45 6d67: 82 ad ldd r24, Z+58 ; 0x3a 6d69: 2b 3e cpi r18, 0xEB ; 235 6d6b: 68 ec ldi r22, 0xC8 ; 200 6d6d: 82 76 andi r24, 0x62 ; 98 6d6f: be d9 rcall .-3204 ; 0x60ed 6d71: 8f e1 ldi r24, 0x1F ; 31 6d73: a9 3e cpi r26, 0xE9 ; 233 6d75: 4c 80 ldd r4, Y+4 ; 0x04 6d77: ef ff .word 0xffef ; ???? 6d79: be 01 movw r22, r28 6d7b: c4 ff sbrs r28, 4 6d7d: 7f 3f cpi r23, 0xFF ; 255 6d7f: 00 00 nop 6d81: 00 00 nop ... 00006d84 <__trampolines_start>: 6d84: 0d 94 1a 05 jmp 0x20a34 ; 0x20a34 6d88: 0c 94 cf cf jmp 0x19f9e ; 0x19f9e 6d8c: 0c 94 99 d8 jmp 0x1b132 ; 0x1b132 6d90: 0c 94 6c fe jmp 0x1fcd8 ; 0x1fcd8 6d94: 0c 94 a6 d3 jmp 0x1a74c ; 0x1a74c 6d98: 0c 94 9d c3 jmp 0x1873a ; 0x1873a 6d9c: 0c 94 d1 d3 jmp 0x1a7a2 ; 0x1a7a2 6da0: 0c 94 4b 77 jmp 0xee96 ; 0xee96 <__vector_23+0xd0> 6da4: 0c 94 50 ec jmp 0x1d8a0 ; 0x1d8a0 6da8: 0d 94 db 04 jmp 0x209b6 ; 0x209b6 6dac: 0c 94 56 d9 jmp 0x1b2ac ; 0x1b2ac 6db0: 0c 94 37 c8 jmp 0x1906e ; 0x1906e 6db4: 0c 94 41 bf jmp 0x17e82 ; 0x17e82 6db8: 0c 94 eb fe jmp 0x1fdd6 ; 0x1fdd6 6dbc: 0c 94 5f bf jmp 0x17ebe ; 0x17ebe 6dc0: 0c 94 1f bd jmp 0x17a3e ; 0x17a3e 6dc4: 0d 94 46 05 jmp 0x20a8c ; 0x20a8c 6dc8: 0c 94 94 bf jmp 0x17f28 ; 0x17f28 6dcc: 0d 94 ee 0c jmp 0x219dc ; 0x219dc 6dd0: 0c 94 18 d4 jmp 0x1a830 ; 0x1a830 6dd4: 0c 94 5f d0 jmp 0x1a0be ; 0x1a0be 6dd8: 0d 94 b9 26 jmp 0x24d72 ; 0x24d72 6ddc: 0c 94 32 c0 jmp 0x18064 ; 0x18064 6de0: 0c 94 6a fa jmp 0x1f4d4 ; 0x1f4d4 6de4: 0d 94 9b 0f jmp 0x21f36 ; 0x21f36 6de8: 0c 94 da ec jmp 0x1d9b4 ; 0x1d9b4 6dec: 0d 94 4b 07 jmp 0x20e96 ; 0x20e96 6df0: 0c 94 33 bd jmp 0x17a66 ; 0x17a66 6df4: 0c 94 89 bf jmp 0x17f12 ; 0x17f12 6df8: 0c 94 1c 77 jmp 0xee38 ; 0xee38 <__vector_23+0x72> 6dfc: 0c 94 57 bd jmp 0x17aae ; 0x17aae 6e00: 0c 94 4c eb jmp 0x1d698 ; 0x1d698 6e04: 0c 94 eb d3 jmp 0x1a7d6 ; 0x1a7d6 6e08: 0c 94 e1 cf jmp 0x19fc2 ; 0x19fc2 6e0c: 0d 94 ab 96 jmp 0x32d56 ; 0x32d56 6e10: 0c 94 54 77 jmp 0xeea8 ; 0xeea8 <__vector_23+0xe2> 6e14: 0c 94 25 db jmp 0x1b64a ; 0x1b64a 6e18: 0c 94 4a bd jmp 0x17a94 ; 0x17a94 6e1c: 0c 94 25 c2 jmp 0x1844a ; 0x1844a 6e20: 0c 94 eb ec jmp 0x1d9d6 ; 0x1d9d6 6e24: 0c 94 6f d0 jmp 0x1a0de ; 0x1a0de 6e28: 0c 94 fc f9 jmp 0x1f3f8 ; 0x1f3f8 6e2c: 0c 94 40 d4 jmp 0x1a880 ; 0x1a880 6e30: 0c 94 99 c3 jmp 0x18732 ; 0x18732 ()> 6e34: 0d 94 6e 27 jmp 0x24edc ; 0x24edc 6e38: 0c 94 42 df jmp 0x1be84 ; 0x1be84 6e3c: 0c 94 7b d0 jmp 0x1a0f6 ; 0x1a0f6 6e40: 0d 94 77 33 jmp 0x266ee ; 0x266ee 6e44: 0d 94 05 9d jmp 0x33a0a ; 0x33a0a 6e48: 0c 94 59 c8 jmp 0x190b2 ; 0x190b2 6e4c: 0c 94 95 d0 jmp 0x1a12a ; 0x1a12a 6e50: 0c 94 69 f7 jmp 0x1eed2 ; 0x1eed2 6e54: 0c 94 03 ed jmp 0x1da06 ; 0x1da06 6e58: 0c 94 27 77 jmp 0xee4e ; 0xee4e <__vector_23+0x88> 6e5c: 0c 94 b3 d3 jmp 0x1a766 ; 0x1a766 6e60: 0d 94 9f 17 jmp 0x22f3e ; 0x22f3e 6e64: 0d 94 e4 0f jmp 0x21fc8 ; 0x21fc8 6e68: 0c 94 25 bd jmp 0x17a4a ; 0x17a4a 6e6c: 0c 94 20 bf jmp 0x17e40 ; 0x17e40 6e70: 0d 94 8c 04 jmp 0x20918 ; 0x20918 6e74: 0c 94 ee d0 jmp 0x1a1dc ; 0x1a1dc 6e78: 0c 94 19 db jmp 0x1b632 ; 0x1b632 6e7c: 0c 94 62 c8 jmp 0x190c4 ; 0x190c4 6e80: 0c 94 0e d4 jmp 0x1a81c ; 0x1a81c 6e84: 0d 94 76 27 jmp 0x24eec ; 0x24eec 6e88: 0c 94 80 c3 jmp 0x18700 ; 0x18700 ()> 6e8c: 0d 94 88 0f jmp 0x21f10 ; 0x21f10 6e90: 0d 94 21 9d jmp 0x33a42 ; 0x33a42 6e94: 0c 94 2c d4 jmp 0x1a858 ; 0x1a858 6e98: 0c 94 33 d1 jmp 0x1a266 ; 0x1a266 6e9c: 0c 94 c3 be jmp 0x17d86 ; 0x17d86 6ea0: 0c 94 2e db jmp 0x1b65c ; 0x1b65c 6ea4: 0c 94 8a c3 jmp 0x18714 ; 0x18714 ()> 6ea8: 0c 94 92 cf jmp 0x19f24 ; 0x19f24 6eac: 0c 94 6b 73 jmp 0xe6d6 ; 0xe6d6 6eb0: 0d 94 9e 27 jmp 0x24f3c ; 0x24f3c 6eb4: 0c 94 07 c2 jmp 0x1840e ; 0x1840e 6eb8: 0d 94 b2 26 jmp 0x24d64 ; 0x24d64 6ebc: 0d 94 f5 26 jmp 0x24dea ; 0x24dea 6ec0: 0c 94 73 c4 jmp 0x188e6 ; 0x188e6 6ec4: 0d 94 72 26 jmp 0x24ce4 ; 0x24ce4 6ec8: 0c 94 94 c3 jmp 0x18728 ; 0x18728 ()> 6ecc: 0c 94 7a c4 jmp 0x188f4 ; 0x188f4 6ed0: 0d 94 a6 27 jmp 0x24f4c ; 0x24f4c 6ed4: 0c 94 f5 ec jmp 0x1d9ea ; 0x1d9ea 6ed8: 0d 94 ae 27 jmp 0x24f5c ; 0x24f5c 6edc: 0c 94 d9 d3 jmp 0x1a7b2 ; 0x1a7b2 6ee0: 0c 94 5c bd jmp 0x17ab8 ; 0x17ab8 6ee4: 0c 94 c8 ce jmp 0x19d90 ; 0x19d90 6ee8: 0d 94 d9 0b jmp 0x217b2 ; 0x217b2 6eec: 0d 94 96 0c jmp 0x2192c ; 0x2192c 6ef0: 0c 94 f5 d3 jmp 0x1a7ea ; 0x1a7ea 6ef4: 0c 94 0a bd jmp 0x17a14 ; 0x17a14 6ef8: 0d 94 24 27 jmp 0x24e48 ; 0x24e48 6efc: 0c 94 50 c8 jmp 0x190a0 ; 0x190a0 6f00: 0c 94 2f bd jmp 0x17a5e ; 0x17a5e 6f04: 0c 94 d5 cf jmp 0x19faa ; 0x19faa 6f08: 0c 94 4b bd jmp 0x17a96 ; 0x17a96 6f0c: 0d 94 26 97 jmp 0x32e4c ; 0x32e4c 6f10: 0c 94 37 bf jmp 0x17e6e ; 0x17e6e 6f14: 0d 94 86 27 jmp 0x24f0c ; 0x24f0c 6f18: 0c 94 d8 cf jmp 0x19fb0 ; 0x19fb0 6f1c: 0c 94 55 bf jmp 0x17eaa ; 0x17eaa 6f20: 0c 94 d4 c7 jmp 0x18fa8 ; 0x18fa8 6f24: 0d 94 2a 97 jmp 0x32e54 ; 0x32e54 6f28: 0c 94 db c3 jmp 0x187b6 ; 0x187b6 6f2c: 0c 94 88 c4 jmp 0x18910 ; 0x18910 6f30: 0c 94 28 db jmp 0x1b650 ; 0x1b650 6f34: 0c 94 20 ed jmp 0x1da40 ; 0x1da40 6f38: 0c 94 10 f9 jmp 0x1f220 ; 0x1f220 6f3c: 0c 94 03 ea jmp 0x1d406 ; 0x1d406 6f40: 0c 94 86 ec jmp 0x1d90c ; 0x1d90c 6f44: 0c 94 89 77 jmp 0xef12 ; 0xef12 <__vector_23+0x14c> 6f48: 0d 94 ef 03 jmp 0x207de ; 0x207de 6f4c: 0d 94 26 05 jmp 0x20a4c ; 0x20a4c 6f50: 0c 94 87 c0 jmp 0x1810e ; 0x1810e 6f54: 0c 94 68 d7 jmp 0x1aed0 ; 0x1aed0 6f58: 0c 94 ff d3 jmp 0x1a7fe ; 0x1a7fe 6f5c: 0c 94 c1 fb jmp 0x1f782 ; 0x1f782 6f60: 0c 94 7b c3 jmp 0x186f6 ; 0x186f6 ()> 6f64: 0c 94 7c e3 jmp 0x1c6f8 ; 0x1c6f8 6f68: 0c 94 05 bf jmp 0x17e0a ; 0x17e0a 6f6c: 0d 94 23 97 jmp 0x32e46 ; 0x32e46 6f70: 0c 94 c0 ec jmp 0x1d980 ; 0x1d980 6f74: 0c 94 70 ec jmp 0x1d8e0 ; 0x1d8e0 6f78: 0c 94 8f c4 jmp 0x1891e ; 0x1891e 6f7c: 0d 94 7e 27 jmp 0x24efc ; 0x24efc 6f80: 0c 94 e1 d3 jmp 0x1a7c2 ; 0x1a7c2 6f84: 0c 94 3d bd jmp 0x17a7a ; 0x17a7a 6f88: 0d 94 28 9d jmp 0x33a50 ; 0x33a50 6f8c: 0c 94 97 d0 jmp 0x1a12e ; 0x1a12e 6f90: 0c 94 29 bd jmp 0x17a52 ; 0x17a52 6f94: 0c 94 81 c4 jmp 0x18902 ; 0x18902 6f98: 0d 94 96 27 jmp 0x24f2c ; 0x24f2c 6f9c: 0d 94 43 05 jmp 0x20a86 ; 0x20a86 6fa0: 0d 94 bc 26 jmp 0x24d78 ; 0x24d78 6fa4: 0d 94 44 10 jmp 0x22088 ; 0x22088 6fa8: 0c 94 e5 cc jmp 0x199ca ; 0x199ca 6fac: 0c 94 35 77 jmp 0xee6a ; 0xee6a <__vector_23+0xa4> 6fb0: 0c 94 d2 cf jmp 0x19fa4 ; 0x19fa4 6fb4: 0c 94 d3 da jmp 0x1b5a6 ; 0x1b5a6 6fb8: 0c 94 9a d0 jmp 0x1a134 ; 0x1a134 6fbc: 0c 94 a5 de jmp 0x1bd4a ; 0x1bd4a 6fc0: 0c 94 2c bf jmp 0x17e58 ; 0x17e58 6fc4: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 6fc8: 0c 94 75 bf jmp 0x17eea ; 0x17eea 6fcc: 0d 94 5e 27 jmp 0x24ebc ; 0x24ebc 6fd0: 0d 94 35 04 jmp 0x2086a ; 0x2086a 6fd4: 0d 94 8a 26 jmp 0x24d14 ; 0x24d14 6fd8: 0c 94 5d cf jmp 0x19eba ; 0x19eba 6fdc: 0d 94 af 26 jmp 0x24d5e ; 0x24d5e 6fe0: 0c 94 45 bd jmp 0x17a8a ; 0x17a8a 6fe4: 0c 94 ae d3 jmp 0x1a75c ; 0x1a75c 6fe8: 0d 94 b2 07 jmp 0x20f64 ; 0x20f64 6fec: 0c 94 bf 7a jmp 0xf57e ; 0xf57e 6ff0: 0c 94 c7 d3 jmp 0x1a78e ; 0x1a78e 6ff4: 0c 94 fa c8 jmp 0x191f4 ; 0x191f4 6ff8: 0d 94 c4 96 jmp 0x32d88 ; 0x32d88 6ffc: 0c 94 76 c3 jmp 0x186ec ; 0x186ec ()> 7000: 0d 94 5b 27 jmp 0x24eb6 ; 0x24eb6 7004: 0c 94 af da jmp 0x1b55e ; 0x1b55e 7008: 0c 94 a3 f8 jmp 0x1f146 ; 0x1f146 700c: 0c 94 18 bd jmp 0x17a30 ; 0x17a30 7010: 0d 94 27 27 jmp 0x24e4e ; 0x24e4e 7014: 0d 94 75 04 jmp 0x208ea ; 0x208ea 7018: 0c 94 3a db jmp 0x1b674 ; 0x1b674 701c: 0c 94 64 c0 jmp 0x180c8 ; 0x180c8 7020: 0c 94 46 db jmp 0x1b68c ; 0x1b68c 7024: 0c 94 5b c1 jmp 0x182b6 ; 0x182b6 7028: 0c 94 ce be jmp 0x17d9c ; 0x17d9c 702c: 0c 94 77 77 jmp 0xeeee ; 0xeeee <__vector_23+0x128> 7030: 0c 94 41 bd jmp 0x17a82 ; 0x17a82 7034: 0d 94 31 9d jmp 0x33a62 ; 0x33a62 7038: 0c 94 62 c2 jmp 0x184c4 ; 0x184c4 703c: 0d 94 36 9d jmp 0x33a6c ; 0x33a6c 7040: 0d 94 06 97 jmp 0x32e0c ; 0x32e0c 7044: 0c 94 67 cf jmp 0x19ece ; 0x19ece 7048: 0c 94 16 e9 jmp 0x1d22c ; 0x1d22c 704c: 0c 94 cc cf jmp 0x19f98 ; 0x19f98 7050: 0c 94 0c c6 jmp 0x18c18 ; 0x18c18 7054: 0c 94 c9 cf jmp 0x19f92 ; 0x19f92 7058: 0d 94 38 0b jmp 0x21670 ; 0x21670 705c: 0c 94 b9 de jmp 0x1bd72 ; 0x1bd72 7060: 0d 94 55 27 jmp 0x24eaa ; 0x24eaa 7064: 0d 94 58 27 jmp 0x24eb0 ; 0x24eb0 7068: 0c 94 7c ec jmp 0x1d8f8 ; 0x1d8f8 706c: 0c 94 6e cb jmp 0x196dc ; 0x196dc 7070: 0c 94 3b ff jmp 0x1fe76 ; 0x1fe76 7074: 0c 94 80 e9 jmp 0x1d300 ; 0x1d300 7078: 0c 94 7f bf jmp 0x17efe ; 0x17efe 707c: 0c 94 8f c3 jmp 0x1871e ; 0x1871e ()> 7080: 0c 94 6d df jmp 0x1beda ; 0x1beda 7084: 0c 94 aa 78 jmp 0xf154 ; 0xf154 7088: 0c 94 0c ed jmp 0x1da18 ; 0x1da18 708c: 0c 94 86 d0 jmp 0x1a10c ; 0x1a10c 7090: 0c 94 d6 fe jmp 0x1fdac ; 0x1fdac 7094: 0c 94 41 ce jmp 0x19c82 ; 0x19c82 7098: 0c 94 a0 e5 jmp 0x1cb40 ; 0x1cb40 709c: 0c 94 1c bd jmp 0x17a38 ; 0x17a38 70a0: 0c 94 63 f7 jmp 0x1eec6 ; 0x1eec6 70a4: 0c 94 4e cb jmp 0x1969c ; 0x1969c 70a8: 0d 94 21 27 jmp 0x24e42 ; 0x24e42 70ac: 0c 94 11 bf jmp 0x17e22 ; 0x17e22 70b0: 0c 94 14 f9 jmp 0x1f228 ; 0x1f228 70b4: 0d 94 17 10 jmp 0x2202e ; 0x2202e 70b8: 0c 94 49 c4 jmp 0x18892 ; 0x18892 70bc: 0c 94 85 c3 jmp 0x1870a ; 0x1870a ()> 70c0: 0c 94 a5 f9 jmp 0x1f34a ; 0x1f34a 70c4: 0c 94 57 d0 jmp 0x1a0ae ; 0x1a0ae 70c8: 0c 94 4b bf jmp 0x17e96 ; 0x17e96 70cc: 0c 94 22 d4 jmp 0x1a844 ; 0x1a844 70d0: 0c 94 96 e9 jmp 0x1d32c ; 0x1d32c 70d4: 0c 94 53 ff jmp 0x1fea6 ; 0x1fea6 70d8: 0c 94 bb da jmp 0x1b576 ; 0x1b576 70dc: 0c 94 27 cc jmp 0x1984e ; 0x1984e 70e0: 0c 94 6b bf jmp 0x17ed6 ; 0x17ed6 70e4: 0d 94 bf 9c jmp 0x3397e ; 0x3397e 70e8: 0c 94 2b db jmp 0x1b656 ; 0x1b656 70ec: 0c 94 37 bd jmp 0x17a6e ; 0x17a6e 70f0: 0c 94 02 77 jmp 0xee04 ; 0xee04 <__vector_23+0x3e> 70f4: 0c 94 92 c6 jmp 0x18d24 ; 0x18d24 70f8: 0c 94 66 fa jmp 0x1f4cc ; 0x1f4cc 70fc: 0c 94 10 bd jmp 0x17a20 ; 0x17a20 7100: 0d 94 b6 27 jmp 0x24f6c ; 0x24f6c 7104: 0c 94 4f bd jmp 0x17a9e ; 0x17a9e 7108: 0c 94 bd d3 jmp 0x1a77a ; 0x1a77a 710c: 0d 94 29 64 jmp 0x2c852 ; 0x2c852 7110: 0c 94 bd be jmp 0x17d7a ; 0x17d7a 7114: 0c 94 4e c0 jmp 0x1809c ; 0x1809c 7118: 0c 94 53 bd jmp 0x17aa6 ; 0x17aa6 711c: 0d 94 28 10 jmp 0x22050 ; 0x22050 7120: 0c 94 8b de jmp 0x1bd16 ; 0x1bd16 7124: 0c 94 36 d4 jmp 0x1a86c ; 0x1a86c 7128: 0c 94 c8 fa jmp 0x1f590 ; 0x1f590 712c: 0c 94 be bf jmp 0x17f7c ; 0x17f7c 7130: 0d 94 1a 11 jmp 0x22234 ; 0x22234 7134: 0c 94 67 d0 jmp 0x1a0ce ; 0x1a0ce 7138: 0c 94 6b c8 jmp 0x190d6 ; 0x190d6 713c: 0d 94 66 27 jmp 0x24ecc ; 0x24ecc 7140: 0c 94 e9 d0 jmp 0x1a1d2 ; 0x1a1d2 7144: 0d 94 24 9d jmp 0x33a48 ; 0x33a48 7148: 0c 94 07 d7 jmp 0x1ae0e ; 0x1ae0e 714c: 0d 94 8e 27 jmp 0x24f1c ; 0x24f1c 7150: 0d 94 37 05 jmp 0x20a6e ; 0x20a6e 7154: 0c 94 82 73 jmp 0xe704 ; 0xe704 <_menu_edit_P()> 7158: 0d 94 fc 0d jmp 0x21bf8 ; 0x21bf8 715c: 0c 94 f1 ec jmp 0x1d9e2 ; 0x1d9e2 7160: 0c 94 cf 63 jmp 0xc79e ; 0xc79e <_GLOBAL__sub_D_card> 7164: 0d 94 d1 07 jmp 0x20fa2 ; 0x20fa2 7168: 0d 94 f7 06 jmp 0x20dee ; 0x20dee 716c: 0c 94 14 bd jmp 0x17a28 ; 0x17a28 7170: 0c 94 ab bf jmp 0x17f56 ; 0x17f56 7174: 0c 94 6b c0 jmp 0x180d6 ; 0x180d6 00007178 <__trampolines_end>: 7178: 6e 61 ori r22, 0x1E ; 30 717a: 6e 00 .word 0x006e ; ???? 0000717c <__c.2228>: 717c: 69 6e 66 00 00 40 7a 10 f3 5a 00 a0 72 4e 18 09 inf..@z..Z..rN.. 718c: 00 10 a5 d4 e8 00 00 e8 76 48 17 00 00 e4 0b 54 ........vH.....T 719c: 02 00 00 ca 9a 3b 00 00 00 e1 f5 05 00 00 80 96 .....;.......... 71ac: 98 00 00 00 40 42 0f 00 00 00 a0 86 01 00 00 00 ....@B.......... 71bc: 10 27 00 00 00 00 e8 03 00 00 00 00 64 00 00 00 .'..........d... 71cc: 00 00 0a 00 00 00 00 00 01 00 00 00 00 00 2c 76 ..............,v 71dc: d8 88 dc 67 4f 08 23 df c1 df ae 59 e1 b1 b7 96 ...gO.#....Y.... 71ec: e5 e3 e4 53 c6 3a e6 51 99 76 96 e8 e6 c2 84 26 ...S.:.Q.v.....& 71fc: eb 89 8c 9b 62 ed 40 7c 6f fc ef bc 9c 9f 40 f2 ....b.@|o.....@. 720c: ba a5 6f a5 f4 90 05 5a 2a f7 5c 93 6b 6c f9 67 ..o....Z*.\.kl.g 721c: 6d c1 1b fc e0 e4 0d 47 fe f5 20 e6 b5 00 d0 ed m......G.. ..... 722c: 90 2e 03 00 94 35 77 05 00 80 84 1e 08 00 00 20 .....5w........ 723c: 4e 0a 00 00 00 c8 0c 33 33 33 33 0f 98 6e 12 83 N......3333..n.. 724c: 11 41 ef 8d 21 14 89 3b e6 55 16 cf fe e6 db 18 .A..!..;.U...... 725c: d1 84 4b 38 1b f7 7c 1d 90 1d a4 bb e4 24 20 32 ..K8..|......$ 2 726c: 84 72 5e 22 81 00 c9 f1 24 ec a1 e5 3d 27 .r^"....$...=' 0000727a : 727a: 22 00 ". 0000727c : ... 0000727d : 727d: 20 45 53 50 00 ESP. 00007282 : 7282: 20 4e 53 50 00 NSP. 00007287 : 7287: 20 4f 46 46 00 OFF. 0000728c : 728c: 20 4f 4e 00 ON. 00007290 : 7290: 50 56 30 31 00 PV01. 00007295 : 7295: 20 5b 4d 50 5d 20 00 [MP] . 0000729c : 729c: 25 69 20 68 6f 75 72 73 20 25 69 20 6d 69 6e 75 %i hours %i minu 72ac: 74 65 73 00 tes. 000072b0 : 72b0: 52 58 20 74 69 6d 65 6f 75 74 00 RX timeout. 000072bb : 72bb: 4d 33 31 30 00 M310. 000072c0 : 72c0: 4d 31 31 32 00 M112. 000072c5 : 72c5: 4d 31 31 30 00 M110. 000072ca : 72ca: 46 75 6c 6c 20 52 58 20 42 75 66 66 65 72 00 Full RX Buffer. 000072d9 : 72d9: 53 65 74 74 69 6e 67 73 20 53 74 6f 72 65 64 00 Settings Stored. 000072e9 : 72e9: 53 74 6f 72 65 64 20 73 65 74 74 69 6e 67 73 20 Stored settings 72f9: 72 65 74 72 69 65 76 65 64 00 retrieved. 00007303 : 7303: 48 61 72 64 63 6f 64 65 64 20 44 65 66 61 75 6c Hardcoded Defaul 7313: 74 20 53 65 74 74 69 6e 67 73 20 4c 6f 61 64 65 t Settings Loade 7323: 64 00 d. 00007325 : 7325: 56 32 00 00 00 00 c8 42 00 00 c8 42 00 00 c8 43 V2.....B...B...C 7335: 00 00 05 43 00 00 48 43 00 00 48 43 00 00 40 41 ...C..HC..HC..@A 7345: 00 00 f0 42 e8 03 00 00 e8 03 00 00 c8 00 00 00 ...B............ 7355: 88 13 00 00 00 40 9c 44 00 40 9c 44 00 00 00 00 .....@.D.@.D.... 7365: 00 00 00 00 20 4e 00 00 00 00 20 41 00 00 20 41 .... N.... A.. A 7375: cd cc cc 3e 00 00 90 40 00 00 00 00 00 00 00 00 ...>...@........ 7385: 00 00 00 00 cd cc cc 3e 3d 0a 81 41 ff 08 43 3e .......>=..A..C> 7395: b0 99 ab 43 8f 42 fc 42 e6 5a 34 3f 4c 62 b0 45 ...C.B.B.Z4?Lb.E 73a5: 00 00 00 00 00 40 40 00 00 34 42 00 00 00 00 00 .....@@..4B..... 73b5: 00 00 00 00 00 00 41 00 00 00 e0 3f 00 00 2c 43 ......A....?..,C 73c5: 00 00 2c 43 00 00 40 41 00 00 f0 42 c0 03 00 00 ..,C..@A...B.... 73d5: c0 03 00 00 c8 00 00 00 88 13 00 00 10 10 10 10 ................ 73e5: 00 40 9c 44 00 00 80 3f 00 00 00 3f 19 14 00 00 .@.D...?...?.... ... 000073f6 : 73f6: 20 30 78 00 0x. 000073fa : 73fa: 20 30 78 00 0x. 000073fe : 73fe: 65 72 72 6f 72 3a 20 00 error: . 00007406 : 7406: 44 32 33 20 2d 20 65 6d 65 72 67 65 6e 63 79 20 D23 - emergency 7416: 73 65 72 69 61 6c 20 64 75 6d 70 00 serial dump. 00007422 : 7422: 43 75 73 74 6f 6d 00 Custom. 00007429 : 7429: 4e 79 6c 6f 6e 50 41 00 NylonPA. 00007431 : 7431: 53 61 74 69 6e 20 20 00 Satin . 00007439 : 7439: 54 65 78 74 75 72 00 Textur. 00007440 : 7440: 53 6d 6f 6f 74 68 00 Smooth. 00007447 : 7447: 31 2e 30 00 1.0. 0000744b : 744b: 31 2e 35 00 1.5. 0000744f : 744f: 55 4e 4b 4e 4f 57 4e 00 UNKNOWN. 00007457 : 7457: 4c 41 31 30 43 3a 20 4c 69 6e 65 61 72 20 41 64 LA10C: Linear Ad 7467: 76 61 6e 63 65 20 6d 6f 64 65 3a 20 00 vance mode: . 00007474 : 7474: 4c 41 31 30 43 3a 20 41 64 6a 75 73 74 65 64 20 LA10C: Adjusted 7484: 45 2d 4a 65 72 6b 3a 20 00 E-Jerk: . 0000748d <_PRI_LANG_SIGNATURE>: 748d: ff ff ff ff .... 00007491 : 7491: 3e 0f a8 af 00 48 00 69 96 00 00 df 60 25 55 58 >....H.i....`%UX 74a1: 87 68 04 27 f2 e0 00 5e 34 03 cc 19 60 f3 3c 0e .h.'...^4...`.<. 74b1: f8 8f 00 db 08 02 94 92 00 3e 1c 07 9a 87 00 e5 .........>...... 74c1: 24 00 85 28 52 7e 06 00 1b e4 00 7e 78 12 70 78 $..(R~.....~x.px 74d1: 70 61 f8 12 78 8f 88 41 78 42 70 78 70 61 78 25 pa..x..AxBpxpax% 74e1: 70 78 70 61 f8 50 78 8f 88 d1 f0 25 27 07 87 61 pxpa.Px....%'..a 74f1: f0 25 27 8f 88 41 2c 0d 27 aa 50 d1 bc 07 07 87 .%'..A,.'.P..... 7501: 11 61 be 78 8f 88 11 41 78 52 70 78 70 61 f8 52 .a.x...AxRpxpa.R 7511: 78 8f 88 41 20 12 78 88 70 63 20 52 78 88 70 63 x..A .x.pc Rx.pc 7521: 48 52 78 88 87 43 03 11 17 99 70 64 18 12 78 f8 HRx..C....pd..x. 7531: 70 65 44 12 f8 f8 f0 45 18 42 78 f8 70 65 18 25 peD....E.Bx.pe.% 7541: 78 f8 70 65 18 52 78 f8 70 65 18 50 78 f8 70 65 x.pe.Rx.pe.Px.pe 7551: 0c 07 8f 87 23 65 a2 0f 8f 8f 11 45 00 12 06 22 ....#e.....E..." 7561: 70 69 00 12 07 22 27 49 00 25 06 22 70 69 00 25 pi..."'I.%."pi.% 7571: 07 22 27 49 00 12 06 22 27 6c 02 62 36 a2 70 6c ."'I..."'l.b6.pl 7581: 40 45 6c 44 70 4c 03 62 22 22 70 6c 43 88 88 88 @ElDpL.b""plC... 7591: f0 4c 78 12 bc 88 80 6e 78 52 bc 88 80 6e 38 12 .Lx....nxR...n8. 75a1: 78 88 70 6f 78 12 78 88 87 4f 38 42 78 88 70 6f x.pox.x..O8Bx.po 75b1: 38 25 78 88 70 6f 3a 00 79 ac 78 6f 3d 07 9a ac 8%x.po:.y.xo=... 75c1: 78 6f 78 50 78 88 87 ef 39 49 78 88 70 6f 08 52 xoxPx...9Ix.po.R 75d1: bc 88 80 72 98 52 f8 8f 98 52 20 12 78 70 f0 73 ...r.R...R .xp.s 75e1: 48 12 78 63 87 53 20 52 78 70 f0 73 48 52 78 63 H.xc.S Rxp.sHRxc 75f1: 87 53 10 07 87 0f 24 73 12 78 63 87 24 53 60 69 .S....$s.xc.$S`i 7601: 9a 98 8b e2 23 04 e4 44 30 74 10 4e 44 43 24 74 ....#..D0t.NDC$t 7611: 7c 12 88 89 60 75 3c 50 88 88 70 55 78 25 28 89 |...`u: 764d: 00 40 14 54 .@.T 00007651 : 7651: cd cc cc 3d 0a d7 23 3c 17 b7 d1 38 77 cc 2b 32 ...=..#<...8w.+2 7661: 95 95 e6 24 1f b1 4f 0a ...$..O. 00007669 : 7669: 00 00 20 41 00 00 c8 42 00 40 1c 46 20 bc be 4c .. A...B.@.F ..L 7679: ca 1b 0e 5a ae c5 9d 74 ...Z...t 00007681 : 7681: 4e 41 4e NAN 00007684 : 7684: 49 4e 46 INF 00007687 : 7687: 00 00 7a 43 00 00 52 43 00 00 52 43 ..zC..RC..RC 00007693 : 7693: 00 00 00 00 00 00 80 c0 9a 99 19 3e ...........> 0000769f : 769f: 00 00 00 00 00 00 80 c0 9a 99 19 3e ...........> 000076ab : 76ab: 20 50 3a 00 P:. 000076af : 76af: 20 42 40 3a 00 B@:. 000076b4 : 76b4: 20 40 3a 00 @:. 000076b8 : 76b8: 20 2f 00 /. 000076bb : 76bb: 20 54 30 3a 00 T0:. 000076c0 : 76c0: 20 2f 00 /. 000076c3 : 76c3: 20 42 3a 00 B:. 000076c7 : 76c7: 20 2f 00 /. 000076ca : 76ca: 54 3a 00 T:. 000076cd : 76cd: 25 53 45 78 63 65 73 73 69 76 65 20 62 65 64 20 %SExcessive bed 76dd: 6c 65 76 65 6c 69 6e 67 20 63 6f 72 72 65 63 74 leveling correct 76ed: 69 6f 6e 3a 20 25 69 20 6d 69 63 72 6f 6e 73 0a ion: %i microns. ... 000076fe : 76fe: 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69 Bed leveling fai 770e: 6c 65 64 2e 20 54 6f 6f 20 6d 75 63 68 20 76 61 led. Too much va 771e: 72 69 61 74 69 6f 6e 20 66 72 6f 6d 20 65 65 70 riation from eep 772e: 72 6f 6d 20 6d 65 73 68 00 rom mesh. 00007737 : 7737: 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69 Bed leveling fai 7747: 6c 65 64 2e 20 53 65 6e 73 6f 72 20 74 72 69 67 led. Sensor trig 7757: 67 65 72 65 64 20 74 6f 6f 20 73 6f 6f 6e 00 gered too soon. 00007766 : 7766: 20 20 00 . 00007769 : 7769: 4d 65 61 73 75 72 65 64 20 70 6f 69 6e 74 73 3a Measured points: ... 0000777a : 777a: 5a 20 73 65 61 72 63 68 20 68 65 69 67 68 74 3a Z search height: 778a: 20 35 2e 30 66 00 5.0f. 00007790 : 7790: 4e 75 6d 20 58 2c 59 3a 20 37 2c 37 00 Num X,Y: 7,7. 0000779d : 779d: 4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c 69 6e Mesh bed levelin 77ad: 67 20 6e 6f 74 20 61 63 74 69 76 65 2e 00 g not active.. 000077bb : 77bb: 20 45 3a 00 E:. 000077bf : 77bf: 20 5a 3a 00 Z:. 000077c3 : 77c3: 20 59 3a 00 Y:. 000077c7 : 77c7: 20 45 3a 00 E:. 000077cb : 77cb: 20 5a 3a 00 Z:. 000077cf : 77cf: 20 59 3a 00 Y:. 000077d3 : 77d3: 58 3a 00 X:. 000077d6 : 77d6: 20 2d 3e 20 00 -> . 000077db : 77db: 53 70 6f 6f 6c 4a 6f 69 6e 3a 20 00 SpoolJoin: . 000077e7 : 77e7: 2c 20 00 , . 000077ea : 77ea: 49 6e 61 63 74 69 76 69 74 79 20 53 68 75 74 64 Inactivity Shutd 77fa: 6f 77 6e 00 own. 000077fe : 77fe: 4b 49 4c 4c 45 44 2e 00 KILLED.. 00007806 : 7806: 50 72 69 6e 74 65 72 20 68 61 6c 74 65 64 2e 20 Printer halted. 7816: 6b 69 6c 6c 28 29 20 63 61 6c 6c 65 64 21 00 kill() called!. 00007825 : 7825: 5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75 Z live adjust ou 7835: 74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74 t of range. Sett 7845: 69 6e 67 20 74 6f 20 30 2e 20 43 6c 69 63 6b 20 ing to 0. Click 7855: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 00 to continue.. 00007862 : 7862: 5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75 Z live adjust ou 7872: 74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74 t of range. Sett 7882: 69 6e 67 20 74 6f 20 30 00 ing to 0. 0000788b : 788b: 20 45 3a 30 20 42 3a 00 E:0 B:. 00007893 : 7893: 54 3a 00 T:. 00007896 : 7896: 62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72 busy: paused for 78a6: 20 69 6e 70 75 74 00 input. 000078ad : 78ad: 62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72 busy: paused for 78bd: 20 75 73 65 72 00 user. 000078c3 : 78c3: 62 75 73 79 3a 20 70 72 6f 63 65 73 73 69 6e 67 busy: processing ... 000078d4 : 78d4: 73 65 72 69 61 6c 20 64 75 6d 70 20 00 serial dump . 000078e1 : 78e1: 49 6e 76 61 6c 69 64 20 54 20 63 6f 64 65 2e 00 Invalid T code.. 000078f1 : 78f1: 44 75 70 6c 69 63 61 74 65 20 54 2d 63 6f 64 65 Duplicate T-code 7901: 20 69 67 6e 6f 72 65 64 2e 00 ignored.. 0000790b : 790b: 41 64 76 61 6e 63 65 20 4b 3d 00 Advance K=. 00007916 : 7916: 4b 20 6f 75 74 20 6f 66 20 61 6c 6c 6f 77 65 64 K out of allowed 7926: 20 72 61 6e 67 65 21 00 range!. 0000792e <_sPrinterName>: 792e: 4d 4b 32 2e 35 00 MK2.5. 00007934 <_sPrinterMmuName>: 7934: 4d 4b 32 2e 35 4d 4d 55 32 00 MK2.5MMU2. 0000793e <_nPrinterMmuType>: 793e: 1a 4f .O 00007940 <_nPrinterType>: 7940: fa 00 .. 00007942 : 7942: 25 33 64 2f 25 33 64 00 %3d/%3d. 0000794a : 794a: 25 33 64 00 %3d. 0000794e : 794e: 20 0a 20 0a 20 0a 20 00 . . . . 00007956 : 7956: 25 53 53 74 61 74 69 73 74 69 63 73 3a 0a 25 53 %SStatistics:.%S 7966: 20 20 4d 37 38 20 53 25 6c 75 20 54 25 6c 75 0a M78 S%lu T%lu. ... 00007977 : 7977: 25 53 41 72 63 20 53 65 74 74 69 6e 67 73 3a 20 %SArc Settings: 7987: 50 3a 4d 61 78 20 6c 65 6e 67 74 68 28 6d 6d 29 P:Max length(mm) 7997: 20 53 3a 4d 69 6e 20 6c 65 6e 67 74 68 20 28 6d S:Min length (m 79a7: 6d 29 20 4e 3a 43 6f 72 72 65 63 74 69 6f 6e 73 m) N:Corrections 79b7: 20 52 3a 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 R:Min segments 79c7: 46 3a 53 65 67 6d 65 6e 74 73 2f 73 65 63 2e 0a F:Segments/sec.. 79d7: 25 53 20 20 4d 32 31 34 20 50 25 2e 32 66 20 53 %S M214 P%.2f S 79e7: 25 2e 32 66 20 4e 25 64 20 52 25 64 20 46 25 64 %.2f N%d R%d F%d 79f7: 0a 00 .. 000079f9 : 79f9: 25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69 %SFilament setti 7a09: 6e 67 73 3a 20 44 69 73 61 62 6c 65 64 0a 00 ngs: Disabled.. 00007a18 : 7a18: 25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69 %SFilament setti 7a28: 6e 67 73 3a 0a 25 53 20 20 20 4d 32 30 30 20 44 ngs:.%S M200 D 7a38: 25 2e 32 66 0a 00 %.2f.. 00007a3e : 7a3e: 25 53 52 65 74 72 61 63 74 3a 20 53 3d 4c 65 6e %SRetract: S=Len 7a4e: 67 74 68 20 28 6d 6d 29 20 46 3a 53 70 65 65 64 gth (mm) F:Speed 7a5e: 20 28 6d 6d 2f 6d 29 20 5a 3a 20 5a 4c 69 66 74 (mm/m) Z: ZLift 7a6e: 20 28 6d 6d 29 0a 25 53 20 20 20 4d 32 30 37 20 (mm).%S M207 7a7e: 53 25 2e 32 66 20 46 25 2e 32 66 20 5a 25 2e 32 S%.2f F%.2f Z%.2 7a8e: 66 0a 25 53 52 65 63 6f 76 65 72 3a 20 53 3d 45 f.%SRecover: S=E 7a9e: 78 74 72 61 20 6c 65 6e 67 74 68 20 28 6d 6d 29 xtra length (mm) 7aae: 20 46 3a 53 70 65 65 64 20 28 6d 6d 2f 6d 29 0a F:Speed (mm/m). 7abe: 25 53 20 20 20 4d 32 30 38 20 53 25 2e 32 66 20 %S M208 S%.2f 7ace: 46 25 2e 32 66 0a 25 53 41 75 74 6f 2d 52 65 74 F%.2f.%SAuto-Ret 7ade: 72 61 63 74 3a 20 53 3d 30 20 74 6f 20 64 69 73 ract: S=0 to dis 7aee: 61 62 6c 65 2c 20 31 20 74 6f 20 69 6e 74 65 72 able, 1 to inter 7afe: 70 72 65 74 20 65 78 74 72 75 64 65 2d 6f 6e 6c pret extrude-onl 7b0e: 79 20 6d 6f 76 65 73 20 61 73 20 72 65 74 72 61 y moves as retra 7b1e: 63 74 73 20 6f 72 20 72 65 63 6f 76 65 72 69 65 cts or recoverie 7b2e: 73 0a 25 53 20 20 20 4d 32 30 39 20 53 25 64 0a s.%S M209 S%d. ... 00007b3f : 7b3f: 25 53 50 49 44 20 68 65 61 74 62 65 64 20 73 65 %SPID heatbed se 7b4f: 74 74 69 6e 67 73 3a 0a 25 53 20 20 20 4d 33 30 ttings:.%S M30 7b5f: 34 20 50 25 2e 32 66 20 49 25 2e 32 66 20 44 25 4 P%.2f I%.2f D% 7b6f: 2e 32 66 0a 00 .2f.. 00007b74 : 7b74: 25 53 50 49 44 20 73 65 74 74 69 6e 67 73 3a 0a %SPID settings:. 7b84: 25 53 20 20 20 4d 33 30 31 20 50 25 2e 32 66 20 %S M301 P%.2f 7b94: 49 25 2e 32 66 20 44 25 2e 32 66 0a 00 I%.2f D%.2f.. 00007ba1 : 7ba1: 25 53 53 74 65 70 73 20 70 65 72 20 75 6e 69 74 %SSteps per unit 7bb1: 3a 0a 25 53 20 20 4d 39 32 20 58 25 2e 32 66 20 :.%S M92 X%.2f 7bc1: 59 25 2e 32 66 20 5a 25 2e 32 66 20 45 25 2e 32 Y%.2f Z%.2f E%.2 7bd1: 66 0a 25 53 4d 61 78 69 6d 75 6d 20 66 65 65 64 f.%SMaximum feed 7be1: 72 61 74 65 73 20 28 6d 6d 2f 73 29 3a 0a 25 53 rates (mm/s):.%S 7bf1: 20 20 4d 32 30 33 20 58 25 2e 32 66 20 59 25 2e M203 X%.2f Y%. 7c01: 32 66 20 5a 25 2e 32 66 20 45 25 2e 32 66 0a 25 2f Z%.2f E%.2f.% 7c11: 53 4d 61 78 69 6d 75 6d 20 61 63 63 65 6c 65 72 SMaximum acceler 7c21: 61 74 69 6f 6e 20 28 6d 6d 2f 73 32 29 3a 0a 25 ation (mm/s2):.% 7c31: 53 20 20 4d 32 30 31 20 58 25 6c 75 20 59 25 6c S M201 X%lu Y%l 7c41: 75 20 5a 25 6c 75 20 45 25 6c 75 0a 25 53 41 63 u Z%lu E%lu.%SAc 7c51: 63 65 6c 65 72 61 74 69 6f 6e 3a 20 50 3d 70 72 celeration: P=pr 7c61: 69 6e 74 2c 20 52 3d 72 65 74 72 61 63 74 2c 20 int, R=retract, 7c71: 54 3d 74 72 61 76 65 6c 0a 25 53 20 20 4d 32 30 T=travel.%S M20 7c81: 34 20 50 25 2e 32 66 20 52 25 2e 32 66 20 54 25 4 P%.2f R%.2f T% 7c91: 2e 32 66 0a 25 53 41 64 76 61 6e 63 65 64 20 76 .2f.%SAdvanced v 7ca1: 61 72 69 61 62 6c 65 73 3a 20 53 3d 4d 69 6e 20 ariables: S=Min 7cb1: 66 65 65 64 72 61 74 65 20 28 6d 6d 2f 73 29 2c feedrate (mm/s), 7cc1: 20 54 3d 4d 69 6e 20 74 72 61 76 65 6c 20 66 65 T=Min travel fe 7cd1: 65 64 72 61 74 65 20 28 6d 6d 2f 73 29 2c 20 42 edrate (mm/s), B 7ce1: 3d 6d 69 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74 =minimum segment 7cf1: 20 74 69 6d 65 20 28 75 73 29 2c 20 58 3d 6d 61 time (us), X=ma 7d01: 78 69 6d 75 6d 20 58 59 20 6a 65 72 6b 20 28 6d ximum XY jerk (m 7d11: 6d 2f 73 29 2c 20 20 5a 3d 6d 61 78 69 6d 75 6d m/s), Z=maximum 7d21: 20 5a 20 6a 65 72 6b 20 28 6d 6d 2f 73 29 2c 20 Z jerk (mm/s), 7d31: 20 45 3d 6d 61 78 69 6d 75 6d 20 45 20 6a 65 72 E=maximum E jer 7d41: 6b 20 28 6d 6d 2f 73 29 0a 25 53 20 20 4d 32 30 k (mm/s).%S M20 7d51: 35 20 53 25 2e 32 66 20 54 25 2e 32 66 20 42 25 5 S%.2f T%.2f B% 7d61: 6c 75 20 58 25 2e 32 66 20 59 25 2e 32 66 20 5a lu X%.2f Y%.2f Z 7d71: 25 2e 32 66 20 45 25 2e 32 66 0a 25 53 48 6f 6d %.2f E%.2f.%SHom 7d81: 65 20 6f 66 66 73 65 74 20 28 6d 6d 29 3a 0a 25 e offset (mm):.% 7d91: 53 20 20 4d 32 30 36 20 58 25 2e 32 66 20 59 25 S M206 X%.2f Y% 7da1: 2e 32 66 20 5a 25 2e 32 66 0a 00 .2f Z%.2f.. 00007dac : 7dac: 43 61 70 3a 25 53 3a 25 63 0a 00 Cap:%S:%c.. 00007db7 : 7db7: 50 52 55 53 41 5f 4d 4d 55 32 00 PRUSA_MMU2. 00007dc2 : 7dc2: 45 58 54 45 4e 44 45 44 5f 4d 32 30 00 EXTENDED_M20. 00007dcf : 7dcf: 41 55 54 4f 52 45 50 4f 52 54 5f 50 4f 53 49 54 AUTOREPORT_POSIT 7ddf: 49 4f 4e 00 ION. 00007de3 : 7de3: 41 55 54 4f 52 45 50 4f 52 54 5f 46 41 4e 53 00 AUTOREPORT_FANS. 00007df3 : 7df3: 41 55 54 4f 52 45 50 4f 52 54 5f 54 45 4d 50 00 AUTOREPORT_TEMP. 00007e03 : ... 00007e04 : 7e04: 44 65 6c 65 74 69 6f 6e 20 66 61 69 6c 65 64 2c Deletion failed, 7e14: 20 46 69 6c 65 3a 20 00 File: . 00007e1c : 7e1c: 46 69 6c 65 20 64 65 6c 65 74 65 64 3a 00 File deleted:. 00007e2a : 7e2a: 4e 6f 74 20 53 44 20 70 72 69 6e 74 69 6e 67 00 Not SD printing. 00007e3a : 7e3a: 50 72 69 6e 74 20 73 61 76 65 64 00 Print saved. 00007e46 : 7e46: 53 44 20 70 72 69 6e 74 20 70 61 75 73 65 64 00 SD print paused. 00007e56 : 7e56: 25 33 64 2f 25 33 64 00 %3d/%3d. 00007e5e : 7e5e: 66 76 00 fv. 00007e61 : 7e61: 74 68 78 00 thx. 00007e65 : 7e65: 50 52 4e 00 PRN. 00007e69 <_ZZ16process_commandsvE3__c__84_>: 7e69: 22 28 32 29 00 "(2). 00007e6e <_ZZ16process_commandsvE3__c__83_>: 7e6e: 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 no valid command ... 00007e7f <_ZZ16process_commandsvE3__c__82_>: 7e7f: 7a 65 72 6f 72 69 7a 65 64 00 zerorized. 00007e89 <_ZZ16process_commandsvE3__c__81_>: 7e89: 66 61 63 74 6f 72 79 20 72 65 73 74 6f 72 65 64 factory restored ... 00007e9a <_ZZ16process_commandsvE3__c__79_>: 7e9a: 69 6e 64 65 78 2c 20 74 65 6d 70 2c 20 75 73 74 index, temp, ust 7eaa: 65 70 2c 20 75 6d 00 ep, um. 00007eb1 <_ZZ16process_commandsvE3__c__80_>: 7eb1: 50 49 4e 44 41 20 63 61 6c 20 73 74 61 74 75 73 PINDA cal status 7ec1: 3a 20 00 : . 00007ec4 <_ZZ16process_commandsvE3__c__78_>: 7ec4: 50 3a 00 P:. 00007ec7 <_ZZ16process_commandsvE3__c__77_>: 7ec7: 57 61 69 74 20 66 6f 72 20 50 49 4e 44 41 20 74 Wait for PINDA t 7ed7: 61 72 67 65 74 20 74 65 6d 70 65 72 61 74 75 72 arget temperatur 7ee7: 65 3a 00 e:. 00007eea <_ZZ16process_commandsvE3__c__76_>: 7eea: 20 41 00 A. 00007eed <_ZZ16process_commandsvE3__c__75_>: 7eed: 20 50 00 P. 00007ef0 <_ZZ16process_commandsvE3__c__74_>: 7ef0: 20 42 00 B. 00007ef3 <_ZZ16process_commandsvE3__c__73_>: 7ef3: 20 4c 00 L. 00007ef6 <_ZZ16process_commandsvE3__c__72_>: 7ef6: 20 52 00 R. 00007ef9 <_ZZ16process_commandsvE3__c__71_>: 7ef9: 20 5a 00 Z. 00007efc <_ZZ16process_commandsvE3__c__70_>: 7efc: 20 4e 4f 54 20 49 4e 49 54 49 41 4c 49 5a 45 44 NOT INITIALIZED ... 00007f0d <_ZZ16process_commandsvE3__c__69_>: 7f0d: 53 68 65 65 74 20 00 Sheet . 00007f14 <_ZZ16process_commandsvE3__c__68_>: 7f14: 20 5a 20 56 41 4c 55 45 20 4f 55 54 20 4f 46 20 Z VALUE OUT OF 7f24: 52 41 4e 47 45 00 RANGE. 00007f2a <_ZZ16process_commandsvE3__c__67_>: 7f2a: 49 6e 76 61 6c 69 64 20 73 68 65 65 74 20 49 44 Invalid sheet ID 7f3a: 2e 20 41 6c 6c 6f 77 65 64 3a 20 30 2e 2e 00 . Allowed: 0... 00007f49 <_ZZ16process_commandsvE3__c__66_>: 7f49: 41 55 54 4f 00 AUTO. 00007f4e <_ZZ16process_commandsvE3__c__65_>: 7f4e: 4c 41 4e 47 20 53 45 4c 20 46 4f 52 43 45 44 00 LANG SEL FORCED. 00007f5e <_ZZ16process_commandsvE3__c__64_>: 7f5e: 20 64 3a 00 d:. 00007f62 <_ZZ16process_commandsvE3__c__63_>: 7f62: 20 69 3a 00 i:. 00007f66 <_ZZ16process_commandsvE3__c__62_>: 7f66: 20 70 3a 00 p:. 00007f6a <_ZZ16process_commandsvE3__c__61_>: 7f6a: 20 64 3a 00 d:. 00007f6e <_ZZ16process_commandsvE3__c__60_>: 7f6e: 20 69 3a 00 i:. 00007f72 <_ZZ16process_commandsvE3__c__59_>: 7f72: 20 70 3a 00 p:. 00007f76 <_ZZ16process_commandsvE3__c__58_>: 7f76: 25 69 25 25 0a 00 %i%%.. 00007f7c <_ZZ16process_commandsvE3__c__57_>: 7f7c: 25 69 25 25 0a 00 %i%%.. 00007f82 <_ZZ16process_commandsvE3__c__56_>: 7f82: 22 28 31 29 00 "(1). 00007f87 <_ZZ16process_commandsvE3__c__51_>: 7f87: 2f 2f 00 //. 00007f8a <_ZZ16process_commandsvE3__c__50_>: ... 00007f8b <_ZZ16process_commandsvE3__c__49_>: 7f8b: 20 45 58 54 52 55 44 45 52 5f 43 4f 55 4e 54 3a EXTRUDER_COUNT: 7f9b: 31 00 1. 00007f9d <_ZZ16process_commandsvE3__c__48_>: 7f9d: 20 4d 41 43 48 49 4e 45 5f 54 59 50 45 3a 00 MACHINE_TYPE:. 00007fac <_ZZ16process_commandsvE3__c__47_>: 7fac: 31 2e 30 00 1.0. 00007fb0 <_ZZ16process_commandsvE3__c__46_>: 7fb0: 20 62 61 73 65 64 20 6f 6e 20 4d 61 72 6c 69 6e based on Marlin 7fc0: 20 46 49 52 4d 57 41 52 45 5f 55 52 4c 3a 68 74 FIRMWARE_URL:ht 7fd0: 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d tps://github.com 7fe0: 2f 70 72 75 73 61 33 64 2f 50 72 75 73 61 2d 46 /prusa3d/Prusa-F 7ff0: 69 72 6d 77 61 72 65 20 50 52 4f 54 4f 43 4f 4c irmware PROTOCOL 8000: 5f 56 45 52 53 49 4f 4e 3a 00 _VERSION:. 0000800a <_ZZ16process_commandsvE3__c__45_>: 800a: 37 37 33 31 30 32 34 65 64 00 7731024ed. 00008014 <_ZZ16process_commandsvE3__c__44_>: 8014: 5f 00 _. 00008016 <_ZZ16process_commandsvE3__c__43_>: 8016: 38 32 37 39 00 8279. 0000801b <_ZZ16process_commandsvE3__c__42_>: 801b: 2b 00 +. 0000801d <_ZZ16process_commandsvE3__c__41_>: 801d: 46 49 52 4d 57 41 52 45 5f 4e 41 4d 45 3a 50 72 FIRMWARE_NAME:Pr 802d: 75 73 61 2d 46 69 72 6d 77 61 72 65 20 00 usa-Firmware . 0000803b <_ZZ16process_commandsvE3__c__40_>: 803b: 4d 31 31 33 20 53 00 M113 S. 00008042 <_ZZ16process_commandsvE3__c__39_>: 8042: 6f 6b 20 00 ok . 00008046 <_ZZ16process_commandsvE3__c__33_>: 8046: 6e 2f 61 00 n/a. 0000804a <_ZZ16process_commandsvE3__c__32_>: 804a: 3f 54 6f 73 68 69 62 61 20 46 6c 61 73 68 41 69 ?Toshiba FlashAi 805a: 72 20 47 65 74 49 50 20 66 61 69 6c 65 64 0a 00 r GetIP failed.. 0000806a : 806a: 00 01 25 30 1d 0c ff 24 31 1c 0b ff 23 2f 1b 0a ..%0...$1...#/.. 807a: 17 ff 04 06 22 2b 1a 03 36 35 35 38 ...."+..6558 00008086 <_ZZ16process_commandsvE3__c__31_>: 8086: 25 69 20 6d 69 6e 2c 20 25 69 20 73 65 63 00 %i min, %i sec. 00008095 <_ZZ16process_commandsvE3__c__28_>: 8095: 49 6e 76 61 6c 69 64 20 4d 20 63 6f 64 65 3a 20 Invalid M code: 80a5: 25 73 0a 00 %s.. 000080a9 <_ZZ16process_commandsvE3__c__22_>: 80a9: 50 49 4e 44 41 20 70 72 6f 62 65 20 63 61 6c 69 PINDA probe cali 80b9: 62 72 61 74 69 6f 6e 20 73 74 61 72 74 00 bration start. 000080c7 <_ZZ16process_commandsvE3__c__21_>: 80c7: 4e 6f 20 50 49 4e 44 41 20 74 68 65 72 6d 69 73 No PINDA thermis 80d7: 74 6f 72 00 tor. 000080db <_ZZ16process_commandsvE3__c__17_>: 80db: 73 65 74 00 set. 000080df <_ZZ16process_commandsvE3__c__16_>: 80df: 6e 6f 7a 7a 6c 65 00 nozzle. 000080e6 <_ZZ16process_commandsvE3__c__15_>: 80e6: 4d 42 4c 00 MBL. 000080ea <_ZZ16process_commandsvE3__c__14_>: 80ea: 46 52 00 FR. 000080ed <_ZZ16process_commandsvE3__c__13_>: 80ed: 4c 7a 00 Lz. 000080f0 <_ZZ16process_commandsvE3__c__12_>: 80f0: 4c 61 6e 67 00 Lang. 000080f5 <_ZZ16process_commandsvE3__c__11_>: 80f5: 31 5f 37 35 6d 6d 5f 4d 4b 32 35 2d 52 41 4d 42 1_75mm_MK25-RAMB 8105: 6f 31 33 61 2d 45 33 44 76 36 66 75 6c 6c 00 o13a-E3Dv6full. 00008114 <_ZZ16process_commandsvE3__c__10_>: 8114: 52 65 76 00 Rev. 00008118 : 8118: 33 2e 31 34 2e 31 2d 38 32 37 39 00 3.14.1-8279. 00008124 : 8124: 46 69 72 00 Fir. 00008128 : 8128: 53 4e 20 69 6e 76 61 6c 69 64 00 SN invalid. 00008133 : 8133: 53 4e 00 SN. 00008136 : 8136: 52 45 53 45 54 00 RESET. 0000813c : 813c: 4d 4d 55 52 45 53 00 MMURES. 00008143 : 8143: 75 76 6c 6f 00 uvlo. 00008148 : 8148: 46 41 4e 00 FAN. 0000814c : 814c: 46 41 4e 50 49 4e 54 53 54 00 FANPINTST. 00008156 : 8156: 50 52 55 53 41 00 PRUSA. 0000815c : 815c: 25 2e 31 30 53 20 00 %.10S . 00008163 : 8163: 25 34 64 00 %4d. 00008167 : 8167: 45 78 72 65 6d 65 20 73 70 61 6e 20 6f 66 20 74 Exreme span of t 8177: 68 65 20 5a 20 76 61 6c 75 65 73 21 00 he Z values!. 00008184 : 8184: 25 64 2f 39 00 %d/9. 00008189 : 8189: 4d 31 30 34 53 30 00 M104S0. 00008190 : 8190: 47 31 58 31 30 59 31 38 30 46 34 30 30 30 00 G1X10Y180F4000. 0000819f : 819f: 47 31 5a 31 30 46 31 33 30 30 00 G1Z10F1300. 000081aa : 81aa: 4d 31 34 30 53 30 00 M140S0. 000081b1 : 81b1: 47 31 45 2d 30 2e 30 37 35 46 32 31 30 30 00 G1E-0.075F2100. 000081c0 : 81c0: 4d 32 30 34 53 31 30 30 30 00 M204S1000. 000081ca : 81ca: 47 31 5a 35 46 37 32 30 30 00 G1Z5F7200. 000081d4 : 81d4: 47 31 45 2d 31 2e 35 46 32 31 30 30 00 G1E-1.5F2100. 000081e1 : 81e1: 47 31 5a 30 2e 32 00 G1Z0.2. 000081e8 : 81e8: 47 31 58 32 30 32 2e 35 45 38 46 31 34 30 30 00 G1X202.5E8F1400. 000081f8 : 81f8: 47 31 59 2d 32 46 31 30 30 30 00 G1Y-2F1000. 00008203 : 8203: 47 31 58 32 34 30 45 32 35 46 32 32 30 30 00 G1X240E25F2200. 00008212 : 8212: 47 31 5a 30 2e 33 46 31 30 30 30 00 G1Z0.3F1000. 0000821e : 821e: 47 31 58 35 35 45 38 46 32 30 30 30 00 G1X55E8F2000. 0000822b : 822b: 47 31 58 35 45 32 39 46 31 38 30 30 00 G1X5E29F1800. 00008238 : 8238: 47 31 58 35 35 45 32 39 46 31 30 37 33 00 G1X55E29F1073. 00008246 : 8246: 47 39 32 45 30 00 G92E0. 0000824c : 824c: 47 32 38 00 G28. 00008250 : 8250: 4d 31 30 39 00 M109. 00008255 : 8255: 4d 31 39 30 00 M190. 0000825a : 825a: 25 2d 31 32 2e 31 32 53 25 2b 38 2e 31 66 00 %-12.12S%+8.1f. 00008269 : 8269: 45 78 74 72 75 64 65 72 3a 00 Extruder:. 00008273 : 8273: 25 63 25 31 37 2e 32 66 6d 6d 00 %c%17.2fmm. 0000827e : 827e: 58 3a 00 X:. 00008281 : 8281: 59 3a 00 Y:. 00008284 : 8284: 5a 3a 00 Z:. 00008287 : 8287: 25 63 25 2d 31 33 2e 31 33 53 25 2b 35 2e 33 66 %c%-13.13S%+5.3f ... 00008298 : 8298: 25 33 75 00 %3u. 0000829c : 829c: 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f PINDA calibratio 82ac: 6e 20 66 61 69 6c 65 64 2e 20 43 6f 6e 74 69 6e n failed. Contin 82bc: 75 65 20 77 69 74 68 20 70 72 65 73 73 69 6e 67 ue with pressing 82cc: 20 74 68 65 20 6b 6e 6f 62 2e 00 the knob.. 000082d7 : 82d7: 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f PINDA calibratio 82e7: 6e 20 64 6f 6e 65 2e 20 43 6f 6e 74 69 6e 75 65 n done. Continue 82f7: 20 77 69 74 68 20 70 72 65 73 73 69 6e 67 20 74 with pressing t 8307: 68 65 20 6b 6e 6f 62 2e 00 he knob.. 00008310 : 8310: 5a 30 00 Z0. 00008313 : 8313: 5a 31 00 Z1. 00008316 : 8316: 59 30 00 Y0. 00008319 : 8319: 59 31 00 Y1. 0000831c : 831c: 58 30 00 X0. 0000831f : 831f: 58 31 00 X1. 00008322 : 8322: 45 6e 64 20 73 74 6f 70 73 20 64 69 61 67 00 End stops diag. 00008331 : 8331: 47 38 30 00 G80. 00008335 : 8335: 4d 34 35 00 M45. 00008339 : 8339: 4d 34 35 20 5a 00 M45 Z. 0000833f : 833f: 47 37 36 00 G76. 00008343 : 8343: 4d 37 30 31 20 50 30 00 M701 P0. 0000834b : 834b: 57 69 7a 61 72 64 20 73 74 61 74 65 3a 20 25 64 Wizard state: %d 835b: 0a 00 .. 0000835d : 835d: 45 78 70 65 72 69 6d 65 6e 74 61 6c 00 Experimental. 0000836a : 836a: 30 2e 38 30 00 0.80. 0000836f : 836f: 30 2e 36 30 00 0.60. 00008374 : 8374: 30 2e 34 30 00 0.40. 00008379 : 8379: 30 2e 32 35 00 0.25. 0000837e : 837e: 44 69 73 61 62 6c 65 20 66 61 72 6d 20 6d 6f 64 Disable farm mod 838e: 65 00 e. 00008390 : 8390: 52 65 73 65 74 20 4d 4d 55 00 Reset MMU. 0000839a : 839a: 4d 4d 55 00 MMU. 0000839e : 839e: 4d 34 34 00 M44. 000083a2 : 83a2: 47 39 39 00 G99. 000083a6 : 83a6: 44 69 73 61 62 6c 65 20 66 61 72 6d 20 6d 6f 64 Disable farm mod 83b6: 65 3f 00 e?. 000083b9 : 83b9: 47 32 38 20 58 59 00 G28 XY. 000083c0 : 83c0: 4d 20 38 34 00 M 84. 000083c5 : 83c5: 85 2e 2e 00 .... 000083c9 : 83c9: 25 33 64 2f 30 00 %3d/0. 000083cf : 83cf: 25 33 64 2f 30 00 %3d/0. 000083d5 : 83d5: 6c 63 64 5f 73 65 6c 66 63 68 65 63 6b 5f 61 78 lcd_selfcheck_ax 83e5: 69 73 20 25 64 2c 20 25 64 0a 00 is %d, %d.. 000083f0 : 83f0: 48 6f 74 65 6e 64 00 Hotend. 000083f7 : 83f7: 42 65 64 00 Bed. 000083fb : 83fb: 5a 00 Z. 000083fd : 83fd: 59 00 Y. 000083ff : 83ff: 58 00 X. 00008401 <_ZL13STR_SEPARATOR.lto_priv.417>: 8401: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------- 8411: 2d 2d 2d 2d 00 ----. 00008416 : 8416: 53 75 70 65 72 50 49 4e 44 41 3a 00 SuperPINDA:. 00008422 : 8422: 51 67 55 67 b1 81 aa 81 9f 81 90 81 cc 68 89 81 QgUg.........h.. 8432: 8e 68 .h 00008434 : 8434: 47 31 59 25 2e 34 66 45 25 2e 34 66 00 G1Y%.4fE%.4f. 00008441 : 8441: 47 31 5a 25 2e 32 66 00 G1Z%.2f. 00008449 : 8449: 47 31 58 35 30 59 31 35 35 00 G1X50Y155. 00008453 : 8453: 46 82 51 67 b3 6c d4 81 ca 81 c0 81 F.Qg.l...... 0000845f : 845f: 47 31 58 25 2e 34 66 45 25 2e 34 66 00 G1X%.4fE%.4f. 0000846c : 846c: 47 31 46 31 30 38 30 00 G1F1080. 00008474 : 8474: 38 82 2b 82 1e 82 12 82 46 82 03 82 f8 81 e8 81 8.+.....F....... 8484: e1 81 .. 00008486 : 8486: 54 25 64 00 T%d. 0000848a : 848a: 47 31 5a 30 2e 34 00 G1Z0.4. 00008491 : 8491: 47 31 59 2d 33 46 31 30 30 30 00 G1Y-3F1000. 0000849c : 849c: 55 67 55 82 50 82 4c 82 46 82 UgU.P.L.F. 000084a6 : 84a6: 4d 38 34 20 58 59 00 M84 XY. 000084ad : 84ad: 4d 31 30 39 20 53 32 38 30 00 M109 S280. 000084b7 : 84b7: 47 31 20 58 31 32 35 20 5a 32 30 30 20 46 31 30 G1 X125 Z200 F10 84c7: 30 30 00 00. 000084ca : 84ca: 49 6e 76 61 6c 69 64 20 50 49 44 20 63 61 6c 2e Invalid PID cal. 84da: 20 72 65 73 75 6c 74 73 2e 20 4e 6f 74 20 73 74 results. Not st 84ea: 6f 72 65 64 20 74 6f 20 45 45 50 52 4f 4d 2e 00 ored to EEPROM.. 000084fa : 84fa: 4d 33 30 31 20 50 25 2e 32 66 20 49 25 2e 32 66 M301 P%.2f I%.2f 850a: 20 44 25 2e 32 66 00 D%.2f. 00008511 : 8511: 4d 33 30 33 20 45 30 20 53 25 33 75 00 M303 E0 S%3u. 0000851e : 851e: 52 43 00 RC. 00008521 : 8521: 44 45 56 00 DEV. 00008525 : 8525: 42 45 54 41 00 BETA. 0000852a : 852a: 41 4c 50 48 41 00 ALPHA. 00008530 : 8530: 00 00 21 00 24 00 27 00 2a 00 2d 00 30 00 33 00 ..!.$.'.*.-.0.3. 8540: 01 01 00 00 04 01 07 01 0a 01 .......... 0000854a : 854a: 00 00 22 00 25 00 28 00 2b 00 2e 00 31 00 34 00 ..".%.(.+...1.4. 855a: 02 01 00 00 05 01 08 01 0b 01 .......... 00008564 : 8564: 00 00 20 00 23 00 26 00 29 00 2c 00 2f 00 32 00 .. .#.&.).,./.2. 8574: 00 01 00 00 03 01 06 01 09 01 .......... 0000857e : 857e: 05 05 05 05 07 05 08 08 08 08 02 02 02 02 0a 0a ................ 858e: 08 08 04 04 04 04 01 01 01 01 01 01 01 01 03 03 ................ 859e: 03 03 03 03 03 03 04 07 07 07 0c 0c 0c 0c 0c 0c ................ 85ae: 0c 0c 02 02 02 02 06 06 06 06 06 06 06 06 0b 0b ................ 85be: 0b 0b 0b 0b 0b 0b 07 07 0a 0a 0a 0a 0a 0a 05 05 ................ 85ce: 05 04 04 04 08 08 ...... 000085d4 : 85d4: 01 02 10 20 20 08 08 10 20 40 10 20 40 80 02 01 ... ... @. @... 85e4: 02 01 08 04 02 01 01 02 04 08 10 20 40 80 80 40 ........... @..@ 85f4: 20 10 08 04 02 01 80 04 02 01 80 40 20 10 08 04 ..........@ ... 8604: 02 01 08 04 02 01 01 02 04 08 10 20 40 80 01 02 ........... @... 8614: 04 08 10 20 40 80 10 08 04 08 80 10 20 40 04 40 ... @....... @.@ 8624: 80 10 20 40 04 80 .. @.. 0000862a : 862a: 00 00 0a 0b 02 09 0c 0d 0e 08 07 03 04 01 00 00 ................ ... 8656: 12 11 10 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ... 00008680 : 8680: 33 2e 31 34 2e 31 00 3.14.1. 00008687 : 8687: 0a 20 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 . Original Prusa 8697: 20 69 33 0a 20 20 20 50 72 75 73 61 20 52 65 73 i3. Prusa Res 86a7: 65 61 72 63 68 0a 25 32 30 2e 32 30 53 00 earch.%20.20S. 000086b5 : 86b5: 53 70 6f 6f 6c 4a 6f 69 6e 20 69 73 20 00 SpoolJoin is . 000086c3 : 86c3: 61 64 63 5f 69 6e 69 74 00 adc_init. 000086cc : 86cc: 20 0a 20 0a 20 0a 20 00 . . . . 000086d4 : 86d4: 41 6c 6c 20 44 61 74 61 00 All Data. 000086dd : 86dd: 53 65 72 76 69 63 65 20 70 72 65 70 00 Service prep. 000086ea : 86ea: 53 68 69 70 70 69 6e 67 20 70 72 65 70 00 Shipping prep. 000086f8 : 86f8: 53 74 61 74 69 73 74 69 63 73 00 Statistics. 00008703 : 8703: 4c 61 6e 67 75 61 67 65 00 Language. 0000870c <_ZZL13factory_resetcE3__c.lto_priv.494>: 870c: 45 52 41 53 49 4e 47 20 61 6c 6c 20 64 61 74 61 ERASING all data ... 0000871d : 871d: 46 61 63 74 6f 72 79 20 52 45 53 45 54 00 Factory RESET. 0000872b : 872b: 50 52 55 53 41 33 44 46 57 00 PRUSA3DFW. 00008735 : 8735: 03 00 0e 00 01 00 40 00 ......@. 0000873d : 873d: 03 00 02 00 00 00 04 00 ........ 00008745 : 8745: 70 72 75 73 61 33 64 00 prusa3d. 0000874d : 874d: 32 30 32 35 2d 30 34 2d 32 32 20 32 32 3a 30 33 2025-04-22 22:03 875d: 3a 35 33 00 :53. 00008761 : 8761: 20 33 2e 31 34 2e 31 2d 38 32 37 39 5f 37 37 33 3.14.1-8279_773 8771: 31 30 32 34 65 64 00 1024ed. 00008778 : 8778: 73 74 61 72 74 00 start. 0000877e : 877e: 4d 32 39 00 M29. 00008782 : 8782: 25 2d 39 2e 39 53 5b 00 %-9.9S[. 0000878a : 878a: 20 0a 20 0a 20 00 . . . 00008790 : 8790: 00 00 48 42 00 00 58 41 9a 99 8d 41 33 33 53 40 ..HB..XA...A33S@ 000087a0 : 87a0: 4d 4d 55 32 3a 00 MMU2:. 000087a6 : 87a6: 4d 49 4e 54 45 4d 50 20 42 45 44 20 66 69 78 65 MINTEMP BED fixe 87b6: 64 00 d. 000087b8 : 87b8: 4d 49 4e 54 45 4d 50 20 48 4f 54 45 4e 44 20 66 MINTEMP HOTEND f 87c8: 69 78 65 64 00 ixed. 000087cd : 87cd: 4d 4d 55 32 3a 00 MMU2:. 000087d3 : 87d3: 25 33 64 00 %3d. 000087d7 : 87d7: 18 01 04 19 02 0a ...... 000087dd : 87dd: 5e 55 e8 54 6e 54 01 54 b8 53 26 53 ae 52 46 52 ^U.TnT.T.S&S.RFR 87ed: f7 51 d7 51 8b 51 d7 51 74 51 74 51 74 51 74 51 .Q.Q.Q.QtQtQtQtQ 87fd: 74 51 74 51 74 51 74 51 74 51 74 51 74 51 74 51 tQtQtQtQtQtQtQtQ 880d: 74 51 74 51 74 51 74 51 74 51 74 51 74 51 74 51 tQtQtQtQtQtQtQtQ 881d: 74 51 74 51 3d 51 fc 50 b2 50 3f 50 0a 50 c0 4f tQtQ=Q.P.P?P.P.O 882d: 76 4f 18 4f df 4e 9d 4e 80 4e vO.O.N.N.N 00008837 : 8837: 01 01 01 01 01 01 01 02 71 01 71 01 32 32 32 03 ........q.q.222. 8847: 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 ................ 8857: 03 03 93 93 24 38 03 93 03 01 02 56 03 ....$8.....V. 00008864 : 8864: 65 00 66 00 67 00 68 00 69 00 6a 00 6b 00 6c 00 e.f.g.h.i.j.k.l. 8874: 73 00 74 00 7d 00 7e 00 c9 00 d3 00 dd 00 ca 00 s.t.}.~......... 8884: d4 00 de 00 2d 01 37 01 41 01 2e 01 38 01 42 01 ....-.7.A...8.B. 8894: 2f 01 39 01 43 01 30 01 3a 01 44 01 31 01 3b 01 /.9.C.0.:.D.1.;. 88a4: 45 01 32 01 91 01 92 01 f5 01 f6 01 f7 01 f8 01 E.2............. 88b4: f9 01 fa 01 fb 01 fc 01 84 03 .......... 000088be : 88be: eb 55 01 56 e0 55 d7 55 d0 55 46 58 e6 47 c9 55 .U.V.U.U.UFX.G.U 88ce: bf 55 .U 000088d0 : 88d0: 25 2e 32 30 53 0a 70 72 75 73 61 2e 69 6f 2f 30 %.20S.prusa.io/0 88e0: 34 25 68 75 00 4%hu. 000088e5 : 88e5: 7b 5b 45 52 52 3a 00 {[ERR:. 000088ec <_ZL14FW_VERSION_STR.lto_priv.497>: 88ec: 33 2e 31 34 2e 31 00 3.14.1. 000088f3 : 88f3: 5d 5b 46 57 52 3a 00 ][FWR:. 000088fa : 88fa: 5d 5b 54 49 4d 3a 00 ][TIM:. 00008901 : 8901: 5d 5b 46 4e 4d 3a 00 ][FNM:. 00008908 : 8908: 5d 5b 46 45 4d 3a 00 ][FEM:. 0000890f : 890f: 5d 5b 50 43 44 3a 00 ][PCD:. 00008916 : 8916: 5b 54 46 55 3a 00 [TFU:. 0000891c : 891c: 5b 50 52 4e 3a 00 [PRN:. 00008922 : 8922: 5b 50 46 4e 3a 30 5d 00 [PFN:0]. 0000892a : 892a: 5b 44 49 41 3a 00 [DIA:. 00008930 : 8930: 5d 5b 41 54 42 3a 00 ][ATB:. 00008937 : 8937: 5d 5b 41 54 30 3a 00 ][AT0:. 0000893e : 893e: 5d 5b 53 54 42 3a 00 ][STB:. 00008945 : 8945: 5b 53 54 30 3a 00 [ST0:. 0000894b : 894b: 7b 5b 50 52 4e 3a 35 5d 00 {[PRN:5]. 00008954 : 8954: 7b 5b 50 52 4e 3a 30 5d 00 {[PRN:0]. 0000895d : 895d: 7b 5b 50 52 4e 3a 39 5d 00 {[PRN:9]. 00008966 : 8966: 7b 5b 50 52 4e 3a 38 5d 00 {[PRN:8]. 0000896f : 896f: 7b 5b 52 45 53 3a 30 5d 5b 46 49 4c 3a 00 {[RES:0][FIL:. 0000897d : 897d: 7b 5b 52 45 53 3a 31 5d 5b 46 49 4c 3a 00 {[RES:1][FIL:. 0000898b : 898b: 00 00 21 10 42 20 63 30 84 40 a5 50 c6 60 e7 70 ..!.B c0.@.P.`.p 899b: 08 81 29 91 4a a1 6b b1 8c c1 ad d1 ce e1 ef f1 ..).J.k......... 89ab: 31 12 10 02 73 32 52 22 b5 52 94 42 f7 72 d6 62 1...s2R".R.B.r.b 89bb: 39 93 18 83 7b b3 5a a3 bd d3 9c c3 ff f3 de e3 9...{.Z......... 89cb: 62 24 43 34 20 04 01 14 e6 64 c7 74 a4 44 85 54 b$C4 ....d.t.D.T 89db: 6a a5 4b b5 28 85 09 95 ee e5 cf f5 ac c5 8d d5 j.K.(........... 89eb: 53 36 72 26 11 16 30 06 d7 76 f6 66 95 56 b4 46 S6r&..0..v.f.V.F 89fb: 5b b7 7a a7 19 97 38 87 df f7 fe e7 9d d7 bc c7 [.z...8......... 8a0b: c4 48 e5 58 86 68 a7 78 40 08 61 18 02 28 23 38 .H.X.h.x@.a..(#8 8a1b: cc c9 ed d9 8e e9 af f9 48 89 69 99 0a a9 2b b9 ........H.i...+. 8a2b: f5 5a d4 4a b7 7a 96 6a 71 1a 50 0a 33 3a 12 2a .Z.J.z.jq.P.3:.* 8a3b: fd db dc cb bf fb 9e eb 79 9b 58 8b 3b bb 1a ab ........y.X.;... 8a4b: a6 6c 87 7c e4 4c c5 5c 22 2c 03 3c 60 0c 41 1c .l.|.L.\",.<`.A. 8a5b: ae ed 8f fd ec cd cd dd 2a ad 0b bd 68 8d 49 9d ........*...h.I. 8a6b: 97 7e b6 6e d5 5e f4 4e 13 3e 32 2e 51 1e 70 0e .~.n.^.N.>2.Q.p. 8a7b: 9f ff be ef dd df fc cf 1b bf 3a af 59 9f 78 8f ..........:.Y.x. 8a8b: 88 91 a9 81 ca b1 eb a1 0c d1 2d c1 4e f1 6f e1 ..........-.N.o. 8a9b: 80 10 a1 00 c2 30 e3 20 04 50 25 40 46 70 67 60 .....0. .P%@Fpg` 8aab: b9 83 98 93 fb a3 da b3 3d c3 1c d3 7f e3 5e f3 ........=.....^. 8abb: b1 02 90 12 f3 22 d2 32 35 42 14 52 77 62 56 72 .....".25B.RwbVr 8acb: ea b5 cb a5 a8 95 89 85 6e f5 4f e5 2c d5 0d c5 ........n.O.,... 8adb: e2 34 c3 24 a0 14 81 04 66 74 47 64 24 54 05 44 .4.$....ftGd$T.D 8aeb: db a7 fa b7 99 87 b8 97 5f e7 7e f7 1d c7 3c d7 ........_.~...<. 8afb: d3 26 f2 36 91 06 b0 16 57 66 76 76 15 46 34 56 .&.6....Wfvv.F4V 8b0b: 4c d9 6d c9 0e f9 2f e9 c8 99 e9 89 8a b9 ab a9 L.m.../......... 8b1b: 44 58 65 48 06 78 27 68 c0 18 e1 08 82 38 a3 28 DXeH.x'h.....8.( 8b2b: 7d cb 5c db 3f eb 1e fb f9 8b d8 9b bb ab 9a bb }.\.?........... 8b3b: 75 4a 54 5a 37 6a 16 7a f1 0a d0 1a b3 2a 92 3a uJTZ7j.z.....*.: 8b4b: 2e fd 0f ed 6c dd 4d cd aa bd 8b ad e8 9d c9 8d ....l.M......... 8b5b: 26 7c 07 6c 64 5c 45 4c a2 3c 83 2c e0 1c c1 0c &|.ld\EL.<.,.... 8b6b: 1f ef 3e ff 5d cf 7c df 9b af ba bf d9 8f f8 9f ..>.].|......... 8b7b: 17 6e 36 7e 55 4e 74 5e 93 2e b2 3e d1 0e f0 1e .n6~UNt^...>.... 00008b8b : 8b8b: 7c 3c 3e 3f 2f 2a 22 5c 00 |<>?/*"\. 00008b94 : 8b94: 24 f4 d4 30 50 c3 8e 20 c2 a2 40 17 82 8b 70 11 $..0P.. ..@...p. 8ba4: 12 7a 91 0d 81 6c d9 0a a8 61 e1 08 c7 58 66 07 .z...l...a...Xf. 8bb4: 61 51 43 06 1e 4b 5d 05 c1 45 a7 04 1a 41 11 04 aQC..K]..E...A.. 8bc4: 09 3d 98 03 71 39 31 03 40 36 db 02 65 33 91 02 .=..q91.@6..e3.. 8bd4: d4 30 54 02 80 2e 1d 02 63 2c ee 01 75 2a c5 01 .0T.....c,..u*.. 8be4: b0 28 a0 01 10 27 81 01 8f 25 64 01 2b 24 4b 01 .(...'...%d.+$K. 8bf4: e0 22 34 01 ac 21 1f 01 8d 20 0d 01 80 1f fc 00 ."4..!... ...... 8c04: 84 1e ed 00 97 1d df 00 b8 1c d2 00 e6 1b c6 00 ................ 8c14: 20 1b bc 00 64 1a b2 00 b2 19 a8 00 0a 19 a0 00 ...d........... 8c24: 6a 18 99 00 d1 17 91 00 40 17 8b 00 b5 16 84 00 j.......@....... 8c34: 31 16 7e 00 b3 15 79 00 3a 15 73 00 c7 14 6f 00 1.~...y.:.s...o. 8c44: 58 14 6a 00 ee 13 66 00 88 13 63 00 25 13 5e 00 X.j...f...c.%.^. 8c54: c7 12 5b 00 6c 12 57 00 15 12 54 00 c1 11 51 00 ..[.l.W...T...Q. 8c64: 70 11 4f 00 21 11 4b 00 d6 10 49 00 8d 10 47 00 p.O.!.K...I...G. 8c74: 46 10 44 00 02 10 42 00 c0 0f 40 00 80 0f 3e 00 F.D...B...@...>. 8c84: 42 0f 3c 00 06 0f 3b 00 cb 0e 38 00 93 0e 37 00 B.<...;...8...7. 8c94: 5c 0e 35 00 27 0e 34 00 f3 0d 32 00 c1 0d 31 00 \.5.'.4...2...1. 8ca4: 90 0d 30 00 60 0d 2e 00 32 0d 2d 00 05 0d 2c 00 ..0.`...2.-...,. 8cb4: d9 0c 2b 00 ae 0c 29 00 85 0c 29 00 5c 0c 27 00 ..+...)...).\.'. 8cc4: 35 0c 27 00 0e 0c 26 00 e8 0b 24 00 c4 0b 24 00 5.'...&...$...$. 8cd4: a0 0b 23 00 7d 0b 23 00 5a 0b 21 00 39 0b 21 00 ..#.}.#.Z.!.9.!. 8ce4: 18 0b 20 00 f8 0a 1f 00 d9 0a 1e 00 bb 0a 1e 00 .. ............. 8cf4: 9d 0a 1d 00 80 0a 1d 00 63 0a 1c 00 47 0a 1b 00 ........c...G... 8d04: 2c 0a 1b 00 11 0a 1a 00 f7 09 1a 00 dd 09 19 00 ,............... 8d14: c4 09 19 00 ab 09 19 00 92 09 17 00 7b 09 18 00 ............{... 8d24: 63 09 17 00 4c 09 16 00 36 09 16 00 20 09 16 00 c...L...6... ... 8d34: 0a 09 15 00 f5 08 15 00 e0 08 14 00 cc 08 14 00 ................ 8d44: b8 08 14 00 a4 08 14 00 90 08 13 00 7d 08 12 00 ............}... 8d54: 6b 08 13 00 58 08 12 00 46 08 12 00 34 08 11 00 k...X...F...4... 8d64: 23 08 11 00 12 08 11 00 01 08 11 00 f0 07 10 00 #............... 8d74: e0 07 10 00 d0 07 10 00 c0 07 10 00 b0 07 0f 00 ................ 8d84: a1 07 10 00 91 07 0e 00 83 07 0f 00 74 07 0f 00 ............t... 8d94: 65 07 0e 00 57 07 0e 00 49 07 0e 00 3b 07 0d 00 e...W...I...;... 8da4: 2e 07 0e 00 20 07 0d 00 13 07 0d 00 06 07 0d 00 .... ........... 8db4: f9 06 0c 00 ed 06 0d 00 e0 06 0c 00 d4 06 0c 00 ................ 8dc4: c8 06 0c 00 bc 06 0c 00 b0 06 0c 00 a4 06 0b 00 ................ 8dd4: 99 06 0c 00 8d 06 0b 00 82 06 0b 00 77 06 0b 00 ............w... 8de4: 6c 06 0b 00 61 06 0a 00 57 06 0b 00 4c 06 0a 00 l...a...W...L... 8df4: 42 06 0a 00 38 06 0a 00 2e 06 0a 00 24 06 0a 00 B...8.......$... 8e04: 1a 06 0a 00 10 06 09 00 07 06 0a 00 fd 05 09 00 ................ 8e14: f4 05 09 00 eb 05 09 00 e2 05 09 00 d9 05 09 00 ................ 8e24: d0 05 09 00 c7 05 09 00 be 05 09 00 b5 05 08 00 ................ 8e34: ad 05 08 00 a5 05 09 00 9c 05 08 00 94 05 08 00 ................ 8e44: 8c 05 08 00 84 05 08 00 7c 05 08 00 74 05 08 00 ........|...t... 8e54: 6c 05 07 00 65 05 08 00 5d 05 07 00 56 05 08 00 l...e...]...V... 8e64: 4e 05 07 00 47 05 07 00 40 05 08 00 38 05 07 00 N...G...@...8... 8e74: 31 05 07 00 2a 05 07 00 23 05 07 00 1c 05 06 00 1...*...#....... 8e84: 16 05 07 00 0f 05 07 00 08 05 06 00 02 05 07 00 ................ 8e94: fb 04 06 00 f5 04 07 00 ee 04 06 00 e8 04 06 00 ................ 8ea4: e2 04 07 00 db 04 06 00 d5 04 06 00 cf 04 06 00 ................ 8eb4: c9 04 06 00 c3 04 06 00 bd 04 06 00 b7 04 06 00 ................ 8ec4: b1 04 05 00 ac 04 06 00 a6 04 06 00 a0 04 05 00 ................ 8ed4: 9b 04 06 00 95 04 05 00 90 04 06 00 8a 04 05 00 ................ 8ee4: 85 04 05 00 80 04 06 00 7a 04 05 00 75 04 05 00 ........z...u... 8ef4: 70 04 05 00 6b 04 05 00 66 04 05 00 61 04 05 00 p...k...f...a... 8f04: 5c 04 05 00 57 04 05 00 52 04 05 00 4d 04 05 00 \...W...R...M... 8f14: 48 04 05 00 43 04 05 00 3e 04 04 00 3a 04 05 00 H...C...>...:... 8f24: 35 04 05 00 30 04 04 00 2c 04 05 00 27 04 04 00 5...0...,...'... 8f34: 23 04 05 00 1e 04 04 00 1a 04 04 00 16 04 05 00 #............... 8f44: 11 04 04 00 0d 04 04 00 09 04 05 00 04 04 04 00 ................ 8f54: 00 04 04 00 fc 03 04 00 f8 03 04 00 f4 03 04 00 ................ 8f64: f0 03 04 00 ec 03 04 00 e8 03 04 00 e4 03 04 00 ................ 8f74: e0 03 04 00 dc 03 04 00 d8 03 04 00 d4 03 04 00 ................ 8f84: d0 03 04 00 cc 03 04 00 c8 03 03 00 c5 03 03 00 ................ 00008f94 : 8f94: 24 f4 04 d9 20 1b c4 0c 5c 0e 98 04 c4 09 5f 02 $... ...\....._. 8fa4: 65 07 71 01 f4 05 f9 00 fb 04 b3 00 48 04 87 00 e.q.........H... 8fb4: c1 03 69 00 58 03 55 00 03 03 45 00 be 02 3a 00 ..i.X.U...E...:. 8fc4: 84 02 31 00 53 02 2a 00 29 02 25 00 04 02 20 00 ..1.S.*.).%... . 8fd4: e4 01 1c 00 c8 01 19 00 af 01 17 00 98 01 14 00 ................ 8fe4: 84 01 13 00 71 01 10 00 61 01 10 00 51 01 0e 00 ....q...a...Q... 8ff4: 43 01 0d 00 36 01 0b 00 2b 01 0b 00 20 01 0b 00 C...6...+... ... 9004: 15 01 09 00 0c 01 09 00 03 01 08 00 fb 00 08 00 ................ 9014: f3 00 08 00 eb 00 07 00 e4 00 06 00 de 00 06 00 ................ 9024: d8 00 06 00 d2 00 06 00 cc 00 05 00 c7 00 05 00 ................ 9034: c2 00 05 00 bd 00 04 00 b9 00 04 00 b5 00 04 00 ................ 9044: b1 00 04 00 ad 00 04 00 a9 00 04 00 a5 00 03 00 ................ 9054: a2 00 03 00 9f 00 04 00 9b 00 03 00 98 00 03 00 ................ 9064: 95 00 02 00 93 00 03 00 90 00 03 00 8d 00 02 00 ................ 9074: 8b 00 03 00 88 00 02 00 86 00 02 00 84 00 03 00 ................ 9084: 81 00 02 00 7f 00 02 00 7d 00 02 00 7b 00 02 00 ........}...{... 9094: 79 00 02 00 77 00 01 00 76 00 02 00 74 00 02 00 y...w...v...t... 90a4: 72 00 01 00 71 00 02 00 6f 00 02 00 6d 00 01 00 r...q...o...m... 90b4: 6c 00 02 00 6a 00 01 00 69 00 02 00 67 00 01 00 l...j...i...g... 90c4: 66 00 01 00 65 00 01 00 64 00 02 00 62 00 01 00 f...e...d...b... 90d4: 61 00 01 00 60 00 01 00 5f 00 02 00 5d 00 01 00 a...`..._...]... 90e4: 5c 00 01 00 5b 00 01 00 5a 00 01 00 59 00 01 00 \...[...Z...Y... 90f4: 58 00 01 00 57 00 01 00 56 00 01 00 55 00 01 00 X...W...V...U... 9104: 54 00 01 00 53 00 00 00 53 00 01 00 52 00 01 00 T...S...S...R... 9114: 51 00 01 00 50 00 01 00 4f 00 01 00 4e 00 00 00 Q...P...O...N... 9124: 4e 00 01 00 4d 00 01 00 4c 00 01 00 4b 00 00 00 N...M...L...K... 9134: 4b 00 01 00 4a 00 01 00 49 00 01 00 48 00 00 00 K...J...I...H... 9144: 48 00 01 00 47 00 01 00 46 00 00 00 46 00 01 00 H...G...F...F... 9154: 45 00 00 00 45 00 01 00 44 00 01 00 43 00 00 00 E...E...D...C... 9164: 43 00 01 00 42 00 00 00 42 00 01 00 41 00 00 00 C...B...B...A... 9174: 41 00 01 00 40 00 01 00 3f 00 00 00 3f 00 01 00 A...@...?...?... 9184: 3e 00 00 00 3e 00 01 00 3d 00 00 00 3d 00 01 00 >...>...=...=... 9194: 3c 00 00 00 3c 00 00 00 3c 00 01 00 3b 00 00 00 <...<...<...;... 91a4: 3b 00 01 00 3a 00 00 00 3a 00 01 00 39 00 00 00 ;...:...:...9... 91b4: 39 00 01 00 38 00 00 00 38 00 00 00 38 00 01 00 9...8...8...8... 91c4: 37 00 00 00 37 00 01 00 36 00 00 00 36 00 00 00 7...7...6...6... 91d4: 36 00 01 00 35 00 00 00 35 00 00 00 35 00 01 00 6...5...5...5... 91e4: 34 00 00 00 34 00 00 00 34 00 01 00 33 00 00 00 4...4...4...3... 91f4: 33 00 00 00 33 00 01 00 32 00 00 00 32 00 00 00 3...3...2...2... 9204: 32 00 01 00 31 00 00 00 31 00 00 00 31 00 01 00 2...1...1...1... 9214: 30 00 00 00 30 00 00 00 30 00 01 00 2f 00 00 00 0...0...0.../... 9224: 2f 00 00 00 2f 00 00 00 2f 00 01 00 2e 00 00 00 /.../.../....... 9234: 2e 00 00 00 2e 00 01 00 2d 00 00 00 2d 00 00 00 ........-...-... 9244: 2d 00 00 00 2d 00 01 00 2c 00 00 00 2c 00 00 00 -...-...,...,... 9254: 2c 00 00 00 2c 00 01 00 2b 00 00 00 2b 00 00 00 ,...,...+...+... 9264: 2b 00 00 00 2b 00 01 00 2a 00 00 00 2a 00 00 00 +...+...*...*... 9274: 2a 00 00 00 2a 00 01 00 29 00 00 00 29 00 00 00 *...*...)...)... 9284: 29 00 00 00 29 00 00 00 29 00 01 00 28 00 00 00 )...)...)...(... 9294: 28 00 00 00 28 00 00 00 28 00 00 00 28 00 01 00 (...(...(...(... 92a4: 27 00 00 00 27 00 00 00 27 00 00 00 27 00 00 00 '...'...'...'... 92b4: 27 00 01 00 26 00 00 00 26 00 00 00 26 00 00 00 '...&...&...&... 92c4: 26 00 00 00 26 00 01 00 25 00 00 00 25 00 00 00 &...&...%...%... 92d4: 25 00 00 00 25 00 00 00 25 00 00 00 25 00 01 00 %...%...%...%... 92e4: 24 00 00 00 24 00 00 00 24 00 00 00 24 00 00 00 $...$...$...$... 92f4: 24 00 01 00 23 00 00 00 23 00 00 00 23 00 00 00 $...#...#...#... 9304: 23 00 00 00 23 00 00 00 23 00 00 00 23 00 01 00 #...#...#...#... 9314: 22 00 00 00 22 00 00 00 22 00 00 00 22 00 00 00 "..."..."..."... 9324: 22 00 00 00 22 00 01 00 21 00 00 00 21 00 00 00 "..."...!...!... 9334: 21 00 00 00 21 00 00 00 21 00 00 00 21 00 00 00 !...!...!...!... 9344: 21 00 01 00 20 00 00 00 20 00 00 00 20 00 00 00 !... ... ... ... 9354: 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 ... ... ... ... 9364: 20 00 01 00 1f 00 00 00 1f 00 00 00 1f 00 00 00 ............... 9374: 1f 00 00 00 1f 00 00 00 1f 00 00 00 1f 00 01 00 ................ 9384: 1e 00 00 00 1e 00 00 00 1e 00 00 00 1e 00 00 00 ................ 00009394 : 9394: 45 30 3a 20 00 E0: . 00009399 : 9399: 5a 3a 20 00 Z: . 0000939d : 939d: 59 3a 20 00 Y: . 000093a1 : 93a1: 58 3a 20 00 X: . 000093a5 : 93a5: 4d 53 31 2c 4d 53 32 20 50 69 6e 73 00 MS1,MS2 Pins. 000093b2 <_ZZ12PID_autotunefiiE3__c__16_>: 93b2: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 69 6e PID Autotune fin 93c2: 69 73 68 65 64 21 20 50 75 74 20 74 68 65 20 6c ished! Put the l 93d2: 61 73 74 20 4b 70 2c 20 4b 69 20 61 6e 64 20 4b ast Kp, Ki and K 93e2: 64 20 63 6f 6e 73 74 61 6e 74 73 20 66 72 6f 6d d constants from 93f2: 20 61 62 6f 76 65 20 69 6e 74 6f 20 43 6f 6e 66 above into Conf 9402: 69 67 75 72 61 74 69 6f 6e 2e 68 00 iguration.h. 0000940e <_ZZ12PID_autotunefiiE3__c__15_>: 940e: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 941e: 6c 65 64 21 20 74 69 6d 65 6f 75 74 00 led! timeout. 0000942b <_ZZ12PID_autotunefiiE3__c__14_>: 942b: 20 40 3a 00 @:. 0000942f <_ZZ12PID_autotunefiiE3__c__13_>: 942f: 54 3a 00 T:. 00009432 <_ZZ12PID_autotunefiiE3__c__12_>: 9432: 42 3a 00 B:. 00009435 <_ZZ12PID_autotunefiiE3__c__11_>: 9435: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 9445: 6c 65 64 21 20 54 65 6d 70 65 72 61 74 75 72 65 led! Temperature 9455: 20 74 6f 6f 20 68 69 67 68 00 too high. 0000945f <_ZZ12PID_autotunefiiE3__c__10_>: 945f: 20 4b 64 3a 20 00 Kd: . 00009465 : 9465: 20 4b 69 3a 20 00 Ki: . 0000946b : 946b: 20 4b 70 3a 20 00 Kp: . 00009471 : 9471: 20 43 6c 61 73 73 69 63 20 50 49 44 20 00 Classic PID . 0000947f : 947f: 20 54 75 3a 20 00 Tu: . 00009485 : 9485: 20 4b 75 3a 20 00 Ku: . 0000948b : 948b: 20 6d 61 78 3a 20 00 max: . 00009492 : 9492: 20 6d 69 6e 3a 20 00 min: . 00009499 : 9499: 20 64 3a 20 00 d: . 0000949e : 949e: 20 62 69 61 73 3a 20 00 bias: . 000094a6 : 94a6: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 73 74 61 PID Autotune sta 94b6: 72 74 00 rt. 000094b9 : 94b9: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 94c9: 6c 65 64 2e 20 42 61 64 20 65 78 74 72 75 64 65 led. Bad extrude 94d9: 72 20 6e 75 6d 62 65 72 2e 00 r number.. 000094e3 : 94e3: 48 6f 74 65 6e 64 20 66 61 6e 20 73 70 65 65 64 Hotend fan speed 94f3: 20 69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65 is lower than e 9503: 78 70 65 63 74 65 64 00 xpected. 0000950b : 950b: 50 72 69 6e 74 20 66 61 6e 20 73 70 65 65 64 20 Print fan speed 951b: 69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65 78 is lower than ex 952b: 70 65 63 74 65 64 00 pected. 00009532 : 9532: 4d 49 4e 54 45 4d 50 20 42 45 44 00 MINTEMP BED. 0000953e : 953e: 4d 49 4e 54 45 4d 50 00 MINTEMP. 00009546 : 9546: 4d 41 58 54 45 4d 50 00 MAXTEMP. 0000954e : 954e: 4d 41 58 54 45 4d 50 20 42 45 44 00 MAXTEMP BED. 0000955a : 955a: 70 01 2c 01 90 01 27 01 b0 01 22 01 c0 01 1d 01 p.,...'..."..... 956a: f0 01 18 01 10 02 13 01 30 02 0e 01 60 02 09 01 ........0...`... 957a: 90 02 04 01 c0 02 ff 00 00 03 fa 00 40 03 f5 00 ............@... 958a: 80 03 f0 00 d0 03 eb 00 20 04 e6 00 70 04 e1 00 ........ ...p... 959a: e0 04 dc 00 40 05 d7 00 c0 05 d2 00 40 06 cd 00 ....@.......@... 95aa: d0 06 c8 00 80 07 c3 00 30 08 be 00 f0 08 b9 00 ........0....... 95ba: c0 09 b4 00 b0 0a af 00 b0 0b aa 00 d0 0c a5 00 ................ 95ca: 00 0e a0 00 50 0f 9b 00 c0 10 96 00 50 12 91 00 ....P.......P... 95da: 00 14 8c 00 c0 15 87 00 b0 17 82 00 b0 19 7d 00 ..............}. 95ea: d0 1b 78 00 00 1e 73 00 40 20 6e 00 90 22 69 00 ..x...s.@ n.."i. 95fa: f0 24 64 00 40 27 5f 00 90 29 5a 00 e0 2b 55 00 .$d.@'_..)Z..+U. 960a: 10 2e 50 00 20 30 4b 00 10 32 46 00 e0 33 41 00 ..P. 0K..2F..3A. 961a: 90 35 3c 00 10 37 37 00 70 38 32 00 a0 39 2d 00 .5<..77.p82..9-. 962a: b0 3a 28 00 a0 3b 23 00 60 3c 1e 00 10 3d 19 00 .:(..;#.`<...=.. 963a: 90 3d 14 00 10 3e 0f 00 70 3e 0a 00 c0 3e 05 00 .=...>..p>...>.. 964a: 00 3f 00 00 .?.. 0000964e : 964e: 20 48 4f 54 45 4e 44 20 54 48 45 52 4d 41 4c 20 HOTEND THERMAL 965e: 52 55 4e 41 57 41 59 00 RUNAWAY. 00009666 : 9666: 20 48 45 41 54 42 45 44 20 54 48 45 52 4d 41 4c HEATBED THERMAL 9676: 20 52 55 4e 41 57 41 59 00 RUNAWAY. 0000967f : 967f: 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 00 THERMAL RUNAWAY. 0000968f : 968f: 42 45 44 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 BED THERMAL RUNA 969f: 57 41 59 00 WAY. 000096a3 : 96a3: 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 THERMAL RUNAWAY 96b3: 20 28 50 52 45 48 45 41 54 20 48 4f 54 45 4e 44 (PREHEAT HOTEND 96c3: 29 00 ). 000096c5 : 96c5: 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 THERMAL RUNAWAY 96d5: 20 28 50 52 45 48 45 41 54 20 48 45 41 54 42 45 (PREHEAT HEATBE 96e5: 44 29 00 D). 000096e8 : 96e8: 50 52 45 48 45 41 54 20 45 52 52 4f 52 00 PREHEAT ERROR. 000096f6 : 96f6: 42 45 44 20 50 52 45 48 45 41 54 20 45 52 52 4f BED PREHEAT ERRO 9706: 52 00 R. 00009708 : 9708: 20 74 72 69 67 67 65 72 65 64 21 00 triggered!. 00009714 : 9714: 48 65 61 74 65 72 73 20 73 77 69 74 63 68 65 64 Heaters switched 9724: 20 6f 66 66 2e 20 00 off. . 0000972b : 972b: 3a 20 00 : . 0000972e : 972e: 45 72 72 3a 20 00 Err: . 00009734 : 9734: 00 ff 01 02 01 00 02 ff ff fe 00 01 fe 01 ff 00 ................ 00009744 : 9744: 50 6c 65 61 73 65 20 72 65 73 74 61 72 74 00 Please restart. 00009753 <__vector_51::__c>: 9753: 55 53 41 52 54 32 20 72 78 20 46 75 6c 6c 21 21 USART2 rx Full!! 9763: 21 00 !. 00009765 : 9765: 3a 20 00 : . 00009768 : 9768: 25 2d 31 32 2e 31 32 53 25 2d 64 2f 36 00 %-12.12S%-d/6. 00009776 : 9776: 25 33 64 2f 25 2d 33 64 00 %3d/%-3d. 0000977f : 977f: 20 3a 20 00 : . 00009783 : 9783: 25 33 53 00 %3S. 00009787 : 9787: 25 2d 37 73 00 %-7s. 0000978c : 978c: 25 2d 31 35 2e 31 35 53 25 2d 35 64 0a 25 2d 31 %-15.15S%-5d.%-1 979c: 35 2e 31 35 53 25 2d 35 64 0a 00 5.15S%-5d.. 000097a7 : 97a7: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d 97b7: 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 00 . %-16.16S%-3d. 000097c6 : 97c6: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d 97d6: 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 0a 20 . %-16.16S%-3d. 97e6: 25 2d 31 36 2e 31 36 53 25 2d 33 64 00 %-16.16S%-3d. 000097f3 : 97f3: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d 9803: 0a 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 .%S. %-16.16S%-3 9813: 64 0a 00 d.. 00009816 : 9816: 20 25 73 25 33 64 81 20 0a 00 %s%3d. .. 00009820 : 9820: 25 75 2e 25 75 2e 25 75 2e 25 75 00 %u.%u.%u.%u. 0000982c <_ZZL16lcd_support_menuvE3__c__15_>: 982c: 20 00 . 0000982e <_ZZL16lcd_support_menuvE3__c__14_>: 982e: 20 00 . 00009830 <_ZZL16lcd_support_menuvE3__c__13_>: 9830: 46 6c 61 73 68 41 69 72 20 49 50 20 41 64 64 72 FlashAir IP Addr 9840: 3a 00 :. 00009842 <_ZZL16lcd_support_menuvE3__c__12_>: 9842: 4d 4d 55 20 20 20 20 20 20 20 20 4e 2f 41 00 MMU N/A. 00009851 <_ZZL16lcd_support_menuvE3__c__11_>: 9851: 25 64 2e 25 64 2e 25 64 00 %d.%d.%d. 0000985a <_ZZL16lcd_support_menuvE3__c__10_>: 985a: 20 46 57 3a 00 FW:. 0000985f : 985f: 32 30 32 35 2d 30 34 2d 32 32 00 2025-04-22. 0000986a : 986a: 45 33 44 76 36 66 75 6c 6c 00 E3Dv6full. 00009874 : 9874: 52 41 4d 42 6f 31 33 61 00 RAMBo13a. 0000987d : 987d: 31 5f 37 35 6d 6d 5f 4d 4b 32 35 00 1_75mm_MK25. 00009889 : 9889: 20 48 61 73 68 3a 37 37 33 31 30 32 34 65 64 00 Hash:7731024ed. 00009899 : 9899: 20 52 65 70 6f 3a 70 72 75 73 61 33 64 00 Repo:prusa3d. 000098a7 : 98a7: 20 33 2e 31 34 2e 31 2d 38 32 37 39 00 3.14.1-8279. 000098b4 : 98b4: 46 69 72 6d 77 61 72 65 3a 00 Firmware:. 000098be : 98be: 3e 00 >. 000098c0 <_ZZ24lcd_generic_preheat_menuvE3__c__20_>: 98c0: 46 4c 45 58 20 2d 20 20 32 34 30 2f 35 30 00 FLEX - 240/50. 000098cf <_ZZ24lcd_generic_preheat_menuvE3__c__19_>: 98cf: 46 4c 45 58 20 2d 20 20 32 34 30 00 FLEX - 240. 000098db <_ZZ24lcd_generic_preheat_menuvE3__c__18_>: 98db: 50 50 20 20 20 2d 20 20 32 35 34 2f 31 30 30 00 PP - 254/100. 000098eb <_ZZ24lcd_generic_preheat_menuvE3__c__17_>: 98eb: 50 50 20 20 20 2d 20 20 32 35 34 00 PP - 254. 000098f7 <_ZZ24lcd_generic_preheat_menuvE3__c__16_>: 98f7: 48 49 50 53 20 2d 20 20 32 32 30 2f 31 30 30 00 HIPS - 220/100. 00009907 <_ZZ24lcd_generic_preheat_menuvE3__c__15_>: 9907: 48 49 50 53 20 2d 20 20 32 32 30 00 HIPS - 220. 00009913 <_ZZ24lcd_generic_preheat_menuvE3__c__14_>: 9913: 41 42 53 20 20 2d 20 20 32 35 35 2f 31 30 30 00 ABS - 255/100. 00009923 <_ZZ24lcd_generic_preheat_menuvE3__c__13_>: 9923: 41 42 53 20 20 2d 20 20 32 35 35 00 ABS - 255. 0000992f <_ZZ24lcd_generic_preheat_menuvE3__c__12_>: 992f: 50 41 20 20 20 2d 20 20 32 37 35 2f 39 30 00 PA - 275/90. 0000993e <_ZZ24lcd_generic_preheat_menuvE3__c__11_>: 993e: 50 41 20 20 20 2d 20 20 32 37 35 00 PA - 275. 0000994a <_ZZ24lcd_generic_preheat_menuvE3__c__10_>: 994a: 50 56 42 20 20 2d 20 20 32 31 35 2f 37 35 00 PVB - 215/75. 00009959 : 9959: 50 56 42 20 20 2d 20 20 32 31 35 00 PVB - 215. 00009965 : 9965: 50 43 20 20 20 2d 20 20 32 37 35 2f 31 30 35 00 PC - 275/105. 00009975 : 9975: 50 43 20 20 20 2d 20 20 32 37 35 00 PC - 275. 00009981 : 9981: 41 53 41 20 20 2d 20 20 32 36 30 2f 31 30 35 00 ASA - 260/105. 00009991 : 9991: 41 53 41 20 20 2d 20 20 32 36 30 00 ASA - 260. 0000999d : 999d: 50 45 54 20 20 2d 20 20 32 33 30 2f 38 35 00 PET - 230/85. 000099ac : 99ac: 50 45 54 20 20 2d 20 20 32 33 30 00 PET - 230. 000099b8 : 99b8: 50 4c 41 20 20 2d 20 20 32 31 35 2f 36 30 00 PLA - 215/60. 000099c7 : 99c7: 50 4c 41 20 20 2d 20 20 32 31 35 00 PLA - 215. 000099d3 : 99d3: 6e 6f 7a 7a 6c 65 20 2d 20 20 32 35 30 2f 30 00 nozzle - 250/0. 000099e3 : 99e3: 66 61 72 6d 20 20 20 2d 20 20 32 35 30 2f 38 30 farm - 250/80 ... 000099f4 : 99f4: 10 00 c9 02 10 01 2c 01 40 01 22 01 70 01 18 01 ......,.@.".p... 9a04: b0 01 0e 01 f0 01 04 01 50 02 fa 00 b0 02 f0 00 ........P....... 9a14: 30 03 e6 00 d0 03 dc 00 90 04 d2 00 70 05 c8 00 0...........p... 9a24: a0 06 be 00 00 08 b4 00 b0 09 aa 00 d0 0b a0 00 ................ 9a34: 60 0e 96 00 60 11 8c 00 00 15 82 00 20 19 78 00 `...`....... .x. 9a44: c0 1d 6e 00 a0 22 64 00 b0 27 5a 00 90 2c 50 00 ..n.."d..'Z..,P. 9a54: 00 31 46 00 e0 34 3c 00 10 38 32 00 90 3a 28 00 .1F..4<..82..:(. 9a64: 60 3c 1e 00 a0 3d 14 00 80 3e 0a 00 20 3f 00 00 `<...=...>.. ?.. 00009a74 : 9a74: 4d 65 61 73 75 72 65 20 63 65 6e 74 65 72 20 20 Measure center ... 00009a85 : 9a85: 78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 65 xyzcal_measure_e 9a95: 6e 74 65 72 0a 00 nter.. 00009a9b : 9a9b: 78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 38 20 63 xyzcal_spiral8 c 9aab: 78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64 x=%d cy=%d z0=%d 9abb: 20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64 dz=%d radius=%d 9acb: 20 61 64 3d 25 64 0a 00 ad=%d.. 00009ad3 : 9ad3: 78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 6e xyzcal_searchZ n 9ae3: 6f 20 73 69 67 6e 61 6c 0a 20 78 3d 25 6c 64 20 o signal. x=%ld 9af3: 79 3d 25 6c 64 20 7a 3d 25 6c 64 0a 00 y=%ld z=%ld.. 00009b00 : 9b00: 20 4f 4e 2d 53 49 47 4e 41 4c 20 61 74 20 78 3d ON-SIGNAL at x= 9b10: 25 64 20 79 3d 25 64 20 7a 3d 25 64 20 61 64 3d %d y=%d z=%d ad= 9b20: 25 64 0a 00 %d.. 00009b24 : 9b24: 78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 78 xyzcal_searchZ x 9b34: 3d 25 6c 64 20 79 3d 25 6c 64 20 7a 3d 25 6c 64 =%ld y=%ld z=%ld 9b44: 0a 00 .. 00009b46 : 9b46: 25 30 32 78 00 %02x. 00009b4b : 9b4b: 20 5b 25 66 20 25 66 5d 20 6d 6d 20 70 61 74 74 [%f %f] mm patt 9b5b: 65 72 6e 20 63 65 6e 74 65 72 0a 00 ern center.. 00009b67 : 9b67: 20 5b 25 66 20 25 66 5d 5b 25 66 5d 20 6d 6d 20 [%f %f][%f] mm 9b77: 64 69 76 65 72 67 65 6e 63 65 0a 00 divergence.. 00009b83 : 9b83: 00 00 f0 00 f8 01 fc 03 fe 07 fe 07 fe 07 fe 07 ................ 9b93: fc 03 f8 01 f0 00 00 00 ........ 00009b9b : 9b9b: 00 00 00 00 f0 00 f8 01 fc 03 fc 03 fc 03 fc 03 ................ 9bab: f8 01 f0 00 00 00 00 00 ........ 00009bb3 : 9bb3: 78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 6c xyzcal_measure_l 9bc3: 65 61 76 65 0a 00 eave.. 00009bc9 : 9bc9: 20 3c 20 00 < . 00009bcd : 9bcd: 57 41 52 4e 49 4e 47 3a 20 46 72 6f 6e 74 20 70 WARNING: Front p 9bdd: 6f 69 6e 74 20 6e 6f 74 20 72 65 61 63 68 61 62 oint not reachab 9bed: 6c 65 2e 20 59 20 63 6f 6f 72 64 69 6e 61 74 65 le. Y coordinate 9bfd: 3a 00 :. 00009bff : ... 00009c00 : 9c00: 00 00 40 41 00 00 80 40 00 00 5c 43 00 00 80 40 ..@A...@..\C...@ 9c10: 00 00 5c 43 00 00 44 43 00 00 40 41 00 00 44 43 ..\C..DC..@A..DC 00009c20 : 9c20: 25 64 2f 34 00 %d/4. 00009c25 : 9c25: 49 74 65 72 61 74 69 6f 6e 3a 20 00 Iteration: . 00009c31 : 9c31: 43 61 6c 69 62 72 61 74 69 6f 6e 20 66 61 69 6c Calibration fail 9c41: 65 64 21 20 43 68 65 63 6b 20 74 68 65 20 61 78 ed! Check the ax 9c51: 65 73 20 61 6e 64 20 72 75 6e 20 61 67 61 69 6e es and run again 9c61: 2e 00 .. 00009c63 : 9c63: 78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 32 20 63 xyzcal_spiral2 c 9c73: 78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64 x=%d cy=%d z0=%d 9c83: 20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64 dz=%d radius=%d 9c93: 20 61 64 3d 25 64 0a 00 ad=%d.. 00009c9b : 9c9b: 0a 00 .. 00009c9d : 9c9d: 43 6f 75 6e 74 64 6f 77 6e 3a 20 25 64 20 00 Countdown: %d . 00009cac : 9cac: 25 64 0a 00 %d.. 00009cb0 : 9cb0: 53 63 61 6e 20 63 6f 75 6e 74 64 6f 77 6e 3a 20 Scan countdown: ... 00009cc1 : 9cc1: 50 61 74 74 65 72 6e 20 63 65 6e 74 65 72 20 5b Pattern center [ 9cd1: 25 66 20 25 66 5d 2c 20 6d 61 74 63 68 20 25 66 %f %f], match %f 9ce1: 25 25 0a 00 %%.. 00009ce5 : 9ce5: 20 5b 25 66 2c 20 25 66 5d 5b 25 66 5d 20 66 69 [%f, %f][%f] fi 9cf5: 6e 61 6c 20 63 69 72 63 6c 65 0a 00 nal circle.. 00009d01 : 9d01: 00 00 a0 40 00 00 a0 40 00 00 00 40 ...@...@...@ 00009d0d : 9d0d: 00 00 7a 43 00 00 56 43 9a d9 51 43 ..zC..VC..QC 00009d19 : 9d19: ff ff ff ... 00009d1c <_ZL16ramming_sequence.lto_priv.385>: 9d1c: e0 2d 90 3e 89 88 b2 41 11 36 9c 3e 77 77 c1 41 .-.>...A.6.>ww.A 9d2c: 29 cb b0 3e ef ee da 41 ba 49 cc 3e ef ee fc 41 )..>...A.I.>...A 9d3c: 61 c3 f3 3e ef ee 16 42 9c a2 13 3f cd cc 36 42 a..>...B...?..6B 9d4c: 8a b0 11 3f ab aa 56 42 88 63 dd 3d ab aa 56 42 ...?..VB.c.=..VB 9d5c: b8 af 43 3f 55 55 72 42 18 26 53 3f 33 b3 82 42 ..C?UUrB.&S?3..B 9d6c: 30 2a 59 3f ef 6e 86 42 00 00 70 c1 00 00 c8 42 0*Y?.n.B..p....B 9d7c: 00 00 c4 c1 00 00 a0 41 00 00 e0 c0 00 00 20 41 .......A...... A 9d8c: 00 00 60 c0 00 00 c0 40 00 00 a0 41 22 22 f2 40 ..`....@...A"".@ 9d9c: 00 00 a0 c1 9a 99 a1 40 00 00 0c c2 55 55 05 42 .......@....UU.B 00009dac : 9dac: 43 6f 6f 6c 69 6e 67 20 74 69 6d 65 72 20 73 74 Cooling timer st 9dbc: 6f 70 70 65 64 00 opped. 00009dc2 : 9dc2: 48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 00 Heater cooldown. 00009dd2 : 9dd2: 43 6f 6f 6c 69 6e 67 20 54 69 6d 65 6f 75 74 20 Cooling Timeout 9de2: 73 74 61 72 74 65 64 00 started. 00009dea : 9dea: 53 61 76 69 6e 67 20 61 6e 64 20 70 61 72 6b 69 Saving and parki 9dfa: 6e 67 00 ng. 00009dfd : 9dfd: 48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 20 Heater cooldown 9e0d: 70 65 6e 64 69 6e 67 00 pending. 00009e15 : 9e15: 52 65 73 75 6d 69 6e 67 20 58 59 5a 00 Resuming XYZ. 00009e22 : 9e22: 57 72 69 74 69 6e 67 20 74 6f 20 66 69 6c 65 3a Writing to file: 9e32: 20 00 . 00009e34 : 9e34: 46 69 6c 65 20 61 6c 72 65 61 64 79 20 6f 70 65 File already ope 9e44: 6e 65 64 00 ned. 00009e48 : 9e48: ba 5a a9 5a 95 5a 80 5a 6a 5a 57 5a 41 5a 2d 5a .Z.Z.Z.ZjZWZAZ-Z 9e58: 1c 5a 06 5a 95 5a a9 5a f2 59 e3 59 cf 59 be 59 .Z.Z.Z.Z.Y.Y.Y.Y 9e68: a9 59 ed 61 93 59 81 59 6e 59 5d 59 48 59 35 59 .Y.a.Y.YnY]YHY5Y 9e78: 21 59 0c 59 03 59 f1 58 dc 58 !Y.Y.Y.X.X 00009e82 : 9e82: 4d 36 30 30 20 41 55 54 4f 00 M600 AUTO. 00009e8c : 9e8c: 46 49 4e 44 41 20 66 69 6c 61 6d 65 6e 74 20 72 FINDA filament r 9e9c: 75 6e 6f 75 74 21 00 unout!. 00009ea3 : 9ea3: 43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 74 69 Communication ti 9eb3: 6d 65 6f 75 74 00 meout. 00009eb9 : 9eb9: 50 72 6f 74 6f 63 6f 6c 20 45 72 72 6f 72 00 Protocol Error. 00009ec8 : 9ec8: 03 00 03 ... 00009ecb : 9ecb: 56 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 Version mismatch ... 00009edc : 9edc: 43 6f 6d 6d 61 6e 64 20 45 72 72 6f 72 00 Command Error. 00009eea : 9eea: 43 6f 6d 6d 61 6e 64 20 72 65 6a 65 63 74 65 64 Command rejected ... 00009efb : 9efb: 4d 4d 55 20 42 75 74 74 6f 6e 20 70 75 73 68 65 MMU Button pushe 9f0b: 64 00 d. 00009f0d : 9f0d: 52 65 74 72 79 42 75 74 74 6f 6e 50 72 65 73 73 RetryButtonPress 9f1d: 65 64 00 ed. 00009f20 <_ZN4MMU2L11errorTitlesE.lto_priv.449>: 9f20: 17 5d 02 5d eb 5c d6 5c c1 5c ad 5c 9d 5c 86 5c .].].\.\.\.\.\.\ 9f30: 6f 5c 58 5c 44 5c 30 5c 1a 5c 1a 5c 1a 5c 05 5c o\X\D\0\.\.\.\.\ 9f40: 05 5c 05 5c f2 5b f2 5b f2 5b df 5b df 5b df 5b .\.\.[.[.[.[.[.[ 9f50: c8 5b c8 5b c8 5b b3 5b b3 5b b3 5b 9d 5b 9d 5b .[.[.[.[.[.[.[.[ 9f60: 9d 5b 8d 5b 78 5b 62 5b 4c 5b 3d 5b 30 5b 19 5b .[.[x[b[L[=[0[.[ 9f70: 06 5b f4 5a e1 5a cf 5a bf 5a .[.Z.Z.Z.Z 00009f7a : 9f7a: 42 75 74 74 6f 6e 00 Button. 00009f81 : 9f81: 43 68 65 63 6b 55 73 65 72 49 6e 70 75 74 2d 62 CheckUserInput-b 9f91: 74 6e 4c 4d 52 20 00 tnLMR . 00009f98 : 9f98: 52 65 73 65 74 52 65 74 72 79 41 74 74 65 6d 70 ResetRetryAttemp 9fa8: 74 73 00 ts. 00009fab <_ZZN4MMU231ReportErrorHookSensorLineRenderEvE3__c.lto_priv.448>: 9fab: 46 49 3a 20 20 46 53 3a 20 20 20 20 3e 20 20 82 FI: FS: > . 9fbb: 20 20 20 81 00 .. 00009fc0 : 9fc0: 48 6f 74 65 6e 64 20 74 65 6d 70 65 72 61 74 75 Hotend temperatu 9fd0: 72 65 20 72 65 61 63 68 65 64 00 re reached. 00009fdb : 9fdb: 52 65 73 75 6d 69 6e 67 20 54 65 6d 70 00 Resuming Temp. 00009fe9 : 9fe9: 43 6f 6f 6c 64 6f 77 6e 20 66 6c 61 67 20 63 6c Cooldown flag cl 9ff9: 65 61 72 65 64 00 eared. 00009fff : 9fff: 20 57 3a 00 W:. 0000a003 : a003: 20 45 3a 00 E:. 0000a007 : a007: 54 3a 00 T:. 0000a00a : a00a: 4e 6f 20 30 78 46 46 20 72 65 63 65 69 76 65 64 No 0xFF received ... 0000a01b : a01b: 53 65 6e 64 69 6e 67 20 30 78 46 46 00 Sending 0xFF. 0000a028 : a028: 46 69 6c 65 20 73 65 6c 65 63 74 65 64 00 File selected. 0000a036 : a036: 20 53 69 7a 65 3a 20 00 Size: . 0000a03e : a03e: 46 69 6c 65 20 6f 70 65 6e 65 64 3a 20 00 File opened: . 0000a04c : a04c: 4e 6f 77 20 66 72 65 73 68 20 66 69 6c 65 3a 20 Now fresh file: ... 0000a05d : a05d: 4e 6f 77 20 64 6f 69 6e 67 20 66 69 6c 65 3a 20 Now doing file: ... 0000a06e : a06e: 22 20 70 6f 73 00 " pos. 0000a074 : a074: 22 20 70 61 72 65 6e 74 3a 22 00 " parent:". 0000a07f : a07f: 53 55 42 52 4f 55 54 49 4e 45 20 43 41 4c 4c 20 SUBROUTINE CALL a08f: 74 61 72 67 65 74 3a 22 00 target:". 0000a098 : a098: 74 72 79 69 6e 67 20 74 6f 20 63 61 6c 6c 20 73 trying to call s a0a8: 75 62 2d 67 63 6f 64 65 20 66 69 6c 65 73 20 77 ub-gcode files w a0b8: 69 74 68 20 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 ith too many lev a0c8: 65 6c 73 2e 00 els.. 0000a0cd : a0cd: 06 28 33 d0 36 c2 3e 01 3f 15 41 32 42 3b 43 f2 .(3.6.>.?.A2B;C. a0dd: 44 3b 45 f2 46 22 47 3b 48 f2 49 3b 4a f0 58 98 D;E.F"G;H.I;J.X. a0ed: 59 0c 5a 08 5b 0c 5c 08 61 10 67 9b 6e 22 71 07 Y.Z.[.\.a.g.n"q. a0fd: 72 08 ff r.. 0000a100 : a100: 09 5a 0d 00 0e f0 19 14 5e 08 20 64 2b 6d 32 2f .Z......^. d+m2/ a110: ff . 0000a111 : a111: 20 22 25 73 22 00 "%s". 0000a117 : a117: 20 25 23 6c 78 00 %#lx. 0000a11d : a11d: 44 49 52 5f 45 58 49 54 00 DIR_EXIT. 0000a126 : a126: 44 49 52 5f 45 4e 54 45 52 3a 20 25 73 20 22 25 DIR_ENTER: %s "% a136: 73 22 0a 00 s".. 0000a13a : a13a: 61 75 74 6f 25 69 2e 67 00 auto%i.g. 0000a143 : a143: 04 1a .. 0000a145 : a145: 44 65 63 72 65 6d 65 6e 74 52 65 74 72 79 41 74 DecrementRetryAt a155: 74 65 6d 70 74 73 00 tempts. 0000a15c : a15c: 08 1b 1c ... 0000a15f : a15f: 0b 14 .. 0000a161 : a161: 52 53 54 43 6f 6d 6d 54 69 6d 65 6f 75 74 00 RSTCommTimeout. 0000a170 : a170: 2c 20 6c 61 73 74 20 62 79 74 65 73 3a 20 00 , last bytes: . 0000a17f <_ZL10bufferFull.lto_priv.516>: a17f: 22 20 66 61 69 6c 65 64 3a 20 42 75 66 66 65 72 " failed: Buffer a18f: 20 66 75 6c 6c 21 00 full!. 0000a196 : a196: 22 00 ". 0000a198 : a198: 45 6e 71 75 65 69 6e 67 20 74 6f 20 74 68 65 20 Enqueing to the a1a8: 66 72 6f 6e 74 3a 20 22 00 front: ". 0000a1b1 : a1b1: 45 72 72 6f 72 3a 00 Error:. 0000a1b8 : a1b8: 4d 4d 55 32 74 6f 6f 6c 3d 00 MMU2tool=. 0000a1c2 <_ZL9mmu2Magic.lto_priv.362>: a1c2: 4d 4d 55 32 3a 00 MMU2:. 0000a1c8 <_ZL9mmu2Magic.lto_priv.363>: a1c8: 4d 4d 55 32 3a 00 MMU2:. 0000a1ce : a1ce: 65 63 68 6f 3a 00 echo:. 0000a1d4 : a1d4: 3e 53 30 2a 63 36 2e 00 >S0*c6.. 0000a1dc : a1dc: 4d 4d 55 20 69 73 20 00 MMU is . 0000a1e4 <__ctors_start>: a1e4: 86 38 cpi r24, 0x86 ; 134 0000a1e6 <__ctors_end>: a1e6: cf 63 ori r28, 0x3F ; 63 0000a1e8 <__dtors_end>: a1e8: 11 24 eor r1, r1 a1ea: 1f be out 0x3f, r1 ; 63 a1ec: cf ef ldi r28, 0xFF ; 255 a1ee: d1 e2 ldi r29, 0x21 ; 33 a1f0: de bf out 0x3e, r29 ; 62 a1f2: cd bf out 0x3d, r28 ; 61 a1f4: 00 e0 ldi r16, 0x00 ; 0 a1f6: 0c bf out 0x3c, r16 ; 60 0000a1f8 <__do_copy_data>: a1f8: 13 e0 ldi r17, 0x03 ; 3 a1fa: a0 e0 ldi r26, 0x00 ; 0 a1fc: b2 e0 ldi r27, 0x02 ; 2 a1fe: e8 e5 ldi r30, 0x58 ; 88 a200: f5 e5 ldi r31, 0x55 ; 85 a202: 03 e0 ldi r16, 0x03 ; 3 a204: 0b bf out 0x3b, r16 ; 59 a206: 02 c0 rjmp .+4 ; 0xa20c <__do_copy_data+0x14> a208: 07 90 elpm r0, Z+ a20a: 0d 92 st X+, r0 a20c: a2 30 cpi r26, 0x02 ; 2 a20e: b1 07 cpc r27, r17 a210: d9 f7 brne .-10 ; 0xa208 <__do_copy_data+0x10> 0000a212 <__do_clear_bss>: a212: 27 e1 ldi r18, 0x17 ; 23 a214: a2 e0 ldi r26, 0x02 ; 2 a216: b3 e0 ldi r27, 0x03 ; 3 a218: 01 c0 rjmp .+2 ; 0xa21c <.do_clear_bss_start> 0000a21a <.do_clear_bss_loop>: a21a: 1d 92 st X+, r1 0000a21c <.do_clear_bss_start>: a21c: a7 31 cpi r26, 0x17 ; 23 a21e: b2 07 cpc r27, r18 a220: e1 f7 brne .-8 ; 0xa21a <.do_clear_bss_loop> 0000a222 <__do_global_ctors>: a222: 10 e5 ldi r17, 0x50 ; 80 a224: c3 ef ldi r28, 0xF3 ; 243 a226: d0 e5 ldi r29, 0x50 ; 80 a228: 00 e0 ldi r16, 0x00 ; 0 a22a: 06 c0 rjmp .+12 ; 0xa238 <__do_global_ctors+0x16> a22c: 21 97 sbiw r28, 0x01 ; 1 a22e: 01 09 sbc r16, r1 a230: 80 2f mov r24, r16 a232: fe 01 movw r30, r28 a234: 0f 94 f0 a4 call 0x349e0 ; 0x349e0 <__tablejump2__> a238: c2 3f cpi r28, 0xF2 ; 242 a23a: d1 07 cpc r29, r17 a23c: 80 e0 ldi r24, 0x00 ; 0 a23e: 08 07 cpc r16, r24 a240: a9 f7 brne .-22 ; 0xa22c <__do_global_ctors+0xa> a242: 0e 94 41 ed call 0x1da82 ; 0x1da82
a246: 0d 94 9a aa jmp 0x35534 ; 0x35534 <__do_global_dtors> 0000a24a <__bad_interrupt>: a24a: 0c 94 de 86 jmp 0x10dbc ; 0x10dbc <__vector_default> 0000a24e : a24e: 2f 92 push r2 a250: 3f 92 push r3 a252: 4f 92 push r4 a254: 5f 92 push r5 a256: 6f 92 push r6 a258: 7f 92 push r7 a25a: 8f 92 push r8 a25c: 9f 92 push r9 a25e: af 92 push r10 a260: bf 92 push r11 a262: cf 92 push r12 a264: df 92 push r13 a266: ef 92 push r14 a268: ff 92 push r15 a26a: 0f 93 push r16 a26c: 1f 93 push r17 a26e: cf 93 push r28 a270: df 93 push r29 a272: cd b7 in r28, 0x3d ; 61 a274: de b7 in r29, 0x3e ; 62 a276: 2f 97 sbiw r28, 0x0f ; 15 a278: 0f b6 in r0, 0x3f ; 63 a27a: f8 94 cli a27c: de bf out 0x3e, r29 ; 62 a27e: 0f be out 0x3f, r0 ; 63 a280: cd bf out 0x3d, r28 ; 61 a282: 6c 01 movw r12, r24 a284: 1b 01 movw r2, r22 a286: 5a 01 movw r10, r20 a288: fc 01 movw r30, r24 a28a: 17 82 std Z+7, r1 ; 0x07 a28c: 16 82 std Z+6, r1 ; 0x06 a28e: 83 81 ldd r24, Z+3 ; 0x03 a290: 9e 01 movw r18, r28 a292: 2f 5f subi r18, 0xFF ; 255 a294: 3f 4f sbci r19, 0xFF ; 255 a296: 49 01 movw r8, r18 a298: 81 fd sbrc r24, 1 a29a: d2 c0 rjmp .+420 ; 0xa440 a29c: 8f ef ldi r24, 0xFF ; 255 a29e: 9f ef ldi r25, 0xFF ; 255 a2a0: ee c2 rjmp .+1500 ; 0xa87e a2a2: f1 2c mov r15, r1 a2a4: 51 2c mov r5, r1 a2a6: 00 e0 ldi r16, 0x00 ; 0 a2a8: 00 32 cpi r16, 0x20 ; 32 a2aa: 38 f4 brcc .+14 ; 0xa2ba a2ac: 8b 32 cpi r24, 0x2B ; 43 a2ae: 09 f1 breq .+66 ; 0xa2f2 a2b0: 90 f4 brcc .+36 ; 0xa2d6 a2b2: 80 32 cpi r24, 0x20 ; 32 a2b4: f9 f0 breq .+62 ; 0xa2f4 a2b6: 83 32 cpi r24, 0x23 ; 35 a2b8: 09 f1 breq .+66 ; 0xa2fc a2ba: 07 fd sbrc r16, 7 a2bc: 34 c0 rjmp .+104 ; 0xa326 a2be: 20 ed ldi r18, 0xD0 ; 208 a2c0: 28 0f add r18, r24 a2c2: 2a 30 cpi r18, 0x0A ; 10 a2c4: 20 f5 brcc .+72 ; 0xa30e a2c6: 06 ff sbrs r16, 6 a2c8: 1b c0 rjmp .+54 ; 0xa300 a2ca: fa e0 ldi r31, 0x0A ; 10 a2cc: ff 9e mul r15, r31 a2ce: 20 0d add r18, r0 a2d0: 11 24 eor r1, r1 a2d2: f2 2e mov r15, r18 a2d4: 05 c0 rjmp .+10 ; 0xa2e0 a2d6: 8d 32 cpi r24, 0x2D ; 45 a2d8: 79 f0 breq .+30 ; 0xa2f8 a2da: 80 33 cpi r24, 0x30 ; 48 a2dc: 71 f7 brne .-36 ; 0xa2ba a2de: 01 60 ori r16, 0x01 ; 1 a2e0: f1 01 movw r30, r2 a2e2: 93 fd sbrc r25, 3 a2e4: 85 91 lpm r24, Z+ a2e6: 93 ff sbrs r25, 3 a2e8: 81 91 ld r24, Z+ a2ea: 1f 01 movw r2, r30 a2ec: 81 11 cpse r24, r1 a2ee: dc cf rjmp .-72 ; 0xa2a8 a2f0: 1a c0 rjmp .+52 ; 0xa326 a2f2: 02 60 ori r16, 0x02 ; 2 a2f4: 04 60 ori r16, 0x04 ; 4 a2f6: f4 cf rjmp .-24 ; 0xa2e0 a2f8: 08 60 ori r16, 0x08 ; 8 a2fa: f2 cf rjmp .-28 ; 0xa2e0 a2fc: 00 61 ori r16, 0x10 ; 16 a2fe: f0 cf rjmp .-32 ; 0xa2e0 a300: 3a e0 ldi r19, 0x0A ; 10 a302: 53 9e mul r5, r19 a304: 20 0d add r18, r0 a306: 11 24 eor r1, r1 a308: 52 2e mov r5, r18 a30a: 00 62 ori r16, 0x20 ; 32 a30c: e9 cf rjmp .-46 ; 0xa2e0 a30e: 8e 32 cpi r24, 0x2E ; 46 a310: 21 f4 brne .+8 ; 0xa31a a312: 06 fd sbrc r16, 6 a314: b1 c2 rjmp .+1378 ; 0xa878 a316: 00 64 ori r16, 0x40 ; 64 a318: e3 cf rjmp .-58 ; 0xa2e0 a31a: 8c 36 cpi r24, 0x6C ; 108 a31c: 11 f4 brne .+4 ; 0xa322 a31e: 00 68 ori r16, 0x80 ; 128 a320: df cf rjmp .-66 ; 0xa2e0 a322: 88 36 cpi r24, 0x68 ; 104 a324: e9 f2 breq .-70 ; 0xa2e0 a326: 9b eb ldi r25, 0xBB ; 187 a328: 98 0f add r25, r24 a32a: 93 30 cpi r25, 0x03 ; 3 a32c: 08 f0 brcs .+2 ; 0xa330 a32e: 5f c0 rjmp .+190 ; 0xa3ee a330: 00 61 ori r16, 0x10 ; 16 a332: 80 5e subi r24, 0xE0 ; 224 a334: 06 fd sbrc r16, 6 a336: 02 c0 rjmp .+4 ; 0xa33c a338: 46 e0 ldi r20, 0x06 ; 6 a33a: f4 2e mov r15, r20 a33c: 10 2f mov r17, r16 a33e: 1f 73 andi r17, 0x3F ; 63 a340: 85 36 cpi r24, 0x65 ; 101 a342: 09 f0 breq .+2 ; 0xa346 a344: 5b c0 rjmp .+182 ; 0xa3fc a346: 10 64 ori r17, 0x40 ; 64 a348: 17 ff sbrs r17, 7 a34a: 61 c0 rjmp .+194 ; 0xa40e a34c: 8f 2d mov r24, r15 a34e: 9b e3 ldi r25, 0x3B ; 59 a350: 9f 15 cp r25, r15 a352: 08 f4 brcc .+2 ; 0xa356 a354: 8b e3 ldi r24, 0x3B ; 59 a356: 44 24 eor r4, r4 a358: 43 94 inc r4 a35a: 48 0e add r4, r24 a35c: 27 e0 ldi r18, 0x07 ; 7 a35e: 35 01 movw r6, r10 a360: f4 e0 ldi r31, 0x04 ; 4 a362: 6f 0e add r6, r31 a364: 71 1c adc r7, r1 a366: f5 01 movw r30, r10 a368: 60 81 ld r22, Z a36a: 71 81 ldd r23, Z+1 ; 0x01 a36c: 82 81 ldd r24, Z+2 ; 0x02 a36e: 93 81 ldd r25, Z+3 ; 0x03 a370: 04 2d mov r16, r4 a372: a4 01 movw r20, r8 a374: 0f 94 99 a0 call 0x34132 ; 0x34132 <__ftoa_engine> a378: 5c 01 movw r10, r24 a37a: f9 81 ldd r31, Y+1 ; 0x01 a37c: fc 87 std Y+12, r31 ; 0x0c a37e: f0 ff sbrs r31, 0 a380: 03 c0 rjmp .+6 ; 0xa388 a382: 0d e2 ldi r16, 0x2D ; 45 a384: f3 ff sbrs r31, 3 a386: 07 c0 rjmp .+14 ; 0xa396 a388: 0b e2 ldi r16, 0x2B ; 43 a38a: 11 fd sbrc r17, 1 a38c: 04 c0 rjmp .+8 ; 0xa396 a38e: 01 2f mov r16, r17 a390: 04 70 andi r16, 0x04 ; 4 a392: 12 fd sbrc r17, 2 a394: 00 e2 ldi r16, 0x20 ; 32 a396: 2c 85 ldd r18, Y+12 ; 0x0c a398: 2c 70 andi r18, 0x0C ; 12 a39a: e2 2e mov r14, r18 a39c: 09 f4 brne .+2 ; 0xa3a0 a39e: 6b c0 rjmp .+214 ; 0xa476 a3a0: 01 11 cpse r16, r1 a3a2: d8 c2 rjmp .+1456 ; 0xa954 a3a4: f3 e0 ldi r31, 0x03 ; 3 a3a6: e1 2c mov r14, r1 a3a8: f5 15 cp r31, r5 a3aa: a0 f4 brcc .+40 ; 0xa3d4 a3ac: 83 e0 ldi r24, 0x03 ; 3 a3ae: e5 2c mov r14, r5 a3b0: e8 1a sub r14, r24 a3b2: 13 fd sbrc r17, 3 a3b4: 08 c0 rjmp .+16 ; 0xa3c6 a3b6: b6 01 movw r22, r12 a3b8: 80 e2 ldi r24, 0x20 ; 32 a3ba: 90 e0 ldi r25, 0x00 ; 0 a3bc: 0f 94 48 a2 call 0x34490 ; 0x34490 a3c0: ea 94 dec r14 a3c2: e1 10 cpse r14, r1 a3c4: f8 cf rjmp .-16 ; 0xa3b6 a3c6: 00 23 and r16, r16 a3c8: 29 f0 breq .+10 ; 0xa3d4 a3ca: b6 01 movw r22, r12 a3cc: 80 2f mov r24, r16 a3ce: 90 e0 ldi r25, 0x00 ; 0 a3d0: 0f 94 48 a2 call 0x34490 ; 0x34490 a3d4: 3c 85 ldd r19, Y+12 ; 0x0c a3d6: 28 e7 ldi r18, 0x78 ; 120 a3d8: a2 2e mov r10, r18 a3da: 21 e7 ldi r18, 0x71 ; 113 a3dc: b2 2e mov r11, r18 a3de: 33 fd sbrc r19, 3 a3e0: 04 c0 rjmp .+8 ; 0xa3ea a3e2: 9c e7 ldi r25, 0x7C ; 124 a3e4: a9 2e mov r10, r25 a3e6: 91 e7 ldi r25, 0x71 ; 113 a3e8: b9 2e mov r11, r25 a3ea: 10 71 andi r17, 0x10 ; 16 a3ec: 22 c0 rjmp .+68 ; 0xa432 a3ee: 9b e9 ldi r25, 0x9B ; 155 a3f0: 98 0f add r25, r24 a3f2: 93 30 cpi r25, 0x03 ; 3 a3f4: 08 f0 brcs .+2 ; 0xa3f8 a3f6: 47 c1 rjmp .+654 ; 0xa686 a3f8: 0f 7e andi r16, 0xEF ; 239 a3fa: 9c cf rjmp .-200 ; 0xa334 a3fc: 86 36 cpi r24, 0x66 ; 102 a3fe: 11 f4 brne .+4 ; 0xa404 a400: 10 68 ori r17, 0x80 ; 128 a402: a2 cf rjmp .-188 ; 0xa348 a404: ff 20 and r15, r15 a406: 09 f4 brne .+2 ; 0xa40a a408: 9f cf rjmp .-194 ; 0xa348 a40a: fa 94 dec r15 a40c: 9d cf rjmp .-198 ; 0xa348 a40e: e7 e0 ldi r30, 0x07 ; 7 a410: 2f 2d mov r18, r15 a412: ef 15 cp r30, r15 a414: 18 f4 brcc .+6 ; 0xa41c a416: 27 e0 ldi r18, 0x07 ; 7 a418: 37 e0 ldi r19, 0x07 ; 7 a41a: f3 2e mov r15, r19 a41c: 41 2c mov r4, r1 a41e: 9f cf rjmp .-194 ; 0xa35e a420: 11 11 cpse r17, r1 a422: 80 52 subi r24, 0x20 ; 32 a424: b6 01 movw r22, r12 a426: 90 e0 ldi r25, 0x00 ; 0 a428: 0f 94 48 a2 call 0x34490 ; 0x34490 a42c: 8f ef ldi r24, 0xFF ; 255 a42e: a8 1a sub r10, r24 a430: b8 0a sbc r11, r24 a432: f5 01 movw r30, r10 a434: 84 91 lpm r24, Z a436: 81 11 cpse r24, r1 a438: f3 cf rjmp .-26 ; 0xa420 a43a: e1 10 cpse r14, r1 a43c: 84 c2 rjmp .+1288 ; 0xa946 a43e: 53 01 movw r10, r6 a440: f6 01 movw r30, r12 a442: 93 81 ldd r25, Z+3 ; 0x03 a444: f1 01 movw r30, r2 a446: 93 fd sbrc r25, 3 a448: 85 91 lpm r24, Z+ a44a: 93 ff sbrs r25, 3 a44c: 81 91 ld r24, Z+ a44e: 1f 01 movw r2, r30 a450: 88 23 and r24, r24 a452: 09 f4 brne .+2 ; 0xa456 a454: 11 c2 rjmp .+1058 ; 0xa878 a456: 85 32 cpi r24, 0x25 ; 37 a458: 41 f4 brne .+16 ; 0xa46a a45a: 93 fd sbrc r25, 3 a45c: 85 91 lpm r24, Z+ a45e: 93 ff sbrs r25, 3 a460: 81 91 ld r24, Z+ a462: 1f 01 movw r2, r30 a464: 85 32 cpi r24, 0x25 ; 37 a466: 09 f0 breq .+2 ; 0xa46a a468: 1c cf rjmp .-456 ; 0xa2a2 a46a: b6 01 movw r22, r12 a46c: 90 e0 ldi r25, 0x00 ; 0 a46e: 0f 94 48 a2 call 0x34490 ; 0x34490 a472: 35 01 movw r6, r10 a474: e4 cf rjmp .-56 ; 0xa43e a476: 17 ff sbrs r17, 7 a478: 6f c0 rjmp .+222 ; 0xa558 a47a: 4a 0c add r4, r10 a47c: fc 85 ldd r31, Y+12 ; 0x0c a47e: f4 ff sbrs r31, 4 a480: 04 c0 rjmp .+8 ; 0xa48a a482: 8a 81 ldd r24, Y+2 ; 0x02 a484: 81 33 cpi r24, 0x31 ; 49 a486: 09 f4 brne .+2 ; 0xa48a a488: 4a 94 dec r4 a48a: 14 14 cp r1, r4 a48c: 0c f0 brlt .+2 ; 0xa490 a48e: 86 c0 rjmp .+268 ; 0xa59c a490: 28 e0 ldi r18, 0x08 ; 8 a492: 24 15 cp r18, r4 a494: 10 f4 brcc .+4 ; 0xa49a a496: 88 e0 ldi r24, 0x08 ; 8 a498: 48 2e mov r4, r24 a49a: 85 e0 ldi r24, 0x05 ; 5 a49c: 90 e0 ldi r25, 0x00 ; 0 a49e: 17 ff sbrs r17, 7 a4a0: 06 c0 rjmp .+12 ; 0xa4ae a4a2: c5 01 movw r24, r10 a4a4: b7 fe sbrs r11, 7 a4a6: 02 c0 rjmp .+4 ; 0xa4ac a4a8: 90 e0 ldi r25, 0x00 ; 0 a4aa: 80 e0 ldi r24, 0x00 ; 0 a4ac: 01 96 adiw r24, 0x01 ; 1 a4ae: 01 11 cpse r16, r1 a4b0: 01 96 adiw r24, 0x01 ; 1 a4b2: ff 20 and r15, r15 a4b4: 31 f0 breq .+12 ; 0xa4c2 a4b6: 2f 2d mov r18, r15 a4b8: 30 e0 ldi r19, 0x00 ; 0 a4ba: 2f 5f subi r18, 0xFF ; 255 a4bc: 3f 4f sbci r19, 0xFF ; 255 a4be: 82 0f add r24, r18 a4c0: 93 1f adc r25, r19 a4c2: 58 16 cp r5, r24 a4c4: 19 06 cpc r1, r25 a4c6: 19 f0 breq .+6 ; 0xa4ce a4c8: 14 f0 brlt .+4 ; 0xa4ce a4ca: e5 2c mov r14, r5 a4cc: e8 1a sub r14, r24 a4ce: 81 2f mov r24, r17 a4d0: 89 70 andi r24, 0x09 ; 9 a4d2: 11 f4 brne .+4 ; 0xa4d8 a4d4: e1 10 cpse r14, r1 a4d6: 67 c0 rjmp .+206 ; 0xa5a6 a4d8: 00 23 and r16, r16 a4da: 29 f0 breq .+10 ; 0xa4e6 a4dc: b6 01 movw r22, r12 a4de: 80 2f mov r24, r16 a4e0: 90 e0 ldi r25, 0x00 ; 0 a4e2: 0f 94 48 a2 call 0x34490 ; 0x34490 a4e6: 13 fd sbrc r17, 3 a4e8: 02 c0 rjmp .+4 ; 0xa4ee a4ea: e1 10 cpse r14, r1 a4ec: 63 c0 rjmp .+198 ; 0xa5b4 a4ee: 17 ff sbrs r17, 7 a4f0: 7c c0 rjmp .+248 ; 0xa5ea a4f2: 85 01 movw r16, r10 a4f4: b7 fe sbrs r11, 7 a4f6: 02 c0 rjmp .+4 ; 0xa4fc a4f8: 10 e0 ldi r17, 0x00 ; 0 a4fa: 00 e0 ldi r16, 0x00 ; 0 a4fc: c5 01 movw r24, r10 a4fe: 84 19 sub r24, r4 a500: 91 09 sbc r25, r1 a502: 2c 01 movw r4, r24 a504: 6f 2d mov r22, r15 a506: 70 e0 ldi r23, 0x00 ; 0 a508: ee 27 eor r30, r30 a50a: ff 27 eor r31, r31 a50c: e6 1b sub r30, r22 a50e: f7 0b sbc r31, r23 a510: ff 87 std Y+15, r31 ; 0x0f a512: ee 87 std Y+14, r30 ; 0x0e a514: 0f 3f cpi r16, 0xFF ; 255 a516: 10 07 cpc r17, r16 a518: 29 f4 brne .+10 ; 0xa524 a51a: b6 01 movw r22, r12 a51c: 8e e2 ldi r24, 0x2E ; 46 a51e: 90 e0 ldi r25, 0x00 ; 0 a520: 0f 94 48 a2 call 0x34490 ; 0x34490 a524: a0 16 cp r10, r16 a526: b1 06 cpc r11, r17 a528: 0c f4 brge .+2 ; 0xa52c a52a: 4b c0 rjmp .+150 ; 0xa5c2 a52c: 40 16 cp r4, r16 a52e: 51 06 cpc r5, r17 a530: 0c f0 brlt .+2 ; 0xa534 a532: 47 c0 rjmp .+142 ; 0xa5c2 a534: f5 01 movw r30, r10 a536: e0 1b sub r30, r16 a538: f1 0b sbc r31, r17 a53a: e8 0d add r30, r8 a53c: f9 1d adc r31, r9 a53e: 81 81 ldd r24, Z+1 ; 0x01 a540: 01 50 subi r16, 0x01 ; 1 a542: 11 09 sbc r17, r1 a544: 2e 85 ldd r18, Y+14 ; 0x0e a546: 3f 85 ldd r19, Y+15 ; 0x0f a548: 02 17 cp r16, r18 a54a: 13 07 cpc r17, r19 a54c: e4 f1 brlt .+120 ; 0xa5c6 a54e: b6 01 movw r22, r12 a550: 90 e0 ldi r25, 0x00 ; 0 a552: 0f 94 48 a2 call 0x34490 ; 0x34490 a556: de cf rjmp .-68 ; 0xa514 a558: 16 fd sbrc r17, 6 a55a: 9f cf rjmp .-194 ; 0xa49a a55c: ef 2d mov r30, r15 a55e: f0 e0 ldi r31, 0x00 ; 0 a560: ea 15 cp r30, r10 a562: fb 05 cpc r31, r11 a564: 34 f0 brlt .+12 ; 0xa572 a566: 3c ef ldi r19, 0xFC ; 252 a568: a3 16 cp r10, r19 a56a: 3f ef ldi r19, 0xFF ; 255 a56c: b3 06 cpc r11, r19 a56e: 0c f0 brlt .+2 ; 0xa572 a570: 10 68 ori r17, 0x80 ; 128 a572: 32 96 adiw r30, 0x02 ; 2 a574: e8 0d add r30, r8 a576: f9 1d adc r31, r9 a578: 01 c0 rjmp .+2 ; 0xa57c a57a: fa 94 dec r15 a57c: ff 20 and r15, r15 a57e: 19 f0 breq .+6 ; 0xa586 a580: 82 91 ld r24, -Z a582: 80 33 cpi r24, 0x30 ; 48 a584: d1 f3 breq .-12 ; 0xa57a a586: 17 ff sbrs r17, 7 a588: 88 cf rjmp .-240 ; 0xa49a a58a: 44 24 eor r4, r4 a58c: 43 94 inc r4 a58e: 4f 0c add r4, r15 a590: fa 14 cp r15, r10 a592: 1b 04 cpc r1, r11 a594: 31 f0 breq .+12 ; 0xa5a2 a596: 2c f0 brlt .+10 ; 0xa5a2 a598: fa 18 sub r15, r10 a59a: 7f cf rjmp .-258 ; 0xa49a a59c: 44 24 eor r4, r4 a59e: 43 94 inc r4 a5a0: 7c cf rjmp .-264 ; 0xa49a a5a2: f1 2c mov r15, r1 a5a4: 7a cf rjmp .-268 ; 0xa49a a5a6: b6 01 movw r22, r12 a5a8: 80 e2 ldi r24, 0x20 ; 32 a5aa: 90 e0 ldi r25, 0x00 ; 0 a5ac: 0f 94 48 a2 call 0x34490 ; 0x34490 a5b0: ea 94 dec r14 a5b2: 90 cf rjmp .-224 ; 0xa4d4 a5b4: b6 01 movw r22, r12 a5b6: 80 e3 ldi r24, 0x30 ; 48 a5b8: 90 e0 ldi r25, 0x00 ; 0 a5ba: 0f 94 48 a2 call 0x34490 ; 0x34490 a5be: ea 94 dec r14 a5c0: 94 cf rjmp .-216 ; 0xa4ea a5c2: 80 e3 ldi r24, 0x30 ; 48 a5c4: bd cf rjmp .-134 ; 0xa540 a5c6: a0 16 cp r10, r16 a5c8: b1 06 cpc r11, r17 a5ca: 41 f4 brne .+16 ; 0xa5dc a5cc: 9a 81 ldd r25, Y+2 ; 0x02 a5ce: 96 33 cpi r25, 0x36 ; 54 a5d0: 50 f4 brcc .+20 ; 0xa5e6 a5d2: 95 33 cpi r25, 0x35 ; 53 a5d4: 19 f4 brne .+6 ; 0xa5dc a5d6: 3c 85 ldd r19, Y+12 ; 0x0c a5d8: 34 ff sbrs r19, 4 a5da: 05 c0 rjmp .+10 ; 0xa5e6 a5dc: b6 01 movw r22, r12 a5de: 90 e0 ldi r25, 0x00 ; 0 a5e0: 0f 94 48 a2 call 0x34490 ; 0x34490 a5e4: 2a cf rjmp .-428 ; 0xa43a a5e6: 81 e3 ldi r24, 0x31 ; 49 a5e8: f9 cf rjmp .-14 ; 0xa5dc a5ea: 8a 81 ldd r24, Y+2 ; 0x02 a5ec: 81 33 cpi r24, 0x31 ; 49 a5ee: 19 f0 breq .+6 ; 0xa5f6 a5f0: 9c 85 ldd r25, Y+12 ; 0x0c a5f2: 9f 7e andi r25, 0xEF ; 239 a5f4: 9c 87 std Y+12, r25 ; 0x0c a5f6: b6 01 movw r22, r12 a5f8: 90 e0 ldi r25, 0x00 ; 0 a5fa: 0f 94 48 a2 call 0x34490 ; 0x34490 a5fe: ff 20 and r15, r15 a600: a9 f0 breq .+42 ; 0xa62c a602: b6 01 movw r22, r12 a604: 8e e2 ldi r24, 0x2E ; 46 a606: 90 e0 ldi r25, 0x00 ; 0 a608: 0f 94 48 a2 call 0x34490 ; 0x34490 a60c: f3 94 inc r15 a60e: f3 94 inc r15 a610: e2 e0 ldi r30, 0x02 ; 2 a612: 01 e0 ldi r16, 0x01 ; 1 a614: 0e 0f add r16, r30 a616: e8 0d add r30, r8 a618: f9 2d mov r31, r9 a61a: f1 1d adc r31, r1 a61c: 80 81 ld r24, Z a61e: b6 01 movw r22, r12 a620: 90 e0 ldi r25, 0x00 ; 0 a622: 0f 94 48 a2 call 0x34490 ; 0x34490 a626: e0 2f mov r30, r16 a628: 0f 11 cpse r16, r15 a62a: f3 cf rjmp .-26 ; 0xa612 a62c: 85 e6 ldi r24, 0x65 ; 101 a62e: 90 e0 ldi r25, 0x00 ; 0 a630: 14 ff sbrs r17, 4 a632: 02 c0 rjmp .+4 ; 0xa638 a634: 85 e4 ldi r24, 0x45 ; 69 a636: 90 e0 ldi r25, 0x00 ; 0 a638: b6 01 movw r22, r12 a63a: 0f 94 48 a2 call 0x34490 ; 0x34490 a63e: b7 fc sbrc r11, 7 a640: 06 c0 rjmp .+12 ; 0xa64e a642: a1 14 cp r10, r1 a644: b1 04 cpc r11, r1 a646: c1 f4 brne .+48 ; 0xa678 a648: ec 85 ldd r30, Y+12 ; 0x0c a64a: e4 ff sbrs r30, 4 a64c: 15 c0 rjmp .+42 ; 0xa678 a64e: b1 94 neg r11 a650: a1 94 neg r10 a652: b1 08 sbc r11, r1 a654: 8d e2 ldi r24, 0x2D ; 45 a656: b6 01 movw r22, r12 a658: 90 e0 ldi r25, 0x00 ; 0 a65a: 0f 94 48 a2 call 0x34490 ; 0x34490 a65e: 80 e3 ldi r24, 0x30 ; 48 a660: 2a e0 ldi r18, 0x0A ; 10 a662: a2 16 cp r10, r18 a664: b1 04 cpc r11, r1 a666: 54 f4 brge .+20 ; 0xa67c a668: b6 01 movw r22, r12 a66a: 90 e0 ldi r25, 0x00 ; 0 a66c: 0f 94 48 a2 call 0x34490 ; 0x34490 a670: b6 01 movw r22, r12 a672: c5 01 movw r24, r10 a674: c0 96 adiw r24, 0x30 ; 48 a676: b4 cf rjmp .-152 ; 0xa5e0 a678: 8b e2 ldi r24, 0x2B ; 43 a67a: ed cf rjmp .-38 ; 0xa656 a67c: 8f 5f subi r24, 0xFF ; 255 a67e: fa e0 ldi r31, 0x0A ; 10 a680: af 1a sub r10, r31 a682: b1 08 sbc r11, r1 a684: ed cf rjmp .-38 ; 0xa660 a686: 83 36 cpi r24, 0x63 ; 99 a688: c9 f0 breq .+50 ; 0xa6bc a68a: 83 37 cpi r24, 0x73 ; 115 a68c: 71 f1 breq .+92 ; 0xa6ea a68e: 83 35 cpi r24, 0x53 ; 83 a690: 09 f0 breq .+2 ; 0xa694 a692: 5b c0 rjmp .+182 ; 0xa74a a694: 35 01 movw r6, r10 a696: f2 e0 ldi r31, 0x02 ; 2 a698: 6f 0e add r6, r31 a69a: 71 1c adc r7, r1 a69c: f5 01 movw r30, r10 a69e: a0 80 ld r10, Z a6a0: b1 80 ldd r11, Z+1 ; 0x01 a6a2: 6f 2d mov r22, r15 a6a4: 70 e0 ldi r23, 0x00 ; 0 a6a6: 06 fd sbrc r16, 6 a6a8: 02 c0 rjmp .+4 ; 0xa6ae a6aa: 6f ef ldi r22, 0xFF ; 255 a6ac: 7f ef ldi r23, 0xFF ; 255 a6ae: c5 01 movw r24, r10 a6b0: 0f 94 dc a1 call 0x343b8 ; 0x343b8 a6b4: 9d 87 std Y+13, r25 ; 0x0d a6b6: 8c 87 std Y+12, r24 ; 0x0c a6b8: 00 68 ori r16, 0x80 ; 128 a6ba: 0d c0 rjmp .+26 ; 0xa6d6 a6bc: 35 01 movw r6, r10 a6be: 32 e0 ldi r19, 0x02 ; 2 a6c0: 63 0e add r6, r19 a6c2: 71 1c adc r7, r1 a6c4: f5 01 movw r30, r10 a6c6: 80 81 ld r24, Z a6c8: 89 83 std Y+1, r24 ; 0x01 a6ca: 21 e0 ldi r18, 0x01 ; 1 a6cc: 30 e0 ldi r19, 0x00 ; 0 a6ce: 3d 87 std Y+13, r19 ; 0x0d a6d0: 2c 87 std Y+12, r18 ; 0x0c a6d2: 54 01 movw r10, r8 a6d4: 0f 77 andi r16, 0x7F ; 127 a6d6: 03 fd sbrc r16, 3 a6d8: 06 c0 rjmp .+12 ; 0xa6e6 a6da: 2c 85 ldd r18, Y+12 ; 0x0c a6dc: 3d 85 ldd r19, Y+13 ; 0x0d a6de: 52 16 cp r5, r18 a6e0: 13 06 cpc r1, r19 a6e2: 09 f0 breq .+2 ; 0xa6e6 a6e4: a8 f4 brcc .+42 ; 0xa710 a6e6: e5 2c mov r14, r5 a6e8: 2b c0 rjmp .+86 ; 0xa740 a6ea: 35 01 movw r6, r10 a6ec: 32 e0 ldi r19, 0x02 ; 2 a6ee: 63 0e add r6, r19 a6f0: 71 1c adc r7, r1 a6f2: f5 01 movw r30, r10 a6f4: a0 80 ld r10, Z a6f6: b1 80 ldd r11, Z+1 ; 0x01 a6f8: 6f 2d mov r22, r15 a6fa: 70 e0 ldi r23, 0x00 ; 0 a6fc: 06 fd sbrc r16, 6 a6fe: 02 c0 rjmp .+4 ; 0xa704 a700: 6f ef ldi r22, 0xFF ; 255 a702: 7f ef ldi r23, 0xFF ; 255 a704: c5 01 movw r24, r10 a706: 0f 94 01 a2 call 0x34402 ; 0x34402 a70a: 9d 87 std Y+13, r25 ; 0x0d a70c: 8c 87 std Y+12, r24 ; 0x0c a70e: e2 cf rjmp .-60 ; 0xa6d4 a710: b6 01 movw r22, r12 a712: 80 e2 ldi r24, 0x20 ; 32 a714: 90 e0 ldi r25, 0x00 ; 0 a716: 0f 94 48 a2 call 0x34490 ; 0x34490 a71a: 5a 94 dec r5 a71c: de cf rjmp .-68 ; 0xa6da a71e: f5 01 movw r30, r10 a720: 07 fd sbrc r16, 7 a722: 85 91 lpm r24, Z+ a724: 07 ff sbrs r16, 7 a726: 81 91 ld r24, Z+ a728: 5f 01 movw r10, r30 a72a: b6 01 movw r22, r12 a72c: 90 e0 ldi r25, 0x00 ; 0 a72e: 0f 94 48 a2 call 0x34490 ; 0x34490 a732: e1 10 cpse r14, r1 a734: ea 94 dec r14 a736: 8c 85 ldd r24, Y+12 ; 0x0c a738: 9d 85 ldd r25, Y+13 ; 0x0d a73a: 01 97 sbiw r24, 0x01 ; 1 a73c: 9d 87 std Y+13, r25 ; 0x0d a73e: 8c 87 std Y+12, r24 ; 0x0c a740: ec 85 ldd r30, Y+12 ; 0x0c a742: fd 85 ldd r31, Y+13 ; 0x0d a744: ef 2b or r30, r31 a746: 59 f7 brne .-42 ; 0xa71e a748: 78 ce rjmp .-784 ; 0xa43a a74a: 84 36 cpi r24, 0x64 ; 100 a74c: 19 f0 breq .+6 ; 0xa754 a74e: 89 36 cpi r24, 0x69 ; 105 a750: 09 f0 breq .+2 ; 0xa754 a752: 74 c0 rjmp .+232 ; 0xa83c a754: 35 01 movw r6, r10 a756: 07 ff sbrs r16, 7 a758: 66 c0 rjmp .+204 ; 0xa826 a75a: f4 e0 ldi r31, 0x04 ; 4 a75c: 6f 0e add r6, r31 a75e: 71 1c adc r7, r1 a760: f5 01 movw r30, r10 a762: 60 81 ld r22, Z a764: 71 81 ldd r23, Z+1 ; 0x01 a766: 82 81 ldd r24, Z+2 ; 0x02 a768: 93 81 ldd r25, Z+3 ; 0x03 a76a: 10 2f mov r17, r16 a76c: 1f 76 andi r17, 0x6F ; 111 a76e: 97 ff sbrs r25, 7 a770: 08 c0 rjmp .+16 ; 0xa782 a772: 90 95 com r25 a774: 80 95 com r24 a776: 70 95 com r23 a778: 61 95 neg r22 a77a: 7f 4f sbci r23, 0xFF ; 255 a77c: 8f 4f sbci r24, 0xFF ; 255 a77e: 9f 4f sbci r25, 0xFF ; 255 a780: 10 68 ori r17, 0x80 ; 128 a782: 2a e0 ldi r18, 0x0A ; 10 a784: 30 e0 ldi r19, 0x00 ; 0 a786: a4 01 movw r20, r8 a788: 0f 94 6f a3 call 0x346de ; 0x346de <__ultoa_invert> a78c: a8 2e mov r10, r24 a78e: a8 18 sub r10, r8 a790: ba 2c mov r11, r10 a792: 01 2f mov r16, r17 a794: 16 ff sbrs r17, 6 a796: 0a c0 rjmp .+20 ; 0xa7ac a798: 0e 7f andi r16, 0xFE ; 254 a79a: af 14 cp r10, r15 a79c: 38 f4 brcc .+14 ; 0xa7ac a79e: 14 ff sbrs r17, 4 a7a0: 04 c0 rjmp .+8 ; 0xa7aa a7a2: 12 fd sbrc r17, 2 a7a4: 02 c0 rjmp .+4 ; 0xa7aa a7a6: 01 2f mov r16, r17 a7a8: 0e 7e andi r16, 0xEE ; 238 a7aa: bf 2c mov r11, r15 a7ac: 04 ff sbrs r16, 4 a7ae: a3 c0 rjmp .+326 ; 0xa8f6 a7b0: fe 01 movw r30, r28 a7b2: ea 0d add r30, r10 a7b4: f1 1d adc r31, r1 a7b6: 80 81 ld r24, Z a7b8: 80 33 cpi r24, 0x30 ; 48 a7ba: 09 f0 breq .+2 ; 0xa7be a7bc: 95 c0 rjmp .+298 ; 0xa8e8 a7be: 09 7e andi r16, 0xE9 ; 233 a7c0: f0 2f mov r31, r16 a7c2: f8 70 andi r31, 0x08 ; 8 a7c4: ef 2e mov r14, r31 a7c6: 03 fd sbrc r16, 3 a7c8: a5 c0 rjmp .+330 ; 0xa914 a7ca: 00 ff sbrs r16, 0 a7cc: 9f c0 rjmp .+318 ; 0xa90c a7ce: fa 2c mov r15, r10 a7d0: b5 14 cp r11, r5 a7d2: 10 f4 brcc .+4 ; 0xa7d8 a7d4: f5 0c add r15, r5 a7d6: fb 18 sub r15, r11 a7d8: 04 ff sbrs r16, 4 a7da: a2 c0 rjmp .+324 ; 0xa920 a7dc: b6 01 movw r22, r12 a7de: 80 e3 ldi r24, 0x30 ; 48 a7e0: 90 e0 ldi r25, 0x00 ; 0 a7e2: 0f 94 48 a2 call 0x34490 ; 0x34490 a7e6: 02 ff sbrs r16, 2 a7e8: 09 c0 rjmp .+18 ; 0xa7fc a7ea: 88 e7 ldi r24, 0x78 ; 120 a7ec: 90 e0 ldi r25, 0x00 ; 0 a7ee: 01 ff sbrs r16, 1 a7f0: 02 c0 rjmp .+4 ; 0xa7f6 a7f2: 88 e5 ldi r24, 0x58 ; 88 a7f4: 90 e0 ldi r25, 0x00 ; 0 a7f6: b6 01 movw r22, r12 a7f8: 0f 94 48 a2 call 0x34490 ; 0x34490 a7fc: af 14 cp r10, r15 a7fe: 08 f4 brcc .+2 ; 0xa802 a800: 9b c0 rjmp .+310 ; 0xa938 a802: aa 94 dec r10 a804: 0a 2d mov r16, r10 a806: 10 e0 ldi r17, 0x00 ; 0 a808: 0f 5f subi r16, 0xFF ; 255 a80a: 1f 4f sbci r17, 0xFF ; 255 a80c: 08 0d add r16, r8 a80e: 19 1d adc r17, r9 a810: f8 01 movw r30, r16 a812: 82 91 ld r24, -Z a814: 8f 01 movw r16, r30 a816: b6 01 movw r22, r12 a818: 90 e0 ldi r25, 0x00 ; 0 a81a: 0f 94 48 a2 call 0x34490 ; 0x34490 a81e: 80 16 cp r8, r16 a820: 91 06 cpc r9, r17 a822: b1 f7 brne .-20 ; 0xa810 a824: 0a ce rjmp .-1004 ; 0xa43a a826: f2 e0 ldi r31, 0x02 ; 2 a828: 6f 0e add r6, r31 a82a: 71 1c adc r7, r1 a82c: f5 01 movw r30, r10 a82e: 60 81 ld r22, Z a830: 71 81 ldd r23, Z+1 ; 0x01 a832: 07 2e mov r0, r23 a834: 00 0c add r0, r0 a836: 88 0b sbc r24, r24 a838: 99 0b sbc r25, r25 a83a: 97 cf rjmp .-210 ; 0xa76a a83c: 10 2f mov r17, r16 a83e: 85 37 cpi r24, 0x75 ; 117 a840: a9 f4 brne .+42 ; 0xa86c a842: 1f 7e andi r17, 0xEF ; 239 a844: 2a e0 ldi r18, 0x0A ; 10 a846: 30 e0 ldi r19, 0x00 ; 0 a848: 35 01 movw r6, r10 a84a: 17 ff sbrs r17, 7 a84c: 44 c0 rjmp .+136 ; 0xa8d6 a84e: f4 e0 ldi r31, 0x04 ; 4 a850: 6f 0e add r6, r31 a852: 71 1c adc r7, r1 a854: f5 01 movw r30, r10 a856: 60 81 ld r22, Z a858: 71 81 ldd r23, Z+1 ; 0x01 a85a: 82 81 ldd r24, Z+2 ; 0x02 a85c: 93 81 ldd r25, Z+3 ; 0x03 a85e: a4 01 movw r20, r8 a860: 0f 94 6f a3 call 0x346de ; 0x346de <__ultoa_invert> a864: a8 2e mov r10, r24 a866: a8 18 sub r10, r8 a868: 1f 77 andi r17, 0x7F ; 127 a86a: 92 cf rjmp .-220 ; 0xa790 a86c: 19 7f andi r17, 0xF9 ; 249 a86e: 8f 36 cpi r24, 0x6F ; 111 a870: 79 f1 breq .+94 ; 0xa8d0 a872: f0 f4 brcc .+60 ; 0xa8b0 a874: 88 35 cpi r24, 0x58 ; 88 a876: 39 f1 breq .+78 ; 0xa8c6 a878: f6 01 movw r30, r12 a87a: 86 81 ldd r24, Z+6 ; 0x06 a87c: 97 81 ldd r25, Z+7 ; 0x07 a87e: 2f 96 adiw r28, 0x0f ; 15 a880: 0f b6 in r0, 0x3f ; 63 a882: f8 94 cli a884: de bf out 0x3e, r29 ; 62 a886: 0f be out 0x3f, r0 ; 63 a888: cd bf out 0x3d, r28 ; 61 a88a: df 91 pop r29 a88c: cf 91 pop r28 a88e: 1f 91 pop r17 a890: 0f 91 pop r16 a892: ff 90 pop r15 a894: ef 90 pop r14 a896: df 90 pop r13 a898: cf 90 pop r12 a89a: bf 90 pop r11 a89c: af 90 pop r10 a89e: 9f 90 pop r9 a8a0: 8f 90 pop r8 a8a2: 7f 90 pop r7 a8a4: 6f 90 pop r6 a8a6: 5f 90 pop r5 a8a8: 4f 90 pop r4 a8aa: 3f 90 pop r3 a8ac: 2f 90 pop r2 a8ae: 08 95 ret a8b0: 80 37 cpi r24, 0x70 ; 112 a8b2: 39 f0 breq .+14 ; 0xa8c2 a8b4: 88 37 cpi r24, 0x78 ; 120 a8b6: 01 f7 brne .-64 ; 0xa878 a8b8: 14 fd sbrc r17, 4 a8ba: 14 60 ori r17, 0x04 ; 4 a8bc: 20 e1 ldi r18, 0x10 ; 16 a8be: 30 e0 ldi r19, 0x00 ; 0 a8c0: c3 cf rjmp .-122 ; 0xa848 a8c2: 10 61 ori r17, 0x10 ; 16 a8c4: f9 cf rjmp .-14 ; 0xa8b8 a8c6: 04 fd sbrc r16, 4 a8c8: 16 60 ori r17, 0x06 ; 6 a8ca: 20 e1 ldi r18, 0x10 ; 16 a8cc: 32 e0 ldi r19, 0x02 ; 2 a8ce: bc cf rjmp .-136 ; 0xa848 a8d0: 28 e0 ldi r18, 0x08 ; 8 a8d2: 30 e0 ldi r19, 0x00 ; 0 a8d4: b9 cf rjmp .-142 ; 0xa848 a8d6: f2 e0 ldi r31, 0x02 ; 2 a8d8: 6f 0e add r6, r31 a8da: 71 1c adc r7, r1 a8dc: f5 01 movw r30, r10 a8de: 60 81 ld r22, Z a8e0: 71 81 ldd r23, Z+1 ; 0x01 a8e2: 90 e0 ldi r25, 0x00 ; 0 a8e4: 80 e0 ldi r24, 0x00 ; 0 a8e6: bb cf rjmp .-138 ; 0xa85e a8e8: 02 fd sbrc r16, 2 a8ea: 02 c0 rjmp .+4 ; 0xa8f0 a8ec: b3 94 inc r11 a8ee: 68 cf rjmp .-304 ; 0xa7c0 a8f0: b3 94 inc r11 a8f2: b3 94 inc r11 a8f4: 65 cf rjmp .-310 ; 0xa7c0 a8f6: 80 2f mov r24, r16 a8f8: 86 78 andi r24, 0x86 ; 134 a8fa: 09 f4 brne .+2 ; 0xa8fe a8fc: 61 cf rjmp .-318 ; 0xa7c0 a8fe: f6 cf rjmp .-20 ; 0xa8ec a900: b6 01 movw r22, r12 a902: 80 e2 ldi r24, 0x20 ; 32 a904: 90 e0 ldi r25, 0x00 ; 0 a906: 0f 94 48 a2 call 0x34490 ; 0x34490 a90a: b3 94 inc r11 a90c: b5 14 cp r11, r5 a90e: c0 f3 brcs .-16 ; 0xa900 a910: e1 2c mov r14, r1 a912: 62 cf rjmp .-316 ; 0xa7d8 a914: e5 2c mov r14, r5 a916: eb 18 sub r14, r11 a918: b5 14 cp r11, r5 a91a: 08 f4 brcc .+2 ; 0xa91e a91c: 5d cf rjmp .-326 ; 0xa7d8 a91e: f8 cf rjmp .-16 ; 0xa910 a920: 80 2f mov r24, r16 a922: 86 78 andi r24, 0x86 ; 134 a924: 09 f4 brne .+2 ; 0xa928 a926: 6a cf rjmp .-300 ; 0xa7fc a928: 8b e2 ldi r24, 0x2B ; 43 a92a: 01 ff sbrs r16, 1 a92c: 80 e2 ldi r24, 0x20 ; 32 a92e: 07 fd sbrc r16, 7 a930: 8d e2 ldi r24, 0x2D ; 45 a932: b6 01 movw r22, r12 a934: 90 e0 ldi r25, 0x00 ; 0 a936: 60 cf rjmp .-320 ; 0xa7f8 a938: b6 01 movw r22, r12 a93a: 80 e3 ldi r24, 0x30 ; 48 a93c: 90 e0 ldi r25, 0x00 ; 0 a93e: 0f 94 48 a2 call 0x34490 ; 0x34490 a942: fa 94 dec r15 a944: 5b cf rjmp .-330 ; 0xa7fc a946: b6 01 movw r22, r12 a948: 80 e2 ldi r24, 0x20 ; 32 a94a: 90 e0 ldi r25, 0x00 ; 0 a94c: 0f 94 48 a2 call 0x34490 ; 0x34490 a950: ea 94 dec r14 a952: 73 cd rjmp .-1306 ; 0xa43a a954: 24 e0 ldi r18, 0x04 ; 4 a956: e1 2c mov r14, r1 a958: 25 15 cp r18, r5 a95a: 08 f0 brcs .+2 ; 0xa95e a95c: 36 cd rjmp .-1428 ; 0xa3ca a95e: 84 e0 ldi r24, 0x04 ; 4 a960: 26 cd rjmp .-1460 ; 0xa3ae 0000a962 : uint16_t restore_interrupted_gcode() { // When recovering from a previous print move, restore the originally // calculated start position on the first USB/SD command. This accounts // properly for relative moves if ( a962: 20 e0 ldi r18, 0x00 ; 0 a964: 30 e0 ldi r19, 0x00 ; 0 a966: 40 e8 ldi r20, 0x80 ; 128 a968: 5f eb ldi r21, 0xBF ; 191 a96a: 60 91 7e 02 lds r22, 0x027E ; 0x80027e a96e: 70 91 7f 02 lds r23, 0x027F ; 0x80027f a972: 80 91 80 02 lds r24, 0x0280 ; 0x800280 a976: 90 91 81 02 lds r25, 0x0281 ; 0x800281 a97a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> a97e: 88 23 and r24, r24 a980: 21 f1 breq .+72 ; 0xa9ca (saved_start_position[0] != SAVED_START_POSITION_UNSET) && ( (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) || a982: e0 91 38 12 lds r30, 0x1238 ; 0x801238 a986: f0 91 39 12 lds r31, 0x1239 ; 0x801239 a98a: e5 5b subi r30, 0xB5 ; 181 a98c: ff 4e sbci r31, 0xEF ; 239 uint16_t restore_interrupted_gcode() { // When recovering from a previous print move, restore the originally // calculated start position on the first USB/SD command. This accounts // properly for relative moves if ( (saved_start_position[0] != SAVED_START_POSITION_UNSET) && ( a98e: 80 81 ld r24, Z a990: 8b 7f andi r24, 0xFB ; 251 a992: 82 30 cpi r24, 0x02 ; 2 a994: d1 f4 brne .+52 ; 0xa9ca (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) ) ) { memcpy(current_position, saved_start_position, sizeof(current_position)); a996: 80 e1 ldi r24, 0x10 ; 16 a998: ee e7 ldi r30, 0x7E ; 126 a99a: f2 e0 ldi r31, 0x02 ; 2 a99c: a1 e6 ldi r26, 0x61 ; 97 a99e: b2 e1 ldi r27, 0x12 ; 18 a9a0: 01 90 ld r0, Z+ a9a2: 0d 92 st X+, r0 a9a4: 8a 95 dec r24 a9a6: e1 f7 brne .-8 ; 0xa9a0 saved_start_position[0] = SAVED_START_POSITION_UNSET; a9a8: 80 e0 ldi r24, 0x00 ; 0 a9aa: 90 e0 ldi r25, 0x00 ; 0 a9ac: a0 e8 ldi r26, 0x80 ; 128 a9ae: bf eb ldi r27, 0xBF ; 191 a9b0: 80 93 7e 02 sts 0x027E, r24 ; 0x80027e a9b4: 90 93 7f 02 sts 0x027F, r25 ; 0x80027f a9b8: a0 93 80 02 sts 0x0280, r26 ; 0x800280 a9bc: b0 93 81 02 sts 0x0281, r27 ; 0x800281 return saved_segment_idx; a9c0: 80 91 4d 12 lds r24, 0x124D ; 0x80124d a9c4: 90 91 4e 12 lds r25, 0x124E ; 0x80124e a9c8: 08 95 ret } else return 1; //begin with the first segment a9ca: 81 e0 ldi r24, 0x01 ; 1 a9cc: 90 e0 ldi r25, 0x00 ; 0 } a9ce: 08 95 ret 0000a9d0 : void plan_set_e_position(const float &e); // Reset the E position to zero at the start of the next segment void plan_reset_next_e(); inline void set_current_to_destination() { memcpy(current_position, destination, sizeof(current_position)); } a9d0: 80 e1 ldi r24, 0x10 ; 16 a9d2: e9 e2 ldi r30, 0x29 ; 41 a9d4: f6 e0 ldi r31, 0x06 ; 6 a9d6: a1 e6 ldi r26, 0x61 ; 97 a9d8: b2 e1 ldi r27, 0x12 ; 18 a9da: 01 90 ld r0, Z+ a9dc: 0d 92 st X+, r0 a9de: 8a 95 dec r24 a9e0: e1 f7 brne .-8 ; 0xa9da a9e2: 08 95 ret 0000a9e4 : /// @brief Calculate the LCD row offset /// @param row LCD row number, ranges from 0 to LCD_HEIGHT - 1 /// @return row offset which the LCD register understands static uint8_t __attribute__((noinline)) lcd_get_row_offset(uint8_t row) { return pgm_read_byte(row_offsets + min(row, LCD_HEIGHT - 1)); a9e4: e0 e5 ldi r30, 0x50 ; 80 a9e6: f6 e7 ldi r31, 0x76 ; 118 a9e8: 83 30 cpi r24, 0x03 ; 3 a9ea: 21 f0 breq .+8 ; 0xa9f4 a9ec: e8 2f mov r30, r24 a9ee: f0 e0 ldi r31, 0x00 ; 0 a9f0: e3 5b subi r30, 0xB3 ; 179 a9f2: f9 48 sbci r31, 0x89 ; 137 a9f4: 84 91 lpm r24, Z } a9f6: 08 95 ret 0000a9f8 : static int read(void); static void flush(void); static /*FORCE_INLINE*/ int available(void) { return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE; a9f8: 80 91 42 05 lds r24, 0x0542 ; 0x800542 a9fc: 90 91 43 05 lds r25, 0x0543 ; 0x800543 aa00: 20 91 44 05 lds r18, 0x0544 ; 0x800544 aa04: 30 91 45 05 lds r19, 0x0545 ; 0x800545 aa08: 82 1b sub r24, r18 aa0a: 93 0b sbc r25, r19 } aa0c: 8f 77 andi r24, 0x7F ; 127 aa0e: 99 27 eor r25, r25 aa10: 08 95 ret 0000aa12 : memset((void*)adc_values, 0, sizeof(adc_values)); } static void adc_setmux(uint8_t ch) { ch &= 0x0f; aa12: 98 2f mov r25, r24 aa14: 9f 70 andi r25, 0x0F ; 15 if (ch & 0x08) ADCSRB |= (1 << MUX5); aa16: 83 ff sbrs r24, 3 aa18: 0d c0 rjmp .+26 ; 0xaa34 aa1a: 80 91 7b 00 lds r24, 0x007B ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> aa1e: 88 60 ori r24, 0x08 ; 8 else ADCSRB &= ~(1 << MUX5); aa20: 80 93 7b 00 sts 0x007B, r24 ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); aa24: 80 91 7c 00 lds r24, 0x007C ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> aa28: 88 7f andi r24, 0xF8 ; 248 aa2a: 97 70 andi r25, 0x07 ; 7 aa2c: 89 2b or r24, r25 aa2e: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> } aa32: 08 95 ret static void adc_setmux(uint8_t ch) { ch &= 0x0f; if (ch & 0x08) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); aa34: 80 91 7b 00 lds r24, 0x007B ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> aa38: 87 7f andi r24, 0xF7 ; 247 aa3a: f2 cf rjmp .-28 ; 0xaa20 0000aa3c : if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); aa3c: 4f ef ldi r20, 0xFF ; 255 aa3e: 5f ef ldi r21, 0xFF ; 255 aa40: ba 01 movw r22, r20 aa42: 85 ee ldi r24, 0xE5 ; 229 aa44: 9f e0 ldi r25, 0x0F ; 15 aa46: 0f 94 16 a4 call 0x3482c ; 0x3482c aa4a: 4f ef ldi r20, 0xFF ; 255 aa4c: 5f ef ldi r21, 0xFF ; 255 aa4e: ba 01 movw r22, r20 aa50: 89 ee ldi r24, 0xE9 ; 233 aa52: 9f e0 ldi r25, 0x0F ; 15 aa54: 0f 94 16 a4 call 0x3482c ; 0x3482c aa58: 4f ef ldi r20, 0xFF ; 255 aa5a: 5f ef ldi r21, 0xFF ; 255 aa5c: ba 01 movw r22, r20 aa5e: 8d ed ldi r24, 0xDD ; 221 aa60: 9f e0 ldi r25, 0x0F ; 15 aa62: 0f 94 16 a4 call 0x3482c ; 0x3482c aa66: 4f ef ldi r20, 0xFF ; 255 aa68: 5f ef ldi r21, 0xFF ; 255 aa6a: ba 01 movw r22, r20 aa6c: 81 ee ldi r24, 0xE1 ; 225 aa6e: 9f e0 ldi r25, 0x0F ; 15 aa70: 0f 94 16 a4 call 0x3482c ; 0x3482c aa74: 4f ef ldi r20, 0xFF ; 255 aa76: 5f ef ldi r21, 0xFF ; 255 aa78: ba 01 movw r22, r20 aa7a: 85 ed ldi r24, 0xD5 ; 213 aa7c: 9f e0 ldi r25, 0x0F ; 15 aa7e: 0f 94 16 a4 call 0x3482c ; 0x3482c aa82: 4f ef ldi r20, 0xFF ; 255 aa84: 5f ef ldi r21, 0xFF ; 255 aa86: ba 01 movw r22, r20 aa88: 89 ed ldi r24, 0xD9 ; 217 aa8a: 9f e0 ldi r25, 0x0F ; 15 aa8c: 0f 94 16 a4 call 0x3482c ; 0x3482c aa90: 4f ef ldi r20, 0xFF ; 255 aa92: 5f ef ldi r21, 0xFF ; 255 aa94: ba 01 movw r22, r20 aa96: 85 ec ldi r24, 0xC5 ; 197 aa98: 9f e0 ldi r25, 0x0F ; 15 aa9a: 0f 94 16 a4 call 0x3482c ; 0x3482c aa9e: 4f ef ldi r20, 0xFF ; 255 aaa0: 5f ef ldi r21, 0xFF ; 255 aaa2: ba 01 movw r22, r20 aaa4: 89 ec ldi r24, 0xC9 ; 201 aaa6: 9f e0 ldi r25, 0x0F ; 15 aaa8: 0f 94 16 a4 call 0x3482c ; 0x3482c aaac: 4f ef ldi r20, 0xFF ; 255 aaae: 5f ef ldi r21, 0xFF ; 255 aab0: ba 01 movw r22, r20 aab2: 8d ec ldi r24, 0xCD ; 205 aab4: 9f e0 ldi r25, 0x0F ; 15 aab6: 0f 94 16 a4 call 0x3482c ; 0x3482c aaba: 4f ef ldi r20, 0xFF ; 255 aabc: 5f ef ldi r21, 0xFF ; 255 aabe: ba 01 movw r22, r20 aac0: 81 ed ldi r24, 0xD1 ; 209 aac2: 9f e0 ldi r25, 0x0F ; 15 aac4: 0d 94 16 a4 jmp 0x3482c ; 0x3482c 0000aac8 : // This function may update bufindw, therefore for the power panic to work, this function must be called // with the interrupts disabled! static bool __attribute__((noinline)) cmdqueue_could_enqueue_back(size_t len_asked) { // MAX_CMD_SIZE has to accommodate the zero terminator. if (len_asked >= MAX_CMD_SIZE) aac8: 80 36 cpi r24, 0x60 ; 96 aaca: 91 05 cpc r25, r1 aacc: f8 f4 brcc .+62 ; 0xab0c return false; if (bufindr == bufindw && buflen > 0) aace: 40 91 38 12 lds r20, 0x1238 ; 0x801238 aad2: 50 91 39 12 lds r21, 0x1239 ; 0x801239 aad6: 20 91 49 10 lds r18, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> aada: 30 91 4a 10 lds r19, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> aade: 42 17 cp r20, r18 aae0: 53 07 cpc r21, r19 aae2: 39 f4 brne .+14 ; 0xaaf2 aae4: 60 91 3c 12 lds r22, 0x123C ; 0x80123c aae8: 70 91 3d 12 lds r23, 0x123D ; 0x80123d aaec: 16 16 cp r1, r22 aaee: 17 06 cpc r1, r23 aaf0: 6c f0 brlt .+26 ; 0xab0c // If there is some data stored starting at bufindw, len_asked is certainly smaller than // the allocated data buffer. Try to reserve a new buffer and to move the already received // serial data. // How much memory to reserve for the commands pushed to the front? // End of the queue, when pushing to the end. size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE); aaf2: b9 01 movw r22, r18 aaf4: 68 0f add r22, r24 aaf6: 79 1f adc r23, r25 aaf8: fb 01 movw r30, r22 aafa: e3 59 subi r30, 0x93 ; 147 aafc: ff 4f sbci r31, 0xFF ; 255 if (bufindw < bufindr) aafe: 24 17 cp r18, r20 ab00: 35 07 cpc r19, r21 ab02: 30 f4 brcc .+12 ; 0xab10 // Simple case. There is a contiguous space between the write buffer and the read buffer. return endw + CMDBUFFER_RESERVE_FRONT <= bufindr; ab04: 81 e0 ldi r24, 0x01 ; 1 ab06: 4e 17 cp r20, r30 ab08: 5f 07 cpc r21, r31 ab0a: 08 f4 brcc .+2 ; 0xab0e // with the interrupts disabled! static bool __attribute__((noinline)) cmdqueue_could_enqueue_back(size_t len_asked) { // MAX_CMD_SIZE has to accommodate the zero terminator. if (len_asked >= MAX_CMD_SIZE) return false; ab0c: 80 e0 ldi r24, 0x00 ; 0 // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { bufindw = 0; } return true; } return false; } ab0e: 08 95 ret size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE); if (bufindw < bufindr) // Simple case. There is a contiguous space between the write buffer and the read buffer. return endw + CMDBUFFER_RESERVE_FRONT <= bufindr; // Otherwise the free space is split between the start and end. if (// Could one fit to the end, including the reserve? ab10: ee 3e cpi r30, 0xEE ; 238 ab12: f1 40 sbci r31, 0x01 ; 1 ab14: f8 f0 brcs .+62 ; 0xab54 // If there is some data stored starting at bufindw, len_asked is certainly smaller than // the allocated data buffer. Try to reserve a new buffer and to move the already received // serial data. // How much memory to reserve for the commands pushed to the front? // End of the queue, when pushing to the end. size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE); ab16: 6c 5f subi r22, 0xFC ; 252 ab18: 7f 4f sbci r23, 0xFF ; 255 if (bufindw < bufindr) // Simple case. There is a contiguous space between the write buffer and the read buffer. return endw + CMDBUFFER_RESERVE_FRONT <= bufindr; // Otherwise the free space is split between the start and end. if (// Could one fit to the end, including the reserve? endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) || ab1a: 6e 3e cpi r22, 0xEE ; 238 ab1c: 71 40 sbci r23, 0x01 ; 1 ab1e: 18 f4 brcc .+6 ; 0xab26 // Could one fit to the end, and the reserve to the start? (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr)) ab20: 49 36 cpi r20, 0x69 ; 105 ab22: 51 05 cpc r21, r1 ab24: b8 f4 brcc .+46 ; 0xab54 return true; // Could one fit both to the start? if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) { ab26: 83 59 subi r24, 0x93 ; 147 ab28: 9f 4f sbci r25, 0xFF ; 255 ab2a: 48 17 cp r20, r24 ab2c: 59 07 cpc r21, r25 ab2e: 70 f3 brcs .-36 ; 0xab0c // Mark the rest of the buffer as used. memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw); ab30: 4d ee ldi r20, 0xED ; 237 ab32: 51 e0 ldi r21, 0x01 ; 1 ab34: 42 1b sub r20, r18 ab36: 53 0b sbc r21, r19 ab38: 70 e0 ldi r23, 0x00 ; 0 ab3a: 60 e0 ldi r22, 0x00 ; 0 ab3c: c9 01 movw r24, r18 ab3e: 85 5b subi r24, 0xB5 ; 181 ab40: 9f 4e sbci r25, 0xEF ; 239 ab42: 0f 94 12 aa call 0x35424 ; 0x35424 // and point to the start. // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { bufindw = 0; } ab46: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); ab48: f8 94 cli ab4a: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> ab4e: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; ab52: 8f bf out 0x3f, r24 ; 63 // Otherwise the free space is split between the start and end. if (// Could one fit to the end, including the reserve? endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) || // Could one fit to the end, and the reserve to the start? (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr)) return true; ab54: 81 e0 ldi r24, 0x01 ; 1 ab56: 08 95 ret 0000ab58 : // don't reverse this or there may be problems if the RX interrupt // occurs after reading the value of rx_buffer_head but before writing // the value to rx_buffer_tail; the previous value of rx_buffer_head // may be written to rx_buffer_tail, making it appear as if the buffer // were full, not empty. rx_buffer.head = rx_buffer.tail; ab58: 80 91 44 05 lds r24, 0x0544 ; 0x800544 ab5c: 90 91 45 05 lds r25, 0x0545 ; 0x800545 ab60: 90 93 43 05 sts 0x0543, r25 ; 0x800543 ab64: 80 93 42 05 sts 0x0542, r24 ; 0x800542 void FlushSerialRequestResend() { //char cmdbuffer[bufindr][100]="Resend:"; MYSERIAL.flush(); printf_P(_N("%S: %ld\n%S\n"), _n("Resend"), gcode_LastN + 1, MSG_OK); ab68: 80 ef ldi r24, 0xF0 ; 240 ab6a: 99 e6 ldi r25, 0x69 ; 105 ab6c: 9f 93 push r25 ab6e: 8f 93 push r24 ab70: 80 91 3e 12 lds r24, 0x123E ; 0x80123e ab74: 90 91 3f 12 lds r25, 0x123F ; 0x80123f ab78: a0 91 40 12 lds r26, 0x1240 ; 0x801240 ab7c: b0 91 41 12 lds r27, 0x1241 ; 0x801241 ab80: 01 96 adiw r24, 0x01 ; 1 ab82: a1 1d adc r26, r1 ab84: b1 1d adc r27, r1 ab86: bf 93 push r27 ab88: af 93 push r26 ab8a: 9f 93 push r25 ab8c: 8f 93 push r24 ab8e: 8b e4 ldi r24, 0x4B ; 75 ab90: 94 e6 ldi r25, 0x64 ; 100 ab92: 9f 93 push r25 ab94: 8f 93 push r24 ab96: 82 e5 ldi r24, 0x52 ; 82 ab98: 94 e6 ldi r25, 0x64 ; 100 ab9a: 9f 93 push r25 ab9c: 8f 93 push r24 ab9e: 0f 94 a2 a2 call 0x34544 ; 0x34544 aba2: 8d b7 in r24, 0x3d ; 61 aba4: 9e b7 in r25, 0x3e ; 62 aba6: 0a 96 adiw r24, 0x0a ; 10 aba8: 0f b6 in r0, 0x3f ; 63 abaa: f8 94 cli abac: 9e bf out 0x3e, r25 ; 62 abae: 0f be out 0x3f, r0 ; 63 abb0: 8d bf out 0x3d, r24 ; 61 } abb2: 08 95 ret 0000abb4 : bool __attribute__((noinline)) eeprom_is_sheet_initialized(uint8_t sheet_num) { return (eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base->s[sheet_num].z_offset))) != EEPROM_EMPTY_VALUE16); } bool __attribute__((noinline)) eeprom_is_initialized_block(const void *__p, size_t __n) { abb4: 0f 93 push r16 abb6: 1f 93 push r17 abb8: cf 93 push r28 abba: df 93 push r29 abbc: ec 01 movw r28, r24 abbe: c6 0f add r28, r22 abc0: d7 1f adc r29, r23 const uint8_t *p = (const uint8_t*)__p; while (__n--) { abc2: 8c 17 cp r24, r28 abc4: 9d 07 cpc r25, r29 abc6: 79 f0 breq .+30 ; 0xabe6 if (eeprom_read_byte(p++) != EEPROM_EMPTY_VALUE) abc8: 8c 01 movw r16, r24 abca: 0f 5f subi r16, 0xFF ; 255 abcc: 1f 4f sbci r17, 0xFF ; 255 abce: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 abd2: 8f 3f cpi r24, 0xFF ; 255 abd4: 31 f0 breq .+12 ; 0xabe2 return true; abd6: 81 e0 ldi r24, 0x01 ; 1 } return false; } abd8: df 91 pop r29 abda: cf 91 pop r28 abdc: 1f 91 pop r17 abde: 0f 91 pop r16 abe0: 08 95 ret bool __attribute__((noinline)) eeprom_is_initialized_block(const void *__p, size_t __n) { const uint8_t *p = (const uint8_t*)__p; while (__n--) { if (eeprom_read_byte(p++) != EEPROM_EMPTY_VALUE) abe2: c8 01 movw r24, r16 abe4: ee cf rjmp .-36 ; 0xabc2 return true; } return false; abe6: 80 e0 ldi r24, 0x00 ; 0 abe8: f7 cf rjmp .-18 ; 0xabd8 0000abea : #if defined(__cplusplus) } #endif // Return True if a character was found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } abea: 68 2f mov r22, r24 abec: 88 0f add r24, r24 abee: 77 0b sbc r23, r23 abf0: 80 91 38 12 lds r24, 0x1238 ; 0x801238 abf4: 90 91 39 12 lds r25, 0x1239 ; 0x801239 abf8: 82 5b subi r24, 0xB2 ; 178 abfa: 9f 4e sbci r25, 0xEF ; 239 abfc: 0f 94 37 aa call 0x3546e ; 0x3546e ac00: 9c 01 movw r18, r24 ac02: 90 93 bc 04 sts 0x04BC, r25 ; 0x8004bc ac06: 80 93 bb 04 sts 0x04BB, r24 ; 0x8004bb ac0a: 81 e0 ldi r24, 0x01 ; 1 ac0c: 23 2b or r18, r19 ac0e: 09 f4 brne .+2 ; 0xac12 ac10: 80 e0 ldi r24, 0x00 ; 0 ac12: 08 95 ret 0000ac14 : static inline bool code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; } static inline float code_value() { return strtod_noE(strchr_pointer+1, NULL);} static inline long code_value_long() { return strtol(strchr_pointer+1, NULL, 10); } static inline int16_t code_value_short() { return int16_t(strtol(strchr_pointer+1, NULL, 10)); }; static inline uint8_t code_value_uint8() { return uint8_t(strtol(strchr_pointer+1, NULL, 10)); }; ac14: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb ac18: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc ac1c: 4a e0 ldi r20, 0x0A ; 10 ac1e: 50 e0 ldi r21, 0x00 ; 0 ac20: 70 e0 ldi r23, 0x00 ; 0 ac22: 60 e0 ldi r22, 0x00 ; 0 ac24: 01 96 adiw r24, 0x01 ; 1 ac26: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 ac2a: 86 2f mov r24, r22 ac2c: 08 95 ret 0000ac2e : // Return True if a character was found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } static inline bool code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; } static inline float code_value() { return strtod_noE(strchr_pointer+1, NULL);} static inline long code_value_long() { return strtol(strchr_pointer+1, NULL, 10); } static inline int16_t code_value_short() { return int16_t(strtol(strchr_pointer+1, NULL, 10)); }; ac2e: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb ac32: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc ac36: 4a e0 ldi r20, 0x0A ; 10 ac38: 50 e0 ldi r21, 0x00 ; 0 ac3a: 70 e0 ldi r23, 0x00 ; 0 ac3c: 60 e0 ldi r22, 0x00 ; 0 ac3e: 01 96 adiw r24, 0x01 ; 1 ac40: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 ac44: cb 01 movw r24, r22 ac46: 08 95 ret 0000ac48 : #endif babystep_apply(); // Apply Z height correction aka baby stepping before mesh bed leveing gets activated. { // Apply the bed level correction to the mesh bool eeprom_bed_correction_valid = eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1; auto bedCorrectHelper = [eeprom_bed_correction_valid] (char code, uint8_t *eep_address) -> int8_t { ac48: 0f 93 push r16 ac4a: 1f 93 push r17 ac4c: cf 93 push r28 ac4e: df 93 push r29 ac50: 8c 01 movw r16, r24 ac52: 86 2f mov r24, r22 ac54: ea 01 movw r28, r20 if (code_seen(code)) { ac56: 0e 94 f5 55 call 0xabea ; 0xabea ac5a: 88 23 and r24, r24 ac5c: 19 f1 breq .+70 ; 0xaca4 // Verify value is within allowed range int16_t temp = code_value_short(); ac5e: 0e 94 17 56 call 0xac2e ; 0xac2e if (abs(temp) > BED_ADJUSTMENT_UM_MAX) { ac62: 9c 01 movw r18, r24 ac64: 97 ff sbrs r25, 7 ac66: 03 c0 rjmp .+6 ; 0xac6e ac68: 31 95 neg r19 ac6a: 21 95 neg r18 ac6c: 31 09 sbc r19, r1 ac6e: 25 36 cpi r18, 0x65 ; 101 ac70: 31 05 cpc r19, r1 ac72: 9c f0 brlt .+38 ; 0xac9a printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp); ac74: 9f 93 push r25 ac76: 8f 93 push r24 ac78: 81 eb ldi r24, 0xB1 ; 177 ac7a: 91 ea ldi r25, 0xA1 ; 161 ac7c: 9f 93 push r25 ac7e: 8f 93 push r24 ac80: 8d ec ldi r24, 0xCD ; 205 ac82: 96 e7 ldi r25, 0x76 ; 118 ac84: 9f 93 push r25 ac86: 8f 93 push r24 ac88: 0f 94 a2 a2 call 0x34544 ; 0x34544 ac8c: 0f 90 pop r0 ac8e: 0f 90 pop r0 ac90: 0f 90 pop r0 ac92: 0f 90 pop r0 ac94: 0f 90 pop r0 ac96: 0f 90 pop r0 return (int8_t)temp; // Value is valid, use it } } else if (eeprom_bed_correction_valid) { return (int8_t)eeprom_read_byte(eep_address); } return 0; ac98: 80 e0 ldi r24, 0x00 ; 0 }; ac9a: df 91 pop r29 ac9c: cf 91 pop r28 ac9e: 1f 91 pop r17 aca0: 0f 91 pop r16 aca2: 08 95 ret if (abs(temp) > BED_ADJUSTMENT_UM_MAX) { printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp); } else { return (int8_t)temp; // Value is valid, use it } } else if (eeprom_bed_correction_valid) { aca4: f8 01 movw r30, r16 aca6: 80 81 ld r24, Z aca8: 88 23 and r24, r24 acaa: b1 f3 breq .-20 ; 0xac98 return (int8_t)eeprom_read_byte(eep_address); acac: ce 01 movw r24, r28 } return 0; }; acae: df 91 pop r29 acb0: cf 91 pop r28 acb2: 1f 91 pop r17 acb4: 0f 91 pop r16 printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp); } else { return (int8_t)temp; // Value is valid, use it } } else if (eeprom_bed_correction_valid) { return (int8_t)eeprom_read_byte(eep_address); acb6: 0d 94 e0 a3 jmp 0x347c0 ; 0x347c0 0000acba : // Return True if a character was found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } static inline bool code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; } static inline float code_value() { return strtod_noE(strchr_pointer+1, NULL);} static inline long code_value_long() { return strtol(strchr_pointer+1, NULL, 10); } acba: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb acbe: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc acc2: 4a e0 ldi r20, 0x0A ; 10 acc4: 50 e0 ldi r21, 0x00 ; 0 acc6: 70 e0 ldi r23, 0x00 ; 0 acc8: 60 e0 ldi r22, 0x00 ; 0 acca: 01 96 adiw r24, 0x01 ; 1 accc: 0d 94 6b 9f jmp 0x33ed6 ; 0x33ed6 0000acd0 : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); acd0: 60 e0 ldi r22, 0x00 ; 0 acd2: 86 e6 ldi r24, 0x66 ; 102 acd4: 9f e0 ldi r25, 0x0F ; 15 acd6: 0f 94 04 a4 call 0x34808 ; 0x34808 acda: 60 e0 ldi r22, 0x00 ; 0 acdc: 88 e6 ldi r24, 0x68 ; 104 acde: 9f e0 ldi r25, 0x0F ; 15 ace0: 0f 94 04 a4 call 0x34808 ; 0x34808 ace4: 60 e0 ldi r22, 0x00 ; 0 ace6: 85 e6 ldi r24, 0x65 ; 101 ace8: 9f e0 ldi r25, 0x0F ; 15 acea: 0f 94 04 a4 call 0x34808 ; 0x34808 acee: 60 e0 ldi r22, 0x00 ; 0 acf0: 84 e6 ldi r24, 0x64 ; 100 acf2: 9f e0 ldi r25, 0x0F ; 15 acf4: 0f 94 04 a4 call 0x34808 ; 0x34808 acf8: 60 e0 ldi r22, 0x00 ; 0 acfa: 82 ed ldi r24, 0xD2 ; 210 acfc: 9e e0 ldi r25, 0x0E ; 14 acfe: 0f 94 04 a4 call 0x34808 ; 0x34808 ad02: 60 e0 ldi r22, 0x00 ; 0 ad04: 8f ec ldi r24, 0xCF ; 207 ad06: 9e e0 ldi r25, 0x0E ; 14 ad08: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0000ad0c : //we have no temp compensation data } } #endif //ndef PINDA_THERMISTOR float temp_comp_interpolation(float inp_temperature) { ad0c: 2f 92 push r2 ad0e: 3f 92 push r3 ad10: 4f 92 push r4 ad12: 5f 92 push r5 ad14: 6f 92 push r6 ad16: 7f 92 push r7 ad18: 8f 92 push r8 ad1a: 9f 92 push r9 ad1c: af 92 push r10 ad1e: bf 92 push r11 ad20: cf 92 push r12 ad22: df 92 push r13 ad24: ef 92 push r14 ad26: ff 92 push r15 ad28: 0f 93 push r16 ad2a: 1f 93 push r17 ad2c: cf 93 push r28 ad2e: df 93 push r29 ad30: cd b7 in r28, 0x3d ; 61 ad32: de b7 in r29, 0x3e ; 62 ad34: cc 58 subi r28, 0x8C ; 140 ad36: d2 40 sbci r29, 0x02 ; 2 ad38: 0f b6 in r0, 0x3f ; 63 ad3a: f8 94 cli ad3c: de bf out 0x3e, r29 ; 62 ad3e: 0f be out 0x3f, r0 ; 63 ad40: cd bf out 0x3d, r28 ; 61 ad42: cb 58 subi r28, 0x8B ; 139 ad44: dd 4f sbci r29, 0xFD ; 253 ad46: 68 83 st Y, r22 ad48: 79 83 std Y+1, r23 ; 0x01 ad4a: 8a 83 std Y+2, r24 ; 0x02 ad4c: 9b 83 std Y+3, r25 ; 0x03 ad4e: c5 57 subi r28, 0x75 ; 117 ad50: d2 40 sbci r29, 0x02 ; 2 //cubic spline interpolation int n, i, j; float h[10], a, b, c, d, sum, s[10] = { 0 }, x[10], F[10], f[10], m[10][10] = { 0 }, temp; ad52: fe 01 movw r30, r28 ad54: e7 54 subi r30, 0x47 ; 71 ad56: fe 4f sbci r31, 0xFE ; 254 ad58: 88 e2 ldi r24, 0x28 ; 40 ad5a: df 01 movw r26, r30 ad5c: 1d 92 st X+, r1 ad5e: 8a 95 dec r24 ad60: e9 f7 brne .-6 ; 0xad5c ad62: e8 5b subi r30, 0xB8 ; 184 ad64: f1 40 sbci r31, 0x01 ; 1 ad66: 1f 01 movw r2, r30 ad68: 80 e9 ldi r24, 0x90 ; 144 ad6a: 91 e0 ldi r25, 0x01 ; 1 ad6c: df 01 movw r26, r30 ad6e: fc 01 movw r30, r24 ad70: 1d 92 st X+, r1 ad72: 31 97 sbiw r30, 0x01 ; 1 ad74: e9 f7 brne .-6 ; 0xad70 int shift[10]; int temp_C[10]; n = 6; //number of measured points shift[0] = 0; ad76: c7 5a subi r28, 0xA7 ; 167 ad78: dd 4f sbci r29, 0xFD ; 253 ad7a: 19 82 std Y+1, r1 ; 0x01 ad7c: 18 82 st Y, r1 ad7e: c9 55 subi r28, 0x59 ; 89 ad80: d2 40 sbci r29, 0x02 ; 2 ad82: 9e 01 movw r18, r28 ad84: 2f 51 subi r18, 0x1F ; 31 ad86: 3e 4f sbci r19, 0xFE ; 254 ad88: c1 59 subi r28, 0x91 ; 145 ad8a: dd 4f sbci r29, 0xFD ; 253 ad8c: 39 83 std Y+1, r19 ; 0x01 ad8e: 28 83 st Y, r18 ad90: cf 56 subi r28, 0x6F ; 111 ad92: d2 40 sbci r29, 0x02 ; 2 ad94: 8e 01 movw r16, r28 ad96: 07 5a subi r16, 0xA7 ; 167 ad98: 1d 4f sbci r17, 0xFD ; 253 ad9a: ce 01 movw r24, r28 ad9c: 8f 5c subi r24, 0xCF ; 207 ad9e: 9d 4f sbci r25, 0xFD ; 253 ada0: c3 59 subi r28, 0x93 ; 147 ada2: dd 4f sbci r29, 0xFD ; 253 ada4: 99 83 std Y+1, r25 ; 0x01 ada6: 88 83 st Y, r24 ada8: cd 56 subi r28, 0x6D ; 109 adaa: d2 40 sbci r29, 0x02 ; 2 adac: 3c 01 movw r6, r24 adae: 49 01 movw r8, r18 adb0: 40 eb ldi r20, 0xB0 ; 176 adb2: a4 2e mov r10, r20 adb4: 4f e0 ldi r20, 0x0F ; 15 adb6: b4 2e mov r11, r20 adb8: 53 e2 ldi r21, 0x23 ; 35 adba: c5 2e mov r12, r21 adbc: d1 2c mov r13, r1 for (i = 0; i < n; i++) { adbe: f1 2c mov r15, r1 adc0: e1 2c mov r14, r1 static_assert(start_compensating_temp >= PINDA_MINTEMP, "Temperature compensation start point is lower than PINDA_MINTEMP."); #endif //SUPERPINDA_SUPPORT #else temp_C[i] = 50 + i * 10; //temperature in C #endif x[i] = (float)temp_C[i]; adc2: b6 01 movw r22, r12 adc4: 0d 2c mov r0, r13 adc6: 00 0c add r0, r0 adc8: 88 0b sbc r24, r24 adca: 99 0b sbc r25, r25 adcc: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> add0: d4 01 movw r26, r8 add2: 6d 93 st X+, r22 add4: 7d 93 st X+, r23 add6: 8d 93 st X+, r24 add8: 9d 93 st X+, r25 adda: 4d 01 movw r8, r26 f[i] = (float)shift[i]; addc: f8 01 movw r30, r16 adde: 61 91 ld r22, Z+ ade0: 71 91 ld r23, Z+ ade2: 8f 01 movw r16, r30 ade4: 07 2e mov r0, r23 ade6: 00 0c add r0, r0 ade8: 88 0b sbc r24, r24 adea: 99 0b sbc r25, r25 adec: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> adf0: d3 01 movw r26, r6 adf2: 6d 93 st X+, r22 adf4: 7d 93 st X+, r23 adf6: 8d 93 st X+, r24 adf8: 9d 93 st X+, r25 adfa: 3d 01 movw r6, r26 int temp_C[10]; n = 6; //number of measured points shift[0] = 0; for (i = 0; i < n; i++) { adfc: bf ef ldi r27, 0xFF ; 255 adfe: eb 1a sub r14, r27 ae00: fb 0a sbc r15, r27 ae02: e6 e0 ldi r30, 0x06 ; 6 ae04: ee 16 cp r14, r30 ae06: f1 04 cpc r15, r1 ae08: 09 f0 breq .+2 ; 0xae0c ae0a: 38 c3 rjmp .+1648 ; 0xb47c temp_C[i] = 50 + i * 10; //temperature in C #endif x[i] = (float)temp_C[i]; f[i] = (float)shift[i]; } if (inp_temperature < x[0]) return 0; ae0c: cb 58 subi r28, 0x8B ; 139 ae0e: dd 4f sbci r29, 0xFD ; 253 ae10: 28 81 ld r18, Y ae12: 39 81 ldd r19, Y+1 ; 0x01 ae14: 4a 81 ldd r20, Y+2 ; 0x02 ae16: 5b 81 ldd r21, Y+3 ; 0x03 ae18: c5 57 subi r28, 0x75 ; 117 ae1a: d2 40 sbci r29, 0x02 ; 2 ae1c: c1 59 subi r28, 0x91 ; 145 ae1e: dd 4f sbci r29, 0xFD ; 253 ae20: a8 81 ld r26, Y ae22: b9 81 ldd r27, Y+1 ; 0x01 ae24: cf 56 subi r28, 0x6F ; 111 ae26: d2 40 sbci r29, 0x02 ; 2 ae28: 6d 91 ld r22, X+ ae2a: 7d 91 ld r23, X+ ae2c: 8d 91 ld r24, X+ ae2e: 9c 91 ld r25, X ae30: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> ae34: 41 2c mov r4, r1 ae36: 51 2c mov r5, r1 ae38: 32 01 movw r6, r4 ae3a: 18 16 cp r1, r24 ae3c: 0c f4 brge .+2 ; 0xae40 ae3e: 02 c3 rjmp .+1540 ; 0xb444 ae40: c3 59 subi r28, 0x93 ; 147 ae42: dd 4f sbci r29, 0xFD ; 253 ae44: 08 81 ld r16, Y ae46: 19 81 ldd r17, Y+1 ; 0x01 ae48: cd 56 subi r28, 0x6D ; 109 ae4a: d2 40 sbci r29, 0x02 ; 2 ae4c: 0c 5e subi r16, 0xEC ; 236 ae4e: 1f 4f sbci r17, 0xFF ; 255 ae50: c1 59 subi r28, 0x91 ; 145 ae52: dd 4f sbci r29, 0xFD ; 253 ae54: e8 80 ld r14, Y ae56: f9 80 ldd r15, Y+1 ; 0x01 ae58: cf 56 subi r28, 0x6F ; 111 ae5a: d2 40 sbci r29, 0x02 ; 2 ae5c: b4 e1 ldi r27, 0x14 ; 20 ae5e: eb 0e add r14, r27 ae60: f1 1c adc r15, r1 ae62: 6e 01 movw r12, r28 ae64: ef ed ldi r30, 0xDF ; 223 ae66: ce 1a sub r12, r30 ae68: ed ef ldi r30, 0xFD ; 253 ae6a: de 0a sbc r13, r30 ae6c: 9e 01 movw r18, r28 ae6e: 2b 55 subi r18, 0x5B ; 91 ae70: 3e 4f sbci r19, 0xFE ; 254 ae72: cf 58 subi r28, 0x8F ; 143 ae74: dd 4f sbci r29, 0xFD ; 253 ae76: 39 83 std Y+1, r19 ; 0x01 ae78: 28 83 st Y, r18 ae7a: c1 57 subi r28, 0x71 ; 113 ae7c: d2 40 sbci r29, 0x02 ; 2 for (i = n - 1; i>0; i--) { F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]); ae7e: d8 01 movw r26, r16 ae80: 4d 90 ld r4, X+ ae82: 5d 90 ld r5, X+ ae84: 6d 90 ld r6, X+ ae86: 7c 90 ld r7, X ae88: f7 01 movw r30, r14 ae8a: 60 81 ld r22, Z ae8c: 71 81 ldd r23, Z+1 ; 0x01 ae8e: 82 81 ldd r24, Z+2 ; 0x02 ae90: 93 81 ldd r25, Z+3 ; 0x03 ae92: d7 01 movw r26, r14 ae94: 5e 91 ld r21, -X ae96: 4e 91 ld r20, -X ae98: 3e 91 ld r19, -X ae9a: 2e 91 ld r18, -X ae9c: 7d 01 movw r14, r26 ae9e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> aea2: 4b 01 movw r8, r22 aea4: 5c 01 movw r10, r24 aea6: f8 01 movw r30, r16 aea8: 52 91 ld r21, -Z aeaa: 42 91 ld r20, -Z aeac: 32 91 ld r19, -Z aeae: 22 91 ld r18, -Z aeb0: 8f 01 movw r16, r30 aeb2: c3 01 movw r24, r6 aeb4: b2 01 movw r22, r4 aeb6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> aeba: a5 01 movw r20, r10 aebc: 94 01 movw r18, r8 aebe: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> aec2: d6 01 movw r26, r12 aec4: 9e 93 st -X, r25 aec6: 8e 93 st -X, r24 aec8: 7e 93 st -X, r23 aeca: 6e 93 st -X, r22 aecc: 6d 01 movw r12, r26 h[i - 1] = x[i] - x[i - 1]; aece: cf 58 subi r28, 0x8F ; 143 aed0: dd 4f sbci r29, 0xFD ; 253 aed2: e8 81 ld r30, Y aed4: f9 81 ldd r31, Y+1 ; 0x01 aed6: c1 57 subi r28, 0x71 ; 113 aed8: d2 40 sbci r29, 0x02 ; 2 aeda: b2 92 st -Z, r11 aedc: a2 92 st -Z, r10 aede: 92 92 st -Z, r9 aee0: 82 92 st -Z, r8 aee2: cf 58 subi r28, 0x8F ; 143 aee4: dd 4f sbci r29, 0xFD ; 253 aee6: f9 83 std Y+1, r31 ; 0x01 aee8: e8 83 st Y, r30 aeea: c1 57 subi r28, 0x71 ; 113 aeec: d2 40 sbci r29, 0x02 ; 2 f[i] = (float)shift[i]; } if (inp_temperature < x[0]) return 0; for (i = n - 1; i>0; i--) { aeee: c3 59 subi r28, 0x93 ; 147 aef0: dd 4f sbci r29, 0xFD ; 253 aef2: 28 81 ld r18, Y aef4: 39 81 ldd r19, Y+1 ; 0x01 aef6: cd 56 subi r28, 0x6D ; 109 aef8: d2 40 sbci r29, 0x02 ; 2 aefa: 02 17 cp r16, r18 aefc: 13 07 cpc r17, r19 aefe: 09 f0 breq .+2 ; 0xaf02 af00: be cf rjmp .-132 ; 0xae7e af02: 4e 01 movw r8, r28 af04: 3f e6 ldi r19, 0x6F ; 111 af06: 83 1a sub r8, r19 af08: 3e ef ldi r19, 0xFE ; 254 af0a: 93 0a sbc r9, r19 af0c: 5e 01 movw r10, r28 af0e: 83 ef ldi r24, 0xF3 ; 243 af10: a8 1a sub r10, r24 af12: 8d ef ldi r24, 0xFD ; 253 af14: b8 0a sbc r11, r24 af16: 61 01 movw r12, r2 af18: 81 01 movw r16, r2 F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]); h[i - 1] = x[i] - x[i - 1]; } //*********** formation of h, s , f matrix ************** for (i = 1; i af3c: 9b 01 movw r18, r22 af3e: ac 01 movw r20, r24 af40: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> af44: f8 01 movw r30, r16 af46: 64 a7 std Z+44, r22 ; 0x2c af48: 75 a7 std Z+45, r23 ; 0x2d af4a: 86 a7 std Z+46, r24 ; 0x2e af4c: 97 a7 std Z+47, r25 ; 0x2f if (i != 1) { af4e: f1 e0 ldi r31, 0x01 ; 1 af50: ef 16 cp r14, r31 af52: f1 04 cpc r15, r1 af54: 61 f0 breq .+24 ; 0xaf6e m[i][i - 1] = h[i - 1]; af56: d8 01 movw r26, r16 af58: 98 96 adiw r26, 0x28 ; 40 af5a: 4d 92 st X+, r4 af5c: 5d 92 st X+, r5 af5e: 6d 92 st X+, r6 af60: 7c 92 st X, r7 af62: 9b 97 sbiw r26, 0x2b ; 43 m[i - 1][i] = h[i - 1]; af64: f8 01 movw r30, r16 af66: 44 82 std Z+4, r4 ; 0x04 af68: 55 82 std Z+5, r5 ; 0x05 af6a: 66 82 std Z+6, r6 ; 0x06 af6c: 77 82 std Z+7, r7 ; 0x07 } m[i][n - 1] = 6 * (F[i + 1] - F[i]); af6e: ff ef ldi r31, 0xFF ; 255 af70: ef 1a sub r14, r31 af72: ff 0a sbc r15, r31 af74: f5 01 movw r30, r10 af76: 20 81 ld r18, Z af78: 31 81 ldd r19, Z+1 ; 0x01 af7a: 42 81 ldd r20, Z+2 ; 0x02 af7c: 53 81 ldd r21, Z+3 ; 0x03 af7e: 84 e0 ldi r24, 0x04 ; 4 af80: a8 0e add r10, r24 af82: b1 1c adc r11, r1 af84: 64 81 ldd r22, Z+4 ; 0x04 af86: 75 81 ldd r23, Z+5 ; 0x05 af88: 86 81 ldd r24, Z+6 ; 0x06 af8a: 97 81 ldd r25, Z+7 ; 0x07 af8c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> af90: 20 e0 ldi r18, 0x00 ; 0 af92: 30 e0 ldi r19, 0x00 ; 0 af94: 40 ec ldi r20, 0xC0 ; 192 af96: 50 e4 ldi r21, 0x40 ; 64 af98: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> af9c: d6 01 movw r26, r12 af9e: dc 96 adiw r26, 0x3c ; 60 afa0: 6d 93 st X+, r22 afa2: 7d 93 st X+, r23 afa4: 8d 93 st X+, r24 afa6: 9c 93 st X, r25 afa8: df 97 sbiw r26, 0x3f ; 63 afaa: 04 5d subi r16, 0xD4 ; 212 afac: 1f 4f sbci r17, 0xFF ; 255 afae: b8 e2 ldi r27, 0x28 ; 40 afb0: cb 0e add r12, r27 afb2: d1 1c adc r13, r1 for (i = n - 1; i>0; i--) { F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]); h[i - 1] = x[i] - x[i - 1]; } //*********** formation of h, s , f matrix ************** for (i = 1; i afbc: b1 cf rjmp .-158 ; 0xaf20 afbe: 7e 01 movw r14, r28 afc0: fd e2 ldi r31, 0x2D ; 45 afc2: ef 0e add r14, r31 afc4: f1 1c adc r15, r1 afc6: 28 e2 ldi r18, 0x28 ; 40 afc8: a2 2e mov r10, r18 afca: b1 2c mov r11, r1 afcc: 00 eb ldi r16, 0xB0 ; 176 afce: 1f ef ldi r17, 0xFF ; 255 afd0: 24 e0 ldi r18, 0x04 ; 4 afd2: 22 0e add r2, r18 afd4: 31 1c adc r3, r1 } m[i][n - 1] = 6 * (F[i + 1] - F[i]); } //*********** forward elimination ************** for (i = 1; i aff2: 2b 01 movw r4, r22 aff4: 3c 01 movw r6, r24 aff6: 61 01 movw r12, r2 aff8: c0 1a sub r12, r16 affa: d1 0a sbc r13, r17 for (j = 1; j <= n - 1; j++) affc: 88 24 eor r8, r8 affe: 83 94 inc r8 b000: 91 2c mov r9, r1 m[i + 1][j] -= temp*m[i][j]; b002: f6 01 movw r30, r12 b004: e0 0f add r30, r16 b006: f1 1f adc r31, r17 b008: ea 0d add r30, r10 b00a: fb 1d adc r31, r11 b00c: 20 81 ld r18, Z b00e: 31 81 ldd r19, Z+1 ; 0x01 b010: 42 81 ldd r20, Z+2 ; 0x02 b012: 53 81 ldd r21, Z+3 ; 0x03 b014: c3 01 movw r24, r6 b016: b2 01 movw r22, r4 b018: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b01c: 9b 01 movw r18, r22 b01e: ac 01 movw r20, r24 b020: f6 01 movw r30, r12 b022: 60 81 ld r22, Z b024: 71 81 ldd r23, Z+1 ; 0x01 b026: 82 81 ldd r24, Z+2 ; 0x02 b028: 93 81 ldd r25, Z+3 ; 0x03 b02a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b02e: d6 01 movw r26, r12 b030: 6d 93 st X+, r22 b032: 7d 93 st X+, r23 b034: 8d 93 st X+, r24 b036: 9d 93 st X+, r25 b038: 6d 01 movw r12, r26 m[i][n - 1] = 6 * (F[i + 1] - F[i]); } //*********** forward elimination ************** for (i = 1; i b048: 3c e2 ldi r19, 0x2C ; 44 b04a: e3 0e add r14, r19 b04c: f1 1c adc r15, r1 b04e: 08 52 subi r16, 0x28 ; 40 b050: 11 09 sbc r17, r1 b052: 88 e2 ldi r24, 0x28 ; 40 b054: a8 0e add r10, r24 b056: b1 1c adc r11, r1 m[i - 1][i] = h[i - 1]; } m[i][n - 1] = 6 * (F[i + 1] - F[i]); } //*********** forward elimination ************** for (i = 1; i b060: ba cf rjmp .-140 ; 0xafd6 b062: 1e 01 movw r2, r28 b064: f5 eb ldi r31, 0xB5 ; 181 b066: 2f 0e add r2, r31 b068: 31 1c adc r3, r1 b06a: 6e 01 movw r12, r28 b06c: 21 eb ldi r18, 0xB1 ; 177 b06e: c2 0e add r12, r18 b070: d1 1c adc r13, r1 b072: 7e 01 movw r14, r28 b074: 37 e3 ldi r19, 0x37 ; 55 b076: e3 1a sub r14, r19 b078: 3e ef ldi r19, 0xFE ; 254 b07a: f3 0a sbc r15, r19 temp = (m[i + 1][i] / m[i][i]); for (j = 1; j <= n - 1; j++) m[i + 1][j] -= temp*m[i][j]; } //*********** backward substitution ********* for (i = n - 2; i>0; i--) { b07c: 04 e0 ldi r16, 0x04 ; 4 b07e: 10 e0 ldi r17, 0x00 ; 0 b080: 48 01 movw r8, r16 b082: b1 2c mov r11, r1 b084: a1 2c mov r10, r1 sum = 0; b086: 41 2c mov r4, r1 b088: 51 2c mov r5, r1 b08a: 32 01 movw r6, r4 for (j = i; j <= n - 2; j++) sum += m[i][j] * s[j]; b08c: f6 01 movw r30, r12 b08e: ea 0d add r30, r10 b090: fb 1d adc r31, r11 b092: d7 01 movw r26, r14 b094: aa 0d add r26, r10 b096: bb 1d adc r27, r11 b098: 2d 91 ld r18, X+ b09a: 3d 91 ld r19, X+ b09c: 4d 91 ld r20, X+ b09e: 5c 91 ld r21, X b0a0: 60 81 ld r22, Z b0a2: 71 81 ldd r23, Z+1 ; 0x01 b0a4: 82 81 ldd r24, Z+2 ; 0x02 b0a6: 93 81 ldd r25, Z+3 ; 0x03 b0a8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b0ac: 9b 01 movw r18, r22 b0ae: ac 01 movw r20, r24 b0b0: c3 01 movw r24, r6 b0b2: b2 01 movw r22, r4 b0b4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b0b8: 2b 01 movw r4, r22 b0ba: 3c 01 movw r6, r24 m[i + 1][j] -= temp*m[i][j]; } //*********** backward substitution ********* for (i = n - 2; i>0; i--) { sum = 0; for (j = i; j <= n - 2; j++) b0bc: 8f ef ldi r24, 0xFF ; 255 b0be: 88 1a sub r8, r24 b0c0: 98 0a sbc r9, r24 b0c2: 94 e0 ldi r25, 0x04 ; 4 b0c4: a9 0e add r10, r25 b0c6: b1 1c adc r11, r1 b0c8: a5 e0 ldi r26, 0x05 ; 5 b0ca: 8a 16 cp r8, r26 b0cc: 91 04 cpc r9, r1 b0ce: f1 f6 brne .-68 ; 0xb08c sum += m[i][j] * s[j]; s[i] = (m[i][n - 1] - sum) / m[i][i]; b0d0: a3 01 movw r20, r6 b0d2: 92 01 movw r18, r4 b0d4: f1 01 movw r30, r2 b0d6: 60 81 ld r22, Z b0d8: 71 81 ldd r23, Z+1 ; 0x01 b0da: 82 81 ldd r24, Z+2 ; 0x02 b0dc: 93 81 ldd r25, Z+3 ; 0x03 b0de: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b0e2: d6 01 movw r26, r12 b0e4: 2d 91 ld r18, X+ b0e6: 3d 91 ld r19, X+ b0e8: 4d 91 ld r20, X+ b0ea: 5c 91 ld r21, X b0ec: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> b0f0: f7 01 movw r30, r14 b0f2: 60 83 st Z, r22 b0f4: 71 83 std Z+1, r23 ; 0x01 b0f6: 82 83 std Z+2, r24 ; 0x02 b0f8: 93 83 std Z+3, r25 ; 0x03 temp = (m[i + 1][i] / m[i][i]); for (j = 1; j <= n - 1; j++) m[i + 1][j] -= temp*m[i][j]; } //*********** backward substitution ********* for (i = n - 2; i>0; i--) { b0fa: 01 50 subi r16, 0x01 ; 1 b0fc: 11 09 sbc r17, r1 b0fe: f8 e2 ldi r31, 0x28 ; 40 b100: 2f 1a sub r2, r31 b102: 31 08 sbc r3, r1 b104: 2c e2 ldi r18, 0x2C ; 44 b106: c2 1a sub r12, r18 b108: d1 08 sbc r13, r1 b10a: 34 e0 ldi r19, 0x04 ; 4 b10c: e3 1a sub r14, r19 b10e: f1 08 sbc r15, r1 b110: 01 15 cp r16, r1 b112: 11 05 cpc r17, r1 b114: 09 f0 breq .+2 ; 0xb118 b116: b4 cf rjmp .-152 ; 0xb080 sum += m[i][j] * s[j]; s[i] = (m[i][n - 1] - sum) / m[i][i]; } for (i = 0; i x[i + 1])) { b118: cb 50 subi r28, 0x0B ; 11 b11a: de 4f sbci r29, 0xFE ; 254 b11c: 88 81 ld r24, Y b11e: 99 81 ldd r25, Y+1 ; 0x01 b120: aa 81 ldd r26, Y+2 ; 0x02 b122: bb 81 ldd r27, Y+3 ; 0x03 b124: c5 5f subi r28, 0xF5 ; 245 b126: d1 40 sbci r29, 0x01 ; 1 b128: cf 57 subi r28, 0x7F ; 127 b12a: dd 4f sbci r29, 0xFD ; 253 b12c: 88 83 st Y, r24 b12e: 99 83 std Y+1, r25 ; 0x01 b130: aa 83 std Y+2, r26 ; 0x02 b132: bb 83 std Y+3, r27 ; 0x03 b134: c1 58 subi r28, 0x81 ; 129 b136: d2 40 sbci r29, 0x02 ; 2 b138: 1e 01 movw r2, r28 b13a: 97 e4 ldi r25, 0x47 ; 71 b13c: 29 1a sub r2, r25 b13e: 9e ef ldi r25, 0xFE ; 254 b140: 39 0a sbc r3, r25 b142: 10 e0 ldi r17, 0x00 ; 0 b144: 00 e0 ldi r16, 0x00 ; 0 b146: c1 59 subi r28, 0x91 ; 145 b148: dd 4f sbci r29, 0xFD ; 253 b14a: a8 81 ld r26, Y b14c: b9 81 ldd r27, Y+1 ; 0x01 b14e: cf 56 subi r28, 0x6F ; 111 b150: d2 40 sbci r29, 0x02 ; 2 b152: cd 90 ld r12, X+ b154: dd 90 ld r13, X+ b156: ed 90 ld r14, X+ b158: fd 90 ld r15, X+ b15a: c1 59 subi r28, 0x91 ; 145 b15c: dd 4f sbci r29, 0xFD ; 253 b15e: b9 83 std Y+1, r27 ; 0x01 b160: a8 83 st Y, r26 b162: cf 56 subi r28, 0x6F ; 111 b164: d2 40 sbci r29, 0x02 ; 2 b166: cb 58 subi r28, 0x8B ; 139 b168: dd 4f sbci r29, 0xFD ; 253 b16a: 28 81 ld r18, Y b16c: 39 81 ldd r19, Y+1 ; 0x01 b16e: 4a 81 ldd r20, Y+2 ; 0x02 b170: 5b 81 ldd r21, Y+3 ; 0x03 b172: c5 57 subi r28, 0x75 ; 117 b174: d2 40 sbci r29, 0x02 ; 2 b176: c7 01 movw r24, r14 b178: b6 01 movw r22, r12 b17a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b17e: 18 16 cp r1, r24 b180: b4 f0 brlt .+44 ; 0xb1ae b182: cb 58 subi r28, 0x8B ; 139 b184: dd 4f sbci r29, 0xFD ; 253 b186: 28 81 ld r18, Y b188: 39 81 ldd r19, Y+1 ; 0x01 b18a: 4a 81 ldd r20, Y+2 ; 0x02 b18c: 5b 81 ldd r21, Y+3 ; 0x03 b18e: c5 57 subi r28, 0x75 ; 117 b190: d2 40 sbci r29, 0x02 ; 2 b192: c1 59 subi r28, 0x91 ; 145 b194: dd 4f sbci r29, 0xFD ; 253 b196: e8 81 ld r30, Y b198: f9 81 ldd r31, Y+1 ; 0x01 b19a: cf 56 subi r28, 0x6F ; 111 b19c: d2 40 sbci r29, 0x02 ; 2 b19e: 60 81 ld r22, Z b1a0: 71 81 ldd r23, Z+1 ; 0x01 b1a2: 82 81 ldd r24, Z+2 ; 0x02 b1a4: 93 81 ldd r25, Z+3 ; 0x03 b1a6: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> b1aa: 87 ff sbrs r24, 7 b1ac: 18 c0 rjmp .+48 ; 0xb1de b1ae: 04 30 cpi r16, 0x04 ; 4 b1b0: 11 05 cpc r17, r1 b1b2: 09 f0 breq .+2 ; 0xb1b6 b1b4: 30 c1 rjmp .+608 ; 0xb416 b1b6: cb 58 subi r28, 0x8B ; 139 b1b8: dd 4f sbci r29, 0xFD ; 253 b1ba: 28 81 ld r18, Y b1bc: 39 81 ldd r19, Y+1 ; 0x01 b1be: 4a 81 ldd r20, Y+2 ; 0x02 b1c0: 5b 81 ldd r21, Y+3 ; 0x03 b1c2: c5 57 subi r28, 0x75 ; 117 b1c4: d2 40 sbci r29, 0x02 ; 2 b1c6: cf 57 subi r28, 0x7F ; 127 b1c8: dd 4f sbci r29, 0xFD ; 253 b1ca: 68 81 ld r22, Y b1cc: 79 81 ldd r23, Y+1 ; 0x01 b1ce: 8a 81 ldd r24, Y+2 ; 0x02 b1d0: 9b 81 ldd r25, Y+3 ; 0x03 b1d2: c1 58 subi r28, 0x81 ; 129 b1d4: d2 40 sbci r29, 0x02 ; 2 b1d6: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b1da: 87 ff sbrs r24, 7 b1dc: 1c c1 rjmp .+568 ; 0xb416 a = (s[i + 1] - s[i]) / (6 * h[i]); b1de: d1 01 movw r26, r2 b1e0: 14 96 adiw r26, 0x04 ; 4 b1e2: 8d 90 ld r8, X+ b1e4: 9d 90 ld r9, X+ b1e6: ad 90 ld r10, X+ b1e8: bc 90 ld r11, X b1ea: 17 97 sbiw r26, 0x07 ; 7 b1ec: 8d 91 ld r24, X+ b1ee: 9d 91 ld r25, X+ b1f0: 0d 90 ld r0, X+ b1f2: bc 91 ld r27, X b1f4: a0 2d mov r26, r0 b1f6: cf 58 subi r28, 0x8F ; 143 b1f8: dd 4f sbci r29, 0xFD ; 253 b1fa: 88 83 st Y, r24 b1fc: 99 83 std Y+1, r25 ; 0x01 b1fe: aa 83 std Y+2, r26 ; 0x02 b200: bb 83 std Y+3, r27 ; 0x03 b202: c1 57 subi r28, 0x71 ; 113 b204: d2 40 sbci r29, 0x02 ; 2 b206: f8 01 movw r30, r16 b208: ee 0f add r30, r30 b20a: ff 1f adc r31, r31 b20c: ee 0f add r30, r30 b20e: ff 1f adc r31, r31 b210: 21 e9 ldi r18, 0x91 ; 145 b212: 31 e0 ldi r19, 0x01 ; 1 b214: 2c 0f add r18, r28 b216: 3d 1f adc r19, r29 b218: e2 0f add r30, r18 b21a: f3 1f adc r31, r19 b21c: 40 80 ld r4, Z b21e: 51 80 ldd r5, Z+1 ; 0x01 b220: 62 80 ldd r6, Z+2 ; 0x02 b222: 73 80 ldd r7, Z+3 ; 0x03 b = s[i] / 2; c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6; b224: c3 59 subi r28, 0x93 ; 147 b226: dd 4f sbci r29, 0xFD ; 253 b228: a8 81 ld r26, Y b22a: b9 81 ldd r27, Y+1 ; 0x01 b22c: cd 56 subi r28, 0x6D ; 109 b22e: d2 40 sbci r29, 0x02 ; 2 b230: 8d 91 ld r24, X+ b232: 9d 91 ld r25, X+ b234: 0d 90 ld r0, X+ b236: bc 91 ld r27, X b238: a0 2d mov r26, r0 b23a: c3 58 subi r28, 0x83 ; 131 b23c: dd 4f sbci r29, 0xFD ; 253 b23e: 88 83 st Y, r24 b240: 99 83 std Y+1, r25 ; 0x01 b242: aa 83 std Y+2, r26 ; 0x02 b244: bb 83 std Y+3, r27 ; 0x03 b246: cd 57 subi r28, 0x7D ; 125 b248: d2 40 sbci r29, 0x02 ; 2 d = f[i]; sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; b24a: a7 01 movw r20, r14 b24c: 96 01 movw r18, r12 b24e: cb 58 subi r28, 0x8B ; 139 b250: dd 4f sbci r29, 0xFD ; 253 b252: 68 81 ld r22, Y b254: 79 81 ldd r23, Y+1 ; 0x01 b256: 8a 81 ldd r24, Y+2 ; 0x02 b258: 9b 81 ldd r25, Y+3 ; 0x03 b25a: c5 57 subi r28, 0x75 ; 117 b25c: d2 40 sbci r29, 0x02 ; 2 b25e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b262: 6b 01 movw r12, r22 b264: 7c 01 movw r14, r24 b266: 20 e0 ldi r18, 0x00 ; 0 b268: 30 e0 ldi r19, 0x00 ; 0 b26a: 40 e4 ldi r20, 0x40 ; 64 b26c: 50 e4 ldi r21, 0x40 ; 64 b26e: 0f 94 78 a8 call 0x350f0 ; 0x350f0 b272: cb 57 subi r28, 0x7B ; 123 b274: dd 4f sbci r29, 0xFD ; 253 b276: 68 83 st Y, r22 b278: 79 83 std Y+1, r23 ; 0x01 b27a: 8a 83 std Y+2, r24 ; 0x02 b27c: 9b 83 std Y+3, r25 ; 0x03 b27e: c5 58 subi r28, 0x85 ; 133 b280: d2 40 sbci r29, 0x02 ; 2 for (i = 0; i x[i + 1])) { a = (s[i + 1] - s[i]) / (6 * h[i]); b = s[i] / 2; c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6; b282: c3 58 subi r28, 0x83 ; 131 b284: dd 4f sbci r29, 0xFD ; 253 b286: 28 81 ld r18, Y b288: 39 81 ldd r19, Y+1 ; 0x01 b28a: 4a 81 ldd r20, Y+2 ; 0x02 b28c: 5b 81 ldd r21, Y+3 ; 0x03 b28e: cd 57 subi r28, 0x7D ; 125 b290: d2 40 sbci r29, 0x02 ; 2 b292: c3 59 subi r28, 0x93 ; 147 b294: dd 4f sbci r29, 0xFD ; 253 b296: e8 81 ld r30, Y b298: f9 81 ldd r31, Y+1 ; 0x01 b29a: cd 56 subi r28, 0x6D ; 109 b29c: d2 40 sbci r29, 0x02 ; 2 b29e: 64 81 ldd r22, Z+4 ; 0x04 b2a0: 75 81 ldd r23, Z+5 ; 0x05 b2a2: 86 81 ldd r24, Z+6 ; 0x06 b2a4: 97 81 ldd r25, Z+7 ; 0x07 b2a6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b2aa: a3 01 movw r20, r6 b2ac: 92 01 movw r18, r4 b2ae: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> b2b2: c7 58 subi r28, 0x87 ; 135 b2b4: dd 4f sbci r29, 0xFD ; 253 b2b6: 68 83 st Y, r22 b2b8: 79 83 std Y+1, r23 ; 0x01 b2ba: 8a 83 std Y+2, r24 ; 0x02 b2bc: 9b 83 std Y+3, r25 ; 0x03 b2be: c9 57 subi r28, 0x79 ; 121 b2c0: d2 40 sbci r29, 0x02 ; 2 b2c2: a3 01 movw r20, r6 b2c4: 92 01 movw r18, r4 b2c6: c3 01 movw r24, r6 b2c8: b2 01 movw r22, r4 b2ca: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b2ce: cf 58 subi r28, 0x8F ; 143 b2d0: dd 4f sbci r29, 0xFD ; 253 b2d2: 28 81 ld r18, Y b2d4: 39 81 ldd r19, Y+1 ; 0x01 b2d6: 4a 81 ldd r20, Y+2 ; 0x02 b2d8: 5b 81 ldd r21, Y+3 ; 0x03 b2da: c1 57 subi r28, 0x71 ; 113 b2dc: d2 40 sbci r29, 0x02 ; 2 b2de: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b2e2: c7 57 subi r28, 0x77 ; 119 b2e4: dd 4f sbci r29, 0xFD ; 253 b2e6: 68 83 st Y, r22 b2e8: 79 83 std Y+1, r23 ; 0x01 b2ea: 8a 83 std Y+2, r24 ; 0x02 b2ec: 9b 83 std Y+3, r25 ; 0x03 b2ee: c9 58 subi r28, 0x89 ; 137 b2f0: d2 40 sbci r29, 0x02 ; 2 b2f2: a3 01 movw r20, r6 b2f4: 92 01 movw r18, r4 b2f6: c5 01 movw r24, r10 b2f8: b4 01 movw r22, r8 b2fa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b2fe: 9b 01 movw r18, r22 b300: ac 01 movw r20, r24 b302: c7 57 subi r28, 0x77 ; 119 b304: dd 4f sbci r29, 0xFD ; 253 b306: 68 81 ld r22, Y b308: 79 81 ldd r23, Y+1 ; 0x01 b30a: 8a 81 ldd r24, Y+2 ; 0x02 b30c: 9b 81 ldd r25, Y+3 ; 0x03 b30e: c9 58 subi r28, 0x89 ; 137 b310: d2 40 sbci r29, 0x02 ; 2 b312: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b316: 20 e0 ldi r18, 0x00 ; 0 b318: 30 e0 ldi r19, 0x00 ; 0 b31a: 40 ec ldi r20, 0xC0 ; 192 b31c: 50 e4 ldi r21, 0x40 ; 64 b31e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> b322: 9b 01 movw r18, r22 b324: ac 01 movw r20, r24 b326: c7 58 subi r28, 0x87 ; 135 b328: dd 4f sbci r29, 0xFD ; 253 b32a: 68 81 ld r22, Y b32c: 79 81 ldd r23, Y+1 ; 0x01 b32e: 8a 81 ldd r24, Y+2 ; 0x02 b330: 9b 81 ldd r25, Y+3 ; 0x03 b332: c9 57 subi r28, 0x79 ; 121 b334: d2 40 sbci r29, 0x02 ; 2 b336: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d = f[i]; sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; b33a: a7 01 movw r20, r14 b33c: 96 01 movw r18, r12 b33e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b342: c7 58 subi r28, 0x87 ; 135 b344: dd 4f sbci r29, 0xFD ; 253 b346: 68 83 st Y, r22 b348: 79 83 std Y+1, r23 ; 0x01 b34a: 8a 83 std Y+2, r24 ; 0x02 b34c: 9b 83 std Y+3, r25 ; 0x03 b34e: c9 57 subi r28, 0x79 ; 121 b350: d2 40 sbci r29, 0x02 ; 2 s[i] = (m[i][n - 1] - sum) / m[i][i]; } for (i = 0; i x[i + 1])) { a = (s[i + 1] - s[i]) / (6 * h[i]); b352: cf 58 subi r28, 0x8F ; 143 b354: dd 4f sbci r29, 0xFD ; 253 b356: 28 81 ld r18, Y b358: 39 81 ldd r19, Y+1 ; 0x01 b35a: 4a 81 ldd r20, Y+2 ; 0x02 b35c: 5b 81 ldd r21, Y+3 ; 0x03 b35e: c1 57 subi r28, 0x71 ; 113 b360: d2 40 sbci r29, 0x02 ; 2 b362: c5 01 movw r24, r10 b364: b4 01 movw r22, r8 b366: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b36a: 4b 01 movw r8, r22 b36c: 5c 01 movw r10, r24 b36e: 20 e0 ldi r18, 0x00 ; 0 b370: 30 e0 ldi r19, 0x00 ; 0 b372: 40 ec ldi r20, 0xC0 ; 192 b374: 50 e4 ldi r21, 0x40 ; 64 b376: c3 01 movw r24, r6 b378: b2 01 movw r22, r4 b37a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b37e: 9b 01 movw r18, r22 b380: ac 01 movw r20, r24 b382: c5 01 movw r24, r10 b384: b4 01 movw r22, r8 b386: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> b = s[i] / 2; c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6; d = f[i]; sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; b38a: cb 57 subi r28, 0x7B ; 123 b38c: dd 4f sbci r29, 0xFD ; 253 b38e: 28 81 ld r18, Y b390: 39 81 ldd r19, Y+1 ; 0x01 b392: 4a 81 ldd r20, Y+2 ; 0x02 b394: 5b 81 ldd r21, Y+3 ; 0x03 b396: c5 58 subi r28, 0x85 ; 133 b398: d2 40 sbci r29, 0x02 ; 2 b39a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b39e: 4b 01 movw r8, r22 b3a0: 5c 01 movw r10, r24 } for (i = 0; i x[i + 1])) { a = (s[i + 1] - s[i]) / (6 * h[i]); b = s[i] / 2; b3a2: 20 e0 ldi r18, 0x00 ; 0 b3a4: 30 e0 ldi r19, 0x00 ; 0 b3a6: 40 e0 ldi r20, 0x00 ; 0 b3a8: 5f e3 ldi r21, 0x3F ; 63 b3aa: cf 58 subi r28, 0x8F ; 143 b3ac: dd 4f sbci r29, 0xFD ; 253 b3ae: 68 81 ld r22, Y b3b0: 79 81 ldd r23, Y+1 ; 0x01 b3b2: 8a 81 ldd r24, Y+2 ; 0x02 b3b4: 9b 81 ldd r25, Y+3 ; 0x03 b3b6: c1 57 subi r28, 0x71 ; 113 b3b8: d2 40 sbci r29, 0x02 ; 2 b3ba: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b3be: 2b 01 movw r4, r22 b3c0: 3c 01 movw r6, r24 c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6; d = f[i]; sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; b3c2: a7 01 movw r20, r14 b3c4: 96 01 movw r18, r12 b3c6: c7 01 movw r24, r14 b3c8: b6 01 movw r22, r12 b3ca: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b3ce: 9b 01 movw r18, r22 b3d0: ac 01 movw r20, r24 b3d2: c3 01 movw r24, r6 b3d4: b2 01 movw r22, r4 b3d6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b3da: 9b 01 movw r18, r22 b3dc: ac 01 movw r20, r24 b3de: c5 01 movw r24, r10 b3e0: b4 01 movw r22, r8 b3e2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b3e6: 9b 01 movw r18, r22 b3e8: ac 01 movw r20, r24 b3ea: c7 58 subi r28, 0x87 ; 135 b3ec: dd 4f sbci r29, 0xFD ; 253 b3ee: 68 81 ld r22, Y b3f0: 79 81 ldd r23, Y+1 ; 0x01 b3f2: 8a 81 ldd r24, Y+2 ; 0x02 b3f4: 9b 81 ldd r25, Y+3 ; 0x03 b3f6: c9 57 subi r28, 0x79 ; 121 b3f8: d2 40 sbci r29, 0x02 ; 2 b3fa: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b3fe: c3 58 subi r28, 0x83 ; 131 b400: dd 4f sbci r29, 0xFD ; 253 b402: 28 81 ld r18, Y b404: 39 81 ldd r19, Y+1 ; 0x01 b406: 4a 81 ldd r20, Y+2 ; 0x02 b408: 5b 81 ldd r21, Y+3 ; 0x03 b40a: cd 57 subi r28, 0x7D ; 125 b40c: d2 40 sbci r29, 0x02 ; 2 b40e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b412: 2b 01 movw r4, r22 b414: 3c 01 movw r6, r24 b416: 0f 5f subi r16, 0xFF ; 255 b418: 1f 4f sbci r17, 0xFF ; 255 b41a: f4 e0 ldi r31, 0x04 ; 4 b41c: 2f 0e add r2, r31 b41e: 31 1c adc r3, r1 b420: c3 59 subi r28, 0x93 ; 147 b422: dd 4f sbci r29, 0xFD ; 253 b424: 28 81 ld r18, Y b426: 39 81 ldd r19, Y+1 ; 0x01 b428: cd 56 subi r28, 0x6D ; 109 b42a: d2 40 sbci r29, 0x02 ; 2 b42c: 2c 5f subi r18, 0xFC ; 252 b42e: 3f 4f sbci r19, 0xFF ; 255 b430: c3 59 subi r28, 0x93 ; 147 b432: dd 4f sbci r29, 0xFD ; 253 b434: 39 83 std Y+1, r19 ; 0x01 b436: 28 83 st Y, r18 b438: cd 56 subi r28, 0x6D ; 109 b43a: d2 40 sbci r29, 0x02 ; 2 for (j = i; j <= n - 2; j++) sum += m[i][j] * s[j]; s[i] = (m[i][n - 1] - sum) / m[i][i]; } for (i = 0; i b442: 81 ce rjmp .-766 ; 0xb146 sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; } return sum; } b444: c3 01 movw r24, r6 b446: b2 01 movw r22, r4 b448: c4 57 subi r28, 0x74 ; 116 b44a: dd 4f sbci r29, 0xFD ; 253 b44c: 0f b6 in r0, 0x3f ; 63 b44e: f8 94 cli b450: de bf out 0x3e, r29 ; 62 b452: 0f be out 0x3f, r0 ; 63 b454: cd bf out 0x3d, r28 ; 61 b456: df 91 pop r29 b458: cf 91 pop r28 b45a: 1f 91 pop r17 b45c: 0f 91 pop r16 b45e: ff 90 pop r15 b460: ef 90 pop r14 b462: df 90 pop r13 b464: cf 90 pop r12 b466: bf 90 pop r11 b468: af 90 pop r10 b46a: 9f 90 pop r9 b46c: 8f 90 pop r8 b46e: 7f 90 pop r7 b470: 6f 90 pop r6 b472: 5f 90 pop r5 b474: 4f 90 pop r4 b476: 3f 90 pop r3 b478: 2f 90 pop r2 b47a: 08 95 ret shift[0] = 0; for (i = 0; i < n; i++) { if (i > 0) { //read shift in steps from EEPROM shift[i] = eeprom_read_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + (i - 1)); b47c: c5 01 movw r24, r10 b47e: 0f 94 ee a3 call 0x347dc ; 0x347dc b482: d8 01 movw r26, r16 b484: 8d 93 st X+, r24 b486: 9c 93 st X, r25 b488: b5 e0 ldi r27, 0x05 ; 5 b48a: cb 0e add r12, r27 b48c: d1 1c adc r13, r1 b48e: e2 e0 ldi r30, 0x02 ; 2 b490: ae 0e add r10, r30 b492: b1 1c adc r11, r1 b494: 96 cc rjmp .-1748 ; 0xadc2 0000b496 : eFilamentAction = FilamentAction::None; } // Common gcode shared by the gcodes. This saves some flash memory static void gcodes_M704_M705_M706(uint16_t gcode) { b496: 0f 93 push r16 b498: 1f 93 push r17 b49a: cf 93 push r28 uint8_t mmuSlotIndex = 0xffU; if (MMU2::mmu2.Enabled() && code_seen('P')) b49c: 20 91 01 13 lds r18, 0x1301 ; 0x801301 b4a0: 21 30 cpi r18, 0x01 ; 1 b4a2: 79 f5 brne .+94 ; 0xb502 b4a4: 8c 01 movw r16, r24 b4a6: 80 e5 ldi r24, 0x50 ; 80 b4a8: 0e 94 f5 55 call 0xabea ; 0xabea b4ac: 88 23 and r24, r24 b4ae: 49 f1 breq .+82 ; 0xb502 { mmuSlotIndex = code_value_uint8(); b4b0: 0e 94 0a 56 call 0xac14 ; 0xac14 b4b4: c8 2f mov r28, r24 if (mmuSlotIndex < MMU_FILAMENT_COUNT) { b4b6: 85 30 cpi r24, 0x05 ; 5 b4b8: 20 f5 brcc .+72 ; 0xb502 switch (gcode) b4ba: 01 3c cpi r16, 0xC1 ; 193 b4bc: 82 e0 ldi r24, 0x02 ; 2 b4be: 18 07 cpc r17, r24 b4c0: 49 f0 breq .+18 ; 0xb4d4 b4c2: 02 3c cpi r16, 0xC2 ; 194 b4c4: 12 40 sbci r17, 0x02 ; 2 b4c6: 69 f0 breq .+26 ; 0xb4e2 { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); b4c8: 8c 2f mov r24, r28 default: break; } } } } b4ca: cf 91 pop r28 b4cc: 1f 91 pop r17 b4ce: 0f 91 pop r16 mmuSlotIndex = code_value_uint8(); if (mmuSlotIndex < MMU_FILAMENT_COUNT) { switch (gcode) { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); b4d0: 0d 94 89 9d jmp 0x33b12 ; 0x33b12 break; case 705: MMU2::mmu2.eject_filament(mmuSlotIndex, false); b4d4: 60 e0 ldi r22, 0x00 ; 0 b4d6: 8c 2f mov r24, r28 default: break; } } } } b4d8: cf 91 pop r28 b4da: 1f 91 pop r17 b4dc: 0f 91 pop r16 { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); break; case 705: MMU2::mmu2.eject_filament(mmuSlotIndex, false); b4de: 0d 94 cc 9d jmp 0x33b98 ; 0x33b98 break; case 706: #ifdef MMU_HAS_CUTTER if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0){ b4e2: 8e ec ldi r24, 0xCE ; 206 b4e4: 9e e0 ldi r25, 0x0E ; 14 b4e6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 b4ea: 88 23 and r24, r24 b4ec: 51 f0 breq .+20 ; 0xb502 IncrementMMUFails(); } } bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { if (!WaitForMMUReady()) { b4ee: 0f 94 a6 79 call 0x2f34c ; 0x2f34c b4f2: 88 23 and r24, r24 b4f4: 31 f0 breq .+12 ; 0xb502 b4f6: 8c 2f mov r24, r28 default: break; } } } } b4f8: cf 91 pop r28 b4fa: 1f 91 pop r17 b4fc: 0f 91 pop r16 b4fe: 0d 94 49 9e jmp 0x33c92 ; 0x33c92 b502: cf 91 pop r28 b504: 1f 91 pop r17 b506: 0f 91 pop r16 b508: 08 95 ret 0000b50a : #endif // Return True if a character was found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } static inline bool code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; } static inline float code_value() { return strtod_noE(strchr_pointer+1, NULL);} b50a: 8f 92 push r8 b50c: 9f 92 push r9 b50e: af 92 push r10 b510: bf 92 push r11 b512: cf 92 push r12 b514: df 92 push r13 b516: ef 92 push r14 b518: ff 92 push r15 b51a: 0f 93 push r16 b51c: 1f 93 push r17 b51e: cf 93 push r28 b520: df 93 push r29 b522: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb b526: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc b52a: 0f 5f subi r16, 0xFF ; 255 b52c: 1f 4f sbci r17, 0xFF ; 255 if (endptr) *endptr = (char*)nptr; do { c = *nptr++; b52e: 68 01 movw r12, r16 b530: 8f ef ldi r24, 0xFF ; 255 b532: c8 1a sub r12, r24 b534: d8 0a sbc r13, r24 b536: d8 01 movw r26, r16 b538: dc 91 ld r29, X } while (isspace(c)); b53a: 8d 2f mov r24, r29 b53c: 90 e0 ldi r25, 0x00 ; 0 b53e: 0f 94 71 a1 call 0x342e2 ; 0x342e2 b542: 7c 01 movw r14, r24 b544: 89 2b or r24, r25 b546: 01 f5 brne .+64 ; 0xb588 flag = 0; if (c == '-') { b548: dd 32 cpi r29, 0x2D ; 45 b54a: 01 f5 brne .+64 ; 0xb58c flag = FL_MINUS; c = *nptr++; b54c: 68 01 movw r12, r16 b54e: b2 e0 ldi r27, 0x02 ; 2 b550: cb 0e add r12, r27 b552: d1 1c adc r13, r1 b554: f8 01 movw r30, r16 b556: d1 81 ldd r29, Z+1 ; 0x01 c = *nptr++; } while (isspace(c)); flag = 0; if (c == '-') { flag = FL_MINUS; b558: c1 e0 ldi r28, 0x01 ; 1 } else if (c == '+') { c = *nptr++; } if (!strncasecmp_P(nptr - 1, pstr_inf, 3)) { b55a: 86 01 movw r16, r12 b55c: 01 50 subi r16, 0x01 ; 1 b55e: 11 09 sbc r17, r1 b560: 43 e0 ldi r20, 0x03 ; 3 b562: 50 e0 ldi r21, 0x00 ; 0 b564: 64 e8 ldi r22, 0x84 ; 132 b566: 76 e7 ldi r23, 0x76 ; 118 b568: c8 01 movw r24, r16 b56a: 0f 94 a7 a1 call 0x3434e ; 0x3434e b56e: 89 2b or r24, r25 b570: c1 f4 brne .+48 ; 0xb5a2 nptr += 2; if (!strncasecmp_P(nptr, pstr_inity, 5)) nptr += 5; if (endptr) *endptr = (char*)nptr; return flag & FL_MINUS ? -INFINITY : +INFINITY; b572: 60 e0 ldi r22, 0x00 ; 0 b574: 70 e0 ldi r23, 0x00 ; 0 b576: 80 e8 ldi r24, 0x80 ; 128 b578: 9f ef ldi r25, 0xFF ; 255 b57a: c1 11 cpse r28, r1 b57c: db c0 rjmp .+438 ; 0xb734 b57e: 60 e0 ldi r22, 0x00 ; 0 b580: 70 e0 ldi r23, 0x00 ; 0 b582: 80 e8 ldi r24, 0x80 ; 128 b584: 9f e7 ldi r25, 0x7F ; 127 b586: d6 c0 rjmp .+428 ; 0xb734 if (endptr) *endptr = (char*)nptr; do { c = *nptr++; b588: 86 01 movw r16, r12 b58a: d1 cf rjmp .-94 ; 0xb52e flag = 0; if (c == '-') { flag = FL_MINUS; c = *nptr++; } else if (c == '+') { b58c: db 32 cpi r29, 0x2B ; 43 b58e: 39 f4 brne .+14 ; 0xb59e c = *nptr++; b590: 68 01 movw r12, r16 b592: f2 e0 ldi r31, 0x02 ; 2 b594: cf 0e add r12, r31 b596: d1 1c adc r13, r1 b598: d8 01 movw r26, r16 b59a: 11 96 adiw r26, 0x01 ; 1 b59c: dc 91 ld r29, X do { c = *nptr++; } while (isspace(c)); flag = 0; b59e: c0 e0 ldi r28, 0x00 ; 0 b5a0: dc cf rjmp .-72 ; 0xb55a return flag & FL_MINUS ? -INFINITY : +INFINITY; } /* NAN() construction is not realised. Length would be 3 characters only. */ if (!strncasecmp_P(nptr - 1, pstr_nan, 3)) { b5a2: 43 e0 ldi r20, 0x03 ; 3 b5a4: 50 e0 ldi r21, 0x00 ; 0 b5a6: 61 e8 ldi r22, 0x81 ; 129 b5a8: 76 e7 ldi r23, 0x76 ; 118 b5aa: c8 01 movw r24, r16 b5ac: 0f 94 a7 a1 call 0x3434e ; 0x3434e b5b0: 89 2b or r24, r25 b5b2: 09 f4 brne .+2 ; 0xb5b6 b5b4: cc c0 rjmp .+408 ; 0xb74e b5b6: f6 01 movw r30, r12 *endptr = (char*)nptr + 2; return NAN; } x.u32 = 0; exp = 0; b5b8: 10 e0 ldi r17, 0x00 ; 0 b5ba: 00 e0 ldi r16, 0x00 ; 0 if (endptr) *endptr = (char*)nptr + 2; return NAN; } x.u32 = 0; b5bc: 20 e0 ldi r18, 0x00 ; 0 b5be: 30 e0 ldi r19, 0x00 ; 0 b5c0: a9 01 movw r20, r18 b5c2: 6f 01 movw r12, r30 exp = 0; while (1) { c -= '0'; b5c4: d0 53 subi r29, 0x30 ; 48 if (c <= 9) { b5c6: da 30 cpi r29, 0x0A ; 10 b5c8: 60 f5 brcc .+88 ; 0xb622 flag |= FL_ANY; b5ca: bc 2e mov r11, r28 b5cc: 68 94 set b5ce: b1 f8 bld r11, 1 b5d0: 8c 2f mov r24, r28 b5d2: 88 70 andi r24, 0x08 ; 8 if (flag & FL_OVFL) { b5d4: c2 ff sbrs r28, 2 b5d6: 09 c0 rjmp .+18 ; 0xb5ea if (!(flag & FL_DOT)) b5d8: 81 11 cpse r24, r1 b5da: 02 c0 rjmp .+4 ; 0xb5e0 exp += 1; b5dc: 0f 5f subi r16, 0xFF ; 255 b5de: 1f 4f sbci r17, 0xFF ; 255 b5e0: 31 96 adiw r30, 0x01 ; 1 flag |= FL_DOT; } else { break; } c = *nptr++; b5e2: d6 01 movw r26, r12 b5e4: dc 91 ld r29, X b5e6: cb 2d mov r28, r11 b5e8: ec cf rjmp .-40 ; 0xb5c2 if (flag & FL_OVFL) { if (!(flag & FL_DOT)) exp += 1; } else { if (flag & FL_DOT) b5ea: 88 23 and r24, r24 b5ec: 11 f0 breq .+4 ; 0xb5f2 exp -= 1; b5ee: 01 50 subi r16, 0x01 ; 1 b5f0: 11 09 sbc r17, r1 /* x.u32 = x.u32 * 10 + c */ x.u32 = (((x.u32 << 2) + x.u32) << 1) + c; b5f2: a5 e0 ldi r26, 0x05 ; 5 b5f4: b0 e0 ldi r27, 0x00 ; 0 b5f6: 0f 94 75 a4 call 0x348ea ; 0x348ea <__muluhisi3> b5fa: 9b 01 movw r18, r22 b5fc: ac 01 movw r20, r24 b5fe: 22 0f add r18, r18 b600: 33 1f adc r19, r19 b602: 44 1f adc r20, r20 b604: 55 1f adc r21, r21 b606: 2d 0f add r18, r29 b608: 31 1d adc r19, r1 b60a: 41 1d adc r20, r1 b60c: 51 1d adc r21, r1 if (x.u32 >= (ULONG_MAX - 9) / 10) b60e: 28 39 cpi r18, 0x98 ; 152 b610: b9 e9 ldi r27, 0x99 ; 153 b612: 3b 07 cpc r19, r27 b614: 4b 07 cpc r20, r27 b616: b9 e1 ldi r27, 0x19 ; 25 b618: 5b 07 cpc r21, r27 b61a: 10 f3 brcs .-60 ; 0xb5e0 flag |= FL_OVFL; b61c: c6 60 ori r28, 0x06 ; 6 b61e: bc 2e mov r11, r28 b620: df cf rjmp .-66 ; 0xb5e0 } } else if (c == (('.' - '0') & 0xff) && !(flag & FL_DOT)) { b622: de 3f cpi r29, 0xFE ; 254 b624: 31 f4 brne .+12 ; 0xb632 b626: c3 fd sbrc r28, 3 b628: 33 c0 rjmp .+102 ; 0xb690 flag |= FL_DOT; b62a: bc 2e mov r11, r28 b62c: 68 94 set b62e: b3 f8 bld r11, 3 b630: d7 cf rjmp .-82 ; 0xb5e0 } c = *nptr++; } // Check for exponent "E", but disable capital E if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/) b632: d5 33 cpi r29, 0x35 ; 53 b634: 69 f5 brne .+90 ; 0xb690 { int i; c = *nptr++; b636: 80 81 ld r24, Z i = 2; if (c == '-') { b638: 8d 32 cpi r24, 0x2D ; 45 b63a: 31 f4 brne .+12 ; 0xb648 flag |= FL_MEXP; b63c: c0 61 ori r28, 0x10 ; 16 c = *nptr++; b63e: bf 01 movw r22, r30 } else if (c == '+') { c = *nptr++; b640: 6e 5f subi r22, 0xFE ; 254 b642: 7f 4f sbci r23, 0xFF ; 255 b644: 81 81 ldd r24, Z+1 ; 0x01 b646: 05 c0 rjmp .+10 ; 0xb652 b648: bf 01 movw r22, r30 i = 2; if (c == '-') { flag |= FL_MEXP; c = *nptr++; } else if (c == '+') { b64a: 8b 32 cpi r24, 0x2B ; 43 b64c: c9 f3 breq .-14 ; 0xb640 // Check for exponent "E", but disable capital E if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/) { int i; c = *nptr++; b64e: 6f 5f subi r22, 0xFF ; 255 b650: 7f 4f sbci r23, 0xFF ; 255 c = *nptr++; } else { i = 1; } c -= '0'; b652: 80 53 subi r24, 0x30 ; 48 if (c > 9) { b654: 8a 30 cpi r24, 0x0A ; 10 b656: e0 f4 brcc .+56 ; 0xb690 b658: fb 01 movw r30, r22 nptr -= i; } else { i = 0; do { if (i < 3200) b65a: b0 e8 ldi r27, 0x80 ; 128 b65c: eb 16 cp r14, r27 b65e: bc e0 ldi r27, 0x0C ; 12 b660: fb 06 cpc r15, r27 b662: 5c f4 brge .+22 ; 0xb67a i = (((i << 2) + i) << 1) + c; /* i = 10*i + c */ b664: b7 01 movw r22, r14 b666: 66 0f add r22, r22 b668: 77 1f adc r23, r23 b66a: 66 0f add r22, r22 b66c: 77 1f adc r23, r23 b66e: e6 0e add r14, r22 b670: f7 1e adc r15, r23 b672: ee 0c add r14, r14 b674: ff 1c adc r15, r15 b676: e8 0e add r14, r24 b678: f1 1c adc r15, r1 c = *nptr++ - '0'; b67a: 81 91 ld r24, Z+ b67c: 80 53 subi r24, 0x30 ; 48 } while (c <= 9); b67e: 8a 30 cpi r24, 0x0A ; 10 b680: 60 f3 brcs .-40 ; 0xb65a if (flag & FL_MEXP) b682: c4 ff sbrs r28, 4 b684: 03 c0 rjmp .+6 ; 0xb68c i = -i; b686: f1 94 neg r15 b688: e1 94 neg r14 b68a: f1 08 sbc r15, r1 exp += i; b68c: 0e 0d add r16, r14 b68e: 1f 1d adc r17, r15 } if ((flag & FL_ANY) && endptr) *endptr = (char*)nptr - 1; x.flt = __floatunsisf(x.u32); /* manually */ b690: ca 01 movw r24, r20 b692: b9 01 movw r22, r18 b694: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> if ((flag & FL_MINUS) && (flag & FL_ANY)) b698: c3 70 andi r28, 0x03 ; 3 b69a: c3 30 cpi r28, 0x03 ; 3 b69c: 09 f4 brne .+2 ; 0xb6a0 x.flt = -x.flt; b69e: 90 58 subi r25, 0x80 ; 128 b6a0: 4b 01 movw r8, r22 b6a2: 5c 01 movw r10, r24 if (x.flt != 0) { b6a4: 20 e0 ldi r18, 0x00 ; 0 b6a6: 30 e0 ldi r19, 0x00 ; 0 b6a8: a9 01 movw r20, r18 b6aa: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b6ae: 88 23 and r24, r24 b6b0: 09 f4 brne .+2 ; 0xb6b4 b6b2: 3e c0 rjmp .+124 ; 0xb730 if (exp < 0) { nptr = (void*)(pwr_m10 + 5); exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); b6b4: cd e7 ldi r28, 0x7D ; 125 b6b6: d6 e7 ldi r29, 0x76 ; 118 if ((flag & FL_MINUS) && (flag & FL_ANY)) x.flt = -x.flt; if (x.flt != 0) { int pwr; if (exp < 0) { b6b8: 17 ff sbrs r17, 7 b6ba: 05 c0 rjmp .+10 ; 0xb6c6 nptr = (void*)(pwr_m10 + 5); exp = -exp; b6bc: 11 95 neg r17 b6be: 01 95 neg r16 b6c0: 11 09 sbc r17, r1 x.flt = -x.flt; if (x.flt != 0) { int pwr; if (exp < 0) { nptr = (void*)(pwr_m10 + 5); b6c2: c5 e6 ldi r28, 0x65 ; 101 b6c4: d6 e7 ldi r29, 0x76 ; 118 b6c6: 6e 01 movw r12, r28 b6c8: e8 e1 ldi r30, 0x18 ; 24 b6ca: ce 1a sub r12, r30 b6cc: d1 08 sbc r13, r1 exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); b6ce: 80 e2 ldi r24, 0x20 ; 32 b6d0: e8 2e mov r14, r24 b6d2: f1 2c mov r15, r1 b6d4: 0d c0 rjmp .+26 ; 0xb6f0 for (; exp >= pwr; exp -= pwr) { union { unsigned long u32; float flt; } y; y.u32 = pgm_read_dword((float*)nptr); b6d6: fe 01 movw r30, r28 b6d8: 25 91 lpm r18, Z+ b6da: 35 91 lpm r19, Z+ b6dc: 45 91 lpm r20, Z+ b6de: 54 91 lpm r21, Z } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { for (; exp >= pwr; exp -= pwr) { b6e0: 0e 19 sub r16, r14 b6e2: 1f 09 sbc r17, r15 union { unsigned long u32; float flt; } y; y.u32 = pgm_read_dword((float*)nptr); x.flt *= y.flt; b6e4: c5 01 movw r24, r10 b6e6: b4 01 movw r22, r8 b6e8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b6ec: 4b 01 movw r8, r22 b6ee: 5c 01 movw r10, r24 b6f0: d5 01 movw r26, r10 b6f2: c4 01 movw r24, r8 } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { for (; exp >= pwr; exp -= pwr) { b6f4: 0e 15 cp r16, r14 b6f6: 1f 05 cpc r17, r15 b6f8: 74 f7 brge .-36 ; 0xb6d6 float flt; } y; y.u32 = pgm_read_dword((float*)nptr); x.flt *= y.flt; } nptr -= sizeof(float); b6fa: 24 97 sbiw r28, 0x04 ; 4 exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { b6fc: f5 94 asr r15 b6fe: e7 94 ror r14 b700: cc 16 cp r12, r28 b702: dd 06 cpc r13, r29 b704: a9 f7 brne .-22 ; 0xb6f0 not plus or minus infinity, and not NaN. */ __ATTR_CONST__ static inline int isfinite (double __x) { unsigned char __exp; __asm__ ( b706: 8a 2f mov r24, r26 b708: 88 0f add r24, r24 b70a: 8b 2f mov r24, r27 b70c: 88 1f adc r24, r24 y.u32 = pgm_read_dword((float*)nptr); x.flt *= y.flt; } nptr -= sizeof(float); } if (!isfinite(x.flt) || x.flt == 0) b70e: 8f 3f cpi r24, 0xFF ; 255 b710: 49 f0 breq .+18 ; 0xb724 b712: 20 e0 ldi r18, 0x00 ; 0 b714: 30 e0 ldi r19, 0x00 ; 0 b716: a9 01 movw r20, r18 b718: c5 01 movw r24, r10 b71a: b4 01 movw r22, r8 b71c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b720: 81 11 cpse r24, r1 b722: 06 c0 rjmp .+12 ; 0xb730 errno = ERANGE; b724: 82 e2 ldi r24, 0x22 ; 34 b726: 90 e0 ldi r25, 0x00 ; 0 b728: 90 93 0c 17 sts 0x170C, r25 ; 0x80170c b72c: 80 93 0b 17 sts 0x170B, r24 ; 0x80170b } return x.flt; b730: c5 01 movw r24, r10 b732: b4 01 movw r22, r8 b734: df 91 pop r29 b736: cf 91 pop r28 b738: 1f 91 pop r17 b73a: 0f 91 pop r16 b73c: ff 90 pop r15 b73e: ef 90 pop r14 b740: df 90 pop r13 b742: cf 90 pop r12 b744: bf 90 pop r11 b746: af 90 pop r10 b748: 9f 90 pop r9 b74a: 8f 90 pop r8 b74c: 08 95 ret /* NAN() construction is not realised. Length would be 3 characters only. */ if (!strncasecmp_P(nptr - 1, pstr_nan, 3)) { if (endptr) *endptr = (char*)nptr + 2; return NAN; b74e: 60 e0 ldi r22, 0x00 ; 0 b750: 70 e0 ldi r23, 0x00 ; 0 b752: 80 ec ldi r24, 0xC0 ; 192 b754: 9f e7 ldi r25, 0x7F ; 127 b756: ee cf rjmp .-36 ; 0xb734 0000b758 : } } } #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 void get_coordinates() { b758: 2f 92 push r2 b75a: 3f 92 push r3 b75c: 4f 92 push r4 b75e: 5f 92 push r5 b760: 6f 92 push r6 b762: 7f 92 push r7 b764: 8f 92 push r8 b766: 9f 92 push r9 b768: af 92 push r10 b76a: bf 92 push r11 b76c: cf 92 push r12 b76e: df 92 push r13 b770: ef 92 push r14 b772: ff 92 push r15 b774: 0f 93 push r16 b776: 1f 93 push r17 b778: cf 93 push r28 b77a: df 93 push r29 b77c: cd b7 in r28, 0x3d ; 61 b77e: de b7 in r29, 0x3e ; 62 b780: a1 97 sbiw r28, 0x21 ; 33 b782: 0f b6 in r0, 0x3f ; 63 b784: f8 94 cli b786: de bf out 0x3e, r29 ; 62 b788: 0f be out 0x3f, r0 ; 63 b78a: cd bf out 0x3d, r28 ; 61 b78c: 84 ec ldi r24, 0xC4 ; 196 b78e: 92 e0 ldi r25, 0x02 ; 2 b790: 9d 8f std Y+29, r25 ; 0x1d b792: 8c 8f std Y+28, r24 ; 0x1c b794: 81 e6 ldi r24, 0x61 ; 97 b796: 28 2e mov r2, r24 b798: 82 e1 ldi r24, 0x12 ; 18 b79a: 38 2e mov r3, r24 b79c: 09 e2 ldi r16, 0x29 ; 41 b79e: 16 e0 ldi r17, 0x06 ; 6 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) { b7a0: 91 e0 ldi r25, 0x01 ; 1 b7a2: 9a 8f std Y+26, r25 ; 0x1a b7a4: 19 8e std Y+25, r1 ; 0x19 if(code_seen(axis_codes[i])) b7a6: ec 8d ldd r30, Y+28 ; 0x1c b7a8: fd 8d ldd r31, Y+29 ; 0x1d b7aa: 81 91 ld r24, Z+ b7ac: fd 8f std Y+29, r31 ; 0x1d b7ae: ec 8f std Y+28, r30 ; 0x1c b7b0: 0e 94 f5 55 call 0xabea ; 0xabea b7b4: e8 2e mov r14, r24 b7b6: 88 23 and r24, r24 b7b8: 09 f4 brne .+2 ; 0xb7bc b7ba: 54 c1 rjmp .+680 ; 0xba64 { bool relative = axis_relative_modes & mask; b7bc: f0 90 57 12 lds r15, 0x1257 ; 0x801257 b7c0: fa 8d ldd r31, Y+26 ; 0x1a b7c2: ff 22 and r15, r31 destination[i] = code_value(); b7c4: 0e 94 85 5a call 0xb50a ; 0xb50a b7c8: 2b 01 movw r4, r22 b7ca: 3c 01 movw r6, r24 b7cc: f8 01 movw r30, r16 b7ce: 40 82 st Z, r4 b7d0: 51 82 std Z+1, r5 ; 0x01 b7d2: 62 82 std Z+2, r6 ; 0x02 b7d4: 73 82 std Z+3, r7 ; 0x03 if (i == E_AXIS) { b7d6: f9 8d ldd r31, Y+25 ; 0x19 b7d8: f3 30 cpi r31, 0x03 ; 3 b7da: 09 f0 breq .+2 ; 0xb7de b7dc: 45 c0 rjmp .+138 ; 0xb868 void get_coordinates() { for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) { if(code_seen(axis_codes[i])) { bool relative = axis_relative_modes & mask; b7de: dd 24 eor r13, r13 b7e0: d3 94 inc r13 b7e2: f1 10 cpse r15, r1 b7e4: 01 c0 rjmp .+2 ; 0xb7e8 b7e6: d1 2c mov r13, r1 destination[i] = code_value(); if (i == E_AXIS) { float emult = extruder_multiplier[active_extruder]; b7e8: 80 90 10 02 lds r8, 0x0210 ; 0x800210 b7ec: 90 90 11 02 lds r9, 0x0211 ; 0x800211 b7f0: a0 90 12 02 lds r10, 0x0212 ; 0x800212 b7f4: b0 90 13 02 lds r11, 0x0213 ; 0x800213 if (emult != 1.) { b7f8: 20 e0 ldi r18, 0x00 ; 0 b7fa: 30 e0 ldi r19, 0x00 ; 0 b7fc: 40 e8 ldi r20, 0x80 ; 128 b7fe: 5f e3 ldi r21, 0x3F ; 63 b800: c5 01 movw r24, r10 b802: b4 01 movw r22, r8 b804: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b808: 88 23 and r24, r24 b80a: 59 f1 breq .+86 ; 0xb862 if (! relative) { b80c: f1 10 cpse r15, r1 b80e: 15 c0 rjmp .+42 ; 0xb83a destination[i] -= current_position[i]; b810: 20 91 6d 12 lds r18, 0x126D ; 0x80126d b814: 30 91 6e 12 lds r19, 0x126E ; 0x80126e b818: 40 91 6f 12 lds r20, 0x126F ; 0x80126f b81c: 50 91 70 12 lds r21, 0x1270 ; 0x801270 b820: c3 01 movw r24, r6 b822: b2 01 movw r22, r4 b824: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b828: 60 93 35 06 sts 0x0635, r22 ; 0x800635 b82c: 70 93 36 06 sts 0x0636, r23 ; 0x800636 b830: 80 93 37 06 sts 0x0637, r24 ; 0x800637 b834: 90 93 38 06 sts 0x0638, r25 ; 0x800638 relative = true; b838: de 2c mov r13, r14 } destination[i] *= emult; b83a: a5 01 movw r20, r10 b83c: 94 01 movw r18, r8 b83e: 60 91 35 06 lds r22, 0x0635 ; 0x800635 b842: 70 91 36 06 lds r23, 0x0636 ; 0x800636 b846: 80 91 37 06 lds r24, 0x0637 ; 0x800637 b84a: 90 91 38 06 lds r25, 0x0638 ; 0x800638 b84e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> b852: 60 93 35 06 sts 0x0635, r22 ; 0x800635 b856: 70 93 36 06 sts 0x0636, r23 ; 0x800636 b85a: 80 93 37 06 sts 0x0637, r24 ; 0x800637 b85e: 90 93 38 06 sts 0x0638, r25 ; 0x800638 } } if (relative) b862: d1 10 cpse r13, r1 b864: 03 c0 rjmp .+6 ; 0xb86c b866: 5f c0 rjmp .+190 ; 0xb926 b868: ff 20 and r15, r15 b86a: 89 f0 breq .+34 ; 0xb88e destination[i] += current_position[i]; b86c: f1 01 movw r30, r2 b86e: 20 81 ld r18, Z b870: 31 81 ldd r19, Z+1 ; 0x01 b872: 42 81 ldd r20, Z+2 ; 0x02 b874: 53 81 ldd r21, Z+3 ; 0x03 b876: f8 01 movw r30, r16 b878: 60 81 ld r22, Z b87a: 71 81 ldd r23, Z+1 ; 0x01 b87c: 82 81 ldd r24, Z+2 ; 0x02 b87e: 93 81 ldd r25, Z+3 ; 0x03 b880: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> b884: f8 01 movw r30, r16 b886: 60 83 st Z, r22 b888: 71 83 std Z+1, r23 ; 0x01 b88a: 82 83 std Z+2, r24 ; 0x02 b88c: 93 83 std Z+3, r25 ; 0x03 #if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents(); b88e: f9 8d ldd r31, Y+25 ; 0x19 b890: f2 30 cpi r31, 0x02 ; 2 b892: d9 f5 brne .+118 ; 0xb90a b894: 80 91 bb 03 lds r24, 0x03BB ; 0x8003bb b898: 82 30 cpi r24, 0x02 ; 2 b89a: 09 f0 breq .+2 ; 0xb89e b89c: ee c0 rjmp .+476 ; 0xba7a SERIAL_PROTOCOLLNRPGM(MSG_OK); } #if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 void update_currents() { float current_high[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD; b89e: 8c e0 ldi r24, 0x0C ; 12 b8a0: e0 ea ldi r30, 0xA0 ; 160 b8a2: f2 e0 ldi r31, 0x02 ; 2 b8a4: de 01 movw r26, r28 b8a6: 1d 96 adiw r26, 0x0d ; 13 b8a8: 01 90 ld r0, Z+ b8aa: 0d 92 st X+, r0 b8ac: 8a 95 dec r24 b8ae: e1 f7 brne .-8 ; 0xb8a8 float current_low[3] = DEFAULT_PWM_MOTOR_CURRENT; b8b0: 8c e0 ldi r24, 0x0C ; 12 b8b2: ec ea ldi r30, 0xAC ; 172 b8b4: f2 e0 ldi r31, 0x02 ; 2 b8b6: de 01 movw r26, r28 b8b8: 11 96 adiw r26, 0x01 ; 1 b8ba: 01 90 ld r0, Z+ b8bc: 0d 92 st X+, r0 b8be: 8a 95 dec r24 b8c0: e1 f7 brne .-8 ; 0xb8ba float tmp_motor[3]; //SERIAL_ECHOLNPGM("Currents updated: "); if (destination[Z_AXIS] < Z_SILENT) { b8c2: c0 90 31 06 lds r12, 0x0631 ; 0x800631 b8c6: d0 90 32 06 lds r13, 0x0632 ; 0x800632 b8ca: e0 90 33 06 lds r14, 0x0633 ; 0x800633 b8ce: f0 90 34 06 lds r15, 0x0634 ; 0x800634 b8d2: 20 e0 ldi r18, 0x00 ; 0 b8d4: 30 e0 ldi r19, 0x00 ; 0 b8d6: a9 01 movw r20, r18 b8d8: c7 01 movw r24, r14 b8da: b6 01 movw r22, r12 b8dc: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> b8e0: 87 ff sbrs r24, 7 b8e2: 52 c0 rjmp .+164 ; 0xb988 b8e4: ce 01 movw r24, r28 b8e6: 01 96 adiw r24, 0x01 ; 1 b8e8: 7c 01 movw r14, r24 //SERIAL_ECHOLNPGM("LOW"); for (uint8_t i = 0; i < 3; i++) { b8ea: d1 2c mov r13, r1 st_current_set(i, current_low[i]); b8ec: f7 01 movw r30, r14 b8ee: 61 91 ld r22, Z+ b8f0: 71 91 ld r23, Z+ b8f2: 81 91 ld r24, Z+ b8f4: 91 91 ld r25, Z+ b8f6: 7f 01 movw r14, r30 b8f8: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> b8fc: 8d 2d mov r24, r13 b8fe: 0f 94 5e 1a call 0x234bc ; 0x234bc //SERIAL_ECHOLNPGM("Currents updated: "); if (destination[Z_AXIS] < Z_SILENT) { //SERIAL_ECHOLNPGM("LOW"); for (uint8_t i = 0; i < 3; i++) { b902: d3 94 inc r13 b904: f3 e0 ldi r31, 0x03 ; 3 b906: df 12 cpse r13, r31 b908: f1 cf rjmp .-30 ; 0xb8ec } } #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 void get_coordinates() { for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) { b90a: f9 8d ldd r31, Y+25 ; 0x19 b90c: ff 5f subi r31, 0xFF ; 255 b90e: f9 8f std Y+25, r31 ; 0x19 b910: 8a 8d ldd r24, Y+26 ; 0x1a b912: 88 0f add r24, r24 b914: 8a 8f std Y+26, r24 ; 0x1a b916: 94 e0 ldi r25, 0x04 ; 4 b918: 29 0e add r2, r25 b91a: 31 1c adc r3, r1 b91c: 0c 5f subi r16, 0xFC ; 252 b91e: 1f 4f sbci r17, 0xFF ; 255 b920: f4 30 cpi r31, 0x04 ; 4 b922: 09 f0 breq .+2 ; 0xb926 b924: 40 cf rjmp .-384 ; 0xb7a6 if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents(); #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 } else destination[i] = current_position[i]; //Are these else lines really needed? } if(code_seen('F')) { b926: 86 e4 ldi r24, 0x46 ; 70 b928: 0e 94 f5 55 call 0xabea ; 0xabea b92c: 88 23 and r24, r24 b92e: 99 f0 breq .+38 ; 0xb956 const float next_feedrate = code_value(); b930: 0e 94 85 5a call 0xb50a ; 0xb50a b934: 6b 01 movw r12, r22 b936: 7c 01 movw r14, r24 if(next_feedrate > 0.f) feedrate = next_feedrate; b938: 20 e0 ldi r18, 0x00 ; 0 b93a: 30 e0 ldi r19, 0x00 ; 0 b93c: a9 01 movw r20, r18 b93e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> b942: 18 16 cp r1, r24 b944: 44 f4 brge .+16 ; 0xb956 b946: c0 92 7a 02 sts 0x027A, r12 ; 0x80027a b94a: d0 92 7b 02 sts 0x027B, r13 ; 0x80027b b94e: e0 92 7c 02 sts 0x027C, r14 ; 0x80027c b952: f0 92 7d 02 sts 0x027D, r15 ; 0x80027d } } b956: a1 96 adiw r28, 0x21 ; 33 b958: 0f b6 in r0, 0x3f ; 63 b95a: f8 94 cli b95c: de bf out 0x3e, r29 ; 62 b95e: 0f be out 0x3f, r0 ; 63 b960: cd bf out 0x3d, r28 ; 61 b962: df 91 pop r29 b964: cf 91 pop r28 b966: 1f 91 pop r17 b968: 0f 91 pop r16 b96a: ff 90 pop r15 b96c: ef 90 pop r14 b96e: df 90 pop r13 b970: cf 90 pop r12 b972: bf 90 pop r11 b974: af 90 pop r10 b976: 9f 90 pop r9 b978: 8f 90 pop r8 b97a: 7f 90 pop r7 b97c: 6f 90 pop r6 b97e: 5f 90 pop r5 b980: 4f 90 pop r4 b982: 3f 90 pop r3 b984: 2f 90 pop r2 b986: 08 95 ret /*MYSERIAL.print(int(i)); SERIAL_ECHOPGM(": "); MYSERIAL.println(current_low[i]);*/ } } else if (destination[Z_AXIS] > Z_HIGH_POWER) { b988: 20 e0 ldi r18, 0x00 ; 0 b98a: 30 e0 ldi r19, 0x00 ; 0 b98c: 48 e4 ldi r20, 0x48 ; 72 b98e: 53 e4 ldi r21, 0x43 ; 67 b990: c7 01 movw r24, r14 b992: b6 01 movw r22, r12 b994: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> b998: 18 16 cp r1, r24 b99a: a4 f4 brge .+40 ; 0xb9c4 b99c: ce 01 movw r24, r28 b99e: 0d 96 adiw r24, 0x0d ; 13 b9a0: 7c 01 movw r14, r24 //SERIAL_ECHOLNPGM("HIGH"); for (uint8_t i = 0; i < 3; i++) { b9a2: d1 2c mov r13, r1 st_current_set(i, current_high[i]); b9a4: f7 01 movw r30, r14 b9a6: 61 91 ld r22, Z+ b9a8: 71 91 ld r23, Z+ b9aa: 81 91 ld r24, Z+ b9ac: 91 91 ld r25, Z+ b9ae: 7f 01 movw r14, r30 b9b0: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> b9b4: 8d 2d mov r24, r13 b9b6: 0f 94 5e 1a call 0x234bc ; 0x234bc MYSERIAL.println(current_low[i]);*/ } } else if (destination[Z_AXIS] > Z_HIGH_POWER) { //SERIAL_ECHOLNPGM("HIGH"); for (uint8_t i = 0; i < 3; i++) { b9ba: d3 94 inc r13 b9bc: f3 e0 ldi r31, 0x03 ; 3 b9be: df 12 cpse r13, r31 b9c0: f1 cf rjmp .-30 ; 0xb9a4 b9c2: a3 cf rjmp .-186 ; 0xb90a b9c4: ce 01 movw r24, r28 b9c6: 01 96 adiw r24, 0x01 ; 1 b9c8: 99 a3 std Y+33, r25 ; 0x21 b9ca: 88 a3 std Y+32, r24 ; 0x20 b9cc: fe 01 movw r30, r28 b9ce: 3d 96 adiw r30, 0x0d ; 13 b9d0: ff 8f std Y+31, r31 ; 0x1f b9d2: ee 8f std Y+30, r30 ; 0x1e SERIAL_ECHOPGM(": "); MYSERIAL.println(current_high[i]);*/ } } else { for (uint8_t i = 0; i < 3; i++) { b9d4: 1b 8e std Y+27, r1 ; 0x1b float q = current_low[i] - Z_SILENT*((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT)); b9d6: e8 a1 ldd r30, Y+32 ; 0x20 b9d8: f9 a1 ldd r31, Y+33 ; 0x21 b9da: c1 90 ld r12, Z+ b9dc: d1 90 ld r13, Z+ b9de: e1 90 ld r14, Z+ b9e0: f1 90 ld r15, Z+ b9e2: f9 a3 std Y+33, r31 ; 0x21 b9e4: e8 a3 std Y+32, r30 ; 0x20 b9e6: ee 8d ldd r30, Y+30 ; 0x1e b9e8: ff 8d ldd r31, Y+31 ; 0x1f b9ea: 61 91 ld r22, Z+ b9ec: 71 91 ld r23, Z+ b9ee: 81 91 ld r24, Z+ b9f0: 91 91 ld r25, Z+ b9f2: ff 8f std Y+31, r31 ; 0x1f b9f4: ee 8f std Y+30, r30 ; 0x1e b9f6: a7 01 movw r20, r14 b9f8: 96 01 movw r18, r12 b9fa: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> b9fe: 20 e0 ldi r18, 0x00 ; 0 ba00: 30 e0 ldi r19, 0x00 ; 0 ba02: 48 e4 ldi r20, 0x48 ; 72 ba04: 53 e4 ldi r21, 0x43 ; 67 ba06: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> ba0a: 4b 01 movw r8, r22 ba0c: 5c 01 movw r10, r24 tmp_motor[i] = ((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT))*destination[Z_AXIS] + q; ba0e: 20 91 31 06 lds r18, 0x0631 ; 0x800631 ba12: 30 91 32 06 lds r19, 0x0632 ; 0x800632 ba16: 40 91 33 06 lds r20, 0x0633 ; 0x800633 ba1a: 50 91 34 06 lds r21, 0x0634 ; 0x800634 ba1e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> ba22: 2b 01 movw r4, r22 ba24: 3c 01 movw r6, r24 MYSERIAL.println(current_high[i]);*/ } } else { for (uint8_t i = 0; i < 3; i++) { float q = current_low[i] - Z_SILENT*((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT)); ba26: 20 e0 ldi r18, 0x00 ; 0 ba28: 30 e0 ldi r19, 0x00 ; 0 ba2a: a9 01 movw r20, r18 ba2c: c5 01 movw r24, r10 ba2e: b4 01 movw r22, r8 ba30: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> ba34: 9b 01 movw r18, r22 ba36: ac 01 movw r20, r24 ba38: c7 01 movw r24, r14 ba3a: b6 01 movw r22, r12 ba3c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> ba40: 9b 01 movw r18, r22 ba42: ac 01 movw r20, r24 tmp_motor[i] = ((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT))*destination[Z_AXIS] + q; ba44: c3 01 movw r24, r6 ba46: b2 01 movw r22, r4 ba48: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> st_current_set(i, tmp_motor[i]); ba4c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> ba50: 8b 8d ldd r24, Y+27 ; 0x1b ba52: 0f 94 5e 1a call 0x234bc ; 0x234bc SERIAL_ECHOPGM(": "); MYSERIAL.println(current_high[i]);*/ } } else { for (uint8_t i = 0; i < 3; i++) { ba56: fb 8d ldd r31, Y+27 ; 0x1b ba58: ff 5f subi r31, 0xFF ; 255 ba5a: fb 8f std Y+27, r31 ; 0x1b ba5c: f3 30 cpi r31, 0x03 ; 3 ba5e: 09 f0 breq .+2 ; 0xba62 ba60: ba cf rjmp .-140 ; 0xb9d6 ba62: 53 cf rjmp .-346 ; 0xb90a destination[i] += current_position[i]; #if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents(); #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 } else destination[i] = current_position[i]; //Are these else lines really needed? ba64: f1 01 movw r30, r2 ba66: 80 81 ld r24, Z ba68: 91 81 ldd r25, Z+1 ; 0x01 ba6a: a2 81 ldd r26, Z+2 ; 0x02 ba6c: b3 81 ldd r27, Z+3 ; 0x03 ba6e: f8 01 movw r30, r16 ba70: 80 83 st Z, r24 ba72: 91 83 std Z+1, r25 ; 0x01 ba74: a2 83 std Z+2, r26 ; 0x02 ba76: b3 83 std Z+3, r27 ; 0x03 ba78: 48 cf rjmp .-368 ; 0xb90a } } #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 void get_coordinates() { for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) { ba7a: ea 8d ldd r30, Y+26 ; 0x1a ba7c: ee 0f add r30, r30 ba7e: ea 8f std Y+26, r30 ; 0x1a ba80: f4 e0 ldi r31, 0x04 ; 4 ba82: 2f 0e add r2, r31 ba84: 31 1c adc r3, r1 ba86: 0c 5f subi r16, 0xFC ; 252 ba88: 1f 4f sbci r17, 0xFF ; 255 ba8a: 83 e0 ldi r24, 0x03 ; 3 ba8c: 89 8f std Y+25, r24 ; 0x19 ba8e: 8b ce rjmp .-746 ; 0xb7a6 0000ba90 : #define DBG(args...) printf_P(args) inline void print_hex_nibble(uint8_t val) { putchar((val > 9)?(val - 10 + 'a'):(val + '0')); ba90: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> ba94: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> ba98: 90 e0 ldi r25, 0x00 ; 0 ba9a: 8a 30 cpi r24, 0x0A ; 10 ba9c: 20 f0 brcs .+8 ; 0xbaa6 ba9e: 89 5a subi r24, 0xA9 ; 169 baa0: 9f 4f sbci r25, 0xFF ; 255 baa2: 0d 94 48 a2 jmp 0x34490 ; 0x34490 baa6: c0 96 adiw r24, 0x30 ; 48 baa8: fc cf rjmp .-8 ; 0xbaa2 0000baaa : WRITE(LCD_PINS_D0, value & 0x01); WRITE(LCD_PINS_D1, value & 0x02); WRITE(LCD_PINS_D2, value & 0x04); WRITE(LCD_PINS_D3, value & 0x08); #endif WRITE(LCD_PINS_D4, value & 0x10); baaa: 84 ff sbrs r24, 4 baac: 18 c0 rjmp .+48 ; 0xbade baae: 5a 9a sbi 0x0b, 2 ; 11 WRITE(LCD_PINS_D5, value & 0x20); bab0: 85 ff sbrs r24, 5 bab2: 17 c0 rjmp .+46 ; 0xbae2 bab4: a4 9a sbi 0x14, 4 ; 20 WRITE(LCD_PINS_D6, value & 0x40); bab6: 2f b7 in r18, 0x3f ; 63 bab8: 86 ff sbrs r24, 6 baba: 15 c0 rjmp .+42 ; 0xbae6 babc: f8 94 cli babe: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> bac2: 90 68 ori r25, 0x80 ; 128 bac4: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> bac8: 2f bf out 0x3f, r18 ; 63 WRITE(LCD_PINS_D7, value & 0x80); baca: 87 ff sbrs r24, 7 bacc: 11 c0 rjmp .+34 ; 0xbaf0 bace: a3 9a sbi 0x14, 3 ; 20 static void lcd_print_custom(uint8_t c); static void lcd_invalidate_custom_characters(); static void lcd_pulseEnable(void) { WRITE(LCD_PINS_ENABLE,HIGH); bad0: 5b 9a sbi 0x0b, 3 ; 11 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); bad2: 85 e0 ldi r24, 0x05 ; 5 bad4: 8a 95 dec r24 bad6: f1 f7 brne .-4 ; 0xbad4 bad8: 00 00 nop _delay_us(1); // enable pulse must be >450ns WRITE(LCD_PINS_ENABLE,LOW); bada: 5b 98 cbi 0x0b, 3 ; 11 WRITE(LCD_PINS_D5, value & 0x20); WRITE(LCD_PINS_D6, value & 0x40); WRITE(LCD_PINS_D7, value & 0x80); lcd_pulseEnable(); } badc: 08 95 ret WRITE(LCD_PINS_D0, value & 0x01); WRITE(LCD_PINS_D1, value & 0x02); WRITE(LCD_PINS_D2, value & 0x04); WRITE(LCD_PINS_D3, value & 0x08); #endif WRITE(LCD_PINS_D4, value & 0x10); bade: 5a 98 cbi 0x0b, 2 ; 11 bae0: e7 cf rjmp .-50 ; 0xbab0 WRITE(LCD_PINS_D5, value & 0x20); bae2: a4 98 cbi 0x14, 4 ; 20 bae4: e8 cf rjmp .-48 ; 0xbab6 WRITE(LCD_PINS_D6, value & 0x40); bae6: f8 94 cli bae8: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> baec: 9f 77 andi r25, 0x7F ; 127 baee: ea cf rjmp .-44 ; 0xbac4 WRITE(LCD_PINS_D7, value & 0x80); baf0: a3 98 cbi 0x14, 3 ; 20 baf2: ee cf rjmp .-36 ; 0xbad0 0000baf4 : lcd_pulseEnable(); } static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY) { baf4: 0f 93 push r16 baf6: 1f 93 push r17 baf8: cf 93 push r28 bafa: df 93 push r29 bafc: c8 2f mov r28, r24 bafe: d6 2f mov r29, r22 bb00: 8a 01 movw r16, r20 WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG); bb02: 60 ff sbrs r22, 0 bb04: 15 c0 rjmp .+42 ; 0xbb30 bb06: 5d 9a sbi 0x0b, 5 ; 11 bb08: 8a e1 ldi r24, 0x1A ; 26 bb0a: 8a 95 dec r24 bb0c: f1 f7 brne .-4 ; 0xbb0a bb0e: 00 c0 rjmp .+0 ; 0xbb10 _delay_us(5); lcd_writebits(data); bb10: 8c 2f mov r24, r28 bb12: 0e 94 55 5d call 0xbaaa ; 0xbaaa #ifndef LCD_8BIT if (!(flags & LCD_HALF_FLAG)) { bb16: d1 fd sbrc r29, 1 bb18: 04 c0 rjmp .+8 ; 0xbb22 // _delay_us(LCD_DEFAULT_DELAY); // should not be needed when sending a two nibble instruction. lcd_writebits((data << 4) | (data >> 4)); //force efficient swap opcode even though the lower nibble is ignored in this case bb1a: 8c 2f mov r24, r28 bb1c: 82 95 swap r24 bb1e: 0e 94 55 5d call 0xbaaa ; 0xbaaa } #endif delayMicroseconds(duration); bb22: c8 01 movw r24, r16 } bb24: df 91 pop r29 bb26: cf 91 pop r28 bb28: 1f 91 pop r17 bb2a: 0f 91 pop r16 if (!(flags & LCD_HALF_FLAG)) { // _delay_us(LCD_DEFAULT_DELAY); // should not be needed when sending a two nibble instruction. lcd_writebits((data << 4) | (data >> 4)); //force efficient swap opcode even though the lower nibble is ignored in this case } #endif delayMicroseconds(duration); bb2c: 0c 94 db d2 jmp 0x1a5b6 ; 0x1a5b6 lcd_pulseEnable(); } static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY) { WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG); bb30: 5d 98 cbi 0x0b, 5 ; 11 bb32: ea cf rjmp .-44 ; 0xbb08 0000bb34 : return def; } return val; } void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) { bb34: cf 92 push r12 bb36: df 92 push r13 bb38: ef 92 push r14 bb3a: ff 92 push r15 bb3c: cf 93 push r28 bb3e: df 93 push r29 bb40: ec 01 movw r28, r24 bb42: 6a 01 movw r12, r20 bb44: 7b 01 movw r14, r22 if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32) bb46: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 bb4a: 6f 3f cpi r22, 0xFF ; 255 bb4c: 7f 4f sbci r23, 0xFF ; 255 bb4e: 8f 4f sbci r24, 0xFF ; 255 bb50: 9f 4f sbci r25, 0xFF ; 255 bb52: 59 f4 brne .+22 ; 0xbb6a if (active) { float previous_value = eeprom_read_float(dst); eeprom_float_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_float(dst, value); bb54: b7 01 movw r22, r14 bb56: a6 01 movw r20, r12 bb58: ce 01 movw r24, r28 } void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) { if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32) eeprom_write_float_notify(__p, def); } bb5a: df 91 pop r29 bb5c: cf 91 pop r28 bb5e: ff 90 pop r15 bb60: ef 90 pop r14 bb62: df 90 pop r13 bb64: cf 90 pop r12 if (active) { float previous_value = eeprom_read_float(dst); eeprom_float_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_float(dst, value); bb66: 0d 94 36 a4 jmp 0x3486c ; 0x3486c } void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) { if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32) eeprom_write_float_notify(__p, def); } bb6a: df 91 pop r29 bb6c: cf 91 pop r28 bb6e: ff 90 pop r15 bb70: ef 90 pop r14 bb72: df 90 pop r13 bb74: cf 90 pop r12 bb76: 08 95 ret 0000bb78 : } } void dcode_core(daddr_t addr_start, const daddr_t addr_end, const dcode_mem_t type, uint8_t dcode, const char* type_desc) { bb78: 7f 92 push r7 bb7a: 8f 92 push r8 bb7c: 9f 92 push r9 bb7e: af 92 push r10 bb80: bf 92 push r11 bb82: cf 92 push r12 bb84: df 92 push r13 bb86: ef 92 push r14 bb88: ff 92 push r15 bb8a: 0f 93 push r16 bb8c: 1f 93 push r17 bb8e: cf 93 push r28 bb90: df 93 push r29 bb92: cd b7 in r28, 0x3d ; 61 bb94: de b7 in r29, 0x3e ; 62 bb96: 60 97 sbiw r28, 0x10 ; 16 bb98: 0f b6 in r0, 0x3f ; 63 bb9a: f8 94 cli bb9c: de bf out 0x3e, r29 ; 62 bb9e: 0f be out 0x3f, r0 ; 63 bba0: cd bf out 0x3d, r28 ; 61 bba2: 5c 01 movw r10, r24 bba4: 6b 01 movw r12, r22 bba6: 74 2e mov r7, r20 KEEPALIVE_STATE(NOT_BUSY); bba8: 81 e0 ldi r24, 0x01 ; 1 bbaa: 80 93 78 02 sts 0x0278, r24 ; 0x800278 DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc); bbae: 1f 93 push r17 bbb0: 0f 93 push r16 bbb2: 1f 92 push r1 bbb4: 2f 93 push r18 bbb6: 8d e8 ldi r24, 0x8D ; 141 bbb8: 93 e6 ldi r25, 0x63 ; 99 bbba: 9f 93 push r25 bbbc: 8f 93 push r24 bbbe: 0f 94 a2 a2 call 0x34544 ; 0x34544 daddr_t count = -1; // RW the entire space by default if (code_seen('A')) bbc2: 81 e4 ldi r24, 0x41 ; 65 bbc4: 0e 94 f5 55 call 0xabea ; 0xabea bbc8: 0f 90 pop r0 bbca: 0f 90 pop r0 bbcc: 0f 90 pop r0 bbce: 0f 90 pop r0 bbd0: 0f 90 pop r0 bbd2: 0f 90 pop r0 bbd4: 88 23 and r24, r24 bbd6: 89 f0 breq .+34 ; 0xbbfa addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value(); bbd8: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb bbdc: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc bbe0: fc 01 movw r30, r24 bbe2: 21 81 ldd r18, Z+1 ; 0x01 bbe4: 28 37 cpi r18, 0x78 ; 120 bbe6: 09 f0 breq .+2 ; 0xbbea bbe8: 56 c0 rjmp .+172 ; 0xbc96 bbea: 40 e1 ldi r20, 0x10 ; 16 bbec: 50 e0 ldi r21, 0x00 ; 0 bbee: 70 e0 ldi r23, 0x00 ; 0 bbf0: 60 e0 ldi r22, 0x00 ; 0 bbf2: 02 96 adiw r24, 0x02 ; 2 bbf4: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 bbf8: 5b 01 movw r10, r22 if (code_seen('C')) bbfa: 83 e4 ldi r24, 0x43 ; 67 bbfc: 0e 94 f5 55 call 0xabea ; 0xabea bc00: 88 23 and r24, r24 bc02: 09 f4 brne .+2 ; 0xbc06 bc04: 4d c0 rjmp .+154 ; 0xbca0 count = code_value_long(); bc06: 0e 94 5d 56 call 0xacba ; 0xacba bc0a: 4b 01 movw r8, r22 bc0c: 75 01 movw r14, r10 bc0e: ca 14 cp r12, r10 bc10: db 04 cpc r13, r11 bc12: 08 f4 brcc .+2 ; 0xbc16 bc14: 76 01 movw r14, r12 if (addr_start > addr_end) addr_start = addr_end; if ((addr_start + count) > addr_end || (addr_start + count) < addr_start) bc16: c4 01 movw r24, r8 bc18: 8e 0d add r24, r14 bc1a: 9f 1d adc r25, r15 bc1c: c8 16 cp r12, r24 bc1e: d9 06 cpc r13, r25 bc20: 18 f0 brcs .+6 ; 0xbc28 bc22: 8e 15 cp r24, r14 bc24: 9f 05 cpc r25, r15 bc26: 18 f4 brcc .+6 ; 0xbc2e count = addr_end - addr_start; bc28: 46 01 movw r8, r12 bc2a: 8e 18 sub r8, r14 bc2c: 9f 08 sbc r9, r15 if (code_seen('X')) bc2e: 88 e5 ldi r24, 0x58 ; 88 bc30: 0e 94 f5 55 call 0xabea ; 0xabea bc34: 88 23 and r24, r24 bc36: 09 f4 brne .+2 ; 0xbc3a bc38: 71 c0 rjmp .+226 ; 0xbd1c { uint8_t data[16]; count = parse_hex(strchr_pointer + 1, data, 16); bc3a: 20 91 bb 04 lds r18, 0x04BB ; 0x8004bb bc3e: 30 91 bc 04 lds r19, 0x04BC ; 0x8004bc bc42: 2f 5f subi r18, 0xFF ; 255 bc44: 3f 4f sbci r19, 0xFF ; 255 bc46: ce 01 movw r24, r28 bc48: 01 96 adiw r24, 0x01 ; 1 bc4a: 5c 01 movw r10, r24 bc4c: dc 01 movw r26, r24 print_hex_byte(val & 0xFF); } int parse_hex(const char* hex, uint8_t* data, int count) { int parsed = 0; bc4e: d1 2c mov r13, r1 bc50: c1 2c mov r12, r1 bc52: f9 01 movw r30, r18 while (*hex) bc54: 80 81 ld r24, Z bc56: 2f 5f subi r18, 0xFF ; 255 bc58: 3f 4f sbci r19, 0xFF ; 255 bc5a: 88 23 and r24, r24 bc5c: b9 f1 breq .+110 ; 0xbccc { if (count && (parsed >= count)) break; bc5e: 90 e1 ldi r25, 0x10 ; 16 bc60: c9 16 cp r12, r25 bc62: d1 04 cpc r13, r1 bc64: 99 f1 breq .+102 ; 0xbccc char c = *(hex++); if (c == ' ') continue; bc66: 80 32 cpi r24, 0x20 ; 32 bc68: a1 f3 breq .-24 ; 0xbc52 if (c == '\n') break; bc6a: 8a 30 cpi r24, 0x0A ; 10 bc6c: 79 f1 breq .+94 ; 0xbccc uint8_t val = 0x00; if ((c >= '0') && (c <= '9')) val |= ((c - '0') << 4); bc6e: 90 ed ldi r25, 0xD0 ; 208 bc70: 98 0f add r25, r24 bc72: 9a 30 cpi r25, 0x0A ; 10 bc74: c8 f4 brcc .+50 ; 0xbca8 bc76: 82 95 swap r24 bc78: 80 7f andi r24, 0xF0 ; 240 else if ((c >= 'a') && (c <= 'f')) val |= ((c - 'a' + 10) << 4); else return -parsed; c = *(hex++); bc7a: 9f 01 movw r18, r30 bc7c: 2e 5f subi r18, 0xFE ; 254 bc7e: 3f 4f sbci r19, 0xFF ; 255 if ((c >= '0') && (c <= '9')) val |= (c - '0'); bc80: 91 81 ldd r25, Z+1 ; 0x01 bc82: 40 ed ldi r20, 0xD0 ; 208 bc84: 49 0f add r20, r25 bc86: 4a 30 cpi r20, 0x0A ; 10 bc88: b8 f4 brcc .+46 ; 0xbcb8 bc8a: 84 2b or r24, r20 else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10); else return -parsed; data[parsed] = val; bc8c: 8d 93 st X+, r24 parsed++; bc8e: ef ef ldi r30, 0xFF ; 255 bc90: ce 1a sub r12, r30 bc92: de 0a sbc r13, r30 bc94: de cf rjmp .-68 ; 0xbc52 { KEEPALIVE_STATE(NOT_BUSY); DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc); daddr_t count = -1; // RW the entire space by default if (code_seen('A')) addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value(); bc96: 0e 94 85 5a call 0xb50a ; 0xb50a bc9a: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> bc9e: ac cf rjmp .-168 ; 0xbbf8 void dcode_core(daddr_t addr_start, const daddr_t addr_end, const dcode_mem_t type, uint8_t dcode, const char* type_desc) { KEEPALIVE_STATE(NOT_BUSY); DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc); daddr_t count = -1; // RW the entire space by default bca0: 88 24 eor r8, r8 bca2: 8a 94 dec r8 bca4: 98 2c mov r9, r8 bca6: b2 cf rjmp .-156 ; 0xbc0c char c = *(hex++); if (c == ' ') continue; if (c == '\n') break; uint8_t val = 0x00; if ((c >= '0') && (c <= '9')) val |= ((c - '0') << 4); else if ((c >= 'a') && (c <= 'f')) val |= ((c - 'a' + 10) << 4); bca8: 9f e9 ldi r25, 0x9F ; 159 bcaa: 98 0f add r25, r24 bcac: 96 30 cpi r25, 0x06 ; 6 bcae: 58 f4 brcc .+22 ; 0xbcc6 bcb0: 82 95 swap r24 bcb2: 80 7f andi r24, 0xF0 ; 240 bcb4: 80 57 subi r24, 0x70 ; 112 bcb6: e1 cf rjmp .-62 ; 0xbc7a else return -parsed; c = *(hex++); if ((c >= '0') && (c <= '9')) val |= (c - '0'); else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10); bcb8: 4f e9 ldi r20, 0x9F ; 159 bcba: 49 0f add r20, r25 bcbc: 46 30 cpi r20, 0x06 ; 6 bcbe: 18 f4 brcc .+6 ; 0xbcc6 bcc0: 97 55 subi r25, 0x57 ; 87 bcc2: 89 2b or r24, r25 bcc4: e3 cf rjmp .-58 ; 0xbc8c else return -parsed; bcc6: d1 94 neg r13 bcc8: c1 94 neg r12 bcca: d1 08 sbc r13, r1 } // TODO: this only handles SRAM/EEPROM 16bit addresses void write_mem(uint16_t address, uint16_t count, const uint8_t* data, const dcode_mem_t type) { for (uint16_t i = 0; i < count; i++) bccc: 91 2c mov r9, r1 bcce: 81 2c mov r8, r1 bcd0: c8 14 cp r12, r8 bcd2: d9 04 cpc r13, r9 bcd4: 91 f0 breq .+36 ; 0xbcfa bcd6: f5 01 movw r30, r10 bcd8: 61 91 ld r22, Z+ bcda: 5f 01 movw r10, r30 bcdc: c4 01 movw r24, r8 bcde: 8e 0d add r24, r14 bce0: 9f 1d adc r25, r15 { switch (type) bce2: f1 e0 ldi r31, 0x01 ; 1 bce4: 7f 16 cp r7, r31 bce6: 31 f0 breq .+12 ; 0xbcf4 { case dcode_mem_t::sram: *((uint8_t*)address) = data[i]; break; bce8: fc 01 movw r30, r24 bcea: 60 83 st Z, r22 } // TODO: this only handles SRAM/EEPROM 16bit addresses void write_mem(uint16_t address, uint16_t count, const uint8_t* data, const dcode_mem_t type) { for (uint16_t i = 0; i < count; i++) bcec: ff ef ldi r31, 0xFF ; 255 bcee: 8f 1a sub r8, r31 bcf0: 9f 0a sbc r9, r31 bcf2: ee cf rjmp .-36 ; 0xbcd0 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); bcf4: 0f 94 28 a4 call 0x34850 ; 0x34850 bcf8: f9 cf rjmp .-14 ; 0xbcec count = parse_hex(strchr_pointer + 1, data, 16); write_mem(addr_start, count, data, type); #if DADDR_SIZE > 16 DBG(_N("%lu bytes written to %S at address 0x%04lx\n"), count, type_desc, addr_start); #else DBG(_N("%u bytes written to %S at address 0x%08x\n"), count, type_desc, addr_start); bcfa: ff 92 push r15 bcfc: ef 92 push r14 bcfe: 1f 93 push r17 bd00: 0f 93 push r16 bd02: 9f 92 push r9 bd04: 8f 92 push r8 bd06: 83 e6 ldi r24, 0x63 ; 99 bd08: 93 e6 ldi r25, 0x63 ; 99 bd0a: 9f 93 push r25 bd0c: 8f 93 push r24 bd0e: 0f 94 a2 a2 call 0x34544 ; 0x34544 bd12: 0f b6 in r0, 0x3f ; 63 bd14: f8 94 cli bd16: de bf out 0x3e, r29 ; 62 bd18: 0f be out 0x3f, r0 ; 63 bd1a: cd bf out 0x3d, r28 ; 61 #endif } print_mem(addr_start, count, type); bd1c: 47 2d mov r20, r7 bd1e: b4 01 movw r22, r8 bd20: c7 01 movw r24, r14 } bd22: 60 96 adiw r28, 0x10 ; 16 bd24: 0f b6 in r0, 0x3f ; 63 bd26: f8 94 cli bd28: de bf out 0x3e, r29 ; 62 bd2a: 0f be out 0x3f, r0 ; 63 bd2c: cd bf out 0x3d, r28 ; 61 bd2e: df 91 pop r29 bd30: cf 91 pop r28 bd32: 1f 91 pop r17 bd34: 0f 91 pop r16 bd36: ff 90 pop r15 bd38: ef 90 pop r14 bd3a: df 90 pop r13 bd3c: cf 90 pop r12 bd3e: bf 90 pop r11 bd40: af 90 pop r10 bd42: 9f 90 pop r9 bd44: 8f 90 pop r8 bd46: 7f 90 pop r7 DBG(_N("%lu bytes written to %S at address 0x%04lx\n"), count, type_desc, addr_start); #else DBG(_N("%u bytes written to %S at address 0x%08x\n"), count, type_desc, addr_start); #endif } print_mem(addr_start, count, type); bd48: 0d 94 d2 78 jmp 0x2f1a4 ; 0x2f1a4 0000bd4c : #endif //NEW_XYZCAL // Shift a Z axis by a given delta. // To replace loading of the babystep correction. static void shift_z(float delta) { bd4c: 0f 93 push r16 bd4e: 1f 93 push r17 bd50: cf 93 push r28 bd52: df 93 push r29 bd54: 00 d0 rcall .+0 ; 0xbd56 bd56: 1f 92 push r1 bd58: cd b7 in r28, 0x3d ; 61 bd5a: de b7 in r29, 0x3e ; 62 bd5c: 9b 01 movw r18, r22 bd5e: ac 01 movw r20, r24 const float curpos_z = current_position[Z_AXIS]; bd60: 01 e6 ldi r16, 0x61 ; 97 bd62: 12 e1 ldi r17, 0x12 ; 18 bd64: f8 01 movw r30, r16 bd66: 60 85 ldd r22, Z+8 ; 0x08 bd68: 71 85 ldd r23, Z+9 ; 0x09 bd6a: 82 85 ldd r24, Z+10 ; 0x0a bd6c: 93 85 ldd r25, Z+11 ; 0x0b bd6e: 69 83 std Y+1, r22 ; 0x01 bd70: 7a 83 std Y+2, r23 ; 0x02 bd72: 8b 83 std Y+3, r24 ; 0x03 bd74: 9c 83 std Y+4, r25 ; 0x04 current_position[Z_AXIS] -= delta; bd76: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> bd7a: f8 01 movw r30, r16 bd7c: 60 87 std Z+8, r22 ; 0x08 bd7e: 71 87 std Z+9, r23 ; 0x09 bd80: 82 87 std Z+10, r24 ; 0x0a bd82: 93 87 std Z+11, r25 ; 0x0b plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); bd84: 65 e5 ldi r22, 0x55 ; 85 bd86: 75 e5 ldi r23, 0x55 ; 85 bd88: 85 e5 ldi r24, 0x55 ; 85 bd8a: 91 e4 ldi r25, 0x41 ; 65 bd8c: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); bd90: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[Z_AXIS] = curpos_z; bd94: 89 81 ldd r24, Y+1 ; 0x01 bd96: 9a 81 ldd r25, Y+2 ; 0x02 bd98: ab 81 ldd r26, Y+3 ; 0x03 bd9a: bc 81 ldd r27, Y+4 ; 0x04 bd9c: f8 01 movw r30, r16 bd9e: 80 87 std Z+8, r24 ; 0x08 bda0: 91 87 std Z+9, r25 ; 0x09 bda2: a2 87 std Z+10, r26 ; 0x0a bda4: b3 87 std Z+11, r27 ; 0x0b plan_set_z_position(curpos_z); bda6: ce 01 movw r24, r28 bda8: 01 96 adiw r24, 0x01 ; 1 bdaa: 0f 94 0c 3d call 0x27a18 ; 0x27a18 } bdae: 0f 90 pop r0 bdb0: 0f 90 pop r0 bdb2: 0f 90 pop r0 bdb4: 0f 90 pop r0 bdb6: df 91 pop r29 bdb8: cf 91 pop r28 bdba: 1f 91 pop r17 bdbc: 0f 91 pop r16 bdbe: 08 95 ret 0000bdc0 : #define MESH_BED_CALIBRATION_SHOW_LCD float __attribute__((noinline)) BED_X(const uint8_t col) { return ((float)col * x_mesh_density + BED_X0); bdc0: 68 2f mov r22, r24 bdc2: 70 e0 ldi r23, 0x00 ; 0 bdc4: 90 e0 ldi r25, 0x00 ; 0 bdc6: 80 e0 ldi r24, 0x00 ; 0 bdc8: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> bdcc: 20 e0 ldi r18, 0x00 ; 0 bdce: 30 e0 ldi r19, 0x00 ; 0 bdd0: 48 e0 ldi r20, 0x08 ; 8 bdd2: 52 e4 ldi r21, 0x42 ; 66 bdd4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> bdd8: 20 e0 ldi r18, 0x00 ; 0 bdda: 30 e0 ldi r19, 0x00 ; 0 bddc: 40 e8 ldi r20, 0x80 ; 128 bdde: 5f e3 ldi r21, 0x3F ; 63 bde0: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> } bde4: 08 95 ret 0000bde6 : plan_set_position_curposXYZE(); } static inline void update_current_position_z() { current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); bde6: 82 e0 ldi r24, 0x02 ; 2 bde8: 0f 94 e7 1a call 0x235ce ; 0x235ce bdec: 60 93 69 12 sts 0x1269, r22 ; 0x801269 bdf0: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a bdf4: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b bdf8: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c plan_set_z_position(current_position[Z_AXIS]); bdfc: 89 e6 ldi r24, 0x69 ; 105 bdfe: 92 e1 ldi r25, 0x12 ; 18 be00: 0d 94 0c 3d jmp 0x27a18 ; 0x27a18 0000be04 : * this will get the absolute coordinates from the servos, * applies the inverse world2machine transformation * and stores the result into current_position[x,y]. */ void world2machine_update_current() { be04: 4f 92 push r4 be06: 5f 92 push r5 be08: 6f 92 push r6 be0a: 7f 92 push r7 be0c: 8f 92 push r8 be0e: 9f 92 push r9 be10: af 92 push r10 be12: bf 92 push r11 be14: cf 92 push r12 be16: df 92 push r13 be18: ef 92 push r14 be1a: ff 92 push r15 be1c: 0f 93 push r16 be1e: 1f 93 push r17 be20: cf 93 push r28 be22: df 93 push r29 float x = current_position[X_AXIS] - world2machine_shift[0]; be24: 01 e6 ldi r16, 0x61 ; 97 be26: 12 e1 ldi r17, 0x12 ; 18 be28: ca e9 ldi r28, 0x9A ; 154 be2a: d4 e0 ldi r29, 0x04 ; 4 be2c: 28 81 ld r18, Y be2e: 39 81 ldd r19, Y+1 ; 0x01 be30: 4a 81 ldd r20, Y+2 ; 0x02 be32: 5b 81 ldd r21, Y+3 ; 0x03 be34: f8 01 movw r30, r16 be36: 60 81 ld r22, Z be38: 71 81 ldd r23, Z+1 ; 0x01 be3a: 82 81 ldd r24, Z+2 ; 0x02 be3c: 93 81 ldd r25, Z+3 ; 0x03 be3e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> be42: 4b 01 movw r8, r22 be44: 5c 01 movw r10, r24 float y = current_position[Y_AXIS] - world2machine_shift[1]; be46: 2c 81 ldd r18, Y+4 ; 0x04 be48: 3d 81 ldd r19, Y+5 ; 0x05 be4a: 4e 81 ldd r20, Y+6 ; 0x06 be4c: 5f 81 ldd r21, Y+7 ; 0x07 be4e: f8 01 movw r30, r16 be50: 64 81 ldd r22, Z+4 ; 0x04 be52: 75 81 ldd r23, Z+5 ; 0x05 be54: 86 81 ldd r24, Z+6 ; 0x06 be56: 97 81 ldd r25, Z+7 ; 0x07 be58: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> be5c: 6b 01 movw r12, r22 be5e: 7c 01 movw r14, r24 current_position[X_AXIS] = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; be60: ca e8 ldi r28, 0x8A ; 138 be62: d4 e0 ldi r29, 0x04 ; 4 be64: 28 81 ld r18, Y be66: 39 81 ldd r19, Y+1 ; 0x01 be68: 4a 81 ldd r20, Y+2 ; 0x02 be6a: 5b 81 ldd r21, Y+3 ; 0x03 be6c: c5 01 movw r24, r10 be6e: b4 01 movw r22, r8 be70: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> be74: 2b 01 movw r4, r22 be76: 3c 01 movw r6, r24 be78: 2c 81 ldd r18, Y+4 ; 0x04 be7a: 3d 81 ldd r19, Y+5 ; 0x05 be7c: 4e 81 ldd r20, Y+6 ; 0x06 be7e: 5f 81 ldd r21, Y+7 ; 0x07 be80: c7 01 movw r24, r14 be82: b6 01 movw r22, r12 be84: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> be88: 9b 01 movw r18, r22 be8a: ac 01 movw r20, r24 be8c: c3 01 movw r24, r6 be8e: b2 01 movw r22, r4 be90: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> be94: f8 01 movw r30, r16 be96: 60 83 st Z, r22 be98: 71 83 std Z+1, r23 ; 0x01 be9a: 82 83 std Z+2, r24 ; 0x02 be9c: 93 83 std Z+3, r25 ; 0x03 current_position[Y_AXIS] = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; be9e: 28 85 ldd r18, Y+8 ; 0x08 bea0: 39 85 ldd r19, Y+9 ; 0x09 bea2: 4a 85 ldd r20, Y+10 ; 0x0a bea4: 5b 85 ldd r21, Y+11 ; 0x0b bea6: c5 01 movw r24, r10 bea8: b4 01 movw r22, r8 beaa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> beae: 4b 01 movw r8, r22 beb0: 5c 01 movw r10, r24 beb2: 2c 85 ldd r18, Y+12 ; 0x0c beb4: 3d 85 ldd r19, Y+13 ; 0x0d beb6: 4e 85 ldd r20, Y+14 ; 0x0e beb8: 5f 85 ldd r21, Y+15 ; 0x0f beba: c7 01 movw r24, r14 bebc: b6 01 movw r22, r12 bebe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> bec2: 9b 01 movw r18, r22 bec4: ac 01 movw r20, r24 bec6: c5 01 movw r24, r10 bec8: b4 01 movw r22, r8 beca: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> bece: f8 01 movw r30, r16 bed0: 64 83 std Z+4, r22 ; 0x04 bed2: 75 83 std Z+5, r23 ; 0x05 bed4: 86 83 std Z+6, r24 ; 0x06 bed6: 97 83 std Z+7, r25 ; 0x07 } bed8: df 91 pop r29 beda: cf 91 pop r28 bedc: 1f 91 pop r17 bede: 0f 91 pop r16 bee0: ff 90 pop r15 bee2: ef 90 pop r14 bee4: df 90 pop r13 bee6: cf 90 pop r12 bee8: bf 90 pop r11 beea: af 90 pop r10 beec: 9f 90 pop r9 beee: 8f 90 pop r8 bef0: 7f 90 pop r7 bef2: 6f 90 pop r6 bef4: 5f 90 pop r5 bef6: 4f 90 pop r4 bef8: 08 95 ret 0000befa : } return false; } static void world2machine_update(const float vec_x[2], const float vec_y[2], const float cntr[2]) { befa: 4f 92 push r4 befc: 5f 92 push r5 befe: 6f 92 push r6 bf00: 7f 92 push r7 bf02: 8f 92 push r8 bf04: 9f 92 push r9 bf06: af 92 push r10 bf08: bf 92 push r11 bf0a: cf 92 push r12 bf0c: df 92 push r13 bf0e: ef 92 push r14 bf10: ff 92 push r15 bf12: 0f 93 push r16 bf14: 1f 93 push r17 bf16: cf 93 push r28 bf18: df 93 push r29 bf1a: 00 d0 rcall .+0 ; 0xbf1c bf1c: 00 d0 rcall .+0 ; 0xbf1e bf1e: 1f 92 push r1 bf20: 1f 92 push r1 bf22: cd b7 in r28, 0x3d ; 61 bf24: de b7 in r29, 0x3e ; 62 world2machine_rotation_and_skew[0][0] = vec_x[0]; bf26: dc 01 movw r26, r24 bf28: cd 90 ld r12, X+ bf2a: dd 90 ld r13, X+ bf2c: ed 90 ld r14, X+ bf2e: fc 90 ld r15, X bf30: 13 97 sbiw r26, 0x03 ; 3 bf32: c0 92 6f 03 sts 0x036F, r12 ; 0x80036f bf36: d0 92 70 03 sts 0x0370, r13 ; 0x800370 bf3a: e0 92 71 03 sts 0x0371, r14 ; 0x800371 bf3e: f0 92 72 03 sts 0x0372, r15 ; 0x800372 world2machine_rotation_and_skew[1][0] = vec_x[1]; bf42: 14 96 adiw r26, 0x04 ; 4 bf44: 0d 91 ld r16, X+ bf46: 1d 91 ld r17, X+ bf48: 2d 91 ld r18, X+ bf4a: 3c 91 ld r19, X bf4c: 17 97 sbiw r26, 0x07 ; 7 bf4e: 09 83 std Y+1, r16 ; 0x01 bf50: 1a 83 std Y+2, r17 ; 0x02 bf52: 2b 83 std Y+3, r18 ; 0x03 bf54: 3c 83 std Y+4, r19 ; 0x04 bf56: 00 93 77 03 sts 0x0377, r16 ; 0x800377 bf5a: 10 93 78 03 sts 0x0378, r17 ; 0x800378 bf5e: 20 93 79 03 sts 0x0379, r18 ; 0x800379 bf62: 30 93 7a 03 sts 0x037A, r19 ; 0x80037a world2machine_rotation_and_skew[0][1] = vec_y[0]; bf66: db 01 movw r26, r22 bf68: 0d 91 ld r16, X+ bf6a: 1d 91 ld r17, X+ bf6c: 2d 91 ld r18, X+ bf6e: 3c 91 ld r19, X bf70: 13 97 sbiw r26, 0x03 ; 3 bf72: 0d 83 std Y+5, r16 ; 0x05 bf74: 1e 83 std Y+6, r17 ; 0x06 bf76: 2f 83 std Y+7, r18 ; 0x07 bf78: 38 87 std Y+8, r19 ; 0x08 bf7a: 00 93 73 03 sts 0x0373, r16 ; 0x800373 bf7e: 10 93 74 03 sts 0x0374, r17 ; 0x800374 bf82: 20 93 75 03 sts 0x0375, r18 ; 0x800375 bf86: 30 93 76 03 sts 0x0376, r19 ; 0x800376 world2machine_rotation_and_skew[1][1] = vec_y[1]; bf8a: 14 96 adiw r26, 0x04 ; 4 bf8c: 4d 90 ld r4, X+ bf8e: 5d 90 ld r5, X+ bf90: 6d 90 ld r6, X+ bf92: 7c 90 ld r7, X bf94: 17 97 sbiw r26, 0x07 ; 7 bf96: 40 92 7b 03 sts 0x037B, r4 ; 0x80037b bf9a: 50 92 7c 03 sts 0x037C, r5 ; 0x80037c bf9e: 60 92 7d 03 sts 0x037D, r6 ; 0x80037d bfa2: 70 92 7e 03 sts 0x037E, r7 ; 0x80037e world2machine_shift[0] = cntr[0]; bfa6: fa 01 movw r30, r20 bfa8: 60 81 ld r22, Z bfaa: 71 81 ldd r23, Z+1 ; 0x01 bfac: 82 81 ldd r24, Z+2 ; 0x02 bfae: 93 81 ldd r25, Z+3 ; 0x03 bfb0: 60 93 9a 04 sts 0x049A, r22 ; 0x80049a bfb4: 70 93 9b 04 sts 0x049B, r23 ; 0x80049b bfb8: 80 93 9c 04 sts 0x049C, r24 ; 0x80049c bfbc: 90 93 9d 04 sts 0x049D, r25 ; 0x80049d world2machine_shift[1] = cntr[1]; bfc0: 84 80 ldd r8, Z+4 ; 0x04 bfc2: 95 80 ldd r9, Z+5 ; 0x05 bfc4: a6 80 ldd r10, Z+6 ; 0x06 bfc6: b7 80 ldd r11, Z+7 ; 0x07 bfc8: 80 92 9e 04 sts 0x049E, r8 ; 0x80049e bfcc: 90 92 9f 04 sts 0x049F, r9 ; 0x80049f bfd0: a0 92 a0 04 sts 0x04A0, r10 ; 0x8004a0 bfd4: b0 92 a1 04 sts 0x04A1, r11 ; 0x8004a1 // No correction. world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE; if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f) bfd8: 20 e0 ldi r18, 0x00 ; 0 bfda: 30 e0 ldi r19, 0x00 ; 0 bfdc: a9 01 movw r20, r18 bfde: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> bfe2: 81 11 cpse r24, r1 bfe4: aa c0 rjmp .+340 ; 0xc13a bfe6: 20 e0 ldi r18, 0x00 ; 0 bfe8: 30 e0 ldi r19, 0x00 ; 0 bfea: a9 01 movw r20, r18 bfec: c5 01 movw r24, r10 bfee: b4 01 movw r22, r8 bff0: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> bff4: 81 11 cpse r24, r1 bff6: a1 c0 rjmp .+322 ; 0xc13a world2machine_rotation_and_skew[0][1] = vec_y[0]; world2machine_rotation_and_skew[1][1] = vec_y[1]; world2machine_shift[0] = cntr[0]; world2machine_shift[1] = cntr[1]; // No correction. world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE; bff8: 10 92 a2 04 sts 0x04A2, r1 ; 0x8004a2 if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f) // Shift correction. world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SHIFT; if (world2machine_rotation_and_skew[0][0] != 1.f || world2machine_rotation_and_skew[0][1] != 0.f || bffc: 20 e0 ldi r18, 0x00 ; 0 bffe: 30 e0 ldi r19, 0x00 ; 0 c000: 40 e8 ldi r20, 0x80 ; 128 c002: 5f e3 ldi r21, 0x3F ; 63 c004: c7 01 movw r24, r14 c006: b6 01 movw r22, r12 c008: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> c00c: 81 11 cpse r24, r1 c00e: 21 c0 rjmp .+66 ; 0xc052 c010: 20 e0 ldi r18, 0x00 ; 0 c012: 30 e0 ldi r19, 0x00 ; 0 c014: a9 01 movw r20, r18 c016: 6d 81 ldd r22, Y+5 ; 0x05 c018: 7e 81 ldd r23, Y+6 ; 0x06 c01a: 8f 81 ldd r24, Y+7 ; 0x07 c01c: 98 85 ldd r25, Y+8 ; 0x08 c01e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> c022: 81 11 cpse r24, r1 c024: 16 c0 rjmp .+44 ; 0xc052 c026: 20 e0 ldi r18, 0x00 ; 0 c028: 30 e0 ldi r19, 0x00 ; 0 c02a: a9 01 movw r20, r18 c02c: 69 81 ldd r22, Y+1 ; 0x01 c02e: 7a 81 ldd r23, Y+2 ; 0x02 c030: 8b 81 ldd r24, Y+3 ; 0x03 c032: 9c 81 ldd r25, Y+4 ; 0x04 c034: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> c038: 81 11 cpse r24, r1 c03a: 0b c0 rjmp .+22 ; 0xc052 world2machine_rotation_and_skew[1][0] != 0.f || world2machine_rotation_and_skew[1][1] != 1.f) { c03c: 20 e0 ldi r18, 0x00 ; 0 c03e: 30 e0 ldi r19, 0x00 ; 0 c040: 40 e8 ldi r20, 0x80 ; 128 c042: 5f e3 ldi r21, 0x3F ; 63 c044: c3 01 movw r24, r6 c046: b2 01 movw r22, r4 c048: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> c04c: 88 23 and r24, r24 c04e: 09 f4 brne .+2 ; 0xc052 c050: 78 c0 rjmp .+240 ; 0xc142 // Rotation & skew correction. world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SKEW; c052: 80 91 a2 04 lds r24, 0x04A2 ; 0x8004a2 c056: 82 60 ori r24, 0x02 ; 2 c058: 80 93 a2 04 sts 0x04A2, r24 ; 0x8004a2 // Invert the world2machine matrix. float d = world2machine_rotation_and_skew[0][0] * world2machine_rotation_and_skew[1][1] - world2machine_rotation_and_skew[1][0] * world2machine_rotation_and_skew[0][1]; c05c: a3 01 movw r20, r6 c05e: 92 01 movw r18, r4 c060: c7 01 movw r24, r14 c062: b6 01 movw r22, r12 c064: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c068: 4b 01 movw r8, r22 c06a: 5c 01 movw r10, r24 c06c: 2d 81 ldd r18, Y+5 ; 0x05 c06e: 3e 81 ldd r19, Y+6 ; 0x06 c070: 4f 81 ldd r20, Y+7 ; 0x07 c072: 58 85 ldd r21, Y+8 ; 0x08 c074: 69 81 ldd r22, Y+1 ; 0x01 c076: 7a 81 ldd r23, Y+2 ; 0x02 c078: 8b 81 ldd r24, Y+3 ; 0x03 c07a: 9c 81 ldd r25, Y+4 ; 0x04 c07c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c080: 9b 01 movw r18, r22 c082: ac 01 movw r20, r24 c084: c5 01 movw r24, r10 c086: b4 01 movw r22, r8 c088: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> c08c: 4b 01 movw r8, r22 c08e: 5c 01 movw r10, r24 world2machine_rotation_and_skew_inv[0][0] = world2machine_rotation_and_skew[1][1] / d; c090: ac 01 movw r20, r24 c092: 9b 01 movw r18, r22 c094: c3 01 movw r24, r6 c096: b2 01 movw r22, r4 c098: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> c09c: 60 93 8a 04 sts 0x048A, r22 ; 0x80048a c0a0: 70 93 8b 04 sts 0x048B, r23 ; 0x80048b c0a4: 80 93 8c 04 sts 0x048C, r24 ; 0x80048c c0a8: 90 93 8d 04 sts 0x048D, r25 ; 0x80048d world2machine_rotation_and_skew_inv[0][1] = -world2machine_rotation_and_skew[0][1] / d; c0ac: 6d 81 ldd r22, Y+5 ; 0x05 c0ae: 7e 81 ldd r23, Y+6 ; 0x06 c0b0: 8f 81 ldd r24, Y+7 ; 0x07 c0b2: 98 85 ldd r25, Y+8 ; 0x08 c0b4: 90 58 subi r25, 0x80 ; 128 c0b6: a5 01 movw r20, r10 c0b8: 94 01 movw r18, r8 c0ba: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> c0be: 60 93 8e 04 sts 0x048E, r22 ; 0x80048e c0c2: 70 93 8f 04 sts 0x048F, r23 ; 0x80048f c0c6: 80 93 90 04 sts 0x0490, r24 ; 0x800490 c0ca: 90 93 91 04 sts 0x0491, r25 ; 0x800491 world2machine_rotation_and_skew_inv[1][0] = -world2machine_rotation_and_skew[1][0] / d; c0ce: 69 81 ldd r22, Y+1 ; 0x01 c0d0: 7a 81 ldd r23, Y+2 ; 0x02 c0d2: 8b 81 ldd r24, Y+3 ; 0x03 c0d4: 9c 81 ldd r25, Y+4 ; 0x04 c0d6: 90 58 subi r25, 0x80 ; 128 c0d8: a5 01 movw r20, r10 c0da: 94 01 movw r18, r8 c0dc: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> c0e0: 60 93 92 04 sts 0x0492, r22 ; 0x800492 c0e4: 70 93 93 04 sts 0x0493, r23 ; 0x800493 c0e8: 80 93 94 04 sts 0x0494, r24 ; 0x800494 c0ec: 90 93 95 04 sts 0x0495, r25 ; 0x800495 world2machine_rotation_and_skew_inv[1][1] = world2machine_rotation_and_skew[0][0] / d; c0f0: a5 01 movw r20, r10 c0f2: 94 01 movw r18, r8 c0f4: c7 01 movw r24, r14 c0f6: b6 01 movw r22, r12 c0f8: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> c0fc: 60 93 96 04 sts 0x0496, r22 ; 0x800496 c100: 70 93 97 04 sts 0x0497, r23 ; 0x800497 c104: 80 93 98 04 sts 0x0498, r24 ; 0x800498 c108: 90 93 99 04 sts 0x0499, r25 ; 0x800499 world2machine_rotation_and_skew_inv[0][0] = 1.f; world2machine_rotation_and_skew_inv[0][1] = 0.f; world2machine_rotation_and_skew_inv[1][0] = 0.f; world2machine_rotation_and_skew_inv[1][1] = 1.f; } } c10c: 28 96 adiw r28, 0x08 ; 8 c10e: 0f b6 in r0, 0x3f ; 63 c110: f8 94 cli c112: de bf out 0x3e, r29 ; 62 c114: 0f be out 0x3f, r0 ; 63 c116: cd bf out 0x3d, r28 ; 61 c118: df 91 pop r29 c11a: cf 91 pop r28 c11c: 1f 91 pop r17 c11e: 0f 91 pop r16 c120: ff 90 pop r15 c122: ef 90 pop r14 c124: df 90 pop r13 c126: cf 90 pop r12 c128: bf 90 pop r11 c12a: af 90 pop r10 c12c: 9f 90 pop r9 c12e: 8f 90 pop r8 c130: 7f 90 pop r7 c132: 6f 90 pop r6 c134: 5f 90 pop r5 c136: 4f 90 pop r4 c138: 08 95 ret world2machine_shift[1] = cntr[1]; // No correction. world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE; if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f) // Shift correction. world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SHIFT; c13a: 81 e0 ldi r24, 0x01 ; 1 c13c: 80 93 a2 04 sts 0x04A2, r24 ; 0x8004a2 c140: 5d cf rjmp .-326 ; 0xbffc world2machine_rotation_and_skew_inv[0][0] = world2machine_rotation_and_skew[1][1] / d; world2machine_rotation_and_skew_inv[0][1] = -world2machine_rotation_and_skew[0][1] / d; world2machine_rotation_and_skew_inv[1][0] = -world2machine_rotation_and_skew[1][0] / d; world2machine_rotation_and_skew_inv[1][1] = world2machine_rotation_and_skew[0][0] / d; } else { world2machine_rotation_and_skew_inv[0][0] = 1.f; c142: 80 e0 ldi r24, 0x00 ; 0 c144: 90 e0 ldi r25, 0x00 ; 0 c146: a0 e8 ldi r26, 0x80 ; 128 c148: bf e3 ldi r27, 0x3F ; 63 c14a: 80 93 8a 04 sts 0x048A, r24 ; 0x80048a c14e: 90 93 8b 04 sts 0x048B, r25 ; 0x80048b c152: a0 93 8c 04 sts 0x048C, r26 ; 0x80048c c156: b0 93 8d 04 sts 0x048D, r27 ; 0x80048d world2machine_rotation_and_skew_inv[0][1] = 0.f; c15a: 10 92 8e 04 sts 0x048E, r1 ; 0x80048e c15e: 10 92 8f 04 sts 0x048F, r1 ; 0x80048f c162: 10 92 90 04 sts 0x0490, r1 ; 0x800490 c166: 10 92 91 04 sts 0x0491, r1 ; 0x800491 world2machine_rotation_and_skew_inv[1][0] = 0.f; c16a: 10 92 92 04 sts 0x0492, r1 ; 0x800492 c16e: 10 92 93 04 sts 0x0493, r1 ; 0x800493 c172: 10 92 94 04 sts 0x0494, r1 ; 0x800494 c176: 10 92 95 04 sts 0x0495, r1 ; 0x800495 world2machine_rotation_and_skew_inv[1][1] = 1.f; c17a: 80 93 96 04 sts 0x0496, r24 ; 0x800496 c17e: 90 93 97 04 sts 0x0497, r25 ; 0x800497 c182: a0 93 98 04 sts 0x0498, r26 ; 0x800498 c186: b0 93 99 04 sts 0x0499, r27 ; 0x800499 c18a: c0 cf rjmp .-128 ; 0xc10c 0000c18c : /** * @brief Read and apply validated calibration data from EEPROM */ void world2machine_initialize() { c18c: 4f 92 push r4 c18e: 5f 92 push r5 c190: 6f 92 push r6 c192: 7f 92 push r7 c194: 8f 92 push r8 c196: 9f 92 push r9 c198: af 92 push r10 c19a: bf 92 push r11 c19c: cf 92 push r12 c19e: df 92 push r13 c1a0: ef 92 push r14 c1a2: ff 92 push r15 c1a4: 1f 93 push r17 c1a6: cf 93 push r28 c1a8: df 93 push r29 c1aa: cd b7 in r28, 0x3d ; 61 c1ac: de b7 in r29, 0x3e ; 62 c1ae: a8 97 sbiw r28, 0x28 ; 40 c1b0: 0f b6 in r0, 0x3f ; 63 c1b2: f8 94 cli c1b4: de bf out 0x3e, r29 ; 62 c1b6: 0f be out 0x3f, r0 ; 63 c1b8: cd bf out 0x3d, r28 ; 61 * @param [out] vec_y axis y vector * @param [out] cntr offset vector */ void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]) { eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); c1ba: 48 e0 ldi r20, 0x08 ; 8 c1bc: 50 e0 ldi r21, 0x00 ; 0 c1be: 6d ed ldi r22, 0xDD ; 221 c1c0: 7f e0 ldi r23, 0x0F ; 15 c1c2: ce 01 movw r24, r28 c1c4: 01 96 adiw r24, 0x01 ; 1 c1c6: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); c1ca: 48 e0 ldi r20, 0x08 ; 8 c1cc: 50 e0 ldi r21, 0x00 ; 0 c1ce: 65 ed ldi r22, 0xD5 ; 213 c1d0: 7f e0 ldi r23, 0x0F ; 15 c1d2: ce 01 movw r24, r28 c1d4: 09 96 adiw r24, 0x09 ; 9 c1d6: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); c1da: 48 e0 ldi r20, 0x08 ; 8 c1dc: 50 e0 ldi r21, 0x00 ; 0 c1de: 65 ee ldi r22, 0xE5 ; 229 c1e0: 7f e0 ldi r23, 0x0F ; 15 c1e2: ce 01 movw r24, r28 c1e4: 41 96 adiw r24, 0x11 ; 17 c1e6: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 } static inline bool vec_undef(const float v[2]) { const uint32_t *vx = (const uint32_t*)v; return vx[0] == 0xFFFFFFFF || vx[1] == 0xFFFFFFFF; c1ea: 89 89 ldd r24, Y+17 ; 0x11 c1ec: 9a 89 ldd r25, Y+18 ; 0x12 c1ee: ab 89 ldd r26, Y+19 ; 0x13 c1f0: bc 89 ldd r27, Y+20 ; 0x14 c1f2: 89 a3 std Y+33, r24 ; 0x21 c1f4: 9a a3 std Y+34, r25 ; 0x22 c1f6: ab a3 std Y+35, r26 ; 0x23 c1f8: bc a3 std Y+36, r27 ; 0x24 c1fa: 8f 3f cpi r24, 0xFF ; 255 c1fc: 9f 4f sbci r25, 0xFF ; 255 c1fe: af 4f sbci r26, 0xFF ; 255 c200: bf 4f sbci r27, 0xFF ; 255 c202: 09 f4 brne .+2 ; 0xc206 c204: b1 c0 rjmp .+354 ; 0xc368 c206: 8d 89 ldd r24, Y+21 ; 0x15 c208: 9e 89 ldd r25, Y+22 ; 0x16 c20a: af 89 ldd r26, Y+23 ; 0x17 c20c: b8 8d ldd r27, Y+24 ; 0x18 c20e: 8d a3 std Y+37, r24 ; 0x25 c210: 9e a3 std Y+38, r25 ; 0x26 c212: af a3 std Y+39, r26 ; 0x27 c214: b8 a7 std Y+40, r27 ; 0x28 c216: 8f 3f cpi r24, 0xFF ; 255 c218: 9f 4f sbci r25, 0xFF ; 255 c21a: af 4f sbci r26, 0xFF ; 255 c21c: bf 4f sbci r27, 0xFF ; 255 c21e: 09 f4 brne .+2 ; 0xc222 c220: a3 c0 rjmp .+326 ; 0xc368 c222: 89 80 ldd r8, Y+1 ; 0x01 c224: 9a 80 ldd r9, Y+2 ; 0x02 c226: ab 80 ldd r10, Y+3 ; 0x03 c228: bc 80 ldd r11, Y+4 ; 0x04 c22a: 8f ef ldi r24, 0xFF ; 255 c22c: 88 16 cp r8, r24 c22e: 98 06 cpc r9, r24 c230: a8 06 cpc r10, r24 c232: b8 06 cpc r11, r24 c234: 09 f4 brne .+2 ; 0xc238 c236: 98 c0 rjmp .+304 ; 0xc368 c238: 8d 81 ldd r24, Y+5 ; 0x05 c23a: 9e 81 ldd r25, Y+6 ; 0x06 c23c: af 81 ldd r26, Y+7 ; 0x07 c23e: b8 85 ldd r27, Y+8 ; 0x08 c240: 89 8f std Y+25, r24 ; 0x19 c242: 9a 8f std Y+26, r25 ; 0x1a c244: ab 8f std Y+27, r26 ; 0x1b c246: bc 8f std Y+28, r27 ; 0x1c c248: 8f 3f cpi r24, 0xFF ; 255 c24a: 9f 4f sbci r25, 0xFF ; 255 c24c: af 4f sbci r26, 0xFF ; 255 c24e: bf 4f sbci r27, 0xFF ; 255 c250: 09 f4 brne .+2 ; 0xc254 c252: 8a c0 rjmp .+276 ; 0xc368 c254: c9 84 ldd r12, Y+9 ; 0x09 c256: da 84 ldd r13, Y+10 ; 0x0a c258: eb 84 ldd r14, Y+11 ; 0x0b c25a: fc 84 ldd r15, Y+12 ; 0x0c c25c: 8f ef ldi r24, 0xFF ; 255 c25e: c8 16 cp r12, r24 c260: d8 06 cpc r13, r24 c262: e8 06 cpc r14, r24 c264: f8 06 cpc r15, r24 c266: 09 f4 brne .+2 ; 0xc26a c268: 7f c0 rjmp .+254 ; 0xc368 c26a: 8d 85 ldd r24, Y+13 ; 0x0d c26c: 9e 85 ldd r25, Y+14 ; 0x0e c26e: af 85 ldd r26, Y+15 ; 0x0f c270: b8 89 ldd r27, Y+16 ; 0x10 c272: 8d 8f std Y+29, r24 ; 0x1d c274: 9e 8f std Y+30, r25 ; 0x1e c276: af 8f std Y+31, r26 ; 0x1f c278: b8 a3 std Y+32, r27 ; 0x20 c27a: 8f 3f cpi r24, 0xFF ; 255 c27c: 9f 4f sbci r25, 0xFF ; 255 c27e: af 4f sbci r26, 0xFF ; 255 c280: bf 4f sbci r27, 0xFF ; 255 c282: 09 f4 brne .+2 ; 0xc286 c284: 71 c0 rjmp .+226 ; 0xc368 reset = true; } else { // Length of the vec_x shall be close to unity. float l = hypot(vec_x[0], vec_x[1]); c286: 29 8d ldd r18, Y+25 ; 0x19 c288: 3a 8d ldd r19, Y+26 ; 0x1a c28a: 4b 8d ldd r20, Y+27 ; 0x1b c28c: 5c 8d ldd r21, Y+28 ; 0x1c c28e: c5 01 movw r24, r10 c290: b4 01 movw r22, r8 c292: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 c296: 2b 01 movw r4, r22 c298: 3c 01 movw r6, r24 if (l < 0.9 || l > 1.1) c29a: 26 e6 ldi r18, 0x66 ; 102 c29c: 36 e6 ldi r19, 0x66 ; 102 c29e: 46 e6 ldi r20, 0x66 ; 102 c2a0: 5f e3 ldi r21, 0x3F ; 63 c2a2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> #if 0 SERIAL_ECHOLNPGM("X vector length:"); MYSERIAL.println(l); SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range."); #endif reset = true; c2a6: 11 e0 ldi r17, 0x01 ; 1 } else { // Length of the vec_x shall be close to unity. float l = hypot(vec_x[0], vec_x[1]); if (l < 0.9 || l > 1.1) c2a8: 87 fd sbrc r24, 7 c2aa: 0b c0 rjmp .+22 ; 0xc2c2 c2ac: 2d ec ldi r18, 0xCD ; 205 c2ae: 3c ec ldi r19, 0xCC ; 204 c2b0: 4c e8 ldi r20, 0x8C ; 140 c2b2: 5f e3 ldi r21, 0x3F ; 63 c2b4: c3 01 movw r24, r6 c2b6: b2 01 movw r22, r4 c2b8: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> c2bc: 18 16 cp r1, r24 c2be: 0c f0 brlt .+2 ; 0xc2c2 c2c0: 10 e0 ldi r17, 0x00 ; 0 SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range."); #endif reset = true; } // Length of the vec_y shall be close to unity. l = hypot(vec_y[0], vec_y[1]); c2c2: 2d 8d ldd r18, Y+29 ; 0x1d c2c4: 3e 8d ldd r19, Y+30 ; 0x1e c2c6: 4f 8d ldd r20, Y+31 ; 0x1f c2c8: 58 a1 ldd r21, Y+32 ; 0x20 c2ca: c7 01 movw r24, r14 c2cc: b6 01 movw r22, r12 c2ce: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 c2d2: 2b 01 movw r4, r22 c2d4: 3c 01 movw r6, r24 if (l < 0.9 || l > 1.1) c2d6: 26 e6 ldi r18, 0x66 ; 102 c2d8: 36 e6 ldi r19, 0x66 ; 102 c2da: 46 e6 ldi r20, 0x66 ; 102 c2dc: 5f e3 ldi r21, 0x3F ; 63 c2de: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> c2e2: 87 fd sbrc r24, 7 c2e4: 7f c0 rjmp .+254 ; 0xc3e4 c2e6: 2d ec ldi r18, 0xCD ; 205 c2e8: 3c ec ldi r19, 0xCC ; 204 c2ea: 4c e8 ldi r20, 0x8C ; 140 c2ec: 5f e3 ldi r21, 0x3F ; 63 c2ee: c3 01 movw r24, r6 c2f0: b2 01 movw r22, r4 c2f2: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> c2f6: 18 16 cp r1, r24 c2f8: 0c f4 brge .+2 ; 0xc2fc c2fa: 74 c0 rjmp .+232 ; 0xc3e4 SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range."); #endif reset = true; } // Correction of the zero point shall be reasonably small. l = hypot(cntr[0], cntr[1]); c2fc: 2d a1 ldd r18, Y+37 ; 0x25 c2fe: 3e a1 ldd r19, Y+38 ; 0x26 c300: 4f a1 ldd r20, Y+39 ; 0x27 c302: 58 a5 ldd r21, Y+40 ; 0x28 c304: 69 a1 ldd r22, Y+33 ; 0x21 c306: 7a a1 ldd r23, Y+34 ; 0x22 c308: 8b a1 ldd r24, Y+35 ; 0x23 c30a: 9c a1 ldd r25, Y+36 ; 0x24 c30c: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 if (l > 15.f) c310: 20 e0 ldi r18, 0x00 ; 0 c312: 30 e0 ldi r19, 0x00 ; 0 c314: 40 e7 ldi r20, 0x70 ; 112 c316: 51 e4 ldi r21, 0x41 ; 65 c318: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> c31c: 18 16 cp r1, r24 c31e: 0c f4 brge .+2 ; 0xc322 #if 0 SERIAL_ECHOLNPGM("Zero point correction:"); MYSERIAL.println(l); SERIAL_ECHOLNPGM("Invalid bed correction matrix. Shift out of range."); #endif reset = true; c320: 11 e0 ldi r17, 0x01 ; 1 } // vec_x and vec_y shall be nearly perpendicular. l = vec_x[0] * vec_y[0] + vec_x[1] * vec_y[1]; c322: a5 01 movw r20, r10 c324: 94 01 movw r18, r8 c326: c7 01 movw r24, r14 c328: b6 01 movw r22, r12 c32a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c32e: 6b 01 movw r12, r22 c330: 7c 01 movw r14, r24 c332: 2d 8d ldd r18, Y+29 ; 0x1d c334: 3e 8d ldd r19, Y+30 ; 0x1e c336: 4f 8d ldd r20, Y+31 ; 0x1f c338: 58 a1 ldd r21, Y+32 ; 0x20 c33a: 69 8d ldd r22, Y+25 ; 0x19 c33c: 7a 8d ldd r23, Y+26 ; 0x1a c33e: 8b 8d ldd r24, Y+27 ; 0x1b c340: 9c 8d ldd r25, Y+28 ; 0x1c c342: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c346: 9b 01 movw r18, r22 c348: ac 01 movw r20, r24 c34a: c7 01 movw r24, r14 c34c: b6 01 movw r22, r12 c34e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> if (fabs(l) > 0.1f) c352: 9f 77 andi r25, 0x7F ; 127 c354: 2d ec ldi r18, 0xCD ; 205 c356: 3c ec ldi r19, 0xCC ; 204 c358: 4c ec ldi r20, 0xCC ; 204 c35a: 5d e3 ldi r21, 0x3D ; 61 c35c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> c360: 18 16 cp r1, r24 c362: 14 f0 brlt .+4 ; 0xc368 #endif reset = true; } } if (reset) c364: 11 23 and r17, r17 c366: f1 f0 breq .+60 ; 0xc3a4 { #if 0 SERIAL_ECHOLNPGM("Invalid bed correction matrix. Resetting to identity."); #endif reset_bed_offset_and_skew(); c368: 0e 94 1e 55 call 0xaa3c ; 0xaa3c * @param [out] vec_y axis y vector * @param [out] cntr offset vector */ static void world2machine_default(float vec_x[2], float vec_y[2], float cntr[2]) { vec_x[0] = 1.f; c36c: 80 e0 ldi r24, 0x00 ; 0 c36e: 90 e0 ldi r25, 0x00 ; 0 c370: a0 e8 ldi r26, 0x80 ; 128 c372: bf e3 ldi r27, 0x3F ; 63 c374: 89 83 std Y+1, r24 ; 0x01 c376: 9a 83 std Y+2, r25 ; 0x02 c378: ab 83 std Y+3, r26 ; 0x03 c37a: bc 83 std Y+4, r27 ; 0x04 vec_x[1] = 0.f; c37c: 1d 82 std Y+5, r1 ; 0x05 c37e: 1e 82 std Y+6, r1 ; 0x06 c380: 1f 82 std Y+7, r1 ; 0x07 c382: 18 86 std Y+8, r1 ; 0x08 vec_y[0] = 0.f; c384: 19 86 std Y+9, r1 ; 0x09 c386: 1a 86 std Y+10, r1 ; 0x0a c388: 1b 86 std Y+11, r1 ; 0x0b c38a: 1c 86 std Y+12, r1 ; 0x0c vec_y[1] = 1.f; c38c: 8d 87 std Y+13, r24 ; 0x0d c38e: 9e 87 std Y+14, r25 ; 0x0e c390: af 87 std Y+15, r26 ; 0x0f c392: b8 8b std Y+16, r27 ; 0x10 cntr[0] = 0.f; c394: 19 8a std Y+17, r1 ; 0x11 c396: 1a 8a std Y+18, r1 ; 0x12 c398: 1b 8a std Y+19, r1 ; 0x13 c39a: 1c 8a std Y+20, r1 ; 0x14 #ifdef DEFAULT_Y_OFFSET cntr[1] = DEFAULT_Y_OFFSET; #else cntr[1] = 0.f; c39c: 1d 8a std Y+21, r1 ; 0x15 c39e: 1e 8a std Y+22, r1 ; 0x16 c3a0: 1f 8a std Y+23, r1 ; 0x17 c3a2: 18 8e std Y+24, r1 ; 0x18 #endif float vec_x[2]; float vec_y[2]; float cntr[2]; world2machine_read_valid(vec_x, vec_y, cntr); world2machine_update(vec_x, vec_y, cntr); c3a4: ae 01 movw r20, r28 c3a6: 4f 5e subi r20, 0xEF ; 239 c3a8: 5f 4f sbci r21, 0xFF ; 255 c3aa: be 01 movw r22, r28 c3ac: 67 5f subi r22, 0xF7 ; 247 c3ae: 7f 4f sbci r23, 0xFF ; 255 c3b0: ce 01 movw r24, r28 c3b2: 01 96 adiw r24, 0x01 ; 1 c3b4: 0e 94 7d 5f call 0xbefa ; 0xbefa MYSERIAL.print(world2machine_shift[0], 5); SERIAL_ECHOPGM(", "); MYSERIAL.print(world2machine_shift[1], 5); SERIAL_ECHOLNPGM(""); #endif } c3b8: a8 96 adiw r28, 0x28 ; 40 c3ba: 0f b6 in r0, 0x3f ; 63 c3bc: f8 94 cli c3be: de bf out 0x3e, r29 ; 62 c3c0: 0f be out 0x3f, r0 ; 63 c3c2: cd bf out 0x3d, r28 ; 61 c3c4: df 91 pop r29 c3c6: cf 91 pop r28 c3c8: 1f 91 pop r17 c3ca: ff 90 pop r15 c3cc: ef 90 pop r14 c3ce: df 90 pop r13 c3d0: cf 90 pop r12 c3d2: bf 90 pop r11 c3d4: af 90 pop r10 c3d6: 9f 90 pop r9 c3d8: 8f 90 pop r8 c3da: 7f 90 pop r7 c3dc: 6f 90 pop r6 c3de: 5f 90 pop r5 c3e0: 4f 90 pop r4 c3e2: 08 95 ret #if 0 SERIAL_ECHOLNPGM("Y vector length:"); MYSERIAL.println(l); SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range."); #endif reset = true; c3e4: 11 e0 ldi r17, 0x01 ; 1 c3e6: 8a cf rjmp .-236 ; 0xc2fc 0000c3e8 : * * In contrast with world2machine_revert_to_uncorrected(), it doesn't wait for finishing moves * nor updates the current position with the absolute values. */ void world2machine_reset() { c3e8: cf 93 push r28 c3ea: df 93 push r29 c3ec: cd b7 in r28, 0x3d ; 61 c3ee: de b7 in r29, 0x3e ; 62 c3f0: 68 97 sbiw r28, 0x18 ; 24 c3f2: 0f b6 in r0, 0x3f ; 63 c3f4: f8 94 cli c3f6: de bf out 0x3e, r29 ; 62 c3f8: 0f be out 0x3f, r0 ; 63 c3fa: cd bf out 0x3d, r28 ; 61 const float vx[] = { 1.f, 0.f }; c3fc: 80 e0 ldi r24, 0x00 ; 0 c3fe: 90 e0 ldi r25, 0x00 ; 0 c400: a0 e8 ldi r26, 0x80 ; 128 c402: bf e3 ldi r27, 0x3F ; 63 c404: 89 83 std Y+1, r24 ; 0x01 c406: 9a 83 std Y+2, r25 ; 0x02 c408: ab 83 std Y+3, r26 ; 0x03 c40a: bc 83 std Y+4, r27 ; 0x04 c40c: 1d 82 std Y+5, r1 ; 0x05 c40e: 1e 82 std Y+6, r1 ; 0x06 c410: 1f 82 std Y+7, r1 ; 0x07 c412: 18 86 std Y+8, r1 ; 0x08 const float vy[] = { 0.f, 1.f }; c414: 19 86 std Y+9, r1 ; 0x09 c416: 1a 86 std Y+10, r1 ; 0x0a c418: 1b 86 std Y+11, r1 ; 0x0b c41a: 1c 86 std Y+12, r1 ; 0x0c c41c: 8d 87 std Y+13, r24 ; 0x0d c41e: 9e 87 std Y+14, r25 ; 0x0e c420: af 87 std Y+15, r26 ; 0x0f c422: b8 8b std Y+16, r27 ; 0x10 const float cntr[] = { 0.f, 0.f }; c424: 19 8a std Y+17, r1 ; 0x11 c426: 1a 8a std Y+18, r1 ; 0x12 c428: 1b 8a std Y+19, r1 ; 0x13 c42a: 1c 8a std Y+20, r1 ; 0x14 c42c: 1d 8a std Y+21, r1 ; 0x15 c42e: 1e 8a std Y+22, r1 ; 0x16 c430: 1f 8a std Y+23, r1 ; 0x17 c432: 18 8e std Y+24, r1 ; 0x18 world2machine_update(vx, vy, cntr); c434: ae 01 movw r20, r28 c436: 4f 5e subi r20, 0xEF ; 239 c438: 5f 4f sbci r21, 0xFF ; 255 c43a: be 01 movw r22, r28 c43c: 67 5f subi r22, 0xF7 ; 247 c43e: 7f 4f sbci r23, 0xFF ; 255 c440: ce 01 movw r24, r28 c442: 01 96 adiw r24, 0x01 ; 1 c444: 0e 94 7d 5f call 0xbefa ; 0xbefa } c448: 68 96 adiw r28, 0x18 ; 24 c44a: 0f b6 in r0, 0x3f ; 63 c44c: f8 94 cli c44e: de bf out 0x3e, r29 ; 62 c450: 0f be out 0x3f, r0 ; 63 c452: cd bf out 0x3d, r28 ; 61 c454: df 91 pop r29 c456: cf 91 pop r28 c458: 08 95 ret 0000c45a : * * Wait for the motors to stop and then update the current position with the absolute values. */ void world2machine_revert_to_uncorrected() { if (world2machine_correction_mode != WORLD2MACHINE_CORRECTION_NONE) { c45a: 80 91 a2 04 lds r24, 0x04A2 ; 0x8004a2 c45e: 88 23 and r24, r24 c460: d1 f0 breq .+52 ; 0xc496 world2machine_reset(); c462: 0e 94 f4 61 call 0xc3e8 ; 0xc3e8 st_synchronize(); c466: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[X_AXIS] = st_get_position_mm(X_AXIS); c46a: 80 e0 ldi r24, 0x00 ; 0 c46c: 0f 94 e7 1a call 0x235ce ; 0x235ce c470: 60 93 61 12 sts 0x1261, r22 ; 0x801261 c474: 70 93 62 12 sts 0x1262, r23 ; 0x801262 c478: 80 93 63 12 sts 0x1263, r24 ; 0x801263 c47c: 90 93 64 12 sts 0x1264, r25 ; 0x801264 current_position[Y_AXIS] = st_get_position_mm(Y_AXIS); c480: 81 e0 ldi r24, 0x01 ; 1 c482: 0f 94 e7 1a call 0x235ce ; 0x235ce c486: 60 93 65 12 sts 0x1265, r22 ; 0x801265 c48a: 70 93 66 12 sts 0x1266, r23 ; 0x801266 c48e: 80 93 67 12 sts 0x1267, r24 ; 0x801267 c492: 90 93 68 12 sts 0x1268, r25 ; 0x801268 } } c496: 08 95 ret 0000c498 : } menu_item++; } bool __attribute__((noinline)) menu_item_leave(){ return ((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving; c498: 80 91 63 04 lds r24, 0x0463 ; 0x800463 c49c: 90 91 62 04 lds r25, 0x0462 ; 0x800462 c4a0: 89 13 cpse r24, r25 c4a2: 0b c0 rjmp .+22 ; 0xc4ba c4a4: 90 91 61 04 lds r25, 0x0461 ; 0x800461 c4a8: 99 23 and r25, r25 c4aa: 39 f0 breq .+14 ; 0xc4ba c4ac: 20 91 1e 06 lds r18, 0x061E ; 0x80061e c4b0: 30 91 1f 06 lds r19, 0x061F ; 0x80061f c4b4: 82 17 cp r24, r18 c4b6: 13 06 cpc r1, r19 c4b8: 39 f0 breq .+14 ; 0xc4c8 c4ba: 81 e0 ldi r24, 0x01 ; 1 c4bc: 90 91 c4 03 lds r25, 0x03C4 ; 0x8003c4 c4c0: 91 11 cpse r25, r1 c4c2: 03 c0 rjmp .+6 ; 0xc4ca c4c4: 80 e0 ldi r24, 0x00 ; 0 c4c6: 08 95 ret c4c8: 81 e0 ldi r24, 0x01 ; 1 } c4ca: 08 95 ret 0000c4cc : menu_line = 0; // prevent subsequent menu items from rendering at all in the current MENU_BEGIN() for loop cycle menu_clicked = 0; // prevent subsequent items from being able to be clicked in case the current menu or position was changed by the clicked menu item } static char menu_selection_mark(){ return (lcd_encoder == menu_item)?'>':' '; c4cc: 20 91 63 04 lds r18, 0x0463 ; 0x800463 c4d0: 80 91 1e 06 lds r24, 0x061E ; 0x80061e c4d4: 90 91 1f 06 lds r25, 0x061F ; 0x80061f c4d8: 28 17 cp r18, r24 c4da: 19 06 cpc r1, r25 c4dc: 11 f0 breq .+4 ; 0xc4e2 c4de: 80 e2 ldi r24, 0x20 ; 32 c4e0: 08 95 ret c4e2: 8e e3 ldi r24, 0x3E ; 62 } c4e4: 08 95 ret 0000c4e6 : } } void menu_item_ret(void) { lcd_draw_update = 2; c4e6: 82 e0 ldi r24, 0x02 ; 2 c4e8: 80 93 59 02 sts 0x0259, r24 ; 0x800259 menu_item++; c4ec: 80 91 63 04 lds r24, 0x0463 ; 0x800463 c4f0: 8f 5f subi r24, 0xFF ; 255 c4f2: 80 93 63 04 sts 0x0463, r24 ; 0x800463 //prevent the rest of the menu items from rendering or getting clicked menu_row = LCD_HEIGHT; // early exit from the MENU_BEGIN() for loop at the end of the current cycle c4f6: 84 e0 ldi r24, 0x04 ; 4 c4f8: 80 93 60 04 sts 0x0460, r24 ; 0x800460 menu_line = 0; // prevent subsequent menu items from rendering at all in the current MENU_BEGIN() for loop cycle c4fc: 10 92 62 04 sts 0x0462, r1 ; 0x800462 menu_clicked = 0; // prevent subsequent items from being able to be clicked in case the current menu or position was changed by the clicked menu item c500: 10 92 61 04 sts 0x0461, r1 ; 0x800461 } c504: 08 95 ret 0000c506 : menu_clicked = lcd_clicked(); // Consume click event } void menu_end(void) { if (menu_row >= LCD_HEIGHT) c506: 80 91 60 04 lds r24, 0x0460 ; 0x800460 c50a: 84 30 cpi r24, 0x04 ; 4 c50c: 38 f5 brcc .+78 ; 0xc55c { // Early abort if the menu was clicked. The current menu might have changed because of the click event return; } if (lcd_encoder >= menu_item) c50e: 80 91 63 04 lds r24, 0x0463 ; 0x800463 c512: 90 e0 ldi r25, 0x00 ; 0 c514: 20 91 1e 06 lds r18, 0x061E ; 0x80061e c518: 30 91 1f 06 lds r19, 0x061F ; 0x80061f c51c: 28 17 cp r18, r24 c51e: 39 07 cpc r19, r25 c520: 44 f0 brlt .+16 ; 0xc532 { lcd_encoder = menu_item - 1; c522: 01 97 sbiw r24, 0x01 ; 1 c524: 90 93 1f 06 sts 0x061F, r25 ; 0x80061f c528: 80 93 1e 06 sts 0x061E, r24 ; 0x80061e Sound_MakeSound(e_SOUND_TYPE_BlindAlert); c52c: 87 e0 ldi r24, 0x07 ; 7 c52e: 0f 94 ad 25 call 0x24b5a ; 0x24b5a } if (((uint8_t)lcd_encoder) >= menu_top + LCD_HEIGHT) c532: 80 91 1e 06 lds r24, 0x061E ; 0x80061e c536: 20 91 92 03 lds r18, 0x0392 ; 0x800392 c53a: 30 e0 ldi r19, 0x00 ; 0 c53c: 2d 5f subi r18, 0xFD ; 253 c53e: 3f 4f sbci r19, 0xFF ; 255 c540: 82 17 cp r24, r18 c542: 13 06 cpc r1, r19 c544: 59 f0 breq .+22 ; 0xc55c c546: 54 f0 brlt .+20 ; 0xc55c { menu_top = lcd_encoder - LCD_HEIGHT + 1; c548: 9d ef ldi r25, 0xFD ; 253 c54a: 98 0f add r25, r24 c54c: 90 93 92 03 sts 0x0392, r25 ; 0x800392 menu_line = menu_top - 1; c550: 84 50 subi r24, 0x04 ; 4 c552: 80 93 62 04 sts 0x0462, r24 ; 0x800462 menu_row = -1; c556: 8f ef ldi r24, 0xFF ; 255 c558: 80 93 60 04 sts 0x0460, r24 ; 0x800460 } } c55c: 08 95 ret 0000c55e : void menu_data_reset(void) { // Resets the global shared C union. // This ensures, that the menu entered will find out, that it shall initialize itself. memset(&menu_data, 0, sizeof(menu_data)); c55e: e6 e9 ldi r30, 0x96 ; 150 c560: f3 e0 ldi r31, 0x03 ; 3 c562: 80 e2 ldi r24, 0x20 ; 32 c564: df 01 movw r26, r30 c566: 1d 92 st X+, r1 c568: 8a 95 dec r24 c56a: e9 f7 brne .-6 ; 0xc566 } c56c: 08 95 ret 0000c56e : void menu_goto(menu_func_t menu, const int16_t encoder, bool reset_menu_state, const bool feedback) { c56e: cf 93 push r28 CRITICAL_SECTION_START; c570: 3f b7 in r19, 0x3f ; 63 c572: f8 94 cli if (menu_menu != menu) c574: e0 91 02 04 lds r30, 0x0402 ; 0x800402 c578: f0 91 03 04 lds r31, 0x0403 ; 0x800403 c57c: e8 17 cp r30, r24 c57e: f9 07 cpc r31, r25 c580: c9 f0 breq .+50 ; 0xc5b4 c582: c4 2f mov r28, r20 { menu_menu = menu; c584: 90 93 03 04 sts 0x0403, r25 ; 0x800403 c588: 80 93 02 04 sts 0x0402, r24 ; 0x800402 lcd_encoder = encoder; c58c: 70 93 1f 06 sts 0x061F, r23 ; 0x80061f c590: 60 93 1e 06 sts 0x061E, r22 ; 0x80061e menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support c594: 10 92 92 03 sts 0x0392, r1 ; 0x800392 lcd_draw_update = 2; // Full LCD re-draw c598: 82 e0 ldi r24, 0x02 ; 2 c59a: 80 93 59 02 sts 0x0259, r24 ; 0x800259 CRITICAL_SECTION_END; c59e: 3f bf out 0x3f, r19 ; 63 if (feedback) lcd_beeper_quick_feedback(); c5a0: 22 23 and r18, r18 c5a2: 19 f0 breq .+6 ; 0xc5aa } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); c5a4: 80 e0 ldi r24, 0x00 ; 0 c5a6: 0f 94 ad 25 call 0x24b5a ; 0x24b5a if (reset_menu_state) menu_data_reset(); c5aa: cc 23 and r28, r28 c5ac: 21 f0 breq .+8 ; 0xc5b6 } else CRITICAL_SECTION_END; } c5ae: cf 91 pop r28 lcd_encoder = encoder; menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support lcd_draw_update = 2; // Full LCD re-draw CRITICAL_SECTION_END; if (feedback) lcd_beeper_quick_feedback(); if (reset_menu_state) menu_data_reset(); c5b0: 0c 94 af 62 jmp 0xc55e ; 0xc55e } else CRITICAL_SECTION_END; c5b4: 3f bf out 0x3f, r19 ; 63 } c5b6: cf 91 pop r28 c5b8: 08 95 ret 0000c5ba : if (lcd_clicked()) menu_back(); } void menu_submenu(menu_func_t submenu, const bool feedback) { c5ba: dc 01 movw r26, r24 c5bc: 26 2f mov r18, r22 if (menu_depth < MENU_DEPTH_MAX) c5be: 90 91 df 03 lds r25, 0x03DF ; 0x8003df c5c2: 97 30 cpi r25, 0x07 ; 7 c5c4: d8 f4 brcc .+54 ; 0xc5fc { menu_stack[menu_depth].menu = menu_menu; c5c6: 49 2f mov r20, r25 c5c8: 50 e0 ldi r21, 0x00 ; 0 c5ca: fa 01 movw r30, r20 c5cc: ee 0f add r30, r30 c5ce: ff 1f adc r31, r31 c5d0: e4 0f add r30, r20 c5d2: f5 1f adc r31, r21 c5d4: e9 5a subi r30, 0xA9 ; 169 c5d6: fc 4f sbci r31, 0xFC ; 252 c5d8: 40 91 02 04 lds r20, 0x0402 ; 0x800402 c5dc: 50 91 03 04 lds r21, 0x0403 ; 0x800403 c5e0: 51 83 std Z+1, r21 ; 0x01 c5e2: 40 83 st Z, r20 menu_stack[menu_depth++].position = lcd_encoder; c5e4: 80 91 1e 06 lds r24, 0x061E ; 0x80061e c5e8: 9f 5f subi r25, 0xFF ; 255 c5ea: 90 93 df 03 sts 0x03DF, r25 ; 0x8003df c5ee: 82 83 std Z+2, r24 ; 0x02 menu_goto(submenu, 0, true, feedback); c5f0: 41 e0 ldi r20, 0x01 ; 1 c5f2: 70 e0 ldi r23, 0x00 ; 0 c5f4: 60 e0 ldi r22, 0x00 ; 0 c5f6: cd 01 movw r24, r26 c5f8: 0c 94 b7 62 jmp 0xc56e ; 0xc56e } } c5fc: 08 95 ret 0000c5fe : menu_row = -1; } } void menu_back(uint8_t nLevel) { c5fe: 98 2f mov r25, r24 menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0); c600: 80 91 df 03 lds r24, 0x03DF ; 0x8003df c604: 98 17 cp r25, r24 c606: a8 f4 brcc .+42 ; 0xc632 c608: 89 1b sub r24, r25 c60a: 80 93 df 03 sts 0x03DF, r24 ; 0x8003df menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true); c60e: 90 e0 ldi r25, 0x00 ; 0 c610: fc 01 movw r30, r24 c612: ee 0f add r30, r30 c614: ff 1f adc r31, r31 c616: e8 0f add r30, r24 c618: f9 1f adc r31, r25 c61a: e9 5a subi r30, 0xA9 ; 169 c61c: fc 4f sbci r31, 0xFC ; 252 c61e: 62 81 ldd r22, Z+2 ; 0x02 c620: 06 2e mov r0, r22 c622: 00 0c add r0, r0 c624: 77 0b sbc r23, r23 c626: 20 e0 ldi r18, 0x00 ; 0 c628: 41 e0 ldi r20, 0x01 ; 1 c62a: 80 81 ld r24, Z c62c: 91 81 ldd r25, Z+1 ; 0x01 c62e: 0c 94 b7 62 jmp 0xc56e ; 0xc56e } } void menu_back(uint8_t nLevel) { menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0); c632: 80 e0 ldi r24, 0x00 ; 0 c634: ea cf rjmp .-44 ; 0xc60a 0000c636 : menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true); } void menu_back(void) { menu_back(1); c636: 81 e0 ldi r24, 0x01 ; 1 c638: 0c 94 ff 62 jmp 0xc5fe ; 0xc5fe 0000c63c <__vector_36>: #endif //DEBUG_DUMP_TO_2ND_SERIAL } } ISR(USART1_RX_vect) { c63c: 1f 92 push r1 c63e: 0f 92 push r0 c640: 0f b6 in r0, 0x3f ; 63 c642: 0f 92 push r0 c644: 11 24 eor r1, r1 c646: 0b b6 in r0, 0x3b ; 59 c648: 0f 92 push r0 c64a: 2f 93 push r18 c64c: 3f 93 push r19 c64e: 4f 93 push r20 c650: 6f 93 push r22 c652: 7f 93 push r23 c654: 8f 93 push r24 c656: 9f 93 push r25 c658: ef 93 push r30 c65a: ff 93 push r31 // Test for a framing error. if (UCSR1A & (1< c660: 84 ff sbrs r24, 4 c662: 12 c0 rjmp .+36 ; 0xc688 <__vector_36+0x4c> { // Characters received with the framing errors will be ignored. // Dummy register read (discard) (void)(*(char *)UDR1); c664: 80 91 ce 00 lds r24, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> store_char(c); #ifdef DEBUG_DUMP_TO_2ND_SERIAL M_UDRx = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } c668: ff 91 pop r31 c66a: ef 91 pop r30 c66c: 9f 91 pop r25 c66e: 8f 91 pop r24 c670: 7f 91 pop r23 c672: 6f 91 pop r22 c674: 4f 91 pop r20 c676: 3f 91 pop r19 c678: 2f 91 pop r18 c67a: 0f 90 pop r0 c67c: 0b be out 0x3b, r0 ; 59 c67e: 0f 90 pop r0 c680: 0f be out 0x3f, r0 ; 63 c682: 0f 90 pop r0 c684: 1f 90 pop r1 c686: 18 95 reti (void)(*(char *)UDR1); } else { // Read the input register. unsigned char c = UDR1; c688: 40 91 ce 00 lds r20, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> if (selectedSerialPort == 1) c68c: 80 91 1c 06 lds r24, 0x061C ; 0x80061c c690: 81 30 cpi r24, 0x01 ; 1 c692: 51 f7 brne .-44 ; 0xc668 <__vector_36+0x2c> ring_buffer rx_buffer = { { 0 }, 0, 0 }; #endif FORCE_INLINE void store_char(unsigned char c) { int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; c694: 20 91 42 05 lds r18, 0x0542 ; 0x800542 c698: 30 91 43 05 lds r19, 0x0543 ; 0x800543 c69c: c9 01 movw r24, r18 c69e: 01 96 adiw r24, 0x01 ; 1 c6a0: 8f 77 andi r24, 0x7F ; 127 c6a2: 99 27 eor r25, r25 // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != rx_buffer.tail) { c6a4: 60 91 44 05 lds r22, 0x0544 ; 0x800544 c6a8: 70 91 45 05 lds r23, 0x0545 ; 0x800545 c6ac: 86 17 cp r24, r22 c6ae: 97 07 cpc r25, r23 c6b0: d9 f2 breq .-74 ; 0xc668 <__vector_36+0x2c> rx_buffer.buffer[rx_buffer.head] = c; c6b2: 2e 53 subi r18, 0x3E ; 62 c6b4: 3b 4f sbci r19, 0xFB ; 251 c6b6: f9 01 movw r30, r18 c6b8: 40 83 st Z, r20 rx_buffer.head = i; c6ba: 90 93 43 05 sts 0x0543, r25 ; 0x800543 c6be: 80 93 42 05 sts 0x0542, r24 ; 0x800542 c6c2: d2 cf rjmp .-92 ; 0xc668 <__vector_36+0x2c> 0000c6c4 <__vector_25>: // ticks at maximum 11.76 kHz and blocks for 2.688 us at each tick. // If the serial line is fully utilized, this corresponds to 3.16% // loading of the CPU (the interrupt invocation overhead not taken into account). // As the serial line is not fully utilized, the CPU load is likely around 1%. ISR(M_USARTx_RX_vect) { c6c4: 1f 92 push r1 c6c6: 0f 92 push r0 c6c8: 0f b6 in r0, 0x3f ; 63 c6ca: 0f 92 push r0 c6cc: 11 24 eor r1, r1 c6ce: 0b b6 in r0, 0x3b ; 59 c6d0: 0f 92 push r0 c6d2: 2f 93 push r18 c6d4: 3f 93 push r19 c6d6: 4f 93 push r20 c6d8: 6f 93 push r22 c6da: 7f 93 push r23 c6dc: 8f 93 push r24 c6de: 9f 93 push r25 c6e0: ef 93 push r30 c6e2: ff 93 push r31 // Test for a framing error. if (M_UCSRxA & (1< c6e8: 84 ff sbrs r24, 4 c6ea: 12 c0 rjmp .+36 ; 0xc710 <__vector_25+0x4c> { // Characters received with the framing errors will be ignored. // Dummy register read (discard) (void)(*(char *)M_UDRx); c6ec: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> store_char(c); #ifdef DEBUG_DUMP_TO_2ND_SERIAL UDR1 = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } c6f0: ff 91 pop r31 c6f2: ef 91 pop r30 c6f4: 9f 91 pop r25 c6f6: 8f 91 pop r24 c6f8: 7f 91 pop r23 c6fa: 6f 91 pop r22 c6fc: 4f 91 pop r20 c6fe: 3f 91 pop r19 c700: 2f 91 pop r18 c702: 0f 90 pop r0 c704: 0b be out 0x3b, r0 ; 59 c706: 0f 90 pop r0 c708: 0f be out 0x3f, r0 ; 63 c70a: 0f 90 pop r0 c70c: 1f 90 pop r1 c70e: 18 95 reti (void)(*(char *)M_UDRx); } else { // Read the input register. unsigned char c = M_UDRx; c710: 40 91 c6 00 lds r20, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> if (selectedSerialPort == 0) c714: 80 91 1c 06 lds r24, 0x061C ; 0x80061c c718: 81 11 cpse r24, r1 c71a: ea cf rjmp .-44 ; 0xc6f0 <__vector_25+0x2c> ring_buffer rx_buffer = { { 0 }, 0, 0 }; #endif FORCE_INLINE void store_char(unsigned char c) { int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; c71c: 20 91 42 05 lds r18, 0x0542 ; 0x800542 c720: 30 91 43 05 lds r19, 0x0543 ; 0x800543 c724: c9 01 movw r24, r18 c726: 01 96 adiw r24, 0x01 ; 1 c728: 8f 77 andi r24, 0x7F ; 127 c72a: 99 27 eor r25, r25 // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != rx_buffer.tail) { c72c: 60 91 44 05 lds r22, 0x0544 ; 0x800544 c730: 70 91 45 05 lds r23, 0x0545 ; 0x800545 c734: 86 17 cp r24, r22 c736: 97 07 cpc r25, r23 c738: d9 f2 breq .-74 ; 0xc6f0 <__vector_25+0x2c> rx_buffer.buffer[rx_buffer.head] = c; c73a: 2e 53 subi r18, 0x3E ; 62 c73c: 3b 4f sbci r19, 0xFB ; 251 c73e: f9 01 movw r30, r18 c740: 40 83 st Z, r20 rx_buffer.head = i; c742: 90 93 43 05 sts 0x0543, r25 ; 0x800543 c746: 80 93 42 05 sts 0x0542, r24 ; 0x800542 c74a: d2 cf rjmp .-92 ; 0xc6f0 <__vector_25+0x2c> 0000c74c : /// This function should backup variables which may be lost /// For example a power panic in M600 or during MMU error void refresh_print_state_in_ram() { if (saved_printing) return; memcpy(saved_pos, current_position, sizeof(saved_pos)); c74c: 80 e1 ldi r24, 0x10 ; 16 c74e: e1 e6 ldi r30, 0x61 ; 97 c750: f2 e1 ldi r31, 0x12 ; 18 c752: a0 e9 ldi r26, 0x90 ; 144 c754: b2 e0 ldi r27, 0x02 ; 2 c756: 01 90 ld r0, Z+ c758: 0d 92 st X+, r0 c75a: 8a 95 dec r24 c75c: e1 f7 brne .-8 ; 0xc756 saved_feedmultiply2 = feedmultiply; //save feedmultiply c75e: 80 91 8e 02 lds r24, 0x028E ; 0x80028e c762: 90 91 8f 02 lds r25, 0x028F ; 0x80028f c766: 90 93 60 12 sts 0x1260, r25 ; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1> c76a: 80 93 5f 12 sts 0x125F, r24 ; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498> saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder); c76e: 80 91 5d 12 lds r24, 0x125D ; 0x80125d c772: 90 91 5e 12 lds r25, 0x125E ; 0x80125e c776: 90 93 5c 12 sts 0x125C, r25 ; 0x80125c c77a: 80 93 5b 12 sts 0x125B, r24 ; 0x80125b saved_bed_temperature = (uint8_t)degTargetBed(); c77e: 80 91 59 12 lds r24, 0x1259 ; 0x801259 c782: 80 93 58 12 sts 0x1258, r24 ; 0x801258 saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; c786: 80 91 57 12 lds r24, 0x1257 ; 0x801257 c78a: 83 fb bst r24, 3 c78c: 88 27 eor r24, r24 c78e: 80 f9 bld r24, 0 c790: 80 93 56 12 sts 0x1256, r24 ; 0x801256 saved_fan_speed = fanSpeed; c794: 80 91 55 12 lds r24, 0x1255 ; 0x801255 c798: 80 93 54 12 sts 0x1254, r24 ; 0x801254 isPartialBackupAvailable = true; } c79c: 08 95 ret 0000c79e <_GLOBAL__sub_D_card>: while(!lcd_clicked()) { delay_keep_alive(0); } KEEPALIVE_STATE(busy_state_backup); } c79e: cf 93 push r28 c7a0: df 93 push r29 //------------------------------------------------------------------------------ /** * \class SdFile * \brief SdBaseFile with Print. */ class SdFile : public SdBaseFile/*, public Print*/ { c7a2: 87 e6 ldi r24, 0x67 ; 103 c7a4: 96 e1 ldi r25, 0x16 ; 22 c7a6: 0e 94 ab 79 call 0xf356 ; 0xf356 #ifdef SDSUPPORT #define MAX_DIR_DEPTH 6 #include "SdFile.h" class CardReader c7aa: 85 ea ldi r24, 0xA5 ; 165 c7ac: 94 e1 ldi r25, 0x14 ; 20 c7ae: 89 2b or r24, r25 c7b0: 51 f0 breq .+20 ; 0xc7c6 <_GLOBAL__sub_D_card+0x28> c7b2: c7 e7 ldi r28, 0x77 ; 119 c7b4: d5 e1 ldi r29, 0x15 ; 21 c7b6: a3 97 sbiw r28, 0x23 ; 35 c7b8: ce 01 movw r24, r28 c7ba: 0e 94 ab 79 call 0xf356 ; 0xf356 c7be: 84 e1 ldi r24, 0x14 ; 20 c7c0: c5 3a cpi r28, 0xA5 ; 165 c7c2: d8 07 cpc r29, r24 c7c4: c1 f7 brne .-16 ; 0xc7b6 <_GLOBAL__sub_D_card+0x18> c7c6: 82 e8 ldi r24, 0x82 ; 130 c7c8: 94 e1 ldi r25, 0x14 ; 20 c7ca: 0e 94 ab 79 call 0xf356 ; 0xf356 c7ce: 8d e5 ldi r24, 0x5D ; 93 c7d0: 94 e1 ldi r25, 0x14 ; 20 c7d2: df 91 pop r29 c7d4: cf 91 pop r28 c7d6: 0c 94 ab 79 jmp 0xf356 ; 0xf356 0000c7da : print_time_to_change_normal = PRINT_TIME_REMAINING_INIT; print_time_to_change_silent = PRINT_TIME_REMAINING_INIT; } void load_filament_final_feed() { c7da: cf 93 push r28 c7dc: df 93 push r29 current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED; c7de: c1 e6 ldi r28, 0x61 ; 97 c7e0: d2 e1 ldi r29, 0x12 ; 18 c7e2: 20 e0 ldi r18, 0x00 ; 0 c7e4: 30 e0 ldi r19, 0x00 ; 0 c7e6: 48 ec ldi r20, 0xC8 ; 200 c7e8: 51 e4 ldi r21, 0x41 ; 65 c7ea: 6c 85 ldd r22, Y+12 ; 0x0c c7ec: 7d 85 ldd r23, Y+13 ; 0x0d c7ee: 8e 85 ldd r24, Y+14 ; 0x0e c7f0: 9f 85 ldd r25, Y+15 ; 0x0f c7f2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> c7f6: 6c 87 std Y+12, r22 ; 0x0c c7f8: 7d 87 std Y+13, r23 ; 0x0d c7fa: 8e 87 std Y+14, r24 ; 0x0e c7fc: 9f 87 std Y+15, r25 ; 0x0f plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL); c7fe: 63 e3 ldi r22, 0x33 ; 51 c800: 73 e3 ldi r23, 0x33 ; 51 c802: 83 e5 ldi r24, 0x53 ; 83 c804: 90 e4 ldi r25, 0x40 ; 64 } c806: df 91 pop r29 c808: cf 91 pop r28 } void load_filament_final_feed() { current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED; plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL); c80a: 0d 94 81 4c jmp 0x29902 ; 0x29902 0000c80e : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); c80e: 60 e0 ldi r22, 0x00 ; 0 c810: 85 ea ldi r24, 0xA5 ; 165 c812: 9f e0 ldi r25, 0x0F ; 15 c814: 0f 94 04 a4 call 0x34808 ; 0x34808 c818: 60 e0 ldi r22, 0x00 ; 0 c81a: 8f e7 ldi r24, 0x7F ; 127 c81c: 9c e0 ldi r25, 0x0C ; 12 c81e: 0f 94 04 a4 call 0x34808 ; 0x34808 // Cancel the state related to a currently saved print void cancel_saved_printing() { eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0); saved_start_position[0] = SAVED_START_POSITION_UNSET; c822: 80 e0 ldi r24, 0x00 ; 0 c824: 90 e0 ldi r25, 0x00 ; 0 c826: a0 e8 ldi r26, 0x80 ; 128 c828: bf eb ldi r27, 0xBF ; 191 c82a: 80 93 7e 02 sts 0x027E, r24 ; 0x80027e c82e: 90 93 7f 02 sts 0x027F, r25 ; 0x80027f c832: a0 93 80 02 sts 0x0280, r26 ; 0x800280 c836: b0 93 81 02 sts 0x0281, r27 ; 0x800281 saved_printing_type = PowerPanic::PRINT_TYPE_NONE; c83a: 82 e0 ldi r24, 0x02 ; 2 c83c: 80 93 79 02 sts 0x0279, r24 ; 0x800279 saved_printing = false; c840: 10 92 73 12 sts 0x1273, r1 ; 0x801273 } c844: 08 95 ret 0000c846 : enquecommandf_P(MSG_M23, filename); } void restore_extruder_temperature_from_ram() { if ((uint16_t)degTargetHotend(active_extruder) != saved_extruder_temperature) c846: 80 91 5b 12 lds r24, 0x125B ; 0x80125b c84a: 90 91 5c 12 lds r25, 0x125C ; 0x80125c c84e: 20 91 5d 12 lds r18, 0x125D ; 0x80125d c852: 30 91 5e 12 lds r19, 0x125E ; 0x80125e c856: 28 17 cp r18, r24 c858: 39 07 cpc r19, r25 c85a: 71 f0 breq .+28 ; 0xc878 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; c85c: 90 93 5e 12 sts 0x125E, r25 ; 0x80125e c860: 80 93 5d 12 sts 0x125D, r24 ; 0x80125d { setTargetHotend(saved_extruder_temperature); heating_status = HeatingStatus::EXTRUDER_HEATING; c864: 81 e0 ldi r24, 0x01 ; 1 c866: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb wait_for_heater(_millis(), active_extruder); c86a: 0f 94 f0 0d call 0x21be0 ; 0x21be0 c86e: 0f 94 85 74 call 0x2e90a ; 0x2e90a heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE; c872: 82 e0 ldi r24, 0x02 ; 2 c874: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb } } c878: 08 95 ret 0000c87a : saved_fan_speed = fanSpeed; isPartialBackupAvailable = true; } void __attribute__((noinline)) refresh_saved_feedrate_multiplier_in_ram() { if (!saved_printing) { c87a: 80 91 73 12 lds r24, 0x1273 ; 0x801273 c87e: 88 23 and r24, r24 c880: 41 f0 breq .+16 ; 0xc892 // There is no saved print, therefore nothing to refresh return; } saved_feedmultiply2 = feedmultiply; c882: 80 91 8e 02 lds r24, 0x028E ; 0x80028e c886: 90 91 8f 02 lds r25, 0x028F ; 0x80028f c88a: 90 93 60 12 sts 0x1260, r25 ; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1> c88e: 80 93 5f 12 sts 0x125F, r24 ; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498> } c892: 08 95 ret 0000c894 : if (extrudemultiply != 100) out *= float(extrudemultiply) * 0.01f; return out; } void calculate_extruder_multipliers() { c894: cf 92 push r12 c896: df 92 push r13 c898: ef 92 push r14 c89a: ff 92 push r15 extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]); c89c: c0 90 ff 0d lds r12, 0x0DFF ; 0x800dff c8a0: d0 90 00 0e lds r13, 0x0E00 ; 0x800e00 c8a4: e0 90 01 0e lds r14, 0x0E01 ; 0x800e01 c8a8: f0 90 02 0e lds r15, 0x0E02 ; 0x800e02 } } float calculate_extruder_multiplier(float diameter) { float out = 1.f; if (cs.volumetric_enabled && diameter > 0.f) { c8ac: 80 91 fe 0d lds r24, 0x0DFE ; 0x800dfe c8b0: 88 23 and r24, r24 c8b2: 09 f4 brne .+2 ; 0xc8b6 c8b4: 4e c0 rjmp .+156 ; 0xc952 c8b6: 20 e0 ldi r18, 0x00 ; 0 c8b8: 30 e0 ldi r19, 0x00 ; 0 c8ba: a9 01 movw r20, r18 c8bc: c7 01 movw r24, r14 c8be: b6 01 movw r22, r12 c8c0: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> c8c4: 18 16 cp r1, r24 c8c6: 0c f0 brlt .+2 ; 0xc8ca c8c8: 44 c0 rjmp .+136 ; 0xc952 float area = M_PI * diameter * diameter * 0.25; c8ca: 2b ed ldi r18, 0xDB ; 219 c8cc: 3f e0 ldi r19, 0x0F ; 15 c8ce: 49 e4 ldi r20, 0x49 ; 73 c8d0: 50 e4 ldi r21, 0x40 ; 64 c8d2: c7 01 movw r24, r14 c8d4: b6 01 movw r22, r12 c8d6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c8da: a7 01 movw r20, r14 c8dc: 96 01 movw r18, r12 c8de: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c8e2: 20 e0 ldi r18, 0x00 ; 0 c8e4: 30 e0 ldi r19, 0x00 ; 0 c8e6: 40 e8 ldi r20, 0x80 ; 128 c8e8: 5e e3 ldi r21, 0x3E ; 62 c8ea: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c8ee: 9b 01 movw r18, r22 c8f0: ac 01 movw r20, r24 out = 1.f / area; c8f2: 60 e0 ldi r22, 0x00 ; 0 c8f4: 70 e0 ldi r23, 0x00 ; 0 c8f6: 80 e8 ldi r24, 0x80 ; 128 c8f8: 9f e3 ldi r25, 0x3F ; 63 c8fa: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> c8fe: 6b 01 movw r12, r22 c900: 7c 01 movw r14, r24 } if (extrudemultiply != 100) c902: 60 91 75 02 lds r22, 0x0275 ; 0x800275 c906: 70 91 76 02 lds r23, 0x0276 ; 0x800276 c90a: 64 36 cpi r22, 0x64 ; 100 c90c: 71 05 cpc r23, r1 c90e: a1 f0 breq .+40 ; 0xc938 out *= float(extrudemultiply) * 0.01f; c910: 07 2e mov r0, r23 c912: 00 0c add r0, r0 c914: 88 0b sbc r24, r24 c916: 99 0b sbc r25, r25 c918: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> c91c: 2a e0 ldi r18, 0x0A ; 10 c91e: 37 ed ldi r19, 0xD7 ; 215 c920: 43 e2 ldi r20, 0x23 ; 35 c922: 5c e3 ldi r21, 0x3C ; 60 c924: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c928: 9b 01 movw r18, r22 c92a: ac 01 movw r20, r24 c92c: c7 01 movw r24, r14 c92e: b6 01 movw r22, r12 c930: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> c934: 6b 01 movw r12, r22 c936: 7c 01 movw r14, r24 return out; } void calculate_extruder_multipliers() { extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]); c938: c0 92 10 02 sts 0x0210, r12 ; 0x800210 c93c: d0 92 11 02 sts 0x0211, r13 ; 0x800211 c940: e0 92 12 02 sts 0x0212, r14 ; 0x800212 c944: f0 92 13 02 sts 0x0213, r15 ; 0x800213 extruder_multiplier[1] = calculate_extruder_multiplier(cs.filament_size[1]); #if EXTRUDERS > 2 extruder_multiplier[2] = calculate_extruder_multiplier(cs.filament_size[2]); #endif #endif } c948: ff 90 pop r15 c94a: ef 90 pop r14 c94c: df 90 pop r13 c94e: cf 90 pop r12 c950: 08 95 ret MMU2::mmu2.ClearTMCFailures(); // not stored into EEPROM } } float calculate_extruder_multiplier(float diameter) { float out = 1.f; c952: c1 2c mov r12, r1 c954: d1 2c mov r13, r1 c956: 80 e8 ldi r24, 0x80 ; 128 c958: e8 2e mov r14, r24 c95a: 8f e3 ldi r24, 0x3F ; 63 c95c: f8 2e mov r15, r24 c95e: d1 cf rjmp .-94 ; 0xc902 0000c960 : } } #endif //FAST_PWM_FAN void save_statistics() { c960: 8f 92 push r8 c962: 9f 92 push r9 c964: af 92 push r10 c966: bf 92 push r11 c968: cf 92 push r12 c96a: df 92 push r13 c96c: ef 92 push r14 c96e: ff 92 push r15 uint32_t _previous_filament = eeprom_init_default_dword((uint32_t *)EEPROM_FILAMENTUSED, 0); //_previous_filament unit: centimeter c970: 81 ef ldi r24, 0xF1 ; 241 c972: 9f e0 ldi r25, 0x0F ; 15 c974: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 c978: 6b 01 movw r12, r22 c97a: 7c 01 movw r14, r24 uint32_t _previous_time = eeprom_init_default_dword((uint32_t *)EEPROM_TOTALTIME, 0); //_previous_time unit: min c97c: 8d ee ldi r24, 0xED ; 237 c97e: 9f e0 ldi r25, 0x0F ; 15 c980: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 c984: 4b 01 movw r8, r22 c986: 5c 01 movw r10, r24 uint32_t time_minutes = print_job_timer.duration() / 60; c988: 0f 94 6d 17 call 0x22eda ; 0x22eda c98c: 2c e3 ldi r18, 0x3C ; 60 c98e: 30 e0 ldi r19, 0x00 ; 0 c990: 40 e0 ldi r20, 0x00 ; 0 c992: 50 e0 ldi r21, 0x00 ; 0 c994: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, _previous_time + time_minutes); // EEPROM_TOTALTIME unit: min c998: ba 01 movw r22, r20 c99a: a9 01 movw r20, r18 c99c: 48 0d add r20, r8 c99e: 59 1d adc r21, r9 c9a0: 6a 1d adc r22, r10 c9a2: 7b 1d adc r23, r11 if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); c9a4: 8d ee ldi r24, 0xED ; 237 c9a6: 9f e0 ldi r25, 0x0F ; 15 c9a8: 0f 94 16 a4 call 0x3482c ; 0x3482c eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, _previous_filament + (total_filament_used / 1000)); c9ac: 60 91 17 06 lds r22, 0x0617 ; 0x800617 c9b0: 70 91 18 06 lds r23, 0x0618 ; 0x800618 c9b4: 80 91 19 06 lds r24, 0x0619 ; 0x800619 c9b8: 90 91 1a 06 lds r25, 0x061A ; 0x80061a c9bc: 28 ee ldi r18, 0xE8 ; 232 c9be: 33 e0 ldi r19, 0x03 ; 3 c9c0: 40 e0 ldi r20, 0x00 ; 0 c9c2: 50 e0 ldi r21, 0x00 ; 0 c9c4: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> c9c8: ba 01 movw r22, r20 c9ca: a9 01 movw r20, r18 c9cc: 4c 0d add r20, r12 c9ce: 5d 1d adc r21, r13 c9d0: 6e 1d adc r22, r14 c9d2: 7f 1d adc r23, r15 c9d4: 81 ef ldi r24, 0xF1 ; 241 c9d6: 9f e0 ldi r25, 0x0F ; 15 c9d8: 0f 94 16 a4 call 0x3482c ; 0x3482c print_job_timer.reset(); c9dc: 0f 94 0a 19 call 0x23214 ; 0x23214 total_filament_used = 0; c9e0: 10 92 17 06 sts 0x0617, r1 ; 0x800617 c9e4: 10 92 18 06 sts 0x0618, r1 ; 0x800618 c9e8: 10 92 19 06 sts 0x0619, r1 ; 0x800619 c9ec: 10 92 1a 06 sts 0x061A, r1 ; 0x80061a if (MMU2::mmu2.Enabled()) { c9f0: 80 91 01 13 lds r24, 0x1301 ; 0x801301 c9f4: 81 30 cpi r24, 0x01 ; 1 c9f6: 81 f4 brne .+32 ; 0xca18 eeprom_add_dword((uint32_t *)EEPROM_MMU_MATERIAL_CHANGES, MMU2::mmu2.ToolChangeCounter()); c9f8: 60 91 05 13 lds r22, 0x1305 ; 0x801305 c9fc: 70 91 06 13 lds r23, 0x1306 ; 0x801306 ca00: 90 e0 ldi r25, 0x00 ; 0 ca02: 80 e0 ldi r24, 0x00 ; 0 ca04: 0f 94 c0 6c call 0x2d980 ; 0x2d980 /// @return count for toolchange in current print inline uint16_t ToolChangeCounter() const { return toolchange_counter; }; /// Set toolchange counter to zero inline void ClearToolChangeCounter() { toolchange_counter = 0; }; ca08: 10 92 06 13 sts 0x1306, r1 ; 0x801306 ca0c: 10 92 05 13 sts 0x1305, r1 ; 0x801305 inline uint16_t TMCFailures() const { return tmcFailures; } inline void IncrementTMCFailures() { ++tmcFailures; } inline void ClearTMCFailures() { tmcFailures = 0; } ca10: 10 92 08 13 sts 0x1308, r1 ; 0x801308 ca14: 10 92 07 13 sts 0x1307, r1 ; 0x801307 // @@TODO why were EEPROM_MMU_FAIL_TOT and EEPROM_MMU_LOAD_FAIL_TOT behaving differently - i.e. updated with every change? MMU2::mmu2.ClearToolChangeCounter(); MMU2::mmu2.ClearTMCFailures(); // not stored into EEPROM } } ca18: ff 90 pop r15 ca1a: ef 90 pop r14 ca1c: df 90 pop r13 ca1e: cf 90 pop r12 ca20: bf 90 pop r11 ca22: af 90 pop r10 ca24: 9f 90 pop r9 ca26: 8f 90 pop r8 ca28: 08 95 ret 0000ca2a : } #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))) void gcode_M123() { printf_P(_N("E0:%d RPM PRN1:%d RPM E0@:%u PRN1@:%u\n"), 60*fan_speed[active_extruder], 60*fan_speed[1], newFanSpeed, fanSpeed); ca2a: 80 91 55 12 lds r24, 0x1255 ; 0x801255 ca2e: 1f 92 push r1 ca30: 8f 93 push r24 ca32: 80 91 3e 03 lds r24, 0x033E ; 0x80033e ca36: 1f 92 push r1 ca38: 8f 93 push r24 ca3a: e7 eb ldi r30, 0xB7 ; 183 ca3c: f3 e0 ldi r31, 0x03 ; 3 ca3e: 42 81 ldd r20, Z+2 ; 0x02 ca40: 53 81 ldd r21, Z+3 ; 0x03 ca42: 2c e3 ldi r18, 0x3C ; 60 ca44: 24 9f mul r18, r20 ca46: c0 01 movw r24, r0 ca48: 25 9f mul r18, r21 ca4a: 90 0d add r25, r0 ca4c: 11 24 eor r1, r1 ca4e: 9f 93 push r25 ca50: 8f 93 push r24 ca52: 40 81 ld r20, Z ca54: 51 81 ldd r21, Z+1 ; 0x01 ca56: 24 9f mul r18, r20 ca58: c0 01 movw r24, r0 ca5a: 25 9f mul r18, r21 ca5c: 90 0d add r25, r0 ca5e: 11 24 eor r1, r1 ca60: 9f 93 push r25 ca62: 8f 93 push r24 ca64: 84 e2 ldi r24, 0x24 ; 36 ca66: 94 e6 ldi r25, 0x64 ; 100 ca68: 9f 93 push r25 ca6a: 8f 93 push r24 ca6c: 0f 94 a2 a2 call 0x34544 ; 0x34544 ca70: 8d b7 in r24, 0x3d ; 61 ca72: 9e b7 in r25, 0x3e ; 62 ca74: 0a 96 adiw r24, 0x0a ; 10 ca76: 0f b6 in r0, 0x3f ; 63 ca78: f8 94 cli ca7a: 9e bf out 0x3e, r25 ; 62 ca7c: 0f be out 0x3f, r0 ; 63 ca7e: 8d bf out 0x3d, r24 ; 61 } ca80: 08 95 ret 0000ca82 : endstops_hit_on_purpose(); } void refresh_cmd_timeout(void) { previous_millis_cmd.start(); ca82: 88 e4 ldi r24, 0x48 ; 72 ca84: 93 e0 ldi r25, 0x03 ; 3 ca86: 0d 94 47 10 jmp 0x2208e ; 0x2208e ::start()> 0000ca8a : } } #endif //TMC2130 float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min) { return feedrate_mm_min / 60.f; ca8a: 20 e0 ldi r18, 0x00 ; 0 ca8c: 30 e0 ldi r19, 0x00 ; 0 ca8e: 40 e7 ldi r20, 0x70 ; 112 ca90: 52 e4 ldi r21, 0x42 ; 66 ca92: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> } ca96: 08 95 ret 0000ca98 : } bool enable_endstops(bool check) { bool old = check_endstops; check_endstops = check; ca98: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> //! @param original_feedmultiply feedmultiply to restore static void clean_up_after_endstop_move(int original_feedmultiply) { #ifdef ENDSTOPS_ONLY_FOR_HOMING enable_endstops(false); #endif feedrate = saved_feedrate; ca9c: 40 91 39 03 lds r20, 0x0339 ; 0x800339 caa0: 50 91 3a 03 lds r21, 0x033A ; 0x80033a caa4: 60 91 3b 03 lds r22, 0x033B ; 0x80033b caa8: 70 91 3c 03 lds r23, 0x033C ; 0x80033c caac: 40 93 7a 02 sts 0x027A, r20 ; 0x80027a cab0: 50 93 7b 02 sts 0x027B, r21 ; 0x80027b cab4: 60 93 7c 02 sts 0x027C, r22 ; 0x80027c cab8: 70 93 7d 02 sts 0x027D, r23 ; 0x80027d feedmultiply = original_feedmultiply; cabc: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f cac0: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e previous_millis_cmd.start(); cac4: 88 e4 ldi r24, 0x48 ; 72 cac6: 93 e0 ldi r25, 0x03 ; 3 cac8: 0d 94 47 10 jmp 0x2208e ; 0x2208e ::start()> 0000cacc : min_pos[axis] = base_min_pos(axis) + cs.add_homing[axis]; max_pos[axis] = base_max_pos(axis) + cs.add_homing[axis]; } //! @return original feedmultiply static int setup_for_endstop_move(bool enable_endstops_now = true) { cacc: 1f 93 push r17 cace: cf 93 push r28 cad0: df 93 push r29 cad2: 18 2f mov r17, r24 saved_feedrate = feedrate; cad4: 80 91 7a 02 lds r24, 0x027A ; 0x80027a cad8: 90 91 7b 02 lds r25, 0x027B ; 0x80027b cadc: a0 91 7c 02 lds r26, 0x027C ; 0x80027c cae0: b0 91 7d 02 lds r27, 0x027D ; 0x80027d cae4: 80 93 39 03 sts 0x0339, r24 ; 0x800339 cae8: 90 93 3a 03 sts 0x033A, r25 ; 0x80033a caec: a0 93 3b 03 sts 0x033B, r26 ; 0x80033b caf0: b0 93 3c 03 sts 0x033C, r27 ; 0x80033c int l_feedmultiply = feedmultiply; caf4: c0 91 8e 02 lds r28, 0x028E ; 0x80028e caf8: d0 91 8f 02 lds r29, 0x028F ; 0x80028f feedmultiply = 100; cafc: 84 e6 ldi r24, 0x64 ; 100 cafe: 90 e0 ldi r25, 0x00 ; 0 cb00: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f cb04: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e previous_millis_cmd.start(); cb08: 88 e4 ldi r24, 0x48 ; 72 cb0a: 93 e0 ldi r25, 0x03 ; 3 cb0c: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> cb10: 10 93 77 02 sts 0x0277, r17 ; 0x800277 <_ZL14check_endstops.lto_priv.387> enable_endstops(enable_endstops_now); return l_feedmultiply; } cb14: ce 01 movw r24, r28 cb16: df 91 pop r29 cb18: cf 91 pop r28 cb1a: 1f 91 pop r17 cb1c: 08 95 ret 0000cb1e : XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH); XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM); XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); static void axis_is_at_home(uint8_t axis) { cb1e: cf 92 push r12 cb20: df 92 push r13 cb22: ef 92 push r14 cb24: ff 92 push r15 cb26: 0f 93 push r16 cb28: 1f 93 push r17 cb2a: cf 93 push r28 cb2c: df 93 push r29 type array##_ext(uint8_t axis) \ { return pgm_read_any(&array##_P[axis]); } XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); cb2e: 90 e0 ldi r25, 0x00 ; 0 cb30: ec 01 movw r28, r24 cb32: cc 0f add r28, r28 cb34: dd 1f adc r29, r29 cb36: cc 0f add r28, r28 cb38: dd 1f adc r29, r29 cb3a: fe 01 movw r30, r28 cb3c: e1 56 subi r30, 0x61 ; 97 cb3e: f9 48 sbci r31, 0x89 ; 137 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); cb40: 25 91 lpm r18, Z+ cb42: 35 91 lpm r19, Z+ cb44: 45 91 lpm r20, Z+ cb46: 54 91 lpm r21, Z XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH); XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM); XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); static void axis_is_at_home(uint8_t axis) { current_position[axis] = base_home_pos(axis) + cs.add_homing[axis]; cb48: fe 01 movw r30, r28 cb4a: e1 54 subi r30, 0x41 ; 65 cb4c: f2 4f sbci r31, 0xF2 ; 242 cb4e: c0 80 ld r12, Z cb50: d1 80 ldd r13, Z+1 ; 0x01 cb52: e2 80 ldd r14, Z+2 ; 0x02 cb54: f3 80 ldd r15, Z+3 ; 0x03 cb56: 8e 01 movw r16, r28 cb58: 0f 59 subi r16, 0x9F ; 159 cb5a: 1d 4e sbci r17, 0xED ; 237 cb5c: c7 01 movw r24, r14 cb5e: b6 01 movw r22, r12 cb60: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> cb64: f8 01 movw r30, r16 cb66: 60 83 st Z, r22 cb68: 71 83 std Z+1, r23 ; 0x01 cb6a: 82 83 std Z+2, r24 ; 0x02 cb6c: 93 83 std Z+3, r25 ; 0x03 static inline type array(uint8_t axis) \ { return pgm_read_any(&array##_P[axis]); } \ type array##_ext(uint8_t axis) \ { return pgm_read_any(&array##_P[axis]); } XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); cb6e: fe 01 movw r30, r28 cb70: ed 56 subi r30, 0x6D ; 109 cb72: f9 48 sbci r31, 0x89 ; 137 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); cb74: 25 91 lpm r18, Z+ cb76: 35 91 lpm r19, Z+ cb78: 45 91 lpm r20, Z+ cb7a: 54 91 lpm r21, Z XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM); XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); static void axis_is_at_home(uint8_t axis) { current_position[axis] = base_home_pos(axis) + cs.add_homing[axis]; min_pos[axis] = base_min_pos(axis) + cs.add_homing[axis]; cb7c: 8e 01 movw r16, r28 cb7e: 0c 5d subi r16, 0xDC ; 220 cb80: 1d 4f sbci r17, 0xFD ; 253 cb82: c7 01 movw r24, r14 cb84: b6 01 movw r22, r12 cb86: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> cb8a: f8 01 movw r30, r16 cb8c: 60 83 st Z, r22 cb8e: 71 83 std Z+1, r23 ; 0x01 cb90: 82 83 std Z+2, r24 ; 0x02 cb92: 93 83 std Z+3, r25 ; 0x03 { return pgm_read_any(&array##_P[axis]); } \ type array##_ext(uint8_t axis) \ { return pgm_read_any(&array##_P[axis]); } XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); cb94: fe 01 movw r30, r28 cb96: e9 57 subi r30, 0x79 ; 121 cb98: f9 48 sbci r31, 0x89 ; 137 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); cb9a: 25 91 lpm r18, Z+ cb9c: 35 91 lpm r19, Z+ cb9e: 45 91 lpm r20, Z+ cba0: 54 91 lpm r21, Z XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); static void axis_is_at_home(uint8_t axis) { current_position[axis] = base_home_pos(axis) + cs.add_homing[axis]; min_pos[axis] = base_min_pos(axis) + cs.add_homing[axis]; max_pos[axis] = base_max_pos(axis) + cs.add_homing[axis]; cba2: c8 5e subi r28, 0xE8 ; 232 cba4: dd 4f sbci r29, 0xFD ; 253 cba6: c7 01 movw r24, r14 cba8: b6 01 movw r22, r12 cbaa: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> cbae: 68 83 st Y, r22 cbb0: 79 83 std Y+1, r23 ; 0x01 cbb2: 8a 83 std Y+2, r24 ; 0x02 cbb4: 9b 83 std Y+3, r25 ; 0x03 } cbb6: df 91 pop r29 cbb8: cf 91 pop r28 cbba: 1f 91 pop r17 cbbc: 0f 91 pop r16 cbbe: ff 90 pop r15 cbc0: ef 90 pop r14 cbc2: df 90 pop r13 cbc4: cf 90 pop r12 cbc6: 08 95 ret 0000cbc8 : cbc8: 40 e0 ldi r20, 0x00 ; 0 cbca: 50 e0 ldi r21, 0x00 ; 0 cbcc: ba 01 movw r22, r20 cbce: 8d ee ldi r24, 0xED ; 237 cbd0: 9f e0 ldi r25, 0x0F ; 15 cbd2: 0f 94 16 a4 call 0x3482c ; 0x3482c cbd6: 40 e0 ldi r20, 0x00 ; 0 cbd8: 50 e0 ldi r21, 0x00 ; 0 cbda: ba 01 movw r22, r20 cbdc: 81 ef ldi r24, 0xF1 ; 241 cbde: 9f e0 ldi r25, 0x0F ; 15 cbe0: 0f 94 16 a4 call 0x3482c ; 0x3482c static void factory_reset_stats(){ eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, 0); eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, 0); failstats_reset_print(); cbe4: 0e 94 68 56 call 0xacd0 ; 0xacd0 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); cbe8: 70 e0 ldi r23, 0x00 ; 0 cbea: 60 e0 ldi r22, 0x00 ; 0 cbec: 85 e0 ldi r24, 0x05 ; 5 cbee: 9f e0 ldi r25, 0x0F ; 15 cbf0: 0f 94 22 a4 call 0x34844 ; 0x34844 cbf4: 70 e0 ldi r23, 0x00 ; 0 cbf6: 60 e0 ldi r22, 0x00 ; 0 cbf8: 83 e0 ldi r24, 0x03 ; 3 cbfa: 9f e0 ldi r25, 0x0F ; 15 cbfc: 0f 94 22 a4 call 0x34844 ; 0x34844 cc00: 70 e0 ldi r23, 0x00 ; 0 cc02: 60 e0 ldi r22, 0x00 ; 0 cc04: 81 e0 ldi r24, 0x01 ; 1 cc06: 9f e0 ldi r25, 0x0F ; 15 cc08: 0f 94 22 a4 call 0x34844 ; 0x34844 cc0c: 70 e0 ldi r23, 0x00 ; 0 cc0e: 60 e0 ldi r22, 0x00 ; 0 cc10: 8f ef ldi r24, 0xFF ; 255 cc12: 9e e0 ldi r25, 0x0E ; 14 cc14: 0f 94 22 a4 call 0x34844 ; 0x34844 cc18: 70 e0 ldi r23, 0x00 ; 0 cc1a: 60 e0 ldi r22, 0x00 ; 0 cc1c: 83 ed ldi r24, 0xD3 ; 211 cc1e: 9e e0 ldi r25, 0x0E ; 14 cc20: 0f 94 22 a4 call 0x34844 ; 0x34844 cc24: 70 e0 ldi r23, 0x00 ; 0 cc26: 60 e0 ldi r22, 0x00 ; 0 cc28: 80 ed ldi r24, 0xD0 ; 208 cc2a: 9e e0 ldi r25, 0x0E ; 14 cc2c: 0f 94 22 a4 call 0x34844 ; 0x34844 if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); cc30: 40 e0 ldi r20, 0x00 ; 0 cc32: 50 e0 ldi r21, 0x00 ; 0 cc34: ba 01 movw r22, r20 cc36: 88 ea ldi r24, 0xA8 ; 168 cc38: 9c e0 ldi r25, 0x0C ; 12 cc3a: 0d 94 16 a4 jmp 0x3482c ; 0x3482c 0000cc3e : wdt_disable(); } } void softReset(void) { cli(); cc3e: f8 94 cli : "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | _BV(WDE) | (value & 0x07)) ) : "r0" ); cc40: 88 e1 ldi r24, 0x18 ; 24 cc42: 9f e0 ldi r25, 0x0F ; 15 cc44: 0f b6 in r0, 0x3f ; 63 cc46: f8 94 cli cc48: a8 95 wdr cc4a: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> cc4e: 0f be out 0x3f, r0 ; 63 cc50: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> cc54: ff cf rjmp .-2 ; 0xcc54 0000cc56 : } #endif //End DEBUG_PRINTER_STATES // Block LCD menus when bool __attribute__((noinline)) printer_recovering() { return (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY); cc56: 85 ea ldi r24, 0xA5 ; 165 cc58: 9f e0 ldi r25, 0x0F ; 15 cc5a: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 cc5e: 91 e0 ldi r25, 0x01 ; 1 cc60: 81 11 cpse r24, r1 cc62: 01 c0 rjmp .+2 ; 0xcc66 cc64: 90 e0 ldi r25, 0x00 ; 0 } cc66: 89 2f mov r24, r25 cc68: 08 95 ret 0000cc6a : bool __attribute__((noinline)) printJobOngoing() { return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning()); } bool printingIsPaused() { return did_pause_print || print_job_timer.isPaused(); cc6a: 80 91 cd 03 lds r24, 0x03CD ; 0x8003cd cc6e: 81 11 cpse r24, r1 cc70: 06 c0 rjmp .+12 ; 0xcc7e cc72: 81 e0 ldi r24, 0x01 ; 1 cc74: 90 91 8b 03 lds r25, 0x038B ; 0x80038b cc78: 92 30 cpi r25, 0x02 ; 2 cc7a: 09 f0 breq .+2 ; 0xcc7e cc7c: 80 e0 ldi r24, 0x00 ; 0 } cc7e: 08 95 ret 0000cc80 : WRITE(SUICIDE_PIN, LOW); #endif } bool __attribute__((noinline)) printJobOngoing() { return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning()); cc80: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 cc84: 81 11 cpse r24, r1 cc86: 0a c0 rjmp .+20 ; 0xcc9c cc88: 80 91 42 12 lds r24, 0x1242 ; 0x801242 cc8c: 81 11 cpse r24, r1 cc8e: 06 c0 rjmp .+12 ; 0xcc9c cc90: 81 e0 ldi r24, 0x01 ; 1 cc92: 90 91 8b 03 lds r25, 0x038B ; 0x80038b cc96: 91 30 cpi r25, 0x01 ; 1 cc98: 09 f0 breq .+2 ; 0xcc9c cc9a: 80 e0 ldi r24, 0x00 ; 0 } cc9c: 08 95 ret 0000cc9e : && !mesh_bed_leveling_flag && !homing_flag && e_active(); } bool __attribute__((noinline)) babystep_allowed() { cc9e: cf 93 push r28 cca0: df 93 push r29 return ( !homing_flag cca2: c0 91 71 12 lds r28, 0x1271 ; 0x801271 && !mesh_bed_leveling_flag && !printingIsPaused() && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) cca6: c1 11 cpse r28, r1 cca8: 1f c0 rjmp .+62 ; 0xcce8 && e_active(); } bool __attribute__((noinline)) babystep_allowed() { return ( !homing_flag && !mesh_bed_leveling_flag ccaa: 80 91 72 12 lds r24, 0x1272 ; 0x801272 ccae: 81 11 cpse r24, r1 ccb0: 1c c0 rjmp .+56 ; 0xccea && !printingIsPaused() ccb2: 0e 94 35 66 call 0xcc6a ; 0xcc6a ccb6: 81 11 cpse r24, r1 ccb8: 18 c0 rjmp .+48 ; 0xccea && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) ccba: d0 91 5e 0d lds r29, 0x0D5E ; 0x800d5e ccbe: d4 30 cpi r29, 0x04 ; 4 ccc0: 61 f4 brne .+24 ; 0xccda ccc2: 80 91 5d 12 lds r24, 0x125D ; 0x80125d ccc6: 90 91 5e 12 lds r25, 0x125E ; 0x80125e ccca: 89 2b or r24, r25 cccc: 91 f4 brne .+36 ; 0xccf2 ccce: 80 91 59 12 lds r24, 0x1259 ; 0x801259 ccd2: 90 91 5a 12 lds r25, 0x125A ; 0x80125a ccd6: 89 2b or r24, r25 ccd8: 61 f4 brne .+24 ; 0xccf2 || printJobOngoing() ccda: 0e 94 40 66 call 0xcc80 ; 0xcc80 ccde: c8 2f mov r28, r24 cce0: 81 11 cpse r24, r1 cce2: 03 c0 rjmp .+6 ; 0xccea || lcd_commands_type == LcdCommands::Idle cce4: c1 e0 ldi r28, 0x01 ; 1 cce6: d1 11 cpse r29, r1 bool __attribute__((noinline)) babystep_allowed() { return ( !homing_flag && !mesh_bed_leveling_flag && !printingIsPaused() && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) cce8: c0 e0 ldi r28, 0x00 ; 0 || printJobOngoing() || lcd_commands_type == LcdCommands::Idle ) ); } ccea: 8c 2f mov r24, r28 ccec: df 91 pop r29 ccee: cf 91 pop r28 ccf0: 08 95 ret bool __attribute__((noinline)) babystep_allowed() { return ( !homing_flag && !mesh_bed_leveling_flag && !printingIsPaused() && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) ccf2: c1 e0 ldi r28, 0x01 ; 1 ccf4: fa cf rjmp .-12 ; 0xccea 0000ccf6 : ) ); } bool __attribute__((noinline)) babystep_allowed_strict() { return ( babystep_allowed() && current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU); ccf6: 0e 94 4f 66 call 0xcc9e ; 0xcc9e ccfa: 88 23 and r24, r24 ccfc: 89 f0 breq .+34 ; 0xcd20 ccfe: 20 e0 ldi r18, 0x00 ; 0 cd00: 30 e0 ldi r19, 0x00 ; 0 cd02: 40 e0 ldi r20, 0x00 ; 0 cd04: 50 e4 ldi r21, 0x40 ; 64 cd06: 60 91 69 12 lds r22, 0x1269 ; 0x801269 cd0a: 70 91 6a 12 lds r23, 0x126A ; 0x80126a cd0e: 80 91 6b 12 lds r24, 0x126B ; 0x80126b cd12: 90 91 6c 12 lds r25, 0x126C ; 0x80126c cd16: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> cd1a: 88 1f adc r24, r24 cd1c: 88 27 eor r24, r24 cd1e: 88 1f adc r24, r24 } cd20: 08 95 ret 0000cd22 : bool printingIsPaused() { return did_pause_print || print_job_timer.isPaused(); } bool __attribute__((noinline)) printer_active() { return printJobOngoing() cd22: 0e 94 40 66 call 0xcc80 ; 0xcc80 || printingIsPaused() || saved_printing || (lcd_commands_type != LcdCommands::Idle) || MMU2::mmu2.MMU_PRINT_SAVED() || homing_flag || mesh_bed_leveling_flag; cd26: 81 11 cpse r24, r1 cd28: 18 c0 rjmp .+48 ; 0xcd5a return did_pause_print || print_job_timer.isPaused(); } bool __attribute__((noinline)) printer_active() { return printJobOngoing() || printingIsPaused() cd2a: 0e 94 35 66 call 0xcc6a ; 0xcc6a cd2e: 81 11 cpse r24, r1 cd30: 14 c0 rjmp .+40 ; 0xcd5a || saved_printing cd32: 80 91 73 12 lds r24, 0x1273 ; 0x801273 cd36: 81 11 cpse r24, r1 cd38: 10 c0 rjmp .+32 ; 0xcd5a || (lcd_commands_type != LcdCommands::Idle) cd3a: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e cd3e: 81 11 cpse r24, r1 cd40: 0b c0 rjmp .+22 ; 0xcd58 || MMU2::mmu2.MMU_PRINT_SAVED() cd42: 80 91 02 13 lds r24, 0x1302 ; 0x801302 cd46: 81 11 cpse r24, r1 cd48: 07 c0 rjmp .+14 ; 0xcd58 || homing_flag cd4a: 80 91 71 12 lds r24, 0x1271 ; 0x801271 cd4e: 81 11 cpse r24, r1 cd50: 04 c0 rjmp .+8 ; 0xcd5a || mesh_bed_leveling_flag; cd52: 80 91 72 12 lds r24, 0x1272 ; 0x801272 cd56: 08 95 ret cd58: 81 e0 ldi r24, 0x01 ; 1 } cd5a: 08 95 ret 0000cd5c : inline void set_destination_to_current() { memcpy(destination, current_position, sizeof(destination)); } cd5c: 80 e1 ldi r24, 0x10 ; 16 cd5e: e1 e6 ldi r30, 0x61 ; 97 cd60: f2 e1 ldi r31, 0x12 ; 18 cd62: a9 e2 ldi r26, 0x29 ; 41 cd64: b6 e0 ldi r27, 0x06 ; 6 cd66: 01 90 ld r0, Z+ cd68: 0d 92 st X+, r0 cd6a: 8a 95 dec r24 cd6c: e1 f7 brne .-8 ; 0xcd66 cd6e: 08 95 ret 0000cd70 : //! //! Internally lcd_update() is called by wait_for_heater(). //! //! @param e_move void restore_print_from_ram_and_continue(float e_move) { cd70: 4f 92 push r4 cd72: 5f 92 push r5 cd74: 6f 92 push r6 cd76: 7f 92 push r7 cd78: 8f 92 push r8 cd7a: 9f 92 push r9 cd7c: af 92 push r10 cd7e: bf 92 push r11 cd80: cf 92 push r12 cd82: df 92 push r13 cd84: ef 92 push r14 cd86: ff 92 push r15 cd88: 0f 93 push r16 cd8a: 1f 93 push r17 cd8c: cf 93 push r28 cd8e: df 93 push r29 cd90: 00 d0 rcall .+0 ; 0xcd92 cd92: 00 d0 rcall .+0 ; 0xcd94 cd94: 1f 92 push r1 cd96: 1f 92 push r1 cd98: cd b7 in r28, 0x3d ; 61 cd9a: de b7 in r29, 0x3e ; 62 if (!saved_printing) return; cd9c: 20 91 73 12 lds r18, 0x1273 ; 0x801273 cda0: 22 23 and r18, r18 cda2: 09 f4 brne .+2 ; 0xcda6 cda4: 73 c1 rjmp .+742 ; 0xd08c #ifdef FANCHECK // Do not allow resume printing if fans are still not ok if (fan_check_error == EFCE_REPORTED) return; cda6: 20 91 ce 03 lds r18, 0x03CE ; 0x8003ce cdaa: 22 30 cpi r18, 0x02 ; 2 cdac: 09 f4 brne .+2 ; 0xcdb0 cdae: 6e c1 rjmp .+732 ; 0xd08c if (fan_check_error == EFCE_FIXED) fan_check_error = EFCE_OK; //reenable serial stream processing if printing from usb cdb0: 20 91 ce 03 lds r18, 0x03CE ; 0x8003ce cdb4: 21 30 cpi r18, 0x01 ; 1 cdb6: 11 f4 brne .+4 ; 0xcdbc cdb8: 10 92 ce 03 sts 0x03CE, r1 ; 0x8003ce cdbc: 2b 01 movw r4, r22 cdbe: 3c 01 movw r6, r24 #endif // Make sure fan is turned off fanSpeed = 0; cdc0: 10 92 55 12 sts 0x1255, r1 ; 0x801255 // restore bed temperature (bed can be disabled during a thermal warning) if ((uint8_t)degBed() != saved_bed_temperature) cdc4: 10 91 58 12 lds r17, 0x1258 ; 0x801258 cdc8: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc cdcc: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd cdd0: 80 91 be 03 lds r24, 0x03BE ; 0x8003be cdd4: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf cdd8: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> cddc: 61 17 cp r22, r17 cdde: 31 f0 breq .+12 ; 0xcdec resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; cde0: 81 2f mov r24, r17 cde2: 90 e0 ldi r25, 0x00 ; 0 cde4: 90 93 5a 12 sts 0x125A, r25 ; 0x80125a cde8: 80 93 59 12 sts 0x1259, r24 ; 0x801259 setTargetBed(saved_bed_temperature); restore_extruder_temperature_from_ram(); cdec: 0e 94 23 64 call 0xc846 ; 0xc846 // Restore saved fan speed fanSpeed = saved_fan_speed; cdf0: 80 91 54 12 lds r24, 0x1254 ; 0x801254 cdf4: 80 93 55 12 sts 0x1255, r24 ; 0x801255 axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK; cdf8: 90 91 57 12 lds r25, 0x1257 ; 0x801257 cdfc: 80 91 56 12 lds r24, 0x1256 ; 0x801256 ce00: 81 95 neg r24 ce02: 89 27 eor r24, r25 ce04: 88 70 andi r24, 0x08 ; 8 ce06: 89 27 eor r24, r25 ce08: 80 93 57 12 sts 0x1257, r24 ; 0x801257 float e = saved_pos[E_AXIS] - e_move; ce0c: a3 01 movw r20, r6 ce0e: 92 01 movw r18, r4 ce10: 60 91 9c 02 lds r22, 0x029C ; 0x80029c ce14: 70 91 9d 02 lds r23, 0x029D ; 0x80029d ce18: 80 91 9e 02 lds r24, 0x029E ; 0x80029e ce1c: 90 91 9f 02 lds r25, 0x029F ; 0x80029f ce20: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> ce24: 6d 83 std Y+5, r22 ; 0x05 ce26: 7e 83 std Y+6, r23 ; 0x06 ce28: 8f 83 std Y+7, r24 ; 0x07 ce2a: 98 87 std Y+8, r25 ; 0x08 plan_set_e_position(e); ce2c: ce 01 movw r24, r28 ce2e: 05 96 adiw r24, 0x05 ; 5 ce30: 0f 94 d9 3c call 0x279b2 ; 0x279b2 #ifdef FANCHECK fans_check_enabled = false; ce34: 10 92 40 02 sts 0x0240, r1 ; 0x800240 #endif // do not restore XY for commands that do not require that if (saved_pos[X_AXIS] == X_COORD_INVALID) ce38: 20 e0 ldi r18, 0x00 ; 0 ce3a: 30 e0 ldi r19, 0x00 ; 0 ce3c: 40 e8 ldi r20, 0x80 ; 128 ce3e: 5f eb ldi r21, 0xBF ; 191 ce40: 60 91 90 02 lds r22, 0x0290 ; 0x800290 ce44: 70 91 91 02 lds r23, 0x0291 ; 0x800291 ce48: 80 91 92 02 lds r24, 0x0292 ; 0x800292 ce4c: 90 91 93 02 lds r25, 0x0293 ; 0x800293 ce50: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> ce54: 81 11 cpse r24, r1 ce56: 20 c0 rjmp .+64 ; 0xce98 { saved_pos[X_AXIS] = current_position[X_AXIS]; ce58: 80 91 61 12 lds r24, 0x1261 ; 0x801261 ce5c: 90 91 62 12 lds r25, 0x1262 ; 0x801262 ce60: a0 91 63 12 lds r26, 0x1263 ; 0x801263 ce64: b0 91 64 12 lds r27, 0x1264 ; 0x801264 ce68: 80 93 90 02 sts 0x0290, r24 ; 0x800290 ce6c: 90 93 91 02 sts 0x0291, r25 ; 0x800291 ce70: a0 93 92 02 sts 0x0292, r26 ; 0x800292 ce74: b0 93 93 02 sts 0x0293, r27 ; 0x800293 saved_pos[Y_AXIS] = current_position[Y_AXIS]; ce78: 80 91 65 12 lds r24, 0x1265 ; 0x801265 ce7c: 90 91 66 12 lds r25, 0x1266 ; 0x801266 ce80: a0 91 67 12 lds r26, 0x1267 ; 0x801267 ce84: b0 91 68 12 lds r27, 0x1268 ; 0x801268 ce88: 80 93 94 02 sts 0x0294, r24 ; 0x800294 ce8c: 90 93 95 02 sts 0x0295, r25 ; 0x800295 ce90: a0 93 96 02 sts 0x0296, r26 ; 0x800296 ce94: b0 93 97 02 sts 0x0297, r27 ; 0x800297 } //first move print head in XY to the saved position: plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13); ce98: a3 01 movw r20, r6 ce9a: 92 01 movw r18, r4 ce9c: 60 91 9c 02 lds r22, 0x029C ; 0x80029c cea0: 70 91 9d 02 lds r23, 0x029D ; 0x80029d cea4: 80 91 9e 02 lds r24, 0x029E ; 0x80029e cea8: 90 91 9f 02 lds r25, 0x029F ; 0x80029f ceac: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> ceb0: 69 83 std Y+1, r22 ; 0x01 ceb2: 7a 83 std Y+2, r23 ; 0x02 ceb4: 8b 83 std Y+3, r24 ; 0x03 ceb6: 9c 83 std Y+4, r25 ; 0x04 ceb8: e0 90 69 12 lds r14, 0x1269 ; 0x801269 cebc: f0 90 6a 12 lds r15, 0x126A ; 0x80126a cec0: 00 91 6b 12 lds r16, 0x126B ; 0x80126b cec4: 10 91 6c 12 lds r17, 0x126C ; 0x80126c cec8: 20 91 94 02 lds r18, 0x0294 ; 0x800294 cecc: 30 91 95 02 lds r19, 0x0295 ; 0x800295 ced0: 40 91 96 02 lds r20, 0x0296 ; 0x800296 ced4: 50 91 97 02 lds r21, 0x0297 ; 0x800297 ced8: 60 91 90 02 lds r22, 0x0290 ; 0x800290 cedc: 70 91 91 02 lds r23, 0x0291 ; 0x800291 cee0: 80 91 92 02 lds r24, 0x0292 ; 0x800292 cee4: 90 91 93 02 lds r25, 0x0293 ; 0x800293 cee8: 1f 92 push r1 ceea: 1f 92 push r1 ceec: 1f 92 push r1 ceee: 1f 92 push r1 cef0: e2 e6 ldi r30, 0x62 ; 98 cef2: 8e 2e mov r8, r30 cef4: e7 e2 ldi r30, 0x27 ; 39 cef6: 9e 2e mov r9, r30 cef8: e6 e7 ldi r30, 0x76 ; 118 cefa: ae 2e mov r10, r30 cefc: e2 e4 ldi r30, 0x42 ; 66 cefe: be 2e mov r11, r30 cf00: fe 01 movw r30, r28 cf02: 31 96 adiw r30, 0x01 ; 1 cf04: 6f 01 movw r12, r30 cf06: 0f 94 33 3d call 0x27a66 ; 0x27a66 //then move Z plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13); cf0a: a3 01 movw r20, r6 cf0c: 92 01 movw r18, r4 cf0e: 60 91 9c 02 lds r22, 0x029C ; 0x80029c cf12: 70 91 9d 02 lds r23, 0x029D ; 0x80029d cf16: 80 91 9e 02 lds r24, 0x029E ; 0x80029e cf1a: 90 91 9f 02 lds r25, 0x029F ; 0x80029f cf1e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> cf22: 69 83 std Y+1, r22 ; 0x01 cf24: 7a 83 std Y+2, r23 ; 0x02 cf26: 8b 83 std Y+3, r24 ; 0x03 cf28: 9c 83 std Y+4, r25 ; 0x04 cf2a: e0 90 98 02 lds r14, 0x0298 ; 0x800298 cf2e: f0 90 99 02 lds r15, 0x0299 ; 0x800299 cf32: 00 91 9a 02 lds r16, 0x029A ; 0x80029a cf36: 10 91 9b 02 lds r17, 0x029B ; 0x80029b cf3a: 20 91 94 02 lds r18, 0x0294 ; 0x800294 cf3e: 30 91 95 02 lds r19, 0x0295 ; 0x800295 cf42: 40 91 96 02 lds r20, 0x0296 ; 0x800296 cf46: 50 91 97 02 lds r21, 0x0297 ; 0x800297 cf4a: 60 91 90 02 lds r22, 0x0290 ; 0x800290 cf4e: 70 91 91 02 lds r23, 0x0291 ; 0x800291 cf52: 80 91 92 02 lds r24, 0x0292 ; 0x800292 cf56: 90 91 93 02 lds r25, 0x0293 ; 0x800293 cf5a: 1f 92 push r1 cf5c: 1f 92 push r1 cf5e: 1f 92 push r1 cf60: 1f 92 push r1 cf62: 0f 94 33 3d call 0x27a66 ; 0x27a66 //and finaly unretract (35mm/s) plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS], FILAMENTCHANGE_RFEED); cf66: e0 90 98 02 lds r14, 0x0298 ; 0x800298 cf6a: f0 90 99 02 lds r15, 0x0299 ; 0x800299 cf6e: 00 91 9a 02 lds r16, 0x029A ; 0x80029a cf72: 10 91 9b 02 lds r17, 0x029B ; 0x80029b cf76: 20 91 94 02 lds r18, 0x0294 ; 0x800294 cf7a: 30 91 95 02 lds r19, 0x0295 ; 0x800295 cf7e: 40 91 96 02 lds r20, 0x0296 ; 0x800296 cf82: 50 91 97 02 lds r21, 0x0297 ; 0x800297 cf86: 60 91 90 02 lds r22, 0x0290 ; 0x800290 cf8a: 70 91 91 02 lds r23, 0x0291 ; 0x800291 cf8e: 80 91 92 02 lds r24, 0x0292 ; 0x800292 cf92: 90 91 93 02 lds r25, 0x0293 ; 0x800293 cf96: 1f 92 push r1 cf98: 1f 92 push r1 cf9a: 1f 92 push r1 cf9c: 1f 92 push r1 cf9e: 81 2c mov r8, r1 cfa0: 91 2c mov r9, r1 cfa2: f8 ee ldi r31, 0xE8 ; 232 cfa4: af 2e mov r10, r31 cfa6: f2 e4 ldi r31, 0x42 ; 66 cfa8: bf 2e mov r11, r31 cfaa: ac e9 ldi r26, 0x9C ; 156 cfac: ca 2e mov r12, r26 cfae: a2 e0 ldi r26, 0x02 ; 2 cfb0: da 2e mov r13, r26 cfb2: 0f 94 33 3d call 0x27a66 ; 0x27a66 st_synchronize(); cfb6: 0f 94 fb 1a call 0x235f6 ; 0x235f6 #ifdef FANCHECK fans_check_enabled = true; cfba: 11 e0 ldi r17, 0x01 ; 1 cfbc: 10 93 40 02 sts 0x0240, r17 ; 0x800240 #endif // restore original feedrate/feedmultiply _after_ restoring the extruder position feedrate = saved_feedrate2; cfc0: 60 91 4f 12 lds r22, 0x124F ; 0x80124f cfc4: 70 91 50 12 lds r23, 0x1250 ; 0x801250 cfc8: 90 e0 ldi r25, 0x00 ; 0 cfca: 80 e0 ldi r24, 0x00 ; 0 cfcc: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> cfd0: 60 93 7a 02 sts 0x027A, r22 ; 0x80027a cfd4: 70 93 7b 02 sts 0x027B, r23 ; 0x80027b cfd8: 80 93 7c 02 sts 0x027C, r24 ; 0x80027c cfdc: 90 93 7d 02 sts 0x027D, r25 ; 0x80027d feedmultiply = saved_feedmultiply2; cfe0: 80 91 5f 12 lds r24, 0x125F ; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498> cfe4: 90 91 60 12 lds r25, 0x1260 ; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1> cfe8: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f cfec: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e memcpy(current_position, saved_pos, sizeof(saved_pos)); cff0: 80 e1 ldi r24, 0x10 ; 16 cff2: e0 e9 ldi r30, 0x90 ; 144 cff4: f2 e0 ldi r31, 0x02 ; 2 cff6: a1 e6 ldi r26, 0x61 ; 97 cff8: b2 e1 ldi r27, 0x12 ; 18 cffa: 01 90 ld r0, Z+ cffc: 0d 92 st X+, r0 cffe: 8a 95 dec r24 d000: e1 f7 brne .-8 ; 0xcffa set_destination_to_current(); d002: 0e 94 ae 66 call 0xcd5c ; 0xcd5c //not sd printing nor usb printing } } void restore_print_file_state() { if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { //was sd printing d006: 80 91 79 02 lds r24, 0x0279 ; 0x800279 d00a: 0f b6 in r0, 0x3f ; 63 d00c: f8 94 cli d00e: de bf out 0x3e, r29 ; 62 d010: 0f be out 0x3f, r0 ; 63 d012: cd bf out 0x3d, r28 ; 61 d014: 81 11 cpse r24, r1 d016: 51 c0 rjmp .+162 ; 0xd0ba card.setIndex(saved_sdpos); d018: 60 91 45 12 lds r22, 0x1245 ; 0x801245 d01c: 70 91 46 12 lds r23, 0x1246 ; 0x801246 d020: 80 91 47 12 lds r24, 0x1247 ; 0x801247 d024: 90 91 48 12 lds r25, 0x1248 ; 0x801248 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; d028: 60 93 eb 16 sts 0x16EB, r22 ; 0x8016eb d02c: 70 93 ec 16 sts 0x16EC, r23 ; 0x8016ec d030: 80 93 ed 16 sts 0x16ED, r24 ; 0x8016ed d034: 90 93 ee 16 sts 0x16EE, r25 ; 0x8016ee d038: 0f 94 17 68 call 0x2d02e ; 0x2d02e sdpos_atomic = saved_sdpos; d03c: 80 91 45 12 lds r24, 0x1245 ; 0x801245 d040: 90 91 46 12 lds r25, 0x1246 ; 0x801246 d044: a0 91 47 12 lds r26, 0x1247 ; 0x801247 d048: b0 91 48 12 lds r27, 0x1248 ; 0x801248 d04c: 80 93 49 12 sts 0x1249, r24 ; 0x801249 d050: 90 93 4a 12 sts 0x124A, r25 ; 0x80124a d054: a0 93 4b 12 sts 0x124B, r26 ; 0x80124b d058: b0 93 4c 12 sts 0x124C, r27 ; 0x80124c card.sdprinting = true; d05c: 10 93 d7 13 sts 0x13D7, r17 ; 0x8013d7 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); d060: 60 e0 ldi r22, 0x00 ; 0 d062: 85 ea ldi r24, 0xA5 ; 165 d064: 9f e0 ldi r25, 0x0F ; 15 d066: 0f 94 04 a4 call 0x34808 ; 0x34808 d06a: 60 e0 ldi r22, 0x00 ; 0 d06c: 8f e7 ldi r24, 0x7F ; 127 d06e: 9c e0 ldi r25, 0x0C ; 12 d070: 0f 94 04 a4 call 0x34808 ; 0x34808 set_destination_to_current(); restore_print_file_state(); eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0); lcd_setstatuspgm(MSG_WELCOME); d074: 86 ee ldi r24, 0xE6 ; 230 d076: 9b e6 ldi r25, 0x6B ; 107 d078: 0e 94 94 de call 0x1bd28 ; 0x1bd28 saved_printing_type = PowerPanic::PRINT_TYPE_NONE; d07c: 82 e0 ldi r24, 0x02 ; 2 d07e: 80 93 79 02 sts 0x0279, r24 ; 0x800279 saved_printing = false; d082: 10 92 73 12 sts 0x1273, r1 ; 0x801273 planner_aborted = true; // unroll the stack d086: 81 e0 ldi r24, 0x01 ; 1 d088: 80 93 42 0d sts 0x0D42, r24 ; 0x800d42 } d08c: 28 96 adiw r28, 0x08 ; 8 d08e: 0f b6 in r0, 0x3f ; 63 d090: f8 94 cli d092: de bf out 0x3e, r29 ; 62 d094: 0f be out 0x3f, r0 ; 63 d096: cd bf out 0x3d, r28 ; 61 d098: df 91 pop r29 d09a: cf 91 pop r28 d09c: 1f 91 pop r17 d09e: 0f 91 pop r16 d0a0: ff 90 pop r15 d0a2: ef 90 pop r14 d0a4: df 90 pop r13 d0a6: cf 90 pop r12 d0a8: bf 90 pop r11 d0aa: af 90 pop r10 d0ac: 9f 90 pop r9 d0ae: 8f 90 pop r8 d0b0: 7f 90 pop r7 d0b2: 6f 90 pop r6 d0b4: 5f 90 pop r5 d0b6: 4f 90 pop r4 d0b8: 08 95 ret void restore_print_file_state() { if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { //was sd printing card.setIndex(saved_sdpos); sdpos_atomic = saved_sdpos; card.sdprinting = true; } else if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //was usb printing d0ba: 81 30 cpi r24, 0x01 ; 1 d0bc: 89 f6 brne .-94 ; 0xd060 gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing d0be: 80 91 45 12 lds r24, 0x1245 ; 0x801245 d0c2: 90 91 46 12 lds r25, 0x1246 ; 0x801246 d0c6: a0 91 47 12 lds r26, 0x1247 ; 0x801247 d0ca: b0 91 48 12 lds r27, 0x1248 ; 0x801248 d0ce: 80 93 3e 12 sts 0x123E, r24 ; 0x80123e d0d2: 90 93 3f 12 sts 0x123F, r25 ; 0x80123f d0d6: a0 93 40 12 sts 0x1240, r26 ; 0x801240 d0da: b0 93 41 12 sts 0x1241, r27 ; 0x801241 serial_count = 0; d0de: 10 92 48 10 sts 0x1048, r1 ; 0x801048 d0e2: 10 92 47 10 sts 0x1047, r1 ; 0x801047 FlushSerialRequestResend(); d0e6: 0e 94 ac 55 call 0xab58 ; 0xab58 d0ea: ba cf rjmp .-140 ; 0xd060 0000d0ec : extern void world2machine_initialize(); extern void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]); extern void world2machine_update_current(); inline void world2machine(float &x, float &y) { d0ec: 3f 92 push r3 d0ee: 4f 92 push r4 d0f0: 5f 92 push r5 d0f2: 6f 92 push r6 d0f4: 7f 92 push r7 d0f6: 8f 92 push r8 d0f8: 9f 92 push r9 d0fa: af 92 push r10 d0fc: bf 92 push r11 d0fe: cf 92 push r12 d100: df 92 push r13 d102: ef 92 push r14 d104: ff 92 push r15 d106: 0f 93 push r16 d108: 1f 93 push r17 d10a: cf 93 push r28 d10c: df 93 push r29 if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { d10e: 30 90 a2 04 lds r3, 0x04A2 ; 0x8004a2 d112: 33 20 and r3, r3 d114: 09 f4 brne .+2 ; 0xd118 d116: 80 c0 rjmp .+256 ; 0xd218 d118: 8b 01 movw r16, r22 d11a: ec 01 movw r28, r24 // No correction. } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { d11c: 31 fe sbrs r3, 1 d11e: 54 c0 rjmp .+168 ; 0xd1c8 // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew[0][0] * x + world2machine_rotation_and_skew[0][1] * y; d120: 88 80 ld r8, Y d122: 99 80 ldd r9, Y+1 ; 0x01 d124: aa 80 ldd r10, Y+2 ; 0x02 d126: bb 80 ldd r11, Y+3 ; 0x03 d128: fb 01 movw r30, r22 d12a: c0 80 ld r12, Z d12c: d1 80 ldd r13, Z+1 ; 0x01 d12e: e2 80 ldd r14, Z+2 ; 0x02 d130: f3 80 ldd r15, Z+3 ; 0x03 float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y; d132: 20 91 77 03 lds r18, 0x0377 ; 0x800377 d136: 30 91 78 03 lds r19, 0x0378 ; 0x800378 d13a: 40 91 79 03 lds r20, 0x0379 ; 0x800379 d13e: 50 91 7a 03 lds r21, 0x037A ; 0x80037a d142: c5 01 movw r24, r10 d144: b4 01 movw r22, r8 d146: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d14a: 2b 01 movw r4, r22 d14c: 3c 01 movw r6, r24 d14e: 20 91 7b 03 lds r18, 0x037B ; 0x80037b d152: 30 91 7c 03 lds r19, 0x037C ; 0x80037c d156: 40 91 7d 03 lds r20, 0x037D ; 0x80037d d15a: 50 91 7e 03 lds r21, 0x037E ; 0x80037e d15e: c7 01 movw r24, r14 d160: b6 01 movw r22, r12 d162: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d166: 9b 01 movw r18, r22 d168: ac 01 movw r20, r24 d16a: c3 01 movw r24, r6 d16c: b2 01 movw r22, r4 d16e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d172: 2b 01 movw r4, r22 d174: 3c 01 movw r6, r24 if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { // No correction. } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew[0][0] * x + world2machine_rotation_and_skew[0][1] * y; d176: 20 91 6f 03 lds r18, 0x036F ; 0x80036f d17a: 30 91 70 03 lds r19, 0x0370 ; 0x800370 d17e: 40 91 71 03 lds r20, 0x0371 ; 0x800371 d182: 50 91 72 03 lds r21, 0x0372 ; 0x800372 d186: c5 01 movw r24, r10 d188: b4 01 movw r22, r8 d18a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d18e: 4b 01 movw r8, r22 d190: 5c 01 movw r10, r24 d192: 20 91 73 03 lds r18, 0x0373 ; 0x800373 d196: 30 91 74 03 lds r19, 0x0374 ; 0x800374 d19a: 40 91 75 03 lds r20, 0x0375 ; 0x800375 d19e: 50 91 76 03 lds r21, 0x0376 ; 0x800376 d1a2: c7 01 movw r24, r14 d1a4: b6 01 movw r22, r12 d1a6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d1aa: 9b 01 movw r18, r22 d1ac: ac 01 movw r20, r24 d1ae: c5 01 movw r24, r10 d1b0: b4 01 movw r22, r8 d1b2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y; x = out_x; d1b6: 68 83 st Y, r22 d1b8: 79 83 std Y+1, r23 ; 0x01 d1ba: 8a 83 std Y+2, r24 ; 0x02 d1bc: 9b 83 std Y+3, r25 ; 0x03 y = out_y; d1be: f8 01 movw r30, r16 d1c0: 40 82 st Z, r4 d1c2: 51 82 std Z+1, r5 ; 0x01 d1c4: 62 82 std Z+2, r6 ; 0x02 d1c6: 73 82 std Z+3, r7 ; 0x03 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { d1c8: 30 fe sbrs r3, 0 d1ca: 26 c0 rjmp .+76 ; 0xd218 // Then add the offset. x += world2machine_shift[0]; d1cc: 20 91 9a 04 lds r18, 0x049A ; 0x80049a d1d0: 30 91 9b 04 lds r19, 0x049B ; 0x80049b d1d4: 40 91 9c 04 lds r20, 0x049C ; 0x80049c d1d8: 50 91 9d 04 lds r21, 0x049D ; 0x80049d d1dc: 68 81 ld r22, Y d1de: 79 81 ldd r23, Y+1 ; 0x01 d1e0: 8a 81 ldd r24, Y+2 ; 0x02 d1e2: 9b 81 ldd r25, Y+3 ; 0x03 d1e4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d1e8: 68 83 st Y, r22 d1ea: 79 83 std Y+1, r23 ; 0x01 d1ec: 8a 83 std Y+2, r24 ; 0x02 d1ee: 9b 83 std Y+3, r25 ; 0x03 y += world2machine_shift[1]; d1f0: 20 91 9e 04 lds r18, 0x049E ; 0x80049e d1f4: 30 91 9f 04 lds r19, 0x049F ; 0x80049f d1f8: 40 91 a0 04 lds r20, 0x04A0 ; 0x8004a0 d1fc: 50 91 a1 04 lds r21, 0x04A1 ; 0x8004a1 d200: f8 01 movw r30, r16 d202: 60 81 ld r22, Z d204: 71 81 ldd r23, Z+1 ; 0x01 d206: 82 81 ldd r24, Z+2 ; 0x02 d208: 93 81 ldd r25, Z+3 ; 0x03 d20a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d20e: f8 01 movw r30, r16 d210: 60 83 st Z, r22 d212: 71 83 std Z+1, r23 ; 0x01 d214: 82 83 std Z+2, r24 ; 0x02 d216: 93 83 std Z+3, r25 ; 0x03 } } } d218: df 91 pop r29 d21a: cf 91 pop r28 d21c: 1f 91 pop r17 d21e: 0f 91 pop r16 d220: ff 90 pop r15 d222: ef 90 pop r14 d224: df 90 pop r13 d226: cf 90 pop r12 d228: bf 90 pop r11 d22a: af 90 pop r10 d22c: 9f 90 pop r9 d22e: 8f 90 pop r8 d230: 7f 90 pop r7 d232: 6f 90 pop r6 d234: 5f 90 pop r5 d236: 4f 90 pop r4 d238: 3f 90 pop r3 d23a: 08 95 ret 0000d23c : } } } inline bool world2machine_clamp(float &x, float &y) { d23c: 2f 92 push r2 d23e: 3f 92 push r3 d240: 4f 92 push r4 d242: 5f 92 push r5 d244: 6f 92 push r6 d246: 7f 92 push r7 d248: 8f 92 push r8 d24a: 9f 92 push r9 d24c: af 92 push r10 d24e: bf 92 push r11 d250: cf 92 push r12 d252: df 92 push r13 d254: ef 92 push r14 d256: ff 92 push r15 d258: 0f 93 push r16 d25a: 1f 93 push r17 d25c: cf 93 push r28 d25e: df 93 push r29 d260: 00 d0 rcall .+0 ; 0xd262 d262: 00 d0 rcall .+0 ; 0xd264 d264: 1f 92 push r1 d266: 1f 92 push r1 d268: cd b7 in r28, 0x3d ; 61 d26a: de b7 in r29, 0x3e ; 62 d26c: 8c 01 movw r16, r24 d26e: 1b 01 movw r2, r22 } } inline void world2machine(const float &x, const float &y, float &out_x, float &out_y) { out_x = x; d270: fc 01 movw r30, r24 d272: 80 81 ld r24, Z d274: 91 81 ldd r25, Z+1 ; 0x01 d276: a2 81 ldd r26, Z+2 ; 0x02 d278: b3 81 ldd r27, Z+3 ; 0x03 d27a: 89 83 std Y+1, r24 ; 0x01 d27c: 9a 83 std Y+2, r25 ; 0x02 d27e: ab 83 std Y+3, r26 ; 0x03 d280: bc 83 std Y+4, r27 ; 0x04 out_y = y; d282: fb 01 movw r30, r22 d284: 80 81 ld r24, Z d286: 91 81 ldd r25, Z+1 ; 0x01 d288: a2 81 ldd r26, Z+2 ; 0x02 d28a: b3 81 ldd r27, Z+3 ; 0x03 d28c: 8d 83 std Y+5, r24 ; 0x05 d28e: 9e 83 std Y+6, r25 ; 0x06 d290: af 83 std Y+7, r26 ; 0x07 d292: b8 87 std Y+8, r27 ; 0x08 world2machine(out_x, out_y); d294: be 01 movw r22, r28 d296: 6b 5f subi r22, 0xFB ; 251 d298: 7f 4f sbci r23, 0xFF ; 255 d29a: ce 01 movw r24, r28 d29c: 01 96 adiw r24, 0x01 ; 1 d29e: 0e 94 76 68 call 0xd0ec ; 0xd0ec inline bool world2machine_clamp(float &x, float &y) { bool clamped = false; float tmpx, tmpy; world2machine(x, y, tmpx, tmpy); if (tmpx < X_MIN_POS) { d2a2: c9 80 ldd r12, Y+1 ; 0x01 d2a4: da 80 ldd r13, Y+2 ; 0x02 d2a6: eb 80 ldd r14, Y+3 ; 0x03 d2a8: fc 80 ldd r15, Y+4 ; 0x04 d2aa: 20 e0 ldi r18, 0x00 ; 0 d2ac: 30 e0 ldi r19, 0x00 ; 0 d2ae: a9 01 movw r20, r18 d2b0: c7 01 movw r24, r14 d2b2: b6 01 movw r22, r12 d2b4: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> d2b8: 87 ff sbrs r24, 7 d2ba: 35 c0 rjmp .+106 ; 0xd326 tmpx = X_MIN_POS; d2bc: 19 82 std Y+1, r1 ; 0x01 d2be: 1a 82 std Y+2, r1 ; 0x02 d2c0: 1b 82 std Y+3, r1 ; 0x03 d2c2: 1c 82 std Y+4, r1 ; 0x04 clamped = true; } else if (tmpx > X_MAX_POS) { tmpx = X_MAX_POS; clamped = true; d2c4: ff 24 eor r15, r15 d2c6: f3 94 inc r15 } if (tmpy < Y_MIN_POS) { d2c8: 8d 80 ldd r8, Y+5 ; 0x05 d2ca: 9e 80 ldd r9, Y+6 ; 0x06 d2cc: af 80 ldd r10, Y+7 ; 0x07 d2ce: b8 84 ldd r11, Y+8 ; 0x08 d2d0: 20 e0 ldi r18, 0x00 ; 0 d2d2: 30 e0 ldi r19, 0x00 ; 0 d2d4: 40 e8 ldi r20, 0x80 ; 128 d2d6: 50 ec ldi r21, 0xC0 ; 192 d2d8: c5 01 movw r24, r10 d2da: b4 01 movw r22, r8 d2dc: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> d2e0: 87 ff sbrs r24, 7 d2e2: 35 c0 rjmp .+106 ; 0xd34e tmpy = Y_MIN_POS; d2e4: 80 e0 ldi r24, 0x00 ; 0 d2e6: 90 e0 ldi r25, 0x00 ; 0 d2e8: a0 e8 ldi r26, 0x80 ; 128 d2ea: b0 ec ldi r27, 0xC0 ; 192 clamped = true; } else if (tmpy > Y_MAX_POS) { tmpy = Y_MAX_POS; d2ec: 8d 83 std Y+5, r24 ; 0x05 d2ee: 9e 83 std Y+6, r25 ; 0x06 d2f0: af 83 std Y+7, r26 ; 0x07 d2f2: b8 87 std Y+8, r27 ; 0x08 clamped = true; } if (clamped) machine2world(tmpx, tmpy, x, y); d2f4: cd 80 ldd r12, Y+5 ; 0x05 d2f6: de 80 ldd r13, Y+6 ; 0x06 d2f8: ef 80 ldd r14, Y+7 ; 0x07 d2fa: f8 84 ldd r15, Y+8 ; 0x08 d2fc: 89 80 ldd r8, Y+1 ; 0x01 d2fe: 9a 80 ldd r9, Y+2 ; 0x02 d300: ab 80 ldd r10, Y+3 ; 0x03 d302: bc 80 ldd r11, Y+4 ; 0x04 world2machine(out_x, out_y); } inline void machine2world(float x, float y, float &out_x, float &out_y) { if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { d304: 70 90 a2 04 lds r7, 0x04A2 ; 0x8004a2 d308: 71 10 cpse r7, r1 d30a: 4c c0 rjmp .+152 ; 0xd3a4 // No correction. out_x = x; d30c: f8 01 movw r30, r16 d30e: 80 82 st Z, r8 d310: 91 82 std Z+1, r9 ; 0x01 d312: a2 82 std Z+2, r10 ; 0x02 d314: b3 82 std Z+3, r11 ; 0x03 out_y = y; d316: f1 01 movw r30, r2 d318: c0 82 st Z, r12 d31a: d1 82 std Z+1, r13 ; 0x01 d31c: e2 82 std Z+2, r14 ; 0x02 d31e: f3 82 std Z+3, r15 ; 0x03 if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { // Then add the offset. x -= world2machine_shift[0]; y -= world2machine_shift[1]; } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { d320: ff 24 eor r15, r15 d322: f3 94 inc r15 d324: 25 c0 rjmp .+74 ; 0xd370 float tmpx, tmpy; world2machine(x, y, tmpx, tmpy); if (tmpx < X_MIN_POS) { tmpx = X_MIN_POS; clamped = true; } else if (tmpx > X_MAX_POS) { d326: 20 e0 ldi r18, 0x00 ; 0 d328: 30 e0 ldi r19, 0x00 ; 0 d32a: 4a e7 ldi r20, 0x7A ; 122 d32c: 53 e4 ldi r21, 0x43 ; 67 d32e: c7 01 movw r24, r14 d330: b6 01 movw r22, r12 d332: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> } } inline bool world2machine_clamp(float &x, float &y) { bool clamped = false; d336: f1 2c mov r15, r1 float tmpx, tmpy; world2machine(x, y, tmpx, tmpy); if (tmpx < X_MIN_POS) { tmpx = X_MIN_POS; clamped = true; } else if (tmpx > X_MAX_POS) { d338: 18 16 cp r1, r24 d33a: 34 f6 brge .-116 ; 0xd2c8 tmpx = X_MAX_POS; d33c: 80 e0 ldi r24, 0x00 ; 0 d33e: 90 e0 ldi r25, 0x00 ; 0 d340: aa e7 ldi r26, 0x7A ; 122 d342: b3 e4 ldi r27, 0x43 ; 67 d344: 89 83 std Y+1, r24 ; 0x01 d346: 9a 83 std Y+2, r25 ; 0x02 d348: ab 83 std Y+3, r26 ; 0x03 d34a: bc 83 std Y+4, r27 ; 0x04 d34c: bb cf rjmp .-138 ; 0xd2c4 } if (tmpy < Y_MIN_POS) { tmpy = Y_MIN_POS; clamped = true; } else if (tmpy > Y_MAX_POS) { d34e: 20 e0 ldi r18, 0x00 ; 0 d350: 30 e0 ldi r19, 0x00 ; 0 d352: 42 e5 ldi r20, 0x52 ; 82 d354: 53 e4 ldi r21, 0x43 ; 67 d356: c5 01 movw r24, r10 d358: b4 01 movw r22, r8 d35a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> d35e: 18 16 cp r1, r24 d360: 2c f4 brge .+10 ; 0xd36c tmpy = Y_MAX_POS; d362: 80 e0 ldi r24, 0x00 ; 0 d364: 90 e0 ldi r25, 0x00 ; 0 d366: a2 e5 ldi r26, 0x52 ; 82 d368: b3 e4 ldi r27, 0x43 ; 67 d36a: c0 cf rjmp .-128 ; 0xd2ec clamped = true; } if (clamped) d36c: f1 10 cpse r15, r1 d36e: c2 cf rjmp .-124 ; 0xd2f4 machine2world(tmpx, tmpy, x, y); return clamped; } d370: 8f 2d mov r24, r15 d372: 28 96 adiw r28, 0x08 ; 8 d374: 0f b6 in r0, 0x3f ; 63 d376: f8 94 cli d378: de bf out 0x3e, r29 ; 62 d37a: 0f be out 0x3f, r0 ; 63 d37c: cd bf out 0x3d, r28 ; 61 d37e: df 91 pop r29 d380: cf 91 pop r28 d382: 1f 91 pop r17 d384: 0f 91 pop r16 d386: ff 90 pop r15 d388: ef 90 pop r14 d38a: df 90 pop r13 d38c: cf 90 pop r12 d38e: bf 90 pop r11 d390: af 90 pop r10 d392: 9f 90 pop r9 d394: 8f 90 pop r8 d396: 7f 90 pop r7 d398: 6f 90 pop r6 d39a: 5f 90 pop r5 d39c: 4f 90 pop r4 d39e: 3f 90 pop r3 d3a0: 2f 90 pop r2 d3a2: 08 95 ret if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { // No correction. out_x = x; out_y = y; } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { d3a4: 70 fe sbrs r7, 0 d3a6: 1c c0 rjmp .+56 ; 0xd3e0 // Then add the offset. x -= world2machine_shift[0]; d3a8: 20 91 9a 04 lds r18, 0x049A ; 0x80049a d3ac: 30 91 9b 04 lds r19, 0x049B ; 0x80049b d3b0: 40 91 9c 04 lds r20, 0x049C ; 0x80049c d3b4: 50 91 9d 04 lds r21, 0x049D ; 0x80049d d3b8: c5 01 movw r24, r10 d3ba: b4 01 movw r22, r8 d3bc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d3c0: 4b 01 movw r8, r22 d3c2: 5c 01 movw r10, r24 y -= world2machine_shift[1]; d3c4: 20 91 9e 04 lds r18, 0x049E ; 0x80049e d3c8: 30 91 9f 04 lds r19, 0x049F ; 0x80049f d3cc: 40 91 a0 04 lds r20, 0x04A0 ; 0x8004a0 d3d0: 50 91 a1 04 lds r21, 0x04A1 ; 0x8004a1 d3d4: c7 01 movw r24, r14 d3d6: b6 01 movw r22, r12 d3d8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d3dc: 6b 01 movw r12, r22 d3de: 7c 01 movw r14, r24 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { d3e0: 71 fe sbrs r7, 1 d3e2: 9e cf rjmp .-196 ; 0xd320 // Firs the skew & rotation correction. out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; d3e4: 20 91 8a 04 lds r18, 0x048A ; 0x80048a d3e8: 30 91 8b 04 lds r19, 0x048B ; 0x80048b d3ec: 40 91 8c 04 lds r20, 0x048C ; 0x80048c d3f0: 50 91 8d 04 lds r21, 0x048D ; 0x80048d d3f4: c5 01 movw r24, r10 d3f6: b4 01 movw r22, r8 d3f8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d3fc: 2b 01 movw r4, r22 d3fe: 3c 01 movw r6, r24 d400: 20 91 8e 04 lds r18, 0x048E ; 0x80048e d404: 30 91 8f 04 lds r19, 0x048F ; 0x80048f d408: 40 91 90 04 lds r20, 0x0490 ; 0x800490 d40c: 50 91 91 04 lds r21, 0x0491 ; 0x800491 d410: c7 01 movw r24, r14 d412: b6 01 movw r22, r12 d414: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d418: 9b 01 movw r18, r22 d41a: ac 01 movw r20, r24 d41c: c3 01 movw r24, r6 d41e: b2 01 movw r22, r4 d420: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d424: f8 01 movw r30, r16 d426: 60 83 st Z, r22 d428: 71 83 std Z+1, r23 ; 0x01 d42a: 82 83 std Z+2, r24 ; 0x02 d42c: 93 83 std Z+3, r25 ; 0x03 out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; d42e: 20 91 92 04 lds r18, 0x0492 ; 0x800492 d432: 30 91 93 04 lds r19, 0x0493 ; 0x800493 d436: 40 91 94 04 lds r20, 0x0494 ; 0x800494 d43a: 50 91 95 04 lds r21, 0x0495 ; 0x800495 d43e: c5 01 movw r24, r10 d440: b4 01 movw r22, r8 d442: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d446: 4b 01 movw r8, r22 d448: 5c 01 movw r10, r24 d44a: 20 91 96 04 lds r18, 0x0496 ; 0x800496 d44e: 30 91 97 04 lds r19, 0x0497 ; 0x800497 d452: 40 91 98 04 lds r20, 0x0498 ; 0x800498 d456: 50 91 99 04 lds r21, 0x0499 ; 0x800499 d45a: c7 01 movw r24, r14 d45c: b6 01 movw r22, r12 d45e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d462: 9b 01 movw r18, r22 d464: ac 01 movw r20, r24 d466: c5 01 movw r24, r10 d468: b4 01 movw r22, r8 d46a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d46e: f1 01 movw r30, r2 d470: 60 83 st Z, r22 d472: 71 83 std Z+1, r23 ; 0x01 d474: 82 83 std Z+2, r24 ; 0x02 d476: 93 83 std Z+3, r25 ; 0x03 d478: 53 cf rjmp .-346 ; 0xd320 0000d47a : return sampled; } void go_home_with_z_lift() { d47a: cf 93 push r28 d47c: df 93 push r29 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); d47e: 0e 94 41 65 call 0xca82 ; 0xca82 // Go home. // First move up to a safe height. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; d482: c1 e6 ldi r28, 0x61 ; 97 d484: d2 e1 ldi r29, 0x12 ; 18 d486: 80 e0 ldi r24, 0x00 ; 0 d488: 90 e0 ldi r25, 0x00 ; 0 d48a: a0 ea ldi r26, 0xA0 ; 160 d48c: b0 e4 ldi r27, 0x40 ; 64 d48e: 88 87 std Y+8, r24 ; 0x08 d490: 99 87 std Y+9, r25 ; 0x09 d492: aa 87 std Y+10, r26 ; 0x0a d494: bb 87 std Y+11, r27 ; 0x0b go_to_current(homing_feedrate[Z_AXIS] / 60); d496: 65 e5 ldi r22, 0x55 ; 85 d498: 75 e5 ldi r23, 0x55 ; 85 d49a: 85 e5 ldi r24, 0x55 ; 85 d49c: 91 e4 ldi r25, 0x41 ; 65 d49e: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // Second move to XY [0, 0]. current_position[X_AXIS] = X_MIN_POS + 0.2; d4a2: 8d ec ldi r24, 0xCD ; 205 d4a4: 9c ec ldi r25, 0xCC ; 204 d4a6: ac e4 ldi r26, 0x4C ; 76 d4a8: be e3 ldi r27, 0x3E ; 62 d4aa: 88 83 st Y, r24 d4ac: 99 83 std Y+1, r25 ; 0x01 d4ae: aa 83 std Y+2, r26 ; 0x02 d4b0: bb 83 std Y+3, r27 ; 0x03 current_position[Y_AXIS] = Y_MIN_POS + 0.2; d4b2: 83 e3 ldi r24, 0x33 ; 51 d4b4: 93 e3 ldi r25, 0x33 ; 51 d4b6: a3 e7 ldi r26, 0x73 ; 115 d4b8: b0 ec ldi r27, 0xC0 ; 192 d4ba: 8c 83 std Y+4, r24 ; 0x04 d4bc: 9d 83 std Y+5, r25 ; 0x05 d4be: ae 83 std Y+6, r26 ; 0x06 d4c0: bf 83 std Y+7, r27 ; 0x07 // Clamp to the physical coordinates. world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); d4c2: 65 e6 ldi r22, 0x65 ; 101 d4c4: 72 e1 ldi r23, 0x12 ; 18 d4c6: ce 01 movw r24, r28 d4c8: 0e 94 1e 69 call 0xd23c ; 0xd23c go_to_current((3 * homing_feedrate[X_AXIS]) / 60); d4cc: 60 e0 ldi r22, 0x00 ; 0 d4ce: 70 e0 ldi r23, 0x00 ; 0 d4d0: 86 e1 ldi r24, 0x16 ; 22 d4d2: 93 e4 ldi r25, 0x43 ; 67 d4d4: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // Third move up to a safe height. current_position[Z_AXIS] = Z_MIN_POS; d4d8: 8a e9 ldi r24, 0x9A ; 154 d4da: 99 e9 ldi r25, 0x99 ; 153 d4dc: a9 e1 ldi r26, 0x19 ; 25 d4de: be e3 ldi r27, 0x3E ; 62 d4e0: 88 87 std Y+8, r24 ; 0x08 d4e2: 99 87 std Y+9, r25 ; 0x09 d4e4: aa 87 std Y+10, r26 ; 0x0a d4e6: bb 87 std Y+11, r27 ; 0x0b go_to_current(homing_feedrate[Z_AXIS] / 60); d4e8: 65 e5 ldi r22, 0x55 ; 85 d4ea: 75 e5 ldi r23, 0x55 ; 85 d4ec: 85 e5 ldi r24, 0x55 ; 85 d4ee: 91 e4 ldi r25, 0x41 ; 65 } d4f0: df 91 pop r29 d4f2: cf 91 pop r28 // Clamp to the physical coordinates. world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); go_to_current((3 * homing_feedrate[X_AXIS]) / 60); // Third move up to a safe height. current_position[Z_AXIS] = Z_MIN_POS; go_to_current(homing_feedrate[Z_AXIS] / 60); d4f4: 0d 94 f6 50 jmp 0x2a1ec ; 0x2a1ec 0000d4f8 : if(next_feedrate > 0.f) feedrate = next_feedrate; } } void clamp_to_software_endstops(float target[3]) { d4f8: cf 92 push r12 d4fa: df 92 push r13 d4fc: ef 92 push r14 d4fe: ff 92 push r15 d500: cf 93 push r28 d502: df 93 push r29 d504: ec 01 movw r28, r24 #ifdef DEBUG_DISABLE_SWLIMITS return; #endif //DEBUG_DISABLE_SWLIMITS world2machine_clamp(target[0], target[1]); d506: bc 01 movw r22, r24 d508: 6c 5f subi r22, 0xFC ; 252 d50a: 7f 4f sbci r23, 0xFF ; 255 d50c: 0e 94 1e 69 call 0xd23c ; 0xd23c // Clamp the Z coordinate. if (min_software_endstops) { if (target[Z_AXIS] < min_pos[Z_AXIS]) target[Z_AXIS] = min_pos[Z_AXIS]; d510: c0 90 2c 02 lds r12, 0x022C ; 0x80022c d514: d0 90 2d 02 lds r13, 0x022D ; 0x80022d d518: e0 90 2e 02 lds r14, 0x022E ; 0x80022e d51c: f0 90 2f 02 lds r15, 0x022F ; 0x80022f d520: a7 01 movw r20, r14 d522: 96 01 movw r18, r12 d524: 68 85 ldd r22, Y+8 ; 0x08 d526: 79 85 ldd r23, Y+9 ; 0x09 d528: 8a 85 ldd r24, Y+10 ; 0x0a d52a: 9b 85 ldd r25, Y+11 ; 0x0b d52c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> d530: 87 ff sbrs r24, 7 d532: 04 c0 rjmp .+8 ; 0xd53c d534: c8 86 std Y+8, r12 ; 0x08 d536: d9 86 std Y+9, r13 ; 0x09 d538: ea 86 std Y+10, r14 ; 0x0a d53a: fb 86 std Y+11, r15 ; 0x0b } if (max_software_endstops) { if (target[Z_AXIS] > max_pos[Z_AXIS]) target[Z_AXIS] = max_pos[Z_AXIS]; d53c: c0 90 20 02 lds r12, 0x0220 ; 0x800220 d540: d0 90 21 02 lds r13, 0x0221 ; 0x800221 d544: e0 90 22 02 lds r14, 0x0222 ; 0x800222 d548: f0 90 23 02 lds r15, 0x0223 ; 0x800223 d54c: a7 01 movw r20, r14 d54e: 96 01 movw r18, r12 d550: 68 85 ldd r22, Y+8 ; 0x08 d552: 79 85 ldd r23, Y+9 ; 0x09 d554: 8a 85 ldd r24, Y+10 ; 0x0a d556: 9b 85 ldd r25, Y+11 ; 0x0b d558: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> d55c: 18 16 cp r1, r24 d55e: 24 f4 brge .+8 ; 0xd568 d560: c8 86 std Y+8, r12 ; 0x08 d562: d9 86 std Y+9, r13 ; 0x09 d564: ea 86 std Y+10, r14 ; 0x0a d566: fb 86 std Y+11, r15 ; 0x0b } } d568: df 91 pop r29 d56a: cf 91 pop r28 d56c: ff 90 pop r15 d56e: ef 90 pop r14 d570: df 90 pop r13 d572: cf 90 pop r12 d574: 08 95 ret 0000d576 : plan_buffer_line(x, y, z, e, feed_rate, current_position); } #endif // MESH_BED_LEVELING void prepare_move(uint16_t start_segment_idx) { d576: 2f 92 push r2 d578: 3f 92 push r3 d57a: 4f 92 push r4 d57c: 5f 92 push r5 d57e: 6f 92 push r6 d580: 7f 92 push r7 d582: 8f 92 push r8 d584: 9f 92 push r9 d586: af 92 push r10 d588: bf 92 push r11 d58a: cf 92 push r12 d58c: df 92 push r13 d58e: ef 92 push r14 d590: ff 92 push r15 d592: 0f 93 push r16 d594: 1f 93 push r17 d596: cf 93 push r28 d598: df 93 push r29 d59a: cd b7 in r28, 0x3d ; 61 d59c: de b7 in r29, 0x3e ; 62 d59e: a2 97 sbiw r28, 0x22 ; 34 d5a0: 0f b6 in r0, 0x3f ; 63 d5a2: f8 94 cli d5a4: de bf out 0x3e, r29 ; 62 d5a6: 0f be out 0x3f, r0 ; 63 d5a8: cd bf out 0x3d, r28 ; 61 d5aa: 1c 01 movw r2, r24 clamp_to_software_endstops(destination); d5ac: 89 e2 ldi r24, 0x29 ; 41 d5ae: 96 e0 ldi r25, 0x06 ; 6 d5b0: 0e 94 7c 6a call 0xd4f8 ; 0xd4f8 previous_millis_cmd.start(); d5b4: 88 e4 ldi r24, 0x48 ; 72 d5b6: 93 e0 ldi r25, 0x03 ; 3 d5b8: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> // Do not use feedmultiply for E or Z only moves if((current_position[X_AXIS] == destination[X_AXIS]) && (current_position[Y_AXIS] == destination[Y_AXIS])) { d5bc: 40 90 61 12 lds r4, 0x1261 ; 0x801261 d5c0: 50 90 62 12 lds r5, 0x1262 ; 0x801262 d5c4: 60 90 63 12 lds r6, 0x1263 ; 0x801263 d5c8: 70 90 64 12 lds r7, 0x1264 ; 0x801264 d5cc: c0 90 29 06 lds r12, 0x0629 ; 0x800629 d5d0: d0 90 2a 06 lds r13, 0x062A ; 0x80062a d5d4: e0 90 2b 06 lds r14, 0x062B ; 0x80062b d5d8: f0 90 2c 06 lds r15, 0x062C ; 0x80062c d5dc: a7 01 movw r20, r14 d5de: 96 01 movw r18, r12 d5e0: c3 01 movw r24, r6 d5e2: b2 01 movw r22, r4 d5e4: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> d5e8: 81 11 cpse r24, r1 d5ea: 3f c0 rjmp .+126 ; 0xd66a d5ec: 20 91 2d 06 lds r18, 0x062D ; 0x80062d d5f0: 30 91 2e 06 lds r19, 0x062E ; 0x80062e d5f4: 40 91 2f 06 lds r20, 0x062F ; 0x80062f d5f8: 50 91 30 06 lds r21, 0x0630 ; 0x800630 d5fc: 60 91 65 12 lds r22, 0x1265 ; 0x801265 d600: 70 91 66 12 lds r23, 0x1266 ; 0x801266 d604: 80 91 67 12 lds r24, 0x1267 ; 0x801267 d608: 90 91 68 12 lds r25, 0x1268 ; 0x801268 d60c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> d610: 81 11 cpse r24, r1 d612: 2b c0 rjmp .+86 ; 0xd66a plan_buffer_line_destinationXYZE(feedrate/60); d614: 20 e0 ldi r18, 0x00 ; 0 d616: 30 e0 ldi r19, 0x00 ; 0 d618: 40 e7 ldi r20, 0x70 ; 112 d61a: 52 e4 ldi r21, 0x42 ; 66 d61c: 60 91 7a 02 lds r22, 0x027A ; 0x80027a d620: 70 91 7b 02 lds r23, 0x027B ; 0x80027b d624: 80 91 7c 02 lds r24, 0x027C ; 0x80027c d628: 90 91 7d 02 lds r25, 0x027D ; 0x80027d d62c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> d630: 0f 94 4e 4c call 0x2989c ; 0x2989c #else plan_buffer_line_destinationXYZE(feedrate*feedmultiply*(1./(60.f*100.f))); #endif } set_current_to_destination(); d634: 0e 94 e8 54 call 0xa9d0 ; 0xa9d0 } d638: a2 96 adiw r28, 0x22 ; 34 d63a: 0f b6 in r0, 0x3f ; 63 d63c: f8 94 cli d63e: de bf out 0x3e, r29 ; 62 d640: 0f be out 0x3f, r0 ; 63 d642: cd bf out 0x3d, r28 ; 61 d644: df 91 pop r29 d646: cf 91 pop r28 d648: 1f 91 pop r17 d64a: 0f 91 pop r16 d64c: ff 90 pop r15 d64e: ef 90 pop r14 d650: df 90 pop r13 d652: cf 90 pop r12 d654: bf 90 pop r11 d656: af 90 pop r10 d658: 9f 90 pop r9 d65a: 8f 90 pop r8 d65c: 7f 90 pop r7 d65e: 6f 90 pop r6 d660: 5f 90 pop r5 d662: 4f 90 pop r4 d664: 3f 90 pop r3 d666: 2f 90 pop r2 d668: 08 95 ret if((current_position[X_AXIS] == destination[X_AXIS]) && (current_position[Y_AXIS] == destination[Y_AXIS])) { plan_buffer_line_destinationXYZE(feedrate/60); } else { #ifdef MESH_BED_LEVELING mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), start_segment_idx); d66a: 60 91 8e 02 lds r22, 0x028E ; 0x80028e d66e: 70 91 8f 02 lds r23, 0x028F ; 0x80028f d672: 07 2e mov r0, r23 d674: 00 0c add r0, r0 d676: 88 0b sbc r24, r24 d678: 99 0b sbc r25, r25 d67a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> d67e: 20 91 7a 02 lds r18, 0x027A ; 0x80027a d682: 30 91 7b 02 lds r19, 0x027B ; 0x80027b d686: 40 91 7c 02 lds r20, 0x027C ; 0x80027c d68a: 50 91 7d 02 lds r21, 0x027D ; 0x80027d d68e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d692: 2e e3 ldi r18, 0x3E ; 62 d694: 33 ec ldi r19, 0xC3 ; 195 d696: 4e e2 ldi r20, 0x2E ; 46 d698: 59 e3 ldi r21, 0x39 ; 57 d69a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d69e: 6f 83 std Y+7, r22 ; 0x07 d6a0: 78 87 std Y+8, r23 ; 0x08 d6a2: 89 87 std Y+9, r24 ; 0x09 d6a4: 9a 87 std Y+10, r25 ; 0x0a void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, uint16_t start_segment_idx = 0) { float dx = x - current_position[X_AXIS]; float dy = y - current_position[Y_AXIS]; uint16_t n_segments = 0; if (mbl.active) { d6a6: 80 91 09 13 lds r24, 0x1309 ; 0x801309 d6aa: 88 23 and r24, r24 d6ac: 09 f4 brne .+2 ; 0xd6b0 d6ae: 0f c1 rjmp .+542 ; 0xd8ce return 1; //begin with the first segment } #ifdef MESH_BED_LEVELING void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, uint16_t start_segment_idx = 0) { float dx = x - current_position[X_AXIS]; d6b0: a3 01 movw r20, r6 d6b2: 92 01 movw r18, r4 d6b4: c7 01 movw r24, r14 d6b6: b6 01 movw r22, r12 d6b8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d6bc: 2b 01 movw r4, r22 d6be: 3c 01 movw r6, r24 float dy = y - current_position[Y_AXIS]; d6c0: 20 91 65 12 lds r18, 0x1265 ; 0x801265 d6c4: 30 91 66 12 lds r19, 0x1266 ; 0x801266 d6c8: 40 91 67 12 lds r20, 0x1267 ; 0x801267 d6cc: 50 91 68 12 lds r21, 0x1268 ; 0x801268 d6d0: 60 91 2d 06 lds r22, 0x062D ; 0x80062d d6d4: 70 91 2e 06 lds r23, 0x062E ; 0x80062e d6d8: 80 91 2f 06 lds r24, 0x062F ; 0x80062f d6dc: 90 91 30 06 lds r25, 0x0630 ; 0x800630 d6e0: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d6e4: 6b 87 std Y+11, r22 ; 0x0b d6e6: 7c 87 std Y+12, r23 ; 0x0c d6e8: 8d 87 std Y+13, r24 ; 0x0d d6ea: 9e 87 std Y+14, r25 ; 0x0e uint16_t n_segments = 0; if (mbl.active) { float len = fabs(dx) + fabs(dy); d6ec: c3 01 movw r24, r6 d6ee: b2 01 movw r22, r4 d6f0: 9f 77 andi r25, 0x7F ; 127 d6f2: 2b 85 ldd r18, Y+11 ; 0x0b d6f4: 3c 85 ldd r19, Y+12 ; 0x0c d6f6: 4d 85 ldd r20, Y+13 ; 0x0d d6f8: 5e 85 ldd r21, Y+14 ; 0x0e d6fa: 5f 77 andi r21, 0x7F ; 127 d6fc: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d700: 6b 01 movw r12, r22 d702: 7c 01 movw r14, r24 if (len > 0) d704: 20 e0 ldi r18, 0x00 ; 0 d706: 30 e0 ldi r19, 0x00 ; 0 d708: a9 01 movw r20, r18 d70a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> d70e: 18 16 cp r1, r24 d710: 0c f0 brlt .+2 ; 0xd714 d712: dd c0 rjmp .+442 ; 0xd8ce // Split to 3cm segments or shorter. n_segments = uint16_t(ceil(len / 30.f)); d714: 20 e0 ldi r18, 0x00 ; 0 d716: 30 e0 ldi r19, 0x00 ; 0 d718: 40 ef ldi r20, 0xF0 ; 240 d71a: 51 e4 ldi r21, 0x41 ; 65 d71c: c7 01 movw r24, r14 d71e: b6 01 movw r22, r12 d720: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> d724: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc d728: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> d72c: 7e 83 std Y+6, r23 ; 0x06 d72e: 6d 83 std Y+5, r22 ; 0x05 } if (n_segments > 1 && start_segment_idx) { d730: 62 30 cpi r22, 0x02 ; 2 d732: 71 05 cpc r23, r1 d734: 08 f4 brcc .+2 ; 0xd738 d736: cb c0 rjmp .+406 ; 0xd8ce d738: 21 14 cp r2, r1 d73a: 31 04 cpc r3, r1 d73c: 09 f4 brne .+2 ; 0xd740 d73e: c7 c0 rjmp .+398 ; 0xd8ce float dz = z - current_position[Z_AXIS]; d740: 20 91 69 12 lds r18, 0x1269 ; 0x801269 d744: 30 91 6a 12 lds r19, 0x126A ; 0x80126a d748: 40 91 6b 12 lds r20, 0x126B ; 0x80126b d74c: 50 91 6c 12 lds r21, 0x126C ; 0x80126c d750: 60 91 31 06 lds r22, 0x0631 ; 0x800631 d754: 70 91 32 06 lds r23, 0x0632 ; 0x800632 d758: 80 91 33 06 lds r24, 0x0633 ; 0x800633 d75c: 90 91 34 06 lds r25, 0x0634 ; 0x800634 d760: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d764: 6f 87 std Y+15, r22 ; 0x0f d766: 78 8b std Y+16, r23 ; 0x10 d768: 89 8b std Y+17, r24 ; 0x11 d76a: 9a 8b std Y+18, r25 ; 0x12 float de = e - current_position[E_AXIS]; d76c: 20 91 6d 12 lds r18, 0x126D ; 0x80126d d770: 30 91 6e 12 lds r19, 0x126E ; 0x80126e d774: 40 91 6f 12 lds r20, 0x126F ; 0x80126f d778: 50 91 70 12 lds r21, 0x1270 ; 0x801270 d77c: 60 91 35 06 lds r22, 0x0635 ; 0x800635 d780: 70 91 36 06 lds r23, 0x0636 ; 0x800636 d784: 80 91 37 06 lds r24, 0x0637 ; 0x800637 d788: 90 91 38 06 lds r25, 0x0638 ; 0x800638 d78c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d790: 6b 8b std Y+19, r22 ; 0x13 d792: 7c 8b std Y+20, r23 ; 0x14 d794: 8d 8b std Y+21, r24 ; 0x15 d796: 9e 8b std Y+22, r25 ; 0x16 for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { float t = float(i) / float(n_segments); d798: ad 81 ldd r26, Y+5 ; 0x05 d79a: be 81 ldd r27, Y+6 ; 0x06 d79c: cd 01 movw r24, r26 d79e: b0 e0 ldi r27, 0x00 ; 0 d7a0: a0 e0 ldi r26, 0x00 ; 0 d7a2: 8f 8f std Y+31, r24 ; 0x1f d7a4: 98 a3 std Y+32, r25 ; 0x20 d7a6: a9 a3 std Y+33, r26 ; 0x21 d7a8: ba a3 std Y+34, r27 ; 0x22 if (n_segments > 1 && start_segment_idx) { float dz = z - current_position[Z_AXIS]; float de = e - current_position[E_AXIS]; for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { d7aa: 2d 81 ldd r18, Y+5 ; 0x05 d7ac: 3e 81 ldd r19, Y+6 ; 0x06 d7ae: 22 16 cp r2, r18 d7b0: 33 06 cpc r3, r19 d7b2: 08 f0 brcs .+2 ; 0xd7b6 d7b4: 8c c0 rjmp .+280 ; 0xd8ce float t = float(i) / float(n_segments); d7b6: b1 01 movw r22, r2 d7b8: 90 e0 ldi r25, 0x00 ; 0 d7ba: 80 e0 ldi r24, 0x00 ; 0 d7bc: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> d7c0: 6b 01 movw r12, r22 d7c2: 7c 01 movw r14, r24 d7c4: 6f 8d ldd r22, Y+31 ; 0x1f d7c6: 78 a1 ldd r23, Y+32 ; 0x20 d7c8: 89 a1 ldd r24, Y+33 ; 0x21 d7ca: 9a a1 ldd r25, Y+34 ; 0x22 d7cc: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> d7d0: 9b 01 movw r18, r22 d7d2: ac 01 movw r20, r24 d7d4: c7 01 movw r24, r14 d7d6: b6 01 movw r22, r12 d7d8: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> d7dc: 6b 01 movw r12, r22 d7de: 7c 01 movw r14, r24 plan_buffer_line(current_position[X_AXIS] + t * dx, current_position[Y_AXIS] + t * dy, current_position[Z_AXIS] + t * dz, current_position[E_AXIS] + t * de, d7e0: ac 01 movw r20, r24 d7e2: 9b 01 movw r18, r22 d7e4: 6b 89 ldd r22, Y+19 ; 0x13 d7e6: 7c 89 ldd r23, Y+20 ; 0x14 d7e8: 8d 89 ldd r24, Y+21 ; 0x15 d7ea: 9e 89 ldd r25, Y+22 ; 0x16 d7ec: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d7f0: 9b 01 movw r18, r22 d7f2: ac 01 movw r20, r24 d7f4: 60 91 6d 12 lds r22, 0x126D ; 0x80126d d7f8: 70 91 6e 12 lds r23, 0x126E ; 0x80126e d7fc: 80 91 6f 12 lds r24, 0x126F ; 0x80126f d800: 90 91 70 12 lds r25, 0x1270 ; 0x801270 d804: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d808: 69 83 std Y+1, r22 ; 0x01 d80a: 7a 83 std Y+2, r23 ; 0x02 d80c: 8b 83 std Y+3, r24 ; 0x03 d80e: 9c 83 std Y+4, r25 ; 0x04 for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { float t = float(i) / float(n_segments); plan_buffer_line(current_position[X_AXIS] + t * dx, current_position[Y_AXIS] + t * dy, current_position[Z_AXIS] + t * dz, d810: a7 01 movw r20, r14 d812: 96 01 movw r18, r12 d814: 6f 85 ldd r22, Y+15 ; 0x0f d816: 78 89 ldd r23, Y+16 ; 0x10 d818: 89 89 ldd r24, Y+17 ; 0x11 d81a: 9a 89 ldd r25, Y+18 ; 0x12 d81c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> float dz = z - current_position[Z_AXIS]; float de = e - current_position[E_AXIS]; for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { float t = float(i) / float(n_segments); plan_buffer_line(current_position[X_AXIS] + t * dx, d820: 20 91 69 12 lds r18, 0x1269 ; 0x801269 d824: 30 91 6a 12 lds r19, 0x126A ; 0x80126a d828: 40 91 6b 12 lds r20, 0x126B ; 0x80126b d82c: 50 91 6c 12 lds r21, 0x126C ; 0x80126c d830: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d834: 6f 8b std Y+23, r22 ; 0x17 d836: 78 8f std Y+24, r23 ; 0x18 d838: 89 8f std Y+25, r24 ; 0x19 d83a: 9a 8f std Y+26, r25 ; 0x1a current_position[Y_AXIS] + t * dy, d83c: a7 01 movw r20, r14 d83e: 96 01 movw r18, r12 d840: 6b 85 ldd r22, Y+11 ; 0x0b d842: 7c 85 ldd r23, Y+12 ; 0x0c d844: 8d 85 ldd r24, Y+13 ; 0x0d d846: 9e 85 ldd r25, Y+14 ; 0x0e d848: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> float dz = z - current_position[Z_AXIS]; float de = e - current_position[E_AXIS]; for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { float t = float(i) / float(n_segments); plan_buffer_line(current_position[X_AXIS] + t * dx, d84c: 20 91 65 12 lds r18, 0x1265 ; 0x801265 d850: 30 91 66 12 lds r19, 0x1266 ; 0x801266 d854: 40 91 67 12 lds r20, 0x1267 ; 0x801267 d858: 50 91 68 12 lds r21, 0x1268 ; 0x801268 d85c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d860: 6b 8f std Y+27, r22 ; 0x1b d862: 7c 8f std Y+28, r23 ; 0x1c d864: 8d 8f std Y+29, r24 ; 0x1d d866: 9e 8f std Y+30, r25 ; 0x1e d868: a7 01 movw r20, r14 d86a: 96 01 movw r18, r12 d86c: c3 01 movw r24, r6 d86e: b2 01 movw r22, r4 d870: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> d874: 20 91 61 12 lds r18, 0x1261 ; 0x801261 d878: 30 91 62 12 lds r19, 0x1262 ; 0x801262 d87c: 40 91 63 12 lds r20, 0x1263 ; 0x801263 d880: 50 91 64 12 lds r21, 0x1264 ; 0x801264 d884: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d888: 3f 92 push r3 d88a: 2f 92 push r2 d88c: a1 e6 ldi r26, 0x61 ; 97 d88e: b2 e1 ldi r27, 0x12 ; 18 d890: bf 93 push r27 d892: af 93 push r26 d894: 8f 80 ldd r8, Y+7 ; 0x07 d896: 98 84 ldd r9, Y+8 ; 0x08 d898: a9 84 ldd r10, Y+9 ; 0x09 d89a: ba 84 ldd r11, Y+10 ; 0x0a d89c: de 01 movw r26, r28 d89e: 11 96 adiw r26, 0x01 ; 1 d8a0: 6d 01 movw r12, r26 d8a2: ef 88 ldd r14, Y+23 ; 0x17 d8a4: f8 8c ldd r15, Y+24 ; 0x18 d8a6: 09 8d ldd r16, Y+25 ; 0x19 d8a8: 1a 8d ldd r17, Y+26 ; 0x1a d8aa: 2b 8d ldd r18, Y+27 ; 0x1b d8ac: 3c 8d ldd r19, Y+28 ; 0x1c d8ae: 4d 8d ldd r20, Y+29 ; 0x1d d8b0: 5e 8d ldd r21, Y+30 ; 0x1e d8b2: 0f 94 33 3d call 0x27a66 ; 0x27a66 current_position[Y_AXIS] + t * dy, current_position[Z_AXIS] + t * dz, current_position[E_AXIS] + t * de, feed_rate, current_position, i); if (planner_aborted) d8b6: 0f 90 pop r0 d8b8: 0f 90 pop r0 d8ba: 0f 90 pop r0 d8bc: 0f 90 pop r0 d8be: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 d8c2: 81 11 cpse r24, r1 d8c4: b7 ce rjmp .-658 ; 0xd634 if (n_segments > 1 && start_segment_idx) { float dz = z - current_position[Z_AXIS]; float de = e - current_position[E_AXIS]; for (uint16_t i = start_segment_idx; i < n_segments; ++ i) { d8c6: bf ef ldi r27, 0xFF ; 255 d8c8: 2b 1a sub r2, r27 d8ca: 3b 0a sbc r3, r27 d8cc: 6e cf rjmp .-292 ; 0xd7aa if (planner_aborted) return; } } // The rest of the path. plan_buffer_line(x, y, z, e, feed_rate, current_position); d8ce: e0 90 31 06 lds r14, 0x0631 ; 0x800631 d8d2: f0 90 32 06 lds r15, 0x0632 ; 0x800632 d8d6: 00 91 33 06 lds r16, 0x0633 ; 0x800633 d8da: 10 91 34 06 lds r17, 0x0634 ; 0x800634 d8de: 20 91 2d 06 lds r18, 0x062D ; 0x80062d d8e2: 30 91 2e 06 lds r19, 0x062E ; 0x80062e d8e6: 40 91 2f 06 lds r20, 0x062F ; 0x80062f d8ea: 50 91 30 06 lds r21, 0x0630 ; 0x800630 d8ee: 60 91 29 06 lds r22, 0x0629 ; 0x800629 d8f2: 70 91 2a 06 lds r23, 0x062A ; 0x80062a d8f6: 80 91 2b 06 lds r24, 0x062B ; 0x80062b d8fa: 90 91 2c 06 lds r25, 0x062C ; 0x80062c d8fe: 1f 92 push r1 d900: 1f 92 push r1 d902: e1 e6 ldi r30, 0x61 ; 97 d904: f2 e1 ldi r31, 0x12 ; 18 d906: ff 93 push r31 d908: ef 93 push r30 d90a: 8f 80 ldd r8, Y+7 ; 0x07 d90c: 98 84 ldd r9, Y+8 ; 0x08 d90e: a9 84 ldd r10, Y+9 ; 0x09 d910: ba 84 ldd r11, Y+10 ; 0x0a d912: e5 e3 ldi r30, 0x35 ; 53 d914: ce 2e mov r12, r30 d916: e6 e0 ldi r30, 0x06 ; 6 d918: de 2e mov r13, r30 d91a: 0f 94 33 3d call 0x27a66 ; 0x27a66 d91e: 0f 90 pop r0 d920: 0f 90 pop r0 d922: 0f 90 pop r0 d924: 0f 90 pop r0 d926: 86 ce rjmp .-756 ; 0xd634 0000d928 : /// @brief Safely move Z-axis by distance delta (mm) /// @param delta travel distance in mm /// @returns The actual travel distance in mm. Endstop may limit the requested move. float raise_z(float delta) { d928: cf 92 push r12 d92a: df 92 push r13 d92c: ef 92 push r14 d92e: ff 92 push r15 d930: cf 93 push r28 float travel_z = current_position[Z_AXIS]; d932: c0 90 69 12 lds r12, 0x1269 ; 0x801269 d936: d0 90 6a 12 lds r13, 0x126A ; 0x80126a d93a: e0 90 6b 12 lds r14, 0x126B ; 0x80126b d93e: f0 90 6c 12 lds r15, 0x126C ; 0x80126c // Prepare to move Z axis current_position[Z_AXIS] += delta; d942: a7 01 movw r20, r14 d944: 96 01 movw r18, r12 d946: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> d94a: 60 93 69 12 sts 0x1269, r22 ; 0x801269 d94e: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a d952: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b d956: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT) bool z_min_endstop = (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); d95a: 83 b1 in r24, 0x03 ; 3 #else bool z_min_endstop = false; #endif if (axis_known_position[Z_AXIS] || z_min_endstop) d95c: 90 91 3b 06 lds r25, 0x063B ; 0x80063b d960: 91 11 cpse r25, r1 d962: 02 c0 rjmp .+4 ; 0xd968 d964: 84 ff sbrs r24, 4 d966: 26 c0 rjmp .+76 ; 0xd9b4 { // current position is known or very low, it's safe to raise Z clamp_to_software_endstops(current_position); d968: 81 e6 ldi r24, 0x61 ; 97 d96a: 92 e1 ldi r25, 0x12 ; 18 d96c: 0e 94 7c 6a call 0xd4f8 ; 0xd4f8 plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]); d970: 60 91 83 0d lds r22, 0x0D83 ; 0x800d83 d974: 70 91 84 0d lds r23, 0x0D84 ; 0x800d84 d978: 80 91 85 0d lds r24, 0x0D85 ; 0x800d85 d97c: 90 91 86 0d lds r25, 0x0D86 ; 0x800d86 d980: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); d984: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Get the final travel distance travel_z = current_position[Z_AXIS] - travel_z; d988: a7 01 movw r20, r14 d98a: 96 01 movw r18, r12 d98c: 60 91 69 12 lds r22, 0x1269 ; 0x801269 d990: 70 91 6a 12 lds r23, 0x126A ; 0x80126a d994: 80 91 6b 12 lds r24, 0x126B ; 0x80126b d998: 90 91 6c 12 lds r25, 0x126C ; 0x80126c d99c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d9a0: 6b 01 movw r12, r22 d9a2: 7c 01 movw r14, r24 #endif //TMC2130 enable_z_endstop(z_endstop_enabled); } return travel_z; } d9a4: c7 01 movw r24, r14 d9a6: b6 01 movw r22, r12 d9a8: cf 91 pop r28 d9aa: ff 90 pop r15 d9ac: ef 90 pop r14 d9ae: df 90 pop r13 d9b0: cf 90 pop r12 d9b2: 08 95 ret // Get the final travel distance travel_z = current_position[Z_AXIS] - travel_z; } else { // ensure Z is powered in normal mode to overcome initial load enable_z(); d9b4: 15 98 cbi 0x02, 5 ; 2 st_synchronize(); d9b6: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // rely on crashguard to limit damage bool z_endstop_enabled = enable_z_endstop(true); d9ba: 81 e0 ldi r24, 0x01 ; 1 d9bc: 0f 94 88 25 call 0x24b10 ; 0x24b10 d9c0: c8 2f mov r28, r24 #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); #endif //TMC2130 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); d9c2: 65 e5 ldi r22, 0x55 ; 85 d9c4: 75 e5 ldi r23, 0x55 ; 85 d9c6: 85 e5 ldi r24, 0x55 ; 85 d9c8: 91 e4 ldi r25, 0x41 ; 65 d9ca: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); d9ce: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Get the final travel distance travel_z = st_get_position_mm(Z_AXIS) - travel_z; d9d2: 82 e0 ldi r24, 0x02 ; 2 d9d4: 0f 94 e7 1a call 0x235ce ; 0x235ce d9d8: a7 01 movw r20, r14 d9da: 96 01 movw r18, r12 d9dc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> d9e0: 6b 01 movw r12, r22 d9e2: 7c 01 movw r14, r24 current_position[Z_AXIS] = max_pos[Z_AXIS]; plan_set_position_curposXYZE(); } tmc2130_home_exit(); #endif //TMC2130 enable_z_endstop(z_endstop_enabled); d9e4: 8c 2f mov r24, r28 d9e6: 0f 94 88 25 call 0x24b10 ; 0x24b10 d9ea: dc cf rjmp .-72 ; 0xd9a4 0000d9ec : // // contrarily to a simple move, this function will carefully plan a move // when the current Z position is unknown. In such cases, stallguard is // enabled and will prevent prolonged pushing against the Z tops void raise_z_above(float target) { d9ec: 8f 92 push r8 d9ee: 9f 92 push r9 d9f0: af 92 push r10 d9f2: bf 92 push r11 d9f4: cf 92 push r12 d9f6: df 92 push r13 d9f8: ef 92 push r14 d9fa: ff 92 push r15 d9fc: 4b 01 movw r8, r22 d9fe: 5c 01 movw r10, r24 if (current_position[Z_AXIS] >= target) da00: c0 90 69 12 lds r12, 0x1269 ; 0x801269 da04: d0 90 6a 12 lds r13, 0x126A ; 0x80126a da08: e0 90 6b 12 lds r14, 0x126B ; 0x80126b da0c: f0 90 6c 12 lds r15, 0x126C ; 0x80126c da10: ac 01 movw r20, r24 da12: 9b 01 movw r18, r22 da14: c7 01 movw r24, r14 da16: b6 01 movw r22, r12 da18: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> da1c: 87 ff sbrs r24, 7 da1e: 11 c0 rjmp .+34 ; 0xda42 return; // Use absolute value in case the current position is unknown raise_z(fabs(current_position[Z_AXIS] - target)); da20: a5 01 movw r20, r10 da22: 94 01 movw r18, r8 da24: c7 01 movw r24, r14 da26: b6 01 movw r22, r12 da28: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> da2c: 9f 77 andi r25, 0x7F ; 127 } da2e: ff 90 pop r15 da30: ef 90 pop r14 da32: df 90 pop r13 da34: cf 90 pop r12 da36: bf 90 pop r11 da38: af 90 pop r10 da3a: 9f 90 pop r9 da3c: 8f 90 pop r8 { if (current_position[Z_AXIS] >= target) return; // Use absolute value in case the current position is unknown raise_z(fabs(current_position[Z_AXIS] - target)); da3e: 0c 94 94 6c jmp 0xd928 ; 0xd928 } da42: ff 90 pop r15 da44: ef 90 pop r14 da46: df 90 pop r13 da48: cf 90 pop r12 da4a: bf 90 pop r11 da4c: af 90 pop r10 da4e: 9f 90 pop r9 da50: 8f 90 pop r8 da52: 08 95 ret 0000da54 : #ifdef TMC2130 static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl) #else static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool without_mbl) #endif //TMC2130 { da54: 2f 92 push r2 da56: 3f 92 push r3 da58: 4f 92 push r4 da5a: 5f 92 push r5 da5c: 6f 92 push r6 da5e: 7f 92 push r7 da60: 8f 92 push r8 da62: 9f 92 push r9 da64: af 92 push r10 da66: bf 92 push r11 da68: cf 92 push r12 da6a: df 92 push r13 da6c: ef 92 push r14 da6e: ff 92 push r15 da70: 0f 93 push r16 da72: 1f 93 push r17 da74: cf 93 push r28 da76: df 93 push r29 da78: 00 d0 rcall .+0 ; 0xda7a da7a: 1f 92 push r1 da7c: 1f 92 push r1 da7e: cd b7 in r28, 0x3d ; 61 da80: de b7 in r29, 0x3e ; 62 da82: d8 2e mov r13, r24 da84: 2a 01 movw r4, r20 da86: 3b 01 movw r6, r22 da88: 32 2e mov r3, r18 da8a: e9 82 std Y+1, r14 ; 0x01 da8c: fa 82 std Y+2, r15 ; 0x02 da8e: 0b 83 std Y+3, r16 ; 0x03 da90: 1c 83 std Y+4, r17 ; 0x04 // Flag for the display update routine and to disable the print cancelation during homing. st_synchronize(); da92: 0f 94 fb 1a call 0x235f6 ; 0x235f6 homing_flag = true; da96: 81 e0 ldi r24, 0x01 ; 1 da98: 80 93 71 12 sts 0x1271, r24 ; 0x801271 bool home_x = home_x_axis; bool home_y = home_y_axis; bool home_z = home_z_axis; // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; da9c: fc 2c mov r15, r12 da9e: e3 2c mov r14, r3 daa0: d3 10 cpse r13, r3 daa2: 10 c0 rjmp .+32 ; 0xdac4 daa4: ed 2c mov r14, r13 daa6: dc 10 cpse r13, r12 daa8: 0d c0 rjmp .+26 ; 0xdac4 // No X/Y/Z code provided means to home all axes. home_x = home_y = home_z = true; //if we are homing all axes, first move z higher to protect heatbed/steel sheet if (home_all_axes) { raise_z_above(MESH_HOME_Z_SEARCH); daaa: 60 e0 ldi r22, 0x00 ; 0 daac: 70 e0 ldi r23, 0x00 ; 0 daae: 80 ea ldi r24, 0xA0 ; 160 dab0: 90 e4 ldi r25, 0x40 ; 64 dab2: 0e 94 f6 6c call 0xd9ec ; 0xd9ec // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; if (home_all_axes) // No X/Y/Z code provided means to home all axes. home_x = home_y = home_z = true; dab6: ff 24 eor r15, r15 dab8: f3 94 inc r15 daba: ee 24 eor r14, r14 dabc: e3 94 inc r14 dabe: 22 24 eor r2, r2 dac0: 23 94 inc r2 dac2: 01 c0 rjmp .+2 ; 0xdac6 bool home_x = home_x_axis; bool home_y = home_y_axis; bool home_z = home_z_axis; // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; dac4: 2d 2c mov r2, r13 } // Reset world2machine_rotation_and_skew and world2machine_shift, therefore // the planner will not perform any adjustments in the XY plane. // Wait for the motors to stop and update the current position with the absolute values. world2machine_revert_to_uncorrected(); dac6: 0e 94 2d 62 call 0xc45a ; 0xc45a // For mesh bed leveling deactivate the matrix temporarily. // It is necessary to disable the bed leveling for the X and Y homing moves, so that the move is performed // in a single axis only. // In case of re-homing the X or Y axes only, the mesh bed leveling is restored after G28. #ifdef MESH_BED_LEVELING uint8_t mbl_was_active = mbl.active; daca: 80 91 09 13 lds r24, 0x1309 ; 0x801309 dace: 8d 83 std Y+5, r24 ; 0x05 mbl.active = 0; dad0: 10 92 09 13 sts 0x1309, r1 ; 0x801309 current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); dad4: 82 e0 ldi r24, 0x02 ; 2 dad6: 0f 94 e7 1a call 0x235ce ; 0x235ce dada: 60 93 69 12 sts 0x1269, r22 ; 0x801269 dade: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a dae2: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b dae6: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c #endif // Reset baby stepping to zero, if the babystepping has already been loaded before. if (home_z) daea: f1 10 cpse r15, r1 babystep_undo(); daec: 0f 94 aa 54 call 0x2a954 ; 0x2a954 int l_feedmultiply = setup_for_endstop_move(); daf0: 81 e0 ldi r24, 0x01 ; 1 daf2: 0e 94 66 65 call 0xcacc ; 0xcacc daf6: 8c 01 movw r16, r24 set_destination_to_current(); daf8: 0e 94 ae 66 call 0xcd5c ; 0xcd5c feedrate = 0.0; dafc: 10 92 7a 02 sts 0x027A, r1 ; 0x80027a db00: 10 92 7b 02 sts 0x027B, r1 ; 0x80027b db04: 10 92 7c 02 sts 0x027C, r1 ; 0x80027c db08: 10 92 7d 02 sts 0x027D, r1 ; 0x80027d homeaxis(Y_AXIS); else tmc2130_home_calibrate(Y_AXIS); } #else //TMC2130 if(home_x) homeaxis(X_AXIS); db0c: 22 20 and r2, r2 db0e: 19 f0 breq .+6 ; 0xdb16 db10: 80 e0 ldi r24, 0x00 ; 0 db12: 0f 94 ae 79 call 0x2f35c ; 0x2f35c if(home_y) homeaxis(Y_AXIS); db16: ee 20 and r14, r14 db18: 19 f0 breq .+6 ; 0xdb20 db1a: 81 e0 ldi r24, 0x01 ; 1 db1c: 0f 94 ae 79 call 0x2f35c ; 0x2f35c #endif //TMC2130 if(home_x_axis && home_x_value != 0) db20: dd 20 and r13, r13 db22: e9 f0 breq .+58 ; 0xdb5e db24: 41 14 cp r4, r1 db26: 51 04 cpc r5, r1 db28: 61 04 cpc r6, r1 db2a: 71 04 cpc r7, r1 db2c: c1 f0 breq .+48 ; 0xdb5e current_position[X_AXIS]=home_x_value+cs.add_homing[X_AXIS]; db2e: c3 01 movw r24, r6 db30: b2 01 movw r22, r4 db32: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> db36: 9b 01 movw r18, r22 db38: ac 01 movw r20, r24 db3a: 60 91 bf 0d lds r22, 0x0DBF ; 0x800dbf db3e: 70 91 c0 0d lds r23, 0x0DC0 ; 0x800dc0 db42: 80 91 c1 0d lds r24, 0x0DC1 ; 0x800dc1 db46: 90 91 c2 0d lds r25, 0x0DC2 ; 0x800dc2 db4a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> db4e: 60 93 61 12 sts 0x1261, r22 ; 0x801261 db52: 70 93 62 12 sts 0x1262, r23 ; 0x801262 db56: 80 93 63 12 sts 0x1263, r24 ; 0x801263 db5a: 90 93 64 12 sts 0x1264, r25 ; 0x801264 if(home_y_axis && home_y_value != 0) db5e: 33 20 and r3, r3 db60: 01 f1 breq .+64 ; 0xdba2 db62: 89 81 ldd r24, Y+1 ; 0x01 db64: 9a 81 ldd r25, Y+2 ; 0x02 db66: ab 81 ldd r26, Y+3 ; 0x03 db68: bc 81 ldd r27, Y+4 ; 0x04 db6a: 00 97 sbiw r24, 0x00 ; 0 db6c: a1 05 cpc r26, r1 db6e: b1 05 cpc r27, r1 db70: c1 f0 breq .+48 ; 0xdba2 current_position[Y_AXIS]=home_y_value+cs.add_homing[Y_AXIS]; db72: bc 01 movw r22, r24 db74: cd 01 movw r24, r26 db76: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> db7a: 9b 01 movw r18, r22 db7c: ac 01 movw r20, r24 db7e: 60 91 c3 0d lds r22, 0x0DC3 ; 0x800dc3 db82: 70 91 c4 0d lds r23, 0x0DC4 ; 0x800dc4 db86: 80 91 c5 0d lds r24, 0x0DC5 ; 0x800dc5 db8a: 90 91 c6 0d lds r25, 0x0DC6 ; 0x800dc6 db8e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> db92: 60 93 65 12 sts 0x1265, r22 ; 0x801265 db96: 70 93 66 12 sts 0x1266, r23 ; 0x801266 db9a: 80 93 67 12 sts 0x1267, r24 ; 0x801267 db9e: 90 93 68 12 sts 0x1268, r25 ; 0x801268 #if Z_HOME_DIR < 0 // If homing towards BED do Z last if(home_z) { dba2: ff 20 and r15, r15 dba4: 09 f4 brne .+2 ; 0xdba8 dba6: 99 c0 rjmp .+306 ; 0xdcda #ifdef MESH_BED_LEVELING // If Mesh bed leveling, move X&Y to safe position for home raise_z_above(MESH_HOME_Z_SEARCH); dba8: 60 e0 ldi r22, 0x00 ; 0 dbaa: 70 e0 ldi r23, 0x00 ; 0 dbac: 80 ea ldi r24, 0xA0 ; 160 dbae: 90 e4 ldi r25, 0x40 ; 64 dbb0: 0e 94 f6 6c call 0xd9ec ; 0xd9ec if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS); dbb4: 80 91 39 06 lds r24, 0x0639 ; 0x800639 dbb8: 81 11 cpse r24, r1 dbba: 02 c0 rjmp .+4 ; 0xdbc0 dbbc: 0f 94 ae 79 call 0x2f35c ; 0x2f35c if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS); dbc0: 80 91 3a 06 lds r24, 0x063A ; 0x80063a dbc4: 81 11 cpse r24, r1 dbc6: 03 c0 rjmp .+6 ; 0xdbce dbc8: 81 e0 ldi r24, 0x01 ; 1 dbca: 0f 94 ae 79 call 0x2f35c ; 0x2f35c // 1st mesh bed leveling measurement point, corrected. world2machine_initialize(); dbce: 0e 94 c6 60 call 0xc18c ; 0xc18c world2machine(pgm_read_float(bed_ref_points_4), pgm_read_float(bed_ref_points_4+1), destination[X_AXIS], destination[Y_AXIS]); dbd2: e4 e0 ldi r30, 0x04 ; 4 dbd4: fc e9 ldi r31, 0x9C ; 156 dbd6: 85 91 lpm r24, Z+ dbd8: 95 91 lpm r25, Z+ dbda: a5 91 lpm r26, Z+ dbdc: b4 91 lpm r27, Z dbde: e0 e0 ldi r30, 0x00 ; 0 dbe0: fc e9 ldi r31, 0x9C ; 156 dbe2: 45 91 lpm r20, Z+ dbe4: 55 91 lpm r21, Z+ dbe6: 65 91 lpm r22, Z+ dbe8: 74 91 lpm r23, Z } } inline void world2machine(const float &x, const float &y, float &out_x, float &out_y) { out_x = x; dbea: 40 93 29 06 sts 0x0629, r20 ; 0x800629 dbee: 50 93 2a 06 sts 0x062A, r21 ; 0x80062a dbf2: 60 93 2b 06 sts 0x062B, r22 ; 0x80062b dbf6: 70 93 2c 06 sts 0x062C, r23 ; 0x80062c out_y = y; dbfa: 80 93 2d 06 sts 0x062D, r24 ; 0x80062d dbfe: 90 93 2e 06 sts 0x062E, r25 ; 0x80062e dc02: a0 93 2f 06 sts 0x062F, r26 ; 0x80062f dc06: b0 93 30 06 sts 0x0630, r27 ; 0x800630 world2machine(out_x, out_y); dc0a: 6d e2 ldi r22, 0x2D ; 45 dc0c: 76 e0 ldi r23, 0x06 ; 6 dc0e: 89 e2 ldi r24, 0x29 ; 41 dc10: 96 e0 ldi r25, 0x06 ; 6 dc12: 0e 94 76 68 call 0xd0ec ; 0xd0ec world2machine_reset(); dc16: 0e 94 f4 61 call 0xc3e8 ; 0xc3e8 if (destination[Y_AXIS] < Y_MIN_POS) dc1a: 20 e0 ldi r18, 0x00 ; 0 dc1c: 30 e0 ldi r19, 0x00 ; 0 dc1e: 40 e8 ldi r20, 0x80 ; 128 dc20: 50 ec ldi r21, 0xC0 ; 192 dc22: 60 91 2d 06 lds r22, 0x062D ; 0x80062d dc26: 70 91 2e 06 lds r23, 0x062E ; 0x80062e dc2a: 80 91 2f 06 lds r24, 0x062F ; 0x80062f dc2e: 90 91 30 06 lds r25, 0x0630 ; 0x800630 dc32: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> dc36: 87 ff sbrs r24, 7 dc38: 0c c0 rjmp .+24 ; 0xdc52 destination[Y_AXIS] = Y_MIN_POS; dc3a: 80 e0 ldi r24, 0x00 ; 0 dc3c: 90 e0 ldi r25, 0x00 ; 0 dc3e: a0 e8 ldi r26, 0x80 ; 128 dc40: b0 ec ldi r27, 0xC0 ; 192 dc42: 80 93 2d 06 sts 0x062D, r24 ; 0x80062d dc46: 90 93 2e 06 sts 0x062E, r25 ; 0x80062e dc4a: a0 93 2f 06 sts 0x062F, r26 ; 0x80062f dc4e: b0 93 30 06 sts 0x0630, r27 ; 0x800630 feedrate = homing_feedrate[X_AXIS] / 20; dc52: 80 e0 ldi r24, 0x00 ; 0 dc54: 90 e0 ldi r25, 0x00 ; 0 dc56: a6 e1 ldi r26, 0x16 ; 22 dc58: b3 e4 ldi r27, 0x43 ; 67 dc5a: 80 93 7a 02 sts 0x027A, r24 ; 0x80027a dc5e: 90 93 7b 02 sts 0x027B, r25 ; 0x80027b dc62: a0 93 7c 02 sts 0x027C, r26 ; 0x80027c dc66: b0 93 7d 02 sts 0x027D, r27 ; 0x80027d dc6a: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> #ifdef DEBUG_BUILD SERIAL_ECHOLNPGM("plan_set_position()"); MYSERIAL.println(current_position[X_AXIS]);MYSERIAL.println(current_position[Y_AXIS]); MYSERIAL.println(current_position[Z_AXIS]);MYSERIAL.println(current_position[E_AXIS]); #endif plan_set_position_curposXYZE(); dc6e: 0f 94 41 4b call 0x29682 ; 0x29682 SERIAL_ECHOLNPGM("plan_buffer_line()"); MYSERIAL.println(destination[X_AXIS]);MYSERIAL.println(destination[Y_AXIS]); MYSERIAL.println(destination[Z_AXIS]);MYSERIAL.println(destination[E_AXIS]); MYSERIAL.println(feedrate);MYSERIAL.println(active_extruder); #endif plan_buffer_line_destinationXYZE(feedrate); dc72: 60 91 7a 02 lds r22, 0x027A ; 0x80027a dc76: 70 91 7b 02 lds r23, 0x027B ; 0x80027b dc7a: 80 91 7c 02 lds r24, 0x027C ; 0x80027c dc7e: 90 91 7d 02 lds r25, 0x027D ; 0x80027d dc82: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); dc86: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[X_AXIS] = destination[X_AXIS]; dc8a: 80 91 29 06 lds r24, 0x0629 ; 0x800629 dc8e: 90 91 2a 06 lds r25, 0x062A ; 0x80062a dc92: a0 91 2b 06 lds r26, 0x062B ; 0x80062b dc96: b0 91 2c 06 lds r27, 0x062C ; 0x80062c dc9a: 80 93 61 12 sts 0x1261, r24 ; 0x801261 dc9e: 90 93 62 12 sts 0x1262, r25 ; 0x801262 dca2: a0 93 63 12 sts 0x1263, r26 ; 0x801263 dca6: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = destination[Y_AXIS]; dcaa: 80 91 2d 06 lds r24, 0x062D ; 0x80062d dcae: 90 91 2e 06 lds r25, 0x062E ; 0x80062e dcb2: a0 91 2f 06 lds r26, 0x062F ; 0x80062f dcb6: b0 91 30 06 lds r27, 0x0630 ; 0x800630 dcba: 80 93 65 12 sts 0x1265, r24 ; 0x801265 dcbe: 90 93 66 12 sts 0x1266, r25 ; 0x801266 dcc2: a0 93 67 12 sts 0x1267, r26 ; 0x801267 dcc6: b0 93 68 12 sts 0x1268, r27 ; 0x801268 dcca: 81 e0 ldi r24, 0x01 ; 1 dccc: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> enable_endstops(true); endstops_hit_on_purpose(); dcd0: 0f 94 a4 25 call 0x24b48 ; 0x24b48 homeaxis(Z_AXIS); dcd4: 82 e0 ldi r24, 0x02 ; 2 dcd6: 0f 94 ae 79 call 0x2f35c ; 0x2f35c homeaxis(Z_AXIS); #endif // MESH_BED_LEVELING } #endif // Z_HOME_DIR < 0 if(home_z_axis && home_z_value != 0) dcda: cc 20 and r12, r12 dcdc: e9 f0 breq .+58 ; 0xdd18 dcde: 81 14 cp r8, r1 dce0: 91 04 cpc r9, r1 dce2: a1 04 cpc r10, r1 dce4: b1 04 cpc r11, r1 dce6: c1 f0 breq .+48 ; 0xdd18 current_position[Z_AXIS]=home_z_value+cs.add_homing[Z_AXIS]; dce8: c5 01 movw r24, r10 dcea: b4 01 movw r22, r8 dcec: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> dcf0: 9b 01 movw r18, r22 dcf2: ac 01 movw r20, r24 dcf4: 60 91 c7 0d lds r22, 0x0DC7 ; 0x800dc7 dcf8: 70 91 c8 0d lds r23, 0x0DC8 ; 0x800dc8 dcfc: 80 91 c9 0d lds r24, 0x0DC9 ; 0x800dc9 dd00: 90 91 ca 0d lds r25, 0x0DCA ; 0x800dca dd04: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> dd08: 60 93 69 12 sts 0x1269, r22 ; 0x801269 dd0c: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a dd10: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b dd14: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c // Set the planner and stepper routine positions. // At this point the mesh bed leveling and world2machine corrections are disabled and current_position // contains the machine coordinates. plan_set_position_curposXYZE(); dd18: 0f 94 41 4b call 0x29682 ; 0x29682 clean_up_after_endstop_move(l_feedmultiply); dd1c: c8 01 movw r24, r16 dd1e: 0e 94 4c 65 call 0xca98 ; 0xca98 endstops_hit_on_purpose(); dd22: 0f 94 a4 25 call 0x24b48 ; 0x24b48 // Load the machine correction matrix world2machine_initialize(); dd26: 0e 94 c6 60 call 0xc18c ; 0xc18c // and correct the current_position XY axes to match the transformed coordinate system. world2machine_update_current(); dd2a: 0e 94 02 5f call 0xbe04 ; 0xbe04 #ifdef MESH_BED_LEVELING if (home_x_axis || home_y_axis || without_mbl || home_z_axis) dd2e: d1 10 cpse r13, r1 dd30: 07 c0 rjmp .+14 ; 0xdd40 dd32: 31 10 cpse r3, r1 dd34: 05 c0 rjmp .+10 ; 0xdd40 dd36: 8b 8d ldd r24, Y+27 ; 0x1b dd38: 81 11 cpse r24, r1 dd3a: 02 c0 rjmp .+4 ; 0xdd40 dd3c: cc 20 and r12, r12 dd3e: 39 f1 breq .+78 ; 0xdd8e { if (! home_z && mbl_was_active) { dd40: f1 10 cpse r15, r1 dd42: 25 c0 rjmp .+74 ; 0xdd8e dd44: 9d 81 ldd r25, Y+5 ; 0x05 dd46: 99 23 and r25, r25 dd48: 11 f1 breq .+68 ; 0xdd8e // Re-enable the mesh bed leveling if only the X and Y axes were re-homed. mbl.active = true; dd4a: 81 e0 ldi r24, 0x01 ; 1 dd4c: 80 93 09 13 sts 0x1309, r24 ; 0x801309 // and re-adjust the current logical Z axis with the bed leveling offset applicable at the current XY position. current_position[Z_AXIS] -= mbl.get_z(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS)); dd50: 0f 94 e7 1a call 0x235ce ; 0x235ce dd54: 6b 01 movw r12, r22 dd56: 7c 01 movw r14, r24 dd58: 80 e0 ldi r24, 0x00 ; 0 dd5a: 0f 94 e7 1a call 0x235ce ; 0x235ce dd5e: a7 01 movw r20, r14 dd60: 96 01 movw r18, r12 dd62: 0f 94 78 91 call 0x322f0 ; 0x322f0 dd66: 9b 01 movw r18, r22 dd68: ac 01 movw r20, r24 dd6a: 60 91 69 12 lds r22, 0x1269 ; 0x801269 dd6e: 70 91 6a 12 lds r23, 0x126A ; 0x80126a dd72: 80 91 6b 12 lds r24, 0x126B ; 0x80126b dd76: 90 91 6c 12 lds r25, 0x126C ; 0x80126c dd7a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> dd7e: 60 93 69 12 sts 0x1269, r22 ; 0x801269 dd82: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a dd86: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b dd8a: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c } } #endif prusa_statistics(20); dd8e: 84 e1 ldi r24, 0x14 ; 20 dd90: 0f 94 79 32 call 0x264f2 ; 0x264f2 st_synchronize(); dd94: 0f 94 fb 1a call 0x235f6 ; 0x235f6 homing_flag = false; dd98: 10 92 71 12 sts 0x1271, r1 ; 0x801271 #if 0 SERIAL_ECHOPGM("G28, final "); print_world_coordinates(); SERIAL_ECHOPGM("G28, final "); print_physical_coordinates(); SERIAL_ECHOPGM("G28, final "); print_mesh_bed_leveling_table(); #endif } dd9c: 0f 90 pop r0 dd9e: 0f 90 pop r0 dda0: 0f 90 pop r0 dda2: 0f 90 pop r0 dda4: 0f 90 pop r0 dda6: df 91 pop r29 dda8: cf 91 pop r28 ddaa: 1f 91 pop r17 ddac: 0f 91 pop r16 ddae: ff 90 pop r15 ddb0: ef 90 pop r14 ddb2: df 90 pop r13 ddb4: cf 90 pop r12 ddb6: bf 90 pop r11 ddb8: af 90 pop r10 ddba: 9f 90 pop r9 ddbc: 8f 90 pop r8 ddbe: 7f 90 pop r7 ddc0: 6f 90 pop r6 ddc2: 5f 90 pop r5 ddc4: 4f 90 pop r4 ddc6: 3f 90 pop r3 ddc8: 2f 90 pop r2 ddca: 08 95 ret 0000ddcc : static void lcd_invalidate_custom_characters() { memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters)); } void lcd_frame_start() { ddcc: e1 e3 ldi r30, 0x31 ; 49 ddce: f3 e0 ldi r31, 0x03 ; 3 } else { //character is no longer used (or invalid?), mark it as unused #ifdef DEBUG_CUSTOM_CHARACTERS printf_P(PSTR("discarded char %02x at slot %u\n"), c, i); #endif // DEBUG_CUSTOM_CHARACTERS lcd_custom_characters[i] = 0x7F; ddd0: 9f e7 ldi r25, 0x7F ; 127 } void lcd_frame_start() { // check all custom characters and discard unused ones for (uint8_t i = 0; i < 8; i++) { uint8_t c = lcd_custom_characters[i]; ddd2: 81 91 ld r24, Z+ if (c == 0x7F) { //slot empty ddd4: 8f 37 cpi r24, 0x7F ; 127 ddd6: 31 f0 breq .+12 ; 0xdde4 ddd8: df 01 movw r26, r30 ddda: 11 97 sbiw r26, 0x01 ; 1 continue; } else if (c & 0x80) { //slot was used on the last frame update, mark it as potentially unused this time dddc: 87 ff sbrs r24, 7 ddde: 07 c0 rjmp .+14 ; 0xddee lcd_custom_characters[i] = c & 0x7F; dde0: 8f 77 andi r24, 0x7F ; 127 dde2: 8c 93 st X, r24 memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters)); } void lcd_frame_start() { // check all custom characters and discard unused ones for (uint8_t i = 0; i < 8; i++) { dde4: 83 e0 ldi r24, 0x03 ; 3 dde6: e9 33 cpi r30, 0x39 ; 57 dde8: f8 07 cpc r31, r24 ddea: 99 f7 brne .-26 ; 0xddd2 for (uint8_t i = 0; i < 8; i++) { printf_P(PSTR(" %02x"), lcd_custom_characters[i]); } printf_P(PSTR("\n")); #endif // DEBUG_CUSTOM_CHARACTERS } ddec: 08 95 ret } else { //character is no longer used (or invalid?), mark it as unused #ifdef DEBUG_CUSTOM_CHARACTERS printf_P(PSTR("discarded char %02x at slot %u\n"), c, i); #endif // DEBUG_CUSTOM_CHARACTERS lcd_custom_characters[i] = 0x7F; ddee: 9c 93 st X, r25 ddf0: f9 cf rjmp .-14 ; 0xdde4 0000ddf2 : } } void lcd_update(uint8_t lcdDrawUpdateOverride) { if (lcd_draw_update < lcdDrawUpdateOverride) ddf2: 90 91 59 02 lds r25, 0x0259 ; 0x800259 ddf6: 98 17 cp r25, r24 ddf8: 10 f4 brcc .+4 ; 0xddfe lcd_draw_update = lcdDrawUpdateOverride; ddfa: 80 93 59 02 sts 0x0259, r24 ; 0x800259 if (!lcd_update_enabled) return; ddfe: 80 91 5a 02 lds r24, 0x025A ; 0x80025a de02: 88 23 and r24, r24 de04: 39 f0 breq .+14 ; 0xde14 if (lcd_lcdupdate_func) de06: e0 91 04 04 lds r30, 0x0404 ; 0x800404 de0a: f0 91 05 04 lds r31, 0x0405 ; 0x800405 de0e: 30 97 sbiw r30, 0x00 ; 0 de10: 09 f0 breq .+2 ; 0xde14 lcd_lcdupdate_func(); de12: 19 94 eijmp } de14: 08 95 ret 0000de16 : lcd_set_cursor(c, r); return fputs_P(str, lcdout); } int lcd_printf_P(const char* format, ...) { de16: cf 93 push r28 de18: df 93 push r29 de1a: cd b7 in r28, 0x3d ; 61 de1c: de b7 in r29, 0x3e ; 62 de1e: ae 01 movw r20, r28 de20: 4a 5f subi r20, 0xFA ; 250 de22: 5f 4f sbci r21, 0xFF ; 255 de24: fa 01 movw r30, r20 de26: 61 91 ld r22, Z+ de28: 71 91 ld r23, Z+ de2a: af 01 movw r20, r30 va_list args; va_start(args, format); int ret = vfprintf_P(lcdout, format, args); de2c: 82 ef ldi r24, 0xF2 ; 242 de2e: 93 e0 ldi r25, 0x03 ; 3 de30: 0f 94 27 a3 call 0x3464e ; 0x3464e va_end(args); return ret; } de34: df 91 pop r29 de36: cf 91 pop r28 de38: 08 95 ret 0000de3a : return fputc(ch, lcdout); } int lcd_puts_P(const char* str) { return fputs_P(str, lcdout); de3a: 62 ef ldi r22, 0xF2 ; 242 de3c: 73 e0 ldi r23, 0x03 ; 3 de3e: 0d 94 78 a2 jmp 0x344f0 ; 0x344f0 0000de42 : lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address } int lcd_putc(char c) { return fputc(c, lcdout); de42: 62 ef ldi r22, 0xF2 ; 242 de44: 73 e0 ldi r23, 0x03 ; 3 de46: 08 2e mov r0, r24 de48: 00 0c add r0, r0 de4a: 99 0b sbc r25, r25 de4c: 0d 94 48 a2 jmp 0x34490 ; 0x34490 0000de50 : va_end(args); return ret; } void lcd_space(uint8_t n) { de50: cf 93 push r28 de52: c8 2f mov r28, r24 while (n--) lcd_putc(' '); de54: c1 50 subi r28, 0x01 ; 1 de56: 20 f0 brcs .+8 ; 0xde60 de58: 80 e2 ldi r24, 0x20 ; 32 de5a: 0e 94 21 6f call 0xde42 ; 0xde42 de5e: fa cf rjmp .-12 ; 0xde54 } de60: cf 91 pop r28 de62: 08 95 ret 0000de64 : /// @brief Draw the label and value for a menu edit item /// @param chr 1 byte character /// @param str String residing in program memory (PROGMEM) /// @param val value to render, ranges from -999 to 9999 static void menu_draw_P(const char chr, const char* str, const int16_t val) { de64: 0f 93 push r16 de66: 1f 93 push r17 de68: cf 93 push r28 de6a: df 93 push r29 de6c: eb 01 movw r28, r22 de6e: 14 2f mov r17, r20 de70: 05 2f mov r16, r21 lcd_putc(chr); de72: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_puts_P(str); de76: ce 01 movw r24, r28 de78: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_putc(':'); de7c: 8a e3 ldi r24, 0x3A ; 58 de7e: 0e 94 21 6f call 0xde42 ; 0xde42 #else extern size_t __strlen_P(const char *) __ATTR_CONST__; /* internal helper function */ __attribute__((__always_inline__)) static __inline__ size_t strlen_P(const char * s); static __inline__ size_t strlen_P(const char *s) { return __builtin_constant_p(__builtin_strlen(s)) ? __builtin_strlen(s) : __strlen_P(s); de82: ce 01 movw r24, r28 de84: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> // Padding to compensate variable string length const uint8_t len = strlen_P(str); lcd_space((LCD_WIDTH - 4) - (2 + len)); de88: 9e e0 ldi r25, 0x0E ; 14 de8a: 98 1b sub r25, r24 de8c: 89 2f mov r24, r25 de8e: 0e 94 28 6f call 0xde50 ; 0xde50 // Right adjusted value lcd_printf_P(PSTR("%4d"), val); de92: 0f 93 push r16 de94: 1f 93 push r17 de96: 83 e6 ldi r24, 0x63 ; 99 de98: 91 e8 ldi r25, 0x81 ; 129 de9a: 9f 93 push r25 de9c: 8f 93 push r24 de9e: 0e 94 0b 6f call 0xde16 ; 0xde16 dea2: 0f 90 pop r0 dea4: 0f 90 pop r0 dea6: 0f 90 pop r0 dea8: 0f 90 pop r0 } deaa: df 91 pop r29 deac: cf 91 pop r28 deae: 1f 91 pop r17 deb0: 0f 91 pop r16 deb2: 08 95 ret 0000deb4 : { return pgm_read_byte(row_offsets + min(row, LCD_HEIGHT - 1)); } void lcd_set_cursor(uint8_t col, uint8_t row) { deb4: cf 93 push r28 deb6: c8 2f mov r28, r24 deb8: 86 2f mov r24, r22 /// @brief set the current LCD row /// @param row LCD row number, ranges from 0 to LCD_HEIGHT - 1 static void FORCE_INLINE lcd_set_current_row(uint8_t row) { lcd_currline = min(row, LCD_HEIGHT - 1); deba: 64 30 cpi r22, 0x04 ; 4 debc: 08 f0 brcs .+2 ; 0xdec0 debe: 83 e0 ldi r24, 0x03 ; 3 dec0: 80 93 30 03 sts 0x0330, r24 ; 0x800330 } void lcd_set_cursor(uint8_t col, uint8_t row) { lcd_set_current_row(row); uint8_t addr = col + lcd_get_row_offset(lcd_currline); dec4: 0e 94 f2 54 call 0xa9e4 ; 0xa9e4 dec8: 8c 0f add r24, r28 lcd_ddram_address = addr; deca: 80 93 2f 03 sts 0x032F, r24 ; 0x80032f delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); dece: 44 e6 ldi r20, 0x64 ; 100 ded0: 50 e0 ldi r21, 0x00 ; 0 ded2: 60 e0 ldi r22, 0x00 ; 0 ded4: 80 68 ori r24, 0x80 ; 128 { lcd_set_current_row(row); uint8_t addr = col + lcd_get_row_offset(lcd_currline); lcd_ddram_address = addr; lcd_command(LCD_SETDDRAMADDR | addr); } ded6: cf 91 pop r28 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); ded8: 0c 94 7a 5d jmp 0xbaf4 ; 0xbaf4 0000dedc : menu_back_no_reset(); } } void menu_item_edit_P(const char* str, void* pval, uint8_t pbits, int16_t min_val, int16_t max_val, int16_t jmp_val) { dedc: 7f 92 push r7 dede: 8f 92 push r8 dee0: 9f 92 push r9 dee2: af 92 push r10 dee4: bf 92 push r11 dee6: cf 92 push r12 dee8: df 92 push r13 deea: ef 92 push r14 deec: ff 92 push r15 deee: 0f 93 push r16 def0: 1f 93 push r17 def2: cf 93 push r28 def4: df 93 push r29 menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (menu_item == menu_line) def6: e0 91 63 04 lds r30, 0x0463 ; 0x800463 defa: 50 91 62 04 lds r21, 0x0462 ; 0x800462 defe: e5 13 cpse r30, r21 df00: 73 c0 rjmp .+230 ; 0xdfe8 { int16_t cur_val = (pbits == 8 ? *((uint8_t*)pval) : *((int16_t*)pval)); df02: fb 01 movw r30, r22 df04: 48 30 cpi r20, 0x08 ; 8 df06: 09 f0 breq .+2 ; 0xdf0a df08: 6c c0 rjmp .+216 ; 0xdfe2 df0a: c0 81 ld r28, Z df0c: d0 e0 ldi r29, 0x00 ; 0 df0e: 49 01 movw r8, r18 df10: 74 2e mov r7, r20 df12: 6b 01 movw r12, r22 df14: 5c 01 movw r10, r24 if (lcd_draw_update) df16: 80 91 59 02 lds r24, 0x0259 ; 0x800259 df1a: 88 23 and r24, r24 df1c: 59 f0 breq .+22 ; 0xdf34 { lcd_set_cursor(0, menu_row); df1e: 60 91 60 04 lds r22, 0x0460 ; 0x800460 df22: 80 e0 ldi r24, 0x00 ; 0 df24: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 menu_draw_P(menu_selection_mark(), str, cur_val); df28: 0e 94 66 62 call 0xc4cc ; 0xc4cc df2c: ae 01 movw r20, r28 df2e: b5 01 movw r22, r10 df30: 0e 94 32 6f call 0xde64 ; 0xde64 } if (menu_clicked && (lcd_encoder == menu_item)) df34: 80 91 61 04 lds r24, 0x0461 ; 0x800461 df38: 88 23 and r24, r24 df3a: 09 f4 brne .+2 ; 0xdf3e df3c: 55 c0 rjmp .+170 ; 0xdfe8 df3e: 90 91 63 04 lds r25, 0x0463 ; 0x800463 df42: 20 91 1e 06 lds r18, 0x061E ; 0x80061e df46: 30 91 1f 06 lds r19, 0x061F ; 0x80061f df4a: 92 17 cp r25, r18 df4c: 13 06 cpc r1, r19 df4e: 09 f0 breq .+2 ; 0xdf52 df50: 4b c0 rjmp .+150 ; 0xdfe8 } } void menu_submenu_no_reset(menu_func_t submenu, const bool feedback) { if (menu_depth < MENU_DEPTH_MAX) df52: 80 91 df 03 lds r24, 0x03DF ; 0x8003df df56: 87 30 cpi r24, 0x07 ; 7 df58: d8 f4 brcc .+54 ; 0xdf90 { menu_stack[menu_depth].menu = menu_menu; df5a: 28 2f mov r18, r24 df5c: 30 e0 ldi r19, 0x00 ; 0 df5e: f9 01 movw r30, r18 df60: ee 0f add r30, r30 df62: ff 1f adc r31, r31 df64: e2 0f add r30, r18 df66: f3 1f adc r31, r19 df68: e9 5a subi r30, 0xA9 ; 169 df6a: fc 4f sbci r31, 0xFC ; 252 df6c: 20 91 02 04 lds r18, 0x0402 ; 0x800402 df70: 30 91 03 04 lds r19, 0x0403 ; 0x800403 df74: 31 83 std Z+1, r19 ; 0x01 df76: 20 83 st Z, r18 menu_stack[menu_depth++].position = lcd_encoder; df78: 8f 5f subi r24, 0xFF ; 255 df7a: 80 93 df 03 sts 0x03DF, r24 ; 0x8003df df7e: 92 83 std Z+2, r25 ; 0x02 menu_goto(submenu, 0, false, feedback); df80: 20 e0 ldi r18, 0x00 ; 0 df82: 40 e0 ldi r20, 0x00 ; 0 df84: 70 e0 ldi r23, 0x00 ; 0 df86: 60 e0 ldi r22, 0x00 ; 0 df88: 82 e8 ldi r24, 0x82 ; 130 df8a: 93 e7 ldi r25, 0x73 ; 115 df8c: 0e 94 b7 62 call 0xc56e ; 0xc56e menu_draw_P(menu_selection_mark(), str, cur_val); } if (menu_clicked && (lcd_encoder == menu_item)) { menu_submenu_no_reset(_menu_edit_P); _md->editLabel = str; df90: b0 92 97 03 sts 0x0397, r11 ; 0x800397 df94: a0 92 96 03 sts 0x0396, r10 ; 0x800396 _md->editValuePtr = pval; df98: d0 92 9a 03 sts 0x039A, r13 ; 0x80039a df9c: c0 92 99 03 sts 0x0399, r12 ; 0x800399 _md->editValueBits = pbits; dfa0: 70 92 98 03 sts 0x0398, r7 ; 0x800398 _md->currentValue = cur_val; dfa4: d0 93 9c 03 sts 0x039C, r29 ; 0x80039c dfa8: c0 93 9b 03 sts 0x039B, r28 ; 0x80039b _md->minEditValue = min_val; dfac: 90 92 9e 03 sts 0x039E, r9 ; 0x80039e dfb0: 80 92 9d 03 sts 0x039D, r8 ; 0x80039d _md->maxEditValue = max_val; dfb4: 10 93 a0 03 sts 0x03A0, r17 ; 0x8003a0 dfb8: 00 93 9f 03 sts 0x039F, r16 ; 0x80039f _md->minJumpValue = jmp_val; dfbc: f0 92 a2 03 sts 0x03A2, r15 ; 0x8003a2 dfc0: e0 92 a1 03 sts 0x03A1, r14 ; 0x8003a1 menu_item_ret(); return; } } menu_item++; } dfc4: df 91 pop r29 dfc6: cf 91 pop r28 dfc8: 1f 91 pop r17 dfca: 0f 91 pop r16 dfcc: ff 90 pop r15 dfce: ef 90 pop r14 dfd0: df 90 pop r13 dfd2: cf 90 pop r12 dfd4: bf 90 pop r11 dfd6: af 90 pop r10 dfd8: 9f 90 pop r9 dfda: 8f 90 pop r8 dfdc: 7f 90 pop r7 _md->editValueBits = pbits; _md->currentValue = cur_val; _md->minEditValue = min_val; _md->maxEditValue = max_val; _md->minJumpValue = jmp_val; menu_item_ret(); dfde: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 void menu_item_edit_P(const char* str, void* pval, uint8_t pbits, int16_t min_val, int16_t max_val, int16_t jmp_val) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (menu_item == menu_line) { int16_t cur_val = (pbits == 8 ? *((uint8_t*)pval) : *((int16_t*)pval)); dfe2: c0 81 ld r28, Z dfe4: d1 81 ldd r29, Z+1 ; 0x01 dfe6: 93 cf rjmp .-218 ; 0xdf0e _md->minJumpValue = jmp_val; menu_item_ret(); return; } } menu_item++; dfe8: 80 91 63 04 lds r24, 0x0463 ; 0x800463 dfec: 8f 5f subi r24, 0xFF ; 255 dfee: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } dff2: df 91 pop r29 dff4: cf 91 pop r28 dff6: 1f 91 pop r17 dff8: 0f 91 pop r16 dffa: ff 90 pop r15 dffc: ef 90 pop r14 dffe: df 90 pop r13 e000: cf 90 pop r12 e002: bf 90 pop r11 e004: af 90 pop r10 e006: 9f 90 pop r9 e008: 8f 90 pop r8 e00a: 7f 90 pop r7 e00c: 08 95 ret 0000e00e : { return fputs_P(str, lcdout); } int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str) { e00e: cf 93 push r28 e010: df 93 push r29 e012: ea 01 movw r28, r20 lcd_set_cursor(c, r); e014: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 return fputs_P(str, lcdout); e018: 62 ef ldi r22, 0xF2 ; 242 e01a: 73 e0 ldi r23, 0x03 ; 3 e01c: ce 01 movw r24, r28 } e01e: df 91 pop r29 e020: cf 91 pop r28 } int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str) { lcd_set_cursor(c, r); return fputs_P(str, lcdout); e022: 0d 94 78 a2 jmp 0x344f0 ; 0x344f0 0000e026 : { return fputc(c, lcdout); } int lcd_putc_at(uint8_t c, uint8_t r, char ch) { e026: cf 93 push r28 e028: c4 2f mov r28, r20 lcd_set_cursor(c, r); e02a: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 return fputc(ch, lcdout); e02e: 62 ef ldi r22, 0xF2 ; 242 e030: 73 e0 ldi r23, 0x03 ; 3 e032: 8c 2f mov r24, r28 e034: cc 0f add r28, r28 e036: 99 0b sbc r25, r25 } e038: cf 91 pop r28 } int lcd_putc_at(uint8_t c, uint8_t r, char ch) { lcd_set_cursor(c, r); return fputc(ch, lcdout); e03a: 0d 94 48 a2 jmp 0x34490 ; 0x34490 0000e03e : } // Set cursor position to zero and in DDRAM. It does not unshift the display. void lcd_home(void) { lcd_set_cursor(0, 0); e03e: 60 e0 ldi r22, 0x00 ; 0 e040: 80 e0 ldi r24, 0x00 ; 0 e042: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_ddram_address = 0; e046: 10 92 2f 03 sts 0x032F, r1 ; 0x80032f } e04a: 08 95 ret 0000e04c : delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e04c: 40 e4 ldi r20, 0x40 ; 64 e04e: 56 e0 ldi r21, 0x06 ; 6 e050: 60 e0 ldi r22, 0x00 ; 0 e052: 81 e0 ldi r24, 0x01 ; 1 e054: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 // Clear display, set cursor position to zero and unshift the display. It also invalidates all custom characters void lcd_clear(void) { lcd_command(LCD_CLEARDISPLAY, 1600); lcd_currline = 0; e058: 10 92 30 03 sts 0x0330, r1 ; 0x800330 lcd_ddram_address = 0; e05c: 10 92 2f 03 sts 0x032F, r1 ; 0x80032f lcd_send(charToSend, HIGH); lcd_ddram_address++; // no need for preventing ddram overflow } static void lcd_invalidate_custom_characters() { memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters)); e060: 48 e0 ldi r20, 0x08 ; 8 e062: 50 e0 ldi r21, 0x00 ; 0 e064: 6f e7 ldi r22, 0x7F ; 127 e066: 70 e0 ldi r23, 0x00 ; 0 e068: 81 e3 ldi r24, 0x31 ; 49 e06a: 93 e0 ldi r25, 0x03 ; 3 e06c: 0d 94 12 aa jmp 0x35424 ; 0x35424 0000e070 : } void lcd_update_enable(uint8_t enabled) { // printf_P(PSTR("lcd_update_enable(%u -> %u)\n"), lcd_update_enabled, enabled); if (lcd_update_enabled != enabled) e070: 90 91 5a 02 lds r25, 0x025A ; 0x80025a e074: 98 17 cp r25, r24 e076: 09 f1 breq .+66 ; 0xe0ba { lcd_update_enabled = enabled; e078: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a if (enabled) e07c: 88 23 and r24, r24 e07e: e9 f0 breq .+58 ; 0xe0ba { // Reset encoder position. This is equivalent to re-entering a menu. lcd_encoder = 0; e080: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f e084: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e lcd_encoder_diff = 0; e088: 10 92 a4 05 sts 0x05A4, r1 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> // Enabling the normal LCD update procedure. // Reset the timeout interval. lcd_timeoutToStatus.start(); e08c: 83 ee ldi r24, 0xE3 ; 227 e08e: 93 e0 ldi r25, 0x03 ; 3 e090: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> // Force the keypad update now. lcd_next_update_millis = _millis() - 1; e094: 0f 94 f0 0d call 0x21be0 ; 0x21be0 e098: 61 50 subi r22, 0x01 ; 1 e09a: 71 09 sbc r23, r1 e09c: 81 09 sbc r24, r1 e09e: 91 09 sbc r25, r1 e0a0: 60 93 c5 03 sts 0x03C5, r22 ; 0x8003c5 e0a4: 70 93 c6 03 sts 0x03C6, r23 ; 0x8003c6 e0a8: 80 93 c7 03 sts 0x03C7, r24 ; 0x8003c7 e0ac: 90 93 c8 03 sts 0x03C8, r25 ; 0x8003c8 // Full update. lcd_clear(); e0b0: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_update(2); e0b4: 82 e0 ldi r24, 0x02 ; 2 e0b6: 0c 94 f9 6e jmp 0xddf2 ; 0xddf2 } else { // Clear the LCD always, or let it to the caller? } } } e0ba: 08 95 ret 0000e0bc : lcd_ddram_address++; // no need for preventing ddram overflow } } static void lcd_begin(uint8_t clear) { e0bc: cf 93 push r28 e0be: c8 2f mov r28, r24 lcd_currline = 0; e0c0: 10 92 30 03 sts 0x0330, r1 ; 0x800330 lcd_ddram_address = 0; e0c4: 10 92 2f 03 sts 0x032F, r1 ; 0x80032f lcd_send(charToSend, HIGH); lcd_ddram_address++; // no need for preventing ddram overflow } static void lcd_invalidate_custom_characters() { memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters)); e0c8: 48 e0 ldi r20, 0x08 ; 8 e0ca: 50 e0 ldi r21, 0x00 ; 0 e0cc: 6f e7 ldi r22, 0x7F ; 127 e0ce: 70 e0 ldi r23, 0x00 ; 0 e0d0: 81 e3 ldi r24, 0x31 ; 49 e0d2: 93 e0 ldi r25, 0x03 ; 3 e0d4: 0f 94 12 aa call 0x35424 ; 0x35424 lcd_currline = 0; lcd_ddram_address = 0; lcd_invalidate_custom_characters(); lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 4500); // wait min 4.1ms e0d8: 44 e9 ldi r20, 0x94 ; 148 e0da: 51 e1 ldi r21, 0x11 ; 17 e0dc: 62 e0 ldi r22, 0x02 ; 2 e0de: 80 e3 ldi r24, 0x30 ; 48 e0e0: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 // second try lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150); e0e4: 46 e9 ldi r20, 0x96 ; 150 e0e6: 50 e0 ldi r21, 0x00 ; 0 e0e8: 62 e0 ldi r22, 0x02 ; 2 e0ea: 80 e3 ldi r24, 0x30 ; 48 e0ec: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 // third go! lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150); e0f0: 46 e9 ldi r20, 0x96 ; 150 e0f2: 50 e0 ldi r21, 0x00 ; 0 e0f4: 62 e0 ldi r22, 0x02 ; 2 e0f6: 80 e3 ldi r24, 0x30 ; 48 e0f8: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 #ifndef LCD_8BIT // set to 4-bit interface lcd_send(LCD_FUNCTIONSET | LCD_4BITMODE, LOW | LCD_HALF_FLAG, 150); e0fc: 46 e9 ldi r20, 0x96 ; 150 e0fe: 50 e0 ldi r21, 0x00 ; 0 e100: 62 e0 ldi r22, 0x02 ; 2 e102: 80 e2 ldi r24, 0x20 ; 32 e104: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 #endif // finally, set # lines, font size, etc.0 lcd_command(LCD_FUNCTIONSET | lcd_displayfunction); e108: 80 91 00 04 lds r24, 0x0400 ; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513> delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e10c: 44 e6 ldi r20, 0x64 ; 100 e10e: 50 e0 ldi r21, 0x00 ; 0 e110: 60 e0 ldi r22, 0x00 ; 0 e112: 80 62 ori r24, 0x20 ; 32 e114: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 } // Turn the display on/off (quickly) void lcd_display(void) { lcd_displaycontrol |= LCD_DISPLAYON; e118: 84 e0 ldi r24, 0x04 ; 4 e11a: 80 93 2e 03 sts 0x032E, r24 ; 0x80032e delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e11e: 44 e6 ldi r20, 0x64 ; 100 e120: 50 e0 ldi r21, 0x00 ; 0 e122: 60 e0 ldi r22, 0x00 ; 0 e124: 8c e0 ldi r24, 0x0C ; 12 e126: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 lcd_command(LCD_FUNCTIONSET | lcd_displayfunction); // turn the display on with no cursor or blinking default lcd_displaycontrol = LCD_CURSOROFF | LCD_BLINKOFF; lcd_display(); // clear it off if (clear) lcd_clear(); e12a: c1 11 cpse r28, r1 e12c: 0e 94 26 70 call 0xe04c ; 0xe04c delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e130: 44 e6 ldi r20, 0x64 ; 100 e132: 50 e0 ldi r21, 0x00 ; 0 e134: 60 e0 ldi r22, 0x00 ; 0 e136: 86 e0 ldi r24, 0x06 ; 6 if (clear) lcd_clear(); // Initialize to default text direction (for romance languages) lcd_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; // set the entry mode lcd_command(LCD_ENTRYMODESET | lcd_displaymode); } e138: cf 91 pop r28 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e13a: 0c 94 7a 5d jmp 0xbaf4 ; 0xbaf4 0000e13e : fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream } void lcd_refresh(void) { lcd_begin(1); e13e: 81 e0 ldi r24, 0x01 ; 1 e140: 0c 94 5e 70 jmp 0xe0bc ; 0xe0bc 0000e144 : { lcd_send(value, LOW, duration); } static void lcd_write(uint8_t value) { e144: cf 92 push r12 e146: df 92 push r13 e148: ff 92 push r15 e14a: 0f 93 push r16 e14c: 1f 93 push r17 e14e: cf 93 push r28 e150: df 93 push r29 e152: 00 d0 rcall .+0 ; 0xe154 e154: 00 d0 rcall .+0 ; 0xe156 e156: 1f 92 push r1 e158: 1f 92 push r1 e15a: cd b7 in r28, 0x3d ; 61 e15c: de b7 in r29, 0x3e ; 62 if (value == '\n') { e15e: 8a 30 cpi r24, 0x0A ; 10 e160: d9 f4 brne .+54 ; 0xe198 if (lcd_currline > 3) lcd_currline = -1; e162: 80 91 30 03 lds r24, 0x0330 ; 0x800330 e166: 84 30 cpi r24, 0x04 ; 4 e168: 18 f0 brcs .+6 ; 0xe170 e16a: 8f ef ldi r24, 0xFF ; 255 e16c: 80 93 30 03 sts 0x0330, r24 ; 0x800330 lcd_set_cursor(0, lcd_currline + 1); // LF e170: 60 91 30 03 lds r22, 0x0330 ; 0x800330 e174: 6f 5f subi r22, 0xFF ; 255 e176: 80 e0 ldi r24, 0x00 ; 0 e178: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print_custom(value); } else { lcd_send(value, HIGH); lcd_ddram_address++; // no need for preventing ddram overflow } } e17c: 28 96 adiw r28, 0x08 ; 8 e17e: 0f b6 in r0, 0x3f ; 63 e180: f8 94 cli e182: de bf out 0x3e, r29 ; 62 e184: 0f be out 0x3f, r0 ; 63 e186: cd bf out 0x3d, r28 ; 61 e188: df 91 pop r29 e18a: cf 91 pop r28 e18c: 1f 91 pop r17 e18e: 0f 91 pop r16 e190: ff 90 pop r15 e192: df 90 pop r13 e194: cf 90 pop r12 e196: 08 95 ret static void lcd_write(uint8_t value) { if (value == '\n') { if (lcd_currline > 3) lcd_currline = -1; lcd_set_cursor(0, lcd_currline + 1); // LF } else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) { e198: 90 e8 ldi r25, 0x80 ; 128 e19a: 98 0f add r25, r24 lcd_print_custom(value); } else { lcd_send(value, HIGH); e19c: 44 e6 ldi r20, 0x64 ; 100 e19e: 50 e0 ldi r21, 0x00 ; 0 e1a0: 61 e0 ldi r22, 0x01 ; 1 static void lcd_write(uint8_t value) { if (value == '\n') { if (lcd_currline > 3) lcd_currline = -1; lcd_set_cursor(0, lcd_currline + 1); // LF } else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) { e1a2: 9a 34 cpi r25, 0x4A ; 74 e1a4: 08 f5 brcc .+66 ; 0xe1e8 // Custom character data // #define DEBUG_CUSTOM_CHARACTERS static void lcd_print_custom(uint8_t c) { uint8_t charToSend = pgm_read_byte(&Font[c - 0x80].alternate); // in case no empty slot is found, use the alternate character. e1a6: 48 2f mov r20, r24 e1a8: 40 58 subi r20, 0x80 ; 128 e1aa: 55 0b sbc r21, r21 e1ac: 9a 01 movw r18, r20 e1ae: 96 e0 ldi r25, 0x06 ; 6 e1b0: 92 9f mul r25, r18 e1b2: a0 01 movw r20, r0 e1b4: 93 9f mul r25, r19 e1b6: 50 0d add r21, r0 e1b8: 11 24 eor r1, r1 e1ba: fa 01 movw r30, r20 e1bc: ea 56 subi r30, 0x6A ; 106 e1be: fb 48 sbci r31, 0x8B ; 139 e1c0: f4 90 lpm r15, Z e1c2: e1 e3 ldi r30, 0x31 ; 49 e1c4: f3 e0 ldi r31, 0x03 ; 3 e1c6: 30 e0 ldi r19, 0x00 ; 0 e1c8: 20 e0 ldi r18, 0x00 ; 0 int8_t slotToUse = -1; e1ca: 9f ef ldi r25, 0xFF ; 255 for (uint8_t i = 0; i < 8; i++) { // first check if we already have the character in the lcd memory if ((lcd_custom_characters[i] & 0x7F) == (c & 0x7F)) { e1cc: 61 91 ld r22, Z+ e1ce: 78 2f mov r23, r24 e1d0: 76 27 eor r23, r22 e1d2: 7f 77 andi r23, 0x7F ; 127 e1d4: 89 f4 brne .+34 ; 0xe1f8 lcd_custom_characters[i] = c; // mark the custom character as used e1d6: f9 01 movw r30, r18 e1d8: ef 5c subi r30, 0xCF ; 207 e1da: fc 4f sbci r31, 0xFC ; 252 e1dc: 80 83 st Z, r24 e1de: f2 2e mov r15, r18 #ifdef DEBUG_CUSTOM_CHARACTERS printf_P(PSTR("created char %02x at slot %u\n"), c, slotToUse); #endif // DEBUG_CUSTOM_CHARACTERS sendChar: lcd_send(charToSend, HIGH); e1e0: 44 e6 ldi r20, 0x64 ; 100 e1e2: 50 e0 ldi r21, 0x00 ; 0 e1e4: 61 e0 ldi r22, 0x01 ; 1 e1e6: 8f 2d mov r24, r15 if (lcd_currline > 3) lcd_currline = -1; lcd_set_cursor(0, lcd_currline + 1); // LF } else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) { lcd_print_custom(value); } else { lcd_send(value, HIGH); e1e8: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 lcd_ddram_address++; // no need for preventing ddram overflow e1ec: 80 91 2f 03 lds r24, 0x032F ; 0x80032f e1f0: 8f 5f subi r24, 0xFF ; 255 e1f2: 80 93 2f 03 sts 0x032F, r24 ; 0x80032f e1f6: c2 cf rjmp .-124 ; 0xe17c charToSend = i; // send the found custom character id #ifdef DEBUG_CUSTOM_CHARACTERS printf_P(PSTR("found char %02x at slot %u\n"), c, i); #endif // DEBUG_CUSTOM_CHARACTERS goto sendChar; } else if (lcd_custom_characters[i] == 0x7F) { //found an empty slot. create a new custom character and send it e1f8: 6f 37 cpi r22, 0x7F ; 127 e1fa: 09 f0 breq .+2 ; 0xe1fe e1fc: 3c c0 rjmp .+120 ; 0xe276 lcd_custom_characters[i] = c; // mark the custom character as used e1fe: f9 01 movw r30, r18 e200: ef 5c subi r30, 0xCF ; 207 e202: fc 4f sbci r31, 0xFC ; 252 e204: 80 83 st Z, r24 slotToUse = i; e206: 92 2f mov r25, r18 #ifdef DEBUG_CUSTOM_CHARACTERS printf_P(PSTR("replaced char %02x at slot %u\n"), lcd_custom_characters[slotToUse], slotToUse); #endif // DEBUG_CUSTOM_CHARACTERS createChar: charToSend = slotToUse; e208: f9 2e mov r15, r25 lcd_createChar_P(slotToUse, &Font[c - 0x80]); e20a: fa 01 movw r30, r20 e20c: ef 56 subi r30, 0x6F ; 111 e20e: fb 48 sbci r31, 0x8B ; 139 "dec __zero_reg__" "\n\t" "brne forBegin_%=" "\n\t" : "=&d" (temp), "=&r" (colByte) : "z" (char_p), "e" (charmap) ); e210: 8e 01 movw r16, r28 e212: 0f 5f subi r16, 0xFF ; 255 e214: 1f 4f sbci r17, 0xFF ; 255 e216: d8 01 movw r26, r16 e218: 95 91 lpm r25, Z+ e21a: 88 e0 ldi r24, 0x08 ; 8 e21c: 18 2e mov r1, r24 0000e21e : e21e: 10 fe sbrs r1, 0 e220: 05 90 lpm r0, Z+ e222: 02 94 swap r0 e224: 80 2d mov r24, r0 e226: 97 95 ror r25 e228: 88 1f adc r24, r24 e22a: 8d 93 st X+, r24 e22c: 1a 94 dec r1 e22e: b9 f7 brne .-18 ; 0xe21e lcd_command(LCD_SETCGRAMADDR | (location << 3)); e230: bf 2d mov r27, r15 e232: e8 e0 ldi r30, 0x08 ; 8 e234: be 02 muls r27, r30 e236: c0 01 movw r24, r0 e238: 11 24 eor r1, r1 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e23a: 44 e6 ldi r20, 0x64 ; 100 e23c: 50 e0 ldi r21, 0x00 ; 0 e23e: 60 e0 ldi r22, 0x00 ; 0 e240: 80 64 ori r24, 0x40 ; 64 e242: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 e246: 6e 01 movw r12, r28 e248: f9 e0 ldi r31, 0x09 ; 9 e24a: cf 0e add r12, r31 e24c: d1 1c adc r13, r1 : "z" (char_p), "e" (charmap) ); lcd_command(LCD_SETCGRAMADDR | (location << 3)); for (uint8_t i = 0; i < 8; i++) { lcd_send(charmap[i], HIGH); e24e: 44 e6 ldi r20, 0x64 ; 100 e250: 50 e0 ldi r21, 0x00 ; 0 e252: 61 e0 ldi r22, 0x01 ; 1 e254: d8 01 movw r26, r16 e256: 8d 91 ld r24, X+ e258: 8d 01 movw r16, r26 e25a: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 : "=&d" (temp), "=&r" (colByte) : "z" (char_p), "e" (charmap) ); lcd_command(LCD_SETCGRAMADDR | (location << 3)); for (uint8_t i = 0; i < 8; i++) { e25e: c0 16 cp r12, r16 e260: d1 06 cpc r13, r17 e262: a9 f7 brne .-22 ; 0xe24e lcd_send(charmap[i], HIGH); } lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address e264: 80 91 2f 03 lds r24, 0x032F ; 0x80032f delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); e268: 44 e6 ldi r20, 0x64 ; 100 e26a: 50 e0 ldi r21, 0x00 ; 0 e26c: 60 e0 ldi r22, 0x00 ; 0 e26e: 80 68 ori r24, 0x80 ; 128 e270: 0e 94 7a 5d call 0xbaf4 ; 0xbaf4 e274: b5 cf rjmp .-150 ; 0xe1e0 goto sendChar; } else if (lcd_custom_characters[i] == 0x7F) { //found an empty slot. create a new custom character and send it lcd_custom_characters[i] = c; // mark the custom character as used slotToUse = i; goto createChar; } else if (!(lcd_custom_characters[i] & 0x80)) { // found potentially unused slot. Remember it in case it's needed e276: 67 ff sbrs r22, 7 slotToUse = i; e278: 92 2f mov r25, r18 e27a: 2f 5f subi r18, 0xFF ; 255 e27c: 3f 4f sbci r19, 0xFF ; 255 static void lcd_print_custom(uint8_t c) { uint8_t charToSend = pgm_read_byte(&Font[c - 0x80].alternate); // in case no empty slot is found, use the alternate character. int8_t slotToUse = -1; for (uint8_t i = 0; i < 8; i++) { e27e: 28 30 cpi r18, 0x08 ; 8 e280: 31 05 cpc r19, r1 e282: 09 f0 breq .+2 ; 0xe286 e284: a3 cf rjmp .-186 ; 0xe1cc } // If this point was reached, then there is no empty slot available. // If there exists any potentially unused slot, then use that one instead. // Otherwise, use the alternate form of the character. if (slotToUse < 0) { e286: 9f 3f cpi r25, 0xFF ; 255 e288: 09 f0 breq .+2 ; 0xe28c e28a: be cf rjmp .-132 ; 0xe208 e28c: a9 cf rjmp .-174 ; 0xe1e0 0000e28e : lcd_print_pad_P(title, LCD_WIDTH); lcd_set_cursor(0, 2); } void menu_progressbar_update(uint16_t newVal) { e28e: cf 93 push r28 uint8_t newCnt = (newVal * LCD_WIDTH) / progressbar_total; e290: 24 e1 ldi r18, 0x14 ; 20 e292: ac 01 movw r20, r24 e294: 24 9f mul r18, r20 e296: c0 01 movw r24, r0 e298: 25 9f mul r18, r21 e29a: 90 0d add r25, r0 e29c: 11 24 eor r1, r1 e29e: 60 91 6d 03 lds r22, 0x036D ; 0x80036d e2a2: 70 91 6e 03 lds r23, 0x036E ; 0x80036e e2a6: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> e2aa: c6 2f mov r28, r22 e2ac: 65 31 cpi r22, 0x15 ; 21 e2ae: 08 f0 brcs .+2 ; 0xe2b2 e2b0: c4 e1 ldi r28, 0x14 ; 20 if (newCnt > LCD_WIDTH) newCnt = LCD_WIDTH; while (newCnt > progressbar_block_count) e2b2: 80 91 6c 03 lds r24, 0x036C ; 0x80036c e2b6: 8c 17 cp r24, r28 e2b8: 48 f4 brcc .+18 ; 0xe2cc } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e2ba: 8f ef ldi r24, 0xFF ; 255 e2bc: 0e 94 a2 70 call 0xe144 ; 0xe144 { lcd_print(LCD_STR_SOLID_BLOCK[0]); progressbar_block_count++; e2c0: 80 91 6c 03 lds r24, 0x036C ; 0x80036c e2c4: 8f 5f subi r24, 0xFF ; 255 e2c6: 80 93 6c 03 sts 0x036C, r24 ; 0x80036c e2ca: f3 cf rjmp .-26 ; 0xe2b2 } } e2cc: cf 91 pop r28 e2ce: 08 95 ret 0000e2d0 : void menu_progressbar_finish(void) { progressbar_total = 1; e2d0: 81 e0 ldi r24, 0x01 ; 1 e2d2: 90 e0 ldi r25, 0x00 ; 0 e2d4: 90 93 6e 03 sts 0x036E, r25 ; 0x80036e e2d8: 80 93 6d 03 sts 0x036D, r24 ; 0x80036d menu_progressbar_update(1); e2dc: 0e 94 47 71 call 0xe28e ; 0xe28e _delay(300); e2e0: 6c e2 ldi r22, 0x2C ; 44 e2e2: 71 e0 ldi r23, 0x01 ; 1 e2e4: 80 e0 ldi r24, 0x00 ; 0 e2e6: 90 e0 ldi r25, 0x00 ; 0 e2e8: 0d 94 bd 0d jmp 0x21b7a ; 0x21b7a 0000e2ec : else lcd_printNumber(n, base); } void lcd_printNumber(unsigned long n, uint8_t base) { e2ec: 8f 92 push r8 e2ee: 9f 92 push r9 e2f0: af 92 push r10 e2f2: bf 92 push r11 e2f4: ef 92 push r14 e2f6: ff 92 push r15 e2f8: 0f 93 push r16 e2fa: 1f 93 push r17 e2fc: cf 93 push r28 e2fe: df 93 push r29 e300: cd b7 in r28, 0x3d ; 61 e302: de b7 in r29, 0x3e ; 62 e304: a0 97 sbiw r28, 0x20 ; 32 e306: 0f b6 in r0, 0x3f ; 63 e308: f8 94 cli e30a: de bf out 0x3e, r29 ; 62 e30c: 0f be out 0x3f, r0 ; 63 e30e: cd bf out 0x3d, r28 ; 61 unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; if (n == 0) e310: 61 15 cp r22, r1 e312: 71 05 cpc r23, r1 e314: 81 05 cpc r24, r1 e316: 91 05 cpc r25, r1 e318: 99 f4 brne .+38 ; 0xe340 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e31a: 80 e3 ldi r24, 0x30 ; 48 buf[i++] = n % base; n /= base; } for (; i > 0; i--) lcd_print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); } e31c: a0 96 adiw r28, 0x20 ; 32 e31e: 0f b6 in r0, 0x3f ; 63 e320: f8 94 cli e322: de bf out 0x3e, r29 ; 62 e324: 0f be out 0x3f, r0 ; 63 e326: cd bf out 0x3d, r28 ; 61 e328: df 91 pop r29 e32a: cf 91 pop r28 e32c: 1f 91 pop r17 e32e: 0f 91 pop r16 e330: ff 90 pop r15 e332: ef 90 pop r14 e334: bf 90 pop r11 e336: af 90 pop r10 e338: 9f 90 pop r9 e33a: 8f 90 pop r8 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e33c: 0c 94 a2 70 jmp 0xe144 ; 0xe144 } void lcd_printNumber(unsigned long n, uint8_t base) { unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; e340: 00 e0 ldi r16, 0x00 ; 0 lcd_print('0'); return; } while (n > 0) { buf[i++] = n % base; e342: 84 2e mov r8, r20 e344: 91 2c mov r9, r1 e346: b1 2c mov r11, r1 e348: a1 2c mov r10, r1 e34a: 9e 01 movw r18, r28 e34c: 2f 5f subi r18, 0xFF ; 255 e34e: 3f 4f sbci r19, 0xFF ; 255 e350: 79 01 movw r14, r18 e352: a5 01 movw r20, r10 e354: 94 01 movw r18, r8 e356: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> e35a: f7 01 movw r30, r14 e35c: e0 0f add r30, r16 e35e: f1 1d adc r31, r1 e360: 60 83 st Z, r22 n /= base; e362: b9 01 movw r22, r18 e364: ca 01 movw r24, r20 lcd_print('0'); return; } while (n > 0) { buf[i++] = n % base; e366: 0f 5f subi r16, 0xFF ; 255 if (n == 0) { lcd_print('0'); return; } while (n > 0) e368: 61 15 cp r22, r1 e36a: 71 05 cpc r23, r1 e36c: 81 05 cpc r24, r1 e36e: 91 05 cpc r25, r1 e370: 81 f7 brne .-32 ; 0xe352 e372: 0e 0d add r16, r14 e374: 1f 2d mov r17, r15 e376: 11 1d adc r17, r1 { buf[i++] = n % base; n /= base; } for (; i > 0; i--) e378: e0 16 cp r14, r16 e37a: f1 06 cpc r15, r17 e37c: 59 f0 breq .+22 ; 0xe394 lcd_print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); e37e: f8 01 movw r30, r16 e380: 82 91 ld r24, -Z e382: 8f 01 movw r16, r30 e384: 8a 30 cpi r24, 0x0A ; 10 e386: 20 f4 brcc .+8 ; 0xe390 e388: 80 5d subi r24, 0xD0 ; 208 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e38a: 0e 94 a2 70 call 0xe144 ; 0xe144 e38e: f4 cf rjmp .-24 ; 0xe378 { buf[i++] = n % base; n /= base; } for (; i > 0; i--) lcd_print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); e390: 89 5c subi r24, 0xC9 ; 201 e392: fb cf rjmp .-10 ; 0xe38a } e394: a0 96 adiw r28, 0x20 ; 32 e396: 0f b6 in r0, 0x3f ; 63 e398: f8 94 cli e39a: de bf out 0x3e, r29 ; 62 e39c: 0f be out 0x3f, r0 ; 63 e39e: cd bf out 0x3d, r28 ; 61 e3a0: df 91 pop r29 e3a2: cf 91 pop r28 e3a4: 1f 91 pop r17 e3a6: 0f 91 pop r16 e3a8: ff 90 pop r15 e3aa: ef 90 pop r14 e3ac: bf 90 pop r11 e3ae: af 90 pop r10 e3b0: 9f 90 pop r9 e3b2: 8f 90 pop r8 e3b4: 08 95 ret 0000e3b6 : void lcd_print(unsigned int n, int base) { lcd_print((unsigned long) n, base); } void lcd_print(long n, int base) e3b6: cf 92 push r12 e3b8: df 92 push r13 e3ba: ef 92 push r14 e3bc: ff 92 push r15 e3be: 6b 01 movw r12, r22 e3c0: 7c 01 movw r14, r24 { if (base == 0) lcd_write(n); else if (base == 10) { if (n < 0) e3c2: f7 fe sbrs r15, 7 e3c4: 0b c0 rjmp .+22 ; 0xe3dc } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e3c6: 8d e2 ldi r24, 0x2D ; 45 e3c8: 0e 94 a2 70 call 0xe144 ; 0xe144 else if (base == 10) { if (n < 0) { lcd_print('-'); n = -n; e3cc: f0 94 com r15 e3ce: e0 94 com r14 e3d0: d0 94 com r13 e3d2: c0 94 com r12 e3d4: c1 1c adc r12, r1 e3d6: d1 1c adc r13, r1 e3d8: e1 1c adc r14, r1 e3da: f1 1c adc r15, r1 } lcd_printNumber(n, 10); e3dc: 4a e0 ldi r20, 0x0A ; 10 e3de: c7 01 movw r24, r14 e3e0: b6 01 movw r22, r12 } else lcd_printNumber(n, base); } e3e2: ff 90 pop r15 e3e4: ef 90 pop r14 e3e6: df 90 pop r13 e3e8: cf 90 pop r12 if (n < 0) { lcd_print('-'); n = -n; } lcd_printNumber(n, 10); e3ea: 0c 94 76 71 jmp 0xe2ec ; 0xe2ec 0000e3ee : lcd_space(len); return len; } uint8_t lcd_print_pad_P(const char* s, uint8_t len) { e3ee: 0f 93 push r16 e3f0: 1f 93 push r17 e3f2: cf 93 push r28 e3f4: 8c 01 movw r16, r24 e3f6: c6 2f mov r28, r22 while (len && pgm_read_byte(s)) { e3f8: cc 23 and r28, r28 e3fa: 59 f0 breq .+22 ; 0xe412 e3fc: f8 01 movw r30, r16 e3fe: 24 91 lpm r18, Z e400: 22 23 and r18, r18 e402: 39 f0 breq .+14 ; 0xe412 lcd_write(pgm_read_byte(s++)); e404: 0f 5f subi r16, 0xFF ; 255 e406: 1f 4f sbci r17, 0xFF ; 255 e408: 84 91 lpm r24, Z e40a: 0e 94 a2 70 call 0xe144 ; 0xe144 --len; e40e: c1 50 subi r28, 0x01 ; 1 e410: f3 cf rjmp .-26 ; 0xe3f8 } lcd_space(len); e412: 8c 2f mov r24, r28 e414: 0e 94 28 6f call 0xde50 ; 0xde50 return len; } e418: 8c 2f mov r24, r28 e41a: cf 91 pop r28 e41c: 1f 91 pop r17 e41e: 0f 91 pop r16 e420: 08 95 ret 0000e422 : } static uint8_t progressbar_block_count = 0; static uint16_t progressbar_total = 0; void menu_progressbar_init(uint16_t total, const char* title) { e422: 0f 93 push r16 e424: 1f 93 push r17 e426: cf 93 push r28 e428: df 93 push r29 e42a: 8c 01 movw r16, r24 e42c: eb 01 movw r28, r22 lcd_clear(); e42e: 0e 94 26 70 call 0xe04c ; 0xe04c progressbar_block_count = 0; e432: 10 92 6c 03 sts 0x036C, r1 ; 0x80036c progressbar_total = total; e436: 10 93 6e 03 sts 0x036E, r17 ; 0x80036e e43a: 00 93 6d 03 sts 0x036D, r16 ; 0x80036d lcd_set_cursor(0, 1); e43e: 61 e0 ldi r22, 0x01 ; 1 e440: 80 e0 ldi r24, 0x00 ; 0 e442: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print_pad_P(title, LCD_WIDTH); e446: 64 e1 ldi r22, 0x14 ; 20 e448: ce 01 movw r24, r28 e44a: 0e 94 f7 71 call 0xe3ee ; 0xe3ee lcd_set_cursor(0, 2); e44e: 62 e0 ldi r22, 0x02 ; 2 e450: 80 e0 ldi r24, 0x00 ; 0 } e452: df 91 pop r29 e454: cf 91 pop r28 e456: 1f 91 pop r17 e458: 0f 91 pop r16 progressbar_block_count = 0; progressbar_total = total; lcd_set_cursor(0, 1); lcd_print_pad_P(title, LCD_WIDTH); lcd_set_cursor(0, 2); e45a: 0c 94 5a 6f jmp 0xdeb4 ; 0xdeb4 0000e45e : //! @param func pointer to function taking uint8_t with no return value //! @param fn_par value to be passed to function //! @retval 0 //! @retval 1 Item was clicked void menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par) { e45e: ef 92 push r14 e460: ff 92 push r15 e462: 0f 93 push r16 e464: 1f 93 push r17 e466: cf 93 push r28 e468: df 93 push r29 if (menu_item == menu_line) e46a: 70 91 63 04 lds r23, 0x0463 ; 0x800463 e46e: 30 91 62 04 lds r19, 0x0462 ; 0x800462 e472: 73 13 cpse r23, r19 e474: 3f c0 rjmp .+126 ; 0xe4f4 e476: 12 2f mov r17, r18 e478: ea 01 movw r28, r20 e47a: 06 2f mov r16, r22 e47c: 7c 01 movw r14, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number); e47e: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e482: 88 23 and r24, r24 e484: d1 f0 breq .+52 ; 0xe4ba } static void menu_draw_item_puts_P(char type_char, const char* str, char num) { const uint8_t max_strlen = LCD_WIDTH - 3; lcd_putc_at(0, menu_row, menu_selection_mark()); e486: 0e 94 66 62 call 0xc4cc ; 0xc4cc e48a: 48 2f mov r20, r24 e48c: 60 91 60 04 lds r22, 0x0460 ; 0x800460 e490: 80 e0 ldi r24, 0x00 ; 0 e492: 0e 94 13 70 call 0xe026 ; 0xe026 uint8_t len = lcd_print_pad_P(str, max_strlen); e496: 61 e1 ldi r22, 0x11 ; 17 e498: c7 01 movw r24, r14 e49a: 0e 94 f7 71 call 0xe3ee ; 0xe3ee lcd_putc_at((max_strlen - len) + 2, menu_row, num); e49e: 40 2f mov r20, r16 e4a0: 60 91 60 04 lds r22, 0x0460 ; 0x800460 e4a4: 93 e1 ldi r25, 0x13 ; 19 e4a6: 98 1b sub r25, r24 e4a8: 89 2f mov r24, r25 e4aa: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char); e4ae: 40 e2 ldi r20, 0x20 ; 32 e4b0: 60 91 60 04 lds r22, 0x0460 ; 0x800460 e4b4: 83 e1 ldi r24, 0x13 ; 19 e4b6: 0e 94 13 70 call 0xe026 ; 0xe026 void menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par) { if (menu_item == menu_line) { if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number); if (menu_clicked && (lcd_encoder == menu_item)) e4ba: 80 91 61 04 lds r24, 0x0461 ; 0x800461 e4be: 88 23 and r24, r24 e4c0: c9 f0 breq .+50 ; 0xe4f4 e4c2: 20 91 63 04 lds r18, 0x0463 ; 0x800463 e4c6: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e4ca: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e4ce: 28 17 cp r18, r24 e4d0: 19 06 cpc r1, r25 e4d2: 81 f4 brne .+32 ; 0xe4f4 { lcd_update_enabled = 0; e4d4: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a if (func) func(fn_par); e4d8: 81 2f mov r24, r17 e4da: fe 01 movw r30, r28 e4dc: 19 95 eicall lcd_update_enabled = 1; e4de: 81 e0 ldi r24, 0x01 ; 1 e4e0: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a menu_item_ret(); return; } } menu_item++; } e4e4: df 91 pop r29 e4e6: cf 91 pop r28 e4e8: 1f 91 pop r17 e4ea: 0f 91 pop r16 e4ec: ff 90 pop r15 e4ee: ef 90 pop r14 if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = 0; if (func) func(fn_par); lcd_update_enabled = 1; menu_item_ret(); e4f0: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 return; } } menu_item++; e4f4: 80 91 63 04 lds r24, 0x0463 ; 0x800463 e4f8: 8f 5f subi r24, 0xFF ; 255 e4fa: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } e4fe: df 91 pop r29 e500: cf 91 pop r28 e502: 1f 91 pop r17 e504: 0f 91 pop r16 e506: ff 90 pop r15 e508: ef 90 pop r14 e50a: 08 95 ret 0000e50c : static char menu_selection_mark(){ return (lcd_encoder == menu_item)?'>':' '; } static void menu_draw_item_puts_P(char type_char, const char* str) { e50c: 0f 93 push r16 e50e: 1f 93 push r17 e510: cf 93 push r28 e512: c8 2f mov r28, r24 e514: 8b 01 movw r16, r22 lcd_putc_at(0, menu_row, menu_selection_mark()); e516: 0e 94 66 62 call 0xc4cc ; 0xc4cc e51a: 48 2f mov r20, r24 e51c: 60 91 60 04 lds r22, 0x0460 ; 0x800460 e520: 80 e0 ldi r24, 0x00 ; 0 e522: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_print_pad_P(str, LCD_WIDTH - 2); e526: 62 e1 ldi r22, 0x12 ; 18 e528: c8 01 movw r24, r16 e52a: 0e 94 f7 71 call 0xe3ee ; 0xe3ee lcd_putc(type_char); e52e: 8c 2f mov r24, r28 } e530: cf 91 pop r28 e532: 1f 91 pop r17 e534: 0f 91 pop r16 static void menu_draw_item_puts_P(char type_char, const char* str) { lcd_putc_at(0, menu_row, menu_selection_mark()); lcd_print_pad_P(str, LCD_WIDTH - 2); lcd_putc(type_char); e536: 0c 94 21 6f jmp 0xde42 ; 0xde42 0000e53a : bool __attribute__((noinline)) menu_item_leave(){ return ((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving; } void menu_item_function_P(const char* str, menu_func_t func) { e53a: cf 93 push r28 e53c: df 93 push r29 if (menu_item == menu_line) e53e: 30 91 63 04 lds r19, 0x0463 ; 0x800463 e542: 20 91 62 04 lds r18, 0x0462 ; 0x800462 e546: 32 13 cpse r19, r18 e548: 21 c0 rjmp .+66 ; 0xe58c e54a: eb 01 movw r28, r22 e54c: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); e54e: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e552: 88 23 and r24, r24 e554: 19 f0 breq .+6 ; 0xe55c e556: 80 e2 ldi r24, 0x20 ; 32 e558: 0e 94 86 72 call 0xe50c ; 0xe50c if (menu_clicked && (lcd_encoder == menu_item)) e55c: 80 91 61 04 lds r24, 0x0461 ; 0x800461 e560: 88 23 and r24, r24 e562: a1 f0 breq .+40 ; 0xe58c e564: 20 91 63 04 lds r18, 0x0463 ; 0x800463 e568: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e56c: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e570: 28 17 cp r18, r24 e572: 19 06 cpc r1, r25 e574: 59 f4 brne .+22 ; 0xe58c { lcd_update_enabled = 0; e576: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a if (func) func(); e57a: fe 01 movw r30, r28 e57c: 19 95 eicall lcd_update_enabled = 1; e57e: 81 e0 ldi r24, 0x01 ; 1 e580: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a menu_item_ret(); return; } } menu_item++; } e584: df 91 pop r29 e586: cf 91 pop r28 if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = 0; if (func) func(); lcd_update_enabled = 1; menu_item_ret(); e588: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 return; } } menu_item++; e58c: 80 91 63 04 lds r24, 0x0463 ; 0x800463 e590: 8f 5f subi r24, 0xFF ; 255 e592: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } e596: df 91 pop r29 e598: cf 91 pop r28 e59a: 08 95 ret 0000e59c : menu_item++; } void menu_item_back_P(const char* str) { if (menu_item == menu_line) e59c: 30 91 63 04 lds r19, 0x0463 ; 0x800463 e5a0: 20 91 62 04 lds r18, 0x0462 ; 0x800462 e5a4: 32 13 cpse r19, r18 e5a6: 19 c0 rjmp .+50 ; 0xe5da e5a8: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_UPLEVEL[0], str); e5aa: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e5ae: 88 23 and r24, r24 e5b0: 19 f0 breq .+6 ; 0xe5b8 e5b2: 83 e8 ldi r24, 0x83 ; 131 e5b4: 0e 94 86 72 call 0xe50c ; 0xe50c if (menu_clicked && (lcd_encoder == menu_item)) e5b8: 80 91 61 04 lds r24, 0x0461 ; 0x800461 e5bc: 88 23 and r24, r24 e5be: 69 f0 breq .+26 ; 0xe5da e5c0: 20 91 63 04 lds r18, 0x0463 ; 0x800463 e5c4: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e5c8: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e5cc: 28 17 cp r18, r24 e5ce: 19 06 cpc r1, r25 e5d0: 21 f4 brne .+8 ; 0xe5da { menu_back(); e5d2: 0e 94 1b 63 call 0xc636 ; 0xc636 menu_item_ret(); e5d6: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 return; } } menu_item++; e5da: 80 91 63 04 lds r24, 0x0463 ; 0x800463 e5de: 8f 5f subi r24, 0xFF ; 255 e5e0: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } e5e4: 08 95 ret 0000e5e6 : menu_item++; return 0; } void menu_item_submenu_P(const char* str, menu_func_t submenu) { e5e6: cf 93 push r28 e5e8: df 93 push r29 if (menu_item == menu_line) e5ea: 30 91 63 04 lds r19, 0x0463 ; 0x800463 e5ee: 20 91 62 04 lds r18, 0x0462 ; 0x800462 e5f2: 32 13 cpse r19, r18 e5f4: 1e c0 rjmp .+60 ; 0xe632 e5f6: eb 01 movw r28, r22 e5f8: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str); e5fa: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e5fe: 88 23 and r24, r24 e600: 19 f0 breq .+6 ; 0xe608 e602: 8e e7 ldi r24, 0x7E ; 126 e604: 0e 94 86 72 call 0xe50c ; 0xe50c if (menu_clicked && (lcd_encoder == menu_item)) e608: 80 91 61 04 lds r24, 0x0461 ; 0x800461 e60c: 88 23 and r24, r24 e60e: 89 f0 breq .+34 ; 0xe632 e610: 20 91 63 04 lds r18, 0x0463 ; 0x800463 e614: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e618: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e61c: 28 17 cp r18, r24 e61e: 19 06 cpc r1, r25 e620: 41 f4 brne .+16 ; 0xe632 { menu_submenu(submenu); e622: 60 e0 ldi r22, 0x00 ; 0 e624: ce 01 movw r24, r28 e626: 0e 94 dd 62 call 0xc5ba ; 0xc5ba menu_item_ret(); return; } } menu_item++; } e62a: df 91 pop r29 e62c: cf 91 pop r28 { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str); if (menu_clicked && (lcd_encoder == menu_item)) { menu_submenu(submenu); menu_item_ret(); e62e: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 return; } } menu_item++; e632: 80 91 63 04 lds r24, 0x0463 ; 0x800463 e636: 8f 5f subi r24, 0xFF ; 255 e638: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } e63c: df 91 pop r29 e63e: cf 91 pop r28 e640: 08 95 ret 0000e642 : menu_item++; } uint8_t menu_item_text_P(const char* str) { if (menu_item == menu_line) e642: 30 91 63 04 lds r19, 0x0463 ; 0x800463 e646: 20 91 62 04 lds r18, 0x0462 ; 0x800462 e64a: 32 13 cpse r19, r18 e64c: 19 c0 rjmp .+50 ; 0xe680 e64e: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); e650: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e654: 88 23 and r24, r24 e656: 19 f0 breq .+6 ; 0xe65e e658: 80 e2 ldi r24, 0x20 ; 32 e65a: 0e 94 86 72 call 0xe50c ; 0xe50c if (menu_clicked && (lcd_encoder == menu_item)) e65e: 80 91 61 04 lds r24, 0x0461 ; 0x800461 e662: 88 23 and r24, r24 e664: 69 f0 breq .+26 ; 0xe680 e666: 20 91 63 04 lds r18, 0x0463 ; 0x800463 e66a: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e66e: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e672: 28 17 cp r18, r24 e674: 19 06 cpc r1, r25 e676: 21 f4 brne .+8 ; 0xe680 { menu_item_ret(); e678: 0e 94 73 62 call 0xc4e6 ; 0xc4e6 return 1; e67c: 81 e0 ldi r24, 0x01 ; 1 e67e: 08 95 ret } } menu_item++; e680: 80 91 63 04 lds r24, 0x0463 ; 0x800463 e684: 8f 5f subi r24, 0xFF ; 255 e686: 80 93 63 04 sts 0x0463, r24 ; 0x800463 return 0; e68a: 80 e0 ldi r24, 0x00 ; 0 } e68c: 08 95 ret 0000e68e : { while (*s) lcd_write(*(s++)); } uint8_t lcd_print_pad(const char* s, uint8_t len) { e68e: 0f 93 push r16 e690: 1f 93 push r17 e692: cf 93 push r28 e694: 8c 01 movw r16, r24 e696: c6 2f mov r28, r22 while (len && *s) { e698: cc 23 and r28, r28 e69a: 49 f0 breq .+18 ; 0xe6ae e69c: f8 01 movw r30, r16 e69e: 81 91 ld r24, Z+ e6a0: 8f 01 movw r16, r30 e6a2: 88 23 and r24, r24 e6a4: 21 f0 breq .+8 ; 0xe6ae lcd_write(*(s++)); e6a6: 0e 94 a2 70 call 0xe144 ; 0xe144 --len; e6aa: c1 50 subi r28, 0x01 ; 1 e6ac: f5 cf rjmp .-22 ; 0xe698 } lcd_space(len); e6ae: 8c 2f mov r24, r28 e6b0: 0e 94 28 6f call 0xde50 ; 0xde50 return len; } e6b4: 8c 2f mov r24, r28 e6b6: cf 91 pop r28 e6b8: 1f 91 pop r17 e6ba: 0f 91 pop r16 e6bc: 08 95 ret 0000e6be : while (n--) lcd_putc(' '); } void lcd_print(const char* s) { e6be: cf 93 push r28 e6c0: df 93 push r29 e6c2: ec 01 movw r28, r24 while (*s) lcd_write(*(s++)); e6c4: 89 91 ld r24, Y+ e6c6: 88 23 and r24, r24 e6c8: 19 f0 breq .+6 ; 0xe6d0 e6ca: 0e 94 a2 70 call 0xe144 ; 0xe144 e6ce: fa cf rjmp .-12 ; 0xe6c4 } e6d0: df 91 pop r29 e6d2: cf 91 pop r28 e6d4: 08 95 ret 0000e6d6 : lcd_command(LCD_ENTRYMODESET | lcd_displaymode); } static int lcd_putchar(char c, FILE *) { lcd_write(c); e6d6: 0e 94 a2 70 call 0xe144 ; 0xe144 return 0; } e6da: 90 e0 ldi r25, 0x00 ; 0 e6dc: 80 e0 ldi r24, 0x00 ; 0 e6de: 08 95 ret 0000e6e0 : extern void lcd_frame_start(); //! @brief Consume click and longpress event inline void lcd_consume_click() { lcd_click_trigger = 0; e6e0: 10 92 95 03 sts 0x0395, r1 ; 0x800395 lcd_longpress_trigger = 0; e6e4: 10 92 a7 05 sts 0x05A7, r1 ; 0x8005a7 } e6e8: 08 95 ret 0000e6ea : //! Generally is used in modal dialogs. //! //! @retval 0 not clicked //! @retval nonzero clicked uint8_t lcd_clicked(void) { e6ea: cf 93 push r28 bool clicked = LCD_CLICKED; e6ec: 80 91 95 03 lds r24, 0x0395 ; 0x800395 e6f0: c1 e0 ldi r28, 0x01 ; 1 e6f2: 81 11 cpse r24, r1 e6f4: 04 c0 rjmp .+8 ; 0xe6fe e6f6: c0 e0 ldi r28, 0x00 ; 0 if(clicked) { lcd_consume_click(); } return clicked; } e6f8: 8c 2f mov r24, r28 e6fa: cf 91 pop r28 e6fc: 08 95 ret uint8_t lcd_clicked(void) { bool clicked = LCD_CLICKED; if(clicked) { lcd_consume_click(); e6fe: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 e702: fa cf rjmp .-12 ; 0xe6f8 0000e704 <_menu_edit_P()>: } static void _menu_edit_P() { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (lcd_draw_update) e704: 80 91 59 02 lds r24, 0x0259 ; 0x800259 e708: 88 23 and r24, r24 e70a: 09 f4 brne .+2 ; 0xe70e <_menu_edit_P()+0xa> e70c: 52 c0 rjmp .+164 ; 0xe7b2 <_menu_edit_P()+0xae> { // handle initial value jumping if (_md->minJumpValue && lcd_encoder) { e70e: 20 91 a1 03 lds r18, 0x03A1 ; 0x8003a1 e712: 30 91 a2 03 lds r19, 0x03A2 ; 0x8003a2 e716: 80 91 9d 03 lds r24, 0x039D ; 0x80039d e71a: 90 91 9e 03 lds r25, 0x039E ; 0x80039e e71e: 21 15 cp r18, r1 e720: 31 05 cpc r19, r1 e722: d9 f0 breq .+54 ; 0xe75a <_menu_edit_P()+0x56> e724: 40 91 1e 06 lds r20, 0x061E ; 0x80061e e728: 50 91 1f 06 lds r21, 0x061F ; 0x80061f e72c: 41 15 cp r20, r1 e72e: 51 05 cpc r21, r1 e730: a1 f0 breq .+40 ; 0xe75a <_menu_edit_P()+0x56> if (lcd_encoder > 0 && _md->currentValue == _md->minEditValue) { e732: 7c f0 brlt .+30 ; 0xe752 <_menu_edit_P()+0x4e> e734: 40 91 9b 03 lds r20, 0x039B ; 0x80039b e738: 50 91 9c 03 lds r21, 0x039C ; 0x80039c e73c: 48 17 cp r20, r24 e73e: 59 07 cpc r21, r25 e740: 41 f4 brne .+16 ; 0xe752 <_menu_edit_P()+0x4e> _md->currentValue = _md->minJumpValue; e742: 30 93 9c 03 sts 0x039C, r19 ; 0x80039c e746: 20 93 9b 03 sts 0x039B, r18 ; 0x80039b lcd_encoder = 0; e74a: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f e74e: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e } // disable after first use and/or if the initial value is not minEditValue _md->minJumpValue = 0; e752: 10 92 a2 03 sts 0x03A2, r1 ; 0x8003a2 e756: 10 92 a1 03 sts 0x03A1, r1 ; 0x8003a1 } _md->currentValue += lcd_encoder; e75a: 20 91 9b 03 lds r18, 0x039B ; 0x80039b e75e: 30 91 9c 03 lds r19, 0x039C ; 0x80039c e762: 40 91 1e 06 lds r20, 0x061E ; 0x80061e e766: 50 91 1f 06 lds r21, 0x061F ; 0x80061f e76a: 24 0f add r18, r20 e76c: 35 1f adc r19, r21 lcd_encoder = 0; // Consume knob rotation event e76e: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f e772: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e // Constrain the value in case it's outside the allowed limits _md->currentValue = constrain(_md->currentValue, _md->minEditValue, _md->maxEditValue); e776: 28 17 cp r18, r24 e778: 39 07 cpc r19, r25 e77a: 44 f0 brlt .+16 ; 0xe78c <_menu_edit_P()+0x88> e77c: 80 91 9f 03 lds r24, 0x039F ; 0x80039f e780: 90 91 a0 03 lds r25, 0x03A0 ; 0x8003a0 e784: 28 17 cp r18, r24 e786: 39 07 cpc r19, r25 e788: 0c f4 brge .+2 ; 0xe78c <_menu_edit_P()+0x88> e78a: c9 01 movw r24, r18 e78c: 90 93 9c 03 sts 0x039C, r25 ; 0x80039c e790: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b lcd_set_cursor(0, 1); e794: 61 e0 ldi r22, 0x01 ; 1 e796: 80 e0 ldi r24, 0x00 ; 0 e798: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 menu_draw_P(' ', _md->editLabel, _md->currentValue); e79c: 40 91 9b 03 lds r20, 0x039B ; 0x80039b e7a0: 50 91 9c 03 lds r21, 0x039C ; 0x80039c e7a4: 60 91 96 03 lds r22, 0x0396 ; 0x800396 e7a8: 70 91 97 03 lds r23, 0x0397 ; 0x800397 e7ac: 80 e2 ldi r24, 0x20 ; 32 e7ae: 0e 94 32 6f call 0xde64 ; 0xde64 } if (lcd_clicked()) e7b2: 0e 94 75 73 call 0xe6ea ; 0xe6ea e7b6: 88 23 and r24, r24 e7b8: 41 f1 breq .+80 ; 0xe80a <_menu_edit_P()+0x106> e7ba: e0 91 99 03 lds r30, 0x0399 ; 0x800399 e7be: f0 91 9a 03 lds r31, 0x039A ; 0x80039a e7c2: 80 91 9b 03 lds r24, 0x039B ; 0x80039b e7c6: 90 91 9c 03 lds r25, 0x039C ; 0x80039c { if (_md->editValueBits == 8) e7ca: 20 91 98 03 lds r18, 0x0398 ; 0x800398 *((uint8_t*)(_md->editValuePtr)) = _md->currentValue; e7ce: 80 83 st Z, r24 lcd_set_cursor(0, 1); menu_draw_P(' ', _md->editLabel, _md->currentValue); } if (lcd_clicked()) { if (_md->editValueBits == 8) e7d0: 28 30 cpi r18, 0x08 ; 8 e7d2: c9 f4 brne .+50 ; 0xe806 <_menu_edit_P()+0x102> menu_back(1); } void menu_back_no_reset(void) { if (menu_depth > 0) e7d4: 80 91 df 03 lds r24, 0x03DF ; 0x8003df e7d8: 88 23 and r24, r24 e7da: b9 f0 breq .+46 ; 0xe80a <_menu_edit_P()+0x106> { menu_depth--; e7dc: 81 50 subi r24, 0x01 ; 1 e7de: 80 93 df 03 sts 0x03DF, r24 ; 0x8003df menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, false); e7e2: 90 e0 ldi r25, 0x00 ; 0 e7e4: fc 01 movw r30, r24 e7e6: ee 0f add r30, r30 e7e8: ff 1f adc r31, r31 e7ea: e8 0f add r30, r24 e7ec: f9 1f adc r31, r25 e7ee: e9 5a subi r30, 0xA9 ; 169 e7f0: fc 4f sbci r31, 0xFC ; 252 e7f2: 62 81 ldd r22, Z+2 ; 0x02 e7f4: 06 2e mov r0, r22 e7f6: 00 0c add r0, r0 e7f8: 77 0b sbc r23, r23 e7fa: 20 e0 ldi r18, 0x00 ; 0 e7fc: 40 e0 ldi r20, 0x00 ; 0 e7fe: 80 81 ld r24, Z e800: 91 81 ldd r25, Z+1 ; 0x01 e802: 0c 94 b7 62 jmp 0xc56e ; 0xc56e if (lcd_clicked()) { if (_md->editValueBits == 8) *((uint8_t*)(_md->editValuePtr)) = _md->currentValue; else *((int16_t*)(_md->editValuePtr)) = _md->currentValue; e806: 91 83 std Z+1, r25 ; 0x01 e808: e5 cf rjmp .-54 ; 0xe7d4 <_menu_edit_P()+0xd0> menu_back_no_reset(); } } e80a: 08 95 ret 0000e80c : } } void menu_back_if_clicked(void) { if (lcd_clicked()) e80c: 0e 94 75 73 call 0xe6ea ; 0xe6ea e810: 81 11 cpse r24, r1 menu_back(); e812: 0c 94 1b 63 jmp 0xc636 ; 0xc636 } e816: 08 95 ret 0000e818 : CRITICAL_SECTION_END; } void menu_start(void) { if (lcd_encoder < 0) e818: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e81c: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e820: 97 ff sbrs r25, 7 e822: 07 c0 rjmp .+14 ; 0xe832 { lcd_encoder = 0; e824: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f e828: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e Sound_MakeSound(e_SOUND_TYPE_BlindAlert); e82c: 87 e0 ldi r24, 0x07 ; 7 e82e: 0f 94 ad 25 call 0x24b5a ; 0x24b5a } if (lcd_encoder < menu_top) e832: 80 91 1e 06 lds r24, 0x061E ; 0x80061e e836: 90 91 1f 06 lds r25, 0x061F ; 0x80061f e83a: 20 91 92 03 lds r18, 0x0392 ; 0x800392 e83e: 28 17 cp r18, r24 e840: 19 06 cpc r1, r25 e842: 19 f0 breq .+6 ; 0xe84a e844: 14 f0 brlt .+4 ; 0xe84a menu_top = lcd_encoder; e846: 80 93 92 03 sts 0x0392, r24 ; 0x800392 menu_line = menu_top; e84a: 80 91 92 03 lds r24, 0x0392 ; 0x800392 e84e: 80 93 62 04 sts 0x0462, r24 ; 0x800462 menu_clicked = lcd_clicked(); // Consume click event e852: 0e 94 75 73 call 0xe6ea ; 0xe6ea e856: 80 93 61 04 sts 0x0461, r24 ; 0x800461 } e85a: 08 95 ret 0000e85c : eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); } uint8_t lang_is_selected(void) { uint8_t lang_eeprom = eeprom_read_byte((unsigned char*)EEPROM_LANG); e85c: 8e ef ldi r24, 0xFE ; 254 e85e: 9f e0 ldi r25, 0x0F ; 15 e860: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 return (lang_eeprom != LANG_ID_FORCE_SELECTION) && (lang_eeprom == lang_selected); e864: 8e 3f cpi r24, 0xFE ; 254 e866: 39 f0 breq .+14 ; 0xe876 e868: 91 e0 ldi r25, 0x01 ; 1 e86a: 20 91 2d 03 lds r18, 0x032D ; 0x80032d e86e: 28 13 cpse r18, r24 e870: 90 e0 ldi r25, 0x00 ; 0 e872: 89 2f mov r24, r25 e874: 08 95 ret e876: 80 e0 ldi r24, 0x00 ; 0 } e878: 08 95 ret 0000e87a : return _n("??"); } void lang_reset(void) { lang_selected = 0; e87a: 10 92 2d 03 sts 0x032D, r1 ; 0x80032d eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); e87e: 6e ef ldi r22, 0xFE ; 254 e880: 8e ef ldi r24, 0xFE ; 254 e882: 9f e0 ldi r25, 0x0F ; 15 e884: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0000e888 : return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e888: 85 37 cpi r24, 0x75 ; 117 e88a: 28 e6 ldi r18, 0x68 ; 104 e88c: 92 07 cpc r25, r18 e88e: 09 f4 brne .+2 ; 0xe892 e890: 59 c0 rjmp .+178 ; 0xe944 e892: f8 f4 brcc .+62 ; 0xe8d2 e894: 8e 36 cpi r24, 0x6E ; 110 e896: 25 e6 ldi r18, 0x65 ; 101 e898: 92 07 cpc r25, r18 e89a: 09 f4 brne .+2 ; 0xe89e e89c: 59 c0 rjmp .+178 ; 0xe950 e89e: 50 f4 brcc .+20 ; 0xe8b4 e8a0: 83 37 cpi r24, 0x73 ; 115 e8a2: 23 e6 ldi r18, 0x63 ; 99 e8a4: 92 07 cpc r25, r18 e8a6: b1 f1 breq .+108 ; 0xe914 e8a8: 85 36 cpi r24, 0x65 ; 101 e8aa: 94 46 sbci r25, 0x64 ; 100 e8ac: b1 f1 breq .+108 ; 0xe91a //#ifdef COMMUNITY_LANG_GROUP1_QR // case LANG_CODE_QR: return _n("New language"); //community contribution //#endif // COMMUNITY_LANG_GROUP1_QR #endif // COMMUNITY_LANGUAGE_SUPPORT } return _n("??"); e8ae: 82 ea ldi r24, 0xA2 ; 162 e8b0: 93 e6 ldi r25, 0x63 ; 99 e8b2: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e8b4: 82 37 cpi r24, 0x72 ; 114 e8b6: 26 e6 ldi r18, 0x66 ; 102 e8b8: 92 07 cpc r25, r18 e8ba: 91 f1 breq .+100 ; 0xe920 e8bc: 82 37 cpi r24, 0x72 ; 114 e8be: 28 e6 ldi r18, 0x68 ; 104 e8c0: 92 07 cpc r25, r18 e8c2: 09 f4 brne .+2 ; 0xe8c6 e8c4: 42 c0 rjmp .+132 ; 0xe94a e8c6: 83 37 cpi r24, 0x73 ; 115 e8c8: 95 46 sbci r25, 0x65 ; 101 e8ca: 89 f7 brne .-30 ; 0xe8ae { case LANG_CODE_EN: return _n("English"); case LANG_CODE_CZ: return _n("Cestina"); case LANG_CODE_DE: return _n("Deutsch"); case LANG_CODE_ES: return _n("Espanol"); e8cc: 89 ef ldi r24, 0xF9 ; 249 e8ce: 93 e6 ldi r25, 0x63 ; 99 e8d0: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e8d2: 8c 36 cpi r24, 0x6C ; 108 e8d4: 20 e7 ldi r18, 0x70 ; 112 e8d6: 92 07 cpc r25, r18 e8d8: 31 f1 breq .+76 ; 0xe926 e8da: 70 f4 brcc .+28 ; 0xe8f8 e8dc: 8c 36 cpi r24, 0x6C ; 108 e8de: 2e e6 ldi r18, 0x6E ; 110 e8e0: 92 07 cpc r25, r18 e8e2: 21 f1 breq .+72 ; 0xe92c e8e4: 8f 36 cpi r24, 0x6F ; 111 e8e6: 2e e6 ldi r18, 0x6E ; 110 e8e8: 92 07 cpc r25, r18 e8ea: 31 f1 breq .+76 ; 0xe938 e8ec: 84 37 cpi r24, 0x74 ; 116 e8ee: 99 46 sbci r25, 0x69 ; 105 e8f0: f1 f6 brne .-68 ; 0xe8ae case LANG_CODE_EN: return _n("English"); case LANG_CODE_CZ: return _n("Cestina"); case LANG_CODE_DE: return _n("Deutsch"); case LANG_CODE_ES: return _n("Espanol"); case LANG_CODE_FR: return _n("Francais"); case LANG_CODE_IT: return _n("Italiano"); e8f2: 87 ee ldi r24, 0xE7 ; 231 e8f4: 93 e6 ldi r25, 0x63 ; 99 e8f6: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e8f8: 8b 36 cpi r24, 0x6B ; 107 e8fa: 23 e7 ldi r18, 0x73 ; 115 e8fc: 92 07 cpc r25, r18 e8fe: f9 f0 breq .+62 ; 0xe93e e900: 86 37 cpi r24, 0x76 ; 118 e902: 23 e7 ldi r18, 0x73 ; 115 e904: 92 07 cpc r25, r18 e906: a9 f0 breq .+42 ; 0xe932 e908: 8f 36 cpi r24, 0x6F ; 111 e90a: 92 47 sbci r25, 0x72 ; 114 e90c: 81 f6 brne .-96 ; 0xe8ae #endif // COMMUNITY_LANG_GROUP1_HR #ifdef COMMUNITY_LANG_GROUP2_LT case LANG_CODE_LT: return _n("Lietuviu"); //community Lithuanian contribution #endif // COMMUNITY_LANG_GROUP2_LT #ifdef COMMUNITY_LANG_GROUP1_RO case LANG_CODE_RO: return _n("Romana"); //community Romanian contribution e90e: 85 ea ldi r24, 0xA5 ; 165 e910: 93 e6 ldi r25, 0x63 ; 99 e912: 08 95 ret const char* lang_get_name_by_code(uint16_t code) { switch (code) { case LANG_CODE_EN: return _n("English"); case LANG_CODE_CZ: return _n("Cestina"); e914: 89 e0 ldi r24, 0x09 ; 9 e916: 94 e6 ldi r25, 0x64 ; 100 e918: 08 95 ret case LANG_CODE_DE: return _n("Deutsch"); e91a: 81 e0 ldi r24, 0x01 ; 1 e91c: 94 e6 ldi r25, 0x64 ; 100 e91e: 08 95 ret case LANG_CODE_ES: return _n("Espanol"); case LANG_CODE_FR: return _n("Francais"); e920: 80 ef ldi r24, 0xF0 ; 240 e922: 93 e6 ldi r25, 0x63 ; 99 e924: 08 95 ret case LANG_CODE_IT: return _n("Italiano"); case LANG_CODE_PL: return _n("Polski"); e926: 80 ee ldi r24, 0xE0 ; 224 e928: 93 e6 ldi r25, 0x63 ; 99 e92a: 08 95 ret #ifdef COMMUNITY_LANGUAGE_SUPPORT //Community language support #ifdef COMMUNITY_LANG_GROUP1_NL case LANG_CODE_NL: return _n("Nederlands"); //community Dutch contribution e92c: 85 ed ldi r24, 0xD5 ; 213 e92e: 93 e6 ldi r25, 0x63 ; 99 e930: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_NL #ifdef COMMUNITY_LANG_GROUP1_SV case LANG_CODE_SV: return _n("Svenska"); //community Swedish contribution e932: 8d ec ldi r24, 0xCD ; 205 e934: 93 e6 ldi r25, 0x63 ; 99 e936: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_SV #ifdef COMMUNITY_LANG_GROUP1_NO case LANG_CODE_NO: return _n("Norsk"); //community Swedish contribution e938: 87 ec ldi r24, 0xC7 ; 199 e93a: 93 e6 ldi r25, 0x63 ; 99 e93c: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_NO #ifdef COMMUNITY_LANG_GROUP1_DA case LANG_CODE_DA: return _n("Dansk"); //community Danish contribution #endif // COMMUNITY_LANG_GROUP1_DA #ifdef COMMUNITY_LANG_GROUP1_SK case LANG_CODE_SK: return _n("Slovencina"); //community Slovak contribution e93e: 8c eb ldi r24, 0xBC ; 188 e940: 93 e6 ldi r25, 0x63 ; 99 e942: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_SK #ifdef COMMUNITY_LANG_GROUP1_SL case LANG_CODE_SL: return _n("Slovenscina"); //community Slovanian contribution #endif // COMMUNITY_LANG_GROUP1_SL #ifdef COMMUNITY_LANG_GROUP1_HU case LANG_CODE_HU: return _n("Magyar"); //community Hungarian contribution e944: 85 eb ldi r24, 0xB5 ; 181 e946: 93 e6 ldi r25, 0x63 ; 99 e948: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_HU #ifdef COMMUNITY_LANG_GROUP1_LB case LANG_CODE_LB: return _n("Letzebuergesch"); //community Luxembourgish contribution #endif // COMMUNITY_LANG_GROUP1_LB #ifdef COMMUNITY_LANG_GROUP1_HR case LANG_CODE_HR: return _n("Hrvatski"); //community Croatian contribution e94a: 8c ea ldi r24, 0xAC ; 172 e94c: 93 e6 ldi r25, 0x63 ; 99 e94e: 08 95 ret const char* lang_get_name_by_code(uint16_t code) { switch (code) { case LANG_CODE_EN: return _n("English"); e950: 81 e1 ldi r24, 0x11 ; 17 e952: 94 e6 ldi r25, 0x64 ; 100 // case LANG_CODE_QR: return _n("New language"); //community contribution //#endif // COMMUNITY_LANG_GROUP1_QR #endif // COMMUNITY_LANGUAGE_SUPPORT } return _n("??"); } e954: 08 95 ret 0000e956 : return (sum == lt_sum); } uint8_t lang_get_count() { if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff) e956: ed e8 ldi r30, 0x8D ; 141 e958: f4 e7 ldi r31, 0x74 ; 116 e95a: 85 91 lpm r24, Z+ e95c: 95 91 lpm r25, Z+ e95e: a5 91 lpm r26, Z+ e960: b4 91 lpm r27, Z e962: 8f 3f cpi r24, 0xFF ; 255 e964: 9f 4f sbci r25, 0xFF ; 255 e966: af 4f sbci r26, 0xFF ; 255 e968: bf 4f sbci r27, 0xFF ; 255 e96a: b1 f0 breq .+44 ; 0xe998 if (header.magic != LANG_MAGIC) break; //break if magic not valid addr += header.size; //calc address of next table count++; //inc counter } #else //XFLASH uint16_t table = _SEC_LANG_TABLE; e96c: 20 e0 ldi r18, 0x00 ; 0 e96e: 31 e0 ldi r19, 0x01 ; 1 uint8_t count = 1; //count = 1 (primary) e970: 81 e0 ldi r24, 0x01 ; 1 while (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid e972: f9 01 movw r30, r18 e974: 45 91 lpm r20, Z+ e976: 55 91 lpm r21, Z+ e978: 65 91 lpm r22, Z+ e97a: 74 91 lpm r23, Z e97c: 45 3a cpi r20, 0xA5 ; 165 e97e: 5a 45 sbci r21, 0x5A ; 90 e980: 64 4b sbci r22, 0xB4 ; 180 e982: 7b 44 sbci r23, 0x4B ; 75 e984: 09 f0 breq .+2 ; 0xe988 e986: 08 95 ret { table += pgm_read_word((uint16_t*)(table + 4)); e988: f9 01 movw r30, r18 e98a: 34 96 adiw r30, 0x04 ; 4 e98c: 45 91 lpm r20, Z+ e98e: 54 91 lpm r21, Z e990: 24 0f add r18, r20 e992: 35 1f adc r19, r21 count++; e994: 8f 5f subi r24, 0xFF ; 255 e996: ed cf rjmp .-38 ; 0xe972 } uint8_t lang_get_count() { if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff) return 1; //signature not set - only primary language will be available e998: 81 e0 ldi r24, 0x01 ; 1 table += pgm_read_word((uint16_t*)(table + 4)); count++; } #endif //XFLASH return count; } e99a: 08 95 ret 0000e99c : return s + 2;//zero length string == not translated, return orig. str. return (const char*)((char*)lang_table + ui); //return calculated pointer } uint8_t lang_select(uint8_t lang) { e99c: 0f 93 push r16 e99e: 1f 93 push r17 if (lang == LANG_ID_PRI) //primary language e9a0: 81 11 cpse r24, r1 e9a2: 13 c0 rjmp .+38 ; 0xe9ca { lang_table = 0; e9a4: 10 92 2c 03 sts 0x032C, r1 ; 0x80032c e9a8: 10 92 2b 03 sts 0x032B, r1 ; 0x80032b lang_selected = lang; e9ac: 10 92 2d 03 sts 0x032D, r1 ; 0x80032d lang_selected = lang; // set language id } } } #endif //XFLASH if (lang_selected == lang) e9b0: 90 91 2d 03 lds r25, 0x032D ; 0x80032d e9b4: 98 13 cpse r25, r24 e9b6: 5c c0 rjmp .+184 ; 0xea70 e9b8: 68 2f mov r22, r24 { eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected); e9ba: 8e ef ldi r24, 0xFE ; 254 e9bc: 9f e0 ldi r25, 0x0F ; 15 e9be: 0f 94 04 a4 call 0x34808 ; 0x34808 return 1; e9c2: 81 e0 ldi r24, 0x01 ; 1 } return 0; } e9c4: 1f 91 pop r17 e9c6: 0f 91 pop r16 e9c8: 08 95 ret lang_selected = lang; // set language id } } } #else //XFLASH if (lang == LANG_ID_SEC) e9ca: 81 30 cpi r24, 0x01 ; 1 e9cc: 89 f7 brne .-30 ; 0xe9b0 { uint16_t table = _SEC_LANG_TABLE; if (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid e9ce: e0 e0 ldi r30, 0x00 ; 0 e9d0: f1 e0 ldi r31, 0x01 ; 1 e9d2: 45 91 lpm r20, Z+ e9d4: 55 91 lpm r21, Z+ e9d6: 65 91 lpm r22, Z+ e9d8: 74 91 lpm r23, Z e9da: 45 3a cpi r20, 0xA5 ; 165 e9dc: 5a 45 sbci r21, 0x5A ; 90 e9de: 64 4b sbci r22, 0xB4 ; 180 e9e0: 7b 44 sbci r23, 0x4B ; 75 e9e2: 31 f7 brne .-52 ; 0xe9b0 } uint8_t lang_check(uint16_t addr) { uint16_t sum = 0; uint16_t size = pgm_read_word((uint16_t*)(addr + 4)); e9e4: e4 e0 ldi r30, 0x04 ; 4 e9e6: f1 e0 ldi r31, 0x01 ; 1 e9e8: a5 91 lpm r26, Z+ e9ea: b4 91 lpm r27, Z uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8)); e9ec: e8 e0 ldi r30, 0x08 ; 8 e9ee: f1 e0 ldi r31, 0x01 ; 1 e9f0: 65 91 lpm r22, Z+ e9f2: 74 91 lpm r23, Z uint16_t i; for (i = 0; i < size; i++) e9f4: 50 e0 ldi r21, 0x00 ; 0 e9f6: 40 e0 ldi r20, 0x00 ; 0 return 0; } uint8_t lang_check(uint16_t addr) { uint16_t sum = 0; e9f8: 30 e0 ldi r19, 0x00 ; 0 e9fa: 20 e0 ldi r18, 0x00 ; 0 uint16_t size = pgm_read_word((uint16_t*)(addr + 4)); uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8)); uint16_t i; for (i = 0; i < size; i++) e9fc: a4 17 cp r26, r20 e9fe: b5 07 cpc r27, r21 ea00: 29 f5 brne .+74 ; 0xea4c sum += (uint16_t)pgm_read_byte((uint8_t*)(addr + i)) << ((i & 1)?0:8); sum -= lt_sum; //subtract checksum ea02: 26 1b sub r18, r22 ea04: 37 0b sbc r19, r23 sum = (sum >> 8) | ((sum & 0xff) << 8); //swap bytes ea06: 32 27 eor r19, r18 ea08: 23 27 eor r18, r19 ea0a: 32 27 eor r19, r18 if (lang == LANG_ID_SEC) { uint16_t table = _SEC_LANG_TABLE; if (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid { if (lang_check(table)) ea0c: 62 17 cp r22, r18 ea0e: 73 07 cpc r23, r19 ea10: 09 f0 breq .+2 ; 0xea14 ea12: ce cf rjmp .-100 ; 0xe9b0 if (pgm_read_dword(((uint32_t*)(table + 12))) == pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE)))) //signature valid ea14: ec e0 ldi r30, 0x0C ; 12 ea16: f1 e0 ldi r31, 0x01 ; 1 ea18: 05 91 lpm r16, Z+ ea1a: 15 91 lpm r17, Z+ ea1c: 25 91 lpm r18, Z+ ea1e: 34 91 lpm r19, Z ea20: ed e8 ldi r30, 0x8D ; 141 ea22: f4 e7 ldi r31, 0x74 ; 116 ea24: 45 91 lpm r20, Z+ ea26: 55 91 lpm r21, Z+ ea28: 65 91 lpm r22, Z+ ea2a: 74 91 lpm r23, Z ea2c: 04 17 cp r16, r20 ea2e: 15 07 cpc r17, r21 ea30: 26 07 cpc r18, r22 ea32: 37 07 cpc r19, r23 ea34: 09 f0 breq .+2 ; 0xea38 ea36: bc cf rjmp .-136 ; 0xe9b0 { lang_table = (lang_table_t*)table; // set table pointer ea38: 20 e0 ldi r18, 0x00 ; 0 ea3a: 31 e0 ldi r19, 0x01 ; 1 ea3c: 30 93 2c 03 sts 0x032C, r19 ; 0x80032c ea40: 20 93 2b 03 sts 0x032B, r18 ; 0x80032b lang_selected = lang; // set language id ea44: 91 e0 ldi r25, 0x01 ; 1 ea46: 90 93 2d 03 sts 0x032D, r25 ; 0x80032d ea4a: b2 cf rjmp .-156 ; 0xe9b0 { uint16_t sum = 0; uint16_t size = pgm_read_word((uint16_t*)(addr + 4)); uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8)); uint16_t i; for (i = 0; i < size; i++) sum += (uint16_t)pgm_read_byte((uint8_t*)(addr + i)) << ((i & 1)?0:8); ea4c: fa 01 movw r30, r20 ea4e: e0 50 subi r30, 0x00 ; 0 ea50: ff 4f sbci r31, 0xFF ; 255 ea52: e4 91 lpm r30, Z ea54: f0 e0 ldi r31, 0x00 ; 0 ea56: 98 e0 ldi r25, 0x08 ; 8 ea58: 40 fd sbrc r20, 0 ea5a: 90 e0 ldi r25, 0x00 ; 0 ea5c: 02 c0 rjmp .+4 ; 0xea62 ea5e: ee 0f add r30, r30 ea60: ff 1f adc r31, r31 ea62: 9a 95 dec r25 ea64: e2 f7 brpl .-8 ; 0xea5e ea66: 2e 0f add r18, r30 ea68: 3f 1f adc r19, r31 uint8_t lang_check(uint16_t addr) { uint16_t sum = 0; uint16_t size = pgm_read_word((uint16_t*)(addr + 4)); uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8)); uint16_t i; for (i = 0; i < size; i++) ea6a: 4f 5f subi r20, 0xFF ; 255 ea6c: 5f 4f sbci r21, 0xFF ; 255 ea6e: c6 cf rjmp .-116 ; 0xe9fc if (lang_selected == lang) { eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected); return 1; } return 0; ea70: 80 e0 ldi r24, 0x00 ; 0 ea72: a8 cf rjmp .-176 ; 0xe9c4 0000ea74 : //lang_table pointer lang_table_t* lang_table = 0; const char* lang_get_translation(const char* s) { if (lang_selected == 0) return s + 2; //primary language selected, return orig. str. ea74: 20 91 2d 03 lds r18, 0x032D ; 0x80032d ea78: 21 11 cpse r18, r1 ea7a: 04 c0 rjmp .+8 ; 0xea84 ea7c: fc 01 movw r30, r24 ea7e: 32 96 adiw r30, 0x02 ; 2 if (ui == 0xffff) return s + 2; //id not assigned, return orig. str. ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character return s + 2;//zero length string == not translated, return orig. str. return (const char*)((char*)lang_table + ui); //return calculated pointer } ea80: cf 01 movw r24, r30 ea82: 08 95 ret lang_table_t* lang_table = 0; const char* lang_get_translation(const char* s) { if (lang_selected == 0) return s + 2; //primary language selected, return orig. str. if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str. ea84: 40 91 2b 03 lds r20, 0x032B ; 0x80032b ea88: 50 91 2c 03 lds r21, 0x032C ; 0x80032c ea8c: 41 15 cp r20, r1 ea8e: 51 05 cpc r21, r1 ea90: a9 f3 breq .-22 ; 0xea7c uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id ea92: fc 01 movw r30, r24 ea94: 25 91 lpm r18, Z+ ea96: 34 91 lpm r19, Z if (ui == 0xffff) return s + 2; //id not assigned, return orig. str. ea98: 2f 3f cpi r18, 0xFF ; 255 ea9a: 32 07 cpc r19, r18 ea9c: 79 f3 breq .-34 ; 0xea7c ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset ea9e: f9 01 movw r30, r18 eaa0: 38 96 adiw r30, 0x08 ; 8 eaa2: ee 0f add r30, r30 eaa4: ff 1f adc r31, r31 eaa6: e4 0f add r30, r20 eaa8: f5 1f adc r31, r21 eaaa: 25 91 lpm r18, Z+ eaac: 34 91 lpm r19, Z if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character eaae: fa 01 movw r30, r20 eab0: e2 0f add r30, r18 eab2: f3 1f adc r31, r19 eab4: 24 91 lpm r18, Z eab6: 22 23 and r18, r18 eab8: 09 f3 breq .-62 ; 0xea7c eaba: e2 cf rjmp .-60 ; 0xea80 0000eabc : } menu_item++; } void menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings) { eabc: 8f 92 push r8 eabe: 9f 92 push r9 eac0: af 92 push r10 eac2: bf 92 push r11 eac4: cf 92 push r12 eac6: df 92 push r13 eac8: ef 92 push r14 eaca: ff 92 push r15 eacc: 0f 93 push r16 eace: 1f 93 push r17 ead0: cf 93 push r28 ead2: df 93 push r29 if (menu_item == menu_line) ead4: e0 91 63 04 lds r30, 0x0463 ; 0x800463 ead8: 30 91 62 04 lds r19, 0x0462 ; 0x800462 eadc: e3 13 cpse r30, r19 eade: 73 c0 rjmp .+230 ; 0xebc6 eae0: c2 2f mov r28, r18 eae2: 6a 01 movw r12, r20 eae4: 7b 01 movw r14, r22 eae6: 5c 01 movw r10, r24 { if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>')); eae8: 80 91 59 02 lds r24, 0x0259 ; 0x800259 eaec: 88 23 and r24, r24 eaee: a1 f1 breq .+104 ; 0xeb58 eaf0: 0e 94 66 62 call 0xc4cc ; 0xc4cc eaf4: 01 e0 ldi r16, 0x01 ; 1 eaf6: 8e 33 cpi r24, 0x3E ; 62 eaf8: 09 f0 breq .+2 ; 0xeafc eafa: 00 e0 ldi r16, 0x00 ; 0 eafc: 0c 2b or r16, r28 { //settings: //xxxxxcba //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank //b = toggle string is from progmem uint8_t is_progmem = settings & 0x02; eafe: 80 2f mov r24, r16 eb00: 82 70 andi r24, 0x02 ; 2 eb02: 88 2e mov r8, r24 const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' '; eb04: e1 14 cp r14, r1 eb06: f1 04 cpc r15, r1 eb08: 09 f4 brne .+2 ; 0xeb0c eb0a: 6f c0 rjmp .+222 ; 0xebea eb0c: e7 01 movw r28, r14 eb0e: 90 e2 ldi r25, 0x20 ; 32 eb10: 99 2e mov r9, r25 if (toggle == NULL) toggle = _T(MSG_NA); uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle)); eb12: 88 20 and r8, r8 eb14: 09 f4 brne .+2 ; 0xeb18 eb16: 41 c0 rjmp .+130 ; 0xeb9a eb18: ce 01 movw r24, r28 eb1a: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> eb1e: 14 e0 ldi r17, 0x04 ; 4 eb20: 18 0f add r17, r24 lcd_putc_at(0, menu_row, (settings & 0x01) ? '>' : ' '); eb22: 4e e3 ldi r20, 0x3E ; 62 eb24: 00 ff sbrs r16, 0 eb26: 40 e2 ldi r20, 0x20 ; 32 eb28: 60 91 60 04 lds r22, 0x0460 ; 0x800460 eb2c: 80 e0 ldi r24, 0x00 ; 0 eb2e: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_print_pad_P(str, LCD_WIDTH - len); eb32: 64 e1 ldi r22, 0x14 ; 20 eb34: 61 1b sub r22, r17 eb36: c5 01 movw r24, r10 eb38: 0e 94 f7 71 call 0xe3ee ; 0xe3ee lcd_putc('['); eb3c: 8b e5 ldi r24, 0x5B ; 91 eb3e: 0e 94 21 6f call 0xde42 ; 0xde42 if (is_progmem) { lcd_puts_P(toggle); eb42: ce 01 movw r24, r28 if (toggle == NULL) toggle = _T(MSG_NA); uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle)); lcd_putc_at(0, menu_row, (settings & 0x01) ? '>' : ' '); lcd_print_pad_P(str, LCD_WIDTH - len); lcd_putc('['); if (is_progmem) eb44: 88 20 and r8, r8 eb46: 89 f1 breq .+98 ; 0xebaa { lcd_puts_P(toggle); eb48: 0e 94 1d 6f call 0xde3a ; 0xde3a } else { lcd_print(toggle); } lcd_putc(']'); eb4c: 8d e5 ldi r24, 0x5D ; 93 eb4e: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_putc(eol); eb52: 89 2d mov r24, r9 eb54: 0e 94 21 6f call 0xde42 ; 0xde42 void menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings) { if (menu_item == menu_line) { if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>')); if (menu_clicked && (lcd_encoder == menu_item)) eb58: 80 91 61 04 lds r24, 0x0461 ; 0x800461 eb5c: 88 23 and r24, r24 eb5e: 99 f1 breq .+102 ; 0xebc6 eb60: 20 91 63 04 lds r18, 0x0463 ; 0x800463 eb64: 80 91 1e 06 lds r24, 0x061E ; 0x80061e eb68: 90 91 1f 06 lds r25, 0x061F ; 0x80061f eb6c: 28 17 cp r18, r24 eb6e: 19 06 cpc r1, r25 eb70: 51 f5 brne .+84 ; 0xebc6 { if (toggle == NULL) // print N/A warning message eb72: ef 28 or r14, r15 eb74: e9 f4 brne .+58 ; 0xebb0 { menu_submenu(func); eb76: 60 e0 ldi r22, 0x00 ; 0 eb78: c6 01 movw r24, r12 eb7a: 0e 94 dd 62 call 0xc5ba ; 0xc5ba menu_item_ret(); return; } } menu_item++; } eb7e: df 91 pop r29 eb80: cf 91 pop r28 eb82: 1f 91 pop r17 eb84: 0f 91 pop r16 eb86: ff 90 pop r15 eb88: ef 90 pop r14 eb8a: df 90 pop r13 eb8c: cf 90 pop r12 eb8e: bf 90 pop r11 eb90: af 90 pop r10 eb92: 9f 90 pop r9 eb94: 8f 90 pop r8 { lcd_update_enabled = 0; if (func) func(); lcd_update_enabled = 1; } menu_item_ret(); eb96: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank //b = toggle string is from progmem uint8_t is_progmem = settings & 0x02; const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' '; if (toggle == NULL) toggle = _T(MSG_NA); uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle)); eb9a: fe 01 movw r30, r28 eb9c: 01 90 ld r0, Z+ eb9e: 00 20 and r0, r0 eba0: e9 f7 brne .-6 ; 0xeb9c eba2: ec 1b sub r30, r28 eba4: 13 e0 ldi r17, 0x03 ; 3 eba6: 1e 0f add r17, r30 eba8: bc cf rjmp .-136 ; 0xeb22 lcd_putc('['); if (is_progmem) { lcd_puts_P(toggle); } else { lcd_print(toggle); ebaa: 0e 94 5f 73 call 0xe6be ; 0xe6be ebae: ce cf rjmp .-100 ; 0xeb4c { menu_submenu(func); } else // do the actual toggling { lcd_update_enabled = 0; ebb0: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a if (func) func(); ebb4: c1 14 cp r12, r1 ebb6: d1 04 cpc r13, r1 ebb8: 11 f0 breq .+4 ; 0xebbe ebba: f6 01 movw r30, r12 ebbc: 19 95 eicall lcd_update_enabled = 1; ebbe: 81 e0 ldi r24, 0x01 ; 1 ebc0: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a ebc4: dc cf rjmp .-72 ; 0xeb7e } menu_item_ret(); return; } } menu_item++; ebc6: 80 91 63 04 lds r24, 0x0463 ; 0x800463 ebca: 8f 5f subi r24, 0xFF ; 255 ebcc: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } ebd0: df 91 pop r29 ebd2: cf 91 pop r28 ebd4: 1f 91 pop r17 ebd6: 0f 91 pop r16 ebd8: ff 90 pop r15 ebda: ef 90 pop r14 ebdc: df 90 pop r13 ebde: cf 90 pop r12 ebe0: bf 90 pop r11 ebe2: af 90 pop r10 ebe4: 9f 90 pop r9 ebe6: 8f 90 pop r8 ebe8: 08 95 ret //xxxxxcba //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank //b = toggle string is from progmem uint8_t is_progmem = settings & 0x02; const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' '; if (toggle == NULL) toggle = _T(MSG_NA); ebea: 83 e7 ldi r24, 0x73 ; 115 ebec: 98 e4 ldi r25, 0x48 ; 72 ebee: 0e 94 3a 75 call 0xea74 ; 0xea74 ebf2: ec 01 movw r28, r24 //settings: //xxxxxcba //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank //b = toggle string is from progmem uint8_t is_progmem = settings & 0x02; const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' '; ebf4: 8e e7 ldi r24, 0x7E ; 126 ebf6: 98 2e mov r9, r24 ebf8: 8c cf rjmp .-232 ; 0xeb12 0000ebfa : //! @brief Format sheet name //! //! @param[in] sheet_E Sheet in EEPROM //! @param[out] buffer for formatted output void menu_format_sheet_E(const Sheet &sheet_E, SheetFormatBuffer &buffer) { ebfa: 0f 93 push r16 ebfc: 1f 93 push r17 ebfe: cf 93 push r28 ec00: df 93 push r29 ec02: 8c 01 movw r16, r24 ec04: eb 01 movw r28, r22 uint_least8_t index = sprintf_P(buffer.c, PSTR("%.10S "), _T(MSG_SHEET)); ec06: 88 e7 ldi r24, 0x78 ; 120 ec08: 9e e4 ldi r25, 0x4E ; 78 ec0a: 0e 94 3a 75 call 0xea74 ; 0xea74 ec0e: 9f 93 push r25 ec10: 8f 93 push r24 ec12: 8c e5 ldi r24, 0x5C ; 92 ec14: 91 e8 ldi r25, 0x81 ; 129 ec16: 9f 93 push r25 ec18: 8f 93 push r24 ec1a: df 93 push r29 ec1c: cf 93 push r28 ec1e: 0f 94 f7 a2 call 0x345ee ; 0x345ee eeprom_read_block(&(buffer.c[index]), sheet_E.name, 7); ec22: c8 0f add r28, r24 ec24: d1 1d adc r29, r1 ec26: 47 e0 ldi r20, 0x07 ; 7 ec28: 50 e0 ldi r21, 0x00 ; 0 ec2a: b8 01 movw r22, r16 ec2c: ce 01 movw r24, r28 ec2e: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 //index += 7; buffer.c[index + 7] = '\0'; ec32: 1f 82 std Y+7, r1 ; 0x07 ec34: 0f 90 pop r0 ec36: 0f 90 pop r0 ec38: 0f 90 pop r0 ec3a: 0f 90 pop r0 ec3c: 0f 90 pop r0 ec3e: 0f 90 pop r0 } ec40: df 91 pop r29 ec42: cf 91 pop r28 ec44: 1f 91 pop r17 ec46: 0f 91 pop r16 ec48: 08 95 ret 0000ec4a : } menu_item++; } void menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu) { ec4a: 0f 93 push r16 ec4c: 1f 93 push r17 ec4e: cf 93 push r28 ec50: df 93 push r29 ec52: cd b7 in r28, 0x3d ; 61 ec54: de b7 in r29, 0x3e ; 62 ec56: 63 97 sbiw r28, 0x13 ; 19 ec58: 0f b6 in r0, 0x3f ; 63 ec5a: f8 94 cli ec5c: de bf out 0x3e, r29 ; 62 ec5e: 0f be out 0x3f, r0 ; 63 ec60: cd bf out 0x3d, r28 ; 61 if (menu_item == menu_line) ec62: 30 91 63 04 lds r19, 0x0463 ; 0x800463 ec66: 20 91 62 04 lds r18, 0x0462 ; 0x800462 ec6a: 32 13 cpse r19, r18 ec6c: 38 c0 rjmp .+112 ; 0xecde ec6e: 8b 01 movw r16, r22 { if (lcd_draw_update) menu_draw_item_puts_E(LCD_STR_ARROW_RIGHT[0], sheet); ec70: 20 91 59 02 lds r18, 0x0259 ; 0x800259 ec74: 22 23 and r18, r18 ec76: a9 f0 breq .+42 ; 0xeca2 static void menu_draw_item_puts_E(char type_char, const Sheet &sheet) { SheetFormatBuffer buffer; menu_format_sheet_E(sheet, buffer); ec78: be 01 movw r22, r28 ec7a: 6f 5f subi r22, 0xFF ; 255 ec7c: 7f 4f sbci r23, 0xFF ; 255 ec7e: 0e 94 fd 75 call 0xebfa ; 0xebfa lcd_putc_at(0, menu_row, menu_selection_mark()); ec82: 0e 94 66 62 call 0xc4cc ; 0xc4cc ec86: 48 2f mov r20, r24 ec88: 60 91 60 04 lds r22, 0x0460 ; 0x800460 ec8c: 80 e0 ldi r24, 0x00 ; 0 ec8e: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_print_pad(buffer.c, LCD_WIDTH - 2); ec92: 62 e1 ldi r22, 0x12 ; 18 ec94: ce 01 movw r24, r28 ec96: 01 96 adiw r24, 0x01 ; 1 ec98: 0e 94 47 73 call 0xe68e ; 0xe68e lcd_putc(type_char); ec9c: 8e e7 ldi r24, 0x7E ; 126 ec9e: 0e 94 21 6f call 0xde42 ; 0xde42 void menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu) { if (menu_item == menu_line) { if (lcd_draw_update) menu_draw_item_puts_E(LCD_STR_ARROW_RIGHT[0], sheet); if (menu_clicked && (lcd_encoder == menu_item)) eca2: 80 91 61 04 lds r24, 0x0461 ; 0x800461 eca6: 88 23 and r24, r24 eca8: d1 f0 breq .+52 ; 0xecde ecaa: 20 91 63 04 lds r18, 0x0463 ; 0x800463 ecae: 80 91 1e 06 lds r24, 0x061E ; 0x80061e ecb2: 90 91 1f 06 lds r25, 0x061F ; 0x80061f ecb6: 28 17 cp r18, r24 ecb8: 19 06 cpc r1, r25 ecba: 89 f4 brne .+34 ; 0xecde if (menu_item == menu_line) { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str); if (menu_clicked && (lcd_encoder == menu_item)) { menu_submenu(submenu); ecbc: 60 e0 ldi r22, 0x00 ; 0 ecbe: c8 01 movw r24, r16 ecc0: 0e 94 dd 62 call 0xc5ba ; 0xc5ba menu_item_ret(); ecc4: 0e 94 73 62 call 0xc4e6 ; 0xc4e6 menu_item_ret(); return; } } menu_item++; } ecc8: 63 96 adiw r28, 0x13 ; 19 ecca: 0f b6 in r0, 0x3f ; 63 eccc: f8 94 cli ecce: de bf out 0x3e, r29 ; 62 ecd0: 0f be out 0x3f, r0 ; 63 ecd2: cd bf out 0x3d, r28 ; 61 ecd4: df 91 pop r29 ecd6: cf 91 pop r28 ecd8: 1f 91 pop r17 ecda: 0f 91 pop r16 ecdc: 08 95 ret menu_submenu(submenu); menu_item_ret(); return; } } menu_item++; ecde: 80 91 63 04 lds r24, 0x0463 ; 0x800463 ece2: 8f 5f subi r24, 0xFF ; 255 ece4: 80 93 63 04 sts 0x0463, r24 ; 0x800463 ece8: ef cf rjmp .-34 ; 0xecc8 0000ecea : } sound_wait_for_user_reset(); } void M600_load_filament_movements(const char* filament_name) { ecea: cf 93 push r28 ecec: df 93 push r29 ecee: ec 01 movw r28, r24 current_position[E_AXIS]+= FILAMENTCHANGE_FIRSTFEED; ecf0: 20 e0 ldi r18, 0x00 ; 0 ecf2: 30 e0 ldi r19, 0x00 ; 0 ecf4: 4c e8 ldi r20, 0x8C ; 140 ecf6: 52 e4 ldi r21, 0x42 ; 66 ecf8: 60 91 6d 12 lds r22, 0x126D ; 0x80126d ecfc: 70 91 6e 12 lds r23, 0x126E ; 0x80126e ed00: 80 91 6f 12 lds r24, 0x126F ; 0x80126f ed04: 90 91 70 12 lds r25, 0x1270 ; 0x801270 ed08: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> ed0c: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d ed10: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e ed14: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f ed18: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); ed1c: 60 e0 ldi r22, 0x00 ; 0 ed1e: 70 e0 ldi r23, 0x00 ; 0 ed20: 80 ea ldi r24, 0xA0 ; 160 ed22: 91 e4 ldi r25, 0x41 ; 65 ed24: 0f 94 81 4c call 0x29902 ; 0x29902 load_filament_final_feed(); ed28: 0e 94 ed 63 call 0xc7da ; 0xc7da } void lcd_loading_filament(const char* filament_name) { lcd_clear(); ed2c: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_LOADING_FILAMENT)); ed30: 8d ee ldi r24, 0xED ; 237 ed32: 91 e6 ldi r25, 0x61 ; 97 ed34: 0e 94 3a 75 call 0xea74 ; 0xea74 ed38: ac 01 movw r20, r24 ed3a: 60 e0 ldi r22, 0x00 ; 0 ed3c: 80 e0 ldi r24, 0x00 ; 0 ed3e: 0e 94 07 70 call 0xe00e ; 0xe00e if (filament_name[0]) { ed42: 88 81 ld r24, Y ed44: 88 23 and r24, r24 ed46: 39 f0 breq .+14 ; 0xed56 lcd_set_cursor(0, 1); ed48: 61 e0 ldi r22, 0x01 ; 1 ed4a: 80 e0 ldi r24, 0x00 ; 0 ed4c: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print(filament_name); ed50: ce 01 movw r24, r28 ed52: 0e 94 5f 73 call 0xe6be ; 0xe6be } lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); ed56: 85 e6 ldi r24, 0x65 ; 101 ed58: 99 e3 ldi r25, 0x39 ; 57 ed5a: 0e 94 3a 75 call 0xea74 ; 0xea74 ed5e: ac 01 movw r20, r24 ed60: 62 e0 ldi r22, 0x02 ; 2 ed62: 80 e0 ldi r24, 0x00 ; 0 ed64: 0e 94 07 70 call 0xe00e ; 0xe00e uint16_t slow_seq_time = (FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL; uint16_t fast_seq_time = (FILAMENTCHANGE_FIRSTFEED * 1000ul) / FILAMENTCHANGE_EFEED_FIRST; lcd_loading_progress_bar(slow_seq_time + fast_seq_time); //show progress bar for total time of filament loading fast + slow sequence ed68: 83 e4 ldi r24, 0x43 ; 67 ed6a: 9b e2 ldi r25, 0x2B ; 43 ed6c: 0f 94 b2 0b call 0x21764 ; 0x21764 lcd_loading_filament(filament_name); st_synchronize(); } ed70: df 91 pop r29 ed72: cf 91 pop r28 { current_position[E_AXIS]+= FILAMENTCHANGE_FIRSTFEED; plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); load_filament_final_feed(); lcd_loading_filament(filament_name); st_synchronize(); ed74: 0d 94 fb 1a jmp 0x235f6 ; 0x235f6 0000ed78 : * A fullscreen message showing "Unloading Filament x" * should be shown on the LCD and LCD updates should be * are disabled in the meantime. */ static void mmu_M600_unload_filament() { if (MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN) return; ed78: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e ed7c: 8f 3f cpi r24, 0xFF ; 255 ed7e: 11 f1 breq .+68 ; 0xedc4 lcd_update_enable(false); ed80: 80 e0 ldi r24, 0x00 ; 0 ed82: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); ed86: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 1, _T(MSG_UNLOADING_FILAMENT)); ed8a: 89 ea ldi r24, 0xA9 ; 169 ed8c: 99 e5 ldi r25, 0x59 ; 89 ed8e: 0e 94 3a 75 call 0xea74 ; 0xea74 ed92: ac 01 movw r20, r24 ed94: 61 e0 ldi r22, 0x01 ; 1 ed96: 80 e0 ldi r24, 0x00 ; 0 ed98: 0e 94 07 70 call 0xe00e ; 0xe00e } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); ed9c: 80 e2 ldi r24, 0x20 ; 32 ed9e: 0e 94 a2 70 call 0xe144 ; 0xe144 lcd_print(' '); lcd_print(MMU2::mmu2.get_current_tool() + 1); eda2: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e eda6: 68 2f mov r22, r24 eda8: 70 e0 ldi r23, 0x00 ; 0 edaa: 6f 5f subi r22, 0xFF ; 255 edac: 7f 4f sbci r23, 0xFF ; 255 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); edae: 07 2e mov r0, r23 edb0: 00 0c add r0, r0 edb2: 88 0b sbc r24, r24 edb4: 99 0b sbc r25, r25 edb6: 0e 94 db 71 call 0xe3b6 ; 0xe3b6 // unload just current filament for multimaterial printers (used also in M702) MMU2::mmu2.unload(); edba: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 lcd_update_enable(true); edbe: 81 e0 ldi r24, 0x01 ; 1 edc0: 0c 94 38 70 jmp 0xe070 ; 0xe070 } edc4: 08 95 ret 0000edc6 <__vector_23>: /// that may further reduce the CPU cycles required by the bed heating automaton /// Due to the nature of bed heating the reduced PID precision may not be a major issue, however doing 8x less ISR(timer0_ovf) may significantly improve the performance static const uint8_t slowInc = 1; ISR(TIMER0_OVF_vect) // timer compare interrupt service routine { edc6: 1f 92 push r1 edc8: 0f 92 push r0 edca: 0f b6 in r0, 0x3f ; 63 edcc: 0f 92 push r0 edce: 11 24 eor r1, r1 edd0: 0b b6 in r0, 0x3b ; 59 edd2: 0f 92 push r0 edd4: 2f 93 push r18 edd6: 8f 93 push r24 edd8: 9f 93 push r25 edda: ef 93 push r30 eddc: ff 93 push r31 switch(state){ edde: e0 91 26 03 lds r30, 0x0326 ; 0x800326 ede2: e8 30 cpi r30, 0x08 ; 8 ede4: e8 f4 brcc .+58 ; 0xee20 <__vector_23+0x5a> ede6: f0 e0 ldi r31, 0x00 ; 0 ede8: 88 27 eor r24, r24 edea: e6 50 subi r30, 0x06 ; 6 edec: f9 48 sbci r31, 0x89 ; 137 edee: 8f 4f sbci r24, 0xFF ; 255 edf0: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> edf4: 02 77 andi r16, 0x72 ; 114 edf6: 1c 77 andi r17, 0x7C ; 124 edf8: 27 77 andi r18, 0x77 ; 119 edfa: 35 77 andi r19, 0x75 ; 117 edfc: 4b 77 andi r20, 0x7B ; 123 edfe: 54 77 andi r21, 0x74 ; 116 ee00: 77 77 andi r23, 0x77 ; 119 ee02: 89 77 andi r24, 0x79 ; 121 case States::ZERO_START: if (bedPWMDisabled) return; // stay in the OFF state and do not change the output pin ee04: 80 91 28 06 lds r24, 0x0628 ; 0x800628 ee08: 81 11 cpse r24, r1 ee0a: 0a c0 rjmp .+20 ; 0xee20 <__vector_23+0x5a> pwm = soft_pwm_bed << 1;// expecting soft_pwm_bed to be 7bit! ee0c: 80 91 ee 05 lds r24, 0x05EE ; 0x8005ee ee10: 88 0f add r24, r24 ee12: 80 93 25 03 sts 0x0325, r24 ; 0x800325 if( pwm != 0 ){ ee16: 88 23 and r24, r24 ee18: 19 f0 breq .+6 ; 0xee20 <__vector_23+0x5a> state = States::ZERO; // do nothing, let it tick once again after the 30Hz period ee1a: 81 e0 ldi r24, 0x01 ; 1 // In any case update our cache of pwm value for the next whole cycle from soft_pwm_bed slowCounter += slowInc; // this does software timer_clk/256 or less (depends on slowInc) if( slowCounter > pwm ){ return; } // otherwise moving towards RISE state = States::ZERO_TO_RISE; // and finalize the change in a transitional state RISE0 ee1c: 80 93 26 03 sts 0x0326, r24 ; 0x800326 TCNT0 = 128; OCR0B = 255; TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz break; } } ee20: ff 91 pop r31 ee22: ef 91 pop r30 ee24: 9f 91 pop r25 ee26: 8f 91 pop r24 ee28: 2f 91 pop r18 ee2a: 0f 90 pop r0 ee2c: 0b be out 0x3b, r0 ; 59 ee2e: 0f 90 pop r0 ee30: 0f be out 0x3f, r0 ; 63 ee32: 0f 90 pop r0 ee34: 1f 90 pop r1 ee36: 18 95 reti state = States::ZERO; // do nothing, let it tick once again after the 30Hz period } break; case States::ZERO: // end of state ZERO - we'll either stay in ZERO or change to RISE // In any case update our cache of pwm value for the next whole cycle from soft_pwm_bed slowCounter += slowInc; // this does software timer_clk/256 or less (depends on slowInc) ee38: 80 91 24 03 lds r24, 0x0324 ; 0x800324 ee3c: 8f 5f subi r24, 0xFF ; 255 ee3e: 80 93 24 03 sts 0x0324, r24 ; 0x800324 if( slowCounter > pwm ){ ee42: 90 91 25 03 lds r25, 0x0325 ; 0x800325 ee46: 98 17 cp r25, r24 ee48: 58 f3 brcs .-42 ; 0xee20 <__vector_23+0x5a> return; } // otherwise moving towards RISE state = States::ZERO_TO_RISE; // and finalize the change in a transitional state RISE0 ee4a: 82 e0 ldi r24, 0x02 ; 2 ee4c: e7 cf rjmp .-50 ; 0xee1c <__vector_23+0x56> // even though it may look like the ZERO state may be glued together with the ZERO_TO_RISE, don't do it // the timer must tick once more in order to get rid of occasional output pin toggles. case States::ZERO_TO_RISE: // special state for handling transition between prescalers and switching inverted->non-inverted fast-PWM without toggling the output pin. // It must be done in consequent steps, otherwise the pin will get flipped up and down during one PWM cycle. // Also beware of the correct sequence of the following timer control registers initialization - it really matters! state = States::RISE; // prepare for standard RISE cycles ee4e: 83 e0 ldi r24, 0x03 ; 3 ee50: 80 93 26 03 sts 0x0326, r24 ; 0x800326 fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE ee54: 8f e0 ldi r24, 0x0F ; 15 ee56: 80 93 23 03 sts 0x0323, r24 ; 0x800323 TCNT0 = 255; // force overflow on the next clock cycle ee5a: 8f ef ldi r24, 0xFF ; 255 ee5c: 86 bd out 0x26, r24 ; 38 TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz ee5e: 81 e0 ldi r24, 0x01 ; 1 ee60: 85 bd out 0x25, r24 ; 37 TCCR0A &= ~(1 << COM0B0); // Clear OC0B on Compare Match, set OC0B at BOTTOM (non-inverting mode) ee62: 84 b5 in r24, 0x24 ; 36 ee64: 8f 7e andi r24, 0xEF ; 239 fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE TCNT0 = 255; // force overflow on the next clock cycle TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz // must switch to inverting mode already here, because it takes a whole PWM cycle and it would make a "1" at the end of this pwm cycle // COM0B1 remains set both in inverting and non-inverting mode TCCR0A |= (1 << COM0B0); // inverting mode ee66: 84 bd out 0x24, r24 ; 36 ee68: db cf rjmp .-74 ; 0xee20 <__vector_23+0x5a> TCNT0 = 255; // force overflow on the next clock cycle TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz TCCR0A &= ~(1 << COM0B0); // Clear OC0B on Compare Match, set OC0B at BOTTOM (non-inverting mode) break; case States::RISE: OCR0B = (fastMax - fastCounter) << fastShift; ee6a: 80 91 23 03 lds r24, 0x0323 ; 0x800323 ee6e: 82 95 swap r24 ee70: 80 7f andi r24, 0xF0 ; 240 ee72: 81 95 neg r24 ee74: 88 bd out 0x28, r24 ; 40 if( fastCounter ){ ee76: 80 91 23 03 lds r24, 0x0323 ; 0x800323 ee7a: 88 23 and r24, r24 ee7c: 21 f0 breq .+8 ; 0xee86 <__vector_23+0xc0> break; case States::FALL: OCR0B = (fastMax - fastCounter) << fastShift; // this is the same as in RISE, because now we are setting the zero part of duty due to inverting mode //TCCR0A |= (1 << COM0B0); // already set in ONE_TO_FALL if( fastCounter ){ --fastCounter; ee7e: 81 50 subi r24, 0x01 ; 1 ee80: 80 93 23 03 sts 0x0323, r24 ; 0x800323 ee84: cd cf rjmp .-102 ; 0xee20 <__vector_23+0x5a> case States::RISE: OCR0B = (fastMax - fastCounter) << fastShift; if( fastCounter ){ --fastCounter; } else { // end of RISE cycles, changing into state ONE state = States::RISE_TO_ONE; ee86: 84 e0 ldi r24, 0x04 ; 4 ee88: 80 93 26 03 sts 0x0326, r24 ; 0x800326 OCR0B = 255; // full duty ee8c: 8f ef ldi r24, 0xFF ; 255 ee8e: 88 bd out 0x28, r24 ; 40 TCNT0 = 254; // make the timer overflow in the next cycle ee90: 8e ef ldi r24, 0xFE ; 254 ee92: 86 bd out 0x26, r24 ; 38 ee94: c5 cf rjmp .-118 ; 0xee20 <__vector_23+0x5a> // @@TODO these constants are still subject to investigation } break; case States::RISE_TO_ONE: state = States::ONE; ee96: 85 e0 ldi r24, 0x05 ; 5 ee98: 80 93 26 03 sts 0x0326, r24 ; 0x800326 OCR0B = 255; // full duty ee9c: 8f ef ldi r24, 0xFF ; 255 ee9e: 88 bd out 0x28, r24 ; 40 TCNT0 = 255; // make the timer overflow in the next cycle eea0: 86 bd out 0x26, r24 ; 38 break; case States::FALL_TO_ZERO: state = States::ZERO_START; // go to read new soft_pwm_bed value for the next cycle TCNT0 = 128; OCR0B = 255; TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz eea2: 82 e0 ldi r24, 0x02 ; 2 eea4: 85 bd out 0x25, r24 ; 37 eea6: bc cf rjmp .-136 ; 0xee20 <__vector_23+0x5a> OCR0B = 255; // full duty TCNT0 = 255; // make the timer overflow in the next cycle TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz break; case States::ONE: // state ONE - we'll either stay in ONE or change to FALL OCR0B = 255; eea8: 2f ef ldi r18, 0xFF ; 255 eeaa: 28 bd out 0x28, r18 ; 40 if (bedPWMDisabled) return; // stay in the ON state and do not change the output pin eeac: 80 91 28 06 lds r24, 0x0628 ; 0x800628 eeb0: 81 11 cpse r24, r1 eeb2: b6 cf rjmp .-148 ; 0xee20 <__vector_23+0x5a> slowCounter += slowInc; // this does software timer_clk/256 or less eeb4: 80 91 24 03 lds r24, 0x0324 ; 0x800324 eeb8: 8f 5f subi r24, 0xFF ; 255 eeba: 80 93 24 03 sts 0x0324, r24 ; 0x800324 if( slowCounter < pwm ){ eebe: 90 91 25 03 lds r25, 0x0325 ; 0x800325 eec2: 89 17 cp r24, r25 eec4: 08 f4 brcc .+2 ; 0xeec8 <__vector_23+0x102> eec6: ac cf rjmp .-168 ; 0xee20 <__vector_23+0x5a> return; } if( (soft_pwm_bed << 1) >= (255 - slowInc - 1) ){ //@@TODO simplify & explain eec8: 80 91 ee 05 lds r24, 0x05EE ; 0x8005ee eecc: 90 e0 ldi r25, 0x00 ; 0 eece: 8f 37 cpi r24, 0x7F ; 127 eed0: 91 05 cpc r25, r1 eed2: 0c f0 brlt .+2 ; 0xeed6 <__vector_23+0x110> eed4: a5 cf rjmp .-182 ; 0xee20 <__vector_23+0x5a> // if slowInc==2, soft_pwm == 251 will be the first to do short drops to zero. 252 will keep full heating return; // want full duty for the next ONE cycle again - so keep on heating and just wait for the next timer ovf } // otherwise moving towards FALL state=States::FALL; eed6: 86 e0 ldi r24, 0x06 ; 6 eed8: 80 93 26 03 sts 0x0326, r24 ; 0x800326 fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE eedc: 8f e0 ldi r24, 0x0F ; 15 eede: 80 93 23 03 sts 0x0323, r24 ; 0x800323 TCNT0 = 255; // force overflow on the next clock cycle eee2: 26 bd out 0x26, r18 ; 38 TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz eee4: 81 e0 ldi r24, 0x01 ; 1 eee6: 85 bd out 0x25, r24 ; 37 // must switch to inverting mode already here, because it takes a whole PWM cycle and it would make a "1" at the end of this pwm cycle // COM0B1 remains set both in inverting and non-inverting mode TCCR0A |= (1 << COM0B0); // inverting mode eee8: 84 b5 in r24, 0x24 ; 36 eeea: 80 61 ori r24, 0x10 ; 16 eeec: bc cf rjmp .-136 ; 0xee66 <__vector_23+0xa0> break; case States::FALL: OCR0B = (fastMax - fastCounter) << fastShift; // this is the same as in RISE, because now we are setting the zero part of duty due to inverting mode eeee: 80 91 23 03 lds r24, 0x0323 ; 0x800323 eef2: 82 95 swap r24 eef4: 80 7f andi r24, 0xF0 ; 240 eef6: 81 95 neg r24 eef8: 88 bd out 0x28, r24 ; 40 //TCCR0A |= (1 << COM0B0); // already set in ONE_TO_FALL if( fastCounter ){ eefa: 80 91 23 03 lds r24, 0x0323 ; 0x800323 eefe: 81 11 cpse r24, r1 ef00: be cf rjmp .-132 ; 0xee7e <__vector_23+0xb8> --fastCounter; } else { // end of FALL cycles, changing into state ZERO state = States::FALL_TO_ZERO; ef02: 87 e0 ldi r24, 0x07 ; 7 ef04: 80 93 26 03 sts 0x0326, r24 ; 0x800326 TCNT0 = 128; //@@TODO again - need to wait long enough to propagate the timer state changes ef08: 80 e8 ldi r24, 0x80 ; 128 ef0a: 86 bd out 0x26, r24 ; 38 OCR0B = 255; ef0c: 8f ef ldi r24, 0xFF ; 255 ef0e: 88 bd out 0x28, r24 ; 40 ef10: 87 cf rjmp .-242 ; 0xee20 <__vector_23+0x5a> } break; case States::FALL_TO_ZERO: state = States::ZERO_START; // go to read new soft_pwm_bed value for the next cycle ef12: 10 92 26 03 sts 0x0326, r1 ; 0x800326 TCNT0 = 128; ef16: 80 e8 ldi r24, 0x80 ; 128 ef18: 86 bd out 0x26, r24 ; 38 OCR0B = 255; ef1a: 8f ef ldi r24, 0xFF ; 255 ef1c: 88 bd out 0x28, r24 ; 40 ef1e: c1 cf rjmp .-126 ; 0xeea2 <__vector_23+0xdc> 0000ef20 : #else // FILAMENT_SENSOR FSensorBlockRunout::FSensorBlockRunout() { } FSensorBlockRunout::~FSensorBlockRunout() { } #endif // FILAMENT_SENSOR void Filament_sensor::setEnabled(bool enabled) { ef20: cf 93 push r28 ef22: c8 2f mov r28, r24 ef24: 68 2f mov r22, r24 ef26: 87 e6 ldi r24, 0x67 ; 103 ef28: 9f e0 ldi r25, 0x0F ; 15 ef2a: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled); if (enabled) { ef2e: cc 23 and r28, r28 ef30: 19 f0 breq .+6 ; 0xef38 fsensor.init(); } else { fsensor.deinit(); } } ef32: cf 91 pop r28 #endif // FILAMENT_SENSOR void Filament_sensor::setEnabled(bool enabled) { eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled); if (enabled) { fsensor.init(); ef34: 0d 94 dc 6d jmp 0x2dbb8 ; 0x2dbb8 } void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; ef38: 10 92 f1 16 sts 0x16F1, r1 ; 0x8016f1 filter = 0; ef3c: 10 92 fd 16 sts 0x16FD, r1 ; 0x8016fd if (enabled) { fsensor.init(); } else { fsensor.deinit(); } } ef40: cf 91 pop r28 ef42: 08 95 ret 0000ef44 : #endif #endif //DEBUG_DISABLE_FANCHECK } void resetFanCheck() { fan_measuring = false; ef44: 10 92 b6 03 sts 0x03B6, r1 ; 0x8003b6 extruder_autofan_last_check = _millis(); ef48: 0f 94 f0 0d call 0x21be0 ; 0x21be0 ef4c: 60 93 07 17 sts 0x1707, r22 ; 0x801707 ef50: 70 93 08 17 sts 0x1708, r23 ; 0x801708 ef54: 80 93 09 17 sts 0x1709, r24 ; 0x801709 ef58: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a } ef5c: 08 95 ret 0000ef5e : void setExtruderAutoFanState(uint8_t state) { //If bit 1 is set (0x02), then the hotend fan speed won't be adjusted according to temperature. Useful for forcing //the fan to either On or Off during certain tests/errors. fanState = state; ef5e: 80 93 22 03 sts 0x0322, r24 ; 0x800322 newFanSpeed = 0; if (fanState & 0x01) ef62: 80 fd sbrc r24, 0 ef64: 1c c0 rjmp .+56 ; 0xef9e { //If bit 1 is set (0x02), then the hotend fan speed won't be adjusted according to temperature. Useful for forcing //the fan to either On or Off during certain tests/errors. fanState = state; newFanSpeed = 0; ef66: 10 92 3e 03 sts 0x033E, r1 ; 0x80033e else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #else //EXTRUDER_ALTFAN_DETECT newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #endif //EXTRUDER_ALTFAN_DETECT } timer4_set_fan0(newFanSpeed); ef6a: 20 91 3e 03 lds r18, 0x033E ; 0x80033e } #ifdef EXTRUDER_0_AUTO_FAN_PIN void timer4_set_fan0(uint8_t duty) { if (duty == 0 || duty == 255) ef6e: 8f ef ldi r24, 0xFF ; 255 ef70: 82 0f add r24, r18 ef72: 8e 3f cpi r24, 0xFE ; 254 ef74: e8 f0 brcs .+58 ; 0xefb0 { // We use digital logic if the duty cycle is 0% or 100% TCCR4A &= ~_BV(COM4C1); ef76: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> ef7a: 87 7f andi r24, 0xF7 ; 247 ef7c: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = 0; ef80: 10 92 ad 00 sts 0x00AD, r1 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> ef84: 10 92 ac 00 sts 0x00AC, r1 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> WRITE(EXTRUDER_0_AUTO_FAN_PIN, duty); ef88: 9f b7 in r25, 0x3f ; 63 ef8a: 22 23 and r18, r18 ef8c: 61 f0 breq .+24 ; 0xefa6 ef8e: f8 94 cli ef90: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> ef94: 80 62 ori r24, 0x20 ; 32 ef96: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> ef9a: 9f bf out 0x3f, r25 ; 63 ef9c: 08 95 ret { #ifdef EXTRUDER_ALTFAN_DETECT if (altfanStatus.isAltfan && !altfanStatus.altfanOverride) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT; else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #else //EXTRUDER_ALTFAN_DETECT newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; ef9e: 8f ef ldi r24, 0xFF ; 255 efa0: 80 93 3e 03 sts 0x033E, r24 ; 0x80033e efa4: e2 cf rjmp .-60 ; 0xef6a efa6: f8 94 cli efa8: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> efac: 8f 7d andi r24, 0xDF ; 223 efae: f3 cf rjmp .-26 ; 0xef96 else { // Use the timer for fan speed. Enable the timer compare output and set the duty cycle. // This function also handles the impossible scenario of a fan speed change during a Tone. // Better be safe than sorry. CRITICAL_SECTION_START; efb0: ef b7 in r30, 0x3f ; 63 efb2: f8 94 cli // Enable the PWM output on the fan pin. TCCR4A |= _BV(COM4C1); efb4: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> efb8: 88 60 ori r24, 0x08 ; 8 efba: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = (((uint16_t)duty) * ((uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U))) / 255U; efbe: 30 e0 ldi r19, 0x00 ; 0 efc0: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> efc4: 4f ef ldi r20, 0xFF ; 255 efc6: 50 e0 ldi r21, 0x00 ; 0 efc8: 81 ff sbrs r24, 1 efca: 04 c0 rjmp .+8 ; 0xefd4 efcc: 40 91 a8 00 lds r20, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> efd0: 50 91 a9 00 lds r21, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> efd4: 24 9f mul r18, r20 efd6: c0 01 movw r24, r0 efd8: 25 9f mul r18, r21 efda: 90 0d add r25, r0 efdc: 34 9f mul r19, r20 efde: 90 0d add r25, r0 efe0: 11 24 eor r1, r1 efe2: 6f ef ldi r22, 0xFF ; 255 efe4: 70 e0 ldi r23, 0x00 ; 0 efe6: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> efea: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> efee: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> CRITICAL_SECTION_END; eff2: ef bf out 0x3f, r30 ; 63 #endif //EXTRUDER_ALTFAN_DETECT } timer4_set_fan0(newFanSpeed); } eff4: 08 95 ret 0000eff6 : } #endif //EXTRUDER_ALTFAN_DETECT void checkExtruderAutoFans() { eff6: 1f 93 push r17 eff8: cf 93 push r28 effa: df 93 push r29 #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1 if (!(fanState & 0x02)) effc: d0 91 22 03 lds r29, 0x0322 ; 0x800322 f000: d1 fd sbrc r29, 1 f002: 1d c0 rjmp .+58 ; 0xf03e temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; f004: 10 91 cc 03 lds r17, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> { fanState &= ~1; fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; f008: c1 e0 ldi r28, 0x01 ; 1 f00a: 20 e0 ldi r18, 0x00 ; 0 f00c: 30 e0 ldi r19, 0x00 ; 0 f00e: 48 e4 ldi r20, 0x48 ; 72 f010: 52 e4 ldi r21, 0x42 ; 66 f012: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a f016: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b f01a: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c f01e: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d f022: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> f026: 18 16 cp r1, r24 f028: 0c f0 brlt .+2 ; 0xf02c f02a: c0 e0 ldi r28, 0x00 ; 0 void checkExtruderAutoFans() { #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1 if (!(fanState & 0x02)) { fanState &= ~1; f02c: de 7f andi r29, 0xFE ; 254 fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; f02e: cd 2b or r28, r29 f030: 81 e0 ldi r24, 0x01 ; 1 f032: 11 11 cpse r17, r1 f034: 01 c0 rjmp .+2 ; 0xf038 f036: 80 e0 ldi r24, 0x00 ; 0 fanState |= get_temp_error(); f038: c8 2b or r28, r24 f03a: c0 93 22 03 sts 0x0322, r28 ; 0x800322 } setExtruderAutoFanState(fanState); f03e: 80 91 22 03 lds r24, 0x0322 ; 0x800322 #endif } f042: df 91 pop r29 f044: cf 91 pop r28 f046: 1f 91 pop r17 { fanState &= ~1; fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; fanState |= get_temp_error(); } setExtruderAutoFanState(fanState); f048: 0c 94 af 77 jmp 0xef5e ; 0xef5e 0000f04c : void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) { if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32) eeprom_write_float_notify(__p, def); } void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) { f04c: ef 92 push r14 f04e: ff 92 push r15 f050: 0f 93 push r16 f052: 1f 93 push r17 f054: cf 93 push r28 f056: df 93 push r29 f058: ec 01 movw r28, r24 f05a: 8b 01 movw r16, r22 f05c: 7a 01 movw r14, r20 if (!eeprom_is_initialized_block(__p, __n)) f05e: 0e 94 da 55 call 0xabb4 ; 0xabb4 f062: 81 11 cpse r24, r1 f064: 0b c0 rjmp .+22 ; 0xf07c #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); f066: a8 01 movw r20, r16 f068: be 01 movw r22, r28 f06a: c7 01 movw r24, r14 } void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) { if (!eeprom_is_initialized_block(__p, __n)) eeprom_update_block_notify(def, __p, __n); } f06c: df 91 pop r29 f06e: cf 91 pop r28 f070: 1f 91 pop r17 f072: 0f 91 pop r16 f074: ff 90 pop r15 f076: ef 90 pop r14 #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); f078: 0d 94 f4 a3 jmp 0x347e8 ; 0x347e8 } void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) { if (!eeprom_is_initialized_block(__p, __n)) eeprom_update_block_notify(def, __p, __n); } f07c: df 91 pop r29 f07e: cf 91 pop r28 f080: 1f 91 pop r17 f082: 0f 91 pop r16 f084: ff 90 pop r15 f086: ef 90 pop r14 f088: 08 95 ret 0000f08a : return def; } return val; } uint16_t __attribute__((noinline)) eeprom_init_default_word(uint16_t *__p, uint16_t def) { f08a: 0f 93 push r16 f08c: 1f 93 push r17 f08e: cf 93 push r28 f090: df 93 push r29 f092: 8c 01 movw r16, r24 f094: d6 2f mov r29, r22 f096: c7 2f mov r28, r23 uint16_t val = eeprom_read_word(__p); f098: 0f 94 ee a3 call 0x347dc ; 0x347dc if (val == EEPROM_EMPTY_VALUE16) { f09c: 8f 3f cpi r24, 0xFF ; 255 f09e: 98 07 cpc r25, r24 f0a0: 39 f4 brne .+14 ; 0xf0b0 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); f0a2: 6d 2f mov r22, r29 f0a4: 7c 2f mov r23, r28 f0a6: c8 01 movw r24, r16 f0a8: 0f 94 3e a4 call 0x3487c ; 0x3487c uint16_t __attribute__((noinline)) eeprom_init_default_word(uint16_t *__p, uint16_t def) { uint16_t val = eeprom_read_word(__p); if (val == EEPROM_EMPTY_VALUE16) { eeprom_write_word_notify(__p, def); return def; f0ac: 8d 2f mov r24, r29 f0ae: 9c 2f mov r25, r28 } return val; } f0b0: df 91 pop r29 f0b2: cf 91 pop r28 f0b4: 1f 91 pop r17 f0b6: 0f 91 pop r16 f0b8: 08 95 ret 0000f0ba : void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) { eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add); } uint8_t __attribute__((noinline)) eeprom_init_default_byte(uint8_t *__p, uint8_t def) { f0ba: 0f 93 push r16 f0bc: 1f 93 push r17 f0be: cf 93 push r28 f0c0: 8c 01 movw r16, r24 f0c2: c6 2f mov r28, r22 uint8_t val = eeprom_read_byte(__p); f0c4: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (val == EEPROM_EMPTY_VALUE) { f0c8: 8f 3f cpi r24, 0xFF ; 255 f0ca: 29 f4 brne .+10 ; 0xf0d6 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); f0cc: 6c 2f mov r22, r28 f0ce: c8 01 movw r24, r16 f0d0: 0f 94 28 a4 call 0x34850 ; 0x34850 uint8_t __attribute__((noinline)) eeprom_init_default_byte(uint8_t *__p, uint8_t def) { uint8_t val = eeprom_read_byte(__p); if (val == EEPROM_EMPTY_VALUE) { eeprom_write_byte_notify(__p, def); return def; f0d4: 8c 2f mov r24, r28 } return val; } f0d6: cf 91 pop r28 f0d8: 1f 91 pop r17 f0da: 0f 91 pop r16 f0dc: 08 95 ret 0000f0de : void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) { eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1); } void __attribute__((noinline)) eeprom_increment_word(uint16_t *__p) { f0de: cf 93 push r28 f0e0: df 93 push r29 f0e2: ec 01 movw r28, r24 eeprom_write_word_notify(__p, eeprom_read_word(__p) + 1); f0e4: 0f 94 ee a3 call 0x347dc ; 0x347dc f0e8: bc 01 movw r22, r24 f0ea: 6f 5f subi r22, 0xFF ; 255 f0ec: 7f 4f sbci r23, 0xFF ; 255 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); f0ee: ce 01 movw r24, r28 eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1); } void __attribute__((noinline)) eeprom_increment_word(uint16_t *__p) { eeprom_write_word_notify(__p, eeprom_read_word(__p) + 1); } f0f0: df 91 pop r29 f0f2: cf 91 pop r28 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); f0f4: 0d 94 3e a4 jmp 0x3487c ; 0x3487c 0000f0f8 : void eeprom_toggle(uint8_t *__p) { eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); } void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) { f0f8: cf 93 push r28 f0fa: df 93 push r29 f0fc: ec 01 movw r28, r24 eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1); f0fe: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 f102: 61 e0 ldi r22, 0x01 ; 1 f104: 68 0f add r22, r24 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); f106: ce 01 movw r24, r28 eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); } void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) { eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1); } f108: df 91 pop r29 f10a: cf 91 pop r28 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); f10c: 0d 94 28 a4 jmp 0x34850 ; 0x34850 0000f110 : sheet = eeprom_next_initialized_sheet(sheet); if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet); } bool __attribute__((noinline)) eeprom_is_sheet_initialized(uint8_t sheet_num) { return (eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base->s[sheet_num].z_offset))) != EEPROM_EMPTY_VALUE16); f110: 2b e0 ldi r18, 0x0B ; 11 f112: 82 9f mul r24, r18 f114: c0 01 movw r24, r0 f116: 11 24 eor r1, r1 f118: 80 5b subi r24, 0xB0 ; 176 f11a: 92 4f sbci r25, 0xF2 ; 242 f11c: 0f 94 ee a3 call 0x347dc ; 0x347dc f120: 21 e0 ldi r18, 0x01 ; 1 f122: 01 96 adiw r24, 0x01 ; 1 f124: 09 f4 brne .+2 ; 0xf128 f126: 20 e0 ldi r18, 0x00 ; 0 } f128: 82 2f mov r24, r18 f12a: 08 95 ret 0000f12c : //! //! @param sheet Current sheet //! @return next initialized sheet //! @retval -1 no sheet is initialized int8_t eeprom_next_initialized_sheet(int8_t sheet) { f12c: cf 93 push r28 f12e: df 93 push r29 f130: c8 2f mov r28, r24 f132: d8 e0 ldi r29, 0x08 ; 8 for (int8_t i = 0; i < static_cast(sizeof(Sheets::s)/sizeof(Sheet)); ++i) { ++sheet; f134: cf 5f subi r28, 0xFF ; 255 if (sheet >= static_cast(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0; f136: c8 30 cpi r28, 0x08 ; 8 f138: 0c f0 brlt .+2 ; 0xf13c f13a: c0 e0 ldi r28, 0x00 ; 0 if (eeprom_is_sheet_initialized(sheet)) return sheet; f13c: 8c 2f mov r24, r28 f13e: 0e 94 88 78 call 0xf110 ; 0xf110 f142: 81 11 cpse r24, r1 f144: 03 c0 rjmp .+6 ; 0xf14c f146: d1 50 subi r29, 0x01 ; 1 //! @param sheet Current sheet //! @return next initialized sheet //! @retval -1 no sheet is initialized int8_t eeprom_next_initialized_sheet(int8_t sheet) { for (int8_t i = 0; i < static_cast(sizeof(Sheets::s)/sizeof(Sheet)); ++i) f148: a9 f7 brne .-22 ; 0xf134 { ++sheet; if (sheet >= static_cast(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0; if (eeprom_is_sheet_initialized(sheet)) return sheet; } return -1; f14a: cf ef ldi r28, 0xFF ; 255 } f14c: 8c 2f mov r24, r28 f14e: df 91 pop r29 f150: cf 91 pop r28 f152: 08 95 ret 0000f154 : #endif //DEBUG_EEPROM_CHANGES } void eeprom_switch_to_next_sheet() { int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); f154: 81 ea ldi r24, 0xA1 ; 161 f156: 9d e0 ldi r25, 0x0D ; 13 f158: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 sheet = eeprom_next_initialized_sheet(sheet); f15c: 0e 94 96 78 call 0xf12c ; 0xf12c if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet); f160: 87 fd sbrc r24, 7 f162: 05 c0 rjmp .+10 ; 0xf16e if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); f164: 68 2f mov r22, r24 f166: 81 ea ldi r24, 0xA1 ; 161 f168: 9d e0 ldi r25, 0x0D ; 13 f16a: 0d 94 04 a4 jmp 0x34808 ; 0x34808 { int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); sheet = eeprom_next_initialized_sheet(sheet); if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet); } f16e: 08 95 ret 0000f170 : //! | 7 | Custom2 | //! //! @param[in] index //! @param[out] sheetName void eeprom_default_sheet_name(uint8_t index, SheetName &sheetName) { f170: 0f 93 push r16 f172: 1f 93 push r17 f174: cf 93 push r28 f176: c8 2f mov r28, r24 f178: 8b 01 movw r16, r22 static_assert(8 == sizeof(SheetName),"Default sheet name needs to be adjusted."); if (index < 2) { strcpy_P(sheetName.c, PSTR("Smooth")); f17a: 60 e4 ldi r22, 0x40 ; 64 f17c: 74 e7 ldi r23, 0x74 ; 116 //! @param[out] sheetName void eeprom_default_sheet_name(uint8_t index, SheetName &sheetName) { static_assert(8 == sizeof(SheetName),"Default sheet name needs to be adjusted."); if (index < 2) f17e: 82 30 cpi r24, 0x02 ; 2 f180: 70 f0 brcs .+28 ; 0xf19e { strcpy_P(sheetName.c, PSTR("Smooth")); } else if (index < 4) { strcpy_P(sheetName.c, PSTR("Textur")); f182: 69 e3 ldi r22, 0x39 ; 57 f184: 74 e7 ldi r23, 0x74 ; 116 if (index < 2) { strcpy_P(sheetName.c, PSTR("Smooth")); } else if (index < 4) f186: 84 30 cpi r24, 0x04 ; 4 f188: 50 f0 brcs .+20 ; 0xf19e { strcpy_P(sheetName.c, PSTR("Textur")); } else if (index < 5) { strcpy_P(sheetName.c, PSTR("Satin ")); f18a: 61 e3 ldi r22, 0x31 ; 49 f18c: 74 e7 ldi r23, 0x74 ; 116 } else if (index < 4) { strcpy_P(sheetName.c, PSTR("Textur")); } else if (index < 5) f18e: 84 30 cpi r24, 0x04 ; 4 f190: 31 f0 breq .+12 ; 0xf19e { strcpy_P(sheetName.c, PSTR("Satin ")); } else if (index < 6) { strcpy_P(sheetName.c, PSTR("NylonPA")); f192: 69 e2 ldi r22, 0x29 ; 41 f194: 74 e7 ldi r23, 0x74 ; 116 } else if (index < 5) { strcpy_P(sheetName.c, PSTR("Satin ")); } else if (index < 6) f196: 85 30 cpi r24, 0x05 ; 5 f198: 11 f0 breq .+4 ; 0xf19e { strcpy_P(sheetName.c, PSTR("NylonPA")); } else { strcpy_P(sheetName.c, PSTR("Custom")); f19a: 62 e2 ldi r22, 0x22 ; 34 f19c: 74 e7 ldi r23, 0x74 ; 116 f19e: c8 01 movw r24, r16 f1a0: 0f 94 97 a1 call 0x3432e ; 0x3432e } if (index <4 || index >5) f1a4: 8c ef ldi r24, 0xFC ; 252 f1a6: 8c 0f add r24, r28 f1a8: 82 30 cpi r24, 0x02 ; 2 f1aa: 28 f0 brcs .+10 ; 0xf1b6 { sheetName.c[6] = '0' + ((index % 2)+1); f1ac: c1 70 andi r28, 0x01 ; 1 f1ae: cf 5c subi r28, 0xCF ; 207 f1b0: f8 01 movw r30, r16 f1b2: c6 83 std Z+6, r28 ; 0x06 sheetName.c[7] = '\0'; f1b4: 17 82 std Z+7, r1 ; 0x07 } } f1b6: cf 91 pop r28 f1b8: 1f 91 pop r17 f1ba: 0f 91 pop r16 f1bc: 08 95 ret 0000f1be : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); f1be: 61 e0 ldi r22, 0x01 ; 1 f1c0: 80 ec ldi r24, 0xC0 ; 192 f1c2: 9f e0 ldi r25, 0x0F ; 15 f1c4: 0f 94 04 a4 call 0x34808 ; 0x34808 f1c8: 60 e0 ldi r22, 0x00 ; 0 f1ca: 8f eb ldi r24, 0xBF ; 191 f1cc: 9f e0 ldi r25, 0x0F ; 15 f1ce: 0f 94 04 a4 call 0x34808 ; 0x34808 f1d2: 60 e0 ldi r22, 0x00 ; 0 f1d4: 8e eb ldi r24, 0xBE ; 190 f1d6: 9f e0 ldi r25, 0x0F ; 15 f1d8: 0f 94 04 a4 call 0x34808 ; 0x34808 f1dc: 60 e0 ldi r22, 0x00 ; 0 f1de: 8d eb ldi r24, 0xBD ; 189 f1e0: 9f e0 ldi r25, 0x0F ; 15 f1e2: 0f 94 04 a4 call 0x34808 ; 0x34808 f1e6: 60 e0 ldi r22, 0x00 ; 0 f1e8: 8c eb ldi r24, 0xBC ; 188 f1ea: 9f e0 ldi r25, 0x0F ; 15 f1ec: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0000f1f0 : { putchar((val > 9)?(val - 10 + 'a'):(val + '0')); } void print_hex_byte(uint8_t val) { f1f0: cf 93 push r28 f1f2: c8 2f mov r28, r24 print_hex_nibble(val >> 4); f1f4: 82 95 swap r24 f1f6: 8f 70 andi r24, 0x0F ; 15 f1f8: 0e 94 48 5d call 0xba90 ; 0xba90 print_hex_nibble(val & 15); f1fc: 8c 2f mov r24, r28 f1fe: 8f 70 andi r24, 0x0F ; 15 } f200: cf 91 pop r28 } void print_hex_byte(uint8_t val) { print_hex_nibble(val >> 4); print_hex_nibble(val & 15); f202: 0c 94 48 5d jmp 0xba90 ; 0xba90 0000f206 : #endif //SDSUPPORT } uint16_t cmdqueue_calc_sd_length() { if (buflen == 0) f206: 40 91 3c 12 lds r20, 0x123C ; 0x80123c f20a: 50 91 3d 12 lds r21, 0x123D ; 0x80123d return 0; f20e: 90 e0 ldi r25, 0x00 ; 0 f210: 80 e0 ldi r24, 0x00 ; 0 #endif //SDSUPPORT } uint16_t cmdqueue_calc_sd_length() { if (buflen == 0) f212: 41 15 cp r20, r1 f214: 51 05 cpc r21, r1 f216: b1 f1 breq .+108 ; 0xf284 char hi; } lohi; uint16_t value; } sdlen_single; uint16_t sdlen = 0; for (size_t _buflen = buflen, _bufindr = bufindr;;) { f218: 20 91 38 12 lds r18, 0x1238 ; 0x801238 f21c: 30 91 39 12 lds r19, 0x1239 ; 0x801239 char lo; char hi; } lohi; uint16_t value; } sdlen_single; uint16_t sdlen = 0; f220: 90 e0 ldi r25, 0x00 ; 0 f222: 80 e0 ldi r24, 0x00 ; 0 for (size_t _buflen = buflen, _bufindr = bufindr;;) { if (cmdbuffer[_bufindr] == CMDBUFFER_CURRENT_TYPE_SDCARD) { f224: f9 01 movw r30, r18 f226: e5 5b subi r30, 0xB5 ; 181 f228: ff 4e sbci r31, 0xEF ; 239 f22a: a0 81 ld r26, Z f22c: a2 30 cpi r26, 0x02 ; 2 f22e: 21 f4 brne .+8 ; 0xf238 sdlen_single.lohi.lo = cmdbuffer[_bufindr + 1]; f230: 61 81 ldd r22, Z+1 ; 0x01 sdlen_single.lohi.hi = cmdbuffer[_bufindr + 2]; f232: 72 81 ldd r23, Z+2 ; 0x02 sdlen += sdlen_single.value; f234: 86 0f add r24, r22 f236: 97 1f adc r25, r23 } if (-- _buflen == 0) f238: 41 50 subi r20, 0x01 ; 1 f23a: 51 09 sbc r21, r1 f23c: 19 f1 breq .+70 ; 0xf284 f23e: f9 01 movw r30, r18 f240: e2 5b subi r30, 0xB2 ; 178 f242: ff 4e sbci r31, 0xEF ; 239 break; // First skip the current command ID and iterate up to the end of the string. for (_bufindr += CMDHDRSIZE; cmdbuffer[_bufindr] != 0; ++ _bufindr) ; f244: a1 91 ld r26, Z+ f246: 9f 01 movw r18, r30 f248: 2b 54 subi r18, 0x4B ; 75 f24a: 30 41 sbci r19, 0x10 ; 16 f24c: a1 11 cpse r26, r1 f24e: fa cf rjmp .-12 ; 0xf244 f250: f9 01 movw r30, r18 f252: e5 5b subi r30, 0xB5 ; 181 f254: ff 4e sbci r31, 0xEF ; 239 // Second, skip the end of string null character and iterate until a nonzero command ID is found. for (++ _bufindr; _bufindr < sizeof(cmdbuffer) && cmdbuffer[_bufindr] == 0; ++ _bufindr) ; f256: 2d 3e cpi r18, 0xED ; 237 f258: a1 e0 ldi r26, 0x01 ; 1 f25a: 3a 07 cpc r19, r26 f25c: 30 f4 brcc .+12 ; 0xf26a f25e: a1 91 ld r26, Z+ f260: a1 11 cpse r26, r1 f262: e0 cf rjmp .-64 ; 0xf224 f264: 2f 5f subi r18, 0xFF ; 255 f266: 3f 4f sbci r19, 0xFF ; 255 f268: f6 cf rjmp .-20 ; 0xf256 // If the end of the buffer was empty, if (_bufindr == sizeof(cmdbuffer)) { f26a: 2d 3e cpi r18, 0xED ; 237 f26c: e1 e0 ldi r30, 0x01 ; 1 f26e: 3e 07 cpc r19, r30 f270: c9 f6 brne .-78 ; 0xf224 f272: eb e4 ldi r30, 0x4B ; 75 f274: f0 e1 ldi r31, 0x10 ; 16 f276: 9f 01 movw r18, r30 f278: 2b 54 subi r18, 0x4B ; 75 f27a: 30 41 sbci r19, 0x10 ; 16 // skip to the start and find the nonzero command. for (_bufindr = 0; cmdbuffer[_bufindr] == 0; ++ _bufindr) ; f27c: a1 91 ld r26, Z+ f27e: aa 23 and r26, r26 f280: d1 f3 breq .-12 ; 0xf276 f282: d0 cf rjmp .-96 ; 0xf224 } } return sdlen; } f284: 08 95 ret 0000f286 : // Pop the currently processed command from the queue. // It is expected, that there is at least one command in the queue. bool cmdqueue_pop_front() { if (buflen > 0) { f286: 80 91 3c 12 lds r24, 0x123C ; 0x80123c f28a: 90 91 3d 12 lds r25, 0x123D ; 0x80123d f28e: 18 16 cp r1, r24 f290: 19 06 cpc r1, r25 f292: 0c f0 brlt .+2 ; 0xf296 f294: 43 c0 rjmp .+134 ; 0xf31c SERIAL_ECHO(serial_count); SERIAL_ECHOPGM(", bufsize "); SERIAL_ECHO(sizeof(cmdbuffer)); SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ if (-- buflen == 0) { f296: 01 97 sbiw r24, 0x01 ; 1 f298: 90 93 3d 12 sts 0x123D, r25 ; 0x80123d f29c: 80 93 3c 12 sts 0x123C, r24 ; 0x80123c f2a0: 89 2b or r24, r25 f2a2: a1 f4 brne .+40 ; 0xf2cc // Empty buffer. if (serial_count == 0) f2a4: 80 91 47 10 lds r24, 0x1047 ; 0x801047 f2a8: 90 91 48 10 lds r25, 0x1048 ; 0x801048 f2ac: 89 2b or r24, r25 f2ae: 21 f4 brne .+8 ; 0xf2b8 // No serial communication is pending. Reset both pointers to zero. bufindw = 0; f2b0: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> f2b4: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> bufindr = bufindw; f2b8: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> f2bc: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> f2c0: 90 93 39 12 sts 0x1239, r25 ; 0x801239 f2c4: 80 93 38 12 sts 0x1238, r24 ; 0x801238 SERIAL_ECHOPGM(" new command on the top: "); SERIAL_ECHO(cmdbuffer+bufindr+CMDHDRSIZE); SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ } return true; f2c8: 81 e0 ldi r24, 0x01 ; 1 f2ca: 08 95 ret bufindw = 0; bufindr = bufindw; } else { // There is at least one ready line in the buffer. // First skip the current command ID and iterate up to the end of the string. for (bufindr += CMDHDRSIZE; cmdbuffer[bufindr] != 0; ++ bufindr) ; f2cc: 80 91 38 12 lds r24, 0x1238 ; 0x801238 f2d0: 90 91 39 12 lds r25, 0x1239 ; 0x801239 f2d4: 03 96 adiw r24, 0x03 ; 3 f2d6: fc 01 movw r30, r24 f2d8: e5 5b subi r30, 0xB5 ; 181 f2da: ff 4e sbci r31, 0xEF ; 239 f2dc: 20 81 ld r18, Z f2de: 01 96 adiw r24, 0x01 ; 1 f2e0: 21 11 cpse r18, r1 f2e2: f9 cf rjmp .-14 ; 0xf2d6 f2e4: fc 01 movw r30, r24 f2e6: e5 5b subi r30, 0xB5 ; 181 f2e8: ff 4e sbci r31, 0xEF ; 239 // Second, skip the end of string null character and iterate until a nonzero command ID is found. for (++ bufindr; bufindr < sizeof(cmdbuffer) && cmdbuffer[bufindr] == 0; ++ bufindr) ; f2ea: 8d 3e cpi r24, 0xED ; 237 f2ec: 21 e0 ldi r18, 0x01 ; 1 f2ee: 92 07 cpc r25, r18 f2f0: 40 f4 brcc .+16 ; 0xf302 f2f2: 41 91 ld r20, Z+ f2f4: 9c 01 movw r18, r24 f2f6: 2f 5f subi r18, 0xFF ; 255 f2f8: 3f 4f sbci r19, 0xFF ; 255 f2fa: 41 11 cpse r20, r1 f2fc: e1 cf rjmp .-62 ; 0xf2c0 f2fe: c9 01 movw r24, r18 f300: f4 cf rjmp .-24 ; 0xf2ea // If the end of the buffer was empty, if (bufindr == sizeof(cmdbuffer)) { f302: eb e4 ldi r30, 0x4B ; 75 f304: f0 e1 ldi r31, 0x10 ; 16 f306: 8d 3e cpi r24, 0xED ; 237 f308: 21 e0 ldi r18, 0x01 ; 1 f30a: 92 07 cpc r25, r18 f30c: c9 f6 brne .-78 ; 0xf2c0 f30e: cf 01 movw r24, r30 f310: 8b 54 subi r24, 0x4B ; 75 f312: 90 41 sbci r25, 0x10 ; 16 // skip to the start and find the nonzero command. for (bufindr = 0; cmdbuffer[bufindr] == 0; ++ bufindr) ; f314: 21 91 ld r18, Z+ f316: 22 23 and r18, r18 f318: d1 f3 breq .-12 ; 0xf30e f31a: d2 cf rjmp .-92 ; 0xf2c0 SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ } return true; } return false; f31c: 80 e0 ldi r24, 0x00 ; 0 } f31e: 08 95 ret 0000f320 : autostart_atmillis.start(); // reset timer } char *createFilename(char *buffer,const dir_t &p) //buffer>12characters { char *pos=buffer; f320: fc 01 movw r30, r24 for (uint8_t i = 0; i < 11; i++) f322: 20 e0 ldi r18, 0x00 ; 0 { if (p.name[i] == ' ')continue; if (i == 8) { *pos++='.'; f324: 3e e2 ldi r19, 0x2E ; 46 char *createFilename(char *buffer,const dir_t &p) //buffer>12characters { char *pos=buffer; for (uint8_t i = 0; i < 11; i++) { if (p.name[i] == ' ')continue; f326: db 01 movw r26, r22 f328: 4d 91 ld r20, X+ f32a: bd 01 movw r22, r26 f32c: 40 32 cpi r20, 0x20 ; 32 f32e: 49 f0 breq .+18 ; 0xf342 if (i == 8) f330: 28 30 cpi r18, 0x08 ; 8 f332: 11 f4 brne .+4 ; 0xf338 { *pos++='.'; f334: 30 83 st Z, r19 f336: 31 96 adiw r30, 0x01 ; 1 } *pos++=p.name[i]; f338: db 01 movw r26, r22 f33a: 11 97 sbiw r26, 0x01 ; 1 f33c: 4c 91 ld r20, X f33e: 40 83 st Z, r20 f340: 31 96 adiw r30, 0x01 ; 1 } char *createFilename(char *buffer,const dir_t &p) //buffer>12characters { char *pos=buffer; for (uint8_t i = 0; i < 11; i++) f342: 2f 5f subi r18, 0xFF ; 255 f344: 2b 30 cpi r18, 0x0B ; 11 f346: 79 f7 brne .-34 ; 0xf326 { *pos++='.'; } *pos++=p.name[i]; } *pos++=0; f348: 10 82 st Z, r1 return buffer; } f34a: 08 95 ret 0000f34c : public: int8_t readDir(dir_t* dir, char* longFilename); static bool remove(SdBaseFile* dirFile, const char* path); bool remove(); /** Set the file's current position to zero. */ void rewind() {seekSet(0);} f34c: 40 e0 ldi r20, 0x00 ; 0 f34e: 50 e0 ldi r21, 0x00 ; 0 f350: ba 01 movw r22, r20 f352: 0d 94 0b 2d jmp 0x25a16 ; 0x25a16 0000f356 : class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} SdBaseFile(const char* path, uint8_t oflag); ~SdBaseFile() {if(isOpen()) close();} f356: fc 01 movw r30, r24 f358: 23 81 ldd r18, Z+3 ; 0x03 f35a: 21 11 cpse r18, r1 f35c: 0d 94 e9 2e jmp 0x25dd2 ; 0x25dd2 f360: 08 95 ret 0000f362 : M_UDRx = c; } */ static void write(uint8_t c) { if (selectedSerialPort == 0) f362: 90 91 1c 06 lds r25, 0x061C ; 0x80061c f366: 91 11 cpse r25, r1 f368: 07 c0 rjmp .+14 ; 0xf378 { while (!((M_UCSRxA) & (1 << M_UDREx))); f36a: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> f36e: 95 ff sbrs r25, 5 f370: fc cf rjmp .-8 ; 0xf36a M_UDRx = c; f372: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> f376: 08 95 ret } else if (selectedSerialPort == 1) f378: 91 30 cpi r25, 0x01 ; 1 f37a: 31 f4 brne .+12 ; 0xf388 { while (!((UCSR1A) & (1 << UDRE1))); f37c: 90 91 c8 00 lds r25, 0x00C8 ; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8> f380: 95 ff sbrs r25, 5 f382: fc cf rjmp .-8 ; 0xf37c UDR1 = c; f384: 80 93 ce 00 sts 0x00CE, r24 ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> } } f388: 08 95 ret 0000f38a : } // Private Methods ///////////////////////////////////////////////////////////// void MarlinSerial::printNumber(unsigned long n, uint8_t base) { f38a: 8f 92 push r8 f38c: 9f 92 push r9 f38e: af 92 push r10 f390: bf 92 push r11 f392: ef 92 push r14 f394: ff 92 push r15 f396: 0f 93 push r16 f398: 1f 93 push r17 f39a: cf 93 push r28 f39c: df 93 push r29 f39e: cd b7 in r28, 0x3d ; 61 f3a0: de b7 in r29, 0x3e ; 62 f3a2: a0 97 sbiw r28, 0x20 ; 32 f3a4: 0f b6 in r0, 0x3f ; 63 f3a6: f8 94 cli f3a8: de bf out 0x3e, r29 ; 62 f3aa: 0f be out 0x3f, r0 ; 63 f3ac: cd bf out 0x3d, r28 ; 61 unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; if (n == 0) { f3ae: 61 15 cp r22, r1 f3b0: 71 05 cpc r23, r1 f3b2: 81 05 cpc r24, r1 f3b4: 91 05 cpc r25, r1 f3b6: 99 f4 brne .+38 ; 0xf3de } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f3b8: 80 e3 ldi r24, 0x30 ; 48 for (; i > 0; i--) print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); } f3ba: a0 96 adiw r28, 0x20 ; 32 f3bc: 0f b6 in r0, 0x3f ; 63 f3be: f8 94 cli f3c0: de bf out 0x3e, r29 ; 62 f3c2: 0f be out 0x3f, r0 ; 63 f3c4: cd bf out 0x3d, r28 ; 61 f3c6: df 91 pop r29 f3c8: cf 91 pop r28 f3ca: 1f 91 pop r17 f3cc: 0f 91 pop r16 f3ce: ff 90 pop r15 f3d0: ef 90 pop r14 f3d2: bf 90 pop r11 f3d4: af 90 pop r10 f3d6: 9f 90 pop r9 f3d8: 8f 90 pop r8 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f3da: 0c 94 b1 79 jmp 0xf362 ; 0xf362 // Private Methods ///////////////////////////////////////////////////////////// void MarlinSerial::printNumber(unsigned long n, uint8_t base) { unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; f3de: 00 e0 ldi r16, 0x00 ; 0 print('0'); return; } while (n > 0) { buf[i++] = n % base; f3e0: 84 2e mov r8, r20 f3e2: 91 2c mov r9, r1 f3e4: b1 2c mov r11, r1 f3e6: a1 2c mov r10, r1 f3e8: 9e 01 movw r18, r28 f3ea: 2f 5f subi r18, 0xFF ; 255 f3ec: 3f 4f sbci r19, 0xFF ; 255 f3ee: 79 01 movw r14, r18 f3f0: a5 01 movw r20, r10 f3f2: 94 01 movw r18, r8 f3f4: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> f3f8: f7 01 movw r30, r14 f3fa: e0 0f add r30, r16 f3fc: f1 1d adc r31, r1 f3fe: 60 83 st Z, r22 n /= base; f400: b9 01 movw r22, r18 f402: ca 01 movw r24, r20 print('0'); return; } while (n > 0) { buf[i++] = n % base; f404: 0f 5f subi r16, 0xFF ; 255 if (n == 0) { print('0'); return; } while (n > 0) { f406: 61 15 cp r22, r1 f408: 71 05 cpc r23, r1 f40a: 81 05 cpc r24, r1 f40c: 91 05 cpc r25, r1 f40e: 81 f7 brne .-32 ; 0xf3f0 f410: 0e 0d add r16, r14 f412: 1f 2d mov r17, r15 f414: 11 1d adc r17, r1 buf[i++] = n % base; n /= base; } for (; i > 0; i--) f416: e0 16 cp r14, r16 f418: f1 06 cpc r15, r17 f41a: 59 f0 breq .+22 ; 0xf432 print((char) (buf[i - 1] < 10 ? f41c: f8 01 movw r30, r16 f41e: 82 91 ld r24, -Z f420: 8f 01 movw r16, r30 f422: 8a 30 cpi r24, 0x0A ; 10 f424: 20 f4 brcc .+8 ; 0xf42e '0' + buf[i - 1] : f426: 80 5d subi r24, 0xD0 ; 208 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f428: 0e 94 b1 79 call 0xf362 ; 0xf362 f42c: f4 cf rjmp .-24 ; 0xf416 } for (; i > 0; i--) print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); f42e: 89 5c subi r24, 0xC9 ; 201 f430: fb cf rjmp .-10 ; 0xf428 } f432: a0 96 adiw r28, 0x20 ; 32 f434: 0f b6 in r0, 0x3f ; 63 f436: f8 94 cli f438: de bf out 0x3e, r29 ; 62 f43a: 0f be out 0x3f, r0 ; 63 f43c: cd bf out 0x3d, r28 ; 61 f43e: df 91 pop r29 f440: cf 91 pop r28 f442: 1f 91 pop r17 f444: 0f 91 pop r16 f446: ff 90 pop r15 f448: ef 90 pop r14 f44a: bf 90 pop r11 f44c: af 90 pop r10 f44e: 9f 90 pop r9 f450: 8f 90 pop r8 f452: 08 95 ret 0000f454 : void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); } void MarlinSerial::print(long n, int base) f454: cf 92 push r12 f456: df 92 push r13 f458: ef 92 push r14 f45a: ff 92 push r15 f45c: 6b 01 movw r12, r22 f45e: 7c 01 movw r14, r24 { if (base == 0) { write(n); } else if (base == 10) { if (n < 0) { f460: f7 fe sbrs r15, 7 f462: 0b c0 rjmp .+22 ; 0xf47a } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f464: 8d e2 ldi r24, 0x2D ; 45 f466: 0e 94 b1 79 call 0xf362 ; 0xf362 } else if (base == 10) { if (n < 0) { print('-'); n = -n; f46a: f0 94 com r15 f46c: e0 94 com r14 f46e: d0 94 com r13 f470: c0 94 com r12 f472: c1 1c adc r12, r1 f474: d1 1c adc r13, r1 f476: e1 1c adc r14, r1 f478: f1 1c adc r15, r1 } printNumber(n, 10); f47a: 4a e0 ldi r20, 0x0A ; 10 f47c: c7 01 movw r24, r14 f47e: b6 01 movw r22, r12 } else { printNumber(n, base); } } f480: ff 90 pop r15 f482: ef 90 pop r14 f484: df 90 pop r13 f486: cf 90 pop r12 } else if (base == 10) { if (n < 0) { print('-'); n = -n; } printNumber(n, 10); f488: 0c 94 c5 79 jmp 0xf38a ; 0xf38a 0000f48c : '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); } void MarlinSerial::printFloat(double number, uint8_t digits) { f48c: 8f 92 push r8 f48e: 9f 92 push r9 f490: af 92 push r10 f492: bf 92 push r11 f494: cf 92 push r12 f496: df 92 push r13 f498: ef 92 push r14 f49a: ff 92 push r15 f49c: cf 93 push r28 f49e: 6b 01 movw r12, r22 f4a0: 7c 01 movw r14, r24 f4a2: b4 2e mov r11, r20 // Handle negative numbers if (number < 0.0) f4a4: 20 e0 ldi r18, 0x00 ; 0 f4a6: 30 e0 ldi r19, 0x00 ; 0 f4a8: a9 01 movw r20, r18 f4aa: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> f4ae: 87 ff sbrs r24, 7 f4b0: 07 c0 rjmp .+14 ; 0xf4c0 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f4b2: 8d e2 ldi r24, 0x2D ; 45 f4b4: 0e 94 b1 79 call 0xf362 ; 0xf362 { // Handle negative numbers if (number < 0.0) { print('-'); number = -number; f4b8: f7 fa bst r15, 7 f4ba: f0 94 com r15 f4bc: f7 f8 bld r15, 7 f4be: f0 94 com r15 } // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; for (uint8_t i=0; i rounding /= 10.0; f4ce: 20 e0 ldi r18, 0x00 ; 0 f4d0: 30 e0 ldi r19, 0x00 ; 0 f4d2: 40 e2 ldi r20, 0x20 ; 32 f4d4: 51 e4 ldi r21, 0x41 ; 65 f4d6: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> number = -number; } // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; for (uint8_t i=0; i rounding /= 10.0; number += rounding; f4de: 9b 01 movw r18, r22 f4e0: ac 01 movw r20, r24 f4e2: c7 01 movw r24, r14 f4e4: b6 01 movw r22, r12 f4e6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> f4ea: 6b 01 movw r12, r22 f4ec: 7c 01 movw r14, r24 // Extract the integer part of the number and print it unsigned long int_part = (unsigned long)number; f4ee: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> f4f2: 4b 01 movw r8, r22 f4f4: 5c 01 movw r10, r24 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); f4f6: 4a e0 ldi r20, 0x0A ; 10 f4f8: 0e 94 c5 79 call 0xf38a ; 0xf38a unsigned long int_part = (unsigned long)number; double remainder = number - (double)int_part; print(int_part); // Print the decimal point, but only if there are digits beyond if (digits > 0) f4fc: cc 23 and r28, r28 f4fe: 91 f1 breq .+100 ; 0xf564 number += rounding; // Extract the integer part of the number and print it unsigned long int_part = (unsigned long)number; double remainder = number - (double)int_part; f500: c5 01 movw r24, r10 f502: b4 01 movw r22, r8 f504: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> f508: 9b 01 movw r18, r22 f50a: ac 01 movw r20, r24 f50c: c7 01 movw r24, r14 f50e: b6 01 movw r22, r12 f510: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> f514: 6b 01 movw r12, r22 f516: 7c 01 movw r14, r24 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f518: 8e e2 ldi r24, 0x2E ; 46 f51a: 0e 94 b1 79 call 0xf362 ; 0xf362 // Print the decimal point, but only if there are digits beyond if (digits > 0) print('.'); // Extract digits from the remainder one at a time while (digits-- > 0) f51e: c1 50 subi r28, 0x01 ; 1 f520: 08 f1 brcs .+66 ; 0xf564 { remainder *= 10.0; f522: 20 e0 ldi r18, 0x00 ; 0 f524: 30 e0 ldi r19, 0x00 ; 0 f526: 40 e2 ldi r20, 0x20 ; 32 f528: 51 e4 ldi r21, 0x41 ; 65 f52a: c7 01 movw r24, r14 f52c: b6 01 movw r22, r12 f52e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> f532: 4b 01 movw r8, r22 f534: 5c 01 movw r10, r24 int toPrint = int(remainder); f536: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); f53a: 6b 01 movw r12, r22 f53c: 77 0f add r23, r23 f53e: ee 08 sbc r14, r14 f540: ff 08 sbc r15, r15 f542: c7 01 movw r24, r14 f544: b6 01 movw r22, r12 f546: 0e 94 2a 7a call 0xf454 ; 0xf454 while (digits-- > 0) { remainder *= 10.0; int toPrint = int(remainder); print(toPrint); remainder -= toPrint; f54a: c7 01 movw r24, r14 f54c: b6 01 movw r22, r12 f54e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f552: 9b 01 movw r18, r22 f554: ac 01 movw r20, r24 f556: c5 01 movw r24, r10 f558: b4 01 movw r22, r8 f55a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> f55e: 6b 01 movw r12, r22 f560: 7c 01 movw r14, r24 f562: dd cf rjmp .-70 ; 0xf51e } } f564: cf 91 pop r28 f566: ff 90 pop r15 f568: ef 90 pop r14 f56a: df 90 pop r13 f56c: cf 90 pop r12 f56e: bf 90 pop r11 f570: af 90 pop r10 f572: 9f 90 pop r9 f574: 8f 90 pop r8 f576: 08 95 ret 0000f578 : } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); f578: 8a e0 ldi r24, 0x0A ; 10 f57a: 0c 94 b1 79 jmp 0xf362 ; 0xf362 0000f57e : static FILE _uartout; #define uartout (&_uartout) int uart_putchar(char c, FILE *) { MYSERIAL.write(c); f57e: 0e 94 b1 79 call 0xf362 ; 0xf362 return 0; } f582: 90 e0 ldi r25, 0x00 ; 0 f584: 80 e0 ldi r24, 0x00 ; 0 f586: 08 95 ret 0000f588 : void serial_echopair_P(const char *s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_P(const char *s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serialprintPGM(const char *str) { f588: cf 93 push r28 f58a: df 93 push r29 f58c: ec 01 movw r28, r24 while(uint8_t ch = pgm_read_byte(str)) { f58e: fe 01 movw r30, r28 f590: 84 91 lpm r24, Z f592: 88 23 and r24, r24 f594: 21 f0 breq .+8 ; 0xf59e MYSERIAL.write((char)ch); f596: 0e 94 b1 79 call 0xf362 ; 0xf362 ++str; f59a: 21 96 adiw r28, 0x01 ; 1 f59c: f8 cf rjmp .-16 ; 0xf58e } } f59e: df 91 pop r29 f5a0: cf 91 pop r28 f5a2: 08 95 ret 0000f5a4 : // Turn off the print fan fanSpeed = 0; } } void serialecho_temperatures() { f5a4: cf 92 push r12 f5a6: df 92 push r13 f5a8: ef 92 push r14 f5aa: ff 92 push r15 //inline so that there is no performance decrease. //deg=degreeCelsius // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degHotend(uint8_t extruder) { return current_temperature[extruder]; f5ac: c0 90 5a 0d lds r12, 0x0D5A ; 0x800d5a f5b0: d0 90 5b 0d lds r13, 0x0D5B ; 0x800d5b f5b4: e0 90 5c 0d lds r14, 0x0D5C ; 0x800d5c f5b8: f0 90 5d 0d lds r15, 0x0D5D ; 0x800d5d float tt = degHotend(active_extruder); SERIAL_PROTOCOLPGM("T:"); f5bc: 83 e9 ldi r24, 0x93 ; 147 f5be: 98 e7 ldi r25, 0x78 ; 120 f5c0: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); f5c4: 42 e0 ldi r20, 0x02 ; 2 f5c6: c7 01 movw r24, r14 f5c8: b6 01 movw r22, r12 f5ca: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(tt); SERIAL_PROTOCOLPGM(" E:0 B:"); f5ce: 8b e8 ldi r24, 0x8B ; 139 f5d0: 98 e7 ldi r25, 0x78 ; 120 f5d2: 0e 94 c4 7a call 0xf588 ; 0xf588 f5d6: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc f5da: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd f5de: 80 91 be 03 lds r24, 0x03BE ; 0x8003be f5e2: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf f5e6: 41 e0 ldi r20, 0x01 ; 1 f5e8: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(); } f5ec: ff 90 pop r15 f5ee: ef 90 pop r14 f5f0: df 90 pop r13 f5f2: cf 90 pop r12 float tt = degHotend(active_extruder); SERIAL_PROTOCOLPGM("T:"); SERIAL_PROTOCOL(tt); SERIAL_PROTOCOLPGM(" E:0 B:"); SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(); f5f4: 0c 94 bc 7a jmp 0xf578 ; 0xf578 0000f5f8 : } } /// @brief Helper function to reduce code size in M861 /// by extracting common code into one function static void gcode_M861_print_pinda_cal_eeprom() { f5f8: 4f 92 push r4 f5fa: 5f 92 push r5 f5fc: 6f 92 push r6 f5fe: 7f 92 push r7 f600: 8f 92 push r8 f602: 9f 92 push r9 f604: af 92 push r10 f606: bf 92 push r11 f608: cf 92 push r12 f60a: df 92 push r13 f60c: ef 92 push r14 f60e: ff 92 push r15 f610: 0f 93 push r16 f612: 1f 93 push r17 f614: cf 93 push r28 f616: df 93 push r29 f618: cc 24 eor r12, r12 f61a: ca 94 dec r12 f61c: dc 2c mov r13, r12 f61e: 76 01 movw r14, r12 f620: 0e ea ldi r16, 0xAE ; 174 f622: 1f e0 ldi r17, 0x0F ; 15 f624: 93 e2 ldi r25, 0x23 ; 35 f626: 89 2e mov r8, r25 f628: 91 2c mov r9, r1 f62a: a1 2c mov r10, r1 f62c: b1 2c mov r11, r1 int16_t usteps = 0; float mm = 0; f62e: 41 2c mov r4, r1 f630: 51 2c mov r5, r1 f632: 32 01 movw r6, r4 } /// @brief Helper function to reduce code size in M861 /// by extracting common code into one function static void gcode_M861_print_pinda_cal_eeprom() { int16_t usteps = 0; f634: d0 e0 ldi r29, 0x00 ; 0 f636: c0 e0 ldi r28, 0x00 ; 0 float mm = 0; static const char comma_sep[] PROGMEM = ", "; for (uint8_t i = 0; i < 6; i++) { if(i > 0) { f638: 8f ef ldi r24, 0xFF ; 255 f63a: c8 16 cp r12, r24 f63c: 09 f4 brne .+2 ; 0xf640 f63e: 5d c0 rjmp .+186 ; 0xf6fa usteps = eeprom_read_word((uint16_t*) EEPROM_PROBE_TEMP_SHIFT + (i - 1)); f640: c8 01 movw r24, r16 f642: 0f 94 ee a3 call 0x347dc ; 0x347dc f646: ec 01 movw r28, r24 mm = ((float)usteps) / cs.axis_steps_per_mm[Z_AXIS]; f648: bc 01 movw r22, r24 f64a: 99 0f add r25, r25 f64c: 88 0b sbc r24, r24 f64e: 99 0b sbc r25, r25 f650: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f654: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 f658: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 f65c: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 f660: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 f664: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> f668: 2b 01 movw r4, r22 f66a: 3c 01 movw r6, r24 f66c: c7 01 movw r24, r14 f66e: b6 01 movw r22, r12 f670: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL(i - 1); } else { SERIAL_PROTOCOLRPGM(MSG_NA); } SERIAL_PROTOCOLRPGM(comma_sep); f674: 87 ee ldi r24, 0xE7 ; 231 f676: 97 e7 ldi r25, 0x77 ; 119 f678: 0e 94 c4 7a call 0xf588 ; 0xf588 f67c: c5 01 movw r24, r10 f67e: b4 01 movw r22, r8 f680: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL(35 + (i * 5)); SERIAL_PROTOCOLRPGM(comma_sep); f684: 87 ee ldi r24, 0xE7 ; 231 f686: 97 e7 ldi r25, 0x77 ; 119 f688: 0e 94 c4 7a call 0xf588 ; 0xf588 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); f68c: be 01 movw r22, r28 f68e: 0d 2e mov r0, r29 f690: 00 0c add r0, r0 f692: 88 0b sbc r24, r24 f694: 99 0b sbc r25, r25 f696: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOLRPGM(comma_sep); f69a: 87 ee ldi r24, 0xE7 ; 231 f69c: 97 e7 ldi r25, 0x77 ; 119 f69e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(mm * 1000); f6a2: 20 e0 ldi r18, 0x00 ; 0 f6a4: 30 e0 ldi r19, 0x00 ; 0 f6a6: 4a e7 ldi r20, 0x7A ; 122 f6a8: 54 e4 ldi r21, 0x44 ; 68 f6aa: c3 01 movw r24, r6 f6ac: b2 01 movw r22, r4 f6ae: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> f6b2: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 f6b6: 85 e0 ldi r24, 0x05 ; 5 f6b8: 88 0e add r8, r24 f6ba: 91 1c adc r9, r1 f6bc: a1 1c adc r10, r1 f6be: b1 1c adc r11, r1 f6c0: 0e 5f subi r16, 0xFE ; 254 f6c2: 1f 4f sbci r17, 0xFF ; 255 f6c4: 8f ef ldi r24, 0xFF ; 255 f6c6: c8 1a sub r12, r24 f6c8: d8 0a sbc r13, r24 f6ca: e8 0a sbc r14, r24 f6cc: f8 0a sbc r15, r24 /// by extracting common code into one function static void gcode_M861_print_pinda_cal_eeprom() { int16_t usteps = 0; float mm = 0; static const char comma_sep[] PROGMEM = ", "; for (uint8_t i = 0; i < 6; i++) { f6ce: 0a 3b cpi r16, 0xBA ; 186 f6d0: 8f e0 ldi r24, 0x0F ; 15 f6d2: 18 07 cpc r17, r24 f6d4: 09 f0 breq .+2 ; 0xf6d8 f6d6: b0 cf rjmp .-160 ; 0xf638 SERIAL_PROTOCOLRPGM(comma_sep); SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOLRPGM(comma_sep); SERIAL_PROTOCOLLN(mm * 1000); } } f6d8: df 91 pop r29 f6da: cf 91 pop r28 f6dc: 1f 91 pop r17 f6de: 0f 91 pop r16 f6e0: ff 90 pop r15 f6e2: ef 90 pop r14 f6e4: df 90 pop r13 f6e6: cf 90 pop r12 f6e8: bf 90 pop r11 f6ea: af 90 pop r10 f6ec: 9f 90 pop r9 f6ee: 8f 90 pop r8 f6f0: 7f 90 pop r7 f6f2: 6f 90 pop r6 f6f4: 5f 90 pop r5 f6f6: 4f 90 pop r4 f6f8: 08 95 ret if(i > 0) { usteps = eeprom_read_word((uint16_t*) EEPROM_PROBE_TEMP_SHIFT + (i - 1)); mm = ((float)usteps) / cs.axis_steps_per_mm[Z_AXIS]; SERIAL_PROTOCOL(i - 1); } else { SERIAL_PROTOCOLRPGM(MSG_NA); f6fa: 83 e7 ldi r24, 0x73 ; 115 f6fc: 98 e4 ldi r25, 0x48 ; 72 f6fe: 0e 94 c4 7a call 0xf588 ; 0xf588 f702: b8 cf rjmp .-144 ; 0xf674 0000f704 : /// @brief load filament for mmu v2 /// @par nozzle_temp nozzle temperature to load filament static void mmu_M600_load_filament(bool automatic) { uint8_t slot; if (automatic) { f704: 88 23 and r24, r24 f706: 71 f1 breq .+92 ; 0xf764 currentMMUSlot = slot; } uint8_t SpoolJoin::nextSlot() { SERIAL_ECHOPGM("SpoolJoin: "); f708: 8b ed ldi r24, 0xDB ; 219 f70a: 97 e7 ldi r25, 0x77 ; 119 f70c: 0e 94 c4 7a call 0xf588 ; 0xf588 f710: 60 91 90 12 lds r22, 0x1290 ; 0x801290 f714: 70 e0 ldi r23, 0x00 ; 0 f716: 90 e0 ldi r25, 0x00 ; 0 f718: 80 e0 ldi r24, 0x00 ; 0 f71a: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO((int)currentMMUSlot); if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0; f71e: 80 91 90 12 lds r24, 0x1290 ; 0x801290 f722: 84 30 cpi r24, 0x04 ; 4 f724: d8 f0 brcs .+54 ; 0xf75c f726: 10 92 90 12 sts 0x1290, r1 ; 0x801290 else currentMMUSlot++; SERIAL_ECHOPGM(" -> "); f72a: 86 ed ldi r24, 0xD6 ; 214 f72c: 97 e7 ldi r25, 0x77 ; 119 f72e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN((int)currentMMUSlot); f732: 80 91 90 12 lds r24, 0x1290 ; 0x801290 f736: 90 e0 ldi r25, 0x00 ; 0 f738: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e return currentMMUSlot; f73c: 80 91 90 12 lds r24, 0x1290 ; 0x801290 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; f740: 20 91 5b 12 lds r18, 0x125B ; 0x80125b f744: 30 91 5c 12 lds r19, 0x125C ; 0x80125c f748: 30 93 5e 12 sts 0x125E, r19 ; 0x80125e f74c: 20 93 5d 12 sts 0x125D, r18 ; 0x80125d slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT); } setTargetHotend(saved_extruder_temperature); MMU2::mmu2.load_filament_to_nozzle(slot); f750: 0e 94 37 fe call 0x1fc6e ; 0x1fc6e load_filament_final_feed(); // @@TODO verify f754: 0e 94 ed 63 call 0xc7da ; 0xc7da st_synchronize(); f758: 0d 94 fb 1a jmp 0x235f6 ; 0x235f6 { SERIAL_ECHOPGM("SpoolJoin: "); SERIAL_ECHO((int)currentMMUSlot); if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0; else currentMMUSlot++; f75c: 8f 5f subi r24, 0xFF ; 255 f75e: 80 93 90 12 sts 0x1290, r24 ; 0x801290 f762: e3 cf rjmp .-58 ; 0xf72a uint8_t slot; if (automatic) { slot = SpoolJoin::spooljoin.nextSlot(); } else { // Only ask for the slot if automatic/SpoolJoin is off slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT); f764: 86 e1 ldi r24, 0x16 ; 22 f766: 9d e3 ldi r25, 0x3D ; 61 f768: 0e 94 3a 75 call 0xea74 ; 0xea74 f76c: 70 e0 ldi r23, 0x00 ; 0 f76e: 60 e0 ldi r22, 0x00 ; 0 f770: 0e 94 c8 d1 call 0x1a390 ; 0x1a390 f774: e5 cf rjmp .-54 ; 0xf740 0000f776 : return final_result; } void gcode_M114() { f776: cf 93 push r28 f778: df 93 push r29 SERIAL_PROTOCOLPGM("X:"); f77a: 83 ed ldi r24, 0xD3 ; 211 f77c: 97 e7 ldi r25, 0x77 ; 119 f77e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL(current_position[X_AXIS]); f782: c1 e6 ldi r28, 0x61 ; 97 f784: d2 e1 ldi r29, 0x12 ; 18 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); f786: 68 81 ld r22, Y f788: 79 81 ldd r23, Y+1 ; 0x01 f78a: 8a 81 ldd r24, Y+2 ; 0x02 f78c: 9b 81 ldd r25, Y+3 ; 0x03 f78e: 42 e0 ldi r20, 0x02 ; 2 f790: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" Y:"); f794: 8f ec ldi r24, 0xCF ; 207 f796: 97 e7 ldi r25, 0x77 ; 119 f798: 0e 94 c4 7a call 0xf588 ; 0xf588 f79c: 6c 81 ldd r22, Y+4 ; 0x04 f79e: 7d 81 ldd r23, Y+5 ; 0x05 f7a0: 8e 81 ldd r24, Y+6 ; 0x06 f7a2: 9f 81 ldd r25, Y+7 ; 0x07 f7a4: 42 e0 ldi r20, 0x02 ; 2 f7a6: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(current_position[Y_AXIS]); SERIAL_PROTOCOLPGM(" Z:"); f7aa: 8b ec ldi r24, 0xCB ; 203 f7ac: 97 e7 ldi r25, 0x77 ; 119 f7ae: 0e 94 c4 7a call 0xf588 ; 0xf588 f7b2: 68 85 ldd r22, Y+8 ; 0x08 f7b4: 79 85 ldd r23, Y+9 ; 0x09 f7b6: 8a 85 ldd r24, Y+10 ; 0x0a f7b8: 9b 85 ldd r25, Y+11 ; 0x0b f7ba: 42 e0 ldi r20, 0x02 ; 2 f7bc: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(current_position[Z_AXIS]); SERIAL_PROTOCOLPGM(" E:"); f7c0: 87 ec ldi r24, 0xC7 ; 199 f7c2: 97 e7 ldi r25, 0x77 ; 119 f7c4: 0e 94 c4 7a call 0xf588 ; 0xf588 f7c8: 6c 85 ldd r22, Y+12 ; 0x0c f7ca: 7d 85 ldd r23, Y+13 ; 0x0d f7cc: 8e 85 ldd r24, Y+14 ; 0x0e f7ce: 9f 85 ldd r25, Y+15 ; 0x0f f7d0: 42 e0 ldi r20, 0x02 ; 2 f7d2: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(current_position[E_AXIS]); SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X f7d6: 89 e1 ldi r24, 0x19 ; 25 f7d8: 94 e6 ldi r25, 0x64 ; 100 f7da: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / cs.axis_steps_per_mm[X_AXIS]); f7de: 80 e0 ldi r24, 0x00 ; 0 f7e0: 0f 94 d9 1a call 0x235b2 ; 0x235b2 f7e4: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f7e8: c7 e6 ldi r28, 0x67 ; 103 f7ea: dd e0 ldi r29, 0x0D ; 13 f7ec: 2c 81 ldd r18, Y+4 ; 0x04 f7ee: 3d 81 ldd r19, Y+5 ; 0x05 f7f0: 4e 81 ldd r20, Y+6 ; 0x06 f7f2: 5f 81 ldd r21, Y+7 ; 0x07 f7f4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> f7f8: 42 e0 ldi r20, 0x02 ; 2 f7fa: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" Y:"); f7fe: 83 ec ldi r24, 0xC3 ; 195 f800: 97 e7 ldi r25, 0x77 ; 119 f802: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_mm[Y_AXIS]); f806: 81 e0 ldi r24, 0x01 ; 1 f808: 0f 94 d9 1a call 0x235b2 ; 0x235b2 f80c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f810: 28 85 ldd r18, Y+8 ; 0x08 f812: 39 85 ldd r19, Y+9 ; 0x09 f814: 4a 85 ldd r20, Y+10 ; 0x0a f816: 5b 85 ldd r21, Y+11 ; 0x0b f818: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> f81c: 42 e0 ldi r20, 0x02 ; 2 f81e: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" Z:"); f822: 8f eb ldi r24, 0xBF ; 191 f824: 97 e7 ldi r25, 0x77 ; 119 f826: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_mm[Z_AXIS]); f82a: 82 e0 ldi r24, 0x02 ; 2 f82c: 0f 94 d9 1a call 0x235b2 ; 0x235b2 f830: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f834: 2c 85 ldd r18, Y+12 ; 0x0c f836: 3d 85 ldd r19, Y+13 ; 0x0d f838: 4e 85 ldd r20, Y+14 ; 0x0e f83a: 5f 85 ldd r21, Y+15 ; 0x0f f83c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> f840: 42 e0 ldi r20, 0x02 ; 2 f842: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" E:"); f846: 8b eb ldi r24, 0xBB ; 187 f848: 97 e7 ldi r25, 0x77 ; 119 f84a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_mm[E_AXIS]); f84e: 83 e0 ldi r24, 0x03 ; 3 f850: 0f 94 d9 1a call 0x235b2 ; 0x235b2 f854: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f858: 28 89 ldd r18, Y+16 ; 0x10 f85a: 39 89 ldd r19, Y+17 ; 0x11 f85c: 4a 89 ldd r20, Y+18 ; 0x12 f85e: 5b 89 ldd r21, Y+19 ; 0x13 f860: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> } f864: df 91 pop r29 f866: cf 91 pop r28 SERIAL_PROTOCOLPGM(" Y:"); SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_mm[Y_AXIS]); SERIAL_PROTOCOLPGM(" Z:"); SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_mm[Z_AXIS]); SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_mm[E_AXIS]); f868: 0d 94 a2 65 jmp 0x2cb44 ; 0x2cb44 0000f86c : #endif //TMC2130 void gcode_M105() { #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 SERIAL_PROTOCOLPGM("T:"); f86c: 8a ec ldi r24, 0xCA ; 202 f86e: 96 e7 ldi r25, 0x76 ; 118 f870: 0e 94 c4 7a call 0xf588 ; 0xf588 f874: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a f878: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b f87c: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c f880: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d f884: 41 e0 ldi r20, 0x01 ; 1 f886: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degHotend(active_extruder),1); SERIAL_PROTOCOLPGM(" /"); f88a: 87 ec ldi r24, 0xC7 ; 199 f88c: 96 e7 ldi r25, 0x76 ; 118 f88e: 0e 94 c4 7a call 0xf588 ; 0xf588 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; f892: 60 91 5d 12 lds r22, 0x125D ; 0x80125d f896: 70 91 5e 12 lds r23, 0x125E ; 0x80125e f89a: 07 2e mov r0, r23 f89c: 00 0c add r0, r0 f89e: 88 0b sbc r24, r24 f8a0: 99 0b sbc r25, r25 f8a2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f8a6: 41 e0 ldi r20, 0x01 ; 1 f8a8: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degTargetHotend(active_extruder),1); #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 SERIAL_PROTOCOLPGM(" B:"); f8ac: 83 ec ldi r24, 0xC3 ; 195 f8ae: 96 e7 ldi r25, 0x76 ; 118 f8b0: 0e 94 c4 7a call 0xf588 ; 0xf588 f8b4: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc f8b8: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd f8bc: 80 91 be 03 lds r24, 0x03BE ; 0x8003be f8c0: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf f8c4: 41 e0 ldi r20, 0x01 ; 1 f8c6: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degBed(),1); SERIAL_PROTOCOLPGM(" /"); f8ca: 80 ec ldi r24, 0xC0 ; 192 f8cc: 96 e7 ldi r25, 0x76 ; 118 f8ce: 0e 94 c4 7a call 0xf588 ; 0xf588 }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; f8d2: 60 91 59 12 lds r22, 0x1259 ; 0x801259 f8d6: 70 91 5a 12 lds r23, 0x125A ; 0x80125a f8da: 07 2e mov r0, r23 f8dc: 00 0c add r0, r0 f8de: 88 0b sbc r24, r24 f8e0: 99 0b sbc r25, r25 f8e2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f8e6: 41 e0 ldi r20, 0x01 ; 1 f8e8: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degTargetBed(),1); #endif //TEMP_BED_PIN SERIAL_PROTOCOLPGM(" T0:"); f8ec: 8b eb ldi r24, 0xBB ; 187 f8ee: 96 e7 ldi r25, 0x76 ; 118 f8f0: 0e 94 c4 7a call 0xf588 ; 0xf588 f8f4: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a f8f8: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b f8fc: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c f900: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d f904: 41 e0 ldi r20, 0x01 ; 1 f906: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degHotend(active_extruder),1); SERIAL_PROTOCOLPGM(" /"); f90a: 88 eb ldi r24, 0xB8 ; 184 f90c: 96 e7 ldi r25, 0x76 ; 118 f90e: 0e 94 c4 7a call 0xf588 ; 0xf588 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; f912: 60 91 5d 12 lds r22, 0x125D ; 0x80125d f916: 70 91 5e 12 lds r23, 0x125E ; 0x80125e f91a: 07 2e mov r0, r23 f91c: 00 0c add r0, r0 f91e: 88 0b sbc r24, r24 f920: 99 0b sbc r25, r25 f922: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> f926: 41 e0 ldi r20, 0x01 ; 1 f928: 0e 94 46 7a call 0xf48c ; 0xf48c #else SERIAL_ERROR_START; SERIAL_ERRORLNRPGM(_n("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS #endif SERIAL_PROTOCOLPGM(" @:"); f92c: 84 eb ldi r24, 0xB4 ; 180 f92e: 96 e7 ldi r25, 0x76 ; 118 f930: 0e 94 c4 7a call 0xf588 ; 0xf588 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); f934: 60 91 f5 05 lds r22, 0x05F5 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> f938: 70 e0 ldi r23, 0x00 ; 0 f93a: 90 e0 ldi r25, 0x00 ; 0 f93c: 80 e0 ldi r24, 0x00 ; 0 f93e: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLPGM("W"); #else SERIAL_PROTOCOL(getHeaterPower(active_extruder)); #endif SERIAL_PROTOCOLPGM(" B@:"); f942: 8f ea ldi r24, 0xAF ; 175 f944: 96 e7 ldi r25, 0x76 ; 118 f946: 0e 94 c4 7a call 0xf588 ; 0xf588 f94a: 60 91 ee 05 lds r22, 0x05EE ; 0x8005ee f94e: 70 e0 ldi r23, 0x00 ; 0 f950: 90 e0 ldi r25, 0x00 ; 0 f952: 80 e0 ldi r24, 0x00 ; 0 f954: 0e 94 2a 7a call 0xf454 ; 0xf454 #else SERIAL_PROTOCOL(getHeaterPower(-1)); #endif #ifdef PINDA_THERMISTOR SERIAL_PROTOCOLPGM(" P:"); f958: 8b ea ldi r24, 0xAB ; 171 f95a: 96 e7 ldi r25, 0x76 ; 118 f95c: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); f960: 60 91 85 03 lds r22, 0x0385 ; 0x800385 f964: 70 91 86 03 lds r23, 0x0386 ; 0x800386 f968: 80 91 87 03 lds r24, 0x0387 ; 0x800387 f96c: 90 91 88 03 lds r25, 0x0388 ; 0x800388 f970: 41 e0 ldi r20, 0x01 ; 1 f972: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); SERIAL_PROTOCOLPGM(" Rx0->"); SERIAL_PROTOCOL_F(raw, 5); } #endif SERIAL_PROTOCOLLN(); f976: 0c 94 bc 7a jmp 0xf578 ; 0xf578 0000f97a : ++str; } } void serialprintlnPGM(const char *str) { serialprintPGM(str); f97a: 0e 94 c4 7a call 0xf588 ; 0xf588 MYSERIAL.println(); f97e: 0c 94 bc 7a jmp 0xf578 ; 0xf578 0000f982 : /** * Output a "busy" message at regular intervals * while the machine is not accepting commands. */ void host_keepalive() { f982: 8f 92 push r8 f984: 9f 92 push r9 f986: af 92 push r10 f988: bf 92 push r11 f98a: cf 92 push r12 f98c: df 92 push r13 f98e: ef 92 push r14 f990: ff 92 push r15 #ifndef HOST_KEEPALIVE_FEATURE return; #endif //HOST_KEEPALIVE_FEATURE if (farm_mode) return; long ms = _millis(); f992: 0f 94 f0 0d call 0x21be0 ; 0x21be0 f996: 6b 01 movw r12, r22 f998: 7c 01 movw r14, r24 if (host_keepalive_interval && busy_state != NOT_BUSY) { f99a: 20 91 32 02 lds r18, 0x0232 ; 0x800232 f99e: 22 23 and r18, r18 f9a0: 09 f1 breq .+66 ; 0xf9e4 f9a2: 40 91 78 02 lds r20, 0x0278 ; 0x800278 f9a6: 41 30 cpi r20, 0x01 ; 1 f9a8: e9 f0 breq .+58 ; 0xf9e4 if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return; f9aa: 80 91 14 02 lds r24, 0x0214 ; 0x800214 f9ae: 90 91 15 02 lds r25, 0x0215 ; 0x800215 f9b2: a0 91 16 02 lds r26, 0x0216 ; 0x800216 f9b6: b0 91 17 02 lds r27, 0x0217 ; 0x800217 f9ba: 46 01 movw r8, r12 f9bc: 57 01 movw r10, r14 f9be: 88 1a sub r8, r24 f9c0: 99 0a sbc r9, r25 f9c2: aa 0a sbc r10, r26 f9c4: bb 0a sbc r11, r27 f9c6: 30 e0 ldi r19, 0x00 ; 0 f9c8: a8 ee ldi r26, 0xE8 ; 232 f9ca: b3 e0 ldi r27, 0x03 ; 3 f9cc: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> f9d0: 86 16 cp r8, r22 f9d2: 97 06 cpc r9, r23 f9d4: a8 06 cpc r10, r24 f9d6: b9 06 cpc r11, r25 f9d8: 6c f0 brlt .+26 ; 0xf9f4 switch (busy_state) { f9da: 44 30 cpi r20, 0x04 ; 4 f9dc: 31 f1 breq .+76 ; 0xfa2a f9de: 9c f4 brge .+38 ; 0xfa06 f9e0: 42 30 cpi r20, 0x02 ; 2 f9e2: d4 f4 brge .+52 ; 0xfa18 break; default: break; } } prev_busy_signal_ms = ms; f9e4: c0 92 14 02 sts 0x0214, r12 ; 0x800214 f9e8: d0 92 15 02 sts 0x0215, r13 ; 0x800215 f9ec: e0 92 16 02 sts 0x0216, r14 ; 0x800216 f9f0: f0 92 17 02 sts 0x0217, r15 ; 0x800217 } f9f4: ff 90 pop r15 f9f6: ef 90 pop r14 f9f8: df 90 pop r13 f9fa: cf 90 pop r12 f9fc: bf 90 pop r11 f9fe: af 90 pop r10 fa00: 9f 90 pop r9 fa02: 8f 90 pop r8 fa04: 08 95 ret if (farm_mode) return; long ms = _millis(); if (host_keepalive_interval && busy_state != NOT_BUSY) { if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return; switch (busy_state) { fa06: 45 30 cpi r20, 0x05 ; 5 fa08: 69 f7 brne .-38 ; 0xf9e4 case PAUSED_FOR_USER: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for user"); break; case PAUSED_FOR_INPUT: SERIAL_ECHO_START; fa0a: 8e ec ldi r24, 0xCE ; 206 fa0c: 91 ea ldi r25, 0xA1 ; 161 fa0e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("busy: paused for input"); fa12: 86 e9 ldi r24, 0x96 ; 150 fa14: 98 e7 ldi r25, 0x78 ; 120 fa16: 06 c0 rjmp .+12 ; 0xfa24 if (host_keepalive_interval && busy_state != NOT_BUSY) { if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return; switch (busy_state) { case IN_HANDLER: case IN_PROCESS: SERIAL_ECHO_START; fa18: 8e ec ldi r24, 0xCE ; 206 fa1a: 91 ea ldi r25, 0xA1 ; 161 fa1c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("busy: processing"); fa20: 83 ec ldi r24, 0xC3 ; 195 fa22: 98 e7 ldi r25, 0x78 ; 120 SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for user"); break; case PAUSED_FOR_INPUT: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for input"); fa24: 0e 94 bd 7c call 0xf97a ; 0xf97a fa28: dd cf rjmp .-70 ; 0xf9e4 case IN_PROCESS: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: processing"); break; case PAUSED_FOR_USER: SERIAL_ECHO_START; fa2a: 8e ec ldi r24, 0xCE ; 206 fa2c: 91 ea ldi r25, 0xA1 ; 161 fa2e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("busy: paused for user"); fa32: 8d ea ldi r24, 0xAD ; 173 fa34: 98 e7 ldi r25, 0x78 ; 120 fa36: f6 cf rjmp .-20 ; 0xfa24 0000fa38 : #endif //TEMP_RESIDENCY_TIME } } void check_babystep() { fa38: cf 93 push r28 int babystep_z = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); fa3a: 81 ea ldi r24, 0xA1 ; 161 fa3c: 9d e0 ldi r25, 0x0D ; 13 fa3e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 } } void check_babystep() { int babystep_z = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> fa42: cb e0 ldi r28, 0x0B ; 11 fa44: 8c 9f mul r24, r28 fa46: c0 01 movw r24, r0 fa48: 11 24 eor r1, r1 fa4a: 80 5b subi r24, 0xB0 ; 176 fa4c: 92 4f sbci r25, 0xF2 ; 242 fa4e: 0f 94 ee a3 call 0x347dc ; 0x347dc s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); if ((babystep_z < Z_BABYSTEP_MIN) || (babystep_z > Z_BABYSTEP_MAX)) { fa52: 81 56 subi r24, 0x61 ; 97 fa54: 90 4f sbci r25, 0xF0 ; 240 fa56: 80 3a cpi r24, 0xA0 ; 160 fa58: 9f 40 sbci r25, 0x0F ; 15 fa5a: c8 f0 brcs .+50 ; 0xfa8e babystep_z = 0; //if babystep value is out of min max range, set it to 0 SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0"); fa5c: 82 e6 ldi r24, 0x62 ; 98 fa5e: 98 e7 ldi r25, 0x78 ; 120 fa60: 0e 94 bd 7c call 0xf97a ; 0xf97a eeprom_write_word_notify(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), fa64: 81 ea ldi r24, 0xA1 ; 161 fa66: 9d e0 ldi r25, 0x0D ; 13 fa68: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); if ((babystep_z < Z_BABYSTEP_MIN) || (babystep_z > Z_BABYSTEP_MAX)) { babystep_z = 0; //if babystep value is out of min max range, set it to 0 SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0"); eeprom_write_word_notify(reinterpret_cast(&(EEPROM_Sheets_base-> fa6c: 8c 9f mul r24, r28 fa6e: c0 01 movw r24, r0 fa70: 11 24 eor r1, r1 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); fa72: 70 e0 ldi r23, 0x00 ; 0 fa74: 60 e0 ldi r22, 0x00 ; 0 fa76: 80 5b subi r24, 0xB0 ; 176 fa78: 92 4f sbci r25, 0xF2 ; 242 fa7a: 0f 94 3e a4 call 0x3487c ; 0x3487c s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), babystep_z); lcd_show_fullscreen_message_and_wait_P(PSTR("Z live adjust out of range. Setting to 0. Click to continue.")); fa7e: 85 e2 ldi r24, 0x25 ; 37 fa80: 98 e7 ldi r25, 0x78 ; 120 fa82: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_update_enable(true); fa86: 81 e0 ldi r24, 0x01 ; 1 } } fa88: cf 91 pop r28 SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0"); eeprom_write_word_notify(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), babystep_z); lcd_show_fullscreen_message_and_wait_P(PSTR("Z live adjust out of range. Setting to 0. Click to continue.")); lcd_update_enable(true); fa8a: 0c 94 38 70 jmp 0xe070 ; 0xe070 } } fa8e: cf 91 pop r28 fa90: 08 95 ret 0000fa92 : } // G80 - Automatic mesh bed leveling static void gcode_G80() { fa92: 2f 92 push r2 fa94: 3f 92 push r3 fa96: 4f 92 push r4 fa98: 5f 92 push r5 fa9a: 6f 92 push r6 fa9c: 7f 92 push r7 fa9e: 8f 92 push r8 faa0: 9f 92 push r9 faa2: af 92 push r10 faa4: bf 92 push r11 faa6: cf 92 push r12 faa8: df 92 push r13 faaa: ef 92 push r14 faac: ff 92 push r15 faae: 0f 93 push r16 fab0: 1f 93 push r17 fab2: cf 93 push r28 fab4: df 93 push r29 fab6: cd b7 in r28, 0x3d ; 61 fab8: de b7 in r29, 0x3e ; 62 faba: a4 97 sbiw r28, 0x24 ; 36 fabc: 0f b6 in r0, 0x3f ; 63 fabe: f8 94 cli fac0: de bf out 0x3e, r29 ; 62 fac2: 0f be out 0x3f, r0 ; 63 fac4: cd bf out 0x3d, r28 ; 61 constexpr float XY_AXIS_FEEDRATE = (homing_feedrate[X_AXIS] * 3) / 60; constexpr float Z_LIFT_FEEDRATE = homing_feedrate[Z_AXIS] / 60; constexpr float Z_CALIBRATION_THRESHOLD_TIGHT = 0.6f; // used for 7x7 MBL constexpr float Z_CALIBRATION_THRESHOLD_RELAXED = 1.f; // used for 3x3 MBL constexpr float MESH_HOME_Z_SEARCH_FAST = 0.35f; st_synchronize(); fac6: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (planner_aborted) faca: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 face: 81 11 cpse r24, r1 fad0: 17 c0 rjmp .+46 ; 0xfb00 return; mesh_bed_leveling_flag = true; fad2: 81 e0 ldi r24, 0x01 ; 1 fad4: 80 93 72 12 sts 0x1272, r24 ; 0x801272 // Firstly check if we know where we are if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) { fad8: 80 91 39 06 lds r24, 0x0639 ; 0x800639 fadc: 88 23 and r24, r24 fade: 49 f0 breq .+18 ; 0xfaf2 fae0: 80 91 3a 06 lds r24, 0x063A ; 0x80063a fae4: 88 23 and r24, r24 fae6: 29 f0 breq .+10 ; 0xfaf2 fae8: 20 91 3b 06 lds r18, 0x063B ; 0x80063b faec: 2f 83 std Y+7, r18 ; 0x07 faee: 21 11 cpse r18, r1 faf0: 20 c0 rjmp .+64 ; 0xfb32 // Mark the command at the top of the command queue as new. // Therefore it will not be removed from the queue. void repeatcommand_front() { cmdbuffer_front_already_processed = true; faf2: 81 e0 ldi r24, 0x01 ; 1 faf4: 80 93 53 12 sts 0x1253, r24 ; 0x801253 // We don't know where we are! HOME! // Push the commands to the front of the message queue in the reverse order! // There shall be always enough space reserved for these commands. repeatcommand_front(); // repeat G80 with all its parameters enquecommand_front_P(G28W); faf8: 81 ed ldi r24, 0xD1 ; 209 fafa: 98 e6 ldi r25, 0x68 ; 104 fafc: 0f 94 78 67 call 0x2cef0 ; 0x2cef0 custom_message_state = custom_message_state_old; lcd_update(2); st_synchronize(); mesh_bed_leveling_flag = false; } fb00: a4 96 adiw r28, 0x24 ; 36 fb02: 0f b6 in r0, 0x3f ; 63 fb04: f8 94 cli fb06: de bf out 0x3e, r29 ; 62 fb08: 0f be out 0x3f, r0 ; 63 fb0a: cd bf out 0x3d, r28 ; 61 fb0c: df 91 pop r29 fb0e: cf 91 pop r28 fb10: 1f 91 pop r17 fb12: 0f 91 pop r16 fb14: ff 90 pop r15 fb16: ef 90 pop r14 fb18: df 90 pop r13 fb1a: cf 90 pop r12 fb1c: bf 90 pop r11 fb1e: af 90 pop r10 fb20: 9f 90 pop r9 fb22: 8f 90 pop r8 fb24: 7f 90 pop r7 fb26: 6f 90 pop r6 fb28: 5f 90 pop r5 fb2a: 4f 90 pop r4 fb2c: 3f 90 pop r3 fb2e: 2f 90 pop r2 fb30: 08 95 ret return; } run = false; #endif //PINDA_THERMISTOR uint8_t nMeasPoints = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); fb32: 8b ea ldi r24, 0xAB ; 171 fb34: 9d e0 ldi r25, 0x0D ; 13 fb36: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 fb3a: 18 2f mov r17, r24 if (uint8_t codeSeen = code_seen('N'), value = code_value_uint8(); codeSeen && (value == 7 || value == 3)) fb3c: 8e e4 ldi r24, 0x4E ; 78 fb3e: 0e 94 f5 55 call 0xabea ; 0xabea fb42: 08 2f mov r16, r24 fb44: 0e 94 0a 56 call 0xac14 ; 0xac14 fb48: 8e 83 std Y+6, r24 ; 0x06 fb4a: 00 23 and r16, r16 fb4c: 29 f0 breq .+10 ; 0xfb58 fb4e: 87 30 cpi r24, 0x07 ; 7 fb50: 09 f4 brne .+2 ; 0xfb54 fb52: c9 c0 rjmp .+402 ; 0xfce6 fb54: 83 30 cpi r24, 0x03 ; 3 fb56: 29 f0 breq .+10 ; 0xfb62 nMeasPoints = value; // 7x7 region MBL needs tighter thresholds for triggering a Z realignment. This is because you want to have as little of a misalignment as possible between // the "inner" MBL region and "outer" MBL region which is interpolated from Z calibration values. const float Z_CALIBRATION_THRESHOLD = (nMeasPoints == 3) ? Z_CALIBRATION_THRESHOLD_RELAXED : Z_CALIBRATION_THRESHOLD_TIGHT; fb58: 13 30 cpi r17, 0x03 ; 3 fb5a: 09 f0 breq .+2 ; 0xfb5e fb5c: c3 c0 rjmp .+390 ; 0xfce4 fb5e: 63 e0 ldi r22, 0x03 ; 3 fb60: 6e 83 std Y+6, r22 ; 0x06 fb62: 80 e0 ldi r24, 0x00 ; 0 fb64: 90 e0 ldi r25, 0x00 ; 0 fb66: a0 e8 ldi r26, 0x80 ; 128 fb68: bf e3 ldi r27, 0x3F ; 63 fb6a: 8a 83 std Y+2, r24 ; 0x02 fb6c: 9b 83 std Y+3, r25 ; 0x03 fb6e: ac 83 std Y+4, r26 ; 0x04 fb70: bd 83 std Y+5, r27 ; 0x05 uint8_t nProbeRetryCount = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); fb72: 8a ea ldi r24, 0xAA ; 170 fb74: 9d e0 ldi r25, 0x0D ; 13 fb76: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 fb7a: 88 8f std Y+24, r24 ; 0x18 if (uint8_t codeSeen = code_seen('C'), value = code_value_uint8(); codeSeen && value >= 1 && value <= 10) fb7c: 83 e4 ldi r24, 0x43 ; 67 fb7e: 0e 94 f5 55 call 0xabea ; 0xabea fb82: 18 2f mov r17, r24 fb84: 0e 94 0a 56 call 0xac14 ; 0xac14 fb88: 11 23 and r17, r17 fb8a: 29 f0 breq .+10 ; 0xfb96 fb8c: 88 23 and r24, r24 fb8e: 19 f0 breq .+6 ; 0xfb96 fb90: 8b 30 cpi r24, 0x0B ; 11 fb92: 08 f4 brcc .+2 ; 0xfb96 fb94: 88 8f std Y+24, r24 ; 0x18 nProbeRetryCount = value; const float area_min_x = code_seen('X') ? code_value() - x_mesh_density - X_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY; fb96: 88 e5 ldi r24, 0x58 ; 88 fb98: 0e 94 f5 55 call 0xabea ; 0xabea fb9c: 88 23 and r24, r24 fb9e: 09 f4 brne .+2 ; 0xfba2 fba0: ab c0 rjmp .+342 ; 0xfcf8 fba2: 0e 94 85 5a call 0xb50a ; 0xb50a fba6: 20 e0 ldi r18, 0x00 ; 0 fba8: 30 e0 ldi r19, 0x00 ; 0 fbaa: 48 e0 ldi r20, 0x08 ; 8 fbac: 52 e4 ldi r21, 0x42 ; 66 fbae: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> fbb2: 20 e0 ldi r18, 0x00 ; 0 fbb4: 30 e0 ldi r19, 0x00 ; 0 fbb6: 48 eb ldi r20, 0xB8 ; 184 fbb8: 51 e4 ldi r21, 0x41 ; 65 fbba: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> fbbe: 6a 87 std Y+10, r22 ; 0x0a fbc0: 7b 87 std Y+11, r23 ; 0x0b fbc2: 8c 87 std Y+12, r24 ; 0x0c fbc4: 9d 87 std Y+13, r25 ; 0x0d const float area_min_y = code_seen('Y') ? code_value() - y_mesh_density - Y_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY; fbc6: 89 e5 ldi r24, 0x59 ; 89 fbc8: 0e 94 f5 55 call 0xabea ; 0xabea fbcc: 88 23 and r24, r24 fbce: 09 f4 brne .+2 ; 0xfbd2 fbd0: 9c c0 rjmp .+312 ; 0xfd0a fbd2: 0e 94 85 5a call 0xb50a ; 0xb50a fbd6: 20 e0 ldi r18, 0x00 ; 0 fbd8: 30 e0 ldi r19, 0x00 ; 0 fbda: 48 e0 ldi r20, 0x08 ; 8 fbdc: 52 e4 ldi r21, 0x42 ; 66 fbde: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> fbe2: 20 e0 ldi r18, 0x00 ; 0 fbe4: 30 e0 ldi r19, 0x00 ; 0 fbe6: 40 ea ldi r20, 0xA0 ; 160 fbe8: 50 e4 ldi r21, 0x40 ; 64 fbea: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> fbee: 6c 8b std Y+20, r22 ; 0x14 fbf0: 7d 8b std Y+21, r23 ; 0x15 fbf2: 8e 8b std Y+22, r24 ; 0x16 fbf4: 9f 8b std Y+23, r25 ; 0x17 const float area_max_x = code_seen('W') ? area_min_x + code_value() + 2 * x_mesh_density : INFINITY; fbf6: 87 e5 ldi r24, 0x57 ; 87 fbf8: 0e 94 f5 55 call 0xabea ; 0xabea fbfc: 88 23 and r24, r24 fbfe: 09 f4 brne .+2 ; 0xfc02 fc00: 89 c0 rjmp .+274 ; 0xfd14 fc02: 0e 94 85 5a call 0xb50a ; 0xb50a fc06: 2a 85 ldd r18, Y+10 ; 0x0a fc08: 3b 85 ldd r19, Y+11 ; 0x0b fc0a: 4c 85 ldd r20, Y+12 ; 0x0c fc0c: 5d 85 ldd r21, Y+13 ; 0x0d fc0e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> fc12: 20 e0 ldi r18, 0x00 ; 0 fc14: 30 e0 ldi r19, 0x00 ; 0 fc16: 48 e8 ldi r20, 0x88 ; 136 fc18: 52 e4 ldi r21, 0x42 ; 66 fc1a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> fc1e: 69 8f std Y+25, r22 ; 0x19 fc20: 7a 8f std Y+26, r23 ; 0x1a fc22: 8b 8f std Y+27, r24 ; 0x1b fc24: 9c 8f std Y+28, r25 ; 0x1c const float area_max_y = code_seen('H') ? area_min_y + code_value() + 2 * y_mesh_density : INFINITY; fc26: 88 e4 ldi r24, 0x48 ; 72 fc28: 0e 94 f5 55 call 0xabea ; 0xabea fc2c: 88 23 and r24, r24 fc2e: 09 f4 brne .+2 ; 0xfc32 fc30: 7a c0 rjmp .+244 ; 0xfd26 fc32: 0e 94 85 5a call 0xb50a ; 0xb50a fc36: 2c 89 ldd r18, Y+20 ; 0x14 fc38: 3d 89 ldd r19, Y+21 ; 0x15 fc3a: 4e 89 ldd r20, Y+22 ; 0x16 fc3c: 5f 89 ldd r21, Y+23 ; 0x17 fc3e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> fc42: 20 e0 ldi r18, 0x00 ; 0 fc44: 30 e0 ldi r19, 0x00 ; 0 fc46: 48 e8 ldi r20, 0x88 ; 136 fc48: 52 e4 ldi r21, 0x42 ; 66 fc4a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> fc4e: 6d 8f std Y+29, r22 ; 0x1d fc50: 7e 8f std Y+30, r23 ; 0x1e fc52: 8f 8f std Y+31, r24 ; 0x1f fc54: 98 a3 std Y+32, r25 ; 0x20 mbl.reset(); //reset mesh bed leveling fc56: 0f 94 e3 7b call 0x2f7c6 ; 0x2f7c6 mbl.z_values[0][0] = min_pos[Z_AXIS]; fc5a: 80 91 2c 02 lds r24, 0x022C ; 0x80022c fc5e: 90 91 2d 02 lds r25, 0x022D ; 0x80022d fc62: a0 91 2e 02 lds r26, 0x022E ; 0x80022e fc66: b0 91 2f 02 lds r27, 0x022F ; 0x80022f fc6a: 80 93 0a 13 sts 0x130A, r24 ; 0x80130a fc6e: 90 93 0b 13 sts 0x130B, r25 ; 0x80130b fc72: a0 93 0c 13 sts 0x130C, r26 ; 0x80130c fc76: b0 93 0d 13 sts 0x130D, r27 ; 0x80130d // Reset baby stepping to zero, if the babystepping has already been loaded before. babystep_undo(); fc7a: 0f 94 aa 54 call 0x2a954 ; 0x2a954 fc7e: 05 ec ldi r16, 0xC5 ; 197 fc80: 1f e0 ldi r17, 0x0F ; 15 bool is_bed_z_jitter_data_valid() // offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns // if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false { for (int8_t i = 0; i < 8; ++i) { if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF) fc82: c8 01 movw r24, r16 fc84: 0f 94 ee a3 call 0x347dc ; 0x347dc fc88: 01 96 adiw r24, 0x01 ; 1 fc8a: 09 f0 breq .+2 ; 0xfc8e fc8c: 51 c0 rjmp .+162 ; 0xfd30 fc8e: 0e 5f subi r16, 0xFE ; 254 fc90: 1f 4f sbci r17, 0xFF ; 255 bool is_bed_z_jitter_data_valid() // offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns // if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false { for (int8_t i = 0; i < 8; ++i) { fc92: 05 3d cpi r16, 0xD5 ; 213 fc94: 8f e0 ldi r24, 0x0F ; 15 fc96: 18 07 cpc r17, r24 fc98: a1 f7 brne .-24 ; 0xfc82 if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF) return true; } return false; fc9a: 21 2c mov r2, r1 fc9c: a9 e0 ldi r26, 0x09 ; 9 fc9e: b3 e1 ldi r27, 0x13 ; 19 fca0: ba a3 std Y+34, r27 ; 0x22 fca2: a9 a3 std Y+33, r26 ; 0x21 // offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns // if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false { for (int8_t i = 0; i < 8; ++i) { if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF) return true; fca4: b9 87 std Y+9, r27 ; 0x09 fca6: a8 87 std Y+8, r26 ; 0x08 fca8: 51 2c mov r5, r1 fcaa: 41 2c mov r4, r1 // Initialize the default mesh from eeprom and calculate how many points are to be probed bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point) uint8_t meshPointsToProbe = 0; fcac: 31 2c mov r3, r1 fcae: 04 2d mov r16, r4 for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0)); fcb0: 84 2d mov r24, r4 fcb2: 63 e0 ldi r22, 0x03 ; 3 fcb4: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> fcb8: 98 8b std Y+16, r25 ; 0x10 fcba: 68 84 ldd r6, Y+8 ; 0x08 fcbc: 79 84 ldd r7, Y+9 ; 0x09 // Initialize the default mesh from eeprom and calculate how many points are to be probed bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point) uint8_t meshPointsToProbe = 0; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { fcbe: 10 e0 ldi r17, 0x00 ; 0 bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0)); fcc0: f8 89 ldd r31, Y+16 ; 0x10 fcc2: f1 11 cpse r31, r1 fcc4: 37 c0 rjmp .+110 ; 0xfd34 fcc6: 81 2f mov r24, r17 fcc8: 63 e0 ldi r22, 0x03 ; 3 fcca: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> fcce: 91 11 cpse r25, r1 fcd0: 31 c0 rjmp .+98 ; 0xfd34 if (isOn3x3Mesh) { if (has_z && (row || col)) { fcd2: 21 10 cpse r2, r1 fcd4: 3f c1 rjmp .+638 ; 0xff54 } else { mbl.set_z(col, row, NAN); } // check for points that are skipped if (nMeasPoints == 3) { fcd6: 7e 81 ldd r23, Y+6 ; 0x06 fcd8: 73 30 cpi r23, 0x03 ; 3 fcda: 09 f4 brne .+2 ; 0xfcde fcdc: 70 c0 rjmp .+224 ; 0xfdbe fcde: 8f 81 ldd r24, Y+7 ; 0x07 fce0: 8e 87 std Y+14, r24 ; 0x0e fce2: 37 c0 rjmp .+110 ; 0xfd52 if (uint8_t codeSeen = code_seen('N'), value = code_value_uint8(); codeSeen && (value == 7 || value == 3)) nMeasPoints = value; // 7x7 region MBL needs tighter thresholds for triggering a Z realignment. This is because you want to have as little of a misalignment as possible between // the "inner" MBL region and "outer" MBL region which is interpolated from Z calibration values. const float Z_CALIBRATION_THRESHOLD = (nMeasPoints == 3) ? Z_CALIBRATION_THRESHOLD_RELAXED : Z_CALIBRATION_THRESHOLD_TIGHT; fce4: 1e 83 std Y+6, r17 ; 0x06 fce6: 6a e9 ldi r22, 0x9A ; 154 fce8: 79 e9 ldi r23, 0x99 ; 153 fcea: 89 e1 ldi r24, 0x19 ; 25 fcec: 9f e3 ldi r25, 0x3F ; 63 fcee: 6a 83 std Y+2, r22 ; 0x02 fcf0: 7b 83 std Y+3, r23 ; 0x03 fcf2: 8c 83 std Y+4, r24 ; 0x04 fcf4: 9d 83 std Y+5, r25 ; 0x05 fcf6: 3d cf rjmp .-390 ; 0xfb72 uint8_t nProbeRetryCount = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); if (uint8_t codeSeen = code_seen('C'), value = code_value_uint8(); codeSeen && value >= 1 && value <= 10) nProbeRetryCount = value; const float area_min_x = code_seen('X') ? code_value() - x_mesh_density - X_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY; fcf8: 80 e0 ldi r24, 0x00 ; 0 fcfa: 90 e0 ldi r25, 0x00 ; 0 fcfc: a0 e8 ldi r26, 0x80 ; 128 fcfe: bf ef ldi r27, 0xFF ; 255 fd00: 8a 87 std Y+10, r24 ; 0x0a fd02: 9b 87 std Y+11, r25 ; 0x0b fd04: ac 87 std Y+12, r26 ; 0x0c fd06: bd 87 std Y+13, r27 ; 0x0d fd08: 5e cf rjmp .-324 ; 0xfbc6 const float area_min_y = code_seen('Y') ? code_value() - y_mesh_density - Y_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY; fd0a: 60 e0 ldi r22, 0x00 ; 0 fd0c: 70 e0 ldi r23, 0x00 ; 0 fd0e: 80 e8 ldi r24, 0x80 ; 128 fd10: 9f ef ldi r25, 0xFF ; 255 fd12: 6d cf rjmp .-294 ; 0xfbee const float area_max_x = code_seen('W') ? area_min_x + code_value() + 2 * x_mesh_density : INFINITY; fd14: 80 e0 ldi r24, 0x00 ; 0 fd16: 90 e0 ldi r25, 0x00 ; 0 fd18: a0 e8 ldi r26, 0x80 ; 128 fd1a: bf e7 ldi r27, 0x7F ; 127 fd1c: 89 8f std Y+25, r24 ; 0x19 fd1e: 9a 8f std Y+26, r25 ; 0x1a fd20: ab 8f std Y+27, r26 ; 0x1b fd22: bc 8f std Y+28, r27 ; 0x1c fd24: 80 cf rjmp .-256 ; 0xfc26 const float area_max_y = code_seen('H') ? area_min_y + code_value() + 2 * y_mesh_density : INFINITY; fd26: 60 e0 ldi r22, 0x00 ; 0 fd28: 70 e0 ldi r23, 0x00 ; 0 fd2a: 80 e8 ldi r24, 0x80 ; 128 fd2c: 9f e7 ldi r25, 0x7F ; 127 fd2e: 8f cf rjmp .-226 ; 0xfc4e fd30: 2f 80 ldd r2, Y+7 ; 0x07 fd32: b4 cf rjmp .-152 ; 0xfc9c void reset(); static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; } static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; } float get_z(float x, float y); void set_z(uint8_t ix, uint8_t iy, float z) { z_values[iy][ix] = z; } fd34: 60 e0 ldi r22, 0x00 ; 0 fd36: 70 e0 ldi r23, 0x00 ; 0 fd38: 80 ec ldi r24, 0xC0 ; 192 fd3a: 9f e7 ldi r25, 0x7F ; 127 fd3c: d3 01 movw r26, r6 fd3e: 11 96 adiw r26, 0x01 ; 1 fd40: 6d 93 st X+, r22 fd42: 7d 93 st X+, r23 fd44: 8d 93 st X+, r24 fd46: 9c 93 st X, r25 fd48: 14 97 sbiw r26, 0x04 ; 4 } else { mbl.set_z(col, row, NAN); } // check for points that are skipped if (nMeasPoints == 3) { fd4a: be 81 ldd r27, Y+6 ; 0x06 fd4c: b3 30 cpi r27, 0x03 ; 3 fd4e: c1 f1 breq .+112 ; 0xfdc0 fd50: 1e 86 std Y+14, r1 ; 0x0e if (!isOn3x3Mesh) continue; } else { const float x_pos = BED_X(col); fd52: 81 2f mov r24, r17 fd54: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 fd58: 4b 01 movw r8, r22 fd5a: 5c 01 movw r10, r24 const float y_pos = BED_Y(row); fd5c: 80 2f mov r24, r16 fd5e: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 fd62: 6b 01 movw r12, r22 fd64: 7c 01 movw r14, r24 if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) { fd66: a5 01 movw r20, r10 fd68: 94 01 movw r18, r8 fd6a: 6a 85 ldd r22, Y+10 ; 0x0a fd6c: 7b 85 ldd r23, Y+11 ; 0x0b fd6e: 8c 85 ldd r24, Y+12 ; 0x0c fd70: 9d 85 ldd r25, Y+13 ; 0x0d fd72: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> fd76: 18 16 cp r1, r24 fd78: 0c f4 brge .+2 ; 0xfd7c fd7a: 1c c1 rjmp .+568 ; 0xffb4 fd7c: 29 8d ldd r18, Y+25 ; 0x19 fd7e: 3a 8d ldd r19, Y+26 ; 0x1a fd80: 4b 8d ldd r20, Y+27 ; 0x1b fd82: 5c 8d ldd r21, Y+28 ; 0x1c fd84: c5 01 movw r24, r10 fd86: b4 01 movw r22, r8 fd88: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> fd8c: 18 16 cp r1, r24 fd8e: 0c f4 brge .+2 ; 0xfd92 fd90: 11 c1 rjmp .+546 ; 0xffb4 fd92: a7 01 movw r20, r14 fd94: 96 01 movw r18, r12 fd96: 6c 89 ldd r22, Y+20 ; 0x14 fd98: 7d 89 ldd r23, Y+21 ; 0x15 fd9a: 8e 89 ldd r24, Y+22 ; 0x16 fd9c: 9f 89 ldd r25, Y+23 ; 0x17 fd9e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> fda2: 18 16 cp r1, r24 fda4: 0c f4 brge .+2 ; 0xfda8 fda6: 06 c1 rjmp .+524 ; 0xffb4 fda8: 2d 8d ldd r18, Y+29 ; 0x1d fdaa: 3e 8d ldd r19, Y+30 ; 0x1e fdac: 4f 8d ldd r20, Y+31 ; 0x1f fdae: 58 a1 ldd r21, Y+32 ; 0x20 fdb0: c7 01 movw r24, r14 fdb2: b6 01 movw r22, r12 fdb4: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> fdb8: 18 16 cp r1, r24 fdba: 0c f4 brge .+2 ; 0xfdbe fdbc: fb c0 rjmp .+502 ; 0xffb4 continue; } } // increment the total point counter if the points are not skipped meshPointsToProbe++; fdbe: 33 94 inc r3 // Initialize the default mesh from eeprom and calculate how many points are to be probed bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point) uint8_t meshPointsToProbe = 0; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { fdc0: 1f 5f subi r17, 0xFF ; 255 fdc2: 24 e0 ldi r18, 0x04 ; 4 fdc4: 62 0e add r6, r18 fdc6: 71 1c adc r7, r1 fdc8: 17 30 cpi r17, 0x07 ; 7 fdca: 09 f0 breq .+2 ; 0xfdce fdcc: 79 cf rjmp .-270 ; 0xfcc0 fdce: 6f ef ldi r22, 0xFF ; 255 fdd0: 46 1a sub r4, r22 fdd2: 56 0a sbc r5, r22 fdd4: 88 85 ldd r24, Y+8 ; 0x08 fdd6: 99 85 ldd r25, Y+9 ; 0x09 fdd8: 4c 96 adiw r24, 0x1c ; 28 fdda: 99 87 std Y+9, r25 ; 0x09 fddc: 88 87 std Y+8, r24 ; 0x08 babystep_undo(); // Initialize the default mesh from eeprom and calculate how many points are to be probed bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point) uint8_t meshPointsToProbe = 0; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { fdde: 97 e0 ldi r25, 0x07 ; 7 fde0: 49 16 cp r4, r25 fde2: 51 04 cpc r5, r1 fde4: 09 f0 breq .+2 ; 0xfde8 fde6: 63 cf rjmp .-314 ; 0xfcae // increment the total point counter if the points are not skipped meshPointsToProbe++; } } mbl.upsample_3x3(); //upsample the default mesh fde8: 0f 94 bd 92 call 0x3257a ; 0x3257a // Save custom message state, set a new custom message state to display: Calibrating point 9. CustomMsg custom_message_type_old = custom_message_type; fdec: a0 91 5d 06 lds r26, 0x065D ; 0x80065d fdf0: af 83 std Y+7, r26 ; 0x07 uint8_t custom_message_state_old = custom_message_state; fdf2: b0 91 de 03 lds r27, 0x03DE ; 0x8003de fdf6: b8 87 std Y+8, r27 ; 0x08 custom_message_type = CustomMsg::MeshBedLeveling; fdf8: 81 e0 ldi r24, 0x01 ; 1 fdfa: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d custom_message_state = meshPointsToProbe + 10; fdfe: 8a e0 ldi r24, 0x0A ; 10 fe00: 83 0d add r24, r3 fe02: 80 93 de 03 sts 0x03DE, r24 ; 0x8003de lcd_update(1); fe06: 81 e0 ldi r24, 0x01 ; 1 fe08: 0e 94 f9 6e call 0xddf2 ; 0xddf2 // Lift Z to a safe position before probing the first point current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; fe0c: 80 e0 ldi r24, 0x00 ; 0 fe0e: 90 e0 ldi r25, 0x00 ; 0 fe10: a0 ea ldi r26, 0xA0 ; 160 fe12: b0 e4 ldi r27, 0x40 ; 64 fe14: 80 93 69 12 sts 0x1269, r24 ; 0x801269 fe18: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a fe1c: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b fe20: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); fe24: 65 e5 ldi r22, 0x55 ; 85 fe26: 75 e5 ldi r23, 0x55 ; 85 fe28: 85 e5 ldi r24, 0x55 ; 85 fe2a: 91 e4 ldi r25, 0x41 ; 65 fe2c: 0f 94 81 4c call 0x29902 ; 0x29902 // Cycle through all points and probe them int l_feedmultiply = setup_for_endstop_move(false); //save feedrate and feedmultiply, sets feedmultiply to 100 fe30: 80 e0 ldi r24, 0x00 ; 0 fe32: 0e 94 66 65 call 0xcacc ; 0xcacc fe36: 9c a3 std Y+36, r25 ; 0x24 fe38: 8b a3 std Y+35, r24 ; 0x23 fe3a: 31 2c mov r3, r1 uint8_t mesh_point = 0; //index number of calibration point while (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { // Get coords of a measuring point. uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1 fe3c: 83 2d mov r24, r3 fe3e: 67 e0 ldi r22, 0x07 ; 7 fe40: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> fe44: f8 2e mov r15, r24 fe46: 09 2f mov r16, r25 uint8_t iy = mesh_point / MESH_NUM_X_POINTS; if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag fe48: 68 2f mov r22, r24 fe4a: 70 e0 ldi r23, 0x00 ; 0 fe4c: 7f 87 std Y+15, r23 ; 0x0f fe4e: 6e 87 std Y+14, r22 ; 0x0e fe50: 80 ff sbrs r24, 0 fe52: 03 c0 rjmp .+6 ; 0xfe5a fe54: 76 e0 ldi r23, 0x06 ; 6 fe56: 79 1b sub r23, r25 fe58: 07 2f mov r16, r23 bool isOn3x3Mesh = ((ix % 3 == 0) && (iy % 3 == 0)); fe5a: 80 2f mov r24, r16 fe5c: 63 e0 ldi r22, 0x03 ; 3 fe5e: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> fe62: 91 11 cpse r25, r1 fe64: 05 c0 rjmp .+10 ; 0xfe70 fe66: 8f 2d mov r24, r15 fe68: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> fe6c: 11 e0 ldi r17, 0x01 ; 1 fe6e: 91 11 cpse r25, r1 fe70: 10 e0 ldi r17, 0x00 ; 0 float x_pos = BED_X(ix); fe72: 80 2f mov r24, r16 fe74: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 fe78: 68 8b std Y+16, r22 ; 0x10 fe7a: 79 8b std Y+17, r23 ; 0x11 fe7c: 8a 8b std Y+18, r24 ; 0x12 fe7e: 9b 8b std Y+19, r25 ; 0x13 float y_pos = BED_Y(iy); fe80: 8f 2d mov r24, r15 fe82: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 fe86: 4b 01 movw r8, r22 fe88: 5c 01 movw r10, r24 if (nMeasPoints == 3) { fe8a: 8e 81 ldd r24, Y+6 ; 0x06 fe8c: 83 30 cpi r24, 0x03 ; 3 fe8e: 09 f0 breq .+2 ; 0xfe92 fe90: 99 c0 rjmp .+306 ; 0xffc4 if (!isOn3x3Mesh) { fe92: 11 11 cpse r17, r1 fe94: c8 c0 rjmp .+400 ; 0x10026 fe96: 27 e0 ldi r18, 0x07 ; 7 fe98: ae 85 ldd r26, Y+14 ; 0x0e fe9a: bf 85 ldd r27, Y+15 ; 0x0f fe9c: 2a 9f mul r18, r26 fe9e: f0 01 movw r30, r0 fea0: 2b 9f mul r18, r27 fea2: f0 0d add r31, r0 fea4: 11 24 eor r1, r1 fea6: e0 0f add r30, r16 fea8: f1 1d adc r31, r1 feaa: ee 0f add r30, r30 feac: ff 1f adc r31, r31 feae: ee 0f add r30, r30 feb0: ff 1f adc r31, r31 feb2: e7 5f subi r30, 0xF7 ; 247 feb4: fc 4e sbci r31, 0xEC ; 236 feb6: 60 e0 ldi r22, 0x00 ; 0 feb8: 70 e0 ldi r23, 0x00 ; 0 feba: 80 ec ldi r24, 0xC0 ; 192 febc: 9f e7 ldi r25, 0x7F ; 127 febe: 61 83 std Z+1, r22 ; 0x01 fec0: 72 83 std Z+2, r23 ; 0x02 fec2: 83 83 std Z+3, r24 ; 0x03 fec4: 94 83 std Z+4, r25 ; 0x04 fec6: 33 94 inc r3 plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); // Cycle through all points and probe them int l_feedmultiply = setup_for_endstop_move(false); //save feedrate and feedmultiply, sets feedmultiply to 100 uint8_t mesh_point = 0; //index number of calibration point while (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { fec8: e1 e3 ldi r30, 0x31 ; 49 feca: 3e 12 cpse r3, r30 fecc: b7 cf rjmp .-146 ; 0xfe3c custom_message_state--; mesh_point++; lcd_update(1); } current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; fece: 80 e0 ldi r24, 0x00 ; 0 fed0: 90 e0 ldi r25, 0x00 ; 0 fed2: a0 ea ldi r26, 0xA0 ; 160 fed4: b0 e4 ldi r27, 0x40 ; 64 fed6: 80 93 69 12 sts 0x1269, r24 ; 0x801269 feda: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a fede: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b fee2: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); fee6: 65 e5 ldi r22, 0x55 ; 85 fee8: 75 e5 ldi r23, 0x55 ; 85 feea: 85 e5 ldi r24, 0x55 ; 85 feec: 91 e4 ldi r25, 0x41 ; 65 feee: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); fef2: 0f 94 fb 1a call 0x235f6 ; 0x235f6 static uint8_t g80_fail_cnt = 0; if (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { fef6: b1 e3 ldi r27, 0x31 ; 49 fef8: 3b 16 cp r3, r27 fefa: 09 f4 brne .+2 ; 0xfefe fefc: 3c c2 rjmp .+1144 ; 0x10376 if (g80_fail_cnt++ >= 1) { fefe: 80 91 3d 03 lds r24, 0x033D ; 0x80033d ff02: 91 e0 ldi r25, 0x01 ; 1 ff04: 98 0f add r25, r24 ff06: 90 93 3d 03 sts 0x033D, r25 ; 0x80033d ff0a: 88 23 and r24, r24 ff0c: 09 f4 brne .+2 ; 0xff10 ff0e: d3 c1 rjmp .+934 ; 0x102b6 print_stop(); ff10: 60 e0 ldi r22, 0x00 ; 0 ff12: 80 e0 ldi r24, 0x00 ; 0 ff14: 0e 94 f9 de call 0x1bdf2 ; 0x1bdf2 lcd_show_fullscreen_message_and_wait_P(_T(MSG_MBL_FAILED)); ff18: 84 e3 ldi r24, 0x34 ; 52 ff1a: 96 e3 ldi r25, 0x36 ; 54 ff1c: 0e 94 3a 75 call 0xea74 ; 0xea74 ff20: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_z_calibration_prompt(false); ff24: 80 e0 ldi r24, 0x00 ; 0 ff26: 0e 94 f2 e9 call 0x1d3e4 ; 0x1d3e4 current_position[E_AXIS] += default_retraction; plan_buffer_line_curposXYZE(400); } #endif // !PINDA_THERMISTOR exit: KEEPALIVE_STATE(NOT_BUSY); ff2a: 81 e0 ldi r24, 0x01 ; 1 ff2c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 // Restore custom message state lcd_setstatuspgm(MSG_WELCOME); ff30: 86 ee ldi r24, 0xE6 ; 230 ff32: 9b e6 ldi r25, 0x6B ; 107 ff34: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = custom_message_type_old; ff38: 2f 81 ldd r18, Y+7 ; 0x07 ff3a: 20 93 5d 06 sts 0x065D, r18 ; 0x80065d custom_message_state = custom_message_state_old; ff3e: 68 85 ldd r22, Y+8 ; 0x08 ff40: 60 93 de 03 sts 0x03DE, r22 ; 0x8003de lcd_update(2); ff44: 82 e0 ldi r24, 0x02 ; 2 ff46: 0e 94 f9 6e call 0xddf2 ; 0xddf2 st_synchronize(); ff4a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 mesh_bed_leveling_flag = false; ff4e: 10 92 72 12 sts 0x1272, r1 ; 0x801272 ff52: d6 cd rjmp .-1108 ; 0xfb00 uint8_t meshPointsToProbe = 0; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0)); if (isOn3x3Mesh) { if (has_z && (row || col)) { ff54: 01 11 cpse r16, r1 ff56: 03 c0 rjmp .+6 ; 0xff5e ff58: 11 23 and r17, r17 ff5a: 09 f4 brne .+2 ; 0xff5e ff5c: bc ce rjmp .-648 ; 0xfcd6 // Reconstruct the mesh saved in eeprom uint16_t z_offset_u = eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + 2 * ((col/3) + row - 1))); ff5e: 81 2f mov r24, r17 ff60: 63 e0 ldi r22, 0x03 ; 3 ff62: 0f 94 9b a4 call 0x34936 ; 0x34936 <__divmodqi4> ff66: 84 0d add r24, r4 ff68: 95 2d mov r25, r5 ff6a: 91 1d adc r25, r1 ff6c: 88 0f add r24, r24 ff6e: 99 1f adc r25, r25 ff70: 8d 53 subi r24, 0x3D ; 61 ff72: 90 4f sbci r25, 0xF0 ; 240 ff74: 0f 94 ee a3 call 0x347dc ; 0x347dc const float z0 = mbl.z_values[0][0] + *reinterpret_cast(&z_offset_u) * 0.01; ff78: bc 01 movw r22, r24 ff7a: 99 0f add r25, r25 ff7c: 88 0b sbc r24, r24 ff7e: 99 0b sbc r25, r25 ff80: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> ff84: 2a e0 ldi r18, 0x0A ; 10 ff86: 37 ed ldi r19, 0xD7 ; 215 ff88: 43 e2 ldi r20, 0x23 ; 35 ff8a: 5c e3 ldi r21, 0x3C ; 60 ff8c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> ff90: 9b 01 movw r18, r22 ff92: ac 01 movw r20, r24 ff94: 60 91 0a 13 lds r22, 0x130A ; 0x80130a ff98: 70 91 0b 13 lds r23, 0x130B ; 0x80130b ff9c: 80 91 0c 13 lds r24, 0x130C ; 0x80130c ffa0: 90 91 0d 13 lds r25, 0x130D ; 0x80130d ffa4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> ffa8: f3 01 movw r30, r6 ffaa: 61 83 std Z+1, r22 ; 0x01 ffac: 72 83 std Z+2, r23 ; 0x02 ffae: 83 83 std Z+3, r24 ; 0x03 ffb0: 94 83 std Z+4, r25 ; 0x04 ffb2: 91 ce rjmp .-734 ; 0xfcd6 if (!isOn3x3Mesh) continue; } else { const float x_pos = BED_X(col); const float y_pos = BED_Y(row); if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) { ffb4: fe 85 ldd r31, Y+14 ; 0x0e ffb6: ff 23 and r31, r31 ffb8: 09 f4 brne .+2 ; 0xffbc ffba: 02 cf rjmp .-508 ; 0xfdc0 ffbc: 22 20 and r2, r2 ffbe: 09 f4 brne .+2 ; 0xffc2 ffc0: fe ce rjmp .-516 ; 0xfdbe ffc2: fe ce rjmp .-516 ; 0xfdc0 if (!isOn3x3Mesh) { mesh_point++; mbl.set_z(ix, iy, NAN); continue; //skip } } else if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) { ffc4: 28 89 ldd r18, Y+16 ; 0x10 ffc6: 39 89 ldd r19, Y+17 ; 0x11 ffc8: 4a 89 ldd r20, Y+18 ; 0x12 ffca: 5b 89 ldd r21, Y+19 ; 0x13 ffcc: 6a 85 ldd r22, Y+10 ; 0x0a ffce: 7b 85 ldd r23, Y+11 ; 0x0b ffd0: 8c 85 ldd r24, Y+12 ; 0x0c ffd2: 9d 85 ldd r25, Y+13 ; 0x0d ffd4: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> ffd8: 18 16 cp r1, r24 ffda: 04 f1 brlt .+64 ; 0x1001c ffdc: 28 89 ldd r18, Y+16 ; 0x10 ffde: 39 89 ldd r19, Y+17 ; 0x11 ffe0: 4a 89 ldd r20, Y+18 ; 0x12 ffe2: 5b 89 ldd r21, Y+19 ; 0x13 ffe4: 69 8d ldd r22, Y+25 ; 0x19 ffe6: 7a 8d ldd r23, Y+26 ; 0x1a ffe8: 8b 8d ldd r24, Y+27 ; 0x1b ffea: 9c 8d ldd r25, Y+28 ; 0x1c ffec: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> fff0: 87 fd sbrc r24, 7 fff2: 14 c0 rjmp .+40 ; 0x1001c fff4: a5 01 movw r20, r10 fff6: 94 01 movw r18, r8 fff8: 6c 89 ldd r22, Y+20 ; 0x14 fffa: 7d 89 ldd r23, Y+21 ; 0x15 fffc: 8e 89 ldd r24, Y+22 ; 0x16 fffe: 9f 89 ldd r25, Y+23 ; 0x17 10000: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 10004: 18 16 cp r1, r24 10006: 54 f0 brlt .+20 ; 0x1001c 10008: a5 01 movw r20, r10 1000a: 94 01 movw r18, r8 1000c: 6d 8d ldd r22, Y+29 ; 0x1d 1000e: 7e 8d ldd r23, Y+30 ; 0x1e 10010: 8f 8d ldd r24, Y+31 ; 0x1f 10012: 98 a1 ldd r25, Y+32 ; 0x20 10014: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10018: 87 ff sbrs r24, 7 1001a: 05 c0 rjmp .+10 ; 0x10026 1001c: 11 23 and r17, r17 1001e: 09 f4 brne .+2 ; 0x10022 10020: 52 cf rjmp .-348 ; 0xfec6 10022: 21 10 cpse r2, r1 10024: 50 cf rjmp .-352 ; 0xfec6 mesh_point++; continue; //skip } // Move Z up to the probe height of the current Z point. const float z0 = mbl.z_values[iy][ix]; 10026: 10 e0 ldi r17, 0x00 ; 0 10028: a7 e0 ldi r26, 0x07 ; 7 1002a: 8e 85 ldd r24, Y+14 ; 0x0e 1002c: 9f 85 ldd r25, Y+15 ; 0x0f 1002e: a8 9f mul r26, r24 10030: f0 01 movw r30, r0 10032: a9 9f mul r26, r25 10034: f0 0d add r31, r0 10036: 11 24 eor r1, r1 10038: e0 0f add r30, r16 1003a: f1 1f adc r31, r17 1003c: ee 0f add r30, r30 1003e: ff 1f adc r31, r31 10040: ee 0f add r30, r30 10042: ff 1f adc r31, r31 10044: e7 5f subi r30, 0xF7 ; 247 10046: fc 4e sbci r31, 0xEC ; 236 10048: 41 80 ldd r4, Z+1 ; 0x01 1004a: 52 80 ldd r5, Z+2 ; 0x02 1004c: 63 80 ldd r6, Z+3 ; 0x03 1004e: 74 80 ldd r7, Z+4 ; 0x04 const float init_z_bckp = !has_z ? MESH_HOME_Z_SEARCH : z0 + MESH_HOME_Z_SEARCH_FAST; 10050: c1 2c mov r12, r1 10052: d1 2c mov r13, r1 10054: e0 ea ldi r30, 0xA0 ; 160 10056: ee 2e mov r14, r30 10058: e0 e4 ldi r30, 0x40 ; 64 1005a: fe 2e mov r15, r30 1005c: 22 20 and r2, r2 1005e: 51 f0 breq .+20 ; 0x10074 10060: 23 e3 ldi r18, 0x33 ; 51 10062: 33 e3 ldi r19, 0x33 ; 51 10064: 43 eb ldi r20, 0xB3 ; 179 10066: 5e e3 ldi r21, 0x3E ; 62 10068: c3 01 movw r24, r6 1006a: b2 01 movw r22, r4 1006c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 10070: 6b 01 movw r12, r22 10072: 7c 01 movw r14, r24 if (init_z_bckp > current_position[Z_AXIS]) { 10074: a7 01 movw r20, r14 10076: 96 01 movw r18, r12 10078: 60 91 69 12 lds r22, 0x1269 ; 0x801269 1007c: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 10080: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 10084: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 10088: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1008c: 87 ff sbrs r24, 7 1008e: 10 c0 rjmp .+32 ; 0x100b0 current_position[Z_AXIS] = init_z_bckp; 10090: c0 92 69 12 sts 0x1269, r12 ; 0x801269 10094: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 10098: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 1009c: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 100a0: 65 e5 ldi r22, 0x55 ; 85 100a2: 75 e5 ldi r23, 0x55 ; 85 100a4: 85 e5 ldi r24, 0x55 ; 85 100a6: 91 e4 ldi r25, 0x41 ; 65 100a8: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 100ac: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } // Move to XY position of the sensor point. current_position[X_AXIS] = x_pos; 100b0: 68 89 ldd r22, Y+16 ; 0x10 100b2: 79 89 ldd r23, Y+17 ; 0x11 100b4: 8a 89 ldd r24, Y+18 ; 0x12 100b6: 9b 89 ldd r25, Y+19 ; 0x13 100b8: 60 93 61 12 sts 0x1261, r22 ; 0x801261 100bc: 70 93 62 12 sts 0x1262, r23 ; 0x801262 100c0: 80 93 63 12 sts 0x1263, r24 ; 0x801263 100c4: 90 93 64 12 sts 0x1264, r25 ; 0x801264 current_position[Y_AXIS] = y_pos; 100c8: 80 92 65 12 sts 0x1265, r8 ; 0x801265 100cc: 90 92 66 12 sts 0x1266, r9 ; 0x801266 100d0: a0 92 67 12 sts 0x1267, r10 ; 0x801267 100d4: b0 92 68 12 sts 0x1268, r11 ; 0x801268 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 100d8: 65 e6 ldi r22, 0x65 ; 101 100da: 72 e1 ldi r23, 0x12 ; 18 100dc: 81 e6 ldi r24, 0x61 ; 97 100de: 92 e1 ldi r25, 0x12 ; 18 100e0: 0e 94 1e 69 call 0xd23c ; 0xd23c plan_buffer_line_curposXYZE(XY_AXIS_FEEDRATE); 100e4: 60 e0 ldi r22, 0x00 ; 0 100e6: 70 e0 ldi r23, 0x00 ; 0 100e8: 86 e1 ldi r24, 0x16 ; 22 100ea: 93 e4 ldi r25, 0x43 ; 67 100ec: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 100f0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (planner_aborted) 100f4: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 100f8: 88 23 and r24, r24 100fa: 39 f0 breq .+14 ; 0x1010a { custom_message_type = custom_message_type_old; 100fc: 7f 81 ldd r23, Y+7 ; 0x07 100fe: 70 93 5d 06 sts 0x065D, r23 ; 0x80065d custom_message_state = custom_message_state_old; 10102: 88 85 ldd r24, Y+8 ; 0x08 10104: 80 93 de 03 sts 0x03DE, r24 ; 0x8003de 10108: fb cc rjmp .-1546 ; 0xfb00 return; } // Go down until endstop is hit if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point 1010a: 81 2c mov r8, r1 1010c: 91 2c mov r9, r1 1010e: 70 e2 ldi r23, 0x20 ; 32 10110: a7 2e mov r10, r23 10112: 71 ec ldi r23, 0xC1 ; 193 10114: b7 2e mov r11, r23 10116: 22 20 and r2, r2 10118: 51 f0 breq .+20 ; 0x1012e 1011a: 2a 81 ldd r18, Y+2 ; 0x02 1011c: 3b 81 ldd r19, Y+3 ; 0x03 1011e: 4c 81 ldd r20, Y+4 ; 0x04 10120: 5d 81 ldd r21, Y+5 ; 0x05 10122: c3 01 movw r24, r6 10124: b2 01 movw r22, r4 10126: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1012a: 4b 01 movw r8, r22 1012c: 5c 01 movw r10, r24 1012e: 48 8d ldd r20, Y+24 ; 0x18 10130: c5 01 movw r24, r10 10132: b4 01 movw r22, r8 10134: 0f 94 ed 7b call 0x2f7da ; 0x2f7da 10138: 81 11 cpse r24, r1 1013a: 0b c0 rjmp .+22 ; 0x10152 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); st_synchronize(); if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); 1013c: 8e ef ldi r24, 0xFE ; 254 1013e: 99 e3 ldi r25, 0x39 ; 57 10140: 0e 94 3a 75 call 0xea74 ; 0xea74 10144: 9f 93 push r25 10146: 8f 93 push r24 10148: 0f 94 a2 a2 call 0x34544 ; 0x34544 1014c: 0f 90 pop r0 1014e: 0f 90 pop r0 10150: be ce rjmp .-644 ; 0xfece // Go down until endstop is hit if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); break; } if (init_z_bckp - current_position[Z_AXIS] < 0.f) { //broken cable or initial Z coordinate too low. Go to MESH_HOME_Z_SEARCH and repeat last step (z-probe) again to distinguish between these two cases. 10152: 20 91 69 12 lds r18, 0x1269 ; 0x801269 10156: 30 91 6a 12 lds r19, 0x126A ; 0x80126a 1015a: 40 91 6b 12 lds r20, 0x126B ; 0x80126b 1015e: 50 91 6c 12 lds r21, 0x126C ; 0x80126c 10162: c7 01 movw r24, r14 10164: b6 01 movw r22, r12 10166: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1016a: 20 e0 ldi r18, 0x00 ; 0 1016c: 30 e0 ldi r19, 0x00 ; 0 1016e: a9 01 movw r20, r18 10170: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10174: 87 ff sbrs r24, 7 10176: 36 c0 rjmp .+108 ; 0x101e4 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 10178: 60 e0 ldi r22, 0x00 ; 0 1017a: 70 e0 ldi r23, 0x00 ; 0 1017c: 80 ea ldi r24, 0xA0 ; 160 1017e: 90 e4 ldi r25, 0x40 ; 64 10180: 60 93 69 12 sts 0x1269, r22 ; 0x801269 10184: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 10188: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 1018c: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 10190: 65 e5 ldi r22, 0x55 ; 85 10192: 75 e5 ldi r23, 0x55 ; 85 10194: 85 e5 ldi r24, 0x55 ; 85 10196: 91 e4 ldi r25, 0x41 ; 65 10198: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1019c: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point 101a0: 48 8d ldd r20, Y+24 ; 0x18 101a2: c5 01 movw r24, r10 101a4: b4 01 movw r22, r8 101a6: 0f 94 ed 7b call 0x2f7da ; 0x2f7da 101aa: 88 23 and r24, r24 101ac: 39 f2 breq .-114 ; 0x1013c printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); break; } if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) { 101ae: 20 91 69 12 lds r18, 0x1269 ; 0x801269 101b2: 30 91 6a 12 lds r19, 0x126A ; 0x80126a 101b6: 40 91 6b 12 lds r20, 0x126B ; 0x80126b 101ba: 50 91 6c 12 lds r21, 0x126C ; 0x80126c 101be: 60 e0 ldi r22, 0x00 ; 0 101c0: 70 e0 ldi r23, 0x00 ; 0 101c2: 80 ea ldi r24, 0xA0 ; 160 101c4: 90 e4 ldi r25, 0x40 ; 64 101c6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 101ca: 2d ec ldi r18, 0xCD ; 205 101cc: 3c ec ldi r19, 0xCC ; 204 101ce: 4c ec ldi r20, 0xCC ; 204 101d0: 5d e3 ldi r21, 0x3D ; 61 101d2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 101d6: 87 ff sbrs r24, 7 101d8: 05 c0 rjmp .+10 ; 0x101e4 puts_P(PSTR("Bed leveling failed. Sensor triggered too soon")); 101da: 87 e3 ldi r24, 0x37 ; 55 101dc: 97 e7 ldi r25, 0x77 ; 119 break; } } if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point puts_P(PSTR("Bed leveling failed. Too much variation from eeprom mesh")); 101de: 0f 94 c9 a2 call 0x34592 ; 0x34592 101e2: 75 ce rjmp .-790 ; 0xfece 101e4: c0 90 69 12 lds r12, 0x1269 ; 0x801269 101e8: d0 90 6a 12 lds r13, 0x126A ; 0x80126a 101ec: e0 90 6b 12 lds r14, 0x126B ; 0x80126b 101f0: f0 90 6c 12 lds r15, 0x126C ; 0x80126c if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) { puts_P(PSTR("Bed leveling failed. Sensor triggered too soon")); break; } } if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point 101f4: 22 20 and r2, r2 101f6: a1 f0 breq .+40 ; 0x10220 101f8: a7 01 movw r20, r14 101fa: 96 01 movw r18, r12 101fc: c3 01 movw r24, r6 101fe: b2 01 movw r22, r4 10200: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 10204: 9b 01 movw r18, r22 10206: ac 01 movw r20, r24 10208: 5f 77 andi r21, 0x7F ; 127 1020a: 6a 81 ldd r22, Y+2 ; 0x02 1020c: 7b 81 ldd r23, Y+3 ; 0x03 1020e: 8c 81 ldd r24, Y+4 ; 0x04 10210: 9d 81 ldd r25, Y+5 ; 0x05 10212: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10216: 87 ff sbrs r24, 7 10218: 03 c0 rjmp .+6 ; 0x10220 puts_P(PSTR("Bed leveling failed. Too much variation from eeprom mesh")); 1021a: 8e ef ldi r24, 0xFE ; 254 1021c: 96 e7 ldi r25, 0x76 ; 118 1021e: df cf rjmp .-66 ; 0x101de } #ifdef PINDA_THERMISTOR float temp_compensation_pinda_thermistor_offset(float temperature_pinda) { if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0; 10220: 8f ea ldi r24, 0xAF ; 175 10222: 9f e0 ldi r25, 0x0F ; 15 10224: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 10228: 88 23 and r24, r24 1022a: 09 f4 brne .+2 ; 0x1022e 1022c: 40 c0 rjmp .+128 ; 0x102ae bool calibration_status_get(CalibrationStatus components); void calibration_status_set(CalibrationStatus components); void calibration_status_clear(CalibrationStatus components); // PINDA has an independent calibration flag inline bool calibration_status_pinda() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA); } 1022e: 86 ea ldi r24, 0xA6 ; 166 10230: 9f e0 ldi r25, 0x0F ; 15 10232: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (!calibration_status_pinda()) return 0; 10236: 88 23 and r24, r24 10238: d1 f1 breq .+116 ; 0x102ae return temp_comp_interpolation(temperature_pinda) / cs.axis_steps_per_mm[Z_AXIS]; 1023a: 60 91 85 03 lds r22, 0x0385 ; 0x800385 1023e: 70 91 86 03 lds r23, 0x0386 ; 0x800386 10242: 80 91 87 03 lds r24, 0x0387 ; 0x800387 10246: 90 91 88 03 lds r25, 0x0388 ; 0x800388 1024a: 0e 94 86 56 call 0xad0c ; 0xad0c 1024e: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 10252: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 10256: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 1025a: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 1025e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 10262: 9b 01 movw r18, r22 10264: ac 01 movw r20, r24 10266: e7 e0 ldi r30, 0x07 ; 7 10268: ae 85 ldd r26, Y+14 ; 0x0e 1026a: bf 85 ldd r27, Y+15 ; 0x0f 1026c: ea 9f mul r30, r26 1026e: c0 01 movw r24, r0 10270: eb 9f mul r30, r27 10272: 90 0d add r25, r0 10274: 11 24 eor r1, r1 10276: 08 0f add r16, r24 10278: 19 1f adc r17, r25 1027a: 00 0f add r16, r16 1027c: 11 1f adc r17, r17 1027e: 00 0f add r16, r16 10280: 11 1f adc r17, r17 10282: 07 5f subi r16, 0xF7 ; 247 10284: 1c 4e sbci r17, 0xEC ; 236 break; } #ifdef PINDA_THERMISTOR float offset_z = temp_compensation_pinda_thermistor_offset(current_temperature_pinda); mbl.set_z(ix, iy, current_position[Z_AXIS] - offset_z); //store measured z values z_values[iy][ix] = z - offset_z; 10286: c7 01 movw r24, r14 10288: b6 01 movw r22, r12 1028a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1028e: d8 01 movw r26, r16 10290: 11 96 adiw r26, 0x01 ; 1 10292: 6d 93 st X+, r22 10294: 7d 93 st X+, r23 10296: 8d 93 st X+, r24 10298: 9c 93 st X, r25 1029a: 14 97 sbiw r26, 0x04 ; 4 #else mbl.set_z(ix, iy, current_position[Z_AXIS]); //store measured z values z_values[iy][ix] = z; #endif //PINDA_THERMISTOR custom_message_state--; 1029c: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 102a0: 81 50 subi r24, 0x01 ; 1 102a2: 80 93 de 03 sts 0x03DE, r24 ; 0x8003de mesh_point++; lcd_update(1); 102a6: 81 e0 ldi r24, 0x01 ; 1 102a8: 0e 94 f9 6e call 0xddf2 ; 0xddf2 102ac: 0c ce rjmp .-1000 ; 0xfec6 } #ifdef PINDA_THERMISTOR float temp_compensation_pinda_thermistor_offset(float temperature_pinda) { if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0; 102ae: 20 e0 ldi r18, 0x00 ; 0 102b0: 30 e0 ldi r19, 0x00 ; 0 102b2: a9 01 movw r20, r18 102b4: d8 cf rjmp .-80 ; 0x10266 print_stop(); lcd_show_fullscreen_message_and_wait_P(_T(MSG_MBL_FAILED)); lcd_z_calibration_prompt(false); goto exit; } Sound_MakeSound(e_SOUND_TYPE_StandardAlert); 102b6: 85 e0 ldi r24, 0x05 ; 5 102b8: 0f 94 ad 25 call 0x24b5a ; 0x24b5a raise_z(-1); enable_z_endstop(true); #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); #endif // TMC2130 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 102bc: c1 2c mov r12, r1 102be: d1 2c mov r13, r1 102c0: 90 ea ldi r25, 0xA0 ; 160 102c2: e9 2e mov r14, r25 102c4: 90 e4 ldi r25, 0x40 ; 64 102c6: f9 2e mov r15, r25 goto exit; } Sound_MakeSound(e_SOUND_TYPE_StandardAlert); bool bState; do { // repeat until Z-leveling o.k. lcd_display_message_fullscreen_P(_T(MSG_ZLEVELING_ENFORCED)); 102c8: 80 e0 ldi r24, 0x00 ; 0 102ca: 96 e3 ldi r25, 0x36 ; 54 102cc: 0e 94 3a 75 call 0xea74 ; 0xea74 102d0: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 #ifdef TMC2130 lcd_wait_for_click_delay(MSG_BED_LEVELING_FAILED_TIMEOUT); calibrate_z_auto(); // Z-leveling (X-assembly stay up!!!) #else // TMC2130 lcd_wait_for_click_delay(0); // ~ no timeout 102d4: 90 e0 ldi r25, 0x00 ; 0 102d6: 80 e0 ldi r24, 0x00 ; 0 102d8: 0e 94 c2 df call 0x1bf84 ; 0x1bf84 lcd_calibrate_z_end_stop_manual(true); // Z-leveling (X-assembly stay up!!!) 102dc: 81 e0 ldi r24, 0x01 ; 1 102de: 0e 94 11 fc call 0x1f822 ; 0x1f822 #endif // TMC2130 // ~ Z-homing (can not be used "G28", because X & Y-homing would have been done before (Z-homing)) bState=enable_z_endstop(false); 102e2: 80 e0 ldi r24, 0x00 ; 0 102e4: 0f 94 88 25 call 0x24b10 ; 0x24b10 102e8: 18 2f mov r17, r24 raise_z(-1); 102ea: 60 e0 ldi r22, 0x00 ; 0 102ec: 70 e0 ldi r23, 0x00 ; 0 102ee: 80 e8 ldi r24, 0x80 ; 128 102f0: 9f eb ldi r25, 0xBF ; 191 102f2: 0e 94 94 6c call 0xd928 ; 0xd928 enable_z_endstop(true); 102f6: 81 e0 ldi r24, 0x01 ; 1 102f8: 0f 94 88 25 call 0x24b10 ; 0x24b10 #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); #endif // TMC2130 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 102fc: c0 92 69 12 sts 0x1269, r12 ; 0x801269 10300: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 10304: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 10308: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 1030c: 65 e5 ldi r22, 0x55 ; 85 1030e: 75 e5 ldi r23, 0x55 ; 85 10310: 85 e5 ldi r24, 0x55 ; 85 10312: 91 e4 ldi r25, 0x41 ; 65 10314: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 10318: 0f 94 fb 1a call 0x235f6 ; 0x235f6 #ifdef TMC2130 tmc2130_home_exit(); #endif // TMC2130 enable_z_endstop(bState); 1031c: 81 2f mov r24, r17 1031e: 0f 94 88 25 call 0x24b10 ; 0x24b10 } while (st_get_position_mm(Z_AXIS) > MESH_HOME_Z_SEARCH); // i.e. Z-leveling not o.k. 10322: 82 e0 ldi r24, 0x02 ; 2 10324: 0f 94 e7 1a call 0x235ce ; 0x235ce 10328: 20 e0 ldi r18, 0x00 ; 0 1032a: 30 e0 ldi r19, 0x00 ; 0 1032c: 40 ea ldi r20, 0xA0 ; 160 1032e: 50 e4 ldi r21, 0x40 ; 64 10330: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 10334: 18 16 cp r1, r24 10336: 44 f2 brlt .-112 ; 0x102c8 custom_message_type = custom_message_type_old; 10338: ef 81 ldd r30, Y+7 ; 0x07 1033a: e0 93 5d 06 sts 0x065D, r30 ; 0x80065d custom_message_state = custom_message_state_old; 1033e: f8 85 ldd r31, Y+8 ; 0x08 10340: f0 93 de 03 sts 0x03DE, r31 ; 0x8003de lcd_update_enable(true); // display / status-line recovery 10344: 81 e0 ldi r24, 0x01 ; 1 10346: 0e 94 38 70 call 0xe070 ; 0xe070 static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) { #ifdef TMC2130 gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true); #else gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, true); 1034a: dd 24 eor r13, r13 1034c: d3 94 inc r13 1034e: df 92 push r13 10350: 81 2c mov r8, r1 10352: 91 2c mov r9, r1 10354: 54 01 movw r10, r8 10356: cc 24 eor r12, r12 10358: c3 94 inc r12 1035a: e1 2c mov r14, r1 1035c: f1 2c mov r15, r1 1035e: 87 01 movw r16, r14 10360: 21 e0 ldi r18, 0x01 ; 1 10362: 40 e0 ldi r20, 0x00 ; 0 10364: 50 e0 ldi r21, 0x00 ; 0 10366: ba 01 movw r22, r20 10368: 81 e0 ldi r24, 0x01 ; 1 1036a: 0e 94 2a 6d call 0xda54 ; 0xda54 1036e: d0 92 53 12 sts 0x1253, r13 ; 0x801253 10372: 0f 90 pop r0 10374: c5 cb rjmp .-2166 ; 0xfb00 lcd_update_enable(true); // display / status-line recovery gcode_G28(true, true, true); // X & Y & Z-homing (must be after individual Z-homing (problem with spool-holder)!) repeatcommand_front(); // re-run (i.e. of "G80") return; } g80_fail_cnt = 0; // no fail was detected. Reset the error counter. 10376: 10 92 3d 03 sts 0x033D, r1 ; 0x80033d clean_up_after_endstop_move(l_feedmultiply); 1037a: 8b a1 ldd r24, Y+35 ; 0x23 1037c: 9c a1 ldd r25, Y+36 ; 0x24 1037e: 0e 94 4c 65 call 0xca98 ; 0xca98 // Number of baby steps applied static int babystepLoadZ = 0; void babystep_load() { babystepLoadZ = 0; 10382: 10 92 27 06 sts 0x0627, r1 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 10386: 10 92 26 06 sts 0x0626, r1 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> // Apply Z height correction aka baby stepping before mesh bed leveling gets activated. if (calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) 1038a: 80 e1 ldi r24, 0x10 ; 16 1038c: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 10390: 88 23 and r24, r24 10392: 91 f0 breq .+36 ; 0x103b8 { check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0 10394: 0e 94 1c 7d call 0xfa38 ; 0xfa38 // End of G80: Apply the baby stepping value. babystepLoadZ = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); 10398: 81 ea ldi r24, 0xA1 ; 161 1039a: 9d e0 ldi r25, 0x0D ; 13 1039c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) { check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0 // End of G80: Apply the baby stepping value. babystepLoadZ = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> 103a0: 2b e0 ldi r18, 0x0B ; 11 103a2: 82 9f mul r24, r18 103a4: c0 01 movw r24, r0 103a6: 11 24 eor r1, r1 103a8: 80 5b subi r24, 0xB0 ; 176 103aa: 92 4f sbci r25, 0xF2 ; 242 103ac: 0f 94 ee a3 call 0x347dc ; 0x347dc 103b0: 90 93 27 06 sts 0x0627, r25 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 103b4: 80 93 26 06 sts 0x0626, r24 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> } void babystep_apply() { babystep_load(); shift_z(- float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS])); 103b8: 60 91 26 06 lds r22, 0x0626 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> 103bc: 70 91 27 06 lds r23, 0x0627 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 103c0: 07 2e mov r0, r23 103c2: 00 0c add r0, r0 103c4: 88 0b sbc r24, r24 103c6: 99 0b sbc r25, r25 103c8: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 103cc: 90 58 subi r25, 0x80 ; 128 103ce: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 103d2: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 103d6: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 103da: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 103de: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 103e2: 0e 94 a6 5e call 0xbd4c ; 0xbd4c if(eeprom_read_byte((uint8_t *)EEPROM_TEMP_CAL_ACTIVE) && calibration_status_pinda() == true) temp_compensation_apply(); //apply PINDA temperature compensation #endif babystep_apply(); // Apply Z height correction aka baby stepping before mesh bed leveing gets activated. { // Apply the bed level correction to the mesh bool eeprom_bed_correction_valid = eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1; 103e6: 80 ec ldi r24, 0xC0 ; 192 103e8: 9f e0 ldi r25, 0x0F ; 15 103ea: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 103ee: 91 e0 ldi r25, 0x01 ; 1 103f0: 81 30 cpi r24, 0x01 ; 1 103f2: 09 f0 breq .+2 ; 0x103f6 103f4: 90 e0 ldi r25, 0x00 ; 0 } } else if (eeprom_bed_correction_valid) { return (int8_t)eeprom_read_byte(eep_address); } return 0; }; 103f6: 99 83 std Y+1, r25 ; 0x01 const int8_t correction[4] = { bedCorrectHelper('L', (uint8_t*)EEPROM_BED_CORRECTION_LEFT), 103f8: 4f eb ldi r20, 0xBF ; 191 103fa: 5f e0 ldi r21, 0x0F ; 15 103fc: 6c e4 ldi r22, 0x4C ; 76 103fe: ce 01 movw r24, r28 10400: 01 96 adiw r24, 0x01 ; 1 10402: 0e 94 24 56 call 0xac48 ; 0xac48 10406: f8 2e mov r15, r24 bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT), 10408: 4e eb ldi r20, 0xBE ; 190 1040a: 5f e0 ldi r21, 0x0F ; 15 1040c: 62 e5 ldi r22, 0x52 ; 82 1040e: ce 01 movw r24, r28 10410: 01 96 adiw r24, 0x01 ; 1 10412: 0e 94 24 56 call 0xac48 ; 0xac48 10416: 08 2f mov r16, r24 bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT), 10418: 4d eb ldi r20, 0xBD ; 189 1041a: 5f e0 ldi r21, 0x0F ; 15 1041c: 66 e4 ldi r22, 0x46 ; 70 1041e: ce 01 movw r24, r28 10420: 01 96 adiw r24, 0x01 ; 1 10422: 0e 94 24 56 call 0xac48 ; 0xac48 10426: 18 2f mov r17, r24 bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR), 10428: 4c eb ldi r20, 0xBC ; 188 1042a: 5f e0 ldi r21, 0x0F ; 15 1042c: 62 e4 ldi r22, 0x42 ; 66 1042e: ce 01 movw r24, r28 10430: 01 96 adiw r24, 0x01 ; 1 10432: 0e 94 24 56 call 0xac48 ; 0xac48 10436: 21 2f mov r18, r17 10438: 11 0f add r17, r17 1043a: 33 0b sbc r19, r19 1043c: 08 2e mov r0, r24 1043e: 00 0c add r0, r0 10440: 99 0b sbc r25, r25 10442: 5c 01 movw r10, r24 10444: a2 1a sub r10, r18 10446: b3 0a sbc r11, r19 10448: 8f 2d mov r24, r15 1044a: ff 0c add r15, r15 1044c: 99 0b sbc r25, r25 1044e: 28 0f add r18, r24 10450: 39 1f adc r19, r25 10452: 46 e0 ldi r20, 0x06 ; 6 10454: 42 9f mul r20, r18 10456: 60 01 movw r12, r0 10458: 43 9f mul r20, r19 1045a: d0 0c add r13, r0 1045c: 11 24 eor r1, r1 1045e: f1 2c mov r15, r1 10460: e1 2c mov r14, r1 10462: 00 2e mov r0, r16 10464: 00 0c add r0, r0 10466: 11 0b sbc r17, r17 10468: 08 1b sub r16, r24 1046a: 19 0b sbc r17, r25 1046c: b7 01 movw r22, r14 1046e: 66 5f subi r22, 0xF6 ; 246 10470: 7c 4e sbci r23, 0xEC ; 236 10472: 3b 01 movw r6, r22 10474: 46 01 movw r8, r12 10476: 77 e0 ldi r23, 0x07 ; 7 10478: 7a 83 std Y+2, r23 ; 0x02 }; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { constexpr float scaler = 0.001f / (MESH_NUM_X_POINTS - 1); mbl.z_values[row][col] += scaler * ( 1047a: d3 01 movw r26, r6 1047c: 2d 90 ld r2, X+ 1047e: 3d 90 ld r3, X+ 10480: 4d 90 ld r4, X+ 10482: 5d 90 ld r5, X+ 10484: 3d 01 movw r6, r26 10486: fd 01 movw r30, r26 10488: 34 97 sbiw r30, 0x04 ; 4 1048a: fb 87 std Y+11, r31 ; 0x0b 1048c: ea 87 std Y+10, r30 ; 0x0a 1048e: b4 01 movw r22, r8 10490: 09 2c mov r0, r9 10492: 00 0c add r0, r0 10494: 88 0b sbc r24, r24 10496: 99 0b sbc r25, r25 10498: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1049c: 2f e3 ldi r18, 0x3F ; 63 1049e: 33 ec ldi r19, 0xC3 ; 195 104a0: 4e e2 ldi r20, 0x2E ; 46 104a2: 59 e3 ldi r21, 0x39 ; 57 104a4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 104a8: a2 01 movw r20, r4 104aa: 91 01 movw r18, r2 104ac: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 104b0: aa 85 ldd r26, Y+10 ; 0x0a 104b2: bb 85 ldd r27, Y+11 ; 0x0b 104b4: 6d 93 st X+, r22 104b6: 7d 93 st X+, r23 104b8: 8d 93 st X+, r24 104ba: 9c 93 st X, r25 104bc: 13 97 sbiw r26, 0x03 ; 3 104be: ba 81 ldd r27, Y+2 ; 0x02 104c0: b1 50 subi r27, 0x01 ; 1 104c2: ba 83 std Y+2, r27 ; 0x02 104c4: 80 0e add r8, r16 104c6: 91 1e adc r9, r17 bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT), bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT), bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR), }; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) { 104c8: b1 11 cpse r27, r1 104ca: d7 cf rjmp .-82 ; 0x1047a 104cc: ca 0c add r12, r10 104ce: db 1c adc r13, r11 104d0: ec e1 ldi r30, 0x1C ; 28 104d2: ee 0e add r14, r30 104d4: f1 1c adc r15, r1 bedCorrectHelper('L', (uint8_t*)EEPROM_BED_CORRECTION_LEFT), bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT), bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT), bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR), }; for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) { 104d6: f4 ec ldi r31, 0xC4 ; 196 104d8: ef 16 cp r14, r31 104da: f1 04 cpc r15, r1 104dc: 39 f6 brne .-114 ; 0x1046c + correction[3] * row); } } } mbl.upsample_3x3(); //interpolation from 3x3 to 7x7 points using largrangian polynomials while using the same array z_values[iy][ix] for storing (just coppying measured data to new destination and interpolating between them) 104de: 0f 94 bd 92 call 0x3257a ; 0x3257a { // apply magnet compensation uint8_t useMagnetCompensation = code_seen('M') ? code_value_uint8() : eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION); 104e2: 8d e4 ldi r24, 0x4D ; 77 104e4: 0e 94 f5 55 call 0xabea ; 0xabea 104e8: 88 23 and r24, r24 104ea: 09 f4 brne .+2 ; 0x104ee 104ec: 84 c0 rjmp .+264 ; 0x105f6 104ee: 0e 94 0a 56 call 0xac14 ; 0xac14 if (nMeasPoints == 7 && useMagnetCompensation) { 104f2: 2e 81 ldd r18, Y+6 ; 0x06 104f4: 27 30 cpi r18, 0x07 ; 7 104f6: 09 f0 breq .+2 ; 0x104fa 104f8: 94 c0 rjmp .+296 ; 0x10622 104fa: 88 23 and r24, r24 104fc: 09 f4 brne .+2 ; 0x10500 104fe: 91 c0 rjmp .+290 ; 0x10622 10500: bb 24 eor r11, r11 10502: b3 94 inc r11 10504: aa 24 eor r10, r10 10506: aa 94 dec r10 10508: ab 0c add r10, r11 1050a: 09 a1 ldd r16, Y+33 ; 0x21 1050c: 1a a1 ldd r17, Y+34 ; 0x22 //printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]); } void mbl_magnet_elimination() { for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) { for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { 1050e: 61 2c mov r6, r1 void mbl_single_point_interpolation(uint8_t x, uint8_t y) { //printf_P(PSTR("x = %d; y = %d \n"), x, y); uint8_t count = 0; float z = 0; if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; } if (mbl_point_measurement_valid(x, y - 1)) { z += mbl.z_values[y - 1][x]; /*printf_P(PSTR("x; y-1: Z = %f \n"), mbl.z_values[y - 1][x]);*/ count++; } 10510: 8e ef ldi r24, 0xFE ; 254 10512: 88 2e mov r8, r24 10514: 8b 0c add r8, r11 } void mbl_magnet_elimination() { for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) { for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { if (!mbl_point_measurement_valid(x, y)) { 10516: 6a 2d mov r22, r10 10518: 86 2d mov r24, r6 1051a: 0f 94 75 54 call 0x2a8ea ; 0x2a8ea 1051e: 99 24 eor r9, r9 10520: 93 94 inc r9 10522: 96 0c add r9, r6 10524: 81 11 cpse r24, r1 10526: 6e c0 rjmp .+220 ; 0x10604 void mbl_single_point_interpolation(uint8_t x, uint8_t y) { //printf_P(PSTR("x = %d; y = %d \n"), x, y); uint8_t count = 0; float z = 0; if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; } 10528: 6b 2d mov r22, r11 1052a: 86 2d mov r24, r6 1052c: 0f 94 75 54 call 0x2a8ea ; 0x2a8ea } void mbl_single_point_interpolation(uint8_t x, uint8_t y) { //printf_P(PSTR("x = %d; y = %d \n"), x, y); uint8_t count = 0; float z = 0; 10530: c1 2c mov r12, r1 10532: d1 2c mov r13, r1 10534: 76 01 movw r14, r12 return (valid_points_mask[6 - iy] & (1 << (6 - ix))); } void mbl_single_point_interpolation(uint8_t x, uint8_t y) { //printf_P(PSTR("x = %d; y = %d \n"), x, y); uint8_t count = 0; 10536: 71 2c mov r7, r1 float z = 0; if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; } 10538: 88 23 and r24, r24 1053a: 81 f0 breq .+32 ; 0x1055c 1053c: 20 e0 ldi r18, 0x00 ; 0 1053e: 30 e0 ldi r19, 0x00 ; 0 10540: a9 01 movw r20, r18 10542: d8 01 movw r26, r16 10544: 5d 96 adiw r26, 0x1d ; 29 10546: 6d 91 ld r22, X+ 10548: 7d 91 ld r23, X+ 1054a: 8d 91 ld r24, X+ 1054c: 9c 91 ld r25, X 1054e: 90 97 sbiw r26, 0x20 ; 32 10550: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 10554: 6b 01 movw r12, r22 10556: 7c 01 movw r14, r24 10558: 77 24 eor r7, r7 1055a: 73 94 inc r7 if (mbl_point_measurement_valid(x, y - 1)) { z += mbl.z_values[y - 1][x]; /*printf_P(PSTR("x; y-1: Z = %f \n"), mbl.z_values[y - 1][x]);*/ count++; } 1055c: 68 2d mov r22, r8 1055e: 86 2d mov r24, r6 10560: 0f 94 75 54 call 0x2a8ea ; 0x2a8ea 10564: 88 23 and r24, r24 10566: 69 f0 breq .+26 ; 0x10582 10568: f8 01 movw r30, r16 1056a: 7b 97 sbiw r30, 0x1b ; 27 1056c: 20 81 ld r18, Z 1056e: 31 81 ldd r19, Z+1 ; 0x01 10570: 42 81 ldd r20, Z+2 ; 0x02 10572: 53 81 ldd r21, Z+3 ; 0x03 10574: c7 01 movw r24, r14 10576: b6 01 movw r22, r12 10578: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1057c: 6b 01 movw r12, r22 1057e: 7c 01 movw r14, r24 10580: 73 94 inc r7 if (mbl_point_measurement_valid(x + 1, y)) { z += mbl.z_values[y][x + 1]; /*printf_P(PSTR("x+1; y: Z = %f \n"), mbl.z_values[y][x + 1]);*/ count++; } 10582: 6a 2d mov r22, r10 10584: 89 2d mov r24, r9 10586: 0f 94 75 54 call 0x2a8ea ; 0x2a8ea 1058a: 88 23 and r24, r24 1058c: 61 f0 breq .+24 ; 0x105a6 1058e: f8 01 movw r30, r16 10590: 25 81 ldd r18, Z+5 ; 0x05 10592: 36 81 ldd r19, Z+6 ; 0x06 10594: 47 81 ldd r20, Z+7 ; 0x07 10596: 50 85 ldd r21, Z+8 ; 0x08 10598: c7 01 movw r24, r14 1059a: b6 01 movw r22, r12 1059c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 105a0: 6b 01 movw r12, r22 105a2: 7c 01 movw r14, r24 105a4: 73 94 inc r7 if (mbl_point_measurement_valid(x - 1, y)) { z += mbl.z_values[y][x - 1]; /*printf_P(PSTR("x-1; y: Z = %f \n"), mbl.z_values[y][x - 1]);*/ count++; } 105a6: 6a 2d mov r22, r10 105a8: 8f ef ldi r24, 0xFF ; 255 105aa: 86 0d add r24, r6 105ac: 0f 94 75 54 call 0x2a8ea ; 0x2a8ea 105b0: 88 23 and r24, r24 105b2: 31 f1 breq .+76 ; 0x10600 105b4: f8 01 movw r30, r16 105b6: 33 97 sbiw r30, 0x03 ; 3 105b8: 20 81 ld r18, Z 105ba: 31 81 ldd r19, Z+1 ; 0x01 105bc: 42 81 ldd r20, Z+2 ; 0x02 105be: 53 81 ldd r21, Z+3 ; 0x03 105c0: c7 01 movw r24, r14 105c2: b6 01 movw r22, r12 105c4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 105c8: 6b 01 movw r12, r22 105ca: 7c 01 movw r14, r24 105cc: 73 94 inc r7 if(count != 0) mbl.z_values[y][x] = z / count; //if we have at least one valid point in surrounding area use average value, otherwise use inaccurately measured Z-coordinate 105ce: 67 2d mov r22, r7 105d0: 70 e0 ldi r23, 0x00 ; 0 105d2: 90 e0 ldi r25, 0x00 ; 0 105d4: 80 e0 ldi r24, 0x00 ; 0 105d6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 105da: 9b 01 movw r18, r22 105dc: ac 01 movw r20, r24 105de: c7 01 movw r24, r14 105e0: b6 01 movw r22, r12 105e2: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 105e6: d8 01 movw r26, r16 105e8: 11 96 adiw r26, 0x01 ; 1 105ea: 6d 93 st X+, r22 105ec: 7d 93 st X+, r23 105ee: 8d 93 st X+, r24 105f0: 9c 93 st X, r25 105f2: 14 97 sbiw r26, 0x04 ; 4 105f4: 07 c0 rjmp .+14 ; 0x10604 } mbl.upsample_3x3(); //interpolation from 3x3 to 7x7 points using largrangian polynomials while using the same array z_values[iy][ix] for storing (just coppying measured data to new destination and interpolating between them) { // apply magnet compensation uint8_t useMagnetCompensation = code_seen('M') ? code_value_uint8() : eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION); 105f6: 8c ea ldi r24, 0xAC ; 172 105f8: 9d e0 ldi r25, 0x0D ; 13 105fa: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 105fe: 79 cf rjmp .-270 ; 0x104f2 10600: 71 10 cpse r7, r1 10602: e5 cf rjmp .-54 ; 0x105ce //printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]); } void mbl_magnet_elimination() { for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) { for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { 10604: 69 2c mov r6, r9 10606: 0c 5f subi r16, 0xFC ; 252 10608: 1f 4f sbci r17, 0xFF ; 255 1060a: b7 e0 ldi r27, 0x07 ; 7 1060c: 9b 12 cpse r9, r27 1060e: 83 cf rjmp .-250 ; 0x10516 10610: b3 94 inc r11 10612: e9 a1 ldd r30, Y+33 ; 0x21 10614: fa a1 ldd r31, Y+34 ; 0x22 10616: 7c 96 adiw r30, 0x1c ; 28 10618: fa a3 std Y+34, r31 ; 0x22 1061a: e9 a3 std Y+33, r30 ; 0x21 if(count != 0) mbl.z_values[y][x] = z / count; //if we have at least one valid point in surrounding area use average value, otherwise use inaccurately measured Z-coordinate //printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]); } void mbl_magnet_elimination() { for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) { 1061c: f8 e0 ldi r31, 0x08 ; 8 1061e: bf 12 cpse r11, r31 10620: 71 cf rjmp .-286 ; 0x10504 if (nMeasPoints == 7 && useMagnetCompensation) { mbl_magnet_elimination(); } } mbl.active = 1; //activate mesh bed leveling 10622: 81 e0 ldi r24, 0x01 ; 1 10624: 80 93 09 13 sts 0x1309, r24 ; 0x801309 if (code_seen('O') && !code_value_uint8()) { 10628: 8f e4 ldi r24, 0x4F ; 79 1062a: 0e 94 f5 55 call 0xabea ; 0xabea 1062e: 81 11 cpse r24, r1 10630: 03 c0 rjmp .+6 ; 0x10638 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); } else { go_home_with_z_lift(); 10632: 0e 94 3d 6a call 0xd47a ; 0xd47a 10636: 79 cc rjmp .-1806 ; 0xff2a } } mbl.active = 1; //activate mesh bed leveling if (code_seen('O') && !code_value_uint8()) { 10638: 0e 94 0a 56 call 0xac14 ; 0xac14 1063c: 81 11 cpse r24, r1 1063e: f9 cf rjmp .-14 ; 0x10632 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 10640: 0e 94 41 65 call 0xca82 ; 0xca82 10644: 72 cc rjmp .-1820 ; 0xff2a 00010646 : #endif //AUTO_REPORT host_keepalive(); M79_timer_update_status(); } void kill(const char *full_screen_message) { 10646: ec 01 movw r28, r24 cli(); // Stop interrupts 10648: f8 94 cli disable_heater(); 1064a: 0f 94 05 11 call 0x2220a ; 0x2220a disable_x(); 1064e: 17 9a sbi 0x02, 7 ; 2 10650: 10 92 39 06 sts 0x0639, r1 ; 0x800639 disable_y(); 10654: 16 9a sbi 0x02, 6 ; 2 10656: 10 92 3a 06 sts 0x063A, r1 ; 0x80063a poweroff_z(); disable_e0(); 1065a: 14 9a sbi 0x02, 4 ; 2 SERIAL_ERROR_START; 1065c: 81 eb ldi r24, 0xB1 ; 177 1065e: 91 ea ldi r25, 0xA1 ; 161 10660: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!")); 10664: 86 e0 ldi r24, 0x06 ; 6 10666: 98 e7 ldi r25, 0x78 ; 120 10668: 0e 94 bd 7c call 0xf97a ; 0xf97a if (full_screen_message != NULL) { 1066c: 20 97 sbiw r28, 0x00 ; 0 1066e: 79 f0 breq .+30 ; 0x1068e SERIAL_ERRORLNRPGM(full_screen_message); 10670: ce 01 movw r24, r28 10672: 0e 94 bd 7c call 0xf97a ; 0xf97a 10676: be 01 movw r22, r28 10678: 85 e9 ldi r24, 0x95 ; 149 1067a: 9c e0 ldi r25, 0x0C ; 12 1067c: 0f 94 3e a4 call 0x3487c ; 0x3487c if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); 10680: 62 e4 ldi r22, 0x42 ; 66 10682: 84 e9 ldi r24, 0x94 ; 148 10684: 9c e0 ldi r25, 0x0C ; 12 10686: 0f 94 28 a4 call 0x34850 ; 0x34850 // update eeprom with the correct kill message to be shown on startup eeprom_write_word_notify((uint16_t*)EEPROM_KILL_MESSAGE, (uint16_t)full_screen_message); eeprom_write_byte_notify((uint8_t*)EEPROM_KILL_PENDING_FLAG, KILL_PENDING_FLAG); softReset(); 1068a: 0e 94 1f 66 call 0xcc3e ; 0xcc3e SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!")); if (full_screen_message != NULL) { SERIAL_ERRORLNRPGM(full_screen_message); } else { full_screen_message = PSTR("KILLED."); 1068e: ce ef ldi r28, 0xFE ; 254 10690: d7 e7 ldi r29, 0x77 ; 119 10692: f1 cf rjmp .-30 ; 0x10676 00010694 : // Sample the 9 points of the bed and store them into the EEPROM as a reference. // When calling this function, the X, Y, Z axes should be already homed, // and the world2machine correction matrix should be active. // Returns false if the reference values are more than 3mm far away. bool sample_mesh_and_store_reference() { 10694: 2f 92 push r2 10696: 3f 92 push r3 10698: 4f 92 push r4 1069a: 5f 92 push r5 1069c: 6f 92 push r6 1069e: 7f 92 push r7 106a0: 8f 92 push r8 106a2: 9f 92 push r9 106a4: af 92 push r10 106a6: bf 92 push r11 106a8: cf 92 push r12 106aa: df 92 push r13 106ac: ef 92 push r14 106ae: ff 92 push r15 106b0: 0f 93 push r16 106b2: 1f 93 push r17 106b4: cf 93 push r28 106b6: df 93 push r29 106b8: 00 d0 rcall .+0 ; 0x106ba 106ba: 00 d0 rcall .+0 ; 0x106bc 106bc: cd b7 in r28, 0x3d ; 61 106be: de b7 in r29, 0x3e ; 62 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 106c0: 80 91 77 02 lds r24, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> 106c4: 8c 83 std Y+4, r24 ; 0x04 check_endstops = check; 106c6: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> bool result = false; #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); #endif bool endstops_enabled = enable_endstops(false); bool endstop_z_enabled = enable_z_endstop(false); 106ca: 80 e0 ldi r24, 0x00 ; 0 106cc: 0f 94 88 25 call 0x24b10 ; 0x24b10 106d0: 8b 83 std Y+3, r24 ; 0x03 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 106d2: 0e 94 41 65 call 0xca82 ; 0xca82 #ifdef MESH_BED_CALIBRATION_SHOW_LCD lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1)); 106d6: 83 e5 ldi r24, 0x53 ; 83 106d8: 91 e6 ldi r25, 0x61 ; 97 106da: 0e 94 3a 75 call 0xea74 ; 0xea74 106de: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 // display "point xx of yy" lcd_puts_at_P(0,3,_n("1/9")); 106e2: 4d e4 ldi r20, 0x4D ; 77 106e4: 57 e6 ldi r21, 0x67 ; 103 106e6: 63 e0 ldi r22, 0x03 ; 3 106e8: 80 e0 ldi r24, 0x00 ; 0 106ea: 0e 94 07 70 call 0xe00e ; 0xe00e 106ee: 81 e0 ldi r24, 0x01 ; 1 106f0: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> // Sample Z heights for the mesh bed leveling. // In addition, store the results into an eeprom, to be used later for verification of the bed leveling process. { // Lower Z to the mesh search height with stall detection enable_endstops(true); current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 106f4: 80 e0 ldi r24, 0x00 ; 0 106f6: 90 e0 ldi r25, 0x00 ; 0 106f8: a0 ea ldi r26, 0xA0 ; 160 106fa: b0 e4 ldi r27, 0x40 ; 64 106fc: 80 93 69 12 sts 0x1269, r24 ; 0x801269 10700: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 10704: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 10708: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c go_to_current(homing_feedrate[Z_AXIS]/60); 1070c: 65 e5 ldi r22, 0x55 ; 85 1070e: 75 e5 ldi r23, 0x55 ; 85 10710: 85 e5 ldi r24, 0x55 ; 85 10712: 91 e4 ldi r25, 0x41 ; 65 10714: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec 10718: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> check_Z_crash(); #endif enable_endstops(false); // Move XY to first point current_position[X_AXIS] = BED_X0; 1071c: 80 e0 ldi r24, 0x00 ; 0 1071e: 90 e0 ldi r25, 0x00 ; 0 10720: a0 e8 ldi r26, 0x80 ; 128 10722: bf e3 ldi r27, 0x3F ; 63 10724: 80 93 61 12 sts 0x1261, r24 ; 0x801261 10728: 90 93 62 12 sts 0x1262, r25 ; 0x801262 1072c: a0 93 63 12 sts 0x1263, r26 ; 0x801263 10730: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = BED_Y0; 10734: 80 93 65 12 sts 0x1265, r24 ; 0x801265 10738: 90 93 66 12 sts 0x1266, r25 ; 0x801266 1073c: a0 93 67 12 sts 0x1267, r26 ; 0x801267 10740: b0 93 68 12 sts 0x1268, r27 ; 0x801268 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 10744: 65 e6 ldi r22, 0x65 ; 101 10746: 72 e1 ldi r23, 0x12 ; 18 10748: 81 e6 ldi r24, 0x61 ; 97 1074a: 92 e1 ldi r25, 0x12 ; 18 1074c: 0e 94 1e 69 call 0xd23c ; 0xd23c go_to_current(homing_feedrate[X_AXIS]/60); 10750: 60 e0 ldi r22, 0x00 ; 0 10752: 70 e0 ldi r23, 0x00 ; 0 10754: 88 e4 ldi r24, 0x48 ; 72 10756: 92 e4 ldi r25, 0x42 ; 66 10758: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec set_destination_to_current(); 1075c: 0e 94 ae 66 call 0xcd5c ; 0xcd5c homeaxis(Z_AXIS); 10760: 82 e0 ldi r24, 0x02 ; 2 10762: 0f 94 ae 79 call 0x2f35c ; 0x2f35c if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um 10766: 43 e0 ldi r20, 0x03 ; 3 10768: 60 e0 ldi r22, 0x00 ; 0 1076a: 70 e0 ldi r23, 0x00 ; 0 1076c: 80 e2 ldi r24, 0x20 ; 32 1076e: 91 ec ldi r25, 0xC1 ; 193 10770: 0f 94 ed 7b call 0x2f7da ; 0x2f7da 10774: 81 11 cpse r24, r1 10776: 06 c0 rjmp .+12 ; 0x10784 lcd_set_cursor(0, 3); lcd_printf_P(PSTR("%d/9"),mesh_point+1); #endif /* MESH_BED_CALIBRATION_SHOW_LCD */ if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um { kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); 10778: 8e ef ldi r24, 0xFE ; 254 1077a: 99 e3 ldi r25, 0x39 ; 57 1077c: 0e 94 3a 75 call 0xea74 ; 0xea74 10780: 0e 94 23 83 call 0x10646 ; 0x10646 10784: 80 91 69 12 lds r24, 0x1269 ; 0x801269 10788: 90 91 6a 12 lds r25, 0x126A ; 0x80126a 1078c: a0 91 6b 12 lds r26, 0x126B ; 0x80126b 10790: b0 91 6c 12 lds r27, 0x126C ; 0x80126c 10794: 80 93 0a 13 sts 0x130A, r24 ; 0x80130a 10798: 90 93 0b 13 sts 0x130B, r25 ; 0x80130b 1079c: a0 93 0c 13 sts 0x130C, r26 ; 0x80130c 107a0: b0 93 0d 13 sts 0x130D, r27 ; 0x80130d 107a4: e2 e0 ldi r30, 0x02 ; 2 107a6: f0 e0 ldi r31, 0x00 ; 0 107a8: fa 83 std Y+2, r31 ; 0x02 107aa: e9 83 std Y+1, r30 ; 0x01 static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow....."); for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) { // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); // Print the decrasing ID of the measurement point. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 107ac: c1 2c mov r12, r1 107ae: d1 2c mov r13, r1 107b0: 30 ea ldi r19, 0xA0 ; 160 107b2: e3 2e mov r14, r19 107b4: 30 e4 ldi r19, 0x40 ; 64 107b6: f3 2e mov r15, r19 go_to_current(homing_feedrate[Z_AXIS]/60); uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS; 107b8: 43 e0 ldi r20, 0x03 ; 3 107ba: b4 2e mov r11, r20 uint8_t iy = mesh_point / MESH_MEAS_NUM_X_POINTS; if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag 107bc: 52 e0 ldi r21, 0x02 ; 2 107be: 95 2e mov r9, r21 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); go_to_current(homing_feedrate[X_AXIS]/60); #ifdef MESH_BED_CALIBRATION_SHOW_LCD // display "point xx of yy" lcd_set_cursor(0, 3); lcd_printf_P(PSTR("%d/9"),mesh_point+1); 107c0: 04 e8 ldi r16, 0x84 ; 132 107c2: 11 e8 ldi r17, 0x81 ; 129 107c4: 67 e0 ldi r22, 0x07 ; 7 107c6: a6 2e mov r10, r22 mbl.set_z(0, 0, current_position[Z_AXIS]); } static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow....."); for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) { // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 107c8: 0e 94 41 65 call 0xca82 ; 0xca82 // Print the decrasing ID of the measurement point. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 107cc: c0 92 69 12 sts 0x1269, r12 ; 0x801269 107d0: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 107d4: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 107d8: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c go_to_current(homing_feedrate[Z_AXIS]/60); 107dc: 65 e5 ldi r22, 0x55 ; 85 107de: 75 e5 ldi r23, 0x55 ; 85 107e0: 85 e5 ldi r24, 0x55 ; 85 107e2: 91 e4 ldi r25, 0x41 ; 65 107e4: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS; 107e8: 29 81 ldd r18, Y+1 ; 0x01 107ea: 21 50 subi r18, 0x01 ; 1 107ec: 82 2f mov r24, r18 107ee: 6b 2d mov r22, r11 107f0: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> 107f4: 89 2e mov r8, r25 uint8_t iy = mesh_point / MESH_MEAS_NUM_X_POINTS; 107f6: 82 2f mov r24, r18 107f8: 0f 94 9b a4 call 0x34936 ; 0x34936 <__divmodqi4> 107fc: 78 2e mov r7, r24 if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag 107fe: 80 ff sbrs r24, 0 10800: 03 c0 rjmp .+6 ; 0x10808 10802: f9 2d mov r31, r9 10804: f8 19 sub r31, r8 10806: 8f 2e mov r8, r31 current_position[X_AXIS] = BED_X(ix * 3); 10808: 88 2d mov r24, r8 1080a: 88 0f add r24, r24 1080c: 88 0d add r24, r8 1080e: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 10812: 60 93 61 12 sts 0x1261, r22 ; 0x801261 10816: 70 93 62 12 sts 0x1262, r23 ; 0x801262 1081a: 80 93 63 12 sts 0x1263, r24 ; 0x801263 1081e: 90 93 64 12 sts 0x1264, r25 ; 0x801264 current_position[Y_AXIS] = BED_Y(iy * 3); 10822: 87 2d mov r24, r7 10824: 88 0f add r24, r24 10826: 87 0d add r24, r7 10828: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 1082c: 60 93 65 12 sts 0x1265, r22 ; 0x801265 10830: 70 93 66 12 sts 0x1266, r23 ; 0x801266 10834: 80 93 67 12 sts 0x1267, r24 ; 0x801267 10838: 90 93 68 12 sts 0x1268, r25 ; 0x801268 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 1083c: 65 e6 ldi r22, 0x65 ; 101 1083e: 72 e1 ldi r23, 0x12 ; 18 10840: 81 e6 ldi r24, 0x61 ; 97 10842: 92 e1 ldi r25, 0x12 ; 18 10844: 0e 94 1e 69 call 0xd23c ; 0xd23c go_to_current(homing_feedrate[X_AXIS]/60); 10848: 60 e0 ldi r22, 0x00 ; 0 1084a: 70 e0 ldi r23, 0x00 ; 0 1084c: 88 e4 ldi r24, 0x48 ; 72 1084e: 92 e4 ldi r25, 0x42 ; 66 10850: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec #ifdef MESH_BED_CALIBRATION_SHOW_LCD // display "point xx of yy" lcd_set_cursor(0, 3); 10854: 63 e0 ldi r22, 0x03 ; 3 10856: 80 e0 ldi r24, 0x00 ; 0 10858: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%d/9"),mesh_point+1); 1085c: 8a 81 ldd r24, Y+2 ; 0x02 1085e: 8f 93 push r24 10860: 99 81 ldd r25, Y+1 ; 0x01 10862: 9f 93 push r25 10864: 1f 93 push r17 10866: 0f 93 push r16 10868: 0e 94 0b 6f call 0xde16 ; 0xde16 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */ if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um 1086c: 43 e0 ldi r20, 0x03 ; 3 1086e: 60 e0 ldi r22, 0x00 ; 0 10870: 70 e0 ldi r23, 0x00 ; 0 10872: 80 e2 ldi r24, 0x20 ; 32 10874: 91 ec ldi r25, 0xC1 ; 193 10876: 0f 94 ed 7b call 0x2f7da ; 0x2f7da 1087a: 58 2e mov r5, r24 1087c: 0f 90 pop r0 1087e: 0f 90 pop r0 10880: 0f 90 pop r0 10882: 0f 90 pop r0 10884: 88 23 and r24, r24 10886: 09 f4 brne .+2 ; 0x1088a 10888: 77 cf rjmp .-274 ; 0x10778 1088a: a7 9c mul r10, r7 1088c: f0 01 movw r30, r0 1088e: 11 24 eor r1, r1 10890: e8 0d add r30, r8 10892: f1 1d adc r31, r1 10894: ee 0f add r30, r30 10896: ff 1f adc r31, r31 10898: ee 0f add r30, r30 1089a: ff 1f adc r31, r31 1089c: e7 5f subi r30, 0xF7 ; 247 1089e: fc 4e sbci r31, 0xEC ; 236 108a0: 80 91 69 12 lds r24, 0x1269 ; 0x801269 108a4: 90 91 6a 12 lds r25, 0x126A ; 0x80126a 108a8: a0 91 6b 12 lds r26, 0x126B ; 0x80126b 108ac: b0 91 6c 12 lds r27, 0x126C ; 0x80126c 108b0: 81 83 std Z+1, r24 ; 0x01 108b2: 92 83 std Z+2, r25 ; 0x02 108b4: a3 83 std Z+3, r26 ; 0x03 108b6: b4 83 std Z+4, r27 ; 0x04 108b8: e9 81 ldd r30, Y+1 ; 0x01 108ba: fa 81 ldd r31, Y+2 ; 0x02 108bc: 31 96 adiw r30, 0x01 ; 1 108be: fa 83 std Y+2, r31 ; 0x02 108c0: e9 83 std Y+1, r30 ; 0x01 kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); } mbl.set_z(0, 0, current_position[Z_AXIS]); } static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow....."); for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) { 108c2: 3a 97 sbiw r30, 0x0a ; 10 108c4: 09 f0 breq .+2 ; 0x108c8 108c6: 80 cf rjmp .-256 ; 0x107c8 mbl.set_z(ix, iy, current_position[Z_AXIS]); } { // Verify the span of the Z values. float zmin = mbl.z_values[0][0]; 108c8: 60 90 0a 13 lds r6, 0x130A ; 0x80130a 108cc: 70 90 0b 13 lds r7, 0x130B ; 0x80130b 108d0: 80 90 0c 13 lds r8, 0x130C ; 0x80130c 108d4: 90 90 0d 13 lds r9, 0x130D ; 0x80130d float zmax = zmin; 108d8: 46 2c mov r4, r6 108da: a7 2c mov r10, r7 108dc: b8 2c mov r11, r8 108de: 29 2c mov r2, r9 mbl.set_z(ix, iy, current_position[Z_AXIS]); } { // Verify the span of the Z values. float zmin = mbl.z_values[0][0]; 108e0: 1e 82 std Y+6, r1 ; 0x06 108e2: 1d 82 std Y+5, r1 ; 0x05 108e4: 09 e0 ldi r16, 0x09 ; 9 108e6: 13 e1 ldi r17, 0x13 ; 19 108e8: 8d 81 ldd r24, Y+5 ; 0x05 108ea: 9e 81 ldd r25, Y+6 ; 0x06 108ec: 86 5f subi r24, 0xF6 ; 246 108ee: 9c 4e sbci r25, 0xEC ; 236 108f0: 9a 83 std Y+2, r25 ; 0x02 108f2: 89 83 std Y+1, r24 ; 0x01 108f4: 93 e0 ldi r25, 0x03 ; 3 108f6: 39 2e mov r3, r25 float zmax = zmin; for (int8_t j = 0; j < 3; ++ j) for (int8_t i = 0; i < 3; ++ i) { zmin = min(zmin, mbl.z_values[j][i]); 108f8: e9 81 ldd r30, Y+1 ; 0x01 108fa: fa 81 ldd r31, Y+2 ; 0x02 108fc: c1 90 ld r12, Z+ 108fe: d1 90 ld r13, Z+ 10900: e1 90 ld r14, Z+ 10902: f1 90 ld r15, Z+ 10904: fa 83 std Y+2, r31 ; 0x02 10906: e9 83 std Y+1, r30 ; 0x01 10908: 93 01 movw r18, r6 1090a: a4 01 movw r20, r8 1090c: c7 01 movw r24, r14 1090e: b6 01 movw r22, r12 10910: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 10914: 18 16 cp r1, r24 10916: 14 f0 brlt .+4 ; 0x1091c 10918: 36 01 movw r6, r12 1091a: 47 01 movw r8, r14 zmax = max(zmax, mbl.z_values[j][i]); 1091c: 24 2d mov r18, r4 1091e: 3a 2d mov r19, r10 10920: 4b 2d mov r20, r11 10922: 52 2d mov r21, r2 10924: c7 01 movw r24, r14 10926: b6 01 movw r22, r12 10928: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1092c: 87 fd sbrc r24, 7 1092e: 04 c0 rjmp .+8 ; 0x10938 10930: 4c 2c mov r4, r12 10932: ad 2c mov r10, r13 10934: be 2c mov r11, r14 10936: 2f 2c mov r2, r15 10938: 3a 94 dec r3 { // Verify the span of the Z values. float zmin = mbl.z_values[0][0]; float zmax = zmin; for (int8_t j = 0; j < 3; ++ j) for (int8_t i = 0; i < 3; ++ i) { 1093a: 31 10 cpse r3, r1 1093c: dd cf rjmp .-70 ; 0x108f8 1093e: 8d 81 ldd r24, Y+5 ; 0x05 10940: 9e 81 ldd r25, Y+6 ; 0x06 10942: 4c 96 adiw r24, 0x1c ; 28 10944: 9e 83 std Y+6, r25 ; 0x06 10946: 8d 83 std Y+5, r24 ; 0x05 } { // Verify the span of the Z values. float zmin = mbl.z_values[0][0]; float zmax = zmin; for (int8_t j = 0; j < 3; ++ j) 10948: 84 35 cpi r24, 0x54 ; 84 1094a: 91 05 cpc r25, r1 1094c: 59 f6 brne .-106 ; 0x108e4 for (int8_t i = 0; i < 3; ++ i) { zmin = min(zmin, mbl.z_values[j][i]); zmax = max(zmax, mbl.z_values[j][i]); } if (zmax - zmin > 3.f) { 1094e: 93 01 movw r18, r6 10950: a4 01 movw r20, r8 10952: 64 2d mov r22, r4 10954: 7a 2d mov r23, r10 10956: 8b 2d mov r24, r11 10958: 92 2d mov r25, r2 1095a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1095e: 20 e0 ldi r18, 0x00 ; 0 10960: 30 e0 ldi r19, 0x00 ; 0 10962: 40 e4 ldi r20, 0x40 ; 64 10964: 50 e4 ldi r21, 0x40 ; 64 10966: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1096a: 18 16 cp r1, r24 1096c: 2c f5 brge .+74 ; 0x109b8 // The span of the Z offsets is extreme. Give up. // Homing failed on some of the points. SERIAL_PROTOCOLLNPGM("Exreme span of the Z values!"); 1096e: 87 e6 ldi r24, 0x67 ; 103 10970: 91 e8 ldi r25, 0x81 ; 129 10972: 0e 94 bd 7c call 0xf97a ; 0xf97a // When calling this function, the X, Y, Z axes should be already homed, // and the world2machine correction matrix should be active. // Returns false if the reference values are more than 3mm far away. bool sample_mesh_and_store_reference() { bool result = false; 10976: 51 2c mov r5, r1 10978: fc 81 ldd r31, Y+4 ; 0x04 1097a: f0 93 77 02 sts 0x0277, r31 ; 0x800277 <_ZL14check_endstops.lto_priv.387> go_home_with_z_lift(); result = true; end: enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 1097e: 8b 81 ldd r24, Y+3 ; 0x03 10980: 0f 94 88 25 call 0x24b10 ; 0x24b10 #ifdef TMC2130 tmc2130_home_exit(); #endif return result; } 10984: 85 2d mov r24, r5 10986: 26 96 adiw r28, 0x06 ; 6 10988: 0f b6 in r0, 0x3f ; 63 1098a: f8 94 cli 1098c: de bf out 0x3e, r29 ; 62 1098e: 0f be out 0x3f, r0 ; 63 10990: cd bf out 0x3d, r28 ; 61 10992: df 91 pop r29 10994: cf 91 pop r28 10996: 1f 91 pop r17 10998: 0f 91 pop r16 1099a: ff 90 pop r15 1099c: ef 90 pop r14 1099e: df 90 pop r13 109a0: cf 90 pop r12 109a2: bf 90 pop r11 109a4: af 90 pop r10 109a6: 9f 90 pop r9 109a8: 8f 90 pop r8 109aa: 7f 90 pop r7 109ac: 6f 90 pop r6 109ae: 5f 90 pop r5 109b0: 4f 90 pop r4 109b2: 3f 90 pop r3 109b4: 2f 90 pop r2 109b6: 08 95 ret // Store the correction values to EEPROM. // Offsets of the Z heiths of the calibration points from the first point. // The offsets are saved as 16bit signed int, scaled to tenths of microns. { uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER; for (int8_t j = 0; j < 3; ++ j) 109b8: 19 82 std Y+1, r1 ; 0x01 // Store the correction values to EEPROM. // Offsets of the Z heiths of the calibration points from the first point. // The offsets are saved as 16bit signed int, scaled to tenths of microns. { uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER; 109ba: 85 ec ldi r24, 0xC5 ; 197 109bc: e8 2e mov r14, r24 109be: 8f e0 ldi r24, 0x0F ; 15 109c0: f8 2e mov r15, r24 109c2: 68 01 movw r12, r16 for (int8_t j = 0; j < 3; ++ j) for (int8_t i = 0; i < 3; ++ i) { 109c4: 1d 82 std Y+5, r1 ; 0x05 if (i == 0 && j == 0) 109c6: 9d 81 ldd r25, Y+5 ; 0x05 109c8: 91 11 cpse r25, r1 109ca: 03 c0 rjmp .+6 ; 0x109d2 109cc: e9 81 ldd r30, Y+1 ; 0x01 109ce: ee 23 and r30, r30 109d0: 29 f1 breq .+74 ; 0x10a1c continue; float dif = mbl.z_values[j][i] - mbl.z_values[0][0]; 109d2: 20 91 0a 13 lds r18, 0x130A ; 0x80130a 109d6: 30 91 0b 13 lds r19, 0x130B ; 0x80130b 109da: 40 91 0c 13 lds r20, 0x130C ; 0x80130c 109de: 50 91 0d 13 lds r21, 0x130D ; 0x80130d 109e2: f6 01 movw r30, r12 109e4: 61 81 ldd r22, Z+1 ; 0x01 109e6: 72 81 ldd r23, Z+2 ; 0x02 109e8: 83 81 ldd r24, Z+3 ; 0x03 109ea: 94 81 ldd r25, Z+4 ; 0x04 109ec: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> int16_t dif_quantized = int16_t(floor(dif * 100.f + 0.5f)); 109f0: 20 e0 ldi r18, 0x00 ; 0 109f2: 30 e0 ldi r19, 0x00 ; 0 109f4: 48 ec ldi r20, 0xC8 ; 200 109f6: 52 e4 ldi r21, 0x42 ; 66 109f8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 109fc: 20 e0 ldi r18, 0x00 ; 0 109fe: 30 e0 ldi r19, 0x00 ; 0 10a00: 40 e0 ldi r20, 0x00 ; 0 10a02: 5f e3 ldi r21, 0x3F ; 63 10a04: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 10a08: 0f 94 af a6 call 0x34d5e ; 0x34d5e 10a0c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 10a10: c7 01 movw r24, r14 10a12: 0f 94 22 a4 call 0x34844 ; 0x34844 SERIAL_ECHOPGM(", read: "); MYSERIAL.print(dif2, 5); SERIAL_ECHOLNPGM(""); } #endif addr += 2; 10a16: f2 e0 ldi r31, 0x02 ; 2 10a18: ef 0e add r14, r31 10a1a: f1 1c adc r15, r1 10a1c: 84 e0 ldi r24, 0x04 ; 4 10a1e: c8 0e add r12, r24 10a20: d1 1c adc r13, r1 10a22: 9d 81 ldd r25, Y+5 ; 0x05 10a24: 9f 5f subi r25, 0xFF ; 255 10a26: 9d 83 std Y+5, r25 ; 0x05 // Offsets of the Z heiths of the calibration points from the first point. // The offsets are saved as 16bit signed int, scaled to tenths of microns. { uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER; for (int8_t j = 0; j < 3; ++ j) for (int8_t i = 0; i < 3; ++ i) { 10a28: 93 30 cpi r25, 0x03 ; 3 10a2a: 69 f6 brne .-102 ; 0x109c6 10a2c: 04 5e subi r16, 0xE4 ; 228 10a2e: 1f 4f sbci r17, 0xFF ; 255 10a30: e9 81 ldd r30, Y+1 ; 0x01 10a32: ef 5f subi r30, 0xFF ; 255 10a34: e9 83 std Y+1, r30 ; 0x01 // Store the correction values to EEPROM. // Offsets of the Z heiths of the calibration points from the first point. // The offsets are saved as 16bit signed int, scaled to tenths of microns. { uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER; for (int8_t j = 0; j < 3; ++ j) 10a36: e3 30 cpi r30, 0x03 ; 3 10a38: 21 f6 brne .-120 ; 0x109c2 #endif addr += 2; } } mbl.reset(); 10a3a: 0f 94 e3 7b call 0x2f7c6 ; 0x2f7c6 go_home_with_z_lift(); 10a3e: 0e 94 3d 6a call 0xd47a ; 0xd47a 10a42: 9a cf rjmp .-204 ; 0x10978 00010a44 : // Confirm the execution of a command, if sent from a serial line. // Execution of a command from a SD card will not be confirmed. void ClearToSend() { previous_millis_cmd.start(); 10a44: 88 e4 ldi r24, 0x48 ; 72 10a46: 93 e0 ldi r25, 0x03 ; 3 10a48: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> if (buflen && ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR))) 10a4c: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 10a50: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 10a54: 89 2b or r24, r25 10a56: 79 f0 breq .+30 ; 0x10a76 10a58: e0 91 38 12 lds r30, 0x1238 ; 0x801238 10a5c: f0 91 39 12 lds r31, 0x1239 ; 0x801239 10a60: e5 5b subi r30, 0xB5 ; 181 10a62: ff 4e sbci r31, 0xEF ; 239 10a64: 80 81 ld r24, Z 10a66: 81 30 cpi r24, 0x01 ; 1 10a68: 11 f0 breq .+4 ; 0x10a6e 10a6a: 86 30 cpi r24, 0x06 ; 6 10a6c: 21 f4 brne .+8 ; 0x10a76 SERIAL_PROTOCOLLNRPGM(MSG_OK); 10a6e: 80 ef ldi r24, 0xF0 ; 240 10a70: 99 e6 ldi r25, 0x69 ; 105 10a72: 0c 94 bd 7c jmp 0xf97a ; 0xf97a } 10a76: 08 95 ret 00010a78 : return false; } void cmdqueue_reset() { while (buflen) 10a78: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 10a7c: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 10a80: 89 2b or r24, r25 10a82: 29 f0 breq .+10 ; 0x10a8e { // printf_P(PSTR("dumping: \"%s\" of type %u\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE); ClearToSend(); 10a84: 0e 94 22 85 call 0x10a44 ; 0x10a44 cmdqueue_pop_front(); 10a88: 0e 94 43 79 call 0xf286 ; 0xf286 10a8c: f5 cf rjmp .-22 ; 0x10a78 } bufindr = 0; 10a8e: 10 92 39 12 sts 0x1239, r1 ; 0x801239 10a92: 10 92 38 12 sts 0x1238, r1 ; 0x801238 bufindw = 0; 10a96: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 10a9a: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> //commands are removed from command queue after process_command() function is finished //reseting command queue and enqueing new commands during some (usually long running) command processing would cause that new commands are immediately removed from queue (or damaged) //this will ensure that all new commands which are enqueued after cmdqueue reset, will be always executed cmdbuffer_front_already_processed = true; 10a9e: 81 e0 ldi r24, 0x01 ; 1 10aa0: 80 93 53 12 sts 0x1253, r24 ; 0x801253 } 10aa4: 08 95 ret 00010aa6 : } // G81_M420 Mesh bed leveling status static void gcode_G81_M420() { 10aa6: ef 92 push r14 10aa8: ff 92 push r15 10aaa: 0f 93 push r16 10aac: 1f 93 push r17 10aae: cf 93 push r28 10ab0: df 93 push r29 if (mbl.active) { 10ab2: 80 91 09 13 lds r24, 0x1309 ; 0x801309 10ab6: 88 23 and r24, r24 10ab8: 89 f1 breq .+98 ; 0x10b1c } } } void mesh_bed_leveling::print() { SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(MESH_NUM_X_POINTS) "," STRINGIFY(MESH_NUM_Y_POINTS)); 10aba: 80 e9 ldi r24, 0x90 ; 144 10abc: 97 e7 ldi r25, 0x77 ; 119 10abe: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLLNPGM("Z search height: " STRINGIFY(MESH_HOME_Z_SEARCH)); 10ac2: 8a e7 ldi r24, 0x7A ; 122 10ac4: 97 e7 ldi r25, 0x77 ; 119 10ac6: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLLNPGM("Measured points:"); 10aca: 89 e6 ldi r24, 0x69 ; 105 10acc: 97 e7 ldi r25, 0x77 ; 119 10ace: 0e 94 bd 7c call 0xf97a ; 0xf97a for (uint8_t y = MESH_NUM_Y_POINTS; y-- > 0;) { 10ad2: c7 e0 ldi r28, 0x07 ; 7 10ad4: dc e1 ldi r29, 0x1C ; 28 10ad6: c1 50 subi r28, 0x01 ; 1 10ad8: 58 f1 brcs .+86 ; 0x10b30 10ada: cd 9f mul r28, r29 10adc: 70 01 movw r14, r0 10ade: 11 24 eor r1, r1 10ae0: 01 e0 ldi r16, 0x01 ; 1 10ae2: 10 e0 ldi r17, 0x00 ; 0 for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { SERIAL_PROTOCOLPGM(" "); 10ae4: 86 e6 ldi r24, 0x66 ; 102 10ae6: 97 e7 ldi r25, 0x77 ; 119 10ae8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL_F(z_values[y][x], 5); 10aec: f8 01 movw r30, r16 10aee: ee 0f add r30, r30 10af0: ff 1f adc r31, r31 10af2: ee 0f add r30, r30 10af4: ff 1f adc r31, r31 10af6: ee 0d add r30, r14 10af8: ff 1d adc r31, r15 10afa: ea 5f subi r30, 0xFA ; 250 10afc: fc 4e sbci r31, 0xEC ; 236 10afe: 60 81 ld r22, Z 10b00: 71 81 ldd r23, Z+1 ; 0x01 10b02: 82 81 ldd r24, Z+2 ; 0x02 10b04: 93 81 ldd r25, Z+3 ; 0x03 10b06: 45 e0 ldi r20, 0x05 ; 5 10b08: 0e 94 46 7a call 0xf48c ; 0xf48c 10b0c: 0f 5f subi r16, 0xFF ; 255 10b0e: 1f 4f sbci r17, 0xFF ; 255 void mesh_bed_leveling::print() { SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(MESH_NUM_X_POINTS) "," STRINGIFY(MESH_NUM_Y_POINTS)); SERIAL_PROTOCOLLNPGM("Z search height: " STRINGIFY(MESH_HOME_Z_SEARCH)); SERIAL_PROTOCOLLNPGM("Measured points:"); for (uint8_t y = MESH_NUM_Y_POINTS; y-- > 0;) { for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { 10b10: 08 30 cpi r16, 0x08 ; 8 10b12: 11 05 cpc r17, r1 10b14: 39 f7 brne .-50 ; 0x10ae4 SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOL_F(z_values[y][x], 5); } SERIAL_PROTOCOLLN(); 10b16: 0e 94 bc 7a call 0xf578 ; 0xf578 10b1a: dd cf rjmp .-70 ; 0x10ad6 mbl.print(); } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active."); 10b1c: 8d e9 ldi r24, 0x9D ; 157 10b1e: 97 e7 ldi r25, 0x77 ; 119 return; } 10b20: df 91 pop r29 10b22: cf 91 pop r28 10b24: 1f 91 pop r17 10b26: 0f 91 pop r16 10b28: ff 90 pop r15 10b2a: ef 90 pop r14 static void gcode_G81_M420() { if (mbl.active) { mbl.print(); } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active."); 10b2c: 0c 94 bd 7c jmp 0xf97a ; 0xf97a return; } 10b30: df 91 pop r29 10b32: cf 91 pop r28 10b34: 1f 91 pop r17 10b36: 0f 91 pop r16 10b38: ff 90 pop r15 10b3a: ef 90 pop r14 10b3c: 08 95 ret 00010b3e : return (k >= 0? la10c_convert(k): -1); } float la10c_jerk(float j) { 10b3e: cf 92 push r12 10b40: df 92 push r13 10b42: ef 92 push r14 10b44: ff 92 push r15 10b46: 6b 01 movw r12, r22 10b48: 7c 01 movw r14, r24 la10c_orig_jerk = j; 10b4a: c0 92 27 03 sts 0x0327, r12 ; 0x800327 10b4e: d0 92 28 03 sts 0x0328, r13 ; 0x800328 10b52: e0 92 29 03 sts 0x0329, r14 ; 0x800329 10b56: f0 92 2a 03 sts 0x032A, r15 ; 0x80032a if(la10c_mode != LA10C_LA10) 10b5a: 80 91 43 03 lds r24, 0x0343 ; 0x800343 10b5e: 82 30 cpi r24, 0x02 ; 2 10b60: b1 f4 brne .+44 ; 0x10b8e return j; // check for a compatible range of values prior to convert (be sure that // a higher E-jerk would still be compatible wrt the E accell range) if(j < 4.5 && cs.max_acceleration_mm_per_s2_normal[E_AXIS] < 2000) 10b62: 20 e0 ldi r18, 0x00 ; 0 10b64: 30 e0 ldi r19, 0x00 ; 0 10b66: 40 e9 ldi r20, 0x90 ; 144 10b68: 50 e4 ldi r21, 0x40 ; 64 10b6a: c7 01 movw r24, r14 10b6c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10b70: 87 ff sbrs r24, 7 10b72: 14 c0 rjmp .+40 ; 0x10b9c 10b74: 80 91 97 0d lds r24, 0x0D97 ; 0x800d97 10b78: 90 91 98 0d lds r25, 0x0D98 ; 0x800d98 10b7c: a0 91 99 0d lds r26, 0x0D99 ; 0x800d99 10b80: b0 91 9a 0d lds r27, 0x0D9A ; 0x800d9a 10b84: 80 3d cpi r24, 0xD0 ; 208 10b86: 97 40 sbci r25, 0x07 ; 7 10b88: a1 05 cpc r26, r1 10b8a: b1 05 cpc r27, r1 10b8c: 20 f5 brcc .+72 ; 0x10bd6 j; SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: "); SERIAL_ECHOLN(j); return j; } 10b8e: c7 01 movw r24, r14 10b90: b6 01 movw r22, r12 10b92: ff 90 pop r15 10b94: ef 90 pop r14 10b96: df 90 pop r13 10b98: cf 90 pop r12 10b9a: 08 95 ret // bring low E-jerk values into equivalent LA 1.5 values by // flattening the response in the (0.3-4.5) range using a piecewise // function. Is it truly worth to preserve the difference between // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless. j = j < 0.3? j * 11.5: 10b9c: 2a e9 ldi r18, 0x9A ; 154 10b9e: 39 e9 ldi r19, 0x99 ; 153 10ba0: 49 e9 ldi r20, 0x99 ; 153 10ba2: 5e e3 ldi r21, 0x3E ; 62 10ba4: c7 01 movw r24, r14 10ba6: b6 01 movw r22, r12 10ba8: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10bac: 87 ff sbrs r24, 7 10bae: 0a c0 rjmp .+20 ; 0x10bc4 10bb0: 20 e0 ldi r18, 0x00 ; 0 10bb2: 30 e0 ldi r19, 0x00 ; 0 10bb4: 48 e3 ldi r20, 0x38 ; 56 10bb6: 51 e4 ldi r21, 0x41 ; 65 10bb8: c7 01 movw r24, r14 10bba: b6 01 movw r22, r12 10bbc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 10bc0: 6b 01 movw r12, r22 10bc2: 7c 01 movw r14, r24 j < 4.5? j * 0.25 + 3.375: j; SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: "); 10bc4: 84 e7 ldi r24, 0x74 ; 116 10bc6: 94 e7 ldi r25, 0x74 ; 116 10bc8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(j); 10bcc: c7 01 movw r24, r14 10bce: b6 01 movw r22, r12 10bd0: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 10bd4: dc cf rjmp .-72 ; 0x10b8e // bring low E-jerk values into equivalent LA 1.5 values by // flattening the response in the (0.3-4.5) range using a piecewise // function. Is it truly worth to preserve the difference between // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless. j = j < 0.3? j * 11.5: 10bd6: 2a e9 ldi r18, 0x9A ; 154 10bd8: 39 e9 ldi r19, 0x99 ; 153 10bda: 49 e9 ldi r20, 0x99 ; 153 10bdc: 5e e3 ldi r21, 0x3E ; 62 10bde: c7 01 movw r24, r14 10be0: b6 01 movw r22, r12 10be2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10be6: 87 fd sbrc r24, 7 10be8: e3 cf rjmp .-58 ; 0x10bb0 j < 4.5? j * 0.25 + 3.375: 10bea: 20 e0 ldi r18, 0x00 ; 0 10bec: 30 e0 ldi r19, 0x00 ; 0 10bee: 40 e8 ldi r20, 0x80 ; 128 10bf0: 5e e3 ldi r21, 0x3E ; 62 10bf2: c7 01 movw r24, r14 10bf4: b6 01 movw r22, r12 10bf6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> // bring low E-jerk values into equivalent LA 1.5 values by // flattening the response in the (0.3-4.5) range using a piecewise // function. Is it truly worth to preserve the difference between // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless. j = j < 0.3? j * 11.5: 10bfa: 20 e0 ldi r18, 0x00 ; 0 10bfc: 30 e0 ldi r19, 0x00 ; 0 10bfe: 48 e5 ldi r20, 0x58 ; 88 10c00: 50 e4 ldi r21, 0x40 ; 64 10c02: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 10c06: dc cf rjmp .-72 ; 0x10bc0 00010c08 : return la10c_mode; } void la10c_mode_change(LA10C_MODE mode) { 10c08: cf 92 push r12 10c0a: df 92 push r13 10c0c: ef 92 push r14 10c0e: ff 92 push r15 10c10: cf 93 push r28 if(mode == la10c_mode) return; 10c12: 90 91 43 03 lds r25, 0x0343 ; 0x800343 10c16: 98 17 cp r25, r24 10c18: b9 f1 breq .+110 ; 0x10c88 10c1a: c8 2f mov r28, r24 // always restore to the last unadjusted E-jerk value if(la10c_orig_jerk) 10c1c: c0 90 27 03 lds r12, 0x0327 ; 0x800327 10c20: d0 90 28 03 lds r13, 0x0328 ; 0x800328 10c24: e0 90 29 03 lds r14, 0x0329 ; 0x800329 10c28: f0 90 2a 03 lds r15, 0x032A ; 0x80032a 10c2c: 20 e0 ldi r18, 0x00 ; 0 10c2e: 30 e0 ldi r19, 0x00 ; 0 10c30: a9 01 movw r20, r18 10c32: c7 01 movw r24, r14 10c34: b6 01 movw r22, r12 10c36: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 10c3a: 88 23 and r24, r24 10c3c: 41 f0 breq .+16 ; 0x10c4e cs.max_jerk[E_AXIS] = la10c_orig_jerk; 10c3e: c0 92 bb 0d sts 0x0DBB, r12 ; 0x800dbb 10c42: d0 92 bc 0d sts 0x0DBC, r13 ; 0x800dbc 10c46: e0 92 bd 0d sts 0x0DBD, r14 ; 0x800dbd 10c4a: f0 92 be 0d sts 0x0DBE, r15 ; 0x800dbe SERIAL_ECHOPGM("LA10C: Linear Advance mode: "); 10c4e: 87 e5 ldi r24, 0x57 ; 87 10c50: 94 e7 ldi r25, 0x74 ; 116 10c52: 0e 94 c4 7a call 0xf588 ; 0xf588 switch(mode) 10c56: c1 30 cpi r28, 0x01 ; 1 10c58: 11 f1 breq .+68 ; 0x10c9e 10c5a: e0 f0 brcs .+56 ; 0x10c94 10c5c: c2 30 cpi r28, 0x02 ; 2 10c5e: 11 f1 breq .+68 ; 0x10ca4 { case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break; case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break; case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break; } la10c_mode = mode; 10c60: c0 93 43 03 sts 0x0343, r28 ; 0x800343 // adjust the E-jerk if needed cs.max_jerk[E_AXIS] = la10c_jerk(cs.max_jerk[E_AXIS]); 10c64: 60 91 bb 0d lds r22, 0x0DBB ; 0x800dbb 10c68: 70 91 bc 0d lds r23, 0x0DBC ; 0x800dbc 10c6c: 80 91 bd 0d lds r24, 0x0DBD ; 0x800dbd 10c70: 90 91 be 0d lds r25, 0x0DBE ; 0x800dbe 10c74: 0e 94 9f 85 call 0x10b3e ; 0x10b3e 10c78: 60 93 bb 0d sts 0x0DBB, r22 ; 0x800dbb 10c7c: 70 93 bc 0d sts 0x0DBC, r23 ; 0x800dbc 10c80: 80 93 bd 0d sts 0x0DBD, r24 ; 0x800dbd 10c84: 90 93 be 0d sts 0x0DBE, r25 ; 0x800dbe } 10c88: cf 91 pop r28 10c8a: ff 90 pop r15 10c8c: ef 90 pop r14 10c8e: df 90 pop r13 10c90: cf 90 pop r12 10c92: 08 95 ret cs.max_jerk[E_AXIS] = la10c_orig_jerk; SERIAL_ECHOPGM("LA10C: Linear Advance mode: "); switch(mode) { case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break; 10c94: 8f e4 ldi r24, 0x4F ; 79 10c96: 94 e7 ldi r25, 0x74 ; 116 case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break; case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break; 10c98: 0e 94 bd 7c call 0xf97a ; 0xf97a 10c9c: e1 cf rjmp .-62 ; 0x10c60 SERIAL_ECHOPGM("LA10C: Linear Advance mode: "); switch(mode) { case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break; case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break; 10c9e: 8b e4 ldi r24, 0x4B ; 75 10ca0: 94 e7 ldi r25, 0x74 ; 116 10ca2: fa cf rjmp .-12 ; 0x10c98 case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break; 10ca4: 87 e4 ldi r24, 0x47 ; 71 10ca6: 94 e7 ldi r25, 0x74 ; 116 10ca8: f7 cf rjmp .-18 ; 0x10c98 00010caa : bool IsStopped() { return Stopped; }; void finishAndDisableSteppers() { st_synchronize(); 10caa: 0f 94 fb 1a call 0x235f6 ; 0x235f6 disable_x(); 10cae: 17 9a sbi 0x02, 7 ; 2 10cb0: e9 e3 ldi r30, 0x39 ; 57 10cb2: f6 e0 ldi r31, 0x06 ; 6 10cb4: 10 82 st Z, r1 disable_y(); 10cb6: 16 9a sbi 0x02, 6 ; 2 10cb8: 11 82 std Z+1, r1 ; 0x01 disable_z(); disable_e0(); 10cba: 14 9a sbi 0x02, 4 ; 2 }; // Explicitly set/get/reset the interpretation mode for la10c_value() void la10c_mode_change(LA10C_MODE mode); LA10C_MODE la10c_mode_get(); static inline void la10c_reset() { la10c_mode_change(LA10C_UNKNOWN); } 10cbc: 80 e0 ldi r24, 0x00 ; 0 10cbe: 0e 94 04 86 call 0x10c08 ; 0x10c08 return percent_done; } static void print_time_remaining_init() { print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; 10cc2: 8f ef ldi r24, 0xFF ; 255 10cc4: 9f ef ldi r25, 0xFF ; 255 10cc6: 90 93 73 02 sts 0x0273, r25 ; 0x800273 10cca: 80 93 72 02 sts 0x0272, r24 ; 0x800272 print_percent_done_normal = PRINT_PERCENT_DONE_INIT; 10cce: 2f ef ldi r18, 0xFF ; 255 10cd0: 20 93 6f 02 sts 0x026F, r18 ; 0x80026f print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; 10cd4: 90 93 3e 02 sts 0x023E, r25 ; 0x80023e 10cd8: 80 93 3d 02 sts 0x023D, r24 ; 0x80023d print_percent_done_silent = PRINT_PERCENT_DONE_INIT; 10cdc: 20 93 3f 02 sts 0x023F, r18 ; 0x80023f print_time_to_change_normal = PRINT_TIME_REMAINING_INIT; 10ce0: 90 93 71 02 sts 0x0271, r25 ; 0x800271 10ce4: 80 93 70 02 sts 0x0270, r24 ; 0x800270 print_time_to_change_silent = PRINT_TIME_REMAINING_INIT; 10ce8: 90 93 3c 02 sts 0x023C, r25 ; 0x80023c 10cec: 80 93 3b 02 sts 0x023B, r24 ; 0x80023b la10c_reset(); #endif //in the end of print set estimated time to end of print and extruders used during print to default values for next print print_time_remaining_init(); } 10cf0: 08 95 ret 00010cf2 : SERIAL_ECHOLNRPGM(emergency_serial_dump? _N("enabled"): _N("disabled")); } } void __attribute__((noinline)) serial_dump_and_reset(dump_crash_reason reason) { 10cf2: 18 2f mov r17, r24 uint16_t sp; uint32_t pc; // we're being called from a live state, so shut off interrupts ... cli(); 10cf4: f8 94 cli // sample SP/PC sp = SP; 10cf6: cd b7 in r28, 0x3d ; 61 10cf8: de b7 in r29, 0x3e ; 62 "rcall .\n" "pop %A0\n" "pop %B0\n" "pop %C0\n" : "=&r" (ret) ); 10cfa: 00 d0 rcall .+0 ; 0x10cfc 10cfc: cf 90 pop r12 10cfe: df 90 pop r13 10d00: ef 90 pop r14 10d02: 88 e1 ldi r24, 0x18 ; 24 10d04: 99 e2 ldi r25, 0x29 ; 41 10d06: 0f b6 in r0, 0x3f ; 63 10d08: f8 94 cli 10d0a: a8 95 wdr 10d0c: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 10d10: 0f be out 0x3f, r0 ; 63 10d12: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> // extend WDT long enough to allow writing the entire stream wdt_enable(WDTO_8S); // ... and heaters WRITE(FAN_PIN, HIGH); 10d16: 9f b7 in r25, 0x3f ; 63 10d18: f8 94 cli 10d1a: e2 e0 ldi r30, 0x02 ; 2 10d1c: f1 e0 ldi r31, 0x01 ; 1 10d1e: 80 81 ld r24, Z 10d20: 88 60 ori r24, 0x08 ; 8 10d22: 80 83 st Z, r24 10d24: 9f bf out 0x3f, r25 ; 63 disable_heater(); 10d26: 0f 94 05 11 call 0x2220a ; 0x2220a // this function can also be called from within a corrupted state, so not use // printf family of functions that use the heap or grow the stack. SERIAL_ECHOLNPGM("D23 - emergency serial dump"); 10d2a: 86 e0 ldi r24, 0x06 ; 6 10d2c: 94 e7 ldi r25, 0x74 ; 116 10d2e: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_ECHOPGM("error: "); 10d32: 8e ef ldi r24, 0xFE ; 254 10d34: 93 e7 ldi r25, 0x73 ; 115 10d36: 0e 94 c4 7a call 0xf588 ; 0xf588 print((long) c, base); } void MarlinSerial::print(unsigned char b, int base) { print((unsigned long) b, base); 10d3a: 61 2f mov r22, r17 10d3c: 70 e0 ldi r23, 0x00 ; 0 10d3e: 90 e0 ldi r25, 0x00 ; 0 10d40: 80 e0 ldi r24, 0x00 ; 0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 10d42: 4a e0 ldi r20, 0x0A ; 10 10d44: 0e 94 c5 79 call 0xf38a ; 0xf38a MYSERIAL.print((uint8_t)reason, DEC); SERIAL_ECHOPGM(" 0x"); 10d48: 8a ef ldi r24, 0xFA ; 250 10d4a: 93 e7 ldi r25, 0x73 ; 115 10d4c: 0e 94 c4 7a call 0xf588 ; 0xf588 // we're being called from a live state, so shut off interrupts ... cli(); // sample SP/PC sp = SP; pc = GETPC(); 10d50: 8e 2d mov r24, r14 10d52: b6 01 movw r22, r12 10d54: 90 e0 ldi r25, 0x00 ; 0 10d56: 40 e1 ldi r20, 0x10 ; 16 10d58: 0e 94 c5 79 call 0xf38a ; 0xf38a SERIAL_ECHOLNPGM("D23 - emergency serial dump"); SERIAL_ECHOPGM("error: "); MYSERIAL.print((uint8_t)reason, DEC); SERIAL_ECHOPGM(" 0x"); MYSERIAL.print(pc, HEX); SERIAL_ECHOPGM(" 0x"); 10d5c: 86 ef ldi r24, 0xF6 ; 246 10d5e: 93 e7 ldi r25, 0x73 ; 115 10d60: 0e 94 c4 7a call 0xf588 ; 0xf588 print((long) n, base); } void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); 10d64: be 01 movw r22, r28 10d66: 90 e0 ldi r25, 0x00 ; 0 10d68: 80 e0 ldi r24, 0x00 ; 0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 10d6a: 40 e1 ldi r20, 0x10 ; 16 10d6c: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::println(unsigned int n, int base) { print(n, base); println(); 10d70: 0e 94 bc 7a call 0xf578 ; 0xf578 MYSERIAL.println(sp, HEX); print_mem(0, RAMEND+1, dcode_mem_t::sram); 10d74: 40 e0 ldi r20, 0x00 ; 0 10d76: 60 e0 ldi r22, 0x00 ; 0 10d78: 72 e2 ldi r23, 0x22 ; 34 10d7a: 90 e0 ldi r25, 0x00 ; 0 10d7c: 80 e0 ldi r24, 0x00 ; 0 10d7e: 0f 94 d2 78 call 0x2f1a4 ; 0x2f1a4 SERIAL_ECHOLNRPGM(MSG_OK); 10d82: 80 ef ldi r24, 0xF0 ; 240 10d84: 99 e6 ldi r25, 0x69 ; 105 10d86: 0e 94 bd 7c call 0xf97a ; 0xf97a // reset soon softReset(); 10d8a: 0e 94 1f 66 call 0xcc3e ; 0xcc3e 00010d8e : #endif //EMERGENCY_HANDLERS #endif //WATCHDOG } static inline void crash_and_burn(dump_crash_reason reason) { 10d8e: c8 2f mov r28, r24 WRITE(BEEPER, HIGH); 10d90: 9f b7 in r25, 0x3f ; 63 10d92: f8 94 cli 10d94: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 10d98: 84 60 ori r24, 0x04 ; 4 10d9a: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 10d9e: 9f bf out 0x3f, r25 ; 63 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 10da0: 6c 2f mov r22, r28 10da2: 83 e0 ldi r24, 0x03 ; 3 10da4: 9d e0 ldi r25, 0x0D ; 13 10da6: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t*)EEPROM_FW_CRASH_FLAG, (uint8_t)reason); #ifdef EMERGENCY_DUMP xfdump_full_dump_and_reset(reason); #elif defined(EMERGENCY_SERIAL_DUMP) if(emergency_serial_dump) 10daa: 80 91 0f 06 lds r24, 0x060F ; 0x80060f 10dae: 88 23 and r24, r24 10db0: 19 f0 breq .+6 ; 0x10db8 serial_dump_and_reset(reason); 10db2: 8c 2f mov r24, r28 10db4: 0e 94 79 86 call 0x10cf2 ; 0x10cf2 #endif softReset(); 10db8: 0e 94 1f 66 call 0xcc3e ; 0xcc3e 00010dbc <__vector_default>: crash_and_burn(dump_crash_reason::watchdog); } #endif ISR(BADISR_vect) { 10dbc: 1f 92 push r1 10dbe: 0f 92 push r0 10dc0: 0f b6 in r0, 0x3f ; 63 10dc2: 0f 92 push r0 10dc4: 11 24 eor r1, r1 crash_and_burn(dump_crash_reason::bad_isr); 10dc6: 83 e0 ldi r24, 0x03 ; 3 10dc8: 0e 94 c7 86 call 0x10d8e ; 0x10d8e 00010dcc <__vector_12>: } #ifdef EMERGENCY_HANDLERS #ifdef WATCHDOG ISR(WDT_vect) { 10dcc: 1f 92 push r1 10dce: 0f 92 push r0 10dd0: 0f b6 in r0, 0x3f ; 63 10dd2: 0f 92 push r0 10dd4: 11 24 eor r1, r1 crash_and_burn(dump_crash_reason::watchdog); 10dd6: 82 e0 ldi r24, 0x02 ; 2 10dd8: 0e 94 c7 86 call 0x10d8e ; 0x10d8e 00010ddc : } #endif void Config_ResetDefault() { memcpy_P(&cs,&default_conf, sizeof(cs)); 10ddc: 41 ed ldi r20, 0xD1 ; 209 10dde: 50 e0 ldi r21, 0x00 ; 0 10de0: 65 e2 ldi r22, 0x25 ; 37 10de2: 73 e7 ldi r23, 0x73 ; 115 10de4: 87 e6 ldi r24, 0x67 ; 103 10de6: 9d e0 ldi r25, 0x0D ; 13 10de8: 0f 94 7a a1 call 0x342f4 ; 0x342f4 // steps per sq second need to be updated to agree with the units per sq second reset_acceleration_rates(); 10dec: 0f 94 a6 3c call 0x2794c ; 0x2794c #ifdef PIDTEMP updatePID(); 10df0: 0f 94 40 17 call 0x22e80 ; 0x22e80 #endif//PIDTEMP #ifdef THERMAL_MODEL thermal_model_reset_settings(); #endif calculate_extruder_multipliers(); 10df4: 0e 94 4a 64 call 0xc894 ; 0xc894 SERIAL_ECHO_START; 10df8: 8e ec ldi r24, 0xCE ; 206 10dfa: 91 ea ldi r25, 0xA1 ; 161 10dfc: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded"); 10e00: 83 e0 ldi r24, 0x03 ; 3 10e02: 93 e7 ldi r25, 0x73 ; 115 10e04: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 00010e08 : //! @brief Read M500 configuration //! @retval true Succeeded. Stored settings retrieved or default settings retrieved in case EEPROM cs was empty. //! @retval false Failed. Default settings has been retrieved, because of version mismatch bool Config_RetrieveSettings() { eeprom_read_block(reinterpret_cast(cs.version), reinterpret_cast(EEPROM_M500_base->version), sizeof(cs.version)); 10e08: 44 e0 ldi r20, 0x04 ; 4 10e0a: 50 e0 ldi r21, 0x00 ; 0 10e0c: 64 e1 ldi r22, 0x14 ; 20 10e0e: 70 e0 ldi r23, 0x00 ; 0 10e10: 87 e6 ldi r24, 0x67 ; 103 10e12: 9d e0 ldi r25, 0x0D ; 13 10e14: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << cs.version << "]"); if (strncmp_P(cs.version, default_conf.version, sizeof(EEPROM_VERSION)) == 0) // version number match 10e18: 43 e0 ldi r20, 0x03 ; 3 10e1a: 50 e0 ldi r21, 0x00 ; 0 10e1c: 65 e2 ldi r22, 0x25 ; 37 10e1e: 73 e7 ldi r23, 0x73 ; 115 10e20: 87 e6 ldi r24, 0x67 ; 103 10e22: 9d e0 ldi r25, 0x0D ; 13 10e24: 0f 94 bf a1 call 0x3437e ; 0x3437e 10e28: 89 2b or r24, r25 10e2a: 09 f0 breq .+2 ; 0x10e2e 10e2c: 5d c0 rjmp .+186 ; 0x10ee8 { // Initialize arc interpolation settings in eeprom if they are not already eeprom_init_default_float(&EEPROM_M500_base->mm_per_arc_segment, pgm_read_float(&default_conf.mm_per_arc_segment)); 10e2e: e9 ee ldi r30, 0xE9 ; 233 10e30: f3 e7 ldi r31, 0x73 ; 115 10e32: 45 91 lpm r20, Z+ 10e34: 55 91 lpm r21, Z+ 10e36: 65 91 lpm r22, Z+ 10e38: 74 91 lpm r23, Z 10e3a: 88 ed ldi r24, 0xD8 ; 216 10e3c: 90 e0 ldi r25, 0x00 ; 0 10e3e: 0e 94 9a 5d call 0xbb34 ; 0xbb34 eeprom_init_default_float(&EEPROM_M500_base->min_mm_per_arc_segment, pgm_read_float(&default_conf.min_mm_per_arc_segment)); 10e42: ed ee ldi r30, 0xED ; 237 10e44: f3 e7 ldi r31, 0x73 ; 115 10e46: 45 91 lpm r20, Z+ 10e48: 55 91 lpm r21, Z+ 10e4a: 65 91 lpm r22, Z+ 10e4c: 74 91 lpm r23, Z 10e4e: 8c ed ldi r24, 0xDC ; 220 10e50: 90 e0 ldi r25, 0x00 ; 0 10e52: 0e 94 9a 5d call 0xbb34 ; 0xbb34 eeprom_init_default_byte(&EEPROM_M500_base->n_arc_correction, pgm_read_byte(&default_conf.n_arc_correction)); 10e56: e1 ef ldi r30, 0xF1 ; 241 10e58: f3 e7 ldi r31, 0x73 ; 115 10e5a: 64 91 lpm r22, Z 10e5c: 80 ee ldi r24, 0xE0 ; 224 10e5e: 90 e0 ldi r25, 0x00 ; 0 10e60: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_word(&EEPROM_M500_base->min_arc_segments, pgm_read_word(&default_conf.min_arc_segments)); 10e64: e2 ef ldi r30, 0xF2 ; 242 10e66: f3 e7 ldi r31, 0x73 ; 115 10e68: 65 91 lpm r22, Z+ 10e6a: 74 91 lpm r23, Z 10e6c: 81 ee ldi r24, 0xE1 ; 225 10e6e: 90 e0 ldi r25, 0x00 ; 0 10e70: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word(&EEPROM_M500_base->arc_segments_per_sec, pgm_read_word(&default_conf.arc_segments_per_sec)); 10e74: e4 ef ldi r30, 0xF4 ; 244 10e76: f3 e7 ldi r31, 0x73 ; 115 10e78: 65 91 lpm r22, Z+ 10e7a: 74 91 lpm r23, Z 10e7c: 83 ee ldi r24, 0xE3 ; 227 10e7e: 90 e0 ldi r25, 0x00 ; 0 10e80: 0e 94 45 78 call 0xf08a ; 0xf08a // Initialize the travel_acceleration in eeprom if not already eeprom_init_default_float(&EEPROM_M500_base->travel_acceleration, pgm_read_float(&default_conf.travel_acceleration)); 10e84: e5 ee ldi r30, 0xE5 ; 229 10e86: f3 e7 ldi r31, 0x73 ; 115 10e88: 45 91 lpm r20, Z+ 10e8a: 55 91 lpm r21, Z+ 10e8c: 65 91 lpm r22, Z+ 10e8e: 74 91 lpm r23, Z 10e90: 84 ed ldi r24, 0xD4 ; 212 10e92: 90 e0 ldi r25, 0x00 ; 0 10e94: 0e 94 9a 5d call 0xbb34 ; 0xbb34 // Initialize the max_feedrate_silent and max_acceleration_mm_per_s2_silent in eeprom if not already eeprom_init_default_block(&EEPROM_M500_base->max_feedrate_silent, sizeof(EEPROM_M500_base->max_feedrate_silent), default_conf.max_feedrate_silent); 10e98: 41 ec ldi r20, 0xC1 ; 193 10e9a: 53 e7 ldi r21, 0x73 ; 115 10e9c: 60 e1 ldi r22, 0x10 ; 16 10e9e: 70 e0 ldi r23, 0x00 ; 0 10ea0: 80 eb ldi r24, 0xB0 ; 176 10ea2: 90 e0 ldi r25, 0x00 ; 0 10ea4: 0e 94 26 78 call 0xf04c ; 0xf04c eeprom_init_default_block(&EEPROM_M500_base->max_acceleration_mm_per_s2_silent, sizeof(EEPROM_M500_base->max_acceleration_mm_per_s2_silent), default_conf.max_acceleration_mm_per_s2_silent); 10ea8: 41 ed ldi r20, 0xD1 ; 209 10eaa: 53 e7 ldi r21, 0x73 ; 115 10eac: 60 e1 ldi r22, 0x10 ; 16 10eae: 70 e0 ldi r23, 0x00 ; 0 10eb0: 80 ec ldi r24, 0xC0 ; 192 10eb2: 90 e0 ldi r25, 0x00 ; 0 10eb4: 0e 94 26 78 call 0xf04c ; 0xf04c #ifdef TMC2130 eeprom_init_default_block(&EEPROM_M500_base->axis_ustep_resolution, sizeof(EEPROM_M500_base->axis_ustep_resolution), default_conf.axis_ustep_resolution); #endif // TMC2130 // load the CS to RAM eeprom_read_block(reinterpret_cast(&cs), reinterpret_cast(EEPROM_M500_base), sizeof(cs)); 10eb8: 41 ed ldi r20, 0xD1 ; 209 10eba: 50 e0 ldi r21, 0x00 ; 0 10ebc: 64 e1 ldi r22, 0x14 ; 20 10ebe: 70 e0 ldi r23, 0x00 ; 0 10ec0: 87 e6 ldi r24, 0x67 ; 103 10ec2: 9d e0 ldi r25, 0x0D ; 13 10ec4: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 calculate_extruder_multipliers(); 10ec8: 0e 94 4a 64 call 0xc894 ; 0xc894 tmc2130_set_res(Y_AXIS, cs.axis_ustep_resolution[Y_AXIS]); tmc2130_set_res(Z_AXIS, cs.axis_ustep_resolution[Z_AXIS]); tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]); #endif //TMC2130 reset_acceleration_rates(); 10ecc: 0f 94 a6 3c call 0x2794c ; 0x2794c // Call updatePID (similar to when we have processed M301) updatePID(); 10ed0: 0f 94 40 17 call 0x22e80 ; 0x22e80 #ifdef THERMAL_MODEL thermal_model_load_settings(); #endif SERIAL_ECHO_START; 10ed4: 8e ec ldi r24, 0xCE ; 206 10ed6: 91 ea ldi r25, 0xA1 ; 161 10ed8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("Stored settings retrieved"); 10edc: 89 ee ldi r24, 0xE9 ; 233 10ede: 92 e7 ldi r25, 0x72 ; 114 10ee0: 0e 94 bd 7c call 0xf97a ; 0xf97a 10ee4: 81 e0 ldi r24, 0x01 ; 1 10ee6: 08 95 ret } else { Config_ResetDefault(); 10ee8: 0e 94 ee 86 call 0x10ddc ; 0x10ddc //Return false to inform user that eeprom version was changed and firmware is using default hardcoded settings now. //In case that storing to eeprom was not used yet, do not inform user that hardcoded settings are used. if (eeprom_is_initialized_block(EEPROM_M500_base->version, sizeof(EEPROM_M500_base->version))) { 10eec: 64 e0 ldi r22, 0x04 ; 4 10eee: 70 e0 ldi r23, 0x00 ; 0 10ef0: 84 e1 ldi r24, 0x14 ; 20 10ef2: 90 e0 ldi r25, 0x00 ; 0 10ef4: 0e 94 da 55 call 0xabb4 ; 0xabb4 10ef8: 91 e0 ldi r25, 0x01 ; 1 10efa: 89 27 eor r24, r25 return false; } } return true; } 10efc: 08 95 ret 00010efe : }; void Config_StoreSettings() { strcpy_P(cs.version, default_conf.version); 10efe: 65 e2 ldi r22, 0x25 ; 37 10f00: 73 e7 ldi r23, 0x73 ; 115 10f02: 87 e6 ldi r24, 0x67 ; 103 10f04: 9d e0 ldi r25, 0x0D ; 13 10f06: 0f 94 97 a1 call 0x3432e ; 0x3432e #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 10f0a: 41 ed ldi r20, 0xD1 ; 209 10f0c: 50 e0 ldi r21, 0x00 ; 0 10f0e: 64 e1 ldi r22, 0x14 ; 20 10f10: 70 e0 ldi r23, 0x00 ; 0 10f12: 87 e6 ldi r24, 0x67 ; 103 10f14: 9d e0 ldi r25, 0x0D ; 13 10f16: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 eeprom_update_block_notify(reinterpret_cast(&cs), reinterpret_cast(EEPROM_M500_base), sizeof(cs)); #ifdef THERMAL_MODEL thermal_model_save_settings(); #endif SERIAL_ECHO_START; 10f1a: 8e ec ldi r24, 0xCE ; 206 10f1c: 91 ea ldi r25, 0xA1 ; 161 10f1e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM("Settings Stored"); 10f22: 89 ed ldi r24, 0xD9 ; 217 10f24: 92 e7 ldi r25, 0x72 ; 114 10f26: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 00010f2a : static void printFloat(double, uint8_t); public: static /*FORCE_INLINE*/ void write(const char *str) 10f2a: cf 93 push r28 10f2c: df 93 push r29 10f2e: ec 01 movw r28, r24 { while (*str) 10f30: 89 91 ld r24, Y+ 10f32: 88 23 and r24, r24 10f34: 19 f0 breq .+6 ; 0x10f3c write(*str++); 10f36: 0e 94 b1 79 call 0xf362 ; 0xf362 10f3a: fa cf rjmp .-12 ; 0x10f30 } 10f3c: df 91 pop r29 10f3e: cf 91 pop r28 10f40: 08 95 ret 00010f42 : } }*/ static FORCE_INLINE void print(const char *str) { write(str); 10f42: 0e 94 95 87 call 0x10f2a ; 0x10f2a }*/ void MarlinSerial::println(const char c[]) { print(c); println(); 10f46: 0c 94 bc 7a jmp 0xf578 ; 0xf578 00010f4a : { cmdbuffer_front_already_processed = true; } void get_command() { 10f4a: 2f 92 push r2 10f4c: 3f 92 push r3 10f4e: 4f 92 push r4 10f50: 5f 92 push r5 10f52: 6f 92 push r6 10f54: 7f 92 push r7 10f56: 8f 92 push r8 10f58: 9f 92 push r9 10f5a: af 92 push r10 10f5c: bf 92 push r11 10f5e: cf 92 push r12 10f60: df 92 push r13 10f62: ef 92 push r14 10f64: ff 92 push r15 10f66: 0f 93 push r16 10f68: 1f 93 push r17 10f6a: cf 93 push r28 10f6c: df 93 push r29 10f6e: cd b7 in r28, 0x3d ; 61 10f70: de b7 in r29, 0x3e ; 62 10f72: a0 97 sbiw r28, 0x20 ; 32 10f74: 0f b6 in r0, 0x3f ; 63 10f76: f8 94 cli 10f78: de bf out 0x3e, r29 ; 62 10f7a: 0f be out 0x3f, r0 ; 63 10f7c: cd bf out 0x3d, r28 ; 61 // Test and reserve space for the new command string. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1)) 10f7e: 8f e5 ldi r24, 0x5F ; 95 10f80: 90 e0 ldi r25, 0x00 ; 0 10f82: 0e 94 64 55 call 0xaac8 ; 0xaac8 10f86: 88 23 and r24, r24 10f88: 09 f4 brne .+2 ; 0x10f8c 10f8a: a1 c0 rjmp .+322 ; 0x110ce return; if (MYSERIAL.available() == RX_BUFFER_SIZE - 1) { //compare number of chars buffered in rx buffer with rx buffer size 10f8c: 0e 94 fc 54 call 0xa9f8 ; 0xa9f8 10f90: 8f 37 cpi r24, 0x7F ; 127 10f92: 91 05 cpc r25, r1 10f94: 61 f4 brne .+24 ; 0x10fae // don't reverse this or there may be problems if the RX interrupt // occurs after reading the value of rx_buffer_head but before writing // the value to rx_buffer_tail; the previous value of rx_buffer_head // may be written to rx_buffer_tail, making it appear as if the buffer // were full, not empty. rx_buffer.head = rx_buffer.tail; 10f96: 80 91 44 05 lds r24, 0x0544 ; 0x800544 10f9a: 90 91 45 05 lds r25, 0x0545 ; 0x800545 10f9e: 90 93 43 05 sts 0x0543, r25 ; 0x800543 10fa2: 80 93 42 05 sts 0x0542, r24 ; 0x800542 MYSERIAL.flush(); SERIAL_ECHOLNPGM("Full RX Buffer"); //if buffer was full, there is danger that reading of last gcode will not be completed 10fa6: 8a ec ldi r24, 0xCA ; 202 10fa8: 92 e7 ldi r25, 0x72 ; 114 10faa: 0e 94 bd 7c call 0xf97a ; 0xf97a 10fae: 6e 01 movw r12, r28 10fb0: 4f e1 ldi r20, 0x1F ; 31 10fb2: c4 0e add r12, r20 10fb4: d1 1c adc r13, r1 } // Command is complete: store the current line into buffer, move to the next line. // Store type of entry cmdbuffer[bufindw] = gcode_N >= 0 ? CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR : CMDBUFFER_CURRENT_TYPE_USB; 10fb6: 99 24 eor r9, r9 10fb8: 93 94 inc r9 MYSERIAL.flush(); SERIAL_ECHOLNPGM("Full RX Buffer"); //if buffer was full, there is danger that reading of last gcode will not be completed } // start of serial line processing loop while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && printingIsPaused())) && !cmdqueue_serial_disabled) { //is print is saved (crash detection or filament detection), dont process data from serial line 10fba: 0e 94 fc 54 call 0xa9f8 ; 0xa9f8 10fbe: 18 16 cp r1, r24 10fc0: 19 06 cpc r1, r25 10fc2: 0c f0 brlt .+2 ; 0x10fc6 10fc4: 78 c0 rjmp .+240 ; 0x110b6 10fc6: 80 91 73 12 lds r24, 0x1273 ; 0x801273 10fca: 88 23 and r24, r24 10fcc: 29 f0 breq .+10 ; 0x10fd8 10fce: 0e 94 35 66 call 0xcc6a ; 0xcc6a 10fd2: 88 23 and r24, r24 10fd4: 09 f4 brne .+2 ; 0x10fd8 10fd6: 6f c0 rjmp .+222 ; 0x110b6 10fd8: 80 91 93 03 lds r24, 0x0393 ; 0x800393 10fdc: 81 11 cpse r24, r1 10fde: 6b c0 rjmp .+214 ; 0x110b6 } int MarlinSerial::read(void) { // if the head isn't ahead of the tail, we don't have any characters if (rx_buffer.head == rx_buffer.tail) { 10fe0: 20 91 44 05 lds r18, 0x0544 ; 0x800544 10fe4: 30 91 45 05 lds r19, 0x0545 ; 0x800545 10fe8: 80 91 42 05 lds r24, 0x0542 ; 0x800542 10fec: 90 91 43 05 lds r25, 0x0543 ; 0x800543 10ff0: 82 17 cp r24, r18 10ff2: 93 07 cpc r25, r19 10ff4: 11 f3 breq .-60 ; 0x10fba return -1; } else { unsigned char c = rx_buffer.buffer[rx_buffer.tail]; 10ff6: f9 01 movw r30, r18 10ff8: ee 53 subi r30, 0x3E ; 62 10ffa: fb 4f sbci r31, 0xFB ; 251 10ffc: 80 81 ld r24, Z rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE; 10ffe: 2f 5f subi r18, 0xFF ; 255 11000: 3f 4f sbci r19, 0xFF ; 255 11002: 2f 77 andi r18, 0x7F ; 127 11004: 33 27 eor r19, r19 11006: 30 93 45 05 sts 0x0545, r19 ; 0x800545 1100a: 20 93 44 05 sts 0x0544, r18 ; 0x800544 //========================================================================== void mp_handle_rx_char(const uint8_t c) { // Check for commit complete // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (c == (uint8_t)(MeatPack_CommandByte)) { 1100e: 8f 3f cpi r24, 0xFF ; 255 11010: 09 f0 breq .+2 ; 0x11014 11012: 79 c0 rjmp .+242 ; 0x11106 if (mp_cmd_count > 0) { 11014: 80 91 19 03 lds r24, 0x0319 ; 0x800319 11018: 88 23 and r24, r24 1101a: 09 f4 brne .+2 ; 0x1101e 1101c: 71 c0 rjmp .+226 ; 0x11100 mp_cmd_active = 1; 1101e: 90 92 18 03 sts 0x0318, r9 ; 0x800318 mp_cmd_count = 0; 11022: 10 92 19 03 sts 0x0319, r1 ; 0x800319 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const int rec = MYSERIAL.read(); if (rec < 0) continue; mp_handle_rx_char((uint8_t)rec); char c_res[2] = {0, 0}; 11026: 1f 8e std Y+31, r1 ; 0x1f 11028: 18 a2 std Y+32, r1 ; 0x20 mp_handle_rx_char_inner(c); } //========================================================================== uint8_t mp_get_result_char(char* const __restrict out) { if (mp_char_out_count > 0) { 1102a: 80 90 1c 03 lds r8, 0x031C ; 0x80031c 1102e: 88 20 and r8, r8 11030: 21 f2 breq .-120 ; 0x10fba const uint8_t res = mp_char_out_count; for (uint8_t i = 0; i < mp_char_out_count; ++i) out[i] = (char)mp_char_out_buf[i]; 11032: 80 91 1a 03 lds r24, 0x031A ; 0x80031a 11036: 8f 8f std Y+31, r24 ; 0x1f //========================================================================== uint8_t mp_get_result_char(char* const __restrict out) { if (mp_char_out_count > 0) { const uint8_t res = mp_char_out_count; for (uint8_t i = 0; i < mp_char_out_count; ++i) 11038: f1 e0 ldi r31, 0x01 ; 1 1103a: f8 15 cp r31, r8 1103c: 18 f4 brcc .+6 ; 0x11044 out[i] = (char)mp_char_out_buf[i]; 1103e: 80 91 1b 03 lds r24, 0x031B ; 0x80031b 11042: 88 a3 std Y+32, r24 ; 0x20 mp_char_out_count = 0; 11044: 10 92 1c 03 sts 0x031C, r1 ; 0x80031c 11048: 16 01 movw r2, r12 const uint8_t char_count = mp_get_result_char(c_res); // Note -- Paired bracket in preproc switch below for (uint8_t i = 0; i < char_count; ++i) { char serial_char = c_res[i]; 1104a: 82 2d mov r24, r2 1104c: 8c 19 sub r24, r12 1104e: 88 15 cp r24, r8 11050: 08 f0 brcs .+2 ; 0x11054 11052: b3 cf rjmp .-154 ; 0x10fba 11054: f1 01 movw r30, r2 11056: 11 91 ld r17, Z+ 11058: 1f 01 movw r2, r30 #else char serial_char = MYSERIAL.read(); #endif serialTimeoutTimer.start(); 1105a: 8f e1 ldi r24, 0x1F ; 31 1105c: 93 e0 ldi r25, 0x03 ; 3 1105e: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> if (serial_char < 0) 11062: 17 fd sbrc r17, 7 11064: f2 cf rjmp .-28 ; 0x1104a 11066: 80 91 47 10 lds r24, 0x1047 ; 0x801047 1106a: 90 91 48 10 lds r25, 0x1048 ; 0x801048 // Ignore extended ASCII characters. These characters have no meaning in the G-code apart from the file names // and Marlin does not support such file names anyway. // Serial characters with a highest bit set to 1 are generated when the USB cable is unplugged, leading // to a hang-up of the print process from an SD card. continue; if(serial_char == '\n' || 1106e: 1a 30 cpi r17, 0x0A ; 10 11070: 09 f4 brne .+2 ; 0x11074 11072: 4b c1 rjmp .+662 ; 0x1130a 11074: 1d 30 cpi r17, 0x0D ; 13 11076: 09 f4 brne .+2 ; 0x1107a 11078: 48 c1 rjmp .+656 ; 0x1130a serial_char == '\r' || 1107a: 8f 35 cpi r24, 0x5F ; 95 1107c: 91 05 cpc r25, r1 1107e: 0c f0 brlt .+2 ; 0x11082 11080: 49 c1 rjmp .+658 ; 0x11314 if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1)) return; } // end of "end of line" processing else { // Not an "end of line" symbol. Store the new character into a buffer. if(serial_char == ';') comment_mode = true; 11082: 1b 33 cpi r17, 0x3B ; 59 11084: 11 f4 brne .+4 ; 0x1108a 11086: 90 92 1e 03 sts 0x031E, r9 ; 0x80031e if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char; 1108a: 20 91 1e 03 lds r18, 0x031E ; 0x80031e 1108e: 21 11 cpse r18, r1 11090: dc cf rjmp .-72 ; 0x1104a 11092: 9c 01 movw r18, r24 11094: 2f 5f subi r18, 0xFF ; 255 11096: 3f 4f sbci r19, 0xFF ; 255 11098: 30 93 48 10 sts 0x1048, r19 ; 0x801048 1109c: 20 93 47 10 sts 0x1047, r18 ; 0x801047 110a0: 20 91 49 10 lds r18, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 110a4: 30 91 4a 10 lds r19, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 110a8: 25 5b subi r18, 0xB5 ; 181 110aa: 3f 4e sbci r19, 0xEF ; 239 110ac: 82 0f add r24, r18 110ae: 93 1f adc r25, r19 110b0: fc 01 movw r30, r24 110b2: 13 83 std Z+3, r17 ; 0x03 110b4: ca cf rjmp .-108 ; 0x1104a #ifdef ENABLE_MEATPACK } #endif } // end of serial line processing loop if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) { 110b6: 80 91 47 10 lds r24, 0x1047 ; 0x801047 110ba: 90 91 48 10 lds r25, 0x1048 ; 0x801048 110be: 18 16 cp r1, r24 110c0: 19 06 cpc r1, r25 110c2: 0c f4 brge .+2 ; 0x110c6 110c4: 51 c2 rjmp .+1186 ; 0x11568 SERIAL_ECHOLNPGM("RX timeout"); return; } #ifdef SDSUPPORT if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){ 110c6: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 110ca: 81 11 cpse r24, r1 110cc: 67 c2 rjmp .+1230 ; 0x1159c prusa_statistics(6); } } #endif //SDSUPPORT } 110ce: a0 96 adiw r28, 0x20 ; 32 110d0: 0f b6 in r0, 0x3f ; 63 110d2: f8 94 cli 110d4: de bf out 0x3e, r29 ; 62 110d6: 0f be out 0x3f, r0 ; 63 110d8: cd bf out 0x3d, r28 ; 61 110da: df 91 pop r29 110dc: cf 91 pop r28 110de: 1f 91 pop r17 110e0: 0f 91 pop r16 110e2: ff 90 pop r15 110e4: ef 90 pop r14 110e6: df 90 pop r13 110e8: cf 90 pop r12 110ea: bf 90 pop r11 110ec: af 90 pop r10 110ee: 9f 90 pop r9 110f0: 8f 90 pop r8 110f2: 7f 90 pop r7 110f4: 6f 90 pop r6 110f6: 5f 90 pop r5 110f8: 4f 90 pop r4 110fa: 3f 90 pop r3 110fc: 2f 90 pop r2 110fe: 08 95 ret if (mp_cmd_count > 0) { mp_cmd_active = 1; mp_cmd_count = 0; } else ++mp_cmd_count; 11100: 90 92 19 03 sts 0x0319, r9 ; 0x800319 11104: 90 cf rjmp .-224 ; 0x11026 return; } if (mp_cmd_active > 0) { 11106: 90 91 18 03 lds r25, 0x0318 ; 0x800318 1110a: 99 23 and r25, r25 1110c: 09 f4 brne .+2 ; 0x11110 1110e: 58 c0 rjmp .+176 ; 0x111c0 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 11110: 89 3f cpi r24, 0xF9 ; 249 11112: e9 f1 breq .+122 ; 0x1118e 11114: 70 f5 brcc .+92 ; 0x11172 11116: 86 3f cpi r24, 0xF6 ; 246 11118: 09 f4 brne .+2 ; 0x1111c 1111a: 4a c0 rjmp .+148 ; 0x111b0 1111c: 87 3f cpi r24, 0xF7 ; 247 1111e: 09 f4 brne .+2 ; 0x11122 11120: 43 c0 rjmp .+134 ; 0x111a8 mp_handle_output_char(c); } //========================================================================== void FORCE_INLINE mp_echo_config_state() { SERIAL_ECHOPGM(" [MP] "); // Add space at idx 0 just in case first character is dropped due to timing/sync issues. 11122: 85 e9 ldi r24, 0x95 ; 149 11124: 92 e7 ldi r25, 0x72 ; 114 11126: 0e 94 c4 7a call 0xf588 ; 0xf588 // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin // should not contain the "PV' substring, as this is used to indicate protocol version SERIAL_ECHOPGM(MeatPack_ProtocolVersion); 1112a: 80 e9 ldi r24, 0x90 ; 144 1112c: 92 e7 ldi r25, 0x72 ; 114 1112e: 0e 94 c4 7a call 0xf588 ; 0xf588 // Echo current state if (mp_config & MPConfig_Active) 11132: 10 91 17 03 lds r17, 0x0317 ; 0x800317 SERIAL_ECHOPGM(" ON"); 11136: 8c e8 ldi r24, 0x8C ; 140 11138: 92 e7 ldi r25, 0x72 ; 114 // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin // should not contain the "PV' substring, as this is used to indicate protocol version SERIAL_ECHOPGM(MeatPack_ProtocolVersion); // Echo current state if (mp_config & MPConfig_Active) 1113a: 10 fd sbrc r17, 0 1113c: 02 c0 rjmp .+4 ; 0x11142 SERIAL_ECHOPGM(" ON"); else SERIAL_ECHOPGM(" OFF"); 1113e: 87 e8 ldi r24, 0x87 ; 135 11140: 92 e7 ldi r25, 0x72 ; 114 11142: 0e 94 c4 7a call 0xf588 ; 0xf588 if (mp_config & MPConfig_NoSpaces) 11146: 01 2f mov r16, r17 11148: 02 70 andi r16, 0x02 ; 2 SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces 1114a: 82 e8 ldi r24, 0x82 ; 130 1114c: 92 e7 ldi r25, 0x72 ; 114 if (mp_config & MPConfig_Active) SERIAL_ECHOPGM(" ON"); else SERIAL_ECHOPGM(" OFF"); if (mp_config & MPConfig_NoSpaces) 1114e: 11 fd sbrc r17, 1 11150: 02 c0 rjmp .+4 ; 0x11156 SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces else SERIAL_ECHOPGM(" ESP"); // [E]nabled [SP]aces 11152: 8d e7 ldi r24, 0x7D ; 125 11154: 92 e7 ldi r25, 0x72 ; 114 11156: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM(""); 1115a: 8c e7 ldi r24, 0x7C ; 124 1115c: 92 e7 ldi r25, 0x72 ; 114 1115e: 0e 94 bd 7c call 0xf97a ; 0xf97a // Validate config vars #ifdef USE_LOOKUP_TABLE if (mp_config & MPConfig_NoSpaces) 11162: 00 23 and r16, r16 11164: 49 f1 breq .+82 ; 0x111b8 MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace); 11166: 85 e4 ldi r24, 0x45 ; 69 11168: 80 93 0b 02 sts 0x020B, r24 ; 0x80020b <__DATA_REGION_ORIGIN__+0xb> return; } if (mp_cmd_active > 0) { mp_handle_cmd((MeatPack_Command)c); mp_cmd_active = 0; 1116c: 10 92 18 03 sts 0x0318, r1 ; 0x800318 11170: 5a cf rjmp .-332 ; 0x11026 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 11172: 8a 3f cpi r24, 0xFA ; 250 11174: 41 f0 breq .+16 ; 0x11186 11176: 8b 3f cpi r24, 0xFB ; 251 11178: a1 f6 brne .-88 ; 0x11122 case MPCommand_EnablePacking: { mp_config |= MPConfig_Active; 1117a: 80 91 17 03 lds r24, 0x0317 ; 0x800317 1117e: 81 60 ori r24, 0x01 ; 1 #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP"); #endif } break; case MPCommand_DisableNoSpaces: { mp_config &= ~(MPConfig_NoSpaces); 11180: 80 93 17 03 sts 0x0317, r24 ; 0x800317 11184: ce cf rjmp .-100 ; 0x11122 #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL REC"); #endif } break; case MPCommand_DisablePacking: { mp_config &= ~(MPConfig_Active); 11186: 80 91 17 03 lds r24, 0x0317 ; 0x800317 1118a: 8e 7f andi r24, 0xFE ; 254 1118c: f9 cf rjmp .-14 ; 0x11180 return out; } //============================================================================== void FORCE_INLINE mp_reset_state() { mp_char_out_count = 0; 1118e: 10 92 1c 03 sts 0x031C, r1 ; 0x80031c mp_cmd_active = MPCommand_None; 11192: 10 92 18 03 sts 0x0318, r1 ; 0x800318 mp_config = MPConfig_None; 11196: 10 92 17 03 sts 0x0317, r1 ; 0x800317 mp_char_buf = 0; 1119a: 10 92 16 03 sts 0x0316, r1 ; 0x800316 mp_cmd_count = 0; 1119e: 10 92 19 03 sts 0x0319, r1 ; 0x800319 mp_cmd_active = 0; mp_full_char_queue = 0; 111a2: 10 92 15 03 sts 0x0315, r1 ; 0x800315 111a6: bd cf rjmp .-134 ; 0x11122 #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] RESET REC"); #endif } break; case MPCommand_EnableNoSpaces: { mp_config |= MPConfig_NoSpaces; 111a8: 80 91 17 03 lds r24, 0x0317 ; 0x800317 111ac: 82 60 ori r24, 0x02 ; 2 111ae: e8 cf rjmp .-48 ; 0x11180 #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP"); #endif } break; case MPCommand_DisableNoSpaces: { mp_config &= ~(MPConfig_NoSpaces); 111b0: 80 91 17 03 lds r24, 0x0317 ; 0x800317 111b4: 8d 7f andi r24, 0xFD ; 253 111b6: e4 cf rjmp .-56 ; 0x11180 // Validate config vars #ifdef USE_LOOKUP_TABLE if (mp_config & MPConfig_NoSpaces) MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace); else MeatPackLookupTbl[MeatPack_SpaceCharIdx] = ' '; 111b8: 90 e2 ldi r25, 0x20 ; 32 111ba: 90 93 0b 02 sts 0x020B, r25 ; 0x80020b <__DATA_REGION_ORIGIN__+0xb> 111be: d6 cf rjmp .-84 ; 0x1116c mp_handle_cmd((MeatPack_Command)c); mp_cmd_active = 0; return; } if (mp_cmd_count > 0) { 111c0: 90 91 19 03 lds r25, 0x0319 ; 0x800319 111c4: 30 91 17 03 lds r19, 0x0317 ; 0x800317 111c8: 99 23 and r25, r25 111ca: 31 f1 breq .+76 ; 0x11218 111cc: e0 91 1c 03 lds r30, 0x031C ; 0x80031c //========================================================================== void FORCE_INLINE mp_handle_rx_char_inner(const uint8_t c) { // Packing enabled, handle character and re-arrange them appropriately. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (mp_config & MPConfig_Active) { 111d0: 30 ff sbrs r19, 0 111d2: 49 c0 rjmp .+146 ; 0x11266 if (mp_full_char_queue > 0) { 111d4: 20 91 15 03 lds r18, 0x0315 ; 0x800315 111d8: 22 23 and r18, r18 111da: 09 f4 brne .+2 ; 0x111de 111dc: 40 c0 rjmp .+128 ; 0x1125e #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 111de: 91 e0 ldi r25, 0x01 ; 1 111e0: 9e 0f add r25, r30 111e2: 90 93 1c 03 sts 0x031C, r25 ; 0x80031c 111e6: ae 2f mov r26, r30 111e8: b0 e0 ldi r27, 0x00 ; 0 111ea: a6 5e subi r26, 0xE6 ; 230 111ec: bc 4f sbci r27, 0xFC ; 252 111ee: ff ef ldi r31, 0xFF ; 255 111f0: fc 93 st X, r31 // Packing enabled, handle character and re-arrange them appropriately. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (mp_config & MPConfig_Active) { if (mp_full_char_queue > 0) { mp_handle_output_char(c); if (mp_char_buf > 0) { 111f2: 40 91 16 03 lds r20, 0x0316 ; 0x800316 111f6: 44 23 and r20, r20 111f8: 51 f0 breq .+20 ; 0x1120e #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 111fa: ee 5f subi r30, 0xFE ; 254 111fc: e0 93 1c 03 sts 0x031C, r30 ; 0x80031c 11200: e9 2f mov r30, r25 11202: f0 e0 ldi r31, 0x00 ; 0 11204: e6 5e subi r30, 0xE6 ; 230 11206: fc 4f sbci r31, 0xFC ; 252 11208: 40 83 st Z, r20 if (mp_config & MPConfig_Active) { if (mp_full_char_queue > 0) { mp_handle_output_char(c); if (mp_char_buf > 0) { mp_handle_output_char(mp_char_buf); mp_char_buf = 0; 1120a: 10 92 16 03 sts 0x0316, r1 ; 0x800316 } --mp_full_char_queue; 1120e: 21 50 subi r18, 0x01 ; 1 11210: 20 93 15 03 sts 0x0315, r18 ; 0x800315 return; } if (mp_cmd_count > 0) { mp_handle_rx_char_inner((uint8_t)(MeatPack_CommandByte)); mp_cmd_count = 0; 11214: 10 92 19 03 sts 0x0319, r1 ; 0x800319 11218: e0 91 1c 03 lds r30, 0x031C ; 0x80031c //========================================================================== void FORCE_INLINE mp_handle_rx_char_inner(const uint8_t c) { // Packing enabled, handle character and re-arrange them appropriately. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (mp_config & MPConfig_Active) { 1121c: 30 ff sbrs r19, 0 1121e: 6c c0 rjmp .+216 ; 0x112f8 if (mp_full_char_queue > 0) { 11220: 90 91 15 03 lds r25, 0x0315 ; 0x800315 11224: 99 23 and r25, r25 11226: 49 f1 breq .+82 ; 0x1127a #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 11228: 21 e0 ldi r18, 0x01 ; 1 1122a: 2e 0f add r18, r30 1122c: 20 93 1c 03 sts 0x031C, r18 ; 0x80031c 11230: ae 2f mov r26, r30 11232: b0 e0 ldi r27, 0x00 ; 0 11234: a6 5e subi r26, 0xE6 ; 230 11236: bc 4f sbci r27, 0xFC ; 252 11238: 8c 93 st X, r24 // Packing enabled, handle character and re-arrange them appropriately. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (mp_config & MPConfig_Active) { if (mp_full_char_queue > 0) { mp_handle_output_char(c); if (mp_char_buf > 0) { 1123a: 80 91 16 03 lds r24, 0x0316 ; 0x800316 1123e: 88 23 and r24, r24 11240: 51 f0 breq .+20 ; 0x11256 #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 11242: ee 5f subi r30, 0xFE ; 254 11244: e0 93 1c 03 sts 0x031C, r30 ; 0x80031c 11248: e2 2f mov r30, r18 1124a: f0 e0 ldi r31, 0x00 ; 0 1124c: e6 5e subi r30, 0xE6 ; 230 1124e: fc 4f sbci r31, 0xFC ; 252 11250: 80 83 st Z, r24 if (mp_config & MPConfig_Active) { if (mp_full_char_queue > 0) { mp_handle_output_char(c); if (mp_char_buf > 0) { mp_handle_output_char(mp_char_buf); mp_char_buf = 0; 11252: 10 92 16 03 sts 0x0316, r1 ; 0x800316 } --mp_full_char_queue; 11256: 91 50 subi r25, 0x01 ; 1 11258: 90 93 15 03 sts 0x0315, r25 ; 0x800315 1125c: e4 ce rjmp .-568 ; 0x11026 uint8_t buf[2] = { 0,0 }; const uint8_t res = mp_unpack_chars(c, buf); if (res & MeatPack_NextPackedFirst) { ++mp_full_char_queue; if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; 1125e: 42 e0 ldi r20, 0x02 ; 2 11260: 40 93 15 03 sts 0x0315, r20 ; 0x800315 11264: d7 cf rjmp .-82 ; 0x11214 #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 11266: 91 e0 ldi r25, 0x01 ; 1 11268: 9e 0f add r25, r30 1126a: 90 93 1c 03 sts 0x031C, r25 ; 0x80031c 1126e: f0 e0 ldi r31, 0x00 ; 0 11270: e6 5e subi r30, 0xE6 ; 230 11272: fc 4f sbci r31, 0xFC ; 252 11274: 9f ef ldi r25, 0xFF ; 255 11276: 90 83 st Z, r25 11278: cd cf rjmp .-102 ; 0x11214 1127a: a8 2f mov r26, r24 1127c: af 70 andi r26, 0x0F ; 15 mp_char_buf = 0; } --mp_full_char_queue; } else { uint8_t buf[2] = { 0,0 }; 1127e: 30 e0 ldi r19, 0x00 ; 0 uint8_t FORCE_INLINE mp_unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out) { uint8_t out = 0; #ifdef USE_LOOKUP_TABLE // If lower 4 bytes is 0b1111, the higher 4 are unused, and next char is full. if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst; 11280: 21 e0 ldi r18, 0x01 ; 1 11282: af 30 cpi r26, 0x0F ; 15 11284: 29 f0 breq .+10 ; 0x11290 11286: b0 e0 ldi r27, 0x00 ; 0 else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char 11288: a0 50 subi r26, 0x00 ; 0 1128a: be 4f sbci r27, 0xFE ; 254 1128c: 3c 91 ld r19, X // low = (packed >> 4) & 0xF; // high = (packed & 0xF); //========================================================================== uint8_t FORCE_INLINE mp_unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out) { uint8_t out = 0; 1128e: 20 e0 ldi r18, 0x00 ; 0 // If lower 4 bytes is 0b1111, the higher 4 are unused, and next char is full. if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst; else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char // Check if upper 4 bytes is 0b1111... if so, we don't need the second char. if ((pk & MeatPack_SecondNotPacked) == MeatPack_SecondNotPacked) out |= MeatPack_NextPackedSecond; 11290: 48 2f mov r20, r24 11292: 40 7f andi r20, 0xF0 ; 240 11294: 40 3f cpi r20, 0xF0 ; 240 11296: 59 f4 brne .+22 ; 0x112ae 11298: 22 60 ori r18, 0x02 ; 2 } else { uint8_t buf[2] = { 0,0 }; const uint8_t res = mp_unpack_chars(c, buf); if (res & MeatPack_NextPackedFirst) { 1129a: 20 ff sbrs r18, 0 1129c: 13 c0 rjmp .+38 ; 0x112c4 ++mp_full_char_queue; 1129e: 90 92 15 03 sts 0x0315, r9 ; 0x800315 if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; 112a2: 21 ff sbrs r18, 1 112a4: 0c c0 rjmp .+24 ; 0x112be 112a6: e2 e0 ldi r30, 0x02 ; 2 112a8: e0 93 15 03 sts 0x0315, r30 ; 0x800315 112ac: bc ce rjmp .-648 ; 0x11026 if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst; else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char // Check if upper 4 bytes is 0b1111... if so, we don't need the second char. if ((pk & MeatPack_SecondNotPacked) == MeatPack_SecondNotPacked) out |= MeatPack_NextPackedSecond; else chars_out[1] = MeatPackLookupTbl[((pk >> 4) & 0xf)]; // Assign upper char 112ae: 82 95 swap r24 112b0: 8f 70 andi r24, 0x0F ; 15 112b2: a8 2f mov r26, r24 112b4: b0 e0 ldi r27, 0x00 ; 0 112b6: a0 50 subi r26, 0x00 ; 0 112b8: be 4f sbci r27, 0xFE ; 254 112ba: 9c 91 ld r25, X 112bc: ee cf rjmp .-36 ; 0x1129a const uint8_t res = mp_unpack_chars(c, buf); if (res & MeatPack_NextPackedFirst) { ++mp_full_char_queue; if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; else mp_char_buf = buf[1]; 112be: 90 93 16 03 sts 0x0316, r25 ; 0x800316 112c2: b1 ce rjmp .-670 ; 0x11026 #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 112c4: 81 e0 ldi r24, 0x01 ; 1 112c6: 8e 0f add r24, r30 112c8: 80 93 1c 03 sts 0x031C, r24 ; 0x80031c 112cc: ae 2f mov r26, r30 112ce: b0 e0 ldi r27, 0x00 ; 0 112d0: a6 5e subi r26, 0xE6 ; 230 112d2: bc 4f sbci r27, 0xFC ; 252 112d4: 3c 93 st X, r19 if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; else mp_char_buf = buf[1]; } else { mp_handle_output_char(buf[0]); if (buf[0] != '\n') { 112d6: 3a 30 cpi r19, 0x0A ; 10 112d8: 09 f4 brne .+2 ; 0x112dc 112da: a5 ce rjmp .-694 ; 0x11026 if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; 112dc: 21 ff sbrs r18, 1 112de: 03 c0 rjmp .+6 ; 0x112e6 112e0: 90 92 15 03 sts 0x0315, r9 ; 0x800315 112e4: a0 ce rjmp .-704 ; 0x11026 #ifdef MP_DEBUG uint32_t mp_chars_decoded = 0; #endif void FORCE_INLINE mp_handle_output_char(const uint8_t c) { mp_char_out_buf[mp_char_out_count++] = c; 112e6: ee 5f subi r30, 0xFE ; 254 112e8: e0 93 1c 03 sts 0x031C, r30 ; 0x80031c 112ec: e8 2f mov r30, r24 112ee: f0 e0 ldi r31, 0x00 ; 0 112f0: e6 5e subi r30, 0xE6 ; 230 112f2: fc 4f sbci r31, 0xFC ; 252 112f4: 90 83 st Z, r25 112f6: 97 ce rjmp .-722 ; 0x11026 112f8: 91 e0 ldi r25, 0x01 ; 1 112fa: 9e 0f add r25, r30 112fc: 90 93 1c 03 sts 0x031C, r25 ; 0x80031c 11300: f0 e0 ldi r31, 0x00 ; 0 11302: e6 5e subi r30, 0xE6 ; 230 11304: fc 4f sbci r31, 0xFC ; 252 11306: 80 83 st Z, r24 11308: 8e ce rjmp .-740 ; 0x11026 continue; if(serial_char == '\n' || serial_char == '\r' || serial_count >= (MAX_CMD_SIZE - 1) ) { if(!serial_count) { //if empty line 1130a: 00 97 sbiw r24, 0x00 ; 0 1130c: 19 f4 brne .+6 ; 0x11314 comment_mode = false; //for new command 1130e: 10 92 1e 03 sts 0x031E, r1 ; 0x80031e 11312: dd ce rjmp .-582 ; 0x110ce 11314: 00 91 49 10 lds r16, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11318: 10 91 4a 10 lds r17, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> return; } cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; // terminate string 1131c: 02 5b subi r16, 0xB2 ; 178 1131e: 1f 4e sbci r17, 0xEF ; 239 11320: 80 0f add r24, r16 11322: 91 1f adc r25, r17 11324: fc 01 movw r30, r24 11326: 10 82 st Z, r1 char* cmd_head = cmdbuffer+bufindw+CMDHDRSIZE; // current command pointer char* cmd_start = cmd_head; // pointer past the line number (if any) 11328: 1a 83 std Y+2, r17 ; 0x02 1132a: 09 83 std Y+1, r16 ; 0x01 if(!comment_mode){ 1132c: 80 91 1e 03 lds r24, 0x031E ; 0x80031e 11330: 81 11 cpse r24, r1 11332: fd c0 rjmp .+506 ; 0x1152e long gcode_N = -1; // seen line number // Line numbers must be first in buffer if (*cmd_head == 'N') { 11334: f8 01 movw r30, r16 11336: 80 81 ld r24, Z 11338: 8e 34 cpi r24, 0x4E ; 78 1133a: 09 f0 breq .+2 ; 0x1133e 1133c: 84 c0 rjmp .+264 ; 0x11446 // Line number met: decode the number, then move cmd_start past all spaces. gcode_N = (strtol(cmd_head+1, &cmd_start, 10)); 1133e: 4a e0 ldi r20, 0x0A ; 10 11340: 50 e0 ldi r21, 0x00 ; 0 11342: be 01 movw r22, r28 11344: 6f 5f subi r22, 0xFF ; 255 11346: 7f 4f sbci r23, 0xFF ; 255 11348: c8 01 movw r24, r16 1134a: 01 96 adiw r24, 0x01 ; 1 1134c: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 11350: 2b 01 movw r4, r22 11352: 3c 01 movw r6, r24 while (*cmd_start == ' ') ++cmd_start; 11354: e9 80 ldd r14, Y+1 ; 0x01 11356: fa 80 ldd r15, Y+2 ; 0x02 11358: f7 01 movw r30, r14 1135a: 80 81 ld r24, Z 1135c: 80 32 cpi r24, 0x20 ; 32 1135e: 31 f4 brne .+12 ; 0x1136c 11360: ff ef ldi r31, 0xFF ; 255 11362: ef 1a sub r14, r31 11364: ff 0a sbc r15, r31 11366: fa 82 std Y+2, r15 ; 0x02 11368: e9 82 std Y+1, r14 ; 0x01 1136a: f4 cf rjmp .-24 ; 0x11354 // Test whether the successive lines are stamped with an increasing line number ID. if(gcode_N != gcode_LastN+1 && strncmp_P(cmd_start, PSTR("M110"), 4)) { 1136c: 80 91 3e 12 lds r24, 0x123E ; 0x80123e 11370: 90 91 3f 12 lds r25, 0x123F ; 0x80123f 11374: a0 91 40 12 lds r26, 0x1240 ; 0x801240 11378: b0 91 41 12 lds r27, 0x1241 ; 0x801241 1137c: 01 96 adiw r24, 0x01 ; 1 1137e: a1 1d adc r26, r1 11380: b1 1d adc r27, r1 11382: 84 15 cp r24, r4 11384: 95 05 cpc r25, r5 11386: a6 05 cpc r26, r6 11388: b7 05 cpc r27, r7 1138a: 49 f0 breq .+18 ; 0x1139e 1138c: 44 e0 ldi r20, 0x04 ; 4 1138e: 50 e0 ldi r21, 0x00 ; 0 11390: 65 ec ldi r22, 0xC5 ; 197 11392: 72 e7 ldi r23, 0x72 ; 114 11394: c7 01 movw r24, r14 11396: 0f 94 bf a1 call 0x3437e ; 0x3437e 1139a: 89 2b or r24, r25 1139c: a1 f4 brne .+40 ; 0x113c6 FlushSerialRequestResend(); serial_count = 0; return; } if((strchr_pointer = strchr(cmd_start, '*')) != NULL) 1139e: 6a e2 ldi r22, 0x2A ; 42 113a0: 70 e0 ldi r23, 0x00 ; 0 113a2: c7 01 movw r24, r14 113a4: 0f 94 37 aa call 0x3546e ; 0x3546e 113a8: 90 93 bc 04 sts 0x04BC, r25 ; 0x8004bc 113ac: 80 93 bb 04 sts 0x04BB, r24 ; 0x8004bb 113b0: 00 97 sbiw r24, 0x00 ; 0 113b2: 09 f4 brne .+2 ; 0x113b6 113b4: 41 c0 rjmp .+130 ; 0x11438 113b6: f8 01 movw r30, r16 { byte checksum = 0; 113b8: f1 2c mov r15, r1 char *p = cmd_head; while (p != strchr_pointer) 113ba: 8e 17 cp r24, r30 113bc: 9f 07 cpc r25, r31 113be: f1 f0 breq .+60 ; 0x113fc checksum = checksum^(*p++); 113c0: 21 91 ld r18, Z+ 113c2: f2 26 eor r15, r18 113c4: fa cf rjmp .-12 ; 0x113ba while (*cmd_start == ' ') ++cmd_start; // Test whether the successive lines are stamped with an increasing line number ID. if(gcode_N != gcode_LastN+1 && strncmp_P(cmd_start, PSTR("M110"), 4)) { // Line numbers not sent in succession and M110 not seen. SERIAL_ERROR_START; 113c6: 81 eb ldi r24, 0xB1 ; 177 113c8: 91 ea ldi r25, 0xA1 ; 161 113ca: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO 113ce: 80 e3 ldi r24, 0x30 ; 48 113d0: 93 e6 ldi r25, 0x63 ; 99 char *p = cmd_head; while (p != strchr_pointer) checksum = checksum^(*p++); if (code_value_short() != (int16_t)checksum) { SERIAL_ERROR_START; SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH 113d2: 0e 94 c4 7a call 0xf588 ; 0xf588 113d6: 60 91 3e 12 lds r22, 0x123E ; 0x80123e 113da: 70 91 3f 12 lds r23, 0x123F ; 0x80123f 113de: 80 91 40 12 lds r24, 0x1240 ; 0x801240 113e2: 90 91 41 12 lds r25, 0x1241 ; 0x801241 113e6: 0e 94 2a 7a call 0xf454 ; 0xf454 } void MarlinSerial::println(long n, int base) { print(n, base); println(); 113ea: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_ERRORLN(gcode_LastN); FlushSerialRequestResend(); 113ee: 0e 94 ac 55 call 0xab58 ; 0xab58 serial_count = 0; 113f2: 10 92 48 10 sts 0x1048, r1 ; 0x801048 113f6: 10 92 47 10 sts 0x1047, r1 ; 0x801047 113fa: 69 ce rjmp .-814 ; 0x110ce { byte checksum = 0; char *p = cmd_head; while (p != strchr_pointer) checksum = checksum^(*p++); if (code_value_short() != (int16_t)checksum) { 113fc: 0e 94 17 56 call 0xac2e ; 0xac2e 11400: f8 16 cp r15, r24 11402: 19 06 cpc r1, r25 11404: 39 f0 breq .+14 ; 0x11414 SERIAL_ERROR_START; 11406: 81 eb ldi r24, 0xB1 ; 177 11408: 91 ea ldi r25, 0xA1 ; 161 1140a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH 1140e: 81 e1 ldi r24, 0x11 ; 17 11410: 93 e6 ldi r25, 0x63 ; 99 11412: df cf rjmp .-66 ; 0x113d2 FlushSerialRequestResend(); serial_count = 0; return; } // If no errors, remove the checksum and continue parsing. *strchr_pointer = 0; 11414: e0 91 bb 04 lds r30, 0x04BB ; 0x8004bb 11418: f0 91 bc 04 lds r31, 0x04BC ; 0x8004bc 1141c: 10 82 st Z, r1 return; } } // Handle KILL early, even when Stopped if(strcmp_P(cmd_start, PSTR("M112")) == 0) 1141e: e9 80 ldd r14, Y+1 ; 0x01 11420: fa 80 ldd r15, Y+2 ; 0x02 11422: 60 ec ldi r22, 0xC0 ; 192 11424: 72 e7 ldi r23, 0x72 ; 114 11426: c7 01 movw r24, r14 11428: 0f 94 8e a1 call 0x3431c ; 0x3431c 1142c: 89 2b or r24, r25 1142e: 39 f5 brne .+78 ; 0x1147e kill(MSG_M112_KILL); 11430: 87 e7 ldi r24, 0x77 ; 119 11432: 95 e6 ldi r25, 0x65 ; 101 11434: 0e 94 23 83 call 0x10646 ; 0x10646 // If no errors, remove the checksum and continue parsing. *strchr_pointer = 0; } else { SERIAL_ERROR_START; 11438: 81 eb ldi r24, 0xB1 ; 177 1143a: 91 ea ldi r25, 0xA1 ; 161 1143c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM 11440: 87 ee ldi r24, 0xE7 ; 231 11442: 92 e6 ldi r25, 0x62 ; 98 11444: c6 cf rjmp .-116 ; 0x113d2 } } else { // move cmd_start past all spaces while (*cmd_start == ' ') ++cmd_start; 11446: 89 81 ldd r24, Y+1 ; 0x01 11448: 9a 81 ldd r25, Y+2 ; 0x02 1144a: fc 01 movw r30, r24 1144c: 20 81 ld r18, Z 1144e: 20 32 cpi r18, 0x20 ; 32 11450: 21 f4 brne .+8 ; 0x1145a 11452: 01 96 adiw r24, 0x01 ; 1 11454: 9a 83 std Y+2, r25 ; 0x02 11456: 89 83 std Y+1, r24 ; 0x01 11458: f6 cf rjmp .-20 ; 0x11446 // if we didn't receive 'N' but still see '*' if (strchr(cmd_start, '*') != NULL) 1145a: 6a e2 ldi r22, 0x2A ; 42 1145c: 70 e0 ldi r23, 0x00 ; 0 1145e: 0f 94 37 aa call 0x3546e ; 0x3546e 11462: 89 2b or r24, r25 11464: 39 f0 breq .+14 ; 0x11474 { SERIAL_ERROR_START; 11466: 81 eb ldi r24, 0xB1 ; 177 11468: 91 ea ldi r25, 0xA1 ; 161 1146a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM 1146e: 8d eb ldi r24, 0xBD ; 189 11470: 92 e6 ldi r25, 0x62 ; 98 11472: af cf rjmp .-162 ; 0x113d2 cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; // terminate string char* cmd_head = cmdbuffer+bufindw+CMDHDRSIZE; // current command pointer char* cmd_start = cmd_head; // pointer past the line number (if any) if(!comment_mode){ long gcode_N = -1; // seen line number 11474: 44 24 eor r4, r4 11476: 4a 94 dec r4 11478: 54 2c mov r5, r4 1147a: 32 01 movw r6, r4 1147c: d0 cf rjmp .-96 ; 0x1141e if(strcmp_P(cmd_start, PSTR("M112")) == 0) kill(MSG_M112_KILL); // Bypass Stopped for some commands bool allow_when_stopped = false; if(strncmp_P(cmd_start, PSTR("M310"), 4) == 0) 1147e: 44 e0 ldi r20, 0x04 ; 4 11480: 50 e0 ldi r21, 0x00 ; 0 11482: 6b eb ldi r22, 0xBB ; 187 11484: 72 e7 ldi r23, 0x72 ; 114 11486: c7 01 movw r24, r14 11488: 0f 94 bf a1 call 0x3437e ; 0x3437e 1148c: 5c 01 movw r10, r24 allow_when_stopped = true; // Handle the USB timer if ((*cmd_start == 'G') && (GetPrinterState() != PrinterState::IsSDPrinting)) { 1148e: f7 01 movw r30, r14 11490: 80 81 ld r24, Z 11492: 87 34 cpi r24, 0x47 ; 71 11494: 81 f4 brne .+32 ; 0x114b6 11496: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 1149a: 85 30 cpi r24, 0x05 ; 5 1149c: 61 f0 breq .+24 ; 0x114b6 usb_timer.start(); 1149e: 82 e4 ldi r24, 0x42 ; 66 114a0: 92 e1 ldi r25, 0x12 ; 18 114a2: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> PrinterState GetPrinterState() { return printer_state; } PrinterState SetPrinterState(PrinterState status) { return printer_state = status; 114a6: f6 e0 ldi r31, 0x06 ; 6 114a8: f0 93 61 0d sts 0x0D61, r31 ; 0x800d61 <_ZL13printer_state.lto_priv.386> if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 114ac: 60 e0 ldi r22, 0x00 ; 0 114ae: 85 ea ldi r24, 0xA5 ; 165 114b0: 9f e0 ldi r25, 0x0F ; 15 114b2: 0f 94 04 a4 call 0x34808 ; 0x34808 SetPrinterState(PrinterState::IsHostPrinting); //set printer state busy printing to hide LCD menu while USB printing eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); } if (allow_when_stopped == false && Stopped == true) { 114b6: ab 28 or r10, r11 114b8: 21 f0 breq .+8 ; 0x114c2 114ba: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 114be: 81 11 cpse r24, r1 114c0: 98 cf rjmp .-208 ; 0x113f2 } // Command is complete: store the current line into buffer, move to the next line. // Store type of entry cmdbuffer[bufindw] = gcode_N >= 0 ? CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR : CMDBUFFER_CURRENT_TYPE_USB; 114c2: 26 e0 ldi r18, 0x06 ; 6 114c4: 77 fc sbrc r7, 7 114c6: 21 e0 ldi r18, 0x01 ; 1 114c8: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 114cc: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 114d0: fc 01 movw r30, r24 114d2: e5 5b subi r30, 0xB5 ; 181 114d4: ff 4e sbci r31, 0xEF ; 239 114d6: 20 83 st Z, r18 SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ // Store the command itself (without line number or checksum) size_t cmd_len; if (cmd_head == cmd_start) 114d8: 49 81 ldd r20, Y+1 ; 0x01 114da: 5a 81 ldd r21, Y+2 ; 0x02 cmd_len = strlen(cmd_start) + 1; 114dc: f8 01 movw r30, r16 SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ // Store the command itself (without line number or checksum) size_t cmd_len; if (cmd_head == cmd_start) 114de: da 01 movw r26, r20 114e0: 40 17 cp r20, r16 114e2: 51 07 cpc r21, r17 114e4: a1 f5 brne .+104 ; 0x1154e cmd_len = strlen(cmd_start) + 1; 114e6: 01 90 ld r0, Z+ 114e8: 00 20 and r0, r0 114ea: e9 f7 brne .-6 ; 0x114e6 114ec: 9f 01 movw r18, r30 114ee: 20 1b sub r18, r16 114f0: 31 0b sbc r19, r17 // strip the line number cmd_len = 0; do { cmd_head[cmd_len] = cmd_start[cmd_len]; } while (cmd_head[cmd_len++]); } bufindw += cmd_len + CMDHDRSIZE; 114f2: 03 96 adiw r24, 0x03 ; 3 114f4: 28 0f add r18, r24 114f6: 39 1f adc r19, r25 if (bufindw == sizeof(cmdbuffer)) 114f8: 2d 3e cpi r18, 0xED ; 237 114fa: f1 e0 ldi r31, 0x01 ; 1 114fc: 3f 07 cpc r19, r31 114fe: 79 f1 breq .+94 ; 0x1155e // strip the line number cmd_len = 0; do { cmd_head[cmd_len] = cmd_start[cmd_len]; } while (cmd_head[cmd_len++]); } bufindw += cmd_len + CMDHDRSIZE; 11500: 30 93 4a 10 sts 0x104A, r19 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11504: 20 93 49 10 sts 0x1049, r18 ; 0x801049 <_ZL7bufindw.lto_priv.514> if (bufindw == sizeof(cmdbuffer)) bufindw = 0; ++ buflen; 11508: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1150c: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 11510: 01 96 adiw r24, 0x01 ; 1 11512: 90 93 3d 12 sts 0x123D, r25 ; 0x80123d 11516: 80 93 3c 12 sts 0x123C, r24 ; 0x80123c // Update the processed gcode line if (gcode_N >= 0) 1151a: 77 fc sbrc r7, 7 1151c: 08 c0 rjmp .+16 ; 0x1152e gcode_LastN = gcode_N; 1151e: 40 92 3e 12 sts 0x123E, r4 ; 0x80123e 11522: 50 92 3f 12 sts 0x123F, r5 ; 0x80123f 11526: 60 92 40 12 sts 0x1240, r6 ; 0x801240 1152a: 70 92 41 12 sts 0x1241, r7 ; 0x801241 SERIAL_ECHOPGM("Number of commands in the buffer: "); SERIAL_ECHO(buflen); SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ } // end of 'not comment mode' serial_count = 0; //clear buffer 1152e: 10 92 48 10 sts 0x1048, r1 ; 0x801048 11532: 10 92 47 10 sts 0x1047, r1 ; 0x801047 // Don't call cmdqueue_could_enqueue_back if there are no characters waiting // in the queue, as this function will reserve the memory. if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1)) 11536: 0e 94 fc 54 call 0xa9f8 ; 0xa9f8 1153a: 89 2b or r24, r25 1153c: 09 f4 brne .+2 ; 0x11540 1153e: c7 cd rjmp .-1138 ; 0x110ce 11540: 8f e5 ldi r24, 0x5F ; 95 11542: 90 e0 ldi r25, 0x00 ; 0 11544: 0e 94 64 55 call 0xaac8 ; 0xaac8 11548: 81 11 cpse r24, r1 1154a: 7f cd rjmp .-1282 ; 0x1104a 1154c: c0 cd rjmp .-1152 ; 0x110ce if (cmd_head == cmd_start) cmd_len = strlen(cmd_start) + 1; else { // strip the line number cmd_len = 0; do { cmd_head[cmd_len] = cmd_start[cmd_len]; } 1154e: 6d 91 ld r22, X+ 11550: 61 93 st Z+, r22 11552: 9d 01 movw r18, r26 11554: 24 1b sub r18, r20 11556: 35 0b sbc r19, r21 while (cmd_head[cmd_len++]); 11558: 61 11 cpse r22, r1 1155a: f9 cf rjmp .-14 ; 0x1154e 1155c: ca cf rjmp .-108 ; 0x114f2 } bufindw += cmd_len + CMDHDRSIZE; if (bufindw == sizeof(cmdbuffer)) bufindw = 0; 1155e: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11562: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11566: d0 cf rjmp .-96 ; 0x11508 #ifdef ENABLE_MEATPACK } #endif } // end of serial line processing loop if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) { 11568: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1156c: 60 e2 ldi r22, 0x20 ; 32 1156e: 73 e0 ldi r23, 0x03 ; 3 11570: 81 11 cpse r24, r1 11572: 02 c0 rjmp .+4 ; 0x11578 11574: 60 ed ldi r22, 0xD0 ; 208 11576: 77 e0 ldi r23, 0x07 ; 7 11578: 8f e1 ldi r24, 0x1F ; 31 1157a: 93 e0 ldi r25, 0x03 ; 3 1157c: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 11580: 88 23 and r24, r24 11582: 09 f4 brne .+2 ; 0x11586 11584: a0 cd rjmp .-1216 ; 0x110c6 comment_mode = false; 11586: 10 92 1e 03 sts 0x031E, r1 ; 0x80031e serial_count = 0; 1158a: 10 92 48 10 sts 0x1048, r1 ; 0x801048 1158e: 10 92 47 10 sts 0x1047, r1 ; 0x801047 SERIAL_ECHOLNPGM("RX timeout"); 11592: 80 eb ldi r24, 0xB0 ; 176 11594: 92 e7 ldi r25, 0x72 ; 114 11596: 0e 94 bd 7c call 0xf97a ; 0xf97a 1159a: 99 cd rjmp .-1230 ; 0x110ce return; } #ifdef SDSUPPORT if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){ 1159c: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 115a0: 88 23 and r24, r24 115a2: 09 f4 brne .+2 ; 0x115a6 115a4: 94 cd rjmp .-1240 ; 0x110ce 115a6: 80 91 47 10 lds r24, 0x1047 ; 0x801047 115aa: 90 91 48 10 lds r25, 0x1048 ; 0x801048 115ae: 89 2b or r24, r25 115b0: 09 f0 breq .+2 ; 0x115b4 115b2: 8d cd rjmp .-1254 ; 0x110ce //'#' stops reading from SD to the buffer prematurely, so procedural macro calls are possible // if it occurs, stop_buffering is triggered and the buffer is ran dry. // this character _can_ occur in serial com, due to checksums. however, no checksums are used in SD printing static bool stop_buffering=false; if(buflen==0) stop_buffering=false; 115b4: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 115b8: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 115bc: 89 2b or r24, r25 115be: 11 f4 brne .+4 ; 0x115c4 115c0: 10 92 1d 03 sts 0x031D, r1 ; 0x80031d return; // prevent cycling indefinitely - let manage_heaters do their job } // The new command buffer could be updated non-atomically, because it is not yet considered // to be inside the active queue. sd_count.value = card.get_sdpos() - sdpos_atomic; cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD; 115c4: 12 e0 ldi r17, 0x02 ; 2 || serial_char == '#' || serial_count >= (MAX_CMD_SIZE - 1) || n==-1 ){ if(serial_char=='#') stop_buffering=true; 115c6: 01 e0 ldi r16, 0x01 ; 1 } lohi; uint16_t value; } sd_count; sd_count.value = 0; // Reads whole lines from the SD card. Never leaves a half-filled line in the cmdbuffer. while( !card.eof() && !stop_buffering) { 115c8: 40 91 eb 16 lds r20, 0x16EB ; 0x8016eb 115cc: 50 91 ec 16 lds r21, 0x16EC ; 0x8016ec 115d0: 60 91 ed 16 lds r22, 0x16ED ; 0x8016ed 115d4: 70 91 ee 16 lds r23, 0x16EE ; 0x8016ee 115d8: 80 91 e4 16 lds r24, 0x16E4 ; 0x8016e4 115dc: 90 91 e5 16 lds r25, 0x16E5 ; 0x8016e5 115e0: a0 91 e6 16 lds r26, 0x16E6 ; 0x8016e6 115e4: b0 91 e7 16 lds r27, 0x16E7 ; 0x8016e7 115e8: 48 17 cp r20, r24 115ea: 59 07 cpc r21, r25 115ec: 6a 07 cpc r22, r26 115ee: 7b 07 cpc r23, r27 115f0: 08 f0 brcs .+2 ; 0x115f4 115f2: c1 c0 rjmp .+386 ; 0x11776 115f4: 80 91 1d 03 lds r24, 0x031D ; 0x80031d 115f8: 81 11 cpse r24, r1 115fa: bd c0 rjmp .+378 ; 0x11776 FORCE_INLINE bool isFileOpen() { return file.isOpen(); } bool eof() { return sdpos>=filesize; } FORCE_INLINE int16_t getFilteredGcodeChar() { int16_t c = (int16_t)file.readFilteredGcode(); 115fc: 0f 94 ef 6c call 0x2d9de ; 0x2d9de bool createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size); /** \return The current cluster number for a file or directory. */ uint32_t curCluster() const {return curCluster_;} /** \return The current position for a file or directory. */ uint32_t curPosition() const {return curPosition_;} 11600: 40 91 6f 16 lds r20, 0x166F ; 0x80166f 11604: 50 91 70 16 lds r21, 0x1670 ; 0x801670 11608: 60 91 71 16 lds r22, 0x1671 ; 0x801671 1160c: 70 91 72 16 lds r23, 0x1672 ; 0x801672 sdpos = file.curPosition(); 11610: 40 93 eb 16 sts 0x16EB, r20 ; 0x8016eb 11614: 50 93 ec 16 sts 0x16EC, r21 ; 0x8016ec 11618: 60 93 ed 16 sts 0x16ED, r22 ; 0x8016ed 1161c: 70 93 ee 16 sts 0x16EE, r23 ; 0x8016ee 11620: 20 91 47 10 lds r18, 0x1047 ; 0x801047 11624: 30 91 48 10 lds r19, 0x1048 ; 0x801048 int16_t n=card.getFilteredGcodeChar(); char serial_char = (char)n; if( serial_char == '\n' 11628: 8a 30 cpi r24, 0x0A ; 10 1162a: 61 f0 breq .+24 ; 0x11644 || serial_char == '\r' 1162c: 8d 30 cpi r24, 0x0D ; 13 1162e: 51 f0 breq .+20 ; 0x11644 || serial_char == '#' 11630: 83 32 cpi r24, 0x23 ; 35 11632: 09 f4 brne .+2 ; 0x11636 11634: 87 c0 rjmp .+270 ; 0x11744 || serial_count >= (MAX_CMD_SIZE - 1) 11636: 2f 35 cpi r18, 0x5F ; 95 11638: 31 05 cpc r19, r1 1163a: 24 f4 brge .+8 ; 0x11644 || n==-1 1163c: 8f 3f cpi r24, 0xFF ; 255 1163e: 98 07 cpc r25, r24 11640: 09 f0 breq .+2 ; 0x11644 11642: 87 c0 rjmp .+270 ; 0x11752 ){ if(serial_char=='#') stop_buffering=true; if(!serial_count) 11644: 21 15 cp r18, r1 11646: 31 05 cpc r19, r1 11648: 09 f4 brne .+2 ; 0x1164c 1164a: 41 cd rjmp .-1406 ; 0x110ce return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; 1164c: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 11650: 81 11 cpse r24, r1 11652: 03 c0 rjmp .+6 ; 0x1165a 11654: 40 e0 ldi r20, 0x00 ; 0 11656: 50 e0 ldi r21, 0x00 ; 0 11658: ba 01 movw r22, r20 // to the following non-empty line. return; // prevent cycling indefinitely - let manage_heaters do their job } // The new command buffer could be updated non-atomically, because it is not yet considered // to be inside the active queue. sd_count.value = card.get_sdpos() - sdpos_atomic; 1165a: 80 91 49 12 lds r24, 0x1249 ; 0x801249 1165e: 90 91 4a 12 lds r25, 0x124A ; 0x80124a 11662: 48 1b sub r20, r24 11664: 59 0b sbc r21, r25 cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD; 11666: a0 91 49 10 lds r26, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 1166a: b0 91 4a 10 lds r27, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 1166e: fd 01 movw r30, r26 11670: e5 5b subi r30, 0xB5 ; 181 11672: ff 4e sbci r31, 0xEF ; 239 11674: 10 83 st Z, r17 cmdbuffer[bufindw+1] = sd_count.lohi.lo; 11676: 41 83 std Z+1, r20 ; 0x01 cmdbuffer[bufindw+2] = sd_count.lohi.hi; 11678: 52 83 std Z+2, r21 ; 0x02 1167a: 13 96 adiw r26, 0x03 ; 3 cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; //terminate string 1167c: 25 5b subi r18, 0xB5 ; 181 1167e: 3f 4e sbci r19, 0xEF ; 239 11680: f9 01 movw r30, r18 11682: ea 0f add r30, r26 11684: fb 1f adc r31, r27 11686: 10 82 st Z, r1 // Calculate the length before disabling the interrupts. uint8_t len = strlen(cmdbuffer+bufindw+CMDHDRSIZE) + (1 + CMDHDRSIZE); 11688: a5 5b subi r26, 0xB5 ; 181 1168a: bf 4e sbci r27, 0xEF ; 239 1168c: fd 01 movw r30, r26 1168e: 01 90 ld r0, Z+ 11690: 00 20 and r0, r0 11692: e9 f7 brne .-6 ; 0x1168e 11694: 31 97 sbiw r30, 0x01 ; 1 11696: ea 1b sub r30, r26 11698: fb 0b sbc r31, r27 // MYSERIAL.print(cmdbuffer); // SERIAL_ECHOPGM("buflen:"); // MYSERIAL.print(buflen+1); sd_count.value = 0; cli(); 1169a: f8 94 cli // This block locks the interrupts globally for 3.56 us, // which corresponds to a maximum repeat frequency of 280.70 kHz. // This blocking is safe in the context of a 10kHz stepper driver interrupt // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz. ++ buflen; 1169c: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 116a0: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 116a4: 01 96 adiw r24, 0x01 ; 1 116a6: 90 93 3d 12 sts 0x123D, r25 ; 0x80123d 116aa: 80 93 3c 12 sts 0x123C, r24 ; 0x80123c cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD; cmdbuffer[bufindw+1] = sd_count.lohi.lo; cmdbuffer[bufindw+2] = sd_count.lohi.hi; cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; //terminate string // Calculate the length before disabling the interrupts. uint8_t len = strlen(cmdbuffer+bufindw+CMDHDRSIZE) + (1 + CMDHDRSIZE); 116ae: ec 5f subi r30, 0xFC ; 252 // This block locks the interrupts globally for 3.56 us, // which corresponds to a maximum repeat frequency of 280.70 kHz. // This blocking is safe in the context of a 10kHz stepper driver interrupt // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz. ++ buflen; bufindw += len; 116b0: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 116b4: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 116b8: e8 0f add r30, r24 116ba: f9 2f mov r31, r25 116bc: f1 1d adc r31, r1 116be: f0 93 4a 10 sts 0x104A, r31 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 116c2: e0 93 49 10 sts 0x1049, r30 ; 0x801049 <_ZL7bufindw.lto_priv.514> 116c6: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 116ca: 88 23 and r24, r24 116cc: 09 f4 brne .+2 ; 0x116d0 116ce: 3d c0 rjmp .+122 ; 0x1174a 116d0: 80 91 eb 16 lds r24, 0x16EB ; 0x8016eb 116d4: 90 91 ec 16 lds r25, 0x16EC ; 0x8016ec 116d8: a0 91 ed 16 lds r26, 0x16ED ; 0x8016ed 116dc: b0 91 ee 16 lds r27, 0x16EE ; 0x8016ee sdpos_atomic = card.get_sdpos(); 116e0: 80 93 49 12 sts 0x1249, r24 ; 0x801249 116e4: 90 93 4a 12 sts 0x124A, r25 ; 0x80124a 116e8: a0 93 4b 12 sts 0x124B, r26 ; 0x80124b 116ec: b0 93 4c 12 sts 0x124C, r27 ; 0x80124c if (bufindw == sizeof(cmdbuffer)) 116f0: ed 3e cpi r30, 0xED ; 237 116f2: f1 40 sbci r31, 0x01 ; 1 116f4: 21 f4 brne .+8 ; 0x116fe bufindw = 0; 116f6: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 116fa: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> sei(); 116fe: 78 94 sei comment_mode = false; //for new command 11700: 10 92 1e 03 sts 0x031E, r1 ; 0x80031e serial_count = 0; //clear buffer 11704: 10 92 48 10 sts 0x1048, r1 ; 0x801048 11708: 10 92 47 10 sts 0x1047, r1 ; 0x801047 if(card.eof()) break; 1170c: 40 91 eb 16 lds r20, 0x16EB ; 0x8016eb 11710: 50 91 ec 16 lds r21, 0x16EC ; 0x8016ec 11714: 60 91 ed 16 lds r22, 0x16ED ; 0x8016ed 11718: 70 91 ee 16 lds r23, 0x16EE ; 0x8016ee 1171c: 80 91 e4 16 lds r24, 0x16E4 ; 0x8016e4 11720: 90 91 e5 16 lds r25, 0x16E5 ; 0x8016e5 11724: a0 91 e6 16 lds r26, 0x16E6 ; 0x8016e6 11728: b0 91 e7 16 lds r27, 0x16E7 ; 0x8016e7 1172c: 48 17 cp r20, r24 1172e: 59 07 cpc r21, r25 11730: 6a 07 cpc r22, r26 11732: 7b 07 cpc r23, r27 11734: 00 f5 brcc .+64 ; 0x11776 // The following line will reserve buffer space if available. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1)) 11736: 8f e5 ldi r24, 0x5F ; 95 11738: 90 e0 ldi r25, 0x00 ; 0 1173a: 0e 94 64 55 call 0xaac8 ; 0xaac8 1173e: 81 11 cpse r24, r1 11740: 43 cf rjmp .-378 ; 0x115c8 11742: c5 cc rjmp .-1654 ; 0x110ce || serial_char == '#' || serial_count >= (MAX_CMD_SIZE - 1) || n==-1 ){ if(serial_char=='#') stop_buffering=true; 11744: 00 93 1d 03 sts 0x031D, r16 ; 0x80031d 11748: 7d cf rjmp .-262 ; 0x11644 1174a: 80 e0 ldi r24, 0x00 ; 0 1174c: 90 e0 ldi r25, 0x00 ; 0 1174e: dc 01 movw r26, r24 11750: c7 cf rjmp .-114 ; 0x116e0 return; } else { // there are no comments coming from the filtered file cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char; 11752: a9 01 movw r20, r18 11754: 4f 5f subi r20, 0xFF ; 255 11756: 5f 4f sbci r21, 0xFF ; 255 11758: 50 93 48 10 sts 0x1048, r21 ; 0x801048 1175c: 40 93 47 10 sts 0x1047, r20 ; 0x801047 11760: 40 91 49 10 lds r20, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11764: 50 91 4a 10 lds r21, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11768: 45 5b subi r20, 0xB5 ; 181 1176a: 5f 4e sbci r21, 0xEF ; 239 1176c: 24 0f add r18, r20 1176e: 35 1f adc r19, r21 11770: f9 01 movw r30, r18 11772: 83 83 std Z+3, r24 ; 0x03 11774: 29 cf rjmp .-430 ; 0x115c8 } } if(card.eof()) 11776: 40 91 eb 16 lds r20, 0x16EB ; 0x8016eb 1177a: 50 91 ec 16 lds r21, 0x16EC ; 0x8016ec 1177e: 60 91 ed 16 lds r22, 0x16ED ; 0x8016ed 11782: 70 91 ee 16 lds r23, 0x16EE ; 0x8016ee 11786: 80 91 e4 16 lds r24, 0x16E4 ; 0x8016e4 1178a: 90 91 e5 16 lds r25, 0x16E5 ; 0x8016e5 1178e: a0 91 e6 16 lds r26, 0x16E6 ; 0x8016e6 11792: b0 91 e7 16 lds r27, 0x16E7 ; 0x8016e7 11796: 48 17 cp r20, r24 11798: 59 07 cpc r21, r25 1179a: 6a 07 cpc r22, r26 1179c: 7b 07 cpc r23, r27 1179e: 08 f4 brcc .+2 ; 0x117a2 117a0: 96 cc rjmp .-1748 ; 0x110ce { // file was fully buffered, but commands might still need to be planned! // do *not* clear sdprinting until all SD commands are consumed to ensure // SD state can be resumed from a saved printing state. sdprinting is only // cleared by printingHasFinished after peforming all remaining moves. if(!cmdqueue_calc_sd_length()) 117a2: 0e 94 03 79 call 0xf206 ; 0xf206 117a6: 89 2b or r24, r25 117a8: 09 f0 breq .+2 ; 0x117ac 117aa: 91 cc rjmp .-1758 ; 0x110ce { // queue is complete, but before we process EOF commands prevent // re-entry by disabling SD processing from any st_synchronize call card.closefile(); 117ac: 0f 94 f9 65 call 0x2cbf2 ; 0x2cbf2 SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED 117b0: 8a ea ldi r24, 0xAA ; 170 117b2: 92 e6 ldi r25, 0x62 ; 98 117b4: 0e 94 bd 7c call 0xf97a ; 0xf97a char time[30]; uint32_t t = print_job_timer.duration() / 60; 117b8: 0f 94 6d 17 call 0x22eda ; 0x22eda 117bc: 6b 01 movw r12, r22 117be: 7c 01 movw r14, r24 int hours, minutes; minutes = t % 60; hours = t / 60; save_statistics(); 117c0: 0e 94 b0 64 call 0xc960 ; 0xc960 // re-entry by disabling SD processing from any st_synchronize call card.closefile(); SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED char time[30]; uint32_t t = print_job_timer.duration() / 60; 117c4: 8c e3 ldi r24, 0x3C ; 60 117c6: 88 2e mov r8, r24 117c8: 91 2c mov r9, r1 117ca: a1 2c mov r10, r1 117cc: b1 2c mov r11, r1 117ce: c7 01 movw r24, r14 117d0: b6 01 movw r22, r12 117d2: a5 01 movw r20, r10 117d4: 94 01 movw r18, r8 117d6: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> int hours, minutes; minutes = t % 60; 117da: ca 01 movw r24, r20 117dc: b9 01 movw r22, r18 117de: a5 01 movw r20, r10 117e0: 94 01 movw r18, r8 117e2: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> hours = t / 60; save_statistics(); sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); 117e6: 7f 93 push r23 117e8: 6f 93 push r22 SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED char time[30]; uint32_t t = print_job_timer.duration() / 60; int hours, minutes; minutes = t % 60; hours = t / 60; 117ea: c7 01 movw r24, r14 117ec: b6 01 movw r22, r12 117ee: 20 e1 ldi r18, 0x10 ; 16 117f0: 3e e0 ldi r19, 0x0E ; 14 117f2: 40 e0 ldi r20, 0x00 ; 0 117f4: 50 e0 ldi r21, 0x00 ; 0 117f6: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> save_statistics(); sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); 117fa: 3f 93 push r19 117fc: 2f 93 push r18 117fe: 8c e9 ldi r24, 0x9C ; 156 11800: 92 e7 ldi r25, 0x72 ; 114 11802: 9f 93 push r25 11804: 8f 93 push r24 11806: 8e 01 movw r16, r28 11808: 0f 5f subi r16, 0xFF ; 255 1180a: 1f 4f sbci r17, 0xFF ; 255 1180c: 1f 93 push r17 1180e: 0f 93 push r16 11810: 0f 94 f7 a2 call 0x345ee ; 0x345ee SERIAL_ECHO_START; 11814: 8e ec ldi r24, 0xCE ; 206 11816: 91 ea ldi r25, 0xA1 ; 161 11818: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(time); 1181c: c8 01 movw r24, r16 1181e: 0e 94 a1 87 call 0x10f42 ; 0x10f42 #ifndef SHOW_FILENAME_AFTER_FINISH lcd_setstatus(time); 11822: c8 01 movw r24, r16 11824: 0e 94 e8 de call 0x1bdd0 ; 0x1bdd0 #endif //SHOW_FILENAME_AFTER_FINISH card.printingHasFinished(); 11828: 0f 94 2b 73 call 0x2e656 ; 0x2e656 if(!autostart_stilltocheck) return; if(autostart_atmillis.expired(5000)) return; } autostart_stilltocheck = false; 1182c: 10 92 56 02 sts 0x0256, r1 ; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515> if(!mounted) 11830: 0f b6 in r0, 0x3f ; 63 11832: f8 94 cli 11834: de bf out 0x3e, r29 ; 62 11836: 0f be out 0x3f, r0 ; 63 11838: cd bf out 0x3d, r28 ; 61 1183a: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 1183e: 88 23 and r24, r24 11840: 59 f0 breq .+22 ; 0x11858 11842: 0f 94 32 68 call 0x2d064 ; 0x2d064 card.checkautostart(true); if (farm_mode) 11846: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1184a: 88 23 and r24, r24 1184c: 09 f4 brne .+2 ; 0x11850 1184e: 3f cc rjmp .-1922 ; 0x110ce prusa_statistics(6); 11850: 86 e0 ldi r24, 0x06 ; 6 11852: 0f 94 79 32 call 0x264f2 ; 0x264f2 11856: 3b cc rjmp .-1930 ; 0x110ce { mount(); 11858: 81 e0 ldi r24, 0x01 ; 1 1185a: 0f 94 6a 73 call 0x2e6d4 ; 0x2e6d4 if(!mounted) //fail 1185e: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 11862: 81 11 cpse r24, r1 11864: ee cf rjmp .-36 ; 0x11842 11866: ef cf rjmp .-34 ; 0x11846 00011868 : } } #endif //SAFETYTIMER void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h { 11868: 0f 93 push r16 1186a: 1f 93 push r17 1186c: cf 93 push r28 1186e: df 93 push r29 11870: c8 2f mov r28, r24 state = State::disabled; filter = 0; } bool PAT9125_sensor::update() { switch (state) { 11872: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 11876: 81 30 cpi r24, 0x01 ; 1 11878: 09 f4 brne .+2 ; 0x1187c 1187a: 49 c0 rjmp .+146 ; 0x1190e 1187c: 82 30 cpi r24, 0x02 ; 2 1187e: 09 f4 brne .+2 ; 0x11882 11880: 5f c0 rjmp .+190 ; 0x11940 * * If safetytimer_inactive_time is zero, feature is disabled (heating is never turned off because of inactivity) */ static void handleSafetyTimer() { if (printer_active() || !(CHECK_ALL_HEATERS) || !safetytimer_inactive_time) 11882: 0e 94 91 66 call 0xcd22 ; 0xcd22 11886: 81 11 cpse r24, r1 11888: ff c0 rjmp .+510 ; 0x11a88 1188a: 80 91 5d 12 lds r24, 0x125D ; 0x80125d 1188e: 90 91 5e 12 lds r25, 0x125E ; 0x80125e 11892: 00 97 sbiw r24, 0x00 ; 0 11894: 39 f4 brne .+14 ; 0x118a4 11896: 20 91 59 12 lds r18, 0x1259 ; 0x801259 1189a: 30 91 5a 12 lds r19, 0x125A ; 0x80125a 1189e: 23 2b or r18, r19 118a0: 09 f4 brne .+2 ; 0x118a4 118a2: f2 c0 rjmp .+484 ; 0x11a88 118a4: 40 91 33 02 lds r20, 0x0233 ; 0x800233 118a8: 50 91 34 02 lds r21, 0x0234 ; 0x800234 118ac: 60 91 35 02 lds r22, 0x0235 ; 0x800235 118b0: 70 91 36 02 lds r23, 0x0236 ; 0x800236 118b4: 41 15 cp r20, r1 118b6: 51 05 cpc r21, r1 118b8: 61 05 cpc r22, r1 118ba: 71 05 cpc r23, r1 118bc: 09 f4 brne .+2 ; 0x118c0 118be: e4 c0 rjmp .+456 ; 0x11a88 { safetyTimer.stop(); } else if ((CHECK_ALL_HEATERS) && !safetyTimer.running()) 118c0: 89 2b or r24, r25 118c2: 31 f4 brne .+12 ; 0x118d0 118c4: 80 91 59 12 lds r24, 0x1259 ; 0x801259 118c8: 90 91 5a 12 lds r25, 0x125A ; 0x80125a 118cc: 89 2b or r24, r25 118ce: 29 f0 breq .+10 ; 0x118da 118d0: 80 91 ad 05 lds r24, 0x05AD ; 0x8005ad 118d4: 88 23 and r24, r24 118d6: 09 f4 brne .+2 ; 0x118da 118d8: 3f c1 rjmp .+638 ; 0x11b58 { safetyTimer.start(); } else if (safetyTimer.expired(farm_mode?FARM_DEFAULT_SAFETYTIMER_TIME_ms:safetytimer_inactive_time)) 118da: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 118de: 88 23 and r24, r24 118e0: 21 f0 breq .+8 ; 0x118ea 118e2: 40 ee ldi r20, 0xE0 ; 224 118e4: 52 e3 ldi r21, 0x32 ; 50 118e6: 69 e2 ldi r22, 0x29 ; 41 118e8: 70 e0 ldi r23, 0x00 ; 0 118ea: 8d ea ldi r24, 0xAD ; 173 118ec: 95 e0 ldi r25, 0x05 ; 5 118ee: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 118f2: 88 23 and r24, r24 118f4: 09 f4 brne .+2 ; 0x118f8 118f6: ca c0 rjmp .+404 ; 0x11a8c { disable_heater(); 118f8: 0f 94 05 11 call 0x2220a ; 0x2220a lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_HEATING_SAFETY_DISABLED)); 118fc: 80 e6 ldi r24, 0x60 ; 96 118fe: 96 e3 ldi r25, 0x36 ; 54 11900: 0e 94 3a 75 call 0xea74 ; 0xea74 11904: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_return_to_status(); 11908: 0f 94 d5 07 call 0x20faa ; 0x20faa 1190c: bf c0 rjmp .+382 ; 0x11a8c case State::initializing: if (!updatePAT9125()) { 1190e: 0f 94 8a 6e call 0x2dd14 ; 0x2dd14 11912: 88 23 and r24, r24 11914: 09 f4 brne .+2 ; 0x11918 11916: b5 cf rjmp .-150 ; 0x11882 class PAT9125_sensor: public Filament_sensor { public: void init(); void deinit(); bool update(); bool getFilamentPresent() const { return filterFilPresent; } 11918: 81 e0 ldi r24, 0x01 ; 1 1191a: 90 91 fe 16 lds r25, 0x16FE ; 0x8016fe 1191e: 91 11 cpse r25, r1 11920: 01 c0 rjmp .+2 ; 0x11924 11922: 80 e0 ldi r24, 0x00 ; 0 break; // still not stable. Stay in the initialization state. } oldFilamentPresent = 11924: 80 93 f4 16 sts 0x16F4, r24 ; 0x8016f4 getFilamentPresent(); // initialize the current filament state so that we don't create a switching event right after the sensor is ready. oldPos = pat9125_y; 11928: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 1192c: 90 91 39 0e lds r25, 0x0E39 ; 0x800e39 11930: 90 93 01 17 sts 0x1701, r25 ; 0x801701 11934: 80 93 00 17 sts 0x1700, r24 ; 0x801700 state = State::ready; 11938: 82 e0 ldi r24, 0x02 ; 2 1193a: 80 93 f1 16 sts 0x16F1, r24 ; 0x8016f1 1193e: a1 cf rjmp .-190 ; 0x11882 break; case State::ready: { updatePAT9125(); 11940: 0f 94 8a 6e call 0x2dd14 ; 0x2dd14 postponedLoadEvent = false; 11944: 10 92 f5 16 sts 0x16F5, r1 ; 0x8016f5 sensorActionOnError = SensorActionOnError::_Continue; } } bool Filament_sensor::checkFilamentEvents() { if (state != State::ready) 11948: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1194c: 82 30 cpi r24, 0x02 ; 2 1194e: 09 f0 breq .+2 ; 0x11952 11950: 98 cf rjmp .-208 ; 0x11882 return false; if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms 11952: 80 91 f6 16 lds r24, 0x16F6 ; 0x8016f6 11956: 81 11 cpse r24, r1 11958: 40 c0 rjmp .+128 ; 0x119da 1195a: d0 91 fe 16 lds r29, 0x16FE ; 0x8016fe 1195e: 81 e0 ldi r24, 0x01 ; 1 11960: d1 11 cpse r29, r1 11962: 01 c0 rjmp .+2 ; 0x11966 11964: 80 e0 ldi r24, 0x00 ; 0 return false; } bool newFilamentPresent = fsensor.getFilamentPresent(); if (oldFilamentPresent != newFilamentPresent) { 11966: 90 91 f4 16 lds r25, 0x16F4 ; 0x8016f4 1196a: 89 17 cp r24, r25 1196c: 09 f4 brne .+2 ; 0x11970 1196e: 89 cf rjmp .-238 ; 0x11882 oldFilamentPresent = newFilamentPresent; 11970: 80 93 f4 16 sts 0x16F4, r24 ; 0x8016f4 eventBlankingTimer.start(); 11974: 86 ef ldi r24, 0xF6 ; 246 11976: 96 e1 ldi r25, 0x16 ; 22 11978: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> if (newFilamentPresent) { // filament insertion 1197c: dd 23 and r29, r29 1197e: b1 f1 breq .+108 ; 0x119ec } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) && !( 11980: 80 91 f2 16 lds r24, 0x16F2 ; 0x8016f2 11984: 88 23 and r24, r24 11986: 11 f1 breq .+68 ; 0x119cc return false; } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) 11988: 80 91 94 03 lds r24, 0x0394 ; 0x800394 1198c: 81 11 cpse r24, r1 1198e: 1e c0 rjmp .+60 ; 0x119cc && !( 11990: 80 91 01 13 lds r24, 0x1301 ; 0x801301 11994: 81 30 cpi r24, 0x01 ; 1 11996: d1 f0 breq .+52 ; 0x119cc return (block_buffer_head != block_buffer_tail); } //return the nr of buffered moves FORCE_INLINE uint8_t moves_planned() { return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); 11998: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 1199c: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 119a0: 89 1b sub r24, r25 119a2: 8f 70 andi r24, 0x0F ; 15 MMU2::mmu2.Enabled() // quick and dirty hack to prevent spurious runouts while the MMU is in charge || moves_planned() != 0 119a4: 99 f4 brne .+38 ; 0x119cc || printJobOngoing() 119a6: 0e 94 40 66 call 0xcc80 ; 0xcc80 119aa: 81 11 cpse r24, r1 119ac: 0f c0 rjmp .+30 ; 0x119cc || (lcd_commands_type == LcdCommands::Layer1Cal) 119ae: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 119b2: 84 30 cpi r24, 0x04 ; 4 119b4: 59 f0 breq .+22 ; 0x119cc || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) 119b6: 8f e5 ldi r24, 0x5F ; 95 119b8: 9f e0 ldi r25, 0x0F ; 15 119ba: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) && !( 119be: 81 11 cpse r24, r1 119c0: 05 c0 rjmp .+10 ; 0x119cc || printJobOngoing() || (lcd_commands_type == LcdCommands::Layer1Cal) || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) ) ) { menu_submenu(lcd_AutoLoadFilament, true); 119c2: 61 e0 ldi r22, 0x01 ; 1 119c4: 80 e3 ldi r24, 0x30 ; 48 119c6: 98 e3 ldi r25, 0x38 ; 56 119c8: 0e 94 dd 62 call 0xc5ba ; 0xc5ba oldFilamentPresent = newFilamentPresent; eventBlankingTimer.start(); if (newFilamentPresent) { // filament insertion // puts_P(PSTR("filament inserted")); triggerFilamentInserted(); postponedLoadEvent = true; 119cc: 81 e0 ldi r24, 0x01 ; 1 119ce: 80 93 f5 16 sts 0x16F5, r24 ; 0x8016f5 void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h { #ifdef FILAMENT_SENSOR if (fsensor.update()) { lcd_draw_update = 1; //cause lcd update so that fsensor event polling can be done from the lcd draw routine. 119d2: 81 e0 ldi r24, 0x01 ; 1 119d4: 80 93 59 02 sts 0x0259, r24 ; 0x800259 119d8: 54 cf rjmp .-344 ; 0x11882 } bool Filament_sensor::checkFilamentEvents() { if (state != State::ready) return false; if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms 119da: 64 e6 ldi r22, 0x64 ; 100 119dc: 70 e0 ldi r23, 0x00 ; 0 119de: 86 ef ldi r24, 0xF6 ; 246 119e0: 96 e1 ldi r25, 0x16 ; 22 119e2: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 119e6: 81 11 cpse r24, r1 119e8: b8 cf rjmp .-144 ; 0x1195a 119ea: 4b cf rjmp .-362 ; 0x11882 && (eFilamentAction == FilamentAction::None) && ( moves_planned() != 0 || printJobOngoing() ) && !( 119ec: 80 91 f3 16 lds r24, 0x16F3 ; 0x8016f3 119f0: 88 23 and r24, r24 119f2: 79 f3 breq .-34 ; 0x119d2 } void Filament_sensor::triggerFilamentRemoved() { // SERIAL_ECHOLNPGM("triggerFilamentRemoved"); if (runoutEnabled && (eFilamentAction == FilamentAction::None) 119f4: 80 91 94 03 lds r24, 0x0394 ; 0x800394 119f8: 81 11 cpse r24, r1 119fa: eb cf rjmp .-42 ; 0x119d2 119fc: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 11a00: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 11a04: 89 1b sub r24, r25 11a06: 8f 70 andi r24, 0x0F ; 15 && ( 11a08: 21 f4 brne .+8 ; 0x11a12 moves_planned() != 0 || printJobOngoing() 11a0a: 0e 94 40 66 call 0xcc80 ; 0xcc80 11a0e: 88 23 and r24, r24 11a10: 01 f3 breq .-64 ; 0x119d2 ) && !( 11a12: 80 91 73 12 lds r24, 0x1273 ; 0x801273 11a16: 81 11 cpse r24, r1 11a18: dc cf rjmp .-72 ; 0x119d2 saved_printing || MMU2::mmu2.Enabled() // quick and dirty hack to prevent spurious runouts just before the toolchange 11a1a: 80 91 01 13 lds r24, 0x1301 ; 0x801301 11a1e: 81 30 cpi r24, 0x01 ; 1 11a20: c1 f2 breq .-80 ; 0x119d2 || (lcd_commands_type == LcdCommands::Layer1Cal) 11a22: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 11a26: 84 30 cpi r24, 0x04 ; 4 11a28: a1 f2 breq .-88 ; 0x119d2 || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) 11a2a: 8f e5 ldi r24, 0x5F ; 95 11a2c: 9f e0 ldi r25, 0x0F ; 15 11a2e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 && (eFilamentAction == FilamentAction::None) && ( moves_planned() != 0 || printJobOngoing() ) && !( 11a32: 81 11 cpse r24, r1 11a34: ce cf rjmp .-100 ; 0x119d2 } //! @brief Send a notification to the host. Param 'message' must reside in program memory! void sendHostNotification_P(const char* message) { printf_P(MSG_HOST_ACTION_NOTIFICATION, message); 11a36: 88 e7 ldi r24, 0x78 ; 120 11a38: 94 e6 ldi r25, 0x64 ; 100 11a3a: 9f 93 push r25 11a3c: 8f 93 push r24 11a3e: 8e e5 ldi r24, 0x5E ; 94 11a40: 94 e6 ldi r25, 0x64 ; 100 11a42: 9f 93 push r25 11a44: 8f 93 push r24 11a46: 0f 94 a2 a2 call 0x34544 ; 0x34544 void Filament_sensor::filRunout() { // SERIAL_ECHOLNPGM("filRunout"); sendHostNotification_P(MSG_FILAMENT_RUNOUT_DETECTED); runoutEnabled = false; 11a4a: 10 92 f3 16 sts 0x16F3, r1 ; 0x8016f3 autoLoadEnabled = false; 11a4e: 10 92 f2 16 sts 0x16F2, r1 ; 0x8016f2 stop_and_save_print_to_ram(0, 0); 11a52: 60 e0 ldi r22, 0x00 ; 0 11a54: 70 e0 ldi r23, 0x00 ; 0 11a56: cb 01 movw r24, r22 11a58: 0f 94 06 66 call 0x2cc0c ; 0x2cc0c restore_print_from_ram_and_continue(0); 11a5c: 60 e0 ldi r22, 0x00 ; 0 11a5e: 70 e0 ldi r23, 0x00 ; 0 11a60: cb 01 movw r24, r22 11a62: 0e 94 b8 66 call 0xcd70 ; 0xcd70 eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT); 11a66: 85 e6 ldi r24, 0x65 ; 101 11a68: 9f e0 ldi r25, 0x0F ; 15 11a6a: 0e 94 7c 78 call 0xf0f8 ; 0xf0f8 eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); 11a6e: 81 e0 ldi r24, 0x01 ; 1 11a70: 9f e0 ldi r25, 0x0F ; 15 11a72: 0e 94 6f 78 call 0xf0de ; 0xf0de enquecommand_front_P(MSG_M600); 11a76: 8e e5 ldi r24, 0x5E ; 94 11a78: 9c e6 ldi r25, 0x6C ; 108 11a7a: 0f 94 78 67 call 0x2cef0 ; 0x2cef0 11a7e: 0f 90 pop r0 11a80: 0f 90 pop r0 11a82: 0f 90 pop r0 11a84: 0f 90 pop r0 11a86: a5 cf rjmp .-182 ; 0x119d2 inline constexpr Timer() : m_isRunning(false) , m_started(0) {}; void start(); void stop(){m_isRunning = false;} 11a88: 10 92 ad 05 sts 0x05AD, r1 ; 0x8005ad #if defined(KILL_PIN) && KILL_PIN > -1 static int killCount = 0; // make the inactivity button a bit less responsive const int KILL_DELAY = 10000; #endif if(buflen < (BUFSIZE-1)){ 11a8c: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 11a90: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 11a94: 03 97 sbiw r24, 0x03 ; 3 11a96: 14 f4 brge .+4 ; 0x11a9c get_command(); 11a98: 0e 94 a5 87 call 0x10f4a ; 0x10f4a return(block); } // Returns true if the buffer has a queued block, false otherwise FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); 11a9c: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 11aa0: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f } if (blocks_queued() && GetPrinterState() == PrinterState::IsHostPrinting && usb_timer.expired((USB_TIMER_TIMEOUT) / 2)) 11aa4: 98 17 cp r25, r24 11aa6: 81 f0 breq .+32 ; 0x11ac8 11aa8: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 11aac: 86 30 cpi r24, 0x06 ; 6 11aae: 61 f4 brne .+24 ; 0x11ac8 11ab0: 68 e8 ldi r22, 0x88 ; 136 11ab2: 73 e1 ldi r23, 0x13 ; 19 11ab4: 82 e4 ldi r24, 0x42 ; 66 11ab6: 92 e1 ldi r25, 0x12 ; 18 11ab8: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 11abc: 88 23 and r24, r24 11abe: 21 f0 breq .+8 ; 0x11ac8 { // Handle the case where planned moves may take a longer time to execute than the USB timer period. // An example is the toolchange unload sequence generated by PrusaSlicer with default settings. usb_timer.start(); 11ac0: 82 e4 ldi r24, 0x42 ; 66 11ac2: 92 e1 ldi r25, 0x12 ; 18 11ac4: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> } if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time)) 11ac8: 40 91 44 03 lds r20, 0x0344 ; 0x800344 11acc: 50 91 45 03 lds r21, 0x0345 ; 0x800345 11ad0: 60 91 46 03 lds r22, 0x0346 ; 0x800346 11ad4: 70 91 47 03 lds r23, 0x0347 ; 0x800347 11ad8: 41 15 cp r20, r1 11ada: 51 05 cpc r21, r1 11adc: 61 05 cpc r22, r1 11ade: 71 05 cpc r23, r1 11ae0: 09 f0 breq .+2 ; 0x11ae4 11ae2: 3f c0 rjmp .+126 ; 0x11b62 kill(PSTR("Inactivity Shutdown")); if(stepper_inactive_time && previous_millis_cmd.expired(stepper_inactive_time)) { 11ae4: 40 91 37 02 lds r20, 0x0237 ; 0x800237 11ae8: 50 91 38 02 lds r21, 0x0238 ; 0x800238 11aec: 60 91 39 02 lds r22, 0x0239 ; 0x800239 11af0: 70 91 3a 02 lds r23, 0x023A ; 0x80023a 11af4: 41 15 cp r20, r1 11af6: 51 05 cpc r21, r1 11af8: 61 05 cpc r22, r1 11afa: 71 05 cpc r23, r1 11afc: a9 f0 breq .+42 ; 0x11b28 11afe: 88 e4 ldi r24, 0x48 ; 72 11b00: 93 e0 ldi r25, 0x03 ; 3 11b02: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 11b06: 88 23 and r24, r24 11b08: 79 f0 breq .+30 ; 0x11b28 11b0a: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 11b0e: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f if(blocks_queued() == false && ignore_stepper_queue == false) { 11b12: 98 13 cpse r25, r24 11b14: 09 c0 rjmp .+18 ; 0x11b28 11b16: c1 11 cpse r28, r1 11b18: 07 c0 rjmp .+14 ; 0x11b28 disable_x(); 11b1a: 17 9a sbi 0x02, 7 ; 2 11b1c: 10 92 39 06 sts 0x0639, r1 ; 0x800639 disable_y(); 11b20: 16 9a sbi 0x02, 6 ; 2 11b22: 10 92 3a 06 sts 0x063A, r1 ; 0x80063a disable_z(); disable_e0(); 11b26: 14 9a sbi 0x02, 4 ; 2 { uint8_t x_active = 0; uint8_t y_active = 0; uint8_t z_active = 0; uint8_t e_active = 0; uint8_t tail_fan_speed = fanSpeed; 11b28: c0 91 55 12 lds r28, 0x1255 ; 0x801255 block_t *block; if(block_buffer_tail != block_buffer_head) 11b2c: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 11b30: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 11b34: 98 17 cp r25, r24 11b36: 01 f1 breq .+64 ; 0x11b78 { uint8_t block_index = block_buffer_tail; 11b38: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f tail_fan_speed = block_buffer[block_index].fan_speed; 11b3c: 9e e6 ldi r25, 0x6E ; 110 11b3e: 89 9f mul r24, r25 11b40: f0 01 movw r30, r0 11b42: 11 24 eor r1, r1 11b44: ec 55 subi r30, 0x5C ; 92 11b46: f9 4f sbci r31, 0xF9 ; 249 11b48: c0 81 ld r28, Z while(block_index != block_buffer_head) 11b4a: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 11b4e: 98 17 cp r25, r24 11b50: 99 f0 breq .+38 ; 0x11b78 block = &block_buffer[block_index]; if(block->steps[X_AXIS].wide != 0) x_active++; if(block->steps[Y_AXIS].wide != 0) y_active++; if(block->steps[Z_AXIS].wide != 0) z_active++; if(block->steps[E_AXIS].wide != 0) e_active++; block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); 11b52: 8f 5f subi r24, 0xFF ; 255 11b54: 8f 70 andi r24, 0x0F ; 15 11b56: f9 cf rjmp .-14 ; 0x11b4a { safetyTimer.stop(); } else if ((CHECK_ALL_HEATERS) && !safetyTimer.running()) { safetyTimer.start(); 11b58: 8d ea ldi r24, 0xAD ; 173 11b5a: 95 e0 ldi r25, 0x05 ; 5 11b5c: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> 11b60: 95 cf rjmp .-214 ; 0x11a8c // Handle the case where planned moves may take a longer time to execute than the USB timer period. // An example is the toolchange unload sequence generated by PrusaSlicer with default settings. usb_timer.start(); } if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time)) 11b62: 88 e4 ldi r24, 0x48 ; 72 11b64: 93 e0 ldi r25, 0x03 ; 3 11b66: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 11b6a: 88 23 and r24, r24 11b6c: 09 f4 brne .+2 ; 0x11b70 11b6e: ba cf rjmp .-140 ; 0x11ae4 kill(PSTR("Inactivity Shutdown")); 11b70: 8a ee ldi r24, 0xEA ; 234 11b72: 97 e7 ldi r25, 0x77 ; 119 11b74: 0e 94 23 83 call 0x10646 ; 0x10646 if((DISABLE_Z) && (z_active == 0)) disable_z(); if((DISABLE_E) && (e_active == 0)) disable_e0(); #if defined(FAN_PIN) && FAN_PIN > -1 #ifdef FAN_KICKSTART_TIME static unsigned long fan_kick_end; if (tail_fan_speed) { 11b78: cc 23 and r28, r28 11b7a: 09 f4 brne .+2 ; 0x11b7e 11b7c: be c0 rjmp .+380 ; 0x11cfa if (fan_kick_end == 0) { 11b7e: 80 91 3f 03 lds r24, 0x033F ; 0x80033f 11b82: 90 91 40 03 lds r25, 0x0340 ; 0x800340 11b86: a0 91 41 03 lds r26, 0x0341 ; 0x800341 11b8a: b0 91 42 03 lds r27, 0x0342 ; 0x800342 11b8e: 89 2b or r24, r25 11b90: 8a 2b or r24, r26 11b92: 8b 2b or r24, r27 11b94: 81 f4 brne .+32 ; 0x11bb6 // Just starting up fan - run at full power. fan_kick_end = _millis() + FAN_KICKSTART_TIME; 11b96: 0f 94 f0 0d call 0x21be0 ; 0x21be0 11b9a: 60 5e subi r22, 0xE0 ; 224 11b9c: 7c 4f sbci r23, 0xFC ; 252 11b9e: 8f 4f sbci r24, 0xFF ; 255 11ba0: 9f 4f sbci r25, 0xFF ; 255 11ba2: 60 93 3f 03 sts 0x033F, r22 ; 0x80033f 11ba6: 70 93 40 03 sts 0x0340, r23 ; 0x800340 11baa: 80 93 41 03 sts 0x0341, r24 ; 0x800341 11bae: 90 93 42 03 sts 0x0342, r25 ; 0x800342 tail_fan_speed = 255; } else if (fan_kick_end > _millis()) // Fan still spinning up. tail_fan_speed = 255; 11bb2: cf ef ldi r28, 0xFF ; 255 11bb4: 0f c0 rjmp .+30 ; 0x11bd4 if (tail_fan_speed) { if (fan_kick_end == 0) { // Just starting up fan - run at full power. fan_kick_end = _millis() + FAN_KICKSTART_TIME; tail_fan_speed = 255; } else if (fan_kick_end > _millis()) 11bb6: 0f 94 f0 0d call 0x21be0 ; 0x21be0 11bba: 00 91 3f 03 lds r16, 0x033F ; 0x80033f 11bbe: 10 91 40 03 lds r17, 0x0340 ; 0x800340 11bc2: 20 91 41 03 lds r18, 0x0341 ; 0x800341 11bc6: 30 91 42 03 lds r19, 0x0342 ; 0x800342 11bca: 60 17 cp r22, r16 11bcc: 71 07 cpc r23, r17 11bce: 82 07 cpc r24, r18 11bd0: 93 07 cpc r25, r19 11bd2: 78 f3 brcs .-34 ; 0x11bb2 } else { fan_kick_end = 0; } #endif//FAN_KICKSTART_TIME #ifdef FAN_SOFT_PWM if (fan_measuring) { //if measurement is currently in process, fanSpeedSoftPwm must remain set to 255, but we must update fanSpeedBckp value 11bd4: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 11bd8: 88 23 and r24, r24 11bda: 09 f4 brne .+2 ; 0x11bde 11bdc: 97 c0 rjmp .+302 ; 0x11d0c fanSpeedBckp = tail_fan_speed; 11bde: c0 93 65 02 sts 0x0265, r28 ; 0x800265 void MMU2::mmu_loop() { // We only leave this method if the current command was successfully completed - that's the Marlin's way of blocking operation // Atomic compare_exchange would have been the most appropriate solution here, but this gets called only in Marlin's task, // so thread safety should be kept static bool avoidRecursion = false; if (avoidRecursion) { 11be2: 80 91 5f 04 lds r24, 0x045F ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> 11be6: 81 11 cpse r24, r1 11be8: 07 c0 rjmp .+14 ; 0x11bf8 return; } avoidRecursion = true; 11bea: 81 e0 ldi r24, 0x01 ; 1 11bec: 80 93 5f 04 sts 0x045F, r24 ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> mmu_loop_inner(true); 11bf0: 0f 94 38 97 call 0x32e70 ; 0x32e70 avoidRecursion = false; 11bf4: 10 92 5f 04 sts 0x045F, r1 ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> lcd_draw_update = 2; lcd_beeper_quick_feedback(); } void lcd_knob_update() { if (lcd_backlight_wake_trigger) { 11bf8: 80 91 a6 05 lds r24, 0x05A6 ; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501> 11bfc: 88 23 and r24, r24 11bfe: c9 f1 breq .+114 ; 0x11c72 lcd_backlight_wake_trigger = false; 11c00: 10 92 a6 05 sts 0x05A6, r1 ; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501> backlight_wake(); bool did_rotate = false; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 11c04: 4f b7 in r20, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 11c06: f8 94 cli if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { 11c08: 80 91 a4 05 lds r24, 0x05A4 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> 11c0c: 28 2f mov r18, r24 11c0e: 08 2e mov r0, r24 11c10: 00 0c add r0, r0 11c12: 33 0b sbc r19, r19 11c14: 37 ff sbrs r19, 7 11c16: 03 c0 rjmp .+6 ; 0x11c1e 11c18: 31 95 neg r19 11c1a: 21 95 neg r18 11c1c: 31 09 sbc r19, r1 11c1e: 24 30 cpi r18, 0x04 ; 4 11c20: 31 05 cpc r19, r1 11c22: 0c f4 brge .+2 ; 0x11c26 11c24: 76 c0 rjmp .+236 ; 0x11d12 lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP; 11c26: 98 2f mov r25, r24 11c28: 87 ff sbrs r24, 7 11c2a: 02 c0 rjmp .+4 ; 0x11c30 11c2c: 93 e0 ldi r25, 0x03 ; 3 11c2e: 98 0f add r25, r24 11c30: 95 95 asr r25 11c32: 95 95 asr r25 11c34: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 11c38: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 11c3c: 29 0f add r18, r25 11c3e: 31 1d adc r19, r1 11c40: 97 fd sbrc r25, 7 11c42: 3a 95 dec r19 11c44: 30 93 1f 06 sts 0x061F, r19 ; 0x80061f 11c48: 20 93 1e 06 sts 0x061E, r18 ; 0x80061e lcd_encoder_diff %= ENCODER_PULSES_PER_STEP; 11c4c: 83 78 andi r24, 0x83 ; 131 11c4e: 87 ff sbrs r24, 7 11c50: 03 c0 rjmp .+6 ; 0x11c58 11c52: 81 50 subi r24, 0x01 ; 1 11c54: 8c 6f ori r24, 0xFC ; 252 11c56: 8f 5f subi r24, 0xFF ; 255 11c58: 80 93 a4 05 sts 0x05A4, r24 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 11c5c: 4f bf out 0x3f, r20 ; 63 // Get lcd_encoder_diff in sync with the encoder hard steps. // We assume that a click happens only when the knob is rotated into a stable position lcd_encoder_diff = 0; } } Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho); 11c5e: 86 e0 ldi r24, 0x06 ; 6 11c60: 0f 94 ad 25 call 0x24b5a ; 0x24b5a if (lcd_draw_update == 0) { 11c64: 80 91 59 02 lds r24, 0x0259 ; 0x800259 11c68: 81 11 cpse r24, r1 11c6a: 03 c0 rjmp .+6 ; 0x11c72 // Update LCD rendering at minimum lcd_draw_update = 1; 11c6c: 81 e0 ldi r24, 0x01 ; 1 11c6e: 80 93 59 02 sts 0x0259, r24 ; 0x800259 lcd_knob_update(); backlight_update(); // handle longpress if(lcd_longpress_trigger) 11c72: 80 91 a7 05 lds r24, 0x05A7 ; 0x8005a7 11c76: 88 23 and r24, r24 11c78: 61 f0 breq .+24 ; 0x11c92 { lcd_consume_click(); // Reset trigger to prevent recursion 11c7a: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 // long press is not possible in modal mode, wait until ready if (lcd_longpress_func && lcd_update_enabled) 11c7e: e0 91 06 04 lds r30, 0x0406 ; 0x800406 11c82: f0 91 07 04 lds r31, 0x0407 ; 0x800407 11c86: 30 97 sbiw r30, 0x00 ; 0 11c88: 21 f0 breq .+8 ; 0x11c92 11c8a: 80 91 5a 02 lds r24, 0x025A ; 0x80025a 11c8e: 81 11 cpse r24, r1 { lcd_longpress_func(); 11c90: 19 95 eicall } } inline void TimerStart() { auto_report_timer.start(); } inline bool TimerRunning()const { return auto_report_timer.running(); } inline bool TimerExpired() { return auto_report_timer.expired(auto_report_period * 1000ul); } 11c92: 20 91 cf 13 lds r18, 0x13CF ; 0x8013cf 11c96: 30 e0 ldi r19, 0x00 ; 0 11c98: a8 ee ldi r26, 0xE8 ; 232 11c9a: b3 e0 ldi r27, 0x03 ; 3 11c9c: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 11ca0: ab 01 movw r20, r22 11ca2: bc 01 movw r22, r24 11ca4: 80 ed ldi r24, 0xD0 ; 208 11ca6: 93 e1 ldi r25, 0x13 ; 19 11ca8: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> * Output autoreport values according to features requested in M155 */ #if defined(AUTO_REPORT) void host_autoreport() { if (autoReportFeatures.TimerExpired()) 11cac: 88 23 and r24, r24 11cae: 99 f0 breq .+38 ; 0x11cd6 11cb0: 80 91 ce 13 lds r24, 0x13CE ; 0x8013ce { if(autoReportFeatures.Temp()){ 11cb4: 80 fd sbrc r24, 0 gcode_M105(); 11cb6: 0e 94 36 7c call 0xf86c ; 0xf86c 11cba: 80 91 ce 13 lds r24, 0x13CE ; 0x8013ce } if(autoReportFeatures.Pos()){ 11cbe: 82 fd sbrc r24, 2 gcode_M114(); 11cc0: 0e 94 bb 7b call 0xf776 ; 0xf776 11cc4: 80 91 ce 13 lds r24, 0x13CE ; 0x8013ce } #if defined(AUTO_REPORT) && (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))) if(autoReportFeatures.Fans()){ 11cc8: 81 fd sbrc r24, 1 gcode_M123(); 11cca: 0e 94 15 65 call 0xca2a ; 0xca2a } else{ auto_report_timer.stop(); } } inline void TimerStart() { auto_report_timer.start(); } 11cce: 80 ed ldi r24, 0xD0 ; 208 11cd0: 93 e1 ldi r25, 0x13 ; 19 11cd2: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> */ void host_keepalive() { #ifndef HOST_KEEPALIVE_FEATURE return; #endif //HOST_KEEPALIVE_FEATURE if (farm_mode) return; 11cd6: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 11cda: 81 11 cpse r24, r1 11cdc: 02 c0 rjmp .+4 ; 0x11ce2 11cde: 0e 94 c1 7c call 0xf982 ; 0xf982 bool M79_timer_get_status() { return M79_timer.running(); } void M79_timer_update_status() { M79_timer.expired(M79_TIMEOUT); 11ce2: 40 e3 ldi r20, 0x30 ; 48 11ce4: 55 e7 ldi r21, 0x75 ; 117 11ce6: 60 e0 ldi r22, 0x00 ; 0 11ce8: 70 e0 ldi r23, 0x00 ; 0 11cea: 8c e8 ldi r24, 0x8C ; 140 11cec: 93 e0 ldi r25, 0x03 ; 3 #if defined(AUTO_REPORT) host_autoreport(); #endif //AUTO_REPORT host_keepalive(); M79_timer_update_status(); } 11cee: df 91 pop r29 11cf0: cf 91 pop r28 11cf2: 1f 91 pop r17 11cf4: 0f 91 pop r16 11cf6: 0d 94 88 0e jmp 0x21d10 ; 0x21d10 ::expired(unsigned long)> tail_fan_speed = 255; } else if (fan_kick_end > _millis()) // Fan still spinning up. tail_fan_speed = 255; } else { fan_kick_end = 0; 11cfa: 10 92 3f 03 sts 0x033F, r1 ; 0x80033f 11cfe: 10 92 40 03 sts 0x0340, r1 ; 0x800340 11d02: 10 92 41 03 sts 0x0341, r1 ; 0x800341 11d06: 10 92 42 03 sts 0x0342, r1 ; 0x800342 11d0a: 64 cf rjmp .-312 ; 0x11bd4 #ifdef FAN_SOFT_PWM if (fan_measuring) { //if measurement is currently in process, fanSpeedSoftPwm must remain set to 255, but we must update fanSpeedBckp value fanSpeedBckp = tail_fan_speed; } else { fanSpeedSoftPwm = tail_fan_speed; 11d0c: c0 93 1d 06 sts 0x061D, r28 ; 0x80061d 11d10: 68 cf rjmp .-304 ; 0x11be2 did_rotate = true; } else { // Get lcd_encoder_diff in sync with the encoder hard steps. // We assume that a click happens only when the knob is rotated into a stable position lcd_encoder_diff = 0; 11d12: 10 92 a4 05 sts 0x05A4, r1 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> 11d16: 4f bf out 0x3f, r20 ; 63 } } Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho); 11d18: 80 e0 ldi r24, 0x00 ; 0 11d1a: a2 cf rjmp .-188 ; 0x11c60 00011d1c : #endif #endif } void delay_keep_alive(unsigned int ms) { 11d1c: cf 93 push r28 11d1e: df 93 push r29 11d20: ec 01 movw r28, r24 for (;;) { manage_heater(); 11d22: 0f 94 1c 3a call 0x27438 ; 0x27438 // Manage inactivity, but don't disable steppers on timeout. manage_inactivity(true); 11d26: 81 e0 ldi r24, 0x01 ; 1 11d28: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 11d2c: 80 e0 ldi r24, 0x00 ; 0 11d2e: 0e 94 f9 6e call 0xddf2 ; 0xddf2 if (ms == 0) 11d32: 20 97 sbiw r28, 0x00 ; 0 11d34: 99 f0 breq .+38 ; 0x11d5c break; else if (ms >= 50) { 11d36: c2 33 cpi r28, 0x32 ; 50 11d38: d1 05 cpc r29, r1 11d3a: 40 f0 brcs .+16 ; 0x11d4c _delay(50); 11d3c: 62 e3 ldi r22, 0x32 ; 50 11d3e: 70 e0 ldi r23, 0x00 ; 0 11d40: 80 e0 ldi r24, 0x00 ; 0 11d42: 90 e0 ldi r25, 0x00 ; 0 11d44: 0f 94 bd 0d call 0x21b7a ; 0x21b7a ms -= 50; 11d48: e2 97 sbiw r28, 0x32 ; 50 11d4a: eb cf rjmp .-42 ; 0x11d22 } else { _delay(ms); 11d4c: be 01 movw r22, r28 11d4e: 90 e0 ldi r25, 0x00 ; 0 11d50: 80 e0 ldi r24, 0x00 ; 0 11d52: 0f 94 bd 0d call 0x21b7a ; 0x21b7a ms = 0; 11d56: d0 e0 ldi r29, 0x00 ; 0 11d58: c0 e0 ldi r28, 0x00 ; 0 11d5a: e3 cf rjmp .-58 ; 0x11d22 } } } 11d5c: df 91 pop r29 11d5e: cf 91 pop r28 11d60: 08 95 ret 00011d62 : /// @brief Re-use the MMU error screen UI to present choices for filament change /// There are two button actions, Load and Eject /// Load will exit the screen and continue as normally by asking the user which slot to load from /// Eject will eject the depleted filament, very useful after FINDA runout events. /// @param eject_slot the MMU slot to eject if the user selects the Eject button choice static void mmu_M600_filament_change_screen(uint8_t eject_slot) { 11d62: cf 93 push r28 11d64: df 93 push r29 11d66: c8 2f mov r28, r24 inline Buttons GetPrinterButtonOperation() { return printerButtonOperation; } inline void ClearPrinterButtonOperation() { printerButtonOperation = Buttons::NoButton; 11d68: df ef ldi r29, 0xFF ; 255 MMU2::Buttons btn; for(;;) { manage_heater(); 11d6a: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 11d6e: 81 e0 ldi r24, 0x01 ; 1 11d70: 0e 94 34 8c call 0x11868 ; 0x11868 11d74: 80 91 ff 12 lds r24, 0x12FF ; 0x8012ff btn = MMU2::mmu2.GetPrinterButtonOperation(); if (btn != MMU2::Buttons::NoButton) 11d78: 8f 3f cpi r24, 0xFF ; 255 11d7a: d9 f4 brne .+54 ; 0x11db2 // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 11d7c: 80 91 94 12 lds r24, 0x1294 ; 0x801294 11d80: 84 30 cpi r24, 0x04 ; 4 11d82: 21 f4 brne .+8 ; 0x11d8c }; inline void InvokeErrorScreen(ErrorCode ec) { // The printer may not raise an error when the MMU is busy if (!logic.CommandInProgress() // MMU must not be busy && MMUCurrentErrorCode() == ErrorCode::OK // The protocol must not be in error state && lastErrorCode != ec) // The error code is not a duplicate 11d84: 80 91 97 12 lds r24, 0x1297 ; 0x801297 11d88: 81 11 cpse r24, r1 11d8a: ef cf rjmp .-34 ; 0x11d6a return lastReadRegisterValue; }; inline void InvokeErrorScreen(ErrorCode ec) { // The printer may not raise an error when the MMU is busy if (!logic.CommandInProgress() // MMU must not be busy && MMUCurrentErrorCode() == ErrorCode::OK // The protocol must not be in error state 11d8c: 80 91 d2 12 lds r24, 0x12D2 ; 0x8012d2 11d90: 90 91 d3 12 lds r25, 0x12D3 ; 0x8012d3 11d94: 01 97 sbiw r24, 0x01 ; 1 11d96: 49 f7 brne .-46 ; 0x11d6a && lastErrorCode != ec) // The error code is not a duplicate 11d98: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 11d9c: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 11da0: 89 32 cpi r24, 0x29 ; 41 11da2: 90 48 sbci r25, 0x80 ; 128 11da4: 11 f3 breq .-60 ; 0x11d6a { ReportError(ec, ErrorSource::ErrorSourcePrinter); 11da6: 60 e0 ldi r22, 0x00 ; 0 11da8: 89 e2 ldi r24, 0x29 ; 41 11daa: 90 e8 ldi r25, 0x80 ; 128 11dac: 0f 94 97 75 call 0x2eb2e ; 0x2eb2e 11db0: dc cf rjmp .-72 ; 0x11d6a inline Buttons GetPrinterButtonOperation() { return printerButtonOperation; } inline void ClearPrinterButtonOperation() { printerButtonOperation = Buttons::NoButton; 11db2: d0 93 ff 12 sts 0x12FF, r29 ; 0x8012ff { MMU2::mmu2.ClearPrinterButtonOperation(); if (btn == MMU2::Buttons::Eject) { 11db6: 85 30 cpi r24, 0x05 ; 5 11db8: 39 f4 brne .+14 ; 0x11dc8 if (eject_slot != (uint8_t)MMU2::FILAMENT_UNKNOWN) { 11dba: cf 3f cpi r28, 0xFF ; 255 11dbc: f9 f2 breq .-66 ; 0x11d7c MMU2::mmu2.eject_filament(eject_slot, true); 11dbe: 61 e0 ldi r22, 0x01 ; 1 11dc0: 8c 2f mov r24, r28 11dc2: 0f 94 cc 9d call 0x33b98 ; 0x33b98 11dc6: d1 cf rjmp .-94 ; 0x11d6a // the operation is done. We must be careful to not raise FILAMENT_CHANGE // screen too quickly continue; } } else if (btn == MMU2::Buttons::Load) 11dc8: 84 30 cpi r24, 0x04 ; 4 11dca: c1 f6 brne .-80 ; 0x11d7c } } MMU2::mmu2.InvokeErrorScreen(ErrorCode::FILAMENT_CHANGE); } } 11dcc: df 91 pop r29 11dce: cf 91 pop r28 11dd0: 08 95 ret 00011dd2 : //adds an command to the main command buffer //thats really done in a non-safe way. //needs overworking someday // Currently the maximum length of a command piped through this function is around 20 characters void enquecommand(const char *cmd, bool from_progmem) { 11dd2: ff 92 push r15 11dd4: 0f 93 push r16 11dd6: 1f 93 push r17 11dd8: cf 93 push r28 11dda: df 93 push r29 11ddc: ec 01 movw r28, r24 11dde: f6 2e mov r15, r22 size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd); 11de0: 66 23 and r22, r22 11de2: 09 f4 brne .+2 ; 0x11de6 11de4: 4b c0 rjmp .+150 ; 0x11e7c 11de6: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> 11dea: 8c 01 movw r16, r24 // Does cmd fit the queue while leaving sufficient space at the front for the chained commands? // If it fits, it may move bufindw, so it points to a contiguous buffer, which fits cmd. if (cmdqueue_could_enqueue_back(len)) { 11dec: c8 01 movw r24, r16 11dee: 0e 94 64 55 call 0xaac8 ; 0xaac8 11df2: 88 23 and r24, r24 11df4: 09 f4 brne .+2 ; 0x11df8 11df6: 53 c0 rjmp .+166 ; 0x11e9e // This is dangerous if a mixing of serial and this happens // This may easily be tested: If serial_count > 0, we have a problem. cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI; 11df8: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11dfc: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11e00: fc 01 movw r30, r24 11e02: e5 5b subi r30, 0xB5 ; 181 11e04: ff 4e sbci r31, 0xEF ; 239 11e06: 23 e0 ldi r18, 0x03 ; 3 11e08: 20 83 st Z, r18 11e0a: 82 5b subi r24, 0xB2 ; 178 11e0c: 9f 4e sbci r25, 0xEF ; 239 if (from_progmem) strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd); 11e0e: be 01 movw r22, r28 // If it fits, it may move bufindw, so it points to a contiguous buffer, which fits cmd. if (cmdqueue_could_enqueue_back(len)) { // This is dangerous if a mixing of serial and this happens // This may easily be tested: If serial_count > 0, we have a problem. cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI; if (from_progmem) 11e10: ff 20 and r15, r15 11e12: e9 f1 breq .+122 ; 0x11e8e strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd); 11e14: 0f 94 97 a1 call 0x3432e ; 0x3432e else strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd); SERIAL_ECHO_START; 11e18: 8e ec ldi r24, 0xCE ; 206 11e1a: 91 ea ldi r25, 0xA1 ; 161 11e1c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(MSG_Enqueing); 11e20: 8f e9 ldi r24, 0x9F ; 159 11e22: 92 e6 ldi r25, 0x62 ; 98 11e24: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); 11e28: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11e2c: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11e30: 82 5b subi r24, 0xB2 ; 178 11e32: 9f 4e sbci r25, 0xEF ; 239 11e34: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHOLNPGM("\""); 11e38: 8a e7 ldi r24, 0x7A ; 122 11e3a: 92 e7 ldi r25, 0x72 ; 114 11e3c: 0e 94 bd 7c call 0xf97a ; 0xf97a bufindw += len + (CMDHDRSIZE + 1); 11e40: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11e44: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11e48: 04 96 adiw r24, 0x04 ; 4 11e4a: 08 0f add r16, r24 11e4c: 19 1f adc r17, r25 if (bufindw == sizeof(cmdbuffer)) 11e4e: 0d 3e cpi r16, 0xED ; 237 11e50: 81 e0 ldi r24, 0x01 ; 1 11e52: 18 07 cpc r17, r24 11e54: f9 f0 breq .+62 ; 0x11e94 strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd); SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_Enqueing); SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); SERIAL_ECHOLNPGM("\""); bufindw += len + (CMDHDRSIZE + 1); 11e56: 10 93 4a 10 sts 0x104A, r17 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11e5a: 00 93 49 10 sts 0x1049, r16 ; 0x801049 <_ZL7bufindw.lto_priv.514> if (bufindw == sizeof(cmdbuffer)) bufindw = 0; ++ buflen; 11e5e: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 11e62: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 11e66: 01 96 adiw r24, 0x01 ; 1 11e68: 90 93 3d 12 sts 0x123D, r25 ; 0x80123d 11e6c: 80 93 3c 12 sts 0x123C, r24 ; 0x80123c SERIAL_ECHOLNRPGM(bufferFull); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 11e70: df 91 pop r29 11e72: cf 91 pop r28 11e74: 1f 91 pop r17 11e76: 0f 91 pop r16 11e78: ff 90 pop r15 11e7a: 08 95 ret //thats really done in a non-safe way. //needs overworking someday // Currently the maximum length of a command piped through this function is around 20 characters void enquecommand(const char *cmd, bool from_progmem) { size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd); 11e7c: fc 01 movw r30, r24 11e7e: 01 90 ld r0, Z+ 11e80: 00 20 and r0, r0 11e82: e9 f7 brne .-6 ; 0x11e7e 11e84: 31 97 sbiw r30, 0x01 ; 1 11e86: 8f 01 movw r16, r30 11e88: 08 1b sub r16, r24 11e8a: 19 0b sbc r17, r25 11e8c: af cf rjmp .-162 ; 0x11dec // This may easily be tested: If serial_count > 0, we have a problem. cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI; if (from_progmem) strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd); else strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd); 11e8e: 0f 94 4b aa call 0x35496 ; 0x35496 11e92: c2 cf rjmp .-124 ; 0x11e18 SERIAL_ECHORPGM(MSG_Enqueing); SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); SERIAL_ECHOLNPGM("\""); bufindw += len + (CMDHDRSIZE + 1); if (bufindw == sizeof(cmdbuffer)) bufindw = 0; 11e94: 10 92 4a 10 sts 0x104A, r1 ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 11e98: 10 92 49 10 sts 0x1049, r1 ; 0x801049 <_ZL7bufindw.lto_priv.514> 11e9c: e0 cf rjmp .-64 ; 0x11e5e ++ buflen; #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; 11e9e: 81 eb ldi r24, 0xB1 ; 177 11ea0: 91 ea ldi r25, 0xA1 ; 161 11ea2: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(MSG_Enqueing); 11ea6: 8f e9 ldi r24, 0x9F ; 159 11ea8: 92 e6 ldi r25, 0x62 ; 98 11eaa: 0e 94 c4 7a call 0xf588 ; 0xf588 if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); 11eae: ce 01 movw r24, r28 cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; SERIAL_ECHORPGM(MSG_Enqueing); if (from_progmem) 11eb0: ff 20 and r15, r15 11eb2: 59 f0 breq .+22 ; 0x11eca SERIAL_PROTOCOLRPGM(cmd); 11eb4: 0e 94 c4 7a call 0xf588 ; 0xf588 else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 11eb8: 8f e7 ldi r24, 0x7F ; 127 11eba: 91 ea ldi r25, 0xA1 ; 161 #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 11ebc: df 91 pop r29 11ebe: cf 91 pop r28 11ec0: 1f 91 pop r17 11ec2: 0f 91 pop r16 11ec4: ff 90 pop r15 SERIAL_ECHORPGM(MSG_Enqueing); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 11ec6: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 11eca: 0e 94 95 87 call 0x10f2a ; 0x10f2a 11ece: f4 cf rjmp .-24 ; 0x11eb8 00011ed0 : } menu_item++; } void menu_item_gcode_P(const char* str, const char* str_gcode) { 11ed0: cf 93 push r28 11ed2: df 93 push r29 if (menu_item == menu_line) 11ed4: 30 91 63 04 lds r19, 0x0463 ; 0x800463 11ed8: 20 91 62 04 lds r18, 0x0462 ; 0x800462 11edc: 32 13 cpse r19, r18 11ede: 20 c0 rjmp .+64 ; 0x11f20 11ee0: eb 01 movw r28, r22 11ee2: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); 11ee4: 80 91 59 02 lds r24, 0x0259 ; 0x800259 11ee8: 88 23 and r24, r24 11eea: 19 f0 breq .+6 ; 0x11ef2 11eec: 80 e2 ldi r24, 0x20 ; 32 11eee: 0e 94 86 72 call 0xe50c ; 0xe50c if (menu_clicked && (lcd_encoder == menu_item)) 11ef2: 80 91 61 04 lds r24, 0x0461 ; 0x800461 11ef6: 88 23 and r24, r24 11ef8: 99 f0 breq .+38 ; 0x11f20 11efa: 20 91 63 04 lds r18, 0x0463 ; 0x800463 11efe: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 11f02: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 11f06: 28 17 cp r18, r24 11f08: 19 06 cpc r1, r25 11f0a: 51 f4 brne .+20 ; 0x11f20 { if (str_gcode) enquecommand_P(str_gcode); 11f0c: 20 97 sbiw r28, 0x00 ; 0 11f0e: 21 f0 breq .+8 ; 0x11f18 11f10: 61 e0 ldi r22, 0x01 ; 1 11f12: ce 01 movw r24, r28 11f14: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 menu_item_ret(); return; } } menu_item++; } 11f18: df 91 pop r29 11f1a: cf 91 pop r28 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); if (menu_clicked && (lcd_encoder == menu_item)) { if (str_gcode) enquecommand_P(str_gcode); menu_item_ret(); 11f1c: 0c 94 73 62 jmp 0xc4e6 ; 0xc4e6 return; } } menu_item++; 11f20: 80 91 63 04 lds r24, 0x0463 ; 0x800463 11f24: 8f 5f subi r24, 0xFF ; 255 11f26: 80 93 63 04 sts 0x0463, r24 ; 0x800463 } 11f2a: df 91 pop r29 11f2c: cf 91 pop r28 11f2e: 08 95 ret 00011f30 : { return extrusion_width - layer_height * (overlap_factor - M_PI/4); } // Common code extracted into one function to reduce code size static void lay1cal_common_enqueue_loop(const char * const * cmd_sequence, const uint8_t steps) { 11f30: 0f 93 push r16 11f32: 1f 93 push r17 11f34: cf 93 push r28 11f36: df 93 push r29 11f38: d6 2f mov r29, r22 11f3a: 8c 01 movw r16, r24 for (uint8_t i = 0; i < steps; ++i) 11f3c: c0 e0 ldi r28, 0x00 ; 0 { void * const pgm_ptr = pgm_read_ptr(cmd_sequence + i); 11f3e: f8 01 movw r30, r16 11f40: 85 91 lpm r24, Z+ 11f42: 94 91 lpm r25, Z // M702 is currently only used with MMU enabled if (pgm_ptr == MSG_M702 && !MMU2::mmu2.Enabled()) { 11f44: 28 e6 ldi r18, 0x68 ; 104 11f46: 8c 3c cpi r24, 0xCC ; 204 11f48: 92 07 cpc r25, r18 11f4a: 21 f4 brne .+8 ; 0x11f54 11f4c: 20 91 01 13 lds r18, 0x1301 ; 0x801301 11f50: 21 30 cpi r18, 0x01 ; 1 11f52: 19 f4 brne .+6 ; 0x11f5a continue; } enquecommand_P(static_cast(pgm_ptr)); 11f54: 61 e0 ldi r22, 0x01 ; 1 11f56: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 return extrusion_width - layer_height * (overlap_factor - M_PI/4); } // Common code extracted into one function to reduce code size static void lay1cal_common_enqueue_loop(const char * const * cmd_sequence, const uint8_t steps) { for (uint8_t i = 0; i < steps; ++i) 11f5a: cf 5f subi r28, 0xFF ; 255 11f5c: 0e 5f subi r16, 0xFE ; 254 11f5e: 1f 4f sbci r17, 0xFF ; 255 11f60: dc 13 cpse r29, r28 11f62: ed cf rjmp .-38 ; 0x11f3e continue; } enquecommand_P(static_cast(pgm_ptr)); } } 11f64: df 91 pop r29 11f66: cf 91 pop r28 11f68: 1f 91 pop r17 11f6a: 0f 91 pop r16 11f6c: 08 95 ret 00011f6e : static const char bufferFull[] PROGMEM = "\" failed: Buffer full!"; static const char enqueingFront[] PROGMEM = "Enqueing to the front: \""; void enquecommandf_P(const char *fmt, ...) { 11f6e: cf 93 push r28 11f70: df 93 push r29 11f72: cd b7 in r28, 0x3d ; 61 11f74: de b7 in r29, 0x3e ; 62 11f76: 6e 97 sbiw r28, 0x1e ; 30 11f78: 0f b6 in r0, 0x3f ; 63 11f7a: f8 94 cli 11f7c: de bf out 0x3e, r29 ; 62 11f7e: 0f be out 0x3f, r0 ; 63 11f80: cd bf out 0x3d, r28 ; 61 11f82: 9e 01 movw r18, r28 11f84: 2c 5d subi r18, 0xDC ; 220 11f86: 3f 4f sbci r19, 0xFF ; 255 11f88: f9 01 movw r30, r18 11f8a: 41 91 ld r20, Z+ 11f8c: 51 91 ld r21, Z+ 11f8e: 9f 01 movw r18, r30 // MAX_CMD_SIZE is 96, but for formatting // string we usually don't need more than 30 bytes char cmd_buffer[30]; va_list ap; va_start(ap, fmt); vsnprintf_P(cmd_buffer, sizeof(cmd_buffer), fmt, ap); 11f90: 6e e1 ldi r22, 0x1E ; 30 11f92: 70 e0 ldi r23, 0x00 ; 0 11f94: ce 01 movw r24, r28 11f96: 01 96 adiw r24, 0x01 ; 1 11f98: 0f 94 36 a3 call 0x3466c ; 0x3466c va_end(ap); enquecommand(cmd_buffer, false); 11f9c: 60 e0 ldi r22, 0x00 ; 0 11f9e: ce 01 movw r24, r28 11fa0: 01 96 adiw r24, 0x01 ; 1 11fa2: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 } 11fa6: 6e 96 adiw r28, 0x1e ; 30 11fa8: 0f b6 in r0, 0x3f ; 63 11faa: f8 94 cli 11fac: de bf out 0x3e, r29 ; 62 11fae: 0f be out 0x3f, r0 ; 63 11fb0: cd bf out 0x3d, r28 ; 61 11fb2: df 91 pop r29 11fb4: cf 91 pop r28 11fb6: 08 95 ret 00011fb8 : They are shown in order of appearance in the code. There are reasons why some G Codes aren't in numerical order. */ void process_commands() 11fb8: 2f 92 push r2 11fba: 3f 92 push r3 11fbc: 4f 92 push r4 11fbe: 5f 92 push r5 11fc0: 6f 92 push r6 11fc2: 7f 92 push r7 11fc4: 8f 92 push r8 11fc6: 9f 92 push r9 11fc8: af 92 push r10 11fca: bf 92 push r11 11fcc: cf 92 push r12 11fce: df 92 push r13 11fd0: ef 92 push r14 11fd2: ff 92 push r15 11fd4: 0f 93 push r16 11fd6: 1f 93 push r17 11fd8: cf 93 push r28 11fda: df 93 push r29 11fdc: cd b7 in r28, 0x3d ; 61 11fde: de b7 in r29, 0x3e ; 62 11fe0: c3 56 subi r28, 0x63 ; 99 11fe2: d1 09 sbc r29, r1 11fe4: 0f b6 in r0, 0x3f ; 63 11fe6: f8 94 cli 11fe8: de bf out 0x3e, r29 ; 62 11fea: 0f be out 0x3f, r0 ; 63 11fec: cd bf out 0x3d, r28 ; 61 #endif /* CMDBUFFER_DEBUG */ unsigned long codenum; //throw away variable // PRUSA GCODES KEEPALIVE_STATE(IN_HANDLER); 11fee: 82 e0 ldi r24, 0x02 ; 2 11ff0: 80 93 78 02 sts 0x0278, r24 ; 0x800278 st_backlash_y = bl; printf_P(_N("st_backlash_y = %d\n"), st_backlash_y); } #endif //BACKLASH_Y #endif //TMC2130 else if(strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("PRUSA"), 5) == 0) { 11ff4: 00 91 38 12 lds r16, 0x1238 ; 0x801238 11ff8: 10 91 39 12 lds r17, 0x1239 ; 0x801239 11ffc: 02 5b subi r16, 0xB2 ; 178 11ffe: 1f 4e sbci r17, 0xEF ; 239 12000: 45 e0 ldi r20, 0x05 ; 5 12002: 50 e0 ldi r21, 0x00 ; 0 12004: 66 e5 ldi r22, 0x56 ; 86 12006: 71 e8 ldi r23, 0x81 ; 129 12008: c8 01 movw r24, r16 1200a: 0f 94 bf a1 call 0x3437e ; 0x3437e 1200e: 89 2b or r24, r25 12010: 09 f0 breq .+2 ; 0x12014 12012: 9b c1 rjmp .+822 ; 0x1234a eeprom_update_byte_notify((uint8_t*)EEPROM_FAN_CHECK_ENABLED, true); } } bool farm_prusa_code_seen() { if (!farm_mode) 12014: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 12018: 88 23 and r24, r24 1201a: 09 f4 brne .+2 ; 0x1201e 1201c: 4d c0 rjmp .+154 ; 0x120b8 return false; if (code_seen_P(PSTR("PRN"))) { // PRUSA PRN 1201e: 85 e6 ldi r24, 0x65 ; 101 12020: 9e e7 ldi r25, 0x7E ; 126 12022: 0f 94 62 3c call 0x278c4 ; 0x278c4 12026: 88 23 and r24, r24 12028: 79 f0 breq .+30 ; 0x12048 printf_P(_N("%u"), status_number); 1202a: 80 91 bd 04 lds r24, 0x04BD ; 0x8004bd <_ZL13status_number.lto_priv.492> 1202e: 1f 92 push r1 12030: 8f 93 push r24 12032: 82 e0 ldi r24, 0x02 ; 2 12034: 95 e6 ldi r25, 0x65 ; 101 int index; for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); /*for (++strchr_pointer; *strchr_pointer == ' ' || *strchr_pointer == '\t'; ++strchr_pointer);*/ if (*(strchr_pointer+index) < '0' || *(strchr_pointer+index) > '9') { printf_P(PSTR("Invalid M code: %s\n"), cmdbuffer + bufindr + CMDHDRSIZE); 12036: 9f 93 push r25 12038: 8f 93 push r24 1203a: 0f 94 a2 a2 call 0x34544 ; 0x34544 1203e: 0f 90 pop r0 12040: 0f 90 pop r0 12042: 0f 90 pop r0 12044: 0f 90 pop r0 12046: 08 c0 rjmp .+16 ; 0x12058 } else if (code_seen_P(PSTR("thx"))) { // PRUSA thx 12048: 81 e6 ldi r24, 0x61 ; 97 1204a: 9e e7 ldi r25, 0x7E ; 126 1204c: 0f 94 62 3c call 0x278c4 ; 0x278c4 12050: 88 23 and r24, r24 12052: 41 f0 breq .+16 ; 0x12064 no_response = false; 12054: 10 92 08 04 sts 0x0408, r1 ; 0x800408 <_ZL11no_response.lto_priv.493> SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); } KEEPALIVE_STATE(NOT_BUSY); 12058: 81 e0 ldi r24, 0x01 ; 1 1205a: 80 93 78 02 sts 0x0278, r24 ; 0x800278 ClearToSend(); 1205e: 0e 94 22 85 call 0x10a44 ; 0x10a44 12062: 3a c2 rjmp .+1140 ; 0x124d8 trace(); prusa_sd_card_upload = true; card.openFileWrite(strchr_pointer+4); } #endif //PRUSA_M28 else if (code_seen_P(PSTR("fv"))) { // PRUSA fv 12064: 8e e5 ldi r24, 0x5E ; 94 12066: 9e e7 ldi r25, 0x7E ; 126 12068: 0f 94 62 3c call 0x278c4 ; 0x278c4 1206c: 88 23 and r24, r24 1206e: 21 f1 breq .+72 ; 0x120b8 // get file version #ifdef SDSUPPORT card.openFileReadFilteredGcode(strchr_pointer + 3, true); 12070: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 12074: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 12078: 61 e0 ldi r22, 0x01 ; 1 1207a: 03 96 adiw r24, 0x03 ; 3 1207c: 0f 94 f3 71 call 0x2e3e6 ; 0x2e3e6 FORCE_INLINE bool isFileOpen() { return file.isOpen(); } bool eof() { return sdpos>=filesize; } FORCE_INLINE int16_t getFilteredGcodeChar() { int16_t c = (int16_t)file.readFilteredGcode(); 12080: 0f 94 ef 6c call 0x2d9de ; 0x2d9de 12084: 8c 01 movw r16, r24 sdpos = file.curPosition(); 12086: 80 91 6f 16 lds r24, 0x166F ; 0x80166f 1208a: 90 91 70 16 lds r25, 0x1670 ; 0x801670 1208e: a0 91 71 16 lds r26, 0x1671 ; 0x801671 12092: b0 91 72 16 lds r27, 0x1672 ; 0x801672 12096: 80 93 eb 16 sts 0x16EB, r24 ; 0x8016eb 1209a: 90 93 ec 16 sts 0x16EC, r25 ; 0x8016ec 1209e: a0 93 ed 16 sts 0x16ED, r26 ; 0x8016ed 120a2: b0 93 ee 16 sts 0x16EE, r27 ; 0x8016ee while (true) { uint16_t readByte = card.getFilteredGcodeChar(); MYSERIAL.write(readByte); 120a6: 80 2f mov r24, r16 120a8: 0e 94 b1 79 call 0xf362 ; 0xf362 if (readByte == '\n') { 120ac: 0a 30 cpi r16, 0x0A ; 10 120ae: 11 05 cpc r17, r1 120b0: 39 f7 brne .-50 ; 0x12080 break; } } card.closefile(); 120b2: 0f 94 f9 65 call 0x2cbf2 ; 0x2cbf2 120b6: d0 cf rjmp .-96 ; 0x12058 - `nozzle D` - check the nozzle diameter (farm mode only), works like M862.1 P, e.g. `PRUSA nozzle D0.4` - `nozzle` - prints nozzle diameter (farm mode only), works like M862.1 P, e.g. `PRUSA nozzle` */ if (farm_prusa_code_seen()) {} else if(code_seen_P(PSTR("FANPINTST"))) { 120b8: 8c e4 ldi r24, 0x4C ; 76 120ba: 91 e8 ldi r25, 0x81 ; 129 120bc: 0f 94 62 3c call 0x278c4 ; 0x278c4 120c0: 81 11 cpse r24, r1 120c2: ca cf rjmp .-108 ; 0x12058 gcode_PRUSA_BadRAMBoFanTest(); } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN 120c4: 88 e4 ldi r24, 0x48 ; 72 120c6: 91 e8 ldi r25, 0x81 ; 129 120c8: 0f 94 62 3c call 0x278c4 ; 0x278c4 120cc: 88 23 and r24, r24 120ce: 21 f1 breq .+72 ; 0x12118 printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]); 120d0: 40 91 b9 03 lds r20, 0x03B9 ; 0x8003b9 120d4: 50 91 ba 03 lds r21, 0x03BA ; 0x8003ba 120d8: 2c e3 ldi r18, 0x3C ; 60 120da: 24 9f mul r18, r20 120dc: c0 01 movw r24, r0 120de: 25 9f mul r18, r21 120e0: 90 0d add r25, r0 120e2: 11 24 eor r1, r1 120e4: 9f 93 push r25 120e6: 8f 93 push r24 120e8: 40 91 b7 03 lds r20, 0x03B7 ; 0x8003b7 120ec: 50 91 b8 03 lds r21, 0x03B8 ; 0x8003b8 120f0: 24 9f mul r18, r20 120f2: c0 01 movw r24, r0 120f4: 25 9f mul r18, r21 120f6: 90 0d add r25, r0 120f8: 11 24 eor r1, r1 120fa: 9f 93 push r25 120fc: 8f 93 push r24 120fe: 86 e3 ldi r24, 0x36 ; 54 12100: 97 e6 ldi r25, 0x67 ; 103 #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //DEBUG_DCODES default: printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE); 12102: 9f 93 push r25 12104: 8f 93 push r24 12106: 0f 94 a2 a2 call 0x34544 ; 0x34544 1210a: 0f 90 pop r0 1210c: 0f 90 pop r0 1210e: 0f 90 pop r0 12110: 0f 90 pop r0 12112: 0f 90 pop r0 12114: 0f 90 pop r0 12116: a0 cf rjmp .-192 ; 0x12058 if (farm_prusa_code_seen()) {} else if(code_seen_P(PSTR("FANPINTST"))) { gcode_PRUSA_BadRAMBoFanTest(); } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]); } else if (code_seen_P(PSTR("uvlo"))) { // PRUSA uvlo 12118: 83 e4 ldi r24, 0x43 ; 67 1211a: 91 e8 ldi r25, 0x81 ; 129 1211c: 0f 94 62 3c call 0x278c4 ; 0x278c4 12120: 88 23 and r24, r24 12122: 11 f1 breq .+68 ; 0x12168 if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_SD) { 12124: 8c e8 ldi r24, 0x8C ; 140 12126: 9f e0 ldi r25, 0x0F ; 15 12128: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1212c: 81 11 cpse r24, r1 1212e: 10 c0 rjmp .+32 ; 0x12150 // M24 - Start SD print enquecommand_P(MSG_M24); 12130: 61 e0 ldi r22, 0x01 ; 1 12132: 83 e6 ldi r24, 0x63 ; 99 12134: 9c e6 ldi r25, 0x6C ; 108 12136: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 1213a: 60 e0 ldi r22, 0x00 ; 0 1213c: 85 ea ldi r24, 0xA5 ; 165 1213e: 9f e0 ldi r25, 0x0F ; 15 12140: 0f 94 04 a4 call 0x34808 ; 0x34808 12144: 60 e0 ldi r22, 0x00 ; 0 12146: 8f e7 ldi r24, 0x7F ; 127 12148: 9c e0 ldi r25, 0x0C ; 12 1214a: 0f 94 04 a4 call 0x34808 ; 0x34808 1214e: 84 cf rjmp .-248 ; 0x12058 // Print is recovered, clear the recovery flag eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0); } else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST) { 12150: 81 30 cpi r24, 0x01 ; 1 12152: 09 f0 breq .+2 ; 0x12156 12154: 81 cf rjmp .-254 ; 0x12058 // For Host prints we need to start the timer so that the pause has any effect // this will allow g-codes to be processed while in the paused state // For SD prints, M24 starts the timer print_job_timer.start(); 12156: 0f 94 25 19 call 0x2324a ; 0x2324a usb_timer.start(); 1215a: 82 e4 ldi r24, 0x42 ; 66 1215c: 92 e1 ldi r25, 0x12 ; 18 1215e: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> // Park the extruder to the side and don't resume the print // we must assume that the host as not fully booted up at this point lcd_pause_print(); 12162: 0f 94 fc 0d call 0x21bf8 ; 0x21bf8 12166: 78 cf rjmp .-272 ; 0x12058 } } else if (code_seen_P(PSTR("MMURES"))) { // PRUSA MMURES 12168: 8c e3 ldi r24, 0x3C ; 60 1216a: 91 e8 ldi r25, 0x81 ; 129 1216c: 0f 94 62 3c call 0x278c4 ; 0x278c4 12170: 88 23 and r24, r24 12172: 21 f0 breq .+8 ; 0x1217c break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 12174: 80 e0 ldi r24, 0x00 ; 0 12176: 0f 94 43 95 call 0x32a86 ; 0x32a86 1217a: 6e cf rjmp .-292 ; 0x12058 MMU2::mmu2.Reset(MMU2::MMU2::Software); } else if (code_seen_P(PSTR("RESET"))) { // PRUSA RESET 1217c: 86 e3 ldi r24, 0x36 ; 54 1217e: 91 e8 ldi r25, 0x81 ; 129 12180: 0f 94 62 3c call 0x278c4 ; 0x278c4 12184: 81 11 cpse r24, r1 #if defined(XFLASH) && defined(BOOTAPP) boot_app_magic = 0; #endif //defined(XFLASH) && defined(BOOTAPP) softReset(); 12186: 0e 94 1f 66 call 0xcc3e ; 0xcc3e } else if (code_seen_P(PSTR("SN"))) { // PRUSA SN 1218a: 83 e3 ldi r24, 0x33 ; 51 1218c: 91 e8 ldi r25, 0x81 ; 129 1218e: 0f 94 62 3c call 0x278c4 ; 0x278c4 12192: 88 23 and r24, r24 12194: a9 f0 breq .+42 ; 0x121c0 char SN[20]; eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); 12196: 44 e1 ldi r20, 0x14 ; 20 12198: 50 e0 ldi r21, 0x00 ; 0 1219a: 65 e1 ldi r22, 0x15 ; 21 1219c: 7d e0 ldi r23, 0x0D ; 13 1219e: ce 01 movw r24, r28 121a0: 01 96 adiw r24, 0x01 ; 1 121a2: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 if (SN[19]) 121a6: 8c 89 ldd r24, Y+20 ; 0x14 121a8: 88 23 and r24, r24 121aa: 29 f0 breq .+10 ; 0x121b6 puts_P(PSTR("SN invalid")); 121ac: 88 e2 ldi r24, 0x28 ; 40 121ae: 91 e8 ldi r25, 0x81 ; 129 121b0: 0f 94 c9 a2 call 0x34592 ; 0x34592 121b4: 51 cf rjmp .-350 ; 0x12058 else puts(SN); 121b6: ce 01 movw r24, r28 121b8: 01 96 adiw r24, 0x01 ; 1 121ba: 0f 94 6f aa call 0x354de ; 0x354de 121be: 4c cf rjmp .-360 ; 0x12058 } else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir 121c0: 84 e2 ldi r24, 0x24 ; 36 121c2: 91 e8 ldi r25, 0x81 ; 129 121c4: 0f 94 62 3c call 0x278c4 ; 0x278c4 121c8: 88 23 and r24, r24 121ca: 29 f0 breq .+10 ; 0x121d6 SERIAL_PROTOCOLLNPGM(FW_VERSION_FULL); 121cc: 88 e1 ldi r24, 0x18 ; 24 121ce: 91 e8 ldi r25, 0x81 ; 129 else { SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); 121d0: 0e 94 bd 7c call 0xf97a ; 0xf97a 121d4: 41 cf rjmp .-382 ; 0x12058 puts(SN); } else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir SERIAL_PROTOCOLLNPGM(FW_VERSION_FULL); } else if(code_seen_P(PSTR("Rev"))){ // PRUSA Rev 121d6: 84 e1 ldi r24, 0x14 ; 20 121d8: 91 e8 ldi r25, 0x81 ; 129 121da: 0f 94 62 3c call 0x278c4 ; 0x278c4 121de: 88 23 and r24, r24 121e0: 19 f0 breq .+6 ; 0x121e8 SERIAL_PROTOCOLLNPGM(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE ); 121e2: 85 ef ldi r24, 0xF5 ; 245 121e4: 90 e8 ldi r25, 0x80 ; 128 121e6: f4 cf rjmp .-24 ; 0x121d0 } else if(code_seen_P(PSTR("Lang"))) { // PRUSA Lang 121e8: 80 ef ldi r24, 0xF0 ; 240 121ea: 90 e8 ldi r25, 0x80 ; 128 121ec: 0f 94 62 3c call 0x278c4 ; 0x278c4 121f0: 88 23 and r24, r24 121f2: 19 f0 breq .+6 ; 0x121fa lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { case 0: // Level 0: Language reset lang_reset(); 121f4: 0e 94 3d 74 call 0xe87a ; 0xe87a 121f8: 2f cf rjmp .-418 ; 0x12058 SERIAL_PROTOCOLLNPGM(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE ); } else if(code_seen_P(PSTR("Lang"))) { // PRUSA Lang lang_reset(); } else if(code_seen_P(PSTR("Lz"))) { // PRUSA Lz 121fa: 8d ee ldi r24, 0xED ; 237 121fc: 90 e8 ldi r25, 0x80 ; 128 121fe: 0f 94 62 3c call 0x278c4 ; 0x278c4 12202: 88 23 and r24, r24 12204: 79 f0 breq .+30 ; 0x12224 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 12206: 81 ea ldi r24, 0xA1 ; 161 12208: 9d e0 ldi r25, 0x0D ; 13 1220a: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1220e: 2b e0 ldi r18, 0x0B ; 11 12210: 82 9f mul r24, r18 12212: c0 01 movw r24, r0 12214: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 12216: 70 e0 ldi r23, 0x00 ; 0 12218: 60 e0 ldi r22, 0x00 ; 0 1221a: 80 5b subi r24, 0xB0 ; 176 1221c: 92 4f sbci r25, 0xF2 ; 242 1221e: 0f 94 22 a4 call 0x34844 ; 0x34844 12222: 1a cf rjmp .-460 ; 0x12058 } else if(code_seen_P(PSTR("FR"))) { // PRUSA FR 12224: 8a ee ldi r24, 0xEA ; 234 12226: 90 e8 ldi r25, 0x80 ; 128 12228: 0f 94 62 3c call 0x278c4 ; 0x278c4 1222c: 88 23 and r24, r24 1222e: 51 f0 breq .+20 ; 0x12244 // Factory reset function // This function is used to erase parts or whole EEPROM memory which is used for storing calibration and and so on. // Level input parameter sets depth of reset static void factory_reset(char level) { lcd_clear(); 12230: 0e 94 26 70 call 0xe04c ; 0xe04c Sound_MakeCustom(100,0,false); 12234: 40 e0 ldi r20, 0x00 ; 0 12236: 70 e0 ldi r23, 0x00 ; 0 12238: 60 e0 ldi r22, 0x00 ; 0 1223a: 84 e6 ldi r24, 0x64 ; 100 1223c: 90 e0 ldi r25, 0x00 ; 0 1223e: 0f 94 be 27 call 0x24f7c ; 0x24f7c 12242: d8 cf rjmp .-80 ; 0x121f4 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); } else if(code_seen_P(PSTR("FR"))) { // PRUSA FR // Factory full reset factory_reset(0); } else if(code_seen_P(PSTR("MBL"))) { // PRUSA MBL 12244: 86 ee ldi r24, 0xE6 ; 230 12246: 90 e8 ldi r25, 0x80 ; 128 12248: 0f 94 62 3c call 0x278c4 ; 0x278c4 1224c: 88 23 and r24, r24 1224e: e1 f0 breq .+56 ; 0x12288 // Change the MBL status without changing the logical Z position. if(code_seen('V')) { 12250: 86 e5 ldi r24, 0x56 ; 86 12252: 0e 94 f5 55 call 0xabea ; 0xabea 12256: 88 23 and r24, r24 12258: 09 f4 brne .+2 ; 0x1225c 1225a: fe ce rjmp .-516 ; 0x12058 bool value = code_value_short(); 1225c: 0e 94 17 56 call 0xac2e ; 0xac2e 12260: 11 e0 ldi r17, 0x01 ; 1 12262: 89 2b or r24, r25 12264: 09 f4 brne .+2 ; 0x12268 12266: 10 e0 ldi r17, 0x00 ; 0 st_synchronize(); 12268: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if(value != mbl.active) { 1226c: 80 91 09 13 lds r24, 0x1309 ; 0x801309 12270: 90 e0 ldi r25, 0x00 ; 0 12272: 18 17 cp r17, r24 12274: 19 06 cpc r1, r25 12276: 09 f4 brne .+2 ; 0x1227a 12278: ef ce rjmp .-546 ; 0x12058 mbl.active = value; 1227a: 10 93 09 13 sts 0x1309, r17 ; 0x801309 // Use plan_set_z_position to reset the physical values plan_set_z_position(current_position[Z_AXIS]); 1227e: 89 e6 ldi r24, 0x69 ; 105 12280: 92 e1 ldi r25, 0x12 ; 18 12282: 0f 94 0c 3d call 0x27a18 ; 0x27a18 12286: e8 ce rjmp .-560 ; 0x12058 } } } else if (code_seen_P(PSTR("nozzle"))) { // PRUSA nozzle 12288: 8f ed ldi r24, 0xDF ; 223 1228a: 90 e8 ldi r25, 0x80 ; 128 1228c: 0f 94 62 3c call 0x278c4 ; 0x278c4 12290: 88 23 and r24, r24 12292: 09 f4 brne .+2 ; 0x12296 12294: e1 ce rjmp .-574 ; 0x12058 uint16_t nDiameter; if(code_seen('D')) { 12296: 84 e4 ldi r24, 0x44 ; 68 12298: 0e 94 f5 55 call 0xabea ; 0xabea 1229c: 88 23 and r24, r24 1229e: a1 f0 breq .+40 ; 0x122c8 nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 122a0: 0e 94 85 5a call 0xb50a ; 0xb50a 122a4: 20 e0 ldi r18, 0x00 ; 0 122a6: 30 e0 ldi r19, 0x00 ; 0 122a8: 4a e7 ldi r20, 0x7A ; 122 122aa: 54 e4 ldi r21, 0x44 ; 68 122ac: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 122b0: 20 e0 ldi r18, 0x00 ; 0 122b2: 30 e0 ldi r19, 0x00 ; 0 122b4: 40 e0 ldi r20, 0x00 ; 0 122b6: 5f e3 ldi r21, 0x3F ; 63 122b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 122bc: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> nozzle_diameter_check(nDiameter); 122c0: cb 01 movw r24, r22 122c2: 0e 94 1e eb call 0x1d63c ; 0x1d63c 122c6: c8 ce rjmp .-624 ; 0x12058 } else if(code_seen_P(PSTR("set")) && farm_mode) { 122c8: 8b ed ldi r24, 0xDB ; 219 122ca: 90 e8 ldi r25, 0x80 ; 128 122cc: 0f 94 62 3c call 0x278c4 ; 0x278c4 122d0: 88 23 and r24, r24 122d2: 49 f1 breq .+82 ; 0x12326 122d4: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 122d8: 88 23 and r24, r24 122da: 29 f1 breq .+74 ; 0x12326 strchr_pointer++; // skip 1st char (~ 's') strchr_pointer++; // skip 2nd char (~ 'e') 122dc: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 122e0: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 122e4: 02 96 adiw r24, 0x02 ; 2 122e6: 90 93 bc 04 sts 0x04BC, r25 ; 0x8004bc 122ea: 80 93 bb 04 sts 0x04BB, r24 ; 0x8004bb nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 122ee: 0e 94 85 5a call 0xb50a ; 0xb50a 122f2: 6b 01 movw r12, r22 122f4: 7c 01 movw r14, r24 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 122f6: 6f ef ldi r22, 0xFF ; 255 122f8: 87 ea ldi r24, 0xA7 ; 167 122fa: 9d e0 ldi r25, 0x0D ; 13 122fc: 0f 94 04 a4 call 0x34808 ; 0x34808 12300: 20 e0 ldi r18, 0x00 ; 0 12302: 30 e0 ldi r19, 0x00 ; 0 12304: 4a e7 ldi r20, 0x7A ; 122 12306: 54 e4 ldi r21, 0x44 ; 68 12308: c7 01 movw r24, r14 1230a: b6 01 movw r22, r12 1230c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12310: 20 e0 ldi r18, 0x00 ; 0 12312: 30 e0 ldi r19, 0x00 ; 0 12314: 40 e0 ldi r20, 0x00 ; 0 12316: 5f e3 ldi r21, 0x3F ; 63 12318: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1231c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 12320: 85 ea ldi r24, 0xA5 ; 165 12322: 9d e0 ldi r25, 0x0D ; 13 12324: 7c cf rjmp .-264 ; 0x1221e eeprom_update_byte_notify((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)ClNozzleDiameter::_Diameter_Undef); // for correct synchronization after farm-mode exiting eeprom_update_word_notify((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); } else SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); 12326: 85 ea ldi r24, 0xA5 ; 165 12328: 9d e0 ldi r25, 0x0D ; 13 1232a: 0f 94 ee a3 call 0x347dc ; 0x347dc 1232e: bc 01 movw r22, r24 12330: 90 e0 ldi r25, 0x00 ; 0 12332: 80 e0 ldi r24, 0x00 ; 0 12334: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 12338: 20 e0 ldi r18, 0x00 ; 0 1233a: 30 e0 ldi r19, 0x00 ; 0 1233c: 4a e7 ldi r20, 0x7A ; 122 1233e: 54 e4 ldi r21, 0x44 ; 68 12340: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12344: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 12348: 87 ce rjmp .-754 ; 0x12058 } } else if(*CMDBUFFER_CURRENT_STRING == 'G') 1234a: d8 01 movw r26, r16 1234c: 8c 91 ld r24, X 1234e: 87 34 cpi r24, 0x47 ; 71 12350: 11 f0 breq .+4 ; 0x12356 12352: 0c 94 d0 9c jmp 0x139a0 ; 0x139a0 { strchr_pointer = CMDBUFFER_CURRENT_STRING; 12356: 10 93 bc 04 sts 0x04BC, r17 ; 0x8004bc 1235a: 00 93 bb 04 sts 0x04BB, r16 ; 0x8004bb gcode_in_progress = code_value_short(); 1235e: 0e 94 17 56 call 0xac2e ; 0xac2e 12362: 90 93 56 03 sts 0x0356, r25 ; 0x800356 12366: 80 93 55 03 sts 0x0355, r24 ; 0x800355 // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1236a: 8b 34 cpi r24, 0x4B ; 75 1236c: 91 05 cpc r25, r1 1236e: 09 f4 brne .+2 ; 0x12372 12370: 45 c6 rjmp .+3210 ; 0x12ffc 12372: 0c f0 brlt .+2 ; 0x12376 12374: 4b c1 rjmp .+662 ; 0x1260c 12376: 84 30 cpi r24, 0x04 ; 4 12378: 91 05 cpc r25, r1 1237a: 09 f4 brne .+2 ; 0x1237e 1237c: aa c5 rjmp .+2900 ; 0x12ed2 1237e: 0c f0 brlt .+2 ; 0x12382 12380: c5 c0 rjmp .+394 ; 0x1250c 12382: 97 fd sbrc r25, 7 12384: cf c0 rjmp .+414 ; 0x12524 12386: 02 97 sbiw r24, 0x02 ; 2 12388: 0c f0 brlt .+2 ; 0x1238c 1238a: a2 c1 rjmp .+836 ; 0x126d0 */ case 0: // G0 -> G1 case 1: // G1 { uint16_t start_segment_idx = restore_interrupted_gcode(); 1238c: 0e 94 b1 54 call 0xa962 ; 0xa962 12390: 8c 01 movw r16, r24 get_coordinates(); // For X Y Z E F 12392: 0e 94 ac 5b call 0xb758 ; 0xb758 if (total_filament_used > ((current_position[E_AXIS] - destination[E_AXIS]) * 100)) { //protection against total_filament_used overflow 12396: 60 91 17 06 lds r22, 0x0617 ; 0x800617 1239a: 70 91 18 06 lds r23, 0x0618 ; 0x800618 1239e: 80 91 19 06 lds r24, 0x0619 ; 0x800619 123a2: 90 91 1a 06 lds r25, 0x061A ; 0x80061a 123a6: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 123aa: 6b 01 movw r12, r22 123ac: 7c 01 movw r14, r24 123ae: 40 90 6d 12 lds r4, 0x126D ; 0x80126d 123b2: 50 90 6e 12 lds r5, 0x126E ; 0x80126e 123b6: 60 90 6f 12 lds r6, 0x126F ; 0x80126f 123ba: 70 90 70 12 lds r7, 0x1270 ; 0x801270 123be: 80 90 35 06 lds r8, 0x0635 ; 0x800635 123c2: 90 90 36 06 lds r9, 0x0636 ; 0x800636 123c6: a0 90 37 06 lds r10, 0x0637 ; 0x800637 123ca: b0 90 38 06 lds r11, 0x0638 ; 0x800638 123ce: a5 01 movw r20, r10 123d0: 94 01 movw r18, r8 123d2: c3 01 movw r24, r6 123d4: b2 01 movw r22, r4 123d6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 123da: 20 e0 ldi r18, 0x00 ; 0 123dc: 30 e0 ldi r19, 0x00 ; 0 123de: 48 ec ldi r20, 0xC8 ; 200 123e0: 52 e4 ldi r21, 0x42 ; 66 123e2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 123e6: 9b 01 movw r18, r22 123e8: ac 01 movw r20, r24 123ea: c7 01 movw r24, r14 123ec: b6 01 movw r22, r12 123ee: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 123f2: 18 16 cp r1, r24 123f4: d4 f4 brge .+52 ; 0x1242a total_filament_used = total_filament_used + ((destination[E_AXIS] - current_position[E_AXIS]) * 100); 123f6: a3 01 movw r20, r6 123f8: 92 01 movw r18, r4 123fa: c5 01 movw r24, r10 123fc: b4 01 movw r22, r8 123fe: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12402: 20 e0 ldi r18, 0x00 ; 0 12404: 30 e0 ldi r19, 0x00 ; 0 12406: 48 ec ldi r20, 0xC8 ; 200 12408: 52 e4 ldi r21, 0x42 ; 66 1240a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1240e: a7 01 movw r20, r14 12410: 96 01 movw r18, r12 12412: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12416: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1241a: 60 93 17 06 sts 0x0617, r22 ; 0x800617 1241e: 70 93 18 06 sts 0x0618, r23 ; 0x800618 12422: 80 93 19 06 sts 0x0619, r24 ; 0x800619 12426: 90 93 1a 06 sts 0x061A, r25 ; 0x80061a } #ifdef FWRETRACT if(cs.autoretract_enabled) { 1242a: 80 91 e9 0d lds r24, 0x0DE9 ; 0x800de9 1242e: 88 23 and r24, r24 12430: 09 f4 brne .+2 ; 0x12434 12432: 46 c1 rjmp .+652 ; 0x126c0 if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { 12434: 88 e5 ldi r24, 0x58 ; 88 12436: 0e 94 f5 55 call 0xabea ; 0xabea 1243a: 81 11 cpse r24, r1 1243c: 41 c1 rjmp .+642 ; 0x126c0 1243e: 89 e5 ldi r24, 0x59 ; 89 12440: 0e 94 f5 55 call 0xabea ; 0xabea 12444: 81 11 cpse r24, r1 12446: 3c c1 rjmp .+632 ; 0x126c0 12448: 8a e5 ldi r24, 0x5A ; 90 1244a: 0e 94 f5 55 call 0xabea ; 0xabea 1244e: 81 11 cpse r24, r1 12450: 37 c1 rjmp .+622 ; 0x126c0 12452: 85 e4 ldi r24, 0x45 ; 69 12454: 0e 94 f5 55 call 0xabea ; 0xabea 12458: 88 23 and r24, r24 1245a: 09 f4 brne .+2 ; 0x1245e 1245c: 31 c1 rjmp .+610 ; 0x126c0 float echange=destination[E_AXIS]-current_position[E_AXIS]; 1245e: 20 91 6d 12 lds r18, 0x126D ; 0x80126d 12462: 30 91 6e 12 lds r19, 0x126E ; 0x80126e 12466: 40 91 6f 12 lds r20, 0x126F ; 0x80126f 1246a: 50 91 70 12 lds r21, 0x1270 ; 0x801270 1246e: 60 91 35 06 lds r22, 0x0635 ; 0x800635 12472: 70 91 36 06 lds r23, 0x0636 ; 0x800636 12476: 80 91 37 06 lds r24, 0x0637 ; 0x800637 1247a: 90 91 38 06 lds r25, 0x0638 ; 0x800638 1247e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12482: 6b 01 movw r12, r22 12484: 7c 01 movw r14, r24 if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover 12486: 2d ec ldi r18, 0xCD ; 205 12488: 3c ec ldi r19, 0xCC ; 204 1248a: 4c ec ldi r20, 0xCC ; 204 1248c: 5d eb ldi r21, 0xBD ; 189 1248e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12492: 87 ff sbrs r24, 7 12494: 07 c1 rjmp .+526 ; 0x126a4 12496: 80 91 1b 06 lds r24, 0x061B ; 0x80061b 1249a: 81 11 cpse r24, r1 1249c: 0c 94 0d bc jmp 0x1781a ; 0x1781a st_synchronize(); 124a0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations 124a4: 80 91 35 06 lds r24, 0x0635 ; 0x800635 124a8: 90 91 36 06 lds r25, 0x0636 ; 0x800636 124ac: a0 91 37 06 lds r26, 0x0637 ; 0x800637 124b0: b0 91 38 06 lds r27, 0x0638 ; 0x800638 124b4: 80 93 6d 12 sts 0x126D, r24 ; 0x80126d 124b8: 90 93 6e 12 sts 0x126E, r25 ; 0x80126e 124bc: a0 93 6f 12 sts 0x126F, r26 ; 0x80126f 124c0: b0 93 70 12 sts 0x1270, r27 ; 0x801270 plan_set_e_position(current_position[E_AXIS]); //AND from the planner 124c4: 8d e6 ldi r24, 0x6D ; 109 124c6: 92 e1 ldi r25, 0x12 ; 18 124c8: 0f 94 d9 3c call 0x279b2 ; 0x279b2 retract(!retracted[active_extruder]); 124cc: 90 91 1b 06 lds r25, 0x061B ; 0x80061b 124d0: 81 e0 ldi r24, 0x01 ; 1 124d2: 89 27 eor r24, r25 124d4: 0f 94 2c 90 call 0x32058 ; 0x32058 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); } KEEPALIVE_STATE(NOT_BUSY); ClearToSend(); } 124d8: cd 59 subi r28, 0x9D ; 157 124da: df 4f sbci r29, 0xFF ; 255 124dc: 0f b6 in r0, 0x3f ; 63 124de: f8 94 cli 124e0: de bf out 0x3e, r29 ; 62 124e2: 0f be out 0x3f, r0 ; 63 124e4: cd bf out 0x3d, r28 ; 61 124e6: df 91 pop r29 124e8: cf 91 pop r28 124ea: 1f 91 pop r17 124ec: 0f 91 pop r16 124ee: ff 90 pop r15 124f0: ef 90 pop r14 124f2: df 90 pop r13 124f4: cf 90 pop r12 124f6: bf 90 pop r11 124f8: af 90 pop r10 124fa: 9f 90 pop r9 124fc: 8f 90 pop r8 124fe: 7f 90 pop r7 12500: 6f 90 pop r6 12502: 5f 90 pop r5 12504: 4f 90 pop r4 12506: 3f 90 pop r3 12508: 2f 90 pop r2 1250a: 08 95 ret else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1250c: 85 31 cpi r24, 0x15 ; 21 1250e: 91 05 cpc r25, r1 12510: 09 f4 brne .+2 ; 0x12514 12512: d9 c0 rjmp .+434 ; 0x126c6 12514: fc f4 brge .+62 ; 0x12554 12516: 8a 30 cpi r24, 0x0A ; 10 12518: 91 05 cpc r25, r1 1251a: 09 f4 brne .+2 ; 0x1251e 1251c: 23 c5 rjmp .+2630 ; 0x12f64 1251e: 0b 97 sbiw r24, 0x0b ; 11 12520: 09 f4 brne .+2 ; 0x12524 12522: 24 c5 rjmp .+2632 ; 0x12f6c case 99: farm_gcode_g99(); break; #endif //PRUSA_FARM default: printf_P(MSG_UNKNOWN_CODE, 'G', cmdbuffer + bufindr + CMDHDRSIZE); 12524: 80 91 38 12 lds r24, 0x1238 ; 0x801238 12528: 90 91 39 12 lds r25, 0x1239 ; 0x801239 1252c: 82 5b subi r24, 0xB2 ; 178 1252e: 9f 4e sbci r25, 0xEF ; 239 12530: 9f 93 push r25 12532: 8f 93 push r24 12534: 1f 92 push r1 12536: 87 e4 ldi r24, 0x47 ; 71 12538: 8f 93 push r24 1253a: 88 e5 ldi r24, 0x58 ; 88 1253c: 96 e6 ldi r25, 0x66 ; 102 1253e: 9f 93 push r25 12540: 8f 93 push r24 12542: 0f 94 a2 a2 call 0x34544 ; 0x34544 12546: 0f 90 pop r0 12548: 0f 90 pop r0 1254a: 0f 90 pop r0 1254c: 0f 90 pop r0 1254e: 0f 90 pop r0 12550: 0f 90 pop r0 12552: b9 c0 rjmp .+370 ; 0x126c6 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 12554: 8c 31 cpi r24, 0x1C ; 28 12556: 91 05 cpc r25, r1 12558: 09 f4 brne .+2 ; 0x1255c 1255a: 0a c5 rjmp .+2580 ; 0x12f70 1255c: 4e 97 sbiw r24, 0x1e ; 30 1255e: 11 f7 brne .-60 ; 0x12524 Sensor must be over the bed. The maximum travel distance before an error is triggered is 10mm. */ case 30: { st_synchronize(); 12560: 0f 94 fb 1a call 0x235f6 ; 0x235f6 homing_flag = true; 12564: 81 e0 ldi r24, 0x01 ; 1 12566: 80 93 71 12 sts 0x1271, r24 ; 0x801271 // TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly int l_feedmultiply = setup_for_endstop_move(); 1256a: 0e 94 66 65 call 0xcacc ; 0xcacc 1256e: 8c 01 movw r16, r24 feedrate = homing_feedrate[Z_AXIS]; 12570: 80 e0 ldi r24, 0x00 ; 0 12572: 90 e0 ldi r25, 0x00 ; 0 12574: a8 e4 ldi r26, 0x48 ; 72 12576: b4 e4 ldi r27, 0x44 ; 68 12578: 80 93 7a 02 sts 0x027A, r24 ; 0x80027a 1257c: 90 93 7b 02 sts 0x027B, r25 ; 0x80027b 12580: a0 93 7c 02 sts 0x027C, r26 ; 0x80027c 12584: b0 93 7d 02 sts 0x027D, r27 ; 0x80027d find_bed_induction_sensor_point_z(-10.f, 3); 12588: 43 e0 ldi r20, 0x03 ; 3 1258a: 60 e0 ldi r22, 0x00 ; 0 1258c: 70 e0 ldi r23, 0x00 ; 0 1258e: 80 e2 ldi r24, 0x20 ; 32 12590: 91 ec ldi r25, 0xC1 ; 193 12592: 0f 94 ed 7b call 0x2f7da ; 0x2f7da printf_P(_N("%S X: %.5f Y: %.5f Z: %.5f\n"), _T(MSG_BED), _x, _y, _z); 12596: 70 90 69 12 lds r7, 0x1269 ; 0x801269 1259a: 60 90 6a 12 lds r6, 0x126A ; 0x80126a 1259e: 50 90 6b 12 lds r5, 0x126B ; 0x80126b 125a2: 40 90 6c 12 lds r4, 0x126C ; 0x80126c 125a6: b0 90 65 12 lds r11, 0x1265 ; 0x801265 125aa: a0 90 66 12 lds r10, 0x1266 ; 0x801266 125ae: 90 90 67 12 lds r9, 0x1267 ; 0x801267 125b2: 80 90 68 12 lds r8, 0x1268 ; 0x801268 125b6: f0 90 61 12 lds r15, 0x1261 ; 0x801261 125ba: e0 90 62 12 lds r14, 0x1262 ; 0x801262 125be: d0 90 63 12 lds r13, 0x1263 ; 0x801263 125c2: c0 90 64 12 lds r12, 0x1264 ; 0x801264 125c6: 81 ec ldi r24, 0xC1 ; 193 125c8: 94 e4 ldi r25, 0x44 ; 68 125ca: 0e 94 3a 75 call 0xea74 ; 0xea74 125ce: 4f 92 push r4 125d0: 5f 92 push r5 125d2: 6f 92 push r6 125d4: 7f 92 push r7 125d6: 8f 92 push r8 125d8: 9f 92 push r9 125da: af 92 push r10 125dc: bf 92 push r11 125de: cf 92 push r12 125e0: df 92 push r13 125e2: ef 92 push r14 125e4: ff 92 push r15 125e6: 9f 93 push r25 125e8: 8f 93 push r24 125ea: 81 e1 ldi r24, 0x11 ; 17 125ec: 97 e6 ldi r25, 0x67 ; 103 125ee: 9f 93 push r25 125f0: 8f 93 push r24 125f2: 0f 94 a2 a2 call 0x34544 ; 0x34544 clean_up_after_endstop_move(l_feedmultiply); 125f6: c8 01 movw r24, r16 125f8: 0e 94 4c 65 call 0xca98 ; 0xca98 homing_flag = false; 125fc: 10 92 71 12 sts 0x1271, r1 ; 0x801271 12600: 0f b6 in r0, 0x3f ; 63 12602: f8 94 cli 12604: de bf out 0x3e, r29 ; 62 12606: 0f be out 0x3f, r0 ; 63 12608: cd bf out 0x3d, r28 ; 61 1260a: 5d c0 rjmp .+186 ; 0x126c6 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1260c: 88 35 cpi r24, 0x58 ; 88 1260e: 91 05 cpc r25, r1 12610: 09 f4 brne .+2 ; 0x12614 12612: 59 c0 rjmp .+178 ; 0x126c6 12614: f4 f4 brge .+60 ; 0x12652 12616: 81 35 cpi r24, 0x51 ; 81 12618: 91 05 cpc r25, r1 1261a: 11 f4 brne .+4 ; 0x12620 1261c: 0c 94 16 9c jmp 0x1382c ; 0x1382c 12620: 5c f4 brge .+22 ; 0x12638 12622: 8c 34 cpi r24, 0x4C ; 76 12624: 91 05 cpc r25, r1 12626: 09 f4 brne .+2 ; 0x1262a 12628: 0c c5 rjmp .+2584 ; 0x13042 1262a: 80 35 cpi r24, 0x50 ; 80 1262c: 91 05 cpc r25, r1 1262e: 09 f0 breq .+2 ; 0x12632 12630: 79 cf rjmp .-270 ; 0x12524 - `W` - area width (on X axis) - `H` - area height (on Y axis) */ case 80: { gcode_G80(); 12632: 0e 94 49 7d call 0xfa92 ; 0xfa92 12636: 47 c0 rjmp .+142 ; 0x126c6 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 12638: 86 35 cpi r24, 0x56 ; 86 1263a: 91 05 cpc r25, r1 1263c: 11 f4 brne .+4 ; 0x12642 1263e: 0c 94 1a 9c jmp 0x13834 ; 0x13834 12642: 87 35 cpi r24, 0x57 ; 87 12644: 91 05 cpc r25, r1 12646: 09 f0 breq .+2 ; 0x1264a 12648: 6d cf rjmp .-294 ; 0x12524 This G-code will be performed at the end of a calibration script. (Prusa3D specific) */ case 87: calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST); 1264a: 80 e1 ldi r24, 0x10 ; 16 1264c: 0e 94 4e d7 call 0x1ae9c ; 0x1ae9c 12650: 3a c0 rjmp .+116 ; 0x126c6 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 12652: 8c 35 cpi r24, 0x5C ; 92 12654: 91 05 cpc r25, r1 12656: 11 f4 brne .+4 ; 0x1265c 12658: 0c 94 26 9c jmp 0x1384c ; 0x1384c 1265c: 74 f4 brge .+28 ; 0x1267a 1265e: 8a 35 cpi r24, 0x5A ; 90 12660: 91 05 cpc r25, r1 12662: 11 f4 brne .+4 ; 0x12668 12664: 0c 94 1f 9c jmp 0x1383e ; 0x1383e 12668: 8b 35 cpi r24, 0x5B ; 91 1266a: 91 05 cpc r25, r1 1266c: 09 f0 breq .+2 ; 0x12670 1266e: 5a cf rjmp .-332 ; 0x12524 /*! ### G91 - Switch on relative mode G91: Set to Relative Positioning All coordinates from now on are relative to the last position. E axis is left intact. */ case 91: { axis_relative_modes |= X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK; 12670: 80 91 57 12 lds r24, 0x1257 ; 0x801257 12674: 87 60 ori r24, 0x07 ; 7 12676: 0c 94 22 9c jmp 0x13844 ; 0x13844 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1267a: 82 36 cpi r24, 0x62 ; 98 1267c: 91 05 cpc r25, r1 1267e: 11 f4 brne .+4 ; 0x12684 12680: 0c 94 bd 9c jmp 0x1397a ; 0x1397a 12684: 83 36 cpi r24, 0x63 ; 99 12686: 91 05 cpc r25, r1 12688: 09 f0 breq .+2 ; 0x1268c 1268a: 4c cf rjmp .-360 ; 0x12524 lcd_update(2); fCheckModeInit(); // alternatively invoke printer reset } void farm_disable() { farm_mode = false; 1268c: 10 92 60 0d sts 0x0D60, r1 ; 0x800d60 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 12690: 60 e0 ldi r22, 0x00 ; 0 12692: 84 ec ldi r24, 0xC4 ; 196 12694: 9f e0 ldi r25, 0x0F ; 15 12696: 0f 94 04 a4 call 0x34808 ; 0x34808 fCheckModeInit(); // alternatively invoke printer reset } void farm_gcode_g99() { farm_disable(); lcd_update(2); 1269a: 82 e0 ldi r24, 0x02 ; 2 1269c: 0e 94 f9 6e call 0xddf2 ; 0xddf2 126a0: 0c 94 cc 9c jmp 0x13998 ; 0x13998 #ifdef FWRETRACT if(cs.autoretract_enabled) { if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { float echange=destination[E_AXIS]-current_position[E_AXIS]; if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover 126a4: 2d ec ldi r18, 0xCD ; 205 126a6: 3c ec ldi r19, 0xCC ; 204 126a8: 4c ec ldi r20, 0xCC ; 204 126aa: 5d e3 ldi r21, 0x3D ; 61 126ac: c7 01 movw r24, r14 126ae: b6 01 movw r22, r12 126b0: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 126b4: 18 16 cp r1, r24 126b6: 24 f4 brge .+8 ; 0x126c0 126b8: 80 91 1b 06 lds r24, 0x061B ; 0x80061b 126bc: 81 11 cpse r24, r1 126be: f0 ce rjmp .-544 ; 0x124a0 } } } #endif //FWRETRACT prepare_move(start_segment_idx); 126c0: c8 01 movw r24, r16 126c2: 0e 94 bb 6a call 0xd576 ; 0xd576 #endif //PRUSA_FARM default: printf_P(MSG_UNKNOWN_CODE, 'G', cmdbuffer + bufindr + CMDHDRSIZE); } // printf_P(_N("END G-CODE=%u\n"), gcode_in_progress); gcode_in_progress = 0; 126c6: 10 92 56 03 sts 0x0356, r1 ; 0x800356 126ca: 10 92 55 03 sts 0x0355, r1 ; 0x800355 126ce: c4 cc rjmp .-1656 ; 0x12058 */ case 2: case 3: { uint16_t start_segment_idx = restore_interrupted_gcode(); 126d0: 0e 94 b1 54 call 0xa962 ; 0xa962 126d4: 2e 96 adiw r28, 0x0e ; 14 126d6: 9f af std Y+63, r25 ; 0x3f 126d8: 8e af std Y+62, r24 ; 0x3e 126da: 2e 97 sbiw r28, 0x0e ; 14 #ifdef SF_ARC_FIX bool relative_mode_backup = relative_mode; relative_mode = true; #endif get_coordinates(); // For X Y Z E F 126dc: 0e 94 ac 5b call 0xb758 ; 0xb758 #ifdef SF_ARC_FIX relative_mode=relative_mode_backup; #endif offset[0] = code_seen('I') ? code_value() : 0.f; 126e0: 89 e4 ldi r24, 0x49 ; 73 126e2: 0e 94 f5 55 call 0xabea ; 0xabea 126e6: 88 23 and r24, r24 126e8: 09 f4 brne .+2 ; 0x126ec 126ea: a0 c3 rjmp .+1856 ; 0x12e2c 126ec: 0e 94 85 5a call 0xb50a ; 0xb50a 126f0: 60 93 4d 03 sts 0x034D, r22 ; 0x80034d 126f4: 70 93 4e 03 sts 0x034E, r23 ; 0x80034e 126f8: 80 93 4f 03 sts 0x034F, r24 ; 0x80034f 126fc: 90 93 50 03 sts 0x0350, r25 ; 0x800350 offset[1] = code_seen('J') ? code_value() : 0.f; 12700: 8a e4 ldi r24, 0x4A ; 74 12702: 0e 94 f5 55 call 0xabea ; 0xabea 12706: c1 2c mov r12, r1 12708: d1 2c mov r13, r1 1270a: 76 01 movw r14, r12 1270c: 88 23 and r24, r24 1270e: 21 f0 breq .+8 ; 0x12718 12710: 0e 94 85 5a call 0xb50a ; 0xb50a 12714: 6b 01 movw r12, r22 12716: 7c 01 movw r14, r24 12718: c0 92 51 03 sts 0x0351, r12 ; 0x800351 1271c: d0 92 52 03 sts 0x0352, r13 ; 0x800352 12720: e0 92 53 03 sts 0x0353, r14 ; 0x800353 12724: f0 92 54 03 sts 0x0354, r15 ; 0x800354 prepare_arc_move((gcode_in_progress == 2), start_segment_idx); 12728: e0 91 55 03 lds r30, 0x0355 ; 0x800355 1272c: f0 91 56 03 lds r31, 0x0356 ; 0x800356 12730: a4 96 adiw r28, 0x24 ; 36 12732: ff af std Y+63, r31 ; 0x3f 12734: ee af std Y+62, r30 ; 0x3e 12736: a4 97 sbiw r28, 0x24 ; 36 set_current_to_destination(); } void prepare_arc_move(bool isclockwise, uint16_t start_segment_idx) { float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc 12738: 80 90 4d 03 lds r8, 0x034D ; 0x80034d 1273c: 90 90 4e 03 lds r9, 0x034E ; 0x80034e 12740: a0 90 4f 03 lds r10, 0x034F ; 0x80034f 12744: b0 90 50 03 lds r11, 0x0350 ; 0x800350 12748: a7 01 movw r20, r14 1274a: 96 01 movw r18, r12 1274c: c5 01 movw r24, r10 1274e: b4 01 movw r22, r8 12750: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 12754: 24 96 adiw r28, 0x04 ; 4 12756: 6c af std Y+60, r22 ; 0x3c 12758: 7d af std Y+61, r23 ; 0x3d 1275a: 8e af std Y+62, r24 ; 0x3e 1275c: 9f af std Y+63, r25 ; 0x3f 1275e: 24 97 sbiw r28, 0x04 ; 4 // Trace the arc mc_arc(current_position, destination, offset, (feedrate * feedmultiply) * (1.f / 6000.f), r, isclockwise, start_segment_idx); 12760: 60 91 8e 02 lds r22, 0x028E ; 0x80028e 12764: 70 91 8f 02 lds r23, 0x028F ; 0x80028f 12768: 07 2e mov r0, r23 1276a: 00 0c add r0, r0 1276c: 88 0b sbc r24, r24 1276e: 99 0b sbc r25, r25 12770: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 12774: 20 91 7a 02 lds r18, 0x027A ; 0x80027a 12778: 30 91 7b 02 lds r19, 0x027B ; 0x80027b 1277c: 40 91 7c 02 lds r20, 0x027C ; 0x80027c 12780: 50 91 7d 02 lds r21, 0x027D ; 0x80027d 12784: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12788: 2e e3 ldi r18, 0x3E ; 62 1278a: 33 ec ldi r19, 0xC3 ; 195 1278c: 4e e2 ldi r20, 0x2E ; 46 1278e: 59 e3 ldi r21, 0x39 ; 57 12790: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12794: 68 af std Y+56, r22 ; 0x38 12796: 79 af std Y+57, r23 ; 0x39 12798: 8a af std Y+58, r24 ; 0x3a 1279a: 9b af std Y+59, r25 ; 0x3b // The arc is approximated by generating a huge number of tiny, linear segments. The length of each // segment is configured in settings.mm_per_arc_segment. void mc_arc(const float* position, float* target, const float* offset, float feed_rate, float radius, bool isclockwise, uint16_t start_segment_idx) { float start_position[4]; memcpy(start_position, position, sizeof(start_position)); 1279c: 80 e1 ldi r24, 0x10 ; 16 1279e: e1 e6 ldi r30, 0x61 ; 97 127a0: f2 e1 ldi r31, 0x12 ; 18 127a2: de 01 movw r26, r28 127a4: 11 96 adiw r26, 0x01 ; 1 127a6: 01 90 ld r0, Z+ 127a8: 0d 92 st X+, r0 127aa: 8a 95 dec r24 127ac: e1 f7 brne .-8 ; 0x127a6 float r_axis_x = -offset[X_AXIS]; // Radius vector from center to current location 127ae: a5 01 movw r20, r10 127b0: 94 01 movw r18, r8 127b2: 50 58 subi r21, 0x80 ; 128 127b4: 28 a7 std Y+40, r18 ; 0x28 127b6: 39 a7 std Y+41, r19 ; 0x29 127b8: 4a a7 std Y+42, r20 ; 0x2a 127ba: 5b a7 std Y+43, r21 ; 0x2b float r_axis_y = -offset[Y_AXIS]; 127bc: d7 01 movw r26, r14 127be: c6 01 movw r24, r12 127c0: b0 58 subi r27, 0x80 ; 128 127c2: 8c a7 std Y+44, r24 ; 0x2c 127c4: 9d a7 std Y+45, r25 ; 0x2d 127c6: ae a7 std Y+46, r26 ; 0x2e 127c8: bf a7 std Y+47, r27 ; 0x2f float center_axis_x = start_position[X_AXIS] - r_axis_x; 127ca: 29 81 ldd r18, Y+1 ; 0x01 127cc: 3a 81 ldd r19, Y+2 ; 0x02 127ce: 4b 81 ldd r20, Y+3 ; 0x03 127d0: 5c 81 ldd r21, Y+4 ; 0x04 127d2: 28 96 adiw r28, 0x08 ; 8 127d4: 2c af std Y+60, r18 ; 0x3c 127d6: 3d af std Y+61, r19 ; 0x3d 127d8: 4e af std Y+62, r20 ; 0x3e 127da: 5f af std Y+63, r21 ; 0x3f 127dc: 28 97 sbiw r28, 0x08 ; 8 127de: c5 01 movw r24, r10 127e0: b4 01 movw r22, r8 127e2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 127e6: 62 96 adiw r28, 0x12 ; 18 127e8: 6c af std Y+60, r22 ; 0x3c 127ea: 7d af std Y+61, r23 ; 0x3d 127ec: 8e af std Y+62, r24 ; 0x3e 127ee: 9f af std Y+63, r25 ; 0x3f 127f0: 62 97 sbiw r28, 0x12 ; 18 float center_axis_y = start_position[Y_AXIS] - r_axis_y; 127f2: 8d 81 ldd r24, Y+5 ; 0x05 127f4: 9e 81 ldd r25, Y+6 ; 0x06 127f6: af 81 ldd r26, Y+7 ; 0x07 127f8: b8 85 ldd r27, Y+8 ; 0x08 127fa: 2c 96 adiw r28, 0x0c ; 12 127fc: 8c af std Y+60, r24 ; 0x3c 127fe: 9d af std Y+61, r25 ; 0x3d 12800: ae af std Y+62, r26 ; 0x3e 12802: bf af std Y+63, r27 ; 0x3f 12804: 2c 97 sbiw r28, 0x0c ; 12 12806: 9c 01 movw r18, r24 12808: ad 01 movw r20, r26 1280a: c7 01 movw r24, r14 1280c: b6 01 movw r22, r12 1280e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12812: 66 96 adiw r28, 0x16 ; 22 12814: 6c af std Y+60, r22 ; 0x3c 12816: 7d af std Y+61, r23 ; 0x3d 12818: 8e af std Y+62, r24 ; 0x3e 1281a: 9f af std Y+63, r25 ; 0x3f 1281c: 66 97 sbiw r28, 0x16 ; 22 float travel_z = target[Z_AXIS] - start_position[Z_AXIS]; 1281e: 29 85 ldd r18, Y+9 ; 0x09 12820: 3a 85 ldd r19, Y+10 ; 0x0a 12822: 4b 85 ldd r20, Y+11 ; 0x0b 12824: 5c 85 ldd r21, Y+12 ; 0x0c 12826: 60 91 31 06 lds r22, 0x0631 ; 0x800631 1282a: 70 91 32 06 lds r23, 0x0632 ; 0x800632 1282e: 80 91 33 06 lds r24, 0x0633 ; 0x800633 12832: 90 91 34 06 lds r25, 0x0634 ; 0x800634 12836: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1283a: 6a 96 adiw r28, 0x1a ; 26 1283c: 6c af std Y+60, r22 ; 0x3c 1283e: 7d af std Y+61, r23 ; 0x3d 12840: 8e af std Y+62, r24 ; 0x3e 12842: 9f af std Y+63, r25 ; 0x3f 12844: 6a 97 sbiw r28, 0x1a ; 26 float rt_x = target[X_AXIS] - center_axis_x; 12846: 20 91 29 06 lds r18, 0x0629 ; 0x800629 1284a: 30 91 2a 06 lds r19, 0x062A ; 0x80062a 1284e: 40 91 2b 06 lds r20, 0x062B ; 0x80062b 12852: 50 91 2c 06 lds r21, 0x062C ; 0x80062c 12856: 6e 96 adiw r28, 0x1e ; 30 12858: 2c af std Y+60, r18 ; 0x3c 1285a: 3d af std Y+61, r19 ; 0x3d 1285c: 4e af std Y+62, r20 ; 0x3e 1285e: 5f af std Y+63, r21 ; 0x3f 12860: 6e 97 sbiw r28, 0x1e ; 30 12862: 62 96 adiw r28, 0x12 ; 18 12864: 2c ad ldd r18, Y+60 ; 0x3c 12866: 3d ad ldd r19, Y+61 ; 0x3d 12868: 4e ad ldd r20, Y+62 ; 0x3e 1286a: 5f ad ldd r21, Y+63 ; 0x3f 1286c: 62 97 sbiw r28, 0x12 ; 18 1286e: 6e 96 adiw r28, 0x1e ; 30 12870: 6c ad ldd r22, Y+60 ; 0x3c 12872: 7d ad ldd r23, Y+61 ; 0x3d 12874: 8e ad ldd r24, Y+62 ; 0x3e 12876: 9f ad ldd r25, Y+63 ; 0x3f 12878: 6e 97 sbiw r28, 0x1e ; 30 1287a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1287e: 6b 01 movw r12, r22 12880: 7c 01 movw r14, r24 float rt_y = target[Y_AXIS] - center_axis_y; 12882: 80 91 2d 06 lds r24, 0x062D ; 0x80062d 12886: 90 91 2e 06 lds r25, 0x062E ; 0x80062e 1288a: a0 91 2f 06 lds r26, 0x062F ; 0x80062f 1288e: b0 91 30 06 lds r27, 0x0630 ; 0x800630 12892: a2 96 adiw r28, 0x22 ; 34 12894: 8c af std Y+60, r24 ; 0x3c 12896: 9d af std Y+61, r25 ; 0x3d 12898: ae af std Y+62, r26 ; 0x3e 1289a: bf af std Y+63, r27 ; 0x3f 1289c: a2 97 sbiw r28, 0x22 ; 34 1289e: 66 96 adiw r28, 0x16 ; 22 128a0: 2c ad ldd r18, Y+60 ; 0x3c 128a2: 3d ad ldd r19, Y+61 ; 0x3d 128a4: 4e ad ldd r20, Y+62 ; 0x3e 128a6: 5f ad ldd r21, Y+63 ; 0x3f 128a8: 66 97 sbiw r28, 0x16 ; 22 128aa: bc 01 movw r22, r24 128ac: cd 01 movw r24, r26 128ae: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 128b2: 4b 01 movw r8, r22 128b4: 5c 01 movw r10, r24 // 20200419 - Add a variable that will be used to hold the arc segment length float mm_per_arc_segment = cs.mm_per_arc_segment; 128b6: 30 90 2b 0e lds r3, 0x0E2B ; 0x800e2b 128ba: 20 90 2c 0e lds r2, 0x0E2C ; 0x800e2c 128be: 90 91 2d 0e lds r25, 0x0E2D ; 0x800e2d 128c2: 9c ab std Y+52, r25 ; 0x34 128c4: a0 91 2e 0e lds r26, 0x0E2E ; 0x800e2e 128c8: ac af std Y+60, r26 ; 0x3c // 20210109 - Add a variable to hold the n_arc_correction value unsigned char n_arc_correction = cs.n_arc_correction; 128ca: b0 91 33 0e lds r27, 0x0E33 ; 0x800e33 128ce: b8 ab std Y+48, r27 ; 0x30 // CCW angle between start_position and target from circle center. Only one atan2() trig computation required. float angular_travel_total = atan2(r_axis_x * rt_y - r_axis_y * rt_x, r_axis_x * rt_x + r_axis_y * rt_y); 128d0: a7 01 movw r20, r14 128d2: 96 01 movw r18, r12 128d4: 68 a5 ldd r22, Y+40 ; 0x28 128d6: 79 a5 ldd r23, Y+41 ; 0x29 128d8: 8a a5 ldd r24, Y+42 ; 0x2a 128da: 9b a5 ldd r25, Y+43 ; 0x2b 128dc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 128e0: 2b 01 movw r4, r22 128e2: 3c 01 movw r6, r24 128e4: a5 01 movw r20, r10 128e6: 94 01 movw r18, r8 128e8: 6c a5 ldd r22, Y+44 ; 0x2c 128ea: 7d a5 ldd r23, Y+45 ; 0x2d 128ec: 8e a5 ldd r24, Y+46 ; 0x2e 128ee: 9f a5 ldd r25, Y+47 ; 0x2f 128f0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 128f4: 9b 01 movw r18, r22 128f6: ac 01 movw r20, r24 128f8: c3 01 movw r24, r6 128fa: b2 01 movw r22, r4 128fc: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12900: 2b 01 movw r4, r22 12902: 3c 01 movw r6, r24 12904: a5 01 movw r20, r10 12906: 94 01 movw r18, r8 12908: 68 a5 ldd r22, Y+40 ; 0x28 1290a: 79 a5 ldd r23, Y+41 ; 0x29 1290c: 8a a5 ldd r24, Y+42 ; 0x2a 1290e: 9b a5 ldd r25, Y+43 ; 0x2b 12910: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12914: 4b 01 movw r8, r22 12916: 5c 01 movw r10, r24 12918: a7 01 movw r20, r14 1291a: 96 01 movw r18, r12 1291c: 6c a5 ldd r22, Y+44 ; 0x2c 1291e: 7d a5 ldd r23, Y+45 ; 0x2d 12920: 8e a5 ldd r24, Y+46 ; 0x2e 12922: 9f a5 ldd r25, Y+47 ; 0x2f 12924: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12928: 9b 01 movw r18, r22 1292a: ac 01 movw r20, r24 1292c: c5 01 movw r24, r10 1292e: b4 01 movw r22, r8 12930: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12934: a3 01 movw r20, r6 12936: 92 01 movw r18, r4 12938: 0f 94 87 a5 call 0x34b0e ; 0x34b0e 1293c: 6b 01 movw r12, r22 1293e: 7c 01 movw r14, r24 if (angular_travel_total < 0) { angular_travel_total += 2 * M_PI; } 12940: 20 e0 ldi r18, 0x00 ; 0 12942: 30 e0 ldi r19, 0x00 ; 0 12944: a9 01 movw r20, r18 12946: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1294a: 87 ff sbrs r24, 7 1294c: 0a c0 rjmp .+20 ; 0x12962 1294e: 2b ed ldi r18, 0xDB ; 219 12950: 3f e0 ldi r19, 0x0F ; 15 12952: 49 ec ldi r20, 0xC9 ; 201 12954: 50 e4 ldi r21, 0x40 ; 64 12956: c7 01 movw r24, r14 12958: b6 01 movw r22, r12 1295a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1295e: 6b 01 movw r12, r22 12960: 7c 01 movw r14, r24 if (cs.min_arc_segments > 0) 12962: 60 91 34 0e lds r22, 0x0E34 ; 0x800e34 12966: 70 91 35 0e lds r23, 0x0E35 ; 0x800e35 1296a: 61 15 cp r22, r1 1296c: 71 05 cpc r23, r1 1296e: 09 f4 brne .+2 ; 0x12972 12970: 61 c2 rjmp .+1218 ; 0x12e34 { // 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation // Do this before converting the angular travel for clockwise rotation mm_per_arc_segment = radius * ((2.0f * M_PI) / cs.min_arc_segments); 12972: 90 e0 ldi r25, 0x00 ; 0 12974: 80 e0 ldi r24, 0x00 ; 0 12976: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 1297a: 9b 01 movw r18, r22 1297c: ac 01 movw r20, r24 1297e: 6b ed ldi r22, 0xDB ; 219 12980: 7f e0 ldi r23, 0x0F ; 15 12982: 89 ec ldi r24, 0xC9 ; 201 12984: 90 e4 ldi r25, 0x40 ; 64 12986: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1298a: 24 96 adiw r28, 0x04 ; 4 1298c: 2c ad ldd r18, Y+60 ; 0x3c 1298e: 3d ad ldd r19, Y+61 ; 0x3d 12990: 4e ad ldd r20, Y+62 ; 0x3e 12992: 5f ad ldd r21, Y+63 ; 0x3f 12994: 24 97 sbiw r28, 0x04 ; 4 12996: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1299a: 5b 01 movw r10, r22 1299c: 8c 01 movw r16, r24 } if (cs.arc_segments_per_sec > 0) 1299e: 60 91 36 0e lds r22, 0x0E36 ; 0x800e36 129a2: 70 91 37 0e lds r23, 0x0E37 ; 0x800e37 129a6: 61 15 cp r22, r1 129a8: 71 05 cpc r23, r1 129aa: e1 f0 breq .+56 ; 0x129e4 { // 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation float mm_per_arc_segment_sec = feed_rate / (60.f * float(cs.arc_segments_per_sec)); 129ac: 90 e0 ldi r25, 0x00 ; 0 129ae: 80 e0 ldi r24, 0x00 ; 0 129b0: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 129b4: 20 e0 ldi r18, 0x00 ; 0 129b6: 30 e0 ldi r19, 0x00 ; 0 129b8: 40 e7 ldi r20, 0x70 ; 112 129ba: 52 e4 ldi r21, 0x42 ; 66 129bc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 129c0: 9b 01 movw r18, r22 129c2: ac 01 movw r20, r24 129c4: 68 ad ldd r22, Y+56 ; 0x38 129c6: 79 ad ldd r23, Y+57 ; 0x39 129c8: 8a ad ldd r24, Y+58 ; 0x3a 129ca: 9b ad ldd r25, Y+59 ; 0x3b 129cc: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 129d0: 3b 01 movw r6, r22 129d2: 4c 01 movw r8, r24 if (mm_per_arc_segment_sec < mm_per_arc_segment) 129d4: 95 01 movw r18, r10 129d6: a8 01 movw r20, r16 129d8: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 129dc: 87 ff sbrs r24, 7 129de: 02 c0 rjmp .+4 ; 0x129e4 mm_per_arc_segment = mm_per_arc_segment_sec; 129e0: 53 01 movw r10, r6 129e2: 84 01 movw r16, r8 } // Note: no need to check to see if min_mm_per_arc_segment is enabled or not (i.e. = 0), since mm_per_arc_segment can never be below 0. if (mm_per_arc_segment < cs.min_mm_per_arc_segment) 129e4: 40 90 2f 0e lds r4, 0x0E2F ; 0x800e2f 129e8: 50 90 30 0e lds r5, 0x0E30 ; 0x800e30 129ec: 60 90 31 0e lds r6, 0x0E31 ; 0x800e31 129f0: 70 90 32 0e lds r7, 0x0E32 ; 0x800e32 129f4: 95 01 movw r18, r10 129f6: a8 01 movw r20, r16 129f8: b2 01 movw r22, r4 129fa: c3 01 movw r24, r6 129fc: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 12a00: 18 16 cp r1, r24 12a02: 84 f0 brlt .+32 ; 0x12a24 { // 20200417 - FormerLurker - Implement MIN_MM_PER_ARC_SEGMENT if it is defined // This prevents a very high number of segments from being generated for curves of a short radius mm_per_arc_segment = cs.min_mm_per_arc_segment; } else if (mm_per_arc_segment > cs.mm_per_arc_segment) { 12a04: 95 01 movw r18, r10 12a06: a8 01 movw r20, r16 12a08: 63 2d mov r22, r3 12a0a: 72 2d mov r23, r2 12a0c: 8c a9 ldd r24, Y+52 ; 0x34 12a0e: 9c ad ldd r25, Y+60 ; 0x3c 12a10: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12a14: 25 01 movw r4, r10 12a16: 38 01 movw r6, r16 12a18: 87 ff sbrs r24, 7 12a1a: 04 c0 rjmp .+8 ; 0x12a24 // 20210113 - This can be implemented in an else if since we can't be below the min AND above the max at the same time. // 20200417 - FormerLurker - Implement MIN_MM_PER_ARC_SEGMENT if it is defined mm_per_arc_segment = cs.mm_per_arc_segment; 12a1c: 43 2c mov r4, r3 12a1e: 52 2c mov r5, r2 12a20: 6c a8 ldd r6, Y+52 ; 0x34 12a22: 7c ac ldd r7, Y+60 ; 0x3c } // Adjust the angular travel if the direction is clockwise if (isclockwise) { angular_travel_total -= 2 * M_PI; } 12a24: a4 96 adiw r28, 0x24 ; 36 12a26: ee ad ldd r30, Y+62 ; 0x3e 12a28: ff ad ldd r31, Y+63 ; 0x3f 12a2a: a4 97 sbiw r28, 0x24 ; 36 12a2c: 32 97 sbiw r30, 0x02 ; 2 12a2e: 51 f4 brne .+20 ; 0x12a44 12a30: 2b ed ldi r18, 0xDB ; 219 12a32: 3f e0 ldi r19, 0x0F ; 15 12a34: 49 ec ldi r20, 0xC9 ; 201 12a36: 50 e4 ldi r21, 0x40 ; 64 12a38: c7 01 movw r24, r14 12a3a: b6 01 movw r22, r12 12a3c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12a40: 6b 01 movw r12, r22 12a42: 7c 01 movw r14, r24 //20141002:full circle for G03 did not work, e.g. G03 X80 Y80 I20 J0 F2000 is giving an Angle of zero so head is not moving //to compensate when start pos = target pos && angle is zero -> angle = 2Pi if (start_position[X_AXIS] == target[X_AXIS] && start_position[Y_AXIS] == target[Y_AXIS] && angular_travel_total == 0) 12a44: 6e 96 adiw r28, 0x1e ; 30 12a46: 2c ad ldd r18, Y+60 ; 0x3c 12a48: 3d ad ldd r19, Y+61 ; 0x3d 12a4a: 4e ad ldd r20, Y+62 ; 0x3e 12a4c: 5f ad ldd r21, Y+63 ; 0x3f 12a4e: 6e 97 sbiw r28, 0x1e ; 30 12a50: 28 96 adiw r28, 0x08 ; 8 12a52: 6c ad ldd r22, Y+60 ; 0x3c 12a54: 7d ad ldd r23, Y+61 ; 0x3d 12a56: 8e ad ldd r24, Y+62 ; 0x3e 12a58: 9f ad ldd r25, Y+63 ; 0x3f 12a5a: 28 97 sbiw r28, 0x08 ; 8 12a5c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12a60: 81 11 cpse r24, r1 12a62: 23 c0 rjmp .+70 ; 0x12aaa 12a64: a2 96 adiw r28, 0x22 ; 34 12a66: 2c ad ldd r18, Y+60 ; 0x3c 12a68: 3d ad ldd r19, Y+61 ; 0x3d 12a6a: 4e ad ldd r20, Y+62 ; 0x3e 12a6c: 5f ad ldd r21, Y+63 ; 0x3f 12a6e: a2 97 sbiw r28, 0x22 ; 34 12a70: 2c 96 adiw r28, 0x0c ; 12 12a72: 6c ad ldd r22, Y+60 ; 0x3c 12a74: 7d ad ldd r23, Y+61 ; 0x3d 12a76: 8e ad ldd r24, Y+62 ; 0x3e 12a78: 9f ad ldd r25, Y+63 ; 0x3f 12a7a: 2c 97 sbiw r28, 0x0c ; 12 12a7c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12a80: 81 11 cpse r24, r1 12a82: 13 c0 rjmp .+38 ; 0x12aaa 12a84: 20 e0 ldi r18, 0x00 ; 0 12a86: 30 e0 ldi r19, 0x00 ; 0 12a88: a9 01 movw r20, r18 12a8a: c7 01 movw r24, r14 12a8c: b6 01 movw r22, r12 12a8e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12a92: 81 11 cpse r24, r1 12a94: 0a c0 rjmp .+20 ; 0x12aaa { angular_travel_total += 2 * M_PI; 12a96: 2b ed ldi r18, 0xDB ; 219 12a98: 3f e0 ldi r19, 0x0F ; 15 12a9a: 49 ec ldi r20, 0xC9 ; 201 12a9c: 50 e4 ldi r21, 0x40 ; 64 12a9e: c7 01 movw r24, r14 12aa0: b6 01 movw r22, r12 12aa2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12aa6: 6b 01 movw r12, r22 12aa8: 7c 01 movw r14, r24 } //end fix G03 // 20200417 - FormerLurker - rename millimeters_of_travel to millimeters_of_travel_arc to better describe what we are // calculating here const float millimeters_of_travel_arc = hypot(angular_travel_total * radius, fabs(travel_z)); 12aaa: a7 01 movw r20, r14 12aac: 96 01 movw r18, r12 12aae: 24 96 adiw r28, 0x04 ; 4 12ab0: 6c ad ldd r22, Y+60 ; 0x3c 12ab2: 7d ad ldd r23, Y+61 ; 0x3d 12ab4: 8e ad ldd r24, Y+62 ; 0x3e 12ab6: 9f ad ldd r25, Y+63 ; 0x3f 12ab8: 24 97 sbiw r28, 0x04 ; 4 12aba: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12abe: 6a 96 adiw r28, 0x1a ; 26 12ac0: 2c ad ldd r18, Y+60 ; 0x3c 12ac2: 3d ad ldd r19, Y+61 ; 0x3d 12ac4: 4e ad ldd r20, Y+62 ; 0x3e 12ac6: 5f ad ldd r21, Y+63 ; 0x3f 12ac8: 6a 97 sbiw r28, 0x1a ; 26 12aca: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 12ace: 4b 01 movw r8, r22 12ad0: 5c 01 movw r10, r24 if (millimeters_of_travel_arc < 0.001) { return; } 12ad2: 2f e6 ldi r18, 0x6F ; 111 12ad4: 32 e1 ldi r19, 0x12 ; 18 12ad6: 43 e8 ldi r20, 0x83 ; 131 12ad8: 5a e3 ldi r21, 0x3A ; 58 12ada: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 12ade: 87 fd sbrc r24, 7 12ae0: 9e c1 rjmp .+828 ; 0x12e1e // Calculate the number of arc segments unsigned short segments = static_cast(ceil(millimeters_of_travel_arc / mm_per_arc_segment)); 12ae2: 92 01 movw r18, r4 12ae4: a3 01 movw r20, r6 12ae6: c5 01 movw r24, r10 12ae8: b4 01 movw r22, r8 12aea: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12aee: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 12af2: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 12af6: 7d ab std Y+53, r23 ; 0x35 12af8: 6c ab std Y+52, r22 ; 0x34 Finding a faster way to approximate sin, knowing that there can be substantial deviations from the true arc when using the previous approximation, would be beneficial. */ // If there is only one segment, no need to do a bunch of work since this is a straight line! if (segments > 1 && start_segment_idx) 12afa: 62 30 cpi r22, 0x02 ; 2 12afc: 71 05 cpc r23, r1 12afe: 08 f4 brcc .+2 ; 0x12b02 12b00: 5e c1 rjmp .+700 ; 0x12dbe 12b02: 2e 96 adiw r28, 0x0e ; 14 12b04: 4e ad ldd r20, Y+62 ; 0x3e 12b06: 5f ad ldd r21, Y+63 ; 0x3f 12b08: 2e 97 sbiw r28, 0x0e ; 14 12b0a: 45 2b or r20, r21 12b0c: 09 f4 brne .+2 ; 0x12b10 12b0e: 57 c1 rjmp .+686 ; 0x12dbe { // Calculate theta per segments, and linear (z) travel per segment, e travel per segment // as well as the small angle approximation for sin and cos. const float theta_per_segment = angular_travel_total / segments, 12b10: 90 e0 ldi r25, 0x00 ; 0 12b12: 80 e0 ldi r24, 0x00 ; 0 12b14: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 12b18: 4b 01 movw r8, r22 12b1a: 5c 01 movw r10, r24 12b1c: ac 01 movw r20, r24 12b1e: 9b 01 movw r18, r22 12b20: c7 01 movw r24, r14 12b22: b6 01 movw r22, r12 12b24: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12b28: 2b 01 movw r4, r22 12b2a: 3c 01 movw r6, r24 linear_per_segment = travel_z / (segments), 12b2c: a5 01 movw r20, r10 12b2e: 94 01 movw r18, r8 12b30: 6a 96 adiw r28, 0x1a ; 26 12b32: 6c ad ldd r22, Y+60 ; 0x3c 12b34: 7d ad ldd r23, Y+61 ; 0x3d 12b36: 8e ad ldd r24, Y+62 ; 0x3e 12b38: 9f ad ldd r25, Y+63 ; 0x3f 12b3a: 6a 97 sbiw r28, 0x1a ; 26 12b3c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12b40: 28 96 adiw r28, 0x08 ; 8 12b42: 6c af std Y+60, r22 ; 0x3c 12b44: 7d af std Y+61, r23 ; 0x3d 12b46: 8e af std Y+62, r24 ; 0x3e 12b48: 9f af std Y+63, r25 ; 0x3f 12b4a: 28 97 sbiw r28, 0x08 ; 8 segment_extruder_travel = (target[E_AXIS] - start_position[E_AXIS]) / (segments), 12b4c: 2d 85 ldd r18, Y+13 ; 0x0d 12b4e: 3e 85 ldd r19, Y+14 ; 0x0e 12b50: 4f 85 ldd r20, Y+15 ; 0x0f 12b52: 58 89 ldd r21, Y+16 ; 0x10 12b54: 60 91 35 06 lds r22, 0x0635 ; 0x800635 12b58: 70 91 36 06 lds r23, 0x0636 ; 0x800636 12b5c: 80 91 37 06 lds r24, 0x0637 ; 0x800637 12b60: 90 91 38 06 lds r25, 0x0638 ; 0x800638 12b64: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12b68: a5 01 movw r20, r10 12b6a: 94 01 movw r18, r8 12b6c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12b70: 2c 96 adiw r28, 0x0c ; 12 12b72: 6c af std Y+60, r22 ; 0x3c 12b74: 7d af std Y+61, r23 ; 0x3d 12b76: 8e af std Y+62, r24 ; 0x3e 12b78: 9f af std Y+63, r25 ; 0x3f 12b7a: 2c 97 sbiw r28, 0x0c ; 12 sq_theta_per_segment = theta_per_segment * theta_per_segment, 12b7c: a3 01 movw r20, r6 12b7e: 92 01 movw r18, r4 12b80: c3 01 movw r24, r6 12b82: b2 01 movw r22, r4 12b84: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12b88: 6b 01 movw r12, r22 12b8a: 7c 01 movw r14, r24 sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6, 12b8c: ac 01 movw r20, r24 12b8e: 9b 01 movw r18, r22 12b90: c3 01 movw r24, r6 12b92: b2 01 movw r22, r4 12b94: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12b98: 20 e0 ldi r18, 0x00 ; 0 12b9a: 30 e0 ldi r19, 0x00 ; 0 12b9c: 40 ec ldi r20, 0xC0 ; 192 12b9e: 50 e4 ldi r21, 0x40 ; 64 12ba0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 12ba4: 9b 01 movw r18, r22 12ba6: ac 01 movw r20, r24 12ba8: c3 01 movw r24, r6 12baa: b2 01 movw r22, r4 12bac: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12bb0: 6c af std Y+60, r22 ; 0x3c 12bb2: 7d af std Y+61, r23 ; 0x3d 12bb4: 8e af std Y+62, r24 ; 0x3e 12bb6: 9f af std Y+63, r25 ; 0x3f cos_T = 1 - 0.5f * sq_theta_per_segment; 12bb8: 20 e0 ldi r18, 0x00 ; 0 12bba: 30 e0 ldi r19, 0x00 ; 0 12bbc: 40 e0 ldi r20, 0x00 ; 0 12bbe: 5f e3 ldi r21, 0x3F ; 63 12bc0: c7 01 movw r24, r14 12bc2: b6 01 movw r22, r12 12bc4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12bc8: 9b 01 movw r18, r22 12bca: ac 01 movw r20, r24 12bcc: 60 e0 ldi r22, 0x00 ; 0 12bce: 70 e0 ldi r23, 0x00 ; 0 12bd0: 80 e8 ldi r24, 0x80 ; 128 12bd2: 9f e3 ldi r25, 0x3F ; 63 12bd4: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12bd8: 24 96 adiw r28, 0x04 ; 4 12bda: 6c af std Y+60, r22 ; 0x3c 12bdc: 7d af std Y+61, r23 ; 0x3d 12bde: 8e af std Y+62, r24 ; 0x3e 12be0: 9f af std Y+63, r25 ; 0x3f 12be2: 24 97 sbiw r28, 0x04 ; 4 // Loop through all but one of the segments. The last one can be done simply // by moving to the target. for (uint16_t i = 1; i < segments; i++) { 12be4: 22 24 eor r2, r2 12be6: 23 94 inc r2 12be8: 31 2c mov r3, r1 if (n_arc_correction-- == 0) { 12bea: d8 a8 ldd r13, Y+48 ; 0x30 12bec: da 94 dec r13 12bee: 58 a9 ldd r21, Y+48 ; 0x30 12bf0: 51 11 cpse r21, r1 12bf2: 25 c1 rjmp .+586 ; 0x12e3e // Calculate the actual position for r_axis_x and r_axis_y const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); 12bf4: b1 01 movw r22, r2 12bf6: 90 e0 ldi r25, 0x00 ; 0 12bf8: 80 e0 ldi r24, 0x00 ; 0 12bfa: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 12bfe: a3 01 movw r20, r6 12c00: 92 01 movw r18, r4 12c02: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12c06: 6b 01 movw r12, r22 12c08: 7c 01 movw r14, r24 12c0a: 0f 94 02 a6 call 0x34c04 ; 0x34c04 12c0e: 6c a7 std Y+44, r22 ; 0x2c 12c10: 7d a7 std Y+45, r23 ; 0x2d 12c12: 8e a7 std Y+46, r24 ; 0x2e 12c14: 9f a7 std Y+47, r25 ; 0x2f 12c16: c7 01 movw r24, r14 12c18: b6 01 movw r22, r12 12c1a: 0f 94 c8 a8 call 0x35190 ; 0x35190 12c1e: 4b 01 movw r8, r22 12c20: 5c 01 movw r10, r24 r_axis_x = -offset[X_AXIS] * cos_Ti + offset[Y_AXIS] * sin_Ti; 12c22: c0 90 4d 03 lds r12, 0x034D ; 0x80034d 12c26: d0 90 4e 03 lds r13, 0x034E ; 0x80034e 12c2a: e0 90 4f 03 lds r14, 0x034F ; 0x80034f 12c2e: f0 90 50 03 lds r15, 0x0350 ; 0x800350 12c32: f7 fa bst r15, 7 12c34: f0 94 com r15 12c36: f7 f8 bld r15, 7 12c38: f0 94 com r15 12c3a: 80 91 51 03 lds r24, 0x0351 ; 0x800351 12c3e: 90 91 52 03 lds r25, 0x0352 ; 0x800352 12c42: a0 91 53 03 lds r26, 0x0353 ; 0x800353 12c46: b0 91 54 03 lds r27, 0x0354 ; 0x800354 12c4a: 88 ab std Y+48, r24 ; 0x30 12c4c: 99 ab std Y+49, r25 ; 0x31 12c4e: aa ab std Y+50, r26 ; 0x32 12c50: bb ab std Y+51, r27 ; 0x33 12c52: a7 01 movw r20, r14 12c54: 96 01 movw r18, r12 12c56: 6c a5 ldd r22, Y+44 ; 0x2c 12c58: 7d a5 ldd r23, Y+45 ; 0x2d 12c5a: 8e a5 ldd r24, Y+46 ; 0x2e 12c5c: 9f a5 ldd r25, Y+47 ; 0x2f 12c5e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12c62: 68 a7 std Y+40, r22 ; 0x28 12c64: 79 a7 std Y+41, r23 ; 0x29 12c66: 8a a7 std Y+42, r24 ; 0x2a 12c68: 9b a7 std Y+43, r25 ; 0x2b 12c6a: 28 a9 ldd r18, Y+48 ; 0x30 12c6c: 39 a9 ldd r19, Y+49 ; 0x31 12c6e: 4a a9 ldd r20, Y+50 ; 0x32 12c70: 5b a9 ldd r21, Y+51 ; 0x33 12c72: c5 01 movw r24, r10 12c74: b4 01 movw r22, r8 12c76: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12c7a: 9b 01 movw r18, r22 12c7c: ac 01 movw r20, r24 12c7e: 68 a5 ldd r22, Y+40 ; 0x28 12c80: 79 a5 ldd r23, Y+41 ; 0x29 12c82: 8a a5 ldd r24, Y+42 ; 0x2a 12c84: 9b a5 ldd r25, Y+43 ; 0x2b 12c86: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12c8a: 68 a7 std Y+40, r22 ; 0x28 12c8c: 79 a7 std Y+41, r23 ; 0x29 12c8e: 8a a7 std Y+42, r24 ; 0x2a 12c90: 9b a7 std Y+43, r25 ; 0x2b r_axis_y = -offset[X_AXIS] * sin_Ti - offset[Y_AXIS] * cos_Ti; 12c92: a7 01 movw r20, r14 12c94: 96 01 movw r18, r12 12c96: c5 01 movw r24, r10 12c98: b4 01 movw r22, r8 12c9a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12c9e: 6b 01 movw r12, r22 12ca0: 7c 01 movw r14, r24 12ca2: 28 a9 ldd r18, Y+48 ; 0x30 12ca4: 39 a9 ldd r19, Y+49 ; 0x31 12ca6: 4a a9 ldd r20, Y+50 ; 0x32 12ca8: 5b a9 ldd r21, Y+51 ; 0x33 12caa: 6c a5 ldd r22, Y+44 ; 0x2c 12cac: 7d a5 ldd r23, Y+45 ; 0x2d 12cae: 8e a5 ldd r24, Y+46 ; 0x2e 12cb0: 9f a5 ldd r25, Y+47 ; 0x2f 12cb2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12cb6: 9b 01 movw r18, r22 12cb8: ac 01 movw r20, r24 12cba: c7 01 movw r24, r14 12cbc: b6 01 movw r22, r12 12cbe: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12cc2: 6c a7 std Y+44, r22 ; 0x2c 12cc4: 7d a7 std Y+45, r23 ; 0x2d 12cc6: 8e a7 std Y+46, r24 ; 0x2e 12cc8: 9f a7 std Y+47, r25 ; 0x2f // reset n_arc_correction n_arc_correction = cs.n_arc_correction; 12cca: 90 91 33 0e lds r25, 0x0E33 ; 0x800e33 12cce: 98 ab std Y+48, r25 ; 0x30 r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T; r_axis_y = r_axisi; } // Update Position start_position[X_AXIS] = center_axis_x + r_axis_x; 12cd0: 28 a5 ldd r18, Y+40 ; 0x28 12cd2: 39 a5 ldd r19, Y+41 ; 0x29 12cd4: 4a a5 ldd r20, Y+42 ; 0x2a 12cd6: 5b a5 ldd r21, Y+43 ; 0x2b 12cd8: 62 96 adiw r28, 0x12 ; 18 12cda: 6c ad ldd r22, Y+60 ; 0x3c 12cdc: 7d ad ldd r23, Y+61 ; 0x3d 12cde: 8e ad ldd r24, Y+62 ; 0x3e 12ce0: 9f ad ldd r25, Y+63 ; 0x3f 12ce2: 62 97 sbiw r28, 0x12 ; 18 12ce4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12ce8: 69 83 std Y+1, r22 ; 0x01 12cea: 7a 83 std Y+2, r23 ; 0x02 12cec: 8b 83 std Y+3, r24 ; 0x03 12cee: 9c 83 std Y+4, r25 ; 0x04 start_position[Y_AXIS] = center_axis_y + r_axis_y; 12cf0: 2c a5 ldd r18, Y+44 ; 0x2c 12cf2: 3d a5 ldd r19, Y+45 ; 0x2d 12cf4: 4e a5 ldd r20, Y+46 ; 0x2e 12cf6: 5f a5 ldd r21, Y+47 ; 0x2f 12cf8: 66 96 adiw r28, 0x16 ; 22 12cfa: 6c ad ldd r22, Y+60 ; 0x3c 12cfc: 7d ad ldd r23, Y+61 ; 0x3d 12cfe: 8e ad ldd r24, Y+62 ; 0x3e 12d00: 9f ad ldd r25, Y+63 ; 0x3f 12d02: 66 97 sbiw r28, 0x16 ; 22 12d04: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12d08: 6d 83 std Y+5, r22 ; 0x05 12d0a: 7e 83 std Y+6, r23 ; 0x06 12d0c: 8f 83 std Y+7, r24 ; 0x07 12d0e: 98 87 std Y+8, r25 ; 0x08 start_position[Z_AXIS] += linear_per_segment; 12d10: 28 96 adiw r28, 0x08 ; 8 12d12: 2c ad ldd r18, Y+60 ; 0x3c 12d14: 3d ad ldd r19, Y+61 ; 0x3d 12d16: 4e ad ldd r20, Y+62 ; 0x3e 12d18: 5f ad ldd r21, Y+63 ; 0x3f 12d1a: 28 97 sbiw r28, 0x08 ; 8 12d1c: 69 85 ldd r22, Y+9 ; 0x09 12d1e: 7a 85 ldd r23, Y+10 ; 0x0a 12d20: 8b 85 ldd r24, Y+11 ; 0x0b 12d22: 9c 85 ldd r25, Y+12 ; 0x0c 12d24: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12d28: 69 87 std Y+9, r22 ; 0x09 12d2a: 7a 87 std Y+10, r23 ; 0x0a 12d2c: 8b 87 std Y+11, r24 ; 0x0b 12d2e: 9c 87 std Y+12, r25 ; 0x0c start_position[E_AXIS] += segment_extruder_travel; 12d30: 2c 96 adiw r28, 0x0c ; 12 12d32: 2c ad ldd r18, Y+60 ; 0x3c 12d34: 3d ad ldd r19, Y+61 ; 0x3d 12d36: 4e ad ldd r20, Y+62 ; 0x3e 12d38: 5f ad ldd r21, Y+63 ; 0x3f 12d3a: 2c 97 sbiw r28, 0x0c ; 12 12d3c: 6d 85 ldd r22, Y+13 ; 0x0d 12d3e: 7e 85 ldd r23, Y+14 ; 0x0e 12d40: 8f 85 ldd r24, Y+15 ; 0x0f 12d42: 98 89 ldd r25, Y+16 ; 0x10 12d44: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12d48: 6d 87 std Y+13, r22 ; 0x0d 12d4a: 7e 87 std Y+14, r23 ; 0x0e 12d4c: 8f 87 std Y+15, r24 ; 0x0f 12d4e: 98 8b std Y+16, r25 ; 0x10 // Clamp to the calculated position. clamp_to_software_endstops(start_position); 12d50: ce 01 movw r24, r28 12d52: 01 96 adiw r24, 0x01 ; 1 12d54: 0e 94 7c 6a call 0xd4f8 ; 0xd4f8 // Insert the segment into the buffer if (i >= start_segment_idx) 12d58: 2e 96 adiw r28, 0x0e ; 14 12d5a: ae ad ldd r26, Y+62 ; 0x3e 12d5c: bf ad ldd r27, Y+63 ; 0x3f 12d5e: 2e 97 sbiw r28, 0x0e ; 14 12d60: 2a 16 cp r2, r26 12d62: 3b 06 cpc r3, r27 12d64: f8 f0 brcs .+62 ; 0x12da4 plan_buffer_line(start_position[X_AXIS], start_position[Y_AXIS], start_position[Z_AXIS], start_position[E_AXIS], feed_rate, position, i); 12d66: e9 84 ldd r14, Y+9 ; 0x09 12d68: fa 84 ldd r15, Y+10 ; 0x0a 12d6a: 0b 85 ldd r16, Y+11 ; 0x0b 12d6c: 1c 85 ldd r17, Y+12 ; 0x0c 12d6e: 2d 81 ldd r18, Y+5 ; 0x05 12d70: 3e 81 ldd r19, Y+6 ; 0x06 12d72: 4f 81 ldd r20, Y+7 ; 0x07 12d74: 58 85 ldd r21, Y+8 ; 0x08 12d76: 69 81 ldd r22, Y+1 ; 0x01 12d78: 7a 81 ldd r23, Y+2 ; 0x02 12d7a: 8b 81 ldd r24, Y+3 ; 0x03 12d7c: 9c 81 ldd r25, Y+4 ; 0x04 12d7e: 3f 92 push r3 12d80: 2f 92 push r2 12d82: e1 e6 ldi r30, 0x61 ; 97 12d84: f2 e1 ldi r31, 0x12 ; 18 12d86: ff 93 push r31 12d88: ef 93 push r30 12d8a: 88 ac ldd r8, Y+56 ; 0x38 12d8c: 99 ac ldd r9, Y+57 ; 0x39 12d8e: aa ac ldd r10, Y+58 ; 0x3a 12d90: bb ac ldd r11, Y+59 ; 0x3b 12d92: fe 01 movw r30, r28 12d94: 3d 96 adiw r30, 0x0d ; 13 12d96: 6f 01 movw r12, r30 12d98: 0f 94 33 3d call 0x27a66 ; 0x27a66 12d9c: 0f 90 pop r0 12d9e: 0f 90 pop r0 12da0: 0f 90 pop r0 12da2: 0f 90 pop r0 // Handle the situation where the planner is aborted hard. if (planner_aborted) 12da4: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 12da8: 81 11 cpse r24, r1 12daa: 39 c0 rjmp .+114 ; 0x12e1e sq_theta_per_segment = theta_per_segment * theta_per_segment, sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6, cos_T = 1 - 0.5f * sq_theta_per_segment; // Loop through all but one of the segments. The last one can be done simply // by moving to the target. for (uint16_t i = 1; i < segments; i++) { 12dac: ff ef ldi r31, 0xFF ; 255 12dae: 2f 1a sub r2, r31 12db0: 3f 0a sbc r3, r31 12db2: 2c a9 ldd r18, Y+52 ; 0x34 12db4: 3d a9 ldd r19, Y+53 ; 0x35 12db6: 22 15 cp r18, r2 12db8: 33 05 cpc r19, r3 12dba: 09 f0 breq .+2 ; 0x12dbe 12dbc: 16 cf rjmp .-468 ; 0x12bea if (planner_aborted) return; } } // Clamp to the target position. clamp_to_software_endstops(target); 12dbe: 89 e2 ldi r24, 0x29 ; 41 12dc0: 96 e0 ldi r25, 0x06 ; 6 12dc2: 0e 94 7c 6a call 0xd4f8 ; 0xd4f8 // Ensure last segment arrives at target location. plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feed_rate, position, 0); 12dc6: e0 90 31 06 lds r14, 0x0631 ; 0x800631 12dca: f0 90 32 06 lds r15, 0x0632 ; 0x800632 12dce: 00 91 33 06 lds r16, 0x0633 ; 0x800633 12dd2: 10 91 34 06 lds r17, 0x0634 ; 0x800634 12dd6: 20 91 2d 06 lds r18, 0x062D ; 0x80062d 12dda: 30 91 2e 06 lds r19, 0x062E ; 0x80062e 12dde: 40 91 2f 06 lds r20, 0x062F ; 0x80062f 12de2: 50 91 30 06 lds r21, 0x0630 ; 0x800630 12de6: 60 91 29 06 lds r22, 0x0629 ; 0x800629 12dea: 70 91 2a 06 lds r23, 0x062A ; 0x80062a 12dee: 80 91 2b 06 lds r24, 0x062B ; 0x80062b 12df2: 90 91 2c 06 lds r25, 0x062C ; 0x80062c 12df6: 1f 92 push r1 12df8: 1f 92 push r1 12dfa: e1 e6 ldi r30, 0x61 ; 97 12dfc: f2 e1 ldi r31, 0x12 ; 18 12dfe: ff 93 push r31 12e00: ef 93 push r30 12e02: 88 ac ldd r8, Y+56 ; 0x38 12e04: 99 ac ldd r9, Y+57 ; 0x39 12e06: aa ac ldd r10, Y+58 ; 0x3a 12e08: bb ac ldd r11, Y+59 ; 0x3b 12e0a: a5 e3 ldi r26, 0x35 ; 53 12e0c: ca 2e mov r12, r26 12e0e: a6 e0 ldi r26, 0x06 ; 6 12e10: da 2e mov r13, r26 12e12: 0f 94 33 3d call 0x27a66 ; 0x27a66 12e16: 0f 90 pop r0 12e18: 0f 90 pop r0 12e1a: 0f 90 pop r0 12e1c: 0f 90 pop r0 // As far as the parser is concerned, the position is now == target. In reality the // motion control system might still be processing the action and the real tool position // in any intermediate location. set_current_to_destination(); 12e1e: 0e 94 e8 54 call 0xa9d0 ; 0xa9d0 previous_millis_cmd.start(); 12e22: 88 e4 ldi r24, 0x48 ; 72 12e24: 93 e0 ldi r25, 0x03 ; 3 12e26: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> 12e2a: 4d cc rjmp .-1894 ; 0x126c6 get_coordinates(); // For X Y Z E F #ifdef SF_ARC_FIX relative_mode=relative_mode_backup; #endif offset[0] = code_seen('I') ? code_value() : 0.f; 12e2c: 60 e0 ldi r22, 0x00 ; 0 12e2e: 70 e0 ldi r23, 0x00 ; 0 12e30: cb 01 movw r24, r22 12e32: 5e cc rjmp .-1860 ; 0x126f0 float center_axis_y = start_position[Y_AXIS] - r_axis_y; float travel_z = target[Z_AXIS] - start_position[Z_AXIS]; float rt_x = target[X_AXIS] - center_axis_x; float rt_y = target[Y_AXIS] - center_axis_y; // 20200419 - Add a variable that will be used to hold the arc segment length float mm_per_arc_segment = cs.mm_per_arc_segment; 12e34: a3 2c mov r10, r3 12e36: b2 2c mov r11, r2 12e38: 0c a9 ldd r16, Y+52 ; 0x34 12e3a: 1c ad ldd r17, Y+60 ; 0x3c 12e3c: b0 cd rjmp .-1184 ; 0x1299e // reset n_arc_correction n_arc_correction = cs.n_arc_correction; } else { // Calculate X and Y using the small angle approximation const float r_axisi = r_axis_x * sin_T + r_axis_y * cos_T; 12e3e: 28 a5 ldd r18, Y+40 ; 0x28 12e40: 39 a5 ldd r19, Y+41 ; 0x29 12e42: 4a a5 ldd r20, Y+42 ; 0x2a 12e44: 5b a5 ldd r21, Y+43 ; 0x2b 12e46: 6c ad ldd r22, Y+60 ; 0x3c 12e48: 7d ad ldd r23, Y+61 ; 0x3d 12e4a: 8e ad ldd r24, Y+62 ; 0x3e 12e4c: 9f ad ldd r25, Y+63 ; 0x3f 12e4e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12e52: 4b 01 movw r8, r22 12e54: 5c 01 movw r10, r24 12e56: 2c a5 ldd r18, Y+44 ; 0x2c 12e58: 3d a5 ldd r19, Y+45 ; 0x2d 12e5a: 4e a5 ldd r20, Y+46 ; 0x2e 12e5c: 5f a5 ldd r21, Y+47 ; 0x2f 12e5e: 24 96 adiw r28, 0x04 ; 4 12e60: 6c ad ldd r22, Y+60 ; 0x3c 12e62: 7d ad ldd r23, Y+61 ; 0x3d 12e64: 8e ad ldd r24, Y+62 ; 0x3e 12e66: 9f ad ldd r25, Y+63 ; 0x3f 12e68: 24 97 sbiw r28, 0x04 ; 4 12e6a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12e6e: 9b 01 movw r18, r22 12e70: ac 01 movw r20, r24 12e72: c5 01 movw r24, r10 12e74: b4 01 movw r22, r8 12e76: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 12e7a: 7b 01 movw r14, r22 12e7c: 8c 01 movw r16, r24 r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T; 12e7e: 28 a5 ldd r18, Y+40 ; 0x28 12e80: 39 a5 ldd r19, Y+41 ; 0x29 12e82: 4a a5 ldd r20, Y+42 ; 0x2a 12e84: 5b a5 ldd r21, Y+43 ; 0x2b 12e86: 24 96 adiw r28, 0x04 ; 4 12e88: 6c ad ldd r22, Y+60 ; 0x3c 12e8a: 7d ad ldd r23, Y+61 ; 0x3d 12e8c: 8e ad ldd r24, Y+62 ; 0x3e 12e8e: 9f ad ldd r25, Y+63 ; 0x3f 12e90: 24 97 sbiw r28, 0x04 ; 4 12e92: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12e96: 4b 01 movw r8, r22 12e98: 5c 01 movw r10, r24 12e9a: 2c a5 ldd r18, Y+44 ; 0x2c 12e9c: 3d a5 ldd r19, Y+45 ; 0x2d 12e9e: 4e a5 ldd r20, Y+46 ; 0x2e 12ea0: 5f a5 ldd r21, Y+47 ; 0x2f 12ea2: 6c ad ldd r22, Y+60 ; 0x3c 12ea4: 7d ad ldd r23, Y+61 ; 0x3d 12ea6: 8e ad ldd r24, Y+62 ; 0x3e 12ea8: 9f ad ldd r25, Y+63 ; 0x3f 12eaa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12eae: 9b 01 movw r18, r22 12eb0: ac 01 movw r20, r24 12eb2: c5 01 movw r24, r10 12eb4: b4 01 movw r22, r8 12eb6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 12eba: 68 a7 std Y+40, r22 ; 0x28 12ebc: 79 a7 std Y+41, r23 ; 0x29 12ebe: 8a a7 std Y+42, r24 ; 0x2a 12ec0: 9b a7 std Y+43, r25 ; 0x2b 12ec2: d8 aa std Y+48, r13 ; 0x30 r_axis_y = r_axisi; 12ec4: c7 01 movw r24, r14 12ec6: d8 01 movw r26, r16 12ec8: 8c a7 std Y+44, r24 ; 0x2c 12eca: 9d a7 std Y+45, r25 ; 0x2d 12ecc: ae a7 std Y+46, r26 ; 0x2e 12ece: bf a7 std Y+47, r27 ; 0x2f 12ed0: ff ce rjmp .-514 ; 0x12cd0 - `S` - Time to wait, in seconds */ case 4: codenum = 0; if(code_seen('P')) codenum = code_value(); // milliseconds to wait 12ed2: 80 e5 ldi r24, 0x50 ; 80 12ed4: 0e 94 f5 55 call 0xabea ; 0xabea - `P` - Time to wait, in milliseconds - `S` - Time to wait, in seconds */ case 4: codenum = 0; 12ed8: c1 2c mov r12, r1 12eda: d1 2c mov r13, r1 12edc: 76 01 movw r14, r12 if(code_seen('P')) codenum = code_value(); // milliseconds to wait 12ede: 88 23 and r24, r24 12ee0: 31 f0 breq .+12 ; 0x12eee 12ee2: 0e 94 85 5a call 0xb50a ; 0xb50a 12ee6: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 12eea: 6b 01 movw r12, r22 12eec: 7c 01 movw r14, r24 if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait 12eee: 83 e5 ldi r24, 0x53 ; 83 12ef0: 0e 94 f5 55 call 0xabea ; 0xabea 12ef4: 88 23 and r24, r24 12ef6: 61 f0 breq .+24 ; 0x12f10 12ef8: 0e 94 85 5a call 0xb50a ; 0xb50a 12efc: 20 e0 ldi r18, 0x00 ; 0 12efe: 30 e0 ldi r19, 0x00 ; 0 12f00: 4a e7 ldi r20, 0x7A ; 122 12f02: 54 e4 ldi r21, 0x44 ; 68 12f04: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 12f08: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 12f0c: 6b 01 movw r12, r22 12f0e: 7c 01 movw r14, r24 if(codenum != 0) 12f10: c1 14 cp r12, r1 12f12: d1 04 cpc r13, r1 12f14: e1 04 cpc r14, r1 12f16: f1 04 cpc r15, r1 12f18: 41 f0 breq .+16 ; 0x12f2a { if(custom_message_type != CustomMsg::M117) 12f1a: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 12f1e: 87 30 cpi r24, 0x07 ; 7 12f20: 21 f0 breq .+8 ; 0x12f2a { LCD_MESSAGERPGM(_n("Sleep..."));////MSG_DWELL 12f22: 8d e2 ldi r24, 0x2D ; 45 12f24: 97 e6 ldi r25, 0x67 ; 103 12f26: 0e 94 94 de call 0x1bd28 ; 0x1bd28 } } st_synchronize(); 12f2a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 codenum += _millis(); // keep track of when we started waiting 12f2e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 12f32: c6 0e add r12, r22 12f34: d7 1e adc r13, r23 12f36: e8 1e adc r14, r24 12f38: f9 1e adc r15, r25 previous_millis_cmd.start(); 12f3a: 88 e4 ldi r24, 0x48 ; 72 12f3c: 93 e0 ldi r25, 0x03 ; 3 12f3e: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> while(_millis() < codenum) { 12f42: 0f 94 f0 0d call 0x21be0 ; 0x21be0 12f46: 6c 15 cp r22, r12 12f48: 7d 05 cpc r23, r13 12f4a: 8e 05 cpc r24, r14 12f4c: 9f 05 cpc r25, r15 12f4e: 08 f0 brcs .+2 ; 0x12f52 12f50: ba cb rjmp .-2188 ; 0x126c6 manage_heater(); 12f52: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 12f56: 80 e0 ldi r24, 0x00 ; 0 12f58: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 12f5c: 80 e0 ldi r24, 0x00 ; 0 12f5e: 0e 94 f9 6e call 0xddf2 ; 0xddf2 12f62: ef cf rjmp .-34 ; 0x12f42 case 10: #if EXTRUDERS > 1 retracted_swap[active_extruder]=(code_seen('S') && code_value_long() == 1); // checks for swap retract argument retract(true,retracted_swap[active_extruder]); #else retract(true); 12f64: 81 e0 ldi r24, 0x01 ; 1 */ case 11: #if EXTRUDERS > 1 retract(false,retracted_swap[active_extruder]); #else retract(false); 12f66: 0f 94 2c 90 call 0x32058 ; 0x32058 12f6a: ad cb rjmp .-2214 ; 0x126c6 12f6c: 80 e0 ldi r24, 0x00 ; 0 12f6e: fb cf rjmp .-10 ; 0x12f66 { long home_x_value = 0; long home_y_value = 0; long home_z_value = 0; // Which axes should be homed? bool home_x = code_seen(axis_codes[X_AXIS]); 12f70: 88 e5 ldi r24, 0x58 ; 88 12f72: 0e 94 f5 55 call 0xabea ; 0xabea 12f76: 38 2e mov r3, r24 - `W` - Suppress mesh bed leveling if `X`, `Y` or `Z` are not provided - `C` - Calibrate X and Y origin (home) - Only on MK3/s */ case 28: { long home_x_value = 0; 12f78: 41 2c mov r4, r1 12f7a: 51 2c mov r5, r1 12f7c: 32 01 movw r6, r4 long home_y_value = 0; long home_z_value = 0; // Which axes should be homed? bool home_x = code_seen(axis_codes[X_AXIS]); if (home_x) home_x_value = code_value_long(); 12f7e: 88 23 and r24, r24 12f80: 21 f0 breq .+8 ; 0x12f8a 12f82: 0e 94 5d 56 call 0xacba ; 0xacba 12f86: 2b 01 movw r4, r22 12f88: 3c 01 movw r6, r24 bool home_y = code_seen(axis_codes[Y_AXIS]); 12f8a: 89 e5 ldi r24, 0x59 ; 89 12f8c: 0e 94 f5 55 call 0xabea ; 0xabea 12f90: 28 2e mov r2, r24 if (home_y) home_y_value = code_value_long(); 12f92: 88 23 and r24, r24 12f94: 71 f1 breq .+92 ; 0x12ff2 12f96: 0e 94 5d 56 call 0xacba ; 0xacba 12f9a: 6c a7 std Y+44, r22 ; 0x2c 12f9c: 7d a7 std Y+45, r23 ; 0x2d 12f9e: 8e a7 std Y+46, r24 ; 0x2e 12fa0: 9f a7 std Y+47, r25 ; 0x2f bool home_z = code_seen(axis_codes[Z_AXIS]); 12fa2: 8a e5 ldi r24, 0x5A ; 90 12fa4: 0e 94 f5 55 call 0xabea ; 0xabea 12fa8: d8 2e mov r13, r24 */ case 28: { long home_x_value = 0; long home_y_value = 0; long home_z_value = 0; 12faa: 81 2c mov r8, r1 12fac: 91 2c mov r9, r1 12fae: 54 01 movw r10, r8 bool home_x = code_seen(axis_codes[X_AXIS]); if (home_x) home_x_value = code_value_long(); bool home_y = code_seen(axis_codes[Y_AXIS]); if (home_y) home_y_value = code_value_long(); bool home_z = code_seen(axis_codes[Z_AXIS]); if (home_z) home_z_value = code_value_long(); 12fb0: 88 23 and r24, r24 12fb2: 21 f0 breq .+8 ; 0x12fbc 12fb4: 0e 94 5d 56 call 0xacba ; 0xacba 12fb8: 4b 01 movw r8, r22 12fba: 5c 01 movw r10, r24 bool without_mbl = code_seen('W'); 12fbc: 87 e5 ldi r24, 0x57 ; 87 12fbe: 0e 94 f5 55 call 0xabea ; 0xabea 12fc2: 88 a7 std Y+40, r24 ; 0x28 // calibrate? #ifdef TMC2130 bool calib = code_seen('C'); gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); #else gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, without_mbl); 12fc4: 8f 93 push r24 12fc6: cd 2c mov r12, r13 12fc8: ec a4 ldd r14, Y+44 ; 0x2c 12fca: fd a4 ldd r15, Y+45 ; 0x2d 12fcc: 0e a5 ldd r16, Y+46 ; 0x2e 12fce: 1f a5 ldd r17, Y+47 ; 0x2f 12fd0: 22 2d mov r18, r2 12fd2: b3 01 movw r22, r6 12fd4: a2 01 movw r20, r4 12fd6: 83 2d mov r24, r3 12fd8: 0e 94 2a 6d call 0xda54 ; 0xda54 #endif //TMC2130 if ((home_x || home_y || without_mbl || home_z) == false) { 12fdc: 0f 90 pop r0 12fde: 31 10 cpse r3, r1 12fe0: 72 cb rjmp .-2332 ; 0x126c6 12fe2: 21 10 cpse r2, r1 12fe4: 70 cb rjmp .-2336 ; 0x126c6 12fe6: 38 a5 ldd r19, Y+40 ; 0x28 12fe8: 31 11 cpse r19, r1 12fea: 6d cb rjmp .-2342 ; 0x126c6 12fec: d1 10 cpse r13, r1 12fee: 6b cb rjmp .-2346 ; 0x126c6 12ff0: 20 cb rjmp .-2496 ; 0x12632 - `C` - Calibrate X and Y origin (home) - Only on MK3/s */ case 28: { long home_x_value = 0; long home_y_value = 0; 12ff2: 1c a6 std Y+44, r1 ; 0x2c 12ff4: 1d a6 std Y+45, r1 ; 0x2d 12ff6: 1e a6 std Y+46, r1 ; 0x2e 12ff8: 1f a6 std Y+47, r1 ; 0x2f 12ffa: d3 cf rjmp .-90 ; 0x12fa2 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 12ffc: 08 e2 ldi r16, 0x28 ; 40 12ffe: 10 e0 ldi r17, 0x00 ; 0 Show/print PINDA temperature interpolating. */ case 75: { for (uint8_t i = 40; i <= 110; i++) printf_P(_N("%d %.2f"), i, temp_comp_interpolation(i)); 13000: f8 e0 ldi r31, 0x08 ; 8 13002: ef 2e mov r14, r31 13004: f7 e6 ldi r31, 0x67 ; 103 13006: ff 2e mov r15, r31 13008: 60 2f mov r22, r16 1300a: 70 e0 ldi r23, 0x00 ; 0 1300c: 90 e0 ldi r25, 0x00 ; 0 1300e: 80 e0 ldi r24, 0x00 ; 0 13010: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 13014: 0e 94 86 56 call 0xad0c ; 0xad0c 13018: 9f 93 push r25 1301a: 8f 93 push r24 1301c: 7f 93 push r23 1301e: 6f 93 push r22 13020: 1f 93 push r17 13022: 0f 93 push r16 13024: ff 92 push r15 13026: ef 92 push r14 13028: 0f 94 a2 a2 call 0x34544 ; 0x34544 1302c: 0f 5f subi r16, 0xFF ; 255 1302e: 1f 4f sbci r17, 0xFF ; 255 ### G75 - Print temperature interpolation G75: Print temperature interpolation Show/print PINDA temperature interpolating. */ case 75: { for (uint8_t i = 40; i <= 110; i++) 13030: 0f b6 in r0, 0x3f ; 63 13032: f8 94 cli 13034: de bf out 0x3e, r29 ; 62 13036: 0f be out 0x3f, r0 ; 63 13038: cd bf out 0x3d, r28 ; 61 1303a: 0f 36 cpi r16, 0x6F ; 111 1303c: 11 05 cpc r17, r1 1303e: 21 f7 brne .-56 ; 0x13008 13040: 42 cb rjmp .-2428 ; 0x126c6 ``` */ case 76: { #ifdef PINDA_THERMISTOR if (!has_temperature_compensation()) 13042: 0f 94 58 13 call 0x226b0 ; 0x226b0 13046: 81 11 cpse r24, r1 13048: 05 c0 rjmp .+10 ; 0x13054 { SERIAL_ECHOLNPGM("No PINDA thermistor"); 1304a: 87 ec ldi r24, 0xC7 ; 199 1304c: 90 e8 ldi r25, 0x80 ; 128 1304e: 0e 94 bd 7c call 0xf97a ; 0xf97a 13052: 39 cb rjmp .-2446 ; 0x126c6 break; } if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { 13054: 82 e0 ldi r24, 0x02 ; 2 13056: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1305a: 81 11 cpse r24, r1 1305c: 07 c0 rjmp .+14 ; 0x1306c //we need to know accurate position of first calibration point //if xyz calibration was not performed yet, interrupt temperature calibration and inform user that xyz cal. is needed lcd_show_fullscreen_message_and_wait_P(_T(MSG_RUN_XYZ)); 1305e: 8a ed ldi r24, 0xDA ; 218 13060: 99 e3 ldi r25, 0x39 ; 57 13062: 0e 94 3a 75 call 0xea74 ; 0xea74 13066: 0e 94 94 ea call 0x1d528 ; 0x1d528 1306a: 2d cb rjmp .-2470 ; 0x126c6 break; } if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) 1306c: 80 91 39 06 lds r24, 0x0639 ; 0x800639 13070: 88 23 and r24, r24 13072: 41 f0 breq .+16 ; 0x13084 13074: 80 91 3a 06 lds r24, 0x063A ; 0x80063a 13078: 88 23 and r24, r24 1307a: 21 f0 breq .+8 ; 0x13084 1307c: d0 90 3b 06 lds r13, 0x063B ; 0x80063b 13080: d1 10 cpse r13, r1 13082: 08 c0 rjmp .+16 ; 0x13094 // Mark the command at the top of the command queue as new. // Therefore it will not be removed from the queue. void repeatcommand_front() { cmdbuffer_front_already_processed = true; 13084: 81 e0 ldi r24, 0x01 ; 1 13086: 80 93 53 12 sts 0x1253, r24 ; 0x801253 { // We don't know where we are! HOME! // Push the commands to the front of the message queue in the reverse order! // There shall be always enough space reserved for these commands. repeatcommand_front(); // repeat G76 with all its parameters enquecommand_front_P(G28W); 1308a: 81 ed ldi r24, 0xD1 ; 209 1308c: 98 e6 ldi r25, 0x68 ; 104 1308e: 0f 94 78 67 call 0x2cef0 ; 0x2cef0 13092: 19 cb rjmp .-2510 ; 0x126c6 break; } lcd_show_fullscreen_message_and_wait_P(_T(MSG_TEMP_CAL_WARNING)); 13094: 81 e9 ldi r24, 0x91 ; 145 13096: 99 e3 ldi r25, 0x39 ; 57 13098: 0e 94 3a 75 call 0xea74 ; 0xea74 1309c: 0e 94 94 ea call 0x1d528 ; 0x1d528 uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false); 130a0: 8d e1 ldi r24, 0x1D ; 29 130a2: 90 e4 ldi r25, 0x40 ; 64 130a4: 0e 94 3a 75 call 0xea74 ; 0xea74 130a8: 41 e0 ldi r20, 0x01 ; 1 130aa: 60 e0 ldi r22, 0x00 ; 0 130ac: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (result == LCD_LEFT_BUTTON_CHOICE) 130b0: 81 11 cpse r24, r1 130b2: 6e c0 rjmp .+220 ; 0x13190 { current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 130b4: 80 e0 ldi r24, 0x00 ; 0 130b6: 90 e0 ldi r25, 0x00 ; 0 130b8: a0 ea ldi r26, 0xA0 ; 160 130ba: b0 e4 ldi r27, 0x40 ; 64 130bc: 80 93 69 12 sts 0x1269, r24 ; 0x801269 130c0: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 130c4: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 130c8: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 130cc: 60 e0 ldi r22, 0x00 ; 0 130ce: 70 e0 ldi r23, 0x00 ; 0 130d0: 88 e4 ldi r24, 0x48 ; 72 130d2: 92 e4 ldi r25, 0x42 ; 66 130d4: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[Z_AXIS] = 50; 130d8: 80 e0 ldi r24, 0x00 ; 0 130da: 90 e0 ldi r25, 0x00 ; 0 130dc: a8 e4 ldi r26, 0x48 ; 72 130de: b2 e4 ldi r27, 0x42 ; 66 130e0: 80 93 69 12 sts 0x1269, r24 ; 0x801269 130e4: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 130e8: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 130ec: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c current_position[Y_AXIS] = 180; 130f0: 80 e0 ldi r24, 0x00 ; 0 130f2: 90 e0 ldi r25, 0x00 ; 0 130f4: a4 e3 ldi r26, 0x34 ; 52 130f6: b3 e4 ldi r27, 0x43 ; 67 130f8: 80 93 65 12 sts 0x1265, r24 ; 0x801265 130fc: 90 93 66 12 sts 0x1266, r25 ; 0x801266 13100: a0 93 67 12 sts 0x1267, r26 ; 0x801267 13104: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(3000 / 60); 13108: 60 e0 ldi r22, 0x00 ; 0 1310a: 70 e0 ldi r23, 0x00 ; 0 1310c: 88 e4 ldi r24, 0x48 ; 72 1310e: 92 e4 ldi r25, 0x42 ; 66 13110: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 13114: 0f 94 fb 1a call 0x235f6 ; 0x235f6 lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_STEEL_SHEET)); 13118: 83 ef ldi r24, 0xF3 ; 243 1311a: 9f e3 ldi r25, 0x3F ; 63 1311c: 0e 94 3a 75 call 0xea74 ; 0xea74 13120: 0e 94 94 ea call 0x1d528 ; 0x1d528 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 13124: e4 e0 ldi r30, 0x04 ; 4 13126: fc e9 ldi r31, 0x9C ; 156 13128: 85 91 lpm r24, Z+ 1312a: 95 91 lpm r25, Z+ 1312c: a5 91 lpm r26, Z+ 1312e: b4 91 lpm r27, Z 13130: 80 93 65 12 sts 0x1265, r24 ; 0x801265 13134: 90 93 66 12 sts 0x1266, r25 ; 0x801266 13138: a0 93 67 12 sts 0x1267, r26 ; 0x801267 1313c: b0 93 68 12 sts 0x1268, r27 ; 0x801268 current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 13140: e0 e0 ldi r30, 0x00 ; 0 13142: fc e9 ldi r31, 0x9C ; 156 13144: 85 91 lpm r24, Z+ 13146: 95 91 lpm r25, Z+ 13148: a5 91 lpm r26, Z+ 1314a: b4 91 lpm r27, Z 1314c: 80 93 61 12 sts 0x1261, r24 ; 0x801261 13150: 90 93 62 12 sts 0x1262, r25 ; 0x801262 13154: a0 93 63 12 sts 0x1263, r26 ; 0x801263 13158: b0 93 64 12 sts 0x1264, r27 ; 0x801264 plan_buffer_line_curposXYZE(3000 / 60); 1315c: 60 e0 ldi r22, 0x00 ; 0 1315e: 70 e0 ldi r23, 0x00 ; 0 13160: 88 e4 ldi r24, 0x48 ; 72 13162: 92 e4 ldi r25, 0x42 ; 66 13164: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 13168: 0f 94 fb 1a call 0x235f6 ; 0x235f6 static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) { #ifdef TMC2130 gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true); #else gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, true); 1316c: 81 e0 ldi r24, 0x01 ; 1 1316e: 8f 93 push r24 13170: 81 2c mov r8, r1 13172: 91 2c mov r9, r1 13174: 54 01 movw r10, r8 13176: cc 24 eor r12, r12 13178: c3 94 inc r12 1317a: e1 2c mov r14, r1 1317c: f1 2c mov r15, r1 1317e: 87 01 movw r16, r14 13180: 20 e0 ldi r18, 0x00 ; 0 13182: 40 e0 ldi r20, 0x00 ; 0 13184: 50 e0 ldi r21, 0x00 ; 0 13186: ba 01 movw r22, r20 13188: 80 e0 ldi r24, 0x00 ; 0 1318a: 0e 94 2a 6d call 0xda54 ; 0xda54 1318e: 0f 90 pop r0 plan_buffer_line_curposXYZE(3000 / 60); st_synchronize(); gcode_G28(false, false, true); } if ((current_temperature_pinda > 35) && (farm_mode == false)) { 13190: 20 e0 ldi r18, 0x00 ; 0 13192: 30 e0 ldi r19, 0x00 ; 0 13194: 4c e0 ldi r20, 0x0C ; 12 13196: 52 e4 ldi r21, 0x42 ; 66 13198: 60 91 85 03 lds r22, 0x0385 ; 0x800385 1319c: 70 91 86 03 lds r23, 0x0386 ; 0x800386 131a0: 80 91 87 03 lds r24, 0x0387 ; 0x800387 131a4: 90 91 88 03 lds r25, 0x0388 ; 0x800388 131a8: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 131ac: 18 16 cp r1, r24 131ae: 0c f0 brlt .+2 ; 0x131b2 131b0: 76 c0 rjmp .+236 ; 0x1329e 131b2: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 131b6: 81 11 cpse r24, r1 131b8: 72 c0 rjmp .+228 ; 0x1329e //waiting for PIDNA probe to cool down in case that we are not in farm mode current_position[Z_AXIS] = 100; 131ba: 80 e0 ldi r24, 0x00 ; 0 131bc: 90 e0 ldi r25, 0x00 ; 0 131be: a8 ec ldi r26, 0xC8 ; 200 131c0: b2 e4 ldi r27, 0x42 ; 66 131c2: 80 93 69 12 sts 0x1269, r24 ; 0x801269 131c6: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 131ca: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 131ce: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 131d2: 60 e0 ldi r22, 0x00 ; 0 131d4: 70 e0 ldi r23, 0x00 ; 0 131d6: 88 e4 ldi r24, 0x48 ; 72 131d8: 92 e4 ldi r25, 0x42 ; 66 131da: 0f 94 81 4c call 0x29902 ; 0x29902 } #ifdef PINDA_THERMISTOR bool lcd_wait_for_pinda(float temp) { disable_heater(); 131de: 0f 94 05 11 call 0x2220a ; 0x2220a LongTimer pinda_timeout; 131e2: 19 82 std Y+1, r1 ; 0x01 131e4: 1a 82 std Y+2, r1 ; 0x02 131e6: 1b 82 std Y+3, r1 ; 0x03 131e8: 1c 82 std Y+4, r1 ; 0x04 131ea: 1d 82 std Y+5, r1 ; 0x05 pinda_timeout.start(); 131ec: ce 01 movw r24, r28 131ee: 01 96 adiw r24, 0x01 ; 1 131f0: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> while (current_temperature_pinda > temp){ lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP_PINDA)); lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp); 131f4: e3 e2 ldi r30, 0x23 ; 35 131f6: fe 2e mov r15, r30 131f8: 06 e5 ldi r16, 0x56 ; 86 131fa: 1e e7 ldi r17, 0x7E ; 126 disable_heater(); LongTimer pinda_timeout; pinda_timeout.start(); bool target_temp_reached = true; while (current_temperature_pinda > temp){ 131fc: 20 e0 ldi r18, 0x00 ; 0 131fe: 30 e0 ldi r19, 0x00 ; 0 13200: 4c e0 ldi r20, 0x0C ; 12 13202: 52 e4 ldi r21, 0x42 ; 66 13204: 60 91 85 03 lds r22, 0x0385 ; 0x800385 13208: 70 91 86 03 lds r23, 0x0386 ; 0x800386 1320c: 80 91 87 03 lds r24, 0x0387 ; 0x800387 13210: 90 91 88 03 lds r25, 0x0388 ; 0x800388 13214: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 13218: 18 16 cp r1, r24 1321a: c4 f5 brge .+112 ; 0x1328c lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP_PINDA)); 1321c: 83 e4 ldi r24, 0x43 ; 67 1321e: 99 e3 ldi r25, 0x39 ; 57 13220: 0e 94 3a 75 call 0xea74 ; 0xea74 13224: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 13228: 42 e8 ldi r20, 0x82 ; 130 1322a: 64 e0 ldi r22, 0x04 ; 4 1322c: 80 e0 ldi r24, 0x00 ; 0 1322e: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp); 13232: 1f 92 push r1 13234: ff 92 push r15 13236: 60 91 85 03 lds r22, 0x0385 ; 0x800385 1323a: 70 91 86 03 lds r23, 0x0386 ; 0x800386 1323e: 80 91 87 03 lds r24, 0x0387 ; 0x800387 13242: 90 91 88 03 lds r25, 0x0388 ; 0x800388 13246: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1324a: 7f 93 push r23 1324c: 6f 93 push r22 1324e: 1f 93 push r17 13250: 0f 93 push r16 13252: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_putc(LCD_STR_DEGREE[0]); 13256: 81 e8 ldi r24, 0x81 ; 129 13258: 0e 94 21 6f call 0xde42 ; 0xde42 delay_keep_alive(1000); 1325c: 88 ee ldi r24, 0xE8 ; 232 1325e: 93 e0 ldi r25, 0x03 ; 3 13260: 0e 94 8e 8e call 0x11d1c ; 0x11d1c serialecho_temperatures(); 13264: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 if (pinda_timeout.expired(8 * 60 * 1000ul)) { //PINDA cooling from 60 C to 35 C takes about 7 minutes 13268: 40 e0 ldi r20, 0x00 ; 0 1326a: 53 e5 ldi r21, 0x53 ; 83 1326c: 67 e0 ldi r22, 0x07 ; 7 1326e: 70 e0 ldi r23, 0x00 ; 0 13270: ce 01 movw r24, r28 13272: 01 96 adiw r24, 0x01 ; 1 13274: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 13278: 0f 90 pop r0 1327a: 0f 90 pop r0 1327c: 0f 90 pop r0 1327e: 0f 90 pop r0 13280: 0f 90 pop r0 13282: 0f 90 pop r0 13284: 88 23 and r24, r24 13286: 09 f4 brne .+2 ; 0x1328a 13288: b9 cf rjmp .-142 ; 0x131fc target_temp_reached = false; 1328a: d1 2c mov r13, r1 break; } } lcd_update_enable(true); 1328c: 81 e0 ldi r24, 0x01 ; 1 1328e: 0e 94 38 70 call 0xe070 ; 0xe070 if (lcd_wait_for_pinda(35) == false) { //waiting for PINDA probe to cool, if this takes more then time expected, temp. cal. fails 13292: d1 10 cpse r13, r1 13294: 04 c0 rjmp .+8 ; 0x1329e lcd_temp_cal_show_result(false); 13296: 80 e0 ldi r24, 0x00 ; 0 13298: 0e 94 de fb call 0x1f7bc ; 0x1f7bc 1329c: 14 ca rjmp .-3032 ; 0x126c6 break; } } st_synchronize(); 1329e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 homing_flag = true; // keep homing on to avoid babystepping while the LCD is enabled 132a2: 81 e0 ldi r24, 0x01 ; 1 132a4: 80 93 71 12 sts 0x1271, r24 ; 0x801271 lcd_update_enable(true); 132a8: 0e 94 38 70 call 0xe070 ; 0xe070 SERIAL_ECHOLNPGM("PINDA probe calibration start"); 132ac: 89 ea ldi r24, 0xA9 ; 169 132ae: 90 e8 ldi r25, 0x80 ; 128 132b0: 0e 94 bd 7c call 0xf97a ; 0xf97a float zero_z; int z_shift = 0; //unit: steps float start_temp = 5 * (int)(current_temperature_pinda / 5); 132b4: 80 90 85 03 lds r8, 0x0385 ; 0x800385 132b8: 90 90 86 03 lds r9, 0x0386 ; 0x800386 132bc: a0 90 87 03 lds r10, 0x0387 ; 0x800387 132c0: b0 90 88 03 lds r11, 0x0388 ; 0x800388 132c4: 20 e0 ldi r18, 0x00 ; 0 132c6: 30 e0 ldi r19, 0x00 ; 0 132c8: 40 ea ldi r20, 0xA0 ; 160 132ca: 50 e4 ldi r21, 0x40 ; 64 132cc: c5 01 movw r24, r10 132ce: b4 01 movw r22, r8 132d0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 132d4: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 132d8: 25 e0 ldi r18, 0x05 ; 5 132da: 26 9f mul r18, r22 132dc: a0 01 movw r20, r0 132de: 27 9f mul r18, r23 132e0: 50 0d add r21, r0 132e2: 11 24 eor r1, r1 132e4: ba 01 movw r22, r20 132e6: 55 0f add r21, r21 132e8: 88 0b sbc r24, r24 132ea: 99 0b sbc r25, r25 132ec: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 132f0: 1b 01 movw r2, r22 132f2: 7c 01 movw r14, r24 if (start_temp < 35) start_temp = 35; 132f4: 20 e0 ldi r18, 0x00 ; 0 132f6: 30 e0 ldi r19, 0x00 ; 0 132f8: 4c e0 ldi r20, 0x0C ; 12 132fa: 52 e4 ldi r21, 0x42 ; 66 132fc: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 13300: 87 ff sbrs r24, 7 13302: 06 c0 rjmp .+12 ; 0x13310 13304: 21 2c mov r2, r1 13306: 31 2c mov r3, r1 13308: 6c e0 ldi r22, 0x0C ; 12 1330a: e6 2e mov r14, r22 1330c: 72 e4 ldi r23, 0x42 ; 66 1330e: f7 2e mov r15, r23 if (start_temp < current_temperature_pinda) start_temp += 5; 13310: 22 2d mov r18, r2 13312: 33 2d mov r19, r3 13314: 4e 2d mov r20, r14 13316: 5f 2d mov r21, r15 13318: c5 01 movw r24, r10 1331a: b4 01 movw r22, r8 1331c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 13320: 18 16 cp r1, r24 13322: 64 f4 brge .+24 ; 0x1333c 13324: 20 e0 ldi r18, 0x00 ; 0 13326: 30 e0 ldi r19, 0x00 ; 0 13328: 40 ea ldi r20, 0xA0 ; 160 1332a: 50 e4 ldi r21, 0x40 ; 64 1332c: 62 2d mov r22, r2 1332e: 73 2d mov r23, r3 13330: 8e 2d mov r24, r14 13332: 9f 2d mov r25, r15 13334: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 13338: 1b 01 movw r2, r22 1333a: 7c 01 movw r14, r24 printf_P(_N("start temperature: %.1f\n"), start_temp); 1333c: ff 92 push r15 1333e: ef 92 push r14 13340: 3f 92 push r3 13342: 2f 92 push r2 13344: 8f ee ldi r24, 0xEF ; 239 13346: 96 e6 ldi r25, 0x66 ; 102 13348: 9f 93 push r25 1334a: 8f 93 push r24 1334c: 0f 94 a2 a2 call 0x34544 ; 0x34544 setTargetBed(70 + (start_temp - 30)); 13350: 20 e0 ldi r18, 0x00 ; 0 13352: 30 e0 ldi r19, 0x00 ; 0 13354: 40 ef ldi r20, 0xF0 ; 240 13356: 51 e4 ldi r21, 0x41 ; 65 13358: 62 2d mov r22, r2 1335a: 73 2d mov r23, r3 1335c: 8e 2d mov r24, r14 1335e: 9f 2d mov r25, r15 13360: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 13364: 20 e0 ldi r18, 0x00 ; 0 13366: 30 e0 ldi r19, 0x00 ; 0 13368: 4c e8 ldi r20, 0x8C ; 140 1336a: 52 e4 ldi r21, 0x42 ; 66 1336c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> target_temperature[0] = celsius; resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 13370: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 13374: 70 93 5a 12 sts 0x125A, r23 ; 0x80125a 13378: 60 93 59 12 sts 0x1259, r22 ; 0x801259 custom_message_type = CustomMsg::TempCal; 1337c: 84 e0 ldi r24, 0x04 ; 4 1337e: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d custom_message_state = 1; 13382: 81 e0 ldi r24, 0x01 ; 1 13384: 80 93 de 03 sts 0x03DE, r24 ; 0x8003de lcd_setstatuspgm(_T(MSG_PINDA_CALIBRATION)); 13388: 8c ec ldi r24, 0xCC ; 204 1338a: 95 e4 ldi r25, 0x45 ; 69 1338c: 0e 94 3a 75 call 0xea74 ; 0xea74 13390: 0e 94 94 de call 0x1bd28 ; 0x1bd28 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 13394: 80 e0 ldi r24, 0x00 ; 0 13396: 90 e0 ldi r25, 0x00 ; 0 13398: a0 ea ldi r26, 0xA0 ; 160 1339a: b0 e4 ldi r27, 0x40 ; 64 1339c: 80 93 69 12 sts 0x1269, r24 ; 0x801269 133a0: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 133a4: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 133a8: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 133ac: 60 e0 ldi r22, 0x00 ; 0 133ae: 70 e0 ldi r23, 0x00 ; 0 133b0: 88 e4 ldi r24, 0x48 ; 72 133b2: 92 e4 ldi r25, 0x42 ; 66 133b4: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[X_AXIS] = PINDA_PREHEAT_X; 133b8: 80 e0 ldi r24, 0x00 ; 0 133ba: 90 e0 ldi r25, 0x00 ; 0 133bc: a0 ea ldi r26, 0xA0 ; 160 133be: b1 e4 ldi r27, 0x41 ; 65 133c0: 80 93 61 12 sts 0x1261, r24 ; 0x801261 133c4: 90 93 62 12 sts 0x1262, r25 ; 0x801262 133c8: a0 93 63 12 sts 0x1263, r26 ; 0x801263 133cc: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = PINDA_PREHEAT_Y; 133d0: 80 e0 ldi r24, 0x00 ; 0 133d2: 90 e0 ldi r25, 0x00 ; 0 133d4: a0 e7 ldi r26, 0x70 ; 112 133d6: b2 e4 ldi r27, 0x42 ; 66 133d8: 80 93 65 12 sts 0x1265, r24 ; 0x801265 133dc: 90 93 66 12 sts 0x1266, r25 ; 0x801266 133e0: a0 93 67 12 sts 0x1267, r26 ; 0x801267 133e4: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(3000 / 60); 133e8: 60 e0 ldi r22, 0x00 ; 0 133ea: 70 e0 ldi r23, 0x00 ; 0 133ec: 88 e4 ldi r24, 0x48 ; 72 133ee: 92 e4 ldi r25, 0x42 ; 66 133f0: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[Z_AXIS] = PINDA_PREHEAT_Z; 133f4: 8a e9 ldi r24, 0x9A ; 154 133f6: 99 e9 ldi r25, 0x99 ; 153 133f8: a9 e1 ldi r26, 0x19 ; 25 133fa: be e3 ldi r27, 0x3E ; 62 133fc: 80 93 69 12 sts 0x1269, r24 ; 0x801269 13400: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 13404: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 13408: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 1340c: 60 e0 ldi r22, 0x00 ; 0 1340e: 70 e0 ldi r23, 0x00 ; 0 13410: 88 e4 ldi r24, 0x48 ; 72 13412: 92 e4 ldi r25, 0x42 ; 66 13414: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 13418: 0f 94 fb 1a call 0x235f6 ; 0x235f6 1341c: 0f 90 pop r0 1341e: 0f 90 pop r0 13420: 0f 90 pop r0 13422: 0f 90 pop r0 13424: 0f 90 pop r0 13426: 0f 90 pop r0 while (current_temperature_pinda < start_temp) 13428: 20 91 85 03 lds r18, 0x0385 ; 0x800385 1342c: 30 91 86 03 lds r19, 0x0386 ; 0x800386 13430: 40 91 87 03 lds r20, 0x0387 ; 0x800387 13434: 50 91 88 03 lds r21, 0x0388 ; 0x800388 13438: 62 2d mov r22, r2 1343a: 73 2d mov r23, r3 1343c: 8e 2d mov r24, r14 1343e: 9f 2d mov r25, r15 13440: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 13444: 18 16 cp r1, r24 13446: 3c f4 brge .+14 ; 0x13456 { delay_keep_alive(1000); 13448: 88 ee ldi r24, 0xE8 ; 232 1344a: 93 e0 ldi r25, 0x03 ; 3 1344c: 0e 94 8e 8e call 0x11d1c ; 0x11d1c serialecho_temperatures(); 13450: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 13454: e9 cf rjmp .-46 ; 0x13428 13456: 60 e0 ldi r22, 0x00 ; 0 13458: 86 ea ldi r24, 0xA6 ; 166 1345a: 9f e0 ldi r25, 0x0F ; 15 1345c: 0f 94 04 a4 call 0x34808 ; 0x34808 } eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 0); //invalidate temp. calibration in case that in will be aborted during the calibration process current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 13460: 80 e0 ldi r24, 0x00 ; 0 13462: 90 e0 ldi r25, 0x00 ; 0 13464: a0 ea ldi r26, 0xA0 ; 160 13466: b0 e4 ldi r27, 0x40 ; 64 13468: 80 93 69 12 sts 0x1269, r24 ; 0x801269 1346c: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 13470: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 13474: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 13478: 60 e0 ldi r22, 0x00 ; 0 1347a: 70 e0 ldi r23, 0x00 ; 0 1347c: 88 e4 ldi r24, 0x48 ; 72 1347e: 92 e4 ldi r25, 0x42 ; 66 13480: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 13484: e0 e0 ldi r30, 0x00 ; 0 13486: fc e9 ldi r31, 0x9C ; 156 13488: 85 91 lpm r24, Z+ 1348a: 95 91 lpm r25, Z+ 1348c: a5 91 lpm r26, Z+ 1348e: b4 91 lpm r27, Z 13490: 80 93 61 12 sts 0x1261, r24 ; 0x801261 13494: 90 93 62 12 sts 0x1262, r25 ; 0x801262 13498: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1349c: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 134a0: e4 e0 ldi r30, 0x04 ; 4 134a2: fc e9 ldi r31, 0x9C ; 156 134a4: 85 91 lpm r24, Z+ 134a6: 95 91 lpm r25, Z+ 134a8: a5 91 lpm r26, Z+ 134aa: b4 91 lpm r27, Z 134ac: 80 93 65 12 sts 0x1265, r24 ; 0x801265 134b0: 90 93 66 12 sts 0x1266, r25 ; 0x801266 134b4: a0 93 67 12 sts 0x1267, r26 ; 0x801267 134b8: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(3000 / 60); 134bc: 60 e0 ldi r22, 0x00 ; 0 134be: 70 e0 ldi r23, 0x00 ; 0 134c0: 88 e4 ldi r24, 0x48 ; 72 134c2: 92 e4 ldi r25, 0x42 ; 66 134c4: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 134c8: 0f 94 fb 1a call 0x235f6 ; 0x235f6 bool find_z_result = find_bed_induction_sensor_point_z(-1.f); 134cc: 43 e0 ldi r20, 0x03 ; 3 134ce: 60 e0 ldi r22, 0x00 ; 0 134d0: 70 e0 ldi r23, 0x00 ; 0 134d2: 80 e8 ldi r24, 0x80 ; 128 134d4: 9f eb ldi r25, 0xBF ; 191 134d6: 0f 94 ed 7b call 0x2f7da ; 0x2f7da if (find_z_result == false) { 134da: 81 11 cpse r24, r1 134dc: 05 c0 rjmp .+10 ; 0x134e8 printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z); eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } lcd_temp_cal_show_result(true); 134de: 0e 94 de fb call 0x1f7bc ; 0x1f7bc homing_flag = false; 134e2: 10 92 71 12 sts 0x1271, r1 ; 0x801271 134e6: ef c8 rjmp .-3618 ; 0x126c6 if (find_z_result == false) { lcd_temp_cal_show_result(find_z_result); homing_flag = false; break; } zero_z = current_position[Z_AXIS]; 134e8: 90 91 69 12 lds r25, 0x1269 ; 0x801269 134ec: 98 a7 std Y+40, r25 ; 0x28 134ee: a0 91 6a 12 lds r26, 0x126A ; 0x80126a 134f2: ac a7 std Y+44, r26 ; 0x2c 134f4: b0 91 6b 12 lds r27, 0x126B ; 0x80126b 134f8: b8 ab std Y+48, r27 ; 0x30 134fa: e0 91 6c 12 lds r30, 0x126C ; 0x80126c 134fe: e8 af std Y+56, r30 ; 0x38 printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]); 13500: ef 93 push r30 13502: bf 93 push r27 13504: af 93 push r26 13506: 9f 93 push r25 13508: 82 ee ldi r24, 0xE2 ; 226 1350a: 96 e6 ldi r25, 0x66 ; 102 1350c: 9f 93 push r25 1350e: 8f 93 push r24 13510: 0f 94 a2 a2 call 0x34544 ; 0x34544 13514: 0f 90 pop r0 13516: 0f 90 pop r0 13518: 0f 90 pop r0 1351a: 0f 90 pop r0 1351c: 0f 90 pop r0 1351e: 0f 90 pop r0 13520: 4e ea ldi r20, 0xAE ; 174 13522: 84 2e mov r8, r20 13524: 4f e0 ldi r20, 0x0F ; 15 13526: 94 2e mov r9, r20 13528: 53 e2 ldi r21, 0x23 ; 35 1352a: c5 2e mov r12, r21 1352c: d1 2c mov r13, r1 int i = -1; for (; i < 5; i++) 1352e: 0f ef ldi r16, 0xFF ; 255 13530: 1f ef ldi r17, 0xFF ; 255 { float temp = (40 + i * 5); 13532: b6 01 movw r22, r12 13534: 0d 2c mov r0, r13 13536: 00 0c add r0, r0 13538: 88 0b sbc r24, r24 1353a: 99 0b sbc r25, r25 1353c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 13540: 2b 01 movw r4, r22 13542: 3c 01 movw r6, r24 printf_P(_N("\nStep: %d/6 (skipped)\nPINDA temperature: %d Z shift (mm):0\n"), i + 2, (40 + i*5)); 13544: df 92 push r13 13546: cf 92 push r12 13548: c8 01 movw r24, r16 1354a: 02 96 adiw r24, 0x02 ; 2 1354c: 9f 93 push r25 1354e: 8f 93 push r24 13550: 26 ea ldi r18, 0xA6 ; 166 13552: 36 e6 ldi r19, 0x66 ; 102 13554: 3f 93 push r19 13556: 2f 93 push r18 13558: 0f 94 a2 a2 call 0x34544 ; 0x34544 1355c: 58 01 movw r10, r16 1355e: 5f ef ldi r21, 0xFF ; 255 13560: a5 1a sub r10, r21 13562: b5 0a sbc r11, r21 if (i >= 0) { 13564: 0f 90 pop r0 13566: 0f 90 pop r0 13568: 0f 90 pop r0 1356a: 0f 90 pop r0 1356c: 0f 90 pop r0 1356e: 0f 90 pop r0 13570: 11 f4 brne .+4 ; 0x13576 13572: 0c 94 1b bc jmp 0x17836 ; 0x17836 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 13576: 70 e0 ldi r23, 0x00 ; 0 13578: 60 e0 ldi r22, 0x00 ; 0 1357a: c4 01 movw r24, r8 1357c: 0f 94 22 a4 call 0x34844 ; 0x34844 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } if (start_temp <= temp) break; 13580: a3 01 movw r20, r6 13582: 92 01 movw r18, r4 13584: 62 2d mov r22, r2 13586: 73 2d mov r23, r3 13588: 8e 2d mov r24, r14 1358a: 9f 2d mov r25, r15 1358c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 13590: 18 16 cp r1, r24 13592: 44 f4 brge .+16 ; 0x135a4 } zero_z = current_position[Z_AXIS]; printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]); int i = -1; for (; i < 5; i++) 13594: 85 e0 ldi r24, 0x05 ; 5 13596: a8 16 cp r10, r24 13598: b1 04 cpc r11, r1 1359a: 11 f0 breq .+4 ; 0x135a0 1359c: 0c 94 27 bc jmp 0x1784e ; 0x1784e 135a0: 05 e0 ldi r16, 0x05 ; 5 135a2: 10 e0 ldi r17, 0x00 ; 0 135a4: 58 01 movw r10, r16 135a6: 97 e2 ldi r25, 0x27 ; 39 135a8: a9 1a sub r10, r25 135aa: 98 ef ldi r25, 0xF8 ; 248 135ac: b9 0a sbc r11, r25 135ae: aa 0c add r10, r10 135b0: bb 1c adc r11, r11 135b2: 85 e0 ldi r24, 0x05 ; 5 135b4: 80 9f mul r24, r16 135b6: 10 01 movw r2, r0 135b8: 81 9f mul r24, r17 135ba: 30 0c add r3, r0 135bc: 11 24 eor r1, r1 135be: 0d 5f subi r16, 0xFD ; 253 135c0: 1f 4f sbci r17, 0xFF ; 255 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; plan_buffer_line_curposXYZE(3000 / 60); current_position[X_AXIS] = PINDA_PREHEAT_X; current_position[Y_AXIS] = PINDA_PREHEAT_Y; plan_buffer_line_curposXYZE(3000 / 60); current_position[Z_AXIS] = PINDA_PREHEAT_Z; 135c2: 2a e9 ldi r18, 0x9A ; 154 135c4: 42 2e mov r4, r18 135c6: 29 e9 ldi r18, 0x99 ; 153 135c8: 52 2e mov r5, r18 135ca: 29 e1 ldi r18, 0x19 ; 25 135cc: 62 2e mov r6, r18 135ce: 2e e3 ldi r18, 0x3E ; 62 135d0: 72 2e mov r7, r18 lcd_temp_cal_show_result(find_z_result); break; } z_shift = (int)((current_position[Z_AXIS] - zero_z)*cs.axis_steps_per_mm[Z_AXIS]); printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z); 135d2: 3d e6 ldi r19, 0x6D ; 109 135d4: 83 2e mov r8, r19 135d6: 36 e6 ldi r19, 0x66 ; 102 135d8: 93 2e mov r9, r19 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } if (start_temp <= temp) break; } for (i++; i < 5; i++) 135da: c8 01 movw r24, r16 135dc: 02 97 sbiw r24, 0x02 ; 2 135de: 05 97 sbiw r24, 0x05 ; 5 135e0: 0c f0 brlt .+2 ; 0x135e4 135e2: d4 c0 rjmp .+424 ; 0x1378c { float temp = (40 + i * 5); 135e4: b1 01 movw r22, r2 135e6: 63 5d subi r22, 0xD3 ; 211 135e8: 7f 4f sbci r23, 0xFF ; 255 135ea: 07 2e mov r0, r23 135ec: 00 0c add r0, r0 135ee: 88 0b sbc r24, r24 135f0: 99 0b sbc r25, r25 135f2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 135f6: 6b 01 movw r12, r22 135f8: 7c 01 movw r14, r24 printf_P(_N("\nStep: %d/6\n"), i + 2); 135fa: 1f 93 push r17 135fc: 0f 93 push r16 135fe: a9 e9 ldi r26, 0x99 ; 153 13600: b6 e6 ldi r27, 0x66 ; 102 13602: bf 93 push r27 13604: af 93 push r26 13606: 0f 94 a2 a2 call 0x34544 ; 0x34544 custom_message_state = i + 2; 1360a: 00 93 de 03 sts 0x03DE, r16 ; 0x8003de setTargetBed(50 + 10 * (temp - 30) / 5); 1360e: 20 e0 ldi r18, 0x00 ; 0 13610: 30 e0 ldi r19, 0x00 ; 0 13612: 40 ef ldi r20, 0xF0 ; 240 13614: 51 e4 ldi r21, 0x41 ; 65 13616: c7 01 movw r24, r14 13618: b6 01 movw r22, r12 1361a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1361e: 20 e0 ldi r18, 0x00 ; 0 13620: 30 e0 ldi r19, 0x00 ; 0 13622: 40 e2 ldi r20, 0x20 ; 32 13624: 51 e4 ldi r21, 0x41 ; 65 13626: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1362a: 20 e0 ldi r18, 0x00 ; 0 1362c: 30 e0 ldi r19, 0x00 ; 0 1362e: 40 ea ldi r20, 0xA0 ; 160 13630: 50 e4 ldi r21, 0x40 ; 64 13632: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 13636: 20 e0 ldi r18, 0x00 ; 0 13638: 30 e0 ldi r19, 0x00 ; 0 1363a: 48 e4 ldi r20, 0x48 ; 72 1363c: 52 e4 ldi r21, 0x42 ; 66 1363e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 13642: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 13646: 70 93 5a 12 sts 0x125A, r23 ; 0x80125a 1364a: 60 93 59 12 sts 0x1259, r22 ; 0x801259 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 1364e: 80 e0 ldi r24, 0x00 ; 0 13650: 90 e0 ldi r25, 0x00 ; 0 13652: a0 ea ldi r26, 0xA0 ; 160 13654: b0 e4 ldi r27, 0x40 ; 64 13656: 80 93 69 12 sts 0x1269, r24 ; 0x801269 1365a: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 1365e: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 13662: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 13666: 60 e0 ldi r22, 0x00 ; 0 13668: 70 e0 ldi r23, 0x00 ; 0 1366a: 88 e4 ldi r24, 0x48 ; 72 1366c: 92 e4 ldi r25, 0x42 ; 66 1366e: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[X_AXIS] = PINDA_PREHEAT_X; 13672: 20 e0 ldi r18, 0x00 ; 0 13674: 30 e0 ldi r19, 0x00 ; 0 13676: 40 ea ldi r20, 0xA0 ; 160 13678: 51 e4 ldi r21, 0x41 ; 65 1367a: 20 93 61 12 sts 0x1261, r18 ; 0x801261 1367e: 30 93 62 12 sts 0x1262, r19 ; 0x801262 13682: 40 93 63 12 sts 0x1263, r20 ; 0x801263 13686: 50 93 64 12 sts 0x1264, r21 ; 0x801264 current_position[Y_AXIS] = PINDA_PREHEAT_Y; 1368a: 80 e0 ldi r24, 0x00 ; 0 1368c: 90 e0 ldi r25, 0x00 ; 0 1368e: a0 e7 ldi r26, 0x70 ; 112 13690: b2 e4 ldi r27, 0x42 ; 66 13692: 80 93 65 12 sts 0x1265, r24 ; 0x801265 13696: 90 93 66 12 sts 0x1266, r25 ; 0x801266 1369a: a0 93 67 12 sts 0x1267, r26 ; 0x801267 1369e: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(3000 / 60); 136a2: 60 e0 ldi r22, 0x00 ; 0 136a4: 70 e0 ldi r23, 0x00 ; 0 136a6: 88 e4 ldi r24, 0x48 ; 72 136a8: 92 e4 ldi r25, 0x42 ; 66 136aa: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[Z_AXIS] = PINDA_PREHEAT_Z; 136ae: 40 92 69 12 sts 0x1269, r4 ; 0x801269 136b2: 50 92 6a 12 sts 0x126A, r5 ; 0x80126a 136b6: 60 92 6b 12 sts 0x126B, r6 ; 0x80126b 136ba: 70 92 6c 12 sts 0x126C, r7 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 136be: 60 e0 ldi r22, 0x00 ; 0 136c0: 70 e0 ldi r23, 0x00 ; 0 136c2: 88 e4 ldi r24, 0x48 ; 72 136c4: 92 e4 ldi r25, 0x42 ; 66 136c6: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 136ca: 0f 94 fb 1a call 0x235f6 ; 0x235f6 136ce: 0f 90 pop r0 136d0: 0f 90 pop r0 136d2: 0f 90 pop r0 136d4: 0f 90 pop r0 while (current_temperature_pinda < temp) 136d6: 20 91 85 03 lds r18, 0x0385 ; 0x800385 136da: 30 91 86 03 lds r19, 0x0386 ; 0x800386 136de: 40 91 87 03 lds r20, 0x0387 ; 0x800387 136e2: 50 91 88 03 lds r21, 0x0388 ; 0x800388 136e6: c7 01 movw r24, r14 136e8: b6 01 movw r22, r12 136ea: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 136ee: 18 16 cp r1, r24 136f0: 3c f4 brge .+14 ; 0x13700 { delay_keep_alive(1000); 136f2: 88 ee ldi r24, 0xE8 ; 232 136f4: 93 e0 ldi r25, 0x03 ; 3 136f6: 0e 94 8e 8e call 0x11d1c ; 0x11d1c serialecho_temperatures(); 136fa: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 136fe: eb cf rjmp .-42 ; 0x136d6 } current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 13700: 80 e0 ldi r24, 0x00 ; 0 13702: 90 e0 ldi r25, 0x00 ; 0 13704: a0 ea ldi r26, 0xA0 ; 160 13706: b0 e4 ldi r27, 0x40 ; 64 13708: 80 93 69 12 sts 0x1269, r24 ; 0x801269 1370c: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 13710: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 13714: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(3000 / 60); 13718: 60 e0 ldi r22, 0x00 ; 0 1371a: 70 e0 ldi r23, 0x00 ; 0 1371c: 88 e4 ldi r24, 0x48 ; 72 1371e: 92 e4 ldi r25, 0x42 ; 66 13720: 0f 94 81 4c call 0x29902 ; 0x29902 current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 13724: e0 e0 ldi r30, 0x00 ; 0 13726: fc e9 ldi r31, 0x9C ; 156 13728: 85 91 lpm r24, Z+ 1372a: 95 91 lpm r25, Z+ 1372c: a5 91 lpm r26, Z+ 1372e: b4 91 lpm r27, Z 13730: 80 93 61 12 sts 0x1261, r24 ; 0x801261 13734: 90 93 62 12 sts 0x1262, r25 ; 0x801262 13738: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1373c: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 13740: e4 e0 ldi r30, 0x04 ; 4 13742: fc e9 ldi r31, 0x9C ; 156 13744: 85 91 lpm r24, Z+ 13746: 95 91 lpm r25, Z+ 13748: a5 91 lpm r26, Z+ 1374a: b4 91 lpm r27, Z 1374c: 80 93 65 12 sts 0x1265, r24 ; 0x801265 13750: 90 93 66 12 sts 0x1266, r25 ; 0x801266 13754: a0 93 67 12 sts 0x1267, r26 ; 0x801267 13758: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(3000 / 60); 1375c: 60 e0 ldi r22, 0x00 ; 0 1375e: 70 e0 ldi r23, 0x00 ; 0 13760: 88 e4 ldi r24, 0x48 ; 72 13762: 92 e4 ldi r25, 0x42 ; 66 13764: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 13768: 0f 94 fb 1a call 0x235f6 ; 0x235f6 find_z_result = find_bed_induction_sensor_point_z(-1.f); 1376c: 43 e0 ldi r20, 0x03 ; 3 1376e: 60 e0 ldi r22, 0x00 ; 0 13770: 70 e0 ldi r23, 0x00 ; 0 13772: 80 e8 ldi r24, 0x80 ; 128 13774: 9f eb ldi r25, 0xBF ; 191 13776: 0f 94 ed 7b call 0x2f7da ; 0x2f7da 1377a: 95 e0 ldi r25, 0x05 ; 5 1377c: 29 0e add r2, r25 1377e: 31 1c adc r3, r1 13780: 0f 5f subi r16, 0xFF ; 255 13782: 1f 4f sbci r17, 0xFF ; 255 if (find_z_result == false) { 13784: 81 11 cpse r24, r1 13786: 04 c0 rjmp .+8 ; 0x13790 lcd_temp_cal_show_result(find_z_result); 13788: 0e 94 de fb call 0x1f7bc ; 0x1f7bc printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z); eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } lcd_temp_cal_show_result(true); 1378c: 81 e0 ldi r24, 0x01 ; 1 1378e: a7 ce rjmp .-690 ; 0x134de find_z_result = find_bed_induction_sensor_point_z(-1.f); if (find_z_result == false) { lcd_temp_cal_show_result(find_z_result); break; } z_shift = (int)((current_position[Z_AXIS] - zero_z)*cs.axis_steps_per_mm[Z_AXIS]); 13790: 78 a5 ldd r23, Y+40 ; 0x28 13792: 6c a5 ldd r22, Y+44 ; 0x2c 13794: 98 a9 ldd r25, Y+48 ; 0x30 13796: 88 ad ldd r24, Y+56 ; 0x38 13798: 27 2f mov r18, r23 1379a: 36 2f mov r19, r22 1379c: 49 2f mov r20, r25 1379e: 58 2f mov r21, r24 137a0: 60 91 69 12 lds r22, 0x1269 ; 0x801269 137a4: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 137a8: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 137ac: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 137b0: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 137b4: f6 2e mov r15, r22 137b6: e7 2e mov r14, r23 137b8: d8 2e mov r13, r24 137ba: c9 2e mov r12, r25 137bc: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 137c0: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 137c4: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 137c8: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 137cc: d7 01 movw r26, r14 137ce: f6 01 movw r30, r12 137d0: 6b 2f mov r22, r27 137d2: 7a 2f mov r23, r26 137d4: 8f 2f mov r24, r31 137d6: 9e 2f mov r25, r30 137d8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 137dc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 137e0: 6c ab std Y+52, r22 ; 0x34 137e2: 7d ab std Y+53, r23 ; 0x35 137e4: 8e ab std Y+54, r24 ; 0x36 137e6: 9f ab std Y+55, r25 ; 0x37 printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z); 137e8: cf 92 push r12 137ea: df 92 push r13 137ec: ef 92 push r14 137ee: ff 92 push r15 137f0: 80 91 88 03 lds r24, 0x0388 ; 0x800388 137f4: 8f 93 push r24 137f6: 80 91 87 03 lds r24, 0x0387 ; 0x800387 137fa: 8f 93 push r24 137fc: 80 91 86 03 lds r24, 0x0386 ; 0x800386 13800: 8f 93 push r24 13802: 80 91 85 03 lds r24, 0x0385 ; 0x800385 13806: 8f 93 push r24 13808: 9f 92 push r9 1380a: 8f 92 push r8 1380c: 0f 94 a2 a2 call 0x34544 ; 0x34544 13810: 6c a9 ldd r22, Y+52 ; 0x34 13812: 7d a9 ldd r23, Y+53 ; 0x35 13814: c5 01 movw r24, r10 13816: 0f 94 22 a4 call 0x34844 ; 0x34844 1381a: a2 e0 ldi r26, 0x02 ; 2 1381c: aa 0e add r10, r26 1381e: b1 1c adc r11, r1 13820: 0f b6 in r0, 0x3f ; 63 13822: f8 94 cli 13824: de bf out 0x3e, r29 ; 62 13826: 0f be out 0x3f, r0 ; 63 13828: cd bf out 0x3d, r28 ; 61 1382a: d7 ce rjmp .-594 ; 0x135da /*! ### G81 - Mesh bed leveling status G81: Mesh bed leveling status Prints mesh bed leveling status and bed profile if activated. */ case 81: { gcode_G81_M420(); 1382c: 0e 94 53 85 call 0x10aa6 ; 0x10aa6 13830: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 This G-code will be performed at the start of a calibration script. (Prusa3D specific) */ case 86: calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 13834: 80 e1 ldi r24, 0x10 ; 16 13836: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 1383a: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 /*! ### G90 - Switch off relative mode G90: Set to Absolute Positioning All coordinates from now on are absolute relative to the origin of the machine. E axis is left intact. */ case 90: { axis_relative_modes &= ~(X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK); 1383e: 80 91 57 12 lds r24, 0x1257 ; 0x801257 13842: 88 7f andi r24, 0xF8 ; 248 /*! ### G91 - Switch on relative mode G91: Set to Relative Positioning All coordinates from now on are relative to the last position. E axis is left intact. */ case 91: { axis_relative_modes |= X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK; 13844: 80 93 57 12 sts 0x1257, r24 ; 0x801257 13848: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 1384c: b4 ec ldi r27, 0xC4 ; 196 1384e: cb 2e mov r12, r27 13850: b2 e0 ldi r27, 0x02 ; 2 13852: db 2e mov r13, r27 13854: 8e 01 movw r16, r28 13856: 0c 5d subi r16, 0xDC ; 220 13858: 1f 4f sbci r17, 0xFF ; 255 else if(*CMDBUFFER_CURRENT_STRING == 'G') { strchr_pointer = CMDBUFFER_CURRENT_STRING; gcode_in_progress = code_value_short(); // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1385a: 58 01 movw r10, r16 1385c: ee 24 eor r14, r14 1385e: e3 94 inc r14 13860: f1 2c mov r15, r1 float values[NUM_AXIS]; // Check which axes need to be set for(uint8_t i = 0; i < NUM_AXIS; ++i) { codes[i] = code_seen(axis_codes[i]); 13862: d6 01 movw r26, r12 13864: 8d 91 ld r24, X+ 13866: 6d 01 movw r12, r26 13868: 0e 94 f5 55 call 0xabea ; 0xabea 1386c: f5 01 movw r30, r10 1386e: 81 93 st Z+, r24 13870: 5f 01 movw r10, r30 if(codes[i]) 13872: 88 23 and r24, r24 13874: 91 f0 breq .+36 ; 0x1389a values[i] = code_value(); 13876: 0e 94 85 5a call 0xb50a ; 0xb50a 1387a: f7 01 movw r30, r14 1387c: ee 0f add r30, r30 1387e: ff 1f adc r31, r31 13880: ee 0f add r30, r30 13882: ff 1f adc r31, r31 13884: 34 97 sbiw r30, 0x04 ; 4 13886: 21 e0 ldi r18, 0x01 ; 1 13888: 30 e0 ldi r19, 0x00 ; 0 1388a: 2c 0f add r18, r28 1388c: 3d 1f adc r19, r29 1388e: e2 0f add r30, r18 13890: f3 1f adc r31, r19 13892: 60 83 st Z, r22 13894: 71 83 std Z+1, r23 ; 0x01 13896: 82 83 std Z+2, r24 ; 0x02 13898: 93 83 std Z+3, r25 ; 0x03 1389a: 3f ef ldi r19, 0xFF ; 255 1389c: e3 1a sub r14, r19 1389e: f3 0a sbc r15, r19 { bool codes[NUM_AXIS]; float values[NUM_AXIS]; // Check which axes need to be set for(uint8_t i = 0; i < NUM_AXIS; ++i) 138a0: 45 e0 ldi r20, 0x05 ; 5 138a2: e4 16 cp r14, r20 138a4: f1 04 cpc r15, r1 138a6: e9 f6 brne .-70 ; 0x13862 codes[i] = code_seen(axis_codes[i]); if(codes[i]) values[i] = code_value(); } if((codes[E_AXIS] && values[E_AXIS] == 0) && 138a8: 9f a0 ldd r9, Y+39 ; 0x27 138aa: fc a0 ldd r15, Y+36 ; 0x24 138ac: 99 20 and r9, r9 138ae: 01 f1 breq .+64 ; 0x138f0 138b0: 20 e0 ldi r18, 0x00 ; 0 138b2: 30 e0 ldi r19, 0x00 ; 0 138b4: a9 01 movw r20, r18 138b6: 6d 85 ldd r22, Y+13 ; 0x0d 138b8: 7e 85 ldd r23, Y+14 ; 0x0e 138ba: 8f 85 ldd r24, Y+15 ; 0x0f 138bc: 98 89 ldd r25, Y+16 ; 0x10 138be: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 138c2: 81 11 cpse r24, r1 138c4: 15 c0 rjmp .+42 ; 0x138f0 138c6: f1 10 cpse r15, r1 138c8: 13 c0 rjmp .+38 ; 0x138f0 (!codes[X_AXIS] && !codes[Y_AXIS] && !codes[Z_AXIS])) 138ca: 8d a1 ldd r24, Y+37 ; 0x25 138cc: 81 11 cpse r24, r1 138ce: 10 c0 rjmp .+32 ; 0x138f0 138d0: 8e a1 ldd r24, Y+38 ; 0x26 138d2: 81 11 cpse r24, r1 138d4: 0d c0 rjmp .+26 ; 0x138f0 { // As a special optimization, when _just_ clearing the E position // we schedule a flag asynchronously along with the next block to // reset the starting E position instead of stopping the planner current_position[E_AXIS] = 0; 138d6: 10 92 6d 12 sts 0x126D, r1 ; 0x80126d 138da: 10 92 6e 12 sts 0x126E, r1 ; 0x80126e 138de: 10 92 6f 12 sts 0x126F, r1 ; 0x80126f 138e2: 10 92 70 12 sts 0x1270, r1 ; 0x801270 st_set_e_position(position[E_AXIS]); } void plan_reset_next_e() { plan_reset_next_e_queue = true; 138e6: 81 e0 ldi r24, 0x01 ; 1 138e8: 80 93 21 04 sts 0x0421, r24 ; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443> 138ec: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 plan_reset_next_e(); } else { // In any other case we're forced to synchronize st_synchronize(); 138f0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 138f4: ce 01 movw r24, r28 138f6: 01 96 adiw r24, 0x01 ; 1 138f8: 5c 01 movw r10, r24 138fa: 5f eb ldi r21, 0xBF ; 191 138fc: c5 2e mov r12, r21 138fe: 5d e0 ldi r21, 0x0D ; 13 13900: d5 2e mov r13, r21 13902: 61 e6 ldi r22, 0x61 ; 97 13904: e6 2e mov r14, r22 13906: 62 e1 ldi r22, 0x12 ; 18 13908: f6 2e mov r15, r22 1390a: 38 01 movw r6, r16 1390c: 93 e0 ldi r25, 0x03 ; 3 1390e: 69 0e add r6, r25 13910: 71 1c adc r7, r1 for(uint8_t i = 0; i < 3; ++i) { if(codes[i]) 13912: d8 01 movw r26, r16 13914: 8d 91 ld r24, X+ 13916: 8d 01 movw r16, r26 13918: 88 23 and r24, r24 1391a: 89 f0 breq .+34 ; 0x1393e current_position[i] = values[i] + cs.add_homing[i]; 1391c: f6 01 movw r30, r12 1391e: 20 81 ld r18, Z 13920: 31 81 ldd r19, Z+1 ; 0x01 13922: 42 81 ldd r20, Z+2 ; 0x02 13924: 53 81 ldd r21, Z+3 ; 0x03 13926: d5 01 movw r26, r10 13928: 6d 91 ld r22, X+ 1392a: 7d 91 ld r23, X+ 1392c: 8d 91 ld r24, X+ 1392e: 9c 91 ld r25, X 13930: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 13934: f7 01 movw r30, r14 13936: 60 83 st Z, r22 13938: 71 83 std Z+1, r23 ; 0x01 1393a: 82 83 std Z+2, r24 ; 0x02 1393c: 93 83 std Z+3, r25 ; 0x03 1393e: f4 e0 ldi r31, 0x04 ; 4 13940: af 0e add r10, r31 13942: b1 1c adc r11, r1 13944: 24 e0 ldi r18, 0x04 ; 4 13946: c2 0e add r12, r18 13948: d1 1c adc r13, r1 1394a: 34 e0 ldi r19, 0x04 ; 4 1394c: e3 0e add r14, r19 1394e: f1 1c adc r15, r1 } else { // In any other case we're forced to synchronize st_synchronize(); for(uint8_t i = 0; i < 3; ++i) 13950: 60 16 cp r6, r16 13952: 71 06 cpc r7, r17 13954: f1 f6 brne .-68 ; 0x13912 { if(codes[i]) current_position[i] = values[i] + cs.add_homing[i]; } if(codes[E_AXIS]) 13956: 99 20 and r9, r9 13958: 61 f0 breq .+24 ; 0x13972 current_position[E_AXIS] = values[E_AXIS]; 1395a: 8d 85 ldd r24, Y+13 ; 0x0d 1395c: 9e 85 ldd r25, Y+14 ; 0x0e 1395e: af 85 ldd r26, Y+15 ; 0x0f 13960: b8 89 ldd r27, Y+16 ; 0x10 13962: 80 93 6d 12 sts 0x126D, r24 ; 0x80126d 13966: 90 93 6e 12 sts 0x126E, r25 ; 0x80126e 1396a: a0 93 6f 12 sts 0x126F, r26 ; 0x80126f 1396e: b0 93 70 12 sts 0x1270, r27 ; 0x801270 // Set all at once plan_set_position_curposXYZE(); 13972: 0f 94 41 4b call 0x29682 ; 0x29682 13976: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 return true; } void farm_gcode_g98() { farm_mode = 1; 1397a: 81 e0 ldi r24, 0x01 ; 1 1397c: 80 93 60 0d sts 0x0D60, r24 ; 0x800d60 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 13980: 61 e0 ldi r22, 0x01 ; 1 13982: 84 ec ldi r24, 0xC4 ; 196 13984: 9f e0 ldi r25, 0x0F ; 15 13986: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((unsigned char *)EEPROM_FARM_MODE, farm_mode); SilentModeMenu = SILENT_MODE_OFF; 1398a: 10 92 bb 03 sts 0x03BB, r1 ; 0x8003bb 1398e: 60 e0 ldi r22, 0x00 ; 0 13990: 8f ef ldi r24, 0xFF ; 255 13992: 9f e0 ldi r25, 0x0F ; 15 13994: 0f 94 04 a4 call 0x34808 ; 0x34808 } void farm_gcode_g99() { farm_disable(); lcd_update(2); fCheckModeInit(); // alternatively invoke printer reset 13998: 0e 94 5e d9 call 0x1b2bc ; 0x1b2bc 1399c: 0c 94 63 93 jmp 0x126c6 ; 0x126c6 /*! --------------------------------------------------------------------------------- # M Commands */ else if(*CMDBUFFER_CURRENT_STRING == 'M') 139a0: 8d 34 cpi r24, 0x4D ; 77 139a2: 11 f0 breq .+4 ; 0x139a8 139a4: 0c 94 1d bb jmp 0x1763a ; 0x1763a { strchr_pointer = CMDBUFFER_CURRENT_STRING; 139a8: 10 93 bc 04 sts 0x04BC, r17 ; 0x8004bc 139ac: 00 93 bb 04 sts 0x04BB, r16 ; 0x8004bb 139b0: f8 01 movw r30, r16 139b2: 31 96 adiw r30, 0x01 ; 1 int index; for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); 139b4: 81 91 ld r24, Z+ 139b6: 80 32 cpi r24, 0x20 ; 32 139b8: e9 f3 breq .-6 ; 0x139b4 139ba: 89 30 cpi r24, 0x09 ; 9 139bc: d9 f3 breq .-10 ; 0x139b4 /*for (++strchr_pointer; *strchr_pointer == ' ' || *strchr_pointer == '\t'; ++strchr_pointer);*/ if (*(strchr_pointer+index) < '0' || *(strchr_pointer+index) > '9') { 139be: 80 53 subi r24, 0x30 ; 48 139c0: 8a 30 cpi r24, 0x0A ; 10 139c2: 30 f0 brcs .+12 ; 0x139d0 printf_P(PSTR("Invalid M code: %s\n"), cmdbuffer + bufindr + CMDHDRSIZE); 139c4: 1f 93 push r17 139c6: 0f 93 push r16 139c8: 85 e9 ldi r24, 0x95 ; 149 139ca: 90 e8 ldi r25, 0x80 ; 128 139cc: 0c 94 1b 90 jmp 0x12036 ; 0x12036 } else { mcode_in_progress = code_value_short(); 139d0: 0e 94 17 56 call 0xac2e ; 0xac2e 139d4: 90 93 41 0d sts 0x0D41, r25 ; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1> 139d8: 80 93 40 0d sts 0x0D40, r24 ; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489> // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 139dc: 8e 3b cpi r24, 0xBE ; 190 139de: 91 05 cpc r25, r1 139e0: 11 f4 brne .+4 ; 0x139e6 139e2: 0c 94 0e a8 jmp 0x1501c ; 0x1501c 139e6: 0c f0 brlt .+2 ; 0x139ea 139e8: 31 c3 rjmp .+1634 ; 0x1404c 139ea: 8c 34 cpi r24, 0x4C ; 76 139ec: 91 05 cpc r25, r1 139ee: 11 f4 brne .+4 ; 0x139f4 139f0: 0c 94 f7 a6 jmp 0x14dee ; 0x14dee 139f4: 0c f0 brlt .+2 ; 0x139f8 139f6: df c1 rjmp .+958 ; 0x13db6 139f8: 8c 31 cpi r24, 0x1C ; 28 139fa: 91 05 cpc r25, r1 139fc: 11 f4 brne .+4 ; 0x13a02 139fe: 0c 94 2e a5 jmp 0x14a5c ; 0x14a5c 13a02: 0c f0 brlt .+2 ; 0x13a06 13a04: f4 c0 rjmp .+488 ; 0x13bee 13a06: 85 31 cpi r24, 0x15 ; 21 13a08: 91 05 cpc r25, r1 13a0a: 09 f4 brne .+2 ; 0x13a0e 13a0c: 40 c7 rjmp .+3712 ; 0x1488e 13a0e: 0c f0 brlt .+2 ; 0x13a12 13a10: 5a c0 rjmp .+180 ; 0x13ac6 13a12: 81 31 cpi r24, 0x11 ; 17 13a14: 91 05 cpc r25, r1 13a16: 09 f4 brne .+2 ; 0x13a1a 13a18: 2f c7 rjmp .+3678 ; 0x14878 13a1a: dc f4 brge .+54 ; 0x13a52 13a1c: 02 97 sbiw r24, 0x02 ; 2 13a1e: 08 f4 brcc .+2 ; 0x13a22 13a20: 93 c6 rjmp .+3366 ; 0x14748 /*! #### End of M-Commands */ default: printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE); 13a22: 80 91 38 12 lds r24, 0x1238 ; 0x801238 13a26: 90 91 39 12 lds r25, 0x1239 ; 0x801239 13a2a: 82 5b subi r24, 0xB2 ; 178 13a2c: 9f 4e sbci r25, 0xEF ; 239 13a2e: 9f 93 push r25 13a30: 8f 93 push r24 13a32: 1f 92 push r1 13a34: 8d e4 ldi r24, 0x4D ; 77 13a36: 8f 93 push r24 13a38: 88 e5 ldi r24, 0x58 ; 88 13a3a: 96 e6 ldi r25, 0x66 ; 102 13a3c: 9f 93 push r25 13a3e: 8f 93 push r24 13a40: 0f 94 a2 a2 call 0x34544 ; 0x34544 13a44: 0f 90 pop r0 13a46: 0f 90 pop r0 13a48: 0f 90 pop r0 13a4a: 0f 90 pop r0 13a4c: 0f 90 pop r0 13a4e: 0f 90 pop r0 13a50: de c6 rjmp .+3516 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13a52: 82 31 cpi r24, 0x12 ; 18 13a54: 91 05 cpc r25, r1 13a56: 11 f4 brne .+4 ; 0x13a5c 13a58: 0c 94 b9 a8 jmp 0x15172 ; 0x15172 13a5c: 44 97 sbiw r24, 0x14 ; 20 13a5e: 09 f7 brne .-62 ; 0x13a22 #### Parameters - `T` - Report timestamps as well. The value is one uint32_t encoded as hex. Requires host software parsing (Cap:EXTENDED_M20). - `L` - Reports long filenames instead of just short filenames. Requires host software parsing (Cap:EXTENDED_M20). */ case 20: KEEPALIVE_STATE(NOT_BUSY); // do not send busy messages during listing. Inhibits the output of manage_heater() 13a60: 81 e0 ldi r24, 0x01 ; 1 13a62: 80 93 78 02 sts 0x0278, r24 ; 0x800278 SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST 13a66: 88 e4 ldi r24, 0x48 ; 72 13a68: 96 e6 ldi r25, 0x66 ; 102 13a6a: 0e 94 bd 7c call 0xf97a ; 0xf97a card.ls(CardReader::ls_param(code_seen('L'), code_seen('T'))); 13a6e: 84 e5 ldi r24, 0x54 ; 84 13a70: 0e 94 f5 55 call 0xabea ; 0xabea 13a74: 18 2f mov r17, r24 13a76: 8c e4 ldi r24, 0x4C ; 76 13a78: 0e 94 f5 55 call 0xabea ; 0xabea 13a7c: 00 e0 ldi r16, 0x00 ; 0 13a7e: 80 fb bst r24, 0 13a80: 00 f9 bld r16, 0 13a82: 10 fb bst r17, 0 13a84: 01 f9 bld r16, 1 } // while readDir } void CardReader::ls(ls_param params) { root.rewind(); 13a86: 8d e5 ldi r24, 0x5D ; 93 13a88: 94 e1 ldi r25, 0x14 ; 20 13a8a: 0e 94 a6 79 call 0xf34c ; 0xf34c lsDive("",root, NULL, LS_SerialPrint, params); 13a8e: 83 e2 ldi r24, 0x23 ; 35 13a90: ed e5 ldi r30, 0x5D ; 93 13a92: f4 e1 ldi r31, 0x14 ; 20 13a94: de 01 movw r26, r28 13a96: 11 96 adiw r26, 0x01 ; 1 13a98: 01 90 ld r0, Z+ 13a9a: 0d 92 st X+, r0 13a9c: 8a 95 dec r24 13a9e: e1 f7 brne .-8 ; 0x13a98 13aa0: 20 e0 ldi r18, 0x00 ; 0 13aa2: 50 e0 ldi r21, 0x00 ; 0 13aa4: 40 e0 ldi r20, 0x00 ; 0 13aa6: be 01 movw r22, r28 13aa8: 6f 5f subi r22, 0xFF ; 255 13aaa: 7f 4f sbci r23, 0xFF ; 255 13aac: 8f ed ldi r24, 0xDF ; 223 13aae: 92 e0 ldi r25, 0x02 ; 2 13ab0: 0f 94 8a 69 call 0x2d314 ; 0x2d314 13ab4: ce 01 movw r24, r28 13ab6: 01 96 adiw r24, 0x01 ; 1 13ab8: 0e 94 ab 79 call 0xf356 ; 0xf356 SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST 13abc: 8a e3 ldi r24, 0x3A ; 58 13abe: 96 e6 ldi r25, 0x66 ; 102 13ac0: 0e 94 bd 7c call 0xf97a ; 0xf97a 13ac4: a4 c6 rjmp .+3400 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13ac6: 88 31 cpi r24, 0x18 ; 24 13ac8: 91 05 cpc r25, r1 13aca: 09 f4 brne .+2 ; 0x13ace 13acc: f1 c6 rjmp .+3554 ; 0x148b0 13ace: 84 f4 brge .+32 ; 0x13af0 13ad0: 86 31 cpi r24, 0x16 ; 22 13ad2: 91 05 cpc r25, r1 13ad4: 09 f4 brne .+2 ; 0x13ad8 13ad6: df c6 rjmp .+3518 ; 0x14896 13ad8: 47 97 sbiw r24, 0x17 ; 23 13ada: 09 f0 breq .+2 ; 0x13ade 13adc: a2 cf rjmp .-188 ; 0x13a22 M23 [filename] */ case 23: card.openFileReadFilteredGcode(strchr_pointer + 4, true); 13ade: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 13ae2: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 13ae6: 61 e0 ldi r22, 0x01 ; 1 13ae8: 04 96 adiw r24, 0x04 ; 4 13aea: 0f 94 f3 71 call 0x2e3e6 ; 0x2e3e6 13aee: 8f c6 rjmp .+3358 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13af0: 8a 31 cpi r24, 0x1A ; 26 13af2: 91 05 cpc r25, r1 13af4: 09 f4 brne .+2 ; 0x13af8 13af6: 22 c7 rjmp .+3652 ; 0x1493c 13af8: 0c f0 brlt .+2 ; 0x13afc 13afa: 42 c7 rjmp .+3716 ; 0x14980 13afc: 04 ec ldi r16, 0xC4 ; 196 13afe: 12 e0 ldi r17, 0x02 ; 2 13b00: f2 e4 ldi r31, 0x42 ; 66 13b02: af 2e mov r10, r31 13b04: f2 e0 ldi r31, 0x02 ; 2 13b06: bf 2e mov r11, r31 13b08: a4 e2 ldi r26, 0x24 ; 36 13b0a: ca 2e mov r12, r26 13b0c: a2 e0 ldi r26, 0x02 ; 2 13b0e: da 2e mov r13, r26 13b10: b8 e1 ldi r27, 0x18 ; 24 13b12: eb 2e mov r14, r27 13b14: b2 e0 ldi r27, 0x02 ; 2 13b16: fb 2e mov r15, r27 13b18: 87 ec ldi r24, 0xC7 ; 199 13b1a: 88 2e mov r8, r24 13b1c: 82 e0 ldi r24, 0x02 ; 2 13b1e: 98 2e mov r9, r24 case 125: case 601: { //Set new pause position for all three axis XYZ for (uint8_t axis = 0; axis < E_AXIS; axis++) { if (code_seen(axis_codes[axis])) { 13b20: f8 01 movw r30, r16 13b22: 81 91 ld r24, Z+ 13b24: 8f 01 movw r16, r30 13b26: 0e 94 f5 55 call 0xabea ; 0xabea 13b2a: 88 23 and r24, r24 13b2c: 21 f1 breq .+72 ; 0x13b76 //Check that the positions are within hardware limits pause_position[axis] = constrain(code_value(), min_pos[axis], max_pos[axis]); 13b2e: 0e 94 85 5a call 0xb50a ; 0xb50a 13b32: d6 01 movw r26, r12 13b34: 4d 90 ld r4, X+ 13b36: 5d 90 ld r5, X+ 13b38: 6d 90 ld r6, X+ 13b3a: 7c 90 ld r7, X 13b3c: a3 01 movw r20, r6 13b3e: 92 01 movw r18, r4 13b40: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 13b44: 87 fd sbrc r24, 7 13b46: 11 c0 rjmp .+34 ; 0x13b6a 13b48: 0e 94 85 5a call 0xb50a ; 0xb50a 13b4c: f7 01 movw r30, r14 13b4e: 40 80 ld r4, Z 13b50: 51 80 ldd r5, Z+1 ; 0x01 13b52: 62 80 ldd r6, Z+2 ; 0x02 13b54: 73 80 ldd r7, Z+3 ; 0x03 13b56: a3 01 movw r20, r6 13b58: 92 01 movw r18, r4 13b5a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 13b5e: 18 16 cp r1, r24 13b60: 24 f0 brlt .+8 ; 0x13b6a 13b62: 0e 94 85 5a call 0xb50a ; 0xb50a 13b66: 2b 01 movw r4, r22 13b68: 3c 01 movw r6, r24 13b6a: d5 01 movw r26, r10 13b6c: 4d 92 st X+, r4 13b6e: 5d 92 st X+, r5 13b70: 6d 92 st X+, r6 13b72: 7c 92 st X, r7 13b74: 13 97 sbiw r26, 0x03 ; 3 13b76: b4 e0 ldi r27, 0x04 ; 4 13b78: ab 0e add r10, r27 13b7a: b1 1c adc r11, r1 13b7c: e4 e0 ldi r30, 0x04 ; 4 13b7e: ce 0e add r12, r30 13b80: d1 1c adc r13, r1 13b82: f4 e0 ldi r31, 0x04 ; 4 13b84: ef 0e add r14, r31 13b86: f1 1c adc r15, r1 case 25: case 125: case 601: { //Set new pause position for all three axis XYZ for (uint8_t axis = 0; axis < E_AXIS; axis++) { 13b88: 80 16 cp r8, r16 13b8a: 91 06 cpc r9, r17 13b8c: 49 f6 brne .-110 ; 0x13b20 //Check that the positions are within hardware limits pause_position[axis] = constrain(code_value(), min_pos[axis], max_pos[axis]); } } //Set default or new pause position without pausing if (code_seen('S')) { 13b8e: 83 e5 ldi r24, 0x53 ; 83 13b90: 0e 94 f5 55 call 0xabea ; 0xabea 13b94: 88 23 and r24, r24 13b96: 11 f4 brne .+4 ; 0x13b9c 13b98: 0c 94 f8 b4 jmp 0x169f0 ; 0x169f0 if ( code_value_uint8() == 0 ) { 13b9c: 0e 94 0a 56 call 0xac14 ; 0xac14 13ba0: 81 11 cpse r24, r1 13ba2: 35 c6 rjmp .+3178 ; 0x1480e pause_position[X_AXIS] = X_PAUSE_POS; 13ba4: 80 e0 ldi r24, 0x00 ; 0 13ba6: 90 e0 ldi r25, 0x00 ; 0 13ba8: a8 e4 ldi r26, 0x48 ; 72 13baa: b2 e4 ldi r27, 0x42 ; 66 13bac: 80 93 42 02 sts 0x0242, r24 ; 0x800242 <_ZL14pause_position.lto_priv.491> 13bb0: 90 93 43 02 sts 0x0243, r25 ; 0x800243 <_ZL14pause_position.lto_priv.491+0x1> 13bb4: a0 93 44 02 sts 0x0244, r26 ; 0x800244 <_ZL14pause_position.lto_priv.491+0x2> 13bb8: b0 93 45 02 sts 0x0245, r27 ; 0x800245 <_ZL14pause_position.lto_priv.491+0x3> pause_position[Y_AXIS] = Y_PAUSE_POS; 13bbc: 80 e0 ldi r24, 0x00 ; 0 13bbe: 90 e0 ldi r25, 0x00 ; 0 13bc0: ae e3 ldi r26, 0x3E ; 62 13bc2: b3 e4 ldi r27, 0x43 ; 67 13bc4: 80 93 46 02 sts 0x0246, r24 ; 0x800246 <_ZL14pause_position.lto_priv.491+0x4> 13bc8: 90 93 47 02 sts 0x0247, r25 ; 0x800247 <_ZL14pause_position.lto_priv.491+0x5> 13bcc: a0 93 48 02 sts 0x0248, r26 ; 0x800248 <_ZL14pause_position.lto_priv.491+0x6> 13bd0: b0 93 49 02 sts 0x0249, r27 ; 0x800249 <_ZL14pause_position.lto_priv.491+0x7> pause_position[Z_AXIS] = Z_PAUSE_LIFT; 13bd4: 80 e0 ldi r24, 0x00 ; 0 13bd6: 90 e0 ldi r25, 0x00 ; 0 13bd8: a0 ea ldi r26, 0xA0 ; 160 13bda: b1 e4 ldi r27, 0x41 ; 65 13bdc: 80 93 4a 02 sts 0x024A, r24 ; 0x80024a <_ZL14pause_position.lto_priv.491+0x8> 13be0: 90 93 4b 02 sts 0x024B, r25 ; 0x80024b <_ZL14pause_position.lto_priv.491+0x9> 13be4: a0 93 4c 02 sts 0x024C, r26 ; 0x80024c <_ZL14pause_position.lto_priv.491+0xa> 13be8: b0 93 4d 02 sts 0x024D, r27 ; 0x80024d <_ZL14pause_position.lto_priv.491+0xb> 13bec: 10 c6 rjmp .+3104 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13bee: 8c 32 cpi r24, 0x2C ; 44 13bf0: 91 05 cpc r25, r1 13bf2: 11 f4 brne .+4 ; 0x13bf8 13bf4: 0c 94 ff a5 jmp 0x14bfe ; 0x14bfe 13bf8: 0c f0 brlt .+2 ; 0x13bfc 13bfa: 8f c0 rjmp .+286 ; 0x13d1a 13bfc: 8f 31 cpi r24, 0x1F ; 31 13bfe: 91 05 cpc r25, r1 13c00: 09 f4 brne .+2 ; 0x13c04 13c02: d3 c7 rjmp .+4006 ; 0x14baa 13c04: 0c f0 brlt .+2 ; 0x13c08 13c06: 52 c0 rjmp .+164 ; 0x13cac 13c08: 8d 31 cpi r24, 0x1D ; 29 13c0a: 91 05 cpc r25, r1 13c0c: 09 f4 brne .+2 ; 0x13c10 13c0e: ff c5 rjmp .+3070 ; 0x1480e 13c10: 4e 97 sbiw r24, 0x1e ; 30 13c12: 09 f0 breq .+2 ; 0x13c16 13c14: 06 cf rjmp .-500 ; 0x13a22 M30 [filename] */ case 30: if (card.mounted){ 13c16: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 13c1a: 88 23 and r24, r24 13c1c: 09 f4 brne .+2 ; 0x13c20 13c1e: f7 c5 rjmp .+3054 ; 0x1480e card.closefile(); 13c20: 0f 94 f9 65 call 0x2cbf2 ; 0x2cbf2 card.removeFile(strchr_pointer + 4); 13c24: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb 13c28: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc 13c2c: 0c 5f subi r16, 0xFC ; 252 13c2e: 1f 4f sbci r17, 0xFF ; 255 } } void CardReader::removeFile(const char* name) { if(!mounted) return; 13c30: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 13c34: 88 23 and r24, r24 13c36: 09 f4 brne .+2 ; 0x13c3a 13c38: ea c5 rjmp .+3028 ; 0x1480e file.close(); 13c3a: 87 e6 ldi r24, 0x67 ; 103 13c3c: 96 e1 ldi r25, 0x16 ; 22 13c3e: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 sdprinting = false; 13c42: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 const char *fname=name; 13c46: 1d a3 std Y+37, r17 ; 0x25 13c48: 0c a3 std Y+36, r16 ; 0x24 if (!diveSubfolder(fname)) 13c4a: ce 01 movw r24, r28 13c4c: 84 96 adiw r24, 0x24 ; 36 13c4e: 0f 94 6e 71 call 0x2e2dc ; 0x2e2dc 13c52: 88 23 and r24, r24 13c54: 09 f4 brne .+2 ; 0x13c58 13c56: db c5 rjmp .+2998 ; 0x1480e return; if (file.remove(curDir, fname)) 13c58: 4c a1 ldd r20, Y+36 ; 0x24 13c5a: 5d a1 ldd r21, Y+37 ; 0x25 13c5c: 60 91 80 14 lds r22, 0x1480 ; 0x801480 13c60: 70 91 81 14 lds r23, 0x1481 ; 0x801481 * \brief Base class for SdFile with Print and C++ streams. */ class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} 13c64: 19 82 std Y+1, r1 ; 0x01 13c66: 1c 82 std Y+4, r1 ; 0x04 * \a dirFile is not a directory, \a path is not found * or an I/O error occurred. */ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { SdBaseFile file; if (!file.open(dirFile, path, O_WRITE)) goto fail; 13c68: 22 e0 ldi r18, 0x02 ; 2 13c6a: ce 01 movw r24, r28 13c6c: 01 96 adiw r24, 0x01 ; 1 13c6e: 0f 94 c5 54 call 0x2a98a ; 0x2a98a 13c72: 81 11 cpse r24, r1 13c74: fb c6 rjmp .+3574 ; 0x14a6c return file.remove(); fail: // can't set iostate - static function return false; 13c76: 10 e0 ldi r17, 0x00 ; 0 * Reasons for failure include the file is a directory, is read only, * \a dirFile is not a directory, \a path is not found * or an I/O error occurred. */ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { SdBaseFile file; 13c78: ce 01 movw r24, r28 13c7a: 01 96 adiw r24, 0x01 ; 1 13c7c: 0e 94 ab 79 call 0xf356 ; 0xf356 13c80: 11 23 and r17, r17 13c82: 09 f4 brne .+2 ; 0x13c86 13c84: 0a c7 rjmp .+3604 ; 0x14a9a { SERIAL_PROTOCOLPGM("File deleted:"); 13c86: 8c e1 ldi r24, 0x1C ; 28 13c88: 9e e7 ldi r25, 0x7E ; 126 13c8a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(fname); 13c8e: 8c a1 ldd r24, Y+36 ; 0x24 13c90: 9d a1 ldd r25, Y+37 ; 0x25 13c92: 0e 94 a1 87 call 0x10f42 ; 0x10f42 sdpos = 0; 13c96: 10 92 eb 16 sts 0x16EB, r1 ; 0x8016eb 13c9a: 10 92 ec 16 sts 0x16EC, r1 ; 0x8016ec 13c9e: 10 92 ed 16 sts 0x16ED, r1 ; 0x8016ed 13ca2: 10 92 ee 16 sts 0x16EE, r1 ; 0x8016ee #ifdef SDCARD_SORT_ALPHA presort(); 13ca6: 0f 94 32 6f call 0x2de64 ; 0x2de64 13caa: b1 c5 rjmp .+2914 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13cac: 80 32 cpi r24, 0x20 ; 32 13cae: 91 05 cpc r25, r1 13cb0: 09 f4 brne .+2 ; 0x13cb4 13cb2: 01 c7 rjmp .+3586 ; 0x14ab6 13cb4: 8a 97 sbiw r24, 0x2a ; 42 13cb6: 09 f0 breq .+2 ; 0x13cba 13cb8: b4 ce rjmp .-664 ; 0x13a22 #### Parameters - `P` - Pin number. - `S` - Pin value. If the pin is analog, values are from 0 to 255. If the pin is digital, values are from 0 to 1. */ case 42: if (code_seen('S')) 13cba: 83 e5 ldi r24, 0x53 ; 83 13cbc: 0e 94 f5 55 call 0xabea ; 0xabea 13cc0: 88 23 and r24, r24 13cc2: 09 f4 brne .+2 ; 0x13cc6 13cc4: a4 c5 rjmp .+2888 ; 0x1480e { uint8_t pin_status = code_value_uint8(); 13cc6: 0e 94 0a 56 call 0xac14 ; 0xac14 13cca: 08 2f mov r16, r24 int8_t pin_number = LED_PIN; if (code_seen('P')) 13ccc: 80 e5 ldi r24, 0x50 ; 80 13cce: 0e 94 f5 55 call 0xabea ; 0xabea */ case 42: if (code_seen('S')) { uint8_t pin_status = code_value_uint8(); int8_t pin_number = LED_PIN; 13cd2: 1d e0 ldi r17, 0x0D ; 13 if (code_seen('P')) 13cd4: 88 23 and r24, r24 13cd6: 19 f0 breq .+6 ; 0x13cde pin_number = code_value_uint8(); 13cd8: 0e 94 0a 56 call 0xac14 ; 0xac14 13cdc: 18 2f mov r17, r24 13cde: ea e6 ldi r30, 0x6A ; 106 13ce0: f0 e8 ldi r31, 0x80 ; 128 for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++) { if ((int8_t)pgm_read_byte(&sensitive_pins[i]) == pin_number) 13ce2: 84 91 lpm r24, Z 13ce4: 81 17 cp r24, r17 13ce6: 09 f4 brne .+2 ; 0x13cea 13ce8: 92 c5 rjmp .+2852 ; 0x1480e 13cea: 31 96 adiw r30, 0x01 ; 1 { uint8_t pin_status = code_value_uint8(); int8_t pin_number = LED_PIN; if (code_seen('P')) pin_number = code_value_uint8(); for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++) 13cec: 30 e8 ldi r19, 0x80 ; 128 13cee: e6 38 cpi r30, 0x86 ; 134 13cf0: f3 07 cpc r31, r19 13cf2: b9 f7 brne .-18 ; 0x13ce2 pin_number = -1; break; } } #if defined(FAN_PIN) && FAN_PIN > -1 if (pin_number == FAN_PIN) 13cf4: 16 30 cpi r17, 0x06 ; 6 13cf6: 09 f0 breq .+2 ; 0x13cfa 13cf8: 7f c7 rjmp .+3838 ; 0x14bf8 fanSpeed = pin_status; 13cfa: 00 93 55 12 sts 0x1255, r16 ; 0x801255 #endif if (pin_number > -1) { pinMode(pin_number, OUTPUT); 13cfe: 61 e0 ldi r22, 0x01 ; 1 13d00: 81 2f mov r24, r17 13d02: 0e 94 3d d3 call 0x1a67a ; 0x1a67a digitalWrite(pin_number, pin_status); 13d06: 60 2f mov r22, r16 13d08: 81 2f mov r24, r17 13d0a: 0e 94 0f d3 call 0x1a61e ; 0x1a61e analogWrite(pin_number, pin_status); 13d0e: 60 2f mov r22, r16 13d10: 70 e0 ldi r23, 0x00 ; 0 13d12: 81 2f mov r24, r17 13d14: 0e 94 6e d3 call 0x1a6dc ; 0x1a6dc 13d18: 7a c5 rjmp .+2804 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13d1a: 8f 32 cpi r24, 0x2F ; 47 13d1c: 91 05 cpc r25, r1 13d1e: 09 f4 brne .+2 ; 0x13d22 13d20: 97 c7 rjmp .+3886 ; 0x14c50 13d22: 5c f5 brge .+86 ; 0x13d7a 13d24: 8d 32 cpi r24, 0x2D ; 45 13d26: 91 05 cpc r25, r1 13d28: 09 f4 brne .+2 ; 0x13d2c 13d2a: 82 c7 rjmp .+3844 ; 0x14c30 13d2c: 8e 97 sbiw r24, 0x2e ; 46 13d2e: 09 f0 breq .+2 ; 0x13d32 13d30: 78 ce rjmp .-784 ; 0x13a22 ### M46 - Show the assigned IP address M46: Show the assigned IP address. */ case 46: { // M46: Prusa3D: Show the assigned IP address. if (card.ToshibaFlashAir_isEnabled()) { 13d32: 80 91 48 16 lds r24, 0x1648 ; 0x801648 13d36: 88 23 and r24, r24 13d38: 09 f4 brne .+2 ; 0x13d3c 13d3a: 85 c7 rjmp .+3850 ; 0x14c46 uint8_t ip[4]; if (card.ToshibaFlashAir_GetIP(ip)) { 13d3c: ce 01 movw r24, r28 13d3e: 01 96 adiw r24, 0x01 ; 1 13d40: 0f 94 77 78 call 0x2f0ee ; 0x2f0ee 13d44: 88 23 and r24, r24 13d46: 09 f4 brne .+2 ; 0x13d4a 13d48: 79 c7 rjmp .+3826 ; 0x14c3c } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 13d4a: 89 81 ldd r24, Y+1 ; 0x01 13d4c: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 13d50: 8e e2 ldi r24, 0x2E ; 46 13d52: 0e 94 b1 79 call 0xf362 ; 0xf362 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 13d56: 8a 81 ldd r24, Y+2 ; 0x02 13d58: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 13d5c: 8e e2 ldi r24, 0x2E ; 46 13d5e: 0e 94 b1 79 call 0xf362 ; 0xf362 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 13d62: 8b 81 ldd r24, Y+3 ; 0x03 13d64: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 13d68: 8e e2 ldi r24, 0x2E ; 46 13d6a: 0e 94 b1 79 call 0xf362 ; 0xf362 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 13d6e: 8c 81 ldd r24, Y+4 ; 0x04 13d70: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::println(unsigned char b, int base) { print(b, base); println(); 13d74: 0e 94 bc 7a call 0xf578 ; 0xf578 13d78: 4a c5 rjmp .+2708 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13d7a: 89 34 cpi r24, 0x49 ; 73 13d7c: 91 05 cpc r25, r1 13d7e: 09 f4 brne .+2 ; 0x13d82 13d80: 90 c7 rjmp .+3872 ; 0x14ca2 13d82: 8b 34 cpi r24, 0x4B ; 75 13d84: 91 05 cpc r25, r1 13d86: 11 f4 brne .+4 ; 0x13d8c 13d88: 0c 94 f1 a6 jmp 0x14de2 ; 0x14de2 13d8c: 88 34 cpi r24, 0x48 ; 72 13d8e: 91 05 cpc r25, r1 13d90: 09 f0 breq .+2 ; 0x13d94 13d92: 47 ce rjmp .-882 ; 0x13a22 #### Parameters - `Snnn` - Set printer state 0 = not_ready, 1 = ready */ case 72: { if(code_seen('S')){ 13d94: 83 e5 ldi r24, 0x53 ; 83 13d96: 0e 94 f5 55 call 0xabea ; 0xabea 13d9a: 88 23 and r24, r24 13d9c: 09 f4 brne .+2 ; 0x13da0 13d9e: 72 c7 rjmp .+3812 ; 0x14c84 switch (code_value_uint8()){ 13da0: 0e 94 0a 56 call 0xac14 ; 0xac14 13da4: 88 23 and r24, r24 13da6: 09 f4 brne .+2 ; 0x13daa 13da8: 6a c7 rjmp .+3796 ; 0x14c7e 13daa: 81 30 cpi r24, 0x01 ; 1 13dac: 09 f0 breq .+2 ; 0x13db0 13dae: 2f c5 rjmp .+2654 ; 0x1480e 13db0: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 13db4: 2c c5 rjmp .+2648 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13db6: 8b 36 cpi r24, 0x6B ; 107 13db8: 91 05 cpc r25, r1 13dba: 11 f4 brne .+4 ; 0x13dc0 13dbc: 0c 94 b0 a8 jmp 0x15160 ; 0x15160 13dc0: 0c f0 brlt .+2 ; 0x13dc4 13dc2: ab c0 rjmp .+342 ; 0x13f1a 13dc4: 84 35 cpi r24, 0x54 ; 84 13dc6: 91 05 cpc r25, r1 13dc8: 11 f4 brne .+4 ; 0x13dce 13dca: 0c 94 b9 a8 jmp 0x15172 ; 0x15172 13dce: 0c f0 brlt .+2 ; 0x13dd2 13dd0: 5d c0 rjmp .+186 ; 0x13e8c 13dd2: 8f 34 cpi r24, 0x4F ; 79 13dd4: 91 05 cpc r25, r1 13dd6: 11 f4 brne .+4 ; 0x13ddc 13dd8: 0c 94 3f a7 jmp 0x14e7e ; 0x14e7e 13ddc: 0c f0 brlt .+2 ; 0x13de0 13dde: 47 c0 rjmp .+142 ; 0x13e6e 13de0: 8d 34 cpi r24, 0x4D ; 77 13de2: 91 05 cpc r25, r1 13de4: 11 f4 brne .+4 ; 0x13dea 13de6: 0c 94 0a a7 jmp 0x14e14 ; 0x14e14 13dea: 8e 34 cpi r24, 0x4E ; 78 13dec: 91 05 cpc r25, r1 13dee: 09 f0 breq .+2 ; 0x13df2 13df0: 18 ce rjmp .-976 ; 0x13a22 const char *_m_fil; const char *_m_time; uint32_t _cm = 0; uint32_t _min = 0; if (printJobOngoing()) { 13df2: 0e 94 40 66 call 0xcc80 ; 0xcc80 13df6: 88 23 and r24, r24 13df8: 11 f4 brne .+4 ; 0x13dfe 13dfa: 0c 94 0f a7 jmp 0x14e1e ; 0x14e1e _m_fil = _O(MSG_FILAMENT_USED); _m_time = _O(MSG_PRINT_TIME); _cm = (uint32_t)total_filament_used / 1000; 13dfe: 60 91 17 06 lds r22, 0x0617 ; 0x800617 13e02: 70 91 18 06 lds r23, 0x0618 ; 0x800618 13e06: 80 91 19 06 lds r24, 0x0619 ; 0x800619 13e0a: 90 91 1a 06 lds r25, 0x061A ; 0x80061a 13e0e: 28 ee ldi r18, 0xE8 ; 232 13e10: 33 e0 ldi r19, 0x03 ; 3 13e12: 40 e0 ldi r20, 0x00 ; 0 13e14: 50 e0 ldi r21, 0x00 ; 0 13e16: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 13e1a: 12 2f mov r17, r18 13e1c: 03 2f mov r16, r19 13e1e: f4 2e mov r15, r20 13e20: e5 2e mov r14, r21 _min = print_job_timer.duration() / 60; 13e22: 0f 94 6d 17 call 0x22eda ; 0x22eda 13e26: 2c e3 ldi r18, 0x3C ; 60 13e28: 30 e0 ldi r19, 0x00 ; 0 13e2a: 40 e0 ldi r20, 0x00 ; 0 13e2c: 50 e0 ldi r21, 0x00 ; 0 13e2e: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 13e32: b9 01 movw r22, r18 13e34: ca 01 movw r24, r20 uint32_t _cm = 0; uint32_t _min = 0; if (printJobOngoing()) { _m_fil = _O(MSG_FILAMENT_USED); _m_time = _O(MSG_PRINT_TIME); 13e36: 41 ed ldi r20, 0xD1 ; 209 13e38: 58 e5 ldi r21, 0x58 ; 88 const char *_m_time; uint32_t _cm = 0; uint32_t _min = 0; if (printJobOngoing()) { _m_fil = _O(MSG_FILAMENT_USED); 13e3a: 21 ec ldi r18, 0xC1 ; 193 13e3c: 38 e5 ldi r19, 0x58 ; 88 _m_fil = _O(MSG_TOTAL_FILAMENT); _m_time = _O(MSG_TOTAL_PRINT_TIME); _cm = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); _min = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); } printf_P(_N("%S:%lu cm\n%S:%lu min\n"),_m_fil,_cm,_m_time,_min); 13e3e: 9f 93 push r25 13e40: 8f 93 push r24 13e42: 7f 93 push r23 13e44: 6f 93 push r22 13e46: 5f 93 push r21 13e48: 4f 93 push r20 13e4a: ef 92 push r14 13e4c: ff 92 push r15 13e4e: 0f 93 push r16 13e50: 1f 93 push r17 13e52: 3f 93 push r19 13e54: 2f 93 push r18 13e56: 81 eb ldi r24, 0xB1 ; 177 13e58: 95 e6 ldi r25, 0x65 ; 101 13e5a: 9f 93 push r25 13e5c: 8f 93 push r24 13e5e: 0f 94 a2 a2 call 0x34544 ; 0x34544 13e62: 0f b6 in r0, 0x3f ; 63 13e64: f8 94 cli 13e66: de bf out 0x3e, r29 ; 62 13e68: 0f be out 0x3f, r0 ; 63 13e6a: cd bf out 0x3d, r28 ; 61 13e6c: d0 c4 rjmp .+2464 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13e6e: 82 35 cpi r24, 0x52 ; 82 13e70: 91 05 cpc r25, r1 13e72: 11 f4 brne .+4 ; 0x13e78 13e74: 0c 94 b3 a8 jmp 0x15166 ; 0x15166 13e78: 83 35 cpi r24, 0x53 ; 83 13e7a: 91 05 cpc r25, r1 13e7c: 09 f0 breq .+2 ; 0x13e80 13e7e: d1 cd rjmp .-1118 ; 0x13a22 /*! ### M83 - Set E axis to relative mode M83: Set extruder to relative mode Makes the extruder interpret extrusion values as relative positions. */ case 83: axis_relative_modes |= E_AXIS_MASK; 13e80: 80 91 57 12 lds r24, 0x1257 ; 0x801257 13e84: 88 60 ori r24, 0x08 ; 8 13e86: 80 93 57 12 sts 0x1257, r24 ; 0x801257 13e8a: c1 c4 rjmp .+2434 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13e8c: 8c 35 cpi r24, 0x5C ; 92 13e8e: 91 05 cpc r25, r1 13e90: 11 f4 brne .+4 ; 0x13e96 13e92: 0c 94 22 a9 jmp 0x15244 ; 0x15244 13e96: 34 f5 brge .+76 ; 0x13ee4 13e98: 85 35 cpi r24, 0x55 ; 85 13e9a: 91 05 cpc r25, r1 13e9c: 11 f4 brne .+4 ; 0x13ea2 13e9e: 0c 94 09 a9 jmp 0x15212 ; 0x15212 13ea2: 86 35 cpi r24, 0x56 ; 86 13ea4: 91 05 cpc r25, r1 13ea6: 09 f0 breq .+2 ; 0x13eaa 13ea8: bc cd rjmp .-1160 ; 0x13a22 #### Parameters - `S` - specifies the time in seconds. If a value of 0 is specified, the timer is disabled. */ case 86: if (code_seen('S')) { 13eaa: 83 e5 ldi r24, 0x53 ; 83 13eac: 0e 94 f5 55 call 0xabea ; 0xabea 13eb0: 88 23 and r24, r24 13eb2: 09 f4 brne .+2 ; 0x13eb6 13eb4: ac c4 rjmp .+2392 ; 0x1480e safetytimer_inactive_time = code_value() * 1000; 13eb6: 0e 94 85 5a call 0xb50a ; 0xb50a 13eba: 20 e0 ldi r18, 0x00 ; 0 13ebc: 30 e0 ldi r19, 0x00 ; 0 13ebe: 4a e7 ldi r20, 0x7A ; 122 13ec0: 54 e4 ldi r21, 0x44 ; 68 13ec2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 13ec6: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 13eca: 60 93 33 02 sts 0x0233, r22 ; 0x800233 13ece: 70 93 34 02 sts 0x0234, r23 ; 0x800234 13ed2: 80 93 35 02 sts 0x0235, r24 ; 0x800235 13ed6: 90 93 36 02 sts 0x0236, r25 ; 0x800236 safetyTimer.start(); 13eda: 8d ea ldi r24, 0xAD ; 173 13edc: 95 e0 ldi r25, 0x05 ; 5 13ede: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> 13ee2: 95 c4 rjmp .+2346 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13ee4: 89 36 cpi r24, 0x69 ; 105 13ee6: 91 05 cpc r25, r1 13ee8: 11 f4 brne .+4 ; 0x13eee 13eea: 0c 94 92 a7 jmp 0x14f24 ; 0x14f24 13eee: 14 f0 brlt .+4 ; 0x13ef4 13ef0: 0c 94 a2 a8 jmp 0x15144 ; 0x15144 13ef4: 88 36 cpi r24, 0x68 ; 104 13ef6: 91 05 cpc r25, r1 13ef8: 09 f0 breq .+2 ; 0x13efc 13efa: 93 cd rjmp .-1242 ; 0x13a22 #### Parameters - `S` - Target temperature */ case 104: // M104 { if (code_seen('S')) 13efc: 83 e5 ldi r24, 0x53 ; 83 13efe: 0e 94 f5 55 call 0xabea ; 0xabea 13f02: 88 23 and r24, r24 13f04: 09 f4 brne .+2 ; 0x13f08 13f06: 83 c4 rjmp .+2310 ; 0x1480e { setTargetHotend(code_value()); 13f08: 0e 94 85 5a call 0xb50a ; 0xb50a return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 13f0c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 13f10: 70 93 5e 12 sts 0x125E, r23 ; 0x80125e 13f14: 60 93 5d 12 sts 0x125D, r22 ; 0x80125d 13f18: 7a c4 rjmp .+2292 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13f1a: 85 37 cpi r24, 0x75 ; 117 13f1c: 91 05 cpc r25, r1 13f1e: 11 f4 brne .+4 ; 0x13f24 13f20: 0c 94 a2 aa jmp 0x15544 ; 0x15544 13f24: bc f5 brge .+110 ; 0x13f94 13f26: 80 37 cpi r24, 0x70 ; 112 13f28: 91 05 cpc r25, r1 13f2a: 09 f4 brne .+2 ; 0x13f2e 13f2c: e8 c7 rjmp .+4048 ; 0x14efe 13f2e: d4 f4 brge .+52 ; 0x13f64 13f30: 8d 36 cpi r24, 0x6D ; 109 13f32: 91 05 cpc r25, r1 13f34: 11 f4 brne .+4 ; 0x13f3a 13f36: 0c 94 be a7 jmp 0x14f7c ; 0x14f7c 13f3a: 8e 36 cpi r24, 0x6E ; 110 13f3c: 91 05 cpc r25, r1 13f3e: 09 f0 breq .+2 ; 0x13f42 13f40: 70 cd rjmp .-1312 ; 0x13a22 #### Parameters - `N` - Line number */ case 110: if (code_seen('N')) 13f42: 8e e4 ldi r24, 0x4E ; 78 13f44: 0e 94 f5 55 call 0xabea ; 0xabea 13f48: 88 23 and r24, r24 13f4a: 09 f4 brne .+2 ; 0x13f4e 13f4c: 60 c4 rjmp .+2240 ; 0x1480e gcode_LastN = code_value_long(); 13f4e: 0e 94 5d 56 call 0xacba ; 0xacba 13f52: 60 93 3e 12 sts 0x123E, r22 ; 0x80123e 13f56: 70 93 3f 12 sts 0x123F, r23 ; 0x80123f 13f5a: 80 93 40 12 sts 0x1240, r24 ; 0x801240 13f5e: 90 93 41 12 sts 0x1241, r25 ; 0x801241 13f62: 55 c4 rjmp .+2218 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13f64: 82 37 cpi r24, 0x72 ; 114 13f66: 91 05 cpc r25, r1 13f68: 11 f4 brne .+4 ; 0x13f6e 13f6a: 0c 94 9f aa jmp 0x1553e ; 0x1553e 13f6e: 14 f4 brge .+4 ; 0x13f74 13f70: 0c 94 ac a9 jmp 0x15358 ; 0x15358 13f74: 83 37 cpi r24, 0x73 ; 115 13f76: 91 05 cpc r25, r1 13f78: 09 f0 breq .+2 ; 0x13f7c 13f7a: 53 cd rjmp .-1370 ; 0x13a22 #### Parameters - V - Report current installed firmware version - U - Firmware version provided by G-code to be compared to current one. */ case 115: // M115 if (code_seen('V')) { 13f7c: 86 e5 ldi r24, 0x56 ; 86 13f7e: 0e 94 f5 55 call 0xabea ; 0xabea 13f82: 88 23 and r24, r24 13f84: 11 f4 brne .+4 ; 0x13f8a 13f86: 0c 94 cb a9 jmp 0x15396 ; 0x15396 // Report the Prusa version number. SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P()); 13f8a: 8c ee ldi r24, 0xEC ; 236 13f8c: 98 e8 ldi r25, 0x88 ; 136 13f8e: 0e 94 bd 7c call 0xf97a ; 0xf97a 13f92: 3d c4 rjmp .+2170 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 13f94: 8b 37 cpi r24, 0x7B ; 123 13f96: 91 05 cpc r25, r1 13f98: 11 f4 brne .+4 ; 0x13f9e 13f9a: 0c 94 fa aa jmp 0x155f4 ; 0x155f4 13f9e: 0c f0 brlt .+2 ; 0x13fa2 13fa0: 48 c0 rjmp .+144 ; 0x14032 13fa2: 86 37 cpi r24, 0x76 ; 118 13fa4: 91 05 cpc r25, r1 13fa6: 11 f4 brne .+4 ; 0x13fac 13fa8: 0c 94 b2 aa jmp 0x15564 ; 0x15564 13fac: 87 37 cpi r24, 0x77 ; 119 13fae: 91 05 cpc r25, r1 13fb0: 09 f0 breq .+2 ; 0x13fb4 13fb2: 37 cd rjmp .-1426 ; 0x13a22 /*! ### M119 - Get endstop states M119: Get Endstop Status Returns the current state of the configured X, Y, Z endstops. Takes into account any 'inverted endstop' settings, so one can confirm that the machine is interpreting the endstops correctly. */ case 119: SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT 13fb4: 8e e5 ldi r24, 0x5E ; 94 13fb6: 95 e6 ldi r25, 0x65 ; 101 13fb8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(); 13fbc: 0e 94 bc 7a call 0xf578 ; 0xf578 #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN 13fc0: 86 e5 ldi r24, 0x56 ; 86 13fc2: 95 e6 ldi r25, 0x65 ; 101 13fc4: 0e 94 c4 7a call 0xf588 ; 0xf588 if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){ 13fc8: 1e 9b sbis 0x03, 6 ; 3 13fca: 02 c0 rjmp .+4 ; 0x13fd0 13fcc: 0c 94 ea aa jmp 0x155d4 ; 0x155d4 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 13fd0: 81 e5 ldi r24, 0x51 ; 81 13fd2: 95 e6 ldi r25, 0x65 ; 101 SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT SERIAL_PROTOCOLLN(); #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 13fd4: 0e 94 c4 7a call 0xf588 ; 0xf588 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 13fd8: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN 13fdc: 8f e3 ldi r24, 0x3F ; 63 13fde: 95 e6 ldi r25, 0x65 ; 101 13fe0: 0e 94 c4 7a call 0xf588 ; 0xf588 if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){ 13fe4: 1d 9b sbis 0x03, 5 ; 3 13fe6: 02 c0 rjmp .+4 ; 0x13fec 13fe8: 0c 94 ee aa jmp 0x155dc ; 0x155dc SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 13fec: 81 e5 ldi r24, 0x51 ; 81 13fee: 95 e6 ldi r25, 0x65 ; 101 SERIAL_PROTOCOLLN(); #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 13ff0: 0e 94 c4 7a call 0xf588 ; 0xf588 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 13ff4: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MIN); 13ff8: 87 e3 ldi r24, 0x37 ; 55 13ffa: 95 e6 ldi r25, 0x65 ; 101 13ffc: 0e 94 c4 7a call 0xf588 ; 0xf588 if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){ 14000: 1c 9b sbis 0x03, 4 ; 3 14002: 02 c0 rjmp .+4 ; 0x14008 14004: 0c 94 f2 aa jmp 0x155e4 ; 0x155e4 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 14008: 81 e5 ldi r24, 0x51 ; 81 1400a: 95 e6 ldi r25, 0x65 ; 101 SERIAL_PROTOCOLLN(); #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MIN); if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 1400c: 0e 94 c4 7a call 0xf588 ; 0xf588 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 14010: 0e 94 bc 7a call 0xf578 ; 0xf578 #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MAX); 14014: 8f e2 ldi r24, 0x2F ; 47 14016: 95 e6 ldi r25, 0x65 ; 101 14018: 0e 94 c4 7a call 0xf588 ; 0xf588 if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){ 1401c: 01 99 sbic 0x00, 1 ; 0 1401e: 02 c0 rjmp .+4 ; 0x14024 14020: 0c 94 f6 aa jmp 0x155ec ; 0x155ec SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 14024: 81 e5 ldi r24, 0x51 ; 81 14026: 95 e6 ldi r25, 0x65 ; 101 SERIAL_PROTOCOLLN(); #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MAX); if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 14028: 0e 94 c4 7a call 0xf588 ; 0xf588 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 1402c: 0e 94 bc 7a call 0xf578 ; 0xf578 14030: ee c3 rjmp .+2012 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14032: 8c 38 cpi r24, 0x8C ; 140 14034: 91 05 cpc r25, r1 14036: 09 f4 brne .+2 ; 0x1403a 14038: 66 c7 rjmp .+3788 ; 0x14f06 1403a: 8b 39 cpi r24, 0x9B ; 155 1403c: 91 05 cpc r25, r1 1403e: 09 f4 brne .+2 ; 0x14042 14040: 7d c7 rjmp .+3834 ; 0x14f3c 14042: 8d 37 cpi r24, 0x7D ; 125 14044: 91 05 cpc r25, r1 14046: 09 f0 breq .+2 ; 0x1404a 14048: ec cc rjmp .-1576 ; 0x13a22 1404a: 58 cd rjmp .-1360 ; 0x13afc 1404c: 84 3a cpi r24, 0xA4 ; 164 1404e: 41 e0 ldi r20, 0x01 ; 1 14050: 94 07 cpc r25, r20 14052: 11 f4 brne .+4 ; 0x14058 14054: 0c 94 1d ae jmp 0x15c3a ; 0x15c3a 14058: 0c f0 brlt .+2 ; 0x1405c 1405a: 44 c2 rjmp .+1160 ; 0x144e4 1405c: 82 3e cpi r24, 0xE2 ; 226 1405e: 91 05 cpc r25, r1 14060: 11 f4 brne .+4 ; 0x14066 14062: 0c 94 a7 ac jmp 0x1594e ; 0x1594e 14066: 0c f0 brlt .+2 ; 0x1406a 14068: 6b c1 rjmp .+726 ; 0x14340 1406a: 8e 3c cpi r24, 0xCE ; 206 1406c: 91 05 cpc r25, r1 1406e: 11 f4 brne .+4 ; 0x14074 14070: 0c 94 b6 ab jmp 0x1576c ; 0x1576c 14074: 0c f0 brlt .+2 ; 0x14078 14076: b1 c0 rjmp .+354 ; 0x141da 14078: 8b 3c cpi r24, 0xCB ; 203 1407a: 91 05 cpc r25, r1 1407c: 11 f4 brne .+4 ; 0x14082 1407e: 0c 94 40 ab jmp 0x15680 ; 0x15680 14082: 5c f5 brge .+86 ; 0x140da 14084: 88 3c cpi r24, 0xC8 ; 200 14086: 91 05 cpc r25, r1 14088: 11 f4 brne .+4 ; 0x1408e 1408a: 0c 94 fd aa jmp 0x155fa ; 0x155fa 1408e: 89 3c cpi r24, 0xC9 ; 201 14090: 91 05 cpc r25, r1 14092: 09 f0 breq .+2 ; 0x14096 14094: c6 cc rjmp .-1652 ; 0x13a22 14096: 04 ec ldi r16, 0xC4 ; 196 14098: 12 e0 ldi r17, 0x02 ; 2 1409a: b7 e6 ldi r27, 0x67 ; 103 1409c: eb 2e mov r14, r27 1409e: bd e0 ldi r27, 0x0D ; 13 140a0: fb 2e mov r15, r27 140a2: 88 ec ldi r24, 0xC8 ; 200 140a4: c8 2e mov r12, r24 140a6: 82 e0 ldi r24, 0x02 ; 2 140a8: d8 2e mov r13, r24 - `E` - Acceleration for the active or specified extruder in units/s^2 */ case 201: for (int8_t i = 0; i < NUM_AXIS; i++) { if (code_seen(axis_codes[i])) 140aa: d8 01 movw r26, r16 140ac: 8d 91 ld r24, X+ 140ae: 8d 01 movw r16, r26 140b0: 0e 94 f5 55 call 0xabea ; 0xabea 140b4: 88 23 and r24, r24 140b6: 49 f0 breq .+18 ; 0x140ca { unsigned long val = code_value(); 140b8: 0e 94 85 5a call 0xb50a ; 0xb50a 140bc: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 140c0: f7 01 movw r30, r14 140c2: 64 a3 std Z+36, r22 ; 0x24 140c4: 75 a3 std Z+37, r23 ; 0x25 140c6: 86 a3 std Z+38, r24 ; 0x26 140c8: 97 a3 std Z+39, r25 ; 0x27 140ca: f4 e0 ldi r31, 0x04 ; 4 140cc: ef 0e add r14, r31 140ce: f1 1c adc r15, r1 - `Y` - Acceleration for Y axis in units/s^2 - `Z` - Acceleration for Z axis in units/s^2 - `E` - Acceleration for the active or specified extruder in units/s^2 */ case 201: for (int8_t i = 0; i < NUM_AXIS; i++) 140d0: c0 16 cp r12, r16 140d2: d1 06 cpc r13, r17 140d4: 51 f7 brne .-44 ; 0x140aa 140d6: 0c 94 a1 a9 jmp 0x15342 ; 0x15342 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 140da: 8c 3c cpi r24, 0xCC ; 204 140dc: 91 05 cpc r25, r1 140de: 11 f4 brne .+4 ; 0x140e4 140e0: 0c 94 5f ab jmp 0x156be ; 0x156be 140e4: 8d 3c cpi r24, 0xCD ; 205 140e6: 91 05 cpc r25, r1 140e8: 09 f0 breq .+2 ; 0x140ec 140ea: 9b cc rjmp .-1738 ; 0x13a22 - `Z` - Maximum Z jerk (units/s) - `E` - Maximum E jerk (units/s) */ case 205: { if(code_seen('S')) cs.minimumfeedrate = code_value(); 140ec: 83 e5 ldi r24, 0x53 ; 83 140ee: 0e 94 f5 55 call 0xabea ; 0xabea 140f2: 88 23 and r24, r24 140f4: 51 f0 breq .+20 ; 0x1410a 140f6: 0e 94 85 5a call 0xb50a ; 0xb50a 140fa: 60 93 a3 0d sts 0x0DA3, r22 ; 0x800da3 140fe: 70 93 a4 0d sts 0x0DA4, r23 ; 0x800da4 14102: 80 93 a5 0d sts 0x0DA5, r24 ; 0x800da5 14106: 90 93 a6 0d sts 0x0DA6, r25 ; 0x800da6 if(code_seen('T')) cs.mintravelfeedrate = code_value(); 1410a: 84 e5 ldi r24, 0x54 ; 84 1410c: 0e 94 f5 55 call 0xabea ; 0xabea 14110: 88 23 and r24, r24 14112: 51 f0 breq .+20 ; 0x14128 14114: 0e 94 85 5a call 0xb50a ; 0xb50a 14118: 60 93 a7 0d sts 0x0DA7, r22 ; 0x800da7 1411c: 70 93 a8 0d sts 0x0DA8, r23 ; 0x800da8 14120: 80 93 a9 0d sts 0x0DA9, r24 ; 0x800da9 14124: 90 93 aa 0d sts 0x0DAA, r25 ; 0x800daa if(code_seen('B')) cs.min_segment_time_us = (uint32_t)code_value(); 14128: 82 e4 ldi r24, 0x42 ; 66 1412a: 0e 94 f5 55 call 0xabea ; 0xabea 1412e: 88 23 and r24, r24 14130: 61 f0 breq .+24 ; 0x1414a 14132: 0e 94 85 5a call 0xb50a ; 0xb50a 14136: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1413a: 60 93 ab 0d sts 0x0DAB, r22 ; 0x800dab 1413e: 70 93 ac 0d sts 0x0DAC, r23 ; 0x800dac 14142: 80 93 ad 0d sts 0x0DAD, r24 ; 0x800dad 14146: 90 93 ae 0d sts 0x0DAE, r25 ; 0x800dae if(code_seen('X')) cs.max_jerk[X_AXIS] = cs.max_jerk[Y_AXIS] = code_value(); 1414a: 88 e5 ldi r24, 0x58 ; 88 1414c: 0e 94 f5 55 call 0xabea ; 0xabea 14150: 88 23 and r24, r24 14152: 91 f0 breq .+36 ; 0x14178 14154: 0e 94 85 5a call 0xb50a ; 0xb50a 14158: 60 93 b3 0d sts 0x0DB3, r22 ; 0x800db3 1415c: 70 93 b4 0d sts 0x0DB4, r23 ; 0x800db4 14160: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 14164: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 14168: 60 93 af 0d sts 0x0DAF, r22 ; 0x800daf 1416c: 70 93 b0 0d sts 0x0DB0, r23 ; 0x800db0 14170: 80 93 b1 0d sts 0x0DB1, r24 ; 0x800db1 14174: 90 93 b2 0d sts 0x0DB2, r25 ; 0x800db2 if(code_seen('Y')) cs.max_jerk[Y_AXIS] = code_value(); 14178: 89 e5 ldi r24, 0x59 ; 89 1417a: 0e 94 f5 55 call 0xabea ; 0xabea 1417e: 88 23 and r24, r24 14180: 51 f0 breq .+20 ; 0x14196 14182: 0e 94 85 5a call 0xb50a ; 0xb50a 14186: 60 93 b3 0d sts 0x0DB3, r22 ; 0x800db3 1418a: 70 93 b4 0d sts 0x0DB4, r23 ; 0x800db4 1418e: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 14192: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 if(code_seen('Z')) cs.max_jerk[Z_AXIS] = code_value(); 14196: 8a e5 ldi r24, 0x5A ; 90 14198: 0e 94 f5 55 call 0xabea ; 0xabea 1419c: 88 23 and r24, r24 1419e: 51 f0 breq .+20 ; 0x141b4 141a0: 0e 94 85 5a call 0xb50a ; 0xb50a 141a4: 60 93 b7 0d sts 0x0DB7, r22 ; 0x800db7 141a8: 70 93 b8 0d sts 0x0DB8, r23 ; 0x800db8 141ac: 80 93 b9 0d sts 0x0DB9, r24 ; 0x800db9 141b0: 90 93 ba 0d sts 0x0DBA, r25 ; 0x800dba if(code_seen('E')) 141b4: 85 e4 ldi r24, 0x45 ; 69 141b6: 0e 94 f5 55 call 0xabea ; 0xabea 141ba: 88 23 and r24, r24 141bc: 09 f4 brne .+2 ; 0x141c0 141be: 27 c3 rjmp .+1614 ; 0x1480e { float e = code_value(); 141c0: 0e 94 85 5a call 0xb50a ; 0xb50a #ifndef LA_NOCOMPAT e = la10c_jerk(e); 141c4: 0e 94 9f 85 call 0x10b3e ; 0x10b3e #endif cs.max_jerk[E_AXIS] = e; 141c8: 60 93 bb 0d sts 0x0DBB, r22 ; 0x800dbb 141cc: 70 93 bc 0d sts 0x0DBC, r23 ; 0x800dbc 141d0: 80 93 bd 0d sts 0x0DBD, r24 ; 0x800dbd 141d4: 90 93 be 0d sts 0x0DBE, r25 ; 0x800dbe 141d8: 1a c3 rjmp .+1588 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 141da: 81 3d cpi r24, 0xD1 ; 209 141dc: 91 05 cpc r25, r1 141de: 11 f4 brne .+4 ; 0x141e4 141e0: 0c 94 04 ac jmp 0x15808 ; 0x15808 141e4: 5c f5 brge .+86 ; 0x1423c 141e6: 8f 3c cpi r24, 0xCF ; 207 141e8: 91 05 cpc r25, r1 141ea: 11 f4 brne .+4 ; 0x141f0 141ec: 0c 94 d2 ab jmp 0x157a4 ; 0x157a4 141f0: 80 3d cpi r24, 0xD0 ; 208 141f2: 91 05 cpc r25, r1 141f4: 09 f0 breq .+2 ; 0x141f8 141f6: 15 cc rjmp .-2006 ; 0x13a22 - `S` - positive length surplus to the M207 Snnn, in mm - `F` - feedrate, in mm/sec */ case 208: // M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/min] { if(code_seen('S')) 141f8: 83 e5 ldi r24, 0x53 ; 83 141fa: 0e 94 f5 55 call 0xabea ; 0xabea 141fe: 88 23 and r24, r24 14200: 51 f0 breq .+20 ; 0x14216 { cs.retract_recover_length = code_value() ; 14202: 0e 94 85 5a call 0xb50a ; 0xb50a 14206: 60 93 f6 0d sts 0x0DF6, r22 ; 0x800df6 1420a: 70 93 f7 0d sts 0x0DF7, r23 ; 0x800df7 1420e: 80 93 f8 0d sts 0x0DF8, r24 ; 0x800df8 14212: 90 93 f9 0d sts 0x0DF9, r25 ; 0x800df9 } if(code_seen('F')) 14216: 86 e4 ldi r24, 0x46 ; 70 14218: 0e 94 f5 55 call 0xabea ; 0xabea 1421c: 88 23 and r24, r24 1421e: 09 f4 brne .+2 ; 0x14222 14220: f6 c2 rjmp .+1516 ; 0x1480e { cs.retract_recover_feedrate = get_feedrate_mm_s(code_value()); 14222: 0e 94 85 5a call 0xb50a ; 0xb50a 14226: 0e 94 45 65 call 0xca8a ; 0xca8a 1422a: 60 93 fa 0d sts 0x0DFA, r22 ; 0x800dfa 1422e: 70 93 fb 0d sts 0x0DFB, r23 ; 0x800dfb 14232: 80 93 fc 0d sts 0x0DFC, r24 ; 0x800dfc 14236: 90 93 fd 0d sts 0x0DFD, r25 ; 0x800dfd 1423a: e9 c2 rjmp .+1490 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 1423c: 8c 3d cpi r24, 0xDC ; 220 1423e: 91 05 cpc r25, r1 14240: 11 f4 brne .+4 ; 0x14246 14242: 0c 94 47 ac jmp 0x1588e ; 0x1588e 14246: 8d 3d cpi r24, 0xDD ; 221 14248: 91 05 cpc r25, r1 1424a: 11 f4 brne .+4 ; 0x14250 1424c: 0c 94 86 ac jmp 0x1590c ; 0x1590c 14250: 86 3d cpi r24, 0xD6 ; 214 14252: 91 05 cpc r25, r1 14254: 09 f0 breq .+2 ; 0x14258 14256: e5 cb rjmp .-2102 ; 0x13a22 greater than or less than the minimum and maximum segment length. Set to 0 to disable. */ case 214: { // Extract all possible parameters if they appear float p = code_seen('P') ? code_value() : cs.mm_per_arc_segment; 14258: 80 e5 ldi r24, 0x50 ; 80 1425a: 0e 94 f5 55 call 0xabea ; 0xabea 1425e: 88 23 and r24, r24 14260: 11 f4 brne .+4 ; 0x14266 14262: 0c 94 33 ac jmp 0x15866 ; 0x15866 14266: 0e 94 85 5a call 0xb50a ; 0xb50a 1426a: 2b 01 movw r4, r22 1426c: 3c 01 movw r6, r24 float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment; 1426e: 83 e5 ldi r24, 0x53 ; 83 14270: 0e 94 f5 55 call 0xabea ; 0xabea 14274: 88 23 and r24, r24 14276: 11 f4 brne .+4 ; 0x1427c 14278: 0c 94 3d ac jmp 0x1587a ; 0x1587a 1427c: 0e 94 85 5a call 0xb50a ; 0xb50a 14280: 4b 01 movw r8, r22 14282: 5c 01 movw r10, r24 unsigned char n = code_seen('N') ? code_value() : cs.n_arc_correction; 14284: 8e e4 ldi r24, 0x4E ; 78 14286: 0e 94 f5 55 call 0xabea ; 0xabea 1428a: d0 90 33 0e lds r13, 0x0E33 ; 0x800e33 1428e: 88 23 and r24, r24 14290: 29 f0 breq .+10 ; 0x1429c 14292: 0e 94 85 5a call 0xb50a ; 0xb50a 14296: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1429a: d6 2e mov r13, r22 unsigned short r = code_seen('R') ? code_value() : cs.min_arc_segments; 1429c: 82 e5 ldi r24, 0x52 ; 82 1429e: 0e 94 f5 55 call 0xabea ; 0xabea 142a2: e0 90 34 0e lds r14, 0x0E34 ; 0x800e34 142a6: f0 90 35 0e lds r15, 0x0E35 ; 0x800e35 142aa: 88 23 and r24, r24 142ac: 29 f0 breq .+10 ; 0x142b8 142ae: 0e 94 85 5a call 0xb50a ; 0xb50a 142b2: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 142b6: 7b 01 movw r14, r22 unsigned short f = code_seen('F') ? code_value() : cs.arc_segments_per_sec; 142b8: 86 e4 ldi r24, 0x46 ; 70 142ba: 0e 94 f5 55 call 0xabea ; 0xabea 142be: 00 91 36 0e lds r16, 0x0E36 ; 0x800e36 142c2: 10 91 37 0e lds r17, 0x0E37 ; 0x800e37 142c6: 88 23 and r24, r24 142c8: 29 f0 breq .+10 ; 0x142d4 142ca: 0e 94 85 5a call 0xb50a ; 0xb50a 142ce: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 142d2: 8b 01 movw r16, r22 // Ensure mm_per_arc_segment is greater than 0, and that min_mm_per_arc_segment is sero or greater than or equal to mm_per_arc_segment if (p <=0 || s < 0 || p < s) 142d4: 20 e0 ldi r18, 0x00 ; 0 142d6: 30 e0 ldi r19, 0x00 ; 0 142d8: a9 01 movw r20, r18 142da: c3 01 movw r24, r6 142dc: b2 01 movw r22, r4 142de: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 142e2: 18 16 cp r1, r24 142e4: 0c f0 brlt .+2 ; 0x142e8 142e6: 93 c2 rjmp .+1318 ; 0x1480e 142e8: 20 e0 ldi r18, 0x00 ; 0 142ea: 30 e0 ldi r19, 0x00 ; 0 142ec: a9 01 movw r20, r18 142ee: c5 01 movw r24, r10 142f0: b4 01 movw r22, r8 142f2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 142f6: 87 fd sbrc r24, 7 142f8: 8a c2 rjmp .+1300 ; 0x1480e 142fa: a5 01 movw r20, r10 142fc: 94 01 movw r18, r8 142fe: c3 01 movw r24, r6 14300: b2 01 movw r22, r4 14302: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 14306: 87 fd sbrc r24, 7 14308: 82 c2 rjmp .+1284 ; 0x1480e { // Should we display some error here? break; } cs.mm_per_arc_segment = p; 1430a: 40 92 2b 0e sts 0x0E2B, r4 ; 0x800e2b 1430e: 50 92 2c 0e sts 0x0E2C, r5 ; 0x800e2c 14312: 60 92 2d 0e sts 0x0E2D, r6 ; 0x800e2d 14316: 70 92 2e 0e sts 0x0E2E, r7 ; 0x800e2e cs.min_mm_per_arc_segment = s; 1431a: 80 92 2f 0e sts 0x0E2F, r8 ; 0x800e2f 1431e: 90 92 30 0e sts 0x0E30, r9 ; 0x800e30 14322: a0 92 31 0e sts 0x0E31, r10 ; 0x800e31 14326: b0 92 32 0e sts 0x0E32, r11 ; 0x800e32 cs.n_arc_correction = n; 1432a: d0 92 33 0e sts 0x0E33, r13 ; 0x800e33 cs.min_arc_segments = r; 1432e: f0 92 35 0e sts 0x0E35, r15 ; 0x800e35 14332: e0 92 34 0e sts 0x0E34, r14 ; 0x800e34 cs.arc_segments_per_sec = f; 14336: 10 93 37 0e sts 0x0E37, r17 ; 0x800e37 1433a: 00 93 36 0e sts 0x0E36, r16 ; 0x800e36 1433e: 67 c2 rjmp .+1230 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14340: 80 33 cpi r24, 0x30 ; 48 14342: a1 e0 ldi r26, 0x01 ; 1 14344: 9a 07 cpc r25, r26 14346: 11 f4 brne .+4 ; 0x1434c 14348: 0c 94 82 ad jmp 0x15b04 ; 0x15b04 1434c: 0c f0 brlt .+2 ; 0x14350 1434e: 78 c0 rjmp .+240 ; 0x14440 14350: 8d 32 cpi r24, 0x2D ; 45 14352: e1 e0 ldi r30, 0x01 ; 1 14354: 9e 07 cpc r25, r30 14356: 11 f4 brne .+4 ; 0x1435c 14358: 0c 94 09 ad jmp 0x15a12 ; 0x15a12 1435c: b4 f5 brge .+108 ; 0x143ca 1435e: 80 3f cpi r24, 0xF0 ; 240 14360: 91 05 cpc r25, r1 14362: 09 f4 brne .+2 ; 0x14366 14364: 54 c2 rjmp .+1192 ; 0x1480e 14366: 8c 32 cpi r24, 0x2C ; 44 14368: 91 40 sbci r25, 0x01 ; 1 1436a: 09 f0 breq .+2 ; 0x1436e 1436c: 5a cb rjmp .-2380 ; 0x13a22 - `S` - frequency in Hz. Not all firmware versions support this parameter - `P` - duration in milliseconds max 3500ms */ case 300: // M300 { uint16_t beepP = code_seen('P') ? min(code_value(), 3500) : 1000; 1436e: 80 e5 ldi r24, 0x50 ; 80 14370: 0e 94 f5 55 call 0xabea ; 0xabea 14374: 08 ee ldi r16, 0xE8 ; 232 14376: 13 e0 ldi r17, 0x03 ; 3 14378: 88 23 and r24, r24 1437a: 89 f0 breq .+34 ; 0x1439e 1437c: 0e 94 85 5a call 0xb50a ; 0xb50a 14380: 20 e0 ldi r18, 0x00 ; 0 14382: 30 ec ldi r19, 0xC0 ; 192 14384: 4a e5 ldi r20, 0x5A ; 90 14386: 55 e4 ldi r21, 0x45 ; 69 14388: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1438c: 0c ea ldi r16, 0xAC ; 172 1438e: 1d e0 ldi r17, 0x0D ; 13 14390: 87 ff sbrs r24, 7 14392: 05 c0 rjmp .+10 ; 0x1439e 14394: 0e 94 85 5a call 0xb50a ; 0xb50a 14398: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1439c: 8b 01 movw r16, r22 uint16_t beepS; if (!code_seen('S')) 1439e: 83 e5 ldi r24, 0x53 ; 83 143a0: 0e 94 f5 55 call 0xabea ; 0xabea 143a4: 88 23 and r24, r24 143a6: 11 f4 brne .+4 ; 0x143ac 143a8: 0c 94 01 ad jmp 0x15a02 ; 0x15a02 beepS = 0; else { beepS = code_value(); 143ac: 0e 94 85 5a call 0xb50a ; 0xb50a 143b0: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> if (!beepS) { 143b4: 61 15 cp r22, r1 143b6: 71 05 cpc r23, r1 143b8: 11 f0 breq .+4 ; 0x143be 143ba: 0c 94 03 ad jmp 0x15a06 ; 0x15a06 // handle S0 as a pause _delay(beepP); 143be: b8 01 movw r22, r16 143c0: 90 e0 ldi r25, 0x00 ; 0 143c2: 80 e0 ldi r24, 0x00 ; 0 143c4: 0f 94 bd 0d call 0x21b7a ; 0x21b7a 143c8: 22 c2 rjmp .+1092 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 143ca: 8e 32 cpi r24, 0x2E ; 46 143cc: 31 e0 ldi r19, 0x01 ; 1 143ce: 93 07 cpc r25, r19 143d0: 11 f4 brne .+4 ; 0x143d6 143d2: 0c 94 fb ad jmp 0x15bf6 ; 0x15bf6 143d6: 8f 32 cpi r24, 0x2F ; 47 143d8: 91 40 sbci r25, 0x01 ; 1 143da: 09 f0 breq .+2 ; 0x143de 143dc: 22 cb rjmp .-2492 ; 0x13a22 case 303: { float temp = 150.0; int e = 0; int c = 5; if (code_seen('E')) e = code_value_short(); 143de: 85 e4 ldi r24, 0x45 ; 69 143e0: 0e 94 f5 55 call 0xabea ; 0xabea - `C` - Cycles, default `5` */ case 303: { float temp = 150.0; int e = 0; 143e4: 10 e0 ldi r17, 0x00 ; 0 143e6: 00 e0 ldi r16, 0x00 ; 0 int c = 5; if (code_seen('E')) e = code_value_short(); 143e8: 88 23 and r24, r24 143ea: 59 f0 breq .+22 ; 0x14402 143ec: 0e 94 17 56 call 0xac2e ; 0xac2e 143f0: 8c 01 movw r16, r24 if (e < 0) temp = 70; 143f2: c1 2c mov r12, r1 143f4: d1 2c mov r13, r1 143f6: 6c e8 ldi r22, 0x8C ; 140 143f8: e6 2e mov r14, r22 143fa: 62 e4 ldi r22, 0x42 ; 66 143fc: f6 2e mov r15, r22 { float temp = 150.0; int e = 0; int c = 5; if (code_seen('E')) e = code_value_short(); if (e < 0) 143fe: 97 fd sbrc r25, 7 14400: 06 c0 rjmp .+12 ; 0x1440e - `S` - Target temperature, default `210°C` for hotend, 70 for bed - `C` - Cycles, default `5` */ case 303: { float temp = 150.0; 14402: c1 2c mov r12, r1 14404: d1 2c mov r13, r1 14406: 76 e1 ldi r23, 0x16 ; 22 14408: e7 2e mov r14, r23 1440a: 73 e4 ldi r23, 0x43 ; 67 1440c: f7 2e mov r15, r23 int e = 0; int c = 5; if (code_seen('E')) e = code_value_short(); if (e < 0) temp = 70; if (code_seen('S')) temp = code_value(); 1440e: 83 e5 ldi r24, 0x53 ; 83 14410: 0e 94 f5 55 call 0xabea ; 0xabea 14414: 88 23 and r24, r24 14416: 21 f0 breq .+8 ; 0x14420 14418: 0e 94 85 5a call 0xb50a ; 0xb50a 1441c: 6b 01 movw r12, r22 1441e: 7c 01 movw r14, r24 if (code_seen('C')) c = code_value_short(); 14420: 83 e4 ldi r24, 0x43 ; 67 14422: 0e 94 f5 55 call 0xabea ; 0xabea 14426: 88 23 and r24, r24 14428: 11 f4 brne .+4 ; 0x1442e 1442a: 0c 94 0b ae jmp 0x15c16 ; 0x15c16 1442e: 0e 94 17 56 call 0xac2e ; 0xac2e PID_autotune(temp, e, c); 14432: 9c 01 movw r18, r24 14434: a8 01 movw r20, r16 14436: c7 01 movw r24, r14 14438: b6 01 movw r22, r12 1443a: 0f 94 79 36 call 0x26cf2 ; 0x26cf2 1443e: e7 c1 rjmp .+974 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14440: 80 39 cpi r24, 0x90 ; 144 14442: 51 e0 ldi r21, 0x01 ; 1 14444: 95 07 cpc r25, r21 14446: 11 f4 brne .+4 ; 0x1444c 14448: 0c 94 0f ae jmp 0x15c1e ; 0x15c1e 1444c: 04 f5 brge .+64 ; 0x1448e 1444e: 8e 35 cpi r24, 0x5E ; 94 14450: b1 e0 ldi r27, 0x01 ; 1 14452: 9b 07 cpc r25, r27 14454: 11 f4 brne .+4 ; 0x1445a 14456: 0c 94 4e b9 jmp 0x1729c ; 0x1729c 1445a: 8f 35 cpi r24, 0x5F ; 95 1445c: 91 40 sbci r25, 0x01 ; 1 1445e: 09 f0 breq .+2 ; 0x14462 14460: e0 ca rjmp .-2624 ; 0x13a22 - `B` - new pin value */ case 351: { #if defined(X_MS1_PIN) && X_MS1_PIN > -1 if(code_seen('S')) switch((int)code_value()) 14462: 83 e5 ldi r24, 0x53 ; 83 14464: 0e 94 f5 55 call 0xabea ; 0xabea 14468: 88 23 and r24, r24 1446a: 71 f0 breq .+28 ; 0x14488 1446c: 0e 94 85 5a call 0xb50a ; 0xb50a 14470: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 14474: 61 30 cpi r22, 0x01 ; 1 14476: 71 05 cpc r23, r1 14478: 11 f4 brne .+4 ; 0x1447e 1447a: 0c 94 84 b9 jmp 0x17308 ; 0x17308 1447e: 62 30 cpi r22, 0x02 ; 2 14480: 71 05 cpc r23, r1 14482: 11 f4 brne .+4 ; 0x14488 14484: 0c 94 a6 b9 jmp 0x1734c ; 0x1734c case 2: for(int i=0;i 1448c: c0 c1 rjmp .+896 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 1448e: 85 39 cpi r24, 0x95 ; 149 14490: f1 e0 ldi r31, 0x01 ; 1 14492: 9f 07 cpc r25, r31 14494: 11 f4 brne .+4 ; 0x1449a 14496: 0c 94 13 ae jmp 0x15c26 ; 0x15c26 1449a: 86 39 cpi r24, 0x96 ; 150 1449c: 21 e0 ldi r18, 0x01 ; 1 1449e: 92 07 cpc r25, r18 144a0: 11 f4 brne .+4 ; 0x144a6 144a2: 0c 94 18 ae jmp 0x15c30 ; 0x15c30 144a6: 83 39 cpi r24, 0x93 ; 147 144a8: 91 40 sbci r25, 0x01 ; 1 144aa: 09 f0 breq .+2 ; 0x144ae 144ac: ba ca rjmp .-2700 ; 0x13a22 */ case 403: { // currently three different materials are needed (default, flex and PVA) // add storing this information for different load/unload profiles etc. in the future if (MMU2::mmu2.Enabled()) 144ae: 80 91 01 13 lds r24, 0x1301 ; 0x801301 144b2: 81 30 cpi r24, 0x01 ; 1 144b4: 09 f0 breq .+2 ; 0x144b8 144b6: ab c1 rjmp .+854 ; 0x1480e { uint8_t extruder = 255; uint8_t filament = FILAMENT_UNDEFINED; if(code_seen('E')) extruder = code_value_uint8(); 144b8: 85 e4 ldi r24, 0x45 ; 69 144ba: 0e 94 f5 55 call 0xabea ; 0xabea 144be: 81 11 cpse r24, r1 144c0: 0e 94 0a 56 call 0xac14 ; 0xac14 if(code_seen('F')) filament = code_value_uint8(); 144c4: 86 e4 ldi r24, 0x46 ; 70 144c6: 0e 94 f5 55 call 0xabea ; 0xabea 144ca: 81 11 cpse r24, r1 144cc: 0e 94 0a 56 call 0xac14 ; 0xac14 MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); SERIAL_ECHOLN((int)ex); } bool MMU2::set_filament_type(uint8_t /*slot*/, uint8_t /*type*/) { if (!WaitForMMUReady()) { 144d0: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 144d4: 88 23 and r24, r24 144d6: 09 f4 brne .+2 ; 0x144da 144d8: 9a c1 rjmp .+820 ; 0x1480e // slot = slot; // @@TODO // type = type; // @@TODO // cmd_arg = filamentType; // command(MMU_CMD_F0 + index); if (!manage_response(false, false)) { 144da: 60 e0 ldi r22, 0x00 ; 0 144dc: 80 e0 ldi r24, 0x00 ; 0 144de: 0f 94 aa 9c call 0x33954 ; 0x33954 144e2: 95 c1 rjmp .+810 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 144e4: 80 3c cpi r24, 0xC0 ; 192 144e6: 42 e0 ldi r20, 0x02 ; 2 144e8: 94 07 cpc r25, r20 144ea: 11 f4 brne .+4 ; 0x144f0 144ec: 0c 94 90 ba jmp 0x17520 ; 0x17520 144f0: 0c f0 brlt .+2 ; 0x144f4 144f2: 57 c0 rjmp .+174 ; 0x145a2 144f4: 88 32 cpi r24, 0x28 ; 40 144f6: a2 e0 ldi r26, 0x02 ; 2 144f8: 9a 07 cpc r25, r26 144fa: 11 f4 brne .+4 ; 0x14500 144fc: 0c 94 dc b0 jmp 0x161b8 ; 0x161b8 14500: 4c f5 brge .+82 ; 0x14554 14502: 86 3f cpi r24, 0xF6 ; 246 14504: e1 e0 ldi r30, 0x01 ; 1 14506: 9e 07 cpc r25, r30 14508: 11 f4 brne .+4 ; 0x1450e 1450a: 0c 94 25 ae jmp 0x15c4a ; 0x15c4a 1450e: 6c f4 brge .+26 ; 0x1452a 14510: 84 3f cpi r24, 0xF4 ; 244 14512: 21 e0 ldi r18, 0x01 ; 1 14514: 92 07 cpc r25, r18 14516: 11 f4 brne .+4 ; 0x1451c 14518: 0c 94 21 ae jmp 0x15c42 ; 0x15c42 1451c: 85 3f cpi r24, 0xF5 ; 245 1451e: 91 40 sbci r25, 0x01 ; 1 14520: 09 f0 breq .+2 ; 0x14524 14522: 7f ca rjmp .-2818 ; 0x13a22 M501 */ case 501: { Config_RetrieveSettings(); 14524: 0e 94 04 87 call 0x10e08 ; 0x10e08 14528: 72 c1 rjmp .+740 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 1452a: 87 3f cpi r24, 0xF7 ; 247 1452c: 41 e0 ldi r20, 0x01 ; 1 1452e: 94 07 cpc r25, r20 14530: 11 f4 brne .+4 ; 0x14536 14532: 0c 94 29 ae jmp 0x15c52 ; 0x15c52 14536: 8d 3f cpi r24, 0xFD ; 253 14538: 91 40 sbci r25, 0x01 ; 1 1453a: 09 f0 breq .+2 ; 0x1453e 1453c: 72 ca rjmp .-2844 ; 0x13a22 M509 */ case 509: { lang_reset(); 1453e: 0e 94 3d 74 call 0xe87a ; 0xe87a SERIAL_ECHO_START; 14542: 8e ec ldi r24, 0xCE ; 206 14544: 91 ea ldi r25, 0xA1 ; 161 14546: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLPGM("LANG SEL FORCED"); 1454a: 8e e4 ldi r24, 0x4E ; 78 1454c: 9f e7 ldi r25, 0x7F ; 127 1454e: 0e 94 c4 7a call 0xf588 ; 0xf588 14552: 5d c1 rjmp .+698 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14554: 8a 35 cpi r24, 0x5A ; 90 14556: a2 e0 ldi r26, 0x02 ; 2 14558: 9a 07 cpc r25, r26 1455a: 11 f4 brne .+4 ; 0x14560 1455c: 0c 94 07 b5 jmp 0x16a0e ; 0x16a0e 14560: 5c f4 brge .+22 ; 0x14578 14562: 88 35 cpi r24, 0x58 ; 88 14564: e2 e0 ldi r30, 0x02 ; 2 14566: 9e 07 cpc r25, r30 14568: 11 f4 brne .+4 ; 0x1456e 1456a: 0c 94 11 b1 jmp 0x16222 ; 0x16222 1456e: 89 35 cpi r24, 0x59 ; 89 14570: 92 40 sbci r25, 0x02 ; 2 14572: 09 f4 brne .+2 ; 0x14576 14574: c3 ca rjmp .-2682 ; 0x13afc 14576: 55 ca rjmp .-2902 ; 0x13a22 14578: 8d 3b cpi r24, 0xBD ; 189 1457a: 22 e0 ldi r18, 0x02 ; 2 1457c: 92 07 cpc r25, r18 1457e: 11 f4 brne .+4 ; 0x14584 14580: 0c 94 bf b9 jmp 0x1737e ; 0x1737e 14584: 8e 3b cpi r24, 0xBE ; 190 14586: 32 e0 ldi r19, 0x02 ; 2 14588: 93 07 cpc r25, r19 1458a: 11 f4 brne .+4 ; 0x14590 1458c: 0c 94 5c ba jmp 0x174b8 ; 0x174b8 14590: 8b 35 cpi r24, 0x5B ; 91 14592: 92 40 sbci r25, 0x02 ; 2 14594: 09 f0 breq .+2 ; 0x14598 14596: 45 ca rjmp .-2934 ; 0x13a22 /*! ### M603 - Stop print M603: Stop print */ case 603: { print_stop(); 14598: 60 e0 ldi r22, 0x00 ; 0 1459a: 80 e0 ldi r24, 0x00 ; 0 1459c: 0e 94 f9 de call 0x1bdf2 ; 0x1bdf2 145a0: 36 c1 rjmp .+620 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 145a2: 8c 35 cpi r24, 0x5C ; 92 145a4: 53 e0 ldi r21, 0x03 ; 3 145a6: 95 07 cpc r25, r21 145a8: 11 f4 brne .+4 ; 0x145ae 145aa: 0c 94 29 b6 jmp 0x16c52 ; 0x16c52 145ae: 0c f0 brlt .+2 ; 0x145b2 145b0: 42 c0 rjmp .+132 ; 0x14636 145b2: 83 3c cpi r24, 0xC3 ; 195 145b4: b2 e0 ldi r27, 0x02 ; 2 145b6: 9b 07 cpc r25, r27 145b8: 11 f4 brne .+4 ; 0x145be 145ba: 0c 94 9c ba jmp 0x17538 ; 0x17538 145be: 7c f4 brge .+30 ; 0x145de 145c0: 81 3c cpi r24, 0xC1 ; 193 145c2: f2 e0 ldi r31, 0x02 ; 2 145c4: 9f 07 cpc r25, r31 145c6: 11 f4 brne .+4 ; 0x145cc 145c8: 0c 94 96 ba jmp 0x1752c ; 0x1752c 145cc: 82 3c cpi r24, 0xC2 ; 194 145ce: 92 40 sbci r25, 0x02 ; 2 145d0: 09 f0 breq .+2 ; 0x145d4 145d2: 27 ca rjmp .-2994 ; 0x13a22 #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 706: { gcodes_M704_M705_M706(706); 145d4: 82 ec ldi r24, 0xC2 ; 194 145d6: 92 e0 ldi r25, 0x02 ; 2 145d8: 0e 94 4b 5a call 0xb496 ; 0xb496 145dc: 18 c1 rjmp .+560 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 145de: 85 3c cpi r24, 0xC5 ; 197 145e0: 32 e0 ldi r19, 0x02 ; 2 145e2: 93 07 cpc r25, r19 145e4: 11 f4 brne .+4 ; 0x145ea 145e6: 0c 94 e5 ba jmp 0x175ca ; 0x175ca 145ea: 14 f4 brge .+4 ; 0x145f0 145ec: 0c 94 b9 ba jmp 0x17572 ; 0x17572 145f0: 82 35 cpi r24, 0x52 ; 82 145f2: 93 40 sbci r25, 0x03 ; 3 145f4: 09 f0 breq .+2 ; 0x145f8 145f6: 15 ca rjmp .-3030 ; 0x13a22 float z_val = 0; char strLabel[8]; uint8_t iBedC = 0; uint8_t iPindaC = 0; bool bIsActive=false; strLabel[7] = '\0'; // null terminate. 145f8: 18 86 std Y+8, r1 ; 0x08 size_t max_sheets = sizeof(EEPROM_Sheets_base->s)/sizeof(EEPROM_Sheets_base->s[0]); if (code_seen('S')) { 145fa: 83 e5 ldi r24, 0x53 ; 83 145fc: 0e 94 f5 55 call 0xabea ; 0xabea 14600: 88 23 and r24, r24 14602: 11 f4 brne .+4 ; 0x14608 14604: 0c 94 0f b5 jmp 0x16a1e ; 0x16a1e iSel = code_value_uint8(); 14608: 0e 94 0a 56 call 0xac14 ; 0xac14 1460c: 18 2f mov r17, r24 if (iSel>=max_sheets) 1460e: 88 30 cpi r24, 0x08 ; 8 14610: 10 f4 brcc .+4 ; 0x14616 14612: 0c 94 14 b5 jmp 0x16a28 ; 0x16a28 { SERIAL_PROTOCOLPGM("Invalid sheet ID. Allowed: 0.."); 14616: 8a e2 ldi r24, 0x2A ; 42 14618: 9f e7 ldi r25, 0x7F ; 127 1461a: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 1461e: 4a e0 ldi r20, 0x0A ; 10 14620: 67 e0 ldi r22, 0x07 ; 7 14622: 70 e0 ldi r23, 0x00 ; 0 14624: 80 e0 ldi r24, 0x00 ; 0 14626: 90 e0 ldi r25, 0x00 ; 0 14628: 0e 94 c5 79 call 0xf38a ; 0xf38a SERIAL_PROTOCOL(max_sheets-1); SERIAL_PROTOCOLLN(""); 1462c: 8f ed ldi r24, 0xDF ; 223 1462e: 92 e0 ldi r25, 0x02 ; 2 14630: 0e 94 a1 87 call 0x10f42 ; 0x10f42 14634: ec c0 rjmp .+472 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14636: 84 38 cpi r24, 0x84 ; 132 14638: a3 e0 ldi r26, 0x03 ; 3 1463a: 9a 07 cpc r25, r26 1463c: 11 f4 brne .+4 ; 0x14642 1463e: 0c 94 9f b8 jmp 0x1713e ; 0x1713e 14642: 0c f0 brlt .+2 ; 0x14646 14644: 4d c0 rjmp .+154 ; 0x146e0 14646: 8d 35 cpi r24, 0x5D ; 93 14648: e3 e0 ldi r30, 0x03 ; 3 1464a: 9e 07 cpc r25, r30 1464c: 11 f4 brne .+4 ; 0x14652 1464e: 0c 94 b3 b6 jmp 0x16d66 ; 0x16d66 14652: 8e 35 cpi r24, 0x5E ; 94 14654: 93 40 sbci r25, 0x03 ; 3 14656: 09 f0 breq .+2 ; 0x1465a 14658: e4 c9 rjmp .-3128 ; 0x13a22 */ case 862: // M862: print checking { // Read the decimal by multiplying the float value by 10 e.g. 862.1 becomes 8621 // This method consumes less flash memory compared to checking the string length. ClPrintChecking nCommand = static_cast((uint16_t)(code_value()*10) - 8620u); 1465a: 0e 94 85 5a call 0xb50a ; 0xb50a 1465e: 20 e0 ldi r18, 0x00 ; 0 14660: 30 e0 ldi r19, 0x00 ; 0 14662: 40 e2 ldi r20, 0x20 ; 32 14664: 51 e4 ldi r21, 0x41 ; 65 14666: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1466a: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1466e: 6c 5a subi r22, 0xAC ; 172 switch(nCommand) 14670: 63 30 cpi r22, 0x03 ; 3 14672: 11 f4 brne .+4 ; 0x14678 14674: 0c 94 b9 b7 jmp 0x16f72 ; 0x16f72 14678: 10 f0 brcs .+4 ; 0x1467e 1467a: 0c 94 4b b7 jmp 0x16e96 ; 0x16e96 1467e: 61 30 cpi r22, 0x01 ; 1 14680: 11 f4 brne .+4 ; 0x14686 14682: 0c 94 74 b7 jmp 0x16ee8 ; 0x16ee8 14686: 62 30 cpi r22, 0x02 ; 2 14688: 09 f0 breq .+2 ; 0x1468c 1468a: c1 c0 rjmp .+386 ; 0x1480e ,(uint8_t)oCheckModel ); } uint16_t nPrinterType(bool bMMu) { if (bMMu) { 1468c: 80 91 01 13 lds r24, 0x1301 ; 0x801301 return pgm_read_word(&_nPrinterMmuType); 14690: ee e3 ldi r30, 0x3E ; 62 14692: f9 e7 ldi r31, 0x79 ; 121 ,(uint8_t)oCheckModel ); } uint16_t nPrinterType(bool bMMu) { if (bMMu) { 14694: 81 30 cpi r24, 0x01 ; 1 14696: 11 f0 breq .+4 ; 0x1469c return pgm_read_word(&_nPrinterMmuType); } else { return pgm_read_word(&_nPrinterType); 14698: e0 e4 ldi r30, 0x40 ; 64 1469a: f9 e7 ldi r31, 0x79 ; 121 1469c: 05 91 lpm r16, Z+ 1469e: 14 91 lpm r17, Z else if(code_seen('Q')) SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); break; case ClPrintChecking::_Model: { // ~ .2 uint16_t type = nPrinterType(MMU2::mmu2.Enabled()); if(code_seen('P')) 146a0: 80 e5 ldi r24, 0x50 ; 80 146a2: 0e 94 f5 55 call 0xabea ; 0xabea 146a6: 88 23 and r24, r24 146a8: 11 f4 brne .+4 ; 0x146ae 146aa: 0c 94 a8 b7 jmp 0x16f50 ; 0x16f50 { uint16_t nPrinterModel; nPrinterModel=(uint16_t)code_value_long(); 146ae: 0e 94 5d 56 call 0xacba ; 0xacba menu_submenu(lcd_hw_setup_menu); } } void printer_model_check(uint16_t nPrinterModel, uint16_t actualPrinterModel) { if (oCheckModel == ClCheckMode::_None) 146b2: f0 90 ea 03 lds r15, 0x03EA ; 0x8003ea 146b6: ff 20 and r15, r15 146b8: 09 f4 brne .+2 ; 0x146bc 146ba: a9 c0 rjmp .+338 ; 0x1480e return; if (nPrinterModel == actualPrinterModel) 146bc: 60 17 cp r22, r16 146be: 71 07 cpc r23, r17 146c0: 09 f4 brne .+2 ; 0x146c4 146c2: a5 c0 rjmp .+330 ; 0x1480e // SERIAL_ECHOLNPGM("Printer model differs from the G-code ..."); // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN(actualPrinterModel); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN(nPrinterModel); render_M862_warnings( 146c4: 89 e8 ldi r24, 0x89 ; 137 146c6: 97 e3 ldi r25, 0x37 ; 55 146c8: 0e 94 3a 75 call 0xea74 ; 0xea74 146cc: 8c 01 movw r16, r24 146ce: 8b e5 ldi r24, 0x5B ; 91 146d0: 97 e3 ldi r25, 0x37 ; 55 146d2: 0e 94 3a 75 call 0xea74 ; 0xea74 146d6: 4f 2d mov r20, r15 146d8: b8 01 movw r22, r16 146da: 0e 94 df ea call 0x1d5be ; 0x1d5be 146de: 97 c0 rjmp .+302 ; 0x1480e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 146e0: 8c 38 cpi r24, 0x8C ; 140 146e2: 23 e0 ldi r18, 0x03 ; 3 146e4: 92 07 cpc r25, r18 146e6: 09 f4 brne .+2 ; 0x146ea 146e8: 92 c0 rjmp .+292 ; 0x1480e 146ea: 80 3a cpi r24, 0xA0 ; 160 146ec: 33 e0 ldi r19, 0x03 ; 3 146ee: 93 07 cpc r25, r19 146f0: 09 f4 brne .+2 ; 0x146f4 146f2: 50 c2 rjmp .+1184 ; 0x14b94 146f4: 8b 38 cpi r24, 0x8B ; 139 146f6: 93 40 sbci r25, 0x03 ; 3 146f8: 09 f0 breq .+2 ; 0x146fc 146fa: 93 c9 rjmp .-3290 ; 0x13a22 for(int i=0;i 14702: 88 23 and r24, r24 14704: 39 f0 breq .+14 ; 0x14714 14706: 0e 94 85 5a call 0xb50a ; 0xb50a 1470a: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1470e: 80 e0 ldi r24, 0x00 ; 0 14710: 0f 94 5e 1a call 0x234bc ; 0x234bc #endif #ifdef MOTOR_CURRENT_PWM_Z_PIN if(code_seen('Z')) st_current_set(1, code_value()); 14714: 8a e5 ldi r24, 0x5A ; 90 14716: 0e 94 f5 55 call 0xabea ; 0xabea 1471a: 88 23 and r24, r24 1471c: 39 f0 breq .+14 ; 0x1472c 1471e: 0e 94 85 5a call 0xb50a ; 0xb50a 14722: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 14726: 81 e0 ldi r24, 0x01 ; 1 14728: 0f 94 5e 1a call 0x234bc ; 0x234bc #endif #ifdef MOTOR_CURRENT_PWM_E_PIN if(code_seen('E')) st_current_set(2, code_value()); 1472c: 85 e4 ldi r24, 0x45 ; 69 1472e: 0e 94 f5 55 call 0xabea ; 0xabea 14732: 88 23 and r24, r24 14734: 09 f4 brne .+2 ; 0x14738 14736: 6b c0 rjmp .+214 ; 0x1480e 14738: 0e 94 85 5a call 0xb50a ; 0xb50a 1473c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 14740: cb 01 movw r24, r22 14742: 0f 94 5e 19 call 0x232bc ; 0x232bc 14746: 63 c0 rjmp .+198 ; 0x1480e - `string` - Must for M1 and optional for M0 message to display on the LCD */ case 0: case 1: { const char *src = strchr_pointer + 2; 14748: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb 1474c: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc 14750: 0e 5f subi r16, 0xFE ; 254 14752: 1f 4f sbci r17, 0xFF ; 255 codenum = 0; if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait 14754: 80 e5 ldi r24, 0x50 ; 80 14756: 0e 94 f5 55 call 0xabea ; 0xabea */ case 0: case 1: { const char *src = strchr_pointer + 2; codenum = 0; 1475a: c1 2c mov r12, r1 1475c: d1 2c mov r13, r1 1475e: 76 01 movw r14, r12 if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait 14760: 88 23 and r24, r24 14762: 21 f0 breq .+8 ; 0x1476c 14764: 0e 94 5d 56 call 0xacba ; 0xacba 14768: 6b 01 movw r12, r22 1476a: 7c 01 movw r14, r24 if (code_seen('S')) codenum = code_value_long() * 1000; // seconds to wait 1476c: 83 e5 ldi r24, 0x53 ; 83 1476e: 0e 94 f5 55 call 0xabea ; 0xabea 14772: 88 23 and r24, r24 14774: 51 f0 breq .+20 ; 0x1478a 14776: 0e 94 5d 56 call 0xacba ; 0xacba 1477a: 9b 01 movw r18, r22 1477c: ac 01 movw r20, r24 1477e: a8 ee ldi r26, 0xE8 ; 232 14780: b3 e0 ldi r27, 0x03 ; 3 14782: 0f 94 75 a4 call 0x348ea ; 0x348ea <__muluhisi3> 14786: 6b 01 movw r12, r22 14788: 7c 01 movw r14, r24 1478a: c8 01 movw r24, r16 1478c: 0f 5f subi r16, 0xFF ; 255 1478e: 1f 4f sbci r17, 0xFF ; 255 bool expiration_time_set = bool(codenum); while (*src == ' ') ++src; 14790: dc 01 movw r26, r24 14792: 4c 91 ld r20, X 14794: 40 32 cpi r20, 0x20 ; 32 14796: c9 f3 breq .-14 ; 0x1478a custom_message_type = CustomMsg::M0Wait; 14798: 26 e0 ldi r18, 0x06 ; 6 1479a: 20 93 5d 06 sts 0x065D, r18 ; 0x80065d if (!expiration_time_set && *src != '\0') { 1479e: c1 14 cp r12, r1 147a0: d1 04 cpc r13, r1 147a2: e1 04 cpc r14, r1 147a4: f1 04 cpc r15, r1 147a6: c9 f5 brne .+114 ; 0x1481a 147a8: 2c 91 ld r18, X 147aa: 22 23 and r18, r18 147ac: b1 f1 breq .+108 ; 0x1481a lcd_setstatus(src); 147ae: 0e 94 e8 de call 0x1bdd0 ; 0x1bdd0 LCD_MESSAGERPGM(_T(MSG_USERWAIT)); } else { custom_message_type = CustomMsg::Status; // let the lcd display the name of the printed G-code file in farm mode } } st_synchronize(); 147b2: 0f 94 fb 1a call 0x235f6 ; 0x235f6 menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0); 147b6: 80 91 3a 12 lds r24, 0x123A ; 0x80123a 147ba: 84 60 ori r24, 0x04 ; 4 147bc: 80 93 3a 12 sts 0x123A, r24 ; 0x80123a previous_millis_cmd.start(); 147c0: 88 e4 ldi r24, 0x48 ; 72 147c2: 93 e0 ldi r25, 0x03 ; 3 147c4: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> if (expiration_time_set) { 147c8: c1 14 cp r12, r1 147ca: d1 04 cpc r13, r1 147cc: e1 04 cpc r14, r1 147ce: f1 04 cpc r15, r1 147d0: d9 f1 breq .+118 ; 0x14848 codenum += _millis(); // keep track of when we started waiting 147d2: 0f 94 f0 0d call 0x21be0 ; 0x21be0 147d6: c6 0e add r12, r22 147d8: d7 1e adc r13, r23 147da: e8 1e adc r14, r24 147dc: f9 1e adc r15, r25 KEEPALIVE_STATE(PAUSED_FOR_USER); 147de: 84 e0 ldi r24, 0x04 ; 4 147e0: 80 93 78 02 sts 0x0278, r24 ; 0x800278 while(_millis() < codenum && !lcd_clicked()) { 147e4: 0f 94 f0 0d call 0x21be0 ; 0x21be0 147e8: 6c 15 cp r22, r12 147ea: 7d 05 cpc r23, r13 147ec: 8e 05 cpc r24, r14 147ee: 9f 05 cpc r25, r15 147f0: 10 f1 brcs .+68 ; 0x14836 delay_keep_alive(0); } KEEPALIVE_STATE(IN_HANDLER); 147f2: 82 e0 ldi r24, 0x02 ; 2 147f4: 80 93 78 02 sts 0x0278, r24 ; 0x800278 } else { marlin_wait_for_click(); } menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0); 147f8: 80 91 3a 12 lds r24, 0x123A ; 0x80123a 147fc: 8b 7f andi r24, 0xFB ; 251 147fe: 80 93 3a 12 sts 0x123A, r24 ; 0x80123a if (IS_SD_PRINTING) 14802: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 14806: 88 23 and r24, r24 14808: 91 f1 breq .+100 ; 0x1486e custom_message_type = CustomMsg::Status; 1480a: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d */ default: printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE); } // printf_P(_N("END M-CODE=%u\n"), mcode_in_progress); mcode_in_progress = 0; 1480e: 10 92 41 0d sts 0x0D41, r1 ; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1> 14812: 10 92 40 0d sts 0x0D40, r1 ; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489> 14816: 0c 94 2c 90 jmp 0x12058 ; 0x12058 lcd_setstatus(src); } else { // farmers want to abuse a bug from the previous firmware releases // - they need to see the filename on the status screen instead of "Wait for user..." // So we won't update the message in farm mode... if( ! farm_mode){ 1481a: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1481e: 81 11 cpse r24, r1 14820: 07 c0 rjmp .+14 ; 0x14830 LCD_MESSAGERPGM(_T(MSG_USERWAIT)); 14822: 8e e7 ldi r24, 0x7E ; 126 14824: 99 e3 ldi r25, 0x39 ; 57 14826: 0e 94 3a 75 call 0xea74 ; 0xea74 1482a: 0e 94 94 de call 0x1bd28 ; 0x1bd28 1482e: c1 cf rjmp .-126 ; 0x147b2 } else { custom_message_type = CustomMsg::Status; // let the lcd display the name of the printed G-code file in farm mode 14830: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d 14834: be cf rjmp .-132 ; 0x147b2 menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0); previous_millis_cmd.start(); if (expiration_time_set) { codenum += _millis(); // keep track of when we started waiting KEEPALIVE_STATE(PAUSED_FOR_USER); while(_millis() < codenum && !lcd_clicked()) { 14836: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1483a: 81 11 cpse r24, r1 1483c: da cf rjmp .-76 ; 0x147f2 delay_keep_alive(0); 1483e: 90 e0 ldi r25, 0x00 ; 0 14840: 80 e0 ldi r24, 0x00 ; 0 14842: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 14846: ce cf rjmp .-100 ; 0x147e4 //! @brief Wait for click //! //! Set void marlin_wait_for_click() { int8_t busy_state_backup = busy_state; 14848: 10 91 78 02 lds r17, 0x0278 ; 0x800278 KEEPALIVE_STATE(PAUSED_FOR_USER); 1484c: 84 e0 ldi r24, 0x04 ; 4 1484e: 80 93 78 02 sts 0x0278, r24 ; 0x800278 lcd_consume_click(); 14852: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 while(!lcd_clicked()) 14856: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1485a: 81 11 cpse r24, r1 1485c: 05 c0 rjmp .+10 ; 0x14868 { delay_keep_alive(0); 1485e: 90 e0 ldi r25, 0x00 ; 0 14860: 80 e0 ldi r24, 0x00 ; 0 14862: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 14866: f7 cf rjmp .-18 ; 0x14856 } KEEPALIVE_STATE(busy_state_backup); 14868: 10 93 78 02 sts 0x0278, r17 ; 0x800278 1486c: c5 cf rjmp .-118 ; 0x147f8 } menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0); if (IS_SD_PRINTING) custom_message_type = CustomMsg::Status; else LCD_MESSAGERPGM(MSG_WELCOME); 1486e: 86 ee ldi r24, 0xE6 ; 230 14870: 9b e6 ldi r25, 0x6B ; 107 14872: 0e 94 94 de call 0x1bd28 ; 0x1bd28 14876: cb cf rjmp .-106 ; 0x1480e /*! ### M17 - Enable all axes M17: Enable/Power all stepper motors */ case 17: LCD_MESSAGERPGM(_T(MSG_NO_MOVE)); 14878: 83 e7 ldi r24, 0x73 ; 115 1487a: 99 e3 ldi r25, 0x39 ; 57 1487c: 0e 94 3a 75 call 0xea74 ; 0xea74 14880: 0e 94 94 de call 0x1bd28 ; 0x1bd28 enable_x(); 14884: 17 98 cbi 0x02, 7 ; 2 enable_y(); 14886: 16 98 cbi 0x02, 6 ; 2 enable_z(); 14888: 15 98 cbi 0x02, 5 ; 2 enable_e0(); 1488a: 14 98 cbi 0x02, 4 ; 2 1488c: c0 cf rjmp .-128 ; 0x1480e /*! ### M21 - Init SD card M21: Initialize SD card */ case 21: card.mount(); 1488e: 81 e0 ldi r24, 0x01 ; 1 14890: 0f 94 6a 73 call 0x2e6d4 ; 0x2e6d4 14894: bc cf rjmp .-136 ; 0x1480e presort_flag = true; #endif } void CardReader::release() { sdprinting = false; 14896: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 mounted = false; 1489a: 10 92 d8 13 sts 0x13D8, r1 ; 0x8013d8 SERIAL_ECHO_START; 1489e: 8e ec ldi r24, 0xCE ; 206 148a0: 91 ea ldi r25, 0xA1 ; 161 148a2: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED 148a6: 88 ea ldi r24, 0xA8 ; 168 148a8: 98 e6 ldi r25, 0x68 ; 104 148aa: 0e 94 bd 7c call 0xf97a ; 0xf97a 148ae: af cf rjmp .-162 ; 0x1480e /*! ### M24 - Start SD print M24: Start/resume SD print */ case 24: if (printingIsPaused()) 148b0: 0e 94 35 66 call 0xcc6a ; 0xcc6a 148b4: 88 23 and r24, r24 148b6: 19 f0 breq .+6 ; 0x148be lcd_resume_print(); 148b8: 0e 94 b9 de call 0x1bd72 ; 0x1bd72 148bc: a8 cf rjmp .-176 ; 0x1480e else { if (!filament_presence_check()) { 148be: 0e 94 f0 ea call 0x1d5e0 ; 0x1d5e0 148c2: 88 23 and r24, r24 148c4: 09 f4 brne .+2 ; 0x148c8 148c6: a3 cf rjmp .-186 ; 0x1480e return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; 148c8: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 148cc: 88 23 and r24, r24 148ce: 61 f0 breq .+24 ; 0x148e8 // Print was aborted break; } if (!card.get_sdpos()) 148d0: 80 91 eb 16 lds r24, 0x16EB ; 0x8016eb 148d4: 90 91 ec 16 lds r25, 0x16EC ; 0x8016ec 148d8: a0 91 ed 16 lds r26, 0x16ED ; 0x8016ed 148dc: b0 91 ee 16 lds r27, 0x16EE ; 0x8016ee 148e0: 89 2b or r24, r25 148e2: 8a 2b or r24, r26 148e4: 8b 2b or r24, r27 148e6: 69 f4 brne .+26 ; 0x14902 { // A new print has started from scratch, reset stats failstats_reset_print(); 148e8: 0e 94 68 56 call 0xacd0 ; 0xacd0 sdpos_atomic = 0; 148ec: 10 92 49 12 sts 0x1249, r1 ; 0x801249 148f0: 10 92 4a 12 sts 0x124A, r1 ; 0x80124a 148f4: 10 92 4b 12 sts 0x124B, r1 ; 0x80124b 148f8: 10 92 4c 12 sts 0x124C, r1 ; 0x80124c 148fc: 80 e0 ldi r24, 0x00 ; 0 148fe: 0e 94 04 86 call 0x10c08 ; 0x10c08 } void CardReader::startFileprint() { if(mounted) 14902: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 14906: 88 23 and r24, r24 14908: 31 f0 breq .+12 ; 0x14916 { sdprinting = true; 1490a: 81 e0 ldi r24, 0x01 ; 1 1490c: 80 93 d7 13 sts 0x13D7, r24 ; 0x8013d7 14910: 85 e0 ldi r24, 0x05 ; 5 14912: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> la10c_reset(); #endif } card.startFileprint(); print_job_timer.start(); 14916: 0f 94 25 19 call 0x2324a ; 0x2324a if (MMU2::mmu2.Enabled()) 1491a: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1491e: 81 30 cpi r24, 0x01 ; 1 14920: 09 f0 breq .+2 ; 0x14924 14922: 75 cf rjmp .-278 ; 0x1480e { if (MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) 14924: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 14928: 88 23 and r24, r24 1492a: 09 f4 brne .+2 ; 0x1492e 1492c: 70 cf rjmp .-288 ; 0x1480e 1492e: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 14932: 81 11 cpse r24, r1 14934: 6c cf rjmp .-296 ; 0x1480e { // Filament only half way into the PTFE. Unload the filament. MMU2::mmu2.unload(); 14936: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 1493a: 69 cf rjmp .-302 ; 0x1480e #### Parameters - `S` - Index in bytes */ case 26: if(card.mounted && code_seen('S')) { 1493c: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 14940: 88 23 and r24, r24 14942: 09 f4 brne .+2 ; 0x14946 14944: 64 cf rjmp .-312 ; 0x1480e 14946: 83 e5 ldi r24, 0x53 ; 83 14948: 0e 94 f5 55 call 0xabea ; 0xabea 1494c: 88 23 and r24, r24 1494e: 09 f4 brne .+2 ; 0x14952 14950: 5e cf rjmp .-324 ; 0x1480e long index = code_value_long(); 14952: 0e 94 5d 56 call 0xacba ; 0xacba 14956: 6b 01 movw r12, r22 14958: 7c 01 movw r14, r24 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; 1495a: c0 92 eb 16 sts 0x16EB, r12 ; 0x8016eb 1495e: d0 92 ec 16 sts 0x16EC, r13 ; 0x8016ec 14962: e0 92 ed 16 sts 0x16ED, r14 ; 0x8016ed 14966: f0 92 ee 16 sts 0x16EE, r15 ; 0x8016ee 1496a: 0f 94 17 68 call 0x2d02e ; 0x2d02e card.setIndex(index); // We don't disable interrupt during update of sdpos_atomic // as we expect, that SD card print is not active in this moment sdpos_atomic = index; 1496e: c0 92 49 12 sts 0x1249, r12 ; 0x801249 14972: d0 92 4a 12 sts 0x124A, r13 ; 0x80124a 14976: e0 92 4b 12 sts 0x124B, r14 ; 0x80124b 1497a: f0 92 4c 12 sts 0x124C, r15 ; 0x80124c 1497e: 47 cf rjmp .-370 ; 0x1480e #### Parameters - `P` - Show full SFN path instead of LFN only. */ case 27: card.getStatus(code_seen('P')); 14980: 80 e5 ldi r24, 0x50 ; 80 14982: 0e 94 f5 55 call 0xabea ; 0xabea 14986: 18 2f mov r17, r24 return filesize; } void CardReader::getStatus(bool arg_P) { if (printingIsPaused()) 14988: 0e 94 35 66 call 0xcc6a ; 0xcc6a 1498c: 88 23 and r24, r24 1498e: 91 f0 breq .+36 ; 0x149b4 { if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD)) 14990: 80 91 73 12 lds r24, 0x1273 ; 0x801273 14994: 88 23 and r24, r24 14996: 49 f0 breq .+18 ; 0x149aa 14998: 80 91 79 02 lds r24, 0x0279 ; 0x800279 1499c: 81 11 cpse r24, r1 1499e: 05 c0 rjmp .+10 ; 0x149aa SERIAL_PROTOCOLLNPGM("SD print paused"); 149a0: 86 e4 ldi r24, 0x46 ; 70 149a2: 9e e7 ldi r25, 0x7E ; 126 149a4: 0e 94 bd 7c call 0xf97a ; 0xf97a 149a8: 32 cf rjmp .-412 ; 0x1480e else SERIAL_PROTOCOLLNPGM("Print saved"); 149aa: 8a e3 ldi r24, 0x3A ; 58 149ac: 9e e7 ldi r25, 0x7E ; 126 149ae: 0e 94 bd 7c call 0xf97a ; 0xf97a 149b2: 2d cf rjmp .-422 ; 0x1480e } else if (sdprinting) 149b4: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 149b8: 88 23 and r24, r24 149ba: 09 f4 brne .+2 ; 0x149be 149bc: 4a c0 rjmp .+148 ; 0x14a52 { if (arg_P) 149be: 11 23 and r17, r17 149c0: e1 f1 breq .+120 ; 0x14a3a { printAbsFilenameFast(); 149c2: 0f 94 9c 6c call 0x2d938 ; 0x2d938 SERIAL_PROTOCOLLN(); 149c6: 0e 94 bc 7a call 0xf578 ; 0xf578 } else SERIAL_PROTOCOLLN(LONGEST_FILENAME); SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE 149ca: 80 ef ldi r24, 0xF0 ; 240 149cc: 94 e6 ldi r25, 0x64 ; 100 149ce: 0e 94 c4 7a call 0xf588 ; 0xf588 149d2: 60 91 eb 16 lds r22, 0x16EB ; 0x8016eb 149d6: 70 91 ec 16 lds r23, 0x16EC ; 0x8016ec 149da: 80 91 ed 16 lds r24, 0x16ED ; 0x8016ed 149de: 90 91 ee 16 lds r25, 0x16EE ; 0x8016ee 149e2: 4a e0 ldi r20, 0x0A ; 10 149e4: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 149e8: 8f e2 ldi r24, 0x2F ; 47 149ea: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 149ee: 60 91 e4 16 lds r22, 0x16E4 ; 0x8016e4 149f2: 70 91 e5 16 lds r23, 0x16E5 ; 0x8016e5 149f6: 80 91 e6 16 lds r24, 0x16E6 ; 0x8016e6 149fa: 90 91 e7 16 lds r25, 0x16E7 ; 0x8016e7 149fe: 4a e0 ldi r20, 0x0A ; 10 14a00: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 14a04: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOL(sdpos); SERIAL_PROTOCOL('/'); SERIAL_PROTOCOLLN(filesize); uint16_t time = print_job_timer.duration() / 60; 14a08: 0f 94 6d 17 call 0x22eda ; 0x22eda 14a0c: 2c e3 ldi r18, 0x3C ; 60 14a0e: 30 e0 ldi r19, 0x00 ; 0 14a10: 40 e0 ldi r20, 0x00 ; 0 14a12: 50 e0 ldi r21, 0x00 ; 0 14a14: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> SERIAL_PROTOCOL((int)(time / 60)); 14a18: c9 01 movw r24, r18 14a1a: 6c e3 ldi r22, 0x3C ; 60 14a1c: 70 e0 ldi r23, 0x00 ; 0 14a1e: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 14a22: 8c 01 movw r16, r24 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 14a24: 90 e0 ldi r25, 0x00 ; 0 14a26: 80 e0 ldi r24, 0x00 ; 0 14a28: 0e 94 2a 7a call 0xf454 ; 0xf454 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 14a2c: 8a e3 ldi r24, 0x3A ; 58 14a2e: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_PROTOCOL(':'); SERIAL_PROTOCOLLN((int)(time % 60)); 14a32: c8 01 movw r24, r16 14a34: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e 14a38: ea ce rjmp .-556 ; 0x1480e { printAbsFilenameFast(); SERIAL_PROTOCOLLN(); } else SERIAL_PROTOCOLLN(LONGEST_FILENAME); 14a3a: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 14a3e: 88 23 and r24, r24 14a40: 29 f0 breq .+10 ; 0x14a4c 14a42: 8e ee ldi r24, 0xEE ; 238 14a44: 93 e1 ldi r25, 0x13 ; 19 14a46: 0e 94 a1 87 call 0x10f42 ; 0x10f42 14a4a: bf cf rjmp .-130 ; 0x149ca 14a4c: 89 ed ldi r24, 0xD9 ; 217 14a4e: 93 e1 ldi r25, 0x13 ; 19 14a50: fa cf rjmp .-12 ; 0x14a46 SERIAL_PROTOCOL((int)(time / 60)); SERIAL_PROTOCOL(':'); SERIAL_PROTOCOLLN((int)(time % 60)); } else SERIAL_PROTOCOLLNPGM("Not SD printing"); 14a52: 8a e2 ldi r24, 0x2A ; 42 14a54: 9e e7 ldi r25, 0x7E ; 126 14a56: 0e 94 bd 7c call 0xf97a ; 0xf97a 14a5a: d9 ce rjmp .-590 ; 0x1480e /*! ### M28 - Start SD write M28: Begin write to SD card */ case 28: card.openFileWrite(strchr_pointer+4); 14a5c: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 14a60: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 14a64: 04 96 adiw r24, 0x04 ; 4 14a66: 0f 94 0f 78 call 0x2f01e ; 0x2f01e 14a6a: d1 ce rjmp .-606 ; 0x1480e * or an I/O error occurred. */ bool SdBaseFile::remove() { dir_t* d; // free any clusters - will fail if read-only or directory if (!truncate(0)) goto fail; 14a6c: ce 01 movw r24, r28 14a6e: 01 96 adiw r24, 0x01 ; 1 14a70: 0f 94 f8 68 call 0x2d1f0 ; 0x2d1f0 14a74: 88 23 and r24, r24 14a76: 09 f4 brne .+2 ; 0x14a7a 14a78: fe c8 rjmp .-3588 ; 0x13c76 // cache directory entry d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 14a7a: 61 e0 ldi r22, 0x01 ; 1 14a7c: ce 01 movw r24, r28 14a7e: 01 96 adiw r24, 0x01 ; 1 14a80: 0f 94 9a 2e call 0x25d34 ; 0x25d34 if (!d) goto fail; 14a84: 00 97 sbiw r24, 0x00 ; 0 14a86: 09 f4 brne .+2 ; 0x14a8a 14a88: f6 c8 rjmp .-3604 ; 0x13c76 // mark entry deleted d->name[0] = DIR_NAME_DELETED; 14a8a: 25 ee ldi r18, 0xE5 ; 229 14a8c: fc 01 movw r30, r24 14a8e: 20 83 st Z, r18 // set this file closed type_ = FAT_FILE_TYPE_CLOSED; 14a90: 1c 82 std Y+4, r1 ; 0x04 // write entry to SD return vol_->cacheFlush(); 14a92: 0f 94 8e 29 call 0x2531c ; 0x2531c 14a96: 18 2f mov r17, r24 14a98: ef c8 rjmp .-3618 ; 0x13c78 presort(); #endif } else { SERIAL_PROTOCOLPGM("Deletion failed, File: "); 14a9a: 84 e0 ldi r24, 0x04 ; 4 14a9c: 9e e7 ldi r25, 0x7E ; 126 14a9e: 0e 94 c4 7a call 0xf588 ; 0xf588 14aa2: 8c a1 ldd r24, Y+36 ; 0x24 14aa4: 9d a1 ldd r25, Y+37 ; 0x25 14aa6: 0e 94 95 87 call 0x10f2a ; 0x10f2a 14aaa: 8e e2 ldi r24, 0x2E ; 46 14aac: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 14ab0: 0e 94 bc 7a call 0xf578 ; 0xf578 14ab4: ac ce rjmp .-680 ; 0x1480e - `S` - Starting file offset */ case 32: { if(card.sdprinting) { 14ab6: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 14aba: 81 11 cpse r24, r1 st_synchronize(); 14abc: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } const char* namestartpos = (strchr(strchr_pointer + 4,'!')); //find ! to indicate filename string start. 14ac0: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb 14ac4: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc 14ac8: 0c 5f subi r16, 0xFC ; 252 14aca: 1f 4f sbci r17, 0xFF ; 255 14acc: 61 e2 ldi r22, 0x21 ; 33 14ace: 70 e0 ldi r23, 0x00 ; 0 14ad0: c8 01 movw r24, r16 14ad2: 0f 94 37 aa call 0x3546e ; 0x3546e if(namestartpos==NULL) 14ad6: 00 97 sbiw r24, 0x00 ; 0 14ad8: 19 f0 breq .+6 ; 0x14ae0 { namestartpos=strchr_pointer + 4; //default name position, 4 letters after the M } else namestartpos++; //to skip the '!' 14ada: 8c 01 movw r16, r24 14adc: 0f 5f subi r16, 0xFF ; 255 14ade: 1f 4f sbci r17, 0xFF ; 255 bool call_procedure=(code_seen('P')); 14ae0: 80 e5 ldi r24, 0x50 ; 80 14ae2: 0e 94 f5 55 call 0xabea ; 0xabea 14ae6: f8 2e mov r15, r24 if(strchr_pointer>namestartpos) 14ae8: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 14aec: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 14af0: 08 17 cp r16, r24 14af2: 19 07 cpc r17, r25 14af4: 08 f4 brcc .+2 ; 0x14af8 call_procedure=false; //false alert, 'P' found within filename 14af6: f1 2c mov r15, r1 if( card.mounted ) 14af8: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 14afc: 88 23 and r24, r24 14afe: 09 f4 brne .+2 ; 0x14b02 14b00: 86 ce rjmp .-756 ; 0x1480e { card.openFileReadFilteredGcode(namestartpos,!call_procedure); 14b02: 61 e0 ldi r22, 0x01 ; 1 14b04: 6f 25 eor r22, r15 14b06: c8 01 movw r24, r16 14b08: 0f 94 f3 71 call 0x2e3e6 ; 0x2e3e6 if(code_seen('S')) 14b0c: 83 e5 ldi r24, 0x53 ; 83 14b0e: 0e 94 f5 55 call 0xabea ; 0xabea 14b12: 88 23 and r24, r24 14b14: 99 f0 breq .+38 ; 0x14b3c if(strchr_pointer 14b1a: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 14b1e: 80 17 cp r24, r16 14b20: 91 07 cpc r25, r17 14b22: 60 f4 brcc .+24 ; 0x14b3c card.setIndex(code_value_long()); 14b24: 0e 94 5d 56 call 0xacba ; 0xacba 14b28: 60 93 eb 16 sts 0x16EB, r22 ; 0x8016eb 14b2c: 70 93 ec 16 sts 0x16EC, r23 ; 0x8016ec 14b30: 80 93 ed 16 sts 0x16ED, r24 ; 0x8016ed 14b34: 90 93 ee 16 sts 0x16EE, r25 ; 0x8016ee 14b38: 0f 94 17 68 call 0x2d02e ; 0x2d02e SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED } void CardReader::startFileprint() { if(mounted) 14b3c: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 14b40: 88 23 and r24, r24 14b42: 31 f0 breq .+12 ; 0x14b50 { sdprinting = true; 14b44: 81 e0 ldi r24, 0x01 ; 1 14b46: 80 93 d7 13 sts 0x13D7, r24 ; 0x8013d7 14b4a: 85 e0 ldi r24, 0x05 ; 5 14b4c: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> card.startFileprint(); if(!call_procedure) 14b50: f1 10 cpse r15, r1 14b52: 5d ce rjmp .-838 ; 0x1480e FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; 14b54: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 14b58: 88 23 and r24, r24 14b5a: 61 f0 breq .+24 ; 0x14b74 { if(!card.get_sdpos()) 14b5c: 80 91 eb 16 lds r24, 0x16EB ; 0x8016eb 14b60: 90 91 ec 16 lds r25, 0x16EC ; 0x8016ec 14b64: a0 91 ed 16 lds r26, 0x16ED ; 0x8016ed 14b68: b0 91 ee 16 lds r27, 0x16EE ; 0x8016ee 14b6c: 89 2b or r24, r25 14b6e: 8a 2b or r24, r26 14b70: 8b 2b or r24, r27 14b72: 69 f4 brne .+26 ; 0x14b8e { // A new print has started from scratch, reset stats failstats_reset_print(); 14b74: 0e 94 68 56 call 0xacd0 ; 0xacd0 sdpos_atomic = 0; 14b78: 10 92 49 12 sts 0x1249, r1 ; 0x801249 14b7c: 10 92 4a 12 sts 0x124A, r1 ; 0x80124a 14b80: 10 92 4b 12 sts 0x124B, r1 ; 0x80124b 14b84: 10 92 4c 12 sts 0x124C, r1 ; 0x80124c 14b88: 80 e0 ldi r24, 0x00 ; 0 14b8a: 0e 94 04 86 call 0x10c08 ; 0x10c08 #ifndef LA_NOCOMPAT la10c_reset(); #endif } print_job_timer.start(); // procedure calls count as normal print time. 14b8e: 0f 94 25 19 call 0x2324a ; 0x2324a 14b92: 3d ce rjmp .-902 ; 0x1480e M928 [filename] */ case 928: card.openLogFile(strchr_pointer+5); 14b94: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 14b98: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc } } void CardReader::openLogFile(const char* name) { logging = true; 14b9c: 21 e0 ldi r18, 0x01 ; 1 14b9e: 20 93 d6 13 sts 0x13D6, r18 ; 0x8013d6 openFileWrite(name); 14ba2: 05 96 adiw r24, 0x05 ; 5 14ba4: 0f 94 0f 78 call 0x2f01e ; 0x2f01e 14ba8: 32 ce rjmp .-924 ; 0x1480e ### M31 - Report current print time M31: Output time since last M109 or SD card start to serial */ case 31: //M31 take time since the start of the SD print or an M109 command { char time[30]; uint32_t t = print_job_timer.duration(); 14baa: 0f 94 6d 17 call 0x22eda ; 0x22eda int16_t sec, min; min = t / 60; sec = t % 60; 14bae: 2c e3 ldi r18, 0x3C ; 60 14bb0: 30 e0 ldi r19, 0x00 ; 0 14bb2: 40 e0 ldi r20, 0x00 ; 0 14bb4: 50 e0 ldi r21, 0x00 ; 0 14bb6: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> sprintf_P(time, PSTR("%i min, %i sec"), min, sec); 14bba: 7f 93 push r23 14bbc: 6f 93 push r22 14bbe: 3f 93 push r19 14bc0: 2f 93 push r18 14bc2: 86 e8 ldi r24, 0x86 ; 134 14bc4: 90 e8 ldi r25, 0x80 ; 128 14bc6: 9f 93 push r25 14bc8: 8f 93 push r24 14bca: 8e 01 movw r16, r28 14bcc: 0f 5f subi r16, 0xFF ; 255 14bce: 1f 4f sbci r17, 0xFF ; 255 14bd0: 1f 93 push r17 14bd2: 0f 93 push r16 14bd4: 0f 94 f7 a2 call 0x345ee ; 0x345ee SERIAL_ECHO_START; 14bd8: 8e ec ldi r24, 0xCE ; 206 14bda: 91 ea ldi r25, 0xA1 ; 161 14bdc: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(time); 14be0: c8 01 movw r24, r16 14be2: 0e 94 a1 87 call 0x10f42 ; 0x10f42 lcd_setstatus(time); 14be6: c8 01 movw r24, r16 14be8: 0e 94 e8 de call 0x1bdd0 ; 0x1bdd0 autotempShutdown(); 14bec: 0f b6 in r0, 0x3f ; 63 14bee: f8 94 cli 14bf0: de bf out 0x3e, r29 ; 62 14bf2: 0f be out 0x3f, r0 ; 63 14bf4: cd bf out 0x3d, r28 ; 61 14bf6: 0b ce rjmp .-1002 ; 0x1480e } #if defined(FAN_PIN) && FAN_PIN > -1 if (pin_number == FAN_PIN) fanSpeed = pin_status; #endif if (pin_number > -1) 14bf8: 17 fd sbrc r17, 7 14bfa: 09 ce rjmp .-1006 ; 0x1480e 14bfc: 80 c8 rjmp .-3840 ; 0x13cfe ### M44 - Reset the bed skew and offset calibration M44: Reset the bed skew and offset calibration */ case 44: // M44: Prusa3D: Reset the bed skew and offset calibration. // Reset the baby step value and the baby step applied flag. calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 14bfe: 80 e1 ldi r24, 0x10 ; 16 14c00: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 14c04: 81 ea ldi r24, 0xA1 ; 161 14c06: 9d e0 ldi r25, 0x0D ; 13 14c08: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 14c0c: 4b e0 ldi r20, 0x0B ; 11 14c0e: 84 9f mul r24, r20 14c10: c0 01 movw r24, r0 14c12: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 14c14: 70 e0 ldi r23, 0x00 ; 0 14c16: 60 e0 ldi r22, 0x00 ; 0 14c18: 80 5b subi r24, 0xB0 ; 176 14c1a: 92 4f sbci r25, 0xF2 ; 242 14c1c: 0f 94 22 a4 call 0x34844 ; 0x34844 // Reset the skew and offset in both RAM and EEPROM. calibration_status_clear(CALIBRATION_STATUS_XYZ); 14c20: 82 e0 ldi r24, 0x02 ; 2 14c22: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 reset_bed_offset_and_skew(); 14c26: 0e 94 1e 55 call 0xaa3c ; 0xaa3c // Reset world2machine_rotation_and_skew and world2machine_shift, therefore // the planner will not perform any adjustments in the XY plane. // Wait for the motors to stop and update the current position with the absolute values. world2machine_revert_to_uncorrected(); 14c2a: 0e 94 2d 62 call 0xc45a ; 0xc45a 14c2e: ef cd rjmp .-1058 ; 0x1480e */ case 45: // M45: Prusa3D: bed skew and offset with manual Z up { int8_t verbosity_level = 0; bool only_Z = code_seen('Z'); 14c30: 8a e5 ldi r24, 0x5A ; 90 14c32: 0e 94 f5 55 call 0xabea ; 0xabea // Just 'V' without a number counts as V1. char c = strchr_pointer[1]; verbosity_level = (c == ' ' || c == '\t' || c == 0) ? 1 : code_value_short(); } #endif //SUPPORT_VERBOSITY gcode_M45(only_Z, verbosity_level); 14c36: 0f 94 1e 7d call 0x2fa3c ; 0x2fa3c 14c3a: e9 cd rjmp .-1070 ; 0x1480e SERIAL_PROTOCOL('.'); SERIAL_PROTOCOL(uint8_t(ip[2])); SERIAL_PROTOCOL('.'); SERIAL_PROTOCOLLN(uint8_t(ip[3])); } else { SERIAL_PROTOCOLPGM("?Toshiba FlashAir GetIP failed\n"); 14c3c: 8a e4 ldi r24, 0x4A ; 74 14c3e: 90 e8 ldi r25, 0x80 ; 128 14c40: 0e 94 c4 7a call 0xf588 ; 0xf588 14c44: e4 cd rjmp .-1080 ; 0x1480e } } else { SERIAL_PROTOCOLLNPGM("n/a"); 14c46: 86 e4 ldi r24, 0x46 ; 70 14c48: 90 e8 ldi r25, 0x80 ; 128 14c4a: 0e 94 bd 7c call 0xf97a ; 0xf97a 14c4e: df cd rjmp .-1090 ; 0x1480e /*! ### M47 - Show end stops dialog on the display M47: Show end stops dialog on the display */ #ifndef TMC2130 case 47: KEEPALIVE_STATE(PAUSED_FOR_USER); 14c50: 84 e0 ldi r24, 0x04 ; 4 14c52: 80 93 78 02 sts 0x0278, r24 ; 0x800278 menu_back_if_clicked(); } void lcd_diag_show_end_stops() { lcd_clear(); 14c56: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_consume_click(); 14c5a: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 for (;;) { manage_heater(); 14c5e: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 14c62: 81 e0 ldi r24, 0x01 ; 1 14c64: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_show_end_stops(); 14c68: 0e 94 46 df call 0x1be8c ; 0x1be8c if (lcd_clicked()) { 14c6c: 0e 94 75 73 call 0xe6ea ; 0xe6ea 14c70: 88 23 and r24, r24 14c72: a9 f3 breq .-22 ; 0x14c5e break; } } lcd_clear(); 14c74: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_return_to_status(); 14c78: 0f 94 d5 07 call 0x20faa ; 0x20faa 14c7c: c8 cd rjmp .-1136 ; 0x1480e 14c7e: 10 92 61 0d sts 0x0D61, r1 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 14c82: c5 cd rjmp .-1142 ; 0x1480e break; default: break; } } else { printf_P(_N("PrinterState: %d\n"),uint8_t(GetPrinterState())); 14c84: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 14c88: 1f 92 push r1 14c8a: 8f 93 push r24 14c8c: 88 e2 ldi r24, 0x28 ; 40 14c8e: 96 e6 ldi r25, 0x66 ; 102 14c90: 9f 93 push r25 14c92: 8f 93 push r24 14c94: 0f 94 a2 a2 call 0x34544 ; 0x34544 14c98: 0f 90 pop r0 14c9a: 0f 90 pop r0 14c9c: 0f 90 pop r0 14c9e: 0f 90 pop r0 14ca0: b6 cd rjmp .-1172 ; 0x1480e - `C` - Time to change/pause/user interaction in normal mode - `D` - Time to change/pause/user interaction in silent mode */ case 73: //M73 show percent done, time remaining and time to change/pause { if(code_seen('P')) print_percent_done_normal = code_value_uint8(); 14ca2: 80 e5 ldi r24, 0x50 ; 80 14ca4: 0e 94 f5 55 call 0xabea ; 0xabea 14ca8: 88 23 and r24, r24 14caa: 21 f0 breq .+8 ; 0x14cb4 14cac: 0e 94 0a 56 call 0xac14 ; 0xac14 14cb0: 80 93 6f 02 sts 0x026F, r24 ; 0x80026f if(code_seen('R')) print_time_remaining_normal = code_value(); 14cb4: 82 e5 ldi r24, 0x52 ; 82 14cb6: 0e 94 f5 55 call 0xabea ; 0xabea 14cba: 88 23 and r24, r24 14cbc: 41 f0 breq .+16 ; 0x14cce 14cbe: 0e 94 85 5a call 0xb50a ; 0xb50a 14cc2: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14cc6: 70 93 73 02 sts 0x0273, r23 ; 0x800273 14cca: 60 93 72 02 sts 0x0272, r22 ; 0x800272 if(code_seen('Q')) print_percent_done_silent = code_value_uint8(); 14cce: 81 e5 ldi r24, 0x51 ; 81 14cd0: 0e 94 f5 55 call 0xabea ; 0xabea 14cd4: 88 23 and r24, r24 14cd6: 21 f0 breq .+8 ; 0x14ce0 14cd8: 0e 94 0a 56 call 0xac14 ; 0xac14 14cdc: 80 93 3f 02 sts 0x023F, r24 ; 0x80023f if(code_seen('S')) print_time_remaining_silent = code_value(); 14ce0: 83 e5 ldi r24, 0x53 ; 83 14ce2: 0e 94 f5 55 call 0xabea ; 0xabea 14ce6: 88 23 and r24, r24 14ce8: 41 f0 breq .+16 ; 0x14cfa 14cea: 0e 94 85 5a call 0xb50a ; 0xb50a 14cee: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14cf2: 70 93 3e 02 sts 0x023E, r23 ; 0x80023e 14cf6: 60 93 3d 02 sts 0x023D, r22 ; 0x80023d if(code_seen('C')){ 14cfa: 83 e4 ldi r24, 0x43 ; 67 14cfc: 0e 94 f5 55 call 0xabea ; 0xabea 14d00: 88 23 and r24, r24 14d02: a9 f0 breq .+42 ; 0x14d2e float print_time_to_change_normal_f = code_value(); 14d04: 0e 94 85 5a call 0xb50a ; 0xb50a 14d08: 6b 01 movw r12, r22 14d0a: 7c 01 movw r14, r24 print_time_to_change_normal = ( print_time_to_change_normal_f <= 0 ) ? PRINT_TIME_REMAINING_INIT : print_time_to_change_normal_f; 14d0c: 20 e0 ldi r18, 0x00 ; 0 14d0e: 30 e0 ldi r19, 0x00 ; 0 14d10: a9 01 movw r20, r18 14d12: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 14d16: 6f ef ldi r22, 0xFF ; 255 14d18: 7f ef ldi r23, 0xFF ; 255 14d1a: 18 16 cp r1, r24 14d1c: 24 f4 brge .+8 ; 0x14d26 14d1e: c7 01 movw r24, r14 14d20: b6 01 movw r22, r12 14d22: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14d26: 70 93 71 02 sts 0x0271, r23 ; 0x800271 14d2a: 60 93 70 02 sts 0x0270, r22 ; 0x800270 } if(code_seen('D')){ 14d2e: 84 e4 ldi r24, 0x44 ; 68 14d30: 0e 94 f5 55 call 0xabea ; 0xabea 14d34: 88 23 and r24, r24 14d36: a9 f0 breq .+42 ; 0x14d62 float print_time_to_change_silent_f = code_value(); 14d38: 0e 94 85 5a call 0xb50a ; 0xb50a 14d3c: 6b 01 movw r12, r22 14d3e: 7c 01 movw r14, r24 print_time_to_change_silent = ( print_time_to_change_silent_f <= 0 ) ? PRINT_TIME_REMAINING_INIT : print_time_to_change_silent_f; 14d40: 20 e0 ldi r18, 0x00 ; 0 14d42: 30 e0 ldi r19, 0x00 ; 0 14d44: a9 01 movw r20, r18 14d46: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 14d4a: 6f ef ldi r22, 0xFF ; 255 14d4c: 7f ef ldi r23, 0xFF ; 255 14d4e: 18 16 cp r1, r24 14d50: 24 f4 brge .+8 ; 0x14d5a 14d52: c7 01 movw r24, r14 14d54: b6 01 movw r22, r12 14d56: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14d5a: 70 93 3c 02 sts 0x023C, r23 ; 0x80023c 14d5e: 60 93 3b 02 sts 0x023B, r22 ; 0x80023b } { const char* _msg_mode_done_remain = _N("%S MODE: Percent done: %hhd; print time remaining in mins: %d; Change in mins: %d\n"); printf_P(_msg_mode_done_remain, _N("NORMAL"), int8_t(print_percent_done_normal), print_time_remaining_normal, print_time_to_change_normal); 14d62: 80 91 71 02 lds r24, 0x0271 ; 0x800271 14d66: 8f 93 push r24 14d68: 80 91 70 02 lds r24, 0x0270 ; 0x800270 14d6c: 8f 93 push r24 14d6e: 80 91 73 02 lds r24, 0x0273 ; 0x800273 14d72: 8f 93 push r24 14d74: 80 91 72 02 lds r24, 0x0272 ; 0x800272 14d78: 8f 93 push r24 14d7a: 80 91 6f 02 lds r24, 0x026F ; 0x80026f 14d7e: 28 2f mov r18, r24 14d80: 08 2e mov r0, r24 14d82: 00 0c add r0, r0 14d84: 33 0b sbc r19, r19 14d86: 3f 93 push r19 14d88: 8f 93 push r24 14d8a: 8e ec ldi r24, 0xCE ; 206 14d8c: 95 e6 ldi r25, 0x65 ; 101 14d8e: 9f 93 push r25 14d90: 8f 93 push r24 14d92: 05 ed ldi r16, 0xD5 ; 213 14d94: 15 e6 ldi r17, 0x65 ; 101 14d96: 1f 93 push r17 14d98: 0f 93 push r16 14d9a: 0f 94 a2 a2 call 0x34544 ; 0x34544 printf_P(_msg_mode_done_remain, _N("SILENT"), int8_t(print_percent_done_silent), print_time_remaining_silent, print_time_to_change_silent); 14d9e: 80 91 3c 02 lds r24, 0x023C ; 0x80023c 14da2: 8f 93 push r24 14da4: 80 91 3b 02 lds r24, 0x023B ; 0x80023b 14da8: 8f 93 push r24 14daa: 80 91 3e 02 lds r24, 0x023E ; 0x80023e 14dae: 8f 93 push r24 14db0: 80 91 3d 02 lds r24, 0x023D ; 0x80023d 14db4: 8f 93 push r24 14db6: 80 91 3f 02 lds r24, 0x023F ; 0x80023f 14dba: 28 2f mov r18, r24 14dbc: 08 2e mov r0, r24 14dbe: 00 0c add r0, r0 14dc0: 33 0b sbc r19, r19 14dc2: 3f 93 push r19 14dc4: 8f 93 push r24 14dc6: 87 ec ldi r24, 0xC7 ; 199 14dc8: 95 e6 ldi r25, 0x65 ; 101 14dca: 9f 93 push r25 14dcc: 8f 93 push r24 14dce: 1f 93 push r17 14dd0: 0f 93 push r16 14dd2: 0f 94 a2 a2 call 0x34544 ; 0x34544 14dd6: 0f b6 in r0, 0x3f ; 63 14dd8: f8 94 cli 14dda: de bf out 0x3e, r29 ; 62 14ddc: 0f be out 0x3f, r0 ; 63 14dde: cd bf out 0x3d, r28 ; 61 14de0: 16 cd rjmp .-1492 ; 0x1480e /*! ### M75 - Start the print job timer M75: Start the print job timer */ case 75: { if (!filament_presence_check()) { 14de2: 0e 94 f0 ea call 0x1d5e0 ; 0x1d5e0 14de6: 88 23 and r24, r24 14de8: 09 f4 brne .+2 ; 0x14dec 14dea: 11 cd rjmp .-1502 ; 0x1480e 14dec: d0 ce rjmp .-608 ; 0x14b8e } else return false; } bool Stopwatch::pause() { if (isRunning()) { 14dee: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 14df2: 81 30 cpi r24, 0x01 ; 1 14df4: 09 f0 breq .+2 ; 0x14df8 14df6: 0b cd rjmp .-1514 ; 0x1480e state = PAUSED; 14df8: 82 e0 ldi r24, 0x02 ; 2 14dfa: 80 93 8b 03 sts 0x038B, r24 ; 0x80038b stopTimestamp = _millis(); 14dfe: 0f 94 f0 0d call 0x21be0 ; 0x21be0 14e02: 60 93 0b 06 sts 0x060B, r22 ; 0x80060b 14e06: 70 93 0c 06 sts 0x060C, r23 ; 0x80060c 14e0a: 80 93 0d 06 sts 0x060D, r24 ; 0x80060d 14e0e: 90 93 0e 06 sts 0x060E, r25 ; 0x80060e 14e12: fd cc rjmp .-1542 ; 0x1480e /*! ### M77 - Stop the print job timer M77: Stop the print job timer */ case 77: { print_job_timer.stop(); 14e14: 0f 94 49 19 call 0x23292 ; 0x23292 save_statistics(); 14e18: 0e 94 b0 64 call 0xc960 ; 0xc960 14e1c: f8 cc rjmp .-1552 ; 0x1480e _m_fil = _O(MSG_FILAMENT_USED); _m_time = _O(MSG_PRINT_TIME); _cm = (uint32_t)total_filament_used / 1000; _min = print_job_timer.duration() / 60; } else { if (code_seen('S')) { 14e1e: 83 e5 ldi r24, 0x53 ; 83 14e20: 0e 94 f5 55 call 0xabea ; 0xabea 14e24: 88 23 and r24, r24 14e26: 51 f0 breq .+20 ; 0x14e3c eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value()); 14e28: 0e 94 85 5a call 0xb50a ; 0xb50a 14e2c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14e30: ab 01 movw r20, r22 14e32: bc 01 movw r22, r24 if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); 14e34: 81 ef ldi r24, 0xF1 ; 241 14e36: 9f e0 ldi r25, 0x0F ; 15 14e38: 0f 94 16 a4 call 0x3482c ; 0x3482c } if (code_seen('T')) { 14e3c: 84 e5 ldi r24, 0x54 ; 84 14e3e: 0e 94 f5 55 call 0xabea ; 0xabea 14e42: 88 23 and r24, r24 14e44: 51 f0 breq .+20 ; 0x14e5a eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value()); 14e46: 0e 94 85 5a call 0xb50a ; 0xb50a 14e4a: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 14e4e: ab 01 movw r20, r22 14e50: bc 01 movw r22, r24 14e52: 8d ee ldi r24, 0xED ; 237 14e54: 9f e0 ldi r25, 0x0F ; 15 14e56: 0f 94 16 a4 call 0x3482c ; 0x3482c } _m_fil = _O(MSG_TOTAL_FILAMENT); _m_time = _O(MSG_TOTAL_PRINT_TIME); _cm = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); 14e5a: 81 ef ldi r24, 0xF1 ; 241 14e5c: 9f e0 ldi r25, 0x0F ; 15 14e5e: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 14e62: 16 2f mov r17, r22 14e64: 07 2f mov r16, r23 14e66: f8 2e mov r15, r24 14e68: e9 2e mov r14, r25 _min = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); 14e6a: 8d ee ldi r24, 0xED ; 237 14e6c: 9f e0 ldi r25, 0x0F ; 15 14e6e: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 } if (code_seen('T')) { eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value()); } _m_fil = _O(MSG_TOTAL_FILAMENT); _m_time = _O(MSG_TOTAL_PRINT_TIME); 14e72: 4e ea ldi r20, 0xAE ; 174 14e74: 58 e5 ldi r21, 0x58 ; 88 eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value()); } if (code_seen('T')) { eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value()); } _m_fil = _O(MSG_TOTAL_FILAMENT); 14e76: 2d e9 ldi r18, 0x9D ; 157 14e78: 38 e5 ldi r19, 0x58 ; 88 14e7a: 0c 94 1f 9f jmp 0x13e3e ; 0x13e3e void ResetHostStatusScreenName() { memset(host_status_screen_name, 0, sizeof(host_status_screen_name)); } void M79_timer_restart() { M79_timer.start(); 14e7e: 8c e8 ldi r24, 0x8C ; 140 14e80: 93 e0 ldi r25, 0x03 ; 3 14e82: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> - `S` - Quoted string containing two characters e.g. "PL" */ case 79: M79_timer_restart(); if (code_seen('S')) 14e86: 83 e5 ldi r24, 0x53 ; 83 14e88: 0e 94 f5 55 call 0xabea ; 0xabea 14e8c: 88 23 and r24, r24 14e8e: 09 f1 breq .+66 ; 0x14ed2 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 14e90: 62 e2 ldi r22, 0x22 ; 34 14e92: 70 e0 ldi r23, 0x00 ; 0 14e94: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 14e98: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 14e9c: 0f 94 37 aa call 0x3546e ; 0x3546e 14ea0: 8c 01 movw r16, r24 if (!this->ptr) { 14ea2: 89 2b or r24, r25 14ea4: b1 f0 breq .+44 ; 0x14ed2 // First quote not found return; } // Skip the leading quote this->ptr++; 14ea6: 0f 5f subi r16, 0xFF ; 255 14ea8: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 14eaa: 62 e2 ldi r22, 0x22 ; 34 14eac: 70 e0 ldi r23, 0x00 ; 0 14eae: c8 01 movw r24, r16 14eb0: 0f 94 37 aa call 0x3546e ; 0x3546e if(!pStrEnd) { 14eb4: 89 2b or r24, r25 14eb6: 69 f0 breq .+26 ; 0x14ed2 char * GetHostStatusScreenName() { return host_status_screen_name; } void ResetHostStatusScreenName() { memset(host_status_screen_name, 0, sizeof(host_status_screen_name)); 14eb8: e5 e0 ldi r30, 0x05 ; 5 14eba: f6 e0 ldi r31, 0x06 ; 6 14ebc: 83 e0 ldi r24, 0x03 ; 3 14ebe: df 01 movw r26, r30 14ec0: 1d 92 st X+, r1 14ec2: 8a 95 dec r24 14ec4: e9 f7 brne .-6 ; 0x14ec0 static LongTimer M79_timer; static char host_status_screen_name[3]; void SetHostStatusScreenName(const char * name) { strncpy(host_status_screen_name, name, 2); 14ec6: 42 e0 ldi r20, 0x02 ; 2 14ec8: 50 e0 ldi r21, 0x00 ; 0 14eca: b8 01 movw r22, r16 14ecc: cf 01 movw r24, r30 14ece: 0f 94 60 aa call 0x354c0 ; 0x354c0 } #ifdef DEBUG_PRINTER_STATES debug_printer_states(); #endif //DEBUG_PRINTER_STATES if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST 14ed2: 8c e8 ldi r24, 0x8C ; 140 14ed4: 9f e0 ldi r25, 0x0F ; 15 14ed6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 && printer_recovering() && printingIsPaused()) { 14eda: 81 30 cpi r24, 0x01 ; 1 14edc: 09 f0 breq .+2 ; 0x14ee0 14ede: 97 cc rjmp .-1746 ; 0x1480e #ifdef DEBUG_PRINTER_STATES debug_printer_states(); #endif //DEBUG_PRINTER_STATES if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST && printer_recovering() 14ee0: 0e 94 2b 66 call 0xcc56 ; 0xcc56 14ee4: 88 23 and r24, r24 14ee6: 09 f4 brne .+2 ; 0x14eea 14ee8: 92 cc rjmp .-1756 ; 0x1480e && printingIsPaused()) { 14eea: 0e 94 35 66 call 0xcc6a ; 0xcc6a 14eee: 88 23 and r24, r24 14ef0: 09 f4 brne .+2 ; 0x14ef4 14ef2: 8d cc rjmp .-1766 ; 0x1480e // Send action to the host, so the host can resume the print. It is up to the host // to resume the print correctly. if (uvlo_auto_recovery_ready) { SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY); } else { SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_RECOVERY_READY); 14ef4: 84 e9 ldi r24, 0x94 ; 148 14ef6: 95 e6 ldi r25, 0x65 ; 101 14ef8: 0e 94 bd 7c call 0xf97a ; 0xf97a 14efc: 88 cc rjmp .-1776 ; 0x1480e /*! ### M112 - Emergency stop M112: Full (Emergency) Stop It is processed much earlier as to bypass the cmdqueue. */ case 112: kill(MSG_M112_KILL); 14efe: 87 e7 ldi r24, 0x77 ; 119 14f00: 95 e6 ldi r25, 0x65 ; 101 14f02: 0e 94 23 83 call 0x10646 ; 0x10646 #### Parameters - `S` - Target temperature */ case 140: if (code_seen('S')) setTargetBed(code_value()); 14f06: 83 e5 ldi r24, 0x53 ; 83 14f08: 0e 94 f5 55 call 0xabea ; 0xabea 14f0c: 88 23 and r24, r24 14f0e: 09 f4 brne .+2 ; 0x14f12 14f10: 7e cc rjmp .-1796 ; 0x1480e 14f12: 0e 94 85 5a call 0xb50a ; 0xb50a resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 14f16: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 14f1a: 70 93 5a 12 sts 0x125A, r23 ; 0x80125a 14f1e: 60 93 59 12 sts 0x1259, r22 ; 0x801259 14f22: 75 cc rjmp .-1814 ; 0x1480e ok T:20.2 /0.0 B:19.1 /0.0 T0:20.2 /0.0 @:0 B@:0 P:19.8 A:26.4 */ case 105: { SERIAL_PROTOCOLPGM("ok "); 14f24: 82 e4 ldi r24, 0x42 ; 66 14f26: 90 e8 ldi r25, 0x80 ; 128 14f28: 0e 94 c4 7a call 0xf588 ; 0xf588 gcode_M105(); 14f2c: 0e 94 36 7c call 0xf86c ; 0xf86c cmdqueue_pop_front(); //prevent an ok after the command since this command uses an ok at the beginning. 14f30: 0e 94 43 79 call 0xf286 ; 0xf286 cmdbuffer_front_already_processed = true; 14f34: 81 e0 ldi r24, 0x01 ; 1 14f36: 80 93 53 12 sts 0x1253, r24 ; 0x801253 14f3a: 69 cc rjmp .-1838 ; 0x1480e bit 6 = free bit 7 = free */ case 155: { if (code_seen('S')){ 14f3c: 83 e5 ldi r24, 0x53 ; 83 14f3e: 0e 94 f5 55 call 0xabea ; 0xabea 14f42: 88 23 and r24, r24 14f44: 51 f0 breq .+20 ; 0x14f5a autoReportFeatures.SetPeriod( code_value_uint8() ); 14f46: 0e 94 0a 56 call 0xac14 ; 0xac14 inline void SetMask(uint8_t mask){ arFunctionsActive.byte = mask; } /// sets the autoreporting timer's period /// setting it to zero stops the timer void SetPeriod(uint8_t p){ auto_report_period = p; 14f4a: 80 93 cf 13 sts 0x13CF, r24 ; 0x8013cf if (auto_report_period != 0){ 14f4e: 88 23 and r24, r24 14f50: 71 f0 breq .+28 ; 0x14f6e auto_report_timer.start(); 14f52: 80 ed ldi r24, 0xD0 ; 208 14f54: 93 e1 ldi r25, 0x13 ; 19 14f56: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> case 155: { if (code_seen('S')){ autoReportFeatures.SetPeriod( code_value_uint8() ); } if (code_seen('C')){ 14f5a: 83 e4 ldi r24, 0x43 ; 67 14f5c: 0e 94 f5 55 call 0xabea ; 0xabea 14f60: 88 23 and r24, r24 14f62: 41 f0 breq .+16 ; 0x14f74 autoReportFeatures.SetMask(code_value_uint8()); 14f64: 0e 94 0a 56 call 0xac14 ; 0xac14 inline void SetFans(uint8_t v){ arFunctionsActive.bits.fans = v; } inline bool Pos()const { return arFunctionsActive.bits.pos != 0; } inline void SetPos(uint8_t v){ arFunctionsActive.bits.pos = v; } inline void SetMask(uint8_t mask){ arFunctionsActive.byte = mask; } 14f68: 80 93 ce 13 sts 0x13CE, r24 ; 0x8013ce 14f6c: 50 cc rjmp .-1888 ; 0x1480e 14f6e: 10 92 d0 13 sts 0x13D0, r1 ; 0x8013d0 14f72: f3 cf rjmp .-26 ; 0x14f5a 14f74: 81 e0 ldi r24, 0x01 ; 1 14f76: 80 93 ce 13 sts 0x13CE, r24 ; 0x8013ce 14f7a: 49 cc rjmp .-1902 ; 0x1480e Command always waits for both cool down and heat up. If no parameters are supplied waits for previously set extruder temperature. */ case 109: { LCD_MESSAGERPGM(_T(MSG_HEATING)); 14f7c: 85 e7 ldi r24, 0x75 ; 117 14f7e: 96 e5 ldi r25, 0x56 ; 86 14f80: 0e 94 3a 75 call 0xea74 ; 0xea74 14f84: 0e 94 94 de call 0x1bd28 ; 0x1bd28 heating_status = HeatingStatus::EXTRUDER_HEATING; 14f88: 81 e0 ldi r24, 0x01 ; 1 14f8a: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb prusa_statistics(1); 14f8e: 0f 94 79 32 call 0x264f2 ; 0x264f2 #ifdef AUTOTEMP autotemp_enabled=false; #endif if (code_seen('S')) { 14f92: 83 e5 ldi r24, 0x53 ; 83 14f94: 0e 94 f5 55 call 0xabea ; 0xabea 14f98: 88 23 and r24, r24 14f9a: 49 f0 breq .+18 ; 0x14fae setTargetHotend(code_value()); } else if (code_seen('R')) { setTargetHotend(code_value()); 14f9c: 0e 94 85 5a call 0xb50a ; 0xb50a return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 14fa0: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 14fa4: 70 93 5e 12 sts 0x125E, r23 ; 0x80125e 14fa8: 60 93 5d 12 sts 0x125D, r22 ; 0x80125d 14fac: 05 c0 rjmp .+10 ; 0x14fb8 #ifdef AUTOTEMP autotemp_enabled=false; #endif if (code_seen('S')) { setTargetHotend(code_value()); } else if (code_seen('R')) { 14fae: 82 e5 ldi r24, 0x52 ; 82 14fb0: 0e 94 f5 55 call 0xabea ; 0xabea 14fb4: 81 11 cpse r24, r1 14fb6: f2 cf rjmp .-28 ; 0x14f9c autotemp_factor=code_value(); autotemp_enabled=true; } #endif codenum = _millis(); 14fb8: 0f 94 f0 0d call 0x21be0 ; 0x21be0 14fbc: 6b 01 movw r12, r22 14fbe: 7c 01 movw r14, r24 FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; }; FORCE_INLINE bool isHeatingHotend(uint8_t extruder){ return target_temperature[extruder] > current_temperature[extruder]; 14fc0: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 14fc4: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 14fc8: 07 2e mov r0, r23 14fca: 00 0c add r0, r0 14fcc: 88 0b sbc r24, r24 14fce: 99 0b sbc r25, r25 14fd0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 14fd4: 11 e0 ldi r17, 0x01 ; 1 14fd6: 20 91 5a 0d lds r18, 0x0D5A ; 0x800d5a 14fda: 30 91 5b 0d lds r19, 0x0D5B ; 0x800d5b 14fde: 40 91 5c 0d lds r20, 0x0D5C ; 0x800d5c 14fe2: 50 91 5d 0d lds r21, 0x0D5D ; 0x800d5d 14fe6: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 14fea: 18 16 cp r1, r24 14fec: 0c f0 brlt .+2 ; 0x14ff0 14fee: 10 e0 ldi r17, 0x00 ; 0 /* See if we are heating up or cooling down */ target_direction = isHeatingHotend(active_extruder); // true if heating, false if cooling 14ff0: 10 93 59 0d sts 0x0D59, r17 ; 0x800d59 <_ZL16target_direction.lto_priv.490> wait_for_heater(codenum, active_extruder); //loops until target temperature is reached 14ff4: c7 01 movw r24, r14 14ff6: b6 01 movw r22, r12 14ff8: 0f 94 85 74 call 0x2e90a ; 0x2e90a LCD_MESSAGERPGM(_T(MSG_HEATING_COMPLETE)); 14ffc: 85 e6 ldi r24, 0x65 ; 101 14ffe: 96 e5 ldi r25, 0x56 ; 86 15000: 0e 94 3a 75 call 0xea74 ; 0xea74 15004: 0e 94 94 de call 0x1bd28 ; 0x1bd28 heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE; 15008: 82 e0 ldi r24, 0x02 ; 2 1500a: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb prusa_statistics(2); 1500e: 0f 94 79 32 call 0x264f2 ; 0x264f2 previous_millis_cmd.start(); 15012: 88 e4 ldi r24, 0x48 ; 72 15014: 93 e0 ldi r25, 0x03 ; 3 15016: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> 1501a: f9 cb rjmp .-2062 ; 0x1480e */ case 190: #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 { bool CooldownNoWait = false; LCD_MESSAGERPGM(_T(MSG_BED_HEATING)); 1501c: 87 e5 ldi r24, 0x57 ; 87 1501e: 96 e5 ldi r25, 0x56 ; 86 15020: 0e 94 3a 75 call 0xea74 ; 0xea74 15024: 0e 94 94 de call 0x1bd28 ; 0x1bd28 heating_status = HeatingStatus::BED_HEATING; 15028: 83 e0 ldi r24, 0x03 ; 3 1502a: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb prusa_statistics(1); 1502e: 81 e0 ldi r24, 0x01 ; 1 15030: 0f 94 79 32 call 0x264f2 ; 0x264f2 if (code_seen('S')) 15034: 83 e5 ldi r24, 0x53 ; 83 15036: 0e 94 f5 55 call 0xabea ; 0xabea 1503a: 18 2f mov r17, r24 1503c: 88 23 and r24, r24 1503e: 49 f0 breq .+18 ; 0x15052 setTargetBed(code_value()); CooldownNoWait = true; } else if (code_seen('R')) { setTargetBed(code_value()); 15040: 0e 94 85 5a call 0xb50a ; 0xb50a target_temperature[0] = celsius; resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 15044: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 15048: 70 93 5a 12 sts 0x125A, r23 ; 0x80125a 1504c: 60 93 59 12 sts 0x1259, r22 ; 0x801259 15050: 05 c0 rjmp .+10 ; 0x1505c if (code_seen('S')) { setTargetBed(code_value()); CooldownNoWait = true; } else if (code_seen('R')) 15052: 82 e5 ldi r24, 0x52 ; 82 15054: 0e 94 f5 55 call 0xabea ; 0xabea 15058: 81 11 cpse r24, r1 1505a: f2 cf rjmp .-28 ; 0x15040 { setTargetBed(code_value()); } codenum = _millis(); 1505c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 15060: 6b 01 movw r12, r22 15062: 7c 01 movw r14, r24 cancel_heatup = false; 15064: 10 92 5f 0d sts 0x0D5F, r1 ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> FORCE_INLINE bool isHeatingHotend(uint8_t extruder){ return target_temperature[extruder] > current_temperature[extruder]; }; FORCE_INLINE bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; 15068: 60 91 59 12 lds r22, 0x1259 ; 0x801259 1506c: 70 91 5a 12 lds r23, 0x125A ; 0x80125a 15070: 07 2e mov r0, r23 15072: 00 0c add r0, r0 15074: 88 0b sbc r24, r24 15076: 99 0b sbc r25, r25 15078: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1507c: 01 e0 ldi r16, 0x01 ; 1 1507e: 20 91 bc 03 lds r18, 0x03BC ; 0x8003bc 15082: 30 91 bd 03 lds r19, 0x03BD ; 0x8003bd 15086: 40 91 be 03 lds r20, 0x03BE ; 0x8003be 1508a: 50 91 bf 03 lds r21, 0x03BF ; 0x8003bf 1508e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 15092: 18 16 cp r1, r24 15094: 0c f0 brlt .+2 ; 0x15098 15096: 00 e0 ldi r16, 0x00 ; 0 target_direction = isHeatingBed(); // true if heating, false if cooling 15098: 00 93 59 0d sts 0x0D59, r16 ; 0x800d59 <_ZL16target_direction.lto_priv.490> while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) ) 1509c: 80 91 5f 0d lds r24, 0x0D5F ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> 150a0: 81 11 cpse r24, r1 150a2: 1a c0 rjmp .+52 ; 0x150d8 150a4: 60 91 59 12 lds r22, 0x1259 ; 0x801259 150a8: 70 91 5a 12 lds r23, 0x125A ; 0x80125a 150ac: 07 2e mov r0, r23 150ae: 00 0c add r0, r0 150b0: 88 0b sbc r24, r24 150b2: 99 0b sbc r25, r25 150b4: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 150b8: 20 91 bc 03 lds r18, 0x03BC ; 0x8003bc 150bc: 30 91 bd 03 lds r19, 0x03BD ; 0x8003bd 150c0: 40 91 be 03 lds r20, 0x03BE ; 0x8003be 150c4: 50 91 bf 03 lds r21, 0x03BF ; 0x8003bf 150c8: e0 91 59 0d lds r30, 0x0D59 ; 0x800d59 <_ZL16target_direction.lto_priv.490> 150cc: ee 23 and r30, r30 150ce: 91 f0 breq .+36 ; 0x150f4 150d0: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 150d4: 18 16 cp r1, r24 150d6: a4 f0 brlt .+40 ; 0x15100 } manage_heater(); manage_inactivity(); lcd_update(0); } LCD_MESSAGERPGM(_T(MSG_BED_DONE)); 150d8: 8c e4 ldi r24, 0x4C ; 76 150da: 96 e5 ldi r25, 0x56 ; 86 150dc: 0e 94 3a 75 call 0xea74 ; 0xea74 150e0: 0e 94 94 de call 0x1bd28 ; 0x1bd28 heating_status = HeatingStatus::BED_HEATING_COMPLETE; 150e4: 84 e0 ldi r24, 0x04 ; 4 150e6: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb previous_millis_cmd.start(); 150ea: 88 e4 ldi r24, 0x48 ; 72 150ec: 93 e0 ldi r25, 0x03 ; 3 150ee: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> 150f2: 8d cb rjmp .-2278 ; 0x1480e codenum = _millis(); cancel_heatup = false; target_direction = isHeatingBed(); // true if heating, false if cooling while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) ) 150f4: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 150f8: 87 ff sbrs r24, 7 150fa: ee cf rjmp .-36 ; 0x150d8 150fc: 11 11 cpse r17, r1 150fe: ec cf rjmp .-40 ; 0x150d8 { if (lcd_commands_type == LcdCommands::LongPause) { 15100: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 15104: 82 30 cpi r24, 0x02 ; 2 15106: 41 f3 breq .-48 ; 0x150d8 // Print was suddenly paused, break out of the loop // This can happen when the firmware report a fan error break; } if(( _millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. 15108: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1510c: 6c 19 sub r22, r12 1510e: 7d 09 sbc r23, r13 15110: 8e 09 sbc r24, r14 15112: 9f 09 sbc r25, r15 15114: 69 3e cpi r22, 0xE9 ; 233 15116: 73 40 sbci r23, 0x03 ; 3 15118: 81 05 cpc r24, r1 1511a: 91 05 cpc r25, r1 1511c: 50 f0 brcs .+20 ; 0x15132 { if (!farm_mode) { 1511e: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 15122: 81 11 cpse r24, r1 15124: 02 c0 rjmp .+4 ; 0x1512a serialecho_temperatures(); 15126: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 } codenum = _millis(); 1512a: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1512e: 6b 01 movw r12, r22 15130: 7c 01 movw r14, r24 } manage_heater(); 15132: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 15136: 80 e0 ldi r24, 0x00 ; 0 15138: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 1513c: 80 e0 ldi r24, 0x00 ; 0 1513e: 0e 94 f9 6e call 0xddf2 ; 0xddf2 15142: ac cf rjmp .-168 ; 0x1509c #### Parameters - `S` - Specifies the duty cycle of the print fan. Allowed values are 0-255. If it's omitted, a value of 255 is used. */ case 106: // M106 Sxxx Fan On S 0 .. 255 if (code_seen('S')){ 15144: 83 e5 ldi r24, 0x53 ; 83 15146: 0e 94 f5 55 call 0xabea ; 0xabea 1514a: 88 23 and r24, r24 1514c: 29 f0 breq .+10 ; 0x15158 fanSpeed = code_value_uint8(); 1514e: 0e 94 0a 56 call 0xac14 ; 0xac14 15152: 80 93 55 12 sts 0x1255, r24 ; 0x801255 15156: 5b cb rjmp .-2378 ; 0x1480e } else { fanSpeed = 255; 15158: 8f ef ldi r24, 0xFF ; 255 1515a: 80 93 55 12 sts 0x1255, r24 ; 0x801255 1515e: 57 cb rjmp .-2386 ; 0x1480e /*! ### M107 - Fan off M107: Fan Off */ case 107: fanSpeed = 0; 15160: 10 92 55 12 sts 0x1255, r1 ; 0x801255 15164: 54 cb rjmp .-2392 ; 0x1480e /*! ### M82 - Set E axis to absolute mode M82: Set extruder to absolute mode Makes the extruder interpret extrusion as absolute positions. */ case 82: axis_relative_modes &= ~E_AXIS_MASK; 15166: 80 91 57 12 lds r24, 0x1257 ; 0x801257 1516a: 87 7f andi r24, 0xF7 ; 247 1516c: 80 93 57 12 sts 0x1257, r24 ; 0x801257 15170: 4e cb rjmp .-2404 ; 0x1480e ### M18 - Disable steppers M18: Disable all stepper motors Equal to M84 (compatibility) */ case 18: //compatibility case 84: // M84 if(code_seen('S')){ 15172: 83 e5 ldi r24, 0x53 ; 83 15174: 0e 94 f5 55 call 0xabea ; 0xabea 15178: 88 23 and r24, r24 1517a: 99 f0 breq .+38 ; 0x151a2 stepper_inactive_time = code_value() * 1000; 1517c: 0e 94 85 5a call 0xb50a ; 0xb50a 15180: 20 e0 ldi r18, 0x00 ; 0 15182: 30 e0 ldi r19, 0x00 ; 0 15184: 4a e7 ldi r20, 0x7A ; 122 15186: 54 e4 ldi r21, 0x44 ; 68 15188: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1518c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 15190: 60 93 37 02 sts 0x0237, r22 ; 0x800237 15194: 70 93 38 02 sts 0x0238, r23 ; 0x800238 15198: 80 93 39 02 sts 0x0239, r24 ; 0x800239 1519c: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a 151a0: 36 cb rjmp .-2452 ; 0x1480e } else { bool all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS]))|| (code_seen(axis_codes[E_AXIS]))); 151a2: 88 e5 ldi r24, 0x58 ; 88 151a4: 0e 94 f5 55 call 0xabea ; 0xabea 151a8: 88 23 and r24, r24 151aa: d1 f0 breq .+52 ; 0x151e0 disable_e0(); finishAndDisableSteppers(); } else { st_synchronize(); 151ac: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (code_seen('X')) disable_x(); 151b0: 88 e5 ldi r24, 0x58 ; 88 151b2: 0e 94 f5 55 call 0xabea ; 0xabea 151b6: 81 11 cpse r24, r1 151b8: 28 c0 rjmp .+80 ; 0x1520a if (code_seen('Y')) disable_y(); 151ba: 89 e5 ldi r24, 0x59 ; 89 151bc: 0e 94 f5 55 call 0xabea ; 0xabea 151c0: 88 23 and r24, r24 151c2: 19 f0 breq .+6 ; 0x151ca 151c4: 16 9a sbi 0x02, 6 ; 2 151c6: 10 92 3a 06 sts 0x063A, r1 ; 0x80063a if (code_seen('Z')) disable_z(); 151ca: 8a e5 ldi r24, 0x5A ; 90 151cc: 0e 94 f5 55 call 0xabea ; 0xabea #if (E0_ENABLE_PIN != X_ENABLE_PIN) // Only enable on boards that have seperate ENABLE_PINS if (code_seen('E')) disable_e0(); 151d0: 85 e4 ldi r24, 0x45 ; 69 151d2: 0e 94 f5 55 call 0xabea ; 0xabea 151d6: 88 23 and r24, r24 151d8: 09 f4 brne .+2 ; 0x151dc 151da: 19 cb rjmp .-2510 ; 0x1480e 151dc: 14 9a sbi 0x02, 4 ; 2 151de: 17 cb rjmp .-2514 ; 0x1480e if(code_seen('S')){ stepper_inactive_time = code_value() * 1000; } else { bool all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS]))|| (code_seen(axis_codes[E_AXIS]))); 151e0: 89 e5 ldi r24, 0x59 ; 89 151e2: 0e 94 f5 55 call 0xabea ; 0xabea 151e6: 81 11 cpse r24, r1 151e8: e1 cf rjmp .-62 ; 0x151ac 151ea: 8a e5 ldi r24, 0x5A ; 90 151ec: 0e 94 f5 55 call 0xabea ; 0xabea 151f0: 81 11 cpse r24, r1 151f2: dc cf rjmp .-72 ; 0x151ac 151f4: 85 e4 ldi r24, 0x45 ; 69 151f6: 0e 94 f5 55 call 0xabea ; 0xabea 151fa: 81 11 cpse r24, r1 151fc: d7 cf rjmp .-82 ; 0x151ac if(all_axis) { st_synchronize(); 151fe: 0f 94 fb 1a call 0x235f6 ; 0x235f6 disable_e0(); 15202: 14 9a sbi 0x02, 4 ; 2 finishAndDisableSteppers(); 15204: 0e 94 55 86 call 0x10caa ; 0x10caa 15208: 02 cb rjmp .-2556 ; 0x1480e } else { st_synchronize(); if (code_seen('X')) disable_x(); 1520a: 17 9a sbi 0x02, 7 ; 2 1520c: 10 92 39 06 sts 0x0639, r1 ; 0x800639 15210: d4 cf rjmp .-88 ; 0x151ba #### Parameters - `S` - specifies the time in seconds. If a value of 0 is specified, the timer is disabled. */ case 85: // M85 if(code_seen('S')) { 15212: 83 e5 ldi r24, 0x53 ; 83 15214: 0e 94 f5 55 call 0xabea ; 0xabea 15218: 88 23 and r24, r24 1521a: 09 f4 brne .+2 ; 0x1521e 1521c: f8 ca rjmp .-2576 ; 0x1480e max_inactive_time = code_value() * 1000; 1521e: 0e 94 85 5a call 0xb50a ; 0xb50a 15222: 20 e0 ldi r18, 0x00 ; 0 15224: 30 e0 ldi r19, 0x00 ; 0 15226: 4a e7 ldi r20, 0x7A ; 122 15228: 54 e4 ldi r21, 0x44 ; 68 1522a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1522e: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 15232: 60 93 44 03 sts 0x0344, r22 ; 0x800344 15236: 70 93 45 03 sts 0x0345, r23 ; 0x800345 1523a: 80 93 46 03 sts 0x0346, r24 ; 0x800346 1523e: 90 93 47 03 sts 0x0347, r25 ; 0x800347 15242: e5 ca rjmp .-2614 ; 0x1480e 15244: 34 ec ldi r19, 0xC4 ; 196 15246: 83 2e mov r8, r19 15248: 32 e0 ldi r19, 0x02 ; 2 1524a: 93 2e mov r9, r19 1524c: 47 e6 ldi r20, 0x67 ; 103 1524e: a4 2e mov r10, r20 15250: 4d e0 ldi r20, 0x0D ; 13 15252: b4 2e mov r11, r20 - `Y` - Steps per mm for the Y drive - `Z` - Steps per mm for the Z drive - `E` - Steps per mm for the extruder drive */ case 92: for(int8_t i=0; i < NUM_AXIS; i++) 15254: 10 e0 ldi r17, 0x00 ; 0 { if(code_seen(axis_codes[i])) 15256: f4 01 movw r30, r8 15258: 81 91 ld r24, Z+ 1525a: 4f 01 movw r8, r30 1525c: 0e 94 f5 55 call 0xabea ; 0xabea 15260: 88 23 and r24, r24 15262: 09 f4 brne .+2 ; 0x15266 15264: 67 c0 rjmp .+206 ; 0x15334 { float value = code_value(); 15266: 0e 94 85 5a call 0xb50a ; 0xb50a 1526a: 6b 01 movw r12, r22 1526c: 7c 01 movw r14, r24 if(i == E_AXIS) { // E 1526e: 13 30 cpi r17, 0x03 ; 3 15270: 09 f0 breq .+2 ; 0x15274 15272: 6a c0 rjmp .+212 ; 0x15348 if(value < 20.0) { 15274: 20 e0 ldi r18, 0x00 ; 0 15276: 30 e0 ldi r19, 0x00 ; 0 15278: 40 ea ldi r20, 0xA0 ; 160 1527a: 51 e4 ldi r21, 0x41 ; 65 1527c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 15280: 87 ff sbrs r24, 7 15282: 4e c0 rjmp .+156 ; 0x15320 const float factor = cs.axis_steps_per_mm[E_AXIS] / value; // increase e constants if M92 E14 is given for netfab. 15284: a7 01 movw r20, r14 15286: 96 01 movw r18, r12 15288: 60 91 77 0d lds r22, 0x0D77 ; 0x800d77 1528c: 70 91 78 0d lds r23, 0x0D78 ; 0x800d78 15290: 80 91 79 0d lds r24, 0x0D79 ; 0x800d79 15294: 90 91 7a 0d lds r25, 0x0D7A ; 0x800d7a 15298: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1529c: 2b 01 movw r4, r22 1529e: 3c 01 movw r6, r24 cs.max_jerk[E_AXIS] *= factor; 152a0: ac 01 movw r20, r24 152a2: 9b 01 movw r18, r22 152a4: 60 91 bb 0d lds r22, 0x0DBB ; 0x800dbb 152a8: 70 91 bc 0d lds r23, 0x0DBC ; 0x800dbc 152ac: 80 91 bd 0d lds r24, 0x0DBD ; 0x800dbd 152b0: 90 91 be 0d lds r25, 0x0DBE ; 0x800dbe 152b4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 152b8: 60 93 bb 0d sts 0x0DBB, r22 ; 0x800dbb 152bc: 70 93 bc 0d sts 0x0DBC, r23 ; 0x800dbc 152c0: 80 93 bd 0d sts 0x0DBD, r24 ; 0x800dbd 152c4: 90 93 be 0d sts 0x0DBE, r25 ; 0x800dbe max_feedrate[E_AXIS] *= factor; 152c8: a3 01 movw r20, r6 152ca: 92 01 movw r18, r4 152cc: 60 91 87 0d lds r22, 0x0D87 ; 0x800d87 152d0: 70 91 88 0d lds r23, 0x0D88 ; 0x800d88 152d4: 80 91 89 0d lds r24, 0x0D89 ; 0x800d89 152d8: 90 91 8a 0d lds r25, 0x0D8A ; 0x800d8a 152dc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 152e0: 60 93 87 0d sts 0x0D87, r22 ; 0x800d87 152e4: 70 93 88 0d sts 0x0D88, r23 ; 0x800d88 152e8: 80 93 89 0d sts 0x0D89, r24 ; 0x800d89 152ec: 90 93 8a 0d sts 0x0D8A, r25 ; 0x800d8a max_acceleration_steps_per_s2[E_AXIS] *= factor; 152f0: 60 91 b7 04 lds r22, 0x04B7 ; 0x8004b7 152f4: 70 91 b8 04 lds r23, 0x04B8 ; 0x8004b8 152f8: 80 91 b9 04 lds r24, 0x04B9 ; 0x8004b9 152fc: 90 91 ba 04 lds r25, 0x04BA ; 0x8004ba 15300: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 15304: a3 01 movw r20, r6 15306: 92 01 movw r18, r4 15308: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1530c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 15310: 60 93 b7 04 sts 0x04B7, r22 ; 0x8004b7 15314: 70 93 b8 04 sts 0x04B8, r23 ; 0x8004b8 15318: 80 93 b9 04 sts 0x04B9, r24 ; 0x8004b9 1531c: 90 93 ba 04 sts 0x04BA, r25 ; 0x8004ba } cs.axis_steps_per_mm[E_AXIS] = value; 15320: c0 92 77 0d sts 0x0D77, r12 ; 0x800d77 15324: d0 92 78 0d sts 0x0D78, r13 ; 0x800d78 15328: e0 92 79 0d sts 0x0D79, r14 ; 0x800d79 1532c: f0 92 7a 0d sts 0x0D7A, r15 ; 0x800d7a #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.init(); 15330: 0f 94 dc 6d call 0x2dbb8 ; 0x2dbb8 15334: b4 e0 ldi r27, 0x04 ; 4 15336: ab 0e add r10, r27 15338: b1 1c adc r11, r1 1533a: 1f 5f subi r17, 0xFF ; 255 - `Y` - Steps per mm for the Y drive - `Z` - Steps per mm for the Z drive - `E` - Steps per mm for the extruder drive */ case 92: for(int8_t i=0; i < NUM_AXIS; i++) 1533c: 14 30 cpi r17, 0x04 ; 4 1533e: 09 f0 breq .+2 ; 0x15342 15340: 8a cf rjmp .-236 ; 0x15256 } else { cs.axis_steps_per_mm[i] = value; } } } reset_acceleration_rates(); 15342: 0f 94 a6 3c call 0x2794c ; 0x2794c 15346: 63 ca rjmp .-2874 ; 0x1480e cs.axis_steps_per_mm[E_AXIS] = value; #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.init(); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } else { cs.axis_steps_per_mm[i] = value; 15348: d5 01 movw r26, r10 1534a: 14 96 adiw r26, 0x04 ; 4 1534c: cd 92 st X+, r12 1534e: dd 92 st X+, r13 15350: ed 92 st X+, r14 15352: fc 92 st X, r15 15354: 17 97 sbiw r26, 0x07 ; 7 15356: ee cf rjmp .-36 ; 0x15334 #### Parameters - `S` - Seconds. Default is 2 seconds between "busy" messages */ case 113: if (code_seen('S')) { 15358: 83 e5 ldi r24, 0x53 ; 83 1535a: 0e 94 f5 55 call 0xabea ; 0xabea 1535e: 88 23 and r24, r24 15360: 29 f0 breq .+10 ; 0x1536c host_keepalive_interval = code_value_uint8(); 15362: 0e 94 0a 56 call 0xac14 ; 0xac14 15366: 80 93 32 02 sts 0x0232, r24 ; 0x800232 1536a: 51 ca rjmp .-2910 ; 0x1480e } else { SERIAL_ECHO_START; 1536c: 8e ec ldi r24, 0xCE ; 206 1536e: 91 ea ldi r25, 0xA1 ; 161 15370: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); 15374: c0 90 32 02 lds r12, 0x0232 ; 0x800232 15378: d1 2c mov r13, r1 1537a: f1 2c mov r15, r1 1537c: e1 2c mov r14, r1 void serial_echopair_P(const char *s_P, float v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_P(const char *s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_P(const char *s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } 1537e: 8b e3 ldi r24, 0x3B ; 59 15380: 90 e8 ldi r25, 0x80 ; 128 15382: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 15386: 4a e0 ldi r20, 0x0A ; 10 15388: c7 01 movw r24, r14 1538a: b6 01 movw r22, r12 1538c: 0e 94 c5 79 call 0xf38a ; 0xf38a host_keepalive_interval = code_value_uint8(); } else { SERIAL_ECHO_START; SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); SERIAL_PROTOCOLLN(); 15390: 0e 94 bc 7a call 0xf578 ; 0xf578 15394: 3c ca rjmp .-2952 ; 0x1480e */ case 115: // M115 if (code_seen('V')) { // Report the Prusa version number. SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P()); } else if (code_seen('U')) { 15396: 85 e5 ldi r24, 0x55 ; 85 15398: 0e 94 f5 55 call 0xabea ; 0xabea 1539c: 88 23 and r24, r24 1539e: 09 f4 brne .+2 ; 0x153a2 153a0: 5a c0 rjmp .+180 ; 0x15456 // Check the firmware version provided. If the firmware version provided by the U code is higher than the currently running firmware, // pause the print for 30s and ask the user to upgrade the firmware. show_upgrade_dialog_if_version_newer(++ strchr_pointer); 153a2: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb 153a6: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc 153aa: 0f 5f subi r16, 0xFF ; 255 153ac: 1f 4f sbci r17, 0xFF ; 255 153ae: 10 93 bc 04 sts 0x04BC, r17 ; 0x8004bc 153b2: 00 93 bb 04 sts 0x04BB, r16 ; 0x8004bb return false; } bool show_upgrade_dialog_if_version_newer(const char *version_string) { if(oCheckVersion == ClCheckMode::_None) 153b6: 80 91 e9 03 lds r24, 0x03E9 ; 0x8003e9 153ba: 88 23 and r24, r24 153bc: 09 f4 brne .+2 ; 0x153c0 153be: 27 ca rjmp .-2994 ; 0x1480e // 1 - yes, 0 - false, -1 - error; inline int8_t is_provided_version_newer(const char *version_string) { uint16_t ver_gcode[4]; if (! parse_version(version_string, ver_gcode)) 153c0: be 01 movw r22, r28 153c2: 6f 5f subi r22, 0xFF ; 255 153c4: 7f 4f sbci r23, 0xFF ; 255 153c6: c8 01 movw r24, r16 153c8: 0e 94 9b d9 call 0x1b336 ; 0x1b336 153cc: 88 23 and r24, r24 153ce: 09 f4 brne .+2 ; 0x153d2 153d0: 1e ca rjmp .-3012 ; 0x1480e 153d2: 85 e3 ldi r24, 0x35 ; 53 153d4: 97 e8 ldi r25, 0x87 ; 135 153d6: de 01 movw r26, r28 153d8: 11 96 adiw r26, 0x01 ; 1 153da: be 01 movw r22, r28 153dc: 67 5f subi r22, 0xF7 ; 247 153de: 7f 4f sbci r23, 0xFF ; 255 return -1; for (uint8_t i = 0; i < 4; ++ i) { uint16_t v = (uint16_t)pgm_read_word(&FW_VERSION_NR[i]); 153e0: fc 01 movw r30, r24 153e2: 45 91 lpm r20, Z+ 153e4: 54 91 lpm r21, Z if (ver_gcode[i] > v) 153e6: 2d 91 ld r18, X+ 153e8: 3d 91 ld r19, X+ 153ea: 42 17 cp r20, r18 153ec: 53 07 cpc r21, r19 153ee: 10 f4 brcc .+4 ; 0x153f4 153f0: 0c 94 30 bc jmp 0x17860 ; 0x17860 return 1; else if (ver_gcode[i] < v) 153f4: 24 17 cp r18, r20 153f6: 35 07 cpc r19, r21 153f8: 08 f4 brcc .+2 ; 0x153fc 153fa: 09 ca rjmp .-3054 ; 0x1480e 153fc: 02 96 adiw r24, 0x02 ; 2 inline int8_t is_provided_version_newer(const char *version_string) { uint16_t ver_gcode[4]; if (! parse_version(version_string, ver_gcode)) return -1; for (uint8_t i = 0; i < 4; ++ i) 153fe: a6 17 cp r26, r22 15400: b7 07 cpc r27, r23 15402: 71 f7 brne .-36 ; 0x153e0 15404: 04 ca rjmp .-3064 ; 0x1480e if (upgrade) { lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE)); lcd_puts_at_P(0, 2, PSTR("")); for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c) lcd_putc(*c); lcd_puts_at_P(0, 3, _T(MSG_NEW_FIRMWARE_PLEASE_UPGRADE)); 15406: 8f e0 ldi r24, 0x0F ; 15 15408: 99 e3 ldi r25, 0x39 ; 57 1540a: 0e 94 3a 75 call 0xea74 ; 0xea74 1540e: ac 01 movw r20, r24 15410: 63 e0 ldi r22, 0x03 ; 3 15412: 80 e0 ldi r24, 0x00 ; 0 15414: 0e 94 07 70 call 0xe00e ; 0xe00e Sound_MakeCustom(50,1000,false); 15418: 40 e0 ldi r20, 0x00 ; 0 1541a: 68 ee ldi r22, 0xE8 ; 232 1541c: 73 e0 ldi r23, 0x03 ; 3 1541e: 82 e3 ldi r24, 0x32 ; 50 15420: 90 e0 ldi r25, 0x00 ; 0 15422: 0f 94 be 27 call 0x24f7c ; 0x24f7c delay_keep_alive(500); 15426: 84 ef ldi r24, 0xF4 ; 244 15428: 91 e0 ldi r25, 0x01 ; 1 1542a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c Sound_MakeCustom(50,1000,false); 1542e: 40 e0 ldi r20, 0x00 ; 0 15430: 68 ee ldi r22, 0xE8 ; 232 15432: 73 e0 ldi r23, 0x03 ; 3 15434: 82 e3 ldi r24, 0x32 ; 50 15436: 90 e0 ldi r25, 0x00 ; 0 15438: 0f 94 be 27 call 0x24f7c ; 0x24f7c lcd_wait_for_click_delay(30); 1543c: 8e e1 ldi r24, 0x1E ; 30 1543e: 90 e0 ldi r25, 0x00 ; 0 15440: 0e 94 c2 df call 0x1bf84 ; 0x1bf84 lcd_update_enable(true); 15444: 81 e0 ldi r24, 0x01 ; 1 15446: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 1544a: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_update(0); 1544e: 80 e0 ldi r24, 0x00 ; 0 15450: 0e 94 f9 6e call 0xddf2 ; 0xddf2 15454: dc c9 rjmp .-3144 ; 0x1480e } else { char custom_mendel_name[MAX_CUSTOM_MENDEL_NAME_LENGTH]; eeprom_read_block(custom_mendel_name,(char*)EEPROM_CUSTOM_MENDEL_NAME,MAX_CUSTOM_MENDEL_NAME_LENGTH); 15456: 41 e1 ldi r20, 0x11 ; 17 15458: 50 e0 ldi r21, 0x00 ; 0 1545a: 60 e8 ldi r22, 0x80 ; 128 1545c: 7c e0 ldi r23, 0x0C ; 12 1545e: ce 01 movw r24, r28 15460: 01 96 adiw r24, 0x01 ; 1 15462: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 SERIAL_ECHOPGM("FIRMWARE_NAME:Prusa-Firmware "); 15466: 8d e1 ldi r24, 0x1D ; 29 15468: 90 e8 ldi r25, 0x80 ; 128 1546a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(FW_VERSION_STR_P()); 1546e: 8c ee ldi r24, 0xEC ; 236 15470: 98 e8 ldi r25, 0x88 ; 136 15472: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM("+"); 15476: 8b e1 ldi r24, 0x1B ; 27 15478: 90 e8 ldi r25, 0x80 ; 128 1547a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(STR(FW_COMMITNR)); 1547e: 86 e1 ldi r24, 0x16 ; 22 15480: 90 e8 ldi r25, 0x80 ; 128 15482: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM("_"); 15486: 84 e1 ldi r24, 0x14 ; 20 15488: 90 e8 ldi r25, 0x80 ; 128 1548a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(FW_COMMIT_HASH); 1548e: 8a e0 ldi r24, 0x0A ; 10 15490: 90 e8 ldi r25, 0x80 ; 128 15492: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(" based on Marlin FIRMWARE_URL:https://github.com/prusa3d/Prusa-Firmware PROTOCOL_VERSION:"); 15496: 80 eb ldi r24, 0xB0 ; 176 15498: 9f e7 ldi r25, 0x7F ; 127 1549a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(PROTOCOL_VERSION); 1549e: 8c ea ldi r24, 0xAC ; 172 154a0: 9f e7 ldi r25, 0x7F ; 127 154a2: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(" MACHINE_TYPE:"); 154a6: 8d e9 ldi r24, 0x9D ; 157 154a8: 9f e7 ldi r25, 0x7F ; 127 154aa: 0e 94 c4 7a call 0xf588 ; 0xf588 154ae: ce 01 movw r24, r28 154b0: 01 96 adiw r24, 0x01 ; 1 154b2: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_PROTOCOL(custom_mendel_name); SERIAL_ECHOPGM(" EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS)); 154b6: 8b e8 ldi r24, 0x8B ; 139 154b8: 9f e7 ldi r25, 0x7F ; 127 154ba: 0e 94 c4 7a call 0xf588 ; 0xf588 #ifdef MACHINE_UUID SERIAL_ECHOPGM(" UUID:"); SERIAL_ECHOPGM(MACHINE_UUID); #endif //MACHINE_UUID SERIAL_ECHOLNPGM(""); 154be: 8a e8 ldi r24, 0x8A ; 138 154c0: 9f e7 ldi r25, 0x7F ; 127 154c2: 0e 94 bd 7c call 0xf97a ; 0xf97a } #ifdef EXTENDED_CAPABILITIES_REPORT static void cap_line(const char* name, bool ena = false) { printf_P(PSTR("Cap:%S:%c\n"), name, (char)ena + '0'); 154c6: 1f 92 push r1 154c8: 21 e3 ldi r18, 0x31 ; 49 154ca: f2 2e mov r15, r18 154cc: ff 92 push r15 154ce: 83 ef ldi r24, 0xF3 ; 243 154d0: 9d e7 ldi r25, 0x7D ; 125 154d2: 9f 93 push r25 154d4: 8f 93 push r24 154d6: 0c ea ldi r16, 0xAC ; 172 154d8: 1d e7 ldi r17, 0x7D ; 125 154da: 1f 93 push r17 154dc: 0f 93 push r16 154de: 0f 94 a2 a2 call 0x34544 ; 0x34544 154e2: 1f 92 push r1 154e4: ff 92 push r15 154e6: 83 ee ldi r24, 0xE3 ; 227 154e8: 9d e7 ldi r25, 0x7D ; 125 154ea: 9f 93 push r25 154ec: 8f 93 push r24 154ee: 1f 93 push r17 154f0: 0f 93 push r16 154f2: 0f 94 a2 a2 call 0x34544 ; 0x34544 154f6: 1f 92 push r1 154f8: ff 92 push r15 154fa: 8f ec ldi r24, 0xCF ; 207 154fc: 9d e7 ldi r25, 0x7D ; 125 154fe: 9f 93 push r25 15500: 8f 93 push r24 15502: 1f 93 push r17 15504: 0f 93 push r16 15506: 0f 94 a2 a2 call 0x34544 ; 0x34544 1550a: 1f 92 push r1 1550c: ff 92 push r15 1550e: 82 ec ldi r24, 0xC2 ; 194 15510: 9d e7 ldi r25, 0x7D ; 125 15512: 9f 93 push r25 15514: 8f 93 push r24 15516: 1f 93 push r17 15518: 0f 93 push r16 1551a: 0f 94 a2 a2 call 0x34544 ; 0x34544 1551e: 1f 92 push r1 15520: ff 92 push r15 15522: 87 eb ldi r24, 0xB7 ; 183 15524: 9d e7 ldi r25, 0x7D ; 125 15526: 9f 93 push r25 15528: 8f 93 push r24 1552a: 1f 93 push r17 1552c: 0f 93 push r16 1552e: 0f 94 a2 a2 call 0x34544 ; 0x34544 15532: 0f b6 in r0, 0x3f ; 63 15534: f8 94 cli 15536: de bf out 0x3e, r29 ; 62 15538: 0f be out 0x3f, r0 ; 63 1553a: cd bf out 0x3d, r28 ; 61 1553c: 68 c9 rjmp .-3376 ; 0x1480e /*! ### M114 - Get current position M114: Get Current Position */ case 114: gcode_M114(); 1553e: 0e 94 bb 7b call 0xf776 ; 0xf776 15542: 65 c9 rjmp .-3382 ; 0x1480e /*! ### M117 - Display Message M117: Display Message */ case 117: { const char *src = strchr_pointer + 4; // "M117" 15544: e0 91 bb 04 lds r30, 0x04BB ; 0x8004bb 15548: f0 91 bc 04 lds r31, 0x04BC ; 0x8004bc 1554c: cf 01 movw r24, r30 1554e: 04 96 adiw r24, 0x04 ; 4 lcd_setstatus(*src == ' '? src + 1: src); 15550: 24 81 ldd r18, Z+4 ; 0x04 15552: 20 32 cpi r18, 0x20 ; 32 15554: 09 f4 brne .+2 ; 0x15558 15556: 01 96 adiw r24, 0x01 ; 1 15558: 0e 94 e8 de call 0x1bdd0 ; 0x1bdd0 custom_message_type = CustomMsg::M117; 1555c: 87 e0 ldi r24, 0x07 ; 7 1555e: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d 15562: 55 c9 rjmp .-3414 ; 0x1480e - `E1` - Prepend echo: to the message. Some hosts will display echo messages differently when preceded by echo:. - `String` - Message string. If omitted, a blank line will be sent. */ case 118: { bool hasE = false, hasA = false; char *p = strchr_pointer + 5; 15564: 00 91 bb 04 lds r16, 0x04BB ; 0x8004bb 15568: 10 91 bc 04 lds r17, 0x04BC ; 0x8004bc 1556c: 0b 5f subi r16, 0xFB ; 251 1556e: 1f 4f sbci r17, 0xFF ; 255 15570: 83 e0 ldi r24, 0x03 ; 3 - `A1` - Prepend // to denote a comment or action command. Hosts like OctoPrint can interpret such commands to perform special actions. See your host’s documentation. - `E1` - Prepend echo: to the message. Some hosts will display echo messages differently when preceded by echo:. - `String` - Message string. If omitted, a blank line will be sent. */ case 118: { bool hasE = false, hasA = false; 15572: f1 2c mov r15, r1 15574: 40 e0 ldi r20, 0x00 ; 0 15576: 81 50 subi r24, 0x01 ; 1 char *p = strchr_pointer + 5; for (uint8_t i = 2; i--;) { 15578: e9 f0 breq .+58 ; 0x155b4 // A1, E1, and Pn are always parsed out if (!((p[0] == 'A' || p[0] == 'E') && p[1] == '1')) break; 1557a: d8 01 movw r26, r16 1557c: 9c 91 ld r25, X 1557e: 29 2f mov r18, r25 15580: 2b 7f andi r18, 0xFB ; 251 15582: 21 34 cpi r18, 0x41 ; 65 15584: b9 f4 brne .+46 ; 0x155b4 15586: 11 96 adiw r26, 0x01 ; 1 15588: 2c 91 ld r18, X 1558a: 21 33 cpi r18, 0x31 ; 49 1558c: 99 f4 brne .+38 ; 0x155b4 switch (p[0]) { 1558e: 91 34 cpi r25, 0x41 ; 65 15590: 71 f0 breq .+28 ; 0x155ae 15592: 95 34 cpi r25, 0x45 ; 69 15594: 09 f4 brne .+2 ; 0x15598 case 'A': hasA = true; break; case 'E': hasE = true; break; 15596: 41 e0 ldi r20, 0x01 ; 1 } p += 2; 15598: 98 01 movw r18, r16 1559a: 2e 5f subi r18, 0xFE ; 254 1559c: 3f 4f sbci r19, 0xFF ; 255 1559e: 89 01 movw r16, r18 155a0: 2f 5f subi r18, 0xFF ; 255 155a2: 3f 4f sbci r19, 0xFF ; 255 while (*p == ' ') ++p; 155a4: f8 01 movw r30, r16 155a6: 90 81 ld r25, Z 155a8: 90 32 cpi r25, 0x20 ; 32 155aa: c9 f3 breq .-14 ; 0x1559e 155ac: e4 cf rjmp .-56 ; 0x15576 for (uint8_t i = 2; i--;) { // A1, E1, and Pn are always parsed out if (!((p[0] == 'A' || p[0] == 'E') && p[1] == '1')) break; switch (p[0]) { case 'A': hasA = true; break; 155ae: ff 24 eor r15, r15 155b0: f3 94 inc r15 155b2: f2 cf rjmp .-28 ; 0x15598 } p += 2; while (*p == ' ') ++p; } if (hasE) SERIAL_ECHO_START; 155b4: 44 23 and r20, r20 155b6: 21 f0 breq .+8 ; 0x155c0 155b8: 8e ec ldi r24, 0xCE ; 206 155ba: 91 ea ldi r25, 0xA1 ; 161 155bc: 0e 94 c4 7a call 0xf588 ; 0xf588 if (hasA) SERIAL_ECHOPGM("//"); 155c0: ff 20 and r15, r15 155c2: 21 f0 breq .+8 ; 0x155cc 155c4: 87 e8 ldi r24, 0x87 ; 135 155c6: 9f e7 ldi r25, 0x7F ; 127 155c8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(p); 155cc: c8 01 movw r24, r16 155ce: 0e 94 a1 87 call 0x10f42 ; 0x10f42 155d2: 1d c9 rjmp .-3526 ; 0x1480e SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT SERIAL_PROTOCOLLN(); #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 155d4: 87 e4 ldi r24, 0x47 ; 71 155d6: 95 e6 ldi r25, 0x65 ; 101 155d8: 0c 94 ea 9f jmp 0x13fd4 ; 0x13fd4 SERIAL_PROTOCOLLN(); #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 155dc: 87 e4 ldi r24, 0x47 ; 71 155de: 95 e6 ldi r25, 0x65 ; 101 155e0: 0c 94 f8 9f jmp 0x13ff0 ; 0x13ff0 SERIAL_PROTOCOLLN(); #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MIN); if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 155e4: 87 e4 ldi r24, 0x47 ; 71 155e6: 95 e6 ldi r25, 0x65 ; 101 155e8: 0c 94 06 a0 jmp 0x1400c ; 0x1400c SERIAL_PROTOCOLLN(); #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MAX); if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 155ec: 87 e4 ldi r24, 0x47 ; 71 155ee: 95 e6 ldi r25, 0x65 ; 101 155f0: 0c 94 14 a0 jmp 0x14028 ; 0x14028 E0:3240 RPM PRN1:4560 RPM E0@:255 PRN1@:255 */ case 123: gcode_M123(); 155f4: 0e 94 15 65 call 0xca2a ; 0xca2a 155f8: 0a c9 rjmp .-3564 ; 0x1480e */ case 200: // M200 D set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters). { uint8_t extruder = active_extruder; if(code_seen('T')) { 155fa: 84 e5 ldi r24, 0x54 ; 84 155fc: 0e 94 f5 55 call 0xabea ; 0xabea 15600: 88 23 and r24, r24 15602: 69 f0 breq .+26 ; 0x1561e extruder = code_value_uint8(); 15604: 0e 94 0a 56 call 0xac14 ; 0xac14 if(extruder >= EXTRUDERS) { 15608: 88 23 and r24, r24 1560a: 49 f0 breq .+18 ; 0x1561e SERIAL_ECHO_START; 1560c: 8e ec ldi r24, 0xCE ; 206 1560e: 91 ea ldi r25, 0xA1 ; 161 15610: 0e 94 c4 7a call 0xf588 ; 0xf588 15614: 88 e1 ldi r24, 0x18 ; 24 15616: 95 e6 ldi r25, 0x65 ; 101 15618: 0e 94 95 87 call 0x10f2a ; 0x10f2a 1561c: f8 c8 rjmp .-3600 ; 0x1480e SERIAL_ECHO(_n("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER break; } } if(code_seen('D')) { 1561e: 84 e4 ldi r24, 0x44 ; 68 15620: 0e 94 f5 55 call 0xabea ; 0xabea 15624: 88 23 and r24, r24 15626: 09 f4 brne .+2 ; 0x1562a 15628: f2 c8 rjmp .-3612 ; 0x1480e float diameter = code_value(); 1562a: 0e 94 85 5a call 0xb50a ; 0xb50a if (diameter == 0.0) { 1562e: 20 e0 ldi r18, 0x00 ; 0 15630: 30 e0 ldi r19, 0x00 ; 0 15632: a9 01 movw r20, r18 15634: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 15638: 81 11 cpse r24, r1 1563a: 05 c0 rjmp .+10 ; 0x15646 // setting any extruder filament size disables volumetric on the assumption that // slicers either generate in extruder values as cubic mm or as as filament feeds // for all extruders cs.volumetric_enabled = false; 1563c: 10 92 fe 0d sts 0x0DFE, r1 ; 0x800dfe } } else { //reserved for setting filament diameter via UFID or filament measuring device break; } calculate_extruder_multipliers(); 15640: 0e 94 4a 64 call 0xc894 ; 0xc894 15644: e4 c8 rjmp .-3640 ; 0x1480e // setting any extruder filament size disables volumetric on the assumption that // slicers either generate in extruder values as cubic mm or as as filament feeds // for all extruders cs.volumetric_enabled = false; } else { cs.filament_size[extruder] = code_value(); 15646: 0e 94 85 5a call 0xb50a ; 0xb50a 1564a: 6b 01 movw r12, r22 1564c: 7c 01 movw r14, r24 // make sure all extruders have some sane value for the filament size cs.filament_size[0] = (cs.filament_size[0] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[0]); 1564e: 20 e0 ldi r18, 0x00 ; 0 15650: 30 e0 ldi r19, 0x00 ; 0 15652: a9 01 movw r20, r18 15654: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 15658: 81 11 cpse r24, r1 1565a: 06 c0 rjmp .+12 ; 0x15668 1565c: c1 2c mov r12, r1 1565e: d1 2c mov r13, r1 15660: 90 ee ldi r25, 0xE0 ; 224 15662: e9 2e mov r14, r25 15664: 9f e3 ldi r25, 0x3F ; 63 15666: f9 2e mov r15, r25 15668: c0 92 ff 0d sts 0x0DFF, r12 ; 0x800dff 1566c: d0 92 00 0e sts 0x0E00, r13 ; 0x800e00 15670: e0 92 01 0e sts 0x0E01, r14 ; 0x800e01 15674: f0 92 02 0e sts 0x0E02, r15 ; 0x800e02 cs.filament_size[1] = (cs.filament_size[1] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[1]); #if EXTRUDERS > 2 cs.filament_size[2] = (cs.filament_size[2] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[2]); #endif #endif cs.volumetric_enabled = true; 15678: 81 e0 ldi r24, 0x01 ; 1 1567a: 80 93 fe 0d sts 0x0DFE, r24 ; 0x800dfe 1567e: e0 cf rjmp .-64 ; 0x15640 15680: 04 ec ldi r16, 0xC4 ; 196 15682: 12 e0 ldi r17, 0x02 ; 2 15684: f7 e6 ldi r31, 0x67 ; 103 15686: ef 2e mov r14, r31 15688: fd e0 ldi r31, 0x0D ; 13 1568a: ff 2e mov r15, r31 1568c: a8 ec ldi r26, 0xC8 ; 200 1568e: ca 2e mov r12, r26 15690: a2 e0 ldi r26, 0x02 ; 2 15692: da 2e mov r13, r26 - `E` - Maximum feedrate for extruder drives */ case 203: // M203 max feedrate mm/sec for (uint8_t i = 0; i < NUM_AXIS; i++) { if (code_seen(axis_codes[i])) 15694: d8 01 movw r26, r16 15696: 8d 91 ld r24, X+ 15698: 8d 01 movw r16, r26 1569a: 0e 94 f5 55 call 0xabea ; 0xabea 1569e: 88 23 and r24, r24 156a0: 39 f0 breq .+14 ; 0x156b0 { float val = code_value(); 156a2: 0e 94 85 5a call 0xb50a ; 0xb50a val_silent = SILENT_MAX_FEEDRATE_XY; } cs.max_feedrate_normal[i] = val; cs.max_feedrate_silent[i] = val_silent; #else //TMC2130 max_feedrate[i] = val; 156a6: f7 01 movw r30, r14 156a8: 64 8b std Z+20, r22 ; 0x14 156aa: 75 8b std Z+21, r23 ; 0x15 156ac: 86 8b std Z+22, r24 ; 0x16 156ae: 97 8b std Z+23, r25 ; 0x17 156b0: f4 e0 ldi r31, 0x04 ; 4 156b2: ef 0e add r14, r31 156b4: f1 1c adc r15, r1 - `Y` - Maximum feedrate for Y axis - `Z` - Maximum feedrate for Z axis - `E` - Maximum feedrate for extruder drives */ case 203: // M203 max feedrate mm/sec for (uint8_t i = 0; i < NUM_AXIS; i++) 156b6: c0 16 cp r12, r16 156b8: d1 06 cpc r13, r17 156ba: 61 f7 brne .-40 ; 0x15694 156bc: a8 c8 rjmp .-3760 ; 0x1480e - `R` - filmanent only moves - `T` - travel moves (as of now T is ignored) */ case 204: { if(code_seen('S')) { 156be: 83 e5 ldi r24, 0x53 ; 83 156c0: 0e 94 f5 55 call 0xabea ; 0xabea 156c4: 88 23 and r24, r24 156c6: 19 f1 breq .+70 ; 0x1570e // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware, // and it is also generated by Slic3r to control acceleration per extrusion type // (there is a separate acceleration settings in Slicer for perimeter, first layer etc). cs.acceleration = cs.travel_acceleration = code_value(); 156c8: 0e 94 85 5a call 0xb50a ; 0xb50a 156cc: 60 93 27 0e sts 0x0E27, r22 ; 0x800e27 156d0: 70 93 28 0e sts 0x0E28, r23 ; 0x800e28 156d4: 80 93 29 0e sts 0x0E29, r24 ; 0x800e29 156d8: 90 93 2a 0e sts 0x0E2A, r25 ; 0x800e2a 156dc: 60 93 9b 0d sts 0x0D9B, r22 ; 0x800d9b 156e0: 70 93 9c 0d sts 0x0D9C, r23 ; 0x800d9c 156e4: 80 93 9d 0d sts 0x0D9D, r24 ; 0x800d9d 156e8: 90 93 9e 0d sts 0x0D9E, r25 ; 0x800d9e // Interpret the T value as retract acceleration in the old Marlin format. if(code_seen('T')) 156ec: 84 e5 ldi r24, 0x54 ; 84 156ee: 0e 94 f5 55 call 0xabea ; 0xabea 156f2: 88 23 and r24, r24 156f4: 09 f4 brne .+2 ; 0x156f8 156f6: 8b c8 rjmp .-3818 ; 0x1480e cs.retract_acceleration = code_value(); 156f8: 0e 94 85 5a call 0xb50a ; 0xb50a 156fc: 60 93 9f 0d sts 0x0D9F, r22 ; 0x800d9f 15700: 70 93 a0 0d sts 0x0DA0, r23 ; 0x800da0 15704: 80 93 a1 0d sts 0x0DA1, r24 ; 0x800da1 15708: 90 93 a2 0d sts 0x0DA2, r25 ; 0x800da2 1570c: 80 c8 rjmp .-3840 ; 0x1480e } else { // New acceleration format, compatible with the upstream Marlin. if(code_seen('P')) 1570e: 80 e5 ldi r24, 0x50 ; 80 15710: 0e 94 f5 55 call 0xabea ; 0xabea 15714: 88 23 and r24, r24 15716: 51 f0 breq .+20 ; 0x1572c cs.acceleration = code_value(); 15718: 0e 94 85 5a call 0xb50a ; 0xb50a 1571c: 60 93 9b 0d sts 0x0D9B, r22 ; 0x800d9b 15720: 70 93 9c 0d sts 0x0D9C, r23 ; 0x800d9c 15724: 80 93 9d 0d sts 0x0D9D, r24 ; 0x800d9d 15728: 90 93 9e 0d sts 0x0D9E, r25 ; 0x800d9e if(code_seen('R')) 1572c: 82 e5 ldi r24, 0x52 ; 82 1572e: 0e 94 f5 55 call 0xabea ; 0xabea 15732: 88 23 and r24, r24 15734: 51 f0 breq .+20 ; 0x1574a cs.retract_acceleration = code_value(); 15736: 0e 94 85 5a call 0xb50a ; 0xb50a 1573a: 60 93 9f 0d sts 0x0D9F, r22 ; 0x800d9f 1573e: 70 93 a0 0d sts 0x0DA0, r23 ; 0x800da0 15742: 80 93 a1 0d sts 0x0DA1, r24 ; 0x800da1 15746: 90 93 a2 0d sts 0x0DA2, r25 ; 0x800da2 if(code_seen('T')) 1574a: 84 e5 ldi r24, 0x54 ; 84 1574c: 0e 94 f5 55 call 0xabea ; 0xabea 15750: 88 23 and r24, r24 15752: 09 f4 brne .+2 ; 0x15756 15754: 5c c8 rjmp .-3912 ; 0x1480e cs.travel_acceleration = code_value(); 15756: 0e 94 85 5a call 0xb50a ; 0xb50a 1575a: 60 93 27 0e sts 0x0E27, r22 ; 0x800e27 1575e: 70 93 28 0e sts 0x0E28, r23 ; 0x800e28 15762: 80 93 29 0e sts 0x0E29, r24 ; 0x800e29 15766: 90 93 2a 0e sts 0x0E2A, r25 ; 0x800e2a 1576a: 51 c8 rjmp .-3934 ; 0x1480e 1576c: 04 ec ldi r16, 0xC4 ; 196 1576e: 12 e0 ldi r17, 0x02 ; 2 15770: ef eb ldi r30, 0xBF ; 191 15772: ee 2e mov r14, r30 15774: ed e0 ldi r30, 0x0D ; 13 15776: fe 2e mov r15, r30 - `Z` - Z axis offset */ case 206: for(uint8_t i=0; i < 3; i++) { if(code_seen(axis_codes[i])) cs.add_homing[i] = code_value(); 15778: d8 01 movw r26, r16 1577a: 8d 91 ld r24, X+ 1577c: 8d 01 movw r16, r26 1577e: 0e 94 f5 55 call 0xabea ; 0xabea 15782: 88 23 and r24, r24 15784: 39 f0 breq .+14 ; 0x15794 15786: 0e 94 85 5a call 0xb50a ; 0xb50a 1578a: f7 01 movw r30, r14 1578c: 60 83 st Z, r22 1578e: 71 83 std Z+1, r23 ; 0x01 15790: 82 83 std Z+2, r24 ; 0x02 15792: 93 83 std Z+3, r25 ; 0x03 15794: f4 e0 ldi r31, 0x04 ; 4 15796: ef 0e add r14, r31 15798: f1 1c adc r15, r1 - `X` - X axis offset - `Y` - Y axis offset - `Z` - Z axis offset */ case 206: for(uint8_t i=0; i < 3; i++) 1579a: 22 e0 ldi r18, 0x02 ; 2 1579c: 07 3c cpi r16, 0xC7 ; 199 1579e: 12 07 cpc r17, r18 157a0: 59 f7 brne .-42 ; 0x15778 157a2: 35 c8 rjmp .-3990 ; 0x1480e - `F` - retraction feedrate, in mm/min - `Z` - additional zlift/hop */ case 207: //M207 - set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop] { if(code_seen('S')) 157a4: 83 e5 ldi r24, 0x53 ; 83 157a6: 0e 94 f5 55 call 0xabea ; 0xabea 157aa: 88 23 and r24, r24 157ac: 51 f0 breq .+20 ; 0x157c2 { cs.retract_length = code_value() ; 157ae: 0e 94 85 5a call 0xb50a ; 0xb50a 157b2: 60 93 ea 0d sts 0x0DEA, r22 ; 0x800dea 157b6: 70 93 eb 0d sts 0x0DEB, r23 ; 0x800deb 157ba: 80 93 ec 0d sts 0x0DEC, r24 ; 0x800dec 157be: 90 93 ed 0d sts 0x0DED, r25 ; 0x800ded } if(code_seen('F')) 157c2: 86 e4 ldi r24, 0x46 ; 70 157c4: 0e 94 f5 55 call 0xabea ; 0xabea 157c8: 88 23 and r24, r24 157ca: 61 f0 breq .+24 ; 0x157e4 { cs.retract_feedrate = get_feedrate_mm_s(code_value()); 157cc: 0e 94 85 5a call 0xb50a ; 0xb50a 157d0: 0e 94 45 65 call 0xca8a ; 0xca8a 157d4: 60 93 ee 0d sts 0x0DEE, r22 ; 0x800dee 157d8: 70 93 ef 0d sts 0x0DEF, r23 ; 0x800def 157dc: 80 93 f0 0d sts 0x0DF0, r24 ; 0x800df0 157e0: 90 93 f1 0d sts 0x0DF1, r25 ; 0x800df1 } if(code_seen('Z')) 157e4: 8a e5 ldi r24, 0x5A ; 90 157e6: 0e 94 f5 55 call 0xabea ; 0xabea 157ea: 88 23 and r24, r24 157ec: 09 f4 brne .+2 ; 0x157f0 157ee: 0f c8 rjmp .-4066 ; 0x1480e { cs.retract_zlift = code_value() ; 157f0: 0e 94 85 5a call 0xb50a ; 0xb50a 157f4: 60 93 f2 0d sts 0x0DF2, r22 ; 0x800df2 157f8: 70 93 f3 0d sts 0x0DF3, r23 ; 0x800df3 157fc: 80 93 f4 0d sts 0x0DF4, r24 ; 0x800df4 15800: 90 93 f5 0d sts 0x0DF5, r25 ; 0x800df5 15804: 0c 94 07 a4 jmp 0x1480e ; 0x1480e #### Parameters - `S` - 1=true or 0=false */ case 209: // M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction. { if(code_seen('S')) 15808: 83 e5 ldi r24, 0x53 ; 83 1580a: 0e 94 f5 55 call 0xabea ; 0xabea 1580e: 88 23 and r24, r24 15810: 11 f4 brne .+4 ; 0x15816 15812: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { switch(code_value_uint8()) 15816: 0e 94 0a 56 call 0xac14 ; 0xac14 1581a: 88 23 and r24, r24 1581c: c1 f0 breq .+48 ; 0x1584e 1581e: 81 30 cpi r24, 0x01 ; 1 15820: e1 f0 breq .+56 ; 0x1585a #if EXTRUDERS > 2 retracted[2]=false; #endif }break; default: SERIAL_ECHO_START; 15822: 8e ec ldi r24, 0xCE ; 206 15824: 91 ea ldi r25, 0xA1 ; 161 15826: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); 1582a: 85 e0 ldi r24, 0x05 ; 5 1582c: 95 e6 ldi r25, 0x65 ; 101 1582e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); 15832: 80 91 38 12 lds r24, 0x1238 ; 0x801238 15836: 90 91 39 12 lds r25, 0x1239 ; 0x801239 1583a: 82 5b subi r24, 0xB2 ; 178 1583c: 9f 4e sbci r25, 0xEF ; 239 1583e: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHOLNPGM("\"(1)"); 15842: 82 e8 ldi r24, 0x82 ; 130 15844: 9f e7 ldi r25, 0x7F ; 127 15846: 0e 94 bd 7c call 0xf97a ; 0xf97a 1584a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { switch(code_value_uint8()) { case 0: { cs.autoretract_enabled=false; 1584e: 10 92 e9 0d sts 0x0DE9, r1 ; 0x800de9 retracted[0]=false; 15852: 10 92 1b 06 sts 0x061B, r1 ; 0x80061b 15856: 0c 94 07 a4 jmp 0x1480e ; 0x1480e retracted[2]=false; #endif }break; case 1: { cs.autoretract_enabled=true; 1585a: 80 93 e9 0d sts 0x0DE9, r24 ; 0x800de9 retracted[0]=false; 1585e: 10 92 1b 06 sts 0x061B, r1 ; 0x80061b 15862: 0c 94 07 a4 jmp 0x1480e ; 0x1480e greater than or less than the minimum and maximum segment length. Set to 0 to disable. */ case 214: { // Extract all possible parameters if they appear float p = code_seen('P') ? code_value() : cs.mm_per_arc_segment; 15866: 40 90 2b 0e lds r4, 0x0E2B ; 0x800e2b 1586a: 50 90 2c 0e lds r5, 0x0E2C ; 0x800e2c 1586e: 60 90 2d 0e lds r6, 0x0E2D ; 0x800e2d 15872: 70 90 2e 0e lds r7, 0x0E2E ; 0x800e2e 15876: 0c 94 37 a1 jmp 0x1426e ; 0x1426e float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment; 1587a: 80 90 2f 0e lds r8, 0x0E2F ; 0x800e2f 1587e: 90 90 30 0e lds r9, 0x0E30 ; 0x800e30 15882: a0 90 31 0e lds r10, 0x0E31 ; 0x800e31 15886: b0 90 32 0e lds r11, 0x0E32 ; 0x800e32 1588a: 0c 94 42 a1 jmp 0x14284 ; 0x14284 - `R` - Restore previous speed factor */ case 220: { bool codesWereSeen = false; if (code_seen('B')) //backup current speed factor 1588e: 82 e4 ldi r24, 0x42 ; 66 15890: 0e 94 f5 55 call 0xabea ; 0xabea 15894: 18 2f mov r17, r24 15896: 88 23 and r24, r24 15898: 41 f0 breq .+16 ; 0x158aa { saved_feedmultiply_mm = feedmultiply; 1589a: 80 91 8e 02 lds r24, 0x028E ; 0x80028e 1589e: 90 91 8f 02 lds r25, 0x028F ; 0x80028f 158a2: 90 93 31 02 sts 0x0231, r25 ; 0x800231 158a6: 80 93 30 02 sts 0x0230, r24 ; 0x800230 codesWereSeen = true; } if (code_seen('S')) 158aa: 83 e5 ldi r24, 0x53 ; 83 158ac: 0e 94 f5 55 call 0xabea ; 0xabea 158b0: 08 2f mov r16, r24 158b2: 88 23 and r24, r24 158b4: 39 f0 breq .+14 ; 0x158c4 { feedmultiply = code_value_short(); 158b6: 0e 94 17 56 call 0xac2e ; 0xac2e 158ba: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f 158be: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e codesWereSeen = true; 158c2: 10 2f mov r17, r16 } if (code_seen('R')) //restore previous feedmultiply 158c4: 82 e5 ldi r24, 0x52 ; 82 158c6: 0e 94 f5 55 call 0xabea ; 0xabea 158ca: 88 23 and r24, r24 158cc: 51 f0 breq .+20 ; 0x158e2 { feedmultiply = saved_feedmultiply_mm; 158ce: 80 91 30 02 lds r24, 0x0230 ; 0x800230 158d2: 90 91 31 02 lds r25, 0x0231 ; 0x800231 158d6: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f 158da: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e 158de: 0c 94 07 a4 jmp 0x1480e ; 0x1480e codesWereSeen = true; } if (!codesWereSeen) 158e2: 11 11 cpse r17, r1 158e4: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { printf_P(PSTR("%i%%\n"), feedmultiply); 158e8: 80 91 8f 02 lds r24, 0x028F ; 0x80028f 158ec: 8f 93 push r24 158ee: 80 91 8e 02 lds r24, 0x028E ; 0x80028e 158f2: 8f 93 push r24 158f4: 8c e7 ldi r24, 0x7C ; 124 158f6: 9f e7 ldi r25, 0x7F ; 127 158f8: 9f 93 push r25 158fa: 8f 93 push r24 158fc: 0f 94 a2 a2 call 0x34544 ; 0x34544 15900: 0f 90 pop r0 15902: 0f 90 pop r0 15904: 0f 90 pop r0 15906: 0f 90 pop r0 15908: 0c 94 07 a4 jmp 0x1480e ; 0x1480e #### Parameters - `S` - Extrude factor override percentage (0..100 or higher), default 100% */ case 221: { if (code_seen('S')) 1590c: 83 e5 ldi r24, 0x53 ; 83 1590e: 0e 94 f5 55 call 0xabea ; 0xabea 15912: 88 23 and r24, r24 15914: 51 f0 breq .+20 ; 0x1592a { extrudemultiply = code_value_short(); 15916: 0e 94 17 56 call 0xac2e ; 0xac2e 1591a: 90 93 76 02 sts 0x0276, r25 ; 0x800276 1591e: 80 93 75 02 sts 0x0275, r24 ; 0x800275 calculate_extruder_multipliers(); 15922: 0e 94 4a 64 call 0xc894 ; 0xc894 15926: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } else { printf_P(PSTR("%i%%\n"), extrudemultiply); 1592a: 80 91 76 02 lds r24, 0x0276 ; 0x800276 1592e: 8f 93 push r24 15930: 80 91 75 02 lds r24, 0x0275 ; 0x800275 15934: 8f 93 push r24 15936: 86 e7 ldi r24, 0x76 ; 118 15938: 9f e7 ldi r25, 0x7F ; 127 1593a: 9f 93 push r25 1593c: 8f 93 push r24 1593e: 0f 94 a2 a2 call 0x34544 ; 0x34544 15942: 0f 90 pop r0 15944: 0f 90 pop r0 15946: 0f 90 pop r0 15948: 0f 90 pop r0 1594a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e - `P` - pin number - `S` - pin state */ case 226: { if(code_seen('P')){ 1594e: 80 e5 ldi r24, 0x50 ; 80 15950: 0e 94 f5 55 call 0xabea ; 0xabea 15954: 88 23 and r24, r24 15956: 11 f4 brne .+4 ; 0x1595c 15958: 0c 94 07 a4 jmp 0x1480e ; 0x1480e int pin_number = code_value_short(); // pin number 1595c: 0e 94 17 56 call 0xac2e ; 0xac2e 15960: 7c 01 movw r14, r24 int pin_state = -1; // required pin state - default is inverted if(code_seen('S')) pin_state = code_value_short(); // required pin state 15962: 83 e5 ldi r24, 0x53 ; 83 15964: 0e 94 f5 55 call 0xabea ; 0xabea */ case 226: { if(code_seen('P')){ int pin_number = code_value_short(); // pin number int pin_state = -1; // required pin state - default is inverted 15968: 0f ef ldi r16, 0xFF ; 255 1596a: 1f ef ldi r17, 0xFF ; 255 if(code_seen('S')) pin_state = code_value_short(); // required pin state 1596c: 88 23 and r24, r24 1596e: 19 f0 breq .+6 ; 0x15976 15970: 0e 94 17 56 call 0xac2e ; 0xac2e 15974: 8c 01 movw r16, r24 if(pin_state >= -1 && pin_state <= 1){ 15976: c8 01 movw r24, r16 15978: 01 96 adiw r24, 0x01 ; 1 1597a: 03 97 sbiw r24, 0x03 ; 3 1597c: 10 f0 brcs .+4 ; 0x15982 1597e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 15982: ea e6 ldi r30, 0x6A ; 106 15984: f0 e8 ldi r31, 0x80 ; 128 15986: 26 e8 ldi r18, 0x86 ; 134 15988: 30 e8 ldi r19, 0x80 ; 128 for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++) { if (((int8_t)pgm_read_byte(&sensitive_pins[i]) == pin_number)) 1598a: 84 91 lpm r24, Z 1598c: 08 2e mov r0, r24 1598e: 00 0c add r0, r0 15990: 99 0b sbc r25, r25 15992: e8 16 cp r14, r24 15994: f9 06 cpc r15, r25 15996: 11 f4 brne .+4 ; 0x1599c 15998: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 1599c: 31 96 adiw r30, 0x01 ; 1 if(code_seen('S')) pin_state = code_value_short(); // required pin state if(pin_state >= -1 && pin_state <= 1){ for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++) 1599e: 2e 17 cp r18, r30 159a0: 3f 07 cpc r19, r31 159a2: 99 f7 brne .-26 ; 0x1598a pin_number = -1; break; } } if (pin_number > -1) 159a4: f7 fe sbrs r15, 7 159a6: 02 c0 rjmp .+4 ; 0x159ac 159a8: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { int target = LOW; st_synchronize(); 159ac: 0f 94 fb 1a call 0x235f6 ; 0x235f6 pinMode(pin_number, INPUT); 159b0: de 2c mov r13, r14 159b2: 60 e0 ldi r22, 0x00 ; 0 159b4: 8e 2d mov r24, r14 159b6: 0e 94 3d d3 call 0x1a67a ; 0x1a67a switch(pin_state){ 159ba: 0f 3f cpi r16, 0xFF ; 255 159bc: 10 07 cpc r17, r16 159be: b1 f0 breq .+44 ; 0x159ec 159c0: 01 30 cpi r16, 0x01 ; 1 159c2: 11 05 cpc r17, r1 159c4: 11 f0 breq .+4 ; 0x159ca } } if (pin_number > -1) { int target = LOW; 159c6: 10 e0 ldi r17, 0x00 ; 0 159c8: 00 e0 ldi r16, 0x00 ; 0 case -1: target = !digitalRead(pin_number); break; } while(digitalRead(pin_number) != target){ 159ca: 8d 2d mov r24, r13 159cc: 0e 94 e6 d2 call 0x1a5cc ; 0x1a5cc 159d0: 80 17 cp r24, r16 159d2: 91 07 cpc r25, r17 159d4: 11 f4 brne .+4 ; 0x159da 159d6: 0c 94 07 a4 jmp 0x1480e ; 0x1480e manage_heater(); 159da: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 159de: 80 e0 ldi r24, 0x00 ; 0 159e0: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 159e4: 80 e0 ldi r24, 0x00 ; 0 159e6: 0e 94 f9 6e call 0xddf2 ; 0xddf2 159ea: ef cf rjmp .-34 ; 0x159ca case 0: target = LOW; break; case -1: target = !digitalRead(pin_number); 159ec: 8e 2d mov r24, r14 159ee: 0e 94 e6 d2 call 0x1a5cc ; 0x1a5cc 159f2: 31 e0 ldi r19, 0x01 ; 1 159f4: 20 e0 ldi r18, 0x00 ; 0 159f6: 89 2b or r24, r25 159f8: 09 f0 breq .+2 ; 0x159fc 159fa: 30 e0 ldi r19, 0x00 ; 0 159fc: 03 2f mov r16, r19 159fe: 12 2f mov r17, r18 15a00: e4 cf rjmp .-56 ; 0x159ca case 300: // M300 { uint16_t beepP = code_seen('P') ? min(code_value(), 3500) : 1000; uint16_t beepS; if (!code_seen('S')) beepS = 0; 15a02: 70 e0 ldi r23, 0x00 ; 0 15a04: 60 e0 ldi r22, 0x00 ; 0 // handle S0 as a pause _delay(beepP); break; } } Sound_MakeCustom(beepP, beepS, false); 15a06: 40 e0 ldi r20, 0x00 ; 0 15a08: c8 01 movw r24, r16 15a0a: 0f 94 be 27 call 0x24f7c ; 0x24f7c 15a0e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e - `I` - integral (Ki) - `D` - derivative (Kd) */ case 301: { if(code_seen('P')) cs.Kp = code_value(); 15a12: 80 e5 ldi r24, 0x50 ; 80 15a14: 0e 94 f5 55 call 0xabea ; 0xabea 15a18: 88 23 and r24, r24 15a1a: 51 f0 breq .+20 ; 0x15a30 15a1c: 0e 94 85 5a call 0xb50a ; 0xb50a 15a20: 60 93 cf 0d sts 0x0DCF, r22 ; 0x800dcf 15a24: 70 93 d0 0d sts 0x0DD0, r23 ; 0x800dd0 15a28: 80 93 d1 0d sts 0x0DD1, r24 ; 0x800dd1 15a2c: 90 93 d2 0d sts 0x0DD2, r25 ; 0x800dd2 if(code_seen('I')) cs.Ki = scalePID_i(code_value()); 15a30: 89 e4 ldi r24, 0x49 ; 73 15a32: 0e 94 f5 55 call 0xabea ; 0xabea 15a36: 88 23 and r24, r24 15a38: 81 f0 breq .+32 ; 0x15a5a 15a3a: 0e 94 85 5a call 0xb50a ; 0xb50a #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15a3e: 2c ea ldi r18, 0xAC ; 172 15a40: 35 ec ldi r19, 0xC5 ; 197 15a42: 47 e2 ldi r20, 0x27 ; 39 15a44: 5e e3 ldi r21, 0x3E ; 62 15a46: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 15a4a: 60 93 d3 0d sts 0x0DD3, r22 ; 0x800dd3 15a4e: 70 93 d4 0d sts 0x0DD4, r23 ; 0x800dd4 15a52: 80 93 d5 0d sts 0x0DD5, r24 ; 0x800dd5 15a56: 90 93 d6 0d sts 0x0DD6, r25 ; 0x800dd6 if(code_seen('D')) cs.Kd = scalePID_d(code_value()); 15a5a: 84 e4 ldi r24, 0x44 ; 68 15a5c: 0e 94 f5 55 call 0xabea ; 0xabea 15a60: 88 23 and r24, r24 15a62: 81 f0 breq .+32 ; 0x15a84 15a64: 0e 94 85 5a call 0xb50a ; 0xb50a } float unscalePID_i(float i) { return i/PID_dT; 15a68: 2c ea ldi r18, 0xAC ; 172 15a6a: 35 ec ldi r19, 0xC5 ; 197 15a6c: 47 e2 ldi r20, 0x27 ; 39 15a6e: 5e e3 ldi r21, 0x3E ; 62 15a70: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15a74: 60 93 d7 0d sts 0x0DD7, r22 ; 0x800dd7 15a78: 70 93 d8 0d sts 0x0DD8, r23 ; 0x800dd8 15a7c: 80 93 d9 0d sts 0x0DD9, r24 ; 0x800dd9 15a80: 90 93 da 0d sts 0x0DDA, r25 ; 0x800dda updatePID(); 15a84: 0f 94 40 17 call 0x22e80 ; 0x22e80 SERIAL_PROTOCOLRPGM(MSG_OK); 15a88: 80 ef ldi r24, 0xF0 ; 240 15a8a: 99 e6 ldi r25, 0x69 ; 105 15a8c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLPGM(" p:"); 15a90: 82 e7 ldi r24, 0x72 ; 114 15a92: 9f e7 ldi r25, 0x7F ; 127 15a94: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 15a98: 60 91 cf 0d lds r22, 0x0DCF ; 0x800dcf 15a9c: 70 91 d0 0d lds r23, 0x0DD0 ; 0x800dd0 15aa0: 80 91 d1 0d lds r24, 0x0DD1 ; 0x800dd1 15aa4: 90 91 d2 0d lds r25, 0x0DD2 ; 0x800dd2 15aa8: 42 e0 ldi r20, 0x02 ; 2 15aaa: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(cs.Kp); SERIAL_PROTOCOLPGM(" i:"); 15aae: 8e e6 ldi r24, 0x6E ; 110 15ab0: 9f e7 ldi r25, 0x7F ; 127 15ab2: 0e 94 c4 7a call 0xf588 ; 0xf588 15ab6: 2c ea ldi r18, 0xAC ; 172 15ab8: 35 ec ldi r19, 0xC5 ; 197 15aba: 47 e2 ldi r20, 0x27 ; 39 15abc: 5e e3 ldi r21, 0x3E ; 62 15abe: 60 91 d3 0d lds r22, 0x0DD3 ; 0x800dd3 15ac2: 70 91 d4 0d lds r23, 0x0DD4 ; 0x800dd4 15ac6: 80 91 d5 0d lds r24, 0x0DD5 ; 0x800dd5 15aca: 90 91 d6 0d lds r25, 0x0DD6 ; 0x800dd6 15ace: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15ad2: 42 e0 ldi r20, 0x02 ; 2 15ad4: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(unscalePID_i(cs.Ki)); SERIAL_PROTOCOLPGM(" d:"); 15ad8: 8a e6 ldi r24, 0x6A ; 106 15ada: 9f e7 ldi r25, 0x7F ; 127 15adc: 0e 94 c4 7a call 0xf588 ; 0xf588 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15ae0: 2c ea ldi r18, 0xAC ; 172 15ae2: 35 ec ldi r19, 0xC5 ; 197 15ae4: 47 e2 ldi r20, 0x27 ; 39 15ae6: 5e e3 ldi r21, 0x3E ; 62 15ae8: 60 91 d7 0d lds r22, 0x0DD7 ; 0x800dd7 15aec: 70 91 d8 0d lds r23, 0x0DD8 ; 0x800dd8 15af0: 80 91 d9 0d lds r24, 0x0DD9 ; 0x800dd9 15af4: 90 91 da 0d lds r25, 0x0DDA ; 0x800dda 15af8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> SERIAL_PROTOCOLLN(unscalePID_d(cs.Kd)); 15afc: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 15b00: 0c 94 07 a4 jmp 0x1480e ; 0x1480e - `I` - integral (Ki) - `D` - derivative (Kd) */ case 304: { if(code_seen('P')) cs.bedKp = code_value(); 15b04: 80 e5 ldi r24, 0x50 ; 80 15b06: 0e 94 f5 55 call 0xabea ; 0xabea 15b0a: 88 23 and r24, r24 15b0c: 51 f0 breq .+20 ; 0x15b22 15b0e: 0e 94 85 5a call 0xb50a ; 0xb50a 15b12: 60 93 db 0d sts 0x0DDB, r22 ; 0x800ddb 15b16: 70 93 dc 0d sts 0x0DDC, r23 ; 0x800ddc 15b1a: 80 93 dd 0d sts 0x0DDD, r24 ; 0x800ddd 15b1e: 90 93 de 0d sts 0x0DDE, r25 ; 0x800dde if(code_seen('I')) cs.bedKi = scalePID_i(code_value()); 15b22: 89 e4 ldi r24, 0x49 ; 73 15b24: 0e 94 f5 55 call 0xabea ; 0xabea 15b28: 88 23 and r24, r24 15b2a: 81 f0 breq .+32 ; 0x15b4c 15b2c: 0e 94 85 5a call 0xb50a ; 0xb50a 15b30: 2c ea ldi r18, 0xAC ; 172 15b32: 35 ec ldi r19, 0xC5 ; 197 15b34: 47 e2 ldi r20, 0x27 ; 39 15b36: 5e e3 ldi r21, 0x3E ; 62 15b38: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 15b3c: 60 93 df 0d sts 0x0DDF, r22 ; 0x800ddf 15b40: 70 93 e0 0d sts 0x0DE0, r23 ; 0x800de0 15b44: 80 93 e1 0d sts 0x0DE1, r24 ; 0x800de1 15b48: 90 93 e2 0d sts 0x0DE2, r25 ; 0x800de2 if(code_seen('D')) cs.bedKd = scalePID_d(code_value()); 15b4c: 84 e4 ldi r24, 0x44 ; 68 15b4e: 0e 94 f5 55 call 0xabea ; 0xabea 15b52: 88 23 and r24, r24 15b54: 81 f0 breq .+32 ; 0x15b76 15b56: 0e 94 85 5a call 0xb50a ; 0xb50a } float unscalePID_i(float i) { return i/PID_dT; 15b5a: 2c ea ldi r18, 0xAC ; 172 15b5c: 35 ec ldi r19, 0xC5 ; 197 15b5e: 47 e2 ldi r20, 0x27 ; 39 15b60: 5e e3 ldi r21, 0x3E ; 62 15b62: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15b66: 60 93 e3 0d sts 0x0DE3, r22 ; 0x800de3 15b6a: 70 93 e4 0d sts 0x0DE4, r23 ; 0x800de4 15b6e: 80 93 e5 0d sts 0x0DE5, r24 ; 0x800de5 15b72: 90 93 e6 0d sts 0x0DE6, r25 ; 0x800de6 updatePID(); 15b76: 0f 94 40 17 call 0x22e80 ; 0x22e80 SERIAL_PROTOCOLRPGM(MSG_OK); 15b7a: 80 ef ldi r24, 0xF0 ; 240 15b7c: 99 e6 ldi r25, 0x69 ; 105 15b7e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLPGM(" p:"); 15b82: 86 e6 ldi r24, 0x66 ; 102 15b84: 9f e7 ldi r25, 0x7F ; 127 15b86: 0e 94 c4 7a call 0xf588 ; 0xf588 15b8a: 60 91 db 0d lds r22, 0x0DDB ; 0x800ddb 15b8e: 70 91 dc 0d lds r23, 0x0DDC ; 0x800ddc 15b92: 80 91 dd 0d lds r24, 0x0DDD ; 0x800ddd 15b96: 90 91 de 0d lds r25, 0x0DDE ; 0x800dde 15b9a: 42 e0 ldi r20, 0x02 ; 2 15b9c: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(cs.bedKp); SERIAL_PROTOCOLPGM(" i:"); 15ba0: 82 e6 ldi r24, 0x62 ; 98 15ba2: 9f e7 ldi r25, 0x7F ; 127 15ba4: 0e 94 c4 7a call 0xf588 ; 0xf588 15ba8: 2c ea ldi r18, 0xAC ; 172 15baa: 35 ec ldi r19, 0xC5 ; 197 15bac: 47 e2 ldi r20, 0x27 ; 39 15bae: 5e e3 ldi r21, 0x3E ; 62 15bb0: 60 91 df 0d lds r22, 0x0DDF ; 0x800ddf 15bb4: 70 91 e0 0d lds r23, 0x0DE0 ; 0x800de0 15bb8: 80 91 e1 0d lds r24, 0x0DE1 ; 0x800de1 15bbc: 90 91 e2 0d lds r25, 0x0DE2 ; 0x800de2 15bc0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15bc4: 42 e0 ldi r20, 0x02 ; 2 15bc6: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL(unscalePID_i(cs.bedKi)); SERIAL_PROTOCOLPGM(" d:"); 15bca: 8e e5 ldi r24, 0x5E ; 94 15bcc: 9f e7 ldi r25, 0x7F ; 127 15bce: 0e 94 c4 7a call 0xf588 ; 0xf588 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15bd2: 2c ea ldi r18, 0xAC ; 172 15bd4: 35 ec ldi r19, 0xC5 ; 197 15bd6: 47 e2 ldi r20, 0x27 ; 39 15bd8: 5e e3 ldi r21, 0x3E ; 62 15bda: 60 91 e3 0d lds r22, 0x0DE3 ; 0x800de3 15bde: 70 91 e4 0d lds r23, 0x0DE4 ; 0x800de4 15be2: 80 91 e5 0d lds r24, 0x0DE5 ; 0x800de5 15be6: 90 91 e6 0d lds r25, 0x0DE6 ; 0x800de6 15bea: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> SERIAL_PROTOCOLLN(unscalePID_d(cs.bedKd)); 15bee: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 15bf2: 0c 94 07 a4 jmp 0x1480e ; 0x1480e - `S` - Cold extrude minimum temperature */ case 302: { int temp = 0; if (code_seen('S')) temp=code_value_short(); 15bf6: 83 e5 ldi r24, 0x53 ; 83 15bf8: 0e 94 f5 55 call 0xabea ; 0xabea 15bfc: 88 23 and r24, r24 15bfe: 41 f0 breq .+16 ; 0x15c10 15c00: 0e 94 17 56 call 0xac2e ; 0xac2e } #ifdef PREVENT_DANGEROUS_EXTRUDE void set_extrude_min_temp(int temp) { extrude_min_temp = temp; 15c04: 90 93 58 02 sts 0x0258, r25 ; 0x800258 15c08: 80 93 57 02 sts 0x0257, r24 ; 0x800257 15c0c: 0c 94 07 a4 jmp 0x1480e ; 0x1480e #### Parameters - `S` - Cold extrude minimum temperature */ case 302: { int temp = 0; 15c10: 90 e0 ldi r25, 0x00 ; 0 15c12: 80 e0 ldi r24, 0x00 ; 0 15c14: f7 cf rjmp .-18 ; 0x15c04 */ case 303: { float temp = 150.0; int e = 0; int c = 5; 15c16: 85 e0 ldi r24, 0x05 ; 5 15c18: 90 e0 ldi r25, 0x00 ; 0 15c1a: 0c 94 19 a2 jmp 0x14432 ; 0x14432 M400 */ case 400: { st_synchronize(); 15c1e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 15c22: 0c 94 07 a4 jmp 0x1480e ; 0x1480e */ case 405: // M405 Enable Filament Sensor { fsensor.setEnabled(1); 15c26: 81 e0 ldi r24, 0x01 ; 1 15c28: 0e 94 90 77 call 0xef20 ; 0xef20 15c2c: 0c 94 07 a4 jmp 0x1480e ; 0x1480e */ case 406: // M406 Disable Filament Sensor { fsensor.setEnabled(0); 15c30: 80 e0 ldi r24, 0x00 ; 0 15c32: 0e 94 90 77 call 0xef20 ; 0xef20 15c36: 0c 94 07 a4 jmp 0x1480e ; 0x1480e M420 */ case 420: // M420 Mesh bed leveling status { gcode_G81_M420(); 15c3a: 0e 94 53 85 call 0x10aa6 ; 0x10aa6 15c3e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e M500 */ case 500: { Config_StoreSettings(); 15c42: 0e 94 7f 87 call 0x10efe ; 0x10efe 15c46: 0c 94 07 a4 jmp 0x1480e ; 0x1480e M502 */ case 502: { Config_ResetDefault(); 15c4a: 0e 94 ee 86 call 0x10ddc ; 0x10ddc 15c4e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e echomagic, echomagic, cs.max_acceleration_mm_per_s2_silent[X_AXIS], cs.max_acceleration_mm_per_s2_silent[Y_AXIS], cs.max_acceleration_mm_per_s2_silent[Z_AXIS], cs.max_acceleration_mm_per_s2_silent[E_AXIS], echomagic, echomagic, cs.acceleration, cs.retract_acceleration, cs.travel_acceleration, echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.min_segment_time_us, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS], echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS] #else //TMC2130 printf_P(PSTR( 15c52: 80 91 ca 0d lds r24, 0x0DCA ; 0x800dca 15c56: 8f 93 push r24 15c58: 80 91 c9 0d lds r24, 0x0DC9 ; 0x800dc9 15c5c: 8f 93 push r24 15c5e: 80 91 c8 0d lds r24, 0x0DC8 ; 0x800dc8 15c62: 8f 93 push r24 15c64: 80 91 c7 0d lds r24, 0x0DC7 ; 0x800dc7 15c68: 8f 93 push r24 15c6a: 80 91 c6 0d lds r24, 0x0DC6 ; 0x800dc6 15c6e: 8f 93 push r24 15c70: 80 91 c5 0d lds r24, 0x0DC5 ; 0x800dc5 15c74: 8f 93 push r24 15c76: 80 91 c4 0d lds r24, 0x0DC4 ; 0x800dc4 15c7a: 8f 93 push r24 15c7c: 80 91 c3 0d lds r24, 0x0DC3 ; 0x800dc3 15c80: 8f 93 push r24 15c82: 80 91 c2 0d lds r24, 0x0DC2 ; 0x800dc2 15c86: 8f 93 push r24 15c88: 80 91 c1 0d lds r24, 0x0DC1 ; 0x800dc1 15c8c: 8f 93 push r24 15c8e: 80 91 c0 0d lds r24, 0x0DC0 ; 0x800dc0 15c92: 8f 93 push r24 15c94: 80 91 bf 0d lds r24, 0x0DBF ; 0x800dbf 15c98: 8f 93 push r24 15c9a: 0e ec ldi r16, 0xCE ; 206 15c9c: 11 ea ldi r17, 0xA1 ; 161 15c9e: 1f 93 push r17 15ca0: 0f 93 push r16 15ca2: 1f 93 push r17 15ca4: 0f 93 push r16 15ca6: 80 91 be 0d lds r24, 0x0DBE ; 0x800dbe 15caa: 8f 93 push r24 15cac: 80 91 bd 0d lds r24, 0x0DBD ; 0x800dbd 15cb0: 8f 93 push r24 15cb2: 80 91 bc 0d lds r24, 0x0DBC ; 0x800dbc 15cb6: 8f 93 push r24 15cb8: 80 91 bb 0d lds r24, 0x0DBB ; 0x800dbb 15cbc: 8f 93 push r24 15cbe: 80 91 ba 0d lds r24, 0x0DBA ; 0x800dba 15cc2: 8f 93 push r24 15cc4: 80 91 b9 0d lds r24, 0x0DB9 ; 0x800db9 15cc8: 8f 93 push r24 15cca: 80 91 b8 0d lds r24, 0x0DB8 ; 0x800db8 15cce: 8f 93 push r24 15cd0: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 15cd4: 8f 93 push r24 15cd6: 80 91 b6 0d lds r24, 0x0DB6 ; 0x800db6 15cda: 8f 93 push r24 15cdc: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 15ce0: 8f 93 push r24 15ce2: 80 91 b4 0d lds r24, 0x0DB4 ; 0x800db4 15ce6: 8f 93 push r24 15ce8: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 15cec: 8f 93 push r24 15cee: 80 91 b2 0d lds r24, 0x0DB2 ; 0x800db2 15cf2: 8f 93 push r24 15cf4: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 15cf8: 8f 93 push r24 15cfa: 80 91 b0 0d lds r24, 0x0DB0 ; 0x800db0 15cfe: 8f 93 push r24 15d00: 80 91 af 0d lds r24, 0x0DAF ; 0x800daf 15d04: 8f 93 push r24 15d06: 80 91 ae 0d lds r24, 0x0DAE ; 0x800dae 15d0a: 8f 93 push r24 15d0c: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad 15d10: 8f 93 push r24 15d12: 80 91 ac 0d lds r24, 0x0DAC ; 0x800dac 15d16: 8f 93 push r24 15d18: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 15d1c: 8f 93 push r24 15d1e: 80 91 aa 0d lds r24, 0x0DAA ; 0x800daa 15d22: 8f 93 push r24 15d24: 80 91 a9 0d lds r24, 0x0DA9 ; 0x800da9 15d28: 8f 93 push r24 15d2a: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 15d2e: 8f 93 push r24 15d30: 80 91 a7 0d lds r24, 0x0DA7 ; 0x800da7 15d34: 8f 93 push r24 15d36: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 15d3a: 8f 93 push r24 15d3c: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 15d40: 8f 93 push r24 15d42: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 15d46: 8f 93 push r24 15d48: 80 91 a3 0d lds r24, 0x0DA3 ; 0x800da3 15d4c: 8f 93 push r24 15d4e: 1f 93 push r17 15d50: 0f 93 push r16 15d52: 1f 93 push r17 15d54: 0f 93 push r16 15d56: 80 91 2a 0e lds r24, 0x0E2A ; 0x800e2a 15d5a: 8f 93 push r24 15d5c: 80 91 29 0e lds r24, 0x0E29 ; 0x800e29 15d60: 8f 93 push r24 15d62: 80 91 28 0e lds r24, 0x0E28 ; 0x800e28 15d66: 8f 93 push r24 15d68: 80 91 27 0e lds r24, 0x0E27 ; 0x800e27 15d6c: 8f 93 push r24 15d6e: 80 91 a2 0d lds r24, 0x0DA2 ; 0x800da2 15d72: 8f 93 push r24 15d74: 80 91 a1 0d lds r24, 0x0DA1 ; 0x800da1 15d78: 8f 93 push r24 15d7a: 80 91 a0 0d lds r24, 0x0DA0 ; 0x800da0 15d7e: 8f 93 push r24 15d80: 80 91 9f 0d lds r24, 0x0D9F ; 0x800d9f 15d84: 8f 93 push r24 15d86: 80 91 9e 0d lds r24, 0x0D9E ; 0x800d9e 15d8a: 8f 93 push r24 15d8c: 80 91 9d 0d lds r24, 0x0D9D ; 0x800d9d 15d90: 8f 93 push r24 15d92: 80 91 9c 0d lds r24, 0x0D9C ; 0x800d9c 15d96: 8f 93 push r24 15d98: 80 91 9b 0d lds r24, 0x0D9B ; 0x800d9b 15d9c: 8f 93 push r24 15d9e: 1f 93 push r17 15da0: 0f 93 push r16 15da2: 1f 93 push r17 15da4: 0f 93 push r16 15da6: 80 91 9a 0d lds r24, 0x0D9A ; 0x800d9a 15daa: 8f 93 push r24 15dac: 80 91 99 0d lds r24, 0x0D99 ; 0x800d99 15db0: 8f 93 push r24 15db2: 80 91 98 0d lds r24, 0x0D98 ; 0x800d98 15db6: 8f 93 push r24 15db8: 80 91 97 0d lds r24, 0x0D97 ; 0x800d97 15dbc: 8f 93 push r24 15dbe: 80 91 96 0d lds r24, 0x0D96 ; 0x800d96 15dc2: 8f 93 push r24 15dc4: 80 91 95 0d lds r24, 0x0D95 ; 0x800d95 15dc8: 8f 93 push r24 15dca: 80 91 94 0d lds r24, 0x0D94 ; 0x800d94 15dce: 8f 93 push r24 15dd0: 80 91 93 0d lds r24, 0x0D93 ; 0x800d93 15dd4: 8f 93 push r24 15dd6: 80 91 92 0d lds r24, 0x0D92 ; 0x800d92 15dda: 8f 93 push r24 15ddc: 80 91 91 0d lds r24, 0x0D91 ; 0x800d91 15de0: 8f 93 push r24 15de2: 80 91 90 0d lds r24, 0x0D90 ; 0x800d90 15de6: 8f 93 push r24 15de8: 80 91 8f 0d lds r24, 0x0D8F ; 0x800d8f 15dec: 8f 93 push r24 15dee: 80 91 8e 0d lds r24, 0x0D8E ; 0x800d8e 15df2: 8f 93 push r24 15df4: 80 91 8d 0d lds r24, 0x0D8D ; 0x800d8d 15df8: 8f 93 push r24 15dfa: 80 91 8c 0d lds r24, 0x0D8C ; 0x800d8c 15dfe: 8f 93 push r24 15e00: 80 91 8b 0d lds r24, 0x0D8B ; 0x800d8b 15e04: 8f 93 push r24 15e06: 1f 93 push r17 15e08: 0f 93 push r16 15e0a: 1f 93 push r17 15e0c: 0f 93 push r16 15e0e: 80 91 8a 0d lds r24, 0x0D8A ; 0x800d8a 15e12: 8f 93 push r24 15e14: 80 91 89 0d lds r24, 0x0D89 ; 0x800d89 15e18: 8f 93 push r24 15e1a: 80 91 88 0d lds r24, 0x0D88 ; 0x800d88 15e1e: 8f 93 push r24 15e20: 80 91 87 0d lds r24, 0x0D87 ; 0x800d87 15e24: 8f 93 push r24 15e26: 80 91 86 0d lds r24, 0x0D86 ; 0x800d86 15e2a: 8f 93 push r24 15e2c: 80 91 85 0d lds r24, 0x0D85 ; 0x800d85 15e30: 8f 93 push r24 15e32: 80 91 84 0d lds r24, 0x0D84 ; 0x800d84 15e36: 8f 93 push r24 15e38: 80 91 83 0d lds r24, 0x0D83 ; 0x800d83 15e3c: 8f 93 push r24 15e3e: 80 91 82 0d lds r24, 0x0D82 ; 0x800d82 15e42: 8f 93 push r24 15e44: 80 91 81 0d lds r24, 0x0D81 ; 0x800d81 15e48: 8f 93 push r24 15e4a: 80 91 80 0d lds r24, 0x0D80 ; 0x800d80 15e4e: 8f 93 push r24 15e50: 80 91 7f 0d lds r24, 0x0D7F ; 0x800d7f 15e54: 8f 93 push r24 15e56: 80 91 7e 0d lds r24, 0x0D7E ; 0x800d7e 15e5a: 8f 93 push r24 15e5c: 80 91 7d 0d lds r24, 0x0D7D ; 0x800d7d 15e60: 8f 93 push r24 15e62: 80 91 7c 0d lds r24, 0x0D7C ; 0x800d7c 15e66: 8f 93 push r24 15e68: 80 91 7b 0d lds r24, 0x0D7B ; 0x800d7b 15e6c: 8f 93 push r24 15e6e: 1f 93 push r17 15e70: 0f 93 push r16 15e72: 1f 93 push r17 15e74: 0f 93 push r16 15e76: 80 91 7a 0d lds r24, 0x0D7A ; 0x800d7a 15e7a: 8f 93 push r24 15e7c: 80 91 79 0d lds r24, 0x0D79 ; 0x800d79 15e80: 8f 93 push r24 15e82: 80 91 78 0d lds r24, 0x0D78 ; 0x800d78 15e86: 8f 93 push r24 15e88: 80 91 77 0d lds r24, 0x0D77 ; 0x800d77 15e8c: 8f 93 push r24 15e8e: 80 91 76 0d lds r24, 0x0D76 ; 0x800d76 15e92: 8f 93 push r24 15e94: 80 91 75 0d lds r24, 0x0D75 ; 0x800d75 15e98: 8f 93 push r24 15e9a: 80 91 74 0d lds r24, 0x0D74 ; 0x800d74 15e9e: 8f 93 push r24 15ea0: 80 91 73 0d lds r24, 0x0D73 ; 0x800d73 15ea4: 8f 93 push r24 15ea6: 80 91 72 0d lds r24, 0x0D72 ; 0x800d72 15eaa: 8f 93 push r24 15eac: 80 91 71 0d lds r24, 0x0D71 ; 0x800d71 15eb0: 8f 93 push r24 15eb2: 80 91 70 0d lds r24, 0x0D70 ; 0x800d70 15eb6: 8f 93 push r24 15eb8: 80 91 6f 0d lds r24, 0x0D6F ; 0x800d6f 15ebc: 8f 93 push r24 15ebe: 80 91 6e 0d lds r24, 0x0D6E ; 0x800d6e 15ec2: 8f 93 push r24 15ec4: 80 91 6d 0d lds r24, 0x0D6D ; 0x800d6d 15ec8: 8f 93 push r24 15eca: 80 91 6c 0d lds r24, 0x0D6C ; 0x800d6c 15ece: 8f 93 push r24 15ed0: 80 91 6b 0d lds r24, 0x0D6B ; 0x800d6b 15ed4: 8f 93 push r24 15ed6: 1f 93 push r17 15ed8: 0f 93 push r16 15eda: 1f 93 push r17 15edc: 0f 93 push r16 15ede: 81 ea ldi r24, 0xA1 ; 161 15ee0: 9b e7 ldi r25, 0x7B ; 123 15ee2: 9f 93 push r25 15ee4: 8f 93 push r24 15ee6: 0f 94 a2 a2 call 0x34544 ; 0x34544 echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.min_segment_time_us, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS], echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS] #endif //TMC2130 ); #ifdef PIDTEMP printf_P(PSTR("%SPID settings:\n%S M301 P%.2f I%.2f D%.2f\n"), 15eea: 0f b6 in r0, 0x3f ; 63 15eec: f8 94 cli 15eee: de bf out 0x3e, r29 ; 62 15ef0: 0f be out 0x3f, r0 ; 63 15ef2: cd bf out 0x3d, r28 ; 61 15ef4: 2c ea ldi r18, 0xAC ; 172 15ef6: 35 ec ldi r19, 0xC5 ; 197 15ef8: 47 e2 ldi r20, 0x27 ; 39 15efa: 5e e3 ldi r21, 0x3E ; 62 15efc: 60 91 d7 0d lds r22, 0x0DD7 ; 0x800dd7 15f00: 70 91 d8 0d lds r23, 0x0DD8 ; 0x800dd8 15f04: 80 91 d9 0d lds r24, 0x0DD9 ; 0x800dd9 15f08: 90 91 da 0d lds r25, 0x0DDA ; 0x800dda 15f0c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 15f10: 9f 93 push r25 15f12: 8f 93 push r24 15f14: 7f 93 push r23 15f16: 6f 93 push r22 } float unscalePID_i(float i) { return i/PID_dT; 15f18: 2c ea ldi r18, 0xAC ; 172 15f1a: 35 ec ldi r19, 0xC5 ; 197 15f1c: 47 e2 ldi r20, 0x27 ; 39 15f1e: 5e e3 ldi r21, 0x3E ; 62 15f20: 60 91 d3 0d lds r22, 0x0DD3 ; 0x800dd3 15f24: 70 91 d4 0d lds r23, 0x0DD4 ; 0x800dd4 15f28: 80 91 d5 0d lds r24, 0x0DD5 ; 0x800dd5 15f2c: 90 91 d6 0d lds r25, 0x0DD6 ; 0x800dd6 15f30: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15f34: 9f 93 push r25 15f36: 8f 93 push r24 15f38: 7f 93 push r23 15f3a: 6f 93 push r22 15f3c: 80 91 d2 0d lds r24, 0x0DD2 ; 0x800dd2 15f40: 8f 93 push r24 15f42: 80 91 d1 0d lds r24, 0x0DD1 ; 0x800dd1 15f46: 8f 93 push r24 15f48: 80 91 d0 0d lds r24, 0x0DD0 ; 0x800dd0 15f4c: 8f 93 push r24 15f4e: 80 91 cf 0d lds r24, 0x0DCF ; 0x800dcf 15f52: 8f 93 push r24 15f54: 1f 93 push r17 15f56: 0f 93 push r16 15f58: 1f 93 push r17 15f5a: 0f 93 push r16 15f5c: 84 e7 ldi r24, 0x74 ; 116 15f5e: 9b e7 ldi r25, 0x7B ; 123 15f60: 9f 93 push r25 15f62: 8f 93 push r24 15f64: 0f 94 a2 a2 call 0x34544 ; 0x34544 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15f68: 2c ea ldi r18, 0xAC ; 172 15f6a: 35 ec ldi r19, 0xC5 ; 197 15f6c: 47 e2 ldi r20, 0x27 ; 39 15f6e: 5e e3 ldi r21, 0x3E ; 62 15f70: 60 91 e3 0d lds r22, 0x0DE3 ; 0x800de3 15f74: 70 91 e4 0d lds r23, 0x0DE4 ; 0x800de4 15f78: 80 91 e5 0d lds r24, 0x0DE5 ; 0x800de5 15f7c: 90 91 e6 0d lds r25, 0x0DE6 ; 0x800de6 15f80: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> echomagic, echomagic, cs.Kp, unscalePID_i(cs.Ki), unscalePID_d(cs.Kd)); #endif #ifdef PIDTEMPBED printf_P(PSTR("%SPID heatbed settings:\n%S M304 P%.2f I%.2f D%.2f\n"), 15f84: 9f 93 push r25 15f86: 8f 93 push r24 15f88: 7f 93 push r23 15f8a: 6f 93 push r22 } float unscalePID_i(float i) { return i/PID_dT; 15f8c: 2c ea ldi r18, 0xAC ; 172 15f8e: 35 ec ldi r19, 0xC5 ; 197 15f90: 47 e2 ldi r20, 0x27 ; 39 15f92: 5e e3 ldi r21, 0x3E ; 62 15f94: 60 91 df 0d lds r22, 0x0DDF ; 0x800ddf 15f98: 70 91 e0 0d lds r23, 0x0DE0 ; 0x800de0 15f9c: 80 91 e1 0d lds r24, 0x0DE1 ; 0x800de1 15fa0: 90 91 e2 0d lds r25, 0x0DE2 ; 0x800de2 15fa4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 15fa8: 9f 93 push r25 15faa: 8f 93 push r24 15fac: 7f 93 push r23 15fae: 6f 93 push r22 15fb0: 80 91 de 0d lds r24, 0x0DDE ; 0x800dde 15fb4: 8f 93 push r24 15fb6: 80 91 dd 0d lds r24, 0x0DDD ; 0x800ddd 15fba: 8f 93 push r24 15fbc: 80 91 dc 0d lds r24, 0x0DDC ; 0x800ddc 15fc0: 8f 93 push r24 15fc2: 80 91 db 0d lds r24, 0x0DDB ; 0x800ddb 15fc6: 8f 93 push r24 15fc8: 1f 93 push r17 15fca: 0f 93 push r16 15fcc: 1f 93 push r17 15fce: 0f 93 push r16 15fd0: 8f e3 ldi r24, 0x3F ; 63 15fd2: 9b e7 ldi r25, 0x7B ; 123 15fd4: 9f 93 push r25 15fd6: 8f 93 push r24 15fd8: 0f 94 a2 a2 call 0x34544 ; 0x34544 echomagic, echomagic, cs.bedKp, unscalePID_i(cs.bedKi), unscalePID_d(cs.bedKd)); #endif #ifdef FWRETRACT printf_P(PSTR( 15fdc: 0f b6 in r0, 0x3f ; 63 15fde: f8 94 cli 15fe0: de bf out 0x3e, r29 ; 62 15fe2: 0f be out 0x3f, r0 ; 63 15fe4: cd bf out 0x3d, r28 ; 61 15fe6: 80 91 e9 0d lds r24, 0x0DE9 ; 0x800de9 15fea: 1f 92 push r1 15fec: 8f 93 push r24 15fee: 1f 93 push r17 15ff0: 0f 93 push r16 15ff2: 1f 93 push r17 15ff4: 0f 93 push r16 15ff6: 20 e0 ldi r18, 0x00 ; 0 15ff8: 30 e0 ldi r19, 0x00 ; 0 15ffa: 40 e7 ldi r20, 0x70 ; 112 15ffc: 52 e4 ldi r21, 0x42 ; 66 15ffe: 60 91 fa 0d lds r22, 0x0DFA ; 0x800dfa 16002: 70 91 fb 0d lds r23, 0x0DFB ; 0x800dfb 16006: 80 91 fc 0d lds r24, 0x0DFC ; 0x800dfc 1600a: 90 91 fd 0d lds r25, 0x0DFD ; 0x800dfd 1600e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 16012: 9f 93 push r25 16014: 8f 93 push r24 16016: 7f 93 push r23 16018: 6f 93 push r22 1601a: 80 91 f9 0d lds r24, 0x0DF9 ; 0x800df9 1601e: 8f 93 push r24 16020: 80 91 f8 0d lds r24, 0x0DF8 ; 0x800df8 16024: 8f 93 push r24 16026: 80 91 f7 0d lds r24, 0x0DF7 ; 0x800df7 1602a: 8f 93 push r24 1602c: 80 91 f6 0d lds r24, 0x0DF6 ; 0x800df6 16030: 8f 93 push r24 16032: 1f 93 push r17 16034: 0f 93 push r16 16036: 1f 93 push r17 16038: 0f 93 push r16 1603a: 80 91 f5 0d lds r24, 0x0DF5 ; 0x800df5 1603e: 8f 93 push r24 16040: 80 91 f4 0d lds r24, 0x0DF4 ; 0x800df4 16044: 8f 93 push r24 16046: 80 91 f3 0d lds r24, 0x0DF3 ; 0x800df3 1604a: 8f 93 push r24 1604c: 80 91 f2 0d lds r24, 0x0DF2 ; 0x800df2 16050: 8f 93 push r24 16052: 20 e0 ldi r18, 0x00 ; 0 16054: 30 e0 ldi r19, 0x00 ; 0 16056: 40 e7 ldi r20, 0x70 ; 112 16058: 52 e4 ldi r21, 0x42 ; 66 1605a: 60 91 ee 0d lds r22, 0x0DEE ; 0x800dee 1605e: 70 91 ef 0d lds r23, 0x0DEF ; 0x800def 16062: 80 91 f0 0d lds r24, 0x0DF0 ; 0x800df0 16066: 90 91 f1 0d lds r25, 0x0DF1 ; 0x800df1 1606a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1606e: 9f 93 push r25 16070: 8f 93 push r24 16072: 7f 93 push r23 16074: 6f 93 push r22 16076: 80 91 ed 0d lds r24, 0x0DED ; 0x800ded 1607a: 8f 93 push r24 1607c: 80 91 ec 0d lds r24, 0x0DEC ; 0x800dec 16080: 8f 93 push r24 16082: 80 91 eb 0d lds r24, 0x0DEB ; 0x800deb 16086: 8f 93 push r24 16088: 80 91 ea 0d lds r24, 0x0DEA ; 0x800dea 1608c: 8f 93 push r24 1608e: 1f 93 push r17 16090: 0f 93 push r16 16092: 1f 93 push r17 16094: 0f 93 push r16 16096: 8e e3 ldi r24, 0x3E ; 62 16098: 9a e7 ldi r25, 0x7A ; 122 1609a: 9f 93 push r25 1609c: 8f 93 push r24 1609e: 0f 94 a2 a2 call 0x34544 ; 0x34544 ); #if EXTRUDERS > 1 printf_P(PSTR("%SMulti-extruder settings:\n%S Swap retract length (mm): %.2f\n%S Swap rec. addl. length (mm): %.2f\n"), echomagic, echomagic, retract_length_swap, echomagic, retract_recover_length_swap); #endif if (cs.volumetric_enabled) { 160a2: 0f b6 in r0, 0x3f ; 63 160a4: f8 94 cli 160a6: de bf out 0x3e, r29 ; 62 160a8: 0f be out 0x3f, r0 ; 63 160aa: cd bf out 0x3d, r28 ; 61 160ac: 80 91 fe 0d lds r24, 0x0DFE ; 0x800dfe 160b0: 88 23 and r24, r24 160b2: 09 f4 brne .+2 ; 0x160b6 160b4: 74 c0 rjmp .+232 ; 0x1619e printf_P(PSTR("%SFilament settings:\n%S M200 D%.2f\n"), 160b6: 80 91 02 0e lds r24, 0x0E02 ; 0x800e02 160ba: 8f 93 push r24 160bc: 80 91 01 0e lds r24, 0x0E01 ; 0x800e01 160c0: 8f 93 push r24 160c2: 80 91 00 0e lds r24, 0x0E00 ; 0x800e00 160c6: 8f 93 push r24 160c8: 80 91 ff 0d lds r24, 0x0DFF ; 0x800dff 160cc: 8f 93 push r24 160ce: 1f 93 push r17 160d0: 0f 93 push r16 160d2: 1f 93 push r17 160d4: 0f 93 push r16 160d6: 88 e1 ldi r24, 0x18 ; 24 160d8: 9a e7 ldi r25, 0x7A ; 122 160da: 9f 93 push r25 160dc: 8f 93 push r24 160de: 0f 94 a2 a2 call 0x34544 ; 0x34544 160e2: 0f b6 in r0, 0x3f ; 63 160e4: f8 94 cli 160e6: de bf out 0x3e, r29 ; 62 160e8: 0f be out 0x3f, r0 ; 63 160ea: cd bf out 0x3d, r28 ; 61 printf_P(PSTR("%SLinear advance settings:%S M900 K%.2f\n"), echomagic, echomagic, extruder_advance_K); #endif //LIN_ADVANCE } // Arc Interpolation Settings printf_P(PSTR( 160ec: 80 91 37 0e lds r24, 0x0E37 ; 0x800e37 160f0: 8f 93 push r24 160f2: 80 91 36 0e lds r24, 0x0E36 ; 0x800e36 160f6: 8f 93 push r24 160f8: 80 91 35 0e lds r24, 0x0E35 ; 0x800e35 160fc: 8f 93 push r24 160fe: 80 91 34 0e lds r24, 0x0E34 ; 0x800e34 16102: 8f 93 push r24 16104: 80 91 33 0e lds r24, 0x0E33 ; 0x800e33 16108: 1f 92 push r1 1610a: 8f 93 push r24 1610c: 80 91 32 0e lds r24, 0x0E32 ; 0x800e32 16110: 8f 93 push r24 16112: 80 91 31 0e lds r24, 0x0E31 ; 0x800e31 16116: 8f 93 push r24 16118: 80 91 30 0e lds r24, 0x0E30 ; 0x800e30 1611c: 8f 93 push r24 1611e: 80 91 2f 0e lds r24, 0x0E2F ; 0x800e2f 16122: 8f 93 push r24 16124: 80 91 2e 0e lds r24, 0x0E2E ; 0x800e2e 16128: 8f 93 push r24 1612a: 80 91 2d 0e lds r24, 0x0E2D ; 0x800e2d 1612e: 8f 93 push r24 16130: 80 91 2c 0e lds r24, 0x0E2C ; 0x800e2c 16134: 8f 93 push r24 16136: 80 91 2b 0e lds r24, 0x0E2B ; 0x800e2b 1613a: 8f 93 push r24 1613c: 0e ec ldi r16, 0xCE ; 206 1613e: 11 ea ldi r17, 0xA1 ; 161 16140: 1f 93 push r17 16142: 0f 93 push r16 16144: 1f 93 push r17 16146: 0f 93 push r16 16148: 87 e7 ldi r24, 0x77 ; 119 1614a: 99 e7 ldi r25, 0x79 ; 121 1614c: 9f 93 push r25 1614e: 8f 93 push r24 16150: 0f 94 a2 a2 call 0x34544 ; 0x34544 "%SArc Settings: P:Max length(mm) S:Min length (mm) N:Corrections R:Min segments F:Segments/sec.\n%S M214 P%.2f S%.2f N%d R%d F%d\n"), echomagic, echomagic, cs.mm_per_arc_segment, cs.min_mm_per_arc_segment, cs.n_arc_correction, cs.min_arc_segments, cs.arc_segments_per_sec); #ifdef THERMAL_MODEL thermal_model_report_settings(); #endif printf_P(PSTR( 16154: 8d ee ldi r24, 0xED ; 237 16156: 9f e0 ldi r25, 0x0F ; 15 16158: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 1615c: f6 2e mov r15, r22 1615e: e7 2e mov r14, r23 16160: d8 2e mov r13, r24 16162: c9 2e mov r12, r25 16164: 81 ef ldi r24, 0xF1 ; 241 16166: 9f e0 ldi r25, 0x0F ; 15 16168: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 1616c: cf 92 push r12 1616e: df 92 push r13 16170: ef 92 push r14 16172: ff 92 push r15 16174: 9f 93 push r25 16176: 8f 93 push r24 16178: 7f 93 push r23 1617a: 6f 93 push r22 1617c: 1f 93 push r17 1617e: 0f 93 push r16 16180: 1f 93 push r17 16182: 0f 93 push r16 16184: 86 e5 ldi r24, 0x56 ; 86 16186: 99 e7 ldi r25, 0x79 ; 121 16188: 9f 93 push r25 1618a: 8f 93 push r24 1618c: 0f 94 a2 a2 call 0x34544 ; 0x34544 16190: 0f b6 in r0, 0x3f ; 63 16192: f8 94 cli 16194: de bf out 0x3e, r29 ; 62 16196: 0f be out 0x3f, r0 ; 63 16198: cd bf out 0x3d, r28 ; 61 1619a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e printf_P(PSTR("%S M200 T1 D%.2f\n"), echomagic, echomagic, cs.filament_size[2]); #endif #endif } else { printf_P(PSTR("%SFilament settings: Disabled\n"), echomagic); 1619e: 1f 93 push r17 161a0: 0f 93 push r16 161a2: 89 ef ldi r24, 0xF9 ; 249 161a4: 99 e7 ldi r25, 0x79 ; 121 161a6: 9f 93 push r25 161a8: 8f 93 push r24 161aa: 0f 94 a2 a2 call 0x34544 ; 0x34544 161ae: 0f 90 pop r0 161b0: 0f 90 pop r0 161b2: 0f 90 pop r0 161b4: 0f 90 pop r0 161b6: 9a cf rjmp .-204 ; 0x160ec #### Parameters - `P` - The IP address in xxx.xxx.xxx.xxx format. Eg: P192.168.1.14 */ case 552: { if (code_seen('P')) 161b8: 80 e5 ldi r24, 0x50 ; 80 161ba: 0e 94 f5 55 call 0xabea ; 0xabea 161be: 88 23 and r24, r24 161c0: 11 f4 brne .+4 ; 0x161c6 161c2: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { uint8_t valCnt = 0; IP_address = 0; 161c6: 10 92 10 06 sts 0x0610, r1 ; 0x800610 161ca: 10 92 11 06 sts 0x0611, r1 ; 0x800611 161ce: 10 92 12 06 sts 0x0612, r1 ; 0x800612 161d2: 10 92 13 06 sts 0x0613, r1 ; 0x800613 161d6: 00 e1 ldi r16, 0x10 ; 16 161d8: 16 e0 ldi r17, 0x06 ; 6 161da: 44 e1 ldi r20, 0x14 ; 20 161dc: e4 2e mov r14, r20 161de: 46 e0 ldi r20, 0x06 ; 6 161e0: f4 2e mov r15, r20 do { *strchr_pointer = '*'; 161e2: 5a e2 ldi r21, 0x2A ; 42 161e4: d5 2e mov r13, r21 161e6: e0 91 bb 04 lds r30, 0x04BB ; 0x8004bb 161ea: f0 91 bc 04 lds r31, 0x04BC ; 0x8004bc 161ee: d0 82 st Z, r13 ((uint8_t*)&IP_address)[valCnt] = code_value_short(); 161f0: 0e 94 17 56 call 0xac2e ; 0xac2e 161f4: d8 01 movw r26, r16 161f6: 8d 93 st X+, r24 161f8: 8d 01 movw r16, r26 valCnt++; } while ((valCnt < 4) && code_seen('.')); 161fa: ea 16 cp r14, r26 161fc: fb 06 cpc r15, r27 161fe: 11 f4 brne .+4 ; 0x16204 16200: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 16204: 8e e2 ldi r24, 0x2E ; 46 16206: 0e 94 f5 55 call 0xabea ; 0xabea 1620a: 81 11 cpse r24, r1 1620c: ec cf rjmp .-40 ; 0x161e6 if (valCnt != 4) IP_address = 0; 1620e: 10 92 10 06 sts 0x0610, r1 ; 0x800610 16212: 10 92 11 06 sts 0x0611, r1 ; 0x800611 16216: 10 92 12 06 sts 0x0612, r1 ; 0x800612 1621a: 10 92 13 06 sts 0x0613, r1 ; 0x800613 1621e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e - `C` - filament name to show during loading - `AUTO` - Automatically (only with MMU) */ case 600: //Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] C"[filament name to show during loading]" { st_synchronize(); 16222: 0f 94 fb 1a call 0x235f6 ; 0x235f6 /// e.g. feedrate, Z-axis position etc. /// This function should backup variables which may be lost /// For example a power panic in M600 or during MMU error void refresh_print_state_in_ram() { if (saved_printing) return; 16226: 80 91 73 12 lds r24, 0x1273 ; 0x801273 1622a: 81 11 cpse r24, r1 1622c: 02 c0 rjmp .+4 ; 0x16232 1622e: 0e 94 a6 63 call 0xc74c ; 0xc74c float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT; float e_shift_late = FILAMENTCHANGE_FINALRETRACT; bool automatic = false; //Retract extruder if (code_seen('E')) e_shift_init = code_value(); 16232: 85 e4 ldi r24, 0x45 ; 69 16234: 0e 94 f5 55 call 0xabea ; 0xabea refresh_print_state_in_ram(); float x_position = FILAMENTCHANGE_XPOS; float y_position = FILAMENTCHANGE_YPOS; float z_shift = MIN_Z_FOR_SWAP; float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT; 16238: 81 2c mov r8, r1 1623a: 91 2c mov r9, r1 1623c: a1 2c mov r10, r1 1623e: 30 ec ldi r19, 0xC0 ; 192 16240: b3 2e mov r11, r19 float e_shift_late = FILAMENTCHANGE_FINALRETRACT; bool automatic = false; //Retract extruder if (code_seen('E')) e_shift_init = code_value(); 16242: 88 23 and r24, r24 16244: 21 f0 breq .+8 ; 0x1624e 16246: 0e 94 85 5a call 0xb50a ; 0xb50a 1624a: 4b 01 movw r8, r22 1624c: 5c 01 movw r10, r24 if (code_seen('L')) e_shift_late = code_value(); 1624e: 8c e4 ldi r24, 0x4C ; 76 16250: 0e 94 f5 55 call 0xabea ; 0xabea float x_position = FILAMENTCHANGE_XPOS; float y_position = FILAMENTCHANGE_YPOS; float z_shift = MIN_Z_FOR_SWAP; float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT; float e_shift_late = FILAMENTCHANGE_FINALRETRACT; 16254: c1 2c mov r12, r1 16256: d1 2c mov r13, r1 16258: 76 01 movw r14, r12 bool automatic = false; //Retract extruder if (code_seen('E')) e_shift_init = code_value(); if (code_seen('L')) e_shift_late = code_value(); 1625a: 88 23 and r24, r24 1625c: 21 f0 breq .+8 ; 0x16266 1625e: 0e 94 85 5a call 0xb50a ; 0xb50a 16262: 6b 01 movw r12, r22 16264: 7c 01 movw r14, r24 // Z lift. For safety only allow positive values if (code_seen('Z')) z_shift = fabs(code_value()); 16266: 8a e5 ldi r24, 0x5A ; 90 16268: 0e 94 f5 55 call 0xabea ; 0xabea // take a partial back up of print state into RAM (current position, etc.) refresh_print_state_in_ram(); float x_position = FILAMENTCHANGE_XPOS; float y_position = FILAMENTCHANGE_YPOS; float z_shift = MIN_Z_FOR_SWAP; 1626c: 41 2c mov r4, r1 1626e: 51 2c mov r5, r1 16270: 28 ed ldi r18, 0xD8 ; 216 16272: 62 2e mov r6, r18 16274: 21 e4 ldi r18, 0x41 ; 65 16276: 72 2e mov r7, r18 //Retract extruder if (code_seen('E')) e_shift_init = code_value(); if (code_seen('L')) e_shift_late = code_value(); // Z lift. For safety only allow positive values if (code_seen('Z')) z_shift = fabs(code_value()); 16278: 88 23 and r24, r24 1627a: 31 f0 breq .+12 ; 0x16288 1627c: 0e 94 85 5a call 0xb50a ; 0xb50a 16280: 2b 01 movw r4, r22 16282: 3c 01 movw r6, r24 16284: e8 94 clt 16286: 77 f8 bld r7, 7 //Move XY to side if (code_seen('X')) x_position = code_value(); 16288: 88 e5 ldi r24, 0x58 ; 88 1628a: 0e 94 f5 55 call 0xabea ; 0xabea 1628e: 88 23 and r24, r24 16290: 09 f4 brne .+2 ; 0x16294 16292: 40 c1 rjmp .+640 ; 0x16514 16294: 0e 94 85 5a call 0xb50a ; 0xb50a 16298: 68 a7 std Y+40, r22 ; 0x28 1629a: 79 a7 std Y+41, r23 ; 0x29 1629c: 8a a7 std Y+42, r24 ; 0x2a 1629e: 9b a7 std Y+43, r25 ; 0x2b if (code_seen('Y')) y_position = code_value(); 162a0: 89 e5 ldi r24, 0x59 ; 89 162a2: 0e 94 f5 55 call 0xabea ; 0xabea 162a6: 88 23 and r24, r24 162a8: 09 f4 brne .+2 ; 0x162ac 162aa: 3d c1 rjmp .+634 ; 0x16526 162ac: 0e 94 85 5a call 0xb50a ; 0xb50a 162b0: 6c a7 std Y+44, r22 ; 0x2c 162b2: 7d a7 std Y+45, r23 ; 0x2d 162b4: 8e a7 std Y+46, r24 ; 0x2e 162b6: 9f a7 std Y+47, r25 ; 0x2f // Filament name to show during the loading char filament_name[LCD_WIDTH + 1] = ""; 162b8: 1a 82 std Y+2, r1 ; 0x02 162ba: 19 82 std Y+1, r1 ; 0x01 162bc: fe 01 movw r30, r28 162be: 33 96 adiw r30, 0x03 ; 3 162c0: 83 e1 ldi r24, 0x13 ; 19 162c2: df 01 movw r26, r30 162c4: 1d 92 st X+, r1 162c6: 8a 95 dec r24 162c8: e9 f7 brne .-6 ; 0x162c4 if (code_seen('C')) { 162ca: 83 e4 ldi r24, 0x43 ; 67 162cc: 0e 94 f5 55 call 0xabea ; 0xabea 162d0: 88 23 and r24, r24 162d2: f9 f0 breq .+62 ; 0x16312 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 162d4: 62 e2 ldi r22, 0x22 ; 34 162d6: 70 e0 ldi r23, 0x00 ; 0 162d8: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 162dc: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 162e0: 0f 94 37 aa call 0x3546e ; 0x3546e 162e4: 8c 01 movw r16, r24 if (!this->ptr) { 162e6: 89 2b or r24, r25 162e8: a1 f0 breq .+40 ; 0x16312 // First quote not found return; } // Skip the leading quote this->ptr++; 162ea: 0f 5f subi r16, 0xFF ; 255 162ec: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 162ee: 62 e2 ldi r22, 0x22 ; 34 162f0: 70 e0 ldi r23, 0x00 ; 0 162f2: c8 01 movw r24, r16 162f4: 0f 94 37 aa call 0x3546e ; 0x3546e if(!pStrEnd) { 162f8: 00 97 sbiw r24, 0x00 ; 0 162fa: 59 f0 breq .+22 ; 0x16312 // Second quote not found return; } this->len = pStrEnd - this->ptr; 162fc: 80 1b sub r24, r16 unquoted_string str = unquoted_string(strchr_pointer); if (str.WasFound()) { const uint8_t len = min(str.GetLength(), LCD_WIDTH); 162fe: 84 31 cpi r24, 0x14 ; 20 16300: 08 f0 brcs .+2 ; 0x16304 16302: 84 e1 ldi r24, 0x14 ; 20 memcpy(filament_name, str.GetUnquotedString(), len); 16304: 48 2f mov r20, r24 16306: 50 e0 ldi r21, 0x00 ; 0 16308: b8 01 movw r22, r16 1630a: ce 01 movw r24, r28 1630c: 01 96 adiw r24, 0x01 ; 1 1630e: 0f 94 09 aa call 0x35412 ; 0x35412 } } if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO"))) 16312: 80 91 01 13 lds r24, 0x1301 ; 0x801301 float x_position = FILAMENTCHANGE_XPOS; float y_position = FILAMENTCHANGE_YPOS; float z_shift = MIN_Z_FOR_SWAP; float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT; float e_shift_late = FILAMENTCHANGE_FINALRETRACT; bool automatic = false; 16316: 10 e0 ldi r17, 0x00 ; 0 const uint8_t len = min(str.GetLength(), LCD_WIDTH); memcpy(filament_name, str.GetUnquotedString(), len); } } if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO"))) 16318: 81 30 cpi r24, 0x01 ; 1 1631a: 29 f4 brne .+10 ; 0x16326 1631c: 89 e4 ldi r24, 0x49 ; 73 1631e: 9f e7 ldi r25, 0x7F ; 127 16320: 0f 94 62 3c call 0x278c4 ; 0x278c4 16324: 18 2f mov r17, r24 load_filament_final_feed(); // @@TODO verify st_synchronize(); } static void gcode_M600(const bool automatic, const float x_position, const float y_position, const float z_shift, const float e_shift, const float e_shift_late, const char* filament_name) { st_synchronize(); 16326: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // When using an MMU, save the currently use slot number // so the firmware can know which slot to eject after the filament // is unloaded. uint8_t eject_slot = 0; prusa_statistics(22); 1632a: 86 e1 ldi r24, 0x16 ; 22 1632c: 0f 94 79 32 call 0x264f2 ; 0x264f2 // Turn off the fan fanSpeed = 0; 16330: 10 92 55 12 sts 0x1255, r1 ; 0x801255 // Retract E if (!printingIsPaused()) 16334: 0e 94 35 66 call 0xcc6a ; 0xcc6a 16338: 81 11 cpse r24, r1 1633a: fa c0 rjmp .+500 ; 0x16530 { current_position[E_AXIS] += e_shift; 1633c: a5 01 movw r20, r10 1633e: 94 01 movw r18, r8 16340: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 16344: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 16348: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 1634c: 90 91 70 12 lds r25, 0x1270 ; 0x801270 16350: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 16354: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 16358: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 1635c: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 16360: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED); 16364: 60 e0 ldi r22, 0x00 ; 0 16366: 70 e0 ldi r23, 0x00 ; 0 16368: 88 ee ldi r24, 0xE8 ; 232 1636a: 92 e4 ldi r25, 0x42 ; 66 1636c: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 16370: 0f 94 fb 1a call 0x235f6 ; 0x235f6 SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED); 16374: 8b eb ldi r24, 0xBB ; 187 16376: 9a e6 ldi r25, 0x6A ; 106 16378: 0e 94 bd 7c call 0xf97a ; 0xf97a // Filament change can be issued via the Tune menu restore_extruder_temperature_from_ram(); } // Raise the Z axis raise_z(z_shift); 1637c: c3 01 movw r24, r6 1637e: b2 01 movw r22, r4 16380: 0e 94 94 6c call 0xd928 ; 0xd928 // Move XY to side current_position[X_AXIS] = x_position; 16384: 28 a5 ldd r18, Y+40 ; 0x28 16386: 39 a5 ldd r19, Y+41 ; 0x29 16388: 4a a5 ldd r20, Y+42 ; 0x2a 1638a: 5b a5 ldd r21, Y+43 ; 0x2b 1638c: 20 93 61 12 sts 0x1261, r18 ; 0x801261 16390: 30 93 62 12 sts 0x1262, r19 ; 0x801262 16394: 40 93 63 12 sts 0x1263, r20 ; 0x801263 16398: 50 93 64 12 sts 0x1264, r21 ; 0x801264 current_position[Y_AXIS] = y_position; 1639c: 8c a5 ldd r24, Y+44 ; 0x2c 1639e: 9d a5 ldd r25, Y+45 ; 0x2d 163a0: ae a5 ldd r26, Y+46 ; 0x2e 163a2: bf a5 ldd r27, Y+47 ; 0x2f 163a4: 80 93 65 12 sts 0x1265, r24 ; 0x801265 163a8: 90 93 66 12 sts 0x1266, r25 ; 0x801266 163ac: a0 93 67 12 sts 0x1267, r26 ; 0x801267 163b0: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); 163b4: 60 e0 ldi r22, 0x00 ; 0 163b6: 70 e0 ldi r23, 0x00 ; 0 163b8: 88 e4 ldi r24, 0x48 ; 72 163ba: 92 e4 ldi r25, 0x42 ; 66 163bc: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 163c0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 bool repeat = false; 163c4: 18 a6 std Y+40, r1 ; 0x28 st_synchronize(); // When using an MMU, save the currently use slot number // so the firmware can know which slot to eject after the filament // is unloaded. uint8_t eject_slot = 0; 163c6: b1 2c mov r11, r1 #endif //PINDA_THERMISTOR void lcd_wait_for_heater() { lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder)); 163c8: 02 e4 ldi r16, 0x42 ; 66 163ca: 20 2e mov r2, r16 163cc: 09 e7 ldi r16, 0x79 ; 121 163ce: 30 2e mov r3, r16 delay_keep_alive(4); if (lcd_clicked()) { setTargetHotend(saved_extruder_temperature); lcd_wait_for_heater(); wait_for_user_state = 2; 163d0: 82 e0 ldi r24, 0x02 ; 2 163d2: a8 2e mov r10, r24 lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); waiting_start_time = _millis(); wait_for_user_state = 0; } else { lcd_set_cursor(1, 4); lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder)); 163d4: 9a e4 ldi r25, 0x4A ; 74 163d6: 89 2e mov r8, r25 163d8: 99 e7 ldi r25, 0x79 ; 121 163da: 99 2e mov r9, r25 st_synchronize(); bool repeat = false; do { // Unload filament if (MMU2::mmu2.Enabled()) { 163dc: 80 91 01 13 lds r24, 0x1301 ; 0x801301 163e0: 81 30 cpi r24, 0x01 ; 1 163e2: 09 f0 breq .+2 ; 0x163e6 163e4: a8 c0 rjmp .+336 ; 0x16536 eject_slot = MMU2::mmu2.get_current_tool(); 163e6: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 163ea: b8 2e mov r11, r24 mmu_M600_unload_filament(); 163ec: 0e 94 bc 76 call 0xed78 ; 0xed78 } else { // Beep, manage nozzle heater and wait for user to start unload filament M600_wait_for_user(); unload_filament(e_shift_late); } st_synchronize(); // finish moves 163f0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 FSensorBlockRunout fsBlockRunout; 163f4: 0f 94 2b 79 call 0x2f256 ; 0x2f256 if (!MMU2::mmu2.Enabled()) 163f8: 80 91 01 13 lds r24, 0x1301 ; 0x801301 163fc: 81 30 cpi r24, 0x01 ; 1 163fe: 09 f4 brne .+2 ; 0x16402 16400: 64 c1 rjmp .+712 ; 0x166ca { KEEPALIVE_STATE(PAUSED_FOR_USER); 16402: 84 e0 ldi r24, 0x04 ; 4 16404: 80 93 78 02 sts 0x0278, r24 ; 0x800278 uint8_t choice = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_UNLOAD_SUCCESSFUL), false, LCD_LEFT_BUTTON_CHOICE); 16408: 8d ee ldi r24, 0xED ; 237 1640a: 98 e3 ldi r25, 0x38 ; 56 1640c: 0e 94 3a 75 call 0xea74 ; 0xea74 16410: 40 e0 ldi r20, 0x00 ; 0 16412: 60 e0 ldi r22, 0x00 ; 0 16414: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 16418: 08 2f mov r16, r24 lcd_update_enable(false); 1641a: 80 e0 ldi r24, 0x00 ; 0 1641c: 0e 94 38 70 call 0xe070 ; 0xe070 if (choice == LCD_MIDDLE_BUTTON_CHOICE) { 16420: 01 30 cpi r16, 0x01 ; 1 16422: 29 f5 brne .+74 ; 0x1646e lcd_clear(); 16424: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); 16428: 85 e6 ldi r24, 0x65 ; 101 1642a: 99 e3 ldi r25, 0x39 ; 57 1642c: 0e 94 3a 75 call 0xea74 ; 0xea74 16430: ac 01 movw r20, r24 16432: 62 e0 ldi r22, 0x02 ; 2 16434: 80 e0 ldi r24, 0x00 ; 0 16436: 0e 94 07 70 call 0xe00e ; 0xe00e current_position[X_AXIS] = 100; 1643a: 80 e0 ldi r24, 0x00 ; 0 1643c: 90 e0 ldi r25, 0x00 ; 0 1643e: a8 ec ldi r26, 0xC8 ; 200 16440: b2 e4 ldi r27, 0x42 ; 66 16442: 80 93 61 12 sts 0x1261, r24 ; 0x801261 16446: 90 93 62 12 sts 0x1262, r25 ; 0x801262 1644a: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1644e: b0 93 64 12 sts 0x1264, r27 ; 0x801264 plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); 16452: 60 e0 ldi r22, 0x00 ; 0 16454: 70 e0 ldi r23, 0x00 ; 0 16456: 88 e4 ldi r24, 0x48 ; 72 16458: 92 e4 ldi r25, 0x42 ; 66 1645a: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1645e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHECK_IDLER)); 16462: 8b eb ldi r24, 0xBB ; 187 16464: 98 e3 ldi r25, 0x38 ; 56 16466: 0e 94 3a 75 call 0xea74 ; 0xea74 1646a: 0e 94 94 ea call 0x1d528 ; 0x1d528 preheat_or_continue(FilamentAction::UnLoad); } void lcd_wait_interact(const char* filament_name) { lcd_clear(); 1646e: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_INSERT_FILAMENT)); 16472: 89 e4 ldi r24, 0x49 ; 73 16474: 98 e3 ldi r25, 0x38 ; 56 16476: 0e 94 3a 75 call 0xea74 ; 0xea74 1647a: ac 01 movw r20, r24 1647c: 60 e0 ldi r22, 0x00 ; 0 1647e: 80 e0 ldi r24, 0x00 ; 0 16480: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(0, 1); 16484: 61 e0 ldi r22, 0x01 ; 1 16486: 80 e0 ldi r24, 0x00 ; 0 16488: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 if (filament_name[0]) { 1648c: 89 81 ldd r24, Y+1 ; 0x01 1648e: 88 23 and r24, r24 16490: 41 f0 breq .+16 ; 0x164a2 lcd_print(filament_name); 16492: ce 01 movw r24, r28 16494: 01 96 adiw r24, 0x01 ; 1 16496: 0e 94 5f 73 call 0xe6be ; 0xe6be lcd_set_cursor(0, 2); 1649a: 62 e0 ldi r22, 0x02 ; 2 1649c: 80 e0 ldi r24, 0x00 ; 0 1649e: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 } #ifdef FILAMENT_SENSOR if (!fsensor.getAutoLoadEnabled()) 164a2: 80 91 f2 16 lds r24, 0x16F2 ; 0x8016f2 164a6: 81 11 cpse r24, r1 164a8: 06 c0 rjmp .+12 ; 0x164b6 #endif //FILAMENT_SENSOR { lcd_puts_P(_T(MSG_PRESS)); 164aa: 84 e3 ldi r24, 0x34 ; 52 164ac: 98 e3 ldi r25, 0x38 ; 56 164ae: 0e 94 3a 75 call 0xea74 ; 0xea74 164b2: 0e 94 1d 6f call 0xde3a ; 0xde3a void M600_load_filament(const char* filament_name) { //load filament for single material and MMU lcd_wait_interact(filament_name); KEEPALIVE_STATE(PAUSED_FOR_USER); 164b6: 84 e0 ldi r24, 0x04 ; 4 164b8: 80 93 78 02 sts 0x0278, r24 ; 0x800278 while(!lcd_clicked()) 164bc: 0e 94 75 73 call 0xe6ea ; 0xe6ea 164c0: 81 11 cpse r24, r1 164c2: 10 c0 rjmp .+32 ; 0x164e4 { manage_heater(); 164c4: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 164c8: 81 e0 ldi r24, 0x01 ; 1 164ca: 0e 94 34 8c call 0x11868 ; 0x11868 #ifdef FILAMENT_SENSOR if (fsensor.getFilamentLoadEvent()) { 164ce: 80 91 f5 16 lds r24, 0x16F5 ; 0x8016f5 164d2: 88 23 and r24, r24 164d4: 99 f3 breq .-26 ; 0x164bc Sound_MakeCustom(50,1000,false); 164d6: 40 e0 ldi r20, 0x00 ; 0 164d8: 68 ee ldi r22, 0xE8 ; 232 164da: 73 e0 ldi r23, 0x03 ; 3 164dc: 82 e3 ldi r24, 0x32 ; 50 164de: 90 e0 ldi r25, 0x00 ; 0 164e0: 0f 94 be 27 call 0x24f7c ; 0x24f7c break; } #endif //FILAMENT_SENSOR } KEEPALIVE_STATE(IN_HANDLER); 164e4: a0 92 78 02 sts 0x0278, r10 ; 0x800278 M600_load_filament_movements(filament_name); 164e8: ce 01 movw r24, r28 164ea: 01 96 adiw r24, 0x01 ; 1 164ec: 0e 94 75 76 call 0xecea ; 0xecea Sound_MakeCustom(50,1000,false); 164f0: 40 e0 ldi r20, 0x00 ; 0 164f2: 68 ee ldi r22, 0xE8 ; 232 164f4: 73 e0 ldi r23, 0x03 ; 3 164f6: 82 e3 ldi r24, 0x32 ; 50 164f8: 90 e0 ldi r25, 0x00 ; 0 164fa: 0f 94 be 27 call 0x24f7c ; 0x24f7c bool M600_check_state_and_repeat(const char* filament_name) { uint8_t lcd_change_filament_state = 10; while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3) { KEEPALIVE_STATE(PAUSED_FOR_USER); 164fe: b4 e0 ldi r27, 0x04 ; 4 16500: 7b 2e mov r7, r27 else // MMU is enabled { if (!automatic) mmu_M600_filament_change_screen(eject_slot); mmu_M600_load_filament(automatic); } if (!automatic) 16502: 11 23 and r17, r17 16504: 09 f4 brne .+2 ; 0x16508 16506: f6 c0 rjmp .+492 ; 0x166f4 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 16508: 0f 94 95 6d call 0x2db2a ; 0x2db2a current_position[Y_AXIS] = y_position; plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); st_synchronize(); bool repeat = false; do { 1650c: 48 a5 ldd r20, Y+40 ; 0x28 1650e: 41 11 cpse r20, r1 16510: 65 cf rjmp .-310 ; 0x163dc 16512: 99 c1 rjmp .+818 ; 0x16846 // In case a power panic happens while waiting for the user // take a partial back up of print state into RAM (current position, etc.) refresh_print_state_in_ram(); float x_position = FILAMENTCHANGE_XPOS; 16514: 20 e0 ldi r18, 0x00 ; 0 16516: 30 e0 ldi r19, 0x00 ; 0 16518: 43 e5 ldi r20, 0x53 ; 83 1651a: 53 e4 ldi r21, 0x43 ; 67 1651c: 28 a7 std Y+40, r18 ; 0x28 1651e: 39 a7 std Y+41, r19 ; 0x29 16520: 4a a7 std Y+42, r20 ; 0x2a 16522: 5b a7 std Y+43, r21 ; 0x2b 16524: bd ce rjmp .-646 ; 0x162a0 float y_position = FILAMENTCHANGE_YPOS; 16526: 1c a6 std Y+44, r1 ; 0x2c 16528: 1d a6 std Y+45, r1 ; 0x2d 1652a: 1e a6 std Y+46, r1 ; 0x2e 1652c: 1f a6 std Y+47, r1 ; 0x2f 1652e: c4 ce rjmp .-632 ; 0x162b8 st_synchronize(); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED); } else { // Print is paused and the extruder may be cold // Filament change can be issued via the Tune menu restore_extruder_temperature_from_ram(); 16530: 0e 94 23 64 call 0xc846 ; 0xc846 16534: 23 cf rjmp .-442 ; 0x1637c //! //! Beep, manage nozzle heater and wait for user to start unload filament //! If times out, active extruder temperature is set to 0. void M600_wait_for_user() { KEEPALIVE_STATE(PAUSED_FOR_USER); 16536: 84 e0 ldi r24, 0x04 ; 4 16538: 80 93 78 02 sts 0x0278, r24 ; 0x800278 unsigned long waiting_start_time = _millis(); 1653c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16540: 2b 01 movw r4, r22 16542: 3c 01 movw r6, r24 uint8_t wait_for_user_state = 0; lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); 16544: 89 e0 ldi r24, 0x09 ; 9 16546: 98 e3 ldi r25, 0x38 ; 56 16548: 0e 94 3a 75 call 0xea74 ; 0xea74 1654c: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 while (!(wait_for_user_state == 0 && lcd_clicked())){ 16550: 0e 94 75 73 call 0xe6ea ; 0xe6ea 16554: 08 2f mov r16, r24 16556: 81 11 cpse r24, r1 16558: 34 c0 rjmp .+104 ; 0x165c2 switch (wait_for_user_state) { case 0: //nozzle is hot, waiting for user to press the knob to unload filament delay_keep_alive(4); if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) { 1655a: a3 01 movw r20, r6 1655c: 92 01 movw r18, r4 1655e: 20 54 subi r18, 0x40 ; 64 16560: 38 4d sbci r19, 0xD8 ; 216 16562: 46 4f sbci r20, 0xF6 ; 246 16564: 5f 4f sbci r21, 0xFF ; 255 16566: 2c a7 std Y+44, r18 ; 0x2c 16568: 3d a7 std Y+45, r19 ; 0x2d 1656a: 4e a7 std Y+46, r20 ; 0x2e 1656c: 5f a7 std Y+47, r21 ; 0x2f unsigned long waiting_start_time = _millis(); uint8_t wait_for_user_state = 0; lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); while (!(wait_for_user_state == 0 && lcd_clicked())){ manage_heater(); 1656e: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 16572: 81 e0 ldi r24, 0x01 ; 1 16574: 0e 94 34 8c call 0x11868 ; 0x11868 if (wait_for_user_state != 2) sound_wait_for_user(); 16578: 02 30 cpi r16, 0x02 ; 2 1657a: 09 f4 brne .+2 ; 0x1657e 1657c: 65 c0 rjmp .+202 ; 0x16648 1657e: 0f 94 62 28 call 0x250c4 ; 0x250c4 st_synchronize(); disable_e0(); } break; case 1: //nozzle target temperature is set to zero, waiting for user to start nozzle preheat delay_keep_alive(4); 16582: 84 e0 ldi r24, 0x04 ; 4 16584: 90 e0 ldi r25, 0x00 ; 0 while (!(wait_for_user_state == 0 && lcd_clicked())){ manage_heater(); manage_inactivity(true); if (wait_for_user_state != 2) sound_wait_for_user(); switch (wait_for_user_state) { 16586: 01 30 cpi r16, 0x01 ; 1 16588: 29 f1 breq .+74 ; 0x165d4 case 0: //nozzle is hot, waiting for user to press the knob to unload filament delay_keep_alive(4); 1658a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) { 1658e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16592: 2c a5 ldd r18, Y+44 ; 0x2c 16594: 3d a5 ldd r19, Y+45 ; 0x2d 16596: 4e a5 ldd r20, Y+46 ; 0x2e 16598: 5f a5 ldd r21, Y+47 ; 0x2f 1659a: 26 17 cp r18, r22 1659c: 37 07 cpc r19, r23 1659e: 48 07 cpc r20, r24 165a0: 59 07 cpc r21, r25 165a2: b0 f6 brcc .-84 ; 0x16550 lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_PREHEAT)); 165a4: 88 ed ldi r24, 0xD8 ; 216 165a6: 97 e3 ldi r25, 0x37 ; 55 165a8: 0e 94 3a 75 call 0xea74 ; 0xea74 165ac: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 165b0: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 165b4: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d wait_for_user_state = 1; setTargetHotend(0); st_synchronize(); 165b8: 0f 94 fb 1a call 0x235f6 ; 0x235f6 disable_e0(); 165bc: 14 9a sbi 0x02, 4 ; 2 case 0: //nozzle is hot, waiting for user to press the knob to unload filament delay_keep_alive(4); if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) { lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_PREHEAT)); wait_for_user_state = 1; 165be: 01 e0 ldi r16, 0x01 ; 1 165c0: d6 cf rjmp .-84 ; 0x1656e 165c2: 10 92 be 04 sts 0x04BE, r1 ; 0x8004be <_ZL10beep_timer.lto_priv.499> /// @brief Resets the global state of sound_wait_for_user() void sound_wait_for_user_reset() { beep_timer.stop(); bFirst = false; 165c6: 10 92 c1 04 sts 0x04C1, r1 ; 0x8004c1 <_ZL6bFirst.lto_priv.500> eject_slot = MMU2::mmu2.get_current_tool(); mmu_M600_unload_filament(); } else { // Beep, manage nozzle heater and wait for user to start unload filament M600_wait_for_user(); unload_filament(e_shift_late); 165ca: c7 01 movw r24, r14 165cc: b6 01 movw r22, r12 165ce: 0e 94 7e e3 call 0x1c6fc ; 0x1c6fc 165d2: 0e cf rjmp .-484 ; 0x163f0 st_synchronize(); disable_e0(); } break; case 1: //nozzle target temperature is set to zero, waiting for user to start nozzle preheat delay_keep_alive(4); 165d4: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (lcd_clicked()) { 165d8: 0e 94 75 73 call 0xe6ea ; 0xe6ea 165dc: 88 23 and r24, r24 165de: 39 f2 breq .-114 ; 0x1656e 165e0: 80 91 5b 12 lds r24, 0x125B ; 0x80125b 165e4: 90 91 5c 12 lds r25, 0x125C ; 0x80125c 165e8: 90 93 5e 12 sts 0x125E, r25 ; 0x80125e 165ec: 80 93 5d 12 sts 0x125D, r24 ; 0x80125d return target_temp_reached; } #endif //PINDA_THERMISTOR void lcd_wait_for_heater() { lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 165f0: 89 e8 ldi r24, 0x89 ; 137 165f2: 9d e3 ldi r25, 0x3D ; 61 165f4: 0e 94 3a 75 call 0xea74 ; 0xea74 165f8: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 165fc: 42 e8 ldi r20, 0x82 ; 130 165fe: 64 e0 ldi r22, 0x04 ; 4 16600: 80 e0 ldi r24, 0x00 ; 0 16602: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder)); 16606: 80 91 5e 12 lds r24, 0x125E ; 0x80125e 1660a: 8f 93 push r24 1660c: 80 91 5d 12 lds r24, 0x125D ; 0x80125d 16610: 8f 93 push r24 16612: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 16616: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1661a: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1661e: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 16622: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 16626: 7f 93 push r23 16628: 6f 93 push r22 1662a: 3f 92 push r3 1662c: 2f 92 push r2 1662e: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_putc(LCD_STR_DEGREE[0]); 16632: 81 e8 ldi r24, 0x81 ; 129 16634: 0e 94 21 6f call 0xde42 ; 0xde42 16638: 0f 90 pop r0 1663a: 0f 90 pop r0 1663c: 0f 90 pop r0 1663e: 0f 90 pop r0 16640: 0f 90 pop r0 16642: 0f 90 pop r0 setTargetHotend(saved_extruder_temperature); lcd_wait_for_heater(); wait_for_user_state = 2; 16644: 02 e0 ldi r16, 0x02 ; 2 16646: 93 cf rjmp .-218 ; 0x1656e return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 16648: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 1664c: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 16650: 07 2e mov r0, r23 16652: 00 0c add r0, r0 16654: 88 0b sbc r24, r24 16656: 99 0b sbc r25, r25 16658: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> } break; case 2: //waiting for nozzle to reach target temperature if (fabs(degTargetHotend(active_extruder) - degHotend(active_extruder)) < TEMP_HYSTERESIS) { 1665c: 20 91 5a 0d lds r18, 0x0D5A ; 0x800d5a 16660: 30 91 5b 0d lds r19, 0x0D5B ; 0x800d5b 16664: 40 91 5c 0d lds r20, 0x0D5C ; 0x800d5c 16668: 50 91 5d 0d lds r21, 0x0D5D ; 0x800d5d 1666c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 16670: 9f 77 andi r25, 0x7F ; 127 16672: 20 e0 ldi r18, 0x00 ; 0 16674: 30 e0 ldi r19, 0x00 ; 0 16676: 40 ea ldi r20, 0xA0 ; 160 16678: 50 e4 ldi r21, 0x40 ; 64 1667a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1667e: 87 ff sbrs r24, 7 16680: 0b c0 rjmp .+22 ; 0x16698 lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); 16682: 89 e0 ldi r24, 0x09 ; 9 16684: 98 e3 ldi r25, 0x38 ; 56 16686: 0e 94 3a 75 call 0xea74 ; 0xea74 1668a: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 waiting_start_time = _millis(); 1668e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16692: 2b 01 movw r4, r22 16694: 3c 01 movw r6, r24 16696: 5c cf rjmp .-328 ; 0x16550 wait_for_user_state = 0; } else { lcd_set_cursor(1, 4); 16698: 64 e0 ldi r22, 0x04 ; 4 1669a: 81 e0 ldi r24, 0x01 ; 1 1669c: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder)); 166a0: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 166a4: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 166a8: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 166ac: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 166b0: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 166b4: 7f 93 push r23 166b6: 6f 93 push r22 166b8: 9f 92 push r9 166ba: 8f 92 push r8 166bc: 0e 94 0b 6f call 0xde16 ; 0xde16 166c0: 0f 90 pop r0 166c2: 0f 90 pop r0 166c4: 0f 90 pop r0 166c6: 0f 90 pop r0 166c8: 52 cf rjmp .-348 ; 0x1656e } M600_load_filament(filament_name); } else // MMU is enabled { if (!automatic) mmu_M600_filament_change_screen(eject_slot); 166ca: 11 11 cpse r17, r1 166cc: 03 c0 rjmp .+6 ; 0x166d4 166ce: 8b 2d mov r24, r11 166d0: 0e 94 b1 8e call 0x11d62 ; 0x11d62 mmu_M600_load_filament(automatic); 166d4: 81 2f mov r24, r17 166d6: 0e 94 82 7b call 0xf704 ; 0xf704 166da: 11 cf rjmp .-478 ; 0x164fe cursor_pos--; else Sound_MakeSound(e_SOUND_TYPE_BlindAlert); } else if (lcd_encoder > 0) { // Rotating knob clockwise if (cursor_pos < 3) 166dc: 03 30 cpi r16, 0x03 ; 3 166de: 10 f4 brcc .+4 ; 0x166e4 cursor_pos++; 166e0: 0f 5f subi r16, 0xFF ; 255 166e2: 49 c0 rjmp .+146 ; 0x16776 else Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 166e4: 87 e0 ldi r24, 0x07 ; 7 166e6: 0f 94 ad 25 call 0x24b5a ; 0x24b5a 166ea: 45 c0 rjmp .+138 ; 0x16776 mmu_M600_filament_change_screen(eject_slot); // After user clicks knob, MMU will load the filament mmu_M600_load_filament(false); } else { M600_load_filament_movements(filament_name); 166ec: ce 01 movw r24, r28 166ee: 01 96 adiw r24, 0x01 ; 1 166f0: 0e 94 75 76 call 0xecea ; 0xecea bool M600_check_state_and_repeat(const char* filament_name) { uint8_t lcd_change_filament_state = 10; while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3) { KEEPALIVE_STATE(PAUSED_FOR_USER); 166f4: 70 92 78 02 sts 0x0278, r7 ; 0x800278 uint8_t lcd_alright() { uint8_t cursor_pos = 0; lcd_clear(); 166f8: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(1, 0, _T(MSG_CORRECTLY)); 166fc: 85 e8 ldi r24, 0x85 ; 133 166fe: 98 e3 ldi r25, 0x38 ; 56 16700: 0e 94 3a 75 call 0xea74 ; 0xea74 16704: ac 01 movw r20, r24 16706: 60 e0 ldi r22, 0x00 ; 0 16708: 81 e0 ldi r24, 0x01 ; 1 1670a: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(1, 1, _T(MSG_NOT_LOADED)); 1670e: 8f e6 ldi r24, 0x6F ; 111 16710: 98 e3 ldi r25, 0x38 ; 56 16712: 0e 94 3a 75 call 0xea74 ; 0xea74 16716: ac 01 movw r20, r24 16718: 61 e0 ldi r22, 0x01 ; 1 1671a: 81 e0 ldi r24, 0x01 ; 1 1671c: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(1, 2, _T(MSG_NOT_COLOR)); 16720: 8b e5 ldi r24, 0x5B ; 91 16722: 98 e3 ldi r25, 0x38 ; 56 16724: 0e 94 3a 75 call 0xea74 ; 0xea74 16728: ac 01 movw r20, r24 1672a: 62 e0 ldi r22, 0x02 ; 2 1672c: 81 e0 ldi r24, 0x01 ; 1 1672e: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(1, 3, _T(MSG_UNLOAD_FILAMENT)); 16732: 82 e5 ldi r24, 0x52 ; 82 16734: 97 e4 ldi r25, 0x47 ; 71 16736: 0e 94 3a 75 call 0xea74 ; 0xea74 1673a: ac 01 movw r20, r24 1673c: 63 e0 ldi r22, 0x03 ; 3 1673e: 81 e0 ldi r24, 0x01 ; 1 16740: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc_at(0, cursor_pos, '>'); 16744: 4e e3 ldi r20, 0x3E ; 62 16746: 60 e0 ldi r22, 0x00 ; 0 16748: 80 e0 ldi r24, 0x00 ; 0 1674a: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_consume_click(); 1674e: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 uint8_t lcd_alright() { uint8_t cursor_pos = 0; 16752: 00 e0 ldi r16, 0x00 ; 0 lcd_putc_at(0, cursor_pos, '>'); lcd_consume_click(); while (1) { manage_heater(); 16754: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 16758: 81 e0 ldi r24, 0x01 ; 1 1675a: 0e 94 34 8c call 0x11868 ; 0x11868 if (lcd_encoder) 1675e: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 16762: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 16766: 00 97 sbiw r24, 0x00 ; 0 16768: d9 f0 breq .+54 ; 0x167a0 { if (lcd_encoder < 0 ) { 1676a: 97 ff sbrs r25, 7 1676c: b7 cf rjmp .-146 ; 0x166dc // Rotating knob counter clockwise if (cursor_pos > 0) 1676e: 00 23 and r16, r16 16770: 09 f4 brne .+2 ; 0x16774 16772: b8 cf rjmp .-144 ; 0x166e4 cursor_pos--; 16774: 01 50 subi r16, 0x01 ; 1 else Sound_MakeSound(e_SOUND_TYPE_BlindAlert); } // Update '>' render only lcd_puts_at_P(0, 0, PSTR(" \n \n \n ")); 16776: 4e e4 ldi r20, 0x4E ; 78 16778: 59 e7 ldi r21, 0x79 ; 121 1677a: 60 e0 ldi r22, 0x00 ; 0 1677c: 80 e0 ldi r24, 0x00 ; 0 1677e: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc_at(0, cursor_pos, '>'); 16782: 4e e3 ldi r20, 0x3E ; 62 16784: 60 2f mov r22, r16 16786: 80 e0 ldi r24, 0x00 ; 0 16788: 0e 94 13 70 call 0xe026 ; 0xe026 // Consume rotation event and make feedback sound lcd_encoder = 0; 1678c: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 16790: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e _delay(100); 16794: 64 e6 ldi r22, 0x64 ; 100 16796: 70 e0 ldi r23, 0x00 ; 0 16798: 80 e0 ldi r24, 0x00 ; 0 1679a: 90 e0 ldi r25, 0x00 ; 0 1679c: 0f 94 bd 0d call 0x21b7a ; 0x21b7a } if (lcd_clicked()) 167a0: 0e 94 75 73 call 0xe6ea ; 0xe6ea 167a4: 88 23 and r24, r24 167a6: b1 f2 breq .-84 ; 0x16754 { lcd_clear(); 167a8: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_return_to_status(); 167ac: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_change_filament_state = lcd_alright(); KEEPALIVE_STATE(IN_HANDLER); 167b0: a0 92 78 02 sts 0x0278, r10 ; 0x800278 switch(lcd_change_filament_state) 167b4: 02 30 cpi r16, 0x02 ; 2 167b6: b1 f0 breq .+44 ; 0x167e4 167b8: 03 30 cpi r16, 0x03 ; 3 167ba: 09 f4 brne .+2 ; 0x167be 167bc: f6 c0 rjmp .+492 ; 0x169aa 167be: 01 30 cpi r16, 0x01 ; 1 167c0: 81 f5 brne .+96 ; 0x16822 { // Filament failed to load so load it again case 1: if (MMU2::mmu2.Enabled()) { 167c2: 80 91 01 13 lds r24, 0x1301 ; 0x801301 167c6: 81 30 cpi r24, 0x01 ; 1 167c8: 09 f0 breq .+2 ; 0x167cc 167ca: 90 cf rjmp .-224 ; 0x166ec uint8_t eject_slot = MMU2::mmu2.get_current_tool(); 167cc: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 167d0: 08 2f mov r16, r24 // Unload filament mmu_M600_unload_filament(); 167d2: 0e 94 bc 76 call 0xed78 ; 0xed78 // Ask to remove any old filament and load new mmu_M600_filament_change_screen(eject_slot); 167d6: 80 2f mov r24, r16 167d8: 0e 94 b1 8e call 0x11d62 ; 0x11d62 // After user clicks knob, MMU will load the filament mmu_M600_load_filament(false); 167dc: 80 e0 ldi r24, 0x00 ; 0 167de: 0e 94 82 7b call 0xf704 ; 0xf704 167e2: 88 cf rjmp .-240 ; 0x166f4 } break; // Filament loaded properly but color is not clear case 2: st_synchronize(); 167e4: 0f 94 fb 1a call 0x235f6 ; 0x235f6 load_filament_final_feed(); 167e8: 0e 94 ed 63 call 0xc7da ; 0xc7da void lcd_loading_color() { //we are extruding 25mm with feedrate 200mm/min -> 7.5 seconds for whole action, 0.375 s for one character lcd_clear(); 167ec: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_LOADING_COLOR)); 167f0: 89 e9 ldi r24, 0x99 ; 153 167f2: 98 e3 ldi r25, 0x38 ; 56 167f4: 0e 94 3a 75 call 0xea74 ; 0xea74 167f8: ac 01 movw r20, r24 167fa: 60 e0 ldi r22, 0x00 ; 0 167fc: 80 e0 ldi r24, 0x00 ; 0 167fe: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); 16802: 85 e6 ldi r24, 0x65 ; 101 16804: 99 e3 ldi r25, 0x39 ; 57 16806: 0e 94 3a 75 call 0xea74 ; 0xea74 1680a: ac 01 movw r20, r24 1680c: 62 e0 ldi r22, 0x02 ; 2 1680e: 80 e0 ldi r24, 0x00 ; 0 16810: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_loading_progress_bar((FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL); //show progress bar during filament loading slow sequence 16814: 87 e9 ldi r24, 0x97 ; 151 16816: 9d e1 ldi r25, 0x1D ; 29 16818: 0f 94 b2 0b call 0x21764 ; 0x21764 lcd_loading_color(); st_synchronize(); 1681c: 0f 94 fb 1a call 0x235f6 ; 0x235f6 16820: 69 cf rjmp .-302 ; 0x166f4 } void lcd_change_success() { lcd_clear(); 16822: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS)); 16826: 89 ea ldi r24, 0xA9 ; 169 16828: 98 e3 ldi r25, 0x38 ; 56 1682a: 0e 94 3a 75 call 0xea74 ; 0xea74 1682e: ac 01 movw r20, r24 16830: 62 e0 ldi r22, 0x02 ; 2 16832: 80 e0 ldi r24, 0x00 ; 0 16834: 0e 94 07 70 call 0xe00e ; 0xe00e //! @brief Wait for user to check the state bool M600_check_state_and_repeat(const char* filament_name) { uint8_t lcd_change_filament_state = 10; while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3) 16838: 00 23 and r16, r16 1683a: 19 f0 breq .+6 ; 0x16842 1683c: 03 30 cpi r16, 0x03 ; 3 1683e: 09 f0 breq .+2 ; 0x16842 16840: 59 cf rjmp .-334 ; 0x166f4 16842: 0f 94 95 6d call 0x2db2a ; 0x2db2a if (!automatic) repeat = M600_check_state_and_repeat(filament_name); } while (repeat); lcd_update_enable(true); 16846: 81 e0 ldi r24, 0x01 ; 1 16848: 0e 94 38 70 call 0xe070 ; 0xe070 // Not let's go back to print fanSpeed = saved_fan_speed; 1684c: 80 91 54 12 lds r24, 0x1254 ; 0x801254 16850: 80 93 55 12 sts 0x1255, r24 ; 0x801255 // Feed a little of filament to stabilize pressure if (!automatic) { 16854: 11 11 cpse r17, r1 16856: 27 c0 rjmp .+78 ; 0x168a6 if (printingIsPaused()) 16858: 0e 94 35 66 call 0xcc6a ; 0xcc6a 1685c: c0 90 6d 12 lds r12, 0x126D ; 0x80126d 16860: d0 90 6e 12 lds r13, 0x126E ; 0x80126e 16864: e0 90 6f 12 lds r14, 0x126F ; 0x80126f 16868: f0 90 70 12 lds r15, 0x1270 ; 0x801270 1686c: 88 23 and r24, r24 1686e: 09 f4 brne .+2 ; 0x16872 16870: 9f c0 rjmp .+318 ; 0x169b0 { // Return to retracted state during a pause // @todo is retraction really needed? E-position is reverted a few lines below current_position[E_AXIS] -= default_retraction; 16872: 20 e0 ldi r18, 0x00 ; 0 16874: 30 e0 ldi r19, 0x00 ; 0 16876: 40 e8 ldi r20, 0x80 ; 128 16878: 5f e3 ldi r21, 0x3F ; 63 1687a: c7 01 movw r24, r14 1687c: b6 01 movw r22, r12 1687e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 16882: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 16886: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 1688a: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 1688e: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED); 16892: 60 e0 ldi r22, 0x00 ; 0 16894: 70 e0 ldi r23, 0x00 ; 0 16896: 88 ee ldi r24, 0xE8 ; 232 16898: 92 e4 ldi r25, 0x42 ; 66 1689a: 0f 94 81 4c call 0x29902 ; 0x29902 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 1689e: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 168a2: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED); } } // Move XY back plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED); 168a6: e0 90 69 12 lds r14, 0x1269 ; 0x801269 168aa: f0 90 6a 12 lds r15, 0x126A ; 0x80126a 168ae: 00 91 6b 12 lds r16, 0x126B ; 0x80126b 168b2: 10 91 6c 12 lds r17, 0x126C ; 0x80126c 168b6: 20 91 94 02 lds r18, 0x0294 ; 0x800294 168ba: 30 91 95 02 lds r19, 0x0295 ; 0x800295 168be: 40 91 96 02 lds r20, 0x0296 ; 0x800296 168c2: 50 91 97 02 lds r21, 0x0297 ; 0x800297 168c6: 60 91 90 02 lds r22, 0x0290 ; 0x800290 168ca: 70 91 91 02 lds r23, 0x0291 ; 0x800291 168ce: 80 91 92 02 lds r24, 0x0292 ; 0x800292 168d2: 90 91 93 02 lds r25, 0x0293 ; 0x800293 168d6: 1f 92 push r1 168d8: 1f 92 push r1 168da: 1f 92 push r1 168dc: 1f 92 push r1 168de: 81 2c mov r8, r1 168e0: 91 2c mov r9, r1 168e2: e8 e4 ldi r30, 0x48 ; 72 168e4: ae 2e mov r10, r30 168e6: e2 e4 ldi r30, 0x42 ; 66 168e8: be 2e mov r11, r30 168ea: fd e6 ldi r31, 0x6D ; 109 168ec: cf 2e mov r12, r31 168ee: f2 e1 ldi r31, 0x12 ; 18 168f0: df 2e mov r13, r31 168f2: 0f 94 33 3d call 0x27a66 ; 0x27a66 st_synchronize(); 168f6: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Move Z back plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED); 168fa: e0 90 98 02 lds r14, 0x0298 ; 0x800298 168fe: f0 90 99 02 lds r15, 0x0299 ; 0x800299 16902: 00 91 9a 02 lds r16, 0x029A ; 0x80029a 16906: 10 91 9b 02 lds r17, 0x029B ; 0x80029b 1690a: 20 91 94 02 lds r18, 0x0294 ; 0x800294 1690e: 30 91 95 02 lds r19, 0x0295 ; 0x800295 16912: 40 91 96 02 lds r20, 0x0296 ; 0x800296 16916: 50 91 97 02 lds r21, 0x0297 ; 0x800297 1691a: 60 91 90 02 lds r22, 0x0290 ; 0x800290 1691e: 70 91 91 02 lds r23, 0x0291 ; 0x800291 16922: 80 91 92 02 lds r24, 0x0292 ; 0x800292 16926: 90 91 93 02 lds r25, 0x0293 ; 0x800293 1692a: 1f 92 push r1 1692c: 1f 92 push r1 1692e: 1f 92 push r1 16930: 1f 92 push r1 16932: 81 2c mov r8, r1 16934: 91 2c mov r9, r1 16936: a0 e7 ldi r26, 0x70 ; 112 16938: aa 2e mov r10, r26 1693a: a1 e4 ldi r26, 0x41 ; 65 1693c: ba 2e mov r11, r26 1693e: 0f 94 33 3d call 0x27a66 ; 0x27a66 st_synchronize(); 16942: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Set E position to original plan_set_e_position(saved_pos[E_AXIS]); 16946: 8c e9 ldi r24, 0x9C ; 156 16948: 92 e0 ldi r25, 0x02 ; 2 1694a: 0f 94 d9 3c call 0x279b2 ; 0x279b2 memcpy(current_position, saved_pos, sizeof(saved_pos)); 1694e: 80 e1 ldi r24, 0x10 ; 16 16950: e0 e9 ldi r30, 0x90 ; 144 16952: f2 e0 ldi r31, 0x02 ; 2 16954: a1 e6 ldi r26, 0x61 ; 97 16956: b2 e1 ldi r27, 0x12 ; 18 16958: 01 90 ld r0, Z+ 1695a: 0d 92 st X+, r0 1695c: 8a 95 dec r24 1695e: e1 f7 brne .-8 ; 0x16958 set_destination_to_current(); 16960: 0e 94 ae 66 call 0xcd5c ; 0xcd5c // Recover feed rate feedmultiply = saved_feedmultiply2; 16964: 80 91 5f 12 lds r24, 0x125F ; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498> 16968: 90 91 60 12 lds r25, 0x1260 ; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1> 1696c: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e 16970: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f enquecommandf_P(MSG_M220, saved_feedmultiply2); 16974: 9f 93 push r25 16976: 8f 93 push r24 16978: 87 ee ldi r24, 0xE7 ; 231 1697a: 94 e6 ldi r25, 0x64 ; 100 1697c: 9f 93 push r25 1697e: 8f 93 push r24 16980: 0e 94 b7 8f call 0x11f6e ; 0x11f6e if (printingIsPaused()) { 16984: 0e 94 35 66 call 0xcc6a ; 0xcc6a 16988: 0f b6 in r0, 0x3f ; 63 1698a: f8 94 cli 1698c: de bf out 0x3e, r29 ; 62 1698e: 0f be out 0x3f, r0 ; 63 16990: cd bf out 0x3d, r28 ; 61 16992: 88 23 and r24, r24 16994: 21 f1 breq .+72 ; 0x169de lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); 16996: 8f eb ldi r24, 0xBF ; 191 16998: 9b e4 ldi r25, 0x4B ; 75 1699a: 0e 94 3a 75 call 0xea74 ; 0xea74 1699e: 0e 94 94 de call 0x1bd28 ; 0x1bd28 } else { lcd_setstatuspgm(MSG_WELCOME); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED); } custom_message_type = CustomMsg::Status; 169a2: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d 169a6: 0c 94 07 a4 jmp 0x1480e ; 0x1480e st_synchronize(); break; // Unload filament case 3: return true; 169aa: 31 e0 ldi r19, 0x01 ; 1 169ac: 38 a7 std Y+40, r19 ; 0x28 169ae: ac cd rjmp .-1192 ; 0x16508 setTargetHotend(0); } else { // Feed a little of filament to stabilize pressure current_position[E_AXIS] += FILAMENTCHANGE_RECFEED; 169b0: 20 e0 ldi r18, 0x00 ; 0 169b2: 30 e0 ldi r19, 0x00 ; 0 169b4: 40 ea ldi r20, 0xA0 ; 160 169b6: 50 e4 ldi r21, 0x40 ; 64 169b8: c7 01 movw r24, r14 169ba: b6 01 movw r22, r12 169bc: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 169c0: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 169c4: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 169c8: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 169cc: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED); 169d0: 60 e0 ldi r22, 0x00 ; 0 169d2: 70 e0 ldi r23, 0x00 ; 0 169d4: 80 e0 ldi r24, 0x00 ; 0 169d6: 90 e4 ldi r25, 0x40 ; 64 169d8: 0f 94 81 4c call 0x29902 ; 0x29902 169dc: 64 cf rjmp .-312 ; 0x168a6 if (printingIsPaused()) { lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); } else { lcd_setstatuspgm(MSG_WELCOME); 169de: 86 ee ldi r24, 0xE6 ; 230 169e0: 9b e6 ldi r25, 0x6B ; 107 169e2: 0e 94 94 de call 0x1bd28 ; 0x1bd28 SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED); 169e6: 8b e3 ldi r24, 0x3B ; 59 169e8: 98 e6 ldi r25, 0x68 ; 104 169ea: 0e 94 bd 7c call 0xf97a ; 0xf97a 169ee: d9 cf rjmp .-78 ; 0x169a2 SERIAL_ECHOPGM("Y:"); SERIAL_ECHOLN(pause_position[Y_AXIS]); SERIAL_ECHOPGM("Z:"); SERIAL_ECHOLN(pause_position[Z_AXIS]); */ if (!printingIsPaused()) { 169f0: 0e 94 35 66 call 0xcc6a ; 0xcc6a 169f4: 81 11 cpse r24, r1 169f6: 0c 94 07 a4 jmp 0x1480e ; 0x1480e st_synchronize(); 169fa: 0f 94 fb 1a call 0x235f6 ; 0x235f6 ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front(); 169fe: 0e 94 22 85 call 0x10a44 ; 0x10a44 cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore 16a02: 0e 94 43 79 call 0xf286 ; 0xf286 lcd_pause_print(); 16a06: 0f 94 fc 0d call 0x21bf8 ; 0x21bf8 16a0a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e /*! ### M602 - Resume print M602: Resume print */ case 602: { if (printingIsPaused()) lcd_resume_print(); 16a0e: 0e 94 35 66 call 0xcc6a ; 0xcc6a 16a12: 88 23 and r24, r24 16a14: 11 f4 brne .+4 ; 0x16a1a 16a16: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 16a1a: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 SERIAL_PROTOCOL(max_sheets-1); SERIAL_PROTOCOLLN(""); break; // invalid sheet ID } } else { iSel = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 16a1e: 81 ea ldi r24, 0xA1 ; 161 16a20: 9d e0 ldi r25, 0x0D ; 13 16a22: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16a26: 18 2f mov r17, r24 } if (code_seen('Z')){ 16a28: 8a e5 ldi r24, 0x5A ; 90 16a2a: 0e 94 f5 55 call 0xabea ; 0xabea 16a2e: 88 23 and r24, r24 16a30: 09 f4 brne .+2 ; 0x16a34 16a32: d7 c0 rjmp .+430 ; 0x16be2 z_val = code_value(); 16a34: 0e 94 85 5a call 0xb50a ; 0xb50a 16a38: 2b 01 movw r4, r22 16a3a: 3c 01 movw r6, r24 zraw = z_val*cs.axis_steps_per_mm[Z_AXIS]; 16a3c: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 16a40: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 16a44: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 16a48: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 16a4c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 16a50: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 16a54: 6b 01 movw r12, r22 if ((zraw < Z_BABYSTEP_MIN) || (zraw > Z_BABYSTEP_MAX)) 16a56: 9b 01 movw r18, r22 16a58: 21 56 subi r18, 0x61 ; 97 16a5a: 30 4f sbci r19, 0xF0 ; 240 16a5c: 20 3a cpi r18, 0xA0 ; 160 16a5e: 3f 40 sbci r19, 0x0F ; 15 16a60: 30 f0 brcs .+12 ; 0x16a6e { SERIAL_PROTOCOLLNPGM(" Z VALUE OUT OF RANGE"); 16a62: 84 e1 ldi r24, 0x14 ; 20 16a64: 9f e7 ldi r25, 0x7F ; 127 16a66: 0e 94 bd 7c call 0xf97a ; 0xf97a 16a6a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e break; } eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw); 16a6e: 5b e0 ldi r21, 0x0B ; 11 16a70: 15 9f mul r17, r21 16a72: 90 01 movw r18, r0 16a74: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 16a76: c9 01 movw r24, r18 16a78: 80 5b subi r24, 0xB0 ; 176 16a7a: 92 4f sbci r25, 0xF2 ; 242 16a7c: 0f 94 22 a4 call 0x34844 ; 0x34844 { zraw = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base->s[iSel].z_offset))); z_val = ((float)zraw/cs.axis_steps_per_mm[Z_AXIS]); } if (code_seen('L')) 16a80: 8c e4 ldi r24, 0x4C ; 76 16a82: 0e 94 f5 55 call 0xabea ; 0xabea 16a86: bb e0 ldi r27, 0x0B ; 11 16a88: 1b 9f mul r17, r27 16a8a: 70 01 movw r14, r0 16a8c: 11 24 eor r1, r1 16a8e: 57 01 movw r10, r14 16a90: e7 eb ldi r30, 0xB7 ; 183 16a92: ae 1a sub r10, r30 16a94: e2 ef ldi r30, 0xF2 ; 242 16a96: be 0a sbc r11, r30 16a98: 88 23 and r24, r24 16a9a: 09 f4 brne .+2 ; 0x16a9e 16a9c: be c0 rjmp .+380 ; 0x16c1a { char *src = strchr_pointer + 1; 16a9e: e0 91 bb 04 lds r30, 0x04BB ; 0x8004bb 16aa2: f0 91 bc 04 lds r31, 0x04BC ; 0x8004bc 16aa6: 31 96 adiw r30, 0x01 ; 1 16aa8: bf 01 movw r22, r30 while (*src == ' ') ++src; 16aaa: 81 91 ld r24, Z+ 16aac: 80 32 cpi r24, 0x20 ; 32 16aae: e1 f3 breq .-8 ; 0x16aa8 if (*src != '\0') 16ab0: 88 23 and r24, r24 16ab2: 31 f0 breq .+12 ; 0x16ac0 { strncpy(strLabel,src,7); 16ab4: 47 e0 ldi r20, 0x07 ; 7 16ab6: 50 e0 ldi r21, 0x00 ; 0 16ab8: ce 01 movw r24, r28 16aba: 01 96 adiw r24, 0x01 ; 1 16abc: 0f 94 60 aa call 0x354c0 ; 0x354c0 #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 16ac0: 47 e0 ldi r20, 0x07 ; 7 16ac2: 50 e0 ldi r21, 0x00 ; 0 16ac4: b5 01 movw r22, r10 16ac6: ce 01 movw r24, r28 16ac8: 01 96 adiw r24, 0x01 ; 1 16aca: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 else { eeprom_read_block(strLabel, EEPROM_Sheets_base->s[iSel].name, sizeof(Sheet::name)); } if (code_seen('B')) 16ace: 82 e4 ldi r24, 0x42 ; 66 16ad0: 0e 94 f5 55 call 0xabea ; 0xabea 16ad4: 57 01 movw r10, r14 16ad6: fe ea ldi r31, 0xAE ; 174 16ad8: af 1a sub r10, r31 16ada: f2 ef ldi r31, 0xF2 ; 242 16adc: bf 0a sbc r11, r31 16ade: 88 23 and r24, r24 16ae0: 09 f4 brne .+2 ; 0x16ae4 16ae2: a3 c0 rjmp .+326 ; 0x16c2a { iBedC = code_value_uint8(); 16ae4: 0e 94 0a 56 call 0xac14 ; 0xac14 16ae8: 98 2e mov r9, r24 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 16aea: 68 2f mov r22, r24 16aec: c5 01 movw r24, r10 16aee: 0f 94 04 a4 call 0x34808 ; 0x34808 else { iBedC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].bed_temp); } if (code_seen('P')) 16af2: 80 e5 ldi r24, 0x50 ; 80 16af4: 0e 94 f5 55 call 0xabea ; 0xabea 16af8: 2d ea ldi r18, 0xAD ; 173 16afa: e2 1a sub r14, r18 16afc: 22 ef ldi r18, 0xF2 ; 242 16afe: f2 0a sbc r15, r18 16b00: 88 23 and r24, r24 16b02: 09 f4 brne .+2 ; 0x16b06 16b04: 97 c0 rjmp .+302 ; 0x16c34 { iPindaC = code_value_uint8(); 16b06: 0e 94 0a 56 call 0xac14 ; 0xac14 16b0a: b8 2e mov r11, r24 16b0c: 68 2f mov r22, r24 16b0e: c7 01 movw r24, r14 16b10: 0f 94 04 a4 call 0x34808 ; 0x34808 else { iPindaC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].pinda_temp); } if (code_seen('A')) 16b14: 81 e4 ldi r24, 0x41 ; 65 16b16: 0e 94 f5 55 call 0xabea ; 0xabea 16b1a: 88 23 and r24, r24 16b1c: 09 f4 brne .+2 ; 0x16b20 16b1e: 8f c0 rjmp .+286 ; 0x16c3e { bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); 16b20: 0e 94 0a 56 call 0xac14 ; 0xac14 16b24: 81 11 cpse r24, r1 16b26: 06 c0 rjmp .+12 ; 0x16b34 16b28: 81 ea ldi r24, 0xA1 ; 161 16b2a: 9d e0 ldi r25, 0x0D ; 13 16b2c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16b30: 18 13 cpse r17, r24 16b32: 8d c0 rjmp .+282 ; 0x16c4e if(bIsActive && eeprom_is_sheet_initialized(iSel)) { 16b34: 81 2f mov r24, r17 16b36: 0e 94 88 78 call 0xf110 ; 0xf110 16b3a: 08 2f mov r16, r24 16b3c: 88 23 and r24, r24 16b3e: 29 f0 breq .+10 ; 0x16b4a 16b40: 61 2f mov r22, r17 16b42: 81 ea ldi r24, 0xA1 ; 161 16b44: 9d e0 ldi r25, 0x0D ; 13 16b46: 0f 94 04 a4 call 0x34808 ; 0x34808 else { bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); } SERIAL_PROTOCOLPGM("Sheet "); 16b4a: 8d e0 ldi r24, 0x0D ; 13 16b4c: 9f e7 ldi r25, 0x7F ; 127 16b4e: 0e 94 c4 7a call 0xf588 ; 0xf588 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 16b52: 61 2f mov r22, r17 16b54: 70 e0 ldi r23, 0x00 ; 0 16b56: 90 e0 ldi r25, 0x00 ; 0 16b58: 80 e0 ldi r24, 0x00 ; 0 16b5a: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL((int)iSel); if (!eeprom_is_sheet_initialized(iSel)) 16b5e: 81 2f mov r24, r17 16b60: 0e 94 88 78 call 0xf110 ; 0xf110 16b64: 81 11 cpse r24, r1 16b66: 04 c0 rjmp .+8 ; 0x16b70 SERIAL_PROTOCOLLNPGM(" NOT INITIALIZED"); 16b68: 8c ef ldi r24, 0xFC ; 252 16b6a: 9e e7 ldi r25, 0x7E ; 126 16b6c: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLPGM(" Z"); 16b70: 89 ef ldi r24, 0xF9 ; 249 16b72: 9e e7 ldi r25, 0x7E ; 126 16b74: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 16b78: 44 e0 ldi r20, 0x04 ; 4 16b7a: c3 01 movw r24, r6 16b7c: b2 01 movw r22, r4 16b7e: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(z_val,4); SERIAL_PROTOCOLPGM(" R"); 16b82: 86 ef ldi r24, 0xF6 ; 246 16b84: 9e e7 ldi r25, 0x7E ; 126 16b86: 0e 94 c4 7a call 0xf588 ; 0xf588 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 16b8a: b6 01 movw r22, r12 16b8c: dd 0c add r13, r13 16b8e: 88 0b sbc r24, r24 16b90: 99 0b sbc r25, r25 16b92: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL((int)zraw); SERIAL_PROTOCOLPGM(" L"); 16b96: 83 ef ldi r24, 0xF3 ; 243 16b98: 9e e7 ldi r25, 0x7E ; 126 16b9a: 0e 94 c4 7a call 0xf588 ; 0xf588 16b9e: ce 01 movw r24, r28 16ba0: 01 96 adiw r24, 0x01 ; 1 16ba2: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_PROTOCOL(strLabel); SERIAL_PROTOCOLPGM(" B"); 16ba6: 80 ef ldi r24, 0xF0 ; 240 16ba8: 9e e7 ldi r25, 0x7E ; 126 16baa: 0e 94 c4 7a call 0xf588 ; 0xf588 16bae: 69 2d mov r22, r9 16bb0: 70 e0 ldi r23, 0x00 ; 0 16bb2: 90 e0 ldi r25, 0x00 ; 0 16bb4: 80 e0 ldi r24, 0x00 ; 0 16bb6: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL((int)iBedC); SERIAL_PROTOCOLPGM(" P"); 16bba: 8d ee ldi r24, 0xED ; 237 16bbc: 9e e7 ldi r25, 0x7E ; 126 16bbe: 0e 94 c4 7a call 0xf588 ; 0xf588 16bc2: 6b 2d mov r22, r11 16bc4: 70 e0 ldi r23, 0x00 ; 0 16bc6: 90 e0 ldi r25, 0x00 ; 0 16bc8: 80 e0 ldi r24, 0x00 ; 0 16bca: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL((int)iPindaC); SERIAL_PROTOCOLPGM(" A"); 16bce: 8a ee ldi r24, 0xEA ; 234 16bd0: 9e e7 ldi r25, 0x7E ; 126 16bd2: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN((int)bIsActive); 16bd6: 80 2f mov r24, r16 16bd8: 90 e0 ldi r25, 0x00 ; 0 16bda: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e 16bde: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw); } else { zraw = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base->s[iSel].z_offset))); 16be2: ab e0 ldi r26, 0x0B ; 11 16be4: 1a 9f mul r17, r26 16be6: c0 01 movw r24, r0 16be8: 11 24 eor r1, r1 16bea: 80 5b subi r24, 0xB0 ; 176 16bec: 92 4f sbci r25, 0xF2 ; 242 16bee: 0f 94 ee a3 call 0x347dc ; 0x347dc 16bf2: 6c 01 movw r12, r24 z_val = ((float)zraw/cs.axis_steps_per_mm[Z_AXIS]); 16bf4: bc 01 movw r22, r24 16bf6: 99 0f add r25, r25 16bf8: 88 0b sbc r24, r24 16bfa: 99 0b sbc r25, r25 16bfc: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 16c00: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 16c04: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 16c08: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 16c0c: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 16c10: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 16c14: 2b 01 movw r4, r22 16c16: 3c 01 movw r6, r24 16c18: 33 cf rjmp .-410 ; 0x16a80 } eeprom_update_block_notify(strLabel,EEPROM_Sheets_base->s[iSel].name,sizeof(Sheet::name)); } else { eeprom_read_block(strLabel, EEPROM_Sheets_base->s[iSel].name, sizeof(Sheet::name)); 16c1a: 47 e0 ldi r20, 0x07 ; 7 16c1c: 50 e0 ldi r21, 0x00 ; 0 16c1e: b5 01 movw r22, r10 16c20: ce 01 movw r24, r28 16c22: 01 96 adiw r24, 0x01 ; 1 16c24: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 16c28: 52 cf rjmp .-348 ; 0x16ace iBedC = code_value_uint8(); eeprom_update_byte_notify(&EEPROM_Sheets_base->s[iSel].bed_temp, iBedC); } else { iBedC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].bed_temp); 16c2a: c5 01 movw r24, r10 16c2c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16c30: 98 2e mov r9, r24 16c32: 5f cf rjmp .-322 ; 0x16af2 iPindaC = code_value_uint8(); eeprom_update_byte_notify(&EEPROM_Sheets_base->s[iSel].pinda_temp, iPindaC); } else { iPindaC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].pinda_temp); 16c34: c7 01 movw r24, r14 16c36: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16c3a: b8 2e mov r11, r24 16c3c: 6b cf rjmp .-298 ; 0x16b14 bIsActive = 0; } } else { bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); 16c3e: 81 ea ldi r24, 0xA1 ; 161 16c40: 9d e0 ldi r25, 0x0D ; 13 16c42: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16c46: 01 e0 ldi r16, 0x01 ; 1 16c48: 18 17 cp r17, r24 16c4a: 09 f4 brne .+2 ; 0x16c4e 16c4c: 7e cf rjmp .-260 ; 0x16b4a { bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); if(bIsActive && eeprom_is_sheet_initialized(iSel)) { eeprom_update_byte_notify(&EEPROM_Sheets_base->active_sheet, iSel); } else { bIsActive = 0; 16c4e: 00 e0 ldi r16, 0x00 ; 0 16c50: 7c cf rjmp .-264 ; 0x16b4a */ case 860: { int set_target_pinda = 0; if (code_seen('S')) { 16c52: 83 e5 ldi r24, 0x53 ; 83 16c54: 0e 94 f5 55 call 0xabea ; 0xabea 16c58: 88 23 and r24, r24 16c5a: 11 f4 brne .+4 ; 0x16c60 16c5c: 0c 94 07 a4 jmp 0x1480e ; 0x1480e set_target_pinda = code_value_short(); 16c60: 0e 94 17 56 call 0xac2e ; 0xac2e 16c64: 8c 01 movw r16, r24 } else { break; } LCD_MESSAGERPGM(_T(MSG_PLEASE_WAIT)); 16c66: 85 e6 ldi r24, 0x65 ; 101 16c68: 99 e3 ldi r25, 0x39 ; 57 16c6a: 0e 94 3a 75 call 0xea74 ; 0xea74 16c6e: 0e 94 94 de call 0x1bd28 ; 0x1bd28 SERIAL_PROTOCOLPGM("Wait for PINDA target temperature:"); 16c72: 87 ec ldi r24, 0xC7 ; 199 16c74: 9e e7 ldi r25, 0x7E ; 126 16c76: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(set_target_pinda); 16c7a: c8 01 movw r24, r16 16c7c: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e codenum = _millis(); 16c80: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16c84: 4b 01 movw r8, r22 16c86: 5c 01 movw r10, r24 cancel_heatup = false; 16c88: 10 92 5f 0d sts 0x0D5F, r1 ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> bool is_pinda_cooling = false; if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true; 16c8c: 80 91 5d 12 lds r24, 0x125D ; 0x80125d 16c90: 90 91 5e 12 lds r25, 0x125E ; 0x80125e 16c94: 89 2b or r24, r25 16c96: 41 f4 brne .+16 ; 0x16ca8 16c98: ff 24 eor r15, r15 16c9a: f3 94 inc r15 16c9c: 80 91 59 12 lds r24, 0x1259 ; 0x801259 16ca0: 90 91 5a 12 lds r25, 0x125A ; 0x80125a 16ca4: 89 2b or r24, r25 16ca6: 09 f0 breq .+2 ; 0x16caa SERIAL_PROTOCOLLN(set_target_pinda); codenum = _millis(); cancel_heatup = false; bool is_pinda_cooling = false; 16ca8: f1 2c mov r15, r1 if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true; while ( ((!is_pinda_cooling) && (!cancel_heatup) && (current_temperature_pinda < set_target_pinda)) || (is_pinda_cooling && (current_temperature_pinda > set_target_pinda)) ) { 16caa: 28 01 movw r4, r16 16cac: 01 2e mov r0, r17 16cae: 00 0c add r0, r0 16cb0: 66 08 sbc r6, r6 16cb2: 77 08 sbc r7, r7 16cb4: f1 10 cpse r15, r1 16cb6: 1a c0 rjmp .+52 ; 0x16cec 16cb8: 80 91 5f 0d lds r24, 0x0D5F ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> 16cbc: 81 11 cpse r24, r1 16cbe: 10 c0 rjmp .+32 ; 0x16ce0 16cc0: c3 01 movw r24, r6 16cc2: b2 01 movw r22, r4 16cc4: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 16cc8: 20 91 85 03 lds r18, 0x0385 ; 0x800385 16ccc: 30 91 86 03 lds r19, 0x0386 ; 0x800386 16cd0: 40 91 87 03 lds r20, 0x0387 ; 0x800387 16cd4: 50 91 88 03 lds r21, 0x0388 ; 0x800388 16cd8: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 16cdc: 18 16 cp r1, r24 16cde: b4 f0 brlt .+44 ; 0x16d0c } manage_heater(); manage_inactivity(); lcd_update(0); } LCD_MESSAGERPGM(MSG_OK); 16ce0: 80 ef ldi r24, 0xF0 ; 240 16ce2: 99 e6 ldi r25, 0x69 ; 105 16ce4: 0e 94 94 de call 0x1bd28 ; 0x1bd28 16ce8: 0c 94 07 a4 jmp 0x1480e ; 0x1480e cancel_heatup = false; bool is_pinda_cooling = false; if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true; while ( ((!is_pinda_cooling) && (!cancel_heatup) && (current_temperature_pinda < set_target_pinda)) || (is_pinda_cooling && (current_temperature_pinda > set_target_pinda)) ) { 16cec: c3 01 movw r24, r6 16cee: b2 01 movw r22, r4 16cf0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 16cf4: 20 91 85 03 lds r18, 0x0385 ; 0x800385 16cf8: 30 91 86 03 lds r19, 0x0386 ; 0x800386 16cfc: 40 91 87 03 lds r20, 0x0387 ; 0x800387 16d00: 50 91 88 03 lds r21, 0x0388 ; 0x800388 16d04: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 16d08: 87 ff sbrs r24, 7 16d0a: ea cf rjmp .-44 ; 0x16ce0 if ((_millis() - codenum) > 1000) //Print Temp Reading every 1 second while waiting. 16d0c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16d10: 68 19 sub r22, r8 16d12: 79 09 sbc r23, r9 16d14: 8a 09 sbc r24, r10 16d16: 9b 09 sbc r25, r11 16d18: 69 3e cpi r22, 0xE9 ; 233 16d1a: 73 40 sbci r23, 0x03 ; 3 16d1c: 81 05 cpc r24, r1 16d1e: 91 05 cpc r25, r1 16d20: c8 f0 brcs .+50 ; 0x16d54 { SERIAL_PROTOCOLPGM("P:"); 16d22: 84 ec ldi r24, 0xC4 ; 196 16d24: 9e e7 ldi r25, 0x7E ; 126 16d26: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 16d2a: 60 91 85 03 lds r22, 0x0385 ; 0x800385 16d2e: 70 91 86 03 lds r23, 0x0386 ; 0x800386 16d32: 80 91 87 03 lds r24, 0x0387 ; 0x800387 16d36: 90 91 88 03 lds r25, 0x0388 ; 0x800388 16d3a: 41 e0 ldi r20, 0x01 ; 1 16d3c: 0e 94 46 7a call 0xf48c ; 0xf48c } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 16d40: 8f e2 ldi r24, 0x2F ; 47 16d42: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_PROTOCOL_F(current_temperature_pinda, 1); SERIAL_PROTOCOL('/'); SERIAL_PROTOCOLLN(set_target_pinda); 16d46: c8 01 movw r24, r16 16d48: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e codenum = _millis(); 16d4c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 16d50: 4b 01 movw r8, r22 16d52: 5c 01 movw r10, r24 } manage_heater(); 16d54: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 16d58: 80 e0 ldi r24, 0x00 ; 0 16d5a: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 16d5e: 80 e0 ldi r24, 0x00 ; 0 16d60: 0e 94 f9 6e call 0xddf2 ; 0xddf2 16d64: a7 cf rjmp .-178 ; 0x16cb4 - `S` - Microsteps - `I` - Table index */ case 861: { const char * const _header = PSTR("index, temp, ustep, um"); if (code_seen('?')) { // ? - Print out current EEPROM offset values 16d66: 8f e3 ldi r24, 0x3F ; 63 16d68: 0e 94 f5 55 call 0xabea ; 0xabea 16d6c: 88 23 and r24, r24 16d6e: c9 f0 breq .+50 ; 0x16da2 SERIAL_PROTOCOLPGM("PINDA cal status: "); 16d70: 81 eb ldi r24, 0xB1 ; 177 16d72: 9e e7 ldi r25, 0x7E ; 126 16d74: 0e 94 c4 7a call 0xf588 ; 0xf588 bool calibration_status_get(CalibrationStatus components); void calibration_status_set(CalibrationStatus components); void calibration_status_clear(CalibrationStatus components); // PINDA has an independent calibration flag inline bool calibration_status_pinda() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA); } 16d78: 86 ea ldi r24, 0xA6 ; 166 16d7a: 9f e0 ldi r25, 0x0F ; 15 16d7c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 16d80: 21 e0 ldi r18, 0x01 ; 1 16d82: 30 e0 ldi r19, 0x00 ; 0 16d84: 81 11 cpse r24, r1 16d86: 02 c0 rjmp .+4 ; 0x16d8c 16d88: 30 e0 ldi r19, 0x00 ; 0 16d8a: 20 e0 ldi r18, 0x00 ; 0 SERIAL_PROTOCOLLN(calibration_status_pinda()); 16d8c: c9 01 movw r24, r18 16d8e: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e SERIAL_PROTOCOLLNRPGM(_header); 16d92: 8a e9 ldi r24, 0x9A ; 154 16d94: 9e e7 ldi r25, 0x7E ; 126 16d96: 0e 94 bd 7c call 0xf97a ; 0xf97a gcode_M861_print_pinda_cal_eeprom(); 16d9a: 0e 94 fc 7a call 0xf5f8 ; 0xf5f8 16d9e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } else if (code_seen('!')) { // ! - Set factory default values 16da2: 81 e2 ldi r24, 0x21 ; 33 16da4: 0e 94 f5 55 call 0xabea ; 0xabea 16da8: 88 23 and r24, r24 16daa: 49 f1 breq .+82 ; 0x16dfe 16dac: 61 e0 ldi r22, 0x01 ; 1 16dae: 86 ea ldi r24, 0xA6 ; 166 16db0: 9f e0 ldi r25, 0x0F ; 15 16db2: 0f 94 04 a4 call 0x34808 ; 0x34808 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 16db6: 68 e0 ldi r22, 0x08 ; 8 16db8: 70 e0 ldi r23, 0x00 ; 0 16dba: 80 eb ldi r24, 0xB0 ; 176 16dbc: 9f e0 ldi r25, 0x0F ; 15 16dbe: 0f 94 22 a4 call 0x34844 ; 0x34844 16dc2: 68 e1 ldi r22, 0x18 ; 24 16dc4: 70 e0 ldi r23, 0x00 ; 0 16dc6: 82 eb ldi r24, 0xB2 ; 178 16dc8: 9f e0 ldi r25, 0x0F ; 15 16dca: 0f 94 22 a4 call 0x34844 ; 0x34844 16dce: 60 e3 ldi r22, 0x30 ; 48 16dd0: 70 e0 ldi r23, 0x00 ; 0 16dd2: 84 eb ldi r24, 0xB4 ; 180 16dd4: 9f e0 ldi r25, 0x0F ; 15 16dd6: 0f 94 22 a4 call 0x34844 ; 0x34844 16dda: 60 e5 ldi r22, 0x50 ; 80 16ddc: 70 e0 ldi r23, 0x00 ; 0 16dde: 86 eb ldi r24, 0xB6 ; 182 16de0: 9f e0 ldi r25, 0x0F ; 15 16de2: 0f 94 22 a4 call 0x34844 ; 0x34844 16de6: 68 e7 ldi r22, 0x78 ; 120 16de8: 70 e0 ldi r23, 0x00 ; 0 16dea: 88 eb ldi r24, 0xB8 ; 184 16dec: 9f e0 ldi r25, 0x0F ; 15 16dee: 0f 94 22 a4 call 0x34844 ; 0x34844 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 2, z_shift); z_shift = 80; //55C - 200um - 80usteps eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 3, z_shift); z_shift = 120; //60C - 300um - 120usteps eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 4, z_shift); SERIAL_PROTOCOLLNPGM("factory restored"); 16df2: 89 e8 ldi r24, 0x89 ; 137 16df4: 9e e7 ldi r25, 0x7E ; 126 16df6: 0e 94 bd 7c call 0xf97a ; 0xf97a 16dfa: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation) 16dfe: 8a e5 ldi r24, 0x5A ; 90 16e00: 0e 94 f5 55 call 0xabea ; 0xabea 16e04: 88 23 and r24, r24 16e06: c1 f0 breq .+48 ; 0x16e38 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 16e08: 61 e0 ldi r22, 0x01 ; 1 16e0a: 86 ea ldi r24, 0xA6 ; 166 16e0c: 9f e0 ldi r25, 0x0F ; 15 16e0e: 0f 94 04 a4 call 0x34808 ; 0x34808 16e12: 00 eb ldi r16, 0xB0 ; 176 16e14: 1f e0 ldi r17, 0x0F ; 15 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 16e16: 70 e0 ldi r23, 0x00 ; 0 16e18: 60 e0 ldi r22, 0x00 ; 0 16e1a: c8 01 movw r24, r16 16e1c: 0f 94 22 a4 call 0x34844 ; 0x34844 16e20: 0e 5f subi r16, 0xFE ; 254 16e22: 1f 4f sbci r17, 0xFF ; 255 eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1); int16_t z_shift = 0; for (uint8_t i = 0; i < 5; i++) { 16e24: 0a 3b cpi r16, 0xBA ; 186 16e26: 4f e0 ldi r20, 0x0F ; 15 16e28: 14 07 cpc r17, r20 16e2a: a9 f7 brne .-22 ; 0x16e16 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } SERIAL_PROTOCOLLNPGM("zerorized"); 16e2c: 8f e7 ldi r24, 0x7F ; 127 16e2e: 9e e7 ldi r25, 0x7E ; 126 16e30: 0e 94 bd 7c call 0xf97a ; 0xf97a 16e34: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I 16e38: 83 e5 ldi r24, 0x53 ; 83 16e3a: 0e 94 f5 55 call 0xabea ; 0xabea 16e3e: 88 23 and r24, r24 16e40: 21 f1 breq .+72 ; 0x16e8a int16_t usteps = code_value_short(); 16e42: 0e 94 17 56 call 0xac2e ; 0xac2e 16e46: 8c 01 movw r16, r24 if (code_seen('I')) { 16e48: 89 e4 ldi r24, 0x49 ; 73 16e4a: 0e 94 f5 55 call 0xabea ; 0xabea 16e4e: 88 23 and r24, r24 16e50: 11 f4 brne .+4 ; 0x16e56 16e52: 0c 94 07 a4 jmp 0x1480e ; 0x1480e uint8_t index = code_value_uint8(); 16e56: 0e 94 0a 56 call 0xac14 ; 0xac14 if (index < 5) { 16e5a: 85 30 cpi r24, 0x05 ; 5 16e5c: 10 f0 brcs .+4 ; 0x16e62 16e5e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + index, usteps); 16e62: 90 e0 ldi r25, 0x00 ; 0 16e64: 88 52 subi r24, 0x28 ; 40 16e66: 98 4f sbci r25, 0xF8 ; 248 16e68: b8 01 movw r22, r16 16e6a: 88 0f add r24, r24 16e6c: 99 1f adc r25, r25 16e6e: 0f 94 22 a4 call 0x34844 ; 0x34844 SERIAL_PROTOCOLLNRPGM(MSG_OK); 16e72: 80 ef ldi r24, 0xF0 ; 240 16e74: 99 e6 ldi r25, 0x69 ; 105 16e76: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLLNRPGM(_header); 16e7a: 8a e9 ldi r24, 0x9A ; 154 16e7c: 9e e7 ldi r25, 0x7E ; 126 16e7e: 0e 94 bd 7c call 0xf97a ; 0xf97a gcode_M861_print_pinda_cal_eeprom(); 16e82: 0e 94 fc 7a call 0xf5f8 ; 0xf5f8 16e86: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } } } else { SERIAL_PROTOCOLLNPGM("no valid command"); 16e8a: 8e e6 ldi r24, 0x6E ; 110 16e8c: 9e e7 ldi r25, 0x7E ; 126 16e8e: 0e 94 bd 7c call 0xf97a ; 0xf97a 16e92: 0c 94 07 a4 jmp 0x1480e ; 0x1480e case 862: // M862: print checking { // Read the decimal by multiplying the float value by 10 e.g. 862.1 becomes 8621 // This method consumes less flash memory compared to checking the string length. ClPrintChecking nCommand = static_cast((uint16_t)(code_value()*10) - 8620u); switch(nCommand) 16e96: 64 30 cpi r22, 0x04 ; 4 16e98: 09 f4 brne .+2 ; 0x16e9c 16e9a: be c0 rjmp .+380 ; 0x17018 16e9c: 65 30 cpi r22, 0x05 ; 5 16e9e: 11 f0 breq .+4 ; 0x16ea4 16ea0: 0c 94 07 a4 jmp 0x1480e ; 0x1480e fw_version_check(++strchr_pointer); else if(code_seen('Q')) SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P()); break; case ClPrintChecking::_Gcode: // ~ .5 if(code_seen('P')) 16ea4: 80 e5 ldi r24, 0x50 ; 80 16ea6: 0e 94 f5 55 call 0xabea ; 0xabea 16eaa: 88 23 and r24, r24 16eac: 09 f4 brne .+2 ; 0x16eb0 16eae: 3a c1 rjmp .+628 ; 0x17124 { uint16_t nGcodeLevel; nGcodeLevel=(uint16_t)code_value_long(); 16eb0: 0e 94 5d 56 call 0xacba ; 0xacba done: return true; } void gcode_level_check(uint16_t nGcodeLevel) { if (oCheckGcode == ClCheckMode::_None) 16eb4: 10 91 e8 03 lds r17, 0x03E8 ; 0x8003e8 16eb8: 11 23 and r17, r17 16eba: 11 f4 brne .+4 ; 0x16ec0 16ebc: 0c 94 07 a4 jmp 0x1480e ; 0x1480e return; if (nGcodeLevel <= (uint16_t)GCODE_LEVEL) 16ec0: 62 30 cpi r22, 0x02 ; 2 16ec2: 71 05 cpc r23, r1 16ec4: 10 f4 brcc .+4 ; 0x16eca 16ec6: 0c 94 07 a4 jmp 0x1480e ; 0x1480e // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN(GCODE_LEVEL); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN(nGcodeLevel); render_M862_warnings( 16eca: 8b ea ldi r24, 0xAB ; 171 16ecc: 96 e3 ldi r25, 0x36 ; 54 16ece: 0e 94 3a 75 call 0xea74 ; 0xea74 16ed2: 7c 01 movw r14, r24 16ed4: 84 e8 ldi r24, 0x84 ; 132 16ed6: 96 e3 ldi r25, 0x36 ; 54 16ed8: 0e 94 3a 75 call 0xea74 ; 0xea74 16edc: 41 2f mov r20, r17 16ede: b7 01 movw r22, r14 16ee0: 0e 94 df ea call 0x1d5be ; 0x1d5be 16ee4: 0c 94 07 a4 jmp 0x1480e ; 0x1480e ClPrintChecking nCommand = static_cast((uint16_t)(code_value()*10) - 8620u); switch(nCommand) { case ClPrintChecking::_Nozzle: // ~ .1 uint16_t nDiameter; if(code_seen('P')) 16ee8: 80 e5 ldi r24, 0x50 ; 80 16eea: 0e 94 f5 55 call 0xabea ; 0xabea 16eee: 88 23 and r24, r24 16ef0: a9 f0 breq .+42 ; 0x16f1c { nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 16ef2: 0e 94 85 5a call 0xb50a ; 0xb50a 16ef6: 20 e0 ldi r18, 0x00 ; 0 16ef8: 30 e0 ldi r19, 0x00 ; 0 16efa: 4a e7 ldi r20, 0x7A ; 122 16efc: 54 e4 ldi r21, 0x44 ; 68 16efe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 16f02: 20 e0 ldi r18, 0x00 ; 0 16f04: 30 e0 ldi r19, 0x00 ; 0 16f06: 40 e0 ldi r20, 0x00 ; 0 16f08: 5f e3 ldi r21, 0x3F ; 63 16f0a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 16f0e: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> nozzle_diameter_check(nDiameter); 16f12: cb 01 movw r24, r22 16f14: 0e 94 1e eb call 0x1d63c ; 0x1d63c 16f18: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } else if(code_seen('Q')) 16f1c: 81 e5 ldi r24, 0x51 ; 81 16f1e: 0e 94 f5 55 call 0xabea ; 0xabea 16f22: 88 23 and r24, r24 16f24: 11 f4 brne .+4 ; 0x16f2a 16f26: 0c 94 07 a4 jmp 0x1480e ; 0x1480e SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); 16f2a: 85 ea ldi r24, 0xA5 ; 165 16f2c: 9d e0 ldi r25, 0x0D ; 13 16f2e: 0f 94 ee a3 call 0x347dc ; 0x347dc 16f32: bc 01 movw r22, r24 16f34: 90 e0 ldi r25, 0x00 ; 0 16f36: 80 e0 ldi r24, 0x00 ; 0 16f38: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 16f3c: 20 e0 ldi r18, 0x00 ; 0 16f3e: 30 e0 ldi r19, 0x00 ; 0 16f40: 4a e7 ldi r20, 0x7A ; 122 16f42: 54 e4 ldi r21, 0x44 ; 68 16f44: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 16f48: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 16f4c: 0c 94 07 a4 jmp 0x1480e ; 0x1480e uint16_t nPrinterModel; nPrinterModel=(uint16_t)code_value_long(); // based on current state of MMU (active/stopped/connecting) perform a runtime update of the printer type printer_model_check(nPrinterModel, type); } else if(code_seen('Q')) 16f50: 81 e5 ldi r24, 0x51 ; 81 16f52: 0e 94 f5 55 call 0xabea ; 0xabea 16f56: 88 23 and r24, r24 16f58: 11 f4 brne .+4 ; 0x16f5e 16f5a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e print((long) n, base); } void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); 16f5e: b8 01 movw r22, r16 16f60: 90 e0 ldi r25, 0x00 ; 0 16f62: 80 e0 ldi r24, 0x00 ; 0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 16f64: 4a e0 ldi r20, 0x0A ; 10 16f66: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::println(unsigned int n, int base) { print(n, base); println(); 16f6a: 0e 94 bc 7a call 0xf578 ; 0xf578 16f6e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e return pgm_read_word(&_nPrinterType); } } const char *sPrinterType(bool bMMu) { if (bMMu) { 16f72: 80 91 01 13 lds r24, 0x1301 ; 0x801301 return _sPrinterMmuName; 16f76: 74 e3 ldi r23, 0x34 ; 52 16f78: e7 2e mov r14, r23 16f7a: 79 e7 ldi r23, 0x79 ; 121 16f7c: f7 2e mov r15, r23 return pgm_read_word(&_nPrinterType); } } const char *sPrinterType(bool bMMu) { if (bMMu) { 16f7e: 81 30 cpi r24, 0x01 ; 1 16f80: 21 f0 breq .+8 ; 0x16f8a return _sPrinterMmuName; } else { return _sPrinterName; 16f82: 6e e2 ldi r22, 0x2E ; 46 16f84: e6 2e mov r14, r22 16f86: 69 e7 ldi r22, 0x79 ; 121 16f88: f6 2e mov r15, r22 SERIAL_PROTOCOLLN(type); } break; case ClPrintChecking::_Smodel: { // ~ .3 const char *type = sPrinterType(MMU2::mmu2.Enabled()); if(code_seen('P')) 16f8a: 80 e5 ldi r24, 0x50 ; 80 16f8c: 0e 94 f5 55 call 0xabea ; 0xabea 16f90: 88 23 and r24, r24 16f92: b1 f1 breq .+108 ; 0x17000 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 16f94: 62 e2 ldi r22, 0x22 ; 34 16f96: 70 e0 ldi r23, 0x00 ; 0 16f98: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 16f9c: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 16fa0: 0f 94 37 aa call 0x3546e ; 0x3546e 16fa4: 8c 01 movw r16, r24 if (!this->ptr) { 16fa6: 89 2b or r24, r25 16fa8: d1 f0 breq .+52 ; 0x16fde // First quote not found return; } // Skip the leading quote this->ptr++; 16faa: 0f 5f subi r16, 0xFF ; 255 16fac: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 16fae: 62 e2 ldi r22, 0x22 ; 34 16fb0: 70 e0 ldi r23, 0x00 ; 0 16fb2: c8 01 movw r24, r16 16fb4: 0f 94 37 aa call 0x3546e ; 0x3546e if(!pStrEnd) { 16fb8: 00 97 sbiw r24, 0x00 ; 0 16fba: 89 f0 breq .+34 ; 0x16fde // Second quote not found return; } this->len = pStrEnd - this->ptr; 16fbc: d8 2e mov r13, r24 16fbe: d0 1a sub r13, r16 16fc0: c7 01 movw r24, r14 16fc2: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> unquoted_string smodel = unquoted_string(pStrPos); if(smodel.WasFound()) { const uint8_t compareLength = strlen_P(actualPrinterSModel); if(compareLength == smodel.GetLength()) { 16fc6: d8 12 cpse r13, r24 16fc8: 0a c0 rjmp .+20 ; 0x16fde if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return; 16fca: ac 01 movw r20, r24 16fcc: 55 27 eor r21, r21 16fce: b7 01 movw r22, r14 16fd0: c8 01 movw r24, r16 16fd2: 0f 94 bf a1 call 0x3437e ; 0x3437e 16fd6: 89 2b or r24, r25 16fd8: 11 f4 brne .+4 ; 0x16fde 16fda: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } } render_M862_warnings( 16fde: f0 90 ea 03 lds r15, 0x03EA ; 0x8003ea 16fe2: 89 e8 ldi r24, 0x89 ; 137 16fe4: 97 e3 ldi r25, 0x37 ; 55 16fe6: 0e 94 3a 75 call 0xea74 ; 0xea74 16fea: 8c 01 movw r16, r24 16fec: 8b e5 ldi r24, 0x5B ; 91 16fee: 97 e3 ldi r25, 0x37 ; 55 16ff0: 0e 94 3a 75 call 0xea74 ; 0xea74 16ff4: 4f 2d mov r20, r15 16ff6: b8 01 movw r22, r16 16ff8: 0e 94 df ea call 0x1d5be ; 0x1d5be 16ffc: 0c 94 07 a4 jmp 0x1480e ; 0x1480e { printer_smodel_check(strchr_pointer, type); } else if(code_seen('Q')) 17000: 81 e5 ldi r24, 0x51 ; 81 17002: 0e 94 f5 55 call 0xabea ; 0xabea 17006: 88 23 and r24, r24 17008: 11 f4 brne .+4 ; 0x1700e 1700a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e SERIAL_PROTOCOLLNRPGM(type); 1700e: c7 01 movw r24, r14 17010: 0e 94 bd 7c call 0xf97a ; 0xf97a 17014: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } break; case ClPrintChecking::_Version: // ~ .4 if(code_seen('P')) 17018: 80 e5 ldi r24, 0x50 ; 80 1701a: 0e 94 f5 55 call 0xabea ; 0xabea 1701e: 88 23 and r24, r24 17020: 09 f4 brne .+2 ; 0x17024 17022: 77 c0 rjmp .+238 ; 0x17112 fw_version_check(++strchr_pointer); 17024: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 17028: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 1702c: 01 96 adiw r24, 0x01 ; 1 1702e: 90 93 bc 04 sts 0x04BC, r25 ; 0x8004bc 17032: 80 93 bb 04 sts 0x04BB, r24 ; 0x8004bb return ((uint8_t)ClCompareValue::_Less); return ((uint8_t)ClCompareValue::_Equal); } void fw_version_check(const char *pVersion) { if (oCheckVersion == ClCheckMode::_None) 17036: 20 91 e9 03 lds r18, 0x03E9 ; 0x8003e9 1703a: 22 23 and r18, r18 1703c: 11 f4 brne .+4 ; 0x17042 1703e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e return; uint16_t aVersion[4]; uint8_t nCompareValueResult; parse_version(pVersion, aVersion); 17042: be 01 movw r22, r28 17044: 6f 5f subi r22, 0xFF ; 255 17046: 7f 4f sbci r23, 0xFF ; 255 17048: 0e 94 9b d9 call 0x1b336 ; 0x1b336 nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; 1704c: 8a e0 ldi r24, 0x0A ; 10 1704e: 90 e0 ldi r25, 0x00 ; 0 17050: 0f 94 ee a3 call 0x347dc ; 0x347dc 17054: 29 81 ldd r18, Y+1 ; 0x01 17056: 3a 81 ldd r19, Y+2 ; 0x02 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 17058: 12 e0 ldi r17, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 1705a: 82 17 cp r24, r18 1705c: 93 07 cpc r25, r19 1705e: 28 f0 brcs .+10 ; 0x1706a return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 17060: 11 e0 ldi r17, 0x01 ; 1 17062: 28 17 cp r18, r24 17064: 39 07 cpc r19, r25 17066: 08 f4 brcc .+2 ; 0x1706a 17068: 10 e0 ldi r17, 0x00 ; 0 return; uint16_t aVersion[4]; uint8_t nCompareValueResult; parse_version(pVersion, aVersion); nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; 1706a: 12 95 swap r17 1706c: 11 0f add r17, r17 1706e: 11 0f add r17, r17 17070: 10 7c andi r17, 0xC0 ; 192 nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4; 17072: 8c e0 ldi r24, 0x0C ; 12 17074: 90 e0 ldi r25, 0x00 ; 0 17076: 0f 94 ee a3 call 0x347dc ; 0x347dc 1707a: ac 01 movw r20, r24 1707c: 2b 81 ldd r18, Y+3 ; 0x03 1707e: 3c 81 ldd r19, Y+4 ; 0x04 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 17080: 82 e0 ldi r24, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 17082: 42 17 cp r20, r18 17084: 53 07 cpc r21, r19 17086: 28 f0 brcs .+10 ; 0x17092 return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 17088: 81 e0 ldi r24, 0x01 ; 1 1708a: 24 17 cp r18, r20 1708c: 35 07 cpc r19, r21 1708e: 08 f4 brcc .+2 ; 0x17092 17090: 80 e0 ldi r24, 0x00 ; 0 uint16_t aVersion[4]; uint8_t nCompareValueResult; parse_version(pVersion, aVersion); nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4; 17092: 50 e1 ldi r21, 0x10 ; 16 17094: 85 9f mul r24, r21 17096: c0 01 movw r24, r0 17098: 11 24 eor r1, r1 1709a: 18 0f add r17, r24 nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2; 1709c: 8e e0 ldi r24, 0x0E ; 14 1709e: 90 e0 ldi r25, 0x00 ; 0 170a0: 0f 94 ee a3 call 0x347dc ; 0x347dc 170a4: ac 01 movw r20, r24 170a6: 2d 81 ldd r18, Y+5 ; 0x05 170a8: 3e 81 ldd r19, Y+6 ; 0x06 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 170aa: 82 e0 ldi r24, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 170ac: 42 17 cp r20, r18 170ae: 53 07 cpc r21, r19 170b0: 28 f0 brcs .+10 ; 0x170bc return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 170b2: 81 e0 ldi r24, 0x01 ; 1 170b4: 24 17 cp r18, r20 170b6: 35 07 cpc r19, r21 170b8: 08 f4 brcc .+2 ; 0x170bc 170ba: 80 e0 ldi r24, 0x00 ; 0 uint16_t aVersion[4]; uint8_t nCompareValueResult; parse_version(pVersion, aVersion); nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4; nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2; 170bc: a4 e0 ldi r26, 0x04 ; 4 170be: 8a 9f mul r24, r26 170c0: c0 01 movw r24, r0 170c2: 11 24 eor r1, r1 170c4: 18 0f add r17, r24 nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR)); 170c6: 80 e1 ldi r24, 0x10 ; 16 170c8: 90 e0 ldi r25, 0x00 ; 0 170ca: 0f 94 ee a3 call 0x347dc ; 0x347dc 170ce: ac 01 movw r20, r24 170d0: 2f 81 ldd r18, Y+7 ; 0x07 170d2: 38 85 ldd r19, Y+8 ; 0x08 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 170d4: 92 e0 ldi r25, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 170d6: 42 17 cp r20, r18 170d8: 53 07 cpc r21, r19 170da: 28 f0 brcs .+10 ; 0x170e6 return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 170dc: 91 e0 ldi r25, 0x01 ; 1 170de: 24 17 cp r18, r20 170e0: 35 07 cpc r19, r21 170e2: 08 f4 brcc .+2 ; 0x170e6 170e4: 90 e0 ldi r25, 0x00 ; 0 uint8_t nCompareValueResult; parse_version(pVersion, aVersion); nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4; nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2; nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR)); 170e6: 19 0f add r17, r25 if (nCompareValueResult <= COMPARE_VALUE_EQUAL) 170e8: 16 35 cpi r17, 0x56 ; 86 170ea: 10 f4 brcc .+4 ; 0x170f0 170ec: 0c 94 07 a4 jmp 0x1480e ; 0x1480e SERIAL_ECHO(aVersion[2]); SERIAL_ECHO('.'); SERIAL_ECHOLN(aVersion[3]); */ render_M862_warnings( 170f0: f0 90 e9 03 lds r15, 0x03E9 ; 0x8003e9 170f4: 89 e1 ldi r24, 0x19 ; 25 170f6: 97 e3 ldi r25, 0x37 ; 55 170f8: 0e 94 3a 75 call 0xea74 ; 0xea74 170fc: 8c 01 movw r16, r24 170fe: 83 ef ldi r24, 0xF3 ; 243 17100: 96 e3 ldi r25, 0x36 ; 54 17102: 0e 94 3a 75 call 0xea74 ; 0xea74 17106: 4f 2d mov r20, r15 17108: b8 01 movw r22, r16 1710a: 0e 94 df ea call 0x1d5be ; 0x1d5be 1710e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e else if(code_seen('Q')) 17112: 81 e5 ldi r24, 0x51 ; 81 17114: 0e 94 f5 55 call 0xabea ; 0xabea 17118: 88 23 and r24, r24 1711a: 11 f4 brne .+4 ; 0x17120 1711c: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 17120: 0c 94 c5 9f jmp 0x13f8a ; 0x13f8a { uint16_t nGcodeLevel; nGcodeLevel=(uint16_t)code_value_long(); gcode_level_check(nGcodeLevel); } else if(code_seen('Q')) 17124: 81 e5 ldi r24, 0x51 ; 81 17126: 0e 94 f5 55 call 0xabea ; 0xabea 1712a: 88 23 and r24, r24 1712c: 11 f4 brne .+4 ; 0x17132 1712e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e SERIAL_PROTOCOLLN(GCODE_LEVEL); 17132: 81 e0 ldi r24, 0x01 ; 1 17134: 90 e0 ldi r25, 0x00 ; 0 17136: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e 1713a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e * M900: Set and/or Get advance K factor * * K Set advance K factor */ inline void gcode_M900() { float newK = code_seen('K') ? code_value() : -2; 1713e: 8b e4 ldi r24, 0x4B ; 75 17140: 0e 94 f5 55 call 0xabea ; 0xabea 17144: c1 2c mov r12, r1 17146: d1 2c mov r13, r1 17148: e1 2c mov r14, r1 1714a: 50 ec ldi r21, 0xC0 ; 192 1714c: f5 2e mov r15, r21 1714e: 88 23 and r24, r24 17150: 49 f1 breq .+82 ; 0x171a4 17152: 0e 94 85 5a call 0xb50a ; 0xb50a 17156: 6b 01 movw r12, r22 17158: 7c 01 movw r14, r24 if (newK >= 0 && newK < LA_K_MAX) extruder_advance_K = newK; else SERIAL_ECHOLNPGM("K out of allowed range!"); #else if (newK == 0) 1715a: 20 e0 ldi r18, 0x00 ; 0 1715c: 30 e0 ldi r19, 0x00 ; 0 1715e: a9 01 movw r20, r18 17160: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 17164: 81 11 cpse r24, r1 17166: 1e c0 rjmp .+60 ; 0x171a4 { extruder_advance_K = 0; 17168: 10 92 a7 04 sts 0x04A7, r1 ; 0x8004a7 1716c: 10 92 a8 04 sts 0x04A8, r1 ; 0x8004a8 17170: 10 92 a9 04 sts 0x04A9, r1 ; 0x8004a9 17174: 10 92 aa 04 sts 0x04AA, r1 ; 0x8004aa 17178: 0e 94 04 86 call 0x10c08 ; 0x10c08 else extruder_advance_K = newK; } #endif SERIAL_ECHO_START; 1717c: 8e ec ldi r24, 0xCE ; 206 1717e: 91 ea ldi r25, 0xA1 ; 161 17180: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM("Advance K="); 17184: 8b e0 ldi r24, 0x0B ; 11 17186: 99 e7 ldi r25, 0x79 ; 121 17188: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(extruder_advance_K); 1718c: 60 91 a7 04 lds r22, 0x04A7 ; 0x8004a7 17190: 70 91 a8 04 lds r23, 0x04A8 ; 0x8004a8 17194: 80 91 a9 04 lds r24, 0x04A9 ; 0x8004a9 17198: 90 91 aa 04 lds r25, 0x04AA ; 0x8004aa 1719c: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 171a0: 0c 94 07 a4 jmp 0x1480e ; 0x1480e } float la10c_value(float k) { if(la10c_mode == LA10C_UNKNOWN) 171a4: 80 91 43 03 lds r24, 0x0343 ; 0x800343 171a8: 81 11 cpse r24, r1 171aa: 1b c0 rjmp .+54 ; 0x171e2 { // do not autodetect until a valid value is seen if(k == 0) return 0; else if(k < 0) 171ac: 20 e0 ldi r18, 0x00 ; 0 171ae: 30 e0 ldi r19, 0x00 ; 0 171b0: a9 01 movw r20, r18 171b2: c7 01 movw r24, r14 171b4: b6 01 movw r22, r12 171b6: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 171ba: 87 ff sbrs r24, 7 171bc: 05 c0 rjmp .+10 ; 0x171c8 } else { newK = la10c_value(newK); if (newK < 0) SERIAL_ECHOLNPGM("K out of allowed range!"); 171be: 86 e1 ldi r24, 0x16 ; 22 171c0: 99 e7 ldi r25, 0x79 ; 121 171c2: 0e 94 bd 7c call 0xf97a ; 0xf97a 171c6: da cf rjmp .-76 ; 0x1717c return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); 171c8: 20 e0 ldi r18, 0x00 ; 0 171ca: 30 e0 ldi r19, 0x00 ; 0 171cc: 40 e2 ldi r20, 0x20 ; 32 171ce: 51 e4 ldi r21, 0x41 ; 65 171d0: c7 01 movw r24, r14 171d2: b6 01 movw r22, r12 171d4: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 171d8: 87 ff sbrs r24, 7 171da: 2c c0 rjmp .+88 ; 0x17234 171dc: 81 e0 ldi r24, 0x01 ; 1 171de: 0e 94 04 86 call 0x10c08 ; 0x10c08 } if(la10c_mode == LA10C_LA15) 171e2: 80 91 43 03 lds r24, 0x0343 ; 0x800343 return (k >= 0 && k < LA_K_MAX? k: -1); 171e6: 20 e0 ldi r18, 0x00 ; 0 171e8: 30 e0 ldi r19, 0x00 ; 0 171ea: a9 01 movw r20, r18 return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); } if(la10c_mode == LA10C_LA15) 171ec: 81 30 cpi r24, 0x01 ; 1 171ee: 21 f5 brne .+72 ; 0x17238 return (k >= 0 && k < LA_K_MAX? k: -1); 171f0: c7 01 movw r24, r14 171f2: b6 01 movw r22, r12 171f4: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 171f8: 87 fd sbrc r24, 7 171fa: e1 cf rjmp .-62 ; 0x171be 171fc: 20 e0 ldi r18, 0x00 ; 0 171fe: 30 e0 ldi r19, 0x00 ; 0 17200: 40 e2 ldi r20, 0x20 ; 32 17202: 51 e4 ldi r21, 0x41 ; 65 17204: c7 01 movw r24, r14 17206: b6 01 movw r22, r12 17208: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1720c: 87 ff sbrs r24, 7 1720e: d7 cf rjmp .-82 ; 0x171be la10c_reset(); } else { newK = la10c_value(newK); if (newK < 0) 17210: 20 e0 ldi r18, 0x00 ; 0 17212: 30 e0 ldi r19, 0x00 ; 0 17214: a9 01 movw r20, r18 17216: c7 01 movw r24, r14 17218: b6 01 movw r22, r12 1721a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1721e: 87 fd sbrc r24, 7 17220: ce cf rjmp .-100 ; 0x171be SERIAL_ECHOLNPGM("K out of allowed range!"); else extruder_advance_K = newK; 17222: c0 92 a7 04 sts 0x04A7, r12 ; 0x8004a7 17226: d0 92 a8 04 sts 0x04A8, r13 ; 0x8004a8 1722a: e0 92 a9 04 sts 0x04A9, r14 ; 0x8004a9 1722e: f0 92 aa 04 sts 0x04AA, r15 ; 0x8004aa 17232: a4 cf rjmp .-184 ; 0x1717c if(k == 0) return 0; else if(k < 0) return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); 17234: 82 e0 ldi r24, 0x02 ; 2 17236: d3 cf rjmp .-90 ; 0x171de } if(la10c_mode == LA10C_LA15) return (k >= 0 && k < LA_K_MAX? k: -1); else return (k >= 0? la10c_convert(k): -1); 17238: c7 01 movw r24, r14 1723a: b6 01 movw r22, r12 1723c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 17240: 87 fd sbrc r24, 7 17242: bd cf rjmp .-134 ; 0x171be // Approximate a LA10 value to a LA15 equivalent. static float la10c_convert(float k) { float new_K = k * 0.002 - 0.01; 17244: 2f e6 ldi r18, 0x6F ; 111 17246: 32 e1 ldi r19, 0x12 ; 18 17248: 43 e0 ldi r20, 0x03 ; 3 1724a: 5b e3 ldi r21, 0x3B ; 59 1724c: c7 01 movw r24, r14 1724e: b6 01 movw r22, r12 17250: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 17254: 2a e0 ldi r18, 0x0A ; 10 17256: 37 ed ldi r19, 0xD7 ; 215 17258: 43 e2 ldi r20, 0x23 ; 35 1725a: 5c e3 ldi r21, 0x3C ; 60 1725c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 17260: 6b 01 movw r12, r22 17262: 7c 01 movw r14, r24 return new_K < 0? 0: 17264: 20 e0 ldi r18, 0x00 ; 0 17266: 30 e0 ldi r19, 0x00 ; 0 17268: a9 01 movw r20, r18 1726a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1726e: 87 fd sbrc r24, 7 17270: 11 c0 rjmp .+34 ; 0x17294 new_K > (LA_K_MAX - FLT_EPSILON)? (LA_K_MAX - FLT_EPSILON): 17272: 20 e0 ldi r18, 0x00 ; 0 17274: 30 e0 ldi r19, 0x00 ; 0 17276: 40 e2 ldi r20, 0x20 ; 32 17278: 51 e4 ldi r21, 0x41 ; 65 1727a: c7 01 movw r24, r14 1727c: b6 01 movw r22, r12 1727e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 17282: 18 16 cp r1, r24 17284: 2c f6 brge .-118 ; 0x17210 17286: c1 2c mov r12, r1 17288: d1 2c mov r13, r1 1728a: 40 e2 ldi r20, 0x20 ; 32 1728c: e4 2e mov r14, r20 1728e: 41 e4 ldi r20, 0x41 ; 65 17290: f4 2e mov r15, r20 17292: c7 cf rjmp .-114 ; 0x17222 // Approximate a LA10 value to a LA15 equivalent. static float la10c_convert(float k) { float new_K = k * 0.002 - 0.01; return new_K < 0? 0: 17294: c1 2c mov r12, r1 17296: d1 2c mov r13, r1 17298: 76 01 movw r14, r12 1729a: c3 cf rjmp .-122 ; 0x17222 } } reset_acceleration_rates(); #else //TMC2130 #if defined(X_MS1_PIN) && X_MS1_PIN > -1 if(code_seen('S')) for(int i=0;i<=4;i++) microstep_mode(i,code_value()); 1729c: 83 e5 ldi r24, 0x53 ; 83 1729e: 0e 94 f5 55 call 0xabea ; 0xabea 172a2: 88 23 and r24, r24 172a4: 59 f0 breq .+22 ; 0x172bc 172a6: 10 e0 ldi r17, 0x00 ; 0 172a8: 0e 94 85 5a call 0xb50a ; 0xb50a 172ac: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 172b0: 81 2f mov r24, r17 172b2: 0f 94 47 1a call 0x2348e ; 0x2348e 172b6: 1f 5f subi r17, 0xFF ; 255 172b8: 15 30 cpi r17, 0x05 ; 5 172ba: b1 f7 brne .-20 ; 0x172a8 172bc: 34 ec ldi r19, 0xC4 ; 196 172be: e3 2e mov r14, r19 172c0: 32 e0 ldi r19, 0x02 ; 2 172c2: f3 2e mov r15, r19 172c4: 10 e0 ldi r17, 0x00 ; 0 for(int i=0;i 172d0: 88 23 and r24, r24 172d2: 39 f0 breq .+14 ; 0x172e2 172d4: 0e 94 85 5a call 0xb50a ; 0xb50a 172d8: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 172dc: 81 2f mov r24, r17 172de: 0f 94 47 1a call 0x2348e ; 0x2348e 172e2: 1f 5f subi r17, 0xFF ; 255 172e4: 14 30 cpi r17, 0x04 ; 4 172e6: 79 f7 brne .-34 ; 0x172c6 if(code_seen('B')) microstep_mode(4,code_value()); 172e8: 82 e4 ldi r24, 0x42 ; 66 172ea: 0e 94 f5 55 call 0xabea ; 0xabea 172ee: 88 23 and r24, r24 172f0: 39 f0 breq .+14 ; 0x17300 172f2: 0e 94 85 5a call 0xb50a ; 0xb50a 172f6: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 172fa: 84 e0 ldi r24, 0x04 ; 4 172fc: 0f 94 47 1a call 0x2348e ; 0x2348e microstep_readings(); 17300: 0f 94 6d 19 call 0x232da ; 0x232da 17304: 0c 94 07 a4 jmp 0x1480e ; 0x1480e 17308: 24 ec ldi r18, 0xC4 ; 196 1730a: e2 2e mov r14, r18 1730c: 22 e0 ldi r18, 0x02 ; 2 1730e: f2 2e mov r15, r18 - `B` - new pin value */ case 351: { #if defined(X_MS1_PIN) && X_MS1_PIN > -1 if(code_seen('S')) switch((int)code_value()) 17310: 10 e0 ldi r17, 0x00 ; 0 { case 1: for(int i=0;i 1731c: 88 23 and r24, r24 1731e: 41 f0 breq .+16 ; 0x17330 17320: 0e 94 85 5a call 0xb50a ; 0xb50a 17324: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 17328: 4f ef ldi r20, 0xFF ; 255 1732a: 81 2f mov r24, r17 1732c: 0f 94 c8 19 call 0x23390 ; 0x23390 17330: 1f 5f subi r17, 0xFF ; 255 17332: 14 30 cpi r17, 0x04 ; 4 17334: 71 f7 brne .-36 ; 0x17312 if(code_seen('B')) microstep_ms(4,code_value(),-1); 17336: 82 e4 ldi r24, 0x42 ; 66 17338: 0e 94 f5 55 call 0xabea ; 0xabea 1733c: 88 23 and r24, r24 1733e: 11 f4 brne .+4 ; 0x17344 17340: 0c 94 44 a2 jmp 0x14488 ; 0x14488 17344: 0e 94 85 5a call 0xb50a ; 0xb50a 17348: 0c 94 44 a2 jmp 0x14488 ; 0x14488 1734c: 94 ec ldi r25, 0xC4 ; 196 1734e: e9 2e mov r14, r25 17350: 92 e0 ldi r25, 0x02 ; 2 17352: f9 2e mov r15, r25 - `B` - new pin value */ case 351: { #if defined(X_MS1_PIN) && X_MS1_PIN > -1 if(code_seen('S')) switch((int)code_value()) 17354: 10 e0 ldi r17, 0x00 ; 0 case 1: for(int i=0;i 17360: 88 23 and r24, r24 17362: 49 f0 breq .+18 ; 0x17376 17364: 0e 94 85 5a call 0xb50a ; 0xb50a 17368: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1736c: 46 2f mov r20, r22 1736e: 6f ef ldi r22, 0xFF ; 255 17370: 81 2f mov r24, r17 17372: 0f 94 c8 19 call 0x23390 ; 0x23390 17376: 1f 5f subi r17, 0xFF ; 255 17378: 14 30 cpi r17, 0x04 ; 4 1737a: 69 f7 brne .-38 ; 0x17356 1737c: dc cf rjmp .-72 ; 0x17336 case 701: { uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU float z_target = 0; if( MMU2::mmu2.Enabled() ) 1737e: 80 91 01 13 lds r24, 0x1301 ; 0x801301 17382: 81 30 cpi r24, 0x01 ; 1 17384: 99 f1 breq .+102 ; 0x173ec - `L` - Extrude distance for insertion (positive value)(manual reload) - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes. */ case 701: { uint8_t mmuSlotIndex = 0xffU; 17386: 1f ef ldi r17, 0xFF ; 255 if( code_seen('P') || code_seen('T') ) { mmuSlotIndex = code_value_uint8(); } } if (code_seen('L')) fastLoadLength = code_value(); 17388: 8c e4 ldi r24, 0x4C ; 76 1738a: 0e 94 f5 55 call 0xabea ; 0xabea 1738e: 88 23 and r24, r24 17390: e1 f1 breq .+120 ; 0x1740a 17392: 0e 94 85 5a call 0xb50a ; 0xb50a 17396: 6b 01 movw r12, r22 17398: 7c 01 movw r14, r24 // Z lift. For safety only allow positive values if (code_seen('Z')) z_target = fabs(code_value()); 1739a: 8a e5 ldi r24, 0x5A ; 90 1739c: 0e 94 f5 55 call 0xabea ; 0xabea 173a0: 88 23 and r24, r24 173a2: d1 f1 breq .+116 ; 0x17418 173a4: 0e 94 85 5a call 0xb50a ; 0xb50a 173a8: 9f 77 andi r25, 0x7F ; 127 // Raise the Z axis float delta = raise_z(z_target); 173aa: 0e 94 94 6c call 0xd928 ; 0xd928 173ae: 4b 01 movw r8, r22 173b0: 5c 01 movw r10, r24 // Load filament gcode_M701(fastLoadLength, mmuSlotIndex, !code_seen('Z')); // if no z -> trigger MIN_Z_FOR_LOAD for backwards compatibility on 3.12 and older FW 173b2: 8a e5 ldi r24, 0x5A ; 90 173b4: 0e 94 f5 55 call 0xabea ; 0xabea 173b8: 08 2f mov r16, r24 } custom_message_type = CustomMsg::Status; } void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex, bool raise_z_axis = false){ FSensorBlockRunout fsBlockRunout; 173ba: 0f 94 2b 79 call 0x2f256 ; 0x2f256 prusa_statistics(22); 173be: 86 e1 ldi r24, 0x16 ; 22 173c0: 0f 94 79 32 call 0x264f2 ; 0x264f2 if (MMU2::mmu2.Enabled()) { 173c4: 80 91 01 13 lds r24, 0x1301 ; 0x801301 173c8: 81 30 cpi r24, 0x01 ; 1 173ca: 51 f5 brne .+84 ; 0x17420 if (mmuSlotIndex < MMU_FILAMENT_COUNT) { 173cc: 15 30 cpi r17, 0x05 ; 5 173ce: 18 f4 brcc .+6 ; 0x173d6 MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex); 173d0: 81 2f mov r24, r17 173d2: 0e 94 37 fe call 0x1fc6e ; 0x1fc6e lcd_update(2); lcd_setstatuspgm(MSG_WELCOME); custom_message_type = CustomMsg::Status; } eFilamentAction = FilamentAction::None; 173d6: 10 92 94 03 sts 0x0394, r1 ; 0x800394 173da: 0f 94 95 6d call 0x2db2a ; 0x2db2a // Load filament gcode_M701(fastLoadLength, mmuSlotIndex, !code_seen('Z')); // if no z -> trigger MIN_Z_FOR_LOAD for backwards compatibility on 3.12 and older FW // Restore Z axis raise_z(-delta); 173de: c5 01 movw r24, r10 173e0: b4 01 movw r22, r8 173e2: 90 58 subi r25, 0x80 ; 128 173e4: 0e 94 94 6c call 0xd928 ; 0xd928 173e8: 0c 94 07 a4 jmp 0x1480e ; 0x1480e uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU float z_target = 0; if( MMU2::mmu2.Enabled() ) { if( code_seen('P') || code_seen('T') ) { 173ec: 80 e5 ldi r24, 0x50 ; 80 173ee: 0e 94 f5 55 call 0xabea ; 0xabea 173f2: 88 23 and r24, r24 173f4: 21 f0 breq .+8 ; 0x173fe mmuSlotIndex = code_value_uint8(); 173f6: 0e 94 0a 56 call 0xac14 ; 0xac14 173fa: 18 2f mov r17, r24 173fc: c5 cf rjmp .-118 ; 0x17388 uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU float z_target = 0; if( MMU2::mmu2.Enabled() ) { if( code_seen('P') || code_seen('T') ) { 173fe: 84 e5 ldi r24, 0x54 ; 84 17400: 0e 94 f5 55 call 0xabea ; 0xabea 17404: 81 11 cpse r24, r1 17406: f7 cf rjmp .-18 ; 0x173f6 17408: be cf rjmp .-132 ; 0x17386 - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes. */ case 701: { uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU 1740a: c1 2c mov r12, r1 1740c: d1 2c mov r13, r1 1740e: 8c e8 ldi r24, 0x8C ; 140 17410: e8 2e mov r14, r24 17412: 82 e4 ldi r24, 0x42 ; 66 17414: f8 2e mov r15, r24 17416: c1 cf rjmp .-126 ; 0x1739a float z_target = 0; 17418: 60 e0 ldi r22, 0x00 ; 0 1741a: 70 e0 ldi r23, 0x00 ; 0 1741c: cb 01 movw r24, r22 1741e: c5 cf rjmp .-118 ; 0x173aa if (MMU2::mmu2.Enabled()) { if (mmuSlotIndex < MMU_FILAMENT_COUNT) { MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex); } // else do nothing } else { custom_message_type = CustomMsg::FilamentLoading; 17420: 82 e0 ldi r24, 0x02 ; 2 17422: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); 17426: 8d ee ldi r24, 0xED ; 237 17428: 91 e6 ldi r25, 0x61 ; 97 1742a: 0e 94 3a 75 call 0xea74 ; 0xea74 1742e: 0e 94 94 de call 0x1bd28 ; 0x1bd28 current_position[E_AXIS] += fastLoadLength; 17432: a7 01 movw r20, r14 17434: 96 01 movw r18, r12 17436: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 1743a: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 1743e: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 17442: 90 91 70 12 lds r25, 0x1270 ; 0x801270 17446: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1744a: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 1744e: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 17452: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 17456: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence 1745a: 60 e0 ldi r22, 0x00 ; 0 1745c: 70 e0 ldi r23, 0x00 ; 0 1745e: 80 ea ldi r24, 0xA0 ; 160 17460: 91 e4 ldi r25, 0x41 ; 65 17462: 0f 94 81 4c call 0x29902 ; 0x29902 if (raise_z_axis) { // backwards compatibility for 3.12 and older FW 17466: 01 11 cpse r16, r1 17468: 06 c0 rjmp .+12 ; 0x17476 raise_z_above(MIN_Z_FOR_LOAD); 1746a: 60 e0 ldi r22, 0x00 ; 0 1746c: 70 e0 ldi r23, 0x00 ; 0 1746e: 8c e0 ldi r24, 0x0C ; 12 17470: 92 e4 ldi r25, 0x42 ; 66 17472: 0e 94 f6 6c call 0xd9ec ; 0xd9ec } load_filament_final_feed(); // slow sequence 17476: 0e 94 ed 63 call 0xc7da ; 0xc7da st_synchronize(); 1747a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 Sound_MakeCustom(50, 500, false); 1747e: 40 e0 ldi r20, 0x00 ; 0 17480: 64 ef ldi r22, 0xF4 ; 244 17482: 71 e0 ldi r23, 0x01 ; 1 17484: 82 e3 ldi r24, 0x32 ; 50 17486: 90 e0 ldi r25, 0x00 ; 0 17488: 0f 94 be 27 call 0x24f7c ; 0x24f7c if (!farm_mode && (eFilamentAction != FilamentAction::None)) { 1748c: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 17490: 81 11 cpse r24, r1 17492: 05 c0 rjmp .+10 ; 0x1749e 17494: 80 91 94 03 lds r24, 0x0394 ; 0x800394 17498: 81 11 cpse r24, r1 lcd_load_filament_color_check(); 1749a: 0f 94 07 1b call 0x2360e ; 0x2360e #ifdef COMMUNITY_PREVENT_OOZE // Retract filament to prevent oozing retract_for_ooze_prevention(); #endif //COMMUNITY_PREVENT_OOZE lcd_update_enable(true); 1749e: 81 e0 ldi r24, 0x01 ; 1 174a0: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_update(2); 174a4: 82 e0 ldi r24, 0x02 ; 2 174a6: 0e 94 f9 6e call 0xddf2 ; 0xddf2 lcd_setstatuspgm(MSG_WELCOME); 174aa: 86 ee ldi r24, 0xE6 ; 230 174ac: 9b e6 ldi r25, 0x6B ; 107 174ae: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = CustomMsg::Status; 174b2: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d 174b6: 8f cf rjmp .-226 ; 0x173d6 */ case 702: { float z_target = 0; float unloadLength = FILAMENTCHANGE_FINALRETRACT; if (code_seen('U')) unloadLength = code_value(); 174b8: 85 e5 ldi r24, 0x55 ; 85 174ba: 0e 94 f5 55 call 0xabea ; 0xabea - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes. */ case 702: { float z_target = 0; float unloadLength = FILAMENTCHANGE_FINALRETRACT; 174be: c1 2c mov r12, r1 174c0: d1 2c mov r13, r1 174c2: 76 01 movw r14, r12 if (code_seen('U')) unloadLength = code_value(); 174c4: 88 23 and r24, r24 174c6: 21 f0 breq .+8 ; 0x174d0 174c8: 0e 94 85 5a call 0xb50a ; 0xb50a 174cc: 6b 01 movw r12, r22 174ce: 7c 01 movw r14, r24 // For safety only allow positive values if (code_seen('Z')) z_target = fabs(code_value()); 174d0: 8a e5 ldi r24, 0x5A ; 90 174d2: 0e 94 f5 55 call 0xabea ; 0xabea 174d6: 88 23 and r24, r24 174d8: a1 f0 breq .+40 ; 0x17502 174da: 0e 94 85 5a call 0xb50a ; 0xb50a 174de: 9f 77 andi r25, 0x7F ; 127 else raise_z_above(MIN_Z_FOR_UNLOAD); // backwards compatibility for 3.12 and older FW // Raise the Z axis float delta = raise_z(z_target); 174e0: 0e 94 94 6c call 0xd928 ; 0xd928 174e4: 4b 01 movw r8, r22 174e6: 5c 01 movw r10, r24 // Unload filament if (MMU2::mmu2.Enabled()) MMU2::mmu2.unload(); 174e8: 80 91 01 13 lds r24, 0x1301 ; 0x801301 174ec: 81 30 cpi r24, 0x01 ; 1 174ee: 99 f4 brne .+38 ; 0x17516 174f0: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 else unload_filament(unloadLength); // Restore Z axis raise_z(-delta); 174f4: c5 01 movw r24, r10 174f6: b4 01 movw r22, r8 174f8: 90 58 subi r25, 0x80 ; 128 174fa: 0e 94 94 6c call 0xd928 ; 0xd928 174fe: 0c 94 07 a4 jmp 0x1480e ; 0x1480e float unloadLength = FILAMENTCHANGE_FINALRETRACT; if (code_seen('U')) unloadLength = code_value(); // For safety only allow positive values if (code_seen('Z')) z_target = fabs(code_value()); else raise_z_above(MIN_Z_FOR_UNLOAD); // backwards compatibility for 3.12 and older FW 17502: 60 e0 ldi r22, 0x00 ; 0 17504: 70 e0 ldi r23, 0x00 ; 0 17506: 8c e0 ldi r24, 0x0C ; 12 17508: 92 e4 ldi r25, 0x42 ; 66 1750a: 0e 94 f6 6c call 0xd9ec ; 0xd9ec - `U` - Retract distance for removal (manual reload). Default value is FILAMENTCHANGE_FINALRETRACT. - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes. */ case 702: { float z_target = 0; 1750e: 60 e0 ldi r22, 0x00 ; 0 17510: 70 e0 ldi r23, 0x00 ; 0 17512: cb 01 movw r24, r22 17514: e5 cf rjmp .-54 ; 0x174e0 // Raise the Z axis float delta = raise_z(z_target); // Unload filament if (MMU2::mmu2.Enabled()) MMU2::mmu2.unload(); else unload_filament(unloadLength); 17516: c7 01 movw r24, r14 17518: b6 01 movw r22, r12 1751a: 0e 94 7e e3 call 0x1c6fc ; 0x1c6fc 1751e: ea cf rjmp .-44 ; 0x174f4 #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 704: { gcodes_M704_M705_M706(704); 17520: 80 ec ldi r24, 0xC0 ; 192 17522: 92 e0 ldi r25, 0x02 ; 2 17524: 0e 94 4b 5a call 0xb496 ; 0xb496 17528: 0c 94 07 a4 jmp 0x1480e ; 0x1480e #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 705: { gcodes_M704_M705_M706(705); 1752c: 81 ec ldi r24, 0xC1 ; 193 1752e: 92 e0 ldi r25, 0x02 ; 2 17530: 0e 94 4b 5a call 0xb496 ; 0xb496 17534: 0c 94 07 a4 jmp 0x1480e ; 0x1480e M707 A0x1b - Read a 8bit integer from register 0x1b and prints the result onto the serial line. Does nothing if the A parameter is not present or if MMU is not enabled. */ case 707: { if ( MMU2::mmu2.Enabled() ) { 17538: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1753c: 81 30 cpi r24, 0x01 ; 1 1753e: 11 f0 breq .+4 ; 0x17544 17540: 0c 94 07 a4 jmp 0x1480e ; 0x1480e if( code_seen('A') ) { 17544: 81 e4 ldi r24, 0x41 ; 65 17546: 0e 94 f5 55 call 0xabea ; 0xabea 1754a: 88 23 and r24, r24 1754c: 11 f4 brne .+4 ; 0x17552 1754e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e MMU2::mmu2.ReadRegister(uint8_t(strtol(strchr_pointer+1, NULL, 16))); 17552: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 17556: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 1755a: 40 e1 ldi r20, 0x10 ; 16 1755c: 50 e0 ldi r21, 0x00 ; 0 1755e: 70 e0 ldi r23, 0x00 ; 0 17560: 60 e0 ldi r22, 0x00 ; 0 17562: 01 96 adiw r24, 0x01 ; 1 17564: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 17568: 86 2f mov r24, r22 1756a: 0e 94 03 ff call 0x1fe06 ; 0x1fe06 1756e: 0c 94 07 a4 jmp 0x1480e ; 0x1480e M708 A0x1b X05 - Write to register 0x1b the value 05. Does nothing if A parameter is missing or if MMU is not enabled. */ case 708: { if ( MMU2::mmu2.Enabled() ){ 17572: 80 91 01 13 lds r24, 0x1301 ; 0x801301 17576: 81 30 cpi r24, 0x01 ; 1 17578: 11 f0 breq .+4 ; 0x1757e 1757a: 0c 94 07 a4 jmp 0x1480e ; 0x1480e uint8_t addr = 0; if( code_seen('A') ) { 1757e: 81 e4 ldi r24, 0x41 ; 65 17580: 0e 94 f5 55 call 0xabea ; 0xabea Does nothing if A parameter is missing or if MMU is not enabled. */ case 708: { if ( MMU2::mmu2.Enabled() ){ uint8_t addr = 0; 17584: 10 e0 ldi r17, 0x00 ; 0 if( code_seen('A') ) { 17586: 88 23 and r24, r24 17588: 61 f0 breq .+24 ; 0x175a2 addr = uint8_t(strtol(strchr_pointer+1, NULL, 16)); 1758a: 80 91 bb 04 lds r24, 0x04BB ; 0x8004bb 1758e: 90 91 bc 04 lds r25, 0x04BC ; 0x8004bc 17592: 40 e1 ldi r20, 0x10 ; 16 17594: 50 e0 ldi r21, 0x00 ; 0 17596: 70 e0 ldi r23, 0x00 ; 0 17598: 60 e0 ldi r22, 0x00 ; 0 1759a: 01 96 adiw r24, 0x01 ; 1 1759c: 0f 94 6b 9f call 0x33ed6 ; 0x33ed6 175a0: 16 2f mov r17, r22 } uint16_t data = 0; if( code_seen('X') ) { 175a2: 88 e5 ldi r24, 0x58 ; 88 175a4: 0e 94 f5 55 call 0xabea ; 0xabea 175a8: 88 23 and r24, r24 175aa: 61 f0 breq .+24 ; 0x175c4 data = code_value_short(); 175ac: 0e 94 17 56 call 0xac2e ; 0xac2e } if(addr){ 175b0: 11 23 and r17, r17 175b2: 11 f4 brne .+4 ; 0x175b8 175b4: 0c 94 07 a4 jmp 0x1480e ; 0x1480e MMU2::mmu2.WriteRegister(addr, data); 175b8: bc 01 movw r22, r24 175ba: 81 2f mov r24, r17 175bc: 0e 94 9c d2 call 0x1a538 ; 0x1a538 175c0: 0c 94 07 a4 jmp 0x1480e ; 0x1480e if ( MMU2::mmu2.Enabled() ){ uint8_t addr = 0; if( code_seen('A') ) { addr = uint8_t(strtol(strchr_pointer+1, NULL, 16)); } uint16_t data = 0; 175c4: 90 e0 ldi r25, 0x00 ; 0 175c6: 80 e0 ldi r24, 0x00 ; 0 175c8: f3 cf rjmp .-26 ; 0x175b0 M709 - Serial message if en- or disabled */ case 709: { if (code_seen('S')) 175ca: 83 e5 ldi r24, 0x53 ; 83 175cc: 0e 94 f5 55 call 0xabea ; 0xabea 175d0: 88 23 and r24, r24 175d2: 31 f0 breq .+12 ; 0x175e0 { switch (code_value_uint8()) 175d4: 0e 94 0a 56 call 0xac14 ; 0xac14 175d8: 88 23 and r24, r24 175da: a9 f0 breq .+42 ; 0x17606 175dc: 81 30 cpi r24, 0x01 ; 1 175de: f9 f0 breq .+62 ; 0x1761e break; default: break; } } if (MMU2::mmu2.Enabled() && code_seen('X')) 175e0: 80 91 01 13 lds r24, 0x1301 ; 0x801301 175e4: 81 30 cpi r24, 0x01 ; 1 175e6: 59 f4 brne .+22 ; 0x175fe 175e8: 88 e5 ldi r24, 0x58 ; 88 175ea: 0e 94 f5 55 call 0xabea ; 0xabea 175ee: 88 23 and r24, r24 175f0: 31 f0 breq .+12 ; 0x175fe { switch (code_value_uint8()) 175f2: 0e 94 0a 56 call 0xac14 ; 0xac14 175f6: 82 30 cpi r24, 0x02 ; 2 175f8: d0 f0 brcs .+52 ; 0x1762e 175fa: 8a 32 cpi r24, 0x2A ; 42 175fc: e1 f0 breq .+56 ; 0x17636 break; default: break; } } MMU2::mmu2.Status(); 175fe: 0f 94 ad 65 call 0x2cb5a ; 0x2cb5a 17602: 0c 94 07 a4 jmp 0x1480e ; 0x1480e if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 17606: 60 e0 ldi r22, 0x00 ; 0 17608: 8c ea ldi r24, 0xAC ; 172 1760a: 9c e0 ldi r25, 0x0C ; 12 1760c: 0f 94 04 a4 call 0x34808 ; 0x34808 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 17610: 10 92 01 13 sts 0x1301, r1 ; 0x801301 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 17614: 10 92 af 12 sts 0x12AF, r1 ; 0x8012af currentScope = Scope::Stopped; 17618: 10 92 94 12 sts 0x1294, r1 ; 0x801294 1761c: e1 cf rjmp .-62 ; 0x175e0 1761e: 61 e0 ldi r22, 0x01 ; 1 17620: 8c ea ldi r24, 0xAC ; 172 17622: 9c e0 ldi r25, 0x0C ; 12 17624: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false); MMU2::mmu2.Stop(); break; case 1: eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, true); MMU2::mmu2.Start(); 17628: 0f 94 80 95 call 0x32b00 ; 0x32b00 1762c: d9 cf rjmp .-78 ; 0x175e0 break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 1762e: 80 e0 ldi r24, 0x00 ; 0 } void MMU2::ResetX42() { logic.ResetMMU(42); 17630: 0f 94 43 95 call 0x32a86 ; 0x32a86 17634: e4 cf rjmp .-56 ; 0x175fe 17636: 8a e2 ldi r24, 0x2A ; 42 17638: fb cf rjmp .-10 ; 0x17630 T - Selects the filament position. A Gcode to load a filament to the nozzle must follow. Tx - Printer asks user to select a filament position. Then loads the filament from the MMU unit into the extruder wheels only. G-code to heat up the nozzle follows. Tc - Loads the filament tip from the extruder wheels into the nozzle. T? - acts the same as Tx followed by Tc */ else if(*CMDBUFFER_CURRENT_STRING == 'T') { 1763a: 84 35 cpi r24, 0x54 ; 84 1763c: 09 f0 breq .+2 ; 0x17640 1763e: 79 c0 rjmp .+242 ; 0x17732 strchr_pointer = CMDBUFFER_CURRENT_STRING; 17640: 10 93 bc 04 sts 0x04BC, r17 ; 0x8004bc 17644: 00 93 bb 04 sts 0x04BB, r16 ; 0x8004bb processing_tcode = true; 17648: 81 e0 ldi r24, 0x01 ; 1 1764a: 80 93 91 03 sts 0x0391, r24 ; 0x800391 TCodes(strchr_pointer, code_value_uint8()); 1764e: 0e 94 0a 56 call 0xac14 ; 0xac14 17652: 18 2f mov r17, r24 17654: 20 91 bb 04 lds r18, 0x04BB ; 0x8004bb 17658: 30 91 bc 04 lds r19, 0x04BC ; 0x8004bc inline void TCodeInvalid() { SERIAL_ECHOLNPGM("Invalid T code."); } void TCodes(char *const strchr_pointer, const uint8_t codeValue) { uint8_t index = 1; 1765c: 91 e0 ldi r25, 0x01 ; 1 for ( /*nothing*/ ; strchr_pointer[index] == ' ' || strchr_pointer[index] == '\t'; index++) 1765e: 79 01 movw r14, r18 17660: e9 0e add r14, r25 17662: f1 1c adc r15, r1 17664: d7 01 movw r26, r14 17666: 8c 91 ld r24, X 17668: 80 32 cpi r24, 0x20 ; 32 1766a: 11 f0 breq .+4 ; 0x17670 1766c: 89 30 cpi r24, 0x09 ; 9 1766e: 11 f4 brne .+4 ; 0x17674 17670: 9f 5f subi r25, 0xFF ; 255 17672: f5 cf rjmp .-22 ; 0x1765e ; strchr_pointer[index] = tolower(strchr_pointer[index]); 17674: 08 2e mov r0, r24 17676: 00 0c add r0, r0 17678: 99 0b sbc r25, r25 1767a: 0f 94 f4 a9 call 0x353e8 ; 0x353e8 1767e: f7 01 movw r30, r14 17680: 80 83 st Z, r24 #include static const char duplicate_Tcode_ignored[] PROGMEM = "Duplicate T-code ignored."; inline bool IsInvalidTCode(char *const s, uint8_t i) { return ((s[i] < '0' || s[i] > '4') && s[i] != '?' && s[i] != 'x' && s[i] != 'c'); 17682: 90 ed ldi r25, 0xD0 ; 208 17684: 98 0f add r25, r24 17686: 95 30 cpi r25, 0x05 ; 5 17688: 58 f0 brcs .+22 ; 0x176a0 1768a: 8f 33 cpi r24, 0x3F ; 63 1768c: 69 f0 breq .+26 ; 0x176a8 1768e: 88 37 cpi r24, 0x78 ; 120 17690: 59 f0 breq .+22 ; 0x176a8 17692: 83 36 cpi r24, 0x63 ; 99 17694: 01 f1 breq .+64 ; 0x176d6 } inline void TCodeInvalid() { SERIAL_ECHOLNPGM("Invalid T code."); 17696: 81 ee ldi r24, 0xE1 ; 225 17698: 98 e7 ldi r25, 0x78 ; 120 } else { SERIAL_ECHO_START; if (codeValue >= EXTRUDERS) { SERIAL_ECHO('T'); SERIAL_ECHOLN(codeValue + '0'); SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER 1769a: 0e 94 bd 7c call 0xf97a ; 0xf97a 1769e: 15 c0 rjmp .+42 ; 0x176ca 176a0: 90 91 01 13 lds r25, 0x1301 ; 0x801301 strchr_pointer[index] = tolower(strchr_pointer[index]); if (IsInvalidTCode(strchr_pointer, index)){ TCodeInvalid(); } else if (strchr_pointer[index] == 'x' || strchr_pointer[index] == '?'){ 176a4: 8f 33 cpi r24, 0x3F ; 63 176a6: a9 f4 brne .+42 ; 0x176d2 // load to extruder gears; if mmu is not present do nothing if (MMU2::mmu2.Enabled()) { 176a8: 80 91 01 13 lds r24, 0x1301 ; 0x801301 176ac: 81 30 cpi r24, 0x01 ; 1 176ae: 69 f4 brne .+26 ; 0x176ca MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT)); 176b0: 86 e1 ldi r24, 0x16 ; 22 176b2: 9d e3 ldi r25, 0x3D ; 61 176b4: 0e 94 3a 75 call 0xea74 ; 0xea74 176b8: 70 e0 ldi r23, 0x00 ; 0 176ba: 60 e0 ldi r22, 0x00 ; 0 176bc: 0e 94 c8 d1 call 0x1a390 ; 0x1a390 176c0: 68 2f mov r22, r24 176c2: d7 01 movw r26, r14 176c4: 8c 91 ld r24, X } } else if (strchr_pointer[index] == 'c'){ // load from extruder gears to nozzle (nozzle should be preheated) if (MMU2::mmu2.Enabled()) { MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool()); 176c6: 0e 94 a1 fe call 0x1fd42 ; 0x1fd42 processing_tcode = false; 176ca: 10 92 91 03 sts 0x0391, r1 ; 0x800391 176ce: 0c 94 2c 90 jmp 0x12058 ; 0x12058 } else if (strchr_pointer[index] == 'x' || strchr_pointer[index] == '?'){ // load to extruder gears; if mmu is not present do nothing if (MMU2::mmu2.Enabled()) { MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT)); } } else if (strchr_pointer[index] == 'c'){ 176d2: 83 36 cpi r24, 0x63 ; 99 176d4: 49 f4 brne .+18 ; 0x176e8 // load from extruder gears to nozzle (nozzle should be preheated) if (MMU2::mmu2.Enabled()) { 176d6: 80 91 01 13 lds r24, 0x1301 ; 0x801301 176da: 81 30 cpi r24, 0x01 ; 1 176dc: b1 f7 brne .-20 ; 0x176ca MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool()); 176de: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 176e2: 68 2f mov r22, r24 176e4: 83 e6 ldi r24, 0x63 ; 99 176e6: ef cf rjmp .-34 ; 0x176c6 } } else { // Process T0 ... T4 if (MMU2::mmu2.Enabled()) { 176e8: 91 30 cpi r25, 0x01 ; 1 176ea: 69 f4 brne .+26 ; 0x17706 if (codeValue == MMU2::mmu2.get_current_tool()){ 176ec: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 176f0: 18 13 cpse r17, r24 176f2: 05 c0 rjmp .+10 ; 0x176fe // don't execute the same T-code twice in a row puts_P(duplicate_Tcode_ignored); 176f4: 81 ef ldi r24, 0xF1 ; 241 176f6: 98 e7 ldi r25, 0x78 ; 120 176f8: 0f 94 c9 a2 call 0x34592 ; 0x34592 176fc: e6 cf rjmp .-52 ; 0x176ca #if defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT) if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED)) { MMU2::mmu2.cut_filament(codeValue); } #endif // defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT) MMU2::mmu2.tool_change(codeValue); 176fe: 81 2f mov r24, r17 17700: 0e 94 7e fe call 0x1fcfc ; 0x1fcfc 17704: e2 cf rjmp .-60 ; 0x176ca } } else { SERIAL_ECHO_START; 17706: 8e ec ldi r24, 0xCE ; 206 17708: 91 ea ldi r25, 0xA1 ; 161 1770a: 0e 94 c4 7a call 0xf588 ; 0xf588 if (codeValue >= EXTRUDERS) { 1770e: 11 23 and r17, r17 17710: 59 f0 breq .+22 ; 0x17728 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 17712: 84 e5 ldi r24, 0x54 ; 84 17714: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_ECHO('T'); SERIAL_ECHOLN(codeValue + '0'); 17718: 81 2f mov r24, r17 1771a: 90 e0 ldi r25, 0x00 ; 0 1771c: c0 96 adiw r24, 0x30 ; 48 1771e: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER 17722: 86 ed ldi r24, 0xD6 ; 214 17724: 94 e6 ldi r25, 0x64 ; 100 17726: b9 cf rjmp .-142 ; 0x1769a // next_feedrate = code_value(); // if (next_feedrate > 0.0) { // feedrate = next_feedrate; // } // } SERIAL_ECHORPGM(_n("Active Extruder: 0")); ////MSG_ACTIVE_EXTRUDER 17728: 83 ec ldi r24, 0xC3 ; 195 1772a: 94 e6 ldi r25, 0x64 ; 100 1772c: 0e 94 c4 7a call 0xf588 ; 0xf588 17730: cc cf rjmp .-104 ; 0x176ca /** *--------------------------------------------------------------------------------- *# D codes */ else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug) 17732: 84 34 cpi r24, 0x44 ; 68 17734: 09 f0 breq .+2 ; 0x17738 17736: 5d c0 rjmp .+186 ; 0x177f2 { strchr_pointer = CMDBUFFER_CURRENT_STRING; 17738: 10 93 bc 04 sts 0x04BC, r17 ; 0x8004bc 1773c: 00 93 bb 04 sts 0x04BB, r16 ; 0x8004bb switch(code_value_short()) 17740: 0e 94 17 56 call 0xac2e ; 0xac2e 17744: 82 30 cpi r24, 0x02 ; 2 17746: 91 05 cpc r25, r1 17748: 41 f1 breq .+80 ; 0x1779a 1774a: 8c f4 brge .+34 ; 0x1776e 1774c: 01 96 adiw r24, 0x01 ; 1 1774e: e1 f0 breq .+56 ; 0x17788 #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //DEBUG_DCODES default: printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE); 17750: 80 91 38 12 lds r24, 0x1238 ; 0x801238 17754: 90 91 39 12 lds r25, 0x1239 ; 0x801239 17758: 82 5b subi r24, 0xB2 ; 178 1775a: 9f 4e sbci r25, 0xEF ; 239 1775c: 9f 93 push r25 1775e: 8f 93 push r24 17760: 1f 92 push r1 17762: 84 e4 ldi r24, 0x44 ; 68 17764: 8f 93 push r24 17766: 88 e5 ldi r24, 0x58 ; 88 17768: 96 e6 ldi r25, 0x66 ; 102 1776a: 0c 94 81 90 jmp 0x12102 ; 0x12102 *# D codes */ else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug) { strchr_pointer = CMDBUFFER_CURRENT_STRING; switch(code_value_short()) 1776e: 83 30 cpi r24, 0x03 ; 3 17770: 91 05 cpc r25, r1 17772: f9 f0 breq .+62 ; 0x177b2 17774: 47 97 sbiw r24, 0x17 ; 23 17776: 61 f7 brne .-40 ; 0x17750 bool emergency_serial_dump = false; void dcode_23() { if(code_seen('E')) 17778: 85 e4 ldi r24, 0x45 ; 69 1777a: 0e 94 f5 55 call 0xabea ; 0xabea 1777e: 88 23 and r24, r24 17780: 09 f1 breq .+66 ; 0x177c4 serial_dump_and_reset(dump_crash_reason::manual); 17782: 80 e0 ldi r24, 0x00 ; 0 17784: 0e 94 79 86 call 0x10cf2 ; 0x10cf2 * */ void dcode__1() { DBG(_N("D-1 - Endless loop\n")); 17788: 8f ea ldi r24, 0xAF ; 175 1778a: 94 e6 ldi r25, 0x64 ; 100 1778c: 9f 93 push r25 1778e: 8f 93 push r24 17790: 0f 94 a2 a2 call 0x34544 ; 0x34544 17794: 0f 90 pop r0 17796: 0f 90 pop r0 17798: ff cf rjmp .-2 ; 0x17798 - The hex data needs to be lowercase */ void dcode_2() { dcode_core(RAMSTART, RAMEND+1, dcode_mem_t::sram, 2, _N("SRAM")); 1779a: 0a ea ldi r16, 0xAA ; 170 1779c: 14 e6 ldi r17, 0x64 ; 100 1779e: 22 e0 ldi r18, 0x02 ; 2 177a0: 40 e0 ldi r20, 0x00 ; 0 177a2: 60 e0 ldi r22, 0x00 ; 0 177a4: 72 e2 ldi r23, 0x22 ; 34 177a6: 80 e0 ldi r24, 0x00 ; 0 177a8: 92 e0 ldi r25, 0x02 ; 2 - The hex data needs to be lowercase */ void dcode_3() { dcode_core(0, EEPROM_SIZE, dcode_mem_t::eeprom, 3, _N("EEPROM")); 177aa: 0e 94 bc 5d call 0xbb78 ; 0xbb78 177ae: 0c 94 2c 90 jmp 0x12058 ; 0x12058 177b2: 03 ea ldi r16, 0xA3 ; 163 177b4: 14 e6 ldi r17, 0x64 ; 100 177b6: 23 e0 ldi r18, 0x03 ; 3 177b8: 41 e0 ldi r20, 0x01 ; 1 177ba: 60 e0 ldi r22, 0x00 ; 0 177bc: 70 e1 ldi r23, 0x10 ; 16 177be: 90 e0 ldi r25, 0x00 ; 0 177c0: 80 e0 ldi r24, 0x00 ; 0 177c2: f3 cf rjmp .-26 ; 0x177aa { if(code_seen('E')) serial_dump_and_reset(dump_crash_reason::manual); else { emergency_serial_dump = !code_seen('R'); 177c4: 82 e5 ldi r24, 0x52 ; 82 177c6: 0e 94 f5 55 call 0xabea ; 0xabea 177ca: 91 e0 ldi r25, 0x01 ; 1 177cc: 89 27 eor r24, r25 177ce: 80 93 0f 06 sts 0x060F, r24 ; 0x80060f SERIAL_ECHOPGM("serial dump "); 177d2: 84 ed ldi r24, 0xD4 ; 212 177d4: 98 e7 ldi r25, 0x78 ; 120 177d6: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(emergency_serial_dump? _N("enabled"): _N("disabled")); 177da: 80 91 0f 06 lds r24, 0x060F ; 0x80060f 177de: 88 23 and r24, r24 177e0: 21 f0 breq .+8 ; 0x177ea 177e2: 8b e9 ldi r24, 0x9B ; 155 177e4: 94 e6 ldi r25, 0x64 ; 100 177e6: 0c 94 e8 90 jmp 0x121d0 ; 0x121d0 177ea: 82 e9 ldi r24, 0x92 ; 146 177ec: 94 e6 ldi r25, 0x64 ; 100 177ee: 0c 94 e8 90 jmp 0x121d0 ; 0x121d0 } } else { SERIAL_ECHO_START; 177f2: 8e ec ldi r24, 0xCE ; 206 177f4: 91 ea ldi r25, 0xA1 ; 161 177f6: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); 177fa: 85 e0 ldi r24, 0x05 ; 5 177fc: 95 e6 ldi r25, 0x65 ; 101 177fe: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); 17802: 80 91 38 12 lds r24, 0x1238 ; 0x801238 17806: 90 91 39 12 lds r25, 0x1239 ; 0x801239 1780a: 82 5b subi r24, 0xB2 ; 178 1780c: 9f 4e sbci r25, 0xEF ; 239 1780e: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHOLNPGM("\"(2)"); 17812: 89 e6 ldi r24, 0x69 ; 105 17814: 9e e7 ldi r25, 0x7E ; 126 17816: 0c 94 e8 90 jmp 0x121d0 ; 0x121d0 #ifdef FWRETRACT if(cs.autoretract_enabled) { if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { float echange=destination[E_AXIS]-current_position[E_AXIS]; if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover 1781a: 2d ec ldi r18, 0xCD ; 205 1781c: 3c ec ldi r19, 0xCC ; 204 1781e: 4c ec ldi r20, 0xCC ; 204 17820: 5d e3 ldi r21, 0x3D ; 61 17822: c7 01 movw r24, r14 17824: b6 01 movw r22, r12 17826: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1782a: 18 16 cp r1, r24 1782c: 14 f4 brge .+4 ; 0x17832 1782e: 0c 94 50 92 jmp 0x124a0 ; 0x124a0 17832: 0c 94 60 93 jmp 0x126c0 ; 0x126c0 float temp = (40 + i * 5); printf_P(_N("\nStep: %d/6 (skipped)\nPINDA temperature: %d Z shift (mm):0\n"), i + 2, (40 + i*5)); if (i >= 0) { eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } if (start_temp <= temp) break; 17836: a3 01 movw r20, r6 17838: 92 01 movw r18, r4 1783a: 62 2d mov r22, r2 1783c: 73 2d mov r23, r3 1783e: 8e 2d mov r24, r14 17840: 9f 2d mov r25, r15 17842: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 17846: 18 16 cp r1, r24 17848: 14 f0 brlt .+4 ; 0x1784e 1784a: 0c 94 d2 9a jmp 0x135a4 ; 0x135a4 1784e: e5 e0 ldi r30, 0x05 ; 5 17850: ce 0e add r12, r30 17852: d1 1c adc r13, r1 17854: f2 e0 ldi r31, 0x02 ; 2 17856: 8f 0e add r8, r31 17858: 91 1c adc r9, r1 SERIAL_ECHOLNPGM("PINDA probe calibration start"); float zero_z; int z_shift = 0; //unit: steps float start_temp = 5 * (int)(current_temperature_pinda / 5); if (start_temp < 35) start_temp = 35; 1785a: 85 01 movw r16, r10 1785c: 0c 94 99 9a jmp 0x13532 ; 0x13532 int8_t upgrade = is_provided_version_newer(version_string); if (upgrade < 0) return false; if (upgrade) { lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE)); 17860: 81 e2 ldi r24, 0x21 ; 33 17862: 99 e3 ldi r25, 0x39 ; 57 17864: 0e 94 3a 75 call 0xea74 ; 0xea74 17868: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_puts_at_P(0, 2, PSTR("")); 1786c: 43 e0 ldi r20, 0x03 ; 3 1786e: 5e e7 ldi r21, 0x7E ; 126 17870: 62 e0 ldi r22, 0x02 ; 2 17872: 80 e0 ldi r24, 0x00 ; 0 17874: 0e 94 07 70 call 0xe00e ; 0xe00e for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c) 17878: f8 01 movw r30, r16 1787a: 81 91 ld r24, Z+ 1787c: 8f 01 movw r16, r30 return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } inline bool is_whitespace_or_nl_or_eol(char c) { return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r'; 1787e: 98 2f mov r25, r24 17880: 9f 7d andi r25, 0xDF ; 223 17882: 11 f4 brne .+4 ; 0x17888 17884: 0c 94 03 aa jmp 0x15406 ; 0x15406 17888: 97 ef ldi r25, 0xF7 ; 247 1788a: 98 0f add r25, r24 1788c: 92 30 cpi r25, 0x02 ; 2 1788e: 10 f4 brcc .+4 ; 0x17894 17890: 0c 94 03 aa jmp 0x15406 ; 0x15406 17894: 8d 30 cpi r24, 0x0D ; 13 17896: 11 f4 brne .+4 ; 0x1789c 17898: 0c 94 03 aa jmp 0x15406 ; 0x15406 if (upgrade) { lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE)); lcd_puts_at_P(0, 2, PSTR("")); for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c) lcd_putc(*c); 1789c: 0e 94 21 6f call 0xde42 ; 0xde42 178a0: eb cf rjmp .-42 ; 0x17878 000178a2 <__vector_29>: #ifdef ADC_CALLBACK extern void ADC_CALLBACK(); #endif //ADC_CALLBACK ISR(ADC_vect) { 178a2: 1f 92 push r1 178a4: 0f 92 push r0 178a6: 0f b6 in r0, 0x3f ; 63 178a8: 0f 92 push r0 178aa: 11 24 eor r1, r1 178ac: 0b b6 in r0, 0x3b ; 59 178ae: 0f 92 push r0 178b0: 2f 93 push r18 178b2: 3f 93 push r19 178b4: 4f 93 push r20 178b6: 5f 93 push r21 178b8: 6f 93 push r22 178ba: 7f 93 push r23 178bc: 8f 93 push r24 178be: 9f 93 push r25 178c0: af 93 push r26 178c2: bf 93 push r27 178c4: ef 93 push r30 178c6: ff 93 push r31 adc_values[adc_channel] += ADC; 178c8: 20 91 78 00 lds r18, 0x0078 ; 0x800078 <__TEXT_REGION_LENGTH__+0x7c2078> 178cc: 30 91 79 00 lds r19, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7c2079> 178d0: e0 91 14 03 lds r30, 0x0314 ; 0x800314 178d4: f0 e0 ldi r31, 0x00 ; 0 178d6: ee 0f add r30, r30 178d8: ff 1f adc r31, r31 178da: ec 5f subi r30, 0xFC ; 252 178dc: fc 4f sbci r31, 0xFC ; 252 178de: 80 81 ld r24, Z 178e0: 91 81 ldd r25, Z+1 ; 0x01 178e2: 82 0f add r24, r18 178e4: 93 1f adc r25, r19 178e6: 91 83 std Z+1, r25 ; 0x01 178e8: 80 83 st Z, r24 if (++adc_count == ADC_OVRSAMPL) 178ea: 80 91 03 03 lds r24, 0x0303 ; 0x800303 178ee: 8f 5f subi r24, 0xFF ; 255 178f0: 80 93 03 03 sts 0x0303, r24 ; 0x800303 178f4: 80 31 cpi r24, 0x10 ; 16 178f6: e9 f5 brne .+122 ; 0x17972 <__vector_29+0xd0> { // go to the next channel if (++adc_channel == ADC_CHAN_CNT) { 178f8: 80 91 14 03 lds r24, 0x0314 ; 0x800314 178fc: 8f 5f subi r24, 0xFF ; 255 178fe: 80 93 14 03 sts 0x0314, r24 ; 0x800314 17902: 88 30 cpi r24, 0x08 ; 8 17904: 71 f5 brne .+92 ; 0x17962 <__vector_29+0xc0> #endif // ISR callback from adc when sampling finished void adc_callback() { current_temperature_raw[0] = adc_values[ADC_PIN_IDX(TEMP_0_PIN)]; //heater 17906: 80 91 04 03 lds r24, 0x0304 ; 0x800304 1790a: 90 91 05 03 lds r25, 0x0305 ; 0x800305 1790e: 90 93 dd 05 sts 0x05DD, r25 ; 0x8005dd 17912: 80 93 dc 05 sts 0x05DC, r24 ; 0x8005dc current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)]; 17916: 80 91 08 03 lds r24, 0x0308 ; 0x800308 1791a: 90 91 09 03 lds r25, 0x0309 ; 0x800309 1791e: 90 93 df 05 sts 0x05DF, r25 ; 0x8005df 17922: 80 93 de 05 sts 0x05DE, r24 ; 0x8005de #ifdef PINDA_THERMISTOR current_temperature_raw_pinda = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)]; 17926: 80 91 06 03 lds r24, 0x0306 ; 0x800306 1792a: 90 91 07 03 lds r25, 0x0307 ; 0x800307 1792e: 90 93 db 05 sts 0x05DB, r25 ; 0x8005db 17932: 80 93 da 05 sts 0x05DA, r24 ; 0x8005da current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9 #endif #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) fsensor.voltUpdate(adc_values[ADC_PIN_IDX(VOLT_IR_PIN)]); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) adc_values_ready = true; 17936: 81 e0 ldi r24, 0x01 ; 1 17938: 80 93 f6 05 sts 0x05F6, r24 ; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517> break; } } } ADCSRA |= (1 << ADSC); //start conversion } 1793c: ff 91 pop r31 1793e: ef 91 pop r30 17940: bf 91 pop r27 17942: af 91 pop r26 17944: 9f 91 pop r25 17946: 8f 91 pop r24 17948: 7f 91 pop r23 1794a: 6f 91 pop r22 1794c: 5f 91 pop r21 1794e: 4f 91 pop r20 17950: 3f 91 pop r19 17952: 2f 91 pop r18 17954: 0f 90 pop r0 17956: 0b be out 0x3b, r0 ; 59 17958: 0f 90 pop r0 1795a: 0f be out 0x3f, r0 ; 63 1795c: 0f 90 pop r0 1795e: 1f 90 pop r1 17960: 18 95 reti 17962: 80 91 02 03 lds r24, 0x0302 ; 0x800302 <__data_end> return; // do not start the next measurement since there are no channels remaining } // find the next channel while (++adc_channel_idx) { if (ADC_CHAN_MSK & (1 << adc_channel_idx)) { 17966: 4f e5 ldi r20, 0x5F ; 95 17968: 53 e0 ldi r21, 0x03 ; 3 #endif return; // do not start the next measurement since there are no channels remaining } // find the next channel while (++adc_channel_idx) { 1796a: 8f 5f subi r24, 0xFF ; 255 1796c: 41 f4 brne .+16 ; 0x1797e <__vector_29+0xdc> 1796e: 10 92 02 03 sts 0x0302, r1 ; 0x800302 <__data_end> adc_count = 0; break; } } } ADCSRA |= (1 << ADSC); //start conversion 17972: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 17976: 80 64 ori r24, 0x40 ; 64 17978: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1797c: df cf rjmp .-66 ; 0x1793c <__vector_29+0x9a> return; // do not start the next measurement since there are no channels remaining } // find the next channel while (++adc_channel_idx) { if (ADC_CHAN_MSK & (1 << adc_channel_idx)) { 1797e: 9a 01 movw r18, r20 17980: 08 2e mov r0, r24 17982: 02 c0 rjmp .+4 ; 0x17988 <__vector_29+0xe6> 17984: 35 95 asr r19 17986: 27 95 ror r18 17988: 0a 94 dec r0 1798a: e2 f7 brpl .-8 ; 0x17984 <__vector_29+0xe2> 1798c: 20 ff sbrs r18, 0 1798e: ed cf rjmp .-38 ; 0x1796a <__vector_29+0xc8> 17990: 80 93 02 03 sts 0x0302, r24 ; 0x800302 <__data_end> adc_setmux(adc_channel_idx); 17994: 0e 94 09 55 call 0xaa12 ; 0xaa12 adc_count = 0; 17998: 10 92 03 03 sts 0x0303, r1 ; 0x800303 1799c: ea cf rjmp .-44 ; 0x17972 <__vector_29+0xd0> 0001799e : if (ch & 0x08) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); } void adc_start_cycle() { 1799e: cf 93 push r28 179a0: df 93 push r29 static void adc_reset() { static const uint8_t first_channel_idx = 0; static_assert((1 << first_channel_idx) & ADC_CHAN_MSK); ADCSRA &= ~(1 << ADSC); //stop conversion just in case 179a2: ca e7 ldi r28, 0x7A ; 122 179a4: d0 e0 ldi r29, 0x00 ; 0 179a6: 88 81 ld r24, Y 179a8: 8f 7b andi r24, 0xBF ; 191 179aa: 88 83 st Y, r24 adc_count = 0; 179ac: 10 92 03 03 sts 0x0303, r1 ; 0x800303 adc_channel = 0; 179b0: 10 92 14 03 sts 0x0314, r1 ; 0x800314 adc_channel_idx = first_channel_idx; 179b4: 10 92 02 03 sts 0x0302, r1 ; 0x800302 <__data_end> adc_setmux(adc_channel_idx); 179b8: 80 e0 ldi r24, 0x00 ; 0 179ba: 0e 94 09 55 call 0xaa12 ; 0xaa12 memset((void*)adc_values, 0, sizeof(adc_values)); 179be: e4 e0 ldi r30, 0x04 ; 4 179c0: f3 e0 ldi r31, 0x03 ; 3 179c2: 80 e1 ldi r24, 0x10 ; 16 179c4: df 01 movw r26, r30 179c6: 1d 92 st X+, r1 179c8: 8a 95 dec r24 179ca: e9 f7 brne .-6 ; 0x179c6 ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); } void adc_start_cycle() { adc_reset(); ADCSRA |= (1 << ADSC); //start conversion 179cc: 88 81 ld r24, Y 179ce: 80 64 ori r24, 0x40 ; 64 179d0: 88 83 st Y, r24 } 179d2: df 91 pop r29 179d4: cf 91 pop r28 179d6: 08 95 ret 000179d8 : uint8_t check_pinda_0() { return _PINDA?0:1; } 179d8: 81 50 subi r24, 0x01 ; 1 179da: 82 31 cpi r24, 0x12 ; 18 179dc: 08 f0 brcs .+2 ; 0x179e0 179de: 5a c0 rjmp .+180 ; 0x17a94 179e0: e8 2f mov r30, r24 179e2: f0 e0 ldi r31, 0x00 ; 0 179e4: 88 27 eor r24, r24 179e6: e8 50 subi r30, 0x08 ; 8 179e8: f3 44 sbci r31, 0x43 ; 67 179ea: 8f 4f sbci r24, 0xFF ; 255 179ec: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 179f0: 18 bd out 0x28, r17 ; 40 179f2: 1c bd out 0x2c, r17 ; 44 179f4: 0a bd out 0x2a, r16 ; 42 179f6: 10 bd out 0x20, r17 ; 32 179f8: 14 bd out 0x24, r17 ; 36 179fa: 4a bd out 0x2a, r20 ; 42 179fc: 1f bd out 0x2f, r17 ; 47 179fe: 25 bd out 0x25, r18 ; 37 17a00: 29 bd out 0x29, r18 ; 41 17a02: 2f bd out 0x2f, r18 ; 47 17a04: 33 bd out 0x23, r19 ; 35 17a06: 37 bd out 0x27, r19 ; 39 17a08: 3d bd out 0x2d, r19 ; 45 17a0a: 41 bd out 0x21, r20 ; 33 17a0c: 4a bd out 0x2a, r20 ; 42 17a0e: 45 bd out 0x25, r20 ; 37 17a10: 4b bd out 0x2b, r20 ; 43 17a12: 4f bd out 0x2f, r20 ; 47 17a14: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 17a18: 8f 77 andi r24, 0x7F ; 127 17a1a: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 17a1e: 08 95 ret 17a20: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 17a24: 8f 7d andi r24, 0xDF ; 223 17a26: f9 cf rjmp .-14 ; 0x17a1a 17a28: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 17a2c: 87 7f andi r24, 0xF7 ; 247 17a2e: f5 cf rjmp .-22 ; 0x17a1a 17a30: 84 b5 in r24, 0x24 ; 36 17a32: 8f 77 andi r24, 0x7F ; 127 17a34: 84 bd out 0x24, r24 ; 36 17a36: 08 95 ret 17a38: 84 b5 in r24, 0x24 ; 36 17a3a: 8f 7d andi r24, 0xDF ; 223 17a3c: fb cf rjmp .-10 ; 0x17a34 17a3e: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 17a42: 8f 77 andi r24, 0x7F ; 127 17a44: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 17a48: 08 95 ret 17a4a: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 17a4e: 8f 7d andi r24, 0xDF ; 223 17a50: f9 cf rjmp .-14 ; 0x17a44 17a52: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 17a56: 8f 77 andi r24, 0x7F ; 127 17a58: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 17a5c: 08 95 ret 17a5e: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 17a62: 8f 7d andi r24, 0xDF ; 223 17a64: f9 cf rjmp .-14 ; 0x17a58 17a66: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 17a6a: 87 7f andi r24, 0xF7 ; 247 17a6c: f5 cf rjmp .-22 ; 0x17a58 17a6e: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 17a72: 8f 77 andi r24, 0x7F ; 127 17a74: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 17a78: 08 95 ret 17a7a: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 17a7e: 8f 7d andi r24, 0xDF ; 223 17a80: f9 cf rjmp .-14 ; 0x17a74 17a82: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 17a86: 87 7f andi r24, 0xF7 ; 247 17a88: f5 cf rjmp .-22 ; 0x17a74 17a8a: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 17a8e: 8f 77 andi r24, 0x7F ; 127 17a90: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 17a94: 08 95 ret 17a96: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 17a9a: 8f 7d andi r24, 0xDF ; 223 17a9c: f9 cf rjmp .-14 ; 0x17a90 17a9e: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 17aa2: 87 7f andi r24, 0xF7 ; 247 17aa4: f5 cf rjmp .-22 ; 0x17a90 00017aa6 : 17aa6: 83 b1 in r24, 0x03 ; 3 17aa8: 82 95 swap r24 17aaa: 81 70 andi r24, 0x01 ; 1 17aac: 08 95 ret 00017aae : } #else //SM4_ACCEL_TEST uint16_t xyzcal_calc_delay(uint16_t, uint16_t) { return xyzcal_sm4_delay; } 17aae: 80 91 ef 03 lds r24, 0x03EF ; 0x8003ef 17ab2: 90 91 f0 03 lds r25, 0x03F0 ; 0x8003f0 17ab6: 08 95 ret 00017ab8 : } uint8_t xyzcal_dm = 0; void xyzcal_update_pos(uint16_t dx, uint16_t dy, uint16_t dz, uint16_t) { 17ab8: cf 92 push r12 17aba: df 92 push r13 17abc: ef 92 push r14 17abe: ff 92 push r15 // DBG(_n("xyzcal_update_pos dx=%d dy=%d dz=%d dir=%02x\n"), dx, dy, dz, xyzcal_dm); if (xyzcal_dm&1) count_position[0] -= dx; else count_position[0] += dx; 17ac0: 20 91 f1 03 lds r18, 0x03F1 ; 0x8003f1 17ac4: b0 e0 ldi r27, 0x00 ; 0 17ac6: a0 e0 ldi r26, 0x00 ; 0 17ac8: c0 90 4c 06 lds r12, 0x064C ; 0x80064c 17acc: d0 90 4d 06 lds r13, 0x064D ; 0x80064d 17ad0: e0 90 4e 06 lds r14, 0x064E ; 0x80064e 17ad4: f0 90 4f 06 lds r15, 0x064F ; 0x80064f 17ad8: 20 ff sbrs r18, 0 17ada: 42 c0 rjmp .+132 ; 0x17b60 17adc: c8 1a sub r12, r24 17ade: d9 0a sbc r13, r25 17ae0: ea 0a sbc r14, r26 17ae2: fb 0a sbc r15, r27 17ae4: c0 92 4c 06 sts 0x064C, r12 ; 0x80064c 17ae8: d0 92 4d 06 sts 0x064D, r13 ; 0x80064d 17aec: e0 92 4e 06 sts 0x064E, r14 ; 0x80064e 17af0: f0 92 4f 06 sts 0x064F, r15 ; 0x80064f 17af4: cb 01 movw r24, r22 17af6: b0 e0 ldi r27, 0x00 ; 0 17af8: a0 e0 ldi r26, 0x00 ; 0 if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy; 17afa: c0 90 50 06 lds r12, 0x0650 ; 0x800650 17afe: d0 90 51 06 lds r13, 0x0651 ; 0x800651 17b02: e0 90 52 06 lds r14, 0x0652 ; 0x800652 17b06: f0 90 53 06 lds r15, 0x0653 ; 0x800653 17b0a: 21 ff sbrs r18, 1 17b0c: 36 c0 rjmp .+108 ; 0x17b7a 17b0e: c8 1a sub r12, r24 17b10: d9 0a sbc r13, r25 17b12: ea 0a sbc r14, r26 17b14: fb 0a sbc r15, r27 17b16: c0 92 50 06 sts 0x0650, r12 ; 0x800650 17b1a: d0 92 51 06 sts 0x0651, r13 ; 0x800651 17b1e: e0 92 52 06 sts 0x0652, r14 ; 0x800652 17b22: f0 92 53 06 sts 0x0653, r15 ; 0x800653 17b26: 70 e0 ldi r23, 0x00 ; 0 17b28: 60 e0 ldi r22, 0x00 ; 0 if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz; 17b2a: 80 91 54 06 lds r24, 0x0654 ; 0x800654 17b2e: 90 91 55 06 lds r25, 0x0655 ; 0x800655 17b32: a0 91 56 06 lds r26, 0x0656 ; 0x800656 17b36: b0 91 57 06 lds r27, 0x0657 ; 0x800657 17b3a: 22 ff sbrs r18, 2 17b3c: 2b c0 rjmp .+86 ; 0x17b94 17b3e: 84 1b sub r24, r20 17b40: 95 0b sbc r25, r21 17b42: a6 0b sbc r26, r22 17b44: b7 0b sbc r27, r23 17b46: 80 93 54 06 sts 0x0654, r24 ; 0x800654 17b4a: 90 93 55 06 sts 0x0655, r25 ; 0x800655 17b4e: a0 93 56 06 sts 0x0656, r26 ; 0x800656 17b52: b0 93 57 06 sts 0x0657, r27 ; 0x800657 // DBG(_n(" after xyzcal_update_pos x=%ld y=%ld z=%ld\n"), count_position[0], count_position[1], count_position[2]); } 17b56: ff 90 pop r15 17b58: ef 90 pop r14 17b5a: df 90 pop r13 17b5c: cf 90 pop r12 17b5e: 08 95 ret uint8_t xyzcal_dm = 0; void xyzcal_update_pos(uint16_t dx, uint16_t dy, uint16_t dz, uint16_t) { // DBG(_n("xyzcal_update_pos dx=%d dy=%d dz=%d dir=%02x\n"), dx, dy, dz, xyzcal_dm); if (xyzcal_dm&1) count_position[0] -= dx; else count_position[0] += dx; 17b60: 8c 0d add r24, r12 17b62: 9d 1d adc r25, r13 17b64: ae 1d adc r26, r14 17b66: bf 1d adc r27, r15 17b68: 80 93 4c 06 sts 0x064C, r24 ; 0x80064c 17b6c: 90 93 4d 06 sts 0x064D, r25 ; 0x80064d 17b70: a0 93 4e 06 sts 0x064E, r26 ; 0x80064e 17b74: b0 93 4f 06 sts 0x064F, r27 ; 0x80064f 17b78: bd cf rjmp .-134 ; 0x17af4 if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy; 17b7a: 8c 0d add r24, r12 17b7c: 9d 1d adc r25, r13 17b7e: ae 1d adc r26, r14 17b80: bf 1d adc r27, r15 17b82: 80 93 50 06 sts 0x0650, r24 ; 0x800650 17b86: 90 93 51 06 sts 0x0651, r25 ; 0x800651 17b8a: a0 93 52 06 sts 0x0652, r26 ; 0x800652 17b8e: b0 93 53 06 sts 0x0653, r27 ; 0x800653 17b92: c9 cf rjmp .-110 ; 0x17b26 if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz; 17b94: 84 0f add r24, r20 17b96: 95 1f adc r25, r21 17b98: a6 1f adc r26, r22 17b9a: b7 1f adc r27, r23 17b9c: d4 cf rjmp .-88 ; 0x17b46 00017b9e : inline bool is_digit(char c) { return c >= '0' && c <= '9'; } char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){ 17b9e: fb 01 movw r30, r22 *v = 0; 17ba0: 11 82 std Z+1, r1 ; 0x01 17ba2: 10 82 st Z, r1 while(is_digit(*str)){ *v *= 10; 17ba4: 6a e0 ldi r22, 0x0A ; 10 return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r'; } inline bool is_digit(char c) { return c >= '0' && c <= '9'; 17ba6: dc 01 movw r26, r24 17ba8: 2c 91 ld r18, X 17baa: 20 53 subi r18, 0x30 ; 48 } char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){ *v = 0; while(is_digit(*str)){ 17bac: 2a 30 cpi r18, 0x0A ; 10 17bae: a0 f4 brcc .+40 ; 0x17bd8 *v *= 10; 17bb0: 40 81 ld r20, Z 17bb2: 51 81 ldd r21, Z+1 ; 0x01 17bb4: 64 9f mul r22, r20 17bb6: 90 01 movw r18, r0 17bb8: 65 9f mul r22, r21 17bba: 30 0d add r19, r0 17bbc: 11 24 eor r1, r1 17bbe: 31 83 std Z+1, r19 ; 0x01 17bc0: 20 83 st Z, r18 *v += *str - '0'; 17bc2: 4d 91 ld r20, X+ 17bc4: cd 01 movw r24, r26 17bc6: 20 53 subi r18, 0x30 ; 48 17bc8: 31 09 sbc r19, r1 17bca: 24 0f add r18, r20 17bcc: 31 1d adc r19, r1 17bce: 47 fd sbrc r20, 7 17bd0: 3a 95 dec r19 17bd2: 31 83 std Z+1, r19 ; 0x01 17bd4: 20 83 st Z, r18 17bd6: e7 cf rjmp .-50 ; 0x17ba6 ++str; } return str; } 17bd8: 08 95 ret 00017bda : case ClNozzleDiameter::_Diameter_800: MENU_ITEM_TOGGLE_P(_T(MSG_NOZZLE_DIAMETER), PSTR("0.80"), lcd_nozzle_diameter_cycle); break;\ }\ }\ while (0) static void lcd_check_update_RAM(ClCheckMode * oCheckSetting) { 17bda: fc 01 movw r30, r24 switch(*oCheckSetting) { 17bdc: 80 81 ld r24, Z 17bde: 88 23 and r24, r24 17be0: 21 f0 breq .+8 ; 0x17bea 17be2: 81 30 cpi r24, 0x01 ; 1 17be4: 29 f4 brne .+10 ; 0x17bf0 case ClCheckMode::_None: *oCheckSetting = ClCheckMode::_Warn; break; case ClCheckMode::_Warn: *oCheckSetting = ClCheckMode::_Strict; 17be6: 82 e0 ldi r24, 0x02 ; 2 17be8: 01 c0 rjmp .+2 ; 0x17bec while (0) static void lcd_check_update_RAM(ClCheckMode * oCheckSetting) { switch(*oCheckSetting) { case ClCheckMode::_None: *oCheckSetting = ClCheckMode::_Warn; 17bea: 81 e0 ldi r24, 0x01 ; 1 break; case ClCheckMode::_Warn: *oCheckSetting = ClCheckMode::_Strict; 17bec: 80 83 st Z, r24 17bee: 08 95 ret break; case ClCheckMode::_Strict: *oCheckSetting = ClCheckMode::_None; 17bf0: 10 82 st Z, r1 break; default: *oCheckSetting = ClCheckMode::_None; } } 17bf2: 08 95 ret 00017bf4 : #endif // TMC2130 static inline bool pgm_is_whitespace(const char *c_addr) { const char c = pgm_read_byte(c_addr); 17bf4: fc 01 movw r30, r24 17bf6: 94 91 lpm r25, Z return c == ' ' || c == '\t' || c == '\r' || c == '\n'; 17bf8: 90 32 cpi r25, 0x20 ; 32 17bfa: 49 f0 breq .+18 ; 0x17c0e 17bfc: 87 ef ldi r24, 0xF7 ; 247 17bfe: 89 0f add r24, r25 17c00: 82 30 cpi r24, 0x02 ; 2 17c02: 28 f0 brcs .+10 ; 0x17c0e 17c04: 81 e0 ldi r24, 0x01 ; 1 17c06: 9d 30 cpi r25, 0x0D ; 13 17c08: 19 f0 breq .+6 ; 0x17c10 17c0a: 80 e0 ldi r24, 0x00 ; 0 17c0c: 08 95 ret 17c0e: 81 e0 ldi r24, 0x01 ; 1 } 17c10: 08 95 ret 00017c12 : planner_synchronize(); Disable_E0(); } void MMU2::execute_load_to_nozzle_sequence() { 17c12: cf 93 push r28 17c14: df 93 push r29 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 17c16: 0f 94 fb 1a call 0x235f6 ; 0x235f6 float planner_get_current_position_E() { return current_position[E_AXIS]; } void planner_set_current_position_E(float e) { current_position[E_AXIS] = e; 17c1a: c1 e6 ldi r28, 0x61 ; 97 17c1c: d2 e1 ldi r29, 0x12 ; 18 planner_synchronize(); // Compensate for configurable Extra Loading Distance planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION)); 17c1e: 60 91 de 12 lds r22, 0x12DE ; 0x8012de 17c22: 70 e0 ldi r23, 0x00 ; 0 17c24: 90 e0 ldi r25, 0x00 ; 0 17c26: 80 e0 ldi r24, 0x00 ; 0 17c28: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 17c2c: 20 e0 ldi r18, 0x00 ; 0 17c2e: 30 e0 ldi r19, 0x00 ; 0 17c30: 40 e8 ldi r20, 0x80 ; 128 17c32: 51 e4 ldi r21, 0x41 ; 65 17c34: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 17c38: 9b 01 movw r18, r22 17c3a: ac 01 movw r20, r24 17c3c: 6c 85 ldd r22, Y+12 ; 0x0c 17c3e: 7d 85 ldd r23, Y+13 ; 0x0d 17c40: 8e 85 ldd r24, Y+14 ; 0x0e 17c42: 9f 85 ldd r25, Y+15 ; 0x0f 17c44: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 17c48: 6c 87 std Y+12, r22 ; 0x0c 17c4a: 7d 87 std Y+13, r23 ; 0x0d 17c4c: 8e 87 std Y+14, r24 ; 0x0e 17c4e: 9f 87 std Y+15, r25 ; 0x0f execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0])); 17c50: 62 e0 ldi r22, 0x02 ; 2 17c52: 80 e9 ldi r24, 0x90 ; 144 17c54: 97 e8 ldi r25, 0x87 ; 135 } 17c56: df 91 pop r29 17c58: cf 91 pop r28 void MMU2::execute_load_to_nozzle_sequence() { planner_synchronize(); // Compensate for configurable Extra Loading Distance planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION)); execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0])); 17c5a: 0d 94 7d 79 jmp 0x2f2fa ; 0x2f2fa 00017c5e : } } menu_item++; } void __attribute__((noinline)) menu_item_function_E(const Sheet &sheet, menu_func_t func) 17c5e: df 92 push r13 17c60: ef 92 push r14 17c62: ff 92 push r15 17c64: 0f 93 push r16 17c66: 1f 93 push r17 17c68: cf 93 push r28 17c6a: df 93 push r29 17c6c: cd b7 in r28, 0x3d ; 61 17c6e: de b7 in r29, 0x3e ; 62 17c70: 63 97 sbiw r28, 0x13 ; 19 17c72: 0f b6 in r0, 0x3f ; 63 17c74: f8 94 cli 17c76: de bf out 0x3e, r29 ; 62 17c78: 0f be out 0x3f, r0 ; 63 17c7a: cd bf out 0x3d, r28 ; 61 { if (menu_item == menu_line) 17c7c: 30 91 63 04 lds r19, 0x0463 ; 0x800463 17c80: 20 91 62 04 lds r18, 0x0462 ; 0x800462 17c84: 32 13 cpse r19, r18 17c86: 73 c0 rjmp .+230 ; 0x17d6e 17c88: 7c 01 movw r14, r24 { if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet); 17c8a: 80 91 59 02 lds r24, 0x0259 ; 0x800259 17c8e: 88 23 and r24, r24 17c90: 09 f4 brne .+2 ; 0x17c94 17c92: 45 c0 rjmp .+138 ; 0x17d1e //! //! @param[in] sheet_E Sheet in EEPROM //! @param[out] buffer for formatted output void menu_format_sheet_select_E(const Sheet &sheet_E, SheetFormatBuffer &buffer) { uint_least8_t index = sprintf_P(buffer.c,PSTR("%-9.9S["), _T(MSG_SHEET)); 17c94: 88 e7 ldi r24, 0x78 ; 120 17c96: 9e e4 ldi r25, 0x4E ; 78 17c98: 0e 94 3a 75 call 0xea74 ; 0xea74 17c9c: 9f 93 push r25 17c9e: 8f 93 push r24 17ca0: 82 e8 ldi r24, 0x82 ; 130 17ca2: 97 e8 ldi r25, 0x87 ; 135 17ca4: 9f 93 push r25 17ca6: 8f 93 push r24 17ca8: 8e 01 movw r16, r28 17caa: 0f 5f subi r16, 0xFF ; 255 17cac: 1f 4f sbci r17, 0xFF ; 255 17cae: 1f 93 push r17 17cb0: 0f 93 push r16 17cb2: 0f 94 f7 a2 call 0x345ee ; 0x345ee 17cb6: d8 2e mov r13, r24 eeprom_read_block(&(buffer.c[index]), sheet_E.name, sizeof(sheet_E.name)/sizeof(sheet_E.name[0])); 17cb8: 47 e0 ldi r20, 0x07 ; 7 17cba: 50 e0 ldi r21, 0x00 ; 0 17cbc: b7 01 movw r22, r14 17cbe: 80 0f add r24, r16 17cc0: 91 2f mov r25, r17 17cc2: 91 1d adc r25, r1 17cc4: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 17cc8: 0f 90 pop r0 17cca: 0f 90 pop r0 17ccc: 0f 90 pop r0 17cce: 0f 90 pop r0 17cd0: 0f 90 pop r0 17cd2: 0f 90 pop r0 17cd4: 20 e0 ldi r18, 0x00 ; 0 17cd6: 82 2f mov r24, r18 17cd8: 8d 0d add r24, r13 17cda: 90 e0 ldi r25, 0x00 ; 0 for (const uint_least8_t start = index; static_cast(index - start) < sizeof(sheet_E.name)/sizeof(sheet_E.name[0]); ++index) 17cdc: 27 30 cpi r18, 0x07 ; 7 17cde: 39 f0 breq .+14 ; 0x17cee 17ce0: 2f 5f subi r18, 0xFF ; 255 { if (buffer.c[index] == '\0') break; 17ce2: f8 01 movw r30, r16 17ce4: e8 0f add r30, r24 17ce6: f9 1f adc r31, r25 17ce8: 30 81 ld r19, Z 17cea: 31 11 cpse r19, r1 17cec: f4 cf rjmp .-24 ; 0x17cd6 } buffer.c[index] = ']'; 17cee: f8 01 movw r30, r16 17cf0: e8 0f add r30, r24 17cf2: f9 1f adc r31, r25 17cf4: 2d e5 ldi r18, 0x5D ; 93 17cf6: 20 83 st Z, r18 buffer.c[index + 1] = '\0'; 17cf8: 8c 0f add r24, r28 17cfa: 9d 1f adc r25, r29 17cfc: fc 01 movw r30, r24 17cfe: 12 82 std Z+2, r1 ; 0x02 static void menu_draw_item_select_sheet_E(char type_char, const Sheet &sheet) { SheetFormatBuffer buffer; menu_format_sheet_select_E(sheet, buffer); lcd_putc_at(0, menu_row, menu_selection_mark()); 17d00: 0e 94 66 62 call 0xc4cc ; 0xc4cc 17d04: 48 2f mov r20, r24 17d06: 60 91 60 04 lds r22, 0x0460 ; 0x800460 17d0a: 80 e0 ldi r24, 0x00 ; 0 17d0c: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_print_pad(buffer.c, LCD_WIDTH - 2); 17d10: 62 e1 ldi r22, 0x12 ; 18 17d12: c8 01 movw r24, r16 17d14: 0e 94 47 73 call 0xe68e ; 0xe68e lcd_putc(type_char); 17d18: 80 e2 ldi r24, 0x20 ; 32 17d1a: 0e 94 21 6f call 0xde42 ; 0xde42 void __attribute__((noinline)) menu_item_function_E(const Sheet &sheet, menu_func_t func) { if (menu_item == menu_line) { if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet); if (menu_clicked && (lcd_encoder == menu_item)) 17d1e: 80 91 61 04 lds r24, 0x0461 ; 0x800461 17d22: 88 23 and r24, r24 17d24: 21 f1 breq .+72 ; 0x17d6e 17d26: 20 91 63 04 lds r18, 0x0463 ; 0x800463 17d2a: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 17d2e: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 17d32: 28 17 cp r18, r24 17d34: 19 06 cpc r1, r25 17d36: d9 f4 brne .+54 ; 0x17d6e { lcd_update_enabled = 0; 17d38: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a if (func) func(); 17d3c: 8a ea ldi r24, 0xAA ; 170 17d3e: 98 e7 ldi r25, 0x78 ; 120 17d40: 89 2b or r24, r25 17d42: 11 f0 breq .+4 ; 0x17d48 17d44: 0e 94 aa 78 call 0xf154 ; 0xf154 lcd_update_enabled = 1; 17d48: 81 e0 ldi r24, 0x01 ; 1 17d4a: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a menu_item_ret(); 17d4e: 0e 94 73 62 call 0xc4e6 ; 0xc4e6 return; } } menu_item++; } 17d52: 63 96 adiw r28, 0x13 ; 19 17d54: 0f b6 in r0, 0x3f ; 63 17d56: f8 94 cli 17d58: de bf out 0x3e, r29 ; 62 17d5a: 0f be out 0x3f, r0 ; 63 17d5c: cd bf out 0x3d, r28 ; 61 17d5e: df 91 pop r29 17d60: cf 91 pop r28 17d62: 1f 91 pop r17 17d64: 0f 91 pop r16 17d66: ff 90 pop r15 17d68: ef 90 pop r14 17d6a: df 90 pop r13 17d6c: 08 95 ret lcd_update_enabled = 1; menu_item_ret(); return; } } menu_item++; 17d6e: 80 91 63 04 lds r24, 0x0463 ; 0x800463 17d72: 8f 5f subi r24, 0xFF ; 255 17d74: 80 93 63 04 sts 0x0463, r24 ; 0x800463 17d78: ec cf rjmp .-40 ; 0x17d52 00017d7a : } //! @brief Send host action "start" void lcd_send_action_start() { SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_START); 17d7a: 89 eb ldi r24, 0xB9 ; 185 17d7c: 98 e6 ldi r25, 0x68 ; 104 17d7e: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_return_to_status(); 17d82: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00017d86 : //! Sends the printer state for next print via LCD menu to host //! The host has to set the printer ready state with `M72` to keep printer in sync with the host //! @endcode static void lcd_printer_ready_state_toggle() { if (GetPrinterState() == PrinterState::IsReady) { 17d86: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 17d8a: 81 30 cpi r24, 0x01 ; 1 17d8c: 21 f4 brne .+8 ; 0x17d96 SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_NOT_READY); 17d8e: 8b e6 ldi r24, 0x6B ; 107 17d90: 98 e6 ldi r25, 0x68 ; 104 } else { SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_READY); 17d92: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 17d96: 8c e5 ldi r24, 0x5C ; 92 17d98: 98 e6 ldi r25, 0x68 ; 104 17d9a: fb cf rjmp .-10 ; 0x17d92 00017d9c : #endif // TMC2130 #ifdef FILAMENT_SENSOR static void fsensor_reinit() { fsensor.init(); 17d9c: 0d 94 dc 6d jmp 0x2dbb8 ; 0x2dbb8 00017da0 : return (_progress >= _progress_scale * 2) ? 0 : _progress; } static void lcd_selftest_screen_step(const uint8_t _row, const uint8_t _col, const uint8_t _state, const char *_name_PROGMEM, const char _indicator) { 17da0: 0f 93 push r16 17da2: 1f 93 push r17 17da4: cf 93 push r28 17da6: df 93 push r29 17da8: 98 2f mov r25, r24 17daa: 86 2f mov r24, r22 17dac: 14 2f mov r17, r20 17dae: e9 01 movw r28, r18 lcd_set_cursor(_col, _row); 17db0: 69 2f mov r22, r25 17db2: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 switch (_state) 17db6: 11 30 cpi r17, 0x01 ; 1 17db8: 21 f0 breq .+8 ; 0x17dc2 17dba: 12 30 cpi r17, 0x02 ; 2 17dbc: 79 f0 breq .+30 ; 0x17ddc lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); 17dbe: ce 01 movw r24, r28 17dc0: 15 c0 rjmp .+42 ; 0x17dec { lcd_set_cursor(_col, _row); switch (_state) { case 1: lcd_puts_P(_name_PROGMEM); 17dc2: ce 01 movw r24, r28 17dc4: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_putc(':'); 17dc8: 8a e3 ldi r24, 0x3A ; 58 17dca: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_putc(_indicator); 17dce: 80 2f mov r24, r16 lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); } } 17dd0: df 91 pop r29 17dd2: cf 91 pop r28 17dd4: 1f 91 pop r17 17dd6: 0f 91 pop r16 switch (_state) { case 1: lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_putc(_indicator); 17dd8: 0c 94 21 6f jmp 0xde42 ; 0xde42 break; case 2: lcd_puts_P(_name_PROGMEM); 17ddc: ce 01 movw r24, r28 17dde: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_putc(':'); 17de2: 8a e3 ldi r24, 0x3A ; 58 17de4: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_puts_P(MSG_OK_CAPS); 17de8: 82 e9 ldi r24, 0x92 ; 146 17dea: 98 e6 ldi r25, 0x68 ; 104 break; default: lcd_puts_P(_name_PROGMEM); } } 17dec: df 91 pop r29 17dee: cf 91 pop r28 17df0: 1f 91 pop r17 17df2: 0f 91 pop r16 lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); 17df4: 0c 94 1d 6f jmp 0xde3a ; 0xde3a 00017df8 : } #endif // not defined TMC2130 static void lcd_print_state(uint8_t state) { switch (state) { 17df8: 81 30 cpi r24, 0x01 ; 1 17dfa: 21 f4 brne .+8 ; 0x17e04 case STATE_ON: lcd_puts_P(_N(" 1")); 17dfc: 88 ea ldi r24, 0xA8 ; 168 17dfe: 97 e6 ldi r25, 0x67 ; 103 break; case STATE_OFF: lcd_puts_P(_N(" 0")); 17e00: 0c 94 1d 6f jmp 0xde3a ; 0xde3a 17e04: 84 ea ldi r24, 0xA4 ; 164 17e06: 97 e6 ldi r25, 0x67 ; 103 17e08: fb cf rjmp .-10 ; 0x17e00 00017e0a : } #endif //PINDA_TEMP_COMP void lcd_heat_bed_on_load_toggle() { uint8_t value = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT); 17e0a: 87 ea ldi r24, 0xA7 ; 167 17e0c: 9c e0 ldi r25, 0x0C ; 12 17e0e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (value > 1) value = 1; 17e12: 61 e0 ldi r22, 0x01 ; 1 #endif //PINDA_TEMP_COMP void lcd_heat_bed_on_load_toggle() { uint8_t value = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT); if (value > 1) 17e14: 82 30 cpi r24, 0x02 ; 2 17e16: 08 f4 brcc .+2 ; 0x17e1a 17e18: 68 27 eor r22, r24 17e1a: 87 ea ldi r24, 0xA7 ; 167 17e1c: 9c e0 ldi r25, 0x0C ; 12 17e1e: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e22 : else mesh_nr = 3; eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr); } static void mbl_probe_nr_toggle() { uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); 17e22: 8a ea ldi r24, 0xAA ; 170 17e24: 9d e0 ldi r25, 0x0D ; 13 17e26: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 switch (mbl_z_probe_nr) { case 1: mbl_z_probe_nr = 3; break; case 3: mbl_z_probe_nr = 5; break; 17e2a: 65 e0 ldi r22, 0x05 ; 5 eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr); } static void mbl_probe_nr_toggle() { uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); switch (mbl_z_probe_nr) { 17e2c: 83 30 cpi r24, 0x03 ; 3 17e2e: 21 f0 breq .+8 ; 0x17e38 case 1: mbl_z_probe_nr = 3; break; case 3: mbl_z_probe_nr = 5; break; case 5: mbl_z_probe_nr = 1; break; 17e30: 61 e0 ldi r22, 0x01 ; 1 eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr); } static void mbl_probe_nr_toggle() { uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); switch (mbl_z_probe_nr) { 17e32: 85 30 cpi r24, 0x05 ; 5 17e34: 09 f0 breq .+2 ; 0x17e38 case 1: mbl_z_probe_nr = 3; break; 17e36: 63 e0 ldi r22, 0x03 ; 3 17e38: 8a ea ldi r24, 0xAA ; 170 17e3a: 9d e0 ldi r25, 0x0D ; 13 17e3c: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e40 : magnet_elimination = !magnet_elimination; eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, (uint8_t)magnet_elimination); } static void mbl_mesh_toggle() { uint8_t mesh_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); 17e40: 8b ea ldi r24, 0xAB ; 171 17e42: 9d e0 ldi r25, 0x0D ; 13 17e44: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if(mesh_nr == 3) mesh_nr = 7; else mesh_nr = 3; 17e48: 63 e0 ldi r22, 0x03 ; 3 eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, (uint8_t)magnet_elimination); } static void mbl_mesh_toggle() { uint8_t mesh_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); if(mesh_nr == 3) mesh_nr = 7; 17e4a: 83 30 cpi r24, 0x03 ; 3 17e4c: 09 f4 brne .+2 ; 0x17e50 17e4e: 67 e0 ldi r22, 0x07 ; 7 17e50: 8b ea ldi r24, 0xAB ; 171 17e52: 9d e0 ldi r25, 0x0D ; 13 17e54: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e58 : #endif //LCD_BL_PIN MENU_END(); } static void mbl_magnets_elimination_toggle() { bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0); 17e58: 8c ea ldi r24, 0xAC ; 172 17e5a: 9d e0 ldi r25, 0x0D ; 13 17e5c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 magnet_elimination = !magnet_elimination; 17e60: 61 e0 ldi r22, 0x01 ; 1 17e62: 81 11 cpse r24, r1 17e64: 60 e0 ldi r22, 0x00 ; 0 17e66: 8c ea ldi r24, 0xAC ; 172 17e68: 9d e0 ldi r25, 0x0D ; 13 17e6a: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e6e : lcd_check_update_RAM(&oCheckVersion); eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_VERSION,(uint8_t)oCheckVersion); } static void lcd_check_filament_set() { lcd_check_update_RAM(&oCheckFilament); 17e6e: 8e ee ldi r24, 0xEE ; 238 17e70: 93 e0 ldi r25, 0x03 ; 3 17e72: 0e 94 ed bd call 0x17bda ; 0x17bda 17e76: 60 91 ee 03 lds r22, 0x03EE ; 0x8003ee 17e7a: 80 e2 ldi r24, 0x20 ; 32 17e7c: 9c e0 ldi r25, 0x0C ; 12 17e7e: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e82 : lcd_check_update_RAM(&oCheckModel); eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_MODEL,(uint8_t)oCheckModel); } static void lcd_check_version_set() { lcd_check_update_RAM(&oCheckVersion); 17e82: 89 ee ldi r24, 0xE9 ; 233 17e84: 93 e0 ldi r25, 0x03 ; 3 17e86: 0e 94 ed bd call 0x17bda ; 0x17bda 17e8a: 60 91 e9 03 lds r22, 0x03E9 ; 0x8003e9 17e8e: 83 ea ldi r24, 0xA3 ; 163 17e90: 9d e0 ldi r25, 0x0D ; 13 17e92: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017e96 : lcd_check_update_RAM(&oCheckMode); eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode); } static void lcd_check_model_set() { lcd_check_update_RAM(&oCheckModel); 17e96: 8a ee ldi r24, 0xEA ; 234 17e98: 93 e0 ldi r25, 0x03 ; 3 17e9a: 0e 94 ed bd call 0x17bda ; 0x17bda 17e9e: 60 91 ea 03 lds r22, 0x03EA ; 0x8003ea 17ea2: 84 ea ldi r24, 0xA4 ; 164 17ea4: 9d e0 ldi r25, 0x0D ; 13 17ea6: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017eaa : *oCheckSetting = ClCheckMode::_None; } } static void lcd_check_mode_set() { lcd_check_update_RAM(&oCheckMode); 17eaa: 8d ee ldi r24, 0xED ; 237 17eac: 93 e0 ldi r25, 0x03 ; 3 17eae: 0e 94 ed bd call 0x17bda ; 0x17bda 17eb2: 60 91 ed 03 lds r22, 0x03ED ; 0x8003ed 17eb6: 88 ea ldi r24, 0xA8 ; 168 17eb8: 9d e0 ldi r25, 0x0D ; 13 17eba: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017ebe : #endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static void lcd_fsensor_actionNA_set(void) { Filament_sensor::SensorActionOnError act = fsensor.getActionOnError(); switch(act) { 17ebe: 80 91 f9 16 lds r24, 0x16F9 ; 0x8016f9 case Filament_sensor::SensorActionOnError::_Continue: act = Filament_sensor::SensorActionOnError::_Pause; break; case Filament_sensor::SensorActionOnError::_Pause: act = Filament_sensor::SensorActionOnError::_Continue; 17ec2: 60 e0 ldi r22, 0x00 ; 0 #endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static void lcd_fsensor_actionNA_set(void) { Filament_sensor::SensorActionOnError act = fsensor.getActionOnError(); switch(act) { 17ec4: 81 11 cpse r24, r1 17ec6: 01 c0 rjmp .+2 ; 0x17eca case Filament_sensor::SensorActionOnError::_Continue: act = Filament_sensor::SensorActionOnError::_Pause; 17ec8: 61 e0 ldi r22, 0x01 ; 1 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED, state); } } void Filament_sensor::setActionOnError(SensorActionOnError state, bool updateEEPROM) { sensorActionOnError = state; 17eca: 60 93 f9 16 sts 0x16F9, r22 ; 0x8016f9 17ece: 87 e4 ldi r24, 0x47 ; 71 17ed0: 9d e0 ldi r25, 0x0D ; 13 17ed2: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017ed6 : static void lcd_fsensor_runout_set() { fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true); } static void lcd_fsensor_autoload_set() { fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true); 17ed6: e1 ef ldi r30, 0xF1 ; 241 17ed8: f6 e1 ldi r31, 0x16 ; 22 17eda: 61 81 ldd r22, Z+1 ; 0x01 17edc: 81 e0 ldi r24, 0x01 ; 1 17ede: 68 27 eor r22, r24 fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 17ee0: 61 83 std Z+1, r22 ; 0x01 17ee2: 87 e0 ldi r24, 0x07 ; 7 17ee4: 9f e0 ldi r25, 0x0F ; 15 17ee6: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017eea : static void lcd_fsensor_enabled_set(void) { fsensor.setEnabled(!fsensor.isEnabled()); } static void lcd_fsensor_runout_set() { fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true); 17eea: e1 ef ldi r30, 0xF1 ; 241 17eec: f6 e1 ldi r31, 0x16 ; 22 17eee: 62 81 ldd r22, Z+2 ; 0x02 17ef0: 81 e0 ldi r24, 0x01 ; 1 17ef2: 68 27 eor r22, r24 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state); } } void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) { runoutEnabled = state; 17ef4: 62 83 std Z+2, r22 ; 0x02 17ef6: 85 ed ldi r24, 0xD5 ; 213 17ef8: 9e e0 ldi r25, 0x0E ; 14 17efa: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017efe : lcd_return_to_status(); } void lcd_toshiba_flash_air_compatibility_toggle() { card.ToshibaFlashAir_enable(! card.ToshibaFlashAir_isEnabled()); 17efe: e8 e4 ldi r30, 0x48 ; 72 17f00: f6 e1 ldi r31, 0x16 ; 22 17f02: 60 81 ld r22, Z 17f04: 81 e0 ldi r24, 0x01 ; 1 17f06: 68 27 eor r22, r24 bool writeStop(); // Toshiba FlashAir support uint8_t readExtMemory(uint8_t mio, uint8_t func, uint32_t addr, uint16_t count, uint8_t* dst); void setFlashAirCompatible(bool flashAirCompatible) { flash_air_compatible_ = flashAirCompatible; } 17f08: 60 83 st Z, r22 17f0a: 8b eb ldi r24, 0xBB ; 187 17f0c: 9f e0 ldi r25, 0x0F ; 15 17f0e: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017f12 : enquecommand_P(PSTR("M45 Z")); lcd_return_to_status(); } void lcd_temp_calibration_set() { bool temp_cal_active = eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE); 17f12: 8f ea ldi r24, 0xAF ; 175 17f14: 9f e0 ldi r25, 0x0F ; 15 17f16: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 temp_cal_active = !temp_cal_active; 17f1a: 61 e0 ldi r22, 0x01 ; 1 17f1c: 81 11 cpse r24, r1 17f1e: 60 e0 ldi r22, 0x00 ; 0 17f20: 8f ea ldi r24, 0xAF ; 175 17f22: 9f e0 ldi r25, 0x0F ; 15 17f24: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00017f28 : eeprom_update_byte_notify((uint8_t*)EEPROM_SOUND_MODE,(uint8_t)eSoundMode); } void Sound_CycleState(void) { switch(eSoundMode) 17f28: 80 91 47 04 lds r24, 0x0447 ; 0x800447 17f2c: 81 30 cpi r24, 0x01 ; 1 17f2e: 71 f0 breq .+28 ; 0x17f4c 17f30: 20 f0 brcs .+8 ; 0x17f3a 17f32: 82 30 cpi r24, 0x02 ; 2 17f34: 69 f4 brne .+26 ; 0x17f50 break; case e_SOUND_MODE_ONCE: eSoundMode=e_SOUND_MODE_SILENT; break; case e_SOUND_MODE_SILENT: eSoundMode=e_SOUND_MODE_BLIND; 17f36: 83 e0 ldi r24, 0x03 ; 3 17f38: 01 c0 rjmp .+2 ; 0x17f3c void Sound_CycleState(void) { switch(eSoundMode) { case e_SOUND_MODE_LOUD: eSoundMode=e_SOUND_MODE_ONCE; 17f3a: 81 e0 ldi r24, 0x01 ; 1 break; case e_SOUND_MODE_ONCE: eSoundMode=e_SOUND_MODE_SILENT; 17f3c: 80 93 47 04 sts 0x0447, r24 ; 0x800447 17f40: 60 91 47 04 lds r22, 0x0447 ; 0x800447 17f44: 87 ed ldi r24, 0xD7 ; 215 17f46: 9e e0 ldi r25, 0x0E ; 14 17f48: 0d 94 04 a4 jmp 0x34808 ; 0x34808 17f4c: 82 e0 ldi r24, 0x02 ; 2 17f4e: f6 cf rjmp .-20 ; 0x17f3c break; case e_SOUND_MODE_SILENT: eSoundMode=e_SOUND_MODE_BLIND; break; case e_SOUND_MODE_BLIND: eSoundMode=e_SOUND_MODE_LOUD; 17f50: 10 92 47 04 sts 0x0447, r1 ; 0x800447 17f54: f5 cf rjmp .-22 ; 0x17f40 00017f56 : } #ifdef SDCARD_SORT_ALPHA static void lcd_sort_type_set() { uint8_t sdSort; sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT); 17f56: 89 e0 ldi r24, 0x09 ; 9 17f58: 9f e0 ldi r25, 0x0F ; 15 17f5a: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 switch (sdSort) { case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; 17f5e: 61 e0 ldi r22, 0x01 ; 1 #ifdef SDCARD_SORT_ALPHA static void lcd_sort_type_set() { uint8_t sdSort; sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT); switch (sdSort) { 17f60: 88 23 and r24, r24 17f62: 21 f0 breq .+8 ; 0x17f6c case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break; 17f64: 62 e0 ldi r22, 0x02 ; 2 #ifdef SDCARD_SORT_ALPHA static void lcd_sort_type_set() { uint8_t sdSort; sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT); switch (sdSort) { 17f66: 81 30 cpi r24, 0x01 ; 1 17f68: 09 f0 breq .+2 ; 0x17f6c case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break; default: sdSort = SD_SORT_TIME; 17f6a: 60 e0 ldi r22, 0x00 ; 0 17f6c: 89 e0 ldi r24, 0x09 ; 9 17f6e: 9f e0 ldi r25, 0x0F ; 15 17f70: 0f 94 04 a4 call 0x34808 ; 0x34808 } eeprom_update_byte_notify((uint8_t*)EEPROM_SD_SORT, sdSort); card.presort_flag = true; 17f74: 81 e0 ldi r24, 0x01 ; 1 17f76: 80 93 26 14 sts 0x1426, r24 ; 0x801426 } 17f7a: 08 95 ret 00017f7c : MENU_ITEM_TOGGLE_P(_T(MSG_SOUND), _T(MSG_SOUND_LOUD), lcd_sound_state_set);\ }\ }\ while (0) static void lcd_nozzle_diameter_cycle(void) { 17f7c: cf 93 push r28 17f7e: df 93 push r29 uint16_t nDiameter; switch(oNozzleDiameter){ 17f80: 80 91 eb 03 lds r24, 0x03EB ; 0x8003eb 17f84: 8c 33 cpi r24, 0x3C ; 60 17f86: e1 f0 breq .+56 ; 0x17fc0 17f88: 80 35 cpi r24, 0x50 ; 80 17f8a: 01 f1 breq .+64 ; 0x17fcc 17f8c: 88 32 cpi r24, 0x28 ; 40 17f8e: 91 f0 breq .+36 ; 0x17fb4 case ClNozzleDiameter::_Diameter_250: oNozzleDiameter=ClNozzleDiameter::_Diameter_400; 17f90: 88 e2 ldi r24, 0x28 ; 40 17f92: 80 93 eb 03 sts 0x03EB, r24 ; 0x8003eb nDiameter=400; 17f96: c0 e9 ldi r28, 0x90 ; 144 17f98: d1 e0 ldi r29, 0x01 ; 1 17f9a: 60 91 eb 03 lds r22, 0x03EB ; 0x8003eb 17f9e: 87 ea ldi r24, 0xA7 ; 167 17fa0: 9d e0 ldi r25, 0x0D ; 13 17fa2: 0f 94 04 a4 call 0x34808 ; 0x34808 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 17fa6: be 01 movw r22, r28 17fa8: 85 ea ldi r24, 0xA5 ; 165 17faa: 9d e0 ldi r25, 0x0D ; 13 oNozzleDiameter=ClNozzleDiameter::_Diameter_400; nDiameter=400; } eeprom_update_byte_notify((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter); eeprom_update_word_notify((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); } 17fac: df 91 pop r29 17fae: cf 91 pop r28 17fb0: 0d 94 22 a4 jmp 0x34844 ; 0x34844 case ClNozzleDiameter::_Diameter_250: oNozzleDiameter=ClNozzleDiameter::_Diameter_400; nDiameter=400; break; case ClNozzleDiameter::_Diameter_400: oNozzleDiameter=ClNozzleDiameter::_Diameter_600; 17fb4: 8c e3 ldi r24, 0x3C ; 60 17fb6: 80 93 eb 03 sts 0x03EB, r24 ; 0x8003eb nDiameter=600; 17fba: c8 e5 ldi r28, 0x58 ; 88 17fbc: d2 e0 ldi r29, 0x02 ; 2 17fbe: ed cf rjmp .-38 ; 0x17f9a break; case ClNozzleDiameter::_Diameter_600: oNozzleDiameter=ClNozzleDiameter::_Diameter_800; 17fc0: 80 e5 ldi r24, 0x50 ; 80 17fc2: 80 93 eb 03 sts 0x03EB, r24 ; 0x8003eb nDiameter=800; 17fc6: c0 e2 ldi r28, 0x20 ; 32 17fc8: d3 e0 ldi r29, 0x03 ; 3 17fca: e7 cf rjmp .-50 ; 0x17f9a break; case ClNozzleDiameter::_Diameter_800: oNozzleDiameter=ClNozzleDiameter::_Diameter_250; 17fcc: 89 e1 ldi r24, 0x19 ; 25 17fce: 80 93 eb 03 sts 0x03EB, r24 ; 0x8003eb nDiameter=250; 17fd2: ca ef ldi r28, 0xFA ; 250 17fd4: d0 e0 ldi r29, 0x00 ; 0 17fd6: e1 cf rjmp .-62 ; 0x17f9a 00017fd8 : } return 0; } bool eeprom_fw_version_older_than_p(const uint16_t (&ver_req)[4]) { 17fd8: 0f 93 push r16 17fda: 1f 93 push r17 17fdc: cf 93 push r28 17fde: df 93 push r29 17fe0: 00 d0 rcall .+0 ; 0x17fe2 17fe2: 00 d0 rcall .+0 ; 0x17fe4 17fe4: 1f 92 push r1 17fe6: 1f 92 push r1 17fe8: cd b7 in r28, 0x3d ; 61 17fea: de b7 in r29, 0x3e ; 62 17fec: 8c 01 movw r16, r24 uint16_t ver_eeprom[4]; ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR); 17fee: 8a e0 ldi r24, 0x0A ; 10 17ff0: 90 e0 ldi r25, 0x00 ; 0 17ff2: 0f 94 ee a3 call 0x347dc ; 0x347dc 17ff6: 9a 83 std Y+2, r25 ; 0x02 17ff8: 89 83 std Y+1, r24 ; 0x01 ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR); 17ffa: 8c e0 ldi r24, 0x0C ; 12 17ffc: 90 e0 ldi r25, 0x00 ; 0 17ffe: 0f 94 ee a3 call 0x347dc ; 0x347dc 18002: 9c 83 std Y+4, r25 ; 0x04 18004: 8b 83 std Y+3, r24 ; 0x03 ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION); 18006: 8e e0 ldi r24, 0x0E ; 14 18008: 90 e0 ldi r25, 0x00 ; 0 1800a: 0f 94 ee a3 call 0x347dc ; 0x347dc 1800e: 9e 83 std Y+6, r25 ; 0x06 18010: 8d 83 std Y+5, r24 ; 0x05 ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR); 18012: 80 e1 ldi r24, 0x10 ; 16 18014: 90 e0 ldi r25, 0x00 ; 0 18016: 0f 94 ee a3 call 0x347dc ; 0x347dc 1801a: 98 87 std Y+8, r25 ; 0x08 1801c: 8f 83 std Y+7, r24 ; 0x07 1801e: c8 01 movw r24, r16 18020: de 01 movw r26, r28 18022: 11 96 adiw r26, 0x01 ; 1 18024: be 01 movw r22, r28 18026: 67 5f subi r22, 0xF7 ; 247 18028: 7f 4f sbci r23, 0xFF ; 255 for (uint8_t i = 0; i < 4; ++i) { uint16_t v = pgm_read_word(&ver_req[i]); 1802a: fc 01 movw r30, r24 1802c: 25 91 lpm r18, Z+ 1802e: 34 91 lpm r19, Z if (v > ver_eeprom[i]) 18030: 4d 91 ld r20, X+ 18032: 5d 91 ld r21, X+ 18034: 42 17 cp r20, r18 18036: 53 07 cpc r21, r19 18038: 48 f0 brcs .+18 ; 0x1804c return true; else if (v < ver_eeprom[i]) 1803a: 24 17 cp r18, r20 1803c: 35 07 cpc r19, r21 1803e: 20 f0 brcs .+8 ; 0x18048 18040: 02 96 adiw r24, 0x02 ; 2 ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR); ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR); ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION); ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR); for (uint8_t i = 0; i < 4; ++i) { 18042: a6 17 cp r26, r22 18044: b7 07 cpc r27, r23 18046: 89 f7 brne .-30 ; 0x1802a return true; else if (v < ver_eeprom[i]) break; } return false; 18048: 80 e0 ldi r24, 0x00 ; 0 1804a: 01 c0 rjmp .+2 ; 0x1804e ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR); for (uint8_t i = 0; i < 4; ++i) { uint16_t v = pgm_read_word(&ver_req[i]); if (v > ver_eeprom[i]) return true; 1804c: 81 e0 ldi r24, 0x01 ; 1 else if (v < ver_eeprom[i]) break; } return false; } 1804e: 28 96 adiw r28, 0x08 ; 8 18050: 0f b6 in r0, 0x3f ; 63 18052: f8 94 cli 18054: de bf out 0x3e, r29 ; 62 18056: 0f be out 0x3f, r0 ; 63 18058: cd bf out 0x3d, r28 ; 61 1805a: df 91 pop r29 1805c: cf 91 pop r28 1805e: 1f 91 pop r17 18060: 0f 91 pop r16 18062: 08 95 ret 00018064 : #endif // MMU_FORCE_STEALTH_MODE } static void mmu_enable_switch() { uint8_t current_state = eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED); 18064: 8c ea ldi r24, 0xAC ; 172 18066: 9c e0 ldi r25, 0x0C ; 12 18068: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (current_state) 1806c: 88 23 and r24, r24 1806e: 99 f0 breq .+38 ; 0x18096 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 18070: 10 92 01 13 sts 0x1301, r1 ; 0x801301 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 18074: 10 92 af 12 sts 0x12AF, r1 ; 0x8012af currentScope = Scope::Stopped; 18078: 10 92 94 12 sts 0x1294, r1 ; 0x801294 eeprom_update_byte_notify(dst++, pgm_read_byte(src++)); } } void eeprom_toggle(uint8_t *__p) { eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); 1807c: 8c ea ldi r24, 0xAC ; 172 1807e: 9c e0 ldi r25, 0x0C ; 12 18080: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 18084: 61 e0 ldi r22, 0x01 ; 1 18086: 81 11 cpse r24, r1 18088: 60 e0 ldi r22, 0x00 ; 0 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); 1808a: 8c ea ldi r24, 0xAC ; 172 1808c: 9c e0 ldi r25, 0x0C ; 12 1808e: 0f 94 28 a4 call 0x34850 ; 0x34850 { MMU2::mmu2.Start(); } eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED); MMU2::mmu2.Status(); 18092: 0d 94 ad 65 jmp 0x2cb5a ; 0x2cb5a { MMU2::mmu2.Stop(); } else { MMU2::mmu2.Start(); 18096: 0f 94 80 95 call 0x32b00 ; 0x32b00 1809a: f0 cf rjmp .-32 ; 0x1807c 0001809c : eeprom_toggle((uint8_t*)EEPROM_MMU_STEALTH); } #endif //MMU_FORCE_STEALTH_MODE static void lcd_silent_mode_set() { switch (SilentModeMenu) { 1809c: 80 91 bb 03 lds r24, 0x03BB ; 0x8003bb 180a0: 88 23 and r24, r24 180a2: 21 f0 breq .+8 ; 0x180ac 180a4: 81 30 cpi r24, 0x01 ; 1 180a6: 69 f4 brne .+26 ; 0x180c2 case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break; case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break; default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed #else case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break; case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break; 180a8: 82 e0 ldi r24, 0x02 ; 2 180aa: 01 c0 rjmp .+2 ; 0x180ae #ifdef TMC2130 case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break; case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break; default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed #else case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break; 180ac: 81 e0 ldi r24, 0x01 ; 1 case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break; 180ae: 80 93 bb 03 sts 0x03BB, r24 ; 0x8003bb if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 180b2: 60 91 bb 03 lds r22, 0x03BB ; 0x8003bb 180b6: 8f ef ldi r24, 0xFF ; 255 180b8: 9f e0 ldi r25, 0x0F ; 15 180ba: 0f 94 04 a4 call 0x34808 ; 0x34808 // We may have missed a stepper timer interrupt due to the time spent in tmc2130_init. // Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); sei(); #else st_current_init(); 180be: 0d 94 84 1a jmp 0x23508 ; 0x23508 case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break; default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed #else case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break; case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break; case SILENT_MODE_AUTO: SilentModeMenu = SILENT_MODE_POWER; break; 180c2: 10 92 bb 03 sts 0x03BB, r1 ; 0x8003bb 180c6: f5 cf rjmp .-22 ; 0x180b2 000180c8 : static void fsensor_reinit() { fsensor.init(); } static void lcd_fsensor_enabled_set(void) { fsensor.setEnabled(!fsensor.isEnabled()); 180c8: 81 e0 ldi r24, 0x01 ; 1 180ca: 90 91 f1 16 lds r25, 0x16F1 ; 0x8016f1 180ce: 91 11 cpse r25, r1 180d0: 80 e0 ldi r24, 0x00 ; 0 180d2: 0c 94 90 77 jmp 0xef20 ; 0xef20 000180d6 : static void lcd_fsensor_autoload_set() { fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true); } #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static void lcd_fsensor_jam_detection_set() { 180d6: 0f 93 push r16 180d8: 1f 93 push r17 180da: cf 93 push r28 fsensor.setJamDetectionEnabled(!fsensor.getJamDetectionEnabled(), true); 180dc: 01 ef ldi r16, 0xF1 ; 241 180de: 16 e1 ldi r17, 0x16 ; 22 180e0: f8 01 movw r30, r16 180e2: c6 85 ldd r28, Z+14 ; 0x0e 180e4: 81 e0 ldi r24, 0x01 ; 1 180e6: c8 27 eor r28, r24 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 180e8: c6 87 std Z+14, r28 ; 0x0e oldPos = pat9125_y; 180ea: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 180ee: 90 91 39 0e lds r25, 0x0E39 ; 0x800e39 180f2: 90 8b std Z+16, r25 ; 0x10 180f4: 87 87 std Z+15, r24 ; 0x0f resetStepCount(); 180f6: 0f 94 8d 6d call 0x2db1a ; 0x2db1a jamErrCnt = 0; 180fa: f8 01 movw r30, r16 180fc: 15 8a std Z+21, r1 ; 0x15 180fe: 6c 2f mov r22, r28 18100: 8d ea ldi r24, 0xAD ; 173 18102: 9c e0 ldi r25, 0x0C ; 12 } 18104: cf 91 pop r28 18106: 1f 91 pop r17 18108: 0f 91 pop r16 1810a: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0001810e : //! | | //! ---------------------- //! @endcode void pid_extruder() { lcd_clear(); 1810e: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_SET_TEMPERATURE)); 18112: 88 e2 ldi r24, 0x28 ; 40 18114: 9b e3 ldi r25, 0x3B ; 59 18116: 0e 94 3a 75 call 0xea74 ; 0xea74 1811a: ac 01 movw r20, r24 1811c: 60 e0 ldi r22, 0x00 ; 0 1811e: 80 e0 ldi r24, 0x00 ; 0 18120: 0e 94 07 70 call 0xe00e ; 0xe00e pid_temp += lcd_encoder; 18124: 80 91 4e 02 lds r24, 0x024E ; 0x80024e 18128: 90 91 4f 02 lds r25, 0x024F ; 0x80024f 1812c: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 18130: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 18134: 82 0f add r24, r18 18136: 93 1f adc r25, r19 if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP; 18138: 82 33 cpi r24, 0x32 ; 50 1813a: 21 e0 ldi r18, 0x01 ; 1 1813c: 92 07 cpc r25, r18 1813e: 50 f1 brcs .+84 ; 0x18194 18140: 81 e3 ldi r24, 0x31 ; 49 18142: 91 e0 ldi r25, 0x01 ; 1 else if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP; 18144: 90 93 4f 02 sts 0x024F, r25 ; 0x80024f 18148: 80 93 4e 02 sts 0x024E, r24 ; 0x80024e lcd_encoder = 0; 1814c: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 18150: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e lcd_set_cursor(1, 2); 18154: 62 e0 ldi r22, 0x02 ; 2 18156: 81 e0 ldi r24, 0x01 ; 1 18158: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%3u"), pid_temp); 1815c: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 18160: 8f 93 push r24 18162: 80 91 4e 02 lds r24, 0x024E ; 0x80024e 18166: 8f 93 push r24 18168: 88 e9 ldi r24, 0x98 ; 152 1816a: 92 e8 ldi r25, 0x82 ; 130 1816c: 9f 93 push r25 1816e: 8f 93 push r24 18170: 0e 94 0b 6f call 0xde16 ; 0xde16 if (lcd_clicked()) { 18174: 0e 94 75 73 call 0xe6ea ; 0xe6ea 18178: 0f 90 pop r0 1817a: 0f 90 pop r0 1817c: 0f 90 pop r0 1817e: 0f 90 pop r0 18180: 88 23 and r24, r24 18182: 71 f0 breq .+28 ; 0x181a0 lcd_commands_type = LcdCommands::PidExtruder; 18184: 83 e0 ldi r24, 0x03 ; 3 18186: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e lcd_return_to_status(); 1818a: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_update(2); 1818e: 82 e0 ldi r24, 0x02 ; 2 18190: 0c 94 f9 6e jmp 0xddf2 ; 0xddf2 { lcd_clear(); lcd_puts_at_P(0, 0, _T(MSG_SET_TEMPERATURE)); pid_temp += lcd_encoder; if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP; else if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP; 18194: 8e 31 cpi r24, 0x1E ; 30 18196: 91 05 cpc r25, r1 18198: a8 f6 brcc .-86 ; 0x18144 1819a: 8e e1 ldi r24, 0x1E ; 30 1819c: 90 e0 ldi r25, 0x00 ; 0 1819e: d2 cf rjmp .-92 ; 0x18144 lcd_commands_type = LcdCommands::PidExtruder; lcd_return_to_status(); lcd_update(2); } } 181a0: 08 95 ret 000181a2 : static void lcd_check_filament_set() { lcd_check_update_RAM(&oCheckFilament); eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_FILAMENT,(uint8_t)oCheckFilament); } static void settings_check_toggle(ClCheckMode * oCheckSetting, const char* msg, void (*func)(void)) { 181a2: 0f 93 push r16 181a4: 1f 93 push r17 181a6: cf 93 push r28 181a8: df 93 push r29 181aa: eb 01 movw r28, r22 181ac: 8a 01 movw r16, r20 switch(*oCheckSetting) { 181ae: 81 30 cpi r24, 0x01 ; 1 181b0: 81 f0 breq .+32 ; 0x181d2 181b2: 82 30 cpi r24, 0x02 ; 2 181b4: 89 f0 breq .+34 ; 0x181d8 case ClCheckMode::_None: MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func); 181b6: 89 e2 ldi r24, 0x29 ; 41 181b8: 9b e4 ldi r25, 0x4B ; 75 break; case ClCheckMode::_Warn: MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func); break; case ClCheckMode::_Strict: MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func); 181ba: 0e 94 3a 75 call 0xea74 ; 0xea74 181be: 22 e0 ldi r18, 0x02 ; 2 181c0: a8 01 movw r20, r16 181c2: bc 01 movw r22, r24 181c4: ce 01 movw r24, r28 break; default: MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func); } } 181c6: df 91 pop r29 181c8: cf 91 pop r28 181ca: 1f 91 pop r17 181cc: 0f 91 pop r16 break; case ClCheckMode::_Warn: MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func); break; case ClCheckMode::_Strict: MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func); 181ce: 0c 94 5e 75 jmp 0xeabc ; 0xeabc switch(*oCheckSetting) { case ClCheckMode::_None: MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func); break; case ClCheckMode::_Warn: MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func); 181d2: 82 e2 ldi r24, 0x22 ; 34 181d4: 9b e4 ldi r25, 0x4B ; 75 181d6: f1 cf rjmp .-30 ; 0x181ba break; case ClCheckMode::_Strict: MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func); 181d8: 89 e1 ldi r24, 0x19 ; 25 181da: 9b e4 ldi r25, 0x4B ; 75 181dc: ee cf rjmp .-36 ; 0x181ba 000181de : eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED); MMU2::mmu2.Status(); } static void SETTINGS_SILENT_MODE() 181de: cf 93 push r28 181e0: df 93 push r29 MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set); } MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), NULL, lcd_crash_mode_info); } #else // TMC2130 switch (eeprom_read_byte((uint8_t *)EEPROM_SILENT)) 181e2: 8f ef ldi r24, 0xFF ; 255 181e4: 9f e0 ldi r25, 0x0F ; 15 181e6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 181ea: 81 30 cpi r24, 0x01 ; 1 181ec: 99 f0 breq .+38 ; 0x18214 181ee: 82 30 cpi r24, 0x02 ; 2 181f0: a1 f0 breq .+40 ; 0x1821a { case SILENT_MODE_POWER: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set); 181f2: 8c e0 ldi r24, 0x0C ; 12 181f4: 9b e4 ldi r25, 0x4B ; 75 break; case SILENT_MODE_SILENT: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set); break; case SILENT_MODE_AUTO: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set); 181f6: 0e 94 3a 75 call 0xea74 ; 0xea74 181fa: ec 01 movw r28, r24 181fc: 85 e0 ldi r24, 0x05 ; 5 181fe: 9b e4 ldi r25, 0x4B ; 75 18200: 0e 94 3a 75 call 0xea74 ; 0xea74 18204: 22 e0 ldi r18, 0x02 ; 2 18206: 4e e4 ldi r20, 0x4E ; 78 18208: 50 ec ldi r21, 0xC0 ; 192 1820a: be 01 movw r22, r28 MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set); break; // (probably) not needed } #endif // TMC2130 } } 1820c: df 91 pop r29 1820e: cf 91 pop r28 break; case SILENT_MODE_SILENT: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set); break; case SILENT_MODE_AUTO: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set); 18210: 0c 94 5e 75 jmp 0xeabc ; 0xeabc { case SILENT_MODE_POWER: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set); break; case SILENT_MODE_SILENT: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set); 18214: 8c ef ldi r24, 0xFC ; 252 18216: 9a e4 ldi r25, 0x4A ; 74 18218: ee cf rjmp .-36 ; 0x181f6 break; case SILENT_MODE_AUTO: MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set); 1821a: 8f ee ldi r24, 0xEF ; 239 1821c: 9a e4 ldi r25, 0x4A ; 74 1821e: eb cf rjmp .-42 ; 0x181f6 00018220 : MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 5, LCD_JUMP_BED_TEMP); #endif MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED); } void SETTINGS_FANS_CHECK() { 18220: cf 93 push r28 18222: df 93 push r29 MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check); 18224: 80 91 40 02 lds r24, 0x0240 ; 0x800240 18228: 88 23 and r24, r24 1822a: 89 f0 breq .+34 ; 0x1824e 1822c: 8a e9 ldi r24, 0x9A ; 154 1822e: 92 e6 ldi r25, 0x62 ; 98 18230: 0e 94 3a 75 call 0xea74 ; 0xea74 18234: ec 01 movw r28, r24 18236: 87 ec ldi r24, 0xC7 ; 199 18238: 94 e4 ldi r25, 0x44 ; 68 1823a: 0e 94 3a 75 call 0xea74 ; 0xea74 1823e: 22 e0 ldi r18, 0x02 ; 2 18240: 46 ea ldi r20, 0xA6 ; 166 18242: 57 e3 ldi r21, 0x37 ; 55 18244: be 01 movw r22, r28 } 18246: df 91 pop r29 18248: cf 91 pop r28 #endif MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED); } void SETTINGS_FANS_CHECK() { MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check); 1824a: 0c 94 5e 75 jmp 0xeabc ; 0xeabc 1824e: 84 e9 ldi r24, 0x94 ; 148 18250: 92 e6 ldi r25, 0x62 ; 98 18252: ee cf rjmp .-36 ; 0x18230 00018254 : } #endif //FILAMENT_SENSOR static void menuitems_MMU_settings_common() { 18254: cf 93 push r28 18256: df 93 push r29 } } bool SpoolJoin::isSpoolJoinEnabled() { if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) { 18258: 86 ed ldi r24, 0xD6 ; 214 1825a: 9e e0 ldi r25, 0x0E ; 14 1825c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 18260: 81 30 cpi r24, 0x01 ; 1 18262: 19 f5 brne .+70 ; 0x182aa MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin); 18264: 8a e9 ldi r24, 0x9A ; 154 18266: 92 e6 ldi r25, 0x62 ; 98 18268: 0e 94 3a 75 call 0xea74 ; 0xea74 1826c: 22 e0 ldi r18, 0x02 ; 2 1826e: 48 ea ldi r20, 0xA8 ; 168 18270: 58 e3 ldi r21, 0x38 ; 56 18272: bc 01 movw r22, r24 18274: 82 ef ldi r24, 0xF2 ; 242 18276: 97 e6 ldi r25, 0x67 ; 103 18278: 0e 94 5e 75 call 0xeabc ; 0xeabc #ifdef MMU_HAS_CUTTER if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED)) 1827c: 8e ec ldi r24, 0xCE ; 206 1827e: 9e e0 ldi r25, 0x0E ; 14 18280: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 18284: 81 30 cpi r24, 0x01 ; 1 18286: a1 f4 brne .+40 ; 0x182b0 { MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ON), lcd_cutter_enabled); 18288: 8a e9 ldi r24, 0x9A ; 154 1828a: 92 e6 ldi r25, 0x62 ; 98 MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled); } #endif else { MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled); 1828c: 0e 94 3a 75 call 0xea74 ; 0xea74 18290: ec 01 movw r28, r24 18292: 8c ea ldi r24, 0xAC ; 172 18294: 94 e4 ldi r25, 0x44 ; 68 18296: 0e 94 3a 75 call 0xea74 ; 0xea74 1829a: 22 e0 ldi r18, 0x02 ; 2 1829c: 42 ec ldi r20, 0xC2 ; 194 1829e: 56 e3 ldi r21, 0x36 ; 54 182a0: be 01 movw r22, r28 #endif // MMU_HAS_CUTTER #ifndef MMU_FORCE_STEALTH_MODE MENU_ITEM_TOGGLE_P(_T(MSG_MMU_MODE), eeprom_read_byte((uint8_t *)EEPROM_MMU_STEALTH) ? _T(MSG_STEALTH) : _T(MSG_NORMAL), lcd_mmu_mode_toggle); #endif // MMU_FORCE_STEALTH_MODE } 182a2: df 91 pop r29 182a4: cf 91 pop r28 MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled); } #endif else { MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled); 182a6: 0c 94 5e 75 jmp 0xeabc ; 0xeabc #endif //FILAMENT_SENSOR static void menuitems_MMU_settings_common() { MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin); 182aa: 84 e9 ldi r24, 0x94 ; 148 182ac: 92 e6 ldi r25, 0x62 ; 98 182ae: dc cf rjmp .-72 ; 0x18268 MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled); } #endif else { MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled); 182b0: 84 e9 ldi r24, 0x94 ; 148 182b2: 92 e6 ldi r25, 0x62 ; 98 182b4: eb cf rjmp .-42 ; 0x1828c 000182b6 : uint8_t experimental_menu_visibility; } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0 || lcd_draw_update) 182b6: 80 91 96 03 lds r24, 0x0396 ; 0x800396 182ba: 88 23 and r24, r24 182bc: 21 f0 breq .+8 ; 0x182c6 182be: 80 91 59 02 lds r24, 0x0259 ; 0x800259 182c2: 88 23 and r24, r24 182c4: 51 f0 breq .+20 ; 0x182da { _md->status = 1; 182c6: 81 e0 ldi r24, 0x01 ; 1 182c8: 80 93 96 03 sts 0x0396, r24 ; 0x800396 _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0); 182cc: 60 e0 ldi r22, 0x00 ; 0 182ce: 8a e2 ldi r24, 0x2A ; 42 182d0: 9d e0 ldi r25, 0x0D ; 13 182d2: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 182d6: 80 93 97 03 sts 0x0397, r24 ; 0x800397 } MENU_BEGIN(); 182da: 0e 94 0c 74 call 0xe818 ; 0xe818 182de: 10 92 60 04 sts 0x0460, r1 ; 0x800460 182e2: 80 91 60 04 lds r24, 0x0460 ; 0x800460 182e6: 84 30 cpi r24, 0x04 ; 4 182e8: 08 f0 brcs .+2 ; 0x182ec 182ea: 90 c0 rjmp .+288 ; 0x1840c 182ec: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch 182f0: 80 91 ec 03 lds r24, 0x03EC ; 0x8003ec 182f4: 81 11 cpse r24, r1 182f6: 55 c0 rjmp .+170 ; 0x183a2 182f8: 88 ee ldi r24, 0xE8 ; 232 182fa: 9a e4 ldi r25, 0x4A ; 74 182fc: 0e 94 3a 75 call 0xea74 ; 0xea74 18300: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu); 18304: 8c ed ldi r24, 0xDC ; 220 18306: 96 e4 ldi r25, 0x46 ; 70 18308: 0e 94 3a 75 call 0xea74 ; 0xea74 1830c: 6a e9 ldi r22, 0x9A ; 154 1830e: 70 ed ldi r23, 0xD0 ; 208 18310: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 SETTINGS_NOZZLE; 18314: 80 91 eb 03 lds r24, 0x03EB ; 0x8003eb 18318: 8c 33 cpi r24, 0x3C ; 60 1831a: 09 f4 brne .+2 ; 0x1831e 1831c: 60 c0 rjmp .+192 ; 0x183de 1831e: 08 f0 brcs .+2 ; 0x18322 18320: 43 c0 rjmp .+134 ; 0x183a8 18322: 89 31 cpi r24, 0x19 ; 25 18324: 09 f4 brne .+2 ; 0x18328 18326: 4f c0 rjmp .+158 ; 0x183c6 18328: 88 32 cpi r24, 0x28 ; 40 1832a: 09 f4 brne .+2 ; 0x1832e 1832c: 42 c0 rjmp .+132 ; 0x183b2 MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change); 1832e: 85 e7 ldi r24, 0x75 ; 117 18330: 95 e4 ldi r25, 0x45 ; 69 18332: 0e 94 3a 75 call 0xea74 ; 0xea74 18336: 6c e4 ldi r22, 0x4C ; 76 18338: 7b ee ldi r23, 0xEB ; 235 1833a: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_SUBMENU_P(_T(MSG_CHECKS), lcd_checking_menu); 1833e: 82 e2 ldi r24, 0x22 ; 34 18340: 95 e4 ldi r25, 0x45 ; 69 18342: 0e 94 3a 75 call 0xea74 ; 0xea74 18346: 6b ed ldi r22, 0xDB ; 219 18348: 73 ec ldi r23, 0xC3 ; 195 1834a: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 //! Fsensor Detection isn't ready for mmu yet it is temporarily disabled. //! @todo Don't forget to remove this as soon Fsensor Detection works with mmu if(!MMU2::mmu2.Enabled()) MENU_ITEM_FUNCTION_P(PSTR("Fsensor Detection"), lcd_detect_IRsensor); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) if (_md->experimental_menu_visibility) 1834e: 80 91 97 03 lds r24, 0x0397 ; 0x800397 18352: 88 23 and r24, r24 18354: 31 f0 breq .+12 ; 0x18362 { MENU_ITEM_SUBMENU_P(PSTR("Experimental"), lcd_experimental_menu);////MSG_MENU_EXPERIMENTAL c=18 18356: 67 e0 ldi r22, 0x07 ; 7 18358: 72 ec ldi r23, 0xC2 ; 194 1835a: 8d e5 ldi r24, 0x5D ; 93 1835c: 93 e8 ldi r25, 0x83 ; 131 1835e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 //! The SuperPINDA is detected when the PINDA temp is below its defined limit. //! This works well on the EINSY board but not on the miniRAMBo board as //! as a disconnected SuperPINDA will show higher temps compared to an EINSY board. //! //! This menu allows the user to en-/disable the SuperPINDA manualy MENU_ITEM_TOGGLE_P(_N("SuperPINDA"), eeprom_read_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION) ? _T(MSG_YES) : _T(MSG_NO), lcd_pinda_temp_compensation_toggle); 18362: 89 e2 ldi r24, 0x29 ; 41 18364: 9d e0 ldi r25, 0x0D ; 13 18366: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1836a: 88 23 and r24, r24 1836c: 09 f4 brne .+2 ; 0x18370 1836e: 4b c0 rjmp .+150 ; 0x18406 18370: 89 e9 ldi r24, 0x99 ; 153 18372: 98 e4 ldi r25, 0x48 ; 72 18374: 0e 94 3a 75 call 0xea74 ; 0xea74 18378: 22 e0 ldi r18, 0x02 ; 2 1837a: 47 e3 ldi r20, 0x37 ; 55 1837c: 58 ec ldi r21, 0xC8 ; 200 1837e: bc 01 movw r22, r24 18380: 85 e0 ldi r24, 0x05 ; 5 18382: 98 e6 ldi r25, 0x68 ; 104 18384: 0e 94 5e 75 call 0xeabc ; 0xeabc #endif //PINDA_TEMP_COMP MENU_END(); 18388: 0e 94 83 62 call 0xc506 ; 0xc506 _md->status = 1; _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0); } MENU_BEGIN(); 1838c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 18390: 8f 5f subi r24, 0xFF ; 255 18392: 80 93 60 04 sts 0x0460, r24 ; 0x800460 18396: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1839a: 8f 5f subi r24, 0xFF ; 255 1839c: 80 93 62 04 sts 0x0462, r24 ; 0x800462 183a0: a0 cf rjmp .-192 ; 0x182e2 MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch 183a2: 8e e8 ldi r24, 0x8E ; 142 183a4: 98 e4 ldi r25, 0x48 ; 72 183a6: aa cf rjmp .-172 ; 0x182fc MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu); SETTINGS_NOZZLE; 183a8: 80 35 cpi r24, 0x50 ; 80 183aa: 19 f1 breq .+70 ; 0x183f2 183ac: 8f 3f cpi r24, 0xFF ; 255 183ae: 09 f0 breq .+2 ; 0x183b2 183b0: be cf rjmp .-132 ; 0x1832e 183b2: 8b e2 ldi r24, 0x2B ; 43 183b4: 95 e4 ldi r25, 0x45 ; 69 183b6: 0e 94 3a 75 call 0xea74 ; 0xea74 183ba: 22 e0 ldi r18, 0x02 ; 2 183bc: 4e eb ldi r20, 0xBE ; 190 183be: 5f eb ldi r21, 0xBF ; 191 183c0: 64 e7 ldi r22, 0x74 ; 116 183c2: 73 e8 ldi r23, 0x83 ; 131 183c4: 09 c0 rjmp .+18 ; 0x183d8 183c6: 8b e2 ldi r24, 0x2B ; 43 183c8: 95 e4 ldi r25, 0x45 ; 69 183ca: 0e 94 3a 75 call 0xea74 ; 0xea74 183ce: 22 e0 ldi r18, 0x02 ; 2 183d0: 4e eb ldi r20, 0xBE ; 190 183d2: 5f eb ldi r21, 0xBF ; 191 183d4: 69 e7 ldi r22, 0x79 ; 121 183d6: 73 e8 ldi r23, 0x83 ; 131 183d8: 0e 94 5e 75 call 0xeabc ; 0xeabc 183dc: a8 cf rjmp .-176 ; 0x1832e 183de: 8b e2 ldi r24, 0x2B ; 43 183e0: 95 e4 ldi r25, 0x45 ; 69 183e2: 0e 94 3a 75 call 0xea74 ; 0xea74 183e6: 22 e0 ldi r18, 0x02 ; 2 183e8: 4e eb ldi r20, 0xBE ; 190 183ea: 5f eb ldi r21, 0xBF ; 191 183ec: 6f e6 ldi r22, 0x6F ; 111 183ee: 73 e8 ldi r23, 0x83 ; 131 183f0: f3 cf rjmp .-26 ; 0x183d8 183f2: 8b e2 ldi r24, 0x2B ; 43 183f4: 95 e4 ldi r25, 0x45 ; 69 183f6: 0e 94 3a 75 call 0xea74 ; 0xea74 183fa: 22 e0 ldi r18, 0x02 ; 2 183fc: 4e eb ldi r20, 0xBE ; 190 183fe: 5f eb ldi r21, 0xBF ; 191 18400: 6a e6 ldi r22, 0x6A ; 106 18402: 73 e8 ldi r23, 0x83 ; 131 18404: e9 cf rjmp .-46 ; 0x183d8 //! The SuperPINDA is detected when the PINDA temp is below its defined limit. //! This works well on the EINSY board but not on the miniRAMBo board as //! as a disconnected SuperPINDA will show higher temps compared to an EINSY board. //! //! This menu allows the user to en-/disable the SuperPINDA manualy MENU_ITEM_TOGGLE_P(_N("SuperPINDA"), eeprom_read_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION) ? _T(MSG_YES) : _T(MSG_NO), lcd_pinda_temp_compensation_toggle); 18406: 8f e9 ldi r24, 0x9F ; 159 18408: 98 e4 ldi r25, 0x48 ; 72 1840a: b4 cf rjmp .-152 ; 0x18374 #endif //PINDA_TEMP_COMP MENU_END(); } 1840c: 08 95 ret 0001840e : } #endif //PRUSA_SN_SUPPORT void lcd_experimental_menu() { MENU_BEGIN(); 1840e: 0e 94 0c 74 call 0xe818 ; 0xe818 18412: 10 92 60 04 sts 0x0460, r1 ; 0x800460 18416: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1841a: 84 30 cpi r24, 0x04 ; 4 1841c: a8 f4 brcc .+42 ; 0x18448 1841e: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_BACK)); 18422: 88 ee ldi r24, 0xE8 ; 232 18424: 9a e4 ldi r25, 0x4A ; 74 18426: 0e 94 3a 75 call 0xea74 ; 0xea74 1842a: 0e 94 ce 72 call 0xe59c ; 0xe59c #endif // DEBUG_PULLUP_CRASH #ifdef PRUSA_SN_SUPPORT MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18 #endif //PRUSA_SN_SUPPORT MENU_END(); 1842e: 0e 94 83 62 call 0xc506 ; 0xc506 } #endif //PRUSA_SN_SUPPORT void lcd_experimental_menu() { MENU_BEGIN(); 18432: 80 91 60 04 lds r24, 0x0460 ; 0x800460 18436: 8f 5f subi r24, 0xFF ; 255 18438: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1843c: 80 91 62 04 lds r24, 0x0462 ; 0x800462 18440: 8f 5f subi r24, 0xFF ; 255 18442: 80 93 62 04 sts 0x0462, r24 ; 0x800462 18446: e7 cf rjmp .-50 ; 0x18416 #ifdef PRUSA_SN_SUPPORT MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18 #endif //PRUSA_SN_SUPPORT MENU_END(); } 18448: 08 95 ret 0001844a : lcd_return_to_status(); } #endif //THERMAL_MODEL void lcd_sdcard_stop() { 1844a: cf 93 push r28 // Show static message lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT)); 1844c: 84 ea ldi r24, 0xA4 ; 164 1844e: 98 e4 ldi r25, 0x48 ; 72 18450: 0e 94 3a 75 call 0xea74 ; 0xea74 18454: ac 01 movw r20, r24 18456: 60 e0 ldi r22, 0x00 ; 0 18458: 80 e0 ldi r24, 0x00 ; 0 1845a: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc_at(0, 1, '\n'); 1845e: 4a e0 ldi r20, 0x0A ; 10 18460: 61 e0 ldi r22, 0x01 ; 1 18462: 80 e0 ldi r24, 0x00 ; 0 18464: 0e 94 13 70 call 0xe026 ; 0xe026 MENU_BEGIN(); 18468: 0e 94 0c 74 call 0xe818 ; 0xe818 1846c: 10 92 60 04 sts 0x0460, r1 ; 0x800460 // Skip first two LCD rows used by static message if(menu_row == 0) menu_row = 2; 18470: c2 e0 ldi r28, 0x02 ; 2 { // Show static message lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT)); lcd_putc_at(0, 1, '\n'); MENU_BEGIN(); 18472: 80 91 60 04 lds r24, 0x0460 ; 0x800460 18476: 84 30 cpi r24, 0x04 ; 4 18478: 18 f5 brcc .+70 ; 0x184c0 1847a: 10 92 63 04 sts 0x0463, r1 ; 0x800463 // Skip first two LCD rows used by static message if(menu_row == 0) menu_row = 2; 1847e: 81 11 cpse r24, r1 18480: 02 c0 rjmp .+4 ; 0x18486 18482: c0 93 60 04 sts 0x0460, r28 ; 0x800460 // Show No options first, the default selection MENU_ITEM_FUNCTION_P(_T(MSG_NO), lcd_return_to_status); 18486: 8f e9 ldi r24, 0x9F ; 159 18488: 98 e4 ldi r25, 0x48 ; 72 1848a: 0e 94 3a 75 call 0xea74 ; 0xea74 1848e: 62 ee ldi r22, 0xE2 ; 226 18490: 77 e3 ldi r23, 0x37 ; 55 18492: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop); 18496: 89 e9 ldi r24, 0x99 ; 153 18498: 98 e4 ldi r25, 0x48 ; 72 1849a: 0e 94 3a 75 call 0xea74 ; 0xea74 1849e: 62 e4 ldi r22, 0x42 ; 66 184a0: 7f ed ldi r23, 0xDF ; 223 184a2: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_END(); 184a6: 0e 94 83 62 call 0xc506 ; 0xc506 { // Show static message lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT)); lcd_putc_at(0, 1, '\n'); MENU_BEGIN(); 184aa: 80 91 60 04 lds r24, 0x0460 ; 0x800460 184ae: 8f 5f subi r24, 0xFF ; 255 184b0: 80 93 60 04 sts 0x0460, r24 ; 0x800460 184b4: 80 91 62 04 lds r24, 0x0462 ; 0x800462 184b8: 8f 5f subi r24, 0xFF ; 255 184ba: 80 93 62 04 sts 0x0462, r24 ; 0x800462 184be: d9 cf rjmp .-78 ; 0x18472 // Show No options first, the default selection MENU_ITEM_FUNCTION_P(_T(MSG_NO), lcd_return_to_status); MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop); MENU_END(); } 184c0: cf 91 pop r28 184c2: 08 95 ret 000184c4 : act = Filament_sensor::SensorActionOnError::_Continue; } fsensor.setActionOnError(act, true); } static void lcd_fsensor_settings_menu() { 184c4: cf 93 push r28 184c6: df 93 push r29 MENU_BEGIN(); 184c8: 0e 94 0c 74 call 0xe818 ; 0xe818 184cc: 10 92 60 04 sts 0x0460, r1 ; 0x800460 184d0: 80 91 60 04 lds r24, 0x0460 ; 0x800460 184d4: 84 30 cpi r24, 0x04 ; 4 184d6: 08 f0 brcs .+2 ; 0x184da 184d8: bd c0 rjmp .+378 ; 0x18654 184da: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_BACK)); 184de: 88 ee ldi r24, 0xE8 ; 232 184e0: 9a e4 ldi r25, 0x4A ; 74 184e2: 0e 94 3a 75 call 0xea74 ; 0xea74 184e6: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set); 184ea: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 184ee: 88 23 and r24, r24 184f0: 09 f4 brne .+2 ; 0x184f4 184f2: 4e c0 rjmp .+156 ; 0x18590 184f4: 8a e9 ldi r24, 0x9A ; 154 184f6: 92 e6 ldi r25, 0x62 ; 98 184f8: 0e 94 3a 75 call 0xea74 ; 0xea74 184fc: ec 01 movw r28, r24 184fe: 84 e3 ldi r24, 0x34 ; 52 18500: 98 e4 ldi r25, 0x48 ; 72 18502: 0e 94 3a 75 call 0xea74 ; 0xea74 18506: 22 e0 ldi r18, 0x02 ; 2 18508: 44 e6 ldi r20, 0x64 ; 100 1850a: 50 ec ldi r21, 0xC0 ; 192 1850c: be 01 movw r22, r28 1850e: 0e 94 5e 75 call 0xeabc ; 0xeabc 18512: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 if (fsensor.isEnabled()) { 18516: 88 23 and r24, r24 18518: 09 f4 brne .+2 ; 0x1851c 1851a: 8c c0 rjmp .+280 ; 0x18634 if (fsensor.isError()) { 1851c: 83 30 cpi r24, 0x03 ; 3 1851e: d9 f5 brne .+118 ; 0x18596 MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), _T(MSG_NA), fsensor_reinit); 18520: 83 e7 ldi r24, 0x73 ; 115 18522: 98 e4 ldi r25, 0x48 ; 72 18524: 0e 94 3a 75 call 0xea74 ; 0xea74 18528: ec 01 movw r28, r24 1852a: 80 ea ldi r24, 0xA0 ; 160 1852c: 94 e4 ldi r25, 0x44 ; 68 1852e: 0e 94 3a 75 call 0xea74 ; 0xea74 18532: 22 e0 ldi r18, 0x02 ; 2 18534: 4e ec ldi r20, 0xCE ; 206 18536: 5e eb ldi r21, 0xBE ; 190 18538: be 01 movw r22, r28 1853a: 0e 94 5e 75 call 0xeabc ; 0xeabc MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_NA), fsensor_reinit); 1853e: 83 e7 ldi r24, 0x73 ; 115 18540: 98 e4 ldi r25, 0x48 ; 72 18542: 0e 94 3a 75 call 0xea74 ; 0xea74 18546: ec 01 movw r28, r24 18548: 82 e9 ldi r24, 0x92 ; 146 1854a: 94 e4 ldi r25, 0x44 ; 68 1854c: 0e 94 3a 75 call 0xea74 ; 0xea74 18550: 22 e0 ldi r18, 0x02 ; 2 18552: 4e ec ldi r20, 0xCE ; 206 18554: 5e eb ldi r21, 0xBE ; 190 18556: be 01 movw r22, r28 18558: 0e 94 5e 75 call 0xeabc ; 0xeabc #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit); 1855c: 83 e7 ldi r24, 0x73 ; 115 1855e: 98 e4 ldi r25, 0x48 ; 72 18560: 0e 94 3a 75 call 0xea74 ; 0xea74 18564: ec 01 movw r28, r24 18566: 82 e8 ldi r24, 0x82 ; 130 18568: 94 e4 ldi r25, 0x44 ; 68 1856a: 0e 94 3a 75 call 0xea74 ; 0xea74 1856e: 22 e0 ldi r18, 0x02 ; 2 18570: 4e ec ldi r20, 0xCE ; 206 18572: 5e eb ldi r21, 0xBE ; 190 } else { MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set); MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set); #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set); 18574: be 01 movw r22, r28 18576: 0e 94 5e 75 call 0xeabc ; 0xeabc #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } switch(fsensor.getActionOnError()) { 1857a: 80 91 f9 16 lds r24, 0x16F9 ; 0x8016f9 1857e: 88 23 and r24, r24 18580: 09 f4 brne .+2 ; 0x18584 18582: 49 c0 rjmp .+146 ; 0x18616 18584: 81 30 cpi r24, 0x01 ; 1 18586: 09 f4 brne .+2 ; 0x1858a 18588: 62 c0 rjmp .+196 ; 0x1864e break; case Filament_sensor::SensorActionOnError::_Pause: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set); break; default: lcd_fsensor_actionNA_set(); 1858a: 0e 94 5f bf call 0x17ebe ; 0x17ebe 1858e: 52 c0 rjmp .+164 ; 0x18634 static void lcd_fsensor_settings_menu() { MENU_BEGIN(); MENU_ITEM_BACK_P(_T(MSG_BACK)); MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set); 18590: 84 e9 ldi r24, 0x94 ; 148 18592: 92 e6 ldi r25, 0x62 ; 98 18594: b1 cf rjmp .-158 ; 0x184f8 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } else { MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set); 18596: 80 91 f3 16 lds r24, 0x16F3 ; 0x8016f3 1859a: 88 23 and r24, r24 1859c: 99 f1 breq .+102 ; 0x18604 1859e: 8a e9 ldi r24, 0x9A ; 154 185a0: 92 e6 ldi r25, 0x62 ; 98 185a2: 0e 94 3a 75 call 0xea74 ; 0xea74 185a6: ec 01 movw r28, r24 185a8: 80 ea ldi r24, 0xA0 ; 160 185aa: 94 e4 ldi r25, 0x44 ; 68 185ac: 0e 94 3a 75 call 0xea74 ; 0xea74 185b0: 22 e0 ldi r18, 0x02 ; 2 185b2: 45 e7 ldi r20, 0x75 ; 117 185b4: 5f eb ldi r21, 0xBF ; 191 185b6: be 01 movw r22, r28 185b8: 0e 94 5e 75 call 0xeabc ; 0xeabc MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set); 185bc: 80 91 f2 16 lds r24, 0x16F2 ; 0x8016f2 185c0: 88 23 and r24, r24 185c2: 19 f1 breq .+70 ; 0x1860a 185c4: 8a e9 ldi r24, 0x9A ; 154 185c6: 92 e6 ldi r25, 0x62 ; 98 185c8: 0e 94 3a 75 call 0xea74 ; 0xea74 185cc: ec 01 movw r28, r24 185ce: 82 e9 ldi r24, 0x92 ; 146 185d0: 94 e4 ldi r25, 0x44 ; 68 185d2: 0e 94 3a 75 call 0xea74 ; 0xea74 185d6: 22 e0 ldi r18, 0x02 ; 2 185d8: 4b e6 ldi r20, 0x6B ; 107 185da: 5f eb ldi r21, 0xBF ; 191 185dc: be 01 movw r22, r28 185de: 0e 94 5e 75 call 0xeabc ; 0xeabc #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set); 185e2: 80 91 ff 16 lds r24, 0x16FF ; 0x8016ff 185e6: 88 23 and r24, r24 185e8: 99 f0 breq .+38 ; 0x18610 185ea: 8a e9 ldi r24, 0x9A ; 154 185ec: 92 e6 ldi r25, 0x62 ; 98 185ee: 0e 94 3a 75 call 0xea74 ; 0xea74 185f2: ec 01 movw r28, r24 185f4: 82 e8 ldi r24, 0x82 ; 130 185f6: 94 e4 ldi r25, 0x44 ; 68 185f8: 0e 94 3a 75 call 0xea74 ; 0xea74 185fc: 22 e0 ldi r18, 0x02 ; 2 185fe: 4b e6 ldi r20, 0x6B ; 107 18600: 50 ec ldi r21, 0xC0 ; 192 18602: b8 cf rjmp .-144 ; 0x18574 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } else { MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set); 18604: 84 e9 ldi r24, 0x94 ; 148 18606: 92 e6 ldi r25, 0x62 ; 98 18608: cc cf rjmp .-104 ; 0x185a2 MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set); 1860a: 84 e9 ldi r24, 0x94 ; 148 1860c: 92 e6 ldi r25, 0x62 ; 98 1860e: dc cf rjmp .-72 ; 0x185c8 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set); 18610: 84 e9 ldi r24, 0x94 ; 148 18612: 92 e6 ldi r25, 0x62 ; 98 18614: ec cf rjmp .-40 ; 0x185ee #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } switch(fsensor.getActionOnError()) { case Filament_sensor::SensorActionOnError::_Continue: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set); 18616: 8a e7 ldi r24, 0x7A ; 122 18618: 94 e4 ldi r25, 0x44 ; 68 break; case Filament_sensor::SensorActionOnError::_Pause: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set); 1861a: 0e 94 3a 75 call 0xea74 ; 0xea74 1861e: ec 01 movw r28, r24 18620: 8e e6 ldi r24, 0x6E ; 110 18622: 94 e4 ldi r25, 0x44 ; 68 18624: 0e 94 3a 75 call 0xea74 ; 0xea74 18628: 22 e0 ldi r18, 0x02 ; 2 1862a: 4f e5 ldi r20, 0x5F ; 95 1862c: 5f eb ldi r21, 0xBF ; 191 1862e: be 01 movw r22, r28 18630: 0e 94 5e 75 call 0xeabc ; 0xeabc default: lcd_fsensor_actionNA_set(); } } MENU_END(); 18634: 0e 94 83 62 call 0xc506 ; 0xc506 } fsensor.setActionOnError(act, true); } static void lcd_fsensor_settings_menu() { MENU_BEGIN(); 18638: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1863c: 8f 5f subi r24, 0xFF ; 255 1863e: 80 93 60 04 sts 0x0460, r24 ; 0x800460 18642: 80 91 62 04 lds r24, 0x0462 ; 0x800462 18646: 8f 5f subi r24, 0xFF ; 255 18648: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1864c: 41 cf rjmp .-382 ; 0x184d0 switch(fsensor.getActionOnError()) { case Filament_sensor::SensorActionOnError::_Continue: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set); break; case Filament_sensor::SensorActionOnError::_Pause: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set); 1864e: 86 e6 ldi r24, 0x66 ; 102 18650: 94 e4 ldi r25, 0x44 ; 68 18652: e3 cf rjmp .-58 ; 0x1861a lcd_fsensor_actionNA_set(); } } MENU_END(); } 18654: df 91 pop r29 18656: cf 91 pop r28 18658: 08 95 ret 0001865a : lcd_first_layer_calibration_reset(); } static void lcd_sheet_menu() { MENU_BEGIN(); 1865a: 0e 94 0c 74 call 0xe818 ; 0xe818 1865e: 10 92 60 04 sts 0x0460, r1 ; 0x800460 18662: 80 91 60 04 lds r24, 0x0460 ; 0x800460 18666: 84 30 cpi r24, 0x04 ; 4 18668: 08 f0 brcs .+2 ; 0x1866c 1866a: 3f c0 rjmp .+126 ; 0x186ea 1866c: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_STEEL_SHEETS)); 18670: 8c ed ldi r24, 0xDC ; 220 18672: 96 e4 ldi r25, 0x46 ; 70 18674: 0e 94 3a 75 call 0xea74 ; 0xea74 18678: 0e 94 ce 72 call 0xe59c ; 0xe59c if(eeprom_is_sheet_initialized(selected_sheet)){ 1867c: 80 91 ca 03 lds r24, 0x03CA ; 0x8003ca 18680: 0e 94 88 78 call 0xf110 ; 0xf110 18684: 88 23 and r24, r24 18686: 41 f0 breq .+16 ; 0x18698 MENU_ITEM_SUBMENU_P(_T(MSG_SELECT), change_sheet); 18688: 83 ed ldi r24, 0xD3 ; 211 1868a: 96 e4 ldi r25, 0x46 ; 70 1868c: 0e 94 3a 75 call 0xea74 ; 0xea74 18690: 68 ed ldi r22, 0xD8 ; 216 18692: 7f ec ldi r23, 0xCF ; 207 18694: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } if (lcd_commands_type == LcdCommands::Idle) 18698: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1869c: 81 11 cpse r24, r1 1869e: 08 c0 rjmp .+16 ; 0x186b0 { MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), activate_calibrate_sheet); 186a0: 80 ec ldi r24, 0xC0 ; 192 186a2: 96 e4 ldi r25, 0x46 ; 70 186a4: 0e 94 3a 75 call 0xea74 ; 0xea74 186a8: 66 e5 ldi r22, 0x56 ; 86 186aa: 79 ed ldi r23, 0xD9 ; 217 186ac: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu); 186b0: 87 eb ldi r24, 0xB7 ; 183 186b2: 96 e4 ldi r25, 0x46 ; 70 186b4: 0e 94 3a 75 call 0xea74 ; 0xea74 186b8: 6c e0 ldi r22, 0x0C ; 12 186ba: 76 ec ldi r23, 0xC6 ; 198 186bc: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet); 186c0: 8f ea ldi r24, 0xAF ; 175 186c2: 96 e4 ldi r25, 0x46 ; 70 186c4: 0e 94 3a 75 call 0xea74 ; 0xea74 186c8: 67 e0 ldi r22, 0x07 ; 7 186ca: 77 ed ldi r23, 0xD7 ; 215 186cc: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_END(); 186d0: 0e 94 83 62 call 0xc506 ; 0xc506 lcd_first_layer_calibration_reset(); } static void lcd_sheet_menu() { MENU_BEGIN(); 186d4: 80 91 60 04 lds r24, 0x0460 ; 0x800460 186d8: 8f 5f subi r24, 0xFF ; 255 186da: 80 93 60 04 sts 0x0460, r24 ; 0x800460 186de: 80 91 62 04 lds r24, 0x0462 ; 0x800462 186e2: 8f 5f subi r24, 0xFF ; 255 186e4: 80 93 62 04 sts 0x0462, r24 ; 0x800462 186e8: bc cf rjmp .-136 ; 0x18662 } MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu); MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet); MENU_END(); } 186ea: 08 95 ret 000186ec ()>: } template static void select_sheet_menu() { selected_sheet = number; 186ec: 87 e0 ldi r24, 0x07 ; 7 186ee: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 186f2: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 000186f6 ()>: } template static void select_sheet_menu() { selected_sheet = number; 186f6: 86 e0 ldi r24, 0x06 ; 6 186f8: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 186fc: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 00018700 ()>: } template static void select_sheet_menu() { selected_sheet = number; 18700: 85 e0 ldi r24, 0x05 ; 5 18702: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 18706: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 0001870a ()>: } template static void select_sheet_menu() { selected_sheet = number; 1870a: 84 e0 ldi r24, 0x04 ; 4 1870c: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 18710: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 00018714 ()>: } template static void select_sheet_menu() { selected_sheet = number; 18714: 83 e0 ldi r24, 0x03 ; 3 18716: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 1871a: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 0001871e ()>: } template static void select_sheet_menu() { selected_sheet = number; 1871e: 82 e0 ldi r24, 0x02 ; 2 18720: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 18724: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 00018728 ()>: } template static void select_sheet_menu() { selected_sheet = number; 18728: 81 e0 ldi r24, 0x01 ; 1 1872a: 80 93 ca 03 sts 0x03CA, r24 ; 0x8003ca lcd_sheet_menu(); 1872e: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 00018732 ()>: } template static void select_sheet_menu() { selected_sheet = number; 18732: 10 92 ca 03 sts 0x03CA, r1 ; 0x8003ca lcd_sheet_menu(); 18736: 0c 94 2d c3 jmp 0x1865a ; 0x1865a 0001873a : menu_back_if_clicked(); } void lcd_move_menu_axis() { MENU_BEGIN(); 1873a: 0e 94 0c 74 call 0xe818 ; 0xe818 1873e: 10 92 60 04 sts 0x0460, r1 ; 0x800460 18742: 80 91 60 04 lds r24, 0x0460 ; 0x800460 18746: 84 30 cpi r24, 0x04 ; 4 18748: a8 f5 brcc .+106 ; 0x187b4 1874a: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 1874e: 8e e8 ldi r24, 0x8E ; 142 18750: 98 e4 ldi r25, 0x48 ; 72 18752: 0e 94 3a 75 call 0xea74 ; 0xea74 18756: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_X), lcd_move_x); 1875a: 8c eb ldi r24, 0xBC ; 188 1875c: 9c e3 ldi r25, 0x3C ; 60 1875e: 0e 94 3a 75 call 0xea74 ; 0xea74 18762: 69 e5 ldi r22, 0x59 ; 89 18764: 78 ec ldi r23, 0xC8 ; 200 18766: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Y), lcd_move_y); 1876a: 83 eb ldi r24, 0xB3 ; 179 1876c: 9c e3 ldi r25, 0x3C ; 60 1876e: 0e 94 3a 75 call 0xea74 ; 0xea74 18772: 62 e6 ldi r22, 0x62 ; 98 18774: 78 ec ldi r23, 0xC8 ; 200 18776: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Z), lcd_move_z); 1877a: 8a ea ldi r24, 0xAA ; 170 1877c: 9c e3 ldi r25, 0x3C ; 60 1877e: 0e 94 3a 75 call 0xea74 ; 0xea74 18782: 60 e5 ldi r22, 0x50 ; 80 18784: 78 ec ldi r23, 0xC8 ; 200 18786: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_EXTRUDER), lcd_move_e); 1878a: 8f e9 ldi r24, 0x9F ; 159 1878c: 9c e3 ldi r25, 0x3C ; 60 1878e: 0e 94 3a 75 call 0xea74 ; 0xea74 18792: 68 ec ldi r22, 0xC8 ; 200 18794: 7e ec ldi r23, 0xCE ; 206 18796: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_END(); 1879a: 0e 94 83 62 call 0xc506 ; 0xc506 menu_back_if_clicked(); } void lcd_move_menu_axis() { MENU_BEGIN(); 1879e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 187a2: 8f 5f subi r24, 0xFF ; 255 187a4: 80 93 60 04 sts 0x0460, r24 ; 0x800460 187a8: 80 91 62 04 lds r24, 0x0462 ; 0x800462 187ac: 8f 5f subi r24, 0xFF ; 255 187ae: 80 93 62 04 sts 0x0462, r24 ; 0x800462 187b2: c7 cf rjmp .-114 ; 0x18742 MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_X), lcd_move_x); MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Y), lcd_move_y); MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Z), lcd_move_z); MENU_ITEM_SUBMENU_P(_T(MSG_EXTRUDER), lcd_move_e); MENU_END(); } 187b4: 08 95 ret 000187b6 : } } static void lcd_checking_menu(void) { MENU_BEGIN(); 187b6: 0e 94 0c 74 call 0xe818 ; 0xe818 187ba: 10 92 60 04 sts 0x0460, r1 ; 0x800460 187be: 80 91 60 04 lds r24, 0x0460 ; 0x800460 187c2: 84 30 cpi r24, 0x04 ; 4 187c4: d8 f5 brcc .+118 ; 0x1883c 187c6: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_HW_SETUP)); 187ca: 85 e8 ldi r24, 0x85 ; 133 187cc: 95 e4 ldi r25, 0x45 ; 69 187ce: 0e 94 3a 75 call 0xea74 ; 0xea74 187d2: 0e 94 ce 72 call 0xe59c ; 0xe59c settings_check_toggle(&oCheckMode, _T(MSG_NOZZLE), lcd_check_mode_set); 187d6: 8c ed ldi r24, 0xDC ; 220 187d8: 94 e4 ldi r25, 0x44 ; 68 187da: 0e 94 3a 75 call 0xea74 ; 0xea74 187de: 45 e5 ldi r20, 0x55 ; 85 187e0: 5f eb ldi r21, 0xBF ; 191 187e2: bc 01 movw r22, r24 187e4: 80 91 ed 03 lds r24, 0x03ED ; 0x8003ed 187e8: 0e 94 d1 c0 call 0x181a2 ; 0x181a2 settings_check_toggle(&oCheckModel, _T(MSG_MODEL), lcd_check_model_set); 187ec: 84 ed ldi r24, 0xD4 ; 212 187ee: 94 e4 ldi r25, 0x44 ; 68 187f0: 0e 94 3a 75 call 0xea74 ; 0xea74 187f4: 4b e4 ldi r20, 0x4B ; 75 187f6: 5f eb ldi r21, 0xBF ; 191 187f8: bc 01 movw r22, r24 187fa: 80 91 ea 03 lds r24, 0x03EA ; 0x8003ea 187fe: 0e 94 d1 c0 call 0x181a2 ; 0x181a2 settings_check_toggle(&oCheckVersion, MSG_FIRMWARE, lcd_check_version_set); 18802: 41 e4 ldi r20, 0x41 ; 65 18804: 5f eb ldi r21, 0xBF ; 191 18806: 6c ef ldi r22, 0xFC ; 252 18808: 77 e6 ldi r23, 0x67 ; 103 1880a: 80 91 e9 03 lds r24, 0x03E9 ; 0x8003e9 1880e: 0e 94 d1 c0 call 0x181a2 ; 0x181a2 settings_check_toggle(&oCheckFilament, MSG_FILAMENT, lcd_check_filament_set); 18812: 47 e3 ldi r20, 0x37 ; 55 18814: 5f eb ldi r21, 0xBF ; 191 18816: 63 ef ldi r22, 0xF3 ; 243 18818: 79 e6 ldi r23, 0x69 ; 105 1881a: 80 91 ee 03 lds r24, 0x03EE ; 0x8003ee 1881e: 0e 94 d1 c0 call 0x181a2 ; 0x181a2 MENU_END(); 18822: 0e 94 83 62 call 0xc506 ; 0xc506 } } static void lcd_checking_menu(void) { MENU_BEGIN(); 18826: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1882a: 8f 5f subi r24, 0xFF ; 255 1882c: 80 93 60 04 sts 0x0460, r24 ; 0x800460 18830: 80 91 62 04 lds r24, 0x0462 ; 0x800462 18834: 8f 5f subi r24, 0xFF ; 255 18836: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1883a: c1 cf rjmp .-126 ; 0x187be settings_check_toggle(&oCheckMode, _T(MSG_NOZZLE), lcd_check_mode_set); settings_check_toggle(&oCheckModel, _T(MSG_MODEL), lcd_check_model_set); settings_check_toggle(&oCheckVersion, MSG_FIRMWARE, lcd_check_version_set); settings_check_toggle(&oCheckFilament, MSG_FILAMENT, lcd_check_filament_set); MENU_END(); } 1883c: 08 95 ret 0001883e : ++str; } return str; } bool __attribute__((noinline)) Tag(const char *str, const char *tag_P, uint8_t tagSize, uint16_t tagMask, uint16_t *v){ 1883e: cf 92 push r12 18840: df 92 push r13 18842: ef 92 push r14 18844: ff 92 push r15 18846: 0f 93 push r16 18848: 1f 93 push r17 1884a: cf 93 push r28 1884c: df 93 push r29 1884e: 6c 01 movw r12, r24 18850: 79 01 movw r14, r18 if( ! strncmp_P(str, tag_P, tagSize) ){ 18852: c4 2f mov r28, r20 18854: d0 e0 ldi r29, 0x00 ; 0 18856: ae 01 movw r20, r28 18858: 0f 94 bf a1 call 0x3437e ; 0x3437e 1885c: 89 2b or r24, r25 1885e: b9 f4 brne .+46 ; 0x1888e Number(str + tagSize, v); 18860: b8 01 movw r22, r16 18862: c6 01 movw r24, r12 18864: 8c 0f add r24, r28 18866: 9d 1f adc r25, r29 18868: 0e 94 cf bd call 0x17b9e ; 0x17b9e *v |= tagMask; 1886c: f8 01 movw r30, r16 1886e: 20 81 ld r18, Z 18870: 31 81 ldd r19, Z+1 ; 0x01 18872: 2e 29 or r18, r14 18874: 3f 29 or r19, r15 18876: 31 83 std Z+1, r19 ; 0x01 18878: 20 83 st Z, r18 return true; 1887a: 81 e0 ldi r24, 0x01 ; 1 } return false; } 1887c: df 91 pop r29 1887e: cf 91 pop r28 18880: 1f 91 pop r17 18882: 0f 91 pop r16 18884: ff 90 pop r15 18886: ef 90 pop r14 18888: df 90 pop r13 1888a: cf 90 pop r12 1888c: 08 95 ret if( ! strncmp_P(str, tag_P, tagSize) ){ Number(str + tagSize, v); *v |= tagMask; return true; } return false; 1888e: 80 e0 ldi r24, 0x00 ; 0 18890: f5 cf rjmp .-22 ; 0x1887c 00018892 : } } #if (LANG_MODE != 0) void lcd_language() { 18892: cf 93 push r28 18894: df 93 push r29 lcd_update_enable(true); 18896: 81 e0 ldi r24, 0x01 ; 1 18898: 0e 94 38 70 call 0xe070 ; 0xe070 menu_goto(lcd_language_menu, 0, true, true); 1889c: 21 e0 ldi r18, 0x01 ; 1 1889e: 41 e0 ldi r20, 0x01 ; 1 188a0: 70 e0 ldi r23, 0x00 ; 0 188a2: 60 e0 ldi r22, 0x00 ; 0 188a4: 86 e1 ldi r24, 0x16 ; 22 188a6: 99 ee ldi r25, 0xE9 ; 233 188a8: 0e 94 b7 62 call 0xc56e ; 0xc56e 188ac: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout while ((menu_menu != lcd_status_screen) && (!lang_is_selected())) 188b0: c0 91 02 04 lds r28, 0x0402 ; 0x800402 188b4: d0 91 03 04 lds r29, 0x0403 ; 0x800403 188b8: 0e 94 2e 74 call 0xe85c ; 0xe85c 188bc: c0 52 subi r28, 0x20 ; 32 188be: d7 43 sbci r29, 0x37 ; 55 188c0: 39 f0 breq .+14 ; 0x188d0 188c2: 81 11 cpse r24, r1 188c4: 07 c0 rjmp .+14 ; 0x188d4 { delay_keep_alive(50); 188c6: 82 e3 ldi r24, 0x32 ; 50 188c8: 90 e0 ldi r25, 0x00 ; 0 188ca: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 188ce: f0 cf rjmp .-32 ; 0x188b0 } if (lang_is_selected()) 188d0: 88 23 and r24, r24 188d2: 21 f0 breq .+8 ; 0x188dc lcd_return_to_status(); else lang_select(LANG_ID_PRI); } 188d4: df 91 pop r29 188d6: cf 91 pop r28 while ((menu_menu != lcd_status_screen) && (!lang_is_selected())) { delay_keep_alive(50); } if (lang_is_selected()) lcd_return_to_status(); 188d8: 0d 94 d5 07 jmp 0x20faa ; 0x20faa else lang_select(LANG_ID_PRI); 188dc: 80 e0 ldi r24, 0x00 ; 0 } 188de: df 91 pop r29 188e0: cf 91 pop r28 delay_keep_alive(50); } if (lang_is_selected()) lcd_return_to_status(); else lang_select(LANG_ID_PRI); 188e2: 0c 94 ce 74 jmp 0xe99c ; 0xe99c 000188e6 : lcd_return_to_status(); } void lcd_mesh_calibration() { enquecommand_P(PSTR("M45")); 188e6: 61 e0 ldi r22, 0x01 ; 1 188e8: 85 e3 ldi r24, 0x35 ; 53 188ea: 93 e8 ldi r25, 0x83 ; 131 188ec: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 188f0: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 000188f4 : } void lcd_mesh_calibration_z() { enquecommand_P(PSTR("M45 Z")); 188f4: 61 e0 ldi r22, 0x01 ; 1 188f6: 89 e3 ldi r24, 0x39 ; 57 188f8: 93 e8 ldi r25, 0x83 ; 131 188fa: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 188fe: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00018902 : } #endif //(LANG_MODE != 0) void lcd_mesh_bedleveling() { enquecommand_P(PSTR("G80")); 18902: 61 e0 ldi r22, 0x01 ; 1 18904: 81 e3 ldi r24, 0x31 ; 49 18906: 93 e8 ldi r25, 0x83 ; 131 18908: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 1890c: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00018910 : MYSERIAL.begin(BAUDRATE); } #endif //HAS_SECOND_SERIAL_PORT void lcd_calibrate_pinda() { enquecommand_P(PSTR("G76")); 18910: 61 e0 ldi r22, 0x01 ; 1 18912: 8f e3 ldi r24, 0x3F ; 63 18914: 93 e8 ldi r25, 0x83 ; 131 18916: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 1891a: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 0001891e : pat9125_s, pat9125_y); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } void lcd_menu_show_sensors_state() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { 1891e: cf 93 push r28 18920: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 { //0: N/A; 1: OFF; 2: ON uint8_t pinda_state = STATE_NA; uint8_t idler_state = STATE_NA; pinda_state = READ(Z_MIN_PIN); 18924: c3 b1 in r28, 0x03 ; 3 lcd_puts_at_P(0, 0, MSG_PINDA); 18926: 46 ed ldi r20, 0xD6 ; 214 18928: 57 e6 ldi r21, 0x67 ; 103 1892a: 60 e0 ldi r22, 0x00 ; 0 1892c: 80 e0 ldi r24, 0x00 ; 0 1892e: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(LCD_WIDTH - 14, 0); 18932: 60 e0 ldi r22, 0x00 ; 0 18934: 86 e0 ldi r24, 0x06 ; 6 18936: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print_state(pinda_state); 1893a: c4 fb bst r28, 4 1893c: 88 27 eor r24, r24 1893e: 80 f9 bld r24, 0 18940: 0e 94 fc be call 0x17df8 ; 0x17df8 if (MMU2::mmu2.Enabled()) { 18944: 80 91 01 13 lds r24, 0x1301 ; 0x801301 18948: 81 30 cpi r24, 0x01 ; 1 1894a: 99 f4 brne .+38 ; 0x18972 inline bool Running() const { return state == State::Running; } inline bool FindaPressed() const { return regs8[0]; 1894c: c1 e0 ldi r28, 0x01 ; 1 1894e: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 18952: 81 11 cpse r24, r1 18954: 01 c0 rjmp .+2 ; 0x18958 18956: c0 e0 ldi r28, 0x00 ; 0 const uint8_t finda_state = MMU2::mmu2.FindaDetectsFilament(); lcd_puts_at_P(10, 0, _n("FINDA"));////MSG_FINDA c=5 18958: 40 ed ldi r20, 0xD0 ; 208 1895a: 57 e6 ldi r21, 0x67 ; 103 1895c: 60 e0 ldi r22, 0x00 ; 0 1895e: 8a e0 ldi r24, 0x0A ; 10 18960: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(LCD_WIDTH - 3, 0); 18964: 60 e0 ldi r22, 0x00 ; 0 18966: 81 e1 ldi r24, 0x11 ; 17 18968: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print_state(finda_state); 1896c: 8c 2f mov r24, r28 1896e: 0e 94 fc be call 0x17df8 ; 0x17df8 18972: c1 e0 ldi r28, 0x01 ; 1 18974: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 18978: 81 11 cpse r24, r1 1897a: 01 c0 rjmp .+2 ; 0x1897e 1897c: c0 e0 ldi r28, 0x00 ; 0 } #ifdef FILAMENT_SENSOR idler_state = fsensor.getFilamentPresent(); lcd_puts_at_P(0, 1, _T(MSG_FSENSOR)); 1897e: 84 e3 ldi r24, 0x34 ; 52 18980: 98 e4 ldi r25, 0x48 ; 72 18982: 0e 94 3a 75 call 0xea74 ; 0xea74 18986: ac 01 movw r20, r24 18988: 61 e0 ldi r22, 0x01 ; 1 1898a: 80 e0 ldi r24, 0x00 ; 0 1898c: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(LCD_WIDTH - 3, 1); 18990: 61 e0 ldi r22, 0x01 ; 1 18992: 81 e1 ldi r24, 0x11 ; 17 18994: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print_state(idler_state); 18998: 8c 2f mov r24, r28 1899a: 0e 94 fc be call 0x17df8 ; 0x17df8 // auto-exposure algorithm. When the chip is tracking on a reflective surface, the Shutter is small. // When the chip is tracking on a surface that absorbs IR (or doesn't reflect it), the Shutter is large. // The maximum value of the shutter is 17. The value of 16 seems to be reported as 17 even though the // Brightness value changes correctly as if the shutter changed to 16 (probably some bug with the sensor). // The shutter algorithm tries to keep the B value in the 70-110 range. lcd_set_cursor(0, 2); 1899e: 62 e0 ldi r22, 0x02 ; 2 189a0: 80 e0 ldi r24, 0x00 ; 0 189a2: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(_N("B: %3d Xd:%6d\n" 189a6: 80 91 39 0e lds r24, 0x0E39 ; 0x800e39 189aa: 8f 93 push r24 189ac: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 189b0: 8f 93 push r24 189b2: 80 91 64 0d lds r24, 0x0D64 ; 0x800d64 189b6: 1f 92 push r1 189b8: 8f 93 push r24 189ba: 80 91 8a 03 lds r24, 0x038A ; 0x80038a 189be: 8f 93 push r24 189c0: 80 91 89 03 lds r24, 0x0389 ; 0x800389 189c4: 8f 93 push r24 189c6: 80 91 63 0d lds r24, 0x0D63 ; 0x800d63 189ca: 1f 92 push r1 189cc: 8f 93 push r24 189ce: 8c ea ldi r24, 0xAC ; 172 189d0: 97 e6 ldi r25, 0x67 ; 103 189d2: 9f 93 push r25 189d4: 8f 93 push r24 189d6: 0e 94 0b 6f call 0xde16 ; 0xde16 void lcd_menu_show_sensors_state() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { lcd_timeoutToStatus.stop(); lcd_show_sensors_state(); menu_back_if_clicked(); 189da: 8d b7 in r24, 0x3d ; 61 189dc: 9e b7 in r25, 0x3e ; 62 189de: 0a 96 adiw r24, 0x0a ; 10 189e0: 0f b6 in r0, 0x3f ; 63 189e2: f8 94 cli 189e4: 9e bf out 0x3e, r25 ; 62 189e6: 0f be out 0x3f, r0 ; 63 189e8: 8d bf out 0x3d, r24 ; 61 } 189ea: cf 91 pop r28 void lcd_menu_show_sensors_state() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { lcd_timeoutToStatus.stop(); lcd_show_sensors_state(); menu_back_if_clicked(); 189ec: 0c 94 06 74 jmp 0xe80c ; 0xe80c 000189f0 : } #endif //FANCHECK static uint8_t lcd_selftest_screen(TestScreen screen, uint8_t _progress, uint8_t _progress_scale, bool _clear, uint16_t _delay) { 189f0: bf 92 push r11 189f2: cf 92 push r12 189f4: df 92 push r13 189f6: ef 92 push r14 189f8: ff 92 push r15 189fa: 0f 93 push r16 189fc: 1f 93 push r17 189fe: cf 93 push r28 18a00: df 93 push r29 18a02: c8 2f mov r28, r24 18a04: f6 2e mov r15, r22 18a06: e4 2e mov r14, r20 18a08: b2 2e mov r11, r18 18a0a: 68 01 movw r12, r16 lcd_update_enable(false); 18a0c: 80 e0 ldi r24, 0x00 ; 0 18a0e: 0e 94 38 70 call 0xe070 ; 0xe070 const char _indicator = (_progress >= _progress_scale) ? '-' : '|'; 18a12: dc e7 ldi r29, 0x7C ; 124 18a14: fe 14 cp r15, r14 18a16: 08 f0 brcs .+2 ; 0x18a1a 18a18: dd e2 ldi r29, 0x2D ; 45 if (_clear) 18a1a: bb 20 and r11, r11 18a1c: 09 f1 breq .+66 ; 0x18a60 lcd_clear(); 18a1e: 0e 94 26 70 call 0xe04c ; 0xe04c else lcd_home(); if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 18a22: c1 11 cpse r28, r1 18a24: 20 c0 rjmp .+64 ; 0x18a66 if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 18a26: 8d e6 ldi r24, 0x6D ; 109 18a28: 9d e5 ldi r25, 0x5D ; 93 if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS)); if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X)); if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y)); if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z)); if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED)); 18a2a: 0e 94 3a 75 call 0xea74 ; 0xea74 18a2e: 0e 94 1d 6f call 0xde3a ; 0xde3a if (screen == TestScreen::Hotend || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); 18a32: 88 ef ldi r24, 0xF8 ; 248 18a34: 8c 0f add r24, r28 if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS)); if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X)); if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y)); if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z)); if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED)); if (screen == TestScreen::Hotend 18a36: 82 30 cpi r24, 0x02 ; 2 18a38: 78 f5 brcc .+94 ; 0x18a98 || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); 18a3a: 8e e6 ldi r24, 0x6E ; 110 18a3c: 9a e4 ldi r25, 0x4A ; 74 18a3e: 0e 94 3a 75 call 0xea74 ; 0xea74 18a42: 0e 94 1d 6f call 0xde3a ; 0xde3a if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); if (screen == TestScreen::AllCorrect) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ALLCORRECT)); 18a46: 8d e4 ldi r24, 0x4D ; 77 18a48: 9a e4 ldi r25, 0x4A ; 74 18a4a: cc 30 cpi r28, 0x0C ; 12 18a4c: 49 f1 breq .+82 ; 0x18aa0 if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED)); 18a4e: 8b e3 ldi r24, 0x3B ; 59 18a50: 9a e4 ldi r25, 0x4A ; 74 18a52: cd 30 cpi r28, 0x0D ; 13 18a54: 29 f1 breq .+74 ; 0x18aa0 if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME)); 18a56: ce 30 cpi r28, 0x0E ; 14 18a58: 39 f5 brne .+78 ; 0x18aa8 18a5a: 88 e2 ldi r24, 0x28 ; 40 18a5c: 9a e4 ldi r25, 0x4A ; 74 18a5e: 20 c0 rjmp .+64 ; 0x18aa0 lcd_update_enable(false); const char _indicator = (_progress >= _progress_scale) ? '-' : '|'; if (_clear) lcd_clear(); else lcd_home(); 18a60: 0e 94 1f 70 call 0xe03e ; 0xe03e 18a64: de cf rjmp .-68 ; 0x18a22 if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 18a66: c1 30 cpi r28, 0x01 ; 1 18a68: f1 f2 breq .-68 ; 0x18a26 if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 18a6a: c2 30 cpi r28, 0x02 ; 2 18a6c: e1 f2 breq .-72 ; 0x18a26 if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS)); 18a6e: 85 ec ldi r24, 0xC5 ; 197 18a70: 9a e4 ldi r25, 0x4A ; 74 18a72: c3 30 cpi r28, 0x03 ; 3 18a74: d1 f2 breq .-76 ; 0x18a2a if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X)); 18a76: 83 eb ldi r24, 0xB3 ; 179 18a78: 9a e4 ldi r25, 0x4A ; 74 18a7a: c4 30 cpi r28, 0x04 ; 4 18a7c: b1 f2 breq .-84 ; 0x18a2a if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y)); 18a7e: 81 ea ldi r24, 0xA1 ; 161 18a80: 9a e4 ldi r25, 0x4A ; 74 18a82: c5 30 cpi r28, 0x05 ; 5 18a84: 91 f2 breq .-92 ; 0x18a2a if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z)); 18a86: 8f e8 ldi r24, 0x8F ; 143 18a88: 9a e4 ldi r25, 0x4A ; 74 18a8a: c6 30 cpi r28, 0x06 ; 6 18a8c: 71 f2 breq .-100 ; 0x18a2a if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED)); 18a8e: c7 30 cpi r28, 0x07 ; 7 18a90: 81 f6 brne .-96 ; 0x18a32 18a92: 80 e8 ldi r24, 0x80 ; 128 18a94: 9a e4 ldi r25, 0x4A ; 74 18a96: c9 cf rjmp .-110 ; 0x18a2a if (screen == TestScreen::Hotend || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); 18a98: ca 30 cpi r28, 0x0A ; 10 18a9a: 99 f5 brne .+102 ; 0x18b02 if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); 18a9c: 8b e5 ldi r24, 0x5B ; 91 18a9e: 9a e4 ldi r25, 0x4A ; 74 if (screen == TestScreen::AllCorrect) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ALLCORRECT)); if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED)); if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME)); 18aa0: 0e 94 3a 75 call 0xea74 ; 0xea74 18aa4: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_puts_at_P(0, 1, STR_SEPARATOR); 18aa8: 41 e0 ldi r20, 0x01 ; 1 18aaa: 54 e8 ldi r21, 0x84 ; 132 18aac: 61 e0 ldi r22, 0x01 ; 1 18aae: 80 e0 ldi r24, 0x00 ; 0 18ab0: 0e 94 07 70 call 0xe00e ; 0xe00e if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk)) 18ab4: c3 30 cpi r28, 0x03 ; 3 18ab6: 70 f5 brcc .+92 ; 0x18b14 { //SERIAL_ECHOLNPGM("Fan test"); lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED)); 18ab8: 8a e1 ldi r24, 0x1A ; 26 18aba: 9a e4 ldi r25, 0x4A ; 74 18abc: 0e 94 3a 75 call 0xea74 ; 0xea74 18ac0: ac 01 movw r20, r24 18ac2: 62 e0 ldi r22, 0x02 ; 2 18ac4: 80 e0 ldi r24, 0x00 ; 0 18ac6: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(18, 2); 18aca: 62 e0 ldi r22, 0x02 ; 2 18acc: 82 e1 ldi r24, 0x12 ; 18 18ace: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 (screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18ad2: c1 11 cpse r28, r1 18ad4: 1a c0 rjmp .+52 ; 0x18b0a 18ad6: 8d 2f mov r24, r29 18ad8: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED)); 18adc: 8d e0 ldi r24, 0x0D ; 13 18ade: 9a e4 ldi r25, 0x4A ; 74 18ae0: 0e 94 3a 75 call 0xea74 ; 0xea74 18ae4: ac 01 movw r20, r24 18ae6: 63 e0 ldi r22, 0x03 ; 3 18ae8: 80 e0 ldi r24, 0x00 ; 0 18aea: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(18, 3); 18aee: 63 e0 ldi r22, 0x03 ; 3 18af0: 82 e1 ldi r24, 0x12 ; 18 18af2: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 (screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18af6: c2 30 cpi r28, 0x02 ; 2 18af8: 19 f1 breq .+70 ; 0x18b40 else if (screen >= TestScreen::Fsensor && screen <= TestScreen::FsensorOk) { lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); lcd_putc(':'); lcd_set_cursor(18, 2); (screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18afa: 8d 2f mov r24, r29 18afc: 0e 94 21 6f call 0xde42 ; 0xde42 18b00: 23 c0 rjmp .+70 ; 0x18b48 if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z)); if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED)); if (screen == TestScreen::Hotend || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); 18b02: cb 30 cpi r28, 0x0B ; 11 18b04: 09 f0 breq .+2 ; 0x18b08 18b06: 9f cf rjmp .-194 ; 0x18a46 18b08: c9 cf rjmp .-110 ; 0x18a9c if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk)) { //SERIAL_ECHOLNPGM("Fan test"); lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED)); lcd_set_cursor(18, 2); (screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18b0a: 82 e9 ldi r24, 0x92 ; 146 18b0c: 98 e6 ldi r25, 0x68 ; 104 18b0e: 0e 94 1d 6f call 0xde3a ; 0xde3a 18b12: e4 cf rjmp .-56 ; 0x18adc lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED)); lcd_set_cursor(18, 3); (screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); } else if (screen >= TestScreen::Fsensor && screen <= TestScreen::FsensorOk) 18b14: 86 ef ldi r24, 0xF6 ; 246 18b16: 8c 0f add r24, r28 18b18: 82 30 cpi r24, 0x02 ; 2 18b1a: a8 f5 brcc .+106 ; 0x18b86 { lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); 18b1c: 8b ef ldi r24, 0xFB ; 251 18b1e: 99 e4 ldi r25, 0x49 ; 73 18b20: 0e 94 3a 75 call 0xea74 ; 0xea74 18b24: ac 01 movw r20, r24 18b26: 62 e0 ldi r22, 0x02 ; 2 18b28: 80 e0 ldi r24, 0x00 ; 0 18b2a: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc(':'); 18b2e: 8a e3 ldi r24, 0x3A ; 58 18b30: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_set_cursor(18, 2); 18b34: 62 e0 ldi r22, 0x02 ; 2 18b36: 82 e1 ldi r24, 0x12 ; 18 18b38: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 (screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18b3c: ca 30 cpi r28, 0x0A ; 10 18b3e: e9 f2 breq .-70 ; 0x18afa lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED)); lcd_set_cursor(18, 2); (screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED)); lcd_set_cursor(18, 3); (screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 18b40: 82 e9 ldi r24, 0x92 ; 146 18b42: 98 e6 ldi r25, 0x68 ; 104 18b44: 0e 94 1d 6f call 0xde3a ; 0xde3a _step_block = TestScreen::Hotend; lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Hotend"), _indicator); } if (_delay > 0) delay_keep_alive(_delay); 18b48: c1 14 cp r12, r1 18b4a: d1 04 cpc r13, r1 18b4c: 19 f0 breq .+6 ; 0x18b54 18b4e: c6 01 movw r24, r12 18b50: 0e 94 8e 8e call 0x11d1c ; 0x11d1c _progress++; 18b54: 81 e0 ldi r24, 0x01 ; 1 18b56: 8f 0d add r24, r15 return (_progress >= _progress_scale * 2) ? 0 : _progress; 18b58: 48 2f mov r20, r24 18b5a: 50 e0 ldi r21, 0x00 ; 0 18b5c: 92 e0 ldi r25, 0x02 ; 2 18b5e: 24 e0 ldi r18, 0x04 ; 4 18b60: 30 e0 ldi r19, 0x00 ; 0 18b62: e9 16 cp r14, r25 18b64: 11 f0 breq .+4 ; 0x18b6a 18b66: 26 e0 ldi r18, 0x06 ; 6 18b68: 30 e0 ldi r19, 0x00 ; 0 18b6a: 42 17 cp r20, r18 18b6c: 53 07 cpc r21, r19 18b6e: 0c f0 brlt .+2 ; 0x18b72 18b70: 80 e0 ldi r24, 0x00 ; 0 } 18b72: df 91 pop r29 18b74: cf 91 pop r28 18b76: 1f 91 pop r17 18b78: 0f 91 pop r16 18b7a: ff 90 pop r15 18b7c: ef 90 pop r14 18b7e: df 90 pop r13 18b80: cf 90 pop r12 18b82: bf 90 pop r11 18b84: 08 95 ret lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); lcd_putc(':'); lcd_set_cursor(18, 2); (screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); } else if (screen < TestScreen::Fsensor) 18b86: ca 30 cpi r28, 0x0A ; 10 18b88: f8 f6 brcc .-66 ; 0x18b48 { //SERIAL_ECHOLNPGM("Other tests"); TestScreen _step_block = TestScreen::AxisX; lcd_selftest_screen_step(2, 2, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("X"), _indicator); 18b8a: 41 e0 ldi r20, 0x01 ; 1 18b8c: c4 30 cpi r28, 0x04 ; 4 18b8e: 21 f0 breq .+8 ; 0x18b98 18b90: 42 e0 ldi r20, 0x02 ; 2 18b92: c3 30 cpi r28, 0x03 ; 3 18b94: 09 f4 brne .+2 ; 0x18b98 18b96: 40 e0 ldi r20, 0x00 ; 0 18b98: 0d 2f mov r16, r29 18b9a: 2f ef ldi r18, 0xFF ; 255 18b9c: 33 e8 ldi r19, 0x83 ; 131 18b9e: 62 e0 ldi r22, 0x02 ; 2 18ba0: 82 e0 ldi r24, 0x02 ; 2 18ba2: 0e 94 d0 be call 0x17da0 ; 0x17da0 _step_block = TestScreen::AxisY; lcd_selftest_screen_step(2, 8, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Y"), _indicator); 18ba6: 41 e0 ldi r20, 0x01 ; 1 18ba8: c5 30 cpi r28, 0x05 ; 5 18baa: 21 f0 breq .+8 ; 0x18bb4 18bac: 42 e0 ldi r20, 0x02 ; 2 18bae: c5 30 cpi r28, 0x05 ; 5 18bb0: 08 f4 brcc .+2 ; 0x18bb4 18bb2: 40 e0 ldi r20, 0x00 ; 0 18bb4: 0d 2f mov r16, r29 18bb6: 2d ef ldi r18, 0xFD ; 253 18bb8: 33 e8 ldi r19, 0x83 ; 131 18bba: 68 e0 ldi r22, 0x08 ; 8 18bbc: 82 e0 ldi r24, 0x02 ; 2 18bbe: 0e 94 d0 be call 0x17da0 ; 0x17da0 _step_block = TestScreen::AxisZ; lcd_selftest_screen_step(2, 14, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Z"), _indicator); 18bc2: 41 e0 ldi r20, 0x01 ; 1 18bc4: c6 30 cpi r28, 0x06 ; 6 18bc6: 21 f0 breq .+8 ; 0x18bd0 18bc8: 42 e0 ldi r20, 0x02 ; 2 18bca: c6 30 cpi r28, 0x06 ; 6 18bcc: 08 f4 brcc .+2 ; 0x18bd0 18bce: 40 e0 ldi r20, 0x00 ; 0 18bd0: 0d 2f mov r16, r29 18bd2: 2b ef ldi r18, 0xFB ; 251 18bd4: 33 e8 ldi r19, 0x83 ; 131 18bd6: 6e e0 ldi r22, 0x0E ; 14 18bd8: 82 e0 ldi r24, 0x02 ; 2 18bda: 0e 94 d0 be call 0x17da0 ; 0x17da0 _step_block = TestScreen::Bed; lcd_selftest_screen_step(3, 0, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Bed"), _indicator); 18bde: 41 e0 ldi r20, 0x01 ; 1 18be0: c7 30 cpi r28, 0x07 ; 7 18be2: 21 f0 breq .+8 ; 0x18bec 18be4: 42 e0 ldi r20, 0x02 ; 2 18be6: c7 30 cpi r28, 0x07 ; 7 18be8: 08 f4 brcc .+2 ; 0x18bec 18bea: 40 e0 ldi r20, 0x00 ; 0 18bec: 0d 2f mov r16, r29 18bee: 27 ef ldi r18, 0xF7 ; 247 18bf0: 33 e8 ldi r19, 0x83 ; 131 18bf2: 60 e0 ldi r22, 0x00 ; 0 18bf4: 83 e0 ldi r24, 0x03 ; 3 18bf6: 0e 94 d0 be call 0x17da0 ; 0x17da0 _step_block = TestScreen::Hotend; lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Hotend"), _indicator); 18bfa: 41 e0 ldi r20, 0x01 ; 1 18bfc: c8 30 cpi r28, 0x08 ; 8 18bfe: 21 f0 breq .+8 ; 0x18c08 18c00: 42 e0 ldi r20, 0x02 ; 2 18c02: c8 30 cpi r28, 0x08 ; 8 18c04: 08 f4 brcc .+2 ; 0x18c08 18c06: 40 e0 ldi r20, 0x00 ; 0 18c08: 0d 2f mov r16, r29 18c0a: 20 ef ldi r18, 0xF0 ; 240 18c0c: 33 e8 ldi r19, 0x83 ; 131 18c0e: 69 e0 ldi r22, 0x09 ; 9 18c10: 83 e0 ldi r24, 0x03 ; 3 18c12: 0e 94 d0 be call 0x17da0 ; 0x17da0 18c16: 98 cf rjmp .-208 ; 0x18b48 00018c18 : { printf_P(MSG_HOST_ACTION_NOTIFICATION, message); } static void lcd_rename_sheet_menu() { 18c18: cf 93 push r28 18c1a: df 93 push r29 unsigned char name[sizeof(Sheet::name)]; }; static_assert(sizeof(menu_data)>= sizeof(MenuData),"MenuData doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if (!menuData->initialized) 18c1c: 80 91 96 03 lds r24, 0x0396 ; 0x800396 18c20: 81 11 cpse r24, r1 18c22: 18 c0 rjmp .+48 ; 0x18c54 { eeprom_read_block(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); 18c24: 60 91 ca 03 lds r22, 0x03CA ; 0x8003ca 18c28: 8b e0 ldi r24, 0x0B ; 11 18c2a: 68 9f mul r22, r24 18c2c: b0 01 movw r22, r0 18c2e: 11 24 eor r1, r1 18c30: 67 5b subi r22, 0xB7 ; 183 18c32: 72 4f sbci r23, 0xF2 ; 242 18c34: 47 e0 ldi r20, 0x07 ; 7 18c36: 50 e0 ldi r21, 0x00 ; 0 18c38: 88 e9 ldi r24, 0x98 ; 152 18c3a: 93 e0 ldi r25, 0x03 ; 3 18c3c: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 lcd_encoder = menuData->name[0]; 18c40: 80 91 98 03 lds r24, 0x0398 ; 0x800398 18c44: 90 e0 ldi r25, 0x00 ; 0 18c46: 90 93 1f 06 sts 0x061F, r25 ; 0x80061f 18c4a: 80 93 1e 06 sts 0x061E, r24 ; 0x80061e menuData->initialized = true; 18c4e: 81 e0 ldi r24, 0x01 ; 1 18c50: 80 93 96 03 sts 0x0396, r24 ; 0x800396 } if (lcd_encoder < 0x20) lcd_encoder = 0x20; 18c54: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 18c58: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 18c5c: 80 97 sbiw r24, 0x20 ; 32 18c5e: 34 f4 brge .+12 ; 0x18c6c 18c60: 80 e2 ldi r24, 0x20 ; 32 18c62: 90 e0 ldi r25, 0x00 ; 0 18c64: 90 93 1f 06 sts 0x061F, r25 ; 0x80061f 18c68: 80 93 1e 06 sts 0x061E, r24 ; 0x80061e if (lcd_encoder > 0xFF) lcd_encoder = 0xFF; 18c6c: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 18c70: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 18c74: 8f 3f cpi r24, 0xFF ; 255 18c76: 91 05 cpc r25, r1 18c78: 39 f0 breq .+14 ; 0x18c88 18c7a: 34 f0 brlt .+12 ; 0x18c88 18c7c: 8f ef ldi r24, 0xFF ; 255 18c7e: 90 e0 ldi r25, 0x00 ; 0 18c80: 90 93 1f 06 sts 0x061F, r25 ; 0x80061f 18c84: 80 93 1e 06 sts 0x061E, r24 ; 0x80061e menuData->name[menuData->selected] = lcd_encoder; 18c88: e0 91 97 03 lds r30, 0x0397 ; 0x800397 18c8c: f0 e0 ldi r31, 0x00 ; 0 18c8e: ea 56 subi r30, 0x6A ; 106 18c90: fc 4f sbci r31, 0xFC ; 252 18c92: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 18c96: 82 83 std Z+2, r24 ; 0x02 lcd_home(); 18c98: 0e 94 1f 70 call 0xe03e ; 0xe03e 18c9c: c8 e9 ldi r28, 0x98 ; 152 18c9e: d3 e0 ldi r29, 0x03 ; 3 for (uint_least8_t i = 0; i < sizeof(Sheet::name); ++i) { lcd_putc(menuData->name[i]); 18ca0: 89 91 ld r24, Y+ 18ca2: 0e 94 21 6f call 0xde42 ; 0xde42 if (lcd_encoder < 0x20) lcd_encoder = 0x20; if (lcd_encoder > 0xFF) lcd_encoder = 0xFF; menuData->name[menuData->selected] = lcd_encoder; lcd_home(); for (uint_least8_t i = 0; i < sizeof(Sheet::name); ++i) 18ca6: 83 e0 ldi r24, 0x03 ; 3 18ca8: cf 39 cpi r28, 0x9F ; 159 18caa: d8 07 cpc r29, r24 18cac: c9 f7 brne .-14 ; 0x18ca0 { lcd_putc(menuData->name[i]); } lcd_putc_at(menuData->selected, 1, '^'); 18cae: 4e e5 ldi r20, 0x5E ; 94 18cb0: 61 e0 ldi r22, 0x01 ; 1 18cb2: 80 91 97 03 lds r24, 0x0397 ; 0x800397 18cb6: 0e 94 13 70 call 0xe026 ; 0xe026 if (menuData->selected > 0) 18cba: 80 91 97 03 lds r24, 0x0397 ; 0x800397 18cbe: 88 23 and r24, r24 18cc0: 29 f0 breq .+10 ; 0x18ccc { lcd_putc_at(menuData->selected-1, 1, ' '); 18cc2: 40 e2 ldi r20, 0x20 ; 32 18cc4: 61 e0 ldi r22, 0x01 ; 1 18cc6: 81 50 subi r24, 0x01 ; 1 18cc8: 0e 94 13 70 call 0xe026 ; 0xe026 } if (lcd_clicked()) 18ccc: 0e 94 75 73 call 0xe6ea ; 0xe6ea 18cd0: 88 23 and r24, r24 18cd2: 99 f0 breq .+38 ; 0x18cfa { if ((menuData->selected + 1u) < sizeof(Sheet::name)) 18cd4: e0 91 97 03 lds r30, 0x0397 ; 0x800397 18cd8: 8e 2f mov r24, r30 18cda: 90 e0 ldi r25, 0x00 ; 0 18cdc: 01 96 adiw r24, 0x01 ; 1 18cde: 07 97 sbiw r24, 0x07 ; 7 18ce0: 78 f4 brcc .+30 ; 0x18d00 { lcd_encoder = menuData->name[++(menuData->selected)]; 18ce2: ef 5f subi r30, 0xFF ; 255 18ce4: e0 93 97 03 sts 0x0397, r30 ; 0x800397 18ce8: f0 e0 ldi r31, 0x00 ; 0 18cea: ea 56 subi r30, 0x6A ; 106 18cec: fc 4f sbci r31, 0xFC ; 252 18cee: 82 81 ldd r24, Z+2 ; 0x02 18cf0: 90 e0 ldi r25, 0x00 ; 0 18cf2: 90 93 1f 06 sts 0x061F, r25 ; 0x80061f 18cf6: 80 93 1e 06 sts 0x061E, r24 ; 0x80061e EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); } } } 18cfa: df 91 pop r29 18cfc: cf 91 pop r28 18cfe: 08 95 ret { lcd_encoder = menuData->name[++(menuData->selected)]; } else { eeprom_update_block_notify(menuData->name, 18d00: 60 91 ca 03 lds r22, 0x03CA ; 0x8003ca 18d04: 8b e0 ldi r24, 0x0B ; 11 18d06: 68 9f mul r22, r24 18d08: b0 01 movw r22, r0 18d0a: 11 24 eor r1, r1 18d0c: 67 5b subi r22, 0xB7 ; 183 18d0e: 72 4f sbci r23, 0xF2 ; 242 #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 18d10: 47 e0 ldi r20, 0x07 ; 7 18d12: 50 e0 ldi r21, 0x00 ; 0 18d14: 88 e9 ldi r24, 0x98 ; 152 18d16: 93 e0 ldi r25, 0x03 ; 3 18d18: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); } } } 18d1c: df 91 pop r29 18d1e: cf 91 pop r28 else { eeprom_update_block_notify(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); 18d20: 0c 94 1b 63 jmp 0xc636 ; 0xc636 00018d24 : //! |Right: 00.00mm| MSG_RIGHT c=10, c=8 //! ---------------------- //! @endcode //! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. static void lcd_menu_xyz_y_min() { 18d24: 2f 92 push r2 18d26: 3f 92 push r3 18d28: 4f 92 push r4 18d2a: 5f 92 push r5 18d2c: 6f 92 push r6 18d2e: 7f 92 push r7 18d30: 8f 92 push r8 18d32: 9f 92 push r9 18d34: af 92 push r10 18d36: bf 92 push r11 18d38: cf 92 push r12 18d3a: df 92 push r13 18d3c: ef 92 push r14 18d3e: ff 92 push r15 18d40: 0f 93 push r16 18d42: 1f 93 push r17 18d44: cf 93 push r28 18d46: df 93 push r29 18d48: cd b7 in r28, 0x3d ; 61 18d4a: de b7 in r29, 0x3e ; 62 18d4c: a8 97 sbiw r28, 0x28 ; 40 18d4e: 0f b6 in r0, 0x3f ; 63 18d50: f8 94 cli 18d52: de bf out 0x3e, r29 ; 62 18d54: 0f be out 0x3f, r0 ; 63 18d56: cd bf out 0x3d, r28 ; 61 void count_xyz_details(float (&distanceMin)[2]) { float cntr[2]; float vec_x[2]; float vec_y[2]; eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); 18d58: 48 e0 ldi r20, 0x08 ; 8 18d5a: 50 e0 ldi r21, 0x00 ; 0 18d5c: 65 ee ldi r22, 0xE5 ; 229 18d5e: 7f e0 ldi r23, 0x0F ; 15 18d60: ce 01 movw r24, r28 18d62: 41 96 adiw r24, 0x11 ; 17 18d64: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); 18d68: 48 e0 ldi r20, 0x08 ; 8 18d6a: 50 e0 ldi r21, 0x00 ; 0 18d6c: 6d ed ldi r22, 0xDD ; 221 18d6e: 7f e0 ldi r23, 0x0F ; 15 18d70: ce 01 movw r24, r28 18d72: 09 96 adiw r24, 0x09 ; 9 18d74: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); 18d78: 48 e0 ldi r20, 0x08 ; 8 18d7a: 50 e0 ldi r21, 0x00 ; 0 18d7c: 65 ed ldi r22, 0xD5 ; 213 18d7e: 7f e0 ldi r23, 0x0F ; 15 18d80: ce 01 movw r24, r28 18d82: 01 96 adiw r24, 0x01 ; 1 18d84: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 for (uint8_t mesh_point = 0; mesh_point < 2; ++mesh_point) { float y = vec_x[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2) + vec_y[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2 + 1) + cntr[1]; 18d88: 8d 84 ldd r8, Y+13 ; 0x0d 18d8a: 9e 84 ldd r9, Y+14 ; 0x0e 18d8c: af 84 ldd r10, Y+15 ; 0x0f 18d8e: b8 88 ldd r11, Y+16 ; 0x10 18d90: e0 e0 ldi r30, 0x00 ; 0 18d92: fc e9 ldi r31, 0x9C ; 156 18d94: 25 91 lpm r18, Z+ 18d96: 35 91 lpm r19, Z+ 18d98: 45 91 lpm r20, Z+ 18d9a: 54 91 lpm r21, Z 18d9c: cd 80 ldd r12, Y+5 ; 0x05 18d9e: de 80 ldd r13, Y+6 ; 0x06 18da0: ef 80 ldd r14, Y+7 ; 0x07 18da2: f8 84 ldd r15, Y+8 ; 0x08 18da4: e4 e0 ldi r30, 0x04 ; 4 18da6: fc e9 ldi r31, 0x9C ; 156 18da8: 85 91 lpm r24, Z+ 18daa: 95 91 lpm r25, Z+ 18dac: a5 91 lpm r26, Z+ 18dae: b4 91 lpm r27, Z 18db0: 8d a3 std Y+37, r24 ; 0x25 18db2: 9e a3 std Y+38, r25 ; 0x26 18db4: af a3 std Y+39, r26 ; 0x27 18db6: b8 a7 std Y+40, r27 ; 0x28 18db8: 8d 89 ldd r24, Y+21 ; 0x15 18dba: 9e 89 ldd r25, Y+22 ; 0x16 18dbc: af 89 ldd r26, Y+23 ; 0x17 18dbe: b8 8d ldd r27, Y+24 ; 0x18 18dc0: 89 a3 std Y+33, r24 ; 0x21 18dc2: 9a a3 std Y+34, r25 ; 0x22 18dc4: ab a3 std Y+35, r26 ; 0x23 18dc6: bc a3 std Y+36, r27 ; 0x24 18dc8: c5 01 movw r24, r10 18dca: b4 01 movw r22, r8 18dcc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 18dd0: 2b 01 movw r4, r22 18dd2: 3c 01 movw r6, r24 18dd4: 2d a1 ldd r18, Y+37 ; 0x25 18dd6: 3e a1 ldd r19, Y+38 ; 0x26 18dd8: 4f a1 ldd r20, Y+39 ; 0x27 18dda: 58 a5 ldd r21, Y+40 ; 0x28 18ddc: c7 01 movw r24, r14 18dde: b6 01 movw r22, r12 18de0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 18de4: 9b 01 movw r18, r22 18de6: ac 01 movw r20, r24 18de8: c3 01 movw r24, r6 18dea: b2 01 movw r22, r4 18dec: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 18df0: 29 a1 ldd r18, Y+33 ; 0x21 18df2: 3a a1 ldd r19, Y+34 ; 0x22 18df4: 4b a1 ldd r20, Y+35 ; 0x23 18df6: 5c a1 ldd r21, Y+36 ; 0x24 18df8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 18dfc: 20 e0 ldi r18, 0x00 ; 0 18dfe: 30 e0 ldi r19, 0x00 ; 0 18e00: 40 e9 ldi r20, 0x90 ; 144 18e02: 50 e4 ldi r21, 0x40 ; 64 18e04: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 18e08: 1b 01 movw r2, r22 18e0a: 8c 01 movw r16, r24 eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); for (uint8_t mesh_point = 0; mesh_point < 2; ++mesh_point) { float y = vec_x[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2) + vec_y[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2 + 1) + cntr[1]; 18e0c: e8 e0 ldi r30, 0x08 ; 8 18e0e: fc e9 ldi r31, 0x9C ; 156 18e10: 25 91 lpm r18, Z+ 18e12: 35 91 lpm r19, Z+ 18e14: 45 91 lpm r20, Z+ 18e16: 54 91 lpm r21, Z 18e18: ec e0 ldi r30, 0x0C ; 12 18e1a: fc e9 ldi r31, 0x9C ; 156 18e1c: 45 90 lpm r4, Z+ 18e1e: 55 90 lpm r5, Z+ 18e20: 65 90 lpm r6, Z+ 18e22: 74 90 lpm r7, Z 18e24: c5 01 movw r24, r10 18e26: b4 01 movw r22, r8 18e28: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 18e2c: 4b 01 movw r8, r22 18e2e: 5c 01 movw r10, r24 18e30: a3 01 movw r20, r6 18e32: 92 01 movw r18, r4 18e34: c7 01 movw r24, r14 18e36: b6 01 movw r22, r12 18e38: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 18e3c: 9b 01 movw r18, r22 18e3e: ac 01 movw r20, r24 18e40: c5 01 movw r24, r10 18e42: b4 01 movw r22, r8 18e44: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 18e48: 29 a1 ldd r18, Y+33 ; 0x21 18e4a: 3a a1 ldd r19, Y+34 ; 0x22 18e4c: 4b a1 ldd r20, Y+35 ; 0x23 18e4e: 5c a1 ldd r21, Y+36 ; 0x24 18e50: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 18e54: 20 e0 ldi r18, 0x00 ; 0 18e56: 30 e0 ldi r19, 0x00 ; 0 18e58: 40 e9 ldi r20, 0x90 ; 144 18e5a: 50 e4 ldi r21, 0x40 ; 64 18e5c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 18e60: 6d 8f std Y+29, r22 ; 0x1d 18e62: 7e 8f std Y+30, r23 ; 0x1e 18e64: 8f 8f std Y+31, r24 ; 0x1f 18e66: 98 a3 std Y+32, r25 ; 0x20 float distanceMin[2]; count_xyz_details(distanceMin); lcd_home(); 18e68: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(_N( 18e6c: 8d e8 ldi r24, 0x8D ; 141 18e6e: 9a e3 ldi r25, 0x3A ; 58 18e70: 0e 94 3a 75 call 0xea74 ; 0xea74 18e74: d8 2e mov r13, r24 18e76: c9 2e mov r12, r25 18e78: 86 e8 ldi r24, 0x86 ; 134 18e7a: 9a e3 ldi r25, 0x3A ; 58 18e7c: 0e 94 3a 75 call 0xea74 ; 0xea74 18e80: f8 2e mov r15, r24 18e82: e9 2e mov r14, r25 18e84: 80 e7 ldi r24, 0x70 ; 112 18e86: 9a e3 ldi r25, 0x3A ; 58 18e88: 0e 94 3a 75 call 0xea74 ; 0xea74 18e8c: cf 92 push r12 18e8e: df 92 push r13 18e90: ef 92 push r14 18e92: ff 92 push r15 18e94: 21 e0 ldi r18, 0x01 ; 1 18e96: 34 e8 ldi r19, 0x84 ; 132 18e98: 3f 93 push r19 18e9a: 2f 93 push r18 18e9c: 9f 93 push r25 18e9e: 8f 93 push r24 18ea0: 82 e6 ldi r24, 0x62 ; 98 18ea2: 97 e6 ldi r25, 0x67 ; 103 18ea4: 9f 93 push r25 18ea6: 8f 93 push r24 18ea8: 0e 94 0b 6f call 0xde16 ; 0xde16 _T(MSG_LEFT), _T(MSG_RIGHT) ); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(11,2+i); 18eac: 62 e0 ldi r22, 0x02 ; 2 18eae: 8b e0 ldi r24, 0x0B ; 11 18eb0: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA)); 18eb4: 0f b6 in r0, 0x3f ; 63 18eb6: f8 94 cli 18eb8: de bf out 0x3e, r29 ; 62 18eba: 0f be out 0x3f, r0 ; 63 18ebc: cd bf out 0x3d, r28 ; 61 18ebe: 20 e0 ldi r18, 0x00 ; 0 18ec0: 30 e0 ldi r19, 0x00 ; 0 18ec2: 48 e4 ldi r20, 0x48 ; 72 18ec4: 53 e4 ldi r21, 0x43 ; 67 18ec6: 62 2d mov r22, r2 18ec8: 73 2d mov r23, r3 18eca: 80 2f mov r24, r16 18ecc: 91 2f mov r25, r17 18ece: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 18ed2: 87 ff sbrs r24, 7 18ed4: 51 c0 rjmp .+162 ; 0x18f78 else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); 18ed6: 1f 93 push r17 18ed8: 0f 93 push r16 18eda: 3f 92 push r3 18edc: 2f 92 push r2 18ede: 8a e5 ldi r24, 0x5A ; 90 18ee0: 97 e6 ldi r25, 0x67 ; 103 18ee2: 9f 93 push r25 18ee4: 8f 93 push r24 18ee6: 0e 94 0b 6f call 0xde16 ; 0xde16 18eea: 0f 90 pop r0 18eec: 0f 90 pop r0 18eee: 0f 90 pop r0 18ef0: 0f 90 pop r0 18ef2: 0f 90 pop r0 18ef4: 0f 90 pop r0 _T(MSG_LEFT), _T(MSG_RIGHT) ); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(11,2+i); 18ef6: 63 e0 ldi r22, 0x03 ; 3 18ef8: 8b e0 ldi r24, 0x0B ; 11 18efa: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA)); 18efe: 1d 8d ldd r17, Y+29 ; 0x1d 18f00: 0e 8d ldd r16, Y+30 ; 0x1e 18f02: ff 8c ldd r15, Y+31 ; 0x1f 18f04: e8 a0 ldd r14, Y+32 ; 0x20 18f06: 20 e0 ldi r18, 0x00 ; 0 18f08: 30 e0 ldi r19, 0x00 ; 0 18f0a: 48 e4 ldi r20, 0x48 ; 72 18f0c: 53 e4 ldi r21, 0x43 ; 67 18f0e: d8 01 movw r26, r16 18f10: f7 01 movw r30, r14 18f12: 6b 2f mov r22, r27 18f14: 7a 2f mov r23, r26 18f16: 8f 2f mov r24, r31 18f18: 9e 2f mov r25, r30 18f1a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 18f1e: 87 fd sbrc r24, 7 18f20: 32 c0 rjmp .+100 ; 0x18f86 18f22: 83 e7 ldi r24, 0x73 ; 115 18f24: 98 e4 ldi r25, 0x48 ; 72 18f26: 0e 94 3a 75 call 0xea74 ; 0xea74 18f2a: 0e 94 1d 6f call 0xde3a ; 0xde3a else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); } if (lcd_clicked()) 18f2e: 0e 94 75 73 call 0xe6ea ; 0xe6ea 18f32: 88 23 and r24, r24 18f34: 41 f0 breq .+16 ; 0x18f46 menu_goto(lcd_menu_xyz_skew, 0, true); 18f36: 20 e0 ldi r18, 0x00 ; 0 18f38: 41 e0 ldi r20, 0x01 ; 1 18f3a: 70 e0 ldi r23, 0x00 ; 0 18f3c: 60 e0 ldi r22, 0x00 ; 0 18f3e: 83 e3 ldi r24, 0x33 ; 51 18f40: 91 ed ldi r25, 0xD1 ; 209 18f42: 0e 94 b7 62 call 0xc56e ; 0xc56e } 18f46: a8 96 adiw r28, 0x28 ; 40 18f48: 0f b6 in r0, 0x3f ; 63 18f4a: f8 94 cli 18f4c: de bf out 0x3e, r29 ; 62 18f4e: 0f be out 0x3f, r0 ; 63 18f50: cd bf out 0x3d, r28 ; 61 18f52: df 91 pop r29 18f54: cf 91 pop r28 18f56: 1f 91 pop r17 18f58: 0f 91 pop r16 18f5a: ff 90 pop r15 18f5c: ef 90 pop r14 18f5e: df 90 pop r13 18f60: cf 90 pop r12 18f62: bf 90 pop r11 18f64: af 90 pop r10 18f66: 9f 90 pop r9 18f68: 8f 90 pop r8 18f6a: 7f 90 pop r7 18f6c: 6f 90 pop r6 18f6e: 5f 90 pop r5 18f70: 4f 90 pop r4 18f72: 3f 90 pop r3 18f74: 2f 90 pop r2 18f76: 08 95 ret _T(MSG_RIGHT) ); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(11,2+i); if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA)); 18f78: 83 e7 ldi r24, 0x73 ; 115 18f7a: 98 e4 ldi r25, 0x48 ; 72 18f7c: 0e 94 3a 75 call 0xea74 ; 0xea74 18f80: 0e 94 1d 6f call 0xde3a ; 0xde3a 18f84: b8 cf rjmp .-144 ; 0x18ef6 else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); 18f86: ef 92 push r14 18f88: ff 92 push r15 18f8a: 0f 93 push r16 18f8c: 1f 93 push r17 18f8e: 8a e5 ldi r24, 0x5A ; 90 18f90: 97 e6 ldi r25, 0x67 ; 103 18f92: 9f 93 push r25 18f94: 8f 93 push r24 18f96: 0e 94 0b 6f call 0xde16 ; 0xde16 18f9a: 0f 90 pop r0 18f9c: 0f 90 pop r0 18f9e: 0f 90 pop r0 18fa0: 0f 90 pop r0 18fa2: 0f 90 pop r0 18fa4: 0f 90 pop r0 18fa6: c3 cf rjmp .-122 ; 0x18f2e 00018fa8 : else value = !value; eeprom_update_byte_notify((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, value); } void lcd_reprint_from_eeprom() { 18fa8: ef 92 push r14 18faa: ff 92 push r15 18fac: 0f 93 push r16 18fae: 1f 93 push r17 18fb0: cf 93 push r28 18fb2: df 93 push r29 18fb4: cd b7 in r28, 0x3d ; 61 18fb6: de b7 in r29, 0x3e ; 62 18fb8: 6b 97 sbiw r28, 0x1b ; 27 18fba: 0f b6 in r0, 0x3f ; 63 18fbc: f8 94 cli 18fbe: de bf out 0x3e, r29 ; 62 18fc0: 0f be out 0x3f, r0 ; 63 18fc2: cd bf out 0x3d, r28 ; 61 void restore_file_from_sd() { char filename[FILENAME_LENGTH]; char dir_name[9]; char extension_ptr[5]; uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH); 18fc4: 8a e5 ldi r24, 0x5A ; 90 18fc6: 9f e0 ldi r25, 0x0F ; 15 18fc8: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 18fcc: e8 2e mov r14, r24 18fce: 0a e0 ldi r16, 0x0A ; 10 18fd0: 1f e0 ldi r17, 0x0F ; 15 for (uint8_t i = 0; i < depth; i++) { 18fd2: f1 2c mov r15, r1 card.chdir(dir_name, false); } // Recover DOS 8.3 filename without extension. // Short filenames are always null terminated. eeprom_read_block(filename, (const char *)EEPROM_FILENAME, 8); 18fd4: 48 e0 ldi r20, 0x08 ; 8 18fd6: 50 e0 ldi r21, 0x00 ; 0 char filename[FILENAME_LENGTH]; char dir_name[9]; char extension_ptr[5]; uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH); for (uint8_t i = 0; i < depth; i++) { 18fd8: ef 14 cp r14, r15 18fda: 79 f0 breq .+30 ; 0x18ffa eeprom_read_block(dir_name, (const char *)EEPROM_DIRS + 8 * i, 8); 18fdc: b8 01 movw r22, r16 18fde: ce 01 movw r24, r28 18fe0: 0e 96 adiw r24, 0x0e ; 14 18fe2: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 dir_name[8] = '\0'; 18fe6: 1e 8a std Y+22, r1 ; 0x16 card.chdir(dir_name, false); 18fe8: 60 e0 ldi r22, 0x00 ; 0 18fea: ce 01 movw r24, r28 18fec: 0e 96 adiw r24, 0x0e ; 14 18fee: 0f 94 bc 70 call 0x2e178 ; 0x2e178 char filename[FILENAME_LENGTH]; char dir_name[9]; char extension_ptr[5]; uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH); for (uint8_t i = 0; i < depth; i++) { 18ff2: f3 94 inc r15 18ff4: 08 5f subi r16, 0xF8 ; 248 18ff6: 1f 4f sbci r17, 0xFF ; 255 18ff8: ed cf rjmp .-38 ; 0x18fd4 card.chdir(dir_name, false); } // Recover DOS 8.3 filename without extension. // Short filenames are always null terminated. eeprom_read_block(filename, (const char *)EEPROM_FILENAME, 8); 18ffa: 65 e9 ldi r22, 0x95 ; 149 18ffc: 7f e0 ldi r23, 0x0F ; 15 18ffe: 8e 01 movw r16, r28 19000: 0f 5f subi r16, 0xFF ; 255 19002: 1f 4f sbci r17, 0xFF ; 255 19004: c8 01 movw r24, r16 19006: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 // Add null delimiter in case all 8 characters were not NULL filename[8] = '\0'; 1900a: 19 86 std Y+9, r1 ; 0x09 // Add extension to complete the DOS 8.3 filename e.g. ".gco" or ".g" extension_ptr[0] = '.'; 1900c: 8e e2 ldi r24, 0x2E ; 46 1900e: 8f 8b std Y+23, r24 ; 0x17 eeprom_read_block(&extension_ptr[1], (const char *)EEPROM_FILENAME_EXTENSION, 3); 19010: 43 e0 ldi r20, 0x03 ; 3 19012: 50 e0 ldi r21, 0x00 ; 0 19014: 61 e9 ldi r22, 0x91 ; 145 19016: 7c e0 ldi r23, 0x0C ; 12 19018: ce 01 movw r24, r28 1901a: 48 96 adiw r24, 0x18 ; 24 1901c: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 extension_ptr[4] = '\0'; 19020: 1b 8e std Y+27, r1 ; 0x1b strcat(filename, extension_ptr); 19022: be 01 movw r22, r28 19024: 69 5e subi r22, 0xE9 ; 233 19026: 7f 4f sbci r23, 0xFF ; 255 19028: c8 01 movw r24, r16 1902a: 0f 94 2c aa call 0x35458 ; 0x35458 enquecommandf_P(MSG_M23, filename); 1902e: 1f 93 push r17 19030: 0f 93 push r16 19032: 87 e6 ldi r24, 0x67 ; 103 19034: 9c e6 ldi r25, 0x6C ; 108 19036: 9f 93 push r25 19038: 8f 93 push r24 1903a: 0e 94 b7 8f call 0x11f6e ; 0x11f6e restore_file_from_sd(); // M24: Start/resume SD print enquecommand_P(MSG_M24); 1903e: 61 e0 ldi r22, 0x01 ; 1 19040: 83 e6 ldi r24, 0x63 ; 99 19042: 9c e6 ldi r25, 0x6C ; 108 19044: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 19048: 0f 94 d5 07 call 0x20faa ; 0x20faa 1904c: 0f 90 pop r0 1904e: 0f 90 pop r0 19050: 0f 90 pop r0 19052: 0f 90 pop r0 } 19054: 6b 96 adiw r28, 0x1b ; 27 19056: 0f b6 in r0, 0x3f ; 63 19058: f8 94 cli 1905a: de bf out 0x3e, r29 ; 62 1905c: 0f be out 0x3f, r0 ; 63 1905e: cd bf out 0x3d, r28 ; 61 19060: df 91 pop r29 19062: cf 91 pop r28 19064: 1f 91 pop r17 19066: 0f 91 pop r16 19068: ff 90 pop r15 1906a: ef 90 pop r14 1906c: 08 95 ret 0001906e : MENU_END(); } #ifdef PINDA_TEMP_COMP void lcd_pinda_temp_compensation_toggle() { 1906e: cf 93 push r28 uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION); 19070: 89 e2 ldi r24, 0x29 ; 41 19072: 9d e0 ldi r25, 0x0D ; 13 19074: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) // On MK2.5/S the EEPROM_EMPTY_VALUE will be set to 0 during eeprom_init. pinda_temp_compensation = 1; // But for MK3/S it should be 1 so SuperPINDA is "active" else pinda_temp_compensation = !pinda_temp_compensation; 19078: 81 50 subi r24, 0x01 ; 1 1907a: c1 e0 ldi r28, 0x01 ; 1 1907c: 8e 3f cpi r24, 0xFE ; 254 1907e: 08 f4 brcc .+2 ; 0x19082 19080: c0 e0 ldi r28, 0x00 ; 0 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 19082: 6c 2f mov r22, r28 19084: 89 e2 ldi r24, 0x29 ; 41 19086: 9d e0 ldi r25, 0x0D ; 13 19088: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION, pinda_temp_compensation); SERIAL_ECHOLNPGM("SuperPINDA:"); 1908c: 86 e1 ldi r24, 0x16 ; 22 1908e: 94 e8 ldi r25, 0x84 ; 132 19090: 0e 94 bd 7c call 0xf97a ; 0xf97a } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 19094: 8c 2f mov r24, r28 19096: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_ECHOLN(pinda_temp_compensation); } 1909a: cf 91 pop r28 } void MarlinSerial::println(unsigned char b, int base) { print(b, base); println(); 1909c: 0c 94 bc 7a jmp 0xf578 ; 0xf578 000190a0 : } static void lcd_move_y() { _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); } static void lcd_move_z() { _lcd_move(PSTR("Z:"), Z_AXIS, Z_MIN_POS, Z_MAX_POS); 190a0: 22 ed ldi r18, 0xD2 ; 210 190a2: 30 e0 ldi r19, 0x00 ; 0 190a4: 50 e0 ldi r21, 0x00 ; 0 190a6: 40 e0 ldi r20, 0x00 ; 0 190a8: 62 e0 ldi r22, 0x02 ; 2 190aa: 84 e8 ldi r24, 0x84 ; 132 190ac: 92 e8 ldi r25, 0x82 ; 130 190ae: 0d 94 b4 4c jmp 0x29968 ; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]> 000190b2 : } // Note: the colon behind the text (X, Y, Z) is necessary to greatly shorten // the implementation of menu_draw_float31 static void lcd_move_x() { _lcd_move(PSTR("X:"), X_AXIS, X_MIN_POS, X_MAX_POS); 190b2: 2a ef ldi r18, 0xFA ; 250 190b4: 30 e0 ldi r19, 0x00 ; 0 190b6: 50 e0 ldi r21, 0x00 ; 0 190b8: 40 e0 ldi r20, 0x00 ; 0 190ba: 60 e0 ldi r22, 0x00 ; 0 190bc: 8e e7 ldi r24, 0x7E ; 126 190be: 92 e8 ldi r25, 0x82 ; 130 190c0: 0d 94 b4 4c jmp 0x29968 ; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]> 000190c4 : } static void lcd_move_y() { _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); 190c4: 22 ed ldi r18, 0xD2 ; 210 190c6: 30 e0 ldi r19, 0x00 ; 0 190c8: 4c ef ldi r20, 0xFC ; 252 190ca: 5f ef ldi r21, 0xFF ; 255 190cc: 61 e0 ldi r22, 0x01 ; 1 190ce: 81 e8 ldi r24, 0x81 ; 129 190d0: 92 e8 ldi r25, 0x82 ; 130 190d2: 0d 94 b4 4c jmp 0x29968 ; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]> 000190d6 : { return lcd_status_message_level; } void menu_lcd_longpress_func(void) { 190d6: cf 93 push r28 190d8: df 93 push r29 // Wake up the LCD backlight and, // start LCD inactivity timer lcd_timeoutToStatus.start(); 190da: 83 ee ldi r24, 0xE3 ; 227 190dc: 93 e0 ldi r25, 0x03 ; 3 190de: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> if (homing_flag || mesh_bed_leveling_flag || menu_menu == lcd_babystep_z || menu_menu == lcd_move_z || menu_is_any_block() || Stopped) 190e2: 80 91 71 12 lds r24, 0x1271 ; 0x801271 190e6: 81 11 cpse r24, r1 190e8: 18 c0 rjmp .+48 ; 0x1911a 190ea: 80 91 72 12 lds r24, 0x1272 ; 0x801272 190ee: 81 11 cpse r24, r1 190f0: 14 c0 rjmp .+40 ; 0x1911a 190f2: c0 91 02 04 lds r28, 0x0402 ; 0x800402 190f6: d0 91 03 04 lds r29, 0x0403 ; 0x800403 190fa: 87 ed ldi r24, 0xD7 ; 215 190fc: c8 36 cpi r28, 0x68 ; 104 190fe: d8 07 cpc r29, r24 19100: 61 f0 breq .+24 ; 0x1911a 19102: 88 ec ldi r24, 0xC8 ; 200 19104: c0 35 cpi r28, 0x50 ; 80 19106: d8 07 cpc r29, r24 19108: 41 f0 breq .+16 ; 0x1911a 1910a: 80 91 3a 12 lds r24, 0x123A ; 0x80123a 1910e: 81 11 cpse r24, r1 19110: 04 c0 rjmp .+8 ; 0x1911a 19112: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 19116: 88 23 and r24, r24 19118: 31 f0 breq .+12 ; 0x19126 { // disable longpress during re-entry, while homing, calibration or if a serious error lcd_draw_update = 2; 1911a: 82 e0 ldi r24, 0x02 ; 2 1911c: 80 93 59 02 sts 0x0259, r24 ; 0x800259 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 19120: df 91 pop r29 19122: cf 91 pop r28 19124: 08 95 ret { // disable longpress during re-entry, while homing, calibration or if a serious error lcd_draw_update = 2; return; } if (menu_menu == lcd_hw_setup_menu) 19126: 81 ec ldi r24, 0xC1 ; 193 19128: cb 35 cpi r28, 0x5B ; 91 1912a: d8 07 cpc r29, r24 1912c: 81 f4 brne .+32 ; 0x1914e { // only toggle the experimental menu visibility flag lcd_draw_update = 2; 1912e: 82 e0 ldi r24, 0x02 ; 2 19130: 80 93 59 02 sts 0x0259, r24 ; 0x800259 eeprom_update_byte_notify(dst++, pgm_read_byte(src++)); } } void eeprom_toggle(uint8_t *__p) { eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); 19134: 8a e2 ldi r24, 0x2A ; 42 19136: 9d e0 ldi r25, 0x0D ; 13 19138: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1913c: 61 e0 ldi r22, 0x01 ; 1 1913e: 81 11 cpse r24, r1 19140: 60 e0 ldi r22, 0x00 ; 0 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); 19142: 8a e2 ldi r24, 0x2A ; 42 19144: 9d e0 ldi r25, 0x0D ; 13 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 19146: df 91 pop r29 19148: cf 91 pop r28 1914a: 0d 94 28 a4 jmp 0x34850 ; 0x34850 1914e: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 19152: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f return; } // explicitely listed menus which are allowed to rise the move-z or live-adj-z functions // The lists are not the same for both functions, so first decide which function is to be performed if (blocks_queued() || printJobOngoing()){ // long press as live-adj-z 19156: 98 13 cpse r25, r24 19158: 04 c0 rjmp .+8 ; 0x19162 1915a: 0e 94 40 66 call 0xcc80 ; 0xcc80 1915e: 88 23 and r24, r24 19160: 61 f0 breq .+24 ; 0x1917a if ( babystep_allowed_strict() 19162: 0e 94 7b 66 call 0xccf6 ; 0xccf6 && (menu_menu == lcd_status_screen // and in listed menus... 19166: 81 11 cpse r24, r1 19168: 10 c0 rjmp .+32 ; 0x1918a Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); } void lcd_quick_feedback(void) { lcd_draw_update = 2; 1916a: 82 e0 ldi r24, 0x02 ; 2 1916c: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 19170: 80 e0 ldi r24, 0x00 ; 0 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 19172: df 91 pop r29 19174: cf 91 pop r28 19176: 0d 94 ad 25 jmp 0x24b5a ; 0x24b5a menu_submenu(lcd_babystep_z); } else { lcd_quick_feedback(); } } else { // long press as move-z if (menu_menu == lcd_status_screen 1917a: 87 e3 ldi r24, 0x37 ; 55 1917c: c0 32 cpi r28, 0x20 ; 32 1917e: d8 07 cpc r29, r24 19180: e1 f4 brne .+56 ; 0x191ba #if (LANG_MODE != 0) || menu_menu == lcd_language #endif || menu_menu == lcd_support_menu ){ menu_submenu(lcd_move_z); 19182: 60 e0 ldi r22, 0x00 ; 0 19184: 80 e5 ldi r24, 0x50 ; 80 19186: 98 ec ldi r25, 0xC8 ; 200 19188: 14 c0 rjmp .+40 ; 0x191b2 // explicitely listed menus which are allowed to rise the move-z or live-adj-z functions // The lists are not the same for both functions, so first decide which function is to be performed if (blocks_queued() || printJobOngoing()){ // long press as live-adj-z if ( babystep_allowed_strict() && (menu_menu == lcd_status_screen // and in listed menus... 1918a: 87 e3 ldi r24, 0x37 ; 55 1918c: c0 32 cpi r28, 0x20 ; 32 1918e: d8 07 cpc r29, r24 19190: 59 f0 breq .+22 ; 0x191a8 || menu_menu == lcd_main_menu 19192: 88 ec ldi r24, 0xC8 ; 200 19194: ca 3f cpi r28, 0xFA ; 250 19196: d8 07 cpc r29, r24 19198: 39 f0 breq .+14 ; 0x191a8 || menu_menu == lcd_tune_menu 1919a: 8c ec ldi r24, 0xCC ; 204 1919c: c7 32 cpi r28, 0x27 ; 39 1919e: d8 07 cpc r29, r24 191a0: 19 f0 breq .+6 ; 0x191a8 || menu_menu == lcd_support_menu 191a2: c2 5e subi r28, 0xE2 ; 226 191a4: d6 43 sbci r29, 0x36 ; 54 191a6: 09 f7 brne .-62 ; 0x1916a ) ){ lcd_clear(); 191a8: 0e 94 26 70 call 0xe04c ; 0xe04c menu_submenu(lcd_babystep_z); 191ac: 60 e0 ldi r22, 0x00 ; 0 191ae: 88 e6 ldi r24, 0x68 ; 104 191b0: 97 ed ldi r25, 0xD7 ; 215 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 191b2: df 91 pop r29 191b4: cf 91 pop r28 #if (LANG_MODE != 0) || menu_menu == lcd_language #endif || menu_menu == lcd_support_menu ){ menu_submenu(lcd_move_z); 191b6: 0c 94 dd 62 jmp 0xc5ba ; 0xc5ba } else { lcd_quick_feedback(); } } else { // long press as move-z if (menu_menu == lcd_status_screen || menu_menu == lcd_main_menu 191ba: 88 ec ldi r24, 0xC8 ; 200 191bc: ca 3f cpi r28, 0xFA ; 250 191be: d8 07 cpc r29, r24 191c0: 01 f3 breq .-64 ; 0x19182 || menu_menu == lcd_preheat_menu 191c2: 87 e3 ldi r24, 0x37 ; 55 191c4: c6 37 cpi r28, 0x76 ; 118 191c6: d8 07 cpc r29, r24 191c8: e1 f2 breq .-72 ; 0x19182 || menu_menu == lcd_sdcard_menu 191ca: 85 ee ldi r24, 0xE5 ; 229 191cc: c0 3a cpi r28, 0xA0 ; 160 191ce: d8 07 cpc r29, r24 191d0: c1 f2 breq .-80 ; 0x19182 || menu_menu == lcd_settings_menu 191d2: 8c ec ldi r24, 0xCC ; 204 191d4: c5 3e cpi r28, 0xE5 ; 229 191d6: d8 07 cpc r29, r24 191d8: a1 f2 breq .-88 ; 0x19182 || menu_menu == lcd_control_temperature_menu 191da: 8b ec ldi r24, 0xCB ; 203 191dc: ce 34 cpi r28, 0x4E ; 78 191de: d8 07 cpc r29, r24 191e0: 81 f2 breq .-96 ; 0x19182 #if (LANG_MODE != 0) || menu_menu == lcd_language 191e2: 84 ec ldi r24, 0xC4 ; 196 191e4: c9 34 cpi r28, 0x49 ; 73 191e6: d8 07 cpc r29, r24 191e8: 61 f2 breq .-104 ; 0x19182 #endif || menu_menu == lcd_support_menu 191ea: c2 5e subi r28, 0xE2 ; 226 191ec: d6 43 sbci r29, 0x36 ; 54 191ee: 09 f0 breq .+2 ; 0x191f2 191f0: bc cf rjmp .-136 ; 0x1916a 191f2: c7 cf rjmp .-114 ; 0x19182 000191f4 : //! | Fail stats | allways //! | Fail stats MMU | mmu //! | Support | allways //! @endcode static void lcd_main_menu() { 191f4: 1f 93 push r17 191f6: cf 93 push r28 191f8: df 93 push r29 MENU_BEGIN(); 191fa: 0e 94 0c 74 call 0xe818 ; 0xe818 191fe: 10 92 60 04 sts 0x0460, r1 ; 0x800460 #endif //SDSUPPORT if(!farm_mode) { const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); const int8_t nextSheet = eeprom_next_initialized_sheet(sheet); if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet); 19202: 1b e0 ldi r17, 0x0B ; 11 #ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code if (card.mounted || lcd_commands_type != LcdCommands::Idle) { if (!card.isFileOpen()) { if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) { bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function 19204: d1 e0 ldi r29, 0x01 ; 1 //! | Support | allways //! @endcode static void lcd_main_menu() { MENU_BEGIN(); 19206: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1920a: 84 30 cpi r24, 0x04 ; 4 1920c: 08 f0 brcs .+2 ; 0x19210 1920e: 09 c2 rjmp .+1042 ; 0x19622 19210: 10 92 63 04 sts 0x0463, r1 ; 0x800463 // Majkl superawesome menu MENU_ITEM_BACK_P(_T(MSG_INFO_SCREEN)); 19214: 87 e0 ldi r24, 0x07 ; 7 19216: 98 e4 ldi r25, 0x48 ; 72 19218: 0e 94 3a 75 call 0xea74 ; 0xea74 1921c: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_FUNCTION_P(PSTR("recover print"), recover_print); MENU_ITEM_FUNCTION_P(PSTR("power panic"), uvlo_); #endif //TMC2130_DEBUG // Menu item for reprint if (!printer_active() && !printer_recovering() && (heating_status == HeatingStatus::NO_HEATING)) { 19220: 0e 94 91 66 call 0xcd22 ; 0xcd22 19224: 81 11 cpse r24, r1 19226: 19 c0 rjmp .+50 ; 0x1925a 19228: 0e 94 2b 66 call 0xcc56 ; 0xcc56 1922c: 81 11 cpse r24, r1 1922e: 15 c0 rjmp .+42 ; 0x1925a 19230: 80 91 cb 03 lds r24, 0x03CB ; 0x8003cb 19234: 81 11 cpse r24, r1 19236: 11 c0 rjmp .+34 ; 0x1925a #include "printer_state.h" static PrinterState printer_state; PrinterState GetPrinterState() { return printer_state; 19238: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> if ((GetPrinterState() == PrinterState::SDPrintingFinished) && card.mounted) { 1923c: 83 30 cpi r24, 0x03 ; 3 1923e: 09 f0 breq .+2 ; 0x19242 19240: 5d c0 rjmp .+186 ; 0x192fc 19242: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 19246: 88 23 and r24, r24 19248: 41 f0 breq .+16 ; 0x1925a MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_reprint_from_eeprom); 1924a: 8d ef ldi r24, 0xFD ; 253 1924c: 97 e4 ldi r25, 0x47 ; 71 1924e: 0e 94 3a 75 call 0xea74 ; 0xea74 19252: 64 ed ldi r22, 0xD4 ; 212 19254: 77 ec ldi r23, 0xC7 ; 199 } else if ((GetPrinterState() == PrinterState::HostPrintingFinished) && M79_timer_get_status()) { MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start); 19256: 0e 94 9d 72 call 0xe53a ; 0xe53a } } // Menu is never shown when idle if (babystep_allowed_strict() && (printJobOngoing() || lcd_commands_type == LcdCommands::Layer1Cal)) 1925a: 0e 94 7b 66 call 0xccf6 ; 0xccf6 1925e: 88 23 and r24, r24 19260: 81 f0 breq .+32 ; 0x19282 19262: 0e 94 40 66 call 0xcc80 ; 0xcc80 19266: 81 11 cpse r24, r1 19268: 04 c0 rjmp .+8 ; 0x19272 1926a: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1926e: 84 30 cpi r24, 0x04 ; 4 19270: 41 f4 brne .+16 ; 0x19282 MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8 19272: 8d ee ldi r24, 0xED ; 237 19274: 97 e4 ldi r25, 0x47 ; 71 19276: 0e 94 3a 75 call 0xea74 ; 0xea74 1927a: 68 e6 ldi r22, 0x68 ; 104 1927c: 77 ed ldi r23, 0xD7 ; 215 1927e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 if (farm_mode) 19282: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19286: 88 23 and r24, r24 19288: 41 f0 breq .+16 ; 0x1929a MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8 1928a: 82 e4 ldi r24, 0x42 ; 66 1928c: 98 e4 ldi r25, 0x48 ; 72 1928e: 0e 94 3a 75 call 0xea74 ; 0xea74 19292: 65 ea ldi r22, 0xA5 ; 165 19294: 7e ed ldi r23, 0xDE ; 222 19296: 0e 94 9d 72 call 0xe53a ; 0xe53a if (!printer_recovering()) { 1929a: 0e 94 2b 66 call 0xcc56 ; 0xcc56 1929e: 81 11 cpse r24, r1 192a0: 61 c0 rjmp .+194 ; 0x19364 } //return the nr of buffered moves FORCE_INLINE uint8_t moves_planned() { return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); 192a2: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 192a6: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 192aa: 89 1b sub r24, r25 192ac: 8f 70 andi r24, 0x0F ; 15 if ( moves_planned() || printer_active() #ifdef FANCHECK || fan_check_error == EFCE_REPORTED 192ae: a9 f5 brne .+106 ; 0x1931a if (farm_mode) MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8 if (!printer_recovering()) { if ( moves_planned() || printer_active() 192b0: 0e 94 91 66 call 0xcd22 ; 0xcd22 192b4: 81 11 cpse r24, r1 192b6: 31 c0 rjmp .+98 ; 0x1931a #ifdef FANCHECK || fan_check_error == EFCE_REPORTED 192b8: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 192bc: 82 30 cpi r24, 0x02 ; 2 192be: 69 f1 breq .+90 ; 0x1931a #endif //End FANCHECK ) { MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu); } else if (!Stopped) { 192c0: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 192c4: 81 11 cpse r24, r1 192c6: 31 c0 rjmp .+98 ; 0x1932a MENU_ITEM_SUBMENU_P(_T(MSG_PREHEAT), lcd_preheat_menu); 192c8: 8c ed ldi r24, 0xDC ; 220 192ca: 97 e4 ldi r25, 0x47 ; 71 192cc: 0e 94 3a 75 call 0xea74 ; 0xea74 192d0: 66 e7 ldi r22, 0x76 ; 118 192d2: 77 e3 ldi r23, 0x37 ; 55 192d4: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 if (M79_timer_get_status()) { 192d8: 80 91 8c 03 lds r24, 0x038C ; 0x80038c <_ZL9M79_timer.lto_priv.421> 192dc: 88 23 and r24, r24 192de: 29 f1 breq .+74 ; 0x1932a #ifndef REPLACE_SETREADY if(GetPrinterState() == PrinterState::IsReady) { 192e0: 80 91 61 0d lds r24, 0x0D61 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 192e4: 81 30 cpi r24, 0x01 ; 1 192e6: 09 f0 breq .+2 ; 0x192ea 192e8: 45 c1 rjmp .+650 ; 0x19574 MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle); 192ea: 8c ec ldi r24, 0xCC ; 204 192ec: 97 e4 ldi r25, 0x47 ; 71 } else { MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle); 192ee: 0e 94 3a 75 call 0xea74 ; 0xea74 192f2: 63 ec ldi r22, 0xC3 ; 195 192f4: 7e eb ldi r23, 0xBE ; 190 192f6: 0e 94 9d 72 call 0xe53a ; 0xe53a 192fa: 17 c0 rjmp .+46 ; 0x1932a // Menu item for reprint if (!printer_active() && !printer_recovering() && (heating_status == HeatingStatus::NO_HEATING)) { if ((GetPrinterState() == PrinterState::SDPrintingFinished) && card.mounted) { MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_reprint_from_eeprom); } else if ((GetPrinterState() == PrinterState::HostPrintingFinished) && M79_timer_get_status()) { 192fc: 84 30 cpi r24, 0x04 ; 4 192fe: 09 f0 breq .+2 ; 0x19302 19300: ac cf rjmp .-168 ; 0x1925a 19302: 80 91 8c 03 lds r24, 0x038C ; 0x80038c <_ZL9M79_timer.lto_priv.421> 19306: 88 23 and r24, r24 19308: 09 f4 brne .+2 ; 0x1930c 1930a: a7 cf rjmp .-178 ; 0x1925a MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start); 1930c: 8d ef ldi r24, 0xFD ; 253 1930e: 97 e4 ldi r25, 0x47 ; 71 19310: 0e 94 3a 75 call 0xea74 ; 0xea74 19314: 6d eb ldi r22, 0xBD ; 189 19316: 7e eb ldi r23, 0xBE ; 190 19318: 9e cf rjmp .-196 ; 0x19256 if ( moves_planned() || printer_active() #ifdef FANCHECK || fan_check_error == EFCE_REPORTED #endif //End FANCHECK ) { MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu); 1931a: 86 ee ldi r24, 0xE6 ; 230 1931c: 97 e4 ldi r25, 0x47 ; 71 1931e: 0e 94 3a 75 call 0xea74 ; 0xea74 19322: 67 e2 ldi r22, 0x27 ; 39 19324: 7c ec ldi r23, 0xCC ; 204 19326: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #else MENU_ITEM_FUNCTION_P(_T(MSG_HOSTPRINT), lcd_send_action_start); #endif //REPLACE_SETREADY } } if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) { 1932a: c0 91 72 12 lds r28, 0x1272 ; 0x801272 1932e: 0e 94 35 66 call 0xcc6a ; 0xcc6a 19332: c1 11 cpse r28, r1 19334: 17 c0 rjmp .+46 ; 0x19364 19336: 90 91 71 12 lds r25, 0x1271 ; 0x801271 1933a: 91 11 cpse r25, r1 1933c: 13 c0 rjmp .+38 ; 0x19364 1933e: 81 11 cpse r24, r1 19340: 15 c0 rjmp .+42 ; 0x1936c 19342: 80 91 91 03 lds r24, 0x0391 ; 0x800391 19346: 81 11 cpse r24, r1 19348: 0d c0 rjmp .+26 ; 0x19364 if (usb_timer.running()) { 1934a: 80 91 42 12 lds r24, 0x1242 ; 0x801242 1934e: 88 23 and r24, r24 19350: 09 f4 brne .+2 ; 0x19354 19352: 13 c1 rjmp .+550 ; 0x1957a MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print); 19354: 82 eb ldi r24, 0xB2 ; 178 19356: 97 e4 ldi r25, 0x47 ; 71 19358: 0e 94 3a 75 call 0xea74 ; 0xea74 1935c: 62 eb ldi r22, 0xB2 ; 178 1935e: 78 e3 ldi r23, 0x38 ; 56 } else if (IS_SD_PRINTING) { MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print); 19360: 0e 94 9d 72 call 0xe53a ; 0xe53a } } } if (printingIsPaused() 19364: 0e 94 35 66 call 0xcc6a ; 0xcc6a && !get_temp_error() #ifdef FANCHECK && fan_check_error != EFCE_REPORTED #endif //FANCHECK && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing) && custom_message_type != CustomMsg::Resuming) { 19368: 88 23 and r24, r24 1936a: f1 f0 breq .+60 ; 0x193a8 temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; 1936c: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> } } } if (printingIsPaused() // only allow resuming if hardware errors (temperature or fan) are cleared && !get_temp_error() 19370: 81 11 cpse r24, r1 19372: 1a c0 rjmp .+52 ; 0x193a8 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 19374: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 19378: 82 30 cpi r24, 0x02 ; 2 1937a: b1 f0 breq .+44 ; 0x193a8 #endif //FANCHECK && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing) 1937c: 80 91 79 02 lds r24, 0x0279 ; 0x800279 19380: 82 30 cpi r24, 0x02 ; 2 19382: 21 f4 brne .+8 ; 0x1938c 19384: 90 91 73 12 lds r25, 0x1273 ; 0x801273 19388: 99 23 and r25, r25 1938a: 71 f0 breq .+28 ; 0x193a8 && custom_message_type != CustomMsg::Resuming) { 1938c: 90 91 5d 06 lds r25, 0x065D ; 0x80065d 19390: 98 30 cpi r25, 0x08 ; 8 19392: 51 f0 breq .+20 ; 0x193a8 if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { 19394: 81 11 cpse r24, r1 19396: fd c0 rjmp .+506 ; 0x19592 MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print); 19398: 83 ea ldi r24, 0xA3 ; 163 1939a: 97 e4 ldi r25, 0x47 ; 71 1939c: 0e 94 3a 75 call 0xea74 ; 0xea74 193a0: 69 eb ldi r22, 0xB9 ; 185 193a2: 7e ed ldi r23, 0xDE ; 222 } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) { MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print); 193a4: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } } if((printJobOngoing() || printingIsPaused() || (printer_recovering())) 193a8: 0e 94 40 66 call 0xcc80 ; 0xcc80 && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { 193ac: 81 11 cpse r24, r1 193ae: 08 c0 rjmp .+16 ; 0x193c0 MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print); } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) { MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print); } } if((printJobOngoing() || printingIsPaused() || (printer_recovering())) 193b0: 0e 94 35 66 call 0xcc6a ; 0xcc6a 193b4: 81 11 cpse r24, r1 193b6: 04 c0 rjmp .+8 ; 0x193c0 193b8: 0e 94 2b 66 call 0xcc56 ; 0xcc56 193bc: 88 23 and r24, r24 193be: 81 f0 breq .+32 ; 0x193e0 && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { 193c0: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 193c4: 81 30 cpi r24, 0x01 ; 1 193c6: 61 f0 breq .+24 ; 0x193e0 193c8: 80 91 91 03 lds r24, 0x0391 ; 0x800391 193cc: 81 11 cpse r24, r1 193ce: 08 c0 rjmp .+16 ; 0x193e0 MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop); 193d0: 84 ea ldi r24, 0xA4 ; 164 193d2: 98 e4 ldi r25, 0x48 ; 72 193d4: 0e 94 3a 75 call 0xea74 ; 0xea74 193d8: 65 e2 ldi r22, 0x25 ; 37 193da: 72 ec ldi r23, 0xC2 ; 194 193dc: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop); } #endif // only allow starting SD print if hardware errors (temperature or fan) are cleared if (!printer_recovering() && !printer_active() && !get_temp_error() 193e0: 0e 94 2b 66 call 0xcc56 ; 0xcc56 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 193e4: 81 11 cpse r24, r1 193e6: 95 c0 rjmp .+298 ; 0x19512 MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop); } #endif // only allow starting SD print if hardware errors (temperature or fan) are cleared if (!printer_recovering() && !printer_active() && !get_temp_error() 193e8: 0e 94 91 66 call 0xcd22 ; 0xcd22 193ec: 81 11 cpse r24, r1 193ee: 91 c0 rjmp .+290 ; 0x19512 193f0: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 193f4: 81 11 cpse r24, r1 193f6: 8d c0 rjmp .+282 ; 0x19512 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 193f8: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 193fc: 82 30 cpi r24, 0x02 ; 2 193fe: 09 f4 brne .+2 ; 0x19402 19400: 88 c0 rjmp .+272 ; 0x19512 #endif //FANCHECK ) { #ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code if (card.mounted 19402: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 19406: 81 11 cpse r24, r1 19408: 05 c0 rjmp .+10 ; 0x19414 || lcd_commands_type != LcdCommands::Idle) { 1940a: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1940e: 88 23 and r24, r24 19410: 09 f4 brne .+2 ; 0x19414 19412: ce c0 rjmp .+412 ; 0x195b0 if (!card.isFileOpen()) { 19414: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 19418: 81 11 cpse r24, r1 1941a: 12 c0 rjmp .+36 ; 0x19440 if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) { 1941c: 80 91 42 12 lds r24, 0x1242 ; 0x801242 19420: 81 11 cpse r24, r1 19422: 0e c0 rjmp .+28 ; 0x19440 19424: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 19428: 81 11 cpse r24, r1 1942a: 0a c0 rjmp .+20 ; 0x19440 bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function 1942c: d0 93 c9 03 sts 0x03C9, r29 ; 0x8003c9 MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu); 19430: 83 e9 ldi r24, 0x93 ; 147 19432: 97 e4 ldi r25, 0x47 ; 71 19434: 0e 94 3a 75 call 0xea74 ; 0xea74 19438: 60 ea ldi r22, 0xA0 ; 160 1943a: 75 ee ldi r23, 0xE5 ; 229 1943c: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #if SDCARDDETECT < 1 MENU_ITEM_GCODE_P(_T(MSG_INIT_SDCARD), PSTR("M21")); // Manually initialize the SD-card via user interface #endif //SDCARDDETECT } #endif //SDSUPPORT if(!farm_mode) { 19440: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19444: 81 11 cpse r24, r1 19446: 12 c0 rjmp .+36 ; 0x1946c const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 19448: 81 ea ldi r24, 0xA1 ; 161 1944a: 9d e0 ldi r25, 0x0D ; 13 1944c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19450: c8 2f mov r28, r24 const int8_t nextSheet = eeprom_next_initialized_sheet(sheet); 19452: 0e 94 96 78 call 0xf12c ; 0xf12c if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized 19456: 87 fd sbrc r24, 7 19458: 09 c0 rjmp .+18 ; 0x1946c 1945a: c8 17 cp r28, r24 1945c: 39 f0 breq .+14 ; 0x1946c MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet); 1945e: c1 02 muls r28, r17 19460: c0 01 movw r24, r0 19462: 11 24 eor r1, r1 19464: 87 5b subi r24, 0xB7 ; 183 19466: 92 4f sbci r25, 0xF2 ; 242 19468: 0e 94 2f be call 0x17c5e ; 0x17c5e SETTINGS_NOZZLE; #endif //QUICK_NOZZLE_CHANGE } if (!((eFilamentAction != FilamentAction::None) || Stopped )) { 1946c: 80 91 94 03 lds r24, 0x0394 ; 0x800394 19470: 81 11 cpse r24, r1 19472: 4f c0 rjmp .+158 ; 0x19512 19474: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 19478: 81 11 cpse r24, r1 1947a: 4b c0 rjmp .+150 ; 0x19512 if (MMU2::mmu2.Enabled()) { 1947c: 80 91 01 13 lds r24, 0x1301 ; 0x801301 19480: 81 30 cpi r24, 0x01 ; 1 19482: 09 f0 breq .+2 ; 0x19486 19484: 9e c0 rjmp .+316 ; 0x195c2 if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) { 19486: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 1948a: 81 11 cpse r24, r1 1948c: 0c c0 rjmp .+24 ; 0x194a6 1948e: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 19492: 81 11 cpse r24, r1 19494: 08 c0 rjmp .+16 ; 0x194a6 // The MMU 'Load filament' state machine will reject the command if any // filament sensor is reporting a detected filament MENU_ITEM_SUBMENU_P(_T(MSG_PRELOAD_TO_MMU), mmu_preload_filament_menu); 19496: 85 e7 ldi r24, 0x75 ; 117 19498: 97 e4 ldi r25, 0x47 ; 71 1949a: 0e 94 3a 75 call 0xea74 ; 0xea74 1949e: 62 e9 ldi r22, 0x92 ; 146 194a0: 7f ec ldi r23, 0xCF ; 207 194a2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_TO_NOZZLE), lcd_mmuLoadFilament); 194a6: 84 e6 ldi r24, 0x64 ; 100 194a8: 97 e4 ldi r25, 0x47 ; 71 194aa: 0e 94 3a 75 call 0xea74 ; 0xea74 194ae: 69 ec ldi r22, 0xC9 ; 201 194b0: 7f ec ldi r23, 0xCF ; 207 194b2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_mmuUnloadFilament); 194b6: 82 e5 ldi r24, 0x52 ; 82 194b8: 97 e4 ldi r25, 0x47 ; 71 194ba: 0e 94 3a 75 call 0xea74 ; 0xea74 194be: 6c ec ldi r22, 0xCC ; 204 194c0: 7f ec ldi r23, 0xCF ; 207 194c2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FROM_MMU), lcd_mmuEjectFilament); 194c6: 8c ed ldi r24, 0xDC ; 220 194c8: 91 e6 ldi r25, 0x61 ; 97 194ca: 0e 94 3a 75 call 0xea74 ; 0xea74 194ce: 6f ec ldi r22, 0xCF ; 207 194d0: 7f ec ldi r23, 0xCF ; 207 194d2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #ifdef MMU_HAS_CUTTER if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0) { 194d6: 8e ec ldi r24, 0xCE ; 206 194d8: 9e e0 ldi r25, 0x0E ; 14 194da: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 194de: 88 23 and r24, r24 194e0: 41 f0 breq .+16 ; 0x194f2 MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament); 194e2: 8d ec ldi r24, 0xCD ; 205 194e4: 91 e6 ldi r25, 0x61 ; 97 194e6: 0e 94 3a 75 call 0xea74 ; 0xea74 194ea: 62 ed ldi r22, 0xD2 ; 210 194ec: 7f ec ldi r23, 0xCF ; 207 } #endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY } else { #endif //FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); 194ee: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #ifdef FILAMENT_SENSOR } #endif //FILAMENT_SENSOR } MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu); 194f2: 8e e8 ldi r24, 0x8E ; 142 194f4: 98 e4 ldi r25, 0x48 ; 72 194f6: 0e 94 3a 75 call 0xea74 ; 0xea74 194fa: 65 ee ldi r22, 0xE5 ; 229 194fc: 7c ec ldi r23, 0xCC ; 204 194fe: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu); 19502: 80 e2 ldi r24, 0x20 ; 32 19504: 97 e4 ldi r25, 0x47 ; 71 19506: 0e 94 3a 75 call 0xea74 ; 0xea74 1950a: 61 e4 ldi r22, 0x41 ; 65 1950c: 7e ec ldi r23, 0xCE ; 206 1950e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } } MENU_ITEM_SUBMENU_P(_T(MSG_STATISTICS), lcd_menu_statistics); 19512: 83 e1 ldi r24, 0x13 ; 19 19514: 97 e4 ldi r25, 0x47 ; 71 19516: 0e 94 3a 75 call 0xea74 ; 0xea74 1951a: 60 e3 ldi r22, 0x30 ; 48 1951c: 77 e3 ldi r23, 0x37 ; 55 1951e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #if defined(TMC2130) || defined(FILAMENT_SENSOR) MENU_ITEM_SUBMENU_P(_T(MSG_FAIL_STATS), lcd_menu_fails_stats); 19522: 86 e0 ldi r24, 0x06 ; 6 19524: 97 e4 ldi r25, 0x47 ; 71 19526: 0e 94 3a 75 call 0xea74 ; 0xea74 1952a: 64 eb ldi r22, 0xB4 ; 180 1952c: 78 e3 ldi r23, 0x38 ; 56 1952e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #endif if (MMU2::mmu2.Enabled()) { 19532: 80 91 01 13 lds r24, 0x1301 ; 0x801301 19536: 81 30 cpi r24, 0x01 ; 1 19538: 41 f4 brne .+16 ; 0x1954a MENU_ITEM_SUBMENU_P(_T(MSG_MMU_FAIL_STATS), lcd_menu_fails_stats_mmu); 1953a: 85 ef ldi r24, 0xF5 ; 245 1953c: 96 e4 ldi r25, 0x46 ; 70 1953e: 0e 94 3a 75 call 0xea74 ; 0xea74 19542: 64 ed ldi r22, 0xD4 ; 212 19544: 76 e3 ldi r23, 0x36 ; 54 19546: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 if (!printer_active() && M79_timer_get_status()) { MENU_ITEM_FUNCTION_P(_T(MSG_SHUTDOWN_HOST), lcd_shutdown_menu); } #endif //HOST_SHUTOWN MENU_ITEM_SUBMENU_P(_T(MSG_SUPPORT), lcd_support_menu); 1954a: 8b ee ldi r24, 0xEB ; 235 1954c: 96 e4 ldi r25, 0x46 ; 70 1954e: 0e 94 3a 75 call 0xea74 ; 0xea74 19552: 62 ee ldi r22, 0xE2 ; 226 19554: 76 e3 ldi r23, 0x36 ; 54 19556: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_END(); 1955a: 0e 94 83 62 call 0xc506 ; 0xc506 //! | Support | allways //! @endcode static void lcd_main_menu() { MENU_BEGIN(); 1955e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19562: 8f 5f subi r24, 0xFF ; 255 19564: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19568: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1956c: 8f 5f subi r24, 0xFF ; 255 1956e: 80 93 62 04 sts 0x0462, r24 ; 0x800462 19572: 49 ce rjmp .-878 ; 0x19206 if (M79_timer_get_status()) { #ifndef REPLACE_SETREADY if(GetPrinterState() == PrinterState::IsReady) { MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle); } else { MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle); 19574: 80 ec ldi r24, 0xC0 ; 192 19576: 97 e4 ldi r25, 0x47 ; 71 19578: ba ce rjmp .-652 ; 0x192ee } } if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) { if (usb_timer.running()) { MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print); } else if (IS_SD_PRINTING) { 1957a: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 1957e: 88 23 and r24, r24 19580: 09 f4 brne .+2 ; 0x19584 19582: f0 ce rjmp .-544 ; 0x19364 MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print); 19584: 82 eb ldi r24, 0xB2 ; 178 19586: 97 e4 ldi r25, 0x47 ; 71 19588: 0e 94 3a 75 call 0xea74 ; 0xea74 1958c: 6c ea ldi r22, 0xAC ; 172 1958e: 78 e3 ldi r23, 0x38 ; 56 19590: e7 ce rjmp .-562 ; 0x19360 #endif //FANCHECK && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing) && custom_message_type != CustomMsg::Resuming) { if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print); } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) { 19592: 81 30 cpi r24, 0x01 ; 1 19594: 09 f0 breq .+2 ; 0x19598 19596: 08 cf rjmp .-496 ; 0x193a8 19598: 80 91 8c 03 lds r24, 0x038C ; 0x80038c <_ZL9M79_timer.lto_priv.421> 1959c: 88 23 and r24, r24 1959e: 09 f4 brne .+2 ; 0x195a2 195a0: 03 cf rjmp .-506 ; 0x193a8 MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print); 195a2: 83 ea ldi r24, 0xA3 ; 163 195a4: 97 e4 ldi r25, 0x47 ; 71 195a6: 0e 94 3a 75 call 0xea74 ; 0xea74 195aa: 6b e8 ldi r22, 0x8B ; 139 195ac: 7e ed ldi r23, 0xDE ; 222 195ae: fa ce rjmp .-524 ; 0x193a4 #if SDCARDDETECT < 1 MENU_ITEM_GCODE_P(_T(MSG_CNG_SDCARD), PSTR("M21")); // SD-card changed by user #endif //SDCARDDETECT } } else { bMain=true; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function 195b0: d0 93 c9 03 sts 0x03C9, r29 ; 0x8003c9 MENU_ITEM_BACK_P(_T(MSG_NO_CARD)); 195b4: 86 e8 ldi r24, 0x86 ; 134 195b6: 97 e4 ldi r25, 0x47 ; 71 195b8: 0e 94 3a 75 call 0xea74 ; 0xea74 195bc: 0e 94 ce 72 call 0xe59c ; 0xe59c 195c0: 3f cf rjmp .-386 ; 0x19440 MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament); } #endif //MMU_HAS_CUTTER } else { #ifdef FILAMENT_SENSOR if (fsensor.isEnabled()) { 195c2: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 195c6: 88 23 and r24, r24 195c8: 19 f1 breq .+70 ; 0x19610 if (!fsensor.getAutoLoadEnabled()) { 195ca: 80 91 f2 16 lds r24, 0x16F2 ; 0x8016f2 195ce: 81 11 cpse r24, r1 195d0: 08 c0 rjmp .+16 ; 0x195e2 MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); 195d2: 82 e4 ldi r24, 0x42 ; 66 195d4: 97 e4 ldi r25, 0x47 ; 71 195d6: 0e 94 3a 75 call 0xea74 ; 0xea74 195da: 62 e3 ldi r22, 0x32 ; 50 195dc: 78 e3 ldi r23, 0x38 ; 56 195de: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } if (fsensor.getFilamentPresent()) { 195e2: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 195e6: 88 23 and r24, r24 195e8: 39 f0 breq .+14 ; 0x195f8 } #endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY } else { #endif //FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); 195ea: 82 e5 ldi r24, 0x52 ; 82 195ec: 97 e4 ldi r25, 0x47 ; 71 195ee: 0e 94 3a 75 call 0xea74 ; 0xea74 195f2: 60 e0 ldi r22, 0x00 ; 0 195f4: 78 e3 ldi r23, 0x38 ; 56 195f6: 7b cf rjmp .-266 ; 0x194ee if (fsensor.getFilamentPresent()) { MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); } #ifndef REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY else { if (fsensor.getAutoLoadEnabled()) { 195f8: 80 91 f2 16 lds r24, 0x16F2 ; 0x8016f2 195fc: 88 23 and r24, r24 195fe: 09 f4 brne .+2 ; 0x19602 19600: 78 cf rjmp .-272 ; 0x194f2 MENU_ITEM_SUBMENU_P(_T(MSG_AUTOLOAD_FILAMENT), lcd_menu_AutoLoadFilament); 19602: 8e e2 ldi r24, 0x2E ; 46 19604: 97 e4 ldi r25, 0x47 ; 71 19606: 0e 94 3a 75 call 0xea74 ; 0xea74 1960a: 6a e0 ldi r22, 0x0A ; 10 1960c: 78 e3 ldi r23, 0x38 ; 56 1960e: 6f cf rjmp .-290 ; 0x194ee } } #endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY } else { #endif //FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); 19610: 82 e4 ldi r24, 0x42 ; 66 19612: 97 e4 ldi r25, 0x47 ; 71 19614: 0e 94 3a 75 call 0xea74 ; 0xea74 19618: 62 e3 ldi r22, 0x32 ; 50 1961a: 78 e3 ldi r23, 0x38 ; 56 1961c: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 19620: e4 cf rjmp .-56 ; 0x195ea #endif //HOST_SHUTOWN MENU_ITEM_SUBMENU_P(_T(MSG_SUPPORT), lcd_support_menu); MENU_END(); } 19622: df 91 pop r29 19624: cf 91 pop r28 19626: 1f 91 pop r17 19628: 08 95 ret 0001962a : } #endif // TMC2130 } } static void menuitems_temperature_common() { 1962a: ef 92 push r14 1962c: ff 92 push r15 1962e: 0f 93 push r16 19630: 1f 93 push r17 #if TEMP_SENSOR_0 != 0 MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10, LCD_JUMP_HOTEND_TEMP); 19632: 8c ed ldi r24, 0xDC ; 220 19634: 94 e4 ldi r25, 0x44 ; 68 19636: 0e 94 3a 75 call 0xea74 ; 0xea74 1963a: 28 ec ldi r18, 0xC8 ; 200 1963c: e2 2e mov r14, r18 1963e: f1 2c mov r15, r1 19640: 07 e2 ldi r16, 0x27 ; 39 19642: 11 e0 ldi r17, 0x01 ; 1 19644: 30 e0 ldi r19, 0x00 ; 0 19646: 20 e0 ldi r18, 0x00 ; 0 19648: 40 e1 ldi r20, 0x10 ; 16 1964a: 6d e5 ldi r22, 0x5D ; 93 1964c: 72 e1 ldi r23, 0x12 ; 18 1964e: 0e 94 6e 6f call 0xdedc ; 0xdedc #endif #if TEMP_SENSOR_BED != 0 MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 5, LCD_JUMP_BED_TEMP); 19652: 81 ec ldi r24, 0xC1 ; 193 19654: 94 e4 ldi r25, 0x44 ; 68 19656: 0e 94 3a 75 call 0xea74 ; 0xea74 1965a: 32 e3 ldi r19, 0x32 ; 50 1965c: e3 2e mov r14, r19 1965e: f1 2c mov r15, r1 19660: 08 e7 ldi r16, 0x78 ; 120 19662: 10 e0 ldi r17, 0x00 ; 0 19664: 30 e0 ldi r19, 0x00 ; 0 19666: 20 e0 ldi r18, 0x00 ; 0 19668: 40 e1 ldi r20, 0x10 ; 16 1966a: 69 e5 ldi r22, 0x59 ; 89 1966c: 72 e1 ldi r23, 0x12 ; 18 1966e: 0e 94 6e 6f call 0xdedc ; 0xdedc #endif MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED); 19672: 85 eb ldi r24, 0xB5 ; 181 19674: 94 e4 ldi r25, 0x44 ; 68 19676: 0e 94 3a 75 call 0xea74 ; 0xea74 1967a: 4f e7 ldi r20, 0x7F ; 127 1967c: e4 2e mov r14, r20 1967e: f1 2c mov r15, r1 19680: 0f ef ldi r16, 0xFF ; 255 19682: 10 e0 ldi r17, 0x00 ; 0 19684: 30 e0 ldi r19, 0x00 ; 0 19686: 20 e0 ldi r18, 0x00 ; 0 19688: 48 e0 ldi r20, 0x08 ; 8 1968a: 65 e5 ldi r22, 0x55 ; 85 1968c: 72 e1 ldi r23, 0x12 ; 18 1968e: 0e 94 6e 6f call 0xdedc ; 0xdedc } 19692: 1f 91 pop r17 19694: 0f 91 pop r16 19696: ff 90 pop r15 19698: ef 90 pop r14 1969a: 08 95 ret 0001969c : } #endif //LCD_BL_PIN static void lcd_control_temperature_menu() { MENU_BEGIN(); 1969c: 0e 94 0c 74 call 0xe818 ; 0xe818 196a0: 10 92 60 04 sts 0x0460, r1 ; 0x800460 196a4: 80 91 60 04 lds r24, 0x0460 ; 0x800460 196a8: 84 30 cpi r24, 0x04 ; 4 196aa: b8 f4 brcc .+46 ; 0x196da 196ac: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 196b0: 8e e8 ldi r24, 0x8E ; 142 196b2: 98 e4 ldi r25, 0x48 ; 72 196b4: 0e 94 3a 75 call 0xea74 ; 0xea74 196b8: 0e 94 ce 72 call 0xe59c ; 0xe59c menuitems_temperature_common(); 196bc: 0e 94 15 cb call 0x1962a ; 0x1962a MENU_END(); 196c0: 0e 94 83 62 call 0xc506 ; 0xc506 } #endif //LCD_BL_PIN static void lcd_control_temperature_menu() { MENU_BEGIN(); 196c4: 80 91 60 04 lds r24, 0x0460 ; 0x800460 196c8: 8f 5f subi r24, 0xFF ; 255 196ca: 80 93 60 04 sts 0x0460, r24 ; 0x800460 196ce: 80 91 62 04 lds r24, 0x0462 ; 0x800462 196d2: 8f 5f subi r24, 0xFF ; 255 196d4: 80 93 62 04 sts 0x0462, r24 ; 0x800462 196d8: e5 cf rjmp .-54 ; 0x196a4 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); menuitems_temperature_common(); MENU_END(); } 196da: 08 95 ret 000196dc : //! |Rear side [µm]: | MSG_BED_CORRECTION_REAR //! |Reset | MSG_BED_CORRECTION_RESET //! ---------------------- //! @endcode void lcd_adjust_bed(void) { 196dc: ef 92 push r14 196de: ff 92 push r15 196e0: 0f 93 push r16 196e2: 1f 93 push r17 _menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]); if (_md->status == 0) 196e4: 80 91 a3 03 lds r24, 0x03A3 ; 0x8003a3 196e8: 81 11 cpse r24, r1 196ea: 35 c0 rjmp .+106 ; 0x19756 { // Menu was entered. if (eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1) 196ec: 80 ec ldi r24, 0xC0 ; 192 196ee: 9f e0 ldi r25, 0x0F ; 15 196f0: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 196f4: 81 30 cpi r24, 0x01 ; 1 196f6: 61 f5 brne .+88 ; 0x19750 { _md->left = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_LEFT); 196f8: 8f eb ldi r24, 0xBF ; 191 196fa: 9f e0 ldi r25, 0x0F ; 15 196fc: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19700: 08 2e mov r0, r24 19702: 00 0c add r0, r0 19704: 99 0b sbc r25, r25 19706: 90 93 a5 03 sts 0x03A5, r25 ; 0x8003a5 1970a: 80 93 a4 03 sts 0x03A4, r24 ; 0x8003a4 _md->right = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_RIGHT); 1970e: 8e eb ldi r24, 0xBE ; 190 19710: 9f e0 ldi r25, 0x0F ; 15 19712: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19716: 08 2e mov r0, r24 19718: 00 0c add r0, r0 1971a: 99 0b sbc r25, r25 1971c: 90 93 a7 03 sts 0x03A7, r25 ; 0x8003a7 19720: 80 93 a6 03 sts 0x03A6, r24 ; 0x8003a6 _md->front = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_FRONT); 19724: 8d eb ldi r24, 0xBD ; 189 19726: 9f e0 ldi r25, 0x0F ; 15 19728: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1972c: 08 2e mov r0, r24 1972e: 00 0c add r0, r0 19730: 99 0b sbc r25, r25 19732: 90 93 a9 03 sts 0x03A9, r25 ; 0x8003a9 19736: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 _md->rear = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_REAR); 1973a: 8c eb ldi r24, 0xBC ; 188 1973c: 9f e0 ldi r25, 0x0F ; 15 1973e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19742: 08 2e mov r0, r24 19744: 00 0c add r0, r0 19746: 99 0b sbc r25, r25 19748: 90 93 ab 03 sts 0x03AB, r25 ; 0x8003ab 1974c: 80 93 aa 03 sts 0x03AA, r24 ; 0x8003aa } _md->status = 1; 19750: 81 e0 ldi r24, 0x01 ; 1 19752: 80 93 a3 03 sts 0x03A3, r24 ; 0x8003a3 } MENU_BEGIN(); 19756: 0e 94 0c 74 call 0xe818 ; 0xe818 1975a: 10 92 60 04 sts 0x0460, r1 ; 0x800460 1975e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19762: 84 30 cpi r24, 0x04 ; 4 19764: 08 f0 brcs .+2 ; 0x19768 19766: 6e c0 rjmp .+220 ; 0x19844 19768: 10 92 63 04 sts 0x0463, r1 ; 0x800463 // leaving menu - this condition must be immediately before MENU_ITEM_BACK_P ON_MENU_LEAVE( 1976c: 0e 94 4c 62 call 0xc498 ; 0xc498 19770: 88 23 and r24, r24 19772: e9 f0 breq .+58 ; 0x197ae if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 19774: 60 91 a4 03 lds r22, 0x03A4 ; 0x8003a4 19778: 8f eb ldi r24, 0xBF ; 191 1977a: 9f e0 ldi r25, 0x0F ; 15 1977c: 0f 94 04 a4 call 0x34808 ; 0x34808 19780: 60 91 a8 03 lds r22, 0x03A8 ; 0x8003a8 19784: 8d eb ldi r24, 0xBD ; 189 19786: 9f e0 ldi r25, 0x0F ; 15 19788: 0f 94 04 a4 call 0x34808 ; 0x34808 1978c: 60 91 aa 03 lds r22, 0x03AA ; 0x8003aa 19790: 8c eb ldi r24, 0xBC ; 188 19792: 9f e0 ldi r25, 0x0F ; 15 19794: 0f 94 04 a4 call 0x34808 ; 0x34808 19798: 60 91 a6 03 lds r22, 0x03A6 ; 0x8003a6 1979c: 8e eb ldi r24, 0xBE ; 190 1979e: 9f e0 ldi r25, 0x0F ; 15 197a0: 0f 94 04 a4 call 0x34808 ; 0x34808 197a4: 61 e0 ldi r22, 0x01 ; 1 197a6: 80 ec ldi r24, 0xC0 ; 192 197a8: 9f e0 ldi r25, 0x0F ; 15 197aa: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_FRONT, (uint8_t)_md->front); eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_REAR, (uint8_t)_md->rear); eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_RIGHT, (uint8_t)_md->right); eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_VALID, 1); ); MENU_ITEM_BACK_P(_T(MSG_BACK)); 197ae: 88 ee ldi r24, 0xE8 ; 232 197b0: 9a e4 ldi r25, 0x4A ; 74 197b2: 0e 94 3a 75 call 0xea74 ; 0xea74 197b6: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_LEFT), &_md->left, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 197ba: 87 e1 ldi r24, 0x17 ; 23 197bc: 9b e3 ldi r25, 0x3B ; 59 197be: 0e 94 3a 75 call 0xea74 ; 0xea74 197c2: f1 2c mov r15, r1 197c4: e1 2c mov r14, r1 197c6: 04 e6 ldi r16, 0x64 ; 100 197c8: 10 e0 ldi r17, 0x00 ; 0 197ca: 2c e9 ldi r18, 0x9C ; 156 197cc: 3f ef ldi r19, 0xFF ; 255 197ce: 40 e1 ldi r20, 0x10 ; 16 197d0: 64 ea ldi r22, 0xA4 ; 164 197d2: 73 e0 ldi r23, 0x03 ; 3 197d4: 0e 94 6e 6f call 0xdedc ; 0xdedc MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_RIGHT), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 197d8: 86 e0 ldi r24, 0x06 ; 6 197da: 9b e3 ldi r25, 0x3B ; 59 197dc: 0e 94 3a 75 call 0xea74 ; 0xea74 197e0: 2c e9 ldi r18, 0x9C ; 156 197e2: 3f ef ldi r19, 0xFF ; 255 197e4: 40 e1 ldi r20, 0x10 ; 16 197e6: 66 ea ldi r22, 0xA6 ; 166 197e8: 73 e0 ldi r23, 0x03 ; 3 197ea: 0e 94 6e 6f call 0xdedc ; 0xdedc MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_FRONT), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 197ee: 85 ef ldi r24, 0xF5 ; 245 197f0: 9a e3 ldi r25, 0x3A ; 58 197f2: 0e 94 3a 75 call 0xea74 ; 0xea74 197f6: 2c e9 ldi r18, 0x9C ; 156 197f8: 3f ef ldi r19, 0xFF ; 255 197fa: 40 e1 ldi r20, 0x10 ; 16 197fc: 68 ea ldi r22, 0xA8 ; 168 197fe: 73 e0 ldi r23, 0x03 ; 3 19800: 0e 94 6e 6f call 0xdedc ; 0xdedc MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_REAR), &_md->rear, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 19804: 84 ee ldi r24, 0xE4 ; 228 19806: 9a e3 ldi r25, 0x3A ; 58 19808: 0e 94 3a 75 call 0xea74 ; 0xea74 1980c: 2c e9 ldi r18, 0x9C ; 156 1980e: 3f ef ldi r19, 0xFF ; 255 19810: 40 e1 ldi r20, 0x10 ; 16 19812: 6a ea ldi r22, 0xAA ; 170 19814: 73 e0 ldi r23, 0x03 ; 3 19816: 0e 94 6e 6f call 0xdedc ; 0xdedc MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_adjust_bed_reset); 1981a: 8f ea ldi r24, 0xAF ; 175 1981c: 96 e4 ldi r25, 0x46 ; 70 1981e: 0e 94 3a 75 call 0xea74 ; 0xea74 19822: 69 ee ldi r22, 0xE9 ; 233 19824: 70 ed ldi r23, 0xD0 ; 208 19826: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_END(); 1982a: 0e 94 83 62 call 0xc506 ; 0xc506 _md->front = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_FRONT); _md->rear = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_REAR); } _md->status = 1; } MENU_BEGIN(); 1982e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19832: 8f 5f subi r24, 0xFF ; 255 19834: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19838: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1983c: 8f 5f subi r24, 0xFF ; 255 1983e: 80 93 62 04 sts 0x0462, r24 ; 0x800462 19842: 8d cf rjmp .-230 ; 0x1975e MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_RIGHT), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_FRONT), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_REAR), &_md->rear, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_adjust_bed_reset); MENU_END(); } 19844: 1f 91 pop r17 19846: 0f 91 pop r16 19848: ff 90 pop r15 1984a: ef 90 pop r14 1984c: 08 95 ret 0001984e : #define MENU_ITEM_EDIT_advance_K() do { lcd_advance_K(); } while (0) #endif static void lcd_tune_menu() { 1984e: ef 92 push r14 19850: ff 92 push r15 19852: 0f 93 push r16 19854: 1f 93 push r17 19856: cf 93 push r28 19858: df 93 push r29 1985a: 80 91 75 02 lds r24, 0x0275 ; 0x800275 1985e: 90 91 76 02 lds r25, 0x0276 ; 0x800276 //! it needs to be applied. int16_t extrudemultiply; } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) 19862: 20 91 a3 03 lds r18, 0x03A3 ; 0x8003a3 19866: 21 11 cpse r18, r1 19868: 91 c0 rjmp .+290 ; 0x1998c { // Menu was entered. Mark the menu as entered and save the current extrudemultiply value. _md->status = 1; 1986a: 21 e0 ldi r18, 0x01 ; 1 1986c: 20 93 a3 03 sts 0x03A3, r18 ; 0x8003a3 _md->extrudemultiply = extrudemultiply; 19870: 90 93 a5 03 sts 0x03A5, r25 ; 0x8003a5 19874: 80 93 a4 03 sts 0x03A4, r24 ; 0x8003a4 // extrudemultiply has been changed from the child menu. Apply the new value. _md->extrudemultiply = extrudemultiply; calculate_extruder_multipliers(); } SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); 19878: 8f ef ldi r24, 0xFF ; 255 1987a: 9f e0 ldi r25, 0x0F ; 15 1987c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19880: 80 93 bb 03 sts 0x03BB, r24 ; 0x8003bb MENU_BEGIN(); 19884: 0e 94 0c 74 call 0xe818 ; 0xe818 19888: 10 92 60 04 sts 0x0460, r1 ; 0x800460 1988c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19890: 84 30 cpi r24, 0x04 ; 4 19892: 08 f0 brcs .+2 ; 0x19896 19894: 93 c0 rjmp .+294 ; 0x199bc 19896: 10 92 63 04 sts 0x0463, r1 ; 0x800463 ON_MENU_LEAVE( 1989a: 0e 94 4c 62 call 0xc498 ; 0xc498 1989e: 81 11 cpse r24, r1 198a0: 0e 94 3d 64 call 0xc87a ; 0xc87a refresh_saved_feedrate_multiplier_in_ram(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 198a4: 8f ed ldi r24, 0xDF ; 223 198a6: 98 e4 ldi r25, 0x48 ; 72 198a8: 0e 94 3a 75 call 0xea74 ; 0xea74 198ac: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_EDIT_int3_P(_T(MSG_SPEED), &feedmultiply, 10, 999); 198b0: 8b e5 ldi r24, 0x5B ; 91 198b2: 98 e4 ldi r25, 0x48 ; 72 198b4: 0e 94 3a 75 call 0xea74 ; 0xea74 198b8: f1 2c mov r15, r1 198ba: e1 2c mov r14, r1 198bc: 07 ee ldi r16, 0xE7 ; 231 198be: 13 e0 ldi r17, 0x03 ; 3 198c0: 2a e0 ldi r18, 0x0A ; 10 198c2: 30 e0 ldi r19, 0x00 ; 0 198c4: 40 e1 ldi r20, 0x10 ; 16 198c6: 6e e8 ldi r22, 0x8E ; 142 198c8: 72 e0 ldi r23, 0x02 ; 2 198ca: 0e 94 6e 6f call 0xdedc ; 0xdedc menuitems_temperature_common(); 198ce: 0e 94 15 cb call 0x1962a ; 0x1962a MENU_ITEM_EDIT_int3_P(_T(MSG_FLOW), &extrudemultiply, 10, 999); 198d2: 84 e5 ldi r24, 0x54 ; 84 198d4: 98 e4 ldi r25, 0x48 ; 72 198d6: 0e 94 3a 75 call 0xea74 ; 0xea74 198da: 2a e0 ldi r18, 0x0A ; 10 198dc: 30 e0 ldi r19, 0x00 ; 0 198de: 40 e1 ldi r20, 0x10 ; 16 198e0: 65 e7 ldi r22, 0x75 ; 117 198e2: 72 e0 ldi r23, 0x02 ; 2 198e4: 0e 94 6e 6f call 0xdedc ; 0xdedc #ifdef LA_LIVE_K MENU_ITEM_EDIT_advance_K(); #endif #ifdef FILAMENTCHANGEENABLE if (!farm_mode) 198e8: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 198ec: 81 11 cpse r24, r1 198ee: 08 c0 rjmp .+16 ; 0x19900 MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change); 198f0: 82 e4 ldi r24, 0x42 ; 66 198f2: 98 e4 ldi r25, 0x48 ; 72 198f4: 0e 94 3a 75 call 0xea74 ; 0xea74 198f8: 65 ea ldi r22, 0xA5 ; 165 198fa: 7e ed ldi r23, 0xDE ; 222 198fc: 0e 94 9d 72 call 0xe53a ; 0xe53a #endif if (printingIsPaused()) {// Don't allow rehome if actively printing. Maaaaybe it could work to insert on the fly, seems too risky. 19900: 0e 94 35 66 call 0xcc6a ; 0xcc6a 19904: 88 23 and r24, r24 19906: 41 f0 breq .+16 ; 0x19918 MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME),PSTR("G28 XY")); 19908: 81 ec ldi r24, 0xC1 ; 193 1990a: 91 e6 ldi r25, 0x61 ; 97 1990c: 0e 94 3a 75 call 0xea74 ; 0xea74 19910: 69 eb ldi r22, 0xB9 ; 185 19912: 73 e8 ldi r23, 0x83 ; 131 19914: 0e 94 68 8f call 0x11ed0 ; 0x11ed0 } #ifdef FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu); 19918: 84 e3 ldi r24, 0x34 ; 52 1991a: 98 e4 ldi r25, 0x48 ; 72 1991c: 0e 94 3a 75 call 0xea74 ; 0xea74 19920: 62 e6 ldi r22, 0x62 ; 98 19922: 72 ec ldi r23, 0xC2 ; 194 19924: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #endif //FILAMENT_SENSOR if (MMU2::mmu2.Enabled()) 19928: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1992c: 81 30 cpi r24, 0x01 ; 1 1992e: 11 f4 brne .+4 ; 0x19934 { menuitems_MMU_settings_common(); 19930: 0e 94 2a c1 call 0x18254 ; 0x18254 } SETTINGS_FANS_CHECK(); 19934: 0e 94 10 c1 call 0x18220 ; 0x18220 MMU2::mmu2.Status(); } static void SETTINGS_SILENT_MODE() { if (!farm_mode) 19938: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1993c: 81 11 cpse r24, r1 1993e: 02 c0 rjmp .+4 ; 0x19944 19940: 0e 94 ef c0 call 0x181de ; 0x181de menuitems_MMU_settings_common(); } SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); SETTINGS_SOUND; 19944: 80 91 47 04 lds r24, 0x0447 ; 0x800447 19948: 82 30 cpi r24, 0x02 ; 2 1994a: 91 f1 breq .+100 ; 0x199b0 1994c: 83 30 cpi r24, 0x03 ; 3 1994e: 99 f1 breq .+102 ; 0x199b6 19950: 81 30 cpi r24, 0x01 ; 1 19952: 59 f1 breq .+86 ; 0x199aa 19954: 8d e2 ldi r24, 0x2D ; 45 19956: 98 e4 ldi r25, 0x48 ; 72 19958: 0e 94 3a 75 call 0xea74 ; 0xea74 1995c: ec 01 movw r28, r24 1995e: 85 e2 ldi r24, 0x25 ; 37 19960: 98 e4 ldi r25, 0x48 ; 72 19962: 0e 94 3a 75 call 0xea74 ; 0xea74 19966: 22 e0 ldi r18, 0x02 ; 2 19968: 44 e9 ldi r20, 0x94 ; 148 1996a: 5f eb ldi r21, 0xBF ; 191 1996c: be 01 movw r22, r28 1996e: 0e 94 5e 75 call 0xeabc ; 0xeabc if (backlightSupport) { MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); } #endif //LCD_BL_PIN MENU_END(); 19972: 0e 94 83 62 call 0xc506 ; 0xc506 calculate_extruder_multipliers(); } SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 19976: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1997a: 8f 5f subi r24, 0xFF ; 255 1997c: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19980: 80 91 62 04 lds r24, 0x0462 ; 0x800462 19984: 8f 5f subi r24, 0xFF ; 255 19986: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1998a: 80 cf rjmp .-256 ; 0x1988c { // Menu was entered. Mark the menu as entered and save the current extrudemultiply value. _md->status = 1; _md->extrudemultiply = extrudemultiply; } else if (_md->extrudemultiply != extrudemultiply) 1998c: 20 91 a4 03 lds r18, 0x03A4 ; 0x8003a4 19990: 30 91 a5 03 lds r19, 0x03A5 ; 0x8003a5 19994: 28 17 cp r18, r24 19996: 39 07 cpc r19, r25 19998: 09 f4 brne .+2 ; 0x1999c 1999a: 6e cf rjmp .-292 ; 0x19878 { // extrudemultiply has been changed from the child menu. Apply the new value. _md->extrudemultiply = extrudemultiply; 1999c: 90 93 a5 03 sts 0x03A5, r25 ; 0x8003a5 199a0: 80 93 a4 03 sts 0x03A4, r24 ; 0x8003a4 calculate_extruder_multipliers(); 199a4: 0e 94 4a 64 call 0xc894 ; 0xc894 199a8: 67 cf rjmp .-306 ; 0x19878 menuitems_MMU_settings_common(); } SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); SETTINGS_SOUND; 199aa: 8e e1 ldi r24, 0x1E ; 30 199ac: 98 e4 ldi r25, 0x48 ; 72 199ae: d4 cf rjmp .-88 ; 0x19958 199b0: 8c ef ldi r24, 0xFC ; 252 199b2: 9a e4 ldi r25, 0x4A ; 74 199b4: d1 cf rjmp .-94 ; 0x19958 199b6: 85 e1 ldi r24, 0x15 ; 21 199b8: 98 e4 ldi r25, 0x48 ; 72 199ba: ce cf rjmp .-100 ; 0x19958 { MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); } #endif //LCD_BL_PIN MENU_END(); } 199bc: df 91 pop r29 199be: cf 91 pop r28 199c0: 1f 91 pop r17 199c2: 0f 91 pop r16 199c4: ff 90 pop r15 199c6: ef 90 pop r14 199c8: 08 95 ret 000199ca : MENU_END(); } static void lcd_settings_menu() { 199ca: 1f 93 push r17 199cc: cf 93 push r28 199ce: df 93 push r29 SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); 199d0: 8f ef ldi r24, 0xFF ; 255 199d2: 9f e0 ldi r25, 0x0F ; 15 199d4: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 199d8: 80 93 bb 03 sts 0x03BB, r24 ; 0x8003bb MENU_BEGIN(); 199dc: 0e 94 0c 74 call 0xe818 ; 0xe818 199e0: 10 92 60 04 sts 0x0460, r1 ; 0x800460 SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); if(!farm_mode) { bSettings=true; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 199e4: 11 e0 ldi r17, 0x01 ; 1 } static void lcd_settings_menu() { SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 199e6: 80 91 60 04 lds r24, 0x0460 ; 0x800460 199ea: 84 30 cpi r24, 0x04 ; 4 199ec: 08 f0 brcs .+2 ; 0x199f0 199ee: 45 c1 rjmp .+650 ; 0x19c7a 199f0: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 199f4: 8f ed ldi r24, 0xDF ; 223 199f6: 98 e4 ldi r25, 0x48 ; 72 199f8: 0e 94 3a 75 call 0xea74 ; 0xea74 199fc: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_P(_T(MSG_TEMPERATURE), lcd_control_temperature_menu); 19a00: 8e eb ldi r24, 0xBE ; 190 19a02: 95 e4 ldi r25, 0x45 ; 69 19a04: 0e 94 3a 75 call 0xea74 ; 0xea74 19a08: 6e e4 ldi r22, 0x4E ; 78 19a0a: 7b ec ldi r23, 0xCB ; 203 19a0c: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 if (!printer_active() || printingIsPaused()) 19a10: 0e 94 91 66 call 0xcd22 ; 0xcd22 19a14: 88 23 and r24, r24 19a16: 21 f0 breq .+8 ; 0x19a20 19a18: 0e 94 35 66 call 0xcc6a ; 0xcc6a 19a1c: 88 23 and r24, r24 19a1e: 81 f0 breq .+32 ; 0x19a40 { MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_AXIS), lcd_move_menu_axis); 19a20: 82 eb ldi r24, 0xB2 ; 178 19a22: 95 e4 ldi r25, 0x45 ; 69 19a24: 0e 94 3a 75 call 0xea74 ; 0xea74 19a28: 6d e9 ldi r22, 0x9D ; 157 19a2a: 73 ec ldi r23, 0xC3 ; 195 19a2c: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_GCODE_P(_T(MSG_DISABLE_STEPPERS), MSG_M84); 19a30: 8f e9 ldi r24, 0x9F ; 159 19a32: 95 e4 ldi r25, 0x45 ; 69 19a34: 0e 94 3a 75 call 0xea74 ; 0xea74 19a38: 6e e8 ldi r22, 0x8E ; 142 19a3a: 78 e6 ldi r23, 0x68 ; 104 19a3c: 0e 94 68 8f call 0x11ed0 ; 0x11ed0 } #ifdef FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu); 19a40: 84 e3 ldi r24, 0x34 ; 52 19a42: 98 e4 ldi r25, 0x48 ; 72 19a44: 0e 94 3a 75 call 0xea74 ; 0xea74 19a48: 62 e6 ldi r22, 0x62 ; 98 19a4a: 72 ec ldi r23, 0xC2 ; 194 19a4c: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #endif //FILAMENT_SENSOR MENU_ITEM_TOGGLE_P(PSTR("MMU"), eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED) ? _T(MSG_ON) : _T(MSG_OFF), mmu_enable_switch); 19a50: 8c ea ldi r24, 0xAC ; 172 19a52: 9c e0 ldi r25, 0x0C ; 12 19a54: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19a58: 88 23 and r24, r24 19a5a: 09 f4 brne .+2 ; 0x19a5e 19a5c: 91 c0 rjmp .+290 ; 0x19b80 19a5e: 8a e9 ldi r24, 0x9A ; 154 19a60: 92 e6 ldi r25, 0x62 ; 98 19a62: 0e 94 3a 75 call 0xea74 ; 0xea74 19a66: 22 e0 ldi r18, 0x02 ; 2 19a68: 42 e3 ldi r20, 0x32 ; 50 19a6a: 50 ec ldi r21, 0xC0 ; 192 19a6c: bc 01 movw r22, r24 19a6e: 8a e9 ldi r24, 0x9A ; 154 19a70: 93 e8 ldi r25, 0x83 ; 131 19a72: 0e 94 5e 75 call 0xeabc ; 0xeabc if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED)) 19a76: 8c ea ldi r24, 0xAC ; 172 19a78: 9c e0 ldi r25, 0x0C ; 12 19a7a: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19a7e: 88 23 and r24, r24 19a80: 31 f0 breq .+12 ; 0x19a8e { // Communication with MMU not required to reset MMU MENU_ITEM_FUNCTION_P(PSTR("Reset MMU"), []() { MMU2::mmu2.Reset(MMU2::MMU2::ResetForm::Software); }); 19a82: 67 e9 ldi r22, 0x97 ; 151 19a84: 70 ed ldi r23, 0xD0 ; 208 19a86: 80 e9 ldi r24, 0x90 ; 144 19a88: 93 e8 ldi r25, 0x83 ; 131 19a8a: 0e 94 9d 72 call 0xe53a ; 0xe53a } if (MMU2::mmu2.Enabled()) 19a8e: 80 91 01 13 lds r24, 0x1301 ; 0x801301 19a92: 81 30 cpi r24, 0x01 ; 1 19a94: 51 f4 brne .+20 ; 0x19aaa { // Only show menus when communicating with MMU menuitems_MMU_settings_common(); 19a96: 0e 94 2a c1 call 0x18254 ; 0x18254 MENU_ITEM_SUBMENU_P(_T(MSG_LOADING_TEST), lcd_mmuLoadingTest); 19a9a: 80 e9 ldi r24, 0x90 ; 144 19a9c: 95 e4 ldi r25, 0x45 ; 69 19a9e: 0e 94 3a 75 call 0xea74 ; 0xea74 19aa2: 65 ed ldi r22, 0xD5 ; 213 19aa4: 7f ec ldi r23, 0xCF ; 207 19aa6: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } SETTINGS_FANS_CHECK(); 19aaa: 0e 94 10 c1 call 0x18220 ; 0x18220 MMU2::mmu2.Status(); } static void SETTINGS_SILENT_MODE() { if (!farm_mode) 19aae: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19ab2: 81 11 cpse r24, r1 19ab4: 02 c0 rjmp .+4 ; 0x19aba 19ab6: 0e 94 ef c0 call 0x181de ; 0x181de } SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); if(!farm_mode) 19aba: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19abe: 81 11 cpse r24, r1 19ac0: 62 c0 rjmp .+196 ; 0x19b86 { bSettings=true; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 19ac2: 10 93 ec 03 sts 0x03EC, r17 ; 0x8003ec MENU_ITEM_SUBMENU_P(_T(MSG_HW_SETUP), lcd_hw_setup_menu); 19ac6: 85 e8 ldi r24, 0x85 ; 133 19ac8: 95 e4 ldi r25, 0x45 ; 69 19aca: 0e 94 3a 75 call 0xea74 ; 0xea74 19ace: 6b e5 ldi r22, 0x5B ; 91 19ad0: 71 ec ldi r23, 0xC1 ; 193 19ad2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } else MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change); MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bed_leveling_settings); 19ad6: 84 e2 ldi r24, 0x24 ; 36 19ad8: 96 e4 ldi r25, 0x46 ; 70 19ada: 0e 94 3a 75 call 0xea74 ; 0xea74 19ade: 63 e0 ldi r22, 0x03 ; 3 19ae0: 7a ee ldi r23, 0xEA ; 234 19ae2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #if defined (TMC2130) && defined (LINEARITY_CORRECTION) MENU_ITEM_SUBMENU_P(_T(MSG_LIN_CORRECTION), lcd_settings_linearity_correction_menu); #endif //LINEARITY_CORRECTION && TMC2130 #ifdef PINDA_THERMISTOR if(has_temperature_compensation()) 19ae6: 0f 94 58 13 call 0x226b0 ; 0x226b0 19aea: 88 23 and r24, r24 19aec: b1 f0 breq .+44 ; 0x19b1a MENU_ITEM_TOGGLE_P(_T(MSG_PINDA_CALIBRATION), eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE) ? _T(MSG_ON) : _T(MSG_OFF), lcd_temp_calibration_set); 19aee: 8f ea ldi r24, 0xAF ; 175 19af0: 9f e0 ldi r25, 0x0F ; 15 19af2: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19af6: 88 23 and r24, r24 19af8: 09 f4 brne .+2 ; 0x19afc 19afa: 4e c0 rjmp .+156 ; 0x19b98 19afc: 8a e9 ldi r24, 0x9A ; 154 19afe: 92 e6 ldi r25, 0x62 ; 98 19b00: 0e 94 3a 75 call 0xea74 ; 0xea74 19b04: ec 01 movw r28, r24 19b06: 8c ec ldi r24, 0xCC ; 204 19b08: 95 e4 ldi r25, 0x45 ; 69 19b0a: 0e 94 3a 75 call 0xea74 ; 0xea74 19b0e: 22 e0 ldi r18, 0x02 ; 2 19b10: 49 e8 ldi r20, 0x89 ; 137 19b12: 5f eb ldi r21, 0xBF ; 191 19b14: be 01 movw r22, r28 19b16: 0e 94 5e 75 call 0xeabc ; 0xeabc #endif #ifdef HAS_SECOND_SERIAL_PORT MENU_ITEM_TOGGLE_P(_T(MSG_RPI_PORT), (selectedSerialPort == 0) ? _T(MSG_OFF) : _T(MSG_ON), lcd_second_serial_set); #endif //HAS_SECOND_SERIAL if (!printingIsPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z); 19b1a: 0e 94 35 66 call 0xcc6a ; 0xcc6a 19b1e: 81 11 cpse r24, r1 19b20: 08 c0 rjmp .+16 ; 0x19b32 19b22: 8d ee ldi r24, 0xED ; 237 19b24: 97 e4 ldi r25, 0x47 ; 71 19b26: 0e 94 3a 75 call 0xea74 ; 0xea74 19b2a: 68 e6 ldi r22, 0x68 ; 104 19b2c: 77 ed ldi r23, 0xD7 ; 215 19b2e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #if (LANG_MODE != 0) MENU_ITEM_SUBMENU_P(_T(MSG_SELECT_LANGUAGE), lcd_language_menu); 19b32: 83 e6 ldi r24, 0x63 ; 99 19b34: 95 e4 ldi r25, 0x45 ; 69 19b36: 0e 94 3a 75 call 0xea74 ; 0xea74 19b3a: 66 e1 ldi r22, 0x16 ; 22 19b3c: 79 ee ldi r23, 0xE9 ; 233 19b3e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #endif //(LANG_MODE != 0) if (!farm_mode) { //SD related settings are not available in farm mode 19b42: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19b46: 81 11 cpse r24, r1 19b48: 47 c0 rjmp .+142 ; 0x19bd8 if (card.ToshibaFlashAir_isEnabled()) 19b4a: 80 91 48 16 lds r24, 0x1648 ; 0x801648 19b4e: 88 23 and r24, r24 19b50: 31 f1 breq .+76 ; 0x19b9e MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY, lcd_toshiba_flash_air_compatibility_toggle); 19b52: 89 e5 ldi r24, 0x59 ; 89 19b54: 95 e4 ldi r25, 0x45 ; 69 19b56: 0e 94 3a 75 call 0xea74 ; 0xea74 19b5a: 22 e0 ldi r18, 0x02 ; 2 19b5c: 4f e7 ldi r20, 0x7F ; 127 19b5e: 5f eb ldi r21, 0xBF ; 191 19b60: 6d e1 ldi r22, 0x1D ; 29 19b62: 78 e6 ldi r23, 0x68 ; 104 else MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle); 19b64: 0e 94 5e 75 call 0xeabc ; 0xeabc #ifdef SDCARD_SORT_ALPHA switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) { 19b68: 89 e0 ldi r24, 0x09 ; 9 19b6a: 9f e0 ldi r25, 0x0F ; 15 19b6c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19b70: 88 23 and r24, r24 19b72: 19 f1 breq .+70 ; 0x19bba 19b74: 81 30 cpi r24, 0x01 ; 1 19b76: 09 f4 brne .+2 ; 0x19b7a 19b78: 71 c0 rjmp .+226 ; 0x19c5c case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break; case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break; default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set); 19b7a: 89 e2 ldi r24, 0x29 ; 41 19b7c: 9b e4 ldi r25, 0x4B ; 75 19b7e: 1f c0 rjmp .+62 ; 0x19bbe #ifdef FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu); #endif //FILAMENT_SENSOR MENU_ITEM_TOGGLE_P(PSTR("MMU"), eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED) ? _T(MSG_ON) : _T(MSG_OFF), mmu_enable_switch); 19b80: 84 e9 ldi r24, 0x94 ; 148 19b82: 92 e6 ldi r25, 0x62 ; 98 19b84: 6e cf rjmp .-292 ; 0x19a62 if(!farm_mode) { bSettings=true; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function MENU_ITEM_SUBMENU_P(_T(MSG_HW_SETUP), lcd_hw_setup_menu); } else MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change); 19b86: 85 e7 ldi r24, 0x75 ; 117 19b88: 95 e4 ldi r25, 0x45 ; 69 19b8a: 0e 94 3a 75 call 0xea74 ; 0xea74 19b8e: 6c e4 ldi r22, 0x4C ; 76 19b90: 7b ee ldi r23, 0xEB ; 235 19b92: 0e 94 9d 72 call 0xe53a ; 0xe53a 19b96: 9f cf rjmp .-194 ; 0x19ad6 #if defined (TMC2130) && defined (LINEARITY_CORRECTION) MENU_ITEM_SUBMENU_P(_T(MSG_LIN_CORRECTION), lcd_settings_linearity_correction_menu); #endif //LINEARITY_CORRECTION && TMC2130 #ifdef PINDA_THERMISTOR if(has_temperature_compensation()) MENU_ITEM_TOGGLE_P(_T(MSG_PINDA_CALIBRATION), eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE) ? _T(MSG_ON) : _T(MSG_OFF), lcd_temp_calibration_set); 19b98: 84 e9 ldi r24, 0x94 ; 148 19b9a: 92 e6 ldi r25, 0x62 ; 98 19b9c: b1 cf rjmp .-158 ; 0x19b00 if (!farm_mode) { //SD related settings are not available in farm mode if (card.ToshibaFlashAir_isEnabled()) MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY, lcd_toshiba_flash_air_compatibility_toggle); else MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle); 19b9e: 80 e5 ldi r24, 0x50 ; 80 19ba0: 95 e4 ldi r25, 0x45 ; 69 19ba2: 0e 94 3a 75 call 0xea74 ; 0xea74 19ba6: ec 01 movw r28, r24 19ba8: 89 e5 ldi r24, 0x59 ; 89 19baa: 95 e4 ldi r25, 0x45 ; 69 19bac: 0e 94 3a 75 call 0xea74 ; 0xea74 19bb0: 22 e0 ldi r18, 0x02 ; 2 19bb2: 4f e7 ldi r20, 0x7F ; 127 19bb4: 5f eb ldi r21, 0xBF ; 191 19bb6: be 01 movw r22, r28 19bb8: d5 cf rjmp .-86 ; 0x19b64 #ifdef SDCARD_SORT_ALPHA switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) { case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break; 19bba: 89 e4 ldi r24, 0x49 ; 73 19bbc: 95 e4 ldi r25, 0x45 ; 69 case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break; default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set); 19bbe: 0e 94 3a 75 call 0xea74 ; 0xea74 19bc2: ec 01 movw r28, r24 19bc4: 82 e4 ldi r24, 0x42 ; 66 19bc6: 95 e4 ldi r25, 0x45 ; 69 19bc8: 0e 94 3a 75 call 0xea74 ; 0xea74 19bcc: 22 e0 ldi r18, 0x02 ; 2 19bce: 4b ea ldi r20, 0xAB ; 171 19bd0: 5f eb ldi r21, 0xBF ; 191 19bd2: be 01 movw r22, r28 19bd4: 0e 94 5e 75 call 0xeabc ; 0xeabc } } #endif //SDCARD_SORT_ALPHA SETTINGS_SOUND; 19bd8: 80 91 47 04 lds r24, 0x0447 ; 0x800447 19bdc: 82 30 cpi r24, 0x02 ; 2 19bde: 09 f4 brne .+2 ; 0x19be2 19be0: 43 c0 rjmp .+134 ; 0x19c68 19be2: 83 30 cpi r24, 0x03 ; 3 19be4: 09 f4 brne .+2 ; 0x19be8 19be6: 43 c0 rjmp .+134 ; 0x19c6e 19be8: 81 30 cpi r24, 0x01 ; 1 19bea: d9 f1 breq .+118 ; 0x19c62 19bec: 8d e2 ldi r24, 0x2D ; 45 19bee: 98 e4 ldi r25, 0x48 ; 72 19bf0: 0e 94 3a 75 call 0xea74 ; 0xea74 19bf4: ec 01 movw r28, r24 19bf6: 85 e2 ldi r24, 0x25 ; 37 19bf8: 98 e4 ldi r25, 0x48 ; 72 19bfa: 0e 94 3a 75 call 0xea74 ; 0xea74 19bfe: 22 e0 ldi r18, 0x02 ; 2 19c00: 44 e9 ldi r20, 0x94 ; 148 19c02: 5f eb ldi r21, 0xBF ; 191 19c04: be 01 movw r22, r28 19c06: 0e 94 5e 75 call 0xeabc ; 0xeabc MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); } #endif //LCD_BL_PIN //! Enables/disables the bed heating while heating the nozzle for loading/unloading filament MENU_ITEM_TOGGLE_P(_N("HBed on load"), eeprom_read_byte((uint8_t *)EEPROM_HEAT_BED_ON_LOAD_FILAMENT) ? _T(MSG_YES) : _T(MSG_NO), lcd_heat_bed_on_load_toggle); ////MSG_HEAT_BED_ON_LOAD c=12 19c0a: 87 ea ldi r24, 0xA7 ; 167 19c0c: 9c e0 ldi r25, 0x0C ; 12 19c0e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 19c12: 88 23 and r24, r24 19c14: 79 f1 breq .+94 ; 0x19c74 19c16: 89 e9 ldi r24, 0x99 ; 153 19c18: 98 e4 ldi r25, 0x48 ; 72 19c1a: 0e 94 3a 75 call 0xea74 ; 0xea74 19c1e: 22 e0 ldi r18, 0x02 ; 2 19c20: 45 e0 ldi r20, 0x05 ; 5 19c22: 5f eb ldi r21, 0xBF ; 191 19c24: bc 01 movw r22, r24 19c26: 80 e1 ldi r24, 0x10 ; 16 19c28: 98 e6 ldi r25, 0x68 ; 104 19c2a: 0e 94 5e 75 call 0xeabc ; 0xeabc if (farm_mode) 19c2e: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 19c32: 88 23 and r24, r24 19c34: 31 f0 breq .+12 ; 0x19c42 { MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode); 19c36: 60 e8 ldi r22, 0x80 ; 128 19c38: 79 ee ldi r23, 0xE9 ; 233 19c3a: 8e e7 ldi r24, 0x7E ; 126 19c3c: 93 e8 ldi r25, 0x83 ; 131 19c3e: 0e 94 9d 72 call 0xe53a ; 0xe53a } MENU_END(); 19c42: 0e 94 83 62 call 0xc506 ; 0xc506 } static void lcd_settings_menu() { SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 19c46: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19c4a: 8f 5f subi r24, 0xFF ; 255 19c4c: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19c50: 80 91 62 04 lds r24, 0x0462 ; 0x800462 19c54: 8f 5f subi r24, 0xFF ; 255 19c56: 80 93 62 04 sts 0x0462, r24 ; 0x800462 19c5a: c5 ce rjmp .-630 ; 0x199e6 else MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle); #ifdef SDCARD_SORT_ALPHA switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) { case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break; case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break; 19c5c: 87 e3 ldi r24, 0x37 ; 55 19c5e: 95 e4 ldi r25, 0x45 ; 69 19c60: ae cf rjmp .-164 ; 0x19bbe default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set); } } #endif //SDCARD_SORT_ALPHA SETTINGS_SOUND; 19c62: 8e e1 ldi r24, 0x1E ; 30 19c64: 98 e4 ldi r25, 0x48 ; 72 19c66: c4 cf rjmp .-120 ; 0x19bf0 19c68: 8c ef ldi r24, 0xFC ; 252 19c6a: 9a e4 ldi r25, 0x4A ; 74 19c6c: c1 cf rjmp .-126 ; 0x19bf0 19c6e: 85 e1 ldi r24, 0x15 ; 21 19c70: 98 e4 ldi r25, 0x48 ; 72 19c72: be cf rjmp .-132 ; 0x19bf0 MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); } #endif //LCD_BL_PIN //! Enables/disables the bed heating while heating the nozzle for loading/unloading filament MENU_ITEM_TOGGLE_P(_N("HBed on load"), eeprom_read_byte((uint8_t *)EEPROM_HEAT_BED_ON_LOAD_FILAMENT) ? _T(MSG_YES) : _T(MSG_NO), lcd_heat_bed_on_load_toggle); ////MSG_HEAT_BED_ON_LOAD c=12 19c74: 8f e9 ldi r24, 0x9F ; 159 19c76: 98 e4 ldi r25, 0x48 ; 72 19c78: d0 cf rjmp .-96 ; 0x19c1a { MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode); } MENU_END(); } 19c7a: df 91 pop r29 19c7c: cf 91 pop r28 19c7e: 1f 91 pop r17 19c80: 08 95 ret 00019c82 : } #endif //TMC2130 static void lcd_calibration_menu() { MENU_BEGIN(); 19c82: 0e 94 0c 74 call 0xe818 ; 0xe818 19c86: 10 92 60 04 sts 0x0460, r1 ; 0x800460 19c8a: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19c8e: 84 30 cpi r24, 0x04 ; 4 19c90: 08 f0 brcs .+2 ; 0x19c94 19c92: 7d c0 rjmp .+250 ; 0x19d8e 19c94: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 19c98: 8f ed ldi r24, 0xDF ; 223 19c9a: 98 e4 ldi r25, 0x48 ; 72 19c9c: 0e 94 3a 75 call 0xea74 ; 0xea74 19ca0: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_FUNCTION_P(_T(MSG_WIZARD), lcd_wizard); 19ca4: 81 e6 ldi r24, 0x61 ; 97 19ca6: 96 e4 ldi r25, 0x46 ; 70 19ca8: 0e 94 3a 75 call 0xea74 ; 0xea74 19cac: 61 ec ldi r22, 0xC1 ; 193 19cae: 7b ef ldi r23, 0xFB ; 251 19cb0: 0e 94 9d 72 call 0xe53a ; 0xe53a if (lcd_commands_type == LcdCommands::Idle) 19cb4: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 19cb8: 81 11 cpse r24, r1 19cba: 08 c0 rjmp .+16 ; 0x19ccc { MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), lcd_first_layer_calibration_reset); 19cbc: 80 ec ldi r24, 0xC0 ; 192 19cbe: 96 e4 ldi r25, 0x46 ; 70 19cc0: 0e 94 3a 75 call 0xea74 ; 0xea74 19cc4: 69 e9 ldi r22, 0x99 ; 153 19cc6: 78 ed ldi r23, 0xD8 ; 216 19cc8: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 } MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), G28W); 19ccc: 81 ec ldi r24, 0xC1 ; 193 19cce: 91 e6 ldi r25, 0x61 ; 97 19cd0: 0e 94 3a 75 call 0xea74 ; 0xea74 19cd4: 61 ed ldi r22, 0xD1 ; 209 19cd6: 78 e6 ldi r23, 0x68 ; 104 19cd8: 0e 94 68 8f call 0x11ed0 ; 0x11ed0 #ifdef TMC2130 MENU_ITEM_FUNCTION_P(_T(MSG_BELTTEST), lcd_belttest_v); #endif //TMC2130 MENU_ITEM_FUNCTION_P(_T(MSG_SELFTEST), lcd_selftest_v); 19cdc: 86 e5 ldi r24, 0x56 ; 86 19cde: 96 e4 ldi r25, 0x46 ; 70 19ce0: 0e 94 3a 75 call 0xea74 ; 0xea74 19ce4: 6c e7 ldi r22, 0x7C ; 124 19ce6: 73 ee ldi r23, 0xE3 ; 227 19ce8: 0e 94 9d 72 call 0xe53a ; 0xe53a // MK2 MENU_ITEM_FUNCTION_P(_T(MSG_CALIBRATE_BED), lcd_mesh_calibration); 19cec: 86 e4 ldi r24, 0x46 ; 70 19cee: 96 e4 ldi r25, 0x46 ; 70 19cf0: 0e 94 3a 75 call 0xea74 ; 0xea74 19cf4: 63 e7 ldi r22, 0x73 ; 115 19cf6: 74 ec ldi r23, 0xC4 ; 196 19cf8: 0e 94 9d 72 call 0xe53a ; 0xe53a // "Calibrate Z" with storing the reference values to EEPROM. MENU_ITEM_FUNCTION_P(_T(MSG_HOMEYZ), lcd_mesh_calibration_z); 19cfc: 88 e3 ldi r24, 0x38 ; 56 19cfe: 96 e4 ldi r25, 0x46 ; 70 19d00: 0e 94 3a 75 call 0xea74 ; 0xea74 19d04: 6a e7 ldi r22, 0x7A ; 122 19d06: 74 ec ldi r23, 0xC4 ; 196 19d08: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bedleveling); ////MSG_MESH_BED_LEVELING c=18 19d0c: 84 e2 ldi r24, 0x24 ; 36 19d0e: 96 e4 ldi r25, 0x46 ; 70 19d10: 0e 94 3a 75 call 0xea74 ; 0xea74 19d14: 61 e8 ldi r22, 0x81 ; 129 19d16: 74 ec ldi r23, 0xC4 ; 196 19d18: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_BED_CORRECTION_MENU), lcd_adjust_bed); 19d1c: 80 e1 ldi r24, 0x10 ; 16 19d1e: 96 e4 ldi r25, 0x46 ; 70 19d20: 0e 94 3a 75 call 0xea74 ; 0xea74 19d24: 6e e6 ldi r22, 0x6E ; 110 19d26: 7b ec ldi r23, 0xCB ; 203 19d28: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_PID_EXTRUDER), pid_extruder); 19d2c: 8e ef ldi r24, 0xFE ; 254 19d2e: 95 e4 ldi r25, 0x45 ; 69 19d30: 0e 94 3a 75 call 0xea74 ; 0xea74 19d34: 67 e8 ldi r22, 0x87 ; 135 19d36: 70 ec ldi r23, 0xC0 ; 192 19d38: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #ifndef TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_SHOW_END_STOPS), menu_show_end_stops); 19d3c: 8d ee ldi r24, 0xED ; 237 19d3e: 95 e4 ldi r25, 0x45 ; 69 19d40: 0e 94 3a 75 call 0xea74 ; 0xea74 19d44: 6d e6 ldi r22, 0x6D ; 109 19d46: 7f ed ldi r23, 0xDF ; 223 19d48: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #endif MENU_ITEM_GCODE_P(_T(MSG_CALIBRATE_BED_RESET), PSTR("M44")); 19d4c: 89 ed ldi r24, 0xD9 ; 217 19d4e: 95 e4 ldi r25, 0x45 ; 69 19d50: 0e 94 3a 75 call 0xea74 ; 0xea74 19d54: 6e e9 ldi r22, 0x9E ; 158 19d56: 73 e8 ldi r23, 0x83 ; 131 19d58: 0e 94 68 8f call 0x11ed0 ; 0x11ed0 #ifdef PINDA_THERMISTOR if(has_temperature_compensation()) 19d5c: 0f 94 58 13 call 0x226b0 ; 0x226b0 19d60: 88 23 and r24, r24 19d62: 41 f0 breq .+16 ; 0x19d74 MENU_ITEM_FUNCTION_P(_T(MSG_PINDA_CALIBRATION), lcd_calibrate_pinda); 19d64: 8c ec ldi r24, 0xCC ; 204 19d66: 95 e4 ldi r25, 0x45 ; 69 19d68: 0e 94 3a 75 call 0xea74 ; 0xea74 19d6c: 68 e8 ldi r22, 0x88 ; 136 19d6e: 74 ec ldi r23, 0xC4 ; 196 19d70: 0e 94 9d 72 call 0xe53a ; 0xe53a #ifdef THERMAL_MODEL MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal); #endif //THERMAL_MODEL MENU_END(); 19d74: 0e 94 83 62 call 0xc506 ; 0xc506 } #endif //TMC2130 static void lcd_calibration_menu() { MENU_BEGIN(); 19d78: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19d7c: 8f 5f subi r24, 0xFF ; 255 19d7e: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19d82: 80 91 62 04 lds r24, 0x0462 ; 0x800462 19d86: 8f 5f subi r24, 0xFF ; 255 19d88: 80 93 62 04 sts 0x0462, r24 ; 0x800462 19d8c: 7e cf rjmp .-260 ; 0x19c8a #ifdef THERMAL_MODEL MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal); #endif //THERMAL_MODEL MENU_END(); } 19d8e: 08 95 ret 00019d90 : } void lcd_move_e() { if ((int)degHotend0() > extrude_min_temp) 19d90: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 19d94: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 19d98: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 19d9c: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 19da0: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 19da4: 20 91 57 02 lds r18, 0x0257 ; 0x800257 19da8: 30 91 58 02 lds r19, 0x0258 ; 0x800258 19dac: 26 17 cp r18, r22 19dae: 37 07 cpc r19, r23 19db0: 0c f0 brlt .+2 ; 0x19db4 19db2: 65 c0 rjmp .+202 ; 0x19e7e { if (lcd_encoder != 0) 19db4: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 19db8: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 19dbc: 89 2b or r24, r25 19dbe: b9 f1 breq .+110 ; 0x19e2e { refresh_cmd_timeout(); 19dc0: 0e 94 41 65 call 0xca82 ; 0xca82 } FORCE_INLINE bool planner_queue_full() { uint8_t next_block_index = block_buffer_head; 19dc4: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e if (++ next_block_index == BLOCK_BUFFER_SIZE) 19dc8: 8f 5f subi r24, 0xFF ; 255 19dca: 80 31 cpi r24, 0x10 ; 16 19dcc: 09 f4 brne .+2 ; 0x19dd0 next_block_index = 0; 19dce: 80 e0 ldi r24, 0x00 ; 0 return block_buffer_tail == next_block_index; 19dd0: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f if (! planner_queue_full()) 19dd4: 98 17 cp r25, r24 19dd6: 59 f1 breq .+86 ; 0x19e2e { current_position[E_AXIS] += lcd_encoder; 19dd8: 60 91 1e 06 lds r22, 0x061E ; 0x80061e 19ddc: 70 91 1f 06 lds r23, 0x061F ; 0x80061f 19de0: 07 2e mov r0, r23 19de2: 00 0c add r0, r0 19de4: 88 0b sbc r24, r24 19de6: 99 0b sbc r25, r25 19de8: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 19dec: 9b 01 movw r18, r22 19dee: ac 01 movw r20, r24 19df0: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 19df4: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 19df8: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 19dfc: 90 91 70 12 lds r25, 0x1270 ; 0x801270 19e00: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 19e04: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 19e08: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 19e0c: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 19e10: 90 93 70 12 sts 0x1270, r25 ; 0x801270 lcd_encoder = 0; 19e14: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 19e18: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e plan_buffer_line_curposXYZE(manual_feedrate[E_AXIS] / 60); 19e1c: 65 e5 ldi r22, 0x55 ; 85 19e1e: 75 e5 ldi r23, 0x55 ; 85 19e20: 85 ed ldi r24, 0xD5 ; 213 19e22: 9f e3 ldi r25, 0x3F ; 63 19e24: 0f 94 81 4c call 0x29902 ; 0x29902 lcd_draw_update = 1; 19e28: 81 e0 ldi r24, 0x01 ; 1 19e2a: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } } if (lcd_draw_update) 19e2e: 80 91 59 02 lds r24, 0x0259 ; 0x800259 19e32: 88 23 and r24, r24 19e34: 11 f1 breq .+68 ; 0x19e7a { lcd_set_cursor(0, 1); 19e36: 61 e0 ldi r22, 0x01 ; 1 19e38: 80 e0 ldi r24, 0x00 ; 0 19e3a: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 //! The text needs to come with a colon ":", this function does not append it anymore. //! That resulted in a much shorter implementation (234628B -> 234476B) //! There are similar functions around which may be shortened in a similar way void menu_draw_float31(const char* str, float val) { lcd_printf_P(menu_fmt_float31, str, val); 19e3e: 80 91 70 12 lds r24, 0x1270 ; 0x801270 19e42: 8f 93 push r24 19e44: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 19e48: 8f 93 push r24 19e4a: 80 91 6e 12 lds r24, 0x126E ; 0x80126e 19e4e: 8f 93 push r24 19e50: 80 91 6d 12 lds r24, 0x126D ; 0x80126d 19e54: 8f 93 push r24 19e56: 89 e6 ldi r24, 0x69 ; 105 19e58: 92 e8 ldi r25, 0x82 ; 130 19e5a: 9f 93 push r25 19e5c: 8f 93 push r24 19e5e: 8a e5 ldi r24, 0x5A ; 90 19e60: 92 e8 ldi r25, 0x82 ; 130 19e62: 9f 93 push r25 19e64: 8f 93 push r24 19e66: 0e 94 0b 6f call 0xde16 ; 0xde16 19e6a: 8d b7 in r24, 0x3d ; 61 19e6c: 9e b7 in r25, 0x3e ; 62 19e6e: 08 96 adiw r24, 0x08 ; 8 19e70: 0f b6 in r0, 0x3f ; 63 19e72: f8 94 cli 19e74: 9e bf out 0x3e, r25 ; 62 19e76: 0f be out 0x3f, r0 ; 63 19e78: 8d bf out 0x3d, r24 ; 61 // Note: the colon behind the text is necessary to greatly shorten // the implementation of menu_draw_float31 menu_draw_float31(PSTR("Extruder:"), current_position[E_AXIS]); } menu_back_if_clicked(); 19e7a: 0c 94 06 74 jmp 0xe80c ; 0xe80c }; } void show_preheat_nozzle_warning() { lcd_clear(); 19e7e: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_ERROR)); 19e82: 87 e6 ldi r24, 0x67 ; 103 19e84: 9a e3 ldi r25, 0x3A ; 58 19e86: 0e 94 3a 75 call 0xea74 ; 0xea74 19e8a: ac 01 movw r20, r24 19e8c: 60 e0 ldi r22, 0x00 ; 0 19e8e: 80 e0 ldi r24, 0x00 ; 0 19e90: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 2, _T(MSG_PREHEAT_NOZZLE)); 19e94: 81 e5 ldi r24, 0x51 ; 81 19e96: 9a e3 ldi r25, 0x3A ; 58 19e98: 0e 94 3a 75 call 0xea74 ; 0xea74 19e9c: ac 01 movw r20, r24 19e9e: 62 e0 ldi r22, 0x02 ; 2 19ea0: 80 e0 ldi r24, 0x00 ; 0 19ea2: 0e 94 07 70 call 0xe00e ; 0xe00e _delay(2000); 19ea6: 60 ed ldi r22, 0xD0 ; 208 19ea8: 77 e0 ldi r23, 0x07 ; 7 19eaa: 80 e0 ldi r24, 0x00 ; 0 19eac: 90 e0 ldi r25, 0x00 ; 0 19eae: 0f 94 bd 0d call 0x21b7a ; 0x21b7a lcd_clear(); 19eb2: 0e 94 26 70 call 0xe04c ; 0xe04c menu_back_if_clicked(); } else { show_preheat_nozzle_warning(); lcd_return_to_status(); 19eb6: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00019eba : static void lcd_sd_refresh() { #if SDCARDDETECT == -1 card.mount(); #else card.presort(); 19eba: 0f 94 32 6f call 0x2de64 ; 0x2de64 #endif menu_top = 0; 19ebe: 10 92 92 03 sts 0x0392, r1 ; 0x800392 lcd_encoder = 0; 19ec2: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 19ec6: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e menu_data_reset(); //Forces reloading of cached variables. 19eca: 0c 94 af 62 jmp 0xc55e ; 0xc55e 00019ece : } } void CardReader::updir() { if(workDirDepth > 0) 19ece: 80 91 77 15 lds r24, 0x1577 ; 0x801577 19ed2: 88 23 and r24, r24 19ed4: f9 f0 breq .+62 ; 0x19f14 { --workDirDepth; 19ed6: 81 50 subi r24, 0x01 ; 1 19ed8: 80 93 77 15 sts 0x1577, r24 ; 0x801577 workDir = workDirParents[0]; 19edc: 93 e2 ldi r25, 0x23 ; 35 19ede: e5 ea ldi r30, 0xA5 ; 165 19ee0: f4 e1 ldi r31, 0x14 ; 20 19ee2: a2 e8 ldi r26, 0x82 ; 130 19ee4: b4 e1 ldi r27, 0x14 ; 20 19ee6: 01 90 ld r0, Z+ 19ee8: 0d 92 st X+, r0 19eea: 9a 95 dec r25 19eec: e1 f7 brne .-8 ; 0x19ee6 19eee: 25 ea ldi r18, 0xA5 ; 165 19ef0: 34 e1 ldi r19, 0x14 ; 20 for (uint8_t d = 0; d < workDirDepth; d++) 19ef2: 90 e0 ldi r25, 0x00 ; 0 19ef4: 98 17 cp r25, r24 19ef6: 60 f4 brcc .+24 ; 0x19f10 { workDirParents[d] = workDirParents[d+1]; 19ef8: 43 e2 ldi r20, 0x23 ; 35 19efa: f9 01 movw r30, r18 19efc: b3 96 adiw r30, 0x23 ; 35 19efe: d9 01 movw r26, r18 19f00: 01 90 ld r0, Z+ 19f02: 0d 92 st X+, r0 19f04: 4a 95 dec r20 19f06: e1 f7 brne .-8 ; 0x19f00 { if(workDirDepth > 0) { --workDirDepth; workDir = workDirParents[0]; for (uint8_t d = 0; d < workDirDepth; d++) 19f08: 9f 5f subi r25, 0xFF ; 255 19f0a: 2d 5d subi r18, 0xDD ; 221 19f0c: 3f 4f sbci r19, 0xFF ; 255 19f0e: f2 cf rjmp .-28 ; 0x19ef4 { workDirParents[d] = workDirParents[d+1]; } #ifdef SDCARD_SORT_ALPHA presort(); 19f10: 0f 94 32 6f call 0x2de64 ; 0x2de64 } static void lcd_sd_updir() { card.updir(); menu_top = 0; 19f14: 10 92 92 03 sts 0x0392, r1 ; 0x800392 lcd_encoder = 0; 19f18: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 19f1c: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e menu_data_reset(); //Forces reloading of cached variables. 19f20: 0c 94 af 62 jmp 0xc55e ; 0xc55e 00019f24 : static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); } static void mmu_preload_filament_menu() { 19f24: cf 93 push r28 MENU_BEGIN(); 19f26: 0e 94 0c 74 call 0xe818 ; 0xe818 19f2a: 10 92 60 04 sts 0x0460, r1 ; 0x800460 19f2e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19f32: 84 30 cpi r24, 0x04 ; 4 19f34: 60 f5 brcc .+88 ; 0x19f8e 19f36: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 19f3a: 8f ed ldi r24, 0xDF ; 223 19f3c: 98 e4 ldi r25, 0x48 ; 72 19f3e: 0e 94 3a 75 call 0xea74 ; 0xea74 19f42: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper); 19f46: 8d e7 ldi r24, 0x7D ; 125 19f48: 96 e4 ldi r25, 0x46 ; 70 19f4a: 0e 94 3a 75 call 0xea74 ; 0xea74 19f4e: 66 e8 ldi r22, 0x86 ; 134 19f50: 70 ed ldi r23, 0xD0 ; 208 19f52: 0e 94 9d 72 call 0xe53a ; 0xe53a for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 19f56: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); 19f58: 82 e4 ldi r24, 0x42 ; 66 19f5a: 97 e4 ldi r25, 0x47 ; 71 19f5c: 0e 94 3a 75 call 0xea74 ; 0xea74 19f60: 61 e3 ldi r22, 0x31 ; 49 19f62: 6c 0f add r22, r28 19f64: 2c 2f mov r18, r28 19f66: 45 e9 ldi r20, 0x95 ; 149 19f68: 50 ed ldi r21, 0xD0 ; 208 19f6a: 0e 94 2f 72 call 0xe45e ; 0xe45e static void mmu_preload_filament_menu() { MENU_BEGIN(); MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 19f6e: cf 5f subi r28, 0xFF ; 255 19f70: c5 30 cpi r28, 0x05 ; 5 19f72: 91 f7 brne .-28 ; 0x19f58 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); MENU_END(); 19f74: 0e 94 83 62 call 0xc506 ; 0xc506 static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); } static void mmu_preload_filament_menu() { MENU_BEGIN(); 19f78: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19f7c: 8f 5f subi r24, 0xFF ; 255 19f7e: 80 93 60 04 sts 0x0460, r24 ; 0x800460 19f82: 80 91 62 04 lds r24, 0x0462 ; 0x800462 19f86: 8f 5f subi r24, 0xFF ; 255 19f88: 80 93 62 04 sts 0x0462, r24 ; 0x800462 19f8c: d0 cf rjmp .-96 ; 0x19f2e MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); MENU_END(); } 19f8e: cf 91 pop r28 19f90: 08 95 ret 00019f92 : static void lcd_mmuCutFilament() { preheat_or_continue(FilamentAction::MmuCut); } static void lcd_mmuLoadFilament() { preheat_or_continue(FilamentAction::MmuLoad); 19f92: 84 e0 ldi r24, 0x04 ; 4 19f94: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00019f98 : } static void lcd_mmuUnloadFilament() { preheat_or_continue(FilamentAction::MmuUnLoad); 19f98: 85 e0 ldi r24, 0x05 ; 5 19f9a: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00019f9e : } static void lcd_mmuEjectFilament() { preheat_or_continue(FilamentAction::MmuEject); 19f9e: 86 e0 ldi r24, 0x06 ; 6 19fa0: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00019fa4 : static void lcd_mmuLoadingTest() { preheat_or_continue(FilamentAction::MmuLoadingTest); } static void lcd_mmuCutFilament() { preheat_or_continue(FilamentAction::MmuCut); 19fa4: 87 e0 ldi r24, 0x07 ; 7 19fa6: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00019faa : MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); MENU_END(); } static void lcd_mmuLoadingTest() { preheat_or_continue(FilamentAction::MmuLoadingTest); 19faa: 88 e0 ldi r24, 0x08 ; 8 19fac: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00019fb0 : 19fb0: 60 91 ca 03 lds r22, 0x03CA ; 0x8003ca 19fb4: 81 ea ldi r24, 0xA1 ; 161 19fb6: 9d e0 ldi r25, 0x0D ; 13 19fb8: 0f 94 04 a4 call 0x34808 ; 0x34808 } static void change_sheet() { eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), selected_sheet); menu_back(3); 19fbc: 83 e0 ldi r24, 0x03 ; 3 19fbe: 0c 94 ff 62 jmp 0xc5fe ; 0xc5fe 00019fc2 : // Clear the filament action clearFilamentAction(); } static void mmu_loading_test_menu() { 19fc2: cf 93 push r28 MENU_BEGIN(); 19fc4: 0e 94 0c 74 call 0xe818 ; 0xe818 19fc8: 10 92 60 04 sts 0x0460, r1 ; 0x800460 19fcc: 80 91 60 04 lds r24, 0x0460 ; 0x800460 19fd0: 84 30 cpi r24, 0x04 ; 4 19fd2: 88 f5 brcc .+98 ; 0x1a036 19fd4: 10 92 63 04 sts 0x0463, r1 ; 0x800463 ON_MENU_LEAVE( 19fd8: 0e 94 4c 62 call 0xc498 ; 0xc498 19fdc: 81 11 cpse r24, r1 19fde: 0f 94 d6 0b call 0x217ac ; 0x217ac clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 19fe2: 8f ed ldi r24, 0xDF ; 223 19fe4: 98 e4 ldi r25, 0x48 ; 72 19fe6: 0e 94 3a 75 call 0xea74 ; 0xea74 19fea: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper); 19fee: 8d e7 ldi r24, 0x7D ; 125 19ff0: 96 e4 ldi r25, 0x46 ; 70 19ff2: 0e 94 3a 75 call 0xea74 ; 0xea74 19ff6: 6b ee ldi r22, 0xEB ; 235 19ff8: 7e ef ldi r23, 0xFE ; 254 19ffa: 0e 94 9d 72 call 0xe53a ; 0xe53a for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 19ffe: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); 1a000: 82 e4 ldi r24, 0x42 ; 66 1a002: 97 e4 ldi r25, 0x47 ; 71 1a004: 0e 94 3a 75 call 0xea74 ; 0xea74 1a008: 61 e3 ldi r22, 0x31 ; 49 1a00a: 6c 0f add r22, r28 1a00c: 2c 2f mov r18, r28 1a00e: 46 ed ldi r20, 0xD6 ; 214 1a010: 5e ef ldi r21, 0xFE ; 254 1a012: 0e 94 2f 72 call 0xe45e ; 0xe45e ON_MENU_LEAVE( clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1a016: cf 5f subi r28, 0xFF ; 255 1a018: c5 30 cpi r28, 0x05 ; 5 1a01a: 91 f7 brne .-28 ; 0x1a000 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); MENU_END(); 1a01c: 0e 94 83 62 call 0xc506 ; 0xc506 // Clear the filament action clearFilamentAction(); } static void mmu_loading_test_menu() { MENU_BEGIN(); 1a020: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1a024: 8f 5f subi r24, 0xFF ; 255 1a026: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1a02a: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1a02e: 8f 5f subi r24, 0xFF ; 255 1a030: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1a034: cb cf rjmp .-106 ; 0x19fcc MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); MENU_END(); } 1a036: cf 91 pop r28 1a038: 08 95 ret 0001a03a : } // Helper function to save code size by reducing duplicated code // These menus are not time critical static void mmu_common_choose_filament_menu(const char * label, void (*menuAction)(uint8_t)) { 1a03a: ef 92 push r14 1a03c: ff 92 push r15 1a03e: 0f 93 push r16 1a040: 1f 93 push r17 1a042: cf 93 push r28 1a044: 8c 01 movw r16, r24 1a046: 7b 01 movw r14, r22 MENU_BEGIN(); 1a048: 0e 94 0c 74 call 0xe818 ; 0xe818 1a04c: 10 92 60 04 sts 0x0460, r1 ; 0x800460 1a050: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1a054: 84 30 cpi r24, 0x04 ; 4 1a056: 28 f5 brcc .+74 ; 0x1a0a2 1a058: 10 92 63 04 sts 0x0463, r1 ; 0x800463 ON_MENU_LEAVE( 1a05c: 0e 94 4c 62 call 0xc498 ; 0xc498 1a060: 81 11 cpse r24, r1 1a062: 0f 94 d6 0b call 0x217ac ; 0x217ac clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1a066: 8f ed ldi r24, 0xDF ; 223 1a068: 98 e4 ldi r25, 0x48 ; 72 1a06a: 0e 94 3a 75 call 0xea74 ; 0xea74 1a06e: 0e 94 ce 72 call 0xe59c ; 0xe59c for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1a072: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); 1a074: 61 e3 ldi r22, 0x31 ; 49 1a076: 6c 0f add r22, r28 1a078: 2c 2f mov r18, r28 1a07a: a7 01 movw r20, r14 1a07c: c8 01 movw r24, r16 1a07e: 0e 94 2f 72 call 0xe45e ; 0xe45e MENU_BEGIN(); ON_MENU_LEAVE( clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1a082: cf 5f subi r28, 0xFF ; 255 1a084: c5 30 cpi r28, 0x05 ; 5 1a086: b1 f7 brne .-20 ; 0x1a074 MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); MENU_END(); 1a088: 0e 94 83 62 call 0xc506 ; 0xc506 // Helper function to save code size by reducing duplicated code // These menus are not time critical static void mmu_common_choose_filament_menu(const char * label, void (*menuAction)(uint8_t)) { MENU_BEGIN(); 1a08c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1a090: 8f 5f subi r24, 0xFF ; 255 1a092: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1a096: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1a09a: 8f 5f subi r24, 0xFF ; 255 1a09c: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1a0a0: d7 cf rjmp .-82 ; 0x1a050 ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); MENU_END(); } 1a0a2: cf 91 pop r28 1a0a4: 1f 91 pop r17 1a0a6: 0f 91 pop r16 1a0a8: ff 90 pop r15 1a0aa: ef 90 pop r14 1a0ac: 08 95 ret 0001a0ae : static inline void mmu_cut_filament_wrapper(uint8_t index){ MMU2::mmu2.cut_filament(index); } static void mmu_cut_filament_menu() { mmu_common_choose_filament_menu(_T(MSG_CUT_FILAMENT), mmu_cut_filament_wrapper); 1a0ae: 8d ec ldi r24, 0xCD ; 205 1a0b0: 91 e6 ldi r25, 0x61 ; 97 1a0b2: 0e 94 3a 75 call 0xea74 ; 0xea74 1a0b6: 6f e6 ldi r22, 0x6F ; 111 1a0b8: 70 ed ldi r23, 0xD0 ; 208 1a0ba: 0c 94 1d d0 jmp 0x1a03a ; 0x1a03a 0001a0be : // Clear the filament action clearFilamentAction(); } static void mmu_fil_eject_menu() { mmu_common_choose_filament_menu(_T(MSG_EJECT_FROM_MMU), mmu_eject_filament); 1a0be: 8c ed ldi r24, 0xDC ; 220 1a0c0: 91 e6 ldi r25, 0x61 ; 97 1a0c2: 0e 94 3a 75 call 0xea74 ; 0xea74 1a0c6: 6b e7 ldi r22, 0x7B ; 123 1a0c8: 70 ed ldi r23, 0xD0 ; 208 1a0ca: 0c 94 1d d0 jmp 0x1a03a ; 0x1a03a 0001a0ce : MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); MENU_END(); } static void mmu_load_to_nozzle_menu() { mmu_common_choose_filament_menu(_T(MSG_LOAD_FILAMENT), lcd_mmu_load_to_nozzle_wrapper); 1a0ce: 82 e4 ldi r24, 0x42 ; 66 1a0d0: 97 e4 ldi r25, 0x47 ; 71 1a0d2: 0e 94 3a 75 call 0xea74 ; 0xea74 1a0d6: 6c e6 ldi r22, 0x6C ; 108 1a0d8: 7e ef ldi r23, 0xFE ; 254 1a0da: 0c 94 1d d0 jmp 0x1a03a ; 0x1a03a 0001a0de : static void mmu_fil_eject_menu() { mmu_common_choose_filament_menu(_T(MSG_EJECT_FROM_MMU), mmu_eject_filament); } #ifdef MMU_HAS_CUTTER static inline void mmu_cut_filament_wrapper(uint8_t index){ 1a0de: cf 93 push r28 1a0e0: c8 2f mov r28, r24 IncrementMMUFails(); } } bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { if (!WaitForMMUReady()) { 1a0e2: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1a0e6: 88 23 and r24, r24 1a0e8: 21 f0 breq .+8 ; 0x1a0f2 1a0ea: 8c 2f mov r24, r28 MMU2::mmu2.cut_filament(index); } 1a0ec: cf 91 pop r28 1a0ee: 0d 94 49 9e jmp 0x33c92 ; 0x33c92 1a0f2: cf 91 pop r28 1a0f4: 08 95 ret 0001a0f6 : static void mmu_load_to_nozzle_menu() { mmu_common_choose_filament_menu(_T(MSG_LOAD_FILAMENT), lcd_mmu_load_to_nozzle_wrapper); } static void mmu_eject_filament(uint8_t filament) { 1a0f6: cf 93 push r28 1a0f8: c8 2f mov r28, r24 menu_back(); 1a0fa: 0e 94 1b 63 call 0xc636 ; 0xc636 MMU2::mmu2.eject_filament(filament, true); 1a0fe: 61 e0 ldi r22, 0x01 ; 1 1a100: 8c 2f mov r24, r28 1a102: 0f 94 cc 9d call 0x33b98 ; 0x33b98 // Clear the filament action clearFilamentAction(); } 1a106: cf 91 pop r28 static void mmu_eject_filament(uint8_t filament) { menu_back(); MMU2::mmu2.eject_filament(filament, true); // Clear the filament action clearFilamentAction(); 1a108: 0d 94 d6 0b jmp 0x217ac ; 0x217ac 0001a10c : } static inline void load_all_wrapper(){ for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ MMU2::mmu2.load_filament(i); 1a10c: 80 e0 ldi r24, 0x00 ; 0 1a10e: 0f 94 89 9d call 0x33b12 ; 0x33b12 1a112: 81 e0 ldi r24, 0x01 ; 1 1a114: 0f 94 89 9d call 0x33b12 ; 0x33b12 1a118: 82 e0 ldi r24, 0x02 ; 2 1a11a: 0f 94 89 9d call 0x33b12 ; 0x33b12 1a11e: 83 e0 ldi r24, 0x03 ; 3 1a120: 0f 94 89 9d call 0x33b12 ; 0x33b12 1a124: 84 e0 ldi r24, 0x04 ; 4 1a126: 0d 94 89 9d jmp 0x33b12 ; 0x33b12 0001a12a : } } static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); 1a12a: 0d 94 89 9d jmp 0x33b12 ; 0x33b12 0001a12e : break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 1a12e: 80 e0 ldi r24, 0x00 ; 0 1a130: 0d 94 43 95 jmp 0x32a86 ; 0x32a86 0001a134 : lcd_sheet_menu(); } static void sheets_menu() { MENU_BEGIN(); 1a134: 0e 94 0c 74 call 0xe818 ; 0xe818 1a138: 10 92 60 04 sts 0x0460, r1 ; 0x800460 1a13c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1a140: 84 30 cpi r24, 0x04 ; 4 1a142: 08 f0 brcs .+2 ; 0x1a146 1a144: 45 c0 rjmp .+138 ; 0x1a1d0 1a146: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_HW_SETUP)); 1a14a: 85 e8 ldi r24, 0x85 ; 133 1a14c: 95 e4 ldi r25, 0x45 ; 69 1a14e: 0e 94 3a 75 call 0xea74 ; 0xea74 1a152: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[0], select_sheet_menu<0>); 1a156: 69 e9 ldi r22, 0x99 ; 153 1a158: 73 ec ldi r23, 0xC3 ; 195 1a15a: 89 e4 ldi r24, 0x49 ; 73 1a15c: 9d e0 ldi r25, 0x0D ; 13 1a15e: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[1], select_sheet_menu<1>); 1a162: 64 e9 ldi r22, 0x94 ; 148 1a164: 73 ec ldi r23, 0xC3 ; 195 1a166: 84 e5 ldi r24, 0x54 ; 84 1a168: 9d e0 ldi r25, 0x0D ; 13 1a16a: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[2], select_sheet_menu<2>); 1a16e: 6f e8 ldi r22, 0x8F ; 143 1a170: 73 ec ldi r23, 0xC3 ; 195 1a172: 8f e5 ldi r24, 0x5F ; 95 1a174: 9d e0 ldi r25, 0x0D ; 13 1a176: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[3], select_sheet_menu<3>); 1a17a: 6a e8 ldi r22, 0x8A ; 138 1a17c: 73 ec ldi r23, 0xC3 ; 195 1a17e: 8a e6 ldi r24, 0x6A ; 106 1a180: 9d e0 ldi r25, 0x0D ; 13 1a182: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[4], select_sheet_menu<4>); 1a186: 65 e8 ldi r22, 0x85 ; 133 1a188: 73 ec ldi r23, 0xC3 ; 195 1a18a: 85 e7 ldi r24, 0x75 ; 117 1a18c: 9d e0 ldi r25, 0x0D ; 13 1a18e: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[5], select_sheet_menu<5>); 1a192: 60 e8 ldi r22, 0x80 ; 128 1a194: 73 ec ldi r23, 0xC3 ; 195 1a196: 80 e8 ldi r24, 0x80 ; 128 1a198: 9d e0 ldi r25, 0x0D ; 13 1a19a: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[6], select_sheet_menu<6>); 1a19e: 6b e7 ldi r22, 0x7B ; 123 1a1a0: 73 ec ldi r23, 0xC3 ; 195 1a1a2: 8b e8 ldi r24, 0x8B ; 139 1a1a4: 9d e0 ldi r25, 0x0D ; 13 1a1a6: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[7], select_sheet_menu<7>); 1a1aa: 66 e7 ldi r22, 0x76 ; 118 1a1ac: 73 ec ldi r23, 0xC3 ; 195 1a1ae: 86 e9 ldi r24, 0x96 ; 150 1a1b0: 9d e0 ldi r25, 0x0D ; 13 1a1b2: 0e 94 25 76 call 0xec4a ; 0xec4a MENU_END(); 1a1b6: 0e 94 83 62 call 0xc506 ; 0xc506 lcd_sheet_menu(); } static void sheets_menu() { MENU_BEGIN(); 1a1ba: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1a1be: 8f 5f subi r24, 0xFF ; 255 1a1c0: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1a1c4: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1a1c8: 8f 5f subi r24, 0xFF ; 255 1a1ca: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1a1ce: b6 cf rjmp .-148 ; 0x1a13c MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[4], select_sheet_menu<4>); MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[5], select_sheet_menu<5>); MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[6], select_sheet_menu<6>); MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[7], select_sheet_menu<7>); MENU_END(); } 1a1d0: 08 95 ret 0001a1d2 : } _menu_data_adjust_bed_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_adjust_bed_t),"_menu_data_adjust_bed_t doesn't fit into menu_data"); void lcd_adjust_bed_reset(void) { eeprom_adjust_bed_reset(); 1a1d2: 0e 94 df 78 call 0xf1be ; 0xf1be _menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]); _md->status = 0; 1a1d6: 10 92 a3 03 sts 0x03A3, r1 ; 0x8003a3 } 1a1da: 08 95 ret 0001a1dc : //! |Y 00.00mm| c=10 //! ---------------------- //! @endcode //! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. static void lcd_menu_xyz_offset() { 1a1dc: cf 93 push r28 1a1de: df 93 push r29 lcd_puts_at_P(0, 0, _T(MSG_MEASURED_OFFSET)); 1a1e0: 81 ec ldi r24, 0xC1 ; 193 1a1e2: 9a e3 ldi r25, 0x3A ; 58 1a1e4: 0e 94 3a 75 call 0xea74 ; 0xea74 1a1e8: ac 01 movw r20, r24 1a1ea: 60 e0 ldi r22, 0x00 ; 0 1a1ec: 80 e0 ldi r24, 0x00 ; 0 1a1ee: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 1, STR_SEPARATOR); 1a1f2: 41 e0 ldi r20, 0x01 ; 1 1a1f4: 54 e8 ldi r21, 0x84 ; 132 1a1f6: 61 e0 ldi r22, 0x01 ; 1 1a1f8: 80 e0 ldi r24, 0x00 ; 0 1a1fa: 0e 94 07 70 call 0xe00e ; 0xe00e for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(0, i + 2); 1a1fe: 62 e0 ldi r22, 0x02 ; 2 1a200: 80 e0 ldi r24, 0x00 ; 0 1a202: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i))); 1a206: 85 ee ldi r24, 0xE5 ; 229 1a208: 9f e0 ldi r25, 0x0F ; 15 1a20a: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 1a20e: 9f 93 push r25 1a210: 8f 93 push r24 1a212: 7f 93 push r23 1a214: 6f 93 push r22 1a216: 1f 92 push r1 1a218: 88 e5 ldi r24, 0x58 ; 88 1a21a: 8f 93 push r24 1a21c: c3 e7 ldi r28, 0x73 ; 115 1a21e: d2 e8 ldi r29, 0x82 ; 130 1a220: df 93 push r29 1a222: cf 93 push r28 1a224: 0e 94 0b 6f call 0xde16 ; 0xde16 { lcd_puts_at_P(0, 0, _T(MSG_MEASURED_OFFSET)); lcd_puts_at_P(0, 1, STR_SEPARATOR); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(0, i + 2); 1a228: 63 e0 ldi r22, 0x03 ; 3 1a22a: 80 e0 ldi r24, 0x00 ; 0 1a22c: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i))); 1a230: 89 ee ldi r24, 0xE9 ; 233 1a232: 9f e0 ldi r25, 0x0F ; 15 1a234: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 1a238: 9f 93 push r25 1a23a: 8f 93 push r24 1a23c: 7f 93 push r23 1a23e: 6f 93 push r22 1a240: 1f 92 push r1 1a242: 89 e5 ldi r24, 0x59 ; 89 1a244: 8f 93 push r24 1a246: df 93 push r29 1a248: cf 93 push r28 1a24a: 0e 94 0b 6f call 0xde16 ; 0xde16 } menu_back_if_clicked(); 1a24e: 8d b7 in r24, 0x3d ; 61 1a250: 9e b7 in r25, 0x3e ; 62 1a252: 40 96 adiw r24, 0x10 ; 16 1a254: 0f b6 in r0, 0x3f ; 63 1a256: f8 94 cli 1a258: 9e bf out 0x3e, r25 ; 62 1a25a: 0f be out 0x3f, r0 ; 63 1a25c: 8d bf out 0x3d, r24 ; 61 } 1a25e: df 91 pop r29 1a260: cf 91 pop r28 for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(0, i + 2); lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i))); } menu_back_if_clicked(); 1a262: 0c 94 06 74 jmp 0xe80c ; 0xe80c 0001a266 : //! ---------------------- //! D - Degree sysmbol LCD_STR_DEGREE //! @endcode //! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. static void lcd_menu_xyz_skew() { 1a266: cf 92 push r12 1a268: df 92 push r13 1a26a: ef 92 push r14 1a26c: ff 92 push r15 1a26e: 0f 93 push r16 1a270: 1f 93 push r17 1a272: cf 93 push r28 1a274: df 93 push r29 float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW)); 1a276: 80 e6 ldi r24, 0x60 ; 96 1a278: 9f e0 ldi r25, 0x0F ; 15 1a27a: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 1a27e: 6b 01 movw r12, r22 1a280: 7c 01 movw r14, r24 lcd_home(); 1a282: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(_N( 1a286: 83 eb ldi r24, 0xB3 ; 179 1a288: 9a e3 ldi r25, 0x3A ; 58 1a28a: 0e 94 3a 75 call 0xea74 ; 0xea74 1a28e: 18 2f mov r17, r24 1a290: 09 2f mov r16, r25 1a292: 85 ea ldi r24, 0xA5 ; 165 1a294: 9a e3 ldi r25, 0x3A ; 58 1a296: 0e 94 3a 75 call 0xea74 ; 0xea74 1a29a: ec 01 movw r28, r24 1a29c: 85 e9 ldi r24, 0x95 ; 149 1a29e: 9a e3 ldi r25, 0x3A ; 58 1a2a0: 0e 94 3a 75 call 0xea74 ; 0xea74 1a2a4: 2e e3 ldi r18, 0x3E ; 62 1a2a6: 2f 93 push r18 1a2a8: 20 e8 ldi r18, 0x80 ; 128 1a2aa: 2f 93 push r18 1a2ac: 1f 92 push r1 1a2ae: 1f 92 push r1 1a2b0: 0f 93 push r16 1a2b2: 1f 93 push r17 1a2b4: 2d e3 ldi r18, 0x3D ; 61 1a2b6: 2f 93 push r18 1a2b8: 25 ef ldi r18, 0xF5 ; 245 1a2ba: 2f 93 push r18 1a2bc: 22 ec ldi r18, 0xC2 ; 194 1a2be: 2f 93 push r18 1a2c0: 20 e9 ldi r18, 0x90 ; 144 1a2c2: 2f 93 push r18 1a2c4: df 93 push r29 1a2c6: cf 93 push r28 1a2c8: 21 e0 ldi r18, 0x01 ; 1 1a2ca: 34 e8 ldi r19, 0x84 ; 132 1a2cc: 3f 93 push r19 1a2ce: 2f 93 push r18 1a2d0: 9f 93 push r25 1a2d2: 8f 93 push r24 1a2d4: 87 e7 ldi r24, 0x77 ; 119 1a2d6: 97 e6 ldi r25, 0x67 ; 103 1a2d8: 9f 93 push r25 1a2da: 8f 93 push r24 1a2dc: 0e 94 0b 6f call 0xde16 ; 0xde16 _T(MSG_MEASURED_SKEW), STR_SEPARATOR, _T(MSG_SLIGHT_SKEW), _deg(bed_skew_angle_mild), _T(MSG_SEVERE_SKEW), _deg(bed_skew_angle_extreme) ); lcd_set_cursor(15, 0); 1a2e0: 60 e0 ldi r22, 0x00 ; 0 1a2e2: 8f e0 ldi r24, 0x0F ; 15 1a2e4: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 if (angleDiff < 100){ 1a2e8: 8d b7 in r24, 0x3d ; 61 1a2ea: 9e b7 in r25, 0x3e ; 62 1a2ec: 42 96 adiw r24, 0x12 ; 18 1a2ee: 0f b6 in r0, 0x3f ; 63 1a2f0: f8 94 cli 1a2f2: 9e bf out 0x3e, r25 ; 62 1a2f4: 0f be out 0x3f, r0 ; 63 1a2f6: 8d bf out 0x3d, r24 ; 61 1a2f8: 20 e0 ldi r18, 0x00 ; 0 1a2fa: 30 e0 ldi r19, 0x00 ; 0 1a2fc: 48 ec ldi r20, 0xC8 ; 200 1a2fe: 52 e4 ldi r21, 0x42 ; 66 1a300: c7 01 movw r24, r14 1a302: b6 01 movw r22, r12 1a304: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1a308: 87 ff sbrs r24, 7 1a30a: 32 c0 rjmp .+100 ; 0x1a370 } //@brief Show measured axis skewness float _deg(float rad) { return rad * 180 / M_PI; 1a30c: 20 e0 ldi r18, 0x00 ; 0 1a30e: 30 e0 ldi r19, 0x00 ; 0 1a310: 44 e3 ldi r20, 0x34 ; 52 1a312: 53 e4 ldi r21, 0x43 ; 67 1a314: c7 01 movw r24, r14 1a316: b6 01 movw r22, r12 1a318: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1a31c: 2b ed ldi r18, 0xDB ; 219 1a31e: 3f e0 ldi r19, 0x0F ; 15 1a320: 49 e4 ldi r20, 0x49 ; 73 1a322: 50 e4 ldi r21, 0x40 ; 64 1a324: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> _T(MSG_SLIGHT_SKEW), _deg(bed_skew_angle_mild), _T(MSG_SEVERE_SKEW), _deg(bed_skew_angle_extreme) ); lcd_set_cursor(15, 0); if (angleDiff < 100){ lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff)); 1a328: 9f 93 push r25 1a32a: 8f 93 push r24 1a32c: 7f 93 push r23 1a32e: 6f 93 push r22 1a330: 80 e7 ldi r24, 0x70 ; 112 1a332: 97 e6 ldi r25, 0x67 ; 103 1a334: 9f 93 push r25 1a336: 8f 93 push r24 1a338: 0e 94 0b 6f call 0xde16 ; 0xde16 1a33c: 0f 90 pop r0 1a33e: 0f 90 pop r0 1a340: 0f 90 pop r0 1a342: 0f 90 pop r0 1a344: 0f 90 pop r0 1a346: 0f 90 pop r0 } else { lcd_puts_P(_T(MSG_NA)); } if (lcd_clicked()) 1a348: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1a34c: 88 23 and r24, r24 1a34e: b9 f0 breq .+46 ; 0x1a37e menu_goto(lcd_menu_xyz_offset, 0, true); 1a350: 20 e0 ldi r18, 0x00 ; 0 1a352: 41 e0 ldi r20, 0x01 ; 1 1a354: 70 e0 ldi r23, 0x00 ; 0 1a356: 60 e0 ldi r22, 0x00 ; 0 1a358: 8e ee ldi r24, 0xEE ; 238 1a35a: 90 ed ldi r25, 0xD0 ; 208 } 1a35c: df 91 pop r29 1a35e: cf 91 pop r28 1a360: 1f 91 pop r17 1a362: 0f 91 pop r16 1a364: ff 90 pop r15 1a366: ef 90 pop r14 1a368: df 90 pop r13 1a36a: cf 90 pop r12 lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff)); } else { lcd_puts_P(_T(MSG_NA)); } if (lcd_clicked()) menu_goto(lcd_menu_xyz_offset, 0, true); 1a36c: 0c 94 b7 62 jmp 0xc56e ; 0xc56e ); lcd_set_cursor(15, 0); if (angleDiff < 100){ lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff)); } else { lcd_puts_P(_T(MSG_NA)); 1a370: 83 e7 ldi r24, 0x73 ; 115 1a372: 98 e4 ldi r25, 0x48 ; 72 1a374: 0e 94 3a 75 call 0xea74 ; 0xea74 1a378: 0e 94 1d 6f call 0xde3a ; 0xde3a 1a37c: e5 cf rjmp .-54 ; 0x1a348 } if (lcd_clicked()) menu_goto(lcd_menu_xyz_offset, 0, true); } 1a37e: df 91 pop r29 1a380: cf 91 pop r28 1a382: 1f 91 pop r17 1a384: 0f 91 pop r16 1a386: ff 90 pop r15 1a388: ef 90 pop r14 1a38a: df 90 pop r13 1a38c: cf 90 pop r12 1a38e: 08 95 ret 0001a390 : //! //! @param header Header text //! @param item Item text //! @param last_item Last item text, or nullptr if there is no Last item //! @return selected item index, first item index is 0 uint8_t choose_menu_P(const char *header, const char *item, const char *last_item) 1a390: 4f 92 push r4 1a392: 5f 92 push r5 1a394: 6f 92 push r6 1a396: 7f 92 push r7 1a398: 8f 92 push r8 1a39a: 9f 92 push r9 1a39c: af 92 push r10 1a39e: bf 92 push r11 1a3a0: cf 92 push r12 1a3a2: df 92 push r13 1a3a4: ef 92 push r14 1a3a6: ff 92 push r15 1a3a8: 0f 93 push r16 1a3aa: 1f 93 push r17 1a3ac: cf 93 push r28 1a3ae: df 93 push r29 1a3b0: 6c 01 movw r12, r24 1a3b2: 7b 01 movw r14, r22 1a3b4: 80 91 01 13 lds r24, 0x1301 ; 0x801301 { //following code should handle 3 to 127 number of items well const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4); 1a3b8: 67 2b or r22, r23 1a3ba: 29 f0 breq .+10 ; 0x1a3c6 1a3bc: 06 e0 ldi r16, 0x06 ; 6 1a3be: 81 30 cpi r24, 0x01 ; 1 1a3c0: 29 f0 breq .+10 ; 0x1a3cc 1a3c2: 05 e0 ldi r16, 0x05 ; 5 1a3c4: 03 c0 rjmp .+6 ; 0x1a3cc 1a3c6: 04 e0 ldi r16, 0x04 ; 4 1a3c8: 81 30 cpi r24, 0x01 ; 1 1a3ca: d9 f3 breq .-10 ; 0x1a3c2 const uint8_t item_len = item?strlen_P(item):0; int8_t first = 0; int8_t cursor_pos = 1; lcd_clear(); 1a3cc: 0e 94 26 70 call 0xe04c ; 0xe04c KEEPALIVE_STATE(PAUSED_FOR_USER); 1a3d0: 84 e0 ldi r24, 0x04 ; 4 1a3d2: 80 93 78 02 sts 0x0278, r24 ; 0x800278 { //following code should handle 3 to 127 number of items well const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4); const uint8_t item_len = item?strlen_P(item):0; int8_t first = 0; int8_t cursor_pos = 1; 1a3d6: c1 e0 ldi r28, 0x01 ; 1 uint8_t choose_menu_P(const char *header, const char *item, const char *last_item) { //following code should handle 3 to 127 number of items well const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4); const uint8_t item_len = item?strlen_P(item):0; int8_t first = 0; 1a3d8: 81 2c mov r8, r1 } if (cursor_pos > 3) { cursor_pos = 3; if (first < items_no - 3) 1a3da: 03 50 subi r16, 0x03 ; 3 1a3dc: 11 0b sbc r17, r17 lcd_clear(); KEEPALIVE_STATE(PAUSED_FOR_USER); while (1) { manage_heater(); 1a3de: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1a3e2: 81 e0 ldi r24, 0x01 ; 1 1a3e4: 0e 94 34 8c call 0x11868 ; 0x11868 if (lcd_encoder) 1a3e8: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 1a3ec: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 1a3f0: 00 97 sbiw r24, 0x00 ; 0 1a3f2: 09 f4 brne .+2 ; 0x1a3f6 1a3f4: 9d c0 rjmp .+314 ; 0x1a530 { if (lcd_encoder < 0) 1a3f6: 97 ff sbrs r25, 7 1a3f8: 88 c0 rjmp .+272 ; 0x1a50a { cursor_pos--; 1a3fa: c1 50 subi r28, 0x01 ; 1 if (lcd_encoder > 0) { cursor_pos++; } lcd_encoder = 0; 1a3fc: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1a400: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e } if (cursor_pos > 3) 1a404: c4 30 cpi r28, 0x04 ; 4 1a406: 0c f4 brge .+2 ; 0x1a40a 1a408: 86 c0 rjmp .+268 ; 0x1a516 { cursor_pos = 3; if (first < items_no - 3) 1a40a: 88 2d mov r24, r8 1a40c: 08 2c mov r0, r8 1a40e: 00 0c add r0, r0 1a410: 99 0b sbc r25, r25 1a412: 80 17 cp r24, r16 1a414: 91 07 cpc r25, r17 1a416: 0c f0 brlt .+2 ; 0x1a41a 1a418: 7a c0 rjmp .+244 ; 0x1a50e { first++; 1a41a: 83 94 inc r8 lcd_clear(); 1a41c: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_encoder = 0; } if (cursor_pos > 3) { cursor_pos = 3; 1a420: c3 e0 ldi r28, 0x03 ; 3 } else { // here we are at the very end of the list Sound_MakeSound(e_SOUND_TYPE_BlindAlert); } } if (header) lcd_puts_at_P(0,0,header); 1a422: c1 14 cp r12, r1 1a424: d1 04 cpc r13, r1 1a426: 29 f0 breq .+10 ; 0x1a432 1a428: a6 01 movw r20, r12 1a42a: 60 e0 ldi r22, 0x00 ; 0 1a42c: 80 e0 ldi r24, 0x00 ; 0 1a42e: 0e 94 07 70 call 0xe00e ; 0xe00e const bool last_visible = (first == items_no - 3); 1a432: a8 2c mov r10, r8 1a434: 08 2c mov r0, r8 1a436: 00 0c add r0, r0 1a438: bb 08 sbc r11, r11 const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3; 1a43a: e1 14 cp r14, r1 1a43c: f1 04 cpc r15, r1 1a43e: 29 f0 breq .+10 ; 0x1a44a 1a440: 82 e0 ldi r24, 0x02 ; 2 1a442: 98 2e mov r9, r24 1a444: a0 16 cp r10, r16 1a446: b1 06 cpc r11, r17 1a448: 11 f0 breq .+4 ; 0x1a44e 1a44a: 93 e0 ldi r25, 0x03 ; 3 1a44c: 99 2e mov r9, r25 for (uint_least8_t i = 0; i < ordinary_items; i++) 1a44e: d0 e0 ldi r29, 0x00 ; 0 { if (item) lcd_puts_at_P(1, i + 1, item); 1a450: df 5f subi r29, 0xFF ; 255 1a452: 43 ef ldi r20, 0xF3 ; 243 1a454: 59 e6 ldi r21, 0x69 ; 105 1a456: 6d 2f mov r22, r29 1a458: 81 e0 ldi r24, 0x01 ; 1 1a45a: 0e 94 07 70 call 0xe00e ; 0xe00e if (header) lcd_puts_at_P(0,0,header); const bool last_visible = (first == items_no - 3); const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3; for (uint_least8_t i = 0; i < ordinary_items; i++) 1a45e: 9d 12 cpse r9, r29 1a460: f7 cf rjmp .-18 ; 0x1a450 1a462: 48 2c mov r4, r8 1a464: 08 2c mov r0, r8 1a466: 00 0c add r0, r0 1a468: 55 08 sbc r5, r5 1a46a: 66 08 sbc r6, r6 1a46c: 77 08 sbc r7, r7 1a46e: 8f ef ldi r24, 0xFF ; 255 1a470: 48 1a sub r4, r24 1a472: 58 0a sbc r5, r24 1a474: 68 0a sbc r6, r24 1a476: 78 0a sbc r7, r24 { if (item) lcd_puts_at_P(1, i + 1, item); } for (uint_least8_t i = 0; i < ordinary_items; i++) 1a478: 91 2c mov r9, r1 { lcd_set_cursor(2 + item_len, i+1); 1a47a: 93 94 inc r9 1a47c: 69 2d mov r22, r9 1a47e: 8a e0 ldi r24, 0x0A ; 10 1a480: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 1a484: c3 01 movw r24, r6 1a486: b2 01 movw r22, r4 1a488: 0e 94 db 71 call 0xe3b6 ; 0xe3b6 1a48c: 8f ef ldi r24, 0xFF ; 255 1a48e: 48 1a sub r4, r24 1a490: 58 0a sbc r5, r24 1a492: 68 0a sbc r6, r24 1a494: 78 0a sbc r7, r24 for (uint_least8_t i = 0; i < ordinary_items; i++) { if (item) lcd_puts_at_P(1, i + 1, item); } for (uint_least8_t i = 0; i < ordinary_items; i++) 1a496: d9 11 cpse r29, r9 1a498: f0 cf rjmp .-32 ; 0x1a47a { lcd_set_cursor(2 + item_len, i+1); lcd_print(first + i + 1); } if (last_item&&last_visible) lcd_puts_at_P(1, 3, last_item); 1a49a: e1 14 cp r14, r1 1a49c: f1 04 cpc r15, r1 1a49e: 41 f0 breq .+16 ; 0x1a4b0 1a4a0: a0 16 cp r10, r16 1a4a2: b1 06 cpc r11, r17 1a4a4: 29 f4 brne .+10 ; 0x1a4b0 1a4a6: a7 01 movw r20, r14 1a4a8: 63 e0 ldi r22, 0x03 ; 3 1a4aa: 81 e0 ldi r24, 0x01 ; 1 1a4ac: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 1, PSTR(" \n \n ")); 1a4b0: 4a e8 ldi r20, 0x8A ; 138 1a4b2: 57 e8 ldi r21, 0x87 ; 135 1a4b4: 61 e0 ldi r22, 0x01 ; 1 1a4b6: 80 e0 ldi r24, 0x00 ; 0 1a4b8: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc_at(0, cursor_pos, '>'); 1a4bc: 4e e3 ldi r20, 0x3E ; 62 1a4be: 6c 2f mov r22, r28 1a4c0: 80 e0 ldi r24, 0x00 ; 0 1a4c2: 0e 94 13 70 call 0xe026 ; 0xe026 _delay(100); 1a4c6: 64 e6 ldi r22, 0x64 ; 100 1a4c8: 70 e0 ldi r23, 0x00 ; 0 1a4ca: 80 e0 ldi r24, 0x00 ; 0 1a4cc: 90 e0 ldi r25, 0x00 ; 0 1a4ce: 0f 94 bd 0d call 0x21b7a ; 0x21b7a if (lcd_clicked()) 1a4d2: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1a4d6: 88 23 and r24, r24 1a4d8: 09 f4 brne .+2 ; 0x1a4dc 1a4da: 81 cf rjmp .-254 ; 0x1a3de { KEEPALIVE_STATE(IN_HANDLER); 1a4dc: 82 e0 ldi r24, 0x02 ; 2 1a4de: 80 93 78 02 sts 0x0278, r24 ; 0x800278 return(cursor_pos + first - 1); 1a4e2: 8f ef ldi r24, 0xFF ; 255 1a4e4: 8c 0f add r24, r28 1a4e6: 88 0d add r24, r8 } } } 1a4e8: df 91 pop r29 1a4ea: cf 91 pop r28 1a4ec: 1f 91 pop r17 1a4ee: 0f 91 pop r16 1a4f0: ff 90 pop r15 1a4f2: ef 90 pop r14 1a4f4: df 90 pop r13 1a4f6: cf 90 pop r12 1a4f8: bf 90 pop r11 1a4fa: af 90 pop r10 1a4fc: 9f 90 pop r9 1a4fe: 8f 90 pop r8 1a500: 7f 90 pop r7 1a502: 6f 90 pop r6 1a504: 5f 90 pop r5 1a506: 4f 90 pop r4 1a508: 08 95 ret cursor_pos--; } if (lcd_encoder > 0) { cursor_pos++; 1a50a: cf 5f subi r28, 0xFF ; 255 1a50c: 77 cf rjmp .-274 ; 0x1a3fc if (first < items_no - 3) { first++; lcd_clear(); } else { // here we are at the very end of the list Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1a50e: 87 e0 ldi r24, 0x07 ; 7 1a510: 0f 94 ad 25 call 0x24b5a ; 0x24b5a 1a514: 85 cf rjmp .-246 ; 0x1a420 } } if (cursor_pos < 1) 1a516: c1 11 cpse r28, r1 1a518: 84 cf rjmp .-248 ; 0x1a422 { cursor_pos = 1; if (first > 0) 1a51a: 18 14 cp r1, r8 1a51c: 2c f4 brge .+10 ; 0x1a528 { first--; 1a51e: 8a 94 dec r8 lcd_clear(); 1a520: 0e 94 26 70 call 0xe04c ; 0xe04c } } if (cursor_pos < 1) { cursor_pos = 1; 1a524: c1 e0 ldi r28, 0x01 ; 1 1a526: 7d cf rjmp .-262 ; 0x1a422 if (first > 0) { first--; lcd_clear(); } else { // here we are at the very end of the list Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1a528: 87 e0 ldi r24, 0x07 ; 7 1a52a: 0f 94 ad 25 call 0x24b5a ; 0x24b5a 1a52e: fa cf rjmp .-12 ; 0x1a524 cursor_pos++; } lcd_encoder = 0; } if (cursor_pos > 3) 1a530: c4 30 cpi r28, 0x04 ; 4 1a532: 0c f0 brlt .+2 ; 0x1a536 1a534: 6a cf rjmp .-300 ; 0x1a40a 1a536: 75 cf rjmp .-278 ; 0x1a422 0001a538 : // Update cached value lastReadRegisterValue = logic.rsp.paramValue; return true; } bool __attribute__((noinline)) MMU2::WriteRegister(uint8_t address, uint16_t data) { 1a538: ef 92 push r14 1a53a: ff 92 push r15 1a53c: 0f 93 push r16 1a53e: 1f 93 push r17 1a540: cf 93 push r28 1a542: df 93 push r29 1a544: 00 d0 rcall .+0 ; 0x1a546 1a546: 1f 92 push r1 1a548: 1f 92 push r1 1a54a: cd b7 in r28, 0x3d ; 61 1a54c: de b7 in r29, 0x3e ; 62 1a54e: 08 2f mov r16, r24 1a550: 16 2f mov r17, r22 1a552: f7 2e mov r15, r23 if (!WaitForMMUReady()) { 1a554: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1a558: 88 23 and r24, r24 1a55a: d9 f0 breq .+54 ; 0x1a592 return false; } // special cases - intercept requests of registers which influence the printer's behaviour too + perform the change even on the printer's side switch (address) { 1a55c: 0b 30 cpi r16, 0x0B ; 11 1a55e: 29 f1 breq .+74 ; 0x1a5aa 1a560: 04 31 cpi r16, 0x14 ; 20 1a562: 31 f1 breq .+76 ; 0x1a5b0 /// @param value to write into the register inline constexpr RequestMsg(RequestMsgCodes code, uint8_t address, uint16_t value) : code(code) , value(address) , value2(value) , crc8(ComputeCRC8()) { 1a564: 87 e5 ldi r24, 0x57 ; 87 1a566: e8 2e mov r14, r24 1a568: e9 82 std Y+1, r14 ; 0x01 1a56a: 0a 83 std Y+2, r16 ; 0x02 1a56c: 1b 83 std Y+3, r17 ; 0x03 1a56e: fc 82 std Y+4, r15 ; 0x04 1a570: ce 01 movw r24, r28 1a572: 01 96 adiw r24, 0x01 ; 1 1a574: 0f 94 a3 50 call 0x2a146 ; 0x2a146 1a578: 8d 83 std Y+5, r24 ; 0x05 void ProtocolLogic::ReadRegister(uint8_t address) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address)); } void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data)); 1a57a: 47 e5 ldi r20, 0x57 ; 87 1a57c: 50 2f mov r21, r16 1a57e: 61 2f mov r22, r17 1a580: 7f 2d mov r23, r15 1a582: 0f 94 19 95 call 0x32a32 ; 0x32a32 break; // do not intercept any other register writes } do { logic.WriteRegister(address, data); // we may signal the accepted/rejected status of the response as return value of this function } while (!manage_response(false, false)); 1a586: 60 e0 ldi r22, 0x00 ; 0 1a588: 80 e0 ldi r24, 0x00 ; 0 1a58a: 0f 94 aa 9c call 0x33954 ; 0x33954 1a58e: 88 23 and r24, r24 1a590: 59 f3 breq .-42 ; 0x1a568 return true; } 1a592: 0f 90 pop r0 1a594: 0f 90 pop r0 1a596: 0f 90 pop r0 1a598: 0f 90 pop r0 1a59a: 0f 90 pop r0 1a59c: df 91 pop r29 1a59e: cf 91 pop r28 1a5a0: 1f 91 pop r17 1a5a2: 0f 91 pop r16 1a5a4: ff 90 pop r15 1a5a6: ef 90 pop r14 1a5a8: 08 95 ret } // special cases - intercept requests of registers which influence the printer's behaviour too + perform the change even on the printer's side switch (address) { case (uint8_t)Register::Extra_Load_Distance: logic.PlanExtraLoadDistance(data); 1a5aa: 10 93 de 12 sts 0x12DE, r17 ; 0x8012de 1a5ae: da cf rjmp .-76 ; 0x1a564 break; case (uint8_t)Register::Pulley_Slow_Feedrate: logic.PlanPulleySlowFeedRate(data); 1a5b0: 10 93 df 12 sts 0x12DF, r17 ; 0x8012df 1a5b4: d7 cf rjmp .-82 ; 0x1a564 0001a5b6 : #elif F_CPU >= 16000000L // for the 16 MHz clock on most Arduino boards // for a one-microsecond delay, simply return. the overhead // of the function call takes 14 (16) cycles, which is 1us if (us <= 1) return; // = 3 cycles, (4 when true) 1a5b6: 82 30 cpi r24, 0x02 ; 2 1a5b8: 91 05 cpc r25, r1 1a5ba: 38 f0 brcs .+14 ; 0x1a5ca // the following loop takes 1/4 of a microsecond (4 cycles) // per iteration, so execute it four times for each microsecond of // delay requested. us <<= 2; // x4 us, = 4 cycles 1a5bc: 88 0f add r24, r24 1a5be: 99 1f adc r25, r25 1a5c0: 88 0f add r24, r24 1a5c2: 99 1f adc r25, r25 // account for the time taken in the preceeding commands. // we just burned 19 (21) cycles above, remove 5, (5*4=20) // us is at least 8 so we can substract 5 us -= 5; // = 2 cycles, 1a5c4: 05 97 sbiw r24, 0x05 ; 5 #endif // busy wait __asm__ __volatile__ ( 1a5c6: 01 97 sbiw r24, 0x01 ; 1 1a5c8: f1 f7 brne .-4 ; 0x1a5c6 "1: sbiw %0,1" "\n\t" // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles ); // return = 4 cycles } 1a5ca: 08 95 ret 0001a5cc : SREG = oldSREG; } int digitalRead(uint8_t pin) { 1a5cc: cf 93 push r28 1a5ce: df 93 push r29 uint8_t timer = digitalPinToTimer(pin); 1a5d0: 28 2f mov r18, r24 1a5d2: 30 e0 ldi r19, 0x00 ; 0 1a5d4: f9 01 movw r30, r18 1a5d6: e6 5d subi r30, 0xD6 ; 214 1a5d8: f9 47 sbci r31, 0x79 ; 121 1a5da: 84 91 lpm r24, Z uint8_t bit = digitalPinToBitMask(pin); 1a5dc: f9 01 movw r30, r18 1a5de: ec 52 subi r30, 0x2C ; 44 1a5e0: fa 47 sbci r31, 0x7A ; 122 1a5e2: d4 91 lpm r29, Z uint8_t port = digitalPinToPort(pin); 1a5e4: f9 01 movw r30, r18 1a5e6: e2 58 subi r30, 0x82 ; 130 1a5e8: fa 47 sbci r31, 0x7A ; 122 1a5ea: c4 91 lpm r28, Z if (port == NOT_A_PIN) return LOW; 1a5ec: cc 23 and r28, r28 1a5ee: a1 f0 breq .+40 ; 0x1a618 // If the pin that support PWM output, we need to turn it off // before getting a digital reading. if (timer != NOT_ON_TIMER) turnOffPWM(timer); 1a5f0: 81 11 cpse r24, r1 1a5f2: 0e 94 ec bc call 0x179d8 ; 0x179d8 if (*portInputRegister(port) & bit) return HIGH; 1a5f6: ec 2f mov r30, r28 1a5f8: f0 e0 ldi r31, 0x00 ; 0 1a5fa: ee 0f add r30, r30 1a5fc: ff 1f adc r31, r31 1a5fe: ec 59 subi r30, 0x9C ; 156 1a600: fa 47 sbci r31, 0x7A ; 122 1a602: a5 91 lpm r26, Z+ 1a604: b4 91 lpm r27, Z 1a606: ec 91 ld r30, X 1a608: ed 23 and r30, r29 1a60a: 81 e0 ldi r24, 0x01 ; 1 1a60c: 90 e0 ldi r25, 0x00 ; 0 1a60e: 09 f4 brne .+2 ; 0x1a612 1a610: 80 e0 ldi r24, 0x00 ; 0 return LOW; } 1a612: df 91 pop r29 1a614: cf 91 pop r28 1a616: 08 95 ret { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); if (port == NOT_A_PIN) return LOW; 1a618: 80 e0 ldi r24, 0x00 ; 0 1a61a: 90 e0 ldi r25, 0x00 ; 0 1a61c: fa cf rjmp .-12 ; 0x1a612 0001a61e : #endif } } void digitalWrite(uint8_t pin, uint8_t val) { 1a61e: 1f 93 push r17 1a620: cf 93 push r28 1a622: df 93 push r29 uint8_t timer = digitalPinToTimer(pin); 1a624: 28 2f mov r18, r24 1a626: 30 e0 ldi r19, 0x00 ; 0 1a628: f9 01 movw r30, r18 1a62a: e6 5d subi r30, 0xD6 ; 214 1a62c: f9 47 sbci r31, 0x79 ; 121 1a62e: 84 91 lpm r24, Z uint8_t bit = digitalPinToBitMask(pin); 1a630: f9 01 movw r30, r18 1a632: ec 52 subi r30, 0x2C ; 44 1a634: fa 47 sbci r31, 0x7A ; 122 1a636: d4 91 lpm r29, Z uint8_t port = digitalPinToPort(pin); 1a638: f9 01 movw r30, r18 1a63a: e2 58 subi r30, 0x82 ; 130 1a63c: fa 47 sbci r31, 0x7A ; 122 1a63e: c4 91 lpm r28, Z volatile uint8_t *out; if (port == NOT_A_PIN) return; 1a640: cc 23 and r28, r28 1a642: a9 f0 breq .+42 ; 0x1a66e 1a644: 16 2f mov r17, r22 // If the pin that support PWM output, we need to turn it off // before doing a digital write. if (timer != NOT_ON_TIMER) turnOffPWM(timer); 1a646: 81 11 cpse r24, r1 1a648: 0e 94 ec bc call 0x179d8 ; 0x179d8 out = portOutputRegister(port); 1a64c: ec 2f mov r30, r28 1a64e: f0 e0 ldi r31, 0x00 ; 0 1a650: ee 0f add r30, r30 1a652: ff 1f adc r31, r31 1a654: e6 5b subi r30, 0xB6 ; 182 1a656: fa 47 sbci r31, 0x7A ; 122 1a658: a5 91 lpm r26, Z+ 1a65a: b4 91 lpm r27, Z uint8_t oldSREG = SREG; 1a65c: 8f b7 in r24, 0x3f ; 63 cli(); 1a65e: f8 94 cli if (val == LOW) { *out &= ~bit; 1a660: ec 91 ld r30, X out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { 1a662: 11 11 cpse r17, r1 1a664: 08 c0 rjmp .+16 ; 0x1a676 *out &= ~bit; 1a666: d0 95 com r29 1a668: de 23 and r29, r30 } else { *out |= bit; 1a66a: dc 93 st X, r29 } SREG = oldSREG; 1a66c: 8f bf out 0x3f, r24 ; 63 } 1a66e: df 91 pop r29 1a670: cf 91 pop r28 1a672: 1f 91 pop r17 1a674: 08 95 ret cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; 1a676: de 2b or r29, r30 1a678: f8 cf rjmp .-16 ; 0x1a66a 0001a67a : #define ARDUINO_MAIN #include "wiring_private.h" #include "pins_arduino.h" void pinMode(uint8_t pin, uint8_t mode) { 1a67a: cf 93 push r28 1a67c: df 93 push r29 uint8_t bit = digitalPinToBitMask(pin); 1a67e: 90 e0 ldi r25, 0x00 ; 0 1a680: fc 01 movw r30, r24 1a682: ec 52 subi r30, 0x2C ; 44 1a684: fa 47 sbci r31, 0x7A ; 122 1a686: 24 91 lpm r18, Z uint8_t port = digitalPinToPort(pin); 1a688: 82 58 subi r24, 0x82 ; 130 1a68a: 9a 47 sbci r25, 0x7A ; 122 1a68c: fc 01 movw r30, r24 1a68e: 84 91 lpm r24, Z volatile uint8_t *reg, *out; if (port == NOT_A_PIN) return; 1a690: 88 23 and r24, r24 1a692: d1 f0 breq .+52 ; 0x1a6c8 // JWS: can I let the optimizer do this? reg = portModeRegister(port); 1a694: 90 e0 ldi r25, 0x00 ; 0 1a696: 88 0f add r24, r24 1a698: 99 1f adc r25, r25 1a69a: fc 01 movw r30, r24 1a69c: e0 5d subi r30, 0xD0 ; 208 1a69e: fa 47 sbci r31, 0x7A ; 122 1a6a0: a5 91 lpm r26, Z+ 1a6a2: b4 91 lpm r27, Z out = portOutputRegister(port); 1a6a4: fc 01 movw r30, r24 1a6a6: e6 5b subi r30, 0xB6 ; 182 1a6a8: fa 47 sbci r31, 0x7A ; 122 1a6aa: c5 91 lpm r28, Z+ 1a6ac: d4 91 lpm r29, Z if (mode == INPUT) { 1a6ae: 61 11 cpse r22, r1 1a6b0: 0e c0 rjmp .+28 ; 0x1a6ce uint8_t oldSREG = SREG; 1a6b2: 9f b7 in r25, 0x3f ; 63 cli(); 1a6b4: f8 94 cli *reg &= ~bit; 1a6b6: 8c 91 ld r24, X 1a6b8: e2 2f mov r30, r18 1a6ba: e0 95 com r30 1a6bc: 8e 23 and r24, r30 1a6be: 8c 93 st X, r24 *out &= ~bit; 1a6c0: 28 81 ld r18, Y 1a6c2: e2 23 and r30, r18 1a6c4: e8 83 st Y, r30 SREG = oldSREG; 1a6c6: 9f bf out 0x3f, r25 ; 63 uint8_t oldSREG = SREG; cli(); *reg |= bit; SREG = oldSREG; } } 1a6c8: df 91 pop r29 1a6ca: cf 91 pop r28 1a6cc: 08 95 ret cli(); *reg &= ~bit; *out |= bit; SREG = oldSREG; } else { uint8_t oldSREG = SREG; 1a6ce: 8f b7 in r24, 0x3f ; 63 cli(); 1a6d0: f8 94 cli *reg |= bit; 1a6d2: ec 91 ld r30, X 1a6d4: e2 2b or r30, r18 1a6d6: ec 93 st X, r30 SREG = oldSREG; 1a6d8: 8f bf out 0x3f, r24 ; 63 1a6da: f6 cf rjmp .-20 ; 0x1a6c8 0001a6dc : // Right now, PWM output only works on the pins with // hardware support. These are defined in the appropriate // pins_*.c file. For the rest of the pins, we default // to digital output. void analogWrite(uint8_t pin, int val) { 1a6dc: 1f 93 push r17 1a6de: cf 93 push r28 1a6e0: df 93 push r29 1a6e2: 18 2f mov r17, r24 1a6e4: eb 01 movw r28, r22 // We need to make sure the PWM output is enabled for those pins // that support it, as we turn it off when digitally reading or // writing with them. Also, make sure the pin is in output mode // for consistenty with Wiring, which doesn't require a pinMode // call for the analog output pins. pinMode(pin, OUTPUT); 1a6e6: 61 e0 ldi r22, 0x01 ; 1 1a6e8: 0e 94 3d d3 call 0x1a67a ; 0x1a67a if (val == 0) 1a6ec: 20 97 sbiw r28, 0x00 ; 0 1a6ee: 39 f4 brne .+14 ; 0x1a6fe { digitalWrite(pin, LOW); 1a6f0: 60 e0 ldi r22, 0x00 ; 0 } else if (val == 255) { digitalWrite(pin, HIGH); 1a6f2: 81 2f mov r24, r17 } else { digitalWrite(pin, HIGH); } } } } 1a6f4: df 91 pop r29 1a6f6: cf 91 pop r28 1a6f8: 1f 91 pop r17 { digitalWrite(pin, LOW); } else if (val == 255) { digitalWrite(pin, HIGH); 1a6fa: 0c 94 0f d3 jmp 0x1a61e ; 0x1a61e pinMode(pin, OUTPUT); if (val == 0) { digitalWrite(pin, LOW); } else if (val == 255) 1a6fe: cf 3f cpi r28, 0xFF ; 255 1a700: d1 05 cpc r29, r1 1a702: 11 f4 brne .+4 ; 0x1a708 { digitalWrite(pin, HIGH); 1a704: 61 e0 ldi r22, 0x01 ; 1 1a706: f5 cf rjmp .-22 ; 0x1a6f2 } else { switch(digitalPinToTimer(pin)) 1a708: e1 2f mov r30, r17 1a70a: f0 e0 ldi r31, 0x00 ; 0 1a70c: e6 5d subi r30, 0xD6 ; 214 1a70e: f9 47 sbci r31, 0x79 ; 121 1a710: e4 91 lpm r30, Z 1a712: e1 50 subi r30, 0x01 ; 1 1a714: e2 31 cpi r30, 0x12 ; 18 1a716: 08 f0 brcs .+2 ; 0x1a71a 1a718: b3 c0 rjmp .+358 ; 0x1a880 1a71a: f0 e0 ldi r31, 0x00 ; 0 1a71c: 88 27 eor r24, r24 1a71e: ec 56 subi r30, 0x6C ; 108 1a720: fc 42 sbci r31, 0x2C ; 44 1a722: 8f 4f sbci r24, 0xFF ; 255 1a724: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 1a728: a6 d3 rcall .+1868 ; 0x1ae76 1a72a: ae d3 rcall .+1884 ; 0x1ae88 1a72c: b3 d3 rcall .+1894 ; 0x1ae94 1a72e: bd d3 rcall .+1914 ; 0x1aeaa 1a730: c7 d3 rcall .+1934 ; 0x1aec0 1a732: 40 d4 rcall .+2176 ; 0x1afb4 1a734: d1 d3 rcall .+1954 ; 0x1aed8 1a736: d9 d3 rcall .+1970 ; 0x1aeea 1a738: e1 d3 rcall .+1986 ; 0x1aefc 1a73a: eb d3 rcall .+2006 ; 0x1af12 1a73c: f5 d3 rcall .+2026 ; 0x1af28 1a73e: ff d3 rcall .+2046 ; 0x1af3e 1a740: 0e d4 rcall .+2076 ; 0x1af5e 1a742: 18 d4 rcall .+2096 ; 0x1af74 1a744: 40 d4 rcall .+2176 ; 0x1afc6 1a746: 22 d4 rcall .+2116 ; 0x1af8c 1a748: 2c d4 rcall .+2136 ; 0x1afa2 1a74a: 36 d4 rcall .+2156 ; 0x1afb8 #endif #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: // connect pwm to pin on timer 0, channel A sbi(TCCR0A, COM0A1); 1a74c: 84 b5 in r24, 0x24 ; 36 1a74e: 80 68 ori r24, 0x80 ; 128 1a750: 84 bd out 0x24, r24 ; 36 OCR0A = val; // set pwm duty 1a752: c7 bd out 0x27, r28 ; 39 } else { digitalWrite(pin, HIGH); } } } } 1a754: df 91 pop r29 1a756: cf 91 pop r28 1a758: 1f 91 pop r17 1a75a: 08 95 ret #endif #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: // connect pwm to pin on timer 0, channel B sbi(TCCR0A, COM0B1); 1a75c: 84 b5 in r24, 0x24 ; 36 1a75e: 80 62 ori r24, 0x20 ; 32 1a760: 84 bd out 0x24, r24 ; 36 OCR0B = val; // set pwm duty 1a762: c8 bd out 0x28, r28 ; 40 1a764: f7 cf rjmp .-18 ; 0x1a754 #endif #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: // connect pwm to pin on timer 1, channel A sbi(TCCR1A, COM1A1); 1a766: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1a76a: 80 68 ori r24, 0x80 ; 128 1a76c: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1A = val; // set pwm duty 1a770: d0 93 89 00 sts 0x0089, r29 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 1a774: c0 93 88 00 sts 0x0088, r28 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 1a778: ed cf rjmp .-38 ; 0x1a754 #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: // connect pwm to pin on timer 1, channel B sbi(TCCR1A, COM1B1); 1a77a: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1a77e: 80 62 ori r24, 0x20 ; 32 1a780: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1B = val; // set pwm duty 1a784: d0 93 8b 00 sts 0x008B, r29 ; 0x80008b <__TEXT_REGION_LENGTH__+0x7c208b> 1a788: c0 93 8a 00 sts 0x008A, r28 ; 0x80008a <__TEXT_REGION_LENGTH__+0x7c208a> 1a78c: e3 cf rjmp .-58 ; 0x1a754 #endif #if defined(TCCR1A) && defined(COM1C1) case TIMER1C: // connect pwm to pin on timer 1, channel C sbi(TCCR1A, COM1C1); 1a78e: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1a792: 88 60 ori r24, 0x08 ; 8 1a794: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1C = val; // set pwm duty 1a798: d0 93 8d 00 sts 0x008D, r29 ; 0x80008d <__TEXT_REGION_LENGTH__+0x7c208d> 1a79c: c0 93 8c 00 sts 0x008C, r28 ; 0x80008c <__TEXT_REGION_LENGTH__+0x7c208c> 1a7a0: d9 cf rjmp .-78 ; 0x1a754 #endif #if defined(TCCR2A) && defined(COM2A1) case TIMER2A: // connect pwm to pin on timer 2, channel A sbi(TCCR2A, COM2A1); 1a7a2: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1a7a6: 80 68 ori r24, 0x80 ; 128 1a7a8: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> OCR2A = val; // set pwm duty 1a7ac: c0 93 b3 00 sts 0x00B3, r28 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3> 1a7b0: d1 cf rjmp .-94 ; 0x1a754 #endif #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: // connect pwm to pin on timer 2, channel B sbi(TCCR2A, COM2B1); 1a7b2: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1a7b6: 80 62 ori r24, 0x20 ; 32 1a7b8: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> OCR2B = val; // set pwm duty 1a7bc: c0 93 b4 00 sts 0x00B4, r28 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4> 1a7c0: c9 cf rjmp .-110 ; 0x1a754 #endif #if defined(TCCR3A) && defined(COM3A1) case TIMER3A: // connect pwm to pin on timer 3, channel A sbi(TCCR3A, COM3A1); 1a7c2: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1a7c6: 80 68 ori r24, 0x80 ; 128 1a7c8: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3A = val; // set pwm duty 1a7cc: d0 93 99 00 sts 0x0099, r29 ; 0x800099 <__TEXT_REGION_LENGTH__+0x7c2099> 1a7d0: c0 93 98 00 sts 0x0098, r28 ; 0x800098 <__TEXT_REGION_LENGTH__+0x7c2098> 1a7d4: bf cf rjmp .-130 ; 0x1a754 #endif #if defined(TCCR3A) && defined(COM3B1) case TIMER3B: // connect pwm to pin on timer 3, channel B sbi(TCCR3A, COM3B1); 1a7d6: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1a7da: 80 62 ori r24, 0x20 ; 32 1a7dc: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3B = val; // set pwm duty 1a7e0: d0 93 9b 00 sts 0x009B, r29 ; 0x80009b <__TEXT_REGION_LENGTH__+0x7c209b> 1a7e4: c0 93 9a 00 sts 0x009A, r28 ; 0x80009a <__TEXT_REGION_LENGTH__+0x7c209a> 1a7e8: b5 cf rjmp .-150 ; 0x1a754 #endif #if defined(TCCR3A) && defined(COM3C1) case TIMER3C: // connect pwm to pin on timer 3, channel C sbi(TCCR3A, COM3C1); 1a7ea: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1a7ee: 88 60 ori r24, 0x08 ; 8 1a7f0: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3C = val; // set pwm duty 1a7f4: d0 93 9d 00 sts 0x009D, r29 ; 0x80009d <__TEXT_REGION_LENGTH__+0x7c209d> 1a7f8: c0 93 9c 00 sts 0x009C, r28 ; 0x80009c <__TEXT_REGION_LENGTH__+0x7c209c> 1a7fc: ab cf rjmp .-170 ; 0x1a754 #endif #if defined(TCCR4A) case TIMER4A: //connect pwm to pin on timer 4, channel A sbi(TCCR4A, COM4A1); 1a7fe: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1a802: 80 68 ori r24, 0x80 ; 128 1a804: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> #if defined(COM4A0) // only used on 32U4 cbi(TCCR4A, COM4A0); 1a808: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1a80c: 8f 7b andi r24, 0xBF ; 191 1a80e: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> #endif OCR4A = val; // set pwm duty 1a812: d0 93 a9 00 sts 0x00A9, r29 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 1a816: c0 93 a8 00 sts 0x00A8, r28 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 1a81a: 9c cf rjmp .-200 ; 0x1a754 #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: // connect pwm to pin on timer 4, channel B sbi(TCCR4A, COM4B1); 1a81c: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1a820: 80 62 ori r24, 0x20 ; 32 1a822: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4B = val; // set pwm duty 1a826: d0 93 ab 00 sts 0x00AB, r29 ; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab> 1a82a: c0 93 aa 00 sts 0x00AA, r28 ; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa> 1a82e: 92 cf rjmp .-220 ; 0x1a754 #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: // connect pwm to pin on timer 4, channel C sbi(TCCR4A, COM4C1); 1a830: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1a834: 88 60 ori r24, 0x08 ; 8 1a836: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = val; // set pwm duty 1a83a: d0 93 ad 00 sts 0x00AD, r29 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 1a83e: c0 93 ac 00 sts 0x00AC, r28 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 1a842: 88 cf rjmp .-240 ; 0x1a754 #if defined(TCCR5A) && defined(COM5A1) case TIMER5A: // connect pwm to pin on timer 5, channel A sbi(TCCR5A, COM5A1); 1a844: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1a848: 80 68 ori r24, 0x80 ; 128 1a84a: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5A = val; // set pwm duty 1a84e: d0 93 29 01 sts 0x0129, r29 ; 0x800129 <__TEXT_REGION_LENGTH__+0x7c2129> 1a852: c0 93 28 01 sts 0x0128, r28 ; 0x800128 <__TEXT_REGION_LENGTH__+0x7c2128> 1a856: 7e cf rjmp .-260 ; 0x1a754 #endif #if defined(TCCR5A) && defined(COM5B1) case TIMER5B: // connect pwm to pin on timer 5, channel B sbi(TCCR5A, COM5B1); 1a858: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1a85c: 80 62 ori r24, 0x20 ; 32 1a85e: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5B = val; // set pwm duty 1a862: d0 93 2b 01 sts 0x012B, r29 ; 0x80012b <__TEXT_REGION_LENGTH__+0x7c212b> 1a866: c0 93 2a 01 sts 0x012A, r28 ; 0x80012a <__TEXT_REGION_LENGTH__+0x7c212a> 1a86a: 74 cf rjmp .-280 ; 0x1a754 #endif #if defined(TCCR5A) && defined(COM5C1) case TIMER5C: // connect pwm to pin on timer 5, channel C sbi(TCCR5A, COM5C1); 1a86c: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1a870: 88 60 ori r24, 0x08 ; 8 1a872: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5C = val; // set pwm duty 1a876: d0 93 2d 01 sts 0x012D, r29 ; 0x80012d <__TEXT_REGION_LENGTH__+0x7c212d> 1a87a: c0 93 2c 01 sts 0x012C, r28 ; 0x80012c <__TEXT_REGION_LENGTH__+0x7c212c> 1a87e: 6a cf rjmp .-300 ; 0x1a754 break; #endif case NOT_ON_TIMER: default: if (val < 128) { 1a880: c0 38 cpi r28, 0x80 ; 128 1a882: d1 05 cpc r29, r1 1a884: 0c f0 brlt .+2 ; 0x1a888 1a886: 3e cf rjmp .-388 ; 0x1a704 1a888: 33 cf rjmp .-410 ; 0x1a6f0 0001a88a : } } /// Accelerate up to max.speed (defined by @min_delay_us) /// does not update global positions void accelerate_1_step(uint8_t axes, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us){ 1a88a: 4f 92 push r4 1a88c: 5f 92 push r5 1a88e: 6f 92 push r6 1a890: 7f 92 push r7 1a892: 8f 92 push r8 1a894: 9f 92 push r9 1a896: af 92 push r10 1a898: bf 92 push r11 1a89a: cf 92 push r12 1a89c: df 92 push r13 1a89e: ef 92 push r14 1a8a0: ff 92 push r15 1a8a2: 0f 93 push r16 1a8a4: 1f 93 push r17 1a8a6: cf 93 push r28 1a8a8: df 93 push r29 1a8aa: eb 01 movw r28, r22 1a8ac: 6a 01 movw r12, r20 1a8ae: 79 01 movw r14, r18 sm4_do_step(axes); 1a8b0: 0f 94 94 28 call 0x25128 ; 0x25128 1a8b4: f6 01 movw r30, r12 1a8b6: 00 81 ld r16, Z 1a8b8: 11 81 ldd r17, Z+1 ; 0x01 /// keep max speed (avoid extra computation) if (acc > 0 && delay_us == min_delay_us){ 1a8ba: 1c 16 cp r1, r28 1a8bc: 1d 06 cpc r1, r29 1a8be: b4 f4 brge .+44 ; 0x1a8ec 1a8c0: 0e 15 cp r16, r14 1a8c2: 1f 05 cpc r17, r15 1a8c4: 99 f4 brne .+38 ; 0x1a8ec delayMicroseconds(delay_us); 1a8c6: c8 01 movw r24, r16 //DBG(_n("%d "), t1); delayMicroseconds(t1); delay_us = t1; } 1a8c8: df 91 pop r29 1a8ca: cf 91 pop r28 1a8cc: 1f 91 pop r17 1a8ce: 0f 91 pop r16 1a8d0: ff 90 pop r15 1a8d2: ef 90 pop r14 1a8d4: df 90 pop r13 1a8d6: cf 90 pop r12 1a8d8: bf 90 pop r11 1a8da: af 90 pop r10 1a8dc: 9f 90 pop r9 1a8de: 8f 90 pop r8 1a8e0: 7f 90 pop r7 1a8e2: 6f 90 pop r6 1a8e4: 5f 90 pop r5 1a8e6: 4f 90 pop r4 void accelerate_1_step(uint8_t axes, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us){ sm4_do_step(axes); /// keep max speed (avoid extra computation) if (acc > 0 && delay_us == min_delay_us){ delayMicroseconds(delay_us); 1a8e8: 0c 94 db d2 jmp 0x1a5b6 ; 0x1a5b6 return; } // v1 = v0 + a * t // 0.01 = length of a step const float t0 = delay_us * 0.000001f; 1a8ec: b8 01 movw r22, r16 1a8ee: 90 e0 ldi r25, 0x00 ; 0 1a8f0: 80 e0 ldi r24, 0x00 ; 0 1a8f2: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 1a8f6: 2d eb ldi r18, 0xBD ; 189 1a8f8: 37 e3 ldi r19, 0x37 ; 55 1a8fa: 46 e8 ldi r20, 0x86 ; 134 1a8fc: 55 e3 ldi r21, 0x35 ; 53 1a8fe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1a902: 4b 01 movw r8, r22 1a904: 5c 01 movw r10, r24 const float v1 = (0.01f / t0 + acc * t0); 1a906: be 01 movw r22, r28 1a908: 0d 2e mov r0, r29 1a90a: 00 0c add r0, r0 1a90c: 88 0b sbc r24, r24 1a90e: 99 0b sbc r25, r25 1a910: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1a914: a5 01 movw r20, r10 1a916: 94 01 movw r18, r8 1a918: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1a91c: 2b 01 movw r4, r22 1a91e: 3c 01 movw r6, r24 1a920: a5 01 movw r20, r10 1a922: 94 01 movw r18, r8 1a924: 6a e0 ldi r22, 0x0A ; 10 1a926: 77 ed ldi r23, 0xD7 ; 215 1a928: 83 e2 ldi r24, 0x23 ; 35 1a92a: 9c e3 ldi r25, 0x3C ; 60 1a92c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1a930: 9b 01 movw r18, r22 1a932: ac 01 movw r20, r24 1a934: c3 01 movw r24, r6 1a936: b2 01 movw r22, r4 1a938: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1a93c: 4b 01 movw r8, r22 1a93e: 5c 01 movw r10, r24 uint16_t t1; if (v1 <= 0.16f){ ///< slowest speed convertible to uint16_t delay 1a940: 2a e0 ldi r18, 0x0A ; 10 1a942: 37 ed ldi r19, 0xD7 ; 215 1a944: 43 e2 ldi r20, 0x23 ; 35 1a946: 5e e3 ldi r21, 0x3E ; 62 1a948: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1a94c: 18 16 cp r1, r24 1a94e: dc f5 brge .+118 ; 0x1a9c6 t1 = MAX_DELAY; ///< already too slow so it wants to move back } else { /// don't exceed max.speed t1 = MAX(min_delay_us, round_to_u16(0.01f / v1 * 1000000.f)); 1a950: a5 01 movw r20, r10 1a952: 94 01 movw r18, r8 1a954: 6a e0 ldi r22, 0x0A ; 10 1a956: 77 ed ldi r23, 0xD7 ; 215 1a958: 83 e2 ldi r24, 0x23 ; 35 1a95a: 9c e3 ldi r25, 0x3C ; 60 1a95c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1a960: 20 e0 ldi r18, 0x00 ; 0 1a962: 34 e2 ldi r19, 0x24 ; 36 1a964: 44 e7 ldi r20, 0x74 ; 116 1a966: 59 e4 ldi r21, 0x49 ; 73 1a968: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> uint8_t round_to_u8(float f){ return (uint8_t)(f + .5f); } uint16_t round_to_u16(float f){ return (uint16_t)(f + .5f); 1a96c: 20 e0 ldi r18, 0x00 ; 0 1a96e: 30 e0 ldi r19, 0x00 ; 0 1a970: 40 e0 ldi r20, 0x00 ; 0 1a972: 5f e3 ldi r21, 0x3F ; 63 1a974: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1a978: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1a97c: 5b 01 movw r10, r22 1a97e: 6e 15 cp r22, r14 1a980: 7f 05 cpc r23, r15 1a982: 08 f4 brcc .+2 ; 0x1a986 1a984: 57 01 movw r10, r14 /// don't exceed max.speed t1 = MAX(min_delay_us, round_to_u16(0.01f / v1 * 1000000.f)); } /// make sure delay has changed a bit at least if (t1 == delay_us && acc != 0){ 1a986: 0a 15 cp r16, r10 1a988: 1b 05 cpc r17, r11 1a98a: 31 f4 brne .+12 ; 0x1a998 1a98c: 20 97 sbiw r28, 0x00 ; 0 1a98e: 21 f0 breq .+8 ; 0x1a998 if (acc > 0) 1a990: fc f0 brlt .+62 ; 0x1a9d0 t1--; 1a992: f1 e0 ldi r31, 0x01 ; 1 1a994: af 1a sub r10, r31 1a996: b1 08 sbc r11, r1 t1++; } //DBG(_n("%d "), t1); delayMicroseconds(t1); 1a998: c5 01 movw r24, r10 1a99a: 0e 94 db d2 call 0x1a5b6 ; 0x1a5b6 delay_us = t1; 1a99e: f6 01 movw r30, r12 1a9a0: b1 82 std Z+1, r11 ; 0x01 1a9a2: a0 82 st Z, r10 } 1a9a4: df 91 pop r29 1a9a6: cf 91 pop r28 1a9a8: 1f 91 pop r17 1a9aa: 0f 91 pop r16 1a9ac: ff 90 pop r15 1a9ae: ef 90 pop r14 1a9b0: df 90 pop r13 1a9b2: cf 90 pop r12 1a9b4: bf 90 pop r11 1a9b6: af 90 pop r10 1a9b8: 9f 90 pop r9 1a9ba: 8f 90 pop r8 1a9bc: 7f 90 pop r7 1a9be: 6f 90 pop r6 1a9c0: 5f 90 pop r5 1a9c2: 4f 90 pop r4 1a9c4: 08 95 ret // 0.01 = length of a step const float t0 = delay_us * 0.000001f; const float v1 = (0.01f / t0 + acc * t0); uint16_t t1; if (v1 <= 0.16f){ ///< slowest speed convertible to uint16_t delay t1 = MAX_DELAY; ///< already too slow so it wants to move back 1a9c6: 80 e1 ldi r24, 0x10 ; 16 1a9c8: a8 2e mov r10, r24 1a9ca: 87 e2 ldi r24, 0x27 ; 39 1a9cc: b8 2e mov r11, r24 1a9ce: db cf rjmp .-74 ; 0x1a986 /// make sure delay has changed a bit at least if (t1 == delay_us && acc != 0){ if (acc > 0) t1--; else t1++; 1a9d0: 8f ef ldi r24, 0xFF ; 255 1a9d2: a8 1a sub r10, r24 1a9d4: b8 0a sbc r11, r24 1a9d6: e0 cf rjmp .-64 ; 0x1a998 0001a9d8 : /// keeps speed and then it decelerates to a complete stop (if possible) /// it goes defined number of steps /// returns after each step /// \returns true if step was done /// does not update global positions bool go_and_stop_1_step(uint8_t axes, int16_t dec, uint16_t &delay_us, uint16_t &steps){ 1a9d8: 2f 92 push r2 1a9da: 3f 92 push r3 1a9dc: 4f 92 push r4 1a9de: 5f 92 push r5 1a9e0: 6f 92 push r6 1a9e2: 7f 92 push r7 1a9e4: 8f 92 push r8 1a9e6: 9f 92 push r9 1a9e8: af 92 push r10 1a9ea: bf 92 push r11 1a9ec: cf 92 push r12 1a9ee: df 92 push r13 1a9f0: ef 92 push r14 1a9f2: ff 92 push r15 1a9f4: 0f 93 push r16 1a9f6: 1f 93 push r17 1a9f8: cf 93 push r28 1a9fa: df 93 push r29 1a9fc: 00 d0 rcall .+0 ; 0x1a9fe 1a9fe: cd b7 in r28, 0x3d ; 61 1aa00: de b7 in r29, 0x3e ; 62 if (steps <= 0 || dec <= 0) 1aa02: f9 01 movw r30, r18 1aa04: e0 80 ld r14, Z 1aa06: f1 80 ldd r15, Z+1 ; 0x01 1aa08: e1 14 cp r14, r1 1aa0a: f1 04 cpc r15, r1 1aa0c: 09 f4 brne .+2 ; 0x1aa10 1aa0e: 6c c0 rjmp .+216 ; 0x1aae8 1aa10: 16 16 cp r1, r22 1aa12: 17 06 cpc r1, r23 1aa14: 0c f0 brlt .+2 ; 0x1aa18 1aa16: 68 c0 rjmp .+208 ; 0x1aae8 1aa18: 19 01 movw r2, r18 1aa1a: 5b 83 std Y+3, r21 ; 0x03 1aa1c: 4a 83 std Y+2, r20 ; 0x02 1aa1e: 6b 01 movw r12, r22 1aa20: 89 83 std Y+1, r24 ; 0x01 return false; /// deceleration distance in steps, s = 1/2 v^2 / a uint16_t s = round_to_u16(100 * 0.5f * SQR(0.01f) / (SQR((float)delay_us) * dec)); 1aa22: fa 01 movw r30, r20 1aa24: 00 81 ld r16, Z 1aa26: 11 81 ldd r17, Z+1 ; 0x01 1aa28: b8 01 movw r22, r16 1aa2a: 90 e0 ldi r25, 0x00 ; 0 1aa2c: 80 e0 ldi r24, 0x00 ; 0 1aa2e: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 1aa32: 4b 01 movw r8, r22 1aa34: 5c 01 movw r10, r24 1aa36: b6 01 movw r22, r12 1aa38: 0d 2c mov r0, r13 1aa3a: 00 0c add r0, r0 1aa3c: 88 0b sbc r24, r24 1aa3e: 99 0b sbc r25, r25 1aa40: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1aa44: 2b 01 movw r4, r22 1aa46: 3c 01 movw r6, r24 1aa48: a5 01 movw r20, r10 1aa4a: 94 01 movw r18, r8 1aa4c: c5 01 movw r24, r10 1aa4e: b4 01 movw r22, r8 1aa50: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1aa54: 9b 01 movw r18, r22 1aa56: ac 01 movw r20, r24 1aa58: c3 01 movw r24, r6 1aa5a: b2 01 movw r22, r4 1aa5c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1aa60: 9b 01 movw r18, r22 1aa62: ac 01 movw r20, r24 1aa64: 6a e0 ldi r22, 0x0A ; 10 1aa66: 77 ed ldi r23, 0xD7 ; 215 1aa68: 83 ea ldi r24, 0xA3 ; 163 1aa6a: 9b e3 ldi r25, 0x3B ; 59 1aa6c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> uint8_t round_to_u8(float f){ return (uint8_t)(f + .5f); } uint16_t round_to_u16(float f){ return (uint16_t)(f + .5f); 1aa70: 20 e0 ldi r18, 0x00 ; 0 1aa72: 30 e0 ldi r19, 0x00 ; 0 1aa74: 40 e0 ldi r20, 0x00 ; 0 1aa76: 5f e3 ldi r21, 0x3F ; 63 1aa78: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1aa7c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> if (steps <= 0 || dec <= 0) return false; /// deceleration distance in steps, s = 1/2 v^2 / a uint16_t s = round_to_u16(100 * 0.5f * SQR(0.01f) / (SQR((float)delay_us) * dec)); if (steps > s){ 1aa80: 6e 15 cp r22, r14 1aa82: 7f 05 cpc r23, r15 1aa84: 30 f5 brcc .+76 ; 0x1aad2 /// go steady sm4_do_step(axes); 1aa86: 89 81 ldd r24, Y+1 ; 0x01 1aa88: 0f 94 94 28 call 0x25128 ; 0x25128 delayMicroseconds(delay_us); 1aa8c: ea 81 ldd r30, Y+2 ; 0x02 1aa8e: fb 81 ldd r31, Y+3 ; 0x03 1aa90: 80 81 ld r24, Z 1aa92: 91 81 ldd r25, Z+1 ; 0x01 1aa94: 0e 94 db d2 call 0x1a5b6 ; 0x1a5b6 } else { /// decelerate accelerate_1_step(axes, -dec, delay_us, delay_us); } --steps; 1aa98: f1 01 movw r30, r2 1aa9a: 80 81 ld r24, Z 1aa9c: 91 81 ldd r25, Z+1 ; 0x01 1aa9e: 01 97 sbiw r24, 0x01 ; 1 1aaa0: 91 83 std Z+1, r25 ; 0x01 1aaa2: 80 83 st Z, r24 return true; 1aaa4: 81 e0 ldi r24, 0x01 ; 1 } 1aaa6: 0f 90 pop r0 1aaa8: 0f 90 pop r0 1aaaa: 0f 90 pop r0 1aaac: df 91 pop r29 1aaae: cf 91 pop r28 1aab0: 1f 91 pop r17 1aab2: 0f 91 pop r16 1aab4: ff 90 pop r15 1aab6: ef 90 pop r14 1aab8: df 90 pop r13 1aaba: cf 90 pop r12 1aabc: bf 90 pop r11 1aabe: af 90 pop r10 1aac0: 9f 90 pop r9 1aac2: 8f 90 pop r8 1aac4: 7f 90 pop r7 1aac6: 6f 90 pop r6 1aac8: 5f 90 pop r5 1aaca: 4f 90 pop r4 1aacc: 3f 90 pop r3 1aace: 2f 90 pop r2 1aad0: 08 95 ret /// go steady sm4_do_step(axes); delayMicroseconds(delay_us); } else { /// decelerate accelerate_1_step(axes, -dec, delay_us, delay_us); 1aad2: 66 27 eor r22, r22 1aad4: 77 27 eor r23, r23 1aad6: 6c 19 sub r22, r12 1aad8: 7d 09 sbc r23, r13 1aada: 98 01 movw r18, r16 1aadc: 4a 81 ldd r20, Y+2 ; 0x02 1aade: 5b 81 ldd r21, Y+3 ; 0x03 1aae0: 89 81 ldd r24, Y+1 ; 0x01 1aae2: 0e 94 45 d4 call 0x1a88a ; 0x1a88a 1aae6: d8 cf rjmp .-80 ; 0x1aa98 /// returns after each step /// \returns true if step was done /// does not update global positions bool go_and_stop_1_step(uint8_t axes, int16_t dec, uint16_t &delay_us, uint16_t &steps){ if (steps <= 0 || dec <= 0) return false; 1aae8: 80 e0 ldi r24, 0x00 ; 0 1aaea: dd cf rjmp .-70 ; 0x1aaa6 0001aaec : count_position[i] += dir & mask ? -1L : 1L; } } } static void __attribute__((noinline)) set_axes_dir(const uint8_t axis, const uint8_t dir) { 1aaec: 0f 93 push r16 1aaee: 1f 93 push r17 1aaf0: cf 93 push r28 1aaf2: df 93 push r29 1aaf4: 18 2f mov r17, r24 1aaf6: 06 2f mov r16, r22 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1aaf8: d1 e0 ldi r29, 0x01 ; 1 1aafa: c0 e0 ldi r28, 0x00 ; 0 if (axis & mask) { 1aafc: 81 2f mov r24, r17 1aafe: 8d 23 and r24, r29 1ab00: 29 f0 breq .+10 ; 0x1ab0c sm4_set_dir(i, dir & mask); 1ab02: 60 2f mov r22, r16 1ab04: 6d 23 and r22, r29 1ab06: 8c 2f mov r24, r28 1ab08: 0f 94 9c 28 call 0x25138 ; 0x25138 } } } static void __attribute__((noinline)) set_axes_dir(const uint8_t axis, const uint8_t dir) { for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1ab0c: cf 5f subi r28, 0xFF ; 255 1ab0e: dd 0f add r29, r29 1ab10: c3 30 cpi r28, 0x03 ; 3 1ab12: a1 f7 brne .-24 ; 0x1aafc if (axis & mask) { sm4_set_dir(i, dir & mask); } } } 1ab14: df 91 pop r29 1ab16: cf 91 pop r28 1ab18: 1f 91 pop r17 1ab1a: 0f 91 pop r16 1ab1c: 08 95 ret 0001ab1e : //@size=114 DBG(_n("min, trigger, untrigger, max: [%d %d %d %d]\n"), _Z, trigger, untrigger, z); } } static void update_position_1_step(const uint8_t axis, const uint8_t dir) { 1ab1e: 8f 92 push r8 1ab20: 9f 92 push r9 1ab22: af 92 push r10 1ab24: bf 92 push r11 1ab26: cf 92 push r12 1ab28: df 92 push r13 1ab2a: ef 92 push r14 1ab2c: ff 92 push r15 1ab2e: 30 e0 ldi r19, 0x00 ; 0 1ab30: 20 e0 ldi r18, 0x00 ; 0 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1ab32: 91 e0 ldi r25, 0x01 ; 1 if (axis & mask) { 1ab34: 48 2f mov r20, r24 1ab36: 49 23 and r20, r25 1ab38: 19 f1 breq .+70 ; 0x1ab80 count_position[i] += dir & mask ? -1L : 1L; 1ab3a: a9 01 movw r20, r18 1ab3c: 44 0f add r20, r20 1ab3e: 55 1f adc r21, r21 1ab40: 44 0f add r20, r20 1ab42: 55 1f adc r21, r21 1ab44: fa 01 movw r30, r20 1ab46: e4 5b subi r30, 0xB4 ; 180 1ab48: f9 4f sbci r31, 0xF9 ; 249 1ab4a: c0 80 ld r12, Z 1ab4c: d1 80 ldd r13, Z+1 ; 0x01 1ab4e: e2 80 ldd r14, Z+2 ; 0x02 1ab50: f3 80 ldd r15, Z+3 ; 0x03 1ab52: 76 2f mov r23, r22 1ab54: 79 23 and r23, r25 1ab56: 81 2c mov r8, r1 1ab58: 91 2c mov r9, r1 1ab5a: 54 01 movw r10, r8 1ab5c: 83 94 inc r8 1ab5e: 77 23 and r23, r23 1ab60: 21 f0 breq .+8 ; 0x1ab6a 1ab62: 88 24 eor r8, r8 1ab64: 8a 94 dec r8 1ab66: 98 2c mov r9, r8 1ab68: 54 01 movw r10, r8 1ab6a: c8 0c add r12, r8 1ab6c: d9 1c adc r13, r9 1ab6e: ea 1c adc r14, r10 1ab70: fb 1c adc r15, r11 1ab72: 44 5b subi r20, 0xB4 ; 180 1ab74: 59 4f sbci r21, 0xF9 ; 249 1ab76: fa 01 movw r30, r20 1ab78: c0 82 st Z, r12 1ab7a: d1 82 std Z+1, r13 ; 0x01 1ab7c: e2 82 std Z+2, r14 ; 0x02 1ab7e: f3 82 std Z+3, r15 ; 0x03 DBG(_n("min, trigger, untrigger, max: [%d %d %d %d]\n"), _Z, trigger, untrigger, z); } } static void update_position_1_step(const uint8_t axis, const uint8_t dir) { for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1ab80: 99 0f add r25, r25 1ab82: 2f 5f subi r18, 0xFF ; 255 1ab84: 3f 4f sbci r19, 0xFF ; 255 1ab86: 23 30 cpi r18, 0x03 ; 3 1ab88: 31 05 cpc r19, r1 1ab8a: a1 f6 brne .-88 ; 0x1ab34 if (axis & mask) { count_position[i] += dir & mask ? -1L : 1L; } } } 1ab8c: ff 90 pop r15 1ab8e: ef 90 pop r14 1ab90: df 90 pop r13 1ab92: cf 90 pop r12 1ab94: bf 90 pop r11 1ab96: af 90 pop r10 1ab98: 9f 90 pop r9 1ab9a: 8f 90 pop r8 1ab9c: 08 95 ret 0001ab9e : /// Moves printer to absolute position [x,y,z] defined in integer position system /// check_pinda == 0: ordinary move /// check_pinda == 1: stop when PINDA triggered /// check_pinda == -1: stop when PINDA untriggered bool xyzcal_lineXYZ_to(int16_t x, int16_t y, int16_t z, uint16_t delay_us, int8_t check_pinda) { 1ab9e: 2f 92 push r2 1aba0: 3f 92 push r3 1aba2: 4f 92 push r4 1aba4: 5f 92 push r5 1aba6: 6f 92 push r6 1aba8: 7f 92 push r7 1abaa: 8f 92 push r8 1abac: 9f 92 push r9 1abae: af 92 push r10 1abb0: bf 92 push r11 1abb2: cf 92 push r12 1abb4: df 92 push r13 1abb6: ef 92 push r14 1abb8: ff 92 push r15 1abba: 0f 93 push r16 1abbc: 1f 93 push r17 1abbe: cf 93 push r28 1abc0: df 93 push r29 1abc2: 00 d0 rcall .+0 ; 0x1abc4 1abc4: 00 d0 rcall .+0 ; 0x1abc6 1abc6: cd b7 in r28, 0x3d ; 61 1abc8: de b7 in r29, 0x3e ; 62 // DBG(_n("xyzcal_lineXYZ_to x=%d y=%d z=%d check=%d\n"), x, y, z, check_pinda); x -= (int16_t)count_position[0]; 1abca: c0 90 4c 06 lds r12, 0x064C ; 0x80064c 1abce: d0 90 4d 06 lds r13, 0x064D ; 0x80064d 1abd2: e0 90 4e 06 lds r14, 0x064E ; 0x80064e 1abd6: f0 90 4f 06 lds r15, 0x064F ; 0x80064f 1abda: 7c 01 movw r14, r24 1abdc: ec 18 sub r14, r12 1abde: fd 08 sbc r15, r13 y -= (int16_t)count_position[1]; 1abe0: 80 91 50 06 lds r24, 0x0650 ; 0x800650 1abe4: 90 91 51 06 lds r25, 0x0651 ; 0x800651 1abe8: a0 91 52 06 lds r26, 0x0652 ; 0x800652 1abec: b0 91 53 06 lds r27, 0x0653 ; 0x800653 1abf0: 68 1b sub r22, r24 1abf2: 79 0b sbc r23, r25 z -= (int16_t)count_position[2]; 1abf4: 80 91 54 06 lds r24, 0x0654 ; 0x800654 1abf8: 90 91 55 06 lds r25, 0x0655 ; 0x800655 1abfc: a0 91 56 06 lds r26, 0x0656 ; 0x800656 1ac00: b0 91 57 06 lds r27, 0x0657 ; 0x800657 1ac04: fa 01 movw r30, r20 1ac06: e8 1b sub r30, r24 1ac08: f9 0b sbc r31, r25 1ac0a: fa 83 std Y+2, r31 ; 0x02 1ac0c: e9 83 std Y+1, r30 ; 0x01 xyzcal_dm = ((x<0)?1:0) | ((y<0)?2:0) | ((z<0)?4:0); 1ac0e: fb 01 movw r30, r22 1ac10: ff 0f add r31, r31 1ac12: ee 0b sbc r30, r30 1ac14: ff 0f add r31, r31 1ac16: fe 2f mov r31, r30 1ac18: ee 1f adc r30, r30 1ac1a: e2 70 andi r30, 0x02 ; 2 1ac1c: 89 81 ldd r24, Y+1 ; 0x01 1ac1e: 9a 81 ldd r25, Y+2 ; 0x02 1ac20: 88 e0 ldi r24, 0x08 ; 8 1ac22: 98 02 muls r25, r24 1ac24: 81 2d mov r24, r1 1ac26: 99 0b sbc r25, r25 1ac28: 11 24 eor r1, r1 1ac2a: 84 70 andi r24, 0x04 ; 4 1ac2c: e8 2b or r30, r24 1ac2e: 8f 2d mov r24, r15 1ac30: 88 1f adc r24, r24 1ac32: 88 27 eor r24, r24 1ac34: 88 1f adc r24, r24 1ac36: e8 2b or r30, r24 1ac38: e0 93 f1 03 sts 0x03F1, r30 ; 0x8003f1 asm("nop"); } void sm4_set_dir_bits(uint8_t dir_bits) { uint8_t portL = PORTL; 1ac3c: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> portL &= 0xb8; //set direction bits to zero 1ac40: 98 7b andi r25, 0xB8 ; 184 //TODO -optimize in asm #if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3)) dir_bits ^= dir_mask; 1ac42: 87 e0 ldi r24, 0x07 ; 7 1ac44: e8 27 eor r30, r24 if (dir_bits & 1) portL |= 2; //set X direction bit 1ac46: e0 fd sbrc r30, 0 1ac48: 92 60 ori r25, 0x02 ; 2 if (dir_bits & 2) portL |= 1; //set Y direction bit 1ac4a: e1 fd sbrc r30, 1 1ac4c: 91 60 ori r25, 0x01 ; 1 if (dir_bits & 4) portL |= 4; //set Z direction bit 1ac4e: e4 70 andi r30, 0x04 ; 4 1ac50: 09 f0 breq .+2 ; 0x1ac54 1ac52: 94 60 ori r25, 0x04 ; 4 if (dir_bits & 1) portL |= 1; //set X direction bit if (dir_bits & 2) portL |= 2; //set Y direction bit if (dir_bits & 4) portL |= 4; //set Z direction bit if (dir_bits & 8) portL |= 64; //set E direction bit #endif PORTL = portL; 1ac54: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> asm("nop"); 1ac58: 00 00 nop sm4_set_dir_bits(xyzcal_dm); sm4_stop_cb = check_pinda?((check_pinda<0)?check_pinda_0:check_pinda_1):0; 1ac5a: 83 e5 ldi r24, 0x53 ; 83 1ac5c: 9d eb ldi r25, 0xBD ; 189 1ac5e: 01 11 cpse r16, r1 1ac60: 02 c0 rjmp .+4 ; 0x1ac66 1ac62: 90 e0 ldi r25, 0x00 ; 0 1ac64: 80 e0 ldi r24, 0x00 ; 0 1ac66: 90 93 25 06 sts 0x0625, r25 ; 0x800625 1ac6a: 80 93 24 06 sts 0x0624, r24 ; 0x800624 xyzcal_sm4_delay = delay_us; 1ac6e: 30 93 f0 03 sts 0x03F0, r19 ; 0x8003f0 1ac72: 20 93 ef 03 sts 0x03EF, r18 ; 0x8003ef // uint32_t u = _micros(); bool ret = sm4_line_xyz_ui(abs(x), abs(y), abs(z)) ? true : false; 1ac76: 29 81 ldd r18, Y+1 ; 0x01 1ac78: 3a 81 ldd r19, Y+2 ; 0x02 1ac7a: 3e 83 std Y+6, r19 ; 0x06 1ac7c: 2d 83 std Y+5, r18 ; 0x05 1ac7e: 37 ff sbrs r19, 7 1ac80: 05 c0 rjmp .+10 ; 0x1ac8c 1ac82: 31 95 neg r19 1ac84: 21 95 neg r18 1ac86: 31 09 sbc r19, r1 1ac88: 3e 83 std Y+6, r19 ; 0x06 1ac8a: 2d 83 std Y+5, r18 ; 0x05 1ac8c: 8b 01 movw r16, r22 1ac8e: 77 ff sbrs r23, 7 1ac90: 03 c0 rjmp .+6 ; 0x1ac98 1ac92: 11 95 neg r17 1ac94: 01 95 neg r16 1ac96: 11 09 sbc r17, r1 1ac98: f7 fe sbrs r15, 7 1ac9a: 03 c0 rjmp .+6 ; 0x1aca2 1ac9c: f1 94 neg r15 1ac9e: e1 94 neg r14 1aca0: f1 08 sbc r15, r1 #endif #endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a)) } uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){ uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5); 1aca2: 98 01 movw r18, r16 1aca4: d8 01 movw r26, r16 1aca6: 0f 94 f8 a4 call 0x349f0 ; 0x349f0 <__mulhisi3> 1acaa: 4b 01 movw r8, r22 1acac: 5c 01 movw r10, r24 1acae: 2d 81 ldd r18, Y+5 ; 0x05 1acb0: 3e 81 ldd r19, Y+6 ; 0x06 1acb2: d9 01 movw r26, r18 1acb4: 0f 94 f8 a4 call 0x349f0 ; 0x349f0 <__mulhisi3> 1acb8: 86 0e add r8, r22 1acba: 97 1e adc r9, r23 1acbc: a8 1e adc r10, r24 1acbe: b9 1e adc r11, r25 1acc0: 97 01 movw r18, r14 1acc2: d7 01 movw r26, r14 1acc4: 0f 94 f8 a4 call 0x349f0 ; 0x349f0 <__mulhisi3> 1acc8: 68 0d add r22, r8 1acca: 79 1d adc r23, r9 1accc: 8a 1d adc r24, r10 1acce: 9b 1d adc r25, r11 1acd0: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 1acd4: 0f 94 d6 a8 call 0x351ac ; 0x351ac 1acd8: 20 e0 ldi r18, 0x00 ; 0 1acda: 30 e0 ldi r19, 0x00 ; 0 1acdc: 40 e0 ldi r20, 0x00 ; 0 1acde: 5f e3 ldi r21, 0x3F ; 63 1ace0: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1ace4: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1ace8: 2b 01 movw r4, r22 uint16_t nd = dd; uint16_t cx = dd; uint16_t cy = dd; uint16_t cz = dd; 1acea: 4b 01 movw r8, r22 uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){ uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5); uint16_t nd = dd; uint16_t cx = dd; uint16_t cy = dd; 1acec: 5b 01 movw r10, r22 } uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){ uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5); uint16_t nd = dd; uint16_t cx = dd; 1acee: 6b 01 movw r12, r22 #endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a)) } uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){ uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5); uint16_t nd = dd; 1acf0: 3b 01 movw r6, r22 uint16_t cx = dd; uint16_t cy = dd; uint16_t cz = dd; uint16_t x = 0; uint16_t y = 0; uint16_t z = 0; 1acf2: 1c 82 std Y+4, r1 ; 0x04 1acf4: 1b 82 std Y+3, r1 ; 0x03 uint16_t nd = dd; uint16_t cx = dd; uint16_t cy = dd; uint16_t cz = dd; uint16_t x = 0; uint16_t y = 0; 1acf6: 31 2c mov r3, r1 1acf8: 21 2c mov r2, r1 uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5); uint16_t nd = dd; uint16_t cx = dd; uint16_t cy = dd; uint16_t cz = dd; uint16_t x = 0; 1acfa: 1a 82 std Y+2, r1 ; 0x02 1acfc: 19 82 std Y+1, r1 ; 0x01 uint16_t y = 0; uint16_t z = 0; while (nd){ 1acfe: 61 14 cp r6, r1 1ad00: 71 04 cpc r7, r1 1ad02: 09 f4 brne .+2 ; 0x1ad06 1ad04: 48 c0 rjmp .+144 ; 0x1ad96 if (sm4_stop_cb && (*sm4_stop_cb)()) break; 1ad06: e0 91 24 06 lds r30, 0x0624 ; 0x800624 1ad0a: f0 91 25 06 lds r31, 0x0625 ; 0x800625 1ad0e: 30 97 sbiw r30, 0x00 ; 0 1ad10: f1 f5 brne .+124 ; 0x1ad8e uint8_t sm = 0; //step mask 1ad12: 80 e0 ldi r24, 0x00 ; 0 if (cx <= dx){ 1ad14: ec 14 cp r14, r12 1ad16: fd 04 cpc r15, r13 1ad18: 40 f0 brcs .+16 ; 0x1ad2a sm |= 1; cx += dd; 1ad1a: c4 0c add r12, r4 1ad1c: d5 1c adc r13, r5 x++; 1ad1e: 89 81 ldd r24, Y+1 ; 0x01 1ad20: 9a 81 ldd r25, Y+2 ; 0x02 1ad22: 01 96 adiw r24, 0x01 ; 1 1ad24: 9a 83 std Y+2, r25 ; 0x02 1ad26: 89 83 std Y+1, r24 ; 0x01 uint16_t z = 0; while (nd){ if (sm4_stop_cb && (*sm4_stop_cb)()) break; uint8_t sm = 0; //step mask if (cx <= dx){ sm |= 1; 1ad28: 81 e0 ldi r24, 0x01 ; 1 cx += dd; x++; } if (cy <= dy){ 1ad2a: 0a 15 cp r16, r10 1ad2c: 1b 05 cpc r17, r11 1ad2e: 30 f0 brcs .+12 ; 0x1ad3c sm |= 2; 1ad30: 82 60 ori r24, 0x02 ; 2 cy += dd; 1ad32: a4 0c add r10, r4 1ad34: b5 1c adc r11, r5 y++; 1ad36: 9f ef ldi r25, 0xFF ; 255 1ad38: 29 1a sub r2, r25 1ad3a: 39 0a sbc r3, r25 } if (cz <= dz){ 1ad3c: ed 81 ldd r30, Y+5 ; 0x05 1ad3e: fe 81 ldd r31, Y+6 ; 0x06 1ad40: e8 15 cp r30, r8 1ad42: f9 05 cpc r31, r9 1ad44: 48 f0 brcs .+18 ; 0x1ad58 sm |= 4; 1ad46: 84 60 ori r24, 0x04 ; 4 cz += dd; 1ad48: 84 0c add r8, r4 1ad4a: 95 1c adc r9, r5 z++; 1ad4c: 2b 81 ldd r18, Y+3 ; 0x03 1ad4e: 3c 81 ldd r19, Y+4 ; 0x04 1ad50: 2f 5f subi r18, 0xFF ; 255 1ad52: 3f 4f sbci r19, 0xFF ; 255 1ad54: 3c 83 std Y+4, r19 ; 0x04 1ad56: 2b 83 std Y+3, r18 ; 0x03 } cx -= dx; 1ad58: ce 18 sub r12, r14 1ad5a: df 08 sbc r13, r15 cy -= dy; 1ad5c: a0 1a sub r10, r16 1ad5e: b1 0a sbc r11, r17 cz -= dz; 1ad60: ed 81 ldd r30, Y+5 ; 0x05 1ad62: fe 81 ldd r31, Y+6 ; 0x06 1ad64: 8e 1a sub r8, r30 1ad66: 9f 0a sbc r9, r31 sm4_do_step(sm); 1ad68: 0f 94 94 28 call 0x25128 ; 0x25128 uint16_t delay = SM4_DEFDELAY; if (sm4_calc_delay_cb) delay = (*sm4_calc_delay_cb)(nd, dd); 1ad6c: e0 91 20 06 lds r30, 0x0620 ; 0x800620 1ad70: f0 91 21 06 lds r31, 0x0621 ; 0x800621 1ad74: 30 97 sbiw r30, 0x00 ; 0 1ad76: d1 f1 breq .+116 ; 0x1adec 1ad78: b2 01 movw r22, r4 1ad7a: c3 01 movw r24, r6 1ad7c: 19 95 eicall if (delay) delayMicroseconds(delay); 1ad7e: 00 97 sbiw r24, 0x00 ; 0 1ad80: 11 f0 breq .+4 ; 0x1ad86 1ad82: 0e 94 db d2 call 0x1a5b6 ; 0x1a5b6 nd--; 1ad86: f1 e0 ldi r31, 0x01 ; 1 1ad88: 6f 1a sub r6, r31 1ad8a: 71 08 sbc r7, r1 1ad8c: b8 cf rjmp .-144 ; 0x1acfe uint16_t cz = dd; uint16_t x = 0; uint16_t y = 0; uint16_t z = 0; while (nd){ if (sm4_stop_cb && (*sm4_stop_cb)()) break; 1ad8e: 19 95 eicall 1ad90: 88 23 and r24, r24 1ad92: 09 f4 brne .+2 ; 0x1ad96 1ad94: be cf rjmp .-132 ; 0x1ad12 uint16_t delay = SM4_DEFDELAY; if (sm4_calc_delay_cb) delay = (*sm4_calc_delay_cb)(nd, dd); if (delay) delayMicroseconds(delay); nd--; } if (sm4_update_pos_cb) 1ad96: e0 91 22 06 lds r30, 0x0622 ; 0x800622 1ad9a: f0 91 23 06 lds r31, 0x0623 ; 0x800623 1ad9e: 30 97 sbiw r30, 0x00 ; 0 1ada0: 41 f0 breq .+16 ; 0x1adb2 (*sm4_update_pos_cb)(x, y, z, 0); 1ada2: 30 e0 ldi r19, 0x00 ; 0 1ada4: 20 e0 ldi r18, 0x00 ; 0 1ada6: 4b 81 ldd r20, Y+3 ; 0x03 1ada8: 5c 81 ldd r21, Y+4 ; 0x04 1adaa: b1 01 movw r22, r2 1adac: 89 81 ldd r24, Y+1 ; 0x01 1adae: 9a 81 ldd r25, Y+2 ; 0x02 1adb0: 19 95 eicall 1adb2: 81 e0 ldi r24, 0x01 ; 1 1adb4: 67 28 or r6, r7 1adb6: 09 f4 brne .+2 ; 0x1adba 1adb8: 80 e0 ldi r24, 0x00 ; 0 // u = _micros() - u; return ret; } 1adba: 26 96 adiw r28, 0x06 ; 6 1adbc: 0f b6 in r0, 0x3f ; 63 1adbe: f8 94 cli 1adc0: de bf out 0x3e, r29 ; 62 1adc2: 0f be out 0x3f, r0 ; 63 1adc4: cd bf out 0x3d, r28 ; 61 1adc6: df 91 pop r29 1adc8: cf 91 pop r28 1adca: 1f 91 pop r17 1adcc: 0f 91 pop r16 1adce: ff 90 pop r15 1add0: ef 90 pop r14 1add2: df 90 pop r13 1add4: cf 90 pop r12 1add6: bf 90 pop r11 1add8: af 90 pop r10 1adda: 9f 90 pop r9 1addc: 8f 90 pop r8 1adde: 7f 90 pop r7 1ade0: 6f 90 pop r6 1ade2: 5f 90 pop r5 1ade4: 4f 90 pop r4 1ade6: 3f 90 pop r3 1ade8: 2f 90 pop r2 1adea: 08 95 ret } cx -= dx; cy -= dy; cz -= dz; sm4_do_step(sm); uint16_t delay = SM4_DEFDELAY; 1adec: 84 ef ldi r24, 0xF4 ; 244 1adee: 91 e0 ldi r25, 0x01 ; 1 1adf0: c8 cf rjmp .-112 ; 0x1ad82 0001adf2 : status |= components; eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } void calibration_status_clear(CalibrationStatus components) { 1adf2: cf 93 push r28 1adf4: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1adf6: 86 ea ldi r24, 0xA6 ; 166 1adf8: 9c e0 ldi r25, 0x0C ; 12 1adfa: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 status &= ~components; 1adfe: c0 95 com r28 1ae00: 6c 2f mov r22, r28 1ae02: 68 23 and r22, r24 1ae04: 86 ea ldi r24, 0xA6 ; 166 1ae06: 9c e0 ldi r25, 0x0C ; 12 eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } 1ae08: cf 91 pop r28 1ae0a: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0001ae0e : } } } static void lcd_reset_sheet() { 1ae0e: 1f 93 push r17 1ae10: cf 93 push r28 1ae12: df 93 push r29 1ae14: 00 d0 rcall .+0 ; 0x1ae16 1ae16: 00 d0 rcall .+0 ; 0x1ae18 1ae18: 1f 92 push r1 1ae1a: 1f 92 push r1 1ae1c: cd b7 in r28, 0x3d ; 61 1ae1e: de b7 in r29, 0x3e ; 62 SheetName sheetName; eeprom_default_sheet_name(selected_sheet, sheetName); 1ae20: be 01 movw r22, r28 1ae22: 6f 5f subi r22, 0xFF ; 255 1ae24: 7f 4f sbci r23, 0xFF ; 255 1ae26: 80 91 ca 03 lds r24, 0x03CA ; 0x8003ca 1ae2a: 0e 94 b8 78 call 0xf170 ; 0xf170 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16); 1ae2e: 80 91 ca 03 lds r24, 0x03CA ; 0x8003ca 1ae32: 1b e0 ldi r17, 0x0B ; 11 1ae34: 81 9f mul r24, r17 1ae36: c0 01 movw r24, r0 1ae38: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1ae3a: 6f ef ldi r22, 0xFF ; 255 1ae3c: 7f ef ldi r23, 0xFF ; 255 1ae3e: 80 5b subi r24, 0xB0 ; 176 1ae40: 92 4f sbci r25, 0xF2 ; 242 1ae42: 0f 94 22 a4 call 0x34844 ; 0x34844 eeprom_update_block_notify(sheetName.c,EEPROM_Sheets_base->s[selected_sheet].name,sizeof(Sheet::name)); 1ae46: 60 91 ca 03 lds r22, 0x03CA ; 0x8003ca 1ae4a: 61 9f mul r22, r17 1ae4c: b0 01 movw r22, r0 1ae4e: 11 24 eor r1, r1 1ae50: 67 5b subi r22, 0xB7 ; 183 1ae52: 72 4f sbci r23, 0xF2 ; 242 #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 1ae54: 47 e0 ldi r20, 0x07 ; 7 1ae56: 50 e0 ldi r21, 0x00 ; 0 1ae58: ce 01 movw r24, r28 1ae5a: 01 96 adiw r24, 0x01 ; 1 1ae5c: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 if (selected_sheet == eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) 1ae60: 81 ea ldi r24, 0xA1 ; 161 1ae62: 9d e0 ldi r25, 0x0D ; 13 1ae64: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1ae68: 90 91 ca 03 lds r25, 0x03CA ; 0x8003ca 1ae6c: 89 13 cpse r24, r25 1ae6e: 0a c0 rjmp .+20 ; 0x1ae84 { eeprom_switch_to_next_sheet(); 1ae70: 0e 94 aa 78 call 0xf154 ; 0xf154 if (-1 == eeprom_next_initialized_sheet(0)) 1ae74: 80 e0 ldi r24, 0x00 ; 0 1ae76: 0e 94 96 78 call 0xf12c ; 0xf12c 1ae7a: 8f 3f cpi r24, 0xFF ; 255 1ae7c: 19 f4 brne .+6 ; 0x1ae84 calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 1ae7e: 80 e1 ldi r24, 0x10 ; 16 1ae80: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 } menu_back(); 1ae84: 0e 94 1b 63 call 0xc636 ; 0xc636 } 1ae88: 28 96 adiw r28, 0x08 ; 8 1ae8a: 0f b6 in r0, 0x3f ; 63 1ae8c: f8 94 cli 1ae8e: de bf out 0x3e, r29 ; 62 1ae90: 0f be out 0x3f, r0 ; 63 1ae92: cd bf out 0x3d, r28 ; 61 1ae94: df 91 pop r29 1ae96: cf 91 pop r28 1ae98: 1f 91 pop r17 1ae9a: 08 95 ret 0001ae9c : CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); return ((status & components) == components); } void calibration_status_set(CalibrationStatus components) { 1ae9c: cf 93 push r28 1ae9e: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1aea0: 86 ea ldi r24, 0xA6 ; 166 1aea2: 9c e0 ldi r25, 0x0C ; 12 1aea4: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 status |= components; 1aea8: 68 2f mov r22, r24 1aeaa: 6c 2b or r22, r28 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1aeac: 86 ea ldi r24, 0xA6 ; 166 1aeae: 9c e0 ldi r25, 0x0C ; 12 eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } 1aeb0: cf 91 pop r28 1aeb2: 0d 94 04 a4 jmp 0x34808 ; 0x34808 0001aeb6 : sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]); } bool calibration_status_get(CalibrationStatus components) { 1aeb6: cf 93 push r28 1aeb8: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1aeba: 86 ea ldi r24, 0xA6 ; 166 1aebc: 9c e0 ldi r25, 0x0C ; 12 1aebe: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 return ((status & components) == components); 1aec2: 98 2f mov r25, r24 1aec4: 9c 23 and r25, r28 1aec6: 81 e0 ldi r24, 0x01 ; 1 1aec8: 9c 13 cpse r25, r28 1aeca: 80 e0 ldi r24, 0x00 ; 0 } 1aecc: cf 91 pop r28 1aece: 08 95 ret 0001aed0 : * @param axis AxisEnum X_AXIS Y_AXIS Z_AXIS * other value leads to storing Z_AXIS * @param msg text to be displayed */ static void lcd_babystep_z() { 1aed0: ef 92 push r14 1aed2: ff 92 push r15 1aed4: 0f 93 push r16 1aed6: 1f 93 push r17 1aed8: cf 93 push r28 1aeda: df 93 push r29 1aedc: cd b7 in r28, 0x3d ; 61 1aede: de b7 in r29, 0x3e ; 62 1aee0: 63 97 sbiw r28, 0x13 ; 19 1aee2: 0f b6 in r0, 0x3f ; 63 1aee4: f8 94 cli 1aee6: de bf out 0x3e, r29 ; 62 1aee8: 0f be out 0x3f, r0 ; 63 1aeea: cd bf out 0x3d, r28 ; 61 int16_t babystepMemZ; float babystepMemMMZ; } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) 1aeec: 80 91 96 03 lds r24, 0x0396 ; 0x800396 1aef0: 81 11 cpse r24, r1 1aef2: 3a c0 rjmp .+116 ; 0x1af68 { // Menu was entered. // Initialize its status. _md->status = 1; 1aef4: 81 e0 ldi r24, 0x01 ; 1 1aef6: 80 93 96 03 sts 0x0396, r24 ; 0x800396 check_babystep(); 1aefa: 0e 94 1c 7d call 0xfa38 ; 0xfa38 if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))){ 1aefe: 81 ea ldi r24, 0xA1 ; 161 1af00: 9d e0 ldi r25, 0x0D ; 13 1af02: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1af06: 18 2f mov r17, r24 1af08: 0e 94 88 78 call 0xf110 ; 0xf110 1af0c: 81 11 cpse r24, r1 1af0e: ee c0 rjmp .+476 ; 0x1b0ec _md->babystepMemZ = 0; 1af10: 10 92 98 03 sts 0x0398, r1 ; 0x800398 1af14: 10 92 97 03 sts 0x0397, r1 ; 0x800397 _md->babystepMemZ = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); } // same logic as in babystep_load if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) 1af18: 80 e1 ldi r24, 0x10 ; 16 1af1a: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1af1e: 81 11 cpse r24, r1 1af20: 04 c0 rjmp .+8 ; 0x1af2a _md->babystepMemZ = 0; 1af22: 10 92 98 03 sts 0x0398, r1 ; 0x800398 1af26: 10 92 97 03 sts 0x0397, r1 ; 0x800397 _md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS]; 1af2a: 60 91 97 03 lds r22, 0x0397 ; 0x800397 1af2e: 70 91 98 03 lds r23, 0x0398 ; 0x800398 1af32: 07 2e mov r0, r23 1af34: 00 0c add r0, r0 1af36: 88 0b sbc r24, r24 1af38: 99 0b sbc r25, r25 1af3a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1af3e: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 1af42: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 1af46: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 1af4a: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 1af4e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1af52: 60 93 99 03 sts 0x0399, r22 ; 0x800399 1af56: 70 93 9a 03 sts 0x039A, r23 ; 0x80039a 1af5a: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b 1af5e: 90 93 9c 03 sts 0x039C, r25 ; 0x80039c lcd_draw_update = 1; 1af62: 81 e0 ldi r24, 0x01 ; 1 1af64: 80 93 59 02 sts 0x0259, r24 ; 0x800259 //SERIAL_ECHO("Z baby step: "); //SERIAL_ECHO(_md->babystepMem[2]); } if (lcd_encoder != 0) 1af68: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 1af6c: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 1af70: 00 97 sbiw r24, 0x00 ; 0 1af72: f1 f1 breq .+124 ; 0x1aff0 { _md->babystepMemZ += lcd_encoder; 1af74: 20 91 97 03 lds r18, 0x0397 ; 0x800397 1af78: 30 91 98 03 lds r19, 0x0398 ; 0x800398 1af7c: 28 0f add r18, r24 1af7e: 39 1f adc r19, r25 1af80: 30 93 98 03 sts 0x0398, r19 ; 0x800398 1af84: 20 93 97 03 sts 0x0397, r18 ; 0x800397 if (_md->babystepMemZ < Z_BABYSTEP_MIN) _md->babystepMemZ = Z_BABYSTEP_MIN; //-3999 -> -9.99 mm 1af88: 21 36 cpi r18, 0x61 ; 97 1af8a: 40 ef ldi r20, 0xF0 ; 240 1af8c: 34 07 cpc r19, r20 1af8e: 0c f0 brlt .+2 ; 0x1af92 1af90: ba c0 rjmp .+372 ; 0x1b106 1af92: 81 e6 ldi r24, 0x61 ; 97 1af94: 90 ef ldi r25, 0xF0 ; 240 1af96: 90 93 98 03 sts 0x0398, r25 ; 0x800398 1af9a: 80 93 97 03 sts 0x0397, r24 ; 0x800397 else if (_md->babystepMemZ > Z_BABYSTEP_MAX) _md->babystepMemZ = Z_BABYSTEP_MAX; //0 else babystepsTodoZadd(lcd_encoder); _md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS]; 1af9e: 60 91 97 03 lds r22, 0x0397 ; 0x800397 1afa2: 70 91 98 03 lds r23, 0x0398 ; 0x800398 1afa6: 07 2e mov r0, r23 1afa8: 00 0c add r0, r0 1afaa: 88 0b sbc r24, r24 1afac: 99 0b sbc r25, r25 1afae: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1afb2: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 1afb6: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 1afba: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 1afbe: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 1afc2: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1afc6: 60 93 99 03 sts 0x0399, r22 ; 0x800399 1afca: 70 93 9a 03 sts 0x039A, r23 ; 0x80039a 1afce: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b 1afd2: 90 93 9c 03 sts 0x039C, r25 ; 0x80039c _delay(50); 1afd6: 62 e3 ldi r22, 0x32 ; 50 1afd8: 70 e0 ldi r23, 0x00 ; 0 1afda: 80 e0 ldi r24, 0x00 ; 0 1afdc: 90 e0 ldi r25, 0x00 ; 0 1afde: 0f 94 bd 0d call 0x21b7a ; 0x21b7a lcd_encoder = 0; 1afe2: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1afe6: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e lcd_draw_update = 1; 1afea: 81 e0 ldi r24, 0x01 ; 1 1afec: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } if (lcd_draw_update) 1aff0: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1aff4: 88 23 and r24, r24 1aff6: c9 f1 breq .+114 ; 0x1b06a { SheetFormatBuffer buffer; menu_format_sheet_E(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))], buffer); 1aff8: 81 ea ldi r24, 0xA1 ; 161 1affa: 9d e0 ldi r25, 0x0D ; 13 1affc: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b000: 2b e0 ldi r18, 0x0B ; 11 1b002: 82 9f mul r24, r18 1b004: c0 01 movw r24, r0 1b006: 11 24 eor r1, r1 1b008: be 01 movw r22, r28 1b00a: 6f 5f subi r22, 0xFF ; 255 1b00c: 7f 4f sbci r23, 0xFF ; 255 1b00e: 87 5b subi r24, 0xB7 ; 183 1b010: 92 4f sbci r25, 0xF2 ; 242 1b012: 0e 94 fd 75 call 0xebfa ; 0xebfa lcd_home(); 1b016: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_print(buffer.c); 1b01a: ce 01 movw r24, r28 1b01c: 01 96 adiw r24, 0x01 ; 1 1b01e: 0e 94 5f 73 call 0xe6be ; 0xe6be lcd_set_cursor(0, 1); 1b022: 61 e0 ldi r22, 0x01 ; 1 1b024: 80 e0 ldi r24, 0x00 ; 0 1b026: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 menu_draw_float13(_T(MSG_BABYSTEPPING_Z), _md->babystepMemMMZ); 1b02a: 10 91 99 03 lds r17, 0x0399 ; 0x800399 1b02e: 00 91 9a 03 lds r16, 0x039A ; 0x80039a 1b032: f0 90 9b 03 lds r15, 0x039B ; 0x80039b 1b036: e0 90 9c 03 lds r14, 0x039C ; 0x80039c 1b03a: 86 ed ldi r24, 0xD6 ; 214 1b03c: 9a e3 ldi r25, 0x3A ; 58 1b03e: 0e 94 3a 75 call 0xea74 ; 0xea74 //! (i.e. str must include a ':' at its end) //! FLASH usage dropped 234476B -> 234392B //! Moreover, this function gets inlined in the final code, so removing it doesn't really help ;) void menu_draw_float13(const char* str, float val) { lcd_printf_P(menu_fmt_float13, ' ', str, val); 1b042: ef 92 push r14 1b044: ff 92 push r15 1b046: 0f 93 push r16 1b048: 1f 93 push r17 1b04a: 9f 93 push r25 1b04c: 8f 93 push r24 1b04e: 1f 92 push r1 1b050: 80 e2 ldi r24, 0x20 ; 32 1b052: 8f 93 push r24 1b054: 87 e8 ldi r24, 0x87 ; 135 1b056: 92 e8 ldi r25, 0x82 ; 130 1b058: 9f 93 push r25 1b05a: 8f 93 push r24 1b05c: 0e 94 0b 6f call 0xde16 ; 0xde16 1b060: 0f b6 in r0, 0x3f ; 63 1b062: f8 94 cli 1b064: de bf out 0x3e, r29 ; 62 1b066: 0f be out 0x3f, r0 ; 63 1b068: cd bf out 0x3d, r28 ; 61 } if (LCD_CLICKED || menu_leaving) 1b06a: 80 91 95 03 lds r24, 0x0395 ; 0x800395 1b06e: 81 11 cpse r24, r1 1b070: 04 c0 rjmp .+8 ; 0x1b07a 1b072: 80 91 c4 03 lds r24, 0x03C4 ; 0x8003c4 1b076: 88 23 and r24, r24 1b078: 51 f1 breq .+84 ; 0x1b0ce { // Only update the EEPROM when leaving the menu. uint8_t active_sheet=eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 1b07a: 81 ea ldi r24, 0xA1 ; 161 1b07c: 9d e0 ldi r25, 0x0D ; 13 1b07e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b082: 9b e0 ldi r25, 0x0B ; 11 1b084: 89 9f mul r24, r25 1b086: 80 01 movw r16, r0 1b088: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1b08a: 60 91 97 03 lds r22, 0x0397 ; 0x800397 1b08e: 70 91 98 03 lds r23, 0x0398 ; 0x800398 1b092: c8 01 movw r24, r16 1b094: 80 5b subi r24, 0xB0 ; 176 1b096: 92 4f sbci r25, 0xF2 ; 242 1b098: 0f 94 22 a4 call 0x34844 ; 0x34844 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1b09c: 60 91 59 12 lds r22, 0x1259 ; 0x801259 1b0a0: c8 01 movw r24, r16 1b0a2: 8e 5a subi r24, 0xAE ; 174 1b0a4: 92 4f sbci r25, 0xF2 ; 242 1b0a6: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[active_sheet].z_offset)),_md->babystepMemZ); // NOTE: bed_temp and pinda_temp are not currently read/used anywhere. eeprom_update_byte_notify(&(EEPROM_Sheets_base->s[active_sheet].bed_temp),target_temperature_bed); #ifdef PINDA_THERMISTOR eeprom_update_byte_notify(&(EEPROM_Sheets_base->s[active_sheet].pinda_temp),current_temperature_pinda); 1b0aa: 60 91 85 03 lds r22, 0x0385 ; 0x800385 1b0ae: 70 91 86 03 lds r23, 0x0386 ; 0x800386 1b0b2: 80 91 87 03 lds r24, 0x0387 ; 0x800387 1b0b6: 90 91 88 03 lds r25, 0x0388 ; 0x800388 1b0ba: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1b0be: c8 01 movw r24, r16 1b0c0: 8d 5a subi r24, 0xAD ; 173 1b0c2: 92 4f sbci r25, 0xF2 ; 242 1b0c4: 0f 94 04 a4 call 0x34808 ; 0x34808 #endif //PINDA_THERMISTOR calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST); 1b0c8: 80 e1 ldi r24, 0x10 ; 16 1b0ca: 0e 94 4e d7 call 0x1ae9c ; 0x1ae9c } menu_back_if_clicked(); 1b0ce: 0e 94 06 74 call 0xe80c ; 0xe80c } 1b0d2: 63 96 adiw r28, 0x13 ; 19 1b0d4: 0f b6 in r0, 0x3f ; 63 1b0d6: f8 94 cli 1b0d8: de bf out 0x3e, r29 ; 62 1b0da: 0f be out 0x3f, r0 ; 63 1b0dc: cd bf out 0x3d, r28 ; 61 1b0de: df 91 pop r29 1b0e0: cf 91 pop r28 1b0e2: 1f 91 pop r17 1b0e4: 0f 91 pop r16 1b0e6: ff 90 pop r15 1b0e8: ef 90 pop r14 1b0ea: 08 95 ret if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))){ _md->babystepMemZ = 0; } else{ _md->babystepMemZ = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> 1b0ec: 2b e0 ldi r18, 0x0B ; 11 1b0ee: 12 9f mul r17, r18 1b0f0: c0 01 movw r24, r0 1b0f2: 11 24 eor r1, r1 1b0f4: 80 5b subi r24, 0xB0 ; 176 1b0f6: 92 4f sbci r25, 0xF2 ; 242 1b0f8: 0f 94 ee a3 call 0x347dc ; 0x347dc 1b0fc: 90 93 98 03 sts 0x0398, r25 ; 0x800398 1b100: 80 93 97 03 sts 0x0397, r24 ; 0x800397 1b104: 09 cf rjmp .-494 ; 0x1af18 if (lcd_encoder != 0) { _md->babystepMemZ += lcd_encoder; if (_md->babystepMemZ < Z_BABYSTEP_MIN) _md->babystepMemZ = Z_BABYSTEP_MIN; //-3999 -> -9.99 mm else if (_md->babystepMemZ > Z_BABYSTEP_MAX) _md->babystepMemZ = Z_BABYSTEP_MAX; //0 1b106: 12 16 cp r1, r18 1b108: 13 06 cpc r1, r19 1b10a: 2c f4 brge .+10 ; 0x1b116 1b10c: 10 92 98 03 sts 0x0398, r1 ; 0x800398 1b110: 10 92 97 03 sts 0x0397, r1 ; 0x800397 1b114: 44 cf rjmp .-376 ; 0x1af9e extern volatile int babystepsTodo[3]; inline void babystepsTodoZadd(int n) { if (n != 0) { CRITICAL_SECTION_START 1b116: 2f b7 in r18, 0x3f ; 63 1b118: f8 94 cli babystepsTodo[Z_AXIS] += n; 1b11a: 40 91 83 03 lds r20, 0x0383 ; 0x800383 1b11e: 50 91 84 03 lds r21, 0x0384 ; 0x800384 1b122: 84 0f add r24, r20 1b124: 95 1f adc r25, r21 1b126: 90 93 84 03 sts 0x0384, r25 ; 0x800384 1b12a: 80 93 83 03 sts 0x0383, r24 ; 0x800383 CRITICAL_SECTION_END 1b12e: 2f bf out 0x3f, r18 ; 63 1b130: 36 cf rjmp .-404 ; 0x1af9e 0001b132 : //! |>Continue | MSG_CONTINUE //! | Reset | MSG_RESET //! ---------------------- //! @endcode void lcd_first_layer_calibration_reset() { 1b132: af 92 push r10 1b134: bf 92 push r11 1b136: cf 92 push r12 1b138: df 92 push r13 1b13a: ef 92 push r14 1b13c: ff 92 push r15 1b13e: 0f 93 push r16 1b140: 1f 93 push r17 1b142: cf 93 push r28 1b144: df 93 push r29 1b146: 00 d0 rcall .+0 ; 0x1b148 1b148: 00 d0 rcall .+0 ; 0x1b14a 1b14a: 1f 92 push r1 1b14c: cd b7 in r28, 0x3d ; 61 1b14e: de b7 in r29, 0x3e ; 62 } MenuData; static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) || (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || 1b150: 80 91 95 03 lds r24, 0x0395 ; 0x800395 1b154: 81 11 cpse r24, r1 1b156: 18 c0 rjmp .+48 ; 0x1b188 bool reset; } MenuData; static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) || 1b158: 81 ea ldi r24, 0xA1 ; 161 1b15a: 9d e0 ldi r25, 0x0D ; 13 1b15c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b160: 18 2f mov r17, r24 1b162: 0e 94 88 78 call 0xf110 ; 0xf110 1b166: 88 23 and r24, r24 1b168: 79 f0 breq .+30 ; 0x1b188 (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || 1b16a: 80 e1 ldi r24, 0x10 ; 16 1b16c: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 bool reset; } MenuData; static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) || 1b170: 88 23 and r24, r24 1b172: 51 f0 breq .+20 ; 0x1b188 (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || (0 == static_cast(eeprom_read_word(reinterpret_cast (&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))))) 1b174: 2b e0 ldi r18, 0x0B ; 11 1b176: 12 9f mul r17, r18 1b178: c0 01 movw r24, r0 1b17a: 11 24 eor r1, r1 static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) || (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || (0 == static_cast(eeprom_read_word(reinterpret_cast 1b17c: 80 5b subi r24, 0xB0 ; 176 1b17e: 92 4f sbci r25, 0xF2 ; 242 1b180: 0f 94 ee a3 call 0x347dc ; 0x347dc } MenuData; static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data"); MenuData* menuData = (MenuData*)&(menu_data[0]); if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) || (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || 1b184: 89 2b or r24, r25 1b186: f1 f4 brne .+60 ; 0x1b1c4 (0 == static_cast(eeprom_read_word(reinterpret_cast (&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))))) { if (menuData->reset) 1b188: 80 91 96 03 lds r24, 0x0396 ; 0x800396 1b18c: 88 23 and r24, r24 1b18e: 71 f0 breq .+28 ; 0x1b1ac { eeprom_update_word_notify(reinterpret_cast(&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset), 0xffff); 1b190: 81 ea ldi r24, 0xA1 ; 161 1b192: 9d e0 ldi r25, 0x0D ; 13 1b194: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b198: 2b e0 ldi r18, 0x0B ; 11 1b19a: 82 9f mul r24, r18 1b19c: c0 01 movw r24, r0 1b19e: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1b1a0: 6f ef ldi r22, 0xFF ; 255 1b1a2: 7f ef ldi r23, 0xFF ; 255 1b1a4: 80 5b subi r24, 0xB0 ; 176 1b1a6: 92 4f sbci r25, 0xF2 ; 242 1b1a8: 0f 94 22 a4 call 0x34844 ; 0x34844 } // If the knob was clicked, don't produce feedback // It should only be done when the firmware changes the menu // on its own (silently) menu_goto(lcd_v2_calibration, 0, true, !lcd_clicked()); 1b1ac: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1b1b0: 21 e0 ldi r18, 0x01 ; 1 1b1b2: 81 11 cpse r24, r1 1b1b4: 20 e0 ldi r18, 0x00 ; 0 1b1b6: 41 e0 ldi r20, 0x01 ; 1 1b1b8: 70 e0 ldi r23, 0x00 ; 0 1b1ba: 60 e0 ldi r22, 0x00 ; 0 1b1bc: 86 e9 ldi r24, 0x96 ; 150 1b1be: 99 ee ldi r25, 0xE9 ; 233 1b1c0: 0e 94 b7 62 call 0xc56e ; 0xc56e } if (lcd_encoder) { 1b1c4: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 1b1c8: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 1b1cc: 21 15 cp r18, r1 1b1ce: 31 05 cpc r19, r1 1b1d0: 59 f0 breq .+22 ; 0x1b1e8 menuData->reset = lcd_encoder > 0; 1b1d2: 81 e0 ldi r24, 0x01 ; 1 1b1d4: 12 16 cp r1, r18 1b1d6: 13 06 cpc r1, r19 1b1d8: 0c f0 brlt .+2 ; 0x1b1dc 1b1da: 80 e0 ldi r24, 0x00 ; 0 1b1dc: 80 93 96 03 sts 0x0396, r24 ; 0x800396 lcd_encoder = 0; // Reset 1b1e0: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1b1e4: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e } char sheet_name[sizeof(Sheet::name)]; eeprom_read_block(sheet_name, &EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].name, sizeof(Sheet::name)); 1b1e8: 81 ea ldi r24, 0xA1 ; 161 1b1ea: 9d e0 ldi r25, 0x0D ; 13 1b1ec: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b1f0: 1b e0 ldi r17, 0x0B ; 11 1b1f2: 81 9f mul r24, r17 1b1f4: b0 01 movw r22, r0 1b1f6: 11 24 eor r1, r1 1b1f8: 67 5b subi r22, 0xB7 ; 183 1b1fa: 72 4f sbci r23, 0xF2 ; 242 1b1fc: 47 e0 ldi r20, 0x07 ; 7 1b1fe: 50 e0 ldi r21, 0x00 ; 0 1b200: ce 01 movw r24, r28 1b202: 01 96 adiw r24, 0x01 ; 1 1b204: 7c 01 movw r14, r24 1b206: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 lcd_home(); 1b20a: 0e 94 1f 70 call 0xe03e ; 0xe03e float offset = static_cast(eeprom_read_word(reinterpret_cast(&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)))/cs.axis_steps_per_mm[Z_AXIS]; 1b20e: 81 ea ldi r24, 0xA1 ; 161 1b210: 9d e0 ldi r25, 0x0D ; 13 1b212: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1b216: 81 9f mul r24, r17 1b218: c0 01 movw r24, r0 1b21a: 11 24 eor r1, r1 1b21c: 80 5b subi r24, 0xB0 ; 176 1b21e: 92 4f sbci r25, 0xF2 ; 242 1b220: 0f 94 ee a3 call 0x347dc ; 0x347dc 1b224: bc 01 movw r22, r24 1b226: 99 0f add r25, r25 1b228: 88 0b sbc r24, r24 1b22a: 99 0b sbc r25, r25 1b22c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1b230: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 1b234: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 1b238: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 1b23c: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 1b240: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1b244: d6 2e mov r13, r22 1b246: c7 2e mov r12, r23 1b248: b8 2e mov r11, r24 1b24a: a9 2e mov r10, r25 lcd_printf_P(_T(MSG_SHEET_OFFSET), 1b24c: 80 91 96 03 lds r24, 0x0396 ; 0x800396 1b250: 0e e3 ldi r16, 0x3E ; 62 1b252: 10 e2 ldi r17, 0x20 ; 32 1b254: 81 11 cpse r24, r1 1b256: 02 c0 rjmp .+4 ; 0x1b25c 1b258: 00 e2 ldi r16, 0x20 ; 32 1b25a: 1e e3 ldi r17, 0x3E ; 62 1b25c: 85 ec ldi r24, 0xC5 ; 197 1b25e: 9c e3 ldi r25, 0x3C ; 60 1b260: 0e 94 3a 75 call 0xea74 ; 0xea74 1b264: 1f 92 push r1 1b266: 0f 93 push r16 1b268: 1f 92 push r1 1b26a: 1f 93 push r17 1b26c: af 92 push r10 1b26e: bf 92 push r11 1b270: cf 92 push r12 1b272: df 92 push r13 1b274: ff 92 push r15 1b276: ef 92 push r14 1b278: 9f 93 push r25 1b27a: 8f 93 push r24 1b27c: 0e 94 0b 6f call 0xde16 ; 0xde16 1b280: 0f b6 in r0, 0x3f ; 63 1b282: f8 94 cli 1b284: de bf out 0x3e, r29 ; 62 1b286: 0f be out 0x3f, r0 ; 63 1b288: cd bf out 0x3d, r28 ; 61 sheet_name, offset, menuData->reset ? ' ' : '>', menuData->reset ? '>' : ' ');// \n denotes line break, %.7s is replaced by 7 character long sheet name, %+1.3f is replaced by 6 character long floating point number, %c is replaced by > or white space (one character) based on whether first or second option is selected. % denoted place holders can not be reordered. } 1b28a: 27 96 adiw r28, 0x07 ; 7 1b28c: 0f b6 in r0, 0x3f ; 63 1b28e: f8 94 cli 1b290: de bf out 0x3e, r29 ; 62 1b292: 0f be out 0x3f, r0 ; 63 1b294: cd bf out 0x3d, r28 ; 61 1b296: df 91 pop r29 1b298: cf 91 pop r28 1b29a: 1f 91 pop r17 1b29c: 0f 91 pop r16 1b29e: ff 90 pop r15 1b2a0: ef 90 pop r14 1b2a2: df 90 pop r13 1b2a4: cf 90 pop r12 1b2a6: bf 90 pop r11 1b2a8: af 90 pop r10 1b2aa: 08 95 ret 0001b2ac : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1b2ac: 60 91 ca 03 lds r22, 0x03CA ; 0x8003ca 1b2b0: 81 ea ldi r24, 0xA1 ; 161 1b2b2: 9d e0 ldi r25, 0x0D ; 13 1b2b4: 0f 94 04 a4 call 0x34808 ; 0x34808 //! @brief Activate selected_sheet and run first layer calibration static void activate_calibrate_sheet() { eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), selected_sheet); lcd_first_layer_calibration_reset(); 1b2b8: 0c 94 99 d8 jmp 0x1b132 ; 0x1b132 0001b2bc : ClCheckMode oCheckVersion; ClCheckMode oCheckGcode; ClCheckMode oCheckFilament; void fCheckModeInit() { oCheckMode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)ClCheckMode::_Warn); 1b2bc: 61 e0 ldi r22, 0x01 ; 1 1b2be: 88 ea ldi r24, 0xA8 ; 168 1b2c0: 9d e0 ldi r25, 0x0D ; 13 1b2c2: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b2c6: 80 93 ed 03 sts 0x03ED, r24 ; 0x8003ed if (farm_mode) { 1b2ca: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1b2ce: 88 23 and r24, r24 1b2d0: 41 f0 breq .+16 ; 0x1b2e2 oCheckMode = ClCheckMode::_Strict; 1b2d2: 82 e0 ldi r24, 0x02 ; 2 1b2d4: 80 93 ed 03 sts 0x03ED, r24 ; 0x8003ed 1b2d8: 62 e0 ldi r22, 0x02 ; 2 1b2da: 88 ea ldi r24, 0xA8 ; 168 1b2dc: 9d e0 ldi r25, 0x0D ; 13 1b2de: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)ClCheckMode::_Strict); } oNozzleDiameter = (ClNozzleDiameter)eeprom_init_default_byte((uint8_t *)EEPROM_NOZZLE_DIAMETER, (uint8_t)ClNozzleDiameter::_Diameter_400); 1b2e2: 68 e2 ldi r22, 0x28 ; 40 1b2e4: 87 ea ldi r24, 0xA7 ; 167 1b2e6: 9d e0 ldi r25, 0x0D ; 13 1b2e8: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b2ec: 80 93 eb 03 sts 0x03EB, r24 ; 0x8003eb eeprom_init_default_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM, EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); 1b2f0: 60 e9 ldi r22, 0x90 ; 144 1b2f2: 71 e0 ldi r23, 0x01 ; 1 1b2f4: 85 ea ldi r24, 0xA5 ; 165 1b2f6: 9d e0 ldi r25, 0x0D ; 13 1b2f8: 0e 94 45 78 call 0xf08a ; 0xf08a oCheckModel = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODEL, (uint8_t)ClCheckMode::_Warn); 1b2fc: 61 e0 ldi r22, 0x01 ; 1 1b2fe: 84 ea ldi r24, 0xA4 ; 164 1b300: 9d e0 ldi r25, 0x0D ; 13 1b302: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b306: 80 93 ea 03 sts 0x03EA, r24 ; 0x8003ea oCheckVersion = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_VERSION, (uint8_t)ClCheckMode::_Warn); 1b30a: 61 e0 ldi r22, 0x01 ; 1 1b30c: 83 ea ldi r24, 0xA3 ; 163 1b30e: 9d e0 ldi r25, 0x0D ; 13 1b310: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b314: 80 93 e9 03 sts 0x03E9, r24 ; 0x8003e9 oCheckGcode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_GCODE, (uint8_t)ClCheckMode::_Warn); 1b318: 61 e0 ldi r22, 0x01 ; 1 1b31a: 82 ea ldi r24, 0xA2 ; 162 1b31c: 9d e0 ldi r25, 0x0D ; 13 1b31e: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b322: 80 93 e8 03 sts 0x03E8, r24 ; 0x8003e8 oCheckFilament = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_FILAMENT, (uint8_t)ClCheckMode::_Warn); 1b326: 61 e0 ldi r22, 0x01 ; 1 1b328: 80 e2 ldi r24, 0x20 ; 32 1b32a: 9c e0 ldi r25, 0x0C ; 12 1b32c: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1b330: 80 93 ee 03 sts 0x03EE, r24 ; 0x8003ee } 1b334: 08 95 ret 0001b336 : return false; } // Parse a major.minor.revision version number. // Return true if valid. bool parse_version(const char *str, uint16_t version[4]) { 1b336: 0f 93 push r16 1b338: 1f 93 push r17 1b33a: 8b 01 movw r16, r22 for(uint8_t i = 0; i < 2; ++i){ str = Number(str, version + i); 1b33c: 0e 94 cf bd call 0x17b9e ; 0x17b9e if (*str != '.') 1b340: fc 01 movw r30, r24 1b342: 20 81 ld r18, Z 1b344: 2e 32 cpi r18, 0x2E ; 46 1b346: 11 f0 breq .+4 ; 0x1b34c static_assert(sizeof(STR_REVISION_DEV) == 4); return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3); case 'R': // expect RC static_assert(sizeof(STR_REVISION_RC) == 3); return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3); default: return false; // fail everything else 1b348: 80 e0 ldi r24, 0x00 ; 0 1b34a: 34 c0 rjmp .+104 ; 0x1b3b4 // Parse a major.minor.revision version number. // Return true if valid. bool parse_version(const char *str, uint16_t version[4]) { for(uint8_t i = 0; i < 2; ++i){ str = Number(str, version + i); 1b34c: b8 01 movw r22, r16 1b34e: 6e 5f subi r22, 0xFE ; 254 1b350: 7f 4f sbci r23, 0xFF ; 255 1b352: 01 96 adiw r24, 0x01 ; 1 1b354: 0e 94 cf bd call 0x17b9e ; 0x17b9e if (*str != '.') 1b358: fc 01 movw r30, r24 1b35a: 20 81 ld r18, Z 1b35c: 2e 32 cpi r18, 0x2E ; 46 1b35e: a1 f7 brne .-24 ; 0x1b348 return false; ++str; } str = Number(str, version + 2); 1b360: b8 01 movw r22, r16 1b362: 6c 5f subi r22, 0xFC ; 252 1b364: 7f 4f sbci r23, 0xFF ; 255 1b366: 01 96 adiw r24, 0x01 ; 1 1b368: 0e 94 cf bd call 0x17b9e ; 0x17b9e version[3] = FIRMWARE_REVISION_RELEASED; 1b36c: 20 e4 ldi r18, 0x40 ; 64 1b36e: 30 e0 ldi r19, 0x00 ; 0 1b370: f8 01 movw r30, r16 1b372: 37 83 std Z+7, r19 ; 0x07 1b374: 26 83 std Z+6, r18 ; 0x06 1b376: fc 01 movw r30, r24 1b378: df 01 movw r26, r30 // skip everything else until eol or '-' for(;;){ if(is_whitespace_or_nl_or_eol(*str)){ 1b37a: 91 91 ld r25, Z+ return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } inline bool is_whitespace_or_nl_or_eol(char c) { return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r'; 1b37c: 89 2f mov r24, r25 1b37e: 8f 7d andi r24, 0xDF ; 223 1b380: c1 f1 breq .+112 ; 0x1b3f2 1b382: 87 ef ldi r24, 0xF7 ; 247 1b384: 89 0f add r24, r25 1b386: 82 30 cpi r24, 0x02 ; 2 1b388: a0 f1 brcs .+104 ; 0x1b3f2 1b38a: 9d 30 cpi r25, 0x0D ; 13 1b38c: 91 f1 breq .+100 ; 0x1b3f2 for(;;){ if(is_whitespace_or_nl_or_eol(*str)){ // speculatively reached the end of line, silently ignoring anything which is not a '-' return true; } if( *str == '-'){ 1b38e: 9d 32 cpi r25, 0x2D ; 45 1b390: 99 f7 brne .-26 ; 0x1b378 // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); if (*str++ == '-') { switch(*str){ 1b392: 11 96 adiw r26, 0x01 ; 1 1b394: 9c 91 ld r25, X 1b396: 92 34 cpi r25, 0x42 ; 66 1b398: e1 f0 breq .+56 ; 0x1b3d2 1b39a: 7c f4 brge .+30 ; 0x1b3ba 1b39c: 91 34 cpi r25, 0x41 ; 65 1b39e: a1 f6 brne .-88 ; 0x1b348 case 'A': // expect ALPHA static_assert(sizeof(STR_REVISION_ALPHA) == 6); return Tag( str, STR_REVISION_ALPHA, sizeof(STR_REVISION_ALPHA) - 1, FIRMWARE_REVISION_ALPHA, version + 3); 1b3a0: 0a 5f subi r16, 0xFA ; 250 1b3a2: 1f 4f sbci r17, 0xFF ; 255 1b3a4: 28 e0 ldi r18, 0x08 ; 8 1b3a6: 30 e0 ldi r19, 0x00 ; 0 1b3a8: 45 e0 ldi r20, 0x05 ; 5 1b3aa: 6a e2 ldi r22, 0x2A ; 42 1b3ac: 75 e8 ldi r23, 0x85 ; 133 case 'D': // expect DEV static_assert(sizeof(STR_REVISION_DEV) == 4); return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3); case 'R': // expect RC static_assert(sizeof(STR_REVISION_RC) == 3); return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3); 1b3ae: cf 01 movw r24, r30 1b3b0: 0e 94 1f c4 call 0x1883e ; 0x1883e // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); return false; } 1b3b4: 1f 91 pop r17 1b3b6: 0f 91 pop r16 1b3b8: 08 95 ret // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); if (*str++ == '-') { switch(*str){ 1b3ba: 94 34 cpi r25, 0x44 ; 68 1b3bc: 91 f0 breq .+36 ; 0x1b3e2 1b3be: 92 35 cpi r25, 0x52 ; 82 1b3c0: 19 f6 brne .-122 ; 0x1b348 case 'D': // expect DEV static_assert(sizeof(STR_REVISION_DEV) == 4); return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3); case 'R': // expect RC static_assert(sizeof(STR_REVISION_RC) == 3); return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3); 1b3c2: 0a 5f subi r16, 0xFA ; 250 1b3c4: 1f 4f sbci r17, 0xFF ; 255 1b3c6: 20 e2 ldi r18, 0x20 ; 32 1b3c8: 30 e0 ldi r19, 0x00 ; 0 1b3ca: 42 e0 ldi r20, 0x02 ; 2 1b3cc: 6e e1 ldi r22, 0x1E ; 30 1b3ce: 75 e8 ldi r23, 0x85 ; 133 1b3d0: ee cf rjmp .-36 ; 0x1b3ae case 'A': // expect ALPHA static_assert(sizeof(STR_REVISION_ALPHA) == 6); return Tag( str, STR_REVISION_ALPHA, sizeof(STR_REVISION_ALPHA) - 1, FIRMWARE_REVISION_ALPHA, version + 3); case 'B': // expect BETA static_assert(sizeof(STR_REVISION_BETA) == 5); return Tag( str, STR_REVISION_BETA, sizeof(STR_REVISION_BETA) - 1, FIRMWARE_REVISION_BETA, version + 3); 1b3d2: 0a 5f subi r16, 0xFA ; 250 1b3d4: 1f 4f sbci r17, 0xFF ; 255 1b3d6: 20 e1 ldi r18, 0x10 ; 16 1b3d8: 30 e0 ldi r19, 0x00 ; 0 1b3da: 44 e0 ldi r20, 0x04 ; 4 1b3dc: 65 e2 ldi r22, 0x25 ; 37 1b3de: 75 e8 ldi r23, 0x85 ; 133 1b3e0: e6 cf rjmp .-52 ; 0x1b3ae case 'D': // expect DEV static_assert(sizeof(STR_REVISION_DEV) == 4); return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3); 1b3e2: 0a 5f subi r16, 0xFA ; 250 1b3e4: 1f 4f sbci r17, 0xFF ; 255 1b3e6: 30 e0 ldi r19, 0x00 ; 0 1b3e8: 20 e0 ldi r18, 0x00 ; 0 1b3ea: 43 e0 ldi r20, 0x03 ; 3 1b3ec: 61 e2 ldi r22, 0x21 ; 33 1b3ee: 75 e8 ldi r23, 0x85 ; 133 1b3f0: de cf rjmp .-68 ; 0x1b3ae // skip everything else until eol or '-' for(;;){ if(is_whitespace_or_nl_or_eol(*str)){ // speculatively reached the end of line, silently ignoring anything which is not a '-' return true; 1b3f2: 81 e0 ldi r24, 0x01 ; 1 1b3f4: df cf rjmp .-66 ; 0x1b3b4 0001b3f6 : } static void lcd_updatestatus(const char *message, bool progmem = false) { if (progmem) strncpy_P(lcd_status_message, message, LCD_WIDTH); 1b3f6: 44 e1 ldi r20, 0x14 ; 20 1b3f8: 50 e0 ldi r21, 0x00 ; 0 return false; } static void lcd_updatestatus(const char *message, bool progmem = false) { if (progmem) 1b3fa: 66 23 and r22, r22 1b3fc: 89 f0 breq .+34 ; 0x1b420 strncpy_P(lcd_status_message, message, LCD_WIDTH); 1b3fe: bc 01 movw r22, r24 1b400: 85 e6 ldi r24, 0x65 ; 101 1b402: 94 e0 ldi r25, 0x04 ; 4 1b404: 0f 94 cd a1 call 0x3439a ; 0x3439a else strncpy(lcd_status_message, message, LCD_WIDTH); lcd_status_message[LCD_WIDTH] = 0; 1b408: 10 92 79 04 sts 0x0479, r1 ; 0x800479 <_ZL18lcd_status_message.lto_priv.424+0x14> lcd_status_message_idx = 0; // Print message from beginning 1b40c: 10 92 64 04 sts 0x0464, r1 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); 1b410: 85 e9 ldi r24, 0x95 ; 149 1b412: 98 e6 ldi r25, 0x68 ; 104 1b414: 0e 94 bd 7c call 0xf97a ; 0xf97a // hack lcd_draw_update to 1, i.e. without clear lcd_draw_update = 1; 1b418: 81 e0 ldi r24, 0x01 ; 1 1b41a: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } 1b41e: 08 95 ret static void lcd_updatestatus(const char *message, bool progmem = false) { if (progmem) strncpy_P(lcd_status_message, message, LCD_WIDTH); else strncpy(lcd_status_message, message, LCD_WIDTH); 1b420: bc 01 movw r22, r24 1b422: 85 e6 ldi r24, 0x65 ; 101 1b424: 94 e0 ldi r25, 0x04 ; 4 1b426: 0f 94 60 aa call 0x354c0 ; 0x354c0 1b42a: ee cf rjmp .-36 ; 0x1b408 0001b42c : } static bool lcd_message_check(uint8_t priority) { // regular priority check if (priority >= lcd_status_message_level) 1b42c: 90 91 c0 03 lds r25, 0x03C0 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> 1b430: 89 17 cp r24, r25 1b432: 80 f4 brcc .+32 ; 0x1b454 return true; // check if we can override an info message yet if (lcd_status_message_level == LCD_STATUS_INFO) { 1b434: 91 30 cpi r25, 0x01 ; 1 1b436: 61 f4 brne .+24 ; 0x1b450 } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 1b438: 80 91 7a 04 lds r24, 0x047A ; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423> 1b43c: 88 23 and r24, r24 1b43e: 51 f0 breq .+20 ; 0x1b454 1b440: 40 e2 ldi r20, 0x20 ; 32 1b442: 5e e4 ldi r21, 0x4E ; 78 1b444: 60 e0 ldi r22, 0x00 ; 0 1b446: 70 e0 ldi r23, 0x00 ; 0 1b448: 8a e7 ldi r24, 0x7A ; 122 1b44a: 94 e0 ldi r25, 0x04 ; 4 1b44c: 0d 94 88 0e jmp 0x21d10 ; 0x21d10 ::expired(unsigned long)> return lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT); } return false; 1b450: 80 e0 ldi r24, 0x00 ; 0 1b452: 08 95 ret static bool lcd_message_check(uint8_t priority) { // regular priority check if (priority >= lcd_status_message_level) return true; 1b454: 81 e0 ldi r24, 0x01 ; 1 if (lcd_status_message_level == LCD_STATUS_INFO) { return lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT); } return false; } 1b456: 08 95 ret 0001b458 : { lcd_setalertstatus_(message, severity, false); } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { 1b458: ef 92 push r14 1b45a: ff 92 push r15 1b45c: 1f 93 push r17 1b45e: cf 93 push r28 1b460: df 93 push r29 1b462: ec 01 movw r28, r24 1b464: 16 2f mov r17, r22 lcd_status_message_timeout.start(); } void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem) { if (lcd_message_check(severity)) { 1b466: 86 2f mov r24, r22 1b468: 0e 94 16 da call 0x1b42c ; 0x1b42c 1b46c: 88 23 and r24, r24 1b46e: e9 f0 breq .+58 ; 0x1b4aa bool same = !(progmem? strcmp_P(lcd_status_message, message): 1b470: be 01 movw r22, r28 1b472: 85 e6 ldi r24, 0x65 ; 101 1b474: 94 e0 ldi r25, 0x04 ; 4 1b476: 0f 94 8e a1 call 0x3431c ; 0x3431c 1b47a: 7c 01 movw r14, r24 strcmp(lcd_status_message, message)); lcd_status_message_timeout.start(); 1b47c: 8a e7 ldi r24, 0x7A ; 122 1b47e: 94 e0 ldi r25, 0x04 ; 4 1b480: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> lcd_status_message_level = severity; 1b484: 10 93 c0 03 sts 0x03C0, r17 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> custom_message_type = CustomMsg::Status; 1b488: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d custom_message_state = 0; 1b48c: 10 92 de 03 sts 0x03DE, r1 ; 0x8003de if (!same) { 1b490: ef 28 or r14, r15 1b492: 59 f0 breq .+22 ; 0x1b4aa // do not kick the user out of the menus if the message is unchanged lcd_updatestatus(message, progmem); 1b494: 61 e0 ldi r22, 0x01 ; 1 1b496: ce 01 movw r24, r28 1b498: 0e 94 fb d9 call 0x1b3f6 ; 0x1b3f6 } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { lcd_setalertstatus_(message, severity, true); } 1b49c: df 91 pop r29 1b49e: cf 91 pop r28 1b4a0: 1f 91 pop r17 1b4a2: ff 90 pop r15 1b4a4: ef 90 pop r14 custom_message_type = CustomMsg::Status; custom_message_state = 0; if (!same) { // do not kick the user out of the menus if the message is unchanged lcd_updatestatus(message, progmem); lcd_return_to_status(); 1b4a6: 0d 94 d5 07 jmp 0x20faa ; 0x20faa } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { lcd_setalertstatus_(message, severity, true); } 1b4aa: df 91 pop r29 1b4ac: cf 91 pop r28 1b4ae: 1f 91 pop r17 1b4b0: ff 90 pop r15 1b4b2: ef 90 pop r14 1b4b4: 08 95 ret 0001b4b6 : manage_inactivity(true); return _stepresult; } static void lcd_selftest_error(TestError testError, const char *_error_1, const char *_error_2) { 1b4b6: ef 92 push r14 1b4b8: ff 92 push r15 1b4ba: 1f 93 push r17 1b4bc: cf 93 push r28 1b4be: df 93 push r29 1b4c0: 18 2f mov r17, r24 1b4c2: eb 01 movw r28, r22 1b4c4: 7a 01 movw r14, r20 1b4c6: 80 e0 ldi r24, 0x00 ; 0 1b4c8: 0f 94 ad 25 call 0x24b5a ; 0x24b5a lcd_beeper_quick_feedback(); FORCE_BL_ON_END; target_temperature[0] = 0; 1b4cc: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1b4d0: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d target_temperature_bed = 0; 1b4d4: 10 92 5a 12 sts 0x125A, r1 ; 0x80125a 1b4d8: 10 92 59 12 sts 0x1259, r1 ; 0x801259 manage_heater(); 1b4dc: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 1b4e0: 80 e0 ldi r24, 0x00 ; 0 1b4e2: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_clear(); 1b4e6: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_ERROR)); 1b4ea: 89 ee ldi r24, 0xE9 ; 233 1b4ec: 99 e4 ldi r25, 0x49 ; 73 1b4ee: 0e 94 3a 75 call 0xea74 ; 0xea74 1b4f2: ac 01 movw r20, r24 1b4f4: 60 e0 ldi r22, 0x00 ; 0 1b4f6: 80 e0 ldi r24, 0x00 ; 0 1b4f8: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 1, _T(MSG_SELFTEST_PLEASECHECK)); 1b4fc: 89 ed ldi r24, 0xD9 ; 217 1b4fe: 99 e4 ldi r25, 0x49 ; 73 1b500: 0e 94 3a 75 call 0xea74 ; 0xea74 1b504: ac 01 movw r20, r24 1b506: 61 e0 ldi r22, 0x01 ; 1 1b508: 80 e0 ldi r24, 0x00 ; 0 1b50a: 0e 94 07 70 call 0xe00e ; 0xe00e switch (testError) 1b50e: 11 50 subi r17, 0x01 ; 1 1b510: 1a 30 cpi r17, 0x0A ; 10 1b512: 90 f4 brcc .+36 ; 0x1b538 1b514: e1 2f mov r30, r17 1b516: f0 e0 ldi r31, 0x00 ; 0 1b518: 88 27 eor r24, r24 1b51a: ee 56 subi r30, 0x6E ; 110 1b51c: f5 42 sbci r31, 0x25 ; 37 1b51e: 8f 4f sbci r24, 0xFF ; 255 1b520: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 1b524: af da rcall .-2722 ; 0x1aa84 1b526: bb da rcall .-2698 ; 0x1aa9e 1b528: d3 da rcall .-2650 ; 0x1aad0 1b52a: 19 db rcall .-2510 ; 0x1ab5e 1b52c: 25 db rcall .-2486 ; 0x1ab78 1b52e: 28 db rcall .-2480 ; 0x1ab80 1b530: 2b db rcall .-2474 ; 0x1ab88 1b532: 2e db rcall .-2468 ; 0x1ab90 1b534: 3a db rcall .-2444 ; 0x1abaa 1b536: 46 db rcall .-2420 ; 0x1abc4 { case TestError::Heater: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HEATERTHERMISTOR)); 1b538: 85 ec ldi r24, 0xC5 ; 197 1b53a: 99 e4 ldi r25, 0x49 ; 73 1b53c: 0e 94 3a 75 call 0xea74 ; 0xea74 1b540: ac 01 movw r20, r24 1b542: 62 e0 ldi r22, 0x02 ; 2 1b544: 80 e0 ldi r24, 0x00 ; 0 1b546: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_NOTCONNECTED)); 1b54a: 85 eb ldi r24, 0xB5 ; 181 1b54c: 99 e4 ldi r25, 0x49 ; 73 lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::WiringFsensor: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); 1b54e: 0e 94 3a 75 call 0xea74 ; 0xea74 1b552: ac 01 movw r20, r24 1b554: 63 e0 ldi r22, 0x03 ; 3 1b556: 80 e0 ldi r24, 0x00 ; 0 1b558: 0e 94 07 70 call 0xe00e ; 0xe00e 1b55c: 44 c0 rjmp .+136 ; 0x1b5e6 case TestError::Heater: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HEATERTHERMISTOR)); lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_NOTCONNECTED)); break; case TestError::Bed: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_BEDHEATER)); 1b55e: 88 ea ldi r24, 0xA8 ; 168 1b560: 99 e4 ldi r25, 0x49 ; 73 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::WiringFsensor: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); 1b562: 0e 94 3a 75 call 0xea74 ; 0xea74 1b566: ac 01 movw r20, r24 1b568: 62 e0 ldi r22, 0x02 ; 2 1b56a: 80 e0 ldi r24, 0x00 ; 0 1b56c: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); 1b570: 89 e9 ldi r24, 0x99 ; 153 1b572: 99 e4 ldi r25, 0x49 ; 73 1b574: ec cf rjmp .-40 ; 0x1b54e case TestError::Bed: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_BEDHEATER)); lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); break; case TestError::Endstops: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_ENDSTOPS)); 1b576: 8e e8 ldi r24, 0x8E ; 142 1b578: 99 e4 ldi r25, 0x49 ; 73 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::ExtruderFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HOTEND_FAN)); 1b57a: 0e 94 3a 75 call 0xea74 ; 0xea74 1b57e: ac 01 movw r20, r24 1b580: 62 e0 ldi r22, 0x02 ; 2 1b582: 80 e0 ldi r24, 0x00 ; 0 1b584: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); 1b588: 89 e9 ldi r24, 0x99 ; 153 1b58a: 99 e4 ldi r25, 0x49 ; 73 lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::SwappedFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS)); lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED)); 1b58c: 0e 94 3a 75 call 0xea74 ; 0xea74 1b590: ac 01 movw r20, r24 1b592: 63 e0 ldi r22, 0x03 ; 3 1b594: 80 e0 ldi r24, 0x00 ; 0 1b596: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(18, 3); 1b59a: 63 e0 ldi r22, 0x03 ; 3 1b59c: 82 e1 ldi r24, 0x12 ; 18 1b59e: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print(_error_1); 1b5a2: ce 01 movw r24, r28 1b5a4: 1e c0 rjmp .+60 ; 0x1b5e2 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::Motor: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_MOTOR)); 1b5a6: 86 e8 ldi r24, 0x86 ; 134 1b5a8: 99 e4 ldi r25, 0x49 ; 73 1b5aa: 0e 94 3a 75 call 0xea74 ; 0xea74 1b5ae: ac 01 movw r20, r24 1b5b0: 62 e0 ldi r22, 0x02 ; 2 1b5b2: 80 e0 ldi r24, 0x00 ; 0 1b5b4: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(18, 2); 1b5b8: 62 e0 ldi r22, 0x02 ; 2 1b5ba: 82 e1 ldi r24, 0x12 ; 18 1b5bc: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print(_error_1); 1b5c0: ce 01 movw r24, r28 1b5c2: 0e 94 5f 73 call 0xe6be ; 0xe6be lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_ENDSTOP)); 1b5c6: 8c e7 ldi r24, 0x7C ; 124 1b5c8: 99 e4 ldi r25, 0x49 ; 73 1b5ca: 0e 94 3a 75 call 0xea74 ; 0xea74 1b5ce: ac 01 movw r20, r24 1b5d0: 63 e0 ldi r22, 0x03 ; 3 1b5d2: 80 e0 ldi r24, 0x00 ; 0 1b5d4: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(18, 3); 1b5d8: 63 e0 ldi r22, 0x03 ; 3 1b5da: 82 e1 ldi r24, 0x12 ; 18 1b5dc: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print(_error_2); 1b5e0: c7 01 movw r24, r14 break; case TestError::SwappedFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS)); lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED)); lcd_set_cursor(18, 3); lcd_print(_error_1); 1b5e2: 0e 94 5f 73 call 0xe6be ; 0xe6be lcd_set_cursor(0, 3); lcd_printf_P(_T(MSG_SELFTEST_FS_LEVEL),_error_1); break; } _delay(1000); 1b5e6: 68 ee ldi r22, 0xE8 ; 232 1b5e8: 73 e0 ldi r23, 0x03 ; 3 1b5ea: 80 e0 ldi r24, 0x00 ; 0 1b5ec: 90 e0 ldi r25, 0x00 ; 0 1b5ee: 0f 94 bd 0d call 0x21b7a ; 0x21b7a 1b5f2: 80 e0 ldi r24, 0x00 ; 0 1b5f4: 0f 94 ad 25 call 0x24b5a ; 0x24b5a lcd_beeper_quick_feedback(); do { _delay(100); 1b5f8: 64 e6 ldi r22, 0x64 ; 100 1b5fa: 70 e0 ldi r23, 0x00 ; 0 1b5fc: 80 e0 ldi r24, 0x00 ; 0 1b5fe: 90 e0 ldi r25, 0x00 ; 0 1b600: 0f 94 bd 0d call 0x21b7a ; 0x21b7a manage_heater(); 1b604: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(); 1b608: 80 e0 ldi r24, 0x00 ; 0 1b60a: 0e 94 34 8c call 0x11868 ; 0x11868 } while (!lcd_clicked()); 1b60e: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1b612: 88 23 and r24, r24 1b614: 89 f3 breq .-30 ; 0x1b5f8 LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); 1b616: 8b e3 ldi r24, 0x3B ; 59 1b618: 9a e4 ldi r25, 0x4A ; 74 1b61a: 0e 94 3a 75 call 0xea74 ; 0xea74 1b61e: 62 e0 ldi r22, 0x02 ; 2 1b620: 0e 94 2c da call 0x1b458 ; 0x1b458 lcd_return_to_status(); } 1b624: df 91 pop r29 1b626: cf 91 pop r28 1b628: 1f 91 pop r17 1b62a: ff 90 pop r15 1b62c: ef 90 pop r14 manage_heater(); manage_inactivity(); } while (!lcd_clicked()); LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); lcd_return_to_status(); 1b62e: 0d 94 d5 07 jmp 0x20faa ; 0x20faa lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_ENDSTOP)); lcd_set_cursor(18, 3); lcd_print(_error_2); break; case TestError::Endstop: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_ENDSTOP_NOTHIT)); 1b632: 8a e6 ldi r24, 0x6A ; 106 1b634: 99 e4 ldi r25, 0x49 ; 73 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::Pulley: lcd_puts_at_P(0, 2, _T(MSG_LOOSE_PULLEY)); 1b636: 0e 94 3a 75 call 0xea74 ; 0xea74 1b63a: ac 01 movw r20, r24 1b63c: 62 e0 ldi r22, 0x02 ; 2 1b63e: 80 e0 ldi r24, 0x00 ; 0 1b640: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR)); 1b644: 86 e8 ldi r24, 0x86 ; 134 1b646: 99 e4 ldi r25, 0x49 ; 73 1b648: a1 cf rjmp .-190 ; 0x1b58c lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::PrintFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_PART_FAN)); 1b64a: 8a e5 ldi r24, 0x5A ; 90 1b64c: 9d e5 ldi r25, 0x5D ; 93 1b64e: 95 cf rjmp .-214 ; 0x1b57a lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::ExtruderFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HOTEND_FAN)); 1b650: 87 e4 ldi r24, 0x47 ; 71 1b652: 9d e5 ldi r25, 0x5D ; 93 1b654: 92 cf rjmp .-220 ; 0x1b57a lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::Pulley: lcd_puts_at_P(0, 2, _T(MSG_LOOSE_PULLEY)); 1b656: 8b e5 ldi r24, 0x5B ; 91 1b658: 99 e4 ldi r25, 0x49 ; 73 1b65a: ed cf rjmp .-38 ; 0x1b636 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR)); lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::Axis: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_AXIS_LENGTH)); 1b65c: 8d e4 ldi r24, 0x4D ; 77 1b65e: 99 e4 ldi r25, 0x49 ; 73 1b660: 0e 94 3a 75 call 0xea74 ; 0xea74 1b664: ac 01 movw r20, r24 1b666: 62 e0 ldi r22, 0x02 ; 2 1b668: 80 e0 ldi r24, 0x00 ; 0 1b66a: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_AXIS)); 1b66e: 86 e4 ldi r24, 0x46 ; 70 1b670: 99 e4 ldi r25, 0x49 ; 73 1b672: 8c cf rjmp .-232 ; 0x1b58c lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::SwappedFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS)); 1b674: 84 e3 ldi r24, 0x34 ; 52 1b676: 99 e4 ldi r25, 0x49 ; 73 1b678: 0e 94 3a 75 call 0xea74 ; 0xea74 1b67c: ac 01 movw r20, r24 1b67e: 62 e0 ldi r22, 0x02 ; 2 1b680: 80 e0 ldi r24, 0x00 ; 0 1b682: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED)); 1b686: 8a e2 ldi r24, 0x2A ; 42 1b688: 99 e4 ldi r25, 0x49 ; 73 1b68a: 80 cf rjmp .-256 ; 0x1b58c lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::WiringFsensor: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); 1b68c: 8b ef ldi r24, 0xFB ; 251 1b68e: 99 e4 ldi r25, 0x49 ; 73 1b690: 68 cf rjmp .-304 ; 0x1b562 0001b692 : manage_inactivity(true); return _result; } static bool lcd_selfcheck_check_heater(bool _isbed) { 1b692: 8f 92 push r8 1b694: 9f 92 push r9 1b696: af 92 push r10 1b698: bf 92 push r11 1b69a: cf 92 push r12 1b69c: df 92 push r13 1b69e: ef 92 push r14 1b6a0: ff 92 push r15 1b6a2: 0f 93 push r16 1b6a4: 1f 93 push r17 1b6a6: cf 93 push r28 1b6a8: df 93 push r29 1b6aa: f8 2e mov r15, r24 1b6ac: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1b6b0: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1b6b4: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1b6b8: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1b6bc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1b6c0: 4b 01 movw r8, r22 1b6c2: 6b 01 movw r12, r22 1b6c4: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 1b6c8: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 1b6cc: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 1b6d0: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 1b6d4: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1b6d8: eb 01 movw r28, r22 uint8_t _progress = 0; int _checked_snapshot = (_isbed) ? degBed() : degHotend(0); int _opposite_snapshot = (_isbed) ? degHotend(0) : degBed(); uint8_t _cycles = (_isbed) ? 180 : 60; //~ 90s / 30s 1b6da: 9c e3 ldi r25, 0x3C ; 60 1b6dc: a9 2e mov r10, r25 target_temperature[0] = (_isbed) ? 0 : 200; 1b6de: 88 ec ldi r24, 0xC8 ; 200 1b6e0: 90 e0 ldi r25, 0x00 ; 0 } static bool lcd_selfcheck_check_heater(bool _isbed) { uint8_t _progress = 0; int _checked_snapshot = (_isbed) ? degBed() : degHotend(0); 1b6e2: ff 20 and r15, r15 1b6e4: 31 f0 breq .+12 ; 0x1b6f2 1b6e6: 6b 01 movw r12, r22 int _opposite_snapshot = (_isbed) ? degHotend(0) : degBed(); 1b6e8: e4 01 movw r28, r8 uint8_t _cycles = (_isbed) ? 180 : 60; //~ 90s / 30s 1b6ea: 24 eb ldi r18, 0xB4 ; 180 1b6ec: a2 2e mov r10, r18 target_temperature[0] = (_isbed) ? 0 : 200; 1b6ee: 90 e0 ldi r25, 0x00 ; 0 1b6f0: 80 e0 ldi r24, 0x00 ; 0 1b6f2: 90 93 5e 12 sts 0x125E, r25 ; 0x80125e 1b6f6: 80 93 5d 12 sts 0x125D, r24 ; 0x80125d target_temperature_bed = (_isbed) ? 100 : 0; 1b6fa: 84 e6 ldi r24, 0x64 ; 100 1b6fc: 90 e0 ldi r25, 0x00 ; 0 1b6fe: f1 10 cpse r15, r1 1b700: 02 c0 rjmp .+4 ; 0x1b706 1b702: 90 e0 ldi r25, 0x00 ; 0 1b704: 80 e0 ldi r24, 0x00 ; 0 1b706: 90 93 5a 12 sts 0x125A, r25 ; 0x80125a 1b70a: 80 93 59 12 sts 0x1259, r24 ; 0x801259 #ifdef THERMAL_MODEL bool tm_was_enabled = thermal_model_enabled(); thermal_model_set_enabled(false); #endif //THERMAL_MODEL manage_heater(); 1b70e: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1b712: 81 e0 ldi r24, 0x01 ; 1 1b714: 0e 94 34 8c call 0x11868 ; 0x11868 for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1b718: e1 2c mov r14, r1 return _result; } static bool lcd_selfcheck_check_heater(bool _isbed) { uint8_t _progress = 0; 1b71a: b1 2c mov r11, r1 } else { MYSERIAL.print("Hotend temp:"); MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds 1b71c: 85 e0 ldi r24, 0x05 ; 5 1b71e: 98 2e mov r9, r24 thermal_model_set_enabled(false); #endif //THERMAL_MODEL manage_heater(); manage_inactivity(true); for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1b720: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 1b724: 81 11 cpse r24, r1 1b726: 1c c0 rjmp .+56 ; 0x1b760 { manage_heater(); 1b728: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1b72c: 81 e0 ldi r24, 0x01 ; 1 1b72e: 0e 94 34 8c call 0x11868 ; 0x11868 _progress = (_isbed? 1b732: 00 e9 ldi r16, 0x90 ; 144 1b734: 11 e0 ldi r17, 0x01 ; 1 1b736: 20 e0 ldi r18, 0x00 ; 0 1b738: 42 e0 ldi r20, 0x02 ; 2 1b73a: 6b 2d mov r22, r11 1b73c: 87 e0 ldi r24, 0x07 ; 7 1b73e: f1 10 cpse r15, r1 1b740: 01 c0 rjmp .+2 ; 0x1b744 1b742: 88 e0 ldi r24, 0x08 ; 8 1b744: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1b748: b8 2e mov r11, r24 } else { MYSERIAL.print("Hotend temp:"); MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds 1b74a: 8e 2d mov r24, r14 1b74c: 69 2d mov r22, r9 1b74e: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> 1b752: 91 11 cpse r25, r1 1b754: 02 c0 rjmp .+4 ; 0x1b75a 1b756: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 thermal_model_set_enabled(false); #endif //THERMAL_MODEL manage_heater(); manage_inactivity(true); for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1b75a: e3 94 inc r14 1b75c: ea 10 cpse r14, r10 1b75e: e0 cf rjmp .-64 ; 0x1b720 MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds } target_temperature[0] = 0; 1b760: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1b764: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d target_temperature_bed = 0; 1b768: 10 92 5a 12 sts 0x125A, r1 ; 0x80125a 1b76c: 10 92 59 12 sts 0x1259, r1 ; 0x801259 manage_heater(); 1b770: 0f 94 1c 3a call 0x27438 ; 0x27438 1b774: b6 01 movw r22, r12 1b776: dd 0c add r13, r13 1b778: 88 0b sbc r24, r24 1b77a: 99 0b sbc r25, r25 1b77c: 4e 01 movw r8, r28 1b77e: dd 0f add r29, r29 1b780: aa 08 sbc r10, r10 1b782: bb 08 sbc r11, r11 int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot; 1b784: ff 20 and r15, r15 1b786: 09 f4 brne .+2 ; 0x1b78a 1b788: 4d c0 rjmp .+154 ; 0x1b824 1b78a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1b78e: 9b 01 movw r18, r22 1b790: ac 01 movw r20, r24 1b792: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 1b796: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 1b79a: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 1b79e: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 1b7a2: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1b7a6: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1b7aa: eb 01 movw r28, r22 int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot; 1b7ac: c5 01 movw r24, r10 1b7ae: b4 01 movw r22, r8 1b7b0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1b7b4: 9b 01 movw r18, r22 1b7b6: ac 01 movw r20, r24 1b7b8: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1b7bc: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1b7c0: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1b7c4: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1b7c8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1b7cc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) 1b7d0: 10 91 3b 12 lds r17, 0x123B ; 0x80123b 1b7d4: 11 11 cpse r17, r1 1b7d6: 0c c0 rjmp .+24 ; 0x1b7f0 1b7d8: f1 10 cpse r15, r1 1b7da: 44 c0 rjmp .+136 ; 0x1b864 1b7dc: 69 30 cpi r22, 0x09 ; 9 1b7de: 71 05 cpc r23, r1 1b7e0: 0c f0 brlt .+2 ; 0x1b7e4 1b7e2: 46 c0 rjmp .+140 ; 0x1b870 { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1b7e4: 8e e1 ldi r24, 0x1E ; 30 1b7e6: 90 e0 ldi r25, 0x00 ; 0 _stepresult = true; 1b7e8: 11 e0 ldi r17, 0x01 ; 1 */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1b7ea: c8 17 cp r28, r24 1b7ec: d9 07 cpc r29, r25 1b7ee: 3c f4 brge .+14 ; 0x1b7fe _stepresult = true; else lcd_selftest_error(TestError::Heater, "", ""); 1b7f0: 4f ed ldi r20, 0xDF ; 223 1b7f2: 52 e0 ldi r21, 0x02 ; 2 1b7f4: ba 01 movw r22, r20 1b7f6: 80 e0 ldi r24, 0x00 ; 0 1b7f8: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 MYSERIAL.println(_checked_result); MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; 1b7fc: 10 e0 ldi r17, 0x00 ; 0 } #ifdef THERMAL_MODEL thermal_model_set_enabled(tm_was_enabled); #endif //THERMAL_MODEL manage_heater(); 1b7fe: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1b802: 81 e0 ldi r24, 0x01 ; 1 1b804: 0e 94 34 8c call 0x11868 ; 0x11868 return _stepresult; } 1b808: 81 2f mov r24, r17 1b80a: df 91 pop r29 1b80c: cf 91 pop r28 1b80e: 1f 91 pop r17 1b810: 0f 91 pop r16 1b812: ff 90 pop r15 1b814: ef 90 pop r14 1b816: df 90 pop r13 1b818: cf 90 pop r12 1b81a: bf 90 pop r11 1b81c: af 90 pop r10 1b81e: 9f 90 pop r9 1b820: 8f 90 pop r8 1b822: 08 95 ret target_temperature[0] = 0; target_temperature_bed = 0; manage_heater(); int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot; 1b824: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1b828: 9b 01 movw r18, r22 1b82a: ac 01 movw r20, r24 1b82c: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1b830: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1b834: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1b838: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1b83c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1b840: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1b844: eb 01 movw r28, r22 int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot; 1b846: c5 01 movw r24, r10 1b848: b4 01 movw r22, r8 1b84a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1b84e: 9b 01 movw r18, r22 1b850: ac 01 movw r20, r24 1b852: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 1b856: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 1b85a: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 1b85e: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 1b862: b2 cf rjmp .-156 ; 0x1b7c8 */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1b864: 89 e0 ldi r24, 0x09 ; 9 1b866: 90 e0 ldi r25, 0x00 ; 0 MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) 1b868: 6e 31 cpi r22, 0x1E ; 30 1b86a: 71 05 cpc r23, r1 1b86c: 0c f4 brge .+2 ; 0x1b870 1b86e: bc cf rjmp .-136 ; 0x1b7e8 else lcd_selftest_error(TestError::Heater, "", ""); } else { lcd_selftest_error(TestError::Bed, "", ""); 1b870: 4f ed ldi r20, 0xDF ; 223 1b872: 52 e0 ldi r21, 0x02 ; 2 1b874: ba 01 movw r22, r20 1b876: 81 e0 ldi r24, 0x01 ; 1 1b878: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 1b87c: c0 cf rjmp .-128 ; 0x1b7fe 0001b87e : return _stepresult; } static bool lcd_selfcheck_pulleys(int axis) { 1b87e: 2f 92 push r2 1b880: 3f 92 push r3 1b882: 4f 92 push r4 1b884: 5f 92 push r5 1b886: 6f 92 push r6 1b888: 7f 92 push r7 1b88a: 8f 92 push r8 1b88c: 9f 92 push r9 1b88e: af 92 push r10 1b890: bf 92 push r11 1b892: cf 92 push r12 1b894: df 92 push r13 1b896: ef 92 push r14 1b898: ff 92 push r15 1b89a: 0f 93 push r16 1b89c: 1f 93 push r17 1b89e: cf 93 push r28 1b8a0: df 93 push r29 1b8a2: 8c 01 movw r16, r24 float current_position_init; float move; bool endstop_triggered = false; int i; unsigned long timeout_counter; refresh_cmd_timeout(); 1b8a4: 0e 94 41 65 call 0xca82 ; 0xca82 manage_inactivity(true); 1b8a8: 81 e0 ldi r24, 0x01 ; 1 1b8aa: 0e 94 34 8c call 0x11868 ; 0x11868 if (axis == 0) move = 50; //X_AXIS else move = 50; //Y_AXIS current_position_init = current_position[axis]; 1b8ae: 18 01 movw r2, r16 1b8b0: 22 0c add r2, r2 1b8b2: 33 1c adc r3, r3 1b8b4: 22 0c add r2, r2 1b8b6: 33 1c adc r3, r3 1b8b8: e1 01 movw r28, r2 1b8ba: cf 59 subi r28, 0x9F ; 159 1b8bc: dd 4e sbci r29, 0xED ; 237 1b8be: 88 80 ld r8, Y 1b8c0: 99 80 ldd r9, Y+1 ; 0x01 1b8c2: aa 80 ldd r10, Y+2 ; 0x02 1b8c4: bb 80 ldd r11, Y+3 ; 0x03 current_position[axis] += 2; 1b8c6: 20 e0 ldi r18, 0x00 ; 0 1b8c8: 30 e0 ldi r19, 0x00 ; 0 1b8ca: 40 e0 ldi r20, 0x00 ; 0 1b8cc: 50 e4 ldi r21, 0x40 ; 64 1b8ce: c5 01 movw r24, r10 1b8d0: b4 01 movw r22, r8 1b8d2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1b8d6: 68 83 st Y, r22 1b8d8: 79 83 std Y+1, r23 ; 0x01 1b8da: 8a 83 std Y+2, r24 ; 0x02 1b8dc: 9b 83 std Y+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1b8de: 60 e0 ldi r22, 0x00 ; 0 1b8e0: 70 e0 ldi r23, 0x00 ; 0 1b8e2: 84 e3 ldi r24, 0x34 ; 52 1b8e4: 92 e4 ldi r25, 0x42 ; 66 1b8e6: 0f 94 81 4c call 0x29902 ; 0x29902 1b8ea: 95 e0 ldi r25, 0x05 ; 5 1b8ec: e9 2e mov r14, r25 1b8ee: f1 2c mov r15, r1 for (i = 0; i < 5; i++) { refresh_cmd_timeout(); 1b8f0: 0e 94 41 65 call 0xca82 ; 0xca82 current_position[axis] = current_position[axis] + move; 1b8f4: 20 e0 ldi r18, 0x00 ; 0 1b8f6: 30 e0 ldi r19, 0x00 ; 0 1b8f8: 48 e4 ldi r20, 0x48 ; 72 1b8fa: 52 e4 ldi r21, 0x42 ; 66 1b8fc: 68 81 ld r22, Y 1b8fe: 79 81 ldd r23, Y+1 ; 0x01 1b900: 8a 81 ldd r24, Y+2 ; 0x02 1b902: 9b 81 ldd r25, Y+3 ; 0x03 1b904: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1b908: 68 83 st Y, r22 1b90a: 79 83 std Y+1, r23 ; 0x01 1b90c: 8a 83 std Y+2, r24 ; 0x02 1b90e: 9b 83 std Y+3, r25 ; 0x03 } #ifdef MOTOR_CURRENT_PWM_XY_PIN void st_current_set(uint8_t driver, int current) { if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); 1b910: 6c e6 ldi r22, 0x6C ; 108 1b912: 70 e0 ldi r23, 0x00 ; 0 1b914: 8e e2 ldi r24, 0x2E ; 46 1b916: 0e 94 6e d3 call 0x1a6dc ; 0x1a6dc st_current_set(0, 850); //set motor current higher plan_buffer_line_curposXYZE(200); 1b91a: 60 e0 ldi r22, 0x00 ; 0 1b91c: 70 e0 ldi r23, 0x00 ; 0 1b91e: 88 e4 ldi r24, 0x48 ; 72 1b920: 93 e4 ldi r25, 0x43 ; 67 1b922: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1b926: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (SilentModeMenu != SILENT_MODE_OFF) st_current_set(0, tmp_motor[0]); //set back to normal operation currents 1b92a: 80 91 bb 03 lds r24, 0x03BB ; 0x8003bb 1b92e: 62 e2 ldi r22, 0x22 ; 34 1b930: 70 e0 ldi r23, 0x00 ; 0 1b932: 81 11 cpse r24, r1 1b934: 02 c0 rjmp .+4 ; 0x1b93a 1b936: 64 e4 ldi r22, 0x44 ; 68 1b938: 70 e0 ldi r23, 0x00 ; 0 1b93a: 8e e2 ldi r24, 0x2E ; 46 1b93c: 0e 94 6e d3 call 0x1a6dc ; 0x1a6dc else st_current_set(0, tmp_motor_loud[0]); //set motor current back current_position[axis] = current_position[axis] - move; 1b940: 20 e0 ldi r18, 0x00 ; 0 1b942: 30 e0 ldi r19, 0x00 ; 0 1b944: 48 e4 ldi r20, 0x48 ; 72 1b946: 52 e4 ldi r21, 0x42 ; 66 1b948: 68 81 ld r22, Y 1b94a: 79 81 ldd r23, Y+1 ; 0x01 1b94c: 8a 81 ldd r24, Y+2 ; 0x02 1b94e: 9b 81 ldd r25, Y+3 ; 0x03 1b950: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1b954: 68 83 st Y, r22 1b956: 79 83 std Y+1, r23 ; 0x01 1b958: 8a 83 std Y+2, r24 ; 0x02 1b95a: 9b 83 std Y+3, r25 ; 0x03 plan_buffer_line_curposXYZE(50); 1b95c: 60 e0 ldi r22, 0x00 ; 0 1b95e: 70 e0 ldi r23, 0x00 ; 0 1b960: 88 e4 ldi r24, 0x48 ; 72 1b962: 92 e4 ldi r25, 0x42 ; 66 1b964: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1b968: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || 1b96c: 1e 99 sbic 0x03, 6 ; 3 1b96e: 3a c0 rjmp .+116 ; 0x1b9e4 1b970: 1d 99 sbic 0x03, 5 ; 3 1b972: 38 c0 rjmp .+112 ; 0x1b9e4 1b974: 21 e0 ldi r18, 0x01 ; 1 1b976: e2 1a sub r14, r18 1b978: f1 08 sbc r15, r1 current_position_init = current_position[axis]; current_position[axis] += 2; plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); for (i = 0; i < 5; i++) { 1b97a: 09 f0 breq .+2 ; 0x1b97e 1b97c: b9 cf rjmp .-142 ; 0x1b8f0 ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) { lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", ""); return(false); } } timeout_counter = _millis() + 2500; 1b97e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1b982: 2b 01 movw r4, r22 1b984: 3c 01 movw r6, r24 1b986: 24 ec ldi r18, 0xC4 ; 196 1b988: 42 0e add r4, r18 1b98a: 29 e0 ldi r18, 0x09 ; 9 1b98c: 52 1e adc r5, r18 1b98e: 61 1c adc r6, r1 1b990: 71 1c adc r7, r1 endstop_triggered = false; manage_inactivity(true); 1b992: 81 e0 ldi r24, 0x01 ; 1 1b994: 0e 94 34 8c call 0x11868 ; 0x11868 1b998: e1 01 movw r28, r2 1b99a: cf 59 subi r28, 0x9F ; 159 1b99c: dd 4e sbci r29, 0xED ; 237 1b99e: c8 80 ld r12, Y 1b9a0: d9 80 ldd r13, Y+1 ; 0x01 1b9a2: ea 80 ldd r14, Y+2 ; 0x02 1b9a4: fb 80 ldd r15, Y+3 ; 0x03 while (!endstop_triggered) { if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) { endstop_triggered = true; if (current_position_init - 1 <= current_position[axis] && current_position_init + 1 >= current_position[axis]) { 1b9a6: 20 e0 ldi r18, 0x00 ; 0 1b9a8: 30 e0 ldi r19, 0x00 ; 0 1b9aa: 40 e8 ldi r20, 0x80 ; 128 1b9ac: 5f e3 ldi r21, 0x3F ; 63 } timeout_counter = _millis() + 2500; endstop_triggered = false; manage_inactivity(true); while (!endstop_triggered) { if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || 1b9ae: 1e 99 sbic 0x03, 6 ; 3 1b9b0: 26 c0 rjmp .+76 ; 0x1b9fe 1b9b2: 1d 99 sbic 0x03, 5 ; 3 1b9b4: 24 c0 rjmp .+72 ; 0x1b9fe lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", ""); return(false); } } else { current_position[axis] -= 1; 1b9b6: c7 01 movw r24, r14 1b9b8: b6 01 movw r22, r12 1b9ba: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1b9be: 68 83 st Y, r22 1b9c0: 79 83 std Y+1, r23 ; 0x01 1b9c2: 8a 83 std Y+2, r24 ; 0x02 1b9c4: 9b 83 std Y+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1b9c6: 60 e0 ldi r22, 0x00 ; 0 1b9c8: 70 e0 ldi r23, 0x00 ; 0 1b9ca: 84 e3 ldi r24, 0x34 ; 52 1b9cc: 92 e4 ldi r25, 0x42 ; 66 1b9ce: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1b9d2: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if (_millis() > timeout_counter) { 1b9d6: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1b9da: 46 16 cp r4, r22 1b9dc: 57 06 cpc r5, r23 1b9de: 68 06 cpc r6, r24 1b9e0: 79 06 cpc r7, r25 1b9e2: e8 f6 brcc .-70 ; 0x1b99e lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", ""); 1b9e4: 68 ec ldi r22, 0xC8 ; 200 1b9e6: 72 e0 ldi r23, 0x02 ; 2 1b9e8: 01 2b or r16, r17 1b9ea: 11 f0 breq .+4 ; 0x1b9f0 1b9ec: 6a ec ldi r22, 0xCA ; 202 1b9ee: 72 e0 ldi r23, 0x02 ; 2 1b9f0: 4f ed ldi r20, 0xDF ; 223 1b9f2: 52 e0 ldi r21, 0x02 ; 2 1b9f4: 87 e0 ldi r24, 0x07 ; 7 1b9f6: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 return(false); 1b9fa: 80 e0 ldi r24, 0x00 ; 0 1b9fc: 30 c0 rjmp .+96 ; 0x1ba5e manage_inactivity(true); while (!endstop_triggered) { if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) { endstop_triggered = true; if (current_position_init - 1 <= current_position[axis] && current_position_init + 1 >= current_position[axis]) { 1b9fe: c5 01 movw r24, r10 1ba00: b4 01 movw r22, r8 1ba02: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1ba06: a7 01 movw r20, r14 1ba08: 96 01 movw r18, r12 1ba0a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1ba0e: 18 16 cp r1, r24 1ba10: 4c f3 brlt .-46 ; 0x1b9e4 1ba12: 20 e0 ldi r18, 0x00 ; 0 1ba14: 30 e0 ldi r19, 0x00 ; 0 1ba16: 40 e8 ldi r20, 0x80 ; 128 1ba18: 5f e3 ldi r21, 0x3F ; 63 1ba1a: c5 01 movw r24, r10 1ba1c: b4 01 movw r22, r8 1ba1e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1ba22: a7 01 movw r20, r14 1ba24: 96 01 movw r18, r12 1ba26: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1ba2a: 87 fd sbrc r24, 7 1ba2c: db cf rjmp .-74 ; 0x1b9e4 current_position[axis] += 10; 1ba2e: e1 01 movw r28, r2 1ba30: cf 59 subi r28, 0x9F ; 159 1ba32: dd 4e sbci r29, 0xED ; 237 1ba34: 20 e0 ldi r18, 0x00 ; 0 1ba36: 30 e0 ldi r19, 0x00 ; 0 1ba38: 40 e2 ldi r20, 0x20 ; 32 1ba3a: 51 e4 ldi r21, 0x41 ; 65 1ba3c: c7 01 movw r24, r14 1ba3e: b6 01 movw r22, r12 1ba40: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1ba44: 68 83 st Y, r22 1ba46: 79 83 std Y+1, r23 ; 0x01 1ba48: 8a 83 std Y+2, r24 ; 0x02 1ba4a: 9b 83 std Y+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1ba4c: 60 e0 ldi r22, 0x00 ; 0 1ba4e: 70 e0 ldi r23, 0x00 ; 0 1ba50: 84 e3 ldi r24, 0x34 ; 52 1ba52: 92 e4 ldi r25, 0x42 ; 66 1ba54: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1ba58: 0f 94 fb 1a call 0x235f6 ; 0x235f6 return(true); 1ba5c: 81 e0 ldi r24, 0x01 ; 1 return(false); } } } return(true); } 1ba5e: df 91 pop r29 1ba60: cf 91 pop r28 1ba62: 1f 91 pop r17 1ba64: 0f 91 pop r16 1ba66: ff 90 pop r15 1ba68: ef 90 pop r14 1ba6a: df 90 pop r13 1ba6c: cf 90 pop r12 1ba6e: bf 90 pop r11 1ba70: af 90 pop r10 1ba72: 9f 90 pop r9 1ba74: 8f 90 pop r8 1ba76: 7f 90 pop r7 1ba78: 6f 90 pop r6 1ba7a: 5f 90 pop r5 1ba7c: 4f 90 pop r4 1ba7e: 3f 90 pop r3 1ba80: 2f 90 pop r2 1ba82: 08 95 ret 0001ba84 : } #endif //TMC2130 #ifndef TMC2130 static bool lcd_selfcheck_axis(int _axis, int _travel) { 1ba84: 2f 92 push r2 1ba86: 3f 92 push r3 1ba88: 4f 92 push r4 1ba8a: 5f 92 push r5 1ba8c: 6f 92 push r6 1ba8e: 7f 92 push r7 1ba90: 8f 92 push r8 1ba92: 9f 92 push r9 1ba94: af 92 push r10 1ba96: bf 92 push r11 1ba98: cf 92 push r12 1ba9a: df 92 push r13 1ba9c: ef 92 push r14 1ba9e: ff 92 push r15 1baa0: 0f 93 push r16 1baa2: 1f 93 push r17 1baa4: cf 93 push r28 1baa6: df 93 push r29 1baa8: 7c 01 movw r14, r24 1baaa: 3b 01 movw r6, r22 bool _stepresult = false; uint8_t _progress = 0; int _travel_done = 0; int _err_endstop = 0; int _lcd_refresh = 0; _travel = _travel + (_travel / 10); 1baac: cb 01 movw r24, r22 1baae: 6a e0 ldi r22, 0x0A ; 10 1bab0: 70 e0 ldi r23, 0x00 ; 0 1bab2: 0f 94 bd a4 call 0x3497a ; 0x3497a <__divmodhi4> 1bab6: 66 0e add r6, r22 1bab8: 77 1e adc r7, r23 if (_axis == X_AXIS) { 1baba: e1 14 cp r14, r1 1babc: f1 04 cpc r15, r1 1babe: e1 f4 brne .+56 ; 0x1baf8 current_position[Z_AXIS] += 17; 1bac0: 20 e0 ldi r18, 0x00 ; 0 1bac2: 30 e0 ldi r19, 0x00 ; 0 1bac4: 48 e8 ldi r20, 0x88 ; 136 1bac6: 51 e4 ldi r21, 0x41 ; 65 1bac8: 60 91 69 12 lds r22, 0x1269 ; 0x801269 1bacc: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 1bad0: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 1bad4: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 1bad8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1badc: 60 93 69 12 sts 0x1269, r22 ; 0x801269 1bae0: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 1bae4: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 1bae8: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1baec: 60 e0 ldi r22, 0x00 ; 0 1baee: 70 e0 ldi r23, 0x00 ; 0 1baf0: 84 e3 ldi r24, 0x34 ; 52 1baf2: 92 e4 ldi r25, 0x42 ; 66 1baf4: 0f 94 81 4c call 0x29902 ; 0x29902 } #endif //TMC2130 #ifndef TMC2130 static bool lcd_selfcheck_axis(int _axis, int _travel) { 1baf8: 10 e0 ldi r17, 0x00 ; 0 1bafa: 00 e0 ldi r16, 0x00 ; 0 1bafc: d0 e0 ldi r29, 0x00 ; 0 1bafe: c0 e0 ldi r28, 0x00 ; 0 1bb00: d1 2c mov r13, r1 1bb02: c1 2c mov r12, r1 1bb04: 31 2c mov r3, r1 1bb06: 51 2c mov r5, r1 current_position[Z_AXIS] += 17; plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); } do { current_position[_axis] = current_position[_axis] - 1; 1bb08: 57 01 movw r10, r14 1bb0a: aa 0c add r10, r10 1bb0c: bb 1c adc r11, r11 1bb0e: aa 0c add r10, r10 1bb10: bb 1c adc r11, r11 1bb12: c5 01 movw r24, r10 1bb14: 8f 59 subi r24, 0x9F ; 159 1bb16: 9d 4e sbci r25, 0xED ; 237 1bb18: 4c 01 movw r8, r24 { _lcd_refresh++; } else { _progress = lcd_selftest_screen(static_cast(static_cast(TestScreen::AxisX) + _axis), _progress, 3, false, 0); 1bb1a: 94 e0 ldi r25, 0x04 ; 4 1bb1c: 29 2e mov r2, r25 1bb1e: 2e 0c add r2, r14 current_position[Z_AXIS] += 17; plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); } do { current_position[_axis] = current_position[_axis] - 1; 1bb20: 20 e0 ldi r18, 0x00 ; 0 1bb22: 30 e0 ldi r19, 0x00 ; 0 1bb24: 40 e8 ldi r20, 0x80 ; 128 1bb26: 5f e3 ldi r21, 0x3F ; 63 1bb28: f4 01 movw r30, r8 1bb2a: 60 81 ld r22, Z 1bb2c: 71 81 ldd r23, Z+1 ; 0x01 1bb2e: 82 81 ldd r24, Z+2 ; 0x02 1bb30: 93 81 ldd r25, Z+3 ; 0x03 1bb32: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1bb36: f4 01 movw r30, r8 1bb38: 60 83 st Z, r22 1bb3a: 71 83 std Z+1, r23 ; 0x01 1bb3c: 82 83 std Z+2, r24 ; 0x02 1bb3e: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bb40: 60 e0 ldi r22, 0x00 ; 0 1bb42: 70 e0 ldi r23, 0x00 ; 0 1bb44: 84 e3 ldi r24, 0x34 ; 52 1bb46: 92 e4 ldi r25, 0x42 ; 66 1bb48: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1bb4c: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) || (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) || 1bb50: 1e 99 sbic 0x03, 6 ; 3 1bb52: 04 c0 rjmp .+8 ; 0x1bb5c 1bb54: 1d 99 sbic 0x03, 5 ; 3 1bb56: 02 c0 rjmp .+4 ; 0x1bb5c 1bb58: 1c 9b sbis 0x03, 4 ; 3 1bb5a: 39 c0 rjmp .+114 ; 0x1bbce (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING)) { if (_axis == 0) { _stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false; 1bb5c: 53 b0 in r5, 0x03 ; 3 st_synchronize(); if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) || (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) || (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING)) { if (_axis == 0) 1bb5e: e1 14 cp r14, r1 1bb60: f1 04 cpc r15, r1 1bb62: 51 f4 brne .+20 ; 0x1bb78 { _stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false; 1bb64: 56 fa bst r5, 6 1bb66: 55 24 eor r5, r5 1bb68: 50 f8 bld r5, 0 _err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2; 1bb6a: 1d 99 sbic 0x03, 5 ; 3 1bb6c: 8e c0 rjmp .+284 ; 0x1bc8a } if (_axis == 1) { _stepresult = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? true : false; _err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 2; 1bb6e: c2 e0 ldi r28, 0x02 ; 2 1bb70: d0 e0 ldi r29, 0x00 ; 0 { _stepresult = ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) ? true : false; _err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 1; printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop); } _stepdone = true; 1bb72: 44 24 eor r4, r4 1bb74: 43 94 inc r4 1bb76: 2c c0 rjmp .+88 ; 0x1bbd0 { _stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false; _err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2; } if (_axis == 1) 1bb78: f1 e0 ldi r31, 0x01 ; 1 1bb7a: ef 16 cp r14, r31 1bb7c: f1 04 cpc r15, r1 1bb7e: 41 f4 brne .+16 ; 0x1bb90 { _stepresult = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? true : false; 1bb80: 55 fa bst r5, 5 1bb82: 55 24 eor r5, r5 1bb84: 50 f8 bld r5, 0 _err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 2; 1bb86: 1e 9b sbis 0x03, 6 ; 3 1bb88: f2 cf rjmp .-28 ; 0x1bb6e 1bb8a: d0 e0 ldi r29, 0x00 ; 0 1bb8c: c0 e0 ldi r28, 0x00 ; 0 1bb8e: f1 cf rjmp .-30 ; 0x1bb72 } if (_axis == 2) { _stepresult = ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) ? true : false; 1bb90: 54 fa bst r5, 4 1bb92: 55 24 eor r5, r5 1bb94: 50 f8 bld r5, 0 _err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 1; 1bb96: 83 b1 in r24, 0x03 ; 3 1bb98: 82 95 swap r24 1bb9a: 86 95 lsr r24 1bb9c: 86 95 lsr r24 1bb9e: 83 70 andi r24, 0x03 ; 3 1bba0: 21 e0 ldi r18, 0x01 ; 1 1bba2: 82 27 eor r24, r18 1bba4: 81 70 andi r24, 0x01 ; 1 1bba6: c8 2f mov r28, r24 1bba8: 80 e0 ldi r24, 0x00 ; 0 1bbaa: d8 2f mov r29, r24 printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop); 1bbac: 8f 93 push r24 1bbae: cf 93 push r28 1bbb0: 1f 92 push r1 1bbb2: 5f 92 push r5 1bbb4: e5 ed ldi r30, 0xD5 ; 213 1bbb6: f3 e8 ldi r31, 0x83 ; 131 1bbb8: ff 93 push r31 1bbba: ef 93 push r30 1bbbc: 0f 94 a2 a2 call 0x34544 ; 0x34544 1bbc0: 0f 90 pop r0 1bbc2: 0f 90 pop r0 1bbc4: 0f 90 pop r0 1bbc6: 0f 90 pop r0 1bbc8: 0f 90 pop r0 1bbca: 0f 90 pop r0 1bbcc: d2 cf rjmp .-92 ; 0x1bb72 current_position[_axis] = current_position[_axis] - 1; plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); st_synchronize(); if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) || (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) || 1bbce: 41 2c mov r4, r1 printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop); } _stepdone = true; } if (_lcd_refresh < 6) 1bbd0: 06 30 cpi r16, 0x06 ; 6 1bbd2: 11 05 cpc r17, r1 1bbd4: 0c f0 brlt .+2 ; 0x1bbd8 1bbd6: 4f c0 rjmp .+158 ; 0x1bc76 { _lcd_refresh++; 1bbd8: 0f 5f subi r16, 0xFF ; 255 1bbda: 1f 4f sbci r17, 0xFF ; 255 { _progress = lcd_selftest_screen(static_cast(static_cast(TestScreen::AxisX) + _axis), _progress, 3, false, 0); _lcd_refresh = 0; } manage_heater(); 1bbdc: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1bbe0: 81 e0 ldi r24, 0x01 ; 1 1bbe2: 0e 94 34 8c call 0x11868 ; 0x11868 (_travel_done <= _travel) ? _travel_done++ : _stepdone = true; 1bbe6: 6c 14 cp r6, r12 1bbe8: 7d 04 cpc r7, r13 1bbea: 34 f0 brlt .+12 ; 0x1bbf8 1bbec: 8f ef ldi r24, 0xFF ; 255 1bbee: c8 1a sub r12, r24 1bbf0: d8 0a sbc r13, r24 } while (!_stepdone); 1bbf2: 44 20 and r4, r4 1bbf4: 09 f4 brne .+2 ; 0x1bbf8 1bbf6: 94 cf rjmp .-216 ; 0x1bb20 if (!_stepresult) 1bbf8: 51 10 cpse r5, r1 1bbfa: 20 c0 rjmp .+64 ; 0x1bc3c { const char *_error_1; const char *_error_2; if (_axis == X_AXIS) _error_1 = "X"; if (_axis == Y_AXIS) _error_1 = "Y"; 1bbfc: 6a ec ldi r22, 0xCA ; 202 1bbfe: 72 e0 ldi r23, 0x02 ; 2 1bc00: 91 e0 ldi r25, 0x01 ; 1 1bc02: e9 16 cp r14, r25 1bc04: f1 04 cpc r15, r1 1bc06: 41 f0 breq .+16 ; 0x1bc18 if (_axis == Z_AXIS) _error_1 = "Z"; 1bc08: 6c ec ldi r22, 0xCC ; 204 1bc0a: 72 e0 ldi r23, 0x02 ; 2 1bc0c: e2 e0 ldi r30, 0x02 ; 2 1bc0e: ee 16 cp r14, r30 1bc10: f1 04 cpc r15, r1 1bc12: 11 f0 breq .+4 ; 0x1bc18 1bc14: 68 ec ldi r22, 0xC8 ; 200 1bc16: 72 e0 ldi r23, 0x02 ; 2 if (_err_endstop == 0) _error_2 = "X"; if (_err_endstop == 1) _error_2 = "Y"; 1bc18: 4a ec ldi r20, 0xCA ; 202 1bc1a: 52 e0 ldi r21, 0x02 ; 2 1bc1c: c1 30 cpi r28, 0x01 ; 1 1bc1e: d1 05 cpc r29, r1 1bc20: 31 f0 breq .+12 ; 0x1bc2e if (_err_endstop == 2) _error_2 = "Z"; 1bc22: 4c ec ldi r20, 0xCC ; 204 1bc24: 52 e0 ldi r21, 0x02 ; 2 1bc26: 22 97 sbiw r28, 0x02 ; 2 1bc28: 11 f0 breq .+4 ; 0x1bc2e 1bc2a: 48 ec ldi r20, 0xC8 ; 200 1bc2c: 52 e0 ldi r21, 0x02 ; 2 if (_travel_done >= _travel) { lcd_selftest_error(TestError::Endstop, _error_1, _error_2); 1bc2e: 84 e0 ldi r24, 0x04 ; 4 if (_err_endstop == 0) _error_2 = "X"; if (_err_endstop == 1) _error_2 = "Y"; if (_err_endstop == 2) _error_2 = "Z"; if (_travel_done >= _travel) 1bc30: c6 14 cp r12, r6 1bc32: d7 04 cpc r13, r7 1bc34: 0c f4 brge .+2 ; 0x1bc38 { lcd_selftest_error(TestError::Endstop, _error_1, _error_2); } else { lcd_selftest_error(TestError::Motor, _error_1, _error_2); 1bc36: 83 e0 ldi r24, 0x03 ; 3 1bc38: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 } } current_position[_axis] = 0; //simulate axis home to avoid negative numbers for axis position, especially Z. 1bc3c: f5 01 movw r30, r10 1bc3e: ef 59 subi r30, 0x9F ; 159 1bc40: fd 4e sbci r31, 0xED ; 237 1bc42: 10 82 st Z, r1 1bc44: 11 82 std Z+1, r1 ; 0x01 1bc46: 12 82 std Z+2, r1 ; 0x02 1bc48: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 1bc4a: 0f 94 41 4b call 0x29682 ; 0x29682 return _stepresult; } 1bc4e: 85 2d mov r24, r5 1bc50: df 91 pop r29 1bc52: cf 91 pop r28 1bc54: 1f 91 pop r17 1bc56: 0f 91 pop r16 1bc58: ff 90 pop r15 1bc5a: ef 90 pop r14 1bc5c: df 90 pop r13 1bc5e: cf 90 pop r12 1bc60: bf 90 pop r11 1bc62: af 90 pop r10 1bc64: 9f 90 pop r9 1bc66: 8f 90 pop r8 1bc68: 7f 90 pop r7 1bc6a: 6f 90 pop r6 1bc6c: 5f 90 pop r5 1bc6e: 4f 90 pop r4 1bc70: 3f 90 pop r3 1bc72: 2f 90 pop r2 1bc74: 08 95 ret { _lcd_refresh++; } else { _progress = lcd_selftest_screen(static_cast(static_cast(TestScreen::AxisX) + _axis), _progress, 3, false, 0); 1bc76: 10 e0 ldi r17, 0x00 ; 0 1bc78: 00 e0 ldi r16, 0x00 ; 0 1bc7a: 20 e0 ldi r18, 0x00 ; 0 1bc7c: 43 e0 ldi r20, 0x03 ; 3 1bc7e: 63 2d mov r22, r3 1bc80: 82 2d mov r24, r2 1bc82: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1bc86: 38 2e mov r3, r24 1bc88: a9 cf rjmp .-174 ; 0x1bbdc (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING)) { if (_axis == 0) { _stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false; _err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2; 1bc8a: c1 e0 ldi r28, 0x01 ; 1 1bc8c: d0 e0 ldi r29, 0x00 ; 0 1bc8e: 71 cf rjmp .-286 ; 0x1bb72 0001bc90 : return 0; } bool resume_print_checks() { // reset the lcd status so that a newer error will be shown lcd_return_to_status(); 1bc90: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1bc94: 10 92 c0 03 sts 0x03C0, r1 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> 1bc98: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> lcd_reset_alert_level(); // ensure thermal issues (temp or fan) are resolved before we allow to resume if (get_temp_error() #ifdef FANCHECK || fan_error_selftest() 1bc9c: 81 11 cpse r24, r1 1bc9e: 39 c0 rjmp .+114 ; 0x1bd12 } static bool fan_error_selftest() { #ifdef FANCHECK if (!fans_check_enabled) return 0; 1bca0: 80 91 40 02 lds r24, 0x0240 ; 0x800240 1bca4: 81 11 cpse r24, r1 1bca6: 02 c0 rjmp .+4 ; 0x1bcac #endif ) { return false; // abort if error persists } return true; 1bca8: 81 e0 ldi r24, 0x01 ; 1 1bcaa: 08 95 ret } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 1bcac: 8f ef ldi r24, 0xFF ; 255 1bcae: 80 93 55 12 sts 0x1255, r24 ; 0x801255 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 1bcb2: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d #endif manage_heater(); 1bcb6: 0f 94 1c 3a call 0x27438 ; 0x27438 { #ifdef FANCHECK if (!fans_check_enabled) return 0; lcd_selftest_setfan(255); setExtruderAutoFanState(3); //force enables the hotend fan 1bcba: 83 e0 ldi r24, 0x03 ; 3 1bcbc: 0e 94 af 77 call 0xef5e ; 0xef5e #ifdef FAN_SOFT_PWM extruder_autofan_last_check = _millis(); 1bcc0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1bcc4: 60 93 07 17 sts 0x1707, r22 ; 0x801707 1bcc8: 70 93 08 17 sts 0x1708, r23 ; 0x801708 1bccc: 80 93 09 17 sts 0x1709, r24 ; 0x801709 1bcd0: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a fan_measuring = true; 1bcd4: 81 e0 ldi r24, 0x01 ; 1 1bcd6: 80 93 b6 03 sts 0x03B6, r24 ; 0x8003b6 #endif //FAN_SOFT_PWM _delay(1000); //delay_keep_alive would turn off hotend fan, because temerature is too low (maybe) 1bcda: 68 ee ldi r22, 0xE8 ; 232 1bcdc: 73 e0 ldi r23, 0x03 ; 3 1bcde: 80 e0 ldi r24, 0x00 ; 0 1bce0: 90 e0 ldi r25, 0x00 ; 0 1bce2: 0f 94 bd 0d call 0x21b7a ; 0x21b7a manage_heater(); 1bce6: 0f 94 1c 3a call 0x27438 ; 0x27438 setExtruderAutoFanState(1); //releases lock on the hotend fan 1bcea: 81 e0 ldi r24, 0x01 ; 1 1bcec: 0e 94 af 77 call 0xef5e ; 0xef5e } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 1bcf0: 10 92 55 12 sts 0x1255, r1 ; 0x801255 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 1bcf4: 10 92 1d 06 sts 0x061D, r1 ; 0x80061d #endif manage_heater(); 1bcf8: 0f 94 1c 3a call 0x27438 ; 0x27438 _delay(1000); //delay_keep_alive would turn off hotend fan, because temerature is too low (maybe) manage_heater(); setExtruderAutoFanState(1); //releases lock on the hotend fan lcd_selftest_setfan(0); #ifdef TACH_0 if (fan_speed[0] <= 20) { //hotend fan error 1bcfc: 80 91 b7 03 lds r24, 0x03B7 ; 0x8003b7 1bd00: 90 91 b8 03 lds r25, 0x03B8 ; 0x8003b8 1bd04: 45 97 sbiw r24, 0x15 ; 21 1bd06: 84 f6 brge .-96 ; 0x1bca8 LCD_ALERTMESSAGERPGM(MSG_FANCHECK_HOTEND); 1bd08: 62 e0 ldi r22, 0x02 ; 2 1bd0a: 86 e2 ldi r24, 0x26 ; 38 1bd0c: 98 e6 ldi r25, 0x68 ; 104 1bd0e: 0e 94 2c da call 0x1b458 ; 0x1b458 if (get_temp_error() #ifdef FANCHECK || fan_error_selftest() #endif ) { return false; // abort if error persists 1bd12: 80 e0 ldi r24, 0x00 ; 0 } return true; } 1bd14: 08 95 ret 0001bd16 : //! @brief Resume paused USB/host print, send host action "resume" void lcd_resume_usb_print() { // reset lcd and ensure we can resume first if (!resume_print_checks()) return; 1bd16: 0e 94 48 de call 0x1bc90 ; 0x1bc90 1bd1a: 88 23 and r24, r24 1bd1c: 21 f0 breq .+8 ; 0x1bd26 // resume the usb host SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_RESUME); 1bd1e: 8c e4 ldi r24, 0x4C ; 76 1bd20: 98 e6 ldi r25, 0x68 ; 104 1bd22: 0c 94 bd 7c jmp 0xf97a ; 0xf97a } 1bd26: 08 95 ret 0001bd28 : void lcd_getstatus(char buf[LCD_WIDTH]) { strncpy(buf, lcd_status_message, LCD_WIDTH); } void lcd_setstatuspgm(const char* message) { 1bd28: cf 93 push r28 1bd2a: df 93 push r29 1bd2c: ec 01 movw r28, r24 if (lcd_message_check(LCD_STATUS_NONE)) 1bd2e: 80 e0 ldi r24, 0x00 ; 0 1bd30: 0e 94 16 da call 0x1b42c ; 0x1b42c 1bd34: 88 23 and r24, r24 1bd36: 31 f0 breq .+12 ; 0x1bd44 lcd_updatestatus(message, true); 1bd38: 61 e0 ldi r22, 0x01 ; 1 1bd3a: ce 01 movw r24, r28 } 1bd3c: df 91 pop r29 1bd3e: cf 91 pop r28 } void lcd_setstatuspgm(const char* message) { if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message, true); 1bd40: 0c 94 fb d9 jmp 0x1b3f6 ; 0x1b3f6 } 1bd44: df 91 pop r29 1bd46: cf 91 pop r28 1bd48: 08 95 ret 0001bd4a : } #endif /* DEBUG_STEPPER_TIMER_MISSED */ static void lcd_colorprint_change() { enquecommand_P(MSG_M600); 1bd4a: 61 e0 ldi r22, 0x01 ; 1 1bd4c: 8e e5 ldi r24, 0x5E ; 94 1bd4e: 9c e6 ldi r25, 0x6C ; 108 1bd50: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 custom_message_type = CustomMsg::FilamentLoading; //just print status message 1bd54: 82 e0 ldi r24, 0x02 ; 2 1bd56: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); 1bd5a: 86 e0 ldi r24, 0x06 ; 6 1bd5c: 9a e5 ldi r25, 0x5A ; 90 1bd5e: 0e 94 3a 75 call 0xea74 ; 0xea74 1bd62: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_return_to_status(); 1bd66: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_draw_update = 3; 1bd6a: 83 e0 ldi r24, 0x03 ; 3 1bd6c: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } 1bd70: 08 95 ret 0001bd72 : //! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(), //! as restore_print_from_ram_and_continue() calls lcd_update() internally. void lcd_resume_print() { // reset lcd and ensure we can resume first if (!resume_print_checks()) return; 1bd72: 0e 94 48 de call 0x1bc90 ; 0x1bc90 1bd76: 88 23 and r24, r24 1bd78: 51 f1 breq .+84 ; 0x1bdce cmdqueue_serial_disabled = false; 1bd7a: 10 92 93 03 sts 0x0393, r1 ; 0x800393 lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); 1bd7e: 86 e0 ldi r24, 0x06 ; 6 1bd80: 9a e5 ldi r25, 0x5A ; 90 1bd82: 0e 94 3a 75 call 0xea74 ; 0xea74 1bd86: 0e 94 94 de call 0x1bd28 ; 0x1bd28 st_synchronize(); 1bd8a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 custom_message_type = CustomMsg::Resuming; 1bd8e: 88 e0 ldi r24, 0x08 ; 8 1bd90: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d { #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) #ifdef EXTRUDER_ALTFAN_DETECT altfanStatus.altfanOverride = eeprom_read_byte((uint8_t*)EEPROM_ALTFAN_OVERRIDE); #endif resetFanCheck(); 1bd94: 0e 94 a2 77 call 0xef44 ; 0xef44 setExtruderAutoFanState(1); 1bd98: 81 e0 ldi r24, 0x01 ; 1 1bd9a: 0e 94 af 77 call 0xef5e ; 0xef5e // resume processing USB commands again and restore hotend fan state (in case the print was // stopped due to a thermal error) hotendDefaultAutoFanState(); Stopped = false; 1bd9e: 10 92 3b 12 sts 0x123B, r1 ; 0x80123b restore_print_from_ram_and_continue(default_retraction); 1bda2: 60 e0 ldi r22, 0x00 ; 0 1bda4: 70 e0 ldi r23, 0x00 ; 0 1bda6: 80 e8 ldi r24, 0x80 ; 128 1bda8: 9f e3 ldi r25, 0x3F ; 63 1bdaa: 0e 94 b8 66 call 0xcd70 ; 0xcd70 did_pause_print = false; 1bdae: 10 92 cd 03 sts 0x03CD, r1 ; 0x8003cd // Resume the print job timer if it was running if (print_job_timer.isPaused()) print_job_timer.start(); 1bdb2: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 1bdb6: 82 30 cpi r24, 0x02 ; 2 1bdb8: 11 f4 brne .+4 ; 0x1bdbe 1bdba: 0f 94 25 19 call 0x2324a ; 0x2324a refresh_cmd_timeout(); 1bdbe: 0e 94 41 65 call 0xca82 ; 0xca82 SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_RESUMED); 1bdc2: 8b e3 ldi r24, 0x3B ; 59 1bdc4: 98 e6 ldi r25, 0x68 ; 104 1bdc6: 0e 94 bd 7c call 0xf97a ; 0xf97a custom_message_type = CustomMsg::Status; 1bdca: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d } 1bdce: 08 95 ret 0001bdd0 : // hack lcd_draw_update to 1, i.e. without clear lcd_draw_update = 1; } void lcd_setstatus(const char* message) { 1bdd0: cf 93 push r28 1bdd2: df 93 push r29 1bdd4: ec 01 movw r28, r24 if (lcd_message_check(LCD_STATUS_NONE)) 1bdd6: 80 e0 ldi r24, 0x00 ; 0 1bdd8: 0e 94 16 da call 0x1b42c ; 0x1b42c 1bddc: 88 23 and r24, r24 1bdde: 31 f0 breq .+12 ; 0x1bdec lcd_updatestatus(message); 1bde0: 60 e0 ldi r22, 0x00 ; 0 1bde2: ce 01 movw r24, r28 } 1bde4: df 91 pop r29 1bde6: cf 91 pop r28 } void lcd_setstatus(const char* message) { if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message); 1bde8: 0c 94 fb d9 jmp 0x1b3f6 ; 0x1b3f6 } 1bdec: df 91 pop r29 1bdee: cf 91 pop r28 1bdf0: 08 95 ret 0001bdf2 : axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative did_pause_print = false; // Clear pause state in case the print was aborted while paused } void print_stop(bool interactive, bool unconditional_stop) { 1bdf2: cf 93 push r28 1bdf4: df 93 push r29 1bdf6: c8 2f mov r28, r24 softReset(); } void UnconditionalStop() { CRITICAL_SECTION_START; 1bdf8: df b7 in r29, 0x3f ; 63 // UnconditionalStop() will internally cause planner_abort_hard(), meaning we _cannot_ plan any // more move in this call! Any further move must happen inside lcd_print_stop_finish(), which is // called by the main loop one iteration later. if (unconditional_stop) { 1bdfa: 66 23 and r22, r22 1bdfc: 89 f1 breq .+98 ; 0x1be60 1bdfe: f8 94 cli // Disable all heaters and unroll the temperature wait loop stack disable_heater(); 1be00: 0f 94 05 11 call 0x2220a ; 0x2220a cancel_heatup = true; 1be04: 81 e0 ldi r24, 0x01 ; 1 1be06: 80 93 5f 0d sts 0x0D5F, r24 ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> heating_status = HeatingStatus::NO_HEATING; 1be0a: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb // Clear any saved printing state cancel_saved_printing(); 1be0e: 0e 94 07 64 call 0xc80e ; 0xc80e // Abort the planner planner_abort_hard(); 1be12: 0f 94 fb 4e call 0x29df6 ; 0x29df6 // Reset the queue cmdqueue_reset(); 1be16: 0e 94 3c 85 call 0x10a78 ; 0x10a78 cmdqueue_serial_disabled = false; 1be1a: 10 92 93 03 sts 0x0393, r1 ; 0x800393 st_reset_timer(); 1be1e: 0f 94 4c 1b call 0x23698 ; 0x23698 CRITICAL_SECTION_END; 1be22: df bf out 0x3f, r29 ; 63 // clear paused state immediately did_pause_print = false; 1be24: 10 92 cd 03 sts 0x03CD, r1 ; 0x8003cd print_job_timer.stop(); 1be28: 0f 94 49 19 call 0x23292 ; 0x23292 } else { // Allow lcd_print_stop_finish() to use the heaters when it is safe ConditionalStop(); } if (card.isFileOpen()) { 1be2c: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 1be30: 88 23 and r24, r24 1be32: 21 f0 breq .+8 ; 0x1be3c // Reset the sd status card.sdprinting = false; 1be34: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 card.closefile(); 1be38: 0f 94 f9 65 call 0x2cbf2 ; 0x2cbf2 } SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_CANCEL); 1be3c: 8e e7 ldi r24, 0x7E ; 126 1be3e: 98 e6 ldi r25, 0x68 ; 104 1be40: 0e 94 bd 7c call 0xf97a ; 0xf97a #ifdef MESH_BED_LEVELING mbl.active = false; 1be44: 10 92 09 13 sts 0x1309, r1 ; 0x801309 #endif if (interactive) { 1be48: c1 11 cpse r28, r1 // acknowledged by the user from the LCD: resume processing USB commands again Stopped = false; 1be4a: 10 92 3b 12 sts 0x123B, r1 ; 0x80123b } // return to status is required to continue processing in the main loop! lcd_commands_type = LcdCommands::StopPrint; 1be4e: 81 e0 ldi r24, 0x01 ; 1 1be50: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e } PrinterState SetPrinterState(PrinterState status) { return printer_state = status; 1be54: 10 92 61 0d sts 0x0D61, r1 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::NotReady); //set printer state to show LCD menu after print has been stopped lcd_return_to_status(); } 1be58: df 91 pop r29 1be5a: cf 91 pop r28 } // return to status is required to continue processing in the main loop! lcd_commands_type = LcdCommands::StopPrint; SetPrinterState(PrinterState::NotReady); //set printer state to show LCD menu after print has been stopped lcd_return_to_status(); 1be5c: 0d 94 d5 07 jmp 0x20faa ; 0x20faa } void ConditionalStop() { CRITICAL_SECTION_START; 1be60: f8 94 cli // // However, the firmware must take into account the edge case when the firmware // is running M109 or M190 G-codes. These G-codes execute a blocking while loop // which waits for the bed or nozzle to reach their target temperature. // To exit the loop, the firmware must set cancel_heatup to true. cancel_heatup = true; 1be62: 81 e0 ldi r24, 0x01 ; 1 1be64: 80 93 5f 0d sts 0x0D5F, r24 ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> heating_status = HeatingStatus::NO_HEATING; 1be68: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb // Clear any saved printing state cancel_saved_printing(); 1be6c: 0e 94 07 64 call 0xc80e ; 0xc80e // Abort the planner planner_abort_hard(); 1be70: 0f 94 fb 4e call 0x29df6 ; 0x29df6 // Reset the queue cmdqueue_reset(); 1be74: 0e 94 3c 85 call 0x10a78 ; 0x10a78 cmdqueue_serial_disabled = false; 1be78: 10 92 93 03 sts 0x0393, r1 ; 0x800393 st_reset_timer(); 1be7c: 0f 94 4c 1b call 0x23698 ; 0x23698 CRITICAL_SECTION_END; 1be80: df bf out 0x3f, r29 ; 63 1be82: d4 cf rjmp .-88 ; 0x1be2c 0001be84 : } void lcd_print_stop() { print_stop(true); 1be84: 60 e0 ldi r22, 0x00 ; 0 1be86: 81 e0 ldi r24, 0x01 ; 1 1be88: 0c 94 f9 de jmp 0x1bdf2 ; 0x1bdf2 0001be8c : lcd_update(2); } #ifndef TMC2130 static void lcd_show_end_stops() { lcd_puts_at_P(0, 0, (PSTR("End stops diag"))); 1be8c: 42 e2 ldi r20, 0x22 ; 34 1be8e: 53 e8 ldi r21, 0x83 ; 131 1be90: 60 e0 ldi r22, 0x00 ; 0 1be92: 80 e0 ldi r24, 0x00 ; 0 1be94: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 1, (READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ? (PSTR("X1")) : (PSTR("X0"))); 1be98: 1e 99 sbic 0x03, 6 ; 3 1be9a: 16 c0 rjmp .+44 ; 0x1bec8 1be9c: 4c e1 ldi r20, 0x1C ; 28 1be9e: 53 e8 ldi r21, 0x83 ; 131 1bea0: 61 e0 ldi r22, 0x01 ; 1 1bea2: 80 e0 ldi r24, 0x00 ; 0 1bea4: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 2, (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ? (PSTR("Y1")) : (PSTR("Y0"))); 1bea8: 1d 9b sbis 0x03, 5 ; 3 1beaa: 11 c0 rjmp .+34 ; 0x1bece 1beac: 49 e1 ldi r20, 0x19 ; 25 1beae: 53 e8 ldi r21, 0x83 ; 131 1beb0: 62 e0 ldi r22, 0x02 ; 2 1beb2: 80 e0 ldi r24, 0x00 ; 0 1beb4: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 3, (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING) ? (PSTR("Z1")) : (PSTR("Z0"))); 1beb8: 1c 9b sbis 0x03, 4 ; 3 1beba: 0c c0 rjmp .+24 ; 0x1bed4 1bebc: 43 e1 ldi r20, 0x13 ; 19 1bebe: 53 e8 ldi r21, 0x83 ; 131 1bec0: 63 e0 ldi r22, 0x03 ; 3 1bec2: 80 e0 ldi r24, 0x00 ; 0 1bec4: 0c 94 07 70 jmp 0xe00e ; 0xe00e } #ifndef TMC2130 static void lcd_show_end_stops() { lcd_puts_at_P(0, 0, (PSTR("End stops diag"))); lcd_puts_at_P(0, 1, (READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ? (PSTR("X1")) : (PSTR("X0"))); 1bec8: 4f e1 ldi r20, 0x1F ; 31 1beca: 53 e8 ldi r21, 0x83 ; 131 1becc: e9 cf rjmp .-46 ; 0x1bea0 lcd_puts_at_P(0, 2, (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ? (PSTR("Y1")) : (PSTR("Y0"))); 1bece: 46 e1 ldi r20, 0x16 ; 22 1bed0: 53 e8 ldi r21, 0x83 ; 131 1bed2: ee cf rjmp .-36 ; 0x1beb0 lcd_puts_at_P(0, 3, (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING) ? (PSTR("Z1")) : (PSTR("Z0"))); 1bed4: 40 e1 ldi r20, 0x10 ; 16 1bed6: 53 e8 ldi r21, 0x83 ; 131 1bed8: f3 cf rjmp .-26 ; 0x1bec0 0001beda : } static void menu_show_end_stops() { lcd_show_end_stops(); 1beda: 0e 94 46 df call 0x1be8c ; 0x1be8c menu_back_if_clicked(); 1bede: 0c 94 06 74 jmp 0xe80c ; 0xe80c 0001bee2 : //! @param first_choice text caption of first possible choice //! @param second_choice text caption of second possible choice //! @param second_col column on LCD where second choice is rendered. //! @param third_choice text caption of third, optional, choice. void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice) { 1bee2: cf 92 push r12 1bee4: df 92 push r13 1bee6: ef 92 push r14 1bee8: ff 92 push r15 1beea: 0f 93 push r16 1beec: 1f 93 push r17 1beee: cf 93 push r28 1bef0: df 93 push r29 1bef2: d8 2f mov r29, r24 1bef4: 6b 01 movw r12, r22 1bef6: 7a 01 movw r14, r20 1bef8: c2 2f mov r28, r18 lcd_putc_at(0, 3, selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' '); 1befa: 40 e2 ldi r20, 0x20 ; 32 1befc: 81 11 cpse r24, r1 1befe: 01 c0 rjmp .+2 ; 0x1bf02 1bf00: 4e e3 ldi r20, 0x3E ; 62 1bf02: 63 e0 ldi r22, 0x03 ; 3 1bf04: 80 e0 ldi r24, 0x00 ; 0 1bf06: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_puts_P(first_choice); 1bf0a: c6 01 movw r24, r12 1bf0c: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_putc_at(second_col, 3, selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 1bf10: 40 e2 ldi r20, 0x20 ; 32 1bf12: d1 30 cpi r29, 0x01 ; 1 1bf14: 09 f4 brne .+2 ; 0x1bf18 1bf16: 4e e3 ldi r20, 0x3E ; 62 1bf18: 63 e0 ldi r22, 0x03 ; 3 1bf1a: 8c 2f mov r24, r28 1bf1c: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_puts_P(second_choice); 1bf20: c7 01 movw r24, r14 1bf22: 0e 94 1d 6f call 0xde3a ; 0xde3a if (third_choice) { 1bf26: 01 15 cp r16, r1 1bf28: 11 05 cpc r17, r1 1bf2a: 19 f1 breq .+70 ; 0x1bf72 1bf2c: c8 01 movw r24, r16 1bf2e: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> 1bf32: d8 2e mov r13, r24 1bf34: c7 01 movw r24, r14 1bf36: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> ////get size of third_choice, offset to the left. Make sure it doesn't overlap second_choice. size_t third_choice_len = strlen_P(third_choice); uint8_t second_col_end = second_col + strlen_P(second_choice) + 2; 1bf3a: ce 5f subi r28, 0xFE ; 254 uint8_t third_col; if (uint8_t pos = 19 - third_choice_len; pos > second_col_end) {third_col = pos;} else {third_col = second_col_end;} 1bf3c: 93 e1 ldi r25, 0x13 ; 19 1bf3e: 9d 19 sub r25, r13 1bf40: 8c 0f add r24, r28 1bf42: 89 17 cp r24, r25 1bf44: 08 f4 brcc .+2 ; 0x1bf48 1bf46: 89 2f mov r24, r25 1bf48: 83 31 cpi r24, 0x13 ; 19 1bf4a: 08 f0 brcs .+2 ; 0x1bf4e 1bf4c: 82 e1 ldi r24, 0x12 ; 18 if (third_col > 18) {third_col = 18;} //backwards compatability - make sure at least one character of the third selection is shown lcd_putc_at(third_col, 3, selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' '); 1bf4e: 40 e2 ldi r20, 0x20 ; 32 1bf50: d2 30 cpi r29, 0x02 ; 2 1bf52: 09 f4 brne .+2 ; 0x1bf56 1bf54: 4e e3 ldi r20, 0x3E ; 62 1bf56: 63 e0 ldi r22, 0x03 ; 3 1bf58: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_puts_P(third_choice); 1bf5c: c8 01 movw r24, r16 } } 1bf5e: df 91 pop r29 1bf60: cf 91 pop r28 1bf62: 1f 91 pop r17 1bf64: 0f 91 pop r16 1bf66: ff 90 pop r15 1bf68: ef 90 pop r14 1bf6a: df 90 pop r13 1bf6c: cf 90 pop r12 uint8_t second_col_end = second_col + strlen_P(second_choice) + 2; uint8_t third_col; if (uint8_t pos = 19 - third_choice_len; pos > second_col_end) {third_col = pos;} else {third_col = second_col_end;} if (third_col > 18) {third_col = 18;} //backwards compatability - make sure at least one character of the third selection is shown lcd_putc_at(third_col, 3, selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' '); lcd_puts_P(third_choice); 1bf6e: 0c 94 1d 6f jmp 0xde3a ; 0xde3a } } 1bf72: df 91 pop r29 1bf74: cf 91 pop r28 1bf76: 1f 91 pop r17 1bf78: 0f 91 pop r16 1bf7a: ff 90 pop r15 1bf7c: ef 90 pop r14 1bf7e: df 90 pop r13 1bf80: cf 90 pop r12 1bf82: 08 95 ret 0001bf84 : } bool lcd_wait_for_click_delay(uint16_t nDelay) // nDelay :: timeout [s] (0 ~ no timeout) // true ~ clicked, false ~ delayed { 1bf84: 4f 92 push r4 1bf86: 5f 92 push r5 1bf88: 6f 92 push r6 1bf8a: 7f 92 push r7 1bf8c: 8f 92 push r8 1bf8e: 9f 92 push r9 1bf90: af 92 push r10 1bf92: bf 92 push r11 1bf94: cf 92 push r12 1bf96: df 92 push r13 1bf98: ef 92 push r14 1bf9a: ff 92 push r15 1bf9c: 0f 93 push r16 1bf9e: 1f 93 push r17 1bfa0: cf 93 push r28 1bfa2: 8c 01 movw r16, r24 bool bDelayed; long nTime0 = _millis()/1000; 1bfa4: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1bfa8: 28 ee ldi r18, 0xE8 ; 232 1bfaa: 33 e0 ldi r19, 0x03 ; 3 1bfac: 40 e0 ldi r20, 0x00 ; 0 1bfae: 50 e0 ldi r21, 0x00 ; 0 1bfb0: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 1bfb4: 69 01 movw r12, r18 1bfb6: 7a 01 movw r14, r20 lcd_consume_click(); 1bfb8: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 KEEPALIVE_STATE(PAUSED_FOR_USER); 1bfbc: 84 e0 ldi r24, 0x04 ; 4 1bfbe: 80 93 78 02 sts 0x0278, r24 ; 0x800278 for (;;) { manage_heater(); manage_inactivity(true); bDelayed = ((_millis()/1000-nTime0) > nDelay); 1bfc2: 88 ee ldi r24, 0xE8 ; 232 1bfc4: 88 2e mov r8, r24 1bfc6: 83 e0 ldi r24, 0x03 ; 3 1bfc8: 98 2e mov r9, r24 1bfca: a1 2c mov r10, r1 1bfcc: b1 2c mov r11, r1 1bfce: 28 01 movw r4, r16 1bfd0: 71 2c mov r7, r1 1bfd2: 61 2c mov r6, r1 bool bDelayed; long nTime0 = _millis()/1000; lcd_consume_click(); KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { manage_heater(); 1bfd4: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1bfd8: 81 e0 ldi r24, 0x01 ; 1 1bfda: 0e 94 34 8c call 0x11868 ; 0x11868 bDelayed = ((_millis()/1000-nTime0) > nDelay); 1bfde: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1bfe2: a5 01 movw r20, r10 1bfe4: 94 01 movw r18, r8 1bfe6: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 1bfea: 2c 19 sub r18, r12 1bfec: 3d 09 sbc r19, r13 1bfee: 4e 09 sbc r20, r14 1bff0: 5f 09 sbc r21, r15 bDelayed = (bDelayed && (nDelay != 0)); // 0 ~ no timeout, always waiting for click 1bff2: 42 16 cp r4, r18 1bff4: 53 06 cpc r5, r19 1bff6: 64 06 cpc r6, r20 1bff8: 75 06 cpc r7, r21 1bffa: 20 f4 brcc .+8 ; 0x1c004 1bffc: c1 e0 ldi r28, 0x01 ; 1 1bffe: 01 15 cp r16, r1 1c000: 11 05 cpc r17, r1 1c002: 09 f4 brne .+2 ; 0x1c006 1c004: c0 e0 ldi r28, 0x00 ; 0 if (lcd_clicked() || bDelayed) { 1c006: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1c00a: 81 11 cpse r24, r1 1c00c: 02 c0 rjmp .+4 ; 0x1c012 1c00e: cc 23 and r28, r28 1c010: 09 f3 breq .-62 ; 0x1bfd4 KEEPALIVE_STATE(IN_HANDLER); 1c012: 82 e0 ldi r24, 0x02 ; 2 1c014: 80 93 78 02 sts 0x0278, r24 ; 0x800278 return(!bDelayed); } } } 1c018: 81 e0 ldi r24, 0x01 ; 1 1c01a: 8c 27 eor r24, r28 1c01c: cf 91 pop r28 1c01e: 1f 91 pop r17 1c020: 0f 91 pop r16 1c022: ff 90 pop r15 1c024: ef 90 pop r14 1c026: df 90 pop r13 1c028: cf 90 pop r12 1c02a: bf 90 pop r11 1c02c: af 90 pop r10 1c02e: 9f 90 pop r9 1c030: 8f 90 pop r8 1c032: 7f 90 pop r7 1c034: 6f 90 pop r6 1c036: 5f 90 pop r5 1c038: 4f 90 pop r4 1c03a: 08 95 ret 0001c03c : * This function is non-blocking * @param msg message to be displayed from PROGMEM * @return rest of the text (to be displayed on next page) */ static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg) { 1c03c: af 92 push r10 1c03e: bf 92 push r11 1c040: cf 92 push r12 1c042: df 92 push r13 1c044: ef 92 push r14 1c046: ff 92 push r15 1c048: 0f 93 push r16 1c04a: 1f 93 push r17 1c04c: cf 93 push r28 1c04e: df 93 push r29 1c050: 6c 01 movw r12, r24 const char *msgend = msg; bool multi_screen = false; lcd_frame_start(); 1c052: 0e 94 e6 6e call 0xddcc ; 0xddcc * @param msg message to be displayed from PROGMEM * @return rest of the text (to be displayed on next page) */ static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg) { const char *msgend = msg; 1c056: e6 01 movw r28, r12 bool multi_screen = false; lcd_frame_start(); for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) { 1c058: f1 2c mov r15, r1 * @return rest of the text (to be displayed on next page) */ static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg) { const char *msgend = msg; bool multi_screen = false; 1c05a: e1 2c mov r14, r1 lcd_frame_start(); for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) { lcd_set_cursor(0, row); 1c05c: 6f 2d mov r22, r15 1c05e: 80 e0 ldi r24, 0x00 ; 0 1c060: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 // Previous row ended with a complete word, so the first character in the // next row is a whitespace. We can skip the whitespace on a new line. if (pgm_is_whitespace(msg) && ++msg == nullptr) 1c064: c6 01 movw r24, r12 1c066: 0e 94 fa bd call 0x17bf4 ; 0x17bf4 1c06a: 88 23 and r24, r24 1c06c: 29 f0 breq .+10 ; 0x1c078 1c06e: 8f ef ldi r24, 0xFF ; 255 1c070: c8 1a sub r12, r24 1c072: d8 0a sbc r13, r24 1c074: 09 f4 brne .+2 ; 0x1c078 1c076: 49 c0 rjmp .+146 ; 0x1c10a 1c078: c6 01 movw r24, r12 1c07a: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> { // End of the message. break; } uint8_t linelen = min(strlen_P(msg), LCD_WIDTH); 1c07e: 84 31 cpi r24, 0x14 ; 20 1c080: 91 05 cpc r25, r1 1c082: 10 f0 brcs .+4 ; 0x1c088 1c084: 84 e1 ldi r24, 0x14 ; 20 1c086: 90 e0 ldi r25, 0x00 ; 0 const char *msgend2 = msg + linelen; 1c088: e6 01 movw r28, r12 1c08a: c8 0f add r28, r24 1c08c: d9 1f adc r29, r25 msgend = msgend2; if (row == 3 && linelen == LCD_WIDTH) { 1c08e: e3 e0 ldi r30, 0x03 ; 3 1c090: fe 12 cpse r15, r30 1c092: 0a c0 rjmp .+20 ; 0x1c0a8 1c094: 84 31 cpi r24, 0x14 ; 20 1c096: 41 f4 brne .+16 ; 0x1c0a8 // Last line of the display, full line shall be displayed. // Find out, whether this message will be split into multiple screens. multi_screen = pgm_read_byte(msgend) != 0; 1c098: fe 01 movw r30, r28 1c09a: 84 91 lpm r24, Z 1c09c: e1 2c mov r14, r1 if (multi_screen) 1c09e: 88 23 and r24, r24 1c0a0: 19 f0 breq .+6 ; 0x1c0a8 msgend = (msgend2 -= 2); 1c0a2: 22 97 sbiw r28, 0x02 ; 2 const char *msgend2 = msg + linelen; msgend = msgend2; if (row == 3 && linelen == LCD_WIDTH) { // Last line of the display, full line shall be displayed. // Find out, whether this message will be split into multiple screens. multi_screen = pgm_read_byte(msgend) != 0; 1c0a4: ee 24 eor r14, r14 1c0a6: e3 94 inc r14 if (multi_screen) msgend = (msgend2 -= 2); } if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) { 1c0a8: fe 01 movw r30, r28 1c0aa: 84 91 lpm r24, Z 1c0ac: 88 23 and r24, r24 1c0ae: 09 f4 brne .+2 ; 0x1c0b2 1c0b0: 40 c0 rjmp .+128 ; 0x1c132 1c0b2: ce 01 movw r24, r28 1c0b4: 0e 94 fa bd call 0x17bf4 ; 0x17bf4 1c0b8: 81 11 cpse r24, r1 1c0ba: 3b c0 rjmp .+118 ; 0x1c132 return c == ' ' || c == '\t' || c == '\r' || c == '\n'; } static inline bool pgm_is_interpunction(const char *c_addr) { const char c = pgm_read_byte(c_addr); 1c0bc: fe 01 movw r30, r28 1c0be: 84 91 lpm r24, Z return c == '.' || c == ',' || c == ':'|| c == ';' || c == '?' || c == '!' || c == '/'; 1c0c0: 92 ed ldi r25, 0xD2 ; 210 1c0c2: 98 0f add r25, r24 1c0c4: 92 30 cpi r25, 0x02 ; 2 1c0c6: a8 f1 brcs .+106 ; 0x1c132 1c0c8: 8c 32 cpi r24, 0x2C ; 44 1c0ca: 99 f1 breq .+102 ; 0x1c132 1c0cc: 96 ec ldi r25, 0xC6 ; 198 1c0ce: 98 0f add r25, r24 1c0d0: 92 30 cpi r25, 0x02 ; 2 1c0d2: 78 f1 brcs .+94 ; 0x1c132 1c0d4: 8f 33 cpi r24, 0x3F ; 63 1c0d6: 69 f1 breq .+90 ; 0x1c132 1c0d8: 81 32 cpi r24, 0x21 ; 33 1c0da: 59 f1 breq .+86 ; 0x1c132 1c0dc: 8e 01 movw r16, r28 if (multi_screen) msgend = (msgend2 -= 2); } if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) { // Splitting a word. Find the start of the current word. while (msgend > msg && ! pgm_is_whitespace(msgend - 1)) 1c0de: c0 16 cp r12, r16 1c0e0: d1 06 cpc r13, r17 1c0e2: 58 f4 brcc .+22 ; 0x1c0fa 1c0e4: 58 01 movw r10, r16 1c0e6: f1 e0 ldi r31, 0x01 ; 1 1c0e8: af 1a sub r10, r31 1c0ea: b1 08 sbc r11, r1 1c0ec: c5 01 movw r24, r10 1c0ee: 0e 94 fa bd call 0x17bf4 ; 0x17bf4 1c0f2: 81 11 cpse r24, r1 1c0f4: 1d c0 rjmp .+58 ; 0x1c130 -- msgend; 1c0f6: 85 01 movw r16, r10 1c0f8: f2 cf rjmp .-28 ; 0x1c0de if (msgend == msg) 1c0fa: c0 16 cp r12, r16 1c0fc: d1 06 cpc r13, r17 1c0fe: c9 f0 breq .+50 ; 0x1c132 1c100: e8 01 movw r28, r16 static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg) { const char *msgend = msg; bool multi_screen = false; lcd_frame_start(); for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) { 1c102: f3 94 inc r15 1c104: 84 e0 ldi r24, 0x04 ; 4 1c106: f8 12 cpse r15, r24 1c108: a9 cf rjmp .-174 ; 0x1c05c } lcd_print(c); } } if (multi_screen) { 1c10a: ee 20 and r14, r14 1c10c: f9 f0 breq .+62 ; 0x1c14c // Display the double down arrow. lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]); 1c10e: 48 e8 ldi r20, 0x88 ; 136 1c110: 63 e0 ldi r22, 0x03 ; 3 1c112: 83 e1 ldi r24, 0x13 ; 19 1c114: 0e 94 13 70 call 0xe026 ; 0xe026 } return multi_screen ? msgend : NULL; } 1c118: ce 01 movw r24, r28 1c11a: df 91 pop r29 1c11c: cf 91 pop r28 1c11e: 1f 91 pop r17 1c120: 0f 91 pop r16 1c122: ff 90 pop r15 1c124: ef 90 pop r14 1c126: df 90 pop r13 1c128: cf 90 pop r12 1c12a: bf 90 pop r11 1c12c: af 90 pop r10 1c12e: 08 95 ret if (multi_screen) msgend = (msgend2 -= 2); } if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) { // Splitting a word. Find the start of the current word. while (msgend > msg && ! pgm_is_whitespace(msgend - 1)) 1c130: e8 01 movw r28, r16 -- msgend; if (msgend == msg) // Found a single long word, which cannot be split. Just cut it. msgend = msgend2; } for (; msg < msgend; ++ msg) { 1c132: cc 16 cp r12, r28 1c134: dd 06 cpc r13, r29 1c136: 28 f7 brcc .-54 ; 0x1c102 char c = char(pgm_read_byte(msg)); 1c138: f6 01 movw r30, r12 1c13a: 84 91 lpm r24, Z if (c == '\n') { 1c13c: 8a 30 cpi r24, 0x0A ; 10 1c13e: 09 f3 breq .-62 ; 0x1c102 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 1c140: 0e 94 a2 70 call 0xe144 ; 0xe144 -- msgend; if (msgend == msg) // Found a single long word, which cannot be split. Just cut it. msgend = msgend2; } for (; msg < msgend; ++ msg) { 1c144: ff ef ldi r31, 0xFF ; 255 1c146: cf 1a sub r12, r31 1c148: df 0a sbc r13, r31 1c14a: f3 cf rjmp .-26 ; 0x1c132 if (multi_screen) { // Display the double down arrow. lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]); } return multi_screen ? msgend : NULL; 1c14c: d0 e0 ldi r29, 0x00 ; 0 1c14e: c0 e0 ldi r28, 0x00 ; 0 1c150: e3 cf rjmp .-58 ; 0x1c118 0001c152 : } const char* lcd_display_message_fullscreen_P(const char *msg) { 1c152: cf 93 push r28 1c154: df 93 push r29 1c156: ec 01 movw r28, r24 // Disable update of the screen by the usual lcd_update(0) routine. lcd_update_enable(false); 1c158: 80 e0 ldi r24, 0x00 ; 0 1c15a: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 1c15e: 0e 94 26 70 call 0xe04c ; 0xe04c return lcd_display_message_fullscreen_nonBlocking_P(msg); 1c162: ce 01 movw r24, r28 } 1c164: df 91 pop r29 1c166: cf 91 pop r28 const char* lcd_display_message_fullscreen_P(const char *msg) { // Disable update of the screen by the usual lcd_update(0) routine. lcd_update_enable(false); lcd_clear(); return lcd_display_message_fullscreen_nonBlocking_P(msg); 1c168: 0c 94 1e e0 jmp 0x1c03c ; 0x1c03c 0001c16c : { (void)lcd_selftest(); } bool lcd_selftest() { 1c16c: cf 92 push r12 1c16e: df 92 push r13 1c170: ef 92 push r14 1c172: ff 92 push r15 1c174: 0f 93 push r16 1c176: 1f 93 push r17 1c178: cf 93 push r28 1c17a: df 93 push r29 1c17c: 00 d0 rcall .+0 ; 0x1c17e 1c17e: 1f 92 push r1 1c180: cd b7 in r28, 0x3d ; 61 1c182: de b7 in r29, 0x3e ; 62 lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder)); lcd_putc(LCD_STR_DEGREE[0]); } void lcd_wait_for_cool_down() { disable_heater(); 1c184: 0f 94 05 11 call 0x2220a ; 0x2220a uint8_t fanSpeedBckp = fanSpeed; 1c188: d0 90 55 12 lds r13, 0x1255 ; 0x801255 fanSpeed = 255; 1c18c: 8f ef ldi r24, 0xFF ; 255 1c18e: 80 93 55 12 sts 0x1255, r24 ; 0x801255 while ((degHotend(0)>MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) { lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP)); lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0)); 1c192: 8f ec ldi r24, 0xCF ; 207 1c194: e8 2e mov r14, r24 1c196: 83 e8 ldi r24, 0x83 ; 131 1c198: f8 2e mov r15, r24 lcd_putc(LCD_STR_DEGREE[0]); lcd_putc_at(9, 4, LCD_STR_BEDTEMP[0]); lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed()); 1c19a: 09 ec ldi r16, 0xC9 ; 201 1c19c: 13 e8 ldi r17, 0x83 ; 131 void lcd_wait_for_cool_down() { disable_heater(); uint8_t fanSpeedBckp = fanSpeed; fanSpeed = 255; while ((degHotend(0)>MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) { 1c19e: 20 e0 ldi r18, 0x00 ; 0 1c1a0: 30 e0 ldi r19, 0x00 ; 0 1c1a2: 48 e4 ldi r20, 0x48 ; 72 1c1a4: 52 e4 ldi r21, 0x42 ; 66 1c1a6: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1c1aa: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1c1ae: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1c1b2: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1c1b6: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1c1ba: 18 16 cp r1, r24 1c1bc: 8c f0 brlt .+34 ; 0x1c1e0 1c1be: 20 e0 ldi r18, 0x00 ; 0 1c1c0: 30 e0 ldi r19, 0x00 ; 0 1c1c2: 48 e4 ldi r20, 0x48 ; 72 1c1c4: 52 e4 ldi r21, 0x42 ; 66 1c1c6: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 1c1ca: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 1c1ce: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 1c1d2: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 1c1d6: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1c1da: 18 16 cp r1, r24 1c1dc: 0c f0 brlt .+2 ; 0x1c1e0 1c1de: 42 c0 rjmp .+132 ; 0x1c264 lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP)); 1c1e0: 86 ee ldi r24, 0xE6 ; 230 1c1e2: 98 e4 ldi r25, 0x48 ; 72 1c1e4: 0e 94 3a 75 call 0xea74 ; 0xea74 1c1e8: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 1c1ec: 42 e8 ldi r20, 0x82 ; 130 1c1ee: 64 e0 ldi r22, 0x04 ; 4 1c1f0: 80 e0 ldi r24, 0x00 ; 0 1c1f2: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0)); 1c1f6: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1c1fa: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1c1fe: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1c202: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1c206: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1c20a: 7f 93 push r23 1c20c: 6f 93 push r22 1c20e: ff 92 push r15 1c210: ef 92 push r14 1c212: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_putc(LCD_STR_DEGREE[0]); 1c216: 81 e8 ldi r24, 0x81 ; 129 1c218: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_putc_at(9, 4, LCD_STR_BEDTEMP[0]); 1c21c: 40 e8 ldi r20, 0x80 ; 128 1c21e: 64 e0 ldi r22, 0x04 ; 4 1c220: 89 e0 ldi r24, 0x09 ; 9 1c222: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed()); 1c226: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 1c22a: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 1c22e: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 1c232: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 1c236: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1c23a: 7f 93 push r23 1c23c: 6f 93 push r22 1c23e: 1f 93 push r17 1c240: 0f 93 push r16 1c242: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_putc(LCD_STR_DEGREE[0]); 1c246: 81 e8 ldi r24, 0x81 ; 129 1c248: 0e 94 21 6f call 0xde42 ; 0xde42 delay_keep_alive(1000); 1c24c: 88 ee ldi r24, 0xE8 ; 232 1c24e: 93 e0 ldi r25, 0x03 ; 3 1c250: 0e 94 8e 8e call 0x11d1c ; 0x11d1c serialecho_temperatures(); 1c254: 0e 94 d2 7a call 0xf5a4 ; 0xf5a4 1c258: 0f b6 in r0, 0x3f ; 63 1c25a: f8 94 cli 1c25c: de bf out 0x3e, r29 ; 62 1c25e: 0f be out 0x3f, r0 ; 63 1c260: cd bf out 0x3d, r28 ; 61 1c262: 9d cf rjmp .-198 ; 0x1c19e } fanSpeed = fanSpeedBckp; 1c264: d0 92 55 12 sts 0x1255, r13 ; 0x801255 lcd_update_enable(true); 1c268: 81 e0 ldi r24, 0x01 ; 1 1c26a: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_detect_IRsensor(); } } #endif lcd_wait_for_cool_down(); lcd_clear(); 1c26e: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_START)); 1c272: 89 e1 ldi r24, 0x19 ; 25 1c274: 99 e4 ldi r25, 0x49 ; 73 1c276: 0e 94 3a 75 call 0xea74 ; 0xea74 1c27a: ac 01 movw r20, r24 1c27c: 60 e0 ldi r22, 0x00 ; 0 1c27e: 80 e0 ldi r24, 0x00 ; 0 1c280: 0e 94 07 70 call 0xe00e ; 0xe00e #ifdef TMC2130 FORCE_HIGH_POWER_START; #endif // TMC2130 FORCE_BL_ON_START; _delay(2000); 1c284: 60 ed ldi r22, 0xD0 ; 208 1c286: 77 e0 ldi r23, 0x07 ; 7 1c288: 80 e0 ldi r24, 0x00 ; 0 1c28a: 90 e0 ldi r25, 0x00 ; 0 1c28c: 0f 94 bd 0d call 0x21b7a ; 0x21b7a KEEPALIVE_STATE(IN_HANDLER); 1c290: 82 e0 ldi r24, 0x02 ; 2 1c292: 80 93 78 02 sts 0x0278, r24 ; 0x800278 _progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000); 1c296: 00 ed ldi r16, 0xD0 ; 208 1c298: 17 e0 ldi r17, 0x07 ; 7 1c29a: 21 e0 ldi r18, 0x01 ; 1 1c29c: 43 e0 ldi r20, 0x03 ; 3 1c29e: 60 e0 ldi r22, 0x00 ; 0 1c2a0: 80 e0 ldi r24, 0x00 ; 0 1c2a2: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c2a6: f8 2e mov r15, r24 // speed threshold to mark a fan as failed static const int failThr = FANCHECK_AUTO_FAIL_THRS; // < FANCHECK_AUTO_FAIL_THRS RPM would mean either a faulty Noctua, Altfan or print fan switch (_fan) { case 0: setExtruderAutoFanState(3); // hotend fan 1c2a8: 83 e0 ldi r24, 0x03 ; 3 1c2aa: 0e 94 af 77 call 0xef5e ; 0xef5e } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 1c2ae: 10 92 55 12 sts 0x1255, r1 ; 0x801255 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 1c2b2: 10 92 1d 06 sts 0x061D, r1 ; 0x80061d #endif manage_heater(); 1c2b6: 0f 94 1c 3a call 0x27438 ; 0x27438 // spin-up delay static char symbols[] = {'-', '|'}; static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000); while(delay--) { for(uint8_t i = 0; i != sizeof(symbols); ++i) { lcd_putc_at(col, row, symbols[i]); 1c2ba: 4d e2 ldi r20, 0x2D ; 45 1c2bc: 62 e0 ldi r22, 0x02 ; 2 1c2be: 82 e1 ldi r24, 0x12 ; 18 1c2c0: 0e 94 13 70 call 0xe026 ; 0xe026 delay_keep_alive(1000 / sizeof(symbols)); 1c2c4: 84 ef ldi r24, 0xF4 ; 244 1c2c6: 91 e0 ldi r25, 0x01 ; 1 1c2c8: 0e 94 8e 8e call 0x11d1c ; 0x11d1c // spin-up delay static char symbols[] = {'-', '|'}; static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000); while(delay--) { for(uint8_t i = 0; i != sizeof(symbols); ++i) { lcd_putc_at(col, row, symbols[i]); 1c2cc: 4c e7 ldi r20, 0x7C ; 124 1c2ce: 62 e0 ldi r22, 0x02 ; 2 1c2d0: 82 e1 ldi r24, 0x12 ; 18 1c2d2: 0e 94 13 70 call 0xe026 ; 0xe026 delay_keep_alive(1000 / sizeof(symbols)); 1c2d6: 84 ef ldi r24, 0xF4 ; 244 1c2d8: 91 e0 ldi r25, 0x01 ; 1 1c2da: 0e 94 8e 8e call 0x11d1c ; 0x11d1c // spin-up delay static char symbols[] = {'-', '|'}; static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000); while(delay--) { for(uint8_t i = 0; i != sizeof(symbols); ++i) { lcd_putc_at(col, row, symbols[i]); 1c2de: 4d e2 ldi r20, 0x2D ; 45 1c2e0: 62 e0 ldi r22, 0x02 ; 2 1c2e2: 82 e1 ldi r24, 0x12 ; 18 1c2e4: 0e 94 13 70 call 0xe026 ; 0xe026 delay_keep_alive(1000 / sizeof(symbols)); 1c2e8: 84 ef ldi r24, 0xF4 ; 244 1c2ea: 91 e0 ldi r25, 0x01 ; 1 1c2ec: 0e 94 8e 8e call 0x11d1c ; 0x11d1c // spin-up delay static char symbols[] = {'-', '|'}; static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000); while(delay--) { for(uint8_t i = 0; i != sizeof(symbols); ++i) { lcd_putc_at(col, row, symbols[i]); 1c2f0: 4c e7 ldi r20, 0x7C ; 124 1c2f2: 62 e0 ldi r22, 0x02 ; 2 1c2f4: 82 e1 ldi r24, 0x12 ; 18 1c2f6: 0e 94 13 70 call 0xe026 ; 0xe026 delay_keep_alive(1000 / sizeof(symbols)); 1c2fa: 84 ef ldi r24, 0xF4 ; 244 1c2fc: 91 e0 ldi r25, 0x01 ; 1 1c2fe: 0e 94 8e 8e call 0x11d1c ; 0x11d1c } } #ifdef FANCHECK extruder_autofan_last_check = _millis(); 1c302: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1c306: 60 93 07 17 sts 0x1707, r22 ; 0x801707 1c30a: 70 93 08 17 sts 0x1708, r23 ; 0x801708 1c30e: 80 93 09 17 sts 0x1709, r24 ; 0x801709 1c312: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a #endif fan_measuring = true; 1c316: 81 e0 ldi r24, 0x01 ; 1 1c318: 80 93 b6 03 sts 0x03B6, r24 ; 0x8003b6 while(fan_measuring) { 1c31c: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 1c320: 88 23 and r24, r24 1c322: 29 f0 breq .+10 ; 0x1c32e delay_keep_alive(100); 1c324: 84 e6 ldi r24, 0x64 ; 100 1c326: 90 e0 ldi r25, 0x00 ; 0 1c328: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 1c32c: f7 cf rjmp .-18 ; 0x1c31c } gcode_M123(); 1c32e: 0e 94 15 65 call 0xca2a ; 0xca2a switch (_fan) { case 0: setExtruderAutoFanState(3); // hotend fan lcd_selftest_setfan(0); // print fan off lcd_selftest_measure_fans(2, 18, 2); setExtruderAutoFanState(0); // hotend fan off 1c332: 80 e0 ldi r24, 0x00 ; 0 1c334: 0e 94 af 77 call 0xef5e ; 0xef5e if (fan_speed[0] < failThr) { 1c338: c0 90 b7 03 lds r12, 0x03B7 ; 0x8003b7 1c33c: d0 90 b8 03 lds r13, 0x03B8 ; 0x8003b8 1c340: 94 e1 ldi r25, 0x14 ; 20 1c342: c9 16 cp r12, r25 1c344: d1 04 cpc r13, r1 1c346: 54 f1 brlt .+84 ; 0x1c39c lcd_selftest_error(TestError::ExtruderFan, "", ""); } if (_result) { _progress = lcd_selftest_screen(TestScreen::PrintFan, _progress, 3, true, 2000); 1c348: 00 ed ldi r16, 0xD0 ; 208 1c34a: 17 e0 ldi r17, 0x07 ; 7 1c34c: 21 e0 ldi r18, 0x01 ; 1 1c34e: 43 e0 ldi r20, 0x03 ; 3 1c350: 6f 2d mov r22, r15 1c352: 81 e0 ldi r24, 0x01 ; 1 1c354: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c358: f8 2e mov r15, r24 default: _result = false; break; } #else //defined(TACH_1) _result = lcd_selftest_manual_fan_check(1, false); 1c35a: 60 e0 ldi r22, 0x00 ; 0 1c35c: 80 e0 ldi r24, 0x00 ; 0 1c35e: 0f 94 d1 8e call 0x31da2 ; 0x31da2 #endif //defined(TACH_1) if (!_result) 1c362: 81 11 cpse r24, r1 1c364: 3a c0 rjmp .+116 ; 0x1c3da { lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning 1c366: 4f ed ldi r20, 0xDF ; 223 1c368: 52 e0 ldi r21, 0x02 ; 2 1c36a: ba 01 movw r22, r20 1c36c: 85 e0 ldi r24, 0x05 ; 5 1c36e: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 } } if (_swapped_fan) { 1c372: 86 e4 ldi r24, 0x46 ; 70 1c374: c8 16 cp r12, r24 1c376: d1 04 cpc r13, r1 1c378: bc f0 brlt .+46 ; 0x1c3a8 //turn on print fan and check that left hotend fan is not spinning _result = lcd_selftest_manual_fan_check(1, true); 1c37a: 60 e0 ldi r22, 0x00 ; 0 1c37c: 81 e0 ldi r24, 0x01 ; 1 1c37e: 0f 94 d1 8e call 0x31da2 ; 0x31da2 if (_result) { 1c382: 88 23 and r24, r24 1c384: d9 f0 breq .+54 ; 0x1c3bc //print fan is stil turned on; check that it is spinning _result = lcd_selftest_manual_fan_check(1, false, true); 1c386: 61 e0 ldi r22, 0x01 ; 1 1c388: 80 e0 ldi r24, 0x00 ; 0 1c38a: 0f 94 d1 8e call 0x31da2 ; 0x31da2 if (!_result){ 1c38e: 81 11 cpse r24, r1 1c390: 28 c0 rjmp .+80 ; 0x1c3e2 lcd_selftest_error(TestError::PrintFan, "", ""); 1c392: 4f ed ldi r20, 0xDF ; 223 1c394: 52 e0 ldi r21, 0x02 ; 2 1c396: ba 01 movw r22, r20 1c398: 85 e0 ldi r24, 0x05 ; 5 1c39a: 04 c0 rjmp .+8 ; 0x1c3a4 #else //defined(TACH_0) _result = lcd_selftest_manual_fan_check(0, false); #endif //defined(TACH_0) if (!_result) { lcd_selftest_error(TestError::ExtruderFan, "", ""); 1c39c: 4f ed ldi r20, 0xDF ; 223 1c39e: 52 e0 ldi r21, 0x02 ; 2 1c3a0: ba 01 movw r22, r20 1c3a2: 86 e0 ldi r24, 0x06 ; 6 lcd_selftest_error(TestError::PrintFan, "", ""); } } else { // fans are swapped lcd_selftest_error(TestError::SwappedFan, "", ""); 1c3a4: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 { _progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct } else { _progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000); 1c3a8: 08 e8 ldi r16, 0x88 ; 136 1c3aa: 13 e1 ldi r17, 0x13 ; 19 1c3ac: 21 e0 ldi r18, 0x01 ; 1 1c3ae: 43 e0 ldi r20, 0x03 ; 3 1c3b0: 6f 2d mov r22, r15 1c3b2: 8d e0 ldi r24, 0x0D ; 13 1c3b4: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c3b8: e1 2c mov r14, r1 1c3ba: 75 c1 rjmp .+746 ; 0x1c6a6 lcd_selftest_error(TestError::PrintFan, "", ""); } } else { // fans are swapped lcd_selftest_error(TestError::SwappedFan, "", ""); 1c3bc: 4f ed ldi r20, 0xDF ; 223 1c3be: 52 e0 ldi r21, 0x02 ; 2 1c3c0: ba 01 movw r22, r20 1c3c2: 89 e0 ldi r24, 0x09 ; 9 1c3c4: ef cf rjmp .-34 ; 0x1c3a4 #endif //not defined TMC2130 static bool lcd_selfcheck_endstops() { bool _result = true; 1c3c6: 11 e0 ldi r17, 0x01 ; 1 1c3c8: 96 c0 rjmp .+300 ; 0x1c4f6 lcd_setstatuspgm(_T(MSG_SELFTEST_OK)); lcd_return_to_status(); } else { LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); 1c3ca: 8b e3 ldi r24, 0x3B ; 59 1c3cc: 9a e4 ldi r25, 0x4A ; 74 1c3ce: 0e 94 3a 75 call 0xea74 ; 0xea74 1c3d2: 62 e0 ldi r22, 0x02 ; 2 1c3d4: 0e 94 2c da call 0x1b458 ; 0x1b458 1c3d8: 7e c1 rjmp .+764 ; 0x1c6d6 { lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning } } if (_swapped_fan) { 1c3da: 96 e4 ldi r25, 0x46 ; 70 1c3dc: c9 16 cp r12, r25 1c3de: d1 04 cpc r13, r1 1c3e0: 64 f6 brge .-104 ; 0x1c37a } } if (_result) { _progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000); 1c3e2: 00 ed ldi r16, 0xD0 ; 208 1c3e4: 17 e0 ldi r17, 0x07 ; 7 1c3e6: 21 e0 ldi r18, 0x01 ; 1 1c3e8: 43 e0 ldi r20, 0x03 ; 3 1c3ea: 6f 2d mov r22, r15 1c3ec: 82 e0 ldi r24, 0x02 ; 2 1c3ee: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c3f2: f8 2e mov r15, r24 bool _result = true; if ( #ifndef TMC2130 ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || 1c3f4: 1e 99 sbic 0x03, 6 ; 3 1c3f6: 04 c0 rjmp .+8 ; 0x1c400 { bool _result = true; if ( #ifndef TMC2130 ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || 1c3f8: 1d 99 sbic 0x03, 5 ; 3 1c3fa: 02 c0 rjmp .+4 ; 0x1c400 ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || 1c3fc: 1c 9b sbis 0x03, 4 ; 3 1c3fe: 48 c0 rjmp .+144 ; 0x1c490 #endif //!TMC2130 ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1)) { #ifndef TMC2130 if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) current_position[0] += 10; 1c400: 1e 9b sbis 0x03, 6 ; 3 1c402: 16 c0 rjmp .+44 ; 0x1c430 1c404: 20 e0 ldi r18, 0x00 ; 0 1c406: 30 e0 ldi r19, 0x00 ; 0 1c408: 40 e2 ldi r20, 0x20 ; 32 1c40a: 51 e4 ldi r21, 0x41 ; 65 1c40c: 60 91 61 12 lds r22, 0x1261 ; 0x801261 1c410: 70 91 62 12 lds r23, 0x1262 ; 0x801262 1c414: 80 91 63 12 lds r24, 0x1263 ; 0x801263 1c418: 90 91 64 12 lds r25, 0x1264 ; 0x801264 1c41c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c420: 60 93 61 12 sts 0x1261, r22 ; 0x801261 1c424: 70 93 62 12 sts 0x1262, r23 ; 0x801262 1c428: 80 93 63 12 sts 0x1263, r24 ; 0x801263 1c42c: 90 93 64 12 sts 0x1264, r25 ; 0x801264 if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) current_position[1] += 10; 1c430: 1d 9b sbis 0x03, 5 ; 3 1c432: 16 c0 rjmp .+44 ; 0x1c460 1c434: 20 e0 ldi r18, 0x00 ; 0 1c436: 30 e0 ldi r19, 0x00 ; 0 1c438: 40 e2 ldi r20, 0x20 ; 32 1c43a: 51 e4 ldi r21, 0x41 ; 65 1c43c: 60 91 65 12 lds r22, 0x1265 ; 0x801265 1c440: 70 91 66 12 lds r23, 0x1266 ; 0x801266 1c444: 80 91 67 12 lds r24, 0x1267 ; 0x801267 1c448: 90 91 68 12 lds r25, 0x1268 ; 0x801268 1c44c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c450: 60 93 65 12 sts 0x1265, r22 ; 0x801265 1c454: 70 93 66 12 sts 0x1266, r23 ; 0x801266 1c458: 80 93 67 12 sts 0x1267, r24 ; 0x801267 1c45c: 90 93 68 12 sts 0x1268, r25 ; 0x801268 #endif //!TMC2130 if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) current_position[2] += 10; 1c460: 1c 9b sbis 0x03, 4 ; 3 1c462: 16 c0 rjmp .+44 ; 0x1c490 1c464: 20 e0 ldi r18, 0x00 ; 0 1c466: 30 e0 ldi r19, 0x00 ; 0 1c468: 40 e2 ldi r20, 0x20 ; 32 1c46a: 51 e4 ldi r21, 0x41 ; 65 1c46c: 60 91 69 12 lds r22, 0x1269 ; 0x801269 1c470: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 1c474: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 1c478: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 1c47c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c480: 60 93 69 12 sts 0x1269, r22 ; 0x801269 1c484: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 1c488: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 1c48c: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c } plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1c490: 60 e0 ldi r22, 0x00 ; 0 1c492: 70 e0 ldi r23, 0x00 ; 0 1c494: 84 e3 ldi r24, 0x34 ; 52 1c496: 92 e4 ldi r25, 0x42 ; 66 1c498: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1c49c: 0f 94 fb 1a call 0x235f6 ; 0x235f6 if ( #ifndef TMC2130 ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || 1c4a0: 1e 99 sbic 0x03, 6 ; 3 1c4a2: 04 c0 rjmp .+8 ; 0x1c4ac plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); st_synchronize(); if ( #ifndef TMC2130 ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || 1c4a4: 1d 99 sbic 0x03, 5 ; 3 1c4a6: 02 c0 rjmp .+4 ; 0x1c4ac ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || 1c4a8: 1c 9b sbis 0x03, 4 ; 3 1c4aa: 8d cf rjmp .-230 ; 0x1c3c6 #endif //!TMC2130 ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1)) { _result = false; char _error[4] = ""; 1c4ac: 1a 82 std Y+2, r1 ; 0x02 1c4ae: 19 82 std Y+1, r1 ; 0x01 1c4b0: 1c 82 std Y+4, r1 ; 0x04 1c4b2: 1b 82 std Y+3, r1 ; 0x03 #ifndef TMC2130 if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "X"); 1c4b4: 1e 9b sbis 0x03, 6 ; 3 1c4b6: 06 c0 rjmp .+12 ; 0x1c4c4 1c4b8: 68 ec ldi r22, 0xC8 ; 200 1c4ba: 72 e0 ldi r23, 0x02 ; 2 1c4bc: ce 01 movw r24, r28 1c4be: 01 96 adiw r24, 0x01 ; 1 1c4c0: 0f 94 2c aa call 0x35458 ; 0x35458 if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y"); 1c4c4: 1d 9b sbis 0x03, 5 ; 3 1c4c6: 06 c0 rjmp .+12 ; 0x1c4d4 1c4c8: 6a ec ldi r22, 0xCA ; 202 1c4ca: 72 e0 ldi r23, 0x02 ; 2 1c4cc: ce 01 movw r24, r28 1c4ce: 01 96 adiw r24, 0x01 ; 1 1c4d0: 0f 94 2c aa call 0x35458 ; 0x35458 #endif //!TMC2130 if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z"); 1c4d4: 1c 9b sbis 0x03, 4 ; 3 1c4d6: 06 c0 rjmp .+12 ; 0x1c4e4 1c4d8: 6c ec ldi r22, 0xCC ; 204 1c4da: 72 e0 ldi r23, 0x02 ; 2 1c4dc: ce 01 movw r24, r28 1c4de: 01 96 adiw r24, 0x01 ; 1 1c4e0: 0f 94 2c aa call 0x35458 ; 0x35458 lcd_selftest_error(TestError::Endstops, _error, ""); 1c4e4: 4f ed ldi r20, 0xDF ; 223 1c4e6: 52 e0 ldi r21, 0x02 ; 2 1c4e8: be 01 movw r22, r28 1c4ea: 6f 5f subi r22, 0xFF ; 255 1c4ec: 7f 4f sbci r23, 0xFF ; 255 1c4ee: 82 e0 ldi r24, 0x02 ; 2 1c4f0: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) || ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || #endif //!TMC2130 ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1)) { _result = false; 1c4f4: 10 e0 ldi r17, 0x00 ; 0 if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y"); #endif //!TMC2130 if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z"); lcd_selftest_error(TestError::Endstops, _error, ""); } manage_heater(); 1c4f6: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1c4fa: 81 e0 ldi r24, 0x01 ; 1 1c4fc: 0e 94 34 8c call 0x11868 ; 0x11868 { _progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000); _result = lcd_selfcheck_endstops(); //With TMC2130, only the Z probe is tested. } if (_result) 1c500: 11 23 and r17, r17 1c502: 09 f4 brne .+2 ; 0x1c506 1c504: 51 cf rjmp .-350 ; 0x1c3a8 { //current_position[Z_AXIS] += 15; //move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed _progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 2000); 1c506: 00 ed ldi r16, 0xD0 ; 208 1c508: 17 e0 ldi r17, 0x07 ; 7 1c50a: 21 e0 ldi r18, 0x01 ; 1 1c50c: 43 e0 ldi r20, 0x03 ; 3 1c50e: 6f 2d mov r22, r15 1c510: 84 e0 ldi r24, 0x04 ; 4 1c512: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c516: f8 2e mov r15, r24 #ifdef TMC2130 _result = lcd_selfcheck_axis_sg(X_AXIS); #else _result = lcd_selfcheck_axis(X_AXIS, X_MAX_POS); 1c518: 6a ef ldi r22, 0xFA ; 250 1c51a: 70 e0 ldi r23, 0x00 ; 0 1c51c: 90 e0 ldi r25, 0x00 ; 0 1c51e: 80 e0 ldi r24, 0x00 ; 0 1c520: 0e 94 42 dd call 0x1ba84 ; 0x1ba84 } if (_result) 1c524: 88 23 and r24, r24 1c526: 09 f4 brne .+2 ; 0x1c52a 1c528: 3f cf rjmp .-386 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 0); 1c52a: 10 e0 ldi r17, 0x00 ; 0 1c52c: 00 e0 ldi r16, 0x00 ; 0 1c52e: 21 e0 ldi r18, 0x01 ; 1 1c530: 43 e0 ldi r20, 0x03 ; 3 1c532: 6f 2d mov r22, r15 1c534: 84 e0 ldi r24, 0x04 ; 4 1c536: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c53a: f8 2e mov r15, r24 #ifndef TMC2130 _result = lcd_selfcheck_pulleys(X_AXIS); 1c53c: 90 e0 ldi r25, 0x00 ; 0 1c53e: 80 e0 ldi r24, 0x00 ; 0 1c540: 0e 94 3f dc call 0x1b87e ; 0x1b87e #endif } if (_result) 1c544: 88 23 and r24, r24 1c546: 09 f4 brne .+2 ; 0x1c54a 1c548: 2f cf rjmp .-418 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::AxisY, _progress, 3, true, 1500); 1c54a: 0c ed ldi r16, 0xDC ; 220 1c54c: 15 e0 ldi r17, 0x05 ; 5 1c54e: 21 e0 ldi r18, 0x01 ; 1 1c550: 43 e0 ldi r20, 0x03 ; 3 1c552: 6f 2d mov r22, r15 1c554: 85 e0 ldi r24, 0x05 ; 5 1c556: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c55a: f8 2e mov r15, r24 #ifdef TMC2130 _result = lcd_selfcheck_axis_sg(Y_AXIS); #else _result = lcd_selfcheck_axis(Y_AXIS, Y_MAX_POS); 1c55c: 62 ed ldi r22, 0xD2 ; 210 1c55e: 70 e0 ldi r23, 0x00 ; 0 1c560: 81 e0 ldi r24, 0x01 ; 1 1c562: 90 e0 ldi r25, 0x00 ; 0 1c564: 0e 94 42 dd call 0x1ba84 ; 0x1ba84 #endif // TMC2130 } if (_result) 1c568: 88 23 and r24, r24 1c56a: 09 f4 brne .+2 ; 0x1c56e 1c56c: 1d cf rjmp .-454 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 0); 1c56e: 10 e0 ldi r17, 0x00 ; 0 1c570: 00 e0 ldi r16, 0x00 ; 0 1c572: 21 e0 ldi r18, 0x01 ; 1 1c574: 43 e0 ldi r20, 0x03 ; 3 1c576: 6f 2d mov r22, r15 1c578: 86 e0 ldi r24, 0x06 ; 6 1c57a: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c57e: f8 2e mov r15, r24 #ifndef TMC2130 _result = lcd_selfcheck_pulleys(Y_AXIS); 1c580: 81 e0 ldi r24, 0x01 ; 1 1c582: 90 e0 ldi r25, 0x00 ; 0 1c584: 0e 94 3f dc call 0x1b87e ; 0x1b87e #endif // TMC2130 } if (_result) 1c588: 88 23 and r24, r24 1c58a: 09 f4 brne .+2 ; 0x1c58e 1c58c: 0d cf rjmp .-486 ; 0x1c3a8 enable_endstops(false); #endif //homeaxis(X_AXIS); //homeaxis(Y_AXIS); current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 1c58e: e0 e0 ldi r30, 0x00 ; 0 1c590: fc e9 ldi r31, 0x9C ; 156 1c592: 85 91 lpm r24, Z+ 1c594: 95 91 lpm r25, Z+ 1c596: a5 91 lpm r26, Z+ 1c598: b4 91 lpm r27, Z 1c59a: 80 93 61 12 sts 0x1261, r24 ; 0x801261 1c59e: 90 93 62 12 sts 0x1262, r25 ; 0x801262 1c5a2: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1c5a6: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4+1); 1c5aa: e4 e0 ldi r30, 0x04 ; 4 1c5ac: fc e9 ldi r31, 0x9C ; 156 1c5ae: 85 91 lpm r24, Z+ 1c5b0: 95 91 lpm r25, Z+ 1c5b2: a5 91 lpm r26, Z+ 1c5b4: b4 91 lpm r27, Z 1c5b6: 80 93 65 12 sts 0x1265, r24 ; 0x801265 1c5ba: 90 93 66 12 sts 0x1266, r25 ; 0x801266 1c5be: a0 93 67 12 sts 0x1267, r26 ; 0x801267 1c5c2: b0 93 68 12 sts 0x1268, r27 ; 0x801268 #ifdef TMC2130 //current_position[X_AXIS] += 0; current_position[Y_AXIS] += 4; #endif //TMC2130 raise_z(10); 1c5c6: 60 e0 ldi r22, 0x00 ; 0 1c5c8: 70 e0 ldi r23, 0x00 ; 0 1c5ca: 80 e2 ldi r24, 0x20 ; 32 1c5cc: 91 e4 ldi r25, 0x41 ; 65 1c5ce: 0e 94 94 6c call 0xd928 ; 0xd928 set_destination_to_current(); 1c5d2: 0e 94 ae 66 call 0xcd5c ; 0xcd5c _progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500); 1c5d6: 0c ed ldi r16, 0xDC ; 220 1c5d8: 15 e0 ldi r17, 0x05 ; 5 1c5da: 21 e0 ldi r18, 0x01 ; 1 1c5dc: 43 e0 ldi r20, 0x03 ; 3 1c5de: 6f 2d mov r22, r15 1c5e0: 86 e0 ldi r24, 0x06 ; 6 1c5e2: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c5e6: f8 2e mov r15, r24 #ifdef TMC2130 homeaxis(Z_AXIS); //In case of failure, the code gets stuck in this function. #else _result = lcd_selfcheck_axis(Z_AXIS, Z_MAX_POS); 1c5e8: 62 ed ldi r22, 0xD2 ; 210 1c5ea: 70 e0 ldi r23, 0x00 ; 0 1c5ec: 82 e0 ldi r24, 0x02 ; 2 1c5ee: 90 e0 ldi r25, 0x00 ; 0 1c5f0: 0e 94 42 dd call 0x1ba84 ; 0x1ba84 1c5f4: 18 2f mov r17, r24 #endif //TMC2130 //raise Z to not damage the bed during and hotend testing raise_z(20); 1c5f6: 60 e0 ldi r22, 0x00 ; 0 1c5f8: 70 e0 ldi r23, 0x00 ; 0 1c5fa: 80 ea ldi r24, 0xA0 ; 160 1c5fc: 91 e4 ldi r25, 0x41 ; 65 1c5fe: 0e 94 94 6c call 0xd928 ; 0xd928 eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_HOME_ENABLED, 1); _result = bres; } #endif //TMC2130 if (_result) 1c602: 11 23 and r17, r17 1c604: 09 f4 brne .+2 ; 0x1c608 1c606: d0 ce rjmp .-608 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::Bed, _progress, 3, true, 2000); 1c608: 00 ed ldi r16, 0xD0 ; 208 1c60a: 17 e0 ldi r17, 0x07 ; 7 1c60c: 21 e0 ldi r18, 0x01 ; 1 1c60e: 43 e0 ldi r20, 0x03 ; 3 1c610: 6f 2d mov r22, r15 1c612: 87 e0 ldi r24, 0x07 ; 7 1c614: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c618: f8 2e mov r15, r24 _result = lcd_selfcheck_check_heater(true); 1c61a: 81 e0 ldi r24, 0x01 ; 1 1c61c: 0e 94 49 db call 0x1b692 ; 0x1b692 } if (_result) 1c620: 88 23 and r24, r24 1c622: 09 f4 brne .+2 ; 0x1c626 1c624: c1 ce rjmp .-638 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::Hotend, _progress, 3, true, 1000); 1c626: 08 ee ldi r16, 0xE8 ; 232 1c628: 13 e0 ldi r17, 0x03 ; 3 1c62a: 21 e0 ldi r18, 0x01 ; 1 1c62c: 43 e0 ldi r20, 0x03 ; 3 1c62e: 6f 2d mov r22, r15 1c630: 88 e0 ldi r24, 0x08 ; 8 1c632: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c636: f8 2e mov r15, r24 _result = lcd_selfcheck_check_heater(false); 1c638: 80 e0 ldi r24, 0x00 ; 0 1c63a: 0e 94 49 db call 0x1b692 ; 0x1b692 1c63e: e8 2e mov r14, r24 } if (_result) 1c640: 88 23 and r24, r24 1c642: 09 f4 brne .+2 ; 0x1c646 1c644: b1 ce rjmp .-670 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::HotendOk, _progress, 3, true, 2000); //nozzle ok 1c646: 00 ed ldi r16, 0xD0 ; 208 1c648: 17 e0 ldi r17, 0x07 ; 7 1c64a: 21 e0 ldi r18, 0x01 ; 1 1c64c: 43 e0 ldi r20, 0x03 ; 3 1c64e: 6f 2d mov r22, r15 1c650: 89 e0 ldi r24, 0x09 ; 9 1c652: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 } } else #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) { #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 _progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor 1c656: 21 e0 ldi r18, 0x01 ; 1 1c658: 43 e0 ldi r20, 0x03 ; 3 1c65a: 68 2f mov r22, r24 1c65c: 8a e0 ldi r24, 0x0A ; 10 1c65e: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 1c662: f8 2e mov r15, r24 #ifdef FILAMENT_SENSOR #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static bool lcd_selftest_fsensor(void) { fsensor.init(); 1c664: 0f 94 dc 6d call 0x2dbb8 ; 0x2dbb8 if (fsensor.isError()) 1c668: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1c66c: 83 30 cpi r24, 0x03 ; 3 1c66e: 31 f4 brne .+12 ; 0x1c67c { lcd_selftest_error(TestError::WiringFsensor, "", ""); 1c670: 4f ed ldi r20, 0xDF ; 223 1c672: 52 e0 ldi r21, 0x02 ; 2 1c674: ba 01 movw r22, r20 1c676: 8a e0 ldi r24, 0x0A ; 10 1c678: 0e 94 5b da call 0x1b4b6 ; 0x1b4b6 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) { #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 _progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor _result = lcd_selftest_fsensor(); if (_result) 1c67c: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1c680: 83 30 cpi r24, 0x03 ; 3 1c682: 09 f4 brne .+2 ; 0x1c686 1c684: 91 ce rjmp .-734 ; 0x1c3a8 { _progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK 1c686: 00 ed ldi r16, 0xD0 ; 208 1c688: 17 e0 ldi r17, 0x07 ; 7 1c68a: 21 e0 ldi r18, 0x01 ; 1 1c68c: 43 e0 ldi r20, 0x03 ; 3 1c68e: 6f 2d mov r22, r15 1c690: 8b e0 ldi r24, 0x0B ; 11 1c692: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 } } #endif //FILAMENT_SENSOR if (_result) { _progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct 1c696: 08 e8 ldi r16, 0x88 ; 136 1c698: 13 e1 ldi r17, 0x13 ; 19 1c69a: 21 e0 ldi r18, 0x01 ; 1 1c69c: 43 e0 ldi r20, 0x03 ; 3 1c69e: 68 2f mov r22, r24 1c6a0: 8c e0 ldi r24, 0x0C ; 12 1c6a2: 0e 94 f8 c4 call 0x189f0 ; 0x189f0 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1c6a6: 10 92 c0 03 sts 0x03C0, r1 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> else { _progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000); } lcd_reset_alert_level(); enquecommand_P(MSG_M84); 1c6aa: 61 e0 ldi r22, 0x01 ; 1 1c6ac: 8e e8 ldi r24, 0x8E ; 142 1c6ae: 98 e6 ldi r25, 0x68 ; 104 1c6b0: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_update_enable(true); 1c6b4: 81 e0 ldi r24, 0x01 ; 1 1c6b6: 0e 94 38 70 call 0xe070 ; 0xe070 if (_result) 1c6ba: ee 20 and r14, r14 1c6bc: 09 f4 brne .+2 ; 0x1c6c0 1c6be: 85 ce rjmp .-758 ; 0x1c3ca { calibration_status_set(CALIBRATION_STATUS_SELFTEST); 1c6c0: 81 e0 ldi r24, 0x01 ; 1 1c6c2: 0e 94 4e d7 call 0x1ae9c ; 0x1ae9c lcd_setstatuspgm(_T(MSG_SELFTEST_OK)); 1c6c6: 8b e0 ldi r24, 0x0B ; 11 1c6c8: 99 e4 ldi r25, 0x49 ; 73 1c6ca: 0e 94 3a 75 call 0xea74 ; 0xea74 1c6ce: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_return_to_status(); 1c6d2: 0f 94 d5 07 call 0x20faa ; 0x20faa FORCE_HIGH_POWER_END; #endif // TMC2130 FORCE_BL_ON_END; KEEPALIVE_STATE(NOT_BUSY); 1c6d6: 81 e0 ldi r24, 0x01 ; 1 1c6d8: 80 93 78 02 sts 0x0278, r24 ; 0x800278 return(_result); } 1c6dc: 8e 2d mov r24, r14 1c6de: 0f 90 pop r0 1c6e0: 0f 90 pop r0 1c6e2: 0f 90 pop r0 1c6e4: 0f 90 pop r0 1c6e6: df 91 pop r29 1c6e8: cf 91 pop r28 1c6ea: 1f 91 pop r17 1c6ec: 0f 91 pop r16 1c6ee: ff 90 pop r15 1c6f0: ef 90 pop r14 1c6f2: df 90 pop r13 1c6f4: cf 90 pop r12 1c6f6: 08 95 ret 0001c6f8 : } #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) static void lcd_selftest_v() { (void)lcd_selftest(); 1c6f8: 0c 94 b6 e0 jmp 0x1c16c ; 0x1c16c 0001c6fc : } /// @brief unload filament for single material printer (used in M600 and M702) /// @param unloadLength Retract distance for removal (manual reload) void unload_filament(float unloadLength) { 1c6fc: cf 92 push r12 1c6fe: df 92 push r13 1c700: ef 92 push r14 1c702: ff 92 push r15 1c704: cf 93 push r28 1c706: 6b 01 movw r12, r22 1c708: 7c 01 movw r14, r24 custom_message_type = CustomMsg::FilamentLoading; 1c70a: 82 e0 ldi r24, 0x02 ; 2 1c70c: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT)); 1c710: 89 ea ldi r24, 0xA9 ; 169 1c712: 99 e5 ldi r25, 0x59 ; 89 1c714: 0e 94 3a 75 call 0xea74 ; 0xea74 1c718: 0e 94 94 de call 0x1bd28 ; 0x1bd28 FSensorBlockRunout fsBlockRunout; 1c71c: 0f 94 2b 79 call 0x2f256 ; 0x2f256 current_position[E_AXIS] -= FILAMENT_UNLOAD_FAST_RETRACT_LENGTH; 1c720: 20 e0 ldi r18, 0x00 ; 0 1c722: 30 e0 ldi r19, 0x00 ; 0 1c724: 44 e3 ldi r20, 0x34 ; 52 1c726: 52 e4 ldi r21, 0x42 ; 66 1c728: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 1c72c: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 1c730: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 1c734: 90 91 70 12 lds r25, 0x1270 ; 0x801270 1c738: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1c73c: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 1c740: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 1c744: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 1c748: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_FAST_RETRACT_FEEDRATE); 1c74c: 6a e0 ldi r22, 0x0A ; 10 1c74e: 77 e5 ldi r23, 0x57 ; 87 1c750: 8d ea ldi r24, 0xAD ; 173 1c752: 92 e4 ldi r25, 0x42 ; 66 1c754: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1c758: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[E_AXIS] -= FILAMENT_UNLOAD_SLOW_RETRACT_LENGTH; 1c75c: 20 e0 ldi r18, 0x00 ; 0 1c75e: 30 e0 ldi r19, 0x00 ; 0 1c760: 4c e0 ldi r20, 0x0C ; 12 1c762: 52 e4 ldi r21, 0x42 ; 66 1c764: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 1c768: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 1c76c: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 1c770: 90 91 70 12 lds r25, 0x1270 ; 0x801270 1c774: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1c778: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 1c77c: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 1c780: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 1c784: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_SLOW_RETRACT_FEEDRATE); 1c788: 69 e2 ldi r22, 0x29 ; 41 1c78a: 7c e5 ldi r23, 0x5C ; 92 1c78c: 85 e8 ldi r24, 0x85 ; 133 1c78e: 91 e4 ldi r25, 0x41 ; 65 1c790: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1c794: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Configurable length, by default it's 0. // only plan the move if the length is set to a non-zero value if (unloadLength) 1c798: 20 e0 ldi r18, 0x00 ; 0 1c79a: 30 e0 ldi r19, 0x00 ; 0 1c79c: a9 01 movw r20, r18 1c79e: c7 01 movw r24, r14 1c7a0: b6 01 movw r22, r12 1c7a2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1c7a6: 88 23 and r24, r24 1c7a8: e1 f0 breq .+56 ; 0x1c7e2 { current_position[E_AXIS] += unloadLength; 1c7aa: a7 01 movw r20, r14 1c7ac: 96 01 movw r18, r12 1c7ae: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 1c7b2: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 1c7b6: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 1c7ba: 90 91 70 12 lds r25, 0x1270 ; 0x801270 1c7be: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c7c2: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 1c7c6: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 1c7ca: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 1c7ce: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_buffer_line_curposXYZE(FILAMENT_CHANGE_UNLOAD_FEEDRATE); 1c7d2: 60 e0 ldi r22, 0x00 ; 0 1c7d4: 70 e0 ldi r23, 0x00 ; 0 1c7d6: 80 e2 ldi r24, 0x20 ; 32 1c7d8: 91 e4 ldi r25, 0x41 ; 65 1c7da: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1c7de: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } lcd_display_message_fullscreen_P(_T(MSG_PULL_OUT_FILAMENT)); 1c7e2: 88 e8 ldi r24, 0x88 ; 136 1c7e4: 96 e4 ldi r25, 0x46 ; 70 1c7e6: 0e 94 3a 75 call 0xea74 ; 0xea74 1c7ea: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 //disable extruder steppers so filament can be removed disable_e0(); 1c7ee: 14 9a sbi 0x02, 4 ; 2 _delay(100); 1c7f0: 64 e6 ldi r22, 0x64 ; 100 1c7f2: 70 e0 ldi r23, 0x00 ; 0 1c7f4: 80 e0 ldi r24, 0x00 ; 0 1c7f6: 90 e0 ldi r25, 0x00 ; 0 1c7f8: 0f 94 bd 0d call 0x21b7a ; 0x21b7a Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); 1c7fc: 82 e0 ldi r24, 0x02 ; 2 1c7fe: 0f 94 ad 25 call 0x24b5a ; 0x24b5a 1c802: c3 e3 ldi r28, 0x33 ; 51 uint8_t counterBeep = 0; while (!lcd_clicked() && (counterBeep < 50)) { 1c804: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1c808: 81 11 cpse r24, r1 1c80a: 07 c0 rjmp .+14 ; 0x1c81a 1c80c: c1 50 subi r28, 0x01 ; 1 1c80e: 29 f0 breq .+10 ; 0x1c81a delay_keep_alive(100); 1c810: 84 e6 ldi r24, 0x64 ; 100 1c812: 90 e0 ldi r25, 0x00 ; 0 1c814: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 1c818: f5 cf rjmp .-22 ; 0x1c804 counterBeep++; } st_synchronize(); 1c81a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 while (lcd_clicked()) delay_keep_alive(100); 1c81e: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1c822: 88 23 and r24, r24 1c824: 29 f0 breq .+10 ; 0x1c830 1c826: 84 e6 ldi r24, 0x64 ; 100 1c828: 90 e0 ldi r25, 0x00 ; 0 1c82a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 1c82e: f7 cf rjmp .-18 ; 0x1c81e lcd_update_enable(true); 1c830: 81 e0 ldi r24, 0x01 ; 1 1c832: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_setstatuspgm(MSG_WELCOME); 1c836: 86 ee ldi r24, 0xE6 ; 230 1c838: 9b e6 ldi r25, 0x6B ; 107 1c83a: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = CustomMsg::Status; 1c83e: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d clearFilamentAction(); 1c842: 0f 94 d6 0b call 0x217ac ; 0x217ac } 1c846: cf 91 pop r28 1c848: ff 90 pop r15 1c84a: ef 90 pop r14 1c84c: df 90 pop r13 1c84e: cf 90 pop r12 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 1c850: 0d 94 95 6d jmp 0x2db2a ; 0x2db2a 0001c854 : lang_select(LANG_ID_PRI); } #endif static void wait_preheat() { 1c854: cf 92 push r12 1c856: df 92 push r13 1c858: ef 92 push r14 1c85a: ff 92 push r15 current_position[Z_AXIS] = 100; //move in z axis to make space for loading filament 1c85c: 80 e0 ldi r24, 0x00 ; 0 1c85e: 90 e0 ldi r25, 0x00 ; 0 1c860: a8 ec ldi r26, 0xC8 ; 200 1c862: b2 e4 ldi r27, 0x42 ; 66 1c864: 80 93 69 12 sts 0x1269, r24 ; 0x801269 1c868: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 1c86c: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 1c870: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); 1c874: 65 e5 ldi r22, 0x55 ; 85 1c876: 75 e5 ldi r23, 0x55 ; 85 1c878: 85 e5 ldi r24, 0x55 ; 85 1c87a: 91 e4 ldi r25, 0x41 ; 65 1c87c: 0f 94 81 4c call 0x29902 ; 0x29902 delay_keep_alive(2000); 1c880: 80 ed ldi r24, 0xD0 ; 208 1c882: 97 e0 ldi r25, 0x07 ; 7 1c884: 0e 94 8e 8e call 0x11d1c ; 0x11d1c lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 1c888: 89 e8 ldi r24, 0x89 ; 137 1c88a: 9d e3 ldi r25, 0x3D ; 61 1c88c: 0e 94 3a 75 call 0xea74 ; 0xea74 1c890: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 1c894: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 1c898: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 1c89c: 07 2e mov r0, r23 1c89e: 00 0c add r0, r0 1c8a0: 88 0b sbc r24, r24 1c8a2: 99 0b sbc r25, r25 1c8a4: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1c8a8: 9b 01 movw r18, r22 1c8aa: ac 01 movw r20, r24 while (fabs(degHotend(0) - degTargetHotend(0)) > TEMP_HYSTERESIS) { 1c8ac: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1c8b0: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1c8b4: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1c8b8: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1c8bc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1c8c0: 9f 77 andi r25, 0x7F ; 127 1c8c2: 20 e0 ldi r18, 0x00 ; 0 1c8c4: 30 e0 ldi r19, 0x00 ; 0 1c8c6: 40 ea ldi r20, 0xA0 ; 160 1c8c8: 50 e4 ldi r21, 0x40 ; 64 1c8ca: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1c8ce: 18 16 cp r1, r24 1c8d0: b4 f5 brge .+108 ; 0x1c93e lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 1c8d2: 89 e8 ldi r24, 0x89 ; 137 1c8d4: 9d e3 ldi r25, 0x3D ; 61 1c8d6: 0e 94 3a 75 call 0xea74 ; 0xea74 1c8da: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_set_cursor(0, 4); 1c8de: 64 e0 ldi r22, 0x04 ; 4 1c8e0: 80 e0 ldi r24, 0x00 ; 0 1c8e2: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 1c8e6: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 1c8ea: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 1c8ee: 07 2e mov r0, r23 1c8f0: 00 0c add r0, r0 1c8f2: 88 0b sbc r24, r24 1c8f4: 99 0b sbc r25, r25 1c8f6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> //Print the hotend temperature (9 chars total) lcdui_print_temp(LCD_STR_THERMOMETER[0], (int)(degHotend(0) + 0.5), (int)(degTargetHotend(0) + 0.5)); 1c8fa: 20 e0 ldi r18, 0x00 ; 0 1c8fc: 30 e0 ldi r19, 0x00 ; 0 1c8fe: 40 e0 ldi r20, 0x00 ; 0 1c900: 5f e3 ldi r21, 0x3F ; 63 1c902: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c906: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1c90a: 6b 01 movw r12, r22 1c90c: 20 e0 ldi r18, 0x00 ; 0 1c90e: 30 e0 ldi r19, 0x00 ; 0 1c910: 40 e0 ldi r20, 0x00 ; 0 1c912: 5f e3 ldi r21, 0x3F ; 63 1c914: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 1c918: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 1c91c: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 1c920: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 1c924: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1c928: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 1c92c: a6 01 movw r20, r12 1c92e: 82 e8 ldi r24, 0x82 ; 130 1c930: 0f 94 9b 0c call 0x21936 ; 0x21936 delay_keep_alive(1000); 1c934: 88 ee ldi r24, 0xE8 ; 232 1c936: 93 e0 ldi r25, 0x03 ; 3 1c938: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 1c93c: ab cf rjmp .-170 ; 0x1c894 } } 1c93e: ff 90 pop r15 1c940: ef 90 pop r14 1c942: df 90 pop r13 1c944: cf 90 pop r12 1c946: 08 95 ret 0001c948 : //! @retval 0xFF button timeout (only possible if allow_timeouting is true) uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P( const char *const msg, bool allow_timeouting, uint8_t default_selection, const char *const first_choice, const char *const second_choice, const char *const third_choice, uint8_t second_col ) { 1c948: 2f 92 push r2 1c94a: 3f 92 push r3 1c94c: 4f 92 push r4 1c94e: 5f 92 push r5 1c950: 6f 92 push r6 1c952: 7f 92 push r7 1c954: 8f 92 push r8 1c956: 9f 92 push r9 1c958: af 92 push r10 1c95a: bf 92 push r11 1c95c: cf 92 push r12 1c95e: df 92 push r13 1c960: ef 92 push r14 1c962: ff 92 push r15 1c964: 0f 93 push r16 1c966: 1f 93 push r17 1c968: cf 93 push r28 1c96a: df 93 push r29 1c96c: 00 d0 rcall .+0 ; 0x1c96e 1c96e: 00 d0 rcall .+0 ; 0x1c970 1c970: cd b7 in r28, 0x3d ; 61 1c972: de b7 in r29, 0x3e ; 62 1c974: 5c 01 movw r10, r24 1c976: 6c 83 std Y+4, r22 ; 0x04 1c978: 34 2e mov r3, r20 1c97a: 3b 83 std Y+3, r19 ; 0x03 1c97c: 2a 83 std Y+2, r18 ; 0x02 1c97e: 48 01 movw r8, r16 1c980: 2c 2c mov r2, r12 const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL; 1c982: 00 97 sbiw r24, 0x00 ; 0 1c984: 09 f0 breq .+2 ; 0x1c988 1c986: 51 c0 rjmp .+162 ; 0x1ca2a bool multi_screen = msg_next != NULL; // Initial status/prompt on single-screen messages uint8_t current_selection = default_selection; if (!msg_next) { lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); 1c988: 87 01 movw r16, r14 1c98a: 22 2d mov r18, r2 1c98c: a4 01 movw r20, r8 1c98e: 6a 81 ldd r22, Y+2 ; 0x02 1c990: 7b 81 ldd r23, Y+3 ; 0x03 1c992: 83 2d mov r24, r3 1c994: 0e 94 71 df call 0x1bee2 ; 0x1bee2 1c998: d1 2c mov r13, r1 1c99a: c1 2c mov r12, r1 } // Wait for user confirmation or a timeout. unsigned long previous_millis_cmd = _millis(); 1c99c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1c9a0: 2b 01 movw r4, r22 1c9a2: 3c 01 movw r6, r24 lcd_consume_click(); 1c9a4: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 KEEPALIVE_STATE(PAUSED_FOR_USER); 1c9a8: 84 e0 ldi r24, 0x04 ; 4 1c9aa: 80 93 78 02 sts 0x0278, r24 ; 0x800278 1c9ae: de 82 std Y+6, r13 ; 0x06 1c9b0: cd 82 std Y+5, r12 ; 0x05 1c9b2: 24 e6 ldi r18, 0x64 ; 100 1c9b4: 29 83 std Y+1, r18 ; 0x01 for (;;) { for (uint8_t i = 0; i < 100; ++i) { delay_keep_alive(50); 1c9b6: 82 e3 ldi r24, 0x32 ; 50 1c9b8: 90 e0 ldi r25, 0x00 ; 0 1c9ba: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) { 1c9be: 3c 81 ldd r19, Y+4 ; 0x04 1c9c0: 31 11 cpse r19, r1 1c9c2: 3a c0 rjmp .+116 ; 0x1ca38 current_selection = LCD_BUTTON_TIMEOUT; goto exit; } if (lcd_encoder) { 1c9c4: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 1c9c8: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 1c9cc: 00 97 sbiw r24, 0x00 ; 0 1c9ce: 09 f0 breq .+2 ; 0x1c9d2 1c9d0: 42 c0 rjmp .+132 ; 0x1ca56 } else { Sound_MakeSound(e_SOUND_TYPE_BlindAlert); break; // turning knob skips waiting loop } } if (lcd_clicked()) { 1c9d2: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1c9d6: 88 23 and r24, r24 1c9d8: 09 f4 brne .+2 ; 0x1c9dc 1c9da: 67 c0 rjmp .+206 ; 0x1caaa if (msg_next == NULL) { 1c9dc: 8d 81 ldd r24, Y+5 ; 0x05 1c9de: 9e 81 ldd r25, Y+6 ; 0x06 1c9e0: 89 2b or r24, r25 1c9e2: 09 f0 breq .+2 ; 0x1c9e6 1c9e4: 5e c0 rjmp .+188 ; 0x1caa2 if (msg_next == NULL) { lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); } } exit: KEEPALIVE_STATE(IN_HANDLER); 1c9e6: 82 e0 ldi r24, 0x02 ; 2 1c9e8: 80 93 78 02 sts 0x0278, r24 ; 0x800278 // Enable LCD updates again. We may not call lcd_update_enable(true) // because it may create a recursion scenario when the caller of lcd_show_multiscreen_message_with_choices_and_wait_P // is a submenu lcd_update_enable(true) will cause another call to the submenu immediately // and so won't allow the user to exit the submenu lcd_update_enabled = true; 1c9ec: 91 e0 ldi r25, 0x01 ; 1 1c9ee: 90 93 5a 02 sts 0x025A, r25 ; 0x80025a lcd_draw_update = 2; 1c9f2: 80 93 59 02 sts 0x0259, r24 ; 0x800259 return current_selection; } 1c9f6: 83 2d mov r24, r3 1c9f8: 26 96 adiw r28, 0x06 ; 6 1c9fa: 0f b6 in r0, 0x3f ; 63 1c9fc: f8 94 cli 1c9fe: de bf out 0x3e, r29 ; 62 1ca00: 0f be out 0x3f, r0 ; 63 1ca02: cd bf out 0x3d, r28 ; 61 1ca04: df 91 pop r29 1ca06: cf 91 pop r28 1ca08: 1f 91 pop r17 1ca0a: 0f 91 pop r16 1ca0c: ff 90 pop r15 1ca0e: ef 90 pop r14 1ca10: df 90 pop r13 1ca12: cf 90 pop r12 1ca14: bf 90 pop r11 1ca16: af 90 pop r10 1ca18: 9f 90 pop r9 1ca1a: 8f 90 pop r8 1ca1c: 7f 90 pop r7 1ca1e: 6f 90 pop r6 1ca20: 5f 90 pop r5 1ca22: 4f 90 pop r4 1ca24: 3f 90 pop r3 1ca26: 2f 90 pop r2 1ca28: 08 95 ret uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P( const char *const msg, bool allow_timeouting, uint8_t default_selection, const char *const first_choice, const char *const second_choice, const char *const third_choice, uint8_t second_col ) { const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL; 1ca2a: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1ca2e: 6c 01 movw r12, r24 bool multi_screen = msg_next != NULL; // Initial status/prompt on single-screen messages uint8_t current_selection = default_selection; if (!msg_next) { 1ca30: 89 2b or r24, r25 1ca32: 09 f0 breq .+2 ; 0x1ca36 1ca34: b3 cf rjmp .-154 ; 0x1c99c 1ca36: a8 cf rjmp .-176 ; 0x1c988 lcd_consume_click(); KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { for (uint8_t i = 0; i < 100; ++i) { delay_keep_alive(50); if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) { 1ca38: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1ca3c: 64 19 sub r22, r4 1ca3e: 75 09 sbc r23, r5 1ca40: 86 09 sbc r24, r6 1ca42: 97 09 sbc r25, r7 1ca44: 61 33 cpi r22, 0x31 ; 49 1ca46: 75 47 sbci r23, 0x75 ; 117 1ca48: 81 05 cpc r24, r1 1ca4a: 91 05 cpc r25, r1 1ca4c: 08 f4 brcc .+2 ; 0x1ca50 1ca4e: ba cf rjmp .-140 ; 0x1c9c4 current_selection = LCD_BUTTON_TIMEOUT; 1ca50: 33 24 eor r3, r3 1ca52: 3a 94 dec r3 1ca54: c8 cf rjmp .-112 ; 0x1c9e6 goto exit; } if (lcd_encoder) { if (msg_next == NULL) { 1ca56: 2d 81 ldd r18, Y+5 ; 0x05 1ca58: 3e 81 ldd r19, Y+6 ; 0x06 1ca5a: 23 2b or r18, r19 1ca5c: f9 f4 brne .+62 ; 0x1ca9c if (third_choice) { // third_choice is not nullptr, safe to dereference 1ca5e: e1 14 cp r14, r1 1ca60: f1 04 cpc r15, r1 1ca62: b1 f0 breq .+44 ; 0x1ca90 if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 1ca64: 97 ff sbrs r25, 7 1ca66: 0f c0 rjmp .+30 ; 0x1ca86 1ca68: 31 10 cpse r3, r1 // Rotating knob counter clockwise current_selection--; 1ca6a: 3a 94 dec r3 } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) { // Rotating knob clockwise current_selection = LCD_MIDDLE_BUTTON_CHOICE; } } lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); 1ca6c: 87 01 movw r16, r14 1ca6e: 22 2d mov r18, r2 1ca70: a4 01 movw r20, r8 1ca72: 6a 81 ldd r22, Y+2 ; 0x02 1ca74: 7b 81 ldd r23, Y+3 ; 0x03 1ca76: 83 2d mov r24, r3 1ca78: 0e 94 71 df call 0x1bee2 ; 0x1bee2 lcd_encoder = 0; 1ca7c: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1ca80: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e 1ca84: a6 cf rjmp .-180 ; 0x1c9d2 if (msg_next == NULL) { if (third_choice) { // third_choice is not nullptr, safe to dereference if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { // Rotating knob counter clockwise current_selection--; } else if (lcd_encoder > 0 && current_selection != LCD_RIGHT_BUTTON_CHOICE) { 1ca86: 32 e0 ldi r19, 0x02 ; 2 1ca88: 33 16 cp r3, r19 1ca8a: 81 f3 breq .-32 ; 0x1ca6c // Rotating knob clockwise current_selection++; 1ca8c: 33 94 inc r3 1ca8e: ee cf rjmp .-36 ; 0x1ca6c } } else { if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 1ca90: 39 2e mov r3, r25 1ca92: 30 94 com r3 1ca94: 33 1c adc r3, r3 1ca96: 33 24 eor r3, r3 1ca98: 33 1c adc r3, r3 1ca9a: e8 cf rjmp .-48 ; 0x1ca6c } } lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); lcd_encoder = 0; } else { Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1ca9c: 87 e0 ldi r24, 0x07 ; 7 1ca9e: 0f 94 ad 25 call 0x24b5a ; 0x24b5a goto exit; } else break; } } if (multi_screen) { 1caa2: c1 14 cp r12, r1 1caa4: d1 04 cpc r13, r1 1caa6: 79 f4 brne .+30 ; 0x1cac6 1caa8: 84 cf rjmp .-248 ; 0x1c9b2 1caaa: 99 81 ldd r25, Y+1 ; 0x01 1caac: 91 50 subi r25, 0x01 ; 1 1caae: 99 83 std Y+1, r25 ; 0x01 // Wait for user confirmation or a timeout. unsigned long previous_millis_cmd = _millis(); lcd_consume_click(); KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { for (uint8_t i = 0; i < 100; ++i) { 1cab0: 91 11 cpse r25, r1 1cab2: 81 cf rjmp .-254 ; 0x1c9b6 goto exit; } else break; } } if (multi_screen) { 1cab4: c1 14 cp r12, r1 1cab6: d1 04 cpc r13, r1 1cab8: 61 f0 breq .+24 ; 0x1cad2 if (msg_next == NULL) { 1caba: 2d 81 ldd r18, Y+5 ; 0x05 1cabc: 3e 81 ldd r19, Y+6 ; 0x06 1cabe: 23 2b or r18, r19 1cac0: 11 f4 brne .+4 ; 0x1cac6 1cac2: be 82 std Y+6, r11 ; 0x06 1cac4: ad 82 std Y+5, r10 ; 0x05 msg_next = msg; } msg_next = lcd_display_message_fullscreen_P(msg_next); 1cac6: 8d 81 ldd r24, Y+5 ; 0x05 1cac8: 9e 81 ldd r25, Y+6 ; 0x06 1caca: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1cace: 9e 83 std Y+6, r25 ; 0x06 1cad0: 8d 83 std Y+5, r24 ; 0x05 } if (msg_next == NULL) { 1cad2: 8d 81 ldd r24, Y+5 ; 0x05 1cad4: 9e 81 ldd r25, Y+6 ; 0x06 1cad6: 89 2b or r24, r25 1cad8: 09 f0 breq .+2 ; 0x1cadc 1cada: 6b cf rjmp .-298 ; 0x1c9b2 lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); 1cadc: 87 01 movw r16, r14 1cade: 22 2d mov r18, r2 1cae0: a4 01 movw r20, r8 1cae2: 6a 81 ldd r22, Y+2 ; 0x02 1cae4: 7b 81 ldd r23, Y+3 ; 0x03 1cae6: 83 2d mov r24, r3 1cae8: 0e 94 71 df call 0x1bee2 ; 0x1bee2 1caec: 62 cf rjmp .-316 ; 0x1c9b2 0001caee : //! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected //! @retval 0 cont choice selected by user //! @retval 1 cancel choice selected by user //! @retval 0xFF button timeout (only possible if allow_timeouting is true) uint8_t lcd_show_multiscreen_message_cont_cancel_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection) //currently just max. n*4 + 3 lines supported (set in language header files) { 1caee: bf 92 push r11 1caf0: cf 92 push r12 1caf2: df 92 push r13 1caf4: ef 92 push r14 1caf6: ff 92 push r15 1caf8: 0f 93 push r16 1cafa: 1f 93 push r17 1cafc: cf 93 push r28 1cafe: df 93 push r29 1cb00: ec 01 movw r28, r24 1cb02: d6 2e mov r13, r22 1cb04: b4 2e mov r11, r20 return lcd_show_multiscreen_message_with_choices_and_wait_P(msg, allow_timeouting, default_selection, _T(MSG_CONTINUE_SHORT), _T(MSG_CANCEL), nullptr, 10); 1cb06: 89 e2 ldi r24, 0x29 ; 41 1cb08: 9d e3 ldi r25, 0x3D ; 61 1cb0a: 0e 94 3a 75 call 0xea74 ; 0xea74 1cb0e: 8c 01 movw r16, r24 1cb10: 8a e7 ldi r24, 0x7A ; 122 1cb12: 94 e4 ldi r25, 0x44 ; 68 1cb14: 0e 94 3a 75 call 0xea74 ; 0xea74 1cb18: 2a e0 ldi r18, 0x0A ; 10 1cb1a: c2 2e mov r12, r18 1cb1c: f1 2c mov r15, r1 1cb1e: e1 2c mov r14, r1 1cb20: 9c 01 movw r18, r24 1cb22: 4b 2d mov r20, r11 1cb24: 6d 2d mov r22, r13 1cb26: ce 01 movw r24, r28 1cb28: 0e 94 a4 e4 call 0x1c948 ; 0x1c948 } 1cb2c: df 91 pop r29 1cb2e: cf 91 pop r28 1cb30: 1f 91 pop r17 1cb32: 0f 91 pop r16 1cb34: ff 90 pop r15 1cb36: ef 90 pop r14 1cb38: df 90 pop r13 1cb3a: cf 90 pop r12 1cb3c: bf 90 pop r11 1cb3e: 08 95 ret 0001cb40 : MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop); MENU_END(); } void lcd_sdcard_menu() { 1cb40: 2f 92 push r2 1cb42: 3f 92 push r3 1cb44: 4f 92 push r4 1cb46: 5f 92 push r5 1cb48: 6f 92 push r6 1cb4a: 7f 92 push r7 1cb4c: 8f 92 push r8 1cb4e: 9f 92 push r9 1cb50: af 92 push r10 1cb52: bf 92 push r11 1cb54: cf 92 push r12 1cb56: df 92 push r13 1cb58: ef 92 push r14 1cb5a: ff 92 push r15 1cb5c: 0f 93 push r16 1cb5e: 1f 93 push r17 1cb60: cf 93 push r28 1cb62: df 93 push r29 1cb64: cd b7 in r28, 0x3d ; 61 1cb66: de b7 in r29, 0x3e ; 62 1cb68: 2d 97 sbiw r28, 0x0d ; 13 1cb6a: 0f b6 in r0, 0x3f ; 63 1cb6c: f8 94 cli 1cb6e: de bf out 0x3e, r29 ; 62 1cb70: 0f be out 0x3f, r0 ; 63 1cb72: cd bf out 0x3d, r28 ; 61 ShortTimer lcd_scrollTimer; } _menu_data_sdcard_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_sdcard_t),"_menu_data_sdcard_t doesn't fit into menu_data"); _menu_data_sdcard_t* _md = (_menu_data_sdcard_t*)&(menu_data[0]); switch(_md->menuState) 1cb74: 80 91 96 03 lds r24, 0x0396 ; 0x800396 1cb78: 81 30 cpi r24, 0x01 ; 1 1cb7a: 51 f1 breq .+84 ; 0x1cbd0 1cb7c: 30 f0 brcs .+12 ; 0x1cb8a 1cb7e: 82 30 cpi r24, 0x02 ; 2 1cb80: 09 f4 brne .+2 ; 0x1cb84 1cb82: 88 c2 rjmp .+1296 ; 0x1d094 { _md->lcd_scrollTimer.stop(); //forces redraw in _standard state _md->menuState = _standard; } } break; default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu. 1cb84: 10 92 96 03 sts 0x0396, r1 ; 0x800396 1cb88: 04 c1 rjmp .+520 ; 0x1cd92 switch(_md->menuState) { case _uninitialized: //Initialize menu data { if (card.presort_flag == true) //used to force resorting if sorting type is changed. 1cb8a: 80 91 26 14 lds r24, 0x1426 ; 0x801426 1cb8e: 88 23 and r24, r24 1cb90: 49 f0 breq .+18 ; 0x1cba4 { card.presort_flag = false; 1cb92: 10 92 26 14 sts 0x1426, r1 ; 0x801426 lcd_update_enabled = false; 1cb96: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a card.presort(); 1cb9a: 0f 94 32 6f call 0x2de64 ; 0x2de64 lcd_update_enabled = true; 1cb9e: 81 e0 ldi r24, 0x01 ; 1 1cba0: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a } _md->fileCnt = card.getnrfilenames(); 1cba4: 0f 94 4f 6c call 0x2d89e ; 0x2d89e 1cba8: 90 93 9e 03 sts 0x039E, r25 ; 0x80039e 1cbac: 80 93 9d 03 sts 0x039D, r24 ; 0x80039d _md->sdSort = farm_mode ? SD_SORT_NONE : eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); 1cbb0: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1cbb4: 81 11 cpse r24, r1 1cbb6: e7 c0 rjmp .+462 ; 0x1cd86 1cbb8: 89 e0 ldi r24, 0x09 ; 9 1cbba: 9f e0 ldi r25, 0x0F ; 15 1cbbc: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1cbc0: 80 93 a0 03 sts 0x03A0, r24 ; 0x8003a0 _md->menuState = _standard; 1cbc4: 81 e0 ldi r24, 0x01 ; 1 1cbc6: 80 93 96 03 sts 0x0396, r24 ; 0x800396 _md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state. 1cbca: 8f ef ldi r24, 0xFF ; 255 1cbcc: 80 93 9f 03 sts 0x039F, r24 ; 0x80039f } // FALLTHRU case _standard: //normal menu structure. { if (!_md->lcd_scrollTimer.running()) //if the timer is not running, then the menu state was just switched, so redraw the screen. 1cbd0: 80 91 a1 03 lds r24, 0x03A1 ; 0x8003a1 1cbd4: 81 11 cpse r24, r1 1cbd6: 07 c0 rjmp .+14 ; 0x1cbe6 { _md->lcd_scrollTimer.start(); 1cbd8: 81 ea ldi r24, 0xA1 ; 161 1cbda: 93 e0 ldi r25, 0x03 ; 3 1cbdc: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> lcd_draw_update = 1; 1cbe0: 81 e0 ldi r24, 0x01 ; 1 1cbe2: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } if ((lcd_draw_update == 0) && _md->lcd_scrollTimer.expired(500) && (_md->row != -1)) //switch to the scrolling state on timeout if a file/dir is selected. 1cbe6: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1cbea: 81 11 cpse r24, r1 1cbec: 21 c0 rjmp .+66 ; 0x1cc30 1cbee: 64 ef ldi r22, 0xF4 ; 244 1cbf0: 71 e0 ldi r23, 0x01 ; 1 1cbf2: 81 ea ldi r24, 0xA1 ; 161 1cbf4: 93 e0 ldi r25, 0x03 ; 3 1cbf6: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1cbfa: 88 23 and r24, r24 1cbfc: a1 f0 breq .+40 ; 0x1cc26 1cbfe: 80 91 9f 03 lds r24, 0x039F ; 0x80039f 1cc02: 8f 3f cpi r24, 0xFF ; 255 1cc04: 81 f0 breq .+32 ; 0x1cc26 { _md->menuState = _scrolling; 1cc06: 82 e0 ldi r24, 0x02 ; 2 1cc08: 80 93 96 03 sts 0x0396, r24 ; 0x800396 _md->offset = 0; 1cc0c: 10 92 97 03 sts 0x0397, r1 ; 0x800397 _md->scrollPointer = NULL; 1cc10: 10 92 9a 03 sts 0x039A, r1 ; 0x80039a 1cc14: 10 92 99 03 sts 0x0399, r1 ; 0x800399 _md->lcd_scrollTimer.start(); 1cc18: 81 ea ldi r24, 0xA1 ; 161 1cc1a: 93 e0 ldi r25, 0x03 ; 3 1cc1c: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> lcd_draw_update = 1; //forces last load before switching to scrolling. 1cc20: 81 e0 ldi r24, 0x01 ; 1 1cc22: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } if (lcd_draw_update == 0 && !lcd_clicked()) 1cc26: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1cc2a: 88 23 and r24, r24 1cc2c: 09 f4 brne .+2 ; 0x1cc30 1cc2e: ad c0 rjmp .+346 ; 0x1cd8a return; // nothing to do (so don't thrash the SD card) _md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state. 1cc30: 8f ef ldi r24, 0xFF ; 255 1cc32: 80 93 9f 03 sts 0x039F, r24 ; 0x80039f //if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer. _md->lcd_scrollTimer.start(); 1cc36: 81 ea ldi r24, 0xA1 ; 161 1cc38: 93 e0 ldi r25, 0x03 ; 3 1cc3a: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> MENU_BEGIN(); 1cc3e: 0e 94 0c 74 call 0xe818 ; 0xe818 1cc42: 10 92 60 04 sts 0x0460, r1 ; 0x800460 if(eFilamentAction != FilamentAction::None) return; // Create a copy of card.filename on the stack since card.filename pointer // will be modified by the SD card library when searching for the file char selected_filename[FILENAME_LENGTH]; strcpy(selected_filename, filename); 1cc46: ce 01 movw r24, r28 1cc48: 01 96 adiw r24, 0x01 ; 1 1cc4a: 7c 01 movw r14, r24 if (!check_file(selected_filename)) { result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false); lcd_update_enable(true); } if (result) { enquecommandf_P(MSG_M23, selected_filename); 1cc4c: f7 e6 ldi r31, 0x67 ; 103 1cc4e: 2f 2e mov r2, r31 1cc50: fc e6 ldi r31, 0x6C ; 108 1cc52: 3f 2e mov r3, r31 _md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state. //if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer. _md->lcd_scrollTimer.start(); MENU_BEGIN(); 1cc54: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1cc58: 84 30 cpi r24, 0x04 ; 4 1cc5a: 08 f0 brcs .+2 ; 0x1cc5e 1cc5c: 9a c0 rjmp .+308 ; 0x1cd92 1cc5e: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK)); // i.e. default menu-item / menu-item after card insertion 1cc62: 80 91 c9 03 lds r24, 0x03C9 ; 0x8003c9 1cc66: 88 23 and r24, r24 1cc68: 09 f4 brne .+2 ; 0x1cc6c 1cc6a: ac c0 rjmp .+344 ; 0x1cdc4 1cc6c: 8f ed ldi r24, 0xDF ; 223 1cc6e: 98 e4 ldi r25, 0x48 ; 72 1cc70: 0e 94 3a 75 call 0xea74 ; 0xea74 1cc74: 0e 94 ce 72 call 0xe59c ; 0xe59c sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; 1cc78: 69 ed ldi r22, 0xD9 ; 217 1cc7a: 73 e1 ldi r23, 0x13 ; 19 1cc7c: 82 e8 ldi r24, 0x82 ; 130 1cc7e: 94 e1 ldi r25, 0x14 ; 20 1cc80: 0f 94 f2 2e call 0x25de4 ; 0x25de4 card.getWorkDirName(); if (card.filename[0] == '/') 1cc84: 80 91 d9 13 lds r24, 0x13D9 ; 0x8013d9 1cc88: 8f 32 cpi r24, 0x2F ; 47 1cc8a: 09 f0 breq .+2 ; 0x1cc8e 1cc8c: 9e c0 rjmp .+316 ; 0x1cdca { #if SDCARDDETECT == -1 MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); #else if (card.ToshibaFlashAir_isEnabled()) 1cc8e: 80 91 48 16 lds r24, 0x1648 ; 0x801648 1cc92: 88 23 and r24, r24 1cc94: 41 f0 breq .+16 ; 0x1cca6 MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); //show the refresh option if in flashAir mode. 1cc96: 84 ed ldi r24, 0xD4 ; 212 1cc98: 98 e4 ldi r25, 0x48 ; 72 1cc9a: 0e 94 3a 75 call 0xea74 ; 0xea74 1cc9e: 6d e5 ldi r22, 0x5D ; 93 1cca0: 7f ec ldi r23, 0xCF ; 207 #endif } else MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir. 1cca2: 0e 94 9d 72 call 0xe53a ; 0xe53a for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom. 1cca6: c0 90 9d 03 lds r12, 0x039D ; 0x80039d 1ccaa: d0 90 9e 03 lds r13, 0x039E ; 0x80039e } if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = false; menu_action_sdfile(str_fn); lcd_update_enabled = true; 1ccae: 01 e0 ldi r16, 0x01 ; 1 #endif } else MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir. for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom. 1ccb0: 91 e0 ldi r25, 0x01 ; 1 1ccb2: c9 1a sub r12, r25 1ccb4: d1 08 sbc r13, r1 1ccb6: 08 f4 brcc .+2 ; 0x1ccba 1ccb8: e0 c1 rjmp .+960 ; 0x1d07a { if (menu_item == menu_line) //If the file is on the screen. 1ccba: 80 91 63 04 lds r24, 0x0463 ; 0x800463 1ccbe: 90 91 62 04 lds r25, 0x0462 ; 0x800462 1ccc2: 89 13 cpse r24, r25 1ccc4: d6 c1 rjmp .+940 ; 0x1d072 { //load filename to memory. #ifdef SDCARD_SORT_ALPHA card.getfilename_sorted(i, _md->sdSort); 1ccc6: 60 91 a0 03 lds r22, 0x03A0 ; 0x8003a0 1ccca: c6 01 movw r24, r12 1cccc: 0f 94 a9 77 call 0x2ef52 ; 0x2ef52 #else card.getfilename(i); #endif if (lcd_encoder == menu_item) //If the file is selected. 1ccd0: 80 91 63 04 lds r24, 0x0463 ; 0x800463 1ccd4: 90 e0 ldi r25, 0x00 ; 0 1ccd6: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 1ccda: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 1ccde: 10 91 23 14 lds r17, 0x1423 ; 0x801423 1cce2: 82 17 cp r24, r18 1cce4: 93 07 cpc r25, r19 1cce6: 51 f4 brne .+20 ; 0x1ccfc { _md->selectedFileID = i; 1cce8: d0 92 9c 03 sts 0x039C, r13 ; 0x80039c 1ccec: c0 92 9b 03 sts 0x039B, r12 ; 0x80039b _md->isDir = card.filenameIsDir; 1ccf0: 10 93 98 03 sts 0x0398, r17 ; 0x800398 _md->row = menu_row; 1ccf4: 40 91 60 04 lds r20, 0x0460 ; 0x800460 1ccf8: 40 93 9f 03 sts 0x039F, r20 ; 0x80039f 1ccfc: 40 91 59 02 lds r20, 0x0259 ; 0x800259 } if (card.filenameIsDir) 1cd00: 11 23 and r17, r17 1cd02: 09 f4 brne .+2 ; 0x1cd06 1cd04: 67 c0 rjmp .+206 ; 0x1cdd4 #define MENU_ITEM_SDFILE(str_fn, str_fnl) do { menu_item_sdfile(str_fn, str_fnl); } while (0) static void menu_item_sddir(const char* str_fn, char* str_fnl) { if (lcd_draw_update) 1cd06: 44 23 and r20, r20 1cd08: e9 f0 breq .+58 ; 0x1cd44 { lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); 1cd0a: 40 91 ee 13 lds r20, 0x13EE ; 0x8013ee 1cd0e: e9 ed ldi r30, 0xD9 ; 217 1cd10: ae 2e mov r10, r30 1cd12: e3 e1 ldi r30, 0x13 ; 19 1cd14: be 2e mov r11, r30 1cd16: 44 23 and r20, r20 1cd18: 21 f0 breq .+8 ; 0x1cd22 1cd1a: 7e ee ldi r23, 0xEE ; 238 1cd1c: a7 2e mov r10, r23 1cd1e: 73 e1 ldi r23, 0x13 ; 19 1cd20: b7 2e mov r11, r23 1cd22: 60 91 60 04 lds r22, 0x0460 ; 0x800460 } static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* longFilename) { uint8_t len = LCD_WIDTH - 2; lcd_putc_at(0, row, (lcd_encoder == menu_item)?'>':' '); 1cd26: 4e e3 ldi r20, 0x3E ; 62 1cd28: 82 17 cp r24, r18 1cd2a: 93 07 cpc r25, r19 1cd2c: 09 f0 breq .+2 ; 0x1cd30 1cd2e: 40 e2 ldi r20, 0x20 ; 32 1cd30: 80 e0 ldi r24, 0x00 ; 0 1cd32: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_putc(LCD_STR_FOLDER[0]); 1cd36: 85 e8 ldi r24, 0x85 ; 133 1cd38: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_print_pad(longFilename, len); 1cd3c: 62 e1 ldi r22, 0x12 ; 18 1cd3e: c5 01 movw r24, r10 1cd40: 0e 94 47 73 call 0xe68e ; 0xe68e 1cd44: 80 91 63 04 lds r24, 0x0463 ; 0x800463 { if (lcd_draw_update) { lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); } if (menu_clicked && (lcd_encoder == menu_item)) 1cd48: 90 91 61 04 lds r25, 0x0461 ; 0x800461 1cd4c: 99 23 and r25, r25 1cd4e: 09 f4 brne .+2 ; 0x1cd52 1cd50: 90 c1 rjmp .+800 ; 0x1d072 1cd52: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 1cd56: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 1cd5a: 82 17 cp r24, r18 1cd5c: 13 06 cpc r1, r19 1cd5e: 09 f0 breq .+2 ; 0x1cd62 1cd60: 88 c1 rjmp .+784 ; 0x1d072 { lcd_update_enabled = false; 1cd62: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a lcd_return_to_status(); } void menu_action_sddirectory(const char* filename) { card.chdir(filename, true); 1cd66: 61 e0 ldi r22, 0x01 ; 1 1cd68: 89 ed ldi r24, 0xD9 ; 217 1cd6a: 93 e1 ldi r25, 0x13 ; 19 1cd6c: 0f 94 bc 70 call 0x2e178 ; 0x2e178 lcd_encoder = 0; 1cd70: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1cd74: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e menu_data_reset(); //Forces reloading of cached variables. 1cd78: 0e 94 af 62 call 0xc55e ; 0xc55e } if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = false; menu_action_sdfile(str_fn); lcd_update_enabled = true; 1cd7c: 00 93 5a 02 sts 0x025A, r16 ; 0x80025a menu_item_ret(); 1cd80: 0e 94 73 62 call 0xc4e6 ; 0xc4e6 1cd84: 95 cf rjmp .-214 ; 0x1ccb0 lcd_update_enabled = false; card.presort(); lcd_update_enabled = true; } _md->fileCnt = card.getnrfilenames(); _md->sdSort = farm_mode ? SD_SORT_NONE : eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); 1cd86: 82 e0 ldi r24, 0x02 ; 2 1cd88: 1b cf rjmp .-458 ; 0x1cbc0 _md->offset = 0; _md->scrollPointer = NULL; _md->lcd_scrollTimer.start(); lcd_draw_update = 1; //forces last load before switching to scrolling. } if (lcd_draw_update == 0 && !lcd_clicked()) 1cd8a: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1cd8e: 81 11 cpse r24, r1 1cd90: 4f cf rjmp .-354 ; 0x1cc30 _md->menuState = _standard; } } break; default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu. } } 1cd92: 2d 96 adiw r28, 0x0d ; 13 1cd94: 0f b6 in r0, 0x3f ; 63 1cd96: f8 94 cli 1cd98: de bf out 0x3e, r29 ; 62 1cd9a: 0f be out 0x3f, r0 ; 63 1cd9c: cd bf out 0x3d, r28 ; 61 1cd9e: df 91 pop r29 1cda0: cf 91 pop r28 1cda2: 1f 91 pop r17 1cda4: 0f 91 pop r16 1cda6: ff 90 pop r15 1cda8: ef 90 pop r14 1cdaa: df 90 pop r13 1cdac: cf 90 pop r12 1cdae: bf 90 pop r11 1cdb0: af 90 pop r10 1cdb2: 9f 90 pop r9 1cdb4: 8f 90 pop r8 1cdb6: 7f 90 pop r7 1cdb8: 6f 90 pop r6 1cdba: 5f 90 pop r5 1cdbc: 4f 90 pop r4 1cdbe: 3f 90 pop r3 1cdc0: 2f 90 pop r2 1cdc2: 08 95 ret //if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer. _md->lcd_scrollTimer.start(); MENU_BEGIN(); MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK)); // i.e. default menu-item / menu-item after card insertion 1cdc4: 88 ee ldi r24, 0xE8 ; 232 1cdc6: 9a e4 ldi r25, 0x4A ; 74 1cdc8: 53 cf rjmp .-346 ; 0x1cc70 if (card.ToshibaFlashAir_isEnabled()) MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); //show the refresh option if in flashAir mode. #endif } else MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir. 1cdca: 67 e6 ldi r22, 0x67 ; 103 1cdcc: 7f ec ldi r23, 0xCF ; 207 1cdce: 85 ec ldi r24, 0xC5 ; 197 1cdd0: 93 e8 ldi r25, 0x83 ; 131 1cdd2: 67 cf rjmp .-306 ; 0x1cca2 menu_item++; } static void menu_item_sdfile(const char* str_fn, char* str_fnl) { if (lcd_draw_update) 1cdd4: 44 23 and r20, r20 1cdd6: d1 f0 breq .+52 ; 0x1ce0c { lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); 1cdd8: 40 91 ee 13 lds r20, 0x13EE ; 0x8013ee 1cddc: 69 ed ldi r22, 0xD9 ; 217 1cdde: a6 2e mov r10, r22 1cde0: 63 e1 ldi r22, 0x13 ; 19 1cde2: b6 2e mov r11, r22 1cde4: 44 23 and r20, r20 1cde6: 21 f0 breq .+8 ; 0x1cdf0 1cde8: 5e ee ldi r21, 0xEE ; 238 1cdea: a5 2e mov r10, r21 1cdec: 53 e1 ldi r21, 0x13 ; 19 1cdee: b5 2e mov r11, r21 1cdf0: 60 91 60 04 lds r22, 0x0460 ; 0x800460 bool bSettings; // flag (i.e. 'fake parameter') for 'lcd_hw_setup_menu()' function static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename) { uint8_t len = LCD_WIDTH - 1; lcd_putc_at(0, row, (lcd_encoder == menu_item)?'>':' '); 1cdf4: 4e e3 ldi r20, 0x3E ; 62 1cdf6: 82 17 cp r24, r18 1cdf8: 93 07 cpc r25, r19 1cdfa: 09 f0 breq .+2 ; 0x1cdfe 1cdfc: 40 e2 ldi r20, 0x20 ; 32 1cdfe: 80 e0 ldi r24, 0x00 ; 0 1ce00: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_print_pad(longFilename, len); 1ce04: 63 e1 ldi r22, 0x13 ; 19 1ce06: c5 01 movw r24, r10 1ce08: 0e 94 47 73 call 0xe68e ; 0xe68e 1ce0c: 80 91 63 04 lds r24, 0x0463 ; 0x800463 { if (lcd_draw_update) { lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); } if (menu_clicked && (lcd_encoder == menu_item)) 1ce10: 90 91 61 04 lds r25, 0x0461 ; 0x800461 1ce14: 99 23 and r25, r25 1ce16: 09 f4 brne .+2 ; 0x1ce1a 1ce18: 2c c1 rjmp .+600 ; 0x1d072 1ce1a: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 1ce1e: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 1ce22: 82 17 cp r24, r18 1ce24: 13 06 cpc r1, r19 1ce26: 09 f0 breq .+2 ; 0x1ce2a 1ce28: 24 c1 rjmp .+584 ; 0x1d072 { lcd_update_enabled = false; 1ce2a: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a return result; } static void menu_action_sdfile(const char* filename) { if(eFilamentAction != FilamentAction::None) return; 1ce2e: 80 91 94 03 lds r24, 0x0394 ; 0x800394 1ce32: 81 11 cpse r24, r1 1ce34: a3 cf rjmp .-186 ; 0x1cd7c // Create a copy of card.filename on the stack since card.filename pointer // will be modified by the SD card library when searching for the file char selected_filename[FILENAME_LENGTH]; strcpy(selected_filename, filename); 1ce36: 69 ed ldi r22, 0xD9 ; 217 1ce38: 73 e1 ldi r23, 0x13 ; 19 1ce3a: c7 01 movw r24, r14 1ce3c: 0f 94 4b aa call 0x35496 ; 0x35496 1ce40: 47 01 movw r8, r14 1ce42: 45 e9 ldi r20, 0x95 ; 149 1ce44: a4 2e mov r10, r20 1ce46: 4f e0 ldi r20, 0x0F ; 15 1ce48: b4 2e mov r11, r20 bool result = true; //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco" for (uint_least8_t i = 0; i < 8; i++) { if (selected_filename[i] == '\0' || selected_filename[i] == '.') { 1ce4a: f4 01 movw r30, r8 1ce4c: 61 91 ld r22, Z+ 1ce4e: 4f 01 movw r8, r30 1ce50: 66 23 and r22, r22 1ce52: 19 f0 breq .+6 ; 0x1ce5a 1ce54: 6e 32 cpi r22, 0x2E ; 46 1ce56: 09 f0 breq .+2 ; 0x1ce5a 1ce58: 4b c0 rjmp .+150 ; 0x1cef0 1ce5a: 60 e0 ldi r22, 0x00 ; 0 1ce5c: c5 01 movw r24, r10 1ce5e: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t*)EEPROM_FILENAME + i, selected_filename[i]); } } // Write the DOS 8.3 file extension into EEPROM char * extension_ptr = strchr(selected_filename, '.'); 1ce62: 6e e2 ldi r22, 0x2E ; 46 1ce64: 70 e0 ldi r23, 0x00 ; 0 1ce66: c7 01 movw r24, r14 1ce68: 0f 94 37 aa call 0x3546e ; 0x3546e 1ce6c: 3c 01 movw r6, r24 if (extension_ptr) { 1ce6e: 89 2b or r24, r25 1ce70: 19 f0 breq .+6 ; 0x1ce78 extension_ptr++; // skip the '.' 1ce72: 8f ef ldi r24, 0xFF ; 255 1ce74: 68 1a sub r6, r24 1ce76: 78 0a sbc r7, r24 1ce78: 43 01 movw r8, r6 if(eFilamentAction != FilamentAction::None) return; // Create a copy of card.filename on the stack since card.filename pointer // will be modified by the SD card library when searching for the file char selected_filename[FILENAME_LENGTH]; strcpy(selected_filename, filename); 1ce7a: 31 e9 ldi r19, 0x91 ; 145 1ce7c: a3 2e mov r10, r19 1ce7e: 3c e0 ldi r19, 0x0C ; 12 1ce80: b3 2e mov r11, r19 extension_ptr++; // skip the '.' } for (uint_least8_t i = 0; i < 3; i++) { if (extension_ptr == NULL || extension_ptr[i] == '\0') { 1ce82: 61 14 cp r6, r1 1ce84: 71 04 cpc r7, r1 1ce86: 21 f0 breq .+8 ; 0x1ce90 1ce88: f4 01 movw r30, r8 1ce8a: 60 81 ld r22, Z 1ce8c: 61 11 cpse r22, r1 1ce8e: 01 c0 rjmp .+2 ; 0x1ce92 1ce90: 60 e0 ldi r22, 0x00 ; 0 1ce92: c5 01 movw r24, r10 1ce94: 0f 94 04 a4 call 0x34808 ; 0x34808 1ce98: ff ef ldi r31, 0xFF ; 255 1ce9a: af 1a sub r10, r31 1ce9c: bf 0a sbc r11, r31 1ce9e: 2f ef ldi r18, 0xFF ; 255 1cea0: 82 1a sub r8, r18 1cea2: 92 0a sbc r9, r18 if (extension_ptr) { extension_ptr++; // skip the '.' } for (uint_least8_t i = 0; i < 3; i++) 1cea4: 84 e9 ldi r24, 0x94 ; 148 1cea6: a8 16 cp r10, r24 1cea8: 8c e0 ldi r24, 0x0C ; 12 1ceaa: b8 06 cpc r11, r24 1ceac: 51 f7 brne .-44 ; 0x1ce82 { workDirParents[level].getFilename(name); } uint8_t CardReader::getWorkDirDepth() { return workDirDepth; 1ceae: 60 90 77 15 lds r6, 0x1577 ; 0x801577 1ceb2: 66 2d mov r22, r6 1ceb4: 8a e5 ldi r24, 0x5A ; 90 1ceb6: 9f e0 ldi r25, 0x0F ; 15 1ceb8: 0f 94 04 a4 call 0x34808 ; 0x34808 1cebc: 85 ed ldi r24, 0xD5 ; 213 1cebe: 93 e1 ldi r25, 0x13 ; 19 1cec0: 2a e0 ldi r18, 0x0A ; 10 1cec2: a2 2e mov r10, r18 1cec4: 2f e0 ldi r18, 0x0F ; 15 1cec6: b2 2e mov r11, r18 } const uint8_t depth = card.getWorkDirDepth(); eeprom_update_byte_notify((uint8_t*)EEPROM_DIR_DEPTH, depth); for (uint_least8_t i = 0; i < depth; i++) { 1cec8: 71 2c mov r7, r1 1ceca: 4c 01 movw r8, r24 1cecc: e9 e0 ldi r30, 0x09 ; 9 1cece: 8e 0e add r8, r30 1ced0: 91 1c adc r9, r1 1ced2: 76 14 cp r7, r6 1ced4: d1 f0 breq .+52 ; 0x1cf0a #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 1ced6: 48 e0 ldi r20, 0x08 ; 8 1ced8: 50 e0 ldi r21, 0x00 ; 0 1ceda: b5 01 movw r22, r10 1cedc: 8e 5a subi r24, 0xAE ; 174 1cede: 9f 4f sbci r25, 0xFF ; 255 1cee0: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 1cee4: 73 94 inc r7 1cee6: f8 e0 ldi r31, 0x08 ; 8 1cee8: af 0e add r10, r31 1ceea: b1 1c adc r11, r1 1ceec: c4 01 movw r24, r8 1ceee: ed cf rjmp .-38 ; 0x1ceca if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1cef0: c5 01 movw r24, r10 1cef2: 0f 94 04 a4 call 0x34808 ; 0x34808 1cef6: ff ef ldi r31, 0xFF ; 255 1cef8: af 1a sub r10, r31 1cefa: bf 0a sbc r11, r31 strcpy(selected_filename, filename); bool result = true; //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco" for (uint_least8_t i = 0; i < 8; i++) { 1cefc: 2d e9 ldi r18, 0x9D ; 157 1cefe: a2 16 cp r10, r18 1cf00: 2f e0 ldi r18, 0x0F ; 15 1cf02: b2 06 cpc r11, r18 1cf04: 09 f0 breq .+2 ; 0x1cf08 1cf06: a1 cf rjmp .-190 ; 0x1ce4a 1cf08: ac cf rjmp .-168 ; 0x1ce62 /** End of menus **/ /** Menu action functions **/ static bool check_file(const char* filename) { if (farm_mode) return true; 1cf0a: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1cf0e: 88 23 and r24, r24 1cf10: 91 f0 breq .+36 ; 0x1cf36 if (!check_file(selected_filename)) { result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false); lcd_update_enable(true); } if (result) { enquecommandf_P(MSG_M23, selected_filename); 1cf12: ff 92 push r15 1cf14: ef 92 push r14 1cf16: 3f 92 push r3 1cf18: 2f 92 push r2 1cf1a: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommand_P(MSG_M24); 1cf1e: 61 e0 ldi r22, 0x01 ; 1 1cf20: 83 e6 ldi r24, 0x63 ; 99 1cf22: 9c e6 ldi r25, 0x6C ; 108 1cf24: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 1cf28: 0f 90 pop r0 1cf2a: 0f 90 pop r0 1cf2c: 0f 90 pop r0 1cf2e: 0f 90 pop r0 } lcd_return_to_status(); 1cf30: 0f 94 d5 07 call 0x20faa ; 0x20faa 1cf34: 23 cf rjmp .-442 ; 0x1cd7c /** Menu action functions **/ static bool check_file(const char* filename) { if (farm_mode) return true; card.openFileReadFilteredGcode(filename, true); 1cf36: 61 e0 ldi r22, 0x01 ; 1 1cf38: c7 01 movw r24, r14 1cf3a: 0f 94 f3 71 call 0x2e3e6 ; 0x2e3e6 } uint32_t CardReader::getFileSize() { return filesize; 1cf3e: 40 90 e4 16 lds r4, 0x16E4 ; 0x8016e4 1cf42: 50 90 e5 16 lds r5, 0x16E5 ; 0x8016e5 1cf46: 60 90 e6 16 lds r6, 0x16E6 ; 0x8016e6 1cf4a: 70 90 e7 16 lds r7, 0x16E7 ; 0x8016e7 bool result = false; const uint32_t filesize = card.getFileSize(); uint32_t startPos = 0; const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize); 1cf4e: 94 2d mov r25, r4 1cf50: 85 2d mov r24, r5 1cf52: 21 e0 ldi r18, 0x01 ; 1 1cf54: 42 16 cp r4, r18 1cf56: 28 e7 ldi r18, 0x78 ; 120 1cf58: 52 06 cpc r5, r18 1cf5a: 61 04 cpc r6, r1 1cf5c: 71 04 cpc r7, r1 1cf5e: 10 f0 brcs .+4 ; 0x1cf64 1cf60: 90 e0 ldi r25, 0x00 ; 0 1cf62: 88 e7 ldi r24, 0x78 ; 120 1cf64: a9 2e mov r10, r25 1cf66: b8 2e mov r11, r24 if (filesize > END_FILE_SECTION) { 1cf68: 81 e0 ldi r24, 0x01 ; 1 1cf6a: 48 16 cp r4, r24 1cf6c: 88 e7 ldi r24, 0x78 ; 120 1cf6e: 58 06 cpc r5, r24 1cf70: 61 04 cpc r6, r1 1cf72: 71 04 cpc r7, r1 1cf74: 08 f4 brcc .+2 ; 0x1cf78 1cf76: 5d c0 rjmp .+186 ; 0x1d032 startPos = filesize - END_FILE_SECTION; 1cf78: 98 e7 ldi r25, 0x78 ; 120 1cf7a: 59 1a sub r5, r25 1cf7c: 61 08 sbc r6, r1 1cf7e: 71 08 sbc r7, r1 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; 1cf80: 40 92 eb 16 sts 0x16EB, r4 ; 0x8016eb 1cf84: 50 92 ec 16 sts 0x16EC, r5 ; 0x8016ec 1cf88: 60 92 ed 16 sts 0x16ED, r6 ; 0x8016ed 1cf8c: 70 92 ee 16 sts 0x16EE, r7 ; 0x8016ee 1cf90: c3 01 movw r24, r6 1cf92: b2 01 movw r22, r4 1cf94: 0f 94 17 68 call 0x2d02e ; 0x2d02e card.setIndex(startPos); } cmdqueue_reset(); 1cf98: 0e 94 3c 85 call 0x10a78 ; 0x10a78 cmdqueue_serial_disabled = true; 1cf9c: 00 93 93 03 sts 0x0393, r16 ; 0x800393 menu_progressbar_init(bytesToCheck, _T(MSG_CHECKING_FILE)); 1cfa0: 81 eb ldi r24, 0xB1 ; 177 1cfa2: 98 e4 ldi r25, 0x48 ; 72 1cfa4: 0e 94 3a 75 call 0xea74 ; 0xea74 1cfa8: bc 01 movw r22, r24 1cfaa: c5 01 movw r24, r10 1cfac: 0e 94 11 72 call 0xe422 ; 0xe422 void getfilename_sorted(const uint16_t nr, uint8_t sdSort); void getfilename_afterMaxSorting(uint16_t entry, const char * const match = NULL); #endif FORCE_INLINE bool isFileOpen() { return file.isOpen(); } bool eof() { return sdpos>=filesize; } 1cfb0: 80 91 eb 16 lds r24, 0x16EB ; 0x8016eb 1cfb4: 90 91 ec 16 lds r25, 0x16EC ; 0x8016ec 1cfb8: a0 91 ed 16 lds r26, 0x16ED ; 0x8016ed 1cfbc: b0 91 ee 16 lds r27, 0x16EE ; 0x8016ee while (!card.eof() && !result) { 1cfc0: 40 91 e4 16 lds r20, 0x16E4 ; 0x8016e4 1cfc4: 50 91 e5 16 lds r21, 0x16E5 ; 0x8016e5 1cfc8: 60 91 e6 16 lds r22, 0x16E6 ; 0x8016e6 1cfcc: 70 91 e7 16 lds r23, 0x16E7 ; 0x8016e7 1cfd0: 84 17 cp r24, r20 1cfd2: 95 07 cpc r25, r21 1cfd4: a6 07 cpc r26, r22 1cfd6: b7 07 cpc r27, r23 1cfd8: 80 f5 brcc .+96 ; 0x1d03a 1cfda: 11 11 cpse r17, r1 1cfdc: 2e c0 rjmp .+92 ; 0x1d03a return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; 1cfde: 20 91 6a 16 lds r18, 0x166A ; 0x80166a 1cfe2: 21 11 cpse r18, r1 1cfe4: 03 c0 rjmp .+6 ; 0x1cfec 1cfe6: 80 e0 ldi r24, 0x00 ; 0 1cfe8: 90 e0 ldi r25, 0x00 ; 0 1cfea: dc 01 movw r26, r24 menu_progressbar_update(card.get_sdpos() - startPos); 1cfec: 84 19 sub r24, r4 1cfee: 95 09 sbc r25, r5 1cff0: 0e 94 47 71 call 0xe28e ; 0xe28e card.sdprinting = true; 1cff4: 00 93 d7 13 sts 0x13D7, r16 ; 0x8013d7 get_command(); 1cff8: 0e 94 a5 87 call 0x10f4a ; 0x10f4a #endif // LIN_ADVANCE bool check_commands() { bool end_command_found = false; while (buflen) 1cffc: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1d000: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 1d004: 89 2b or r24, r25 1d006: a1 f2 breq .-88 ; 0x1cfb0 { if ((code_seen_P(MSG_M84)) || (code_seen_P(PSTR("M 84")))) end_command_found = true; 1d008: 8e e8 ldi r24, 0x8E ; 142 1d00a: 98 e6 ldi r25, 0x68 ; 104 1d00c: 0f 94 62 3c call 0x278c4 ; 0x278c4 1d010: 81 11 cpse r24, r1 1d012: 05 c0 rjmp .+10 ; 0x1d01e 1d014: 80 ec ldi r24, 0xC0 ; 192 1d016: 93 e8 ldi r25, 0x83 ; 131 1d018: 0f 94 62 3c call 0x278c4 ; 0x278c4 1d01c: 81 11 cpse r24, r1 1d01e: 11 e0 ldi r17, 0x01 ; 1 if (!cmdbuffer_front_already_processed) 1d020: 80 91 53 12 lds r24, 0x1253 ; 0x801253 1d024: 81 11 cpse r24, r1 1d026: 02 c0 rjmp .+4 ; 0x1d02c cmdqueue_pop_front(); 1d028: 0e 94 43 79 call 0xf286 ; 0xf286 cmdbuffer_front_already_processed = false; 1d02c: 10 92 53 12 sts 0x1253, r1 ; 0x801253 1d030: e5 cf rjmp .-54 ; 0x1cffc static bool check_file(const char* filename) { if (farm_mode) return true; card.openFileReadFilteredGcode(filename, true); bool result = false; const uint32_t filesize = card.getFileSize(); uint32_t startPos = 0; 1d032: 41 2c mov r4, r1 1d034: 51 2c mov r5, r1 1d036: 32 01 movw r6, r4 1d038: af cf rjmp .-162 ; 0x1cf98 // with the CMDBUFFER_DEBUG enabled manage_heater(); #endif // CMDBUFFER_DEBUG } menu_progressbar_finish(); 1d03a: 0e 94 68 71 call 0xe2d0 ; 0xe2d0 cmdqueue_serial_disabled = false; 1d03e: 10 92 93 03 sts 0x0393, r1 ; 0x800393 card.printingHasFinished(); 1d042: 0f 94 2b 73 call 0x2e656 ; 0x2e656 lcd_setstatuspgm(MSG_WELCOME); 1d046: 86 ee ldi r24, 0xE6 ; 230 1d048: 9b e6 ldi r25, 0x6B ; 107 1d04a: 0e 94 94 de call 0x1bd28 ; 0x1bd28 for (uint_least8_t i = 0; i < depth; i++) { eeprom_update_block_notify(card.dir_names[i], (uint8_t*)EEPROM_DIRS + 8 * i, 8); } if (!check_file(selected_filename)) { 1d04e: 11 11 cpse r17, r1 1d050: 60 cf rjmp .-320 ; 0x1cf12 result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false); 1d052: 81 ec ldi r24, 0xC1 ; 193 1d054: 98 e4 ldi r25, 0x48 ; 72 1d056: 0e 94 3a 75 call 0xea74 ; 0xea74 1d05a: 41 e0 ldi r20, 0x01 ; 1 1d05c: 60 e0 ldi r22, 0x00 ; 0 1d05e: 0e 94 77 e5 call 0x1caee ; 0x1caee 1d062: 18 2f mov r17, r24 lcd_update_enable(true); 1d064: 81 e0 ldi r24, 0x01 ; 1 1d066: 0e 94 38 70 call 0xe070 ; 0xe070 } if (result) { 1d06a: 11 23 and r17, r17 1d06c: 09 f4 brne .+2 ; 0x1d070 1d06e: 51 cf rjmp .-350 ; 0x1cf12 1d070: 5f cf rjmp .-322 ; 0x1cf30 lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char); } void menu_item_dummy(void) { menu_item++; 1d072: 8f 5f subi r24, 0xFF ; 255 1d074: 80 93 63 04 sts 0x0463, r24 ; 0x800463 1d078: 1b ce rjmp .-970 ; 0x1ccb0 else MENU_ITEM_SDFILE(card.filename, card.longFilename); } else MENU_ITEM_DUMMY(); //dummy item that just increments the internal menu counters. } MENU_END(); 1d07a: 0e 94 83 62 call 0xc506 ; 0xc506 _md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state. //if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer. _md->lcd_scrollTimer.start(); MENU_BEGIN(); 1d07e: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1d082: 8f 5f subi r24, 0xFF ; 255 1d084: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1d088: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1d08c: 8f 5f subi r24, 0xFF ; 255 1d08e: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1d092: e0 cd rjmp .-1088 ; 0x1cc54 MENU_END(); } break; case _scrolling: //scrolling filename { // LCD_CLICKED is used so that the click event is later consumed by the _standard state. const bool rewindFlag = LCD_CLICKED || lcd_draw_update; //flag that says whether the menu should return to _standard state. 1d094: 80 91 95 03 lds r24, 0x0395 ; 0x800395 1d098: 11 e0 ldi r17, 0x01 ; 1 1d09a: 81 11 cpse r24, r1 1d09c: 05 c0 rjmp .+10 ; 0x1d0a8 1d09e: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1d0a2: 81 11 cpse r24, r1 1d0a4: 01 c0 rjmp .+2 ; 0x1d0a8 1d0a6: 10 e0 ldi r17, 0x00 ; 0 if (_md->scrollPointer == NULL) 1d0a8: 80 91 99 03 lds r24, 0x0399 ; 0x800399 1d0ac: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1d0b0: 89 2b or r24, r25 1d0b2: 91 f4 brne .+36 ; 0x1d0d8 { //load filename to memory. #ifdef SDCARD_SORT_ALPHA card.getfilename_sorted(_md->selectedFileID, _md->sdSort); 1d0b4: 60 91 a0 03 lds r22, 0x03A0 ; 0x8003a0 1d0b8: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 1d0bc: 90 91 9c 03 lds r25, 0x039C ; 0x80039c 1d0c0: 0f 94 a9 77 call 0x2ef52 ; 0x2ef52 #else card.getfilename(_md->selectedFileID); #endif _md->scrollPointer = (card.longFilename[0] == '\0') ? card.filename : card.longFilename; 1d0c4: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 1d0c8: 81 11 cpse r24, r1 1d0ca: 46 c0 rjmp .+140 ; 0x1d158 1d0cc: 89 ed ldi r24, 0xD9 ; 217 1d0ce: 93 e1 ldi r25, 0x13 ; 19 1d0d0: 90 93 9a 03 sts 0x039A, r25 ; 0x80039a 1d0d4: 80 93 99 03 sts 0x0399, r24 ; 0x800399 } if (rewindFlag) 1d0d8: 11 11 cpse r17, r1 _md->offset = 0; //redraw once again from the beginning. 1d0da: 10 92 97 03 sts 0x0397, r1 ; 0x800397 if (_md->lcd_scrollTimer.expired(300) || rewindFlag) 1d0de: 6c e2 ldi r22, 0x2C ; 44 1d0e0: 71 e0 ldi r23, 0x01 ; 1 1d0e2: 81 ea ldi r24, 0xA1 ; 161 1d0e4: 93 e0 ldi r25, 0x03 ; 3 1d0e6: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1d0ea: 81 11 cpse r24, r1 1d0ec: 03 c0 rjmp .+6 ; 0x1d0f4 1d0ee: 11 23 and r17, r17 1d0f0: 09 f4 brne .+2 ; 0x1d0f4 1d0f2: 4f ce rjmp .-866 ; 0x1cd92 { uint8_t len = LCD_WIDTH - ((_md->isDir)? 2 : 1); 1d0f4: 80 91 98 03 lds r24, 0x0398 ; 0x800398 1d0f8: 02 e1 ldi r16, 0x12 ; 18 1d0fa: 81 11 cpse r24, r1 1d0fc: 01 c0 rjmp .+2 ; 0x1d100 1d0fe: 03 e1 ldi r16, 0x13 ; 19 lcd_putc_at(0, _md->row, '>'); 1d100: 4e e3 ldi r20, 0x3E ; 62 1d102: 60 91 9f 03 lds r22, 0x039F ; 0x80039f 1d106: 80 e0 ldi r24, 0x00 ; 0 1d108: 0e 94 13 70 call 0xe026 ; 0xe026 if (_md->isDir) 1d10c: 80 91 98 03 lds r24, 0x0398 ; 0x800398 1d110: 88 23 and r24, r24 1d112: 19 f0 breq .+6 ; 0x1d11a 1d114: 85 e8 ldi r24, 0x85 ; 133 1d116: 0e 94 a2 70 call 0xe144 ; 0xe144 lcd_print(LCD_STR_FOLDER[0]); if( lcd_print_pad(&_md->scrollPointer[_md->offset], len) == 0) 1d11a: 20 91 97 03 lds r18, 0x0397 ; 0x800397 1d11e: 80 91 99 03 lds r24, 0x0399 ; 0x800399 1d122: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1d126: 60 2f mov r22, r16 1d128: 82 0f add r24, r18 1d12a: 91 1d adc r25, r1 1d12c: 0e 94 47 73 call 0xe68e ; 0xe68e 1d130: 81 11 cpse r24, r1 1d132: 15 c0 rjmp .+42 ; 0x1d15e { _md->lcd_scrollTimer.start(); 1d134: 81 ea ldi r24, 0xA1 ; 161 1d136: 93 e0 ldi r25, 0x03 ; 3 1d138: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> _md->offset++; 1d13c: 80 91 97 03 lds r24, 0x0397 ; 0x800397 1d140: 8f 5f subi r24, 0xFF ; 255 1d142: 80 93 97 03 sts 0x0397, r24 ; 0x800397 } else { // stop at the end of the string _md->lcd_scrollTimer.stop(); } } if (rewindFlag) //go back to sd_menu. 1d146: 11 23 and r17, r17 1d148: 09 f4 brne .+2 ; 0x1d14c 1d14a: 23 ce rjmp .-954 ; 0x1cd92 1d14c: 10 92 a1 03 sts 0x03A1, r1 ; 0x8003a1 { _md->lcd_scrollTimer.stop(); //forces redraw in _standard state _md->menuState = _standard; 1d150: 81 e0 ldi r24, 0x01 ; 1 1d152: 80 93 96 03 sts 0x0396, r24 ; 0x800396 1d156: 1d ce rjmp .-966 ; 0x1cd92 #ifdef SDCARD_SORT_ALPHA card.getfilename_sorted(_md->selectedFileID, _md->sdSort); #else card.getfilename(_md->selectedFileID); #endif _md->scrollPointer = (card.longFilename[0] == '\0') ? card.filename : card.longFilename; 1d158: 8e ee ldi r24, 0xEE ; 238 1d15a: 93 e1 ldi r25, 0x13 ; 19 1d15c: b9 cf rjmp .-142 ; 0x1d0d0 1d15e: 10 92 a1 03 sts 0x03A1, r1 ; 0x8003a1 1d162: f1 cf rjmp .-30 ; 0x1d146 0001d164 : //! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected //! @retval 0 yes choice selected by user //! @retval 1 no choice selected by user //! @retval 0xFF button timeout (only possible if allow_timeouting is true) uint8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection) //currently just max. n*4 + 3 lines supported (set in language header files) { 1d164: bf 92 push r11 1d166: cf 92 push r12 1d168: df 92 push r13 1d16a: ef 92 push r14 1d16c: ff 92 push r15 1d16e: 0f 93 push r16 1d170: 1f 93 push r17 1d172: cf 93 push r28 1d174: df 93 push r29 1d176: ec 01 movw r28, r24 1d178: d6 2e mov r13, r22 1d17a: b4 2e mov r11, r20 return lcd_show_multiscreen_message_with_choices_and_wait_P(msg, allow_timeouting, default_selection, _T(MSG_YES), _T(MSG_NO), nullptr, 10); 1d17c: 8f e9 ldi r24, 0x9F ; 159 1d17e: 98 e4 ldi r25, 0x48 ; 72 1d180: 0e 94 3a 75 call 0xea74 ; 0xea74 1d184: 8c 01 movw r16, r24 1d186: 89 e9 ldi r24, 0x99 ; 153 1d188: 98 e4 ldi r25, 0x48 ; 72 1d18a: 0e 94 3a 75 call 0xea74 ; 0xea74 1d18e: 2a e0 ldi r18, 0x0A ; 10 1d190: c2 2e mov r12, r18 1d192: f1 2c mov r15, r1 1d194: e1 2c mov r14, r1 1d196: 9c 01 movw r18, r24 1d198: 4b 2d mov r20, r11 1d19a: 6d 2d mov r22, r13 1d19c: ce 01 movw r24, r28 1d19e: 0e 94 a4 e4 call 0x1c948 ; 0x1c948 } 1d1a2: df 91 pop r29 1d1a4: cf 91 pop r28 1d1a6: 1f 91 pop r17 1d1a8: 0f 91 pop r16 1d1aa: ff 90 pop r15 1d1ac: ef 90 pop r14 1d1ae: df 90 pop r13 1d1b0: cf 90 pop r12 1d1b2: bf 90 pop r11 1d1b4: 08 95 ret 0001d1b6 : crashdet_use_eeprom_setting(); } #endif //TMC2130 #if (LANG_MODE != 0) static void menu_setlang(uint8_t lang) 1d1b6: cf 93 push r28 1d1b8: c8 2f mov r28, r24 { if (!lang_select(lang)) { if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_COPY_SEL_LANG), false, LCD_LEFT_BUTTON_CHOICE) == LCD_LEFT_BUTTON_CHOICE) 1d1ba: 8e ed ldi r24, 0xDE ; 222 1d1bc: 9b e4 ldi r25, 0x4B ; 75 1d1be: 0e 94 3a 75 call 0xea74 ; 0xea74 1d1c2: 40 e0 ldi r20, 0x00 ; 0 1d1c4: 60 e0 ldi r22, 0x00 ; 0 1d1c6: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 1d1ca: 81 11 cpse r24, r1 1d1cc: 20 c0 rjmp .+64 ; 0x1d20e #endif //(LANG_MODE == 0) void lang_boot_update_start(uint8_t lang) { uint8_t cnt = lang_get_count(); 1d1ce: 0e 94 ab 74 call 0xe956 ; 0xe956 if ((lang < 2) || (lang > cnt)) return; //only languages from xflash can be selected 1d1d2: c2 30 cpi r28, 0x02 ; 2 1d1d4: e0 f0 brcs .+56 ; 0x1d20e 1d1d6: 8c 17 cp r24, r28 1d1d8: d0 f0 brcs .+52 ; 0x1d20e softReset(); } void bootapp_reboot_user0(uint8_t reserved) { cli(); 1d1da: f8 94 cli boot_app_magic = BOOT_APP_MAGIC; 1d1dc: 8a ea ldi r24, 0xAA ; 170 1d1de: 95 e5 ldi r25, 0x55 ; 85 1d1e0: dc 01 movw r26, r24 1d1e2: 80 93 fc 1f sts 0x1FFC, r24 ; 0x801ffc <__bss_end+0x8e5> 1d1e6: 90 93 fd 1f sts 0x1FFD, r25 ; 0x801ffd <__bss_end+0x8e6> 1d1ea: a0 93 fe 1f sts 0x1FFE, r26 ; 0x801ffe <__bss_end+0x8e7> 1d1ee: b0 93 ff 1f sts 0x1FFF, r27 ; 0x801fff <__bss_end+0x8e8> boot_app_flags = BOOT_APP_FLG_USER0; 1d1f2: 80 e8 ldi r24, 0x80 ; 128 1d1f4: 80 93 fb 1f sts 0x1FFB, r24 ; 0x801ffb <__bss_end+0x8e4> boot_copy_size = 0; 1d1f8: 10 92 f9 1f sts 0x1FF9, r1 ; 0x801ff9 <__bss_end+0x8e2> 1d1fc: 10 92 f8 1f sts 0x1FF8, r1 ; 0x801ff8 <__bss_end+0x8e1> bootapp_reboot_user0(lang << 3); 1d200: cc 0f add r28, r28 1d202: cc 0f add r28, r28 1d204: cc 0f add r28, r28 boot_reserved = reserved; 1d206: c0 93 fa 1f sts 0x1FFA, r28 ; 0x801ffa <__bss_end+0x8e3> // bootapp_print_vars(); softReset(); 1d20a: 0e 94 1f 66 call 0xcc3e ; 0xcc3e lang_boot_update_start(lang); lcd_update_enable(true); 1d20e: 81 e0 ldi r24, 0x01 ; 1 1d210: 0e 94 38 70 call 0xe070 ; 0xe070 menu_goto(lcd_language_menu, 0, true, true); 1d214: 21 e0 ldi r18, 0x01 ; 1 1d216: 41 e0 ldi r20, 0x01 ; 1 1d218: 70 e0 ldi r23, 0x00 ; 0 1d21a: 60 e0 ldi r22, 0x00 ; 0 1d21c: 86 e1 ldi r24, 0x16 ; 22 1d21e: 99 ee ldi r25, 0xE9 ; 233 1d220: 0e 94 b7 62 call 0xc56e ; 0xc56e 1d224: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout } } 1d228: cf 91 pop r28 1d22a: 08 95 ret 0001d22c : } #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL static void lcd_language_menu() { 1d22c: cf 93 push r28 1d22e: df 93 push r29 MENU_BEGIN(); 1d230: 0e 94 0c 74 call 0xe818 ; 0xe818 1d234: 10 92 60 04 sts 0x0460, r1 ; 0x800460 1d238: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1d23c: 84 30 cpi r24, 0x04 ; 4 1d23e: 08 f0 brcs .+2 ; 0x1d242 1d240: 5c c0 rjmp .+184 ; 0x1d2fa 1d242: 10 92 63 04 sts 0x0463, r1 ; 0x800463 if (lang_is_selected()) MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); // 1d246: 0e 94 2e 74 call 0xe85c ; 0xe85c 1d24a: 88 23 and r24, r24 1d24c: 31 f0 breq .+12 ; 0x1d25a 1d24e: 8e e8 ldi r24, 0x8E ; 142 1d250: 98 e4 ldi r25, 0x48 ; 72 1d252: 0e 94 3a 75 call 0xea74 ; 0xea74 1d256: 0e 94 ce 72 call 0xe59c ; 0xe59c if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language 1d25a: 8e e6 ldi r24, 0x6E ; 110 1d25c: 95 e6 ldi r25, 0x65 ; 101 1d25e: 0e 94 44 74 call 0xe888 ; 0xe888 1d262: 0e 94 21 73 call 0xe642 ; 0xe642 1d266: 88 23 and r24, r24 1d268: 49 f0 breq .+18 ; 0x1d27c #endif //TMC2130 #if (LANG_MODE != 0) static void menu_setlang(uint8_t lang) { if (!lang_select(lang)) 1d26a: 80 e0 ldi r24, 0x00 ; 0 1d26c: 0e 94 ce 74 call 0xe99c ; 0xe99c 1d270: 81 11 cpse r24, r1 1d272: 43 c0 rjmp .+134 ; 0x1d2fa MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); } 1d274: df 91 pop r29 1d276: cf 91 pop r28 1d278: 0c 94 db e8 jmp 0x1d1b6 ; 0x1d1b6 if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language { menu_setlang(0); return; } uint8_t cnt = lang_get_count(); 1d27c: 0e 94 ab 74 call 0xe956 ; 0xe956 1d280: d8 2f mov r29, r24 } } else for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8' for 7 official languages #else //XFLASH for (uint8_t i = 1; i < cnt; i++) //all seconday languages (MK2/25) 1d282: c1 e0 ldi r28, 0x01 ; 1 1d284: cd 17 cp r28, r29 1d286: 60 f5 brcc .+88 ; 0x1d2e0 if (header.magic != LANG_MAGIC) break; //break if not valid if (--lang == 0) return header.code; addr += header.size; //calc address of next table } #else //XFLASH uint16_t table = _SEC_LANG_TABLE; 1d288: 80 e0 ldi r24, 0x00 ; 0 1d28a: 91 e0 ldi r25, 0x01 ; 1 uint8_t count = 1; //count = 1 (primary) 1d28c: 21 e0 ldi r18, 0x01 ; 1 while (pgm_read_dword((uint32_t*)table) == LANG_MAGIC) //magic valid 1d28e: fc 01 movw r30, r24 1d290: 45 91 lpm r20, Z+ 1d292: 55 91 lpm r21, Z+ 1d294: 65 91 lpm r22, Z+ 1d296: 74 91 lpm r23, Z 1d298: 45 3a cpi r20, 0xA5 ; 165 1d29a: 5a 45 sbci r21, 0x5A ; 90 1d29c: 64 4b sbci r22, 0xB4 ; 180 1d29e: 7b 44 sbci r23, 0x4B ; 75 1d2a0: 19 f0 breq .+6 ; 0x1d2a8 if (count == lang) return pgm_read_word(((uint16_t*)(table + 10))); //read language code table += pgm_read_word((uint16_t*)(table + 4)); count++; } #endif //XFLASH return LANG_CODE_XX; 1d2a2: 8f e3 ldi r24, 0x3F ; 63 1d2a4: 9f e3 ldi r25, 0x3F ; 63 1d2a6: 06 c0 rjmp .+12 ; 0x1d2b4 #else //XFLASH uint16_t table = _SEC_LANG_TABLE; uint8_t count = 1; //count = 1 (primary) while (pgm_read_dword((uint32_t*)table) == LANG_MAGIC) //magic valid { if (count == lang) return pgm_read_word(((uint16_t*)(table + 10))); //read language code 1d2a8: fc 01 movw r30, r24 1d2aa: c2 13 cpse r28, r18 1d2ac: 10 c0 rjmp .+32 ; 0x1d2ce 1d2ae: 3a 96 adiw r30, 0x0a ; 10 1d2b0: 85 91 lpm r24, Z+ 1d2b2: 94 91 lpm r25, Z #endif //XFLASH if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) 1d2b4: 0e 94 44 74 call 0xe888 ; 0xe888 1d2b8: 0e 94 21 73 call 0xe642 ; 0xe642 1d2bc: 88 23 and r24, r24 1d2be: 71 f0 breq .+28 ; 0x1d2dc #endif //TMC2130 #if (LANG_MODE != 0) static void menu_setlang(uint8_t lang) { if (!lang_select(lang)) 1d2c0: 8c 2f mov r24, r28 1d2c2: 0e 94 ce 74 call 0xe99c ; 0xe99c 1d2c6: 81 11 cpse r24, r1 1d2c8: 18 c0 rjmp .+48 ; 0x1d2fa 1d2ca: 8c 2f mov r24, r28 1d2cc: d3 cf rjmp .-90 ; 0x1d274 table += pgm_read_word((uint16_t*)(table + 4)); 1d2ce: 34 96 adiw r30, 0x04 ; 4 1d2d0: 45 91 lpm r20, Z+ 1d2d2: 54 91 lpm r21, Z 1d2d4: 84 0f add r24, r20 1d2d6: 95 1f adc r25, r21 count++; 1d2d8: 2f 5f subi r18, 0xFF ; 255 1d2da: d9 cf rjmp .-78 ; 0x1d28e } } else for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8' for 7 official languages #else //XFLASH for (uint8_t i = 1; i < cnt; i++) //all seconday languages (MK2/25) 1d2dc: cf 5f subi r28, 0xFF ; 255 1d2de: d2 cf rjmp .-92 ; 0x1d284 #ifdef XFLASH MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); 1d2e0: 0e 94 83 62 call 0xc506 ; 0xc506 #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL static void lcd_language_menu() { MENU_BEGIN(); 1d2e4: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1d2e8: 8f 5f subi r24, 0xFF ; 255 1d2ea: 80 93 60 04 sts 0x0460, r24 ; 0x800460 1d2ee: 80 91 62 04 lds r24, 0x0462 ; 0x800462 1d2f2: 8f 5f subi r24, 0xFF ; 255 1d2f4: 80 93 62 04 sts 0x0462, r24 ; 0x800462 1d2f8: 9f cf rjmp .-194 ; 0x1d238 MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); } 1d2fa: df 91 pop r29 1d2fc: cf 91 pop r28 1d2fe: 08 95 ret 0001d300 : } static void lcd_disable_farm_mode() { uint8_t disable = lcd_show_multiscreen_message_yes_no_and_wait_P(PSTR("Disable farm mode?"), true); //allow timeouting, default no 1d300: 41 e0 ldi r20, 0x01 ; 1 1d302: 61 e0 ldi r22, 0x01 ; 1 1d304: 86 ea ldi r24, 0xA6 ; 166 1d306: 93 e8 ldi r25, 0x83 ; 131 1d308: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (disable == LCD_LEFT_BUTTON_CHOICE) 1d30c: 81 11 cpse r24, r1 1d30e: 07 c0 rjmp .+14 ; 0x1d31e { enquecommand_P(PSTR("G99")); 1d310: 61 e0 ldi r22, 0x01 ; 1 1d312: 82 ea ldi r24, 0xA2 ; 162 1d314: 93 e8 ldi r25, 0x83 ; 131 1d316: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 lcd_return_to_status(); 1d31a: 0f 94 d5 07 call 0x20faa ; 0x20faa } lcd_update_enable(true); 1d31e: 81 e0 ldi r24, 0x01 ; 1 1d320: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_draw_update = 2; 1d324: 82 e0 ldi r24, 0x02 ; 2 1d326: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } 1d32a: 08 95 ret 0001d32c : lcd_printf_P(_T(MSG_SHEET_OFFSET), sheet_name, offset, menuData->reset ? ' ' : '>', menuData->reset ? '>' : ' ');// \n denotes line break, %.7s is replaced by 7 character long sheet name, %+1.3f is replaced by 6 character long floating point number, %c is replaced by > or white space (one character) based on whether first or second option is selected. % denoted place holders can not be reordered. } void lcd_v2_calibration() { 1d32c: cf 93 push r28 1d32e: df 93 push r29 if (MMU2::mmu2.Enabled()) { 1d330: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1d334: 81 30 cpi r24, 0x01 ; 1 1d336: e9 f4 brne .+58 ; 0x1d372 const uint8_t filament = choose_menu_P( 1d338: 89 e2 ldi r24, 0x29 ; 41 1d33a: 9d e3 ldi r25, 0x3D ; 61 1d33c: 0e 94 3a 75 call 0xea74 ; 0xea74 1d340: ec 01 movw r28, r24 1d342: 86 e1 ldi r24, 0x16 ; 22 1d344: 9d e3 ldi r25, 0x3D ; 61 1d346: 0e 94 3a 75 call 0xea74 ; 0xea74 _T(MSG_SELECT_FILAMENT), MSG_FILAMENT,_T(MSG_CANCEL)); 1d34a: be 01 movw r22, r28 1d34c: 0e 94 c8 d1 call 0x1a390 ; 0x1a390 if (filament < MMU_FILAMENT_COUNT) { 1d350: 85 30 cpi r24, 0x05 ; 5 1d352: 98 f5 brcc .+102 ; 0x1d3ba lay1cal_filament = filament; 1d354: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 return; } } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; 1d358: 8a e0 ldi r24, 0x0A ; 10 1d35a: 80 93 94 03 sts 0x0394, r24 ; 0x800394 menu_goto(lcd_generic_preheat_menu, 0, true); 1d35e: 20 e0 ldi r18, 0x00 ; 0 1d360: 41 e0 ldi r20, 0x01 ; 1 1d362: 70 e0 ldi r23, 0x00 ; 0 1d364: 60 e0 ldi r22, 0x00 ; 0 1d366: 84 e7 ldi r24, 0x74 ; 116 1d368: 97 e3 ldi r25, 0x37 ; 55 } 1d36a: df 91 pop r29 1d36c: cf 91 pop r28 } } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; menu_goto(lcd_generic_preheat_menu, 0, true); 1d36e: 0c 94 b7 62 jmp 0xc56e ; 0xc56e menu_back(); return; } } #ifdef FILAMENT_SENSOR else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 1d372: 8f e5 ldi r24, 0x5F ; 95 1d374: 9f e0 ldi r25, 0x0F ; 15 1d376: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d37a: 81 11 cpse r24, r1 1d37c: ed cf rjmp .-38 ; 0x1d358 { bool loaded = false; if (fsensor.isReady()) { 1d37e: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1d382: 82 30 cpi r24, 0x02 ; 2 1d384: f1 f4 brne .+60 ; 0x1d3c2 1d386: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 1d38a: 81 11 cpse r24, r1 1d38c: e5 cf rjmp .-54 ; 0x1d358 loaded = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE); lcd_update_enabled = true; } if (!loaded) { lcd_display_message_fullscreen_P(_T(MSG_PLEASE_LOAD_PLA)); 1d38e: 88 ef ldi r24, 0xF8 ; 248 1d390: 9c e3 ldi r25, 0x3C ; 60 1d392: 0e 94 3a 75 call 0xea74 ; 0xea74 1d396: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_consume_click(); 1d39a: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 1d39e: c4 e1 ldi r28, 0x14 ; 20 for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s delay_keep_alive(100); 1d3a0: 84 e6 ldi r24, 0x64 ; 100 1d3a2: 90 e0 ldi r25, 0x00 ; 0 1d3a4: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (lcd_clicked()) { 1d3a8: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1d3ac: 81 11 cpse r24, r1 1d3ae: 02 c0 rjmp .+4 ; 0x1d3b4 1d3b0: c1 50 subi r28, 0x01 ; 1 } if (!loaded) { lcd_display_message_fullscreen_P(_T(MSG_PLEASE_LOAD_PLA)); lcd_consume_click(); for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s 1d3b2: b1 f7 brne .-20 ; 0x1d3a0 delay_keep_alive(100); if (lcd_clicked()) { break; } } lcd_update_enabled = true; 1d3b4: 81 e0 ldi r24, 0x01 ; 1 1d3b6: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; menu_goto(lcd_generic_preheat_menu, 0, true); } 1d3ba: df 91 pop r29 1d3bc: cf 91 pop r28 if (lcd_clicked()) { break; } } lcd_update_enabled = true; menu_back(); 1d3be: 0c 94 1b 63 jmp 0xc636 ; 0xc636 { bool loaded = false; if (fsensor.isReady()) { loaded = fsensor.getFilamentPresent(); } else { loaded = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE); 1d3c2: 84 e2 ldi r24, 0x24 ; 36 1d3c4: 92 e4 ldi r25, 0x42 ; 66 1d3c6: 0e 94 3a 75 call 0xea74 ; 0xea74 1d3ca: 41 e0 ldi r20, 0x01 ; 1 1d3cc: 60 e0 ldi r22, 0x00 ; 0 1d3ce: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 1d3d2: 91 e0 ldi r25, 0x01 ; 1 1d3d4: 81 11 cpse r24, r1 1d3d6: 90 e0 ldi r25, 0x00 ; 0 lcd_update_enabled = true; 1d3d8: 81 e0 ldi r24, 0x01 ; 1 1d3da: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a } if (!loaded) { 1d3de: 91 11 cpse r25, r1 1d3e0: bb cf rjmp .-138 ; 0x1d358 1d3e2: d5 cf rjmp .-86 ; 0x1d38e 0001d3e4 : } lcd_show_fullscreen_message_and_wait_P( _T(MSG_WIZARD_V2_CAL_2)); } void lcd_z_calibration_prompt(bool allowTimeouting) { 1d3e4: cf 93 push r28 1d3e6: c8 2f mov r28, r24 uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_Z_CALIBRATION_PROMPT), allowTimeouting, 0); 1d3e8: 8a ec ldi r24, 0xCA ; 202 1d3ea: 9f e3 ldi r25, 0x3F ; 63 1d3ec: 0e 94 3a 75 call 0xea74 ; 0xea74 1d3f0: 40 e0 ldi r20, 0x00 ; 0 1d3f2: 6c 2f mov r22, r28 1d3f4: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (result == LCD_LEFT_BUTTON_CHOICE) { 1d3f8: 81 11 cpse r24, r1 1d3fa: 03 c0 rjmp .+6 ; 0x1d402 lcd_mesh_calibration_z(); } } 1d3fc: cf 91 pop r28 } void lcd_z_calibration_prompt(bool allowTimeouting) { uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_Z_CALIBRATION_PROMPT), allowTimeouting, 0); if (result == LCD_LEFT_BUTTON_CHOICE) { lcd_mesh_calibration_z(); 1d3fe: 0c 94 7a c4 jmp 0x188f4 ; 0x188f4 } } 1d402: cf 91 pop r28 1d404: 08 95 ret 0001d406 : } eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_PROBE_NR, mbl_z_probe_nr); } static void lcd_mesh_bed_leveling_settings() { 1d406: bf 92 push r11 1d408: cf 92 push r12 1d40a: df 92 push r13 1d40c: ef 92 push r14 1d40e: ff 92 push r15 1d410: 0f 93 push r16 1d412: 1f 93 push r17 1d414: cf 93 push r28 1d416: df 93 push r29 1d418: 00 d0 rcall .+0 ; 0x1d41a 1d41a: 1f 92 push r1 1d41c: cd b7 in r28, 0x3d ; 61 1d41e: de b7 in r29, 0x3e ; 62 bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0); 1d420: 8c ea ldi r24, 0xAC ; 172 1d422: 9d e0 ldi r25, 0x0D ; 13 1d424: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d428: c8 2e mov r12, r24 uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); 1d42a: 8b ea ldi r24, 0xAB ; 171 1d42c: 9d e0 ldi r25, 0x0D ; 13 1d42e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d432: f8 2e mov r15, r24 uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); 1d434: 8a ea ldi r24, 0xAA ; 170 1d436: 9d e0 ldi r25, 0x0D ; 13 1d438: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d43c: 18 2f mov r17, r24 char sToggle[4]; //enough for nxn format MENU_BEGIN(); 1d43e: 0e 94 0c 74 call 0xe818 ; 0xe818 1d442: 10 92 60 04 sts 0x0460, r1 ; 0x800460 if (points_nr == 7) { lcd_z_calibration_prompt(true); } ); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); sToggle[0] = points_nr + '0'; 1d446: 80 e3 ldi r24, 0x30 ; 48 1d448: d8 2e mov r13, r24 1d44a: df 0c add r13, r15 sToggle[1] = 'x'; 1d44c: 98 e7 ldi r25, 0x78 ; 120 1d44e: b9 2e mov r11, r25 sToggle[2] = points_nr + '0'; sToggle[3] = 0; MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle); sToggle[0] = mbl_z_probe_nr + '0'; 1d450: 20 e3 ldi r18, 0x30 ; 48 1d452: e2 2e mov r14, r18 1d454: e1 0e add r14, r17 bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0); uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); char sToggle[4]; //enough for nxn format MENU_BEGIN(); 1d456: 80 91 60 04 lds r24, 0x0460 ; 0x800460 1d45a: 84 30 cpi r24, 0x04 ; 4 1d45c: 08 f0 brcs .+2 ; 0x1d460 1d45e: 56 c0 rjmp .+172 ; 0x1d50c 1d460: 10 92 63 04 sts 0x0463, r1 ; 0x800463 ON_MENU_LEAVE( 1d464: 0e 94 4c 62 call 0xc498 ; 0xc498 1d468: 88 23 and r24, r24 1d46a: 31 f0 breq .+12 ; 0x1d478 1d46c: 87 e0 ldi r24, 0x07 ; 7 1d46e: f8 12 cpse r15, r24 1d470: 03 c0 rjmp .+6 ; 0x1d478 1d472: 81 e0 ldi r24, 0x01 ; 1 1d474: 0e 94 f2 e9 call 0x1d3e4 ; 0x1d3e4 // Prompt user to run Z calibration for best results with region MBL. if (points_nr == 7) { lcd_z_calibration_prompt(true); } ); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 1d478: 8e e8 ldi r24, 0x8E ; 142 1d47a: 98 e4 ldi r25, 0x48 ; 72 1d47c: 0e 94 3a 75 call 0xea74 ; 0xea74 1d480: 0e 94 ce 72 call 0xe59c ; 0xe59c sToggle[0] = points_nr + '0'; 1d484: d9 82 std Y+1, r13 ; 0x01 sToggle[1] = 'x'; 1d486: ba 82 std Y+2, r11 ; 0x02 sToggle[2] = points_nr + '0'; 1d488: db 82 std Y+3, r13 ; 0x03 sToggle[3] = 0; 1d48a: 1c 82 std Y+4, r1 ; 0x04 MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle); 1d48c: 87 e8 ldi r24, 0x87 ; 135 1d48e: 98 e4 ldi r25, 0x48 ; 72 1d490: 0e 94 3a 75 call 0xea74 ; 0xea74 1d494: 20 e0 ldi r18, 0x00 ; 0 1d496: 40 e2 ldi r20, 0x20 ; 32 1d498: 5f eb ldi r21, 0xBF ; 191 1d49a: be 01 movw r22, r28 1d49c: 6f 5f subi r22, 0xFF ; 255 1d49e: 7f 4f sbci r23, 0xFF ; 255 1d4a0: 0e 94 5e 75 call 0xeabc ; 0xeabc sToggle[0] = mbl_z_probe_nr + '0'; 1d4a4: e9 82 std Y+1, r14 ; 0x01 sToggle[1] = 0; 1d4a6: 1a 82 std Y+2, r1 ; 0x02 MENU_ITEM_TOGGLE(_T(MSG_Z_PROBE_NR), sToggle, mbl_probe_nr_toggle); 1d4a8: 89 e7 ldi r24, 0x79 ; 121 1d4aa: 98 e4 ldi r25, 0x48 ; 72 1d4ac: 0e 94 3a 75 call 0xea74 ; 0xea74 1d4b0: 20 e0 ldi r18, 0x00 ; 0 1d4b2: 41 e1 ldi r20, 0x11 ; 17 1d4b4: 5f eb ldi r21, 0xBF ; 191 1d4b6: be 01 movw r22, r28 1d4b8: 6f 5f subi r22, 0xFF ; 255 1d4ba: 7f 4f sbci r23, 0xFF ; 255 1d4bc: 0e 94 5e 75 call 0xeabc ; 0xeabc MENU_ITEM_TOGGLE_P(_T(MSG_MAGNETS_COMP), (points_nr == 7) ? (magnet_elimination ? _T(MSG_ON): _T(MSG_OFF)) : _T(MSG_NA), mbl_magnets_elimination_toggle); 1d4c0: 87 e0 ldi r24, 0x07 ; 7 1d4c2: f8 12 cpse r15, r24 1d4c4: 20 c0 rjmp .+64 ; 0x1d506 1d4c6: 8a e9 ldi r24, 0x9A ; 154 1d4c8: 92 e6 ldi r25, 0x62 ; 98 1d4ca: c1 10 cpse r12, r1 1d4cc: 02 c0 rjmp .+4 ; 0x1d4d2 1d4ce: 84 e9 ldi r24, 0x94 ; 148 1d4d0: 92 e6 ldi r25, 0x62 ; 98 1d4d2: 0e 94 3a 75 call 0xea74 ; 0xea74 1d4d6: 8c 01 movw r16, r24 1d4d8: 83 e6 ldi r24, 0x63 ; 99 1d4da: 98 e4 ldi r25, 0x48 ; 72 1d4dc: 0e 94 3a 75 call 0xea74 ; 0xea74 1d4e0: 22 e0 ldi r18, 0x02 ; 2 1d4e2: 4c e2 ldi r20, 0x2C ; 44 1d4e4: 5f eb ldi r21, 0xBF ; 191 1d4e6: b8 01 movw r22, r16 1d4e8: 0e 94 5e 75 call 0xeabc ; 0xeabc MENU_END(); 1d4ec: 0e 94 83 62 call 0xc506 ; 0xc506 bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0); uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); char sToggle[4]; //enough for nxn format MENU_BEGIN(); 1d4f0: 90 91 60 04 lds r25, 0x0460 ; 0x800460 1d4f4: 9f 5f subi r25, 0xFF ; 255 1d4f6: 90 93 60 04 sts 0x0460, r25 ; 0x800460 1d4fa: 90 91 62 04 lds r25, 0x0462 ; 0x800462 1d4fe: 9f 5f subi r25, 0xFF ; 255 1d500: 90 93 62 04 sts 0x0462, r25 ; 0x800462 1d504: a8 cf rjmp .-176 ; 0x1d456 sToggle[3] = 0; MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle); sToggle[0] = mbl_z_probe_nr + '0'; sToggle[1] = 0; MENU_ITEM_TOGGLE(_T(MSG_Z_PROBE_NR), sToggle, mbl_probe_nr_toggle); MENU_ITEM_TOGGLE_P(_T(MSG_MAGNETS_COMP), (points_nr == 7) ? (magnet_elimination ? _T(MSG_ON): _T(MSG_OFF)) : _T(MSG_NA), mbl_magnets_elimination_toggle); 1d506: 83 e7 ldi r24, 0x73 ; 115 1d508: 98 e4 ldi r25, 0x48 ; 72 1d50a: e3 cf rjmp .-58 ; 0x1d4d2 MENU_END(); } 1d50c: 0f 90 pop r0 1d50e: 0f 90 pop r0 1d510: 0f 90 pop r0 1d512: 0f 90 pop r0 1d514: df 91 pop r29 1d516: cf 91 pop r28 1d518: 1f 91 pop r17 1d51a: 0f 91 pop r16 1d51c: ff 90 pop r15 1d51e: ef 90 pop r14 1d520: df 90 pop r13 1d522: cf 90 pop r12 1d524: bf 90 pop r11 1d526: 08 95 ret 0001d528 : * * This function is blocking. * @param msg message to be displayed from PROGMEM */ void lcd_show_fullscreen_message_and_wait_P(const char *msg) { 1d528: cf 92 push r12 1d52a: df 92 push r13 1d52c: ef 92 push r14 1d52e: ff 92 push r15 1d530: 0f 93 push r16 1d532: 1f 93 push r17 1d534: cf 93 push r28 1d536: df 93 push r29 1d538: d8 2e mov r13, r24 1d53a: c9 2e mov r12, r25 //! Do not call lcd_update_enable() to prevent calling lcd_update() in sensitive code. //! in certain scenarios it will cause recursion e.g. in the menus. class LcdUpdateDisabler { public: LcdUpdateDisabler(): m_updateEnabled(lcd_update_enabled) 1d53c: 01 e0 ldi r16, 0x01 ; 1 1d53e: 80 91 5a 02 lds r24, 0x025A ; 0x80025a 1d542: 81 11 cpse r24, r1 1d544: 01 c0 rjmp .+2 ; 0x1d548 1d546: 00 e0 ldi r16, 0x00 ; 0 { lcd_update_enabled = false; 1d548: 10 92 5a 02 sts 0x025A, r1 ; 0x80025a LcdUpdateDisabler lcdUpdateDisabler; const char *msg_next = lcd_display_message_fullscreen_P(msg); 1d54c: 8d 2d mov r24, r13 1d54e: 9c 2d mov r25, r12 1d550: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1d554: 7c 01 movw r14, r24 bool multi_screen = msg_next != NULL; lcd_consume_click(); 1d556: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 KEEPALIVE_STATE(PAUSED_FOR_USER); 1d55a: 84 e0 ldi r24, 0x04 ; 4 1d55c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 * @param msg message to be displayed from PROGMEM */ void lcd_show_fullscreen_message_and_wait_P(const char *msg) { LcdUpdateDisabler lcdUpdateDisabler; const char *msg_next = lcd_display_message_fullscreen_P(msg); 1d560: e7 01 movw r28, r14 bool multi_screen = msg_next != NULL; lcd_consume_click(); KEEPALIVE_STATE(PAUSED_FOR_USER); // Until confirmed by a button click. for (;;) { if (msg_next == NULL) { 1d562: 20 97 sbiw r28, 0x00 ; 0 1d564: 29 f4 brne .+10 ; 0x1d570 // Display the confirm char. lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]); 1d566: 49 e8 ldi r20, 0x89 ; 137 1d568: 63 e0 ldi r22, 0x03 ; 3 1d56a: 83 e1 ldi r24, 0x13 ; 19 1d56c: 0e 94 13 70 call 0xe026 ; 0xe026 * @param msg message to be displayed from PROGMEM */ void lcd_show_fullscreen_message_and_wait_P(const char *msg) { LcdUpdateDisabler lcdUpdateDisabler; const char *msg_next = lcd_display_message_fullscreen_P(msg); 1d570: 14 e6 ldi r17, 0x64 ; 100 // Display the confirm char. lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]); } // Wait for 5 seconds before displaying the next text. for (uint8_t i = 0; i < 100; ++ i) { delay_keep_alive(50); 1d572: 82 e3 ldi r24, 0x32 ; 50 1d574: 90 e0 ldi r25, 0x00 ; 0 1d576: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (lcd_clicked()) { 1d57a: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1d57e: 88 23 and r24, r24 1d580: 81 f0 breq .+32 ; 0x1d5a2 if (msg_next == NULL) { 1d582: 20 97 sbiw r28, 0x00 ; 0 1d584: 81 f4 brne .+32 ; 0x1d5a6 KEEPALIVE_STATE(IN_HANDLER); 1d586: 82 e0 ldi r24, 0x02 ; 2 1d588: 80 93 78 02 sts 0x0278, r24 ; 0x800278 } ~LcdUpdateDisabler() { lcd_update_enabled = m_updateEnabled; 1d58c: 00 93 5a 02 sts 0x025A, r16 ; 0x80025a if (msg_next == NULL) msg_next = msg; msg_next = lcd_display_message_fullscreen_P(msg_next); } } } 1d590: df 91 pop r29 1d592: cf 91 pop r28 1d594: 1f 91 pop r17 1d596: 0f 91 pop r16 1d598: ff 90 pop r15 1d59a: ef 90 pop r14 1d59c: df 90 pop r13 1d59e: cf 90 pop r12 1d5a0: 08 95 ret 1d5a2: 11 50 subi r17, 0x01 ; 1 if (msg_next == NULL) { // Display the confirm char. lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]); } // Wait for 5 seconds before displaying the next text. for (uint8_t i = 0; i < 100; ++ i) { 1d5a4: 31 f7 brne .-52 ; 0x1d572 else { break; } } } if (multi_screen) { 1d5a6: e1 14 cp r14, r1 1d5a8: f1 04 cpc r15, r1 1d5aa: d9 f2 breq .-74 ; 0x1d562 if (msg_next == NULL) 1d5ac: 20 97 sbiw r28, 0x00 ; 0 1d5ae: 11 f4 brne .+4 ; 0x1d5b4 msg_next = msg; 1d5b0: cd 2d mov r28, r13 1d5b2: dc 2d mov r29, r12 msg_next = lcd_display_message_fullscreen_P(msg_next); 1d5b4: ce 01 movw r24, r28 1d5b6: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1d5ba: ec 01 movw r28, r24 1d5bc: d2 cf rjmp .-92 ; 0x1d562 0001d5be : oCheckFilament = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_FILAMENT, (uint8_t)ClCheckMode::_Warn); } static void render_M862_warnings(const char* warning, const char* strict, uint8_t check) { if (check == 1) { // Warning, stop print if user selects 'No' 1d5be: 41 30 cpi r20, 0x01 ; 1 1d5c0: 41 f4 brne .+16 ; 0x1d5d2 if (lcd_show_multiscreen_message_cont_cancel_and_wait_P(warning, true, LCD_LEFT_BUTTON_CHOICE) == LCD_MIDDLE_BUTTON_CHOICE) { 1d5c2: 40 e0 ldi r20, 0x00 ; 0 1d5c4: 61 e0 ldi r22, 0x01 ; 1 1d5c6: 0e 94 77 e5 call 0x1caee ; 0x1caee 1d5ca: 81 30 cpi r24, 0x01 ; 1 1d5cc: 41 f4 brne .+16 ; 0x1d5de lcd_print_stop(); } } else if (check == 2) { // Strict, always stop print lcd_show_fullscreen_message_and_wait_P(strict); lcd_print_stop(); 1d5ce: 0c 94 42 df jmp 0x1be84 ; 0x1be84 { if (check == 1) { // Warning, stop print if user selects 'No' if (lcd_show_multiscreen_message_cont_cancel_and_wait_P(warning, true, LCD_LEFT_BUTTON_CHOICE) == LCD_MIDDLE_BUTTON_CHOICE) { lcd_print_stop(); } } else if (check == 2) { // Strict, always stop print 1d5d2: 42 30 cpi r20, 0x02 ; 2 1d5d4: 21 f4 brne .+8 ; 0x1d5de lcd_show_fullscreen_message_and_wait_P(strict); 1d5d6: cb 01 movw r24, r22 1d5d8: 0e 94 94 ea call 0x1d528 ; 0x1d528 1d5dc: f8 cf rjmp .-16 ; 0x1d5ce lcd_print_stop(); } } 1d5de: 08 95 ret 0001d5e0 : ,_T(MSG_GCODE_NEWER_FIRMWARE_CANCELLED) ,(uint8_t)oCheckVersion ); } bool filament_presence_check() { 1d5e0: 0f 93 push r16 1d5e2: 1f 93 push r17 1d5e4: cf 93 push r28 // When MMU is enabled, this is not necessary and the G-code file // should always tell the MMU which filament to load. if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED)) { 1d5e6: 8c ea ldi r24, 0xAC ; 172 1d5e8: 9c e0 ldi r25, 0x0C ; 12 1d5ea: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d5ee: 81 11 cpse r24, r1 1d5f0: 23 c0 rjmp .+70 ; 0x1d638 goto done; } if (fsensor.isEnabled() && !fsensor.getFilamentPresent()) { 1d5f2: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1d5f6: 88 23 and r24, r24 1d5f8: f9 f0 breq .+62 ; 0x1d638 1d5fa: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 1d5fe: 81 11 cpse r24, r1 1d600: 1b c0 rjmp .+54 ; 0x1d638 if (oCheckFilament == ClCheckMode::_None) { 1d602: c0 91 ee 03 lds r28, 0x03EE ; 0x8003ee 1d606: cc 23 and r28, r28 1d608: b9 f0 breq .+46 ; 0x1d638 goto done; } render_M862_warnings( 1d60a: 82 e7 ldi r24, 0x72 ; 114 1d60c: 9c e4 ldi r25, 0x4C ; 76 1d60e: 0e 94 3a 75 call 0xea74 ; 0xea74 1d612: 8c 01 movw r16, r24 1d614: 82 e7 ldi r24, 0x72 ; 114 1d616: 9c e4 ldi r25, 0x4C ; 76 1d618: 0e 94 3a 75 call 0xea74 ; 0xea74 1d61c: 4c 2f mov r20, r28 1d61e: b8 01 movw r22, r16 1d620: 0e 94 df ea call 0x1d5be ; 0x1d5be _T(MSG_MISSING_FILAMENT) ,_T(MSG_MISSING_FILAMENT) //Identical messages ,(uint8_t)oCheckFilament ); if (lcd_commands_type == LcdCommands::StopPrint) { 1d624: 81 e0 ldi r24, 0x01 ; 1 1d626: 90 91 5e 0d lds r25, 0x0D5E ; 0x800d5e 1d62a: 91 30 cpi r25, 0x01 ; 1 1d62c: 09 f4 brne .+2 ; 0x1d630 1d62e: 80 e0 ldi r24, 0x00 ; 0 } } done: return true; } 1d630: cf 91 pop r28 1d632: 1f 91 pop r17 1d634: 0f 91 pop r16 1d636: 08 95 ret return false; } } done: return true; 1d638: 81 e0 ldi r24, 0x01 ; 1 1d63a: fa cf rjmp .-12 ; 0x1d630 0001d63c : lcd_show_fullscreen_message_and_wait_P(strict); lcd_print_stop(); } } void nozzle_diameter_check(uint16_t nDiameter) { 1d63c: 1f 93 push r17 1d63e: cf 93 push r28 1d640: df 93 push r29 uint16_t nDiameter_um; if (oCheckMode == ClCheckMode::_None) 1d642: 10 91 ed 03 lds r17, 0x03ED ; 0x8003ed 1d646: 11 23 and r17, r17 1d648: 19 f1 breq .+70 ; 0x1d690 1d64a: ec 01 movw r28, r24 return; nDiameter_um = eeprom_read_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM); 1d64c: 85 ea ldi r24, 0xA5 ; 165 1d64e: 9d e0 ldi r25, 0x0D ; 13 1d650: 0f 94 ee a3 call 0x347dc ; 0x347dc if (nDiameter == nDiameter_um) 1d654: 8c 17 cp r24, r28 1d656: 9d 07 cpc r25, r29 1d658: d9 f0 breq .+54 ; 0x1d690 // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN((float)(nDiameter_um/1000.0)); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN((float)(nDiameter/1000.0)); render_M862_warnings( 1d65a: 83 e2 ldi r24, 0x23 ; 35 1d65c: 9c e4 ldi r25, 0x4C ; 76 1d65e: 0e 94 3a 75 call 0xea74 ; 0xea74 1d662: ec 01 movw r28, r24 1d664: 88 ef ldi r24, 0xF8 ; 248 1d666: 9b e4 ldi r25, 0x4B ; 75 1d668: 0e 94 3a 75 call 0xea74 ; 0xea74 1d66c: 41 2f mov r20, r17 1d66e: be 01 movw r22, r28 1d670: 0e 94 df ea call 0x1d5be ; 0x1d5be _T(MSG_NOZZLE_DIFFERS_CONTINUE) ,_T(MSG_NOZZLE_DIFFERS_CANCELLED) ,(uint8_t)oCheckMode ); if (!farm_mode) { 1d674: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1d678: 81 11 cpse r24, r1 1d67a: 0a c0 rjmp .+20 ; 0x1d690 bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 1d67c: 10 92 ec 03 sts 0x03EC, r1 ; 0x8003ec menu_submenu(lcd_hw_setup_menu); 1d680: 60 e0 ldi r22, 0x00 ; 0 1d682: 8b e5 ldi r24, 0x5B ; 91 1d684: 91 ec ldi r25, 0xC1 ; 193 } } 1d686: df 91 pop r29 1d688: cf 91 pop r28 1d68a: 1f 91 pop r17 ,(uint8_t)oCheckMode ); if (!farm_mode) { bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function menu_submenu(lcd_hw_setup_menu); 1d68c: 0c 94 dd 62 jmp 0xc5ba ; 0xc5ba } } 1d690: df 91 pop r29 1d692: cf 91 pop r28 1d694: 1f 91 pop r17 1d696: 08 95 ret 0001d698 : } static void nozzle_change() { #ifdef FILAMENT_SENSOR if (fsensor.isEnabled() && fsensor.getFilamentPresent()) { 1d698: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 1d69c: 88 23 and r24, r24 1d69e: 61 f0 breq .+24 ; 0x1d6b8 1d6a0: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 1d6a4: 88 23 and r24, r24 1d6a6: 41 f0 breq .+16 ; 0x1d6b8 lcd_show_fullscreen_message_and_wait_P(_T(MSG_UNLOAD_FILAMENT_REPEAT)); 1d6a8: 85 ee ldi r24, 0xE5 ; 229 1d6aa: 94 e4 ldi r25, 0x44 ; 68 1d6ac: 0e 94 3a 75 call 0xea74 ; 0xea74 1d6b0: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_return_to_status(); return; } #endif //FILAMENT_SENSOR lcd_commands_type = LcdCommands::NozzleCNG; lcd_return_to_status(); 1d6b4: 0d 94 d5 07 jmp 0x20faa ; 0x20faa lcd_show_fullscreen_message_and_wait_P(_T(MSG_UNLOAD_FILAMENT_REPEAT)); lcd_return_to_status(); return; } #endif //FILAMENT_SENSOR lcd_commands_type = LcdCommands::NozzleCNG; 1d6b8: 85 e0 ldi r24, 0x05 ; 5 1d6ba: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e 1d6be: fa cf rjmp .-12 ; 0x1d6b4 0001d6c0 : if (result == LCD_LEFT_BUTTON_CHOICE) { lcd_mesh_calibration_z(); } } void prompt_steel_sheet_on_bed(bool wantedState) { 1d6c0: cf 93 push r28 1d6c2: c8 2f mov r28, r24 #ifdef STEEL_SHEET bool sheetIsOnBed = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, !wantedState); 1d6c4: 8d e1 ldi r24, 0x1D ; 29 1d6c6: 90 e4 ldi r25, 0x40 ; 64 1d6c8: 0e 94 3a 75 call 0xea74 ; 0xea74 1d6cc: 41 e0 ldi r20, 0x01 ; 1 1d6ce: 4c 27 eor r20, r28 1d6d0: 60 e0 ldi r22, 0x00 ; 0 1d6d2: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 1d6d6: 91 e0 ldi r25, 0x01 ; 1 1d6d8: 81 11 cpse r24, r1 1d6da: 90 e0 ldi r25, 0x00 ; 0 if (sheetIsOnBed != wantedState) { 1d6dc: c9 17 cp r28, r25 1d6de: 59 f0 breq .+22 ; 0x1d6f6 lcd_show_fullscreen_message_and_wait_P(_T(wantedState ? MSG_PLACE_STEEL_SHEET : MSG_REMOVE_STEEL_SHEET)); 1d6e0: 83 ef ldi r24, 0xF3 ; 243 1d6e2: 9f e3 ldi r25, 0x3F ; 63 1d6e4: cc 23 and r28, r28 1d6e6: 11 f0 breq .+4 ; 0x1d6ec 1d6e8: 83 ed ldi r24, 0xD3 ; 211 1d6ea: 9f e5 ldi r25, 0x5F ; 95 1d6ec: 0e 94 3a 75 call 0xea74 ; 0xea74 } #endif //STEEL_SHEET } 1d6f0: cf 91 pop r28 void prompt_steel_sheet_on_bed(bool wantedState) { #ifdef STEEL_SHEET bool sheetIsOnBed = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, !wantedState); if (sheetIsOnBed != wantedState) { lcd_show_fullscreen_message_and_wait_P(_T(wantedState ? MSG_PLACE_STEEL_SHEET : MSG_REMOVE_STEEL_SHEET)); 1d6f2: 0c 94 94 ea jmp 0x1d528 ; 0x1d528 } #endif //STEEL_SHEET } 1d6f6: cf 91 pop r28 1d6f8: 08 95 ret 0001d6fa : // When MMU is disabled P parameter is ignored enquecommand_P(PSTR("M701 P0")); } static void wizard_lay1cal_message(bool cold) { 1d6fa: cf 93 push r28 1d6fc: c8 2f mov r28, r24 lcd_show_fullscreen_message_and_wait_P( 1d6fe: 8b e7 ldi r24, 0x7B ; 123 1d700: 9f e3 ldi r25, 0x3F ; 63 1d702: 0e 94 3a 75 call 0xea74 ; 0xea74 1d706: 0e 94 94 ea call 0x1d528 ; 0x1d528 _T(MSG_WIZARD_V2_CAL)); if (MMU2::mmu2.Enabled()) 1d70a: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1d70e: 81 30 cpi r24, 0x01 ; 1 1d710: 69 f4 brne .+26 ; 0x1d72c { lcd_show_fullscreen_message_and_wait_P( 1d712: 82 e2 ldi r24, 0x22 ; 34 1d714: 9f e3 ldi r25, 0x3F ; 63 _T(MSG_SELECT_FIL_1ST_LAYERCAL)); } else if (cold) { lcd_show_fullscreen_message_and_wait_P( 1d716: 0e 94 3a 75 call 0xea74 ; 0xea74 1d71a: 0e 94 94 ea call 0x1d528 ; 0x1d528 _T(MSG_SELECT_TEMP_MATCHES_MATERIAL)); } lcd_show_fullscreen_message_and_wait_P( 1d71e: 80 e5 ldi r24, 0x50 ; 80 1d720: 9e e3 ldi r25, 0x3E ; 62 1d722: 0e 94 3a 75 call 0xea74 ; 0xea74 _T(MSG_WIZARD_V2_CAL_2)); } 1d726: cf 91 pop r28 else if (cold) { lcd_show_fullscreen_message_and_wait_P( _T(MSG_SELECT_TEMP_MATCHES_MATERIAL)); } lcd_show_fullscreen_message_and_wait_P( 1d728: 0c 94 94 ea jmp 0x1d528 ; 0x1d528 if (MMU2::mmu2.Enabled()) { lcd_show_fullscreen_message_and_wait_P( _T(MSG_SELECT_FIL_1ST_LAYERCAL)); } else if (cold) 1d72c: cc 23 and r28, r28 1d72e: b9 f3 breq .-18 ; 0x1d71e { lcd_show_fullscreen_message_and_wait_P( 1d730: 80 ef ldi r24, 0xF0 ; 240 1d732: 9e e3 ldi r25, 0x3E ; 62 1d734: f0 cf rjmp .-32 ; 0x1d716 0001d736 : } } static void lcd_wizard_load() { if (MMU2::mmu2.Enabled()) { 1d736: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1d73a: 81 30 cpi r24, 0x01 ; 1 1d73c: 71 f4 brne .+28 ; 0x1d75a lcd_show_fullscreen_message_and_wait_P( 1d73e: 87 ef ldi r24, 0xF7 ; 247 1d740: 9d e3 ldi r25, 0x3D ; 61 1d742: 0e 94 3a 75 call 0xea74 ; 0xea74 1d746: 0e 94 94 ea call 0x1d528 ; 0x1d528 _T(MSG_MMU_INSERT_FILAMENT_FIRST_TUBE)); // NOTE: a full screen message showing which filament is being inserted // is performed by M701. For this reason MSG_LOADING_FILAMENT is not // used here when a MMU is used. eFilamentAction = FilamentAction::MmuLoad; 1d74a: 84 e0 ldi r24, 0x04 ; 4 lcd_show_fullscreen_message_and_wait_P( _T(MSG_WIZARD_LOAD_FILAMENT)); lcd_update_enable(false); lcd_clear(); lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT)); eFilamentAction = FilamentAction::Load; 1d74c: 80 93 94 03 sts 0x0394, r24 ; 0x800394 } // When MMU is disabled P parameter is ignored enquecommand_P(PSTR("M701 P0")); 1d750: 61 e0 ldi r22, 0x01 ; 1 1d752: 83 e4 ldi r24, 0x43 ; 67 1d754: 93 e8 ldi r25, 0x83 ; 131 1d756: 0c 94 e9 8e jmp 0x11dd2 ; 0x11dd2 // NOTE: a full screen message showing which filament is being inserted // is performed by M701. For this reason MSG_LOADING_FILAMENT is not // used here when a MMU is used. eFilamentAction = FilamentAction::MmuLoad; } else { lcd_show_fullscreen_message_and_wait_P( 1d75a: 8b ea ldi r24, 0xAB ; 171 1d75c: 9d e3 ldi r25, 0x3D ; 61 1d75e: 0e 94 3a 75 call 0xea74 ; 0xea74 1d762: 0e 94 94 ea call 0x1d528 ; 0x1d528 _T(MSG_WIZARD_LOAD_FILAMENT)); lcd_update_enable(false); 1d766: 80 e0 ldi r24, 0x00 ; 0 1d768: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 1d76c: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT)); 1d770: 8d ee ldi r24, 0xED ; 237 1d772: 91 e6 ldi r25, 0x61 ; 97 1d774: 0e 94 3a 75 call 0xea74 ; 0xea74 1d778: ac 01 movw r20, r24 1d77a: 62 e0 ldi r22, 0x02 ; 2 1d77c: 80 e0 ldi r24, 0x00 ; 0 1d77e: 0e 94 07 70 call 0xe00e ; 0xe00e eFilamentAction = FilamentAction::Load; 1d782: 81 e0 ldi r24, 0x01 ; 1 1d784: e3 cf rjmp .-58 ; 0x1d74c 0001d786 : //! ---------------------- | ---------------- //! WizState::Run | Main entry point //! WizState::RepeatLay1Cal | Entry point after passing 1st layer calibration //! WizState::LoadFilHot | Entry point after temporarily left for preheat before load filament void lcd_wizard(WizState state) { 1d786: af 92 push r10 1d788: bf 92 push r11 1d78a: cf 92 push r12 1d78c: df 92 push r13 1d78e: ef 92 push r14 1d790: ff 92 push r15 1d792: 0f 93 push r16 1d794: 1f 93 push r17 1d796: cf 93 push r28 1d798: c8 2f mov r28, r24 using S = WizState; bool end = false; uint8_t wizard_event; // Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point // other than WizState::Run - it is useful for debugging wizard. if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); 1d79a: 88 23 and r24, r24 1d79c: 29 f0 breq .+10 ; 0x1d7a8 1d79e: 61 e0 ldi r22, 0x01 ; 1 1d7a0: 8f e5 ldi r24, 0x5F ; 95 1d7a2: 9f e0 ldi r25, 0x0F ; 15 1d7a4: 0f 94 04 a4 call 0x34808 ; 0x34808 FORCE_BL_ON_START; while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1d7a8: 8b e4 ldi r24, 0x4B ; 75 1d7aa: e8 2e mov r14, r24 1d7ac: 83 e8 ldi r24, 0x83 ; 131 1d7ae: f8 2e mov r15, r24 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 1d7b0: 97 ed ldi r25, 0xD7 ; 215 1d7b2: c9 2e mov r12, r25 1d7b4: d1 2c mov r13, r1 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 1d7b6: 2c e3 ldi r18, 0x3C ; 60 1d7b8: a2 2e mov r10, r18 1d7ba: b1 2c mov r11, r1 1d7bc: 0c 2f mov r16, r28 1d7be: 10 e0 ldi r17, 0x00 ; 0 1d7c0: 1f 92 push r1 1d7c2: cf 93 push r28 1d7c4: ff 92 push r15 1d7c6: ef 92 push r14 1d7c8: 0f 94 a2 a2 call 0x34544 ; 0x34544 switch (state) { 1d7cc: 0f 90 pop r0 1d7ce: 0f 90 pop r0 1d7d0: 0f 90 pop r0 1d7d2: 0f 90 pop r0 1d7d4: ef ef ldi r30, 0xFF ; 255 1d7d6: ec 0f add r30, r28 1d7d8: ed 30 cpi r30, 0x0D ; 13 1d7da: a0 f4 brcc .+40 ; 0x1d804 1d7dc: f0 e0 ldi r31, 0x00 ; 0 1d7de: 88 27 eor r24, r24 1d7e0: eb 50 subi r30, 0x0B ; 11 1d7e2: f4 41 sbci r31, 0x14 ; 20 1d7e4: 8f 4f sbci r24, 0xFF ; 255 1d7e6: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 1d7ea: 50 ec ldi r21, 0xC0 ; 192 1d7ec: 70 ec ldi r23, 0xC0 ; 192 1d7ee: 7c ec ldi r23, 0xCC ; 204 1d7f0: 86 ec ldi r24, 0xC6 ; 198 1d7f2: c0 ec ldi r28, 0xC0 ; 192 1d7f4: da ec ldi r29, 0xCA ; 202 1d7f6: f1 ec ldi r31, 0xC1 ; 193 1d7f8: eb ec ldi r30, 0xCB ; 203 1d7fa: f5 ec ldi r31, 0xC5 ; 197 1d7fc: 03 ed ldi r16, 0xD3 ; 211 1d7fe: 0c ed ldi r16, 0xDC ; 220 1d800: 20 ed ldi r18, 0xD0 ; 208 1d802: 20 ed ldi r18, 0xD0 ; 208 // which results in distorted print. // This primarily happens when the printer is new and parked in 0,0 // So any new printer will fail the first layer calibration unless being reset or the Stop function gets called. // We really must find a way to prevent the crash from happening before the printer is started - that would be the correct solution. // Btw. the flag may even trigger the viper situation on normal start this way and the user won't be able to find out why. saved_printing = false; 1d804: 10 92 73 12 sts 0x1273, r1 ; 0x801273 if( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){ 1d808: 8f e5 ldi r24, 0x5F ; 95 1d80a: 9f e0 ldi r25, 0x0F ; 15 1d80c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1d810: 82 30 cpi r24, 0x02 ; 2 1d812: 39 f4 brne .+14 ; 0x1d822 // printer pre-assembled: finish remaining steps lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING)); 1d814: 81 ec ldi r24, 0xC1 ; 193 1d816: 93 e4 ldi r25, 0x43 ; 67 lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED)); state = S::Lay1CalCold; } else { lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS)); 1d818: 0e 94 3a 75 call 0xea74 ; 0xea74 1d81c: 0e 94 94 ea call 0x1d528 ; 0x1d528 1d820: 0f c0 rjmp .+30 ; 0x1d840 // printer pre-assembled: finish remaining steps lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING)); state = S::Restore; } else { // new printer, factory reset or manual invocation wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_WELCOME), false, LCD_LEFT_BUTTON_CHOICE); 1d822: 8c e5 ldi r24, 0x5C ; 92 1d824: 93 e4 ldi r25, 0x43 ; 67 1d826: 0e 94 3a 75 call 0xea74 ; 0xea74 1d82a: 40 e0 ldi r20, 0x00 ; 0 1d82c: 60 e0 ldi r22, 0x00 ; 0 1d82e: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { 1d832: 81 11 cpse r24, r1 1d834: 07 c0 rjmp .+14 ; 0x1d844 1d836: 61 e0 ldi r22, 0x01 ; 1 1d838: 8f e5 ldi r24, 0x5F ; 95 1d83a: 9f e0 ldi r25, 0x0F ; 15 1d83c: 0f 94 04 a4 call 0x34808 ; 0x34808 state = S::Lay1CalCold; } else { lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS)); state = S::Restore; 1d840: c1 e0 ldi r28, 0x01 ; 1 1d842: bc cf rjmp .-136 ; 0x1d7bc 1d844: 60 e0 ldi r22, 0x00 ; 0 1d846: 8f e5 ldi r24, 0x5F ; 95 1d848: 9f e0 ldi r25, 0x0F ; 15 1d84a: 0f 94 04 a4 call 0x34808 ; 0x34808 1d84e: c0 e0 ldi r28, 0x00 ; 0 if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); FORCE_BL_ON_START; while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1d850: 10 e0 ldi r17, 0x00 ; 0 1d852: 00 e0 ldi r16, 0x00 ; 0 } FORCE_BL_ON_END; const char *msg = NULL; printf_P(_N("Wizard end state: %d\n"), (uint8_t)state); 1d854: 1f 93 push r17 1d856: 0f 93 push r16 1d858: 8c ed ldi r24, 0xDC ; 220 1d85a: 97 e6 ldi r25, 0x67 ; 103 1d85c: 9f 93 push r25 1d85e: 8f 93 push r24 1d860: 0f 94 a2 a2 call 0x34544 ; 0x34544 switch (state) { 1d864: 0f 90 pop r0 1d866: 0f 90 pop r0 1d868: 0f 90 pop r0 1d86a: 0f 90 pop r0 1d86c: cc 30 cpi r28, 0x0C ; 12 1d86e: 09 f4 brne .+2 ; 0x1d872 1d870: ed c0 rjmp .+474 ; 0x1da4c 1d872: cd 30 cpi r28, 0x0D ; 13 1d874: 09 f4 brne .+2 ; 0x1d878 1d876: ff c0 rjmp .+510 ; 0x1da76 case S::Run: // user interrupted msg = _T(MSG_WIZARD_QUIT); 1d878: 8b eb ldi r24, 0xBB ; 187 1d87a: 90 e4 ldi r25, 0x40 ; 64 FORCE_BL_ON_END; const char *msg = NULL; printf_P(_N("Wizard end state: %d\n"), (uint8_t)state); switch (state) { 1d87c: cc 23 and r28, r28 1d87e: 09 f4 brne .+2 ; 0x1d882 1d880: fc c0 rjmp .+504 ; 0x1da7a break; } if (msg) { lcd_show_fullscreen_message_and_wait_P(msg); } lcd_update_enable(true); 1d882: 81 e0 ldi r24, 0x01 ; 1 1d884: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_update(2); 1d888: 82 e0 ldi r24, 0x02 ; 2 } 1d88a: cf 91 pop r28 1d88c: 1f 91 pop r17 1d88e: 0f 91 pop r16 1d890: ff 90 pop r15 1d892: ef 90 pop r14 1d894: df 90 pop r13 1d896: cf 90 pop r12 1d898: bf 90 pop r11 1d89a: af 90 pop r10 } if (msg) { lcd_show_fullscreen_message_and_wait_P(msg); } lcd_update_enable(true); lcd_update(2); 1d89c: 0c 94 f9 6e jmp 0xddf2 ; 0xddf2 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1d8a0: 10 92 c0 03 sts 0x03C0, r1 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> case S::Restore: // clear any previous error for make _new_ errors visible lcd_reset_alert_level(); // determine the next step in the required order if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { 1d8a4: 81 e0 ldi r24, 0x01 ; 1 1d8a6: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 state = S::Selftest; 1d8aa: c2 e0 ldi r28, 0x02 ; 2 case S::Restore: // clear any previous error for make _new_ errors visible lcd_reset_alert_level(); // determine the next step in the required order if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { 1d8ac: 88 23 and r24, r24 1d8ae: 09 f4 brne .+2 ; 0x1d8b2 1d8b0: 85 cf rjmp .-246 ; 0x1d7bc state = S::Selftest; } else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { 1d8b2: 82 e0 ldi r24, 0x02 ; 2 1d8b4: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 // S::Xyz *includes* S::Z so it needs to come before // to avoid repeating Z alignment state = S::Xyz; 1d8b8: c3 e0 ldi r28, 0x03 ; 3 lcd_reset_alert_level(); // determine the next step in the required order if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { state = S::Selftest; } else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { 1d8ba: 88 23 and r24, r24 1d8bc: 09 f4 brne .+2 ; 0x1d8c0 1d8be: 7e cf rjmp .-260 ; 0x1d7bc // S::Xyz *includes* S::Z so it needs to come before // to avoid repeating Z alignment state = S::Xyz; } else if (!calibration_status_get(CALIBRATION_STATUS_Z)) { 1d8c0: 84 e0 ldi r24, 0x04 ; 4 1d8c2: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 state = S::Z; 1d8c6: c4 e0 ldi r28, 0x04 ; 4 state = S::Selftest; } else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { // S::Xyz *includes* S::Z so it needs to come before // to avoid repeating Z alignment state = S::Xyz; } else if (!calibration_status_get(CALIBRATION_STATUS_Z)) { 1d8c8: 88 23 and r24, r24 1d8ca: 09 f4 brne .+2 ; 0x1d8ce 1d8cc: 77 cf rjmp .-274 ; 0x1d7bc state = S::Z; #ifdef THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) { state = S::ThermalModel; #endif //THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) { 1d8ce: 80 e1 ldi r24, 0x10 ; 16 1d8d0: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 state = S::IsFil; 1d8d4: c5 e0 ldi r28, 0x05 ; 5 state = S::Z; #ifdef THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) { state = S::ThermalModel; #endif //THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) { 1d8d6: 88 23 and r24, r24 1d8d8: 09 f4 brne .+2 ; 0x1d8dc 1d8da: 70 cf rjmp .-288 ; 0x1d7bc state = S::IsFil; } else { // all required steps completed, finish successfully state = S::Finish; 1d8dc: cc e0 ldi r28, 0x0C ; 12 1d8de: 6e cf rjmp .-292 ; 0x1d7bc } break; case S::Selftest: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_SELFTEST)); 1d8e0: 83 e1 ldi r24, 0x13 ; 19 1d8e2: 93 e4 ldi r25, 0x43 ; 67 1d8e4: 0e 94 3a 75 call 0xea74 ; 0xea74 1d8e8: 0e 94 94 ea call 0x1d528 ; 0x1d528 wizard_event = lcd_selftest(); 1d8ec: 0e 94 b6 e0 call 0x1c16c ; 0x1c16c state = (wizard_event ? S::Restore : S::Failed); break; case S::Xyz: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_XYZ_CAL)); wizard_event = gcode_M45(false, 0); state = (wizard_event ? S::Restore : S::Failed); 1d8f0: 81 11 cpse r24, r1 1d8f2: a6 cf rjmp .-180 ; 0x1d840 } break; case S::Selftest: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_SELFTEST)); wizard_event = lcd_selftest(); state = (wizard_event ? S::Restore : S::Failed); 1d8f4: cd e0 ldi r28, 0x0D ; 13 1d8f6: 62 cf rjmp .-316 ; 0x1d7bc break; case S::Xyz: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_XYZ_CAL)); 1d8f8: 85 ed ldi r24, 0xD5 ; 213 1d8fa: 92 e4 ldi r25, 0x42 ; 66 1d8fc: 0e 94 3a 75 call 0xea74 ; 0xea74 1d900: 0e 94 94 ea call 0x1d528 ; 0x1d528 wizard_event = gcode_M45(false, 0); 1d904: 80 e0 ldi r24, 0x00 ; 0 1d906: 0f 94 1e 7d call 0x2fa3c ; 0x2fa3c 1d90a: f2 cf rjmp .-28 ; 0x1d8f0 state = (wizard_event ? S::Restore : S::Failed); break; case S::Z: lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_SHIPPING_HELPERS)); 1d90c: 8d ea ldi r24, 0xAD ; 173 1d90e: 92 e4 ldi r25, 0x42 ; 66 1d910: 0e 94 3a 75 call 0xea74 ; 0xea74 1d914: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_TEST_PRINT)); 1d918: 8f e7 ldi r24, 0x7F ; 127 1d91a: 92 e4 ldi r25, 0x42 ; 66 1d91c: 0e 94 3a 75 call 0xea74 ; 0xea74 1d920: 0e 94 94 ea call 0x1d528 ; 0x1d528 lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_Z_CAL)); 1d924: 8f e5 ldi r24, 0x5F ; 95 1d926: 92 e4 ldi r25, 0x42 ; 66 1d928: 0e 94 3a 75 call 0xea74 ; 0xea74 1d92c: 0e 94 94 ea call 0x1d528 ; 0x1d528 wizard_event = gcode_M45(true, 0); 1d930: 81 e0 ldi r24, 0x01 ; 1 1d932: 0f 94 1e 7d call 0x2fa3c ; 0x2fa3c if (!wizard_event) { 1d936: 88 23 and r24, r24 1d938: e9 f2 breq .-70 ; 0x1d8f4 state = S::Failed; } else { raise_z_above(MIN_Z_FOR_SWAP); 1d93a: 60 e0 ldi r22, 0x00 ; 0 1d93c: 70 e0 ldi r23, 0x00 ; 0 1d93e: 88 ed ldi r24, 0xD8 ; 216 1d940: 91 e4 ldi r25, 0x41 ; 65 1d942: 0e 94 f6 6c call 0xd9ec ; 0xd9ec if(!MMU2::mmu2.Enabled()) { 1d946: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1d94a: 81 30 cpi r24, 0x01 ; 1 1d94c: 09 f4 brne .+2 ; 0x1d950 1d94e: 78 cf rjmp .-272 ; 0x1d840 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 1d950: d0 92 5e 12 sts 0x125E, r13 ; 0x80125e 1d954: c0 92 5d 12 sts 0x125D, r12 ; 0x80125d //current filament needs to be unloaded and then new filament should be loaded //start to preheat nozzle for unloading remaining PLA filament setTargetHotend(PLA_PREHEAT_HOTEND_TEMP); lcd_display_message_fullscreen_P(_T(MSG_WIZARD_WILL_PREHEAT)); 1d958: 8a e3 ldi r24, 0x3A ; 58 1d95a: 92 e4 ldi r25, 0x42 ; 66 1d95c: 0e 94 3a 75 call 0xea74 ; 0xea74 1d960: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 wait_preheat(); 1d964: 0e 94 2a e4 call 0x1c854 ; 0x1c854 unload_filament(FILAMENTCHANGE_FINALRETRACT); // unload current filament 1d968: 60 e0 ldi r22, 0x00 ; 0 1d96a: 70 e0 ldi r23, 0x00 ; 0 1d96c: cb 01 movw r24, r22 1d96e: 0e 94 7e e3 call 0x1c6fc ; 0x1c6fc lcd_wizard_load(); // load filament 1d972: 0e 94 9b eb call 0x1d736 ; 0x1d736 1d976: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1d97a: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d 1d97e: 60 cf rjmp .-320 ; 0x1d840 1d980: d0 92 5e 12 sts 0x125E, r13 ; 0x80125e 1d984: c0 92 5d 12 sts 0x125D, r12 ; 0x80125d resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 1d988: b0 92 5a 12 sts 0x125A, r11 ; 0x80125a 1d98c: a0 92 59 12 sts 0x1259, r10 ; 0x801259 #endif //THERMAL_MODEL case S::IsFil: //start to preheat nozzle and bed to save some time later setTargetHotend(PLA_PREHEAT_HOTEND_TEMP); setTargetBed(PLA_PREHEAT_HPB_TEMP); wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE); 1d990: 84 e2 ldi r24, 0x24 ; 36 1d992: 92 e4 ldi r25, 0x42 ; 66 1d994: 0e 94 3a 75 call 0xea74 ; 0xea74 1d998: 41 e0 ldi r20, 0x01 ; 1 1d99a: 60 e0 ldi r22, 0x00 ; 0 1d99c: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { 1d9a0: 88 23 and r24, r24 1d9a2: 09 f1 breq .+66 ; 0x1d9e6 state = S::Lay1CalCold; } else { // MIDDLE_BUTTON_CHOICE if(MMU2::mmu2.Enabled()) state = S::LoadFilCold; 1d9a4: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1d9a8: c7 e0 ldi r28, 0x07 ; 7 1d9aa: 81 30 cpi r24, 0x01 ; 1 1d9ac: 09 f4 brne .+2 ; 0x1d9b0 1d9ae: 06 cf rjmp .-500 ; 0x1d7bc else state = S::Preheat; 1d9b0: c6 e0 ldi r28, 0x06 ; 6 1d9b2: 04 cf rjmp .-504 ; 0x1d7bc } break; case S::Preheat: menu_goto(lcd_preheat_menu, 0, true); 1d9b4: 20 e0 ldi r18, 0x00 ; 0 1d9b6: 41 e0 ldi r20, 0x01 ; 1 1d9b8: 70 e0 ldi r23, 0x00 ; 0 1d9ba: 60 e0 ldi r22, 0x00 ; 0 1d9bc: 86 e7 ldi r24, 0x76 ; 118 1d9be: 97 e3 ldi r25, 0x37 ; 55 1d9c0: 0e 94 b7 62 call 0xc56e ; 0xc56e lcd_show_fullscreen_message_and_wait_P(_T(MSG_SEL_PREHEAT_TEMP)); 1d9c4: 83 ee ldi r24, 0xE3 ; 227 1d9c6: 91 e4 ldi r25, 0x41 ; 65 1d9c8: 0e 94 3a 75 call 0xea74 ; 0xea74 1d9cc: 0e 94 94 ea call 0x1d528 ; 0x1d528 if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); FORCE_BL_ON_START; while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1d9d0: 06 e0 ldi r16, 0x06 ; 6 1d9d2: 10 e0 ldi r17, 0x00 ; 0 1d9d4: 3f cf rjmp .-386 ; 0x1d854 menu_goto(lcd_preheat_menu, 0, true); lcd_show_fullscreen_message_and_wait_P(_T(MSG_SEL_PREHEAT_TEMP)); end = true; // Leave wizard temporarily for lcd_preheat_menu break; case S::LoadFilHot: wait_preheat(); 1d9d6: 0e 94 2a e4 call 0x1c854 ; 0x1c854 lcd_wizard_load(); 1d9da: 0e 94 9b eb call 0x1d736 ; 0x1d736 state = S::Lay1CalHot; 1d9de: ca e0 ldi r28, 0x0A ; 10 1d9e0: ed ce rjmp .-550 ; 0x1d7bc break; case S::LoadFilCold: lcd_wizard_load(); 1d9e2: 0e 94 9b eb call 0x1d736 ; 0x1d736 case S::RepeatLay1Cal: wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_REPEAT_V2_CAL), false); if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED)); state = S::Lay1CalCold; 1d9e6: c9 e0 ldi r28, 0x09 ; 9 1d9e8: e9 ce rjmp .-558 ; 0x1d7bc case S::LoadFilCold: lcd_wizard_load(); state = S::Lay1CalCold; break; case S::Lay1CalCold: wizard_lay1cal_message(true); 1d9ea: 81 e0 ldi r24, 0x01 ; 1 1d9ec: 0e 94 7d eb call 0x1d6fa ; 0x1d6fa menu_goto(lcd_v2_calibration, 0, true); 1d9f0: 20 e0 ldi r18, 0x00 ; 0 1d9f2: 41 e0 ldi r20, 0x01 ; 1 1d9f4: 70 e0 ldi r23, 0x00 ; 0 1d9f6: 60 e0 ldi r22, 0x00 ; 0 1d9f8: 86 e9 ldi r24, 0x96 ; 150 1d9fa: 99 ee ldi r25, 0xE9 ; 233 1d9fc: 0e 94 b7 62 call 0xc56e ; 0xc56e if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); FORCE_BL_ON_START; while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1da00: 09 e0 ldi r16, 0x09 ; 9 1da02: 10 e0 ldi r17, 0x00 ; 0 1da04: 27 cf rjmp .-434 ; 0x1d854 wizard_lay1cal_message(true); menu_goto(lcd_v2_calibration, 0, true); end = true; // Leave wizard temporarily for lcd_v2_calibration break; case S::Lay1CalHot: wizard_lay1cal_message(false); 1da06: 80 e0 ldi r24, 0x00 ; 0 1da08: 0e 94 7d eb call 0x1d6fa ; 0x1d6fa lcd_commands_type = LcdCommands::Layer1Cal; 1da0c: 84 e0 ldi r24, 0x04 ; 4 1da0e: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); FORCE_BL_ON_START; while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1da12: 0a e0 ldi r16, 0x0A ; 10 1da14: 10 e0 ldi r17, 0x00 ; 0 1da16: 1e cf rjmp .-452 ; 0x1d854 wizard_lay1cal_message(false); lcd_commands_type = LcdCommands::Layer1Cal; end = true; // Leave wizard temporarily for lcd_v2_calibration break; case S::RepeatLay1Cal: wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_REPEAT_V2_CAL), false); 1da18: 80 e9 ldi r24, 0x90 ; 144 1da1a: 91 e4 ldi r25, 0x41 ; 65 1da1c: 0e 94 3a 75 call 0xea74 ; 0xea74 1da20: 41 e0 ldi r20, 0x01 ; 1 1da22: 60 e0 ldi r22, 0x00 ; 0 1da24: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) 1da28: 81 11 cpse r24, r1 1da2a: 07 c0 rjmp .+14 ; 0x1da3a { lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED)); 1da2c: 80 e6 ldi r24, 0x60 ; 96 1da2e: 91 e4 ldi r25, 0x41 ; 65 1da30: 0e 94 3a 75 call 0xea74 ; 0xea74 1da34: 0e 94 94 ea call 0x1d528 ; 0x1d528 1da38: d6 cf rjmp .-84 ; 0x1d9e6 state = S::Lay1CalCold; } else { lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS)); 1da3a: 8a ef ldi r24, 0xFA ; 250 1da3c: 90 e4 ldi r25, 0x40 ; 64 1da3e: ec ce rjmp .-552 ; 0x1d818 1da40: 60 e0 ldi r22, 0x00 ; 0 1da42: 8f e5 ldi r24, 0x5F ; 95 1da44: 9f e0 ldi r25, 0x0F ; 15 1da46: 0f 94 04 a4 call 0x34808 ; 0x34808 1da4a: 04 cf rjmp .-504 ; 0x1d854 msg = _T(MSG_WIZARD_QUIT); break; case S::Finish: // we are successfully finished msg = _T(MSG_WIZARD_DONE); 1da4c: 8c e9 ldi r24, 0x9C ; 156 1da4e: 90 e4 ldi r25, 0x40 ; 64 1da50: 0e 94 3a 75 call 0xea74 ; 0xea74 1da54: 8c 01 movw r16, r24 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1da56: 10 92 c0 03 sts 0x03C0, r1 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> case S::Finish: // we are successfully finished msg = _T(MSG_WIZARD_DONE); lcd_reset_alert_level(); lcd_setstatuspgm(MSG_WELCOME); 1da5a: 86 ee ldi r24, 0xE6 ; 230 1da5c: 9b e6 ldi r25, 0x6B ; 107 1da5e: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_return_to_status(); 1da62: 0f 94 d5 07 call 0x20faa ; 0x20faa default: // exiting for later re-entry break; } if (msg) { 1da66: 01 15 cp r16, r1 1da68: 11 05 cpc r17, r1 1da6a: 09 f4 brne .+2 ; 0x1da6e 1da6c: 0a cf rjmp .-492 ; 0x1d882 lcd_show_fullscreen_message_and_wait_P(msg); 1da6e: c8 01 movw r24, r16 1da70: 0e 94 94 ea call 0x1d528 ; 0x1d528 1da74: 06 cf rjmp .-500 ; 0x1d882 lcd_return_to_status(); break; case S::Failed: // aborted due to failure msg = _T(MSG_WIZARD_CALIBRATION_FAILED); 1da76: 8a e3 ldi r24, 0x3A ; 58 1da78: 90 e4 ldi r25, 0x40 ; 64 1da7a: 0e 94 3a 75 call 0xea74 ; 0xea74 1da7e: 8c 01 movw r16, r24 1da80: f2 cf rjmp .-28 ; 0x1da66 0001da82
: void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { 1da82: cf 93 push r28 1da84: df 93 push r29 1da86: 00 d0 rcall .+0 ; 0x1da88 1da88: 00 d0 rcall .+0 ; 0x1da8a 1da8a: 00 d0 rcall .+0 ; 0x1da8c 1da8c: 1f 92 push r1 1da8e: cd b7 in r28, 0x3d ; 61 1da90: de b7 in r29, 0x3e ; 62 void init() { // this needs to be called before setup() or some functions won't // work there sei(); 1da92: 78 94 sei // on the ATmega168, timer 0 is also used for fast hardware pwm // (using phase-correct PWM would mean that timer 0 overflowed half as often // resulting in different millis() behavior on the ATmega8 and ATmega168) #if defined(TCCR0A) && defined(WGM01) sbi(TCCR0A, WGM01); 1da94: 84 b5 in r24, 0x24 ; 36 1da96: 82 60 ori r24, 0x02 ; 2 1da98: 84 bd out 0x24, r24 ; 36 sbi(TCCR0A, WGM00); 1da9a: 84 b5 in r24, 0x24 ; 36 1da9c: 81 60 ori r24, 0x01 ; 1 1da9e: 84 bd out 0x24, r24 ; 36 // this combination is for the standard atmega8 sbi(TCCR0, CS01); sbi(TCCR0, CS00); #elif defined(TCCR0B) && defined(CS01) && defined(CS00) // this combination is for the standard 168/328/1280/2560 sbi(TCCR0B, CS01); 1daa0: 85 b5 in r24, 0x25 ; 37 1daa2: 82 60 ori r24, 0x02 ; 2 1daa4: 85 bd out 0x25, r24 ; 37 sbi(TCCR0B, CS00); 1daa6: 85 b5 in r24, 0x25 ; 37 1daa8: 81 60 ori r24, 0x01 ; 1 1daaa: 85 bd out 0x25, r24 ; 37 // enable timer 0 overflow interrupt #if defined(TIMSK) && defined(TOIE0) sbi(TIMSK, TOIE0); #elif defined(TIMSK0) && defined(TOIE0) sbi(TIMSK0, TOIE0); 1daac: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> 1dab0: 81 60 ori r24, 0x01 ; 1 1dab2: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> // this is better for motors as it ensures an even waveform // note, however, that fast pwm mode can achieve a frequency of up // 8 MHz (with a 16 MHz clock) at 50% duty cycle #if defined(TCCR1B) && defined(CS11) && defined(CS10) TCCR1B = 0; 1dab6: 10 92 81 00 sts 0x0081, r1 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> // set timer 1 prescale factor to 64 sbi(TCCR1B, CS11); 1daba: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> 1dabe: 82 60 ori r24, 0x02 ; 2 1dac0: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> #if F_CPU >= 8000000L sbi(TCCR1B, CS10); 1dac4: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> 1dac8: 81 60 ori r24, 0x01 ; 1 1daca: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> sbi(TCCR1, CS10); #endif #endif // put timer 1 in 8-bit phase correct pwm mode #if defined(TCCR1A) && defined(WGM10) sbi(TCCR1A, WGM10); 1dace: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1dad2: 81 60 ori r24, 0x01 ; 1 1dad4: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> // set timer 2 prescale factor to 64 #if defined(TCCR2) && defined(CS22) sbi(TCCR2, CS22); #elif defined(TCCR2B) && defined(CS22) sbi(TCCR2B, CS22); 1dad8: 80 91 b1 00 lds r24, 0x00B1 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1> 1dadc: 84 60 ori r24, 0x04 ; 4 1dade: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1> // configure timer 2 for phase correct pwm (8-bit) #if defined(TCCR2) && defined(WGM20) sbi(TCCR2, WGM20); #elif defined(TCCR2A) && defined(WGM20) sbi(TCCR2A, WGM20); 1dae2: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1dae6: 81 60 ori r24, 0x01 ; 1 1dae8: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> //#else // Timer 2 not finished (may not be present on this CPU) #endif #if defined(TCCR3B) && defined(CS31) && defined(WGM30) sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 1daec: 80 91 91 00 lds r24, 0x0091 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> 1daf0: 82 60 ori r24, 0x02 ; 2 1daf2: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> sbi(TCCR3B, CS30); 1daf6: 80 91 91 00 lds r24, 0x0091 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> 1dafa: 81 60 ori r24, 0x01 ; 1 1dafc: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode 1db00: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1db04: 81 60 ori r24, 0x01 ; 1 1db06: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D #else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ #if defined(TCCR4B) && defined(CS41) && defined(WGM40) sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 1db0a: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 1db0e: 82 60 ori r24, 0x02 ; 2 1db10: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> sbi(TCCR4B, CS40); 1db14: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 1db18: 81 60 ori r24, 0x01 ; 1 1db1a: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode 1db1e: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1db22: 81 60 ori r24, 0x01 ; 1 1db24: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> #endif #endif /* end timer4 block for ATMEGA1280/2560 and similar */ #if defined(TCCR5B) && defined(CS51) && defined(WGM50) sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 1db28: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> 1db2c: 82 60 ori r24, 0x02 ; 2 1db2e: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> sbi(TCCR5B, CS50); 1db32: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> 1db36: 81 60 ori r24, 0x01 ; 1 1db38: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode 1db3c: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1db40: 81 60 ori r24, 0x01 ; 1 1db42: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> #endif #if defined(ADCSRA) // set a2d prescaler so we are inside the desired 50-200 KHz range. #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz sbi(ADCSRA, ADPS2); 1db46: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1db4a: 84 60 ori r24, 0x04 ; 4 1db4c: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> sbi(ADCSRA, ADPS1); 1db50: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1db54: 82 60 ori r24, 0x02 ; 2 1db56: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> sbi(ADCSRA, ADPS0); 1db5a: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1db5e: 81 60 ori r24, 0x01 ; 1 1db60: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> cbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #endif // enable a2d conversions sbi(ADCSRA, ADEN); 1db64: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1db68: 80 68 ori r24, 0x80 ; 128 1db6a: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> // here so they can be used as normal digital i/o; they will be // reconnected in Serial.begin() #if defined(UCSRB) UCSRB = 0; #elif defined(UCSR0B) UCSR0B = 0; 1db6e: 10 92 c1 00 sts 0x00C1, r1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> // after the program starts since there's no danger in doing this. // The reason for this is because old bootloaders might not handle the watchdog timer at all, // leaving it enabled when jumping to the program. This could cause another watchdog reset // during setup() if not handled properly. So to avoid any issue of this kind, stop the // watchdog timer manually. ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 1db72: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 1db74: f8 94 cli wdt_reset(); 1db76: a8 95 wdr MCUSR &= ~_BV(WDRF); 1db78: 84 b7 in r24, 0x34 ; 52 1db7a: 87 7f andi r24, 0xF7 ; 247 1db7c: 84 bf out 0x34, r24 ; 52 "out __SREG__,__tmp_reg__" "\n\t" : [TEMPREG] "=d" (temp_reg) : [WDTREG] "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), [WDCE_WDE] "n" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))) : "r0" ); 1db7e: 0f b6 in r0, 0x3f ; 63 1db80: f8 94 cli 1db82: a8 95 wdr 1db84: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1db88: 88 61 ori r24, 0x18 ; 24 1db8a: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1db8e: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1db92: 0f be out 0x3f, r0 ; 63 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 1db94: 9f bf out 0x3f, r25 ; 63 CRITICAL_SECTION_END; } void timer2_init(void) { CRITICAL_SECTION_START; 1db96: 9f b7 in r25, 0x3f ; 63 1db98: f8 94 cli // Everything, that used to be on timer0 was moved to timer2 (delay, beeping, millis etc.) //setup timer2 TCCR2A = 0x00; //COM_A-B=00, WGM_0-1=00 1db9a: 10 92 b0 00 sts 0x00B0, r1 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> TCCR2B = (4 << CS20); //WGM_2=0, CS_0-2=011 1db9e: 84 e0 ldi r24, 0x04 ; 4 1dba0: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1> //mask timer2 interrupts - enable OVF, disable others TIMSK2 |= (1< 1dba8: 81 60 ori r24, 0x01 ; 1 1dbaa: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> TIMSK2 &= ~(1< 1dbb2: 8d 7f andi r24, 0xFD ; 253 1dbb4: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> TIMSK2 &= ~(1< 1dbbc: 8b 7f andi r24, 0xFB ; 251 1dbbe: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> //set timer2 OCR registers (OCRB interrupt generated 0.5ms after OVF interrupt) OCR2A = 0; 1dbc2: 10 92 b3 00 sts 0x00B3, r1 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3> CRITICAL_SECTION_END; 1dbc6: 9f bf out 0x3f, r25 ; 63 return 0; } void lcd_init(void) { WRITE(LCD_PINS_ENABLE,LOW); 1dbc8: 5b 98 cbi 0x0b, 3 ; 11 SET_OUTPUT(LCD_PINS_RS); 1dbca: 55 9a sbi 0x0a, 5 ; 10 SET_OUTPUT(LCD_PINS_ENABLE); 1dbcc: 53 9a sbi 0x0a, 3 ; 10 SET_OUTPUT(LCD_PINS_D0); SET_OUTPUT(LCD_PINS_D1); SET_OUTPUT(LCD_PINS_D2); SET_OUTPUT(LCD_PINS_D3); #endif SET_OUTPUT(LCD_PINS_D4); 1dbce: 52 9a sbi 0x0a, 2 ; 10 SET_OUTPUT(LCD_PINS_D5); 1dbd0: 9c 9a sbi 0x13, 4 ; 19 SET_OUTPUT(LCD_PINS_D6); 1dbd2: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1dbd6: 80 68 ori r24, 0x80 ; 128 1dbd8: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> SET_OUTPUT(LCD_PINS_D7); 1dbdc: 9b 9a sbi 0x13, 3 ; 19 #ifdef LCD_8BIT lcd_displayfunction |= LCD_8BITMODE; #endif lcd_displayfunction |= LCD_2LINE; 1dbde: 80 91 00 04 lds r24, 0x0400 ; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513> 1dbe2: 88 60 ori r24, 0x08 ; 8 1dbe4: 80 93 00 04 sts 0x0400, r24 ; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513> 1dbe8: 2f ef ldi r18, 0xFF ; 255 1dbea: 30 e7 ldi r19, 0x70 ; 112 1dbec: 82 e0 ldi r24, 0x02 ; 2 1dbee: 21 50 subi r18, 0x01 ; 1 1dbf0: 30 40 sbci r19, 0x00 ; 0 1dbf2: 80 40 sbci r24, 0x00 ; 0 1dbf4: e1 f7 brne .-8 ; 0x1dbee 1dbf6: 00 c0 rjmp .+0 ; 0x1dbf8 1dbf8: 00 00 nop _delay_us(50000); lcd_begin(1); //first time init 1dbfa: 81 e0 ldi r24, 0x01 ; 1 1dbfc: 0e 94 5e 70 call 0xe0bc ; 0xe0bc fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream 1dc00: 8b e6 ldi r24, 0x6B ; 107 1dc02: 93 e7 ldi r25, 0x73 ; 115 1dc04: 90 93 fb 03 sts 0x03FB, r25 ; 0x8003fb <_lcdout+0x9> 1dc08: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa <_lcdout+0x8> 1dc0c: 10 92 fd 03 sts 0x03FD, r1 ; 0x8003fd <_lcdout+0xb> 1dc10: 10 92 fc 03 sts 0x03FC, r1 ; 0x8003fc <_lcdout+0xa> 1dc14: 12 e0 ldi r17, 0x02 ; 2 1dc16: 10 93 f5 03 sts 0x03F5, r17 ; 0x8003f5 <_lcdout+0x3> 1dc1a: 10 92 ff 03 sts 0x03FF, r1 ; 0x8003ff <_lcdout+0xd> 1dc1e: 10 92 fe 03 sts 0x03FE, r1 ; 0x8003fe <_lcdout+0xc> void ultralcd_init() { backlight_init(); lcd_init(); lcd_refresh(); 1dc22: 0e 94 9f 70 call 0xe13e ; 0xe13e lcd_longpress_func = menu_lcd_longpress_func; 1dc26: 8b e6 ldi r24, 0x6B ; 107 1dc28: 98 ec ldi r25, 0xC8 ; 200 1dc2a: 90 93 07 04 sts 0x0407, r25 ; 0x800407 1dc2e: 80 93 06 04 sts 0x0406, r24 ; 0x800406 lcd_lcdupdate_func = menu_lcd_lcdupdate_func; 1dc32: 88 ec ldi r24, 0xC8 ; 200 1dc34: 9a ef ldi r25, 0xFA ; 250 1dc36: 90 93 05 04 sts 0x0405, r25 ; 0x800405 1dc3a: 80 93 04 04 sts 0x0404, r24 ; 0x800404 menu_menu = lcd_status_screen; 1dc3e: 80 e2 ldi r24, 0x20 ; 32 1dc40: 97 e3 ldi r25, 0x37 ; 55 1dc42: 90 93 03 04 sts 0x0403, r25 ; 0x800403 1dc46: 80 93 02 04 sts 0x0402, r24 ; 0x800402 SET_INPUT(BTN_EN1); 1dc4a: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1dc4e: 8b 7f andi r24, 0xFB ; 251 1dc50: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> SET_INPUT(BTN_EN2); 1dc54: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1dc58: 8d 7f andi r24, 0xFD ; 253 1dc5a: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> WRITE(BTN_EN1, HIGH); 1dc5e: 9f b7 in r25, 0x3f ; 63 1dc60: f8 94 cli 1dc62: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dc66: 84 60 ori r24, 0x04 ; 4 1dc68: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dc6c: 9f bf out 0x3f, r25 ; 63 WRITE(BTN_EN2, HIGH); 1dc6e: 9f b7 in r25, 0x3f ; 63 1dc70: f8 94 cli 1dc72: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dc76: 82 60 ori r24, 0x02 ; 2 1dc78: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dc7c: 9f bf out 0x3f, r25 ; 63 #if BTN_ENC > 0 SET_INPUT(BTN_ENC); 1dc7e: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1dc82: 8f 7b andi r24, 0xBF ; 191 1dc84: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> WRITE(BTN_ENC, HIGH); 1dc88: 9f b7 in r25, 0x3f ; 63 1dc8a: f8 94 cli 1dc8c: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1dc90: 80 64 ori r24, 0x40 ; 64 1dc92: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1dc96: 9f bf out 0x3f, r25 ; 63 #endif #if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) SET_INPUT(SDCARDDETECT); 1dc98: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1dc9c: 8e 7f andi r24, 0xFE ; 254 1dc9e: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> WRITE(SDCARDDETECT, HIGH); 1dca2: 9f b7 in r25, 0x3f ; 63 1dca4: f8 94 cli 1dca6: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dcaa: 81 60 ori r24, 0x01 ; 1 1dcac: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1dcb0: 9f bf out 0x3f, r25 ; 63 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 1dcb2: af e9 ldi r26, 0x9F ; 159 1dcb4: bf e0 ldi r27, 0x0F ; 15 1dcb6: 11 97 sbiw r26, 0x01 ; 1 1dcb8: f1 f7 brne .-4 ; 0x1dcb6 1dcba: 00 c0 rjmp .+0 ; 0x1dcbc 1dcbc: 00 00 nop _delay_ms(1); //wait for the pullups to raise the line lcd_oldcardstatus = IS_SD_INSERTED; 1dcbe: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 1dcc2: 80 95 com r24 1dcc4: 81 70 andi r24, 0x01 ; 1 1dcc6: 80 93 01 04 sts 0x0401, r24 ; 0x800401 #endif//(SDCARDDETECT > 0) // Initialise status line strncpy_P(lcd_status_message, MSG_WELCOME, LCD_WIDTH); 1dcca: 44 e1 ldi r20, 0x14 ; 20 1dccc: 50 e0 ldi r21, 0x00 ; 0 1dcce: 66 ee ldi r22, 0xE6 ; 230 1dcd0: 7b e6 ldi r23, 0x6B ; 107 1dcd2: 85 e6 ldi r24, 0x65 ; 101 1dcd4: 94 e0 ldi r25, 0x04 ; 4 1dcd6: 0f 94 cd a1 call 0x3439a ; 0x3439a extern "C" { #endif //defined(__cplusplus) static inline void spi_init() { DDRB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO)); 1dcda: 84 b1 in r24, 0x04 ; 4 1dcdc: 81 7f andi r24, 0xF1 ; 241 1dcde: 84 b9 out 0x04, r24 ; 4 DDRB |= (1 << DD_SS) | (1 << DD_SCK) | (1 << DD_MOSI); 1dce0: 84 b1 in r24, 0x04 ; 4 1dce2: 87 60 ori r24, 0x07 ; 7 1dce4: 84 b9 out 0x04, r24 ; 4 PORTB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO)); 1dce6: 85 b1 in r24, 0x05 ; 5 1dce8: 81 7f andi r24, 0xF1 ; 241 1dcea: 85 b9 out 0x05, r24 ; 5 PORTB |= (1 << DD_SS); 1dcec: 28 9a sbi 0x05, 0 ; 5 SPCR = SPI_SPCR(0, 0, 0, 1, 0); //SPE=1, MSTR=1 (0x50) 1dcee: 80 e5 ldi r24, 0x50 ; 80 1dcf0: 8c bd out 0x2c, r24 ; 44 SPSR = 0x00; 1dcf2: 1d bc out 0x2d, r1 ; 45 } void lcd_splash() { lcd_clear(); // clears display and homes screen 1dcf4: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_printf_P(PSTR("\n Original Prusa i3\n Prusa Research\n%20.20S"), PSTR(FW_VERSION)); 1dcf8: 80 e8 ldi r24, 0x80 ; 128 1dcfa: 96 e8 ldi r25, 0x86 ; 134 1dcfc: 9f 93 push r25 1dcfe: 8f 93 push r24 1dd00: 87 e8 ldi r24, 0x87 ; 135 1dd02: 96 e8 ldi r25, 0x86 ; 134 1dd04: 9f 93 push r25 1dd06: 8f 93 push r24 1dd08: 0e 94 0b 6f call 0xde16 ; 0xde16 static void Sound_DoSound_Encoder_Move(void); static void Sound_DoSound_Blind_Alert(void); void Sound_Init(void) { SET_OUTPUT(BEEPER); 1dd0c: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1dd10: 84 60 ori r24, 0x04 ; 4 1dd12: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> eSoundMode = static_cast(eeprom_init_default_byte((uint8_t*)EEPROM_SOUND_MODE, e_SOUND_MODE_DEFAULT)); 1dd16: 60 e0 ldi r22, 0x00 ; 0 1dd18: 87 ed ldi r24, 0xD7 ; 215 1dd1a: 9e e0 ldi r25, 0x0E ; 14 1dd1c: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1dd20: 80 93 47 04 sts 0x0447, r24 ; 0x800447 spi_init(); lcd_splash(); Sound_Init(); // also guarantee "SET_OUTPUT(BEEPER)" selectedSerialPort = eeprom_init_default_byte((uint8_t *)EEPROM_SECOND_SERIAL_ACTIVE, 0); 1dd24: 60 e0 ldi r22, 0x00 ; 0 1dd26: 88 e0 ldi r24, 0x08 ; 8 1dd28: 9f e0 ldi r25, 0x0F ; 15 1dd2a: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1dd2e: 80 93 1c 06 sts 0x061C, r24 ; 0x80061c MYSERIAL.begin(BAUDRATE); 1dd32: 0f 94 fb 8f call 0x31ff6 ; 0x31ff6 fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream 1dd36: 8f eb ldi r24, 0xBF ; 191 1dd38: 9a e7 ldi r25, 0x7A ; 122 1dd3a: 90 93 59 04 sts 0x0459, r25 ; 0x800459 <_uartout+0x9> 1dd3e: 80 93 58 04 sts 0x0458, r24 ; 0x800458 <_uartout+0x8> 1dd42: 10 92 5b 04 sts 0x045B, r1 ; 0x80045b <_uartout+0xb> 1dd46: 10 92 5a 04 sts 0x045A, r1 ; 0x80045a <_uartout+0xa> 1dd4a: 10 93 53 04 sts 0x0453, r17 ; 0x800453 <_uartout+0x3> 1dd4e: 10 92 5d 04 sts 0x045D, r1 ; 0x80045d <_uartout+0xd> 1dd52: 10 92 5c 04 sts 0x045C, r1 ; 0x80045c <_uartout+0xc> stdout = uartout; 1dd56: 80 e5 ldi r24, 0x50 ; 80 1dd58: 94 e0 ldi r25, 0x04 ; 4 1dd5a: 90 93 14 17 sts 0x1714, r25 ; 0x801714 <__iob+0x3> 1dd5e: 80 93 13 17 sts 0x1713, r24 ; 0x801713 <__iob+0x2> void prusa_statistics_update_from_lcd_update() { lcd_send_status(); } void farm_mode_init() { farm_mode = eeprom_init_default_byte((uint8_t*)EEPROM_FARM_MODE, 0); 1dd62: 60 e0 ldi r22, 0x00 ; 0 1dd64: 84 ec ldi r24, 0xC4 ; 196 1dd66: 9f e0 ldi r25, 0x0F ; 15 1dd68: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1dd6c: 80 93 60 0d sts 0x0D60, r24 ; 0x800d60 if (farm_mode) { 1dd70: 0f 90 pop r0 1dd72: 0f 90 pop r0 1dd74: 0f 90 pop r0 1dd76: 0f 90 pop r0 1dd78: 88 23 and r24, r24 1dd7a: 79 f0 breq .+30 ; 0x1dd9a no_response = true; //we need confirmation by recieving PRUSA thx 1dd7c: 81 e0 ldi r24, 0x01 ; 1 1dd7e: 80 93 08 04 sts 0x0408, r24 ; 0x800408 <_ZL11no_response.lto_priv.493> prusa_statistics(8); 1dd82: 88 e0 ldi r24, 0x08 ; 8 1dd84: 0f 94 79 32 call 0x264f2 ; 0x264f2 #ifdef HAS_SECOND_SERIAL_PORT selectedSerialPort = 1; #endif //HAS_SECOND_SERIAL_PORT MYSERIAL.begin(BAUDRATE); 1dd88: 0f 94 fb 8f call 0x31ff6 ; 0x31ff6 fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 1dd8c: 10 92 f2 16 sts 0x16F2, r1 ; 0x8016f2 1dd90: 61 e0 ldi r22, 0x01 ; 1 1dd92: 87 e8 ldi r24, 0x87 ; 135 1dd94: 9f e0 ldi r25, 0x0F ; 15 1dd96: 0f 94 04 a4 call 0x34808 ; 0x34808 } #endif //PRUSA_SN_SUPPORT #ifndef XFLASH SERIAL_PROTOCOLLNPGM("start"); 1dd9a: 88 e7 ldi r24, 0x78 ; 120 1dd9c: 97 e8 ldi r25, 0x87 ; 135 1dd9e: 0e 94 bd 7c call 0xf97a ; 0xf97a #else if ((optiboot_status != 0) || (selectedSerialPort != 0)) SERIAL_PROTOCOLLNPGM("start"); #endif SERIAL_ECHO_START; 1dda2: 8e ec ldi r24, 0xCE ; 206 1dda4: 91 ea ldi r25, 0xA1 ; 161 1dda6: 0e 94 c4 7a call 0xf588 ; 0xf588 puts_P(PSTR(" " FW_VERSION_FULL "_" FW_COMMIT_HASH)); 1ddaa: 81 e6 ldi r24, 0x61 ; 97 1ddac: 97 e8 ldi r25, 0x87 ; 135 1ddae: 0f 94 c9 a2 call 0x34592 ; 0x34592 // by default the MMU shall remain disabled - PFW-1418 if (eeprom_init_default_byte((uint8_t *)EEPROM_MMU_ENABLED, 0)) { 1ddb2: 60 e0 ldi r22, 0x00 ; 0 1ddb4: 8c ea ldi r24, 0xAC ; 172 1ddb6: 9c e0 ldi r25, 0x0C ; 12 1ddb8: 0e 94 5d 78 call 0xf0ba ; 0xf0ba 1ddbc: 81 11 cpse r24, r1 MMU2::mmu2.Start(); 1ddbe: 0f 94 80 95 call 0x32b00 ; 0x32b00 } MMU2::mmu2.Status(); 1ddc2: 0f 94 ad 65 call 0x2cb5a ; 0x2cb5a } void SpoolJoin::initSpoolJoinStatus() { // Useful information to see during bootup SERIAL_ECHOPGM("SpoolJoin is "); 1ddc6: 85 eb ldi r24, 0xB5 ; 181 1ddc8: 96 e8 ldi r25, 0x86 ; 134 1ddca: 0e 94 c4 7a call 0xf588 ; 0xf588 uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)EEPROM::Disabled); 1ddce: 62 e0 ldi r22, 0x02 ; 2 1ddd0: 86 ed ldi r24, 0xD6 ; 214 1ddd2: 9e e0 ldi r25, 0x0E ; 14 1ddd4: 0e 94 5d 78 call 0xf0ba ; 0xf0ba if (status == (uint8_t)EEPROM::Enabled) 1ddd8: 81 30 cpi r24, 0x01 ; 1 1ddda: 09 f0 breq .+2 ; 0x1ddde 1dddc: 74 c0 rjmp .+232 ; 0x1dec6 { SERIAL_ECHOLNRPGM(_O(MSG_ON)); 1ddde: 8c e9 ldi r24, 0x9C ; 156 1dde0: 92 e6 ldi r25, 0x62 ; 98 } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); 1dde2: 0e 94 bd 7c call 0xf97a ; 0xf97a #endif #endif //DEBUG_SEC_LANG // Check startup - does nothing if bootloader sets MCUSR to 0 byte mcu = MCUSR; 1dde6: 14 b7 in r17, 0x34 ; 52 /* if (mcu & 1) SERIAL_ECHOLNRPGM(MSG_POWERUP); if (mcu & 2) SERIAL_ECHOLNRPGM(MSG_EXTERNAL_RESET); if (mcu & 4) SERIAL_ECHOLNRPGM(MSG_BROWNOUT_RESET); if (mcu & 8) SERIAL_ECHOLNRPGM(MSG_WATCHDOG_RESET); if (mcu & 32) SERIAL_ECHOLNRPGM(MSG_SOFTWARE_RESET);*/ if (mcu & 1) puts_P(MSG_POWERUP); 1dde8: 10 ff sbrs r17, 0 1ddea: 04 c0 rjmp .+8 ; 0x1ddf4 1ddec: 80 ec ldi r24, 0xC0 ; 192 1ddee: 99 e6 ldi r25, 0x69 ; 105 1ddf0: 0f 94 c9 a2 call 0x34592 ; 0x34592 if (mcu & 2) puts_P(MSG_EXTERNAL_RESET); 1ddf4: 11 ff sbrs r17, 1 1ddf6: 04 c0 rjmp .+8 ; 0x1de00 1ddf8: 80 eb ldi r24, 0xB0 ; 176 1ddfa: 99 e6 ldi r25, 0x69 ; 105 1ddfc: 0f 94 c9 a2 call 0x34592 ; 0x34592 if (mcu & 4) puts_P(MSG_BROWNOUT_RESET); 1de00: 12 ff sbrs r17, 2 1de02: 04 c0 rjmp .+8 ; 0x1de0c 1de04: 8f e9 ldi r24, 0x9F ; 159 1de06: 99 e6 ldi r25, 0x69 ; 105 1de08: 0f 94 c9 a2 call 0x34592 ; 0x34592 if (mcu & 8) puts_P(MSG_WATCHDOG_RESET); 1de0c: 13 ff sbrs r17, 3 1de0e: 04 c0 rjmp .+8 ; 0x1de18 1de10: 8f e8 ldi r24, 0x8F ; 143 1de12: 99 e6 ldi r25, 0x69 ; 105 1de14: 0f 94 c9 a2 call 0x34592 ; 0x34592 if (mcu & 32) puts_P(MSG_SOFTWARE_RESET); 1de18: 15 ff sbrs r17, 5 1de1a: 04 c0 rjmp .+8 ; 0x1de24 1de1c: 8f e7 ldi r24, 0x7F ; 127 1de1e: 99 e6 ldi r25, 0x69 ; 105 1de20: 0f 94 c9 a2 call 0x34592 ; 0x34592 MCUSR = 0; 1de24: 14 be out 0x34, r1 ; 52 //SERIAL_ECHORPGM(MSG_MARLIN); //SERIAL_ECHOLNRPGM(VERSION_STRING); #ifdef STRING_VERSION_CONFIG_H #ifdef STRING_CONFIG_H_AUTHOR SERIAL_ECHO_START; 1de26: 8e ec ldi r24, 0xCE ; 206 1de28: 91 ea ldi r25, 0xA1 ; 161 1de2a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(_n(" Last Updated: "));////MSG_CONFIGURATION_VER 1de2e: 8f e6 ldi r24, 0x6F ; 111 1de30: 99 e6 ldi r25, 0x69 ; 105 1de32: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H); 1de36: 8d e4 ldi r24, 0x4D ; 77 1de38: 97 e8 ldi r25, 0x87 ; 135 1de3a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR 1de3e: 83 e6 ldi r24, 0x63 ; 99 1de40: 99 e6 ldi r25, 0x69 ; 105 1de42: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR); 1de46: 85 e4 ldi r24, 0x45 ; 69 1de48: 97 e8 ldi r25, 0x87 ; 135 1de4a: 0e 94 bd 7c call 0xf97a ; 0xf97a #endif #endif SERIAL_ECHO_START; 1de4e: 8e ec ldi r24, 0xCE ; 206 1de50: 91 ea ldi r25, 0xA1 ; 161 1de52: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(_n(" Free Memory: "));////MSG_FREE_MEMORY 1de56: 84 e5 ldi r24, 0x54 ; 84 1de58: 99 e6 ldi r25, 0x69 ; 105 1de5a: 0e 94 c4 7a call 0xf588 ; 0xf588 /** Amount of free RAM * \return The number of free bytes. */ int SdFatUtil::FreeRam() { char top; return __brkval ? &top - __brkval : &top - &__bss_end; 1de5e: 80 91 0d 17 lds r24, 0x170D ; 0x80170d <__brkval> 1de62: 90 91 0e 17 lds r25, 0x170E ; 0x80170e <__brkval+0x1> 1de66: fe 01 movw r30, r28 1de68: 31 96 adiw r30, 0x01 ; 1 1de6a: 7f 01 movw r14, r30 1de6c: bf 01 movw r22, r30 1de6e: 00 97 sbiw r24, 0x00 ; 0 1de70: 69 f1 breq .+90 ; 0x1decc 1de72: 68 1b sub r22, r24 1de74: 79 0b sbc r23, r25 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 1de76: 07 2e mov r0, r23 1de78: 00 0c add r0, r0 1de7a: 88 0b sbc r24, r24 1de7c: 99 0b sbc r25, r25 1de7e: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO(freeMemory()); SERIAL_ECHORPGM(_n(" PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES 1de82: 8d e3 ldi r24, 0x3D ; 61 1de84: 99 e6 ldi r25, 0x69 ; 105 1de86: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); 1de8a: 80 ee ldi r24, 0xE0 ; 224 1de8c: 96 e0 ldi r25, 0x06 ; 6 1de8e: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e #endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) uint8_t check_printer_version() { uint8_t version_changed = 0; uint16_t printer_type = eeprom_init_default_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); 1de92: 6a ef ldi r22, 0xFA ; 250 1de94: 70 e0 ldi r23, 0x00 ; 0 1de96: 8e ee ldi r24, 0xEE ; 238 1de98: 9e e0 ldi r25, 0x0E ; 14 1de9a: 0e 94 45 78 call 0xf08a ; 0xf08a 1de9e: 8c 01 movw r16, r24 uint16_t motherboard = eeprom_init_default_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); 1dea0: 6b ec ldi r22, 0xCB ; 203 1dea2: 70 e0 ldi r23, 0x00 ; 0 1dea4: 8c ee ldi r24, 0xEC ; 236 1dea6: 9e e0 ldi r25, 0x0E ; 14 1dea8: 0e 94 45 78 call 0xf08a ; 0xf08a if (printer_type != PRINTER_TYPE) version_changed |= 0b10; 1deac: 0a 3f cpi r16, 0xFA ; 250 1deae: 11 05 cpc r17, r1 1deb0: 09 f0 breq .+2 ; 0x1deb4 1deb2: 2c c6 rjmp .+3160 ; 0x1eb0c if (motherboard != MOTHERBOARD) version_changed |= 0b01; 1deb4: 01 e0 ldi r16, 0x01 ; 1 1deb6: 8b 3c cpi r24, 0xCB ; 203 1deb8: 91 05 cpc r25, r1 1deba: 09 f4 brne .+2 ; 0x1debe 1debc: 00 e0 ldi r16, 0x00 ; 0 // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) bool previous_settings_retrieved = false; uint8_t hw_changed = check_printer_version(); if (!(hw_changed & 0b10)) { //if printer version wasn't changed, check for eeprom version and retrieve settings from eeprom in case that version wasn't changed previous_settings_retrieved = Config_RetrieveSettings(); 1debe: 0e 94 04 87 call 0x10e08 ; 0x10e08 1dec2: b8 2e mov r11, r24 1dec4: 2b c6 rjmp .+3158 ; 0x1eb1c 1dec6: 86 e9 ldi r24, 0x96 ; 150 1dec8: 92 e6 ldi r25, 0x62 ; 98 1deca: 8b cf rjmp .-234 ; 0x1dde2 1decc: 67 51 subi r22, 0x17 ; 23 1dece: 77 41 sbci r23, 0x17 ; 23 1ded0: d2 cf rjmp .-92 ; 0x1de76 minttemp_raw[0] -= OVERSAMPLENR; #endif } #endif //MINTEMP #ifdef HEATER_0_MAXTEMP maxttemp[0] = HEATER_0_MAXTEMP; 1ded2: 81 e3 ldi r24, 0x31 ; 49 1ded4: 91 e0 ldi r25, 0x01 ; 1 1ded6: 90 93 55 02 sts 0x0255, r25 ; 0x800255 <_ZL8maxttemp.lto_priv.436+0x1> 1deda: 80 93 54 02 sts 0x0254, r24 ; 0x800254 <_ZL8maxttemp.lto_priv.436> while(analog2temp(maxttemp_raw[0], 0) > HEATER_0_MAXTEMP) { 1dede: 80 91 0b 04 lds r24, 0x040B ; 0x80040b <_ZL12maxttemp_raw.lto_priv.430> 1dee2: 90 91 0c 04 lds r25, 0x040C ; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1> 1dee6: 0f 94 66 8f call 0x31ecc ; 0x31ecc 1deea: 20 e0 ldi r18, 0x00 ; 0 1deec: 30 e8 ldi r19, 0x80 ; 128 1deee: 48 e9 ldi r20, 0x98 ; 152 1def0: 53 e4 ldi r21, 0x43 ; 67 1def2: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1def6: 18 16 cp r1, r24 1def8: 54 f4 brge .+20 ; 0x1df0e #if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP maxttemp_raw[0] -= OVERSAMPLENR; #else maxttemp_raw[0] += OVERSAMPLENR; 1defa: 80 91 0b 04 lds r24, 0x040B ; 0x80040b <_ZL12maxttemp_raw.lto_priv.430> 1defe: 90 91 0c 04 lds r25, 0x040C ; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1> 1df02: 40 96 adiw r24, 0x10 ; 16 1df04: 90 93 0c 04 sts 0x040C, r25 ; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1> 1df08: 80 93 0b 04 sts 0x040B, r24 ; 0x80040b <_ZL12maxttemp_raw.lto_priv.430> 1df0c: e8 cf rjmp .-48 ; 0x1dede #endif } #endif //MAXTEMP #ifdef BED_MINTEMP while(analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) { 1df0e: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428> 1df12: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1> 1df16: 0f 94 c2 14 call 0x22984 ; 0x22984 1df1a: 20 e0 ldi r18, 0x00 ; 0 1df1c: 30 e0 ldi r19, 0x00 ; 0 1df1e: 40 ef ldi r20, 0xF0 ; 240 1df20: 51 e4 ldi r21, 0x41 ; 65 1df22: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1df26: 87 ff sbrs r24, 7 1df28: 0a c0 rjmp .+20 ; 0x1df3e #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP bed_minttemp_raw += OVERSAMPLENR; #else bed_minttemp_raw -= OVERSAMPLENR; 1df2a: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428> 1df2e: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1> 1df32: 40 97 sbiw r24, 0x10 ; 16 1df34: 90 93 51 02 sts 0x0251, r25 ; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1> 1df38: 80 93 50 02 sts 0x0250, r24 ; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428> 1df3c: e8 cf rjmp .-48 ; 0x1df0e #endif } #endif //BED_MINTEMP #ifdef BED_MAXTEMP while(analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) { 1df3e: 80 91 09 04 lds r24, 0x0409 ; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431> 1df42: 90 91 0a 04 lds r25, 0x040A ; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1> 1df46: 0f 94 c2 14 call 0x22984 ; 0x22984 1df4a: 20 e0 ldi r18, 0x00 ; 0 1df4c: 30 e0 ldi r19, 0x00 ; 0 1df4e: 4a ef ldi r20, 0xFA ; 250 1df50: 52 e4 ldi r21, 0x42 ; 66 1df52: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 1df56: 18 16 cp r1, r24 1df58: 54 f4 brge .+20 ; 0x1df6e #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP bed_maxttemp_raw -= OVERSAMPLENR; #else bed_maxttemp_raw += OVERSAMPLENR; 1df5a: 80 91 09 04 lds r24, 0x0409 ; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431> 1df5e: 90 91 0a 04 lds r25, 0x040A ; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1> 1df62: 40 96 adiw r24, 0x10 ; 16 1df64: 90 93 0a 04 sts 0x040A, r25 ; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1> 1df68: 80 93 09 04 sts 0x0409, r24 ; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431> 1df6c: e8 cf rjmp .-48 ; 0x1df3e #include #include "macros.h" void timer0_init(void) { CRITICAL_SECTION_START; 1df6e: 9f b7 in r25, 0x3f ; 63 1df70: f8 94 cli TCNT0 = 0; 1df72: 16 bc out 0x26, r1 ; 38 // Fast PWM duty (0-255). // Due to invert mode (following rows) the duty is set to 255, which means zero all the time (bed not heating) OCR0B = 255; 1df74: 8f ef ldi r24, 0xFF ; 255 1df76: 88 bd out 0x28, r24 ; 40 // Set fast PWM mode and inverting mode. TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1) | (1 << COM0B0); 1df78: 83 e3 ldi r24, 0x33 ; 51 1df7a: 84 bd out 0x24, r24 ; 36 TCCR0B = (1 << CS01); // CLK/8 prescaling 1df7c: 12 e0 ldi r17, 0x02 ; 2 1df7e: 15 bd out 0x25, r17 ; 37 TIMSK0 |= (1 << TOIE0); // enable timer overflow interrupt 1df80: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> 1df84: 81 60 ori r24, 0x01 ; 1 1df86: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> CRITICAL_SECTION_END; 1df8a: 9f bf out 0x3f, r25 ; 63 timer0_init(); //enables the heatbed timer. // timer2 already enabled earlier in the code // now enable the COMPB temperature interrupt OCR2B = 128; 1df8c: 80 e8 ldi r24, 0x80 ; 128 1df8e: 80 93 b4 00 sts 0x00B4, r24 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4> ENABLE_SOFT_PWM_INTERRUPT(); 1df92: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 1df96: 84 60 ori r24, 0x04 ; 4 1df98: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> #include "fastio.h" #include "macros.h" void timer4_init(void) { CRITICAL_SECTION_START; 1df9c: 2f b7 in r18, 0x3f ; 63 1df9e: f8 94 cli SET_OUTPUT(BEEPER); 1dfa0: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1dfa4: 84 60 ori r24, 0x04 ; 4 1dfa6: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> WRITE(BEEPER, LOW); 1dfaa: 9f b7 in r25, 0x3f ; 63 1dfac: f8 94 cli 1dfae: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1dfb2: 8b 7f andi r24, 0xFB ; 251 1dfb4: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1dfb8: 9f bf out 0x3f, r25 ; 63 SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN); 1dfba: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1dfbe: 80 62 ori r24, 0x20 ; 32 1dfc0: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> // Set timer mode 9 (PWM,Phase and Frequency Correct) // Prescaler is CLK/1024 // Output compare is disabled on all timer pins // Input capture is disabled // All interrupts are disabled TCCR4A = _BV(WGM40); 1dfc4: 81 e0 ldi r24, 0x01 ; 1 1dfc6: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> TCCR4B = _BV(WGM43) | _BV(CS42) | _BV(CS40); 1dfca: 85 e1 ldi r24, 0x15 ; 21 1dfcc: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> OCR4A = 255U; 1dfd0: 8f ef ldi r24, 0xFF ; 255 1dfd2: 90 e0 ldi r25, 0x00 ; 0 1dfd4: 90 93 a9 00 sts 0x00A9, r25 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 1dfd8: 80 93 a8 00 sts 0x00A8, r24 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> OCR4B = 255U; 1dfdc: 90 93 ab 00 sts 0x00AB, r25 ; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab> 1dfe0: 80 93 aa 00 sts 0x00AA, r24 ; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa> OCR4C = 255U; 1dfe4: 90 93 ad 00 sts 0x00AD, r25 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 1dfe8: 80 93 ac 00 sts 0x00AC, r24 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> TIMSK4 = 0; 1dfec: 10 92 72 00 sts 0x0072, r1 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 1dff0: 2f bf out 0x3f, r18 ; 63 static void adc_reset(); static void adc_setmux(uint8_t ch); void adc_init() { puts_P(PSTR("adc_init")); 1dff2: 83 ec ldi r24, 0xC3 ; 195 1dff4: 96 e8 ldi r25, 0x86 ; 134 1dff6: 0f 94 c9 a2 call 0x34592 ; 0x34592 DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff); //disable digital inputs PORTF 1dffa: 8f e5 ldi r24, 0x5F ; 95 1dffc: 80 93 7e 00 sts 0x007E, r24 ; 0x80007e <__TEXT_REGION_LENGTH__+0x7c207e> DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8); //disable digital inputs PORTK 1e000: 10 93 7d 00 sts 0x007D, r17 ; 0x80007d <__TEXT_REGION_LENGTH__+0x7c207d> ADMUX |= (1 << REFS0); //use AVCC as reference 1e004: 80 91 7c 00 lds r24, 0x007C ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> 1e008: 80 64 ori r24, 0x40 ; 64 1e00a: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> //enable ADC, set prescaler/128, enable interrupt ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADIF) | (1 << ADIE); 1e00e: 8f e9 ldi r24, 0x9F ; 159 1e010: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> void temp_mgr_init() { // initialize the ADC and start a conversion adc_init(); adc_start_cycle(); 1e014: 0e 94 cf bc call 0x1799e ; 0x1799e // initialize temperature timer ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 1e018: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 1e01a: f8 94 cli // CTC TCCRxB &= ~(1< 1e020: 8f 7e andi r24, 0xEF ; 239 1e022: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> TCCRxB |= (1< 1e02a: 88 60 ori r24, 0x08 ; 8 1e02c: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> TCCRxA &= ~(1< 1e034: 8d 7f andi r24, 0xFD ; 253 1e036: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> TCCRxA &= ~(1< 1e03e: 8e 7f andi r24, 0xFE ; 254 1e040: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> // output mode = 00 (disconnected) TCCRxA &= ~(3< 1e048: 8f 73 andi r24, 0x3F ; 63 1e04a: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> TCCRxA &= ~(3< 1e052: 8f 7c andi r24, 0xCF ; 207 1e054: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> // x/256 prescaler TCCRxB |= (1< 1e05c: 84 60 ori r24, 0x04 ; 4 1e05e: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> TCCRxB &= ~(1< 1e066: 8d 7f andi r24, 0xFD ; 253 1e068: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> TCCRxB &= ~(1< 1e070: 8e 7f andi r24, 0xFE ; 254 1e072: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> // reset counter TCNTx = 0; 1e076: 10 92 95 00 sts 0x0095, r1 ; 0x800095 <__TEXT_REGION_LENGTH__+0x7c2095> 1e07a: 10 92 94 00 sts 0x0094, r1 ; 0x800094 <__TEXT_REGION_LENGTH__+0x7c2094> OCRxA = TEMP_TIM_OCRA_OVF; 1e07e: 2b ee ldi r18, 0xEB ; 235 1e080: 31 e4 ldi r19, 0x41 ; 65 1e082: 30 93 99 00 sts 0x0099, r19 ; 0x800099 <__TEXT_REGION_LENGTH__+0x7c2099> 1e086: 20 93 98 00 sts 0x0098, r18 ; 0x800098 <__TEXT_REGION_LENGTH__+0x7c2098> // clear pending interrupts, enable COMPA TEMP_MGR_INT_FLAG_CLEAR(); 1e08a: c1 9a sbi 0x18, 1 ; 24 ENABLE_TEMP_MGR_INTERRUPT(); 1e08c: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 1e090: 82 60 ori r24, 0x02 ; 2 1e092: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 1e096: 9f bf out 0x3f, r25 ; 63 // SERIAL_ECHOLNPGM("planner_recalculate - 4"); } void plan_init() { block_buffer_head = 0; 1e098: 10 92 3e 0d sts 0x0D3E, r1 ; 0x800d3e block_buffer_tail = 0; 1e09c: 10 92 3f 0d sts 0x0D3F, r1 ; 0x800d3f memset(position, 0, sizeof(position)); // clear position 1e0a0: 80 e1 ldi r24, 0x10 ; 16 1e0a2: ec e3 ldi r30, 0x3C ; 60 1e0a4: f6 e0 ldi r31, 0x06 ; 6 1e0a6: df 01 movw r26, r30 1e0a8: 28 2f mov r18, r24 1e0aa: 1d 92 st X+, r1 1e0ac: 2a 95 dec r18 1e0ae: e9 f7 brne .-6 ; 0x1e0aa #ifdef LIN_ADVANCE memset(position_float, 0, sizeof(position_float)); // clear position 1e0b0: e6 e3 ldi r30, 0x36 ; 54 1e0b2: f4 e0 ldi r31, 0x04 ; 4 1e0b4: df 01 movw r26, r30 1e0b6: 28 2f mov r18, r24 1e0b8: 1d 92 st X+, r1 1e0ba: 2a 95 dec r18 1e0bc: e9 f7 brne .-6 ; 0x1e0b8 #endif memset(previous_speed, 0, sizeof(previous_speed)); 1e0be: e6 e2 ldi r30, 0x26 ; 38 1e0c0: f4 e0 ldi r31, 0x04 ; 4 1e0c2: df 01 movw r26, r30 1e0c4: 1d 92 st X+, r1 1e0c6: 8a 95 dec r24 1e0c8: e9 f7 brne .-6 ; 0x1e0c4 previous_nominal_speed = 0.0; 1e0ca: 10 92 22 04 sts 0x0422, r1 ; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445> 1e0ce: 10 92 23 04 sts 0x0423, r1 ; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1> 1e0d2: 10 92 24 04 sts 0x0424, r1 ; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2> 1e0d6: 10 92 25 04 sts 0x0425, r1 ; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3> plan_reset_next_e_queue = false; 1e0da: 10 92 21 04 sts 0x0421, r1 ; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443> plan_reset_next_e_sched = false; 1e0de: 10 92 20 04 sts 0x0420, r1 ; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444> } void factory_reset() { KEEPALIVE_STATE(PAUSED_FOR_USER); 1e0e2: 84 e0 ldi r24, 0x04 ; 4 1e0e4: 80 93 78 02 sts 0x0278, r24 ; 0x800278 if (!READ(BTN_ENC)) 1e0e8: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 1e0ec: 86 fd sbrc r24, 6 1e0ee: c6 c0 rjmp .+396 ; 0x1e27c 1e0f0: bf ef ldi r27, 0xFF ; 255 1e0f2: e3 ed ldi r30, 0xD3 ; 211 1e0f4: f0 e3 ldi r31, 0x30 ; 48 1e0f6: b1 50 subi r27, 0x01 ; 1 1e0f8: e0 40 sbci r30, 0x00 ; 0 1e0fa: f0 40 sbci r31, 0x00 ; 0 1e0fc: e1 f7 brne .-8 ; 0x1e0f6 1e0fe: 00 c0 rjmp .+0 ; 0x1e100 1e100: 00 00 nop { _delay_ms(1000); if (!READ(BTN_ENC)) 1e102: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 1e106: 86 fd sbrc r24, 6 1e108: b9 c0 rjmp .+370 ; 0x1e27c { lcd_clear(); 1e10a: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_P(PSTR("Factory RESET")); 1e10e: 8d e1 ldi r24, 0x1D ; 29 1e110: 97 e8 ldi r25, 0x87 ; 135 1e112: 0e 94 1d 6f call 0xde3a ; 0xde3a SET_OUTPUT(BEEPER); 1e116: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1e11a: 84 60 ori r24, 0x04 ; 4 1e11c: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> if(eSoundMode!=e_SOUND_MODE_SILENT) 1e120: 80 91 47 04 lds r24, 0x0447 ; 0x800447 1e124: 82 30 cpi r24, 0x02 ; 2 1e126: 41 f0 breq .+16 ; 0x1e138 WRITE(BEEPER, HIGH); 1e128: 9f b7 in r25, 0x3f ; 63 1e12a: f8 94 cli 1e12c: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1e130: 84 60 ori r24, 0x04 ; 4 1e132: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1e136: 9f bf out 0x3f, r25 ; 63 while (!READ(BTN_ENC)); 1e138: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 1e13c: 86 ff sbrs r24, 6 1e13e: fc cf rjmp .-8 ; 0x1e138 WRITE(BEEPER, LOW); 1e140: 9f b7 in r25, 0x3f ; 63 1e142: f8 94 cli 1e144: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1e148: 8b 7f andi r24, 0xFB ; 251 1e14a: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1e14e: 9f bf out 0x3f, r25 ; 63 1e150: 2f ef ldi r18, 0xFF ; 255 1e152: 37 ea ldi r19, 0xA7 ; 167 1e154: 81 e6 ldi r24, 0x61 ; 97 1e156: 21 50 subi r18, 0x01 ; 1 1e158: 30 40 sbci r19, 0x00 ; 0 1e15a: 80 40 sbci r24, 0x00 ; 0 1e15c: e1 f7 brne .-8 ; 0x1e156 1e15e: 00 c0 rjmp .+0 ; 0x1e160 1e160: 00 00 nop PSTR("Language"), PSTR("Statistics"), PSTR("Shipping prep"), PSTR("Service prep"), PSTR("All Data"), }; 1e162: 83 e0 ldi r24, 0x03 ; 3 1e164: 97 e8 ldi r25, 0x87 ; 135 1e166: 9a 83 std Y+2, r25 ; 0x02 1e168: 89 83 std Y+1, r24 ; 0x01 1e16a: 88 ef ldi r24, 0xF8 ; 248 1e16c: 96 e8 ldi r25, 0x86 ; 134 1e16e: 9c 83 std Y+4, r25 ; 0x04 1e170: 8b 83 std Y+3, r24 ; 0x03 1e172: 8a ee ldi r24, 0xEA ; 234 1e174: 96 e8 ldi r25, 0x86 ; 134 1e176: 9e 83 std Y+6, r25 ; 0x06 1e178: 8d 83 std Y+5, r24 ; 0x05 1e17a: 8d ed ldi r24, 0xDD ; 221 1e17c: 96 e8 ldi r25, 0x86 ; 134 1e17e: 98 87 std Y+8, r25 ; 0x08 1e180: 8f 83 std Y+7, r24 ; 0x07 1e182: 84 ed ldi r24, 0xD4 ; 212 1e184: 96 e8 ldi r25, 0x86 ; 134 1e186: 9a 87 std Y+10, r25 ; 0x0a 1e188: 89 87 std Y+9, r24 ; 0x09 lcd_clear(); 1e18a: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_putc_at(0, 0, '>'); 1e18e: 4e e3 ldi r20, 0x3E ; 62 1e190: 60 e0 ldi r22, 0x00 ; 0 1e192: 80 e0 ldi r24, 0x00 ; 0 1e194: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_consume_click(); 1e198: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 } } char reset_menu() { static int8_t first = 0; char cursor_pos = 0; 1e19c: 10 e0 ldi r17, 0x00 ; 0 1e19e: d1 2c mov r13, r1 1e1a0: c1 2c mov r12, r1 lcd_putc_at(0, 0, '>'); lcd_consume_click(); while (1) { for (uint_least8_t i = 0; i < 4; i++) { lcd_puts_at_P(1, i, item[first + i]); 1e1a2: 80 91 46 04 lds r24, 0x0446 ; 0x800446 1e1a6: f6 01 movw r30, r12 1e1a8: e8 0f add r30, r24 1e1aa: f1 1d adc r31, r1 1e1ac: 87 fd sbrc r24, 7 1e1ae: fa 95 dec r31 1e1b0: ee 0f add r30, r30 1e1b2: ff 1f adc r31, r31 1e1b4: ee 0d add r30, r14 1e1b6: ff 1d adc r31, r15 1e1b8: 40 81 ld r20, Z 1e1ba: 51 81 ldd r21, Z+1 ; 0x01 1e1bc: 6c 2d mov r22, r12 1e1be: 81 e0 ldi r24, 0x01 ; 1 1e1c0: 0e 94 07 70 call 0xe00e ; 0xe00e 1e1c4: 9f ef ldi r25, 0xFF ; 255 1e1c6: c9 1a sub r12, r25 1e1c8: d9 0a sbc r13, r25 lcd_clear(); lcd_putc_at(0, 0, '>'); lcd_consume_click(); while (1) { for (uint_least8_t i = 0; i < 4; i++) { 1e1ca: a4 e0 ldi r26, 0x04 ; 4 1e1cc: ca 16 cp r12, r26 1e1ce: d1 04 cpc r13, r1 1e1d0: 41 f7 brne .-48 ; 0x1e1a2 lcd_puts_at_P(1, i, item[first + i]); } manage_heater(); 1e1d2: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1e1d6: 81 e0 ldi r24, 0x01 ; 1 1e1d8: 0e 94 34 8c call 0x11868 ; 0x11868 if (lcd_encoder) { 1e1dc: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 1e1e0: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 1e1e4: 00 97 sbiw r24, 0x00 ; 0 1e1e6: 71 f1 breq .+92 ; 0x1e244 if (lcd_encoder < 0) { 1e1e8: 97 ff sbrs r25, 7 1e1ea: 12 c0 rjmp .+36 ; 0x1e210 cursor_pos--; 1e1ec: 11 50 subi r17, 0x01 ; 1 if (lcd_encoder > 0) { cursor_pos++; } if (cursor_pos > 3) { 1e1ee: 14 30 cpi r17, 0x04 ; 4 1e1f0: 0c f4 brge .+2 ; 0x1e1f4 1e1f2: 3a c2 rjmp .+1140 ; 0x1e668 cursor_pos = 3; Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1e1f4: 87 e0 ldi r24, 0x07 ; 7 1e1f6: 0f 94 ad 25 call 0x24b5a ; 0x24b5a if (first < (uint8_t)(sizeof(item) / sizeof(item[0])) - 4) { 1e1fa: 80 91 46 04 lds r24, 0x0446 ; 0x800446 1e1fe: 18 16 cp r1, r24 1e200: 2c f0 brlt .+10 ; 0x1e20c first++; 1e202: 8f 5f subi r24, 0xFF ; 255 1e204: 80 93 46 04 sts 0x0446, r24 ; 0x800446 lcd_clear(); 1e208: 0e 94 26 70 call 0xe04c ; 0xe04c if (lcd_encoder > 0) { cursor_pos++; } if (cursor_pos > 3) { cursor_pos = 3; 1e20c: 13 e0 ldi r17, 0x03 ; 3 1e20e: 03 c0 rjmp .+6 ; 0x1e216 if (lcd_encoder < 0) { cursor_pos--; } if (lcd_encoder > 0) { cursor_pos++; 1e210: 1f 5f subi r17, 0xFF ; 255 } if (cursor_pos > 3) { 1e212: 14 30 cpi r17, 0x04 ; 4 1e214: 78 f7 brcc .-34 ; 0x1e1f4 if (first > 0) { first--; lcd_clear(); } } lcd_puts_at_P(0, 0, PSTR(" \n \n \n ")); 1e216: 4c ec ldi r20, 0xCC ; 204 1e218: 56 e8 ldi r21, 0x86 ; 134 1e21a: 60 e0 ldi r22, 0x00 ; 0 1e21c: 80 e0 ldi r24, 0x00 ; 0 1e21e: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(0, cursor_pos); 1e222: 61 2f mov r22, r17 1e224: 80 e0 ldi r24, 0x00 ; 0 1e226: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_putc('>'); 1e22a: 8e e3 ldi r24, 0x3E ; 62 1e22c: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_encoder = 0; 1e230: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1e234: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e _delay(100); 1e238: 64 e6 ldi r22, 0x64 ; 100 1e23a: 70 e0 ldi r23, 0x00 ; 0 1e23c: 80 e0 ldi r24, 0x00 ; 0 1e23e: 90 e0 ldi r25, 0x00 ; 0 1e240: 0f 94 bd 0d call 0x21b7a ; 0x21b7a } if (lcd_clicked()) { 1e244: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1e248: 88 23 and r24, r24 1e24a: 09 f4 brne .+2 ; 0x1e24e 1e24c: a8 cf rjmp .-176 ; 0x1e19e return(cursor_pos + first); 1e24e: 80 91 46 04 lds r24, 0x0446 ; 0x800446 1e252: 18 0f add r17, r24 // Factory reset function // This function is used to erase parts or whole EEPROM memory which is used for storing calibration and and so on. // Level input parameter sets depth of reset static void factory_reset(char level) { lcd_clear(); 1e254: 0e 94 26 70 call 0xe04c ; 0xe04c Sound_MakeCustom(100,0,false); 1e258: 40 e0 ldi r20, 0x00 ; 0 1e25a: 70 e0 ldi r23, 0x00 ; 0 1e25c: 60 e0 ldi r22, 0x00 ; 0 1e25e: 84 e6 ldi r24, 0x64 ; 100 1e260: 90 e0 ldi r25, 0x00 ; 0 1e262: 0f 94 be 27 call 0x24f7c ; 0x24f7c switch (level) { 1e266: 12 30 cpi r17, 0x02 ; 2 1e268: 09 f4 brne .+2 ; 0x1e26c 1e26a: 35 c2 rjmp .+1130 ; 0x1e6d6 1e26c: 08 f0 brcs .+2 ; 0x1e270 1e26e: 0d c2 rjmp .+1050 ; 0x1e68a 1e270: 11 23 and r17, r17 1e272: 09 f4 brne .+2 ; 0x1e276 1e274: 28 c2 rjmp .+1104 ; 0x1e6c6 1e276: 11 30 cpi r17, 0x01 ; 1 1e278: 09 f4 brne .+2 ; 0x1e27c 1e27a: 28 c2 rjmp .+1104 ; 0x1e6cc case 4: _delay_ms(0); break; } } } KEEPALIVE_STATE(IN_HANDLER); 1e27c: 82 e0 ldi r24, 0x02 ; 2 1e27e: 80 93 78 02 sts 0x0278, r24 ; 0x800278 plan_init(); // Initialize planner; factory_reset(); eeprom_init_default_byte((uint8_t*)EEPROM_SILENT, SILENT_MODE_OFF); 1e282: 60 e0 ldi r22, 0x00 ; 0 1e284: 8f ef ldi r24, 0xFF ; 255 1e286: 9f e0 ldi r25, 0x0F ; 15 1e288: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard if uninitialized 1e28c: 61 e0 ldi r22, 0x01 ; 1 1e28e: 8f e5 ldi r24, 0x5F ; 95 1e290: 9f e0 ldi r25, 0x0F ; 15 1e292: 0e 94 5d 78 call 0xf0ba ; 0xf0ba void st_init() { #ifdef TMC2130 tmc2130_init(TMCInitParams(false, FarmOrUserECool())); #else st_current_init(); //Initialize Digipot Motor Current 1e296: 0f 94 84 1a call 0x23508 ; 0x23508 SET_OUTPUT(E1_MS1_PIN); SET_OUTPUT(E1_MS2_PIN); #endif #if defined(X_MS1_PIN) && X_MS1_PIN > -1 const uint8_t microstep_modes[] = MICROSTEP_MODES; 1e29a: 85 e0 ldi r24, 0x05 ; 5 1e29c: e8 eb ldi r30, 0xB8 ; 184 1e29e: f2 e0 ldi r31, 0x02 ; 2 1e2a0: d7 01 movw r26, r14 1e2a2: 01 90 ld r0, Z+ 1e2a4: 0d 92 st X+, r0 1e2a6: 8a 95 dec r24 1e2a8: e1 f7 brne .-8 ; 0x1e2a2 SET_OUTPUT(X_MS1_PIN); 1e2aa: 99 9a sbi 0x13, 1 ; 19 SET_OUTPUT(X_MS2_PIN); 1e2ac: 98 9a sbi 0x13, 0 ; 19 SET_OUTPUT(Y_MS1_PIN); 1e2ae: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2b2: 80 68 ori r24, 0x80 ; 128 1e2b4: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_OUTPUT(Y_MS2_PIN); 1e2b8: 9a 9a sbi 0x13, 2 ; 19 SET_OUTPUT(Z_MS1_PIN); 1e2ba: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2be: 80 64 ori r24, 0x40 ; 64 1e2c0: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_OUTPUT(Z_MS2_PIN); 1e2c4: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2c8: 80 62 ori r24, 0x20 ; 32 1e2ca: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_OUTPUT(E0_MS1_PIN); 1e2ce: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2d2: 88 60 ori r24, 0x08 ; 8 1e2d4: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_OUTPUT(E0_MS2_PIN); 1e2d8: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2dc: 80 61 ori r24, 0x10 ; 16 1e2de: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 1e2e2: 67 01 movw r12, r14 1e2e4: 10 e0 ldi r17, 0x00 ; 0 for(int i=0;i<=4;i++) microstep_mode(i,microstep_modes[i]); 1e2e6: f6 01 movw r30, r12 1e2e8: 61 91 ld r22, Z+ 1e2ea: 6f 01 movw r12, r30 1e2ec: 81 2f mov r24, r17 1e2ee: 0f 94 47 1a call 0x2348e ; 0x2348e 1e2f2: 1f 5f subi r17, 0xFF ; 255 1e2f4: 15 30 cpi r17, 0x05 ; 5 1e2f6: b9 f7 brne .-18 ; 0x1e2e6 microstep_init(); //Initialize Microstepping Pins #endif //TMC2130 //Initialize Dir Pins #if defined(X_DIR_PIN) && X_DIR_PIN > -1 SET_OUTPUT(X_DIR_PIN); 1e2f8: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 1e2fc: 82 60 ori r24, 0x02 ; 2 1e2fe: 80 93 0a 01 sts 0x010A, r24 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> #endif #if defined(X2_DIR_PIN) && X2_DIR_PIN > -1 SET_OUTPUT(X2_DIR_PIN); #endif #if defined(Y_DIR_PIN) && Y_DIR_PIN > -1 SET_OUTPUT(Y_DIR_PIN); 1e302: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 1e306: 81 60 ori r24, 0x01 ; 1 1e308: 80 93 0a 01 sts 0x010A, r24 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> #endif #if defined(Z_DIR_PIN) && Z_DIR_PIN > -1 SET_OUTPUT(Z_DIR_PIN); 1e30c: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 1e310: 84 60 ori r24, 0x04 ; 4 1e312: 80 93 0a 01 sts 0x010A, r24 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> #endif #if defined(E0_DIR_PIN) && E0_DIR_PIN > -1 SET_OUTPUT(E0_DIR_PIN); 1e316: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 1e31a: 80 64 ori r24, 0x40 ; 64 1e31c: 80 93 0a 01 sts 0x010A, r24 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> #endif //Initialize Enable Pins - steppers default to disabled. #if defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1 SET_OUTPUT(X_ENABLE_PIN); 1e320: 0f 9a sbi 0x01, 7 ; 1 if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH); 1e322: 17 9a sbi 0x02, 7 ; 2 #if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1 SET_OUTPUT(X2_ENABLE_PIN); if(!X_ENABLE_ON) WRITE(X2_ENABLE_PIN,HIGH); #endif #if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1 SET_OUTPUT(Y_ENABLE_PIN); 1e324: 0e 9a sbi 0x01, 6 ; 1 if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH); 1e326: 16 9a sbi 0x02, 6 ; 2 #endif #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1 SET_OUTPUT(Z_ENABLE_PIN); 1e328: 0d 9a sbi 0x01, 5 ; 1 if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH); 1e32a: 15 9a sbi 0x02, 5 ; 2 #endif #if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1) SET_OUTPUT(E0_ENABLE_PIN); 1e32c: 0c 9a sbi 0x01, 4 ; 1 if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH); 1e32e: 14 9a sbi 0x02, 4 ; 2 #endif //endstops and pullups #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SET_INPUT(X_MIN_PIN); 1e330: 26 98 cbi 0x04, 6 ; 4 #ifdef ENDSTOPPULLUP_XMIN WRITE(X_MIN_PIN,HIGH); 1e332: 2e 9a sbi 0x05, 6 ; 5 #endif #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SET_INPUT(Y_MIN_PIN); 1e334: 25 98 cbi 0x04, 5 ; 4 #ifdef ENDSTOPPULLUP_YMIN WRITE(Y_MIN_PIN,HIGH); 1e336: 2d 9a sbi 0x05, 5 ; 5 #endif #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SET_INPUT(Z_MIN_PIN); 1e338: 24 98 cbi 0x04, 4 ; 4 #ifdef ENDSTOPPULLUP_ZMIN WRITE(Z_MIN_PIN,HIGH); 1e33a: 2c 9a sbi 0x05, 4 ; 5 WRITE(Y_MAX_PIN,HIGH); #endif #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SET_INPUT(Z_MAX_PIN); 1e33c: 09 98 cbi 0x01, 1 ; 1 #ifdef ENDSTOPPULLUP_ZMAX WRITE(Z_MAX_PIN,HIGH); 1e33e: 11 9a sbi 0x02, 1 ; 2 #endif #endif #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1)) SET_INPUT(TACH_0); 1e340: 3f 98 cbi 0x07, 7 ; 7 #ifdef TACH0PULLUP WRITE(TACH_0, HIGH); 1e342: 47 9a sbi 0x08, 7 ; 8 #endif //Initialize Step Pins #if defined(X_STEP_PIN) && (X_STEP_PIN > -1) SET_OUTPUT(X_STEP_PIN); 1e344: 38 9a sbi 0x07, 0 ; 7 WRITE(X_STEP_PIN,INVERT_X_STEP_PIN); 1e346: 40 98 cbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN SET_OUTPUT(DEBUG_XSTEP_DUP_PIN); WRITE(DEBUG_XSTEP_DUP_PIN,INVERT_X_STEP_PIN); #endif //DEBUG_XSTEP_DUP_PIN disable_x(); 1e348: 17 9a sbi 0x02, 7 ; 2 1e34a: 10 92 39 06 sts 0x0639, r1 ; 0x800639 SET_OUTPUT(X2_STEP_PIN); WRITE(X2_STEP_PIN,INVERT_X_STEP_PIN); disable_x(); #endif #if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1) SET_OUTPUT(Y_STEP_PIN); 1e34e: 39 9a sbi 0x07, 1 ; 7 WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN); 1e350: 41 98 cbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN SET_OUTPUT(DEBUG_YSTEP_DUP_PIN); WRITE(DEBUG_YSTEP_DUP_PIN,INVERT_Y_STEP_PIN); #endif //DEBUG_YSTEP_DUP_PIN disable_y(); 1e352: 16 9a sbi 0x02, 6 ; 2 1e354: 10 92 3a 06 sts 0x063A, r1 ; 0x80063a #endif #if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) SET_OUTPUT(Z_STEP_PIN); 1e358: 3a 9a sbi 0x07, 2 ; 7 WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN); 1e35a: 42 98 cbi 0x08, 2 ; 8 init_force_z(); #endif // PSU_Delta disable_z(); #endif #if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1) SET_OUTPUT(E0_STEP_PIN); 1e35c: 3b 9a sbi 0x07, 3 ; 7 WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN); 1e35e: 43 98 cbi 0x08, 3 ; 8 disable_e0(); 1e360: 14 9a sbi 0x02, 4 ; 2 #endif // waveform generation = 0100 = CTC TCCR1B &= ~(1< 1e366: 8f 7e andi r24, 0xEF ; 239 1e368: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> TCCR1B |= (1< 1e370: 88 60 ori r24, 0x08 ; 8 1e372: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> TCCR1A &= ~(1< 1e37a: 8d 7f andi r24, 0xFD ; 253 1e37c: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> TCCR1A &= ~(1< 1e384: 8e 7f andi r24, 0xFE ; 254 1e386: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> // output mode = 00 (disconnected) TCCR1A &= ~(3< 1e38e: 8f 73 andi r24, 0x3F ; 63 1e390: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> TCCR1A &= ~(3< 1e398: 8f 7c andi r24, 0xCF ; 207 1e39a: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> // Set the timer pre-scaler // Generally we use a divider of 8, resulting in a 2MHz timer // frequency on a 16MHz MCU. If you are going to change this, be // sure to regenerate speed_lookuptable.h with // create_speed_lookuptable.py TCCR1B = (TCCR1B & ~(0x07< 1e3a2: 88 7f andi r24, 0xF8 ; 248 1e3a4: 82 60 ori r24, 0x02 ; 2 1e3a6: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> // Plan the first interrupt after 8ms from now. OCR1A = 0x4000; 1e3aa: 80 e0 ldi r24, 0x00 ; 0 1e3ac: 90 e4 ldi r25, 0x40 ; 64 1e3ae: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 1e3b2: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> TCNT1 = 0; 1e3b6: 10 92 85 00 sts 0x0085, r1 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 1e3ba: 10 92 84 00 sts 0x0084, r1 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> WRITE_NC(LOGIC_ANALYZER_CH0, false); WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif // Initialize state for the linear advance scheduler nextMainISR = 0; 1e3be: 10 92 4f 04 sts 0x044F, r1 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 1e3c2: 10 92 4e 04 sts 0x044E, r1 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> nextAdvanceISR = ADV_NEVER; 1e3c6: 8f ef ldi r24, 0xFF ; 255 1e3c8: 9f ef ldi r25, 0xFF ; 255 1e3ca: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 1e3ce: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> main_Rate = ADV_NEVER; 1e3d2: 90 93 4b 04 sts 0x044B, r25 ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> 1e3d6: 80 93 4a 04 sts 0x044A, r24 ; 0x80044a <_ZL9main_Rate.lto_priv.440> current_adv_steps = 0; 1e3da: 10 92 49 04 sts 0x0449, r1 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 1e3de: 10 92 48 04 sts 0x0448, r1 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> } bool enable_endstops(bool check) { bool old = check_endstops; check_endstops = check; 1e3e2: 81 e0 ldi r24, 0x01 ; 1 1e3e4: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> current_adv_steps = 0; #endif enable_endstops(true); // Start with endstops active. After homing they can be disabled ENABLE_STEPPER_DRIVER_INTERRUPT(); 1e3e8: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 1e3ec: 82 60 ori r24, 0x02 ; 2 1e3ee: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> sei(); 1e3f2: 78 94 sei setup_photpin(); // Reset the machine correction matrix. // It does not make sense to load the correction matrix until the machine is homed. world2machine_reset(); 1e3f4: 0e 94 f4 61 call 0xc3e8 ; 0xc3e8 // Initialize current_position accounting for software endstops to // avoid unexpected initial shifts on the first move clamp_to_software_endstops(current_position); 1e3f8: 81 e6 ldi r24, 0x61 ; 97 1e3fa: 92 e1 ldi r25, 0x12 ; 18 1e3fc: 0e 94 7c 6a call 0xd4f8 ; 0xd4f8 plan_set_position_curposXYZE(); 1e400: 0f 94 41 4b call 0x29682 ; 0x29682 } #define KILL_PENDING_FLAG 0x42 static void fw_kill_init() { if (eeprom_read_byte((uint8_t*)EEPROM_KILL_PENDING_FLAG) == KILL_PENDING_FLAG) { 1e404: 84 e9 ldi r24, 0x94 ; 148 1e406: 9c e0 ldi r25, 0x0C ; 12 1e408: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e40c: 82 34 cpi r24, 0x42 ; 66 1e40e: 59 f4 brne .+22 ; 0x1e426 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); 1e410: 6f ef ldi r22, 0xFF ; 255 1e412: 84 e9 ldi r24, 0x94 ; 148 1e414: 9c e0 ldi r25, 0x0C ; 12 1e416: 0f 94 28 a4 call 0x34850 ; 0x34850 // clear pending message event eeprom_write_byte_notify((uint8_t*)EEPROM_KILL_PENDING_FLAG, EEPROM_EMPTY_VALUE); // display the kill message PGM_P kill_msg = (PGM_P)eeprom_read_word((uint16_t*)EEPROM_KILL_MESSAGE); 1e41a: 85 e9 ldi r24, 0x95 ; 149 1e41c: 9c e0 ldi r25, 0x0C ; 12 1e41e: 0f 94 ee a3 call 0x347dc ; 0x347dc lcd_show_fullscreen_message_and_wait_P(kill_msg); 1e422: 0e 94 94 ea call 0x1d528 ; 0x1d528 // report kill() events fw_kill_init(); #ifdef FILAMENT_SENSOR fsensor.init(); 1e426: 0f 94 dc 6d call 0x2dbb8 ; 0x2dbb8 #endif setup_homepin(); #if defined(Z_AXIS_ALWAYS_ON) enable_z(); 1e42a: 15 98 cbi 0x02, 5 ; 2 #endif // The farm monitoring SW may accidentally expect // 2 messages of "printer started" to consider a printer working. prusa_statistics(8); 1e42c: 88 e0 ldi r24, 0x08 ; 8 1e42e: 0f 94 79 32 call 0x264f2 ; 0x264f2 // Enable Toshiba FlashAir SD card / WiFi enahanced card. card.ToshibaFlashAir_enable(eeprom_read_byte((unsigned char*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY) == 1); 1e432: 8b eb ldi r24, 0xBB ; 187 1e434: 9f e0 ldi r25, 0x0F ; 15 1e436: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e43a: 91 e0 ldi r25, 0x01 ; 1 1e43c: 81 30 cpi r24, 0x01 ; 1 1e43e: 09 f0 breq .+2 ; 0x1e442 1e440: 90 e0 ldi r25, 0x00 ; 0 1e442: 90 93 48 16 sts 0x1648, r25 ; 0x801648 // Force SD card update. Otherwise the SD card update is done from loop() on card.checkautostart(false), // but this times out if a blocking dialog is shown in setup(). card.mount(); 1e446: 81 e0 ldi r24, 0x01 ; 1 1e448: 0f 94 6a 73 call 0x2e6d4 ; 0x2e6d4 #include #include void eeprom_init() { eeprom_init_default_byte((uint8_t*)EEPROM_POWER_COUNT, 0); 1e44c: 60 e0 ldi r22, 0x00 ; 0 1e44e: 84 e6 ldi r24, 0x64 ; 100 1e450: 9f e0 ldi r25, 0x0F ; 15 1e452: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_X, 0); 1e456: 60 e0 ldi r22, 0x00 ; 0 1e458: 86 e6 ldi r24, 0x66 ; 102 1e45a: 9f e0 ldi r25, 0x0F ; 15 1e45c: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_Y, 0); 1e460: 60 e0 ldi r22, 0x00 ; 0 1e462: 88 e6 ldi r24, 0x68 ; 104 1e464: 9f e0 ldi r25, 0x0F ; 15 1e466: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_FERROR_COUNT, 0); 1e46a: 60 e0 ldi r22, 0x00 ; 0 1e46c: 85 e6 ldi r24, 0x65 ; 101 1e46e: 9f e0 ldi r25, 0x0F ; 15 1e470: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_word((uint16_t*)EEPROM_POWER_COUNT_TOT, 0); 1e474: 70 e0 ldi r23, 0x00 ; 0 1e476: 60 e0 ldi r22, 0x00 ; 0 1e478: 8f ef ldi r24, 0xFF ; 255 1e47a: 9e e0 ldi r25, 0x0E ; 14 1e47c: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT, 0); 1e480: 70 e0 ldi r23, 0x00 ; 0 1e482: 60 e0 ldi r22, 0x00 ; 0 1e484: 85 e0 ldi r24, 0x05 ; 5 1e486: 9f e0 ldi r25, 0x0F ; 15 1e488: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, 0); 1e48c: 70 e0 ldi r23, 0x00 ; 0 1e48e: 60 e0 ldi r22, 0x00 ; 0 1e490: 83 e0 ldi r24, 0x03 ; 3 1e492: 9f e0 ldi r25, 0x0F ; 15 1e494: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, 0); 1e498: 70 e0 ldi r23, 0x00 ; 0 1e49a: 60 e0 ldi r22, 0x00 ; 0 1e49c: 81 e0 ldi r24, 0x01 ; 1 1e49e: 9f e0 ldi r25, 0x0F ; 15 1e4a0: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word((uint16_t*)EEPROM_MMU_FAIL_TOT, 0); 1e4a4: 70 e0 ldi r23, 0x00 ; 0 1e4a6: 60 e0 ldi r22, 0x00 ; 0 1e4a8: 83 ed ldi r24, 0xD3 ; 211 1e4aa: 9e e0 ldi r25, 0x0E ; 14 1e4ac: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, 0); 1e4b0: 70 e0 ldi r23, 0x00 ; 0 1e4b2: 60 e0 ldi r22, 0x00 ; 0 1e4b4: 80 ed ldi r24, 0xD0 ; 208 1e4b6: 9e e0 ldi r25, 0x0E ; 14 1e4b8: 0e 94 45 78 call 0xf08a ; 0xf08a eeprom_init_default_byte((uint8_t*)EEPROM_MMU_FAIL, 0); 1e4bc: 60 e0 ldi r22, 0x00 ; 0 1e4be: 82 ed ldi r24, 0xD2 ; 210 1e4c0: 9e e0 ldi r25, 0x0E ; 14 1e4c2: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, 0); 1e4c6: 60 e0 ldi r22, 0x00 ; 0 1e4c8: 8f ec ldi r24, 0xCF ; 207 1e4ca: 9e e0 ldi r25, 0x0E ; 14 1e4cc: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES, 0); 1e4d0: 88 ea ldi r24, 0xA8 ; 168 1e4d2: 9c e0 ldi r25, 0x0C ; 12 1e4d4: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE) 1e4d8: 81 ea ldi r24, 0xA1 ; 161 1e4da: 9d e0 ldi r25, 0x0D ; 13 1e4dc: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e4e0: 8f 3f cpi r24, 0xFF ; 255 1e4e2: 71 f4 brne .+28 ; 0x1e500 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e4e4: 60 e0 ldi r22, 0x00 ; 0 1e4e6: 81 ea ldi r24, 0xA1 ; 161 1e4e8: 9d e0 ldi r25, 0x0D ; 13 1e4ea: 0f 94 04 a4 call 0x34808 ; 0x34808 if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE) { eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), 0); // When upgrading from version older version (before multiple sheets were implemented in v3.8.0) // Sheet 1 uses the previous Live adjust Z (@EEPROM_BABYSTEP_Z) int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z); 1e4ee: 88 ef ldi r24, 0xF8 ; 248 1e4f0: 9f e0 ldi r25, 0x0F ; 15 1e4f2: 0f 94 ee a3 call 0x347dc ; 0x347dc eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep); 1e4f6: bc 01 movw r22, r24 1e4f8: 80 e5 ldi r24, 0x50 ; 80 1e4fa: 9d e0 ldi r25, 0x0D ; 13 1e4fc: 0f 94 22 a4 call 0x34844 ; 0x34844 SET_OUTPUT(Y_MS1_PIN); SET_OUTPUT(Y_MS2_PIN); SET_OUTPUT(Z_MS1_PIN); SET_OUTPUT(Z_MS2_PIN); SET_OUTPUT(E0_MS1_PIN); SET_OUTPUT(E0_MS2_PIN); 1e500: 49 e4 ldi r20, 0x49 ; 73 1e502: c4 2e mov r12, r20 1e504: 4d e0 ldi r20, 0x0D ; 13 1e506: d4 2e mov r13, r20 1e508: 10 e0 ldi r17, 0x00 ; 0 } // initialize the sheet names in eeprom for (uint_least8_t i = 0; i < (sizeof(Sheets::s)/sizeof(Sheets::s[0])); i++) { SheetName sheetName; eeprom_default_sheet_name(i, sheetName); 1e50a: b7 01 movw r22, r14 1e50c: 81 2f mov r24, r17 1e50e: 0e 94 b8 78 call 0xf170 ; 0xf170 eeprom_init_default_block(EEPROM_Sheets_base->s[i].name, (sizeof(Sheet::name)/sizeof(Sheet::name[0])), sheetName.c); 1e512: a7 01 movw r20, r14 1e514: 67 e0 ldi r22, 0x07 ; 7 1e516: 70 e0 ldi r23, 0x00 ; 0 1e518: c6 01 movw r24, r12 1e51a: 0e 94 26 78 call 0xf04c ; 0xf04c int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z); eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep); } // initialize the sheet names in eeprom for (uint_least8_t i = 0; i < (sizeof(Sheets::s)/sizeof(Sheets::s[0])); i++) { 1e51e: 1f 5f subi r17, 0xFF ; 255 1e520: fb e0 ldi r31, 0x0B ; 11 1e522: cf 0e add r12, r31 1e524: d1 1c adc r13, r1 1e526: 18 30 cpi r17, 0x08 ; 8 1e528: 81 f7 brne .-32 ; 0x1e50a SheetName sheetName; eeprom_default_sheet_name(i, sheetName); eeprom_init_default_block(EEPROM_Sheets_base->s[i].name, (sizeof(Sheet::name)/sizeof(Sheet::name[0])), sheetName.c); } if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))) 1e52a: 81 ea ldi r24, 0xA1 ; 161 1e52c: 9d e0 ldi r25, 0x0D ; 13 1e52e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e532: 0e 94 88 78 call 0xf110 ; 0xf110 1e536: 81 11 cpse r24, r1 1e538: 02 c0 rjmp .+4 ; 0x1e53e { eeprom_switch_to_next_sheet(); 1e53a: 0e 94 aa 78 call 0xf154 ; 0xf154 } check_babystep(); 1e53e: 0e 94 1c 7d call 0xfa38 ; 0xfa38 // initialize custom mendel name in eeprom if (eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_MENDEL_NAME) == EEPROM_EMPTY_VALUE) { 1e542: 80 e8 ldi r24, 0x80 ; 128 1e544: 9c e0 ldi r25, 0x0C ; 12 1e546: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e54a: 8f 3f cpi r24, 0xFF ; 255 1e54c: 41 f4 brne .+16 ; 0x1e55e #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 1e54e: 4f e0 ldi r20, 0x0F ; 15 1e550: 50 e0 ldi r21, 0x00 ; 0 1e552: 60 e8 ldi r22, 0x80 ; 128 1e554: 7c e0 ldi r23, 0x0C ; 12 1e556: 8e ec ldi r24, 0xCE ; 206 1e558: 92 e0 ldi r25, 0x02 ; 2 1e55a: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 //SERIAL_ECHOLN("Init Custom Mendel Name"); eeprom_update_block_notify(CUSTOM_MENDEL_NAME, (uint8_t*)EEPROM_CUSTOM_MENDEL_NAME, sizeof(CUSTOM_MENDEL_NAME)); } //else SERIAL_ECHOLN("Found Custom Mendel Name"); #ifdef PINDA_TEMP_COMP eeprom_init_default_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION, 0); 1e55e: 60 e0 ldi r22, 0x00 ; 0 1e560: 89 e2 ldi r24, 0x29 ; 41 1e562: 9d e0 ldi r25, 0x0D ; 13 1e564: 0e 94 5d 78 call 0xf0ba ; 0xf0ba #endif //PINDA_TEMP_COMP eeprom_init_default_dword((uint32_t*)EEPROM_JOB_ID, 0); 1e568: 85 e0 ldi r24, 0x05 ; 5 1e56a: 9d e0 ldi r25, 0x0D ; 13 1e56c: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 eeprom_init_default_dword((uint32_t*)EEPROM_TOTALTIME, 0); 1e570: 8d ee ldi r24, 0xED ; 237 1e572: 9f e0 ldi r25, 0x0F ; 15 1e574: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 eeprom_init_default_dword((uint32_t*)EEPROM_FILAMENTUSED, 0); 1e578: 81 ef ldi r24, 0xF1 ; 241 1e57a: 9f e0 ldi r25, 0x0F ; 15 1e57c: 0f 94 d8 6c call 0x2d9b0 ; 0x2d9b0 eeprom_init_default_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0); 1e580: 60 e0 ldi r22, 0x00 ; 0 1e582: 8e ec ldi r24, 0xCE ; 206 1e584: 9e e0 ldi r25, 0x0E ; 14 1e586: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, 1); 1e58a: 61 e0 ldi r22, 0x01 ; 1 1e58c: 87 ea ldi r24, 0xA7 ; 167 1e58e: 9c e0 ldi r25, 0x0C ; 12 1e590: 0e 94 5d 78 call 0xf0ba ; 0xf0ba putchar('\n'); list_sec_lang_from_external_flash(); #endif //DEBUG_XFLASH // lang_reset(); if (!lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG))) 1e594: 8e ef ldi r24, 0xFE ; 254 1e596: 9f e0 ldi r25, 0x0F ; 15 1e598: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e59c: 0e 94 ce 74 call 0xe99c ; 0xe99c 1e5a0: 81 11 cpse r24, r1 1e5a2: 02 c0 rjmp .+4 ; 0x1e5a8 lcd_language(); 1e5a4: 0e 94 49 c4 call 0x18892 ; 0x18892 lang_print_sec_lang(); #endif //DEBUG_SEC_LANG #endif //(LANG_MODE != 0) eeprom_init_default_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); 1e5a8: 60 e0 ldi r22, 0x00 ; 0 1e5aa: 8f ea ldi r24, 0xAF ; 175 1e5ac: 9f e0 ldi r25, 0x0F ; 15 1e5ae: 0e 94 5d 78 call 0xf0ba ; 0xf0ba if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA) == 255) { 1e5b2: 86 ea ldi r24, 0xA6 ; 166 1e5b4: 9f e0 ldi r25, 0x0F ; 15 1e5b6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e5ba: 8f 3f cpi r24, 0xFF ; 255 1e5bc: d9 f4 brne .+54 ; 0x1e5f4 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e5be: 61 e0 ldi r22, 0x01 ; 1 1e5c0: 86 ea ldi r24, 0xA6 ; 166 1e5c2: 9f e0 ldi r25, 0x0F ; 15 1e5c4: 0f 94 04 a4 call 0x34808 ; 0x34808 1e5c8: 30 eb ldi r19, 0xB0 ; 176 1e5ca: e3 2e mov r14, r19 1e5cc: 3f e0 ldi r19, 0x0F ; 15 1e5ce: f3 2e mov r15, r19 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1e5d0: 70 e0 ldi r23, 0x00 ; 0 1e5d2: 60 e0 ldi r22, 0x00 ; 0 1e5d4: c7 01 movw r24, r14 1e5d6: 0f 94 22 a4 call 0x34844 ; 0x34844 1e5da: 22 e0 ldi r18, 0x02 ; 2 1e5dc: e2 0e add r14, r18 1e5de: f1 1c adc r15, r1 //eeprom_write_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 0); eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1); int16_t z_shift = 0; for (uint8_t i = 0; i < 5; i++) { 1e5e0: 3a eb ldi r19, 0xBA ; 186 1e5e2: e3 16 cp r14, r19 1e5e4: 3f e0 ldi r19, 0x0F ; 15 1e5e6: f3 06 cpc r15, r19 1e5e8: 99 f7 brne .-26 ; 0x1e5d0 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e5ea: 60 e0 ldi r22, 0x00 ; 0 1e5ec: 8f ea ldi r24, 0xAF ; 175 1e5ee: 9f e0 ldi r25, 0x0F ; 15 1e5f0: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } eeprom_update_byte_notify((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); } eeprom_init_default_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY); 1e5f4: 60 e0 ldi r22, 0x00 ; 0 1e5f6: 85 ea ldi r24, 0xA5 ; 165 1e5f8: 9f e0 ldi r25, 0x0F ; 15 1e5fa: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0); 1e5fe: 60 e0 ldi r22, 0x00 ; 0 1e600: 8f e7 ldi r24, 0x7F ; 127 1e602: 9c e0 ldi r25, 0x0C ; 12 1e604: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_SD_SORT, 0); 1e608: 60 e0 ldi r22, 0x00 ; 0 1e60a: 89 e0 ldi r24, 0x09 ; 9 1e60c: 9f e0 ldi r25, 0x0F ; 15 1e60e: 0e 94 5d 78 call 0xf0ba ; 0xf0ba } void mbl_settings_init() { //3x3 mesh; 3 Z-probes on each point, magnet elimination on //magnet elimination: use aaproximate Z-coordinate instead of measured values for points which are near magnets eeprom_init_default_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, 1); 1e612: 61 e0 ldi r22, 0x01 ; 1 1e614: 8c ea ldi r24, 0xAC ; 172 1e616: 9d e0 ldi r25, 0x0D ; 13 1e618: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_MBL_POINTS_NR, 3); 1e61c: 63 e0 ldi r22, 0x03 ; 3 1e61e: 8b ea ldi r24, 0xAB ; 171 1e620: 9d e0 ldi r25, 0x0D ; 13 1e622: 0e 94 5d 78 call 0xf0ba ; 0xf0ba eeprom_init_default_byte((uint8_t*)EEPROM_MBL_PROBE_NR, 3); 1e626: 63 e0 ldi r22, 0x03 ; 3 1e628: 8a ea ldi r24, 0xAA ; 170 1e62a: 9d e0 ldi r25, 0x0D ; 13 1e62c: 0e 94 5d 78 call 0xf0ba ; 0xf0ba //mbl_mode_init(); mbl_settings_init(); eeprom_init_default_byte((uint8_t*)EEPROM_MMU_STEALTH, 1); 1e630: 61 e0 ldi r22, 0x01 ; 1 1e632: 89 ea ldi r24, 0xA9 ; 169 1e634: 9d e0 ldi r25, 0x0D ; 13 1e636: 0e 94 5d 78 call 0xf0ba ; 0xf0ba #if (!defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1)) setup_fan_interrupt(); #endif //DEBUG_DISABLE_FANCHECK #ifndef DEBUG_DISABLE_STARTMSGS KEEPALIVE_STATE(PAUSED_FOR_USER); 1e63a: 84 e0 ldi r24, 0x04 ; 4 1e63c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) check_if_fw_is_on_right_printer(); #endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) } switch (hw_changed) { 1e640: 02 30 cpi r16, 0x02 ; 2 1e642: 09 f4 brne .+2 ; 0x1e646 1e644: 81 c0 rjmp .+258 ; 0x1e748 1e646: 03 30 cpi r16, 0x03 ; 3 1e648: 09 f4 brne .+2 ; 0x1e64c 1e64a: 22 c1 rjmp .+580 ; 0x1e890 1e64c: 01 30 cpi r16, 0x01 ; 1 1e64e: 09 f0 breq .+2 ; 0x1e652 1e650: 87 c0 rjmp .+270 ; 0x1e760 //if motherboard or printer type was changed inform user as it can indicate flashing wrong firmware version //if user confirms with knob, new hw version (printer and/or motherboard) is written to eeprom and message will be not shown next time case(0b01): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_MOTHERBOARD)); 1e652: 83 e5 ldi r24, 0x53 ; 83 1e654: 9e e4 ldi r25, 0x4E ; 78 1e656: 0e 94 3a 75 call 0xea74 ; 0xea74 1e65a: 0e 94 94 ea call 0x1d528 ; 0x1d528 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); 1e65e: 6b ec ldi r22, 0xCB ; 203 1e660: 70 e0 ldi r23, 0x00 ; 0 1e662: 8c ee ldi r24, 0xEC ; 236 1e664: 9e e0 ldi r25, 0x0E ; 14 1e666: 7a c0 rjmp .+244 ; 0x1e75c first++; lcd_clear(); } } if (cursor_pos < 0) { 1e668: 1f 3f cpi r17, 0xFF ; 255 1e66a: 09 f0 breq .+2 ; 0x1e66e 1e66c: d4 cd rjmp .-1112 ; 0x1e216 cursor_pos = 0; Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1e66e: 87 e0 ldi r24, 0x07 ; 7 1e670: 0f 94 ad 25 call 0x24b5a ; 0x24b5a if (first > 0) { 1e674: 80 91 46 04 lds r24, 0x0446 ; 0x800446 1e678: 18 16 cp r1, r24 1e67a: 2c f4 brge .+10 ; 0x1e686 first--; 1e67c: 81 50 subi r24, 0x01 ; 1 1e67e: 80 93 46 04 sts 0x0446, r24 ; 0x800446 lcd_clear(); 1e682: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_clear(); } } if (cursor_pos < 0) { cursor_pos = 0; 1e686: 10 e0 ldi r17, 0x00 ; 0 1e688: c6 cd rjmp .-1140 ; 0x1e216 // Level input parameter sets depth of reset static void factory_reset(char level) { lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { 1e68a: 13 30 cpi r17, 0x03 ; 3 1e68c: 31 f1 breq .+76 ; 0x1e6da 1e68e: 14 30 cpi r17, 0x04 ; 4 1e690: 09 f0 breq .+2 ; 0x1e694 1e692: f4 cd rjmp .-1048 ; 0x1e27c #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //FILAMENT_SENSOR break; case 4: menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data")); 1e694: 6c e0 ldi r22, 0x0C ; 12 1e696: 77 e8 ldi r23, 0x87 ; 135 1e698: 80 e0 ldi r24, 0x00 ; 0 1e69a: 90 e1 ldi r25, 0x10 ; 16 1e69c: 0e 94 11 72 call 0xe422 ; 0xe422 // Erase EEPROM for (uint16_t i = 0; i < EEPROM_TOP; i++) { 1e6a0: 10 e0 ldi r17, 0x00 ; 0 1e6a2: 00 e0 ldi r16, 0x00 ; 0 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e6a4: 6f ef ldi r22, 0xFF ; 255 1e6a6: c8 01 movw r24, r16 1e6a8: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t*)i, 0xFF); menu_progressbar_update(i); 1e6ac: c8 01 movw r24, r16 1e6ae: 0e 94 47 71 call 0xe28e ; 0xe28e break; case 4: menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data")); // Erase EEPROM for (uint16_t i = 0; i < EEPROM_TOP; i++) { 1e6b2: 0f 5f subi r16, 0xFF ; 255 1e6b4: 1f 4f sbci r17, 0xFF ; 255 1e6b6: 01 15 cp r16, r1 1e6b8: b0 e1 ldi r27, 0x10 ; 16 1e6ba: 1b 07 cpc r17, r27 1e6bc: 99 f7 brne .-26 ; 0x1e6a4 eeprom_update_byte_notify((uint8_t*)i, 0xFF); menu_progressbar_update(i); } menu_progressbar_finish(); 1e6be: 0e 94 68 71 call 0xe2d0 ; 0xe2d0 softReset(); 1e6c2: 0e 94 1f 66 call 0xcc3e ; 0xcc3e lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { case 0: // Level 0: Language reset lang_reset(); 1e6c6: 0e 94 3d 74 call 0xe87a ; 0xe87a 1e6ca: d8 cd rjmp .-1104 ; 0x1e27c break; case 1: //Level 1: Reset statistics factory_reset_stats(); 1e6cc: 0e 94 e4 65 call 0xcbc8 ; 0xcbc8 lcd_menu_statistics(); 1e6d0: 0f 94 9f 17 call 0x22f3e ; 0x22f3e 1e6d4: d3 cd rjmp .-1114 ; 0x1e27c break; case 2: // Level 2: Prepare for shipping factory_reset_stats(); 1e6d6: 0e 94 e4 65 call 0xcbc8 ; 0xcbc8 // FALLTHRU case 3: // Level 3: Preparation after being serviced // Force language selection at the next boot up. lang_reset(); 1e6da: 0e 94 3d 74 call 0xe87a ; 0xe87a // Force the wizard in "Follow calibration flow" mode at the next boot up calibration_status_clear(CALIBRATION_FORCE_PREP); 1e6de: 84 e0 ldi r24, 0x04 ; 4 1e6e0: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 if (active) { uint8_t previous_value = eeprom_read_byte(dst); eeprom_byte_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_byte(dst, value); 1e6e4: 62 e0 ldi r22, 0x02 ; 2 1e6e6: 8f e5 ldi r24, 0x5F ; 95 1e6e8: 9f e0 ldi r25, 0x0F ; 15 1e6ea: 0f 94 28 a4 call 0x34850 ; 0x34850 lcd_update(2); fCheckModeInit(); // alternatively invoke printer reset } void farm_disable() { farm_mode = false; 1e6ee: 10 92 60 0d sts 0x0D60, r1 ; 0x800d60 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e6f2: 60 e0 ldi r22, 0x00 ; 0 1e6f4: 84 ec ldi r24, 0xC4 ; 196 1e6f6: 9f e0 ldi r25, 0x0F ; 15 1e6f8: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_write_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 2); farm_disable(); #ifdef FILAMENT_SENSOR fsensor.setEnabled(true); 1e6fc: 81 e0 ldi r24, 0x01 ; 1 1e6fe: 0e 94 90 77 call 0xef20 ; 0xef20 1e702: 11 e0 ldi r17, 0x01 ; 1 1e704: 10 93 f2 16 sts 0x16F2, r17 ; 0x8016f2 1e708: 61 e0 ldi r22, 0x01 ; 1 1e70a: 87 e0 ldi r24, 0x07 ; 7 1e70c: 9f e0 ldi r25, 0x0F ; 15 1e70e: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state); } } void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) { runoutEnabled = state; 1e712: 10 93 f3 16 sts 0x16F3, r17 ; 0x8016f3 1e716: 61 e0 ldi r22, 0x01 ; 1 1e718: 85 ed ldi r24, 0xD5 ; 213 1e71a: 9e e0 ldi r25, 0x0E ; 14 1e71c: 0f 94 04 a4 call 0x34808 ; 0x34808 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 1e720: 10 93 ff 16 sts 0x16FF, r17 ; 0x8016ff oldPos = pat9125_y; 1e724: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 1e728: 90 91 39 0e lds r25, 0x0E39 ; 0x800e39 1e72c: 90 93 01 17 sts 0x1701, r25 ; 0x801701 1e730: 80 93 00 17 sts 0x1700, r24 ; 0x801700 resetStepCount(); 1e734: 0f 94 8d 6d call 0x2db1a ; 0x2db1a jamErrCnt = 0; 1e738: 10 92 06 17 sts 0x1706, r1 ; 0x801706 1e73c: 61 e0 ldi r22, 0x01 ; 1 1e73e: 8d ea ldi r24, 0xAD ; 173 1e740: 9c e0 ldi r25, 0x0C ; 12 1e742: 0f 94 04 a4 call 0x34808 ; 0x34808 1e746: 9a cd rjmp .-1228 ; 0x1e27c case(0b01): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_MOTHERBOARD)); eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); break; case(0b10): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_PRINTER)); 1e748: 82 e3 ldi r24, 0x32 ; 50 1e74a: 9e e4 ldi r25, 0x4E ; 78 1e74c: 0e 94 3a 75 call 0xea74 ; 0xea74 1e750: 0e 94 94 ea call 0x1d528 ; 0x1d528 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); 1e754: 6a ef ldi r22, 0xFA ; 250 1e756: 70 e0 ldi r23, 0x00 ; 0 1e758: 8e ee ldi r24, 0xEE ; 238 1e75a: 9e e0 ldi r25, 0x0E ; 14 1e75c: 0f 94 3e a4 call 0x3487c ; 0x3487c eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); break; default: break; //no change, show no message } if (!previous_settings_retrieved) { 1e760: b1 10 cpse r11, r1 1e762: 08 c0 rjmp .+16 ; 0x1e774 lcd_show_fullscreen_message_and_wait_P(_T(MSG_DEFAULT_SETTINGS_LOADED)); //if EEPROM version or printer type was changed, inform user that default setting were loaded 1e764: 8b eb ldi r24, 0xBB ; 187 1e766: 9d e4 ldi r25, 0x4D ; 77 1e768: 0e 94 3a 75 call 0xea74 ; 0xea74 1e76c: 0e 94 94 ea call 0x1d528 ; 0x1d528 Config_StoreSettings(); 1e770: 0e 94 7f 87 call 0x10efe ; 0x10efe } // handle FW and calibration status upgrade bool run_wizard = false; if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) { 1e774: 80 e8 ldi r24, 0x80 ; 128 1e776: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1e77a: 88 23 and r24, r24 1e77c: c9 f0 breq .+50 ; 0x1e7b0 CalibrationStatus calibration_status = 0; if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) { 1e77e: 87 ef ldi r24, 0xF7 ; 247 1e780: 9f e0 ldi r25, 0x0F ; 15 1e782: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 } // handle FW and calibration status upgrade bool run_wizard = false; if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) { CalibrationStatus calibration_status = 0; 1e786: 60 e0 ldi r22, 0x00 ; 0 if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) { 1e788: 81 30 cpi r24, 0x01 ; 1 1e78a: 71 f4 brne .+28 ; 0x1e7a8 // calibrated printer upgraded from FW<3.12 calibration_status |= (CALIBRATION_STATUS_SELFTEST | CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z | CALIBRATION_STATUS_LIVE_ADJUST); static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4}; if (eeprom_fw_version_older_than_p(v3_2_0_4)) { 1e78c: 8d e3 ldi r24, 0x3D ; 61 1e78e: 97 e8 ldi r25, 0x87 ; 135 1e790: 0e 94 ec bf call 0x17fd8 ; 0x17fd8 bool run_wizard = false; if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) { CalibrationStatus calibration_status = 0; if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) { // calibrated printer upgraded from FW<3.12 calibration_status |= (CALIBRATION_STATUS_SELFTEST | CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z | CALIBRATION_STATUS_LIVE_ADJUST); 1e794: 67 e1 ldi r22, 0x17 ; 23 static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4}; if (eeprom_fw_version_older_than_p(v3_2_0_4)) { 1e796: 88 23 and r24, r24 1e798: 39 f0 breq .+14 ; 0x1e7a8 // printer upgraded from FW<3.2.0.4 and requires re-running selftest lcd_show_fullscreen_message_and_wait_P(_T(MSG_FORCE_SELFTEST)); 1e79a: 89 e7 ldi r24, 0x79 ; 121 1e79c: 9d e4 ldi r25, 0x4D ; 77 1e79e: 0e 94 3a 75 call 0xea74 ; 0xea74 1e7a2: 0e 94 94 ea call 0x1d528 ; 0x1d528 calibration_status &= ~CALIBRATION_STATUS_SELFTEST; 1e7a6: 66 e1 ldi r22, 0x16 ; 22 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e7a8: 86 ea ldi r24, 0xA6 ; 166 1e7aa: 9c e0 ldi r25, 0x0C ; 12 1e7ac: 0f 94 04 a4 call 0x34808 ; 0x34808 } } eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, calibration_status); } if (eeprom_fw_version_older_than_p(FW_VERSION_NR)) { 1e7b0: 85 e3 ldi r24, 0x35 ; 53 1e7b2: 97 e8 ldi r25, 0x87 ; 135 1e7b4: 0e 94 ec bf call 0x17fd8 ; 0x17fd8 1e7b8: 18 2f mov r17, r24 1e7ba: 88 23 and r24, r24 1e7bc: 29 f0 breq .+10 ; 0x1e7c8 if (!calibration_status_get(CALIBRATION_WIZARD_STEPS)) { 1e7be: 87 e1 ldi r24, 0x17 ; 23 1e7c0: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1e7c4: 11 e0 ldi r17, 0x01 ; 1 1e7c6: 18 27 eor r17, r24 static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4}; if (eeprom_fw_version_older_than_p(v3_2_0_4)) { // printer upgraded from FW<3.2.0.4 and requires re-running selftest lcd_show_fullscreen_message_and_wait_P(_T(MSG_FORCE_SELFTEST)); calibration_status &= ~CALIBRATION_STATUS_SELFTEST; 1e7c8: f1 2c mov r15, r1 1e7ca: e1 2c mov r14, r1 } void update_current_firmware_version_to_eeprom() { for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){ eeprom_update_byte_notify((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i)); 1e7cc: f7 01 movw r30, r14 1e7ce: e5 5d subi r30, 0xD5 ; 213 1e7d0: f8 47 sbci r31, 0x78 ; 120 1e7d2: 64 91 lpm r22, Z 1e7d4: c7 01 movw r24, r14 1e7d6: 0f 94 04 a4 call 0x34808 ; 0x34808 1e7da: 8f ef ldi r24, 0xFF ; 255 1e7dc: e8 1a sub r14, r24 1e7de: f8 0a sbc r15, r24 return true; } void update_current_firmware_version_to_eeprom() { for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){ 1e7e0: 9a e0 ldi r25, 0x0A ; 10 1e7e2: e9 16 cp r14, r25 1e7e4: f1 04 cpc r15, r1 1e7e6: 91 f7 brne .-28 ; 0x1e7cc eeprom_update_byte_notify((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i)); } eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR, (uint16_t)pgm_read_word(&FW_VERSION_NR[0])); 1e7e8: e5 e3 ldi r30, 0x35 ; 53 1e7ea: f7 e8 ldi r31, 0x87 ; 135 1e7ec: 65 91 lpm r22, Z+ 1e7ee: 74 91 lpm r23, Z if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1e7f0: 8a e0 ldi r24, 0x0A ; 10 1e7f2: 90 e0 ldi r25, 0x00 ; 0 1e7f4: 0f 94 22 a4 call 0x34844 ; 0x34844 eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR, (uint16_t)pgm_read_word(&FW_VERSION_NR[1])); 1e7f8: e7 e3 ldi r30, 0x37 ; 55 1e7fa: f7 e8 ldi r31, 0x87 ; 135 1e7fc: 65 91 lpm r22, Z+ 1e7fe: 74 91 lpm r23, Z 1e800: 8c e0 ldi r24, 0x0C ; 12 1e802: 90 e0 ldi r25, 0x00 ; 0 1e804: 0f 94 22 a4 call 0x34844 ; 0x34844 eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, (uint16_t)pgm_read_word(&FW_VERSION_NR[2])); 1e808: e9 e3 ldi r30, 0x39 ; 57 1e80a: f7 e8 ldi r31, 0x87 ; 135 1e80c: 65 91 lpm r22, Z+ 1e80e: 74 91 lpm r23, Z 1e810: 8e e0 ldi r24, 0x0E ; 14 1e812: 90 e0 ldi r25, 0x00 ; 0 1e814: 0f 94 22 a4 call 0x34844 ; 0x34844 // See FirmwareRevisionFlavorType for the definition of firmware flavors. eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR, (uint16_t)pgm_read_word(&FW_VERSION_NR[3])); 1e818: eb e3 ldi r30, 0x3B ; 59 1e81a: f7 e8 ldi r31, 0x87 ; 135 1e81c: 65 91 lpm r22, Z+ 1e81e: 74 91 lpm r23, Z 1e820: 80 e1 ldi r24, 0x10 ; 16 1e822: 90 e0 ldi r25, 0x00 ; 0 1e824: 0f 94 22 a4 call 0x34844 ; 0x34844 run_wizard = true; } } update_current_firmware_version_to_eeprom(); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) { 1e828: 8f e5 ldi r24, 0x5F ; 95 1e82a: 9f e0 ldi r25, 0x0F ; 15 1e82c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e830: 88 23 and r24, r24 1e832: d9 f1 breq .+118 ; 0x1e8aa // first time run of wizard or service prep lcd_wizard(WizState::Run); 1e834: 80 e0 ldi r24, 0x00 ; 0 } else if (run_wizard) { // some wizard steps required by the upgrade checks lcd_wizard(WizState::Restore); 1e836: 0e 94 c3 eb call 0x1d786 ; 0x1d786 lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_NOT_CAL)); #endif //THERMAL_MODEL } } KEEPALIVE_STATE(IN_PROCESS); 1e83a: 83 e0 ldi r24, 0x03 ; 3 1e83c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 #endif //DEBUG_DISABLE_STARTMSGS lcd_update_enable(true); 1e840: 81 e0 ldi r24, 0x01 ; 1 1e842: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 1e846: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_update(2); 1e84a: 82 e0 ldi r24, 0x02 ; 2 1e84c: 0e 94 f9 6e call 0xddf2 ; 0xddf2 "Contact support to submit details.")); } #endif } #else //XFLASH_DUMP dump_crash_reason crash_reason = (dump_crash_reason)eeprom_read_byte((uint8_t*)EEPROM_FW_CRASH_FLAG); 1e850: 83 e0 ldi r24, 0x03 ; 3 1e852: 9d e0 ldi r25, 0x0D ; 13 1e854: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1e858: 18 2f mov r17, r24 if(crash_reason != dump_crash_reason::manual && (uint8_t)crash_reason != 0xFF) 1e85a: 8f ef ldi r24, 0xFF ; 255 1e85c: 81 0f add r24, r17 1e85e: 8e 3f cpi r24, 0xFE ; 254 1e860: 08 f0 brcs .+2 ; 0x1e864 1e862: 49 c0 rjmp .+146 ; 0x1e8f6 } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 1e864: 80 e0 ldi r24, 0x00 ; 0 1e866: 0f 94 ad 25 call 0x24b5a ; 0x24b5a { lcd_beeper_quick_feedback(); lcd_clear(); 1e86a: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_P(_n("FIRMWARE CRASH!\nCrash reason:\n")); 1e86e: 8e e1 ldi r24, 0x1E ; 30 1e870: 99 e6 ldi r25, 0x69 ; 105 1e872: 0e 94 1d 6f call 0xde3a ; 0xde3a switch(crash_reason) 1e876: 12 30 cpi r17, 0x02 ; 2 1e878: b1 f1 breq .+108 ; 0x1e8e6 1e87a: 13 30 cpi r17, 0x03 ; 3 1e87c: 09 f4 brne .+2 ; 0x1e880 1e87e: 16 c1 rjmp .+556 ; 0x1eaac { case dump_crash_reason::stack_error: lcd_puts_P(_n("Static memory has\nbeen overwritten")); 1e880: 8b ef ldi r24, 0xFB ; 251 1e882: 98 e6 ldi r25, 0x68 ; 104 { lcd_beeper_quick_feedback(); lcd_clear(); lcd_puts_P(_n("FIRMWARE CRASH!\nCrash reason:\n")); switch(crash_reason) 1e884: 11 30 cpi r17, 0x01 ; 1 1e886: 89 f1 breq .+98 ; 0x1e8ea } void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); 1e888: 81 2f mov r24, r17 1e88a: 0e 94 a2 70 call 0xe144 ; 0xe144 1e88e: 2f c0 rjmp .+94 ; 0x1e8ee case(0b10): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_PRINTER)); eeprom_write_word_notify((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); break; case(0b11): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_BOTH)); 1e890: 87 ef ldi r24, 0xF7 ; 247 1e892: 9d e4 ldi r25, 0x4D ; 77 1e894: 0e 94 3a 75 call 0xea74 ; 0xea74 1e898: 0e 94 94 ea call 0x1d528 ; 0x1d528 if (active) { uint16_t previous_value = eeprom_read_word(dst); eeprom_word_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_word(dst, value); 1e89c: 6a ef ldi r22, 0xFA ; 250 1e89e: 70 e0 ldi r23, 0x00 ; 0 1e8a0: 8e ee ldi r24, 0xEE ; 238 1e8a2: 9e e0 ldi r25, 0x0E ; 14 1e8a4: 0f 94 3e a4 call 0x3487c ; 0x3487c 1e8a8: da ce rjmp .-588 ; 0x1e65e // first time run of wizard or service prep lcd_wizard(WizState::Run); } else if (run_wizard) { // some wizard steps required by the upgrade checks lcd_wizard(WizState::Restore); 1e8aa: 81 e0 ldi r24, 0x01 ; 1 if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) { // first time run of wizard or service prep lcd_wizard(WizState::Run); } else if (run_wizard) { 1e8ac: 11 11 cpse r17, r1 1e8ae: c3 cf rjmp .-122 ; 0x1e836 // some wizard steps required by the upgrade checks lcd_wizard(WizState::Restore); } else { if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { 1e8b0: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1e8b4: 81 11 cpse r24, r1 1e8b6: 07 c0 rjmp .+14 ; 0x1e8c6 // aborted or missing wizard: show a single warning lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW)); 1e8b8: 89 e0 ldi r24, 0x09 ; 9 1e8ba: 9d e4 ldi r25, 0x4D ; 77 // wizard reset after service prep lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_Z_CALIBRATION_FLOW)); } else { // warn about other important steps individually if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET)); 1e8bc: 0e 94 3a 75 call 0xea74 ; 0xea74 1e8c0: 0e 94 94 ea call 0x1d528 ; 0x1d528 1e8c4: ba cf rjmp .-140 ; 0x1e83a else { if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { // aborted or missing wizard: show a single warning lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW)); } else if (!calibration_status_get(CALIBRATION_STATUS_Z)) { 1e8c6: 84 e0 ldi r24, 0x04 ; 4 1e8c8: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1e8cc: 81 11 cpse r24, r1 1e8ce: 03 c0 rjmp .+6 ; 0x1e8d6 // wizard reset after service prep lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_Z_CALIBRATION_FLOW)); 1e8d0: 81 e9 ldi r24, 0x91 ; 145 1e8d2: 9c e4 ldi r25, 0x4C ; 76 1e8d4: f3 cf rjmp .-26 ; 0x1e8bc } else { // warn about other important steps individually if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) 1e8d6: 80 e1 ldi r24, 0x10 ; 16 1e8d8: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1e8dc: 81 11 cpse r24, r1 1e8de: ad cf rjmp .-166 ; 0x1e83a lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET)); 1e8e0: 8a ef ldi r24, 0xFA ; 250 1e8e2: 9f e5 ldi r25, 0x5F ; 95 1e8e4: eb cf rjmp .-42 ; 0x1e8bc { case dump_crash_reason::stack_error: lcd_puts_P(_n("Static memory has\nbeen overwritten")); break; case dump_crash_reason::watchdog: lcd_puts_P(_n("Watchdog timeout")); 1e8e6: 8a ee ldi r24, 0xEA ; 234 1e8e8: 98 e6 ldi r25, 0x68 ; 104 1e8ea: 0e 94 1d 6f call 0xde3a ; 0xde3a } } void lcd_wait_for_click() { lcd_wait_for_click_delay(0); 1e8ee: 90 e0 ldi r25, 0x00 ; 0 1e8f0: 80 e0 ldi r24, 0x00 ; 0 1e8f2: 0e 94 c2 df call 0x1bf84 ; 0x1bf84 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e8f6: 6f ef ldi r22, 0xFF ; 255 1e8f8: 83 e0 ldi r24, 0x03 ; 3 1e8fa: 9d e0 ldi r25, 0x0D ; 13 1e8fc: 0f 94 04 a4 call 0x34808 ; 0x34808 // Only arm the uvlo interrupt _after_ a recovering print has been initialized and // the entire state machine initialized. setup_uvlo_interrupt(); #endif //UVLO_SUPPORT fCheckModeInit(); 1e900: 0e 94 5e d9 call 0x1b2bc ; 0x1b2bc KEEPALIVE_STATE(NOT_BUSY); 1e904: 81 e0 ldi r24, 0x01 ; 1 1e906: 80 93 78 02 sts 0x0278, r24 ; 0x800278 : "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | _BV(WDE) | (value & 0x07)) ) : "r0" ); 1e90a: 88 e1 ldi r24, 0x18 ; 24 1e90c: 98 e2 ldi r25, 0x28 ; 40 1e90e: 0f b6 in r0, 0x3f ; 63 1e910: f8 94 cli 1e912: a8 95 wdr 1e914: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1e918: 0f be out 0x3f, r0 ; 63 1e91a: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> #ifdef WATCHDOG wdt_enable(WDTO_4S); #ifdef EMERGENCY_HANDLERS WDTCSR |= (1 << WDIE); 1e91e: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1e922: 80 64 ori r24, 0x40 ; 64 1e924: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> sei(); } } else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){ cli(); *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED; 1e928: 85 e0 ldi r24, 0x05 ; 5 1e92a: d8 2e mov r13, r24 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); 1e92c: 90 e0 ldi r25, 0x00 ; 0 1e92e: e9 2e mov r14, r25 1e930: 90 e0 ldi r25, 0x00 ; 0 1e932: f9 2e mov r15, r25 // Currently Stopped (possibly due to an error) and not accepting new serial commands. // Signal to the host that we're currently busy waiting for supervision. KEEPALIVE_STATE(PAUSED_FOR_USER); } else { // Printer is available for processing, reset state KEEPALIVE_STATE(NOT_BUSY); 1e934: cc 24 eor r12, r12 1e936: c3 94 inc r12 planner_aborted = false; if(Stopped) { // Currently Stopped (possibly due to an error) and not accepting new serial commands. // Signal to the host that we're currently busy waiting for supervision. KEEPALIVE_STATE(PAUSED_FOR_USER); 1e938: 24 e0 ldi r18, 0x04 ; 4 1e93a: b2 2e mov r11, r18 // The loop() function is called in an endless loop by the Arduino framework from the default main() routine. // Before loop(), the setup() function is called by the main() routine. void loop() { // Reset a previously aborted command, we can now start processing motion again planner_aborted = false; 1e93c: 10 92 42 0d sts 0x0D42, r1 ; 0x800d42 if(Stopped) { 1e940: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 1e944: 88 23 and r24, r24 1e946: 09 f4 brne .+2 ; 0x1e94a 1e948: b4 c0 rjmp .+360 ; 0x1eab2 // Currently Stopped (possibly due to an error) and not accepting new serial commands. // Signal to the host that we're currently busy waiting for supervision. KEEPALIVE_STATE(PAUSED_FOR_USER); 1e94a: b0 92 78 02 sts 0x0278, r11 ; 0x800278 } else { // Printer is available for processing, reset state KEEPALIVE_STATE(NOT_BUSY); } if (printingIsPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing. 1e94e: 0e 94 35 66 call 0xcc6a ; 0xcc6a 1e952: 88 23 and r24, r24 1e954: 09 f4 brne .+2 ; 0x1e958 1e956: b0 c0 rjmp .+352 ; 0x1eab8 1e958: 80 91 79 02 lds r24, 0x0279 ; 0x800279 1e95c: 81 30 cpi r24, 0x01 ; 1 1e95e: 09 f0 breq .+2 ; 0x1e962 1e960: ab c0 rjmp .+342 ; 0x1eab8 usb_timer.start(); 1e962: 82 e4 ldi r24, 0x42 ; 66 1e964: 92 e1 ldi r25, 0x12 ; 18 1e966: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> } else #endif { get_command(); 1e96a: 0e 94 a5 87 call 0x10f4a ; 0x10f4a // The SD start is delayed because otherwise the serial cannot answer // fast enough to make contact with the host software. static bool autostart_stilltocheck = true; if(!force) { if(!autostart_stilltocheck) 1e96e: 80 91 56 02 lds r24, 0x0256 ; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515> 1e972: 88 23 and r24, r24 1e974: 89 f0 breq .+34 ; 0x1e998 return; if(autostart_atmillis.expired(5000)) 1e976: 68 e8 ldi r22, 0x88 ; 136 1e978: 73 e1 ldi r23, 0x13 ; 19 1e97a: 88 ee ldi r24, 0xE8 ; 232 1e97c: 96 e1 ldi r25, 0x16 ; 22 1e97e: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1e982: 81 11 cpse r24, r1 1e984: 09 c0 rjmp .+18 ; 0x1e998 return; } autostart_stilltocheck = false; 1e986: 10 92 56 02 sts 0x0256, r1 ; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515> if(!mounted) 1e98a: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 1e98e: 88 23 and r24, r24 1e990: 09 f4 brne .+2 ; 0x1e994 1e992: 9e c0 rjmp .+316 ; 0x1ead0 1e994: 0f 94 32 68 call 0x2d064 ; 0x2d064 #ifdef SDSUPPORT card.checkautostart(false); #endif if(buflen) 1e998: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1e99c: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 1e9a0: 89 2b or r24, r25 1e9a2: 09 f4 brne .+2 ; 0x1e9a6 1e9a4: 63 c0 rjmp .+198 ; 0x1ea6c { cmdbuffer_front_already_processed = false; 1e9a6: 10 92 53 12 sts 0x1253, r1 ; 0x801253 #ifdef SDSUPPORT if(card.saving) 1e9aa: 80 91 d5 13 lds r24, 0x13D5 ; 0x8013d5 1e9ae: 88 23 and r24, r24 1e9b0: c1 f1 breq .+112 ; 0x1ea22 { // Saving a G-code file onto an SD-card is in progress. // Saving starts with M28, saving until M29 is seen. if(strstr_P(CMDBUFFER_CURRENT_STRING, PSTR("M29")) == NULL) { 1e9b2: 00 91 38 12 lds r16, 0x1238 ; 0x801238 1e9b6: 10 91 39 12 lds r17, 0x1239 ; 0x801239 1e9ba: 02 5b subi r16, 0xB2 ; 178 1e9bc: 1f 4e sbci r17, 0xEF ; 239 1e9be: 6e e7 ldi r22, 0x7E ; 126 1e9c0: 77 e8 ldi r23, 0x87 ; 135 1e9c2: c8 01 movw r24, r16 1e9c4: 0f 94 e7 a1 call 0x343ce ; 0x343ce 1e9c8: 89 2b or r24, r25 1e9ca: 09 f0 breq .+2 ; 0x1e9ce 1e9cc: 8e c0 rjmp .+284 ; 0x1eaea else SERIAL_PROTOCOLLNPGM("Not SD printing"); } void CardReader::write_command(char *buf) { file.writeError = false; 1e9ce: 10 92 67 16 sts 0x1667, r1 ; 0x801667 /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use writeError to check for errors. */ void SdFile::write(const char* str) { SdBaseFile::write(str, strlen(str)); 1e9d2: f8 01 movw r30, r16 1e9d4: 01 90 ld r0, Z+ 1e9d6: 00 20 and r0, r0 1e9d8: e9 f7 brne .-6 ; 0x1e9d4 1e9da: 31 97 sbiw r30, 0x01 ; 1 1e9dc: bf 01 movw r22, r30 1e9de: 60 1b sub r22, r16 1e9e0: 71 0b sbc r23, r17 1e9e2: c8 01 movw r24, r16 1e9e4: 0f 94 09 76 call 0x2ec12 ; 0x2ec12 1e9e8: 62 e0 ldi r22, 0x02 ; 2 1e9ea: 70 e0 ldi r23, 0x00 ; 0 1e9ec: 8d ed ldi r24, 0xDD ; 221 1e9ee: 92 e0 ldi r25, 0x02 ; 2 1e9f0: 0f 94 09 76 call 0x2ec12 ; 0x2ec12 file.write(buf); //write command file.write("\r\n"); //write line termination if (file.writeError) 1e9f4: 80 91 67 16 lds r24, 0x1667 ; 0x801667 1e9f8: 88 23 and r24, r24 1e9fa: 41 f0 breq .+16 ; 0x1ea0c { SERIAL_ERROR_START; 1e9fc: 81 eb ldi r24, 0xB1 ; 177 1e9fe: 91 ea ldi r25, 0xA1 ; 161 1ea00: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNRPGM(MSG_SD_ERR_WRITE_TO_FILE); 1ea04: 88 ec ldi r24, 0xC8 ; 200 1ea06: 99 e6 ldi r25, 0x69 ; 105 1ea08: 0e 94 bd 7c call 0xf97a ; 0xf97a card.write_command(CMDBUFFER_CURRENT_STRING); if(card.logging) 1ea0c: 80 91 d6 13 lds r24, 0x13D6 ; 0x8013d6 1ea10: 88 23 and r24, r24 1ea12: 09 f4 brne .+2 ; 0x1ea16 1ea14: 65 c0 rjmp .+202 ; 0x1eae0 */ void process_commands() { if (!buflen) return; //empty command 1ea16: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1ea1a: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 1ea1e: 89 2b or r24, r25 1ea20: 11 f0 breq .+4 ; 0x1ea26 1ea22: 0e 94 dc 8f call 0x11fb8 ; 0x11fb8 } #else process_commands(); #endif //SDSUPPORT if (! cmdbuffer_front_already_processed && buflen) 1ea26: 80 91 53 12 lds r24, 0x1253 ; 0x801253 1ea2a: 81 11 cpse r24, r1 1ea2c: 19 c0 rjmp .+50 ; 0x1ea60 1ea2e: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1ea32: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 1ea36: 89 2b or r24, r25 1ea38: 99 f0 breq .+38 ; 0x1ea60 { // ptr points to the start of the block currently being processed. // The first character in the block is the block type. char *ptr = cmdbuffer + bufindr; 1ea3a: e0 91 38 12 lds r30, 0x1238 ; 0x801238 1ea3e: f0 91 39 12 lds r31, 0x1239 ; 0x801239 1ea42: e5 5b subi r30, 0xB5 ; 181 1ea44: ff 4e sbci r31, 0xEF ; 239 if (*ptr == CMDBUFFER_CURRENT_TYPE_SDCARD) { 1ea46: 80 81 ld r24, Z 1ea48: 82 30 cpi r24, 0x02 ; 2 1ea4a: 09 f0 breq .+2 ; 0x1ea4e 1ea4c: 53 c0 rjmp .+166 ; 0x1eaf4 { // This block locks the interrupts globally for 3.25 us, // which corresponds to a maximum repeat frequency of 307.69 kHz. // This blocking is safe in the context of a 10kHz stepper driver interrupt // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz. cli(); 1ea4e: f8 94 cli // Reset the command to something, which will be ignored by the power panic routine, // so this buffer length will not be counted twice. *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED; 1ea50: d0 82 st Z, r13 // Extract the current buffer length. sdlen.lohi.lo = *ptr ++; sdlen.lohi.hi = *ptr; // and pass it to the planner queue. planner_add_sd_length(sdlen.value); 1ea52: 81 81 ldd r24, Z+1 ; 0x01 1ea54: 92 81 ldd r25, Z+2 ; 0x02 } else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){ cli(); *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED; // and one for each command to previous block in the planner queue. planner_add_sd_length(1); 1ea56: 0f 94 8d 3c call 0x2791a ; 0x2791a sei(); 1ea5a: 78 94 sei } // Now it is safe to release the already processed command block. If interrupted by the power panic now, // this block's SD card length will not be counted twice as its command type has been replaced // by CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED. cmdqueue_pop_front(); 1ea5c: 0e 94 43 79 call 0xf286 ; 0xf286 */ void host_keepalive() { #ifndef HOST_KEEPALIVE_FEATURE return; #endif //HOST_KEEPALIVE_FEATURE if (farm_mode) return; 1ea60: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1ea64: 81 11 cpse r24, r1 1ea66: 02 c0 rjmp .+4 ; 0x1ea6c 1ea68: 0e 94 c1 7c call 0xf982 ; 0xf982 } host_keepalive(); } } //check heater every n milliseconds manage_heater(); 1ea6c: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(printingIsPaused()); 1ea70: 0e 94 35 66 call 0xcc6a ; 0xcc6a 1ea74: 0e 94 34 8c call 0x11868 ; 0x11868 //=============================functions ============================ //=========================================================================== void checkHitEndstops() { if(endstop_hit) { 1ea78: 80 91 5e 04 lds r24, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> 1ea7c: 81 11 cpse r24, r1 SERIAL_ECHO(float(endstops_trigsteps[axis]) / cs.axis_steps_per_mm[axis]); } } SERIAL_ECHOLN(""); #endif //VERBOSE_CHECK_HIT_ENDSTOPS endstop_hit = 0; 1ea7e: 10 92 5e 04 sts 0x045E, r1 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> checkHitEndstops(); lcd_update(0); 1ea82: 80 e0 ldi r24, 0x00 ; 0 1ea84: 0e 94 f9 6e call 0xddf2 ; 0xddf2 void MMU2::mmu_loop() { // We only leave this method if the current command was successfully completed - that's the Marlin's way of blocking operation // Atomic compare_exchange would have been the most appropriate solution here, but this gets called only in Marlin's task, // so thread safety should be kept static bool avoidRecursion = false; if (avoidRecursion) { 1ea88: 80 91 5f 04 lds r24, 0x045F ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> 1ea8c: 81 11 cpse r24, r1 1ea8e: 07 c0 rjmp .+14 ; 0x1ea9e return; } avoidRecursion = true; 1ea90: c0 92 5f 04 sts 0x045F, r12 ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> mmu_loop_inner(true); 1ea94: 81 e0 ldi r24, 0x01 ; 1 1ea96: 0f 94 38 97 call 0x32e70 ; 0x32e70 avoidRecursion = false; 1ea9a: 10 92 5f 04 sts 0x045F, r1 ; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503> 1ea9e: e1 14 cp r14, r1 1eaa0: f1 04 cpc r15, r1 1eaa2: 09 f4 brne .+2 ; 0x1eaa6 1eaa4: 4b cf rjmp .-362 ; 0x1e93c 1eaa6: 0e 94 00 00 call 0 ; 0x0 <__vectors> 1eaaa: 48 cf rjmp .-368 ; 0x1e93c break; case dump_crash_reason::watchdog: lcd_puts_P(_n("Watchdog timeout")); break; case dump_crash_reason::bad_isr: lcd_puts_P(_n("Bad interrupt")); 1eaac: 8c ed ldi r24, 0xDC ; 220 1eaae: 98 e6 ldi r25, 0x68 ; 104 1eab0: 1c cf rjmp .-456 ; 0x1e8ea // Currently Stopped (possibly due to an error) and not accepting new serial commands. // Signal to the host that we're currently busy waiting for supervision. KEEPALIVE_STATE(PAUSED_FOR_USER); } else { // Printer is available for processing, reset state KEEPALIVE_STATE(NOT_BUSY); 1eab2: c0 92 78 02 sts 0x0278, r12 ; 0x800278 1eab6: 4b cf rjmp .-362 ; 0x1e94e } if (printingIsPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing. usb_timer.start(); } else if (usb_timer.expired(USB_TIMER_TIMEOUT)) { //just need to check if it expired. Nothing else is needed to be done. 1eab8: 60 e1 ldi r22, 0x10 ; 16 1eaba: 77 e2 ldi r23, 0x27 ; 39 1eabc: 82 e4 ldi r24, 0x42 ; 66 1eabe: 92 e1 ldi r25, 0x12 ; 18 1eac0: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1eac4: 88 23 and r24, r24 1eac6: 09 f4 brne .+2 ; 0x1eaca 1eac8: 50 cf rjmp .-352 ; 0x1e96a 1eaca: b0 92 61 0d sts 0x0D61, r11 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 1eace: 4d cf rjmp .-358 ; 0x1e96a return; } autostart_stilltocheck = false; if(!mounted) { mount(); 1ead0: 81 e0 ldi r24, 0x01 ; 1 1ead2: 0f 94 6a 73 call 0x2e6d4 ; 0x2e6d4 if(!mounted) //fail 1ead6: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 1eada: 81 11 cpse r24, r1 1eadc: 5b cf rjmp .-330 ; 0x1e994 1eade: 5c cf rjmp .-328 ; 0x1e998 if(strstr_P(CMDBUFFER_CURRENT_STRING, PSTR("M29")) == NULL) { card.write_command(CMDBUFFER_CURRENT_STRING); if(card.logging) process_commands(); else SERIAL_PROTOCOLLNRPGM(MSG_OK); 1eae0: 80 ef ldi r24, 0xF0 ; 240 1eae2: 99 e6 ldi r25, 0x69 ; 105 } else { card.closefile(); SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED); 1eae4: 0e 94 bd 7c call 0xf97a ; 0xf97a 1eae8: 9e cf rjmp .-196 ; 0x1ea26 if(card.logging) process_commands(); else SERIAL_PROTOCOLLNRPGM(MSG_OK); } else { card.closefile(); 1eaea: 0f 94 f9 65 call 0x2cbf2 ; 0x2cbf2 SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED); 1eaee: 8e ed ldi r24, 0xDE ; 222 1eaf0: 99 e6 ldi r25, 0x69 ; 105 1eaf2: f8 cf rjmp .-16 ; 0x1eae4 // and pass it to the planner queue. planner_add_sd_length(sdlen.value); sei(); } } else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){ 1eaf4: 86 30 cpi r24, 0x06 ; 6 1eaf6: 09 f0 breq .+2 ; 0x1eafa 1eaf8: b1 cf rjmp .-158 ; 0x1ea5c 1eafa: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 1eafe: 81 11 cpse r24, r1 1eb00: ad cf rjmp .-166 ; 0x1ea5c cli(); 1eb02: f8 94 cli *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED; 1eb04: d0 82 st Z, r13 // and one for each command to previous block in the planner queue. planner_add_sd_length(1); 1eb06: 81 e0 ldi r24, 0x01 ; 1 1eb08: 90 e0 ldi r25, 0x00 ; 0 1eb0a: a5 cf rjmp .-182 ; 0x1ea56 { uint8_t version_changed = 0; uint16_t printer_type = eeprom_init_default_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); uint16_t motherboard = eeprom_init_default_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); if (printer_type != PRINTER_TYPE) version_changed |= 0b10; 1eb0c: 02 e0 ldi r16, 0x02 ; 2 if (motherboard != MOTHERBOARD) version_changed |= 0b01; 1eb0e: 8b 3c cpi r24, 0xCB ; 203 1eb10: 91 05 cpc r25, r1 1eb12: 09 f0 breq .+2 ; 0x1eb16 1eb14: 03 e0 ldi r16, 0x03 ; 3 uint8_t hw_changed = check_printer_version(); if (!(hw_changed & 0b10)) { //if printer version wasn't changed, check for eeprom version and retrieve settings from eeprom in case that version wasn't changed previous_settings_retrieved = Config_RetrieveSettings(); } else { //printer version was changed so use default settings Config_ResetDefault(); 1eb16: 0e 94 ee 86 call 0x10ddc ; 0x10ddc SERIAL_ECHORPGM(_n(" PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); //lcd_update_enable(false); // why do we need this?? - andre // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) bool previous_settings_retrieved = false; 1eb1a: b1 2c mov r11, r1 void SdFatUtil::set_stack_guard() { uint32_t *stack_guard; stack_guard = (uint32_t*)(&__bss_end + STACK_GUARD_MARGIN); *stack_guard = STACK_GUARD_TEST_VALUE; 1eb1c: 82 ea ldi r24, 0xA2 ; 162 1eb1e: 92 ea ldi r25, 0xA2 ; 162 1eb20: a0 e0 ldi r26, 0x00 ; 0 1eb22: b0 e0 ldi r27, 0x00 ; 0 1eb24: 80 93 37 17 sts 0x1737, r24 ; 0x801737 <__bss_end+0x20> 1eb28: 90 93 38 17 sts 0x1738, r25 ; 0x801738 <__bss_end+0x21> 1eb2c: a0 93 39 17 sts 0x1739, r26 ; 0x801739 <__bss_end+0x22> 1eb30: b0 93 3a 17 sts 0x173A, r27 ; 0x80173a <__bss_end+0x23> // Finish init of mult extruder arrays for(int e = 0; e < EXTRUDERS; e++) { // populate with the first value maxttemp[e] = maxttemp[0]; #ifdef PIDTEMP iState_sum_min[e] = 0.0; 1eb34: 10 92 1c 04 sts 0x041C, r1 ; 0x80041c <_ZL14iState_sum_min.lto_priv.434> 1eb38: 10 92 1d 04 sts 0x041D, r1 ; 0x80041d <_ZL14iState_sum_min.lto_priv.434+0x1> 1eb3c: 10 92 1e 04 sts 0x041E, r1 ; 0x80041e <_ZL14iState_sum_min.lto_priv.434+0x2> 1eb40: 10 92 1f 04 sts 0x041F, r1 ; 0x80041f <_ZL14iState_sum_min.lto_priv.434+0x3> iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki; 1eb44: 20 91 d3 0d lds r18, 0x0DD3 ; 0x800dd3 1eb48: 30 91 d4 0d lds r19, 0x0DD4 ; 0x800dd4 1eb4c: 40 91 d5 0d lds r20, 0x0DD5 ; 0x800dd5 1eb50: 50 91 d6 0d lds r21, 0x0DD6 ; 0x800dd6 1eb54: 60 e0 ldi r22, 0x00 ; 0 1eb56: 70 e0 ldi r23, 0x00 ; 0 1eb58: 8f e7 ldi r24, 0x7F ; 127 1eb5a: 93 e4 ldi r25, 0x43 ; 67 1eb5c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1eb60: 60 93 18 04 sts 0x0418, r22 ; 0x800418 <_ZL14iState_sum_max.lto_priv.435> 1eb64: 70 93 19 04 sts 0x0419, r23 ; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1> 1eb68: 80 93 1a 04 sts 0x041A, r24 ; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2> 1eb6c: 90 93 1b 04 sts 0x041B, r25 ; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3> #endif //PIDTEMP #ifdef PIDTEMPBED temp_iState_min_bed = 0.0; 1eb70: 10 92 14 04 sts 0x0414, r1 ; 0x800414 <_ZL19temp_iState_min_bed.lto_priv.432> 1eb74: 10 92 15 04 sts 0x0415, r1 ; 0x800415 <_ZL19temp_iState_min_bed.lto_priv.432+0x1> 1eb78: 10 92 16 04 sts 0x0416, r1 ; 0x800416 <_ZL19temp_iState_min_bed.lto_priv.432+0x2> 1eb7c: 10 92 17 04 sts 0x0417, r1 ; 0x800417 <_ZL19temp_iState_min_bed.lto_priv.432+0x3> temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi; 1eb80: 20 91 df 0d lds r18, 0x0DDF ; 0x800ddf 1eb84: 30 91 e0 0d lds r19, 0x0DE0 ; 0x800de0 1eb88: 40 91 e1 0d lds r20, 0x0DE1 ; 0x800de1 1eb8c: 50 91 e2 0d lds r21, 0x0DE2 ; 0x800de2 1eb90: 60 e0 ldi r22, 0x00 ; 0 1eb92: 70 e0 ldi r23, 0x00 ; 0 1eb94: 8f e7 ldi r24, 0x7F ; 127 1eb96: 93 e4 ldi r25, 0x43 ; 67 1eb98: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1eb9c: 60 93 10 04 sts 0x0410, r22 ; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433> 1eba0: 70 93 11 04 sts 0x0411, r23 ; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1> 1eba4: 80 93 12 04 sts 0x0412, r24 ; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2> 1eba8: 90 93 13 04 sts 0x0413, r25 ; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3> #endif //PIDTEMPBED } #if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1) SET_OUTPUT(HEATER_0_PIN); 1ebac: 6d 9a sbi 0x0d, 5 ; 13 #endif #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1) SET_OUTPUT(HEATER_BED_PIN); 1ebae: 9d 9a sbi 0x13, 5 ; 19 #endif #if defined(FAN_PIN) && (FAN_PIN > -1) SET_OUTPUT(FAN_PIN); 1ebb0: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1ebb4: 88 60 ori r24, 0x08 ; 8 1ebb6: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> #ifdef FAST_PWM_FAN setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 #endif #ifdef FAN_SOFT_PWM soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS)); 1ebba: 80 91 1d 06 lds r24, 0x061D ; 0x80061d 1ebbe: 90 e0 ldi r25, 0x00 ; 0 1ebc0: 64 e0 ldi r22, 0x04 ; 4 1ebc2: 95 95 asr r25 1ebc4: 87 95 ror r24 1ebc6: 6a 95 dec r22 1ebc8: e1 f7 brne .-8 ; 0x1ebc2 1ebca: 80 93 0f 04 sts 0x040F, r24 ; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437> pinMode(MAX6675_SS, OUTPUT); digitalWrite(MAX6675_SS,1); #endif #ifdef HEATER_0_MINTEMP minttemp[0] = HEATER_0_MINTEMP; 1ebce: 8e e1 ldi r24, 0x1E ; 30 1ebd0: 90 e0 ldi r25, 0x00 ; 0 1ebd2: 90 93 0e 04 sts 0x040E, r25 ; 0x80040e <_ZL8minttemp.lto_priv.427+0x1> 1ebd6: 80 93 0d 04 sts 0x040D, r24 ; 0x80040d <_ZL8minttemp.lto_priv.427> while(analog2temp(minttemp_raw[0], 0) < HEATER_0_MINTEMP) { 1ebda: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL12minttemp_raw.lto_priv.429> 1ebde: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1> 1ebe2: 0f 94 66 8f call 0x31ecc ; 0x31ecc 1ebe6: 20 e0 ldi r18, 0x00 ; 0 1ebe8: 30 e0 ldi r19, 0x00 ; 0 1ebea: 40 ef ldi r20, 0xF0 ; 240 1ebec: 51 e4 ldi r21, 0x41 ; 65 1ebee: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1ebf2: 87 ff sbrs r24, 7 1ebf4: 6e c9 rjmp .-3364 ; 0x1ded2 #if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP minttemp_raw[0] += OVERSAMPLENR; #else minttemp_raw[0] -= OVERSAMPLENR; 1ebf6: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL12minttemp_raw.lto_priv.429> 1ebfa: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1> 1ebfe: 40 97 sbiw r24, 0x10 ; 16 1ec00: 90 93 53 02 sts 0x0253, r25 ; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1> 1ec04: 80 93 52 02 sts 0x0252, r24 ; 0x800252 <_ZL12minttemp_raw.lto_priv.429> 1ec08: e8 cf rjmp .-48 ; 0x1ebda 0001ec0a : } } void lcd_print_stop_finish(); void lcd_commands() 1ec0a: 2f 92 push r2 1ec0c: 3f 92 push r3 1ec0e: 4f 92 push r4 1ec10: 5f 92 push r5 1ec12: 6f 92 push r6 1ec14: 7f 92 push r7 1ec16: 8f 92 push r8 1ec18: 9f 92 push r9 1ec1a: af 92 push r10 1ec1c: bf 92 push r11 1ec1e: cf 92 push r12 1ec20: df 92 push r13 1ec22: ef 92 push r14 1ec24: ff 92 push r15 1ec26: 0f 93 push r16 1ec28: 1f 93 push r17 1ec2a: cf 93 push r28 1ec2c: df 93 push r29 if (planner_aborted) { // we are still within an aborted command. do not process any LCD command until we return return; } if (lcd_commands_type == LcdCommands::StopPrint) 1ec2e: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1ec32: 81 30 cpi r24, 0x01 ; 1 1ec34: 09 f0 breq .+2 ; 0x1ec38 1ec36: 61 c0 rjmp .+194 ; 0x1ecfa return(block); } // Returns true if the buffer has a queued block, false otherwise FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); 1ec38: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 1ec3c: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f { if (!blocks_queued() && !homing_flag) 1ec40: 98 13 cpse r25, r24 1ec42: 5b c0 rjmp .+182 ; 0x1ecfa 1ec44: 80 91 71 12 lds r24, 0x1271 ; 0x801271 1ec48: 81 11 cpse r24, r1 1ec4a: 57 c0 rjmp .+174 ; 0x1ecfa { custom_message_type = CustomMsg::Status; 1ec4c: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d lcd_setstatuspgm(_T(MSG_PRINT_ABORTED)); 1ec50: 8e ec ldi r24, 0xCE ; 206 1ec52: 9b e4 ldi r25, 0x4B ; 75 1ec54: 0e 94 3a 75 call 0xea74 ; 0xea74 1ec58: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_commands_type = LcdCommands::Idle; 1ec5c: 10 92 5e 0d sts 0x0D5E, r1 ; 0x800d5e 1ec60: 82 e0 ldi r24, 0x02 ; 2 1ec62: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::Idle); lcd_commands_step = 0; 1ec66: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 #endif //COMMUNITY_PREVENT_OOZE // continue stopping the print from the main loop after lcd_print_stop() is called void lcd_print_stop_finish() { print_job_timer.stop(); 1ec6a: 0f 94 49 19 call 0x23292 ; 0x23292 save_statistics(); 1ec6e: 0e 94 b0 64 call 0xc960 ; 0xc960 // lift Z raise_z(10); 1ec72: 60 e0 ldi r22, 0x00 ; 0 1ec74: 70 e0 ldi r23, 0x00 ; 0 1ec76: 80 e2 ldi r24, 0x20 ; 32 1ec78: 91 e4 ldi r25, 0x41 ; 65 1ec7a: 0e 94 94 6c call 0xd928 ; 0xd928 // if axis are homed, move to parking position. if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) { 1ec7e: 80 91 39 06 lds r24, 0x0639 ; 0x800639 1ec82: 88 23 and r24, r24 1ec84: 21 f1 breq .+72 ; 0x1ecce 1ec86: 80 91 3a 06 lds r24, 0x063A ; 0x80063a 1ec8a: 88 23 and r24, r24 1ec8c: 01 f1 breq .+64 ; 0x1ecce current_position[X_AXIS] = X_CANCEL_POS; 1ec8e: 80 e0 ldi r24, 0x00 ; 0 1ec90: 90 e0 ldi r25, 0x00 ; 0 1ec92: a8 e4 ldi r26, 0x48 ; 72 1ec94: b2 e4 ldi r27, 0x42 ; 66 1ec96: 80 93 61 12 sts 0x1261, r24 ; 0x801261 1ec9a: 90 93 62 12 sts 0x1262, r25 ; 0x801262 1ec9e: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1eca2: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = Y_CANCEL_POS; 1eca6: 80 e0 ldi r24, 0x00 ; 0 1eca8: 90 e0 ldi r25, 0x00 ; 0 1ecaa: ae e3 ldi r26, 0x3E ; 62 1ecac: b3 e4 ldi r27, 0x43 ; 67 1ecae: 80 93 65 12 sts 0x1265, r24 ; 0x801265 1ecb2: 90 93 66 12 sts 0x1266, r25 ; 0x801266 1ecb6: a0 93 67 12 sts 0x1267, r26 ; 0x801267 1ecba: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1ecbe: 60 e0 ldi r22, 0x00 ; 0 1ecc0: 70 e0 ldi r23, 0x00 ; 0 1ecc2: 84 e3 ldi r24, 0x34 ; 52 1ecc4: 92 e4 ldi r25, 0x42 ; 66 1ecc6: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 1ecca: 0f 94 fb 1a call 0x235f6 ; 0x235f6 temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; 1ecce: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> // Retract filament to prevent oozing retract_for_ooze_prevention(); #endif //COMMUNITY_PREVENT_OOZE // did we come here from a thermal error? if(get_temp_error()) { 1ecd2: 88 23 and r24, r24 1ecd4: 09 f4 brne .+2 ; 0x1ecd8 1ecd6: c8 c0 rjmp .+400 ; 0x1ee68 // time to stop the error beep WRITE(BEEPER, LOW); 1ecd8: 9f b7 in r25, 0x3f ; 63 1ecda: f8 94 cli 1ecdc: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1ece0: 8b 7f andi r24, 0xFB ; 251 1ece2: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1ece6: 9f bf out 0x3f, r25 ; 63 MMU2::mmu2.unload(); // M702 } } } lcd_cooldown(); //turns off heaters and fan; goes to status screen. 1ece8: 0f 94 1a 11 call 0x22234 ; 0x22234 finishAndDisableSteppers(); //M84 1ecec: 0e 94 55 86 call 0x10caa ; 0x10caa axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative 1ecf0: 88 e0 ldi r24, 0x08 ; 8 1ecf2: 80 93 57 12 sts 0x1257, r24 ; 0x801257 did_pause_print = false; // Clear pause state in case the print was aborted while paused 1ecf6: 10 92 cd 03 sts 0x03CD, r1 ; 0x8003cd lcd_commands_step = 0; lcd_print_stop_finish(); } } if (lcd_commands_type == LcdCommands::LongPause) 1ecfa: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1ecfe: 82 30 cpi r24, 0x02 ; 2 1ed00: 09 f0 breq .+2 ; 0x1ed04 1ed02: 6a c0 rjmp .+212 ; 0x1edd8 1ed04: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 1ed08: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f { if (!blocks_queued() && !homing_flag) 1ed0c: 98 13 cpse r25, r24 1ed0e: 64 c0 rjmp .+200 ; 0x1edd8 1ed10: 80 91 71 12 lds r24, 0x1271 ; 0x801271 1ed14: 81 11 cpse r24, r1 1ed16: 60 c0 rjmp .+192 ; 0x1edd8 { if (custom_message_type != CustomMsg::M117) 1ed18: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 1ed1c: 87 30 cpi r24, 0x07 ; 7 1ed1e: 41 f0 breq .+16 ; 0x1ed30 { custom_message_type = CustomMsg::Status; 1ed20: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); 1ed24: 8f eb ldi r24, 0xBF ; 191 1ed26: 9b e4 ldi r25, 0x4B ; 75 1ed28: 0e 94 3a 75 call 0xea74 ; 0xea74 1ed2c: 0e 94 94 de call 0x1bd28 ; 0x1bd28 } lcd_commands_type = LcdCommands::Idle; 1ed30: 10 92 5e 0d sts 0x0D5E, r1 ; 0x800d5e 1ed34: 82 e0 ldi r24, 0x02 ; 2 1ed36: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::Idle); lcd_commands_step = 0; 1ed3a: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 } #endif //PINDA_THERMISTOR void long_pause() //long pause print { st_synchronize(); 1ed3e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Stop heaters heating_status = HeatingStatus::NO_HEATING; 1ed42: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 1ed46: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1ed4a: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d setTargetHotend(0); // Lift z raise_z(pause_position[Z_AXIS]); 1ed4e: 60 91 4a 02 lds r22, 0x024A ; 0x80024a <_ZL14pause_position.lto_priv.491+0x8> 1ed52: 70 91 4b 02 lds r23, 0x024B ; 0x80024b <_ZL14pause_position.lto_priv.491+0x9> 1ed56: 80 91 4c 02 lds r24, 0x024C ; 0x80024c <_ZL14pause_position.lto_priv.491+0xa> 1ed5a: 90 91 4d 02 lds r25, 0x024D ; 0x80024d <_ZL14pause_position.lto_priv.491+0xb> 1ed5e: 0e 94 94 6c call 0xd928 ; 0xd928 // Move XY to side if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) { 1ed62: 80 91 39 06 lds r24, 0x0639 ; 0x800639 1ed66: 88 23 and r24, r24 1ed68: 51 f1 breq .+84 ; 0x1edbe 1ed6a: 80 91 3a 06 lds r24, 0x063A ; 0x80063a 1ed6e: 88 23 and r24, r24 1ed70: 31 f1 breq .+76 ; 0x1edbe current_position[X_AXIS] = pause_position[X_AXIS]; 1ed72: 80 91 42 02 lds r24, 0x0242 ; 0x800242 <_ZL14pause_position.lto_priv.491> 1ed76: 90 91 43 02 lds r25, 0x0243 ; 0x800243 <_ZL14pause_position.lto_priv.491+0x1> 1ed7a: a0 91 44 02 lds r26, 0x0244 ; 0x800244 <_ZL14pause_position.lto_priv.491+0x2> 1ed7e: b0 91 45 02 lds r27, 0x0245 ; 0x800245 <_ZL14pause_position.lto_priv.491+0x3> 1ed82: 80 93 61 12 sts 0x1261, r24 ; 0x801261 1ed86: 90 93 62 12 sts 0x1262, r25 ; 0x801262 1ed8a: a0 93 63 12 sts 0x1263, r26 ; 0x801263 1ed8e: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = pause_position[Y_AXIS]; 1ed92: 80 91 46 02 lds r24, 0x0246 ; 0x800246 <_ZL14pause_position.lto_priv.491+0x4> 1ed96: 90 91 47 02 lds r25, 0x0247 ; 0x800247 <_ZL14pause_position.lto_priv.491+0x5> 1ed9a: a0 91 48 02 lds r26, 0x0248 ; 0x800248 <_ZL14pause_position.lto_priv.491+0x6> 1ed9e: b0 91 49 02 lds r27, 0x0249 ; 0x800249 <_ZL14pause_position.lto_priv.491+0x7> 1eda2: 80 93 65 12 sts 0x1265, r24 ; 0x801265 1eda6: 90 93 66 12 sts 0x1266, r25 ; 0x801266 1edaa: a0 93 67 12 sts 0x1267, r26 ; 0x801267 1edae: b0 93 68 12 sts 0x1268, r27 ; 0x801268 plan_buffer_line_curposXYZE(50); 1edb2: 60 e0 ldi r22, 0x00 ; 0 1edb4: 70 e0 ldi r23, 0x00 ; 0 1edb6: 88 e4 ldi r24, 0x48 ; 72 1edb8: 92 e4 ldi r25, 0x42 ; 66 1edba: 0f 94 81 4c call 0x29902 ; 0x29902 1edbe: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> } // did we come here from a thermal error? if(get_temp_error()) { 1edc2: 88 23 and r24, r24 1edc4: 09 f4 brne .+2 ; 0x1edc8 1edc6: 7a c0 rjmp .+244 ; 0x1eebc // time to stop the error beep WRITE(BEEPER, LOW); 1edc8: 9f b7 in r25, 0x3f ; 63 1edca: f8 94 cli 1edcc: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1edd0: 8b 7f andi r24, 0xFB ; 251 1edd2: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1edd6: 9f bf out 0x3f, r25 ; 63 long_pause(); } } if (lcd_commands_type == LcdCommands::Layer1Cal) 1edd8: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1eddc: 84 30 cpi r24, 0x04 ; 4 1edde: 09 f0 breq .+2 ; 0x1ede2 1ede0: a7 c0 rjmp .+334 ; 0x1ef30 { const uint16_t nozzle_dia = eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM); 1ede2: 85 ea ldi r24, 0xA5 ; 165 1ede4: 9d e0 ldi r25, 0x0D ; 13 1ede6: 0f 94 ee a3 call 0x347dc ; 0x347dc 1edea: 30 91 3e 0d lds r19, 0x0D3E ; 0x800d3e 1edee: 20 91 3f 0d lds r18, 0x0D3F ; 0x800d3f const float extrusion_width = (nozzle_dia + 20)/1000.0f; const float layer_height = 0.2f; if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) 1edf2: 32 13 cpse r19, r18 1edf4: 74 c1 rjmp .+744 ; 0x1f0de 1edf6: 20 91 3c 12 lds r18, 0x123C ; 0x80123c 1edfa: 30 91 3d 12 lds r19, 0x123D ; 0x80123d 1edfe: 23 2b or r18, r19 1ee00: 09 f0 breq .+2 ; 0x1ee04 1ee02: 6d c1 rjmp .+730 ; 0x1f0de 1ee04: c0 91 73 12 lds r28, 0x1273 ; 0x801273 1ee08: c1 11 cpse r28, r1 1ee0a: 69 c1 rjmp .+722 ; 0x1f0de { if (lcd_commands_step == 0) 1ee0c: 20 91 e2 03 lds r18, 0x03E2 ; 0x8003e2 1ee10: 21 11 cpse r18, r1 1ee12: 57 c0 rjmp .+174 ; 0x1eec2 lcd_commands_step = 12; 1ee14: 2c e0 ldi r18, 0x0C ; 12 else lcd_commands_step--; 1ee16: 20 93 e2 03 sts 0x03E2, r18 ; 0x8003e2 } if (lcd_commands_type == LcdCommands::Layer1Cal) { const uint16_t nozzle_dia = eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM); const float extrusion_width = (nozzle_dia + 20)/1000.0f; 1ee1a: 44 96 adiw r24, 0x14 ; 20 1ee1c: bc 01 movw r22, r24 1ee1e: 90 e0 ldi r25, 0x00 ; 0 1ee20: 80 e0 ldi r24, 0x00 ; 0 1ee22: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 1ee26: 20 e0 ldi r18, 0x00 ; 0 1ee28: 30 e0 ldi r19, 0x00 ; 0 1ee2a: 4a e7 ldi r20, 0x7A ; 122 1ee2c: 54 e4 ldi r21, 0x44 ; 68 1ee2e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1ee32: 4b 01 movw r8, r22 1ee34: 5c 01 movw r10, r24 if (lcd_commands_step == 0) lcd_commands_step = 12; else lcd_commands_step--; switch(lcd_commands_step) 1ee36: e0 91 e2 03 lds r30, 0x03E2 ; 0x8003e2 1ee3a: e1 50 subi r30, 0x01 ; 1 1ee3c: ec 30 cpi r30, 0x0C ; 12 1ee3e: 08 f0 brcs .+2 ; 0x1ee42 1ee40: 77 c0 rjmp .+238 ; 0x1ef30 1ee42: f0 e0 ldi r31, 0x00 ; 0 1ee44: 88 27 eor r24, r24 1ee46: e8 5d subi r30, 0xD8 ; 216 1ee48: f8 40 sbci r31, 0x08 ; 8 1ee4a: 8f 4f sbci r24, 0xFF ; 255 1ee4c: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 1ee50: 6a fa .word 0xfa6a ; ???? 1ee52: 66 fa bst r6, 6 1ee54: fc f9 .word 0xf9fc ; ???? 1ee56: fc f9 .word 0xf9fc ; ???? 1ee58: fc f9 .word 0xf9fc ; ???? 1ee5a: fc f9 .word 0xf9fc ; ???? 1ee5c: a5 f9 bld r26, 5 1ee5e: 14 f9 bld r17, 4 1ee60: 10 f9 bld r17, 0 1ee62: a3 f8 bld r10, 3 1ee64: 69 f7 brne .-38 ; 0x1ee40 1ee66: 63 f7 brvc .-40 ; 0x1ee40 if(get_temp_error()) { // time to stop the error beep WRITE(BEEPER, LOW); } else { // Turn off the print fan fanSpeed = 0; 1ee68: 10 92 55 12 sts 0x1255, r1 ; 0x801255 { #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) #ifdef EXTRUDER_ALTFAN_DETECT altfanStatus.altfanOverride = eeprom_read_byte((uint8_t*)EEPROM_ALTFAN_OVERRIDE); #endif resetFanCheck(); 1ee6c: 0e 94 a2 77 call 0xef44 ; 0xef44 setExtruderAutoFanState(1); 1ee70: 81 e0 ldi r24, 0x01 ; 1 1ee72: 0e 94 af 77 call 0xef5e ; 0xef5e // restore the auto hotend state hotendDefaultAutoFanState(); if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament() #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 1ee76: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1ee7a: 81 30 cpi r24, 0x01 ; 1 1ee7c: 09 f0 breq .+2 ; 0x1ee80 1ee7e: 34 cf rjmp .-408 ; 0x1ece8 fanSpeed = 0; // restore the auto hotend state hotendDefaultAutoFanState(); if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament() 1ee80: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 1ee84: 88 23 and r24, r24 1ee86: 09 f4 brne .+2 ; 0x1ee8a 1ee88: 2f cf rjmp .-418 ; 0x1ece8 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 1ee8a: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 1ee8e: 82 30 cpi r24, 0x02 ; 2 1ee90: 09 f4 brne .+2 ; 0x1ee94 1ee92: 2a cf rjmp .-428 ; 0x1ece8 #endif //FANCHECK ) { // The print was aborted while when the nozzle was cold: // 1. in a paused state => a partial backup in RAM is always available // 2. after a recoverable thermal/fan error had paused the print => only extruder temperature is saved to RAM if (printingIsPaused()) 1ee94: 0e 94 35 66 call 0xcc6a ; 0xcc6a 1ee98: 81 11 cpse r24, r1 { // Restore temperature saved in ram after pausing print restore_extruder_temperature_from_ram(); 1ee9a: 0e 94 23 64 call 0xc846 ; 0xc846 } // If the pause state was cleared previously or the target temperature is 0°C in the case // of an unconditional stop. In that scenario we do not want to unload. if (target_temperature[0] >= extrude_min_temp) { 1ee9e: 20 91 5d 12 lds r18, 0x125D ; 0x80125d 1eea2: 30 91 5e 12 lds r19, 0x125E ; 0x80125e 1eea6: 80 91 57 02 lds r24, 0x0257 ; 0x800257 1eeaa: 90 91 58 02 lds r25, 0x0258 ; 0x800258 1eeae: 28 17 cp r18, r24 1eeb0: 39 07 cpc r19, r25 1eeb2: 0c f4 brge .+2 ; 0x1eeb6 1eeb4: 19 cf rjmp .-462 ; 0x1ece8 MMU2::mmu2.unload(); // M702 1eeb6: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 1eeba: 16 cf rjmp .-468 ; 0x1ece8 } else { // Turn off the print fan fanSpeed = 0; 1eebc: 10 92 55 12 sts 0x1255, r1 ; 0x801255 1eec0: 8b cf rjmp .-234 ; 0x1edd8 if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) { if (lcd_commands_step == 0) lcd_commands_step = 12; else lcd_commands_step--; 1eec2: 21 50 subi r18, 0x01 ; 1 1eec4: a8 cf rjmp .-176 ; 0x1ee16 preheat_cmd_3, preheat_cmd_4, zero_extrusion }; lay1cal_common_enqueue_loop(preheat_cmd, sizeof(preheat_cmd)/sizeof(preheat_cmd[0])); 1eec6: 65 e0 ldi r22, 0x05 ; 5 1eec8: 8c e9 ldi r24, 0x9C ; 156 1eeca: 94 e8 ldi r25, 0x84 ; 132 MSG_M702, // Unload filament (MMU only) cmd_cal_finish_8, // Turn off hotend heater MSG_M84 // Disable stepper motors }; lay1cal_common_enqueue_loop(cmd_cal_finish, (sizeof(cmd_cal_finish)/sizeof(cmd_cal_finish[0]))); 1eecc: 0e 94 98 8f call 0x11f30 ; 0x11f30 1eed0: 2f c0 rjmp .+94 ; 0x1ef30 //! @param cmd_buffer character buffer needed to format gcodes //! @param filament filament to use (applies for MMU only) //! @returns true if extra purge distance is needed in case of MMU prints (after a toolchange), otherwise false bool lay1cal_load_filament(uint8_t filament) { if (MMU2::mmu2.Enabled()) 1eed2: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1eed6: 81 30 cpi r24, 0x01 ; 1 1eed8: 49 f5 brne .+82 ; 0x1ef2c { case 12: lay1cal_wait_preheat(); break; case 11: extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament); 1eeda: d0 91 e1 03 lds r29, 0x03E1 ; 0x8003e1 { enquecommand_P(MSG_M83); 1eede: 61 e0 ldi r22, 0x01 ; 1 1eee0: 83 eb ldi r24, 0xB3 ; 179 1eee2: 9c e6 ldi r25, 0x6C ; 108 1eee4: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommand_P(PSTR("G1Y-3F1000")); 1eee8: 61 e0 ldi r22, 0x01 ; 1 1eeea: 81 e9 ldi r24, 0x91 ; 145 1eeec: 94 e8 ldi r25, 0x84 ; 132 1eeee: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommand_P(PSTR("G1Z0.4")); 1eef2: 61 e0 ldi r22, 0x01 ; 1 1eef4: 8a e8 ldi r24, 0x8A ; 138 1eef6: 94 e8 ldi r25, 0x84 ; 132 1eef8: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 uint8_t currentTool = MMU2::mmu2.get_current_tool(); 1eefc: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e if(currentTool == filament ){ 1ef00: d8 17 cp r29, r24 1ef02: a1 f0 breq .+40 ; 0x1ef2c // already have the correct tool loaded - do nothing return false; } else if( currentTool != (uint8_t)MMU2::FILAMENT_UNKNOWN){ 1ef04: 8f 3f cpi r24, 0xFF ; 255 1ef06: 29 f0 breq .+10 ; 0x1ef12 // some other slot is loaded, perform an unload first enquecommand_P(MSG_M702); 1ef08: 61 e0 ldi r22, 0x01 ; 1 1ef0a: 8c ec ldi r24, 0xCC ; 204 1ef0c: 98 e6 ldi r25, 0x68 ; 104 1ef0e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 } // perform a toolchange enquecommandf_P(PSTR("T%d"), filament); 1ef12: 1f 92 push r1 1ef14: df 93 push r29 1ef16: 86 e8 ldi r24, 0x86 ; 134 1ef18: 94 e8 ldi r25, 0x84 ; 132 1ef1a: 9f 93 push r25 1ef1c: 8f 93 push r24 1ef1e: 0e 94 b7 8f call 0x11f6e ; 0x11f6e 1ef22: 0f 90 pop r0 1ef24: 0f 90 pop r0 1ef26: 0f 90 pop r0 1ef28: 0f 90 pop r0 return true; 1ef2a: c1 e0 ldi r28, 0x01 ; 1 1ef2c: c0 93 e0 03 sts 0x03E0, r28 ; 0x8003e0 break; } } } if (lcd_commands_type == LcdCommands::PidExtruder) { 1ef30: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1ef34: 83 30 cpi r24, 0x03 ; 3 1ef36: 09 f0 breq .+2 ; 0x1ef3a 1ef38: d2 c0 rjmp .+420 ; 0x1f0de if (lcd_commands_step == 0) { 1ef3a: 90 91 e2 03 lds r25, 0x03E2 ; 0x8003e2 1ef3e: 91 11 cpse r25, r1 1ef40: 09 c0 rjmp .+18 ; 0x1ef54 custom_message_type = CustomMsg::PidCal; 1ef42: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d custom_message_state = 1; 1ef46: 91 e0 ldi r25, 0x01 ; 1 1ef48: 90 93 de 03 sts 0x03DE, r25 ; 0x8003de lcd_draw_update = 3; 1ef4c: 80 93 59 02 sts 0x0259, r24 ; 0x800259 lcd_commands_step = 3; 1ef50: 80 93 e2 03 sts 0x03E2, r24 ; 0x8003e2 } if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration 1ef54: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 1ef58: 83 30 cpi r24, 0x03 ; 3 1ef5a: 19 f5 brne .+70 ; 0x1efa2 1ef5c: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 1ef60: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 1ef64: 98 13 cpse r25, r24 1ef66: 1d c0 rjmp .+58 ; 0x1efa2 return !pid_tuning_finished; } void preparePidTuning() { // ensure heaters are disabled before we switch off PID management! disable_heater(); 1ef68: 0f 94 05 11 call 0x2220a ; 0x2220a pid_tuning_finished = false; 1ef6c: 10 92 41 02 sts 0x0241, r1 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> preparePidTuning(); // ensure we don't move to the next step early // setting the correct target temperature (for visualization) is done in PID_autotune enquecommandf_P(PSTR("M303 E0 S%3u"), pid_temp); 1ef70: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 1ef74: 8f 93 push r24 1ef76: 80 91 4e 02 lds r24, 0x024E ; 0x80024e 1ef7a: 8f 93 push r24 1ef7c: 81 e1 ldi r24, 0x11 ; 17 1ef7e: 95 e8 ldi r25, 0x85 ; 133 1ef80: 9f 93 push r25 1ef82: 8f 93 push r24 1ef84: 0e 94 b7 8f call 0x11f6e ; 0x11f6e lcd_setstatuspgm(_T(MSG_PID_RUNNING)); 1ef88: 84 eb ldi r24, 0xB4 ; 180 1ef8a: 9b e4 ldi r25, 0x4B ; 75 1ef8c: 0e 94 3a 75 call 0xea74 ; 0xea74 1ef90: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_commands_step = 2; 1ef94: 82 e0 ldi r24, 0x02 ; 2 1ef96: 80 93 e2 03 sts 0x03E2, r24 ; 0x8003e2 1ef9a: 0f 90 pop r0 1ef9c: 0f 90 pop r0 1ef9e: 0f 90 pop r0 1efa0: 0f 90 pop r0 } if (lcd_commands_step == 2 && !pidTuningRunning()) { //saving to eeprom 1efa2: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 1efa6: 82 30 cpi r24, 0x02 ; 2 1efa8: 09 f0 breq .+2 ; 0x1efac 1efaa: 7a c0 rjmp .+244 ; 0x1f0a0 1efac: 80 91 41 02 lds r24, 0x0241 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> 1efb0: 88 23 and r24, r24 1efb2: 09 f4 brne .+2 ; 0x1efb6 1efb4: 75 c0 rjmp .+234 ; 0x1f0a0 custom_message_state = 0; 1efb6: 10 92 de 03 sts 0x03DE, r1 ; 0x8003de lcd_setstatuspgm(_T(MSG_PID_FINISHED)); 1efba: 80 ea ldi r24, 0xA0 ; 160 1efbc: 9b e4 ldi r25, 0x4B ; 75 1efbe: 0e 94 3a 75 call 0xea74 ; 0xea74 1efc2: 0e 94 94 de call 0x1bd28 ; 0x1bd28 1efc6: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1efca: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d setTargetHotend(0); if (_Kp != 0 || _Ki != 0 || _Kd != 0) { 1efce: c0 91 da 03 lds r28, 0x03DA ; 0x8003da <_Kp> 1efd2: d0 91 db 03 lds r29, 0x03DB ; 0x8003db <_Kp+0x1> 1efd6: 10 91 dc 03 lds r17, 0x03DC ; 0x8003dc <_Kp+0x2> 1efda: 00 91 dd 03 lds r16, 0x03DD ; 0x8003dd <_Kp+0x3> 1efde: 20 e0 ldi r18, 0x00 ; 0 1efe0: 30 e0 ldi r19, 0x00 ; 0 1efe2: a9 01 movw r20, r18 1efe4: f8 01 movw r30, r16 1efe6: 6c 2f mov r22, r28 1efe8: 7d 2f mov r23, r29 1efea: 8f 2f mov r24, r31 1efec: 9e 2f mov r25, r30 1efee: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1eff2: 81 11 cpse r24, r1 1eff4: 1f c0 rjmp .+62 ; 0x1f034 1eff6: 20 e0 ldi r18, 0x00 ; 0 1eff8: 30 e0 ldi r19, 0x00 ; 0 1effa: a9 01 movw r20, r18 1effc: 60 91 d6 03 lds r22, 0x03D6 ; 0x8003d6 <_Ki> 1f000: 70 91 d7 03 lds r23, 0x03D7 ; 0x8003d7 <_Ki+0x1> 1f004: 80 91 d8 03 lds r24, 0x03D8 ; 0x8003d8 <_Ki+0x2> 1f008: 90 91 d9 03 lds r25, 0x03D9 ; 0x8003d9 <_Ki+0x3> 1f00c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1f010: 81 11 cpse r24, r1 1f012: 10 c0 rjmp .+32 ; 0x1f034 1f014: 20 e0 ldi r18, 0x00 ; 0 1f016: 30 e0 ldi r19, 0x00 ; 0 1f018: a9 01 movw r20, r18 1f01a: 60 91 d2 03 lds r22, 0x03D2 ; 0x8003d2 <_Kd> 1f01e: 70 91 d3 03 lds r23, 0x03D3 ; 0x8003d3 <_Kd+0x1> 1f022: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 <_Kd+0x2> 1f026: 90 91 d5 03 lds r25, 0x03D5 ; 0x8003d5 <_Kd+0x3> 1f02a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 1f02e: 88 23 and r24, r24 1f030: 09 f4 brne .+2 ; 0x1f034 1f032: 66 c2 rjmp .+1228 ; 0x1f500 enquecommandf_P(PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd); 1f034: 80 91 d5 03 lds r24, 0x03D5 ; 0x8003d5 <_Kd+0x3> 1f038: 8f 93 push r24 1f03a: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 <_Kd+0x2> 1f03e: 8f 93 push r24 1f040: 80 91 d3 03 lds r24, 0x03D3 ; 0x8003d3 <_Kd+0x1> 1f044: 8f 93 push r24 1f046: 80 91 d2 03 lds r24, 0x03D2 ; 0x8003d2 <_Kd> 1f04a: 8f 93 push r24 1f04c: 80 91 d9 03 lds r24, 0x03D9 ; 0x8003d9 <_Ki+0x3> 1f050: 8f 93 push r24 1f052: 80 91 d8 03 lds r24, 0x03D8 ; 0x8003d8 <_Ki+0x2> 1f056: 8f 93 push r24 1f058: 80 91 d7 03 lds r24, 0x03D7 ; 0x8003d7 <_Ki+0x1> 1f05c: 8f 93 push r24 1f05e: 80 91 d6 03 lds r24, 0x03D6 ; 0x8003d6 <_Ki> 1f062: 8f 93 push r24 1f064: 0f 93 push r16 1f066: 1f 93 push r17 1f068: df 93 push r29 1f06a: cf 93 push r28 1f06c: 8a ef ldi r24, 0xFA ; 250 1f06e: 94 e8 ldi r25, 0x84 ; 132 1f070: 9f 93 push r25 1f072: 8f 93 push r24 1f074: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommand_P(MSG_M500); 1f078: 61 e0 ldi r22, 0x01 ; 1 1f07a: 87 ed ldi r24, 0xD7 ; 215 1f07c: 98 e6 ldi r25, 0x68 ; 104 1f07e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 1f082: 8d b7 in r24, 0x3d ; 61 1f084: 9e b7 in r25, 0x3e ; 62 1f086: 0e 96 adiw r24, 0x0e ; 14 1f088: 0f b6 in r0, 0x3f ; 63 1f08a: f8 94 cli 1f08c: 9e bf out 0x3e, r25 ; 62 1f08e: 0f be out 0x3f, r0 ; 63 1f090: 8d bf out 0x3d, r24 ; 61 } else { SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM."); } display_time.start(); 1f092: 8f ec ldi r24, 0xCF ; 207 1f094: 93 e0 ldi r25, 0x03 ; 3 1f096: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> lcd_commands_step = 1; 1f09a: 81 e0 ldi r24, 0x01 ; 1 1f09c: 80 93 e2 03 sts 0x03E2, r24 ; 0x8003e2 } if ((lcd_commands_step == 1) && display_time.expired(2000)) { //calibration finished message 1f0a0: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 1f0a4: 81 30 cpi r24, 0x01 ; 1 1f0a6: d9 f4 brne .+54 ; 0x1f0de 1f0a8: 60 ed ldi r22, 0xD0 ; 208 1f0aa: 77 e0 ldi r23, 0x07 ; 7 1f0ac: 8f ec ldi r24, 0xCF ; 207 1f0ae: 93 e0 ldi r25, 0x03 ; 3 1f0b0: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1f0b4: 88 23 and r24, r24 1f0b6: 99 f0 breq .+38 ; 0x1f0de lcd_setstatuspgm(MSG_WELCOME); 1f0b8: 86 ee ldi r24, 0xE6 ; 230 1f0ba: 9b e6 ldi r25, 0x6B ; 107 1f0bc: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = CustomMsg::Status; 1f0c0: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d pid_temp = DEFAULT_PID_TEMP; 1f0c4: 82 ed ldi r24, 0xD2 ; 210 1f0c6: 90 e0 ldi r25, 0x00 ; 0 1f0c8: 90 93 4f 02 sts 0x024F, r25 ; 0x80024f 1f0cc: 80 93 4e 02 sts 0x024E, r24 ; 0x80024e lcd_commands_step = 0; 1f0d0: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 lcd_commands_type = LcdCommands::Idle; 1f0d4: 10 92 5e 0d sts 0x0D5E, r1 ; 0x800d5e 1f0d8: 82 e0 ldi r24, 0x02 ; 2 1f0da: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> break; } } #endif //THERMAL_MODEL if (lcd_commands_type == LcdCommands::NozzleCNG) 1f0de: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1f0e2: 85 30 cpi r24, 0x05 ; 5 1f0e4: e9 f4 brne .+58 ; 0x1f120 1f0e6: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 1f0ea: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f { if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) 1f0ee: 98 13 cpse r25, r24 1f0f0: 17 c0 rjmp .+46 ; 0x1f120 1f0f2: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 1f0f6: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 1f0fa: 89 2b or r24, r25 1f0fc: 89 f4 brne .+34 ; 0x1f120 1f0fe: 80 91 73 12 lds r24, 0x1273 ; 0x801273 1f102: 81 11 cpse r24, r1 1f104: 0d c0 rjmp .+26 ; 0x1f120 #ifndef QUICK_NOZZLE_CHANGE //thermal model can be ignored if a quickchange nozzle is in use, no heatup necessary #ifdef THERMAL_MODEL static bool was_enabled; #endif //THERMAL_MODEL #endif //QUICK_NOZZLE_CHANGE switch(lcd_commands_step) 1f106: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 1f10a: 81 30 cpi r24, 0x01 ; 1 1f10c: 09 f4 brne .+2 ; 0x1f110 1f10e: 2d c2 rjmp .+1114 ; 0x1f56a 1f110: 08 f4 brcc .+2 ; 0x1f114 1f112: fb c1 rjmp .+1014 ; 0x1f50a 1f114: 82 30 cpi r24, 0x02 ; 2 1f116: 09 f4 brne .+2 ; 0x1f11a 1f118: 13 c2 rjmp .+1062 ; 0x1f540 1f11a: 83 30 cpi r24, 0x03 ; 3 1f11c: 09 f4 brne .+2 ; 0x1f120 1f11e: f9 c1 rjmp .+1010 ; 0x1f512 menu_depth = 3; break; } } } } 1f120: df 91 pop r29 1f122: cf 91 pop r28 1f124: 1f 91 pop r17 1f126: 0f 91 pop r16 1f128: ff 90 pop r15 1f12a: ef 90 pop r14 1f12c: df 90 pop r13 1f12e: cf 90 pop r12 1f130: bf 90 pop r11 1f132: af 90 pop r10 1f134: 9f 90 pop r9 1f136: 8f 90 pop r8 1f138: 7f 90 pop r7 1f13a: 6f 90 pop r6 1f13c: 5f 90 pop r5 1f13e: 4f 90 pop r4 1f140: 3f 90 pop r3 1f142: 2f 90 pop r2 1f144: 08 95 ret break; case 11: extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament); break; case 10: lcd_clear(); 1f146: 0e 94 26 70 call 0xe04c ; 0xe04c menu_depth = 0; 1f14a: 10 92 df 03 sts 0x03DF, r1 ; 0x8003df menu_submenu(lcd_babystep_z, true); 1f14e: 61 e0 ldi r22, 0x01 ; 1 1f150: 88 e6 ldi r24, 0x68 ; 104 1f152: 97 ed ldi r25, 0xD7 ; 215 1f154: 0e 94 dd 62 call 0xc5ba ; 0xc5ba cmd_intro_mmu_9, cmd_intro_mmu_10, cmd_intro_mmu_11, }; if (MMU2::mmu2.Enabled()) 1f158: 80 91 01 13 lds r24, 0x1301 ; 0x801301 1f15c: 81 30 cpi r24, 0x01 ; 1 1f15e: b9 f4 brne .+46 ; 0x1f18e { for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i) 1f160: 80 91 e0 03 lds r24, 0x03E0 ; 0x8003e0 1f164: 10 e0 ldi r17, 0x00 ; 0 1f166: 81 11 cpse r24, r1 1f168: 01 c0 rjmp .+2 ; 0x1f16c 1f16a: 12 e0 ldi r17, 0x02 ; 2 1f16c: c1 2f mov r28, r17 1f16e: d0 e0 ldi r29, 0x00 ; 0 1f170: cc 0f add r28, r28 1f172: dd 1f adc r29, r29 1f174: cc 58 subi r28, 0x8C ; 140 1f176: db 47 sbci r29, 0x7B ; 123 { enquecommand_P(static_cast(pgm_read_ptr(&cmd_intro_mmu[i]))); 1f178: fe 01 movw r30, r28 1f17a: 85 91 lpm r24, Z+ 1f17c: 94 91 lpm r25, Z 1f17e: 61 e0 ldi r22, 0x01 ; 1 1f180: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 cmd_intro_mmu_11, }; if (MMU2::mmu2.Enabled()) { for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i) 1f184: 1f 5f subi r17, 0xFF ; 255 1f186: 22 96 adiw r28, 0x02 ; 2 1f188: 19 30 cpi r17, 0x09 ; 9 1f18a: b1 f7 brne .-20 ; 0x1f178 1f18c: d1 ce rjmp .-606 ; 0x1ef30 enquecommand_P(static_cast(pgm_read_ptr(&cmd_intro_mmu[i]))); } } else { enquecommand_P(feedrate_F1080); //fixed velocity for the intro line 1f18e: 61 e0 ldi r22, 0x01 ; 1 1f190: 8c e6 ldi r24, 0x6C ; 108 1f192: 94 e8 ldi r25, 0x84 ; 132 1f194: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommandf_P(extrude_fmt_X, 60.f, count_e(layer_height, extrusion_width * 4.f, 60)); 1f198: 20 e0 ldi r18, 0x00 ; 0 1f19a: 30 e0 ldi r19, 0x00 ; 0 1f19c: 40 e8 ldi r20, 0x80 ; 128 1f19e: 50 e4 ldi r21, 0x40 ; 64 1f1a0: c5 01 movw r24, r10 1f1a2: b4 01 movw r22, r8 1f1a4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1f1a8: 20 e0 ldi r18, 0x00 ; 0 1f1aa: 30 e0 ldi r19, 0x00 ; 0 1f1ac: 40 e7 ldi r20, 0x70 ; 112 1f1ae: 52 e4 ldi r21, 0x42 ; 66 1f1b0: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f1b4: 9f 93 push r25 1f1b6: 8f 93 push r24 1f1b8: 7f 93 push r23 1f1ba: 6f 93 push r22 1f1bc: 82 e4 ldi r24, 0x42 ; 66 1f1be: 8f 93 push r24 1f1c0: 80 e7 ldi r24, 0x70 ; 112 1f1c2: 8f 93 push r24 1f1c4: 1f 92 push r1 1f1c6: 1f 92 push r1 1f1c8: cf e5 ldi r28, 0x5F ; 95 1f1ca: d4 e8 ldi r29, 0x84 ; 132 1f1cc: df 93 push r29 1f1ce: cf 93 push r28 1f1d0: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_X, 202.5f, count_e(layer_height, extrusion_width * 8.f, 142.5)); 1f1d4: 20 e0 ldi r18, 0x00 ; 0 1f1d6: 30 e0 ldi r19, 0x00 ; 0 1f1d8: 40 e0 ldi r20, 0x00 ; 0 1f1da: 51 e4 ldi r21, 0x41 ; 65 1f1dc: c5 01 movw r24, r10 1f1de: b4 01 movw r22, r8 1f1e0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1f1e4: 20 e0 ldi r18, 0x00 ; 0 1f1e6: 30 e8 ldi r19, 0x80 ; 128 1f1e8: 4e e0 ldi r20, 0x0E ; 14 1f1ea: 53 e4 ldi r21, 0x43 ; 67 1f1ec: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f1f0: 9f 93 push r25 1f1f2: 8f 93 push r24 1f1f4: 7f 93 push r23 1f1f6: 6f 93 push r22 1f1f8: 83 e4 ldi r24, 0x43 ; 67 1f1fa: 8f 93 push r24 1f1fc: 8a e4 ldi r24, 0x4A ; 74 1f1fe: 8f 93 push r24 1f200: 80 e8 ldi r24, 0x80 ; 128 1f202: 8f 93 push r24 1f204: 1f 92 push r1 1f206: df 93 push r29 1f208: cf 93 push r28 1f20a: 0e 94 b7 8f call 0x11f6e ; 0x11f6e 1f20e: 8d b7 in r24, 0x3d ; 61 1f210: 9e b7 in r25, 0x3e ; 62 1f212: 44 96 adiw r24, 0x14 ; 20 1f214: 0f b6 in r0, 0x3f ; 63 1f216: f8 94 cli 1f218: 9e bf out 0x3e, r25 ; 62 1f21a: 0f be out 0x3f, r0 ; 63 1f21c: 8d bf out 0x3d, r24 ; 61 1f21e: 88 ce rjmp .-752 ; 0x1ef30 cmd_pre_meander_5, #endif //NEW_FIRST_LAYER_CAL cmd_pre_meander_6, }; lay1cal_common_enqueue_loop(cmd_pre_meander, (sizeof(cmd_pre_meander)/sizeof(cmd_pre_meander[0]))); 1f220: 66 e0 ldi r22, 0x06 ; 6 1f222: 83 e5 ldi r24, 0x53 ; 83 1f224: 94 e8 ldi r25, 0x84 ; 132 1f226: 52 ce rjmp .-860 ; 0x1eecc //! @brief Print meander start void lay1cal_meander_start(float layer_height, float extrusion_width) { #ifndef NEW_FIRST_LAYER_CAL enquecommand_P(PSTR("G1X50Y155")); 1f228: 61 e0 ldi r22, 0x01 ; 1 1f22a: 89 e4 ldi r24, 0x49 ; 73 1f22c: 94 e8 ldi r25, 0x84 ; 132 1f22e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 #endif //_NEW_FIRST_LAYER_CAL static const char fmt1[] PROGMEM = "G1Z%.2f"; enquecommandf_P(fmt1, layer_height); 1f232: 8e e3 ldi r24, 0x3E ; 62 1f234: 8f 93 push r24 1f236: 8c e4 ldi r24, 0x4C ; 76 1f238: 8f 93 push r24 1f23a: 8c ec ldi r24, 0xCC ; 204 1f23c: 8f 93 push r24 1f23e: 8d ec ldi r24, 0xCD ; 205 1f240: 8f 93 push r24 1f242: 81 e4 ldi r24, 0x41 ; 65 1f244: 94 e8 ldi r25, 0x84 ; 132 1f246: 9f 93 push r25 1f248: 8f 93 push r24 1f24a: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommand_P(feedrate_F1080); 1f24e: 61 e0 ldi r22, 0x01 ; 1 1f250: 8c e6 ldi r24, 0x6C ; 108 1f252: 94 e8 ldi r25, 0x84 ; 132 1f254: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommand_P(MSG_G91); //enable relative XYZ 1f258: 61 e0 ldi r22, 0x01 ; 1 1f25a: 88 ec ldi r24, 0xC8 ; 200 1f25c: 98 e6 ldi r25, 0x68 ; 104 1f25e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 #ifdef NEW_FIRST_LAYER_CAL enquecommandf_P(extrude_fmt_Y, short_length, count_e(layer_height, extrusion_width, short_length)); enquecommandf_P(extrude_fmt_X, long_length*invert, count_e(layer_height, extrusion_width, long_length)); enquecommandf_P(extrude_fmt_Y, -short_length*invert, count_e(layer_height, extrusion_width, short_length)); #else enquecommandf_P(extrude_fmt_X, 25.f*invert, count_e(layer_height, extrusion_width * 4.f, 25)); 1f262: 20 e0 ldi r18, 0x00 ; 0 1f264: 30 e0 ldi r19, 0x00 ; 0 1f266: 40 e8 ldi r20, 0x80 ; 128 1f268: 50 e4 ldi r21, 0x40 ; 64 1f26a: c5 01 movw r24, r10 1f26c: b4 01 movw r22, r8 1f26e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1f272: 20 e0 ldi r18, 0x00 ; 0 1f274: 30 e0 ldi r19, 0x00 ; 0 1f276: 48 ec ldi r20, 0xC8 ; 200 1f278: 51 e4 ldi r21, 0x41 ; 65 1f27a: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f27e: 9f 93 push r25 1f280: 8f 93 push r24 1f282: 7f 93 push r23 1f284: 6f 93 push r22 1f286: 01 e4 ldi r16, 0x41 ; 65 1f288: 0f 93 push r16 1f28a: 18 ec ldi r17, 0xC8 ; 200 1f28c: 1f 93 push r17 1f28e: 1f 92 push r1 1f290: 1f 92 push r1 1f292: cf e5 ldi r28, 0x5F ; 95 1f294: d4 e8 ldi r29, 0x84 ; 132 1f296: df 93 push r29 1f298: cf 93 push r28 1f29a: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_X, 25.f*invert, count_e(layer_height, extrusion_width * 2.f, 25)); 1f29e: a5 01 movw r20, r10 1f2a0: 94 01 movw r18, r8 1f2a2: c5 01 movw r24, r10 1f2a4: b4 01 movw r22, r8 1f2a6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1f2aa: 20 e0 ldi r18, 0x00 ; 0 1f2ac: 30 e0 ldi r19, 0x00 ; 0 1f2ae: 48 ec ldi r20, 0xC8 ; 200 1f2b0: 51 e4 ldi r21, 0x41 ; 65 1f2b2: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f2b6: 9f 93 push r25 1f2b8: 8f 93 push r24 1f2ba: 7f 93 push r23 1f2bc: 6f 93 push r22 1f2be: 0f 93 push r16 1f2c0: 1f 93 push r17 1f2c2: 1f 92 push r1 1f2c4: 1f 92 push r1 1f2c6: df 93 push r29 1f2c8: cf 93 push r28 1f2ca: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_X, 100.f*invert, count_e(layer_height, extrusion_width, 100)); 1f2ce: 20 e0 ldi r18, 0x00 ; 0 1f2d0: 30 e0 ldi r19, 0x00 ; 0 1f2d2: 48 ec ldi r20, 0xC8 ; 200 1f2d4: 52 e4 ldi r21, 0x42 ; 66 1f2d6: c5 01 movw r24, r10 1f2d8: b4 01 movw r22, r8 1f2da: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f2de: 9f 93 push r25 1f2e0: 8f 93 push r24 1f2e2: 7f 93 push r23 1f2e4: 6f 93 push r22 1f2e6: 82 e4 ldi r24, 0x42 ; 66 1f2e8: 8f 93 push r24 1f2ea: 1f 93 push r17 1f2ec: 1f 92 push r1 1f2ee: 1f 92 push r1 1f2f0: df 93 push r29 1f2f2: cf 93 push r28 1f2f4: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_Y, -20.f*invert, count_e(layer_height, extrusion_width, 20)); 1f2f8: 8d b7 in r24, 0x3d ; 61 1f2fa: 9e b7 in r25, 0x3e ; 62 1f2fc: 84 96 adiw r24, 0x24 ; 36 1f2fe: 0f b6 in r0, 0x3f ; 63 1f300: f8 94 cli 1f302: 9e bf out 0x3e, r25 ; 62 1f304: 0f be out 0x3f, r0 ; 63 1f306: 8d bf out 0x3d, r24 ; 61 1f308: 20 e0 ldi r18, 0x00 ; 0 1f30a: 30 e0 ldi r19, 0x00 ; 0 1f30c: 40 ea ldi r20, 0xA0 ; 160 1f30e: 51 e4 ldi r21, 0x41 ; 65 1f310: c5 01 movw r24, r10 1f312: b4 01 movw r22, r8 1f314: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f318: 9f 93 push r25 1f31a: 8f 93 push r24 1f31c: 7f 93 push r23 1f31e: 6f 93 push r22 1f320: 81 ec ldi r24, 0xC1 ; 193 1f322: 8f 93 push r24 1f324: 80 ea ldi r24, 0xA0 ; 160 1f326: 8f 93 push r24 1f328: 1f 92 push r1 1f32a: 1f 92 push r1 1f32c: 84 e3 ldi r24, 0x34 ; 52 1f32e: 94 e8 ldi r25, 0x84 ; 132 1f330: 9f 93 push r25 1f332: 8f 93 push r24 1f334: 0e 94 b7 8f call 0x11f6e ; 0x11f6e 1f338: 8d b7 in r24, 0x3d ; 61 1f33a: 9e b7 in r25, 0x3e ; 62 1f33c: 0a 96 adiw r24, 0x0a ; 10 1f33e: 0f b6 in r0, 0x3f ; 63 1f340: f8 94 cli 1f342: 9e bf out 0x3e, r25 ; 62 1f344: 0f be out 0x3f, r0 ; 63 1f346: 8d bf out 0x3d, r24 ; 61 1f348: f3 cd rjmp .-1050 ; 0x1ef30 //! @brief Print meander //! @param cmd_buffer character buffer needed to format gcodes void lay1cal_meander(float layer_height, float extrusion_width) { const float long_extrusion = count_e(layer_height, extrusion_width, long_length); 1f34a: 20 e0 ldi r18, 0x00 ; 0 1f34c: 30 e0 ldi r19, 0x00 ; 0 1f34e: 46 e1 ldi r20, 0x16 ; 22 1f350: 53 e4 ldi r21, 0x43 ; 67 1f352: c5 01 movw r24, r10 1f354: b4 01 movw r22, r8 1f356: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f35a: 76 2e mov r7, r22 1f35c: 67 2e mov r6, r23 1f35e: 58 2e mov r5, r24 1f360: 49 2e mov r4, r25 const float short_extrusion = count_e(layer_height, extrusion_width, short_length); 1f362: 20 e0 ldi r18, 0x00 ; 0 1f364: 30 e0 ldi r19, 0x00 ; 0 1f366: 40 ea ldi r20, 0xA0 ; 160 1f368: 51 e4 ldi r21, 0x41 ; 65 1f36a: c5 01 movw r24, r10 1f36c: b4 01 movw r22, r8 1f36e: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f372: b6 2e mov r11, r22 1f374: a7 2e mov r10, r23 1f376: 98 2e mov r9, r24 1f378: 89 2e mov r8, r25 1f37a: c5 e0 ldi r28, 0x05 ; 5 for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir) 1f37c: df ef ldi r29, 0xFF ; 255 { enquecommandf_P(extrude_fmt_X, xdir * long_length, long_extrusion); 1f37e: 2f e5 ldi r18, 0x5F ; 95 1f380: e2 2e mov r14, r18 1f382: 24 e8 ldi r18, 0x84 ; 132 1f384: f2 2e mov r15, r18 enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion); 1f386: 31 ec ldi r19, 0xC1 ; 193 1f388: c3 2e mov r12, r19 1f38a: 40 ea ldi r20, 0xA0 ; 160 1f38c: d4 2e mov r13, r20 1f38e: 04 e3 ldi r16, 0x34 ; 52 1f390: 14 e8 ldi r17, 0x84 ; 132 const float long_extrusion = count_e(layer_height, extrusion_width, long_length); const float short_extrusion = count_e(layer_height, extrusion_width, short_length); for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir) { enquecommandf_P(extrude_fmt_X, xdir * long_length, long_extrusion); 1f392: 4f 92 push r4 1f394: 5f 92 push r5 1f396: 6f 92 push r6 1f398: 7f 92 push r7 1f39a: 6d 2f mov r22, r29 1f39c: 0d 2e mov r0, r29 1f39e: 00 0c add r0, r0 1f3a0: 77 0b sbc r23, r23 1f3a2: 88 0b sbc r24, r24 1f3a4: 99 0b sbc r25, r25 1f3a6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1f3aa: 20 e0 ldi r18, 0x00 ; 0 1f3ac: 30 e0 ldi r19, 0x00 ; 0 1f3ae: 46 e1 ldi r20, 0x16 ; 22 1f3b0: 53 e4 ldi r21, 0x43 ; 67 1f3b2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1f3b6: 9f 93 push r25 1f3b8: 8f 93 push r24 1f3ba: 7f 93 push r23 1f3bc: 6f 93 push r22 1f3be: ff 92 push r15 1f3c0: ef 92 push r14 1f3c2: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion); 1f3c6: 8f 92 push r8 1f3c8: 9f 92 push r9 1f3ca: af 92 push r10 1f3cc: bf 92 push r11 1f3ce: cf 92 push r12 1f3d0: df 92 push r13 1f3d2: 1f 92 push r1 1f3d4: 1f 92 push r1 1f3d6: 1f 93 push r17 1f3d8: 0f 93 push r16 1f3da: 0e 94 b7 8f call 0x11f6e ; 0x11f6e void lay1cal_meander(float layer_height, float extrusion_width) { const float long_extrusion = count_e(layer_height, extrusion_width, long_length); const float short_extrusion = count_e(layer_height, extrusion_width, short_length); for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir) 1f3de: d1 95 neg r29 1f3e0: c1 50 subi r28, 0x01 ; 1 1f3e2: 8d b7 in r24, 0x3d ; 61 1f3e4: 9e b7 in r25, 0x3e ; 62 1f3e6: 44 96 adiw r24, 0x14 ; 20 1f3e8: 0f b6 in r0, 0x3f ; 63 1f3ea: f8 94 cli 1f3ec: 9e bf out 0x3e, r25 ; 62 1f3ee: 0f be out 0x3f, r0 ; 63 1f3f0: 8d bf out 0x3d, r24 ; 61 1f3f2: c1 11 cpse r28, r1 1f3f4: ce cf rjmp .-100 ; 0x1f392 1f3f6: 9c cd rjmp .-1224 ; 0x1ef30 //! @param layer_height layer height in mm //! @param extrusion_width extrusion width in mm //! @return filament length in mm which needs to be extruded to form line static constexpr float spacing(float layer_height, float extrusion_width, float overlap_factor=1.f) { return extrusion_width - layer_height * (overlap_factor - M_PI/4); 1f3f8: 23 e4 ldi r18, 0x43 ; 67 1f3fa: 3d ec ldi r19, 0xCD ; 205 1f3fc: 4f e2 ldi r20, 0x2F ; 47 1f3fe: 5d e3 ldi r21, 0x3D ; 61 1f400: c5 01 movw r24, r10 1f402: b4 01 movw r22, r8 1f404: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1f408: 6b 01 movw r12, r22 1f40a: 7c 01 movw r14, r24 //! //! @param cmd_buffer character buffer needed to format gcodes void lay1cal_square(float layer_height, float extrusion_width) { const float Y_spacing = spacing(layer_height, extrusion_width); const float long_extrusion = count_e(layer_height, extrusion_width, square_width); 1f40c: 20 e0 ldi r18, 0x00 ; 0 1f40e: 30 e0 ldi r19, 0x00 ; 0 1f410: 40 ea ldi r20, 0xA0 ; 160 1f412: 51 e4 ldi r21, 0x41 ; 65 1f414: c5 01 movw r24, r10 1f416: b4 01 movw r22, r8 1f418: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f41c: 66 2e mov r6, r22 1f41e: 57 2e mov r5, r23 1f420: 48 2e mov r4, r24 1f422: 39 2e mov r3, r25 const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing); 1f424: a7 01 movw r20, r14 1f426: 96 01 movw r18, r12 1f428: c5 01 movw r24, r10 1f42a: b4 01 movw r22, r8 1f42c: 0f 94 3e 79 call 0x2f27c ; 0x2f27c 1f430: 26 2e mov r2, r22 1f432: a7 2e mov r10, r23 1f434: 98 2e mov r9, r24 1f436: 89 2e mov r8, r25 1f438: 84 e0 ldi r24, 0x04 ; 4 1f43a: b8 2e mov r11, r24 for (uint8_t i = 0; i < 4; i++) { enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion); 1f43c: 90 ea ldi r25, 0xA0 ; 160 1f43e: 79 2e mov r7, r25 1f440: 0f e5 ldi r16, 0x5F ; 95 1f442: 14 e8 ldi r17, 0x84 ; 132 enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 1f444: f7 fa bst r15, 7 1f446: f0 94 com r15 1f448: f7 f8 bld r15, 7 1f44a: f0 94 com r15 1f44c: c4 e3 ldi r28, 0x34 ; 52 1f44e: d4 e8 ldi r29, 0x84 ; 132 const float long_extrusion = count_e(layer_height, extrusion_width, square_width); const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing); for (uint8_t i = 0; i < 4; i++) { enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion); 1f450: 3f 92 push r3 1f452: 4f 92 push r4 1f454: 5f 92 push r5 1f456: 6f 92 push r6 1f458: 91 e4 ldi r25, 0x41 ; 65 1f45a: 9f 93 push r25 1f45c: 7f 92 push r7 1f45e: 1f 92 push r1 1f460: 1f 92 push r1 1f462: 1f 93 push r17 1f464: 0f 93 push r16 1f466: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 1f46a: 8f 92 push r8 1f46c: 9f 92 push r9 1f46e: af 92 push r10 1f470: 2f 92 push r2 1f472: ff 92 push r15 1f474: ef 92 push r14 1f476: df 92 push r13 1f478: cf 92 push r12 1f47a: df 93 push r29 1f47c: cf 93 push r28 1f47e: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_X, -square_width*invert, long_extrusion); 1f482: 3f 92 push r3 1f484: 4f 92 push r4 1f486: 5f 92 push r5 1f488: 6f 92 push r6 1f48a: 81 ec ldi r24, 0xC1 ; 193 1f48c: 8f 93 push r24 1f48e: 7f 92 push r7 1f490: 1f 92 push r1 1f492: 1f 92 push r1 1f494: 1f 93 push r17 1f496: 0f 93 push r16 1f498: 0e 94 b7 8f call 0x11f6e ; 0x11f6e enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 1f49c: 8f 92 push r8 1f49e: 9f 92 push r9 1f4a0: af 92 push r10 1f4a2: 2f 92 push r2 1f4a4: ff 92 push r15 1f4a6: ef 92 push r14 1f4a8: df 92 push r13 1f4aa: cf 92 push r12 1f4ac: df 93 push r29 1f4ae: cf 93 push r28 1f4b0: 0e 94 b7 8f call 0x11f6e ; 0x11f6e 1f4b4: ba 94 dec r11 { const float Y_spacing = spacing(layer_height, extrusion_width); const float long_extrusion = count_e(layer_height, extrusion_width, square_width); const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing); for (uint8_t i = 0; i < 4; i++) 1f4b6: 8d b7 in r24, 0x3d ; 61 1f4b8: 9e b7 in r25, 0x3e ; 62 1f4ba: 88 96 adiw r24, 0x28 ; 40 1f4bc: 0f b6 in r0, 0x3f ; 63 1f4be: f8 94 cli 1f4c0: 9e bf out 0x3e, r25 ; 62 1f4c2: 0f be out 0x3f, r0 ; 63 1f4c4: 8d bf out 0x3d, r24 ; 61 1f4c6: b1 10 cpse r11, r1 1f4c8: c3 cf rjmp .-122 ; 0x1f450 1f4ca: 32 cd rjmp .-1436 ; 0x1ef30 MSG_M702, // Unload filament (MMU only) cmd_cal_finish_8, // Turn off hotend heater MSG_M84 // Disable stepper motors }; lay1cal_common_enqueue_loop(cmd_cal_finish, (sizeof(cmd_cal_finish)/sizeof(cmd_cal_finish[0]))); 1f4cc: 69 e0 ldi r22, 0x09 ; 9 1f4ce: 82 e2 ldi r24, 0x22 ; 34 1f4d0: 94 e8 ldi r25, 0x84 ; 132 1f4d2: fc cc rjmp .-1544 ; 0x1eecc break; case 2: lay1cal_finish(); break; case 1: lcd_setstatuspgm(MSG_WELCOME); 1f4d4: 86 ee ldi r24, 0xE6 ; 230 1f4d6: 9b e6 ldi r25, 0x6B ; 107 1f4d8: 0e 94 94 de call 0x1bd28 ; 0x1bd28 lcd_commands_step = 0; 1f4dc: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 lcd_commands_type = LcdCommands::Idle; 1f4e0: 10 92 5e 0d sts 0x0D5E, r1 ; 0x800d5e 1f4e4: 82 e0 ldi r24, 0x02 ; 2 1f4e6: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::Idle); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 1f4ea: 8f e5 ldi r24, 0x5F ; 95 1f4ec: 9f e0 ldi r25, 0x0F ; 15 1f4ee: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1f4f2: 88 23 and r24, r24 1f4f4: 09 f4 brne .+2 ; 0x1f4f8 1f4f6: f3 cd rjmp .-1050 ; 0x1f0de lcd_wizard(WizState::RepeatLay1Cal); 1f4f8: 8b e0 ldi r24, 0x0B ; 11 1f4fa: 0e 94 c3 eb call 0x1d786 ; 0x1d786 1f4fe: 18 cd rjmp .-1488 ; 0x1ef30 if (_Kp != 0 || _Ki != 0 || _Kd != 0) { enquecommandf_P(PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd); enquecommand_P(MSG_M500); } else { SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM."); 1f500: 8a ec ldi r24, 0xCA ; 202 1f502: 94 e8 ldi r25, 0x84 ; 132 1f504: 0e 94 c4 7a call 0xf588 ; 0xf588 1f508: c4 cd rjmp .-1144 ; 0x1f092 #endif //THERMAL_MODEL #endif //QUICK_NOZZLE_CHANGE switch(lcd_commands_step) { case 0: lcd_commands_step = 3; 1f50a: 83 e0 ldi r24, 0x03 ; 3 thermal_model_set_enabled(was_enabled); #endif //THERMAL_MODEL #else fanSpeed = 0; //turn off fan #endif //QUICK_NOZZLE_CHANGE lcd_commands_step = 1; 1f50c: 80 93 e2 03 sts 0x03E2, r24 ; 0x8003e2 1f510: 07 ce rjmp .-1010 ; 0x1f120 case 0: lcd_commands_step = 3; break; case 3: #ifndef QUICK_NOZZLE_CHANGE lcd_show_fullscreen_message_and_wait_P(_T(MSG_NOZZLE_CNG_READ_HELP)); 1f512: 89 e6 ldi r24, 0x69 ; 105 1f514: 9b e4 ldi r25, 0x4B ; 75 1f516: 0e 94 3a 75 call 0xea74 ; 0xea74 1f51a: 0e 94 94 ea call 0x1d528 ; 0x1d528 enquecommand_P(G28W); 1f51e: 61 e0 ldi r22, 0x01 ; 1 1f520: 81 ed ldi r24, 0xD1 ; 209 1f522: 98 e6 ldi r25, 0x68 ; 104 1f524: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommand_P(PSTR("G1 X125 Z200 F1000")); 1f528: 61 e0 ldi r22, 0x01 ; 1 1f52a: 87 eb ldi r24, 0xB7 ; 183 1f52c: 94 e8 ldi r25, 0x84 ; 132 1f52e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 enquecommand_P(PSTR("M109 S280")); 1f532: 61 e0 ldi r22, 0x01 ; 1 1f534: 8d ea ldi r24, 0xAD ; 173 1f536: 94 e8 ldi r25, 0x84 ; 132 1f538: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 } } enquecommand_P(G28W); //home enquecommand_P(PSTR("G1 X125 Z200 F1000")); //move to top center #endif //QUICK_NOZZLE_CHANGE lcd_commands_step = 2; 1f53c: 82 e0 ldi r24, 0x02 ; 2 1f53e: e6 cf rjmp .-52 ; 0x1f50c break; case 2: enquecommand_P(PSTR("M84 XY")); 1f540: 61 e0 ldi r22, 0x01 ; 1 1f542: 86 ea ldi r24, 0xA6 ; 166 1f544: 94 e8 ldi r25, 0x84 ; 132 1f546: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_NOZZLE_CNG_CHANGED), false) == LCD_LEFT_BUTTON_CHOICE) { 1f54a: 80 e3 ldi r24, 0x30 ; 48 1f54c: 9b e4 ldi r25, 0x4B ; 75 1f54e: 0e 94 3a 75 call 0xea74 ; 0xea74 1f552: 41 e0 ldi r20, 0x01 ; 1 1f554: 60 e0 ldi r22, 0x00 ; 0 1f556: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 1f55a: 81 11 cpse r24, r1 1f55c: e1 cd rjmp .-1086 ; 0x1f120 1f55e: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 1f562: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d thermal_model_set_enabled(was_enabled); #endif //THERMAL_MODEL #else fanSpeed = 0; //turn off fan #endif //QUICK_NOZZLE_CHANGE lcd_commands_step = 1; 1f566: 81 e0 ldi r24, 0x01 ; 1 1f568: d1 cf rjmp .-94 ; 0x1f50c } break; case 1: lcd_commands_step = 0; 1f56a: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 lcd_commands_type = LcdCommands::Idle; 1f56e: 10 92 5e 0d sts 0x0D5E, r1 ; 0x800d5e 1f572: 82 e0 ldi r24, 0x02 ; 2 1f574: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::Idle); menu_goto(lcd_hw_setup_menu, 2, true); 1f578: 20 e0 ldi r18, 0x00 ; 0 1f57a: 41 e0 ldi r20, 0x01 ; 1 1f57c: 62 e0 ldi r22, 0x02 ; 2 1f57e: 70 e0 ldi r23, 0x00 ; 0 1f580: 8b e5 ldi r24, 0x5B ; 91 1f582: 91 ec ldi r25, 0xC1 ; 193 1f584: 0e 94 b7 62 call 0xc56e ; 0xc56e menu_depth = 3; 1f588: 83 e0 ldi r24, 0x03 ; 3 1f58a: 80 93 df 03 sts 0x03DF, r24 ; 0x8003df 1f58e: c8 cd rjmp .-1136 ; 0x1f120 0001f590 : && menu_menu != lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); } void menu_lcd_lcdupdate_func(void) { 1f590: 0f 93 push r16 1f592: 1f 93 push r17 #if (SDCARDDETECT > 0) if ((IS_SD_INSERTED != lcd_oldcardstatus)) 1f594: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 1f598: 80 95 com r24 1f59a: 81 70 andi r24, 0x01 ; 1 1f59c: 90 91 01 04 lds r25, 0x0401 ; 0x800401 1f5a0: 89 17 cp r24, r25 1f5a2: 89 f1 breq .+98 ; 0x1f606 { if(menu_menu == lcd_sdcard_menu) { 1f5a4: 80 91 02 04 lds r24, 0x0402 ; 0x800402 1f5a8: 90 91 03 04 lds r25, 0x0403 ; 0x800403 1f5ac: 80 5a subi r24, 0xA0 ; 160 1f5ae: 95 4e sbci r25, 0xE5 ; 229 1f5b0: 11 f4 brne .+4 ; 0x1f5b6 // to back out of this submenu. Not only to show // 'Print from SD' submenu title but also because the user // will be prompted with another menu with the sorted list of files. // Without backing out of the menu, the list will appear empty and // The user will need to back out of two nested submenus. menu_back(); 1f5b2: 0e 94 1b 63 call 0xc636 ; 0xc636 } lcd_draw_update = 2; 1f5b6: 82 e0 ldi r24, 0x02 ; 2 1f5b8: 80 93 59 02 sts 0x0259, r24 ; 0x800259 lcd_oldcardstatus = IS_SD_INSERTED; 1f5bc: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 1f5c0: 80 95 com r24 1f5c2: 81 70 andi r24, 0x01 ; 1 1f5c4: 80 93 01 04 sts 0x0401, r24 ; 0x800401 lcd_refresh(); // to maybe revive the LCD if static electricity killed it. 1f5c8: 0e 94 9f 70 call 0xe13e ; 0xe13e backlight_wake(); if (lcd_oldcardstatus) 1f5cc: 80 91 01 04 lds r24, 0x0401 ; 0x800401 1f5d0: 88 23 and r24, r24 1f5d2: 09 f4 brne .+2 ; 0x1f5d6 1f5d4: 88 c0 rjmp .+272 ; 0x1f6e6 { if (!card.mounted) 1f5d6: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 1f5da: 81 11 cpse r24, r1 1f5dc: 05 c0 rjmp .+10 ; 0x1f5e8 { card.mount(false); //delay the sorting to the sd menu. Otherwise, removing the SD card while sorting will not menu_back() 1f5de: 0f 94 6a 73 call 0x2e6d4 ; 0x2e6d4 card.presort_flag = true; //force sorting of the SD menu 1f5e2: 81 e0 ldi r24, 0x01 ; 1 1f5e4: 80 93 26 14 sts 0x1426, r24 ; 0x801426 } LCD_MESSAGERPGM(MSG_WELCOME); 1f5e8: 86 ee ldi r24, 0xE6 ; 230 1f5ea: 9b e6 ldi r25, 0x6B ; 107 1f5ec: 0e 94 94 de call 0x1bd28 ; 0x1bd28 bMain=false; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function 1f5f0: 10 92 c9 03 sts 0x03C9, r1 ; 0x8003c9 menu_submenu(lcd_sdcard_menu, true); 1f5f4: 61 e0 ldi r22, 0x01 ; 1 1f5f6: 80 ea ldi r24, 0xA0 ; 160 1f5f8: 95 ee ldi r25, 0xE5 ; 229 1f5fa: 0e 94 dd 62 call 0xc5ba ; 0xc5ba lcd_timeoutToStatus.start(); 1f5fe: 83 ee ldi r24, 0xE3 ; 227 1f600: 93 e0 ldi r25, 0x03 ; 3 1f602: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> card.release(); LCD_MESSAGERPGM(_T(MSG_SD_REMOVED)); } } #endif//CARDINSERTED if (lcd_next_update_millis < _millis()) 1f606: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1f60a: 00 91 c5 03 lds r16, 0x03C5 ; 0x8003c5 1f60e: 10 91 c6 03 lds r17, 0x03C6 ; 0x8003c6 1f612: 20 91 c7 03 lds r18, 0x03C7 ; 0x8003c7 1f616: 30 91 c8 03 lds r19, 0x03C8 ; 0x8003c8 1f61a: 06 17 cp r16, r22 1f61c: 17 07 cpc r17, r23 1f61e: 28 07 cpc r18, r24 1f620: 39 07 cpc r19, r25 1f622: e8 f5 brcc .+122 ; 0x1f69e { if (lcd_draw_update) { 1f624: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1f628: 88 23 and r24, r24 1f62a: 31 f0 breq .+12 ; 0x1f638 lcd_timeoutToStatus.start(); 1f62c: 83 ee ldi r24, 0xE3 ; 227 1f62e: 93 e0 ldi r25, 0x03 ; 3 1f630: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> lcd_frame_start(); 1f634: 0e 94 e6 6e call 0xddcc ; 0xddcc } (*menu_menu)(); 1f638: e0 91 02 04 lds r30, 0x0402 ; 0x800402 1f63c: f0 91 03 04 lds r31, 0x0403 ; 0x800403 1f640: 19 95 eicall // we should ignore lcd_timeoutToStatus. Example use case is // when running first layer calibration. static inline bool z_menu_expired() { return (menu_menu == lcd_babystep_z && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)))); 1f642: 80 91 02 04 lds r24, 0x0402 ; 0x800402 1f646: 90 91 03 04 lds r25, 0x0403 ; 0x800403 1f64a: 88 56 subi r24, 0x68 ; 104 1f64c: 97 4d sbci r25, 0xD7 ; 215 1f64e: 09 f4 brne .+2 ; 0x1f652 1f650: 5d c0 rjmp .+186 ; 0x1f70c } static inline bool other_menu_expired() { return (menu_menu != lcd_status_screen 1f652: 80 91 02 04 lds r24, 0x0402 ; 0x800402 1f656: 90 91 03 04 lds r25, 0x0403 ; 0x800403 && menu_menu != lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); 1f65a: 27 e3 ldi r18, 0x37 ; 55 1f65c: 80 32 cpi r24, 0x20 ; 32 1f65e: 92 07 cpc r25, r18 1f660: 09 f0 breq .+2 ; 0x1f664 1f662: 75 c0 rjmp .+234 ; 0x1f74e } lcd_clear(); lcd_return_to_status(); lcd_draw_update = 2; } if (lcd_draw_update == 2) lcdui_refresh(); 1f664: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1f668: 82 30 cpi r24, 0x02 ; 2 1f66a: 21 f4 brne .+8 ; 0x1f674 #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 1f66c: 0e 94 9f 70 call 0xe13e ; 0xe13e lcd_status_message_idx = 0; // Re-draw message from beginning 1f670: 10 92 64 04 sts 0x0464, r1 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> lcd_clear(); lcd_return_to_status(); lcd_draw_update = 2; } if (lcd_draw_update == 2) lcdui_refresh(); if (lcd_draw_update) lcd_draw_update--; 1f674: 80 91 59 02 lds r24, 0x0259 ; 0x800259 1f678: 88 23 and r24, r24 1f67a: 19 f0 breq .+6 ; 0x1f682 1f67c: 81 50 subi r24, 0x01 ; 1 1f67e: 80 93 59 02 sts 0x0259, r24 ; 0x800259 lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL; 1f682: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1f686: 6c 59 subi r22, 0x9C ; 156 1f688: 7f 4f sbci r23, 0xFF ; 255 1f68a: 8f 4f sbci r24, 0xFF ; 255 1f68c: 9f 4f sbci r25, 0xFF ; 255 1f68e: 60 93 c5 03 sts 0x03C5, r22 ; 0x8003c5 1f692: 70 93 c6 03 sts 0x03C6, r23 ; 0x8003c6 1f696: 80 93 c7 03 sts 0x03C7, r24 ; 0x8003c7 1f69a: 90 93 c8 03 sts 0x03C8, r25 ; 0x8003c8 SERIAL_ECHO(']'); prusa_stat_diameter(); } static void lcd_send_status() { if (farm_mode && no_response && (NcTime.expired(NC_TIME * 1000))) { 1f69e: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 1f6a2: 88 23 and r24, r24 1f6a4: 99 f0 breq .+38 ; 0x1f6cc 1f6a6: 80 91 08 04 lds r24, 0x0408 ; 0x800408 <_ZL11no_response.lto_priv.493> 1f6aa: 88 23 and r24, r24 1f6ac: 79 f0 breq .+30 ; 0x1f6cc 1f6ae: 60 e1 ldi r22, 0x10 ; 16 1f6b0: 77 e2 ldi r23, 0x27 ; 39 1f6b2: 81 ec ldi r24, 0xC1 ; 193 1f6b4: 93 e0 ldi r25, 0x03 ; 3 1f6b6: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 1f6ba: 88 23 and r24, r24 1f6bc: 39 f0 breq .+14 ; 0x1f6cc //send important status messages periodicaly prusa_statistics(8); 1f6be: 88 e0 ldi r24, 0x08 ; 8 1f6c0: 0f 94 79 32 call 0x264f2 ; 0x264f2 NcTime.start(); 1f6c4: 81 ec ldi r24, 0xC1 ; 193 1f6c6: 93 e0 ldi r25, 0x03 ; 3 1f6c8: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> } prusa_statistics_update_from_lcd_update(); if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands(); 1f6cc: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1f6d0: 84 30 cpi r24, 0x04 ; 4 1f6d2: 09 f0 breq .+2 ; 0x1f6d6 1f6d4: 53 c0 rjmp .+166 ; 0x1f77c void lcd_print_stop_finish(); void lcd_commands() { // printf_P(PSTR("lcd_commands begin, lcd_commands_type=%u, lcd_commands_step=%u\n"), (uint8_t)lcd_commands_type, lcd_commands_step); if (planner_aborted) { 1f6d6: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 1f6da: 81 11 cpse r24, r1 1f6dc: 4f c0 rjmp .+158 ; 0x1f77c if (lcd_draw_update) lcd_draw_update--; lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL; } prusa_statistics_update_from_lcd_update(); if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands(); } 1f6de: 1f 91 pop r17 1f6e0: 0f 91 pop r16 1f6e2: 0c 94 05 f6 jmp 0x1ec0a ; 0x1ec0a presort_flag = true; #endif } void CardReader::release() { sdprinting = false; 1f6e6: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 mounted = false; 1f6ea: 10 92 d8 13 sts 0x13D8, r1 ; 0x8013d8 SERIAL_ECHO_START; 1f6ee: 8e ec ldi r24, 0xCE ; 206 1f6f0: 91 ea ldi r25, 0xA1 ; 161 1f6f2: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED 1f6f6: 88 ea ldi r24, 0xA8 ; 168 1f6f8: 98 e6 ldi r25, 0x68 ; 104 1f6fa: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_timeoutToStatus.start(); } else { card.release(); LCD_MESSAGERPGM(_T(MSG_SD_REMOVED)); 1f6fe: 89 ed ldi r24, 0xD9 ; 217 1f700: 9a e4 ldi r25, 0x4A ; 74 1f702: 0e 94 3a 75 call 0xea74 ; 0xea74 1f706: 0e 94 94 de call 0x1bd28 ; 0x1bd28 1f70a: 7d cf rjmp .-262 ; 0x1f606 // we should ignore lcd_timeoutToStatus. Example use case is // when running first layer calibration. static inline bool z_menu_expired() { return (menu_menu == lcd_babystep_z && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)))); 1f70c: 0e 94 4f 66 call 0xcc9e ; 0xcc9e 1f710: 81 11 cpse r24, r1 1f712: 0e c0 rjmp .+28 ; 0x1f730 if (z_menu_expired() || other_menu_expired()) { // Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true // to give it a chance to save its state. // This is useful for example, when the babystep value has to be written into EEPROM. if (menu_menu != NULL) 1f714: e0 91 02 04 lds r30, 0x0402 ; 0x800402 1f718: f0 91 03 04 lds r31, 0x0403 ; 0x800403 1f71c: 30 97 sbiw r30, 0x00 ; 0 1f71e: 39 f5 brne .+78 ; 0x1f76e { menu_leaving = 1; (*menu_menu)(); menu_leaving = 0; } lcd_clear(); 1f720: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_return_to_status(); 1f724: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_draw_update = 2; 1f728: 82 e0 ldi r24, 0x02 ; 2 1f72a: 80 93 59 02 sts 0x0259, r24 ; 0x800259 1f72e: 9a cf rjmp .-204 ; 0x1f664 // we should ignore lcd_timeoutToStatus. Example use case is // when running first layer calibration. static inline bool z_menu_expired() { return (menu_menu == lcd_babystep_z && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z)))); 1f730: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 1f734: 81 11 cpse r24, r1 1f736: 8d cf rjmp .-230 ; 0x1f652 1f738: 40 e9 ldi r20, 0x90 ; 144 1f73a: 5f e5 ldi r21, 0x5F ; 95 1f73c: 61 e0 ldi r22, 0x01 ; 1 1f73e: 70 e0 ldi r23, 0x00 ; 0 1f740: 83 ee ldi r24, 0xE3 ; 227 1f742: 93 e0 ldi r25, 0x03 ; 3 1f744: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 1f748: 81 11 cpse r24, r1 1f74a: e4 cf rjmp .-56 ; 0x1f714 1f74c: 82 cf rjmp .-252 ; 0x1f652 } static inline bool other_menu_expired() { return (menu_menu != lcd_status_screen && menu_menu != lcd_babystep_z 1f74e: 88 56 subi r24, 0x68 ; 104 1f750: 97 4d sbci r25, 0xD7 ; 215 1f752: 09 f4 brne .+2 ; 0x1f756 1f754: 87 cf rjmp .-242 ; 0x1f664 && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); 1f756: 40 e3 ldi r20, 0x30 ; 48 1f758: 55 e7 ldi r21, 0x75 ; 117 1f75a: 60 e0 ldi r22, 0x00 ; 0 1f75c: 70 e0 ldi r23, 0x00 ; 0 1f75e: 83 ee ldi r24, 0xE3 ; 227 1f760: 93 e0 ldi r25, 0x03 ; 3 1f762: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 1f766: 88 23 and r24, r24 1f768: 09 f4 brne .+2 ; 0x1f76c 1f76a: 7c cf rjmp .-264 ; 0x1f664 1f76c: d3 cf rjmp .-90 ; 0x1f714 // Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true // to give it a chance to save its state. // This is useful for example, when the babystep value has to be written into EEPROM. if (menu_menu != NULL) { menu_leaving = 1; 1f76e: 81 e0 ldi r24, 0x01 ; 1 1f770: 80 93 c4 03 sts 0x03C4, r24 ; 0x8003c4 (*menu_menu)(); 1f774: 19 95 eicall menu_leaving = 0; 1f776: 10 92 c4 03 sts 0x03C4, r1 ; 0x8003c4 1f77a: d2 cf rjmp .-92 ; 0x1f720 if (lcd_draw_update) lcd_draw_update--; lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL; } prusa_statistics_update_from_lcd_update(); if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands(); } 1f77c: 1f 91 pop r17 1f77e: 0f 91 pop r16 1f780: 08 95 ret 0001f782 : menu_goto(lcd_generic_preheat_menu, 0, true); } void lcd_wizard() { bool result = true; if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) { 1f782: 87 e1 ldi r24, 0x17 ; 23 1f784: 0e 94 5b d7 call 0x1aeb6 ; 0x1aeb6 1f788: 81 11 cpse r24, r1 1f78a: 06 c0 rjmp .+12 ; 0x1f798 // calibration already performed: ask before clearing the previous status result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_WIZARD_RERUN), false); } if (result) { calibration_status_clear(CALIBRATION_WIZARD_STEPS); 1f78c: 87 e1 ldi r24, 0x17 ; 23 1f78e: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 lcd_wizard(WizState::Run); 1f792: 80 e0 ldi r24, 0x00 ; 0 1f794: 0c 94 c3 eb jmp 0x1d786 ; 0x1d786 void lcd_wizard() { bool result = true; if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) { // calibration already performed: ask before clearing the previous status result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_WIZARD_RERUN), false); 1f798: 82 e3 ldi r24, 0x32 ; 50 1f79a: 9d e3 ldi r25, 0x3D ; 61 1f79c: 0e 94 3a 75 call 0xea74 ; 0xea74 1f7a0: 41 e0 ldi r20, 0x01 ; 1 1f7a2: 60 e0 ldi r22, 0x00 ; 0 1f7a4: 0e 94 77 e5 call 0x1caee ; 0x1caee } if (result) { 1f7a8: 88 23 and r24, r24 1f7aa: 81 f3 breq .-32 ; 0x1f78c calibration_status_clear(CALIBRATION_WIZARD_STEPS); lcd_wizard(WizState::Run); } else { lcd_return_to_status(); 1f7ac: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_update_enable(true); 1f7b0: 81 e0 ldi r24, 0x01 ; 1 1f7b2: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_update(2); 1f7b6: 82 e0 ldi r24, 0x02 ; 2 1f7b8: 0c 94 f9 6e jmp 0xddf2 ; 0xddf2 0001f7bc : lcd_show_fullscreen_message_and_wait_P(msg); } } } void lcd_temp_cal_show_result(bool result) { 1f7bc: cf 93 push r28 1f7be: c8 2f mov r28, r24 custom_message_type = CustomMsg::Status; 1f7c0: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d disable_x(); 1f7c4: 17 9a sbi 0x02, 7 ; 2 1f7c6: 10 92 39 06 sts 0x0639, r1 ; 0x800639 disable_y(); 1f7ca: 16 9a sbi 0x02, 6 ; 2 1f7cc: 10 92 3a 06 sts 0x063A, r1 ; 0x80063a disable_z(); disable_e0(); 1f7d0: 14 9a sbi 0x02, 4 ; 2 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 1f7d2: 10 92 5a 12 sts 0x125A, r1 ; 0x80125a 1f7d6: 10 92 59 12 sts 0x1259, r1 ; 0x801259 1f7da: 68 2f mov r22, r24 1f7dc: 86 ea ldi r24, 0xA6 ; 166 1f7de: 9f e0 ldi r25, 0x0F ; 15 1f7e0: 0f 94 04 a4 call 0x34808 ; 0x34808 1f7e4: 6c 2f mov r22, r28 1f7e6: 8f ea ldi r24, 0xAF ; 175 1f7e8: 9f e0 ldi r25, 0x0F ; 15 1f7ea: 0f 94 04 a4 call 0x34808 ; 0x34808 // Store boolean result eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, result); eeprom_update_byte_notify((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, result); if (result) { 1f7ee: cc 23 and r28, r28 1f7f0: 89 f0 breq .+34 ; 0x1f814 SERIAL_ECHOLNPGM("PINDA calibration done. Continue with pressing the knob."); 1f7f2: 87 ed ldi r24, 0xD7 ; 215 1f7f4: 92 e8 ldi r25, 0x82 ; 130 1f7f6: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CALIBRATION_DONE)); 1f7fa: 83 e4 ldi r24, 0x43 ; 67 1f7fc: 9c e3 ldi r25, 0x3C ; 60 } else { SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob."); lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED)); 1f7fe: 0e 94 3a 75 call 0xea74 ; 0xea74 1f802: 0e 94 94 ea call 0x1d528 ; 0x1d528 } lcd_update_enable(true); 1f806: 81 e0 ldi r24, 0x01 ; 1 1f808: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_update(2); 1f80c: 82 e0 ldi r24, 0x02 ; 2 } 1f80e: cf 91 pop r28 } else { SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob."); lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED)); } lcd_update_enable(true); lcd_update(2); 1f810: 0c 94 f9 6e jmp 0xddf2 ; 0xddf2 if (result) { SERIAL_ECHOLNPGM("PINDA calibration done. Continue with pressing the knob."); lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CALIBRATION_DONE)); } else { SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob."); 1f814: 8c e9 ldi r24, 0x9C ; 156 1f816: 92 e8 ldi r25, 0x82 ; 130 1f818: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED)); 1f81c: 88 e2 ldi r24, 0x28 ; 40 1f81e: 9c e3 ldi r25, 0x3C ; 60 1f820: ee cf rjmp .-36 ; 0x1f7fe 0001f822 : // When done, it sets the current Z to Z_MAX_POS and returns true. // Otherwise the Z calibration is not changed and false is returned. #ifndef TMC2130 bool lcd_calibrate_z_end_stop_manual(bool only_z) { 1f822: 9f 92 push r9 1f824: af 92 push r10 1f826: bf 92 push r11 1f828: cf 92 push r12 1f82a: df 92 push r13 1f82c: ef 92 push r14 1f82e: ff 92 push r15 1f830: 0f 93 push r16 1f832: 1f 93 push r17 1f834: cf 93 push r28 1f836: df 93 push r29 1f838: 98 2e mov r9, r24 // Don't know where we are. Let's claim we are Z=0, so the soft end stops will not be triggered when moving up. current_position[Z_AXIS] = 0; 1f83a: 10 92 69 12 sts 0x1269, r1 ; 0x801269 1f83e: 10 92 6a 12 sts 0x126A, r1 ; 0x80126a 1f842: 10 92 6b 12 sts 0x126B, r1 ; 0x80126b 1f846: 10 92 6c 12 sts 0x126C, r1 ; 0x80126c plan_set_position_curposXYZE(); 1f84a: 0f 94 41 4b call 0x29682 ; 0x29682 // Until confirmed by the confirmation dialog. for (;;) { const char *msg = only_z ? _T(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z) 1f84e: 87 ec ldi r24, 0xC7 ; 199 1f850: 9b e3 ldi r25, 0x3B ; 59 1f852: 91 10 cpse r9, r1 1f854: 02 c0 rjmp .+4 ; 0x1f85a 1f856: 84 e6 ldi r24, 0x64 ; 100 1f858: 9b e3 ldi r25, 0x3B ; 59 1f85a: 0e 94 3a 75 call 0xea74 ; 0xea74 1f85e: b8 2e mov r11, r24 1f860: a9 2e mov r10, r25 : _T(MSG_MOVE_CARRIAGE_TO_THE_TOP); const char *msg_next = lcd_display_message_fullscreen_P(msg); 1f862: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1f866: 8c 01 movw r16, r24 const bool multi_screen = msg_next != NULL; unsigned long previous_millis_msg = _millis(); 1f868: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1f86c: 6b 01 movw r12, r22 1f86e: 7c 01 movw r14, r24 // Until the user finishes the z up movement. lcd_encoder = 0; 1f870: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1f874: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e // Until confirmed by the confirmation dialog. for (;;) { const char *msg = only_z ? _T(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z) : _T(MSG_MOVE_CARRIAGE_TO_THE_TOP); const char *msg_next = lcd_display_message_fullscreen_P(msg); 1f878: e8 01 movw r28, r16 const bool multi_screen = msg_next != NULL; unsigned long previous_millis_msg = _millis(); // Until the user finishes the z up movement. lcd_encoder = 0; for (;;) { manage_heater(); 1f87a: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 1f87e: 81 e0 ldi r24, 0x01 ; 1 1f880: 0e 94 34 8c call 0x11868 ; 0x11868 if (lcd_encoder) { 1f884: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 1f888: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 1f88c: 89 2b or r24, r25 1f88e: d9 f1 breq .+118 ; 0x1f906 _delay(50); 1f890: 62 e3 ldi r22, 0x32 ; 50 1f892: 70 e0 ldi r23, 0x00 ; 0 1f894: 80 e0 ldi r24, 0x00 ; 0 1f896: 90 e0 ldi r25, 0x00 ; 0 1f898: 0f 94 bd 0d call 0x21b7a ; 0x21b7a FORCE_INLINE uint8_t moves_planned() { return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); } FORCE_INLINE bool planner_queue_full() { uint8_t next_block_index = block_buffer_head; 1f89c: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e if (++ next_block_index == BLOCK_BUFFER_SIZE) 1f8a0: 8f 5f subi r24, 0xFF ; 255 1f8a2: 80 31 cpi r24, 0x10 ; 16 1f8a4: 09 f4 brne .+2 ; 0x1f8a8 next_block_index = 0; 1f8a6: 80 e0 ldi r24, 0x00 ; 0 return block_buffer_tail == next_block_index; 1f8a8: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f if (! planner_queue_full()) { 1f8ac: 98 17 cp r25, r24 1f8ae: 59 f1 breq .+86 ; 0x1f906 // Only move up, whatever direction the user rotates the encoder. current_position[Z_AXIS] += abs(lcd_encoder); 1f8b0: 60 91 1e 06 lds r22, 0x061E ; 0x80061e 1f8b4: 70 91 1f 06 lds r23, 0x061F ; 0x80061f 1f8b8: 77 ff sbrs r23, 7 1f8ba: 03 c0 rjmp .+6 ; 0x1f8c2 1f8bc: 71 95 neg r23 1f8be: 61 95 neg r22 1f8c0: 71 09 sbc r23, r1 1f8c2: 07 2e mov r0, r23 1f8c4: 00 0c add r0, r0 1f8c6: 88 0b sbc r24, r24 1f8c8: 99 0b sbc r25, r25 1f8ca: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1f8ce: 20 91 69 12 lds r18, 0x1269 ; 0x801269 1f8d2: 30 91 6a 12 lds r19, 0x126A ; 0x80126a 1f8d6: 40 91 6b 12 lds r20, 0x126B ; 0x80126b 1f8da: 50 91 6c 12 lds r21, 0x126C ; 0x80126c 1f8de: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1f8e2: 60 93 69 12 sts 0x1269, r22 ; 0x801269 1f8e6: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 1f8ea: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 1f8ee: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c lcd_encoder = 0; 1f8f2: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 1f8f6: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e plan_buffer_line_curposXYZE(manual_feedrate[Z_AXIS] / 60); 1f8fa: 65 e5 ldi r22, 0x55 ; 85 1f8fc: 75 e5 ldi r23, 0x55 ; 85 1f8fe: 85 e8 ldi r24, 0x85 ; 133 1f900: 91 e4 ldi r25, 0x41 ; 65 1f902: 0f 94 81 4c call 0x29902 ; 0x29902 } } if (lcd_clicked()) { 1f906: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1f90a: 88 23 and r24, r24 1f90c: c9 f1 breq .+114 ; 0x1f980 // Abort a move if in progress. planner_abort_hard(); 1f90e: 0f 94 fb 4e call 0x29df6 ; 0x29df6 planner_aborted = false; 1f912: 10 92 42 0d sts 0x0D42, r1 ; 0x800d42 while (lcd_clicked()) ; 1f916: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1f91a: 81 11 cpse r24, r1 1f91c: fc cf rjmp .-8 ; 0x1f916 _delay(10); 1f91e: 6a e0 ldi r22, 0x0A ; 10 1f920: 70 e0 ldi r23, 0x00 ; 0 1f922: 80 e0 ldi r24, 0x00 ; 0 1f924: 90 e0 ldi r25, 0x00 ; 0 1f926: 0f 94 bd 0d call 0x21b7a ; 0x21b7a while (lcd_clicked()) ; 1f92a: 0e 94 75 73 call 0xe6ea ; 0xe6ea 1f92e: 81 11 cpse r24, r1 1f930: fc cf rjmp .-8 ; 0x1f92a msg_next = lcd_display_message_fullscreen_P(msg_next); previous_millis_msg = _millis(); } } // Let the user confirm, that the Z carriage is at the top end stoppers. uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_CONFIRM_CARRIAGE_AT_THE_TOP), false); 1f932: 8b e3 ldi r24, 0x3B ; 59 1f934: 9b e3 ldi r25, 0x3B ; 59 1f936: 0e 94 3a 75 call 0xea74 ; 0xea74 1f93a: 41 e0 ldi r20, 0x01 ; 1 1f93c: 60 e0 ldi r22, 0x00 ; 0 1f93e: 0e 94 b2 e8 call 0x1d164 ; 0x1d164 if (result == LCD_BUTTON_TIMEOUT) 1f942: 8f 3f cpi r24, 0xFF ; 255 1f944: d1 f1 breq .+116 ; 0x1f9ba goto canceled; else if (result == LCD_LEFT_BUTTON_CHOICE) 1f946: 81 11 cpse r24, r1 1f948: 82 cf rjmp .-252 ; 0x1f84e calibrated: // Let the machine think the Z axis is a bit higher than it is, so it will not home into the bed // during the search for the induction points. if ((PRINTER_TYPE == PRINTER_MK25) || (PRINTER_TYPE == PRINTER_MK2) || (PRINTER_TYPE == PRINTER_MK2_SNMM)) { current_position[Z_AXIS] = Z_MAX_POS-3.f; 1f94a: 80 e0 ldi r24, 0x00 ; 0 1f94c: 90 e0 ldi r25, 0x00 ; 0 1f94e: af e4 ldi r26, 0x4F ; 79 1f950: b3 e4 ldi r27, 0x43 ; 67 1f952: 80 93 69 12 sts 0x1269, r24 ; 0x801269 1f956: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 1f95a: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 1f95e: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c } else { current_position[Z_AXIS] = Z_MAX_POS+4.f; } plan_set_position_curposXYZE(); 1f962: 0f 94 41 4b call 0x29682 ; 0x29682 return true; 1f966: 81 e0 ldi r24, 0x01 ; 1 canceled: return false; } 1f968: df 91 pop r29 1f96a: cf 91 pop r28 1f96c: 1f 91 pop r17 1f96e: 0f 91 pop r16 1f970: ff 90 pop r15 1f972: ef 90 pop r14 1f974: df 90 pop r13 1f976: cf 90 pop r12 1f978: bf 90 pop r11 1f97a: af 90 pop r10 1f97c: 9f 90 pop r9 1f97e: 08 95 ret while (lcd_clicked()) ; _delay(10); while (lcd_clicked()) ; break; } if (multi_screen && _millis() - previous_millis_msg > 5000) { 1f980: 01 15 cp r16, r1 1f982: 11 05 cpc r17, r1 1f984: 09 f4 brne .+2 ; 0x1f988 1f986: 79 cf rjmp .-270 ; 0x1f87a 1f988: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1f98c: 6c 19 sub r22, r12 1f98e: 7d 09 sbc r23, r13 1f990: 8e 09 sbc r24, r14 1f992: 9f 09 sbc r25, r15 1f994: 69 38 cpi r22, 0x89 ; 137 1f996: 73 41 sbci r23, 0x13 ; 19 1f998: 81 05 cpc r24, r1 1f99a: 91 05 cpc r25, r1 1f99c: 08 f4 brcc .+2 ; 0x1f9a0 1f99e: 6d cf rjmp .-294 ; 0x1f87a if (msg_next == NULL) 1f9a0: 20 97 sbiw r28, 0x00 ; 0 1f9a2: 11 f4 brne .+4 ; 0x1f9a8 msg_next = msg; 1f9a4: cb 2d mov r28, r11 1f9a6: da 2d mov r29, r10 msg_next = lcd_display_message_fullscreen_P(msg_next); 1f9a8: ce 01 movw r24, r28 1f9aa: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 1f9ae: ec 01 movw r28, r24 previous_millis_msg = _millis(); 1f9b0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 1f9b4: 6b 01 movw r12, r22 1f9b6: 7c 01 movw r14, r24 1f9b8: 60 cf rjmp .-320 ; 0x1f87a } plan_set_position_curposXYZE(); return true; canceled: return false; 1f9ba: 80 e0 ldi r24, 0x00 ; 0 1f9bc: d5 cf rjmp .-86 ; 0x1f968 0001f9be : } } return false; // couldn't accomplish the task } void MMU2::ToolChangeCommon(uint8_t slot) { 1f9be: 2f 92 push r2 1f9c0: 3f 92 push r3 1f9c2: 4f 92 push r4 1f9c4: 5f 92 push r5 1f9c6: 6f 92 push r6 1f9c8: 7f 92 push r7 1f9ca: 8f 92 push r8 1f9cc: 9f 92 push r9 1f9ce: af 92 push r10 1f9d0: bf 92 push r11 1f9d2: cf 92 push r12 1f9d4: df 92 push r13 1f9d6: ef 92 push r14 1f9d8: ff 92 push r15 1f9da: 0f 93 push r16 1f9dc: 1f 93 push r17 1f9de: cf 93 push r28 1f9e0: df 93 push r29 1f9e2: cd b7 in r28, 0x3d ; 61 1f9e4: de b7 in r29, 0x3e ; 62 1f9e6: 67 97 sbiw r28, 0x17 ; 23 1f9e8: 0f b6 in r0, 0x3f ; 63 1f9ea: f8 94 cli 1f9ec: de bf out 0x3e, r29 ; 62 1f9ee: 0f be out 0x3f, r0 ; 63 1f9f0: cd bf out 0x3d, r28 ; 61 1f9f2: 08 2f mov r16, r24 1f9f4: ce 01 movw r24, r28 1f9f6: 46 96 adiw r24, 0x16 ; 22 1f9f8: 9f 8b std Y+23, r25 ; 0x17 1f9fa: 8e 8b std Y+22, r24 ; 0x16 1f9fc: 83 e0 ldi r24, 0x03 ; 3 1f9fe: f8 2e mov r15, r24 lcd_draw_update = 1; // force redraw } void lcd_clearstatus() { memset(lcd_status_message, 0, sizeof(lcd_status_message)); 1fa00: 95 e1 ldi r25, 0x15 ; 21 1fa02: 29 2e mov r2, r25 bool MMU2::ToolChangeCommonOnce(uint8_t slot) { static_assert(MAX_RETRIES > 1); // need >1 retries to do the cut in the last attempt for (uint8_t retries = MAX_RETRIES; retries; --retries) { for (;;) { Disable_E0(); // it may seem counterintuitive to disable the E-motor, but it gets enabled in the planner whenever the E-motor is to move 1fa04: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 tool_change_extruder = slot; 1fa08: 00 93 e9 12 sts 0x12E9, r16 ; 0x8012e9 state = State::Stopped; currentScope = Scope::Stopped; } void ProtocolLogic::ToolChange(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Tool, slot)); 1fa0c: 40 2f mov r20, r16 1fa0e: 64 e5 ldi r22, 0x54 ; 84 1fa10: ce 01 movw r24, r28 1fa12: 01 96 adiw r24, 0x01 ; 1 1fa14: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 1fa18: 49 81 ldd r20, Y+1 ; 0x01 1fa1a: 5a 81 ldd r21, Y+2 ; 0x02 1fa1c: 6b 81 ldd r22, Y+3 ; 0x03 1fa1e: 7c 81 ldd r23, Y+4 ; 0x04 1fa20: 8d 81 ldd r24, Y+5 ; 0x05 1fa22: 0f 94 19 95 call 0x32a32 ; 0x32a32 logic.ToolChange(slot); // let the MMU pull the filament out and push a new one in if (manage_response(true, true)) { 1fa26: 61 e0 ldi r22, 0x01 ; 1 1fa28: 81 e0 ldi r24, 0x01 ; 1 1fa2a: 0f 94 aa 9c call 0x33954 ; 0x33954 1fa2e: 18 2f mov r17, r24 1fa30: 81 11 cpse r24, r1 1fa32: 07 c0 rjmp .+14 ; 0x1fa42 break; } // otherwise: failed to perform the command - unload first and then let it run again IncrementMMUFails(); 1fa34: 0f 94 28 50 call 0x2a050 ; 0x2a050 // just in case we stood in an error screen for too long and the hotend got cold ResumeHotendTemp(); 1fa38: 0f 94 48 9c call 0x33890 ; 0x33890 // if the extruder has been parked, it will get unparked once the ToolChange command finishes OK // - so no ResumeUnpark() at this spot UnloadInner(); 1fa3c: 0f 94 38 9d call 0x33a70 ; 0x33a70 1fa40: e1 cf rjmp .-62 ; 0x1fa04 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 1fa42: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } bool MMU2::VerifyFilamentEnteredPTFE() { planner_synchronize(); if (WhereIsFilament() != FilamentState::AT_FSENSOR) 1fa46: 0f 94 0a 51 call 0x2a214 ; 0x2a214 1fa4a: 81 30 cpi r24, 0x01 ; 1 1fa4c: 79 f1 breq .+94 ; 0x1faac // something else is seriously broken and stopping a print is probably our best option. } if (VerifyFilamentEnteredPTFE()) { return true; // success } else { // Prepare a retry attempt UnloadInner(); 1fa4e: 0f 94 38 9d call 0x33a70 ; 0x33a70 if (retries == 2 && cutter_enabled()) { 1fa52: 92 e0 ldi r25, 0x02 ; 2 1fa54: f9 12 cpse r15, r25 1fa56: 09 c0 rjmp .+18 ; 0x1fa6a eeprom_increment_byte((uint8_t *)EEPROM_MMU_FAIL); eeprom_increment_word((uint16_t *)EEPROM_MMU_FAIL_TOT); } bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; 1fa58: 8e ec ldi r24, 0xCE ; 206 1fa5a: 9e e0 ldi r25, 0x0E ; 14 1fa5c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 1fa60: 81 30 cpi r24, 0x01 ; 1 1fa62: 19 f4 brne .+6 ; 0x1fa6a CutFilamentInner(slot); // try cutting filament tip at the last attempt 1fa64: 80 2f mov r24, r16 1fa66: 0f 94 1f 9e call 0x33c3e ; 0x33c3e 1fa6a: fa 94 dec r15 return filament_inserted; } bool MMU2::ToolChangeCommonOnce(uint8_t slot) { static_assert(MAX_RETRIES > 1); // need >1 retries to do the cut in the last attempt for (uint8_t retries = MAX_RETRIES; retries; --retries) { 1fa6c: f1 10 cpse r15, r1 1fa6e: ca cf rjmp .-108 ; 0x1fa04 return false; // couldn't accomplish the task } void MMU2::ToolChangeCommon(uint8_t slot) { while (!ToolChangeCommonOnce(slot)) { // while not successfully fed into extruder's PTFE tube if (planner_draining()) { 1fa70: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 1fa74: 88 23 and r24, r24 1fa76: 09 f4 brne .+2 ; 0x1fa7a 1fa78: ef c0 rjmp .+478 ; 0x1fc58 SetCurrentTool(slot); // filament change is finished SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; } 1fa7a: 67 96 adiw r28, 0x17 ; 23 1fa7c: 0f b6 in r0, 0x3f ; 63 1fa7e: f8 94 cli 1fa80: de bf out 0x3e, r29 ; 62 1fa82: 0f be out 0x3f, r0 ; 63 1fa84: cd bf out 0x3d, r28 ; 61 1fa86: df 91 pop r29 1fa88: cf 91 pop r28 1fa8a: 1f 91 pop r17 1fa8c: 0f 91 pop r16 1fa8e: ff 90 pop r15 1fa90: ef 90 pop r14 1fa92: df 90 pop r13 1fa94: cf 90 pop r12 1fa96: bf 90 pop r11 1fa98: af 90 pop r10 1fa9a: 9f 90 pop r9 1fa9c: 8f 90 pop r8 1fa9e: 7f 90 pop r7 1faa0: 6f 90 pop r6 1faa2: 5f 90 pop r5 1faa4: 4f 90 pop r4 1faa6: 3f 90 pop r3 1faa8: 2f 90 pop r2 1faaa: 08 95 ret if (WhereIsFilament() != FilamentState::AT_FSENSOR) return false; // MMU has finished its load, push the filament further by some defined constant length // If the filament sensor reads 0 at any moment, then report FAILURE const float tryload_length = MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH - logic.ExtraLoadDistance(); 1faac: 60 91 de 12 lds r22, 0x12DE ; 0x8012de 1fab0: 70 e0 ldi r23, 0x00 ; 0 1fab2: 90 e0 ldi r25, 0x00 ; 0 1fab4: 80 e0 ldi r24, 0x00 ; 0 1fab6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1faba: 9b 01 movw r18, r22 1fabc: ac 01 movw r20, r24 1fabe: 66 e6 ldi r22, 0x66 ; 102 1fac0: 76 e6 ldi r23, 0x66 ; 102 1fac2: 8d e9 ldi r24, 0x9D ; 157 1fac4: 92 e4 ldi r25, 0x42 ; 66 1fac6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1faca: 36 2e mov r3, r22 1facc: 87 2e mov r8, r23 1face: 98 2e mov r9, r24 1fad0: e9 2e mov r14, r25 TryLoadUnloadReporter::TryLoadUnloadReporter(float delta_mm) : dpixel0(0) , dpixel1(0) , lcd_cursor_col(0) , pixel_per_mm(0.5F * float(LCD_WIDTH) / (delta_mm)) 1fad2: 26 2f mov r18, r22 1fad4: 37 2f mov r19, r23 1fad6: 48 2f mov r20, r24 1fad8: 59 2f mov r21, r25 1fada: 60 e0 ldi r22, 0x00 ; 0 1fadc: 70 e0 ldi r23, 0x00 ; 0 1fade: 80 e2 ldi r24, 0x20 ; 32 1fae0: 91 e4 ldi r25, 0x41 ; 65 1fae2: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 1fae6: 2b 01 movw r4, r22 1fae8: 3c 01 movw r6, r24 1faea: e5 e6 ldi r30, 0x65 ; 101 1faec: f4 e0 ldi r31, 0x04 ; 4 1faee: 82 2d mov r24, r2 1faf0: 11 92 st Z+, r1 1faf2: 8a 95 dec r24 1faf4: e9 f7 brne .-6 ; 0x1faf0 lcd_status_message_idx = 0; 1faf6: 10 92 64 04 sts 0x0464, r1 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> bool filament_inserted = true; // expect success // Pixel index will go from 0 to 10, then back from 10 to 0 // The change in this number is used to indicate a new pixel // should be drawn on the display for (uint8_t move = 0; move < 2; move++) { extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE); 1fafa: 83 2d mov r24, r3 1fafc: 98 2d mov r25, r8 1fafe: a9 2d mov r26, r9 1fb00: be 2d mov r27, r14 1fb02: bc 01 movw r22, r24 1fb04: cd 01 movw r24, r26 bool filament_inserted = true; // expect success // Pixel index will go from 0 to 10, then back from 10 to 0 // The change in this number is used to indicate a new pixel // should be drawn on the display for (uint8_t move = 0; move < 2; move++) { 1fb06: 91 2c mov r9, r1 1fb08: 31 2c mov r3, r1 1fb0a: e1 2c mov r14, r1 extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE); 1fb0c: 5b 01 movw r10, r22 1fb0e: 6c 01 movw r12, r24 1fb10: d7 fa bst r13, 7 1fb12: d0 94 com r13 1fb14: d7 f8 bld r13, 7 1fb16: d0 94 com r13 1fb18: 20 e0 ldi r18, 0x00 ; 0 1fb1a: 30 e0 ldi r19, 0x00 ; 0 1fb1c: 48 e4 ldi r20, 0x48 ; 72 1fb1e: 52 e4 ldi r21, 0x42 ; 66 1fb20: 0f 94 d6 50 call 0x2a1ac ; 0x2a1ac return(block); } // Returns true if the buffer has a queued block, false otherwise FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); 1fb24: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 1fb28: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f while (planner_any_moves()) { 1fb2c: 98 17 cp r25, r24 1fb2e: 09 f4 brne .+2 ; 0x1fb32 1fb30: 49 c0 rjmp .+146 ; 0x1fbc4 filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR); 1fb32: 11 23 and r17, r17 1fb34: 31 f0 breq .+12 ; 0x1fb42 1fb36: 0f 94 0a 51 call 0x2a214 ; 0x2a214 1fb3a: 11 e0 ldi r17, 0x01 ; 1 1fb3c: 81 30 cpi r24, 0x01 ; 1 1fb3e: 09 f0 breq .+2 ; 0x1fb42 1fb40: 10 e0 ldi r17, 0x00 ; 0 float planner_get_machine_position_E_mm() { return current_position[E_AXIS]; } float stepper_get_machine_position_E_mm() { return st_get_position_mm(E_AXIS); 1fb42: 83 e0 ldi r24, 0x03 ; 3 1fb44: 0f 94 e7 1a call 0x235ce ; 0x235ce if (!lcd_update_enabled) lcdui_print_status_line(); } void TryLoadUnloadReporter::Progress(bool sensorState){ // Always round up, you can only have 'whole' pixels. (floor is also an option) dpixel1 = ceil((stepper_get_machine_position_E_mm() - planner_get_current_position_E()) * pixel_per_mm); 1fb48: 20 91 6d 12 lds r18, 0x126D ; 0x80126d 1fb4c: 30 91 6e 12 lds r19, 0x126E ; 0x80126e 1fb50: 40 91 6f 12 lds r20, 0x126F ; 0x80126f 1fb54: 50 91 70 12 lds r21, 0x1270 ; 0x801270 1fb58: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1fb5c: a3 01 movw r20, r6 1fb5e: 92 01 movw r18, r4 1fb60: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1fb64: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 1fb68: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 1fb6c: 86 2e mov r8, r22 if (dpixel1 - dpixel0) { 1fb6e: e6 16 cp r14, r22 1fb70: c1 f0 breq .+48 ; 0x1fba2 1fb72: e3 2d mov r30, r3 1fb74: e4 31 cpi r30, 0x14 ; 20 1fb76: 08 f0 brcs .+2 ; 0x1fb7a 1fb78: e3 e1 ldi r30, 0x13 ; 19 dpixel0 = dpixel1; if (lcd_cursor_col > (LCD_WIDTH - 1)) lcd_cursor_col = LCD_WIDTH - 1; Render(lcd_cursor_col++, sensorState); 1fb7a: 33 24 eor r3, r3 1fb7c: 33 94 inc r3 1fb7e: 3e 0e add r3, r30 } void TryLoadUnloadReporter::Render(uint8_t col, bool sensorState) { // Set the cursor position each time in case some other // part of the firmware changes the cursor position lcd_insert_char_into_status(col, sensorState ? LCD_STR_SOLID_BLOCK[0] : '-'); 1fb80: 8f ef ldi r24, 0xFF ; 255 1fb82: 11 11 cpse r17, r1 1fb84: 01 c0 rjmp .+2 ; 0x1fb88 1fb86: 8d e2 ldi r24, 0x2D ; 45 } void lcd_insert_char_into_status(uint8_t position, const char message) { if (position > LCD_WIDTH - 1) return; lcd_status_message[position] = message; 1fb88: f0 e0 ldi r31, 0x00 ; 0 1fb8a: eb 59 subi r30, 0x9B ; 155 1fb8c: fb 4f sbci r31, 0xFB ; 251 1fb8e: 80 83 st Z, r24 lcd_draw_update = 1; // force redraw 1fb90: 91 e0 ldi r25, 0x01 ; 1 1fb92: 90 93 59 02 sts 0x0259, r25 ; 0x800259 if (!lcd_update_enabled) lcdui_print_status_line(); 1fb96: 80 91 5a 02 lds r24, 0x025A ; 0x80025a 1fb9a: 81 11 cpse r24, r1 1fb9c: 02 c0 rjmp .+4 ; 0x1fba2 1fb9e: 0f 94 cb 0e call 0x21d96 ; 0x21d96 void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 1fba2: 90 e0 ldi r25, 0x00 ; 0 1fba4: 80 e0 ldi r24, 0x00 ; 0 1fba6: 0e 94 8e 8e call 0x11d1c ; 0x11d1c } void TryLoadUnloadReporter::Progress(bool sensorState){ // Always round up, you can only have 'whole' pixels. (floor is also an option) dpixel1 = ceil((stepper_get_machine_position_E_mm() - planner_get_current_position_E()) * pixel_per_mm); 1fbaa: e8 2c mov r14, r8 tlur.Progress(filament_inserted); safe_delay_keep_alive(0); if (planner_draining()) { 1fbac: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 1fbb0: 88 23 and r24, r24 1fbb2: 09 f4 brne .+2 ; 0x1fbb6 1fbb4: b7 cf rjmp .-146 ; 0x1fb24 return false; // power panic or a similar issue happened, bail out fast 1fbb6: 10 e0 ldi r17, 0x00 ; 0 1fbb8: 37 c0 rjmp .+110 ; 0x1fc28 bool filament_inserted = true; // expect success // Pixel index will go from 0 to 10, then back from 10 to 0 // The change in this number is used to indicate a new pixel // should be drawn on the display for (uint8_t move = 0; move < 2; move++) { extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE); 1fbba: c6 01 movw r24, r12 1fbbc: b5 01 movw r22, r10 1fbbe: 99 24 eor r9, r9 1fbc0: 93 94 inc r9 1fbc2: aa cf rjmp .-172 ; 0x1fb18 bool filament_inserted = true; // expect success // Pixel index will go from 0 to 10, then back from 10 to 0 // The change in this number is used to indicate a new pixel // should be drawn on the display for (uint8_t move = 0; move < 2; move++) { 1fbc4: 91 e0 ldi r25, 0x01 ; 1 1fbc6: 99 12 cpse r9, r25 1fbc8: f8 cf rjmp .-16 ; 0x1fbba return false; // power panic or a similar issue happened, bail out fast } } } Disable_E0(); 1fbca: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 if (!filament_inserted) { 1fbce: 11 11 cpse r17, r1 1fbd0: 08 c0 rjmp .+16 ; 0x1fbe2 eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false); mmu2.Status(); } void IncrementLoadFails(){ eeprom_increment_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL); 1fbd2: 8f ec ldi r24, 0xCF ; 207 1fbd4: 9e e0 ldi r25, 0x0E ; 14 1fbd6: 0e 94 7c 78 call 0xf0f8 ; 0xf0f8 eeprom_increment_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT); 1fbda: 80 ed ldi r24, 0xD0 ; 208 1fbdc: 9e e0 ldi r25, 0x0E ; 14 1fbde: 0e 94 6f 78 call 0xf0de ; 0xf0de memset(lcd_status_message, 0, sizeof(lcd_status_message)); lcd_status_message_idx = 0; } void lcd_getstatus(char buf[LCD_WIDTH]) { strncpy(buf, lcd_status_message, LCD_WIDTH); 1fbe2: 44 e1 ldi r20, 0x14 ; 20 1fbe4: 50 e0 ldi r21, 0x00 ; 0 1fbe6: 65 e6 ldi r22, 0x65 ; 101 1fbe8: 74 e0 ldi r23, 0x04 ; 4 1fbea: ce 01 movw r24, r28 1fbec: 01 96 adiw r24, 0x01 ; 1 1fbee: 0f 94 60 aa call 0x354c0 ; 0x354c0 1fbf2: fe 01 movw r30, r28 1fbf4: 31 96 adiw r30, 0x01 ; 1 char buf[LCD_WIDTH + 1]; lcd_getstatus(buf); for (uint8_t i = 0; i < sizeof(buf); i++) { // 0xFF is -1 when converting from unsigned to signed char // If the number is negative, that means filament is present buf[i] = (buf[i] < 0) ? '1' : '0'; 1fbf6: 81 91 ld r24, Z+ 1fbf8: 87 fd sbrc r24, 7 1fbfa: 2c c0 rjmp .+88 ; 0x1fc54 1fbfc: 80 e3 ldi r24, 0x30 ; 48 1fbfe: df 01 movw r26, r30 1fc00: 11 97 sbiw r26, 0x01 ; 1 1fc02: 8c 93 st X, r24 } void TryLoadUnloadReporter::DumpToSerial(){ char buf[LCD_WIDTH + 1]; lcd_getstatus(buf); for (uint8_t i = 0; i < sizeof(buf); i++) { 1fc04: 8e 89 ldd r24, Y+22 ; 0x16 1fc06: 9f 89 ldd r25, Y+23 ; 0x17 1fc08: 8e 17 cp r24, r30 1fc0a: 9f 07 cpc r25, r31 1fc0c: a1 f7 brne .-24 ; 0x1fbf6 // 0xFF is -1 when converting from unsigned to signed char // If the number is negative, that means filament is present buf[i] = (buf[i] < 0) ? '1' : '0'; } buf[LCD_WIDTH] = 0; 1fc0e: 1d 8a std Y+21, r1 ; 0x15 MMU2_ECHO_MSGLN(buf); 1fc10: 8e ec ldi r24, 0xCE ; 206 1fc12: 91 ea ldi r25, 0xA1 ; 161 1fc14: 0e 94 c4 7a call 0xf588 ; 0xf588 1fc18: 80 ea ldi r24, 0xA0 ; 160 1fc1a: 97 e8 ldi r25, 0x87 ; 135 1fc1c: 0e 94 c4 7a call 0xf588 ; 0xf588 1fc20: ce 01 movw r24, r28 1fc22: 01 96 adiw r24, 0x01 ; 1 1fc24: 0e 94 a1 87 call 0x10f42 ; 0x10f42 SERIAL_ECHOLN(message); } void lcd_reset_status_message_timeout() { lcd_status_message_timeout.start(); 1fc28: 8a e7 ldi r24, 0x7A ; 122 1fc2a: 94 e0 ldi r25, 0x04 ; 4 1fc2c: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> UnloadInner(); // if we run out of retries, we must do something ... may be raise an error screen and allow the user to do something // but honestly - if the MMU restarts during every toolchange, // something else is seriously broken and stopping a print is probably our best option. } if (VerifyFilamentEnteredPTFE()) { 1fc30: 11 23 and r17, r17 1fc32: 09 f4 brne .+2 ; 0x1fc36 1fc34: 0c cf rjmp .-488 ; 0x1fa4e // If manage_response returns false at this spot (MMU operation interrupted aka MMU reset) // we can safely continue because the MMU is not doing an operation now. static_cast(manage_response(true, true)); // yes, I'd like to silence [[nodiscard]] warning at this spot by casting to void } SetCurrentTool(slot); // filament change is finished 1fc36: 80 2f mov r24, r16 1fc38: 0f 94 c7 65 call 0x2cb8e ; 0x2cb8e } } void SpoolJoin::setSlot(uint8_t slot) { currentMMUSlot = slot; 1fc3c: 00 93 90 12 sts 0x1290, r16 ; 0x801290 SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; 1fc40: 80 91 05 13 lds r24, 0x1305 ; 0x801305 1fc44: 90 91 06 13 lds r25, 0x1306 ; 0x801306 1fc48: 01 96 adiw r24, 0x01 ; 1 1fc4a: 90 93 06 13 sts 0x1306, r25 ; 0x801306 1fc4e: 80 93 05 13 sts 0x1305, r24 ; 0x801305 1fc52: 13 cf rjmp .-474 ; 0x1fa7a char buf[LCD_WIDTH + 1]; lcd_getstatus(buf); for (uint8_t i = 0; i < sizeof(buf); i++) { // 0xFF is -1 when converting from unsigned to signed char // If the number is negative, that means filament is present buf[i] = (buf[i] < 0) ? '1' : '0'; 1fc54: 81 e3 ldi r24, 0x31 ; 49 1fc56: d3 cf rjmp .-90 ; 0x1fbfe void SetInAutoRetry(bool iar) { inAutoRetry = iar; } inline void SetPrinterError(ErrorCode ec) { explicitPrinterError = ec; 1fc58: 8a e2 ldi r24, 0x2A ; 42 1fc5a: 90 e8 ldi r25, 0x80 ; 128 1fc5c: 90 93 93 12 sts 0x1293, r25 ; 0x801293 1fc60: 80 93 92 12 sts 0x1292, r24 ; 0x801292 logic.SetPrinterError(ErrorCode::LOAD_TO_EXTRUDER_FAILED); // We only have to wait for the user to fix the issue and press "Retry". // Please see CheckUserInput() for details how we "leave" manage_response. // If manage_response returns false at this spot (MMU operation interrupted aka MMU reset) // we can safely continue because the MMU is not doing an operation now. static_cast(manage_response(true, true)); // yes, I'd like to silence [[nodiscard]] warning at this spot by casting to void 1fc64: 61 e0 ldi r22, 0x01 ; 1 1fc66: 81 e0 ldi r24, 0x01 ; 1 1fc68: 0f 94 aa 9c call 0x33954 ; 0x33954 1fc6c: c7 ce rjmp .-626 ; 0x1f9fc 0001fc6e : } ScreenUpdateEnable(); return true; } bool MMU2::load_filament_to_nozzle(uint8_t slot) { 1fc6e: cf 93 push r28 1fc70: df 93 push r29 1fc72: d8 2f mov r29, r24 if (!WaitForMMUReady()) { 1fc74: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1fc78: c8 2f mov r28, r24 1fc7a: 88 23 and r24, r24 1fc7c: 49 f1 breq .+82 ; 0x1fcd0 safe_delay_keep_alive(delay); } } void WaitForHotendTargetTempBeep() { waitForHotendTargetTemp(200, [] {}); 1fc7e: 88 ec ldi r24, 0xC8 ; 200 1fc80: 90 e0 ldi r25, 0x00 ; 0 1fc82: 0f 94 58 54 call 0x2a8b0 ; 0x2a8b0 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]> bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 1fc86: 82 e0 ldi r24, 0x02 ; 2 1fc88: 0f 94 ad 25 call 0x24b5a ; 0x24b5a void FullScreenMsgTest(uint8_t slot){ FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot); } void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); 1fc8c: 8d ee ldi r24, 0xED ; 237 1fc8e: 91 e6 ldi r25, 0x61 ; 97 1fc90: 0e 94 3a 75 call 0xea74 ; 0xea74 1fc94: 6d 2f mov r22, r29 1fc96: 0f 94 09 50 call 0x2a012 ; 0x2a012 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 1fc9a: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 FullScreenMsgLoad(slot); { // used for MMU-menu operation "Load to Nozzle" ReportingRAII rep(CommandInProgress::ToolChange); FSensorBlockRunout blockRunout; 1fc9e: 0f 94 2b 79 call 0x2f256 ; 0x2f256 if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly 1fca2: 80 91 e8 12 lds r24, 0x12E8 ; 0x8012e8 1fca6: 83 36 cpi r24, 0x63 ; 99 1fca8: 29 f0 breq .+10 ; 0x1fcb4 return ss; } void MMU2::filament_ramming() { execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); 1fcaa: 62 e1 ldi r22, 0x12 ; 18 1fcac: 8c e1 ldi r24, 0x1C ; 28 1fcae: 9d e9 ldi r25, 0x9D ; 157 1fcb0: 0f 94 7d 79 call 0x2f2fa ; 0x2f2fa if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly filament_ramming(); } ToolChangeCommon(slot); 1fcb4: 8d 2f mov r24, r29 1fcb6: 0e 94 df fc call 0x1f9be ; 0x1f9be // Finish loading to the nozzle with finely tuned steps. execute_load_to_nozzle_sequence(); 1fcba: 0e 94 09 be call 0x17c12 ; 0x17c12 bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 1fcbe: 83 e0 ldi r24, 0x03 ; 3 1fcc0: 0f 94 ad 25 call 0x24b5a ; 0x24b5a #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 1fcc4: 0f 94 95 6d call 0x2db2a ; 0x2db2a explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 1fcc8: 0f 94 9b 79 call 0x2f336 ; 0x2f336 // Finish loading to the nozzle with finely tuned steps. execute_load_to_nozzle_sequence(); MakeSound(Confirm); } ScreenUpdateEnable(); 1fccc: 0f 94 06 50 call 0x2a00c ; 0x2a00c return true; } 1fcd0: 8c 2f mov r24, r28 1fcd2: df 91 pop r29 1fcd4: cf 91 pop r28 1fcd6: 08 95 ret 0001fcd8 : MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); MENU_END(); } static inline void lcd_mmu_load_to_nozzle_wrapper(uint8_t index){ MMU2::mmu2.load_filament_to_nozzle(index); 1fcd8: 0e 94 37 fe call 0x1fc6e ; 0x1fc6e // Extrude a little bit of filament so the user // can see the color is correct load_filament_final_feed(); 1fcdc: 0e 94 ed 63 call 0xc7da ; 0xc7da st_synchronize(); 1fce0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Ask user if the extruded color is correct: lcd_return_to_status(); 1fce4: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_load_filament_color_check(); 1fce8: 0f 94 07 1b call 0x2360e ; 0x2360e lcd_setstatuspgm(MSG_WELCOME); 1fcec: 86 ee ldi r24, 0xE6 ; 230 1fcee: 9b e6 ldi r25, 0x6B ; 107 1fcf0: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = CustomMsg::Status; 1fcf4: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d // Clear the filament action clearFilamentAction(); 1fcf8: 0d 94 d6 0b jmp 0x217ac ; 0x217ac 0001fcfc : SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; } bool MMU2::tool_change(uint8_t slot) { 1fcfc: cf 93 push r28 1fcfe: df 93 push r29 1fd00: d8 2f mov r29, r24 if (!WaitForMMUReady()) { 1fd02: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1fd06: c8 2f mov r28, r24 1fd08: 88 23 and r24, r24 1fd0a: b9 f0 breq .+46 ; 0x1fd3a return false; } if (slot != extruder) { 1fd0c: 80 91 e8 12 lds r24, 0x12E8 ; 0x8012e8 1fd10: 8d 17 cp r24, r29 1fd12: 99 f0 breq .+38 ; 0x1fd3a current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS; planner_line_to_current_position_sync(NOZZLE_PARK_XY_FEEDRATE); } bool marlin_printingIsActive() { return printer_active(); 1fd14: 0e 94 91 66 call 0xcd22 ; 0xcd22 if (/*FindaDetectsFilament()*/ 1fd18: 81 11 cpse r24, r1 1fd1a: 02 c0 rjmp .+4 ; 0x1fd20 /*!IS_SD_PRINTING && !usb_timer.running()*/ !marlin_printingIsActive()) { // If Tcodes are used manually through the serial // we need to unload manually as well -- but only if FINDA detects filament unload(); 1fd1c: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 1fd20: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 // we need to unload manually as well -- but only if FINDA detects filament unload(); } ReportingRAII rep(CommandInProgress::ToolChange); FSensorBlockRunout blockRunout; 1fd24: 0f 94 2b 79 call 0x2f256 ; 0x2f256 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 1fd28: 0f 94 fb 1a call 0x235f6 ; 0x235f6 planner_synchronize(); ToolChangeCommon(slot); 1fd2c: 8d 2f mov r24, r29 1fd2e: 0e 94 df fc call 0x1f9be ; 0x1f9be 1fd32: 0f 94 95 6d call 0x2db2a ; 0x2db2a explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 1fd36: 0f 94 9b 79 call 0x2f336 ; 0x2f336 FSensorBlockRunout blockRunout; planner_synchronize(); ToolChangeCommon(slot); } return true; } 1fd3a: 8c 2f mov r24, r28 1fd3c: df 91 pop r29 1fd3e: cf 91 pop r28 1fd40: 08 95 ret 0001fd42 : /// Handle special T?/Tx/Tc commands /// ///- T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically ///- Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. ///- Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. bool MMU2::tool_change(char code, uint8_t slot) { 1fd42: 1f 93 push r17 1fd44: cf 93 push r28 1fd46: df 93 push r29 1fd48: c8 2f mov r28, r24 1fd4a: 16 2f mov r17, r22 if (!WaitForMMUReady()) { 1fd4c: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1fd50: d8 2f mov r29, r24 1fd52: 88 23 and r24, r24 1fd54: 89 f0 breq .+34 ; 0x1fd78 return false; } FSensorBlockRunout blockRunout; 1fd56: 0f 94 2b 79 call 0x2f256 ; 0x2f256 switch (code) { 1fd5a: c3 36 cpi r28, 0x63 ; 99 1fd5c: 01 f1 breq .+64 ; 0x1fd9e 1fd5e: c8 37 cpi r28, 0x78 ; 120 1fd60: 81 f0 breq .+32 ; 0x1fd82 1fd62: cf 33 cpi r28, 0x3F ; 63 1fd64: 39 f4 brne .+14 ; 0x1fd74 case '?': { waitForHotendTargetTemp(100, [] {}); 1fd66: 84 e6 ldi r24, 0x64 ; 100 1fd68: 90 e0 ldi r25, 0x00 ; 0 1fd6a: 0f 94 58 54 call 0x2a8b0 ; 0x2a8b0 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]> load_filament_to_nozzle(slot); 1fd6e: 81 2f mov r24, r17 1fd70: 0e 94 37 fe call 0x1fc6e ; 0x1fc6e 1fd74: 0f 94 95 6d call 0x2db2a ; 0x2db2a execute_load_to_nozzle_sequence(); } break; } return true; } 1fd78: 8d 2f mov r24, r29 1fd7a: df 91 pop r29 1fd7c: cf 91 pop r28 1fd7e: 1f 91 pop r17 1fd80: 08 95 ret } #ifdef PREVENT_DANGEROUS_EXTRUDE void set_extrude_min_temp(int temp) { extrude_min_temp = temp; 1fd82: 10 92 58 02 sts 0x0258, r1 ; 0x800258 1fd86: 10 92 57 02 sts 0x0257, r1 ; 0x800257 load_filament_to_nozzle(slot); } break; case 'x': { thermal_setExtrudeMintemp(0); // Allow cold extrusion since Tx only loads to the gears not nozzle tool_change(slot); 1fd8a: 81 2f mov r24, r17 1fd8c: 0e 94 7e fe call 0x1fcfc ; 0x1fcfc 1fd90: 8f ea ldi r24, 0xAF ; 175 1fd92: 90 e0 ldi r25, 0x00 ; 0 1fd94: 90 93 58 02 sts 0x0258, r25 ; 0x800258 1fd98: 80 93 57 02 sts 0x0257, r24 ; 0x800257 1fd9c: eb cf rjmp .-42 ; 0x1fd74 thermal_setExtrudeMintemp(EXTRUDE_MINTEMP); } break; case 'c': { waitForHotendTargetTemp(100, [] {}); 1fd9e: 84 e6 ldi r24, 0x64 ; 100 1fda0: 90 e0 ldi r25, 0x00 ; 0 1fda2: 0f 94 58 54 call 0x2a8b0 ; 0x2a8b0 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]> execute_load_to_nozzle_sequence(); 1fda6: 0e 94 09 be call 0x17c12 ; 0x17c12 1fdaa: e4 cf rjmp .-56 ; 0x1fd74 0001fdac : // Clear the filament action clearFilamentAction(); } static inline void loading_test_wrapper(uint8_t i){ 1fdac: cf 93 push r28 1fdae: c8 2f mov r28, r24 void FullScreenMsgEject(uint8_t slot){ FullScreenMsg(_T(MSG_EJECT_FROM_MMU), slot); } void FullScreenMsgTest(uint8_t slot){ FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot); 1fdb0: 8a e6 ldi r24, 0x6A ; 106 1fdb2: 96 e4 ldi r25, 0x46 ; 70 1fdb4: 0e 94 3a 75 call 0xea74 ; 0xea74 1fdb8: 6c 2f mov r22, r28 1fdba: 0f 94 09 50 call 0x2a012 ; 0x2a012 return true; } bool MMU2::loading_test(uint8_t slot) { FullScreenMsgTest(slot); tool_change(slot); 1fdbe: 8c 2f mov r24, r28 1fdc0: 0e 94 7e fe call 0x1fcfc ; 0x1fcfc 1fdc4: 0f 94 fb 1a call 0x235f6 ; 0x235f6 planner_synchronize(); unload(); 1fdc8: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 ScreenUpdateEnable(); 1fdcc: 0f 94 06 50 call 0x2a00c ; 0x2a00c MMU2::mmu2.loading_test(i); // Clear the filament action clearFilamentAction(); } 1fdd0: cf 91 pop r28 static inline void loading_test_wrapper(uint8_t i){ MMU2::mmu2.loading_test(i); // Clear the filament action clearFilamentAction(); 1fdd2: 0d 94 d6 0b jmp 0x217ac ; 0x217ac 0001fdd6 : static void mmu_cut_filament_menu() { mmu_common_choose_filament_menu(_T(MSG_CUT_FILAMENT), mmu_cut_filament_wrapper); } #endif //MMU_HAS_CUTTER static inline void loading_test_all_wrapper(){ 1fdd6: cf 93 push r28 for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ 1fdd8: c0 e0 ldi r28, 0x00 ; 0 1fdda: 8a e6 ldi r24, 0x6A ; 106 1fddc: 96 e4 ldi r25, 0x46 ; 70 1fdde: 0e 94 3a 75 call 0xea74 ; 0xea74 1fde2: 6c 2f mov r22, r28 1fde4: 0f 94 09 50 call 0x2a012 ; 0x2a012 return true; } bool MMU2::loading_test(uint8_t slot) { FullScreenMsgTest(slot); tool_change(slot); 1fde8: 8c 2f mov r24, r28 1fdea: 0e 94 7e fe call 0x1fcfc ; 0x1fcfc 1fdee: 0f 94 fb 1a call 0x235f6 ; 0x235f6 planner_synchronize(); unload(); 1fdf2: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 ScreenUpdateEnable(); 1fdf6: 0f 94 06 50 call 0x2a00c ; 0x2a00c 1fdfa: cf 5f subi r28, 0xFF ; 255 1fdfc: c5 30 cpi r28, 0x05 ; 5 1fdfe: 69 f7 brne .-38 ; 0x1fdda MMU2::mmu2.loading_test(i); } // Clear the filament action clearFilamentAction(); } 1fe00: cf 91 pop r28 for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ MMU2::mmu2.loading_test(i); } // Clear the filament action clearFilamentAction(); 1fe02: 0d 94 d6 0b jmp 0x217ac ; 0x217ac 0001fe06 : void MMU2::PowerOn() { power_on(); } bool MMU2::ReadRegister(uint8_t address) { 1fe06: 1f 93 push r17 1fe08: cf 93 push r28 1fe0a: df 93 push r29 1fe0c: 00 d0 rcall .+0 ; 0x1fe0e 1fe0e: 1f 92 push r1 1fe10: 1f 92 push r1 1fe12: cd b7 in r28, 0x3d ; 61 1fe14: de b7 in r29, 0x3e ; 62 1fe16: 18 2f mov r17, r24 if (!WaitForMMUReady()) { 1fe18: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 1fe1c: 88 23 and r24, r24 1fe1e: d9 f0 breq .+54 ; 0x1fe56 void ProtocolLogic::Home(uint8_t mode) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Home, mode)); } void ProtocolLogic::ReadRegister(uint8_t address) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address)); 1fe20: 41 2f mov r20, r17 1fe22: 62 e5 ldi r22, 0x52 ; 82 1fe24: ce 01 movw r24, r28 1fe26: 01 96 adiw r24, 0x01 ; 1 1fe28: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 1fe2c: 49 81 ldd r20, Y+1 ; 0x01 1fe2e: 5a 81 ldd r21, Y+2 ; 0x02 1fe30: 6b 81 ldd r22, Y+3 ; 0x03 1fe32: 7c 81 ldd r23, Y+4 ; 0x04 1fe34: 8d 81 ldd r24, Y+5 ; 0x05 1fe36: 0f 94 19 95 call 0x32a32 ; 0x32a32 return false; } do { logic.ReadRegister(address); // we may signal the accepted/rejected status of the response as return value of this function } while (!manage_response(false, false)); 1fe3a: 60 e0 ldi r22, 0x00 ; 0 1fe3c: 80 e0 ldi r24, 0x00 ; 0 1fe3e: 0f 94 aa 9c call 0x33954 ; 0x33954 1fe42: 88 23 and r24, r24 1fe44: 69 f3 breq .-38 ; 0x1fe20 // Update cached value lastReadRegisterValue = logic.rsp.paramValue; 1fe46: 20 91 ad 12 lds r18, 0x12AD ; 0x8012ad 1fe4a: 30 91 ae 12 lds r19, 0x12AE ; 0x8012ae 1fe4e: 30 93 fe 12 sts 0x12FE, r19 ; 0x8012fe 1fe52: 20 93 fd 12 sts 0x12FD, r18 ; 0x8012fd return true; } 1fe56: 0f 90 pop r0 1fe58: 0f 90 pop r0 1fe5a: 0f 90 pop r0 1fe5c: 0f 90 pop r0 1fe5e: 0f 90 pop r0 1fe60: df 91 pop r29 1fe62: cf 91 pop r28 1fe64: 1f 91 pop r17 1fe66: 08 95 ret 0001fe68 : lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] ); menu_back_if_clicked(); } static uint16_t __attribute__((noinline)) clamp999(uint16_t v){ return v > 999 ? 999 : v; 1fe68: 88 3e cpi r24, 0xE8 ; 232 1fe6a: 23 e0 ldi r18, 0x03 ; 3 1fe6c: 92 07 cpc r25, r18 1fe6e: 10 f0 brcs .+4 ; 0x1fe74 1fe70: 87 ee ldi r24, 0xE7 ; 231 1fe72: 93 e0 ldi r25, 0x03 ; 3 } 1fe74: 08 95 ret 0001fe76 : return 0; } static int uart2_getchar(_UNUSED FILE *stream) { if (rbuf_empty(uart2_ibuf)) return -1; 1fe76: 90 91 47 0d lds r25, 0x0D47 ; 0x800d47 1fe7a: 80 91 46 0d lds r24, 0x0D46 ; 0x800d46 1fe7e: 2f ef ldi r18, 0xFF ; 255 1fe80: 3f ef ldi r19, 0xFF ; 255 1fe82: 89 17 cp r24, r25 1fe84: 71 f0 breq .+28 ; 0x1fea2 _lock(); //lock uint8_t buf_w = ptr[1]; //get write index uint8_t buf_r = ptr[2]; //get read index _unlock(); //unlock if (buf_r == buf_w) return -1; //return -1 to signal buffer empty int ret = ptr[4 + buf_r]; //get byte from buffer 1fe86: e9 2f mov r30, r25 1fe88: f0 e0 ldi r31, 0x00 ; 0 1fe8a: e7 5b subi r30, 0xB7 ; 183 1fe8c: f2 4f sbci r31, 0xF2 ; 242 1fe8e: 20 81 ld r18, Z 1fe90: 30 e0 ldi r19, 0x00 ; 0 buf_r++; //increment read index 1fe92: 9f 5f subi r25, 0xFF ; 255 uint8_t buf_l = ptr[0]; //get length if (buf_r >= buf_l) buf_r = 0; //rotate read index 1fe94: 80 91 45 0d lds r24, 0x0D45 ; 0x800d45 1fe98: 98 17 cp r25, r24 1fe9a: 08 f0 brcs .+2 ; 0x1fe9e 1fe9c: 90 e0 ldi r25, 0x00 ; 0 ptr[2] = buf_r; //store read index 1fe9e: 90 93 47 0d sts 0x0D47, r25 ; 0x800d47 return rbuf_get(uart2_ibuf); } 1fea2: c9 01 movw r24, r18 1fea4: 08 95 ret 0001fea6 : uint8_t uart2_ibuf[20] = {0, 0}; FILE _uart2io; static int uart2_putchar(char c, _UNUSED FILE *stream) { while (!uart2_txready); 1fea6: 90 91 d0 00 lds r25, 0x00D0 ; 0x8000d0 <__TEXT_REGION_LENGTH__+0x7c20d0> 1feaa: 95 ff sbrs r25, 5 1feac: fc cf rjmp .-8 ; 0x1fea6 UDR2 = c; // transmit byte 1feae: 80 93 d6 00 sts 0x00D6, r24 ; 0x8000d6 <__TEXT_REGION_LENGTH__+0x7c20d6> return 0; } 1feb2: 90 e0 ldi r25, 0x00 ; 0 1feb4: 80 e0 ldi r24, 0x00 ; 0 1feb6: 08 95 ret 0001feb8 : } unsigned long micros2(void) { unsigned long m; uint8_t oldSREG = SREG, t; 1feb8: 3f b7 in r19, 0x3f ; 63 cli(); 1feba: f8 94 cli m = timer2_overflow_count; 1febc: 80 91 fc 05 lds r24, 0x05FC ; 0x8005fc 1fec0: 90 91 fd 05 lds r25, 0x05FD ; 0x8005fd 1fec4: a0 91 fe 05 lds r26, 0x05FE ; 0x8005fe 1fec8: b0 91 ff 05 lds r27, 0x05FF ; 0x8005ff #if defined(TCNT2) t = TCNT2; 1fecc: 20 91 b2 00 lds r18, 0x00B2 ; 0x8000b2 <__TEXT_REGION_LENGTH__+0x7c20b2> t = TCNT2L; #else #error TIMER 2 not defined #endif #ifdef TIFR2 if ((TIFR2 & _BV(TOV2)) && (t < 255)) 1fed0: b8 9b sbis 0x17, 0 ; 23 1fed2: 05 c0 rjmp .+10 ; 0x1fede 1fed4: 2f 3f cpi r18, 0xFF ; 255 1fed6: 19 f0 breq .+6 ; 0x1fede m++; 1fed8: 01 96 adiw r24, 0x01 ; 1 1feda: a1 1d adc r26, r1 1fedc: b1 1d adc r27, r1 #else if ((TIFR & _BV(TOV2)) && (t < 255)) m++; #endif SREG = oldSREG; 1fede: 3f bf out 0x3f, r19 ; 63 return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); 1fee0: ba 2f mov r27, r26 1fee2: a9 2f mov r26, r25 1fee4: 98 2f mov r25, r24 1fee6: 88 27 eor r24, r24 1fee8: bc 01 movw r22, r24 1feea: cd 01 movw r24, r26 1feec: 62 0f add r22, r18 1feee: 71 1d adc r23, r1 1fef0: 81 1d adc r24, r1 1fef2: 91 1d adc r25, r1 1fef4: 42 e0 ldi r20, 0x02 ; 2 1fef6: 66 0f add r22, r22 1fef8: 77 1f adc r23, r23 1fefa: 88 1f adc r24, r24 1fefc: 99 1f adc r25, r25 1fefe: 4a 95 dec r20 1ff00: d1 f7 brne .-12 ; 0x1fef6 } 1ff02: 08 95 ret 0001ff04 : #endif temp_meas_ready = true; } static void temp_mgr_pid() { 1ff04: 2f 92 push r2 1ff06: 3f 92 push r3 1ff08: 4f 92 push r4 1ff0a: 5f 92 push r5 1ff0c: 6f 92 push r6 1ff0e: 7f 92 push r7 1ff10: 8f 92 push r8 1ff12: 9f 92 push r9 1ff14: af 92 push r10 1ff16: bf 92 push r11 1ff18: cf 92 push r12 1ff1a: df 92 push r13 1ff1c: ef 92 push r14 1ff1e: ff 92 push r15 1ff20: 0f 93 push r16 1ff22: 1f 93 push r17 1ff24: cf 93 push r28 1ff26: df 93 push r29 1ff28: cd b7 in r28, 0x3d ; 61 1ff2a: de b7 in r29, 0x3e ; 62 1ff2c: 2e 97 sbiw r28, 0x0e ; 14 1ff2e: 0f b6 in r0, 0x3f ; 63 1ff30: f8 94 cli 1ff32: de bf out 0x3e, r29 ; 62 1ff34: 0f be out 0x3f, r0 ; 63 1ff36: cd bf out 0x3d, r28 ; 61 for(uint8_t e = 0; e < EXTRUDERS; e++) pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]); 1ff38: 20 90 ef 05 lds r2, 0x05EF ; 0x8005ef 1ff3c: 30 90 f0 05 lds r3, 0x05F0 ; 0x8005f0 1ff40: 40 90 f1 05 lds r4, 0x05F1 ; 0x8005f1 1ff44: 50 90 f2 05 lds r5, 0x05F2 ; 0x8005f2 1ff48: 60 90 f3 05 lds r6, 0x05F3 ; 0x8005f3 1ff4c: 70 90 f4 05 lds r7, 0x05F4 ; 0x8005f4 #ifdef PIDTEMP pid_input = current; #ifndef PID_OPENLOOP if(target == 0) { 1ff50: 21 14 cp r2, r1 1ff52: 31 04 cpc r3, r1 1ff54: 39 f4 brne .+14 ; 0x1ff64 pid_output = 0; pid_reset[e] = true; 1ff56: 81 e0 ldi r24, 0x01 ; 1 1ff58: 80 93 c8 05 sts 0x05C8, r24 ; 0x8005c8 if (pid_output > PID_MAX) { if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration pid_output=PID_MAX; } else if (pid_output < 0) { if (pid_error[e] < 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration pid_output=0; 1ff5c: 81 2c mov r8, r1 1ff5e: 91 2c mov r9, r1 1ff60: 54 01 movw r10, r8 1ff62: f9 c0 rjmp .+498 ; 0x20156 #ifndef PID_OPENLOOP if(target == 0) { pid_output = 0; pid_reset[e] = true; } else { pid_error[e] = target - pid_input; 1ff64: b1 01 movw r22, r2 1ff66: 03 2c mov r0, r3 1ff68: 00 0c add r0, r0 1ff6a: 88 0b sbc r24, r24 1ff6c: 99 0b sbc r25, r25 1ff6e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 1ff72: a3 01 movw r20, r6 1ff74: 92 01 movw r18, r4 1ff76: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 1ff7a: 6b 01 movw r12, r22 1ff7c: 7c 01 movw r14, r24 if(pid_reset[e]) { 1ff7e: 80 91 c8 05 lds r24, 0x05C8 ; 0x8005c8 1ff82: 88 23 and r24, r24 1ff84: 91 f0 breq .+36 ; 0x1ffaa iState_sum[e] = 0.0; 1ff86: 10 92 c4 05 sts 0x05C4, r1 ; 0x8005c4 1ff8a: 10 92 c5 05 sts 0x05C5, r1 ; 0x8005c5 1ff8e: 10 92 c6 05 sts 0x05C6, r1 ; 0x8005c6 1ff92: 10 92 c7 05 sts 0x05C7, r1 ; 0x8005c7 dTerm[e] = 0.0; // 'dState_last[e]' initial setting is not necessary (see end of if-statement) 1ff96: 10 92 c0 05 sts 0x05C0, r1 ; 0x8005c0 1ff9a: 10 92 c1 05 sts 0x05C1, r1 ; 0x8005c1 1ff9e: 10 92 c2 05 sts 0x05C2, r1 ; 0x8005c2 1ffa2: 10 92 c3 05 sts 0x05C3, r1 ; 0x8005c3 pid_reset[e] = false; 1ffa6: 10 92 c8 05 sts 0x05C8, r1 ; 0x8005c8 } #ifndef PonM pTerm[e] = cs.Kp * pid_error[e]; 1ffaa: 20 91 cf 0d lds r18, 0x0DCF ; 0x800dcf 1ffae: 30 91 d0 0d lds r19, 0x0DD0 ; 0x800dd0 1ffb2: 40 91 d1 0d lds r20, 0x0DD1 ; 0x800dd1 1ffb6: 50 91 d2 0d lds r21, 0x0DD2 ; 0x800dd2 1ffba: c7 01 movw r24, r14 1ffbc: b6 01 movw r22, r12 1ffbe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 1ffc2: 69 83 std Y+1, r22 ; 0x01 1ffc4: 7a 83 std Y+2, r23 ; 0x02 1ffc6: 8b 83 std Y+3, r24 ; 0x03 1ffc8: 9c 83 std Y+4, r25 ; 0x04 iState_sum[e] += pid_error[e]; 1ffca: 20 91 c4 05 lds r18, 0x05C4 ; 0x8005c4 1ffce: 30 91 c5 05 lds r19, 0x05C5 ; 0x8005c5 1ffd2: 40 91 c6 05 lds r20, 0x05C6 ; 0x8005c6 1ffd6: 50 91 c7 05 lds r21, 0x05C7 ; 0x8005c7 1ffda: c7 01 movw r24, r14 1ffdc: b6 01 movw r22, r12 1ffde: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 1ffe2: 4b 01 movw r8, r22 1ffe4: 5c 01 movw r10, r24 iState_sum[e] = constrain(iState_sum[e], iState_sum_min[e], iState_sum_max[e]); 1ffe6: 20 91 1c 04 lds r18, 0x041C ; 0x80041c <_ZL14iState_sum_min.lto_priv.434> 1ffea: 2d 87 std Y+13, r18 ; 0x0d 1ffec: 30 91 1d 04 lds r19, 0x041D ; 0x80041d <_ZL14iState_sum_min.lto_priv.434+0x1> 1fff0: 39 87 std Y+9, r19 ; 0x09 1fff2: 10 91 1e 04 lds r17, 0x041E ; 0x80041e <_ZL14iState_sum_min.lto_priv.434+0x2> 1fff6: 00 91 1f 04 lds r16, 0x041F ; 0x80041f <_ZL14iState_sum_min.lto_priv.434+0x3> 1fffa: 41 2f mov r20, r17 1fffc: 50 2f mov r21, r16 1fffe: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20002: 87 fd sbrc r24, 7 20004: 17 c0 rjmp .+46 ; 0x20034 20006: 80 91 18 04 lds r24, 0x0418 ; 0x800418 <_ZL14iState_sum_max.lto_priv.435> 2000a: 8d 87 std Y+13, r24 ; 0x0d 2000c: 90 91 19 04 lds r25, 0x0419 ; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1> 20010: 99 87 std Y+9, r25 ; 0x09 20012: 10 91 1a 04 lds r17, 0x041A ; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2> 20016: 00 91 1b 04 lds r16, 0x041B ; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3> 2001a: 9c 01 movw r18, r24 2001c: 41 2f mov r20, r17 2001e: 50 2f mov r21, r16 20020: b4 01 movw r22, r8 20022: c5 01 movw r24, r10 20024: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 20028: 18 16 cp r1, r24 2002a: 24 f0 brlt .+8 ; 0x20034 2002c: 8d 86 std Y+13, r8 ; 0x0d 2002e: 99 86 std Y+9, r9 ; 0x09 20030: 1a 2d mov r17, r10 20032: 0b 2d mov r16, r11 20034: 8d 85 ldd r24, Y+13 ; 0x0d 20036: 99 85 ldd r25, Y+9 ; 0x09 20038: a1 2f mov r26, r17 2003a: b0 2f mov r27, r16 2003c: 80 93 c4 05 sts 0x05C4, r24 ; 0x8005c4 20040: 90 93 c5 05 sts 0x05C5, r25 ; 0x8005c5 20044: a0 93 c6 05 sts 0x05C6, r26 ; 0x8005c6 20048: b0 93 c7 05 sts 0x05C7, r27 ; 0x8005c7 iTerm[e] = cs.Ki * iState_sum[e]; 2004c: 20 91 d3 0d lds r18, 0x0DD3 ; 0x800dd3 20050: 30 91 d4 0d lds r19, 0x0DD4 ; 0x800dd4 20054: 40 91 d5 0d lds r20, 0x0DD5 ; 0x800dd5 20058: 50 91 d6 0d lds r21, 0x0DD6 ; 0x800dd6 2005c: bc 01 movw r22, r24 2005e: 81 2f mov r24, r17 20060: 90 2f mov r25, r16 20062: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 20066: 6d 83 std Y+5, r22 ; 0x05 20068: 7e 83 std Y+6, r23 ; 0x06 2006a: 8f 83 std Y+7, r24 ; 0x07 2006c: 98 87 std Y+8, r25 ; 0x08 // PID_K1 defined in Configuration.h in the PID settings #define K2 (1.0-PID_K1) dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes 2006e: 20 91 bc 05 lds r18, 0x05BC ; 0x8005bc 20072: 30 91 bd 05 lds r19, 0x05BD ; 0x8005bd 20076: 40 91 be 05 lds r20, 0x05BE ; 0x8005be 2007a: 50 91 bf 05 lds r21, 0x05BF ; 0x8005bf 2007e: c3 01 movw r24, r6 20080: b2 01 movw r22, r4 20082: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 20086: 20 91 d7 0d lds r18, 0x0DD7 ; 0x800dd7 2008a: 30 91 d8 0d lds r19, 0x0DD8 ; 0x800dd8 2008e: 40 91 d9 0d lds r20, 0x0DD9 ; 0x800dd9 20092: 50 91 da 0d lds r21, 0x0DDA ; 0x800dda 20096: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2009a: 20 ed ldi r18, 0xD0 ; 208 2009c: 3c ec ldi r19, 0xCC ; 204 2009e: 4c e4 ldi r20, 0x4C ; 76 200a0: 5d e3 ldi r21, 0x3D ; 61 200a2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 200a6: 4b 01 movw r8, r22 200a8: 5c 01 movw r10, r24 200aa: 23 e3 ldi r18, 0x33 ; 51 200ac: 33 e3 ldi r19, 0x33 ; 51 200ae: 43 e7 ldi r20, 0x73 ; 115 200b0: 5f e3 ldi r21, 0x3F ; 63 200b2: 60 91 c0 05 lds r22, 0x05C0 ; 0x8005c0 200b6: 70 91 c1 05 lds r23, 0x05C1 ; 0x8005c1 200ba: 80 91 c2 05 lds r24, 0x05C2 ; 0x8005c2 200be: 90 91 c3 05 lds r25, 0x05C3 ; 0x8005c3 200c2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 200c6: 9b 01 movw r18, r22 200c8: ac 01 movw r20, r24 200ca: c5 01 movw r24, r10 200cc: b4 01 movw r22, r8 200ce: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 200d2: 4b 01 movw r8, r22 200d4: 5c 01 movw r10, r24 200d6: 80 92 c0 05 sts 0x05C0, r8 ; 0x8005c0 200da: 90 92 c1 05 sts 0x05C1, r9 ; 0x8005c1 200de: a0 92 c2 05 sts 0x05C2, r10 ; 0x8005c2 200e2: b0 92 c3 05 sts 0x05C3, r11 ; 0x8005c3 pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used) 200e6: 2d 81 ldd r18, Y+5 ; 0x05 200e8: 3e 81 ldd r19, Y+6 ; 0x06 200ea: 4f 81 ldd r20, Y+7 ; 0x07 200ec: 58 85 ldd r21, Y+8 ; 0x08 200ee: 69 81 ldd r22, Y+1 ; 0x01 200f0: 7a 81 ldd r23, Y+2 ; 0x02 200f2: 8b 81 ldd r24, Y+3 ; 0x03 200f4: 9c 81 ldd r25, Y+4 ; 0x04 200f6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 200fa: a5 01 movw r20, r10 200fc: 94 01 movw r18, r8 200fe: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 20102: 4b 01 movw r8, r22 20104: 5c 01 movw r10, r24 if (pid_output > PID_MAX) { 20106: 20 e0 ldi r18, 0x00 ; 0 20108: 30 e0 ldi r19, 0x00 ; 0 2010a: 4f e7 ldi r20, 0x7F ; 127 2010c: 53 e4 ldi r21, 0x43 ; 67 2010e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 20112: 20 e0 ldi r18, 0x00 ; 0 20114: 30 e0 ldi r19, 0x00 ; 0 20116: a9 01 movw r20, r18 iTerm[e] = cs.Ki * iState_sum[e]; // PID_K1 defined in Configuration.h in the PID settings #define K2 (1.0-PID_K1) dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used) if (pid_output > PID_MAX) { 20118: 18 16 cp r1, r24 2011a: 0c f0 brlt .+2 ; 0x2011e 2011c: 6d c1 rjmp .+730 ; 0x203f8 if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 2011e: c7 01 movw r24, r14 20120: b6 01 movw r22, r12 20122: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 20126: 18 16 cp r1, r24 20128: 84 f4 brge .+32 ; 0x2014a 2012a: a7 01 movw r20, r14 2012c: 96 01 movw r18, r12 2012e: 6d 85 ldd r22, Y+13 ; 0x0d 20130: 79 85 ldd r23, Y+9 ; 0x09 20132: 81 2f mov r24, r17 20134: 90 2f mov r25, r16 20136: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2013a: 60 93 c4 05 sts 0x05C4, r22 ; 0x8005c4 2013e: 70 93 c5 05 sts 0x05C5, r23 ; 0x8005c5 20142: 80 93 c6 05 sts 0x05C6, r24 ; 0x8005c6 20146: 90 93 c7 05 sts 0x05C7, r25 ; 0x8005c7 pid_output=PID_MAX; 2014a: 81 2c mov r8, r1 2014c: 91 2c mov r9, r1 2014e: 3f e7 ldi r19, 0x7F ; 127 20150: a3 2e mov r10, r19 20152: 33 e4 ldi r19, 0x43 ; 67 20154: b3 2e mov r11, r19 dTerm[e] = cs.Kd * (pid_input - dState_last[e]); pid_output = iState_sum[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used) pid_output = constrain(pid_output, 0, PID_MAX); #endif // PonM } dState_last[e] = pid_input; 20156: 40 92 bc 05 sts 0x05BC, r4 ; 0x8005bc 2015a: 50 92 bd 05 sts 0x05BD, r5 ; 0x8005bd 2015e: 60 92 be 05 sts 0x05BE, r6 ; 0x8005be 20162: 70 92 bf 05 sts 0x05BF, r7 ; 0x8005bf pid_output = PID_MAX; } #endif // Check if temperature is within the correct range if((current < maxttemp[e]) && (target != 0)) 20166: 60 91 54 02 lds r22, 0x0254 ; 0x800254 <_ZL8maxttemp.lto_priv.436> 2016a: 70 91 55 02 lds r23, 0x0255 ; 0x800255 <_ZL8maxttemp.lto_priv.436+0x1> 2016e: 07 2e mov r0, r23 20170: 00 0c add r0, r0 20172: 88 0b sbc r24, r24 20174: 99 0b sbc r25, r25 20176: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2017a: 9b 01 movw r18, r22 2017c: ac 01 movw r20, r24 2017e: c3 01 movw r24, r6 20180: b2 01 movw r22, r4 20182: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20186: 87 ff sbrs r24, 7 20188: 57 c1 rjmp .+686 ; 0x20438 2018a: 23 28 or r2, r3 2018c: 09 f4 brne .+2 ; 0x20190 2018e: 54 c1 rjmp .+680 ; 0x20438 soft_pwm[e] = (int)pid_output >> 1; 20190: c5 01 movw r24, r10 20192: b4 01 movw r22, r8 20194: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 20198: 75 95 asr r23 2019a: 67 95 ror r22 2019c: 60 93 f5 05 sts 0x05F5, r22 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> static void temp_mgr_pid() { for(uint8_t e = 0; e < EXTRUDERS; e++) pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]); pid_bed(current_temperature_bed_isr, target_temperature_bed_isr); 201a0: 20 91 e8 05 lds r18, 0x05E8 ; 0x8005e8 201a4: 30 91 e9 05 lds r19, 0x05E9 ; 0x8005e9 201a8: 3a 83 std Y+2, r19 ; 0x02 201aa: 29 83 std Y+1, r18 ; 0x01 201ac: 40 90 ea 05 lds r4, 0x05EA ; 0x8005ea 201b0: 50 90 eb 05 lds r5, 0x05EB ; 0x8005eb 201b4: 60 90 ec 05 lds r6, 0x05EC ; 0x8005ec 201b8: 70 90 ed 05 lds r7, 0x05ED ; 0x8005ed #ifdef PIDTEMPBED pid_input = current; #ifndef PID_OPENLOOP pid_error_bed = target - pid_input; 201bc: b9 01 movw r22, r18 201be: 33 0f add r19, r19 201c0: 88 0b sbc r24, r24 201c2: 99 0b sbc r25, r25 201c4: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 201c8: a3 01 movw r20, r6 201ca: 92 01 movw r18, r4 201cc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 201d0: 6b 01 movw r12, r22 201d2: 7c 01 movw r14, r24 pTerm_bed = cs.bedKp * pid_error_bed; 201d4: 20 91 db 0d lds r18, 0x0DDB ; 0x800ddb 201d8: 30 91 dc 0d lds r19, 0x0DDC ; 0x800ddc 201dc: 40 91 dd 0d lds r20, 0x0DDD ; 0x800ddd 201e0: 50 91 de 0d lds r21, 0x0DDE ; 0x800dde 201e4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 201e8: 6d 83 std Y+5, r22 ; 0x05 201ea: 7e 83 std Y+6, r23 ; 0x06 201ec: 8f 83 std Y+7, r24 ; 0x07 201ee: 98 87 std Y+8, r25 ; 0x08 temp_iState_bed += pid_error_bed; 201f0: 20 91 d1 05 lds r18, 0x05D1 ; 0x8005d1 201f4: 30 91 d2 05 lds r19, 0x05D2 ; 0x8005d2 201f8: 40 91 d3 05 lds r20, 0x05D3 ; 0x8005d3 201fc: 50 91 d4 05 lds r21, 0x05D4 ; 0x8005d4 20200: c7 01 movw r24, r14 20202: b6 01 movw r22, r12 20204: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 20208: 5b 01 movw r10, r22 2020a: 8c 01 movw r16, r24 temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); 2020c: 30 91 14 04 lds r19, 0x0414 ; 0x800414 <_ZL19temp_iState_min_bed.lto_priv.432> 20210: 3e 87 std Y+14, r19 ; 0x0e 20212: 80 91 15 04 lds r24, 0x0415 ; 0x800415 <_ZL19temp_iState_min_bed.lto_priv.432+0x1> 20216: 8d 87 std Y+13, r24 ; 0x0d 20218: 30 90 16 04 lds r3, 0x0416 ; 0x800416 <_ZL19temp_iState_min_bed.lto_priv.432+0x2> 2021c: 20 90 17 04 lds r2, 0x0417 ; 0x800417 <_ZL19temp_iState_min_bed.lto_priv.432+0x3> 20220: 23 2f mov r18, r19 20222: 38 2f mov r19, r24 20224: 43 2d mov r20, r3 20226: 52 2d mov r21, r2 20228: b5 01 movw r22, r10 2022a: c8 01 movw r24, r16 2022c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20230: 87 fd sbrc r24, 7 20232: 18 c0 rjmp .+48 ; 0x20264 20234: 90 91 10 04 lds r25, 0x0410 ; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433> 20238: 9e 87 std Y+14, r25 ; 0x0e 2023a: 20 91 11 04 lds r18, 0x0411 ; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1> 2023e: 2d 87 std Y+13, r18 ; 0x0d 20240: 30 90 12 04 lds r3, 0x0412 ; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2> 20244: 20 90 13 04 lds r2, 0x0413 ; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3> 20248: 29 2f mov r18, r25 2024a: 3d 85 ldd r19, Y+13 ; 0x0d 2024c: 43 2d mov r20, r3 2024e: 52 2d mov r21, r2 20250: b5 01 movw r22, r10 20252: c8 01 movw r24, r16 20254: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 20258: 18 16 cp r1, r24 2025a: 24 f0 brlt .+8 ; 0x20264 2025c: ae 86 std Y+14, r10 ; 0x0e 2025e: bd 86 std Y+13, r11 ; 0x0d 20260: 30 2e mov r3, r16 20262: 21 2e mov r2, r17 20264: 8e 85 ldd r24, Y+14 ; 0x0e 20266: 9d 85 ldd r25, Y+13 ; 0x0d 20268: a3 2d mov r26, r3 2026a: b2 2d mov r27, r2 2026c: 80 93 d1 05 sts 0x05D1, r24 ; 0x8005d1 20270: 90 93 d2 05 sts 0x05D2, r25 ; 0x8005d2 20274: a0 93 d3 05 sts 0x05D3, r26 ; 0x8005d3 20278: b0 93 d4 05 sts 0x05D4, r27 ; 0x8005d4 iTerm_bed = cs.bedKi * temp_iState_bed; 2027c: 20 91 df 0d lds r18, 0x0DDF ; 0x800ddf 20280: 30 91 e0 0d lds r19, 0x0DE0 ; 0x800de0 20284: 40 91 e1 0d lds r20, 0x0DE1 ; 0x800de1 20288: 50 91 e2 0d lds r21, 0x0DE2 ; 0x800de2 2028c: bc 01 movw r22, r24 2028e: 83 2d mov r24, r3 20290: 92 2d mov r25, r2 20292: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 20296: 69 87 std Y+9, r22 ; 0x09 20298: 7a 87 std Y+10, r23 ; 0x0a 2029a: 8b 87 std Y+11, r24 ; 0x0b 2029c: 9c 87 std Y+12, r25 ; 0x0c //PID_K1 defined in Configuration.h in the PID settings #define K2 (1.0-PID_K1) dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (PID_K1 * dTerm_bed); 2029e: 20 91 cd 05 lds r18, 0x05CD ; 0x8005cd 202a2: 30 91 ce 05 lds r19, 0x05CE ; 0x8005ce 202a6: 40 91 cf 05 lds r20, 0x05CF ; 0x8005cf 202aa: 50 91 d0 05 lds r21, 0x05D0 ; 0x8005d0 202ae: c3 01 movw r24, r6 202b0: b2 01 movw r22, r4 202b2: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 202b6: 20 91 e3 0d lds r18, 0x0DE3 ; 0x800de3 202ba: 30 91 e4 0d lds r19, 0x0DE4 ; 0x800de4 202be: 40 91 e5 0d lds r20, 0x0DE5 ; 0x800de5 202c2: 50 91 e6 0d lds r21, 0x0DE6 ; 0x800de6 202c6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 202ca: 20 ed ldi r18, 0xD0 ; 208 202cc: 3c ec ldi r19, 0xCC ; 204 202ce: 4c e4 ldi r20, 0x4C ; 76 202d0: 5d e3 ldi r21, 0x3D ; 61 202d2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 202d6: 4b 01 movw r8, r22 202d8: 5c 01 movw r10, r24 202da: 23 e3 ldi r18, 0x33 ; 51 202dc: 33 e3 ldi r19, 0x33 ; 51 202de: 43 e7 ldi r20, 0x73 ; 115 202e0: 5f e3 ldi r21, 0x3F ; 63 202e2: 60 91 c9 05 lds r22, 0x05C9 ; 0x8005c9 202e6: 70 91 ca 05 lds r23, 0x05CA ; 0x8005ca 202ea: 80 91 cb 05 lds r24, 0x05CB ; 0x8005cb 202ee: 90 91 cc 05 lds r25, 0x05CC ; 0x8005cc 202f2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 202f6: 9b 01 movw r18, r22 202f8: ac 01 movw r20, r24 202fa: c5 01 movw r24, r10 202fc: b4 01 movw r22, r8 202fe: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 20302: 4b 01 movw r8, r22 20304: 5c 01 movw r10, r24 20306: 80 92 c9 05 sts 0x05C9, r8 ; 0x8005c9 2030a: 90 92 ca 05 sts 0x05CA, r9 ; 0x8005ca 2030e: a0 92 cb 05 sts 0x05CB, r10 ; 0x8005cb 20312: b0 92 cc 05 sts 0x05CC, r11 ; 0x8005cc temp_dState_bed = pid_input; 20316: 40 92 cd 05 sts 0x05CD, r4 ; 0x8005cd 2031a: 50 92 ce 05 sts 0x05CE, r5 ; 0x8005ce 2031e: 60 92 cf 05 sts 0x05CF, r6 ; 0x8005cf 20322: 70 92 d0 05 sts 0x05D0, r7 ; 0x8005d0 pid_output = pTerm_bed + iTerm_bed - dTerm_bed; 20326: 29 85 ldd r18, Y+9 ; 0x09 20328: 3a 85 ldd r19, Y+10 ; 0x0a 2032a: 4b 85 ldd r20, Y+11 ; 0x0b 2032c: 5c 85 ldd r21, Y+12 ; 0x0c 2032e: 6d 81 ldd r22, Y+5 ; 0x05 20330: 7e 81 ldd r23, Y+6 ; 0x06 20332: 8f 81 ldd r24, Y+7 ; 0x07 20334: 98 85 ldd r25, Y+8 ; 0x08 20336: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2033a: a5 01 movw r20, r10 2033c: 94 01 movw r18, r8 2033e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 20342: 4b 01 movw r8, r22 20344: 5c 01 movw r10, r24 if (pid_output > MAX_BED_POWER) { 20346: 20 e0 ldi r18, 0x00 ; 0 20348: 30 e0 ldi r19, 0x00 ; 0 2034a: 4f e7 ldi r20, 0x7F ; 127 2034c: 53 e4 ldi r21, 0x43 ; 67 2034e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 20352: 20 e0 ldi r18, 0x00 ; 0 20354: 30 e0 ldi r19, 0x00 ; 0 20356: a9 01 movw r20, r18 #define K2 (1.0-PID_K1) dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (PID_K1 * dTerm_bed); temp_dState_bed = pid_input; pid_output = pTerm_bed + iTerm_bed - dTerm_bed; if (pid_output > MAX_BED_POWER) { 20358: 18 16 cp r1, r24 2035a: 0c f0 brlt .+2 ; 0x2035e 2035c: 70 c0 rjmp .+224 ; 0x2043e if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 2035e: c7 01 movw r24, r14 20360: b6 01 movw r22, r12 20362: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 20366: 18 16 cp r1, r24 20368: 84 f4 brge .+32 ; 0x2038a 2036a: a7 01 movw r20, r14 2036c: 96 01 movw r18, r12 2036e: 6e 85 ldd r22, Y+14 ; 0x0e 20370: 7d 85 ldd r23, Y+13 ; 0x0d 20372: 83 2d mov r24, r3 20374: 92 2d mov r25, r2 20376: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2037a: 60 93 d1 05 sts 0x05D1, r22 ; 0x8005d1 2037e: 70 93 d2 05 sts 0x05D2, r23 ; 0x8005d2 20382: 80 93 d3 05 sts 0x05D3, r24 ; 0x8005d3 20386: 90 93 d4 05 sts 0x05D4, r25 ; 0x8005d4 pid_output=MAX_BED_POWER; 2038a: 81 2c mov r8, r1 2038c: 91 2c mov r9, r1 2038e: 9f e7 ldi r25, 0x7F ; 127 20390: a9 2e mov r10, r25 20392: 93 e4 ldi r25, 0x43 ; 67 20394: b9 2e mov r11, r25 #else pid_output = constrain(target, 0, MAX_BED_POWER); #endif //PID_OPENLOOP if(current < BED_MAXTEMP) 20396: 20 e0 ldi r18, 0x00 ; 0 20398: 30 e0 ldi r19, 0x00 ; 0 2039a: 4a ef ldi r20, 0xFA ; 250 2039c: 52 e4 ldi r21, 0x42 ; 66 2039e: c3 01 movw r24, r6 203a0: b2 01 movw r22, r4 203a2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 203a6: 87 ff sbrs r24, 7 203a8: 6d c0 rjmp .+218 ; 0x20484 { soft_pwm_bed = (int)pid_output >> 1; 203aa: c5 01 movw r24, r10 203ac: b4 01 movw r22, r8 203ae: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 203b2: 75 95 asr r23 203b4: 67 95 ror r22 203b6: 60 93 ee 05 sts 0x05EE, r22 ; 0x8005ee soft_pwm_bed = 0; WRITE(HEATER_BED_PIN,LOW); } #endif //BED_LIMIT_SWITCHING if(target==0) 203ba: 89 81 ldd r24, Y+1 ; 0x01 203bc: 9a 81 ldd r25, Y+2 ; 0x02 203be: 89 2b or r24, r25 203c0: 11 f4 brne .+4 ; 0x203c6 { soft_pwm_bed = 0; 203c2: 10 92 ee 05 sts 0x05EE, r1 ; 0x8005ee static void temp_mgr_pid() { for(uint8_t e = 0; e < EXTRUDERS; e++) pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]); pid_bed(current_temperature_bed_isr, target_temperature_bed_isr); } 203c6: 2e 96 adiw r28, 0x0e ; 14 203c8: 0f b6 in r0, 0x3f ; 63 203ca: f8 94 cli 203cc: de bf out 0x3e, r29 ; 62 203ce: 0f be out 0x3f, r0 ; 63 203d0: cd bf out 0x3d, r28 ; 61 203d2: df 91 pop r29 203d4: cf 91 pop r28 203d6: 1f 91 pop r17 203d8: 0f 91 pop r16 203da: ff 90 pop r15 203dc: ef 90 pop r14 203de: df 90 pop r13 203e0: cf 90 pop r12 203e2: bf 90 pop r11 203e4: af 90 pop r10 203e6: 9f 90 pop r9 203e8: 8f 90 pop r8 203ea: 7f 90 pop r7 203ec: 6f 90 pop r6 203ee: 5f 90 pop r5 203f0: 4f 90 pop r4 203f2: 3f 90 pop r3 203f4: 2f 90 pop r2 203f6: 08 95 ret dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used) if (pid_output > PID_MAX) { if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration pid_output=PID_MAX; } else if (pid_output < 0) { 203f8: c5 01 movw r24, r10 203fa: b4 01 movw r22, r8 203fc: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20400: 87 ff sbrs r24, 7 20402: a9 ce rjmp .-686 ; 0x20156 if (pid_error[e] < 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 20404: 20 e0 ldi r18, 0x00 ; 0 20406: 30 e0 ldi r19, 0x00 ; 0 20408: a9 01 movw r20, r18 2040a: c7 01 movw r24, r14 2040c: b6 01 movw r22, r12 2040e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20412: 87 ff sbrs r24, 7 20414: a3 cd rjmp .-1210 ; 0x1ff5c 20416: a7 01 movw r20, r14 20418: 96 01 movw r18, r12 2041a: 6d 85 ldd r22, Y+13 ; 0x0d 2041c: 79 85 ldd r23, Y+9 ; 0x09 2041e: 81 2f mov r24, r17 20420: 90 2f mov r25, r16 20422: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 20426: 60 93 c4 05 sts 0x05C4, r22 ; 0x8005c4 2042a: 70 93 c5 05 sts 0x05C5, r23 ; 0x8005c5 2042e: 80 93 c6 05 sts 0x05C6, r24 ; 0x8005c6 20432: 90 93 c7 05 sts 0x05C7, r25 ; 0x8005c7 20436: 92 cd rjmp .-1244 ; 0x1ff5c // Check if temperature is within the correct range if((current < maxttemp[e]) && (target != 0)) soft_pwm[e] = (int)pid_output >> 1; else soft_pwm[e] = 0; 20438: 10 92 f5 05 sts 0x05F5, r1 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 2043c: b1 ce rjmp .-670 ; 0x201a0 pid_output = pTerm_bed + iTerm_bed - dTerm_bed; if (pid_output > MAX_BED_POWER) { if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration pid_output=MAX_BED_POWER; } else if (pid_output < 0){ 2043e: c5 01 movw r24, r10 20440: b4 01 movw r22, r8 20442: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20446: 87 ff sbrs r24, 7 20448: a6 cf rjmp .-180 ; 0x20396 if (pid_error_bed < 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 2044a: 20 e0 ldi r18, 0x00 ; 0 2044c: 30 e0 ldi r19, 0x00 ; 0 2044e: a9 01 movw r20, r18 20450: c7 01 movw r24, r14 20452: b6 01 movw r22, r12 20454: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 20458: 87 ff sbrs r24, 7 2045a: 10 c0 rjmp .+32 ; 0x2047c 2045c: a7 01 movw r20, r14 2045e: 96 01 movw r18, r12 20460: 6e 85 ldd r22, Y+14 ; 0x0e 20462: 7d 85 ldd r23, Y+13 ; 0x0d 20464: 83 2d mov r24, r3 20466: 92 2d mov r25, r2 20468: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2046c: 60 93 d1 05 sts 0x05D1, r22 ; 0x8005d1 20470: 70 93 d2 05 sts 0x05D2, r23 ; 0x8005d2 20474: 80 93 d3 05 sts 0x05D3, r24 ; 0x8005d3 20478: 90 93 d4 05 sts 0x05D4, r25 ; 0x8005d4 pid_output=0; 2047c: 81 2c mov r8, r1 2047e: 91 2c mov r9, r1 20480: 54 01 movw r10, r8 20482: 89 cf rjmp .-238 ; 0x20396 { soft_pwm_bed = (int)pid_output >> 1; } else { soft_pwm_bed = 0; 20484: 10 92 ee 05 sts 0x05EE, r1 ; 0x8005ee 20488: 98 cf rjmp .-208 ; 0x203ba 0002048a : } static void setIsrTargetTemperatures() { for(uint8_t e=0;e 2048e: 90 91 5e 12 lds r25, 0x125E ; 0x80125e 20492: 90 93 f0 05 sts 0x05F0, r25 ; 0x8005f0 20496: 80 93 ef 05 sts 0x05EF, r24 ; 0x8005ef target_temperature_bed_isr = target_temperature_bed; 2049a: 80 91 59 12 lds r24, 0x1259 ; 0x801259 2049e: 90 91 5a 12 lds r25, 0x125A ; 0x80125a 204a2: 90 93 e9 05 sts 0x05E9, r25 ; 0x8005e9 204a6: 80 93 e8 05 sts 0x05E8, r24 ; 0x8005e8 } 204aa: 08 95 ret 000204ac : /* Synchronize temperatures: - fetch updated values from temp_mgr_isr to current values - update target temperatures for temp_mgr_isr regulation *if* no temperature error is set This function is blocking: check temp_meas_ready before calling! */ static void updateTemperatures() { 204ac: cf 93 push r28 { bool temp_mgr_state; public: TempMgrGuard() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 204ae: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 204b0: f8 94 cli temp_mgr_state = TEMP_MGR_INTERRUPT_STATE(); 204b2: c0 91 71 00 lds r28, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 204b6: c2 70 andi r28, 0x02 ; 2 DISABLE_TEMP_MGR_INTERRUPT(); 204b8: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 204bc: 8d 7f andi r24, 0xFD ; 253 204be: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 204c2: 9f bf out 0x3f, r25 ; 63 } static void setCurrentTemperaturesFromIsr() { for(uint8_t e=0;e 204c8: 90 91 f2 05 lds r25, 0x05F2 ; 0x8005f2 204cc: a0 91 f3 05 lds r26, 0x05F3 ; 0x8005f3 204d0: b0 91 f4 05 lds r27, 0x05F4 ; 0x8005f4 204d4: 80 93 5a 0d sts 0x0D5A, r24 ; 0x800d5a 204d8: 90 93 5b 0d sts 0x0D5B, r25 ; 0x800d5b 204dc: a0 93 5c 0d sts 0x0D5C, r26 ; 0x800d5c 204e0: b0 93 5d 0d sts 0x0D5D, r27 ; 0x800d5d current_temperature_bed = current_temperature_bed_isr; 204e4: 80 91 ea 05 lds r24, 0x05EA ; 0x8005ea 204e8: 90 91 eb 05 lds r25, 0x05EB ; 0x8005eb 204ec: a0 91 ec 05 lds r26, 0x05EC ; 0x8005ec 204f0: b0 91 ed 05 lds r27, 0x05ED ; 0x8005ed 204f4: 80 93 bc 03 sts 0x03BC, r24 ; 0x8003bc 204f8: 90 93 bd 03 sts 0x03BD, r25 ; 0x8003bd 204fc: a0 93 be 03 sts 0x03BE, r26 ; 0x8003be 20500: b0 93 bf 03 sts 0x03BF, r27 ; 0x8003bf #ifdef PINDA_THERMISTOR current_temperature_pinda = current_temperature_pinda_isr; 20504: 80 91 d6 05 lds r24, 0x05D6 ; 0x8005d6 20508: 90 91 d7 05 lds r25, 0x05D7 ; 0x8005d7 2050c: a0 91 d8 05 lds r26, 0x05D8 ; 0x8005d8 20510: b0 91 d9 05 lds r27, 0x05D9 ; 0x8005d9 20514: 80 93 85 03 sts 0x0385, r24 ; 0x800385 20518: 90 93 86 03 sts 0x0386, r25 ; 0x800386 2051c: a0 93 87 03 sts 0x0387, r26 ; 0x800387 20520: b0 93 88 03 sts 0x0388, r27 ; 0x800388 This function is blocking: check temp_meas_ready before calling! */ static void updateTemperatures() { TempMgrGuard temp_mgr_guard; setCurrentTemperaturesFromIsr(); if(!temp_error_state.v) { 20524: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 20528: 81 11 cpse r24, r1 2052a: 02 c0 rjmp .+4 ; 0x20530 // refuse to update target temperatures in any error condition! setIsrTargetTemperatures(); 2052c: 0f 94 45 02 call 0x2048a ; 0x2048a } temp_meas_ready = false; 20530: 10 92 d5 05 sts 0x05D5, r1 ; 0x8005d5 DISABLE_TEMP_MGR_INTERRUPT(); } } ~TempMgrGuard() throw() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 20534: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 20536: f8 94 cli if(temp_mgr_state) ENABLE_TEMP_MGR_INTERRUPT(); 20538: cc 23 and r28, r28 2053a: 29 f0 breq .+10 ; 0x20546 2053c: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 20540: 82 60 ori r24, 0x02 ; 2 20542: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 20546: 9f bf out 0x3f, r25 ; 63 if(!temp_error_state.v) { // refuse to update target temperatures in any error condition! setIsrTargetTemperatures(); } temp_meas_ready = false; } 20548: cf 91 pop r28 2054a: 08 95 ret 0002054c : { // MUST ONLY BE CALLED BY A ISR as stepper pins are manipulated directly. // note: when switching direction no delay is inserted at the end when the // original is restored. We assume enough time passes as the function // returns and the stepper is manipulated again (to avoid dead times) switch(axis) 2054c: 81 30 cpi r24, 0x01 ; 1 2054e: 61 f1 breq .+88 ; 0x205a8 20550: 20 f0 brcs .+8 ; 0x2055a 20552: 82 30 cpi r24, 0x02 ; 2 20554: 09 f4 brne .+2 ; 0x20558 20556: 4b c0 rjmp .+150 ; 0x205ee 20558: 08 95 ret { case X_AXIS: { enable_x(); 2055a: 17 98 cbi 0x02, 7 ; 2 uint8_t old_x_dir_pin = READ(X_DIR_PIN); 2055c: 90 91 09 01 lds r25, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 20560: 81 e0 ldi r24, 0x01 ; 1 20562: 29 2f mov r18, r25 20564: 22 70 andi r18, 0x02 ; 2 20566: 91 ff sbrs r25, 1 20568: 80 e0 ldi r24, 0x00 ; 0 uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction; //setup new step if (new_x_dir_pin != old_x_dir_pin) { 2056a: 86 17 cp r24, r22 2056c: 59 f0 breq .+22 ; 0x20584 WRITE_NC(X_DIR_PIN, new_x_dir_pin); 2056e: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 20572: 66 23 and r22, r22 20574: a9 f0 breq .+42 ; 0x205a0 20576: 82 60 ori r24, 0x02 ; 2 20578: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> #endif // busy wait __asm__ __volatile__ ( 2057c: 8b e8 ldi r24, 0x8B ; 139 2057e: 91 e0 ldi r25, 0x01 ; 1 20580: 01 97 sbiw r24, 0x01 ; 1 20582: f1 f7 brne .-4 ; 0x20580 delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(X_AXIS); 20584: 40 9a sbi 0x08, 0 ; 8 20586: 83 e0 ldi r24, 0x03 ; 3 20588: 90 e0 ldi r25, 0x00 ; 0 2058a: 01 97 sbiw r24, 0x01 ; 1 2058c: f1 f7 brne .-4 ; 0x2058a #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_HI(X_DUP_AXIS); #endif STEPPER_MINIMUM_DELAY; STEP_NC_LO(X_AXIS); 2058e: 40 98 cbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_LO(X_DUP_AXIS); #endif //get old pin state back. WRITE_NC(X_DIR_PIN, old_x_dir_pin); 20590: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 20594: 22 23 and r18, r18 20596: 31 f0 breq .+12 ; 0x205a4 20598: 82 60 ori r24, 0x02 ; 2 STEPPER_MINIMUM_DELAY; STEP_NC_LO(Z_AXIS); //get old pin state back. if (new_z_dir_pin != old_z_dir_pin) { WRITE_NC(Z_DIR_PIN, old_z_dir_pin); 2059a: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> } break; default: break; } } 2059e: 08 95 ret uint8_t old_x_dir_pin = READ(X_DIR_PIN); uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction; //setup new step if (new_x_dir_pin != old_x_dir_pin) { WRITE_NC(X_DIR_PIN, new_x_dir_pin); 205a0: 8d 7f andi r24, 0xFD ; 253 205a2: ea cf rjmp .-44 ; 0x20578 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_LO(X_DUP_AXIS); #endif //get old pin state back. WRITE_NC(X_DIR_PIN, old_x_dir_pin); 205a4: 8d 7f andi r24, 0xFD ; 253 205a6: f9 cf rjmp .-14 ; 0x2059a } break; case Y_AXIS: { enable_y(); 205a8: 16 98 cbi 0x02, 6 ; 2 uint8_t old_y_dir_pin = READ(Y_DIR_PIN); 205aa: 80 91 09 01 lds r24, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 205ae: 81 70 andi r24, 0x01 ; 1 uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction; //setup new step if (new_y_dir_pin != old_y_dir_pin) { 205b0: 86 17 cp r24, r22 205b2: 59 f0 breq .+22 ; 0x205ca WRITE_NC(Y_DIR_PIN, new_y_dir_pin); 205b4: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 205b8: 66 23 and r22, r22 205ba: 99 f0 breq .+38 ; 0x205e2 205bc: 91 60 ori r25, 0x01 ; 1 205be: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 205c2: eb e8 ldi r30, 0x8B ; 139 205c4: f1 e0 ldi r31, 0x01 ; 1 205c6: 31 97 sbiw r30, 0x01 ; 1 205c8: f1 f7 brne .-4 ; 0x205c6 delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(Y_AXIS); 205ca: 41 9a sbi 0x08, 1 ; 8 205cc: e3 e0 ldi r30, 0x03 ; 3 205ce: f0 e0 ldi r31, 0x00 ; 0 205d0: 31 97 sbiw r30, 0x01 ; 1 205d2: f1 f7 brne .-4 ; 0x205d0 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_HI(Y_DUP_AXIS); #endif STEPPER_MINIMUM_DELAY; STEP_NC_LO(Y_AXIS); 205d4: 41 98 cbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_LO(Y_DUP_AXIS); #endif //get old pin state back. WRITE_NC(Y_DIR_PIN, old_y_dir_pin); 205d6: 88 23 and r24, r24 205d8: 31 f0 breq .+12 ; 0x205e6 205da: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 205de: 81 60 ori r24, 0x01 ; 1 205e0: dc cf rjmp .-72 ; 0x2059a uint8_t old_y_dir_pin = READ(Y_DIR_PIN); uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction; //setup new step if (new_y_dir_pin != old_y_dir_pin) { WRITE_NC(Y_DIR_PIN, new_y_dir_pin); 205e2: 9e 7f andi r25, 0xFE ; 254 205e4: ec cf rjmp .-40 ; 0x205be #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_LO(Y_DUP_AXIS); #endif //get old pin state back. WRITE_NC(Y_DIR_PIN, old_y_dir_pin); 205e6: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 205ea: 8e 7f andi r24, 0xFE ; 254 205ec: d6 cf rjmp .-84 ; 0x2059a } break; case Z_AXIS: { enable_z(); 205ee: 15 98 cbi 0x02, 5 ; 2 uint8_t old_z_dir_pin = READ(Z_DIR_PIN); 205f0: 90 91 09 01 lds r25, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 205f4: 81 e0 ldi r24, 0x01 ; 1 205f6: 29 2f mov r18, r25 205f8: 24 70 andi r18, 0x04 ; 4 205fa: 92 ff sbrs r25, 2 205fc: 80 e0 ldi r24, 0x00 ; 0 uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z; //setup new step if (new_z_dir_pin != old_z_dir_pin) { 205fe: 68 17 cp r22, r24 20600: 59 f0 breq .+22 ; 0x20618 WRITE_NC(Z_DIR_PIN, new_z_dir_pin); 20602: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 20606: 66 23 and r22, r22 20608: b1 f0 breq .+44 ; 0x20636 2060a: 94 60 ori r25, 0x04 ; 4 2060c: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 20610: eb e8 ldi r30, 0x8B ; 139 20612: f1 e0 ldi r31, 0x01 ; 1 20614: 31 97 sbiw r30, 0x01 ; 1 20616: f1 f7 brne .-4 ; 0x20614 delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(Z_AXIS); 20618: 42 9a sbi 0x08, 2 ; 8 2061a: e3 e0 ldi r30, 0x03 ; 3 2061c: f0 e0 ldi r31, 0x00 ; 0 2061e: 31 97 sbiw r30, 0x01 ; 1 20620: f1 f7 brne .-4 ; 0x2061e STEPPER_MINIMUM_DELAY; STEP_NC_LO(Z_AXIS); 20622: 42 98 cbi 0x08, 2 ; 8 //get old pin state back. if (new_z_dir_pin != old_z_dir_pin) { 20624: 68 17 cp r22, r24 20626: 09 f4 brne .+2 ; 0x2062a 20628: ba cf rjmp .-140 ; 0x2059e WRITE_NC(Z_DIR_PIN, old_z_dir_pin); 2062a: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2062e: 22 23 and r18, r18 20630: 21 f0 breq .+8 ; 0x2063a 20632: 84 60 ori r24, 0x04 ; 4 20634: b2 cf rjmp .-156 ; 0x2059a uint8_t old_z_dir_pin = READ(Z_DIR_PIN); uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z; //setup new step if (new_z_dir_pin != old_z_dir_pin) { WRITE_NC(Z_DIR_PIN, new_z_dir_pin); 20636: 9b 7f andi r25, 0xFB ; 251 20638: e9 cf rjmp .-46 ; 0x2060c STEPPER_MINIMUM_DELAY; STEP_NC_LO(Z_AXIS); //get old pin state back. if (new_z_dir_pin != old_z_dir_pin) { WRITE_NC(Z_DIR_PIN, old_z_dir_pin); 2063a: 8b 7f andi r24, 0xFB ; 251 2063c: ae cf rjmp .-164 ; 0x2059a 0002063e : } } static void checkRx(void) { if (selectedSerialPort == 0) { 2063e: 80 91 1c 06 lds r24, 0x061C ; 0x80061c 20642: 81 11 cpse r24, r1 20644: 25 c0 rjmp .+74 ; 0x20690 if((M_UCSRxA & (1< 2064a: 87 ff sbrs r24, 7 2064c: 3d c0 rjmp .+122 ; 0x206c8 // Test for a framing error. if (M_UCSRxA & (1< 20652: 84 ff sbrs r24, 4 20654: 03 c0 rjmp .+6 ; 0x2065c // Characters received with the framing errors will be ignored. // The temporary variable "c" was made volatile, so the compiler does not optimize this out. (void)(*(char *)M_UDRx); 20656: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> 2065a: 08 95 ret } else { unsigned char c = M_UDRx; 2065c: 40 91 c6 00 lds r20, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; 20660: 20 91 42 05 lds r18, 0x0542 ; 0x800542 20664: 30 91 43 05 lds r19, 0x0543 ; 0x800543 20668: c9 01 movw r24, r18 2066a: 01 96 adiw r24, 0x01 ; 1 2066c: 8f 77 andi r24, 0x7F ; 127 2066e: 99 27 eor r25, r25 // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != rx_buffer.tail) { 20670: 60 91 44 05 lds r22, 0x0544 ; 0x800544 20674: 70 91 45 05 lds r23, 0x0545 ; 0x800545 20678: 86 17 cp r24, r22 2067a: 97 07 cpc r25, r23 2067c: 29 f1 breq .+74 ; 0x206c8 // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != rx_buffer.tail) { rx_buffer.buffer[rx_buffer.head] = c; 2067e: 2e 53 subi r18, 0x3E ; 62 20680: 3b 4f sbci r19, 0xFB ; 251 20682: f9 01 movw r30, r18 20684: 40 83 st Z, r20 rx_buffer.head = i; 20686: 90 93 43 05 sts 0x0543, r25 ; 0x800543 2068a: 80 93 42 05 sts 0x0542, r24 ; 0x800542 2068e: 1c c0 rjmp .+56 ; 0x206c8 UDR1 = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } } else { // if(selectedSerialPort == 1) { if((UCSR1A & (1< 20694: 87 ff sbrs r24, 7 20696: 18 c0 rjmp .+48 ; 0x206c8 // Test for a framing error. if (UCSR1A & (1< 2069c: 84 ff sbrs r24, 4 2069e: 03 c0 rjmp .+6 ; 0x206a6 // Characters received with the framing errors will be ignored. // The temporary variable "c" was made volatile, so the compiler does not optimize this out. (void)(*(char *)UDR1); 206a0: 80 91 ce 00 lds r24, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> 206a4: 08 95 ret } else { unsigned char c = UDR1; 206a6: 40 91 ce 00 lds r20, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; 206aa: 20 91 42 05 lds r18, 0x0542 ; 0x800542 206ae: 30 91 43 05 lds r19, 0x0543 ; 0x800543 206b2: c9 01 movw r24, r18 206b4: 01 96 adiw r24, 0x01 ; 1 206b6: 8f 77 andi r24, 0x7F ; 127 206b8: 99 27 eor r25, r25 // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the // current location of the tail), we're about to overflow the buffer // and so we don't write the character or advance the head. if (i != rx_buffer.tail) { 206ba: 60 91 44 05 lds r22, 0x0544 ; 0x800544 206be: 70 91 45 05 lds r23, 0x0545 ; 0x800545 206c2: 68 17 cp r22, r24 206c4: 79 07 cpc r23, r25 206c6: d9 f6 brne .-74 ; 0x2067e M_UDRx = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } } } 206c8: 08 95 ret 000206ca : static void Sound_DoSound_Alert(bool bOnce) { uint8_t nI,nMax; nMax=bOnce?1:3; 206ca: 23 e0 ldi r18, 0x03 ; 3 206cc: 81 11 cpse r24, r1 206ce: 21 e0 ldi r18, 0x01 ; 1 for(nI=0;nI 206e2: 94 60 ori r25, 0x04 ; 4 206e4: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 206e8: 3f bf out 0x3f, r19 ; 63 206ea: fb 01 movw r30, r22 206ec: 31 97 sbiw r30, 0x01 ; 1 206ee: f1 f7 brne .-4 ; 0x206ec delayMicroseconds(200); WRITE(BEEPER,LOW); 206f0: 3f b7 in r19, 0x3f ; 63 206f2: f8 94 cli 206f4: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 206f8: 9b 7f andi r25, 0xFB ; 251 206fa: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 206fe: 3f bf out 0x3f, r19 ; 63 20700: fa 01 movw r30, r20 20702: 31 97 sbiw r30, 0x01 ; 1 20704: f1 f7 brne .-4 ; 0x20702 static void Sound_DoSound_Alert(bool bOnce) { uint8_t nI,nMax; nMax=bOnce?1:3; for(nI=0;nI WRITE(BEEPER,HIGH); delayMicroseconds(200); WRITE(BEEPER,LOW); delayMicroseconds(500); } } 2070c: 08 95 ret 0002070e : delayMicroseconds(75); } } static void Sound_DoSound_Echo(void) { 2070e: 8a e0 ldi r24, 0x0A ; 10 20710: 2b e8 ldi r18, 0x8B ; 139 20712: 31 e0 ldi r19, 0x01 ; 1 uint8_t nI; for(nI=0;nI<10;nI++) { WRITE(BEEPER,HIGH); 20714: 4f b7 in r20, 0x3f ; 63 20716: f8 94 cli 20718: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2071c: 94 60 ori r25, 0x04 ; 4 2071e: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20722: 4f bf out 0x3f, r20 ; 63 20724: f9 01 movw r30, r18 20726: 31 97 sbiw r30, 0x01 ; 1 20728: f1 f7 brne .-4 ; 0x20726 delayMicroseconds(100); WRITE(BEEPER,LOW); 2072a: 4f b7 in r20, 0x3f ; 63 2072c: f8 94 cli 2072e: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20732: 9b 7f andi r25, 0xFB ; 251 20734: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20738: 4f bf out 0x3f, r20 ; 63 2073a: f9 01 movw r30, r18 2073c: 31 97 sbiw r30, 0x01 ; 1 2073e: f1 f7 brne .-4 ; 0x2073c 20740: 81 50 subi r24, 0x01 ; 1 static void Sound_DoSound_Echo(void) { uint8_t nI; for(nI=0;nI<10;nI++) 20742: 41 f7 brne .-48 ; 0x20714 WRITE(BEEPER,HIGH); delayMicroseconds(100); WRITE(BEEPER,LOW); delayMicroseconds(100); } } 20744: 08 95 ret 00020746 : /// Compute/update CRC8 CCIIT from 8bits. /// Details: https://www.nongnu.org/avr-libc/user-manual/group__util__crc.html static uint8_t CCITT_update(uint8_t crc, uint8_t b); static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) { uint8_t data = crc ^ b; 20746: 86 27 eor r24, r22 20748: 98 e0 ldi r25, 0x08 ; 8 for (uint8_t i = 0; i < 8; i++) { if ((data & 0x80U) != 0) { data <<= 1U; data ^= 0x07U; 2074a: 27 e0 ldi r18, 0x07 ; 7 static uint8_t CCITT_update(uint8_t crc, uint8_t b); static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) { uint8_t data = crc ^ b; for (uint8_t i = 0; i < 8; i++) { if ((data & 0x80U) != 0) { 2074c: 38 2f mov r19, r24 2074e: 88 0f add r24, r24 20750: 37 fd sbrc r19, 7 data <<= 1U; data ^= 0x07U; 20752: 82 27 eor r24, r18 20754: 91 50 subi r25, 0x01 ; 1 /// Details: https://www.nongnu.org/avr-libc/user-manual/group__util__crc.html static uint8_t CCITT_update(uint8_t crc, uint8_t b); static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) { uint8_t data = crc ^ b; for (uint8_t i = 0; i < 8; i++) { 20756: d1 f7 brne .-12 ; 0x2074c } else { data <<= 1U; } } return data; } 20758: 08 95 ret 0002075a : #endif /* DEBUG_BUILD */ //! @brief common line print for lcd_menu_temperatures //! @param [in] ipgmLabel pointer to string in PROGMEM //! @param [in] value to be printed behind the label static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){ 2075a: cf 93 push r28 2075c: df 93 push r29 2075e: cd b7 in r28, 0x3d ; 61 20760: de b7 in r29, 0x3e ; 62 20762: 2f 97 sbiw r28, 0x0f ; 15 20764: 0f b6 in r0, 0x3f ; 63 20766: f8 94 cli 20768: de bf out 0x3e, r29 ; 62 2076a: 0f be out 0x3f, r0 ; 63 2076c: cd bf out 0x3d, r28 ; 61 2076e: fc 01 movw r30, r24 20770: de 01 movw r26, r28 20772: 11 96 adiw r26, 0x01 ; 1 //! it is better to reuse these texts even though it requires some extra formatting code. //! @param [in] ipgmLabel pointer to string in PROGMEM //! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size //! @param [in] dstSize allocated length of dst static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize){ uint8_t i = 0; 20774: 90 e0 ldi r25, 0x00 ; 0 20776: 9d 01 movw r18, r26 for(; i < dstSize - 2; ++i){ // 2 byte less than buffer, we'd be adding a ':' to the end uint8_t b = pgm_read_byte(ipgmLabel + i); 20778: 84 91 lpm r24, Z 2077a: 41 e0 ldi r20, 0x01 ; 1 2077c: 49 0f add r20, r25 if( ! b ) 2077e: 88 23 and r24, r24 20780: 29 f0 breq .+10 ; 0x2078c break; dst[i] = b; 20782: 8d 93 st X+, r24 20784: 31 96 adiw r30, 0x01 ; 1 20786: 94 2f mov r25, r20 //! @param [in] ipgmLabel pointer to string in PROGMEM //! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size //! @param [in] dstSize allocated length of dst static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize){ uint8_t i = 0; for(; i < dstSize - 2; ++i){ // 2 byte less than buffer, we'd be adding a ':' to the end 20788: 4d 30 cpi r20, 0x0D ; 13 2078a: b1 f7 brne .-20 ; 0x20778 uint8_t b = pgm_read_byte(ipgmLabel + i); if( ! b ) break; dst[i] = b; } dst[i] = ':'; // append the colon 2078c: f9 01 movw r30, r18 2078e: e9 0f add r30, r25 20790: f1 1d adc r31, r1 20792: 8a e3 ldi r24, 0x3A ; 58 20794: 80 83 st Z, r24 ++i; 20796: 9f 5f subi r25, 0xFF ; 255 20798: f9 01 movw r30, r18 2079a: e9 0f add r30, r25 2079c: f1 1d adc r31, r1 for(; i < dstSize - 1; ++i) // fill the rest with spaces dst[i] = ' '; 2079e: 80 e2 ldi r24, 0x20 ; 32 break; dst[i] = b; } dst[i] = ':'; // append the colon ++i; for(; i < dstSize - 1; ++i) // fill the rest with spaces 207a0: 9e 30 cpi r25, 0x0E ; 14 207a2: 19 f0 breq .+6 ; 0x207aa dst[i] = ' '; 207a4: 81 93 st Z+, r24 break; dst[i] = b; } dst[i] = ':'; // append the colon ++i; for(; i < dstSize - 1; ++i) // fill the rest with spaces 207a6: 9f 5f subi r25, 0xFF ; 255 207a8: fb cf rjmp .-10 ; 0x207a0 dst[i] = ' '; dst[dstSize-1] = '\0'; // terminate the string properly 207aa: 1f 86 std Y+15, r1 ; 0x0f //! @param [in] value to be printed behind the label static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){ static const size_t maxChars = 15; char tmp[maxChars]; pgmtext_with_colon(ipgmLabel, tmp, maxChars); lcd_printf_P(PSTR(" %s%3d" LCD_STR_DEGREE " \n"), tmp, value); // no need to add -14.14 to string alignment 207ac: 7f 93 push r23 207ae: 6f 93 push r22 207b0: 3f 93 push r19 207b2: 2f 93 push r18 207b4: 86 e1 ldi r24, 0x16 ; 22 207b6: 98 e9 ldi r25, 0x98 ; 152 207b8: 9f 93 push r25 207ba: 8f 93 push r24 207bc: 0e 94 0b 6f call 0xde16 ; 0xde16 207c0: 0f 90 pop r0 207c2: 0f 90 pop r0 207c4: 0f 90 pop r0 207c6: 0f 90 pop r0 207c8: 0f 90 pop r0 207ca: 0f 90 pop r0 } 207cc: 2f 96 adiw r28, 0x0f ; 15 207ce: 0f b6 in r0, 0x3f ; 63 207d0: f8 94 cli 207d2: de bf out 0x3e, r29 ; 62 207d4: 0f be out 0x3f, r0 ; 63 207d6: cd bf out 0x3d, r28 ; 61 207d8: df 91 pop r29 207da: cf 91 pop r28 207dc: 08 95 ret 000207de : //! | | //! | | //! ---------------------- //! @endcode void lcd_menu_extruder_info() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { 207de: df 92 push r13 207e0: ef 92 push r14 207e2: ff 92 push r15 207e4: 0f 93 push r16 207e6: 1f 93 push r17 207e8: cf 93 push r28 207ea: df 93 push r29 207ec: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 207f0: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] ); 207f4: c7 eb ldi r28, 0xB7 ; 183 207f6: d3 e0 ldi r29, 0x03 ; 3 207f8: 8a 81 ldd r24, Y+2 ; 0x02 207fa: 9b 81 ldd r25, Y+3 ; 0x03 207fc: 2c e3 ldi r18, 0x3C ; 60 207fe: f2 2e mov r15, r18 20800: f8 9e mul r15, r24 20802: 80 01 movw r16, r0 20804: f9 9e mul r15, r25 20806: 10 0d add r17, r0 20808: 11 24 eor r1, r1 2080a: 8d e0 ldi r24, 0x0D ; 13 2080c: 9a e4 ldi r25, 0x4A ; 74 2080e: 0e 94 3a 75 call 0xea74 ; 0xea74 20812: e8 2e mov r14, r24 20814: d9 2e mov r13, r25 20816: 88 81 ld r24, Y 20818: 99 81 ldd r25, Y+1 ; 0x01 2081a: f8 9e mul r15, r24 2081c: e0 01 movw r28, r0 2081e: f9 9e mul r15, r25 20820: d0 0d add r29, r0 20822: 11 24 eor r1, r1 20824: 8a e1 ldi r24, 0x1A ; 26 20826: 9a e4 ldi r25, 0x4A ; 74 20828: 0e 94 3a 75 call 0xea74 ; 0xea74 2082c: 1f 93 push r17 2082e: 0f 93 push r16 20830: df 92 push r13 20832: ef 92 push r14 20834: df 93 push r29 20836: cf 93 push r28 20838: 9f 93 push r25 2083a: 8f 93 push r24 2083c: 8c e8 ldi r24, 0x8C ; 140 2083e: 97 e9 ldi r25, 0x97 ; 151 20840: 9f 93 push r25 20842: 8f 93 push r24 20844: 0e 94 0b 6f call 0xde16 ; 0xde16 menu_back_if_clicked(); 20848: 8d b7 in r24, 0x3d ; 61 2084a: 9e b7 in r25, 0x3e ; 62 2084c: 0a 96 adiw r24, 0x0a ; 10 2084e: 0f b6 in r0, 0x3f ; 63 20850: f8 94 cli 20852: 9e bf out 0x3e, r25 ; 62 20854: 0f be out 0x3f, r0 ; 63 20856: 8d bf out 0x3d, r24 ; 61 } 20858: df 91 pop r29 2085a: cf 91 pop r28 2085c: 1f 91 pop r17 2085e: 0f 91 pop r16 20860: ff 90 pop r15 20862: ef 90 pop r14 20864: df 90 pop r13 { lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] ); menu_back_if_clicked(); 20866: 0c 94 06 74 jmp 0xe80c ; 0xe80c 0002086a : //! | PINDA: 000D| MSG_PINDA c=14 //! ---------------------- //! D - Degree sysmbol LCD_STR_DEGREE //! @endcode static void lcd_menu_temperatures() { 2086a: cf 92 push r12 2086c: df 92 push r13 2086e: ef 92 push r14 20870: ff 92 push r15 20872: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 20876: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_menu_temperatures_line( _T(MSG_NOZZLE), (int)current_temperature[0] ); 2087a: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2087e: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 20882: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 20886: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2088a: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2088e: 6b 01 movw r12, r22 20890: 8c ed ldi r24, 0xDC ; 220 20892: 94 e4 ldi r25, 0x44 ; 68 20894: 0e 94 3a 75 call 0xea74 ; 0xea74 20898: b6 01 movw r22, r12 2089a: 0f 94 ad 03 call 0x2075a ; 0x2075a lcd_menu_temperatures_line( _T(MSG_BED), (int)current_temperature_bed ); 2089e: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 208a2: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 208a6: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 208aa: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 208ae: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 208b2: 6b 01 movw r12, r22 208b4: 81 ec ldi r24, 0xC1 ; 193 208b6: 94 e4 ldi r25, 0x44 ; 68 208b8: 0e 94 3a 75 call 0xea74 ; 0xea74 208bc: b6 01 movw r22, r12 208be: 0f 94 ad 03 call 0x2075a ; 0x2075a #ifdef AMBIENT_THERMISTOR lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient ); #endif //AMBIENT_THERMISTOR #ifdef PINDA_THERMISTOR lcd_menu_temperatures_line(MSG_PINDA, (int)current_temperature_pinda ); ////MSG_PINDA 208c2: 60 91 85 03 lds r22, 0x0385 ; 0x800385 208c6: 70 91 86 03 lds r23, 0x0386 ; 0x800386 208ca: 80 91 87 03 lds r24, 0x0387 ; 0x800387 208ce: 90 91 88 03 lds r25, 0x0388 ; 0x800388 208d2: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 208d6: 86 ed ldi r24, 0xD6 ; 214 208d8: 97 e6 ldi r25, 0x67 ; 103 208da: 0f 94 ad 03 call 0x2075a ; 0x2075a #endif //PINDA_THERMISTOR menu_back_if_clicked(); } 208de: ff 90 pop r15 208e0: ef 90 pop r14 208e2: df 90 pop r13 208e4: cf 90 pop r12 lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient ); #endif //AMBIENT_THERMISTOR #ifdef PINDA_THERMISTOR lcd_menu_temperatures_line(MSG_PINDA, (int)current_temperature_pinda ); ////MSG_PINDA #endif //PINDA_THERMISTOR menu_back_if_clicked(); 208e6: 0c 94 06 74 jmp 0xe80c ; 0xe80c 000208ea : } #if defined(FILAMENT_SENSOR) && !defined(REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY) static void lcd_menu_AutoLoadFilament() { lcd_display_message_fullscreen_nonBlocking_P(_T(MSG_AUTOLOADING_ENABLED)); 208ea: 8e e4 ldi r24, 0x4E ; 78 208ec: 98 e5 ldi r25, 0x58 ; 88 208ee: 0e 94 3a 75 call 0xea74 ; 0xea74 208f2: 0e 94 1e e0 call 0x1c03c ; 0x1c03c menu_back_if_clicked(); 208f6: 0c 94 06 74 jmp 0xe80c ; 0xe80c 000208fa : } } #endif //MMU_HAS_CUTTER bool shouldPreheatOnlyNozzle() { uint8_t eeprom_setting = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT); 208fa: 87 ea ldi r24, 0xA7 ; 167 208fc: 9c e0 ldi r25, 0x0C ; 12 208fe: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (eeprom_setting != 0) 20902: 81 11 cpse r24, r1 20904: 05 c0 rjmp .+10 ; 0x20910 return false; switch(eFilamentAction) { 20906: 80 91 94 03 lds r24, 0x0394 ; 0x800394 2090a: 81 50 subi r24, 0x01 ; 1 2090c: 88 30 cpi r24, 0x08 ; 8 2090e: 10 f0 brcs .+4 ; 0x20914 #endif //MMU_HAS_CUTTER bool shouldPreheatOnlyNozzle() { uint8_t eeprom_setting = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT); if (eeprom_setting != 0) return false; 20910: 80 e0 ldi r24, 0x00 ; 0 20912: 08 95 ret case FilamentAction::MmuLoad: case FilamentAction::MmuUnLoad: case FilamentAction::MmuLoadingTest: case FilamentAction::MmuEject: case FilamentAction::MmuCut: return true; 20914: 81 e0 ldi r24, 0x01 ; 1 default: return false; } } 20916: 08 95 ret 00020918 : //! | MMU fails 000| MSG_MMU_FAILS c=15 //! | MMU load fails 000| MSG_MMU_LOAD_FAILS c=15 //! | | //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_print() { 20918: cf 92 push r12 2091a: df 92 push r13 2091c: ef 92 push r14 2091e: ff 92 push r15 20920: 0f 93 push r16 20922: 1f 93 push r17 20924: cf 93 push r28 20926: df 93 push r29 20928: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 2092c: 0e 94 1f 70 call 0xe03e ; 0xe03e " %-16.16S%-3d\n" " %-16.16S%-3d" ), _T(MSG_LAST_PRINT_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ), _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) )); 20930: 8f ec ldi r24, 0xCF ; 207 20932: 9e e0 ldi r25, 0x0E ; 14 20934: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_print() { lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); lcd_printf_P( 20938: 90 e0 ldi r25, 0x00 ; 0 2093a: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 2093e: d8 2e mov r13, r24 20940: c9 2e mov r12, r25 20942: 80 ea ldi r24, 0xA0 ; 160 20944: 96 e5 ldi r25, 0x56 ; 86 20946: 0e 94 3a 75 call 0xea74 ; 0xea74 2094a: f8 2e mov r15, r24 2094c: e9 2e mov r14, r25 PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d" ), _T(MSG_LAST_PRINT_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ), 2094e: 82 ed ldi r24, 0xD2 ; 210 20950: 9e e0 ldi r25, 0x0E ; 14 20952: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_print() { lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); lcd_printf_P( 20956: 90 e0 ldi r25, 0x00 ; 0 20958: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 2095c: 18 2f mov r17, r24 2095e: 09 2f mov r16, r25 20960: 84 e9 ldi r24, 0x94 ; 148 20962: 96 e5 ldi r25, 0x56 ; 86 20964: 0e 94 3a 75 call 0xea74 ; 0xea74 20968: ec 01 movw r28, r24 2096a: 86 ed ldi r24, 0xD6 ; 214 2096c: 96 e5 ldi r25, 0x56 ; 86 2096e: 0e 94 3a 75 call 0xea74 ; 0xea74 20972: cf 92 push r12 20974: df 92 push r13 20976: ef 92 push r14 20978: ff 92 push r15 2097a: 0f 93 push r16 2097c: 1f 93 push r17 2097e: df 93 push r29 20980: cf 93 push r28 20982: 9f 93 push r25 20984: 8f 93 push r24 20986: 87 ea ldi r24, 0xA7 ; 167 20988: 97 e9 ldi r25, 0x97 ; 151 2098a: 9f 93 push r25 2098c: 8f 93 push r24 2098e: 0e 94 0b 6f call 0xde16 ; 0xde16 " %-16.16S%-3d" ), _T(MSG_LAST_PRINT_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ), _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) )); menu_back_if_clicked(); 20992: 8d b7 in r24, 0x3d ; 61 20994: 9e b7 in r25, 0x3e ; 62 20996: 0c 96 adiw r24, 0x0c ; 12 20998: 0f b6 in r0, 0x3f ; 63 2099a: f8 94 cli 2099c: 9e bf out 0x3e, r25 ; 62 2099e: 0f be out 0x3f, r0 ; 63 209a0: 8d bf out 0x3d, r24 ; 61 } 209a2: df 91 pop r29 209a4: cf 91 pop r28 209a6: 1f 91 pop r17 209a8: 0f 91 pop r16 209aa: ff 90 pop r15 209ac: ef 90 pop r14 209ae: df 90 pop r13 209b0: cf 90 pop r12 " %-16.16S%-3d" ), _T(MSG_LAST_PRINT_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ), _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) )); menu_back_if_clicked(); 209b2: 0c 94 06 74 jmp 0xe80c ; 0xe80c 000209b6 : //! | Material changes | MSG_MATERIAL_CHANGES c=18 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu() { MENU_BEGIN(); 209b6: 0e 94 0c 74 call 0xe818 ; 0xe818 209ba: 10 92 60 04 sts 0x0460, r1 ; 0x800460 209be: 80 91 60 04 lds r24, 0x0460 ; 0x800460 209c2: 84 30 cpi r24, 0x04 ; 4 209c4: 68 f5 brcc .+90 ; 0x20a20 209c6: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 209ca: 8f ed ldi r24, 0xDF ; 223 209cc: 98 e4 ldi r25, 0x48 ; 72 209ce: 0e 94 3a 75 call 0xea74 ; 0xea74 209d2: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_mmu_print); 209d6: 87 e8 ldi r24, 0x87 ; 135 209d8: 96 e5 ldi r25, 0x56 ; 86 209da: 0e 94 3a 75 call 0xea74 ; 0xea74 209de: 68 e3 ldi r22, 0x38 ; 56 209e0: 77 e3 ldi r23, 0x37 ; 55 209e2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_mmu_total); 209e6: 8f e7 ldi r24, 0x7F ; 127 209e8: 96 e5 ldi r25, 0x56 ; 86 209ea: 0e 94 3a 75 call 0xea74 ; 0xea74 209ee: 66 ef ldi r22, 0xF6 ; 246 209f0: 76 e3 ldi r23, 0x36 ; 54 209f2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_MATERIAL_CHANGES), lcd_menu_toolchange_stats_mmu_total); 209f6: 83 ec ldi r24, 0xC3 ; 195 209f8: 96 e5 ldi r25, 0x56 ; 86 209fa: 0e 94 3a 75 call 0xea74 ; 0xea74 209fe: 64 ef ldi r22, 0xF4 ; 244 20a00: 77 e3 ldi r23, 0x37 ; 55 20a02: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_END(); 20a06: 0e 94 83 62 call 0xc506 ; 0xc506 //! | Material changes | MSG_MATERIAL_CHANGES c=18 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu() { MENU_BEGIN(); 20a0a: 80 91 60 04 lds r24, 0x0460 ; 0x800460 20a0e: 8f 5f subi r24, 0xFF ; 255 20a10: 80 93 60 04 sts 0x0460, r24 ; 0x800460 20a14: 80 91 62 04 lds r24, 0x0462 ; 0x800462 20a18: 8f 5f subi r24, 0xFF ; 255 20a1a: 80 93 62 04 sts 0x0462, r24 ; 0x800462 20a1e: cf cf rjmp .-98 ; 0x209be MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_mmu_print); MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_mmu_total); MENU_ITEM_SUBMENU_P(_T(MSG_MATERIAL_CHANGES), lcd_menu_toolchange_stats_mmu_total); MENU_END(); } 20a20: 08 95 ret 00020a22 : setFilamentAction(FilamentAction::None); } /// Reset the menu stack and clear the planned filament action flag static void __attribute__((noinline)) mFilamentResetMenuStack() { menu_back(bFilamentPreheatState ? 1 : 2); 20a22: 80 91 15 06 lds r24, 0x0615 ; 0x800615 20a26: 81 11 cpse r24, r1 20a28: 03 c0 rjmp .+6 ; 0x20a30 20a2a: 82 e0 ldi r24, 0x02 ; 2 20a2c: 0c 94 ff 62 jmp 0xc5fe ; 0xc5fe 20a30: 81 e0 ldi r24, 0x01 ; 1 20a32: fc cf rjmp .-8 ; 0x20a2c 00020a34 : } #ifdef MMU_HAS_CUTTER void lcd_cutter_enabled() { if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED)) 20a34: 8e ec ldi r24, 0xCE ; 206 20a36: 9e e0 ldi r25, 0x0E ; 14 20a38: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 20a3c: 60 e0 ldi r22, 0x00 ; 0 20a3e: 81 30 cpi r24, 0x01 ; 1 20a40: 09 f0 breq .+2 ; 0x20a44 20a42: 61 e0 ldi r22, 0x01 ; 1 20a44: 8e ec ldi r24, 0xCE ; 206 20a46: 9e e0 ldi r25, 0x0E ; 14 20a48: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00020a4c : MENU_END(); } void lcd_set_fan_check() { fans_check_enabled = !fans_check_enabled; 20a4c: 60 91 40 02 lds r22, 0x0240 ; 0x800240 20a50: 81 e0 ldi r24, 0x01 ; 1 20a52: 68 27 eor r22, r24 20a54: 60 93 40 02 sts 0x0240, r22 ; 0x800240 20a58: 87 e8 ldi r24, 0x87 ; 135 20a5a: 9f e0 ldi r25, 0x0F ; 15 20a5c: 0f 94 04 a4 call 0x34808 ; 0x34808 eeprom_update_byte_notify((unsigned char *)EEPROM_FAN_CHECK_ENABLED, fans_check_enabled); #ifdef FANCHECK if (fans_check_enabled == false) fan_check_error = EFCE_OK; //reset error if fanCheck is disabled during error. Allows resuming print. 20a60: 80 91 40 02 lds r24, 0x0240 ; 0x800240 20a64: 81 11 cpse r24, r1 20a66: 02 c0 rjmp .+4 ; 0x20a6c 20a68: 10 92 ce 03 sts 0x03CE, r1 ; 0x8003ce #endif //FANCHECK } 20a6c: 08 95 ret 00020a6e : } } void SpoolJoin::toggleSpoolJoin() { if (eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Disabled) 20a6e: 86 ed ldi r24, 0xD6 ; 214 20a70: 9e e0 ldi r25, 0x0E ; 14 20a72: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 20a76: 61 e0 ldi r22, 0x01 ; 1 20a78: 82 30 cpi r24, 0x02 ; 2 20a7a: 09 f0 breq .+2 ; 0x20a7e 20a7c: 62 e0 ldi r22, 0x02 ; 2 20a7e: 86 ed ldi r24, 0xD6 ; 214 20a80: 9e e0 ldi r25, 0x0E ; 14 20a82: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00020a86 : #ifdef MENU_SERIAL_DUMP #include "Dcodes.h" static void lcd_serial_dump() { serial_dump_and_reset(dump_crash_reason::manual); 20a86: 80 e0 ldi r24, 0x00 ; 0 20a88: 0c 94 79 86 jmp 0x10cf2 ; 0x10cf2 00020a8c : //! | Debug | c=18 //! @endcode //! ---------------------- //! @endcode static void lcd_support_menu() { 20a8c: ef 92 push r14 20a8e: ff 92 push r15 20a90: 0f 93 push r16 20a92: 1f 93 push r17 20a94: cf 93 push r28 20a96: df 93 push r29 uint32_t ip; // 4bytes char ip_str[IP4_STR_SIZE]; // 16bytes } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0 || lcd_draw_update == 2) 20a98: 80 91 96 03 lds r24, 0x0396 ; 0x800396 20a9c: 88 23 and r24, r24 20a9e: 29 f0 breq .+10 ; 0x20aaa 20aa0: 90 91 59 02 lds r25, 0x0259 ; 0x800259 20aa4: 92 30 cpi r25, 0x02 ; 2 20aa6: 09 f0 breq .+2 ; 0x20aaa 20aa8: 74 c1 rjmp .+744 ; 0x20d92 { // Menu was entered or SD card status has changed (plugged in or removed). // Initialize its status. _md->status = 1; 20aaa: 81 e0 ldi r24, 0x01 ; 1 20aac: 80 93 96 03 sts 0x0396, r24 ; 0x800396 20ab0: 80 91 48 16 lds r24, 0x1648 ; 0x801648 _md->is_flash_air = card.ToshibaFlashAir_isEnabled(); 20ab4: 80 93 97 03 sts 0x0397, r24 ; 0x800397 if (_md->is_flash_air) { 20ab8: 88 23 and r24, r24 20aba: 21 f0 breq .+8 ; 0x20ac4 card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed 20abc: 88 e9 ldi r24, 0x98 ; 152 20abe: 93 e0 ldi r25, 0x03 ; 3 20ac0: 0f 94 77 78 call 0x2f0ee ; 0x2f0ee { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; } MENU_BEGIN(); 20ac4: 0e 94 0c 74 call 0xe818 ; 0xe818 20ac8: 10 92 60 04 sts 0x0460, r1 ; 0x800460 if (((menu_item - 1) == menu_line) && lcd_draw_update) { lcd_set_cursor(6, menu_row); MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion(); if (mmu_version.major > 0) lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build); 20acc: 81 e5 ldi r24, 0x51 ; 81 20ace: e8 2e mov r14, r24 20ad0: 88 e9 ldi r24, 0x98 ; 152 20ad2: f8 2e mov r15, r24 } } void ip4_to_str(char* dest, uint8_t* IP) { sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]); 20ad4: c0 e2 ldi r28, 0x20 ; 32 20ad6: d8 e9 ldi r29, 0x98 ; 152 20ad8: 0c e9 ldi r16, 0x9C ; 156 20ada: 13 e0 ldi r17, 0x03 ; 3 { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; } MENU_BEGIN(); 20adc: 80 91 60 04 lds r24, 0x0460 ; 0x800460 20ae0: 84 30 cpi r24, 0x04 ; 4 20ae2: 08 f0 brcs .+2 ; 0x20ae6 20ae4: 7d c1 rjmp .+762 ; 0x20de0 20ae6: 10 92 63 04 sts 0x0463, r1 ; 0x800463 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 20aea: 8f ed ldi r24, 0xDF ; 223 20aec: 98 e4 ldi r25, 0x48 ; 72 20aee: 0e 94 3a 75 call 0xea74 ; 0xea74 20af2: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR("Firmware:")); 20af6: 84 eb ldi r24, 0xB4 ; 180 20af8: 98 e9 ldi r25, 0x98 ; 152 20afa: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" " FW_VERSION_FULL)); 20afe: 87 ea ldi r24, 0xA7 ; 167 20b00: 98 e9 ldi r25, 0x98 ; 152 20b02: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" Repo:" FW_REPOSITORY)); 20b06: 89 e9 ldi r24, 0x99 ; 153 20b08: 98 e9 ldi r25, 0x98 ; 152 20b0a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" Hash:" FW_COMMIT_HASH)); 20b0e: 89 e8 ldi r24, 0x89 ; 137 20b10: 98 e9 ldi r25, 0x98 ; 152 20b12: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(_n("prusa3d.com"));////MSG_PRUSA3D c=18 20b16: 8c e0 ldi r24, 0x0C ; 12 20b18: 9b e6 ldi r25, 0x6B ; 107 20b1a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(_n("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=18 20b1e: 8a ef ldi r24, 0xFA ; 250 20b20: 9a e6 ldi r25, 0x6A ; 106 20b22: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(_n("help.prusa3d.com"));////MSG_PRUSA3D_HELP c=18 20b26: 89 ee ldi r24, 0xE9 ; 233 20b28: 9a e6 ldi r25, 0x6A ; 106 20b2a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(STR_SEPARATOR); 20b2e: 81 e0 ldi r24, 0x01 ; 1 20b30: 94 e8 ldi r25, 0x84 ; 132 20b32: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE)); 20b36: 8d e7 ldi r24, 0x7D ; 125 20b38: 98 e9 ldi r25, 0x98 ; 152 20b3a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(ELECTRONICS)); 20b3e: 84 e7 ldi r24, 0x74 ; 116 20b40: 98 e9 ldi r25, 0x98 ; 152 20b42: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE)); 20b46: 8a e6 ldi r24, 0x6A ; 106 20b48: 98 e9 ldi r25, 0x98 ; 152 20b4a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(STR_SEPARATOR); 20b4e: 81 e0 ldi r24, 0x01 ; 1 20b50: 94 e8 ldi r25, 0x84 ; 132 20b52: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(_T(MSG_DATE)); 20b56: 89 e7 ldi r24, 0x79 ; 121 20b58: 97 e5 ldi r25, 0x57 ; 87 20b5a: 0e 94 3a 75 call 0xea74 ; 0xea74 20b5e: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(SOURCE_DATE_EPOCH)); 20b62: 8f e5 ldi r24, 0x5F ; 95 20b64: 98 e9 ldi r25, 0x98 ; 152 20b66: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(STR_SEPARATOR); MENU_ITEM_BACK_P(PSTR("Fil. sensor v.:")); MENU_ITEM_BACK_P(fsensor.getIRVersionText()); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) MENU_ITEM_BACK_P(STR_SEPARATOR); 20b6a: 81 e0 ldi r24, 0x01 ; 1 20b6c: 94 e8 ldi r25, 0x84 ; 132 20b6e: 0e 94 ce 72 call 0xe59c ; 0xe59c if (MMU2::mmu2.Enabled()) 20b72: 80 91 01 13 lds r24, 0x1301 ; 0x801301 20b76: 81 30 cpi r24, 0x01 ; 1 20b78: 09 f0 breq .+2 ; 0x20b7c 20b7a: 2d c1 rjmp .+602 ; 0x20dd6 { MENU_ITEM_BACK_P(_T(MSG_MMU_CONNECTED)); 20b7c: 89 e6 ldi r24, 0x69 ; 105 20b7e: 97 e5 ldi r25, 0x57 ; 87 20b80: 0e 94 3a 75 call 0xea74 ; 0xea74 20b84: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" FW:")); ////c=17 20b88: 8a e5 ldi r24, 0x5A ; 90 20b8a: 98 e9 ldi r25, 0x98 ; 152 20b8c: 0e 94 ce 72 call 0xe59c ; 0xe59c if (((menu_item - 1) == menu_line) && lcd_draw_update) 20b90: 80 91 63 04 lds r24, 0x0463 ; 0x800463 20b94: 81 50 subi r24, 0x01 ; 1 20b96: 99 0b sbc r25, r25 20b98: 20 91 62 04 lds r18, 0x0462 ; 0x800462 20b9c: 28 17 cp r18, r24 20b9e: 19 06 cpc r1, r25 20ba0: 49 f5 brne .+82 ; 0x20bf4 20ba2: 80 91 59 02 lds r24, 0x0259 ; 0x800259 20ba6: 88 23 and r24, r24 20ba8: 29 f1 breq .+74 ; 0x20bf4 { lcd_set_cursor(6, menu_row); 20baa: 60 91 60 04 lds r22, 0x0460 ; 0x800460 20bae: 86 e0 ldi r24, 0x06 ; 6 20bb0: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 inline ErrorCode GetLastErrorCode() const { return lastErrorCode; } /// @returns the version of the connected MMU FW. /// In the future we'll return the trully detected FW version Version GetMMUFWVersion() const { if (State() == xState::Active) { 20bb4: 80 91 01 13 lds r24, 0x1301 ; 0x801301 20bb8: 81 30 cpi r24, 0x01 ; 1 20bba: 09 f0 breq .+2 ; 0x20bbe 20bbc: 05 c1 rjmp .+522 ; 0x20dc8 20bbe: 80 91 e1 12 lds r24, 0x12E1 ; 0x8012e1 20bc2: 90 91 e2 12 lds r25, 0x12E2 ; 0x8012e2 20bc6: 20 91 e3 12 lds r18, 0x12E3 ; 0x8012e3 MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion(); if (mmu_version.major > 0) 20bca: 88 23 and r24, r24 20bcc: 09 f4 brne .+2 ; 0x20bd0 20bce: fc c0 rjmp .+504 ; 0x20dc8 lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build); 20bd0: 1f 92 push r1 20bd2: 2f 93 push r18 20bd4: 1f 92 push r1 20bd6: 9f 93 push r25 20bd8: 1f 92 push r1 20bda: 8f 93 push r24 20bdc: ff 92 push r15 20bde: ef 92 push r14 20be0: 0e 94 0b 6f call 0xde16 ; 0xde16 20be4: 8d b7 in r24, 0x3d ; 61 20be6: 9e b7 in r25, 0x3e ; 62 20be8: 08 96 adiw r24, 0x08 ; 8 20bea: 0f b6 in r0, 0x3f ; 63 20bec: f8 94 cli 20bee: 9e bf out 0x3e, r25 ; 62 20bf0: 0f be out 0x3f, r0 ; 63 20bf2: 8d bf out 0x3d, r24 ; 61 else MENU_ITEM_BACK_P(PSTR("MMU N/A")); // Show the FlashAir IP address, if the card is available. if (_md->is_flash_air) { 20bf4: 80 91 97 03 lds r24, 0x0397 ; 0x800397 20bf8: 88 23 and r24, r24 20bfa: 09 f4 brne .+2 ; 0x20bfe 20bfc: 40 c0 rjmp .+128 ; 0x20c7e MENU_ITEM_BACK_P(STR_SEPARATOR); 20bfe: 81 e0 ldi r24, 0x01 ; 1 20c00: 94 e8 ldi r25, 0x84 ; 132 20c02: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:")); ////MSG_FLASHAIR c=18 20c06: 80 e3 ldi r24, 0x30 ; 48 20c08: 98 e9 ldi r25, 0x98 ; 152 20c0a: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" ")); 20c0e: 8e e2 ldi r24, 0x2E ; 46 20c10: 98 e9 ldi r25, 0x98 ; 152 20c12: 0e 94 ce 72 call 0xe59c ; 0xe59c if (((menu_item - 1) == menu_line) && lcd_draw_update) { 20c16: 80 91 63 04 lds r24, 0x0463 ; 0x800463 20c1a: 81 50 subi r24, 0x01 ; 1 20c1c: 99 0b sbc r25, r25 20c1e: 20 91 62 04 lds r18, 0x0462 ; 0x800462 20c22: 28 17 cp r18, r24 20c24: 19 06 cpc r1, r25 20c26: 59 f5 brne .+86 ; 0x20c7e 20c28: 80 91 59 02 lds r24, 0x0259 ; 0x800259 20c2c: 88 23 and r24, r24 20c2e: 39 f1 breq .+78 ; 0x20c7e lcd_set_cursor(2, menu_row); 20c30: 60 91 60 04 lds r22, 0x0460 ; 0x800460 20c34: 82 e0 ldi r24, 0x02 ; 2 20c36: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 20c3a: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 20c3e: 1f 92 push r1 20c40: 8f 93 push r24 20c42: 80 91 9a 03 lds r24, 0x039A ; 0x80039a 20c46: 1f 92 push r1 20c48: 8f 93 push r24 20c4a: 80 91 99 03 lds r24, 0x0399 ; 0x800399 20c4e: 1f 92 push r1 20c50: 8f 93 push r24 20c52: 80 91 98 03 lds r24, 0x0398 ; 0x800398 20c56: 1f 92 push r1 20c58: 8f 93 push r24 20c5a: df 93 push r29 20c5c: cf 93 push r28 20c5e: 1f 93 push r17 20c60: 0f 93 push r16 20c62: 0f 94 f7 a2 call 0x345ee ; 0x345ee ip4_to_str(_md->ip_str, (uint8_t*)(&_md->ip)); lcd_print(_md->ip_str); 20c66: 8c e9 ldi r24, 0x9C ; 156 20c68: 93 e0 ldi r25, 0x03 ; 3 20c6a: 0e 94 5f 73 call 0xe6be ; 0xe6be 20c6e: 8d b7 in r24, 0x3d ; 61 20c70: 9e b7 in r25, 0x3e ; 62 20c72: 0c 96 adiw r24, 0x0c ; 12 20c74: 0f b6 in r0, 0x3f ; 63 20c76: f8 94 cli 20c78: 9e bf out 0x3e, r25 ; 62 20c7a: 0f be out 0x3f, r0 ; 63 20c7c: 8d bf out 0x3d, r24 ; 61 } } // Show the printer IP address, if it is available. if (IP_address) { 20c7e: 80 91 10 06 lds r24, 0x0610 ; 0x800610 20c82: 90 91 11 06 lds r25, 0x0611 ; 0x800611 20c86: a0 91 12 06 lds r26, 0x0612 ; 0x800612 20c8a: b0 91 13 06 lds r27, 0x0613 ; 0x800613 20c8e: 89 2b or r24, r25 20c90: 8a 2b or r24, r26 20c92: 8b 2b or r24, r27 20c94: 09 f4 brne .+2 ; 0x20c98 20c96: 42 c0 rjmp .+132 ; 0x20d1c MENU_ITEM_BACK_P(STR_SEPARATOR); 20c98: 81 e0 ldi r24, 0x01 ; 1 20c9a: 94 e8 ldi r25, 0x84 ; 132 20c9c: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(_T(MSG_PRINTER_IP)); 20ca0: 8c e4 ldi r24, 0x4C ; 76 20ca2: 97 e5 ldi r25, 0x57 ; 87 20ca4: 0e 94 3a 75 call 0xea74 ; 0xea74 20ca8: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_BACK_P(PSTR(" ")); 20cac: 8c e2 ldi r24, 0x2C ; 44 20cae: 98 e9 ldi r25, 0x98 ; 152 20cb0: 0e 94 ce 72 call 0xe59c ; 0xe59c if (((menu_item - 1) == menu_line) && lcd_draw_update) { 20cb4: 80 91 63 04 lds r24, 0x0463 ; 0x800463 20cb8: 81 50 subi r24, 0x01 ; 1 20cba: 99 0b sbc r25, r25 20cbc: 20 91 62 04 lds r18, 0x0462 ; 0x800462 20cc0: 28 17 cp r18, r24 20cc2: 19 06 cpc r1, r25 20cc4: 59 f5 brne .+86 ; 0x20d1c 20cc6: 80 91 59 02 lds r24, 0x0259 ; 0x800259 20cca: 88 23 and r24, r24 20ccc: 39 f1 breq .+78 ; 0x20d1c lcd_set_cursor(2, menu_row); 20cce: 60 91 60 04 lds r22, 0x0460 ; 0x800460 20cd2: 82 e0 ldi r24, 0x02 ; 2 20cd4: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 20cd8: 80 91 13 06 lds r24, 0x0613 ; 0x800613 20cdc: 1f 92 push r1 20cde: 8f 93 push r24 20ce0: 80 91 12 06 lds r24, 0x0612 ; 0x800612 20ce4: 1f 92 push r1 20ce6: 8f 93 push r24 20ce8: 80 91 11 06 lds r24, 0x0611 ; 0x800611 20cec: 1f 92 push r1 20cee: 8f 93 push r24 20cf0: 80 91 10 06 lds r24, 0x0610 ; 0x800610 20cf4: 1f 92 push r1 20cf6: 8f 93 push r24 20cf8: df 93 push r29 20cfa: cf 93 push r28 20cfc: 1f 93 push r17 20cfe: 0f 93 push r16 20d00: 0f 94 f7 a2 call 0x345ee ; 0x345ee ip4_to_str(_md->ip_str, (uint8_t*)(&IP_address)); lcd_print(_md->ip_str); 20d04: 8c e9 ldi r24, 0x9C ; 156 20d06: 93 e0 ldi r25, 0x03 ; 3 20d08: 0e 94 5f 73 call 0xe6be ; 0xe6be 20d0c: 8d b7 in r24, 0x3d ; 61 20d0e: 9e b7 in r25, 0x3e ; 62 20d10: 0c 96 adiw r24, 0x0c ; 12 20d12: 0f b6 in r0, 0x3f ; 63 20d14: f8 94 cli 20d16: 9e bf out 0x3e, r25 ; 62 20d18: 0f be out 0x3f, r0 ; 63 20d1a: 8d bf out 0x3d, r24 ; 61 } } MENU_ITEM_BACK_P(STR_SEPARATOR); 20d1c: 81 e0 ldi r24, 0x01 ; 1 20d1e: 94 e8 ldi r25, 0x84 ; 132 20d20: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_SUBMENU_P(_T(MSG_XYZ_DETAILS), lcd_menu_xyz_y_min); 20d24: 89 e3 ldi r24, 0x39 ; 57 20d26: 97 e5 ldi r25, 0x57 ; 87 20d28: 0e 94 3a 75 call 0xea74 ; 0xea74 20d2c: 62 e9 ldi r22, 0x92 ; 146 20d2e: 76 ec ldi r23, 0xC6 ; 198 20d30: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_INFO_EXTRUDER), lcd_menu_extruder_info); 20d34: 89 e2 ldi r24, 0x29 ; 41 20d36: 97 e5 ldi r25, 0x57 ; 87 20d38: 0e 94 3a 75 call 0xea74 ; 0xea74 20d3c: 64 ea ldi r22, 0xA4 ; 164 20d3e: 77 e3 ldi r23, 0x37 ; 55 20d40: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(_T(MSG_INFO_SENSORS), lcd_menu_show_sensors_state); 20d44: 8b e1 ldi r24, 0x1B ; 27 20d46: 97 e5 ldi r25, 0x57 ; 87 20d48: 0e 94 3a 75 call 0xea74 ; 0xea74 20d4c: 6f e8 ldi r22, 0x8F ; 143 20d4e: 74 ec ldi r23, 0xC4 ; 196 20d50: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #ifdef TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_BELT_STATUS), lcd_menu_belt_status); #endif //TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_MENU_TEMPERATURES), lcd_menu_temperatures); 20d54: 8c e0 ldi r24, 0x0C ; 12 20d56: 97 e5 ldi r25, 0x57 ; 87 20d58: 0e 94 3a 75 call 0xea74 ; 0xea74 20d5c: 68 ee ldi r22, 0xE8 ; 232 20d5e: 77 e3 ldi r23, 0x37 ; 55 20d60: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 #ifdef MENU_DUMP MENU_ITEM_FUNCTION_P(_n("Dump memory"), lcd_dump_memory); #endif //MENU_DUMP #ifdef MENU_SERIAL_DUMP if (emergency_serial_dump) 20d64: 80 91 0f 06 lds r24, 0x060F ; 0x80060f 20d68: 88 23 and r24, r24 20d6a: 31 f0 breq .+12 ; 0x20d78 MENU_ITEM_FUNCTION_P(_n("Dump to serial"), lcd_serial_dump); 20d6c: 6e ec ldi r22, 0xCE ; 206 20d6e: 77 e3 ldi r23, 0x37 ; 55 20d70: 8a ed ldi r24, 0xDA ; 218 20d72: 9a e6 ldi r25, 0x6A ; 106 20d74: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_FUNCTION_P(PSTR("Stack crash"), lcd_stack_crash); #endif //EMERGENCY_HANDLERS MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18 #endif /* DEBUG_BUILD */ MENU_END(); 20d78: 0e 94 83 62 call 0xc506 ; 0xc506 { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; } MENU_BEGIN(); 20d7c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 20d80: 8f 5f subi r24, 0xFF ; 255 20d82: 80 93 60 04 sts 0x0460, r24 ; 0x800460 20d86: 80 91 62 04 lds r24, 0x0462 ; 0x800462 20d8a: 8f 5f subi r24, 0xFF ; 255 20d8c: 80 93 62 04 sts 0x0462, r24 ; 0x800462 20d90: a5 ce rjmp .-694 ; 0x20adc _md->status = 1; _md->is_flash_air = card.ToshibaFlashAir_isEnabled(); if (_md->is_flash_air) { card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed } } else if (_md->is_flash_air && _md->ip == 0 && ++ _md->status == 16) 20d92: 90 91 97 03 lds r25, 0x0397 ; 0x800397 20d96: 99 23 and r25, r25 20d98: 09 f4 brne .+2 ; 0x20d9c 20d9a: 94 ce rjmp .-728 ; 0x20ac4 20d9c: 40 91 98 03 lds r20, 0x0398 ; 0x800398 20da0: 50 91 99 03 lds r21, 0x0399 ; 0x800399 20da4: 60 91 9a 03 lds r22, 0x039A ; 0x80039a 20da8: 70 91 9b 03 lds r23, 0x039B ; 0x80039b 20dac: 45 2b or r20, r21 20dae: 46 2b or r20, r22 20db0: 47 2b or r20, r23 20db2: 09 f0 breq .+2 ; 0x20db6 20db4: 87 ce rjmp .-754 ; 0x20ac4 20db6: 8f 5f subi r24, 0xFF ; 255 20db8: 80 31 cpi r24, 0x10 ; 16 20dba: 19 f0 breq .+6 ; 0x20dc2 20dbc: 80 93 96 03 sts 0x0396, r24 ; 0x800396 20dc0: 81 ce rjmp .-766 ; 0x20ac4 { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; 20dc2: 10 92 96 03 sts 0x0396, r1 ; 0x800396 20dc6: 7e ce rjmp .-772 ; 0x20ac4 lcd_set_cursor(6, menu_row); MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion(); if (mmu_version.major > 0) lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build); else lcd_puts_P(_T(MSG_UNKNOWN)); 20dc8: 8f e5 ldi r24, 0x5F ; 95 20dca: 97 e5 ldi r25, 0x57 ; 87 20dcc: 0e 94 3a 75 call 0xea74 ; 0xea74 20dd0: 0e 94 1d 6f call 0xde3a ; 0xde3a 20dd4: 0f cf rjmp .-482 ; 0x20bf4 } } else MENU_ITEM_BACK_P(PSTR("MMU N/A")); 20dd6: 82 e4 ldi r24, 0x42 ; 66 20dd8: 98 e9 ldi r25, 0x98 ; 152 20dda: 0e 94 ce 72 call 0xe59c ; 0xe59c 20dde: 0a cf rjmp .-492 ; 0x20bf4 #endif //EMERGENCY_HANDLERS MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18 #endif /* DEBUG_BUILD */ MENU_END(); } 20de0: df 91 pop r29 20de2: cf 91 pop r28 20de4: 1f 91 pop r17 20de6: 0f 91 pop r16 20de8: ff 90 pop r15 20dea: ef 90 pop r14 20dec: 08 95 ret 00020dee : //! |Total failures | MSG_TOTAL_FAILURES c=20 //! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15 //! ---------------------- //! @endcode static void lcd_menu_fails_stats() { 20dee: bf 92 push r11 20df0: cf 92 push r12 20df2: df 92 push r13 20df4: ef 92 push r14 20df6: ff 92 push r15 20df8: 0f 93 push r16 20dfa: 1f 93 push r17 20dfc: cf 93 push r28 20dfe: df 93 push r29 20e00: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout uint8_t filamentLast = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT); 20e04: 85 e6 ldi r24, 0x65 ; 101 20e06: 9f e0 ldi r25, 0x0F ; 15 20e08: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 20e0c: 18 2f mov r17, r24 uint16_t filamentTotal = clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) ); 20e0e: 81 e0 ldi r24, 0x01 ; 1 20e10: 9f e0 ldi r25, 0x0F ; 15 20e12: 0f 94 ee a3 call 0x347dc ; 0x347dc 20e16: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 20e1a: c8 2e mov r12, r24 20e1c: b9 2e mov r11, r25 lcd_home(); 20e1e: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(failStatsFmt, 20e22: 8d ef ldi r24, 0xFD ; 253 20e24: 96 e5 ldi r25, 0x56 ; 86 20e26: 0e 94 3a 75 call 0xea74 ; 0xea74 20e2a: e8 2e mov r14, r24 20e2c: d9 2e mov r13, r25 20e2e: 8c ee ldi r24, 0xEC ; 236 20e30: 96 e5 ldi r25, 0x56 ; 86 20e32: 0e 94 3a 75 call 0xea74 ; 0xea74 20e36: 08 2f mov r16, r24 20e38: f9 2e mov r15, r25 20e3a: 8d ef ldi r24, 0xFD ; 253 20e3c: 96 e5 ldi r25, 0x56 ; 86 20e3e: 0e 94 3a 75 call 0xea74 ; 0xea74 20e42: ec 01 movw r28, r24 20e44: 86 ed ldi r24, 0xD6 ; 214 20e46: 96 e5 ldi r25, 0x56 ; 86 20e48: 0e 94 3a 75 call 0xea74 ; 0xea74 20e4c: bf 92 push r11 20e4e: cf 92 push r12 20e50: df 92 push r13 20e52: ef 92 push r14 20e54: ff 92 push r15 20e56: 0f 93 push r16 20e58: 1f 92 push r1 20e5a: 1f 93 push r17 20e5c: df 93 push r29 20e5e: cf 93 push r28 20e60: 9f 93 push r25 20e62: 8f 93 push r24 20e64: 83 ef ldi r24, 0xF3 ; 243 20e66: 97 e9 ldi r25, 0x97 ; 151 20e68: 9f 93 push r25 20e6a: 8f 93 push r24 20e6c: 0e 94 0b 6f call 0xde16 ; 0xde16 _T(MSG_LAST_PRINT_FAILURES), _T(MSG_FIL_RUNOUTS), filamentLast, _T(MSG_TOTAL_FAILURES), _T(MSG_FIL_RUNOUTS), filamentTotal); menu_back_if_clicked(); 20e70: 8d b7 in r24, 0x3d ; 61 20e72: 9e b7 in r25, 0x3e ; 62 20e74: 0e 96 adiw r24, 0x0e ; 14 20e76: 0f b6 in r0, 0x3f ; 63 20e78: f8 94 cli 20e7a: 9e bf out 0x3e, r25 ; 62 20e7c: 0f be out 0x3f, r0 ; 63 20e7e: 8d bf out 0x3d, r24 ; 61 } 20e80: df 91 pop r29 20e82: cf 91 pop r28 20e84: 1f 91 pop r17 20e86: 0f 91 pop r16 20e88: ff 90 pop r15 20e8a: ef 90 pop r14 20e8c: df 90 pop r13 20e8e: cf 90 pop r12 20e90: bf 90 pop r11 _T(MSG_LAST_PRINT_FAILURES), _T(MSG_FIL_RUNOUTS), filamentLast, _T(MSG_TOTAL_FAILURES), _T(MSG_FIL_RUNOUTS), filamentTotal); menu_back_if_clicked(); 20e92: 0c 94 06 74 jmp 0xe80c ; 0xe80c 00020e96 : //! | MMU fails 000| MSG_MMU_FAILS c=15 //! | MMU load fails 000| MSG_MMU_LOAD_FAILS c=15 //! | MMU power fails 000| MSG_MMU_POWER_FAILS c=15 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_total() { 20e96: 8f 92 push r8 20e98: 9f 92 push r9 20e9a: af 92 push r10 20e9c: bf 92 push r11 20e9e: cf 92 push r12 20ea0: df 92 push r13 20ea2: ef 92 push r14 20ea4: ff 92 push r15 20ea6: 0f 93 push r16 20ea8: 1f 93 push r17 20eaa: cf 93 push r28 20eac: df 93 push r29 20eae: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 20eb2: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P( 20eb6: 80 91 07 13 lds r24, 0x1307 ; 0x801307 20eba: 90 91 08 13 lds r25, 0x1308 ; 0x801308 20ebe: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 20ec2: 98 2e mov r9, r24 20ec4: 89 2e mov r8, r25 20ec6: 81 eb ldi r24, 0xB1 ; 177 20ec8: 96 e5 ldi r25, 0x56 ; 86 20eca: 0e 94 3a 75 call 0xea74 ; 0xea74 20ece: b8 2e mov r11, r24 20ed0: a9 2e mov r10, r25 20ed2: 80 ed ldi r24, 0xD0 ; 208 20ed4: 9e e0 ldi r25, 0x0E ; 14 20ed6: 0f 94 ee a3 call 0x347dc ; 0x347dc 20eda: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 20ede: d8 2e mov r13, r24 20ee0: c9 2e mov r12, r25 20ee2: 80 ea ldi r24, 0xA0 ; 160 20ee4: 96 e5 ldi r25, 0x56 ; 86 20ee6: 0e 94 3a 75 call 0xea74 ; 0xea74 20eea: f8 2e mov r15, r24 20eec: e9 2e mov r14, r25 20eee: 83 ed ldi r24, 0xD3 ; 211 20ef0: 9e e0 ldi r25, 0x0E ; 14 20ef2: 0f 94 ee a3 call 0x347dc ; 0x347dc 20ef6: 0e 94 34 ff call 0x1fe68 ; 0x1fe68 20efa: 18 2f mov r17, r24 20efc: 09 2f mov r16, r25 20efe: 84 e9 ldi r24, 0x94 ; 148 20f00: 96 e5 ldi r25, 0x56 ; 86 20f02: 0e 94 3a 75 call 0xea74 ; 0xea74 20f06: ec 01 movw r28, r24 20f08: 8c ee ldi r24, 0xEC ; 236 20f0a: 96 e5 ldi r25, 0x56 ; 86 20f0c: 0e 94 3a 75 call 0xea74 ; 0xea74 20f10: 8f 92 push r8 20f12: 9f 92 push r9 20f14: af 92 push r10 20f16: bf 92 push r11 20f18: cf 92 push r12 20f1a: df 92 push r13 20f1c: ef 92 push r14 20f1e: ff 92 push r15 20f20: 0f 93 push r16 20f22: 1f 93 push r17 20f24: df 93 push r29 20f26: cf 93 push r28 20f28: 9f 93 push r25 20f2a: 8f 93 push r24 20f2c: 86 ec ldi r24, 0xC6 ; 198 20f2e: 97 e9 ldi r25, 0x97 ; 151 20f30: 9f 93 push r25 20f32: 8f 93 push r24 20f34: 0e 94 0b 6f call 0xde16 ; 0xde16 ), _T(MSG_TOTAL_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ), _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ), _T(MSG_MMU_POWER_FAILS), clamp999( MMU2::mmu2.TMCFailures() )); menu_back_if_clicked(); 20f38: 8d b7 in r24, 0x3d ; 61 20f3a: 9e b7 in r25, 0x3e ; 62 20f3c: 40 96 adiw r24, 0x10 ; 16 20f3e: 0f b6 in r0, 0x3f ; 63 20f40: f8 94 cli 20f42: 9e bf out 0x3e, r25 ; 62 20f44: 0f be out 0x3f, r0 ; 63 20f46: 8d bf out 0x3d, r24 ; 61 } 20f48: df 91 pop r29 20f4a: cf 91 pop r28 20f4c: 1f 91 pop r17 20f4e: 0f 91 pop r16 20f50: ff 90 pop r15 20f52: ef 90 pop r14 20f54: df 90 pop r13 20f56: cf 90 pop r12 20f58: bf 90 pop r11 20f5a: af 90 pop r10 20f5c: 9f 90 pop r9 20f5e: 8f 90 pop r8 ), _T(MSG_TOTAL_FAILURES), _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ), _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ), _T(MSG_MMU_POWER_FAILS), clamp999( MMU2::mmu2.TMCFailures() )); menu_back_if_clicked(); 20f60: 0c 94 06 74 jmp 0xe80c ; 0xe80c 00020f64 : { bool initialized; // 1byte } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if(!_md->initialized) { 20f64: 80 91 96 03 lds r24, 0x0396 ; 0x800396 20f68: 81 11 cpse r24, r1 20f6a: 19 c0 rjmp .+50 ; 0x20f9e lcd_clear(); 20f6c: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_P(_T(MSG_MATERIAL_CHANGES)); /// MSG_MATERIAL_CHANGES c=18 20f70: 83 ec ldi r24, 0xC3 ; 195 20f72: 96 e5 ldi r25, 0x56 ; 86 20f74: 0e 94 3a 75 call 0xea74 ; 0xea74 20f78: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_putc(':'); 20f7c: 8a e3 ldi r24, 0x3A ; 58 20f7e: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_set_cursor(10, 1); 20f82: 61 e0 ldi r22, 0x01 ; 1 20f84: 8a e0 ldi r24, 0x0A ; 10 20f86: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_print(eeprom_read_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES)); 20f8a: 88 ea ldi r24, 0xA8 ; 168 20f8c: 9c e0 ldi r25, 0x0C ; 12 20f8e: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 else lcd_printNumber(n, base); 20f92: 4a e0 ldi r20, 0x0A ; 10 20f94: 0e 94 76 71 call 0xe2ec ; 0xe2ec _md->initialized = true; 20f98: 81 e0 ldi r24, 0x01 ; 1 20f9a: 80 93 96 03 sts 0x0396, r24 ; 0x800396 } menu_back_if_clicked(); 20f9e: 0c 94 06 74 jmp 0xe80c ; 0xe80c 00020fa2 : } //! @brief Send host action "pause" void lcd_pause_usb_print() { SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_PAUSE); 20fa2: 8b ec ldi r24, 0xCB ; 203 20fa4: 9a e6 ldi r25, 0x6A ; 106 20fa6: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 00020faa : #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 20faa: 0e 94 9f 70 call 0xe13e ; 0xe13e lcd_status_message_idx = 0; // Re-draw message from beginning 20fae: 10 92 64 04 sts 0x0464, r1 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> } void lcd_return_to_status() { lcdui_refresh(); // to maybe revive the LCD if static electricity killed it. menu_goto(lcd_status_screen, 0, true); 20fb2: 20 e0 ldi r18, 0x00 ; 0 20fb4: 41 e0 ldi r20, 0x01 ; 1 20fb6: 70 e0 ldi r23, 0x00 ; 0 20fb8: 60 e0 ldi r22, 0x00 ; 0 20fba: 80 e2 ldi r24, 0x20 ; 32 20fbc: 97 e3 ldi r25, 0x37 ; 55 20fbe: 0e 94 b7 62 call 0xc56e ; 0xc56e menu_depth = 0; 20fc2: 10 92 df 03 sts 0x03DF, r1 ; 0x8003df eFilamentAction = FilamentAction::None; // i.e. non-autoLoad 20fc6: 10 92 94 03 sts 0x0394, r1 ; 0x800394 } 20fca: 08 95 ret 00020fcc : // Filament [nr1.] was loaded, but [nr2.] is currently being loaded via tool change // Scenario 6: "?>?" // This scenario should not be possible and indicates a bug in the firmware uint8_t lcdui_print_extruder(void) { uint8_t chars = 1; lcd_space(1); 20fcc: 81 e0 ldi r24, 0x01 ; 1 20fce: 0e 94 28 6f call 0xde50 ; 0xde50 if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) { 20fd2: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e uint8_t __attribute__((noinline)) MMU2::get_current_tool() const { return extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : extruder; } uint8_t MMU2::get_tool_change_tool() const { return tool_change_extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : tool_change_extruder; 20fd6: 90 91 e9 12 lds r25, 0x12E9 ; 0x8012e9 20fda: 93 36 cpi r25, 0x63 ; 99 20fdc: 09 f4 brne .+2 ; 0x20fe0 20fde: 9f ef ldi r25, 0xFF ; 255 20fe0: 89 13 cpse r24, r25 20fe2: 0e c0 rjmp .+28 ; 0x21000 lcd_putc('F'); 20fe4: 86 e4 ldi r24, 0x46 ; 70 20fe6: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); 20fea: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 20fee: 8f 3f cpi r24, 0xFF ; 255 20ff0: 29 f0 breq .+10 ; 0x20ffc 20ff2: 8f 5c subi r24, 0xCF ; 207 20ff4: 0e 94 21 6f call 0xde42 ; 0xde42 20ff8: 83 e0 ldi r24, 0x03 ; 3 20ffa: 08 95 ret 20ffc: 8f e3 ldi r24, 0x3F ; 63 20ffe: fa cf rjmp .-12 ; 0x20ff4 chars += 2; } else { lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); 21000: 8f 3f cpi r24, 0xFF ; 255 21002: 89 f0 breq .+34 ; 0x21026 21004: 8f 5c subi r24, 0xCF ; 207 21006: 0e 94 21 6f call 0xde42 ; 0xde42 lcd_putc('>'); 2100a: 8e e3 ldi r24, 0x3E ; 62 2100c: 0e 94 21 6f call 0xde42 ; 0xde42 21010: 80 91 e9 12 lds r24, 0x12E9 ; 0x8012e9 21014: 83 36 cpi r24, 0x63 ; 99 21016: 49 f0 breq .+18 ; 0x2102a lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1'); 21018: 8f 3f cpi r24, 0xFF ; 255 2101a: 39 f0 breq .+14 ; 0x2102a 2101c: 8f 5c subi r24, 0xCF ; 207 2101e: 0e 94 21 6f call 0xde42 ; 0xde42 chars += 3; 21022: 84 e0 ldi r24, 0x04 ; 4 } return chars; } 21024: 08 95 ret if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) { lcd_putc('F'); lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); chars += 2; } else { lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); 21026: 8f e3 ldi r24, 0x3F ; 63 21028: ee cf rjmp .-36 ; 0x21006 lcd_putc('>'); lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1'); 2102a: 8f e3 ldi r24, 0x3F ; 63 2102c: f8 cf rjmp .-16 ; 0x2101e 0002102e : } public: //! brief state automaton step routine //! @param current_temp current hotend/bed temperature (for computing simple hysteresis) //! @param mintemp minimal temperature including hysteresis to check current_temp against void step(float current_temp, float mintemp){ 2102e: 0f 93 push r16 21030: 1f 93 push r17 21032: cf 93 push r28 21034: df 93 push r29 21036: ec 01 movw r28, r24 21038: cb 01 movw r24, r22 2103a: ba 01 movw r22, r20 static const char m1[] PROGMEM = "Please restart"; switch(state){ 2103c: 4a 81 ldd r20, Y+2 ; 0x02 2103e: 41 30 cpi r20, 0x01 ; 1 21040: 29 f0 breq .+10 ; 0x2104c 21042: 88 f0 brcs .+34 ; 0x21066 21044: 42 30 cpi r20, 0x02 ; 2 21046: 09 f1 breq .+66 ; 0x2108a 21048: 43 30 cpi r20, 0x03 ; 3 2104a: d1 f4 brne .+52 ; 0x21080 enum class States : uint8_t { Init = 0, TempAboveMintemp, ShowPleaseRestart, ShowMintemp }; States state = States::Init; uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV; void substep(const char* next_msg, States next_state){ if( repeat == 0 ){ 2104c: 8b 81 ldd r24, Y+3 ; 0x03 2104e: 81 11 cpse r24, r1 21050: 25 c0 rjmp .+74 ; 0x2109c state = next_state; // advance to the next state 21052: 82 e0 ldi r24, 0x02 ; 2 21054: 8a 83 std Y+2, r24 ; 0x02 lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL); 21056: 63 e0 ldi r22, 0x03 ; 3 21058: 84 e4 ldi r24, 0x44 ; 68 2105a: 97 e9 ldi r25, 0x97 ; 151 2105c: 0e 94 2c da call 0x1b458 ; 0x1b458 repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too 21060: 85 e0 ldi r24, 0x05 ; 5 } else { --repeat; 21062: 8b 83 std Y+3, r24 ; 0x03 21064: 0d c0 rjmp .+26 ; 0x21080 //! @param mintemp minimal temperature including hysteresis to check current_temp against void step(float current_temp, float mintemp){ static const char m1[] PROGMEM = "Please restart"; switch(state){ case States::Init: // initial state - check hysteresis if( current_temp > mintemp ){ 21066: a9 01 movw r20, r18 21068: 98 01 movw r18, r16 2106a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2106e: 18 16 cp r1, r24 21070: 3c f4 brge .+14 ; 0x21080 lcd_setalertstatuspgm(m2, LCD_STATUS_CRITICAL); 21072: 63 e0 ldi r22, 0x03 ; 3 21074: 88 81 ld r24, Y 21076: 99 81 ldd r25, Y+1 ; 0x01 21078: 0e 94 2c da call 0x1b458 ; 0x1b458 state = States::TempAboveMintemp; 2107c: 81 e0 ldi r24, 0x01 ; 1 2107e: 8a 83 std Y+2, r24 ; 0x02 break; case States::ShowPleaseRestart: // displaying "Please restart" substep(m2, States::ShowMintemp); break; } } 21080: df 91 pop r29 21082: cf 91 pop r28 21084: 1f 91 pop r17 21086: 0f 91 pop r16 21088: 08 95 ret enum class States : uint8_t { Init = 0, TempAboveMintemp, ShowPleaseRestart, ShowMintemp }; States state = States::Init; uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV; void substep(const char* next_msg, States next_state){ if( repeat == 0 ){ 2108a: 8b 81 ldd r24, Y+3 ; 0x03 2108c: 81 11 cpse r24, r1 2108e: 06 c0 rjmp .+12 ; 0x2109c case States::TempAboveMintemp: // the temperature has risen above the hysteresis check case States::ShowMintemp: // displaying "MINTEMP fixed" substep(m1, States::ShowPleaseRestart); break; case States::ShowPleaseRestart: // displaying "Please restart" substep(m2, States::ShowMintemp); 21090: 88 81 ld r24, Y 21092: 99 81 ldd r25, Y+1 ; 0x01 States state = States::Init; uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV; void substep(const char* next_msg, States next_state){ if( repeat == 0 ){ state = next_state; // advance to the next state 21094: 23 e0 ldi r18, 0x03 ; 3 21096: 2a 83 std Y+2, r18 ; 0x02 lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL); 21098: 63 e0 ldi r22, 0x03 ; 3 2109a: e0 cf rjmp .-64 ; 0x2105c repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too } else { --repeat; 2109c: 81 50 subi r24, 0x01 ; 1 2109e: e1 cf rjmp .-62 ; 0x21062 000210a0 : SERIAL_ECHO(_status); SERIAL_ECHO(']'); } static void prusa_stat_farm_number() { SERIAL_ECHOPGM("[PFN:0]"); 210a0: 82 e2 ldi r24, 0x22 ; 34 210a2: 99 e8 ldi r25, 0x89 ; 137 210a4: 0c 94 c4 7a jmp 0xf588 ; 0xf588 000210a8 : static void Sound_DoSound_Prompt(void) { backlight_wake(2); WRITE(BEEPER,HIGH); 210a8: 9f b7 in r25, 0x3f ; 63 210aa: f8 94 cli 210ac: e2 e0 ldi r30, 0x02 ; 2 210ae: f1 e0 ldi r31, 0x01 ; 1 210b0: 80 81 ld r24, Z 210b2: 84 60 ori r24, 0x04 ; 4 210b4: 80 83 st Z, r24 210b6: 9f bf out 0x3f, r25 ; 63 210b8: 2f ef ldi r18, 0xFF ; 255 210ba: 89 e6 ldi r24, 0x69 ; 105 210bc: 98 e1 ldi r25, 0x18 ; 24 210be: 21 50 subi r18, 0x01 ; 1 210c0: 80 40 sbci r24, 0x00 ; 0 210c2: 90 40 sbci r25, 0x00 ; 0 210c4: e1 f7 brne .-8 ; 0x210be 210c6: 00 c0 rjmp .+0 ; 0x210c8 210c8: 00 00 nop _delay_ms(500); WRITE(BEEPER,LOW); 210ca: 9f b7 in r25, 0x3f ; 63 210cc: f8 94 cli 210ce: 80 81 ld r24, Z 210d0: 8b 7f andi r24, 0xFB ; 251 210d2: 80 83 st Z, r24 210d4: 9f bf out 0x3f, r25 ; 63 } 210d6: 08 95 ret 000210d8 : SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)); SERIAL_ECHO(']'); } static void prusa_stat_temperatures() { SERIAL_ECHOPGM("[ST0:"); 210d8: 85 e4 ldi r24, 0x45 ; 69 210da: 99 e8 ldi r25, 0x89 ; 137 210dc: 0e 94 c4 7a call 0xf588 ; 0xf588 210e0: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 210e4: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 210e8: 07 2e mov r0, r23 210ea: 00 0c add r0, r0 210ec: 88 0b sbc r24, r24 210ee: 99 0b sbc r25, r25 210f0: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO(target_temperature[0]); SERIAL_ECHOPGM("][STB:"); 210f4: 8e e3 ldi r24, 0x3E ; 62 210f6: 99 e8 ldi r25, 0x89 ; 137 210f8: 0e 94 c4 7a call 0xf588 ; 0xf588 210fc: 60 91 59 12 lds r22, 0x1259 ; 0x801259 21100: 70 91 5a 12 lds r23, 0x125A ; 0x80125a 21104: 07 2e mov r0, r23 21106: 00 0c add r0, r0 21108: 88 0b sbc r24, r24 2110a: 99 0b sbc r25, r25 2110c: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO(target_temperature_bed); SERIAL_ECHOPGM("][AT0:"); 21110: 87 e3 ldi r24, 0x37 ; 55 21112: 99 e8 ldi r25, 0x89 ; 137 21114: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 21118: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2111c: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 21120: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 21124: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 21128: 42 e0 ldi r20, 0x02 ; 2 2112a: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_ECHO(current_temperature[0]); SERIAL_ECHOPGM("][ATB:"); 2112e: 80 e3 ldi r24, 0x30 ; 48 21130: 99 e8 ldi r25, 0x89 ; 137 21132: 0e 94 c4 7a call 0xf588 ; 0xf588 21136: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 2113a: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 2113e: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 21142: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 21146: 42 e0 ldi r20, 0x02 ; 2 21148: 0e 94 46 7a call 0xf48c ; 0xf48c } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2114c: 8d e5 ldi r24, 0x5D ; 93 2114e: 0c 94 b1 79 jmp 0xf362 ; 0xf362 00021152 : prusa_stat_printerstatus(statnr); prusa_stat_farm_number(); prusa_stat_printinfo(); } static void prusa_stat_printerstatus(uint8_t _status) { 21152: cf 93 push r28 21154: c8 2f mov r28, r24 SERIAL_ECHOPGM("[PRN:"); 21156: 8c e1 ldi r24, 0x1C ; 28 21158: 99 e8 ldi r25, 0x89 ; 137 2115a: 0e 94 c4 7a call 0xf588 ; 0xf588 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 2115e: 8c 2f mov r24, r28 21160: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 21164: 8d e5 ldi r24, 0x5D ; 93 SERIAL_ECHO(_status); SERIAL_ECHO(']'); } 21166: cf 91 pop r28 21168: 0c 94 b1 79 jmp 0xf362 ; 0xf362 0002116c : #ifdef PRUSA_M28 static void trace(); #endif static void prusa_statistics_err(char c) { 2116c: cf 93 push r28 2116e: c8 2f mov r28, r24 SERIAL_ECHOPGM("{[ERR:"); 21170: 85 ee ldi r24, 0xE5 ; 229 21172: 98 e8 ldi r25, 0x88 ; 136 21174: 0e 94 c4 7a call 0xf588 ; 0xf588 21178: 8c 2f mov r24, r28 2117a: 0e 94 b1 79 call 0xf362 ; 0xf362 2117e: 8d e5 ldi r24, 0x5D ; 93 21180: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_ECHO(c); SERIAL_ECHO(']'); prusa_stat_farm_number(); } 21184: cf 91 pop r28 static void prusa_statistics_err(char c) { SERIAL_ECHOPGM("{[ERR:"); SERIAL_ECHO(c); SERIAL_ECHO(']'); prusa_stat_farm_number(); 21186: 0d 94 50 08 jmp 0x210a0 ; 0x210a0 0002118a : static void prusa_stat_farm_number() { SERIAL_ECHOPGM("[PFN:0]"); } static void prusa_stat_diameter() { SERIAL_ECHOPGM("[DIA:"); 2118a: 8a e2 ldi r24, 0x2A ; 42 2118c: 99 e8 ldi r25, 0x89 ; 137 2118e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)); 21192: 85 ea ldi r24, 0xA5 ; 165 21194: 9d e0 ldi r25, 0x0D ; 13 21196: 0f 94 ee a3 call 0x347dc ; 0x347dc print((long) n, base); } void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); 2119a: bc 01 movw r22, r24 2119c: 90 e0 ldi r25, 0x00 ; 0 2119e: 80 e0 ldi r24, 0x00 ; 0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 211a0: 4a e0 ldi r20, 0x0A ; 10 211a2: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 211a6: 8d e5 ldi r24, 0x5D ; 93 211a8: 0c 94 b1 79 jmp 0xf362 ; 0xf362 000211ac : // Minimum stepper rate 120Hz. #define MINIMAL_STEP_RATE 120 // Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors. void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit_speed) { 211ac: 2f 92 push r2 211ae: 3f 92 push r3 211b0: 4f 92 push r4 211b2: 5f 92 push r5 211b4: 6f 92 push r6 211b6: 7f 92 push r7 211b8: 8f 92 push r8 211ba: 9f 92 push r9 211bc: af 92 push r10 211be: bf 92 push r11 211c0: cf 92 push r12 211c2: df 92 push r13 211c4: ef 92 push r14 211c6: ff 92 push r15 211c8: 0f 93 push r16 211ca: 1f 93 push r17 211cc: cf 93 push r28 211ce: df 93 push r29 211d0: cd b7 in r28, 0x3d ; 61 211d2: de b7 in r29, 0x3e ; 62 211d4: a1 97 sbiw r28, 0x21 ; 33 211d6: 0f b6 in r0, 0x3f ; 63 211d8: f8 94 cli 211da: de bf out 0x3e, r29 ; 62 211dc: 0f be out 0x3f, r0 ; 63 211de: cd bf out 0x3d, r28 ; 61 211e0: 1c 01 movw r2, r24 211e2: 48 01 movw r8, r16 211e4: 59 01 movw r10, r18 // These two lines are the only floating point calculations performed in this routine. // initial_rate, final_rate in Hz. // Minimum stepper rate 120Hz, maximum 40kHz. If the stepper rate goes above 10kHz, // the stepper interrupt routine groups the pulses by 2 or 4 pulses per interrupt tick. uint32_t initial_rate = ceil(entry_speed * block->speed_factor); // (step/min) 211e6: fc 01 movw r30, r24 211e8: e8 5b subi r30, 0xB8 ; 184 211ea: ff 4f sbci r31, 0xFF ; 255 211ec: c0 80 ld r12, Z 211ee: d1 80 ldd r13, Z+1 ; 0x01 211f0: e2 80 ldd r14, Z+2 ; 0x02 211f2: f3 80 ldd r15, Z+3 ; 0x03 211f4: 9a 01 movw r18, r20 211f6: ab 01 movw r20, r22 211f8: c7 01 movw r24, r14 211fa: b6 01 movw r22, r12 211fc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 21200: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 21204: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 21208: 8b 01 movw r16, r22 2120a: 8d 83 std Y+5, r24 ; 0x05 2120c: 99 83 std Y+1, r25 ; 0x01 uint32_t final_rate = ceil(exit_speed * block->speed_factor); // (step/min) 2120e: a5 01 movw r20, r10 21210: 94 01 movw r18, r8 21212: c7 01 movw r24, r14 21214: b6 01 movw r22, r12 21216: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2121a: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 2121e: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 21222: 36 2f mov r19, r22 21224: 27 2f mov r18, r23 21226: a8 01 movw r20, r16 21228: 6d 81 ldd r22, Y+5 ; 0x05 2122a: 79 81 ldd r23, Y+1 ; 0x01 2122c: 48 37 cpi r20, 0x78 ; 120 2122e: 51 05 cpc r21, r1 21230: 61 05 cpc r22, r1 21232: 71 05 cpc r23, r1 21234: 20 f4 brcc .+8 ; 0x2123e 21236: 48 e7 ldi r20, 0x78 ; 120 21238: 50 e0 ldi r21, 0x00 ; 0 2123a: 60 e0 ldi r22, 0x00 ; 0 2123c: 70 e0 ldi r23, 0x00 ; 0 // Limit minimal step rate (Otherwise the timer will overflow.) if (initial_rate < MINIMAL_STEP_RATE) initial_rate = MINIMAL_STEP_RATE; if (initial_rate > block->nominal_rate) 2123e: d1 01 movw r26, r2 21240: d6 96 adiw r26, 0x36 ; 54 21242: 8d 90 ld r8, X+ 21244: 9d 90 ld r9, X+ 21246: ad 90 ld r10, X+ 21248: bc 90 ld r11, X 2124a: d9 97 sbiw r26, 0x39 ; 57 2124c: 8f 8a std Y+23, r8 ; 0x17 2124e: 98 8e std Y+24, r9 ; 0x18 21250: a9 8e std Y+25, r10 ; 0x19 21252: ba 8e std Y+26, r11 ; 0x1a 21254: 48 15 cp r20, r8 21256: 59 05 cpc r21, r9 21258: 6a 05 cpc r22, r10 2125a: 7b 05 cpc r23, r11 2125c: 20 f4 brcc .+8 ; 0x21266 2125e: 4f 8b std Y+23, r20 ; 0x17 21260: 58 8f std Y+24, r21 ; 0x18 21262: 69 8f std Y+25, r22 ; 0x19 21264: 7a 8f std Y+26, r23 ; 0x1a 21266: 43 2f mov r20, r19 21268: 52 2f mov r21, r18 2126a: bc 01 movw r22, r24 2126c: 48 37 cpi r20, 0x78 ; 120 2126e: 51 05 cpc r21, r1 21270: 61 05 cpc r22, r1 21272: 71 05 cpc r23, r1 21274: 20 f4 brcc .+8 ; 0x2127e 21276: 48 e7 ldi r20, 0x78 ; 120 21278: 50 e0 ldi r21, 0x00 ; 0 2127a: 60 e0 ldi r22, 0x00 ; 0 2127c: 70 e0 ldi r23, 0x00 ; 0 2127e: 18 2d mov r17, r8 21280: 09 2d mov r16, r9 21282: a9 a2 std Y+33, r10 ; 0x21 21284: b8 a2 std Y+32, r11 ; 0x20 21286: 48 15 cp r20, r8 21288: 59 05 cpc r21, r9 2128a: 6a 05 cpc r22, r10 2128c: 7b 05 cpc r23, r11 2128e: 20 f4 brcc .+8 ; 0x21298 21290: 14 2f mov r17, r20 21292: 05 2f mov r16, r21 21294: 69 a3 std Y+33, r22 ; 0x21 21296: 78 a3 std Y+32, r23 ; 0x20 if (final_rate < MINIMAL_STEP_RATE) final_rate = MINIMAL_STEP_RATE; if (final_rate > block->nominal_rate) final_rate = block->nominal_rate; uint32_t acceleration = block->acceleration_steps_per_s2; 21298: f1 01 movw r30, r2 2129a: ee 5b subi r30, 0xBE ; 190 2129c: ff 4f sbci r31, 0xFF ; 255 2129e: c0 80 ld r12, Z 212a0: d1 80 ldd r13, Z+1 ; 0x01 212a2: e2 80 ldd r14, Z+2 ; 0x02 212a4: f3 80 ldd r15, Z+3 ; 0x03 212a6: cd 82 std Y+5, r12 ; 0x05 212a8: de 82 std Y+6, r13 ; 0x06 212aa: ef 82 std Y+7, r14 ; 0x07 212ac: f8 86 std Y+8, r15 ; 0x08 if (acceleration == 0) 212ae: cd 28 or r12, r13 212b0: ce 28 or r12, r14 212b2: cf 28 or r12, r15 212b4: 41 f4 brne .+16 ; 0x212c6 // Don't allow zero acceleration. acceleration = 1; 212b6: c1 2c mov r12, r1 212b8: d1 2c mov r13, r1 212ba: 76 01 movw r14, r12 212bc: c3 94 inc r12 212be: cd 82 std Y+5, r12 ; 0x05 212c0: de 82 std Y+6, r13 ; 0x06 212c2: ef 82 std Y+7, r14 ; 0x07 212c4: f8 86 std Y+8, r15 ; 0x08 // estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) // (target_rate*target_rate-initial_rate*initial_rate)/(2.0*acceleration)); uint32_t initial_rate_sqr = initial_rate*initial_rate; 212c6: 2f 89 ldd r18, Y+23 ; 0x17 212c8: 38 8d ldd r19, Y+24 ; 0x18 212ca: 49 8d ldd r20, Y+25 ; 0x19 212cc: 5a 8d ldd r21, Y+26 ; 0x1a 212ce: b9 01 movw r22, r18 212d0: ca 01 movw r24, r20 212d2: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 212d6: 6d 87 std Y+13, r22 ; 0x0d 212d8: 7e 87 std Y+14, r23 ; 0x0e 212da: 8f 87 std Y+15, r24 ; 0x0f 212dc: 98 8b std Y+16, r25 ; 0x10 //FIXME assert that this result fits a 64bit unsigned int. uint32_t nominal_rate_sqr = block->nominal_rate*block->nominal_rate; 212de: a5 01 movw r20, r10 212e0: 94 01 movw r18, r8 212e2: c5 01 movw r24, r10 212e4: b4 01 movw r22, r8 212e6: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 212ea: 2b 01 movw r4, r22 212ec: 3c 01 movw r6, r24 uint32_t final_rate_sqr = final_rate*final_rate; 212ee: 21 2f mov r18, r17 212f0: 30 2f mov r19, r16 212f2: 49 a1 ldd r20, Y+33 ; 0x21 212f4: 58 a1 ldd r21, Y+32 ; 0x20 212f6: 61 2f mov r22, r17 212f8: 70 2f mov r23, r16 212fa: ca 01 movw r24, r20 212fc: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 21300: 69 8b std Y+17, r22 ; 0x11 21302: 7a 8b std Y+18, r23 ; 0x12 21304: 8b 8b std Y+19, r24 ; 0x13 21306: 9c 8b std Y+20, r25 ; 0x14 uint32_t acceleration_x2 = acceleration << 1; 21308: cd 80 ldd r12, Y+5 ; 0x05 2130a: de 80 ldd r13, Y+6 ; 0x06 2130c: ef 80 ldd r14, Y+7 ; 0x07 2130e: f8 84 ldd r15, Y+8 ; 0x08 21310: cc 0c add r12, r12 21312: dd 1c adc r13, r13 21314: ee 1c adc r14, r14 21316: ff 1c adc r15, r15 21318: c9 86 std Y+9, r12 ; 0x09 2131a: da 86 std Y+10, r13 ; 0x0a 2131c: eb 86 std Y+11, r14 ; 0x0b 2131e: fc 86 std Y+12, r15 ; 0x0c // ceil(estimate_acceleration_distance(initial_rate, block->nominal_rate, acceleration)); uint32_t accelerate_steps = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2; 21320: c3 01 movw r24, r6 21322: b2 01 movw r22, r4 21324: 61 50 subi r22, 0x01 ; 1 21326: 71 09 sbc r23, r1 21328: 81 09 sbc r24, r1 2132a: 91 09 sbc r25, r1 2132c: cd 84 ldd r12, Y+13 ; 0x0d 2132e: de 84 ldd r13, Y+14 ; 0x0e 21330: ef 84 ldd r14, Y+15 ; 0x0f 21332: f8 88 ldd r15, Y+16 ; 0x10 21334: 6c 19 sub r22, r12 21336: 7d 09 sbc r23, r13 21338: 8e 09 sbc r24, r14 2133a: 9f 09 sbc r25, r15 2133c: c9 84 ldd r12, Y+9 ; 0x09 2133e: da 84 ldd r13, Y+10 ; 0x0a 21340: eb 84 ldd r14, Y+11 ; 0x0b 21342: fc 84 ldd r15, Y+12 ; 0x0c 21344: 6c 0d add r22, r12 21346: 7d 1d adc r23, r13 21348: 8e 1d adc r24, r14 2134a: 9f 1d adc r25, r15 2134c: a7 01 movw r20, r14 2134e: 96 01 movw r18, r12 21350: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 21354: 69 01 movw r12, r18 21356: 7a 01 movw r14, r20 // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration)); uint32_t decelerate_steps = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2; 21358: c3 01 movw r24, r6 2135a: b2 01 movw r22, r4 2135c: 29 89 ldd r18, Y+17 ; 0x11 2135e: 3a 89 ldd r19, Y+18 ; 0x12 21360: 4b 89 ldd r20, Y+19 ; 0x13 21362: 5c 89 ldd r21, Y+20 ; 0x14 21364: 62 1b sub r22, r18 21366: 73 0b sbc r23, r19 21368: 84 0b sbc r24, r20 2136a: 95 0b sbc r25, r21 2136c: 29 85 ldd r18, Y+9 ; 0x09 2136e: 3a 85 ldd r19, Y+10 ; 0x0a 21370: 4b 85 ldd r20, Y+11 ; 0x0b 21372: 5c 85 ldd r21, Y+12 ; 0x0c 21374: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 21378: 29 01 movw r4, r18 2137a: 3a 01 movw r6, r20 uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; 2137c: d7 01 movw r26, r14 2137e: c6 01 movw r24, r12 21380: 84 0d add r24, r4 21382: 95 1d adc r25, r5 21384: a6 1d adc r26, r6 21386: b7 1d adc r27, r7 21388: 8c 8f std Y+28, r24 ; 0x1c 2138a: 9d 8f std Y+29, r25 ; 0x1d 2138c: ae 8f std Y+30, r26 ; 0x1e 2138e: bf 8f std Y+31, r27 ; 0x1f uint32_t plateau_steps = 0; #ifdef LIN_ADVANCE uint16_t final_adv_steps = 0; uint16_t max_adv_steps = 0; if (block->use_advance_lead) { 21390: f1 01 movw r30, r2 21392: e4 5b subi r30, 0xB4 ; 180 21394: ff 4f sbci r31, 0xFF ; 255 21396: 90 81 ld r25, Z 21398: 9b 8f std Y+27, r25 ; 0x1b 2139a: 99 23 and r25, r25 2139c: 09 f4 brne .+2 ; 0x213a0 2139e: 8d c0 rjmp .+282 ; 0x214ba final_adv_steps = final_rate * block->adv_comp; 213a0: 61 2f mov r22, r17 213a2: 70 2f mov r23, r16 213a4: 89 a1 ldd r24, Y+33 ; 0x21 213a6: 98 a1 ldd r25, Y+32 ; 0x20 213a8: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 213ac: f1 01 movw r30, r2 213ae: ec 5a subi r30, 0xAC ; 172 213b0: ff 4f sbci r31, 0xFF ; 255 213b2: 20 81 ld r18, Z 213b4: 31 81 ldd r19, Z+1 ; 0x01 213b6: 42 81 ldd r20, Z+2 ; 0x02 213b8: 53 81 ldd r21, Z+3 ; 0x03 213ba: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 213be: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 213c2: 6d 8b std Y+21, r22 ; 0x15 213c4: 7e 8b std Y+22, r23 ; 0x16 #endif // Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will // have to use intersection_distance() to calculate when to abort acceleration and start braking // in order to reach the final_rate exactly at the end of this block. if (accel_decel_steps < block->step_event_count.wide) { 213c6: d1 01 movw r26, r2 213c8: 50 96 adiw r26, 0x10 ; 16 213ca: 2d 91 ld r18, X+ 213cc: 3d 91 ld r19, X+ 213ce: 4d 91 ld r20, X+ 213d0: 5c 91 ld r21, X 213d2: 53 97 sbiw r26, 0x13 ; 19 213d4: 29 83 std Y+1, r18 ; 0x01 213d6: 3a 83 std Y+2, r19 ; 0x02 213d8: 4b 83 std Y+3, r20 ; 0x03 213da: 5c 83 std Y+4, r21 ; 0x04 213dc: 8c 8d ldd r24, Y+28 ; 0x1c 213de: 9d 8d ldd r25, Y+29 ; 0x1d 213e0: ae 8d ldd r26, Y+30 ; 0x1e 213e2: bf 8d ldd r27, Y+31 ; 0x1f 213e4: 82 17 cp r24, r18 213e6: 93 07 cpc r25, r19 213e8: a4 07 cpc r26, r20 213ea: b5 07 cpc r27, r21 213ec: 08 f0 brcs .+2 ; 0x213f0 213ee: 68 c0 rjmp .+208 ; 0x214c0 plateau_steps = block->step_event_count.wide - accel_decel_steps; 213f0: 29 01 movw r4, r18 213f2: 3a 01 movw r6, r20 213f4: 48 1a sub r4, r24 213f6: 59 0a sbc r5, r25 213f8: 6a 0a sbc r6, r26 213fa: 7b 0a sbc r7, r27 #ifdef LIN_ADVANCE if (block->use_advance_lead) 213fc: 9b 8d ldd r25, Y+27 ; 0x1b // Size of Plateau of Nominal Rate. uint32_t plateau_steps = 0; #ifdef LIN_ADVANCE uint16_t final_adv_steps = 0; uint16_t max_adv_steps = 0; 213fe: 40 e0 ldi r20, 0x00 ; 0 21400: 80 e0 ldi r24, 0x00 ; 0 // have to use intersection_distance() to calculate when to abort acceleration and start braking // in order to reach the final_rate exactly at the end of this block. if (accel_decel_steps < block->step_event_count.wide) { plateau_steps = block->step_event_count.wide - accel_decel_steps; #ifdef LIN_ADVANCE if (block->use_advance_lead) 21402: 99 23 and r25, r25 21404: 89 f0 breq .+34 ; 0x21428 max_adv_steps = block->nominal_rate * block->adv_comp; 21406: c5 01 movw r24, r10 21408: b4 01 movw r22, r8 2140a: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2140e: f1 01 movw r30, r2 21410: ec 5a subi r30, 0xAC ; 172 21412: ff 4f sbci r31, 0xFF ; 255 21414: 20 81 ld r18, Z 21416: 31 81 ldd r19, Z+1 ; 0x01 21418: 42 81 ldd r20, Z+2 ; 0x02 2141a: 53 81 ldd r21, Z+3 ; 0x03 2141c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 21420: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 21424: 46 2f mov r20, r22 21426: 87 2f mov r24, r23 } } #endif } CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section 21428: 3f b7 in r19, 0x3f ; 63 2142a: f8 94 cli // This block locks the interrupts globally for 4.38 us, // which corresponds to a maximum repeat frequency of 228.57 kHz. // This blocking is safe in the context of a 10kHz stepper driver interrupt // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz. if (! block->busy) { // Don't update variables if block is busy. 2142c: f1 01 movw r30, r2 2142e: e9 5b subi r30, 0xB9 ; 185 21430: ff 4f sbci r31, 0xFF ; 255 21432: 20 81 ld r18, Z 21434: 21 11 cpse r18, r1 21436: 27 c0 rjmp .+78 ; 0x21486 block->accelerate_until = accelerate_steps; 21438: d1 01 movw r26, r2 2143a: 59 96 adiw r26, 0x19 ; 25 2143c: cd 92 st X+, r12 2143e: dd 92 st X+, r13 21440: ed 92 st X+, r14 21442: fc 92 st X, r15 21444: 5c 97 sbiw r26, 0x1c ; 28 block->decelerate_after = accelerate_steps+plateau_steps; 21446: c4 0c add r12, r4 21448: d5 1c adc r13, r5 2144a: e6 1c adc r14, r6 2144c: f7 1c adc r15, r7 2144e: f1 01 movw r30, r2 21450: c5 8e std Z+29, r12 ; 0x1d 21452: d6 8e std Z+30, r13 ; 0x1e 21454: e7 8e std Z+31, r14 ; 0x1f 21456: f0 a2 std Z+32, r15 ; 0x20 block->initial_rate = initial_rate; 21458: cf 88 ldd r12, Y+23 ; 0x17 2145a: c2 ae std Z+58, r12 ; 0x3a 2145c: d8 8c ldd r13, Y+24 ; 0x18 2145e: d3 ae std Z+59, r13 ; 0x3b 21460: e9 8c ldd r14, Y+25 ; 0x19 21462: e4 ae std Z+60, r14 ; 0x3c 21464: fa 8c ldd r15, Y+26 ; 0x1a 21466: f5 ae std Z+61, r15 ; 0x3d block->final_rate = final_rate; 21468: fe 96 adiw r30, 0x3e ; 62 2146a: 10 83 st Z, r17 2146c: 01 83 std Z+1, r16 ; 0x01 2146e: c9 a0 ldd r12, Y+33 ; 0x21 21470: c2 82 std Z+2, r12 ; 0x02 21472: d8 a0 ldd r13, Y+32 ; 0x20 21474: d3 82 std Z+3, r13 ; 0x03 #ifdef LIN_ADVANCE block->final_adv_steps = final_adv_steps; 21476: 73 96 adiw r30, 0x13 ; 19 21478: ed 88 ldd r14, Y+21 ; 0x15 2147a: e0 82 st Z, r14 2147c: fe 88 ldd r15, Y+22 ; 0x16 2147e: f1 82 std Z+1, r15 ; 0x01 block->max_adv_steps = max_adv_steps; 21480: 32 97 sbiw r30, 0x02 ; 2 21482: 40 83 st Z, r20 21484: 81 83 std Z+1, r24 ; 0x01 #endif } CRITICAL_SECTION_END; 21486: 3f bf out 0x3f, r19 ; 63 } 21488: a1 96 adiw r28, 0x21 ; 33 2148a: 0f b6 in r0, 0x3f ; 63 2148c: f8 94 cli 2148e: de bf out 0x3e, r29 ; 62 21490: 0f be out 0x3f, r0 ; 63 21492: cd bf out 0x3d, r28 ; 61 21494: df 91 pop r29 21496: cf 91 pop r28 21498: 1f 91 pop r17 2149a: 0f 91 pop r16 2149c: ff 90 pop r15 2149e: ef 90 pop r14 214a0: df 90 pop r13 214a2: cf 90 pop r12 214a4: bf 90 pop r11 214a6: af 90 pop r10 214a8: 9f 90 pop r9 214aa: 8f 90 pop r8 214ac: 7f 90 pop r7 214ae: 6f 90 pop r6 214b0: 5f 90 pop r5 214b2: 4f 90 pop r4 214b4: 3f 90 pop r3 214b6: 2f 90 pop r2 214b8: 08 95 ret uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; // Size of Plateau of Nominal Rate. uint32_t plateau_steps = 0; #ifdef LIN_ADVANCE uint16_t final_adv_steps = 0; 214ba: 1d 8a std Y+21, r1 ; 0x15 214bc: 1e 8a std Y+22, r1 ; 0x16 214be: 83 cf rjmp .-250 ; 0x213c6 #ifdef LIN_ADVANCE if (block->use_advance_lead) max_adv_steps = block->nominal_rate * block->adv_comp; #endif } else { uint32_t acceleration_x4 = acceleration << 2; 214c0: 2d 81 ldd r18, Y+5 ; 0x05 214c2: 3e 81 ldd r19, Y+6 ; 0x06 214c4: 4f 81 ldd r20, Y+7 ; 0x07 214c6: 58 85 ldd r21, Y+8 ; 0x08 214c8: 82 e0 ldi r24, 0x02 ; 2 214ca: 22 0f add r18, r18 214cc: 33 1f adc r19, r19 214ce: 44 1f adc r20, r20 214d0: 55 1f adc r21, r21 214d2: 8a 95 dec r24 214d4: d1 f7 brne .-12 ; 0x214ca 214d6: 89 81 ldd r24, Y+1 ; 0x01 214d8: 9a 81 ldd r25, Y+2 ; 0x02 214da: ab 81 ldd r26, Y+3 ; 0x03 214dc: bc 81 ldd r27, Y+4 ; 0x04 214de: 81 70 andi r24, 0x01 ; 1 214e0: 99 27 eor r25, r25 214e2: aa 27 eor r26, r26 214e4: bb 27 eor r27, r27 214e6: 8d 83 std Y+5, r24 ; 0x05 214e8: 9e 83 std Y+6, r25 ; 0x06 214ea: af 83 std Y+7, r26 ; 0x07 214ec: b8 87 std Y+8, r27 ; 0x08 214ee: 89 80 ldd r8, Y+1 ; 0x01 214f0: 9a 80 ldd r9, Y+2 ; 0x02 214f2: ab 80 ldd r10, Y+3 ; 0x03 214f4: bc 80 ldd r11, Y+4 ; 0x04 214f6: b6 94 lsr r11 214f8: a7 94 ror r10 214fa: 97 94 ror r9 214fc: 87 94 ror r8 // Avoid negative numbers if (final_rate_sqr >= initial_rate_sqr) { 214fe: cd 84 ldd r12, Y+13 ; 0x0d 21500: de 84 ldd r13, Y+14 ; 0x0e 21502: ef 84 ldd r14, Y+15 ; 0x0f 21504: f8 88 ldd r15, Y+16 ; 0x10 21506: 89 89 ldd r24, Y+17 ; 0x11 21508: 9a 89 ldd r25, Y+18 ; 0x12 2150a: ab 89 ldd r26, Y+19 ; 0x13 2150c: bc 89 ldd r27, Y+20 ; 0x14 2150e: 8c 15 cp r24, r12 21510: 9d 05 cpc r25, r13 21512: ae 05 cpc r26, r14 21514: bf 05 cpc r27, r15 21516: 08 f4 brcc .+2 ; 0x2151a 21518: 6f c0 rjmp .+222 ; 0x215f8 // intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) // (2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4.0*acceleration); #if 0 accelerate_steps = (block->step_event_count >> 1) + (final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1 + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; #else accelerate_steps = final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1; 2151a: 6c 01 movw r12, r24 2151c: 7d 01 movw r14, r26 2151e: 91 e0 ldi r25, 0x01 ; 1 21520: c9 1a sub r12, r25 21522: d1 08 sbc r13, r1 21524: e1 08 sbc r14, r1 21526: f1 08 sbc r15, r1 21528: 8d 85 ldd r24, Y+13 ; 0x0d 2152a: 9e 85 ldd r25, Y+14 ; 0x0e 2152c: af 85 ldd r26, Y+15 ; 0x0f 2152e: b8 89 ldd r27, Y+16 ; 0x10 21530: c8 1a sub r12, r24 21532: d9 0a sbc r13, r25 21534: ea 0a sbc r14, r26 21536: fb 0a sbc r15, r27 21538: c7 01 movw r24, r14 2153a: b6 01 movw r22, r12 2153c: 62 0f add r22, r18 2153e: 73 1f adc r23, r19 21540: 84 1f adc r24, r20 21542: 95 1f adc r25, r21 if (block->step_event_count.wide & 1) 21544: cd 80 ldd r12, Y+5 ; 0x05 21546: de 80 ldd r13, Y+6 ; 0x06 21548: ef 80 ldd r14, Y+7 ; 0x07 2154a: f8 84 ldd r15, Y+8 ; 0x08 2154c: cd 28 or r12, r13 2154e: ce 28 or r12, r14 21550: cf 28 or r12, r15 21552: 41 f0 breq .+16 ; 0x21564 accelerate_steps += acceleration_x2; 21554: c9 84 ldd r12, Y+9 ; 0x09 21556: da 84 ldd r13, Y+10 ; 0x0a 21558: eb 84 ldd r14, Y+11 ; 0x0b 2155a: fc 84 ldd r15, Y+12 ; 0x0c 2155c: 6c 0d add r22, r12 2155e: 7d 1d adc r23, r13 21560: 8e 1d adc r24, r14 21562: 9f 1d adc r25, r15 accelerate_steps /= acceleration_x4; 21564: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 21568: 75 01 movw r14, r10 2156a: 64 01 movw r12, r8 2156c: c2 0e add r12, r18 2156e: d3 1e adc r13, r19 21570: e4 1e adc r14, r20 21572: f5 1e adc r15, r21 21574: 29 81 ldd r18, Y+1 ; 0x01 21576: 3a 81 ldd r19, Y+2 ; 0x02 21578: 4b 81 ldd r20, Y+3 ; 0x03 2157a: 5c 81 ldd r21, Y+4 ; 0x04 2157c: 2c 15 cp r18, r12 2157e: 3d 05 cpc r19, r13 21580: 4e 05 cpc r20, r14 21582: 5f 05 cpc r21, r15 21584: 10 f4 brcc .+4 ; 0x2158a 21586: 69 01 movw r12, r18 21588: 7a 01 movw r14, r20 decelerate_steps = block->step_event_count.wide; accelerate_steps = block->step_event_count.wide - decelerate_steps; } #ifdef LIN_ADVANCE if (block->use_advance_lead) { 2158a: 2b 8d ldd r18, Y+27 ; 0x1b 2158c: 22 23 and r18, r18 2158e: 09 f4 brne .+2 ; 0x21592 21590: 69 c0 rjmp .+210 ; 0x21664 if(!accelerate_steps || !decelerate_steps) { 21592: c1 14 cp r12, r1 21594: d1 04 cpc r13, r1 21596: e1 04 cpc r14, r1 21598: f1 04 cpc r15, r1 2159a: 09 f4 brne .+2 ; 0x2159e 2159c: 66 c0 rjmp .+204 ; 0x2166a // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate max_adv_steps = final_adv_steps; 2159e: 4d 89 ldd r20, Y+21 ; 0x15 215a0: 8e 89 ldd r24, Y+22 ; 0x16 accelerate_steps = block->step_event_count.wide - decelerate_steps; } #ifdef LIN_ADVANCE if (block->use_advance_lead) { if(!accelerate_steps || !decelerate_steps) { 215a2: 41 14 cp r4, r1 215a4: 51 04 cpc r5, r1 215a6: 61 04 cpc r6, r1 215a8: 71 04 cpc r7, r1 215aa: 09 f4 brne .+2 ; 0x215ae 215ac: 3d cf rjmp .-390 ; 0x21428 // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate max_adv_steps = final_adv_steps; } else { float max_rate = sqrt(acceleration_x2 * accelerate_steps + initial_rate_sqr); 215ae: a7 01 movw r20, r14 215b0: 96 01 movw r18, r12 215b2: 69 85 ldd r22, Y+9 ; 0x09 215b4: 7a 85 ldd r23, Y+10 ; 0x0a 215b6: 8b 85 ldd r24, Y+11 ; 0x0b 215b8: 9c 85 ldd r25, Y+12 ; 0x0c 215ba: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 215be: 2d 85 ldd r18, Y+13 ; 0x0d 215c0: 3e 85 ldd r19, Y+14 ; 0x0e 215c2: 4f 85 ldd r20, Y+15 ; 0x0f 215c4: 58 89 ldd r21, Y+16 ; 0x10 215c6: 62 0f add r22, r18 215c8: 73 1f adc r23, r19 215ca: 84 1f adc r24, r20 215cc: 95 1f adc r25, r21 215ce: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 215d2: 0f 94 d6 a8 call 0x351ac ; 0x351ac max_adv_steps = max_rate * block->adv_comp; 215d6: f1 01 movw r30, r2 215d8: ec 5a subi r30, 0xAC ; 172 215da: ff 4f sbci r31, 0xFF ; 255 215dc: 20 81 ld r18, Z 215de: 31 81 ldd r19, Z+1 ; 0x01 215e0: 42 81 ldd r20, Z+2 ; 0x02 215e2: 53 81 ldd r21, Z+3 ; 0x03 215e4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 215e8: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 215ec: 46 2f mov r20, r22 215ee: 87 2f mov r24, r23 uint32_t accelerate_steps = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2; // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration)); uint32_t decelerate_steps = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2; uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; // Size of Plateau of Nominal Rate. uint32_t plateau_steps = 0; 215f0: 41 2c mov r4, r1 215f2: 51 2c mov r5, r1 215f4: 32 01 movw r6, r4 215f6: 18 cf rjmp .-464 ; 0x21428 accelerate_steps = block->step_event_count.wide; } else { #if 0 decelerate_steps = (block->step_event_count >> 1) + (initial_rate_sqr - final_rate_sqr + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; #else decelerate_steps = initial_rate_sqr - final_rate_sqr; 215f8: 6d 85 ldd r22, Y+13 ; 0x0d 215fa: 7e 85 ldd r23, Y+14 ; 0x0e 215fc: 8f 85 ldd r24, Y+15 ; 0x0f 215fe: 98 89 ldd r25, Y+16 ; 0x10 21600: c9 88 ldd r12, Y+17 ; 0x11 21602: da 88 ldd r13, Y+18 ; 0x12 21604: eb 88 ldd r14, Y+19 ; 0x13 21606: fc 88 ldd r15, Y+20 ; 0x14 21608: 6c 19 sub r22, r12 2160a: 7d 09 sbc r23, r13 2160c: 8e 09 sbc r24, r14 2160e: 9f 09 sbc r25, r15 if (block->step_event_count.wide & 1) 21610: cd 80 ldd r12, Y+5 ; 0x05 21612: de 80 ldd r13, Y+6 ; 0x06 21614: ef 80 ldd r14, Y+7 ; 0x07 21616: f8 84 ldd r15, Y+8 ; 0x08 21618: cd 28 or r12, r13 2161a: ce 28 or r12, r14 2161c: cf 28 or r12, r15 2161e: 41 f0 breq .+16 ; 0x21630 decelerate_steps += acceleration_x2; 21620: c9 84 ldd r12, Y+9 ; 0x09 21622: da 84 ldd r13, Y+10 ; 0x0a 21624: eb 84 ldd r14, Y+11 ; 0x0b 21626: fc 84 ldd r15, Y+12 ; 0x0c 21628: 6c 0d add r22, r12 2162a: 7d 1d adc r23, r13 2162c: 8e 1d adc r24, r14 2162e: 9f 1d adc r25, r15 decelerate_steps /= acceleration_x4; 21630: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> decelerate_steps += (block->step_event_count.wide >> 1); 21634: 82 0e add r8, r18 21636: 93 1e adc r9, r19 21638: a4 1e adc r10, r20 2163a: b5 1e adc r11, r21 2163c: 49 80 ldd r4, Y+1 ; 0x01 2163e: 5a 80 ldd r5, Y+2 ; 0x02 21640: 6b 80 ldd r6, Y+3 ; 0x03 21642: 7c 80 ldd r7, Y+4 ; 0x04 21644: 84 14 cp r8, r4 21646: 95 04 cpc r9, r5 21648: a6 04 cpc r10, r6 2164a: b7 04 cpc r11, r7 2164c: 10 f4 brcc .+4 ; 0x21652 2164e: 24 01 movw r4, r8 21650: 35 01 movw r6, r10 #endif if (decelerate_steps > block->step_event_count.wide) decelerate_steps = block->step_event_count.wide; accelerate_steps = block->step_event_count.wide - decelerate_steps; 21652: c9 80 ldd r12, Y+1 ; 0x01 21654: da 80 ldd r13, Y+2 ; 0x02 21656: eb 80 ldd r14, Y+3 ; 0x03 21658: fc 80 ldd r15, Y+4 ; 0x04 2165a: c4 18 sub r12, r4 2165c: d5 08 sbc r13, r5 2165e: e6 08 sbc r14, r6 21660: f7 08 sbc r15, r7 21662: 93 cf rjmp .-218 ; 0x2158a // Size of Plateau of Nominal Rate. uint32_t plateau_steps = 0; #ifdef LIN_ADVANCE uint16_t final_adv_steps = 0; uint16_t max_adv_steps = 0; 21664: 40 e0 ldi r20, 0x00 ; 0 21666: 80 e0 ldi r24, 0x00 ; 0 21668: c3 cf rjmp .-122 ; 0x215f0 #ifdef LIN_ADVANCE if (block->use_advance_lead) { if(!accelerate_steps || !decelerate_steps) { // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate max_adv_steps = final_adv_steps; 2166a: 4d 89 ldd r20, Y+21 ; 0x15 2166c: 8e 89 ldd r24, Y+22 ; 0x16 2166e: c0 cf rjmp .-128 ; 0x215f0 00021670 : }; static_assert(sizeof(_menu_tune_data_t) == 18); static_assert(sizeof(menu_data)>= sizeof(_menu_tune_data_t),"_menu_tune_data_t doesn't fit into menu_data"); void tuneIdlerStallguardThresholdMenu() { 21670: ef 92 push r14 21672: ff 92 push r15 21674: 0f 93 push r16 21676: 1f 93 push r17 21678: cf 93 push r28 2167a: df 93 push r29 2167c: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 static constexpr _menu_tune_data_t * const _md = (_menu_tune_data_t*)&(menu_data[0]); // Do not timeout the screen, otherwise there will be FW crash (menu recursion) lcd_timeoutToStatus.stop(); if (_md->status == 0) 21680: 80 91 a3 03 lds r24, 0x03A3 ; 0x8003a3 21684: 81 11 cpse r24, r1 21686: 23 c0 rjmp .+70 ; 0x216ce { _md->status = 1; // Menu entered for the first time 21688: 81 e0 ldi r24, 0x01 ; 1 2168a: 80 93 a3 03 sts 0x03A3, r24 ; 0x8003a3 // Fetch the TuneItem from PROGMEM const uint8_t offset = (mmu2.MMUCurrentErrorCode() == ErrorCode::HOMING_IDLER_FAILED) ? 1 : 0; 2168e: 81 e0 ldi r24, 0x01 ; 1 21690: 90 e0 ldi r25, 0x00 ; 0 21692: 20 91 d2 12 lds r18, 0x12D2 ; 0x8012d2 21696: 30 91 d3 12 lds r19, 0x12D3 ; 0x8012d3 2169a: 27 30 cpi r18, 0x07 ; 7 2169c: 31 48 sbci r19, 0x81 ; 129 2169e: 11 f0 breq .+4 ; 0x216a4 216a0: 90 e0 ldi r25, 0x00 ; 0 216a2: 80 e0 ldi r24, 0x00 ; 0 memcpy_P(&(_md->item), &TuneItems[offset], sizeof(TuneItem)); 216a4: bc 01 movw r22, r24 216a6: 66 0f add r22, r22 216a8: 77 1f adc r23, r23 216aa: 68 0f add r22, r24 216ac: 79 1f adc r23, r25 216ae: 69 52 subi r22, 0x29 ; 41 216b0: 78 47 sbci r23, 0x78 ; 120 216b2: 43 e0 ldi r20, 0x03 ; 3 216b4: 50 e0 ldi r21, 0x00 ; 0 216b6: 85 ea ldi r24, 0xA5 ; 165 216b8: 93 e0 ldi r25, 0x03 ; 3 216ba: 0f 94 7a a1 call 0x342f4 ; 0x342f4 // Fetch the value which is currently in MMU EEPROM mmu2.ReadRegister(_md->item.address); 216be: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 216c2: 0e 94 03 ff call 0x1fe06 ; 0x1fe06 _md->currentValue = mmu2.GetLastReadRegisterValue(); 216c6: 80 91 fd 12 lds r24, 0x12FD ; 0x8012fd 216ca: 80 93 a4 03 sts 0x03A4, r24 ; 0x8003a4 } MENU_BEGIN(); 216ce: 0e 94 0c 74 call 0xe818 ; 0xe818 216d2: 10 92 60 04 sts 0x0460, r1 ; 0x800460 216d6: 80 91 60 04 lds r24, 0x0460 ; 0x800460 216da: 84 30 cpi r24, 0x04 ; 4 216dc: e0 f5 brcc .+120 ; 0x21756 216de: 10 92 63 04 sts 0x0463, r1 ; 0x800463 ON_MENU_LEAVE( 216e2: 0e 94 4c 62 call 0xc498 ; 0xc498 216e6: 88 23 and r24, r24 216e8: 89 f0 breq .+34 ; 0x2170c 216ea: 60 91 a4 03 lds r22, 0x03A4 ; 0x8003a4 216ee: 70 e0 ldi r23, 0x00 ; 0 216f0: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 216f4: 0e 94 9c d2 call 0x1a538 ; 0x1a538 216f8: 10 92 43 0d sts 0x0D43, r1 ; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451> &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); } 216fc: df 91 pop r29 216fe: cf 91 pop r28 21700: 1f 91 pop r17 21702: 0f 91 pop r16 21704: ff 90 pop r15 21706: ef 90 pop r14 mmu2.ReadRegister(_md->item.address); _md->currentValue = mmu2.GetLastReadRegisterValue(); } MENU_BEGIN(); ON_MENU_LEAVE( 21708: 0d 94 d5 07 jmp 0x20faa ; 0x20faa mmu2.WriteRegister(_md->item.address, (uint16_t)_md->currentValue); putErrorScreenToSleep = false; lcd_return_to_status(); return; ); MENU_ITEM_BACK_P(_T(MSG_DONE)); 2170c: 81 e0 ldi r24, 0x01 ; 1 2170e: 96 e5 ldi r25, 0x56 ; 86 21710: 0e 94 3a 75 call 0xea74 ; 0xea74 21714: 0e 94 ce 72 call 0xe59c ; 0xe59c MENU_ITEM_EDIT_int3_P( 21718: 00 91 a7 03 lds r16, 0x03A7 ; 0x8003a7 2171c: 10 e0 ldi r17, 0x00 ; 0 2171e: c0 91 a6 03 lds r28, 0x03A6 ; 0x8003a6 21722: d0 e0 ldi r29, 0x00 ; 0 21724: 83 ef ldi r24, 0xF3 ; 243 21726: 95 e5 ldi r25, 0x55 ; 85 21728: 0e 94 3a 75 call 0xea74 ; 0xea74 2172c: f1 2c mov r15, r1 2172e: e1 2c mov r14, r1 21730: 9e 01 movw r18, r28 21732: 48 e0 ldi r20, 0x08 ; 8 21734: 64 ea ldi r22, 0xA4 ; 164 21736: 73 e0 ldi r23, 0x03 ; 3 21738: 0e 94 6e 6f call 0xdedc ; 0xdedc _T(MSG_MMU_SENSITIVITY), &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); 2173c: 0e 94 83 62 call 0xc506 ; 0xc506 // Fetch the value which is currently in MMU EEPROM mmu2.ReadRegister(_md->item.address); _md->currentValue = mmu2.GetLastReadRegisterValue(); } MENU_BEGIN(); 21740: 80 91 60 04 lds r24, 0x0460 ; 0x800460 21744: 8f 5f subi r24, 0xFF ; 255 21746: 80 93 60 04 sts 0x0460, r24 ; 0x800460 2174a: 80 91 62 04 lds r24, 0x0462 ; 0x800462 2174e: 8f 5f subi r24, 0xFF ; 255 21750: 80 93 62 04 sts 0x0462, r24 ; 0x800462 21754: c0 cf rjmp .-128 ; 0x216d6 &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); } 21756: df 91 pop r29 21758: cf 91 pop r28 2175a: 1f 91 pop r17 2175c: 0f 91 pop r16 2175e: ff 90 pop r15 21760: ef 90 pop r14 21762: 08 95 ret 00021764 : lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS)); } static void lcd_loading_progress_bar(uint16_t loading_time_ms) { 21764: 1f 93 push r17 21766: cf 93 push r28 21768: df 93 push r29 for (uint_least8_t i = 0; i < LCD_WIDTH; i++) { lcd_putc_at(i, 3, '.'); //loading_time_ms/20 delay for (uint_least8_t j = 0; j < 5; j++) { delay_keep_alive(loading_time_ms / 100); 2176a: 64 e6 ldi r22, 0x64 ; 100 2176c: 70 e0 ldi r23, 0x00 ; 0 2176e: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 21772: eb 01 movw r28, r22 } static void lcd_loading_progress_bar(uint16_t loading_time_ms) { for (uint_least8_t i = 0; i < LCD_WIDTH; i++) { 21774: 10 e0 ldi r17, 0x00 ; 0 lcd_putc_at(i, 3, '.'); 21776: 4e e2 ldi r20, 0x2E ; 46 21778: 63 e0 ldi r22, 0x03 ; 3 2177a: 81 2f mov r24, r17 2177c: 0e 94 13 70 call 0xe026 ; 0xe026 //loading_time_ms/20 delay for (uint_least8_t j = 0; j < 5; j++) { delay_keep_alive(loading_time_ms / 100); 21780: ce 01 movw r24, r28 21782: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 21786: ce 01 movw r24, r28 21788: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 2178c: ce 01 movw r24, r28 2178e: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 21792: ce 01 movw r24, r28 21794: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 21798: ce 01 movw r24, r28 2179a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c } static void lcd_loading_progress_bar(uint16_t loading_time_ms) { for (uint_least8_t i = 0; i < LCD_WIDTH; i++) { 2179e: 1f 5f subi r17, 0xFF ; 255 217a0: 14 31 cpi r17, 0x14 ; 20 217a2: 49 f7 brne .-46 ; 0x21776 //loading_time_ms/20 delay for (uint_least8_t j = 0; j < 5; j++) { delay_keep_alive(loading_time_ms / 100); } } } 217a4: df 91 pop r29 217a6: cf 91 pop r28 217a8: 1f 91 pop r17 217aa: 08 95 ret 000217ac : } } } static void setFilamentAction(FilamentAction action) { eFilamentAction = action; 217ac: 10 92 94 03 sts 0x0394, r1 ; 0x800394 static void __attribute__((noinline)) clearFilamentAction() { // filament action has been cancelled or completed setFilamentAction(FilamentAction::None); } 217b0: 08 95 ret 000217b2 : bFilamentPreheatState = false; mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); } void lcd_generic_preheat_menu() { 217b2: cf 93 push r28 MENU_BEGIN(); 217b4: 0e 94 0c 74 call 0xe818 ; 0xe818 217b8: 10 92 60 04 sts 0x0460, r1 ; 0x800460 217bc: 80 91 60 04 lds r24, 0x0460 ; 0x800460 217c0: 84 30 cpi r24, 0x04 ; 4 217c2: 08 f0 brcs .+2 ; 0x217c6 217c4: b1 c0 rjmp .+354 ; 0x21928 217c6: 10 92 63 04 sts 0x0463, r1 ; 0x800463 if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 217ca: 8f e5 ldi r24, 0x5F ; 95 217cc: 9f e0 ldi r25, 0x0F ; 15 217ce: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 217d2: 81 11 cpse r24, r1 217d4: 0f c0 rjmp .+30 ; 0x217f4 { ON_MENU_LEAVE( 217d6: 0e 94 4c 62 call 0xc498 ; 0xc498 217da: 81 11 cpse r24, r1 217dc: 0f 94 d6 0b call 0x217ac ; 0x217ac clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN)); 217e0: 80 91 94 03 lds r24, 0x0394 ; 0x800394 217e4: 8a 30 cpi r24, 0x0A ; 10 217e6: a9 f1 breq .+106 ; 0x21852 217e8: 8f ed ldi r24, 0xDF ; 223 217ea: 98 e4 ldi r25, 0x48 ; 72 217ec: 0e 94 3a 75 call 0xea74 ; 0xea74 217f0: 0e 94 ce 72 call 0xe59c ; 0xe59c } if (farm_mode) 217f4: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 217f8: 88 23 and r24, r24 217fa: 71 f1 breq .+92 ; 0x21858 { MENU_ITEM_FUNCTION_P(PSTR("farm - " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), mFilamentItem_farm); 217fc: 66 ee ldi r22, 0xE6 ; 230 217fe: 77 e3 ldi r23, 0x37 ; 55 21800: 83 ee ldi r24, 0xE3 ; 227 21802: 99 e9 ldi r25, 0x99 ; 153 21804: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_FUNCTION_P(PSTR("nozzle - " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), mFilamentItem_farm_nozzle); 21808: 6e e9 ldi r22, 0x9E ; 158 2180a: 78 e3 ldi r23, 0x38 ; 56 2180c: 83 ed ldi r24, 0xD3 ; 211 2180e: 99 e9 ldi r25, 0x99 ; 153 21810: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)) : PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)) , mFilamentItem_ABS); MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP)): PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), mFilamentItem_HIPS); MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP)) : PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PP_PREHEAT_HPB_TEMP)) , mFilamentItem_PP); MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP)): PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), mFilamentItem_FLEX); } if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) && eFilamentAction == FilamentAction::Preheat) MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown); 21814: 8f e5 ldi r24, 0x5F ; 95 21816: 9f e0 ldi r25, 0x0F ; 15 21818: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2181c: 81 11 cpse r24, r1 2181e: 0c c0 rjmp .+24 ; 0x21838 21820: 80 91 94 03 lds r24, 0x0394 ; 0x800394 21824: 89 30 cpi r24, 0x09 ; 9 21826: 41 f4 brne .+16 ; 0x21838 21828: 80 e1 ldi r24, 0x10 ; 16 2182a: 98 e5 ldi r25, 0x58 ; 88 2182c: 0e 94 3a 75 call 0xea74 ; 0xea74 21830: 68 e9 ldi r22, 0x98 ; 152 21832: 78 e3 ldi r23, 0x38 ; 56 21834: 0e 94 9d 72 call 0xe53a ; 0xe53a MENU_END(); 21838: 0e 94 83 62 call 0xc506 ; 0xc506 mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); } void lcd_generic_preheat_menu() { MENU_BEGIN(); 2183c: 80 91 60 04 lds r24, 0x0460 ; 0x800460 21840: 8f 5f subi r24, 0xFF ; 255 21842: 80 93 60 04 sts 0x0460, r24 ; 0x800460 21846: 80 91 62 04 lds r24, 0x0462 ; 0x800462 2184a: 8f 5f subi r24, 0xFF ; 255 2184c: 80 93 62 04 sts 0x0462, r24 ; 0x800462 21850: b5 cf rjmp .-150 ; 0x217bc if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) { ON_MENU_LEAVE( clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN)); 21852: 88 ee ldi r24, 0xE8 ; 232 21854: 9a e4 ldi r25, 0x4A ; 74 21856: ca cf rjmp .-108 ; 0x217ec MENU_ITEM_FUNCTION_P(PSTR("farm - " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), mFilamentItem_farm); MENU_ITEM_FUNCTION_P(PSTR("nozzle - " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), mFilamentItem_farm_nozzle); } else { bool bPreheatOnlyNozzle = shouldPreheatOnlyNozzle(); 21858: 0f 94 7d 04 call 0x208fa ; 0x208fa 2185c: c8 2f mov r28, r24 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PLA - " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP)) : PSTR("PLA - " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)) , mFilamentItem_PLA); 2185e: 88 eb ldi r24, 0xB8 ; 184 21860: 99 e9 ldi r25, 0x99 ; 153 21862: cc 23 and r28, r28 21864: 11 f0 breq .+4 ; 0x2186a 21866: 87 ec ldi r24, 0xC7 ; 199 21868: 99 e9 ldi r25, 0x99 ; 153 2186a: 6a e1 ldi r22, 0x1A ; 26 2186c: 77 e3 ldi r23, 0x37 ; 55 2186e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PET - " STRINGIFY(PET_PREHEAT_HOTEND_TEMP)) : PSTR("PET - " STRINGIFY(PET_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)) , mFilamentItem_PET); 21872: 8d e9 ldi r24, 0x9D ; 157 21874: 99 e9 ldi r25, 0x99 ; 153 21876: cc 23 and r28, r28 21878: 11 f0 breq .+4 ; 0x2187e 2187a: 8c ea ldi r24, 0xAC ; 172 2187c: 99 e9 ldi r25, 0x99 ; 153 2187e: 62 e4 ldi r22, 0x42 ; 66 21880: 77 e3 ldi r23, 0x37 ; 55 21882: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ASA - " STRINGIFY(ASA_PREHEAT_HOTEND_TEMP)) : PSTR("ASA - " STRINGIFY(ASA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ASA_PREHEAT_HPB_TEMP)) , mFilamentItem_ASA); 21886: 81 e8 ldi r24, 0x81 ; 129 21888: 99 e9 ldi r25, 0x99 ; 153 2188a: cc 23 and r28, r28 2188c: 11 f0 breq .+4 ; 0x21892 2188e: 81 e9 ldi r24, 0x91 ; 145 21890: 99 e9 ldi r25, 0x99 ; 153 21892: 6e eb ldi r22, 0xBE ; 190 21894: 77 e3 ldi r23, 0x37 ; 55 21896: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PC - " STRINGIFY(PC_PREHEAT_HOTEND_TEMP)) : PSTR("PC - " STRINGIFY(PC_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PC_PREHEAT_HPB_TEMP)) , mFilamentItem_PC); 2189a: 85 e6 ldi r24, 0x65 ; 101 2189c: 99 e9 ldi r25, 0x99 ; 153 2189e: cc 23 and r28, r28 218a0: 11 f0 breq .+4 ; 0x218a6 218a2: 85 e7 ldi r24, 0x75 ; 117 218a4: 99 e9 ldi r25, 0x99 ; 153 218a6: 6a e8 ldi r22, 0x8A ; 138 218a8: 77 e3 ldi r23, 0x37 ; 55 218aa: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PVB - " STRINGIFY(PVB_PREHEAT_HOTEND_TEMP)) : PSTR("PVB - " STRINGIFY(PVB_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PVB_PREHEAT_HPB_TEMP)) , mFilamentItem_PVB); 218ae: 8a e4 ldi r24, 0x4A ; 74 218b0: 99 e9 ldi r25, 0x99 ; 153 218b2: cc 23 and r28, r28 218b4: 11 f0 breq .+4 ; 0x218ba 218b6: 89 e5 ldi r24, 0x59 ; 89 218b8: 99 e9 ldi r25, 0x99 ; 153 218ba: 66 ea ldi r22, 0xA6 ; 166 218bc: 78 e3 ldi r23, 0x38 ; 56 218be: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PA - " STRINGIFY(PA_PREHEAT_HOTEND_TEMP)) : PSTR("PA - " STRINGIFY(PA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PA_PREHEAT_HPB_TEMP)) , mFilamentItem_PA); 218c2: 8f e2 ldi r24, 0x2F ; 47 218c4: 99 e9 ldi r25, 0x99 ; 153 218c6: cc 23 and r28, r28 218c8: 11 f0 breq .+4 ; 0x218ce 218ca: 8e e3 ldi r24, 0x3E ; 62 218cc: 99 e9 ldi r25, 0x99 ; 153 218ce: 6c ec ldi r22, 0xCC ; 204 218d0: 77 e3 ldi r23, 0x37 ; 55 218d2: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)) : PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)) , mFilamentItem_ABS); 218d6: 83 e1 ldi r24, 0x13 ; 19 218d8: 99 e9 ldi r25, 0x99 ; 153 218da: cc 23 and r28, r28 218dc: 11 f0 breq .+4 ; 0x218e2 218de: 83 e2 ldi r24, 0x23 ; 35 218e0: 99 e9 ldi r25, 0x99 ; 153 218e2: 68 e5 ldi r22, 0x58 ; 88 218e4: 77 e3 ldi r23, 0x37 ; 55 218e6: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP)): PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), mFilamentItem_HIPS); 218ea: 87 ef ldi r24, 0xF7 ; 247 218ec: 98 e9 ldi r25, 0x98 ; 152 218ee: cc 23 and r28, r28 218f0: 11 f0 breq .+4 ; 0x218f6 218f2: 87 e0 ldi r24, 0x07 ; 7 218f4: 99 e9 ldi r25, 0x99 ; 153 218f6: 68 e6 ldi r22, 0x68 ; 104 218f8: 77 e3 ldi r23, 0x37 ; 55 218fa: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP)) : PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PP_PREHEAT_HPB_TEMP)) , mFilamentItem_PP); 218fe: 8b ed ldi r24, 0xDB ; 219 21900: 98 e9 ldi r25, 0x98 ; 152 21902: cc 23 and r28, r28 21904: 11 f0 breq .+4 ; 0x2190a 21906: 8b ee ldi r24, 0xEB ; 235 21908: 98 e9 ldi r25, 0x98 ; 152 2190a: 6c e6 ldi r22, 0x6C ; 108 2190c: 77 e3 ldi r23, 0x37 ; 55 2190e: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP)): PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), mFilamentItem_FLEX); 21912: 80 ec ldi r24, 0xC0 ; 192 21914: 98 e9 ldi r25, 0x98 ; 152 21916: cc 23 and r28, r28 21918: 11 f0 breq .+4 ; 0x2191e 2191a: 8f ec ldi r24, 0xCF ; 207 2191c: 98 e9 ldi r25, 0x98 ; 152 2191e: 60 e8 ldi r22, 0x80 ; 128 21920: 78 e3 ldi r23, 0x38 ; 56 21922: 0e 94 f3 72 call 0xe5e6 ; 0xe5e6 21926: 76 cf rjmp .-276 ; 0x21814 } if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) && eFilamentAction == FilamentAction::Preheat) MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown); MENU_END(); } 21928: cf 91 pop r28 2192a: 08 95 ret 0002192c : #endif //RESUME_DEBUG //! @brief Show Preheat Menu static void lcd_preheat_menu() { eFilamentAction = FilamentAction::Preheat; 2192c: 89 e0 ldi r24, 0x09 ; 9 2192e: 80 93 94 03 sts 0x0394, r24 ; 0x800394 lcd_generic_preheat_menu(); 21932: 0d 94 d9 0b jmp 0x217b2 ; 0x217b2 00021936 : } // Print temperature (nozzle/bed) (9 chars total) void lcdui_print_temp(char type, int val_current, int val_target) { int chars = lcd_printf_P(_N("%c%3d/%d" LCD_STR_DEGREE), type, val_current, val_target); 21936: 5f 93 push r21 21938: 4f 93 push r20 2193a: 7f 93 push r23 2193c: 6f 93 push r22 2193e: 28 2f mov r18, r24 21940: 08 2e mov r0, r24 21942: 00 0c add r0, r0 21944: 33 0b sbc r19, r19 21946: 3f 93 push r19 21948: 8f 93 push r24 2194a: 87 e5 ldi r24, 0x57 ; 87 2194c: 9a e6 ldi r25, 0x6A ; 106 2194e: 9f 93 push r25 21950: 8f 93 push r24 21952: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_space(9 - chars); 21956: 2d b7 in r18, 0x3d ; 61 21958: 3e b7 in r19, 0x3e ; 62 2195a: 28 5f subi r18, 0xF8 ; 248 2195c: 3f 4f sbci r19, 0xFF ; 255 2195e: 0f b6 in r0, 0x3f ; 63 21960: f8 94 cli 21962: 3e bf out 0x3e, r19 ; 62 21964: 0f be out 0x3f, r0 ; 63 21966: 2d bf out 0x3d, r18 ; 61 21968: 99 e0 ldi r25, 0x09 ; 9 2196a: 98 1b sub r25, r24 2196c: 89 2f mov r24, r25 2196e: 0c 94 28 6f jmp 0xde50 ; 0xde50 00021972 : default: return false; } } void lcd_print_target_temps_first_line() { 21972: cf 93 push r28 21974: df 93 push r29 lcd_home(); 21976: 0e 94 1f 70 call 0xe03e ; 0xe03e lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0)); 2197a: c0 91 5d 12 lds r28, 0x125D ; 0x80125d 2197e: d0 91 5e 12 lds r29, 0x125E ; 0x80125e 21982: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 21986: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2198a: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2198e: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 21992: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 21996: ae 01 movw r20, r28 21998: 82 e8 ldi r24, 0x82 ; 130 2199a: 0f 94 9b 0c call 0x21936 ; 0x21936 lcd_set_cursor(10, 0); 2199e: 60 e0 ldi r22, 0x00 ; 0 219a0: 8a e0 ldi r24, 0x0A ; 10 219a2: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; 219a6: c0 91 59 12 lds r28, 0x1259 ; 0x801259 219aa: d0 91 5a 12 lds r29, 0x125A ; 0x80125a int targetBedTemp = (int) degTargetBed(); if (targetBedTemp) { 219ae: 20 97 sbiw r28, 0x00 ; 0 219b0: 81 f0 breq .+32 ; 0x219d2 lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp); 219b2: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 219b6: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 219ba: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 219be: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 219c2: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 219c6: ae 01 movw r20, r28 219c8: 80 e8 ldi r24, 0x80 ; 128 } else { lcd_space(10); } } 219ca: df 91 pop r29 219cc: cf 91 pop r28 lcd_home(); lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0)); lcd_set_cursor(10, 0); int targetBedTemp = (int) degTargetBed(); if (targetBedTemp) { lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp); 219ce: 0d 94 9b 0c jmp 0x21936 ; 0x21936 } else { lcd_space(10); 219d2: 8a e0 ldi r24, 0x0A ; 10 } } 219d4: df 91 pop r29 219d6: cf 91 pop r28 lcd_set_cursor(10, 0); int targetBedTemp = (int) degTargetBed(); if (targetBedTemp) { lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp); } else { lcd_space(10); 219d8: 0c 94 28 6f jmp 0xde50 ; 0xde50 000219dc : 219dc: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 } } static void mFilamentPrompt() { lcd_timeoutToStatus.stop(); lcd_print_target_temps_first_line(); 219e0: 0f 94 b9 0c call 0x21972 ; 0x21972 lcd_puts_at_P(0,1, _T(MSG_PRESS_KNOB)); 219e4: 89 ea ldi r24, 0xA9 ; 169 219e6: 97 e5 ldi r25, 0x57 ; 87 219e8: 0e 94 3a 75 call 0xea74 ; 0xea74 219ec: ac 01 movw r20, r24 219ee: 61 e0 ldi r22, 0x01 ; 1 219f0: 80 e0 ldi r24, 0x00 ; 0 219f2: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(0,2); 219f6: 62 e0 ldi r22, 0x02 ; 2 219f8: 80 e0 ldi r24, 0x00 ; 0 219fa: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 switch(eFilamentAction) { 219fe: 80 91 94 03 lds r24, 0x0394 ; 0x800394 21a02: 83 30 cpi r24, 0x03 ; 3 21a04: 81 f1 breq .+96 ; 0x21a66 21a06: 48 f4 brcc .+18 ; 0x21a1a 21a08: 81 30 cpi r24, 0x01 ; 1 21a0a: 60 f0 brcs .+24 ; 0x21a24 case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::MmuLoad: case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_TO_LOAD_FIL)); 21a0c: 86 e9 ldi r24, 0x96 ; 150 21a0e: 97 e5 ldi r25, 0x57 ; 87 break; case FilamentAction::UnLoad: case FilamentAction::MmuUnLoad: lcd_puts_P(_T(MSG_TO_UNLOAD_FIL)); 21a10: 0e 94 3a 75 call 0xea74 ; 0xea74 21a14: 0e 94 1d 6f call 0xde3a ; 0xde3a 21a18: 05 c0 rjmp .+10 ; 0x21a24 static void mFilamentPrompt() { lcd_timeoutToStatus.stop(); lcd_print_target_temps_first_line(); lcd_puts_at_P(0,1, _T(MSG_PRESS_KNOB)); lcd_set_cursor(0,2); switch(eFilamentAction) { 21a1a: 85 30 cpi r24, 0x05 ; 5 21a1c: 21 f1 breq .+72 ; 0x21a66 21a1e: b0 f3 brcs .-20 ; 0x21a0c 21a20: 88 30 cpi r24, 0x08 ; 8 21a22: a1 f3 breq .-24 ; 0x21a0c case FilamentAction::Preheat: case FilamentAction::Lay1Cal: break; } if(lcd_clicked() 21a24: 0e 94 75 73 call 0xe6ea ; 0xe6ea #ifdef FILAMENT_SENSOR /// @todo leptun - add this as a specific retest item || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent()) 21a28: 81 11 cpse r24, r1 21a2a: 09 c0 rjmp .+18 ; 0x21a3e 21a2c: 80 91 94 03 lds r24, 0x0394 ; 0x800394 21a30: 81 50 subi r24, 0x01 ; 1 21a32: 82 30 cpi r24, 0x02 ; 2 21a34: 28 f5 brcc .+74 ; 0x21a80 21a36: 80 91 f5 16 lds r24, 0x16F5 ; 0x8016f5 21a3a: 88 23 and r24, r24 21a3c: 09 f1 breq .+66 ; 0x21a80 #endif //FILAMENT_SENSOR ) { menu_back(bFilamentPreheatState ? 2 : 3); 21a3e: 80 91 15 06 lds r24, 0x0615 ; 0x800615 21a42: 81 11 cpse r24, r1 21a44: 13 c0 rjmp .+38 ; 0x21a6c 21a46: 83 e0 ldi r24, 0x03 ; 3 21a48: 0e 94 ff 62 call 0xc5fe ; 0xc5fe switch(eFilamentAction) { 21a4c: 80 91 94 03 lds r24, 0x0394 ; 0x800394 21a50: 82 30 cpi r24, 0x02 ; 2 21a52: 71 f0 breq .+28 ; 0x21a70 21a54: 83 30 cpi r24, 0x03 ; 3 21a56: 81 f0 breq .+32 ; 0x21a78 21a58: 81 30 cpi r24, 0x01 ; 1 21a5a: 91 f4 brne .+36 ; 0x21a80 case FilamentAction::AutoLoad: // loading no longer cancellable eFilamentAction = FilamentAction::Load; [[fallthrough]]; case FilamentAction::Load: enquecommand_P(MSG_M701); // load filament 21a5c: 61 e0 ldi r22, 0x01 ; 1 21a5e: 88 e1 ldi r24, 0x18 ; 24 21a60: 9b e6 ldi r25, 0x6B ; 107 break; case FilamentAction::UnLoad: enquecommand_P(MSG_M702); // unload filament 21a62: 0c 94 e9 8e jmp 0x11dd2 ; 0x11dd2 case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_TO_LOAD_FIL)); break; case FilamentAction::UnLoad: case FilamentAction::MmuUnLoad: lcd_puts_P(_T(MSG_TO_UNLOAD_FIL)); 21a66: 81 e8 ldi r24, 0x81 ; 129 21a68: 97 e5 ldi r25, 0x57 ; 87 21a6a: d2 cf rjmp .-92 ; 0x21a10 #ifdef FILAMENT_SENSOR /// @todo leptun - add this as a specific retest item || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent()) #endif //FILAMENT_SENSOR ) { menu_back(bFilamentPreheatState ? 2 : 3); 21a6c: 82 e0 ldi r24, 0x02 ; 2 21a6e: ec cf rjmp .-40 ; 0x21a48 switch(eFilamentAction) { case FilamentAction::AutoLoad: // loading no longer cancellable eFilamentAction = FilamentAction::Load; 21a70: 81 e0 ldi r24, 0x01 ; 1 21a72: 80 93 94 03 sts 0x0394, r24 ; 0x800394 21a76: f2 cf rjmp .-28 ; 0x21a5c [[fallthrough]]; case FilamentAction::Load: enquecommand_P(MSG_M701); // load filament break; case FilamentAction::UnLoad: enquecommand_P(MSG_M702); // unload filament 21a78: 61 e0 ldi r22, 0x01 ; 1 21a7a: 8c ec ldi r24, 0xCC ; 204 21a7c: 98 e6 ldi r25, 0x68 ; 104 21a7e: f1 cf rjmp .-30 ; 0x21a62 case FilamentAction::Preheat: case FilamentAction::Lay1Cal: break; } } } 21a80: 08 95 ret 00021a82 <__vector_51>: UCSR2B |= (1 << RXCIE2); // enable rx interrupt fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream } ISR(USART2_RX_vect) { 21a82: 1f 92 push r1 21a84: 0f 92 push r0 21a86: 0f b6 in r0, 0x3f ; 63 21a88: 0f 92 push r0 21a8a: 11 24 eor r1, r1 21a8c: 0b b6 in r0, 0x3b ; 59 21a8e: 0f 92 push r0 21a90: 2f 93 push r18 21a92: 3f 93 push r19 21a94: 4f 93 push r20 21a96: 5f 93 push r21 21a98: 6f 93 push r22 21a9a: 7f 93 push r23 21a9c: 8f 93 push r24 21a9e: 9f 93 push r25 21aa0: af 93 push r26 21aa2: bf 93 push r27 21aa4: ef 93 push r30 21aa6: ff 93 push r31 if (rbuf_put(uart2_ibuf, UDR2) < 0) // put received byte to buffer 21aa8: 20 91 d6 00 lds r18, 0x00D6 ; 0x8000d6 <__TEXT_REGION_LENGTH__+0x7c20d6> //put single byte to buffer int rbuf_put(uint8_t* ptr, uint8_t b) { //#ifdef _NO_ASM _lock(); //lock uint8_t buf_w = ptr[1]; //get write index 21aac: 80 91 46 0d lds r24, 0x0D46 ; 0x800d46 uint8_t buf_r = ptr[2]; //get read index 21ab0: 90 91 47 0d lds r25, 0x0D47 ; 0x800d47 _unlock(); //unlock ptr[4 + buf_w] = b; //store byte to buffer 21ab4: e8 2f mov r30, r24 21ab6: f0 e0 ldi r31, 0x00 ; 0 21ab8: e7 5b subi r30, 0xB7 ; 183 21aba: f2 4f sbci r31, 0xF2 ; 242 21abc: 20 83 st Z, r18 buf_w++; //incerment write index 21abe: 8f 5f subi r24, 0xFF ; 255 uint8_t buf_l = ptr[0]; //get length if (buf_w >= buf_l) buf_w = 0; //rotate write index 21ac0: 20 91 45 0d lds r18, 0x0D45 ; 0x800d45 21ac4: 82 17 cp r24, r18 21ac6: 08 f0 brcs .+2 ; 0x21aca <__vector_51+0x48> 21ac8: 80 e0 ldi r24, 0x00 ; 0 if (buf_w == buf_r) return -1; //return -1 to signal buffer full 21aca: 98 13 cpse r25, r24 21acc: 17 c0 rjmp .+46 ; 0x21afc <__vector_51+0x7a> { //rx buffer full puts_P(PSTR("USART2 rx Full!!!")); 21ace: 83 e5 ldi r24, 0x53 ; 83 21ad0: 97 e9 ldi r25, 0x97 ; 151 21ad2: 0f 94 c9 a2 call 0x34592 ; 0x34592 } } 21ad6: ff 91 pop r31 21ad8: ef 91 pop r30 21ada: bf 91 pop r27 21adc: af 91 pop r26 21ade: 9f 91 pop r25 21ae0: 8f 91 pop r24 21ae2: 7f 91 pop r23 21ae4: 6f 91 pop r22 21ae6: 5f 91 pop r21 21ae8: 4f 91 pop r20 21aea: 3f 91 pop r19 21aec: 2f 91 pop r18 21aee: 0f 90 pop r0 21af0: 0b be out 0x3b, r0 ; 59 21af2: 0f 90 pop r0 21af4: 0f be out 0x3f, r0 ; 63 21af6: 0f 90 pop r0 21af8: 1f 90 pop r1 21afa: 18 95 reti ptr[1] = buf_w; //store write index 21afc: 80 93 46 0d sts 0x0D46, r24 ; 0x800d46 21b00: ea cf rjmp .-44 ; 0x21ad6 <__vector_51+0x54> 00021b02 <__vector_45>: { WRITE(BEEPER, 1); } ISR(TIMER4_OVF_vect) { 21b02: 1f 92 push r1 21b04: 0f 92 push r0 21b06: 0f b6 in r0, 0x3f ; 63 21b08: 0f 92 push r0 21b0a: 11 24 eor r1, r1 21b0c: 0b b6 in r0, 0x3b ; 59 21b0e: 0f 92 push r0 21b10: 8f 93 push r24 21b12: 9f 93 push r25 21b14: ef 93 push r30 21b16: ff 93 push r31 WRITE(BEEPER, 0); 21b18: 9f b7 in r25, 0x3f ; 63 21b1a: f8 94 cli 21b1c: e2 e0 ldi r30, 0x02 ; 2 21b1e: f1 e0 ldi r31, 0x01 ; 1 21b20: 80 81 ld r24, Z 21b22: 8b 7f andi r24, 0xFB ; 251 21b24: 80 83 st Z, r24 21b26: 9f bf out 0x3f, r25 ; 63 } 21b28: ff 91 pop r31 21b2a: ef 91 pop r30 21b2c: 9f 91 pop r25 21b2e: 8f 91 pop r24 21b30: 0f 90 pop r0 21b32: 0b be out 0x3b, r0 ; 59 21b34: 0f 90 pop r0 21b36: 0f be out 0x3f, r0 ; 63 21b38: 0f 90 pop r0 21b3a: 1f 90 pop r1 21b3c: 18 95 reti 00021b3e <__vector_42>: #endif //EXTRUDER_0_AUTO_FAN_PIN // Because of the timer mode change, we need two interrupts. We could also try to assume that the frequency is x2 // and use a TOGGLE(), but this seems to work well enough so I left it as it is now. ISR(TIMER4_COMPA_vect) { 21b3e: 1f 92 push r1 21b40: 0f 92 push r0 21b42: 0f b6 in r0, 0x3f ; 63 21b44: 0f 92 push r0 21b46: 11 24 eor r1, r1 21b48: 0b b6 in r0, 0x3b ; 59 21b4a: 0f 92 push r0 21b4c: 8f 93 push r24 21b4e: 9f 93 push r25 21b50: ef 93 push r30 21b52: ff 93 push r31 WRITE(BEEPER, 1); 21b54: 9f b7 in r25, 0x3f ; 63 21b56: f8 94 cli 21b58: e2 e0 ldi r30, 0x02 ; 2 21b5a: f1 e0 ldi r31, 0x01 ; 1 21b5c: 80 81 ld r24, Z 21b5e: 84 60 ori r24, 0x04 ; 4 21b60: 80 83 st Z, r24 21b62: 9f bf out 0x3f, r25 ; 63 } 21b64: ff 91 pop r31 21b66: ef 91 pop r30 21b68: 9f 91 pop r25 21b6a: 8f 91 pop r24 21b6c: 0f 90 pop r0 21b6e: 0b be out 0x3b, r0 ; 59 21b70: 0f 90 pop r0 21b72: 0f be out 0x3f, r0 ; 63 21b74: 0f 90 pop r0 21b76: 1f 90 pop r1 21b78: 18 95 reti 00021b7a : void delay2(unsigned long ms) { 21b7a: 8f 92 push r8 21b7c: 9f 92 push r9 21b7e: af 92 push r10 21b80: bf 92 push r11 21b82: cf 92 push r12 21b84: df 92 push r13 21b86: ef 92 push r14 21b88: ff 92 push r15 21b8a: 6b 01 movw r12, r22 21b8c: 7c 01 movw r14, r24 uint32_t start = micros2(); 21b8e: 0e 94 5c ff call 0x1feb8 ; 0x1feb8 21b92: 4b 01 movw r8, r22 21b94: 5c 01 movw r10, r24 while (ms > 0) { yield(); while ( ms > 0 && (micros2() - start) >= 1000) 21b96: c1 14 cp r12, r1 21b98: d1 04 cpc r13, r1 21b9a: e1 04 cpc r14, r1 21b9c: f1 04 cpc r15, r1 21b9e: b9 f0 breq .+46 ; 0x21bce 21ba0: 0e 94 5c ff call 0x1feb8 ; 0x1feb8 21ba4: 68 19 sub r22, r8 21ba6: 79 09 sbc r23, r9 21ba8: 8a 09 sbc r24, r10 21baa: 9b 09 sbc r25, r11 21bac: 68 3e cpi r22, 0xE8 ; 232 21bae: 73 40 sbci r23, 0x03 ; 3 21bb0: 81 05 cpc r24, r1 21bb2: 91 05 cpc r25, r1 21bb4: 80 f3 brcs .-32 ; 0x21b96 { ms--; 21bb6: 21 e0 ldi r18, 0x01 ; 1 21bb8: c2 1a sub r12, r18 21bba: d1 08 sbc r13, r1 21bbc: e1 08 sbc r14, r1 21bbe: f1 08 sbc r15, r1 start += 1000; 21bc0: 88 ee ldi r24, 0xE8 ; 232 21bc2: 88 0e add r8, r24 21bc4: 83 e0 ldi r24, 0x03 ; 3 21bc6: 98 1e adc r9, r24 21bc8: a1 1c adc r10, r1 21bca: b1 1c adc r11, r1 21bcc: e4 cf rjmp .-56 ; 0x21b96 } } } 21bce: ff 90 pop r15 21bd0: ef 90 pop r14 21bd2: df 90 pop r13 21bd4: cf 90 pop r12 21bd6: bf 90 pop r11 21bd8: af 90 pop r10 21bda: 9f 90 pop r9 21bdc: 8f 90 pop r8 21bde: 08 95 ret 00021be0 : } unsigned long millis2(void) { unsigned long m; uint8_t oldSREG = SREG; 21be0: 2f b7 in r18, 0x3f ; 63 // disable interrupts while we read timer0_millis or we might get an // inconsistent value (e.g. in the middle of a write to timer0_millis) cli(); 21be2: f8 94 cli m = timer2_millis; 21be4: 60 91 f8 05 lds r22, 0x05F8 ; 0x8005f8 21be8: 70 91 f9 05 lds r23, 0x05F9 ; 0x8005f9 21bec: 80 91 fa 05 lds r24, 0x05FA ; 0x8005fa 21bf0: 90 91 fb 05 lds r25, 0x05FB ; 0x8005fb SREG = oldSREG; 21bf4: 2f bf out 0x3f, r18 ; 63 return m; } 21bf6: 08 95 ret 00021bf8 : } //! @brief Pause print, disable nozzle heater, move to park position, send host action "paused" void lcd_pause_print() { stop_and_save_print_to_ram(0.0, -default_retraction); 21bf8: 60 e0 ldi r22, 0x00 ; 0 21bfa: 70 e0 ldi r23, 0x00 ; 0 21bfc: 80 e8 ldi r24, 0x80 ; 128 21bfe: 9f eb ldi r25, 0xBF ; 191 21c00: 0f 94 06 66 call 0x2cc0c ; 0x2cc0c SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED); 21c04: 8b eb ldi r24, 0xBB ; 187 21c06: 9a e6 ldi r25, 0x6A ; 106 21c08: 0e 94 bd 7c call 0xf97a ; 0xf97a // Indicate that the printer is paused did_pause_print = true; 21c0c: 81 e0 ldi r24, 0x01 ; 1 21c0e: 80 93 cd 03 sts 0x03CD, r24 ; 0x8003cd } else return false; } bool Stopwatch::pause() { if (isRunning()) { 21c12: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 21c16: 81 30 cpi r24, 0x01 ; 1 21c18: 69 f4 brne .+26 ; 0x21c34 state = PAUSED; 21c1a: 82 e0 ldi r24, 0x02 ; 2 21c1c: 80 93 8b 03 sts 0x038B, r24 ; 0x80038b stopTimestamp = _millis(); 21c20: 0f 94 f0 0d call 0x21be0 ; 0x21be0 21c24: 60 93 0b 06 sts 0x060B, r22 ; 0x80060b 21c28: 70 93 0c 06 sts 0x060C, r23 ; 0x80060c 21c2c: 80 93 0d 06 sts 0x060D, r24 ; 0x80060d 21c30: 90 93 0e 06 sts 0x060E, r25 ; 0x80060e print_job_timer.pause(); // return to status is required to continue processing in the main loop! lcd_commands_type = LcdCommands::LongPause; 21c34: 82 e0 ldi r24, 0x02 ; 2 21c36: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e lcd_return_to_status(); 21c3a: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00021c3e ::expired(unsigned short)>: * @param msPeriod Time interval in milliseconds. Do not omit "ul" when using constant literal with LongTimer. * @retval true Timer has expired * @retval false Timer not expired yet, or is not running, or time window in which is timer considered expired passed. */ template bool Timer::expired(T msPeriod) 21c3e: ff 92 push r15 21c40: 0f 93 push r16 21c42: 1f 93 push r17 21c44: cf 93 push r28 21c46: df 93 push r29 { if (!m_isRunning) return false; 21c48: fc 01 movw r30, r24 21c4a: f0 80 ld r15, Z 21c4c: f1 10 cpse r15, r1 21c4e: 08 c0 rjmp .+16 ; 0x21c60 ::expired(unsigned short)+0x22> 21c50: f1 2c mov r15, r1 expired = true; } } if (expired) m_isRunning = false; return expired; } 21c52: 8f 2d mov r24, r15 21c54: df 91 pop r29 21c56: cf 91 pop r28 21c58: 1f 91 pop r17 21c5a: 0f 91 pop r16 21c5c: ff 90 pop r15 21c5e: 08 95 ret 21c60: 8b 01 movw r16, r22 21c62: ec 01 movw r28, r24 template bool Timer::expired(T msPeriod) { if (!m_isRunning) return false; bool expired = false; const T now = _millis(); 21c64: 0f 94 f0 0d call 0x21be0 ; 0x21be0 if (m_started <= m_started + msPeriod) 21c68: 89 81 ldd r24, Y+1 ; 0x01 21c6a: 9a 81 ldd r25, Y+2 ; 0x02 21c6c: 08 0f add r16, r24 21c6e: 19 1f adc r17, r25 21c70: 08 17 cp r16, r24 21c72: 19 07 cpc r17, r25 21c74: 40 f0 brcs .+16 ; 0x21c86 ::expired(unsigned short)+0x48> { if ((now >= m_started + msPeriod) || (now < m_started)) 21c76: 60 17 cp r22, r16 21c78: 71 07 cpc r23, r17 21c7a: 18 f4 brcc .+6 ; 0x21c82 ::expired(unsigned short)+0x44> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 21c7c: 68 17 cp r22, r24 21c7e: 79 07 cpc r23, r25 21c80: 38 f7 brcc .-50 ; 0x21c50 ::expired(unsigned short)+0x12> { expired = true; } } if (expired) m_isRunning = false; 21c82: 18 82 st Y, r1 21c84: e6 cf rjmp .-52 ; 0x21c52 ::expired(unsigned short)+0x14> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 21c86: 60 17 cp r22, r16 21c88: 71 07 cpc r23, r17 21c8a: c0 f7 brcc .-16 ; 0x21c7c ::expired(unsigned short)+0x3e> 21c8c: e1 cf rjmp .-62 ; 0x21c50 ::expired(unsigned short)+0x12> 00021c8e ::expired_cont(unsigned short)>: } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 21c8e: fc 01 movw r30, r24 21c90: 20 81 ld r18, Z 21c92: 21 11 cpse r18, r1 21c94: 0d 94 1f 0e jmp 0x21c3e ; 0x21c3e ::expired(unsigned short)> } 21c98: 81 e0 ldi r24, 0x01 ; 1 21c9a: 08 95 ret 00021c9c ::start()>: /** * @brief Start timer */ template void Timer::start() 21c9c: cf 93 push r28 21c9e: df 93 push r29 21ca0: ec 01 movw r28, r24 { m_started = _millis(); 21ca2: 0f 94 f0 0d call 0x21be0 ; 0x21be0 21ca6: 7a 83 std Y+2, r23 ; 0x02 21ca8: 69 83 std Y+1, r22 ; 0x01 m_isRunning = true; 21caa: 81 e0 ldi r24, 0x01 ; 1 21cac: 88 83 st Y, r24 } 21cae: df 91 pop r29 21cb0: cf 91 pop r28 21cb2: 08 95 ret 00021cb4 : TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); } static uint8_t twi_wait(uint8_t status) { 21cb4: 1f 93 push r17 21cb6: cf 93 push r28 21cb8: df 93 push r29 21cba: 00 d0 rcall .+0 ; 0x21cbc 21cbc: cd b7 in r28, 0x3d ; 61 21cbe: de b7 in r29, 0x3e ; 62 21cc0: 18 2f mov r17, r24 ShortTimer timmy; 21cc2: 19 82 std Y+1, r1 ; 0x01 21cc4: 1b 82 std Y+3, r1 ; 0x03 21cc6: 1a 82 std Y+2, r1 ; 0x02 timmy.start(); 21cc8: ce 01 movw r24, r28 21cca: 01 96 adiw r24, 0x01 ; 1 21ccc: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> while(!(TWCR & _BV(TWINT))) { 21cd0: 80 91 bc 00 lds r24, 0x00BC ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> 21cd4: 87 fd sbrc r24, 7 21cd6: 0a c0 rjmp .+20 ; 0x21cec if (timmy.expired(TWI_TIMEOUT_MS)) { 21cd8: 6a e0 ldi r22, 0x0A ; 10 21cda: 70 e0 ldi r23, 0x00 ; 0 21cdc: ce 01 movw r24, r28 21cde: 01 96 adiw r24, 0x01 ; 1 21ce0: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 21ce4: 88 23 and r24, r24 21ce6: a1 f3 breq .-24 ; 0x21cd0 return 2; 21ce8: 82 e0 ldi r24, 0x02 ; 2 21cea: 09 c0 rjmp .+18 ; 0x21cfe } } if(TW_STATUS != status) 21cec: 80 91 b9 00 lds r24, 0x00B9 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> 21cf0: 88 7f andi r24, 0xF8 ; 248 21cf2: 18 17 cp r17, r24 21cf4: 59 f0 breq .+22 ; 0x21d0c } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 21cf6: 84 e9 ldi r24, 0x94 ; 148 21cf8: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> } } if(TW_STATUS != status) { twi_stop(); return 1; 21cfc: 81 e0 ldi r24, 0x01 ; 1 } return 0; } 21cfe: 0f 90 pop r0 21d00: 0f 90 pop r0 21d02: 0f 90 pop r0 21d04: df 91 pop r29 21d06: cf 91 pop r28 21d08: 1f 91 pop r17 21d0a: 08 95 ret if(TW_STATUS != status) { twi_stop(); return 1; } return 0; 21d0c: 80 e0 ldi r24, 0x00 ; 0 21d0e: f7 cf rjmp .-18 ; 0x21cfe 00021d10 ::expired(unsigned long)>: * @param msPeriod Time interval in milliseconds. Do not omit "ul" when using constant literal with LongTimer. * @retval true Timer has expired * @retval false Timer not expired yet, or is not running, or time window in which is timer considered expired passed. */ template bool Timer::expired(T msPeriod) 21d10: 8f 92 push r8 21d12: 9f 92 push r9 21d14: af 92 push r10 21d16: bf 92 push r11 21d18: cf 92 push r12 21d1a: df 92 push r13 21d1c: ef 92 push r14 21d1e: ff 92 push r15 21d20: 1f 93 push r17 21d22: cf 93 push r28 21d24: df 93 push r29 { if (!m_isRunning) return false; 21d26: fc 01 movw r30, r24 21d28: 10 81 ld r17, Z 21d2a: 11 11 cpse r17, r1 21d2c: 0e c0 rjmp .+28 ; 0x21d4a ::expired(unsigned long)+0x3a> 21d2e: 10 e0 ldi r17, 0x00 ; 0 expired = true; } } if (expired) m_isRunning = false; return expired; } 21d30: 81 2f mov r24, r17 21d32: df 91 pop r29 21d34: cf 91 pop r28 21d36: 1f 91 pop r17 21d38: ff 90 pop r15 21d3a: ef 90 pop r14 21d3c: df 90 pop r13 21d3e: cf 90 pop r12 21d40: bf 90 pop r11 21d42: af 90 pop r10 21d44: 9f 90 pop r9 21d46: 8f 90 pop r8 21d48: 08 95 ret 21d4a: 6a 01 movw r12, r20 21d4c: 7b 01 movw r14, r22 21d4e: ec 01 movw r28, r24 template bool Timer::expired(T msPeriod) { if (!m_isRunning) return false; bool expired = false; const T now = _millis(); 21d50: 0f 94 f0 0d call 0x21be0 ; 0x21be0 21d54: 4b 01 movw r8, r22 21d56: 5c 01 movw r10, r24 if (m_started <= m_started + msPeriod) 21d58: 89 81 ldd r24, Y+1 ; 0x01 21d5a: 9a 81 ldd r25, Y+2 ; 0x02 21d5c: ab 81 ldd r26, Y+3 ; 0x03 21d5e: bc 81 ldd r27, Y+4 ; 0x04 21d60: c8 0e add r12, r24 21d62: d9 1e adc r13, r25 21d64: ea 1e adc r14, r26 21d66: fb 1e adc r15, r27 21d68: c8 16 cp r12, r24 21d6a: d9 06 cpc r13, r25 21d6c: ea 06 cpc r14, r26 21d6e: fb 06 cpc r15, r27 21d70: 60 f0 brcs .+24 ; 0x21d8a ::expired(unsigned long)+0x7a> { if ((now >= m_started + msPeriod) || (now < m_started)) 21d72: 8c 14 cp r8, r12 21d74: 9d 04 cpc r9, r13 21d76: ae 04 cpc r10, r14 21d78: bf 04 cpc r11, r15 21d7a: 28 f4 brcc .+10 ; 0x21d86 ::expired(unsigned long)+0x76> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 21d7c: 88 16 cp r8, r24 21d7e: 99 06 cpc r9, r25 21d80: aa 06 cpc r10, r26 21d82: bb 06 cpc r11, r27 21d84: a0 f6 brcc .-88 ; 0x21d2e ::expired(unsigned long)+0x1e> { expired = true; } } if (expired) m_isRunning = false; 21d86: 18 82 st Y, r1 21d88: d3 cf rjmp .-90 ; 0x21d30 ::expired(unsigned long)+0x20> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 21d8a: 8c 14 cp r8, r12 21d8c: 9d 04 cpc r9, r13 21d8e: ae 04 cpc r10, r14 21d90: bf 04 cpc r11, r15 21d92: a0 f7 brcc .-24 ; 0x21d7c ::expired(unsigned long)+0x6c> 21d94: cc cf rjmp .-104 ; 0x21d2e ::expired(unsigned long)+0x1e> 00021d96 : } lcd_space(8 - chars); } //! @Brief Print status line on status screen void lcdui_print_status_line(void) { 21d96: 0f 93 push r16 21d98: 1f 93 push r17 21d9a: cf 93 push r28 static uint8_t heating_status_counter; if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating 21d9c: 80 91 cb 03 lds r24, 0x03CB ; 0x8003cb 21da0: 88 23 and r24, r24 21da2: 09 f4 brne .+2 ; 0x21da6 21da4: 4d c0 rjmp .+154 ; 0x21e40 heating_status_counter++; 21da6: 80 91 04 06 lds r24, 0x0604 ; 0x800604 21daa: 8f 5f subi r24, 0xFF ; 255 if (heating_status_counter > 13) { 21dac: 8e 30 cpi r24, 0x0E ; 14 21dae: b0 f4 brcc .+44 ; 0x21ddc //! @Brief Print status line on status screen void lcdui_print_status_line(void) { static uint8_t heating_status_counter; if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating heating_status_counter++; 21db0: 80 93 04 06 sts 0x0604, r24 ; 0x800604 if (heating_status_counter > 13) { heating_status_counter = 0; } lcd_set_cursor(7, 3); 21db4: 63 e0 ldi r22, 0x03 ; 3 21db6: 87 e0 ldi r24, 0x07 ; 7 21db8: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_space(13); 21dbc: 8d e0 ldi r24, 0x0D ; 13 21dbe: 0e 94 28 6f call 0xde50 ; 0xde50 for (uint8_t dots = 0; dots < heating_status_counter; dots++) { 21dc2: c0 e0 ldi r28, 0x00 ; 0 21dc4: 80 91 04 06 lds r24, 0x0604 ; 0x800604 21dc8: c8 17 cp r28, r24 21dca: 58 f4 brcc .+22 ; 0x21de2 lcd_putc_at(7 + dots, 3, '.'); 21dcc: 4e e2 ldi r20, 0x2E ; 46 21dce: 63 e0 ldi r22, 0x03 ; 3 21dd0: 87 e0 ldi r24, 0x07 ; 7 21dd2: 8c 0f add r24, r28 21dd4: 0e 94 13 70 call 0xe026 ; 0xe026 heating_status_counter = 0; } lcd_set_cursor(7, 3); lcd_space(13); for (uint8_t dots = 0; dots < heating_status_counter; dots++) { 21dd8: cf 5f subi r28, 0xFF ; 255 21dda: f4 cf rjmp .-24 ; 0x21dc4 void lcdui_print_status_line(void) { static uint8_t heating_status_counter; if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating heating_status_counter++; if (heating_status_counter > 13) { heating_status_counter = 0; 21ddc: 10 92 04 06 sts 0x0604, r1 ; 0x800604 21de0: e9 cf rjmp .-46 ; 0x21db4 lcd_space(13); for (uint8_t dots = 0; dots < heating_status_counter; dots++) { lcd_putc_at(7 + dots, 3, '.'); } switch (heating_status) { 21de2: 80 91 cb 03 lds r24, 0x03CB ; 0x8003cb 21de6: 82 30 cpi r24, 0x02 ; 2 21de8: d1 f0 breq .+52 ; 0x21e1e 21dea: 30 f4 brcc .+12 ; 0x21df8 21dec: 81 30 cpi r24, 0x01 ; 1 21dee: 59 f0 breq .+22 ; 0x21e06 case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 21df0: cf 91 pop r28 21df2: 1f 91 pop r17 21df4: 0f 91 pop r16 21df6: 08 95 ret lcd_space(13); for (uint8_t dots = 0; dots < heating_status_counter; dots++) { lcd_putc_at(7 + dots, 3, '.'); } switch (heating_status) { 21df8: 83 30 cpi r24, 0x03 ; 3 21dfa: f9 f0 breq .+62 ; 0x21e3a 21dfc: 84 30 cpi r24, 0x04 ; 4 21dfe: c1 f7 brne .-16 ; 0x21df0 break; case HeatingStatus::BED_HEATING: lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING)); break; case HeatingStatus::BED_HEATING_COMPLETE: lcd_puts_at_P(0, 3, _T(MSG_BED_DONE)); 21e00: 8c e4 ldi r24, 0x4C ; 76 21e02: 96 e5 ldi r25, 0x56 ; 86 21e04: 0e c0 rjmp .+28 ; 0x21e22 for (uint8_t dots = 0; dots < heating_status_counter; dots++) { lcd_putc_at(7 + dots, 3, '.'); } switch (heating_status) { case HeatingStatus::EXTRUDER_HEATING: lcd_puts_at_P(0, 3, _T(MSG_HEATING)); 21e06: 85 e7 ldi r24, 0x75 ; 117 21e08: 96 e5 ldi r25, 0x56 ; 86 lcd_print(custom_message_state); // seconds lcd_print(' '); } break; case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); 21e0a: 0e 94 3a 75 call 0xea74 ; 0xea74 21e0e: ac 01 movw r20, r24 21e10: 63 e0 ldi r22, 0x03 ; 3 21e12: 80 e0 ldi r24, 0x00 ; 0 break; } } } 21e14: cf 91 pop r28 21e16: 1f 91 pop r17 21e18: 0f 91 pop r16 lcd_print(custom_message_state); // seconds lcd_print(' '); } break; case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); 21e1a: 0c 94 07 70 jmp 0xe00e ; 0xe00e switch (heating_status) { case HeatingStatus::EXTRUDER_HEATING: lcd_puts_at_P(0, 3, _T(MSG_HEATING)); break; case HeatingStatus::EXTRUDER_HEATING_COMPLETE: lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE)); 21e1e: 85 e6 ldi r24, 0x65 ; 101 21e20: 96 e5 ldi r25, 0x56 ; 86 break; case HeatingStatus::BED_HEATING: lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING)); break; case HeatingStatus::BED_HEATING_COMPLETE: lcd_puts_at_P(0, 3, _T(MSG_BED_DONE)); 21e22: 0e 94 3a 75 call 0xea74 ; 0xea74 21e26: ac 01 movw r20, r24 21e28: 63 e0 ldi r22, 0x03 ; 3 21e2a: 80 e0 ldi r24, 0x00 ; 0 21e2c: 0e 94 07 70 call 0xe00e ; 0xe00e heating_status = HeatingStatus::NO_HEATING; 21e30: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb heating_status_counter = 0; 21e34: 10 92 04 06 sts 0x0604, r1 ; 0x800604 21e38: db cf rjmp .-74 ; 0x21df0 lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE)); heating_status = HeatingStatus::NO_HEATING; heating_status_counter = 0; break; case HeatingStatus::BED_HEATING: lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING)); 21e3a: 87 e5 ldi r24, 0x57 ; 87 21e3c: 96 e5 ldi r25, 0x56 ; 86 21e3e: e5 cf rjmp .-54 ; 0x21e0a #ifdef SHOW_FILENAME_AFTER_FINISH || (GetPrinterState() == PrinterState::SDPrintingFinished) #endif //SHOW_FILENAME_AFTER_FINISH ) && (custom_message_type == CustomMsg::Status) && (lcd_status_message_level <= LCD_STATUS_INFO) && 21e40: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 21e44: 88 23 and r24, r24 21e46: 61 f1 breq .+88 ; 0x21ea0 } else if (((IS_SD_PRINTING) #ifdef SHOW_FILENAME_AFTER_FINISH || (GetPrinterState() == PrinterState::SDPrintingFinished) #endif //SHOW_FILENAME_AFTER_FINISH ) && 21e48: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 21e4c: 81 11 cpse r24, r1 21e4e: 28 c0 rjmp .+80 ; 0x21ea0 (custom_message_type == CustomMsg::Status) && 21e50: 80 91 c0 03 lds r24, 0x03C0 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> 21e54: 82 30 cpi r24, 0x02 ; 2 21e56: 20 f5 brcc .+72 ; 0x21ea0 } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 21e58: 80 91 7a 04 lds r24, 0x047A ; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423> 21e5c: 81 11 cpse r24, r1 21e5e: 16 c0 rjmp .+44 ; 0x21e8c (lcd_status_message_level <= LCD_STATUS_INFO) && lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT)) { // If printing from SD, show what we are printing const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename); 21e60: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 21e64: 88 23 and r24, r24 21e66: 09 f4 brne .+2 ; 0x21e6a 21e68: 35 c0 rjmp .+106 ; 0x21ed4 21e6a: 8e ee ldi r24, 0xEE ; 238 21e6c: 93 e1 ldi r25, 0x13 ; 19 if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0) 21e6e: 20 91 62 0d lds r18, 0x0D62 ; 0x800d62 21e72: 64 e1 ldi r22, 0x14 ; 20 21e74: 82 0f add r24, r18 21e76: 91 1d adc r25, r1 21e78: 0e 94 47 73 call 0xe68e ; 0xe68e 21e7c: 81 11 cpse r24, r1 21e7e: 2d c0 rjmp .+90 ; 0x21eda { scrollstuff++; 21e80: 80 91 62 0d lds r24, 0x0D62 ; 0x800d62 21e84: 8f 5f subi r24, 0xFF ; 255 21e86: 80 93 62 0d sts 0x0D62, r24 ; 0x800d62 21e8a: b2 cf rjmp .-156 ; 0x21df0 21e8c: 40 e2 ldi r20, 0x20 ; 32 21e8e: 5e e4 ldi r21, 0x4E ; 78 21e90: 60 e0 ldi r22, 0x00 ; 0 21e92: 70 e0 ldi r23, 0x00 ; 0 21e94: 8a e7 ldi r24, 0x7A ; 122 21e96: 94 e0 ldi r25, 0x04 ; 4 21e98: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 21e9c: 81 11 cpse r24, r1 21e9e: e0 cf rjmp .-64 ; 0x21e60 scrollstuff = 0; } } else { // Otherwise check for other special events if ( custom_message_type != CustomMsg::Status && lcd_status_message_timeout.running() && lcd_status_message_timeout.elapsed() < LCD_STATUS_DELAYED_TIMEOUT) 21ea0: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 21ea4: 81 11 cpse r24, r1 21ea6: 1c c0 rjmp .+56 ; 0x21ee0 { return; // Nothing to do, waiting for delay to expire } switch (custom_message_type) { 21ea8: e0 91 5d 06 lds r30, 0x065D ; 0x80065d 21eac: ea 30 cpi r30, 0x0A ; 10 21eae: 08 f0 brcs .+2 ; 0x21eb2 21eb0: 9f cf rjmp .-194 ; 0x21df0 21eb2: f0 e0 ldi r31, 0x00 ; 0 21eb4: 88 27 eor r24, r24 21eb6: e0 5a subi r30, 0xA0 ; 160 21eb8: f0 4f sbci r31, 0xF0 ; 240 21eba: 8e 4f sbci r24, 0xFE ; 254 21ebc: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 21ec0: 46 37 cpi r20, 0x76 ; 118 21ec2: f2 36 cpi r31, 0x62 ; 98 21ec4: 46 37 cpi r20, 0x76 ; 118 21ec6: 32 37 cpi r19, 0x72 ; 114 21ec8: 5a 38 cpi r21, 0x8A ; 138 21eca: 8e 38 cpi r24, 0x8E ; 142 21ecc: 46 37 cpi r20, 0x76 ; 118 21ece: 46 37 cpi r20, 0x76 ; 118 21ed0: d2 37 cpi r29, 0x72 ; 114 21ed2: 46 37 cpi r20, 0x76 ; 118 (custom_message_type == CustomMsg::Status) && (lcd_status_message_level <= LCD_STATUS_INFO) && lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT)) { // If printing from SD, show what we are printing const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename); 21ed4: 89 ed ldi r24, 0xD9 ; 217 21ed6: 93 e1 ldi r25, 0x13 ; 19 21ed8: ca cf rjmp .-108 ; 0x21e6e if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0) { scrollstuff++; } else { scrollstuff = 0; 21eda: 10 92 62 0d sts 0x0D62, r1 ; 0x800d62 21ede: 88 cf rjmp .-240 ; 0x21df0 } } else { // Otherwise check for other special events if ( custom_message_type != CustomMsg::Status && lcd_status_message_timeout.running() 21ee0: 80 91 7a 04 lds r24, 0x047A ; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423> 21ee4: 88 23 and r24, r24 21ee6: 01 f3 breq .-64 ; 0x21ea8 * This function is expected to handle wrap around of time register well. * The maximum elapsed time is dictated by the template type */ template T Timer::elapsed() { return m_isRunning ? (_millis() - m_started) : 0; 21ee8: 0f 94 f0 0d call 0x21be0 ; 0x21be0 21eec: 00 91 7b 04 lds r16, 0x047B ; 0x80047b <_ZL26lcd_status_message_timeout.lto_priv.423+0x1> 21ef0: 10 91 7c 04 lds r17, 0x047C ; 0x80047c <_ZL26lcd_status_message_timeout.lto_priv.423+0x2> 21ef4: 20 91 7d 04 lds r18, 0x047D ; 0x80047d <_ZL26lcd_status_message_timeout.lto_priv.423+0x3> 21ef8: 30 91 7e 04 lds r19, 0x047E ; 0x80047e <_ZL26lcd_status_message_timeout.lto_priv.423+0x4> 21efc: 60 1b sub r22, r16 21efe: 71 0b sbc r23, r17 21f00: 82 0b sbc r24, r18 21f02: 93 0b sbc r25, r19 && lcd_status_message_timeout.elapsed() < LCD_STATUS_DELAYED_TIMEOUT) 21f04: 60 3a cpi r22, 0xA0 ; 160 21f06: 7f 40 sbci r23, 0x0F ; 15 21f08: 81 05 cpc r24, r1 21f0a: 91 05 cpc r25, r1 21f0c: 68 f6 brcc .-102 ; 0x21ea8 21f0e: 70 cf rjmp .-288 ; 0x21df0 case CustomMsg::Status: // Nothing special, print status message normally case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD case CustomMsg::FilamentLoading: // If loading filament, print status case CustomMsg::MMUProgress: // MMU Progress Codes { lcd_set_cursor(lcd_status_message_idx, 3); 21f10: 63 e0 ldi r22, 0x03 ; 3 21f12: 80 91 64 04 lds r24, 0x0464 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> 21f16: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 const uint8_t padding = lcd_print_pad(&lcd_status_message[lcd_status_message_idx], LCD_WIDTH - lcd_status_message_idx); 21f1a: 80 91 64 04 lds r24, 0x0464 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> 21f1e: c4 e1 ldi r28, 0x14 ; 20 21f20: 6c 2f mov r22, r28 21f22: 68 1b sub r22, r24 21f24: 90 e0 ldi r25, 0x00 ; 0 21f26: 8b 59 subi r24, 0x9B ; 155 21f28: 9b 4f sbci r25, 0xFB ; 251 21f2a: 0e 94 47 73 call 0xe68e ; 0xe68e lcd_status_message_idx = LCD_WIDTH - padding; 21f2e: c8 1b sub r28, r24 21f30: c0 93 64 04 sts 0x0464, r28 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> 21f34: 5d cf rjmp .-326 ; 0x21df0 } break; case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status if (custom_message_state > 10) { 21f36: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 21f3a: 8b 30 cpi r24, 0x0B ; 11 21f3c: 08 f1 brcs .+66 ; 0x21f80 lcd_set_cursor(0, 3); 21f3e: 63 e0 ldi r22, 0x03 ; 3 21f40: 80 e0 ldi r24, 0x00 ; 0 21f42: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_space(LCD_WIDTH); 21f46: 84 e1 ldi r24, 0x14 ; 20 21f48: 0e 94 28 6f call 0xde50 ; 0xde50 lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO)); 21f4c: 8c e3 ldi r24, 0x3C ; 60 21f4e: 96 e5 ldi r25, 0x56 ; 86 21f50: 0e 94 3a 75 call 0xea74 ; 0xea74 21f54: ac 01 movw r20, r24 21f56: 63 e0 ldi r22, 0x03 ; 3 21f58: 80 e0 ldi r24, 0x00 ; 0 21f5a: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_P(PSTR(" : ")); 21f5e: 8f e7 ldi r24, 0x7F ; 127 21f60: 97 e9 ldi r25, 0x97 ; 151 21f62: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_print(custom_message_state - 10); 21f66: 60 91 de 03 lds r22, 0x03DE ; 0x8003de 21f6a: 6a 50 subi r22, 0x0A ; 10 21f6c: 77 0b sbc r23, r23 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); 21f6e: 07 2e mov r0, r23 21f70: 00 0c add r0, r0 21f72: 88 0b sbc r24, r24 21f74: 99 0b sbc r25, r25 case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 21f76: cf 91 pop r28 21f78: 1f 91 pop r17 21f7a: 0f 91 pop r16 21f7c: 0c 94 db 71 jmp 0xe3b6 ; 0xe3b6 lcd_space(LCD_WIDTH); lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO)); lcd_puts_P(PSTR(" : ")); lcd_print(custom_message_state - 10); } else { if (custom_message_state == 3) { 21f80: 83 30 cpi r24, 0x03 ; 3 21f82: 31 f4 brne .+12 ; 0x21f90 lcd_setstatuspgm(MSG_WELCOME); 21f84: 86 ee ldi r24, 0xE6 ; 230 21f86: 9b e6 ldi r25, 0x6B ; 107 21f88: 0e 94 94 de call 0x1bd28 ; 0x1bd28 custom_message_type = CustomMsg::Status; 21f8c: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d } if (custom_message_state > 3 && custom_message_state <= 10) { 21f90: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 21f94: 84 50 subi r24, 0x04 ; 4 21f96: 87 30 cpi r24, 0x07 ; 7 21f98: 08 f0 brcs .+2 ; 0x21f9c 21f9a: 2a cf rjmp .-428 ; 0x21df0 lcd_set_cursor(0, 3); 21f9c: 63 e0 ldi r22, 0x03 ; 3 21f9e: 80 e0 ldi r24, 0x00 ; 0 21fa0: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_space(19); 21fa4: 83 e1 ldi r24, 0x13 ; 19 21fa6: 0e 94 28 6f call 0xde50 ; 0xde50 lcd_puts_at_P(0, 3, _T(MSG_HOMEYZ_DONE)); 21faa: 89 e2 ldi r24, 0x29 ; 41 21fac: 96 e5 ldi r25, 0x56 ; 86 21fae: 0e 94 3a 75 call 0xea74 ; 0xea74 21fb2: ac 01 movw r20, r24 21fb4: 63 e0 ldi r22, 0x03 ; 3 21fb6: 80 e0 ldi r24, 0x00 ; 0 21fb8: 0e 94 07 70 call 0xe00e ; 0xe00e custom_message_state--; 21fbc: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 21fc0: 81 50 subi r24, 0x01 ; 1 21fc2: 80 93 de 03 sts 0x03DE, r24 ; 0x8003de 21fc6: 14 cf rjmp .-472 ; 0x21df0 } } break; case CustomMsg::PidCal: // PID tuning in progress lcd_print_pad(lcd_status_message, LCD_WIDTH); 21fc8: 64 e1 ldi r22, 0x14 ; 20 21fca: 85 e6 ldi r24, 0x65 ; 101 21fcc: 94 e0 ldi r25, 0x04 ; 4 21fce: 0e 94 47 73 call 0xe68e ; 0xe68e if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) { 21fd2: 20 91 02 06 lds r18, 0x0602 ; 0x800602 21fd6: 30 91 03 06 lds r19, 0x0603 ; 0x800603 21fda: 80 91 00 06 lds r24, 0x0600 ; 0x800600 21fde: 90 91 01 06 lds r25, 0x0601 ; 0x800601 21fe2: 82 17 cp r24, r18 21fe4: 93 07 cpc r25, r19 21fe6: 0c f4 brge .+2 ; 0x21fea 21fe8: 03 cf rjmp .-506 ; 0x21df0 21fea: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 21fee: 88 23 and r24, r24 21ff0: 09 f4 brne .+2 ; 0x21ff4 21ff2: fe ce rjmp .-516 ; 0x21df0 lcd_set_cursor(10, 3); 21ff4: 63 e0 ldi r22, 0x03 ; 3 21ff6: 8a e0 ldi r24, 0x0A ; 10 21ff8: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles); 21ffc: 80 91 01 06 lds r24, 0x0601 ; 0x800601 22000: 8f 93 push r24 22002: 80 91 00 06 lds r24, 0x0600 ; 0x800600 22006: 8f 93 push r24 22008: 80 91 03 06 lds r24, 0x0603 ; 0x800603 2200c: 8f 93 push r24 2200e: 80 91 02 06 lds r24, 0x0602 ; 0x800602 22012: 8f 93 push r24 22014: 86 e7 ldi r24, 0x76 ; 118 22016: 97 e9 ldi r25, 0x97 ; 151 } break; case CustomMsg::TempCal: // PINDA temp calibration in progress lcd_set_cursor(0, 3); lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state); 22018: 9f 93 push r25 2201a: 8f 93 push r24 2201c: 0e 94 0b 6f call 0xde16 ; 0xde16 22020: 0f 90 pop r0 22022: 0f 90 pop r0 22024: 0f 90 pop r0 22026: 0f 90 pop r0 22028: 0f 90 pop r0 2202a: 0f 90 pop r0 2202c: e1 ce rjmp .-574 ; 0x21df0 lcd_set_cursor(10, 3); lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles); } break; case CustomMsg::TempCal: // PINDA temp calibration in progress lcd_set_cursor(0, 3); 2202e: 63 e0 ldi r22, 0x03 ; 3 22030: 80 e0 ldi r24, 0x00 ; 0 22032: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state); 22036: c0 91 de 03 lds r28, 0x03DE ; 0x8003de 2203a: 8c ec ldi r24, 0xCC ; 204 2203c: 95 e4 ldi r25, 0x45 ; 69 2203e: 0e 94 3a 75 call 0xea74 ; 0xea74 22042: 1f 92 push r1 22044: cf 93 push r28 22046: 9f 93 push r25 22048: 8f 93 push r24 2204a: 88 e6 ldi r24, 0x68 ; 104 2204c: 97 e9 ldi r25, 0x97 ; 151 2204e: e4 cf rjmp .-56 ; 0x22018 break; case CustomMsg::TempCompPreheat: // temp compensation preheat lcd_puts_at_P(0, 3, _T(MSG_PINDA_PREHEAT)); 22050: 89 e1 ldi r24, 0x19 ; 25 22052: 96 e5 ldi r25, 0x56 ; 86 22054: 0e 94 3a 75 call 0xea74 ; 0xea74 22058: ac 01 movw r20, r24 2205a: 63 e0 ldi r22, 0x03 ; 3 2205c: 80 e0 ldi r24, 0x00 ; 0 2205e: 0e 94 07 70 call 0xe00e ; 0xe00e if (custom_message_state <= PINDA_HEAT_T) { 22062: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 22066: 89 37 cpi r24, 0x79 ; 121 22068: 08 f0 brcs .+2 ; 0x2206c 2206a: c2 ce rjmp .-636 ; 0x21df0 lcd_puts_P(PSTR(": ")); 2206c: 85 e6 ldi r24, 0x65 ; 101 2206e: 97 e9 ldi r25, 0x97 ; 151 22070: 0e 94 1d 6f call 0xde3a ; 0xde3a } void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); 22074: 80 91 de 03 lds r24, 0x03DE ; 0x8003de 22078: 0e 94 a2 70 call 0xe144 ; 0xe144 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 2207c: 80 e2 ldi r24, 0x20 ; 32 case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 2207e: cf 91 pop r28 22080: 1f 91 pop r17 22082: 0f 91 pop r16 22084: 0c 94 a2 70 jmp 0xe144 ; 0xe144 lcd_print(custom_message_state); // seconds lcd_print(' '); } break; case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); 22088: 88 e0 ldi r24, 0x08 ; 8 2208a: 96 e5 ldi r25, 0x56 ; 86 2208c: be ce rjmp .-644 ; 0x21e0a 0002208e ::start()>: /** * @brief Start timer */ template void Timer::start() 2208e: cf 93 push r28 22090: df 93 push r29 22092: ec 01 movw r28, r24 { m_started = _millis(); 22094: 0f 94 f0 0d call 0x21be0 ; 0x21be0 22098: 69 83 std Y+1, r22 ; 0x01 2209a: 7a 83 std Y+2, r23 ; 0x02 2209c: 8b 83 std Y+3, r24 ; 0x03 2209e: 9c 83 std Y+4, r25 ; 0x04 m_isRunning = true; 220a0: 81 e0 ldi r24, 0x01 ; 1 220a2: 88 83 st Y, r24 } 220a4: df 91 pop r29 220a6: cf 91 pop r28 220a8: 08 95 ret 000220aa : //! signal a temperature error on both the lcd and serial //! @param type short error abbreviation (PROGMEM) //! @param e optional extruder index for hotend errors static void temp_error_messagepgm(const char* PROGMEM type, uint8_t e = EXTRUDERS) { 220aa: cf 92 push r12 220ac: df 92 push r13 220ae: ef 92 push r14 220b0: ff 92 push r15 220b2: 1f 93 push r17 220b4: cf 93 push r28 220b6: df 93 push r29 220b8: cd b7 in r28, 0x3d ; 61 220ba: de b7 in r29, 0x3e ; 62 220bc: 64 97 sbiw r28, 0x14 ; 20 220be: 0f b6 in r0, 0x3f ; 63 220c0: f8 94 cli 220c2: de bf out 0x3e, r29 ; 62 220c4: 0f be out 0x3f, r0 ; 63 220c6: cd bf out 0x3d, r28 ; 61 220c8: 7c 01 movw r14, r24 220ca: 16 2f mov r17, r22 char msg[LCD_WIDTH]; strcpy_P(msg, PSTR("Err: ")); 220cc: 6e e2 ldi r22, 0x2E ; 46 220ce: 77 e9 ldi r23, 0x97 ; 151 220d0: ce 01 movw r24, r28 220d2: 01 96 adiw r24, 0x01 ; 1 220d4: 0f 94 97 a1 call 0x3432e ; 0x3432e strcat_P(msg, type); 220d8: b7 01 movw r22, r14 220da: ce 01 movw r24, r28 220dc: 01 96 adiw r24, 0x01 ; 1 220de: 0f 94 83 a1 call 0x34306 ; 0x34306 lcd_status_message_timeout.start(); } void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem) { if (lcd_message_check(severity)) { 220e2: 83 e0 ldi r24, 0x03 ; 3 220e4: 0e 94 16 da call 0x1b42c ; 0x1b42c 220e8: 88 23 and r24, r24 220ea: e1 f0 breq .+56 ; 0x22124 bool same = !(progmem? strcmp_P(lcd_status_message, message): strcmp(lcd_status_message, message)); 220ec: be 01 movw r22, r28 220ee: 6f 5f subi r22, 0xFF ; 255 220f0: 7f 4f sbci r23, 0xFF ; 255 220f2: 85 e6 ldi r24, 0x65 ; 101 220f4: 94 e0 ldi r25, 0x04 ; 4 220f6: 0f 94 42 aa call 0x35484 ; 0x35484 220fa: 6c 01 movw r12, r24 lcd_status_message_timeout.start(); 220fc: 8a e7 ldi r24, 0x7A ; 122 220fe: 94 e0 ldi r25, 0x04 ; 4 22100: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> lcd_status_message_level = severity; 22104: 83 e0 ldi r24, 0x03 ; 3 22106: 80 93 c0 03 sts 0x03C0, r24 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> custom_message_type = CustomMsg::Status; 2210a: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d custom_message_state = 0; 2210e: 10 92 de 03 sts 0x03DE, r1 ; 0x8003de if (!same) { 22112: cd 28 or r12, r13 22114: 39 f0 breq .+14 ; 0x22124 // do not kick the user out of the menus if the message is unchanged lcd_updatestatus(message, progmem); 22116: 60 e0 ldi r22, 0x00 ; 0 22118: ce 01 movw r24, r28 2211a: 01 96 adiw r24, 0x01 ; 1 2211c: 0e 94 fb d9 call 0x1b3f6 ; 0x1b3f6 lcd_return_to_status(); 22120: 0f 94 d5 07 call 0x20faa ; 0x20faa lcd_setalertstatus(msg, LCD_STATUS_CRITICAL); SERIAL_ERROR_START; 22124: 81 eb ldi r24, 0xB1 ; 177 22126: 91 ea ldi r25, 0xA1 ; 161 22128: 0e 94 c4 7a call 0xf588 ; 0xf588 if(e != EXTRUDERS) { 2212c: 11 30 cpi r17, 0x01 ; 1 2212e: 51 f0 breq .+20 ; 0x22144 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 22130: 61 2f mov r22, r17 22132: 70 e0 ldi r23, 0x00 ; 0 22134: 90 e0 ldi r25, 0x00 ; 0 22136: 80 e0 ldi r24, 0x00 ; 0 22138: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ERROR((int)e); SERIAL_ERRORPGM(": "); 2213c: 8b e2 ldi r24, 0x2B ; 43 2213e: 97 e9 ldi r25, 0x97 ; 151 22140: 0e 94 c4 7a call 0xf588 ; 0xf588 } SERIAL_ERRORPGM("Heaters switched off. "); 22144: 84 e1 ldi r24, 0x14 ; 20 22146: 97 e9 ldi r25, 0x97 ; 151 22148: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORRPGM(type); 2214c: c7 01 movw r24, r14 2214e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNPGM(" triggered!"); 22152: 88 e0 ldi r24, 0x08 ; 8 22154: 97 e9 ldi r25, 0x97 ; 151 22156: 0e 94 bd 7c call 0xf97a ; 0xf97a } 2215a: 64 96 adiw r28, 0x14 ; 20 2215c: 0f b6 in r0, 0x3f ; 63 2215e: f8 94 cli 22160: de bf out 0x3e, r29 ; 62 22162: 0f be out 0x3f, r0 ; 63 22164: cd bf out 0x3d, r28 ; 61 22166: df 91 pop r29 22168: cf 91 pop r28 2216a: 1f 91 pop r17 2216c: ff 90 pop r15 2216e: ef 90 pop r14 22170: df 90 pop r13 22172: cf 90 pop r12 22174: 08 95 ret 00022176 <__vector_15>: volatile unsigned long timer2_overflow_count; volatile unsigned long timer2_millis; unsigned char timer2_fract = 0; ISR(TIMER2_OVF_vect) { 22176: 1f 92 push r1 22178: 0f 92 push r0 2217a: 0f b6 in r0, 0x3f ; 63 2217c: 0f 92 push r0 2217e: 11 24 eor r1, r1 22180: 2f 93 push r18 22182: 3f 93 push r19 22184: 8f 93 push r24 22186: 9f 93 push r25 22188: af 93 push r26 2218a: bf 93 push r27 // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer2_millis; 2218c: 80 91 f8 05 lds r24, 0x05F8 ; 0x8005f8 22190: 90 91 f9 05 lds r25, 0x05F9 ; 0x8005f9 22194: a0 91 fa 05 lds r26, 0x05FA ; 0x8005fa 22198: b0 91 fb 05 lds r27, 0x05FB ; 0x8005fb unsigned char f = timer2_fract; 2219c: 30 91 f7 05 lds r19, 0x05F7 ; 0x8005f7 m += MILLIS_INC; f += FRACT_INC; 221a0: 23 e0 ldi r18, 0x03 ; 3 221a2: 23 0f add r18, r19 if (f >= FRACT_MAX) 221a4: 2d 37 cpi r18, 0x7D ; 125 221a6: 58 f5 brcc .+86 ; 0x221fe <__vector_15+0x88> { // copy these to local variables so they can be stored in registers // (volatile variables must be read from memory on every access) unsigned long m = timer2_millis; unsigned char f = timer2_fract; m += MILLIS_INC; 221a8: 01 96 adiw r24, 0x01 ; 1 221aa: a1 1d adc r26, r1 221ac: b1 1d adc r27, r1 if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer2_fract = f; 221ae: 20 93 f7 05 sts 0x05F7, r18 ; 0x8005f7 timer2_millis = m; 221b2: 80 93 f8 05 sts 0x05F8, r24 ; 0x8005f8 221b6: 90 93 f9 05 sts 0x05F9, r25 ; 0x8005f9 221ba: a0 93 fa 05 sts 0x05FA, r26 ; 0x8005fa 221be: b0 93 fb 05 sts 0x05FB, r27 ; 0x8005fb timer2_overflow_count++; 221c2: 80 91 fc 05 lds r24, 0x05FC ; 0x8005fc 221c6: 90 91 fd 05 lds r25, 0x05FD ; 0x8005fd 221ca: a0 91 fe 05 lds r26, 0x05FE ; 0x8005fe 221ce: b0 91 ff 05 lds r27, 0x05FF ; 0x8005ff 221d2: 01 96 adiw r24, 0x01 ; 1 221d4: a1 1d adc r26, r1 221d6: b1 1d adc r27, r1 221d8: 80 93 fc 05 sts 0x05FC, r24 ; 0x8005fc 221dc: 90 93 fd 05 sts 0x05FD, r25 ; 0x8005fd 221e0: a0 93 fe 05 sts 0x05FE, r26 ; 0x8005fe 221e4: b0 93 ff 05 sts 0x05FF, r27 ; 0x8005ff } 221e8: bf 91 pop r27 221ea: af 91 pop r26 221ec: 9f 91 pop r25 221ee: 8f 91 pop r24 221f0: 3f 91 pop r19 221f2: 2f 91 pop r18 221f4: 0f 90 pop r0 221f6: 0f be out 0x3f, r0 ; 63 221f8: 0f 90 pop r0 221fa: 1f 90 pop r1 221fc: 18 95 reti unsigned char f = timer2_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; 221fe: 26 e8 ldi r18, 0x86 ; 134 22200: 23 0f add r18, r19 m += 1; 22202: 02 96 adiw r24, 0x02 ; 2 22204: a1 1d adc r26, r1 22206: b1 1d adc r27, r1 22208: d2 cf rjmp .-92 ; 0x221ae <__vector_15+0x38> 0002220a : } ENABLE_TEMP_MGR_INTERRUPT(); } void disable_heater() { 2220a: cf 93 push r28 }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 2220c: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 22210: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 22214: 10 92 5a 12 sts 0x125A, r1 ; 0x80125a 22218: 10 92 59 12 sts 0x1259, r1 ; 0x801259 setTargetHotend(0); setTargetBed(0); ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 2221c: cf b7 in r28, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 2221e: f8 94 cli // propagate all values down the chain setIsrTargetTemperatures(); 22220: 0f 94 45 02 call 0x2048a ; 0x2048a temp_mgr_pid(); 22224: 0e 94 82 ff call 0x1ff04 ; 0x1ff04 // we can't call soft_pwm_core directly to toggle the pins as it would require removing the inline // attribute, so disable each pin individually #if defined(HEATER_0_PIN) && HEATER_0_PIN > -1 && EXTRUDERS > 0 WRITE(HEATER_0_PIN,LOW); 22228: 75 98 cbi 0x0e, 5 ; 14 #endif #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 // TODO: this doesn't take immediate effect! bedPWMDisabled = 0; 2222a: 10 92 28 06 sts 0x0628, r1 ; 0x800628 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2222e: cf bf out 0x3f, r28 ; 63 #endif } } 22230: cf 91 pop r28 22232: 08 95 ret 00022234 : /* Menu implementation */ static void lcd_cooldown() { disable_heater(); 22234: 0f 94 05 11 call 0x2220a ; 0x2220a fanSpeed = 0; 22238: 10 92 55 12 sts 0x1255, r1 ; 0x801255 lcd_return_to_status(); 2223c: 0d 94 d5 07 jmp 0x20faa ; 0x20faa 00022240 : // set the error type from within the temp_mgr isr to be handled in manager_heater // - immediately disable all heaters and turn on all fans at full speed // - prevent the user to set temperatures until all errors are cleared void set_temp_error(TempErrorSource source, uint8_t index, TempErrorType type) { 22240: 1f 93 push r17 22242: cf 93 push r28 22244: df 93 push r29 22246: c8 2f mov r28, r24 22248: 16 2f mov r17, r22 2224a: d4 2f mov r29, r20 // save the original target temperatures for recovery before disabling heaters if(!temp_error_state.error && !saved_printing) { 2224c: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 22250: 80 fd sbrc r24, 0 22252: 18 c0 rjmp .+48 ; 0x22284 22254: 80 91 73 12 lds r24, 0x1273 ; 0x801273 22258: 81 11 cpse r24, r1 2225a: 14 c0 rjmp .+40 ; 0x22284 saved_bed_temperature = target_temperature_bed; 2225c: 80 91 59 12 lds r24, 0x1259 ; 0x801259 22260: 80 93 58 12 sts 0x1258, r24 ; 0x801258 saved_extruder_temperature = target_temperature[index]; 22264: e6 2f mov r30, r22 22266: f0 e0 ldi r31, 0x00 ; 0 22268: ee 0f add r30, r30 2226a: ff 1f adc r31, r31 2226c: e3 5a subi r30, 0xA3 ; 163 2226e: fd 4e sbci r31, 0xED ; 237 22270: 80 81 ld r24, Z 22272: 91 81 ldd r25, Z+1 ; 0x01 22274: 90 93 5c 12 sts 0x125C, r25 ; 0x80125c 22278: 80 93 5b 12 sts 0x125B, r24 ; 0x80125b saved_fan_speed = fanSpeed; 2227c: 80 91 55 12 lds r24, 0x1255 ; 0x801255 22280: 80 93 54 12 sts 0x1254, r24 ; 0x801254 } // keep disabling heaters and keep fans on as long as the condition is asserted disable_heater(); 22284: 0f 94 05 11 call 0x2220a ; 0x2220a void hotendFanSetFullSpeed() { #ifdef EXTRUDER_ALTFAN_DETECT altfanStatus.altfanOverride = 1; //full speed #endif //EXTRUDER_ALTFAN_DETECT resetFanCheck(); 22288: 0e 94 a2 77 call 0xef44 ; 0xef44 setExtruderAutoFanState(3); 2228c: 83 e0 ldi r24, 0x03 ; 3 2228e: 0e 94 af 77 call 0xef5e ; 0xef5e SET_OUTPUT(FAN_PIN); 22292: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 22296: 88 60 ori r24, 0x08 ; 8 22298: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = 255; 2229c: 8f ef ldi r24, 0xFF ; 255 2229e: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d #else //FAN_SOFT_PWM analogWrite(FAN_PIN, 255); #endif //FAN_SOFT_PWM fanSpeed = 255; 222a2: 80 93 55 12 sts 0x1255, r24 ; 0x801255 hotendFanSetFullSpeed(); // set the initial error source to the highest priority error if(!temp_error_state.error || (uint8_t)type < temp_error_state.type) { 222a6: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222aa: 80 ff sbrs r24, 0 222ac: 07 c0 rjmp .+14 ; 0x222bc 222ae: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222b2: 82 95 swap r24 222b4: 86 95 lsr r24 222b6: 87 70 andi r24, 0x07 ; 7 222b8: d8 17 cp r29, r24 222ba: c0 f4 brcc .+48 ; 0x222ec temp_error_state.source = (uint8_t)source; 222bc: c3 70 andi r28, 0x03 ; 3 222be: cc 0f add r28, r28 222c0: cc 0f add r28, r28 222c2: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222c6: 83 7f andi r24, 0xF3 ; 243 222c8: 8c 2b or r24, r28 222ca: 80 93 cc 03 sts 0x03CC, r24 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> temp_error_state.index = index; 222ce: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222d2: 10 fb bst r17, 0 222d4: 84 f9 bld r24, 4 222d6: 80 93 cc 03 sts 0x03CC, r24 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> temp_error_state.type = (uint8_t)type; 222da: d2 95 swap r29 222dc: dd 0f add r29, r29 222de: d0 7e andi r29, 0xE0 ; 224 222e0: 40 91 cc 03 lds r20, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222e4: 4f 71 andi r20, 0x1F ; 31 222e6: 4d 2b or r20, r29 222e8: 40 93 cc 03 sts 0x03CC, r20 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> } // always set the error state temp_error_state.error = true; 222ec: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222f0: 81 60 ori r24, 0x01 ; 1 222f2: 80 93 cc 03 sts 0x03CC, r24 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> temp_error_state.assert = true; 222f6: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 222fa: 82 60 ori r24, 0x02 ; 2 222fc: 80 93 cc 03 sts 0x03CC, r24 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> } 22300: df 91 pop r29 22302: cf 91 pop r28 22304: 1f 91 pop r17 22306: 08 95 ret 00022308 : timer4_init(); //for tone and Hotend fan PWM } #if (defined (TEMP_RUNAWAY_BED_HYSTERESIS) && TEMP_RUNAWAY_BED_TIMEOUT > 0) || (defined (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS) && TEMP_RUNAWAY_EXTRUDER_TIMEOUT > 0) static void temp_runaway_check(uint8_t _heater_id, float _target_temperature, float _current_temperature, float _output, bool _isbed) { 22308: 2f 92 push r2 2230a: 3f 92 push r3 2230c: 4f 92 push r4 2230e: 5f 92 push r5 22310: 6f 92 push r6 22312: 7f 92 push r7 22314: 8f 92 push r8 22316: 9f 92 push r9 22318: af 92 push r10 2231a: bf 92 push r11 2231c: cf 92 push r12 2231e: df 92 push r13 22320: ef 92 push r14 22322: ff 92 push r15 22324: 0f 93 push r16 22326: 1f 93 push r17 22328: cf 93 push r28 2232a: df 93 push r29 2232c: cd b7 in r28, 0x3d ; 61 2232e: de b7 in r29, 0x3e ; 62 22330: 2c 97 sbiw r28, 0x0c ; 12 22332: 0f b6 in r0, 0x3f ; 63 22334: f8 94 cli 22336: de bf out 0x3e, r29 ; 62 22338: 0f be out 0x3f, r0 ; 63 2233a: cd bf out 0x3d, r28 ; 61 2233c: 28 2e mov r2, r24 2233e: 49 83 std Y+1, r20 ; 0x01 22340: 5a 83 std Y+2, r21 ; 0x02 22342: 6b 83 std Y+3, r22 ; 0x03 22344: 7c 83 std Y+4, r23 ; 0x04 22346: 28 01 movw r4, r16 22348: 39 01 movw r6, r18 2234a: 3a 2c mov r3, r10 bool temp_runaway_check_active = false; static float __preheat_start[2] = { 0,0}; //currently just bed and one extruder static uint8_t __preheat_counter[2] = { 0,0}; static uint8_t __preheat_errors[2] = { 0,0}; if (_millis() - temp_runaway_timer[_heater_id] > 2000) 2234c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 22350: 02 2d mov r16, r2 22352: 10 e0 ldi r17, 0x00 ; 0 22354: 98 01 movw r18, r16 22356: 22 0f add r18, r18 22358: 33 1f adc r19, r19 2235a: 22 0f add r18, r18 2235c: 33 1f adc r19, r19 2235e: 3c 87 std Y+12, r19 ; 0x0c 22360: 2b 87 std Y+11, r18 ; 0x0b 22362: f9 01 movw r30, r18 22364: e4 56 subi r30, 0x64 ; 100 22366: fa 4f sbci r31, 0xFA ; 250 22368: 80 80 ld r8, Z 2236a: 91 80 ldd r9, Z+1 ; 0x01 2236c: a2 80 ldd r10, Z+2 ; 0x02 2236e: b3 80 ldd r11, Z+3 ; 0x03 22370: 68 19 sub r22, r8 22372: 79 09 sbc r23, r9 22374: 8a 09 sbc r24, r10 22376: 9b 09 sbc r25, r11 22378: 61 3d cpi r22, 0xD1 ; 209 2237a: 77 40 sbci r23, 0x07 ; 7 2237c: 81 05 cpc r24, r1 2237e: 91 05 cpc r25, r1 22380: 08 f4 brcc .+2 ; 0x22384 22382: ea c0 rjmp .+468 ; 0x22558 { #ifdef TEMP_RUNAWAY_BED_TIMEOUT if (_isbed) 22384: 33 20 and r3, r3 22386: 09 f4 brne .+2 ; 0x2238a 22388: 75 c0 rjmp .+234 ; 0x22474 { __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS; __timeout = TEMP_RUNAWAY_BED_TIMEOUT; 2238a: 88 e6 ldi r24, 0x68 ; 104 2238c: 91 e0 ldi r25, 0x01 ; 1 2238e: 9a 87 std Y+10, r25 ; 0x0a 22390: 89 87 std Y+9, r24 ; 0x09 { #ifdef TEMP_RUNAWAY_BED_TIMEOUT if (_isbed) { __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS; 22392: 80 e0 ldi r24, 0x00 ; 0 22394: 90 e0 ldi r25, 0x00 ; 0 22396: a0 ea ldi r26, 0xA0 ; 160 22398: b0 e4 ldi r27, 0x40 ; 64 } #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; 2239a: 8d 83 std Y+5, r24 ; 0x05 2239c: 9e 83 std Y+6, r25 ; 0x06 2239e: af 83 std Y+7, r26 ; 0x07 223a0: b8 87 std Y+8, r27 ; 0x08 __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT; } #endif temp_runaway_timer[_heater_id] = _millis(); 223a2: 0f 94 f0 0d call 0x21be0 ; 0x21be0 223a6: eb 85 ldd r30, Y+11 ; 0x0b 223a8: fc 85 ldd r31, Y+12 ; 0x0c 223aa: e4 56 subi r30, 0x64 ; 100 223ac: fa 4f sbci r31, 0xFA ; 250 223ae: 60 83 st Z, r22 223b0: 71 83 std Z+1, r23 ; 0x01 223b2: 82 83 std Z+2, r24 ; 0x02 223b4: 93 83 std Z+3, r25 ; 0x03 if (_output == 0) 223b6: 20 e0 ldi r18, 0x00 ; 0 223b8: 30 e0 ldi r19, 0x00 ; 0 223ba: a9 01 movw r20, r18 223bc: c7 01 movw r24, r14 223be: b6 01 movw r22, r12 223c0: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 223c4: 81 11 cpse r24, r1 223c6: 07 c0 rjmp .+14 ; 0x223d6 { temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 223c8: f8 01 movw r30, r16 223ca: ee 0f add r30, r30 223cc: ff 1f adc r31, r31 223ce: e8 56 subi r30, 0x68 ; 104 223d0: fa 4f sbci r31, 0xFA ; 250 223d2: 11 82 std Z+1, r1 ; 0x01 223d4: 10 82 st Z, r1 } if (temp_runaway_target[_heater_id] != _target_temperature) 223d6: ab 85 ldd r26, Y+11 ; 0x0b 223d8: bc 85 ldd r27, Y+12 ; 0x0c 223da: a0 57 subi r26, 0x70 ; 112 223dc: ba 4f sbci r27, 0xFA ; 250 223de: 5d 01 movw r10, r26 223e0: 29 81 ldd r18, Y+1 ; 0x01 223e2: 3a 81 ldd r19, Y+2 ; 0x02 223e4: 4b 81 ldd r20, Y+3 ; 0x03 223e6: 5c 81 ldd r21, Y+4 ; 0x04 223e8: 6d 91 ld r22, X+ 223ea: 7d 91 ld r23, X+ 223ec: 8d 91 ld r24, X+ 223ee: 9c 91 ld r25, X 223f0: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 223f4: 88 23 and r24, r24 223f6: 09 f4 brne .+2 ; 0x223fa 223f8: 91 c0 rjmp .+290 ; 0x2251c { if (_target_temperature > 0) 223fa: 20 e0 ldi r18, 0x00 ; 0 223fc: 30 e0 ldi r19, 0x00 ; 0 223fe: a9 01 movw r20, r18 22400: 69 81 ldd r22, Y+1 ; 0x01 22402: 7a 81 ldd r23, Y+2 ; 0x02 22404: 8b 81 ldd r24, Y+3 ; 0x03 22406: 9c 81 ldd r25, Y+4 ; 0x04 22408: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2240c: f8 01 movw r30, r16 2240e: e2 57 subi r30, 0x72 ; 114 22410: fa 4f sbci r31, 0xFA ; 250 22412: 18 16 cp r1, r24 22414: c4 f5 brge .+112 ; 0x22486 { temp_runaway_status[_heater_id] = TempRunaway_PREHEAT; 22416: 81 e0 ldi r24, 0x01 ; 1 22418: 80 83 st Z, r24 temp_runaway_target[_heater_id] = _target_temperature; 2241a: 89 81 ldd r24, Y+1 ; 0x01 2241c: 9a 81 ldd r25, Y+2 ; 0x02 2241e: ab 81 ldd r26, Y+3 ; 0x03 22420: bc 81 ldd r27, Y+4 ; 0x04 22422: f5 01 movw r30, r10 22424: 80 83 st Z, r24 22426: 91 83 std Z+1, r25 ; 0x01 22428: a2 83 std Z+2, r26 ; 0x02 2242a: b3 83 std Z+3, r27 ; 0x03 __preheat_start[_heater_id] = _current_temperature; 2242c: eb 85 ldd r30, Y+11 ; 0x0b 2242e: fc 85 ldd r31, Y+12 ; 0x0c 22430: ea 57 subi r30, 0x7A ; 122 22432: fa 4f sbci r31, 0xFA ; 250 22434: 40 82 st Z, r4 22436: 51 82 std Z+1, r5 ; 0x01 22438: 62 82 std Z+2, r6 ; 0x02 2243a: 73 82 std Z+3, r7 ; 0x03 __preheat_counter[_heater_id] = 0; 2243c: f8 01 movw r30, r16 2243e: ec 57 subi r30, 0x7C ; 124 22440: fa 4f sbci r31, 0xFA ; 250 22442: 10 82 st Z, r1 temp_runaway_status[_heater_id] = TempRunaway_INACTIVE; temp_runaway_target[_heater_id] = _target_temperature; } } if ((_current_temperature < _target_temperature) && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)) 22444: a3 01 movw r20, r6 22446: 92 01 movw r18, r4 22448: bc 01 movw r22, r24 2244a: cd 01 movw r24, r26 2244c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22450: 18 16 cp r1, r24 22452: 1c f5 brge .+70 ; 0x2249a { __preheat_counter[_heater_id]++; 22454: f8 01 movw r30, r16 22456: ec 57 subi r30, 0x7C ; 124 22458: fa 4f sbci r31, 0xFA ; 250 2245a: 80 81 ld r24, Z 2245c: 8f 5f subi r24, 0xFF ; 255 2245e: 80 83 st Z, r24 if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes 22460: 31 10 cpse r3, r1 22462: c7 c0 rjmp .+398 ; 0x225f2 22464: 89 30 cpi r24, 0x09 ; 9 22466: c8 f0 brcs .+50 ; 0x2249a { __delta=2.0; 22468: 81 2c mov r8, r1 2246a: 91 2c mov r9, r1 2246c: a1 2c mov r10, r1 2246e: 50 e4 ldi r21, 0x40 ; 64 22470: b5 2e mov r11, r21 22472: e8 c0 rjmp .+464 ; 0x22644 #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT; 22474: ad e2 ldi r26, 0x2D ; 45 22476: b0 e0 ldi r27, 0x00 ; 0 22478: ba 87 std Y+10, r27 ; 0x0a 2247a: a9 87 std Y+9, r26 ; 0x09 } #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; 2247c: 80 e0 ldi r24, 0x00 ; 0 2247e: 90 e0 ldi r25, 0x00 ; 0 22480: a0 e7 ldi r26, 0x70 ; 112 22482: b1 e4 ldi r27, 0x41 ; 65 22484: 8a cf rjmp .-236 ; 0x2239a __preheat_start[_heater_id] = _current_temperature; __preheat_counter[_heater_id] = 0; } else { temp_runaway_status[_heater_id] = TempRunaway_INACTIVE; 22486: 10 82 st Z, r1 temp_runaway_target[_heater_id] = _target_temperature; 22488: 89 81 ldd r24, Y+1 ; 0x01 2248a: 9a 81 ldd r25, Y+2 ; 0x02 2248c: ab 81 ldd r26, Y+3 ; 0x03 2248e: bc 81 ldd r27, Y+4 ; 0x04 22490: f5 01 movw r30, r10 22492: 80 83 st Z, r24 22494: 91 83 std Z+1, r25 ; 0x01 22496: a2 83 std Z+2, r26 ; 0x02 22498: b3 83 std Z+3, r27 ; 0x03 __preheat_start[_heater_id] = _current_temperature; __preheat_counter[_heater_id] = 0; } } if ((_current_temperature > (_target_temperature - __hysteresis)) && temp_runaway_status[_heater_id] == TempRunaway_PREHEAT) 2249a: 2d 81 ldd r18, Y+5 ; 0x05 2249c: 3e 81 ldd r19, Y+6 ; 0x06 2249e: 4f 81 ldd r20, Y+7 ; 0x07 224a0: 58 85 ldd r21, Y+8 ; 0x08 224a2: 69 81 ldd r22, Y+1 ; 0x01 224a4: 7a 81 ldd r23, Y+2 ; 0x02 224a6: 8b 81 ldd r24, Y+3 ; 0x03 224a8: 9c 81 ldd r25, Y+4 ; 0x04 224aa: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 224ae: a3 01 movw r20, r6 224b0: 92 01 movw r18, r4 224b2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 224b6: 87 ff sbrs r24, 7 224b8: 46 c0 rjmp .+140 ; 0x22546 224ba: f8 01 movw r30, r16 224bc: e2 57 subi r30, 0x72 ; 114 224be: fa 4f sbci r31, 0xFA ; 250 224c0: 80 81 ld r24, Z 224c2: 81 30 cpi r24, 0x01 ; 1 224c4: 49 f4 brne .+18 ; 0x224d8 { temp_runaway_status[_heater_id] = TempRunaway_ACTIVE; 224c6: 82 e0 ldi r24, 0x02 ; 2 224c8: 80 83 st Z, r24 temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 224ca: f8 01 movw r30, r16 224cc: ee 0f add r30, r30 224ce: ff 1f adc r31, r31 224d0: e8 56 subi r30, 0x68 ; 104 224d2: fa 4f sbci r31, 0xFA ; 250 224d4: 11 82 std Z+1, r1 ; 0x01 224d6: 10 82 st Z, r1 } if (_output > 0) 224d8: 20 e0 ldi r18, 0x00 ; 0 224da: 30 e0 ldi r19, 0x00 ; 0 224dc: a9 01 movw r20, r18 224de: c7 01 movw r24, r14 224e0: b6 01 movw r22, r12 224e2: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 224e6: 18 16 cp r1, r24 224e8: bc f5 brge .+110 ; 0x22558 if (temp_runaway_check_active) { // we are in range if ((_current_temperature > (_target_temperature - __hysteresis)) && (_current_temperature < (_target_temperature + __hysteresis))) 224ea: 29 81 ldd r18, Y+1 ; 0x01 224ec: 3a 81 ldd r19, Y+2 ; 0x02 224ee: 4b 81 ldd r20, Y+3 ; 0x03 224f0: 5c 81 ldd r21, Y+4 ; 0x04 224f2: 6d 81 ldd r22, Y+5 ; 0x05 224f4: 7e 81 ldd r23, Y+6 ; 0x06 224f6: 8f 81 ldd r24, Y+7 ; 0x07 224f8: 98 85 ldd r25, Y+8 ; 0x08 224fa: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 224fe: a3 01 movw r20, r6 22500: 92 01 movw r18, r4 22502: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22506: 18 16 cp r1, r24 22508: 0c f0 brlt .+2 ; 0x2250c 2250a: 3f c0 rjmp .+126 ; 0x2258a { temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 2250c: 00 0f add r16, r16 2250e: 11 1f adc r17, r17 22510: f8 01 movw r30, r16 22512: e8 56 subi r30, 0x68 ; 104 22514: fa 4f sbci r31, 0xFA ; 250 22516: 11 82 std Z+1, r1 ; 0x01 22518: 10 82 st Z, r1 2251a: 1e c0 rjmp .+60 ; 0x22558 temp_runaway_status[_heater_id] = TempRunaway_INACTIVE; temp_runaway_target[_heater_id] = _target_temperature; } } if ((_current_temperature < _target_temperature) && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)) 2251c: a3 01 movw r20, r6 2251e: 92 01 movw r18, r4 22520: 69 81 ldd r22, Y+1 ; 0x01 22522: 7a 81 ldd r23, Y+2 ; 0x02 22524: 8b 81 ldd r24, Y+3 ; 0x03 22526: 9c 81 ldd r25, Y+4 ; 0x04 22528: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2252c: 18 16 cp r1, r24 2252e: 0c f0 brlt .+2 ; 0x22532 22530: b4 cf rjmp .-152 ; 0x2249a 22532: f8 01 movw r30, r16 22534: e2 57 subi r30, 0x72 ; 114 22536: fa 4f sbci r31, 0xFA ; 250 22538: 80 81 ld r24, Z 2253a: 81 30 cpi r24, 0x01 ; 1 2253c: 09 f0 breq .+2 ; 0x22540 2253e: ad cf rjmp .-166 ; 0x2249a 22540: 89 cf rjmp .-238 ; 0x22454 if(_current_temperature>105.0) __delta=0.6; } if (_current_temperature - __preheat_start[_heater_id] < __delta) { __preheat_errors[_heater_id]++; } else { __preheat_errors[_heater_id] = 0; 22542: 10 82 st Z, r1 22544: 97 c0 rjmp .+302 ; 0x22674 temp_runaway_status[_heater_id] = TempRunaway_ACTIVE; temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; } if (_output > 0) 22546: 20 e0 ldi r18, 0x00 ; 0 22548: 30 e0 ldi r19, 0x00 ; 0 2254a: a9 01 movw r20, r18 2254c: c7 01 movw r24, r14 2254e: b6 01 movw r22, r12 22550: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22554: 18 16 cp r1, r24 22556: cc f0 brlt .+50 ; 0x2258a } } } } } 22558: 2c 96 adiw r28, 0x0c ; 12 2255a: 0f b6 in r0, 0x3f ; 63 2255c: f8 94 cli 2255e: de bf out 0x3e, r29 ; 62 22560: 0f be out 0x3f, r0 ; 63 22562: cd bf out 0x3d, r28 ; 61 22564: df 91 pop r29 22566: cf 91 pop r28 22568: 1f 91 pop r17 2256a: 0f 91 pop r16 2256c: ff 90 pop r15 2256e: ef 90 pop r14 22570: df 90 pop r13 22572: cf 90 pop r12 22574: bf 90 pop r11 22576: af 90 pop r10 22578: 9f 90 pop r9 2257a: 8f 90 pop r8 2257c: 7f 90 pop r7 2257e: 6f 90 pop r6 22580: 5f 90 pop r5 22582: 4f 90 pop r4 22584: 3f 90 pop r3 22586: 2f 90 pop r2 22588: 08 95 ret temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; } else { if (temp_runaway_status[_heater_id] > TempRunaway_PREHEAT) 2258a: f8 01 movw r30, r16 2258c: e2 57 subi r30, 0x72 ; 114 2258e: fa 4f sbci r31, 0xFA ; 250 22590: 80 81 ld r24, Z 22592: 82 30 cpi r24, 0x02 ; 2 22594: 08 f3 brcs .-62 ; 0x22558 { temp_runaway_error_counter[_heater_id]++; 22596: 00 0f add r16, r16 22598: 11 1f adc r17, r17 2259a: f8 01 movw r30, r16 2259c: e8 56 subi r30, 0x68 ; 104 2259e: fa 4f sbci r31, 0xFA ; 250 225a0: 80 81 ld r24, Z 225a2: 91 81 ldd r25, Z+1 ; 0x01 225a4: 01 96 adiw r24, 0x01 ; 1 225a6: 91 83 std Z+1, r25 ; 0x01 225a8: 80 83 st Z, r24 if (temp_runaway_error_counter[_heater_id] * 2 > __timeout) 225aa: 88 0f add r24, r24 225ac: 99 1f adc r25, r25 225ae: e9 85 ldd r30, Y+9 ; 0x09 225b0: fa 85 ldd r31, Y+10 ; 0x0a 225b2: e8 17 cp r30, r24 225b4: f9 07 cpc r31, r25 225b6: 80 f6 brcc .-96 ; 0x22558 set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::runaway); 225b8: 43 e0 ldi r20, 0x03 ; 3 225ba: 62 2d mov r22, r2 225bc: 83 2d mov r24, r3 } } } } } 225be: 2c 96 adiw r28, 0x0c ; 12 225c0: 0f b6 in r0, 0x3f ; 63 225c2: f8 94 cli 225c4: de bf out 0x3e, r29 ; 62 225c6: 0f be out 0x3f, r0 ; 63 225c8: cd bf out 0x3d, r28 ; 61 225ca: df 91 pop r29 225cc: cf 91 pop r28 225ce: 1f 91 pop r17 225d0: 0f 91 pop r16 225d2: ff 90 pop r15 225d4: ef 90 pop r14 225d6: df 90 pop r13 225d8: cf 90 pop r12 225da: bf 90 pop r11 225dc: af 90 pop r10 225de: 9f 90 pop r9 225e0: 8f 90 pop r8 225e2: 7f 90 pop r7 225e4: 6f 90 pop r6 225e6: 5f 90 pop r5 225e8: 4f 90 pop r4 225ea: 3f 90 pop r3 225ec: 2f 90 pop r2 { if (temp_runaway_status[_heater_id] > TempRunaway_PREHEAT) { temp_runaway_error_counter[_heater_id]++; if (temp_runaway_error_counter[_heater_id] * 2 > __timeout) set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::runaway); 225ee: 0d 94 20 11 jmp 0x22240 ; 0x22240 } if ((_current_temperature < _target_temperature) && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)) { __preheat_counter[_heater_id]++; if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes 225f2: 81 31 cpi r24, 0x11 ; 17 225f4: 08 f4 brcc .+2 ; 0x225f8 225f6: 51 cf rjmp .-350 ; 0x2249a { __delta=2.0; if(_isbed) { __delta=3.0; if(_current_temperature>90.0) __delta=2.0; 225f8: 20 e0 ldi r18, 0x00 ; 0 225fa: 30 e0 ldi r19, 0x00 ; 0 225fc: 44 eb ldi r20, 0xB4 ; 180 225fe: 52 e4 ldi r21, 0x42 ; 66 22600: c3 01 movw r24, r6 22602: b2 01 movw r22, r4 22604: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes { __delta=2.0; if(_isbed) { __delta=3.0; 22608: 81 2c mov r8, r1 2260a: 91 2c mov r9, r1 2260c: e0 e4 ldi r30, 0x40 ; 64 2260e: ae 2e mov r10, r30 22610: ba 2c mov r11, r10 if(_current_temperature>90.0) __delta=2.0; 22612: 18 16 cp r1, r24 22614: 2c f4 brge .+10 ; 0x22620 22616: 81 2c mov r8, r1 22618: 91 2c mov r9, r1 2261a: a1 2c mov r10, r1 2261c: 70 e4 ldi r23, 0x40 ; 64 2261e: b7 2e mov r11, r23 if(_current_temperature>105.0) __delta=0.6; 22620: 20 e0 ldi r18, 0x00 ; 0 22622: 30 e0 ldi r19, 0x00 ; 0 22624: 42 ed ldi r20, 0xD2 ; 210 22626: 52 e4 ldi r21, 0x42 ; 66 22628: c3 01 movw r24, r6 2262a: b2 01 movw r22, r4 2262c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22630: 18 16 cp r1, r24 22632: 44 f4 brge .+16 ; 0x22644 22634: 6a e9 ldi r22, 0x9A ; 154 22636: 86 2e mov r8, r22 22638: 69 e9 ldi r22, 0x99 ; 153 2263a: 96 2e mov r9, r22 2263c: 69 e1 ldi r22, 0x19 ; 25 2263e: a6 2e mov r10, r22 22640: 6f e3 ldi r22, 0x3F ; 63 22642: b6 2e mov r11, r22 } if (_current_temperature - __preheat_start[_heater_id] < __delta) { 22644: eb 85 ldd r30, Y+11 ; 0x0b 22646: fc 85 ldd r31, Y+12 ; 0x0c 22648: ea 57 subi r30, 0x7A ; 122 2264a: fa 4f sbci r31, 0xFA ; 250 2264c: 20 81 ld r18, Z 2264e: 31 81 ldd r19, Z+1 ; 0x01 22650: 42 81 ldd r20, Z+2 ; 0x02 22652: 53 81 ldd r21, Z+3 ; 0x03 22654: c3 01 movw r24, r6 22656: b2 01 movw r22, r4 22658: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2265c: a5 01 movw r20, r10 2265e: 94 01 movw r18, r8 22660: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 22664: f8 01 movw r30, r16 22666: ee 57 subi r30, 0x7E ; 126 22668: fa 4f sbci r31, 0xFA ; 250 2266a: 87 ff sbrs r24, 7 2266c: 6a cf rjmp .-300 ; 0x22542 __preheat_errors[_heater_id]++; 2266e: 80 81 ld r24, Z 22670: 8f 5f subi r24, 0xFF ; 255 22672: 80 83 st Z, r24 } else { __preheat_errors[_heater_id] = 0; } if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5)) 22674: 80 81 ld r24, Z 22676: 90 e0 ldi r25, 0x00 ; 0 22678: 31 10 cpse r3, r1 2267a: 04 c0 rjmp .+8 ; 0x22684 2267c: 06 97 sbiw r24, 0x06 ; 6 2267e: 4c f0 brlt .+18 ; 0x22692 set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat); 22680: 80 e0 ldi r24, 0x00 ; 0 22682: 03 c0 rjmp .+6 ; 0x2268a __preheat_errors[_heater_id]++; } else { __preheat_errors[_heater_id] = 0; } if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5)) 22684: 04 97 sbiw r24, 0x04 ; 4 22686: 2c f0 brlt .+10 ; 0x22692 set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat); 22688: 81 e0 ldi r24, 0x01 ; 1 2268a: 42 e0 ldi r20, 0x02 ; 2 2268c: 62 2d mov r22, r2 2268e: 0f 94 20 11 call 0x22240 ; 0x22240 __preheat_start[_heater_id] = _current_temperature; 22692: 2b 85 ldd r18, Y+11 ; 0x0b 22694: 3c 85 ldd r19, Y+12 ; 0x0c 22696: 2a 57 subi r18, 0x7A ; 122 22698: 3a 4f sbci r19, 0xFA ; 250 2269a: d9 01 movw r26, r18 2269c: 4d 92 st X+, r4 2269e: 5d 92 st X+, r5 226a0: 6d 92 st X+, r6 226a2: 7c 92 st X, r7 226a4: 13 97 sbiw r26, 0x03 ; 3 __preheat_counter[_heater_id] = 0; 226a6: f8 01 movw r30, r16 226a8: ec 57 subi r30, 0x7C ; 124 226aa: fa 4f sbci r31, 0xFA ; 250 226ac: 10 82 st Z, r1 226ae: f5 ce rjmp .-534 ; 0x2249a 000226b0 : //! @retval true firmware should do temperature compensation and allow calibration //! @retval false PINDA thermistor is not detected, disable temperature compensation and calibration //! @retval true/false when forced via LCD menu Settings->HW Setup->SuperPINDA //! bool has_temperature_compensation() { 226b0: cf 93 push r28 #ifdef SUPERPINDA_SUPPORT #ifdef PINDA_TEMP_COMP uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION); 226b2: 89 e2 ldi r24, 0x29 ; 41 226b4: 9d e0 ldi r25, 0x0D ; 13 226b6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) //Unkown PINDA temp compenstation, so check it. { #endif //PINDA_TEMP_COMP return (current_temperature_pinda >= PINDA_MINTEMP) ? true : false; 226ba: c1 e0 ldi r28, 0x01 ; 1 bool has_temperature_compensation() { #ifdef SUPERPINDA_SUPPORT #ifdef PINDA_TEMP_COMP uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION); if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) //Unkown PINDA temp compenstation, so check it. 226bc: 8f 3f cpi r24, 0xFF ; 255 226be: 91 f4 brne .+36 ; 0x226e4 { #endif //PINDA_TEMP_COMP return (current_temperature_pinda >= PINDA_MINTEMP) ? true : false; 226c0: 20 e0 ldi r18, 0x00 ; 0 226c2: 30 e0 ldi r19, 0x00 ; 0 226c4: 40 ef ldi r20, 0xF0 ; 240 226c6: 51 e4 ldi r21, 0x41 ; 65 226c8: 60 91 85 03 lds r22, 0x0385 ; 0x800385 226cc: 70 91 86 03 lds r23, 0x0386 ; 0x800386 226d0: 80 91 87 03 lds r24, 0x0387 ; 0x800387 226d4: 90 91 88 03 lds r25, 0x0388 ; 0x800388 226d8: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 226dc: 87 ff sbrs r24, 7 226de: 04 c0 rjmp .+8 ; 0x226e8 #ifdef PINDA_TEMP_COMP } else if (pinda_temp_compensation == 0) return true; //Overwritten via LCD menu SuperPINDA [No] 226e0: c0 e0 ldi r28, 0x00 ; 0 226e2: 02 c0 rjmp .+4 ; 0x226e8 226e4: 81 11 cpse r24, r1 226e6: fc cf rjmp .-8 ; 0x226e0 else return false; //Overwritten via LCD menu SuperPINDA [YES] #endif //PINDA_TEMP_COMP #else return true; #endif } 226e8: 8c 2f mov r24, r28 226ea: cf 91 pop r28 226ec: 08 95 ret 000226ee <__vector_14>: #ifdef SYSTEM_TIMER_2 ISR(TIMER2_COMPB_vect) #else //SYSTEM_TIMER_2 ISR(TIMER0_COMPB_vect) #endif //SYSTEM_TIMER_2 { 226ee: 1f 92 push r1 226f0: 0f 92 push r0 226f2: 0f b6 in r0, 0x3f ; 63 226f4: 0f 92 push r0 226f6: 11 24 eor r1, r1 226f8: 0b b6 in r0, 0x3b ; 59 226fa: 0f 92 push r0 226fc: ff 92 push r15 226fe: 0f 93 push r16 22700: 1f 93 push r17 22702: 2f 93 push r18 22704: 3f 93 push r19 22706: 4f 93 push r20 22708: 5f 93 push r21 2270a: 6f 93 push r22 2270c: 7f 93 push r23 2270e: 8f 93 push r24 22710: 9f 93 push r25 22712: af 93 push r26 22714: bf 93 push r27 22716: cf 93 push r28 22718: df 93 push r29 2271a: ef 93 push r30 2271c: ff 93 push r31 DISABLE_SOFT_PWM_INTERRUPT(); 2271e: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 22722: 8b 7f andi r24, 0xFB ; 251 22724: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> #if !defined(__DOXYGEN__) /* Internal helper functions. */ static __inline__ uint8_t __iSeiRetVal(void) { sei(); 22728: 78 94 sei // Only update flags, but do not perform any menu/lcd operation! void lcd_buttons_update(void) { static uint8_t lcd_long_press_active = 0; static uint8_t lcd_button_pressed = 0; if (READ(BTN_ENC) == 0) 2272a: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 2272e: 86 fd sbrc r24, 6 22730: c8 c0 rjmp .+400 ; 0x228c2 <__vector_14+0x1d4> { //button is pressed if (buttonBlanking.expired_cont(BUTTON_BLANKING_TIME)) { 22732: 68 ec ldi r22, 0xC8 ; 200 22734: 70 e0 ldi r23, 0x00 ; 0 22736: 82 eb ldi r24, 0xB2 ; 178 22738: 95 e0 ldi r25, 0x05 ; 5 2273a: 0f 94 47 0e call 0x21c8e ; 0x21c8e ::expired_cont(unsigned short)> 2273e: 88 23 and r24, r24 22740: b9 f0 breq .+46 ; 0x22770 <__vector_14+0x82> buttonBlanking.start(); 22742: 82 eb ldi r24, 0xB2 ; 178 22744: 95 e0 ldi r25, 0x05 ; 5 22746: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> safetyTimer.start(); 2274a: 8d ea ldi r24, 0xAD ; 173 2274c: 95 e0 ldi r25, 0x05 ; 5 2274e: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) 22752: 80 91 ac 05 lds r24, 0x05AC ; 0x8005ac 22756: 81 11 cpse r24, r1 22758: a5 c0 rjmp .+330 ; 0x228a4 <__vector_14+0x1b6> 2275a: 80 91 ab 05 lds r24, 0x05AB ; 0x8005ab 2275e: 81 11 cpse r24, r1 22760: a1 c0 rjmp .+322 ; 0x228a4 <__vector_14+0x1b6> { longPressTimer.start(); 22762: 88 ea ldi r24, 0xA8 ; 168 22764: 95 e0 ldi r25, 0x05 ; 5 22766: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> lcd_button_pressed = 1; 2276a: 81 e0 ldi r24, 0x01 ; 1 2276c: 80 93 ac 05 sts 0x05AC, r24 ; 0x8005ac -2, 1, -1, 0, }; static uint8_t enc_bits_old = 0; uint8_t enc_bits = 0; if (!READ(BTN_EN1)) enc_bits |= _BV(0); 22770: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 22774: 82 fb bst r24, 2 22776: 88 27 eor r24, r24 22778: 80 f9 bld r24, 0 2277a: 91 e0 ldi r25, 0x01 ; 1 2277c: 89 27 eor r24, r25 if (!READ(BTN_EN2)) enc_bits |= _BV(1); 2277e: 90 91 03 01 lds r25, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 22782: 91 ff sbrs r25, 1 22784: 82 60 ori r24, 0x02 ; 2 if (enc_bits != enc_bits_old) 22786: e0 91 a5 05 lds r30, 0x05A5 ; 0x8005a5 2278a: e8 17 cp r30, r24 2278c: e1 f0 breq .+56 ; 0x227c6 <__vector_14+0xd8> { int8_t newDiff = pgm_read_byte(&encrot_table[(enc_bits_old << 2) | enc_bits]); 2278e: 24 e0 ldi r18, 0x04 ; 4 22790: e2 9f mul r30, r18 22792: f0 01 movw r30, r0 22794: 11 24 eor r1, r1 22796: e8 2b or r30, r24 22798: ec 5c subi r30, 0xCC ; 204 2279a: f8 46 sbci r31, 0x68 ; 104 2279c: e4 91 lpm r30, Z lcd_encoder_diff += newDiff; 2279e: 90 91 a4 05 lds r25, 0x05A4 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> 227a2: e9 0f add r30, r25 227a4: e0 93 a4 05 sts 0x05A4, r30 ; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502> if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { 227a8: 0e 2e mov r0, r30 227aa: 00 0c add r0, r0 227ac: ff 0b sbc r31, r31 227ae: f7 ff sbrs r31, 7 227b0: 03 c0 rjmp .+6 ; 0x227b8 <__vector_14+0xca> 227b2: f1 95 neg r31 227b4: e1 95 neg r30 227b6: f1 09 sbc r31, r1 227b8: 34 97 sbiw r30, 0x04 ; 4 227ba: 1c f0 brlt .+6 ; 0x227c2 <__vector_14+0xd4> lcd_backlight_wake_trigger = true; // flag event, knob rotated 227bc: 91 e0 ldi r25, 0x01 ; 1 227be: 90 93 a6 05 sts 0x05A6, r25 ; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501> } enc_bits_old = enc_bits; 227c2: 80 93 a5 05 sts 0x05A5, r24 ; 0x8005a5 #ifndef SLOW_PWM_HEATERS /* * standard PWM modulation */ if (pwm_count == 0) 227c6: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 227ca: 81 11 cpse r24, r1 227cc: 08 c0 rjmp .+16 ; 0x227de <__vector_14+0xf0> { soft_pwm_0 = soft_pwm[0]; 227ce: 80 91 f5 05 lds r24, 0x05F5 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 227d2: 80 93 bb 05 sts 0x05BB, r24 ; 0x8005bb if(soft_pwm_0 > 0) 227d6: 88 23 and r24, r24 227d8: 09 f4 brne .+2 ; 0x227dc <__vector_14+0xee> 227da: 87 c0 rjmp .+270 ; 0x228ea <__vector_14+0x1fc> { WRITE(HEATER_0_PIN,1); 227dc: 75 9a sbi 0x0e, 5 ; 14 #endif } else WRITE(HEATER_0_PIN,0); } #ifdef FAN_SOFT_PWM if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0) 227de: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 227e2: 8f 70 andi r24, 0x0F ; 15 227e4: a9 f4 brne .+42 ; 0x22810 <__vector_14+0x122> { soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS)); 227e6: 80 91 1d 06 lds r24, 0x061D ; 0x80061d 227ea: 90 e0 ldi r25, 0x00 ; 0 227ec: 24 e0 ldi r18, 0x04 ; 4 227ee: 95 95 asr r25 227f0: 87 95 ror r24 227f2: 2a 95 dec r18 227f4: e1 f7 brne .-8 ; 0x227ee <__vector_14+0x100> 227f6: 80 93 0f 04 sts 0x040F, r24 ; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437> if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); 227fa: 89 2b or r24, r25 227fc: 09 f4 brne .+2 ; 0x22800 <__vector_14+0x112> 227fe: 77 c0 rjmp .+238 ; 0x228ee <__vector_14+0x200> 22800: 9f b7 in r25, 0x3f ; 63 22802: f8 94 cli 22804: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22808: 88 60 ori r24, 0x08 ; 8 2280a: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2280e: 9f bf out 0x3f, r25 ; 63 } #endif if(soft_pwm_0 < pwm_count) 22810: 90 91 bb 05 lds r25, 0x05BB ; 0x8005bb 22814: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 22818: 98 17 cp r25, r24 2281a: 08 f4 brcc .+2 ; 0x2281e <__vector_14+0x130> { WRITE(HEATER_0_PIN,0); 2281c: 75 98 cbi 0x0e, 5 ; 14 WRITE(HEATER_1_PIN,0); #endif } #ifdef FAN_SOFT_PWM if (soft_pwm_fan < (pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1))) WRITE(FAN_PIN,0); 2281e: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 22822: 8f 70 andi r24, 0x0F ; 15 22824: 90 91 0f 04 lds r25, 0x040F ; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437> 22828: 98 17 cp r25, r24 2282a: 40 f4 brcc .+16 ; 0x2283c <__vector_14+0x14e> 2282c: 9f b7 in r25, 0x3f ; 63 2282e: f8 94 cli 22830: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22834: 87 7f andi r24, 0xF7 ; 247 22836: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2283a: 9f bf out 0x3f, r25 ; 63 #endif pwm_count += (1 << SOFT_PWM_SCALE); 2283c: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 22840: 8f 5f subi r24, 0xFF ; 255 pwm_count &= 0x7f; 22842: 8f 77 andi r24, 0x7F ; 127 22844: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e 22848: 10 e0 ldi r17, 0x00 ; 0 2284a: 00 e0 ldi r16, 0x00 ; 0 #ifdef BABYSTEPPING FORCE_INLINE static void applyBabysteps() { for(uint8_t axis=0;axis<3;axis++) { int curTodo=babystepsTodo[axis]; //get rid of volatile for performance 2284c: e8 01 movw r28, r16 2284e: cc 0f add r28, r28 22850: dd 1f adc r29, r29 22852: c1 58 subi r28, 0x81 ; 129 22854: dc 4f sbci r29, 0xFC ; 252 22856: 88 81 ld r24, Y 22858: 99 81 ldd r25, Y+1 ; 0x01 if(curTodo>0) 2285a: 18 16 cp r1, r24 2285c: 19 06 cpc r1, r25 2285e: 0c f0 brlt .+2 ; 0x22862 <__vector_14+0x174> 22860: 4c c0 rjmp .+152 ; 0x228fa <__vector_14+0x20c> { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 22862: ff b6 in r15, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 22864: f8 94 cli babystep(axis,/*fwd*/true); 22866: 61 e0 ldi r22, 0x01 ; 1 22868: 80 2f mov r24, r16 2286a: 0f 94 a6 02 call 0x2054c ; 0x2054c babystepsTodo[axis]--; //less to do next time 2286e: 88 81 ld r24, Y 22870: 99 81 ldd r25, Y+1 ; 0x01 22872: 01 97 sbiw r24, 0x01 ; 1 else if(curTodo<0) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { babystep(axis,/*fwd*/false); babystepsTodo[axis]++; //less to do next time 22874: 99 83 std Y+1, r25 ; 0x01 22876: 88 83 st Y, r24 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 22878: ff be out 0x3f, r15 ; 63 __asm__ volatile ("" ::: "memory"); 2287a: 0f 5f subi r16, 0xFF ; 255 2287c: 1f 4f sbci r17, 0xFF ; 255 } #endif #ifdef BABYSTEPPING FORCE_INLINE static void applyBabysteps() { for(uint8_t axis=0;axis<3;axis++) 2287e: 03 30 cpi r16, 0x03 ; 3 22880: 11 05 cpc r17, r1 22882: 21 f7 brne .-56 ; 0x2284c <__vector_14+0x15e> #ifdef BABYSTEPPING applyBabysteps(); #endif //BABYSTEPPING // Check if a stack overflow happened if (!SdFatUtil::test_stack_integrity()) stack_error(); 22884: 80 91 37 17 lds r24, 0x1737 ; 0x801737 <__bss_end+0x20> 22888: 90 91 38 17 lds r25, 0x1738 ; 0x801738 <__bss_end+0x21> 2288c: a0 91 39 17 lds r26, 0x1739 ; 0x801739 <__bss_end+0x22> 22890: b0 91 3a 17 lds r27, 0x173A ; 0x80173a <__bss_end+0x23> 22894: 82 3a cpi r24, 0xA2 ; 162 22896: 92 4a sbci r25, 0xA2 ; 162 22898: a1 05 cpc r26, r1 2289a: b1 05 cpc r27, r1 2289c: d9 f1 breq .+118 ; 0x22914 <__vector_14+0x226> crash_and_burn(dump_crash_reason::bad_isr); } #endif //EMERGENCY_HANDLERS void stack_error() { crash_and_burn(dump_crash_reason::stack_error); 2289e: 81 e0 ldi r24, 0x01 ; 1 228a0: 0e 94 c7 86 call 0x10d8e ; 0x10d8e if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) { longPressTimer.start(); lcd_button_pressed = 1; } else if (longPressTimer.expired(LONG_PRESS_TIME)) 228a4: 68 ee ldi r22, 0xE8 ; 232 228a6: 73 e0 ldi r23, 0x03 ; 3 228a8: 88 ea ldi r24, 0xA8 ; 168 228aa: 95 e0 ldi r25, 0x05 ; 5 228ac: 0f 94 1f 0e call 0x21c3e ; 0x21c3e ::expired(unsigned short)> 228b0: 88 23 and r24, r24 228b2: 09 f4 brne .+2 ; 0x228b6 <__vector_14+0x1c8> 228b4: 5d cf rjmp .-326 ; 0x22770 <__vector_14+0x82> { lcd_long_press_active = 1; 228b6: 81 e0 ldi r24, 0x01 ; 1 228b8: 80 93 ab 05 sts 0x05AB, r24 ; 0x8005ab lcd_longpress_trigger = 1; 228bc: 80 93 a7 05 sts 0x05A7, r24 ; 0x8005a7 228c0: 57 cf rjmp .-338 ; 0x22770 <__vector_14+0x82> } } } else { //button not pressed if (lcd_button_pressed) 228c2: 80 91 ac 05 lds r24, 0x05AC ; 0x8005ac 228c6: 88 23 and r24, r24 228c8: 09 f4 brne .+2 ; 0x228cc <__vector_14+0x1de> 228ca: 52 cf rjmp .-348 ; 0x22770 <__vector_14+0x82> { //button was released lcd_button_pressed = 0; // Reset to prevent double triggering 228cc: 10 92 ac 05 sts 0x05AC, r1 ; 0x8005ac if (!lcd_long_press_active) 228d0: 80 91 ab 05 lds r24, 0x05AB ; 0x8005ab 228d4: 81 11 cpse r24, r1 228d6: 03 c0 rjmp .+6 ; 0x228de <__vector_14+0x1f0> { //button released before long press gets activated lcd_click_trigger = 1; // This flag is reset when the event is consumed 228d8: 81 e0 ldi r24, 0x01 ; 1 228da: 80 93 95 03 sts 0x0395, r24 ; 0x800395 } lcd_backlight_wake_trigger = true; // flag event, knob pressed 228de: 81 e0 ldi r24, 0x01 ; 1 228e0: 80 93 a6 05 sts 0x05A6, r24 ; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501> lcd_long_press_active = 0; 228e4: 10 92 ab 05 sts 0x05AB, r1 ; 0x8005ab 228e8: 43 cf rjmp .-378 ; 0x22770 <__vector_14+0x82> { WRITE(HEATER_0_PIN,1); #ifdef HEATERS_PARALLEL WRITE(HEATER_1_PIN,1); #endif } else WRITE(HEATER_0_PIN,0); 228ea: 75 98 cbi 0x0e, 5 ; 14 228ec: 78 cf rjmp .-272 ; 0x227de <__vector_14+0xf0> #ifdef FAN_SOFT_PWM if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0) { soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS)); if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); 228ee: 9f b7 in r25, 0x3f ; 63 228f0: f8 94 cli 228f2: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 228f6: 87 7f andi r24, 0xF7 ; 247 228f8: 88 cf rjmp .-240 ; 0x2280a <__vector_14+0x11c> babystep(axis,/*fwd*/true); babystepsTodo[axis]--; //less to do next time } } else if(curTodo<0) 228fa: 89 2b or r24, r25 228fc: 09 f4 brne .+2 ; 0x22900 <__vector_14+0x212> 228fe: bd cf rjmp .-134 ; 0x2287a <__vector_14+0x18c> { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 22900: ff b6 in r15, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 22902: f8 94 cli babystep(axis,/*fwd*/false); 22904: 60 e0 ldi r22, 0x00 ; 0 22906: 80 2f mov r24, r16 22908: 0f 94 a6 02 call 0x2054c ; 0x2054c babystepsTodo[axis]++; //less to do next time 2290c: 88 81 ld r24, Y 2290e: 99 81 ldd r25, Y+1 ; 0x01 22910: 01 96 adiw r24, 0x01 ; 1 22912: b0 cf rjmp .-160 ; 0x22874 <__vector_14+0x186> #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1)) void readFanTach() { static bool fan_state[2]; #ifdef FAN_SOFT_PWM if (READ(TACH_0) != fan_state[0]) { 22914: 96 b1 in r25, 0x06 ; 6 22916: 80 91 b9 05 lds r24, 0x05B9 ; 0x8005b9 2291a: 99 1f adc r25, r25 2291c: 99 27 eor r25, r25 2291e: 99 1f adc r25, r25 22920: 98 17 cp r25, r24 22922: 91 f0 breq .+36 ; 0x22948 <__vector_14+0x25a> if(fan_measuring) fan_edge_counter[0] ++; 22924: 90 91 b6 03 lds r25, 0x03B6 ; 0x8003b6 22928: 99 23 and r25, r25 2292a: 51 f0 breq .+20 ; 0x22940 <__vector_14+0x252> 2292c: 20 91 b5 05 lds r18, 0x05B5 ; 0x8005b5 22930: 30 91 b6 05 lds r19, 0x05B6 ; 0x8005b6 22934: 2f 5f subi r18, 0xFF ; 255 22936: 3f 4f sbci r19, 0xFF ; 255 22938: 30 93 b6 05 sts 0x05B6, r19 ; 0x8005b6 2293c: 20 93 b5 05 sts 0x05B5, r18 ; 0x8005b5 fan_state[0] = !fan_state[0]; 22940: 91 e0 ldi r25, 0x01 ; 1 22942: 89 27 eor r24, r25 22944: 80 93 b9 05 sts 0x05B9, r24 ; 0x8005b9 (void)__s; } static __inline__ void __iCliParam(const uint8_t *__s) { cli(); 22948: f8 94 cli { DISABLE_SOFT_PWM_INTERRUPT(); NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) { soft_pwm_isr(); } ENABLE_SOFT_PWM_INTERRUPT(); 2294a: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 2294e: 84 60 ori r24, 0x04 ; 4 22950: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> } 22954: ff 91 pop r31 22956: ef 91 pop r30 22958: df 91 pop r29 2295a: cf 91 pop r28 2295c: bf 91 pop r27 2295e: af 91 pop r26 22960: 9f 91 pop r25 22962: 8f 91 pop r24 22964: 7f 91 pop r23 22966: 6f 91 pop r22 22968: 5f 91 pop r21 2296a: 4f 91 pop r20 2296c: 3f 91 pop r19 2296e: 2f 91 pop r18 22970: 1f 91 pop r17 22972: 0f 91 pop r16 22974: ff 90 pop r15 22976: 0f 90 pop r0 22978: 0b be out 0x3b, r0 ; 59 2297a: 0f 90 pop r0 2297c: 0f be out 0x3f, r0 ; 63 2297e: 0f 90 pop r0 22980: 1f 90 pop r1 22982: 18 95 reti 00022984 : return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET; } // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. static float analog2tempBed(int raw) { 22984: 4f 92 push r4 22986: 5f 92 push r5 22988: 6f 92 push r6 2298a: 7f 92 push r7 2298c: af 92 push r10 2298e: bf 92 push r11 22990: cf 92 push r12 22992: df 92 push r13 22994: ef 92 push r14 22996: ff 92 push r15 22998: 0f 93 push r16 2299a: 1f 93 push r17 2299c: cf 93 push r28 2299e: df 93 push r29 229a0: 24 e0 ldi r18, 0x04 ; 4 229a2: 30 e0 ldi r19, 0x00 ; 0 229a4: 41 e0 ldi r20, 0x01 ; 1 229a6: 50 e0 ldi r21, 0x00 ; 0 229a8: d9 01 movw r26, r18 229aa: a6 5a subi r26, 0xA6 ; 166 229ac: ba 46 sbci r27, 0x6A ; 106 float celsius = 0; byte i; for (i=1; i raw) 229ae: fd 01 movw r30, r26 229b0: 65 91 lpm r22, Z+ 229b2: 74 91 lpm r23, Z 229b4: 86 17 cp r24, r22 229b6: 97 07 cpc r25, r23 229b8: 0c f0 brlt .+2 ; 0x229bc 229ba: 80 c0 rjmp .+256 ; 0x22abc { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + 229bc: 41 50 subi r20, 0x01 ; 1 229be: 51 09 sbc r21, r1 229c0: 44 0f add r20, r20 229c2: 55 1f adc r21, r21 229c4: 44 0f add r20, r20 229c6: 55 1f adc r21, r21 229c8: 8a 01 movw r16, r20 229ca: 04 5a subi r16, 0xA4 ; 164 229cc: 1a 46 sbci r17, 0x6A ; 106 229ce: f8 01 movw r30, r16 229d0: c5 90 lpm r12, Z+ 229d2: d4 90 lpm r13, Z (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) * 229d4: 46 5a subi r20, 0xA6 ; 166 229d6: 5a 46 sbci r21, 0x6A ; 106 229d8: fa 01 movw r30, r20 229da: 65 91 lpm r22, Z+ 229dc: 74 91 lpm r23, Z (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / 229de: f9 01 movw r30, r18 229e0: e4 5a subi r30, 0xA4 ; 164 229e2: fa 46 sbci r31, 0x6A ; 106 229e4: c5 91 lpm r28, Z+ 229e6: d4 91 lpm r29, Z 229e8: f8 01 movw r30, r16 229ea: 05 91 lpm r16, Z+ 229ec: 14 91 lpm r17, Z (float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0])); 229ee: fd 01 movw r30, r26 229f0: e5 90 lpm r14, Z+ 229f2: f4 90 lpm r15, Z 229f4: fa 01 movw r30, r20 229f6: a5 90 lpm r10, Z+ 229f8: b4 90 lpm r11, Z for (i=1; i raw) { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) * 229fa: 86 1b sub r24, r22 229fc: 97 0b sbc r25, r23 229fe: bc 01 movw r22, r24 22a00: 99 0f add r25, r25 22a02: 88 0b sbc r24, r24 22a04: 99 0b sbc r25, r25 22a06: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22a0a: 2b 01 movw r4, r22 22a0c: 3c 01 movw r6, r24 (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / 22a0e: be 01 movw r22, r28 22a10: 60 1b sub r22, r16 22a12: 71 0b sbc r23, r17 22a14: 07 2e mov r0, r23 22a16: 00 0c add r0, r0 22a18: 88 0b sbc r24, r24 22a1a: 99 0b sbc r25, r25 22a1c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22a20: 9b 01 movw r18, r22 22a22: ac 01 movw r20, r24 for (i=1; i raw) { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) * 22a24: c3 01 movw r24, r6 22a26: b2 01 movw r22, r4 22a28: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 22a2c: 2b 01 movw r4, r22 22a2e: 3c 01 movw r6, r24 (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / (float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0])); 22a30: b7 01 movw r22, r14 22a32: 6a 19 sub r22, r10 22a34: 7b 09 sbc r23, r11 22a36: 07 2e mov r0, r23 22a38: 00 0c add r0, r0 22a3a: 88 0b sbc r24, r24 22a3c: 99 0b sbc r25, r25 22a3e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22a42: 9b 01 movw r18, r22 22a44: ac 01 movw r20, r24 { if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw) { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) * (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / 22a46: c3 01 movw r24, r6 22a48: b2 01 movw r22, r4 22a4a: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 22a4e: 2b 01 movw r4, r22 22a50: 3c 01 movw r6, r24 for (i=1; i raw) { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + 22a52: b6 01 movw r22, r12 22a54: dd 0c add r13, r13 22a56: 88 0b sbc r24, r24 22a58: 99 0b sbc r25, r25 22a5a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22a5e: 9b 01 movw r18, r22 22a60: ac 01 movw r20, r24 22a62: c3 01 movw r24, r6 22a64: b2 01 movw r22, r4 22a66: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> break; } } // Overflow: Set to last value in the table if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]); 22a6a: 6b 01 movw r12, r22 22a6c: 7c 01 movw r14, r24 float _offset_start = BED_OFFSET_START; float _first_koef = (_offset / 2) / (_offset_center - _offset_start); float _second_koef = (_offset / 2) / (100 - _offset_center); if (celsius >= _offset_start && celsius <= _offset_center) 22a6e: 20 e0 ldi r18, 0x00 ; 0 22a70: 30 e0 ldi r19, 0x00 ; 0 22a72: 40 e2 ldi r20, 0x20 ; 32 22a74: 52 e4 ldi r21, 0x42 ; 66 22a76: c7 01 movw r24, r14 22a78: b6 01 movw r22, r12 22a7a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22a7e: 87 fd sbrc r24, 7 22a80: 30 c0 rjmp .+96 ; 0x22ae2 22a82: 20 e0 ldi r18, 0x00 ; 0 22a84: 30 e0 ldi r19, 0x00 ; 0 22a86: 48 e4 ldi r20, 0x48 ; 72 22a88: 52 e4 ldi r21, 0x42 ; 66 22a8a: c7 01 movw r24, r14 22a8c: b6 01 movw r22, r12 22a8e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 22a92: 18 16 cp r1, r24 22a94: 34 f1 brlt .+76 ; 0x22ae2 { celsius = celsius + (_first_koef * (celsius - _offset_start)); 22a96: 20 e0 ldi r18, 0x00 ; 0 22a98: 30 e0 ldi r19, 0x00 ; 0 22a9a: 40 e2 ldi r20, 0x20 ; 32 22a9c: 52 e4 ldi r21, 0x42 ; 66 22a9e: c7 01 movw r24, r14 22aa0: b6 01 movw r22, r12 22aa2: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 22aa6: 20 e0 ldi r18, 0x00 ; 0 22aa8: 30 e0 ldi r19, 0x00 ; 0 22aaa: 40 e0 ldi r20, 0x00 ; 0 22aac: 5f e3 ldi r21, 0x3F ; 63 22aae: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 22ab2: 9b 01 movw r18, r22 22ab4: ac 01 movw r20, r24 { celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ; } else if (celsius > 100) { celsius = celsius + _offset; 22ab6: c7 01 movw r24, r14 22ab8: b6 01 movw r22, r12 22aba: 43 c0 rjmp .+134 ; 0x22b42 22abc: 4f 5f subi r20, 0xFF ; 255 22abe: 5f 4f sbci r21, 0xFF ; 255 22ac0: 2c 5f subi r18, 0xFC ; 252 22ac2: 3f 4f sbci r19, 0xFF ; 255 static float analog2tempBed(int raw) { #ifdef BED_USES_THERMISTOR float celsius = 0; byte i; for (i=1; i 22aca: 6e cf rjmp .-292 ; 0x229a8 break; } } // Overflow: Set to last value in the table if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]); 22acc: ec e4 ldi r30, 0x4C ; 76 22ace: f6 e9 ldi r31, 0x96 ; 150 22ad0: 65 91 lpm r22, Z+ 22ad2: 74 91 lpm r23, Z 22ad4: 07 2e mov r0, r23 22ad6: 00 0c add r0, r0 22ad8: 88 0b sbc r24, r24 22ada: 99 0b sbc r25, r25 22adc: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22ae0: c4 cf rjmp .-120 ; 0x22a6a if (celsius >= _offset_start && celsius <= _offset_center) { celsius = celsius + (_first_koef * (celsius - _offset_start)); } else if (celsius > _offset_center && celsius <= 100) 22ae2: 20 e0 ldi r18, 0x00 ; 0 22ae4: 30 e0 ldi r19, 0x00 ; 0 22ae6: 48 e4 ldi r20, 0x48 ; 72 22ae8: 52 e4 ldi r21, 0x42 ; 66 22aea: c7 01 movw r24, r14 22aec: b6 01 movw r22, r12 22aee: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22af2: 18 16 cp r1, r24 22af4: dc f5 brge .+118 ; 0x22b6c 22af6: 20 e0 ldi r18, 0x00 ; 0 22af8: 30 e0 ldi r19, 0x00 ; 0 22afa: 48 ec ldi r20, 0xC8 ; 200 22afc: 52 e4 ldi r21, 0x42 ; 66 22afe: c7 01 movw r24, r14 22b00: b6 01 movw r22, r12 22b02: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 22b06: 18 16 cp r1, r24 22b08: 8c f1 brlt .+98 ; 0x22b6c { celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ; 22b0a: 20 e0 ldi r18, 0x00 ; 0 22b0c: 30 e0 ldi r19, 0x00 ; 0 22b0e: 40 ea ldi r20, 0xA0 ; 160 22b10: 50 e4 ldi r21, 0x40 ; 64 22b12: c7 01 movw r24, r14 22b14: b6 01 movw r22, r12 22b16: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 22b1a: 2b 01 movw r4, r22 22b1c: 3c 01 movw r6, r24 22b1e: 20 e0 ldi r18, 0x00 ; 0 22b20: 30 e0 ldi r19, 0x00 ; 0 22b22: 48 e4 ldi r20, 0x48 ; 72 22b24: 52 e4 ldi r21, 0x42 ; 66 22b26: c7 01 movw r24, r14 22b28: b6 01 movw r22, r12 22b2a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 22b2e: 2d ec ldi r18, 0xCD ; 205 22b30: 3c ec ldi r19, 0xCC ; 204 22b32: 4c ec ldi r20, 0xCC ; 204 22b34: 5d e3 ldi r21, 0x3D ; 61 22b36: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 22b3a: 9b 01 movw r18, r22 22b3c: ac 01 movw r20, r24 22b3e: c3 01 movw r24, r6 22b40: b2 01 movw r22, r4 } else if (celsius > 100) { celsius = celsius + _offset; 22b42: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 22b46: 6b 01 movw r12, r22 22b48: 7c 01 movw r14, r24 #elif defined BED_USES_AD595 return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET; #else return 0; #endif } 22b4a: c7 01 movw r24, r14 22b4c: b6 01 movw r22, r12 22b4e: df 91 pop r29 22b50: cf 91 pop r28 22b52: 1f 91 pop r17 22b54: 0f 91 pop r16 22b56: ff 90 pop r15 22b58: ef 90 pop r14 22b5a: df 90 pop r13 22b5c: cf 90 pop r12 22b5e: bf 90 pop r11 22b60: af 90 pop r10 22b62: 7f 90 pop r7 22b64: 6f 90 pop r6 22b66: 5f 90 pop r5 22b68: 4f 90 pop r4 22b6a: 08 95 ret } else if (celsius > _offset_center && celsius <= 100) { celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ; } else if (celsius > 100) 22b6c: 20 e0 ldi r18, 0x00 ; 0 22b6e: 30 e0 ldi r19, 0x00 ; 0 22b70: 48 ec ldi r20, 0xC8 ; 200 22b72: 52 e4 ldi r21, 0x42 ; 66 22b74: c7 01 movw r24, r14 22b76: b6 01 movw r22, r12 22b78: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22b7c: 18 16 cp r1, r24 22b7e: 2c f7 brge .-54 ; 0x22b4a { celsius = celsius + _offset; 22b80: 20 e0 ldi r18, 0x00 ; 0 22b82: 30 e0 ldi r19, 0x00 ; 0 22b84: 40 e2 ldi r20, 0x20 ; 32 22b86: 51 e4 ldi r21, 0x41 ; 65 22b88: 96 cf rjmp .-212 ; 0x22ab6 00022b8a <__vector_32>: if (pid_tuning_finished) temp_mgr_pid(); } ISR(TIMERx_COMPA_vect) { 22b8a: 1f 92 push r1 22b8c: 0f 92 push r0 22b8e: 0f b6 in r0, 0x3f ; 63 22b90: 0f 92 push r0 22b92: 11 24 eor r1, r1 22b94: 0b b6 in r0, 0x3b ; 59 22b96: 0f 92 push r0 22b98: 4f 92 push r4 22b9a: 5f 92 push r5 22b9c: 6f 92 push r6 22b9e: 7f 92 push r7 22ba0: 8f 92 push r8 22ba2: 9f 92 push r9 22ba4: af 92 push r10 22ba6: bf 92 push r11 22ba8: cf 92 push r12 22baa: df 92 push r13 22bac: ef 92 push r14 22bae: ff 92 push r15 22bb0: 0f 93 push r16 22bb2: 1f 93 push r17 22bb4: 2f 93 push r18 22bb6: 3f 93 push r19 22bb8: 4f 93 push r20 22bba: 5f 93 push r21 22bbc: 6f 93 push r22 22bbe: 7f 93 push r23 22bc0: 8f 93 push r24 22bc2: 9f 93 push r25 22bc4: af 93 push r26 22bc6: bf 93 push r27 22bc8: cf 93 push r28 22bca: df 93 push r29 22bcc: ef 93 push r30 22bce: ff 93 push r31 // immediately schedule a new conversion if(adc_values_ready != true) return; 22bd0: 80 91 f6 05 lds r24, 0x05F6 ; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517> 22bd4: 88 23 and r24, r24 22bd6: 09 f4 brne .+2 ; 0x22bda <__vector_32+0x50> 22bd8: 22 c1 rjmp .+580 ; 0x22e1e <__vector_32+0x294> adc_values_ready = false; 22bda: 10 92 f6 05 sts 0x05F6, r1 ; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517> adc_start_cycle(); 22bde: 0e 94 cf bc call 0x1799e ; 0x1799e // run temperature management with interrupts enabled to reduce latency DISABLE_TEMP_MGR_INTERRUPT(); 22be2: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 22be6: 8d 7f andi r24, 0xFD ; 253 22be8: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> #if !defined(__DOXYGEN__) /* Internal helper functions. */ static __inline__ uint8_t __iSeiRetVal(void) { sei(); 22bec: 78 94 sei interrupt context, while this function runs from temp_mgr_isr which *is* preemptible as analog2temp is relatively slow */ static void setIsrTemperaturesFromRawValues() { for(uint8_t e=0;e 22bf2: 90 91 dd 05 lds r25, 0x05DD ; 0x8005dd 22bf6: 0f 94 66 8f call 0x31ecc ; 0x31ecc 22bfa: 4b 01 movw r8, r22 22bfc: 5c 01 movw r10, r24 22bfe: 80 92 f1 05 sts 0x05F1, r8 ; 0x8005f1 22c02: 90 92 f2 05 sts 0x05F2, r9 ; 0x8005f2 22c06: a0 92 f3 05 sts 0x05F3, r10 ; 0x8005f3 22c0a: b0 92 f4 05 sts 0x05F4, r11 ; 0x8005f4 current_temperature_bed_isr = analog2tempBed(current_temperature_bed_raw); 22c0e: 00 91 de 05 lds r16, 0x05DE ; 0x8005de 22c12: 10 91 df 05 lds r17, 0x05DF ; 0x8005df 22c16: c8 01 movw r24, r16 22c18: 0f 94 c2 14 call 0x22984 ; 0x22984 22c1c: 6b 01 movw r12, r22 22c1e: 7c 01 movw r14, r24 22c20: c0 92 ea 05 sts 0x05EA, r12 ; 0x8005ea 22c24: d0 92 eb 05 sts 0x05EB, r13 ; 0x8005eb 22c28: e0 92 ec 05 sts 0x05EC, r14 ; 0x8005ec 22c2c: f0 92 ed 05 sts 0x05ED, r15 ; 0x8005ed #ifdef PINDA_THERMISTOR current_temperature_pinda_isr = analog2tempBed(current_temperature_raw_pinda); 22c30: 80 91 da 05 lds r24, 0x05DA ; 0x8005da 22c34: 90 91 db 05 lds r25, 0x05DB ; 0x8005db 22c38: 0f 94 c2 14 call 0x22984 ; 0x22984 22c3c: 60 93 d6 05 sts 0x05D6, r22 ; 0x8005d6 22c40: 70 93 d7 05 sts 0x05D7, r23 ; 0x8005d7 22c44: 80 93 d8 05 sts 0x05D8, r24 ; 0x8005d8 22c48: 90 93 d9 05 sts 0x05D9, r25 ; 0x8005d9 #endif #ifdef AMBIENT_THERMISTOR current_temperature_ambient_isr = analog2tempAmbient(current_temperature_raw_ambient); //thermistor for ambient is NTCG104LH104JT1 (2000) #endif temp_meas_ready = true; 22c4c: 81 e0 ldi r24, 0x01 ; 1 22c4e: 80 93 d5 05 sts 0x05D5, r24 ; 0x8005d5 { // update *_isr temperatures from raw values for PID regulation setIsrTemperaturesFromRawValues(); // clear the error assertion flag before checking again temp_error_state.assert = false; 22c52: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 22c56: 8d 7f andi r24, 0xFD ; 253 22c58: 80 93 cc 03 sts 0x03CC, r24 ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> void check_max_temp_raw() { //heater #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP if (current_temperature_raw[0] <= maxttemp_raw[0]) { 22c5c: c0 91 dc 05 lds r28, 0x05DC ; 0x8005dc 22c60: d0 91 dd 05 lds r29, 0x05DD ; 0x8005dd 22c64: 80 91 0b 04 lds r24, 0x040B ; 0x80040b <_ZL12maxttemp_raw.lto_priv.430> 22c68: 90 91 0c 04 lds r25, 0x040C ; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1> 22c6c: 8c 17 cp r24, r28 22c6e: 9d 07 cpc r25, r29 22c70: 2c f0 brlt .+10 ; 0x22c7c <__vector_32+0xf2> #else if (current_temperature_raw[0] >= maxttemp_raw[0]) { #endif set_temp_error(TempErrorSource::hotend, 0, TempErrorType::max); 22c72: 40 e0 ldi r20, 0x00 ; 0 22c74: 60 e0 ldi r22, 0x00 ; 0 22c76: 80 e0 ldi r24, 0x00 ; 0 22c78: 0f 94 20 11 call 0x22240 ; 0x22240 } //bed #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0) #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP if (current_temperature_bed_raw <= bed_maxttemp_raw) { 22c7c: 80 91 09 04 lds r24, 0x0409 ; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431> 22c80: 90 91 0a 04 lds r25, 0x040A ; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1> 22c84: 80 17 cp r24, r16 22c86: 91 07 cpc r25, r17 22c88: 2c f0 brlt .+10 ; 0x22c94 <__vector_32+0x10a> #else if (current_temperature_bed_raw >= bed_maxttemp_raw) { #endif set_temp_error(TempErrorSource::bed, 0, TempErrorType::max); 22c8a: 40 e0 ldi r20, 0x00 ; 0 22c8c: 60 e0 ldi r22, 0x00 ; 0 22c8e: 81 e0 ldi r24, 0x01 ; 1 22c90: 0f 94 20 11 call 0x22240 ; 0x22240 { // ambient temperature is low #endif //AMBIENT_THERMISTOR // *** 'common' part of code for MK2.5 & MK3 // * nozzle checking if(target_temperature_isr[active_extruder]>minttemp[active_extruder]) { 22c94: 60 91 0d 04 lds r22, 0x040D ; 0x80040d <_ZL8minttemp.lto_priv.427> 22c98: 70 91 0e 04 lds r23, 0x040E ; 0x80040e <_ZL8minttemp.lto_priv.427+0x1> 22c9c: 80 91 ef 05 lds r24, 0x05EF ; 0x8005ef 22ca0: 90 91 f0 05 lds r25, 0x05F0 ; 0x8005f0 22ca4: 68 17 cp r22, r24 22ca6: 79 07 cpc r23, r25 22ca8: 0c f0 brlt .+2 ; 0x22cac <__vector_32+0x122> 22caa: dc c0 rjmp .+440 ; 0x22e64 <__vector_32+0x2da> // ~ nozzle heating is on bCheckingOnHeater=bCheckingOnHeater||(current_temperature_isr[active_extruder]>(minttemp[active_extruder]+TEMP_HYSTERESIS)); // for eventually delay cutting 22cac: 10 91 e7 05 lds r17, 0x05E7 ; 0x8005e7 22cb0: 11 11 cpse r17, r1 22cb2: 12 c0 rjmp .+36 ; 0x22cd8 <__vector_32+0x14e> 22cb4: 6b 5f subi r22, 0xFB ; 251 22cb6: 7f 4f sbci r23, 0xFF ; 255 22cb8: 07 2e mov r0, r23 22cba: 00 0c add r0, r0 22cbc: 88 0b sbc r24, r24 22cbe: 99 0b sbc r25, r25 22cc0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22cc4: 9b 01 movw r18, r22 22cc6: ac 01 movw r20, r24 22cc8: 11 e0 ldi r17, 0x01 ; 1 22cca: c5 01 movw r24, r10 22ccc: b4 01 movw r22, r8 22cce: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22cd2: 18 16 cp r1, r24 22cd4: 0c f0 brlt .+2 ; 0x22cd8 <__vector_32+0x14e> 22cd6: 10 e0 ldi r17, 0x00 ; 0 22cd8: 10 93 e7 05 sts 0x05E7, r17 ; 0x8005e7 if(oTimer4minTempHeater.expired_cont(HEATER_MINTEMP_DELAY) || bCheckingOnHeater) { 22cdc: 68 e9 ldi r22, 0x98 ; 152 22cde: 7a e3 ldi r23, 0x3A ; 58 22ce0: 84 ee ldi r24, 0xE4 ; 228 22ce2: 95 e0 ldi r25, 0x05 ; 5 22ce4: 0f 94 47 0e call 0x21c8e ; 0x21c8e ::expired_cont(unsigned short)> 22ce8: 81 11 cpse r24, r1 22cea: 02 c0 rjmp .+4 ; 0x22cf0 <__vector_32+0x166> 22cec: 11 23 and r17, r17 22cee: 79 f0 breq .+30 ; 0x22d0e <__vector_32+0x184> bCheckingOnHeater=true; // not necessary 22cf0: 81 e0 ldi r24, 0x01 ; 1 22cf2: 80 93 e7 05 sts 0x05E7, r24 ; 0x8005e7 static alert_automaton_mintemp alert_automaton_hotend(m2hotend), alert_automaton_bed(m2bed); void check_min_temp_heater0() { #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP if (current_temperature_raw[0] >= minttemp_raw[0]) { 22cf6: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL12minttemp_raw.lto_priv.429> 22cfa: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1> 22cfe: c8 17 cp r28, r24 22d00: d9 07 cpc r29, r25 22d02: 2c f0 brlt .+10 ; 0x22d0e <__vector_32+0x184> #else if (current_temperature_raw[0] <= minttemp_raw[0]) { #endif set_temp_error(TempErrorSource::hotend, 0, TempErrorType::min); 22d04: 41 e0 ldi r20, 0x01 ; 1 22d06: 60 e0 ldi r22, 0x00 ; 0 22d08: 80 e0 ldi r24, 0x00 ; 0 22d0a: 0f 94 20 11 call 0x22240 ; 0x22240 // ~ nozzle heating is off oTimer4minTempHeater.start(); bCheckingOnHeater=false; } // * bed checking if(target_temperature_bed_isr>BED_MINTEMP) { 22d0e: 80 91 e8 05 lds r24, 0x05E8 ; 0x8005e8 22d12: 90 91 e9 05 lds r25, 0x05E9 ; 0x8005e9 22d16: 4f 97 sbiw r24, 0x1f ; 31 22d18: 0c f4 brge .+2 ; 0x22d1c <__vector_32+0x192> 22d1a: ab c0 rjmp .+342 ; 0x22e72 <__vector_32+0x2e8> // ~ bed heating is on bCheckingOnBed=bCheckingOnBed||(current_temperature_bed_isr>(BED_MINTEMP+TEMP_HYSTERESIS)); // for eventually delay cutting 22d1c: c0 91 e3 05 lds r28, 0x05E3 ; 0x8005e3 22d20: c1 11 cpse r28, r1 22d22: 0c c0 rjmp .+24 ; 0x22d3c <__vector_32+0x1b2> 22d24: c1 e0 ldi r28, 0x01 ; 1 22d26: 20 e0 ldi r18, 0x00 ; 0 22d28: 30 e0 ldi r19, 0x00 ; 0 22d2a: 4c e0 ldi r20, 0x0C ; 12 22d2c: 52 e4 ldi r21, 0x42 ; 66 22d2e: c7 01 movw r24, r14 22d30: b6 01 movw r22, r12 22d32: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 22d36: 18 16 cp r1, r24 22d38: 0c f0 brlt .+2 ; 0x22d3c <__vector_32+0x1b2> 22d3a: c0 e0 ldi r28, 0x00 ; 0 22d3c: c0 93 e3 05 sts 0x05E3, r28 ; 0x8005e3 if(oTimer4minTempBed.expired_cont(BED_MINTEMP_DELAY) || bCheckingOnBed) { 22d40: 60 e5 ldi r22, 0x50 ; 80 22d42: 73 ec ldi r23, 0xC3 ; 195 22d44: 80 ee ldi r24, 0xE0 ; 224 22d46: 95 e0 ldi r25, 0x05 ; 5 22d48: 0f 94 47 0e call 0x21c8e ; 0x21c8e ::expired_cont(unsigned short)> 22d4c: 81 11 cpse r24, r1 22d4e: 02 c0 rjmp .+4 ; 0x22d54 <__vector_32+0x1ca> 22d50: cc 23 and r28, r28 22d52: 99 f0 breq .+38 ; 0x22d7a <__vector_32+0x1f0> bCheckingOnBed=true; // not necessary 22d54: 81 e0 ldi r24, 0x01 ; 1 22d56: 80 93 e3 05 sts 0x05E3, r24 ; 0x8005e3 } void check_min_temp_bed() { #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP if (current_temperature_bed_raw >= bed_minttemp_raw) { 22d5a: 20 91 de 05 lds r18, 0x05DE ; 0x8005de 22d5e: 30 91 df 05 lds r19, 0x05DF ; 0x8005df 22d62: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428> 22d66: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1> 22d6a: 28 17 cp r18, r24 22d6c: 39 07 cpc r19, r25 22d6e: 2c f0 brlt .+10 ; 0x22d7a <__vector_32+0x1f0> #else if (current_temperature_bed_raw <= bed_minttemp_raw) { #endif set_temp_error(TempErrorSource::bed, 0, TempErrorType::min); 22d70: 41 e0 ldi r20, 0x01 ; 1 22d72: 60 e0 ldi r22, 0x00 ; 0 22d74: 81 e0 ldi r24, 0x01 ; 1 22d76: 0f 94 20 11 call 0x22240 ; 0x22240 static void check_temp_runaway() { #ifdef TEMP_RUNAWAY_EXTRUDER_HYSTERESIS for(uint8_t e = 0; e < EXTRUDERS; e++) temp_runaway_check(e+1, target_temperature_isr[e], current_temperature_isr[e], soft_pwm[e], false); 22d7a: 60 91 f5 05 lds r22, 0x05F5 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 22d7e: 70 e0 ldi r23, 0x00 ; 0 22d80: 90 e0 ldi r25, 0x00 ; 0 22d82: 80 e0 ldi r24, 0x00 ; 0 22d84: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 22d88: 6b 01 movw r12, r22 22d8a: 7c 01 movw r14, r24 22d8c: 40 90 f1 05 lds r4, 0x05F1 ; 0x8005f1 22d90: 50 90 f2 05 lds r5, 0x05F2 ; 0x8005f2 22d94: 60 90 f3 05 lds r6, 0x05F3 ; 0x8005f3 22d98: 70 90 f4 05 lds r7, 0x05F4 ; 0x8005f4 22d9c: 60 91 ef 05 lds r22, 0x05EF ; 0x8005ef 22da0: 70 91 f0 05 lds r23, 0x05F0 ; 0x8005f0 22da4: 07 2e mov r0, r23 22da6: 00 0c add r0, r0 22da8: 88 0b sbc r24, r24 22daa: 99 0b sbc r25, r25 22dac: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22db0: ab 01 movw r20, r22 22db2: bc 01 movw r22, r24 22db4: a1 2c mov r10, r1 22db6: 93 01 movw r18, r6 22db8: 82 01 movw r16, r4 22dba: 81 e0 ldi r24, 0x01 ; 1 22dbc: 0f 94 84 11 call 0x22308 ; 0x22308 #endif #ifdef TEMP_RUNAWAY_BED_HYSTERESIS temp_runaway_check(0, target_temperature_bed_isr, current_temperature_bed_isr, soft_pwm_bed, true); 22dc0: 60 91 ee 05 lds r22, 0x05EE ; 0x8005ee 22dc4: 70 e0 ldi r23, 0x00 ; 0 22dc6: 90 e0 ldi r25, 0x00 ; 0 22dc8: 80 e0 ldi r24, 0x00 ; 0 22dca: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 22dce: 6b 01 movw r12, r22 22dd0: 7c 01 movw r14, r24 22dd2: 40 90 ea 05 lds r4, 0x05EA ; 0x8005ea 22dd6: 50 90 eb 05 lds r5, 0x05EB ; 0x8005eb 22dda: 60 90 ec 05 lds r6, 0x05EC ; 0x8005ec 22dde: 70 90 ed 05 lds r7, 0x05ED ; 0x8005ed 22de2: 60 91 e8 05 lds r22, 0x05E8 ; 0x8005e8 22de6: 70 91 e9 05 lds r23, 0x05E9 ; 0x8005e9 22dea: 07 2e mov r0, r23 22dec: 00 0c add r0, r0 22dee: 88 0b sbc r24, r24 22df0: 99 0b sbc r25, r25 22df2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 22df6: ab 01 movw r20, r22 22df8: bc 01 movw r22, r24 22dfa: aa 24 eor r10, r10 22dfc: a3 94 inc r10 22dfe: 93 01 movw r18, r6 22e00: 82 01 movw r16, r4 22e02: 80 e0 ldi r24, 0x00 ; 0 22e04: 0f 94 84 11 call 0x22308 ; 0x22308 thermal_model::log_isr(); #endif #endif // PID regulation if (pid_tuning_finished) 22e08: 80 91 41 02 lds r24, 0x0241 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> 22e0c: 81 11 cpse r24, r1 temp_mgr_pid(); 22e0e: 0e 94 82 ff call 0x1ff04 ; 0x1ff04 (void)__s; } static __inline__ void __iCliParam(const uint8_t *__s) { cli(); 22e12: f8 94 cli // run temperature management with interrupts enabled to reduce latency DISABLE_TEMP_MGR_INTERRUPT(); NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) { temp_mgr_isr(); } ENABLE_TEMP_MGR_INTERRUPT(); 22e14: 80 91 71 00 lds r24, 0x0071 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> 22e18: 82 60 ori r24, 0x02 ; 2 22e1a: 80 93 71 00 sts 0x0071, r24 ; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071> } 22e1e: ff 91 pop r31 22e20: ef 91 pop r30 22e22: df 91 pop r29 22e24: cf 91 pop r28 22e26: bf 91 pop r27 22e28: af 91 pop r26 22e2a: 9f 91 pop r25 22e2c: 8f 91 pop r24 22e2e: 7f 91 pop r23 22e30: 6f 91 pop r22 22e32: 5f 91 pop r21 22e34: 4f 91 pop r20 22e36: 3f 91 pop r19 22e38: 2f 91 pop r18 22e3a: 1f 91 pop r17 22e3c: 0f 91 pop r16 22e3e: ff 90 pop r15 22e40: ef 90 pop r14 22e42: df 90 pop r13 22e44: cf 90 pop r12 22e46: bf 90 pop r11 22e48: af 90 pop r10 22e4a: 9f 90 pop r9 22e4c: 8f 90 pop r8 22e4e: 7f 90 pop r7 22e50: 6f 90 pop r6 22e52: 5f 90 pop r5 22e54: 4f 90 pop r4 22e56: 0f 90 pop r0 22e58: 0b be out 0x3b, r0 ; 59 22e5a: 0f 90 pop r0 22e5c: 0f be out 0x3f, r0 ; 63 22e5e: 0f 90 pop r0 22e60: 1f 90 pop r1 22e62: 18 95 reti check_min_temp_heater0(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active } } else { // ~ nozzle heating is off oTimer4minTempHeater.start(); 22e64: 84 ee ldi r24, 0xE4 ; 228 22e66: 95 e0 ldi r25, 0x05 ; 5 22e68: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> bCheckingOnHeater=false; 22e6c: 10 92 e7 05 sts 0x05E7, r1 ; 0x8005e7 22e70: 4e cf rjmp .-356 ; 0x22d0e <__vector_32+0x184> check_min_temp_bed(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active } } else { // ~ bed heating is off oTimer4minTempBed.start(); 22e72: 80 ee ldi r24, 0xE0 ; 224 22e74: 95 e0 ldi r25, 0x05 ; 5 22e76: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> bCheckingOnBed=false; 22e7a: 10 92 e3 05 sts 0x05E3, r1 ; 0x8005e3 22e7e: 7d cf rjmp .-262 ; 0x22d7a <__vector_32+0x1f0> 00022e80 : void updatePID() { // TODO: iState_sum_max and PID values should be synchronized for temp_mgr_isr #ifdef PIDTEMP for(uint_least8_t e = 0; e < EXTRUDERS; e++) { iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki; 22e80: 20 91 d3 0d lds r18, 0x0DD3 ; 0x800dd3 22e84: 30 91 d4 0d lds r19, 0x0DD4 ; 0x800dd4 22e88: 40 91 d5 0d lds r20, 0x0DD5 ; 0x800dd5 22e8c: 50 91 d6 0d lds r21, 0x0DD6 ; 0x800dd6 22e90: 60 e0 ldi r22, 0x00 ; 0 22e92: 70 e0 ldi r23, 0x00 ; 0 22e94: 8f e7 ldi r24, 0x7F ; 127 22e96: 93 e4 ldi r25, 0x43 ; 67 22e98: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 22e9c: 60 93 18 04 sts 0x0418, r22 ; 0x800418 <_ZL14iState_sum_max.lto_priv.435> 22ea0: 70 93 19 04 sts 0x0419, r23 ; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1> 22ea4: 80 93 1a 04 sts 0x041A, r24 ; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2> 22ea8: 90 93 1b 04 sts 0x041B, r25 ; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3> } #endif #ifdef PIDTEMPBED temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi; 22eac: 20 91 df 0d lds r18, 0x0DDF ; 0x800ddf 22eb0: 30 91 e0 0d lds r19, 0x0DE0 ; 0x800de0 22eb4: 40 91 e1 0d lds r20, 0x0DE1 ; 0x800de1 22eb8: 50 91 e2 0d lds r21, 0x0DE2 ; 0x800de2 22ebc: 60 e0 ldi r22, 0x00 ; 0 22ebe: 70 e0 ldi r23, 0x00 ; 0 22ec0: 8f e7 ldi r24, 0x7F ; 127 22ec2: 93 e4 ldi r25, 0x43 ; 67 22ec4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 22ec8: 60 93 10 04 sts 0x0410, r22 ; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433> 22ecc: 70 93 11 04 sts 0x0411, r23 ; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1> 22ed0: 80 93 12 04 sts 0x0412, r24 ; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2> 22ed4: 90 93 13 04 sts 0x0413, r25 ; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3> #endif } 22ed8: 08 95 ret 00022eda : startTimestamp = 0; stopTimestamp = 0; accumulator = 0; } uint32_t Stopwatch::duration() { 22eda: 0f 93 push r16 22edc: 1f 93 push r17 return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp); 22ede: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 22ee2: 81 30 cpi r24, 0x01 ; 1 22ee4: 19 f5 brne .+70 ; 0x22f2c 22ee6: 0f 94 f0 0d call 0x21be0 ; 0x21be0 22eea: 00 91 7c 05 lds r16, 0x057C ; 0x80057c 22eee: 10 91 7d 05 lds r17, 0x057D ; 0x80057d 22ef2: 20 91 7e 05 lds r18, 0x057E ; 0x80057e 22ef6: 30 91 7f 05 lds r19, 0x057F ; 0x80057f 22efa: 60 1b sub r22, r16 22efc: 71 0b sbc r23, r17 22efe: 82 0b sbc r24, r18 22f00: 93 0b sbc r25, r19 22f02: 28 ee ldi r18, 0xE8 ; 232 22f04: 33 e0 ldi r19, 0x03 ; 3 22f06: 40 e0 ldi r20, 0x00 ; 0 22f08: 50 e0 ldi r21, 0x00 ; 0 22f0a: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 22f0e: 60 91 78 05 lds r22, 0x0578 ; 0x800578 22f12: 70 91 79 05 lds r23, 0x0579 ; 0x800579 22f16: 80 91 7a 05 lds r24, 0x057A ; 0x80057a 22f1a: 90 91 7b 05 lds r25, 0x057B ; 0x80057b 22f1e: 62 0f add r22, r18 22f20: 73 1f adc r23, r19 22f22: 84 1f adc r24, r20 22f24: 95 1f adc r25, r21 } 22f26: 1f 91 pop r17 22f28: 0f 91 pop r16 22f2a: 08 95 ret stopTimestamp = 0; accumulator = 0; } uint32_t Stopwatch::duration() { return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp); 22f2c: 60 91 0b 06 lds r22, 0x060B ; 0x80060b 22f30: 70 91 0c 06 lds r23, 0x060C ; 0x80060c 22f34: 80 91 0d 06 lds r24, 0x060D ; 0x80060d 22f38: 90 91 0e 06 lds r25, 0x060E ; 0x80060e 22f3c: d6 cf rjmp .-84 ; 0x22eea 00022f3e : //! |Total print time: | MSG_TOTAL_PRINT_TIME c=19 //! | 00d 00h 00m | //! ---------------------- //! @endcode void lcd_menu_statistics() { 22f3e: 4f 92 push r4 22f40: 5f 92 push r5 22f42: 6f 92 push r6 22f44: 7f 92 push r7 22f46: 8f 92 push r8 22f48: 9f 92 push r9 22f4a: af 92 push r10 22f4c: bf 92 push r11 22f4e: cf 92 push r12 22f50: df 92 push r13 22f52: ef 92 push r14 22f54: ff 92 push r15 22f56: 0f 93 push r16 22f58: 1f 93 push r17 22f5a: cf 93 push r28 22f5c: df 93 push r29 22f5e: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); //infinite timeout if (printJobOngoing()) 22f62: 0e 94 40 66 call 0xcc80 ; 0xcc80 22f66: 88 23 and r24, r24 22f68: 09 f4 brne .+2 ; 0x22f6c 22f6a: 6e c0 rjmp .+220 ; 0x23048 { const float _met = ((float)total_filament_used) / (100000.f); 22f6c: 60 91 17 06 lds r22, 0x0617 ; 0x800617 22f70: 70 91 18 06 lds r23, 0x0618 ; 0x800618 22f74: 80 91 19 06 lds r24, 0x0619 ; 0x800619 22f78: 90 91 1a 06 lds r25, 0x061A ; 0x80061a 22f7c: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 22f80: 20 e0 ldi r18, 0x00 ; 0 22f82: 30 e5 ldi r19, 0x50 ; 80 22f84: 43 ec ldi r20, 0xC3 ; 195 22f86: 57 e4 ldi r21, 0x47 ; 71 22f88: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 22f8c: 56 2e mov r5, r22 22f8e: 47 2e mov r4, r23 22f90: ec 01 movw r28, r24 const uint32_t _t = print_job_timer.duration(); 22f92: 0f 94 6d 17 call 0x22eda ; 0x22eda 22f96: 6b 01 movw r12, r22 22f98: 7c 01 movw r14, r24 const uint32_t _h = (_t / 60) / 60; const uint8_t _m = (_t / 60) % 60; const uint8_t _s = _t % 60; lcd_home(); 22f9a: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(_N( 22f9e: 8f ec ldi r24, 0xCF ; 207 22fa0: 98 e5 ldi r25, 0x58 ; 88 22fa2: 0e 94 3a 75 call 0xea74 ; 0xea74 22fa6: 18 2f mov r17, r24 22fa8: 09 2f mov r16, r25 22faa: 8f eb ldi r24, 0xBF ; 191 22fac: 98 e5 ldi r25, 0x58 ; 88 22fae: 0e 94 3a 75 call 0xea74 ; 0xea74 22fb2: 78 2e mov r7, r24 22fb4: 69 2e mov r6, r25 const float _met = ((float)total_filament_used) / (100000.f); const uint32_t _t = print_job_timer.duration(); const uint32_t _h = (_t / 60) / 60; const uint8_t _m = (_t / 60) % 60; const uint8_t _s = _t % 60; 22fb6: 8c e3 ldi r24, 0x3C ; 60 22fb8: 88 2e mov r8, r24 22fba: 91 2c mov r9, r1 22fbc: a1 2c mov r10, r1 22fbe: b1 2c mov r11, r1 22fc0: c7 01 movw r24, r14 22fc2: b6 01 movw r22, r12 22fc4: a5 01 movw r20, r10 22fc6: 94 01 movw r18, r8 22fc8: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> lcd_home(); lcd_printf_P(_N( 22fcc: 7f 93 push r23 22fce: 6f 93 push r22 { const float _met = ((float)total_filament_used) / (100000.f); const uint32_t _t = print_job_timer.duration(); const uint32_t _h = (_t / 60) / 60; const uint8_t _m = (_t / 60) % 60; 22fd0: ca 01 movw r24, r20 22fd2: b9 01 movw r22, r18 22fd4: a5 01 movw r20, r10 22fd6: 94 01 movw r18, r8 22fd8: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> const uint8_t _s = _t % 60; lcd_home(); lcd_printf_P(_N( 22fdc: 7f 93 push r23 22fde: 6f 93 push r22 if (printJobOngoing()) { const float _met = ((float)total_filament_used) / (100000.f); const uint32_t _t = print_job_timer.duration(); const uint32_t _h = (_t / 60) / 60; 22fe0: c7 01 movw r24, r14 22fe2: b6 01 movw r22, r12 22fe4: 20 e1 ldi r18, 0x10 ; 16 22fe6: 3e e0 ldi r19, 0x0E ; 14 22fe8: 40 e0 ldi r20, 0x00 ; 0 22fea: 50 e0 ldi r21, 0x00 ; 0 22fec: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> const uint8_t _m = (_t / 60) % 60; const uint8_t _s = _t % 60; lcd_home(); lcd_printf_P(_N( 22ff0: 5f 93 push r21 22ff2: 4f 93 push r20 22ff4: 3f 93 push r19 22ff6: 2f 93 push r18 22ff8: 0f 93 push r16 22ffa: 1f 93 push r17 22ffc: df 93 push r29 22ffe: cf 93 push r28 23000: 4f 92 push r4 23002: 5f 92 push r5 23004: 6f 92 push r6 23006: 7f 92 push r7 23008: 81 e4 ldi r24, 0x41 ; 65 2300a: 9b e6 ldi r25, 0x6B ; 107 2300c: 9f 93 push r25 2300e: 8f 93 push r24 23010: 0e 94 0b 6f call 0xde16 ; 0xde16 "%S:\n" "%10ldh %02dm %02ds" ), _T(MSG_FILAMENT_USED), _met, _T(MSG_PRINT_TIME), _h, _m, _s); menu_back_if_clicked(); 23014: 8d b7 in r24, 0x3d ; 61 23016: 9e b7 in r25, 0x3e ; 62 23018: 42 96 adiw r24, 0x12 ; 18 2301a: 0f b6 in r0, 0x3f ; 63 2301c: f8 94 cli 2301e: 9e bf out 0x3e, r25 ; 62 23020: 0f be out 0x3f, r0 ; 63 23022: 8d bf out 0x3d, r24 ; 61 ), _T(MSG_TOTAL_FILAMENT), _filament_m, _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes); menu_back_if_clicked(); } } 23024: df 91 pop r29 23026: cf 91 pop r28 23028: 1f 91 pop r17 2302a: 0f 91 pop r16 2302c: ff 90 pop r15 2302e: ef 90 pop r14 23030: df 90 pop r13 23032: cf 90 pop r12 23034: bf 90 pop r11 23036: af 90 pop r10 23038: 9f 90 pop r9 2303a: 8f 90 pop r8 2303c: 7f 90 pop r7 2303e: 6f 90 pop r6 23040: 5f 90 pop r5 23042: 4f 90 pop r4 "%S:\n" "%10ldd %02dh %02dm" ), _T(MSG_TOTAL_FILAMENT), _filament_m, _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes); menu_back_if_clicked(); 23044: 0c 94 06 74 jmp 0xe80c ; 0xe80c _T(MSG_PRINT_TIME), _h, _m, _s); menu_back_if_clicked(); } else { uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters 23048: 81 ef ldi r24, 0xF1 ; 241 2304a: 9f e0 ldi r25, 0x0F ; 15 2304c: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 23050: 2b 01 movw r4, r22 23052: 3c 01 movw r6, r24 uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes 23054: 8d ee ldi r24, 0xED ; 237 23056: 9f e0 ldi r25, 0x0F ; 15 23058: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 2305c: 6b 01 movw r12, r22 2305e: 7c 01 movw r14, r24 float _filament_m = (float)_filament/100; _days = (_time / 60) / 24; _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); 23060: 0e 94 1f 70 call 0xe03e ; 0xe03e lcd_printf_P(_N( 23064: 8c ea ldi r24, 0xAC ; 172 23066: 98 e5 ldi r25, 0x58 ; 88 23068: 0e 94 3a 75 call 0xea74 ; 0xea74 2306c: 98 2e mov r9, r24 2306e: 89 2e mov r8, r25 23070: 8b e9 ldi r24, 0x9B ; 155 23072: 98 e5 ldi r25, 0x58 ; 88 23074: 0e 94 3a 75 call 0xea74 ; 0xea74 23078: b8 2e mov r11, r24 2307a: a9 2e mov r10, r25 uint8_t _hours, _minutes; uint32_t _days; float _filament_m = (float)_filament/100; _days = (_time / 60) / 24; _hours = (_time / 60) % 24; _minutes = _time % 60; 2307c: c7 01 movw r24, r14 2307e: b6 01 movw r22, r12 23080: 2c e3 ldi r18, 0x3C ; 60 23082: 30 e0 ldi r19, 0x00 ; 0 23084: 40 e0 ldi r20, 0x00 ; 0 23086: 50 e0 ldi r21, 0x00 ; 0 23088: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> lcd_home(); lcd_printf_P(_N( 2308c: 7f 93 push r23 2308e: 6f 93 push r22 uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes uint8_t _hours, _minutes; uint32_t _days; float _filament_m = (float)_filament/100; _days = (_time / 60) / 24; _hours = (_time / 60) % 24; 23090: ca 01 movw r24, r20 23092: b9 01 movw r22, r18 23094: 28 e1 ldi r18, 0x18 ; 24 23096: 30 e0 ldi r19, 0x00 ; 0 23098: 40 e0 ldi r20, 0x00 ; 0 2309a: 50 e0 ldi r21, 0x00 ; 0 2309c: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 230a0: 7f 93 push r23 230a2: 6f 93 push r22 uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes uint8_t _hours, _minutes; uint32_t _days; float _filament_m = (float)_filament/100; _days = (_time / 60) / 24; 230a4: c7 01 movw r24, r14 230a6: b6 01 movw r22, r12 230a8: 20 ea ldi r18, 0xA0 ; 160 230aa: 35 e0 ldi r19, 0x05 ; 5 230ac: 40 e0 ldi r20, 0x00 ; 0 230ae: 50 e0 ldi r21, 0x00 ; 0 230b0: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 230b4: 5f 93 push r21 230b6: 4f 93 push r20 230b8: 3f 93 push r19 230ba: 2f 93 push r18 230bc: 8f 92 push r8 230be: 9f 92 push r9 { uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes uint8_t _hours, _minutes; uint32_t _days; float _filament_m = (float)_filament/100; 230c0: c3 01 movw r24, r6 230c2: b2 01 movw r22, r4 230c4: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 230c8: 20 e0 ldi r18, 0x00 ; 0 230ca: 30 e0 ldi r19, 0x00 ; 0 230cc: 48 ec ldi r20, 0xC8 ; 200 230ce: 52 e4 ldi r21, 0x42 ; 66 230d0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> _days = (_time / 60) / 24; _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 230d4: 9f 93 push r25 230d6: 8f 93 push r24 230d8: 7f 93 push r23 230da: 6f 93 push r22 230dc: af 92 push r10 230de: bf 92 push r11 230e0: 8d e1 ldi r24, 0x1D ; 29 230e2: 9b e6 ldi r25, 0x6B ; 107 230e4: 9f 93 push r25 230e6: 8f 93 push r24 230e8: 0e 94 0b 6f call 0xde16 ; 0xde16 "%S:\n" "%10ldd %02dh %02dm" ), _T(MSG_TOTAL_FILAMENT), _filament_m, _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes); menu_back_if_clicked(); 230ec: 8d b7 in r24, 0x3d ; 61 230ee: 9e b7 in r25, 0x3e ; 62 230f0: 42 96 adiw r24, 0x12 ; 18 230f2: 0f b6 in r0, 0x3f ; 63 230f4: f8 94 cli 230f6: 9e bf out 0x3e, r25 ; 62 230f8: 0f be out 0x3f, r0 ; 63 230fa: 8d bf out 0x3d, r24 ; 61 230fc: 93 cf rjmp .-218 ; 0x23024 000230fe : SERIAL_ECHO(c); SERIAL_ECHO(']'); prusa_stat_farm_number(); } static void prusa_statistics_case0(uint8_t statnr) { 230fe: cf 93 push r28 23100: c8 2f mov r28, r24 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 23102: 8b e7 ldi r24, 0x7B ; 123 23104: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_ECHO('{'); prusa_stat_printerstatus(statnr); 23108: 8c 2f mov r24, r28 2310a: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 2310e: 0f 94 50 08 call 0x210a0 ; 0x210a0 SERIAL_ECHO(current_temperature_bed); SERIAL_ECHO(']'); } static void prusa_stat_printinfo() { SERIAL_ECHOPGM("[TFU:"); 23112: 86 e1 ldi r24, 0x16 ; 22 23114: 99 e8 ldi r25, 0x89 ; 137 23116: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 2311a: 60 91 17 06 lds r22, 0x0617 ; 0x800617 2311e: 70 91 18 06 lds r23, 0x0618 ; 0x800618 23122: 80 91 19 06 lds r24, 0x0619 ; 0x800619 23126: 90 91 1a 06 lds r25, 0x061A ; 0x80061a 2312a: 4a e0 ldi r20, 0x0A ; 10 2312c: 0e 94 c5 79 call 0xf38a ; 0xf38a SERIAL_ECHO(total_filament_used); SERIAL_ECHOPGM("][PCD:"); 23130: 8f e0 ldi r24, 0x0F ; 15 23132: 99 e8 ldi r25, 0x89 ; 137 23134: 0e 94 c4 7a call 0xf588 ; 0xf588 int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; 23138: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 2313c: 88 23 and r24, r24 2313e: 09 f4 brne .+2 ; 0x23142 23140: 5e c0 rjmp .+188 ; 0x231fe 23142: 80 91 e4 16 lds r24, 0x16E4 ; 0x8016e4 23146: 90 91 e5 16 lds r25, 0x16E5 ; 0x8016e5 2314a: a0 91 e6 16 lds r26, 0x16E6 ; 0x8016e6 2314e: b0 91 e7 16 lds r27, 0x16E7 ; 0x8016e7 23152: 00 97 sbiw r24, 0x00 ; 0 23154: a1 05 cpc r26, r1 23156: b1 05 cpc r27, r1 23158: 09 f4 brne .+2 ; 0x2315c 2315a: 51 c0 rjmp .+162 ; 0x231fe 2315c: bc 01 movw r22, r24 2315e: cd 01 movw r24, r26 23160: 6d 59 subi r22, 0x9D ; 157 23162: 7f 4f sbci r23, 0xFF ; 255 23164: 8f 4f sbci r24, 0xFF ; 255 23166: 9f 4f sbci r25, 0xFF ; 255 23168: 24 e6 ldi r18, 0x64 ; 100 2316a: 30 e0 ldi r19, 0x00 ; 0 2316c: 40 e0 ldi r20, 0x00 ; 0 2316e: 50 e0 ldi r21, 0x00 ; 0 23170: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 23174: 60 91 eb 16 lds r22, 0x16EB ; 0x8016eb 23178: 70 91 ec 16 lds r23, 0x16EC ; 0x8016ec 2317c: 80 91 ed 16 lds r24, 0x16ED ; 0x8016ed 23180: 90 91 ee 16 lds r25, 0x16EE ; 0x8016ee 23184: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 23188: 62 2f mov r22, r18 2318a: 70 e0 ldi r23, 0x00 ; 0 2318c: 90 e0 ldi r25, 0x00 ; 0 2318e: 80 e0 ldi r24, 0x00 ; 0 23190: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO((int)card.percentDone()); SERIAL_ECHOPGM("][FEM:"); 23194: 88 e0 ldi r24, 0x08 ; 8 23196: 99 e8 ldi r25, 0x89 ; 137 23198: 0e 94 c4 7a call 0xf588 ; 0xf588 2319c: 60 91 8e 02 lds r22, 0x028E ; 0x80028e 231a0: 70 91 8f 02 lds r23, 0x028F ; 0x80028f 231a4: 07 2e mov r0, r23 231a6: 00 0c add r0, r0 231a8: 88 0b sbc r24, r24 231aa: 99 0b sbc r25, r25 231ac: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_ECHO(feedmultiply); SERIAL_ECHOPGM("][FNM:"); 231b0: 81 e0 ldi r24, 0x01 ; 1 231b2: 99 e8 ldi r25, 0x89 ; 137 231b4: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(card.longFilename[0] ? card.longFilename : card.filename); 231b8: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 231bc: 81 11 cpse r24, r1 231be: 21 c0 rjmp .+66 ; 0x23202 231c0: 89 ed ldi r24, 0xD9 ; 217 231c2: 93 e1 ldi r25, 0x13 ; 19 } }*/ static FORCE_INLINE void print(const char *str) { write(str); 231c4: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHOPGM("][TIM:"); 231c8: 8a ef ldi r24, 0xFA ; 250 231ca: 98 e8 ldi r25, 0x88 ; 136 231cc: 0e 94 c4 7a call 0xf588 ; 0xf588 if (print_job_timer.isRunning()) { 231d0: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 231d4: 81 30 cpi r24, 0x01 ; 1 231d6: c1 f4 brne .+48 ; 0x23208 SERIAL_ECHO(print_job_timer.duration()); 231d8: 0f 94 6d 17 call 0x22eda ; 0x22eda } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 231dc: 4a e0 ldi r20, 0x0A ; 10 231de: 0e 94 c5 79 call 0xf38a ; 0xf38a } else { SERIAL_ECHO(0); } SERIAL_ECHOPGM("][FWR:"); 231e2: 83 ef ldi r24, 0xF3 ; 243 231e4: 98 e8 ldi r25, 0x88 ; 136 231e6: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(FW_VERSION_STR_P()); 231ea: 8c ee ldi r24, 0xEC ; 236 231ec: 98 e8 ldi r25, 0x88 ; 136 231ee: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 231f2: 8d e5 ldi r24, 0x5D ; 93 231f4: 0e 94 b1 79 call 0xf362 ; 0xf362 static void prusa_statistics_case0(uint8_t statnr) { SERIAL_ECHO('{'); prusa_stat_printerstatus(statnr); prusa_stat_farm_number(); prusa_stat_printinfo(); } 231f8: cf 91 pop r28 SERIAL_ECHO(0); } SERIAL_ECHOPGM("][FWR:"); SERIAL_ECHORPGM(FW_VERSION_STR_P()); SERIAL_ECHO(']'); prusa_stat_diameter(); 231fa: 0d 94 c5 08 jmp 0x2118a ; 0x2118a 231fe: 20 e0 ldi r18, 0x00 ; 0 23200: c3 cf rjmp .-122 ; 0x23188 SERIAL_ECHOPGM("][PCD:"); SERIAL_ECHO((int)card.percentDone()); SERIAL_ECHOPGM("][FEM:"); SERIAL_ECHO(feedmultiply); SERIAL_ECHOPGM("][FNM:"); SERIAL_ECHO(card.longFilename[0] ? card.longFilename : card.filename); 23202: 8e ee ldi r24, 0xEE ; 238 23204: 93 e1 ldi r25, 0x13 ; 19 23206: de cf rjmp .-68 ; 0x231c4 23208: 60 e0 ldi r22, 0x00 ; 0 2320a: 70 e0 ldi r23, 0x00 ; 0 2320c: cb 01 movw r24, r22 2320e: 0e 94 2a 7a call 0xf454 ; 0xf454 23212: e7 cf rjmp .-50 ; 0x231e2 00023214 : reset(); if ((accumulator = with_time)) state = RUNNING; } void Stopwatch::reset() { state = STOPPED; 23214: 10 92 8b 03 sts 0x038B, r1 ; 0x80038b startTimestamp = 0; 23218: 10 92 7c 05 sts 0x057C, r1 ; 0x80057c 2321c: 10 92 7d 05 sts 0x057D, r1 ; 0x80057d 23220: 10 92 7e 05 sts 0x057E, r1 ; 0x80057e 23224: 10 92 7f 05 sts 0x057F, r1 ; 0x80057f stopTimestamp = 0; 23228: 10 92 0b 06 sts 0x060B, r1 ; 0x80060b 2322c: 10 92 0c 06 sts 0x060C, r1 ; 0x80060c 23230: 10 92 0d 06 sts 0x060D, r1 ; 0x80060d 23234: 10 92 0e 06 sts 0x060E, r1 ; 0x80060e accumulator = 0; 23238: 10 92 78 05 sts 0x0578, r1 ; 0x800578 2323c: 10 92 79 05 sts 0x0579, r1 ; 0x800579 23240: 10 92 7a 05 sts 0x057A, r1 ; 0x80057a 23244: 10 92 7b 05 sts 0x057B, r1 ; 0x80057b } 23248: 08 95 ret 0002324a : /** * @brief Check if the timer is running * @details Return true if the timer is currently running, false otherwise. * @return true if stopwatch is running */ FORCE_INLINE static bool isRunning() { return state == RUNNING; } 2324a: 80 91 8b 03 lds r24, 0x038B ; 0x80038b } else return false; } bool Stopwatch::start() { if (!isRunning()) { 2324e: 81 30 cpi r24, 0x01 ; 1 23250: f1 f0 breq .+60 ; 0x2328e if (isPaused()) accumulator = duration(); 23252: 82 30 cpi r24, 0x02 ; 2 23254: c9 f4 brne .+50 ; 0x23288 23256: 0f 94 6d 17 call 0x22eda ; 0x22eda 2325a: 60 93 78 05 sts 0x0578, r22 ; 0x800578 2325e: 70 93 79 05 sts 0x0579, r23 ; 0x800579 23262: 80 93 7a 05 sts 0x057A, r24 ; 0x80057a 23266: 90 93 7b 05 sts 0x057B, r25 ; 0x80057b else reset(); state = RUNNING; 2326a: 81 e0 ldi r24, 0x01 ; 1 2326c: 80 93 8b 03 sts 0x038B, r24 ; 0x80038b startTimestamp = _millis(); 23270: 0f 94 f0 0d call 0x21be0 ; 0x21be0 23274: 60 93 7c 05 sts 0x057C, r22 ; 0x80057c 23278: 70 93 7d 05 sts 0x057D, r23 ; 0x80057d 2327c: 80 93 7e 05 sts 0x057E, r24 ; 0x80057e 23280: 90 93 7f 05 sts 0x057F, r25 ; 0x80057f 23284: 81 e0 ldi r24, 0x01 ; 1 23286: 08 95 ret } bool Stopwatch::start() { if (!isRunning()) { if (isPaused()) accumulator = duration(); else reset(); 23288: 0f 94 0a 19 call 0x23214 ; 0x23214 2328c: ee cf rjmp .-36 ; 0x2326a state = RUNNING; startTimestamp = _millis(); return true; } else return false; 2328e: 80 e0 ldi r24, 0x00 ; 0 } 23290: 08 95 ret 00023292 : uint32_t Stopwatch::accumulator; uint32_t Stopwatch::startTimestamp; uint32_t Stopwatch::stopTimestamp; bool Stopwatch::stop() { if (isRunning() || isPaused()) { 23292: 80 91 8b 03 lds r24, 0x038B ; 0x80038b 23296: 81 50 subi r24, 0x01 ; 1 23298: 82 30 cpi r24, 0x02 ; 2 2329a: 70 f4 brcc .+28 ; 0x232b8 state = STOPPED; 2329c: 10 92 8b 03 sts 0x038B, r1 ; 0x80038b stopTimestamp = _millis(); 232a0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 232a4: 60 93 0b 06 sts 0x060B, r22 ; 0x80060b 232a8: 70 93 0c 06 sts 0x060C, r23 ; 0x80060c 232ac: 80 93 0d 06 sts 0x060D, r24 ; 0x80060d 232b0: 90 93 0e 06 sts 0x060E, r25 ; 0x80060e 232b4: 81 e0 ldi r24, 0x01 ; 1 232b6: 08 95 ret return true; } else return false; 232b8: 80 e0 ldi r24, 0x00 ; 0 } 232ba: 08 95 ret 000232bc : #ifdef MOTOR_CURRENT_PWM_XY_PIN void st_current_set(uint8_t driver, int current) { if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); 232bc: 2f ef ldi r18, 0xFF ; 255 232be: 30 e0 ldi r19, 0x00 ; 0 232c0: dc 01 movw r26, r24 232c2: 0f 94 00 a5 call 0x34a00 ; 0x34a00 <__usmulhisi3> 232c6: 20 ed ldi r18, 0xD0 ; 208 232c8: 37 e0 ldi r19, 0x07 ; 7 232ca: 40 e0 ldi r20, 0x00 ; 0 232cc: 50 e0 ldi r21, 0x00 ; 0 232ce: 0f 94 d1 a4 call 0x349a2 ; 0x349a2 <__divmodsi4> 232d2: b9 01 movw r22, r18 232d4: 8c e2 ldi r24, 0x2C ; 44 232d6: 0c 94 6e d3 jmp 0x1a6dc ; 0x1a6dc 000232da : case 16: microstep_ms(driver,MICROSTEP16); break; } } void microstep_readings() { 232da: cf 93 push r28 232dc: df 93 push r29 SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); 232de: 85 ea ldi r24, 0xA5 ; 165 232e0: 93 e9 ldi r25, 0x93 ; 147 232e2: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLPGM("X: "); 232e6: 81 ea ldi r24, 0xA1 ; 161 232e8: 93 e9 ldi r25, 0x93 ; 147 232ea: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL( READ(X_MS1_PIN)); 232ee: 62 b3 in r22, 0x12 ; 18 232f0: 66 95 lsr r22 232f2: 61 70 andi r22, 0x01 ; 1 232f4: 70 e0 ldi r23, 0x00 ; 0 232f6: 90 e0 ldi r25, 0x00 ; 0 232f8: 80 e0 ldi r24, 0x00 ; 0 232fa: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLLN( READ(X_MS2_PIN)); 232fe: 82 b3 in r24, 0x12 ; 18 23300: 81 70 andi r24, 0x01 ; 1 23302: 90 e0 ldi r25, 0x00 ; 0 23304: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e SERIAL_PROTOCOLPGM("Y: "); 23308: 8d e9 ldi r24, 0x9D ; 157 2330a: 93 e9 ldi r25, 0x93 ; 147 2330c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL( READ(Y_MS1_PIN)); 23310: c6 e0 ldi r28, 0x06 ; 6 23312: d1 e0 ldi r29, 0x01 ; 1 23314: 68 81 ld r22, Y 23316: 06 2e mov r0, r22 23318: 00 0c add r0, r0 2331a: 77 0b sbc r23, r23 2331c: 88 0b sbc r24, r24 2331e: 99 0b sbc r25, r25 23320: 66 27 eor r22, r22 23322: 97 fd sbrc r25, 7 23324: 63 95 inc r22 23326: 77 27 eor r23, r23 23328: 88 27 eor r24, r24 2332a: 99 27 eor r25, r25 2332c: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLLN( READ(Y_MS2_PIN)); 23330: 82 b3 in r24, 0x12 ; 18 23332: 82 fb bst r24, 2 23334: 88 27 eor r24, r24 23336: 80 f9 bld r24, 0 23338: 90 e0 ldi r25, 0x00 ; 0 2333a: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e SERIAL_PROTOCOLPGM("Z: "); 2333e: 89 e9 ldi r24, 0x99 ; 153 23340: 93 e9 ldi r25, 0x93 ; 147 23342: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL( READ(Z_MS1_PIN)); 23346: 68 81 ld r22, Y 23348: 66 fb bst r22, 6 2334a: 66 27 eor r22, r22 2334c: 60 f9 bld r22, 0 2334e: 70 e0 ldi r23, 0x00 ; 0 23350: 90 e0 ldi r25, 0x00 ; 0 23352: 80 e0 ldi r24, 0x00 ; 0 23354: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLLN( READ(Z_MS2_PIN)); 23358: 88 81 ld r24, Y 2335a: 85 fb bst r24, 5 2335c: 88 27 eor r24, r24 2335e: 80 f9 bld r24, 0 23360: 90 e0 ldi r25, 0x00 ; 0 23362: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e SERIAL_PROTOCOLPGM("E0: "); 23366: 84 e9 ldi r24, 0x94 ; 148 23368: 93 e9 ldi r25, 0x93 ; 147 2336a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOL( READ(E0_MS1_PIN)); 2336e: 68 81 ld r22, Y 23370: 63 fb bst r22, 3 23372: 66 27 eor r22, r22 23374: 60 f9 bld r22, 0 23376: 70 e0 ldi r23, 0x00 ; 0 23378: 90 e0 ldi r25, 0x00 ; 0 2337a: 80 e0 ldi r24, 0x00 ; 0 2337c: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLLN( READ(E0_MS2_PIN)); 23380: 88 81 ld r24, Y 23382: 82 95 swap r24 23384: 81 70 andi r24, 0x01 ; 1 23386: 90 e0 ldi r25, 0x00 ; 0 #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 SERIAL_PROTOCOLPGM("E1: "); SERIAL_PROTOCOL( READ(E1_MS1_PIN)); SERIAL_PROTOCOLLN( READ(E1_MS2_PIN)); #endif } 23388: df 91 pop r29 2338a: cf 91 pop r28 SERIAL_PROTOCOLPGM("Z: "); SERIAL_PROTOCOL( READ(Z_MS1_PIN)); SERIAL_PROTOCOLLN( READ(Z_MS2_PIN)); SERIAL_PROTOCOLPGM("E0: "); SERIAL_PROTOCOL( READ(E0_MS1_PIN)); SERIAL_PROTOCOLLN( READ(E0_MS2_PIN)); 2338c: 0d 94 bf 65 jmp 0x2cb7e ; 0x2cb7e 00023390 : #endif } void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { if(ms1 > -1) switch(driver) 23390: 67 fd sbrc r22, 7 23392: 08 c0 rjmp .+16 ; 0x233a4 23394: 81 30 cpi r24, 0x01 ; 1 23396: 21 f1 breq .+72 ; 0x233e0 23398: d8 f0 brcs .+54 ; 0x233d0 2339a: 82 30 cpi r24, 0x02 ; 2 2339c: 99 f1 breq .+102 ; 0x23404 2339e: 83 30 cpi r24, 0x03 ; 3 233a0: 09 f4 brne .+2 ; 0x233a4 233a2: 42 c0 rjmp .+132 ; 0x23428 case 3: WRITE(E0_MS1_PIN,ms1); break; #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) 233a4: 47 fd sbrc r20, 7 233a6: 4c c0 rjmp .+152 ; 0x23440 233a8: 81 30 cpi r24, 0x01 ; 1 233aa: 09 f4 brne .+2 ; 0x233ae 233ac: 55 c0 rjmp .+170 ; 0x23458 233ae: 08 f4 brcc .+2 ; 0x233b2 233b0: 4d c0 rjmp .+154 ; 0x2344c 233b2: 82 30 cpi r24, 0x02 ; 2 233b4: 09 f4 brne .+2 ; 0x233b8 233b6: 56 c0 rjmp .+172 ; 0x23464 233b8: 83 30 cpi r24, 0x03 ; 3 233ba: 09 f0 breq .+2 ; 0x233be 233bc: 41 c0 rjmp .+130 ; 0x23440 { case 0: WRITE( X_MS2_PIN,ms2); break; case 1: WRITE( Y_MS2_PIN,ms2); break; case 2: WRITE( Z_MS2_PIN,ms2); break; case 3: WRITE(E0_MS2_PIN,ms2); break; 233be: 9f b7 in r25, 0x3f ; 63 233c0: 44 23 and r20, r20 233c2: 09 f4 brne .+2 ; 0x233c6 233c4: 5f c0 rjmp .+190 ; 0x23484 233c6: f8 94 cli 233c8: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 233cc: 80 61 ori r24, 0x10 ; 16 233ce: 51 c0 rjmp .+162 ; 0x23472 void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { if(ms1 > -1) switch(driver) { case 0: WRITE( X_MS1_PIN,ms1); break; 233d0: 66 23 and r22, r22 233d2: 21 f0 breq .+8 ; 0x233dc 233d4: a1 9a sbi 0x14, 1 ; 20 case 3: WRITE(E0_MS1_PIN,ms1); break; #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) 233d6: 47 ff sbrs r20, 7 233d8: 39 c0 rjmp .+114 ; 0x2344c 233da: 08 95 ret void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { if(ms1 > -1) switch(driver) { case 0: WRITE( X_MS1_PIN,ms1); break; 233dc: a1 98 cbi 0x14, 1 ; 20 233de: fb cf rjmp .-10 ; 0x233d6 case 1: WRITE( Y_MS1_PIN,ms1); break; 233e0: 9f b7 in r25, 0x3f ; 63 233e2: 66 23 and r22, r22 233e4: 51 f0 breq .+20 ; 0x233fa 233e6: f8 94 cli 233e8: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 233ec: 80 68 ori r24, 0x80 ; 128 233ee: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 233f2: 9f bf out 0x3f, r25 ; 63 case 3: WRITE(E0_MS1_PIN,ms1); break; #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) 233f4: 47 ff sbrs r20, 7 233f6: 30 c0 rjmp .+96 ; 0x23458 233f8: 08 95 ret void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { if(ms1 > -1) switch(driver) { case 0: WRITE( X_MS1_PIN,ms1); break; case 1: WRITE( Y_MS1_PIN,ms1); break; 233fa: f8 94 cli 233fc: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23400: 8f 77 andi r24, 0x7F ; 127 23402: f5 cf rjmp .-22 ; 0x233ee case 2: WRITE( Z_MS1_PIN,ms1); break; 23404: 9f b7 in r25, 0x3f ; 63 23406: 66 23 and r22, r22 23408: 51 f0 breq .+20 ; 0x2341e 2340a: f8 94 cli 2340c: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23410: 80 64 ori r24, 0x40 ; 64 23412: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23416: 9f bf out 0x3f, r25 ; 63 case 3: WRITE(E0_MS1_PIN,ms1); break; #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) 23418: 47 ff sbrs r20, 7 2341a: 24 c0 rjmp .+72 ; 0x23464 2341c: 08 95 ret { if(ms1 > -1) switch(driver) { case 0: WRITE( X_MS1_PIN,ms1); break; case 1: WRITE( Y_MS1_PIN,ms1); break; case 2: WRITE( Z_MS1_PIN,ms1); break; 2341e: f8 94 cli 23420: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23424: 8f 7b andi r24, 0xBF ; 191 23426: f5 cf rjmp .-22 ; 0x23412 case 3: WRITE(E0_MS1_PIN,ms1); break; 23428: 9f b7 in r25, 0x3f ; 63 2342a: 66 23 and r22, r22 2342c: 51 f0 breq .+20 ; 0x23442 2342e: f8 94 cli 23430: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23434: 88 60 ori r24, 0x08 ; 8 23436: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 2343a: 9f bf out 0x3f, r25 ; 63 #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) 2343c: 47 ff sbrs r20, 7 2343e: bf cf rjmp .-130 ; 0x233be case 3: WRITE(E0_MS2_PIN,ms2); break; #if defined(E1_MS2_PIN) && E1_MS2_PIN > -1 case 4: WRITE(E1_MS2_PIN,ms2); break; #endif } } 23440: 08 95 ret if(ms1 > -1) switch(driver) { case 0: WRITE( X_MS1_PIN,ms1); break; case 1: WRITE( Y_MS1_PIN,ms1); break; case 2: WRITE( Z_MS1_PIN,ms1); break; case 3: WRITE(E0_MS1_PIN,ms1); break; 23442: f8 94 cli 23444: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23448: 87 7f andi r24, 0xF7 ; 247 2344a: f5 cf rjmp .-22 ; 0x23436 case 4: WRITE(E1_MS1_PIN,ms1); break; #endif } if(ms2 > -1) switch(driver) { case 0: WRITE( X_MS2_PIN,ms2); break; 2344c: 44 23 and r20, r20 2344e: 11 f0 breq .+4 ; 0x23454 23450: a0 9a sbi 0x14, 0 ; 20 23452: 08 95 ret 23454: a0 98 cbi 0x14, 0 ; 20 23456: 08 95 ret case 1: WRITE( Y_MS2_PIN,ms2); break; 23458: 44 23 and r20, r20 2345a: 11 f0 breq .+4 ; 0x23460 2345c: a2 9a sbi 0x14, 2 ; 20 2345e: 08 95 ret 23460: a2 98 cbi 0x14, 2 ; 20 23462: 08 95 ret case 2: WRITE( Z_MS2_PIN,ms2); break; 23464: 9f b7 in r25, 0x3f ; 63 23466: 44 23 and r20, r20 23468: 41 f0 breq .+16 ; 0x2347a 2346a: f8 94 cli 2346c: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23470: 80 62 ori r24, 0x20 ; 32 23472: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23476: 9f bf out 0x3f, r25 ; 63 23478: 08 95 ret 2347a: f8 94 cli 2347c: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 23480: 8f 7d andi r24, 0xDF ; 223 23482: f7 cf rjmp .-18 ; 0x23472 case 3: WRITE(E0_MS2_PIN,ms2); break; 23484: f8 94 cli 23486: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 2348a: 8f 7e andi r24, 0xEF ; 239 2348c: f2 cf rjmp .-28 ; 0x23472 0002348e : } } void microstep_mode(uint8_t driver, uint8_t stepping_mode) { switch(stepping_mode) 2348e: 64 30 cpi r22, 0x04 ; 4 23490: 81 f0 breq .+32 ; 0x234b2 23492: 30 f4 brcc .+12 ; 0x234a0 23494: 61 30 cpi r22, 0x01 ; 1 23496: 49 f0 breq .+18 ; 0x234aa { case 1: microstep_ms(driver,MICROSTEP1); break; case 2: microstep_ms(driver,MICROSTEP2); break; 23498: 40 e0 ldi r20, 0x00 ; 0 } } void microstep_mode(uint8_t driver, uint8_t stepping_mode) { switch(stepping_mode) 2349a: 62 30 cpi r22, 0x02 ; 2 2349c: 69 f0 breq .+26 ; 0x234b8 2349e: 08 95 ret 234a0: 68 30 cpi r22, 0x08 ; 8 234a2: 49 f0 breq .+18 ; 0x234b6 234a4: 60 31 cpi r22, 0x10 ; 16 234a6: 39 f0 breq .+14 ; 0x234b6 234a8: 08 95 ret { case 1: microstep_ms(driver,MICROSTEP1); break; 234aa: 40 e0 ldi r20, 0x00 ; 0 case 2: microstep_ms(driver,MICROSTEP2); break; case 4: microstep_ms(driver,MICROSTEP4); break; 234ac: 60 e0 ldi r22, 0x00 ; 0 case 8: microstep_ms(driver,MICROSTEP8); break; 234ae: 0d 94 c8 19 jmp 0x23390 ; 0x23390 { switch(stepping_mode) { case 1: microstep_ms(driver,MICROSTEP1); break; case 2: microstep_ms(driver,MICROSTEP2); break; case 4: microstep_ms(driver,MICROSTEP4); break; 234b2: 41 e0 ldi r20, 0x01 ; 1 234b4: fb cf rjmp .-10 ; 0x234ac case 8: microstep_ms(driver,MICROSTEP8); break; 234b6: 41 e0 ldi r20, 0x01 ; 1 234b8: 61 e0 ldi r22, 0x01 ; 1 234ba: f9 cf rjmp .-14 ; 0x234ae 000234bc : #endif } #ifdef MOTOR_CURRENT_PWM_XY_PIN void st_current_set(uint8_t driver, int current) { 234bc: db 01 movw r26, r22 if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); 234be: 81 11 cpse r24, r1 234c0: 0e c0 rjmp .+28 ; 0x234de 234c2: 2f ef ldi r18, 0xFF ; 255 234c4: 30 e0 ldi r19, 0x00 ; 0 234c6: 0f 94 00 a5 call 0x34a00 ; 0x34a00 <__usmulhisi3> 234ca: 20 ed ldi r18, 0xD0 ; 208 234cc: 37 e0 ldi r19, 0x07 ; 7 234ce: 40 e0 ldi r20, 0x00 ; 0 234d0: 50 e0 ldi r21, 0x00 ; 0 234d2: 0f 94 d1 a4 call 0x349a2 ; 0x349a2 <__divmodsi4> 234d6: b9 01 movw r22, r18 234d8: 8e e2 ldi r24, 0x2E ; 46 if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); 234da: 0c 94 6e d3 jmp 0x1a6dc ; 0x1a6dc 234de: 81 30 cpi r24, 0x01 ; 1 234e0: 69 f4 brne .+26 ; 0x234fc 234e2: 2f ef ldi r18, 0xFF ; 255 234e4: 30 e0 ldi r19, 0x00 ; 0 234e6: 0f 94 00 a5 call 0x34a00 ; 0x34a00 <__usmulhisi3> 234ea: 20 ed ldi r18, 0xD0 ; 208 234ec: 37 e0 ldi r19, 0x07 ; 7 234ee: 40 e0 ldi r20, 0x00 ; 0 234f0: 50 e0 ldi r21, 0x00 ; 0 234f2: 0f 94 d1 a4 call 0x349a2 ; 0x349a2 <__divmodsi4> 234f6: b9 01 movw r22, r18 234f8: 8d e2 ldi r24, 0x2D ; 45 234fa: ef cf rjmp .-34 ; 0x234da if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); 234fc: 82 30 cpi r24, 0x02 ; 2 234fe: 19 f4 brne .+6 ; 0x23506 23500: cb 01 movw r24, r22 23502: 0d 94 5e 19 jmp 0x232bc ; 0x232bc } 23506: 08 95 ret 00023508 : #ifndef TMC2130 void st_current_init() //Initialize Digipot Motor Current { #ifdef MOTOR_CURRENT_PWM_XY_PIN uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); 23508: 8f ef ldi r24, 0xFF ; 255 2350a: 9f e0 ldi r25, 0x0F ; 15 2350c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 SilentModeMenu = SilentMode; 23510: 80 93 bb 03 sts 0x03BB, r24 ; 0x8003bb SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN); 23514: 90 91 0a 01 lds r25, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 23518: 98 60 ori r25, 0x08 ; 8 2351a: 90 93 0a 01 sts 0x010A, r25 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN); 2351e: 90 91 0a 01 lds r25, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 23522: 90 61 ori r25, 0x10 ; 16 23524: 90 93 0a 01 sts 0x010A, r25 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN); 23528: 90 91 0a 01 lds r25, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 2352c: 90 62 ori r25, 0x20 ; 32 2352e: 90 93 0a 01 sts 0x010A, r25 ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> if((SilentMode == SILENT_MODE_OFF) || (farm_mode) ){ 23532: 88 23 and r24, r24 23534: 21 f0 breq .+8 ; 0x2353e 23536: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 2353a: 88 23 and r24, r24 2353c: 59 f1 breq .+86 ; 0x23594 motor_current_setting[0] = motor_current_setting_loud[0]; 2353e: 8c e1 ldi r24, 0x1C ; 28 23540: 92 e0 ldi r25, 0x02 ; 2 23542: 90 93 60 02 sts 0x0260, r25 ; 0x800260 23546: 80 93 5f 02 sts 0x025F, r24 ; 0x80025f motor_current_setting[1] = motor_current_setting_loud[1]; 2354a: 8e e3 ldi r24, 0x3E ; 62 2354c: 93 e0 ldi r25, 0x03 ; 3 2354e: 90 93 62 02 sts 0x0262, r25 ; 0x800262 23552: 80 93 61 02 sts 0x0261, r24 ; 0x800261 motor_current_setting[2] = motor_current_setting_loud[2]; 23556: 84 ef ldi r24, 0xF4 ; 244 23558: 91 e0 ldi r25, 0x01 ; 1 }else{ motor_current_setting[0] = motor_current_setting_silent[0]; motor_current_setting[1] = motor_current_setting_silent[1]; motor_current_setting[2] = motor_current_setting_silent[2]; 2355a: 90 93 64 02 sts 0x0264, r25 ; 0x800264 2355e: 80 93 63 02 sts 0x0263, r24 ; 0x800263 } st_current_set(0, motor_current_setting[0]); 23562: 60 91 5f 02 lds r22, 0x025F ; 0x80025f 23566: 70 91 60 02 lds r23, 0x0260 ; 0x800260 2356a: 80 e0 ldi r24, 0x00 ; 0 2356c: 0f 94 5e 1a call 0x234bc ; 0x234bc st_current_set(1, motor_current_setting[1]); 23570: 6e e3 ldi r22, 0x3E ; 62 23572: 73 e0 ldi r23, 0x03 ; 3 23574: 81 e0 ldi r24, 0x01 ; 1 23576: 0f 94 5e 1a call 0x234bc ; 0x234bc 2357a: 80 91 63 02 lds r24, 0x0263 ; 0x800263 2357e: 90 91 64 02 lds r25, 0x0264 ; 0x800264 23582: 0f 94 5e 19 call 0x232bc ; 0x232bc st_current_set(2, motor_current_setting[2]); //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50); 23586: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> 2358a: 88 7f andi r24, 0xF8 ; 248 2358c: 81 60 ori r24, 0x01 ; 1 2358e: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> #endif } 23592: 08 95 ret motor_current_setting[1] = motor_current_setting_loud[1]; motor_current_setting[2] = motor_current_setting_loud[2]; }else{ motor_current_setting[0] = motor_current_setting_silent[0]; 23594: 8e e0 ldi r24, 0x0E ; 14 23596: 91 e0 ldi r25, 0x01 ; 1 23598: 90 93 60 02 sts 0x0260, r25 ; 0x800260 2359c: 80 93 5f 02 sts 0x025F, r24 ; 0x80025f motor_current_setting[1] = motor_current_setting_silent[1]; 235a0: 8e e3 ldi r24, 0x3E ; 62 235a2: 93 e0 ldi r25, 0x03 ; 3 235a4: 90 93 62 02 sts 0x0262, r25 ; 0x800262 235a8: 80 93 61 02 sts 0x0261, r24 ; 0x800261 motor_current_setting[2] = motor_current_setting_silent[2]; 235ac: 82 ec ldi r24, 0xC2 ; 194 235ae: 91 e0 ldi r25, 0x01 ; 1 235b0: d4 cf rjmp .-88 ; 0x2355a 000235b2 : } long st_get_position(uint8_t axis) { long count_pos; CRITICAL_SECTION_START; 235b2: 2f b7 in r18, 0x3f ; 63 235b4: f8 94 cli count_pos = count_position[axis]; 235b6: 94 e0 ldi r25, 0x04 ; 4 235b8: 89 9f mul r24, r25 235ba: f0 01 movw r30, r0 235bc: 11 24 eor r1, r1 235be: e4 5b subi r30, 0xB4 ; 180 235c0: f9 4f sbci r31, 0xF9 ; 249 235c2: 60 81 ld r22, Z 235c4: 71 81 ldd r23, Z+1 ; 0x01 235c6: 82 81 ldd r24, Z+2 ; 0x02 235c8: 93 81 ldd r25, Z+3 ; 0x03 CRITICAL_SECTION_END; 235ca: 2f bf out 0x3f, r18 ; 63 return count_pos; } 235cc: 08 95 ret 000235ce : y = count_position[Y_AXIS]; CRITICAL_SECTION_END; } float st_get_position_mm(uint8_t axis) { 235ce: cf 93 push r28 235d0: c8 2f mov r28, r24 float steper_position_in_steps = st_get_position(axis); 235d2: 0f 94 d9 1a call 0x235b2 ; 0x235b2 235d6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> return steper_position_in_steps / cs.axis_steps_per_mm[axis]; 235da: 24 e0 ldi r18, 0x04 ; 4 235dc: c2 9f mul r28, r18 235de: f0 01 movw r30, r0 235e0: 11 24 eor r1, r1 235e2: e5 59 subi r30, 0x95 ; 149 235e4: f2 4f sbci r31, 0xF2 ; 242 235e6: 20 81 ld r18, Z 235e8: 31 81 ldd r19, Z+1 ; 0x01 235ea: 42 81 ldd r20, Z+2 ; 0x02 235ec: 53 81 ldd r21, Z+3 ; 0x03 235ee: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> } 235f2: cf 91 pop r28 235f4: 08 95 ret 000235f6 : 235f6: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 235fa: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f // Block until all buffered steps are executed void st_synchronize() { while(blocks_queued()) 235fe: 98 17 cp r25, r24 23600: 29 f0 breq .+10 ; 0x2360c manage_inactivity(true); lcd_update(0); } #else //TMC2130 // Vojtech: Don't disable motors inside the planner! delay_keep_alive(0); 23602: 90 e0 ldi r25, 0x00 ; 0 23604: 80 e0 ldi r24, 0x00 ; 0 23606: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 2360a: f5 cf rjmp .-22 ; 0x235f6 #endif //TMC2130 } } 2360c: 08 95 ret 0002360e : _delay(2000); lcd_clear(); } void lcd_load_filament_color_check() { 2360e: cf 92 push r12 23610: ef 92 push r14 23612: ff 92 push r15 23614: 0f 93 push r16 23616: 1f 93 push r17 23618: cf 93 push r28 2361a: df 93 push r29 // >Ja >Nein >Auswerfen // Hungarian // 01234567890123456789 // >Igen >Nem >Kiadás uint8_t clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2); 2361c: 89 e9 ldi r24, 0x99 ; 153 2361e: 98 e4 ldi r25, 0x48 ; 72 23620: 0e 94 3a 75 call 0xea74 ; 0xea74 23624: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> 23628: c8 2e mov r12, r24 2362a: 86 e4 ldi r24, 0x46 ; 70 2362c: 98 e5 ldi r25, 0x58 ; 88 2362e: 0e 94 3a 75 call 0xea74 ; 0xea74 23632: 7c 01 movw r14, r24 23634: 8f e9 ldi r24, 0x9F ; 159 23636: 98 e4 ldi r25, 0x48 ; 72 23638: 0e 94 3a 75 call 0xea74 ; 0xea74 2363c: 8c 01 movw r16, r24 2363e: 89 e9 ldi r24, 0x99 ; 153 23640: 98 e4 ldi r25, 0x48 ; 72 23642: 0e 94 3a 75 call 0xea74 ; 0xea74 23646: ec 01 movw r28, r24 23648: 8b e1 ldi r24, 0x1B ; 27 2364a: 98 e5 ldi r25, 0x58 ; 88 2364c: 0e 94 3a 75 call 0xea74 ; 0xea74 23650: c3 94 inc r12 23652: c3 94 inc r12 23654: 9e 01 movw r18, r28 23656: 40 e0 ldi r20, 0x00 ; 0 23658: 60 e0 ldi r22, 0x00 ; 0 2365a: 0e 94 a4 e4 call 0x1c948 ; 0x1c948 while (clean == LCD_MIDDLE_BUTTON_CHOICE) { 2365e: 81 30 cpi r24, 0x01 ; 1 23660: 29 f4 brne .+10 ; 0x2366c load_filament_final_feed(); 23662: 0e 94 ed 63 call 0xc7da ; 0xc7da st_synchronize(); 23666: 0f 94 fb 1a call 0x235f6 ; 0x235f6 2366a: d8 cf rjmp .-80 ; 0x2361c clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2); } if (clean == LCD_RIGHT_BUTTON_CHOICE) { 2366c: 82 30 cpi r24, 0x02 ; 2 2366e: 61 f4 brne .+24 ; 0x23688 unload_filament(FILAMENTCHANGE_FINALRETRACT); 23670: 60 e0 ldi r22, 0x00 ; 0 23672: 70 e0 ldi r23, 0x00 ; 0 23674: cb 01 movw r24, r22 } } 23676: df 91 pop r29 23678: cf 91 pop r28 2367a: 1f 91 pop r17 2367c: 0f 91 pop r16 2367e: ff 90 pop r15 23680: ef 90 pop r14 23682: cf 90 pop r12 load_filament_final_feed(); st_synchronize(); clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2); } if (clean == LCD_RIGHT_BUTTON_CHOICE) { unload_filament(FILAMENTCHANGE_FINALRETRACT); 23684: 0c 94 7e e3 jmp 0x1c6fc ; 0x1c6fc } } 23688: df 91 pop r29 2368a: cf 91 pop r28 2368c: 1f 91 pop r17 2368e: 0f 91 pop r16 23690: ff 90 pop r15 23692: ef 90 pop r14 23694: cf 90 pop r12 23696: 08 95 ret 00023698 : void st_reset_timer() { // Clear a possible pending interrupt on OCR1A overflow. TIFR1 |= 1 << OCF1A; 23698: b1 9a sbi 0x16, 1 ; 22 // Reset the counter. TCNT1 = 0; 2369a: 10 92 85 00 sts 0x0085, r1 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 2369e: 10 92 84 00 sts 0x0084, r1 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> // Wake up after 1ms from now. OCR1A = 2000; 236a2: 80 ed ldi r24, 0xD0 ; 208 236a4: 97 e0 ldi r25, 0x07 ; 7 236a6: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 236aa: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> #ifdef LIN_ADVANCE nextMainISR = 0; 236ae: 10 92 4f 04 sts 0x044F, r1 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 236b2: 10 92 4e 04 sts 0x044E, r1 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) 236b6: 80 91 4c 04 lds r24, 0x044C ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 236ba: 90 91 4d 04 lds r25, 0x044D ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 236be: 01 97 sbiw r24, 0x01 ; 1 236c0: 8e 3f cpi r24, 0xFE ; 254 236c2: 9f 4f sbci r25, 0xFF ; 255 236c4: 20 f4 brcc .+8 ; 0x236ce nextAdvanceISR = 0; 236c6: 10 92 4d 04 sts 0x044D, r1 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 236ca: 10 92 4c 04 sts 0x044C, r1 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> #endif } 236ce: 08 95 ret 000236d0 <__vector_17>: // step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. // The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. // "The Stepper Driver Interrupt" - This timer interrupt is the workhorse. // It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately. ISR(TIMER1_COMPA_vect) { 236d0: 1f 92 push r1 236d2: 0f 92 push r0 236d4: 0f b6 in r0, 0x3f ; 63 236d6: 0f 92 push r0 236d8: 11 24 eor r1, r1 236da: 0b b6 in r0, 0x3b ; 59 236dc: 0f 92 push r0 236de: 4f 92 push r4 236e0: 5f 92 push r5 236e2: 6f 92 push r6 236e4: 7f 92 push r7 236e6: 8f 92 push r8 236e8: cf 92 push r12 236ea: df 92 push r13 236ec: ef 92 push r14 236ee: ff 92 push r15 236f0: 1f 93 push r17 236f2: 2f 93 push r18 236f4: 3f 93 push r19 236f6: 4f 93 push r20 236f8: 5f 93 push r21 236fa: 6f 93 push r22 236fc: 7f 93 push r23 236fe: 8f 93 push r24 23700: 9f 93 push r25 23702: af 93 push r26 23704: bf 93 push r27 23706: cf 93 push r28 23708: df 93 push r29 2370a: ef 93 push r30 2370c: ff 93 push r31 } } FORCE_INLINE void advance_isr_scheduler() { // Integrate the final timer value, accounting for scheduling adjustments if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) 2370e: 80 91 4c 04 lds r24, 0x044C ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 23712: 90 91 4d 04 lds r25, 0x044D ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 23716: 9c 01 movw r18, r24 23718: 21 50 subi r18, 0x01 ; 1 2371a: 31 09 sbc r19, r1 2371c: 2e 3f cpi r18, 0xFE ; 254 2371e: 3f 4f sbci r19, 0xFF ; 255 23720: 90 f4 brcc .+36 ; 0x23746 <__vector_17+0x76> { if(nextAdvanceISR > OCR1A) 23722: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 23726: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 2372a: 28 17 cp r18, r24 2372c: 39 07 cpc r19, r25 2372e: 08 f0 brcs .+2 ; 0x23732 <__vector_17+0x62> 23730: f9 c0 rjmp .+498 ; 0x23924 <__vector_17+0x254> nextAdvanceISR -= OCR1A; 23732: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 23736: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 2373a: 82 1b sub r24, r18 2373c: 93 0b sbc r25, r19 2373e: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 23742: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> else nextAdvanceISR = 0; } if(nextMainISR > OCR1A) 23746: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 2374a: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 2374e: 80 91 4e 04 lds r24, 0x044E ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 23752: 90 91 4f 04 lds r25, 0x044F ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 23756: 28 17 cp r18, r24 23758: 39 07 cpc r19, r25 2375a: 08 f0 brcs .+2 ; 0x2375e <__vector_17+0x8e> 2375c: e8 c0 rjmp .+464 ; 0x2392e <__vector_17+0x25e> nextMainISR -= OCR1A; 2375e: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 23762: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 23766: 82 1b sub r24, r18 23768: 93 0b sbc r25, r19 2376a: 90 93 4f 04 sts 0x044F, r25 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 2376e: 80 93 4e 04 sts 0x044E, r24 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> else nextMainISR = 0; // Run main stepping ISR if flagged if (!nextMainISR) 23772: 80 91 4e 04 lds r24, 0x044E ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 23776: 90 91 4f 04 lds r25, 0x044F ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 2377a: 89 2b or r24, r25 2377c: 11 f0 breq .+4 ; 0x23782 <__vector_17+0xb2> 2377e: 0d 94 53 24 jmp 0x248a6 ; 0x248a6 <__vector_17+0x11d6> FORCE_INLINE void isr() { //WRITE_NC(LOGIC_ANALYZER_CH0, true); //if (UVLO) uvlo(); // If there is no current block, attempt to pop one from the buffer if (current_block == NULL) 23782: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23786: f0 91 52 12 lds r31, 0x1252 ; 0x801252 2378a: 30 97 sbiw r30, 0x00 ; 0 2378c: 09 f0 breq .+2 ; 0x23790 <__vector_17+0xc0> 2378e: 82 c1 rjmp .+772 ; 0x23a94 <__vector_17+0x3c4> // Mark this block as busy, so its velocities and acceperations will be no more recalculated // by the planner routine. // Returns NULL if buffer empty FORCE_INLINE block_t *plan_get_current_block() { if (block_buffer_head == block_buffer_tail) { 23790: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 23794: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 23798: 98 17 cp r25, r24 2379a: 09 f4 brne .+2 ; 0x2379e <__vector_17+0xce> 2379c: 35 c3 rjmp .+1642 ; 0x23e08 <__vector_17+0x738> return(NULL); } block_t *block = &block_buffer[block_buffer_tail]; 2379e: c0 91 3f 0d lds r28, 0x0D3F ; 0x800d3f 237a2: 2c 2f mov r18, r28 237a4: 30 e0 ldi r19, 0x00 ; 0 237a6: 5e e6 ldi r21, 0x6E ; 110 237a8: c5 9f mul r28, r21 237aa: e0 01 movw r28, r0 237ac: 11 24 eor r1, r1 237ae: c2 5a subi r28, 0xA2 ; 162 237b0: d9 4f sbci r29, 0xF9 ; 249 block->busy = true; 237b2: fe 01 movw r30, r28 237b4: e9 5b subi r30, 0xB9 ; 185 237b6: ff 4f sbci r31, 0xFF ; 255 237b8: 41 e0 ldi r20, 0x01 ; 1 237ba: 40 83 st Z, r20 FORCE_INLINE void stepper_next_block() { // Anything in the buffer? //WRITE_NC(LOGIC_ANALYZER_CH2, true); current_block = plan_get_current_block(); 237bc: d0 93 52 12 sts 0x1252, r29 ; 0x801252 237c0: c0 93 51 12 sts 0x1251, r28 ; 0x801251 if (current_block != NULL) { 237c4: 20 97 sbiw r28, 0x00 ; 0 237c6: 09 f4 brne .+2 ; 0x237ca <__vector_17+0xfa> 237c8: 1f c3 rjmp .+1598 ; 0x23e08 <__vector_17+0x738> // The busy flag is set by the plan_get_current_block() call. // current_block->busy = true; // Initializes the trapezoid generator from the current block. Called whenever a new // block begins. deceleration_time = 0; 237ca: 10 92 74 05 sts 0x0574, r1 ; 0x800574 237ce: 10 92 75 05 sts 0x0575, r1 ; 0x800575 237d2: 10 92 76 05 sts 0x0576, r1 ; 0x800576 237d6: 10 92 77 05 sts 0x0577, r1 ; 0x800577 // Set the nominal step loops to zero to indicate, that the timer value is not known yet. // That means, delay the initialization of nominal step rate and step loops until the steady // state is reached. step_loops_nominal = 0; 237da: 10 92 73 05 sts 0x0573, r1 ; 0x800573 acc_step_rate = uint16_t(current_block->initial_rate); 237de: 8a ad ldd r24, Y+58 ; 0x3a 237e0: 9b ad ldd r25, Y+59 ; 0x3b 237e2: 90 93 72 05 sts 0x0572, r25 ; 0x800572 237e6: 80 93 71 05 sts 0x0571, r24 ; 0x800571 #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 237ea: 81 34 cpi r24, 0x41 ; 65 237ec: ac e9 ldi r26, 0x9C ; 156 237ee: 9a 07 cpc r25, r26 237f0: 08 f0 brcs .+2 ; 0x237f4 <__vector_17+0x124> 237f2: a2 c0 rjmp .+324 ; 0x23938 <__vector_17+0x268> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 237f4: 81 32 cpi r24, 0x21 ; 33 237f6: be e4 ldi r27, 0x4E ; 78 237f8: 9b 07 cpc r25, r27 237fa: 08 f4 brcc .+2 ; 0x237fe <__vector_17+0x12e> 237fc: a0 c0 rjmp .+320 ; 0x2393e <__vector_17+0x26e> step_rate = (step_rate >> 2)&0x3fff; 237fe: 96 95 lsr r25 23800: 87 95 ror r24 23802: 96 95 lsr r25 23804: 87 95 ror r24 step_loops = 4; 23806: 44 e0 ldi r20, 0x04 ; 4 } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times step_rate = (step_rate >> 1)&0x7fff; step_loops = 2; 23808: 40 93 70 05 sts 0x0570, r20 ; 0x800570 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 2380c: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 2380e: 81 15 cp r24, r1 23810: f8 e0 ldi r31, 0x08 ; 8 23812: 9f 07 cpc r25, r31 23814: 08 f4 brcc .+2 ; 0x23818 <__vector_17+0x148> 23816: a4 c0 rjmp .+328 ; 0x23960 <__vector_17+0x290> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 23818: e9 2f mov r30, r25 2381a: ff 27 eor r31, r31 2381c: ee 0f add r30, r30 2381e: ff 1f adc r31, r31 23820: ee 0f add r30, r30 23822: ff 1f adc r31, r31 23824: af 01 movw r20, r30 23826: 4c 56 subi r20, 0x6C ; 108 23828: 50 47 sbci r21, 0x70 ; 112 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 2382a: fa 01 movw r30, r20 2382c: 32 96 adiw r30, 0x02 ; 2 2382e: a5 91 lpm r26, Z+ 23830: b4 91 lpm r27, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 23832: fa 01 movw r30, r20 23834: 45 91 lpm r20, Z+ 23836: 54 91 lpm r21, Z "clr r1" "\n\t" //make r1 __zero_reg__ again "adc %B0, r1" "\n\t" //propagate carry of addition (add 0 with carry) : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. ); 23838: b8 9f mul r27, r24 2383a: b0 01 movw r22, r0 2383c: a8 9f mul r26, r24 2383e: 00 0c add r0, r0 23840: 61 1d adc r22, r1 23842: 11 24 eor r1, r1 23844: 71 1d adc r23, r1 } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; timer = (unsigned short)pgm_read_word_near(table_address); timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 23846: 46 1b sub r20, r22 23848: 57 0b sbc r21, r23 acceleration_time = calc_timer(acc_step_rate, step_loops); 2384a: ca 01 movw r24, r20 2384c: 44 36 cpi r20, 0x64 ; 100 2384e: 51 05 cpc r21, r1 23850: 10 f4 brcc .+4 ; 0x23856 <__vector_17+0x186> 23852: 84 e6 ldi r24, 0x64 ; 100 23854: 90 e0 ldi r25, 0x00 ; 0 23856: b0 e0 ldi r27, 0x00 ; 0 23858: a0 e0 ldi r26, 0x00 ; 0 2385a: 80 93 6c 05 sts 0x056C, r24 ; 0x80056c 2385e: 90 93 6d 05 sts 0x056D, r25 ; 0x80056d 23862: a0 93 6e 05 sts 0x056E, r26 ; 0x80056e 23866: b0 93 6f 05 sts 0x056F, r27 ; 0x80056f #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 2386a: 4e e6 ldi r20, 0x6E ; 110 2386c: 42 9f mul r20, r18 2386e: c0 01 movw r24, r0 23870: 43 9f mul r20, r19 23872: 90 0d add r25, r0 23874: 11 24 eor r1, r1 23876: 82 5a subi r24, 0xA2 ; 162 23878: 99 4f sbci r25, 0xF9 ; 249 2387a: fc 01 movw r30, r24 2387c: e4 5b subi r30, 0xB4 ; 180 2387e: ff 4f sbci r31, 0xFF ; 255 23880: 40 81 ld r20, Z 23882: 44 23 and r20, r20 23884: 49 f0 breq .+18 ; 0x23898 <__vector_17+0x1c8> target_adv_steps = current_block->max_adv_steps; 23886: 81 5b subi r24, 0xB1 ; 177 23888: 9f 4f sbci r25, 0xFF ; 255 2388a: dc 01 movw r26, r24 2388c: 8d 91 ld r24, X+ 2388e: 9c 91 ld r25, X 23890: 90 93 6b 05 sts 0x056B, r25 ; 0x80056b 23894: 80 93 6a 05 sts 0x056A, r24 ; 0x80056a } e_steps = 0; 23898: 10 92 69 05 sts 0x0569, r1 ; 0x800569 nextAdvanceISR = ADV_NEVER; 2389c: 8f ef ldi r24, 0xFF ; 255 2389e: 9f ef ldi r25, 0xFF ; 255 238a0: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 238a4: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> LA_phase = -1; 238a8: 80 93 68 05 sts 0x0568, r24 ; 0x800568 #endif if (current_block->flag & BLOCK_FLAG_E_RESET) { 238ac: 8e e6 ldi r24, 0x6E ; 110 238ae: 82 9f mul r24, r18 238b0: f0 01 movw r30, r0 238b2: 83 9f mul r24, r19 238b4: f0 0d add r31, r0 238b6: 11 24 eor r1, r1 238b8: e2 5a subi r30, 0xA2 ; 162 238ba: f9 4f sbci r31, 0xF9 ; 249 238bc: 85 a9 ldd r24, Z+53 ; 0x35 238be: 84 ff sbrs r24, 4 238c0: 08 c0 rjmp .+16 ; 0x238d2 <__vector_17+0x202> count_position[E_AXIS] = 0; 238c2: 10 92 58 06 sts 0x0658, r1 ; 0x800658 238c6: 10 92 59 06 sts 0x0659, r1 ; 0x800659 238ca: 10 92 5a 06 sts 0x065A, r1 ; 0x80065a 238ce: 10 92 5b 06 sts 0x065B, r1 ; 0x80065b } if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) { 238d2: 83 ff sbrs r24, 3 238d4: 61 c0 rjmp .+194 ; 0x23998 <__vector_17+0x2c8> const int16_t value = -(current_block->step_event_count.lo >> 1); 238d6: 8e e6 ldi r24, 0x6E ; 110 238d8: 82 9f mul r24, r18 238da: f0 01 movw r30, r0 238dc: 83 9f mul r24, r19 238de: f0 0d add r31, r0 238e0: 11 24 eor r1, r1 238e2: e2 5a subi r30, 0xA2 ; 162 238e4: f9 4f sbci r31, 0xF9 ; 249 238e6: 80 89 ldd r24, Z+16 ; 0x10 238e8: 91 89 ldd r25, Z+17 ; 0x11 238ea: 96 95 lsr r25 238ec: 87 95 ror r24 238ee: 91 95 neg r25 238f0: 81 95 neg r24 238f2: 91 09 sbc r25, r1 for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { counter[axis].lo = value; 238f4: 90 93 59 05 sts 0x0559, r25 ; 0x800559 238f8: 80 93 58 05 sts 0x0558, r24 ; 0x800558 238fc: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 23900: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c 23904: 90 93 61 05 sts 0x0561, r25 ; 0x800561 23908: 80 93 60 05 sts 0x0560, r24 ; 0x800560 2390c: 90 93 65 05 sts 0x0565, r25 ; 0x800565 23910: 80 93 64 05 sts 0x0564, r24 ; 0x800564 } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].lo != 0; 23914: 81 e0 ldi r24, 0x01 ; 1 23916: 24 85 ldd r18, Z+12 ; 0x0c 23918: 35 85 ldd r19, Z+13 ; 0x0d 2391a: 23 2b or r18, r19 2391c: 09 f0 breq .+2 ; 0x23920 <__vector_17+0x250> 2391e: 7d c0 rjmp .+250 ; 0x23a1a <__vector_17+0x34a> for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { counter[axis].wide = value; } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].wide != 0; 23920: 80 e0 ldi r24, 0x00 ; 0 23922: 7b c0 rjmp .+246 ; 0x23a1a <__vector_17+0x34a> if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) { if(nextAdvanceISR > OCR1A) nextAdvanceISR -= OCR1A; else nextAdvanceISR = 0; 23924: 10 92 4d 04 sts 0x044D, r1 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 23928: 10 92 4c 04 sts 0x044C, r1 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 2392c: 0c cf rjmp .-488 ; 0x23746 <__vector_17+0x76> } if(nextMainISR > OCR1A) nextMainISR -= OCR1A; else nextMainISR = 0; 2392e: 10 92 4f 04 sts 0x044F, r1 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 23932: 10 92 4e 04 sts 0x044E, r1 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 23936: 1d cf rjmp .-454 ; 0x23772 <__vector_17+0xa2> #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 23938: 80 e4 ldi r24, 0x40 ; 64 2393a: 9c e9 ldi r25, 0x9C ; 156 2393c: 60 cf rjmp .-320 ; 0x237fe <__vector_17+0x12e> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times step_rate = (step_rate >> 2)&0x3fff; step_loops = 4; } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times 2393e: 81 31 cpi r24, 0x11 ; 17 23940: e7 e2 ldi r30, 0x27 ; 39 23942: 9e 07 cpc r25, r30 23944: 20 f0 brcs .+8 ; 0x2394e <__vector_17+0x27e> step_rate = (step_rate >> 1)&0x7fff; 23946: 96 95 lsr r25 23948: 87 95 ror r24 step_loops = 2; 2394a: 42 e0 ldi r20, 0x02 ; 2 2394c: 5d cf rjmp .-326 ; 0x23808 <__vector_17+0x138> } else { step_loops = 1; 2394e: 40 93 70 05 sts 0x0570, r20 ; 0x800570 23952: 80 32 cpi r24, 0x20 ; 32 23954: 91 05 cpc r25, r1 23956: 08 f0 brcs .+2 ; 0x2395a <__vector_17+0x28a> 23958: 59 cf rjmp .-334 ; 0x2380c <__vector_17+0x13c> 2395a: 80 e2 ldi r24, 0x20 ; 32 2395c: 90 e0 ldi r25, 0x00 ; 0 2395e: 56 cf rjmp .-340 ; 0x2380c <__vector_17+0x13c> uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; 23960: bc 01 movw r22, r24 23962: 76 95 lsr r23 23964: 67 95 ror r22 23966: 6c 7f andi r22, 0xFC ; 252 23968: 6c 56 subi r22, 0x6C ; 108 2396a: 74 47 sbci r23, 0x74 ; 116 timer = (unsigned short)pgm_read_word_near(table_address); 2396c: fb 01 movw r30, r22 2396e: 45 91 lpm r20, Z+ 23970: 54 91 lpm r21, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 23972: fb 01 movw r30, r22 23974: 32 96 adiw r30, 0x02 ; 2 23976: a5 91 lpm r26, Z+ 23978: b4 91 lpm r27, Z 2397a: 87 70 andi r24, 0x07 ; 7 2397c: 99 27 eor r25, r25 2397e: 8a 9f mul r24, r26 23980: b0 01 movw r22, r0 23982: 8b 9f mul r24, r27 23984: 70 0d add r23, r0 23986: 9a 9f mul r25, r26 23988: 70 0d add r23, r0 2398a: 11 24 eor r1, r1 2398c: e3 e0 ldi r30, 0x03 ; 3 2398e: 76 95 lsr r23 23990: 67 95 ror r22 23992: ea 95 dec r30 23994: e1 f7 brne .-8 ; 0x2398e <__vector_17+0x2be> 23996: 57 cf rjmp .-338 ; 0x23846 <__vector_17+0x176> } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].lo != 0; #endif } else { const int32_t value = -(current_block->step_event_count.wide >> 1); 23998: 8e e6 ldi r24, 0x6E ; 110 2399a: 82 9f mul r24, r18 2399c: f0 01 movw r30, r0 2399e: 83 9f mul r24, r19 239a0: f0 0d add r31, r0 239a2: 11 24 eor r1, r1 239a4: e2 5a subi r30, 0xA2 ; 162 239a6: f9 4f sbci r31, 0xF9 ; 249 239a8: 80 89 ldd r24, Z+16 ; 0x10 239aa: 91 89 ldd r25, Z+17 ; 0x11 239ac: a2 89 ldd r26, Z+18 ; 0x12 239ae: b3 89 ldd r27, Z+19 ; 0x13 239b0: b6 95 lsr r27 239b2: a7 95 ror r26 239b4: 97 95 ror r25 239b6: 87 95 ror r24 239b8: b0 95 com r27 239ba: a0 95 com r26 239bc: 90 95 com r25 239be: 81 95 neg r24 239c0: 9f 4f sbci r25, 0xFF ; 255 239c2: af 4f sbci r26, 0xFF ; 255 239c4: bf 4f sbci r27, 0xFF ; 255 for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { counter[axis].wide = value; 239c6: 80 93 58 05 sts 0x0558, r24 ; 0x800558 239ca: 90 93 59 05 sts 0x0559, r25 ; 0x800559 239ce: a0 93 5a 05 sts 0x055A, r26 ; 0x80055a 239d2: b0 93 5b 05 sts 0x055B, r27 ; 0x80055b 239d6: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c 239da: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 239de: a0 93 5e 05 sts 0x055E, r26 ; 0x80055e 239e2: b0 93 5f 05 sts 0x055F, r27 ; 0x80055f 239e6: 80 93 60 05 sts 0x0560, r24 ; 0x800560 239ea: 90 93 61 05 sts 0x0561, r25 ; 0x800561 239ee: a0 93 62 05 sts 0x0562, r26 ; 0x800562 239f2: b0 93 63 05 sts 0x0563, r27 ; 0x800563 239f6: 80 93 64 05 sts 0x0564, r24 ; 0x800564 239fa: 90 93 65 05 sts 0x0565, r25 ; 0x800565 239fe: a0 93 66 05 sts 0x0566, r26 ; 0x800566 23a02: b0 93 67 05 sts 0x0567, r27 ; 0x800567 } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].wide != 0; 23a06: 81 e0 ldi r24, 0x01 ; 1 23a08: 44 85 ldd r20, Z+12 ; 0x0c 23a0a: 55 85 ldd r21, Z+13 ; 0x0d 23a0c: 66 85 ldd r22, Z+14 ; 0x0e 23a0e: 77 85 ldd r23, Z+15 ; 0x0f 23a10: 45 2b or r20, r21 23a12: 46 2b or r20, r22 23a14: 47 2b or r20, r23 23a16: 09 f4 brne .+2 ; 0x23a1a <__vector_17+0x34a> 23a18: 83 cf rjmp .-250 ; 0x23920 <__vector_17+0x250> 23a1a: 80 93 57 05 sts 0x0557, r24 ; 0x800557 #endif } step_events_completed.wide = 0; 23a1e: 10 92 53 05 sts 0x0553, r1 ; 0x800553 23a22: 10 92 54 05 sts 0x0554, r1 ; 0x800554 23a26: 10 92 55 05 sts 0x0555, r1 ; 0x800555 23a2a: 10 92 56 05 sts 0x0556, r1 ; 0x800556 // Set directions. out_bits = current_block->direction_bits; 23a2e: 88 8d ldd r24, Y+24 ; 0x18 23a30: 80 93 52 05 sts 0x0552, r24 ; 0x800552 // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY) if((out_bits & (1< WRITE_NC(X_DIR_PIN, INVERT_X_DIR); 23a38: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 23a3c: 8d 7f andi r24, 0xFD ; 253 23a3e: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[X_AXIS]=-1; 23a42: 8f ef ldi r24, 0xFF ; 255 } else { WRITE_NC(X_DIR_PIN, !INVERT_X_DIR); count_direction[X_AXIS]=1; 23a44: 80 93 5b 02 sts 0x025B, r24 ; 0x80025b } if((out_bits & (1< 23a4c: 81 ff sbrs r24, 1 23a4e: cc c1 rjmp .+920 ; 0x23de8 <__vector_17+0x718> WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR); 23a50: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 23a54: 8e 7f andi r24, 0xFE ; 254 23a56: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Y_AXIS]=-1; 23a5a: 8f ef ldi r24, 0xFF ; 255 } else { WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR); count_direction[Y_AXIS]=1; 23a5c: 80 93 5c 02 sts 0x025C, r24 ; 0x80025c } if ((out_bits & (1< 23a64: 82 ff sbrs r24, 2 23a66: c7 c1 rjmp .+910 ; 0x23df6 <__vector_17+0x726> WRITE_NC(Z_DIR_PIN,INVERT_Z_DIR); 23a68: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 23a6c: 8b 7f andi r24, 0xFB ; 251 23a6e: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Z_AXIS]=-1; 23a72: 8f ef ldi r24, 0xFF ; 255 } else { // +direction WRITE_NC(Z_DIR_PIN,!INVERT_Z_DIR); count_direction[Z_AXIS]=1; 23a74: 80 93 5d 02 sts 0x025D, r24 ; 0x80025d } if ((out_bits & (1 << E_AXIS)) != 0) { // -direction 23a78: 80 91 52 05 lds r24, 0x0552 ; 0x800552 23a7c: 83 ff sbrs r24, 3 23a7e: c2 c1 rjmp .+900 ; 0x23e04 <__vector_17+0x734> #ifndef LIN_ADVANCE WRITE(E0_DIR_PIN, INVERT_E0_DIR); #endif /* LIN_ADVANCE */ count_direction[E_AXIS] = -1; 23a80: 8f ef ldi r24, 0xFF ; 255 } else { // +direction #ifndef LIN_ADVANCE WRITE(E0_DIR_PIN, !INVERT_E0_DIR); #endif /* LIN_ADVANCE */ count_direction[E_AXIS] = 1; 23a82: 80 93 5e 02 sts 0x025E, r24 ; 0x80025e //if (UVLO) uvlo(); // If there is no current block, attempt to pop one from the buffer if (current_block == NULL) stepper_next_block(); if (current_block != NULL) 23a86: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23a8a: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23a8e: 30 97 sbiw r30, 0x00 ; 0 23a90: 09 f4 brne .+2 ; 0x23a94 <__vector_17+0x3c4> 23a92: 09 c7 rjmp .+3602 ; 0x248a6 <__vector_17+0x11d6> } // Check limit switches. FORCE_INLINE void stepper_check_endstops() { if(check_endstops) 23a94: 80 91 77 02 lds r24, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> 23a98: 50 91 4f 05 lds r21, 0x054F ; 0x80054f 23a9c: 88 23 and r24, r24 23a9e: 09 f4 brne .+2 ; 0x23aa2 <__vector_17+0x3d2> 23aa0: 6c c0 rjmp .+216 ; 0x23b7a <__vector_17+0x4aa> { uint8_t _endstop_hit = endstop_hit; 23aa2: 20 91 5e 04 lds r18, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> uint8_t _endstop = endstop; 23aa6: 80 91 51 05 lds r24, 0x0551 ; 0x800551 uint8_t _old_endstop = old_endstop; 23aaa: 90 91 50 05 lds r25, 0x0550 ; 0x800550 #ifndef COREXY if ((out_bits & (1< 23ab2: 30 ff sbrs r19, 0 23ab4: 1d c0 rjmp .+58 ; 0x23af0 <__vector_17+0x420> #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING)); 23ab6: 1e 9b sbis 0x03, 6 ; 3 23ab8: c6 c1 rjmp .+908 ; 0x23e46 <__vector_17+0x776> 23aba: 81 60 ori r24, 0x01 ; 1 #endif if((_endstop & _old_endstop & _BV(X_AXIS)) && (current_block->steps[X_AXIS].wide > 0)) { 23abc: 49 2f mov r20, r25 23abe: 41 70 andi r20, 0x01 ; 1 23ac0: 48 23 and r20, r24 23ac2: b1 f0 breq .+44 ; 0x23af0 <__vector_17+0x420> 23ac4: c0 80 ld r12, Z 23ac6: d1 80 ldd r13, Z+1 ; 0x01 23ac8: e2 80 ldd r14, Z+2 ; 0x02 23aca: f3 80 ldd r15, Z+3 ; 0x03 23acc: 1c 14 cp r1, r12 23ace: 1d 04 cpc r1, r13 23ad0: 1e 04 cpc r1, r14 23ad2: 1f 04 cpc r1, r15 23ad4: 6c f4 brge .+26 ; 0x23af0 <__vector_17+0x420> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(X_AXIS); 23ad6: 21 60 ori r18, 0x01 ; 1 step_events_completed.wide = current_block->step_event_count.wide; 23ad8: c0 88 ldd r12, Z+16 ; 0x10 23ada: d1 88 ldd r13, Z+17 ; 0x11 23adc: e2 88 ldd r14, Z+18 ; 0x12 23ade: f3 88 ldd r15, Z+19 ; 0x13 23ae0: c0 92 53 05 sts 0x0553, r12 ; 0x800553 23ae4: d0 92 54 05 sts 0x0554, r13 ; 0x800554 23ae8: e0 92 55 05 sts 0x0555, r14 ; 0x800555 23aec: f0 92 56 05 sts 0x0556, r15 ; 0x800556 } #endif } #ifndef COREXY if ((out_bits & (1< #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING)); 23af4: 1d 9b sbis 0x03, 5 ; 3 23af6: a9 c1 rjmp .+850 ; 0x23e4a <__vector_17+0x77a> 23af8: 82 60 ori r24, 0x02 ; 2 #endif if((_endstop & _old_endstop & _BV(Y_AXIS)) && (current_block->steps[Y_AXIS].wide > 0)) { 23afa: 49 2f mov r20, r25 23afc: 42 70 andi r20, 0x02 ; 2 23afe: 48 23 and r20, r24 23b00: b1 f0 breq .+44 ; 0x23b2e <__vector_17+0x45e> 23b02: c4 80 ldd r12, Z+4 ; 0x04 23b04: d5 80 ldd r13, Z+5 ; 0x05 23b06: e6 80 ldd r14, Z+6 ; 0x06 23b08: f7 80 ldd r15, Z+7 ; 0x07 23b0a: 1c 14 cp r1, r12 23b0c: 1d 04 cpc r1, r13 23b0e: 1e 04 cpc r1, r14 23b10: 1f 04 cpc r1, r15 23b12: 6c f4 brge .+26 ; 0x23b2e <__vector_17+0x45e> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Y_AXIS); 23b14: 22 60 ori r18, 0x02 ; 2 step_events_completed.wide = current_block->step_event_count.wide; 23b16: c0 88 ldd r12, Z+16 ; 0x10 23b18: d1 88 ldd r13, Z+17 ; 0x11 23b1a: e2 88 ldd r14, Z+18 ; 0x12 23b1c: f3 88 ldd r15, Z+19 ; 0x13 23b1e: c0 92 53 05 sts 0x0553, r12 ; 0x800553 23b22: d0 92 54 05 sts 0x0554, r13 ; 0x800554 23b26: e0 92 55 05 sts 0x0555, r14 ; 0x800555 23b2a: f0 92 56 05 sts 0x0556, r15 ; 0x800556 step_events_completed.wide = current_block->step_event_count.wide; } #endif } if ((out_bits & (1< { #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT) if (! check_z_endstop) { 23b32: 51 11 cpse r21, r1 23b34: 1c c0 rjmp .+56 ; 0x23b6e <__vector_17+0x49e> SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 23b36: 1c 9b sbis 0x03, 4 ; 3 23b38: 8a c1 rjmp .+788 ; 0x23e4e <__vector_17+0x77e> 23b3a: 84 60 ori r24, 0x04 ; 4 #endif //TMC2130_SG_HOMING if((_endstop & _old_endstop & _BV(Z_AXIS)) && (current_block->steps[Z_AXIS].wide > 0)) { 23b3c: 94 70 andi r25, 0x04 ; 4 #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING if((_endstop & _old_endstop & _BV(Z_AXIS + 4)) && (current_block->steps[Z_AXIS].wide > 0)) { 23b3e: 98 23 and r25, r24 23b40: b1 f0 breq .+44 ; 0x23b6e <__vector_17+0x49e> 23b42: c0 84 ldd r12, Z+8 ; 0x08 23b44: d1 84 ldd r13, Z+9 ; 0x09 23b46: e2 84 ldd r14, Z+10 ; 0x0a 23b48: f3 84 ldd r15, Z+11 ; 0x0b 23b4a: 1c 14 cp r1, r12 23b4c: 1d 04 cpc r1, r13 23b4e: 1e 04 cpc r1, r14 23b50: 1f 04 cpc r1, r15 23b52: 6c f4 brge .+26 ; 0x23b6e <__vector_17+0x49e> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Z_AXIS); 23b54: 24 60 ori r18, 0x04 ; 4 step_events_completed.wide = current_block->step_event_count.wide; 23b56: c0 88 ldd r12, Z+16 ; 0x10 23b58: d1 88 ldd r13, Z+17 ; 0x11 23b5a: e2 88 ldd r14, Z+18 ; 0x12 23b5c: f3 88 ldd r15, Z+19 ; 0x13 23b5e: c0 92 53 05 sts 0x0553, r12 ; 0x800553 23b62: d0 92 54 05 sts 0x0554, r13 ; 0x800554 23b66: e0 92 55 05 sts 0x0555, r14 ; 0x800555 23b6a: f0 92 56 05 sts 0x0556, r15 ; 0x800556 } #endif } endstop = _endstop; 23b6e: 80 93 51 05 sts 0x0551, r24 ; 0x800551 old_endstop = _endstop; //apply current endstop state to the old endstop 23b72: 80 93 50 05 sts 0x0550, r24 ; 0x800550 endstop_hit = _endstop_hit; 23b76: 20 93 5e 04 sts 0x045E, r18 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> } // Supporting stopping on a trigger of the Z-stop induction sensor, not only for the Z-minus movements. #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT) if (check_z_endstop) { 23b7a: 55 23 and r21, r21 23b7c: f9 f0 breq .+62 ; 0x23bbc <__vector_17+0x4ec> uint8_t _endstop_hit = endstop_hit; 23b7e: 20 91 5e 04 lds r18, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> uint8_t _endstop = endstop; 23b82: 80 91 51 05 lds r24, 0x0551 ; 0x800551 uint8_t _old_endstop = old_endstop; 23b86: 90 91 50 05 lds r25, 0x0550 ; 0x800550 SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 23b8a: 1c 9b sbis 0x03, 4 ; 3 23b8c: 69 c1 rjmp .+722 ; 0x23e60 <__vector_17+0x790> 23b8e: 84 60 ori r24, 0x04 ; 4 #endif //TMC2130_SG_HOMING if(_endstop & _old_endstop & _BV(Z_AXIS)) { 23b90: 94 70 andi r25, 0x04 ; 4 23b92: 98 23 and r25, r24 23b94: 69 f0 breq .+26 ; 0x23bb0 <__vector_17+0x4e0> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Z_AXIS); 23b96: 24 60 ori r18, 0x04 ; 4 step_events_completed.wide = current_block->step_event_count.wide; 23b98: 40 89 ldd r20, Z+16 ; 0x10 23b9a: 51 89 ldd r21, Z+17 ; 0x11 23b9c: 62 89 ldd r22, Z+18 ; 0x12 23b9e: 73 89 ldd r23, Z+19 ; 0x13 23ba0: 40 93 53 05 sts 0x0553, r20 ; 0x800553 23ba4: 50 93 54 05 sts 0x0554, r21 ; 0x800554 23ba8: 60 93 55 05 sts 0x0555, r22 ; 0x800555 23bac: 70 93 56 05 sts 0x0556, r23 ; 0x800556 } endstop = _endstop; 23bb0: 80 93 51 05 sts 0x0551, r24 ; 0x800551 old_endstop = _endstop; //apply current endstop state to the old endstop 23bb4: 80 93 50 05 sts 0x0550, r24 ; 0x800550 endstop_hit = _endstop_hit; 23bb8: 20 93 5e 04 sts 0x045E, r18 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> stepper_next_block(); if (current_block != NULL) { stepper_check_endstops(); if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) 23bbc: 85 a9 ldd r24, Z+53 ; 0x35 } FORCE_INLINE void stepper_tick_lowres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 23bbe: c0 e0 ldi r28, 0x00 ; 0 stepper_next_block(); if (current_block != NULL) { stepper_check_endstops(); if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) 23bc0: 83 ff sbrs r24, 3 23bc2: 50 c1 rjmp .+672 ; 0x23e64 <__vector_17+0x794> } FORCE_INLINE void stepper_tick_lowres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 23bc4: 80 91 70 05 lds r24, 0x0570 ; 0x800570 23bc8: c8 17 cp r28, r24 23bca: 08 f0 brcs .+2 ; 0x23bce <__vector_17+0x4fe> 23bcc: bd c2 rjmp .+1402 ; 0x24148 <__vector_17+0xa78> MSerial.checkRx(); // Check for serial chars. 23bce: 0f 94 1f 03 call 0x2063e ; 0x2063e // Step in X axis counter[X_AXIS].lo += current_block->steps[X_AXIS].lo; 23bd2: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23bd6: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23bda: 80 81 ld r24, Z 23bdc: 91 81 ldd r25, Z+1 ; 0x01 23bde: 20 91 58 05 lds r18, 0x0558 ; 0x800558 23be2: 30 91 59 05 lds r19, 0x0559 ; 0x800559 23be6: 82 0f add r24, r18 23be8: 93 1f adc r25, r19 23bea: 90 93 59 05 sts 0x0559, r25 ; 0x800559 23bee: 80 93 58 05 sts 0x0558, r24 ; 0x800558 if (counter[X_AXIS].lo > 0) { 23bf2: 18 16 cp r1, r24 23bf4: 19 06 cpc r1, r25 23bf6: 6c f5 brge .+90 ; 0x23c52 <__vector_17+0x582> STEP_NC_HI(X_AXIS); 23bf8: 40 9a sbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_HI(X_DUP_AXIS); #endif //DEBUG_XSTEP_DUP_PIN counter[X_AXIS].lo -= current_block->step_event_count.lo; 23bfa: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23bfe: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23c02: 80 91 58 05 lds r24, 0x0558 ; 0x800558 23c06: 90 91 59 05 lds r25, 0x0559 ; 0x800559 23c0a: 20 89 ldd r18, Z+16 ; 0x10 23c0c: 31 89 ldd r19, Z+17 ; 0x11 23c0e: 82 1b sub r24, r18 23c10: 93 0b sbc r25, r19 23c12: 90 93 59 05 sts 0x0559, r25 ; 0x800559 23c16: 80 93 58 05 sts 0x0558, r24 ; 0x800558 count_position[X_AXIS]+=count_direction[X_AXIS]; 23c1a: 90 91 5b 02 lds r25, 0x025B ; 0x80025b 23c1e: 40 91 4c 06 lds r20, 0x064C ; 0x80064c 23c22: 50 91 4d 06 lds r21, 0x064D ; 0x80064d 23c26: 60 91 4e 06 lds r22, 0x064E ; 0x80064e 23c2a: 70 91 4f 06 lds r23, 0x064F ; 0x80064f 23c2e: 89 2f mov r24, r25 23c30: 99 0f add r25, r25 23c32: 99 0b sbc r25, r25 23c34: aa 0b sbc r26, r26 23c36: bb 0b sbc r27, r27 23c38: 84 0f add r24, r20 23c3a: 95 1f adc r25, r21 23c3c: a6 1f adc r26, r22 23c3e: b7 1f adc r27, r23 23c40: 80 93 4c 06 sts 0x064C, r24 ; 0x80064c 23c44: 90 93 4d 06 sts 0x064D, r25 ; 0x80064d 23c48: a0 93 4e 06 sts 0x064E, r26 ; 0x80064e 23c4c: b0 93 4f 06 sts 0x064F, r27 ; 0x80064f STEP_NC_LO(X_AXIS); 23c50: 40 98 cbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_LO(X_DUP_AXIS); #endif //DEBUG_XSTEP_DUP_PIN } // Step in Y axis counter[Y_AXIS].lo += current_block->steps[Y_AXIS].lo; 23c52: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23c56: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23c5a: 84 81 ldd r24, Z+4 ; 0x04 23c5c: 95 81 ldd r25, Z+5 ; 0x05 23c5e: 20 91 5c 05 lds r18, 0x055C ; 0x80055c 23c62: 30 91 5d 05 lds r19, 0x055D ; 0x80055d 23c66: 82 0f add r24, r18 23c68: 93 1f adc r25, r19 23c6a: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 23c6e: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c if (counter[Y_AXIS].lo > 0) { 23c72: 18 16 cp r1, r24 23c74: 19 06 cpc r1, r25 23c76: 4c f5 brge .+82 ; 0x23cca <__vector_17+0x5fa> STEP_NC_HI(Y_AXIS); 23c78: 41 9a sbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_HI(Y_DUP_AXIS); #endif //DEBUG_YSTEP_DUP_PIN counter[Y_AXIS].lo -= current_block->step_event_count.lo; 23c7a: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23c7e: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23c82: 20 89 ldd r18, Z+16 ; 0x10 23c84: 31 89 ldd r19, Z+17 ; 0x11 23c86: 82 1b sub r24, r18 23c88: 93 0b sbc r25, r19 23c8a: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 23c8e: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c count_position[Y_AXIS]+=count_direction[Y_AXIS]; 23c92: 90 91 5c 02 lds r25, 0x025C ; 0x80025c 23c96: 40 91 50 06 lds r20, 0x0650 ; 0x800650 23c9a: 50 91 51 06 lds r21, 0x0651 ; 0x800651 23c9e: 60 91 52 06 lds r22, 0x0652 ; 0x800652 23ca2: 70 91 53 06 lds r23, 0x0653 ; 0x800653 23ca6: 89 2f mov r24, r25 23ca8: 99 0f add r25, r25 23caa: 99 0b sbc r25, r25 23cac: aa 0b sbc r26, r26 23cae: bb 0b sbc r27, r27 23cb0: 84 0f add r24, r20 23cb2: 95 1f adc r25, r21 23cb4: a6 1f adc r26, r22 23cb6: b7 1f adc r27, r23 23cb8: 80 93 50 06 sts 0x0650, r24 ; 0x800650 23cbc: 90 93 51 06 sts 0x0651, r25 ; 0x800651 23cc0: a0 93 52 06 sts 0x0652, r26 ; 0x800652 23cc4: b0 93 53 06 sts 0x0653, r27 ; 0x800653 STEP_NC_LO(Y_AXIS); 23cc8: 41 98 cbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_LO(Y_DUP_AXIS); #endif //DEBUG_YSTEP_DUP_PIN } // Step in Z axis counter[Z_AXIS].lo += current_block->steps[Z_AXIS].lo; 23cca: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23cce: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23cd2: 80 85 ldd r24, Z+8 ; 0x08 23cd4: 91 85 ldd r25, Z+9 ; 0x09 23cd6: 20 91 60 05 lds r18, 0x0560 ; 0x800560 23cda: 30 91 61 05 lds r19, 0x0561 ; 0x800561 23cde: 82 0f add r24, r18 23ce0: 93 1f adc r25, r19 23ce2: 90 93 61 05 sts 0x0561, r25 ; 0x800561 23ce6: 80 93 60 05 sts 0x0560, r24 ; 0x800560 if (counter[Z_AXIS].lo > 0) { 23cea: 18 16 cp r1, r24 23cec: 19 06 cpc r1, r25 23cee: 4c f5 brge .+82 ; 0x23d42 <__vector_17+0x672> STEP_NC_HI(Z_AXIS); 23cf0: 42 9a sbi 0x08, 2 ; 8 counter[Z_AXIS].lo -= current_block->step_event_count.lo; 23cf2: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23cf6: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23cfa: 20 89 ldd r18, Z+16 ; 0x10 23cfc: 31 89 ldd r19, Z+17 ; 0x11 23cfe: 82 1b sub r24, r18 23d00: 93 0b sbc r25, r19 23d02: 90 93 61 05 sts 0x0561, r25 ; 0x800561 23d06: 80 93 60 05 sts 0x0560, r24 ; 0x800560 count_position[Z_AXIS]+=count_direction[Z_AXIS]; 23d0a: 90 91 5d 02 lds r25, 0x025D ; 0x80025d 23d0e: 40 91 54 06 lds r20, 0x0654 ; 0x800654 23d12: 50 91 55 06 lds r21, 0x0655 ; 0x800655 23d16: 60 91 56 06 lds r22, 0x0656 ; 0x800656 23d1a: 70 91 57 06 lds r23, 0x0657 ; 0x800657 23d1e: 89 2f mov r24, r25 23d20: 99 0f add r25, r25 23d22: 99 0b sbc r25, r25 23d24: aa 0b sbc r26, r26 23d26: bb 0b sbc r27, r27 23d28: 84 0f add r24, r20 23d2a: 95 1f adc r25, r21 23d2c: a6 1f adc r26, r22 23d2e: b7 1f adc r27, r23 23d30: 80 93 54 06 sts 0x0654, r24 ; 0x800654 23d34: 90 93 55 06 sts 0x0655, r25 ; 0x800655 23d38: a0 93 56 06 sts 0x0656, r26 ; 0x800656 23d3c: b0 93 57 06 sts 0x0657, r27 ; 0x800657 STEP_NC_LO(Z_AXIS); 23d40: 42 98 cbi 0x08, 2 ; 8 } // Step in E axis counter[E_AXIS].lo += current_block->steps[E_AXIS].lo; 23d42: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23d46: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23d4a: 80 91 64 05 lds r24, 0x0564 ; 0x800564 23d4e: 90 91 65 05 lds r25, 0x0565 ; 0x800565 23d52: 24 85 ldd r18, Z+12 ; 0x0c 23d54: 35 85 ldd r19, Z+13 ; 0x0d 23d56: 82 0f add r24, r18 23d58: 93 1f adc r25, r19 23d5a: 90 93 65 05 sts 0x0565, r25 ; 0x800565 23d5e: 80 93 64 05 sts 0x0564, r24 ; 0x800564 23d62: 20 89 ldd r18, Z+16 ; 0x10 23d64: 31 89 ldd r19, Z+17 ; 0x11 if (counter[E_AXIS].lo > 0) { 23d66: 18 16 cp r1, r24 23d68: 19 06 cpc r1, r25 23d6a: 44 f5 brge .+80 ; 0x23dbc <__vector_17+0x6ec> #ifndef LIN_ADVANCE STEP_NC_HI(E_AXIS); #endif /* LIN_ADVANCE */ counter[E_AXIS].lo -= current_block->step_event_count.lo; 23d6c: 82 1b sub r24, r18 23d6e: 93 0b sbc r25, r19 23d70: 90 93 65 05 sts 0x0565, r25 ; 0x800565 23d74: 80 93 64 05 sts 0x0564, r24 ; 0x800564 count_position[E_AXIS] += count_direction[E_AXIS]; 23d78: 90 91 5e 02 lds r25, 0x025E ; 0x80025e 23d7c: 40 91 58 06 lds r20, 0x0658 ; 0x800658 23d80: 50 91 59 06 lds r21, 0x0659 ; 0x800659 23d84: 60 91 5a 06 lds r22, 0x065A ; 0x80065a 23d88: 70 91 5b 06 lds r23, 0x065B ; 0x80065b 23d8c: 89 2f mov r24, r25 23d8e: 99 0f add r25, r25 23d90: 99 0b sbc r25, r25 23d92: aa 0b sbc r26, r26 23d94: bb 0b sbc r27, r27 23d96: 84 0f add r24, r20 23d98: 95 1f adc r25, r21 23d9a: a6 1f adc r26, r22 23d9c: b7 1f adc r27, r23 23d9e: 80 93 58 06 sts 0x0658, r24 ; 0x800658 23da2: 90 93 59 06 sts 0x0659, r25 ; 0x800659 23da6: a0 93 5a 06 sts 0x065A, r26 ; 0x80065a 23daa: b0 93 5b 06 sts 0x065B, r27 ; 0x80065b #ifdef LIN_ADVANCE e_steps += count_direction[E_AXIS]; 23dae: 90 91 5e 02 lds r25, 0x025E ; 0x80025e 23db2: 80 91 69 05 lds r24, 0x0569 ; 0x800569 23db6: 89 0f add r24, r25 23db8: 80 93 69 05 sts 0x0569, r24 ; 0x800569 fsensor.stStep(count_direction[E_AXIS] < 0); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) STEP_NC_LO(E_AXIS); #endif } if(++ step_events_completed.lo >= current_block->step_event_count.lo) 23dbc: 80 91 53 05 lds r24, 0x0553 ; 0x800553 23dc0: 90 91 54 05 lds r25, 0x0554 ; 0x800554 23dc4: 01 96 adiw r24, 0x01 ; 1 23dc6: 90 93 54 05 sts 0x0554, r25 ; 0x800554 23dca: 80 93 53 05 sts 0x0553, r24 ; 0x800553 23dce: 82 17 cp r24, r18 23dd0: 93 07 cpc r25, r19 23dd2: 08 f0 brcs .+2 ; 0x23dd6 <__vector_17+0x706> 23dd4: b9 c1 rjmp .+882 ; 0x24148 <__vector_17+0xa78> } FORCE_INLINE void stepper_tick_lowres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 23dd6: cf 5f subi r28, 0xFF ; 255 23dd8: f5 ce rjmp .-534 ; 0x23bc4 <__vector_17+0x4f4> // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY) if((out_bits & (1< 23dde: 82 60 ori r24, 0x02 ; 2 23de0: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[X_AXIS]=1; 23de4: 81 e0 ldi r24, 0x01 ; 1 23de6: 2e ce rjmp .-932 ; 0x23a44 <__vector_17+0x374> } if((out_bits & (1< 23dec: 81 60 ori r24, 0x01 ; 1 23dee: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Y_AXIS]=1; 23df2: 81 e0 ldi r24, 0x01 ; 1 23df4: 33 ce rjmp .-922 ; 0x23a5c <__vector_17+0x38c> } if ((out_bits & (1< 23dfa: 84 60 ori r24, 0x04 ; 4 23dfc: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Z_AXIS]=1; 23e00: 81 e0 ldi r24, 0x01 ; 1 23e02: 38 ce rjmp .-912 ; 0x23a74 <__vector_17+0x3a4> count_direction[E_AXIS] = -1; } else { // +direction #ifndef LIN_ADVANCE WRITE(E0_DIR_PIN, !INVERT_E0_DIR); #endif /* LIN_ADVANCE */ count_direction[E_AXIS] = 1; 23e04: 81 e0 ldi r24, 0x01 ; 1 23e06: 3d ce rjmp .-902 ; 0x23a82 <__vector_17+0x3b2> } } else { _NEXT_ISR(2000); // 1kHz. 23e08: 80 ed ldi r24, 0xD0 ; 208 23e0a: 97 e0 ldi r25, 0x07 ; 7 23e0c: 90 93 4f 04 sts 0x044F, r25 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 23e10: 80 93 4e 04 sts 0x044E, r24 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 23e14: 90 93 4b 04 sts 0x044B, r25 ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> 23e18: 80 93 4a 04 sts 0x044A, r24 ; 0x80044a <_ZL9main_Rate.lto_priv.440> #ifdef LIN_ADVANCE // reset LA state when there's no block nextAdvanceISR = ADV_NEVER; 23e1c: 8f ef ldi r24, 0xFF ; 255 23e1e: 9f ef ldi r25, 0xFF ; 255 23e20: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 23e24: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> e_steps = 0; 23e28: 10 92 69 05 sts 0x0569, r1 ; 0x800569 // incrementally lose pressure to give a chance for // a new LA block to be scheduled and recover if(current_adv_steps) 23e2c: 80 91 48 04 lds r24, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 23e30: 90 91 49 04 lds r25, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 23e34: 00 97 sbiw r24, 0x00 ; 0 23e36: 09 f4 brne .+2 ; 0x23e3a <__vector_17+0x76a> 23e38: 26 ce rjmp .-948 ; 0x23a86 <__vector_17+0x3b6> --current_adv_steps; 23e3a: 01 97 sbiw r24, 0x01 ; 1 23e3c: 90 93 49 04 sts 0x0449, r25 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 23e40: 80 93 48 04 sts 0x0448, r24 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 23e44: 20 ce rjmp .-960 ; 0x23a86 <__vector_17+0x3b6> #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING)); 23e46: 8e 7f andi r24, 0xFE ; 254 23e48: 39 ce rjmp .-910 ; 0x23abc <__vector_17+0x3ec> #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING)); 23e4a: 8d 7f andi r24, 0xFD ; 253 23e4c: 56 ce rjmp .-852 ; 0x23afa <__vector_17+0x42a> SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 23e4e: 8b 7f andi r24, 0xFB ; 251 23e50: 75 ce rjmp .-790 ; 0x23b3c <__vector_17+0x46c> SET_BIT_TO(_endstop, Z_AXIS + 4, 0); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING)); 23e52: 01 99 sbic 0x00, 1 ; 0 23e54: 03 c0 rjmp .+6 ; 0x23e5c <__vector_17+0x78c> 23e56: 80 64 ori r24, 0x40 ; 64 #endif //TMC2130_SG_HOMING if((_endstop & _old_endstop & _BV(Z_AXIS + 4)) && (current_block->steps[Z_AXIS].wide > 0)) { 23e58: 90 74 andi r25, 0x40 ; 64 23e5a: 71 ce rjmp .-798 ; 0x23b3e <__vector_17+0x46e> SET_BIT_TO(_endstop, Z_AXIS + 4, 0); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING)); 23e5c: 8f 7b andi r24, 0xBF ; 191 23e5e: fc cf rjmp .-8 ; 0x23e58 <__vector_17+0x788> SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 23e60: 8b 7f andi r24, 0xFB ; 251 23e62: 96 ce rjmp .-724 ; 0x23b90 <__vector_17+0x4c0> } } FORCE_INLINE void stepper_tick_highres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 23e64: 80 91 70 05 lds r24, 0x0570 ; 0x800570 23e68: c8 17 cp r28, r24 23e6a: 08 f0 brcs .+2 ; 0x23e6e <__vector_17+0x79e> 23e6c: 6d c1 rjmp .+730 ; 0x24148 <__vector_17+0xa78> MSerial.checkRx(); // Check for serial chars. 23e6e: 0f 94 1f 03 call 0x2063e ; 0x2063e // Step in X axis counter[X_AXIS].wide += current_block->steps[X_AXIS].wide; 23e72: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23e76: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23e7a: 80 81 ld r24, Z 23e7c: 91 81 ldd r25, Z+1 ; 0x01 23e7e: a2 81 ldd r26, Z+2 ; 0x02 23e80: b3 81 ldd r27, Z+3 ; 0x03 23e82: 40 91 58 05 lds r20, 0x0558 ; 0x800558 23e86: 50 91 59 05 lds r21, 0x0559 ; 0x800559 23e8a: 60 91 5a 05 lds r22, 0x055A ; 0x80055a 23e8e: 70 91 5b 05 lds r23, 0x055B ; 0x80055b 23e92: 84 0f add r24, r20 23e94: 95 1f adc r25, r21 23e96: a6 1f adc r26, r22 23e98: b7 1f adc r27, r23 23e9a: 80 93 58 05 sts 0x0558, r24 ; 0x800558 23e9e: 90 93 59 05 sts 0x0559, r25 ; 0x800559 23ea2: a0 93 5a 05 sts 0x055A, r26 ; 0x80055a 23ea6: b0 93 5b 05 sts 0x055B, r27 ; 0x80055b if (counter[X_AXIS].wide > 0) { 23eaa: 18 16 cp r1, r24 23eac: 19 06 cpc r1, r25 23eae: 1a 06 cpc r1, r26 23eb0: 1b 06 cpc r1, r27 23eb2: cc f5 brge .+114 ; 0x23f26 <__vector_17+0x856> STEP_NC_HI(X_AXIS); 23eb4: 40 9a sbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_HI(X_DUP_AXIS); #endif //DEBUG_XSTEP_DUP_PIN counter[X_AXIS].wide -= current_block->step_event_count.wide; 23eb6: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23eba: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23ebe: 80 91 58 05 lds r24, 0x0558 ; 0x800558 23ec2: 90 91 59 05 lds r25, 0x0559 ; 0x800559 23ec6: a0 91 5a 05 lds r26, 0x055A ; 0x80055a 23eca: b0 91 5b 05 lds r27, 0x055B ; 0x80055b 23ece: 40 89 ldd r20, Z+16 ; 0x10 23ed0: 51 89 ldd r21, Z+17 ; 0x11 23ed2: 62 89 ldd r22, Z+18 ; 0x12 23ed4: 73 89 ldd r23, Z+19 ; 0x13 23ed6: 84 1b sub r24, r20 23ed8: 95 0b sbc r25, r21 23eda: a6 0b sbc r26, r22 23edc: b7 0b sbc r27, r23 23ede: 80 93 58 05 sts 0x0558, r24 ; 0x800558 23ee2: 90 93 59 05 sts 0x0559, r25 ; 0x800559 23ee6: a0 93 5a 05 sts 0x055A, r26 ; 0x80055a 23eea: b0 93 5b 05 sts 0x055B, r27 ; 0x80055b count_position[X_AXIS]+=count_direction[X_AXIS]; 23eee: 90 91 5b 02 lds r25, 0x025B ; 0x80025b 23ef2: 40 91 4c 06 lds r20, 0x064C ; 0x80064c 23ef6: 50 91 4d 06 lds r21, 0x064D ; 0x80064d 23efa: 60 91 4e 06 lds r22, 0x064E ; 0x80064e 23efe: 70 91 4f 06 lds r23, 0x064F ; 0x80064f 23f02: 89 2f mov r24, r25 23f04: 99 0f add r25, r25 23f06: 99 0b sbc r25, r25 23f08: aa 0b sbc r26, r26 23f0a: bb 0b sbc r27, r27 23f0c: 84 0f add r24, r20 23f0e: 95 1f adc r25, r21 23f10: a6 1f adc r26, r22 23f12: b7 1f adc r27, r23 23f14: 80 93 4c 06 sts 0x064C, r24 ; 0x80064c 23f18: 90 93 4d 06 sts 0x064D, r25 ; 0x80064d 23f1c: a0 93 4e 06 sts 0x064E, r26 ; 0x80064e 23f20: b0 93 4f 06 sts 0x064F, r27 ; 0x80064f STEP_NC_LO(X_AXIS); 23f24: 40 98 cbi 0x08, 0 ; 8 #ifdef DEBUG_XSTEP_DUP_PIN STEP_NC_LO(X_DUP_AXIS); #endif //DEBUG_XSTEP_DUP_PIN } // Step in Y axis counter[Y_AXIS].wide += current_block->steps[Y_AXIS].wide; 23f26: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23f2a: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23f2e: 84 81 ldd r24, Z+4 ; 0x04 23f30: 95 81 ldd r25, Z+5 ; 0x05 23f32: a6 81 ldd r26, Z+6 ; 0x06 23f34: b7 81 ldd r27, Z+7 ; 0x07 23f36: 40 91 5c 05 lds r20, 0x055C ; 0x80055c 23f3a: 50 91 5d 05 lds r21, 0x055D ; 0x80055d 23f3e: 60 91 5e 05 lds r22, 0x055E ; 0x80055e 23f42: 70 91 5f 05 lds r23, 0x055F ; 0x80055f 23f46: 84 0f add r24, r20 23f48: 95 1f adc r25, r21 23f4a: a6 1f adc r26, r22 23f4c: b7 1f adc r27, r23 23f4e: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c 23f52: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 23f56: a0 93 5e 05 sts 0x055E, r26 ; 0x80055e 23f5a: b0 93 5f 05 sts 0x055F, r27 ; 0x80055f if (counter[Y_AXIS].wide > 0) { 23f5e: 18 16 cp r1, r24 23f60: 19 06 cpc r1, r25 23f62: 1a 06 cpc r1, r26 23f64: 1b 06 cpc r1, r27 23f66: 8c f5 brge .+98 ; 0x23fca <__vector_17+0x8fa> STEP_NC_HI(Y_AXIS); 23f68: 41 9a sbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_HI(Y_DUP_AXIS); #endif //DEBUG_YSTEP_DUP_PIN counter[Y_AXIS].wide -= current_block->step_event_count.wide; 23f6a: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23f6e: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23f72: 40 89 ldd r20, Z+16 ; 0x10 23f74: 51 89 ldd r21, Z+17 ; 0x11 23f76: 62 89 ldd r22, Z+18 ; 0x12 23f78: 73 89 ldd r23, Z+19 ; 0x13 23f7a: 84 1b sub r24, r20 23f7c: 95 0b sbc r25, r21 23f7e: a6 0b sbc r26, r22 23f80: b7 0b sbc r27, r23 23f82: 80 93 5c 05 sts 0x055C, r24 ; 0x80055c 23f86: 90 93 5d 05 sts 0x055D, r25 ; 0x80055d 23f8a: a0 93 5e 05 sts 0x055E, r26 ; 0x80055e 23f8e: b0 93 5f 05 sts 0x055F, r27 ; 0x80055f count_position[Y_AXIS]+=count_direction[Y_AXIS]; 23f92: 90 91 5c 02 lds r25, 0x025C ; 0x80025c 23f96: 40 91 50 06 lds r20, 0x0650 ; 0x800650 23f9a: 50 91 51 06 lds r21, 0x0651 ; 0x800651 23f9e: 60 91 52 06 lds r22, 0x0652 ; 0x800652 23fa2: 70 91 53 06 lds r23, 0x0653 ; 0x800653 23fa6: 89 2f mov r24, r25 23fa8: 99 0f add r25, r25 23faa: 99 0b sbc r25, r25 23fac: aa 0b sbc r26, r26 23fae: bb 0b sbc r27, r27 23fb0: 84 0f add r24, r20 23fb2: 95 1f adc r25, r21 23fb4: a6 1f adc r26, r22 23fb6: b7 1f adc r27, r23 23fb8: 80 93 50 06 sts 0x0650, r24 ; 0x800650 23fbc: 90 93 51 06 sts 0x0651, r25 ; 0x800651 23fc0: a0 93 52 06 sts 0x0652, r26 ; 0x800652 23fc4: b0 93 53 06 sts 0x0653, r27 ; 0x800653 STEP_NC_LO(Y_AXIS); 23fc8: 41 98 cbi 0x08, 1 ; 8 #ifdef DEBUG_YSTEP_DUP_PIN STEP_NC_LO(Y_DUP_AXIS); #endif //DEBUG_YSTEP_DUP_PIN } // Step in Z axis counter[Z_AXIS].wide += current_block->steps[Z_AXIS].wide; 23fca: e0 91 51 12 lds r30, 0x1251 ; 0x801251 23fce: f0 91 52 12 lds r31, 0x1252 ; 0x801252 23fd2: 80 85 ldd r24, Z+8 ; 0x08 23fd4: 91 85 ldd r25, Z+9 ; 0x09 23fd6: a2 85 ldd r26, Z+10 ; 0x0a 23fd8: b3 85 ldd r27, Z+11 ; 0x0b 23fda: 40 91 60 05 lds r20, 0x0560 ; 0x800560 23fde: 50 91 61 05 lds r21, 0x0561 ; 0x800561 23fe2: 60 91 62 05 lds r22, 0x0562 ; 0x800562 23fe6: 70 91 63 05 lds r23, 0x0563 ; 0x800563 23fea: 84 0f add r24, r20 23fec: 95 1f adc r25, r21 23fee: a6 1f adc r26, r22 23ff0: b7 1f adc r27, r23 23ff2: 80 93 60 05 sts 0x0560, r24 ; 0x800560 23ff6: 90 93 61 05 sts 0x0561, r25 ; 0x800561 23ffa: a0 93 62 05 sts 0x0562, r26 ; 0x800562 23ffe: b0 93 63 05 sts 0x0563, r27 ; 0x800563 if (counter[Z_AXIS].wide > 0) { 24002: 18 16 cp r1, r24 24004: 19 06 cpc r1, r25 24006: 1a 06 cpc r1, r26 24008: 1b 06 cpc r1, r27 2400a: 8c f5 brge .+98 ; 0x2406e <__vector_17+0x99e> STEP_NC_HI(Z_AXIS); 2400c: 42 9a sbi 0x08, 2 ; 8 counter[Z_AXIS].wide -= current_block->step_event_count.wide; 2400e: e0 91 51 12 lds r30, 0x1251 ; 0x801251 24012: f0 91 52 12 lds r31, 0x1252 ; 0x801252 24016: 40 89 ldd r20, Z+16 ; 0x10 24018: 51 89 ldd r21, Z+17 ; 0x11 2401a: 62 89 ldd r22, Z+18 ; 0x12 2401c: 73 89 ldd r23, Z+19 ; 0x13 2401e: 84 1b sub r24, r20 24020: 95 0b sbc r25, r21 24022: a6 0b sbc r26, r22 24024: b7 0b sbc r27, r23 24026: 80 93 60 05 sts 0x0560, r24 ; 0x800560 2402a: 90 93 61 05 sts 0x0561, r25 ; 0x800561 2402e: a0 93 62 05 sts 0x0562, r26 ; 0x800562 24032: b0 93 63 05 sts 0x0563, r27 ; 0x800563 count_position[Z_AXIS]+=count_direction[Z_AXIS]; 24036: 90 91 5d 02 lds r25, 0x025D ; 0x80025d 2403a: 40 91 54 06 lds r20, 0x0654 ; 0x800654 2403e: 50 91 55 06 lds r21, 0x0655 ; 0x800655 24042: 60 91 56 06 lds r22, 0x0656 ; 0x800656 24046: 70 91 57 06 lds r23, 0x0657 ; 0x800657 2404a: 89 2f mov r24, r25 2404c: 99 0f add r25, r25 2404e: 99 0b sbc r25, r25 24050: aa 0b sbc r26, r26 24052: bb 0b sbc r27, r27 24054: 84 0f add r24, r20 24056: 95 1f adc r25, r21 24058: a6 1f adc r26, r22 2405a: b7 1f adc r27, r23 2405c: 80 93 54 06 sts 0x0654, r24 ; 0x800654 24060: 90 93 55 06 sts 0x0655, r25 ; 0x800655 24064: a0 93 56 06 sts 0x0656, r26 ; 0x800656 24068: b0 93 57 06 sts 0x0657, r27 ; 0x800657 STEP_NC_LO(Z_AXIS); 2406c: 42 98 cbi 0x08, 2 ; 8 } // Step in E axis counter[E_AXIS].wide += current_block->steps[E_AXIS].wide; 2406e: e0 91 51 12 lds r30, 0x1251 ; 0x801251 24072: f0 91 52 12 lds r31, 0x1252 ; 0x801252 24076: 80 91 64 05 lds r24, 0x0564 ; 0x800564 2407a: 90 91 65 05 lds r25, 0x0565 ; 0x800565 2407e: a0 91 66 05 lds r26, 0x0566 ; 0x800566 24082: b0 91 67 05 lds r27, 0x0567 ; 0x800567 24086: 44 85 ldd r20, Z+12 ; 0x0c 24088: 55 85 ldd r21, Z+13 ; 0x0d 2408a: 66 85 ldd r22, Z+14 ; 0x0e 2408c: 77 85 ldd r23, Z+15 ; 0x0f 2408e: 84 0f add r24, r20 24090: 95 1f adc r25, r21 24092: a6 1f adc r26, r22 24094: b7 1f adc r27, r23 24096: 80 93 64 05 sts 0x0564, r24 ; 0x800564 2409a: 90 93 65 05 sts 0x0565, r25 ; 0x800565 2409e: a0 93 66 05 sts 0x0566, r26 ; 0x800566 240a2: b0 93 67 05 sts 0x0567, r27 ; 0x800567 240a6: 40 89 ldd r20, Z+16 ; 0x10 240a8: 51 89 ldd r21, Z+17 ; 0x11 240aa: 62 89 ldd r22, Z+18 ; 0x12 240ac: 73 89 ldd r23, Z+19 ; 0x13 if (counter[E_AXIS].wide > 0) { 240ae: 18 16 cp r1, r24 240b0: 19 06 cpc r1, r25 240b2: 1a 06 cpc r1, r26 240b4: 1b 06 cpc r1, r27 240b6: 74 f5 brge .+92 ; 0x24114 <__vector_17+0xa44> #ifndef LIN_ADVANCE STEP_NC_HI(E_AXIS); #endif /* LIN_ADVANCE */ counter[E_AXIS].wide -= current_block->step_event_count.wide; 240b8: 84 1b sub r24, r20 240ba: 95 0b sbc r25, r21 240bc: a6 0b sbc r26, r22 240be: b7 0b sbc r27, r23 240c0: 80 93 64 05 sts 0x0564, r24 ; 0x800564 240c4: 90 93 65 05 sts 0x0565, r25 ; 0x800565 240c8: a0 93 66 05 sts 0x0566, r26 ; 0x800566 240cc: b0 93 67 05 sts 0x0567, r27 ; 0x800567 count_position[E_AXIS] += count_direction[E_AXIS]; 240d0: 90 91 5e 02 lds r25, 0x025E ; 0x80025e 240d4: c0 90 58 06 lds r12, 0x0658 ; 0x800658 240d8: d0 90 59 06 lds r13, 0x0659 ; 0x800659 240dc: e0 90 5a 06 lds r14, 0x065A ; 0x80065a 240e0: f0 90 5b 06 lds r15, 0x065B ; 0x80065b 240e4: 89 2f mov r24, r25 240e6: 99 0f add r25, r25 240e8: 99 0b sbc r25, r25 240ea: aa 0b sbc r26, r26 240ec: bb 0b sbc r27, r27 240ee: 8c 0d add r24, r12 240f0: 9d 1d adc r25, r13 240f2: ae 1d adc r26, r14 240f4: bf 1d adc r27, r15 240f6: 80 93 58 06 sts 0x0658, r24 ; 0x800658 240fa: 90 93 59 06 sts 0x0659, r25 ; 0x800659 240fe: a0 93 5a 06 sts 0x065A, r26 ; 0x80065a 24102: b0 93 5b 06 sts 0x065B, r27 ; 0x80065b #ifdef LIN_ADVANCE e_steps += count_direction[E_AXIS]; 24106: 90 91 5e 02 lds r25, 0x025E ; 0x80025e 2410a: 80 91 69 05 lds r24, 0x0569 ; 0x800569 2410e: 89 0f add r24, r25 24110: 80 93 69 05 sts 0x0569, r24 ; 0x800569 fsensor.stStep(count_direction[E_AXIS] < 0); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) STEP_NC_LO(E_AXIS); #endif } if(++ step_events_completed.wide >= current_block->step_event_count.wide) 24114: 80 91 53 05 lds r24, 0x0553 ; 0x800553 24118: 90 91 54 05 lds r25, 0x0554 ; 0x800554 2411c: a0 91 55 05 lds r26, 0x0555 ; 0x800555 24120: b0 91 56 05 lds r27, 0x0556 ; 0x800556 24124: 01 96 adiw r24, 0x01 ; 1 24126: a1 1d adc r26, r1 24128: b1 1d adc r27, r1 2412a: 80 93 53 05 sts 0x0553, r24 ; 0x800553 2412e: 90 93 54 05 sts 0x0554, r25 ; 0x800554 24132: a0 93 55 05 sts 0x0555, r26 ; 0x800555 24136: b0 93 56 05 sts 0x0556, r27 ; 0x800556 2413a: 84 17 cp r24, r20 2413c: 95 07 cpc r25, r21 2413e: a6 07 cpc r26, r22 24140: b7 07 cpc r27, r23 24142: 10 f4 brcc .+4 ; 0x24148 <__vector_17+0xa78> } } FORCE_INLINE void stepper_tick_highres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 24144: cf 5f subi r28, 0xFF ; 255 24146: 8e ce rjmp .-740 ; 0x23e64 <__vector_17+0x794> else stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 24148: 80 91 69 05 lds r24, 0x0569 ; 0x800569 2414c: 88 23 and r24, r24 2414e: 39 f0 breq .+14 ; 0x2415e <__vector_17+0xa8e> 24150: 87 ff sbrs r24, 7 24152: f2 c0 rjmp .+484 ; 0x24338 <__vector_17+0xc68> 24154: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24158: 80 64 ori r24, 0x40 ; 64 2415a: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> // Calculate new timer value // 13.38-14.63us for steady state, // 25.12us for acceleration / deceleration. { //WRITE_NC(LOGIC_ANALYZER_CH1, true); if (step_events_completed.wide <= current_block->accelerate_until) { 2415e: 40 91 53 05 lds r20, 0x0553 ; 0x800553 24162: 50 91 54 05 lds r21, 0x0554 ; 0x800554 24166: 60 91 55 05 lds r22, 0x0555 ; 0x800555 2416a: 70 91 56 05 lds r23, 0x0556 ; 0x800556 2416e: c0 91 51 12 lds r28, 0x1251 ; 0x801251 24172: d0 91 52 12 lds r29, 0x1252 ; 0x801252 24176: 89 8d ldd r24, Y+25 ; 0x19 24178: 9a 8d ldd r25, Y+26 ; 0x1a 2417a: ab 8d ldd r26, Y+27 ; 0x1b 2417c: bc 8d ldd r27, Y+28 ; 0x1c 2417e: 84 17 cp r24, r20 24180: 95 07 cpc r25, r21 24182: a6 07 cpc r26, r22 24184: b7 07 cpc r27, r23 24186: 08 f4 brcc .+2 ; 0x2418a <__vector_17+0xaba> 24188: 37 c1 rjmp .+622 ; 0x243f8 <__vector_17+0xd28> // v = t * a -> acc_step_rate = acceleration_time * current_block->acceleration_rate acc_step_rate = MUL24x24R24(acceleration_time, current_block->acceleration_rate); 2418a: c0 90 6c 05 lds r12, 0x056C ; 0x80056c 2418e: d0 90 6d 05 lds r13, 0x056D ; 0x80056d 24192: e0 90 6e 05 lds r14, 0x056E ; 0x80056e 24196: f0 90 6f 05 lds r15, 0x056F ; 0x80056f "adc %B0, r26 \n\t" "clr r1 \n\t" : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1", "r26" , "r27" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. R26 is __zero_reg__, R27 is a temporary register. ); 2419a: 2c 89 ldd r18, Y+20 ; 0x14 2419c: 3d 89 ldd r19, Y+21 ; 0x15 2419e: 4e 89 ldd r20, Y+22 ; 0x16 241a0: aa 27 eor r26, r26 241a2: c3 9e mul r12, r19 241a4: b1 2d mov r27, r1 241a6: d4 9e mul r13, r20 241a8: c0 01 movw r24, r0 241aa: e4 9e mul r14, r20 241ac: 90 0d add r25, r0 241ae: e3 9e mul r14, r19 241b0: 80 0d add r24, r0 241b2: 91 1d adc r25, r1 241b4: c4 9e mul r12, r20 241b6: b0 0d add r27, r0 241b8: 81 1d adc r24, r1 241ba: 9a 1f adc r25, r26 241bc: d3 9e mul r13, r19 241be: b0 0d add r27, r0 241c0: 81 1d adc r24, r1 241c2: 9a 1f adc r25, r26 241c4: e2 9e mul r14, r18 241c6: b0 0d add r27, r0 241c8: 81 1d adc r24, r1 241ca: 9a 1f adc r25, r26 241cc: d2 9e mul r13, r18 241ce: b1 0d add r27, r1 241d0: 8a 1f adc r24, r26 241d2: 9a 1f adc r25, r26 241d4: bb 0f add r27, r27 241d6: 8a 1f adc r24, r26 241d8: 9a 1f adc r25, r26 241da: 11 24 eor r1, r1 acc_step_rate += uint16_t(current_block->initial_rate); 241dc: 2a ad ldd r18, Y+58 ; 0x3a 241de: 3b ad ldd r19, Y+59 ; 0x3b 241e0: 82 0f add r24, r18 241e2: 93 1f adc r25, r19 241e4: 90 93 72 05 sts 0x0572, r25 ; 0x800572 241e8: 80 93 71 05 sts 0x0571, r24 ; 0x800571 // upper limit if(acc_step_rate > uint16_t(current_block->nominal_rate)) 241ec: 2e a9 ldd r18, Y+54 ; 0x36 241ee: 3f a9 ldd r19, Y+55 ; 0x37 241f0: 28 17 cp r18, r24 241f2: 39 07 cpc r19, r25 241f4: 20 f4 brcc .+8 ; 0x241fe <__vector_17+0xb2e> acc_step_rate = current_block->nominal_rate; 241f6: 30 93 72 05 sts 0x0572, r19 ; 0x800572 241fa: 20 93 71 05 sts 0x0571, r18 ; 0x800571 // step_rate to timer interval uint16_t timer = calc_timer(acc_step_rate, step_loops); 241fe: 80 91 71 05 lds r24, 0x0571 ; 0x800571 24202: 90 91 72 05 lds r25, 0x0572 ; 0x800572 #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 24206: 81 34 cpi r24, 0x41 ; 65 24208: bc e9 ldi r27, 0x9C ; 156 2420a: 9b 07 cpc r25, r27 2420c: 08 f0 brcs .+2 ; 0x24210 <__vector_17+0xb40> 2420e: 98 c0 rjmp .+304 ; 0x24340 <__vector_17+0xc70> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 24210: 81 32 cpi r24, 0x21 ; 33 24212: ee e4 ldi r30, 0x4E ; 78 24214: 9e 07 cpc r25, r30 24216: 08 f4 brcc .+2 ; 0x2421a <__vector_17+0xb4a> 24218: 96 c0 rjmp .+300 ; 0x24346 <__vector_17+0xc76> step_rate = (step_rate >> 2)&0x3fff; 2421a: 96 95 lsr r25 2421c: 87 95 ror r24 2421e: 96 95 lsr r25 24220: 87 95 ror r24 step_loops = 4; 24222: 24 e0 ldi r18, 0x04 ; 4 } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times step_rate = (step_rate >> 1)&0x7fff; step_loops = 2; 24224: 20 93 70 05 sts 0x0570, r18 ; 0x800570 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 24228: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 2422a: 81 15 cp r24, r1 2422c: 28 e0 ldi r18, 0x08 ; 8 2422e: 92 07 cpc r25, r18 24230: 08 f4 brcc .+2 ; 0x24234 <__vector_17+0xb64> 24232: 9b c0 rjmp .+310 ; 0x2436a <__vector_17+0xc9a> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 24234: e9 2f mov r30, r25 24236: ff 27 eor r31, r31 24238: ee 0f add r30, r30 2423a: ff 1f adc r31, r31 2423c: ee 0f add r30, r30 2423e: ff 1f adc r31, r31 24240: 9f 01 movw r18, r30 24242: 2c 56 subi r18, 0x6C ; 108 24244: 30 47 sbci r19, 0x70 ; 112 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 24246: f9 01 movw r30, r18 24248: 32 96 adiw r30, 0x02 ; 2 2424a: 45 91 lpm r20, Z+ 2424c: 54 91 lpm r21, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 2424e: f9 01 movw r30, r18 24250: 25 91 lpm r18, Z+ 24252: 34 91 lpm r19, Z "clr r1" "\n\t" //make r1 __zero_reg__ again "adc %B0, r1" "\n\t" //propagate carry of addition (add 0 with carry) : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. ); 24254: 58 9f mul r21, r24 24256: b0 01 movw r22, r0 24258: 48 9f mul r20, r24 2425a: 00 0c add r0, r0 2425c: 61 1d adc r22, r1 2425e: 11 24 eor r1, r1 24260: 71 1d adc r23, r1 step_rate -= (F_CPU/500000); // Correct for minimal speed if(step_rate >= (8*256)){ // higher step rate unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 24262: 26 1b sub r18, r22 24264: 37 0b sbc r19, r23 24266: c9 01 movw r24, r18 24268: 24 36 cpi r18, 0x64 ; 100 2426a: 31 05 cpc r19, r1 2426c: 10 f4 brcc .+4 ; 0x24272 <__vector_17+0xba2> 2426e: 84 e6 ldi r24, 0x64 ; 100 24270: 90 e0 ldi r25, 0x00 ; 0 _NEXT_ISR(timer); 24272: 90 93 4f 04 sts 0x044F, r25 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 24276: 80 93 4e 04 sts 0x044E, r24 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 2427a: 90 93 4b 04 sts 0x044B, r25 ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> 2427e: 80 93 4a 04 sts 0x044A, r24 ; 0x80044a <_ZL9main_Rate.lto_priv.440> acceleration_time += timer; 24282: c8 0e add r12, r24 24284: d9 1e adc r13, r25 24286: e1 1c adc r14, r1 24288: f1 1c adc r15, r1 2428a: c0 92 6c 05 sts 0x056C, r12 ; 0x80056c 2428e: d0 92 6d 05 sts 0x056D, r13 ; 0x80056d 24292: e0 92 6e 05 sts 0x056E, r14 ; 0x80056e 24296: f0 92 6f 05 sts 0x056F, r15 ; 0x80056f #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 2429a: fe 01 movw r30, r28 2429c: e4 5b subi r30, 0xB4 ; 180 2429e: ff 4f sbci r31, 0xFF ; 255 242a0: 80 81 ld r24, Z 242a2: 81 11 cpse r24, r1 242a4: 80 c0 rjmp .+256 ; 0x243a6 <__vector_17+0xcd6> stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); uint8_t la_state = 0; 242a6: 80 e0 ldi r24, 0x00 ; 0 //WRITE_NC(LOGIC_ANALYZER_CH1, false); } #ifdef LIN_ADVANCE // avoid multiple instances or function calls to advance_spread if (la_state & ADV_INIT) { 242a8: 80 ff sbrs r24, 0 242aa: 16 c0 rjmp .+44 ; 0x242d8 <__vector_17+0xc08> LA_phase = -1; 242ac: 9f ef ldi r25, 0xFF ; 255 242ae: 90 93 68 05 sts 0x0568, r25 ; 0x800568 if (current_adv_steps == target_adv_steps) { 242b2: e0 91 48 04 lds r30, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 242b6: f0 91 49 04 lds r31, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 242ba: 20 91 6a 05 lds r18, 0x056A ; 0x80056a 242be: 30 91 6b 05 lds r19, 0x056B ; 0x80056b 242c2: e2 17 cp r30, r18 242c4: f3 07 cpc r31, r19 242c6: 09 f0 breq .+2 ; 0x242ca <__vector_17+0xbfa> 242c8: 27 c2 rjmp .+1102 ; 0x24718 <__vector_17+0x1048> // nothing to be done in this phase, cancel any pending eisr la_state = 0; nextAdvanceISR = ADV_NEVER; 242ca: 8f ef ldi r24, 0xFF ; 255 242cc: 9f ef ldi r25, 0xFF ; 255 242ce: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 242d2: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> if (la_state & ADV_INIT) { LA_phase = -1; if (current_adv_steps == target_adv_steps) { // nothing to be done in this phase, cancel any pending eisr la_state = 0; 242d6: 80 e0 ldi r24, 0x00 ; 0 eISR_Err += current_block->advance_rate; LA_phase = 0; } } } if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) { 242d8: 80 fd sbrc r24, 0 242da: 07 c0 rjmp .+14 ; 0x242ea <__vector_17+0xc1a> 242dc: 80 91 4c 04 lds r24, 0x044C ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 242e0: 90 91 4d 04 lds r25, 0x044D ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 242e4: 01 96 adiw r24, 0x01 ; 1 242e6: 09 f4 brne .+2 ; 0x242ea <__vector_17+0xc1a> 242e8: b7 c2 rjmp .+1390 ; 0x24858 <__vector_17+0x1188> // update timers & phase for the next iteration advance_spread(main_Rate); 242ea: e0 91 4a 04 lds r30, 0x044A ; 0x80044a <_ZL9main_Rate.lto_priv.440> 242ee: f0 91 4b 04 lds r31, 0x044B ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> else return ((uint32_t)0xAAAB * q) >> 17; } FORCE_INLINE void advance_spread(uint16_t timer) { eISR_Err += timer; 242f2: 80 91 49 05 lds r24, 0x0549 ; 0x800549 242f6: 90 91 4a 05 lds r25, 0x054A ; 0x80054a 242fa: a0 91 4b 05 lds r26, 0x054B ; 0x80054b 242fe: b0 91 4c 05 lds r27, 0x054C ; 0x80054c 24302: 2c 01 movw r4, r24 24304: 3d 01 movw r6, r26 24306: 4e 0e add r4, r30 24308: 5f 1e adc r5, r31 2430a: 61 1c adc r6, r1 2430c: 71 1c adc r7, r1 uint8_t ticks = 0; while(eISR_Err >= current_block->advance_rate) 2430e: 9e 01 movw r18, r28 24310: 23 5b subi r18, 0xB3 ; 179 24312: 3f 4f sbci r19, 0xFF ; 255 24314: d9 01 movw r26, r18 24316: cd 90 ld r12, X+ 24318: dc 90 ld r13, X 2431a: f1 2c mov r15, r1 2431c: e1 2c mov r14, r1 FORCE_INLINE void advance_spread(uint16_t timer) { eISR_Err += timer; uint8_t ticks = 0; 2431e: 60 e0 ldi r22, 0x00 ; 0 while(eISR_Err >= current_block->advance_rate) 24320: 4c 14 cp r4, r12 24322: 5d 04 cpc r5, r13 24324: 6e 04 cpc r6, r14 24326: 7f 04 cpc r7, r15 24328: 08 f4 brcc .+2 ; 0x2432c <__vector_17+0xc5c> 2432a: 26 c2 rjmp .+1100 ; 0x24778 <__vector_17+0x10a8> { ++ticks; 2432c: 6f 5f subi r22, 0xFF ; 255 eISR_Err -= current_block->advance_rate; 2432e: 4c 18 sub r4, r12 24330: 5d 08 sbc r5, r13 24332: 6e 08 sbc r6, r14 24334: 7f 08 sbc r7, r15 24336: f4 cf rjmp .-24 ; 0x24320 <__vector_17+0xc50> else stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 24338: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2433c: 8f 7b andi r24, 0xBF ; 191 2433e: 0d cf rjmp .-486 ; 0x2415a <__vector_17+0xa8a> #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 24340: 80 e4 ldi r24, 0x40 ; 64 24342: 9c e9 ldi r25, 0x9C ; 156 24344: 6a cf rjmp .-300 ; 0x2421a <__vector_17+0xb4a> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times step_rate = (step_rate >> 2)&0x3fff; step_loops = 4; } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times 24346: 81 31 cpi r24, 0x11 ; 17 24348: f7 e2 ldi r31, 0x27 ; 39 2434a: 9f 07 cpc r25, r31 2434c: 20 f0 brcs .+8 ; 0x24356 <__vector_17+0xc86> step_rate = (step_rate >> 1)&0x7fff; 2434e: 96 95 lsr r25 24350: 87 95 ror r24 step_loops = 2; 24352: 22 e0 ldi r18, 0x02 ; 2 24354: 67 cf rjmp .-306 ; 0x24224 <__vector_17+0xb54> } else { step_loops = 1; 24356: 21 e0 ldi r18, 0x01 ; 1 24358: 20 93 70 05 sts 0x0570, r18 ; 0x800570 2435c: 80 32 cpi r24, 0x20 ; 32 2435e: 91 05 cpc r25, r1 24360: 08 f0 brcs .+2 ; 0x24364 <__vector_17+0xc94> 24362: 62 cf rjmp .-316 ; 0x24228 <__vector_17+0xb58> 24364: 80 e2 ldi r24, 0x20 ; 32 24366: 90 e0 ldi r25, 0x00 ; 0 24368: 5f cf rjmp .-322 ; 0x24228 <__vector_17+0xb58> uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; 2436a: ac 01 movw r20, r24 2436c: 56 95 lsr r21 2436e: 47 95 ror r20 24370: 4c 7f andi r20, 0xFC ; 252 24372: 4c 56 subi r20, 0x6C ; 108 24374: 54 47 sbci r21, 0x74 ; 116 timer = (unsigned short)pgm_read_word_near(table_address); 24376: fa 01 movw r30, r20 24378: 25 91 lpm r18, Z+ 2437a: 34 91 lpm r19, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 2437c: fa 01 movw r30, r20 2437e: 32 96 adiw r30, 0x02 ; 2 24380: 65 91 lpm r22, Z+ 24382: 74 91 lpm r23, Z 24384: 87 70 andi r24, 0x07 ; 7 24386: 99 27 eor r25, r25 24388: 86 9f mul r24, r22 2438a: a0 01 movw r20, r0 2438c: 87 9f mul r24, r23 2438e: 50 0d add r21, r0 24390: 96 9f mul r25, r22 24392: 50 0d add r21, r0 24394: 11 24 eor r1, r1 24396: 73 e0 ldi r23, 0x03 ; 3 24398: 56 95 lsr r21 2439a: 47 95 ror r20 2439c: 7a 95 dec r23 2439e: e1 f7 brne .-8 ; 0x24398 <__vector_17+0xcc8> 243a0: 24 1b sub r18, r20 243a2: 35 0b sbc r19, r21 243a4: 60 cf rjmp .-320 ; 0x24266 <__vector_17+0xb96> uint16_t timer = calc_timer(acc_step_rate, step_loops); _NEXT_ISR(timer); acceleration_time += timer; #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { if (step_events_completed.wide <= (unsigned long int)step_loops) { 243a6: 40 91 53 05 lds r20, 0x0553 ; 0x800553 243aa: 50 91 54 05 lds r21, 0x0554 ; 0x800554 243ae: 60 91 55 05 lds r22, 0x0555 ; 0x800555 243b2: 70 91 56 05 lds r23, 0x0556 ; 0x800556 243b6: 80 91 70 05 lds r24, 0x0570 ; 0x800570 243ba: 90 e0 ldi r25, 0x00 ; 0 243bc: b0 e0 ldi r27, 0x00 ; 0 243be: a0 e0 ldi r26, 0x00 ; 0 243c0: 84 17 cp r24, r20 243c2: 95 07 cpc r25, r21 243c4: a6 07 cpc r26, r22 243c6: b7 07 cpc r27, r23 243c8: 08 f4 brcc .+2 ; 0x243cc <__vector_17+0xcfc> 243ca: 6d cf rjmp .-294 ; 0x242a6 <__vector_17+0xbd6> la_state = ADV_INIT | ADV_ACC_VARY; if (e_extruding && current_adv_steps > target_adv_steps) 243cc: 80 91 57 05 lds r24, 0x0557 ; 0x800557 243d0: 81 11 cpse r24, r1 243d2: 02 c0 rjmp .+4 ; 0x243d8 <__vector_17+0xd08> _NEXT_ISR(timer); acceleration_time += timer; #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { if (step_events_completed.wide <= (unsigned long int)step_loops) { la_state = ADV_INIT | ADV_ACC_VARY; 243d4: 83 e0 ldi r24, 0x03 ; 3 243d6: 68 cf rjmp .-304 ; 0x242a8 <__vector_17+0xbd8> if (e_extruding && current_adv_steps > target_adv_steps) 243d8: 80 91 48 04 lds r24, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 243dc: 90 91 49 04 lds r25, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 243e0: 20 91 6a 05 lds r18, 0x056A ; 0x80056a 243e4: 30 91 6b 05 lds r19, 0x056B ; 0x80056b 243e8: 28 17 cp r18, r24 243ea: 39 07 cpc r19, r25 243ec: 98 f7 brcc .-26 ; 0x243d4 <__vector_17+0xd04> target_adv_steps = current_adv_steps; 243ee: 90 93 6b 05 sts 0x056B, r25 ; 0x80056b 243f2: 80 93 6a 05 sts 0x056A, r24 ; 0x80056a 243f6: ee cf rjmp .-36 ; 0x243d4 <__vector_17+0xd04> } } #endif } else if (step_events_completed.wide > current_block->decelerate_after) { 243f8: 80 91 53 05 lds r24, 0x0553 ; 0x800553 243fc: 90 91 54 05 lds r25, 0x0554 ; 0x800554 24400: a0 91 55 05 lds r26, 0x0555 ; 0x800555 24404: b0 91 56 05 lds r27, 0x0556 ; 0x800556 24408: 4d 8d ldd r20, Y+29 ; 0x1d 2440a: 5e 8d ldd r21, Y+30 ; 0x1e 2440c: 6f 8d ldd r22, Y+31 ; 0x1f 2440e: 78 a1 ldd r23, Y+32 ; 0x20 24410: 48 17 cp r20, r24 24412: 59 07 cpc r21, r25 24414: 6a 07 cpc r22, r26 24416: 7b 07 cpc r23, r27 24418: 08 f0 brcs .+2 ; 0x2441c <__vector_17+0xd4c> 2441a: e3 c0 rjmp .+454 ; 0x245e2 <__vector_17+0xf12> uint16_t step_rate = MUL24x24R24(deceleration_time, current_block->acceleration_rate); 2441c: c0 90 74 05 lds r12, 0x0574 ; 0x800574 24420: d0 90 75 05 lds r13, 0x0575 ; 0x800575 24424: e0 90 76 05 lds r14, 0x0576 ; 0x800576 24428: f0 90 77 05 lds r15, 0x0577 ; 0x800577 "adc %B0, r26 \n\t" "clr r1 \n\t" : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1", "r26" , "r27" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. R26 is __zero_reg__, R27 is a temporary register. ); 2442c: 6c 88 ldd r6, Y+20 ; 0x14 2442e: 7d 88 ldd r7, Y+21 ; 0x15 24430: 8e 88 ldd r8, Y+22 ; 0x16 24432: aa 27 eor r26, r26 24434: c7 9c mul r12, r7 24436: b1 2d mov r27, r1 24438: d8 9c mul r13, r8 2443a: f0 01 movw r30, r0 2443c: e8 9c mul r14, r8 2443e: f0 0d add r31, r0 24440: e7 9c mul r14, r7 24442: e0 0d add r30, r0 24444: f1 1d adc r31, r1 24446: c8 9c mul r12, r8 24448: b0 0d add r27, r0 2444a: e1 1d adc r30, r1 2444c: fa 1f adc r31, r26 2444e: d7 9c mul r13, r7 24450: b0 0d add r27, r0 24452: e1 1d adc r30, r1 24454: fa 1f adc r31, r26 24456: e6 9c mul r14, r6 24458: b0 0d add r27, r0 2445a: e1 1d adc r30, r1 2445c: fa 1f adc r31, r26 2445e: d6 9c mul r13, r6 24460: b1 0d add r27, r1 24462: ea 1f adc r30, r26 24464: fa 1f adc r31, r26 24466: bb 0f add r27, r27 24468: ea 1f adc r30, r26 2446a: fa 1f adc r31, r26 2446c: 11 24 eor r1, r1 if (step_rate > acc_step_rate) { // Check step_rate stays positive 2446e: 20 91 71 05 lds r18, 0x0571 ; 0x800571 24472: 30 91 72 05 lds r19, 0x0572 ; 0x800572 24476: 8e ad ldd r24, Y+62 ; 0x3e 24478: 9f ad ldd r25, Y+63 ; 0x3f 2447a: 2e 17 cp r18, r30 2447c: 3f 07 cpc r19, r31 2447e: 30 f0 brcs .+12 ; 0x2448c <__vector_17+0xdbc> step_rate = uint16_t(current_block->final_rate); } else { step_rate = acc_step_rate - step_rate; // Decelerate from acceleration end point. 24480: 2e 1b sub r18, r30 24482: 3f 0b sbc r19, r31 24484: 82 17 cp r24, r18 24486: 93 07 cpc r25, r19 24488: 08 f4 brcc .+2 ; 0x2448c <__vector_17+0xdbc> 2448a: c9 01 movw r24, r18 #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 2448c: 81 34 cpi r24, 0x41 ; 65 2448e: ac e9 ldi r26, 0x9C ; 156 24490: 9a 07 cpc r25, r26 24492: 08 f0 brcs .+2 ; 0x24496 <__vector_17+0xdc6> 24494: 75 c0 rjmp .+234 ; 0x24580 <__vector_17+0xeb0> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 24496: 81 32 cpi r24, 0x21 ; 33 24498: be e4 ldi r27, 0x4E ; 78 2449a: 9b 07 cpc r25, r27 2449c: 08 f4 brcc .+2 ; 0x244a0 <__vector_17+0xdd0> 2449e: 73 c0 rjmp .+230 ; 0x24586 <__vector_17+0xeb6> step_rate = (step_rate >> 2)&0x3fff; 244a0: 96 95 lsr r25 244a2: 87 95 ror r24 244a4: 96 95 lsr r25 244a6: 87 95 ror r24 step_loops = 4; 244a8: 24 e0 ldi r18, 0x04 ; 4 } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times step_rate = (step_rate >> 1)&0x7fff; step_loops = 2; 244aa: 20 93 70 05 sts 0x0570, r18 ; 0x800570 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 244ae: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 244b0: 81 15 cp r24, r1 244b2: f8 e0 ldi r31, 0x08 ; 8 244b4: 9f 07 cpc r25, r31 244b6: 08 f4 brcc .+2 ; 0x244ba <__vector_17+0xdea> 244b8: 78 c0 rjmp .+240 ; 0x245aa <__vector_17+0xeda> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 244ba: e9 2f mov r30, r25 244bc: ff 27 eor r31, r31 244be: ee 0f add r30, r30 244c0: ff 1f adc r31, r31 244c2: ee 0f add r30, r30 244c4: ff 1f adc r31, r31 244c6: 9f 01 movw r18, r30 244c8: 2c 56 subi r18, 0x6C ; 108 244ca: 30 47 sbci r19, 0x70 ; 112 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 244cc: f9 01 movw r30, r18 244ce: 32 96 adiw r30, 0x02 ; 2 244d0: a5 91 lpm r26, Z+ 244d2: b4 91 lpm r27, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 244d4: f9 01 movw r30, r18 244d6: 25 91 lpm r18, Z+ 244d8: 34 91 lpm r19, Z "clr r1" "\n\t" //make r1 __zero_reg__ again "adc %B0, r1" "\n\t" //propagate carry of addition (add 0 with carry) : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. ); 244da: b8 9f mul r27, r24 244dc: f0 01 movw r30, r0 244de: a8 9f mul r26, r24 244e0: 00 0c add r0, r0 244e2: e1 1d adc r30, r1 244e4: 11 24 eor r1, r1 244e6: f1 1d adc r31, r1 } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; timer = (unsigned short)pgm_read_word_near(table_address); timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 244e8: 2e 1b sub r18, r30 244ea: 3f 0b sbc r19, r31 244ec: c9 01 movw r24, r18 244ee: 24 36 cpi r18, 0x64 ; 100 244f0: 31 05 cpc r19, r1 244f2: 10 f4 brcc .+4 ; 0x244f8 <__vector_17+0xe28> 244f4: 84 e6 ldi r24, 0x64 ; 100 244f6: 90 e0 ldi r25, 0x00 ; 0 step_rate = uint16_t(current_block->final_rate); } // Step_rate to timer interval. uint16_t timer = calc_timer(step_rate, step_loops); _NEXT_ISR(timer); 244f8: 90 93 4f 04 sts 0x044F, r25 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 244fc: 80 93 4e 04 sts 0x044E, r24 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 24500: 90 93 4b 04 sts 0x044B, r25 ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> 24504: 80 93 4a 04 sts 0x044A, r24 ; 0x80044a <_ZL9main_Rate.lto_priv.440> deceleration_time += timer; 24508: c8 0e add r12, r24 2450a: d9 1e adc r13, r25 2450c: e1 1c adc r14, r1 2450e: f1 1c adc r15, r1 24510: c0 92 74 05 sts 0x0574, r12 ; 0x800574 24514: d0 92 75 05 sts 0x0575, r13 ; 0x800575 24518: e0 92 76 05 sts 0x0576, r14 ; 0x800576 2451c: f0 92 77 05 sts 0x0577, r15 ; 0x800577 #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 24520: fe 01 movw r30, r28 24522: e4 5b subi r30, 0xB4 ; 180 24524: ff 4f sbci r31, 0xFF ; 255 24526: 80 81 ld r24, Z 24528: 88 23 and r24, r24 2452a: 09 f4 brne .+2 ; 0x2452e <__vector_17+0xe5e> 2452c: bc ce rjmp .-648 ; 0x242a6 <__vector_17+0xbd6> if (step_events_completed.wide <= current_block->decelerate_after + step_loops) { 2452e: 80 91 53 05 lds r24, 0x0553 ; 0x800553 24532: 90 91 54 05 lds r25, 0x0554 ; 0x800554 24536: a0 91 55 05 lds r26, 0x0555 ; 0x800555 2453a: b0 91 56 05 lds r27, 0x0556 ; 0x800556 2453e: 20 91 70 05 lds r18, 0x0570 ; 0x800570 24542: 42 0f add r20, r18 24544: 51 1d adc r21, r1 24546: 61 1d adc r22, r1 24548: 71 1d adc r23, r1 2454a: 48 17 cp r20, r24 2454c: 59 07 cpc r21, r25 2454e: 6a 07 cpc r22, r26 24550: 7b 07 cpc r23, r27 24552: 08 f4 brcc .+2 ; 0x24556 <__vector_17+0xe86> 24554: a8 ce rjmp .-688 ; 0x242a6 <__vector_17+0xbd6> target_adv_steps = current_block->final_adv_steps; 24556: 35 96 adiw r30, 0x05 ; 5 24558: 20 81 ld r18, Z 2455a: 31 81 ldd r19, Z+1 ; 0x01 2455c: 30 93 6b 05 sts 0x056B, r19 ; 0x80056b 24560: 20 93 6a 05 sts 0x056A, r18 ; 0x80056a la_state = ADV_INIT | ADV_ACC_VARY; if (e_extruding && current_adv_steps < target_adv_steps) 24564: 80 91 57 05 lds r24, 0x0557 ; 0x800557 24568: 88 23 and r24, r24 2456a: 09 f4 brne .+2 ; 0x2456e <__vector_17+0xe9e> 2456c: 33 cf rjmp .-410 ; 0x243d4 <__vector_17+0xd04> 2456e: 80 91 48 04 lds r24, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 24572: 90 91 49 04 lds r25, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 24576: 82 17 cp r24, r18 24578: 93 07 cpc r25, r19 2457a: 08 f0 brcs .+2 ; 0x2457e <__vector_17+0xeae> 2457c: 2b cf rjmp .-426 ; 0x243d4 <__vector_17+0xd04> 2457e: 37 cf rjmp .-402 ; 0x243ee <__vector_17+0xd1e> #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 24580: 80 e4 ldi r24, 0x40 ; 64 24582: 9c e9 ldi r25, 0x9C ; 156 24584: 8d cf rjmp .-230 ; 0x244a0 <__vector_17+0xdd0> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times step_rate = (step_rate >> 2)&0x3fff; step_loops = 4; } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times 24586: 81 31 cpi r24, 0x11 ; 17 24588: e7 e2 ldi r30, 0x27 ; 39 2458a: 9e 07 cpc r25, r30 2458c: 20 f0 brcs .+8 ; 0x24596 <__vector_17+0xec6> step_rate = (step_rate >> 1)&0x7fff; 2458e: 96 95 lsr r25 24590: 87 95 ror r24 step_loops = 2; 24592: 22 e0 ldi r18, 0x02 ; 2 24594: 8a cf rjmp .-236 ; 0x244aa <__vector_17+0xdda> } else { step_loops = 1; 24596: 21 e0 ldi r18, 0x01 ; 1 24598: 20 93 70 05 sts 0x0570, r18 ; 0x800570 2459c: 80 32 cpi r24, 0x20 ; 32 2459e: 91 05 cpc r25, r1 245a0: 08 f0 brcs .+2 ; 0x245a4 <__vector_17+0xed4> 245a2: 85 cf rjmp .-246 ; 0x244ae <__vector_17+0xdde> 245a4: 80 e2 ldi r24, 0x20 ; 32 245a6: 90 e0 ldi r25, 0x00 ; 0 245a8: 82 cf rjmp .-252 ; 0x244ae <__vector_17+0xdde> uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; 245aa: dc 01 movw r26, r24 245ac: b6 95 lsr r27 245ae: a7 95 ror r26 245b0: ac 7f andi r26, 0xFC ; 252 245b2: ac 56 subi r26, 0x6C ; 108 245b4: b4 47 sbci r27, 0x74 ; 116 timer = (unsigned short)pgm_read_word_near(table_address); 245b6: fd 01 movw r30, r26 245b8: 25 91 lpm r18, Z+ 245ba: 34 91 lpm r19, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 245bc: fd 01 movw r30, r26 245be: 32 96 adiw r30, 0x02 ; 2 245c0: a5 91 lpm r26, Z+ 245c2: b4 91 lpm r27, Z 245c4: 87 70 andi r24, 0x07 ; 7 245c6: 99 27 eor r25, r25 245c8: 8a 9f mul r24, r26 245ca: f0 01 movw r30, r0 245cc: 8b 9f mul r24, r27 245ce: f0 0d add r31, r0 245d0: 9a 9f mul r25, r26 245d2: f0 0d add r31, r0 245d4: 11 24 eor r1, r1 245d6: a3 e0 ldi r26, 0x03 ; 3 245d8: f6 95 lsr r31 245da: e7 95 ror r30 245dc: aa 95 dec r26 245de: e1 f7 brne .-8 ; 0x245d8 <__vector_17+0xf08> 245e0: 83 cf rjmp .-250 ; 0x244e8 <__vector_17+0xe18> } } #endif } else { if (! step_loops_nominal) { 245e2: 80 91 73 05 lds r24, 0x0573 ; 0x800573 245e6: 88 23 and r24, r24 245e8: 71 f0 breq .+28 ; 0x24606 <__vector_17+0xf36> stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); uint8_t la_state = 0; 245ea: 80 e0 ldi r24, 0x00 ; 0 if (e_extruding) target_adv_steps = current_adv_steps; } #endif } _NEXT_ISR(OCR1A_nominal); 245ec: 20 91 4d 05 lds r18, 0x054D ; 0x80054d 245f0: 30 91 4e 05 lds r19, 0x054E ; 0x80054e 245f4: 30 93 4f 04 sts 0x044F, r19 ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 245f8: 20 93 4e 04 sts 0x044E, r18 ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 245fc: 30 93 4b 04 sts 0x044B, r19 ; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1> 24600: 20 93 4a 04 sts 0x044A, r18 ; 0x80044a <_ZL9main_Rate.lto_priv.440> 24604: 51 ce rjmp .-862 ; 0x242a8 <__vector_17+0xbd8> } else { if (! step_loops_nominal) { // Calculation of the steady state timer rate has been delayed to the 1st tick of the steady state to lower // the initial interrupt blocking. OCR1A_nominal = calc_timer(uint16_t(current_block->nominal_rate), step_loops); 24606: 8e a9 ldd r24, Y+54 ; 0x36 24608: 9f a9 ldd r25, Y+55 ; 0x37 #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 2460a: 81 34 cpi r24, 0x41 ; 65 2460c: 2c e9 ldi r18, 0x9C ; 156 2460e: 92 07 cpc r25, r18 24610: 08 f0 brcs .+2 ; 0x24614 <__vector_17+0xf44> 24612: 4e c0 rjmp .+156 ; 0x246b0 <__vector_17+0xfe0> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 24614: 81 32 cpi r24, 0x21 ; 33 24616: 4e e4 ldi r20, 0x4E ; 78 24618: 94 07 cpc r25, r20 2461a: 08 f4 brcc .+2 ; 0x2461e <__vector_17+0xf4e> 2461c: 4c c0 rjmp .+152 ; 0x246b6 <__vector_17+0xfe6> step_rate = (step_rate >> 2)&0x3fff; 2461e: 96 95 lsr r25 24620: 87 95 ror r24 24622: 96 95 lsr r25 24624: 87 95 ror r24 step_loops = 4; 24626: 24 e0 ldi r18, 0x04 ; 4 } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times step_rate = (step_rate >> 1)&0x7fff; step_loops = 2; 24628: 20 93 70 05 sts 0x0570, r18 ; 0x800570 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 2462c: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 2462e: 81 15 cp r24, r1 24630: a8 e0 ldi r26, 0x08 ; 8 24632: 9a 07 cpc r25, r26 24634: 08 f4 brcc .+2 ; 0x24638 <__vector_17+0xf68> 24636: 51 c0 rjmp .+162 ; 0x246da <__vector_17+0x100a> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 24638: e9 2f mov r30, r25 2463a: ff 27 eor r31, r31 2463c: ee 0f add r30, r30 2463e: ff 1f adc r31, r31 24640: ee 0f add r30, r30 24642: ff 1f adc r31, r31 24644: 9f 01 movw r18, r30 24646: 2c 56 subi r18, 0x6C ; 108 24648: 30 47 sbci r19, 0x70 ; 112 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 2464a: f9 01 movw r30, r18 2464c: 32 96 adiw r30, 0x02 ; 2 2464e: 65 91 lpm r22, Z+ 24650: 74 91 lpm r23, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 24652: f9 01 movw r30, r18 24654: 25 91 lpm r18, Z+ 24656: 34 91 lpm r19, Z "clr r1" "\n\t" //make r1 __zero_reg__ again "adc %B0, r1" "\n\t" //propagate carry of addition (add 0 with carry) : "=&r" (out) : "r" (x), "r" (y) : "r0", "r1" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. ); 24658: 78 9f mul r23, r24 2465a: a0 01 movw r20, r0 2465c: 68 9f mul r22, r24 2465e: 00 0c add r0, r0 24660: 41 1d adc r20, r1 24662: 11 24 eor r1, r1 24664: 51 1d adc r21, r1 step_rate -= (F_CPU/500000); // Correct for minimal speed if(step_rate >= (8*256)){ // higher step rate unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 24666: c9 01 movw r24, r18 24668: 84 1b sub r24, r20 2466a: 95 0b sbc r25, r21 2466c: 84 36 cpi r24, 0x64 ; 100 2466e: 91 05 cpc r25, r1 24670: 10 f4 brcc .+4 ; 0x24676 <__vector_17+0xfa6> 24672: 84 e6 ldi r24, 0x64 ; 100 24674: 90 e0 ldi r25, 0x00 ; 0 24676: 90 93 4e 05 sts 0x054E, r25 ; 0x80054e 2467a: 80 93 4d 05 sts 0x054D, r24 ; 0x80054d step_loops_nominal = step_loops; 2467e: 80 91 70 05 lds r24, 0x0570 ; 0x800570 24682: 80 93 73 05 sts 0x0573, r24 ; 0x800573 #ifdef LIN_ADVANCE if(current_block->use_advance_lead) { 24686: fe 01 movw r30, r28 24688: e4 5b subi r30, 0xB4 ; 180 2468a: ff 4f sbci r31, 0xFF ; 255 2468c: 80 81 ld r24, Z 2468e: 88 23 and r24, r24 24690: 09 f4 brne .+2 ; 0x24694 <__vector_17+0xfc4> 24692: ab cf rjmp .-170 ; 0x245ea <__vector_17+0xf1a> // Due to E-jerk, there can be discontinuities in pressure state where an // acceleration or deceleration can be skipped or joined with the previous block. // If LA was not previously active, re-check the pressure level la_state = ADV_INIT; if (e_extruding) 24694: 80 91 57 05 lds r24, 0x0557 ; 0x800557 24698: 88 23 and r24, r24 2469a: 41 f0 breq .+16 ; 0x246ac <__vector_17+0xfdc> target_adv_steps = current_adv_steps; 2469c: 80 91 48 04 lds r24, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 246a0: 90 91 49 04 lds r25, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 246a4: 90 93 6b 05 sts 0x056B, r25 ; 0x80056b 246a8: 80 93 6a 05 sts 0x056A, r24 ; 0x80056a #ifdef LIN_ADVANCE if(current_block->use_advance_lead) { // Due to E-jerk, there can be discontinuities in pressure state where an // acceleration or deceleration can be skipped or joined with the previous block. // If LA was not previously active, re-check the pressure level la_state = ADV_INIT; 246ac: 81 e0 ldi r24, 0x01 ; 1 246ae: 9e cf rjmp .-196 ; 0x245ec <__vector_17+0xf1c> #endif //_NO_ASM FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) { uint16_t timer; if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; 246b0: 80 e4 ldi r24, 0x40 ; 64 246b2: 9c e9 ldi r25, 0x9C ; 156 246b4: b4 cf rjmp .-152 ; 0x2461e <__vector_17+0xf4e> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times step_rate = (step_rate >> 2)&0x3fff; step_loops = 4; } else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times 246b6: 81 31 cpi r24, 0x11 ; 17 246b8: 57 e2 ldi r21, 0x27 ; 39 246ba: 95 07 cpc r25, r21 246bc: 20 f0 brcs .+8 ; 0x246c6 <__vector_17+0xff6> step_rate = (step_rate >> 1)&0x7fff; 246be: 96 95 lsr r25 246c0: 87 95 ror r24 step_loops = 2; 246c2: 22 e0 ldi r18, 0x02 ; 2 246c4: b1 cf rjmp .-158 ; 0x24628 <__vector_17+0xf58> } else { step_loops = 1; 246c6: 21 e0 ldi r18, 0x01 ; 1 246c8: 20 93 70 05 sts 0x0570, r18 ; 0x800570 246cc: 80 32 cpi r24, 0x20 ; 32 246ce: 91 05 cpc r25, r1 246d0: 08 f0 brcs .+2 ; 0x246d4 <__vector_17+0x1004> 246d2: ac cf rjmp .-168 ; 0x2462c <__vector_17+0xf5c> 246d4: 80 e2 ldi r24, 0x20 ; 32 246d6: 90 e0 ldi r25, 0x00 ; 0 246d8: a9 cf rjmp .-174 ; 0x2462c <__vector_17+0xf5c> uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); } else { // lower step rates unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; table_address += ((step_rate)>>1) & 0xfffc; 246da: 9c 01 movw r18, r24 246dc: 36 95 lsr r19 246de: 27 95 ror r18 246e0: 2c 7f andi r18, 0xFC ; 252 246e2: 2c 56 subi r18, 0x6C ; 108 246e4: 34 47 sbci r19, 0x74 ; 116 timer = (unsigned short)pgm_read_word_near(table_address); 246e6: f9 01 movw r30, r18 246e8: 45 91 lpm r20, Z+ 246ea: 54 91 lpm r21, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 246ec: f9 01 movw r30, r18 246ee: 32 96 adiw r30, 0x02 ; 2 246f0: 65 91 lpm r22, Z+ 246f2: 74 91 lpm r23, Z 246f4: 87 70 andi r24, 0x07 ; 7 246f6: 99 27 eor r25, r25 246f8: 86 9f mul r24, r22 246fa: 90 01 movw r18, r0 246fc: 87 9f mul r24, r23 246fe: 30 0d add r19, r0 24700: 96 9f mul r25, r22 24702: 30 0d add r19, r0 24704: 11 24 eor r1, r1 24706: a3 e0 ldi r26, 0x03 ; 3 24708: 36 95 lsr r19 2470a: 27 95 ror r18 2470c: aa 95 dec r26 2470e: e1 f7 brne .-8 ; 0x24708 <__vector_17+0x1038> 24710: ca 01 movw r24, r20 24712: 82 1b sub r24, r18 24714: 93 0b sbc r25, r19 24716: aa cf rjmp .-172 ; 0x2466c <__vector_17+0xf9c> la_state = 0; nextAdvanceISR = ADV_NEVER; } else { // reset error and iterations per loop for this phase eISR_Err = current_block->advance_rate; 24718: de 01 movw r26, r28 2471a: a3 5b subi r26, 0xB3 ; 179 2471c: bf 4f sbci r27, 0xFF ; 255 2471e: 4d 91 ld r20, X+ 24720: 5c 91 ld r21, X 24722: 11 97 sbiw r26, 0x01 ; 1 24724: 70 e0 ldi r23, 0x00 ; 0 24726: 60 e0 ldi r22, 0x00 ; 0 24728: 40 93 49 05 sts 0x0549, r20 ; 0x800549 2472c: 50 93 4a 05 sts 0x054A, r21 ; 0x80054a 24730: 60 93 4b 05 sts 0x054B, r22 ; 0x80054b 24734: 70 93 4c 05 sts 0x054C, r23 ; 0x80054c e_step_loops = current_block->advance_step_loops; 24738: 16 96 adiw r26, 0x06 ; 6 2473a: 9c 91 ld r25, X 2473c: 90 93 48 05 sts 0x0548, r25 ; 0x800548 if ((la_state & ADV_ACC_VARY) && e_extruding && (current_adv_steps > target_adv_steps)) { 24740: 98 2f mov r25, r24 24742: 92 70 andi r25, 0x02 ; 2 24744: 09 f4 brne .+2 ; 0x24748 <__vector_17+0x1078> 24746: c8 cd rjmp .-1136 ; 0x242d8 <__vector_17+0xc08> 24748: 90 91 57 05 lds r25, 0x0557 ; 0x800557 2474c: 99 23 and r25, r25 2474e: 09 f4 brne .+2 ; 0x24752 <__vector_17+0x1082> 24750: c3 cd rjmp .-1146 ; 0x242d8 <__vector_17+0xc08> 24752: 2e 17 cp r18, r30 24754: 3f 07 cpc r19, r31 24756: 08 f0 brcs .+2 ; 0x2475a <__vector_17+0x108a> 24758: bf cd rjmp .-1154 ; 0x242d8 <__vector_17+0xc08> // LA could reverse the direction of extrusion in this phase eISR_Err += current_block->advance_rate; 2475a: 44 0f add r20, r20 2475c: 55 1f adc r21, r21 2475e: 66 1f adc r22, r22 24760: 77 1f adc r23, r23 24762: 40 93 49 05 sts 0x0549, r20 ; 0x800549 24766: 50 93 4a 05 sts 0x054A, r21 ; 0x80054a 2476a: 60 93 4b 05 sts 0x054B, r22 ; 0x80054b 2476e: 70 93 4c 05 sts 0x054C, r23 ; 0x80054c LA_phase = 0; 24772: 10 92 68 05 sts 0x0568, r1 ; 0x800568 24776: b0 cd rjmp .-1184 ; 0x242d8 <__vector_17+0xc08> 24778: 40 92 49 05 sts 0x0549, r4 ; 0x800549 2477c: 50 92 4a 05 sts 0x054A, r5 ; 0x80054a 24780: 60 92 4b 05 sts 0x054B, r6 ; 0x80054b 24784: 70 92 4c 05 sts 0x054C, r7 ; 0x80054c while(eISR_Err >= current_block->advance_rate) { ++ticks; eISR_Err -= current_block->advance_rate; } if(!ticks) 24788: 61 11 cpse r22, r1 2478a: 1d c0 rjmp .+58 ; 0x247c6 <__vector_17+0x10f6> { eISR_Rate = timer; 2478c: f0 93 47 05 sts 0x0547, r31 ; 0x800547 24790: e0 93 46 05 sts 0x0546, r30 ; 0x800546 nextAdvanceISR = timer; 24794: f0 93 4d 04 sts 0x044D, r31 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 24798: e0 93 4c 04 sts 0x044C, r30 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> } } if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) { // update timers & phase for the next iteration advance_spread(main_Rate); if (LA_phase >= 0) { 2479c: 80 91 68 05 lds r24, 0x0568 ; 0x800568 247a0: 87 fd sbrc r24, 7 247a2: 5a c0 rjmp .+180 ; 0x24858 <__vector_17+0x1188> if (step_loops == e_step_loops) 247a4: 80 91 70 05 lds r24, 0x0570 ; 0x800570 247a8: 10 91 48 05 lds r17, 0x0548 ; 0x800548 247ac: c3 5b subi r28, 0xB3 ; 179 247ae: df 4f sbci r29, 0xFF ; 255 247b0: 28 81 ld r18, Y 247b2: 39 81 ldd r19, Y+1 ; 0x01 247b4: 81 13 cpse r24, r17 247b6: 35 c0 rjmp .+106 ; 0x24822 <__vector_17+0x1152> LA_phase = (current_block->advance_rate < main_Rate); 247b8: 81 e0 ldi r24, 0x01 ; 1 247ba: 2e 17 cp r18, r30 247bc: 3f 07 cpc r19, r31 247be: 08 f4 brcc .+2 ; 0x247c2 <__vector_17+0x10f2> 247c0: 49 c0 rjmp .+146 ; 0x24854 <__vector_17+0x1184> else { // avoid overflow through division. warning: we need to _guarantee_ step_loops // and e_step_loops are <= 4 due to fastdiv's limit auto adv_rate_n = fastdiv(current_block->advance_rate, step_loops); auto main_rate_n = fastdiv(main_Rate, e_step_loops); LA_phase = (adv_rate_n < main_rate_n); 247c2: 80 e0 ldi r24, 0x00 ; 0 247c4: 47 c0 rjmp .+142 ; 0x24854 <__vector_17+0x1184> eISR_Rate = timer; nextAdvanceISR = timer; return; } if (ticks <= 3) 247c6: 64 30 cpi r22, 0x04 ; 4 247c8: 28 f5 brcc .+74 ; 0x24814 <__vector_17+0x1144> eISR_Rate = fastdiv(timer, ticks + 1); 247ca: 6f 5f subi r22, 0xFF ; 255 #ifdef LIN_ADVANCE // @wavexx: fast uint16_t division for small dividends<5 // q/3 based on "Hacker's delight" formula FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d) { if(d != 3) return q >> (d / 2); 247cc: 63 30 cpi r22, 0x03 ; 3 247ce: a9 f0 breq .+42 ; 0x247fa <__vector_17+0x112a> 247d0: 66 95 lsr r22 247d2: af 01 movw r20, r30 247d4: 02 c0 rjmp .+4 ; 0x247da <__vector_17+0x110a> 247d6: 56 95 lsr r21 247d8: 47 95 ror r20 247da: 6a 95 dec r22 247dc: e2 f7 brpl .-8 ; 0x247d6 <__vector_17+0x1106> 247de: ba 01 movw r22, r20 if (ticks <= 3) eISR_Rate = fastdiv(timer, ticks + 1); else { // >4 ticks are still possible on slow moves eISR_Rate = timer / (ticks + 1); 247e0: 70 93 47 05 sts 0x0547, r23 ; 0x800547 247e4: 60 93 46 05 sts 0x0546, r22 ; 0x800546 } nextAdvanceISR = eISR_Rate; 247e8: 80 91 46 05 lds r24, 0x0546 ; 0x800546 247ec: 90 91 47 05 lds r25, 0x0547 ; 0x800547 247f0: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 247f4: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 247f8: d1 cf rjmp .-94 ; 0x2479c <__vector_17+0x10cc> // @wavexx: fast uint16_t division for small dividends<5 // q/3 based on "Hacker's delight" formula FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d) { if(d != 3) return q >> (d / 2); else return ((uint32_t)0xAAAB * q) >> 17; 247fa: 9f 01 movw r18, r30 247fc: ab ea ldi r26, 0xAB ; 171 247fe: ba ea ldi r27, 0xAA ; 170 24800: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 24804: 41 e1 ldi r20, 0x11 ; 17 24806: 96 95 lsr r25 24808: 87 95 ror r24 2480a: 77 95 ror r23 2480c: 67 95 ror r22 2480e: 4a 95 dec r20 24810: d1 f7 brne .-12 ; 0x24806 <__vector_17+0x1136> 24812: e6 cf rjmp .-52 ; 0x247e0 <__vector_17+0x1110> if (ticks <= 3) eISR_Rate = fastdiv(timer, ticks + 1); else { // >4 ticks are still possible on slow moves eISR_Rate = timer / (ticks + 1); 24814: 70 e0 ldi r23, 0x00 ; 0 24816: 6f 5f subi r22, 0xFF ; 255 24818: 7f 4f sbci r23, 0xFF ; 255 2481a: cf 01 movw r24, r30 2481c: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 24820: df cf rjmp .-66 ; 0x247e0 <__vector_17+0x1110> #ifdef LIN_ADVANCE // @wavexx: fast uint16_t division for small dividends<5 // q/3 based on "Hacker's delight" formula FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d) { if(d != 3) return q >> (d / 2); 24822: 83 30 cpi r24, 0x03 ; 3 24824: 09 f4 brne .+2 ; 0x24828 <__vector_17+0x1158> 24826: a2 c0 rjmp .+324 ; 0x2496c <__vector_17+0x129c> 24828: 86 95 lsr r24 2482a: a9 01 movw r20, r18 2482c: 02 c0 rjmp .+4 ; 0x24832 <__vector_17+0x1162> 2482e: 56 95 lsr r21 24830: 47 95 ror r20 24832: 8a 95 dec r24 24834: e2 f7 brpl .-8 ; 0x2482e <__vector_17+0x115e> 24836: 13 30 cpi r17, 0x03 ; 3 24838: 09 f4 brne .+2 ; 0x2483c <__vector_17+0x116c> 2483a: a6 c0 rjmp .+332 ; 0x24988 <__vector_17+0x12b8> 2483c: 16 95 lsr r17 2483e: bf 01 movw r22, r30 24840: 02 c0 rjmp .+4 ; 0x24846 <__vector_17+0x1176> 24842: 76 95 lsr r23 24844: 67 95 ror r22 24846: 1a 95 dec r17 24848: e2 f7 brpl .-8 ; 0x24842 <__vector_17+0x1172> else { // avoid overflow through division. warning: we need to _guarantee_ step_loops // and e_step_loops are <= 4 due to fastdiv's limit auto adv_rate_n = fastdiv(current_block->advance_rate, step_loops); auto main_rate_n = fastdiv(main_Rate, e_step_loops); LA_phase = (adv_rate_n < main_rate_n); 2484a: 81 e0 ldi r24, 0x01 ; 1 2484c: 46 17 cp r20, r22 2484e: 57 07 cpc r21, r23 24850: 08 f0 brcs .+2 ; 0x24854 <__vector_17+0x1184> 24852: b7 cf rjmp .-146 ; 0x247c2 <__vector_17+0x10f2> 24854: 80 93 68 05 sts 0x0568, r24 ; 0x800568 } } // Check for serial chars. This executes roughtly inbetween 50-60% of the total runtime of the // entire isr, making this spot a much better choice than checking during esteps MSerial.checkRx(); 24858: 0f 94 1f 03 call 0x2063e ; 0x2063e #endif // If current block is finished, reset pointer if (step_events_completed.wide >= current_block->step_event_count.wide) { 2485c: 40 91 53 05 lds r20, 0x0553 ; 0x800553 24860: 50 91 54 05 lds r21, 0x0554 ; 0x800554 24864: 60 91 55 05 lds r22, 0x0555 ; 0x800555 24868: 70 91 56 05 lds r23, 0x0556 ; 0x800556 2486c: e0 91 51 12 lds r30, 0x1251 ; 0x801251 24870: f0 91 52 12 lds r31, 0x1252 ; 0x801252 24874: 80 89 ldd r24, Z+16 ; 0x10 24876: 91 89 ldd r25, Z+17 ; 0x11 24878: a2 89 ldd r26, Z+18 ; 0x12 2487a: b3 89 ldd r27, Z+19 ; 0x13 2487c: 48 17 cp r20, r24 2487e: 59 07 cpc r21, r25 24880: 6a 07 cpc r22, r26 24882: 7b 07 cpc r23, r27 24884: 80 f0 brcs .+32 ; 0x248a6 <__vector_17+0x11d6> current_block = NULL; 24886: 10 92 52 12 sts 0x1252, r1 ; 0x801252 2488a: 10 92 51 12 sts 0x1251, r1 ; 0x801251 extern volatile uint8_t block_buffer_tail; // Called when the current block is no longer needed. Discards the block and makes the memory // available for new blocks. FORCE_INLINE void plan_discard_current_block() { if (block_buffer_head != block_buffer_tail) { 2488e: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 24892: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 24896: 98 17 cp r25, r24 24898: 31 f0 breq .+12 ; 0x248a6 <__vector_17+0x11d6> block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 2489a: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 2489e: 8f 5f subi r24, 0xFF ; 255 248a0: 8f 70 andi r24, 0x0F ; 15 248a2: 80 93 3f 0d sts 0x0D3F, r24 ; 0x800d3f WRITE_NC(LOGIC_ANALYZER_CH0, false); #endif } // Run the next advance isr if triggered bool eisr = !nextAdvanceISR; 248a6: 60 91 4c 04 lds r22, 0x044C ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 248aa: 70 91 4d 04 lds r23, 0x044D ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> if (eisr) 248ae: 61 15 cp r22, r1 248b0: 71 05 cpc r23, r1 248b2: 09 f0 breq .+2 ; 0x248b6 <__vector_17+0x11e6> 248b4: 46 c0 rjmp .+140 ; 0x24942 <__vector_17+0x1272> #ifdef LIN_ADVANCE // Timer interrupt for E. e_steps is set in the main routine. FORCE_INLINE void advance_isr() { if (current_adv_steps > target_adv_steps) { 248b6: 40 91 48 04 lds r20, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 248ba: 50 91 49 04 lds r21, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 248be: 20 91 6a 05 lds r18, 0x056A ; 0x80056a 248c2: 30 91 6b 05 lds r19, 0x056B ; 0x80056b 248c6: 80 91 69 05 lds r24, 0x0569 ; 0x800569 248ca: 24 17 cp r18, r20 248cc: 35 07 cpc r19, r21 248ce: 08 f0 brcs .+2 ; 0x248d2 <__vector_17+0x1202> 248d0: 6c c0 rjmp .+216 ; 0x249aa <__vector_17+0x12da> // decompression if (e_step_loops != 1) { 248d2: 90 91 48 05 lds r25, 0x0548 ; 0x800548 248d6: 91 30 cpi r25, 0x01 ; 1 248d8: 41 f0 breq .+16 ; 0x248ea <__vector_17+0x121a> uint16_t d_steps = current_adv_steps - target_adv_steps; 248da: 42 1b sub r20, r18 248dc: 53 0b sbc r21, r19 if (d_steps < e_step_loops) 248de: 94 17 cp r25, r20 248e0: 15 06 cpc r1, r21 248e2: 19 f0 breq .+6 ; 0x248ea <__vector_17+0x121a> 248e4: 10 f0 brcs .+4 ; 0x248ea <__vector_17+0x121a> e_step_loops = d_steps; 248e6: 40 93 48 05 sts 0x0548, r20 ; 0x800548 } e_steps -= e_step_loops; 248ea: 90 91 48 05 lds r25, 0x0548 ; 0x800548 248ee: 89 1b sub r24, r25 248f0: 80 93 69 05 sts 0x0569, r24 ; 0x800569 if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 248f4: 88 23 and r24, r24 248f6: 39 f0 breq .+14 ; 0x24906 <__vector_17+0x1236> 248f8: 87 ff sbrs r24, 7 248fa: 53 c0 rjmp .+166 ; 0x249a2 <__vector_17+0x12d2> 248fc: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24900: 80 64 ori r24, 0x40 ; 64 24902: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> current_adv_steps -= e_step_loops; 24906: 20 91 48 05 lds r18, 0x0548 ; 0x800548 2490a: 80 91 48 04 lds r24, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 2490e: 90 91 49 04 lds r25, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 24912: 82 1b sub r24, r18 24914: 91 09 sbc r25, r1 if (d_steps < e_step_loops) e_step_loops = d_steps; } e_steps += e_step_loops; if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); current_adv_steps += e_step_loops; 24916: 90 93 49 04 sts 0x0449, r25 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 2491a: 80 93 48 04 sts 0x0448, r24 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> } if (current_adv_steps == target_adv_steps) { 2491e: 20 91 48 04 lds r18, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 24922: 30 91 49 04 lds r19, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 24926: 80 91 6a 05 lds r24, 0x056A ; 0x80056a 2492a: 90 91 6b 05 lds r25, 0x056B ; 0x80056b 2492e: 28 17 cp r18, r24 24930: 39 07 cpc r19, r25 24932: 09 f0 breq .+2 ; 0x24936 <__vector_17+0x1266> 24934: 66 c0 rjmp .+204 ; 0x24a02 <__vector_17+0x1332> // advance steps completed nextAdvanceISR = ADV_NEVER; 24936: 8f ef ldi r24, 0xFF ; 255 24938: 9f ef ldi r25, 0xFF ; 255 } else { // schedule another tick nextAdvanceISR = eISR_Rate; 2493a: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 2493e: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif } // Tick E steps if any if (e_steps && (LA_phase < 0 || LA_phase == eisr)) { 24942: 40 91 69 05 lds r20, 0x0569 ; 0x800569 24946: 41 11 cpse r20, r1 24948: 61 c0 rjmp .+194 ; 0x24a0c <__vector_17+0x133c> while(--max_ticks); } // Schedule the next closest tick, ignoring advance if scheduled too // soon in order to avoid skewing the regular stepper acceleration if (nextAdvanceISR != ADV_NEVER && (nextAdvanceISR + 40) < nextMainISR) 2494a: 80 91 4c 04 lds r24, 0x044C ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> 2494e: 90 91 4d 04 lds r25, 0x044D ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 24952: 20 91 4e 04 lds r18, 0x044E ; 0x80044e <_ZL11nextMainISR.lto_priv.438> 24956: 30 91 4f 04 lds r19, 0x044F ; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1> 2495a: 8f 3f cpi r24, 0xFF ; 255 2495c: 98 07 cpc r25, r24 2495e: 09 f0 breq .+2 ; 0x24962 <__vector_17+0x1292> 24960: 98 c0 rjmp .+304 ; 0x24a92 <__vector_17+0x13c2> OCR1A = nextAdvanceISR; else OCR1A = nextMainISR; 24962: 30 93 89 00 sts 0x0089, r19 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 24966: 20 93 88 00 sts 0x0088, r18 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 2496a: 9e c0 rjmp .+316 ; 0x24aa8 <__vector_17+0x13d8> // @wavexx: fast uint16_t division for small dividends<5 // q/3 based on "Hacker's delight" formula FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d) { if(d != 3) return q >> (d / 2); else return ((uint32_t)0xAAAB * q) >> 17; 2496c: ab ea ldi r26, 0xAB ; 171 2496e: ba ea ldi r27, 0xAA ; 170 24970: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 24974: ab 01 movw r20, r22 24976: bc 01 movw r22, r24 24978: 31 e1 ldi r19, 0x11 ; 17 2497a: 76 95 lsr r23 2497c: 67 95 ror r22 2497e: 57 95 ror r21 24980: 47 95 ror r20 24982: 3a 95 dec r19 24984: d1 f7 brne .-12 ; 0x2497a <__vector_17+0x12aa> 24986: 57 cf rjmp .-338 ; 0x24836 <__vector_17+0x1166> 24988: 9f 01 movw r18, r30 2498a: ab ea ldi r26, 0xAB ; 171 2498c: ba ea ldi r27, 0xAA ; 170 2498e: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 24992: 21 e1 ldi r18, 0x11 ; 17 24994: 96 95 lsr r25 24996: 87 95 ror r24 24998: 77 95 ror r23 2499a: 67 95 ror r22 2499c: 2a 95 dec r18 2499e: d1 f7 brne .-12 ; 0x24994 <__vector_17+0x12c4> 249a0: 54 cf rjmp .-344 ; 0x2484a <__vector_17+0x117a> uint16_t d_steps = current_adv_steps - target_adv_steps; if (d_steps < e_step_loops) e_step_loops = d_steps; } e_steps -= e_step_loops; if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 249a2: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 249a6: 8f 7b andi r24, 0xBF ; 191 249a8: ac cf rjmp .-168 ; 0x24902 <__vector_17+0x1232> current_adv_steps -= e_step_loops; } else if (current_adv_steps < target_adv_steps) { 249aa: 42 17 cp r20, r18 249ac: 53 07 cpc r21, r19 249ae: 08 f0 brcs .+2 ; 0x249b2 <__vector_17+0x12e2> 249b0: b6 cf rjmp .-148 ; 0x2491e <__vector_17+0x124e> // compression if (e_step_loops != 1) { 249b2: 90 91 48 05 lds r25, 0x0548 ; 0x800548 249b6: 91 30 cpi r25, 0x01 ; 1 249b8: 41 f0 breq .+16 ; 0x249ca <__vector_17+0x12fa> uint16_t d_steps = target_adv_steps - current_adv_steps; 249ba: 24 1b sub r18, r20 249bc: 35 0b sbc r19, r21 if (d_steps < e_step_loops) 249be: 92 17 cp r25, r18 249c0: 13 06 cpc r1, r19 249c2: 19 f0 breq .+6 ; 0x249ca <__vector_17+0x12fa> 249c4: 10 f0 brcs .+4 ; 0x249ca <__vector_17+0x12fa> e_step_loops = d_steps; 249c6: 20 93 48 05 sts 0x0548, r18 ; 0x800548 } e_steps += e_step_loops; 249ca: 90 91 48 05 lds r25, 0x0548 ; 0x800548 249ce: 89 0f add r24, r25 249d0: 80 93 69 05 sts 0x0569, r24 ; 0x800569 if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 249d4: 88 23 and r24, r24 249d6: 39 f0 breq .+14 ; 0x249e6 <__vector_17+0x1316> 249d8: 87 ff sbrs r24, 7 249da: 0f c0 rjmp .+30 ; 0x249fa <__vector_17+0x132a> 249dc: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 249e0: 80 64 ori r24, 0x40 ; 64 249e2: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> current_adv_steps += e_step_loops; 249e6: 80 91 48 05 lds r24, 0x0548 ; 0x800548 249ea: 20 91 48 04 lds r18, 0x0448 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> 249ee: 30 91 49 04 lds r19, 0x0449 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 249f2: 82 0f add r24, r18 249f4: 93 2f mov r25, r19 249f6: 91 1d adc r25, r1 249f8: 8e cf rjmp .-228 ; 0x24916 <__vector_17+0x1246> uint16_t d_steps = target_adv_steps - current_adv_steps; if (d_steps < e_step_loops) e_step_loops = d_steps; } e_steps += e_step_loops; if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 249fa: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 249fe: 8f 7b andi r24, 0xBF ; 191 24a00: f0 cf rjmp .-32 ; 0x249e2 <__vector_17+0x1312> // advance steps completed nextAdvanceISR = ADV_NEVER; } else { // schedule another tick nextAdvanceISR = eISR_Rate; 24a02: 80 91 46 05 lds r24, 0x0546 ; 0x800546 24a06: 90 91 47 05 lds r25, 0x0547 ; 0x800547 24a0a: 97 cf rjmp .-210 ; 0x2493a <__vector_17+0x126a> WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif } // Tick E steps if any if (e_steps && (LA_phase < 0 || LA_phase == eisr)) { 24a0c: 80 91 68 05 lds r24, 0x0568 ; 0x800568 24a10: 87 fd sbrc r24, 7 24a12: 0e c0 rjmp .+28 ; 0x24a30 <__vector_17+0x1360> 24a14: 08 2e mov r0, r24 24a16: 00 0c add r0, r0 24a18: 99 0b sbc r25, r25 WRITE_NC(LOGIC_ANALYZER_CH0, false); #endif } // Run the next advance isr if triggered bool eisr = !nextAdvanceISR; 24a1a: 21 e0 ldi r18, 0x01 ; 1 24a1c: 30 e0 ldi r19, 0x00 ; 0 24a1e: 61 15 cp r22, r1 24a20: 71 05 cpc r23, r1 24a22: 11 f0 breq .+4 ; 0x24a28 <__vector_17+0x1358> 24a24: 30 e0 ldi r19, 0x00 ; 0 24a26: 20 e0 ldi r18, 0x00 ; 0 WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif } // Tick E steps if any if (e_steps && (LA_phase < 0 || LA_phase == eisr)) { 24a28: 82 17 cp r24, r18 24a2a: 93 07 cpc r25, r19 24a2c: 09 f0 breq .+2 ; 0x24a30 <__vector_17+0x1360> 24a2e: 8d cf rjmp .-230 ; 0x2494a <__vector_17+0x127a> uint8_t max_ticks = (eisr? e_step_loops: step_loops); 24a30: 20 91 48 05 lds r18, 0x0548 ; 0x800548 24a34: 67 2b or r22, r23 24a36: 11 f0 breq .+4 ; 0x24a3c <__vector_17+0x136c> 24a38: 20 91 70 05 lds r18, 0x0570 ; 0x800570 max_ticks = min(abs(e_steps), max_ticks); 24a3c: 84 2f mov r24, r20 24a3e: 04 2e mov r0, r20 24a40: 00 0c add r0, r0 24a42: 99 0b sbc r25, r25 24a44: 97 ff sbrs r25, 7 24a46: 03 c0 rjmp .+6 ; 0x24a4e <__vector_17+0x137e> 24a48: 91 95 neg r25 24a4a: 81 95 neg r24 24a4c: 91 09 sbc r25, r1 24a4e: 30 e0 ldi r19, 0x00 ; 0 24a50: 28 17 cp r18, r24 24a52: 39 07 cpc r19, r25 24a54: 0c f4 brge .+2 ; 0x24a58 <__vector_17+0x1388> 24a56: c9 01 movw r24, r18 24a58: 47 ff sbrs r20, 7 24a5a: 17 c0 rjmp .+46 ; 0x24a8a <__vector_17+0x13ba> 24a5c: 61 e0 ldi r22, 0x01 ; 1 24a5e: 4f ef ldi r20, 0xFF ; 255 24a60: 5f ef ldi r21, 0xFF ; 255 bool rev = (e_steps < 0); do { STEP_NC_HI(E_AXIS); 24a62: 43 9a sbi 0x08, 3 ; 8 e_steps += (rev? 1: -1); 24a64: 90 91 69 05 lds r25, 0x0569 ; 0x800569 24a68: 96 0f add r25, r22 24a6a: 90 93 69 05 sts 0x0569, r25 ; 0x800569 STEP_NC_LO(E_AXIS); 24a6e: 43 98 cbi 0x08, 3 ; 8 void setJamDetectionEnabled(bool state, bool updateEEPROM = false); bool getJamDetectionEnabled() const { return jamDetection; } void stStep(bool rev) { //from stepper isr stepCount += rev ? -1 : 1; 24a70: 20 91 02 17 lds r18, 0x1702 ; 0x801702 24a74: 30 91 03 17 lds r19, 0x1703 ; 0x801703 24a78: 24 0f add r18, r20 24a7a: 35 1f adc r19, r21 24a7c: 30 93 03 17 sts 0x1703, r19 ; 0x801703 24a80: 20 93 02 17 sts 0x1702, r18 ; 0x801702 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.stStep(rev); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } while(--max_ticks); 24a84: 81 50 subi r24, 0x01 ; 1 24a86: 69 f7 brne .-38 ; 0x24a62 <__vector_17+0x1392> 24a88: 60 cf rjmp .-320 ; 0x2494a <__vector_17+0x127a> 24a8a: 6f ef ldi r22, 0xFF ; 255 24a8c: 41 e0 ldi r20, 0x01 ; 1 24a8e: 50 e0 ldi r21, 0x00 ; 0 24a90: e8 cf rjmp .-48 ; 0x24a62 <__vector_17+0x1392> } // Schedule the next closest tick, ignoring advance if scheduled too // soon in order to avoid skewing the regular stepper acceleration if (nextAdvanceISR != ADV_NEVER && (nextAdvanceISR + 40) < nextMainISR) 24a92: ac 01 movw r20, r24 24a94: 48 5d subi r20, 0xD8 ; 216 24a96: 5f 4f sbci r21, 0xFF ; 255 24a98: 42 17 cp r20, r18 24a9a: 53 07 cpc r21, r19 24a9c: 08 f0 brcs .+2 ; 0x24aa0 <__vector_17+0x13d0> 24a9e: 61 cf rjmp .-318 ; 0x24962 <__vector_17+0x1292> OCR1A = nextAdvanceISR; 24aa0: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 24aa4: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> isr(); #endif // Don't run the ISR faster than possible // Is there a 8us time left before the next interrupt triggers? if (OCR1A < TCNT1 + 16) { 24aa8: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 24aac: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 24ab0: 80 91 84 00 lds r24, 0x0084 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> 24ab4: 90 91 85 00 lds r25, 0x0085 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 24ab8: 40 96 adiw r24, 0x10 ; 16 24aba: 28 17 cp r18, r24 24abc: 39 07 cpc r19, r25 24abe: 48 f4 brcc .+18 ; 0x24ad2 <__vector_17+0x1402> // Beep, the beeper will be cleared at the stepper_timer_overflow() called from the main thread. WRITE(BEEPER, HIGH); } #endif // Fix the next interrupt to be executed after 8us from now. OCR1A = TCNT1 + 16; 24ac0: 80 91 84 00 lds r24, 0x0084 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> 24ac4: 90 91 85 00 lds r25, 0x0085 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 24ac8: 40 96 adiw r24, 0x10 ; 16 24aca: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 24ace: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> } } 24ad2: ff 91 pop r31 24ad4: ef 91 pop r30 24ad6: df 91 pop r29 24ad8: cf 91 pop r28 24ada: bf 91 pop r27 24adc: af 91 pop r26 24ade: 9f 91 pop r25 24ae0: 8f 91 pop r24 24ae2: 7f 91 pop r23 24ae4: 6f 91 pop r22 24ae6: 5f 91 pop r21 24ae8: 4f 91 pop r20 24aea: 3f 91 pop r19 24aec: 2f 91 pop r18 24aee: 1f 91 pop r17 24af0: ff 90 pop r15 24af2: ef 90 pop r14 24af4: df 90 pop r13 24af6: cf 90 pop r12 24af8: 8f 90 pop r8 24afa: 7f 90 pop r7 24afc: 6f 90 pop r6 24afe: 5f 90 pop r5 24b00: 4f 90 pop r4 24b02: 0f 90 pop r0 24b04: 0b be out 0x3b, r0 ; 59 24b06: 0f 90 pop r0 24b08: 0f be out 0x3f, r0 ; 63 24b0a: 0f 90 pop r0 24b0c: 1f 90 pop r1 24b0e: 18 95 reti 00024b10 : return old; } bool enable_z_endstop(bool check) { bool old = check_z_endstop; 24b10: 90 91 4f 05 lds r25, 0x054F ; 0x80054f check_z_endstop = check; 24b14: 80 93 4f 05 sts 0x054F, r24 ; 0x80054f CRITICAL_SECTION_START; 24b18: 2f b7 in r18, 0x3f ; 63 24b1a: f8 94 cli endstop_hit &= ~_BV(Z_AXIS); 24b1c: 80 91 5e 04 lds r24, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> 24b20: 8b 7f andi r24, 0xFB ; 251 24b22: 80 93 5e 04 sts 0x045E, r24 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> CRITICAL_SECTION_END; 24b26: 2f bf out 0x3f, r18 ; 63 return old; } 24b28: 89 2f mov r24, r25 24b2a: 08 95 ret 00024b2c : return old; } bool endstop_z_hit_on_purpose() { bool hit = endstop_hit & _BV(Z_AXIS); 24b2c: 80 91 5e 04 lds r24, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> CRITICAL_SECTION_START; 24b30: 2f b7 in r18, 0x3f ; 63 24b32: f8 94 cli endstop_hit &= ~_BV(Z_AXIS); 24b34: 90 91 5e 04 lds r25, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> 24b38: 9b 7f andi r25, 0xFB ; 251 24b3a: 90 93 5e 04 sts 0x045E, r25 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> CRITICAL_SECTION_END; 24b3e: 2f bf out 0x3f, r18 ; 63 return hit; } 24b40: 82 fb bst r24, 2 24b42: 88 27 eor r24, r24 24b44: 80 f9 bld r24, 0 24b46: 08 95 ret 00024b48 : } } bool endstops_hit_on_purpose() { uint8_t old = endstop_hit; 24b48: 90 91 5e 04 lds r25, 0x045E ; 0x80045e <_ZL11endstop_hit.lto_priv.442> endstop_hit = 0; 24b4c: 10 92 5e 04 sts 0x045E, r1 ; 0x80045e <_ZL11endstop_hit.lto_priv.442> return old; 24b50: 81 e0 ldi r24, 0x01 ; 1 24b52: 91 11 cpse r25, r1 24b54: 01 c0 rjmp .+2 ; 0x24b58 24b56: 80 e0 ldi r24, 0x00 ; 0 } 24b58: 08 95 ret 00024b5a : } } void Sound_MakeSound(eSOUND_TYPE eSoundType) { switch(eSoundMode) 24b5a: 90 91 47 04 lds r25, 0x0447 ; 0x800447 24b5e: 91 30 cpi r25, 0x01 ; 1 24b60: a1 f0 breq .+40 ; 0x24b8a 24b62: 28 f0 brcs .+10 ; 0x24b6e 24b64: 92 30 cpi r25, 0x02 ; 2 24b66: a9 f0 breq .+42 ; 0x24b92 24b68: 93 30 cpi r25, 0x03 ; 3 24b6a: c1 f0 breq .+48 ; 0x24b9c 24b6c: 08 95 ret { case e_SOUND_MODE_LOUD: if(eSoundType==e_SOUND_TYPE_ButtonEcho) 24b6e: 81 11 cpse r24, r1 24b70: 02 c0 rjmp .+4 ; 0x24b76 if(eSoundType==e_SOUND_TYPE_StandardAlert) Sound_DoSound_Alert(true); break; case e_SOUND_MODE_BLIND: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); 24b72: 0d 94 87 03 jmp 0x2070e ; 0x2070e switch(eSoundMode) { case e_SOUND_MODE_LOUD: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 24b76: 82 30 cpi r24, 0x02 ; 2 24b78: 11 f4 brne .+4 ; 0x24b7e break; case e_SOUND_MODE_BLIND: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) Sound_DoSound_Prompt(); 24b7a: 0d 94 54 08 jmp 0x210a8 ; 0x210a8 case e_SOUND_MODE_LOUD: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) 24b7e: 85 30 cpi r24, 0x05 ; 5 24b80: 09 f0 breq .+2 ; 0x24b84 24b82: 4d c0 rjmp .+154 ; 0x24c1e Sound_DoSound_Alert(false); 24b84: 80 e0 ldi r24, 0x00 ; 0 if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) Sound_DoSound_Alert(true); 24b86: 0d 94 65 03 jmp 0x206ca ; 0x206ca Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) Sound_DoSound_Alert(false); break; case e_SOUND_MODE_ONCE: if(eSoundType==e_SOUND_TYPE_ButtonEcho) 24b8a: 88 23 and r24, r24 24b8c: 91 f3 breq .-28 ; 0x24b72 Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 24b8e: 82 30 cpi r24, 0x02 ; 2 24b90: a1 f3 breq .-24 ; 0x24b7a Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) 24b92: 85 30 cpi r24, 0x05 ; 5 24b94: 09 f0 breq .+2 ; 0x24b98 24b96: 43 c0 rjmp .+134 ; 0x24c1e Sound_DoSound_Alert(true); 24b98: 81 e0 ldi r24, 0x01 ; 1 24b9a: f5 cf rjmp .-22 ; 0x24b86 case e_SOUND_MODE_SILENT: if(eSoundType==e_SOUND_TYPE_StandardAlert) Sound_DoSound_Alert(true); break; case e_SOUND_MODE_BLIND: if(eSoundType==e_SOUND_TYPE_ButtonEcho) 24b9c: 88 23 and r24, r24 24b9e: 49 f3 breq .-46 ; 0x24b72 Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 24ba0: 82 30 cpi r24, 0x02 ; 2 24ba2: 59 f3 breq .-42 ; 0x24b7a Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) 24ba4: 85 30 cpi r24, 0x05 ; 5 24ba6: 71 f3 breq .-36 ; 0x24b84 Sound_DoSound_Alert(false); if(eSoundType==e_SOUND_TYPE_EncoderMove) 24ba8: 86 30 cpi r24, 0x06 ; 6 24baa: e1 f4 brne .+56 ; 0x24be4 24bac: 85 e0 ldi r24, 0x05 ; 5 24bae: 27 e2 ldi r18, 0x27 ; 39 24bb0: 31 e0 ldi r19, 0x01 ; 1 { uint8_t nI; for(nI=0;nI<5;nI++) { WRITE(BEEPER,HIGH); 24bb2: 4f b7 in r20, 0x3f ; 63 24bb4: f8 94 cli 24bb6: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bba: 94 60 ori r25, 0x04 ; 4 24bbc: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bc0: 4f bf out 0x3f, r20 ; 63 24bc2: f9 01 movw r30, r18 24bc4: 31 97 sbiw r30, 0x01 ; 1 24bc6: f1 f7 brne .-4 ; 0x24bc4 delayMicroseconds(75); WRITE(BEEPER,LOW); 24bc8: 4f b7 in r20, 0x3f ; 63 24bca: f8 94 cli 24bcc: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bd0: 9b 7f andi r25, 0xFB ; 251 24bd2: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bd6: 4f bf out 0x3f, r20 ; 63 24bd8: f9 01 movw r30, r18 24bda: 31 97 sbiw r30, 0x01 ; 1 24bdc: f1 f7 brne .-4 ; 0x24bda 24bde: 81 50 subi r24, 0x01 ; 1 static void Sound_DoSound_Encoder_Move(void) { uint8_t nI; for(nI=0;nI<5;nI++) 24be0: 41 f7 brne .-48 ; 0x24bb2 24be2: 08 95 ret Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) Sound_DoSound_Alert(false); if(eSoundType==e_SOUND_TYPE_EncoderMove) Sound_DoSound_Encoder_Move(); if(eSoundType==e_SOUND_TYPE_BlindAlert) 24be4: 87 30 cpi r24, 0x07 ; 7 24be6: d9 f4 brne .+54 ; 0x24c1e 24be8: 84 e1 ldi r24, 0x14 ; 20 24bea: 23 e7 ldi r18, 0x73 ; 115 24bec: 31 e0 ldi r19, 0x01 ; 1 backlight_wake(1); uint8_t nI; for(nI=0; nI<20; nI++) { WRITE(BEEPER,HIGH); 24bee: 4f b7 in r20, 0x3f ; 63 24bf0: f8 94 cli 24bf2: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bf6: 94 60 ori r25, 0x04 ; 4 24bf8: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24bfc: 4f bf out 0x3f, r20 ; 63 24bfe: f9 01 movw r30, r18 24c00: 31 97 sbiw r30, 0x01 ; 1 24c02: f1 f7 brne .-4 ; 0x24c00 delayMicroseconds(94); WRITE(BEEPER,LOW); 24c04: 4f b7 in r20, 0x3f ; 63 24c06: f8 94 cli 24c08: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24c0c: 9b 7f andi r25, 0xFB ; 251 24c0e: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24c12: 4f bf out 0x3f, r20 ; 63 24c14: f9 01 movw r30, r18 24c16: 31 97 sbiw r30, 0x01 ; 1 24c18: f1 f7 brne .-4 ; 0x24c16 24c1a: 81 50 subi r24, 0x01 ; 1 static void Sound_DoSound_Blind_Alert(void) { backlight_wake(1); uint8_t nI; for(nI=0; nI<20; nI++) 24c1c: 41 f7 brne .-48 ; 0x24bee Sound_DoSound_Blind_Alert(); break; default: break; } } 24c1e: 08 95 ret 00024c20 : static void __attribute__((noinline)) mFilamentResetMenuStack() { menu_back(bFilamentPreheatState ? 1 : 2); } void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) { 24c20: 0f 93 push r16 24c22: 1f 93 push r17 24c24: cf 93 push r28 24c26: df 93 push r29 24c28: 8c 01 movw r16, r24 24c2a: eb 01 movw r28, r22 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 24c2c: 90 93 5e 12 sts 0x125E, r25 ; 0x80125e 24c30: 80 93 5d 12 sts 0x125D, r24 ; 0x80125d setTargetHotend((float)nTemp); if (!shouldPreheatOnlyNozzle()) setTargetBed((float)nTempBed); 24c34: 0f 94 7d 04 call 0x208fa ; 0x208fa 24c38: 81 11 cpse r24, r1 24c3a: 04 c0 rjmp .+8 ; 0x24c44 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 24c3c: d0 93 5a 12 sts 0x125A, r29 ; 0x80125a 24c40: c0 93 59 12 sts 0x1259, r28 ; 0x801259 { const FilamentAction action = eFilamentAction; 24c44: c0 91 94 03 lds r28, 0x0394 ; 0x800394 if (action == FilamentAction::Preheat || action == FilamentAction::Lay1Cal) 24c48: 87 ef ldi r24, 0xF7 ; 247 24c4a: 8c 0f add r24, r28 24c4c: 82 30 cpi r24, 0x02 ; 2 24c4e: f8 f4 brcc .+62 ; 0x24c8e { lcd_return_to_status(); 24c50: 0f 94 d5 07 call 0x20faa ; 0x20faa if (action == FilamentAction::Lay1Cal) 24c54: ca 30 cpi r28, 0x0A ; 10 24c56: 41 f4 brne .+16 ; 0x24c68 { lcd_commands_type = LcdCommands::Layer1Cal; 24c58: 84 e0 ldi r24, 0x04 ; 4 24c5a: 80 93 5e 0d sts 0x0D5E, r24 ; 0x800d5e } menu_back(); clearFilamentAction(); } } } 24c5e: df 91 pop r29 24c60: cf 91 pop r28 24c62: 1f 91 pop r17 24c64: 0f 91 pop r16 24c66: 08 95 ret { lcd_commands_type = LcdCommands::Layer1Cal; } else { raise_z_above(MIN_Z_FOR_PREHEAT); 24c68: 60 e0 ldi r22, 0x00 ; 0 24c6a: 70 e0 ldi r23, 0x00 ; 0 24c6c: 80 e2 ldi r24, 0x20 ; 32 24c6e: 91 e4 ldi r25, 0x41 ; 65 24c70: 0e 94 f6 6c call 0xd9ec ; 0xd9ec if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 24c74: 8f e5 ldi r24, 0x5F ; 95 24c76: 9f e0 ldi r25, 0x0F ; 15 24c78: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 24c7c: 88 23 and r24, r24 24c7e: 79 f3 breq .-34 ; 0x24c5e lcd_wizard(WizState::LoadFilHot); 24c80: 88 e0 ldi r24, 0x08 ; 8 } menu_back(); clearFilamentAction(); } } } 24c82: df 91 pop r29 24c84: cf 91 pop r28 24c86: 1f 91 pop r17 24c88: 0f 91 pop r16 } else { raise_z_above(MIN_Z_FOR_PREHEAT); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) lcd_wizard(WizState::LoadFilHot); 24c8a: 0c 94 c3 eb jmp 0x1d786 ; 0x1d786 24c8e: 10 92 e3 03 sts 0x03E3, r1 ; 0x8003e3 lcd_timeoutToStatus.stop(); // the current temperature is within +-TEMP_HYSTERESIS of the target // then continue with the filament action if any is set if (bFilamentSkipPreheat || abs((int)current_temperature[0] - (int)nTemp) < TEMP_HYSTERESIS) 24c92: 80 91 16 06 lds r24, 0x0616 ; 0x800616 24c96: 81 11 cpse r24, r1 24c98: 12 c0 rjmp .+36 ; 0x24cbe 24c9a: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 24c9e: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 24ca2: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 24ca6: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 24caa: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 24cae: 60 1b sub r22, r16 24cb0: 71 0b sbc r23, r17 24cb2: 6c 5f subi r22, 0xFC ; 252 24cb4: 7f 4f sbci r23, 0xFF ; 255 24cb6: 69 30 cpi r22, 0x09 ; 9 24cb8: 71 05 cpc r23, r1 24cba: 08 f0 brcs .+2 ; 0x24cbe 24cbc: 60 c0 rjmp .+192 ; 0x24d7e { menu_func_t filamentActionMenu = nullptr; switch (eFilamentAction) 24cbe: c1 50 subi r28, 0x01 ; 1 24cc0: c8 30 cpi r28, 0x08 ; 8 24cc2: 88 f5 brcc .+98 ; 0x24d26 24cc4: ec 2f mov r30, r28 24cc6: f0 e0 ldi r31, 0x00 ; 0 24cc8: 88 27 eor r24, r24 24cca: e6 59 subi r30, 0x96 ; 150 24ccc: f9 4d sbci r31, 0xD9 ; 217 24cce: 8e 4f sbci r24, 0xFE ; 254 24cd0: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 24cd4: ea 37 cpi r30, 0x7A ; 122 24cd6: ea 37 cpi r30, 0x7A ; 122 24cd8: ea 37 cpi r30, 0x7A ; 122 24cda: 62 37 cpi r22, 0x72 ; 114 24cdc: 5c 37 cpi r21, 0x7C ; 124 24cde: ec 36 cpi r30, 0x6C ; 108 24ce0: d0 37 cpi r29, 0x70 ; 112 24ce2: ee 37 cpi r30, 0x7E ; 126 else if (eFilamentAction == FilamentAction::UnLoad) enquecommand_P(MSG_M702); // unload filament } break; case FilamentAction::MmuLoad: filamentActionMenu = mmu_load_to_nozzle_menu; 24ce4: c7 e6 ldi r28, 0x67 ; 103 24ce6: d0 ed ldi r29, 0xD0 ; 208 case FilamentAction::Preheat: case FilamentAction::Lay1Cal: // handled earlier break; } if (bFilamentWaitingFlag) { 24ce8: 80 91 14 06 lds r24, 0x0614 ; 0x800614 24cec: 88 23 and r24, r24 24cee: 29 f0 breq .+10 ; 0x24cfa Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); 24cf0: 82 e0 ldi r24, 0x02 ; 2 24cf2: 0f 94 ad 25 call 0x24b5a ; 0x24b5a bFilamentWaitingFlag = false; 24cf6: 10 92 14 06 sts 0x0614, r1 ; 0x800614 } if (filamentActionMenu) { 24cfa: 20 97 sbiw r28, 0x00 ; 0 24cfc: 09 f4 brne .+2 ; 0x24d00 24cfe: af cf rjmp .-162 ; 0x24c5e // Reset the menu stack and filament action before entering action menu mFilamentResetMenuStack(); 24d00: 0f 94 11 05 call 0x20a22 ; 0x20a22 // The menu should clear eFilamentAction when the // 'action' is done menu_submenu(filamentActionMenu, true); 24d04: 61 e0 ldi r22, 0x01 ; 1 24d06: ce 01 movw r24, r28 } menu_back(); clearFilamentAction(); } } } 24d08: df 91 pop r29 24d0a: cf 91 pop r28 24d0c: 1f 91 pop r17 24d0e: 0f 91 pop r16 // Reset the menu stack and filament action before entering action menu mFilamentResetMenuStack(); // The menu should clear eFilamentAction when the // 'action' is done menu_submenu(filamentActionMenu, true); 24d10: 0c 94 dd 62 jmp 0xc5ba ; 0xc5ba switch (eFilamentAction) { case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::UnLoad: if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true); 24d14: 80 91 14 06 lds r24, 0x0614 ; 0x800614 24d18: 88 23 and r24, r24 24d1a: 41 f0 breq .+16 ; 0x24d2c 24d1c: 61 e0 ldi r22, 0x01 ; 1 24d1e: 86 ee ldi r24, 0xE6 ; 230 24d20: 96 e3 ldi r25, 0x36 ; 54 24d22: 0e 94 dd 62 call 0xc5ba ; 0xc5ba // the current temperature is within +-TEMP_HYSTERESIS of the target // then continue with the filament action if any is set if (bFilamentSkipPreheat || abs((int)current_temperature[0] - (int)nTemp) < TEMP_HYSTERESIS) { menu_func_t filamentActionMenu = nullptr; 24d26: d0 e0 ldi r29, 0x00 ; 0 24d28: c0 e0 ldi r28, 0x00 ; 0 24d2a: de cf rjmp .-68 ; 0x24ce8 case FilamentAction::AutoLoad: case FilamentAction::UnLoad: if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true); else { mFilamentResetMenuStack(); 24d2c: 0f 94 11 05 call 0x20a22 ; 0x20a22 if (eFilamentAction == FilamentAction::AutoLoad) { 24d30: 80 91 94 03 lds r24, 0x0394 ; 0x800394 24d34: 82 30 cpi r24, 0x02 ; 2 24d36: 19 f4 brne .+6 ; 0x24d3e // loading no longer cancellable eFilamentAction = FilamentAction::Load; 24d38: 81 e0 ldi r24, 0x01 ; 1 24d3a: 80 93 94 03 sts 0x0394, r24 ; 0x800394 } if (eFilamentAction == FilamentAction::Load) 24d3e: 80 91 94 03 lds r24, 0x0394 ; 0x800394 24d42: 81 30 cpi r24, 0x01 ; 1 24d44: 31 f4 brne .+12 ; 0x24d52 enquecommand_P(MSG_M701); // load filament 24d46: 61 e0 ldi r22, 0x01 ; 1 24d48: 88 e1 ldi r24, 0x18 ; 24 24d4a: 9b e6 ldi r25, 0x6B ; 107 else if (eFilamentAction == FilamentAction::UnLoad) enquecommand_P(MSG_M702); // unload filament 24d4c: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 24d50: ea cf rjmp .-44 ; 0x24d26 eFilamentAction = FilamentAction::Load; } if (eFilamentAction == FilamentAction::Load) enquecommand_P(MSG_M701); // load filament else if (eFilamentAction == FilamentAction::UnLoad) 24d52: 83 30 cpi r24, 0x03 ; 3 24d54: 41 f7 brne .-48 ; 0x24d26 enquecommand_P(MSG_M702); // unload filament 24d56: 61 e0 ldi r22, 0x01 ; 1 24d58: 8c ec ldi r24, 0xCC ; 204 24d5a: 98 e6 ldi r25, 0x68 ; 104 24d5c: f7 cf rjmp .-18 ; 0x24d4c break; case FilamentAction::MmuLoad: filamentActionMenu = mmu_load_to_nozzle_menu; break; case FilamentAction::MmuLoadingTest: filamentActionMenu = mmu_loading_test_menu; 24d5e: c1 ee ldi r28, 0xE1 ; 225 24d60: df ec ldi r29, 0xCF ; 207 24d62: c2 cf rjmp .-124 ; 0x24ce8 break; case FilamentAction::MmuUnLoad: mFilamentResetMenuStack(); 24d64: 0f 94 11 05 call 0x20a22 ; 0x20a22 MMU2::mmu2.unload(); 24d68: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 // Clear the filament action. MMU Unload is currently a special edge // case in that it does not call a submenu. So we must clear the action // flag here for now clearFilamentAction(); 24d6c: 0f 94 d6 0b call 0x217ac ; 0x217ac 24d70: da cf rjmp .-76 ; 0x24d26 break; case FilamentAction::MmuEject: filamentActionMenu = mmu_fil_eject_menu; 24d72: cf e5 ldi r28, 0x5F ; 95 24d74: d0 ed ldi r29, 0xD0 ; 208 24d76: b8 cf rjmp .-144 ; 0x24ce8 break; case FilamentAction::MmuCut: #ifdef MMU_HAS_CUTTER filamentActionMenu = mmu_cut_filament_menu; 24d78: c7 e5 ldi r28, 0x57 ; 87 24d7a: d0 ed ldi r29, 0xD0 ; 208 24d7c: b5 cf rjmp .-150 ; 0x24ce8 menu_submenu(filamentActionMenu, true); } } else // still preheating, continue updating LCD UI { if (!bFilamentWaitingFlag || lcd_draw_update) 24d7e: 80 91 14 06 lds r24, 0x0614 ; 0x800614 24d82: 88 23 and r24, r24 24d84: 21 f0 breq .+8 ; 0x24d8e 24d86: 80 91 59 02 lds r24, 0x0259 ; 0x800259 24d8a: 88 23 and r24, r24 24d8c: a1 f1 breq .+104 ; 0x24df6 // bFilamentWaitingFlag to distinguish: this flag is reset exactly once when entering // the menu and is used to raise the carriage *once*. In other cases, the LCD has been // modified elsewhere and needs to be redrawn in full. // reset bFilamentWaitingFlag immediately to avoid re-entry from raise_z_above()! bFilamentWaitingFlag = true; 24d8e: 81 e0 ldi r24, 0x01 ; 1 24d90: 80 93 14 06 sts 0x0614, r24 ; 0x800614 // also force-enable lcd_draw_update (might be 0 when called from outside a menu) lcd_draw_update = 1; 24d94: 80 93 59 02 sts 0x0259, r24 ; 0x800259 lcd_clear(); 24d98: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0,3, PSTR(">")); 24d9c: 4e eb ldi r20, 0xBE ; 190 24d9e: 58 e9 ldi r21, 0x98 ; 152 24da0: 63 e0 ldi r22, 0x03 ; 3 24da2: 80 e0 ldi r24, 0x00 ; 0 24da4: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(1, 3, _T(MSG_CANCEL)); 24da8: 89 e2 ldi r24, 0x29 ; 41 24daa: 9d e3 ldi r25, 0x3D ; 61 24dac: 0e 94 3a 75 call 0xea74 ; 0xea74 24db0: ac 01 movw r20, r24 24db2: 63 e0 ldi r22, 0x03 ; 3 24db4: 81 e0 ldi r24, 0x01 ; 1 24db6: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_set_cursor(0, 1); 24dba: 61 e0 ldi r22, 0x01 ; 1 24dbc: 80 e0 ldi r24, 0x00 ; 0 24dbe: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 switch (eFilamentAction) 24dc2: e0 91 94 03 lds r30, 0x0394 ; 0x800394 24dc6: e1 50 subi r30, 0x01 ; 1 24dc8: e8 30 cpi r30, 0x08 ; 8 24dca: a8 f4 brcc .+42 ; 0x24df6 24dcc: f0 e0 ldi r31, 0x00 ; 0 24dce: 88 27 eor r24, r24 24dd0: e3 51 subi r30, 0x13 ; 19 24dd2: f9 4d sbci r31, 0xD9 ; 217 24dd4: 8e 4f sbci r24, 0xFE ; 254 24dd6: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 24dda: 5e 37 cpi r21, 0x7E ; 126 24ddc: 5e 37 cpi r21, 0x7E ; 126 24dde: 54 38 cpi r21, 0x84 ; 132 24de0: 5e 37 cpi r21, 0x7E ; 126 24de2: 54 38 cpi r21, 0x84 ; 132 24de4: 7c 37 cpi r23, 0x7C ; 124 24de6: 08 38 cpi r16, 0x88 ; 136 24de8: 5e 37 cpi r21, 0x7E ; 126 { case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::MmuLoad: case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_PREHEATING_TO_LOAD)); 24dea: 8b ef ldi r24, 0xFB ; 251 24dec: 97 e5 ldi r25, 0x57 ; 87 break; case FilamentAction::MmuEject: lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT)); break; case FilamentAction::MmuCut: lcd_puts_P(_T(MSG_PREHEATING_TO_CUT)); 24dee: 0e 94 3a 75 call 0xea74 ; 0xea74 24df2: 0e 94 1d 6f call 0xde3a ; 0xde3a // handled earlier break; } } if (bFilamentWaitingFlag) { 24df6: 80 91 14 06 lds r24, 0x0614 ; 0x800614 24dfa: 81 11 cpse r24, r1 lcd_print_target_temps_first_line(); 24dfc: 0f 94 b9 0c call 0x21972 ; 0x21972 } if (lcd_clicked()) 24e00: 0e 94 75 73 call 0xe6ea ; 0xe6ea 24e04: 88 23 and r24, r24 24e06: 09 f4 brne .+2 ; 0x24e0a 24e08: 2a cf rjmp .-428 ; 0x24c5e { // Filament action canceled while preheating bFilamentWaitingFlag = false; 24e0a: 10 92 14 06 sts 0x0614, r1 ; 0x800614 if (!bFilamentPreheatState) 24e0e: 80 91 15 06 lds r24, 0x0615 ; 0x800615 24e12: 81 11 cpse r24, r1 24e14: 0e c0 rjmp .+28 ; 0x24e32 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 24e16: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 24e1a: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d { setTargetHotend(0); if (!printingIsPaused()) setTargetBed(0); 24e1e: 0e 94 35 66 call 0xcc6a ; 0xcc6a 24e22: 81 11 cpse r24, r1 24e24: 04 c0 rjmp .+8 ; 0x24e2e resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 24e26: 10 92 5a 12 sts 0x125A, r1 ; 0x80125a 24e2a: 10 92 59 12 sts 0x1259, r1 ; 0x801259 menu_back(); 24e2e: 0e 94 1b 63 call 0xc636 ; 0xc636 } menu_back(); 24e32: 0e 94 1b 63 call 0xc636 ; 0xc636 clearFilamentAction(); } } } 24e36: df 91 pop r29 24e38: cf 91 pop r28 24e3a: 1f 91 pop r17 24e3c: 0f 91 pop r16 setTargetHotend(0); if (!printingIsPaused()) setTargetBed(0); menu_back(); } menu_back(); clearFilamentAction(); 24e3e: 0d 94 d6 0b jmp 0x217ac ; 0x217ac case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_PREHEATING_TO_LOAD)); break; case FilamentAction::UnLoad: case FilamentAction::MmuUnLoad: lcd_puts_P(_T(MSG_PREHEATING_TO_UNLOAD)); 24e42: 84 ee ldi r24, 0xE4 ; 228 24e44: 97 e5 ldi r25, 0x57 ; 87 24e46: d3 cf rjmp .-90 ; 0x24dee break; case FilamentAction::MmuEject: lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT)); 24e48: 8e ec ldi r24, 0xCE ; 206 24e4a: 97 e5 ldi r25, 0x57 ; 87 24e4c: d0 cf rjmp .-96 ; 0x24dee break; case FilamentAction::MmuCut: lcd_puts_P(_T(MSG_PREHEATING_TO_CUT)); 24e4e: 8a eb ldi r24, 0xBA ; 186 24e50: 97 e5 ldi r25, 0x57 ; 87 24e52: cd cf rjmp .-102 ; 0x24dee 00024e54 : } } } static void setFilamentAction(FilamentAction action) { eFilamentAction = action; 24e54: 80 93 94 03 sts 0x0394, r24 ; 0x800394 setFilamentAction(action); // For MMU: If FINDA doesn't detect filament on Cut or Eject action, // then preheating is unnecessary bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament() && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); 24e58: 40 91 01 13 lds r20, 0x1301 ; 0x801301 24e5c: 20 91 5d 12 lds r18, 0x125D ; 0x80125d 24e60: 30 91 5e 12 lds r19, 0x125E ; 0x80125e 24e64: 41 30 cpi r20, 0x01 ; 1 24e66: 59 f0 breq .+22 ; 0x24e7e setFilamentAction(action); // For MMU: If FINDA doesn't detect filament on Cut or Eject action, // then preheating is unnecessary bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament() 24e68: 10 92 16 06 sts 0x0616, r1 ; 0x800616 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) { 24e6c: 80 91 57 02 lds r24, 0x0257 ; 0x800257 24e70: 90 91 58 02 lds r25, 0x0258 ; 0x800258 24e74: 28 17 cp r18, r24 24e76: 39 07 cpc r19, r25 24e78: 5c f4 brge .+22 ; 0x24e90 bFilamentPreheatState = true; mFilamentItem(target_temperature[0], target_temperature_bed); bFilamentSkipPreheat = false; // Reset flag } else { lcd_generic_preheat_menu(); 24e7a: 0d 94 d9 0b jmp 0x217b2 ; 0x217b2 setFilamentAction(action); // For MMU: If FINDA doesn't detect filament on Cut or Eject action, // then preheating is unnecessary bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament() 24e7e: 90 91 d7 12 lds r25, 0x12D7 ; 0x8012d7 24e82: 91 11 cpse r25, r1 24e84: f1 cf rjmp .-30 ; 0x24e68 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); 24e86: 86 50 subi r24, 0x06 ; 6 24e88: 82 30 cpi r24, 0x02 ; 2 24e8a: 70 f7 brcc .-36 ; 0x24e68 setFilamentAction(action); // For MMU: If FINDA doesn't detect filament on Cut or Eject action, // then preheating is unnecessary bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament() 24e8c: 40 93 16 06 sts 0x0616, r20 ; 0x800616 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) { bFilamentPreheatState = true; 24e90: 81 e0 ldi r24, 0x01 ; 1 24e92: 80 93 15 06 sts 0x0615, r24 ; 0x800615 mFilamentItem(target_temperature[0], target_temperature_bed); 24e96: 60 91 59 12 lds r22, 0x1259 ; 0x801259 24e9a: 70 91 5a 12 lds r23, 0x125A ; 0x80125a 24e9e: c9 01 movw r24, r18 24ea0: 0f 94 10 26 call 0x24c20 ; 0x24c20 bFilamentSkipPreheat = false; // Reset flag 24ea4: 10 92 16 06 sts 0x0616, r1 ; 0x800616 } else { lcd_generic_preheat_menu(); } } 24ea8: 08 95 ret 00024eaa : { preheat_or_continue(FilamentAction::Load); } void lcd_AutoLoadFilament() { preheat_or_continue(FilamentAction::AutoLoad); 24eaa: 82 e0 ldi r24, 0x02 ; 2 24eac: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00024eb0 : } } static void lcd_LoadFilament() { preheat_or_continue(FilamentAction::Load); 24eb0: 81 e0 ldi r24, 0x01 ; 1 24eb2: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00024eb6 : MENU_END(); } static void lcd_unLoadFilament() { preheat_or_continue(FilamentAction::UnLoad); 24eb6: 83 e0 ldi r24, 0x03 ; 3 24eb8: 0d 94 2a 27 jmp 0x24e54 ; 0x24e54 00024ebc : } } static void mFilamentItem_farm() { bFilamentPreheatState = false; 24ebc: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, FARM_PREHEAT_HPB_TEMP); 24ec0: 60 e5 ldi r22, 0x50 ; 80 24ec2: 70 e0 ldi r23, 0x00 ; 0 24ec4: 8a ef ldi r24, 0xFA ; 250 24ec6: 90 e0 ldi r25, 0x00 ; 0 24ec8: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024ecc : } static void mFilamentItem_farm_nozzle() { bFilamentPreheatState = false; 24ecc: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, 0); 24ed0: 70 e0 ldi r23, 0x00 ; 0 24ed2: 60 e0 ldi r22, 0x00 ; 0 24ed4: 8a ef ldi r24, 0xFA ; 250 24ed6: 90 e0 ldi r25, 0x00 ; 0 24ed8: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024edc : } static void mFilamentItem_PLA() { bFilamentPreheatState = false; 24edc: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PLA_PREHEAT_HOTEND_TEMP, PLA_PREHEAT_HPB_TEMP); 24ee0: 6c e3 ldi r22, 0x3C ; 60 24ee2: 70 e0 ldi r23, 0x00 ; 0 24ee4: 87 ed ldi r24, 0xD7 ; 215 24ee6: 90 e0 ldi r25, 0x00 ; 0 24ee8: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024eec : } static void mFilamentItem_PET() { bFilamentPreheatState = false; 24eec: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PET_PREHEAT_HOTEND_TEMP, PET_PREHEAT_HPB_TEMP); 24ef0: 65 e5 ldi r22, 0x55 ; 85 24ef2: 70 e0 ldi r23, 0x00 ; 0 24ef4: 86 ee ldi r24, 0xE6 ; 230 24ef6: 90 e0 ldi r25, 0x00 ; 0 24ef8: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024efc : } static void mFilamentItem_ASA() { bFilamentPreheatState = false; 24efc: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(ASA_PREHEAT_HOTEND_TEMP, ASA_PREHEAT_HPB_TEMP); 24f00: 69 e6 ldi r22, 0x69 ; 105 24f02: 70 e0 ldi r23, 0x00 ; 0 24f04: 84 e0 ldi r24, 0x04 ; 4 24f06: 91 e0 ldi r25, 0x01 ; 1 24f08: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f0c : } static void mFilamentItem_PC() { bFilamentPreheatState = false; 24f0c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP); 24f10: 69 e6 ldi r22, 0x69 ; 105 24f12: 70 e0 ldi r23, 0x00 ; 0 24f14: 83 e1 ldi r24, 0x13 ; 19 24f16: 91 e0 ldi r25, 0x01 ; 1 24f18: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f1c : mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP); } static void mFilamentItem_PVB() { bFilamentPreheatState = false; 24f1c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); 24f20: 6b e4 ldi r22, 0x4B ; 75 24f22: 70 e0 ldi r23, 0x00 ; 0 24f24: 87 ed ldi r24, 0xD7 ; 215 24f26: 90 e0 ldi r25, 0x00 ; 0 24f28: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f2c : mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP); } static void mFilamentItem_PA() { bFilamentPreheatState = false; 24f2c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP); 24f30: 6a e5 ldi r22, 0x5A ; 90 24f32: 70 e0 ldi r23, 0x00 ; 0 24f34: 83 e1 ldi r24, 0x13 ; 19 24f36: 91 e0 ldi r25, 0x01 ; 1 24f38: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f3c : mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP); } static void mFilamentItem_ABS() { bFilamentPreheatState = false; 24f3c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP); 24f40: 64 e6 ldi r22, 0x64 ; 100 24f42: 70 e0 ldi r23, 0x00 ; 0 24f44: 8f ef ldi r24, 0xFF ; 255 24f46: 90 e0 ldi r25, 0x00 ; 0 24f48: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f4c : mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP); } static void mFilamentItem_HIPS() { bFilamentPreheatState = false; 24f4c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(HIPS_PREHEAT_HOTEND_TEMP, HIPS_PREHEAT_HPB_TEMP); 24f50: 64 e6 ldi r22, 0x64 ; 100 24f52: 70 e0 ldi r23, 0x00 ; 0 24f54: 8c ed ldi r24, 0xDC ; 220 24f56: 90 e0 ldi r25, 0x00 ; 0 24f58: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f5c : } static void mFilamentItem_PP() { bFilamentPreheatState = false; 24f5c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(PP_PREHEAT_HOTEND_TEMP, PP_PREHEAT_HPB_TEMP); 24f60: 64 e6 ldi r22, 0x64 ; 100 24f62: 70 e0 ldi r23, 0x00 ; 0 24f64: 8e ef ldi r24, 0xFE ; 254 24f66: 90 e0 ldi r25, 0x00 ; 0 24f68: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f6c : } static void mFilamentItem_FLEX() { bFilamentPreheatState = false; 24f6c: 10 92 15 06 sts 0x0615, r1 ; 0x800615 mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP); 24f70: 62 e3 ldi r22, 0x32 ; 50 24f72: 70 e0 ldi r23, 0x00 ; 0 24f74: 80 ef ldi r24, 0xF0 ; 240 24f76: 90 e0 ldi r25, 0x00 ; 0 24f78: 0d 94 10 26 jmp 0x24c20 ; 0x24c20 00024f7c : } Sound_SaveMode(); } //if critical is true then silend and once mode is ignored void __attribute__((noinline)) Sound_MakeCustom(uint16_t ms,uint16_t tone_,bool critical){ 24f7c: cf 92 push r12 24f7e: df 92 push r13 24f80: ef 92 push r14 24f82: ff 92 push r15 if (critical || eSoundMode != e_SOUND_MODE_SILENT) { 24f84: 41 11 cpse r20, r1 24f86: 04 c0 rjmp .+8 ; 0x24f90 24f88: 20 91 47 04 lds r18, 0x0447 ; 0x800447 24f8c: 22 30 cpi r18, 0x02 ; 2 24f8e: d1 f0 breq .+52 ; 0x24fc4 24f90: 9b 01 movw r18, r22 24f92: 6c 01 movw r12, r24 24f94: f1 2c mov r15, r1 24f96: e1 2c mov r14, r1 if(!tone_) { 24f98: 67 2b or r22, r23 24f9a: c9 f4 brne .+50 ; 0x24fce WRITE(BEEPER, HIGH); 24f9c: 9f b7 in r25, 0x3f ; 63 24f9e: f8 94 cli 24fa0: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24fa4: 84 60 ori r24, 0x04 ; 4 24fa6: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24faa: 9f bf out 0x3f, r25 ; 63 _delay(ms); 24fac: c7 01 movw r24, r14 24fae: b6 01 movw r22, r12 24fb0: 0f 94 bd 0d call 0x21b7a ; 0x21b7a OCR4A = 255U; // Disable Output compare A interrupt and timer overflow interrupt TIMSK4 &= ~(_BV(OCIE4A) | _BV(TOIE4)); CRITICAL_SECTION_END; // Turn beeper off if it was on when noTone was called WRITE(BEEPER, 0); 24fb4: 9f b7 in r25, 0x3f ; 63 24fb6: f8 94 cli 24fb8: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24fbc: 8b 7f andi r24, 0xFB ; 251 24fbe: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 24fc2: 9f bf out 0x3f, r25 ; 63 _tone(BEEPER, tone_); _delay(ms); _noTone(BEEPER); } } } 24fc4: ff 90 pop r15 24fc6: ef 90 pop r14 24fc8: df 90 pop r13 24fca: cf 90 pop r12 24fcc: 08 95 ret void tone4(_UNUSED uint8_t _pin, uint16_t frequency) { //this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only uint8_t prescalarbits = 0b001; uint32_t pwm_freq = F_CPU / (2 * frequency); 24fce: 22 0f add r18, r18 24fd0: 33 1f adc r19, r19 24fd2: 50 e0 ldi r21, 0x00 ; 0 24fd4: 40 e0 ldi r20, 0x00 ; 0 24fd6: 60 e0 ldi r22, 0x00 ; 0 24fd8: 74 e2 ldi r23, 0x24 ; 36 24fda: 84 ef ldi r24, 0xF4 ; 244 24fdc: 90 e0 ldi r25, 0x00 ; 0 24fde: 0f 94 d1 a4 call 0x349a2 ; 0x349a2 <__divmodsi4> } void tone4(_UNUSED uint8_t _pin, uint16_t frequency) { //this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only uint8_t prescalarbits = 0b001; 24fe2: 91 e0 ldi r25, 0x01 ; 1 uint32_t pwm_freq = F_CPU / (2 * frequency); if (pwm_freq > UINT16_MAX) { 24fe4: 21 15 cp r18, r1 24fe6: 31 05 cpc r19, r1 24fe8: 81 e0 ldi r24, 0x01 ; 1 24fea: 48 07 cpc r20, r24 24fec: 51 05 cpc r21, r1 24fee: 44 f0 brlt .+16 ; 0x25000 pwm_freq /= 64; // Increase prescaler to 64 24ff0: 86 e0 ldi r24, 0x06 ; 6 24ff2: 56 95 lsr r21 24ff4: 47 95 ror r20 24ff6: 37 95 ror r19 24ff8: 27 95 ror r18 24ffa: 8a 95 dec r24 24ffc: d1 f7 brne .-12 ; 0x24ff2 prescalarbits = 0b011; 24ffe: 93 e0 ldi r25, 0x03 ; 3 } uint16_t ocr = pwm_freq - 1; 25000: 21 50 subi r18, 0x01 ; 1 25002: 31 09 sbc r19, r1 CRITICAL_SECTION_START; 25004: 4f b7 in r20, 0x3f ; 63 25006: f8 94 cli // Set calcualted prescaler TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; 25008: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 2500c: 88 7f andi r24, 0xF8 ; 248 2500e: 89 2b or r24, r25 25010: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> #ifdef EXTRUDER_0_AUTO_FAN_PIN // Scale the fan PWM duty cycle so that it remains constant, but at the tone frequency OCR4C = (OCR4C * ocr) / (uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U); 25014: 60 91 ac 00 lds r22, 0x00AC ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 25018: 70 91 ad 00 lds r23, 0x00AD ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2501c: 26 9f mul r18, r22 2501e: c0 01 movw r24, r0 25020: 27 9f mul r18, r23 25022: 90 0d add r25, r0 25024: 36 9f mul r19, r22 25026: 90 0d add r25, r0 25028: 11 24 eor r1, r1 2502a: 50 91 72 00 lds r21, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2502e: 6f ef ldi r22, 0xFF ; 255 25030: 70 e0 ldi r23, 0x00 ; 0 25032: 51 ff sbrs r21, 1 25034: 04 c0 rjmp .+8 ; 0x2503e 25036: 60 91 a8 00 lds r22, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 2503a: 70 91 a9 00 lds r23, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2503e: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 25042: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 25046: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> #endif //EXTRUDER_0_AUTO_FAN_PIN // Set calcualted ocr OCR4A = ocr; 2504a: 30 93 a9 00 sts 0x00A9, r19 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2504e: 20 93 a8 00 sts 0x00A8, r18 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> // Enable Output compare A interrupt and timer overflow interrupt TIMSK4 |= _BV(OCIE4A) | _BV(TOIE4); 25052: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 25056: 83 60 ori r24, 0x03 ; 3 25058: 80 93 72 00 sts 0x0072, r24 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 2505c: 4f bf out 0x3f, r20 ; 63 WRITE(BEEPER, HIGH); _delay(ms); WRITE(BEEPER, LOW); } else { _tone(BEEPER, tone_); _delay(ms); 2505e: c7 01 movw r24, r14 25060: b6 01 movw r22, r12 25062: 0f 94 bd 0d call 0x21b7a ; 0x21b7a } void noTone4(_UNUSED uint8_t _pin) { CRITICAL_SECTION_START; 25066: 2f b7 in r18, 0x3f ; 63 25068: f8 94 cli // Revert prescaler to CLK/1024 TCCR4B = (TCCR4B & 0b11111000) | _BV(CS42) | _BV(CS40); 2506a: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 2506e: 88 7f andi r24, 0xF8 ; 248 25070: 85 60 ori r24, 0x05 ; 5 25072: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> #ifdef EXTRUDER_0_AUTO_FAN_PIN // Scale the fan OCR back to the original value. OCR4C = (OCR4C * 255U) / (uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U); 25076: 40 91 ac 00 lds r20, 0x00AC ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 2507a: 50 91 ad 00 lds r21, 0x00AD ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2507e: 3f ef ldi r19, 0xFF ; 255 25080: 34 9f mul r19, r20 25082: c0 01 movw r24, r0 25084: 35 9f mul r19, r21 25086: 90 0d add r25, r0 25088: 11 24 eor r1, r1 2508a: 30 91 72 00 lds r19, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2508e: 6f ef ldi r22, 0xFF ; 255 25090: 70 e0 ldi r23, 0x00 ; 0 25092: 31 ff sbrs r19, 1 25094: 04 c0 rjmp .+8 ; 0x2509e 25096: 60 91 a8 00 lds r22, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 2509a: 70 91 a9 00 lds r23, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2509e: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 250a2: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 250a6: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> #endif //EXTRUDER_0_AUTO_FAN_PIN OCR4A = 255U; 250aa: 8f ef ldi r24, 0xFF ; 255 250ac: 90 e0 ldi r25, 0x00 ; 0 250ae: 90 93 a9 00 sts 0x00A9, r25 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 250b2: 80 93 a8 00 sts 0x00A8, r24 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> // Disable Output compare A interrupt and timer overflow interrupt TIMSK4 &= ~(_BV(OCIE4A) | _BV(TOIE4)); 250b6: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 250ba: 8c 7f andi r24, 0xFC ; 252 250bc: 80 93 72 00 sts 0x0072, r24 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 250c0: 2f bf out 0x3f, r18 ; 63 250c2: 78 cf rjmp .-272 ; 0x24fb4 000250c4 : /// Make sure to call sound_wait_for_user_reset() when the user has clicked the knob /// Loud - should continuously beep /// Silent - should be silent /// Once - should beep once /// Assist/Blind - as loud with beep and click on knob rotation and press void sound_wait_for_user() { 250c4: cf 93 push r28 #if BEEPER > 0 if (eSoundMode == e_SOUND_MODE_SILENT) return; 250c6: c0 91 47 04 lds r28, 0x0447 ; 0x800447 250ca: c2 30 cpi r28, 0x02 ; 2 250cc: 59 f1 breq .+86 ; 0x25124 // Handle case where only one beep is needed if (eSoundMode == e_SOUND_MODE_ONCE) { 250ce: c1 30 cpi r28, 0x01 ; 1 250d0: 69 f4 brne .+26 ; 0x250ec if (bFirst) return; 250d2: 80 91 c1 04 lds r24, 0x04C1 ; 0x8004c1 <_ZL6bFirst.lto_priv.500> 250d6: 81 11 cpse r24, r1 250d8: 25 c0 rjmp .+74 ; 0x25124 Sound_MakeCustom(80, 0, false); 250da: 40 e0 ldi r20, 0x00 ; 0 250dc: 70 e0 ldi r23, 0x00 ; 0 250de: 60 e0 ldi r22, 0x00 ; 0 250e0: 80 e5 ldi r24, 0x50 ; 80 250e2: 90 e0 ldi r25, 0x00 ; 0 250e4: 0f 94 be 27 call 0x24f7c ; 0x24f7c bFirst = true; 250e8: c0 93 c1 04 sts 0x04C1, r28 ; 0x8004c1 <_ZL6bFirst.lto_priv.500> } // Handle case where there should be continous beeps if (beep_timer.expired_cont(CONTINOUS_BEEP_PERIOD)) { 250ec: 60 ed ldi r22, 0xD0 ; 208 250ee: 77 e0 ldi r23, 0x07 ; 7 250f0: 8e eb ldi r24, 0xBE ; 190 250f2: 94 e0 ldi r25, 0x04 ; 4 250f4: 0f 94 47 0e call 0x21c8e ; 0x21c8e ::expired_cont(unsigned short)> 250f8: 88 23 and r24, r24 250fa: a1 f0 breq .+40 ; 0x25124 beep_timer.start(); 250fc: 8e eb ldi r24, 0xBE ; 190 250fe: 94 e0 ldi r25, 0x04 ; 4 25100: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> if (eSoundMode == e_SOUND_MODE_LOUD) { 25104: 80 91 47 04 lds r24, 0x0447 ; 0x800447 25108: 81 11 cpse r24, r1 2510a: 08 c0 rjmp .+16 ; 0x2511c Sound_MakeCustom(80, 0, false); 2510c: 40 e0 ldi r20, 0x00 ; 0 2510e: 70 e0 ldi r23, 0x00 ; 0 25110: 60 e0 ldi r22, 0x00 ; 0 25112: 80 e5 ldi r24, 0x50 ; 80 25114: 90 e0 ldi r25, 0x00 ; 0 // Assist (lower volume sound) Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); } } #endif // BEEPER > 0 } 25116: cf 91 pop r28 // Handle case where there should be continous beeps if (beep_timer.expired_cont(CONTINOUS_BEEP_PERIOD)) { beep_timer.start(); if (eSoundMode == e_SOUND_MODE_LOUD) { Sound_MakeCustom(80, 0, false); 25118: 0d 94 be 27 jmp 0x24f7c ; 0x24f7c } else { // Assist (lower volume sound) Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 2511c: 80 e0 ldi r24, 0x00 ; 0 } } #endif // BEEPER > 0 } 2511e: cf 91 pop r28 beep_timer.start(); if (eSoundMode == e_SOUND_MODE_LOUD) { Sound_MakeCustom(80, 0, false); } else { // Assist (lower volume sound) Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 25120: 0d 94 ad 25 jmp 0x24b5a ; 0x24b5a } } #endif // BEEPER > 0 } 25124: cf 91 pop r28 25126: 08 95 ret 00025128 : { #if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a)) #ifdef TMC2130_DEDGE_STEPPING PINC = (axes_mask & 0x0f); // toggle step signals by mask #else uint8_t portC = PORTC & 0xf0; 25128: 98 b1 in r25, 0x08 ; 8 2512a: 90 7f andi r25, 0xF0 ; 240 PORTC = portC | (axes_mask & 0x0f); //set step signals by mask 2512c: 89 2b or r24, r25 2512e: 88 b9 out 0x08, r24 ; 8 asm("nop"); 25130: 00 00 nop PORTC = portC; //set step signals to zero 25132: 98 b9 out 0x08, r25 ; 8 asm("nop"); 25134: 00 00 nop #endif #endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a)) } 25136: 08 95 ret 00025138 : sm4_calc_delay_cb_t sm4_calc_delay_cb = 0; void sm4_set_dir(uint8_t axis, uint8_t dir) { switch (axis) 25138: 82 30 cpi r24, 0x02 ; 2 2513a: b9 f0 breq .+46 ; 0x2516a 2513c: 83 30 cpi r24, 0x03 ; 3 2513e: e9 f0 breq .+58 ; 0x2517a 25140: 81 30 cpi r24, 0x01 ; 1 25142: 59 f0 breq .+22 ; 0x2515a { #if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3)) case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break; 25144: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 25148: 61 11 cpse r22, r1 2514a: 05 c0 rjmp .+10 ; 0x25156 2514c: 82 60 ori r24, 0x02 ; 2 case 1: if (dir == INVERT_Y_DIR) PORTL |= 1; else PORTL &= ~1; break; case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break; case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break; 2514e: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> case 1: if (dir == INVERT_Y_DIR) PORTL |= 2; else PORTL &= ~2; break; case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break; case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break; #endif } asm("nop"); 25152: 00 00 nop } 25154: 08 95 ret void sm4_set_dir(uint8_t axis, uint8_t dir) { switch (axis) { #if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3)) case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break; 25156: 8d 7f andi r24, 0xFD ; 253 25158: fa cf rjmp .-12 ; 0x2514e case 1: if (dir == INVERT_Y_DIR) PORTL |= 1; else PORTL &= ~1; break; 2515a: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2515e: 61 11 cpse r22, r1 25160: 02 c0 rjmp .+4 ; 0x25166 25162: 81 60 ori r24, 0x01 ; 1 25164: f4 cf rjmp .-24 ; 0x2514e 25166: 8e 7f andi r24, 0xFE ; 254 25168: f2 cf rjmp .-28 ; 0x2514e case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break; 2516a: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2516e: 61 11 cpse r22, r1 25170: 02 c0 rjmp .+4 ; 0x25176 25172: 84 60 ori r24, 0x04 ; 4 25174: ec cf rjmp .-40 ; 0x2514e 25176: 8b 7f andi r24, 0xFB ; 251 25178: ea cf rjmp .-44 ; 0x2514e case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break; 2517a: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2517e: 61 30 cpi r22, 0x01 ; 1 25180: 11 f4 brne .+4 ; 0x25186 25182: 80 64 ori r24, 0x40 ; 64 25184: e4 cf rjmp .-56 ; 0x2514e 25186: 8f 7b andi r24, 0xBF ; 191 25188: e2 cf rjmp .-60 ; 0x2514e 0002518a : buf[nbyte] = SPDR; } //------------------------------------------------------------------------------ /** SPI send a byte */ static void spiSend(uint8_t b) { SPDR = b; 2518a: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2518c: 0d b4 in r0, 0x2d ; 45 2518e: 07 fe sbrs r0, 7 25190: fd cf rjmp .-6 ; 0x2518c } 25192: 08 95 ret 00025194 : SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; } //------------------------------------------------------------------------------ /** SPI receive a byte */ static uint8_t spiRec() { SPDR = 0XFF; 25194: 8f ef ldi r24, 0xFF ; 255 25196: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 25198: 0d b4 in r0, 0x2d ; 45 2519a: 07 fe sbrs r0, 7 2519c: fd cf rjmp .-6 ; 0x25198 return SPDR; 2519e: 8e b5 in r24, 0x2e ; 46 } 251a0: 08 95 ret 000251a2 : } } #endif // SOFTWARE_SPI //------------------------------------------------------------------------------ // send command and return error code. Return zero for OK uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { 251a2: 8f 92 push r8 251a4: 9f 92 push r9 251a6: af 92 push r10 251a8: bf 92 push r11 251aa: ef 92 push r14 251ac: ff 92 push r15 251ae: 0f 93 push r16 251b0: 1f 93 push r17 251b2: cf 93 push r28 251b4: 7c 01 movw r14, r24 251b6: c6 2f mov r28, r22 251b8: 49 01 movw r8, r18 251ba: 5a 01 movw r10, r20 WRITE(SDSS, 1); } //------------------------------------------------------------------------------ void Sd2Card::chipSelectLow() { #ifndef SOFTWARE_SPI spiInit(spiRate_); 251bc: fc 01 movw r30, r24 251be: 91 81 ldd r25, Z+1 ; 0x01 * Initialize hardware SPI * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] */ static void spiInit(uint8_t spiRate) { // See avr processor documentation SPCR = (1 << SPE) | (1 << MSTR) | (spiRate >> 1); 251c0: 89 2f mov r24, r25 251c2: 80 6a ori r24, 0xA0 ; 160 251c4: 86 95 lsr r24 251c6: 8c bd out 0x2c, r24 ; 44 SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; 251c8: 90 fd sbrc r25, 0 251ca: 03 c0 rjmp .+6 ; 0x251d2 251cc: 81 e0 ldi r24, 0x01 ; 1 251ce: 96 30 cpi r25, 0x06 ; 6 251d0: 09 f4 brne .+2 ; 0x251d4 251d2: 80 e0 ldi r24, 0x00 ; 0 251d4: 8d bd out 0x2d, r24 ; 45 //------------------------------------------------------------------------------ void Sd2Card::chipSelectLow() { #ifndef SOFTWARE_SPI spiInit(spiRate_); #endif // SOFTWARE_SPI WRITE(SDSS, 0); 251d6: 28 98 cbi 0x05, 0 ; 5 uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { // select card chipSelectLow(); // wait up to 300 ms if busy waitNotBusy(300); 251d8: 8c e2 ldi r24, 0x2C ; 44 251da: 91 e0 ldi r25, 0x01 ; 1 251dc: 0f 94 de 65 call 0x2cbbc ; 0x2cbbc // send command spiSend(cmd | 0x40); 251e0: 8c 2f mov r24, r28 251e2: 80 64 ori r24, 0x40 ; 64 251e4: 0f 94 c5 28 call 0x2518a ; 0x2518a 251e8: 08 e1 ldi r16, 0x18 ; 24 251ea: 10 e0 ldi r17, 0x00 ; 0 // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); 251ec: d5 01 movw r26, r10 251ee: c4 01 movw r24, r8 251f0: 00 2e mov r0, r16 251f2: 04 c0 rjmp .+8 ; 0x251fc 251f4: b6 95 lsr r27 251f6: a7 95 ror r26 251f8: 97 95 ror r25 251fa: 87 95 ror r24 251fc: 0a 94 dec r0 251fe: d2 f7 brpl .-12 ; 0x251f4 25200: 0f 94 c5 28 call 0x2518a ; 0x2518a 25204: 08 50 subi r16, 0x08 ; 8 25206: 11 09 sbc r17, r1 25208: 08 3f cpi r16, 0xF8 ; 248 2520a: ff ef ldi r31, 0xFF ; 255 2520c: 1f 07 cpc r17, r31 2520e: 71 f7 brne .-36 ; 0x251ec // send CRC uint8_t crc = 0XFF; if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 25210: 85 e9 ldi r24, 0x95 ; 149 25212: cc 23 and r28, r28 25214: 21 f0 breq .+8 ; 0x2521e if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA 25216: 87 e8 ldi r24, 0x87 ; 135 25218: c8 30 cpi r28, 0x08 ; 8 2521a: 09 f0 breq .+2 ; 0x2521e // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); // send CRC uint8_t crc = 0XFF; 2521c: 8f ef ldi r24, 0xFF ; 255 if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA spiSend(crc); 2521e: 0f 94 c5 28 call 0x2518a ; 0x2518a // skip stuff byte for stop read if (cmd == CMD12) spiRec(); 25222: cc 30 cpi r28, 0x0C ; 12 25224: 11 f4 brne .+4 ; 0x2522a 25226: 0f 94 ca 28 call 0x25194 ; 0x25194 // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); // send CRC uint8_t crc = 0XFF; 2522a: c0 e0 ldi r28, 0x00 ; 0 // skip stuff byte for stop read if (cmd == CMD12) spiRec(); // wait for response for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++) { /* Intentionally left empty */ } 2522c: 0f 94 ca 28 call 0x25194 ; 0x25194 25230: f7 01 movw r30, r14 25232: 82 83 std Z+2, r24 ; 0x02 25234: 87 ff sbrs r24, 7 25236: 04 c0 rjmp .+8 ; 0x25240 25238: cf 3f cpi r28, 0xFF ; 255 2523a: 11 f0 breq .+4 ; 0x25240 2523c: cf 5f subi r28, 0xFF ; 255 2523e: f6 cf rjmp .-20 ; 0x2522c return status_; } 25240: cf 91 pop r28 25242: 1f 91 pop r17 25244: 0f 91 pop r16 25246: ff 90 pop r15 25248: ef 90 pop r14 2524a: bf 90 pop r11 2524c: af 90 pop r10 2524e: 9f 90 pop r9 25250: 8f 90 pop r8 25252: 08 95 ret 00025254 : * \param[in] blockNumber Logical block to be written. * \param[in] src Pointer to the location of the data to be written. * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { 25254: 0f 93 push r16 25256: 1f 93 push r17 25258: cf 93 push r28 2525a: df 93 push r29 2525c: ec 01 movw r28, r24 2525e: 89 01 movw r16, r18 // use address if not SDHC card if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; 25260: 8b 81 ldd r24, Y+3 ; 0x03 25262: 83 30 cpi r24, 0x03 ; 3 25264: 39 f0 breq .+14 ; 0x25274 25266: 89 e0 ldi r24, 0x09 ; 9 25268: 44 0f add r20, r20 2526a: 55 1f adc r21, r21 2526c: 66 1f adc r22, r22 2526e: 77 1f adc r23, r23 25270: 8a 95 dec r24 25272: d1 f7 brne .-12 ; 0x25268 if (cardCommand(CMD24, blockNumber)) { 25274: 9a 01 movw r18, r20 25276: ab 01 movw r20, r22 25278: 68 e1 ldi r22, 0x18 ; 24 2527a: ce 01 movw r24, r28 2527c: 0f 94 d1 28 call 0x251a2 ; 0x251a2 25280: 88 23 and r24, r24 25282: 19 f0 breq .+6 ; 0x2528a bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 25284: 86 e0 ldi r24, 0x06 ; 6 25286: 88 83 st Y, r24 25288: 39 c0 rjmp .+114 ; 0x252fc } //------------------------------------------------------------------------------ /** SPI send block - only one call so force inline */ static inline __attribute__((always_inline)) void spiSendBlock(uint8_t token, const uint8_t* buf) { SPDR = token; 2528a: 8e ef ldi r24, 0xFE ; 254 2528c: 8e bd out 0x2e, r24 ; 46 2528e: f8 01 movw r30, r16 25290: c8 01 movw r24, r16 25292: 9e 5f subi r25, 0xFE ; 254 for (uint16_t i = 0; i < 512; i += 2) { while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 25294: 0d b4 in r0, 0x2d ; 45 25296: 07 fe sbrs r0, 7 25298: fd cf rjmp .-6 ; 0x25294 SPDR = buf[i]; 2529a: 20 81 ld r18, Z 2529c: 2e bd out 0x2e, r18 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2529e: 0d b4 in r0, 0x2d ; 45 252a0: 07 fe sbrs r0, 7 252a2: fd cf rjmp .-6 ; 0x2529e SPDR = buf[i + 1]; 252a4: 21 81 ldd r18, Z+1 ; 0x01 252a6: 2e bd out 0x2e, r18 ; 46 252a8: 32 96 adiw r30, 0x02 ; 2 //------------------------------------------------------------------------------ /** SPI send block - only one call so force inline */ static inline __attribute__((always_inline)) void spiSendBlock(uint8_t token, const uint8_t* buf) { SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { 252aa: e8 17 cp r30, r24 252ac: f9 07 cpc r31, r25 252ae: 91 f7 brne .-28 ; 0x25294 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } SPDR = buf[i]; while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } SPDR = buf[i + 1]; } while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 252b0: 0d b4 in r0, 0x2d ; 45 252b2: 07 fe sbrs r0, 7 252b4: fd cf rjmp .-6 ; 0x252b0 //------------------------------------------------------------------------------ // send one block of data for write block or write multiple blocks bool Sd2Card::writeData(uint8_t token, const uint8_t* src) { spiSendBlock(token, src); spiSend(0xff); // dummy crc 252b6: 8f ef ldi r24, 0xFF ; 255 252b8: 0f 94 c5 28 call 0x2518a ; 0x2518a spiSend(0xff); // dummy crc 252bc: 8f ef ldi r24, 0xFF ; 255 252be: 0f 94 c5 28 call 0x2518a ; 0x2518a status_ = spiRec(); 252c2: 0f 94 ca 28 call 0x25194 ; 0x25194 252c6: 8a 83 std Y+2, r24 ; 0x02 if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { 252c8: 8f 71 andi r24, 0x1F ; 31 252ca: 85 30 cpi r24, 0x05 ; 5 252cc: 99 f4 brne .+38 ; 0x252f4 goto fail; } if (!writeData(DATA_START_BLOCK, src)) goto fail; // wait for flash programming to complete if (!waitNotBusy(SD_WRITE_TIMEOUT)) { 252ce: 88 e5 ldi r24, 0x58 ; 88 252d0: 92 e0 ldi r25, 0x02 ; 2 252d2: 0f 94 de 65 call 0x2cbbc ; 0x2cbbc 252d6: 18 2f mov r17, r24 252d8: 87 e1 ldi r24, 0x17 ; 23 252da: 11 23 and r17, r17 252dc: a1 f2 breq .-88 ; 0x25286 error(SD_CARD_ERROR_WRITE_TIMEOUT); goto fail; } // response is r2 so get and check two bytes for nonzero if (cardCommand(CMD13, 0) || spiRec()) { 252de: 20 e0 ldi r18, 0x00 ; 0 252e0: 30 e0 ldi r19, 0x00 ; 0 252e2: a9 01 movw r20, r18 252e4: 6d e0 ldi r22, 0x0D ; 13 252e6: ce 01 movw r24, r28 252e8: 0f 94 d1 28 call 0x251a2 ; 0x251a2 252ec: 88 23 and r24, r24 252ee: 51 f0 breq .+20 ; 0x25304 252f0: 86 e1 ldi r24, 0x16 ; 22 252f2: c9 cf rjmp .-110 ; 0x25286 252f4: 83 e1 ldi r24, 0x13 ; 19 252f6: 88 83 st Y, r24 goto fail; } return true; fail: chipSelectHigh(); 252f8: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 } chipSelectHigh(); return true; fail: chipSelectHigh(); 252fc: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 return false; 25300: 10 e0 ldi r17, 0x00 ; 0 25302: 06 c0 rjmp .+12 ; 0x25310 if (!waitNotBusy(SD_WRITE_TIMEOUT)) { error(SD_CARD_ERROR_WRITE_TIMEOUT); goto fail; } // response is r2 so get and check two bytes for nonzero if (cardCommand(CMD13, 0) || spiRec()) { 25304: 0f 94 ca 28 call 0x25194 ; 0x25194 25308: 81 11 cpse r24, r1 2530a: f2 cf rjmp .-28 ; 0x252f0 error(SD_CARD_ERROR_WRITE_PROGRAMMING); goto fail; } chipSelectHigh(); 2530c: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 return true; fail: chipSelectHigh(); return false; } 25310: 81 2f mov r24, r17 25312: df 91 pop r29 25314: cf 91 pop r28 25316: 1f 91 pop r17 25318: 0f 91 pop r16 2531a: 08 95 ret 0002531c : fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheFlush() { 2531c: cf 93 push r28 if (cacheDirty_) { 2531e: 80 91 42 0e lds r24, 0x0E42 ; 0x800e42 } cacheMirrorBlock_ = 0; } cacheDirty_ = 0; } return true; 25322: c1 e0 ldi r28, 0x01 ; 1 fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheFlush() { if (cacheDirty_) { 25324: 88 23 and r24, r24 25326: a1 f0 breq .+40 ; 0x25350 if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { 25328: 40 91 3a 0e lds r20, 0x0E3A ; 0x800e3a 2532c: 50 91 3b 0e lds r21, 0x0E3B ; 0x800e3b 25330: 60 91 3c 0e lds r22, 0x0E3C ; 0x800e3c 25334: 70 91 3d 0e lds r23, 0x0E3D ; 0x800e3d 25338: 26 e4 ldi r18, 0x46 ; 70 2533a: 3e e0 ldi r19, 0x0E ; 14 2533c: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 25340: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 25344: 0f 94 2a 29 call 0x25254 ; 0x25254 25348: c8 2f mov r28, r24 2534a: 81 11 cpse r24, r1 2534c: 04 c0 rjmp .+8 ; 0x25356 cacheDirty_ = 0; } return true; fail: return false; 2534e: c0 e0 ldi r28, 0x00 ; 0 } 25350: 8c 2f mov r24, r28 25352: cf 91 pop r28 25354: 08 95 ret if (cacheDirty_) { if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { goto fail; } // mirror FAT tables if (cacheMirrorBlock_) { 25356: 40 91 3e 0e lds r20, 0x0E3E ; 0x800e3e 2535a: 50 91 3f 0e lds r21, 0x0E3F ; 0x800e3f 2535e: 60 91 40 0e lds r22, 0x0E40 ; 0x800e40 25362: 70 91 41 0e lds r23, 0x0E41 ; 0x800e41 25366: 41 15 cp r20, r1 25368: 51 05 cpc r21, r1 2536a: 61 05 cpc r22, r1 2536c: 71 05 cpc r23, r1 2536e: 91 f0 breq .+36 ; 0x25394 if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { 25370: 26 e4 ldi r18, 0x46 ; 70 25372: 3e e0 ldi r19, 0x0E ; 14 25374: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 25378: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 2537c: 0f 94 2a 29 call 0x25254 ; 0x25254 25380: 88 23 and r24, r24 25382: 29 f3 breq .-54 ; 0x2534e goto fail; } cacheMirrorBlock_ = 0; 25384: 10 92 3e 0e sts 0x0E3E, r1 ; 0x800e3e 25388: 10 92 3f 0e sts 0x0E3F, r1 ; 0x800e3f 2538c: 10 92 40 0e sts 0x0E40, r1 ; 0x800e40 25390: 10 92 41 0e sts 0x0E41, r1 ; 0x800e41 } cacheDirty_ = 0; 25394: 10 92 42 0e sts 0x0E42, r1 ; 0x800e42 25398: db cf rjmp .-74 ; 0x25350 0002539a : * \param[in] blockNumber Logical block to be read. * \param[out] dst Pointer to the location that will receive the data. * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { 2539a: 2f 92 push r2 2539c: 3f 92 push r3 2539e: 4f 92 push r4 253a0: 5f 92 push r5 253a2: 6f 92 push r6 253a4: 7f 92 push r7 253a6: 8f 92 push r8 253a8: 9f 92 push r9 253aa: af 92 push r10 253ac: bf 92 push r11 253ae: cf 92 push r12 253b0: df 92 push r13 253b2: ef 92 push r14 253b4: ff 92 push r15 253b6: 0f 93 push r16 253b8: 1f 93 push r17 253ba: cf 93 push r28 253bc: df 93 push r29 253be: ec 01 movw r28, r24 253c0: 2a 01 movw r4, r20 253c2: 3b 01 movw r6, r22 253c4: 69 01 movw r12, r18 #ifdef SD_CHECK_AND_RETRY uint8_t retryCnt = 3; // use address if not SDHC card if (type()!= SD_CARD_TYPE_SDHC) blockNumber <<= 9; 253c6: 8b 81 ldd r24, Y+3 ; 0x03 253c8: 83 30 cpi r24, 0x03 ; 3 253ca: 39 f0 breq .+14 ; 0x253da 253cc: 69 e0 ldi r22, 0x09 ; 9 253ce: 44 0c add r4, r4 253d0: 55 1c adc r5, r5 253d2: 66 1c adc r6, r6 253d4: 77 1c adc r7, r7 253d6: 6a 95 dec r22 253d8: d1 f7 brne .-12 ; 0x253ce retry2: 253da: 43 e0 ldi r20, 0x03 ; 3 253dc: 94 2e mov r9, r20 253de: 56 01 movw r10, r12 253e0: 81 e0 ldi r24, 0x01 ; 1 253e2: a8 1a sub r10, r24 253e4: 8e ef ldi r24, 0xFE ; 254 253e6: b8 0a sbc r11, r24 253e8: 16 01 movw r2, r12 253ea: ee ef ldi r30, 0xFE ; 254 253ec: 3e 1a sub r3, r30 253ee: 54 e0 ldi r21, 0x04 ; 4 253f0: 85 2e mov r8, r21 retryCnt --; 253f2: 9a 94 dec r9 if (cardCommand(CMD17, blockNumber)) { 253f4: a3 01 movw r20, r6 253f6: 92 01 movw r18, r4 253f8: 61 e1 ldi r22, 0x11 ; 17 253fa: ce 01 movw r24, r28 253fc: 0f 94 d1 28 call 0x251a2 ; 0x251a2 25400: 88 23 and r24, r24 25402: 79 f0 breq .+30 ; 0x25422 25404: 88 82 st Y, r8 error(SD_CARD_ERROR_CMD17); if (retryCnt > 0) goto retry; 25406: 99 20 and r9, r9 25408: 09 f4 brne .+2 ; 0x2540c 2540a: 7a c0 rjmp .+244 ; 0x25500 if (retryCnt > 0) goto retry; goto fail; } return true; retry: chipSelectHigh(); 2540c: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 cardCommand(CMD12, 0);//Try sending a stop command, but ignore the result. 25410: 20 e0 ldi r18, 0x00 ; 0 25412: 30 e0 ldi r19, 0x00 ; 0 25414: a9 01 movw r20, r18 25416: 6c e0 ldi r22, 0x0C ; 12 25418: ce 01 movw r24, r28 2541a: 0f 94 d1 28 call 0x251a2 ; 0x251a2 errorCode_ = 0; 2541e: 18 82 st Y, r1 25420: e8 cf rjmp .-48 ; 0x253f2 #endif //------------------------------------------------------------------------------ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { // wait for start block token uint16_t t0 = _millis(); 25422: 0f 94 f0 0d call 0x21be0 ; 0x21be0 25426: 8b 01 movw r16, r22 while ((status_ = spiRec()) == 0XFF) { 25428: 0f 94 ca 28 call 0x25194 ; 0x25194 2542c: 8a 83 std Y+2, r24 ; 0x02 2542e: 8f 3f cpi r24, 0xFF ; 255 25430: 91 f4 brne .+36 ; 0x25456 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { 25432: 0f 94 f0 0d call 0x21be0 ; 0x21be0 25436: 60 1b sub r22, r16 25438: 71 0b sbc r23, r17 2543a: 6d 32 cpi r22, 0x2D ; 45 2543c: 71 40 sbci r23, 0x01 ; 1 2543e: a0 f3 brcs .-24 ; 0x25428 25440: 81 e1 ldi r24, 0x11 ; 17 25442: 88 83 st Y, r24 if (flash_air_compatible_) spiSend(0XFF); return true; fail: chipSelectHigh(); 25444: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 // Toshiba FlashAir Patch. Purge pending status byte. if (flash_air_compatible_) 25448: 8c 81 ldd r24, Y+4 ; 0x04 2544a: 88 23 and r24, r24 2544c: e1 f2 breq .-72 ; 0x25406 spiSend(0XFF); 2544e: 8f ef ldi r24, 0xFF ; 255 25450: 0f 94 c5 28 call 0x2518a ; 0x2518a 25454: d8 cf rjmp .-80 ; 0x25406 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto fail; } } if (status_ != DATA_START_BLOCK) { 25456: 8e 3f cpi r24, 0xFE ; 254 25458: 11 f0 breq .+4 ; 0x2545e 2545a: 8f e0 ldi r24, 0x0F ; 15 2545c: f2 cf rjmp .-28 ; 0x25442 //------------------------------------------------------------------------------ /** SPI read data - only one call so force inline */ static inline __attribute__((always_inline)) void spiRead(uint8_t* buf, uint16_t nbyte) { if (nbyte-- == 0) return; SPDR = 0XFF; 2545e: 8f ef ldi r24, 0xFF ; 255 25460: 8e bd out 0x2e, r24 ; 46 25462: d6 01 movw r26, r12 25464: f6 01 movw r30, r12 for (uint16_t i = 0; i < nbyte; i++) { while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 25466: 0d b4 in r0, 0x2d ; 45 25468: 07 fe sbrs r0, 7 2546a: fd cf rjmp .-6 ; 0x25466 buf[i] = SPDR; 2546c: 9e b5 in r25, 0x2e ; 46 2546e: 91 93 st Z+, r25 SPDR = 0XFF; 25470: 8e bd out 0x2e, r24 ; 46 /** SPI read data - only one call so force inline */ static inline __attribute__((always_inline)) void spiRead(uint8_t* buf, uint16_t nbyte) { if (nbyte-- == 0) return; SPDR = 0XFF; for (uint16_t i = 0; i < nbyte; i++) { 25472: ea 15 cp r30, r10 25474: fb 05 cpc r31, r11 25476: b9 f7 brne .-18 ; 0x25466 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } buf[i] = SPDR; SPDR = 0XFF; } while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 25478: 0d b4 in r0, 0x2d ; 45 2547a: 07 fe sbrs r0, 7 2547c: fd cf rjmp .-6 ; 0x25478 buf[nbyte] = SPDR; 2547e: 8e b5 in r24, 0x2e ; 46 25480: f5 01 movw r30, r10 25482: 80 83 st Z, r24 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { uint16_t crc = 0; 25484: f1 2c mov r15, r1 25486: e1 2c mov r14, r1 for (size_t i = 0; i < n; i++) { crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0XFF]) ^ (crc << 8); 25488: 8d 91 ld r24, X+ 2548a: ef 2d mov r30, r15 2548c: ff 27 eor r31, r31 2548e: e8 27 eor r30, r24 25490: ee 0f add r30, r30 25492: ff 1f adc r31, r31 25494: e5 57 subi r30, 0x75 ; 117 25496: f6 47 sbci r31, 0x76 ; 118 25498: 85 91 lpm r24, Z+ 2549a: 94 91 lpm r25, Z 2549c: fe 2c mov r15, r14 2549e: ee 24 eor r14, r14 254a0: e8 26 eor r14, r24 254a2: f9 26 eor r15, r25 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { 254a4: 2a 16 cp r2, r26 254a6: 3b 06 cpc r3, r27 254a8: 79 f7 brne .-34 ; 0x25488 spiRead(dst, count); #ifdef SD_CHECK_AND_RETRY { uint16_t calcCrc = CRC_CCITT(dst, count); uint16_t recvCrc = spiRec() << 8; 254aa: 0f 94 ca 28 call 0x25194 ; 0x25194 254ae: 08 2f mov r16, r24 254b0: 10 e0 ldi r17, 0x00 ; 0 254b2: 10 2f mov r17, r16 254b4: 00 27 eor r16, r16 recvCrc |= spiRec(); 254b6: 0f 94 ca 28 call 0x25194 ; 0x25194 254ba: 08 2b or r16, r24 if (calcCrc != recvCrc) 254bc: 0e 15 cp r16, r14 254be: 1f 05 cpc r17, r15 254c0: 19 f0 breq .+6 ; 0x254c8 254c2: f0 e2 ldi r31, 0x20 ; 32 254c4: f8 83 st Y, r31 254c6: be cf rjmp .-132 ; 0x25444 #else // discard CRC spiRec(); spiRec(); #endif chipSelectHigh(); 254c8: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 // Toshiba FlashAir Patch. Purge pending status byte. if (flash_air_compatible_) 254cc: cc 81 ldd r28, Y+4 ; 0x04 254ce: cc 23 and r28, r28 254d0: d9 f0 breq .+54 ; 0x25508 spiSend(0XFF); 254d2: 8f ef ldi r24, 0xFF ; 255 254d4: 0f 94 c5 28 call 0x2518a ; 0x2518a #endif fail: chipSelectHigh(); return false; } 254d8: 8c 2f mov r24, r28 254da: df 91 pop r29 254dc: cf 91 pop r28 254de: 1f 91 pop r17 254e0: 0f 91 pop r16 254e2: ff 90 pop r15 254e4: ef 90 pop r14 254e6: df 90 pop r13 254e8: cf 90 pop r12 254ea: bf 90 pop r11 254ec: af 90 pop r10 254ee: 9f 90 pop r9 254f0: 8f 90 pop r8 254f2: 7f 90 pop r7 254f4: 6f 90 pop r6 254f6: 5f 90 pop r5 254f8: 4f 90 pop r4 254fa: 3f 90 pop r3 254fc: 2f 90 pop r2 254fe: 08 95 ret } return readData(dst, 512); #endif fail: chipSelectHigh(); 25500: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 return false; 25504: c0 e0 ldi r28, 0x00 ; 0 25506: e8 cf rjmp .-48 ; 0x254d8 if (!readData(dst, 512)) { if (retryCnt > 0) goto retry; goto fail; } return true; 25508: c1 e0 ldi r28, 0x01 ; 1 2550a: e6 cf rjmp .-52 ; 0x254d8 0002550c : fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { 2550c: cf 92 push r12 2550e: df 92 push r13 25510: ef 92 push r14 25512: ff 92 push r15 25514: cf 93 push r28 25516: 6b 01 movw r12, r22 25518: 7c 01 movw r14, r24 2551a: c4 2f mov r28, r20 if (cacheBlockNumber_ != blockNumber) { 2551c: 80 91 3a 0e lds r24, 0x0E3A ; 0x800e3a 25520: 90 91 3b 0e lds r25, 0x0E3B ; 0x800e3b 25524: a0 91 3c 0e lds r26, 0x0E3C ; 0x800e3c 25528: b0 91 3d 0e lds r27, 0x0E3D ; 0x800e3d 2552c: 8c 15 cp r24, r12 2552e: 9d 05 cpc r25, r13 25530: ae 05 cpc r26, r14 25532: bf 05 cpc r27, r15 25534: 01 f1 breq .+64 ; 0x25576 if (!cacheFlush()) goto fail; 25536: 0f 94 8e 29 call 0x2531c ; 0x2531c 2553a: 81 11 cpse r24, r1 2553c: 08 c0 rjmp .+16 ; 0x2554e } if (dirty) cacheDirty_ = true; return true; fail: return false; 2553e: c0 e0 ldi r28, 0x00 ; 0 } 25540: 8c 2f mov r24, r28 25542: cf 91 pop r28 25544: ff 90 pop r15 25546: ef 90 pop r14 25548: df 90 pop r13 2554a: cf 90 pop r12 2554c: 08 95 ret } //------------------------------------------------------------------------------ bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { if (cacheBlockNumber_ != blockNumber) { if (!cacheFlush()) goto fail; if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) goto fail; 2554e: 26 e4 ldi r18, 0x46 ; 70 25550: 3e e0 ldi r19, 0x0E ; 14 25552: b7 01 movw r22, r14 25554: a6 01 movw r20, r12 25556: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 2555a: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 2555e: 0f 94 cd 29 call 0x2539a ; 0x2539a 25562: 88 23 and r24, r24 25564: 61 f3 breq .-40 ; 0x2553e cacheBlockNumber_ = blockNumber; 25566: c0 92 3a 0e sts 0x0E3A, r12 ; 0x800e3a 2556a: d0 92 3b 0e sts 0x0E3B, r13 ; 0x800e3b 2556e: e0 92 3c 0e sts 0x0E3C, r14 ; 0x800e3c 25572: f0 92 3d 0e sts 0x0E3D, r15 ; 0x800e3d } if (dirty) cacheDirty_ = true; 25576: cc 23 and r28, r28 25578: 21 f0 breq .+8 ; 0x25582 2557a: 81 e0 ldi r24, 0x01 ; 1 2557c: 80 93 42 0e sts 0x0E42, r24 ; 0x800e42 25580: df cf rjmp .-66 ; 0x25540 return true; 25582: c1 e0 ldi r28, 0x01 ; 1 25584: dd cf rjmp .-70 ; 0x25540 00025586 : fail: return false; } //------------------------------------------------------------------------------ // Store a FAT entry bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { 25586: 4f 92 push r4 25588: 5f 92 push r5 2558a: 6f 92 push r6 2558c: 7f 92 push r7 2558e: 8f 92 push r8 25590: 9f 92 push r9 25592: af 92 push r10 25594: bf 92 push r11 25596: cf 92 push r12 25598: df 92 push r13 2559a: ef 92 push r14 2559c: ff 92 push r15 2559e: 0f 93 push r16 255a0: 1f 93 push r17 255a2: cf 93 push r28 255a4: df 93 push r29 255a6: ec 01 movw r28, r24 uint32_t lba; // error if reserved cluster if (cluster < 2) goto fail; 255a8: 42 30 cpi r20, 0x02 ; 2 255aa: 51 05 cpc r21, r1 255ac: 61 05 cpc r22, r1 255ae: 71 05 cpc r23, r1 255b0: 90 f4 brcc .+36 ; 0x255d6 // mirror second FAT if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; return true; fail: return false; 255b2: 80 e0 ldi r24, 0x00 ; 0 } 255b4: df 91 pop r29 255b6: cf 91 pop r28 255b8: 1f 91 pop r17 255ba: 0f 91 pop r16 255bc: ff 90 pop r15 255be: ef 90 pop r14 255c0: df 90 pop r13 255c2: cf 90 pop r12 255c4: bf 90 pop r11 255c6: af 90 pop r10 255c8: 9f 90 pop r9 255ca: 8f 90 pop r8 255cc: 7f 90 pop r7 255ce: 6f 90 pop r6 255d0: 5f 90 pop r5 255d2: 4f 90 pop r4 255d4: 08 95 ret uint32_t lba; // error if reserved cluster if (cluster < 2) goto fail; // error if not in FAT if (cluster > (clusterCount_ + 1)) goto fail; 255d6: 89 85 ldd r24, Y+9 ; 0x09 255d8: 9a 85 ldd r25, Y+10 ; 0x0a 255da: ab 85 ldd r26, Y+11 ; 0x0b 255dc: bc 85 ldd r27, Y+12 ; 0x0c 255de: 01 96 adiw r24, 0x01 ; 1 255e0: a1 1d adc r26, r1 255e2: b1 1d adc r27, r1 255e4: 84 17 cp r24, r20 255e6: 95 07 cpc r25, r21 255e8: a6 07 cpc r26, r22 255ea: b7 07 cpc r27, r23 255ec: 10 f3 brcs .-60 ; 0x255b2 tmp = ((cacheBuffer_.data[index] & 0XF0)) | tmp >> 4; } cacheBuffer_.data[index] = tmp; return true; } if (fatType_ == 16) { 255ee: 8f 89 ldd r24, Y+23 ; 0x17 255f0: 80 31 cpi r24, 0x10 ; 16 255f2: c9 f5 brne .+114 ; 0x25666 lba = fatStartBlock_ + (cluster >> 8); 255f4: 85 2e mov r8, r21 255f6: 96 2e mov r9, r22 255f8: a7 2e mov r10, r23 255fa: bb 24 eor r11, r11 255fc: 8b 89 ldd r24, Y+19 ; 0x13 255fe: 9c 89 ldd r25, Y+20 ; 0x14 25600: ad 89 ldd r26, Y+21 ; 0x15 25602: be 89 ldd r27, Y+22 ; 0x16 } else if (fatType_ == 32) { lba = fatStartBlock_ + (cluster >> 7); 25604: 88 0e add r8, r24 25606: 99 1e adc r9, r25 25608: aa 1e adc r10, r26 2560a: bb 1e adc r11, r27 2560c: 28 01 movw r4, r16 2560e: 39 01 movw r6, r18 25610: 6a 01 movw r12, r20 25612: 7b 01 movw r14, r22 } else { goto fail; } if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; 25614: 41 e0 ldi r20, 0x01 ; 1 25616: c5 01 movw r24, r10 25618: b4 01 movw r22, r8 2561a: 0f 94 86 2a call 0x2550c ; 0x2550c 2561e: 88 23 and r24, r24 25620: 41 f2 breq .-112 ; 0x255b2 // store entry if (fatType_ == 16) { 25622: 9f 89 ldd r25, Y+23 ; 0x17 25624: 90 31 cpi r25, 0x10 ; 16 25626: 81 f5 brne .+96 ; 0x25688 cacheBuffer_.fat16[cluster & 0XFF] = value; 25628: dd 24 eor r13, r13 2562a: ee 24 eor r14, r14 2562c: ff 24 eor r15, r15 2562e: f6 01 movw r30, r12 25630: ee 0f add r30, r30 25632: ff 1f adc r31, r31 25634: ea 5b subi r30, 0xBA ; 186 25636: f1 4f sbci r31, 0xF1 ; 241 25638: 11 83 std Z+1, r17 ; 0x01 2563a: 00 83 st Z, r16 } else { cacheBuffer_.fat32[cluster & 0X7F] = value; } // mirror second FAT if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; 2563c: 9a 89 ldd r25, Y+18 ; 0x12 2563e: 92 30 cpi r25, 0x02 ; 2 25640: 08 f4 brcc .+2 ; 0x25644 25642: b8 cf rjmp .-144 ; 0x255b4 25644: 4d 81 ldd r20, Y+5 ; 0x05 25646: 5e 81 ldd r21, Y+6 ; 0x06 25648: 6f 81 ldd r22, Y+7 ; 0x07 2564a: 78 85 ldd r23, Y+8 ; 0x08 2564c: 84 0e add r8, r20 2564e: 95 1e adc r9, r21 25650: a6 1e adc r10, r22 25652: b7 1e adc r11, r23 25654: 80 92 3e 0e sts 0x0E3E, r8 ; 0x800e3e 25658: 90 92 3f 0e sts 0x0E3F, r9 ; 0x800e3f 2565c: a0 92 40 0e sts 0x0E40, r10 ; 0x800e40 25660: b0 92 41 0e sts 0x0E41, r11 ; 0x800e41 25664: a7 cf rjmp .-178 ; 0x255b4 cacheBuffer_.data[index] = tmp; return true; } if (fatType_ == 16) { lba = fatStartBlock_ + (cluster >> 8); } else if (fatType_ == 32) { 25666: 80 32 cpi r24, 0x20 ; 32 25668: 09 f0 breq .+2 ; 0x2566c 2566a: a3 cf rjmp .-186 ; 0x255b2 lba = fatStartBlock_ + (cluster >> 7); 2566c: 8b 89 ldd r24, Y+19 ; 0x13 2566e: 9c 89 ldd r25, Y+20 ; 0x14 25670: ad 89 ldd r26, Y+21 ; 0x15 25672: be 89 ldd r27, Y+22 ; 0x16 25674: 4a 01 movw r8, r20 25676: 5b 01 movw r10, r22 25678: e7 e0 ldi r30, 0x07 ; 7 2567a: b6 94 lsr r11 2567c: a7 94 ror r10 2567e: 97 94 ror r9 25680: 87 94 ror r8 25682: ea 95 dec r30 25684: d1 f7 brne .-12 ; 0x2567a 25686: be cf rjmp .-132 ; 0x25604 if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; // store entry if (fatType_ == 16) { cacheBuffer_.fat16[cluster & 0XFF] = value; } else { cacheBuffer_.fat32[cluster & 0X7F] = value; 25688: e8 94 clt 2568a: c7 f8 bld r12, 7 2568c: dd 24 eor r13, r13 2568e: ee 24 eor r14, r14 25690: ff 24 eor r15, r15 25692: f6 01 movw r30, r12 25694: ee 0f add r30, r30 25696: ff 1f adc r31, r31 25698: ee 0f add r30, r30 2569a: ff 1f adc r31, r31 2569c: ea 5b subi r30, 0xBA ; 186 2569e: f1 4f sbci r31, 0xF1 ; 241 256a0: 40 82 st Z, r4 256a2: 51 82 std Z+1, r5 ; 0x01 256a4: 62 82 std Z+2, r6 ; 0x02 256a6: 73 82 std Z+3, r7 ; 0x03 256a8: c9 cf rjmp .-110 ; 0x2563c 000256aa : fail: return false; } //------------------------------------------------------------------------------ // Fetch a FAT entry bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { 256aa: cf 92 push r12 256ac: df 92 push r13 256ae: ef 92 push r14 256b0: ff 92 push r15 256b2: 0f 93 push r16 256b4: 1f 93 push r17 256b6: cf 93 push r28 256b8: df 93 push r29 256ba: fc 01 movw r30, r24 uint32_t lba; if (cluster > (clusterCount_ + 1)) goto fail; 256bc: 81 85 ldd r24, Z+9 ; 0x09 256be: 92 85 ldd r25, Z+10 ; 0x0a 256c0: a3 85 ldd r26, Z+11 ; 0x0b 256c2: b4 85 ldd r27, Z+12 ; 0x0c 256c4: 01 96 adiw r24, 0x01 ; 1 256c6: a1 1d adc r26, r1 256c8: b1 1d adc r27, r1 256ca: 84 17 cp r24, r20 256cc: 95 07 cpc r25, r21 256ce: a6 07 cpc r26, r22 256d0: b7 07 cpc r27, r23 256d2: 50 f4 brcc .+20 ; 0x256e8 *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; } return true; fail: return false; 256d4: 80 e0 ldi r24, 0x00 ; 0 } 256d6: df 91 pop r29 256d8: cf 91 pop r28 256da: 1f 91 pop r17 256dc: 0f 91 pop r16 256de: ff 90 pop r15 256e0: ef 90 pop r14 256e2: df 90 pop r13 256e4: cf 90 pop r12 256e6: 08 95 ret } tmp |= cacheBuffer_.data[index] << 8; *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; return true; } if (fatType_ == 16) { 256e8: 87 89 ldd r24, Z+23 ; 0x17 256ea: 80 31 cpi r24, 0x10 ; 16 256ec: a9 f5 brne .+106 ; 0x25758 lba = fatStartBlock_ + (cluster >> 8); 256ee: bb 27 eor r27, r27 256f0: a7 2f mov r26, r23 256f2: 96 2f mov r25, r22 256f4: 85 2f mov r24, r21 256f6: c3 88 ldd r12, Z+19 ; 0x13 256f8: d4 88 ldd r13, Z+20 ; 0x14 256fa: e5 88 ldd r14, Z+21 ; 0x15 256fc: f6 88 ldd r15, Z+22 ; 0x16 } else if (fatType_ == 32) { lba = fatStartBlock_ + (cluster >> 7); 256fe: 8c 0d add r24, r12 25700: 9d 1d adc r25, r13 25702: ae 1d adc r26, r14 25704: bf 1d adc r27, r15 25706: e9 01 movw r28, r18 25708: 6a 01 movw r12, r20 2570a: 7b 01 movw r14, r22 2570c: 8f 01 movw r16, r30 } else { goto fail; } if (lba != cacheBlockNumber_) { 2570e: 40 91 3a 0e lds r20, 0x0E3A ; 0x800e3a 25712: 50 91 3b 0e lds r21, 0x0E3B ; 0x800e3b 25716: 60 91 3c 0e lds r22, 0x0E3C ; 0x800e3c 2571a: 70 91 3d 0e lds r23, 0x0E3D ; 0x800e3d 2571e: 84 17 cp r24, r20 25720: 95 07 cpc r25, r21 25722: a6 07 cpc r26, r22 25724: b7 07 cpc r27, r23 25726: 49 f5 brne .+82 ; 0x2577a if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; } if (fatType_ == 16) { 25728: f8 01 movw r30, r16 2572a: 87 89 ldd r24, Z+23 ; 0x17 2572c: 80 31 cpi r24, 0x10 ; 16 2572e: 69 f5 brne .+90 ; 0x2578a *value = cacheBuffer_.fat16[cluster & 0XFF]; 25730: b7 01 movw r22, r14 25732: a6 01 movw r20, r12 25734: 55 27 eor r21, r21 25736: 66 27 eor r22, r22 25738: 77 27 eor r23, r23 2573a: 44 0f add r20, r20 2573c: 55 1f adc r21, r21 2573e: 4a 5b subi r20, 0xBA ; 186 25740: 51 4f sbci r21, 0xF1 ; 241 25742: fa 01 movw r30, r20 25744: 80 81 ld r24, Z 25746: 91 81 ldd r25, Z+1 ; 0x01 25748: b0 e0 ldi r27, 0x00 ; 0 2574a: a0 e0 ldi r26, 0x00 ; 0 } else { *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; 2574c: 88 83 st Y, r24 2574e: 99 83 std Y+1, r25 ; 0x01 25750: aa 83 std Y+2, r26 ; 0x02 25752: bb 83 std Y+3, r27 ; 0x03 25754: 81 e0 ldi r24, 0x01 ; 1 25756: bf cf rjmp .-130 ; 0x256d6 *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; return true; } if (fatType_ == 16) { lba = fatStartBlock_ + (cluster >> 8); } else if (fatType_ == 32) { 25758: 80 32 cpi r24, 0x20 ; 32 2575a: 09 f0 breq .+2 ; 0x2575e 2575c: bb cf rjmp .-138 ; 0x256d4 lba = fatStartBlock_ + (cluster >> 7); 2575e: c3 88 ldd r12, Z+19 ; 0x13 25760: d4 88 ldd r13, Z+20 ; 0x14 25762: e5 88 ldd r14, Z+21 ; 0x15 25764: f6 88 ldd r15, Z+22 ; 0x16 25766: db 01 movw r26, r22 25768: ca 01 movw r24, r20 2576a: c7 e0 ldi r28, 0x07 ; 7 2576c: b6 95 lsr r27 2576e: a7 95 ror r26 25770: 97 95 ror r25 25772: 87 95 ror r24 25774: ca 95 dec r28 25776: d1 f7 brne .-12 ; 0x2576c 25778: c2 cf rjmp .-124 ; 0x256fe } else { goto fail; } if (lba != cacheBlockNumber_) { if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; 2577a: 40 e0 ldi r20, 0x00 ; 0 2577c: bc 01 movw r22, r24 2577e: cd 01 movw r24, r26 25780: 0f 94 86 2a call 0x2550c ; 0x2550c 25784: 81 11 cpse r24, r1 25786: d0 cf rjmp .-96 ; 0x25728 25788: a5 cf rjmp .-182 ; 0x256d4 } if (fatType_ == 16) { *value = cacheBuffer_.fat16[cluster & 0XFF]; } else { *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; 2578a: b7 01 movw r22, r14 2578c: a6 01 movw r20, r12 2578e: 4f 77 andi r20, 0x7F ; 127 25790: 55 27 eor r21, r21 25792: 66 27 eor r22, r22 25794: 77 27 eor r23, r23 25796: 44 0f add r20, r20 25798: 55 1f adc r21, r21 2579a: 44 0f add r20, r20 2579c: 55 1f adc r21, r21 2579e: 4a 5b subi r20, 0xBA ; 186 257a0: 51 4f sbci r21, 0xF1 ; 241 257a2: fa 01 movw r30, r20 257a4: 80 81 ld r24, Z 257a6: 91 81 ldd r25, Z+1 ; 0x01 257a8: a2 81 ldd r26, Z+2 ; 0x02 257aa: b3 81 ldd r27, Z+3 ; 0x03 257ac: bf 70 andi r27, 0x0F ; 15 257ae: ce cf rjmp .-100 ; 0x2574c 000257b0 : fail: return false; } //------------------------------------------------------------------------------ // return the size in bytes of a cluster chain bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { 257b0: 4f 92 push r4 257b2: 5f 92 push r5 257b4: 6f 92 push r6 257b6: 7f 92 push r7 257b8: af 92 push r10 257ba: bf 92 push r11 257bc: cf 92 push r12 257be: df 92 push r13 257c0: ef 92 push r14 257c2: ff 92 push r15 257c4: 0f 93 push r16 257c6: 1f 93 push r17 257c8: cf 93 push r28 257ca: df 93 push r29 257cc: 00 d0 rcall .+0 ; 0x257ce 257ce: 1f 92 push r1 257d0: cd b7 in r28, 0x3d ; 61 257d2: de b7 in r29, 0x3e ; 62 257d4: 8c 01 movw r16, r24 257d6: 49 83 std Y+1, r20 ; 0x01 257d8: 5a 83 std Y+2, r21 ; 0x02 257da: 6b 83 std Y+3, r22 ; 0x03 257dc: 7c 83 std Y+4, r23 ; 0x04 257de: 59 01 movw r10, r18 uint32_t s = 0; 257e0: c1 2c mov r12, r1 257e2: d1 2c mov r13, r1 257e4: 76 01 movw r14, r12 do { if (!fatGet(cluster, &cluster)) goto fail; s += 512UL << clusterSizeShift_; 257e6: 41 2c mov r4, r1 257e8: 82 e0 ldi r24, 0x02 ; 2 257ea: 58 2e mov r5, r24 257ec: 61 2c mov r6, r1 257ee: 71 2c mov r7, r1 //------------------------------------------------------------------------------ // return the size in bytes of a cluster chain bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { uint32_t s = 0; do { if (!fatGet(cluster, &cluster)) goto fail; 257f0: 49 81 ldd r20, Y+1 ; 0x01 257f2: 5a 81 ldd r21, Y+2 ; 0x02 257f4: 6b 81 ldd r22, Y+3 ; 0x03 257f6: 7c 81 ldd r23, Y+4 ; 0x04 257f8: 9e 01 movw r18, r28 257fa: 2f 5f subi r18, 0xFF ; 255 257fc: 3f 4f sbci r19, 0xFF ; 255 257fe: c8 01 movw r24, r16 25800: 0f 94 55 2b call 0x256aa ; 0x256aa 25804: 88 23 and r24, r24 25806: 19 f1 breq .+70 ; 0x2584e s += 512UL << clusterSizeShift_; 25808: f8 01 movw r30, r16 2580a: 85 85 ldd r24, Z+13 ; 0x0d 2580c: a3 01 movw r20, r6 2580e: 92 01 movw r18, r4 25810: 04 c0 rjmp .+8 ; 0x2581a 25812: 22 0f add r18, r18 25814: 33 1f adc r19, r19 25816: 44 1f adc r20, r20 25818: 55 1f adc r21, r21 2581a: 8a 95 dec r24 2581c: d2 f7 brpl .-12 ; 0x25812 2581e: da 01 movw r26, r20 25820: c9 01 movw r24, r18 25822: c8 0e add r12, r24 25824: d9 1e adc r13, r25 25826: ea 1e adc r14, r26 25828: fb 1e adc r15, r27 } while (!isEOC(cluster)); 2582a: 49 81 ldd r20, Y+1 ; 0x01 2582c: 5a 81 ldd r21, Y+2 ; 0x02 2582e: 6b 81 ldd r22, Y+3 ; 0x03 25830: 7c 81 ldd r23, Y+4 ; 0x04 return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); bool isEOC(uint32_t cluster) const { if (FAT12_SUPPORT && fatType_ == 12) return cluster >= FAT12EOC_MIN; if (fatType_ == 16) return cluster >= FAT16EOC_MIN; 25832: 87 89 ldd r24, Z+23 ; 0x17 25834: 80 31 cpi r24, 0x10 ; 16 25836: f1 f4 brne .+60 ; 0x25874 25838: 81 e0 ldi r24, 0x01 ; 1 2583a: 48 3f cpi r20, 0xF8 ; 248 2583c: 5f 4f sbci r21, 0xFF ; 255 2583e: 61 05 cpc r22, r1 25840: 71 05 cpc r23, r1 25842: b0 f2 brcs .-84 ; 0x257f0 *size = s; 25844: f5 01 movw r30, r10 25846: c0 82 st Z, r12 25848: d1 82 std Z+1, r13 ; 0x01 2584a: e2 82 std Z+2, r14 ; 0x02 2584c: f3 82 std Z+3, r15 ; 0x03 return true; fail: return false; } 2584e: 0f 90 pop r0 25850: 0f 90 pop r0 25852: 0f 90 pop r0 25854: 0f 90 pop r0 25856: df 91 pop r29 25858: cf 91 pop r28 2585a: 1f 91 pop r17 2585c: 0f 91 pop r16 2585e: ff 90 pop r15 25860: ef 90 pop r14 25862: df 90 pop r13 25864: cf 90 pop r12 25866: bf 90 pop r11 25868: af 90 pop r10 2586a: 7f 90 pop r7 2586c: 6f 90 pop r6 2586e: 5f 90 pop r5 25870: 4f 90 pop r4 25872: 08 95 ret return cluster >= FAT32EOC_MIN; 25874: 81 e0 ldi r24, 0x01 ; 1 25876: 48 3f cpi r20, 0xF8 ; 248 25878: 5f 4f sbci r21, 0xFF ; 255 2587a: 6f 4f sbci r22, 0xFF ; 255 2587c: 7f 40 sbci r23, 0x0F ; 15 2587e: 08 f4 brcc .+2 ; 0x25882 25880: b7 cf rjmp .-146 ; 0x257f0 25882: e0 cf rjmp .-64 ; 0x25844 00025884 : * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include the file is already open, the FAT volume has * not been initialized or it a FAT12 volume. */ bool SdBaseFile::openRoot(SdVolume* vol) { 25884: 0f 93 push r16 25886: 1f 93 push r17 25888: cf 93 push r28 2588a: df 93 push r29 // error if file is already open if (isOpen()) goto fail; 2588c: fc 01 movw r30, r24 2588e: 23 81 ldd r18, Z+3 ; 0x03 25890: 22 23 and r18, r18 25892: 31 f0 breq .+12 ; 0x258a0 dirBlock_ = 0; dirIndex_ = 0; return true; fail: return false; 25894: 80 e0 ldi r24, 0x00 ; 0 } 25896: df 91 pop r29 25898: cf 91 pop r28 2589a: 1f 91 pop r17 2589c: 0f 91 pop r16 2589e: 08 95 ret 258a0: 8b 01 movw r16, r22 258a2: ec 01 movw r28, r24 258a4: fb 01 movw r30, r22 258a6: 87 89 ldd r24, Z+23 ; 0x17 */ bool SdBaseFile::openRoot(SdVolume* vol) { // error if file is already open if (isOpen()) goto fail; if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) { 258a8: 80 31 cpi r24, 0x10 ; 16 258aa: 39 f5 brne .+78 ; 0x258fa type_ = FAT_FILE_TYPE_ROOT_FIXED; 258ac: 82 e0 ldi r24, 0x02 ; 2 258ae: 8b 83 std Y+3, r24 ; 0x03 firstCluster_ = 0; 258b0: 1d 8a std Y+21, r1 ; 0x15 258b2: 1e 8a std Y+22, r1 ; 0x16 258b4: 1f 8a std Y+23, r1 ; 0x17 258b6: 18 8e std Y+24, r1 ; 0x18 fileSize_ = 32 * vol->rootDirEntryCount(); 258b8: 80 8d ldd r24, Z+24 ; 0x18 258ba: 91 8d ldd r25, Z+25 ; 0x19 258bc: b0 e0 ldi r27, 0x00 ; 0 258be: a0 e0 ldi r26, 0x00 ; 0 258c0: 25 e0 ldi r18, 0x05 ; 5 258c2: 88 0f add r24, r24 258c4: 99 1f adc r25, r25 258c6: aa 1f adc r26, r26 258c8: bb 1f adc r27, r27 258ca: 2a 95 dec r18 258cc: d1 f7 brne .-12 ; 0x258c2 258ce: 89 8b std Y+17, r24 ; 0x11 258d0: 9a 8b std Y+18, r25 ; 0x12 258d2: ab 8b std Y+19, r26 ; 0x13 258d4: bc 8b std Y+20, r27 ; 0x14 if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail; } else { // volume is not initialized, invalid, or FAT12 without support return false; } vol_ = vol; 258d6: 1a 8f std Y+26, r17 ; 0x1a 258d8: 09 8f std Y+25, r16 ; 0x19 // read only flags_ = O_READ; 258da: 81 e0 ldi r24, 0x01 ; 1 258dc: 89 83 std Y+1, r24 ; 0x01 // set to start of file curCluster_ = 0; 258de: 1c 82 std Y+4, r1 ; 0x04 258e0: 1d 82 std Y+5, r1 ; 0x05 258e2: 1e 82 std Y+6, r1 ; 0x06 258e4: 1f 82 std Y+7, r1 ; 0x07 curPosition_ = 0; 258e6: 18 86 std Y+8, r1 ; 0x08 258e8: 19 86 std Y+9, r1 ; 0x09 258ea: 1a 86 std Y+10, r1 ; 0x0a 258ec: 1b 86 std Y+11, r1 ; 0x0b // root has no directory entry dirBlock_ = 0; 258ee: 1c 86 std Y+12, r1 ; 0x0c 258f0: 1d 86 std Y+13, r1 ; 0x0d 258f2: 1e 86 std Y+14, r1 ; 0x0e 258f4: 1f 86 std Y+15, r1 ; 0x0f dirIndex_ = 0; 258f6: 18 8a std Y+16, r1 ; 0x10 258f8: ce cf rjmp .-100 ; 0x25896 if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) { type_ = FAT_FILE_TYPE_ROOT_FIXED; firstCluster_ = 0; fileSize_ = 32 * vol->rootDirEntryCount(); } else if (vol->fatType() == 32) { 258fa: 80 32 cpi r24, 0x20 ; 32 258fc: 59 f6 brne .-106 ; 0x25894 type_ = FAT_FILE_TYPE_ROOT32; 258fe: 83 e0 ldi r24, 0x03 ; 3 25900: 8b 83 std Y+3, r24 ; 0x03 int32_t freeClusterCount(); /** \return The number of entries in the root directory for FAT16 volumes. */ uint32_t rootDirEntryCount() const {return rootDirEntryCount_;} /** \return The logical block number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. */ uint32_t rootDirStart() const {return rootDirStart_;} 25902: 42 8d ldd r20, Z+26 ; 0x1a 25904: 53 8d ldd r21, Z+27 ; 0x1b 25906: 64 8d ldd r22, Z+28 ; 0x1c 25908: 75 8d ldd r23, Z+29 ; 0x1d firstCluster_ = vol->rootDirStart(); 2590a: 4d 8b std Y+21, r20 ; 0x15 2590c: 5e 8b std Y+22, r21 ; 0x16 2590e: 6f 8b std Y+23, r22 ; 0x17 25910: 78 8f std Y+24, r23 ; 0x18 if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail; 25912: 9e 01 movw r18, r28 25914: 2f 5e subi r18, 0xEF ; 239 25916: 3f 4f sbci r19, 0xFF ; 255 25918: c8 01 movw r24, r16 2591a: 0f 94 d8 2b call 0x257b0 ; 0x257b0 2591e: 81 11 cpse r24, r1 25920: da cf rjmp .-76 ; 0x258d6 25922: b8 cf rjmp .-144 ; 0x25894 00025924 : vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; } return true; } bool SdFile::gfComputeNextFileBlock() { 25924: cf 92 push r12 25926: df 92 push r13 25928: ef 92 push r14 2592a: ff 92 push r15 2592c: 1f 93 push r17 2592e: cf 93 push r28 25930: df 93 push r29 25932: ec 01 movw r28, r24 25934: eb 81 ldd r30, Y+3 ; 0x03 // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) return false; 25936: e1 11 cpse r30, r1 25938: 09 c0 rjmp .+18 ; 0x2594c 2593a: 80 e0 ldi r24, 0x00 ; 0 } } gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster; } return true; } 2593c: df 91 pop r29 2593e: cf 91 pop r28 25940: 1f 91 pop r17 25942: ff 90 pop r15 25944: ef 90 pop r14 25946: df 90 pop r13 25948: cf 90 pop r12 2594a: 08 95 ret return true; } bool SdFile::gfComputeNextFileBlock() { // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) return false; 2594c: 89 81 ldd r24, Y+1 ; 0x01 2594e: 80 ff sbrs r24, 0 25950: f4 cf rjmp .-24 ; 0x2593a gfOffset = curPosition_ & 0X1FF; // offset in block 25952: 48 85 ldd r20, Y+8 ; 0x08 25954: 59 85 ldd r21, Y+9 ; 0x09 25956: 6a 85 ldd r22, Y+10 ; 0x0a 25958: 7b 85 ldd r23, Y+11 ; 0x0b 2595a: 9a 01 movw r18, r20 2595c: 31 70 andi r19, 0x01 ; 1 2595e: 3a a3 std Y+34, r19 ; 0x22 25960: 29 a3 std Y+33, r18 ; 0x21 25962: 89 8d ldd r24, Y+25 ; 0x19 25964: 9a 8d ldd r25, Y+26 ; 0x1a 25966: 6a 01 movw r12, r20 25968: 7b 01 movw r14, r22 2596a: f9 e0 ldi r31, 0x09 ; 9 2596c: f6 94 lsr r15 2596e: e7 94 ror r14 25970: d7 94 ror r13 25972: c7 94 ror r12 25974: fa 95 dec r31 25976: d1 f7 brne .-12 ; 0x2596c if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 25978: e2 30 cpi r30, 0x02 ; 2 2597a: 79 f4 brne .+30 ; 0x2599a // SHR by 9 means skip the last byte and shift just 3 bytes by 1 // -> should be 8 instructions... and not the horrible loop shifting 4 bytes at once // still need to get some work on this gfBlock = vol_->rootDirStart() + (curPosition_ >> 9); 2597c: fc 01 movw r30, r24 2597e: 82 8d ldd r24, Z+26 ; 0x1a 25980: 93 8d ldd r25, Z+27 ; 0x1b 25982: a4 8d ldd r26, Z+28 ; 0x1c 25984: b5 8d ldd r27, Z+29 ; 0x1d 25986: 8c 0d add r24, r12 25988: 9d 1d adc r25, r13 2598a: ae 1d adc r26, r14 2598c: bf 1d adc r27, r15 } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return false; } } gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster; 2598e: 8d 8f std Y+29, r24 ; 0x1d 25990: 9e 8f std Y+30, r25 ; 0x1e 25992: af 8f std Y+31, r26 ; 0x1f 25994: b8 a3 std Y+32, r27 ; 0x20 } return true; 25996: 81 e0 ldi r24, 0x01 ; 1 25998: d1 cf rjmp .-94 ; 0x2593c uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 //---------------------------------------------------------------------------- bool allocContiguous(uint32_t count, uint32_t* curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1);} 2599a: fc 01 movw r30, r24 2599c: 14 81 ldd r17, Z+4 ; 0x04 2599e: 11 50 subi r17, 0x01 ; 1 259a0: 1c 21 and r17, r12 // -> should be 8 instructions... and not the horrible loop shifting 4 bytes at once // still need to get some work on this gfBlock = vol_->rootDirStart() + (curPosition_ >> 9); } else { uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); if (gfOffset == 0 && blockOfCluster == 0) { 259a2: 23 2b or r18, r19 259a4: 71 f4 brne .+28 ; 0x259c2 259a6: 11 11 cpse r17, r1 259a8: 0c c0 rjmp .+24 ; 0x259c2 // start of new cluster if (curPosition_ == 0) { 259aa: 45 2b or r20, r21 259ac: 46 2b or r20, r22 259ae: 47 2b or r20, r23 259b0: 31 f5 brne .+76 ; 0x259fe // use first cluster in file curCluster_ = firstCluster_; 259b2: 8d 89 ldd r24, Y+21 ; 0x15 259b4: 9e 89 ldd r25, Y+22 ; 0x16 259b6: af 89 ldd r26, Y+23 ; 0x17 259b8: b8 8d ldd r27, Y+24 ; 0x18 259ba: 8c 83 std Y+4, r24 ; 0x04 259bc: 9d 83 std Y+5, r25 ; 0x05 259be: ae 83 std Y+6, r26 ; 0x06 259c0: bf 83 std Y+7, r27 ; 0x07 } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return false; } } gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster; 259c2: e9 8d ldd r30, Y+25 ; 0x19 259c4: fa 8d ldd r31, Y+26 ; 0x1a uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 259c6: 8c 81 ldd r24, Y+4 ; 0x04 259c8: 9d 81 ldd r25, Y+5 ; 0x05 259ca: ae 81 ldd r26, Y+6 ; 0x06 259cc: bf 81 ldd r27, Y+7 ; 0x07 259ce: 02 97 sbiw r24, 0x02 ; 2 259d0: a1 09 sbc r26, r1 259d2: b1 09 sbc r27, r1 259d4: 25 85 ldd r18, Z+13 ; 0x0d 259d6: 04 c0 rjmp .+8 ; 0x259e0 259d8: 88 0f add r24, r24 259da: 99 1f adc r25, r25 259dc: aa 1f adc r26, r26 259de: bb 1f adc r27, r27 259e0: 2a 95 dec r18 259e2: d2 f7 brpl .-12 ; 0x259d8 259e4: 46 85 ldd r20, Z+14 ; 0x0e 259e6: 57 85 ldd r21, Z+15 ; 0x0f 259e8: 60 89 ldd r22, Z+16 ; 0x10 259ea: 71 89 ldd r23, Z+17 ; 0x11 259ec: 84 0f add r24, r20 259ee: 95 1f adc r25, r21 259f0: a6 1f adc r26, r22 259f2: b7 1f adc r27, r23 259f4: 81 0f add r24, r17 259f6: 91 1d adc r25, r1 259f8: a1 1d adc r26, r1 259fa: b1 1d adc r27, r1 259fc: c8 cf rjmp .-112 ; 0x2598e if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return false; 259fe: 4c 81 ldd r20, Y+4 ; 0x04 25a00: 5d 81 ldd r21, Y+5 ; 0x05 25a02: 6e 81 ldd r22, Y+6 ; 0x06 25a04: 7f 81 ldd r23, Y+7 ; 0x07 25a06: 9e 01 movw r18, r28 25a08: 2c 5f subi r18, 0xFC ; 252 25a0a: 3f 4f sbci r19, 0xFF ; 255 25a0c: 0f 94 55 2b call 0x256aa ; 0x256aa 25a10: 81 11 cpse r24, r1 25a12: d7 cf rjmp .-82 ; 0x259c2 25a14: 92 cf rjmp .-220 ; 0x2593a 00025a16 : * \param[in] pos The new position in bytes from the beginning of the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool SdBaseFile::seekSet(uint32_t pos) { 25a16: 8f 92 push r8 25a18: 9f 92 push r9 25a1a: af 92 push r10 25a1c: bf 92 push r11 25a1e: cf 92 push r12 25a20: df 92 push r13 25a22: ef 92 push r14 25a24: ff 92 push r15 25a26: 0f 93 push r16 25a28: 1f 93 push r17 25a2a: cf 93 push r28 25a2c: df 93 push r29 25a2e: ec 01 movw r28, r24 25a30: 8b 81 ldd r24, Y+3 ; 0x03 uint32_t nCur; uint32_t nNew; // error if file not open or seek past end of file if (!isOpen() || pos > fileSize_) goto fail; 25a32: 81 11 cpse r24, r1 25a34: 0e c0 rjmp .+28 ; 0x25a52 done: return true; fail: return false; 25a36: 80 e0 ldi r24, 0x00 ; 0 } 25a38: df 91 pop r29 25a3a: cf 91 pop r28 25a3c: 1f 91 pop r17 25a3e: 0f 91 pop r16 25a40: ff 90 pop r15 25a42: ef 90 pop r14 25a44: df 90 pop r13 25a46: cf 90 pop r12 25a48: bf 90 pop r11 25a4a: af 90 pop r10 25a4c: 9f 90 pop r9 25a4e: 8f 90 pop r8 25a50: 08 95 ret */ bool SdBaseFile::seekSet(uint32_t pos) { uint32_t nCur; uint32_t nNew; // error if file not open or seek past end of file if (!isOpen() || pos > fileSize_) goto fail; 25a52: 09 89 ldd r16, Y+17 ; 0x11 25a54: 1a 89 ldd r17, Y+18 ; 0x12 25a56: 2b 89 ldd r18, Y+19 ; 0x13 25a58: 3c 89 ldd r19, Y+20 ; 0x14 25a5a: 04 17 cp r16, r20 25a5c: 15 07 cpc r17, r21 25a5e: 26 07 cpc r18, r22 25a60: 37 07 cpc r19, r23 25a62: 48 f3 brcs .-46 ; 0x25a36 25a64: 4a 01 movw r8, r20 25a66: 5b 01 movw r10, r22 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 25a68: 82 30 cpi r24, 0x02 ; 2 25a6a: 31 f4 brne .+12 ; 0x25a78 curPosition_ = pos; 25a6c: 88 86 std Y+8, r8 ; 0x08 25a6e: 99 86 std Y+9, r9 ; 0x09 25a70: aa 86 std Y+10, r10 ; 0x0a 25a72: bb 86 std Y+11, r11 ; 0x0b if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; } curPosition_ = pos; done: return true; 25a74: 81 e0 ldi r24, 0x01 ; 1 25a76: e0 cf rjmp .-64 ; 0x25a38 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { curPosition_ = pos; goto done; } if (pos == 0) { 25a78: 81 14 cp r8, r1 25a7a: 91 04 cpc r9, r1 25a7c: a1 04 cpc r10, r1 25a7e: b1 04 cpc r11, r1 25a80: 49 f4 brne .+18 ; 0x25a94 // set position to start of file curCluster_ = 0; 25a82: 1c 82 std Y+4, r1 ; 0x04 25a84: 1d 82 std Y+5, r1 ; 0x05 25a86: 1e 82 std Y+6, r1 ; 0x06 25a88: 1f 82 std Y+7, r1 ; 0x07 curPosition_ = 0; 25a8a: 18 86 std Y+8, r1 ; 0x08 25a8c: 19 86 std Y+9, r1 ; 0x09 25a8e: 1a 86 std Y+10, r1 ; 0x0a 25a90: 1b 86 std Y+11, r1 ; 0x0b 25a92: f0 cf rjmp .-32 ; 0x25a74 goto done; } // calculate cluster index for cur and new position nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); 25a94: 08 85 ldd r16, Y+8 ; 0x08 25a96: 19 85 ldd r17, Y+9 ; 0x09 25a98: 2a 85 ldd r18, Y+10 ; 0x0a 25a9a: 3b 85 ldd r19, Y+11 ; 0x0b 25a9c: e9 8d ldd r30, Y+25 ; 0x19 25a9e: fa 8d ldd r31, Y+26 ; 0x1a 25aa0: 85 85 ldd r24, Z+13 ; 0x0d 25aa2: 90 e0 ldi r25, 0x00 ; 0 25aa4: 09 96 adiw r24, 0x09 ; 9 25aa6: b9 01 movw r22, r18 25aa8: a8 01 movw r20, r16 25aaa: 41 50 subi r20, 0x01 ; 1 25aac: 51 09 sbc r21, r1 25aae: 61 09 sbc r22, r1 25ab0: 71 09 sbc r23, r1 25ab2: 08 2e mov r0, r24 25ab4: 04 c0 rjmp .+8 ; 0x25abe 25ab6: 76 95 lsr r23 25ab8: 67 95 ror r22 25aba: 57 95 ror r21 25abc: 47 95 ror r20 25abe: 0a 94 dec r0 25ac0: d2 f7 brpl .-12 ; 0x25ab6 nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); 25ac2: 75 01 movw r14, r10 25ac4: 64 01 movw r12, r8 25ac6: e1 e0 ldi r30, 0x01 ; 1 25ac8: ce 1a sub r12, r30 25aca: d1 08 sbc r13, r1 25acc: e1 08 sbc r14, r1 25ace: f1 08 sbc r15, r1 25ad0: 04 c0 rjmp .+8 ; 0x25ada 25ad2: f6 94 lsr r15 25ad4: e7 94 ror r14 25ad6: d7 94 ror r13 25ad8: c7 94 ror r12 25ada: 8a 95 dec r24 25adc: d2 f7 brpl .-12 ; 0x25ad2 if (nNew < nCur || curPosition_ == 0) { 25ade: c4 16 cp r12, r20 25ae0: d5 06 cpc r13, r21 25ae2: e6 06 cpc r14, r22 25ae4: f7 06 cpc r15, r23 25ae6: 20 f0 brcs .+8 ; 0x25af0 25ae8: 01 2b or r16, r17 25aea: 02 2b or r16, r18 25aec: 03 2b or r16, r19 25aee: 11 f5 brne .+68 ; 0x25b34 // must follow chain from first cluster curCluster_ = firstCluster_; 25af0: 8d 89 ldd r24, Y+21 ; 0x15 25af2: 9e 89 ldd r25, Y+22 ; 0x16 25af4: af 89 ldd r26, Y+23 ; 0x17 25af6: b8 8d ldd r27, Y+24 ; 0x18 25af8: 8c 83 std Y+4, r24 ; 0x04 25afa: 9d 83 std Y+5, r25 ; 0x05 25afc: ae 83 std Y+6, r26 ; 0x06 25afe: bf 83 std Y+7, r27 ; 0x07 } else { // advance from curPosition nNew -= nCur; } while (nNew--) { if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 25b00: 8e 01 movw r16, r28 25b02: 0c 5f subi r16, 0xFC ; 252 25b04: 1f 4f sbci r17, 0xFF ; 255 curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; } while (nNew--) { 25b06: c1 14 cp r12, r1 25b08: d1 04 cpc r13, r1 25b0a: e1 04 cpc r14, r1 25b0c: f1 04 cpc r15, r1 25b0e: 09 f4 brne .+2 ; 0x25b12 25b10: ad cf rjmp .-166 ; 0x25a6c if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 25b12: 4c 81 ldd r20, Y+4 ; 0x04 25b14: 5d 81 ldd r21, Y+5 ; 0x05 25b16: 6e 81 ldd r22, Y+6 ; 0x06 25b18: 7f 81 ldd r23, Y+7 ; 0x07 25b1a: 98 01 movw r18, r16 25b1c: 89 8d ldd r24, Y+25 ; 0x19 25b1e: 9a 8d ldd r25, Y+26 ; 0x1a 25b20: 0f 94 55 2b call 0x256aa ; 0x256aa 25b24: 91 e0 ldi r25, 0x01 ; 1 25b26: c9 1a sub r12, r25 25b28: d1 08 sbc r13, r1 25b2a: e1 08 sbc r14, r1 25b2c: f1 08 sbc r15, r1 25b2e: 81 11 cpse r24, r1 25b30: ea cf rjmp .-44 ; 0x25b06 25b32: 81 cf rjmp .-254 ; 0x25a36 if (nNew < nCur || curPosition_ == 0) { // must follow chain from first cluster curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; 25b34: c4 1a sub r12, r20 25b36: d5 0a sbc r13, r21 25b38: e6 0a sbc r14, r22 25b3a: f7 0a sbc r15, r23 25b3c: e1 cf rjmp .-62 ; 0x25b00 00025b3e : SdBaseFile* SdBaseFile::cwd_ = 0; // callback function for date/time void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; //------------------------------------------------------------------------------ // add a cluster to a file bool SdBaseFile::addCluster() { 25b3e: 3f 92 push r3 25b40: 4f 92 push r4 25b42: 5f 92 push r5 25b44: 6f 92 push r6 25b46: 7f 92 push r7 25b48: 8f 92 push r8 25b4a: 9f 92 push r9 25b4c: af 92 push r10 25b4e: bf 92 push r11 25b50: cf 92 push r12 25b52: df 92 push r13 25b54: ef 92 push r14 25b56: ff 92 push r15 25b58: 0f 93 push r16 25b5a: 1f 93 push r17 25b5c: cf 93 push r28 25b5e: df 93 push r29 25b60: cd b7 in r28, 0x3d ; 61 25b62: de b7 in r29, 0x3e ; 62 25b64: 2c 97 sbiw r28, 0x0c ; 12 25b66: 0f b6 in r0, 0x3f ; 63 25b68: f8 94 cli 25b6a: de bf out 0x3e, r29 ; 62 25b6c: 0f be out 0x3f, r0 ; 63 25b6e: cd bf out 0x3d, r28 ; 61 25b70: 5c 01 movw r10, r24 if (!vol_->allocContiguous(1, &curCluster_)) goto fail; 25b72: dc 01 movw r26, r24 25b74: 59 96 adiw r26, 0x19 ; 25 25b76: 8d 90 ld r8, X+ 25b78: 9c 90 ld r9, X // start of group uint32_t bgnCluster; // end of group uint32_t endCluster; // last cluster of FAT uint32_t fatEnd = clusterCount_ + 1; 25b7a: f4 01 movw r30, r8 25b7c: 81 85 ldd r24, Z+9 ; 0x09 25b7e: 92 85 ldd r25, Z+10 ; 0x0a 25b80: a3 85 ldd r26, Z+11 ; 0x0b 25b82: b4 85 ldd r27, Z+12 ; 0x0c 25b84: 9c 01 movw r18, r24 25b86: ad 01 movw r20, r26 25b88: 2f 5f subi r18, 0xFF ; 255 25b8a: 3f 4f sbci r19, 0xFF ; 255 25b8c: 4f 4f sbci r20, 0xFF ; 255 25b8e: 5f 4f sbci r21, 0xFF ; 255 25b90: 29 87 std Y+9, r18 ; 0x09 25b92: 3a 87 std Y+10, r19 ; 0x0a 25b94: 4b 87 std Y+11, r20 ; 0x0b 25b96: 5c 87 std Y+12, r21 ; 0x0c // flag to save place to start next search bool setStart; // set search start cluster if (*curCluster) { 25b98: d5 01 movw r26, r10 25b9a: 14 96 adiw r26, 0x04 ; 4 25b9c: 4d 90 ld r4, X+ 25b9e: 5d 90 ld r5, X+ 25ba0: 6d 90 ld r6, X+ 25ba2: 7c 90 ld r7, X 25ba4: 17 97 sbiw r26, 0x07 ; 7 25ba6: 41 14 cp r4, r1 25ba8: 51 04 cpc r5, r1 25baa: 61 04 cpc r6, r1 25bac: 71 04 cpc r7, r1 25bae: 09 f4 brne .+2 ; 0x25bb2 25bb0: 59 c0 rjmp .+178 ; 0x25c64 // try to make file contiguous bgnCluster = *curCluster + 1; 25bb2: bf ef ldi r27, 0xFF ; 255 25bb4: 4b 1a sub r4, r27 25bb6: 5b 0a sbc r5, r27 25bb8: 6b 0a sbc r6, r27 25bba: 7b 0a sbc r7, r27 // don't save new start location setStart = false; 25bbc: 31 2c mov r3, r1 // save next search start if one cluster setStart = count == 1; } // end of group endCluster = bgnCluster; 25bbe: 73 01 movw r14, r6 25bc0: 62 01 movw r12, r4 // search the FAT for free clusters for (uint32_t n = 0;; n++, endCluster++) { 25bc2: 1d 82 std Y+5, r1 ; 0x05 25bc4: 1e 82 std Y+6, r1 ; 0x06 25bc6: 1f 82 std Y+7, r1 ; 0x07 25bc8: 18 86 std Y+8, r1 ; 0x08 // can't find space checked all clusters if (n >= clusterCount_) goto fail; 25bca: f4 01 movw r30, r8 25bcc: 81 85 ldd r24, Z+9 ; 0x09 25bce: 92 85 ldd r25, Z+10 ; 0x0a 25bd0: a3 85 ldd r26, Z+11 ; 0x0b 25bd2: b4 85 ldd r27, Z+12 ; 0x0c 25bd4: 2d 81 ldd r18, Y+5 ; 0x05 25bd6: 3e 81 ldd r19, Y+6 ; 0x06 25bd8: 4f 81 ldd r20, Y+7 ; 0x07 25bda: 58 85 ldd r21, Y+8 ; 0x08 25bdc: 28 17 cp r18, r24 25bde: 39 07 cpc r19, r25 25be0: 4a 07 cpc r20, r26 25be2: 5b 07 cpc r21, r27 25be4: 08 f0 brcs .+2 ; 0x25be8 25be6: 56 c0 rjmp .+172 ; 0x25c94 // past end - start from beginning of FAT if (endCluster > fatEnd) { 25be8: 89 85 ldd r24, Y+9 ; 0x09 25bea: 9a 85 ldd r25, Y+10 ; 0x0a 25bec: ab 85 ldd r26, Y+11 ; 0x0b 25bee: bc 85 ldd r27, Y+12 ; 0x0c 25bf0: 8c 15 cp r24, r12 25bf2: 9d 05 cpc r25, r13 25bf4: ae 05 cpc r26, r14 25bf6: bf 05 cpc r27, r15 25bf8: 50 f4 brcc .+20 ; 0x25c0e bgnCluster = endCluster = 2; 25bfa: 82 e0 ldi r24, 0x02 ; 2 25bfc: c8 2e mov r12, r24 25bfe: d1 2c mov r13, r1 25c00: e1 2c mov r14, r1 25c02: f1 2c mov r15, r1 25c04: 92 e0 ldi r25, 0x02 ; 2 25c06: 49 2e mov r4, r25 25c08: 51 2c mov r5, r1 25c0a: 61 2c mov r6, r1 25c0c: 71 2c mov r7, r1 } uint32_t f; if (!fatGet(endCluster, &f)) goto fail; 25c0e: 9e 01 movw r18, r28 25c10: 2f 5f subi r18, 0xFF ; 255 25c12: 3f 4f sbci r19, 0xFF ; 255 25c14: b7 01 movw r22, r14 25c16: a6 01 movw r20, r12 25c18: c4 01 movw r24, r8 25c1a: 0f 94 55 2b call 0x256aa ; 0x256aa 25c1e: 88 23 and r24, r24 25c20: c9 f1 breq .+114 ; 0x25c94 if (f != 0) { 25c22: 89 81 ldd r24, Y+1 ; 0x01 25c24: 9a 81 ldd r25, Y+2 ; 0x02 25c26: ab 81 ldd r26, Y+3 ; 0x03 25c28: bc 81 ldd r27, Y+4 ; 0x04 25c2a: 89 2b or r24, r25 25c2c: 8a 2b or r24, r26 25c2e: 8b 2b or r24, r27 25c30: 01 f1 breq .+64 ; 0x25c72 // cluster in use try next cluster as bgnCluster bgnCluster = endCluster + 1; 25c32: 26 01 movw r4, r12 25c34: 37 01 movw r6, r14 25c36: 9f ef ldi r25, 0xFF ; 255 25c38: 49 1a sub r4, r25 25c3a: 59 0a sbc r5, r25 25c3c: 69 0a sbc r6, r25 25c3e: 79 0a sbc r7, r25 } // end of group endCluster = bgnCluster; // search the FAT for free clusters for (uint32_t n = 0;; n++, endCluster++) { 25c40: 2d 81 ldd r18, Y+5 ; 0x05 25c42: 3e 81 ldd r19, Y+6 ; 0x06 25c44: 4f 81 ldd r20, Y+7 ; 0x07 25c46: 58 85 ldd r21, Y+8 ; 0x08 25c48: 2f 5f subi r18, 0xFF ; 255 25c4a: 3f 4f sbci r19, 0xFF ; 255 25c4c: 4f 4f sbci r20, 0xFF ; 255 25c4e: 5f 4f sbci r21, 0xFF ; 255 25c50: 2d 83 std Y+5, r18 ; 0x05 25c52: 3e 83 std Y+6, r19 ; 0x06 25c54: 4f 83 std Y+7, r20 ; 0x07 25c56: 58 87 std Y+8, r21 ; 0x08 25c58: 3f ef ldi r19, 0xFF ; 255 25c5a: c3 1a sub r12, r19 25c5c: d3 0a sbc r13, r19 25c5e: e3 0a sbc r14, r19 25c60: f3 0a sbc r15, r19 25c62: b3 cf rjmp .-154 ; 0x25bca // don't save new start location setStart = false; } else { // start at likely place for free cluster bgnCluster = allocSearchStart_; 25c64: 40 80 ld r4, Z 25c66: 51 80 ldd r5, Z+1 ; 0x01 25c68: 62 80 ldd r6, Z+2 ; 0x02 25c6a: 73 80 ldd r7, Z+3 ; 0x03 // save next search start if one cluster setStart = count == 1; 25c6c: 33 24 eor r3, r3 25c6e: 33 94 inc r3 25c70: a6 cf rjmp .-180 ; 0x25bbe if (!fatGet(endCluster, &f)) goto fail; if (f != 0) { // cluster in use try next cluster as bgnCluster bgnCluster = endCluster + 1; } else if ((endCluster - bgnCluster + 1) == count) { 25c72: c4 14 cp r12, r4 25c74: d5 04 cpc r13, r5 25c76: e6 04 cpc r14, r6 25c78: f7 04 cpc r15, r7 25c7a: 11 f7 brne .-60 ; 0x25c40 void cacheSetDirty() {cacheDirty_ |= CACHE_FOR_WRITE;} bool chainSize(uint32_t beginCluster, uint32_t* size); bool fatGet(uint32_t cluster, uint32_t* value); bool fatPut(uint32_t cluster, uint32_t value); bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); 25c7c: 0f ef ldi r16, 0xFF ; 255 25c7e: 1f ef ldi r17, 0xFF ; 255 25c80: 2f ef ldi r18, 0xFF ; 255 25c82: 3f e0 ldi r19, 0x0F ; 15 25c84: b7 01 movw r22, r14 25c86: a6 01 movw r20, r12 25c88: c4 01 movw r24, r8 25c8a: 0f 94 c3 2a call 0x25586 ; 0x25586 25c8e: 78 2e mov r7, r24 // done - found space break; } } // mark end of chain if (!fatPutEOC(endCluster)) goto fail; 25c90: 81 11 cpse r24, r1 25c92: 1a c0 rjmp .+52 ; 0x25cc8 flags_ |= F_FILE_DIR_DIRTY; } return true; fail: return false; 25c94: 71 2c mov r7, r1 } 25c96: 87 2d mov r24, r7 25c98: 2c 96 adiw r28, 0x0c ; 12 25c9a: 0f b6 in r0, 0x3f ; 63 25c9c: f8 94 cli 25c9e: de bf out 0x3e, r29 ; 62 25ca0: 0f be out 0x3f, r0 ; 63 25ca2: cd bf out 0x3d, r28 ; 61 25ca4: df 91 pop r29 25ca6: cf 91 pop r28 25ca8: 1f 91 pop r17 25caa: 0f 91 pop r16 25cac: ff 90 pop r15 25cae: ef 90 pop r14 25cb0: df 90 pop r13 25cb2: cf 90 pop r12 25cb4: bf 90 pop r11 25cb6: af 90 pop r10 25cb8: 9f 90 pop r9 25cba: 8f 90 pop r8 25cbc: 7f 90 pop r7 25cbe: 6f 90 pop r6 25cc0: 5f 90 pop r5 25cc2: 4f 90 pop r4 25cc4: 3f 90 pop r3 25cc6: 08 95 ret // link clusters while (endCluster > bgnCluster) { if (!fatPut(endCluster - 1, endCluster)) goto fail; endCluster--; } if (*curCluster != 0) { 25cc8: f5 01 movw r30, r10 25cca: 44 81 ldd r20, Z+4 ; 0x04 25ccc: 55 81 ldd r21, Z+5 ; 0x05 25cce: 66 81 ldd r22, Z+6 ; 0x06 25cd0: 77 81 ldd r23, Z+7 ; 0x07 25cd2: 41 15 cp r20, r1 25cd4: 51 05 cpc r21, r1 25cd6: 61 05 cpc r22, r1 25cd8: 71 05 cpc r23, r1 25cda: 39 f0 breq .+14 ; 0x25cea // connect chains if (!fatPut(*curCluster, bgnCluster)) goto fail; 25cdc: 97 01 movw r18, r14 25cde: 86 01 movw r16, r12 25ce0: c4 01 movw r24, r8 25ce2: 0f 94 c3 2a call 0x25586 ; 0x25586 25ce6: 88 23 and r24, r24 25ce8: a9 f2 breq .-86 ; 0x25c94 } // return first cluster number to caller *curCluster = bgnCluster; 25cea: d5 01 movw r26, r10 25cec: 14 96 adiw r26, 0x04 ; 4 25cee: cd 92 st X+, r12 25cf0: dd 92 st X+, r13 25cf2: ed 92 st X+, r14 25cf4: fc 92 st X, r15 25cf6: 17 97 sbiw r26, 0x07 ; 7 // remember possible next free cluster if (setStart) allocSearchStart_ = bgnCluster + 1; 25cf8: 33 20 and r3, r3 25cfa: 51 f0 breq .+20 ; 0x25d10 25cfc: d7 01 movw r26, r14 25cfe: c6 01 movw r24, r12 25d00: 01 96 adiw r24, 0x01 ; 1 25d02: a1 1d adc r26, r1 25d04: b1 1d adc r27, r1 25d06: f4 01 movw r30, r8 25d08: 80 83 st Z, r24 25d0a: 91 83 std Z+1, r25 ; 0x01 25d0c: a2 83 std Z+2, r26 ; 0x02 25d0e: b3 83 std Z+3, r27 ; 0x03 // add a cluster to a file bool SdBaseFile::addCluster() { if (!vol_->allocContiguous(1, &curCluster_)) goto fail; // if first cluster of file link to directory entry if (firstCluster_ == 0) { 25d10: f5 01 movw r30, r10 25d12: 85 89 ldd r24, Z+21 ; 0x15 25d14: 96 89 ldd r25, Z+22 ; 0x16 25d16: a7 89 ldd r26, Z+23 ; 0x17 25d18: b0 8d ldd r27, Z+24 ; 0x18 25d1a: 89 2b or r24, r25 25d1c: 8a 2b or r24, r26 25d1e: 8b 2b or r24, r27 25d20: 09 f0 breq .+2 ; 0x25d24 25d22: b9 cf rjmp .-142 ; 0x25c96 firstCluster_ = curCluster_; 25d24: c5 8a std Z+21, r12 ; 0x15 25d26: d6 8a std Z+22, r13 ; 0x16 25d28: e7 8a std Z+23, r14 ; 0x17 25d2a: f0 8e std Z+24, r15 ; 0x18 flags_ |= F_FILE_DIR_DIRTY; 25d2c: 81 81 ldd r24, Z+1 ; 0x01 25d2e: 80 68 ori r24, 0x80 ; 128 25d30: 81 83 std Z+1, r24 ; 0x01 25d32: b1 cf rjmp .-158 ; 0x25c96 00025d34 : return false; } //------------------------------------------------------------------------------ // cache a file's directory entry // return pointer to cached entry or null for failure dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { 25d34: cf 93 push r28 25d36: df 93 push r29 25d38: ec 01 movw r28, r24 if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail; 25d3a: 46 2f mov r20, r22 25d3c: 41 70 andi r20, 0x01 ; 1 25d3e: 6c 85 ldd r22, Y+12 ; 0x0c 25d40: 7d 85 ldd r23, Y+13 ; 0x0d 25d42: 8e 85 ldd r24, Y+14 ; 0x0e 25d44: 9f 85 ldd r25, Y+15 ; 0x0f 25d46: 0f 94 86 2a call 0x2550c ; 0x2550c 25d4a: 88 23 and r24, r24 25d4c: 51 f0 breq .+20 ; 0x25d62 return vol_->cache()->dir + dirIndex_; 25d4e: 88 89 ldd r24, Y+16 ; 0x10 25d50: 20 e2 ldi r18, 0x20 ; 32 25d52: 82 9f mul r24, r18 25d54: c0 01 movw r24, r0 25d56: 11 24 eor r1, r1 25d58: 8a 5b subi r24, 0xBA ; 186 25d5a: 91 4f sbci r25, 0xF1 ; 241 fail: return 0; } 25d5c: df 91 pop r29 25d5e: cf 91 pop r28 25d60: 08 95 ret dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail; return vol_->cache()->dir + dirIndex_; fail: return 0; 25d62: 90 e0 ldi r25, 0x00 ; 0 25d64: 80 e0 ldi r24, 0x00 ; 0 25d66: fa cf rjmp .-12 ; 0x25d5c 00025d68 : * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include a call to sync() before a file has been * opened or an I/O error. */ bool SdBaseFile::sync() { 25d68: cf 93 push r28 25d6a: df 93 push r29 25d6c: ec 01 movw r28, r24 // only allow open files and directories if (!isOpen()) goto fail; 25d6e: 8b 81 ldd r24, Y+3 ; 0x03 25d70: 88 23 and r24, r24 25d72: 49 f1 breq .+82 ; 0x25dc6 if (flags_ & F_FILE_DIR_DIRTY) { 25d74: 89 81 ldd r24, Y+1 ; 0x01 25d76: 87 ff sbrs r24, 7 25d78: 22 c0 rjmp .+68 ; 0x25dbe dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 25d7a: 61 e0 ldi r22, 0x01 ; 1 25d7c: ce 01 movw r24, r28 25d7e: 0f 94 9a 2e call 0x25d34 ; 0x25d34 25d82: fc 01 movw r30, r24 // check for deleted by another open file object if (!d || d->name[0] == DIR_NAME_DELETED) goto fail; 25d84: 89 2b or r24, r25 25d86: f9 f0 breq .+62 ; 0x25dc6 25d88: 80 81 ld r24, Z 25d8a: 85 3e cpi r24, 0xE5 ; 229 25d8c: e1 f0 breq .+56 ; 0x25dc6 // do not set filesize for dir files if (!isDir()) d->fileSize = fileSize_; 25d8e: 8b 81 ldd r24, Y+3 ; 0x03 25d90: 82 30 cpi r24, 0x02 ; 2 25d92: 40 f4 brcc .+16 ; 0x25da4 25d94: 89 89 ldd r24, Y+17 ; 0x11 25d96: 9a 89 ldd r25, Y+18 ; 0x12 25d98: ab 89 ldd r26, Y+19 ; 0x13 25d9a: bc 89 ldd r27, Y+20 ; 0x14 25d9c: 84 8f std Z+28, r24 ; 0x1c 25d9e: 95 8f std Z+29, r25 ; 0x1d 25da0: a6 8f std Z+30, r26 ; 0x1e 25da2: b7 8f std Z+31, r27 ; 0x1f // update first cluster fields d->firstClusterLow = firstCluster_ & 0XFFFF; 25da4: 8d 89 ldd r24, Y+21 ; 0x15 25da6: 9e 89 ldd r25, Y+22 ; 0x16 25da8: 93 8f std Z+27, r25 ; 0x1b 25daa: 82 8f std Z+26, r24 ; 0x1a d->firstClusterHigh = firstCluster_ >> 16; 25dac: 8d 89 ldd r24, Y+21 ; 0x15 25dae: 9e 89 ldd r25, Y+22 ; 0x16 25db0: af 89 ldd r26, Y+23 ; 0x17 25db2: b8 8d ldd r27, Y+24 ; 0x18 25db4: b5 8b std Z+21, r27 ; 0x15 25db6: a4 8b std Z+20, r26 ; 0x14 if (dateTime_) { dateTime_(&d->lastWriteDate, &d->lastWriteTime); d->lastAccessDate = d->lastWriteDate; } // clear directory dirty flags_ &= ~F_FILE_DIR_DIRTY; 25db8: 89 81 ldd r24, Y+1 ; 0x01 25dba: 8f 77 andi r24, 0x7F ; 127 25dbc: 89 83 std Y+1, r24 ; 0x01 return vol_->cacheFlush(); fail: writeError = true; return false; } 25dbe: df 91 pop r29 25dc0: cf 91 pop r28 d->lastAccessDate = d->lastWriteDate; } // clear directory dirty flags_ &= ~F_FILE_DIR_DIRTY; } return vol_->cacheFlush(); 25dc2: 0d 94 8e 29 jmp 0x2531c ; 0x2531c fail: writeError = true; 25dc6: 81 e0 ldi r24, 0x01 ; 1 25dc8: 88 83 st Y, r24 return false; } 25dca: 80 e0 ldi r24, 0x00 ; 0 25dcc: df 91 pop r29 25dce: cf 91 pop r28 25dd0: 08 95 ret 00025dd2 : * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include no file is open or an I/O error. */ bool SdBaseFile::close() { 25dd2: cf 93 push r28 25dd4: df 93 push r29 25dd6: ec 01 movw r28, r24 bool rtn = sync(); 25dd8: 0f 94 b4 2e call 0x25d68 ; 0x25d68 type_ = FAT_FILE_TYPE_CLOSED; 25ddc: 1b 82 std Y+3, r1 ; 0x03 return rtn; } 25dde: df 91 pop r29 25de0: cf 91 pop r28 25de2: 08 95 ret 00025de4 : * \param[out] name An array of 13 characters for the file's name. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool SdBaseFile::getFilename(char* name) { 25de4: cf 93 push r28 25de6: df 93 push r29 25de8: eb 01 movw r28, r22 25dea: fc 01 movw r30, r24 25dec: 23 81 ldd r18, Z+3 ; 0x03 if (!isOpen()) return false; 25dee: 21 11 cpse r18, r1 25df0: 04 c0 rjmp .+8 ; 0x25dfa 25df2: 80 e0 ldi r24, 0x00 ; 0 if (!p) return false; // format name dirName(*p, name); return true; } 25df4: df 91 pop r29 25df6: cf 91 pop r28 25df8: 08 95 ret bool isOpen() const {return type_ != FAT_FILE_TYPE_CLOSED;} /** \return True if this is a subdirectory else false. */ bool isSubDir() const {return type_ == FAT_FILE_TYPE_SUBDIR;} /** \return True if this is the root directory. */ bool isRoot() const { return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32; 25dfa: 22 50 subi r18, 0x02 ; 2 * the value zero, false, is returned for failure. */ bool SdBaseFile::getFilename(char* name) { if (!isOpen()) return false; if (isRoot()) { 25dfc: 22 30 cpi r18, 0x02 ; 2 25dfe: 28 f4 brcc .+10 ; 0x25e0a name[0] = '/'; 25e00: 8f e2 ldi r24, 0x2F ; 47 25e02: 88 83 st Y, r24 name[1] = '\0'; 25e04: 19 82 std Y+1, r1 ; 0x01 dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); if (!p) return false; // format name dirName(*p, name); return true; 25e06: 81 e0 ldi r24, 0x01 ; 1 25e08: f5 cf rjmp .-22 ; 0x25df4 name[0] = '/'; name[1] = '\0'; return true; } // cache entry dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); 25e0a: 60 e0 ldi r22, 0x00 ; 0 25e0c: 0f 94 9a 2e call 0x25d34 ; 0x25d34 if (!p) return false; 25e10: 00 97 sbiw r24, 0x00 ; 0 25e12: 79 f3 breq .-34 ; 0x25df2 25e14: dc 01 movw r26, r24 * * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ void SdBaseFile::dirName(const dir_t& dir, char* name) { uint8_t j = 0; 25e16: 60 e0 ldi r22, 0x00 ; 0 for (uint8_t i = 0; i < 11; i++) { 25e18: 80 e0 ldi r24, 0x00 ; 0 if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; 25e1a: 9e e2 ldi r25, 0x2E ; 46 * \param[out] name A 13 byte char array for the formatted name. */ void SdBaseFile::dirName(const dir_t& dir, char* name) { uint8_t j = 0; for (uint8_t i = 0; i < 11; i++) { if (dir.name[i] == ' ')continue; 25e1c: 2d 91 ld r18, X+ 25e1e: 20 32 cpi r18, 0x20 ; 32 25e20: 99 f0 breq .+38 ; 0x25e48 if (i == 8) name[j++] = '.'; 25e22: 88 30 cpi r24, 0x08 ; 8 25e24: 31 f4 brne .+12 ; 0x25e32 25e26: 9e 01 movw r18, r28 25e28: 26 0f add r18, r22 25e2a: 31 1d adc r19, r1 25e2c: f9 01 movw r30, r18 25e2e: 90 83 st Z, r25 25e30: 6f 5f subi r22, 0xFF ; 255 name[j++] = dir.name[i]; 25e32: 9e 01 movw r18, r28 25e34: 26 0f add r18, r22 25e36: 31 1d adc r19, r1 25e38: ad 01 movw r20, r26 25e3a: 41 50 subi r20, 0x01 ; 1 25e3c: 51 09 sbc r21, r1 25e3e: fa 01 movw r30, r20 25e40: 40 81 ld r20, Z 25e42: f9 01 movw r30, r18 25e44: 40 83 st Z, r20 25e46: 6f 5f subi r22, 0xFF ; 255 * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ void SdBaseFile::dirName(const dir_t& dir, char* name) { uint8_t j = 0; for (uint8_t i = 0; i < 11; i++) { 25e48: 8f 5f subi r24, 0xFF ; 255 25e4a: 8b 30 cpi r24, 0x0B ; 11 25e4c: 39 f7 brne .-50 ; 0x25e1c if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; } name[j] = 0; 25e4e: fe 01 movw r30, r28 25e50: e6 0f add r30, r22 25e52: f1 1d adc r31, r1 25e54: 10 82 st Z, r1 25e56: d7 cf rjmp .-82 ; 0x25e06 00025e58 : * if end of file is reached. * If an error occurs, read() returns -1. Possible errors include * read() called before a file has been opened, corrupt file system * or an I/O error occurred. */ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { 25e58: 2f 92 push r2 25e5a: 3f 92 push r3 25e5c: 4f 92 push r4 25e5e: 5f 92 push r5 25e60: 6f 92 push r6 25e62: 7f 92 push r7 25e64: 8f 92 push r8 25e66: 9f 92 push r9 25e68: af 92 push r10 25e6a: bf 92 push r11 25e6c: cf 92 push r12 25e6e: df 92 push r13 25e70: ef 92 push r14 25e72: ff 92 push r15 25e74: 0f 93 push r16 25e76: 1f 93 push r17 25e78: cf 93 push r28 25e7a: df 93 push r29 25e7c: 00 d0 rcall .+0 ; 0x25e7e 25e7e: 1f 92 push r1 25e80: cd b7 in r28, 0x3d ; 61 25e82: de b7 in r29, 0x3e ; 62 25e84: 9c 83 std Y+4, r25 ; 0x04 25e86: 8b 83 std Y+3, r24 ; 0x03 25e88: 4b 01 movw r8, r22 25e8a: 7a 01 movw r14, r20 uint16_t offset; uint16_t toRead; uint32_t block; // raw device block number // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) goto fail; 25e8c: dc 01 movw r26, r24 25e8e: 13 96 adiw r26, 0x03 ; 3 25e90: 8c 91 ld r24, X 25e92: 81 11 cpse r24, r1 25e94: 19 c0 rjmp .+50 ; 0x25ec8 toRead -= n; } return nbyte; fail: return -1; 25e96: 8f ef ldi r24, 0xFF ; 255 25e98: 9f ef ldi r25, 0xFF ; 255 } 25e9a: 0f 90 pop r0 25e9c: 0f 90 pop r0 25e9e: 0f 90 pop r0 25ea0: 0f 90 pop r0 25ea2: df 91 pop r29 25ea4: cf 91 pop r28 25ea6: 1f 91 pop r17 25ea8: 0f 91 pop r16 25eaa: ff 90 pop r15 25eac: ef 90 pop r14 25eae: df 90 pop r13 25eb0: cf 90 pop r12 25eb2: bf 90 pop r11 25eb4: af 90 pop r10 25eb6: 9f 90 pop r9 25eb8: 8f 90 pop r8 25eba: 7f 90 pop r7 25ebc: 6f 90 pop r6 25ebe: 5f 90 pop r5 25ec0: 4f 90 pop r4 25ec2: 3f 90 pop r3 25ec4: 2f 90 pop r2 25ec6: 08 95 ret uint16_t offset; uint16_t toRead; uint32_t block; // raw device block number // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) goto fail; 25ec8: eb 81 ldd r30, Y+3 ; 0x03 25eca: fc 81 ldd r31, Y+4 ; 0x04 25ecc: 81 81 ldd r24, Z+1 ; 0x01 25ece: 80 ff sbrs r24, 0 25ed0: e2 cf rjmp .-60 ; 0x25e96 // max bytes left in file if (nbyte >= (fileSize_ - curPosition_)) { 25ed2: 01 89 ldd r16, Z+17 ; 0x11 25ed4: 12 89 ldd r17, Z+18 ; 0x12 25ed6: 23 89 ldd r18, Z+19 ; 0x13 25ed8: 34 89 ldd r19, Z+20 ; 0x14 25eda: 40 85 ldd r20, Z+8 ; 0x08 25edc: 51 85 ldd r21, Z+9 ; 0x09 25ede: 62 85 ldd r22, Z+10 ; 0x0a 25ee0: 73 85 ldd r23, Z+11 ; 0x0b 25ee2: c7 01 movw r24, r14 25ee4: b0 e0 ldi r27, 0x00 ; 0 25ee6: a0 e0 ldi r26, 0x00 ; 0 25ee8: 28 01 movw r4, r16 25eea: 39 01 movw r6, r18 25eec: 44 1a sub r4, r20 25eee: 55 0a sbc r5, r21 25ef0: 66 0a sbc r6, r22 25ef2: 77 0a sbc r7, r23 25ef4: 84 15 cp r24, r4 25ef6: 95 05 cpc r25, r5 25ef8: a6 05 cpc r26, r6 25efa: b7 05 cpc r27, r7 25efc: 18 f0 brcs .+6 ; 0x25f04 nbyte = fileSize_ - curPosition_; 25efe: 78 01 movw r14, r16 25f00: e4 1a sub r14, r20 25f02: f5 0a sbc r15, r21 } // amount left to read toRead = nbyte; 25f04: 67 01 movw r12, r14 if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 25f06: 8b 81 ldd r24, Y+3 ; 0x03 25f08: 9c 81 ldd r25, Y+4 ; 0x04 25f0a: 04 96 adiw r24, 0x04 ; 4 25f0c: 9a 83 std Y+2, r25 ; 0x02 25f0e: 89 83 std Y+1, r24 ; 0x01 block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; } uint16_t n = toRead; // amount to be read from current block if (n > (512 - offset)) n = 512 - offset; 25f10: 61 2c mov r6, r1 25f12: 32 e0 ldi r19, 0x02 ; 2 25f14: 73 2e mov r7, r19 if (nbyte >= (fileSize_ - curPosition_)) { nbyte = fileSize_ - curPosition_; } // amount left to read toRead = nbyte; while (toRead > 0) { 25f16: c1 14 cp r12, r1 25f18: d1 04 cpc r13, r1 25f1a: 09 f4 brne .+2 ; 0x25f1e 25f1c: b7 c0 rjmp .+366 ; 0x2608c offset = curPosition_ & 0X1FF; // offset in block 25f1e: ab 81 ldd r26, Y+3 ; 0x03 25f20: bc 81 ldd r27, Y+4 ; 0x04 25f22: 18 96 adiw r26, 0x08 ; 8 25f24: 4d 91 ld r20, X+ 25f26: 5d 91 ld r21, X+ 25f28: 6d 91 ld r22, X+ 25f2a: 7c 91 ld r23, X 25f2c: 1b 97 sbiw r26, 0x0b ; 11 25f2e: 5a 01 movw r10, r20 25f30: b1 e0 ldi r27, 0x01 ; 1 25f32: bb 22 and r11, r27 25f34: eb 81 ldd r30, Y+3 ; 0x03 25f36: fc 81 ldd r31, Y+4 ; 0x04 25f38: 81 8d ldd r24, Z+25 ; 0x19 25f3a: 92 8d ldd r25, Z+26 ; 0x1a 25f3c: 1a 01 movw r2, r20 25f3e: 2b 01 movw r4, r22 25f40: 29 e0 ldi r18, 0x09 ; 9 25f42: 56 94 lsr r5 25f44: 47 94 ror r4 25f46: 37 94 ror r3 25f48: 27 94 ror r2 25f4a: 2a 95 dec r18 25f4c: d1 f7 brne .-12 ; 0x25f42 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 25f4e: 23 81 ldd r18, Z+3 ; 0x03 25f50: 22 30 cpi r18, 0x02 ; 2 25f52: 91 f5 brne .+100 ; 0x25fb8 block = vol_->rootDirStart() + (curPosition_ >> 9); 25f54: dc 01 movw r26, r24 25f56: 5a 96 adiw r26, 0x1a ; 26 25f58: 6d 91 ld r22, X+ 25f5a: 7d 91 ld r23, X+ 25f5c: 8d 91 ld r24, X+ 25f5e: 9c 91 ld r25, X 25f60: 5d 97 sbiw r26, 0x1d ; 29 25f62: 62 0d add r22, r2 25f64: 73 1d adc r23, r3 25f66: 84 1d adc r24, r4 25f68: 95 1d adc r25, r5 25f6a: 83 01 movw r16, r6 25f6c: 0a 19 sub r16, r10 25f6e: 1b 09 sbc r17, r11 25f70: c0 16 cp r12, r16 25f72: d1 06 cpc r13, r17 25f74: 08 f4 brcc .+2 ; 0x25f78 25f76: 86 01 movw r16, r12 // amount to be read from current block if (n > (512 - offset)) n = 512 - offset; // no buffering needed if n == 512 if (n == 512 && block != vol_->cacheBlockNumber()) { 25f78: 01 15 cp r16, r1 25f7a: b2 e0 ldi r27, 0x02 ; 2 25f7c: 1b 07 cpc r17, r27 25f7e: 71 f4 brne .+28 ; 0x25f9c 25f80: 20 91 3a 0e lds r18, 0x0E3A ; 0x800e3a 25f84: 30 91 3b 0e lds r19, 0x0E3B ; 0x800e3b 25f88: 40 91 3c 0e lds r20, 0x0E3C ; 0x800e3c 25f8c: 50 91 3d 0e lds r21, 0x0E3D ; 0x800e3d 25f90: 62 17 cp r22, r18 25f92: 73 07 cpc r23, r19 25f94: 84 07 cpc r24, r20 25f96: 95 07 cpc r25, r21 25f98: 09 f0 breq .+2 ; 0x25f9c 25f9a: 59 c0 rjmp .+178 ; 0x2604e if (!vol_->readBlock(block, dst)) goto fail; } else { // read block to cache and copy data to caller if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail; 25f9c: 40 e0 ldi r20, 0x00 ; 0 25f9e: 0f 94 86 2a call 0x2550c ; 0x2550c 25fa2: 88 23 and r24, r24 25fa4: 09 f4 brne .+2 ; 0x25fa8 25fa6: 77 cf rjmp .-274 ; 0x25e96 uint8_t* src = vol_->cache()->data + offset; 25fa8: b5 01 movw r22, r10 25faa: 6a 5b subi r22, 0xBA ; 186 25fac: 71 4f sbci r23, 0xF1 ; 241 memcpy(dst, src, n); 25fae: a8 01 movw r20, r16 25fb0: c4 01 movw r24, r8 25fb2: 0f 94 09 aa call 0x35412 ; 0x35412 25fb6: 57 c0 rjmp .+174 ; 0x26066 uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 //---------------------------------------------------------------------------- bool allocContiguous(uint32_t count, uint32_t* curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1);} 25fb8: fc 01 movw r30, r24 25fba: 14 81 ldd r17, Z+4 ; 0x04 25fbc: 11 50 subi r17, 0x01 ; 1 25fbe: 12 21 and r17, r2 offset = curPosition_ & 0X1FF; // offset in block if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { block = vol_->rootDirStart() + (curPosition_ >> 9); } else { uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); if (offset == 0 && blockOfCluster == 0) { 25fc0: a1 14 cp r10, r1 25fc2: b1 04 cpc r11, r1 25fc4: 81 f4 brne .+32 ; 0x25fe6 25fc6: 11 11 cpse r17, r1 25fc8: 0e c0 rjmp .+28 ; 0x25fe6 // start of new cluster if (curPosition_ == 0) { 25fca: 45 2b or r20, r21 25fcc: 46 2b or r20, r22 25fce: 47 2b or r20, r23 25fd0: 79 f5 brne .+94 ; 0x26030 // use first cluster in file curCluster_ = firstCluster_; 25fd2: eb 81 ldd r30, Y+3 ; 0x03 25fd4: fc 81 ldd r31, Y+4 ; 0x04 25fd6: 85 89 ldd r24, Z+21 ; 0x15 25fd8: 96 89 ldd r25, Z+22 ; 0x16 25fda: a7 89 ldd r26, Z+23 ; 0x17 25fdc: b0 8d ldd r27, Z+24 ; 0x18 25fde: 84 83 std Z+4, r24 ; 0x04 25fe0: 95 83 std Z+5, r25 ; 0x05 25fe2: a6 83 std Z+6, r26 ; 0x06 25fe4: b7 83 std Z+7, r27 ; 0x07 } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; } } block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; 25fe6: ab 81 ldd r26, Y+3 ; 0x03 25fe8: bc 81 ldd r27, Y+4 ; 0x04 25fea: 59 96 adiw r26, 0x19 ; 25 25fec: ed 91 ld r30, X+ 25fee: fc 91 ld r31, X 25ff0: 5a 97 sbiw r26, 0x1a ; 26 uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 25ff2: 14 96 adiw r26, 0x04 ; 4 25ff4: 6d 91 ld r22, X+ 25ff6: 7d 91 ld r23, X+ 25ff8: 8d 91 ld r24, X+ 25ffa: 9c 91 ld r25, X 25ffc: 17 97 sbiw r26, 0x07 ; 7 25ffe: 62 50 subi r22, 0x02 ; 2 26000: 71 09 sbc r23, r1 26002: 81 09 sbc r24, r1 26004: 91 09 sbc r25, r1 26006: 25 85 ldd r18, Z+13 ; 0x0d 26008: 04 c0 rjmp .+8 ; 0x26012 2600a: 66 0f add r22, r22 2600c: 77 1f adc r23, r23 2600e: 88 1f adc r24, r24 26010: 99 1f adc r25, r25 26012: 2a 95 dec r18 26014: d2 f7 brpl .-12 ; 0x2600a 26016: 26 85 ldd r18, Z+14 ; 0x0e 26018: 37 85 ldd r19, Z+15 ; 0x0f 2601a: 40 89 ldd r20, Z+16 ; 0x10 2601c: 51 89 ldd r21, Z+17 ; 0x11 2601e: 62 0f add r22, r18 26020: 73 1f adc r23, r19 26022: 84 1f adc r24, r20 26024: 95 1f adc r25, r21 26026: 61 0f add r22, r17 26028: 71 1d adc r23, r1 2602a: 81 1d adc r24, r1 2602c: 91 1d adc r25, r1 2602e: 9d cf rjmp .-198 ; 0x25f6a if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 26030: ab 81 ldd r26, Y+3 ; 0x03 26032: bc 81 ldd r27, Y+4 ; 0x04 26034: 14 96 adiw r26, 0x04 ; 4 26036: 4d 91 ld r20, X+ 26038: 5d 91 ld r21, X+ 2603a: 6d 91 ld r22, X+ 2603c: 7c 91 ld r23, X 2603e: 17 97 sbiw r26, 0x07 ; 7 26040: 29 81 ldd r18, Y+1 ; 0x01 26042: 3a 81 ldd r19, Y+2 ; 0x02 26044: 0f 94 55 2b call 0x256aa ; 0x256aa 26048: 81 11 cpse r24, r1 2604a: cd cf rjmp .-102 ; 0x25fe6 2604c: 24 cf rjmp .-440 ; 0x25e96 if (FAT12_SUPPORT && fatType_ == 12) return cluster >= FAT12EOC_MIN; if (fatType_ == 16) return cluster >= FAT16EOC_MIN; return cluster >= FAT32EOC_MIN; } bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst);} 2604e: 94 01 movw r18, r8 26050: ab 01 movw r20, r22 26052: bc 01 movw r22, r24 26054: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 26058: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 2605c: 0f 94 cd 29 call 0x2539a ; 0x2539a // amount to be read from current block if (n > (512 - offset)) n = 512 - offset; // no buffering needed if n == 512 if (n == 512 && block != vol_->cacheBlockNumber()) { if (!vol_->readBlock(block, dst)) goto fail; 26060: 88 23 and r24, r24 26062: 09 f4 brne .+2 ; 0x26066 26064: 18 cf rjmp .-464 ; 0x25e96 // read block to cache and copy data to caller if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail; uint8_t* src = vol_->cache()->data + offset; memcpy(dst, src, n); } dst += n; 26066: 80 0e add r8, r16 26068: 91 1e adc r9, r17 curPosition_ += n; 2606a: eb 81 ldd r30, Y+3 ; 0x03 2606c: fc 81 ldd r31, Y+4 ; 0x04 2606e: 80 85 ldd r24, Z+8 ; 0x08 26070: 91 85 ldd r25, Z+9 ; 0x09 26072: a2 85 ldd r26, Z+10 ; 0x0a 26074: b3 85 ldd r27, Z+11 ; 0x0b 26076: 80 0f add r24, r16 26078: 91 1f adc r25, r17 2607a: a1 1d adc r26, r1 2607c: b1 1d adc r27, r1 2607e: 80 87 std Z+8, r24 ; 0x08 26080: 91 87 std Z+9, r25 ; 0x09 26082: a2 87 std Z+10, r26 ; 0x0a 26084: b3 87 std Z+11, r27 ; 0x0b toRead -= n; 26086: c0 1a sub r12, r16 26088: d1 0a sbc r13, r17 2608a: 45 cf rjmp .-374 ; 0x25f16 } return nbyte; 2608c: c7 01 movw r24, r14 2608e: 05 cf rjmp .-502 ; 0x25e9a 00026090 : * A value of zero will be returned if end of file is reached. * If an error occurs, readDir() returns -1. Possible errors include * readDir() called before a directory has been opened, this is not * a directory file or an I/O error occurred. */ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { 26090: df 92 push r13 26092: ef 92 push r14 26094: ff 92 push r15 26096: 0f 93 push r16 26098: 1f 93 push r17 2609a: cf 93 push r28 2609c: df 93 push r29 2609e: 8c 01 movw r16, r24 260a0: eb 01 movw r28, r22 260a2: 7a 01 movw r14, r20 vfat_t *VFAT = (vfat_t*)dir; //Sanity check the VFAT entry. The first cluster is always set to zero. And th esequence number should be higher then 0 if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES) { //TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table. n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13; 260a4: 8d e0 ldi r24, 0x0D ; 13 260a6: d8 2e mov r13, r24 { longFilename[0] = '\0'; } while (1) { n = read(dir, sizeof(dir_t)); 260a8: 40 e2 ldi r20, 0x20 ; 32 260aa: 50 e0 ldi r21, 0x00 ; 0 260ac: be 01 movw r22, r28 260ae: c8 01 movw r24, r16 260b0: 0f 94 2c 2f call 0x25e58 ; 0x25e58 if (n != sizeof(dir_t)) return n == 0 ? 0 : -1; 260b4: 80 32 cpi r24, 0x20 ; 32 260b6: 91 05 cpc r25, r1 260b8: 71 f0 breq .+28 ; 0x260d6 260ba: 21 e0 ldi r18, 0x01 ; 1 260bc: 89 2b or r24, r25 260be: 09 f4 brne .+2 ; 0x260c2 260c0: 20 e0 ldi r18, 0x00 ; 0 260c2: 82 2f mov r24, r18 260c4: 81 95 neg r24 } } // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; } } 260c6: df 91 pop r29 260c8: cf 91 pop r28 260ca: 1f 91 pop r17 260cc: 0f 91 pop r16 260ce: ff 90 pop r15 260d0: ef 90 pop r14 260d2: df 90 pop r13 260d4: 08 95 ret while (1) { n = read(dir, sizeof(dir_t)); if (n != sizeof(dir_t)) return n == 0 ? 0 : -1; // last entry if DIR_NAME_FREE if (dir->name[0] == DIR_NAME_FREE) return 0; 260d6: 28 81 ld r18, Y 260d8: 22 23 and r18, r18 260da: 09 f4 brne .+2 ; 0x260de 260dc: 3f c0 rjmp .+126 ; 0x2615c // skip empty entries and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; 260de: 25 3e cpi r18, 0xE5 ; 229 260e0: 19 f3 breq .-58 ; 0x260a8 260e2: 2e 32 cpi r18, 0x2E ; 46 260e4: 09 f3 breq .-62 ; 0x260a8 //Fill the long filename if we have a long filename entry, // long filename entries are stored before the actual filename. if (DIR_IS_LONG_NAME(dir) && longFilename != NULL) 260e6: 3b 85 ldd r19, Y+11 ; 0x0b 260e8: 3f 73 andi r19, 0x3F ; 63 260ea: 3f 30 cpi r19, 0x0F ; 15 260ec: 99 f5 brne .+102 ; 0x26154 260ee: e1 14 cp r14, r1 260f0: f1 04 cpc r15, r1 260f2: 81 f1 breq .+96 ; 0x26154 { vfat_t *VFAT = (vfat_t*)dir; //Sanity check the VFAT entry. The first cluster is always set to zero. And th esequence number should be higher then 0 if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES) 260f4: 4a 8d ldd r20, Y+26 ; 0x1a 260f6: 5b 8d ldd r21, Y+27 ; 0x1b 260f8: 45 2b or r20, r21 260fa: 61 f5 brne .+88 ; 0x26154 260fc: 2f 71 andi r18, 0x1F ; 31 260fe: 3f ef ldi r19, 0xFF ; 255 26100: 32 0f add r19, r18 26102: 34 30 cpi r19, 0x04 ; 4 26104: 38 f5 brcc .+78 ; 0x26154 { //TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table. n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13; 26106: 21 50 subi r18, 0x01 ; 1 26108: 33 0b sbc r19, r19 2610a: d2 9e mul r13, r18 2610c: c0 01 movw r24, r0 2610e: d3 9e mul r13, r19 26110: 90 0d add r25, r0 26112: 11 24 eor r1, r1 longFilename[n+0] = VFAT->name1[0]; 26114: f7 01 movw r30, r14 26116: e8 0f add r30, r24 26118: f9 1f adc r31, r25 2611a: 29 81 ldd r18, Y+1 ; 0x01 2611c: 20 83 st Z, r18 longFilename[n+1] = VFAT->name1[1]; 2611e: 2b 81 ldd r18, Y+3 ; 0x03 26120: 21 83 std Z+1, r18 ; 0x01 longFilename[n+2] = VFAT->name1[2]; 26122: 2d 81 ldd r18, Y+5 ; 0x05 26124: 22 83 std Z+2, r18 ; 0x02 longFilename[n+3] = VFAT->name1[3]; 26126: 2f 81 ldd r18, Y+7 ; 0x07 26128: 23 83 std Z+3, r18 ; 0x03 longFilename[n+4] = VFAT->name1[4]; 2612a: 29 85 ldd r18, Y+9 ; 0x09 2612c: 24 83 std Z+4, r18 ; 0x04 longFilename[n+5] = VFAT->name2[0]; 2612e: 2e 85 ldd r18, Y+14 ; 0x0e 26130: 25 83 std Z+5, r18 ; 0x05 longFilename[n+6] = VFAT->name2[1]; 26132: 28 89 ldd r18, Y+16 ; 0x10 26134: 26 83 std Z+6, r18 ; 0x06 longFilename[n+7] = VFAT->name2[2]; 26136: 2a 89 ldd r18, Y+18 ; 0x12 26138: 27 83 std Z+7, r18 ; 0x07 longFilename[n+8] = VFAT->name2[3]; 2613a: 2c 89 ldd r18, Y+20 ; 0x14 2613c: 20 87 std Z+8, r18 ; 0x08 longFilename[n+9] = VFAT->name2[4]; 2613e: 2e 89 ldd r18, Y+22 ; 0x16 26140: 21 87 std Z+9, r18 ; 0x09 longFilename[n+10] = VFAT->name2[5]; 26142: 28 8d ldd r18, Y+24 ; 0x18 26144: 22 87 std Z+10, r18 ; 0x0a longFilename[n+11] = VFAT->name3[0]; 26146: 2c 8d ldd r18, Y+28 ; 0x1c 26148: 23 87 std Z+11, r18 ; 0x0b longFilename[n+12] = VFAT->name3[1]; 2614a: 2e 8d ldd r18, Y+30 ; 0x1e 2614c: 24 87 std Z+12, r18 ; 0x0c //If this VFAT entry is the last one, add a NUL terminator at the end of the string if (VFAT->sequenceNumber & 0x40) 2614e: 28 81 ld r18, Y 26150: 26 fd sbrc r18, 6 longFilename[n+13] = '\0'; 26152: 15 86 std Z+13, r1 ; 0x0d } } // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; 26154: 2b 85 ldd r18, Y+11 ; 0x0b 26156: 23 fd sbrc r18, 3 26158: a7 cf rjmp .-178 ; 0x260a8 2615a: b5 cf rjmp .-150 ; 0x260c6 while (1) { n = read(dir, sizeof(dir_t)); if (n != sizeof(dir_t)) return n == 0 ? 0 : -1; // last entry if DIR_NAME_FREE if (dir->name[0] == DIR_NAME_FREE) return 0; 2615c: 80 e0 ldi r24, 0x00 ; 0 2615e: b3 cf rjmp .-154 ; 0x260c6 00026160 : return false; } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { 26160: 4f 92 push r4 26162: 5f 92 push r5 26164: 6f 92 push r6 26166: 7f 92 push r7 26168: af 92 push r10 2616a: bf 92 push r11 2616c: cf 92 push r12 2616e: df 92 push r13 26170: ef 92 push r14 26172: ff 92 push r15 26174: 0f 93 push r16 26176: 1f 93 push r17 26178: cf 93 push r28 2617a: df 93 push r29 2617c: 1f 92 push r1 2617e: cd b7 in r28, 0x3d ; 61 26180: de b7 in r29, 0x3e ; 62 26182: 8c 01 movw r16, r24 26184: 7b 01 movw r14, r22 26186: 5a 01 movw r10, r20 26188: c2 2e mov r12, r18 bool emptyFound = false; bool fileFound = false; uint8_t index; dir_t* p; vol_ = dirFile->vol_; 2618a: db 01 movw r26, r22 2618c: 59 96 adiw r26, 0x19 ; 25 2618e: 8d 91 ld r24, X+ 26190: 9c 91 ld r25, X 26192: f8 01 movw r30, r16 26194: 92 8f std Z+26, r25 ; 0x1a 26196: 81 8f std Z+25, r24 ; 0x19 dirFile->rewind(); 26198: cb 01 movw r24, r22 2619a: 0e 94 a6 79 call 0xf34c ; 0xf34c } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { bool emptyFound = false; 2619e: 71 2c mov r7, r1 vol_ = dirFile->vol_; dirFile->rewind(); // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { 261a0: f7 01 movw r30, r14 261a2: 80 85 ldd r24, Z+8 ; 0x08 261a4: 91 85 ldd r25, Z+9 ; 0x09 261a6: a2 85 ldd r26, Z+10 ; 0x0a 261a8: b3 85 ldd r27, Z+11 ; 0x0b 261aa: 41 89 ldd r20, Z+17 ; 0x11 261ac: 52 89 ldd r21, Z+18 ; 0x12 261ae: 63 89 ldd r22, Z+19 ; 0x13 261b0: 74 89 ldd r23, Z+20 ; 0x14 261b2: 84 17 cp r24, r20 261b4: 95 07 cpc r25, r21 261b6: a6 07 cpc r26, r22 261b8: b7 07 cpc r27, r23 261ba: 08 f0 brcs .+2 ; 0x261be 261bc: 52 c0 rjmp .+164 ; 0x26262 index = 0XF & (dirFile->curPosition_ >> 5); 261be: 55 e0 ldi r21, 0x05 ; 5 261c0: b6 95 lsr r27 261c2: a7 95 ror r26 261c4: 97 95 ror r25 261c6: 87 95 ror r24 261c8: 5a 95 dec r21 261ca: d1 f7 brne .-12 ; 0x261c0 261cc: f8 2f mov r31, r24 261ce: ff 70 andi r31, 0x0F ; 15 261d0: df 2e mov r13, r31 // Read next directory entry into the cache // Assumes file is correctly positioned dir_t* SdBaseFile::readDirCache() { uint8_t i; // error if not directory if (!isDir()) goto fail; 261d2: d7 01 movw r26, r14 261d4: 13 96 adiw r26, 0x03 ; 3 261d6: 8c 91 ld r24, X 261d8: 82 30 cpi r24, 0x02 ; 2 261da: 10 f4 brcc .+4 ; 0x261e0 if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; fail: type_ = FAT_FILE_TYPE_CLOSED; return false; 261dc: 80 e0 ldi r24, 0x00 ; 0 261de: db c0 rjmp .+438 ; 0x26396 * \return For success read returns the next byte in the file as an int. * If an error occurs or end of file is reached -1 is returned. */ int16_t SdBaseFile::read() { uint8_t b; return read(&b, 1) == 1 ? b : -1; 261e0: 41 e0 ldi r20, 0x01 ; 1 261e2: 50 e0 ldi r21, 0x00 ; 0 261e4: be 01 movw r22, r28 261e6: 6f 5f subi r22, 0xFF ; 255 261e8: 7f 4f sbci r23, 0xFF ; 255 261ea: c7 01 movw r24, r14 261ec: 0f 94 2c 2f call 0x25e58 ; 0x25e58 261f0: 01 97 sbiw r24, 0x01 ; 1 261f2: a1 f7 brne .-24 ; 0x261dc // use read to locate and cache block if (read() < 0) goto fail; // advance to next entry curPosition_ += 31; 261f4: f7 01 movw r30, r14 261f6: 80 85 ldd r24, Z+8 ; 0x08 261f8: 91 85 ldd r25, Z+9 ; 0x09 261fa: a2 85 ldd r26, Z+10 ; 0x0a 261fc: b3 85 ldd r27, Z+11 ; 0x0b 261fe: 4f 96 adiw r24, 0x1f ; 31 26200: a1 1d adc r26, r1 26202: b1 1d adc r27, r1 26204: 80 87 std Z+8, r24 ; 0x08 26206: 91 87 std Z+9, r25 ; 0x09 26208: a2 87 std Z+10, r26 ; 0x0a 2620a: b3 87 std Z+11, r27 ; 0x0b // return pointer to entry return vol_->cache()->dir + i; 2620c: f0 e2 ldi r31, 0x20 ; 32 2620e: df 9e mul r13, r31 26210: b0 01 movw r22, r0 26212: 11 24 eor r1, r1 26214: 6a 5b subi r22, 0xBA ; 186 26216: 71 4f sbci r23, 0xF1 ; 241 // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { index = 0XF & (dirFile->curPosition_ >> 5); p = dirFile->readDirCache(); if (!p) goto fail; 26218: 61 15 cp r22, r1 2621a: 71 05 cpc r23, r1 2621c: f9 f2 breq .-66 ; 0x261dc if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { 2621e: db 01 movw r26, r22 26220: 8c 91 ld r24, X 26222: 88 23 and r24, r24 26224: 41 f0 breq .+16 ; 0x26236 26226: 85 3e cpi r24, 0xE5 ; 229 26228: 09 f0 breq .+2 ; 0x2622c 2622a: 4c c0 rjmp .+152 ; 0x262c4 // remember first empty slot if (!emptyFound) { 2622c: 77 20 and r7, r7 2622e: 29 f0 breq .+10 ; 0x2623a return false; } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { 26230: 77 24 eor r7, r7 26232: 73 94 inc r7 26234: b5 cf rjmp .-150 ; 0x261a0 p = dirFile->readDirCache(); if (!p) goto fail; if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { // remember first empty slot if (!emptyFound) { 26236: 71 10 cpse r7, r1 26238: 0e c0 rjmp .+28 ; 0x26256 dirBlock_ = dirFile->vol_->cacheBlockNumber(); 2623a: 80 91 3a 0e lds r24, 0x0E3A ; 0x800e3a 2623e: 90 91 3b 0e lds r25, 0x0E3B ; 0x800e3b 26242: a0 91 3c 0e lds r26, 0x0E3C ; 0x800e3c 26246: b0 91 3d 0e lds r27, 0x0E3D ; 0x800e3d 2624a: f8 01 movw r30, r16 2624c: 84 87 std Z+12, r24 ; 0x0c 2624e: 95 87 std Z+13, r25 ; 0x0d 26250: a6 87 std Z+14, r26 ; 0x0e 26252: b7 87 std Z+15, r27 ; 0x0f dirIndex_ = index; 26254: d0 8a std Z+16, r13 ; 0x10 emptyFound = true; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; 26256: db 01 movw r26, r22 26258: 8c 91 ld r24, X 2625a: 81 11 cpse r24, r1 2625c: e9 cf rjmp .-46 ; 0x26230 2625e: 77 24 eor r7, r7 26260: 73 94 inc r7 if (fileFound) { // don't open existing file if O_EXCL if (oflag & O_EXCL) goto fail; } else { // don't create unless O_CREAT and O_WRITE if (!(oflag & O_CREAT) || !(oflag & O_WRITE)) goto fail; 26262: 8c 2d mov r24, r12 26264: 82 74 andi r24, 0x42 ; 66 26266: 82 34 cpi r24, 0x42 ; 66 26268: 09 f0 breq .+2 ; 0x2626c 2626a: b8 cf rjmp .-144 ; 0x261dc if (emptyFound) { 2626c: 77 20 and r7, r7 2626e: 09 f4 brne .+2 ; 0x26272 26270: a2 c0 rjmp .+324 ; 0x263b6 index = dirIndex_; 26272: f8 01 movw r30, r16 26274: d0 88 ldd r13, Z+16 ; 0x10 p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 26276: 61 e0 ldi r22, 0x01 ; 1 26278: c8 01 movw r24, r16 2627a: 0f 94 9a 2e call 0x25d34 ; 0x25d34 if (!p) goto fail; 2627e: 00 97 sbiw r24, 0x00 ; 0 26280: 09 f4 brne .+2 ; 0x26284 26282: ac cf rjmp .-168 ; 0x261dc // use first entry in cluster p = dirFile->vol_->cache()->dir; index = 0; } // initialize as empty file memset(p, 0, sizeof(dir_t)); 26284: 20 e2 ldi r18, 0x20 ; 32 26286: dc 01 movw r26, r24 26288: 1d 92 st X+, r1 2628a: 2a 95 dec r18 2628c: e9 f7 brne .-6 ; 0x26288 memcpy(p->name, dname, 11); 2628e: 2b e0 ldi r18, 0x0B ; 11 26290: f5 01 movw r30, r10 26292: dc 01 movw r26, r24 26294: 01 90 ld r0, Z+ 26296: 0d 92 st X+, r0 26298: 2a 95 dec r18 2629a: e1 f7 brne .-8 ; 0x26294 if (dateTime_) { // call user date/time function dateTime_(&p->creationDate, &p->creationTime); } else { // use default date/time p->creationDate = FAT_DEFAULT_DATE; 2629c: 21 e2 ldi r18, 0x21 ; 33 2629e: 38 e2 ldi r19, 0x28 ; 40 262a0: fc 01 movw r30, r24 262a2: 31 8b std Z+17, r19 ; 0x11 262a4: 20 8b std Z+16, r18 ; 0x10 p->creationTime = FAT_DEFAULT_TIME; 262a6: 40 e0 ldi r20, 0x00 ; 0 262a8: 58 e0 ldi r21, 0x08 ; 8 262aa: 57 87 std Z+15, r21 ; 0x0f 262ac: 46 87 std Z+14, r20 ; 0x0e } p->lastAccessDate = p->creationDate; 262ae: 33 8b std Z+19, r19 ; 0x13 262b0: 22 8b std Z+18, r18 ; 0x12 p->lastWriteDate = p->creationDate; 262b2: 31 8f std Z+25, r19 ; 0x19 262b4: 20 8f std Z+24, r18 ; 0x18 p->lastWriteTime = p->creationTime; 262b6: 57 8b std Z+23, r21 ; 0x17 262b8: 46 8b std Z+22, r20 ; 0x16 // write entry to SD if (!dirFile->vol_->cacheFlush()) goto fail; 262ba: 0f 94 8e 29 call 0x2531c ; 0x2531c 262be: 81 11 cpse r24, r1 262c0: 09 c0 rjmp .+18 ; 0x262d4 262c2: 8c cf rjmp .-232 ; 0x261dc dirIndex_ = index; emptyFound = true; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; } else if (!memcmp(dname, p->name, 11)) { 262c4: 4b e0 ldi r20, 0x0B ; 11 262c6: 50 e0 ldi r21, 0x00 ; 0 262c8: c5 01 movw r24, r10 262ca: 0f 94 fc a9 call 0x353f8 ; 0x353f8 262ce: 89 2b or r24, r25 262d0: 09 f0 breq .+2 ; 0x262d4 262d2: 66 cf rjmp .-308 ; 0x261a0 } //------------------------------------------------------------------------------ // open a cached directory entry. Assumes vol_ is initialized bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { // location of entry in cache dir_t* p = &vol_->cache()->dir[dirIndex]; 262d4: f0 e2 ldi r31, 0x20 ; 32 262d6: df 9e mul r13, r31 262d8: d0 01 movw r26, r0 262da: 11 24 eor r1, r1 262dc: 9d 01 movw r18, r26 262de: 2a 5b subi r18, 0xBA ; 186 262e0: 31 4f sbci r19, 0xF1 ; 241 // write or truncate is an error for a directory or read-only file if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { 262e2: f9 01 movw r30, r18 262e4: 83 85 ldd r24, Z+11 ; 0x0b 262e6: 81 71 andi r24, 0x11 ; 17 262e8: 21 f0 breq .+8 ; 0x262f2 if (oflag & (O_WRITE | O_TRUNC)) goto fail; 262ea: 8c 2d mov r24, r12 262ec: 82 71 andi r24, 0x12 ; 18 262ee: 09 f0 breq .+2 ; 0x262f2 262f0: fc c0 rjmp .+504 ; 0x264ea } //------------------------------------------------------------------------------ // open a cached directory entry. Assumes vol_ is initialized bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { // location of entry in cache dir_t* p = &vol_->cache()->dir[dirIndex]; 262f2: f8 01 movw r30, r16 262f4: 81 8d ldd r24, Z+25 ; 0x19 262f6: 92 8d ldd r25, Z+26 ; 0x1a // write or truncate is an error for a directory or read-only file if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { if (oflag & (O_WRITE | O_TRUNC)) goto fail; } // remember location of directory entry on SD dirBlock_ = vol_->cacheBlockNumber(); 262f8: 40 91 3a 0e lds r20, 0x0E3A ; 0x800e3a 262fc: 50 91 3b 0e lds r21, 0x0E3B ; 0x800e3b 26300: 60 91 3c 0e lds r22, 0x0E3C ; 0x800e3c 26304: 70 91 3d 0e lds r23, 0x0E3D ; 0x800e3d 26308: 44 87 std Z+12, r20 ; 0x0c 2630a: 55 87 std Z+13, r21 ; 0x0d 2630c: 66 87 std Z+14, r22 ; 0x0e 2630e: 77 87 std Z+15, r23 ; 0x0f dirIndex_ = dirIndex; 26310: d0 8a std Z+16, r13 ; 0x10 // copy first cluster number for directory fields firstCluster_ = (uint32_t)p->firstClusterHigh << 16; 26312: fd 01 movw r30, r26 26314: ea 5b subi r30, 0xBA ; 186 26316: f1 4f sbci r31, 0xF1 ; 241 26318: 44 88 ldd r4, Z+20 ; 0x14 2631a: 55 88 ldd r5, Z+21 ; 0x15 2631c: 71 2c mov r7, r1 2631e: 61 2c mov r6, r1 26320: 32 01 movw r6, r4 26322: 55 24 eor r5, r5 26324: 44 24 eor r4, r4 26326: d8 01 movw r26, r16 26328: 55 96 adiw r26, 0x15 ; 21 2632a: 4d 92 st X+, r4 2632c: 5d 92 st X+, r5 2632e: 6d 92 st X+, r6 26330: 7c 92 st X, r7 26332: 58 97 sbiw r26, 0x18 ; 24 firstCluster_ |= p->firstClusterLow; 26334: 42 8d ldd r20, Z+26 ; 0x1a 26336: 53 8d ldd r21, Z+27 ; 0x1b 26338: 70 e0 ldi r23, 0x00 ; 0 2633a: 60 e0 ldi r22, 0x00 ; 0 2633c: 44 29 or r20, r4 2633e: 55 29 or r21, r5 26340: 66 29 or r22, r6 26342: 77 29 or r23, r7 26344: 55 96 adiw r26, 0x15 ; 21 26346: 4d 93 st X+, r20 26348: 5d 93 st X+, r21 2634a: 6d 93 st X+, r22 2634c: 7c 93 st X, r23 2634e: 58 97 sbiw r26, 0x18 ; 24 26350: d9 01 movw r26, r18 26352: 1b 96 adiw r26, 0x0b ; 11 26354: 2c 91 ld r18, X 26356: 28 71 andi r18, 0x18 ; 24 // make sure it is a normal file or subdirectory if (DIR_IS_FILE(p)) { 26358: 09 f0 breq .+2 ; 0x2635c 2635a: b9 c0 rjmp .+370 ; 0x264ce fileSize_ = p->fileSize; 2635c: 84 8d ldd r24, Z+28 ; 0x1c 2635e: 95 8d ldd r25, Z+29 ; 0x1d 26360: a6 8d ldd r26, Z+30 ; 0x1e 26362: b7 8d ldd r27, Z+31 ; 0x1f 26364: f8 01 movw r30, r16 26366: 81 8b std Z+17, r24 ; 0x11 26368: 92 8b std Z+18, r25 ; 0x12 2636a: a3 8b std Z+19, r26 ; 0x13 2636c: b4 8b std Z+20, r27 ; 0x14 type_ = FAT_FILE_TYPE_NORMAL; 2636e: 81 e0 ldi r24, 0x01 ; 1 26370: 83 83 std Z+3, r24 ; 0x03 type_ = FAT_FILE_TYPE_SUBDIR; } else { goto fail; } // save open flags for read/write flags_ = oflag & F_OFLAG; 26372: 8c 2d mov r24, r12 26374: 8f 70 andi r24, 0x0F ; 15 26376: f8 01 movw r30, r16 26378: 81 83 std Z+1, r24 ; 0x01 // set to start of file curCluster_ = 0; 2637a: 14 82 std Z+4, r1 ; 0x04 2637c: 15 82 std Z+5, r1 ; 0x05 2637e: 16 82 std Z+6, r1 ; 0x06 26380: 17 82 std Z+7, r1 ; 0x07 curPosition_ = 0; 26382: 10 86 std Z+8, r1 ; 0x08 26384: 11 86 std Z+9, r1 ; 0x09 26386: 12 86 std Z+10, r1 ; 0x0a 26388: 13 86 std Z+11, r1 ; 0x0b if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; 2638a: 81 e0 ldi r24, 0x01 ; 1 flags_ = oflag & F_OFLAG; // set to start of file curCluster_ = 0; curPosition_ = 0; if ((oflag & O_TRUNC) && !truncate(0)) return false; 2638c: c4 fe sbrs r12, 4 2638e: 03 c0 rjmp .+6 ; 0x26396 26390: c8 01 movw r24, r16 26392: 0f 94 f8 68 call 0x2d1f0 ; 0x2d1f0 // open entry in cache return openCachedEntry(index, oflag); fail: return false; } 26396: 0f 90 pop r0 26398: df 91 pop r29 2639a: cf 91 pop r28 2639c: 1f 91 pop r17 2639e: 0f 91 pop r16 263a0: ff 90 pop r15 263a2: ef 90 pop r14 263a4: df 90 pop r13 263a6: cf 90 pop r12 263a8: bf 90 pop r11 263aa: af 90 pop r10 263ac: 7f 90 pop r7 263ae: 6f 90 pop r6 263b0: 5f 90 pop r5 263b2: 4f 90 pop r4 263b4: 08 95 ret if (emptyFound) { index = dirIndex_; p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); if (!p) goto fail; } else { if (dirFile->type_ == FAT_FILE_TYPE_ROOT_FIXED) goto fail; 263b6: d7 01 movw r26, r14 263b8: 13 96 adiw r26, 0x03 ; 3 263ba: 8c 91 ld r24, X 263bc: 13 97 sbiw r26, 0x03 ; 3 263be: 82 30 cpi r24, 0x02 ; 2 263c0: 09 f4 brne .+2 ; 0x263c4 263c2: 0c cf rjmp .-488 ; 0x261dc // Add a cluster to a directory file and zero the cluster. // return with first block of cluster in the cache bool SdBaseFile::addDirCluster() { uint32_t block; // max folder size if (fileSize_/sizeof(dir_t) >= 0XFFFF) goto fail; 263c4: 51 96 adiw r26, 0x11 ; 17 263c6: 8d 91 ld r24, X+ 263c8: 9d 91 ld r25, X+ 263ca: 0d 90 ld r0, X+ 263cc: bc 91 ld r27, X 263ce: a0 2d mov r26, r0 263d0: 80 3e cpi r24, 0xE0 ; 224 263d2: 9f 4f sbci r25, 0xFF ; 255 263d4: af 41 sbci r26, 0x1F ; 31 263d6: b1 05 cpc r27, r1 263d8: 08 f0 brcs .+2 ; 0x263dc 263da: 00 cf rjmp .-512 ; 0x261dc if (!addCluster()) goto fail; 263dc: c7 01 movw r24, r14 263de: 0f 94 9f 2d call 0x25b3e ; 0x25b3e 263e2: 88 23 and r24, r24 263e4: 09 f4 brne .+2 ; 0x263e8 263e6: fa ce rjmp .-524 ; 0x261dc if (!vol_->cacheFlush()) goto fail; 263e8: 0f 94 8e 29 call 0x2531c ; 0x2531c 263ec: 88 23 and r24, r24 263ee: 09 f4 brne .+2 ; 0x263f2 263f0: f5 ce rjmp .-534 ; 0x261dc block = vol_->clusterStartBlock(curCluster_); 263f2: d7 01 movw r26, r14 263f4: 59 96 adiw r26, 0x19 ; 25 263f6: ed 91 ld r30, X+ 263f8: fc 91 ld r31, X 263fa: 5a 97 sbiw r26, 0x1a ; 26 //---------------------------------------------------------------------------- bool allocContiguous(uint32_t count, uint32_t* curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1);} uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 263fc: 14 96 adiw r26, 0x04 ; 4 263fe: 4d 90 ld r4, X+ 26400: 5d 90 ld r5, X+ 26402: 6d 90 ld r6, X+ 26404: 7c 90 ld r7, X 26406: 17 97 sbiw r26, 0x07 ; 7 26408: b2 e0 ldi r27, 0x02 ; 2 2640a: 4b 1a sub r4, r27 2640c: 51 08 sbc r5, r1 2640e: 61 08 sbc r6, r1 26410: 71 08 sbc r7, r1 26412: 85 85 ldd r24, Z+13 ; 0x0d 26414: 04 c0 rjmp .+8 ; 0x2641e 26416: 44 0c add r4, r4 26418: 55 1c adc r5, r5 2641a: 66 1c adc r6, r6 2641c: 77 1c adc r7, r7 2641e: 8a 95 dec r24 26420: d2 f7 brpl .-12 ; 0x26416 26422: 86 85 ldd r24, Z+14 ; 0x0e 26424: 97 85 ldd r25, Z+15 ; 0x0f 26426: a0 89 ldd r26, Z+16 ; 0x10 26428: b1 89 ldd r27, Z+17 ; 0x11 2642a: 48 0e add r4, r24 2642c: 59 1e adc r5, r25 2642e: 6a 1e adc r6, r26 26430: 7b 1e adc r7, r27 static bool cacheFlush(); static bool cacheRawBlock(uint32_t blockNumber, bool dirty); #endif // USE_MULTIPLE_CARDS // used by SdBaseFile write to assign cache to SD location void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) { cacheDirty_ = dirty; 26432: 81 e0 ldi r24, 0x01 ; 1 26434: 80 93 42 0e sts 0x0E42, r24 ; 0x800e42 cacheBlockNumber_ = blockNumber; 26438: 40 92 3a 0e sts 0x0E3A, r4 ; 0x800e3a 2643c: 50 92 3b 0e sts 0x0E3B, r5 ; 0x800e3b 26440: 60 92 3c 0e sts 0x0E3C, r6 ; 0x800e3c 26444: 70 92 3d 0e sts 0x0E3D, r7 ; 0x800e3d // set cache to first block of cluster vol_->cacheSetBlockNumber(block, true); // zero first block of cluster memset(vol_->cacheBuffer_.data, 0, 512); 26448: e6 e4 ldi r30, 0x46 ; 70 2644a: fe e0 ldi r31, 0x0E ; 14 2644c: 80 e0 ldi r24, 0x00 ; 0 2644e: 92 e0 ldi r25, 0x02 ; 2 26450: df 01 movw r26, r30 26452: 9c 01 movw r18, r24 26454: 1d 92 st X+, r1 26456: 21 50 subi r18, 0x01 ; 1 26458: 30 40 sbci r19, 0x00 ; 0 2645a: e1 f7 brne .-8 ; 0x26454 // zero rest of cluster for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { 2645c: dd 24 eor r13, r13 2645e: d3 94 inc r13 26460: d7 01 movw r26, r14 26462: 59 96 adiw r26, 0x19 ; 25 26464: ed 91 ld r30, X+ 26466: fc 91 ld r31, X 26468: 84 81 ldd r24, Z+4 ; 0x04 2646a: d8 16 cp r13, r24 2646c: 98 f4 brcc .+38 ; 0x26494 return cluster >= FAT32EOC_MIN; } bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst);} bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); 2646e: 26 e4 ldi r18, 0x46 ; 70 26470: 3e e0 ldi r19, 0x0E ; 14 26472: b3 01 movw r22, r6 26474: a2 01 movw r20, r4 26476: 4d 0d add r20, r13 26478: 51 1d adc r21, r1 2647a: 61 1d adc r22, r1 2647c: 71 1d adc r23, r1 2647e: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 26482: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 26486: 0f 94 2a 29 call 0x25254 ; 0x25254 if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail; 2648a: 88 23 and r24, r24 2648c: 09 f4 brne .+2 ; 0x26490 2648e: a6 ce rjmp .-692 ; 0x261dc // zero first block of cluster memset(vol_->cacheBuffer_.data, 0, 512); // zero rest of cluster for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { 26490: d3 94 inc r13 26492: e6 cf rjmp .-52 ; 0x26460 if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail; } // Increase directory file size by cluster size fileSize_ += 512UL << vol_->clusterSizeShift_; 26494: 25 85 ldd r18, Z+13 ; 0x0d 26496: 80 e0 ldi r24, 0x00 ; 0 26498: 92 e0 ldi r25, 0x02 ; 2 2649a: a0 e0 ldi r26, 0x00 ; 0 2649c: b0 e0 ldi r27, 0x00 ; 0 2649e: 04 c0 rjmp .+8 ; 0x264a8 264a0: 88 0f add r24, r24 264a2: 99 1f adc r25, r25 264a4: aa 1f adc r26, r26 264a6: bb 1f adc r27, r27 264a8: 2a 95 dec r18 264aa: d2 f7 brpl .-12 ; 0x264a0 264ac: f7 01 movw r30, r14 264ae: 41 89 ldd r20, Z+17 ; 0x11 264b0: 52 89 ldd r21, Z+18 ; 0x12 264b2: 63 89 ldd r22, Z+19 ; 0x13 264b4: 74 89 ldd r23, Z+20 ; 0x14 264b6: 84 0f add r24, r20 264b8: 95 1f adc r25, r21 264ba: a6 1f adc r26, r22 264bc: b7 1f adc r27, r23 264be: 81 8b std Z+17, r24 ; 0x11 264c0: 92 8b std Z+18, r25 ; 0x12 264c2: a3 8b std Z+19, r26 ; 0x13 264c4: b4 8b std Z+20, r27 ; 0x14 // add and zero cluster for dirFile - first cluster is in cache for write if (!dirFile->addDirCluster()) goto fail; // use first entry in cluster p = dirFile->vol_->cache()->dir; 264c6: 86 e4 ldi r24, 0x46 ; 70 264c8: 9e e0 ldi r25, 0x0E ; 14 index = 0; 264ca: d1 2c mov r13, r1 264cc: db ce rjmp .-586 ; 0x26284 // make sure it is a normal file or subdirectory if (DIR_IS_FILE(p)) { fileSize_ = p->fileSize; type_ = FAT_FILE_TYPE_NORMAL; } else if (DIR_IS_SUBDIR(p)) { 264ce: 20 31 cpi r18, 0x10 ; 16 264d0: 61 f4 brne .+24 ; 0x264ea if (!vol_->chainSize(firstCluster_, &fileSize_)) goto fail; 264d2: 98 01 movw r18, r16 264d4: 2f 5e subi r18, 0xEF ; 239 264d6: 3f 4f sbci r19, 0xFF ; 255 264d8: 0f 94 d8 2b call 0x257b0 ; 0x257b0 264dc: 88 23 and r24, r24 264de: 29 f0 breq .+10 ; 0x264ea type_ = FAT_FILE_TYPE_SUBDIR; 264e0: 84 e0 ldi r24, 0x04 ; 4 264e2: d8 01 movw r26, r16 264e4: 13 96 adiw r26, 0x03 ; 3 264e6: 8c 93 st X, r24 264e8: 44 cf rjmp .-376 ; 0x26372 curPosition_ = 0; if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; fail: type_ = FAT_FILE_TYPE_CLOSED; 264ea: d8 01 movw r26, r16 264ec: 13 96 adiw r26, 0x03 ; 3 264ee: 1c 92 st X, r1 264f0: 75 ce rjmp .-790 ; 0x261dc 000264f2 : } } #endif //PRUSA_M28 void prusa_statistics(uint8_t _message) { 264f2: cf 93 push r28 const uint8_t _fil_nr = 0; if (!farm_mode) 264f4: 90 91 60 0d lds r25, 0x0D60 ; 0x800d60 264f8: 99 23 and r25, r25 264fa: 09 f4 brne .+2 ; 0x264fe 264fc: f6 c0 rjmp .+492 ; 0x266ea 264fe: c8 2f mov r28, r24 return; switch (_message) { 26500: 87 30 cpi r24, 0x07 ; 7 26502: 09 f4 brne .+2 ; 0x26506 26504: be c0 rjmp .+380 ; 0x26682 26506: 08 f0 brcs .+2 ; 0x2650a 26508: 46 c0 rjmp .+140 ; 0x26596 2650a: 83 30 cpi r24, 0x03 ; 3 2650c: 09 f4 brne .+2 ; 0x26510 2650e: ed c0 rjmp .+474 ; 0x266ea 26510: 80 f5 brcc .+96 ; 0x26572 26512: 81 30 cpi r24, 0x01 ; 1 26514: 09 f4 brne .+2 ; 0x26518 26516: 88 c0 rjmp .+272 ; 0x26628 26518: 08 f4 brcc .+2 ; 0x2651c 2651a: 60 c0 rjmp .+192 ; 0x265dc 2651c: 8b e7 ldi r24, 0x7B ; 123 2651e: 0e 94 b1 79 call 0xf362 ; 0xf362 farm_timer = 1; break; case 2: // heating done SERIAL_ECHO('{'); prusa_stat_printerstatus(3); 26522: 83 e0 ldi r24, 0x03 ; 3 26524: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 26528: 0f 94 50 08 call 0x210a0 ; 0x210a0 2652c: 8d e7 ldi r24, 0x7D ; 125 2652e: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 26532: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_ECHOLN('}'); status_number = 3; 26536: c3 e0 ldi r28, 0x03 ; 3 26538: c0 93 bd 04 sts 0x04BD, r28 ; 0x8004bd <_ZL13status_number.lto_priv.492> farm_timer = 1; 2653c: 81 e0 ldi r24, 0x01 ; 1 2653e: 80 93 74 02 sts 0x0274, r24 ; 0x800274 if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) { 26542: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 26546: 81 11 cpse r24, r1 26548: 05 c0 rjmp .+10 ; 0x26554 2654a: 80 91 94 03 lds r24, 0x0394 ; 0x800394 2654e: 88 23 and r24, r24 26550: 09 f4 brne .+2 ; 0x26554 26552: 78 c0 rjmp .+240 ; 0x26644 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 26554: 8b e7 ldi r24, 0x7B ; 123 26556: 0e 94 b1 79 call 0xf362 ; 0xf362 SERIAL_ECHO('{'); prusa_stat_printerstatus(4); 2655a: 84 e0 ldi r24, 0x04 ; 4 2655c: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 26560: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 4; 26564: 84 e0 ldi r24, 0x04 ; 4 26566: 80 93 bd 04 sts 0x04BD, r24 ; 0x8004bd <_ZL13status_number.lto_priv.492> SERIAL_ECHO('{'); prusa_stat_printerstatus(3); prusa_stat_farm_number(); status_number = 3; } farm_timer = 1; 2656a: 81 e0 ldi r24, 0x01 ; 1 SERIAL_ECHOPGM("{[RES:1][FIL:"); MYSERIAL.print(int(_fil_nr)); SERIAL_ECHO(']'); prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); farm_timer = 2; 2656c: 80 93 74 02 sts 0x0274, r24 ; 0x800274 26570: 1e c0 rjmp .+60 ; 0x265ae void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 26572: 85 30 cpi r24, 0x05 ; 5 26574: 09 f4 brne .+2 ; 0x26578 26576: 71 c0 rjmp .+226 ; 0x2665a // must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function // saved a considerable amount of FLASH return; break; case 4: // print succesfull SERIAL_ECHOPGM("{[RES:1][FIL:"); 26578: 8d e7 ldi r24, 0x7D ; 125 2657a: 99 e8 ldi r25, 0x89 ; 137 void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 2657c: c6 30 cpi r28, 0x06 ; 6 2657e: 08 f4 brcc .+2 ; 0x26582 26580: 6e c0 rjmp .+220 ; 0x2665e prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); farm_timer = 2; break; case 6: // print done SERIAL_ECHOPGM("{[PRN:8]"); 26582: 86 e6 ldi r24, 0x66 ; 102 26584: 99 e8 ldi r25, 0x89 ; 137 26586: 0e 94 c4 7a call 0xf588 ; 0xf588 prusa_stat_farm_number(); 2658a: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 8; 2658e: 88 e0 ldi r24, 0x08 ; 8 farm_timer = 2; break; case 7: // print done - stopped SERIAL_ECHOPGM("{[PRN:9]"); prusa_stat_farm_number(); status_number = 9; 26590: 80 93 bd 04 sts 0x04BD, r24 ; 0x8004bd <_ZL13status_number.lto_priv.492> 26594: 74 c0 rjmp .+232 ; 0x2667e void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 26596: 86 31 cpi r24, 0x16 ; 22 26598: 09 f4 brne .+2 ; 0x2659c 2659a: 9b c0 rjmp .+310 ; 0x266d2 2659c: 70 f4 brcc .+28 ; 0x265ba 2659e: 84 31 cpi r24, 0x14 ; 20 265a0: 09 f4 brne .+2 ; 0x265a4 265a2: 80 c0 rjmp .+256 ; 0x266a4 265a4: 08 f0 brcs .+2 ; 0x265a8 265a6: 89 c0 rjmp .+274 ; 0x266ba 265a8: 88 30 cpi r24, 0x08 ; 8 265aa: 09 f4 brne .+2 ; 0x265ae 265ac: 72 c0 rjmp .+228 ; 0x26692 265ae: 8d e7 ldi r24, 0x7D ; 125 265b0: 0e 94 b1 79 call 0xf362 ; 0xf362 prusa_stat_temperatures(); prusa_stat_farm_number(); break; } SERIAL_ECHOLN('}'); } 265b4: cf 91 pop r28 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 265b6: 0c 94 bc 7a jmp 0xf578 ; 0xf578 void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 265ba: 8b 35 cpi r24, 0x5B ; 91 265bc: 09 f4 brne .+2 ; 0x265c0 265be: 91 c0 rjmp .+290 ; 0x266e2 265c0: 30 f4 brcc .+12 ; 0x265ce prusa_stat_farm_number(); status_number = 5; break; case 90: // Error - Thermal Runaway prusa_statistics_err('1'); 265c2: 81 e3 ldi r24, 0x31 ; 49 void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 265c4: ca 35 cpi r28, 0x5A ; 90 265c6: 99 f7 brne .-26 ; 0x265ae break; case 92: // Error - Min temp prusa_statistics_err('3'); break; case 93: // Error - Max temp prusa_statistics_err('4'); 265c8: 0f 94 b6 08 call 0x2116c ; 0x2116c 265cc: f0 cf rjmp .-32 ; 0x265ae void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 265ce: 8c 35 cpi r24, 0x5C ; 92 265d0: 09 f4 brne .+2 ; 0x265d4 265d2: 89 c0 rjmp .+274 ; 0x266e6 break; case 92: // Error - Min temp prusa_statistics_err('3'); break; case 93: // Error - Max temp prusa_statistics_err('4'); 265d4: 84 e3 ldi r24, 0x34 ; 52 void prusa_statistics(uint8_t _message) { const uint8_t _fil_nr = 0; if (!farm_mode) return; switch (_message) { 265d6: cd 35 cpi r28, 0x5D ; 93 265d8: b9 f3 breq .-18 ; 0x265c8 265da: e9 cf rjmp .-46 ; 0x265ae case 0: // default message if (busy_state == PAUSED_FOR_USER) { 265dc: 80 91 78 02 lds r24, 0x0278 ; 0x800278 265e0: 84 30 cpi r24, 0x04 ; 4 265e2: 21 f4 brne .+8 ; 0x265ec prusa_statistics_case0(15); 265e4: 8f e0 ldi r24, 0x0F ; 15 } else if (printingIsPaused()) { prusa_statistics_case0(14); 265e6: 0f 94 7f 18 call 0x230fe ; 0x230fe 265ea: e1 cf rjmp .-62 ; 0x265ae switch (_message) { case 0: // default message if (busy_state == PAUSED_FOR_USER) { prusa_statistics_case0(15); } else if (printingIsPaused()) { 265ec: 0e 94 35 66 call 0xcc6a ; 0xcc6a 265f0: 88 23 and r24, r24 265f2: 11 f0 breq .+4 ; 0x265f8 prusa_statistics_case0(14); 265f4: 8e e0 ldi r24, 0x0E ; 14 265f6: f7 cf rjmp .-18 ; 0x265e6 } else if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) { 265f8: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 265fc: 81 11 cpse r24, r1 265fe: 04 c0 rjmp .+8 ; 0x26608 26600: 80 91 94 03 lds r24, 0x0394 ; 0x800394 26604: 88 23 and r24, r24 26606: 11 f0 breq .+4 ; 0x2660c prusa_statistics_case0(4); 26608: 84 e0 ldi r24, 0x04 ; 4 2660a: ed cf rjmp .-38 ; 0x265e6 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2660c: 8b e7 ldi r24, 0x7B ; 123 2660e: 0e 94 b1 79 call 0xf362 ; 0xf362 } else { SERIAL_ECHO('{'); prusa_stat_printerstatus(1); 26612: 81 e0 ldi r24, 0x01 ; 1 26614: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 26618: 0f 94 50 08 call 0x210a0 ; 0x210a0 prusa_stat_diameter(); 2661c: 0f 94 c5 08 call 0x2118a ; 0x2118a status_number = 1; 26620: 81 e0 ldi r24, 0x01 ; 1 prusa_stat_printerstatus(status_number); break; case 22: // waiting for filament change SERIAL_ECHOPGM("{[PRN:5]"); prusa_stat_farm_number(); status_number = 5; 26622: 80 93 bd 04 sts 0x04BD, r24 ; 0x8004bd <_ZL13status_number.lto_priv.492> 26626: c3 cf rjmp .-122 ; 0x265ae 26628: 8b e7 ldi r24, 0x7B ; 123 2662a: 0e 94 b1 79 call 0xf362 ; 0xf362 } break; case 1: // 1 heating SERIAL_ECHO('{'); prusa_stat_printerstatus(2); 2662e: 82 e0 ldi r24, 0x02 ; 2 26630: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 26634: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 2; 26638: 82 e0 ldi r24, 0x02 ; 2 2663a: 80 93 bd 04 sts 0x04BD, r24 ; 0x8004bd <_ZL13status_number.lto_priv.492> farm_timer = 1; 2663e: c0 93 74 02 sts 0x0274, r28 ; 0x800274 26642: b5 cf rjmp .-150 ; 0x265ae 26644: 8b e7 ldi r24, 0x7B ; 123 26646: 0e 94 b1 79 call 0xf362 ; 0xf362 prusa_stat_farm_number(); status_number = 4; } else { SERIAL_ECHO('{'); prusa_stat_printerstatus(3); 2664a: 83 e0 ldi r24, 0x03 ; 3 2664c: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 26650: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 3; 26654: c0 93 bd 04 sts 0x04BD, r28 ; 0x8004bd <_ZL13status_number.lto_priv.492> 26658: 88 cf rjmp .-240 ; 0x2656a prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); farm_timer = 2; break; case 5: // print not succesfull SERIAL_ECHOPGM("{[RES:0][FIL:"); 2665a: 8f e6 ldi r24, 0x6F ; 111 2665c: 99 e8 ldi r25, 0x89 ; 137 // must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function // saved a considerable amount of FLASH return; break; case 4: // print succesfull SERIAL_ECHOPGM("{[RES:1][FIL:"); 2665e: 0e 94 c4 7a call 0xf588 ; 0xf588 26662: 60 e0 ldi r22, 0x00 ; 0 26664: 70 e0 ldi r23, 0x00 ; 0 26666: cb 01 movw r24, r22 26668: 0e 94 2a 7a call 0xf454 ; 0xf454 2666c: 8d e5 ldi r24, 0x5D ; 93 2666e: 0e 94 b1 79 call 0xf362 ; 0xf362 MYSERIAL.print(int(_fil_nr)); SERIAL_ECHO(']'); prusa_stat_printerstatus(status_number); 26672: 80 91 bd 04 lds r24, 0x04BD ; 0x8004bd <_ZL13status_number.lto_priv.492> 26676: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 2667a: 0f 94 50 08 call 0x210a0 ; 0x210a0 farm_timer = 2; 2667e: 82 e0 ldi r24, 0x02 ; 2 26680: 75 cf rjmp .-278 ; 0x2656c prusa_stat_farm_number(); status_number = 8; farm_timer = 2; break; case 7: // print done - stopped SERIAL_ECHOPGM("{[PRN:9]"); 26682: 8d e5 ldi r24, 0x5D ; 93 26684: 99 e8 ldi r25, 0x89 ; 137 26686: 0e 94 c4 7a call 0xf588 ; 0xf588 prusa_stat_farm_number(); 2668a: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 9; 2668e: 89 e0 ldi r24, 0x09 ; 9 26690: 7f cf rjmp .-258 ; 0x26590 farm_timer = 2; break; case 8: // printer started SERIAL_ECHOPGM("{[PRN:0]"); 26692: 84 e5 ldi r24, 0x54 ; 84 26694: 99 e8 ldi r25, 0x89 ; 137 26696: 0e 94 c4 7a call 0xf588 ; 0xf588 prusa_stat_farm_number(); 2669a: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 0; 2669e: 10 92 bd 04 sts 0x04BD, r1 ; 0x8004bd <_ZL13status_number.lto_priv.492> 266a2: ed cf rjmp .-38 ; 0x2667e 266a4: 8b e7 ldi r24, 0x7B ; 123 266a6: 0e 94 b1 79 call 0xf362 ; 0xf362 farm_timer = 2; break; case 20: // echo farm no SERIAL_ECHO('{'); prusa_stat_printerstatus(status_number); 266aa: 80 91 bd 04 lds r24, 0x04BD ; 0x8004bd <_ZL13status_number.lto_priv.492> 266ae: 0f 94 a9 08 call 0x21152 ; 0x21152 prusa_stat_farm_number(); 266b2: 0f 94 50 08 call 0x210a0 ; 0x210a0 farm_timer = 4; 266b6: 84 e0 ldi r24, 0x04 ; 4 266b8: 59 cf rjmp .-334 ; 0x2656c 266ba: 8b e7 ldi r24, 0x7B ; 123 266bc: 0e 94 b1 79 call 0xf362 ; 0xf362 break; case 21: // temperatures SERIAL_ECHO('{'); prusa_stat_temperatures(); 266c0: 0f 94 6c 08 call 0x210d8 ; 0x210d8 prusa_stat_farm_number(); 266c4: 0f 94 50 08 call 0x210a0 ; 0x210a0 prusa_stat_printerstatus(status_number); 266c8: 80 91 bd 04 lds r24, 0x04BD ; 0x8004bd <_ZL13status_number.lto_priv.492> 266cc: 0f 94 a9 08 call 0x21152 ; 0x21152 266d0: 6e cf rjmp .-292 ; 0x265ae break; case 22: // waiting for filament change SERIAL_ECHOPGM("{[PRN:5]"); 266d2: 8b e4 ldi r24, 0x4B ; 75 266d4: 99 e8 ldi r25, 0x89 ; 137 266d6: 0e 94 c4 7a call 0xf588 ; 0xf588 prusa_stat_farm_number(); 266da: 0f 94 50 08 call 0x210a0 ; 0x210a0 status_number = 5; 266de: 85 e0 ldi r24, 0x05 ; 5 266e0: a0 cf rjmp .-192 ; 0x26622 case 90: // Error - Thermal Runaway prusa_statistics_err('1'); break; case 91: // Error - Thermal Runaway Preheat prusa_statistics_err('2'); 266e2: 82 e3 ldi r24, 0x32 ; 50 266e4: 71 cf rjmp .-286 ; 0x265c8 break; case 92: // Error - Min temp prusa_statistics_err('3'); 266e6: 83 e3 ldi r24, 0x33 ; 51 266e8: 6f cf rjmp .-290 ; 0x265c8 prusa_stat_temperatures(); prusa_stat_farm_number(); break; } SERIAL_ECHOLN('}'); } 266ea: cf 91 pop r28 266ec: 08 95 ret 000266ee : lcd_status_message_idx = 0; // Re-draw message from beginning } // Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent void lcd_status_screen() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { 266ee: cf 92 push r12 266f0: df 92 push r13 266f2: ef 92 push r14 266f4: ff 92 push r15 266f6: 0f 93 push r16 266f8: 1f 93 push r17 266fa: cf 93 push r28 266fc: df 93 push r29 266fe: 00 d0 rcall .+0 ; 0x26700 26700: 00 d0 rcall .+0 ; 0x26702 26702: 1f 92 push r1 26704: 1f 92 push r1 26706: cd b7 in r28, 0x3d ; 61 26708: de b7 in r29, 0x3e ; 62 static uint8_t lcd_status_update_delay = 0; #ifdef ULTIPANEL_FEEDMULTIPLY if (lcd_encoder) 2670a: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 2670e: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 26712: 00 97 sbiw r24, 0x00 ; 0 26714: e1 f1 breq .+120 ; 0x2678e { const int16_t initial_feedmultiply = feedmultiply; 26716: 20 91 8e 02 lds r18, 0x028E ; 0x80028e 2671a: 30 91 8f 02 lds r19, 0x028F ; 0x80028f // Dead zone at 100% feedrate if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) || 2671e: 24 36 cpi r18, 0x64 ; 100 26720: 31 05 cpc r19, r1 26722: 4c f4 brge .+18 ; 0x26736 26724: ac 01 movw r20, r24 26726: 42 0f add r20, r18 26728: 53 1f adc r21, r19 2672a: 45 36 cpi r20, 0x65 ; 101 2672c: 51 05 cpc r21, r1 2672e: 6c f4 brge .+26 ; 0x2674a feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE; } else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) { feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE; } else if (feedmultiply != 100) feedmultiply += lcd_encoder; 26730: 82 0f add r24, r18 26732: 93 1f adc r25, r19 26734: 0c c0 rjmp .+24 ; 0x2674e #ifdef ULTIPANEL_FEEDMULTIPLY if (lcd_encoder) { const int16_t initial_feedmultiply = feedmultiply; // Dead zone at 100% feedrate if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) || 26736: 24 36 cpi r18, 0x64 ; 100 26738: 31 05 cpc r19, r1 2673a: 09 f4 brne .+2 ; 0x2673e 2673c: 55 c0 rjmp .+170 ; 0x267e8 (feedmultiply > 100 && (feedmultiply + lcd_encoder) < 100)) 2673e: ac 01 movw r20, r24 26740: 42 0f add r20, r18 26742: 53 1f adc r21, r19 26744: 44 36 cpi r20, 0x64 ; 100 26746: 51 05 cpc r21, r1 26748: 9c f7 brge .-26 ; 0x26730 { feedmultiply = 100; 2674a: 84 e6 ldi r24, 0x64 ; 100 2674c: 90 e0 ldi r25, 0x00 ; 0 feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE; } else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) { feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE; } else if (feedmultiply != 100) feedmultiply += lcd_encoder; 2674e: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f 26752: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e if (initial_feedmultiply != feedmultiply) { 26756: 80 91 8e 02 lds r24, 0x028E ; 0x80028e 2675a: 90 91 8f 02 lds r25, 0x028F ; 0x80028f 2675e: 82 17 cp r24, r18 26760: 93 07 cpc r25, r19 26762: a9 f0 breq .+42 ; 0x2678e feedmultiply = constrain(feedmultiply, 10, 999); 26764: 88 3e cpi r24, 0xE8 ; 232 26766: 53 e0 ldi r21, 0x03 ; 3 26768: 95 07 cpc r25, r21 2676a: 14 f0 brlt .+4 ; 0x26770 2676c: 87 ee ldi r24, 0xE7 ; 231 2676e: 93 e0 ldi r25, 0x03 ; 3 26770: 8a 30 cpi r24, 0x0A ; 10 26772: 91 05 cpc r25, r1 26774: 14 f4 brge .+4 ; 0x2677a 26776: 8a e0 ldi r24, 0x0A ; 10 26778: 90 e0 ldi r25, 0x00 ; 0 2677a: 90 93 8f 02 sts 0x028F, r25 ; 0x80028f 2677e: 80 93 8e 02 sts 0x028E, r24 ; 0x80028e lcd_encoder = 0; // Consume rotation event 26782: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 26786: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e refresh_saved_feedrate_multiplier_in_ram(); 2678a: 0e 94 3d 64 call 0xc87a ; 0xc87a } } #endif //ULTIPANEL_FEEDMULTIPLY if (lcd_draw_update) { 2678e: 80 91 59 02 lds r24, 0x0259 ; 0x800259 26792: 81 11 cpse r24, r1 // Update the status screen immediately lcd_status_update_delay = 0; 26794: 10 92 0a 06 sts 0x060A, r1 ; 0x80060a } if (lcd_status_update_delay) 26798: 10 91 0a 06 lds r17, 0x060A ; 0x80060a 2679c: 11 23 and r17, r17 2679e: 91 f1 breq .+100 ; 0x26804 lcd_status_update_delay--; 267a0: 2f ef ldi r18, 0xFF ; 255 267a2: 21 0f add r18, r17 267a4: 20 93 0a 06 sts 0x060A, r18 ; 0x80060a if (lcd_commands_type != LcdCommands::Idle) lcd_commands(); } if (!menu_is_any_block() && lcd_clicked()) { 267a8: 80 91 3a 12 lds r24, 0x123A ; 0x80123a 267ac: 81 11 cpse r24, r1 267ae: 0d c0 rjmp .+26 ; 0x267ca 267b0: 0e 94 75 73 call 0xe6ea ; 0xe6ea 267b4: 88 23 and r24, r24 267b6: 49 f0 breq .+18 ; 0x267ca menu_depth = 0; //redundant, as already done in lcd_return_to_status(), just to be sure 267b8: 10 92 df 03 sts 0x03DF, r1 ; 0x8003df menu_submenu(lcd_main_menu); 267bc: 60 e0 ldi r22, 0x00 ; 0 267be: 8a ef ldi r24, 0xFA ; 250 267c0: 98 ec ldi r25, 0xC8 ; 200 267c2: 0e 94 dd 62 call 0xc5ba ; 0xc5ba lcd_refresh(); // to maybe revive the LCD if static electricity killed it. 267c6: 0e 94 9f 70 call 0xe13e ; 0xe13e } } 267ca: 28 96 adiw r28, 0x08 ; 8 267cc: 0f b6 in r0, 0x3f ; 63 267ce: f8 94 cli 267d0: de bf out 0x3e, r29 ; 62 267d2: 0f be out 0x3f, r0 ; 63 267d4: cd bf out 0x3d, r28 ; 61 267d6: df 91 pop r29 267d8: cf 91 pop r28 267da: 1f 91 pop r17 267dc: 0f 91 pop r16 267de: ff 90 pop r15 267e0: ef 90 pop r14 267e2: df 90 pop r13 267e4: cf 90 pop r12 267e6: 08 95 ret if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) || (feedmultiply > 100 && (feedmultiply + lcd_encoder) < 100)) { feedmultiply = 100; } else if (feedmultiply == 100 && lcd_encoder > ENCODER_FEEDRATE_DEADZONE) { 267e8: 8b 30 cpi r24, 0x0B ; 11 267ea: 91 05 cpc r25, r1 267ec: 1c f0 brlt .+6 ; 0x267f4 feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE; 267ee: 86 5a subi r24, 0xA6 ; 166 267f0: 9f 4f sbci r25, 0xFF ; 255 267f2: ad cf rjmp .-166 ; 0x2674e } else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) { 267f4: 86 3f cpi r24, 0xF6 ; 246 267f6: 4f ef ldi r20, 0xFF ; 255 267f8: 94 07 cpc r25, r20 267fa: 0c f0 brlt .+2 ; 0x267fe 267fc: ac cf rjmp .-168 ; 0x26756 feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE; 267fe: 82 59 subi r24, 0x92 ; 146 26800: 9f 4f sbci r25, 0xFF ; 255 26802: a5 cf rjmp .-182 ; 0x2674e if (lcd_status_update_delay) lcd_status_update_delay--; else { // Redraw the main screen every second (see LCD_UPDATE_INTERVAL). // This is easier then trying keep track of all things that change on the screen lcd_status_update_delay = 10; 26804: 6a e0 ldi r22, 0x0A ; 10 26806: 60 93 0a 06 sts 0x060A, r22 ; 0x80060a ReInitLCD++; 2680a: 80 91 09 06 lds r24, 0x0609 ; 0x800609 2680e: 8f 5f subi r24, 0xFF ; 255 26810: 80 93 09 06 sts 0x0609, r24 ; 0x800609 if (ReInitLCD == 30) 26814: 8e 31 cpi r24, 0x1E ; 30 26816: 09 f0 breq .+2 ; 0x2681a 26818: 9f c0 rjmp .+318 ; 0x26958 { ReInitLCD = 0 ; 2681a: 10 92 09 06 sts 0x0609, r1 ; 0x800609 #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 2681e: 0e 94 9f 70 call 0xe13e ; 0xe13e lcd_status_message_idx = 0; // Re-draw message from beginning 26822: 10 92 64 04 sts 0x0464, r1 ; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419> //! F - feedrate symbol LCD_STR_FEEDRATE //! t - clock symbol LCD_STR_THERMOMETER //! @endcode void lcdui_print_status_screen(void) { lcd_frame_start(); 26826: 0e 94 e6 6e call 0xddcc ; 0xddcc lcd_home(); //line 0 2682a: 0e 94 1f 70 call 0xe03e ; 0xe03e return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 2682e: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 26832: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 26836: 07 2e mov r0, r23 26838: 00 0c add r0, r0 2683a: 88 0b sbc r24, r24 2683c: 99 0b sbc r25, r25 2683e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> //Print the hotend temperature (9 chars total) lcdui_print_temp(LCD_STR_THERMOMETER[0], (int)(degHotend(0) + 0.5), (int)(degTargetHotend(0) + 0.5)); 26842: 20 e0 ldi r18, 0x00 ; 0 26844: 30 e0 ldi r19, 0x00 ; 0 26846: 40 e0 ldi r20, 0x00 ; 0 26848: 5f e3 ldi r21, 0x3F ; 63 2684a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2684e: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 26852: 6b 01 movw r12, r22 26854: 20 e0 ldi r18, 0x00 ; 0 26856: 30 e0 ldi r19, 0x00 ; 0 26858: 40 e0 ldi r20, 0x00 ; 0 2685a: 5f e3 ldi r21, 0x3F ; 63 2685c: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 26860: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 26864: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 26868: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2686c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 26870: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 26874: a6 01 movw r20, r12 26876: 82 e8 ldi r24, 0x82 ; 130 26878: 0f 94 9b 0c call 0x21936 ; 0x21936 lcd_space(3); //3 spaces 2687c: 83 e0 ldi r24, 0x03 ; 3 2687e: 0e 94 28 6f call 0xde50 ; 0xde50 } // Print Z-coordinate (8 chars total) void lcdui_print_Z_coord(void) { if (custom_message_type == CustomMsg::MeshBedLeveling) 26882: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 26886: 81 30 cpi r24, 0x01 ; 1 26888: 09 f0 breq .+2 ; 0x2688c 2688a: 6e c0 rjmp .+220 ; 0x26968 lcd_puts_P(_N("Z --- ")); 2688c: 8a e6 ldi r24, 0x6A ; 106 2688e: 9a e6 ldi r25, 0x6A ; 106 26890: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_space(3); //3 spaces //Print Z-coordinate (8 chars total) lcdui_print_Z_coord(); lcd_set_cursor(0, 1); //line 1 26894: 61 e0 ldi r22, 0x01 ; 1 26896: 80 e0 ldi r24, 0x00 ; 0 26898: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; 2689c: 60 91 59 12 lds r22, 0x1259 ; 0x801259 268a0: 70 91 5a 12 lds r23, 0x125A ; 0x80125a 268a4: 07 2e mov r0, r23 268a6: 00 0c add r0, r0 268a8: 88 0b sbc r24, r24 268aa: 99 0b sbc r25, r25 268ac: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> //Print the Bed temperature (9 chars total) lcdui_print_temp(LCD_STR_BEDTEMP[0], (int)(degBed() + 0.5), (int)(degTargetBed() + 0.5)); 268b0: 20 e0 ldi r18, 0x00 ; 0 268b2: 30 e0 ldi r19, 0x00 ; 0 268b4: 40 e0 ldi r20, 0x00 ; 0 268b6: 5f e3 ldi r21, 0x3F ; 63 268b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 268bc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 268c0: 6b 01 movw r12, r22 268c2: 20 e0 ldi r18, 0x00 ; 0 268c4: 30 e0 ldi r19, 0x00 ; 0 268c6: 40 e0 ldi r20, 0x00 ; 0 268c8: 5f e3 ldi r21, 0x3F ; 63 268ca: 60 91 bc 03 lds r22, 0x03BC ; 0x8003bc 268ce: 70 91 bd 03 lds r23, 0x03BD ; 0x8003bd 268d2: 80 91 be 03 lds r24, 0x03BE ; 0x8003be 268d6: 90 91 bf 03 lds r25, 0x03BF ; 0x8003bf 268da: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 268de: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 268e2: a6 01 movw r20, r12 268e4: 80 e8 ldi r24, 0x80 ; 128 268e6: 0f 94 9b 0c call 0x21936 ; 0x21936 lcd_space(3); //3 spaces 268ea: 83 e0 ldi r24, 0x03 ; 3 268ec: 0e 94 28 6f call 0xde50 ; 0xde50 #endif // PLANNER_DIAGNOSTICS // Print feedrate (8 chars total) void lcdui_print_feedrate(void) { int chars = lcd_printf_P(_N(LCD_STR_FEEDRATE "%3d%%"), feedmultiply); 268f0: 80 91 8f 02 lds r24, 0x028F ; 0x80028f 268f4: 8f 93 push r24 268f6: 80 91 8e 02 lds r24, 0x028E ; 0x80028e 268fa: 8f 93 push r24 268fc: 83 e7 ldi r24, 0x73 ; 115 268fe: 9a e6 ldi r25, 0x6A ; 106 26900: 9f 93 push r25 26902: 8f 93 push r24 26904: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_space(8 - chars); 26908: 98 e0 ldi r25, 0x08 ; 8 2690a: 98 1b sub r25, r24 2690c: 89 2f mov r24, r25 2690e: 0e 94 28 6f call 0xde50 ; 0xde50 #else // PLANNER_DIAGNOSTICS //Print Feedrate (8 chars) lcdui_print_feedrate(); #endif // PLANNER_DIAGNOSTICS lcd_set_cursor(0, 2); //line 2 26912: 62 e0 ldi r22, 0x02 ; 2 26914: 80 e0 ldi r24, 0x00 ; 0 26916: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 } // Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total) void lcdui_print_percent_done(void) { const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); 2691a: 0f 90 pop r0 2691c: 0f 90 pop r0 2691e: 0f 90 pop r0 26920: 0f 90 pop r0 26922: 80 91 42 12 lds r24, 0x1242 ; 0x801242 26926: e0 90 d7 13 lds r14, 0x13D7 ; 0x8013d7 2692a: 81 11 cpse r24, r1 2692c: 3e c0 rjmp .+124 ; 0x269aa 2692e: 26 e8 ldi r18, 0x86 ; 134 26930: c2 2e mov r12, r18 26932: 2a e6 ldi r18, 0x6A ; 106 26934: d2 2e mov r13, r18 26936: e1 10 cpse r14, r1 26938: 3c c0 rjmp .+120 ; 0x269b2 2693a: 8a e8 ldi r24, 0x8A ; 138 2693c: c8 2e mov r12, r24 2693e: 8a e6 ldi r24, 0x6A ; 106 26940: d8 2e mov r13, r24 bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 26942: 0e 94 91 66 call 0xcd22 ; 0xcd22 26946: f8 2e mov r15, r24 26948: 88 23 and r24, r24 2694a: d9 f1 breq .+118 ; 0x269c2 2694c: 80 91 6f 02 lds r24, 0x026F ; 0x80026f 26950: 8f 3f cpi r24, 0xFF ; 255 26952: 89 f5 brne .+98 ; 0x269b6 26954: f1 2c mov r15, r1 26956: 35 c0 rjmp .+106 ; 0x269c2 ReInitLCD = 0 ; lcdui_refresh(); } else { if ((ReInitLCD % 10) == 0) 26958: 0f 94 9b a4 call 0x34936 ; 0x34936 <__divmodqi4> 2695c: 91 11 cpse r25, r1 2695e: 63 cf rjmp .-314 ; 0x26826 lcd_begin(1); } void lcd_refresh_noclear(void) { lcd_begin(0); 26960: 80 e0 ldi r24, 0x00 ; 0 26962: 0e 94 5e 70 call 0xe0bc ; 0xe0bc 26966: 5d cf rjmp .-326 ; 0x26822 void lcdui_print_Z_coord(void) { if (custom_message_type == CustomMsg::MeshBedLeveling) lcd_puts_P(_N("Z --- ")); else lcd_printf_P(_N("Z%6.2f%c"), current_position[Z_AXIS], axis_known_position[Z_AXIS]?' ':'?'); 26968: 80 91 3b 06 lds r24, 0x063B ; 0x80063b 2696c: 88 23 and r24, r24 2696e: d9 f0 breq .+54 ; 0x269a6 26970: 80 e2 ldi r24, 0x20 ; 32 26972: 1f 92 push r1 26974: 8f 93 push r24 26976: 80 91 6c 12 lds r24, 0x126C ; 0x80126c 2697a: 8f 93 push r24 2697c: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 26980: 8f 93 push r24 26982: 80 91 6a 12 lds r24, 0x126A ; 0x80126a 26986: 8f 93 push r24 26988: 80 91 69 12 lds r24, 0x1269 ; 0x801269 2698c: 8f 93 push r24 2698e: 81 e6 ldi r24, 0x61 ; 97 26990: 9a e6 ldi r25, 0x6A ; 106 26992: 9f 93 push r25 26994: 8f 93 push r24 26996: 0e 94 0b 6f call 0xde16 ; 0xde16 2699a: 0f b6 in r0, 0x3f ; 63 2699c: f8 94 cli 2699e: de bf out 0x3e, r29 ; 62 269a0: 0f be out 0x3f, r0 ; 63 269a2: cd bf out 0x3d, r28 ; 61 269a4: 77 cf rjmp .-274 ; 0x26894 269a6: 8f e3 ldi r24, 0x3F ; 63 269a8: e4 cf rjmp .-56 ; 0x26972 } // Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total) void lcdui_print_percent_done(void) { const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); 269aa: 9e e8 ldi r25, 0x8E ; 142 269ac: c9 2e mov r12, r25 269ae: 9a e6 ldi r25, 0x6A ; 106 269b0: d9 2e mov r13, r25 bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 269b2: ee 20 and r14, r14 269b4: 31 f2 breq .-116 ; 0x26942 if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating 269b6: 80 91 cb 03 lds r24, 0x03CB ; 0x8003cb // Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total) void lcdui_print_percent_done(void) { const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 269ba: ff 24 eor r15, r15 269bc: f3 94 inc r15 if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating 269be: 88 23 and r24, r24 269c0: 99 f1 breq .+102 ; 0x26a28 { const int8_t sheetNR = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 269c2: 81 ea ldi r24, 0xA1 ; 161 269c4: 9d e0 ldi r25, 0x0D ; 13 269c6: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 269ca: 08 2f mov r16, r24 const int8_t nextSheet = eeprom_next_initialized_sheet(sheetNR); 269cc: 0e 94 96 78 call 0xf12c ; 0xf12c if ((nextSheet >= 0) && (sheetNR != nextSheet)) 269d0: 87 fd sbrc r24, 7 269d2: 2a c0 rjmp .+84 ; 0x26a28 269d4: 08 17 cp r16, r24 269d6: 41 f1 breq .+80 ; 0x26a28 { char sheet[8]; eeprom_read_block(sheet, EEPROM_Sheets_base->s[sheetNR].name, 7); 269d8: 9b e0 ldi r25, 0x0B ; 11 269da: 09 02 muls r16, r25 269dc: b0 01 movw r22, r0 269de: 11 24 eor r1, r1 269e0: 67 5b subi r22, 0xB7 ; 183 269e2: 72 4f sbci r23, 0xF2 ; 242 269e4: 47 e0 ldi r20, 0x07 ; 7 269e6: 50 e0 ldi r21, 0x00 ; 0 269e8: 8e 01 movw r16, r28 269ea: 0f 5f subi r16, 0xFF ; 255 269ec: 1f 4f sbci r17, 0xFF ; 255 269ee: c8 01 movw r24, r16 269f0: 0f 94 d0 a3 call 0x347a0 ; 0x347a0 sheet[7] = '\0'; 269f4: 18 86 std Y+8, r1 ; 0x08 lcd_printf_P(PSTR("%-7s"),sheet); 269f6: 1f 93 push r17 269f8: 0f 93 push r16 269fa: 87 e8 ldi r24, 0x87 ; 135 269fc: 97 e9 ldi r25, 0x97 ; 151 lcd_print(hostName); // Two characters } else { lcd_printf_P(PSTR("%3S"), src); } lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done()); 269fe: 9f 93 push r25 26a00: 8f 93 push r24 26a02: 0e 94 0b 6f call 0xde16 ; 0xde16 26a06: 0f 90 pop r0 26a08: 0f 90 pop r0 26a0a: 0f 90 pop r0 26a0c: 0f 90 pop r0 lcd_set_cursor(0, 2); //line 2 //Print SD status (7 chars) lcdui_print_percent_done(); if (MMU2::mmu2.Enabled()) { 26a0e: 80 91 01 13 lds r24, 0x1301 ; 0x801301 26a12: 81 30 cpi r24, 0x01 ; 1 26a14: 09 f0 breq .+2 ; 0x26a18 26a16: 5a c0 rjmp .+180 ; 0x26acc // Print extruder status (5 chars) lcd_space(5 - lcdui_print_extruder()); 26a18: 0f 94 e6 07 call 0x20fcc ; 0x20fcc 26a1c: 95 e0 ldi r25, 0x05 ; 5 26a1e: 98 1b sub r25, r24 26a20: 89 2f mov r24, r25 } else if (farm_mode) { // Print farm number (5 chars) lcdui_print_farm(); } else { lcd_space(5); // 5 spaces 26a22: 0e 94 28 6f call 0xde50 ; 0xde50 26a26: 5f c0 rjmp .+190 ; 0x26ae6 lcd_printf_P(PSTR("%-7s"),sheet); return; //do not also print the percentage } } if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName()) 26a28: e1 10 cpse r14, r1 26a2a: 04 c0 rjmp .+8 ; 0x26a34 26a2c: 80 91 8c 03 lds r24, 0x038C ; 0x80038c <_ZL9M79_timer.lto_priv.421> 26a30: 81 11 cpse r24, r1 26a32: 42 c0 rjmp .+132 ; 0x26ab8 // Overwrite the name char * hostName = GetHostStatusScreenName(); lcd_space(1); // Blank space lcd_print(hostName); // Two characters } else { lcd_printf_P(PSTR("%3S"), src); 26a34: df 92 push r13 26a36: cf 92 push r12 26a38: 83 e8 ldi r24, 0x83 ; 131 26a3a: 97 e9 ldi r25, 0x97 ; 151 26a3c: 9f 93 push r25 26a3e: 8f 93 push r24 26a40: 0e 94 0b 6f call 0xde16 ; 0xde16 26a44: 0f 90 pop r0 26a46: 0f 90 pop r0 26a48: 0f 90 pop r0 26a4a: 0f 90 pop r0 else if (print_percent_done_silent <= 100) { percent_done = print_percent_done_silent; } #else if (print_percent_done_normal <= 100) 26a4c: 80 91 6f 02 lds r24, 0x026F ; 0x80026f 26a50: 85 36 cpi r24, 0x65 ; 101 26a52: d0 f1 brcs .+116 ; 0x26ac8 26a54: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 26a58: 88 23 and r24, r24 26a5a: 19 f1 breq .+70 ; 0x26aa2 26a5c: 80 91 e4 16 lds r24, 0x16E4 ; 0x8016e4 26a60: 90 91 e5 16 lds r25, 0x16E5 ; 0x8016e5 26a64: a0 91 e6 16 lds r26, 0x16E6 ; 0x8016e6 26a68: b0 91 e7 16 lds r27, 0x16E7 ; 0x8016e7 26a6c: 00 97 sbiw r24, 0x00 ; 0 26a6e: a1 05 cpc r26, r1 26a70: b1 05 cpc r27, r1 26a72: b9 f0 breq .+46 ; 0x26aa2 26a74: bc 01 movw r22, r24 26a76: cd 01 movw r24, r26 26a78: 6d 59 subi r22, 0x9D ; 157 26a7a: 7f 4f sbci r23, 0xFF ; 255 26a7c: 8f 4f sbci r24, 0xFF ; 255 26a7e: 9f 4f sbci r25, 0xFF ; 255 26a80: 24 e6 ldi r18, 0x64 ; 100 26a82: 30 e0 ldi r19, 0x00 ; 0 26a84: 40 e0 ldi r20, 0x00 ; 0 26a86: 50 e0 ldi r21, 0x00 ; 0 26a88: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 26a8c: 60 91 eb 16 lds r22, 0x16EB ; 0x8016eb 26a90: 70 91 ec 16 lds r23, 0x16EC ; 0x8016ec 26a94: 80 91 ed 16 lds r24, 0x16ED ; 0x8016ed 26a98: 90 91 ee 16 lds r25, 0x16EE ; 0x8016ee 26a9c: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 26aa0: 12 2f mov r17, r18 } lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done()); 26aa2: 21 2f mov r18, r17 26aa4: 30 e0 ldi r19, 0x00 ; 0 26aa6: 80 e8 ldi r24, 0x80 ; 128 26aa8: 9a e6 ldi r25, 0x6A ; 106 26aaa: f1 10 cpse r15, r1 26aac: 02 c0 rjmp .+4 ; 0x26ab2 26aae: 8a e7 ldi r24, 0x7A ; 122 26ab0: 9a e6 ldi r25, 0x6A ; 106 26ab2: 3f 93 push r19 26ab4: 2f 93 push r18 26ab6: a3 cf rjmp .-186 ; 0x269fe if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName()) { // Overwrite the name char * hostName = GetHostStatusScreenName(); lcd_space(1); // Blank space 26ab8: 81 e0 ldi r24, 0x01 ; 1 26aba: 0e 94 28 6f call 0xde50 ; 0xde50 lcd_print(hostName); // Two characters 26abe: 85 e0 ldi r24, 0x05 ; 5 26ac0: 96 e0 ldi r25, 0x06 ; 6 26ac2: 0e 94 5f 73 call 0xe6be ; 0xe6be 26ac6: c2 cf rjmp .-124 ; 0x26a4c 26ac8: 18 2f mov r17, r24 26aca: eb cf rjmp .-42 ; 0x26aa2 lcdui_print_percent_done(); if (MMU2::mmu2.Enabled()) { // Print extruder status (5 chars) lcd_space(5 - lcdui_print_extruder()); } else if (farm_mode) { 26acc: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 26ad0: 88 23 and r24, r24 26ad2: 09 f4 brne .+2 ; 0x26ad6 26ad4: a5 c0 rjmp .+330 ; 0x26c20 } // Print farm number (5 chars total) static void lcdui_print_farm(void) { lcd_printf_P(_N(" FRM ")); 26ad6: 82 e9 ldi r24, 0x92 ; 146 26ad8: 9a e6 ldi r25, 0x6A ; 106 26ada: 9f 93 push r25 26adc: 8f 93 push r24 26ade: 0e 94 0b 6f call 0xde16 ; 0xde16 26ae2: 0f 90 pop r0 26ae4: 0f 90 pop r0 void lcdui_print_time(void) { static uint8_t clock_interval; // max value is 10: CLOCK_INTERVAL_TIME * 2 //if remaining print time estimation is available print it else print elapsed time int chars = 0; if (printer_active()) { 26ae6: 0e 94 91 66 call 0xcd22 ; 0xcd22 26aea: 88 23 and r24, r24 26aec: 09 f4 brne .+2 ; 0x26af0 26aee: ac c0 rjmp .+344 ; 0x26c48 if (print_time_to_change_silent != PRINT_TIME_REMAINING_INIT) print_tc = print_time_to_change_silent; //#endif //CLOCK_INTERVAL_TIME } else { #endif //TMC2130 if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) 26af0: c0 90 72 02 lds r12, 0x0272 ; 0x800272 26af4: d0 90 73 02 lds r13, 0x0273 ; 0x800273 print_tr = print_time_remaining_normal; //#ifdef CLOCK_INTERVAL_TIME if (print_time_to_change_normal != PRINT_TIME_REMAINING_INIT) 26af8: e0 90 70 02 lds r14, 0x0270 ; 0x800270 26afc: f0 90 71 02 lds r15, 0x0271 ; 0x800271 #ifdef TMC2130 } #endif //TMC2130 //#ifdef CLOCK_INTERVAL_TIME if (clock_interval == CLOCK_INTERVAL_TIME*2) 26b00: 80 91 08 06 lds r24, 0x0608 ; 0x800608 26b04: 8a 30 cpi r24, 0x0A ; 10 26b06: 11 f4 brne .+4 ; 0x26b0c clock_interval = 0; 26b08: 10 92 08 06 sts 0x0608, r1 ; 0x800608 clock_interval++; 26b0c: 80 91 08 06 lds r24, 0x0608 ; 0x800608 26b10: 8f 5f subi r24, 0xFF ; 255 26b12: 80 93 08 06 sts 0x0608, r24 ; 0x800608 if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) { 26b16: 2f ef ldi r18, 0xFF ; 255 26b18: e2 16 cp r14, r18 26b1a: f2 06 cpc r15, r18 26b1c: 21 f0 breq .+8 ; 0x26b26 26b1e: 97 01 movw r18, r14 print_t = print_tc; suff = 'C'; 26b20: 13 e4 ldi r17, 0x43 ; 67 if (clock_interval == CLOCK_INTERVAL_TIME*2) clock_interval = 0; clock_interval++; if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) { 26b22: 86 30 cpi r24, 0x06 ; 6 26b24: 70 f4 brcc .+28 ; 0x26b42 print_t = print_tc; suff = 'C'; } else //#endif //CLOCK_INTERVAL_TIME if (print_tr != PRINT_TIME_REMAINING_INIT) { 26b26: 3f ef ldi r19, 0xFF ; 255 26b28: c3 16 cp r12, r19 26b2a: d3 06 cpc r13, r19 26b2c: 09 f0 breq .+2 ; 0x26b30 26b2e: 7a c0 rjmp .+244 ; 0x26c24 print_t = print_tr; suff = 'R'; } else print_t = print_job_timer.duration() / 60; 26b30: 0f 94 6d 17 call 0x22eda ; 0x22eda 26b34: 2c e3 ldi r18, 0x3C ; 60 26b36: 30 e0 ldi r19, 0x00 ; 0 26b38: 40 e0 ldi r20, 0x00 ; 0 26b3a: 50 e0 ldi r21, 0x00 ; 0 26b3c: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> int chars = 0; if (printer_active()) { uint16_t print_t = PRINT_TIME_REMAINING_INIT; // unit: minutes uint16_t print_tr = PRINT_TIME_REMAINING_INIT; // unit: minutes uint16_t print_tc = PRINT_TIME_REMAINING_INIT; // unit: minutes char suff = ' '; 26b40: 10 e2 ldi r17, 0x20 ; 32 print_t = print_tr; suff = 'R'; } else print_t = print_job_timer.duration() / 60; if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc)) { 26b42: 40 91 8e 02 lds r20, 0x028E ; 0x80028e 26b46: 50 91 8f 02 lds r21, 0x028F ; 0x80028f 26b4a: 44 36 cpi r20, 0x64 ; 100 26b4c: 51 05 cpc r21, r1 26b4e: 09 f4 brne .+2 ; 0x26b52 26b50: 6c c0 rjmp .+216 ; 0x26c2a 26b52: c2 16 cp r12, r18 26b54: d3 06 cpc r13, r19 26b56: 21 f0 breq .+8 ; 0x26b60 26b58: e2 16 cp r14, r18 26b5a: f3 06 cpc r15, r19 26b5c: 09 f0 breq .+2 ; 0x26b60 26b5e: 65 c0 rjmp .+202 ; 0x26c2a suff_doubt = '?'; // (print_t * 100) overflows uint16_t at 10.9 hours, uint32_t is required print_t = (uint16_t)((100UL * (uint32_t)print_t) / feedmultiply); 26b60: a4 e6 ldi r26, 0x64 ; 100 26b62: b0 e0 ldi r27, 0x00 ; 0 26b64: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 26b68: 9a 01 movw r18, r20 26b6a: 55 0f add r21, r21 26b6c: 44 0b sbc r20, r20 26b6e: 55 0b sbc r21, r21 26b70: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> suff = 'R'; } else print_t = print_job_timer.duration() / 60; if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc)) { suff_doubt = '?'; 26b74: 4f e3 ldi r20, 0x3F ; 63 26b76: e4 2e mov r14, r20 26b78: 04 2e mov r0, r20 26b7a: 00 0c add r0, r0 26b7c: ff 08 sbc r15, r15 26b7e: e1 2f mov r30, r17 26b80: 01 2e mov r0, r17 26b82: 00 0c add r0, r0 26b84: ff 0b sbc r31, r31 26b86: c9 01 movw r24, r18 26b88: 6c e3 ldi r22, 0x3C ; 60 26b8a: 70 e0 ldi r23, 0x00 ; 0 26b8c: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> // (print_t * 100) overflows uint16_t at 10.9 hours, uint32_t is required print_t = (uint16_t)((100UL * (uint32_t)print_t) / feedmultiply); } if (print_t < 6000) //time<100h 26b90: 20 37 cpi r18, 0x70 ; 112 26b92: 37 41 sbci r19, 0x17 ; 23 26b94: 08 f0 brcs .+2 ; 0x26b98 26b96: 4b c0 rjmp .+150 ; 0x26c2e chars = lcd_printf_P(_N(LCD_STR_CLOCK "%02u:%02u%c%c"), print_t / 60, print_t % 60, suff, suff_doubt); 26b98: ff 92 push r15 26b9a: 4f 93 push r20 26b9c: ff 93 push r31 26b9e: 1f 93 push r17 26ba0: 9f 93 push r25 26ba2: 8f 93 push r24 26ba4: 7f 93 push r23 26ba6: 6f 93 push r22 26ba8: 8c ea ldi r24, 0xAC ; 172 26baa: 9a e6 ldi r25, 0x6A ; 106 26bac: 9f 93 push r25 26bae: 8f 93 push r24 26bb0: 0e 94 0b 6f call 0xde16 ; 0xde16 else //time>=100h chars = lcd_printf_P(_N(LCD_STR_CLOCK "%3uh %c%c"), print_t / 60, suff, suff_doubt); 26bb4: 0f b6 in r0, 0x3f ; 63 26bb6: f8 94 cli 26bb8: de bf out 0x3e, r29 ; 62 26bba: 0f be out 0x3f, r0 ; 63 26bbc: cd bf out 0x3d, r28 ; 61 chars = lcd_printf_P(PSTR("Nd %4.2f "),(float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); #else chars = lcd_printf_P(_N(LCD_STR_CLOCK "--:-- ")); #endif //QUICK_NOZZLE_CHANGE } lcd_space(8 - chars); 26bbe: 98 e0 ldi r25, 0x08 ; 8 26bc0: 98 1b sub r25, r24 26bc2: 89 2f mov r24, r25 26bc4: 0e 94 28 6f call 0xde50 ; 0xde50 #else //Print time (8chars) lcdui_print_time(); #endif //CMD_DIAGNOSTICS lcd_set_cursor(0, 3); //line 3 26bc8: 63 e0 ldi r22, 0x03 ; 3 26bca: 80 e0 ldi r24, 0x00 ; 0 26bcc: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 #ifndef DEBUG_DISABLE_LCD_STATUS_LINE lcdui_print_status_line(); 26bd0: 0f 94 cb 0e call 0x21d96 ; 0x21d96 void prusa_statistics_update_from_status_screen() { if (farm_mode) { 26bd4: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 26bd8: 88 23 and r24, r24 26bda: b1 f0 breq .+44 ; 0x26c08 farm_timer--; 26bdc: 80 91 74 02 lds r24, 0x0274 ; 0x800274 26be0: 81 50 subi r24, 0x01 ; 1 if (farm_timer < 1) { 26be2: d9 f1 breq .+118 ; 0x26c5a SERIAL_ECHOLN('}'); } void prusa_statistics_update_from_status_screen() { if (farm_mode) { farm_timer--; 26be4: 80 93 74 02 sts 0x0274, r24 ; 0x800274 if (farm_timer < 1) { farm_timer = 10; prusa_statistics(0); } switch (farm_timer) { 26be8: 80 91 74 02 lds r24, 0x0274 ; 0x800274 26bec: 85 30 cpi r24, 0x05 ; 5 26bee: e1 f1 breq .+120 ; 0x26c68 26bf0: 88 30 cpi r24, 0x08 ; 8 26bf2: 51 f4 brne .+20 ; 0x26c08 case 8: prusa_statistics(21); 26bf4: 85 e1 ldi r24, 0x15 ; 21 26bf6: 0f 94 79 32 call 0x264f2 ; 0x264f2 if(eFilamentAction != FilamentAction::None) 26bfa: 80 91 94 03 lds r24, 0x0394 ; 0x800394 26bfe: 88 23 and r24, r24 26c00: 19 f0 breq .+6 ; 0x26c08 prusa_statistics(22); 26c02: 86 e1 ldi r24, 0x16 ; 22 break; case 5: if (IS_SD_PRINTING) prusa_statistics(20); 26c04: 0f 94 79 32 call 0x264f2 ; 0x264f2 lcdui_print_status_screen(); prusa_statistics_update_from_status_screen(); if (lcd_commands_type != LcdCommands::Idle) 26c08: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 26c0c: 88 23 and r24, r24 26c0e: 09 f4 brne .+2 ; 0x26c12 26c10: cb cd rjmp .-1130 ; 0x267a8 void lcd_print_stop_finish(); void lcd_commands() { // printf_P(PSTR("lcd_commands begin, lcd_commands_type=%u, lcd_commands_step=%u\n"), (uint8_t)lcd_commands_type, lcd_commands_step); if (planner_aborted) { 26c12: 80 91 42 0d lds r24, 0x0D42 ; 0x800d42 26c16: 81 11 cpse r24, r1 26c18: c7 cd rjmp .-1138 ; 0x267a8 26c1a: 0e 94 05 f6 call 0x1ec0a ; 0x1ec0a 26c1e: c4 cd rjmp .-1144 ; 0x267a8 lcd_space(5 - lcdui_print_extruder()); } else if (farm_mode) { // Print farm number (5 chars) lcdui_print_farm(); } else { lcd_space(5); // 5 spaces 26c20: 85 e0 ldi r24, 0x05 ; 5 26c22: ff ce rjmp .-514 ; 0x26a22 if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) { print_t = print_tc; suff = 'C'; } else //#endif //CLOCK_INTERVAL_TIME if (print_tr != PRINT_TIME_REMAINING_INIT) { 26c24: 96 01 movw r18, r12 print_t = print_tr; suff = 'R'; 26c26: 12 e5 ldi r17, 0x52 ; 82 26c28: 8c cf rjmp .-232 ; 0x26b42 if (printer_active()) { uint16_t print_t = PRINT_TIME_REMAINING_INIT; // unit: minutes uint16_t print_tr = PRINT_TIME_REMAINING_INIT; // unit: minutes uint16_t print_tc = PRINT_TIME_REMAINING_INIT; // unit: minutes char suff = ' '; char suff_doubt = ' '; 26c2a: 40 e2 ldi r20, 0x20 ; 32 26c2c: a4 cf rjmp .-184 ; 0x26b76 } if (print_t < 6000) //time<100h chars = lcd_printf_P(_N(LCD_STR_CLOCK "%02u:%02u%c%c"), print_t / 60, print_t % 60, suff, suff_doubt); else //time>=100h chars = lcd_printf_P(_N(LCD_STR_CLOCK "%3uh %c%c"), print_t / 60, suff, suff_doubt); 26c2e: ff 92 push r15 26c30: 4f 93 push r20 26c32: ff 93 push r31 26c34: 1f 93 push r17 26c36: 7f 93 push r23 26c38: 6f 93 push r22 26c3a: 81 ea ldi r24, 0xA1 ; 161 26c3c: 9a e6 ldi r25, 0x6A ; 106 26c3e: 9f 93 push r25 26c40: 8f 93 push r24 26c42: 0e 94 0b 6f call 0xde16 ; 0xde16 26c46: b6 cf rjmp .-148 ; 0x26bb4 } else { #ifdef QUICK_NOZZLE_CHANGE chars = lcd_printf_P(PSTR("Nd %4.2f "),(float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); #else chars = lcd_printf_P(_N(LCD_STR_CLOCK "--:-- ")); 26c48: 88 e9 ldi r24, 0x98 ; 152 26c4a: 9a e6 ldi r25, 0x6A ; 106 26c4c: 9f 93 push r25 26c4e: 8f 93 push r24 26c50: 0e 94 0b 6f call 0xde16 ; 0xde16 26c54: 0f 90 pop r0 26c56: 0f 90 pop r0 26c58: b2 cf rjmp .-156 ; 0x26bbe void prusa_statistics_update_from_status_screen() { if (farm_mode) { farm_timer--; if (farm_timer < 1) { farm_timer = 10; 26c5a: 8a e0 ldi r24, 0x0A ; 10 26c5c: 80 93 74 02 sts 0x0274, r24 ; 0x800274 prusa_statistics(0); 26c60: 80 e0 ldi r24, 0x00 ; 0 26c62: 0f 94 79 32 call 0x264f2 ; 0x264f2 26c66: c0 cf rjmp .-128 ; 0x26be8 prusa_statistics(21); if(eFilamentAction != FilamentAction::None) prusa_statistics(22); break; case 5: if (IS_SD_PRINTING) 26c68: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 26c6c: 88 23 and r24, r24 26c6e: 61 f2 breq .-104 ; 0x26c08 prusa_statistics(20); 26c70: 84 e1 ldi r24, 0x14 ; 20 26c72: c8 cf rjmp .-112 ; 0x26c04 00026c74 : } } static void temp_runaway_stop(bool isPreheat, bool isBed) { 26c74: cf 93 push r28 26c76: df 93 push r29 if(IsStopped() == false) { 26c78: 90 91 3b 12 lds r25, 0x123B ; 0x80123b 26c7c: 91 11 cpse r25, r1 26c7e: 21 c0 rjmp .+66 ; 0x26cc2 26c80: c6 2f mov r28, r22 26c82: d8 2f mov r29, r24 if (isPreheat) { 26c84: 88 23 and r24, r24 26c86: 09 f1 breq .+66 ; 0x26cca lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL); 26c88: 88 ee ldi r24, 0xE8 ; 232 26c8a: 96 e9 ldi r25, 0x96 ; 150 26c8c: 66 23 and r22, r22 26c8e: 11 f0 breq .+4 ; 0x26c94 26c90: 86 ef ldi r24, 0xF6 ; 246 26c92: 96 e9 ldi r25, 0x96 ; 150 26c94: 63 e0 ldi r22, 0x03 ; 3 26c96: 0e 94 2c da call 0x1b458 ; 0x1b458 SERIAL_ERROR_START; 26c9a: 81 eb ldi r24, 0xB1 ; 177 26c9c: 91 ea ldi r25, 0xA1 ; 161 26c9e: 0e 94 c4 7a call 0xf588 ; 0xf588 if (isBed) { SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)"); 26ca2: 85 ec ldi r24, 0xC5 ; 197 26ca4: 96 e9 ldi r25, 0x96 ; 150 { if(IsStopped() == false) { if (isPreheat) { lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL); SERIAL_ERROR_START; if (isBed) { 26ca6: c1 11 cpse r28, r1 26ca8: 02 c0 rjmp .+4 ; 0x26cae SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)"); } else { SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)"); 26caa: 83 ea ldi r24, 0xA3 ; 163 26cac: 96 e9 ldi r25, 0x96 ; 150 lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL); SERIAL_ERROR_START; if (isBed) { SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY"); } else { SERIAL_ERRORLNPGM(" HOTEND THERMAL RUNAWAY"); 26cae: 0e 94 bd 7c call 0xf97a ; 0xf97a } } prusa_statistics(0); 26cb2: 80 e0 ldi r24, 0x00 ; 0 26cb4: 0f 94 79 32 call 0x264f2 ; 0x264f2 prusa_statistics(isPreheat? 91 : 90); 26cb8: 8a e5 ldi r24, 0x5A ; 90 26cba: d1 11 cpse r29, r1 26cbc: 8b e5 ldi r24, 0x5B ; 91 26cbe: 0f 94 79 32 call 0x264f2 ; 0x264f2 } ThermalStop(); } 26cc2: df 91 pop r29 26cc4: cf 91 pop r28 } } prusa_statistics(0); prusa_statistics(isPreheat? 91 : 90); } ThermalStop(); 26cc6: 0d 94 4f 67 jmp 0x2ce9e ; 0x2ce9e SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)"); } else { SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)"); } } else { lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL); 26cca: 8f e7 ldi r24, 0x7F ; 127 26ccc: 96 e9 ldi r25, 0x96 ; 150 26cce: 66 23 and r22, r22 26cd0: 11 f0 breq .+4 ; 0x26cd6 26cd2: 8f e8 ldi r24, 0x8F ; 143 26cd4: 96 e9 ldi r25, 0x96 ; 150 26cd6: 63 e0 ldi r22, 0x03 ; 3 26cd8: 0e 94 2c da call 0x1b458 ; 0x1b458 SERIAL_ERROR_START; 26cdc: 81 eb ldi r24, 0xB1 ; 177 26cde: 91 ea ldi r25, 0xA1 ; 161 26ce0: 0e 94 c4 7a call 0xf588 ; 0xf588 if (isBed) { SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY"); 26ce4: 86 e6 ldi r24, 0x66 ; 102 26ce6: 96 e9 ldi r25, 0x96 ; 150 SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)"); } } else { lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL); SERIAL_ERROR_START; if (isBed) { 26ce8: c1 11 cpse r28, r1 26cea: e1 cf rjmp .-62 ; 0x26cae SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY"); } else { SERIAL_ERRORLNPGM(" HOTEND THERMAL RUNAWAY"); 26cec: 8e e4 ldi r24, 0x4E ; 78 26cee: 96 e9 ldi r25, 0x96 ; 150 26cf0: de cf rjmp .-68 ; 0x26cae 00026cf2 : #endif // WARNING: the following function has been marked noinline to avoid a GCC 4.9.2 LTO // codegen bug causing a stack overwrite issue in process_commands() void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycles) { 26cf2: 2f 92 push r2 26cf4: 3f 92 push r3 26cf6: 4f 92 push r4 26cf8: 5f 92 push r5 26cfa: 6f 92 push r6 26cfc: 7f 92 push r7 26cfe: 8f 92 push r8 26d00: 9f 92 push r9 26d02: af 92 push r10 26d04: bf 92 push r11 26d06: cf 92 push r12 26d08: df 92 push r13 26d0a: ef 92 push r14 26d0c: ff 92 push r15 26d0e: 0f 93 push r16 26d10: 1f 93 push r17 26d12: cf 93 push r28 26d14: df 93 push r29 26d16: cd b7 in r28, 0x3d ; 61 26d18: de b7 in r29, 0x3e ; 62 26d1a: e0 97 sbiw r28, 0x30 ; 48 26d1c: 0f b6 in r0, 0x3f ; 63 26d1e: f8 94 cli 26d20: de bf out 0x3e, r29 ; 62 26d22: 0f be out 0x3f, r0 ; 63 26d24: cd bf out 0x3d, r28 ; 61 26d26: 6a 87 std Y+10, r22 ; 0x0a 26d28: 7b 87 std Y+11, r23 ; 0x0b 26d2a: 8c 87 std Y+12, r24 ; 0x0c 26d2c: 9d 87 std Y+13, r25 ; 0x0d 26d2e: 1a 01 movw r2, r20 26d30: 3a a7 std Y+42, r19 ; 0x2a 26d32: 29 a7 std Y+41, r18 ; 0x29 return !pid_tuning_finished; } void preparePidTuning() { // ensure heaters are disabled before we switch off PID management! disable_heater(); 26d34: 0f 94 05 11 call 0x2220a ; 0x2220a pid_tuning_finished = false; 26d38: 10 92 41 02 sts 0x0241, r1 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> // codegen bug causing a stack overwrite issue in process_commands() void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycles) { preparePidTuning(); pid_number_of_cycles = ncycles; 26d3c: 29 a5 ldd r18, Y+41 ; 0x29 26d3e: 3a a5 ldd r19, Y+42 ; 0x2a 26d40: 30 93 01 06 sts 0x0601, r19 ; 0x800601 26d44: 20 93 00 06 sts 0x0600, r18 ; 0x800600 float input = 0.0; pid_cycle=0; 26d48: 10 92 03 06 sts 0x0603, r1 ; 0x800603 26d4c: 10 92 02 06 sts 0x0602, r1 ; 0x800602 bool heating = true; unsigned long temp_millis = _millis(); 26d50: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26d54: 6e 83 std Y+6, r22 ; 0x06 26d56: 7f 83 std Y+7, r23 ; 0x07 26d58: 88 87 std Y+8, r24 ; 0x08 26d5a: 99 87 std Y+9, r25 ; 0x09 long bias, d; float Ku, Tu; float max = 0, min = 10000; uint8_t safety_check_cycles = 0; const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed 26d5c: 37 fe sbrs r3, 7 26d5e: ff c0 rjmp .+510 ; 0x26f5e 26d60: 3d e2 ldi r19, 0x2D ; 45 26d62: 3f 8f std Y+31, r19 ; 0x1f float temp_ambient; #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) unsigned long extruder_autofan_last_check = _millis(); 26d64: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26d68: 6c a3 std Y+36, r22 ; 0x24 26d6a: 7d a3 std Y+37, r23 ; 0x25 26d6c: 8e a3 std Y+38, r24 ; 0x26 26d6e: 9f a3 std Y+39, r25 ; 0x27 if ((extruder >= EXTRUDERS) #if (TEMP_BED_PIN <= -1) ||(extruder < 0) #endif ){ SERIAL_ECHOLNPGM("PID Autotune failed. Bad extruder number."); 26d70: 89 eb ldi r24, 0xB9 ; 185 26d72: 94 e9 ldi r25, 0x94 ; 148 #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) unsigned long extruder_autofan_last_check = _millis(); #endif if ((extruder >= EXTRUDERS) 26d74: 12 14 cp r1, r2 26d76: 13 04 cpc r1, r3 26d78: 0c f4 brge .+2 ; 0x26d7c 26d7a: 8a c2 rjmp .+1300 ; 0x27290 pid_tuning_finished = true; pid_cycle = 0; return; } SERIAL_ECHOLNPGM("PID Autotune start"); 26d7c: 86 ea ldi r24, 0xA6 ; 166 26d7e: 94 e9 ldi r25, 0x94 ; 148 26d80: 0e 94 bd 7c call 0xf97a ; 0xf97a 26d84: 6a 85 ldd r22, Y+10 ; 0x0a 26d86: 7b 85 ldd r23, Y+11 ; 0x0b 26d88: 8c 85 ldd r24, Y+12 ; 0x0c 26d8a: 9d 85 ldd r25, Y+13 ; 0x0d 26d8c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> if (extruder<0) { soft_pwm_bed = (MAX_BED_POWER)/2; 26d90: 2f e7 ldi r18, 0x7F ; 127 return; } SERIAL_ECHOLNPGM("PID Autotune start"); if (extruder<0) 26d92: 21 14 cp r2, r1 26d94: 31 04 cpc r3, r1 26d96: 09 f4 brne .+2 ; 0x26d9a 26d98: e5 c0 rjmp .+458 ; 0x26f64 { soft_pwm_bed = (MAX_BED_POWER)/2; 26d9a: 20 93 ee 05 sts 0x05EE, r18 ; 0x8005ee bias = d = (MAX_BED_POWER)/2; target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen 26d9e: 70 93 5a 12 sts 0x125A, r23 ; 0x80125a 26da2: 60 93 59 12 sts 0x1259, r22 ; 0x801259 long bias, d; float Ku, Tu; float max = 0, min = 10000; uint8_t safety_check_cycles = 0; const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed 26da6: 8e 81 ldd r24, Y+6 ; 0x06 26da8: 9f 81 ldd r25, Y+7 ; 0x07 26daa: a8 85 ldd r26, Y+8 ; 0x08 26dac: b9 85 ldd r27, Y+9 ; 0x09 26dae: 8e 87 std Y+14, r24 ; 0x0e 26db0: 9f 87 std Y+15, r25 ; 0x0f 26db2: a8 8b std Y+16, r26 ; 0x10 26db4: b9 8b std Y+17, r27 ; 0x11 26db6: 88 a3 std Y+32, r24 ; 0x20 26db8: 99 a3 std Y+33, r25 ; 0x21 26dba: aa a3 std Y+34, r26 ; 0x22 26dbc: bb a3 std Y+35, r27 ; 0x23 26dbe: 1a 8a std Y+18, r1 ; 0x12 26dc0: 90 e4 ldi r25, 0x40 ; 64 26dc2: 9b 8b std Y+19, r25 ; 0x13 26dc4: ac e1 ldi r26, 0x1C ; 28 26dc6: ac 8b std Y+20, r26 ; 0x14 26dc8: b6 e4 ldi r27, 0x46 ; 70 26dca: bd 8b std Y+21, r27 ; 0x15 26dcc: 1e 8a std Y+22, r1 ; 0x16 26dce: 1f 8a std Y+23, r1 ; 0x17 26dd0: 18 8e std Y+24, r1 ; 0x18 26dd2: 19 8e std Y+25, r1 ; 0x19 26dd4: 6f e7 ldi r22, 0x7F ; 127 26dd6: c6 2e mov r12, r22 26dd8: d1 2c mov r13, r1 26dda: e1 2c mov r14, r1 26ddc: f1 2c mov r15, r1 26dde: 00 e0 ldi r16, 0x00 ; 0 26de0: 10 e0 ldi r17, 0x00 ; 0 26de2: 18 aa std Y+48, r1 ; 0x30 26de4: 1f a6 std Y+47, r1 ; 0x2f 26de6: 1d 82 std Y+5, r1 ; 0x05 26de8: 2f e7 ldi r18, 0x7F ; 127 26dea: 30 e0 ldi r19, 0x00 ; 0 26dec: 40 e0 ldi r20, 0x00 ; 0 26dee: 50 e0 ldi r21, 0x00 ; 0 26df0: 29 83 std Y+1, r18 ; 0x01 26df2: 3a 83 std Y+2, r19 ; 0x02 26df4: 4b 83 std Y+3, r20 ; 0x03 26df6: 5c 83 std Y+4, r21 ; 0x04 26df8: 1b 8e std Y+27, r1 ; 0x1b 26dfa: 1c 8e std Y+28, r1 ; 0x1c 26dfc: 1d 8e std Y+29, r1 ; 0x1d 26dfe: 1e 8e std Y+30, r1 ; 0x1e 26e00: 31 e0 ldi r19, 0x01 ; 1 26e02: 3a 8f std Y+26, r19 ; 0x1a target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen } for(;;) { #ifdef WATCHDOG wdt_reset(); 26e04: a8 95 wdr #endif //WATCHDOG if(temp_meas_ready == true) { // temp sample ready 26e06: 40 91 d5 05 lds r20, 0x05D5 ; 0x8005d5 26e0a: 48 a7 std Y+40, r20 ; 0x28 26e0c: 44 23 and r20, r20 26e0e: 09 f4 brne .+2 ; 0x26e12 26e10: 2c c2 rjmp .+1112 ; 0x2726a updateTemperatures(); 26e12: 0f 94 56 02 call 0x204ac ; 0x204ac input = (extruder<0)?current_temperature_bed:current_temperature[extruder]; 26e16: 21 14 cp r2, r1 26e18: 31 04 cpc r3, r1 26e1a: 09 f0 breq .+2 ; 0x26e1e 26e1c: aa c0 rjmp .+340 ; 0x26f72 26e1e: 00 91 5a 0d lds r16, 0x0D5A ; 0x800d5a 26e22: 10 91 5b 0d lds r17, 0x0D5B ; 0x800d5b 26e26: 50 91 5c 0d lds r21, 0x0D5C ; 0x800d5c 26e2a: 58 ab std Y+48, r21 ; 0x30 26e2c: 80 91 5d 0d lds r24, 0x0D5D ; 0x800d5d 26e30: 8f a7 std Y+47, r24 ; 0x2f max=max(max,input); 26e32: 2e 89 ldd r18, Y+22 ; 0x16 26e34: 3f 89 ldd r19, Y+23 ; 0x17 26e36: 48 8d ldd r20, Y+24 ; 0x18 26e38: 59 8d ldd r21, Y+25 ; 0x19 26e3a: b8 01 movw r22, r16 26e3c: 88 a9 ldd r24, Y+48 ; 0x30 26e3e: 9f a5 ldd r25, Y+47 ; 0x2f 26e40: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 26e44: 87 fd sbrc r24, 7 26e46: 06 c0 rjmp .+12 ; 0x26e54 26e48: 0e 8b std Y+22, r16 ; 0x16 26e4a: 1f 8b std Y+23, r17 ; 0x17 26e4c: b8 a9 ldd r27, Y+48 ; 0x30 26e4e: b8 8f std Y+24, r27 ; 0x18 26e50: 2f a5 ldd r18, Y+47 ; 0x2f 26e52: 29 8f std Y+25, r18 ; 0x19 min=min(min,input); 26e54: 2a 89 ldd r18, Y+18 ; 0x12 26e56: 3b 89 ldd r19, Y+19 ; 0x13 26e58: 4c 89 ldd r20, Y+20 ; 0x14 26e5a: 5d 89 ldd r21, Y+21 ; 0x15 26e5c: b8 01 movw r22, r16 26e5e: 88 a9 ldd r24, Y+48 ; 0x30 26e60: 9f a5 ldd r25, Y+47 ; 0x2f 26e62: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 26e66: 18 16 cp r1, r24 26e68: 34 f0 brlt .+12 ; 0x26e76 26e6a: 0a 8b std Y+18, r16 ; 0x12 26e6c: 1b 8b std Y+19, r17 ; 0x13 26e6e: 38 a9 ldd r19, Y+48 ; 0x30 26e70: 3c 8b std Y+20, r19 ; 0x14 26e72: 4f a5 ldd r20, Y+47 ; 0x2f 26e74: 4d 8b std Y+21, r20 ; 0x15 #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) if(_millis() - extruder_autofan_last_check > 2500) { 26e76: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26e7a: 2c a1 ldd r18, Y+36 ; 0x24 26e7c: 3d a1 ldd r19, Y+37 ; 0x25 26e7e: 4e a1 ldd r20, Y+38 ; 0x26 26e80: 5f a1 ldd r21, Y+39 ; 0x27 26e82: 62 1b sub r22, r18 26e84: 73 0b sbc r23, r19 26e86: 84 0b sbc r24, r20 26e88: 95 0b sbc r25, r21 26e8a: 65 3c cpi r22, 0xC5 ; 197 26e8c: 79 40 sbci r23, 0x09 ; 9 26e8e: 81 05 cpc r24, r1 26e90: 91 05 cpc r25, r1 26e92: 40 f0 brcs .+16 ; 0x26ea4 checkExtruderAutoFans(); 26e94: 0e 94 fb 77 call 0xeff6 ; 0xeff6 extruder_autofan_last_check = _millis(); 26e98: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26e9c: 6c a3 std Y+36, r22 ; 0x24 26e9e: 7d a3 std Y+37, r23 ; 0x25 26ea0: 8e a3 std Y+38, r24 ; 0x26 26ea2: 9f a3 std Y+39, r25 ; 0x27 } #endif if(heating == true && input > temp) { 26ea4: 4a 8d ldd r20, Y+26 ; 0x1a 26ea6: 44 23 and r20, r20 26ea8: 09 f4 brne .+2 ; 0x26eac 26eaa: 4c c0 rjmp .+152 ; 0x26f44 26eac: 2a 85 ldd r18, Y+10 ; 0x0a 26eae: 3b 85 ldd r19, Y+11 ; 0x0b 26eb0: 4c 85 ldd r20, Y+12 ; 0x0c 26eb2: 5d 85 ldd r21, Y+13 ; 0x0d 26eb4: b8 01 movw r22, r16 26eb6: 88 a9 ldd r24, Y+48 ; 0x30 26eb8: 9f a5 ldd r25, Y+47 ; 0x2f 26eba: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 26ebe: 18 16 cp r1, r24 26ec0: 0c f0 brlt .+2 ; 0x26ec4 26ec2: d3 c1 rjmp .+934 ; 0x2726a if(_millis() - t2 > 5000) { 26ec4: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26ec8: 2e 85 ldd r18, Y+14 ; 0x0e 26eca: 3f 85 ldd r19, Y+15 ; 0x0f 26ecc: 48 89 ldd r20, Y+16 ; 0x10 26ece: 59 89 ldd r21, Y+17 ; 0x11 26ed0: 62 1b sub r22, r18 26ed2: 73 0b sbc r23, r19 26ed4: 84 0b sbc r24, r20 26ed6: 95 0b sbc r25, r21 26ed8: 69 38 cpi r22, 0x89 ; 137 26eda: 73 41 sbci r23, 0x13 ; 19 26edc: 81 05 cpc r24, r1 26ede: 91 05 cpc r25, r1 26ee0: 08 f4 brcc .+2 ; 0x26ee4 26ee2: c3 c1 rjmp .+902 ; 0x2726a 26ee4: d7 01 movw r26, r14 26ee6: c6 01 movw r24, r12 26ee8: 29 81 ldd r18, Y+1 ; 0x01 26eea: 3a 81 ldd r19, Y+2 ; 0x02 26eec: 4b 81 ldd r20, Y+3 ; 0x03 26eee: 5c 81 ldd r21, Y+4 ; 0x04 26ef0: 82 1b sub r24, r18 26ef2: 93 0b sbc r25, r19 26ef4: a4 0b sbc r26, r20 26ef6: b5 0b sbc r27, r21 26ef8: b5 95 asr r27 26efa: a7 95 ror r26 26efc: 97 95 ror r25 26efe: 87 95 ror r24 heating=false; if (extruder<0) { 26f00: 21 14 cp r2, r1 26f02: 31 04 cpc r3, r1 26f04: 09 f4 brne .+2 ; 0x26f08 26f06: 40 c0 rjmp .+128 ; 0x26f88 soft_pwm_bed = (bias - d) >> 1; 26f08: 80 93 ee 05 sts 0x05EE, r24 ; 0x8005ee } else soft_pwm[extruder] = (bias - d) >> 1; t1=_millis(); 26f0c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26f10: 6e 83 std Y+6, r22 ; 0x06 26f12: 7f 83 std Y+7, r23 ; 0x07 26f14: 88 87 std Y+8, r24 ; 0x08 26f16: 99 87 std Y+9, r25 ; 0x09 t_high=t1 - t2; 26f18: dc 01 movw r26, r24 26f1a: cb 01 movw r24, r22 26f1c: 2e 85 ldd r18, Y+14 ; 0x0e 26f1e: 3f 85 ldd r19, Y+15 ; 0x0f 26f20: 48 89 ldd r20, Y+16 ; 0x10 26f22: 59 89 ldd r21, Y+17 ; 0x11 26f24: 82 1b sub r24, r18 26f26: 93 0b sbc r25, r19 26f28: a4 0b sbc r26, r20 26f2a: b5 0b sbc r27, r21 26f2c: 8b 8f std Y+27, r24 ; 0x1b 26f2e: 9c 8f std Y+28, r25 ; 0x1c 26f30: ad 8f std Y+29, r26 ; 0x1d 26f32: be 8f std Y+30, r27 ; 0x1e max=temp; 26f34: 3a 85 ldd r19, Y+10 ; 0x0a 26f36: 3e 8b std Y+22, r19 ; 0x16 26f38: 4b 85 ldd r20, Y+11 ; 0x0b 26f3a: 4f 8b std Y+23, r20 ; 0x17 26f3c: 5c 85 ldd r21, Y+12 ; 0x0c 26f3e: 58 8f std Y+24, r21 ; 0x18 26f40: 8d 85 ldd r24, Y+13 ; 0x0d 26f42: 89 8f std Y+25, r24 ; 0x19 } } if(heating == false && input < temp) { 26f44: 2a 85 ldd r18, Y+10 ; 0x0a 26f46: 3b 85 ldd r19, Y+11 ; 0x0b 26f48: 4c 85 ldd r20, Y+12 ; 0x0c 26f4a: 5d 85 ldd r21, Y+13 ; 0x0d 26f4c: b8 01 movw r22, r16 26f4e: 88 a9 ldd r24, Y+48 ; 0x30 26f50: 9f a5 ldd r25, Y+47 ; 0x2f 26f52: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 26f56: 87 fd sbrc r24, 7 26f58: 1a c0 rjmp .+52 ; 0x26f8e if(_millis() - t1 > 5000) { 26f5a: 1a 8e std Y+26, r1 ; 0x1a 26f5c: 86 c1 rjmp .+780 ; 0x2726a long bias, d; float Ku, Tu; float max = 0, min = 10000; uint8_t safety_check_cycles = 0; const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed 26f5e: 4a e0 ldi r20, 0x0A ; 10 26f60: 4f 8f std Y+31, r20 ; 0x1f 26f62: 00 cf rjmp .-512 ; 0x26d64 bias = d = (MAX_BED_POWER)/2; target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen } else { soft_pwm[extruder] = (PID_MAX)/2; 26f64: 20 93 f5 05 sts 0x05F5, r18 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> bias = d = (PID_MAX)/2; target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen 26f68: 70 93 5e 12 sts 0x125E, r23 ; 0x80125e 26f6c: 60 93 5d 12 sts 0x125D, r22 ; 0x80125d 26f70: 1a cf rjmp .-460 ; 0x26da6 wdt_reset(); #endif //WATCHDOG if(temp_meas_ready == true) { // temp sample ready updateTemperatures(); input = (extruder<0)?current_temperature_bed:current_temperature[extruder]; 26f72: 00 91 bc 03 lds r16, 0x03BC ; 0x8003bc 26f76: 10 91 bd 03 lds r17, 0x03BD ; 0x8003bd 26f7a: 90 91 be 03 lds r25, 0x03BE ; 0x8003be 26f7e: 98 ab std Y+48, r25 ; 0x30 26f80: a0 91 bf 03 lds r26, 0x03BF ; 0x8003bf 26f84: af a7 std Y+47, r26 ; 0x2f 26f86: 55 cf rjmp .-342 ; 0x26e32 heating=false; if (extruder<0) { soft_pwm_bed = (bias - d) >> 1; } else soft_pwm[extruder] = (bias - d) >> 1; 26f88: 80 93 f5 05 sts 0x05F5, r24 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 26f8c: bf cf rjmp .-130 ; 0x26f0c t_high=t1 - t2; max=temp; } } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { 26f8e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26f92: 2e 81 ldd r18, Y+6 ; 0x06 26f94: 3f 81 ldd r19, Y+7 ; 0x07 26f96: 48 85 ldd r20, Y+8 ; 0x08 26f98: 59 85 ldd r21, Y+9 ; 0x09 26f9a: 62 1b sub r22, r18 26f9c: 73 0b sbc r23, r19 26f9e: 84 0b sbc r24, r20 26fa0: 95 0b sbc r25, r21 26fa2: 69 38 cpi r22, 0x89 ; 137 26fa4: 73 41 sbci r23, 0x13 ; 19 26fa6: 81 05 cpc r24, r1 26fa8: 91 05 cpc r25, r1 26faa: b8 f2 brcs .-82 ; 0x26f5a heating=true; t2=_millis(); 26fac: 0f 94 f0 0d call 0x21be0 ; 0x21be0 26fb0: 6e 87 std Y+14, r22 ; 0x0e 26fb2: 7f 87 std Y+15, r23 ; 0x0f 26fb4: 88 8b std Y+16, r24 ; 0x10 26fb6: 99 8b std Y+17, r25 ; 0x11 t_low=t2 - t1; if(pid_cycle > 0) { 26fb8: 80 91 02 06 lds r24, 0x0602 ; 0x800602 26fbc: 90 91 03 06 lds r25, 0x0603 ; 0x800603 26fc0: 18 16 cp r1, r24 26fc2: 19 06 cpc r1, r25 26fc4: 0c f0 brlt .+2 ; 0x26fc8 26fc6: 2c c1 rjmp .+600 ; 0x27220 } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { heating=true; t2=_millis(); t_low=t2 - t1; 26fc8: 8e 85 ldd r24, Y+14 ; 0x0e 26fca: 9f 85 ldd r25, Y+15 ; 0x0f 26fcc: a8 89 ldd r26, Y+16 ; 0x10 26fce: b9 89 ldd r27, Y+17 ; 0x11 26fd0: 2e 81 ldd r18, Y+6 ; 0x06 26fd2: 3f 81 ldd r19, Y+7 ; 0x07 26fd4: 48 85 ldd r20, Y+8 ; 0x08 26fd6: 59 85 ldd r21, Y+9 ; 0x09 26fd8: 82 1b sub r24, r18 26fda: 93 0b sbc r25, r19 26fdc: a4 0b sbc r26, r20 26fde: b5 0b sbc r27, r21 if(pid_cycle > 0) { bias += (d*(t_high - t_low))/(t_low + t_high); 26fe0: 4b 8c ldd r4, Y+27 ; 0x1b 26fe2: 5c 8c ldd r5, Y+28 ; 0x1c 26fe4: 6d 8c ldd r6, Y+29 ; 0x1d 26fe6: 7e 8c ldd r7, Y+30 ; 0x1e 26fe8: 48 0e add r4, r24 26fea: 59 1e adc r5, r25 26fec: 6a 1e adc r6, r26 26fee: 7b 1e adc r7, r27 26ff0: 2b 8d ldd r18, Y+27 ; 0x1b 26ff2: 3c 8d ldd r19, Y+28 ; 0x1c 26ff4: 4d 8d ldd r20, Y+29 ; 0x1d 26ff6: 5e 8d ldd r21, Y+30 ; 0x1e 26ff8: 28 1b sub r18, r24 26ffa: 39 0b sbc r19, r25 26ffc: 4a 0b sbc r20, r26 26ffe: 5b 0b sbc r21, r27 27000: 69 81 ldd r22, Y+1 ; 0x01 27002: 7a 81 ldd r23, Y+2 ; 0x02 27004: 8b 81 ldd r24, Y+3 ; 0x03 27006: 9c 81 ldd r25, Y+4 ; 0x04 27008: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 2700c: a3 01 movw r20, r6 2700e: 92 01 movw r18, r4 27010: 0f 94 d1 a4 call 0x349a2 ; 0x349a2 <__divmodsi4> 27014: da 01 movw r26, r20 27016: c9 01 movw r24, r18 27018: 8c 0d add r24, r12 2701a: 9d 1d adc r25, r13 2701c: ae 1d adc r26, r14 2701e: bf 1d adc r27, r15 bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20); 27020: 84 31 cpi r24, 0x14 ; 20 27022: 91 05 cpc r25, r1 27024: a1 05 cpc r26, r1 27026: b1 05 cpc r27, r1 27028: 0c f4 brge .+2 ; 0x2702c 2702a: 3c c1 rjmp .+632 ; 0x272a4 2702c: 6c 01 movw r12, r24 2702e: 7d 01 movw r14, r26 27030: 3c ee ldi r19, 0xEC ; 236 27032: c3 16 cp r12, r19 27034: d1 04 cpc r13, r1 27036: e1 04 cpc r14, r1 27038: f1 04 cpc r15, r1 2703a: 2c f0 brlt .+10 ; 0x27046 2703c: 4b ee ldi r20, 0xEB ; 235 2703e: c4 2e mov r12, r20 27040: d1 2c mov r13, r1 27042: e1 2c mov r14, r1 27044: f1 2c mov r15, r1 if(bias > (extruder<0?(MAX_BED_POWER):(PID_MAX))/2) d = (extruder<0?(MAX_BED_POWER):(PID_MAX)) - 1 - bias; 27046: 80 38 cpi r24, 0x80 ; 128 27048: 91 05 cpc r25, r1 2704a: a1 05 cpc r26, r1 2704c: b1 05 cpc r27, r1 2704e: 0c f4 brge .+2 ; 0x27052 27050: 37 c1 rjmp .+622 ; 0x272c0 27052: 8e ef ldi r24, 0xFE ; 254 27054: 90 e0 ldi r25, 0x00 ; 0 27056: a0 e0 ldi r26, 0x00 ; 0 27058: b0 e0 ldi r27, 0x00 ; 0 2705a: 8c 19 sub r24, r12 2705c: 9d 09 sbc r25, r13 2705e: ae 09 sbc r26, r14 27060: bf 09 sbc r27, r15 27062: 89 83 std Y+1, r24 ; 0x01 27064: 9a 83 std Y+2, r25 ; 0x02 27066: ab 83 std Y+3, r26 ; 0x03 27068: bc 83 std Y+4, r27 ; 0x04 else d = bias; SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); 2706a: 8e e9 ldi r24, 0x9E ; 158 2706c: 94 e9 ldi r25, 0x94 ; 148 2706e: 0e 94 c4 7a call 0xf588 ; 0xf588 27072: c7 01 movw r24, r14 27074: b6 01 movw r22, r12 27076: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d); 2707a: 89 e9 ldi r24, 0x99 ; 153 2707c: 94 e9 ldi r25, 0x94 ; 148 2707e: 0e 94 c4 7a call 0xf588 ; 0xf588 27082: 69 81 ldd r22, Y+1 ; 0x01 27084: 7a 81 ldd r23, Y+2 ; 0x02 27086: 8b 81 ldd r24, Y+3 ; 0x03 27088: 9c 81 ldd r25, Y+4 ; 0x04 2708a: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min); 2708e: 82 e9 ldi r24, 0x92 ; 146 27090: 94 e9 ldi r25, 0x94 ; 148 27092: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 27096: 42 e0 ldi r20, 0x02 ; 2 27098: 6a 89 ldd r22, Y+18 ; 0x12 2709a: 7b 89 ldd r23, Y+19 ; 0x13 2709c: 8c 89 ldd r24, Y+20 ; 0x14 2709e: 9d 89 ldd r25, Y+21 ; 0x15 270a0: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max); 270a4: 8b e8 ldi r24, 0x8B ; 139 270a6: 94 e9 ldi r25, 0x94 ; 148 270a8: 0e 94 c4 7a call 0xf588 ; 0xf588 270ac: 6e 89 ldd r22, Y+22 ; 0x16 270ae: 7f 89 ldd r23, Y+23 ; 0x17 270b0: 88 8d ldd r24, Y+24 ; 0x18 270b2: 99 8d ldd r25, Y+25 ; 0x19 270b4: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 if(pid_cycle > 2) { 270b8: 80 91 02 06 lds r24, 0x0602 ; 0x800602 270bc: 90 91 03 06 lds r25, 0x0603 ; 0x800603 270c0: 03 97 sbiw r24, 0x03 ; 3 270c2: 0c f4 brge .+2 ; 0x270c6 270c4: ad c0 rjmp .+346 ; 0x27220 Ku = (4.0*d)/(3.14159*(max-min)/2.0); 270c6: 69 81 ldd r22, Y+1 ; 0x01 270c8: 7a 81 ldd r23, Y+2 ; 0x02 270ca: 8b 81 ldd r24, Y+3 ; 0x03 270cc: 9c 81 ldd r25, Y+4 ; 0x04 270ce: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 270d2: 20 e0 ldi r18, 0x00 ; 0 270d4: 30 e0 ldi r19, 0x00 ; 0 270d6: 40 e8 ldi r20, 0x80 ; 128 270d8: 50 e4 ldi r21, 0x40 ; 64 270da: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 270de: 4b 01 movw r8, r22 270e0: 5c 01 movw r10, r24 270e2: 2a 89 ldd r18, Y+18 ; 0x12 270e4: 3b 89 ldd r19, Y+19 ; 0x13 270e6: 4c 89 ldd r20, Y+20 ; 0x14 270e8: 5d 89 ldd r21, Y+21 ; 0x15 270ea: 6e 89 ldd r22, Y+22 ; 0x16 270ec: 7f 89 ldd r23, Y+23 ; 0x17 270ee: 88 8d ldd r24, Y+24 ; 0x18 270f0: 99 8d ldd r25, Y+25 ; 0x19 270f2: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 270f6: 20 ed ldi r18, 0xD0 ; 208 270f8: 3f e0 ldi r19, 0x0F ; 15 270fa: 49 e4 ldi r20, 0x49 ; 73 270fc: 50 e4 ldi r21, 0x40 ; 64 270fe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27102: 20 e0 ldi r18, 0x00 ; 0 27104: 30 e0 ldi r19, 0x00 ; 0 27106: 40 e0 ldi r20, 0x00 ; 0 27108: 5f e3 ldi r21, 0x3F ; 63 2710a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2710e: 9b 01 movw r18, r22 27110: ac 01 movw r20, r24 27112: c5 01 movw r24, r10 27114: b4 01 movw r22, r8 27116: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2711a: 4b 01 movw r8, r22 2711c: 5c 01 movw r10, r24 Tu = ((float)(t_low + t_high)/1000.0); 2711e: c3 01 movw r24, r6 27120: b2 01 movw r22, r4 27122: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 27126: 20 e0 ldi r18, 0x00 ; 0 27128: 30 e0 ldi r19, 0x00 ; 0 2712a: 4a e7 ldi r20, 0x7A ; 122 2712c: 54 e4 ldi r21, 0x44 ; 68 2712e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 27132: 2b 01 movw r4, r22 27134: 3c 01 movw r6, r24 SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku); 27136: 85 e8 ldi r24, 0x85 ; 133 27138: 94 e9 ldi r25, 0x94 ; 148 2713a: 0e 94 c4 7a call 0xf588 ; 0xf588 2713e: 42 e0 ldi r20, 0x02 ; 2 27140: c5 01 movw r24, r10 27142: b4 01 movw r22, r8 27144: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu); 27148: 8f e7 ldi r24, 0x7F ; 127 2714a: 94 e9 ldi r25, 0x94 ; 148 2714c: 0e 94 c4 7a call 0xf588 ; 0xf588 27150: c3 01 movw r24, r6 27152: b2 01 movw r22, r4 27154: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 _Kp = 0.6*Ku; 27158: 2a e9 ldi r18, 0x9A ; 154 2715a: 39 e9 ldi r19, 0x99 ; 153 2715c: 49 e1 ldi r20, 0x19 ; 25 2715e: 5f e3 ldi r21, 0x3F ; 63 27160: c5 01 movw r24, r10 27162: b4 01 movw r22, r8 27164: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27168: 4b 01 movw r8, r22 2716a: 5c 01 movw r10, r24 2716c: 80 92 da 03 sts 0x03DA, r8 ; 0x8003da <_Kp> 27170: 90 92 db 03 sts 0x03DB, r9 ; 0x8003db <_Kp+0x1> 27174: a0 92 dc 03 sts 0x03DC, r10 ; 0x8003dc <_Kp+0x2> 27178: b0 92 dd 03 sts 0x03DD, r11 ; 0x8003dd <_Kp+0x3> _Ki = 2*_Kp/Tu; 2717c: ac 01 movw r20, r24 2717e: 9b 01 movw r18, r22 27180: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 27184: a3 01 movw r20, r6 27186: 92 01 movw r18, r4 27188: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2718c: 60 93 d6 03 sts 0x03D6, r22 ; 0x8003d6 <_Ki> 27190: 70 93 d7 03 sts 0x03D7, r23 ; 0x8003d7 <_Ki+0x1> 27194: 80 93 d8 03 sts 0x03D8, r24 ; 0x8003d8 <_Ki+0x2> 27198: 90 93 d9 03 sts 0x03D9, r25 ; 0x8003d9 <_Ki+0x3> _Kd = _Kp*Tu/8; 2719c: a3 01 movw r20, r6 2719e: 92 01 movw r18, r4 271a0: c5 01 movw r24, r10 271a2: b4 01 movw r22, r8 271a4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 271a8: 20 e0 ldi r18, 0x00 ; 0 271aa: 30 e0 ldi r19, 0x00 ; 0 271ac: 40 e0 ldi r20, 0x00 ; 0 271ae: 5e e3 ldi r21, 0x3E ; 62 271b0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 271b4: 60 93 d2 03 sts 0x03D2, r22 ; 0x8003d2 <_Kd> 271b8: 70 93 d3 03 sts 0x03D3, r23 ; 0x8003d3 <_Kd+0x1> 271bc: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 <_Kd+0x2> 271c0: 90 93 d5 03 sts 0x03D5, r25 ; 0x8003d5 <_Kd+0x3> SERIAL_PROTOCOLLNPGM(" Classic PID "); 271c4: 81 e7 ldi r24, 0x71 ; 113 271c6: 94 e9 ldi r25, 0x94 ; 148 271c8: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(_Kp); 271cc: 8b e6 ldi r24, 0x6B ; 107 271ce: 94 e9 ldi r25, 0x94 ; 148 271d0: 0e 94 c4 7a call 0xf588 ; 0xf588 271d4: 60 91 da 03 lds r22, 0x03DA ; 0x8003da <_Kp> 271d8: 70 91 db 03 lds r23, 0x03DB ; 0x8003db <_Kp+0x1> 271dc: 80 91 dc 03 lds r24, 0x03DC ; 0x8003dc <_Kp+0x2> 271e0: 90 91 dd 03 lds r25, 0x03DD ; 0x8003dd <_Kp+0x3> 271e4: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki); 271e8: 85 e6 ldi r24, 0x65 ; 101 271ea: 94 e9 ldi r25, 0x94 ; 148 271ec: 0e 94 c4 7a call 0xf588 ; 0xf588 271f0: 60 91 d6 03 lds r22, 0x03D6 ; 0x8003d6 <_Ki> 271f4: 70 91 d7 03 lds r23, 0x03D7 ; 0x8003d7 <_Ki+0x1> 271f8: 80 91 d8 03 lds r24, 0x03D8 ; 0x8003d8 <_Ki+0x2> 271fc: 90 91 d9 03 lds r25, 0x03D9 ; 0x8003d9 <_Ki+0x3> 27200: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd); 27204: 8f e5 ldi r24, 0x5F ; 95 27206: 94 e9 ldi r25, 0x94 ; 148 27208: 0e 94 c4 7a call 0xf588 ; 0xf588 2720c: 60 91 d2 03 lds r22, 0x03D2 ; 0x8003d2 <_Kd> 27210: 70 91 d3 03 lds r23, 0x03D3 ; 0x8003d3 <_Kd+0x1> 27214: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 <_Kd+0x2> 27218: 90 91 d5 03 lds r25, 0x03D5 ; 0x8003d5 <_Kd+0x3> 2721c: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 27220: 89 81 ldd r24, Y+1 ; 0x01 27222: 9a 81 ldd r25, Y+2 ; 0x02 27224: ab 81 ldd r26, Y+3 ; 0x03 27226: bc 81 ldd r27, Y+4 ; 0x04 27228: 8c 0d add r24, r12 2722a: 9d 1d adc r25, r13 2722c: ae 1d adc r26, r14 2722e: bf 1d adc r27, r15 27230: b5 95 asr r27 27232: a7 95 ror r26 27234: 97 95 ror r25 27236: 87 95 ror r24 SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki); SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd); */ } } if (extruder<0) 27238: 21 14 cp r2, r1 2723a: 31 04 cpc r3, r1 2723c: 09 f4 brne .+2 ; 0x27240 2723e: 45 c0 rjmp .+138 ; 0x272ca { soft_pwm_bed = (bias + d) >> 1; 27240: 80 93 ee 05 sts 0x05EE, r24 ; 0x8005ee } else soft_pwm[extruder] = (bias + d) >> 1; pid_cycle++; 27244: 80 91 02 06 lds r24, 0x0602 ; 0x800602 27248: 90 91 03 06 lds r25, 0x0603 ; 0x800603 2724c: 01 96 adiw r24, 0x01 ; 1 2724e: 90 93 03 06 sts 0x0603, r25 ; 0x800603 27252: 80 93 02 06 sts 0x0602, r24 ; 0x800602 min=temp; 27256: 3a 85 ldd r19, Y+10 ; 0x0a 27258: 3a 8b std Y+18, r19 ; 0x12 2725a: 4b 85 ldd r20, Y+11 ; 0x0b 2725c: 4b 8b std Y+19, r20 ; 0x13 2725e: 5c 85 ldd r21, Y+12 ; 0x0c 27260: 5c 8b std Y+20, r21 ; 0x14 27262: 8d 85 ldd r24, Y+13 ; 0x0d 27264: 8d 8b std Y+21, r24 ; 0x15 max=temp; } } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { heating=true; 27266: 98 a5 ldd r25, Y+40 ; 0x28 27268: 9a 8f std Y+26, r25 ; 0x1a } } #ifndef MAX_OVERSHOOT_PID_AUTOTUNE #define MAX_OVERSHOOT_PID_AUTOTUNE 20 #endif if(input > (temp + MAX_OVERSHOOT_PID_AUTOTUNE)) { 2726a: 20 e0 ldi r18, 0x00 ; 0 2726c: 30 e0 ldi r19, 0x00 ; 0 2726e: 40 ea ldi r20, 0xA0 ; 160 27270: 51 e4 ldi r21, 0x41 ; 65 27272: 6a 85 ldd r22, Y+10 ; 0x0a 27274: 7b 85 ldd r23, Y+11 ; 0x0b 27276: 8c 85 ldd r24, Y+12 ; 0x0c 27278: 9d 85 ldd r25, Y+13 ; 0x0d 2727a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2727e: 98 01 movw r18, r16 27280: 48 a9 ldd r20, Y+48 ; 0x30 27282: 5f a5 ldd r21, Y+47 ; 0x2f 27284: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 27288: 87 ff sbrs r24, 7 2728a: 22 c0 rjmp .+68 ; 0x272d0 SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); 2728c: 85 e3 ldi r24, 0x35 ; 53 2728e: 94 e9 ldi r25, 0x94 ; 148 pid_tuning_finished = true; pid_cycle = 0; return; } if(pid_cycle > ncycles) { SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h"); 27290: 0e 94 bd 7c call 0xf97a ; 0xf97a pid_tuning_finished = true; 27294: 81 e0 ldi r24, 0x01 ; 1 27296: 80 93 41 02 sts 0x0241, r24 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> pid_cycle = 0; 2729a: 10 92 03 06 sts 0x0603, r1 ; 0x800603 2729e: 10 92 02 06 sts 0x0602, r1 ; 0x800602 272a2: 98 c0 rjmp .+304 ; 0x273d4 heating=true; t2=_millis(); t_low=t2 - t1; if(pid_cycle > 0) { bias += (d*(t_high - t_low))/(t_low + t_high); bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20); 272a4: 34 e1 ldi r19, 0x14 ; 20 272a6: c3 2e mov r12, r19 272a8: d1 2c mov r13, r1 272aa: e1 2c mov r14, r1 272ac: f1 2c mov r15, r1 272ae: 24 e1 ldi r18, 0x14 ; 20 272b0: 30 e0 ldi r19, 0x00 ; 0 272b2: 40 e0 ldi r20, 0x00 ; 0 272b4: 50 e0 ldi r21, 0x00 ; 0 272b6: 29 83 std Y+1, r18 ; 0x01 272b8: 3a 83 std Y+2, r19 ; 0x02 272ba: 4b 83 std Y+3, r20 ; 0x03 272bc: 5c 83 std Y+4, r21 ; 0x04 272be: d5 ce rjmp .-598 ; 0x2706a 272c0: c9 82 std Y+1, r12 ; 0x01 272c2: da 82 std Y+2, r13 ; 0x02 272c4: eb 82 std Y+3, r14 ; 0x03 272c6: fc 82 std Y+4, r15 ; 0x04 272c8: d0 ce rjmp .-608 ; 0x2706a if (extruder<0) { soft_pwm_bed = (bias + d) >> 1; } else soft_pwm[extruder] = (bias + d) >> 1; 272ca: 80 93 f5 05 sts 0x05F5, r24 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 272ce: ba cf rjmp .-140 ; 0x27244 SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); pid_tuning_finished = true; pid_cycle = 0; return; } if(_millis() - temp_millis > 2000) { 272d0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 272d4: 28 a1 ldd r18, Y+32 ; 0x20 272d6: 39 a1 ldd r19, Y+33 ; 0x21 272d8: 4a a1 ldd r20, Y+34 ; 0x22 272da: 5b a1 ldd r21, Y+35 ; 0x23 272dc: 62 1b sub r22, r18 272de: 73 0b sbc r23, r19 272e0: 84 0b sbc r24, r20 272e2: 95 0b sbc r25, r21 272e4: 61 3d cpi r22, 0xD1 ; 209 272e6: 77 40 sbci r23, 0x07 ; 7 272e8: 81 05 cpc r24, r1 272ea: 91 05 cpc r25, r1 272ec: 58 f1 brcs .+86 ; 0x27344 int p; if (extruder<0){ p=soft_pwm_bed; 272ee: a0 90 ee 05 lds r10, 0x05EE ; 0x8005ee 272f2: b1 2c mov r11, r1 SERIAL_PROTOCOLPGM("B:"); 272f4: 82 e3 ldi r24, 0x32 ; 50 272f6: 94 e9 ldi r25, 0x94 ; 148 pid_cycle = 0; return; } if(_millis() - temp_millis > 2000) { int p; if (extruder<0){ 272f8: 21 14 cp r2, r1 272fa: 31 04 cpc r3, r1 272fc: 29 f4 brne .+10 ; 0x27308 p=soft_pwm_bed; SERIAL_PROTOCOLPGM("B:"); }else{ p=soft_pwm[extruder]; 272fe: a0 90 f5 05 lds r10, 0x05F5 ; 0x8005f5 <_ZL8soft_pwm.lto_priv.504> 27302: b1 2c mov r11, r1 SERIAL_PROTOCOLPGM("T:"); 27304: 8f e2 ldi r24, 0x2F ; 47 27306: 94 e9 ldi r25, 0x94 ; 148 27308: 0e 94 c4 7a call 0xf588 ; 0xf588 2730c: 42 e0 ldi r20, 0x02 ; 2 2730e: b8 01 movw r22, r16 27310: 88 a9 ldd r24, Y+48 ; 0x30 27312: 9f a5 ldd r25, Y+47 ; 0x2f 27314: 0e 94 46 7a call 0xf48c ; 0xf48c } SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); 27318: 8b e2 ldi r24, 0x2B ; 43 2731a: 94 e9 ldi r25, 0x94 ; 148 2731c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_PROTOCOLLN(p); 27320: c5 01 movw r24, r10 27322: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e if (safety_check_cycles == 0) { //save ambient temp 27326: 4d 81 ldd r20, Y+5 ; 0x05 27328: 44 23 and r20, r20 2732a: 09 f4 brne .+2 ; 0x2732e 2732c: 6c c0 rjmp .+216 ; 0x27406 temp_ambient = input; //SERIAL_ECHOPGM("Ambient T: "); //MYSERIAL.println(temp_ambient); safety_check_cycles++; } else if (safety_check_cycles < safety_check_cycles_count) { //delay 2732e: 5f 8d ldd r21, Y+31 ; 0x1f 27330: 45 17 cp r20, r21 27332: 70 f5 brcc .+92 ; 0x27390 safety_check_cycles++; 27334: 4f 5f subi r20, 0xFF ; 255 27336: 4d 83 std Y+5, r20 ; 0x05 temp_runaway_stop(false, (extruder<0)); pid_tuning_finished = true; return; } } temp_millis = _millis(); 27338: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2733c: 68 a3 std Y+32, r22 ; 0x20 2733e: 79 a3 std Y+33, r23 ; 0x21 27340: 8a a3 std Y+34, r24 ; 0x22 27342: 9b a3 std Y+35, r25 ; 0x23 } if(((_millis() - t1) + (_millis() - t2)) > (10L*60L*1000L*2L)) { 27344: 0f 94 f0 0d call 0x21be0 ; 0x21be0 27348: 4b 01 movw r8, r22 2734a: 5c 01 movw r10, r24 2734c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 27350: 4e 80 ldd r4, Y+6 ; 0x06 27352: 5f 80 ldd r5, Y+7 ; 0x07 27354: 68 84 ldd r6, Y+8 ; 0x08 27356: 79 84 ldd r7, Y+9 ; 0x09 27358: 2e 85 ldd r18, Y+14 ; 0x0e 2735a: 3f 85 ldd r19, Y+15 ; 0x0f 2735c: 48 89 ldd r20, Y+16 ; 0x10 2735e: 59 89 ldd r21, Y+17 ; 0x11 27360: 42 0e add r4, r18 27362: 53 1e adc r5, r19 27364: 64 1e adc r6, r20 27366: 75 1e adc r7, r21 27368: 84 18 sub r8, r4 2736a: 95 08 sbc r9, r5 2736c: a6 08 sbc r10, r6 2736e: b7 08 sbc r11, r7 27370: 86 0e add r8, r22 27372: 97 1e adc r9, r23 27374: a8 1e adc r10, r24 27376: b9 1e adc r11, r25 27378: 31 e8 ldi r19, 0x81 ; 129 2737a: 83 16 cp r8, r19 2737c: 3f e4 ldi r19, 0x4F ; 79 2737e: 93 06 cpc r9, r19 27380: 32 e1 ldi r19, 0x12 ; 18 27382: a3 06 cpc r10, r19 27384: b1 04 cpc r11, r1 27386: 08 f4 brcc .+2 ; 0x2738a 27388: 47 c0 rjmp .+142 ; 0x27418 SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); 2738a: 8e e0 ldi r24, 0x0E ; 14 2738c: 94 e9 ldi r25, 0x94 ; 148 2738e: 80 cf rjmp .-256 ; 0x27290 safety_check_cycles++; } else if (safety_check_cycles < safety_check_cycles_count) { //delay safety_check_cycles++; } else if (safety_check_cycles == safety_check_cycles_count){ //check that temperature is rising 27390: 8d 81 ldd r24, Y+5 ; 0x05 27392: 9f 8d ldd r25, Y+31 ; 0x1f 27394: 89 13 cpse r24, r25 27396: d0 cf rjmp .-96 ; 0x27338 safety_check_cycles++; 27398: 8f 5f subi r24, 0xFF ; 255 2739a: 8d 83 std Y+5, r24 ; 0x05 //SERIAL_ECHOPGM("Time from beginning: "); //MYSERIAL.print(safety_check_cycles_count * 2); //SERIAL_ECHOPGM("s. Difference between current and ambient T: "); //MYSERIAL.println(input - temp_ambient); if (fabs(input - temp_ambient) < 5.0) { 2739c: 2b a5 ldd r18, Y+43 ; 0x2b 2739e: 3c a5 ldd r19, Y+44 ; 0x2c 273a0: 4d a5 ldd r20, Y+45 ; 0x2d 273a2: 5e a5 ldd r21, Y+46 ; 0x2e 273a4: b8 01 movw r22, r16 273a6: 88 a9 ldd r24, Y+48 ; 0x30 273a8: 9f a5 ldd r25, Y+47 ; 0x2f 273aa: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 273ae: 9f 77 andi r25, 0x7F ; 127 273b0: 20 e0 ldi r18, 0x00 ; 0 273b2: 30 e0 ldi r19, 0x00 ; 0 273b4: 40 ea ldi r20, 0xA0 ; 160 273b6: 50 e4 ldi r21, 0x40 ; 64 273b8: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 273bc: 87 ff sbrs r24, 7 273be: bc cf rjmp .-136 ; 0x27338 temp_runaway_stop(false, (extruder<0)); 273c0: 63 2d mov r22, r3 273c2: 66 1f adc r22, r22 273c4: 66 27 eor r22, r22 273c6: 66 1f adc r22, r22 273c8: 80 e0 ldi r24, 0x00 ; 0 273ca: 0f 94 3a 36 call 0x26c74 ; 0x26c74 pid_tuning_finished = true; 273ce: 81 e0 ldi r24, 0x01 ; 1 273d0: 80 93 41 02 sts 0x0241, r24 ; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426> pid_cycle = 0; return; } lcd_update(0); } } 273d4: e0 96 adiw r28, 0x30 ; 48 273d6: 0f b6 in r0, 0x3f ; 63 273d8: f8 94 cli 273da: de bf out 0x3e, r29 ; 62 273dc: 0f be out 0x3f, r0 ; 63 273de: cd bf out 0x3d, r28 ; 61 273e0: df 91 pop r29 273e2: cf 91 pop r28 273e4: 1f 91 pop r17 273e6: 0f 91 pop r16 273e8: ff 90 pop r15 273ea: ef 90 pop r14 273ec: df 90 pop r13 273ee: cf 90 pop r12 273f0: bf 90 pop r11 273f2: af 90 pop r10 273f4: 9f 90 pop r9 273f6: 8f 90 pop r8 273f8: 7f 90 pop r7 273fa: 6f 90 pop r6 273fc: 5f 90 pop r5 273fe: 4f 90 pop r4 27400: 3f 90 pop r3 27402: 2f 90 pop r2 27404: 08 95 ret SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); SERIAL_PROTOCOLLN(p); if (safety_check_cycles == 0) { //save ambient temp temp_ambient = input; 27406: 0b a7 std Y+43, r16 ; 0x2b 27408: 1c a7 std Y+44, r17 ; 0x2c 2740a: a8 a9 ldd r26, Y+48 ; 0x30 2740c: ad a7 std Y+45, r26 ; 0x2d 2740e: bf a5 ldd r27, Y+47 ; 0x2f 27410: be a7 std Y+46, r27 ; 0x2e //SERIAL_ECHOPGM("Ambient T: "); //MYSERIAL.println(temp_ambient); safety_check_cycles++; 27412: 21 e0 ldi r18, 0x01 ; 1 27414: 2d 83 std Y+5, r18 ; 0x05 27416: 90 cf rjmp .-224 ; 0x27338 SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); pid_tuning_finished = true; pid_cycle = 0; return; } if(pid_cycle > ncycles) { 27418: 80 91 02 06 lds r24, 0x0602 ; 0x800602 2741c: 90 91 03 06 lds r25, 0x0603 ; 0x800603 27420: 49 a5 ldd r20, Y+41 ; 0x29 27422: 5a a5 ldd r21, Y+42 ; 0x2a 27424: 48 17 cp r20, r24 27426: 59 07 cpc r21, r25 27428: 1c f4 brge .+6 ; 0x27430 SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h"); 2742a: 82 eb ldi r24, 0xB2 ; 178 2742c: 93 e9 ldi r25, 0x93 ; 147 2742e: 30 cf rjmp .-416 ; 0x27290 pid_tuning_finished = true; pid_cycle = 0; return; } lcd_update(0); 27430: 80 e0 ldi r24, 0x00 ; 0 27432: 0e 94 f9 6e call 0xddf2 ; 0xddf2 27436: e6 cc rjmp .-1588 ; 0x26e04 00027438 : } void handle_temp_error(); void manage_heater() { 27438: cf 92 push r12 2743a: df 92 push r13 2743c: ef 92 push r14 2743e: ff 92 push r15 27440: 0f 93 push r16 27442: 1f 93 push r17 27444: cf 93 push r28 27446: df 93 push r29 27448: 1f 92 push r1 2744a: 1f 92 push r1 2744c: cd b7 in r28, 0x3d ; 61 2744e: de b7 in r29, 0x3e ; 62 #ifdef WATCHDOG wdt_reset(); 27450: a8 95 wdr #endif //WATCHDOG // limit execution to the same rate as temp_mgr (low-level fault handling is already handled - // any remaining error handling is just user-facing and can wait one extra cycle) if(!temp_meas_ready) 27452: 80 91 d5 05 lds r24, 0x05D5 ; 0x8005d5 27456: 88 23 and r24, r24 27458: 09 f4 brne .+2 ; 0x2745c 2745a: 29 c2 rjmp .+1106 ; 0x278ae return; // syncronize temperatures with isr updateTemperatures(); 2745c: 0f 94 56 02 call 0x204ac ; 0x204ac if(thermal_model::warning_state.warning) thermal_model::handle_warning(); #endif // handle temperature errors if(temp_error_state.v) 27460: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 27464: 88 23 and r24, r24 27466: 89 f1 breq .+98 ; 0x274ca #endif void handle_temp_error() { // relay to the original handler switch((TempErrorType)temp_error_state.type) { 27468: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 2746c: 82 95 swap r24 2746e: 86 95 lsr r24 27470: 87 70 andi r24, 0x07 ; 7 27472: 81 30 cpi r24, 0x01 ; 1 27474: 01 f1 breq .+64 ; 0x274b6 27476: 08 f4 brcc .+2 ; 0x2747a 27478: be c1 rjmp .+892 ; 0x277f6 2747a: 84 30 cpi r24, 0x04 ; 4 2747c: 30 f5 brcc .+76 ; 0x274ca #endif } break; case TempErrorType::preheat: case TempErrorType::runaway: switch((TempErrorSource)temp_error_state.source) { 2747e: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 27482: 86 95 lsr r24 27484: 86 95 lsr r24 27486: 83 70 andi r24, 0x03 ; 3 27488: 82 30 cpi r24, 0x02 ; 2 2748a: f8 f4 brcc .+62 ; 0x274ca case TempErrorSource::hotend: case TempErrorSource::bed: temp_runaway_stop( ((TempErrorType)temp_error_state.type == TempErrorType::preheat), ((TempErrorSource)temp_error_state.source == TempErrorSource::bed)); 2748c: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 27490: 86 95 lsr r24 27492: 86 95 lsr r24 27494: 83 70 andi r24, 0x03 ; 3 case TempErrorType::runaway: switch((TempErrorSource)temp_error_state.source) { case TempErrorSource::hotend: case TempErrorSource::bed: temp_runaway_stop( ((TempErrorType)temp_error_state.type == TempErrorType::preheat), 27496: 90 91 cc 03 lds r25, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 2749a: 92 95 swap r25 2749c: 96 95 lsr r25 2749e: 97 70 andi r25, 0x07 ; 7 case TempErrorType::preheat: case TempErrorType::runaway: switch((TempErrorSource)temp_error_state.source) { case TempErrorSource::hotend: case TempErrorSource::bed: temp_runaway_stop( 274a0: 61 e0 ldi r22, 0x01 ; 1 274a2: 81 30 cpi r24, 0x01 ; 1 274a4: 09 f0 breq .+2 ; 0x274a8 274a6: 60 e0 ldi r22, 0x00 ; 0 274a8: 81 e0 ldi r24, 0x01 ; 1 274aa: 92 30 cpi r25, 0x02 ; 2 274ac: 09 f0 breq .+2 ; 0x274b0 274ae: 80 e0 ldi r24, 0x00 ; 0 274b0: 0f 94 3a 36 call 0x26c74 ; 0x26c74 274b4: 0a c0 rjmp .+20 ; 0x274ca void handle_temp_error() { // relay to the original handler switch((TempErrorType)temp_error_state.type) { case TempErrorType::min: switch((TempErrorSource)temp_error_state.source) { 274b6: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 274ba: 86 95 lsr r24 274bc: 86 95 lsr r24 274be: 83 70 andi r24, 0x03 ; 3 274c0: 09 f4 brne .+2 ; 0x274c4 274c2: 4b c1 rjmp .+662 ; 0x2775a 274c4: 81 30 cpi r24, 0x01 ; 1 274c6: 09 f4 brne .+2 ; 0x274ca 274c8: 79 c1 rjmp .+754 ; 0x277bc #ifndef DEBUG_DISABLE_FANCHECK #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) #ifdef FAN_SOFT_PWM #ifdef FANCHECK if ((_millis() - extruder_autofan_last_check > FAN_CHECK_PERIOD) && (!fan_measuring)) { 274ca: 0f 94 f0 0d call 0x21be0 ; 0x21be0 274ce: 00 91 07 17 lds r16, 0x1707 ; 0x801707 274d2: 10 91 08 17 lds r17, 0x1708 ; 0x801708 274d6: 20 91 09 17 lds r18, 0x1709 ; 0x801709 274da: 30 91 0a 17 lds r19, 0x170A ; 0x80170a 274de: 60 1b sub r22, r16 274e0: 71 0b sbc r23, r17 274e2: 82 0b sbc r24, r18 274e4: 93 0b sbc r25, r19 274e6: 69 38 cpi r22, 0x89 ; 137 274e8: 73 41 sbci r23, 0x13 ; 19 274ea: 81 05 cpc r24, r1 274ec: 91 05 cpc r25, r1 274ee: d0 f0 brcs .+52 ; 0x27524 274f0: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 274f4: 81 11 cpse r24, r1 274f6: 16 c0 rjmp .+44 ; 0x27524 extruder_autofan_last_check = _millis(); 274f8: 0f 94 f0 0d call 0x21be0 ; 0x21be0 274fc: 60 93 07 17 sts 0x1707, r22 ; 0x801707 27500: 70 93 08 17 sts 0x1708, r23 ; 0x801708 27504: 80 93 09 17 sts 0x1709, r24 ; 0x801709 27508: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a fanSpeedBckp = fanSpeedSoftPwm; 2750c: 80 91 1d 06 lds r24, 0x061D ; 0x80061d 27510: 80 93 65 02 sts 0x0265, r24 ; 0x800265 if (fanSpeedSoftPwm >= MIN_PRINT_FAN_SPEED) { //if we are in rage where we are doing fan check, set full PWM range for a short time to measure fan RPM by reading tacho signal without modulation by PWM signal 27514: 8b 34 cpi r24, 0x4B ; 75 27516: 18 f0 brcs .+6 ; 0x2751e // printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm); fanSpeedSoftPwm = 255; 27518: 8f ef ldi r24, 0xFF ; 255 2751a: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d } fan_measuring = true; 2751e: 81 e0 ldi r24, 0x01 ; 1 27520: 80 93 b6 03 sts 0x03B6, r24 ; 0x8003b6 } if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) { 27524: 0f 94 f0 0d call 0x21be0 ; 0x21be0 27528: 00 91 07 17 lds r16, 0x1707 ; 0x801707 2752c: 10 91 08 17 lds r17, 0x1708 ; 0x801708 27530: 20 91 09 17 lds r18, 0x1709 ; 0x801709 27534: 30 91 0a 17 lds r19, 0x170A ; 0x80170a 27538: 60 1b sub r22, r16 2753a: 71 0b sbc r23, r17 2753c: 82 0b sbc r24, r18 2753e: 93 0b sbc r25, r19 27540: 65 36 cpi r22, 0x65 ; 101 27542: 71 05 cpc r23, r1 27544: 81 05 cpc r24, r1 27546: 91 05 cpc r25, r1 27548: 08 f4 brcc .+2 ; 0x2754c 2754a: a5 c1 rjmp .+842 ; 0x27896 2754c: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 27550: 88 23 and r24, r24 27552: 09 f4 brne .+2 ; 0x27556 27554: a0 c1 rjmp .+832 ; 0x27896 #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))) void countFanSpeed() { //SERIAL_ECHOPGM("edge counter 1:"); MYSERIAL.println(fan_edge_counter[1]); fan_speed[0] = (fan_edge_counter[0] * (float(250) / (_millis() - extruder_autofan_last_check))); 27556: 60 91 b5 05 lds r22, 0x05B5 ; 0x8005b5 2755a: 70 91 b6 05 lds r23, 0x05B6 ; 0x8005b6 2755e: 07 2e mov r0, r23 27560: 00 0c add r0, r0 27562: 88 0b sbc r24, r24 27564: 99 0b sbc r25, r25 27566: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2756a: 6b 01 movw r12, r22 2756c: 7c 01 movw r14, r24 2756e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 27572: 00 91 07 17 lds r16, 0x1707 ; 0x801707 27576: 10 91 08 17 lds r17, 0x1708 ; 0x801708 2757a: 20 91 09 17 lds r18, 0x1709 ; 0x801709 2757e: 30 91 0a 17 lds r19, 0x170A ; 0x80170a 27582: 60 1b sub r22, r16 27584: 71 0b sbc r23, r17 27586: 82 0b sbc r24, r18 27588: 93 0b sbc r25, r19 2758a: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2758e: 9b 01 movw r18, r22 27590: ac 01 movw r20, r24 27592: 60 e0 ldi r22, 0x00 ; 0 27594: 70 e0 ldi r23, 0x00 ; 0 27596: 8a e7 ldi r24, 0x7A ; 122 27598: 93 e4 ldi r25, 0x43 ; 67 2759a: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2759e: a7 01 movw r20, r14 275a0: 96 01 movw r18, r12 275a2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 275a6: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 275aa: 70 93 b8 03 sts 0x03B8, r23 ; 0x8003b8 275ae: 60 93 b7 03 sts 0x03B7, r22 ; 0x8003b7 fan_speed[1] = (fan_edge_counter[1] * (float(250) / (_millis() - extruder_autofan_last_check))); 275b2: 60 91 b7 05 lds r22, 0x05B7 ; 0x8005b7 275b6: 70 91 b8 05 lds r23, 0x05B8 ; 0x8005b8 275ba: 07 2e mov r0, r23 275bc: 00 0c add r0, r0 275be: 88 0b sbc r24, r24 275c0: 99 0b sbc r25, r25 275c2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 275c6: 6b 01 movw r12, r22 275c8: 7c 01 movw r14, r24 275ca: 0f 94 f0 0d call 0x21be0 ; 0x21be0 275ce: 00 91 07 17 lds r16, 0x1707 ; 0x801707 275d2: 10 91 08 17 lds r17, 0x1708 ; 0x801708 275d6: 20 91 09 17 lds r18, 0x1709 ; 0x801709 275da: 30 91 0a 17 lds r19, 0x170A ; 0x80170a 275de: 60 1b sub r22, r16 275e0: 71 0b sbc r23, r17 275e2: 82 0b sbc r24, r18 275e4: 93 0b sbc r25, r19 275e6: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 275ea: 9b 01 movw r18, r22 275ec: ac 01 movw r20, r24 275ee: 60 e0 ldi r22, 0x00 ; 0 275f0: 70 e0 ldi r23, 0x00 ; 0 275f2: 8a e7 ldi r24, 0x7A ; 122 275f4: 93 e4 ldi r25, 0x43 ; 67 275f6: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 275fa: a7 01 movw r20, r14 275fc: 96 01 movw r18, r12 275fe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27602: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 27606: 70 93 ba 03 sts 0x03BA, r23 ; 0x8003ba 2760a: 60 93 b9 03 sts 0x03B9, r22 ; 0x8003b9 /*SERIAL_ECHOPGM("time interval: "); MYSERIAL.println(_millis() - extruder_autofan_last_check); SERIAL_ECHOPGM("hotend fan speed:"); MYSERIAL.print(fan_speed[0]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[0]); SERIAL_ECHOPGM("print fan speed:"); MYSERIAL.print(fan_speed[1]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[1]); SERIAL_ECHOLNPGM(" ");*/ fan_edge_counter[0] = 0; 2760e: 10 92 b6 05 sts 0x05B6, r1 ; 0x8005b6 27612: 10 92 b5 05 sts 0x05B5, r1 ; 0x8005b5 fan_edge_counter[1] = 0; 27616: 10 92 b8 05 sts 0x05B8, r1 ; 0x8005b8 2761a: 10 92 b7 05 sts 0x05B7, r1 ; 0x8005b7 void checkFanSpeed() { uint8_t max_fan_errors[2]; #ifdef FAN_SOFT_PWM max_fan_errors[1] = 3; // 15 seconds (Print fan) 2761e: 83 e0 ldi r24, 0x03 ; 3 27620: 8a 83 std Y+2, r24 ; 0x02 max_fan_errors[0] = 2; // 10 seconds (Hotend fan) 27622: 82 e0 ldi r24, 0x02 ; 2 27624: 89 83 std Y+1, r24 ; 0x01 #else //FAN_SOFT_PWM max_fan_errors[1] = 15; // 15 seconds (Print fan) max_fan_errors[0] = 5; // 5 seconds (Hotend fan) #endif //FAN_SOFT_PWM if(fans_check_enabled) 27626: 80 91 40 02 lds r24, 0x0240 ; 0x800240 2762a: 88 23 and r24, r24 2762c: 51 f0 breq .+20 ; 0x27642 fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0); 2762e: 87 e8 ldi r24, 0x87 ; 135 27630: 9f e0 ldi r25, 0x0F ; 15 27632: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 27636: 91 e0 ldi r25, 0x01 ; 1 27638: 81 11 cpse r24, r1 2763a: 01 c0 rjmp .+2 ; 0x2763e 2763c: 90 e0 ldi r25, 0x00 ; 0 2763e: 90 93 40 02 sts 0x0240, r25 ; 0x800240 static uint8_t fan_speed_errors[2] = { 0,0 }; #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1)) if ((fan_speed[0] < 20) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)){ fan_speed_errors[0]++;} 27642: 80 91 b7 03 lds r24, 0x03B7 ; 0x8003b7 27646: 90 91 b8 03 lds r25, 0x03B8 ; 0x8003b8 2764a: 44 97 sbiw r24, 0x14 ; 20 2764c: 0c f0 brlt .+2 ; 0x27650 2764e: f2 c0 rjmp .+484 ; 0x27834 27650: 20 e0 ldi r18, 0x00 ; 0 27652: 30 e0 ldi r19, 0x00 ; 0 27654: 48 e4 ldi r20, 0x48 ; 72 27656: 52 e4 ldi r21, 0x42 ; 66 27658: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2765c: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 27660: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 27664: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 27668: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2766c: 18 16 cp r1, r24 2766e: 0c f0 brlt .+2 ; 0x27672 27670: e1 c0 rjmp .+450 ; 0x27834 27672: 80 91 80 05 lds r24, 0x0580 ; 0x800580 27676: 8f 5f subi r24, 0xFF ; 255 27678: 80 93 80 05 sts 0x0580, r24 ; 0x800580 if ((fan_speed[1] < 5) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++; else fan_speed_errors[1] = 0; #endif // drop the fan_check_error flag when both fans are ok if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){ 2767c: 80 91 80 05 lds r24, 0x0580 ; 0x800580 27680: 81 11 cpse r24, r1 27682: 0b c0 rjmp .+22 ; 0x2769a 27684: 80 91 81 05 lds r24, 0x0581 ; 0x800581 27688: 81 11 cpse r24, r1 2768a: 07 c0 rjmp .+14 ; 0x2769a 2768c: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 27690: 82 30 cpi r24, 0x02 ; 2 27692: 19 f4 brne .+6 ; 0x2769a // we may even send some info to the LCD from here fan_check_error = EFCE_FIXED; 27694: 81 e0 ldi r24, 0x01 ; 1 27696: 80 93 ce 03 sts 0x03CE, r24 ; 0x8003ce } if ((fan_check_error == EFCE_FIXED) && !printer_active()){ 2769a: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 2769e: 81 30 cpi r24, 0x01 ; 1 276a0: 61 f4 brne .+24 ; 0x276ba 276a2: 0e 94 91 66 call 0xcd22 ; 0xcd22 276a6: 81 11 cpse r24, r1 276a8: 08 c0 rjmp .+16 ; 0x276ba fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately. 276aa: 10 92 ce 03 sts 0x03CE, r1 ; 0x8003ce lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 276ae: 10 92 c0 03 sts 0x03C0, r1 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> lcd_reset_alert_level(); //for another fan speed error lcd_setstatuspgm(MSG_WELCOME); // Reset the status line message to visually show the error is gone 276b2: 86 ee ldi r24, 0xE6 ; 230 276b4: 9b e6 ldi r25, 0x6B ; 107 276b6: 0e 94 94 de call 0x1bd28 ; 0x1bd28 } if (fans_check_enabled && (fan_check_error != EFCE_REPORTED)) 276ba: 80 91 40 02 lds r24, 0x0240 ; 0x800240 276be: 88 23 and r24, r24 276c0: 09 f4 brne .+2 ; 0x276c4 276c2: d9 c0 rjmp .+434 ; 0x27876 276c4: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 276c8: 82 30 cpi r24, 0x02 ; 2 276ca: 09 f4 brne .+2 ; 0x276ce 276cc: d4 c0 rjmp .+424 ; 0x27876 276ce: 80 e8 ldi r24, 0x80 ; 128 276d0: e8 2e mov r14, r24 276d2: 85 e0 ldi r24, 0x05 ; 5 276d4: f8 2e mov r15, r24 276d6: ce 01 movw r24, r28 276d8: 01 96 adiw r24, 0x01 ; 1 276da: 6c 01 movw r12, r24 { for (uint8_t fan = 0; fan < 2; fan++) 276dc: 10 e0 ldi r17, 0x00 ; 0 } } void fanSpeedError(unsigned char _fan) { if (fan_check_error == EFCE_REPORTED) return; fan_check_error = EFCE_REPORTED; 276de: 02 e0 ldi r16, 0x02 ; 2 } if (fans_check_enabled && (fan_check_error != EFCE_REPORTED)) { for (uint8_t fan = 0; fan < 2; fan++) { if (fan_speed_errors[fan] > max_fan_errors[fan]) 276e0: f7 01 movw r30, r14 276e2: 91 91 ld r25, Z+ 276e4: 7f 01 movw r14, r30 276e6: f6 01 movw r30, r12 276e8: 81 91 ld r24, Z+ 276ea: 6f 01 movw r12, r30 276ec: 89 17 cp r24, r25 276ee: 80 f5 brcc .+96 ; 0x27750 { fan_speed_errors[fan] = 0; 276f0: f7 01 movw r30, r14 276f2: 31 97 sbiw r30, 0x01 ; 1 276f4: 10 82 st Z, r1 LCD_ALERTMESSAGERPGM(lcdMsg); } } void fanSpeedError(unsigned char _fan) { if (fan_check_error == EFCE_REPORTED) return; 276f6: 80 91 ce 03 lds r24, 0x03CE ; 0x8003ce 276fa: 82 30 cpi r24, 0x02 ; 2 276fc: 49 f1 breq .+82 ; 0x27750 fan_check_error = EFCE_REPORTED; 276fe: 00 93 ce 03 sts 0x03CE, r16 ; 0x8003ce if (printJobOngoing()) { 27702: 0e 94 40 66 call 0xcc80 ; 0xcc80 27706: 88 23 and r24, r24 27708: 09 f4 brne .+2 ; 0x2770c 2770a: 9a c0 rjmp .+308 ; 0x27840 // A print is ongoing, pause the print normally if(!printingIsPaused()) { 2770c: 0e 94 35 66 call 0xcc6a ; 0xcc6a 27710: 81 11 cpse r24, r1 27712: 07 c0 rjmp .+14 ; 0x27722 if (usb_timer.running()) 27714: 80 91 42 12 lds r24, 0x1242 ; 0x801242 27718: 88 23 and r24, r24 2771a: 09 f4 brne .+2 ; 0x2771e 2771c: 8e c0 rjmp .+284 ; 0x2783a lcd_pause_usb_print(); 2771e: 0f 94 d1 07 call 0x20fa2 ; 0x20fa2 else { // Nothing is going on, but still turn off heaters and report the error setTargetHotend(0); heating_status = HeatingStatus::NO_HEATING; } switch (_fan) { 27722: 11 30 cpi r17, 0x01 ; 1 27724: 09 f4 brne .+2 ; 0x27728 27726: 93 c0 rjmp .+294 ; 0x2784e //! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps. //! Extracted from fanSpeedError to save some space. //! @param serialMsg pointer into PROGMEM, this text will be printed to the serial port //! @param lcdMsg pointer into PROGMEM, this text will be printed onto the LCD static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){ SERIAL_ECHOLNRPGM(serialMsg); 27728: 83 ee ldi r24, 0xE3 ; 227 2772a: 94 e9 ldi r25, 0x94 ; 148 2772c: 0e 94 bd 7c call 0xf97a ; 0xf97a if (get_message_level() == 0) { 27730: 80 91 c0 03 lds r24, 0x03C0 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> 27734: 81 11 cpse r24, r1 27736: 0c c0 rjmp .+24 ; 0x27750 Sound_MakeCustom(200,0,true); 27738: 41 e0 ldi r20, 0x01 ; 1 2773a: 70 e0 ldi r23, 0x00 ; 0 2773c: 60 e0 ldi r22, 0x00 ; 0 2773e: 88 ec ldi r24, 0xC8 ; 200 27740: 90 e0 ldi r25, 0x00 ; 0 27742: 0f 94 be 27 call 0x24f7c ; 0x24f7c LCD_ALERTMESSAGERPGM(lcdMsg); 27746: 62 e0 ldi r22, 0x02 ; 2 27748: 86 e2 ldi r24, 0x26 ; 38 2774a: 98 e6 ldi r25, 0x68 ; 104 2774c: 0e 94 2c da call 0x1b458 ; 0x1b458 lcd_reset_alert_level(); //for another fan speed error lcd_setstatuspgm(MSG_WELCOME); // Reset the status line message to visually show the error is gone } if (fans_check_enabled && (fan_check_error != EFCE_REPORTED)) { for (uint8_t fan = 0; fan < 2; fan++) 27750: 11 30 cpi r17, 0x01 ; 1 27752: 09 f4 brne .+2 ; 0x27756 27754: 90 c0 rjmp .+288 ; 0x27876 27756: 11 e0 ldi r17, 0x01 ; 1 27758: c3 cf rjmp .-122 ; 0x276e0 case TempErrorSource::hotend: if(temp_error_state.assert) { 2775a: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 2775e: 81 ff sbrs r24, 1 27760: 12 c0 rjmp .+36 ; 0x27786 min_temp_error(temp_error_state.index); 27762: 60 91 cc 03 lds r22, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 27766: 62 95 swap r22 27768: 61 70 andi r22, 0x01 ; 1 #endif } static void min_temp_error(uint8_t e) { static const char err[] PROGMEM = "MINTEMP"; if(IsStopped() == false) { 2776a: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 2776e: 81 11 cpse r24, r1 27770: 07 c0 rjmp .+14 ; 0x27780 temp_error_messagepgm(err, e); 27772: 8e e3 ldi r24, 0x3E ; 62 27774: 95 e9 ldi r25, 0x95 ; 149 27776: 0f 94 55 10 call 0x220aa ; 0x220aa prusa_statistics(92); 2777a: 8c e5 ldi r24, 0x5C ; 92 2777c: 0f 94 79 32 call 0x264f2 ; 0x264f2 } ThermalStop(); 27780: 0f 94 4f 67 call 0x2ce9e ; 0x2ce9e 27784: a2 ce rjmp .-700 ; 0x274ca // which is a safer variant than just continuing printing // The automaton also checks for hysteresis - the temperature must have reached a few degrees above the MINTEMP, before // we shall signalize, that MINTEMP has been fixed // Code notice: normally the alert_automaton instance would have been placed here // as static alert_automaton_mintemp alert_automaton_hotend, but alert_automaton_hotend.step(current_temperature[0], minttemp[0] + TEMP_HYSTERESIS); 27786: 60 91 0d 04 lds r22, 0x040D ; 0x80040d <_ZL8minttemp.lto_priv.427> 2778a: 70 91 0e 04 lds r23, 0x040E ; 0x80040e <_ZL8minttemp.lto_priv.427+0x1> 2778e: 6b 5f subi r22, 0xFB ; 251 27790: 7f 4f sbci r23, 0xFF ; 255 27792: 07 2e mov r0, r23 27794: 00 0c add r0, r0 27796: 88 0b sbc r24, r24 27798: 99 0b sbc r25, r25 2779a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2779e: 8b 01 movw r16, r22 277a0: 9c 01 movw r18, r24 277a2: 40 91 5a 0d lds r20, 0x0D5A ; 0x800d5a 277a6: 50 91 5b 0d lds r21, 0x0D5B ; 0x800d5b 277aa: 60 91 5c 0d lds r22, 0x0D5C ; 0x800d5c 277ae: 70 91 5d 0d lds r23, 0x0D5D ; 0x800d5d 277b2: 8a e6 ldi r24, 0x6A ; 106 277b4: 92 e0 ldi r25, 0x02 ; 2 if(temp_error_state.assert) { bed_min_temp_error(); } else { // no recovery, just force the user to restart the printer // which is a safer variant than just continuing printing alert_automaton_bed.step(current_temperature_bed, BED_MINTEMP + TEMP_HYSTERESIS); 277b6: 0f 94 17 08 call 0x2102e ; 0x2102e 277ba: 87 ce rjmp .-754 ; 0x274ca // as static alert_automaton_mintemp alert_automaton_hotend, but alert_automaton_hotend.step(current_temperature[0], minttemp[0] + TEMP_HYSTERESIS); } break; case TempErrorSource::bed: if(temp_error_state.assert) { 277bc: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 277c0: 81 ff sbrs r24, 1 277c2: 0a c0 rjmp .+20 ; 0x277d8 ThermalStop(); } static void bed_min_temp_error(void) { static const char err[] PROGMEM = "MINTEMP BED"; if(IsStopped() == false) { 277c4: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 277c8: 81 11 cpse r24, r1 277ca: da cf rjmp .-76 ; 0x27780 temp_error_messagepgm(err); 277cc: 61 e0 ldi r22, 0x01 ; 1 277ce: 82 e3 ldi r24, 0x32 ; 50 277d0: 95 e9 ldi r25, 0x95 ; 149 ThermalStop(); } static void bed_max_temp_error(void) { if(IsStopped() == false) { temp_error_messagepgm(PSTR("MAXTEMP BED")); 277d2: 0f 94 55 10 call 0x220aa ; 0x220aa 277d6: d4 cf rjmp .-88 ; 0x27780 if(temp_error_state.assert) { bed_min_temp_error(); } else { // no recovery, just force the user to restart the printer // which is a safer variant than just continuing printing alert_automaton_bed.step(current_temperature_bed, BED_MINTEMP + TEMP_HYSTERESIS); 277d8: 40 91 bc 03 lds r20, 0x03BC ; 0x8003bc 277dc: 50 91 bd 03 lds r21, 0x03BD ; 0x8003bd 277e0: 60 91 be 03 lds r22, 0x03BE ; 0x8003be 277e4: 70 91 bf 03 lds r23, 0x03BF ; 0x8003bf 277e8: 00 e0 ldi r16, 0x00 ; 0 277ea: 10 e0 ldi r17, 0x00 ; 0 277ec: 2c e0 ldi r18, 0x0C ; 12 277ee: 32 e4 ldi r19, 0x42 ; 66 277f0: 86 e6 ldi r24, 0x66 ; 102 277f2: 92 e0 ldi r25, 0x02 ; 2 277f4: e0 cf rjmp .-64 ; 0x277b6 break; #endif } break; case TempErrorType::max: switch((TempErrorSource)temp_error_state.source) { 277f6: 80 91 cc 03 lds r24, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 277fa: 86 95 lsr r24 277fc: 86 95 lsr r24 277fe: 83 70 andi r24, 0x03 ; 3 27800: 59 f0 breq .+22 ; 0x27818 27802: 81 30 cpi r24, 0x01 ; 1 27804: 09 f0 breq .+2 ; 0x27808 27806: 61 ce rjmp .-830 ; 0x274ca } ThermalStop(); } static void bed_max_temp_error(void) { if(IsStopped() == false) { 27808: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 2780c: 81 11 cpse r24, r1 2780e: b8 cf rjmp .-144 ; 0x27780 temp_error_messagepgm(PSTR("MAXTEMP BED")); 27810: 61 e0 ldi r22, 0x01 ; 1 27812: 8e e4 ldi r24, 0x4E ; 78 27814: 95 e9 ldi r25, 0x95 ; 149 27816: dd cf rjmp .-70 ; 0x277d2 } break; case TempErrorType::max: switch((TempErrorSource)temp_error_state.source) { case TempErrorSource::hotend: max_temp_error(temp_error_state.index); 27818: 60 91 cc 03 lds r22, 0x03CC ; 0x8003cc <_ZL16temp_error_state.lto_priv.425> 2781c: 62 95 swap r22 2781e: 61 70 andi r22, 0x01 ; 1 SERIAL_ERRORLNPGM(" triggered!"); } static void max_temp_error(uint8_t e) { if(IsStopped() == false) { 27820: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 27824: 81 11 cpse r24, r1 27826: ac cf rjmp .-168 ; 0x27780 temp_error_messagepgm(PSTR("MAXTEMP"), e); 27828: 86 e4 ldi r24, 0x46 ; 70 2782a: 95 e9 ldi r25, 0x95 ; 149 2782c: 0f 94 55 10 call 0x220aa ; 0x220aa prusa_statistics(93); 27830: 8d e5 ldi r24, 0x5D ; 93 27832: a4 cf rjmp .-184 ; 0x2777c if(fans_check_enabled) fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0); static uint8_t fan_speed_errors[2] = { 0,0 }; #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1)) if ((fan_speed[0] < 20) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)){ fan_speed_errors[0]++;} else fan_speed_errors[0] = 0; 27834: 10 92 80 05 sts 0x0580, r1 ; 0x800580 27838: 21 cf rjmp .-446 ; 0x2767c // A print is ongoing, pause the print normally if(!printingIsPaused()) { if (usb_timer.running()) lcd_pause_usb_print(); else lcd_pause_print(); 2783a: 0f 94 fc 0d call 0x21bf8 ; 0x21bf8 2783e: 71 cf rjmp .-286 ; 0x27722 }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 27840: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 27844: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d } } else { // Nothing is going on, but still turn off heaters and report the error setTargetHotend(0); heating_status = HeatingStatus::NO_HEATING; 27848: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb 2784c: 6a cf rjmp .-300 ; 0x27722 //! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps. //! Extracted from fanSpeedError to save some space. //! @param serialMsg pointer into PROGMEM, this text will be printed to the serial port //! @param lcdMsg pointer into PROGMEM, this text will be printed onto the LCD static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){ SERIAL_ECHOLNRPGM(serialMsg); 2784e: 8b e0 ldi r24, 0x0B ; 11 27850: 95 e9 ldi r25, 0x95 ; 149 27852: 0e 94 bd 7c call 0xf97a ; 0xf97a if (get_message_level() == 0) { 27856: 80 91 c0 03 lds r24, 0x03C0 ; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422> 2785a: 81 11 cpse r24, r1 2785c: 0c c0 rjmp .+24 ; 0x27876 Sound_MakeCustom(200,0,true); 2785e: 41 e0 ldi r20, 0x01 ; 1 27860: 70 e0 ldi r23, 0x00 ; 0 27862: 60 e0 ldi r22, 0x00 ; 0 27864: 88 ec ldi r24, 0xC8 ; 200 27866: 90 e0 ldi r25, 0x00 ; 0 27868: 0f 94 be 27 call 0x24f7c ; 0x24f7c LCD_ALERTMESSAGERPGM(lcdMsg); 2786c: 62 e0 ldi r22, 0x02 ; 2 2786e: 83 e4 ldi r24, 0x43 ; 67 27870: 9a e6 ldi r25, 0x6A ; 106 27872: 0e 94 2c da call 0x1b458 ; 0x1b458 } if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) { countFanSpeed(); checkFanSpeed(); //printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm); fanSpeedSoftPwm = fanSpeedBckp; 27876: 80 91 65 02 lds r24, 0x0265 ; 0x800265 2787a: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d //printf_P(PSTR("fan PWM: %d; extr fanSpeed measured: %d; print fan speed measured: %d \n"), fanSpeedBckp, fan_speed[0], fan_speed[1]); extruder_autofan_last_check = _millis(); 2787e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 27882: 60 93 07 17 sts 0x1707, r22 ; 0x801707 27886: 70 93 08 17 sts 0x1708, r23 ; 0x801708 2788a: 80 93 09 17 sts 0x1709, r24 ; 0x801709 2788e: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a fan_measuring = false; 27892: 10 92 b6 03 sts 0x03B6, r1 ; 0x8003b6 checkFans(); #ifdef THERMAL_MODEL_DEBUG thermal_model::log_usr(); #endif } 27896: 0f 90 pop r0 27898: 0f 90 pop r0 2789a: df 91 pop r29 2789c: cf 91 pop r28 2789e: 1f 91 pop r17 278a0: 0f 91 pop r16 278a2: ff 90 pop r15 278a4: ef 90 pop r14 278a6: df 90 pop r13 278a8: cf 90 pop r12 } #endif //FANCHECK checkExtruderAutoFans(); 278aa: 0c 94 fb 77 jmp 0xeff6 ; 0xeff6 278ae: 0f 90 pop r0 278b0: 0f 90 pop r0 278b2: df 91 pop r29 278b4: cf 91 pop r28 278b6: 1f 91 pop r17 278b8: 0f 91 pop r16 278ba: ff 90 pop r15 278bc: ef 90 pop r14 278be: df 90 pop r13 278c0: cf 90 pop r12 278c2: 08 95 ret 000278c4 : } #endif // Return True if a character was found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } static inline bool code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; } 278c4: 20 91 38 12 lds r18, 0x1238 ; 0x801238 278c8: 30 91 39 12 lds r19, 0x1239 ; 0x801239 278cc: bc 01 movw r22, r24 278ce: c9 01 movw r24, r18 278d0: 82 5b subi r24, 0xB2 ; 178 278d2: 9f 4e sbci r25, 0xEF ; 239 278d4: 0f 94 e7 a1 call 0x343ce ; 0x343ce 278d8: 9c 01 movw r18, r24 278da: 90 93 bc 04 sts 0x04BC, r25 ; 0x8004bc 278de: 80 93 bb 04 sts 0x04BB, r24 ; 0x8004bb 278e2: 81 e0 ldi r24, 0x01 ; 1 278e4: 23 2b or r18, r19 278e6: 09 f4 brne .+2 ; 0x278ea 278e8: 80 e0 ldi r24, 0x00 ; 0 278ea: 08 95 ret 000278ec : } } uint16_t planner_calc_sd_length() { uint8_t _block_buffer_head = block_buffer_head; 278ec: 60 91 3e 0d lds r22, 0x0D3E ; 0x800d3e uint8_t _block_buffer_tail = block_buffer_tail; 278f0: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f uint16_t sdlen = 0; 278f4: 30 e0 ldi r19, 0x00 ; 0 278f6: 20 e0 ldi r18, 0x00 ; 0 while (_block_buffer_head != _block_buffer_tail) { sdlen += block_buffer[_block_buffer_tail].sdlen; 278f8: 8e e6 ldi r24, 0x6E ; 110 uint16_t planner_calc_sd_length() { uint8_t _block_buffer_head = block_buffer_head; uint8_t _block_buffer_tail = block_buffer_tail; uint16_t sdlen = 0; while (_block_buffer_head != _block_buffer_tail) 278fa: 96 17 cp r25, r22 278fc: 61 f0 breq .+24 ; 0x27916 { sdlen += block_buffer[_block_buffer_tail].sdlen; 278fe: 89 9f mul r24, r25 27900: f0 01 movw r30, r0 27902: 11 24 eor r1, r1 27904: e6 53 subi r30, 0x36 ; 54 27906: f9 4f sbci r31, 0xF9 ; 249 27908: 40 81 ld r20, Z 2790a: 51 81 ldd r21, Z+1 ; 0x01 2790c: 24 0f add r18, r20 2790e: 35 1f adc r19, r21 _block_buffer_tail = (_block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 27910: 9f 5f subi r25, 0xFF ; 255 27912: 9f 70 andi r25, 0x0F ; 15 27914: f2 cf rjmp .-28 ; 0x278fa } return sdlen; } 27916: c9 01 movw r24, r18 27918: 08 95 ret 0002791a : } #endif /* PLANNER_DIAGNOSTICS */ void planner_add_sd_length(uint16_t sdlen) { if (block_buffer_head != block_buffer_tail) { 2791a: 30 91 3e 0d lds r19, 0x0D3E ; 0x800d3e 2791e: 20 91 3f 0d lds r18, 0x0D3F ; 0x800d3f 27922: 32 17 cp r19, r18 27924: 91 f0 breq .+36 ; 0x2794a // The planner buffer is not empty. Get the index of the last buffer line entered, // which is (block_buffer_head - 1) modulo BLOCK_BUFFER_SIZE. block_buffer[prev_block_index(block_buffer_head)].sdlen += sdlen; 27926: e0 91 3e 0d lds r30, 0x0D3E ; 0x800d3e } // Returns the index of the previous block in the ring buffer static inline uint8_t prev_block_index(uint8_t block_index) { if (block_index == 0) 2792a: e1 11 cpse r30, r1 2792c: 01 c0 rjmp .+2 ; 0x27930 block_index = BLOCK_BUFFER_SIZE; 2792e: e0 e1 ldi r30, 0x10 ; 16 -- block_index; 27930: e1 50 subi r30, 0x01 ; 1 void planner_add_sd_length(uint16_t sdlen) { if (block_buffer_head != block_buffer_tail) { // The planner buffer is not empty. Get the index of the last buffer line entered, // which is (block_buffer_head - 1) modulo BLOCK_BUFFER_SIZE. block_buffer[prev_block_index(block_buffer_head)].sdlen += sdlen; 27932: 2e e6 ldi r18, 0x6E ; 110 27934: e2 9f mul r30, r18 27936: f0 01 movw r30, r0 27938: 11 24 eor r1, r1 2793a: e6 53 subi r30, 0x36 ; 54 2793c: f9 4f sbci r31, 0xF9 ; 249 2793e: 20 81 ld r18, Z 27940: 31 81 ldd r19, Z+1 ; 0x01 27942: 82 0f add r24, r18 27944: 93 1f adc r25, r19 27946: 91 83 std Z+1, r25 ; 0x01 27948: 80 83 st Z, r24 } else { // There is no line stored in the planner buffer, which means the last command does not need to be revertible, // at a power panic, so the length of this command may be forgotten. } } 2794a: 08 95 ret 0002794c : } #endif //PREVENT_DANGEROUS_EXTRUDE // Calculate the steps/s^2 acceleration rates, based on the mm/s^s void reset_acceleration_rates() { 2794c: cf 92 push r12 2794e: df 92 push r13 27950: ef 92 push r14 27952: ff 92 push r15 27954: 0f 93 push r16 27956: 1f 93 push r17 27958: cf 93 push r28 2795a: df 93 push r29 2795c: 0b e6 ldi r16, 0x6B ; 107 2795e: 1d e0 ldi r17, 0x0D ; 13 27960: cb ea ldi r28, 0xAB ; 171 27962: d4 e0 ldi r29, 0x04 ; 4 27964: 8b eb ldi r24, 0xBB ; 187 27966: c8 2e mov r12, r24 27968: 84 e0 ldi r24, 0x04 ; 4 2796a: d8 2e mov r13, r24 2796c: 78 01 movw r14, r16 2796e: 0c 5f subi r16, 0xFC ; 252 27970: 1f 4f sbci r17, 0xFF ; 255 for(int8_t i=0; i < NUM_AXIS; i++) max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * cs.axis_steps_per_mm[i]; 27972: f7 01 movw r30, r14 27974: 60 a1 ldd r22, Z+32 ; 0x20 27976: 71 a1 ldd r23, Z+33 ; 0x21 27978: 82 a1 ldd r24, Z+34 ; 0x22 2797a: 93 a1 ldd r25, Z+35 ; 0x23 2797c: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 27980: f7 01 movw r30, r14 27982: 20 81 ld r18, Z 27984: 31 81 ldd r19, Z+1 ; 0x01 27986: 42 81 ldd r20, Z+2 ; 0x02 27988: 53 81 ldd r21, Z+3 ; 0x03 2798a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2798e: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 27992: 69 93 st Y+, r22 27994: 79 93 st Y+, r23 27996: 89 93 st Y+, r24 27998: 99 93 st Y+, r25 #endif //PREVENT_DANGEROUS_EXTRUDE // Calculate the steps/s^2 acceleration rates, based on the mm/s^s void reset_acceleration_rates() { for(int8_t i=0; i < NUM_AXIS; i++) 2799a: cc 16 cp r12, r28 2799c: dd 06 cpc r13, r29 2799e: 31 f7 brne .-52 ; 0x2796c max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * cs.axis_steps_per_mm[i]; } 279a0: df 91 pop r29 279a2: cf 91 pop r28 279a4: 1f 91 pop r17 279a6: 0f 91 pop r16 279a8: ff 90 pop r15 279aa: ef 90 pop r14 279ac: df 90 pop r13 279ae: cf 90 pop r12 279b0: 08 95 ret 000279b2 : } void plan_set_e_position(const float &e) { #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 279b2: fc 01 movw r30, r24 279b4: 40 81 ld r20, Z 279b6: 51 81 ldd r21, Z+1 ; 0x01 279b8: 62 81 ldd r22, Z+2 ; 0x02 279ba: 73 81 ldd r23, Z+3 ; 0x03 279bc: 40 93 42 04 sts 0x0442, r20 ; 0x800442 279c0: 50 93 43 04 sts 0x0443, r21 ; 0x800443 279c4: 60 93 44 04 sts 0x0444, r22 ; 0x800444 279c8: 70 93 45 04 sts 0x0445, r23 ; 0x800445 #endif position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]); 279cc: 20 91 77 0d lds r18, 0x0D77 ; 0x800d77 279d0: 30 91 78 0d lds r19, 0x0D78 ; 0x800d78 279d4: 40 91 79 0d lds r20, 0x0D79 ; 0x800d79 279d8: 50 91 7a 0d lds r21, 0x0D7A ; 0x800d7a 279dc: 60 81 ld r22, Z 279de: 71 81 ldd r23, Z+1 ; 0x01 279e0: 82 81 ldd r24, Z+2 ; 0x02 279e2: 93 81 ldd r25, Z+3 ; 0x03 279e4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 279e8: 0f 94 45 a8 call 0x3508a ; 0x3508a 279ec: ec e3 ldi r30, 0x3C ; 60 279ee: f6 e0 ldi r31, 0x06 ; 6 279f0: 64 87 std Z+12, r22 ; 0x0c 279f2: 75 87 std Z+13, r23 ; 0x0d 279f4: 86 87 std Z+14, r24 ; 0x0e 279f6: 97 87 std Z+15, r25 ; 0x0f CRITICAL_SECTION_END; } void st_set_e_position(const long &e) { CRITICAL_SECTION_START; 279f8: 8f b7 in r24, 0x3f ; 63 279fa: f8 94 cli count_position[E_AXIS] = e; 279fc: 44 85 ldd r20, Z+12 ; 0x0c 279fe: 55 85 ldd r21, Z+13 ; 0x0d 27a00: 66 85 ldd r22, Z+14 ; 0x0e 27a02: 77 85 ldd r23, Z+15 ; 0x0f 27a04: 40 93 58 06 sts 0x0658, r20 ; 0x800658 27a08: 50 93 59 06 sts 0x0659, r21 ; 0x800659 27a0c: 60 93 5a 06 sts 0x065A, r22 ; 0x80065a 27a10: 70 93 5b 06 sts 0x065B, r23 ; 0x80065b CRITICAL_SECTION_END; 27a14: 8f bf out 0x3f, r24 ; 63 st_set_e_position(position[E_AXIS]); } 27a16: 08 95 ret 00027a18 : // Only useful in the bed leveling routine, when the mesh bed leveling is off. void plan_set_z_position(const float &z) { #ifdef LIN_ADVANCE position_float[Z_AXIS] = z; 27a18: fc 01 movw r30, r24 27a1a: 40 81 ld r20, Z 27a1c: 51 81 ldd r21, Z+1 ; 0x01 27a1e: 62 81 ldd r22, Z+2 ; 0x02 27a20: 73 81 ldd r23, Z+3 ; 0x03 27a22: 40 93 3e 04 sts 0x043E, r20 ; 0x80043e 27a26: 50 93 3f 04 sts 0x043F, r21 ; 0x80043f 27a2a: 60 93 40 04 sts 0x0440, r22 ; 0x800440 27a2e: 70 93 41 04 sts 0x0441, r23 ; 0x800441 #endif position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); 27a32: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 27a36: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 27a3a: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 27a3e: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 27a42: 60 81 ld r22, Z 27a44: 71 81 ldd r23, Z+1 ; 0x01 27a46: 82 81 ldd r24, Z+2 ; 0x02 27a48: 93 81 ldd r25, Z+3 ; 0x03 27a4a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27a4e: 0f 94 45 a8 call 0x3508a ; 0x3508a 27a52: 60 93 44 06 sts 0x0644, r22 ; 0x800644 27a56: 70 93 45 06 sts 0x0645, r23 ; 0x800645 27a5a: 80 93 46 06 sts 0x0646, r24 ; 0x800646 27a5e: 90 93 47 06 sts 0x0647, r25 ; 0x800647 st_set_position(position); 27a62: 0d 94 65 79 jmp 0x2f2ca ; 0x2f2ca 00027a66 : // Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in // mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration // calculation the caller must also provide the physical length of the line in millimeters. void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const float* gcode_start_position, uint16_t segment_idx) { 27a66: 2f 92 push r2 27a68: 3f 92 push r3 27a6a: 4f 92 push r4 27a6c: 5f 92 push r5 27a6e: 6f 92 push r6 27a70: 7f 92 push r7 27a72: 8f 92 push r8 27a74: 9f 92 push r9 27a76: af 92 push r10 27a78: bf 92 push r11 27a7a: cf 92 push r12 27a7c: df 92 push r13 27a7e: ef 92 push r14 27a80: ff 92 push r15 27a82: 0f 93 push r16 27a84: 1f 93 push r17 27a86: cf 93 push r28 27a88: df 93 push r29 27a8a: cd b7 in r28, 0x3d ; 61 27a8c: de b7 in r29, 0x3e ; 62 27a8e: c4 58 subi r28, 0x84 ; 132 27a90: d1 09 sbc r29, r1 27a92: 0f b6 in r0, 0x3f ; 63 27a94: f8 94 cli 27a96: de bf out 0x3e, r29 ; 62 27a98: 0f be out 0x3f, r0 ; 63 27a9a: cd bf out 0x3d, r28 ; 61 27a9c: 69 a3 std Y+33, r22 ; 0x21 27a9e: 7a a3 std Y+34, r23 ; 0x22 27aa0: 8b a3 std Y+35, r24 ; 0x23 27aa2: 9c a3 std Y+36, r25 ; 0x24 27aa4: 2d a3 std Y+37, r18 ; 0x25 27aa6: 3e a3 std Y+38, r19 ; 0x26 27aa8: 4f a3 std Y+39, r20 ; 0x27 27aaa: 58 a7 std Y+40, r21 ; 0x28 27aac: a7 96 adiw r28, 0x27 ; 39 27aae: ec ae std Y+60, r14 ; 0x3c 27ab0: fd ae std Y+61, r15 ; 0x3d 27ab2: 0e af std Y+62, r16 ; 0x3e 27ab4: 1f af std Y+63, r17 ; 0x3f 27ab6: a7 97 sbiw r28, 0x27 ; 39 27ab8: a9 96 adiw r28, 0x29 ; 41 27aba: df ae std Y+63, r13 ; 0x3f 27abc: ce ae std Y+62, r12 ; 0x3e 27abe: a9 97 sbiw r28, 0x29 ; 41 27ac0: 89 ae std Y+57, r8 ; 0x39 27ac2: 99 aa std Y+49, r9 ; 0x31 27ac4: ad ae std Y+61, r10 ; 0x3d 27ac6: bd aa std Y+53, r11 ; 0x35 27ac8: c6 56 subi r28, 0x66 ; 102 27aca: df 4f sbci r29, 0xFF ; 255 27acc: 08 81 ld r16, Y 27ace: 19 81 ldd r17, Y+1 ; 0x01 27ad0: ca 59 subi r28, 0x9A ; 154 27ad2: d0 40 sbci r29, 0x00 ; 0 // CRITICAL_SECTION_START; //prevent stack overflow in ISR // printf_P(PSTR("plan_buffer_line(%f, %f, %f, %f, %f, %u, [%f,%f,%f,%f], %u)\n"), x, y, z, e, feed_rate, extruder, gcode_start_position[0], gcode_start_position[1], gcode_start_position[2], gcode_start_position[3], segment_idx); // CRITICAL_SECTION_END; // Calculate the buffer head after we push this byte uint8_t next_buffer_head = next_block_index(block_buffer_head); 27ad4: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e static bool plan_reset_next_e_sched; // Returns the index of the next block in the ring buffer // NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication. static inline uint8_t next_block_index(uint8_t block_index) { if (++ block_index == BLOCK_BUFFER_SIZE) 27ad8: 8f 5f subi r24, 0xFF ; 255 27ada: a0 96 adiw r28, 0x20 ; 32 27adc: 8f af std Y+63, r24 ; 0x3f 27ade: a0 97 sbiw r28, 0x20 ; 32 27ae0: 80 31 cpi r24, 0x10 ; 16 27ae2: 19 f4 brne .+6 ; 0x27aea block_index = 0; 27ae4: a0 96 adiw r28, 0x20 ; 32 27ae6: 1f ae std Y+63, r1 ; 0x3f 27ae8: a0 97 sbiw r28, 0x20 ; 32 // Calculate the buffer head after we push this byte uint8_t next_buffer_head = next_block_index(block_buffer_head); // If the buffer is full: good! That means we are well ahead of the robot. // Rest here until there is room in the buffer. if (block_buffer_tail == next_buffer_head) { 27aea: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 27aee: a0 96 adiw r28, 0x20 ; 32 27af0: 2f ad ldd r18, Y+63 ; 0x3f 27af2: a0 97 sbiw r28, 0x20 ; 32 27af4: 82 13 cpse r24, r18 27af6: 0f c0 rjmp .+30 ; 0x27b16 do { manage_heater(); 27af8: 0f 94 1c 3a call 0x27438 ; 0x27438 // Vojtech: Don't disable motors inside the planner! manage_inactivity(false); 27afc: 80 e0 ldi r24, 0x00 ; 0 27afe: 0e 94 34 8c call 0x11868 ; 0x11868 lcd_update(0); 27b02: 80 e0 ldi r24, 0x00 ; 0 27b04: 0e 94 f9 6e call 0xddf2 ; 0xddf2 } while (block_buffer_tail == next_buffer_head); 27b08: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 27b0c: a0 96 adiw r28, 0x20 ; 32 27b0e: 3f ad ldd r19, Y+63 ; 0x3f 27b10: a0 97 sbiw r28, 0x20 ; 32 27b12: 83 17 cp r24, r19 27b14: 89 f3 breq .-30 ; 0x27af8 } #ifdef PLANNER_DIAGNOSTICS planner_update_queue_min_counter(); #endif /* PLANNER_DIAGNOSTICS */ if(planner_aborted) { 27b16: 40 91 42 0d lds r20, 0x0D42 ; 0x800d42 27b1a: a1 96 adiw r28, 0x21 ; 33 27b1c: 4f af std Y+63, r20 ; 0x3f 27b1e: a1 97 sbiw r28, 0x21 ; 33 27b20: 44 23 and r20, r20 27b22: 11 f1 breq .+68 ; 0x27b68 // avoid planning the block early if aborted SERIAL_ECHO_START; 27b24: 8e ec ldi r24, 0xCE ; 206 27b26: 91 ea ldi r25, 0xA1 ; 161 27b28: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n("Move aborted")); 27b2c: 86 e3 ldi r24, 0x36 ; 54 27b2e: 9a e6 ldi r25, 0x6A ; 106 27b30: 0e 94 bd 7c call 0xf97a ; 0xf97a // The stepper timer interrupt will run continuously from now on. // If there are no planner blocks to be executed by the stepper routine, // the stepper interrupt ticks at 1kHz to wake up and pick a block // from the planner queue if available. ENABLE_STEPPER_DRIVER_INTERRUPT(); } 27b34: cc 57 subi r28, 0x7C ; 124 27b36: df 4f sbci r29, 0xFF ; 255 27b38: 0f b6 in r0, 0x3f ; 63 27b3a: f8 94 cli 27b3c: de bf out 0x3e, r29 ; 62 27b3e: 0f be out 0x3f, r0 ; 63 27b40: cd bf out 0x3d, r28 ; 61 27b42: df 91 pop r29 27b44: cf 91 pop r28 27b46: 1f 91 pop r17 27b48: 0f 91 pop r16 27b4a: ff 90 pop r15 27b4c: ef 90 pop r14 27b4e: df 90 pop r13 27b50: cf 90 pop r12 27b52: bf 90 pop r11 27b54: af 90 pop r10 27b56: 9f 90 pop r9 27b58: 8f 90 pop r8 27b5a: 7f 90 pop r7 27b5c: 6f 90 pop r6 27b5e: 5f 90 pop r5 27b60: 4f 90 pop r4 27b62: 3f 90 pop r3 27b64: 2f 90 pop r2 27b66: 08 95 ret SERIAL_ECHOLNRPGM(_n("Move aborted")); return; } // Prepare to set up new block block_t *block = &block_buffer[block_buffer_head]; 27b68: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 27b6c: 29 2e mov r2, r25 27b6e: 31 2c mov r3, r1 27b70: 8e e6 ldi r24, 0x6E ; 110 27b72: 98 9f mul r25, r24 27b74: d0 01 movw r26, r0 27b76: 11 24 eor r1, r1 27b78: a3 96 adiw r28, 0x23 ; 35 27b7a: bf af std Y+63, r27 ; 0x3f 27b7c: ae af std Y+62, r26 ; 0x3e 27b7e: a3 97 sbiw r28, 0x23 ; 35 // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) block->busy = false; 27b80: cd 01 movw r24, r26 27b82: 82 5a subi r24, 0xA2 ; 162 27b84: 99 4f sbci r25, 0xF9 ; 249 27b86: fc 01 movw r30, r24 27b88: e9 5b subi r30, 0xB9 ; 185 27b8a: ff 4f sbci r31, 0xFF ; 255 27b8c: 10 82 st Z, r1 // Set sdlen for calculating sd position block->sdlen = 0; 27b8e: 84 59 subi r24, 0x94 ; 148 27b90: 9f 4f sbci r25, 0xFF ; 255 27b92: fc 01 movw r30, r24 27b94: 11 82 std Z+1, r1 ; 0x01 27b96: 10 82 st Z, r1 // Save original start position of the move if (gcode_start_position) 27b98: 01 15 cp r16, r1 27b9a: 11 05 cpc r17, r1 27b9c: 11 f4 brne .+4 ; 0x27ba2 27b9e: 0d 94 20 48 jmp 0x29040 ; 0x29040 memcpy(block->gcode_start_position, gcode_start_position, sizeof(block_t::gcode_start_position)); 27ba2: 80 e1 ldi r24, 0x10 ; 16 27ba4: f8 01 movw r30, r16 27ba6: aa 54 subi r26, 0x4A ; 74 27ba8: b9 4f sbci r27, 0xF9 ; 249 else memcpy(block->gcode_start_position, current_position, sizeof(block_t::gcode_start_position)); 27baa: 01 90 ld r0, Z+ 27bac: 0d 92 st X+, r0 27bae: 8a 95 dec r24 27bb0: e1 f7 brne .-8 ; 0x27baa // Save the index of this segment (when a single G0/1/2/3 command plans multiple segments) block->segment_idx = segment_idx; 27bb2: 8e e6 ldi r24, 0x6E ; 110 27bb4: 82 9d mul r24, r2 27bb6: 80 01 movw r16, r0 27bb8: 83 9d mul r24, r3 27bba: 10 0d add r17, r0 27bbc: 11 24 eor r1, r1 27bbe: 02 5a subi r16, 0xA2 ; 162 27bc0: 19 4f sbci r17, 0xF9 ; 249 27bc2: f8 01 movw r30, r16 27bc4: e8 59 subi r30, 0x98 ; 152 27bc6: ff 4f sbci r31, 0xFF ; 255 27bc8: c4 56 subi r28, 0x64 ; 100 27bca: df 4f sbci r29, 0xFF ; 255 27bcc: 88 81 ld r24, Y 27bce: 99 81 ldd r25, Y+1 ; 0x01 27bd0: cc 59 subi r28, 0x9C ; 156 27bd2: d0 40 sbci r29, 0x00 ; 0 27bd4: 91 83 std Z+1, r25 ; 0x01 27bd6: 80 83 st Z, r24 // Save the global feedrate at scheduling time block->gcode_feedrate = feedrate; 27bd8: 06 59 subi r16, 0x96 ; 150 27bda: 1f 4f sbci r17, 0xFF ; 255 27bdc: 60 91 7a 02 lds r22, 0x027A ; 0x80027a 27be0: 70 91 7b 02 lds r23, 0x027B ; 0x80027b 27be4: 80 91 7c 02 lds r24, 0x027C ; 0x80027c 27be8: 90 91 7d 02 lds r25, 0x027D ; 0x80027d 27bec: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 27bf0: d8 01 movw r26, r16 27bf2: 6d 93 st X+, r22 27bf4: 7c 93 st X, r23 // Reset the starting E position when requested if (plan_reset_next_e_queue) 27bf6: 80 91 21 04 lds r24, 0x0421 ; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443> 27bfa: 88 23 and r24, r24 27bfc: a9 f0 breq .+42 ; 0x27c28 { position[E_AXIS] = 0; 27bfe: 10 92 48 06 sts 0x0648, r1 ; 0x800648 27c02: 10 92 49 06 sts 0x0649, r1 ; 0x800649 27c06: 10 92 4a 06 sts 0x064A, r1 ; 0x80064a 27c0a: 10 92 4b 06 sts 0x064B, r1 ; 0x80064b #ifdef LIN_ADVANCE position_float[E_AXIS] = 0; 27c0e: 10 92 42 04 sts 0x0442, r1 ; 0x800442 27c12: 10 92 43 04 sts 0x0443, r1 ; 0x800443 27c16: 10 92 44 04 sts 0x0444, r1 ; 0x800444 27c1a: 10 92 45 04 sts 0x0445, r1 ; 0x800445 #endif // the block might still be discarded later, but we need to ensure the lower-level // count_position is also reset correctly for consistent results! plan_reset_next_e_queue = false; 27c1e: 10 92 21 04 sts 0x0421, r1 ; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443> plan_reset_next_e_sched = true; 27c22: 81 e0 ldi r24, 0x01 ; 1 27c24: 80 93 20 04 sts 0x0420, r24 ; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444> } // Apply the machine correction matrix. world2machine(x, y); 27c28: be 01 movw r22, r28 27c2a: 6b 5d subi r22, 0xDB ; 219 27c2c: 7f 4f sbci r23, 0xFF ; 255 27c2e: ce 01 movw r24, r28 27c30: 81 96 adiw r24, 0x21 ; 33 27c32: 0e 94 76 68 call 0xd0ec ; 0xd0ec // The target position of the tool in absolute steps // Calculate target position in absolute steps //this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow long target[4]; target[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]); 27c36: c9 a0 ldd r12, Y+33 ; 0x21 27c38: da a0 ldd r13, Y+34 ; 0x22 27c3a: eb a0 ldd r14, Y+35 ; 0x23 27c3c: fc a0 ldd r15, Y+36 ; 0x24 27c3e: 20 91 6b 0d lds r18, 0x0D6B ; 0x800d6b 27c42: 30 91 6c 0d lds r19, 0x0D6C ; 0x800d6c 27c46: 40 91 6d 0d lds r20, 0x0D6D ; 0x800d6d 27c4a: 50 91 6e 0d lds r21, 0x0D6E ; 0x800d6e 27c4e: c7 01 movw r24, r14 27c50: b6 01 movw r22, r12 27c52: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27c56: 0f 94 45 a8 call 0x3508a ; 0x3508a 27c5a: c3 58 subi r28, 0x83 ; 131 27c5c: df 4f sbci r29, 0xFF ; 255 27c5e: 68 83 st Y, r22 27c60: 79 83 std Y+1, r23 ; 0x01 27c62: 8a 83 std Y+2, r24 ; 0x02 27c64: 9b 83 std Y+3, r25 ; 0x03 27c66: cd 57 subi r28, 0x7D ; 125 27c68: d0 40 sbci r29, 0x00 ; 0 target[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); 27c6a: 8d a0 ldd r8, Y+37 ; 0x25 27c6c: 9e a0 ldd r9, Y+38 ; 0x26 27c6e: af a0 ldd r10, Y+39 ; 0x27 27c70: b8 a4 ldd r11, Y+40 ; 0x28 27c72: 20 91 6f 0d lds r18, 0x0D6F ; 0x800d6f 27c76: 30 91 70 0d lds r19, 0x0D70 ; 0x800d70 27c7a: 40 91 71 0d lds r20, 0x0D71 ; 0x800d71 27c7e: 50 91 72 0d lds r21, 0x0D72 ; 0x800d72 27c82: c5 01 movw r24, r10 27c84: b4 01 movw r22, r8 27c86: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27c8a: 0f 94 45 a8 call 0x3508a ; 0x3508a 27c8e: cf 57 subi r28, 0x7F ; 127 27c90: df 4f sbci r29, 0xFF ; 255 27c92: 68 83 st Y, r22 27c94: 79 83 std Y+1, r23 ; 0x01 27c96: 8a 83 std Y+2, r24 ; 0x02 27c98: 9b 83 std Y+3, r25 ; 0x03 27c9a: c1 58 subi r28, 0x81 ; 129 27c9c: d0 40 sbci r29, 0x00 ; 0 #ifdef MESH_BED_LEVELING if (mbl.active){ 27c9e: 80 91 09 13 lds r24, 0x1309 ; 0x801309 27ca2: 88 23 and r24, r24 27ca4: 11 f4 brne .+4 ; 0x27caa 27ca6: 0d 94 27 48 jmp 0x2904e ; 0x2904e target[Z_AXIS] = lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]); 27caa: a5 01 movw r20, r10 27cac: 94 01 movw r18, r8 27cae: c7 01 movw r24, r14 27cb0: b6 01 movw r22, r12 27cb2: 0f 94 78 91 call 0x322f0 ; 0x322f0 27cb6: a7 96 adiw r28, 0x27 ; 39 27cb8: 2c ad ldd r18, Y+60 ; 0x3c 27cba: 3d ad ldd r19, Y+61 ; 0x3d 27cbc: 4e ad ldd r20, Y+62 ; 0x3e 27cbe: 5f ad ldd r21, Y+63 ; 0x3f 27cc0: a7 97 sbiw r28, 0x27 ; 39 27cc2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 27cc6: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 27cca: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 27cce: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 27cd2: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 }else{ target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); 27cd6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27cda: 0f 94 45 a8 call 0x3508a ; 0x3508a 27cde: e5 96 adiw r28, 0x35 ; 53 27ce0: 6c af std Y+60, r22 ; 0x3c 27ce2: 7d af std Y+61, r23 ; 0x3d 27ce4: 8e af std Y+62, r24 ; 0x3e 27ce6: 9f af std Y+63, r25 ; 0x3f 27ce8: e5 97 sbiw r28, 0x35 ; 53 } #else target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); #endif // ENABLE_MESH_BED_LEVELING target[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]); 27cea: a9 96 adiw r28, 0x29 ; 41 27cec: ee ad ldd r30, Y+62 ; 0x3e 27cee: ff ad ldd r31, Y+63 ; 0x3f 27cf0: a9 97 sbiw r28, 0x29 ; 41 27cf2: 80 80 ld r8, Z 27cf4: 91 80 ldd r9, Z+1 ; 0x01 27cf6: a2 80 ldd r10, Z+2 ; 0x02 27cf8: b3 80 ldd r11, Z+3 ; 0x03 27cfa: 20 91 77 0d lds r18, 0x0D77 ; 0x800d77 27cfe: 30 91 78 0d lds r19, 0x0D78 ; 0x800d78 27d02: 40 91 79 0d lds r20, 0x0D79 ; 0x800d79 27d06: 50 91 7a 0d lds r21, 0x0D7A ; 0x800d7a 27d0a: c5 01 movw r24, r10 27d0c: b4 01 movw r22, r8 27d0e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27d12: 0f 94 45 a8 call 0x3508a ; 0x3508a 27d16: ad 96 adiw r28, 0x2d ; 45 27d18: 6c af std Y+60, r22 ; 0x3c 27d1a: 7d af std Y+61, r23 ; 0x3d 27d1c: 8e af std Y+62, r24 ; 0x3e 27d1e: 9f af std Y+63, r25 ; 0x3f 27d20: ad 97 sbiw r28, 0x2d ; 45 // Calculate subtraction to re-use result in many places // This saves memory and speeds up calculations int32_t de = target[E_AXIS] - position[E_AXIS]; 27d22: 80 91 48 06 lds r24, 0x0648 ; 0x800648 27d26: 90 91 49 06 lds r25, 0x0649 ; 0x800649 27d2a: a0 91 4a 06 lds r26, 0x064A ; 0x80064a 27d2e: b0 91 4b 06 lds r27, 0x064B ; 0x80064b 27d32: ad 96 adiw r28, 0x2d ; 45 27d34: 4c ac ldd r4, Y+60 ; 0x3c 27d36: 5d ac ldd r5, Y+61 ; 0x3d 27d38: 6e ac ldd r6, Y+62 ; 0x3e 27d3a: 7f ac ldd r7, Y+63 ; 0x3f 27d3c: ad 97 sbiw r28, 0x2d ; 45 27d3e: 48 1a sub r4, r24 27d40: 59 0a sbc r5, r25 27d42: 6a 0a sbc r6, r26 27d44: 7b 0a sbc r7, r27 int32_t dx = target[X_AXIS] - position[X_AXIS]; 27d46: 80 91 3c 06 lds r24, 0x063C ; 0x80063c 27d4a: 90 91 3d 06 lds r25, 0x063D ; 0x80063d 27d4e: a0 91 3e 06 lds r26, 0x063E ; 0x80063e 27d52: b0 91 3f 06 lds r27, 0x063F ; 0x80063f 27d56: c3 58 subi r28, 0x83 ; 131 27d58: df 4f sbci r29, 0xFF ; 255 27d5a: c8 80 ld r12, Y 27d5c: d9 80 ldd r13, Y+1 ; 0x01 27d5e: ea 80 ldd r14, Y+2 ; 0x02 27d60: fb 80 ldd r15, Y+3 ; 0x03 27d62: cd 57 subi r28, 0x7D ; 125 27d64: d0 40 sbci r29, 0x00 ; 0 27d66: c8 1a sub r12, r24 27d68: d9 0a sbc r13, r25 27d6a: ea 0a sbc r14, r26 27d6c: fb 0a sbc r15, r27 int32_t dy = target[Y_AXIS] - position[Y_AXIS]; 27d6e: 80 91 40 06 lds r24, 0x0640 ; 0x800640 27d72: 90 91 41 06 lds r25, 0x0641 ; 0x800641 27d76: a0 91 42 06 lds r26, 0x0642 ; 0x800642 27d7a: b0 91 43 06 lds r27, 0x0643 ; 0x800643 27d7e: cf 57 subi r28, 0x7F ; 127 27d80: df 4f sbci r29, 0xFF ; 255 27d82: 28 81 ld r18, Y 27d84: 39 81 ldd r19, Y+1 ; 0x01 27d86: 4a 81 ldd r20, Y+2 ; 0x02 27d88: 5b 81 ldd r21, Y+3 ; 0x03 27d8a: c1 58 subi r28, 0x81 ; 129 27d8c: d0 40 sbci r29, 0x00 ; 0 27d8e: 28 1b sub r18, r24 27d90: 39 0b sbc r19, r25 27d92: 4a 0b sbc r20, r26 27d94: 5b 0b sbc r21, r27 27d96: 29 a7 std Y+41, r18 ; 0x29 27d98: 3a a7 std Y+42, r19 ; 0x2a 27d9a: 4b a7 std Y+43, r20 ; 0x2b 27d9c: 5c a7 std Y+44, r21 ; 0x2c int32_t dz = target[Z_AXIS] - position[Z_AXIS]; 27d9e: 80 91 44 06 lds r24, 0x0644 ; 0x800644 27da2: 90 91 45 06 lds r25, 0x0645 ; 0x800645 27da6: a0 91 46 06 lds r26, 0x0646 ; 0x800646 27daa: b0 91 47 06 lds r27, 0x0647 ; 0x800647 27dae: e5 96 adiw r28, 0x35 ; 53 27db0: 2c ad ldd r18, Y+60 ; 0x3c 27db2: 3d ad ldd r19, Y+61 ; 0x3d 27db4: 4e ad ldd r20, Y+62 ; 0x3e 27db6: 5f ad ldd r21, Y+63 ; 0x3f 27db8: e5 97 sbiw r28, 0x35 ; 53 27dba: 28 1b sub r18, r24 27dbc: 39 0b sbc r19, r25 27dbe: 4a 0b sbc r20, r26 27dc0: 5b 0b sbc r21, r27 27dc2: 2d a7 std Y+45, r18 ; 0x2d 27dc4: 3e a7 std Y+46, r19 ; 0x2e 27dc6: 4f a7 std Y+47, r20 ; 0x2f 27dc8: 58 ab std Y+48, r21 ; 0x30 #ifdef PREVENT_DANGEROUS_EXTRUDE if(de) 27dca: 41 14 cp r4, r1 27dcc: 51 04 cpc r5, r1 27dce: 61 04 cpc r6, r1 27dd0: 71 04 cpc r7, r1 27dd2: 09 f4 brne .+2 ; 0x27dd6 27dd4: 80 c0 rjmp .+256 ; 0x27ed6 { if((int)degHotend(active_extruder) 27dda: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 27dde: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 27de2: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 27de6: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 27dea: 20 91 57 02 lds r18, 0x0257 ; 0x800257 27dee: 30 91 58 02 lds r19, 0x0258 ; 0x800258 27df2: 62 17 cp r22, r18 27df4: 73 07 cpc r23, r19 27df6: 0c f5 brge .+66 ; 0x27e3a { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part 27df8: ad 96 adiw r28, 0x2d ; 45 27dfa: 8c ad ldd r24, Y+60 ; 0x3c 27dfc: 9d ad ldd r25, Y+61 ; 0x3d 27dfe: ae ad ldd r26, Y+62 ; 0x3e 27e00: bf ad ldd r27, Y+63 ; 0x3f 27e02: ad 97 sbiw r28, 0x2d ; 45 27e04: 80 93 48 06 sts 0x0648, r24 ; 0x800648 27e08: 90 93 49 06 sts 0x0649, r25 ; 0x800649 27e0c: a0 93 4a 06 sts 0x064A, r26 ; 0x80064a 27e10: b0 93 4b 06 sts 0x064B, r27 ; 0x80064b #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 27e14: 80 92 42 04 sts 0x0442, r8 ; 0x800442 27e18: 90 92 43 04 sts 0x0443, r9 ; 0x800443 27e1c: a0 92 44 04 sts 0x0444, r10 ; 0x800444 27e20: b0 92 45 04 sts 0x0445, r11 ; 0x800445 #endif de = 0; // no difference SERIAL_ECHO_START; 27e24: 8e ec ldi r24, 0xCE ; 206 27e26: 91 ea ldi r25, 0xA1 ; 161 27e28: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP 27e2c: 8c e1 ldi r24, 0x1C ; 28 27e2e: 9a e6 ldi r25, 0x6A ; 106 27e30: 0e 94 bd 7c call 0xf97a ; 0xf97a { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part #ifdef LIN_ADVANCE position_float[E_AXIS] = e; #endif de = 0; // no difference 27e34: 41 2c mov r4, r1 27e36: 51 2c mov r5, r1 27e38: 32 01 movw r6, r4 SERIAL_ECHO_START; SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP } #ifdef PREVENT_LENGTHY_EXTRUDE if(labs(de) > cs.axis_steps_per_mm[E_AXIS]*EXTRUDE_MAXLENGTH) 27e3a: c3 01 movw r24, r6 27e3c: b2 01 movw r22, r4 27e3e: 77 fe sbrs r7, 7 27e40: 07 c0 rjmp .+14 ; 0x27e50 27e42: 66 27 eor r22, r22 27e44: 77 27 eor r23, r23 27e46: cb 01 movw r24, r22 27e48: 64 19 sub r22, r4 27e4a: 75 09 sbc r23, r5 27e4c: 86 09 sbc r24, r6 27e4e: 97 09 sbc r25, r7 27e50: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 27e54: 4b 01 movw r8, r22 27e56: 5c 01 movw r10, r24 27e58: 20 e0 ldi r18, 0x00 ; 0 27e5a: 30 e0 ldi r19, 0x00 ; 0 27e5c: 48 ee ldi r20, 0xE8 ; 232 27e5e: 53 e4 ldi r21, 0x43 ; 67 27e60: 60 91 77 0d lds r22, 0x0D77 ; 0x800d77 27e64: 70 91 78 0d lds r23, 0x0D78 ; 0x800d78 27e68: 80 91 79 0d lds r24, 0x0D79 ; 0x800d79 27e6c: 90 91 7a 0d lds r25, 0x0D7A ; 0x800d7a 27e70: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 27e74: 9b 01 movw r18, r22 27e76: ac 01 movw r20, r24 27e78: c5 01 movw r24, r10 27e7a: b4 01 movw r22, r8 27e7c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 27e80: 18 16 cp r1, r24 27e82: 4c f5 brge .+82 ; 0x27ed6 { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part 27e84: ad 96 adiw r28, 0x2d ; 45 27e86: 2c ad ldd r18, Y+60 ; 0x3c 27e88: 3d ad ldd r19, Y+61 ; 0x3d 27e8a: 4e ad ldd r20, Y+62 ; 0x3e 27e8c: 5f ad ldd r21, Y+63 ; 0x3f 27e8e: ad 97 sbiw r28, 0x2d ; 45 27e90: 20 93 48 06 sts 0x0648, r18 ; 0x800648 27e94: 30 93 49 06 sts 0x0649, r19 ; 0x800649 27e98: 40 93 4a 06 sts 0x064A, r20 ; 0x80064a 27e9c: 50 93 4b 06 sts 0x064B, r21 ; 0x80064b #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 27ea0: a9 96 adiw r28, 0x29 ; 41 27ea2: ee ad ldd r30, Y+62 ; 0x3e 27ea4: ff ad ldd r31, Y+63 ; 0x3f 27ea6: a9 97 sbiw r28, 0x29 ; 41 27ea8: 80 81 ld r24, Z 27eaa: 91 81 ldd r25, Z+1 ; 0x01 27eac: a2 81 ldd r26, Z+2 ; 0x02 27eae: b3 81 ldd r27, Z+3 ; 0x03 27eb0: 80 93 42 04 sts 0x0442, r24 ; 0x800442 27eb4: 90 93 43 04 sts 0x0443, r25 ; 0x800443 27eb8: a0 93 44 04 sts 0x0444, r26 ; 0x800444 27ebc: b0 93 45 04 sts 0x0445, r27 ; 0x800445 #endif de = 0; // no difference SERIAL_ECHO_START; 27ec0: 8e ec ldi r24, 0xCE ; 206 27ec2: 91 ea ldi r25, 0xA1 ; 161 27ec4: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP 27ec8: 8e ef ldi r24, 0xFE ; 254 27eca: 99 e6 ldi r25, 0x69 ; 105 27ecc: 0e 94 bd 7c call 0xf97a ; 0xf97a { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part #ifdef LIN_ADVANCE position_float[E_AXIS] = e; #endif de = 0; // no difference 27ed0: 41 2c mov r4, r1 27ed2: 51 2c mov r5, r1 27ed4: 32 01 movw r6, r4 #endif //PREVENT_DANGEROUS_EXTRUDE // Number of steps for each axis #ifndef COREXY // default non-h-bot planning block->steps[X_AXIS].wide = labs(dx); 27ed6: 8e e6 ldi r24, 0x6E ; 110 27ed8: 82 9d mul r24, r2 27eda: f0 01 movw r30, r0 27edc: 83 9d mul r24, r3 27ede: f0 0d add r31, r0 27ee0: 11 24 eor r1, r1 27ee2: e2 5a subi r30, 0xA2 ; 162 27ee4: f9 4f sbci r31, 0xF9 ; 249 27ee6: d7 01 movw r26, r14 27ee8: c6 01 movw r24, r12 27eea: f7 fe sbrs r15, 7 27eec: 07 c0 rjmp .+14 ; 0x27efc 27eee: 88 27 eor r24, r24 27ef0: 99 27 eor r25, r25 27ef2: dc 01 movw r26, r24 27ef4: 8c 19 sub r24, r12 27ef6: 9d 09 sbc r25, r13 27ef8: ae 09 sbc r26, r14 27efa: bf 09 sbc r27, r15 27efc: 80 83 st Z, r24 27efe: 91 83 std Z+1, r25 ; 0x01 27f00: a2 83 std Z+2, r26 ; 0x02 27f02: b3 83 std Z+3, r27 ; 0x03 block->steps[Y_AXIS].wide = labs(dy); 27f04: 8e e6 ldi r24, 0x6E ; 110 27f06: 82 9d mul r24, r2 27f08: f0 01 movw r30, r0 27f0a: 83 9d mul r24, r3 27f0c: f0 0d add r31, r0 27f0e: 11 24 eor r1, r1 27f10: e2 5a subi r30, 0xA2 ; 162 27f12: f9 4f sbci r31, 0xF9 ; 249 27f14: 89 a5 ldd r24, Y+41 ; 0x29 27f16: 9a a5 ldd r25, Y+42 ; 0x2a 27f18: ab a5 ldd r26, Y+43 ; 0x2b 27f1a: bc a5 ldd r27, Y+44 ; 0x2c 27f1c: b7 ff sbrs r27, 7 27f1e: 07 c0 rjmp .+14 ; 0x27f2e 27f20: b0 95 com r27 27f22: a0 95 com r26 27f24: 90 95 com r25 27f26: 81 95 neg r24 27f28: 9f 4f sbci r25, 0xFF ; 255 27f2a: af 4f sbci r26, 0xFF ; 255 27f2c: bf 4f sbci r27, 0xFF ; 255 27f2e: 84 83 std Z+4, r24 ; 0x04 27f30: 95 83 std Z+5, r25 ; 0x05 27f32: a6 83 std Z+6, r26 ; 0x06 27f34: b7 83 std Z+7, r27 ; 0x07 // corexy planning // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html block->steps[X_AXIS].wide = labs(dx + dy); block->steps[Y_AXIS].wide = labs(dx - dy); #endif block->steps[Z_AXIS].wide = labs(dz); 27f36: 8e e6 ldi r24, 0x6E ; 110 27f38: 82 9d mul r24, r2 27f3a: f0 01 movw r30, r0 27f3c: 83 9d mul r24, r3 27f3e: f0 0d add r31, r0 27f40: 11 24 eor r1, r1 27f42: e2 5a subi r30, 0xA2 ; 162 27f44: f9 4f sbci r31, 0xF9 ; 249 27f46: 8d a5 ldd r24, Y+45 ; 0x2d 27f48: 9e a5 ldd r25, Y+46 ; 0x2e 27f4a: af a5 ldd r26, Y+47 ; 0x2f 27f4c: b8 a9 ldd r27, Y+48 ; 0x30 27f4e: b7 ff sbrs r27, 7 27f50: 07 c0 rjmp .+14 ; 0x27f60 27f52: b0 95 com r27 27f54: a0 95 com r26 27f56: 90 95 com r25 27f58: 81 95 neg r24 27f5a: 9f 4f sbci r25, 0xFF ; 255 27f5c: af 4f sbci r26, 0xFF ; 255 27f5e: bf 4f sbci r27, 0xFF ; 255 27f60: 80 87 std Z+8, r24 ; 0x08 27f62: 91 87 std Z+9, r25 ; 0x09 27f64: a2 87 std Z+10, r26 ; 0x0a 27f66: b3 87 std Z+11, r27 ; 0x0b block->steps[E_AXIS].wide = labs(de); 27f68: b3 01 movw r22, r6 27f6a: a2 01 movw r20, r4 27f6c: 77 fe sbrs r7, 7 27f6e: 07 c0 rjmp .+14 ; 0x27f7e 27f70: 44 27 eor r20, r20 27f72: 55 27 eor r21, r21 27f74: ba 01 movw r22, r20 27f76: 44 19 sub r20, r4 27f78: 55 09 sbc r21, r5 27f7a: 66 09 sbc r22, r6 27f7c: 77 09 sbc r23, r7 27f7e: 8e e6 ldi r24, 0x6E ; 110 27f80: 82 9d mul r24, r2 27f82: f0 01 movw r30, r0 27f84: 83 9d mul r24, r3 27f86: f0 0d add r31, r0 27f88: 11 24 eor r1, r1 27f8a: e2 5a subi r30, 0xA2 ; 162 27f8c: f9 4f sbci r31, 0xF9 ; 249 27f8e: 44 87 std Z+12, r20 ; 0x0c 27f90: 55 87 std Z+13, r21 ; 0x0d 27f92: 66 87 std Z+14, r22 ; 0x0e 27f94: 77 87 std Z+15, r23 ; 0x0f block->step_event_count.wide = max(block->steps[X_AXIS].wide, max(block->steps[Y_AXIS].wide, max(block->steps[Z_AXIS].wide, block->steps[E_AXIS].wide))); 27f96: 00 81 ld r16, Z 27f98: 11 81 ldd r17, Z+1 ; 0x01 27f9a: 22 81 ldd r18, Z+2 ; 0x02 27f9c: 33 81 ldd r19, Z+3 ; 0x03 27f9e: 84 81 ldd r24, Z+4 ; 0x04 27fa0: 95 81 ldd r25, Z+5 ; 0x05 27fa2: a6 81 ldd r26, Z+6 ; 0x06 27fa4: b7 81 ldd r27, Z+7 ; 0x07 27fa6: 80 17 cp r24, r16 27fa8: 91 07 cpc r25, r17 27faa: a2 07 cpc r26, r18 27fac: b3 07 cpc r27, r19 27fae: 14 f4 brge .+4 ; 0x27fb4 27fb0: d9 01 movw r26, r18 27fb2: c8 01 movw r24, r16 27fb4: ee e6 ldi r30, 0x6E ; 110 27fb6: be 2e mov r11, r30 27fb8: b2 9c mul r11, r2 27fba: f0 01 movw r30, r0 27fbc: b3 9c mul r11, r3 27fbe: f0 0d add r31, r0 27fc0: 11 24 eor r1, r1 27fc2: e2 5a subi r30, 0xA2 ; 162 27fc4: f9 4f sbci r31, 0xF9 ; 249 27fc6: 80 84 ldd r8, Z+8 ; 0x08 27fc8: 91 84 ldd r9, Z+9 ; 0x09 27fca: a2 84 ldd r10, Z+10 ; 0x0a 27fcc: b3 84 ldd r11, Z+11 ; 0x0b 27fce: 88 15 cp r24, r8 27fd0: 99 05 cpc r25, r9 27fd2: aa 05 cpc r26, r10 27fd4: bb 05 cpc r27, r11 27fd6: 14 f4 brge .+4 ; 0x27fdc 27fd8: d5 01 movw r26, r10 27fda: c4 01 movw r24, r8 27fdc: 84 17 cp r24, r20 27fde: 95 07 cpc r25, r21 27fe0: a6 07 cpc r26, r22 27fe2: b7 07 cpc r27, r23 27fe4: 14 f4 brge .+4 ; 0x27fea 27fe6: db 01 movw r26, r22 27fe8: ca 01 movw r24, r20 27fea: 4e e6 ldi r20, 0x6E ; 110 27fec: 42 9d mul r20, r2 27fee: f0 01 movw r30, r0 27ff0: 43 9d mul r20, r3 27ff2: f0 0d add r31, r0 27ff4: 11 24 eor r1, r1 27ff6: e2 5a subi r30, 0xA2 ; 162 27ff8: f9 4f sbci r31, 0xF9 ; 249 27ffa: 80 8b std Z+16, r24 ; 0x10 27ffc: 91 8b std Z+17, r25 ; 0x11 27ffe: a2 8b std Z+18, r26 ; 0x12 28000: b3 8b std Z+19, r27 ; 0x13 // Bail if this is a zero-length block if (block->step_event_count.wide <= dropsegments) 28002: 06 97 sbiw r24, 0x06 ; 6 28004: a1 05 cpc r26, r1 28006: b1 05 cpc r27, r1 28008: 0c f4 brge .+2 ; 0x2800c 2800a: 94 cd rjmp .-1240 ; 0x27b34 planner_update_queue_min_counter(); #endif /* PLANNER_DIAGNOSTICS */ return; } block->fan_speed = fanSpeed; 2800c: 80 91 55 12 lds r24, 0x1255 ; 0x801255 28010: df 01 movw r26, r30 28012: aa 5b subi r26, 0xBA ; 186 28014: bf 4f sbci r27, 0xFF ; 255 28016: 8c 93 st X, r24 // Compute direction bits for this block block->direction_bits = 0; #ifndef COREXY if (dx < 0) block->direction_bits |= _BV(X_AXIS); 28018: f7 fe sbrs r15, 7 2801a: 02 c0 rjmp .+4 ; 0x28020 2801c: 0d 94 37 48 jmp 0x2906e ; 0x2906e } block->fan_speed = fanSpeed; // Compute direction bits for this block block->direction_bits = 0; 28020: 10 8e std Z+24, r1 ; 0x18 #ifndef COREXY if (dx < 0) block->direction_bits |= _BV(X_AXIS); if (dy < 0) block->direction_bits |= _BV(Y_AXIS); 28022: 89 a5 ldd r24, Y+41 ; 0x29 28024: 9a a5 ldd r25, Y+42 ; 0x2a 28026: ab a5 ldd r26, Y+43 ; 0x2b 28028: bc a5 ldd r27, Y+44 ; 0x2c 2802a: b7 ff sbrs r27, 7 2802c: 0b c0 rjmp .+22 ; 0x28044 2802e: 8e e6 ldi r24, 0x6E ; 110 28030: 82 9d mul r24, r2 28032: f0 01 movw r30, r0 28034: 83 9d mul r24, r3 28036: f0 0d add r31, r0 28038: 11 24 eor r1, r1 2803a: e2 5a subi r30, 0xA2 ; 162 2803c: f9 4f sbci r31, 0xF9 ; 249 2803e: 80 8d ldd r24, Z+24 ; 0x18 28040: 82 60 ori r24, 0x02 ; 2 28042: 80 8f std Z+24, r24 ; 0x18 #else if (dx + dy < 0) block->direction_bits |= _BV(X_AXIS); if (dx - dy < 0) block->direction_bits |= _BV(Y_AXIS); #endif if (dz < 0) block->direction_bits |= _BV(Z_AXIS); 28044: 8d a5 ldd r24, Y+45 ; 0x2d 28046: 9e a5 ldd r25, Y+46 ; 0x2e 28048: af a5 ldd r26, Y+47 ; 0x2f 2804a: b8 a9 ldd r27, Y+48 ; 0x30 2804c: b7 ff sbrs r27, 7 2804e: 0b c0 rjmp .+22 ; 0x28066 28050: 8e e6 ldi r24, 0x6E ; 110 28052: 82 9d mul r24, r2 28054: f0 01 movw r30, r0 28056: 83 9d mul r24, r3 28058: f0 0d add r31, r0 2805a: 11 24 eor r1, r1 2805c: e2 5a subi r30, 0xA2 ; 162 2805e: f9 4f sbci r31, 0xF9 ; 249 28060: 80 8d ldd r24, Z+24 ; 0x18 28062: 84 60 ori r24, 0x04 ; 4 28064: 80 8f std Z+24, r24 ; 0x18 if (de < 0) block->direction_bits |= _BV(E_AXIS); 28066: 77 fe sbrs r7, 7 28068: 0b c0 rjmp .+22 ; 0x28080 2806a: 8e e6 ldi r24, 0x6E ; 110 2806c: 82 9d mul r24, r2 2806e: f0 01 movw r30, r0 28070: 83 9d mul r24, r3 28072: f0 0d add r31, r0 28074: 11 24 eor r1, r1 28076: e2 5a subi r30, 0xA2 ; 162 28078: f9 4f sbci r31, 0xF9 ; 249 2807a: 80 8d ldd r24, Z+24 ; 0x18 2807c: 88 60 ori r24, 0x08 ; 8 2807e: 80 8f std Z+24, r24 ; 0x18 { enable_x(); enable_y(); } #else if(block->steps[X_AXIS].wide != 0) enable_x(); 28080: 01 2b or r16, r17 28082: 02 2b or r16, r18 28084: 03 2b or r16, r19 28086: 09 f0 breq .+2 ; 0x2808a 28088: 17 98 cbi 0x02, 7 ; 2 if(block->steps[Y_AXIS].wide != 0) enable_y(); 2808a: 8e e6 ldi r24, 0x6E ; 110 2808c: 82 9d mul r24, r2 2808e: f0 01 movw r30, r0 28090: 83 9d mul r24, r3 28092: f0 0d add r31, r0 28094: 11 24 eor r1, r1 28096: e2 5a subi r30, 0xA2 ; 162 28098: f9 4f sbci r31, 0xF9 ; 249 2809a: 84 81 ldd r24, Z+4 ; 0x04 2809c: 95 81 ldd r25, Z+5 ; 0x05 2809e: a6 81 ldd r26, Z+6 ; 0x06 280a0: b7 81 ldd r27, Z+7 ; 0x07 280a2: 89 2b or r24, r25 280a4: 8a 2b or r24, r26 280a6: 8b 2b or r24, r27 280a8: 09 f0 breq .+2 ; 0x280ac 280aa: 16 98 cbi 0x02, 6 ; 2 #endif if(block->steps[Z_AXIS].wide != 0) enable_z(); 280ac: 8e e6 ldi r24, 0x6E ; 110 280ae: 82 9d mul r24, r2 280b0: f0 01 movw r30, r0 280b2: 83 9d mul r24, r3 280b4: f0 0d add r31, r0 280b6: 11 24 eor r1, r1 280b8: e2 5a subi r30, 0xA2 ; 162 280ba: f9 4f sbci r31, 0xF9 ; 249 280bc: 80 85 ldd r24, Z+8 ; 0x08 280be: 91 85 ldd r25, Z+9 ; 0x09 280c0: a2 85 ldd r26, Z+10 ; 0x0a 280c2: b3 85 ldd r27, Z+11 ; 0x0b 280c4: 89 2b or r24, r25 280c6: 8a 2b or r24, r26 280c8: 8b 2b or r24, r27 280ca: 09 f0 breq .+2 ; 0x280ce 280cc: 15 98 cbi 0x02, 5 ; 2 if(block->steps[E_AXIS].wide != 0) enable_e0(); 280ce: 8e e6 ldi r24, 0x6E ; 110 280d0: 82 9d mul r24, r2 280d2: f0 01 movw r30, r0 280d4: 83 9d mul r24, r3 280d6: f0 0d add r31, r0 280d8: 11 24 eor r1, r1 280da: e2 5a subi r30, 0xA2 ; 162 280dc: f9 4f sbci r31, 0xF9 ; 249 280de: 84 85 ldd r24, Z+12 ; 0x0c 280e0: 95 85 ldd r25, Z+13 ; 0x0d 280e2: a6 85 ldd r26, Z+14 ; 0x0e 280e4: b7 85 ldd r27, Z+15 ; 0x0f 280e6: 89 2b or r24, r25 280e8: 8a 2b or r24, r26 280ea: 8b 2b or r24, r27 280ec: 09 f0 breq .+2 ; 0x280f0 280ee: 14 98 cbi 0x02, 4 ; 2 if (block->steps[E_AXIS].wide == 0) 280f0: 8e e6 ldi r24, 0x6E ; 110 280f2: 82 9d mul r24, r2 280f4: f0 01 movw r30, r0 280f6: 83 9d mul r24, r3 280f8: f0 0d add r31, r0 280fa: 11 24 eor r1, r1 280fc: e2 5a subi r30, 0xA2 ; 162 280fe: f9 4f sbci r31, 0xF9 ; 249 28100: 24 85 ldd r18, Z+12 ; 0x0c 28102: 35 85 ldd r19, Z+13 ; 0x0d 28104: 46 85 ldd r20, Z+14 ; 0x0e 28106: 57 85 ldd r21, Z+15 ; 0x0f 28108: 2a 96 adiw r28, 0x0a ; 10 2810a: 2c af std Y+60, r18 ; 0x3c 2810c: 3d af std Y+61, r19 ; 0x3d 2810e: 4e af std Y+62, r20 ; 0x3e 28110: 5f af std Y+63, r21 ; 0x3f 28112: 2a 97 sbiw r28, 0x0a ; 10 28114: 23 2b or r18, r19 28116: 24 2b or r18, r20 28118: 25 2b or r18, r21 2811a: 09 f0 breq .+2 ; 0x2811e 2811c: ac c7 rjmp .+3928 ; 0x29076 { if(feed_rate 28122: b0 90 a8 0d lds r11, 0x0DA8 ; 0x800da8 28126: 00 91 a9 0d lds r16, 0x0DA9 ; 0x800da9 2812a: 10 91 aa 0d lds r17, 0x0DAA ; 0x800daa } else { if(feed_rate 2813e: 18 16 cp r1, r24 28140: 24 f4 brge .+8 ; 0x2814a 28142: a9 ae std Y+57, r10 ; 0x39 28144: b9 aa std Y+49, r11 ; 0x31 28146: 0d af std Y+61, r16 ; 0x3d 28148: 1d ab std Y+53, r17 ; 0x35 So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. */ #ifndef COREXY float delta_mm[4]; delta_mm[X_AXIS] = dx / cs.axis_steps_per_mm[X_AXIS]; 2814a: c7 01 movw r24, r14 2814c: b6 01 movw r22, r12 2814e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 28152: 20 91 6b 0d lds r18, 0x0D6B ; 0x800d6b 28156: 30 91 6c 0d lds r19, 0x0D6C ; 0x800d6c 2815a: 40 91 6d 0d lds r20, 0x0D6D ; 0x800d6d 2815e: 50 91 6e 0d lds r21, 0x0D6E ; 0x800d6e 28162: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28166: 4b 01 movw r8, r22 28168: 5c 01 movw r10, r24 2816a: 89 82 std Y+1, r8 ; 0x01 2816c: 9a 82 std Y+2, r9 ; 0x02 2816e: ab 82 std Y+3, r10 ; 0x03 28170: bc 82 std Y+4, r11 ; 0x04 delta_mm[Y_AXIS] = dy / cs.axis_steps_per_mm[Y_AXIS]; 28172: 69 a5 ldd r22, Y+41 ; 0x29 28174: 7a a5 ldd r23, Y+42 ; 0x2a 28176: 8b a5 ldd r24, Y+43 ; 0x2b 28178: 9c a5 ldd r25, Y+44 ; 0x2c 2817a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2817e: 20 91 6f 0d lds r18, 0x0D6F ; 0x800d6f 28182: 30 91 70 0d lds r19, 0x0D70 ; 0x800d70 28186: 40 91 71 0d lds r20, 0x0D71 ; 0x800d71 2818a: 50 91 72 0d lds r21, 0x0D72 ; 0x800d72 2818e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28192: 6b 01 movw r12, r22 28194: 7c 01 movw r14, r24 28196: cd 82 std Y+5, r12 ; 0x05 28198: de 82 std Y+6, r13 ; 0x06 2819a: ef 82 std Y+7, r14 ; 0x07 2819c: f8 86 std Y+8, r15 ; 0x08 delta_mm[X_HEAD] = dx / cs.axis_steps_per_mm[X_AXIS]; delta_mm[Y_HEAD] = dy / cs.axis_steps_per_mm[Y_AXIS]; delta_mm[X_AXIS] = (dx + dy) / cs.axis_steps_per_mm[X_AXIS]; delta_mm[Y_AXIS] = (dx - dy) / cs.axis_steps_per_mm[Y_AXIS]; #endif delta_mm[Z_AXIS] = dz / cs.axis_steps_per_mm[Z_AXIS]; 2819e: 6d a5 ldd r22, Y+45 ; 0x2d 281a0: 7e a5 ldd r23, Y+46 ; 0x2e 281a2: 8f a5 ldd r24, Y+47 ; 0x2f 281a4: 98 a9 ldd r25, Y+48 ; 0x30 281a6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 281aa: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 281ae: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 281b2: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 281b6: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 281ba: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 281be: 22 96 adiw r28, 0x02 ; 2 281c0: 6c af std Y+60, r22 ; 0x3c 281c2: 7d af std Y+61, r23 ; 0x3d 281c4: 8e af std Y+62, r24 ; 0x3e 281c6: 9f af std Y+63, r25 ; 0x3f 281c8: 22 97 sbiw r28, 0x02 ; 2 281ca: 69 87 std Y+9, r22 ; 0x09 281cc: 7a 87 std Y+10, r23 ; 0x0a 281ce: 8b 87 std Y+11, r24 ; 0x0b 281d0: 9c 87 std Y+12, r25 ; 0x0c delta_mm[E_AXIS] = de / cs.axis_steps_per_mm[E_AXIS]; 281d2: c3 01 movw r24, r6 281d4: b2 01 movw r22, r4 281d6: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 281da: 20 91 77 0d lds r18, 0x0D77 ; 0x800d77 281de: 30 91 78 0d lds r19, 0x0D78 ; 0x800d78 281e2: 40 91 79 0d lds r20, 0x0D79 ; 0x800d79 281e6: 50 91 7a 0d lds r21, 0x0D7A ; 0x800d7a 281ea: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 281ee: 26 96 adiw r28, 0x06 ; 6 281f0: 6c af std Y+60, r22 ; 0x3c 281f2: 7d af std Y+61, r23 ; 0x3d 281f4: 8e af std Y+62, r24 ; 0x3e 281f6: 9f af std Y+63, r25 ; 0x3f 281f8: 26 97 sbiw r28, 0x06 ; 6 281fa: 6d 87 std Y+13, r22 ; 0x0d 281fc: 7e 87 std Y+14, r23 ; 0x0e 281fe: 8f 87 std Y+15, r24 ; 0x0f 28200: 98 8b std Y+16, r25 ; 0x10 if ( block->steps[X_AXIS].wide <=dropsegments && block->steps[Y_AXIS].wide <=dropsegments && block->steps[Z_AXIS].wide <=dropsegments ) 28202: 8e e6 ldi r24, 0x6E ; 110 28204: 82 9d mul r24, r2 28206: f0 01 movw r30, r0 28208: 83 9d mul r24, r3 2820a: f0 0d add r31, r0 2820c: 11 24 eor r1, r1 2820e: e2 5a subi r30, 0xA2 ; 162 28210: f9 4f sbci r31, 0xF9 ; 249 28212: 80 81 ld r24, Z 28214: 91 81 ldd r25, Z+1 ; 0x01 28216: a2 81 ldd r26, Z+2 ; 0x02 28218: b3 81 ldd r27, Z+3 ; 0x03 2821a: 2e 96 adiw r28, 0x0e ; 14 2821c: 8c af std Y+60, r24 ; 0x3c 2821e: 9d af std Y+61, r25 ; 0x3d 28220: ae af std Y+62, r26 ; 0x3e 28222: bf af std Y+63, r27 ; 0x3f 28224: 2e 97 sbiw r28, 0x0e ; 14 28226: 06 97 sbiw r24, 0x06 ; 6 28228: a1 05 cpc r26, r1 2822a: b1 05 cpc r27, r1 2822c: 0c f0 brlt .+2 ; 0x28230 2822e: 2c c7 rjmp .+3672 ; 0x29088 28230: 84 81 ldd r24, Z+4 ; 0x04 28232: 95 81 ldd r25, Z+5 ; 0x05 28234: a6 81 ldd r26, Z+6 ; 0x06 28236: b7 81 ldd r27, Z+7 ; 0x07 28238: 06 97 sbiw r24, 0x06 ; 6 2823a: a1 05 cpc r26, r1 2823c: b1 05 cpc r27, r1 2823e: 0c f0 brlt .+2 ; 0x28242 28240: 23 c7 rjmp .+3654 ; 0x29088 28242: 80 85 ldd r24, Z+8 ; 0x08 28244: 91 85 ldd r25, Z+9 ; 0x09 28246: a2 85 ldd r26, Z+10 ; 0x0a 28248: b3 85 ldd r27, Z+11 ; 0x0b 2824a: 06 97 sbiw r24, 0x06 ; 6 2824c: a1 05 cpc r26, r1 2824e: b1 05 cpc r27, r1 28250: 0c f0 brlt .+2 ; 0x28254 28252: 1a c7 rjmp .+3636 ; 0x29088 { block->millimeters = fabs(delta_mm[E_AXIS]); 28254: 26 96 adiw r28, 0x06 ; 6 28256: 8c ad ldd r24, Y+60 ; 0x3c 28258: 9d ad ldd r25, Y+61 ; 0x3d 2825a: ae ad ldd r26, Y+62 ; 0x3e 2825c: bf ad ldd r27, Y+63 ; 0x3f 2825e: 26 97 sbiw r28, 0x06 ; 6 28260: bf 77 andi r27, 0x7F ; 127 28262: 85 a7 std Z+45, r24 ; 0x2d 28264: 96 a7 std Z+46, r25 ; 0x2e 28266: a7 a7 std Z+47, r26 ; 0x2f 28268: b0 ab std Z+48, r27 ; 0x30 block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS])); #else block->millimeters = sqrt(square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS])); #endif } float inverse_millimeters = 1.0/block->millimeters; // Inverse millimeters to remove multiple divides 2826a: 8e e6 ldi r24, 0x6E ; 110 2826c: 82 9d mul r24, r2 2826e: f0 01 movw r30, r0 28270: 83 9d mul r24, r3 28272: f0 0d add r31, r0 28274: 11 24 eor r1, r1 28276: e2 5a subi r30, 0xA2 ; 162 28278: f9 4f sbci r31, 0xF9 ; 249 2827a: 45 a4 ldd r4, Z+45 ; 0x2d 2827c: 56 a4 ldd r5, Z+46 ; 0x2e 2827e: 67 a4 ldd r6, Z+47 ; 0x2f 28280: 70 a8 ldd r7, Z+48 ; 0x30 28282: a3 01 movw r20, r6 28284: 92 01 movw r18, r4 28286: 60 e0 ldi r22, 0x00 ; 0 28288: 70 e0 ldi r23, 0x00 ; 0 2828a: 80 e8 ldi r24, 0x80 ; 128 2828c: 9f e3 ldi r25, 0x3F ; 63 2828e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> // Calculate speed in mm/second for each axis. No divide by zero due to previous checks. float inverse_second = feed_rate * inverse_millimeters; 28292: 29 ad ldd r18, Y+57 ; 0x39 28294: 39 a9 ldd r19, Y+49 ; 0x31 28296: 4d ad ldd r20, Y+61 ; 0x3d 28298: 5d a9 ldd r21, Y+53 ; 0x35 2829a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2829e: 6b 01 movw r12, r22 282a0: 7c 01 movw r14, r24 return (block_buffer_head != block_buffer_tail); } //return the nr of buffered moves FORCE_INLINE uint8_t moves_planned() { return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); 282a2: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 282a6: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 282aa: 89 1b sub r24, r25 282ac: 8f 70 andi r24, 0x0F ; 15 282ae: 8d af std Y+61, r24 ; 0x3d // slow down when de buffer starts to empty, rather than wait at the corner for a buffer refill #ifdef SLOWDOWN //FIXME Vojtech: Why moves_queued > 1? Why not >=1? // Can we somehow differentiate the filling of the buffer at the start of a g-code from a buffer draining situation? if (moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE >> 1)) { 282b0: 82 50 subi r24, 0x02 ; 2 282b2: 86 30 cpi r24, 0x06 ; 6 282b4: 08 f0 brcs .+2 ; 0x282b8 282b6: 40 c0 rjmp .+128 ; 0x28338 // segment time in micro seconds unsigned long segment_time = lround(1000000.0/inverse_second); 282b8: a7 01 movw r20, r14 282ba: 96 01 movw r18, r12 282bc: 60 e0 ldi r22, 0x00 ; 0 282be: 74 e2 ldi r23, 0x24 ; 36 282c0: 84 e7 ldi r24, 0x74 ; 116 282c2: 99 e4 ldi r25, 0x49 ; 73 282c4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 282c8: 0f 94 45 a8 call 0x3508a ; 0x3508a 282cc: 4b 01 movw r8, r22 282ce: 5c 01 movw r10, r24 if (segment_time < cs.min_segment_time_us) 282d0: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 282d4: 90 91 ac 0d lds r25, 0x0DAC ; 0x800dac 282d8: a0 91 ad 0d lds r26, 0x0DAD ; 0x800dad 282dc: b0 91 ae 0d lds r27, 0x0DAE ; 0x800dae 282e0: 88 16 cp r8, r24 282e2: 99 06 cpc r9, r25 282e4: aa 06 cpc r10, r26 282e6: bb 06 cpc r11, r27 282e8: 38 f5 brcc .+78 ; 0x28338 // buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more. inverse_second=1000000.0/(segment_time+lround(2*(cs.min_segment_time_us-segment_time)/moves_queued)); 282ea: bc 01 movw r22, r24 282ec: cd 01 movw r24, r26 282ee: 68 19 sub r22, r8 282f0: 79 09 sbc r23, r9 282f2: 8a 09 sbc r24, r10 282f4: 9b 09 sbc r25, r11 282f6: 66 0f add r22, r22 282f8: 77 1f adc r23, r23 282fa: 88 1f adc r24, r24 282fc: 99 1f adc r25, r25 282fe: ad ad ldd r26, Y+61 ; 0x3d 28300: 2a 2f mov r18, r26 28302: 30 e0 ldi r19, 0x00 ; 0 28304: 50 e0 ldi r21, 0x00 ; 0 28306: 40 e0 ldi r20, 0x00 ; 0 28308: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 2830c: ca 01 movw r24, r20 2830e: b9 01 movw r22, r18 28310: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 28314: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 28318: 68 0d add r22, r8 2831a: 79 1d adc r23, r9 2831c: 8a 1d adc r24, r10 2831e: 9b 1d adc r25, r11 28320: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 28324: 9b 01 movw r18, r22 28326: ac 01 movw r20, r24 28328: 60 e0 ldi r22, 0x00 ; 0 2832a: 74 e2 ldi r23, 0x24 ; 36 2832c: 84 e7 ldi r24, 0x74 ; 116 2832e: 99 e4 ldi r25, 0x49 ; 73 28330: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28334: 6b 01 movw r12, r22 28336: 7c 01 movw r14, r24 } #endif // SLOWDOWN block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0 28338: a3 01 movw r20, r6 2833a: 92 01 movw r18, r4 2833c: c7 01 movw r24, r14 2833e: b6 01 movw r22, r12 28340: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28344: 6d ab std Y+53, r22 ; 0x35 28346: 7e ab std Y+54, r23 ; 0x36 28348: 8f ab std Y+55, r24 ; 0x37 2834a: 98 af std Y+56, r25 ; 0x38 2834c: 8e e6 ldi r24, 0x6E ; 110 2834e: 82 9d mul r24, r2 28350: 80 01 movw r16, r0 28352: 83 9d mul r24, r3 28354: 10 0d add r17, r0 28356: 11 24 eor r1, r1 28358: 02 5a subi r16, 0xA2 ; 162 2835a: 19 4f sbci r17, 0xF9 ; 249 2835c: 2d a9 ldd r18, Y+53 ; 0x35 2835e: 3e a9 ldd r19, Y+54 ; 0x36 28360: 4f a9 ldd r20, Y+55 ; 0x37 28362: 58 ad ldd r21, Y+56 ; 0x38 28364: d8 01 movw r26, r16 28366: 91 96 adiw r26, 0x21 ; 33 28368: 2d 93 st X+, r18 2836a: 3d 93 st X+, r19 2836c: 4d 93 st X+, r20 2836e: 5c 93 st X, r21 28370: 94 97 sbiw r26, 0x24 ; 36 block->nominal_rate = ceil(block->step_event_count.wide * inverse_second); // (step/sec) Always > 0 28372: 50 96 adiw r26, 0x10 ; 16 28374: 6d 91 ld r22, X+ 28376: 7d 91 ld r23, X+ 28378: 8d 91 ld r24, X+ 2837a: 9c 91 ld r25, X 2837c: 53 97 sbiw r26, 0x13 ; 19 2837e: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 28382: 69 af std Y+57, r22 ; 0x39 28384: 7a af std Y+58, r23 ; 0x3a 28386: 8b af std Y+59, r24 ; 0x3b 28388: 9c af std Y+60, r25 ; 0x3c 2838a: 9b 01 movw r18, r22 2838c: ac 01 movw r20, r24 2838e: c7 01 movw r24, r14 28390: b6 01 movw r22, r12 28392: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28396: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 2839a: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 2839e: 62 96 adiw r28, 0x12 ; 18 283a0: 6c af std Y+60, r22 ; 0x3c 283a2: 7d af std Y+61, r23 ; 0x3d 283a4: 8e af std Y+62, r24 ; 0x3e 283a6: 9f af std Y+63, r25 ; 0x3f 283a8: 62 97 sbiw r28, 0x12 ; 18 283aa: f8 01 movw r30, r16 283ac: 66 ab std Z+54, r22 ; 0x36 283ae: 77 ab std Z+55, r23 ; 0x37 283b0: 80 af std Z+56, r24 ; 0x38 283b2: 91 af std Z+57, r25 ; 0x39 283b4: 9e 01 movw r18, r28 283b6: 2f 5f subi r18, 0xFF ; 255 283b8: 3f 4f sbci r19, 0xFF ; 255 283ba: 3a ab std Y+50, r19 ; 0x32 283bc: 29 ab std Y+49, r18 ; 0x31 283be: ae 01 movw r20, r28 283c0: 4f 5e subi r20, 0xEF ; 239 283c2: 5f 4f sbci r21, 0xFF ; 255 283c4: 6e 96 adiw r28, 0x1e ; 30 283c6: 5f af std Y+63, r21 ; 0x3f 283c8: 4e af std Y+62, r20 ; 0x3e 283ca: 6e 97 sbiw r28, 0x1e ; 30 283cc: 8b e7 ldi r24, 0x7B ; 123 283ce: 9d e0 ldi r25, 0x0D ; 13 283d0: 68 96 adiw r28, 0x18 ; 24 283d2: 9f af std Y+63, r25 ; 0x3f 283d4: 8e af std Y+62, r24 ; 0x3e 283d6: 68 97 sbiw r28, 0x18 ; 24 283d8: 6c 96 adiw r28, 0x1c ; 28 283da: 5f af std Y+63, r21 ; 0x3f 283dc: 4e af std Y+62, r20 ; 0x3e 283de: 6c 97 sbiw r28, 0x1c ; 28 // Calculate and limit speed in mm/sec for each axis float current_speed[4]; float speed_factor = 1.0; //factor <=1 do decrease speed 283e0: 19 a6 std Y+41, r1 ; 0x29 283e2: 1d a6 std Y+45, r1 ; 0x2d 283e4: 00 e8 ldi r16, 0x80 ; 128 283e6: 1f e3 ldi r17, 0x3F ; 63 for(int i=0; i < 4; i++) { current_speed[i] = delta_mm[i] * inverse_second; 283e8: a9 a9 ldd r26, Y+49 ; 0x31 283ea: ba a9 ldd r27, Y+50 ; 0x32 283ec: 2d 91 ld r18, X+ 283ee: 3d 91 ld r19, X+ 283f0: 4d 91 ld r20, X+ 283f2: 5d 91 ld r21, X+ 283f4: ba ab std Y+50, r27 ; 0x32 283f6: a9 ab std Y+49, r26 ; 0x31 283f8: c7 01 movw r24, r14 283fa: b6 01 movw r22, r12 283fc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28400: 6c 96 adiw r28, 0x1c ; 28 28402: ee ad ldd r30, Y+62 ; 0x3e 28404: ff ad ldd r31, Y+63 ; 0x3f 28406: 6c 97 sbiw r28, 0x1c ; 28 28408: 61 93 st Z+, r22 2840a: 71 93 st Z+, r23 2840c: 81 93 st Z+, r24 2840e: 91 93 st Z+, r25 28410: 6c 96 adiw r28, 0x1c ; 28 28412: ff af std Y+63, r31 ; 0x3f 28414: ee af std Y+62, r30 ; 0x3e 28416: 6c 97 sbiw r28, 0x1c ; 28 if(fabs(current_speed[i]) > max_feedrate[i]) 28418: 4b 01 movw r8, r22 2841a: 5c 01 movw r10, r24 2841c: e8 94 clt 2841e: b7 f8 bld r11, 7 28420: 68 96 adiw r28, 0x18 ; 24 28422: ae ad ldd r26, Y+62 ; 0x3e 28424: bf ad ldd r27, Y+63 ; 0x3f 28426: 68 97 sbiw r28, 0x18 ; 24 28428: 2d 91 ld r18, X+ 2842a: 3d 91 ld r19, X+ 2842c: 4d 91 ld r20, X+ 2842e: 5d 91 ld r21, X+ 28430: 68 96 adiw r28, 0x18 ; 24 28432: bf af std Y+63, r27 ; 0x3f 28434: ae af std Y+62, r26 ; 0x3e 28436: 68 97 sbiw r28, 0x18 ; 24 28438: 66 96 adiw r28, 0x16 ; 22 2843a: 2c af std Y+60, r18 ; 0x3c 2843c: 3d af std Y+61, r19 ; 0x3d 2843e: 4e af std Y+62, r20 ; 0x3e 28440: 5f af std Y+63, r21 ; 0x3f 28442: 66 97 sbiw r28, 0x16 ; 22 28444: c5 01 movw r24, r10 28446: b4 01 movw r22, r8 28448: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2844c: 18 16 cp r1, r24 2844e: b4 f4 brge .+44 ; 0x2847c { speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); 28450: a5 01 movw r20, r10 28452: 94 01 movw r18, r8 28454: 66 96 adiw r28, 0x16 ; 22 28456: 6c ad ldd r22, Y+60 ; 0x3c 28458: 7d ad ldd r23, Y+61 ; 0x3d 2845a: 8e ad ldd r24, Y+62 ; 0x3e 2845c: 9f ad ldd r25, Y+63 ; 0x3f 2845e: 66 97 sbiw r28, 0x16 ; 22 28460: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28464: 4b 01 movw r8, r22 28466: 5c 01 movw r10, r24 28468: 29 a5 ldd r18, Y+41 ; 0x29 2846a: 3d a5 ldd r19, Y+45 ; 0x2d 2846c: a8 01 movw r20, r16 2846e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28472: 18 16 cp r1, r24 28474: 1c f0 brlt .+6 ; 0x2847c 28476: 89 a6 std Y+41, r8 ; 0x29 28478: 9d a6 std Y+45, r9 ; 0x2d 2847a: 85 01 movw r16, r10 block->nominal_rate = ceil(block->step_event_count.wide * inverse_second); // (step/sec) Always > 0 // Calculate and limit speed in mm/sec for each axis float current_speed[4]; float speed_factor = 1.0; //factor <=1 do decrease speed for(int i=0; i < 4; i++) 2847c: 6e 96 adiw r28, 0x1e ; 30 2847e: ee ad ldd r30, Y+62 ; 0x3e 28480: ff ad ldd r31, Y+63 ; 0x3f 28482: 6e 97 sbiw r28, 0x1e ; 30 28484: 29 a9 ldd r18, Y+49 ; 0x31 28486: 3a a9 ldd r19, Y+50 ; 0x32 28488: e2 17 cp r30, r18 2848a: f3 07 cpc r31, r19 2848c: 09 f0 breq .+2 ; 0x28490 2848e: ac cf rjmp .-168 ; 0x283e8 speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); } } // Correct the speed if( speed_factor < 1.0) 28490: 20 e0 ldi r18, 0x00 ; 0 28492: 30 e0 ldi r19, 0x00 ; 0 28494: 40 e8 ldi r20, 0x80 ; 128 28496: 5f e3 ldi r21, 0x3F ; 63 28498: 69 a5 ldd r22, Y+41 ; 0x29 2849a: 7d a5 ldd r23, Y+45 ; 0x2d 2849c: c8 01 movw r24, r16 2849e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 284a2: 87 ff sbrs r24, 7 284a4: 50 c0 rjmp .+160 ; 0x28546 284a6: 6e 96 adiw r28, 0x1e ; 30 284a8: ae ac ldd r10, Y+62 ; 0x3e 284aa: bf ac ldd r11, Y+63 ; 0x3f 284ac: 6e 97 sbiw r28, 0x1e ; 30 284ae: 30 e1 ldi r19, 0x10 ; 16 284b0: a3 0e add r10, r19 284b2: b1 1c adc r11, r1 284b4: 6e 96 adiw r28, 0x1e ; 30 284b6: ce ac ldd r12, Y+62 ; 0x3e 284b8: df ac ldd r13, Y+63 ; 0x3f 284ba: 6e 97 sbiw r28, 0x1e ; 30 { for(unsigned char i=0; i < 4; i++) { current_speed[i] *= speed_factor; 284bc: d6 01 movw r26, r12 284be: 6d 91 ld r22, X+ 284c0: 7d 91 ld r23, X+ 284c2: 8d 91 ld r24, X+ 284c4: 9d 91 ld r25, X+ 284c6: 6d 01 movw r12, r26 284c8: 7d 01 movw r14, r26 284ca: b4 e0 ldi r27, 0x04 ; 4 284cc: eb 1a sub r14, r27 284ce: f1 08 sbc r15, r1 284d0: 29 a5 ldd r18, Y+41 ; 0x29 284d2: 3d a5 ldd r19, Y+45 ; 0x2d 284d4: a8 01 movw r20, r16 284d6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 284da: f7 01 movw r30, r14 284dc: 60 83 st Z, r22 284de: 71 83 std Z+1, r23 ; 0x01 284e0: 82 83 std Z+2, r24 ; 0x02 284e2: 93 83 std Z+3, r25 ; 0x03 } // Correct the speed if( speed_factor < 1.0) { for(unsigned char i=0; i < 4; i++) 284e4: ac 14 cp r10, r12 284e6: bd 04 cpc r11, r13 284e8: 49 f7 brne .-46 ; 0x284bc { current_speed[i] *= speed_factor; } block->nominal_speed *= speed_factor; 284ea: 2e e6 ldi r18, 0x6E ; 110 284ec: 22 9d mul r18, r2 284ee: c0 01 movw r24, r0 284f0: 23 9d mul r18, r3 284f2: 90 0d add r25, r0 284f4: 11 24 eor r1, r1 284f6: 9c 01 movw r18, r24 284f8: 22 5a subi r18, 0xA2 ; 162 284fa: 39 4f sbci r19, 0xF9 ; 249 284fc: 79 01 movw r14, r18 284fe: 29 a5 ldd r18, Y+41 ; 0x29 28500: 3d a5 ldd r19, Y+45 ; 0x2d 28502: a8 01 movw r20, r16 28504: 6d a9 ldd r22, Y+53 ; 0x35 28506: 7e a9 ldd r23, Y+54 ; 0x36 28508: 8f a9 ldd r24, Y+55 ; 0x37 2850a: 98 ad ldd r25, Y+56 ; 0x38 2850c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28510: d7 01 movw r26, r14 28512: 91 96 adiw r26, 0x21 ; 33 28514: 6d 93 st X+, r22 28516: 7d 93 st X+, r23 28518: 8d 93 st X+, r24 2851a: 9c 93 st X, r25 2851c: 94 97 sbiw r26, 0x24 ; 36 block->nominal_rate *= speed_factor; 2851e: 62 96 adiw r28, 0x12 ; 18 28520: 6c ad ldd r22, Y+60 ; 0x3c 28522: 7d ad ldd r23, Y+61 ; 0x3d 28524: 8e ad ldd r24, Y+62 ; 0x3e 28526: 9f ad ldd r25, Y+63 ; 0x3f 28528: 62 97 sbiw r28, 0x12 ; 18 2852a: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2852e: 29 a5 ldd r18, Y+41 ; 0x29 28530: 3d a5 ldd r19, Y+45 ; 0x2d 28532: a8 01 movw r20, r16 28534: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28538: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 2853c: f7 01 movw r30, r14 2853e: 66 ab std Z+54, r22 ; 0x36 28540: 77 ab std Z+55, r23 ; 0x37 28542: 80 af std Z+56, r24 ; 0x38 28544: 91 af std Z+57, r25 ; 0x39 float e_D_ratio = 0; #endif // Compute and limit the acceleration rate for the trapezoid generator. // block->step_event_count ... event count of the fastest axis // block->millimeters ... Euclidian length of the XYZ movement or the E length, if no XYZ movement. float steps_per_mm = block->step_event_count.wide/block->millimeters; 28546: a3 01 movw r20, r6 28548: 92 01 movw r18, r4 2854a: 69 ad ldd r22, Y+57 ; 0x39 2854c: 7a ad ldd r23, Y+58 ; 0x3a 2854e: 8b ad ldd r24, Y+59 ; 0x3b 28550: 9c ad ldd r25, Y+60 ; 0x3c 28552: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28556: 69 a7 std Y+41, r22 ; 0x29 28558: 7a a7 std Y+42, r23 ; 0x2a 2855a: 8b a7 std Y+43, r24 ; 0x2b 2855c: 9c a7 std Y+44, r25 ; 0x2c uint32_t accel; if(block->steps[X_AXIS].wide == 0 && block->steps[Y_AXIS].wide == 0 && block->steps[Z_AXIS].wide == 0) 2855e: 2e 96 adiw r28, 0x0e ; 14 28560: 2c ad ldd r18, Y+60 ; 0x3c 28562: 3d ad ldd r19, Y+61 ; 0x3d 28564: 4e ad ldd r20, Y+62 ; 0x3e 28566: 5f ad ldd r21, Y+63 ; 0x3f 28568: 2e 97 sbiw r28, 0x0e ; 14 2856a: 23 2b or r18, r19 2856c: 24 2b or r18, r20 2856e: 25 2b or r18, r21 28570: 09 f0 breq .+2 ; 0x28574 28572: b9 c5 rjmp .+2930 ; 0x290e6 28574: 8e e6 ldi r24, 0x6E ; 110 28576: 82 9d mul r24, r2 28578: 80 01 movw r16, r0 2857a: 83 9d mul r24, r3 2857c: 10 0d add r17, r0 2857e: 11 24 eor r1, r1 28580: 02 5a subi r16, 0xA2 ; 162 28582: 19 4f sbci r17, 0xF9 ; 249 28584: f8 01 movw r30, r16 28586: 84 81 ldd r24, Z+4 ; 0x04 28588: 95 81 ldd r25, Z+5 ; 0x05 2858a: a6 81 ldd r26, Z+6 ; 0x06 2858c: b7 81 ldd r27, Z+7 ; 0x07 2858e: 89 2b or r24, r25 28590: 8a 2b or r24, r26 28592: 8b 2b or r24, r27 28594: 09 f0 breq .+2 ; 0x28598 28596: a7 c5 rjmp .+2894 ; 0x290e6 28598: 80 85 ldd r24, Z+8 ; 0x08 2859a: 91 85 ldd r25, Z+9 ; 0x09 2859c: a2 85 ldd r26, Z+10 ; 0x0a 2859e: b3 85 ldd r27, Z+11 ; 0x0b 285a0: 89 2b or r24, r25 285a2: 8a 2b or r24, r26 285a4: 8b 2b or r24, r27 285a6: 09 f0 breq .+2 ; 0x285aa 285a8: 9e c5 rjmp .+2876 ; 0x290e6 { accel = ceil(cs.retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 285aa: 20 91 9f 0d lds r18, 0x0D9F ; 0x800d9f 285ae: 30 91 a0 0d lds r19, 0x0DA0 ; 0x800da0 285b2: 40 91 a1 0d lds r20, 0x0DA1 ; 0x800da1 285b6: 50 91 a2 0d lds r21, 0x0DA2 ; 0x800da2 285ba: 69 a5 ldd r22, Y+41 ; 0x29 285bc: 7a a5 ldd r23, Y+42 ; 0x2a 285be: 8b a5 ldd r24, Y+43 ; 0x2b 285c0: 9c a5 ldd r25, Y+44 ; 0x2c 285c2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 285c6: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 285ca: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 285ce: 2b 01 movw r4, r22 285d0: 3c 01 movw r6, r24 #ifdef LIN_ADVANCE block->use_advance_lead = false; 285d2: f8 01 movw r30, r16 285d4: e4 5b subi r30, 0xB4 ; 180 285d6: ff 4f sbci r31, 0xFF ; 255 285d8: 10 82 st Z, r1 block->nominal_speed *= speed_factor; block->nominal_rate *= speed_factor; } #ifdef LIN_ADVANCE float e_D_ratio = 0; 285da: 6a 96 adiw r28, 0x1a ; 26 285dc: 1c ae std Y+60, r1 ; 0x3c 285de: 1d ae std Y+61, r1 ; 0x3d 285e0: 1e ae std Y+62, r1 ; 0x3e 285e2: 1f ae std Y+63, r1 ; 0x3f 285e4: 6a 97 sbiw r28, 0x1a ; 26 if (max_possible < accel) accel = max_possible; } } } // Acceleration of the segment, in mm/sec^2 block->acceleration_steps_per_s2 = accel; 285e6: 8e e6 ldi r24, 0x6E ; 110 285e8: 82 9d mul r24, r2 285ea: 80 01 movw r16, r0 285ec: 83 9d mul r24, r3 285ee: 10 0d add r17, r0 285f0: 11 24 eor r1, r1 285f2: 02 5a subi r16, 0xA2 ; 162 285f4: 19 4f sbci r17, 0xF9 ; 249 285f6: f8 01 movw r30, r16 285f8: ee 5b subi r30, 0xBE ; 190 285fa: ff 4f sbci r31, 0xFF ; 255 285fc: 40 82 st Z, r4 285fe: 51 82 std Z+1, r5 ; 0x01 28600: 62 82 std Z+2, r6 ; 0x02 28602: 73 82 std Z+3, r7 ; 0x03 block->acceleration = accel / steps_per_mm; 28604: c3 01 movw r24, r6 28606: b2 01 movw r22, r4 28608: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2860c: 6b 01 movw r12, r22 2860e: 7c 01 movw r14, r24 28610: 29 a5 ldd r18, Y+41 ; 0x29 28612: 3a a5 ldd r19, Y+42 ; 0x2a 28614: 4b a5 ldd r20, Y+43 ; 0x2b 28616: 5c a5 ldd r21, Y+44 ; 0x2c 28618: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2861c: e1 96 adiw r28, 0x31 ; 49 2861e: 6c af std Y+60, r22 ; 0x3c 28620: 7d af std Y+61, r23 ; 0x3d 28622: 8e af std Y+62, r24 ; 0x3e 28624: 9f af std Y+63, r25 ; 0x3f 28626: e1 97 sbiw r28, 0x31 ; 49 28628: f8 01 movw r30, r16 2862a: 61 ab std Z+49, r22 ; 0x31 2862c: 72 ab std Z+50, r23 ; 0x32 2862e: 83 ab std Z+51, r24 ; 0x33 28630: 94 ab std Z+52, r25 ; 0x34 block->acceleration_rate = (uint32_t)(accel * (float(1UL << 24) / ((F_CPU) / 8.0f))); 28632: 2d eb ldi r18, 0xBD ; 189 28634: 37 e3 ldi r19, 0x37 ; 55 28636: 46 e0 ldi r20, 0x06 ; 6 28638: 51 e4 ldi r21, 0x41 ; 65 2863a: c7 01 movw r24, r14 2863c: b6 01 movw r22, r12 2863e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28642: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 28646: d8 01 movw r26, r16 28648: 54 96 adiw r26, 0x14 ; 20 2864a: 6d 93 st X+, r22 2864c: 7d 93 st X+, r23 2864e: 8d 93 st X+, r24 28650: 9c 93 st X, r25 28652: 57 97 sbiw r26, 0x17 ; 23 // Start with a safe speed. // Safe speed is the speed, from which the machine may halt to stop immediately. float safe_speed = block->nominal_speed; 28654: 91 96 adiw r26, 0x21 ; 33 28656: bc 91 ld r27, X 28658: 27 96 adiw r28, 0x07 ; 7 2865a: bf af std Y+63, r27 ; 0x3f 2865c: 27 97 sbiw r28, 0x07 ; 7 2865e: f8 01 movw r30, r16 28660: f2 a1 ldd r31, Z+34 ; 0x22 28662: 2b 96 adiw r28, 0x0b ; 11 28664: ff af std Y+63, r31 ; 0x3f 28666: 2b 97 sbiw r28, 0x0b ; 11 28668: d8 01 movw r26, r16 2866a: 93 96 adiw r26, 0x23 ; 35 2866c: bc 91 ld r27, X 2866e: 2f 96 adiw r28, 0x0f ; 15 28670: bf af std Y+63, r27 ; 0x3f 28672: 2f 97 sbiw r28, 0x0f ; 15 28674: f8 01 movw r30, r16 28676: f4 a1 ldd r31, Z+36 ; 0x24 28678: 63 96 adiw r28, 0x13 ; 19 2867a: ff af std Y+63, r31 ; 0x3f 2867c: 63 97 sbiw r28, 0x13 ; 19 2867e: 2f ea ldi r18, 0xAF ; 175 28680: 3d e0 ldi r19, 0x0D ; 13 28682: ed 96 adiw r28, 0x3d ; 61 28684: 3f af std Y+63, r19 ; 0x3f 28686: 2e af std Y+62, r18 ; 0x3e 28688: ed 97 sbiw r28, 0x3d ; 61 2868a: 6e 96 adiw r28, 0x1e ; 30 2868c: 4e ac ldd r4, Y+62 ; 0x3e 2868e: 5f ac ldd r5, Y+63 ; 0x3f 28690: 6e 97 sbiw r28, 0x1e ; 30 28692: 30 e1 ldi r19, 0x10 ; 16 28694: 43 0e add r4, r19 28696: 51 1c adc r5, r1 28698: 0f ea ldi r16, 0xAF ; 175 2869a: 1d e0 ldi r17, 0x0D ; 13 2869c: 6e 96 adiw r28, 0x1e ; 30 2869e: 6e ac ldd r6, Y+62 ; 0x3e 286a0: 7f ac ldd r7, Y+63 ; 0x3f 286a2: 6e 97 sbiw r28, 0x1e ; 30 286a4: 27 96 adiw r28, 0x07 ; 7 286a6: 4f ad ldd r20, Y+63 ; 0x3f 286a8: 27 97 sbiw r28, 0x07 ; 7 286aa: 49 a7 std Y+41, r20 ; 0x29 286ac: 2b 96 adiw r28, 0x0b ; 11 286ae: 5f ad ldd r21, Y+63 ; 0x3f 286b0: 2b 97 sbiw r28, 0x0b ; 11 286b2: 5d a7 std Y+45, r21 ; 0x2d 286b4: b9 af std Y+57, r27 ; 0x39 286b6: f9 ab std Y+49, r31 ; 0x31 bool limited = false; 286b8: 1d aa std Y+53, r1 ; 0x35 for (uint8_t axis = 0; axis < 4; ++ axis) { float jerk = fabs(current_speed[axis]); 286ba: d3 01 movw r26, r6 286bc: 8d 90 ld r8, X+ 286be: 9d 90 ld r9, X+ 286c0: ad 90 ld r10, X+ 286c2: bd 90 ld r11, X+ 286c4: 3d 01 movw r6, r26 286c6: e8 94 clt 286c8: b7 f8 bld r11, 7 if (jerk > cs.max_jerk[axis]) { 286ca: f8 01 movw r30, r16 286cc: c1 90 ld r12, Z+ 286ce: d1 90 ld r13, Z+ 286d0: e1 90 ld r14, Z+ 286d2: f1 90 ld r15, Z+ 286d4: 8f 01 movw r16, r30 286d6: a5 01 movw r20, r10 286d8: 94 01 movw r18, r8 286da: c7 01 movw r24, r14 286dc: b6 01 movw r22, r12 286de: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 286e2: 87 ff sbrs r24, 7 286e4: 3a c0 rjmp .+116 ; 0x2875a // The actual jerk is lower, if it has been limited by the XY jerk. if (limited) { 286e6: fd a9 ldd r31, Y+53 ; 0x35 286e8: ff 23 and r31, r31 286ea: 09 f4 brne .+2 ; 0x286ee 286ec: 7e c6 rjmp .+3324 ; 0x293ea // Spare one division by a following gymnastics: // Instead of jerk *= safe_speed / block->nominal_speed, // multiply max_jerk[axis] by the divisor. jerk *= safe_speed; 286ee: 29 a5 ldd r18, Y+41 ; 0x29 286f0: 3d a5 ldd r19, Y+45 ; 0x2d 286f2: 49 ad ldd r20, Y+57 ; 0x39 286f4: 59 a9 ldd r21, Y+49 ; 0x31 286f6: c5 01 movw r24, r10 286f8: b4 01 movw r22, r8 286fa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 286fe: 4b 01 movw r8, r22 28700: 5c 01 movw r10, r24 float mjerk = cs.max_jerk[axis] * block->nominal_speed; 28702: a7 01 movw r20, r14 28704: 96 01 movw r18, r12 28706: 27 96 adiw r28, 0x07 ; 7 28708: 6f ad ldd r22, Y+63 ; 0x3f 2870a: 27 97 sbiw r28, 0x07 ; 7 2870c: 2b 96 adiw r28, 0x0b ; 11 2870e: 7f ad ldd r23, Y+63 ; 0x3f 28710: 2b 97 sbiw r28, 0x0b ; 11 28712: 2f 96 adiw r28, 0x0f ; 15 28714: 8f ad ldd r24, Y+63 ; 0x3f 28716: 2f 97 sbiw r28, 0x0f ; 15 28718: 63 96 adiw r28, 0x13 ; 19 2871a: 9f ad ldd r25, Y+63 ; 0x3f 2871c: 63 97 sbiw r28, 0x13 ; 19 2871e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28722: 6b 01 movw r12, r22 28724: 7c 01 movw r14, r24 if (jerk > mjerk) { 28726: ac 01 movw r20, r24 28728: 9b 01 movw r18, r22 2872a: c5 01 movw r24, r10 2872c: b4 01 movw r22, r8 2872e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28732: 18 16 cp r1, r24 28734: 94 f4 brge .+36 ; 0x2875a safe_speed *= mjerk / jerk; 28736: a5 01 movw r20, r10 28738: 94 01 movw r18, r8 2873a: c7 01 movw r24, r14 2873c: b6 01 movw r22, r12 2873e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28742: 9b 01 movw r18, r22 28744: ac 01 movw r20, r24 28746: 69 a5 ldd r22, Y+41 ; 0x29 28748: 7d a5 ldd r23, Y+45 ; 0x2d 2874a: 89 ad ldd r24, Y+57 ; 0x39 2874c: 99 a9 ldd r25, Y+49 ; 0x31 2874e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28752: 69 a7 std Y+41, r22 ; 0x29 28754: 7d a7 std Y+45, r23 ; 0x2d 28756: 89 af std Y+57, r24 ; 0x39 28758: 99 ab std Y+49, r25 ; 0x31 // Start with a safe speed. // Safe speed is the speed, from which the machine may halt to stop immediately. float safe_speed = block->nominal_speed; bool limited = false; for (uint8_t axis = 0; axis < 4; ++ axis) { 2875a: 46 14 cp r4, r6 2875c: 57 04 cpc r5, r7 2875e: 09 f0 breq .+2 ; 0x28762 28760: ac cf rjmp .-168 ; 0x286ba } } } // Reset the block flag. block->flag = 0; 28762: 8e e6 ldi r24, 0x6E ; 110 28764: 82 9d mul r24, r2 28766: f0 01 movw r30, r0 28768: 83 9d mul r24, r3 2876a: f0 0d add r31, r0 2876c: 11 24 eor r1, r1 2876e: e2 5a subi r30, 0xA2 ; 162 28770: f9 4f sbci r31, 0xF9 ; 249 28772: 15 aa std Z+53, r1 ; 0x35 if (plan_reset_next_e_sched) 28774: 80 91 20 04 lds r24, 0x0420 ; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444> 28778: 88 23 and r24, r24 2877a: 21 f0 breq .+8 ; 0x28784 { // finally propagate a pending reset block->flag |= BLOCK_FLAG_E_RESET; 2877c: 80 e1 ldi r24, 0x10 ; 16 2877e: 85 ab std Z+53, r24 ; 0x35 plan_reset_next_e_sched = false; 28780: 10 92 20 04 sts 0x0420, r1 ; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444> float vmax_junction; //FIXME Vojtech: Why only if at least two lines are planned in the queue? // Is it because we don't want to tinker with the first buffer line, which // is likely to be executed by the stepper interrupt routine soon? if (moves_queued > 1 && previous_nominal_speed > 0.0001f) { 28784: 3d ad ldd r19, Y+61 ; 0x3d 28786: 32 30 cpi r19, 0x02 ; 2 28788: 08 f4 brcc .+2 ; 0x2878c 2878a: 8f c6 rjmp .+3358 ; 0x294aa 2878c: 40 91 22 04 lds r20, 0x0422 ; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445> 28790: 6b 96 adiw r28, 0x1b ; 27 28792: 4f af std Y+63, r20 ; 0x3f 28794: 6b 97 sbiw r28, 0x1b ; 27 28796: 50 91 23 04 lds r21, 0x0423 ; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1> 2879a: 6f 96 adiw r28, 0x1f ; 31 2879c: 5f af std Y+63, r21 ; 0x3f 2879e: 6f 97 sbiw r28, 0x1f ; 31 287a0: 00 91 24 04 lds r16, 0x0424 ; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2> 287a4: 10 91 25 04 lds r17, 0x0425 ; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3> 287a8: 27 e1 ldi r18, 0x17 ; 23 287aa: 37 eb ldi r19, 0xB7 ; 183 287ac: 41 ed ldi r20, 0xD1 ; 209 287ae: 58 e3 ldi r21, 0x38 ; 56 287b0: 6b 96 adiw r28, 0x1b ; 27 287b2: 6f ad ldd r22, Y+63 ; 0x3f 287b4: 6b 97 sbiw r28, 0x1b ; 27 287b6: 6f 96 adiw r28, 0x1f ; 31 287b8: 7f ad ldd r23, Y+63 ; 0x3f 287ba: 6f 97 sbiw r28, 0x1f ; 31 287bc: c8 01 movw r24, r16 287be: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 287c2: 18 16 cp r1, r24 287c4: 0c f0 brlt .+2 ; 0x287c8 287c6: 71 c6 rjmp .+3298 ; 0x294aa // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. bool prev_speed_larger = previous_nominal_speed > block->nominal_speed; float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed); 287c8: 6b 96 adiw r28, 0x1b ; 27 287ca: 2f ad ldd r18, Y+63 ; 0x3f 287cc: 6b 97 sbiw r28, 0x1b ; 27 287ce: 6f 96 adiw r28, 0x1f ; 31 287d0: 3f ad ldd r19, Y+63 ; 0x3f 287d2: 6f 97 sbiw r28, 0x1f ; 31 287d4: a8 01 movw r20, r16 287d6: 27 96 adiw r28, 0x07 ; 7 287d8: 6f ad ldd r22, Y+63 ; 0x3f 287da: 27 97 sbiw r28, 0x07 ; 7 287dc: 2b 96 adiw r28, 0x0b ; 11 287de: 7f ad ldd r23, Y+63 ; 0x3f 287e0: 2b 97 sbiw r28, 0x0b ; 11 287e2: 2f 96 adiw r28, 0x0f ; 15 287e4: 8f ad ldd r24, Y+63 ; 0x3f 287e6: 2f 97 sbiw r28, 0x0f ; 15 287e8: 63 96 adiw r28, 0x13 ; 19 287ea: 9f ad ldd r25, Y+63 ; 0x3f 287ec: 63 97 sbiw r28, 0x13 ; 19 287ee: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 287f2: 87 ff sbrs r24, 7 287f4: 01 c6 rjmp .+3074 ; 0x293f8 287f6: 6b 96 adiw r28, 0x1b ; 27 287f8: 2f ad ldd r18, Y+63 ; 0x3f 287fa: 6b 97 sbiw r28, 0x1b ; 27 287fc: 6f 96 adiw r28, 0x1f ; 31 287fe: 3f ad ldd r19, Y+63 ; 0x3f 28800: 6f 97 sbiw r28, 0x1f ; 31 28802: a8 01 movw r20, r16 28804: 27 96 adiw r28, 0x07 ; 7 28806: 6f ad ldd r22, Y+63 ; 0x3f 28808: 27 97 sbiw r28, 0x07 ; 7 2880a: 2b 96 adiw r28, 0x0b ; 11 2880c: 7f ad ldd r23, Y+63 ; 0x3f 2880e: 2b 97 sbiw r28, 0x0b ; 11 28810: 2f 96 adiw r28, 0x0f ; 15 28812: 8f ad ldd r24, Y+63 ; 0x3f 28814: 2f 97 sbiw r28, 0x0f ; 15 28816: 63 96 adiw r28, 0x13 ; 19 28818: 9f ad ldd r25, Y+63 ; 0x3f 2881a: 63 97 sbiw r28, 0x13 ; 19 2881c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28820: eb 96 adiw r28, 0x3b ; 59 28822: 6c af std Y+60, r22 ; 0x3c 28824: 7d af std Y+61, r23 ; 0x3d 28826: 8e af std Y+62, r24 ; 0x3e 28828: 9f af std Y+63, r25 ; 0x3f 2882a: eb 97 sbiw r28, 0x3b ; 59 // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed; 2882c: 27 96 adiw r28, 0x07 ; 7 2882e: 8f ad ldd r24, Y+63 ; 0x3f 28830: 27 97 sbiw r28, 0x07 ; 7 28832: 8d af std Y+61, r24 ; 0x3d 28834: 2b 96 adiw r28, 0x0b ; 11 28836: 9f ad ldd r25, Y+63 ; 0x3f 28838: 2b 97 sbiw r28, 0x0b ; 11 2883a: 9d ab std Y+53, r25 ; 0x35 2883c: 2f 96 adiw r28, 0x0f ; 15 2883e: af ad ldd r26, Y+63 ; 0x3f 28840: 2f 97 sbiw r28, 0x0f ; 15 28842: ae af std Y+62, r26 ; 0x3e 28844: 63 96 adiw r28, 0x13 ; 19 28846: bf ad ldd r27, Y+63 ; 0x3f 28848: 63 97 sbiw r28, 0x13 ; 19 2884a: 23 96 adiw r28, 0x03 ; 3 2884c: bf af std Y+63, r27 ; 0x3f 2884e: 23 97 sbiw r28, 0x03 ; 3 28850: 26 e2 ldi r18, 0x26 ; 38 28852: 34 e0 ldi r19, 0x04 ; 4 28854: e7 96 adiw r28, 0x37 ; 55 28856: 3f af std Y+63, r19 ; 0x3f 28858: 2e af std Y+62, r18 ; 0x3e 2885a: e7 97 sbiw r28, 0x37 ; 55 // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. float v_factor = 1.f; 2885c: 41 2c mov r4, r1 2885e: 51 2c mov r5, r1 28860: 30 e8 ldi r19, 0x80 ; 128 28862: 63 2e mov r6, r19 28864: 3f e3 ldi r19, 0x3F ; 63 28866: 73 2e mov r7, r19 limited = false; // Now limit the jerk in all axes. for (uint8_t axis = 0; axis < 4; ++ axis) { // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. float v_exit = previous_speed[axis]; 28868: e7 96 adiw r28, 0x37 ; 55 2886a: ae ad ldd r26, Y+62 ; 0x3e 2886c: bf ad ldd r27, Y+63 ; 0x3f 2886e: e7 97 sbiw r28, 0x37 ; 55 28870: 8d 90 ld r8, X+ 28872: 9d 90 ld r9, X+ 28874: ad 90 ld r10, X+ 28876: bd 90 ld r11, X+ 28878: e7 96 adiw r28, 0x37 ; 55 2887a: bf af std Y+63, r27 ; 0x3f 2887c: ae af std Y+62, r26 ; 0x3e 2887e: e7 97 sbiw r28, 0x37 ; 55 float v_entry = current_speed [axis]; 28880: 6e 96 adiw r28, 0x1e ; 30 28882: ee ad ldd r30, Y+62 ; 0x3e 28884: ff ad ldd r31, Y+63 ; 0x3f 28886: 6e 97 sbiw r28, 0x1e ; 30 28888: c1 90 ld r12, Z+ 2888a: d1 90 ld r13, Z+ 2888c: e1 90 ld r14, Z+ 2888e: f1 90 ld r15, Z+ 28890: 6e 96 adiw r28, 0x1e ; 30 28892: ff af std Y+63, r31 ; 0x3f 28894: ee af std Y+62, r30 ; 0x3e 28896: 6e 97 sbiw r28, 0x1e ; 30 if (prev_speed_larger) 28898: 6b 96 adiw r28, 0x1b ; 27 2889a: 2f ad ldd r18, Y+63 ; 0x3f 2889c: 6b 97 sbiw r28, 0x1b ; 27 2889e: 6f 96 adiw r28, 0x1f ; 31 288a0: 3f ad ldd r19, Y+63 ; 0x3f 288a2: 6f 97 sbiw r28, 0x1f ; 31 288a4: a8 01 movw r20, r16 288a6: 27 96 adiw r28, 0x07 ; 7 288a8: 6f ad ldd r22, Y+63 ; 0x3f 288aa: 27 97 sbiw r28, 0x07 ; 7 288ac: 2b 96 adiw r28, 0x0b ; 11 288ae: 7f ad ldd r23, Y+63 ; 0x3f 288b0: 2b 97 sbiw r28, 0x0b ; 11 288b2: 2f 96 adiw r28, 0x0f ; 15 288b4: 8f ad ldd r24, Y+63 ; 0x3f 288b6: 2f 97 sbiw r28, 0x0f ; 15 288b8: 63 96 adiw r28, 0x13 ; 19 288ba: 9f ad ldd r25, Y+63 ; 0x3f 288bc: 63 97 sbiw r28, 0x13 ; 19 288be: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 288c2: 87 ff sbrs r24, 7 288c4: 0c c0 rjmp .+24 ; 0x288de v_exit *= smaller_speed_factor; 288c6: eb 96 adiw r28, 0x3b ; 59 288c8: 2c ad ldd r18, Y+60 ; 0x3c 288ca: 3d ad ldd r19, Y+61 ; 0x3d 288cc: 4e ad ldd r20, Y+62 ; 0x3e 288ce: 5f ad ldd r21, Y+63 ; 0x3f 288d0: eb 97 sbiw r28, 0x3b ; 59 288d2: c5 01 movw r24, r10 288d4: b4 01 movw r22, r8 288d6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 288da: 4b 01 movw r8, r22 288dc: 5c 01 movw r10, r24 if (limited) { 288de: a1 96 adiw r28, 0x21 ; 33 288e0: ff ad ldd r31, Y+63 ; 0x3f 288e2: a1 97 sbiw r28, 0x21 ; 33 288e4: ff 23 and r31, r31 288e6: 81 f0 breq .+32 ; 0x28908 v_exit *= v_factor; 288e8: a3 01 movw r20, r6 288ea: 92 01 movw r18, r4 288ec: c5 01 movw r24, r10 288ee: b4 01 movw r22, r8 288f0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 288f4: 4b 01 movw r8, r22 288f6: 5c 01 movw r10, r24 v_entry *= v_factor; 288f8: a3 01 movw r20, r6 288fa: 92 01 movw r18, r4 288fc: c7 01 movw r24, r14 288fe: b6 01 movw r22, r12 28900: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28904: 6b 01 movw r12, r22 28906: 7c 01 movw r14, r24 } // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. float jerk = (v_exit > v_entry) ? 28908: a7 01 movw r20, r14 2890a: 96 01 movw r18, r12 2890c: c5 01 movw r24, r10 2890e: b4 01 movw r22, r8 28910: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> ((v_entry > 0.f || v_exit < 0.f) ? 28914: 20 e0 ldi r18, 0x00 ; 0 28916: 30 e0 ldi r19, 0x00 ; 0 28918: a9 01 movw r20, r18 v_exit *= v_factor; v_entry *= v_factor; } // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. float jerk = (v_exit > v_entry) ? 2891a: 18 16 cp r1, r24 2891c: 0c f0 brlt .+2 ; 0x28920 2891e: a3 c5 rjmp .+2886 ; 0x29466 ((v_entry > 0.f || v_exit < 0.f) ? 28920: c7 01 movw r24, r14 28922: b6 01 movw r22, r12 28924: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28928: 18 16 cp r1, r24 2892a: 4c f0 brlt .+18 ; 0x2893e 2892c: 20 e0 ldi r18, 0x00 ; 0 2892e: 30 e0 ldi r19, 0x00 ; 0 28930: a9 01 movw r20, r18 28932: c5 01 movw r24, r10 28934: b4 01 movw r22, r8 28936: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2893a: 87 ff sbrs r24, 7 2893c: 85 c5 rjmp .+2826 ; 0x29448 2893e: a7 01 movw r20, r14 28940: 96 01 movw r18, r12 28942: c5 01 movw r24, r10 28944: b4 01 movw r22, r8 // coasting (v_exit - v_entry) : // axis reversal max(v_exit, - v_entry)) : // v_exit <= v_entry ((v_entry < 0.f || v_exit > 0.f) ? 28946: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2894a: 6b 01 movw r12, r22 2894c: 7c 01 movw r14, r24 // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); if (jerk > cs.max_jerk[axis]) { 2894e: ed 96 adiw r28, 0x3d ; 61 28950: ae ad ldd r26, Y+62 ; 0x3e 28952: bf ad ldd r27, Y+63 ; 0x3f 28954: ed 97 sbiw r28, 0x3d ; 61 28956: 8d 90 ld r8, X+ 28958: 9d 90 ld r9, X+ 2895a: ad 90 ld r10, X+ 2895c: bd 90 ld r11, X+ 2895e: ed 96 adiw r28, 0x3d ; 61 28960: bf af std Y+63, r27 ; 0x3f 28962: ae af std Y+62, r26 ; 0x3e 28964: ed 97 sbiw r28, 0x3d ; 61 28966: a5 01 movw r20, r10 28968: 94 01 movw r18, r8 2896a: c7 01 movw r24, r14 2896c: b6 01 movw r22, r12 2896e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28972: 18 16 cp r1, r24 28974: 94 f4 brge .+36 ; 0x2899a v_factor *= cs.max_jerk[axis] / jerk; 28976: a7 01 movw r20, r14 28978: 96 01 movw r18, r12 2897a: c5 01 movw r24, r10 2897c: b4 01 movw r22, r8 2897e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28982: 9b 01 movw r18, r22 28984: ac 01 movw r20, r24 28986: c3 01 movw r24, r6 28988: b2 01 movw r22, r4 2898a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2898e: 2b 01 movw r4, r22 28990: 3c 01 movw r6, r24 limited = true; 28992: b1 e0 ldi r27, 0x01 ; 1 28994: a1 96 adiw r28, 0x21 ; 33 28996: bf af std Y+63, r27 ; 0x3f 28998: a1 97 sbiw r28, 0x21 ; 33 vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed; // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. float v_factor = 1.f; limited = false; // Now limit the jerk in all axes. for (uint8_t axis = 0; axis < 4; ++ axis) { 2899a: e6 e3 ldi r30, 0x36 ; 54 2899c: f4 e0 ldi r31, 0x04 ; 4 2899e: e7 96 adiw r28, 0x37 ; 55 289a0: 2e ad ldd r18, Y+62 ; 0x3e 289a2: 3f ad ldd r19, Y+63 ; 0x3f 289a4: e7 97 sbiw r28, 0x37 ; 55 289a6: e2 17 cp r30, r18 289a8: f3 07 cpc r31, r19 289aa: 09 f0 breq .+2 ; 0x289ae 289ac: 5d cf rjmp .-326 ; 0x28868 if (jerk > cs.max_jerk[axis]) { v_factor *= cs.max_jerk[axis] / jerk; limited = true; } } if (limited) 289ae: a1 96 adiw r28, 0x21 ; 33 289b0: 3f ad ldd r19, Y+63 ; 0x3f 289b2: a1 97 sbiw r28, 0x21 ; 33 289b4: 33 23 and r19, r19 289b6: 81 f0 breq .+32 ; 0x289d8 vmax_junction *= v_factor; 289b8: a3 01 movw r20, r6 289ba: 92 01 movw r18, r4 289bc: 6d ad ldd r22, Y+61 ; 0x3d 289be: 7d a9 ldd r23, Y+53 ; 0x35 289c0: 8e ad ldd r24, Y+62 ; 0x3e 289c2: 23 96 adiw r28, 0x03 ; 3 289c4: 9f ad ldd r25, Y+63 ; 0x3f 289c6: 23 97 sbiw r28, 0x03 ; 3 289c8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 289cc: 6d af std Y+61, r22 ; 0x3d 289ce: 7d ab std Y+53, r23 ; 0x35 289d0: 8e af std Y+62, r24 ; 0x3e 289d2: 23 96 adiw r28, 0x03 ; 3 289d4: 9f af std Y+63, r25 ; 0x3f 289d6: 23 97 sbiw r28, 0x03 ; 3 // Now the transition velocity is known, which maximizes the shared exit / entry velocity while // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. float vmax_junction_threshold = vmax_junction * 0.99f; 289d8: 24 ea ldi r18, 0xA4 ; 164 289da: 30 e7 ldi r19, 0x70 ; 112 289dc: 4d e7 ldi r20, 0x7D ; 125 289de: 5f e3 ldi r21, 0x3F ; 63 289e0: 6d ad ldd r22, Y+61 ; 0x3d 289e2: 7d a9 ldd r23, Y+53 ; 0x35 289e4: 8e ad ldd r24, Y+62 ; 0x3e 289e6: 23 96 adiw r28, 0x03 ; 3 289e8: 9f ad ldd r25, Y+63 ; 0x3f 289ea: 23 97 sbiw r28, 0x03 ; 3 289ec: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 289f0: 6b 01 movw r12, r22 289f2: 7c 01 movw r14, r24 if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) { 289f4: ac 01 movw r20, r24 289f6: 9b 01 movw r18, r22 289f8: 60 91 a3 04 lds r22, 0x04A3 ; 0x8004a3 289fc: 70 91 a4 04 lds r23, 0x04A4 ; 0x8004a4 28a00: 80 91 a5 04 lds r24, 0x04A5 ; 0x8004a5 28a04: 90 91 a6 04 lds r25, 0x04A6 ; 0x8004a6 28a08: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28a0c: 18 16 cp r1, r24 28a0e: fc f4 brge .+62 ; 0x28a4e 28a10: 29 a5 ldd r18, Y+41 ; 0x29 28a12: 3d a5 ldd r19, Y+45 ; 0x2d 28a14: 49 ad ldd r20, Y+57 ; 0x39 28a16: 59 a9 ldd r21, Y+49 ; 0x31 28a18: c7 01 movw r24, r14 28a1a: b6 01 movw r22, r12 28a1c: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 28a20: 87 ff sbrs r24, 7 28a22: 15 c0 rjmp .+42 ; 0x28a4e // Not coasting. The machine will stop and start the movements anyway, // better to start the segment from start. block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; 28a24: 8e e6 ldi r24, 0x6E ; 110 28a26: 82 9d mul r24, r2 28a28: f0 01 movw r30, r0 28a2a: 83 9d mul r24, r3 28a2c: f0 0d add r31, r0 28a2e: 11 24 eor r1, r1 28a30: e2 5a subi r30, 0xA2 ; 162 28a32: f9 4f sbci r31, 0xF9 ; 249 28a34: 85 a9 ldd r24, Z+53 ; 0x35 28a36: 84 60 ori r24, 0x04 ; 4 28a38: 85 ab std Z+53, r24 ; 0x35 28a3a: 49 a5 ldd r20, Y+41 ; 0x29 28a3c: 4d af std Y+61, r20 ; 0x3d 28a3e: 5d a5 ldd r21, Y+45 ; 0x2d 28a40: 5d ab std Y+53, r21 ; 0x35 28a42: 89 ad ldd r24, Y+57 ; 0x39 28a44: 8e af std Y+62, r24 ; 0x3e 28a46: 99 a9 ldd r25, Y+49 ; 0x31 28a48: 23 96 adiw r28, 0x03 ; 3 28a4a: 9f af std Y+63, r25 ; 0x3f 28a4c: 23 97 sbiw r28, 0x03 ; 3 block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; vmax_junction = safe_speed; } // Max entry speed of this block equals the max exit speed of the previous block. block->max_entry_speed = vmax_junction; 28a4e: 8e e6 ldi r24, 0x6E ; 110 28a50: 82 9d mul r24, r2 28a52: 80 01 movw r16, r0 28a54: 83 9d mul r24, r3 28a56: 10 0d add r17, r0 28a58: 11 24 eor r1, r1 28a5a: 02 5a subi r16, 0xA2 ; 162 28a5c: 19 4f sbci r17, 0xF9 ; 249 28a5e: 8d ad ldd r24, Y+61 ; 0x3d 28a60: 9d a9 ldd r25, Y+53 ; 0x35 28a62: ae ad ldd r26, Y+62 ; 0x3e 28a64: 23 96 adiw r28, 0x03 ; 3 28a66: bf ad ldd r27, Y+63 ; 0x3f 28a68: 23 97 sbiw r28, 0x03 ; 3 28a6a: f8 01 movw r30, r16 28a6c: 81 a7 std Z+41, r24 ; 0x29 28a6e: 92 a7 std Z+42, r25 ; 0x2a 28a70: a3 a7 std Z+43, r26 ; 0x2b 28a72: b4 a7 std Z+44, r27 ; 0x2c // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 28a74: 29 a5 ldd r18, Y+41 ; 0x29 28a76: 3d a5 ldd r19, Y+45 ; 0x2d 28a78: 49 ad ldd r20, Y+57 ; 0x39 28a7a: 59 a9 ldd r21, Y+49 ; 0x31 28a7c: 69 a5 ldd r22, Y+41 ; 0x29 28a7e: 7d a5 ldd r23, Y+45 ; 0x2d 28a80: 89 ad ldd r24, Y+57 ; 0x39 28a82: 99 a9 ldd r25, Y+49 ; 0x31 28a84: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28a88: 6b 01 movw r12, r22 28a8a: 7c 01 movw r14, r24 // Max entry speed of this block equals the max exit speed of the previous block. block->max_entry_speed = vmax_junction; // Initialize block entry speed. Compute based on deceleration to safe_speed. double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters); 28a8c: e1 96 adiw r28, 0x31 ; 49 28a8e: 6c ad ldd r22, Y+60 ; 0x3c 28a90: 7d ad ldd r23, Y+61 ; 0x3d 28a92: 8e ad ldd r24, Y+62 ; 0x3e 28a94: 9f ad ldd r25, Y+63 ; 0x3f 28a96: e1 97 sbiw r28, 0x31 ; 49 28a98: 90 58 subi r25, 0x80 ; 128 // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 28a9a: 9b 01 movw r18, r22 28a9c: ac 01 movw r20, r24 28a9e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 28aa2: d8 01 movw r26, r16 28aa4: 9d 96 adiw r26, 0x2d ; 45 28aa6: 2d 91 ld r18, X+ 28aa8: 3d 91 ld r19, X+ 28aaa: 4d 91 ld r20, X+ 28aac: 5c 91 ld r21, X 28aae: d0 97 sbiw r26, 0x30 ; 48 28ab0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28ab4: 9b 01 movw r18, r22 28ab6: ac 01 movw r20, r24 28ab8: c7 01 movw r24, r14 28aba: b6 01 movw r22, r12 28abc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 28ac0: 0f 94 d6 a8 call 0x351ac ; 0x351ac 28ac4: d6 2e mov r13, r22 28ac6: e7 2e mov r14, r23 28ac8: 8c 01 movw r16, r24 // Max entry speed of this block equals the max exit speed of the previous block. block->max_entry_speed = vmax_junction; // Initialize block entry speed. Compute based on deceleration to safe_speed. double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters); block->entry_speed = min(vmax_junction, v_allowable); 28aca: 2d ad ldd r18, Y+61 ; 0x3d 28acc: 3d a9 ldd r19, Y+53 ; 0x35 28ace: 4e ad ldd r20, Y+62 ; 0x3e 28ad0: 23 96 adiw r28, 0x03 ; 3 28ad2: 5f ad ldd r21, Y+63 ; 0x3f 28ad4: 23 97 sbiw r28, 0x03 ; 3 28ad6: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28ada: 18 16 cp r1, r24 28adc: 34 f0 brlt .+12 ; 0x28aea 28ade: dd ae std Y+61, r13 ; 0x3d 28ae0: ed aa std Y+53, r14 ; 0x35 28ae2: 0e af std Y+62, r16 ; 0x3e 28ae4: 23 96 adiw r28, 0x03 ; 3 28ae6: 1f af std Y+63, r17 ; 0x3f 28ae8: 23 97 sbiw r28, 0x03 ; 3 28aea: 8e e6 ldi r24, 0x6E ; 110 28aec: 82 9d mul r24, r2 28aee: f0 01 movw r30, r0 28af0: 83 9d mul r24, r3 28af2: f0 0d add r31, r0 28af4: 11 24 eor r1, r1 28af6: e2 5a subi r30, 0xA2 ; 162 28af8: f9 4f sbci r31, 0xF9 ; 249 28afa: 8d ad ldd r24, Y+61 ; 0x3d 28afc: 9d a9 ldd r25, Y+53 ; 0x35 28afe: ae ad ldd r26, Y+62 ; 0x3e 28b00: 23 96 adiw r28, 0x03 ; 3 28b02: bf ad ldd r27, Y+63 ; 0x3f 28b04: 23 97 sbiw r28, 0x03 ; 3 28b06: 85 a3 std Z+37, r24 ; 0x25 28b08: 96 a3 std Z+38, r25 ; 0x26 28b0a: a7 a3 std Z+39, r26 ; 0x27 28b0c: b0 a7 std Z+40, r27 ; 0x28 // junction speeds in deceleration and acceleration, respectively. This is due to how the current // block nominal speed limits both the current and next maximum junction speeds. Hence, in both // the reverse and forward planners, the corresponding block junction speed will always be at the // the maximum junction speed and may always be ignored for any speed reduction checks. // Always calculate trapezoid for new block block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE; 28b0e: f5 a8 ldd r15, Z+53 ; 0x35 28b10: 2d 2d mov r18, r13 28b12: 3e 2d mov r19, r14 28b14: a8 01 movw r20, r16 28b16: 27 96 adiw r28, 0x07 ; 7 28b18: 6f ad ldd r22, Y+63 ; 0x3f 28b1a: 27 97 sbiw r28, 0x07 ; 7 28b1c: 2b 96 adiw r28, 0x0b ; 11 28b1e: 7f ad ldd r23, Y+63 ; 0x3f 28b20: 2b 97 sbiw r28, 0x0b ; 11 28b22: 2f 96 adiw r28, 0x0f ; 15 28b24: 8f ad ldd r24, Y+63 ; 0x3f 28b26: 2f 97 sbiw r28, 0x0f ; 15 28b28: 63 96 adiw r28, 0x13 ; 19 28b2a: 9f ad ldd r25, Y+63 ; 0x3f 28b2c: 63 97 sbiw r28, 0x13 ; 19 28b2e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 28b32: 18 16 cp r1, r24 28b34: 0c f4 brge .+2 ; 0x28b38 28b36: cf c4 rjmp .+2462 ; 0x294d6 28b38: 83 e0 ldi r24, 0x03 ; 3 28b3a: 9e e6 ldi r25, 0x6E ; 110 28b3c: 92 9d mul r25, r2 28b3e: 80 01 movw r16, r0 28b40: 93 9d mul r25, r3 28b42: 10 0d add r17, r0 28b44: 11 24 eor r1, r1 28b46: 02 5a subi r16, 0xA2 ; 162 28b48: 19 4f sbci r17, 0xF9 ; 249 28b4a: f8 2a or r15, r24 28b4c: f8 01 movw r30, r16 28b4e: f5 aa std Z+53, r15 ; 0x35 // Update previous path unit_vector and nominal speed memcpy(previous_speed, current_speed, sizeof(previous_speed)); // previous_speed[] = current_speed[] 28b50: 80 e1 ldi r24, 0x10 ; 16 28b52: fe 01 movw r30, r28 28b54: 71 96 adiw r30, 0x11 ; 17 28b56: a6 e2 ldi r26, 0x26 ; 38 28b58: b4 e0 ldi r27, 0x04 ; 4 28b5a: 01 90 ld r0, Z+ 28b5c: 0d 92 st X+, r0 28b5e: 8a 95 dec r24 28b60: e1 f7 brne .-8 ; 0x28b5a previous_nominal_speed = block->nominal_speed; 28b62: 27 96 adiw r28, 0x07 ; 7 28b64: 8f ad ldd r24, Y+63 ; 0x3f 28b66: 27 97 sbiw r28, 0x07 ; 7 28b68: 2b 96 adiw r28, 0x0b ; 11 28b6a: 9f ad ldd r25, Y+63 ; 0x3f 28b6c: 2b 97 sbiw r28, 0x0b ; 11 28b6e: 2f 96 adiw r28, 0x0f ; 15 28b70: af ad ldd r26, Y+63 ; 0x3f 28b72: 2f 97 sbiw r28, 0x0f ; 15 28b74: 63 96 adiw r28, 0x13 ; 19 28b76: bf ad ldd r27, Y+63 ; 0x3f 28b78: 63 97 sbiw r28, 0x13 ; 19 28b7a: 80 93 22 04 sts 0x0422, r24 ; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445> 28b7e: 90 93 23 04 sts 0x0423, r25 ; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1> 28b82: a0 93 24 04 sts 0x0424, r26 ; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2> 28b86: b0 93 25 04 sts 0x0425, r27 ; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3> previous_safe_speed = safe_speed; 28b8a: 89 a5 ldd r24, Y+41 ; 0x29 28b8c: 9d a5 ldd r25, Y+45 ; 0x2d 28b8e: a9 ad ldd r26, Y+57 ; 0x39 28b90: b9 a9 ldd r27, Y+49 ; 0x31 28b92: 80 93 a3 04 sts 0x04A3, r24 ; 0x8004a3 28b96: 90 93 a4 04 sts 0x04A4, r25 ; 0x8004a4 28b9a: a0 93 a5 04 sts 0x04A5, r26 ; 0x8004a5 28b9e: b0 93 a6 04 sts 0x04A6, r27 ; 0x8004a6 // Precalculate the division, so when all the trapezoids in the planner queue get recalculated, the division is not repeated. block->speed_factor = block->nominal_rate / block->nominal_speed; 28ba2: d8 01 movw r26, r16 28ba4: d6 96 adiw r26, 0x36 ; 54 28ba6: 6d 91 ld r22, X+ 28ba8: 7d 91 ld r23, X+ 28baa: 8d 91 ld r24, X+ 28bac: 9c 91 ld r25, X 28bae: d9 97 sbiw r26, 0x39 ; 57 28bb0: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 28bb4: 27 96 adiw r28, 0x07 ; 7 28bb6: 2f ad ldd r18, Y+63 ; 0x3f 28bb8: 27 97 sbiw r28, 0x07 ; 7 28bba: 2b 96 adiw r28, 0x0b ; 11 28bbc: 3f ad ldd r19, Y+63 ; 0x3f 28bbe: 2b 97 sbiw r28, 0x0b ; 11 28bc0: 2f 96 adiw r28, 0x0f ; 15 28bc2: 4f ad ldd r20, Y+63 ; 0x3f 28bc4: 2f 97 sbiw r28, 0x0f ; 15 28bc6: 63 96 adiw r28, 0x13 ; 19 28bc8: 5f ad ldd r21, Y+63 ; 0x3f 28bca: 63 97 sbiw r28, 0x13 ; 19 28bcc: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28bd0: 2b 01 movw r4, r22 28bd2: 3c 01 movw r6, r24 28bd4: f8 01 movw r30, r16 28bd6: e8 5b subi r30, 0xB8 ; 184 28bd8: ff 4f sbci r31, 0xFF ; 255 28bda: 40 82 st Z, r4 28bdc: 51 82 std Z+1, r5 ; 0x01 28bde: 62 82 std Z+2, r6 ; 0x02 28be0: 73 82 std Z+3, r7 ; 0x03 #ifdef LIN_ADVANCE if (block->use_advance_lead) { 28be2: 34 96 adiw r30, 0x04 ; 4 28be4: 80 81 ld r24, Z 28be6: 88 23 and r24, r24 28be8: 09 f4 brne .+2 ; 0x28bec 28bea: 89 c0 rjmp .+274 ; 0x28cfe // calculate the compression ratio for the segment (the required advance steps are computed // during trapezoid planning) float adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_mm[E_AXIS]; // (step/(mm/s)) 28bec: 20 91 a7 04 lds r18, 0x04A7 ; 0x8004a7 28bf0: 30 91 a8 04 lds r19, 0x04A8 ; 0x8004a8 28bf4: 40 91 a9 04 lds r20, 0x04A9 ; 0x8004a9 28bf8: 50 91 aa 04 lds r21, 0x04AA ; 0x8004aa 28bfc: 6a 96 adiw r28, 0x1a ; 26 28bfe: 6c ad ldd r22, Y+60 ; 0x3c 28c00: 7d ad ldd r23, Y+61 ; 0x3d 28c02: 8e ad ldd r24, Y+62 ; 0x3e 28c04: 9f ad ldd r25, Y+63 ; 0x3f 28c06: 6a 97 sbiw r28, 0x1a ; 26 28c08: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28c0c: 4b 01 movw r8, r22 28c0e: 5c 01 movw r10, r24 28c10: c0 90 77 0d lds r12, 0x0D77 ; 0x800d77 28c14: d0 90 78 0d lds r13, 0x0D78 ; 0x800d78 28c18: e0 90 79 0d lds r14, 0x0D79 ; 0x800d79 28c1c: f0 90 7a 0d lds r15, 0x0D7A ; 0x800d7a block->adv_comp = adv_comp / block->speed_factor; // step/(step/min) 28c20: 0c 5a subi r16, 0xAC ; 172 28c22: 1f 4f sbci r17, 0xFF ; 255 #ifdef LIN_ADVANCE if (block->use_advance_lead) { // calculate the compression ratio for the segment (the required advance steps are computed // during trapezoid planning) float adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_mm[E_AXIS]; // (step/(mm/s)) 28c24: a7 01 movw r20, r14 28c26: 96 01 movw r18, r12 28c28: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> block->adv_comp = adv_comp / block->speed_factor; // step/(step/min) 28c2c: a3 01 movw r20, r6 28c2e: 92 01 movw r18, r4 28c30: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28c34: f8 01 movw r30, r16 28c36: 60 83 st Z, r22 28c38: 71 83 std Z+1, r23 ; 0x01 28c3a: 82 83 std Z+2, r24 ; 0x02 28c3c: 93 83 std Z+3, r25 ; 0x03 float advance_speed; if (e_D_ratio > 0) 28c3e: 20 e0 ldi r18, 0x00 ; 0 28c40: 30 e0 ldi r19, 0x00 ; 0 28c42: a9 01 movw r20, r18 28c44: 6a 96 adiw r28, 0x1a ; 26 28c46: 6c ad ldd r22, Y+60 ; 0x3c 28c48: 7d ad ldd r23, Y+61 ; 0x3d 28c4a: 8e ad ldd r24, Y+62 ; 0x3e 28c4c: 9f ad ldd r25, Y+63 ; 0x3f 28c4e: 6a 97 sbiw r28, 0x1a ; 26 28c50: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28c54: 18 16 cp r1, r24 28c56: 0c f0 brlt .+2 ; 0x28c5a 28c58: 40 c4 rjmp .+2176 ; 0x294da advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_mm[E_AXIS]); 28c5a: a5 01 movw r20, r10 28c5c: 94 01 movw r18, r8 28c5e: e1 96 adiw r28, 0x31 ; 49 28c60: 6c ad ldd r22, Y+60 ; 0x3c 28c62: 7d ad ldd r23, Y+61 ; 0x3d 28c64: 8e ad ldd r24, Y+62 ; 0x3e 28c66: 9f ad ldd r25, Y+63 ; 0x3f 28c68: e1 97 sbiw r28, 0x31 ; 49 28c6a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28c6e: a7 01 movw r20, r14 28c70: 96 01 movw r18, r12 else advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_mm[E_AXIS]; 28c72: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28c76: 6b 01 movw r12, r22 28c78: 7c 01 movw r14, r24 // to save more space we avoid another copy of calc_timer and go through slow division, but we // still need to replicate the *exact* same step grouping policy (see below) if (advance_speed > MAX_STEP_FREQUENCY) advance_speed = MAX_STEP_FREQUENCY; 28c7a: 20 e0 ldi r18, 0x00 ; 0 28c7c: 30 e4 ldi r19, 0x40 ; 64 28c7e: 4c e1 ldi r20, 0x1C ; 28 28c80: 57 e4 ldi r21, 0x47 ; 71 28c82: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28c86: 18 16 cp r1, r24 28c88: 3c f4 brge .+14 ; 0x28c98 28c8a: c1 2c mov r12, r1 28c8c: 20 e4 ldi r18, 0x40 ; 64 28c8e: d2 2e mov r13, r18 28c90: 2c e1 ldi r18, 0x1C ; 28 28c92: e2 2e mov r14, r18 28c94: 27 e4 ldi r18, 0x47 ; 71 28c96: f2 2e mov r15, r18 float advance_rate = (F_CPU / 8.0) / advance_speed; 28c98: a7 01 movw r20, r14 28c9a: 96 01 movw r18, r12 28c9c: 60 e0 ldi r22, 0x00 ; 0 28c9e: 74 e2 ldi r23, 0x24 ; 36 28ca0: 84 ef ldi r24, 0xF4 ; 244 28ca2: 99 e4 ldi r25, 0x49 ; 73 28ca4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 28ca8: 4b 01 movw r8, r22 28caa: 5c 01 movw r10, r24 if (advance_speed > 20000) { 28cac: 20 e0 ldi r18, 0x00 ; 0 28cae: 30 e4 ldi r19, 0x40 ; 64 28cb0: 4c e9 ldi r20, 0x9C ; 156 28cb2: 56 e4 ldi r21, 0x46 ; 70 28cb4: c7 01 movw r24, r14 28cb6: b6 01 movw r22, r12 28cb8: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 28cbc: 18 16 cp r1, r24 28cbe: 0c f0 brlt .+2 ; 0x28cc2 28cc0: 17 c4 rjmp .+2094 ; 0x294f0 block->advance_rate = advance_rate * 4; 28cc2: 8e e6 ldi r24, 0x6E ; 110 28cc4: 82 9d mul r24, r2 28cc6: 80 01 movw r16, r0 28cc8: 83 9d mul r24, r3 28cca: 10 0d add r17, r0 28ccc: 11 24 eor r1, r1 28cce: 02 5a subi r16, 0xA2 ; 162 28cd0: 19 4f sbci r17, 0xF9 ; 249 28cd2: 78 01 movw r14, r16 28cd4: fd e4 ldi r31, 0x4D ; 77 28cd6: ef 0e add r14, r31 28cd8: f1 1c adc r15, r1 28cda: 20 e0 ldi r18, 0x00 ; 0 28cdc: 30 e0 ldi r19, 0x00 ; 0 28cde: 40 e8 ldi r20, 0x80 ; 128 28ce0: 50 e4 ldi r21, 0x40 ; 64 28ce2: c5 01 movw r24, r10 28ce4: b4 01 movw r22, r8 28ce6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28cea: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 28cee: d7 01 movw r26, r14 28cf0: 6d 93 st X+, r22 28cf2: 7c 93 st X, r23 block->advance_step_loops = 4; 28cf4: f8 01 movw r30, r16 28cf6: ed 5a subi r30, 0xAD ; 173 28cf8: ff 4f sbci r31, 0xFF ; 255 28cfa: 84 e0 ldi r24, 0x04 ; 4 // never overflow the internal accumulator with very low rates if (advance_rate < UINT16_MAX) block->advance_rate = advance_rate; else block->advance_rate = UINT16_MAX; block->advance_step_loops = 1; 28cfc: 80 83 st Z, r24 SERIAL_ECHOLNPGM("LA: More than 2 steps per eISR loop executed."); #endif } #endif calculate_trapezoid_for_block(block, block->entry_speed, safe_speed); 28cfe: 09 a5 ldd r16, Y+41 ; 0x29 28d00: 1d a5 ldd r17, Y+45 ; 0x2d 28d02: 29 ad ldd r18, Y+57 ; 0x39 28d04: 39 a9 ldd r19, Y+49 ; 0x31 28d06: 4d ad ldd r20, Y+61 ; 0x3d 28d08: 5d a9 ldd r21, Y+53 ; 0x35 28d0a: 6e ad ldd r22, Y+62 ; 0x3e 28d0c: 23 96 adiw r28, 0x03 ; 3 28d0e: 7f ad ldd r23, Y+63 ; 0x3f 28d10: 23 97 sbiw r28, 0x03 ; 3 28d12: a3 96 adiw r28, 0x23 ; 35 28d14: 8e ad ldd r24, Y+62 ; 0x3e 28d16: 9f ad ldd r25, Y+63 ; 0x3f 28d18: a3 97 sbiw r28, 0x23 ; 35 28d1a: 82 5a subi r24, 0xA2 ; 162 28d1c: 99 4f sbci r25, 0xF9 ; 249 28d1e: 0f 94 d6 08 call 0x211ac ; 0x211ac if (block->step_event_count.wide <= 32767) 28d22: 8e e6 ldi r24, 0x6E ; 110 28d24: 82 9d mul r24, r2 28d26: f0 01 movw r30, r0 28d28: 83 9d mul r24, r3 28d2a: f0 0d add r31, r0 28d2c: 11 24 eor r1, r1 28d2e: e2 5a subi r30, 0xA2 ; 162 28d30: f9 4f sbci r31, 0xF9 ; 249 28d32: 80 89 ldd r24, Z+16 ; 0x10 28d34: 91 89 ldd r25, Z+17 ; 0x11 28d36: a2 89 ldd r26, Z+18 ; 0x12 28d38: b3 89 ldd r27, Z+19 ; 0x13 28d3a: 81 15 cp r24, r1 28d3c: 90 48 sbci r25, 0x80 ; 128 28d3e: a1 05 cpc r26, r1 28d40: b1 05 cpc r27, r1 28d42: 18 f4 brcc .+6 ; 0x28d4a block->flag |= BLOCK_FLAG_DDA_LOWRES; 28d44: 85 a9 ldd r24, Z+53 ; 0x35 28d46: 88 60 ori r24, 0x08 ; 8 28d48: 85 ab std Z+53, r24 ; 0x35 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 28d4a: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 28d4c: f8 94 cli // Move the buffer head ensuring the current block hasn't been cancelled from an isr context // (this is possible both during crash detection *and* uvlo, thus needing a global cli) if(planner_aborted) return; 28d4e: 90 91 42 0d lds r25, 0x0D42 ; 0x800d42 28d52: 91 11 cpse r25, r1 28d54: 93 c4 rjmp .+2342 ; 0x2967c block_buffer_head = next_buffer_head; 28d56: a0 96 adiw r28, 0x20 ; 32 28d58: 3f ad ldd r19, Y+63 ; 0x3f 28d5a: a0 97 sbiw r28, 0x20 ; 32 28d5c: 30 93 3e 0d sts 0x0D3E, r19 ; 0x800d3e (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 28d60: 8f bf out 0x3f, r24 ; 63 } // Update position memcpy(position, target, sizeof(target)); // position[] = target[] 28d62: c3 58 subi r28, 0x83 ; 131 28d64: df 4f sbci r29, 0xFF ; 255 28d66: 88 81 ld r24, Y 28d68: 99 81 ldd r25, Y+1 ; 0x01 28d6a: aa 81 ldd r26, Y+2 ; 0x02 28d6c: bb 81 ldd r27, Y+3 ; 0x03 28d6e: cd 57 subi r28, 0x7D ; 125 28d70: d0 40 sbci r29, 0x00 ; 0 28d72: 80 93 3c 06 sts 0x063C, r24 ; 0x80063c 28d76: 90 93 3d 06 sts 0x063D, r25 ; 0x80063d 28d7a: a0 93 3e 06 sts 0x063E, r26 ; 0x80063e 28d7e: b0 93 3f 06 sts 0x063F, r27 ; 0x80063f 28d82: cf 57 subi r28, 0x7F ; 127 28d84: df 4f sbci r29, 0xFF ; 255 28d86: 28 81 ld r18, Y 28d88: 39 81 ldd r19, Y+1 ; 0x01 28d8a: 4a 81 ldd r20, Y+2 ; 0x02 28d8c: 5b 81 ldd r21, Y+3 ; 0x03 28d8e: c1 58 subi r28, 0x81 ; 129 28d90: d0 40 sbci r29, 0x00 ; 0 28d92: 20 93 40 06 sts 0x0640, r18 ; 0x800640 28d96: 30 93 41 06 sts 0x0641, r19 ; 0x800641 28d9a: 40 93 42 06 sts 0x0642, r20 ; 0x800642 28d9e: 50 93 43 06 sts 0x0643, r21 ; 0x800643 28da2: e5 96 adiw r28, 0x35 ; 53 28da4: 8c ad ldd r24, Y+60 ; 0x3c 28da6: 9d ad ldd r25, Y+61 ; 0x3d 28da8: ae ad ldd r26, Y+62 ; 0x3e 28daa: bf ad ldd r27, Y+63 ; 0x3f 28dac: e5 97 sbiw r28, 0x35 ; 53 28dae: 80 93 44 06 sts 0x0644, r24 ; 0x800644 28db2: 90 93 45 06 sts 0x0645, r25 ; 0x800645 28db6: a0 93 46 06 sts 0x0646, r26 ; 0x800646 28dba: b0 93 47 06 sts 0x0647, r27 ; 0x800647 28dbe: ad 96 adiw r28, 0x2d ; 45 28dc0: 2c ad ldd r18, Y+60 ; 0x3c 28dc2: 3d ad ldd r19, Y+61 ; 0x3d 28dc4: 4e ad ldd r20, Y+62 ; 0x3e 28dc6: 5f ad ldd r21, Y+63 ; 0x3f 28dc8: ad 97 sbiw r28, 0x2d ; 45 28dca: 20 93 48 06 sts 0x0648, r18 ; 0x800648 28dce: 30 93 49 06 sts 0x0649, r19 ; 0x800649 28dd2: 40 93 4a 06 sts 0x064A, r20 ; 0x80064a 28dd6: 50 93 4b 06 sts 0x064B, r21 ; 0x80064b #ifdef LIN_ADVANCE position_float[X_AXIS] = x; 28dda: 89 a1 ldd r24, Y+33 ; 0x21 28ddc: 9a a1 ldd r25, Y+34 ; 0x22 28dde: ab a1 ldd r26, Y+35 ; 0x23 28de0: bc a1 ldd r27, Y+36 ; 0x24 28de2: 80 93 36 04 sts 0x0436, r24 ; 0x800436 28de6: 90 93 37 04 sts 0x0437, r25 ; 0x800437 28dea: a0 93 38 04 sts 0x0438, r26 ; 0x800438 28dee: b0 93 39 04 sts 0x0439, r27 ; 0x800439 position_float[Y_AXIS] = y; 28df2: 8d a1 ldd r24, Y+37 ; 0x25 28df4: 9e a1 ldd r25, Y+38 ; 0x26 28df6: af a1 ldd r26, Y+39 ; 0x27 28df8: b8 a5 ldd r27, Y+40 ; 0x28 28dfa: 80 93 3a 04 sts 0x043A, r24 ; 0x80043a 28dfe: 90 93 3b 04 sts 0x043B, r25 ; 0x80043b 28e02: a0 93 3c 04 sts 0x043C, r26 ; 0x80043c 28e06: b0 93 3d 04 sts 0x043D, r27 ; 0x80043d position_float[Z_AXIS] = z; 28e0a: a7 96 adiw r28, 0x27 ; 39 28e0c: 8c ad ldd r24, Y+60 ; 0x3c 28e0e: 9d ad ldd r25, Y+61 ; 0x3d 28e10: ae ad ldd r26, Y+62 ; 0x3e 28e12: bf ad ldd r27, Y+63 ; 0x3f 28e14: a7 97 sbiw r28, 0x27 ; 39 28e16: 80 93 3e 04 sts 0x043E, r24 ; 0x80043e 28e1a: 90 93 3f 04 sts 0x043F, r25 ; 0x80043f 28e1e: a0 93 40 04 sts 0x0440, r26 ; 0x800440 28e22: b0 93 41 04 sts 0x0441, r27 ; 0x800441 position_float[E_AXIS] = e; 28e26: a9 96 adiw r28, 0x29 ; 41 28e28: ee ad ldd r30, Y+62 ; 0x3e 28e2a: ff ad ldd r31, Y+63 ; 0x3f 28e2c: a9 97 sbiw r28, 0x29 ; 41 28e2e: 80 81 ld r24, Z 28e30: 91 81 ldd r25, Z+1 ; 0x01 28e32: a2 81 ldd r26, Z+2 ; 0x02 28e34: b3 81 ldd r27, Z+3 ; 0x03 28e36: 80 93 42 04 sts 0x0442, r24 ; 0x800442 28e3a: 90 93 43 04 sts 0x0443, r25 ; 0x800443 28e3e: a0 93 44 04 sts 0x0444, r26 ; 0x800444 28e42: b0 93 45 04 sts 0x0445, r27 ; 0x800445 void planner_recalculate(const float &safe_final_speed) { // Reverse pass // Make a local copy of block_buffer_tail, because the interrupt can alter it // by consuming the blocks, therefore shortening the queue. uint8_t tail = block_buffer_tail; 28e46: f0 90 3f 0d lds r15, 0x0D3F ; 0x800d3f block_t *prev, *current, *next; // SERIAL_ECHOLNPGM("planner_recalculate - 1"); // At least three blocks are in the queue? uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); 28e4a: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 28e4e: 8f 19 sub r24, r15 28e50: 8f 70 andi r24, 0x0F ; 15 if (n_blocks >= 3) { 28e52: 83 30 cpi r24, 0x03 ; 3 28e54: 40 f1 brcs .+80 ; 0x28ea6 // Initialize the last tripple of blocks. block_index = prev_block_index(block_buffer_head); 28e56: 10 91 3e 0d lds r17, 0x0D3E ; 0x800d3e } // Returns the index of the previous block in the ring buffer static inline uint8_t prev_block_index(uint8_t block_index) { if (block_index == 0) 28e5a: 11 11 cpse r17, r1 28e5c: 01 c0 rjmp .+2 ; 0x28e60 block_index = BLOCK_BUFFER_SIZE; 28e5e: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 28e60: 11 50 subi r17, 0x01 ; 1 // At least three blocks are in the queue? uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); if (n_blocks >= 3) { // Initialize the last tripple of blocks. block_index = prev_block_index(block_buffer_head); next = block_buffer + block_index; 28e62: fe e6 ldi r31, 0x6E ; 110 28e64: 1f 9f mul r17, r31 28e66: c0 01 movw r24, r0 28e68: 11 24 eor r1, r1 28e6a: 9c 01 movw r18, r24 28e6c: 22 5a subi r18, 0xA2 ; 162 28e6e: 39 4f sbci r19, 0xF9 ; 249 28e70: 59 01 movw r10, r18 } // Returns the index of the previous block in the ring buffer static inline uint8_t prev_block_index(uint8_t block_index) { if (block_index == 0) 28e72: 11 11 cpse r17, r1 28e74: 01 c0 rjmp .+2 ; 0x28e78 block_index = BLOCK_BUFFER_SIZE; 28e76: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 28e78: 11 50 subi r17, 0x01 ; 1 uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); if (n_blocks >= 3) { // Initialize the last tripple of blocks. block_index = prev_block_index(block_buffer_head); next = block_buffer + block_index; current = block_buffer + (block_index = prev_block_index(block_index)); 28e7a: 3e e6 ldi r19, 0x6E ; 110 28e7c: 13 9f mul r17, r19 28e7e: c0 01 movw r24, r0 28e80: 11 24 eor r1, r1 28e82: ac 01 movw r20, r24 28e84: 42 5a subi r20, 0xA2 ; 162 28e86: 59 4f sbci r21, 0xF9 ; 249 28e88: 6a 01 movw r12, r20 // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); current->flag |= BLOCK_FLAG_RECALCULATE; } next = current; current = block_buffer + (block_index = prev_block_index(block_index)); 28e8a: 9e e6 ldi r25, 0x6E ; 110 28e8c: 69 2e mov r6, r25 current = block_buffer + (block_index = prev_block_index(block_index)); // No need to recalculate the last block, it has already been set by the plan_buffer_line() function. // Vojtech thinks, that one shall not touch the entry speed of the very first block as well, because // 1) it may already be running at the stepper interrupt, // 2) there is no way to limit it when going in the forward direction. while (block_index != tail) { 28e8e: f1 16 cp r15, r17 28e90: 69 f0 breq .+26 ; 0x28eac if (current->flag & BLOCK_FLAG_START_FROM_FULL_HALT) { 28e92: d6 01 movw r26, r12 28e94: d5 96 adiw r26, 0x35 ; 53 28e96: 0c 91 ld r16, X 28e98: 02 ff sbrs r16, 2 28e9a: 7e c3 rjmp .+1788 ; 0x29598 // Don't modify the entry velocity of the starting block. // Also don't modify the trapezoids before this block, they are finalized already, prepared // for the stepper interrupt routine to use them. tail = block_index; // Update the number of blocks to process. n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); 28e9c: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 28ea0: 81 1b sub r24, r17 28ea2: 8f 70 andi r24, 0x0F ; 15 28ea4: f1 2e mov r15, r17 } // SERIAL_ECHOLNPGM("planner_recalculate - 2"); // Forward pass and recalculate the trapezoids. if (n_blocks >= 2) { 28ea6: 82 30 cpi r24, 0x02 ; 2 28ea8: 08 f4 brcc .+2 ; 0x28eac 28eaa: a3 c0 rjmp .+326 ; 0x28ff2 // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail. block_index = tail; prev = block_buffer + block_index; 28eac: 3e e6 ldi r19, 0x6E ; 110 28eae: f3 9e mul r15, r19 28eb0: c0 01 movw r24, r0 28eb2: 11 24 eor r1, r1 28eb4: ac 01 movw r20, r24 28eb6: 42 5a subi r20, 0xA2 ; 162 28eb8: 59 4f sbci r21, 0xF9 ; 249 28eba: 5a 01 movw r10, r20 static bool plan_reset_next_e_sched; // Returns the index of the next block in the ring buffer // NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication. static inline uint8_t next_block_index(uint8_t block_index) { if (++ block_index == BLOCK_BUFFER_SIZE) 28ebc: f3 94 inc r15 28ebe: 50 e1 ldi r21, 0x10 ; 16 28ec0: f5 12 cpse r15, r21 28ec2: 01 c0 rjmp .+2 ; 0x28ec6 block_index = 0; 28ec4: f1 2c mov r15, r1 // Forward pass and recalculate the trapezoids. if (n_blocks >= 2) { // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail. block_index = tail; prev = block_buffer + block_index; current = block_buffer + (block_index = next_block_index(block_index)); 28ec6: ae e6 ldi r26, 0x6E ; 110 28ec8: fa 9e mul r15, r26 28eca: c0 01 movw r24, r0 28ecc: 11 24 eor r1, r1 28ece: fc 01 movw r30, r24 28ed0: e2 5a subi r30, 0xA2 ; 162 28ed2: f9 4f sbci r31, 0xF9 ; 249 28ed4: 6f 01 movw r12, r30 calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; } prev = current; current = block_buffer + (block_index = next_block_index(block_index)); 28ed6: 8e e6 ldi r24, 0x6E ; 110 28ed8: 88 2e mov r8, r24 do { // If the previous block is an acceleration block, but it is not long enough to complete the // full speed change within the block, we need to adjust the entry speed accordingly. Entry // speeds have already been reset, maximized, and reverse planned by reverse planner. // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) { 28eda: d5 01 movw r26, r10 28edc: d5 96 adiw r26, 0x35 ; 53 28ede: 8c 91 ld r24, X 28ee0: d5 97 sbiw r26, 0x35 ; 53 28ee2: 81 fd sbrc r24, 1 28ee4: 5a c0 rjmp .+180 ; 0x28f9a 28ee6: 95 96 adiw r26, 0x25 ; 37 28ee8: 4d 90 ld r4, X+ 28eea: 5d 90 ld r5, X+ 28eec: 6d 90 ld r6, X+ 28eee: 7c 90 ld r7, X 28ef0: 98 97 sbiw r26, 0x28 ; 40 28ef2: f6 01 movw r30, r12 28ef4: 95 a0 ldd r9, Z+37 ; 0x25 28ef6: e6 a0 ldd r14, Z+38 ; 0x26 28ef8: 07 a1 ldd r16, Z+39 ; 0x27 28efa: 10 a5 ldd r17, Z+40 ; 0x28 28efc: 29 2d mov r18, r9 28efe: 3e 2d mov r19, r14 28f00: a8 01 movw r20, r16 28f02: c3 01 movw r24, r6 28f04: b2 01 movw r22, r4 28f06: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 28f0a: 87 ff sbrs r24, 7 28f0c: 46 c0 rjmp .+140 ; 0x28f9a // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 28f0e: a3 01 movw r20, r6 28f10: 92 01 movw r18, r4 28f12: c3 01 movw r24, r6 28f14: b2 01 movw r22, r4 28f16: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28f1a: 2b 01 movw r4, r22 28f1c: 3c 01 movw r6, r24 // If the previous block is an acceleration block, but it is not long enough to complete the // full speed change within the block, we need to adjust the entry speed accordingly. Entry // speeds have already been reset, maximized, and reverse planned by reverse planner. // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) { float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters)); 28f1e: d5 01 movw r26, r10 28f20: d1 96 adiw r26, 0x31 ; 49 28f22: 6d 91 ld r22, X+ 28f24: 7d 91 ld r23, X+ 28f26: 8d 91 ld r24, X+ 28f28: 9c 91 ld r25, X 28f2a: d4 97 sbiw r26, 0x34 ; 52 28f2c: 90 58 subi r25, 0x80 ; 128 // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 28f2e: 9b 01 movw r18, r22 28f30: ac 01 movw r20, r24 28f32: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 28f36: f5 01 movw r30, r10 28f38: 25 a5 ldd r18, Z+45 ; 0x2d 28f3a: 36 a5 ldd r19, Z+46 ; 0x2e 28f3c: 47 a5 ldd r20, Z+47 ; 0x2f 28f3e: 50 a9 ldd r21, Z+48 ; 0x30 28f40: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 28f44: 9b 01 movw r18, r22 28f46: ac 01 movw r20, r24 28f48: c3 01 movw r24, r6 28f4a: b2 01 movw r22, r4 28f4c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 28f50: 0f 94 d6 a8 call 0x351ac ; 0x351ac 28f54: 2b 01 movw r4, r22 28f56: 3c 01 movw r6, r24 // If the previous block is an acceleration block, but it is not long enough to complete the // full speed change within the block, we need to adjust the entry speed accordingly. Entry // speeds have already been reset, maximized, and reverse planned by reverse planner. // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) { float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters)); 28f58: 9b 01 movw r18, r22 28f5a: ac 01 movw r20, r24 28f5c: 69 2d mov r22, r9 28f5e: 7e 2d mov r23, r14 28f60: c8 01 movw r24, r16 28f62: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 28f66: 87 ff sbrs r24, 7 28f68: 03 c0 rjmp .+6 ; 0x28f70 28f6a: 49 2c mov r4, r9 28f6c: 5e 2c mov r5, r14 28f6e: 38 01 movw r6, r16 // Check for junction speed change if (current->entry_speed != entry_speed) { 28f70: 92 01 movw r18, r4 28f72: a3 01 movw r20, r6 28f74: 69 2d mov r22, r9 28f76: 7e 2d mov r23, r14 28f78: c8 01 movw r24, r16 28f7a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 28f7e: 88 23 and r24, r24 28f80: 61 f0 breq .+24 ; 0x28f9a 28f82: d6 01 movw r26, r12 28f84: d5 96 adiw r26, 0x35 ; 53 28f86: 2c 91 ld r18, X current->entry_speed = entry_speed; 28f88: c2 01 movw r24, r4 28f8a: d3 01 movw r26, r6 28f8c: f6 01 movw r30, r12 28f8e: 85 a3 std Z+37, r24 ; 0x25 28f90: 96 a3 std Z+38, r25 ; 0x26 28f92: a7 a3 std Z+39, r26 ; 0x27 28f94: b0 a7 std Z+40, r27 ; 0x28 current->flag |= BLOCK_FLAG_RECALCULATE; 28f96: 21 60 ori r18, 0x01 ; 1 28f98: 25 ab std Z+53, r18 ; 0x35 } } // Recalculate if current block entry or exit junction speed has changed. if ((prev->flag | current->flag) & BLOCK_FLAG_RECALCULATE) { 28f9a: d5 01 movw r26, r10 28f9c: d5 96 adiw r26, 0x35 ; 53 28f9e: 8c 91 ld r24, X 28fa0: d5 97 sbiw r26, 0x35 ; 53 28fa2: f6 01 movw r30, r12 28fa4: 95 a9 ldd r25, Z+53 ; 0x35 28fa6: 89 2b or r24, r25 28fa8: 80 ff sbrs r24, 0 28faa: 14 c0 rjmp .+40 ; 0x28fd4 // NOTE: Entry and exit factors always > 0 by all previous logic operations. calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); 28fac: 05 a1 ldd r16, Z+37 ; 0x25 28fae: 16 a1 ldd r17, Z+38 ; 0x26 28fb0: 27 a1 ldd r18, Z+39 ; 0x27 28fb2: 30 a5 ldd r19, Z+40 ; 0x28 28fb4: 95 96 adiw r26, 0x25 ; 37 28fb6: 4d 91 ld r20, X+ 28fb8: 5d 91 ld r21, X+ 28fba: 6d 91 ld r22, X+ 28fbc: 7c 91 ld r23, X 28fbe: 98 97 sbiw r26, 0x28 ; 40 28fc0: c5 01 movw r24, r10 28fc2: 0f 94 d6 08 call 0x211ac ; 0x211ac // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; 28fc6: d5 01 movw r26, r10 28fc8: d5 96 adiw r26, 0x35 ; 53 28fca: 8c 91 ld r24, X 28fcc: d5 97 sbiw r26, 0x35 ; 53 28fce: 8e 7f andi r24, 0xFE ; 254 28fd0: d5 96 adiw r26, 0x35 ; 53 28fd2: 8c 93 st X, r24 static bool plan_reset_next_e_sched; // Returns the index of the next block in the ring buffer // NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication. static inline uint8_t next_block_index(uint8_t block_index) { if (++ block_index == BLOCK_BUFFER_SIZE) 28fd4: f3 94 inc r15 28fd6: b0 e1 ldi r27, 0x10 ; 16 28fd8: fb 12 cpse r15, r27 28fda: 01 c0 rjmp .+2 ; 0x28fde block_index = 0; 28fdc: f1 2c mov r15, r1 calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; } prev = current; current = block_buffer + (block_index = next_block_index(block_index)); 28fde: f8 9c mul r15, r8 28fe0: c0 01 movw r24, r0 28fe2: 11 24 eor r1, r1 28fe4: 82 5a subi r24, 0xA2 ; 162 28fe6: 99 4f sbci r25, 0xF9 ; 249 } while (block_index != block_buffer_head); 28fe8: 20 91 3e 0d lds r18, 0x0D3E ; 0x800d3e // NOTE: Entry and exit factors always > 0 by all previous logic operations. calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; } prev = current; 28fec: 56 01 movw r10, r12 current = block_buffer + (block_index = next_block_index(block_index)); } while (block_index != block_buffer_head); 28fee: f2 12 cpse r15, r18 28ff0: 43 c3 rjmp .+1670 ; 0x29678 } // SERIAL_ECHOLNPGM("planner_recalculate - 3"); // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated. current = block_buffer + prev_block_index(block_buffer_head); 28ff2: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e } // Returns the index of the previous block in the ring buffer static inline uint8_t prev_block_index(uint8_t block_index) { if (block_index == 0) 28ff6: 81 11 cpse r24, r1 28ff8: 01 c0 rjmp .+2 ; 0x28ffc block_index = BLOCK_BUFFER_SIZE; 28ffa: 80 e1 ldi r24, 0x10 ; 16 -- block_index; 28ffc: 81 50 subi r24, 0x01 ; 1 } // SERIAL_ECHOLNPGM("planner_recalculate - 3"); // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated. current = block_buffer + prev_block_index(block_buffer_head); 28ffe: ee e6 ldi r30, 0x6E ; 110 29000: 8e 9f mul r24, r30 29002: c0 01 movw r24, r0 29004: 11 24 eor r1, r1 29006: 9c 01 movw r18, r24 29008: 22 5a subi r18, 0xA2 ; 162 2900a: 39 4f sbci r19, 0xF9 ; 249 2900c: 79 01 movw r14, r18 calculate_trapezoid_for_block(current, current->entry_speed, safe_final_speed); 2900e: d9 01 movw r26, r18 29010: 95 96 adiw r26, 0x25 ; 37 29012: 4d 91 ld r20, X+ 29014: 5d 91 ld r21, X+ 29016: 6d 91 ld r22, X+ 29018: 7c 91 ld r23, X 2901a: 98 97 sbiw r26, 0x28 ; 40 2901c: 09 a5 ldd r16, Y+41 ; 0x29 2901e: 1d a5 ldd r17, Y+45 ; 0x2d 29020: 29 ad ldd r18, Y+57 ; 0x39 29022: 39 a9 ldd r19, Y+49 ; 0x31 29024: c7 01 movw r24, r14 29026: 0f 94 d6 08 call 0x211ac ; 0x211ac current->flag &= ~BLOCK_FLAG_RECALCULATE; 2902a: f7 01 movw r30, r14 2902c: 85 a9 ldd r24, Z+53 ; 0x35 2902e: 8e 7f andi r24, 0xFE ; 254 29030: 85 ab std Z+53, r24 ; 0x35 // The stepper timer interrupt will run continuously from now on. // If there are no planner blocks to be executed by the stepper routine, // the stepper interrupt ticks at 1kHz to wake up and pick a block // from the planner queue if available. ENABLE_STEPPER_DRIVER_INTERRUPT(); 29032: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 29036: 82 60 ori r24, 0x02 ; 2 29038: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 2903c: 0d 94 9a 3d jmp 0x27b34 ; 0x27b34 // Save original start position of the move if (gcode_start_position) memcpy(block->gcode_start_position, gcode_start_position, sizeof(block_t::gcode_start_position)); else memcpy(block->gcode_start_position, current_position, sizeof(block_t::gcode_start_position)); 29040: aa 54 subi r26, 0x4A ; 74 29042: b9 4f sbci r27, 0xF9 ; 249 29044: 80 e1 ldi r24, 0x10 ; 16 29046: e1 e6 ldi r30, 0x61 ; 97 29048: f2 e1 ldi r31, 0x12 ; 18 2904a: 0d 94 d5 3d jmp 0x27baa ; 0x27baa target[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); #ifdef MESH_BED_LEVELING if (mbl.active){ target[Z_AXIS] = lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]); }else{ target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); 2904e: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 29052: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 29056: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 2905a: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 2905e: a7 96 adiw r28, 0x27 ; 39 29060: 6c ad ldd r22, Y+60 ; 0x3c 29062: 7d ad ldd r23, Y+61 ; 0x3d 29064: 8e ad ldd r24, Y+62 ; 0x3e 29066: 9f ad ldd r25, Y+63 ; 0x3f 29068: a7 97 sbiw r28, 0x27 ; 39 2906a: 0d 94 6b 3e jmp 0x27cd6 ; 0x27cd6 block->fan_speed = fanSpeed; // Compute direction bits for this block block->direction_bits = 0; #ifndef COREXY if (dx < 0) block->direction_bits |= _BV(X_AXIS); 2906e: 81 e0 ldi r24, 0x01 ; 1 29070: 80 8f std Z+24, r24 ; 0x18 29072: 0d 94 11 40 jmp 0x28022 ; 0x28022 { if(feed_rate 2907a: b0 90 a4 0d lds r11, 0x0DA4 ; 0x800da4 2907e: 00 91 a5 0d lds r16, 0x0DA5 ; 0x800da5 29082: 10 91 a6 0d lds r17, 0x0DA6 ; 0x800da6 29086: 53 c8 rjmp .-3930 ; 0x2812e block->millimeters = fabs(delta_mm[E_AXIS]); } else { #ifndef COREXY block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS])); 29088: c5 01 movw r24, r10 2908a: b4 01 movw r22, r8 2908c: 0f 94 a9 9e call 0x33d52 ; 0x33d52 29090: 4b 01 movw r8, r22 29092: 5c 01 movw r10, r24 29094: c7 01 movw r24, r14 29096: b6 01 movw r22, r12 29098: 0f 94 a9 9e call 0x33d52 ; 0x33d52 2909c: 9b 01 movw r18, r22 2909e: ac 01 movw r20, r24 290a0: c5 01 movw r24, r10 290a2: b4 01 movw r22, r8 290a4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 290a8: 6b 01 movw r12, r22 290aa: 7c 01 movw r14, r24 290ac: 22 96 adiw r28, 0x02 ; 2 290ae: 6c ad ldd r22, Y+60 ; 0x3c 290b0: 7d ad ldd r23, Y+61 ; 0x3d 290b2: 8e ad ldd r24, Y+62 ; 0x3e 290b4: 9f ad ldd r25, Y+63 ; 0x3f 290b6: 22 97 sbiw r28, 0x02 ; 2 290b8: 0f 94 a9 9e call 0x33d52 ; 0x33d52 290bc: 9b 01 movw r18, r22 290be: ac 01 movw r20, r24 290c0: c7 01 movw r24, r14 290c2: b6 01 movw r22, r12 290c4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 290c8: 0f 94 d6 a8 call 0x351ac ; 0x351ac 290cc: 2e e6 ldi r18, 0x6E ; 110 290ce: 22 9d mul r18, r2 290d0: f0 01 movw r30, r0 290d2: 23 9d mul r18, r3 290d4: f0 0d add r31, r0 290d6: 11 24 eor r1, r1 290d8: e2 5a subi r30, 0xA2 ; 162 290da: f9 4f sbci r31, 0xF9 ; 249 290dc: 65 a7 std Z+45, r22 ; 0x2d 290de: 76 a7 std Z+46, r23 ; 0x2e 290e0: 87 a7 std Z+47, r24 ; 0x2f 290e2: 90 ab std Z+48, r25 ; 0x30 290e4: c2 c8 rjmp .-3708 ; 0x2826a block->use_advance_lead = false; #endif } else { accel = ceil((block->steps[E_AXIS].wide ? cs.acceleration : cs.travel_acceleration) * steps_per_mm); // convert to: acceleration steps/sec^2 290e6: 2a 96 adiw r28, 0x0a ; 10 290e8: 2c ad ldd r18, Y+60 ; 0x3c 290ea: 3d ad ldd r19, Y+61 ; 0x3d 290ec: 4e ad ldd r20, Y+62 ; 0x3e 290ee: 5f ad ldd r21, Y+63 ; 0x3f 290f0: 2a 97 sbiw r28, 0x0a ; 10 290f2: 23 2b or r18, r19 290f4: 24 2b or r18, r20 290f6: 25 2b or r18, r21 290f8: 09 f4 brne .+2 ; 0x290fc 290fa: 0e c1 rjmp .+540 ; 0x29318 290fc: 60 91 9b 0d lds r22, 0x0D9B ; 0x800d9b 29100: 70 91 9c 0d lds r23, 0x0D9C ; 0x800d9c 29104: 80 91 9d 0d lds r24, 0x0D9D ; 0x800d9d 29108: 90 91 9e 0d lds r25, 0x0D9E ; 0x800d9e 2910c: 29 a5 ldd r18, Y+41 ; 0x29 2910e: 3a a5 ldd r19, Y+42 ; 0x2a 29110: 4b a5 ldd r20, Y+43 ; 0x2b 29112: 5c a5 ldd r21, Y+44 ; 0x2c 29114: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29118: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 2911c: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 29120: 2b 01 movw r4, r22 29122: 3c 01 movw r6, r24 * * extruder_advance_K : There is an advance factor set. * delta_mm[E_AXIS] >= 0 : Extruding or traveling, but _not_ retracting. * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming) */ block->use_advance_lead = extruder_advance_K > 0 29124: 80 91 a7 04 lds r24, 0x04A7 ; 0x8004a7 29128: 90 91 a8 04 lds r25, 0x04A8 ; 0x8004a8 2912c: a0 91 a9 04 lds r26, 0x04A9 ; 0x8004a9 29130: b0 91 aa 04 lds r27, 0x04AA ; 0x8004aa 29134: 8d a7 std Y+45, r24 ; 0x2d 29136: 9e a7 std Y+46, r25 ; 0x2e 29138: af a7 std Y+47, r26 ; 0x2f 2913a: b8 ab std Y+48, r27 ; 0x30 && delta_mm[E_AXIS] >= 0 && fabs(delta_mm[Z_AXIS]) < 0.5; 2913c: 20 e0 ldi r18, 0x00 ; 0 2913e: 30 e0 ldi r19, 0x00 ; 0 29140: a9 01 movw r20, r18 29142: bc 01 movw r22, r24 29144: cd 01 movw r24, r26 29146: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2914a: 18 16 cp r1, r24 2914c: 0c f0 brlt .+2 ; 0x29150 2914e: ed c0 rjmp .+474 ; 0x2932a * extruder_advance_K : There is an advance factor set. * delta_mm[E_AXIS] >= 0 : Extruding or traveling, but _not_ retracting. * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming) */ block->use_advance_lead = extruder_advance_K > 0 && delta_mm[E_AXIS] >= 0 29150: 20 e0 ldi r18, 0x00 ; 0 29152: 30 e0 ldi r19, 0x00 ; 0 29154: a9 01 movw r20, r18 29156: 26 96 adiw r28, 0x06 ; 6 29158: 6c ad ldd r22, Y+60 ; 0x3c 2915a: 7d ad ldd r23, Y+61 ; 0x3d 2915c: 8e ad ldd r24, Y+62 ; 0x3e 2915e: 9f ad ldd r25, Y+63 ; 0x3f 29160: 26 97 sbiw r28, 0x06 ; 6 29162: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 29166: 87 fd sbrc r24, 7 29168: e0 c0 rjmp .+448 ; 0x2932a && fabs(delta_mm[Z_AXIS]) < 0.5; 2916a: 22 96 adiw r28, 0x02 ; 2 2916c: 6c ad ldd r22, Y+60 ; 0x3c 2916e: 7d ad ldd r23, Y+61 ; 0x3d 29170: 8e ad ldd r24, Y+62 ; 0x3e 29172: 9f ad ldd r25, Y+63 ; 0x3f 29174: 22 97 sbiw r28, 0x02 ; 2 29176: 9f 77 andi r25, 0x7F ; 127 29178: 20 e0 ldi r18, 0x00 ; 0 2917a: 30 e0 ldi r19, 0x00 ; 0 2917c: 40 e0 ldi r20, 0x00 ; 0 2917e: 5f e3 ldi r21, 0x3F ; 63 29180: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 29184: 87 ff sbrs r24, 7 29186: d1 c0 rjmp .+418 ; 0x2932a * * extruder_advance_K : There is an advance factor set. * delta_mm[E_AXIS] >= 0 : Extruding or traveling, but _not_ retracting. * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming) */ block->use_advance_lead = extruder_advance_K > 0 29188: 8e e6 ldi r24, 0x6E ; 110 2918a: 82 9d mul r24, r2 2918c: 80 01 movw r16, r0 2918e: 83 9d mul r24, r3 29190: 10 0d add r17, r0 29192: 11 24 eor r1, r1 29194: 06 55 subi r16, 0x56 ; 86 29196: 19 4f sbci r17, 0xF9 ; 249 29198: 81 e0 ldi r24, 0x01 ; 1 2919a: d8 01 movw r26, r16 2919c: 8c 93 st X, r24 float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder]; #else // M221/FLOW only adjusts for an incorrect source diameter float delta_e = (e - position_float[E_AXIS]); #endif float delta_D = sqrt(sq(x - position_float[X_AXIS]) 2919e: 20 91 36 04 lds r18, 0x0436 ; 0x800436 291a2: 30 91 37 04 lds r19, 0x0437 ; 0x800437 291a6: 40 91 38 04 lds r20, 0x0438 ; 0x800438 291aa: 50 91 39 04 lds r21, 0x0439 ; 0x800439 291ae: 69 a1 ldd r22, Y+33 ; 0x21 291b0: 7a a1 ldd r23, Y+34 ; 0x22 291b2: 8b a1 ldd r24, Y+35 ; 0x23 291b4: 9c a1 ldd r25, Y+36 ; 0x24 291b6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 291ba: 69 ab std Y+49, r22 ; 0x31 291bc: 7a ab std Y+50, r23 ; 0x32 291be: 8b ab std Y+51, r24 ; 0x33 291c0: 9c ab std Y+52, r25 ; 0x34 + sq(y - position_float[Y_AXIS]) 291c2: 20 91 3a 04 lds r18, 0x043A ; 0x80043a 291c6: 30 91 3b 04 lds r19, 0x043B ; 0x80043b 291ca: 40 91 3c 04 lds r20, 0x043C ; 0x80043c 291ce: 50 91 3d 04 lds r21, 0x043D ; 0x80043d 291d2: 6d a1 ldd r22, Y+37 ; 0x25 291d4: 7e a1 ldd r23, Y+38 ; 0x26 291d6: 8f a1 ldd r24, Y+39 ; 0x27 291d8: 98 a5 ldd r25, Y+40 ; 0x28 291da: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 291de: 4b 01 movw r8, r22 291e0: 5c 01 movw r10, r24 + sq(z - position_float[Z_AXIS])); 291e2: 20 91 3e 04 lds r18, 0x043E ; 0x80043e 291e6: 30 91 3f 04 lds r19, 0x043F ; 0x80043f 291ea: 40 91 40 04 lds r20, 0x0440 ; 0x800440 291ee: 50 91 41 04 lds r21, 0x0441 ; 0x800441 291f2: a7 96 adiw r28, 0x27 ; 39 291f4: 6c ad ldd r22, Y+60 ; 0x3c 291f6: 7d ad ldd r23, Y+61 ; 0x3d 291f8: 8e ad ldd r24, Y+62 ; 0x3e 291fa: 9f ad ldd r25, Y+63 ; 0x3f 291fc: a7 97 sbiw r28, 0x27 ; 39 291fe: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 29202: 6b 01 movw r12, r22 29204: 7c 01 movw r14, r24 float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder]; #else // M221/FLOW only adjusts for an incorrect source diameter float delta_e = (e - position_float[E_AXIS]); #endif float delta_D = sqrt(sq(x - position_float[X_AXIS]) 29206: 29 a9 ldd r18, Y+49 ; 0x31 29208: 3a a9 ldd r19, Y+50 ; 0x32 2920a: 4b a9 ldd r20, Y+51 ; 0x33 2920c: 5c a9 ldd r21, Y+52 ; 0x34 2920e: ca 01 movw r24, r20 29210: b9 01 movw r22, r18 29212: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29216: 69 ab std Y+49, r22 ; 0x31 29218: 7a ab std Y+50, r23 ; 0x32 2921a: 8b ab std Y+51, r24 ; 0x33 2921c: 9c ab std Y+52, r25 ; 0x34 + sq(y - position_float[Y_AXIS]) 2921e: a5 01 movw r20, r10 29220: 94 01 movw r18, r8 29222: c5 01 movw r24, r10 29224: b4 01 movw r22, r8 29226: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2922a: 9b 01 movw r18, r22 2922c: ac 01 movw r20, r24 2922e: 69 a9 ldd r22, Y+49 ; 0x31 29230: 7a a9 ldd r23, Y+50 ; 0x32 29232: 8b a9 ldd r24, Y+51 ; 0x33 29234: 9c a9 ldd r25, Y+52 ; 0x34 29236: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2923a: 4b 01 movw r8, r22 2923c: 5c 01 movw r10, r24 + sq(z - position_float[Z_AXIS])); 2923e: a7 01 movw r20, r14 29240: 96 01 movw r18, r12 29242: c7 01 movw r24, r14 29244: b6 01 movw r22, r12 29246: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2924a: 9b 01 movw r18, r22 2924c: ac 01 movw r20, r24 2924e: c5 01 movw r24, r10 29250: b4 01 movw r22, r8 29252: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder]; #else // M221/FLOW only adjusts for an incorrect source diameter float delta_e = (e - position_float[E_AXIS]); #endif float delta_D = sqrt(sq(x - position_float[X_AXIS]) 29256: 0f 94 d6 a8 call 0x351ac ; 0x351ac 2925a: 6b 01 movw r12, r22 2925c: 7c 01 movw r14, r24 #ifdef LA_FLOWADJ // M221/FLOW should change uniformly the extrusion thickness float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder]; #else // M221/FLOW only adjusts for an incorrect source diameter float delta_e = (e - position_float[E_AXIS]); 2925e: 20 91 42 04 lds r18, 0x0442 ; 0x800442 29262: 30 91 43 04 lds r19, 0x0443 ; 0x800443 29266: 40 91 44 04 lds r20, 0x0444 ; 0x800444 2926a: 50 91 45 04 lds r21, 0x0445 ; 0x800445 2926e: a9 96 adiw r28, 0x29 ; 41 29270: ee ad ldd r30, Y+62 ; 0x3e 29272: ff ad ldd r31, Y+63 ; 0x3f 29274: a9 97 sbiw r28, 0x29 ; 41 29276: 60 81 ld r22, Z 29278: 71 81 ldd r23, Z+1 ; 0x01 2927a: 82 81 ldd r24, Z+2 ; 0x02 2927c: 93 81 ldd r25, Z+3 ; 0x03 2927e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> + sq(y - position_float[Y_AXIS]) + sq(z - position_float[Z_AXIS])); // all extrusion moves with LA require a compression which is proportional to the // extrusion_length to distance ratio (e/D) e_D_ratio = delta_e / delta_D; 29282: a7 01 movw r20, r14 29284: 96 01 movw r18, r12 29286: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2928a: 6a 96 adiw r28, 0x1a ; 26 2928c: 6c af std Y+60, r22 ; 0x3c 2928e: 7d af std Y+61, r23 ; 0x3d 29290: 8e af std Y+62, r24 ; 0x3e 29292: 9f af std Y+63, r25 ; 0x3f 29294: 6a 97 sbiw r28, 0x1a ; 26 // Check for unusual high e_D ratio to detect if a retract move was combined with the last // print move due to min. steps per segment. Never execute this with advance! This assumes // no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print // 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament. if (e_D_ratio > 3.0) 29296: 20 e0 ldi r18, 0x00 ; 0 29298: 30 e0 ldi r19, 0x00 ; 0 2929a: 40 e4 ldi r20, 0x40 ; 64 2929c: 50 e4 ldi r21, 0x40 ; 64 2929e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 292a2: 18 16 cp r1, r24 292a4: 0c f4 brge .+2 ; 0x292a8 292a6: 9e c0 rjmp .+316 ; 0x293e4 block->use_advance_lead = false; else if (e_D_ratio > 0) { 292a8: 20 e0 ldi r18, 0x00 ; 0 292aa: 30 e0 ldi r19, 0x00 ; 0 292ac: a9 01 movw r20, r18 292ae: 6a 96 adiw r28, 0x1a ; 26 292b0: 6c ad ldd r22, Y+60 ; 0x3c 292b2: 7d ad ldd r23, Y+61 ; 0x3d 292b4: 8e ad ldd r24, Y+62 ; 0x3e 292b6: 9f ad ldd r25, Y+63 ; 0x3f 292b8: 6a 97 sbiw r28, 0x1a ; 26 292ba: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 292be: 18 16 cp r1, r24 292c0: 0c f0 brlt .+2 ; 0x292c4 292c2: 42 c0 rjmp .+132 ; 0x29348 const uint32_t max_accel_steps_per_s2 = ceil(cs.max_jerk[E_AXIS] / (extruder_advance_K * e_D_ratio) * steps_per_mm); 292c4: 6a 96 adiw r28, 0x1a ; 26 292c6: 2c ad ldd r18, Y+60 ; 0x3c 292c8: 3d ad ldd r19, Y+61 ; 0x3d 292ca: 4e ad ldd r20, Y+62 ; 0x3e 292cc: 5f ad ldd r21, Y+63 ; 0x3f 292ce: 6a 97 sbiw r28, 0x1a ; 26 292d0: 6d a5 ldd r22, Y+45 ; 0x2d 292d2: 7e a5 ldd r23, Y+46 ; 0x2e 292d4: 8f a5 ldd r24, Y+47 ; 0x2f 292d6: 98 a9 ldd r25, Y+48 ; 0x30 292d8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 292dc: 9b 01 movw r18, r22 292de: ac 01 movw r20, r24 292e0: 60 91 bb 0d lds r22, 0x0DBB ; 0x800dbb 292e4: 70 91 bc 0d lds r23, 0x0DBC ; 0x800dbc 292e8: 80 91 bd 0d lds r24, 0x0DBD ; 0x800dbd 292ec: 90 91 be 0d lds r25, 0x0DBE ; 0x800dbe 292f0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 292f4: 29 a5 ldd r18, Y+41 ; 0x29 292f6: 3a a5 ldd r19, Y+42 ; 0x2a 292f8: 4b a5 ldd r20, Y+43 ; 0x2b 292fa: 5c a5 ldd r21, Y+44 ; 0x2c 292fc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29300: 0f 94 e6 a5 call 0x34bcc ; 0x34bcc 29304: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 29308: 64 15 cp r22, r4 2930a: 75 05 cpc r23, r5 2930c: 86 05 cpc r24, r6 2930e: 97 05 cpc r25, r7 29310: d8 f4 brcc .+54 ; 0x29348 29312: 2b 01 movw r4, r22 29314: 3c 01 movw r6, r24 29316: 18 c0 rjmp .+48 ; 0x29348 block->use_advance_lead = false; #endif } else { accel = ceil((block->steps[E_AXIS].wide ? cs.acceleration : cs.travel_acceleration) * steps_per_mm); // convert to: acceleration steps/sec^2 29318: 60 91 27 0e lds r22, 0x0E27 ; 0x800e27 2931c: 70 91 28 0e lds r23, 0x0E28 ; 0x800e28 29320: 80 91 29 0e lds r24, 0x0E29 ; 0x800e29 29324: 90 91 2a 0e lds r25, 0x0E2A ; 0x800e2a 29328: f1 ce rjmp .-542 ; 0x2910c * * extruder_advance_K : There is an advance factor set. * delta_mm[E_AXIS] >= 0 : Extruding or traveling, but _not_ retracting. * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming) */ block->use_advance_lead = extruder_advance_K > 0 2932a: 8e e6 ldi r24, 0x6E ; 110 2932c: 82 9d mul r24, r2 2932e: f0 01 movw r30, r0 29330: 83 9d mul r24, r3 29332: f0 0d add r31, r0 29334: 11 24 eor r1, r1 29336: e6 55 subi r30, 0x56 ; 86 29338: f9 4f sbci r31, 0xF9 ; 249 2933a: 10 82 st Z, r1 block->nominal_speed *= speed_factor; block->nominal_rate *= speed_factor; } #ifdef LIN_ADVANCE float e_D_ratio = 0; 2933c: 6a 96 adiw r28, 0x1a ; 26 2933e: 1c ae std Y+60, r1 ; 0x3c 29340: 1d ae std Y+61, r1 ; 0x3d 29342: 1e ae std Y+62, r1 ; 0x3e 29344: 1f ae std Y+63, r1 ; 0x3f 29346: 6a 97 sbiw r28, 0x1a ; 26 29348: 10 e0 ldi r17, 0x00 ; 0 2934a: 00 e0 ldi r16, 0x00 ; 0 #endif // Limit acceleration per axis for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { if(block->steps[axis].wide && max_acceleration_steps_per_s2[axis] < accel) 2934c: a3 96 adiw r28, 0x23 ; 35 2934e: ee ad ldd r30, Y+62 ; 0x3e 29350: ff ad ldd r31, Y+63 ; 0x3f 29352: a3 97 sbiw r28, 0x23 ; 35 29354: e0 0f add r30, r16 29356: f1 1f adc r31, r17 29358: e2 5a subi r30, 0xA2 ; 162 2935a: f9 4f sbci r31, 0xF9 ; 249 2935c: c0 80 ld r12, Z 2935e: d1 80 ldd r13, Z+1 ; 0x01 29360: e2 80 ldd r14, Z+2 ; 0x02 29362: f3 80 ldd r15, Z+3 ; 0x03 29364: c1 14 cp r12, r1 29366: d1 04 cpc r13, r1 29368: e1 04 cpc r14, r1 2936a: f1 04 cpc r15, r1 2936c: a1 f1 breq .+104 ; 0x293d6 2936e: f8 01 movw r30, r16 29370: e5 55 subi r30, 0x55 ; 85 29372: fb 4f sbci r31, 0xFB ; 251 29374: 60 81 ld r22, Z 29376: 71 81 ldd r23, Z+1 ; 0x01 29378: 82 81 ldd r24, Z+2 ; 0x02 2937a: 93 81 ldd r25, Z+3 ; 0x03 2937c: 64 15 cp r22, r4 2937e: 75 05 cpc r23, r5 29380: 86 05 cpc r24, r6 29382: 97 05 cpc r25, r7 29384: 40 f5 brcc .+80 ; 0x293d6 { const float max_possible = float(max_acceleration_steps_per_s2[axis]) * float(block->step_event_count.wide) / float(block->steps[axis].wide); 29386: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2938a: 29 ad ldd r18, Y+57 ; 0x39 2938c: 3a ad ldd r19, Y+58 ; 0x3a 2938e: 4b ad ldd r20, Y+59 ; 0x3b 29390: 5c ad ldd r21, Y+60 ; 0x3c 29392: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29396: 4b 01 movw r8, r22 29398: 5c 01 movw r10, r24 2939a: c7 01 movw r24, r14 2939c: b6 01 movw r22, r12 2939e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 293a2: 9b 01 movw r18, r22 293a4: ac 01 movw r20, r24 293a6: c5 01 movw r24, r10 293a8: b4 01 movw r22, r8 293aa: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 293ae: 6b 01 movw r12, r22 293b0: 7c 01 movw r14, r24 if (max_possible < accel) accel = max_possible; 293b2: c3 01 movw r24, r6 293b4: b2 01 movw r22, r4 293b6: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 293ba: 9b 01 movw r18, r22 293bc: ac 01 movw r20, r24 293be: c7 01 movw r24, r14 293c0: b6 01 movw r22, r12 293c2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 293c6: 87 ff sbrs r24, 7 293c8: 06 c0 rjmp .+12 ; 0x293d6 293ca: c7 01 movw r24, r14 293cc: b6 01 movw r22, r12 293ce: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 293d2: 2b 01 movw r4, r22 293d4: 3c 01 movw r6, r24 293d6: 0c 5f subi r16, 0xFC ; 252 293d8: 1f 4f sbci r17, 0xFF ; 255 } } #endif // Limit acceleration per axis for (uint8_t axis = 0; axis < NUM_AXIS; axis++) 293da: 00 31 cpi r16, 0x10 ; 16 293dc: 11 05 cpc r17, r1 293de: 09 f0 breq .+2 ; 0x293e2 293e0: b5 cf rjmp .-150 ; 0x2934c 293e2: 01 c9 rjmp .-3582 ; 0x285e6 // Check for unusual high e_D ratio to detect if a retract move was combined with the last // print move due to min. steps per segment. Never execute this with advance! This assumes // no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print // 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament. if (e_D_ratio > 3.0) block->use_advance_lead = false; 293e4: d8 01 movw r26, r16 293e6: 1c 92 st X, r1 293e8: af cf rjmp .-162 ; 0x29348 if (jerk > mjerk) { safe_speed *= mjerk / jerk; limited = true; } } else { safe_speed = cs.max_jerk[axis]; 293ea: c9 a6 std Y+41, r12 ; 0x29 293ec: dd a6 std Y+45, r13 ; 0x2d 293ee: e9 ae std Y+57, r14 ; 0x39 293f0: f9 aa std Y+49, r15 ; 0x31 limited = true; 293f2: 21 e0 ldi r18, 0x01 ; 1 293f4: 2d ab std Y+53, r18 ; 0x35 293f6: b1 c9 rjmp .-3230 ; 0x2875a // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. bool prev_speed_larger = previous_nominal_speed > block->nominal_speed; float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed); 293f8: 27 96 adiw r28, 0x07 ; 7 293fa: 2f ad ldd r18, Y+63 ; 0x3f 293fc: 27 97 sbiw r28, 0x07 ; 7 293fe: 2b 96 adiw r28, 0x0b ; 11 29400: 3f ad ldd r19, Y+63 ; 0x3f 29402: 2b 97 sbiw r28, 0x0b ; 11 29404: 2f 96 adiw r28, 0x0f ; 15 29406: 4f ad ldd r20, Y+63 ; 0x3f 29408: 2f 97 sbiw r28, 0x0f ; 15 2940a: 63 96 adiw r28, 0x13 ; 19 2940c: 5f ad ldd r21, Y+63 ; 0x3f 2940e: 63 97 sbiw r28, 0x13 ; 19 29410: 6b 96 adiw r28, 0x1b ; 27 29412: 6f ad ldd r22, Y+63 ; 0x3f 29414: 6b 97 sbiw r28, 0x1b ; 27 29416: 6f 96 adiw r28, 0x1f ; 31 29418: 7f ad ldd r23, Y+63 ; 0x3f 2941a: 6f 97 sbiw r28, 0x1f ; 31 2941c: c8 01 movw r24, r16 2941e: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 29422: eb 96 adiw r28, 0x3b ; 59 29424: 6c af std Y+60, r22 ; 0x3c 29426: 7d af std Y+61, r23 ; 0x3d 29428: 8e af std Y+62, r24 ; 0x3e 2942a: 9f af std Y+63, r25 ; 0x3f 2942c: eb 97 sbiw r28, 0x3b ; 59 // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed; 2942e: 6b 96 adiw r28, 0x1b ; 27 29430: ef ad ldd r30, Y+63 ; 0x3f 29432: 6b 97 sbiw r28, 0x1b ; 27 29434: ed af std Y+61, r30 ; 0x3d 29436: 6f 96 adiw r28, 0x1f ; 31 29438: ff ad ldd r31, Y+63 ; 0x3f 2943a: 6f 97 sbiw r28, 0x1f ; 31 2943c: fd ab std Y+53, r31 ; 0x35 2943e: 0e af std Y+62, r16 ; 0x3e 29440: 23 96 adiw r28, 0x03 ; 3 29442: 1f af std Y+63, r17 ; 0x3f 29444: 23 97 sbiw r28, 0x03 ; 3 29446: 04 ca rjmp .-3064 ; 0x28850 (v_exit > v_entry) ? ((v_entry > 0.f || v_exit < 0.f) ? // coasting (v_exit - v_entry) : // axis reversal max(v_exit, - v_entry)) : 29448: f7 fa bst r15, 7 2944a: f0 94 com r15 2944c: f7 f8 bld r15, 7 2944e: f0 94 com r15 29450: a5 01 movw r20, r10 29452: 94 01 movw r18, r8 29454: c7 01 movw r24, r14 29456: b6 01 movw r22, r12 29458: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2945c: 87 ff sbrs r24, 7 2945e: 77 ca rjmp .-2834 ; 0x2894e // v_exit <= v_entry ((v_entry < 0.f || v_exit > 0.f) ? // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); 29460: 75 01 movw r14, r10 29462: 64 01 movw r12, r8 29464: 74 ca rjmp .-2840 ; 0x2894e // coasting (v_exit - v_entry) : // axis reversal max(v_exit, - v_entry)) : // v_exit <= v_entry ((v_entry < 0.f || v_exit > 0.f) ? 29466: c7 01 movw r24, r14 29468: b6 01 movw r22, r12 2946a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2946e: 87 fd sbrc r24, 7 29470: 09 c0 rjmp .+18 ; 0x29484 29472: 20 e0 ldi r18, 0x00 ; 0 29474: 30 e0 ldi r19, 0x00 ; 0 29476: a9 01 movw r20, r18 29478: c5 01 movw r24, r10 2947a: b4 01 movw r22, r8 2947c: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 29480: 18 16 cp r1, r24 29482: 2c f4 brge .+10 ; 0x2948e 29484: a5 01 movw r20, r10 29486: 94 01 movw r18, r8 29488: c7 01 movw r24, r14 2948a: b6 01 movw r22, r12 2948c: 5c ca rjmp .-2888 ; 0x28946 // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); 2948e: b7 fa bst r11, 7 29490: b0 94 com r11 29492: b7 f8 bld r11, 7 29494: b0 94 com r11 29496: a7 01 movw r20, r14 29498: 96 01 movw r18, r12 2949a: c5 01 movw r24, r10 2949c: b4 01 movw r22, r8 2949e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 294a2: 18 16 cp r1, r24 294a4: 0c f0 brlt .+2 ; 0x294a8 294a6: 53 ca rjmp .-2906 ; 0x2894e 294a8: db cf rjmp .-74 ; 0x29460 // better to start the segment from start. block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; vmax_junction = safe_speed; } } else { block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; 294aa: 8e e6 ldi r24, 0x6E ; 110 294ac: 82 9d mul r24, r2 294ae: f0 01 movw r30, r0 294b0: 83 9d mul r24, r3 294b2: f0 0d add r31, r0 294b4: 11 24 eor r1, r1 294b6: e2 5a subi r30, 0xA2 ; 162 294b8: f9 4f sbci r31, 0xF9 ; 249 294ba: 85 a9 ldd r24, Z+53 ; 0x35 294bc: 84 60 ori r24, 0x04 ; 4 294be: 85 ab std Z+53, r24 ; 0x35 294c0: a9 a5 ldd r26, Y+41 ; 0x29 294c2: ad af std Y+61, r26 ; 0x3d 294c4: bd a5 ldd r27, Y+45 ; 0x2d 294c6: bd ab std Y+53, r27 ; 0x35 294c8: e9 ad ldd r30, Y+57 ; 0x39 294ca: ee af std Y+62, r30 ; 0x3e 294cc: f9 a9 ldd r31, Y+49 ; 0x31 294ce: 23 96 adiw r28, 0x03 ; 3 294d0: ff af std Y+63, r31 ; 0x3f 294d2: 23 97 sbiw r28, 0x03 ; 3 294d4: bc ca rjmp .-2696 ; 0x28a4e // junction speeds in deceleration and acceleration, respectively. This is due to how the current // block nominal speed limits both the current and next maximum junction speeds. Hence, in both // the reverse and forward planners, the corresponding block junction speed will always be at the // the maximum junction speed and may always be ignored for any speed reduction checks. // Always calculate trapezoid for new block block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE; 294d6: 81 e0 ldi r24, 0x01 ; 1 294d8: 30 cb rjmp .-2464 ; 0x28b3a float advance_speed; if (e_D_ratio > 0) advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_mm[E_AXIS]); else advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_mm[E_AXIS]; 294da: 20 91 bb 0d lds r18, 0x0DBB ; 0x800dbb 294de: 30 91 bc 0d lds r19, 0x0DBC ; 0x800dbc 294e2: 40 91 bd 0d lds r20, 0x0DBD ; 0x800dbd 294e6: 50 91 be 0d lds r21, 0x0DBE ; 0x800dbe 294ea: c7 01 movw r24, r14 294ec: b6 01 movw r22, r12 294ee: c1 cb rjmp .-2174 ; 0x28c72 float advance_rate = (F_CPU / 8.0) / advance_speed; if (advance_speed > 20000) { block->advance_rate = advance_rate * 4; block->advance_step_loops = 4; } else if (advance_speed > 10000) { 294f0: 20 e0 ldi r18, 0x00 ; 0 294f2: 30 e4 ldi r19, 0x40 ; 64 294f4: 4c e1 ldi r20, 0x1C ; 28 294f6: 56 e4 ldi r21, 0x46 ; 70 294f8: c7 01 movw r24, r14 294fa: b6 01 movw r22, r12 294fc: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 29500: 18 16 cp r1, r24 29502: d4 f4 brge .+52 ; 0x29538 block->advance_rate = advance_rate * 2; 29504: 8e e6 ldi r24, 0x6E ; 110 29506: 82 9d mul r24, r2 29508: 80 01 movw r16, r0 2950a: 83 9d mul r24, r3 2950c: 10 0d add r17, r0 2950e: 11 24 eor r1, r1 29510: 02 5a subi r16, 0xA2 ; 162 29512: 19 4f sbci r17, 0xF9 ; 249 29514: 78 01 movw r14, r16 29516: bd e4 ldi r27, 0x4D ; 77 29518: eb 0e add r14, r27 2951a: f1 1c adc r15, r1 2951c: a5 01 movw r20, r10 2951e: 94 01 movw r18, r8 29520: c5 01 movw r24, r10 29522: b4 01 movw r22, r8 29524: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 29528: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 2952c: f7 01 movw r30, r14 2952e: 71 83 std Z+1, r23 ; 0x01 29530: 60 83 st Z, r22 block->advance_step_loops = 2; 29532: 36 96 adiw r30, 0x06 ; 6 29534: 82 e0 ldi r24, 0x02 ; 2 29536: e2 cb rjmp .-2108 ; 0x28cfc } else { // never overflow the internal accumulator with very low rates if (advance_rate < UINT16_MAX) 29538: 20 e0 ldi r18, 0x00 ; 0 2953a: 3f ef ldi r19, 0xFF ; 255 2953c: 4f e7 ldi r20, 0x7F ; 127 2953e: 57 e4 ldi r21, 0x47 ; 71 29540: c5 01 movw r24, r10 29542: b4 01 movw r22, r8 29544: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 29548: 87 ff sbrs r24, 7 2954a: 19 c0 rjmp .+50 ; 0x2957e block->advance_rate = advance_rate; 2954c: 8e e6 ldi r24, 0x6E ; 110 2954e: 82 9d mul r24, r2 29550: 80 01 movw r16, r0 29552: 83 9d mul r24, r3 29554: 10 0d add r17, r0 29556: 11 24 eor r1, r1 29558: 05 55 subi r16, 0x55 ; 85 2955a: 19 4f sbci r17, 0xF9 ; 249 2955c: c5 01 movw r24, r10 2955e: b4 01 movw r22, r8 29560: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 29564: d8 01 movw r26, r16 29566: 6d 93 st X+, r22 29568: 7c 93 st X, r23 else block->advance_rate = UINT16_MAX; block->advance_step_loops = 1; 2956a: 8e e6 ldi r24, 0x6E ; 110 2956c: 82 9d mul r24, r2 2956e: f0 01 movw r30, r0 29570: 83 9d mul r24, r3 29572: f0 0d add r31, r0 29574: 11 24 eor r1, r1 29576: ef 54 subi r30, 0x4F ; 79 29578: f9 4f sbci r31, 0xF9 ; 249 2957a: 81 e0 ldi r24, 0x01 ; 1 2957c: bf cb rjmp .-2178 ; 0x28cfc { // never overflow the internal accumulator with very low rates if (advance_rate < UINT16_MAX) block->advance_rate = advance_rate; else block->advance_rate = UINT16_MAX; 2957e: 8e e6 ldi r24, 0x6E ; 110 29580: 82 9d mul r24, r2 29582: f0 01 movw r30, r0 29584: 83 9d mul r24, r3 29586: f0 0d add r31, r0 29588: 11 24 eor r1, r1 2958a: e5 55 subi r30, 0x55 ; 85 2958c: f9 4f sbci r31, 0xF9 ; 249 2958e: 8f ef ldi r24, 0xFF ; 255 29590: 9f ef ldi r25, 0xFF ; 255 29592: 91 83 std Z+1, r25 ; 0x01 29594: 80 83 st Z, r24 29596: e9 cf rjmp .-46 ; 0x2956a break; } // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and // check for maximum allowable speed reductions to ensure maximum possible planned speed. if (current->entry_speed != current->max_entry_speed) { 29598: f6 01 movw r30, r12 2959a: 71 a4 ldd r7, Z+41 ; 0x29 2959c: 82 a4 ldd r8, Z+42 ; 0x2a 2959e: 93 a4 ldd r9, Z+43 ; 0x2b 295a0: e4 a4 ldd r14, Z+44 ; 0x2c 295a2: 27 2d mov r18, r7 295a4: 38 2d mov r19, r8 295a6: 49 2d mov r20, r9 295a8: 5e 2d mov r21, r14 295aa: 65 a1 ldd r22, Z+37 ; 0x25 295ac: 76 a1 ldd r23, Z+38 ; 0x26 295ae: 87 a1 ldd r24, Z+39 ; 0x27 295b0: 90 a5 ldd r25, Z+40 ; 0x28 295b2: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 295b6: 88 23 and r24, r24 295b8: 09 f4 brne .+2 ; 0x295bc 295ba: 51 c0 rjmp .+162 ; 0x2965e // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity. // Only compute for max allowable speed if block is decelerating and nominal length is false. // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um. // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient // together with an assembly 32bit->16bit sqrt function. current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? 295bc: 01 fd sbrc r16, 1 295be: 44 c0 rjmp .+136 ; 0x29648 295c0: d5 01 movw r26, r10 295c2: 95 96 adiw r26, 0x25 ; 37 295c4: 2d 90 ld r2, X+ 295c6: 3d 90 ld r3, X+ 295c8: 4d 90 ld r4, X+ 295ca: 5c 90 ld r5, X 295cc: 98 97 sbiw r26, 0x28 ; 40 295ce: a2 01 movw r20, r4 295d0: 91 01 movw r18, r2 295d2: 67 2d mov r22, r7 295d4: 78 2d mov r23, r8 295d6: 89 2d mov r24, r9 295d8: 9e 2d mov r25, r14 295da: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 295de: 18 16 cp r1, r24 295e0: 9c f5 brge .+102 ; 0x29648 // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 295e2: a2 01 movw r20, r4 295e4: 91 01 movw r18, r2 295e6: c2 01 movw r24, r4 295e8: b1 01 movw r22, r2 295ea: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 295ee: 1b 01 movw r2, r22 295f0: 2c 01 movw r4, r24 // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient // together with an assembly 32bit->16bit sqrt function. current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? current->max_entry_speed : // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); 295f2: f6 01 movw r30, r12 295f4: 61 a9 ldd r22, Z+49 ; 0x31 295f6: 72 a9 ldd r23, Z+50 ; 0x32 295f8: 83 a9 ldd r24, Z+51 ; 0x33 295fa: 94 a9 ldd r25, Z+52 ; 0x34 295fc: 90 58 subi r25, 0x80 ; 128 // Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the // decceleration within the allotted distance. FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) { // assert(decceleration < 0); return sqrt(target_velocity*target_velocity-2*decceleration*distance); 295fe: 9b 01 movw r18, r22 29600: ac 01 movw r20, r24 29602: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 29606: d6 01 movw r26, r12 29608: 9d 96 adiw r26, 0x2d ; 45 2960a: 2d 91 ld r18, X+ 2960c: 3d 91 ld r19, X+ 2960e: 4d 91 ld r20, X+ 29610: 5c 91 ld r21, X 29612: d0 97 sbiw r26, 0x30 ; 48 29614: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29618: 9b 01 movw r18, r22 2961a: ac 01 movw r20, r24 2961c: c2 01 movw r24, r4 2961e: b1 01 movw r22, r2 29620: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 29624: 0f 94 d6 a8 call 0x351ac ; 0x351ac 29628: 2b 01 movw r4, r22 2962a: 5c 01 movw r10, r24 // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient // together with an assembly 32bit->16bit sqrt function. current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? current->max_entry_speed : // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); 2962c: 9b 01 movw r18, r22 2962e: ac 01 movw r20, r24 29630: 67 2d mov r22, r7 29632: 78 2d mov r23, r8 29634: 89 2d mov r24, r9 29636: 9e 2d mov r25, r14 29638: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2963c: 87 fd sbrc r24, 7 2963e: 04 c0 rjmp .+8 ; 0x29648 29640: 74 2c mov r7, r4 29642: 85 2c mov r8, r5 29644: 9a 2c mov r9, r10 29646: eb 2c mov r14, r11 // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity. // Only compute for max allowable speed if block is decelerating and nominal length is false. // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um. // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient // together with an assembly 32bit->16bit sqrt function. current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? 29648: 87 2d mov r24, r7 2964a: 98 2d mov r25, r8 2964c: a9 2d mov r26, r9 2964e: be 2d mov r27, r14 29650: f6 01 movw r30, r12 29652: 85 a3 std Z+37, r24 ; 0x25 29654: 96 a3 std Z+38, r25 ; 0x26 29656: a7 a3 std Z+39, r26 ; 0x27 29658: b0 a7 std Z+40, r27 ; 0x28 current->max_entry_speed : // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); current->flag |= BLOCK_FLAG_RECALCULATE; 2965a: 01 60 ori r16, 0x01 ; 1 2965c: 05 ab std Z+53, r16 ; 0x35 } // Returns the index of the previous block in the ring buffer static inline uint8_t prev_block_index(uint8_t block_index) { if (block_index == 0) 2965e: 11 11 cpse r17, r1 29660: 01 c0 rjmp .+2 ; 0x29664 block_index = BLOCK_BUFFER_SIZE; 29662: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 29664: 11 50 subi r17, 0x01 ; 1 // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); current->flag |= BLOCK_FLAG_RECALCULATE; } next = current; current = block_buffer + (block_index = prev_block_index(block_index)); 29666: 16 9d mul r17, r6 29668: c0 01 movw r24, r0 2966a: 11 24 eor r1, r1 current->max_entry_speed : // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); current->flag |= BLOCK_FLAG_RECALCULATE; } next = current; 2966c: 56 01 movw r10, r12 current = block_buffer + (block_index = prev_block_index(block_index)); 2966e: 9c 01 movw r18, r24 29670: 22 5a subi r18, 0xA2 ; 162 29672: 39 4f sbci r19, 0xF9 ; 249 29674: 69 01 movw r12, r18 29676: 0b cc rjmp .-2026 ; 0x28e8e calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; } prev = current; current = block_buffer + (block_index = next_block_index(block_index)); 29678: 6c 01 movw r12, r24 2967a: 2f cc rjmp .-1954 ; 0x28eda 2967c: 8f bf out 0x3f, r24 ; 63 __asm__ volatile ("" ::: "memory"); 2967e: 0d 94 9a 3d jmp 0x27b34 ; 0x27b34 00029682 : void plan_buffer_line_destinationXYZE(float feed_rate) { plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate); } void plan_set_position_curposXYZE(){ 29682: 4f 92 push r4 29684: 5f 92 push r5 29686: 6f 92 push r6 29688: 7f 92 push r7 2968a: 8f 92 push r8 2968c: 9f 92 push r9 2968e: af 92 push r10 29690: bf 92 push r11 29692: cf 92 push r12 29694: df 92 push r13 29696: ef 92 push r14 29698: ff 92 push r15 2969a: cf 93 push r28 2969c: df 93 push r29 2969e: cd b7 in r28, 0x3d ; 61 296a0: de b7 in r29, 0x3e ; 62 296a2: 2c 97 sbiw r28, 0x0c ; 12 296a4: 0f b6 in r0, 0x3f ; 63 296a6: f8 94 cli 296a8: de bf out 0x3e, r29 ; 62 296aa: 0f be out 0x3f, r0 ; 63 296ac: cd bf out 0x3d, r28 ; 61 plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); 296ae: c0 90 69 12 lds r12, 0x1269 ; 0x801269 296b2: d0 90 6a 12 lds r13, 0x126A ; 0x80126a 296b6: e0 90 6b 12 lds r14, 0x126B ; 0x80126b 296ba: f0 90 6c 12 lds r15, 0x126C ; 0x80126c 296be: 80 91 65 12 lds r24, 0x1265 ; 0x801265 296c2: 90 91 66 12 lds r25, 0x1266 ; 0x801266 296c6: a0 91 67 12 lds r26, 0x1267 ; 0x801267 296ca: b0 91 68 12 lds r27, 0x1268 ; 0x801268 296ce: 40 91 61 12 lds r20, 0x1261 ; 0x801261 296d2: 50 91 62 12 lds r21, 0x1262 ; 0x801262 296d6: 60 91 63 12 lds r22, 0x1263 ; 0x801263 296da: 70 91 64 12 lds r23, 0x1264 ; 0x801264 296de: 4d 83 std Y+5, r20 ; 0x05 296e0: 5e 83 std Y+6, r21 ; 0x06 296e2: 6f 83 std Y+7, r22 ; 0x07 296e4: 78 87 std Y+8, r23 ; 0x08 296e6: 89 83 std Y+1, r24 ; 0x01 296e8: 9a 83 std Y+2, r25 ; 0x02 296ea: ab 83 std Y+3, r26 ; 0x03 296ec: bc 83 std Y+4, r27 ; 0x04 ENABLE_STEPPER_DRIVER_INTERRUPT(); } void plan_set_position(float x, float y, float z, const float &e) { world2machine(x, y); 296ee: be 01 movw r22, r28 296f0: 6f 5f subi r22, 0xFF ; 255 296f2: 7f 4f sbci r23, 0xFF ; 255 296f4: ce 01 movw r24, r28 296f6: 05 96 adiw r24, 0x05 ; 5 296f8: 0e 94 76 68 call 0xd0ec ; 0xd0ec position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]); 296fc: 4d 80 ldd r4, Y+5 ; 0x05 296fe: 5e 80 ldd r5, Y+6 ; 0x06 29700: 6f 80 ldd r6, Y+7 ; 0x07 29702: 78 84 ldd r7, Y+8 ; 0x08 29704: 20 91 6b 0d lds r18, 0x0D6B ; 0x800d6b 29708: 30 91 6c 0d lds r19, 0x0D6C ; 0x800d6c 2970c: 40 91 6d 0d lds r20, 0x0D6D ; 0x800d6d 29710: 50 91 6e 0d lds r21, 0x0D6E ; 0x800d6e 29714: c3 01 movw r24, r6 29716: b2 01 movw r22, r4 29718: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2971c: 0f 94 45 a8 call 0x3508a ; 0x3508a 29720: 60 93 3c 06 sts 0x063C, r22 ; 0x80063c 29724: 70 93 3d 06 sts 0x063D, r23 ; 0x80063d 29728: 80 93 3e 06 sts 0x063E, r24 ; 0x80063e 2972c: 90 93 3f 06 sts 0x063F, r25 ; 0x80063f position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); 29730: 89 80 ldd r8, Y+1 ; 0x01 29732: 9a 80 ldd r9, Y+2 ; 0x02 29734: ab 80 ldd r10, Y+3 ; 0x03 29736: bc 80 ldd r11, Y+4 ; 0x04 29738: 20 91 6f 0d lds r18, 0x0D6F ; 0x800d6f 2973c: 30 91 70 0d lds r19, 0x0D70 ; 0x800d70 29740: 40 91 71 0d lds r20, 0x0D71 ; 0x800d71 29744: 50 91 72 0d lds r21, 0x0D72 ; 0x800d72 29748: c5 01 movw r24, r10 2974a: b4 01 movw r22, r8 2974c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29750: 0f 94 45 a8 call 0x3508a ; 0x3508a 29754: 60 93 40 06 sts 0x0640, r22 ; 0x800640 29758: 70 93 41 06 sts 0x0641, r23 ; 0x800641 2975c: 80 93 42 06 sts 0x0642, r24 ; 0x800642 29760: 90 93 43 06 sts 0x0643, r25 ; 0x800643 #ifdef MESH_BED_LEVELING position[Z_AXIS] = mbl.active ? 29764: 80 91 09 13 lds r24, 0x1309 ; 0x801309 29768: 88 23 and r24, r24 2976a: 09 f4 brne .+2 ; 0x2976e 2976c: 8c c0 rjmp .+280 ; 0x29886 lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) : 2976e: a5 01 movw r20, r10 29770: 94 01 movw r18, r8 29772: c3 01 movw r24, r6 29774: b2 01 movw r22, r4 29776: 0f 94 78 91 call 0x322f0 ; 0x322f0 2977a: 9b 01 movw r18, r22 2977c: ac 01 movw r20, r24 2977e: c7 01 movw r24, r14 29780: b6 01 movw r22, r12 29782: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 29786: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 2978a: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 2978e: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 29792: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 lround(z*cs.axis_steps_per_mm[Z_AXIS]); 29796: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> world2machine(x, y); position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]); position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); #ifdef MESH_BED_LEVELING position[Z_AXIS] = mbl.active ? 2979a: 0f 94 45 a8 call 0x3508a ; 0x3508a 2979e: 60 93 44 06 sts 0x0644, r22 ; 0x800644 297a2: 70 93 45 06 sts 0x0645, r23 ; 0x800645 297a6: 80 93 46 06 sts 0x0646, r24 ; 0x800646 297aa: 90 93 47 06 sts 0x0647, r25 ; 0x800647 lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) : lround(z*cs.axis_steps_per_mm[Z_AXIS]); #else position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); #endif // ENABLE_MESH_BED_LEVELING position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]); 297ae: 80 91 6d 12 lds r24, 0x126D ; 0x80126d 297b2: 90 91 6e 12 lds r25, 0x126E ; 0x80126e 297b6: a0 91 6f 12 lds r26, 0x126F ; 0x80126f 297ba: b0 91 70 12 lds r27, 0x1270 ; 0x801270 297be: 89 87 std Y+9, r24 ; 0x09 297c0: 9a 87 std Y+10, r25 ; 0x0a 297c2: ab 87 std Y+11, r26 ; 0x0b 297c4: bc 87 std Y+12, r27 ; 0x0c 297c6: 20 91 77 0d lds r18, 0x0D77 ; 0x800d77 297ca: 30 91 78 0d lds r19, 0x0D78 ; 0x800d78 297ce: 40 91 79 0d lds r20, 0x0D79 ; 0x800d79 297d2: 50 91 7a 0d lds r21, 0x0D7A ; 0x800d7a 297d6: bc 01 movw r22, r24 297d8: cd 01 movw r24, r26 297da: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 297de: 0f 94 45 a8 call 0x3508a ; 0x3508a 297e2: 60 93 48 06 sts 0x0648, r22 ; 0x800648 297e6: 70 93 49 06 sts 0x0649, r23 ; 0x800649 297ea: 80 93 4a 06 sts 0x064A, r24 ; 0x80064a 297ee: 90 93 4b 06 sts 0x064B, r25 ; 0x80064b #ifdef LIN_ADVANCE position_float[X_AXIS] = x; 297f2: 40 92 36 04 sts 0x0436, r4 ; 0x800436 297f6: 50 92 37 04 sts 0x0437, r5 ; 0x800437 297fa: 60 92 38 04 sts 0x0438, r6 ; 0x800438 297fe: 70 92 39 04 sts 0x0439, r7 ; 0x800439 position_float[Y_AXIS] = y; 29802: 80 92 3a 04 sts 0x043A, r8 ; 0x80043a 29806: 90 92 3b 04 sts 0x043B, r9 ; 0x80043b 2980a: a0 92 3c 04 sts 0x043C, r10 ; 0x80043c 2980e: b0 92 3d 04 sts 0x043D, r11 ; 0x80043d position_float[Z_AXIS] = z; 29812: c0 92 3e 04 sts 0x043E, r12 ; 0x80043e 29816: d0 92 3f 04 sts 0x043F, r13 ; 0x80043f 2981a: e0 92 40 04 sts 0x0440, r14 ; 0x800440 2981e: f0 92 41 04 sts 0x0441, r15 ; 0x800441 position_float[E_AXIS] = e; 29822: 89 85 ldd r24, Y+9 ; 0x09 29824: 9a 85 ldd r25, Y+10 ; 0x0a 29826: ab 85 ldd r26, Y+11 ; 0x0b 29828: bc 85 ldd r27, Y+12 ; 0x0c 2982a: 80 93 42 04 sts 0x0442, r24 ; 0x800442 2982e: 90 93 43 04 sts 0x0443, r25 ; 0x800443 29832: a0 93 44 04 sts 0x0444, r26 ; 0x800444 29836: b0 93 45 04 sts 0x0445, r27 ; 0x800445 #endif st_set_position(position); 2983a: 0f 94 65 79 call 0x2f2ca ; 0x2f2ca previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. 2983e: 10 92 22 04 sts 0x0422, r1 ; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445> 29842: 10 92 23 04 sts 0x0423, r1 ; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1> 29846: 10 92 24 04 sts 0x0424, r1 ; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2> 2984a: 10 92 25 04 sts 0x0425, r1 ; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3> memset(previous_speed, 0, sizeof(previous_speed)); 2984e: e6 e2 ldi r30, 0x26 ; 38 29850: f4 e0 ldi r31, 0x04 ; 4 29852: 80 e1 ldi r24, 0x10 ; 16 29854: df 01 movw r26, r30 29856: 1d 92 st X+, r1 29858: 8a 95 dec r24 2985a: e9 f7 brne .-6 ; 0x29856 plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate); } void plan_set_position_curposXYZE(){ plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); } 2985c: 2c 96 adiw r28, 0x0c ; 12 2985e: 0f b6 in r0, 0x3f ; 63 29860: f8 94 cli 29862: de bf out 0x3e, r29 ; 62 29864: 0f be out 0x3f, r0 ; 63 29866: cd bf out 0x3d, r28 ; 61 29868: df 91 pop r29 2986a: cf 91 pop r28 2986c: ff 90 pop r15 2986e: ef 90 pop r14 29870: df 90 pop r13 29872: cf 90 pop r12 29874: bf 90 pop r11 29876: af 90 pop r10 29878: 9f 90 pop r9 2987a: 8f 90 pop r8 2987c: 7f 90 pop r7 2987e: 6f 90 pop r6 29880: 5f 90 pop r5 29882: 4f 90 pop r4 29884: 08 95 ret position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]); position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); #ifdef MESH_BED_LEVELING position[Z_AXIS] = mbl.active ? lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) : lround(z*cs.axis_steps_per_mm[Z_AXIS]); 29886: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 2988a: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 2988e: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 29892: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 29896: c7 01 movw r24, r14 29898: b6 01 movw r22, r12 2989a: 7d cf rjmp .-262 ; 0x29796 0002989c : void plan_buffer_line_curposXYZE(float feed_rate) { plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate); } void plan_buffer_line_destinationXYZE(float feed_rate) { 2989c: 8f 92 push r8 2989e: 9f 92 push r9 298a0: af 92 push r10 298a2: bf 92 push r11 298a4: cf 92 push r12 298a6: df 92 push r13 298a8: ef 92 push r14 298aa: ff 92 push r15 298ac: 0f 93 push r16 298ae: 1f 93 push r17 298b0: 4b 01 movw r8, r22 298b2: 5c 01 movw r10, r24 plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate); 298b4: e9 e2 ldi r30, 0x29 ; 41 298b6: f6 e0 ldi r31, 0x06 ; 6 298b8: e0 84 ldd r14, Z+8 ; 0x08 298ba: f1 84 ldd r15, Z+9 ; 0x09 298bc: 02 85 ldd r16, Z+10 ; 0x0a 298be: 13 85 ldd r17, Z+11 ; 0x0b 298c0: 24 81 ldd r18, Z+4 ; 0x04 298c2: 35 81 ldd r19, Z+5 ; 0x05 298c4: 46 81 ldd r20, Z+6 ; 0x06 298c6: 57 81 ldd r21, Z+7 ; 0x07 298c8: 60 81 ld r22, Z 298ca: 71 81 ldd r23, Z+1 ; 0x01 298cc: 82 81 ldd r24, Z+2 ; 0x02 298ce: 93 81 ldd r25, Z+3 ; 0x03 298d0: 1f 92 push r1 298d2: 1f 92 push r1 298d4: 1f 92 push r1 298d6: 1f 92 push r1 298d8: e5 e3 ldi r30, 0x35 ; 53 298da: ce 2e mov r12, r30 298dc: e6 e0 ldi r30, 0x06 ; 6 298de: de 2e mov r13, r30 298e0: 0f 94 33 3d call 0x27a66 ; 0x27a66 298e4: 0f 90 pop r0 298e6: 0f 90 pop r0 298e8: 0f 90 pop r0 298ea: 0f 90 pop r0 } 298ec: 1f 91 pop r17 298ee: 0f 91 pop r16 298f0: ff 90 pop r15 298f2: ef 90 pop r14 298f4: df 90 pop r13 298f6: cf 90 pop r12 298f8: bf 90 pop r11 298fa: af 90 pop r10 298fc: 9f 90 pop r9 298fe: 8f 90 pop r8 29900: 08 95 ret 00029902 : // Reset position sync requests plan_reset_next_e_queue = false; plan_reset_next_e_sched = false; } void plan_buffer_line_curposXYZE(float feed_rate) { 29902: 8f 92 push r8 29904: 9f 92 push r9 29906: af 92 push r10 29908: bf 92 push r11 2990a: cf 92 push r12 2990c: df 92 push r13 2990e: ef 92 push r14 29910: ff 92 push r15 29912: 0f 93 push r16 29914: 1f 93 push r17 29916: 4b 01 movw r8, r22 29918: 5c 01 movw r10, r24 plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate); 2991a: e1 e6 ldi r30, 0x61 ; 97 2991c: f2 e1 ldi r31, 0x12 ; 18 2991e: e0 84 ldd r14, Z+8 ; 0x08 29920: f1 84 ldd r15, Z+9 ; 0x09 29922: 02 85 ldd r16, Z+10 ; 0x0a 29924: 13 85 ldd r17, Z+11 ; 0x0b 29926: 24 81 ldd r18, Z+4 ; 0x04 29928: 35 81 ldd r19, Z+5 ; 0x05 2992a: 46 81 ldd r20, Z+6 ; 0x06 2992c: 57 81 ldd r21, Z+7 ; 0x07 2992e: 60 81 ld r22, Z 29930: 71 81 ldd r23, Z+1 ; 0x01 29932: 82 81 ldd r24, Z+2 ; 0x02 29934: 93 81 ldd r25, Z+3 ; 0x03 29936: 1f 92 push r1 29938: 1f 92 push r1 2993a: 1f 92 push r1 2993c: 1f 92 push r1 2993e: ed e6 ldi r30, 0x6D ; 109 29940: ce 2e mov r12, r30 29942: e2 e1 ldi r30, 0x12 ; 18 29944: de 2e mov r13, r30 29946: 0f 94 33 3d call 0x27a66 ; 0x27a66 2994a: 0f 90 pop r0 2994c: 0f 90 pop r0 2994e: 0f 90 pop r0 29950: 0f 90 pop r0 } 29952: 1f 91 pop r17 29954: 0f 91 pop r16 29956: ff 90 pop r15 29958: ef 90 pop r14 2995a: df 90 pop r13 2995c: cf 90 pop r12 2995e: bf 90 pop r11 29960: af 90 pop r10 29962: 9f 90 pop r9 29964: 8f 90 pop r8 29966: 08 95 ret 00029968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]>: } } static void _lcd_move(const char *name, uint8_t axis, int min, int max) { 29968: 2f 92 push r2 2996a: 3f 92 push r3 2996c: 4f 92 push r4 2996e: 5f 92 push r5 29970: 6f 92 push r6 29972: 7f 92 push r7 29974: 9f 92 push r9 29976: af 92 push r10 29978: bf 92 push r11 2997a: cf 92 push r12 2997c: df 92 push r13 2997e: ef 92 push r14 29980: ff 92 push r15 29982: 0f 93 push r16 29984: 1f 93 push r17 29986: cf 93 push r28 29988: df 93 push r29 if (homing_flag || mesh_bed_leveling_flag) 2998a: 70 91 71 12 lds r23, 0x1271 ; 0x801271 2998e: 71 11 cpse r23, r1 29990: 04 c0 rjmp .+8 ; 0x2999a <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x32> 29992: 70 91 72 12 lds r23, 0x1272 ; 0x801272 29996: 77 23 and r23, r23 29998: 99 f0 breq .+38 ; 0x299c0 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x58> lcd_set_cursor(0, 1); menu_draw_float31(name, current_position[axis]); } if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious); menu_back_if_clicked(); } 2999a: df 91 pop r29 2999c: cf 91 pop r28 2999e: 1f 91 pop r17 299a0: 0f 91 pop r16 299a2: ff 90 pop r15 299a4: ef 90 pop r14 299a6: df 90 pop r13 299a8: cf 90 pop r12 299aa: bf 90 pop r11 299ac: af 90 pop r10 299ae: 9f 90 pop r9 299b0: 7f 90 pop r7 299b2: 6f 90 pop r6 299b4: 5f 90 pop r5 299b6: 4f 90 pop r4 299b8: 3f 90 pop r3 299ba: 2f 90 pop r2 static void _lcd_move(const char *name, uint8_t axis, int min, int max) { if (homing_flag || mesh_bed_leveling_flag) { // printer entered a new state where axis move is forbidden menu_back(); 299bc: 0c 94 1b 63 jmp 0xc636 ; 0xc636 bool initialized; // 1byte bool endstopsEnabledPrevious; // 1byte } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (!_md->initialized) 299c0: 70 91 96 03 lds r23, 0x0396 ; 0x800396 299c4: 71 11 cpse r23, r1 299c6: 09 c0 rjmp .+18 ; 0x299da <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x72> return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 299c8: 70 91 77 02 lds r23, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> check_endstops = check; 299cc: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> { _md->endstopsEnabledPrevious = enable_endstops(false); 299d0: 70 93 97 03 sts 0x0397, r23 ; 0x800397 _md->initialized = true; 299d4: 71 e0 ldi r23, 0x01 ; 1 299d6: 70 93 96 03 sts 0x0396, r23 ; 0x800396 299da: 19 01 movw r2, r18 299dc: 6a 01 movw r12, r20 299de: c6 2f mov r28, r22 299e0: d9 2f mov r29, r25 299e2: 98 2e mov r9, r24 } if (lcd_encoder != 0) 299e4: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 299e8: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 299ec: 89 2b or r24, r25 299ee: 09 f4 brne .+2 ; 0x299f2 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x8a> 299f0: 71 c0 rjmp .+226 ; 0x29ad4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x16c> { refresh_cmd_timeout(); 299f2: 0e 94 41 65 call 0xca82 ; 0xca82 } FORCE_INLINE bool planner_queue_full() { uint8_t next_block_index = block_buffer_head; 299f6: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e if (++ next_block_index == BLOCK_BUFFER_SIZE) 299fa: 8f 5f subi r24, 0xFF ; 255 299fc: 80 31 cpi r24, 0x10 ; 16 299fe: 09 f4 brne .+2 ; 0x29a02 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x9a> next_block_index = 0; 29a00: 80 e0 ldi r24, 0x00 ; 0 return block_buffer_tail == next_block_index; 29a02: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f if (! planner_queue_full()) 29a06: 98 17 cp r25, r24 29a08: 09 f4 brne .+2 ; 0x29a0c <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0xa4> 29a0a: 64 c0 rjmp .+200 ; 0x29ad4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x16c> { current_position[axis] += lcd_encoder; 29a0c: 84 e0 ldi r24, 0x04 ; 4 29a0e: c8 9f mul r28, r24 29a10: 80 01 movw r16, r0 29a12: 11 24 eor r1, r1 29a14: f8 01 movw r30, r16 29a16: ef 59 subi r30, 0x9F ; 159 29a18: fd 4e sbci r31, 0xED ; 237 29a1a: 5f 01 movw r10, r30 29a1c: 60 91 1e 06 lds r22, 0x061E ; 0x80061e 29a20: 70 91 1f 06 lds r23, 0x061F ; 0x80061f 29a24: 07 2e mov r0, r23 29a26: 00 0c add r0, r0 29a28: 88 0b sbc r24, r24 29a2a: 99 0b sbc r25, r25 29a2c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 29a30: f5 01 movw r30, r10 29a32: 20 81 ld r18, Z 29a34: 31 81 ldd r19, Z+1 ; 0x01 29a36: 42 81 ldd r20, Z+2 ; 0x02 29a38: 53 81 ldd r21, Z+3 ; 0x03 29a3a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 29a3e: 2b 01 movw r4, r22 29a40: 3c 01 movw r6, r24 if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; 29a42: b6 01 movw r22, r12 29a44: dd 0c add r13, r13 29a46: 88 0b sbc r24, r24 29a48: 99 0b sbc r25, r25 29a4a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 29a4e: 6b 01 movw r12, r22 29a50: 7c 01 movw r14, r24 29a52: ac 01 movw r20, r24 29a54: 9b 01 movw r18, r22 29a56: c3 01 movw r24, r6 29a58: b2 01 movw r22, r4 29a5a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 29a5e: f5 01 movw r30, r10 29a60: 87 fd sbrc r24, 7 29a62: 7d c0 rjmp .+250 ; 0x29b5e <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1f6> if (lcd_encoder != 0) { refresh_cmd_timeout(); if (! planner_queue_full()) { current_position[axis] += lcd_encoder; 29a64: 40 82 st Z, r4 29a66: 51 82 std Z+1, r5 ; 0x01 29a68: 62 82 std Z+2, r6 ; 0x02 29a6a: 73 82 std Z+3, r7 ; 0x03 if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; if (max_software_endstops && current_position[axis] > max) current_position[axis] = max; 29a6c: b1 01 movw r22, r2 29a6e: 33 0c add r3, r3 29a70: 88 0b sbc r24, r24 29a72: 99 0b sbc r25, r25 29a74: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 29a78: 2b 01 movw r4, r22 29a7a: 3c 01 movw r6, r24 29a7c: c8 01 movw r24, r16 29a7e: 8f 59 subi r24, 0x9F ; 159 29a80: 9d 4e sbci r25, 0xED ; 237 29a82: 7c 01 movw r14, r24 29a84: a3 01 movw r20, r6 29a86: 92 01 movw r18, r4 29a88: fc 01 movw r30, r24 29a8a: 60 81 ld r22, Z 29a8c: 71 81 ldd r23, Z+1 ; 0x01 29a8e: 82 81 ldd r24, Z+2 ; 0x02 29a90: 93 81 ldd r25, Z+3 ; 0x03 29a92: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 29a96: 18 16 cp r1, r24 29a98: 2c f4 brge .+10 ; 0x29aa4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x13c> 29a9a: f7 01 movw r30, r14 29a9c: 40 82 st Z, r4 29a9e: 51 82 std Z+1, r5 ; 0x01 29aa0: 62 82 std Z+2, r6 ; 0x02 29aa2: 73 82 std Z+3, r7 ; 0x03 lcd_encoder = 0; 29aa4: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 29aa8: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 29aac: 65 e6 ldi r22, 0x65 ; 101 29aae: 72 e1 ldi r23, 0x12 ; 18 29ab0: 81 e6 ldi r24, 0x61 ; 97 29ab2: 92 e1 ldi r25, 0x12 ; 18 29ab4: 0e 94 1e 69 call 0xd23c ; 0xd23c plan_buffer_line_curposXYZE(get_feedrate_mm_s(manual_feedrate[axis])); 29ab8: f8 01 movw r30, r16 29aba: e0 52 subi r30, 0x20 ; 32 29abc: fd 4f sbci r31, 0xFD ; 253 29abe: 60 81 ld r22, Z 29ac0: 71 81 ldd r23, Z+1 ; 0x01 29ac2: 82 81 ldd r24, Z+2 ; 0x02 29ac4: 93 81 ldd r25, Z+3 ; 0x03 29ac6: 0e 94 45 65 call 0xca8a ; 0xca8a 29aca: 0f 94 81 4c call 0x29902 ; 0x29902 lcd_draw_update = 1; 29ace: 81 e0 ldi r24, 0x01 ; 1 29ad0: 80 93 59 02 sts 0x0259, r24 ; 0x800259 } } if (lcd_draw_update) 29ad4: 80 91 59 02 lds r24, 0x0259 ; 0x800259 29ad8: 88 23 and r24, r24 29ada: 11 f1 breq .+68 ; 0x29b20 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1b8> { lcd_set_cursor(0, 1); 29adc: 61 e0 ldi r22, 0x01 ; 1 29ade: 80 e0 ldi r24, 0x00 ; 0 29ae0: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 menu_draw_float31(name, current_position[axis]); 29ae4: 84 e0 ldi r24, 0x04 ; 4 29ae6: c8 9f mul r28, r24 29ae8: f0 01 movw r30, r0 29aea: 11 24 eor r1, r1 29aec: ef 59 subi r30, 0x9F ; 159 29aee: fd 4e sbci r31, 0xED ; 237 //! The text needs to come with a colon ":", this function does not append it anymore. //! That resulted in a much shorter implementation (234628B -> 234476B) //! There are similar functions around which may be shortened in a similar way void menu_draw_float31(const char* str, float val) { lcd_printf_P(menu_fmt_float31, str, val); 29af0: 83 81 ldd r24, Z+3 ; 0x03 29af2: 8f 93 push r24 29af4: 82 81 ldd r24, Z+2 ; 0x02 29af6: 8f 93 push r24 29af8: 81 81 ldd r24, Z+1 ; 0x01 29afa: 8f 93 push r24 29afc: 80 81 ld r24, Z 29afe: 8f 93 push r24 29b00: df 93 push r29 29b02: 9f 92 push r9 29b04: 8a e5 ldi r24, 0x5A ; 90 29b06: 92 e8 ldi r25, 0x82 ; 130 29b08: 9f 93 push r25 29b0a: 8f 93 push r24 29b0c: 0e 94 0b 6f call 0xde16 ; 0xde16 29b10: ed b7 in r30, 0x3d ; 61 29b12: fe b7 in r31, 0x3e ; 62 29b14: 38 96 adiw r30, 0x08 ; 8 29b16: 0f b6 in r0, 0x3f ; 63 29b18: f8 94 cli 29b1a: fe bf out 0x3e, r31 ; 62 29b1c: 0f be out 0x3f, r0 ; 63 29b1e: ed bf out 0x3d, r30 ; 61 } if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious); 29b20: 80 91 c4 03 lds r24, 0x03C4 ; 0x8003c4 29b24: 81 11 cpse r24, r1 29b26: 04 c0 rjmp .+8 ; 0x29b30 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1c8> 29b28: 80 91 95 03 lds r24, 0x0395 ; 0x800395 29b2c: 88 23 and r24, r24 29b2e: 21 f0 breq .+8 ; 0x29b38 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1d0> 29b30: 80 91 97 03 lds r24, 0x0397 ; 0x800397 29b34: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> menu_back_if_clicked(); } 29b38: df 91 pop r29 29b3a: cf 91 pop r28 29b3c: 1f 91 pop r17 29b3e: 0f 91 pop r16 29b40: ff 90 pop r15 29b42: ef 90 pop r14 29b44: df 90 pop r13 29b46: cf 90 pop r12 29b48: bf 90 pop r11 29b4a: af 90 pop r10 29b4c: 9f 90 pop r9 29b4e: 7f 90 pop r7 29b50: 6f 90 pop r6 29b52: 5f 90 pop r5 29b54: 4f 90 pop r4 29b56: 3f 90 pop r3 29b58: 2f 90 pop r2 { lcd_set_cursor(0, 1); menu_draw_float31(name, current_position[axis]); } if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious); menu_back_if_clicked(); 29b5a: 0c 94 06 74 jmp 0xe80c ; 0xe80c { refresh_cmd_timeout(); if (! planner_queue_full()) { current_position[axis] += lcd_encoder; if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; 29b5e: c0 82 st Z, r12 29b60: d1 82 std Z+1, r13 ; 0x01 29b62: e2 82 std Z+2, r14 ; 0x02 29b64: f3 82 std Z+3, r15 ; 0x03 29b66: 82 cf rjmp .-252 ; 0x29a6c <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x104> 00029b68 : #endif /* PLANNER_DIAGNOSTICS */ extern volatile uint32_t step_events_completed; // The number of step events executed in the current block void planner_reset_position() { 29b68: 4f 92 push r4 29b6a: 5f 92 push r5 29b6c: 6f 92 push r6 29b6e: 7f 92 push r7 29b70: 8f 92 push r8 29b72: 9f 92 push r9 29b74: af 92 push r10 29b76: bf 92 push r11 29b78: cf 92 push r12 29b7a: df 92 push r13 29b7c: ef 92 push r14 29b7e: ff 92 push r15 29b80: cf 93 push r28 // First update the planner's current position in the physical motor steps. position[X_AXIS] = st_get_position(X_AXIS); 29b82: 80 e0 ldi r24, 0x00 ; 0 29b84: 0f 94 d9 1a call 0x235b2 ; 0x235b2 29b88: 60 93 3c 06 sts 0x063C, r22 ; 0x80063c 29b8c: 70 93 3d 06 sts 0x063D, r23 ; 0x80063d 29b90: 80 93 3e 06 sts 0x063E, r24 ; 0x80063e 29b94: 90 93 3f 06 sts 0x063F, r25 ; 0x80063f position[Y_AXIS] = st_get_position(Y_AXIS); 29b98: 81 e0 ldi r24, 0x01 ; 1 29b9a: 0f 94 d9 1a call 0x235b2 ; 0x235b2 29b9e: 60 93 40 06 sts 0x0640, r22 ; 0x800640 29ba2: 70 93 41 06 sts 0x0641, r23 ; 0x800641 29ba6: 80 93 42 06 sts 0x0642, r24 ; 0x800642 29baa: 90 93 43 06 sts 0x0643, r25 ; 0x800643 position[Z_AXIS] = st_get_position(Z_AXIS); 29bae: 82 e0 ldi r24, 0x02 ; 2 29bb0: 0f 94 d9 1a call 0x235b2 ; 0x235b2 29bb4: 60 93 44 06 sts 0x0644, r22 ; 0x800644 29bb8: 70 93 45 06 sts 0x0645, r23 ; 0x800645 29bbc: 80 93 46 06 sts 0x0646, r24 ; 0x800646 29bc0: 90 93 47 06 sts 0x0647, r25 ; 0x800647 position[E_AXIS] = st_get_position(E_AXIS); 29bc4: 83 e0 ldi r24, 0x03 ; 3 29bc6: 0f 94 d9 1a call 0x235b2 ; 0x235b2 29bca: 60 93 48 06 sts 0x0648, r22 ; 0x800648 29bce: 70 93 49 06 sts 0x0649, r23 ; 0x800649 29bd2: 80 93 4a 06 sts 0x064A, r24 ; 0x80064a 29bd6: 90 93 4b 06 sts 0x064B, r25 ; 0x80064b // Second update the current position of the front end. current_position[X_AXIS] = st_get_position_mm(X_AXIS); 29bda: 80 e0 ldi r24, 0x00 ; 0 29bdc: 0f 94 e7 1a call 0x235ce ; 0x235ce 29be0: 60 93 61 12 sts 0x1261, r22 ; 0x801261 29be4: 70 93 62 12 sts 0x1262, r23 ; 0x801262 29be8: 80 93 63 12 sts 0x1263, r24 ; 0x801263 29bec: 90 93 64 12 sts 0x1264, r25 ; 0x801264 current_position[Y_AXIS] = st_get_position_mm(Y_AXIS); 29bf0: 81 e0 ldi r24, 0x01 ; 1 29bf2: 0f 94 e7 1a call 0x235ce ; 0x235ce 29bf6: 60 93 65 12 sts 0x1265, r22 ; 0x801265 29bfa: 70 93 66 12 sts 0x1266, r23 ; 0x801266 29bfe: 80 93 67 12 sts 0x1267, r24 ; 0x801267 29c02: 90 93 68 12 sts 0x1268, r25 ; 0x801268 current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); 29c06: 82 e0 ldi r24, 0x02 ; 2 29c08: 0f 94 e7 1a call 0x235ce ; 0x235ce 29c0c: 60 93 69 12 sts 0x1269, r22 ; 0x801269 29c10: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 29c14: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 29c18: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c current_position[E_AXIS] = st_get_position_mm(E_AXIS); 29c1c: 83 e0 ldi r24, 0x03 ; 3 29c1e: 0f 94 e7 1a call 0x235ce ; 0x235ce 29c22: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 29c26: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 29c2a: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 29c2e: 90 93 70 12 sts 0x1270, r25 ; 0x801270 // Apply the mesh bed leveling correction to the Z axis. #ifdef MESH_BED_LEVELING if (mbl.active) { 29c32: 80 91 09 13 lds r24, 0x1309 ; 0x801309 29c36: 88 23 and r24, r24 29c38: 31 f1 breq .+76 ; 0x29c86 #if 1 // Undo the bed level correction so the current Z position is reversible wrt. the machine coordinates. // This does not necessary mean that the Z position will be the same as linearly interpolated from the source G-code line. current_position[Z_AXIS] -= mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS]); 29c3a: 20 91 65 12 lds r18, 0x1265 ; 0x801265 29c3e: 30 91 66 12 lds r19, 0x1266 ; 0x801266 29c42: 40 91 67 12 lds r20, 0x1267 ; 0x801267 29c46: 50 91 68 12 lds r21, 0x1268 ; 0x801268 29c4a: 60 91 61 12 lds r22, 0x1261 ; 0x801261 29c4e: 70 91 62 12 lds r23, 0x1262 ; 0x801262 29c52: 80 91 63 12 lds r24, 0x1263 ; 0x801263 29c56: 90 91 64 12 lds r25, 0x1264 ; 0x801264 29c5a: 0f 94 78 91 call 0x322f0 ; 0x322f0 29c5e: 9b 01 movw r18, r22 29c60: ac 01 movw r20, r24 29c62: 60 91 69 12 lds r22, 0x1269 ; 0x801269 29c66: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 29c6a: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 29c6e: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 29c72: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 29c76: 60 93 69 12 sts 0x1269, r22 ; 0x801269 29c7a: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 29c7e: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 29c82: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c } } inline void machine2world(float &x, float &y) { if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { 29c86: c0 91 a2 04 lds r28, 0x04A2 ; 0x8004a2 29c8a: cc 23 and r28, r28 29c8c: 09 f4 brne .+2 ; 0x29c90 29c8e: 9a c0 rjmp .+308 ; 0x29dc4 // No correction. } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { 29c90: c0 ff sbrs r28, 0 29c92: 34 c0 rjmp .+104 ; 0x29cfc // Then add the offset. x -= world2machine_shift[0]; 29c94: 20 91 9a 04 lds r18, 0x049A ; 0x80049a 29c98: 30 91 9b 04 lds r19, 0x049B ; 0x80049b 29c9c: 40 91 9c 04 lds r20, 0x049C ; 0x80049c 29ca0: 50 91 9d 04 lds r21, 0x049D ; 0x80049d 29ca4: 60 91 61 12 lds r22, 0x1261 ; 0x801261 29ca8: 70 91 62 12 lds r23, 0x1262 ; 0x801262 29cac: 80 91 63 12 lds r24, 0x1263 ; 0x801263 29cb0: 90 91 64 12 lds r25, 0x1264 ; 0x801264 29cb4: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 29cb8: 60 93 61 12 sts 0x1261, r22 ; 0x801261 29cbc: 70 93 62 12 sts 0x1262, r23 ; 0x801262 29cc0: 80 93 63 12 sts 0x1263, r24 ; 0x801263 29cc4: 90 93 64 12 sts 0x1264, r25 ; 0x801264 y -= world2machine_shift[1]; 29cc8: 20 91 9e 04 lds r18, 0x049E ; 0x80049e 29ccc: 30 91 9f 04 lds r19, 0x049F ; 0x80049f 29cd0: 40 91 a0 04 lds r20, 0x04A0 ; 0x8004a0 29cd4: 50 91 a1 04 lds r21, 0x04A1 ; 0x8004a1 29cd8: 60 91 65 12 lds r22, 0x1265 ; 0x801265 29cdc: 70 91 66 12 lds r23, 0x1266 ; 0x801266 29ce0: 80 91 67 12 lds r24, 0x1267 ; 0x801267 29ce4: 90 91 68 12 lds r25, 0x1268 ; 0x801268 29ce8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 29cec: 60 93 65 12 sts 0x1265, r22 ; 0x801265 29cf0: 70 93 66 12 sts 0x1266, r23 ; 0x801266 29cf4: 80 93 67 12 sts 0x1267, r24 ; 0x801267 29cf8: 90 93 68 12 sts 0x1268, r25 ; 0x801268 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { 29cfc: c1 ff sbrs r28, 1 29cfe: 62 c0 rjmp .+196 ; 0x29dc4 // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; 29d00: 80 90 61 12 lds r8, 0x1261 ; 0x801261 29d04: 90 90 62 12 lds r9, 0x1262 ; 0x801262 29d08: a0 90 63 12 lds r10, 0x1263 ; 0x801263 29d0c: b0 90 64 12 lds r11, 0x1264 ; 0x801264 29d10: c0 90 65 12 lds r12, 0x1265 ; 0x801265 29d14: d0 90 66 12 lds r13, 0x1266 ; 0x801266 29d18: e0 90 67 12 lds r14, 0x1267 ; 0x801267 29d1c: f0 90 68 12 lds r15, 0x1268 ; 0x801268 float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; 29d20: 20 91 92 04 lds r18, 0x0492 ; 0x800492 29d24: 30 91 93 04 lds r19, 0x0493 ; 0x800493 29d28: 40 91 94 04 lds r20, 0x0494 ; 0x800494 29d2c: 50 91 95 04 lds r21, 0x0495 ; 0x800495 29d30: c5 01 movw r24, r10 29d32: b4 01 movw r22, r8 29d34: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29d38: 2b 01 movw r4, r22 29d3a: 3c 01 movw r6, r24 29d3c: 20 91 96 04 lds r18, 0x0496 ; 0x800496 29d40: 30 91 97 04 lds r19, 0x0497 ; 0x800497 29d44: 40 91 98 04 lds r20, 0x0498 ; 0x800498 29d48: 50 91 99 04 lds r21, 0x0499 ; 0x800499 29d4c: c7 01 movw r24, r14 29d4e: b6 01 movw r22, r12 29d50: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29d54: 9b 01 movw r18, r22 29d56: ac 01 movw r20, r24 29d58: c3 01 movw r24, r6 29d5a: b2 01 movw r22, r4 29d5c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 29d60: 2b 01 movw r4, r22 29d62: 3c 01 movw r6, r24 x -= world2machine_shift[0]; y -= world2machine_shift[1]; } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; 29d64: 20 91 8a 04 lds r18, 0x048A ; 0x80048a 29d68: 30 91 8b 04 lds r19, 0x048B ; 0x80048b 29d6c: 40 91 8c 04 lds r20, 0x048C ; 0x80048c 29d70: 50 91 8d 04 lds r21, 0x048D ; 0x80048d 29d74: c5 01 movw r24, r10 29d76: b4 01 movw r22, r8 29d78: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29d7c: 4b 01 movw r8, r22 29d7e: 5c 01 movw r10, r24 29d80: 20 91 8e 04 lds r18, 0x048E ; 0x80048e 29d84: 30 91 8f 04 lds r19, 0x048F ; 0x80048f 29d88: 40 91 90 04 lds r20, 0x0490 ; 0x800490 29d8c: 50 91 91 04 lds r21, 0x0491 ; 0x800491 29d90: c7 01 movw r24, r14 29d92: b6 01 movw r22, r12 29d94: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 29d98: 9b 01 movw r18, r22 29d9a: ac 01 movw r20, r24 29d9c: c5 01 movw r24, r10 29d9e: b4 01 movw r22, r8 29da0: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; x = out_x; 29da4: 60 93 61 12 sts 0x1261, r22 ; 0x801261 29da8: 70 93 62 12 sts 0x1262, r23 ; 0x801262 29dac: 80 93 63 12 sts 0x1263, r24 ; 0x801263 29db0: 90 93 64 12 sts 0x1264, r25 ; 0x801264 y = out_y; 29db4: 40 92 65 12 sts 0x1265, r4 ; 0x801265 29db8: 50 92 66 12 sts 0x1266, r5 ; 0x801266 29dbc: 60 92 67 12 sts 0x1267, r6 ; 0x801267 29dc0: 70 92 68 12 sts 0x1268, r7 ; 0x801268 } #endif // Apply inverse world correction matrix. machine2world(current_position[X_AXIS], current_position[Y_AXIS]); set_destination_to_current(); 29dc4: 0e 94 ae 66 call 0xcd5c ; 0xcd5c #ifdef LIN_ADVANCE memcpy(position_float, current_position, sizeof(position_float)); 29dc8: 80 e1 ldi r24, 0x10 ; 16 29dca: e1 e6 ldi r30, 0x61 ; 97 29dcc: f2 e1 ldi r31, 0x12 ; 18 29dce: a6 e3 ldi r26, 0x36 ; 54 29dd0: b4 e0 ldi r27, 0x04 ; 4 29dd2: 01 90 ld r0, Z+ 29dd4: 0d 92 st X+, r0 29dd6: 8a 95 dec r24 29dd8: e1 f7 brne .-8 ; 0x29dd2 #endif } 29dda: cf 91 pop r28 29ddc: ff 90 pop r15 29dde: ef 90 pop r14 29de0: df 90 pop r13 29de2: cf 90 pop r12 29de4: bf 90 pop r11 29de6: af 90 pop r10 29de8: 9f 90 pop r9 29dea: 8f 90 pop r8 29dec: 7f 90 pop r7 29dee: 6f 90 pop r6 29df0: 5f 90 pop r5 29df2: 4f 90 pop r4 29df4: 08 95 ret 00029df6 : void planner_abort_hard() { // Abort the stepper routine and flush the planner queue. DISABLE_STEPPER_DRIVER_INTERRUPT(); 29df6: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 29dfa: 8d 7f andi r24, 0xFD ; 253 29dfc: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> // Now the front-end (the Marlin_main.cpp with its current_position) is out of sync. planner_reset_position(); 29e00: 0f 94 b4 4d call 0x29b68 ; 0x29b68 // Relay to planner wait routine that the current line shall be canceled. planner_aborted = true; 29e04: 81 e0 ldi r24, 0x01 ; 1 29e06: 80 93 42 0d sts 0x0D42, r24 ; 0x800d42 } void quickStop() { DISABLE_STEPPER_DRIVER_INTERRUPT(); 29e0a: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 29e0e: 8d 7f andi r24, 0xFD ; 253 29e10: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> return(block); } // Returns true if the buffer has a queued block, false otherwise FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); 29e14: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 29e18: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f while (blocks_queued()) plan_discard_current_block(); 29e1c: 98 17 cp r25, r24 29e1e: 69 f0 breq .+26 ; 0x29e3a extern volatile uint8_t block_buffer_tail; // Called when the current block is no longer needed. Discards the block and makes the memory // available for new blocks. FORCE_INLINE void plan_discard_current_block() { if (block_buffer_head != block_buffer_tail) { 29e20: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 29e24: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 29e28: 98 17 cp r25, r24 29e2a: a1 f3 breq .-24 ; 0x29e14 block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 29e2c: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 29e30: 8f 5f subi r24, 0xFF ; 255 29e32: 8f 70 andi r24, 0x0F ; 15 29e34: 80 93 3f 0d sts 0x0D3F, r24 ; 0x800d3f 29e38: ed cf rjmp .-38 ; 0x29e14 current_block = NULL; 29e3a: 10 92 52 12 sts 0x1252, r1 ; 0x801252 29e3e: 10 92 51 12 sts 0x1251, r1 ; 0x801251 #ifdef LIN_ADVANCE nextAdvanceISR = ADV_NEVER; 29e42: 8f ef ldi r24, 0xFF ; 255 29e44: 9f ef ldi r25, 0xFF ; 255 29e46: 90 93 4d 04 sts 0x044D, r25 ; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1> 29e4a: 80 93 4c 04 sts 0x044C, r24 ; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439> current_adv_steps = 0; 29e4e: 10 92 49 04 sts 0x0449, r1 ; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1> 29e52: 10 92 48 04 sts 0x0448, r1 ; 0x800448 <_ZL17current_adv_steps.lto_priv.441> #endif st_reset_timer(); 29e56: 0f 94 4c 1b call 0x23698 ; 0x23698 ENABLE_STEPPER_DRIVER_INTERRUPT(); 29e5a: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 29e5e: 82 60 ori r24, 0x02 ; 2 29e60: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> // Clear the planner queue, reset and re-enable the stepper timer. quickStop(); // Resets planner junction speeds. Assumes start from rest. previous_nominal_speed = 0.0; 29e64: 10 92 22 04 sts 0x0422, r1 ; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445> 29e68: 10 92 23 04 sts 0x0423, r1 ; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1> 29e6c: 10 92 24 04 sts 0x0424, r1 ; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2> 29e70: 10 92 25 04 sts 0x0425, r1 ; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3> memset(previous_speed, 0, sizeof(previous_speed)); 29e74: e6 e2 ldi r30, 0x26 ; 38 29e76: f4 e0 ldi r31, 0x04 ; 4 29e78: 80 e1 ldi r24, 0x10 ; 16 29e7a: df 01 movw r26, r30 29e7c: 1d 92 st X+, r1 29e7e: 8a 95 dec r24 29e80: e9 f7 brne .-6 ; 0x29e7c // Reset position sync requests plan_reset_next_e_queue = false; 29e82: 10 92 21 04 sts 0x0421, r1 ; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443> plan_reset_next_e_sched = false; 29e86: 10 92 20 04 sts 0x0420, r1 ; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444> } 29e8a: 08 95 ret 00029e8c : pat9125_PID2 = 0xff; return 0; } static void pat9125_wr_reg(uint8_t addr, uint8_t data) { 29e8c: cf 93 push r28 29e8e: c6 2f mov r28, r22 } uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data) { if(twi_start(address, reg)) 29e90: 0f 94 66 6d call 0x2dacc ; 0x2dacc 29e94: 81 11 cpse r24, r1 29e96: 0f c0 rjmp .+30 ; 0x29eb6 return 1; // send data TWDR = data; 29e98: c0 93 bb 00 sts 0x00BB, r28 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 29e9c: 84 e8 ldi r24, 0x84 ; 132 29e9e: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_DATA_ACK)) 29ea2: 88 e2 ldi r24, 0x28 ; 40 29ea4: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 29ea8: 81 11 cpse r24, r1 29eaa: 05 c0 rjmp .+10 ; 0x29eb6 } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 29eac: 84 e9 ldi r24, 0x94 ; 148 29eae: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> error: pat9125_PID1 = 0xff; pat9125_PID2 = 0xff; return; } 29eb2: cf 91 pop r28 29eb4: 08 95 ret goto error; #endif return; error: pat9125_PID1 = 0xff; 29eb6: 8f ef ldi r24, 0xFF ; 255 29eb8: 80 93 66 0d sts 0x0D66, r24 ; 0x800d66 pat9125_PID2 = 0xff; 29ebc: 80 93 65 0d sts 0x0D65, r24 ; 0x800d65 29ec0: f8 cf rjmp .-16 ; 0x29eb2 00029ec2 : } return 0; } static uint8_t pat9125_rd_reg(uint8_t addr) { 29ec2: cf 93 push r28 } uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data) { if(twi_start(address, reg)) 29ec4: 0f 94 66 6d call 0x2dacc ; 0x2dacc 29ec8: 81 11 cpse r24, r1 29eca: 21 c0 rjmp .+66 ; 0x29f0e return 1; // repeat start TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); 29ecc: 84 ea ldi r24, 0xA4 ; 164 29ece: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_REP_START)) 29ed2: 80 e1 ldi r24, 0x10 ; 16 29ed4: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 29ed8: 81 11 cpse r24, r1 29eda: 19 c0 rjmp .+50 ; 0x29f0e return 2; // start receiving TWDR = TW_READ | (address << 1); 29edc: 8b ee ldi r24, 0xEB ; 235 29ede: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 29ee2: c4 e8 ldi r28, 0x84 ; 132 29ee4: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MR_SLA_ACK)) 29ee8: 80 e4 ldi r24, 0x40 ; 64 29eea: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 29eee: 81 11 cpse r24, r1 29ef0: 0e c0 rjmp .+28 ; 0x29f0e return 3; // receive data TWCR = _BV(TWEN) | _BV(TWINT); 29ef2: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MR_DATA_NACK)) 29ef6: 88 e5 ldi r24, 0x58 ; 88 29ef8: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 29efc: 81 11 cpse r24, r1 29efe: 07 c0 rjmp .+14 ; 0x29f0e return 4; *data = TWDR; 29f00: 80 91 bb 00 lds r24, 0x00BB ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 29f04: 94 e9 ldi r25, 0x94 ; 148 29f06: 90 93 bc 00 sts 0x00BC, r25 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> error: pat9125_PID1 = 0xff; pat9125_PID2 = 0xff; return 0; } 29f0a: cf 91 pop r28 29f0c: 08 95 ret goto error; #endif return data; error: pat9125_PID1 = 0xff; 29f0e: 8f ef ldi r24, 0xFF ; 255 29f10: 80 93 66 0d sts 0x0D66, r24 ; 0x800d66 pat9125_PID2 = 0xff; 29f14: 80 93 65 0d sts 0x0D65, r24 ; 0x800d65 return 0; 29f18: 80 e0 ldi r24, 0x00 ; 0 29f1a: f7 cf rjmp .-18 ; 0x29f0a 00029f1c : pat9125_wr_reg(addr, data); return pat9125_rd_reg(addr) == data; } static uint8_t pat9125_wr_seq(const uint8_t* seq) { 29f1c: 0f 93 push r16 29f1e: 1f 93 push r17 29f20: cf 93 push r28 29f22: df 93 push r29 29f24: 8c 01 movw r16, r24 for (;;) { const uint8_t addr = pgm_read_byte(seq++); 29f26: f8 01 movw r30, r16 29f28: d4 91 lpm r29, Z if (addr == 0xff) 29f2a: df 3f cpi r29, 0xFF ; 255 29f2c: 99 f0 breq .+38 ; 0x29f54 break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) 29f2e: 31 96 adiw r30, 0x01 ; 1 29f30: c4 91 lpm r28, Z return; } static uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data) { pat9125_wr_reg(addr, data); 29f32: 6c 2f mov r22, r28 29f34: 8d 2f mov r24, r29 29f36: 0f 94 46 4f call 0x29e8c ; 0x29e8c return pat9125_rd_reg(addr) == data; 29f3a: 8d 2f mov r24, r29 29f3c: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 { for (;;) { const uint8_t addr = pgm_read_byte(seq++); if (addr == 0xff) break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) 29f40: 0e 5f subi r16, 0xFE ; 254 29f42: 1f 4f sbci r17, 0xFF ; 255 29f44: c8 17 cp r28, r24 29f46: 79 f3 breq .-34 ; 0x29f26 // Verification of the register write failed. return 0; 29f48: 80 e0 ldi r24, 0x00 ; 0 } return 1; } 29f4a: df 91 pop r29 29f4c: cf 91 pop r28 29f4e: 1f 91 pop r17 29f50: 0f 91 pop r16 29f52: 08 95 ret break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) // Verification of the register write failed. return 0; } return 1; 29f54: 81 e0 ldi r24, 0x01 ; 1 29f56: f9 cf rjmp .-14 ; 0x29f4a 00029f58 : return 1; } uint8_t pat9125_update(void) { 29f58: cf 93 push r28 29f5a: df 93 push r29 if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91)) 29f5c: 80 91 66 0d lds r24, 0x0D66 ; 0x800d66 29f60: 81 33 cpi r24, 0x31 ; 49 29f62: 21 f0 breq .+8 ; 0x29f6c pat9125_x += iDX; pat9125_y += iDY; } return 1; } return 0; 29f64: 80 e0 ldi r24, 0x00 ; 0 } 29f66: df 91 pop r29 29f68: cf 91 pop r28 29f6a: 08 95 ret return 1; } uint8_t pat9125_update(void) { if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91)) 29f6c: 80 91 65 0d lds r24, 0x0D65 ; 0x800d65 29f70: 81 39 cpi r24, 0x91 ; 145 29f72: c1 f7 brne .-16 ; 0x29f64 { uint8_t ucMotion = pat9125_rd_reg(PAT9125_MOTION); 29f74: 82 e0 ldi r24, 0x02 ; 2 29f76: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 29f7a: c8 2f mov r28, r24 pat9125_b = pat9125_rd_reg(PAT9125_FRAME); 29f7c: 87 e1 ldi r24, 0x17 ; 23 29f7e: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 29f82: 80 93 63 0d sts 0x0D63, r24 ; 0x800d63 pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER); 29f86: 84 e1 ldi r24, 0x14 ; 20 29f88: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 29f8c: 80 93 64 0d sts 0x0D64, r24 ; 0x800d64 if (pat9125_PID1 == 0xff) return 0; 29f90: 80 91 66 0d lds r24, 0x0D66 ; 0x800d66 29f94: 8f 3f cpi r24, 0xFF ; 255 29f96: 31 f3 breq .-52 ; 0x29f64 if (ucMotion & 0x80) 29f98: c7 ff sbrs r28, 7 29f9a: 36 c0 rjmp .+108 ; 0x2a008 { uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL); 29f9c: 83 e0 ldi r24, 0x03 ; 3 29f9e: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 29fa2: d8 2f mov r29, r24 uint16_t ucYL = pat9125_rd_reg(PAT9125_DELTA_YL); 29fa4: 84 e0 ldi r24, 0x04 ; 4 29fa6: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 29faa: c8 2f mov r28, r24 uint16_t ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH); 29fac: 82 e1 ldi r24, 0x12 ; 18 29fae: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 if (pat9125_PID1 == 0xff) return 0; 29fb2: 90 91 66 0d lds r25, 0x0D66 ; 0x800d66 29fb6: 9f 3f cpi r25, 0xFF ; 255 29fb8: a9 f2 breq .-86 ; 0x29f64 if (pat9125_PID1 == 0xff) return 0; if (ucMotion & 0x80) { uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL); uint16_t ucYL = pat9125_rd_reg(PAT9125_DELTA_YL); uint16_t ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH); 29fba: 90 e0 ldi r25, 0x00 ; 0 if (pat9125_PID1 == 0xff) return 0; int16_t iDX = ucXL | ((ucXYH << 4) & 0xf00); 29fbc: 9c 01 movw r18, r24 29fbe: 44 e0 ldi r20, 0x04 ; 4 29fc0: 22 0f add r18, r18 29fc2: 33 1f adc r19, r19 29fc4: 4a 95 dec r20 29fc6: e1 f7 brne .-8 ; 0x29fc0 29fc8: 22 27 eor r18, r18 29fca: 3f 70 andi r19, 0x0F ; 15 29fcc: 2d 2b or r18, r29 int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00); 29fce: 98 2f mov r25, r24 29fd0: 88 27 eor r24, r24 29fd2: 88 27 eor r24, r24 29fd4: 9f 70 andi r25, 0x0F ; 15 29fd6: 8c 2b or r24, r28 if (iDX & 0x800) iDX -= 4096; 29fd8: 33 fd sbrc r19, 3 29fda: 30 51 subi r19, 0x10 ; 16 if (iDY & 0x800) iDY -= 4096; 29fdc: 93 fd sbrc r25, 3 29fde: 90 51 subi r25, 0x10 ; 16 pat9125_x += iDX; 29fe0: 40 91 89 03 lds r20, 0x0389 ; 0x800389 29fe4: 50 91 8a 03 lds r21, 0x038A ; 0x80038a 29fe8: 24 0f add r18, r20 29fea: 35 1f adc r19, r21 29fec: 30 93 8a 03 sts 0x038A, r19 ; 0x80038a 29ff0: 20 93 89 03 sts 0x0389, r18 ; 0x800389 pat9125_y += iDY; 29ff4: 20 91 38 0e lds r18, 0x0E38 ; 0x800e38 29ff8: 30 91 39 0e lds r19, 0x0E39 ; 0x800e39 29ffc: 82 0f add r24, r18 29ffe: 93 1f adc r25, r19 2a000: 90 93 39 0e sts 0x0E39, r25 ; 0x800e39 2a004: 80 93 38 0e sts 0x0E38, r24 ; 0x800e38 } return 1; 2a008: 81 e0 ldi r24, 0x01 ; 1 2a00a: ad cf rjmp .-166 ; 0x29f66 0002a00c : void FullScreenMsgRestoringTemperature(){ lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP)); } void ScreenUpdateEnable(){ lcd_update_enable(true); 2a00c: 81 e0 ldi r24, 0x01 ; 1 2a00e: 0c 94 38 70 jmp 0xe070 ; 0xe070 0002a012 : void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); } static void FullScreenMsg(const char *pgmS, uint8_t slot){ 2a012: 0f 93 push r16 2a014: 1f 93 push r17 2a016: cf 93 push r28 2a018: 8c 01 movw r16, r24 2a01a: c6 2f mov r28, r22 lcd_update_enable(false); 2a01c: 80 e0 ldi r24, 0x00 ; 0 2a01e: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 2a022: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 1, pgmS); 2a026: a8 01 movw r20, r16 2a028: 61 e0 ldi r22, 0x01 ; 1 2a02a: 80 e0 ldi r24, 0x00 ; 0 2a02c: 0e 94 07 70 call 0xe00e ; 0xe00e } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 2a030: 80 e2 ldi r24, 0x20 ; 32 2a032: 0e 94 a2 70 call 0xe144 ; 0xe144 lcd_print(' '); lcd_print(slot + 1); 2a036: 6c 2f mov r22, r28 2a038: 70 e0 ldi r23, 0x00 ; 0 2a03a: 6f 5f subi r22, 0xFF ; 255 2a03c: 7f 4f sbci r23, 0xFF ; 255 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); 2a03e: 07 2e mov r0, r23 2a040: 00 0c add r0, r0 2a042: 88 0b sbc r24, r24 2a044: 99 0b sbc r25, r25 } 2a046: cf 91 pop r28 2a048: 1f 91 pop r17 2a04a: 0f 91 pop r16 2a04c: 0c 94 db 71 jmp 0xe3b6 ; 0xe3b6 0002a050 : eeprom_increment_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL); eeprom_increment_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT); } void IncrementMMUFails(){ eeprom_increment_byte((uint8_t *)EEPROM_MMU_FAIL); 2a050: 82 ed ldi r24, 0xD2 ; 210 2a052: 9e e0 ldi r25, 0x0E ; 14 2a054: 0e 94 7c 78 call 0xf0f8 ; 0xf0f8 eeprom_increment_word((uint16_t *)EEPROM_MMU_FAIL_TOT); 2a058: 83 ed ldi r24, 0xD3 ; 211 2a05a: 9e e0 ldi r25, 0x0E ; 14 2a05c: 0c 94 6f 78 jmp 0xf0de ; 0xf0de 0002a060 : inline bool Running() const { return state == State::Running; } inline bool FindaPressed() const { return regs8[0]; 2a060: 41 e0 ldi r20, 0x01 ; 1 2a062: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 2a066: 81 11 cpse r24, r1 2a068: 01 c0 rjmp .+2 ; 0x2a06c 2a06a: 40 e0 ldi r20, 0x00 ; 0 * @brief Renders any characters that will be updated live on the MMU error screen. *Currently, this is FINDA and Filament Sensor status and Extruder temperature. */ extern void ReportErrorHookDynamicRender(void){ // beware - this optimization abuses the fact, that FindaDetectsFilament returns 0 or 1 and '0' is followed by '1' in the ASCII table lcd_putc_at(3, 2, mmu2.FindaDetectsFilament() + '0'); 2a06c: 40 5d subi r20, 0xD0 ; 208 2a06e: 62 e0 ldi r22, 0x02 ; 2 2a070: 83 e0 ldi r24, 0x03 ; 3 2a072: 0e 94 13 70 call 0xe026 ; 0xe026 class PAT9125_sensor: public Filament_sensor { public: void init(); void deinit(); bool update(); bool getFilamentPresent() const { return filterFilPresent; } 2a076: 41 e0 ldi r20, 0x01 ; 1 2a078: 80 91 fe 16 lds r24, 0x16FE ; 0x8016fe 2a07c: 81 11 cpse r24, r1 2a07e: 01 c0 rjmp .+2 ; 0x2a082 2a080: 40 e0 ldi r20, 0x00 ; 0 lcd_putc_at(8, 2, fsensor.getFilamentPresent() + '0'); 2a082: 40 5d subi r20, 0xD0 ; 208 2a084: 62 e0 ldi r22, 0x02 ; 2 2a086: 88 e0 ldi r24, 0x08 ; 8 2a088: 0e 94 13 70 call 0xe026 ; 0xe026 // print active/changing filament slot lcd_set_cursor(10, 2); 2a08c: 62 e0 ldi r22, 0x02 ; 2 2a08e: 8a e0 ldi r24, 0x0A ; 10 2a090: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcdui_print_extruder(); 2a094: 0f 94 e6 07 call 0x20fcc ; 0x20fcc // Print active extruder temperature lcd_set_cursor(16, 2); 2a098: 62 e0 ldi r22, 0x02 ; 2 2a09a: 80 e1 ldi r24, 0x10 ; 16 2a09c: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%3d"), (int)(degHotend(0) + 0.5)); 2a0a0: 20 e0 ldi r18, 0x00 ; 0 2a0a2: 30 e0 ldi r19, 0x00 ; 0 2a0a4: 40 e0 ldi r20, 0x00 ; 0 2a0a6: 5f e3 ldi r21, 0x3F ; 63 2a0a8: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2a0ac: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2a0b0: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2a0b4: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2a0b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2a0bc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2a0c0: 7f 93 push r23 2a0c2: 6f 93 push r22 2a0c4: 83 ed ldi r24, 0xD3 ; 211 2a0c6: 97 e8 ldi r25, 0x87 ; 135 2a0c8: 9f 93 push r25 2a0ca: 8f 93 push r24 2a0cc: 0e 94 0b 6f call 0xde16 ; 0xde16 2a0d0: 0f 90 pop r0 2a0d2: 0f 90 pop r0 2a0d4: 0f 90 pop r0 2a0d6: 0f 90 pop r0 } 2a0d8: 08 95 ret 0002a0da : return 0; } } static constexpr uint8_t Nibble2Char(uint8_t n) { switch (n) { 2a0da: 8a 30 cpi r24, 0x0A ; 10 2a0dc: 20 f0 brcs .+8 ; 0x2a0e6 2a0de: 80 31 cpi r24, 0x10 ; 16 2a0e0: 20 f4 brcc .+8 ; 0x2a0ea case 0xb: case 0xc: case 0xd: case 0xe: case 0xf: return n - 10 + 'a'; 2a0e2: 89 5a subi r24, 0xA9 ; 169 2a0e4: 08 95 ret case 5: case 6: case 7: case 8: case 9: return n + '0'; 2a0e6: 80 5d subi r24, 0xD0 ; 208 2a0e8: 08 95 ret case 0xd: case 0xe: case 0xf: return n - 10 + 'a'; default: return 0; 2a0ea: 80 e0 ldi r24, 0x00 ; 0 } } 2a0ec: 08 95 ret 0002a0ee : i += AppendCRC(rsp.CRC(), txbuff + i); txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { 2a0ee: 0f 93 push r16 2a0f0: 1f 93 push r17 2a0f2: cf 93 push r28 2a0f4: df 93 push r29 2a0f6: 08 2f mov r16, r24 2a0f8: eb 01 movw r28, r22 if (value == 0) { *dst = '0'; return 1; } uint8_t v = value >> 4U; 2a0fa: 90 e0 ldi r25, 0x00 ; 0 2a0fc: 24 e0 ldi r18, 0x04 ; 4 2a0fe: 95 95 asr r25 2a100: 87 95 ror r24 2a102: 2a 95 dec r18 2a104: e1 f7 brne .-8 ; 0x2a0fe uint8_t charsOut = 1; 2a106: 11 e0 ldi r17, 0x01 ; 1 if (v != 0) { // skip the first '0' if any 2a108: 00 97 sbiw r24, 0x00 ; 0 2a10a: 21 f0 breq .+8 ; 0x2a114 *dst = Nibble2Char(v); 2a10c: 0f 94 6d 50 call 0x2a0da ; 0x2a0da 2a110: 89 93 st Y+, r24 ++dst; charsOut = 2; 2a112: 12 e0 ldi r17, 0x02 ; 2 } v = value & 0xfU; *dst = Nibble2Char(v); 2a114: 80 2f mov r24, r16 2a116: 8f 70 andi r24, 0x0F ; 15 2a118: 0f 94 6d 50 call 0x2a0da ; 0x2a0da 2a11c: 88 83 st Y, r24 return charsOut; } 2a11e: 81 2f mov r24, r17 2a120: df 91 pop r29 2a122: cf 91 pop r28 2a124: 1f 91 pop r17 2a126: 0f 91 pop r16 2a128: 08 95 ret 0002a12a : } static constexpr bool IsHexDigit(uint8_t c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'); } static constexpr uint8_t Char2Nibble(uint8_t c) { switch (c) { 2a12a: 80 33 cpi r24, 0x30 ; 48 2a12c: 30 f0 brcs .+12 ; 0x2a13a 2a12e: 8a 33 cpi r24, 0x3A ; 58 2a130: 30 f0 brcs .+12 ; 0x2a13e 2a132: 9f e9 ldi r25, 0x9F ; 159 2a134: 98 0f add r25, r24 2a136: 96 30 cpi r25, 0x06 ; 6 2a138: 20 f0 brcs .+8 ; 0x2a142 case 'd': case 'e': case 'f': return c - 'a' + 10; default: return 0; 2a13a: 80 e0 ldi r24, 0x00 ; 0 } } 2a13c: 08 95 ret case '5': case '6': case '7': case '8': case '9': return c - '0'; 2a13e: 80 53 subi r24, 0x30 ; 48 2a140: 08 95 ret case 'b': case 'c': case 'd': case 'e': case 'f': return c - 'a' + 10; 2a142: 87 55 subi r24, 0x57 ; 87 2a144: 08 95 ret 0002a146 : /// CRC8 check - please note we abuse this byte for CRC of ResponseMsgs as well. /// The crc8 byte itself is not added into the CRC computation (obviously ;) ) /// Beware - adding any members of this data structure may need changing the way CRC is being computed! uint8_t crc8; constexpr uint8_t ComputeCRC8() const { 2a146: cf 93 push r28 2a148: df 93 push r29 2a14a: ec 01 movw r28, r24 uint8_t crc = 0; crc = modules::crc::CRC8::CCITT_updateCX(0, (uint8_t)code); 2a14c: 68 81 ld r22, Y 2a14e: 80 e0 ldi r24, 0x00 ; 0 2a150: 0f 94 a3 03 call 0x20746 ; 0x20746 crc = modules::crc::CRC8::CCITT_updateCX(crc, value); 2a154: 69 81 ldd r22, Y+1 ; 0x01 2a156: 0f 94 a3 03 call 0x20746 ; 0x20746 crc = modules::crc::CRC8::CCITT_updateW(crc, value2); 2a15a: 6a 81 ldd r22, Y+2 ; 0x02 2a15c: cb 81 ldd r28, Y+3 ; 0x03 uint8_t b[2]; uint16_t w; explicit constexpr inline U(uint16_t w) : w(w) {} } u(w); return CCITT_updateCX(CCITT_updateCX(crc, u.b[0]), u.b[1]); 2a15e: 0f 94 a3 03 call 0x20746 ; 0x20746 2a162: 6c 2f mov r22, r28 return crc; } 2a164: df 91 pop r29 2a166: cf 91 pop r28 2a168: 0d 94 a3 03 jmp 0x20746 ; 0x20746 0002a16c : struct ResponseMsg { RequestMsg request; ///< response is always preceeded by the request message ResponseMsgParamCodes paramCode; ///< code of the parameter uint16_t paramValue; ///< value of the parameter constexpr uint8_t ComputeCRC8() const { 2a16c: cf 93 push r28 2a16e: df 93 push r29 2a170: ec 01 movw r28, r24 uint8_t crc = request.ComputeCRC8(); 2a172: 0f 94 a3 50 call 0x2a146 ; 0x2a146 crc = modules::crc::CRC8::CCITT_updateCX(crc, (uint8_t)paramCode); 2a176: 6d 81 ldd r22, Y+5 ; 0x05 2a178: 0f 94 a3 03 call 0x20746 ; 0x20746 crc = modules::crc::CRC8::CCITT_updateW(crc, paramValue); 2a17c: 6e 81 ldd r22, Y+6 ; 0x06 2a17e: cf 81 ldd r28, Y+7 ; 0x07 2a180: 0f 94 a3 03 call 0x20746 ; 0x20746 2a184: 6c 2f mov r22, r28 return crc; } 2a186: df 91 pop r29 2a188: cf 91 pop r28 2a18a: 0d 94 a3 03 jmp 0x20746 ; 0x20746 0002a18e : return crc; } /// @param code of the request message /// @param value of the request message inline constexpr RequestMsg(RequestMsgCodes code, uint8_t value) 2a18e: cf 93 push r28 2a190: df 93 push r29 2a192: ec 01 movw r28, r24 : code(code) , value(value) , value2(0) , crc8(ComputeCRC8()) { 2a194: 68 83 st Y, r22 2a196: 49 83 std Y+1, r20 ; 0x01 2a198: 1b 82 std Y+3, r1 ; 0x03 2a19a: 1a 82 std Y+2, r1 ; 0x02 2a19c: 0f 94 a3 50 call 0x2a146 ; 0x2a146 2a1a0: 8c 83 std Y+4, r24 ; 0x04 } 2a1a2: df 91 pop r29 2a1a4: cf 91 pop r28 2a1a6: 08 95 ret 0002a1a8 : void Enable_E0() { enable_e0(); } void Disable_E0() { disable_e0(); 2a1a8: 14 9a sbi 0x02, 4 ; 2 } 2a1aa: 08 95 ret 0002a1ac : static void planner_line_to_current_position_sync(float feedRate_mm_s){ planner_line_to_current_position(feedRate_mm_s); planner_synchronize(); } void extruder_move(float delta, float feedRate) { 2a1ac: cf 92 push r12 2a1ae: df 92 push r13 2a1b0: ef 92 push r14 2a1b2: ff 92 push r15 2a1b4: cf 93 push r28 2a1b6: df 93 push r29 2a1b8: 69 01 movw r12, r18 2a1ba: 7a 01 movw r14, r20 current_position[E_AXIS] += delta; 2a1bc: c1 e6 ldi r28, 0x61 ; 97 2a1be: d2 e1 ldi r29, 0x12 ; 18 2a1c0: 9b 01 movw r18, r22 2a1c2: ac 01 movw r20, r24 2a1c4: 6c 85 ldd r22, Y+12 ; 0x0c 2a1c6: 7d 85 ldd r23, Y+13 ; 0x0d 2a1c8: 8e 85 ldd r24, Y+14 ; 0x0e 2a1ca: 9f 85 ldd r25, Y+15 ; 0x0f 2a1cc: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2a1d0: 6c 87 std Y+12, r22 ; 0x0c 2a1d2: 7d 87 std Y+13, r23 ; 0x0d 2a1d4: 8e 87 std Y+14, r24 ; 0x0e 2a1d6: 9f 87 std Y+15, r25 ; 0x0f #include "temperature.h" namespace MMU2 { static void planner_line_to_current_position(float feedRate_mm_s){ plan_buffer_line_curposXYZE(feedRate_mm_s); 2a1d8: c7 01 movw r24, r14 2a1da: b6 01 movw r22, r12 } void extruder_move(float delta, float feedRate) { current_position[E_AXIS] += delta; planner_line_to_current_position(feedRate); } 2a1dc: df 91 pop r29 2a1de: cf 91 pop r28 2a1e0: ff 90 pop r15 2a1e2: ef 90 pop r14 2a1e4: df 90 pop r13 2a1e6: cf 90 pop r12 #include "temperature.h" namespace MMU2 { static void planner_line_to_current_position(float feedRate_mm_s){ plan_buffer_line_curposXYZE(feedRate_mm_s); 2a1e8: 0d 94 81 4c jmp 0x29902 ; 0x29902 0002a1ec : st_synchronize(); } static inline void go_to_current(float fr) { plan_buffer_line_curposXYZE(fr); 2a1ec: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 2a1f0: 0d 94 fb 1a jmp 0x235f6 ; 0x235f6 0002a1f4 : #include "mmu2_log.h" namespace MMU2 { void LogErrorEvent_P(const char *msg){ 2a1f4: cf 93 push r28 2a1f6: df 93 push r29 2a1f8: ec 01 movw r28, r24 SERIAL_ECHO_START; //!@todo Decide MMU errors on serial line 2a1fa: 8e ec ldi r24, 0xCE ; 206 2a1fc: 91 ea ldi r25, 0xA1 ; 161 2a1fe: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_MMU2(); 2a202: 8d ec ldi r24, 0xCD ; 205 2a204: 97 e8 ldi r25, 0x87 ; 135 2a206: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(msg); 2a20a: ce 01 movw r24, r28 } 2a20c: df 91 pop r29 2a20e: cf 91 pop r28 namespace MMU2 { void LogErrorEvent_P(const char *msg){ SERIAL_ECHO_START; //!@todo Decide MMU errors on serial line SERIAL_MMU2(); SERIAL_ECHOLNRPGM(msg); 2a210: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 0002a214 : #include "Filament_sensor.h" namespace MMU2 { FilamentState WhereIsFilament(){ return fsensor.getFilamentPresent() ? FilamentState::AT_FSENSOR : FilamentState::NOT_PRESENT; 2a214: 81 e0 ldi r24, 0x01 ; 1 2a216: 90 91 fe 16 lds r25, 0x16FE ; 0x8016fe 2a21a: 91 11 cpse r25, r1 2a21c: 01 c0 rjmp .+2 ; 0x2a220 2a21e: 80 e0 ldi r24, 0x00 ; 0 } 2a220: 08 95 ret 0002a222 : constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a222: 89 32 cpi r24, 0x29 ; 41 2a224: 20 e8 ldi r18, 0x80 ; 128 2a226: 92 07 cpc r25, r18 2a228: 09 f4 brne .+2 ; 0x2a22c 2a22a: 97 c0 rjmp .+302 ; 0x2a35a 2a22c: 08 f0 brcs .+2 ; 0x2a230 2a22e: 48 c0 rjmp .+144 ; 0x2a2c0 2a230: 86 30 cpi r24, 0x06 ; 6 2a232: 60 e8 ldi r22, 0x80 ; 128 2a234: 96 07 cpc r25, r22 2a236: 09 f4 brne .+2 ; 0x2a23a 2a238: 9a c0 rjmp .+308 ; 0x2a36e 2a23a: 30 f5 brcc .+76 ; 0x2a288 2a23c: 83 30 cpi r24, 0x03 ; 3 2a23e: 40 e8 ldi r20, 0x80 ; 128 2a240: 94 07 cpc r25, r20 2a242: 09 f4 brne .+2 ; 0x2a246 2a244: 80 c0 rjmp .+256 ; 0x2a346 2a246: a8 f4 brcc .+42 ; 0x2a272 2a248: 81 30 cpi r24, 0x01 ; 1 2a24a: 20 e8 ldi r18, 0x80 ; 128 2a24c: 92 07 cpc r25, r18 2a24e: 09 f4 brne .+2 ; 0x2a252 2a250: 17 c1 rjmp .+558 ; 0x2a480 2a252: 82 30 cpi r24, 0x02 ; 2 2a254: 40 e8 ldi r20, 0x80 ; 128 2a256: 94 07 cpc r25, r20 2a258: 09 f4 brne .+2 ; 0x2a25c 2a25a: 73 c0 rjmp .+230 ; 0x2a342 static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3); constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); 2a25c: 9c 01 movw r18, r24 } // Electrical issues which can be detected somehow. // Need to be placed before TMC-related errors in order to process couples of error bits between single ones // and to keep the code size down. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { 2a25e: 86 ff sbrs r24, 6 2a260: 8e c0 rjmp .+284 ; 0x2a37e static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3); constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); 2a262: 22 27 eor r18, r18 2a264: 32 7c andi r19, 0xC2 ; 194 // Electrical issues which can be detected somehow. // Need to be placed before TMC-related errors in order to process couples of error bits between single ones // and to keep the code size down. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { 2a266: 21 15 cp r18, r1 2a268: 32 4c sbci r19, 0xC2 ; 194 2a26a: 09 f0 breq .+2 ; 0x2a26e 2a26c: 9e c0 rjmp .+316 ; 0x2a3aa return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED); 2a26e: 8e e1 ldi r24, 0x1E ; 30 2a270: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a272: 84 30 cpi r24, 0x04 ; 4 2a274: 60 e8 ldi r22, 0x80 ; 128 2a276: 96 07 cpc r25, r22 2a278: 09 f4 brne .+2 ; 0x2a27c 2a27a: 67 c0 rjmp .+206 ; 0x2a34a 2a27c: 85 30 cpi r24, 0x05 ; 5 2a27e: 20 e8 ldi r18, 0x80 ; 128 2a280: 92 07 cpc r25, r18 2a282: 61 f7 brne .-40 ; 0x2a25c case ErrorCode::MMU_NOT_RESPONDING: return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING); case ErrorCode::PROTOCOL_ERROR: return FindErrorIndex(ERR_CONNECT_COMMUNICATION_ERROR); case ErrorCode::FILAMENT_ALREADY_LOADED: return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED); 2a284: 84 e2 ldi r24, 0x24 ; 36 2a286: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a288: 8a 30 cpi r24, 0x0A ; 10 2a28a: 40 e8 ldi r20, 0x80 ; 128 2a28c: 94 07 cpc r25, r20 2a28e: 09 f4 brne .+2 ; 0x2a292 2a290: 5e c0 rjmp .+188 ; 0x2a34e 2a292: 58 f4 brcc .+22 ; 0x2a2aa 2a294: 88 30 cpi r24, 0x08 ; 8 2a296: 20 e8 ldi r18, 0x80 ; 128 2a298: 92 07 cpc r25, r18 2a29a: 09 f4 brne .+2 ; 0x2a29e 2a29c: 6e c0 rjmp .+220 ; 0x2a37a 2a29e: 89 30 cpi r24, 0x09 ; 9 2a2a0: 40 e8 ldi r20, 0x80 ; 128 2a2a2: 94 07 cpc r25, r20 2a2a4: d9 f6 brne .-74 ; 0x2a25c case ErrorCode::FSENSOR_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER); case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK); case ErrorCode::FSENSOR_TOO_EARLY: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_TOO_EARLY); 2a2a6: 85 e0 ldi r24, 0x05 ; 5 2a2a8: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a2aa: 8c 30 cpi r24, 0x0C ; 12 2a2ac: 60 e8 ldi r22, 0x80 ; 128 2a2ae: 96 07 cpc r25, r22 2a2b0: 09 f4 brne .+2 ; 0x2a2b4 2a2b2: 51 c0 rjmp .+162 ; 0x2a356 2a2b4: 8d 30 cpi r24, 0x0D ; 13 2a2b6: 20 e8 ldi r18, 0x80 ; 128 2a2b8: 92 07 cpc r25, r18 2a2ba: 81 f6 brne .-96 ; 0x2a25c case ErrorCode::INTERNAL: return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR); case ErrorCode::FINDA_VS_EEPROM_DISREPANCY: return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY); case ErrorCode::MCU_UNDERVOLTAGE_VCC: return FindErrorIndex(ERR_ELECTRICAL_MMU_MCU_ERROR); 2a2bc: 81 e2 ldi r24, 0x21 ; 33 2a2be: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a2c0: 8f 32 cpi r24, 0x2F ; 47 2a2c2: 40 e8 ldi r20, 0x80 ; 128 2a2c4: 94 07 cpc r25, r20 2a2c6: 09 f4 brne .+2 ; 0x2a2ca 2a2c8: 56 c0 rjmp .+172 ; 0x2a376 2a2ca: e0 f4 brcc .+56 ; 0x2a304 2a2cc: 8c 32 cpi r24, 0x2C ; 44 2a2ce: 20 e8 ldi r18, 0x80 ; 128 2a2d0: 92 07 cpc r25, r18 2a2d2: 09 f4 brne .+2 ; 0x2a2d6 2a2d4: 4e c0 rjmp .+156 ; 0x2a372 2a2d6: 58 f4 brcc .+22 ; 0x2a2ee 2a2d8: 8a 32 cpi r24, 0x2A ; 42 2a2da: 60 e8 ldi r22, 0x80 ; 128 2a2dc: 96 07 cpc r25, r22 2a2de: c9 f1 breq .+114 ; 0x2a352 2a2e0: 8b 32 cpi r24, 0x2B ; 43 2a2e2: 20 e8 ldi r18, 0x80 ; 128 2a2e4: 92 07 cpc r25, r18 2a2e6: 09 f0 breq .+2 ; 0x2a2ea 2a2e8: b9 cf rjmp .-142 ; 0x2a25c case ErrorCode::FILAMENT_ALREADY_LOADED: return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED); case ErrorCode::INVALID_TOOL: return FindErrorIndex(ERR_SYSTEM_INVALID_TOOL); case ErrorCode::QUEUE_FULL: return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL); 2a2ea: 86 e2 ldi r24, 0x26 ; 38 2a2ec: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a2ee: 8d 32 cpi r24, 0x2D ; 45 2a2f0: 40 e8 ldi r20, 0x80 ; 128 2a2f2: 94 07 cpc r25, r20 2a2f4: d1 f1 breq .+116 ; 0x2a36a 2a2f6: 8e 32 cpi r24, 0x2E ; 46 2a2f8: 60 e8 ldi r22, 0x80 ; 128 2a2fa: 96 07 cpc r25, r22 2a2fc: 09 f0 breq .+2 ; 0x2a300 2a2fe: ae cf rjmp .-164 ; 0x2a25c return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_HOME); case ErrorCode::MOVE_IDLER_FAILED: return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE); case ErrorCode::MMU_NOT_RESPONDING: return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING); 2a300: 82 e2 ldi r24, 0x22 ; 34 2a302: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a304: 87 38 cpi r24, 0x87 ; 135 2a306: 20 e8 ldi r18, 0x80 ; 128 2a308: 92 07 cpc r25, r18 2a30a: 49 f1 breq .+82 ; 0x2a35e 2a30c: 58 f4 brcc .+22 ; 0x2a324 2a30e: 87 34 cpi r24, 0x47 ; 71 2a310: 60 e8 ldi r22, 0x80 ; 128 2a312: 96 07 cpc r25, r22 2a314: 29 f0 breq .+10 ; 0x2a320 2a316: 8b 34 cpi r24, 0x4B ; 75 2a318: 20 e8 ldi r18, 0x80 ; 128 2a31a: 92 07 cpc r25, r18 2a31c: 09 f0 breq .+2 ; 0x2a320 2a31e: 9e cf rjmp .-196 ; 0x2a25c case ErrorCode::FILAMENT_CHANGE: return FindErrorIndex(ERR_SYSTEM_FILAMENT_CHANGE); case ErrorCode::STALLED_PULLEY: case ErrorCode::MOVE_PULLEY_FAILED: return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE); 2a320: 84 e0 ldi r24, 0x04 ; 4 2a322: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 2a324: 87 30 cpi r24, 0x07 ; 7 2a326: 41 e8 ldi r20, 0x81 ; 129 2a328: 94 07 cpc r25, r20 2a32a: d9 f0 breq .+54 ; 0x2a362 2a32c: 8b 30 cpi r24, 0x0B ; 11 2a32e: 61 e8 ldi r22, 0x81 ; 129 2a330: 96 07 cpc r25, r22 2a332: c9 f0 breq .+50 ; 0x2a366 2a334: 8b 38 cpi r24, 0x8B ; 139 2a336: 20 e8 ldi r18, 0x80 ; 128 2a338: 92 07 cpc r25, r18 2a33a: 09 f0 breq .+2 ; 0x2a33e 2a33c: 8f cf rjmp .-226 ; 0x2a25c return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE); case ErrorCode::HOMING_SELECTOR_FAILED: return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_HOME); case ErrorCode::MOVE_SELECTOR_FAILED: return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_MOVE); 2a33e: 89 e0 ldi r24, 0x09 ; 9 2a340: 08 95 ret uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { case ErrorCode::FINDA_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER); case ErrorCode::FINDA_DIDNT_SWITCH_OFF: return FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK); 2a342: 81 e0 ldi r24, 0x01 ; 1 2a344: 08 95 ret case ErrorCode::FSENSOR_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER); 2a346: 82 e0 ldi r24, 0x02 ; 2 2a348: 08 95 ret case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK); 2a34a: 83 e0 ldi r24, 0x03 ; 3 2a34c: 08 95 ret case ErrorCode::FSENSOR_TOO_EARLY: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_TOO_EARLY); case ErrorCode::FINDA_FLICKERS: return FindErrorIndex(ERR_MECHANICAL_INSPECT_FINDA); 2a34e: 86 e0 ldi r24, 0x06 ; 6 2a350: 08 95 ret case ErrorCode::LOAD_TO_EXTRUDER_FAILED: return FindErrorIndex(ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED); 2a352: 87 e0 ldi r24, 0x07 ; 7 2a354: 08 95 ret case ErrorCode::FILAMENT_EJECTED: return FindErrorIndex(ERR_SYSTEM_FILAMENT_EJECTED); 2a356: 8a e2 ldi r24, 0x2A ; 42 2a358: 08 95 ret case ErrorCode::FILAMENT_CHANGE: return FindErrorIndex(ERR_SYSTEM_FILAMENT_CHANGE); 2a35a: 8b e2 ldi r24, 0x2B ; 43 2a35c: 08 95 ret case ErrorCode::STALLED_PULLEY: case ErrorCode::MOVE_PULLEY_FAILED: return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE); case ErrorCode::HOMING_SELECTOR_FAILED: return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_HOME); 2a35e: 88 e0 ldi r24, 0x08 ; 8 2a360: 08 95 ret case ErrorCode::MOVE_SELECTOR_FAILED: return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_MOVE); case ErrorCode::HOMING_IDLER_FAILED: return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_HOME); 2a362: 8a e0 ldi r24, 0x0A ; 10 2a364: 08 95 ret case ErrorCode::MOVE_IDLER_FAILED: return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE); 2a366: 8b e0 ldi r24, 0x0B ; 11 2a368: 08 95 ret case ErrorCode::MMU_NOT_RESPONDING: return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING); case ErrorCode::PROTOCOL_ERROR: return FindErrorIndex(ERR_CONNECT_COMMUNICATION_ERROR); 2a36a: 83 e2 ldi r24, 0x23 ; 35 2a36c: 08 95 ret case ErrorCode::FILAMENT_ALREADY_LOADED: return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED); case ErrorCode::INVALID_TOOL: return FindErrorIndex(ERR_SYSTEM_INVALID_TOOL); 2a36e: 85 e2 ldi r24, 0x25 ; 37 2a370: 08 95 ret case ErrorCode::QUEUE_FULL: return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL); case ErrorCode::VERSION_MISMATCH: return FindErrorIndex(ERR_SYSTEM_FW_UPDATE_NEEDED); 2a372: 87 e2 ldi r24, 0x27 ; 39 2a374: 08 95 ret case ErrorCode::INTERNAL: return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR); 2a376: 88 e2 ldi r24, 0x28 ; 40 2a378: 08 95 ret case ErrorCode::FINDA_VS_EEPROM_DISREPANCY: return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY); 2a37a: 89 e2 ldi r24, 0x29 ; 41 2a37c: 08 95 ret // and to keep the code size down. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED); } } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { 2a37e: 87 ff sbrs r24, 7 2a380: 07 c0 rjmp .+14 ; 0x2a390 static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3); constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); 2a382: 22 27 eor r18, r18 2a384: 32 7c andi r19, 0xC2 ; 194 if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED); } } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { 2a386: 21 15 cp r18, r1 2a388: 32 4c sbci r19, 0xC2 ; 194 2a38a: a1 f5 brne .+104 ; 0x2a3f4 return FindErrorIndex(ERR_ELECTRICAL_MMU_SELECTOR_SELFTEST_FAILED); 2a38c: 8f e1 ldi r24, 0x1F ; 31 2a38e: 08 95 ret } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { 2a390: 22 27 eor r18, r18 2a392: 31 70 andi r19, 0x01 ; 1 2a394: 90 ff sbrs r25, 0 2a396: 52 c0 rjmp .+164 ; 0x2a43c static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2); static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3); constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); 2a398: ac 01 movw r20, r24 2a39a: 44 27 eor r20, r20 2a39c: 52 7c andi r21, 0xC2 ; 194 } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { return FindErrorIndex(ERR_ELECTRICAL_MMU_SELECTOR_SELFTEST_FAILED); } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) { 2a39e: 41 15 cp r20, r1 2a3a0: 52 4c sbci r21, 0xC2 ; 194 2a3a2: 09 f0 breq .+2 ; 0x2a3a6 2a3a4: 4b c0 rjmp .+150 ; 0x2a43c return FindErrorIndex(ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED); 2a3a6: 80 e2 ldi r24, 0x20 ; 32 2a3a8: 08 95 ret constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3aa: 9c 01 movw r18, r24 2a3ac: 22 27 eor r18, r18 2a3ae: 32 78 andi r19, 0x82 ; 130 // TMC-related errors - multiple of these can occur at once // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough) // By carefully ordering the checks here we can prioritize the errors being reported to the user. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { 2a3b0: 23 2b or r18, r19 2a3b2: 09 f0 breq .+2 ; 0x2a3b6 2a3b4: 67 c0 rjmp .+206 ; 0x2a484 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3b6: 9c 01 movw r18, r24 2a3b8: 22 27 eor r18, r18 2a3ba: 34 78 andi r19, 0x84 ; 132 // By carefully ordering the checks here we can prioritize the errors being reported to the user. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { 2a3bc: 23 2b or r18, r19 2a3be: 09 f0 breq .+2 ; 0x2a3c2 2a3c0: 63 c0 rjmp .+198 ; 0x2a488 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3c2: 9c 01 movw r18, r24 2a3c4: 22 27 eor r18, r18 2a3c6: 38 78 andi r19, 0x88 ; 136 return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { 2a3c8: 23 2b or r18, r19 2a3ca: 09 f0 breq .+2 ; 0x2a3ce 2a3cc: 5f c0 rjmp .+190 ; 0x2a48c constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3ce: 9c 01 movw r18, r24 2a3d0: 22 27 eor r18, r18 2a3d2: 30 79 andi r19, 0x90 ; 144 return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { 2a3d4: 23 2b or r18, r19 2a3d6: 09 f0 breq .+2 ; 0x2a3da 2a3d8: 5b c0 rjmp .+182 ; 0x2a490 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3da: 9c 01 movw r18, r24 2a3dc: 22 27 eor r18, r18 2a3de: 30 7a andi r19, 0xA0 ; 160 return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { 2a3e0: 23 2b or r18, r19 2a3e2: 09 f0 breq .+2 ; 0x2a3e6 2a3e4: 57 c0 rjmp .+174 ; 0x2a494 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3e6: 88 27 eor r24, r24 2a3e8: 90 7c andi r25, 0xC0 ; 192 return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { 2a3ea: 89 2b or r24, r25 2a3ec: 09 f4 brne .+2 ; 0x2a3f0 2a3ee: 68 c0 rjmp .+208 ; 0x2a4c0 return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR); 2a3f0: 8f e0 ldi r24, 0x0F ; 15 2a3f2: 08 95 ret constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a3f4: 9c 01 movw r18, r24 2a3f6: 22 27 eor r18, r18 2a3f8: 32 78 andi r19, 0x82 ; 130 } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR); } } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { 2a3fa: 23 2b or r18, r19 2a3fc: 09 f0 breq .+2 ; 0x2a400 2a3fe: 4c c0 rjmp .+152 ; 0x2a498 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a400: 9c 01 movw r18, r24 2a402: 22 27 eor r18, r18 2a404: 34 78 andi r19, 0x84 ; 132 } } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { 2a406: 23 2b or r18, r19 2a408: 09 f0 breq .+2 ; 0x2a40c 2a40a: 48 c0 rjmp .+144 ; 0x2a49c constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a40c: 9c 01 movw r18, r24 2a40e: 22 27 eor r18, r18 2a410: 38 78 andi r19, 0x88 ; 136 return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { 2a412: 23 2b or r18, r19 2a414: 09 f0 breq .+2 ; 0x2a418 2a416: 44 c0 rjmp .+136 ; 0x2a4a0 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a418: 9c 01 movw r18, r24 2a41a: 22 27 eor r18, r18 2a41c: 30 79 andi r19, 0x90 ; 144 return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { 2a41e: 23 2b or r18, r19 2a420: 09 f0 breq .+2 ; 0x2a424 2a422: 40 c0 rjmp .+128 ; 0x2a4a4 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a424: 9c 01 movw r18, r24 2a426: 22 27 eor r18, r18 2a428: 30 7a andi r19, 0xA0 ; 160 return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { 2a42a: 23 2b or r18, r19 2a42c: e9 f5 brne .+122 ; 0x2a4a8 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a42e: 88 27 eor r24, r24 2a430: 90 7c andi r25, 0xC0 ; 192 return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { 2a432: 89 2b or r24, r25 2a434: 09 f4 brne .+2 ; 0x2a438 2a436: 44 c0 rjmp .+136 ; 0x2a4c0 return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR); 2a438: 80 e1 ldi r24, 0x10 ; 16 2a43a: 08 95 ret } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { 2a43c: 23 2b or r18, r19 2a43e: 09 f4 brne .+2 ; 0x2a442 2a440: 3f c0 rjmp .+126 ; 0x2a4c0 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a442: 9c 01 movw r18, r24 2a444: 22 27 eor r18, r18 2a446: 32 78 andi r19, 0x82 ; 130 } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR); } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { 2a448: 23 2b or r18, r19 2a44a: 81 f5 brne .+96 ; 0x2a4ac constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a44c: 9c 01 movw r18, r24 2a44e: 22 27 eor r18, r18 2a450: 34 78 andi r19, 0x84 ; 132 } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { 2a452: 23 2b or r18, r19 2a454: 69 f5 brne .+90 ; 0x2a4b0 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a456: 9c 01 movw r18, r24 2a458: 22 27 eor r18, r18 2a45a: 38 78 andi r19, 0x88 ; 136 return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { 2a45c: 23 2b or r18, r19 2a45e: 51 f5 brne .+84 ; 0x2a4b4 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a460: 9c 01 movw r18, r24 2a462: 22 27 eor r18, r18 2a464: 30 79 andi r19, 0x90 ; 144 return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET); } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { 2a466: 23 2b or r18, r19 2a468: 39 f5 brne .+78 ; 0x2a4b8 constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a46a: 9c 01 movw r18, r24 2a46c: 22 27 eor r18, r18 2a46e: 30 7a andi r19, 0xA0 ; 160 return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR); } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { 2a470: 23 2b or r18, r19 2a472: 21 f5 brne .+72 ; 0x2a4bc constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) { return (ErrorCode)((uint16_t)a & (uint16_t)b); } constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; 2a474: 88 27 eor r24, r24 2a476: 90 7c andi r25, 0xC0 ; 192 return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT); } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { 2a478: 89 2b or r24, r25 2a47a: 11 f1 breq .+68 ; 0x2a4c0 return FindErrorIndex(ERR_TEMPERATURE_TMC_IDLER_OVERHEAT_ERROR); 2a47c: 81 e1 ldi r24, 0x11 ; 17 2a47e: 08 95 ret } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { case ErrorCode::FINDA_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER); 2a480: 80 e0 ldi r24, 0x00 ; 0 2a482: 08 95 ret // TMC-related errors - multiple of these can occur at once // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough) // By carefully ordering the checks here we can prioritize the errors being reported to the user. if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR); 2a484: 82 e1 ldi r24, 0x12 ; 18 2a486: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET); 2a488: 85 e1 ldi r24, 0x15 ; 21 2a48a: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR); 2a48c: 88 e1 ldi r24, 0x18 ; 24 2a48e: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED); 2a490: 8b e1 ldi r24, 0x1B ; 27 2a492: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT); 2a494: 8c e0 ldi r24, 0x0C ; 12 2a496: 08 95 ret if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR); } } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR); 2a498: 83 e1 ldi r24, 0x13 ; 19 2a49a: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET); 2a49c: 86 e1 ldi r24, 0x16 ; 22 2a49e: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR); 2a4a0: 89 e1 ldi r24, 0x19 ; 25 2a4a2: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED); 2a4a4: 8c e1 ldi r24, 0x1C ; 28 2a4a6: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT); 2a4a8: 8d e0 ldi r24, 0x0D ; 13 2a4aa: 08 95 ret if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) { return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR); } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR); 2a4ac: 84 e1 ldi r24, 0x14 ; 20 2a4ae: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET); 2a4b0: 87 e1 ldi r24, 0x17 ; 23 2a4b2: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR); 2a4b4: 8a e1 ldi r24, 0x1A ; 26 2a4b6: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED); 2a4b8: 8d e1 ldi r24, 0x1D ; 29 2a4ba: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT); 2a4bc: 8e e0 ldi r24, 0x0E ; 14 2a4be: 08 95 ret return FindErrorIndex(ERR_TEMPERATURE_TMC_IDLER_OVERHEAT_ERROR); } } // if nothing got caught, return a generic error return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR); 2a4c0: 8c e2 ldi r24, 0x2C ; 44 } 2a4c2: 08 95 ret 0002a4c4 : bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { 2a4c4: cf 92 push r12 2a4c6: df 92 push r13 2a4c8: ef 92 push r14 2a4ca: ff 92 push r15 2a4cc: 0f 93 push r16 2a4ce: 1f 93 push r17 2a4d0: cf 93 push r28 2a4d2: df 93 push r29 if (putErrorScreenToSleep) return; if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && mmu2.MMULastErrorSource() == MMU2::ErrorSourceMMU) { 2a4d4: 20 91 d2 12 lds r18, 0x12D2 ; 0x8012d2 2a4d8: 30 91 d3 12 lds r19, 0x12D3 ; 0x8012d3 2a4dc: 21 30 cpi r18, 0x01 ; 1 2a4de: 31 05 cpc r19, r1 2a4e0: 39 f4 brne .+14 ; 0x2a4f0 2a4e2: 20 91 fb 12 lds r18, 0x12FB ; 0x8012fb 2a4e6: 21 30 cpi r18, 0x01 ; 1 2a4e8: 19 f4 brne .+6 ; 0x2a4f0 // If the error code suddenly changes to OK, that means // a button was pushed on the MMU and the LCD should // dismiss the error screen until MMU raises a new error ReportErrorHookState = ReportErrorHookStates::DISMISS_ERROR_SCREEN; 2a4ea: 22 e0 ldi r18, 0x02 ; 2 2a4ec: 20 93 89 04 sts 0x0489, r18 ; 0x800489 } const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec); 2a4f0: 0f 94 11 51 call 0x2a222 ; 0x2a222 2a4f4: d8 2f mov r29, r24 switch ((uint8_t)ReportErrorHookState) { 2a4f6: 80 91 89 04 lds r24, 0x0489 ; 0x800489 2a4fa: 81 30 cpi r24, 0x01 ; 1 2a4fc: 09 f4 brne .+2 ; 0x2a500 2a4fe: 64 c0 rjmp .+200 ; 0x2a5c8 2a500: 60 f0 brcs .+24 ; 0x2a51a 2a502: 82 30 cpi r24, 0x02 ; 2 2a504: 09 f4 brne .+2 ; 0x2a508 2a506: f4 c0 rjmp .+488 ; 0x2a6f0 ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN; break; default: break; } } 2a508: df 91 pop r29 2a50a: cf 91 pop r28 2a50c: 1f 91 pop r17 2a50e: 0f 91 pop r16 2a510: ff 90 pop r15 2a512: ef 90 pop r14 2a514: df 90 pop r13 2a516: cf 90 pop r12 2a518: 08 95 ret const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec); switch ((uint8_t)ReportErrorHookState) { case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN: KEEPALIVE_STATE(PAUSED_FOR_USER); 2a51a: 84 e0 ldi r24, 0x04 ; 4 2a51c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 const char *PrusaErrorDesc(uint8_t i) { return (const char *)pgm_read_ptr(errorDescs + i); } uint8_t PrusaErrorButtons(uint8_t i) { return pgm_read_byte(errorButtons + i); 2a520: 0d 2f mov r16, r29 2a522: 10 e0 ldi r17, 0x00 ; 0 2a524: f8 01 movw r30, r16 2a526: e9 5c subi r30, 0xC9 ; 201 2a528: f7 47 sbci r31, 0x77 ; 119 2a52a: c4 91 lpm r28, Z //! |>Retry >Done >W| <- buttons bool two_choices = false; // Read and determine what operations should be shown on the menu const uint8_t button_operation = PrusaErrorButtons(ei); const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation); 2a52c: fc 2e mov r15, r28 2a52e: f2 94 swap r15 2a530: 6f e0 ldi r22, 0x0F ; 15 2a532: f6 22 and r15, r22 const uint8_t button_op_middle = BUTTON_OP_MIDDLE(button_operation); 2a534: cf 70 andi r28, 0x0F ; 15 if (button_op_right == (uint8_t)ButtonOperations::NoOperation){ // Two operations not specified, the error menu should only show two choices two_choices = true; } lcd_update_enable(false); 2a536: 80 e0 ldi r24, 0x00 ; 0 2a538: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_clear(); 2a53c: 0e 94 26 70 call 0xe04c ; 0xe04c // if nothing got caught, return a generic error return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR); } uint16_t PrusaErrorCode(uint8_t i) { return pgm_read_word(errorCodes + i); 2a540: 00 0f add r16, r16 2a542: 11 1f adc r17, r17 2a544: f8 01 movw r30, r16 2a546: ec 59 subi r30, 0x9C ; 156 2a548: f7 47 sbci r31, 0x77 ; 119 2a54a: c5 90 lpm r12, Z+ 2a54c: d4 90 lpm r13, Z } const char *PrusaErrorTitle(uint8_t i) { return (const char *)pgm_read_ptr(errorTitles + i); 2a54e: 00 5e subi r16, 0xE0 ; 224 2a550: 10 46 sbci r17, 0x60 ; 96 2a552: f8 01 movw r30, r16 2a554: 85 91 lpm r24, Z+ 2a556: 94 91 lpm r25, Z // Print title and header lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) ); 2a558: 0e 94 3a 75 call 0xea74 ; 0xea74 2a55c: df 92 push r13 2a55e: cf 92 push r12 2a560: 9f 93 push r25 2a562: 8f 93 push r24 2a564: 80 ed ldi r24, 0xD0 ; 208 2a566: 98 e8 ldi r25, 0x88 ; 136 2a568: 9f 93 push r25 2a56a: 8f 93 push r24 2a56c: 0e 94 0b 6f call 0xde16 ; 0xde16 lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore()); } void ReportErrorHookSensorLineRender(){ // Render static characters in third line lcd_puts_at_P(0, 2, PSTR("FI: FS: > " LCD_STR_THERMOMETER " " LCD_STR_DEGREE)); 2a570: 4b ea ldi r20, 0xAB ; 171 2a572: 5f e9 ldi r21, 0x9F ; 159 2a574: 62 e0 ldi r22, 0x02 ; 2 2a576: 80 e0 ldi r24, 0x00 ; 0 2a578: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) ); ReportErrorHookSensorLineRender(); // Render the choices lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore()); 2a57c: 0f 90 pop r0 2a57e: 0f 90 pop r0 2a580: 0f 90 pop r0 2a582: 0f 90 pop r0 2a584: 0f 90 pop r0 2a586: 0f 90 pop r0 2a588: f1 10 cpse r15, r1 2a58a: c6 c0 rjmp .+396 ; 0x2a718 2a58c: 10 e0 ldi r17, 0x00 ; 0 2a58e: 00 e0 ldi r16, 0x00 ; 0 2a590: 42 e1 ldi r20, 0x12 ; 18 2a592: e4 2e mov r14, r20 2a594: 5c ef ldi r21, 0xFC ; 252 2a596: c5 2e mov r12, r21 2a598: 59 e6 ldi r21, 0x69 ; 105 2a59a: d5 2e mov r13, r21 return pgm_read_byte(errorButtons + i); } const char *PrusaErrorButtonTitle(uint8_t bi) { // -1 represents the hidden NoOperation button which is not drawn in any way return (const char *)pgm_read_ptr(btnOperation + bi - 1); 2a59c: ec 2f mov r30, r28 2a59e: f0 e0 ldi r31, 0x00 ; 0 2a5a0: ee 0f add r30, r30 2a5a2: ff 1f adc r31, r31 2a5a4: e4 54 subi r30, 0x44 ; 68 2a5a6: f7 47 sbci r31, 0x77 ; 119 2a5a8: 85 91 lpm r24, Z+ 2a5aa: 94 91 lpm r25, Z 2a5ac: 0e 94 3a 75 call 0xea74 ; 0xea74 2a5b0: bc 01 movw r22, r24 2a5b2: 81 e0 ldi r24, 0x01 ; 1 2a5b4: f1 10 cpse r15, r1 2a5b6: 01 c0 rjmp .+2 ; 0x2a5ba 2a5b8: 80 e0 ldi r24, 0x00 ; 0 2a5ba: 2e 2d mov r18, r14 2a5bc: a6 01 movw r20, r12 2a5be: 0e 94 71 df call 0x1bee2 ; 0x1bee2 switch ((uint8_t)ReportErrorHookState) { case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN: KEEPALIVE_STATE(PAUSED_FOR_USER); ReportErrorHookStaticRender(ei); ReportErrorHookState = ReportErrorHookStates::MONITOR_SELECTION; 2a5c2: 81 e0 ldi r24, 0x01 ; 1 2a5c4: 80 93 89 04 sts 0x0489, r24 ; 0x800489 [[fallthrough]]; case (uint8_t)ReportErrorHookStates::MONITOR_SELECTION: is_mmu_error_monitor_active = true; 2a5c8: 81 e0 ldi r24, 0x01 ; 1 2a5ca: 80 93 5c 06 sts 0x065C, r24 ; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447> ReportErrorHookDynamicRender(); // Render dynamic characters 2a5ce: 0f 94 30 50 call 0x2a060 ; 0x2a060 sound_wait_for_user(); 2a5d2: 0f 94 62 28 call 0x250c4 ; 0x250c4 const char *PrusaErrorDesc(uint8_t i) { return (const char *)pgm_read_ptr(errorDescs + i); } uint8_t PrusaErrorButtons(uint8_t i) { return pgm_read_byte(errorButtons + i); 2a5d6: 0d 2f mov r16, r29 2a5d8: 10 e0 ldi r17, 0x00 ; 0 2a5da: f8 01 movw r30, r16 2a5dc: e9 5c subi r30, 0xC9 ; 201 2a5de: f7 47 sbci r31, 0x77 ; 119 2a5e0: c4 91 lpm r28, Z bool two_choices = false; static uint8_t reset_button_selection; // Read and determine what operations should be shown on the menu const uint8_t button_operation = PrusaErrorButtons(ei); const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation); 2a5e2: dc 2f mov r29, r28 2a5e4: d2 95 swap r29 2a5e6: df 70 andi r29, 0x0F ; 15 if (button_op_right == (uint8_t)ButtonOperations::NoOperation){ // Two operations not specified, the error menu should only show two choices two_choices = true; } static int8_t current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE; 2a5e8: 80 91 81 04 lds r24, 0x0481 ; 0x800481 2a5ec: 81 11 cpse r24, r1 2a5ee: 09 c0 rjmp .+18 ; 0x2a602 2a5f0: 81 e0 ldi r24, 0x01 ; 1 2a5f2: d1 11 cpse r29, r1 2a5f4: 01 c0 rjmp .+2 ; 0x2a5f8 2a5f6: 80 e0 ldi r24, 0x00 ; 0 2a5f8: 80 93 80 04 sts 0x0480, r24 ; 0x800480 2a5fc: 81 e0 ldi r24, 0x01 ; 1 2a5fe: 80 93 81 04 sts 0x0481, r24 ; 0x800481 static int8_t choice_selected = -1; if (reset_button_selection) { 2a602: 80 91 7f 04 lds r24, 0x047F ; 0x80047f 2a606: 88 23 and r24, r24 2a608: 41 f0 breq .+16 ; 0x2a61a // If a new error screen is shown, we must reset the button selection // Default selection is different depending on how many buttons are present current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE; 2a60a: 81 e0 ldi r24, 0x01 ; 1 2a60c: d1 11 cpse r29, r1 2a60e: 01 c0 rjmp .+2 ; 0x2a612 2a610: 80 e0 ldi r24, 0x00 ; 0 2a612: 80 93 80 04 sts 0x0480, r24 ; 0x800480 choice_selected = -1; reset_button_selection = 0; 2a616: 10 92 7f 04 sts 0x047F, r1 ; 0x80047f } // Check if knob was rotated if (lcd_encoder) { 2a61a: 20 91 1e 06 lds r18, 0x061E ; 0x80061e 2a61e: 30 91 1f 06 lds r19, 0x061F ; 0x80061f 2a622: 21 15 cp r18, r1 2a624: 31 05 cpc r19, r1 2a626: b9 f1 breq .+110 ; 0x2a696 2a628: 80 91 80 04 lds r24, 0x0480 ; 0x800480 if (two_choices == false) { // third_choice is not nullptr, safe to dereference 2a62c: dd 23 and r29, r29 2a62e: 61 f0 breq .+24 ; 0x2a648 if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 2a630: 37 ff sbrs r19, 7 2a632: 06 c0 rjmp .+12 ; 0x2a640 2a634: 88 23 and r24, r24 2a636: 69 f0 breq .+26 ; 0x2a652 // Rotating knob counter clockwise current_selection--; 2a638: 81 50 subi r24, 0x01 ; 1 if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { // Rotating knob counter clockwise current_selection = LCD_LEFT_BUTTON_CHOICE; } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) { // Rotating knob clockwise current_selection = LCD_MIDDLE_BUTTON_CHOICE; 2a63a: 80 93 80 04 sts 0x0480, r24 ; 0x800480 2a63e: 09 c0 rjmp .+18 ; 0x2a652 if (lcd_encoder) { if (two_choices == false) { // third_choice is not nullptr, safe to dereference if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { // Rotating knob counter clockwise current_selection--; } else if (lcd_encoder > 0 && current_selection != LCD_RIGHT_BUTTON_CHOICE) { 2a640: 82 30 cpi r24, 0x02 ; 2 2a642: 39 f0 breq .+14 ; 0x2a652 // Rotating knob clockwise current_selection++; 2a644: 8f 5f subi r24, 0xFF ; 255 2a646: f9 cf rjmp .-14 ; 0x2a63a } } else { if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 2a648: 37 ff sbrs r19, 7 2a64a: 41 c0 rjmp .+130 ; 0x2a6ce 2a64c: 81 11 cpse r24, r1 // Rotating knob counter clockwise current_selection = LCD_LEFT_BUTTON_CHOICE; 2a64e: 10 92 80 04 sts 0x0480, r1 ; 0x800480 //! ---------------------- //! |>(left) >(mid) | //! ---------------------- //! @endcode // lcd_putc_at(0, 3, current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' '); 2a652: 80 91 80 04 lds r24, 0x0480 ; 0x800480 2a656: 4e e3 ldi r20, 0x3E ; 62 2a658: 81 11 cpse r24, r1 2a65a: 40 e2 ldi r20, 0x20 ; 32 2a65c: 63 e0 ldi r22, 0x03 ; 3 2a65e: 80 e0 ldi r24, 0x00 ; 0 2a660: 0e 94 13 70 call 0xe026 ; 0xe026 2a664: 80 91 80 04 lds r24, 0x0480 ; 0x800480 if (two_choices == false) 2a668: dd 23 and r29, r29 2a66a: b1 f1 breq .+108 ; 0x2a6d8 { lcd_putc_at(9, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 2a66c: 4e e3 ldi r20, 0x3E ; 62 2a66e: 81 30 cpi r24, 0x01 ; 1 2a670: 09 f0 breq .+2 ; 0x2a674 2a672: 40 e2 ldi r20, 0x20 ; 32 2a674: 63 e0 ldi r22, 0x03 ; 3 2a676: 89 e0 ldi r24, 0x09 ; 9 2a678: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' '); 2a67c: 80 91 80 04 lds r24, 0x0480 ; 0x800480 2a680: 82 30 cpi r24, 0x02 ; 2 2a682: 61 f5 brne .+88 ; 0x2a6dc } else { // More button for two button screen lcd_putc_at(18, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 2a684: 4e e3 ldi r20, 0x3E ; 62 2a686: 63 e0 ldi r22, 0x03 ; 3 2a688: 82 e1 ldi r24, 0x12 ; 18 2a68a: 0e 94 13 70 call 0xe026 ; 0xe026 } // Consume rotation event lcd_encoder = 0; 2a68e: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 2a692: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e } // Check if knob was clicked and consume the event if (lcd_clicked()) { 2a696: 0e 94 75 73 call 0xe6ea ; 0xe6ea 2a69a: 88 23 and r24, r24 2a69c: 09 f4 brne .+2 ; 0x2a6a0 2a69e: 34 cf rjmp .-408 ; 0x2a508 choice_selected = current_selection; 2a6a0: 80 91 80 04 lds r24, 0x0480 ; 0x800480 } else { // continue monitoring return ret; } if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE) // Two choices and middle button selected 2a6a4: d1 11 cpse r29, r1 2a6a6: 1c c0 rjmp .+56 ; 0x2a6e0 2a6a8: 81 30 cpi r24, 0x01 ; 1 2a6aa: 89 f5 brne .+98 ; 0x2a70e const char *PrusaErrorTitle(uint8_t i) { return (const char *)pgm_read_ptr(errorTitles + i); } const char *PrusaErrorDesc(uint8_t i) { return (const char *)pgm_read_ptr(errorDescs + i); 2a6ac: f8 01 movw r30, r16 2a6ae: ee 0f add r30, r30 2a6b0: ff 1f adc r31, r31 2a6b2: e3 52 subi r30, 0x23 ; 35 2a6b4: f8 47 sbci r31, 0x78 ; 120 2a6b6: 85 91 lpm r24, Z+ 2a6b8: 94 91 lpm r25, Z || (!two_choices && choice_selected == LCD_RIGHT_BUTTON_CHOICE)) // Three choices and right most button selected { // 'More' show error description lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei))); 2a6ba: 0e 94 3a 75 call 0xea74 ; 0xea74 2a6be: 0e 94 94 ea call 0x1d528 ; 0x1d528 SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 2a6c2: 81 e0 ldi r24, 0x01 ; 1 2a6c4: 80 93 7f 04 sts 0x047F, r24 ; 0x80047f lcd_return_to_status(); sound_wait_for_user_reset(); // Reset the state in case a new error is reported is_mmu_error_monitor_active = false; KEEPALIVE_STATE(IN_HANDLER); ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN; 2a6c8: 10 92 89 04 sts 0x0489, r1 ; 0x800489 2a6cc: 1d cf rjmp .-454 ; 0x2a508 } } else { if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { // Rotating knob counter clockwise current_selection = LCD_LEFT_BUTTON_CHOICE; } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) { 2a6ce: 81 30 cpi r24, 0x01 ; 1 2a6d0: 09 f4 brne .+2 ; 0x2a6d4 2a6d2: bf cf rjmp .-130 ; 0x2a652 // Rotating knob clockwise current_selection = LCD_MIDDLE_BUTTON_CHOICE; 2a6d4: 81 e0 ldi r24, 0x01 ; 1 2a6d6: b1 cf rjmp .-158 ; 0x2a63a { lcd_putc_at(9, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' '); } else { // More button for two button screen lcd_putc_at(18, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 2a6d8: 81 30 cpi r24, 0x01 ; 1 2a6da: a1 f2 breq .-88 ; 0x2a684 2a6dc: 40 e2 ldi r20, 0x20 ; 32 2a6de: d3 cf rjmp .-90 ; 0x2a686 // continue monitoring return ret; } if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE) // Two choices and middle button selected || (!two_choices && choice_selected == LCD_RIGHT_BUTTON_CHOICE)) // Three choices and right most button selected 2a6e0: 82 30 cpi r24, 0x02 ; 2 2a6e2: 21 f3 breq .-56 ; 0x2a6ac { // 'More' show error description lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei))); ret = 1; } else if(choice_selected == LCD_MIDDLE_BUTTON_CHOICE) { 2a6e4: 81 30 cpi r24, 0x01 ; 1 2a6e6: 99 f4 brne .+38 ; 0x2a70e return Buttons::NoButton; } void SetButtonResponse(ButtonOperations rsp) { buttonSelectedOperation = rsp; 2a6e8: d0 93 44 0d sts 0x0D44, r29 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 2a6ec: 80 93 7f 04 sts 0x047F, r24 ; 0x80047f // More button selected, change state ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN; break; case 2: // Exit error screen and enable lcd updates lcd_update_enable(true); 2a6f0: 81 e0 ldi r24, 0x01 ; 1 2a6f2: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_return_to_status(); 2a6f6: 0f 94 d5 07 call 0x20faa ; 0x20faa 2a6fa: 10 92 be 04 sts 0x04BE, r1 ; 0x8004be <_ZL10beep_timer.lto_priv.499> /// @brief Resets the global state of sound_wait_for_user() void sound_wait_for_user_reset() { beep_timer.stop(); bFirst = false; 2a6fe: 10 92 c1 04 sts 0x04C1, r1 ; 0x8004c1 <_ZL6bFirst.lto_priv.500> sound_wait_for_user_reset(); // Reset the state in case a new error is reported is_mmu_error_monitor_active = false; 2a702: 10 92 5c 06 sts 0x065C, r1 ; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447> KEEPALIVE_STATE(IN_HANDLER); 2a706: 82 e0 ldi r24, 0x02 ; 2 2a708: 80 93 78 02 sts 0x0278, r24 ; 0x800278 2a70c: dd cf rjmp .-70 ; 0x2a6c8 static uint8_t reset_button_selection; // Read and determine what operations should be shown on the menu const uint8_t button_operation = PrusaErrorButtons(ei); const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation); const uint8_t button_op_middle = BUTTON_OP_MIDDLE(button_operation); 2a70e: cf 70 andi r28, 0x0F ; 15 2a710: c0 93 44 0d sts 0x0D44, r28 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 2a714: 81 e0 ldi r24, 0x01 ; 1 2a716: ea cf rjmp .-44 ; 0x2a6ec return pgm_read_byte(errorButtons + i); } const char *PrusaErrorButtonTitle(uint8_t bi) { // -1 represents the hidden NoOperation button which is not drawn in any way return (const char *)pgm_read_ptr(btnOperation + bi - 1); 2a718: ef 2d mov r30, r15 2a71a: f0 e0 ldi r31, 0x00 ; 0 2a71c: ee 0f add r30, r30 2a71e: ff 1f adc r31, r31 2a720: e4 54 subi r30, 0x44 ; 68 2a722: f7 47 sbci r31, 0x77 ; 119 2a724: 85 91 lpm r24, Z+ 2a726: 94 91 lpm r25, Z lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) ); ReportErrorHookSensorLineRender(); // Render the choices lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore()); 2a728: 0e 94 3a 75 call 0xea74 ; 0xea74 2a72c: 6c 01 movw r12, r24 2a72e: 0c ef ldi r16, 0xFC ; 252 2a730: 19 e6 ldi r17, 0x69 ; 105 2a732: 99 e0 ldi r25, 0x09 ; 9 2a734: e9 2e mov r14, r25 2a736: 32 cf rjmp .-412 ; 0x2a59c 0002a738 : buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation return result; } Buttons ButtonAvailable(ErrorCode ec) { uint8_t ei = PrusaErrorCodeIndex(ec); 2a738: 0f 94 11 51 call 0x2a222 ; 0x2a222 // if nothing got caught, return a generic error return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR); } uint16_t PrusaErrorCode(uint8_t i) { return pgm_read_word(errorCodes + i); 2a73c: e8 2f mov r30, r24 2a73e: f0 e0 ldi r31, 0x00 ; 0 2a740: ee 0f add r30, r30 2a742: ff 1f adc r31, r31 2a744: ec 59 subi r30, 0x9C ; 156 2a746: f7 47 sbci r31, 0x77 ; 119 2a748: 25 91 lpm r18, Z+ 2a74a: 34 91 lpm r19, Z // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a74c: 23 33 cpi r18, 0x33 ; 51 2a74e: 81 e0 ldi r24, 0x01 ; 1 2a750: 38 07 cpc r19, r24 2a752: 08 f0 brcs .+2 ; 0x2a756 2a754: 41 c0 rjmp .+130 ; 0x2a7d8 2a756: 2d 32 cpi r18, 0x2D ; 45 2a758: 81 e0 ldi r24, 0x01 ; 1 2a75a: 38 07 cpc r19, r24 2a75c: 78 f5 brcc .+94 ; 0x2a7bc 2a75e: 2e 37 cpi r18, 0x7E ; 126 2a760: 31 05 cpc r19, r1 2a762: 09 f4 brne .+2 ; 0x2a766 2a764: 83 c0 rjmp .+262 ; 0x2a86c 2a766: f0 f4 brcc .+60 ; 0x2a7a4 2a768: 2c 36 cpi r18, 0x6C ; 108 2a76a: 31 05 cpc r19, r1 2a76c: 09 f4 brne .+2 ; 0x2a770 2a76e: 85 c0 rjmp .+266 ; 0x2a87a 2a770: 30 f4 brcc .+12 ; 0x2a77e 2a772: 25 36 cpi r18, 0x65 ; 101 2a774: 31 05 cpc r19, r1 2a776: 08 f0 brcs .+2 ; 0x2a77a 2a778: 79 c0 rjmp .+242 ; 0x2a86c default: break; } return Buttons::NoButton; 2a77a: 8f ef ldi r24, 0xFF ; 255 2a77c: 08 95 ret // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a77e: 24 37 cpi r18, 0x74 ; 116 2a780: 31 05 cpc r19, r1 2a782: 09 f4 brne .+2 ; 0x2a786 2a784: 73 c0 rjmp .+230 ; 0x2a86c 2a786: 2d 37 cpi r18, 0x7D ; 125 2a788: 31 05 cpc r19, r1 2a78a: 19 f0 breq .+6 ; 0x2a792 2a78c: 23 37 cpi r18, 0x73 ; 115 2a78e: 31 05 cpc r19, r1 2a790: a1 f7 brne .-24 ; 0x2a77a break; } break; case ERR_MECHANICAL_SELECTOR_CANNOT_HOME: case ERR_MECHANICAL_IDLER_CANNOT_HOME: switch (buttonSelectedOperation) { 2a792: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a796: 81 30 cpi r24, 0x01 ; 1 2a798: 09 f4 brne .+2 ; 0x2a79c 2a79a: 6d c0 rjmp .+218 ; 0x2a876 2a79c: 87 30 cpi r24, 0x07 ; 7 2a79e: 69 f7 brne .-38 ; 0x2a77a // may be allow move selector right and left in the future case ButtonOperations::Tune: // Tune Stallguard threshold return Buttons::TuneMMU; 2a7a0: 88 e0 ldi r24, 0x08 ; 8 2a7a2: 08 95 ret // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a7a4: 23 3d cpi r18, 0xD3 ; 211 2a7a6: 31 05 cpc r19, r1 2a7a8: 09 f4 brne .+2 ; 0x2a7ac 2a7aa: 6e c0 rjmp .+220 ; 0x2a888 2a7ac: 50 f4 brcc .+20 ; 0x2a7c2 2a7ae: 29 3c cpi r18, 0xC9 ; 201 2a7b0: 31 05 cpc r19, r1 2a7b2: 09 f4 brne .+2 ; 0x2a7b6 2a7b4: 69 c0 rjmp .+210 ; 0x2a888 2a7b6: 2a 3c cpi r18, 0xCA ; 202 2a7b8: 31 05 cpc r19, r1 2a7ba: f9 f6 brne .-66 ; 0x2a77a case ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED: case ERR_SYSTEM_QUEUE_FULL: case ERR_SYSTEM_FW_RUNTIME_ERROR: case ERR_ELECTRICAL_MMU_MCU_ERROR: switch (buttonSelectedOperation) { 2a7bc: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a7c0: 67 c0 rjmp .+206 ; 0x2a890 // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a7c2: 2d 3d cpi r18, 0xDD ; 221 2a7c4: 31 05 cpc r19, r1 2a7c6: 09 f4 brne .+2 ; 0x2a7ca 2a7c8: 5f c0 rjmp .+190 ; 0x2a888 2a7ca: 2e 3d cpi r18, 0xDE ; 222 2a7cc: 31 05 cpc r19, r1 2a7ce: b1 f3 breq .-20 ; 0x2a7bc 2a7d0: 24 3d cpi r18, 0xD4 ; 212 2a7d2: 31 05 cpc r19, r1 2a7d4: 91 f6 brne .-92 ; 0x2a77a 2a7d6: f2 cf rjmp .-28 ; 0x2a7bc 2a7d8: 25 3f cpi r18, 0xF5 ; 245 2a7da: 81 e0 ldi r24, 0x01 ; 1 2a7dc: 38 07 cpc r19, r24 2a7de: 09 f4 brne .+2 ; 0x2a7e2 2a7e0: 5c c0 rjmp .+184 ; 0x2a89a 2a7e2: f8 f4 brcc .+62 ; 0x2a822 2a7e4: 26 34 cpi r18, 0x46 ; 70 2a7e6: 81 e0 ldi r24, 0x01 ; 1 2a7e8: 38 07 cpc r19, r24 2a7ea: 58 f4 brcc .+22 ; 0x2a802 2a7ec: 21 34 cpi r18, 0x41 ; 65 2a7ee: 81 e0 ldi r24, 0x01 ; 1 2a7f0: 38 07 cpc r19, r24 2a7f2: 20 f7 brcc .-56 ; 0x2a7bc 2a7f4: 27 53 subi r18, 0x37 ; 55 2a7f6: 31 40 sbci r19, 0x01 ; 1 2a7f8: 25 30 cpi r18, 0x05 ; 5 2a7fa: 31 05 cpc r19, r1 2a7fc: 08 f0 brcs .+2 ; 0x2a800 2a7fe: bd cf rjmp .-134 ; 0x2a77a 2a800: dd cf rjmp .-70 ; 0x2a7bc 2a802: 21 59 subi r18, 0x91 ; 145 2a804: 31 40 sbci r19, 0x01 ; 1 2a806: 22 30 cpi r18, 0x02 ; 2 2a808: 31 05 cpc r19, r1 2a80a: 08 f0 brcs .+2 ; 0x2a80e 2a80c: b6 cf rjmp .-148 ; 0x2a77a } break; case ERR_CONNECT_MMU_NOT_RESPONDING: case ERR_CONNECT_COMMUNICATION_ERROR: case ERR_SYSTEM_FW_UPDATE_NEEDED: switch (buttonSelectedOperation) { 2a80e: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a812: 83 30 cpi r24, 0x03 ; 3 2a814: 09 f4 brne .+2 ; 0x2a818 2a816: 3f c0 rjmp .+126 ; 0x2a896 2a818: 89 30 cpi r24, 0x09 ; 9 2a81a: 09 f0 breq .+2 ; 0x2a81e 2a81c: ae cf rjmp .-164 ; 0x2a77a case ButtonOperations::DisableMMU: // "Disable" return Buttons::DisableMMU; 2a81e: 87 e0 ldi r24, 0x07 ; 7 2a820: 08 95 ret // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a822: 29 3f cpi r18, 0xF9 ; 249 2a824: 81 e0 ldi r24, 0x01 ; 1 2a826: 38 07 cpc r19, r24 2a828: 49 f2 breq .-110 ; 0x2a7bc 2a82a: 70 f4 brcc .+28 ; 0x2a848 2a82c: 27 3f cpi r18, 0xF7 ; 247 2a82e: 81 e0 ldi r24, 0x01 ; 1 2a830: 38 07 cpc r19, r24 2a832: 21 f2 breq .-120 ; 0x2a7bc 2a834: 60 f7 brcc .-40 ; 0x2a80e break; } break; case ERR_SYSTEM_INVALID_TOOL: switch (buttonSelectedOperation) { 2a836: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a83a: 83 30 cpi r24, 0x03 ; 3 2a83c: 61 f1 breq .+88 ; 0x2a896 2a83e: 88 30 cpi r24, 0x08 ; 8 2a840: 09 f0 breq .+2 ; 0x2a844 2a842: 9b cf rjmp .-202 ; 0x2a77a case ButtonOperations::StopPrint: // "Stop print" return Buttons::StopPrint; 2a844: 86 e0 ldi r24, 0x06 ; 6 2a846: 08 95 ret // The list of responses which occur in mmu error dialogs // Return button index or perform some action on the MK3 by itself (like Reset MMU) // Based on Prusa-Error-Codes errors_list.h // So far hardcoded, but shall be generated in the future switch ( PrusaErrorCode(ei) ) { 2a848: 2b 3f cpi r18, 0xFB ; 251 2a84a: 81 e0 ldi r24, 0x01 ; 1 2a84c: 38 07 cpc r19, r24 2a84e: a9 f0 breq .+42 ; 0x2a87a 2a850: 68 f0 brcs .+26 ; 0x2a86c 2a852: 2c 3f cpi r18, 0xFC ; 252 2a854: 31 40 sbci r19, 0x01 ; 1 2a856: 09 f0 breq .+2 ; 0x2a85a 2a858: 90 cf rjmp .-224 ; 0x2a77a default: break; } break; case ERR_SYSTEM_FILAMENT_CHANGE: switch (buttonSelectedOperation) { 2a85a: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a85e: 85 30 cpi r24, 0x05 ; 5 2a860: 89 f0 breq .+34 ; 0x2a884 2a862: 86 30 cpi r24, 0x06 ; 6 2a864: 09 f0 breq .+2 ; 0x2a868 2a866: 89 cf rjmp .-238 ; 0x2a77a case ButtonOperations::Load: return Buttons::Load; case ButtonOperations::Eject: return Buttons::Eject; 2a868: 85 e0 ldi r24, 0x05 ; 5 2a86a: 08 95 ret case ERR_MECHANICAL_INSPECT_FINDA: case ERR_MECHANICAL_SELECTOR_CANNOT_MOVE: case ERR_MECHANICAL_IDLER_CANNOT_MOVE: case ERR_MECHANICAL_PULLEY_CANNOT_MOVE: case ERR_SYSTEM_UNLOAD_MANUALLY: switch (buttonSelectedOperation) { 2a86c: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a870: 81 30 cpi r24, 0x01 ; 1 2a872: 09 f0 breq .+2 ; 0x2a876 2a874: 82 cf rjmp .-252 ; 0x2a77a switch (buttonSelectedOperation) { // may be allow move selector right and left in the future case ButtonOperations::Tune: // Tune Stallguard threshold return Buttons::TuneMMU; case ButtonOperations::Retry: // "Repeat action" return Buttons::Middle; 2a876: 81 e0 ldi r24, 0x01 ; 1 2a878: 08 95 ret break; } break; case ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED: case ERR_SYSTEM_FILAMENT_EJECTED: switch (buttonSelectedOperation) { 2a87a: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a87e: 82 30 cpi r24, 0x02 ; 2 2a880: d1 f3 breq .-12 ; 0x2a876 2a882: 7b cf rjmp .-266 ; 0x2a77a } break; case ERR_SYSTEM_FILAMENT_CHANGE: switch (buttonSelectedOperation) { case ButtonOperations::Load: return Buttons::Load; 2a884: 84 e0 ldi r24, 0x04 ; 4 2a886: 08 95 ret } break; case ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT: case ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT: case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT: switch (buttonSelectedOperation) { 2a888: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a88c: 82 30 cpi r24, 0x02 ; 2 2a88e: 61 f0 breq .+24 ; 0x2a8a8 case ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED: case ERR_SYSTEM_QUEUE_FULL: case ERR_SYSTEM_FW_RUNTIME_ERROR: case ERR_ELECTRICAL_MMU_MCU_ERROR: switch (buttonSelectedOperation) { 2a890: 83 30 cpi r24, 0x03 ; 3 2a892: 09 f0 breq .+2 ; 0x2a896 2a894: 72 cf rjmp .-284 ; 0x2a77a case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT: switch (buttonSelectedOperation) { case ButtonOperations::Continue: // "Continue" return Buttons::Left; case ButtonOperations::ResetMMU: // "Reset MMU" return Buttons::ResetMMU; 2a896: 83 e0 ldi r24, 0x03 ; 3 default: break; } return Buttons::NoButton; } 2a898: 08 95 ret default: break; } break; case ERR_SYSTEM_FILAMENT_ALREADY_LOADED: switch (buttonSelectedOperation) { 2a89a: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 2a89e: 82 30 cpi r24, 0x02 ; 2 2a8a0: 29 f0 breq .+10 ; 0x2a8ac 2a8a2: 84 30 cpi r24, 0x04 ; 4 2a8a4: 09 f0 breq .+2 ; 0x2a8a8 2a8a6: 69 cf rjmp .-302 ; 0x2a77a case ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT: case ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT: case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT: switch (buttonSelectedOperation) { case ButtonOperations::Continue: // "Continue" return Buttons::Left; 2a8a8: 82 e0 ldi r24, 0x02 ; 2 2a8aa: 08 95 ret case ERR_SYSTEM_FILAMENT_ALREADY_LOADED: switch (buttonSelectedOperation) { case ButtonOperations::Unload: // "Unload" return Buttons::Left; case ButtonOperations::Continue: // "Proceed/Continue" return Buttons::Right; 2a8ac: 80 e0 ldi r24, 0x00 ; 0 2a8ae: 08 95 ret 0002a8b0 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>: #endif namespace MMU2 { template void waitForHotendTargetTemp(uint16_t delay, F f) { 2a8b0: cf 93 push r28 2a8b2: df 93 push r29 2a8b4: ec 01 movw r28, r24 int16_t thermal_degTargetHotend() { return degTargetHotend(0); } int16_t thermal_degHotend() { return degHotend(0); 2a8b6: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2a8ba: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2a8be: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2a8c2: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2a8c6: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) { 2a8ca: 20 91 5d 12 lds r18, 0x125D ; 0x80125d 2a8ce: 30 91 5e 12 lds r19, 0x125E ; 0x80125e 2a8d2: c9 01 movw r24, r18 2a8d4: 86 1b sub r24, r22 2a8d6: 97 0b sbc r25, r23 2a8d8: 06 97 sbiw r24, 0x06 ; 6 2a8da: 24 f0 brlt .+8 ; 0x2a8e4 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]+0x34> void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 2a8dc: ce 01 movw r24, r28 2a8de: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 2a8e2: e9 cf rjmp .-46 ; 0x2a8b6 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]+0x6> f(); safe_delay_keep_alive(delay); } } 2a8e4: df 91 pop r29 2a8e6: cf 91 pop r28 2a8e8: 08 95 ret 0002a8ea : } //parameter ix: index of mesh bed leveling point in X-axis (for meas_points == 7 is valid range from 0 to 6; for meas_points == 3 is valid range from 0 to 2 ) //parameter iy: index of mesh bed leveling point in Y-axis (for meas_points == 7 is valid range from 0 to 6; for meas_points == 3 is valid range from 0 to 2 ) //function returns true if point is considered valid (typicaly in safe distance from magnet or another object which inflences PINDA measurements) bool mbl_point_measurement_valid(uint8_t ix, uint8_t iy) { 2a8ea: cf 93 push r28 2a8ec: df 93 push r29 2a8ee: 00 d0 rcall .+0 ; 0x2a8f0 2a8f0: 00 d0 rcall .+0 ; 0x2a8f2 2a8f2: 1f 92 push r1 2a8f4: cd b7 in r28, 0x3d ; 61 2a8f6: de b7 in r29, 0x3e ; 62 //"human readable" heatbed plan //magnet proximity influence Z coordinate measurements significantly (40 - 100 um) //0 - measurement point is above magnet and Z coordinate can be influenced negatively //1 - we should be in safe distance from magnets, measurement should be accurate if ((ix >= MESH_NUM_X_POINTS) || (iy >= MESH_NUM_Y_POINTS)) 2a8f8: 87 30 cpi r24, 0x07 ; 7 2a8fa: 50 f5 brcc .+84 ; 0x2a950 2a8fc: 67 30 cpi r22, 0x07 ; 7 2a8fe: 40 f5 brcc .+80 ; 0x2a950 return false; uint8_t valid_points_mask[7] = { 2a900: 97 e0 ldi r25, 0x07 ; 7 2a902: ed eb ldi r30, 0xBD ; 189 2a904: f2 e0 ldi r31, 0x02 ; 2 2a906: de 01 movw r26, r28 2a908: 11 96 adiw r26, 0x01 ; 1 2a90a: 01 90 ld r0, Z+ 2a90c: 0d 92 st X+, r0 2a90e: 9a 95 dec r25 2a910: e1 f7 brne .-8 ; 0x2a90a 0b1110111,//2 0b1111111,//1 0b1111111,//0 //[0,0] }; return (valid_points_mask[6 - iy] & (1 << (6 - ix))); 2a912: 46 e0 ldi r20, 0x06 ; 6 2a914: 50 e0 ldi r21, 0x00 ; 0 2a916: fa 01 movw r30, r20 2a918: e6 1b sub r30, r22 2a91a: f1 09 sbc r31, r1 2a91c: 21 e0 ldi r18, 0x01 ; 1 2a91e: 30 e0 ldi r19, 0x00 ; 0 2a920: 2c 0f add r18, r28 2a922: 3d 1f adc r19, r29 2a924: e2 0f add r30, r18 2a926: f3 1f adc r31, r19 2a928: 20 81 ld r18, Z 2a92a: 30 e0 ldi r19, 0x00 ; 0 2a92c: 48 1b sub r20, r24 2a92e: 51 09 sbc r21, r1 2a930: c9 01 movw r24, r18 2a932: 02 c0 rjmp .+4 ; 0x2a938 2a934: 95 95 asr r25 2a936: 87 95 ror r24 2a938: 4a 95 dec r20 2a93a: e2 f7 brpl .-8 ; 0x2a934 2a93c: 81 70 andi r24, 0x01 ; 1 } 2a93e: 27 96 adiw r28, 0x07 ; 7 2a940: 0f b6 in r0, 0x3f ; 63 2a942: f8 94 cli 2a944: de bf out 0x3e, r29 ; 62 2a946: 0f be out 0x3f, r0 ; 63 2a948: cd bf out 0x3d, r28 ; 61 2a94a: df 91 pop r29 2a94c: cf 91 pop r28 2a94e: 08 95 ret //"human readable" heatbed plan //magnet proximity influence Z coordinate measurements significantly (40 - 100 um) //0 - measurement point is above magnet and Z coordinate can be influenced negatively //1 - we should be in safe distance from magnets, measurement should be accurate if ((ix >= MESH_NUM_X_POINTS) || (iy >= MESH_NUM_Y_POINTS)) return false; 2a950: 80 e0 ldi r24, 0x00 ; 0 2a952: f5 cf rjmp .-22 ; 0x2a93e 0002a954 : shift_z(- float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS])); } void babystep_undo() { shift_z(float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS])); 2a954: 60 91 26 06 lds r22, 0x0626 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> 2a958: 70 91 27 06 lds r23, 0x0627 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 2a95c: 07 2e mov r0, r23 2a95e: 00 0c add r0, r0 2a960: 88 0b sbc r24, r24 2a962: 99 0b sbc r25, r25 2a964: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2a968: 20 91 73 0d lds r18, 0x0D73 ; 0x800d73 2a96c: 30 91 74 0d lds r19, 0x0D74 ; 0x800d74 2a970: 40 91 75 0d lds r20, 0x0D75 ; 0x800d75 2a974: 50 91 76 0d lds r21, 0x0D76 ; 0x800d76 2a978: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2a97c: 0e 94 a6 5e call 0xbd4c ; 0xbd4c babystepLoadZ = 0; 2a980: 10 92 27 06 sts 0x0627, r1 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 2a984: 10 92 26 06 sts 0x0626, r1 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> } 2a988: 08 95 ret 0002a98a : * the value zero, false, is returned for failure. * Reasons for failure include this file is already open, \a dirFile is not * a directory, \a path is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { 2a98a: 2f 92 push r2 2a98c: 3f 92 push r3 2a98e: 4f 92 push r4 2a990: 5f 92 push r5 2a992: 6f 92 push r6 2a994: 7f 92 push r7 2a996: 8f 92 push r8 2a998: 9f 92 push r9 2a99a: af 92 push r10 2a99c: bf 92 push r11 2a99e: cf 92 push r12 2a9a0: df 92 push r13 2a9a2: ef 92 push r14 2a9a4: ff 92 push r15 2a9a6: 0f 93 push r16 2a9a8: 1f 93 push r17 2a9aa: cf 93 push r28 2a9ac: df 93 push r29 2a9ae: cd b7 in r28, 0x3d ; 61 2a9b0: de b7 in r29, 0x3e ; 62 2a9b2: c2 54 subi r28, 0x42 ; 66 2a9b4: d1 09 sbc r29, r1 2a9b6: 0f b6 in r0, 0x3f ; 63 2a9b8: f8 94 cli 2a9ba: de bf out 0x3e, r29 ; 62 2a9bc: 0f be out 0x3f, r0 ; 63 2a9be: cd bf out 0x3d, r28 ; 61 2a9c0: 4c 01 movw r8, r24 2a9c2: 5b 01 movw r10, r22 2a9c4: 6a 01 movw r12, r20 2a9c6: 32 2e mov r3, r18 * \brief Base class for SdFile with Print and C++ streams. */ class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} 2a9c8: 19 82 std Y+1, r1 ; 0x01 2a9ca: 1c 82 std Y+4, r1 ; 0x04 2a9cc: 1c 8e std Y+28, r1 ; 0x1c 2a9ce: 1f 8e std Y+31, r1 ; 0x1f uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile *parent = dirFile; SdBaseFile *sub = &dir1; if (!dirFile) goto fail; 2a9d0: 67 2b or r22, r23 2a9d2: 21 f5 brne .+72 ; 0x2aa1c sub = parent != &dir1 ? &dir1 : &dir2; } return open(parent, dname, oflag); fail: return false; 2a9d4: 10 e0 ldi r17, 0x00 ; 0 * a directory, \a path is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { uint8_t dname[11]; SdBaseFile dir1, dir2; 2a9d6: ce 01 movw r24, r28 2a9d8: 4c 96 adiw r24, 0x1c ; 28 2a9da: 0e 94 ab 79 call 0xf356 ; 0xf356 2a9de: ce 01 movw r24, r28 2a9e0: 01 96 adiw r24, 0x01 ; 1 2a9e2: 0e 94 ab 79 call 0xf356 ; 0xf356 } return open(parent, dname, oflag); fail: return false; } 2a9e6: 81 2f mov r24, r17 2a9e8: ce 5b subi r28, 0xBE ; 190 2a9ea: df 4f sbci r29, 0xFF ; 255 2a9ec: 0f b6 in r0, 0x3f ; 63 2a9ee: f8 94 cli 2a9f0: de bf out 0x3e, r29 ; 62 2a9f2: 0f be out 0x3f, r0 ; 63 2a9f4: cd bf out 0x3d, r28 ; 61 2a9f6: df 91 pop r29 2a9f8: cf 91 pop r28 2a9fa: 1f 91 pop r17 2a9fc: 0f 91 pop r16 2a9fe: ff 90 pop r15 2aa00: ef 90 pop r14 2aa02: df 90 pop r13 2aa04: cf 90 pop r12 2aa06: bf 90 pop r11 2aa08: af 90 pop r10 2aa0a: 9f 90 pop r9 2aa0c: 8f 90 pop r8 2aa0e: 7f 90 pop r7 2aa10: 6f 90 pop r6 2aa12: 5f 90 pop r5 2aa14: 4f 90 pop r4 2aa16: 3f 90 pop r3 2aa18: 2f 90 pop r2 2aa1a: 08 95 ret SdBaseFile *sub = &dir1; if (!dirFile) goto fail; // error if already open if (isOpen()) goto fail; 2aa1c: fc 01 movw r30, r24 2aa1e: 83 81 ldd r24, Z+3 ; 0x03 2aa20: 81 11 cpse r24, r1 2aa22: d8 cf rjmp .-80 ; 0x2a9d4 if (*path == '/') { 2aa24: fa 01 movw r30, r20 2aa26: 80 81 ld r24, Z 2aa28: 8f 32 cpi r24, 0x2F ; 47 2aa2a: c1 f4 brne .+48 ; 0x2aa5c 2aa2c: ca 01 movw r24, r20 2aa2e: 6c 01 movw r12, r24 2aa30: 01 96 adiw r24, 0x01 ; 1 while (*path == '/') path++; 2aa32: f6 01 movw r30, r12 2aa34: 20 81 ld r18, Z 2aa36: 2f 32 cpi r18, 0x2F ; 47 2aa38: d1 f3 breq .-12 ; 0x2aa2e bool isOpen() const {return type_ != FAT_FILE_TYPE_CLOSED;} /** \return True if this is a subdirectory else false. */ bool isSubDir() const {return type_ == FAT_FILE_TYPE_SUBDIR;} /** \return True if this is the root directory. */ bool isRoot() const { return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32; 2aa3a: f5 01 movw r30, r10 2aa3c: 83 81 ldd r24, Z+3 ; 0x03 2aa3e: 82 50 subi r24, 0x02 ; 2 if (!dirFile->isRoot()) { 2aa40: 82 30 cpi r24, 0x02 ; 2 2aa42: 60 f0 brcs .+24 ; 0x2aa5c if (!dir2.openRoot(dirFile->vol_)) goto fail; 2aa44: 61 8d ldd r22, Z+25 ; 0x19 2aa46: 72 8d ldd r23, Z+26 ; 0x1a 2aa48: ce 01 movw r24, r28 2aa4a: 4c 96 adiw r24, 0x1c ; 28 2aa4c: 0f 94 42 2c call 0x25884 ; 0x25884 parent = &dir2; 2aa50: 8e 01 movw r16, r28 2aa52: 04 5e subi r16, 0xE4 ; 228 2aa54: 1f 4f sbci r17, 0xFF ; 255 if (isOpen()) goto fail; if (*path == '/') { while (*path == '/') path++; if (!dirFile->isRoot()) { if (!dir2.openRoot(dirFile->vol_)) goto fail; 2aa56: 81 11 cpse r24, r1 2aa58: 02 c0 rjmp .+4 ; 0x2aa5e 2aa5a: bc cf rjmp .-136 ; 0x2a9d4 // error if already open if (isOpen()) goto fail; if (*path == '/') { while (*path == '/') path++; if (!dirFile->isRoot()) { 2aa5c: 85 01 movw r16, r10 while (*path == '/') path++; if (!*path) break; if (!sub->open(parent, dname, O_READ)) goto fail; if (parent != dirFile) parent->close(); parent = sub; sub = parent != &dir1 ? &dir1 : &dir2; 2aa5e: ce 01 movw r24, r28 2aa60: 01 96 adiw r24, 0x01 ; 1 2aa62: 7c 01 movw r14, r24 2aa64: 3c 01 movw r6, r24 2aa66: 2e 01 movw r4, r28 2aa68: 9c e1 ldi r25, 0x1C ; 28 2aa6a: 49 0e add r4, r25 2aa6c: 51 1c adc r5, r1 2aa6e: 23 96 adiw r28, 0x03 ; 3 2aa70: ef ae std Y+63, r14 ; 0x3f 2aa72: 23 97 sbiw r28, 0x03 ; 3 2aa74: 2f 2c mov r2, r15 2aa76: fe 01 movw r30, r28 2aa78: f7 96 adiw r30, 0x37 ; 55 2aa7a: cf 01 movw r24, r30 2aa7c: 0b 96 adiw r24, 0x0b ; 11 2aa7e: af 01 movw r20, r30 bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { uint8_t c; uint8_t n = 7; // max index for part before dot uint8_t i = 0; // blank fill name and extension while (i < 11) name[i++] = ' '; 2aa80: 20 e2 ldi r18, 0x20 ; 32 2aa82: 21 93 st Z+, r18 2aa84: e8 17 cp r30, r24 2aa86: f9 07 cpc r31, r25 2aa88: d9 f7 brne .-10 ; 0x2aa80 2aa8a: 96 01 movw r18, r12 i = 0; 2aa8c: 90 e0 ldi r25, 0x00 ; 0 } //------------------------------------------------------------------------------ // format directory name field from a 8.3 name string bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { uint8_t c; uint8_t n = 7; // max index for part before dot 2aa8e: 67 e0 ldi r22, 0x07 ; 7 uint8_t i = 0; // blank fill name and extension while (i < 11) name[i++] = ' '; i = 0; while (*str != '\0' && *str != '/') { 2aa90: d9 01 movw r26, r18 2aa92: 8d 91 ld r24, X+ 2aa94: 88 23 and r24, r24 2aa96: 49 f1 breq .+82 ; 0x2aaea 2aa98: 8f 32 cpi r24, 0x2F ; 47 2aa9a: 39 f1 breq .+78 ; 0x2aaea c = *str++; 2aa9c: 28 2f mov r18, r24 if (c == '.') { 2aa9e: 8e 32 cpi r24, 0x2E ; 46 2aaa0: 39 f4 brne .+14 ; 0x2aab0 if (n == 10) goto fail; // only one dot allowed 2aaa2: 6a 30 cpi r22, 0x0A ; 10 2aaa4: 09 f4 brne .+2 ; 0x2aaa8 2aaa6: 96 cf rjmp .-212 ; 0x2a9d4 n = 10; // max index for full 8.3 name i = 8; // place for extension 2aaa8: 98 e0 ldi r25, 0x08 ; 8 i = 0; while (*str != '\0' && *str != '/') { c = *str++; if (c == '.') { if (n == 10) goto fail; // only one dot allowed n = 10; // max index for full 8.3 name 2aaaa: 6a e0 ldi r22, 0x0A ; 10 2aaac: 9d 01 movw r18, r26 2aaae: f0 cf rjmp .-32 ; 0x2aa90 2aab0: eb e8 ldi r30, 0x8B ; 139 2aab2: fb e8 ldi r31, 0x8B ; 139 //PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); // 2019-08-27 really? // Microsoft defines, that only a subset of these characters is not allowed. PGM_P p = PSTR("|<>?/*\"\\"); uint8_t b; while ((b = pgm_read_byte(p++))) if (b == c) goto fail; 2aab4: 34 91 lpm r19, Z 2aab6: 33 23 and r19, r19 2aab8: 21 f0 breq .+8 ; 0x2aac2 2aaba: 31 96 adiw r30, 0x01 ; 1 2aabc: 83 13 cpse r24, r19 2aabe: fa cf rjmp .-12 ; 0x2aab4 2aac0: 89 cf rjmp .-238 ; 0x2a9d4 // check size and only allow ASCII printable characters if (i > n || c < 0X21 || c > 0X7E)goto fail; 2aac2: 69 17 cp r22, r25 2aac4: 08 f4 brcc .+2 ; 0x2aac8 2aac6: 86 cf rjmp .-244 ; 0x2a9d4 2aac8: 3f ed ldi r19, 0xDF ; 223 2aaca: 38 0f add r19, r24 2aacc: 3e 35 cpi r19, 0x5E ; 94 2aace: 08 f0 brcs .+2 ; 0x2aad2 2aad0: 81 cf rjmp .-254 ; 0x2a9d4 // only upper case allowed in 8.3 names - convert lower to upper name[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); 2aad2: 3f e9 ldi r19, 0x9F ; 159 2aad4: 38 0f add r19, r24 2aad6: 3a 31 cpi r19, 0x1A ; 26 2aad8: 10 f4 brcc .+4 ; 0x2aade 2aada: 20 ee ldi r18, 0xE0 ; 224 2aadc: 28 0f add r18, r24 2aade: fa 01 movw r30, r20 2aae0: e9 0f add r30, r25 2aae2: f1 1d adc r31, r1 2aae4: 20 83 st Z, r18 2aae6: 9f 5f subi r25, 0xFF ; 255 2aae8: e1 cf rjmp .-62 ; 0x2aaac if (!dir2.openRoot(dirFile->vol_)) goto fail; parent = &dir2; } } while (1) { if (!make83Name(path, dname, &path)) goto fail; 2aaea: 8f a9 ldd r24, Y+55 ; 0x37 2aaec: 80 32 cpi r24, 0x20 ; 32 2aaee: 09 f4 brne .+2 ; 0x2aaf2 2aaf0: 71 cf rjmp .-286 ; 0x2a9d4 2aaf2: 69 01 movw r12, r18 while (*path == '/') path++; 2aaf4: f9 01 movw r30, r18 2aaf6: 80 81 ld r24, Z 2aaf8: 2f 5f subi r18, 0xFF ; 255 2aafa: 3f 4f sbci r19, 0xFF ; 255 2aafc: 8f 32 cpi r24, 0x2F ; 47 2aafe: c9 f3 breq .-14 ; 0x2aaf2 if (!*path) break; 2ab00: 88 23 and r24, r24 2ab02: d9 f0 breq .+54 ; 0x2ab3a if (!sub->open(parent, dname, O_READ)) goto fail; 2ab04: 21 e0 ldi r18, 0x01 ; 1 2ab06: b8 01 movw r22, r16 2ab08: c7 01 movw r24, r14 2ab0a: 0f 94 b0 30 call 0x26160 ; 0x26160 2ab0e: 88 23 and r24, r24 2ab10: 09 f4 brne .+2 ; 0x2ab14 2ab12: 60 cf rjmp .-320 ; 0x2a9d4 if (parent != dirFile) parent->close(); 2ab14: 0a 15 cp r16, r10 2ab16: 1b 05 cpc r17, r11 2ab18: 19 f0 breq .+6 ; 0x2ab20 2ab1a: c8 01 movw r24, r16 2ab1c: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 parent = sub; sub = parent != &dir1 ? &dir1 : &dir2; 2ab20: 94 2d mov r25, r4 2ab22: 85 2d mov r24, r5 2ab24: 6e 14 cp r6, r14 2ab26: 7f 04 cpc r7, r15 2ab28: 21 f0 breq .+8 ; 0x2ab32 2ab2a: 23 96 adiw r28, 0x03 ; 3 2ab2c: 9f ad ldd r25, Y+63 ; 0x3f 2ab2e: 23 97 sbiw r28, 0x03 ; 3 2ab30: 82 2d mov r24, r2 2ab32: 87 01 movw r16, r14 2ab34: e9 2e mov r14, r25 2ab36: f8 2e mov r15, r24 2ab38: 9e cf rjmp .-196 ; 0x2aa76 } return open(parent, dname, oflag); 2ab3a: 23 2d mov r18, r3 2ab3c: b8 01 movw r22, r16 2ab3e: c4 01 movw r24, r8 2ab40: 0f 94 b0 30 call 0x26160 ; 0x26160 2ab44: 18 2f mov r17, r24 2ab46: 47 cf rjmp .-370 ; 0x2a9d6 0002ab48 : } // think twice before allowing this to inline - manipulating 4B longs is costly // moreover - this function has its parameters in registers only, so no heavy stack usage besides the call/ret void __attribute__((noinline)) SdFile::gfUpdateCurrentPosition(uint16_t inc){ curPosition_ += inc; 2ab48: ef e6 ldi r30, 0x6F ; 111 2ab4a: f6 e1 ldi r31, 0x16 ; 22 2ab4c: 40 81 ld r20, Z 2ab4e: 51 81 ldd r21, Z+1 ; 0x01 2ab50: 62 81 ldd r22, Z+2 ; 0x02 2ab52: 73 81 ldd r23, Z+3 ; 0x03 2ab54: 48 0f add r20, r24 2ab56: 59 1f adc r21, r25 2ab58: 61 1d adc r22, r1 2ab5a: 71 1d adc r23, r1 2ab5c: 40 83 st Z, r20 2ab5e: 51 83 std Z+1, r21 ; 0x01 2ab60: 62 83 std Z+2, r22 ; 0x02 2ab62: 73 83 std Z+3, r23 ; 0x03 } 2ab64: 08 95 ret 0002ab66 : float median(float *points, const uint8_t num_points){ sort(points, num_points); return points[num_points / 2]; } float __attribute__ ((noinline)) CLAMP_median(float *shifts, uint8_t blocks, float norm){ 2ab66: 2f 92 push r2 2ab68: 3f 92 push r3 2ab6a: 4f 92 push r4 2ab6c: 5f 92 push r5 2ab6e: 6f 92 push r6 2ab70: 7f 92 push r7 2ab72: 8f 92 push r8 2ab74: 9f 92 push r9 2ab76: af 92 push r10 2ab78: bf 92 push r11 2ab7a: cf 92 push r12 2ab7c: df 92 push r13 2ab7e: ef 92 push r14 2ab80: ff 92 push r15 2ab82: 0f 93 push r16 2ab84: 1f 93 push r17 2ab86: cf 93 push r28 2ab88: df 93 push r29 2ab8a: 00 d0 rcall .+0 ; 0x2ab8c 2ab8c: 1f 92 push r1 2ab8e: 1f 92 push r1 2ab90: cd b7 in r28, 0x3d ; 61 2ab92: de b7 in r29, 0x3e ; 62 2ab94: 1c 01 movw r2, r24 2ab96: 2a 01 movw r4, r20 2ab98: 3b 01 movw r6, r22 2ab9a: 00 e2 ldi r16, 0x20 ; 32 2ab9c: 10 e0 ldi r17, 0x00 ; 0 /// slow bubble sort but short void sort(float *points, const uint8_t num_points){ /// one direction bubble sort for (uint8_t i = 0; i < num_points; ++i){ for (uint8_t j = 0; j < num_points - i - 1; ++j){ 2ab9e: 19 82 std Y+1, r1 ; 0x01 2aba0: 99 81 ldd r25, Y+1 ; 0x01 2aba2: 89 2f mov r24, r25 2aba4: 90 e0 ldi r25, 0x00 ; 0 2aba6: 9b 83 std Y+3, r25 ; 0x03 2aba8: 8a 83 std Y+2, r24 ; 0x02 2abaa: 80 17 cp r24, r16 2abac: 91 07 cpc r25, r17 2abae: 9c f5 brge .+102 ; 0x2ac16 if (points[j] > points[j + 1]) 2abb0: 88 0f add r24, r24 2abb2: 99 1f adc r25, r25 2abb4: 88 0f add r24, r24 2abb6: 99 1f adc r25, r25 2abb8: 9d 83 std Y+5, r25 ; 0x05 2abba: 8c 83 std Y+4, r24 ; 0x04 2abbc: 82 0d add r24, r2 2abbe: 93 1d adc r25, r3 2abc0: 9b 83 std Y+3, r25 ; 0x03 2abc2: 8a 83 std Y+2, r24 ; 0x02 2abc4: fc 01 movw r30, r24 2abc6: c0 80 ld r12, Z 2abc8: d1 80 ldd r13, Z+1 ; 0x01 2abca: e2 80 ldd r14, Z+2 ; 0x02 2abcc: f3 80 ldd r15, Z+3 ; 0x03 2abce: 8c 81 ldd r24, Y+4 ; 0x04 2abd0: 9d 81 ldd r25, Y+5 ; 0x05 2abd2: 04 96 adiw r24, 0x04 ; 4 2abd4: 82 0d add r24, r2 2abd6: 93 1d adc r25, r3 2abd8: 9d 83 std Y+5, r25 ; 0x05 2abda: 8c 83 std Y+4, r24 ; 0x04 2abdc: fc 01 movw r30, r24 2abde: 80 80 ld r8, Z 2abe0: 91 80 ldd r9, Z+1 ; 0x01 2abe2: a2 80 ldd r10, Z+2 ; 0x02 2abe4: b3 80 ldd r11, Z+3 ; 0x03 2abe6: a5 01 movw r20, r10 2abe8: 94 01 movw r18, r8 2abea: c7 01 movw r24, r14 2abec: b6 01 movw r22, r12 2abee: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2abf2: 18 16 cp r1, r24 2abf4: 64 f4 brge .+24 ; 0x2ac0e SWAP(points[j], points[j + 1]); 2abf6: ea 81 ldd r30, Y+2 ; 0x02 2abf8: fb 81 ldd r31, Y+3 ; 0x03 2abfa: 80 82 st Z, r8 2abfc: 91 82 std Z+1, r9 ; 0x01 2abfe: a2 82 std Z+2, r10 ; 0x02 2ac00: b3 82 std Z+3, r11 ; 0x03 2ac02: ec 81 ldd r30, Y+4 ; 0x04 2ac04: fd 81 ldd r31, Y+5 ; 0x05 2ac06: c0 82 st Z, r12 2ac08: d1 82 std Z+1, r13 ; 0x01 2ac0a: e2 82 std Z+2, r14 ; 0x02 2ac0c: f3 82 std Z+3, r15 ; 0x03 /// slow bubble sort but short void sort(float *points, const uint8_t num_points){ /// one direction bubble sort for (uint8_t i = 0; i < num_points; ++i){ for (uint8_t j = 0; j < num_points - i - 1; ++j){ 2ac0e: f9 81 ldd r31, Y+1 ; 0x01 2ac10: ff 5f subi r31, 0xFF ; 255 2ac12: f9 83 std Y+1, r31 ; 0x01 2ac14: c5 cf rjmp .-118 ; 0x2aba0 2ac16: 01 50 subi r16, 0x01 ; 1 2ac18: 11 09 sbc r17, r1 2ac1a: 08 f6 brcc .-126 ; 0x2ab9e /// sort array and returns median value /// don't send empty array or nullptr float median(float *points, const uint8_t num_points){ sort(points, num_points); return points[num_points / 2]; 2ac1c: f1 01 movw r30, r2 2ac1e: e0 5c subi r30, 0xC0 ; 192 2ac20: ff 4f sbci r31, 0xFF ; 255 } float __attribute__ ((noinline)) CLAMP_median(float *shifts, uint8_t blocks, float norm){ const constexpr float max_change = 0.5f; ///< avoids too fast changes (avoid oscillation) return CLAMP( median(shifts, blocks) * norm, -max_change, max_change); 2ac22: 20 81 ld r18, Z 2ac24: 31 81 ldd r19, Z+1 ; 0x01 2ac26: 42 81 ldd r20, Z+2 ; 0x02 2ac28: 53 81 ldd r21, Z+3 ; 0x03 2ac2a: c3 01 movw r24, r6 2ac2c: b2 01 movw r22, r4 2ac2e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2ac32: 6b 01 movw r12, r22 2ac34: 7c 01 movw r14, r24 2ac36: 20 e0 ldi r18, 0x00 ; 0 2ac38: 30 e0 ldi r19, 0x00 ; 0 2ac3a: 40 e0 ldi r20, 0x00 ; 0 2ac3c: 5f eb ldi r21, 0xBF ; 191 2ac3e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2ac42: 87 fd sbrc r24, 7 2ac44: 10 c0 rjmp .+32 ; 0x2ac66 2ac46: 20 e0 ldi r18, 0x00 ; 0 2ac48: 30 e0 ldi r19, 0x00 ; 0 2ac4a: 40 e0 ldi r20, 0x00 ; 0 2ac4c: 5f e3 ldi r21, 0x3F ; 63 2ac4e: c7 01 movw r24, r14 2ac50: b6 01 movw r22, r12 2ac52: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2ac56: 18 16 cp r1, r24 2ac58: 5c f4 brge .+22 ; 0x2ac70 2ac5a: c1 2c mov r12, r1 2ac5c: d1 2c mov r13, r1 2ac5e: e1 2c mov r14, r1 2ac60: 8f e3 ldi r24, 0x3F ; 63 2ac62: f8 2e mov r15, r24 2ac64: 05 c0 rjmp .+10 ; 0x2ac70 2ac66: c1 2c mov r12, r1 2ac68: d1 2c mov r13, r1 2ac6a: e1 2c mov r14, r1 2ac6c: 9f eb ldi r25, 0xBF ; 191 2ac6e: f9 2e mov r15, r25 } 2ac70: c7 01 movw r24, r14 2ac72: b6 01 movw r22, r12 2ac74: 0f 90 pop r0 2ac76: 0f 90 pop r0 2ac78: 0f 90 pop r0 2ac7a: 0f 90 pop r0 2ac7c: 0f 90 pop r0 2ac7e: df 91 pop r29 2ac80: cf 91 pop r28 2ac82: 1f 91 pop r17 2ac84: 0f 91 pop r16 2ac86: ff 90 pop r15 2ac88: ef 90 pop r14 2ac8a: df 90 pop r13 2ac8c: cf 90 pop r12 2ac8e: bf 90 pop r11 2ac90: af 90 pop r10 2ac92: 9f 90 pop r9 2ac94: 8f 90 pop r8 2ac96: 7f 90 pop r7 2ac98: 6f 90 pop r6 2ac9a: 5f 90 pop r5 2ac9c: 4f 90 pop r4 2ac9e: 3f 90 pop r3 2aca0: 2f 90 pop r2 2aca2: 08 95 ret 0002aca4 : bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); } void ProtocolLogic::RecordUARTActivity() { lastUARTActivityMs = _millis(); 2aca4: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2aca8: 60 93 a1 12 sts 0x12A1, r22 ; 0x8012a1 2acac: 70 93 a2 12 sts 0x12A2, r23 ; 0x8012a2 2acb0: 80 93 a3 12 sts 0x12A3, r24 ; 0x8012a3 2acb4: 90 93 a4 12 sts 0x12A4, r25 ; 0x8012a4 } 2acb8: 08 95 ret 0002acba : } return (uint8_t)ReqMsg().code; } void ProtocolLogic::DecrementRetryAttempts() { if (inAutoRetry && retryAttempts) { 2acba: 80 91 e7 12 lds r24, 0x12E7 ; 0x8012e7 2acbe: 88 23 and r24, r24 2acc0: 69 f0 breq .+26 ; 0x2acdc 2acc2: 80 91 e6 12 lds r24, 0x12E6 ; 0x8012e6 2acc6: 88 23 and r24, r24 2acc8: 49 f0 breq .+18 ; 0x2acdc SERIAL_ECHOLNPGM("DecrementRetryAttempts"); 2acca: 85 e4 ldi r24, 0x45 ; 69 2accc: 91 ea ldi r25, 0xA1 ; 161 2acce: 0e 94 bd 7c call 0xf97a ; 0xf97a retryAttempts--; 2acd2: 80 91 e6 12 lds r24, 0x12E6 ; 0x8012e6 2acd6: 81 50 subi r24, 0x01 ; 1 2acd8: 80 93 e6 12 sts 0x12E6, r24 ; 0x8012e6 } } 2acdc: 08 95 ret 0002acde : MMU2_ECHO_MSGLN(tmp); } strncpy(lastMsg, tmp, rqs); } void ProtocolLogic::LogError(const char *reason_P) { 2acde: 9f 92 push r9 2ace0: af 92 push r10 2ace2: bf 92 push r11 2ace4: cf 92 push r12 2ace6: df 92 push r13 2ace8: ef 92 push r14 2acea: ff 92 push r15 2acec: 0f 93 push r16 2acee: 1f 93 push r17 2acf0: cf 93 push r28 2acf2: df 93 push r29 2acf4: cd b7 in r28, 0x3d ; 61 2acf6: de b7 in r29, 0x3e ; 62 2acf8: e0 97 sbiw r28, 0x30 ; 48 2acfa: 0f b6 in r0, 0x3f ; 63 2acfc: f8 94 cli 2acfe: de bf out 0x3e, r29 ; 62 2ad00: 0f be out 0x3f, r0 ; 63 2ad02: cd bf out 0x3d, r28 ; 61 2ad04: 8c 01 movw r16, r24 } } void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()]; 2ad06: e0 90 cf 12 lds r14, 0x12CF ; 0x8012cf 2ad0a: fe 01 movw r30, r28 2ad0c: 31 96 adiw r30, 0x01 ; 1 2ad0e: 21 e0 ldi r18, 0x01 ; 1 2ad10: 30 e0 ldi r19, 0x00 ; 0 2ad12: 5f 01 movw r10, r30 2ad14: f1 2c mov r15, r1 2ad16: 40 e1 ldi r20, 0x10 ; 16 2ad18: c4 2e mov r12, r20 2ad1a: d1 2c mov r13, r1 dst[i * 3] = NibbleToChar(b >> 4); dst[i * 3 + 1] = NibbleToChar(b & 0xf); dst[i * 3 + 2] = ' '; 2ad1c: 50 e2 ldi r21, 0x20 ; 32 2ad1e: 95 2e mov r9, r21 } } void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()]; 2ad20: c7 01 movw r24, r14 2ad22: 82 1b sub r24, r18 2ad24: 93 0b sbc r25, r19 2ad26: b6 01 movw r22, r12 2ad28: 0f 94 bd a4 call 0x3497a ; 0x3497a <__divmodhi4> 2ad2c: dc 01 movw r26, r24 2ad2e: bb 27 eor r27, r27 2ad30: ae 56 subi r26, 0x6E ; 110 2ad32: bd 4e sbci r27, 0xED ; 237 2ad34: 9d 96 adiw r26, 0x2d ; 45 2ad36: 8c 91 ld r24, X dst[i * 3] = NibbleToChar(b >> 4); 2ad38: 48 2f mov r20, r24 2ad3a: 50 e0 ldi r21, 0x00 ; 0 2ad3c: 94 e0 ldi r25, 0x04 ; 4 2ad3e: 55 95 asr r21 2ad40: 47 95 ror r20 2ad42: 9a 95 dec r25 2ad44: e1 f7 brne .-8 ; 0x2ad3e lastReceivedBytes[lrb] = c; lrb = (lrb + 1) % lastReceivedBytes.size(); } constexpr char NibbleToChar(uint8_t c) { switch (c) { 2ad46: 96 ef ldi r25, 0xF6 ; 246 2ad48: 94 0f add r25, r20 2ad4a: 96 30 cpi r25, 0x06 ; 6 2ad4c: a8 f1 brcs .+106 ; 0x2adb8 case 5: case 6: case 7: case 8: case 9: return c + '0'; 2ad4e: 40 5d subi r20, 0xD0 ; 208 } void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()]; dst[i * 3] = NibbleToChar(b >> 4); 2ad50: 40 83 st Z, r20 dst[i * 3 + 1] = NibbleToChar(b & 0xf); 2ad52: 8f 70 andi r24, 0x0F ; 15 lastReceivedBytes[lrb] = c; lrb = (lrb + 1) % lastReceivedBytes.size(); } constexpr char NibbleToChar(uint8_t c) { switch (c) { 2ad54: 96 ef ldi r25, 0xF6 ; 246 2ad56: 98 0f add r25, r24 2ad58: 96 30 cpi r25, 0x06 ; 6 2ad5a: 80 f1 brcs .+96 ; 0x2adbc case 5: case 6: case 7: case 8: case 9: return c + '0'; 2ad5c: 80 5d subi r24, 0xD0 ; 208 void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()]; dst[i * 3] = NibbleToChar(b >> 4); dst[i * 3 + 1] = NibbleToChar(b & 0xf); 2ad5e: 81 83 std Z+1, r24 ; 0x01 dst[i * 3 + 2] = ' '; 2ad60: 92 82 std Z+2, r9 ; 0x02 2ad62: 2f 5f subi r18, 0xFF ; 255 2ad64: 3f 4f sbci r19, 0xFF ; 255 2ad66: 33 96 adiw r30, 0x03 ; 3 return 0; } } void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { 2ad68: 21 31 cpi r18, 0x11 ; 17 2ad6a: 31 05 cpc r19, r1 2ad6c: c9 f6 brne .-78 ; 0x2ad20 uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()]; dst[i * 3] = NibbleToChar(b >> 4); dst[i * 3 + 1] = NibbleToChar(b & 0xf); dst[i * 3 + 2] = ' '; } dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly 2ad6e: 18 aa std Y+48, r1 ; 0x30 void ProtocolLogic::LogError(const char *reason_P) { char lrb[lastReceivedBytes.size() * 3]; FormatLastReceivedBytes(lrb); MMU2_ERROR_MSGRPGM(reason_P); 2ad70: 8e ec ldi r24, 0xCE ; 206 2ad72: 91 ea ldi r25, 0xA1 ; 161 2ad74: 0e 94 c4 7a call 0xf588 ; 0xf588 2ad78: 88 ec ldi r24, 0xC8 ; 200 2ad7a: 91 ea ldi r25, 0xA1 ; 161 2ad7c: 0e 94 c4 7a call 0xf588 ; 0xf588 2ad80: c8 01 movw r24, r16 2ad82: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOPGM(", last bytes: "); 2ad86: 80 e7 ldi r24, 0x70 ; 112 2ad88: 91 ea ldi r25, 0xA1 ; 161 2ad8a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(lrb); 2ad8e: c5 01 movw r24, r10 2ad90: 0e 94 a1 87 call 0x10f42 ; 0x10f42 } 2ad94: e0 96 adiw r28, 0x30 ; 48 2ad96: 0f b6 in r0, 0x3f ; 63 2ad98: f8 94 cli 2ad9a: de bf out 0x3e, r29 ; 62 2ad9c: 0f be out 0x3f, r0 ; 63 2ad9e: cd bf out 0x3d, r28 ; 61 2ada0: df 91 pop r29 2ada2: cf 91 pop r28 2ada4: 1f 91 pop r17 2ada6: 0f 91 pop r16 2ada8: ff 90 pop r15 2adaa: ef 90 pop r14 2adac: df 90 pop r13 2adae: cf 90 pop r12 2adb0: bf 90 pop r11 2adb2: af 90 pop r10 2adb4: 9f 90 pop r9 2adb6: 08 95 ret case 11: case 12: case 13: case 14: case 15: return (c - 10) + 'a'; 2adb8: 49 5a subi r20, 0xA9 ; 169 2adba: ca cf rjmp .-108 ; 0x2ad50 2adbc: 89 5a subi r24, 0xA9 ; 169 2adbe: cf cf rjmp .-98 ; 0x2ad5e 0002adc0 : char lrb[lastReceivedBytes.size()]; FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); } StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) { 2adc0: 9c 01 movw r18, r24 SERIAL_ECHOLNPGM("RSTCommTimeout"); dataTO.Reset(); } bool DropOutFilter::Record(StepStatus ss) { if (occurrences == maxOccurrences) { 2adc2: 90 91 a6 12 lds r25, 0x12A6 ; 0x8012a6 2adc6: 9a 30 cpi r25, 0x0A ; 10 2adc8: 11 f4 brne .+4 ; 0x2adce cause = ss; 2adca: 60 93 a5 12 sts 0x12A5, r22 ; 0x8012a5 } --occurrences; 2adce: 91 50 subi r25, 0x01 ; 1 2add0: 90 93 a6 12 sts 0x12A6, r25 ; 0x8012a6 FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); } StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) { if (dataTO.Record(ss)) { 2add4: 91 11 cpse r25, r1 2add6: 0d c0 rjmp .+26 ; 0x2adf2 2add8: c9 01 movw r24, r18 LogError(msg_P); 2adda: 0f 94 6f 56 call 0x2acde ; 0x2acde SERIAL_ECHOLNPGM("ResetRetryAttempts"); retryAttempts = MAX_RETRIES; } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 2adde: 81 e6 ldi r24, 0x61 ; 97 2ade0: 91 ea ldi r25, 0xA1 ; 161 2ade2: 0e 94 bd 7c call 0xf97a ; 0xf97a /// @returns the initial cause which started this drop out event inline StepStatus InitialCause() const { return cause; } /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2) inline void Reset() { occurrences = maxOccurrences; } 2ade6: 8a e0 ldi r24, 0x0A ; 10 2ade8: 80 93 a6 12 sts 0x12A6, r24 ; 0x8012a6 2adec: 80 91 a5 12 lds r24, 0x12A5 ; 0x8012a5 2adf0: 08 95 ret if (dataTO.Record(ss)) { LogError(msg_P); ResetCommunicationTimeoutAttempts(); // prepare for another run of consecutive retries before firing an error return dataTO.InitialCause(); } else { return Processing; // suppress short drop outs of communication 2adf2: 80 e0 ldi r24, 0x00 ; 0 } } 2adf4: 08 95 ret 0002adf6 : } *dst = 0; // terminate properly lrb = 0; // reset the input buffer index in case of a clean message } void ProtocolLogic::LogRequestMsg(const uint8_t *txbuff, uint8_t size) { 2adf6: cf 93 push r28 2adf8: df 93 push r29 2adfa: cd b7 in r28, 0x3d ; 61 2adfc: de b7 in r29, 0x3e ; 62 2adfe: 2e 97 sbiw r28, 0x0e ; 14 2ae00: 0f b6 in r0, 0x3f ; 63 2ae02: f8 94 cli 2ae04: de bf out 0x3e, r29 ; 62 2ae06: 0f be out 0x3f, r0 ; 63 2ae08: cd bf out 0x3d, r28 ; 61 constexpr uint_fast8_t rqs = modules::protocol::Protocol::MaxRequestSize() + 1; char tmp[rqs] = ">"; 2ae0a: 2e e3 ldi r18, 0x3E ; 62 2ae0c: 30 e0 ldi r19, 0x00 ; 0 2ae0e: 3a 83 std Y+2, r19 ; 0x02 2ae10: 29 83 std Y+1, r18 ; 0x01 2ae12: fe 01 movw r30, r28 2ae14: 33 96 adiw r30, 0x03 ; 3 2ae16: 2c e0 ldi r18, 0x0C ; 12 2ae18: df 01 movw r26, r30 2ae1a: 1d 92 st X+, r1 2ae1c: 2a 95 dec r18 2ae1e: e9 f7 brne .-6 ; 0x2ae1a 2ae20: de 01 movw r26, r28 2ae22: 12 96 adiw r26, 0x02 ; 2 2ae24: 48 2f mov r20, r24 2ae26: fc 01 movw r30, r24 2ae28: 9d 01 movw r18, r26 static char lastMsg[rqs] = ""; for (uint8_t i = 0; i < size; ++i) { 2ae2a: 8e 2f mov r24, r30 2ae2c: 84 1b sub r24, r20 2ae2e: 86 17 cp r24, r22 2ae30: 40 f4 brcc .+16 ; 0x2ae42 uint8_t b = txbuff[i]; 2ae32: 81 91 ld r24, Z+ // Check for printable character, including space if (b < 32 || b > 127) { 2ae34: 90 ee ldi r25, 0xE0 ; 224 2ae36: 98 0f add r25, r24 2ae38: 90 36 cpi r25, 0x60 ; 96 2ae3a: 08 f0 brcs .+2 ; 0x2ae3e b = '.'; 2ae3c: 8e e2 ldi r24, 0x2E ; 46 } tmp[i + 1] = b; 2ae3e: 8d 93 st X+, r24 2ae40: f4 cf rjmp .-24 ; 0x2ae2a } tmp[size + 1] = 0; 2ae42: f9 01 movw r30, r18 2ae44: e6 0f add r30, r22 2ae46: f1 1d adc r31, r1 2ae48: 10 82 st Z, r1 if (!strncmp_P(tmp, PSTR(">S0*c6."), rqs) && !strncmp(lastMsg, tmp, rqs)) { 2ae4a: 4e e0 ldi r20, 0x0E ; 14 2ae4c: 50 e0 ldi r21, 0x00 ; 0 2ae4e: 64 ed ldi r22, 0xD4 ; 212 2ae50: 71 ea ldi r23, 0xA1 ; 161 2ae52: ce 01 movw r24, r28 2ae54: 01 96 adiw r24, 0x01 ; 1 2ae56: 0f 94 bf a1 call 0x3437e ; 0x3437e 2ae5a: 89 2b or r24, r25 2ae5c: 59 f4 brne .+22 ; 0x2ae74 2ae5e: 4e e0 ldi r20, 0x0E ; 14 2ae60: 50 e0 ldi r21, 0x00 ; 0 2ae62: be 01 movw r22, r28 2ae64: 6f 5f subi r22, 0xFF ; 255 2ae66: 7f 4f sbci r23, 0xFF ; 255 2ae68: 82 e8 ldi r24, 0x82 ; 130 2ae6a: 92 e1 ldi r25, 0x12 ; 18 2ae6c: 0f 94 52 aa call 0x354a4 ; 0x354a4 2ae70: 89 2b or r24, r25 2ae72: 61 f0 breq .+24 ; 0x2ae8c // especially when the MMU is not connected. // We'll lose the ability to see if the printer is actually // trying to find the MMU, but since it has been reliable in the past // we can live without it for now. } else { MMU2_ECHO_MSGLN(tmp); 2ae74: 8e ec ldi r24, 0xCE ; 206 2ae76: 91 ea ldi r25, 0xA1 ; 161 2ae78: 0e 94 c4 7a call 0xf588 ; 0xf588 2ae7c: 88 ec ldi r24, 0xC8 ; 200 2ae7e: 91 ea ldi r25, 0xA1 ; 161 2ae80: 0e 94 c4 7a call 0xf588 ; 0xf588 2ae84: ce 01 movw r24, r28 2ae86: 01 96 adiw r24, 0x01 ; 1 2ae88: 0e 94 a1 87 call 0x10f42 ; 0x10f42 } strncpy(lastMsg, tmp, rqs); 2ae8c: 4e e0 ldi r20, 0x0E ; 14 2ae8e: 50 e0 ldi r21, 0x00 ; 0 2ae90: be 01 movw r22, r28 2ae92: 6f 5f subi r22, 0xFF ; 255 2ae94: 7f 4f sbci r23, 0xFF ; 255 2ae96: 82 e8 ldi r24, 0x82 ; 130 2ae98: 92 e1 ldi r25, 0x12 ; 18 2ae9a: 0f 94 60 aa call 0x354c0 ; 0x354c0 } 2ae9e: 2e 96 adiw r28, 0x0e ; 14 2aea0: 0f b6 in r0, 0x3f ; 63 2aea2: f8 94 cli 2aea4: de bf out 0x3e, r29 ; 62 2aea6: 0f be out 0x3f, r0 ; 63 2aea8: cd bf out 0x3d, r28 ; 61 2aeaa: df 91 pop r29 2aeac: cf 91 pop r28 2aeae: 08 95 ret 0002aeb0 : return CommunicationTimeout; } return Processing; } void ProtocolLogic::SendMsg(RequestMsg rq) { 2aeb0: cf 92 push r12 2aeb2: df 92 push r13 2aeb4: ef 92 push r14 2aeb6: ff 92 push r15 2aeb8: 1f 93 push r17 2aeba: cf 93 push r28 2aebc: df 93 push r29 2aebe: cd b7 in r28, 0x3d ; 61 2aec0: de b7 in r29, 0x3e ; 62 2aec2: 62 97 sbiw r28, 0x12 ; 18 2aec4: 0f b6 in r0, 0x3f ; 63 2aec6: f8 94 cli 2aec8: de bf out 0x3e, r29 ; 62 2aeca: 0f be out 0x3f, r0 ; 63 2aecc: cd bf out 0x3d, r28 ; 61 2aece: 4e 87 std Y+14, r20 ; 0x0e 2aed0: 5f 87 std Y+15, r21 ; 0x0f 2aed2: 68 8b std Y+16, r22 ; 0x10 2aed4: 79 8b std Y+17, r23 ; 0x11 2aed6: 8a 8b std Y+18, r24 ; 0x12 } } } uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) { txbuff[0] = (uint8_t)msg.code; 2aed8: 49 83 std Y+1, r20 ; 0x01 uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1); 2aeda: 85 2f mov r24, r21 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2aedc: 51 11 cpse r21, r1 2aede: 31 c0 rjmp .+98 ; 0x2af42 *dst = '0'; 2aee0: 80 e3 ldi r24, 0x30 ; 48 2aee2: 8a 83 std Y+2, r24 ; 0x02 return 1; 2aee4: 11 e0 ldi r17, 0x01 ; 1 uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) { txbuff[0] = (uint8_t)msg.code; uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1); i += AppendCRC(msg.CRC(), txbuff + i); 2aee6: e1 e0 ldi r30, 0x01 ; 1 2aee8: e1 0f add r30, r17 2aeea: 81 e0 ldi r24, 0x01 ; 1 2aeec: 90 e0 ldi r25, 0x00 ; 0 2aeee: 8c 0f add r24, r28 2aef0: 9d 1f adc r25, r29 2aef2: 8e 0f add r24, r30 2aef4: 91 1d adc r25, r1 2aef6: fc 01 movw r30, r24 2aef8: 8a 89 ldd r24, Y+18 ; 0x12 dst[i] = ' '; return i + 1; } uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) { dst[0] = '*'; // reprap-style separator of CRC 2aefa: 9a e2 ldi r25, 0x2A ; 42 2aefc: 90 83 st Z, r25 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2aefe: 81 11 cpse r24, r1 2af00: 27 c0 rjmp .+78 ; 0x2af50 *dst = '0'; 2af02: 80 e3 ldi r24, 0x30 ; 48 2af04: 81 83 std Z+1, r24 ; 0x01 return 1; 2af06: 81 e0 ldi r24, 0x01 ; 1 uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) { txbuff[0] = (uint8_t)msg.code; uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1); i += AppendCRC(msg.CRC(), txbuff + i); 2af08: 1e 5f subi r17, 0xFE ; 254 2af0a: 18 0f add r17, r24 txbuff[i] = '\n'; 2af0c: e1 e0 ldi r30, 0x01 ; 1 2af0e: f0 e0 ldi r31, 0x00 ; 0 2af10: ec 0f add r30, r28 2af12: fd 1f adc r31, r29 2af14: e1 0f add r30, r17 2af16: f1 1d adc r31, r1 2af18: 8a e0 ldi r24, 0x0A ; 10 2af1a: 80 83 st Z, r24 ++i; 2af1c: 1f 5f subi r17, 0xFF ; 255 // Buddy FW cannot use stack-allocated txbuff - DMA doesn't work with CCMRAM // No restrictions on MK3/S/+ though uint8_t txbuff[Protocol::MaxRequestSize()]; #endif uint8_t len = Protocol::EncodeRequest(rq, txbuff); uart->write(txbuff, len); 2af1e: fe 01 movw r30, r28 2af20: 31 96 adiw r30, 0x01 ; 1 2af22: 7f 01 movw r14, r30 void MMU2Serial::flush() { // @@TODO - clear the output buffer } void MMU2Serial::write(const uint8_t *buffer, size_t size) { while(size--){ 2af24: 6f 01 movw r12, r30 2af26: c1 0e add r12, r17 2af28: d1 1c adc r13, r1 2af2a: ec 14 cp r14, r12 2af2c: fd 04 cpc r15, r13 2af2e: b1 f0 breq .+44 ; 0x2af5c fputc(*buffer, uart2io); 2af30: f7 01 movw r30, r14 2af32: 81 91 ld r24, Z+ 2af34: 7f 01 movw r14, r30 2af36: 64 e7 ldi r22, 0x74 ; 116 2af38: 72 e1 ldi r23, 0x12 ; 18 2af3a: 90 e0 ldi r25, 0x00 ; 0 2af3c: 0f 94 48 a2 call 0x34490 ; 0x34490 2af40: f4 cf rjmp .-24 ; 0x2af2a 2af42: be 01 movw r22, r28 2af44: 6e 5f subi r22, 0xFE ; 254 2af46: 7f 4f sbci r23, 0xFF ; 255 2af48: 0f 94 77 50 call 0x2a0ee ; 0x2a0ee 2af4c: 18 2f mov r17, r24 2af4e: cb cf rjmp .-106 ; 0x2aee6 return i + 1; } uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) { dst[0] = '*'; // reprap-style separator of CRC return 1 + UInt8ToHex(crc, dst + 1); 2af50: bf 01 movw r22, r30 2af52: 6f 5f subi r22, 0xFF ; 255 2af54: 7f 4f sbci r23, 0xFF ; 255 2af56: 0f 94 77 50 call 0x2a0ee ; 0x2a0ee 2af5a: d6 cf rjmp .-84 ; 0x2af08 LogRequestMsg(txbuff, len); 2af5c: 61 2f mov r22, r17 2af5e: ce 01 movw r24, r28 2af60: 01 96 adiw r24, 0x01 ; 1 2af62: 0f 94 fb 56 call 0x2adf6 ; 0x2adf6 RecordUARTActivity(); 2af66: 0f 94 52 56 call 0x2aca4 ; 0x2aca4 } 2af6a: 62 96 adiw r28, 0x12 ; 18 2af6c: 0f b6 in r0, 0x3f ; 63 2af6e: f8 94 cli 2af70: de bf out 0x3e, r29 ; 62 2af72: 0f be out 0x3f, r0 ; 63 2af74: cd bf out 0x3d, r28 ; 61 2af76: df 91 pop r29 2af78: cf 91 pop r28 2af7a: 1f 91 pop r17 2af7c: ff 90 pop r15 2af7e: ef 90 pop r14 2af80: df 90 pop r13 2af82: cf 90 pop r12 2af84: 08 95 ret 0002af86 : void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) { SendMsg(RequestMsg(RequestMsgCodes::Read, index)); scopeState = nextState; } void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState) { 2af86: 8f 92 push r8 2af88: 9f 92 push r9 2af8a: af 92 push r10 2af8c: bf 92 push r11 2af8e: df 92 push r13 2af90: ef 92 push r14 2af92: ff 92 push r15 2af94: 0f 93 push r16 2af96: 1f 93 push r17 2af98: cf 93 push r28 2af9a: df 93 push r29 2af9c: cd b7 in r28, 0x3d ; 61 2af9e: de b7 in r29, 0x3e ; 62 2afa0: 67 97 sbiw r28, 0x17 ; 23 2afa2: 0f b6 in r0, 0x3f ; 63 2afa4: f8 94 cli 2afa6: de bf out 0x3e, r29 ; 62 2afa8: 0f be out 0x3f, r0 ; 63 2afaa: cd bf out 0x3d, r28 ; 61 2afac: 18 2f mov r17, r24 2afae: 7b 01 movw r14, r22 2afb0: d4 2e mov r13, r20 /// @param value to write into the register inline constexpr RequestMsg(RequestMsgCodes code, uint8_t address, uint16_t value) : code(code) , value(address) , value2(value) , crc8(ComputeCRC8()) { 2afb2: 07 e5 ldi r16, 0x57 ; 87 2afb4: 0b 8b std Y+19, r16 ; 0x13 2afb6: 8c 8b std Y+20, r24 ; 0x14 2afb8: 7e 8b std Y+22, r23 ; 0x16 2afba: 6d 8b std Y+21, r22 ; 0x15 2afbc: ce 01 movw r24, r28 2afbe: 43 96 adiw r24, 0x13 ; 19 2afc0: 0f 94 a3 50 call 0x2a146 ; 0x2a146 2afc4: 8f 8b std Y+23, r24 ; 0x17 2afc6: 0e 87 std Y+14, r16 ; 0x0e 2afc8: 1f 87 std Y+15, r17 ; 0x0f 2afca: f9 8a std Y+17, r15 ; 0x11 2afcc: e8 8a std Y+16, r14 ; 0x10 2afce: ce 01 movw r24, r28 2afd0: 0e 96 adiw r24, 0x0e ; 14 2afd2: 0f 94 a3 50 call 0x2a146 ; 0x2a146 2afd6: 8a 8b std Y+18, r24 ; 0x12 } return charsOut; } uint8_t Protocol::BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst) { dst[0] = (uint8_t)msg.code; 2afd8: 09 83 std Y+1, r16 ; 0x01 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2afda: 11 11 cpse r17, r1 2afdc: 27 c0 rjmp .+78 ; 0x2b02c *dst = '0'; 2afde: 80 e3 ldi r24, 0x30 ; 48 2afe0: 8a 83 std Y+2, r24 ; 0x02 return 1; 2afe2: 81 e0 ldi r24, 0x01 ; 1 } uint8_t Protocol::BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst) { dst[0] = (uint8_t)msg.code; uint8_t i = 1 + UInt8ToHex(msg.value, dst + 1); 2afe4: e1 e0 ldi r30, 0x01 ; 1 2afe6: e8 0f add r30, r24 dst[i] = ' '; 2afe8: 21 e0 ldi r18, 0x01 ; 1 2afea: 30 e0 ldi r19, 0x00 ; 0 2afec: 2c 0f add r18, r28 2afee: 3d 1f adc r19, r29 2aff0: 2e 0f add r18, r30 2aff2: 31 1d adc r19, r1 2aff4: f9 01 movw r30, r18 2aff6: 90 e2 ldi r25, 0x20 ; 32 2aff8: 90 83 st Z, r25 return i + 1; 2affa: 02 e0 ldi r16, 0x02 ; 2 2affc: 08 0f add r16, r24 uint8_t Protocol::EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff) { const RequestMsg msg(RequestMsgCodes::Write, address, value); uint8_t i = BeginEncodeRequest(msg, txbuff); // dump the value i += UInt16ToHex(value, txbuff + i); 2affe: aa 24 eor r10, r10 2b000: a3 94 inc r10 2b002: b1 2c mov r11, r1 2b004: ac 0e add r10, r28 2b006: bd 1e adc r11, r29 2b008: a0 0e add r10, r16 2b00a: b1 1c adc r11, r1 return charsOut; } uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) { constexpr uint16_t topNibbleMask = 0xf000; if (value == 0) { 2b00c: e1 14 cp r14, r1 2b00e: f1 04 cpc r15, r1 2b010: 39 f1 breq .+78 ; 0x2b060 *dst = '0'; return 1; } // skip initial zeros uint8_t charsOut = 4; 2b012: 14 e0 ldi r17, 0x04 ; 4 while ((value & topNibbleMask) == 0) { 2b014: c7 01 movw r24, r14 2b016: 88 27 eor r24, r24 2b018: 90 7f andi r25, 0xF0 ; 240 2b01a: 89 2b or r24, r25 2b01c: 71 f4 brne .+28 ; 0x2b03a value <<= 4U; 2b01e: 24 e0 ldi r18, 0x04 ; 4 2b020: ee 0c add r14, r14 2b022: ff 1c adc r15, r15 2b024: 2a 95 dec r18 2b026: e1 f7 brne .-8 ; 0x2b020 --charsOut; 2b028: 11 50 subi r17, 0x01 ; 1 2b02a: f4 cf rjmp .-24 ; 0x2b014 2b02c: be 01 movw r22, r28 2b02e: 6e 5f subi r22, 0xFE ; 254 2b030: 7f 4f sbci r23, 0xFF ; 255 2b032: 81 2f mov r24, r17 2b034: 0f 94 77 50 call 0x2a0ee ; 0x2a0ee 2b038: d5 cf rjmp .-86 ; 0x2afe4 *dst = '0'; return 1; } // skip initial zeros uint8_t charsOut = 4; while ((value & topNibbleMask) == 0) { 2b03a: 45 01 movw r8, r10 value <<= 4U; --charsOut; } for (uint8_t i = 0; i < charsOut; ++i) { 2b03c: 88 2d mov r24, r8 2b03e: 8a 19 sub r24, r10 2b040: 81 17 cp r24, r17 2b042: 90 f4 brcc .+36 ; 0x2b068 uint8_t n = (value & topNibbleMask) >> (8U + 4U); value <<= 4U; *dst = Nibble2Char(n); 2b044: 8f 2d mov r24, r15 2b046: 82 95 swap r24 2b048: 8f 70 andi r24, 0x0F ; 15 2b04a: 94 e0 ldi r25, 0x04 ; 4 2b04c: ee 0c add r14, r14 2b04e: ff 1c adc r15, r15 2b050: 9a 95 dec r25 2b052: e1 f7 brne .-8 ; 0x2b04c 2b054: 0f 94 6d 50 call 0x2a0da ; 0x2a0da 2b058: f4 01 movw r30, r8 2b05a: 81 93 st Z+, r24 2b05c: 4f 01 movw r8, r30 2b05e: ee cf rjmp .-36 ; 0x2b03c } uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) { constexpr uint16_t topNibbleMask = 0xf000; if (value == 0) { *dst = '0'; 2b060: 80 e3 ldi r24, 0x30 ; 48 2b062: f5 01 movw r30, r10 2b064: 80 83 st Z, r24 return 1; 2b066: 11 e0 ldi r17, 0x01 ; 1 uint8_t Protocol::EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff) { const RequestMsg msg(RequestMsgCodes::Write, address, value); uint8_t i = BeginEncodeRequest(msg, txbuff); // dump the value i += UInt16ToHex(value, txbuff + i); 2b068: 10 0f add r17, r16 i += AppendCRC(msg.CRC(), txbuff + i); 2b06a: e1 e0 ldi r30, 0x01 ; 1 2b06c: f0 e0 ldi r31, 0x00 ; 0 2b06e: ec 0f add r30, r28 2b070: fd 1f adc r31, r29 2b072: e1 0f add r30, r17 2b074: f1 1d adc r31, r1 2b076: 8a 89 ldd r24, Y+18 ; 0x12 dst[i] = ' '; return i + 1; } uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) { dst[0] = '*'; // reprap-style separator of CRC 2b078: 9a e2 ldi r25, 0x2A ; 42 2b07a: 90 83 st Z, r25 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2b07c: 81 11 cpse r24, r1 2b07e: 21 c0 rjmp .+66 ; 0x2b0c2 *dst = '0'; 2b080: 80 e3 ldi r24, 0x30 ; 48 2b082: 81 83 std Z+1, r24 ; 0x01 return 1; 2b084: 81 e0 ldi r24, 0x01 ; 1 2b086: 1f 5f subi r17, 0xFF ; 255 const RequestMsg msg(RequestMsgCodes::Write, address, value); uint8_t i = BeginEncodeRequest(msg, txbuff); // dump the value i += UInt16ToHex(value, txbuff + i); i += AppendCRC(msg.CRC(), txbuff + i); 2b088: 18 0f add r17, r24 txbuff[i] = '\n'; 2b08a: e1 e0 ldi r30, 0x01 ; 1 2b08c: f0 e0 ldi r31, 0x00 ; 0 2b08e: ec 0f add r30, r28 2b090: fd 1f adc r31, r29 2b092: e1 0f add r30, r17 2b094: f1 1d adc r31, r1 2b096: 8a e0 ldi r24, 0x0A ; 10 2b098: 80 83 st Z, r24 ++i; 2b09a: 1f 5f subi r17, 0xFF ; 255 // Buddy FW cannot use stack-allocated txbuff - DMA doesn't work with CCMRAM // No restrictions on MK3/S/+ though uint8_t txbuff[Protocol::MaxRequestSize()]; #endif uint8_t len = Protocol::EncodeWriteRequest(rq.value, rq.value2, txbuff); uart->write(txbuff, len); 2b09c: 9e 01 movw r18, r28 2b09e: 2f 5f subi r18, 0xFF ; 255 2b0a0: 3f 4f sbci r19, 0xFF ; 255 2b0a2: 79 01 movw r14, r18 void MMU2Serial::flush() { // @@TODO - clear the output buffer } void MMU2Serial::write(const uint8_t *buffer, size_t size) { while(size--){ 2b0a4: 59 01 movw r10, r18 2b0a6: a1 0e add r10, r17 2b0a8: b1 1c adc r11, r1 2b0aa: ea 14 cp r14, r10 2b0ac: fb 04 cpc r15, r11 2b0ae: 79 f0 breq .+30 ; 0x2b0ce fputc(*buffer, uart2io); 2b0b0: f7 01 movw r30, r14 2b0b2: 81 91 ld r24, Z+ 2b0b4: 7f 01 movw r14, r30 2b0b6: 64 e7 ldi r22, 0x74 ; 116 2b0b8: 72 e1 ldi r23, 0x12 ; 18 2b0ba: 90 e0 ldi r25, 0x00 ; 0 2b0bc: 0f 94 48 a2 call 0x34490 ; 0x34490 2b0c0: f4 cf rjmp .-24 ; 0x2b0aa return i + 1; } uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) { dst[0] = '*'; // reprap-style separator of CRC return 1 + UInt8ToHex(crc, dst + 1); 2b0c2: bf 01 movw r22, r30 2b0c4: 6f 5f subi r22, 0xFF ; 255 2b0c6: 7f 4f sbci r23, 0xFF ; 255 2b0c8: 0f 94 77 50 call 0x2a0ee ; 0x2a0ee 2b0cc: dc cf rjmp .-72 ; 0x2b086 LogRequestMsg(txbuff, len); 2b0ce: 61 2f mov r22, r17 2b0d0: ce 01 movw r24, r28 2b0d2: 01 96 adiw r24, 0x01 ; 1 2b0d4: 0f 94 fb 56 call 0x2adf6 ; 0x2adf6 RecordUARTActivity(); 2b0d8: 0f 94 52 56 call 0x2aca4 ; 0x2aca4 scopeState = nextState; } void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState) { SendWriteMsg(RequestMsg(RequestMsgCodes::Write, index, value)); scopeState = nextState; 2b0dc: d0 92 95 12 sts 0x1295, r13 ; 0x801295 } 2b0e0: 67 96 adiw r28, 0x17 ; 23 2b0e2: 0f b6 in r0, 0x3f ; 63 2b0e4: f8 94 cli 2b0e6: de bf out 0x3e, r29 ; 62 2b0e8: 0f be out 0x3f, r0 ; 63 2b0ea: cd bf out 0x3d, r28 ; 61 2b0ec: df 91 pop r29 2b0ee: cf 91 pop r28 2b0f0: 1f 91 pop r17 2b0f2: 0f 91 pop r16 2b0f4: ff 90 pop r15 2b0f6: ef 90 pop r14 2b0f8: df 90 pop r13 2b0fa: bf 90 pop r11 2b0fc: af 90 pop r10 2b0fe: 9f 90 pop r9 2b100: 8f 90 pop r8 2b102: 08 95 ret 0002b104 : regIndex = 0; SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() { ++regIndex; 2b104: 20 91 e0 12 lds r18, 0x12E0 ; 0x8012e0 2b108: 2f 5f subi r18, 0xFF ; 255 2b10a: 20 93 e0 12 sts 0x12E0, r18 ; 0x8012e0 if (regIndex >= initRegs8Count) { 2b10e: 22 30 cpi r18, 0x02 ; 2 2b110: 78 f4 brcc .+30 ; 0x2b130 return true; } else { SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); 2b112: 30 e0 ldi r19, 0x00 ; 0 2b114: f9 01 movw r30, r18 2b116: e1 5a subi r30, 0xA1 ; 161 2b118: fe 45 sbci r31, 0x5E ; 94 2b11a: 84 91 lpm r24, Z 2b11c: 22 52 subi r18, 0x22 ; 34 2b11e: 3d 4e sbci r19, 0xED ; 237 2b120: f9 01 movw r30, r18 2b122: 60 81 ld r22, Z 2b124: 70 e0 ldi r23, 0x00 ; 0 2b126: 49 e0 ldi r20, 0x09 ; 9 2b128: 0f 94 c3 57 call 0x2af86 ; 0x2af86 } return false; 2b12c: 80 e0 ldi r24, 0x00 ; 0 2b12e: 08 95 ret } bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() { ++regIndex; if (regIndex >= initRegs8Count) { return true; 2b130: 81 e0 ldi r24, 0x01 ; 1 } else { SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } return false; } 2b132: 08 95 ret 0002b134 : } /// Searches for best match of pattern by shifting it /// Returns rate of match and the best location /// max match = 132, min match = 0 uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){ 2b134: 2f 92 push r2 2b136: 3f 92 push r3 2b138: 4f 92 push r4 2b13a: 5f 92 push r5 2b13c: 6f 92 push r6 2b13e: 7f 92 push r7 2b140: 8f 92 push r8 2b142: 9f 92 push r9 2b144: af 92 push r10 2b146: bf 92 push r11 2b148: cf 92 push r12 2b14a: df 92 push r13 2b14c: ef 92 push r14 2b14e: ff 92 push r15 2b150: 0f 93 push r16 2b152: 1f 93 push r17 2b154: cf 93 push r28 2b156: df 93 push r29 2b158: 00 d0 rcall .+0 ; 0x2b15a 2b15a: 1f 92 push r1 2b15c: 1f 92 push r1 2b15e: cd b7 in r28, 0x3d ; 61 2b160: de b7 in r29, 0x3e ; 62 2b162: 2b 01 movw r4, r22 2b164: 1a 01 movw r2, r20 2b166: f1 2c mov r15, r1 2b168: e1 2c mov r14, r1 if (!pixels || !pattern || !pc || !pr) return -1; uint8_t max_c = 0; uint8_t max_r = 0; uint8_t max_match = 0; 2b16a: 1c 82 std Y+4, r1 ; 0x04 /// max match = 132, min match = 0 uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){ if (!pixels || !pattern || !pc || !pr) return -1; uint8_t max_c = 0; uint8_t max_r = 0; 2b16c: 1d 82 std Y+5, r1 ; 0x05 /// Returns rate of match and the best location /// max match = 132, min match = 0 uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){ if (!pixels || !pattern || !pc || !pr) return -1; uint8_t max_c = 0; 2b16e: 10 e0 ldi r17, 0x00 ; 0 uint8_t max_r = 0; uint8_t max_match = 0; // DBG(_n("Matching:\n")); /// pixel precision for (uint8_t r = 0; r < (32 - 12); ++r){ 2b170: 50 e0 ldi r21, 0x00 ; 0 /// skip corners (3 pixels in each) if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue; if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue; const uint16_t idx = (c + j) + 32 * ((uint16_t)r + i); const bool high_pix = pixels[idx] > thr; const bool high_pat = pattern[i] & (1 << j); 2b172: 66 24 eor r6, r6 2b174: 63 94 inc r6 2b176: 71 2c mov r7, r1 uint8_t max_r = 0; uint8_t max_match = 0; // DBG(_n("Matching:\n")); /// pixel precision for (uint8_t r = 0; r < (32 - 12); ++r){ 2b178: 70 e0 ldi r23, 0x00 ; 0 2b17a: 60 e0 ldi r22, 0x00 ; 0 2b17c: 97 01 movw r18, r14 2b17e: 22 5a subi r18, 0xA2 ; 162 2b180: 39 4f sbci r19, 0xF9 ; 249 2b182: 3a 83 std Y+2, r19 ; 0x02 2b184: 29 83 std Y+1, r18 ; 0x01 2b186: 86 2e mov r8, r22 2b188: c9 80 ldd r12, Y+1 ; 0x01 2b18a: da 80 ldd r13, Y+2 ; 0x02 2b18c: c6 0e add r12, r22 2b18e: d7 1e adc r13, r23 2b190: fc 01 movw r30, r24 /// Returns rate of match /// max match = 132, min match = 0 uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){ uint8_t thr = 16; uint8_t match = 0; 2b192: 00 e0 ldi r16, 0x00 ; 0 for (uint8_t i = 0; i < 12; ++i){ 2b194: 40 e0 ldi r20, 0x00 ; 0 2b196: 30 e0 ldi r19, 0x00 ; 0 2b198: 20 e0 ldi r18, 0x00 ; 0 for (uint8_t j = 0; j < 12; ++j){ /// skip corners (3 pixels in each) if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue; if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue; 2b19a: ae ef ldi r26, 0xFE ; 254 2b19c: a4 0f add r26, r20 2b19e: ab 83 std Y+3, r26 ; 0x03 uint8_t thr = 16; uint8_t match = 0; for (uint8_t i = 0; i < 12; ++i){ for (uint8_t j = 0; j < 12; ++j){ /// skip corners (3 pixels in each) if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue; 2b1a0: 44 23 and r20, r20 2b1a2: 19 f0 breq .+6 ; 0x2b1aa 2b1a4: 4b 30 cpi r20, 0x0B ; 11 2b1a6: 09 f0 breq .+2 ; 0x2b1aa 2b1a8: 7d c0 rjmp .+250 ; 0x2b2a4 2b1aa: ae ef ldi r26, 0xFE ; 254 2b1ac: a2 0f add r26, r18 2b1ae: a8 30 cpi r26, 0x08 ; 8 2b1b0: 08 f4 brcc .+2 ; 0x2b1b4 2b1b2: 7a c0 rjmp .+244 ; 0x2b2a8 2b1b4: 2f 5f subi r18, 0xFF ; 255 2b1b6: 3f 4f sbci r19, 0xFF ; 255 /// max match = 132, min match = 0 uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){ uint8_t thr = 16; uint8_t match = 0; for (uint8_t i = 0; i < 12; ++i){ for (uint8_t j = 0; j < 12; ++j){ 2b1b8: 2c 30 cpi r18, 0x0C ; 12 2b1ba: 31 05 cpc r19, r1 2b1bc: 89 f7 brne .-30 ; 0x2b1a0 /// Returns rate of match /// max match = 132, min match = 0 uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){ uint8_t thr = 16; uint8_t match = 0; for (uint8_t i = 0; i < 12; ++i){ 2b1be: 4f 5f subi r20, 0xFF ; 255 2b1c0: 20 e2 ldi r18, 0x20 ; 32 2b1c2: c2 0e add r12, r18 2b1c4: d1 1c adc r13, r1 2b1c6: 32 96 adiw r30, 0x02 ; 2 2b1c8: 4c 30 cpi r20, 0x0C ; 12 2b1ca: 29 f7 brne .-54 ; 0x2b196 // DBG(_n("Matching:\n")); /// pixel precision for (uint8_t r = 0; r < (32 - 12); ++r){ for (uint8_t c = 0; c < (32 - 12); ++c){ const uint8_t match = xyzcal_match_pattern_12x12_in_32x32(pattern, pixels, c, r); if (max_match < match){ 2b1cc: 3c 81 ldd r19, Y+4 ; 0x04 2b1ce: 30 17 cp r19, r16 2b1d0: 18 f4 brcc .+6 ; 0x2b1d8 2b1d2: 0c 83 std Y+4, r16 ; 0x04 2b1d4: 5d 83 std Y+5, r21 ; 0x05 2b1d6: 18 2d mov r17, r8 2b1d8: 6f 5f subi r22, 0xFF ; 255 2b1da: 7f 4f sbci r23, 0xFF ; 255 uint8_t max_match = 0; // DBG(_n("Matching:\n")); /// pixel precision for (uint8_t r = 0; r < (32 - 12); ++r){ for (uint8_t c = 0; c < (32 - 12); ++c){ 2b1dc: 64 31 cpi r22, 0x14 ; 20 2b1de: 71 05 cpc r23, r1 2b1e0: 91 f6 brne .-92 ; 0x2b186 uint8_t max_r = 0; uint8_t max_match = 0; // DBG(_n("Matching:\n")); /// pixel precision for (uint8_t r = 0; r < (32 - 12); ++r){ 2b1e2: 5f 5f subi r21, 0xFF ; 255 2b1e4: a0 e2 ldi r26, 0x20 ; 32 2b1e6: ea 0e add r14, r26 2b1e8: f1 1c adc r15, r1 2b1ea: 54 31 cpi r21, 0x14 ; 20 2b1ec: 29 f6 brne .-118 ; 0x2b178 // DBG(_n("%d "), match); } // DBG(_n("\n")); } //@size=278 DBG(_n("Pattern center [%f %f], match %f%%\n"), max_c + 5.5f, max_r + 5.5f, max_match / 1.32f); 2b1ee: ec 81 ldd r30, Y+4 ; 0x04 2b1f0: 6e 2f mov r22, r30 2b1f2: 70 e0 ldi r23, 0x00 ; 0 2b1f4: 90 e0 ldi r25, 0x00 ; 0 2b1f6: 80 e0 ldi r24, 0x00 ; 0 2b1f8: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2b1fc: 23 ec ldi r18, 0xC3 ; 195 2b1fe: 35 ef ldi r19, 0xF5 ; 245 2b200: 48 ea ldi r20, 0xA8 ; 168 2b202: 5f e3 ldi r21, 0x3F ; 63 2b204: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2b208: 9f 93 push r25 2b20a: 8f 93 push r24 2b20c: 7f 93 push r23 2b20e: 6f 93 push r22 2b210: fd 81 ldd r31, Y+5 ; 0x05 2b212: 6f 2f mov r22, r31 2b214: 70 e0 ldi r23, 0x00 ; 0 2b216: 90 e0 ldi r25, 0x00 ; 0 2b218: 80 e0 ldi r24, 0x00 ; 0 2b21a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2b21e: 20 e0 ldi r18, 0x00 ; 0 2b220: 30 e0 ldi r19, 0x00 ; 0 2b222: 40 eb ldi r20, 0xB0 ; 176 2b224: 50 e4 ldi r21, 0x40 ; 64 2b226: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2b22a: 9f 93 push r25 2b22c: 8f 93 push r24 2b22e: 7f 93 push r23 2b230: 6f 93 push r22 2b232: 61 2f mov r22, r17 2b234: 70 e0 ldi r23, 0x00 ; 0 2b236: 90 e0 ldi r25, 0x00 ; 0 2b238: 80 e0 ldi r24, 0x00 ; 0 2b23a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2b23e: 20 e0 ldi r18, 0x00 ; 0 2b240: 30 e0 ldi r19, 0x00 ; 0 2b242: 40 eb ldi r20, 0xB0 ; 176 2b244: 50 e4 ldi r21, 0x40 ; 64 2b246: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2b24a: 9f 93 push r25 2b24c: 8f 93 push r24 2b24e: 7f 93 push r23 2b250: 6f 93 push r22 2b252: 81 ec ldi r24, 0xC1 ; 193 2b254: 9c e9 ldi r25, 0x9C ; 156 2b256: 9f 93 push r25 2b258: 8f 93 push r24 2b25a: 0f 94 a2 a2 call 0x34544 ; 0x34544 *pc = max_c; 2b25e: f2 01 movw r30, r4 2b260: 10 83 st Z, r17 *pr = max_r; 2b262: 2d 81 ldd r18, Y+5 ; 0x05 2b264: f1 01 movw r30, r2 2b266: 20 83 st Z, r18 2b268: 0f b6 in r0, 0x3f ; 63 2b26a: f8 94 cli 2b26c: de bf out 0x3e, r29 ; 62 2b26e: 0f be out 0x3f, r0 ; 63 2b270: cd bf out 0x3d, r28 ; 61 return max_match; } 2b272: 8c 81 ldd r24, Y+4 ; 0x04 2b274: 0f 90 pop r0 2b276: 0f 90 pop r0 2b278: 0f 90 pop r0 2b27a: 0f 90 pop r0 2b27c: 0f 90 pop r0 2b27e: df 91 pop r29 2b280: cf 91 pop r28 2b282: 1f 91 pop r17 2b284: 0f 91 pop r16 2b286: ff 90 pop r15 2b288: ef 90 pop r14 2b28a: df 90 pop r13 2b28c: cf 90 pop r12 2b28e: bf 90 pop r11 2b290: af 90 pop r10 2b292: 9f 90 pop r9 2b294: 8f 90 pop r8 2b296: 7f 90 pop r7 2b298: 6f 90 pop r6 2b29a: 5f 90 pop r5 2b29c: 4f 90 pop r4 2b29e: 3f 90 pop r3 2b2a0: 2f 90 pop r2 2b2a2: 08 95 ret uint8_t match = 0; for (uint8_t i = 0; i < 12; ++i){ for (uint8_t j = 0; j < 12; ++j){ /// skip corners (3 pixels in each) if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue; if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue; 2b2a4: 22 23 and r18, r18 2b2a6: 11 f0 breq .+4 ; 0x2b2ac 2b2a8: 2b 30 cpi r18, 0x0B ; 11 2b2aa: 21 f4 brne .+8 ; 0x2b2b4 2b2ac: ab 81 ldd r26, Y+3 ; 0x03 2b2ae: a8 30 cpi r26, 0x08 ; 8 2b2b0: 08 f0 brcs .+2 ; 0x2b2b4 2b2b2: 80 cf rjmp .-256 ; 0x2b1b4 const uint16_t idx = (c + j) + 32 * ((uint16_t)r + i); const bool high_pix = pixels[idx] > thr; 2b2b4: 99 24 eor r9, r9 2b2b6: 93 94 inc r9 2b2b8: d6 01 movw r26, r12 2b2ba: a2 0f add r26, r18 2b2bc: b3 1f adc r27, r19 2b2be: ac 91 ld r26, X 2b2c0: a1 31 cpi r26, 0x11 ; 17 2b2c2: 08 f4 brcc .+2 ; 0x2b2c6 2b2c4: 91 2c mov r9, r1 const bool high_pat = pattern[i] & (1 << j); 2b2c6: a0 80 ld r10, Z 2b2c8: b1 80 ldd r11, Z+1 ; 0x01 2b2ca: d3 01 movw r26, r6 2b2cc: 02 2e mov r0, r18 2b2ce: 02 c0 rjmp .+4 ; 0x2b2d4 2b2d0: aa 0f add r26, r26 2b2d2: bb 1f adc r27, r27 2b2d4: 0a 94 dec r0 2b2d6: e2 f7 brpl .-8 ; 0x2b2d0 2b2d8: aa 21 and r26, r10 2b2da: bb 21 and r27, r11 2b2dc: bb 24 eor r11, r11 2b2de: b3 94 inc r11 2b2e0: ab 2b or r26, r27 2b2e2: 09 f4 brne .+2 ; 0x2b2e6 2b2e4: b1 2c mov r11, r1 if (high_pix == high_pat) 2b2e6: 9b 10 cpse r9, r11 2b2e8: 65 cf rjmp .-310 ; 0x2b1b4 match++; 2b2ea: 0f 5f subi r16, 0xFF ; 255 2b2ec: 63 cf rjmp .-314 ; 0x2b1b4 0002b2ee : * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. Reasons for * failure include not finding a valid partition, not finding a valid * FAT file system in the specified partition or an I/O error. */ bool SdVolume::init(Sd2Card* dev, uint8_t part) { 2b2ee: 8f 92 push r8 2b2f0: 9f 92 push r9 2b2f2: af 92 push r10 2b2f4: bf 92 push r11 2b2f6: cf 92 push r12 2b2f8: df 92 push r13 2b2fa: ef 92 push r14 2b2fc: ff 92 push r15 2b2fe: cf 93 push r28 2b300: df 93 push r29 uint32_t totalBlocks; uint32_t volumeStartBlock = 0; fat32_boot_t* fbs; sdCard_ = dev; 2b302: 24 e4 ldi r18, 0x44 ; 68 2b304: 36 e1 ldi r19, 0x16 ; 22 2b306: 30 93 44 0e sts 0x0E44, r19 ; 0x800e44 2b30a: 20 93 43 0e sts 0x0E43, r18 ; 0x800e43 fatType_ = 0; 2b30e: 10 92 60 16 sts 0x1660, r1 ; 0x801660 allocSearchStart_ = 2; 2b312: 42 e0 ldi r20, 0x02 ; 2 2b314: 50 e0 ldi r21, 0x00 ; 0 2b316: 60 e0 ldi r22, 0x00 ; 0 2b318: 70 e0 ldi r23, 0x00 ; 0 2b31a: 40 93 49 16 sts 0x1649, r20 ; 0x801649 2b31e: 50 93 4a 16 sts 0x164A, r21 ; 0x80164a 2b322: 60 93 4b 16 sts 0x164B, r22 ; 0x80164b 2b326: 70 93 4c 16 sts 0x164C, r23 ; 0x80164c cacheDirty_ = 0; // cacheFlush() will write block if true 2b32a: 10 92 42 0e sts 0x0E42, r1 ; 0x800e42 cacheMirrorBlock_ = 0; 2b32e: 10 92 3e 0e sts 0x0E3E, r1 ; 0x800e3e 2b332: 10 92 3f 0e sts 0x0E3F, r1 ; 0x800e3f 2b336: 10 92 40 0e sts 0x0E40, r1 ; 0x800e40 2b33a: 10 92 41 0e sts 0x0E41, r1 ; 0x800e41 cacheBlockNumber_ = 0XFFFFFFFF; 2b33e: 4f ef ldi r20, 0xFF ; 255 2b340: 5f ef ldi r21, 0xFF ; 255 2b342: ba 01 movw r22, r20 2b344: 40 93 3a 0e sts 0x0E3A, r20 ; 0x800e3a 2b348: 50 93 3b 0e sts 0x0E3B, r21 ; 0x800e3b 2b34c: 60 93 3c 0e sts 0x0E3C, r22 ; 0x800e3c 2b350: 70 93 3d 0e sts 0x0E3D, r23 ; 0x800e3d // if part == 0 assume super floppy with FAT boot sector in block zero // if part > 0 assume mbr volume with partition table if (part) { 2b354: 88 23 and r24, r24 2b356: 09 f4 brne .+2 ; 0x2b35a 2b358: 70 c0 rjmp .+224 ; 0x2b43a if (part > 4)goto fail; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; 2b35a: 40 e0 ldi r20, 0x00 ; 0 2b35c: 60 e0 ldi r22, 0x00 ; 0 2b35e: 70 e0 ldi r23, 0x00 ; 0 2b360: cb 01 movw r24, r22 2b362: 0f 94 86 2a call 0x2550c ; 0x2550c 2b366: 81 11 cpse r24, r1 2b368: 0d c0 rjmp .+26 ; 0x2b384 fatType_ = 32; } return true; fail: return false; 2b36a: c0 e0 ldi r28, 0x00 ; 0 } 2b36c: 8c 2f mov r24, r28 2b36e: df 91 pop r29 2b370: cf 91 pop r28 2b372: ff 90 pop r15 2b374: ef 90 pop r14 2b376: df 90 pop r13 2b378: cf 90 pop r12 2b37a: bf 90 pop r11 2b37c: af 90 pop r10 2b37e: 9f 90 pop r9 2b380: 8f 90 pop r8 2b382: 08 95 ret // if part > 0 assume mbr volume with partition table if (part) { if (part > 4)goto fail; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; part_t* p = &cacheBuffer_.mbr.part[part-1]; if ((p->boot & 0X7F) !=0 || 2b384: 80 91 04 10 lds r24, 0x1004 ; 0x801004 2b388: 8f 77 andi r24, 0x7F ; 127 2b38a: 79 f7 brne .-34 ; 0x2b36a 2b38c: 80 91 10 10 lds r24, 0x1010 ; 0x801010 2b390: 90 91 11 10 lds r25, 0x1011 ; 0x801011 2b394: a0 91 12 10 lds r26, 0x1012 ; 0x801012 2b398: b0 91 13 10 lds r27, 0x1013 ; 0x801013 2b39c: 84 36 cpi r24, 0x64 ; 100 2b39e: 91 05 cpc r25, r1 2b3a0: a1 05 cpc r26, r1 2b3a2: b1 05 cpc r27, r1 2b3a4: 10 f3 brcs .-60 ; 0x2b36a p->totalSectors < 100 || p->firstSector == 0) { 2b3a6: c0 90 0c 10 lds r12, 0x100C ; 0x80100c 2b3aa: d0 90 0d 10 lds r13, 0x100D ; 0x80100d 2b3ae: e0 90 0e 10 lds r14, 0x100E ; 0x80100e 2b3b2: f0 90 0f 10 lds r15, 0x100F ; 0x80100f if (part) { if (part > 4)goto fail; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; part_t* p = &cacheBuffer_.mbr.part[part-1]; if ((p->boot & 0X7F) !=0 || p->totalSectors < 100 || 2b3b6: c1 14 cp r12, r1 2b3b8: d1 04 cpc r13, r1 2b3ba: e1 04 cpc r14, r1 2b3bc: f1 04 cpc r15, r1 2b3be: a9 f2 breq .-86 ; 0x2b36a // not a valid partition goto fail; } volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; 2b3c0: 40 e0 ldi r20, 0x00 ; 0 2b3c2: c7 01 movw r24, r14 2b3c4: b6 01 movw r22, r12 2b3c6: 0f 94 86 2a call 0x2550c ; 0x2550c 2b3ca: c8 2f mov r28, r24 2b3cc: 88 23 and r24, r24 2b3ce: 69 f2 breq .-102 ; 0x2b36a fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || 2b3d0: 80 91 51 0e lds r24, 0x0E51 ; 0x800e51 2b3d4: 90 91 52 0e lds r25, 0x0E52 ; 0x800e52 2b3d8: 81 15 cp r24, r1 2b3da: 92 40 sbci r25, 0x02 ; 2 2b3dc: 31 f6 brne .-116 ; 0x2b36a fbs->fatCount == 0 || 2b3de: a0 91 56 0e lds r26, 0x0E56 ; 0x800e56 } volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || 2b3e2: aa 23 and r26, r26 2b3e4: 11 f2 breq .-124 ; 0x2b36a fbs->fatCount == 0 || fbs->reservedSectorCount == 0 || 2b3e6: 60 91 54 0e lds r22, 0x0E54 ; 0x800e54 2b3ea: 70 91 55 0e lds r23, 0x0E55 ; 0x800e55 volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || fbs->fatCount == 0 || 2b3ee: 61 15 cp r22, r1 2b3f0: 71 05 cpc r23, r1 2b3f2: 09 f4 brne .+2 ; 0x2b3f6 2b3f4: ba cf rjmp .-140 ; 0x2b36a fbs->reservedSectorCount == 0 || fbs->sectorsPerCluster == 0) { 2b3f6: 20 91 53 0e lds r18, 0x0E53 ; 0x800e53 } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || fbs->fatCount == 0 || fbs->reservedSectorCount == 0 || 2b3fa: 22 23 and r18, r18 2b3fc: 09 f4 brne .+2 ; 0x2b400 2b3fe: b5 cf rjmp .-150 ; 0x2b36a fbs->sectorsPerCluster == 0) { // not valid FAT volume goto fail; } fatCount_ = fbs->fatCount; 2b400: a0 93 5b 16 sts 0x165B, r26 ; 0x80165b blocksPerCluster_ = fbs->sectorsPerCluster; 2b404: 20 93 4d 16 sts 0x164D, r18 ; 0x80164d // determine shift that is same as multiply by blocksPerCluster_ clusterSizeShift_ = 0; 2b408: 90 e0 ldi r25, 0x00 ; 0 2b40a: 80 e0 ldi r24, 0x00 ; 0 while (blocksPerCluster_ != (1 << clusterSizeShift_)) { 2b40c: 30 e0 ldi r19, 0x00 ; 0 2b40e: e1 e0 ldi r30, 0x01 ; 1 2b410: f0 e0 ldi r31, 0x00 ; 0 2b412: d8 2f mov r29, r24 2b414: af 01 movw r20, r30 2b416: 08 2e mov r0, r24 2b418: 02 c0 rjmp .+4 ; 0x2b41e 2b41a: 44 0f add r20, r20 2b41c: 55 1f adc r21, r21 2b41e: 0a 94 dec r0 2b420: e2 f7 brpl .-8 ; 0x2b41a 2b422: 24 17 cp r18, r20 2b424: 35 07 cpc r19, r21 2b426: 69 f0 breq .+26 ; 0x2b442 2b428: 41 e0 ldi r20, 0x01 ; 1 2b42a: 48 0f add r20, r24 2b42c: 01 96 adiw r24, 0x01 ; 1 // error if not power of 2 if (clusterSizeShift_++ > 7) goto fail; 2b42e: 89 30 cpi r24, 0x09 ; 9 2b430: 91 05 cpc r25, r1 2b432: 79 f7 brne .-34 ; 0x2b412 2b434: 40 93 56 16 sts 0x1656, r20 ; 0x801656 2b438: 98 cf rjmp .-208 ; 0x2b36a * failure include not finding a valid partition, not finding a valid * FAT file system in the specified partition or an I/O error. */ bool SdVolume::init(Sd2Card* dev, uint8_t part) { uint32_t totalBlocks; uint32_t volumeStartBlock = 0; 2b43a: c1 2c mov r12, r1 2b43c: d1 2c mov r13, r1 2b43e: 76 01 movw r14, r12 2b440: bf cf rjmp .-130 ; 0x2b3c0 2b442: 80 93 56 16 sts 0x1656, r24 ; 0x801656 clusterSizeShift_ = 0; while (blocksPerCluster_ != (1 << clusterSizeShift_)) { // error if not power of 2 if (clusterSizeShift_++ > 7) goto fail; } blocksPerFat_ = fbs->sectorsPerFat16 ? 2b446: 20 91 5c 0e lds r18, 0x0E5C ; 0x800e5c 2b44a: 30 91 5d 0e lds r19, 0x0E5D ; 0x800e5d 2b44e: 50 e0 ldi r21, 0x00 ; 0 2b450: 40 e0 ldi r20, 0x00 ; 0 2b452: 21 15 cp r18, r1 2b454: 31 05 cpc r19, r1 2b456: 41 f4 brne .+16 ; 0x2b468 2b458: 20 91 6a 0e lds r18, 0x0E6A ; 0x800e6a 2b45c: 30 91 6b 0e lds r19, 0x0E6B ; 0x800e6b 2b460: 40 91 6c 0e lds r20, 0x0E6C ; 0x800e6c 2b464: 50 91 6d 0e lds r21, 0x0E6D ; 0x800e6d 2b468: 20 93 4e 16 sts 0x164E, r18 ; 0x80164e 2b46c: 30 93 4f 16 sts 0x164F, r19 ; 0x80164f 2b470: 40 93 50 16 sts 0x1650, r20 ; 0x801650 2b474: 50 93 51 16 sts 0x1651, r21 ; 0x801651 fbs->sectorsPerFat16 : fbs->sectorsPerFat32; fatStartBlock_ = volumeStartBlock + fbs->reservedSectorCount; 2b478: 46 01 movw r8, r12 2b47a: 57 01 movw r10, r14 2b47c: 86 0e add r8, r22 2b47e: 97 1e adc r9, r23 2b480: a1 1c adc r10, r1 2b482: b1 1c adc r11, r1 2b484: 80 92 5c 16 sts 0x165C, r8 ; 0x80165c 2b488: 90 92 5d 16 sts 0x165D, r9 ; 0x80165d 2b48c: a0 92 5e 16 sts 0x165E, r10 ; 0x80165e 2b490: b0 92 5f 16 sts 0x165F, r11 ; 0x80165f // count for FAT16 zero for FAT32 rootDirEntryCount_ = fbs->rootDirEntryCount; 2b494: e0 91 57 0e lds r30, 0x0E57 ; 0x800e57 2b498: f0 91 58 0e lds r31, 0x0E58 ; 0x800e58 2b49c: f0 93 62 16 sts 0x1662, r31 ; 0x801662 2b4a0: e0 93 61 16 sts 0x1661, r30 ; 0x801661 // directory start for FAT16 dataStart for FAT32 rootDirStart_ = fatStartBlock_ + fbs->fatCount * blocksPerFat_; 2b4a4: b0 e0 ldi r27, 0x00 ; 0 2b4a6: 0f 94 75 a4 call 0x348ea ; 0x348ea <__muluhisi3> 2b4aa: dc 01 movw r26, r24 2b4ac: cb 01 movw r24, r22 2b4ae: 88 0d add r24, r8 2b4b0: 99 1d adc r25, r9 2b4b2: aa 1d adc r26, r10 2b4b4: bb 1d adc r27, r11 2b4b6: 80 93 63 16 sts 0x1663, r24 ; 0x801663 2b4ba: 90 93 64 16 sts 0x1664, r25 ; 0x801664 2b4be: a0 93 65 16 sts 0x1665, r26 ; 0x801665 2b4c2: b0 93 66 16 sts 0x1666, r27 ; 0x801666 // data start for FAT16 and FAT32 dataStartBlock_ = rootDirStart_ + ((32 * fbs->rootDirEntryCount + 511)/512); 2b4c6: 25 e0 ldi r18, 0x05 ; 5 2b4c8: ee 0f add r30, r30 2b4ca: ff 1f adc r31, r31 2b4cc: 2a 95 dec r18 2b4ce: e1 f7 brne .-8 ; 0x2b4c8 2b4d0: e1 50 subi r30, 0x01 ; 1 2b4d2: fe 4f sbci r31, 0xFE ; 254 2b4d4: ef 2f mov r30, r31 2b4d6: ff 27 eor r31, r31 2b4d8: e6 95 lsr r30 2b4da: 8e 0f add r24, r30 2b4dc: 9f 1f adc r25, r31 2b4de: a1 1d adc r26, r1 2b4e0: b1 1d adc r27, r1 2b4e2: 80 93 57 16 sts 0x1657, r24 ; 0x801657 2b4e6: 90 93 58 16 sts 0x1658, r25 ; 0x801658 2b4ea: a0 93 59 16 sts 0x1659, r26 ; 0x801659 2b4ee: b0 93 5a 16 sts 0x165A, r27 ; 0x80165a // total blocks for FAT16 or FAT32 totalBlocks = fbs->totalSectors16 ? 2b4f2: 80 90 59 0e lds r8, 0x0E59 ; 0x800e59 2b4f6: 90 90 5a 0e lds r9, 0x0E5A ; 0x800e5a 2b4fa: b1 2c mov r11, r1 2b4fc: a1 2c mov r10, r1 2b4fe: 81 14 cp r8, r1 2b500: 91 04 cpc r9, r1 2b502: 41 f4 brne .+16 ; 0x2b514 2b504: 80 90 66 0e lds r8, 0x0E66 ; 0x800e66 2b508: 90 90 67 0e lds r9, 0x0E67 ; 0x800e67 2b50c: a0 90 68 0e lds r10, 0x0E68 ; 0x800e68 2b510: b0 90 69 0e lds r11, 0x0E69 ; 0x800e69 fbs->totalSectors16 : fbs->totalSectors32; // total data blocks clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); 2b514: c8 1a sub r12, r24 2b516: d9 0a sbc r13, r25 2b518: ea 0a sbc r14, r26 2b51a: fb 0a sbc r15, r27 2b51c: c8 0c add r12, r8 2b51e: d9 1c adc r13, r9 2b520: ea 1c adc r14, r10 2b522: fb 1c adc r15, r11 // divide by cluster size to get cluster count clusterCount_ >>= clusterSizeShift_; 2b524: 04 c0 rjmp .+8 ; 0x2b52e 2b526: f6 94 lsr r15 2b528: e7 94 ror r14 2b52a: d7 94 ror r13 2b52c: c7 94 ror r12 2b52e: da 95 dec r29 2b530: d2 f7 brpl .-12 ; 0x2b526 2b532: c0 92 52 16 sts 0x1652, r12 ; 0x801652 2b536: d0 92 53 16 sts 0x1653, r13 ; 0x801653 2b53a: e0 92 54 16 sts 0x1654, r14 ; 0x801654 2b53e: f0 92 55 16 sts 0x1655, r15 ; 0x801655 // FAT type is determined by cluster count if (clusterCount_ < 4085) { 2b542: 85 ef ldi r24, 0xF5 ; 245 2b544: c8 16 cp r12, r24 2b546: 8f e0 ldi r24, 0x0F ; 15 2b548: d8 06 cpc r13, r24 2b54a: e1 04 cpc r14, r1 2b54c: f1 04 cpc r15, r1 2b54e: 20 f4 brcc .+8 ; 0x2b558 fatType_ = 12; 2b550: 8c e0 ldi r24, 0x0C ; 12 2b552: 80 93 60 16 sts 0x1660, r24 ; 0x801660 2b556: 09 cf rjmp .-494 ; 0x2b36a if (!FAT12_SUPPORT) goto fail; } else if (clusterCount_ < 65525) { fatType_ = 16; 2b558: 80 e1 ldi r24, 0x10 ; 16 // FAT type is determined by cluster count if (clusterCount_ < 4085) { fatType_ = 12; if (!FAT12_SUPPORT) goto fail; } else if (clusterCount_ < 65525) { 2b55a: 25 ef ldi r18, 0xF5 ; 245 2b55c: c2 16 cp r12, r18 2b55e: 2f ef ldi r18, 0xFF ; 255 2b560: d2 06 cpc r13, r18 2b562: e1 04 cpc r14, r1 2b564: f1 04 cpc r15, r1 2b566: 88 f0 brcs .+34 ; 0x2b58a fatType_ = 16; } else { rootDirStart_ = fbs->fat32RootCluster; 2b568: 80 91 72 0e lds r24, 0x0E72 ; 0x800e72 2b56c: 90 91 73 0e lds r25, 0x0E73 ; 0x800e73 2b570: a0 91 74 0e lds r26, 0x0E74 ; 0x800e74 2b574: b0 91 75 0e lds r27, 0x0E75 ; 0x800e75 2b578: 80 93 63 16 sts 0x1663, r24 ; 0x801663 2b57c: 90 93 64 16 sts 0x1664, r25 ; 0x801664 2b580: a0 93 65 16 sts 0x1665, r26 ; 0x801665 2b584: b0 93 66 16 sts 0x1666, r27 ; 0x801666 fatType_ = 32; 2b588: 80 e2 ldi r24, 0x20 ; 32 2b58a: 80 93 60 16 sts 0x1660, r24 ; 0x801660 2b58e: ee ce rjmp .-548 ; 0x2b36c 0002b590 : // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; return -1; } bool SdFile::gfEnsureBlock(){ 2b590: 0f 93 push r16 2b592: 1f 93 push r17 // this comparison is heavy-weight, especially when there is another one inside cacheRawBlock // but it is necessary to avoid computing of terminateOfs if not needed if( gfBlock != vol_->cacheBlockNumber_ ){ 2b594: 60 91 84 16 lds r22, 0x1684 ; 0x801684 2b598: 70 91 85 16 lds r23, 0x1685 ; 0x801685 2b59c: 80 91 86 16 lds r24, 0x1686 ; 0x801686 2b5a0: 90 91 87 16 lds r25, 0x1687 ; 0x801687 2b5a4: 00 91 3a 0e lds r16, 0x0E3A ; 0x800e3a 2b5a8: 10 91 3b 0e lds r17, 0x0E3B ; 0x800e3b 2b5ac: 20 91 3c 0e lds r18, 0x0E3C ; 0x800e3c 2b5b0: 30 91 3d 0e lds r19, 0x0E3D ; 0x800e3d 2b5b4: 60 17 cp r22, r16 2b5b6: 71 07 cpc r23, r17 2b5b8: 82 07 cpc r24, r18 2b5ba: 93 07 cpc r25, r19 2b5bc: 39 f1 breq .+78 ; 0x2b60c if ( ! vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){ 2b5be: 40 e0 ldi r20, 0x00 ; 0 2b5c0: 0f 94 86 2a call 0x2550c ; 0x2550c 2b5c4: 88 23 and r24, r24 2b5c6: f9 f0 breq .+62 ; 0x2b606 return false; } // terminate with a '\n' const uint32_t terminateOfs = fileSize_ - gfOffset; 2b5c8: 20 91 88 16 lds r18, 0x1688 ; 0x801688 2b5cc: 30 91 89 16 lds r19, 0x1689 ; 0x801689 2b5d0: 40 91 78 16 lds r20, 0x1678 ; 0x801678 2b5d4: 50 91 79 16 lds r21, 0x1679 ; 0x801679 2b5d8: 60 91 7a 16 lds r22, 0x167A ; 0x80167a 2b5dc: 70 91 7b 16 lds r23, 0x167B ; 0x80167b 2b5e0: 42 1b sub r20, r18 2b5e2: 53 0b sbc r21, r19 2b5e4: 61 09 sbc r22, r1 2b5e6: 71 09 sbc r23, r1 vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; 2b5e8: 41 30 cpi r20, 0x01 ; 1 2b5ea: 92 e0 ldi r25, 0x02 ; 2 2b5ec: 59 07 cpc r21, r25 2b5ee: 61 05 cpc r22, r1 2b5f0: 71 05 cpc r23, r1 2b5f2: 20 f0 brcs .+8 ; 0x2b5fc 2b5f4: 40 e0 ldi r20, 0x00 ; 0 2b5f6: 52 e0 ldi r21, 0x02 ; 2 2b5f8: 60 e0 ldi r22, 0x00 ; 0 2b5fa: 70 e0 ldi r23, 0x00 ; 0 2b5fc: 4a 5b subi r20, 0xBA ; 186 2b5fe: 51 4f sbci r21, 0xF1 ; 241 2b600: 9a e0 ldi r25, 0x0A ; 10 2b602: fa 01 movw r30, r20 2b604: 90 83 st Z, r25 } return true; } 2b606: 1f 91 pop r17 2b608: 0f 91 pop r16 2b60a: 08 95 ret } // terminate with a '\n' const uint32_t terminateOfs = fileSize_ - gfOffset; vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; } return true; 2b60c: 81 e0 ldi r24, 0x01 ; 1 2b60e: fb cf rjmp .-10 ; 0x2b606 0002b610 : break; } } void __attribute__((noinline)) MMU2::HelpUnloadToFinda() { extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE); 2b610: 20 e0 ldi r18, 0x00 ; 0 2b612: 30 e0 ldi r19, 0x00 ; 0 2b614: 40 ea ldi r20, 0xA0 ; 160 2b616: 52 e4 ldi r21, 0x42 ; 66 2b618: 60 e0 ldi r22, 0x00 ; 0 2b61a: 70 e0 ldi r23, 0x00 ; 0 2b61c: 80 ea ldi r24, 0xA0 ; 160 2b61e: 92 ec ldi r25, 0xC2 ; 194 2b620: 0d 94 d6 50 jmp 0x2a1ac ; 0x2a1ac 0002b624 : void MMU2::Home(uint8_t mode) { logic.Home(mode); } void MMU2::SaveHotendTemp(bool turn_off_nozzle) { if (mmu_print_saved & SavedState::Cooldown) { 2b624: 90 91 02 13 lds r25, 0x1302 ; 0x801302 2b628: 91 fd sbrc r25, 1 2b62a: 17 c0 rjmp .+46 ; 0x2b65a return; } if (turn_off_nozzle && !(mmu_print_saved & SavedState::CooldownPending)) { 2b62c: 88 23 and r24, r24 2b62e: a9 f0 breq .+42 ; 0x2b65a 2b630: 92 fd sbrc r25, 2 2b632: 13 c0 rjmp .+38 ; 0x2b65a Disable_E0(); 2b634: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 resume_hotend_temp = thermal_degTargetHotend(); 2b638: 80 91 5d 12 lds r24, 0x125D ; 0x80125d 2b63c: 90 91 5e 12 lds r25, 0x125E ; 0x80125e 2b640: 90 93 f7 12 sts 0x12F7, r25 ; 0x8012f7 2b644: 80 93 f6 12 sts 0x12F6, r24 ; 0x8012f6 mmu_print_saved |= SavedState::CooldownPending; 2b648: 80 91 02 13 lds r24, 0x1302 ; 0x801302 2b64c: 84 60 ori r24, 0x04 ; 4 2b64e: 80 93 02 13 sts 0x1302, r24 ; 0x801302 LogEchoEvent_P(PSTR("Heater cooldown pending")); 2b652: 8d ef ldi r24, 0xFD ; 253 2b654: 9d e9 ldi r25, 0x9D ; 157 2b656: 0d 94 fa 50 jmp 0x2a1f4 ; 0x2a1f4 } } 2b65a: 08 95 ret 0002b65c : ScreenClear(); } } void MMU2::ResumeUnpark() { if (mmu_print_saved & SavedState::ParkExtruder) { 2b65c: 80 91 02 13 lds r24, 0x1302 ; 0x801302 2b660: 80 ff sbrs r24, 0 2b662: 45 c0 rjmp .+138 ; 0x2b6ee LogEchoEvent_P(PSTR("Resuming XYZ")); 2b664: 85 e1 ldi r24, 0x15 ; 21 2b666: 9e e9 ldi r25, 0x9E ; 158 2b668: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 // Move XY to starting position, then Z motion_do_blocking_move_to_xy(resume_position.xyz[0], resume_position.xyz[1], feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); 2b66c: 80 91 ee 12 lds r24, 0x12EE ; 0x8012ee 2b670: 90 91 ef 12 lds r25, 0x12EF ; 0x8012ef 2b674: a0 91 f0 12 lds r26, 0x12F0 ; 0x8012f0 2b678: b0 91 f1 12 lds r27, 0x12F1 ; 0x8012f1 pos3d planner_current_position() { return pos3d(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); } void motion_do_blocking_move_to_xy(float rx, float ry, float feedRate_mm_s) { current_position[X_AXIS] = rx; 2b67c: 40 91 ea 12 lds r20, 0x12EA ; 0x8012ea 2b680: 50 91 eb 12 lds r21, 0x12EB ; 0x8012eb 2b684: 60 91 ec 12 lds r22, 0x12EC ; 0x8012ec 2b688: 70 91 ed 12 lds r23, 0x12ED ; 0x8012ed 2b68c: 40 93 61 12 sts 0x1261, r20 ; 0x801261 2b690: 50 93 62 12 sts 0x1262, r21 ; 0x801262 2b694: 60 93 63 12 sts 0x1263, r22 ; 0x801263 2b698: 70 93 64 12 sts 0x1264, r23 ; 0x801264 current_position[Y_AXIS] = ry; 2b69c: 80 93 65 12 sts 0x1265, r24 ; 0x801265 2b6a0: 90 93 66 12 sts 0x1266, r25 ; 0x801266 2b6a4: a0 93 67 12 sts 0x1267, r26 ; 0x801267 2b6a8: b0 93 68 12 sts 0x1268, r27 ; 0x801268 planner_line_to_current_position_sync(feedRate_mm_s); 2b6ac: 60 e0 ldi r22, 0x00 ; 0 2b6ae: 70 e0 ldi r23, 0x00 ; 0 2b6b0: 88 e4 ldi r24, 0x48 ; 72 2b6b2: 92 e4 ldi r25, 0x42 ; 66 2b6b4: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec } void motion_do_blocking_move_to_z(float z, float feedRate_mm_s) { current_position[Z_AXIS] = z; 2b6b8: 80 91 f2 12 lds r24, 0x12F2 ; 0x8012f2 2b6bc: 90 91 f3 12 lds r25, 0x12F3 ; 0x8012f3 2b6c0: a0 91 f4 12 lds r26, 0x12F4 ; 0x8012f4 2b6c4: b0 91 f5 12 lds r27, 0x12F5 ; 0x8012f5 2b6c8: 80 93 69 12 sts 0x1269, r24 ; 0x801269 2b6cc: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 2b6d0: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 2b6d4: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c planner_line_to_current_position_sync(feedRate_mm_s); 2b6d8: 60 e0 ldi r22, 0x00 ; 0 2b6da: 70 e0 ldi r23, 0x00 ; 0 2b6dc: 80 e7 ldi r24, 0x70 ; 112 2b6de: 91 e4 ldi r25, 0x41 ; 65 2b6e0: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // From this point forward, power panic should not use // the partial backup in RAM since the extruder is no // longer in parking position marlin_clear_print_state_in_ram(); mmu_print_saved &= ~(SavedState::ParkExtruder); 2b6e4: 80 91 02 13 lds r24, 0x1302 ; 0x801302 2b6e8: 8e 7f andi r24, 0xFE ; 254 2b6ea: 80 93 02 13 sts 0x1302, r24 ; 0x801302 } } 2b6ee: 08 95 ret 0002b6f0 : mmu_print_saved |= SavedState::CooldownPending; LogEchoEvent_P(PSTR("Heater cooldown pending")); } } void MMU2::SaveAndPark(bool move_axes) { 2b6f0: 0f 93 push r16 2b6f2: 1f 93 push r17 2b6f4: cf 93 push r28 if (mmu_print_saved == SavedState::None) { // First occurrence. Save current position, park print head, disable nozzle heater. 2b6f6: 90 91 02 13 lds r25, 0x1302 ; 0x801302 2b6fa: 91 11 cpse r25, r1 2b6fc: 72 c0 rjmp .+228 ; 0x2b7e2 2b6fe: c8 2f mov r28, r24 LogEchoEvent_P(PSTR("Saving and parking")); 2b700: 8a ee ldi r24, 0xEA ; 234 2b702: 9d e9 ldi r25, 0x9D ; 157 2b704: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 Disable_E0(); 2b708: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 2b70c: 0f 94 fb 1a call 0x235f6 ; 0x235f6 /// e.g. feedrate, Z-axis position etc. /// This function should backup variables which may be lost /// For example a power panic in M600 or during MMU error void refresh_print_state_in_ram() { if (saved_printing) return; 2b710: 80 91 73 12 lds r24, 0x1273 ; 0x801273 2b714: 81 11 cpse r24, r1 2b716: 02 c0 rjmp .+4 ; 0x2b71c 2b718: 0e 94 a6 63 call 0xc74c ; 0xc74c // In case a power panic happens while waiting for the user // take a partial back up of print state into RAM (current position, etc.) marlin_refresh_print_state_in_ram(); if (move_axes) { 2b71c: cc 23 and r28, r28 2b71e: 09 f4 brne .+2 ; 0x2b722 2b720: 60 c0 rjmp .+192 ; 0x2b7e2 mmu_print_saved |= SavedState::ParkExtruder; 2b722: 80 91 02 13 lds r24, 0x1302 ; 0x801302 2b726: 81 60 ori r24, 0x01 ; 1 2b728: 80 93 02 13 sts 0x1302, r24 ; 0x801302 void planner_set_current_position_E(float e) { current_position[E_AXIS] = e; } pos3d planner_current_position() { return pos3d(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); 2b72c: 80 91 69 12 lds r24, 0x1269 ; 0x801269 2b730: 90 91 6a 12 lds r25, 0x126A ; 0x80126a 2b734: a0 91 6b 12 lds r26, 0x126B ; 0x80126b 2b738: b0 91 6c 12 lds r27, 0x126C ; 0x80126c 2b73c: 40 91 65 12 lds r20, 0x1265 ; 0x801265 2b740: 50 91 66 12 lds r21, 0x1266 ; 0x801266 2b744: 60 91 67 12 lds r22, 0x1267 ; 0x801267 2b748: 70 91 68 12 lds r23, 0x1268 ; 0x801268 resume_position = planner_current_position(); // save current pos 2b74c: 00 91 61 12 lds r16, 0x1261 ; 0x801261 2b750: 10 91 62 12 lds r17, 0x1262 ; 0x801262 2b754: 20 91 63 12 lds r18, 0x1263 ; 0x801263 2b758: 30 91 64 12 lds r19, 0x1264 ; 0x801264 2b75c: 00 93 ea 12 sts 0x12EA, r16 ; 0x8012ea 2b760: 10 93 eb 12 sts 0x12EB, r17 ; 0x8012eb 2b764: 20 93 ec 12 sts 0x12EC, r18 ; 0x8012ec 2b768: 30 93 ed 12 sts 0x12ED, r19 ; 0x8012ed 2b76c: 40 93 ee 12 sts 0x12EE, r20 ; 0x8012ee 2b770: 50 93 ef 12 sts 0x12EF, r21 ; 0x8012ef 2b774: 60 93 f0 12 sts 0x12F0, r22 ; 0x8012f0 2b778: 70 93 f1 12 sts 0x12F1, r23 ; 0x8012f1 2b77c: 80 93 f2 12 sts 0x12F2, r24 ; 0x8012f2 2b780: 90 93 f3 12 sts 0x12F3, r25 ; 0x8012f3 2b784: a0 93 f4 12 sts 0x12F4, r26 ; 0x8012f4 2b788: b0 93 f5 12 sts 0x12F5, r27 ; 0x8012f5 current_position[E_AXIS] += delta; planner_line_to_current_position(feedRate); } float move_raise_z(float delta) { return raise_z(delta); 2b78c: 60 e0 ldi r22, 0x00 ; 0 2b78e: 70 e0 ldi r23, 0x00 ; 0 2b790: 80 ea ldi r24, 0xA0 ; 160 2b792: 91 e4 ldi r25, 0x41 ; 65 2b794: 0e 94 94 6c call 0xd928 ; 0xd928 void Disable_E0() { disable_e0(); } bool all_axes_homed() { return axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]; 2b798: 80 91 39 06 lds r24, 0x0639 ; 0x800639 2b79c: 88 23 and r24, r24 2b79e: 09 f1 breq .+66 ; 0x2b7e2 2b7a0: 80 91 3a 06 lds r24, 0x063A ; 0x80063a 2b7a4: 88 23 and r24, r24 2b7a6: e9 f0 breq .+58 ; 0x2b7e2 current_position[Z_AXIS] = z; planner_line_to_current_position_sync(feedRate_mm_s); } void nozzle_park() { current_position[X_AXIS] = MMU_ERR_X_PAUSE_POS; 2b7a8: 80 e0 ldi r24, 0x00 ; 0 2b7aa: 90 e0 ldi r25, 0x00 ; 0 2b7ac: aa ef ldi r26, 0xFA ; 250 2b7ae: b2 e4 ldi r27, 0x42 ; 66 2b7b0: 80 93 61 12 sts 0x1261, r24 ; 0x801261 2b7b4: 90 93 62 12 sts 0x1262, r25 ; 0x801262 2b7b8: a0 93 63 12 sts 0x1263, r26 ; 0x801263 2b7bc: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS; 2b7c0: 10 92 65 12 sts 0x1265, r1 ; 0x801265 2b7c4: 10 92 66 12 sts 0x1266, r1 ; 0x801266 2b7c8: 10 92 67 12 sts 0x1267, r1 ; 0x801267 2b7cc: 10 92 68 12 sts 0x1268, r1 ; 0x801268 planner_line_to_current_position_sync(NOZZLE_PARK_XY_FEEDRATE); 2b7d0: 60 e0 ldi r22, 0x00 ; 0 2b7d2: 70 e0 ldi r23, 0x00 ; 0 2b7d4: 88 e4 ldi r24, 0x48 ; 72 2b7d6: 92 e4 ldi r25, 0x42 ; 66 if (all_axes_homed()) { nozzle_park(); } } } } 2b7d8: cf 91 pop r28 2b7da: 1f 91 pop r17 2b7dc: 0f 91 pop r16 2b7de: 0d 94 f6 50 jmp 0x2a1ec ; 0x2a1ec 2b7e2: cf 91 pop r28 2b7e4: 1f 91 pop r17 2b7e6: 0f 91 pop r16 2b7e8: 08 95 ret 0002b7ea : /// Searches for circle iteratively /// Uses points on the perimeter. If point is high it pushes circle out of the center (shift or change of radius), /// otherwise to the center. /// Algorithm is stopped after fixed number of iterations. Move is limited to 0.5 px per iteration. void dynamic_circle(uint8_t *matrix_32x32, float &x, float &y, float &r, uint8_t iterations){ 2b7ea: 2f 92 push r2 2b7ec: 3f 92 push r3 2b7ee: 4f 92 push r4 2b7f0: 5f 92 push r5 2b7f2: 6f 92 push r6 2b7f4: 7f 92 push r7 2b7f6: 8f 92 push r8 2b7f8: 9f 92 push r9 2b7fa: af 92 push r10 2b7fc: bf 92 push r11 2b7fe: cf 92 push r12 2b800: df 92 push r13 2b802: ef 92 push r14 2b804: ff 92 push r15 2b806: 0f 93 push r16 2b808: 1f 93 push r17 2b80a: cf 93 push r28 2b80c: df 93 push r29 2b80e: cd b7 in r28, 0x3d ; 61 2b810: de b7 in r29, 0x3e ; 62 2b812: cd 5b subi r28, 0xBD ; 189 2b814: d1 40 sbci r29, 0x01 ; 1 2b816: 0f b6 in r0, 0x3f ; 63 2b818: f8 94 cli 2b81a: de bf out 0x3e, r29 ; 62 2b81c: 0f be out 0x3f, r0 ; 63 2b81e: cd bf out 0x3d, r28 ; 61 2b820: c3 57 subi r28, 0x73 ; 115 2b822: de 4f sbci r29, 0xFE ; 254 2b824: 99 83 std Y+1, r25 ; 0x01 2b826: 88 83 st Y, r24 2b828: cd 58 subi r28, 0x8D ; 141 2b82a: d1 40 sbci r29, 0x01 ; 1 2b82c: c1 57 subi r28, 0x71 ; 113 2b82e: de 4f sbci r29, 0xFE ; 254 2b830: 79 83 std Y+1, r23 ; 0x01 2b832: 68 83 st Y, r22 2b834: cf 58 subi r28, 0x8F ; 143 2b836: d1 40 sbci r29, 0x01 ; 1 2b838: ce 56 subi r28, 0x6E ; 110 2b83a: de 4f sbci r29, 0xFE ; 254 2b83c: 59 83 std Y+1, r21 ; 0x01 2b83e: 48 83 st Y, r20 2b840: c2 59 subi r28, 0x92 ; 146 2b842: d1 40 sbci r29, 0x01 ; 1 2b844: 84 e1 ldi r24, 0x14 ; 20 2b846: cf 56 subi r28, 0x6F ; 111 2b848: de 4f sbci r29, 0xFE ; 254 2b84a: 88 83 st Y, r24 2b84c: c1 59 subi r28, 0x91 ; 145 2b84e: d1 40 sbci r29, 0x01 ; 1 // DBG(_n(" [%f, %f][%f] circle\n"), x, y, r); /// read points on the circle for (uint8_t p = 0; p < num_points; ++p){ const float angle = p * pi_2_div_num_points; const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z; 2b850: ce 56 subi r28, 0x6E ; 110 2b852: de 4f sbci r29, 0xFE ; 254 2b854: a8 81 ld r26, Y 2b856: b9 81 ldd r27, Y+1 ; 0x01 2b858: c2 59 subi r28, 0x92 ; 146 2b85a: d1 40 sbci r29, 0x01 ; 1 2b85c: 8d 91 ld r24, X+ 2b85e: 9d 91 ld r25, X+ 2b860: 0d 90 ld r0, X+ 2b862: bc 91 ld r27, X 2b864: a0 2d mov r26, r0 2b866: c6 56 subi r28, 0x66 ; 102 2b868: de 4f sbci r29, 0xFE ; 254 2b86a: 88 83 st Y, r24 2b86c: 99 83 std Y+1, r25 ; 0x01 2b86e: aa 83 std Y+2, r26 ; 0x02 2b870: bb 83 std Y+3, r27 ; 0x03 2b872: ca 59 subi r28, 0x9A ; 154 2b874: d1 40 sbci r29, 0x01 ; 1 2b876: c1 57 subi r28, 0x71 ; 113 2b878: de 4f sbci r29, 0xFE ; 254 2b87a: a8 81 ld r26, Y 2b87c: b9 81 ldd r27, Y+1 ; 0x01 2b87e: cf 58 subi r28, 0x8F ; 143 2b880: d1 40 sbci r29, 0x01 ; 1 2b882: 8d 91 ld r24, X+ 2b884: 9d 91 ld r25, X+ 2b886: 0d 90 ld r0, X+ 2b888: bc 91 ld r27, X 2b88a: a0 2d mov r26, r0 2b88c: ca 54 subi r28, 0x4A ; 74 2b88e: de 4f sbci r29, 0xFE ; 254 2b890: 88 83 st Y, r24 2b892: 99 83 std Y+1, r25 ; 0x01 2b894: aa 83 std Y+2, r26 ; 0x02 2b896: bb 83 std Y+3, r27 ; 0x03 2b898: c6 5b subi r28, 0xB6 ; 182 2b89a: d1 40 sbci r29, 0x01 ; 1 2b89c: c3 57 subi r28, 0x73 ; 115 2b89e: de 4f sbci r29, 0xFE ; 254 2b8a0: a8 81 ld r26, Y 2b8a2: b9 81 ldd r27, Y+1 ; 0x01 2b8a4: cd 58 subi r28, 0x8D ; 141 2b8a6: d1 40 sbci r29, 0x01 ; 1 2b8a8: 8d 91 ld r24, X+ 2b8aa: 9d 91 ld r25, X+ 2b8ac: 0d 90 ld r0, X+ 2b8ae: bc 91 ld r27, X 2b8b0: a0 2d mov r26, r0 2b8b2: c6 54 subi r28, 0x46 ; 70 2b8b4: de 4f sbci r29, 0xFE ; 254 2b8b6: 88 83 st Y, r24 2b8b8: 99 83 std Y+1, r25 ; 0x01 2b8ba: aa 83 std Y+2, r26 ; 0x02 2b8bc: bb 83 std Y+3, r27 ; 0x03 2b8be: ca 5b subi r28, 0xBA ; 186 2b8c0: d1 40 sbci r29, 0x01 ; 1 2b8c2: fe 01 movw r30, r28 2b8c4: e7 5f subi r30, 0xF7 ; 247 2b8c6: fe 4f sbci r31, 0xFE ; 254 2b8c8: c8 55 subi r28, 0x58 ; 88 2b8ca: de 4f sbci r29, 0xFE ; 254 2b8cc: f9 83 std Y+1, r31 ; 0x01 2b8ce: e8 83 st Y, r30 2b8d0: c8 5a subi r28, 0xA8 ; 168 2b8d2: d1 40 sbci r29, 0x01 ; 1 2b8d4: ce 01 movw r24, r28 2b8d6: 8b 57 subi r24, 0x7B ; 123 2b8d8: 9f 4f sbci r25, 0xFF ; 255 2b8da: ca 55 subi r28, 0x5A ; 90 2b8dc: de 4f sbci r29, 0xFE ; 254 2b8de: 99 83 std Y+1, r25 ; 0x01 2b8e0: 88 83 st Y, r24 2b8e2: c6 5a subi r28, 0xA6 ; 166 2b8e4: d1 40 sbci r29, 0x01 ; 1 2b8e6: de 01 movw r26, r28 2b8e8: 11 96 adiw r26, 0x01 ; 1 2b8ea: c8 56 subi r28, 0x68 ; 104 2b8ec: de 4f sbci r29, 0xFE ; 254 2b8ee: b9 83 std Y+1, r27 ; 0x01 2b8f0: a8 83 st Y, r26 2b8f2: c8 59 subi r28, 0x98 ; 152 2b8f4: d1 40 sbci r29, 0x01 ; 1 2b8f6: 31 2c mov r3, r1 2b8f8: 21 2c mov r2, r1 //@size=128B // DBG(_n(" [%f, %f][%f] circle\n"), x, y, r); /// read points on the circle for (uint8_t p = 0; p < num_points; ++p){ const float angle = p * pi_2_div_num_points; 2b8fa: b1 01 movw r22, r2 2b8fc: 03 2c mov r0, r3 2b8fe: 00 0c add r0, r0 2b900: 88 0b sbc r24, r24 2b902: 99 0b sbc r25, r25 2b904: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2b908: 2a e1 ldi r18, 0x1A ; 26 2b90a: 38 ef ldi r19, 0xF8 ; 248 2b90c: 42 e4 ldi r20, 0x42 ; 66 2b90e: 5e e3 ldi r21, 0x3E ; 62 2b910: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2b914: 6b 01 movw r12, r22 2b916: 7c 01 movw r14, r24 const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z; 2b918: 0f 94 c8 a8 call 0x35190 ; 0x35190 2b91c: c2 56 subi r28, 0x62 ; 98 2b91e: de 4f sbci r29, 0xFE ; 254 2b920: 68 83 st Y, r22 2b922: 79 83 std Y+1, r23 ; 0x01 2b924: 8a 83 std Y+2, r24 ; 0x02 2b926: 9b 83 std Y+3, r25 ; 0x03 2b928: ce 59 subi r28, 0x9E ; 158 2b92a: d1 40 sbci r29, 0x01 ; 1 2b92c: c7 01 movw r24, r14 2b92e: b6 01 movw r22, r12 2b930: 0f 94 02 a6 call 0x34c04 ; 0x34c04 2b934: ce 55 subi r28, 0x5E ; 94 2b936: de 4f sbci r29, 0xFE ; 254 2b938: 68 83 st Y, r22 2b93a: 79 83 std Y+1, r23 ; 0x01 2b93c: 8a 83 std Y+2, r24 ; 0x02 2b93e: 9b 83 std Y+3, r25 ; 0x03 2b940: c2 5a subi r28, 0xA2 ; 162 2b942: d1 40 sbci r29, 0x01 ; 1 2b944: 9b 01 movw r18, r22 2b946: ac 01 movw r20, r24 2b948: c6 56 subi r28, 0x66 ; 102 2b94a: de 4f sbci r29, 0xFE ; 254 2b94c: 68 81 ld r22, Y 2b94e: 79 81 ldd r23, Y+1 ; 0x01 2b950: 8a 81 ldd r24, Y+2 ; 0x02 2b952: 9b 81 ldd r25, Y+3 ; 0x03 2b954: ca 59 subi r28, 0x9A ; 154 2b956: d1 40 sbci r29, 0x01 ; 1 2b958: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2b95c: c6 54 subi r28, 0x46 ; 70 2b95e: de 4f sbci r29, 0xFE ; 254 2b960: 28 81 ld r18, Y 2b962: 39 81 ldd r19, Y+1 ; 0x01 2b964: 4a 81 ldd r20, Y+2 ; 0x02 2b966: 5b 81 ldd r21, Y+3 ; 0x03 2b968: ca 5b subi r28, 0xBA ; 186 2b96a: d1 40 sbci r29, 0x01 ; 1 2b96c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2b970: 6b 01 movw r12, r22 2b972: 7c 01 movw r14, r24 } /// returns value of any location within data /// uses bilinear interpolation float get_value(uint8_t * matrix_32x32, float c, float r){ if (c <= 0 || r <= 0 || c >= 31 || r >= 31) 2b974: 20 e0 ldi r18, 0x00 ; 0 2b976: 30 e0 ldi r19, 0x00 ; 0 2b978: a9 01 movw r20, r18 2b97a: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2b97e: 18 16 cp r1, r24 2b980: 0c f0 brlt .+2 ; 0x2b984 2b982: 7a c2 rjmp .+1268 ; 0x2be78 // DBG(_n(" [%f, %f][%f] circle\n"), x, y, r); /// read points on the circle for (uint8_t p = 0; p < num_points; ++p){ const float angle = p * pi_2_div_num_points; const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z; 2b984: c2 56 subi r28, 0x62 ; 98 2b986: de 4f sbci r29, 0xFE ; 254 2b988: 28 81 ld r18, Y 2b98a: 39 81 ldd r19, Y+1 ; 0x01 2b98c: 4a 81 ldd r20, Y+2 ; 0x02 2b98e: 5b 81 ldd r21, Y+3 ; 0x03 2b990: ce 59 subi r28, 0x9E ; 158 2b992: d1 40 sbci r29, 0x01 ; 1 2b994: c6 56 subi r28, 0x66 ; 102 2b996: de 4f sbci r29, 0xFE ; 254 2b998: 68 81 ld r22, Y 2b99a: 79 81 ldd r23, Y+1 ; 0x01 2b99c: 8a 81 ldd r24, Y+2 ; 0x02 2b99e: 9b 81 ldd r25, Y+3 ; 0x03 2b9a0: ca 59 subi r28, 0x9A ; 154 2b9a2: d1 40 sbci r29, 0x01 ; 1 2b9a4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2b9a8: ca 54 subi r28, 0x4A ; 74 2b9aa: de 4f sbci r29, 0xFE ; 254 2b9ac: 28 81 ld r18, Y 2b9ae: 39 81 ldd r19, Y+1 ; 0x01 2b9b0: 4a 81 ldd r20, Y+2 ; 0x02 2b9b2: 5b 81 ldd r21, Y+3 ; 0x03 2b9b4: c6 5b subi r28, 0xB6 ; 182 2b9b6: d1 40 sbci r29, 0x01 ; 1 2b9b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2b9bc: 4b 01 movw r8, r22 2b9be: 5c 01 movw r10, r24 } /// returns value of any location within data /// uses bilinear interpolation float get_value(uint8_t * matrix_32x32, float c, float r){ if (c <= 0 || r <= 0 || c >= 31 || r >= 31) 2b9c0: 20 e0 ldi r18, 0x00 ; 0 2b9c2: 30 e0 ldi r19, 0x00 ; 0 2b9c4: a9 01 movw r20, r18 2b9c6: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2b9ca: 18 16 cp r1, r24 2b9cc: 0c f0 brlt .+2 ; 0x2b9d0 2b9ce: 54 c2 rjmp .+1192 ; 0x2be78 2b9d0: 20 e0 ldi r18, 0x00 ; 0 2b9d2: 30 e0 ldi r19, 0x00 ; 0 2b9d4: 48 ef ldi r20, 0xF8 ; 248 2b9d6: 51 e4 ldi r21, 0x41 ; 65 2b9d8: c7 01 movw r24, r14 2b9da: b6 01 movw r22, r12 2b9dc: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2b9e0: 87 ff sbrs r24, 7 2b9e2: 4a c2 rjmp .+1172 ; 0x2be78 2b9e4: 20 e0 ldi r18, 0x00 ; 0 2b9e6: 30 e0 ldi r19, 0x00 ; 0 2b9e8: 48 ef ldi r20, 0xF8 ; 248 2b9ea: 51 e4 ldi r21, 0x41 ; 65 2b9ec: c5 01 movw r24, r10 2b9ee: b4 01 movw r22, r8 2b9f0: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2b9f4: 87 ff sbrs r24, 7 2b9f6: 40 c2 rjmp .+1152 ; 0x2be78 return 0; /// calculate weights of nearby points const float wc1 = c - floor(c); 2b9f8: c7 01 movw r24, r14 2b9fa: b6 01 movw r22, r12 2b9fc: 0f 94 af a6 call 0x34d5e ; 0x34d5e 2ba00: 9b 01 movw r18, r22 2ba02: ac 01 movw r20, r24 2ba04: c7 01 movw r24, r14 2ba06: b6 01 movw r22, r12 2ba08: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2ba0c: 2b 01 movw r4, r22 2ba0e: 3c 01 movw r6, r24 const float wr1 = r - floor(r); 2ba10: c5 01 movw r24, r10 2ba12: b4 01 movw r22, r8 2ba14: 0f 94 af a6 call 0x34d5e ; 0x34d5e 2ba18: 9b 01 movw r18, r22 2ba1a: ac 01 movw r20, r24 2ba1c: c5 01 movw r24, r10 2ba1e: b4 01 movw r22, r8 2ba20: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2ba24: cc 56 subi r28, 0x6C ; 108 2ba26: de 4f sbci r29, 0xFE ; 254 2ba28: 68 83 st Y, r22 2ba2a: 79 83 std Y+1, r23 ; 0x01 2ba2c: 8a 83 std Y+2, r24 ; 0x02 2ba2e: 9b 83 std Y+3, r25 ; 0x03 2ba30: c4 59 subi r28, 0x94 ; 148 2ba32: d1 40 sbci r29, 0x01 ; 1 const float wc0 = 1 - wc1; 2ba34: a3 01 movw r20, r6 2ba36: 92 01 movw r18, r4 2ba38: 60 e0 ldi r22, 0x00 ; 0 2ba3a: 70 e0 ldi r23, 0x00 ; 0 2ba3c: 80 e8 ldi r24, 0x80 ; 128 2ba3e: 9f e3 ldi r25, 0x3F ; 63 2ba40: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2ba44: c2 55 subi r28, 0x52 ; 82 2ba46: de 4f sbci r29, 0xFE ; 254 2ba48: 68 83 st Y, r22 2ba4a: 79 83 std Y+1, r23 ; 0x01 2ba4c: 8a 83 std Y+2, r24 ; 0x02 2ba4e: 9b 83 std Y+3, r25 ; 0x03 2ba50: ce 5a subi r28, 0xAE ; 174 2ba52: d1 40 sbci r29, 0x01 ; 1 const float wr0 = 1 - wr1; 2ba54: cc 56 subi r28, 0x6C ; 108 2ba56: de 4f sbci r29, 0xFE ; 254 2ba58: 28 81 ld r18, Y 2ba5a: 39 81 ldd r19, Y+1 ; 0x01 2ba5c: 4a 81 ldd r20, Y+2 ; 0x02 2ba5e: 5b 81 ldd r21, Y+3 ; 0x03 2ba60: c4 59 subi r28, 0x94 ; 148 2ba62: d1 40 sbci r29, 0x01 ; 1 2ba64: 60 e0 ldi r22, 0x00 ; 0 2ba66: 70 e0 ldi r23, 0x00 ; 0 2ba68: 80 e8 ldi r24, 0x80 ; 128 2ba6a: 9f e3 ldi r25, 0x3F ; 63 2ba6c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2ba70: ce 54 subi r28, 0x4E ; 78 2ba72: de 4f sbci r29, 0xFE ; 254 2ba74: 68 83 st Y, r22 2ba76: 79 83 std Y+1, r23 ; 0x01 2ba78: 8a 83 std Y+2, r24 ; 0x02 2ba7a: 9b 83 std Y+3, r25 ; 0x03 2ba7c: c2 5b subi r28, 0xB2 ; 178 2ba7e: d1 40 sbci r29, 0x01 ; 1 const float w00 = wc0 * wr0; const float w01 = wc0 * wr1; const float w10 = wc1 * wr0; const float w11 = wc1 * wr1; const uint16_t c0 = c; 2ba80: c7 01 movw r24, r14 2ba82: b6 01 movw r22, r12 2ba84: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 2ba88: 6b 01 movw r12, r22 const uint16_t c1 = c0 + 1; 2ba8a: fb 01 movw r30, r22 2ba8c: 31 96 adiw r30, 0x01 ; 1 2ba8e: c6 55 subi r28, 0x56 ; 86 2ba90: de 4f sbci r29, 0xFE ; 254 2ba92: f9 83 std Y+1, r31 ; 0x01 2ba94: e8 83 st Y, r30 2ba96: ca 5a subi r28, 0xAA ; 170 2ba98: d1 40 sbci r29, 0x01 ; 1 const uint16_t r0 = r; 2ba9a: c5 01 movw r24, r10 2ba9c: b4 01 movw r22, r8 2ba9e: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> const uint16_t r1 = r0 + 1; const uint16_t idx00 = c0 + 32 * r0; 2baa2: 8b 01 movw r16, r22 2baa4: 95 e0 ldi r25, 0x05 ; 5 2baa6: 00 0f add r16, r16 2baa8: 11 1f adc r17, r17 2baaa: 9a 95 dec r25 2baac: e1 f7 brne .-8 ; 0x2baa6 const uint16_t idx01 = c0 + 32 * r1; 2baae: c8 01 movw r24, r16 2bab0: 80 96 adiw r24, 0x20 ; 32 2bab2: c4 55 subi r28, 0x54 ; 84 2bab4: de 4f sbci r29, 0xFE ; 254 2bab6: 99 83 std Y+1, r25 ; 0x01 2bab8: 88 83 st Y, r24 2baba: cc 5a subi r28, 0xAC ; 172 2babc: d1 40 sbci r29, 0x01 ; 1 const uint16_t idx10 = c1 + 32 * r0; const uint16_t idx11 = c1 + 32 * r1; /// bilinear resampling return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11]; 2babe: f8 01 movw r30, r16 2bac0: ec 0d add r30, r12 2bac2: fd 1d adc r31, r13 2bac4: e2 5a subi r30, 0xA2 ; 162 2bac6: f9 4f sbci r31, 0xF9 ; 249 2bac8: 60 81 ld r22, Z 2baca: 70 e0 ldi r23, 0x00 ; 0 2bacc: 90 e0 ldi r25, 0x00 ; 0 2bace: 80 e0 ldi r24, 0x00 ; 0 2bad0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2bad4: 4b 01 movw r8, r22 2bad6: 5c 01 movw r10, r24 const float wc1 = c - floor(c); const float wr1 = r - floor(r); const float wc0 = 1 - wc1; const float wr0 = 1 - wr1; const float w00 = wc0 * wr0; 2bad8: ce 54 subi r28, 0x4E ; 78 2bada: de 4f sbci r29, 0xFE ; 254 2badc: 28 81 ld r18, Y 2bade: 39 81 ldd r19, Y+1 ; 0x01 2bae0: 4a 81 ldd r20, Y+2 ; 0x02 2bae2: 5b 81 ldd r21, Y+3 ; 0x03 2bae4: c2 5b subi r28, 0xB2 ; 178 2bae6: d1 40 sbci r29, 0x01 ; 1 2bae8: c2 55 subi r28, 0x52 ; 82 2baea: de 4f sbci r29, 0xFE ; 254 2baec: 68 81 ld r22, Y 2baee: 79 81 ldd r23, Y+1 ; 0x01 2baf0: 8a 81 ldd r24, Y+2 ; 0x02 2baf2: 9b 81 ldd r25, Y+3 ; 0x03 2baf4: ce 5a subi r28, 0xAE ; 174 2baf6: d1 40 sbci r29, 0x01 ; 1 2baf8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bafc: 9b 01 movw r18, r22 2bafe: ac 01 movw r20, r24 const uint16_t idx01 = c0 + 32 * r1; const uint16_t idx10 = c1 + 32 * r0; const uint16_t idx11 = c1 + 32 * r1; /// bilinear resampling return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11]; 2bb00: c5 01 movw r24, r10 2bb02: b4 01 movw r22, r8 2bb04: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bb08: 4b 01 movw r8, r22 2bb0a: 5c 01 movw r10, r24 2bb0c: c4 55 subi r28, 0x54 ; 84 2bb0e: de 4f sbci r29, 0xFE ; 254 2bb10: e8 81 ld r30, Y 2bb12: f9 81 ldd r31, Y+1 ; 0x01 2bb14: cc 5a subi r28, 0xAC ; 172 2bb16: d1 40 sbci r29, 0x01 ; 1 2bb18: ec 0d add r30, r12 2bb1a: fd 1d adc r31, r13 2bb1c: e2 5a subi r30, 0xA2 ; 162 2bb1e: f9 4f sbci r31, 0xF9 ; 249 2bb20: 60 81 ld r22, Z 2bb22: 70 e0 ldi r23, 0x00 ; 0 2bb24: 90 e0 ldi r25, 0x00 ; 0 2bb26: 80 e0 ldi r24, 0x00 ; 0 2bb28: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2bb2c: 6b 01 movw r12, r22 2bb2e: 7c 01 movw r14, r24 const float wr1 = r - floor(r); const float wc0 = 1 - wc1; const float wr0 = 1 - wr1; const float w00 = wc0 * wr0; const float w01 = wc0 * wr1; 2bb30: c2 55 subi r28, 0x52 ; 82 2bb32: de 4f sbci r29, 0xFE ; 254 2bb34: 28 81 ld r18, Y 2bb36: 39 81 ldd r19, Y+1 ; 0x01 2bb38: 4a 81 ldd r20, Y+2 ; 0x02 2bb3a: 5b 81 ldd r21, Y+3 ; 0x03 2bb3c: ce 5a subi r28, 0xAE ; 174 2bb3e: d1 40 sbci r29, 0x01 ; 1 2bb40: cc 56 subi r28, 0x6C ; 108 2bb42: de 4f sbci r29, 0xFE ; 254 2bb44: 68 81 ld r22, Y 2bb46: 79 81 ldd r23, Y+1 ; 0x01 2bb48: 8a 81 ldd r24, Y+2 ; 0x02 2bb4a: 9b 81 ldd r25, Y+3 ; 0x03 2bb4c: c4 59 subi r28, 0x94 ; 148 2bb4e: d1 40 sbci r29, 0x01 ; 1 2bb50: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bb54: 9b 01 movw r18, r22 2bb56: ac 01 movw r20, r24 const uint16_t idx01 = c0 + 32 * r1; const uint16_t idx10 = c1 + 32 * r0; const uint16_t idx11 = c1 + 32 * r1; /// bilinear resampling return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11]; 2bb58: c7 01 movw r24, r14 2bb5a: b6 01 movw r22, r12 2bb5c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bb60: 9b 01 movw r18, r22 2bb62: ac 01 movw r20, r24 2bb64: c5 01 movw r24, r10 2bb66: b4 01 movw r22, r8 2bb68: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2bb6c: 6b 01 movw r12, r22 2bb6e: 7c 01 movw r14, r24 2bb70: c6 55 subi r28, 0x56 ; 86 2bb72: de 4f sbci r29, 0xFE ; 254 2bb74: a8 81 ld r26, Y 2bb76: b9 81 ldd r27, Y+1 ; 0x01 2bb78: ca 5a subi r28, 0xAA ; 170 2bb7a: d1 40 sbci r29, 0x01 ; 1 2bb7c: 0a 0f add r16, r26 2bb7e: 1b 1f adc r17, r27 2bb80: f8 01 movw r30, r16 2bb82: e2 5a subi r30, 0xA2 ; 162 2bb84: f9 4f sbci r31, 0xF9 ; 249 2bb86: 60 81 ld r22, Z 2bb88: 70 e0 ldi r23, 0x00 ; 0 2bb8a: 90 e0 ldi r25, 0x00 ; 0 2bb8c: 80 e0 ldi r24, 0x00 ; 0 2bb8e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2bb92: 4b 01 movw r8, r22 2bb94: 5c 01 movw r10, r24 const float wc0 = 1 - wc1; const float wr0 = 1 - wr1; const float w00 = wc0 * wr0; const float w01 = wc0 * wr1; const float w10 = wc1 * wr0; 2bb96: ce 54 subi r28, 0x4E ; 78 2bb98: de 4f sbci r29, 0xFE ; 254 2bb9a: 28 81 ld r18, Y 2bb9c: 39 81 ldd r19, Y+1 ; 0x01 2bb9e: 4a 81 ldd r20, Y+2 ; 0x02 2bba0: 5b 81 ldd r21, Y+3 ; 0x03 2bba2: c2 5b subi r28, 0xB2 ; 178 2bba4: d1 40 sbci r29, 0x01 ; 1 2bba6: c3 01 movw r24, r6 2bba8: b2 01 movw r22, r4 2bbaa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bbae: 9b 01 movw r18, r22 2bbb0: ac 01 movw r20, r24 const uint16_t idx01 = c0 + 32 * r1; const uint16_t idx10 = c1 + 32 * r0; const uint16_t idx11 = c1 + 32 * r1; /// bilinear resampling return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11]; 2bbb2: c5 01 movw r24, r10 2bbb4: b4 01 movw r22, r8 2bbb6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bbba: 9b 01 movw r18, r22 2bbbc: ac 01 movw r20, r24 2bbbe: c7 01 movw r24, r14 2bbc0: b6 01 movw r22, r12 2bbc2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2bbc6: 6b 01 movw r12, r22 2bbc8: 7c 01 movw r14, r24 2bbca: c6 55 subi r28, 0x56 ; 86 2bbcc: de 4f sbci r29, 0xFE ; 254 2bbce: e8 81 ld r30, Y 2bbd0: f9 81 ldd r31, Y+1 ; 0x01 2bbd2: ca 5a subi r28, 0xAA ; 170 2bbd4: d1 40 sbci r29, 0x01 ; 1 2bbd6: c4 55 subi r28, 0x54 ; 84 2bbd8: de 4f sbci r29, 0xFE ; 254 2bbda: 88 81 ld r24, Y 2bbdc: 99 81 ldd r25, Y+1 ; 0x01 2bbde: cc 5a subi r28, 0xAC ; 172 2bbe0: d1 40 sbci r29, 0x01 ; 1 2bbe2: e8 0f add r30, r24 2bbe4: f9 1f adc r31, r25 2bbe6: e2 5a subi r30, 0xA2 ; 162 2bbe8: f9 4f sbci r31, 0xF9 ; 249 2bbea: 60 81 ld r22, Z 2bbec: 70 e0 ldi r23, 0x00 ; 0 2bbee: 90 e0 ldi r25, 0x00 ; 0 2bbf0: 80 e0 ldi r24, 0x00 ; 0 2bbf2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2bbf6: 4b 01 movw r8, r22 2bbf8: 5c 01 movw r10, r24 const float wr0 = 1 - wr1; const float w00 = wc0 * wr0; const float w01 = wc0 * wr1; const float w10 = wc1 * wr0; const float w11 = wc1 * wr1; 2bbfa: cc 56 subi r28, 0x6C ; 108 2bbfc: de 4f sbci r29, 0xFE ; 254 2bbfe: 28 81 ld r18, Y 2bc00: 39 81 ldd r19, Y+1 ; 0x01 2bc02: 4a 81 ldd r20, Y+2 ; 0x02 2bc04: 5b 81 ldd r21, Y+3 ; 0x03 2bc06: c4 59 subi r28, 0x94 ; 148 2bc08: d1 40 sbci r29, 0x01 ; 1 2bc0a: c3 01 movw r24, r6 2bc0c: b2 01 movw r22, r4 2bc0e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bc12: 9b 01 movw r18, r22 2bc14: ac 01 movw r20, r24 const uint16_t idx01 = c0 + 32 * r1; const uint16_t idx10 = c1 + 32 * r0; const uint16_t idx11 = c1 + 32 * r1; /// bilinear resampling return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11]; 2bc16: c5 01 movw r24, r10 2bc18: b4 01 movw r22, r8 2bc1a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bc1e: 9b 01 movw r18, r22 2bc20: ac 01 movw r20, r24 2bc22: c7 01 movw r24, r14 2bc24: b6 01 movw r22, r12 2bc26: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> // DBG(_n(" [%f, %f][%f] circle\n"), x, y, r); /// read points on the circle for (uint8_t p = 0; p < num_points; ++p){ const float angle = p * pi_2_div_num_points; const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z; 2bc2a: 20 e0 ldi r18, 0x00 ; 0 2bc2c: 30 e0 ldi r19, 0x00 ; 0 2bc2e: 40 e0 ldi r20, 0x00 ; 0 2bc30: 52 e4 ldi r21, 0x42 ; 66 2bc32: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2bc36: 6b 01 movw r12, r22 2bc38: 7c 01 movw r14, r24 // DBG(_n("%f "), point); shifts_x[p] = cos(angle) * height; 2bc3a: ac 01 movw r20, r24 2bc3c: 9b 01 movw r18, r22 2bc3e: ce 55 subi r28, 0x5E ; 94 2bc40: de 4f sbci r29, 0xFE ; 254 2bc42: 68 81 ld r22, Y 2bc44: 79 81 ldd r23, Y+1 ; 0x01 2bc46: 8a 81 ldd r24, Y+2 ; 0x02 2bc48: 9b 81 ldd r25, Y+3 ; 0x03 2bc4a: c2 5a subi r28, 0xA2 ; 162 2bc4c: d1 40 sbci r29, 0x01 ; 1 2bc4e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bc52: c8 55 subi r28, 0x58 ; 88 2bc54: de 4f sbci r29, 0xFE ; 254 2bc56: a8 81 ld r26, Y 2bc58: b9 81 ldd r27, Y+1 ; 0x01 2bc5a: c8 5a subi r28, 0xA8 ; 168 2bc5c: d1 40 sbci r29, 0x01 ; 1 2bc5e: 6d 93 st X+, r22 2bc60: 7d 93 st X+, r23 2bc62: 8d 93 st X+, r24 2bc64: 9d 93 st X+, r25 2bc66: c8 55 subi r28, 0x58 ; 88 2bc68: de 4f sbci r29, 0xFE ; 254 2bc6a: b9 83 std Y+1, r27 ; 0x01 2bc6c: a8 83 st Y, r26 2bc6e: c8 5a subi r28, 0xA8 ; 168 2bc70: d1 40 sbci r29, 0x01 ; 1 shifts_y[p] = sin(angle) * height; 2bc72: a7 01 movw r20, r14 2bc74: 96 01 movw r18, r12 2bc76: c2 56 subi r28, 0x62 ; 98 2bc78: de 4f sbci r29, 0xFE ; 254 2bc7a: 68 81 ld r22, Y 2bc7c: 79 81 ldd r23, Y+1 ; 0x01 2bc7e: 8a 81 ldd r24, Y+2 ; 0x02 2bc80: 9b 81 ldd r25, Y+3 ; 0x03 2bc82: ce 59 subi r28, 0x9E ; 158 2bc84: d1 40 sbci r29, 0x01 ; 1 2bc86: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2bc8a: ca 55 subi r28, 0x5A ; 90 2bc8c: de 4f sbci r29, 0xFE ; 254 2bc8e: e8 81 ld r30, Y 2bc90: f9 81 ldd r31, Y+1 ; 0x01 2bc92: c6 5a subi r28, 0xA6 ; 166 2bc94: d1 40 sbci r29, 0x01 ; 1 2bc96: 61 93 st Z+, r22 2bc98: 71 93 st Z+, r23 2bc9a: 81 93 st Z+, r24 2bc9c: 91 93 st Z+, r25 2bc9e: ca 55 subi r28, 0x5A ; 90 2bca0: de 4f sbci r29, 0xFE ; 254 2bca2: f9 83 std Y+1, r31 ; 0x01 2bca4: e8 83 st Y, r30 2bca6: c6 5a subi r28, 0xA6 ; 166 2bca8: d1 40 sbci r29, 0x01 ; 1 shifts_r[p] = height; 2bcaa: c8 56 subi r28, 0x68 ; 104 2bcac: de 4f sbci r29, 0xFE ; 254 2bcae: a8 81 ld r26, Y 2bcb0: b9 81 ldd r27, Y+1 ; 0x01 2bcb2: c8 59 subi r28, 0x98 ; 152 2bcb4: d1 40 sbci r29, 0x01 ; 1 2bcb6: cd 92 st X+, r12 2bcb8: dd 92 st X+, r13 2bcba: ed 92 st X+, r14 2bcbc: fd 92 st X+, r15 2bcbe: c8 56 subi r28, 0x68 ; 104 2bcc0: de 4f sbci r29, 0xFE ; 254 2bcc2: b9 83 std Y+1, r27 ; 0x01 2bcc4: a8 83 st Y, r26 2bcc6: c8 59 subi r28, 0x98 ; 152 2bcc8: d1 40 sbci r29, 0x01 ; 1 2bcca: bf ef ldi r27, 0xFF ; 255 2bccc: 2b 1a sub r2, r27 2bcce: 3b 0a sbc r3, r27 //@size=128B // DBG(_n(" [%f, %f][%f] circle\n"), x, y, r); /// read points on the circle for (uint8_t p = 0; p < num_points; ++p){ 2bcd0: e1 e2 ldi r30, 0x21 ; 33 2bcd2: 2e 16 cp r2, r30 2bcd4: 31 04 cpc r3, r1 2bcd6: 09 f0 breq .+2 ; 0x2bcda 2bcd8: 10 ce rjmp .-992 ; 0x2b8fa const float norm = 1.f / reducer; // x += CLAMP(median(shifts_x, blocks) * norm, -max_change, max_change); // y += CLAMP(median(shifts_y, blocks) * norm, -max_change, max_change); // r += CLAMP(median(shifts_r, blocks) * norm * .5f, -max_change, max_change); //104B down x += CLAMP_median(shifts_x, blocks, norm); 2bcda: 40 e0 ldi r20, 0x00 ; 0 2bcdc: 50 e0 ldi r21, 0x00 ; 0 2bcde: 60 e0 ldi r22, 0x00 ; 0 2bce0: 7d e3 ldi r23, 0x3D ; 61 2bce2: ce 01 movw r24, r28 2bce4: 87 5f subi r24, 0xF7 ; 247 2bce6: 9e 4f sbci r25, 0xFE ; 254 2bce8: 0f 94 b3 55 call 0x2ab66 ; 0x2ab66 2bcec: 9b 01 movw r18, r22 2bcee: ac 01 movw r20, r24 2bcf0: c3 57 subi r28, 0x73 ; 115 2bcf2: de 4f sbci r29, 0xFE ; 254 2bcf4: a8 81 ld r26, Y 2bcf6: b9 81 ldd r27, Y+1 ; 0x01 2bcf8: cd 58 subi r28, 0x8D ; 141 2bcfa: d1 40 sbci r29, 0x01 ; 1 2bcfc: 6d 91 ld r22, X+ 2bcfe: 7d 91 ld r23, X+ 2bd00: 8d 91 ld r24, X+ 2bd02: 9c 91 ld r25, X 2bd04: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2bd08: c3 57 subi r28, 0x73 ; 115 2bd0a: de 4f sbci r29, 0xFE ; 254 2bd0c: e8 81 ld r30, Y 2bd0e: f9 81 ldd r31, Y+1 ; 0x01 2bd10: cd 58 subi r28, 0x8D ; 141 2bd12: d1 40 sbci r29, 0x01 ; 1 2bd14: 60 83 st Z, r22 2bd16: 71 83 std Z+1, r23 ; 0x01 2bd18: 82 83 std Z+2, r24 ; 0x02 2bd1a: 93 83 std Z+3, r25 ; 0x03 y += CLAMP_median(shifts_y, blocks, norm); 2bd1c: 40 e0 ldi r20, 0x00 ; 0 2bd1e: 50 e0 ldi r21, 0x00 ; 0 2bd20: 60 e0 ldi r22, 0x00 ; 0 2bd22: 7d e3 ldi r23, 0x3D ; 61 2bd24: ce 01 movw r24, r28 2bd26: 8b 57 subi r24, 0x7B ; 123 2bd28: 9f 4f sbci r25, 0xFF ; 255 2bd2a: 0f 94 b3 55 call 0x2ab66 ; 0x2ab66 2bd2e: 9b 01 movw r18, r22 2bd30: ac 01 movw r20, r24 2bd32: c1 57 subi r28, 0x71 ; 113 2bd34: de 4f sbci r29, 0xFE ; 254 2bd36: a8 81 ld r26, Y 2bd38: b9 81 ldd r27, Y+1 ; 0x01 2bd3a: cf 58 subi r28, 0x8F ; 143 2bd3c: d1 40 sbci r29, 0x01 ; 1 2bd3e: 6d 91 ld r22, X+ 2bd40: 7d 91 ld r23, X+ 2bd42: 8d 91 ld r24, X+ 2bd44: 9c 91 ld r25, X 2bd46: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2bd4a: c1 57 subi r28, 0x71 ; 113 2bd4c: de 4f sbci r29, 0xFE ; 254 2bd4e: e8 81 ld r30, Y 2bd50: f9 81 ldd r31, Y+1 ; 0x01 2bd52: cf 58 subi r28, 0x8F ; 143 2bd54: d1 40 sbci r29, 0x01 ; 1 2bd56: 60 83 st Z, r22 2bd58: 71 83 std Z+1, r23 ; 0x01 2bd5a: 82 83 std Z+2, r24 ; 0x02 2bd5c: 93 83 std Z+3, r25 ; 0x03 r += CLAMP_median(shifts_r, blocks, norm * .5f); 2bd5e: 40 e0 ldi r20, 0x00 ; 0 2bd60: 50 e0 ldi r21, 0x00 ; 0 2bd62: 60 e8 ldi r22, 0x80 ; 128 2bd64: 7c e3 ldi r23, 0x3C ; 60 2bd66: ce 01 movw r24, r28 2bd68: 01 96 adiw r24, 0x01 ; 1 2bd6a: 0f 94 b3 55 call 0x2ab66 ; 0x2ab66 2bd6e: ce 56 subi r28, 0x6E ; 110 2bd70: de 4f sbci r29, 0xFE ; 254 2bd72: a8 81 ld r26, Y 2bd74: b9 81 ldd r27, Y+1 ; 0x01 2bd76: c2 59 subi r28, 0x92 ; 146 2bd78: d1 40 sbci r29, 0x01 ; 1 2bd7a: 2d 91 ld r18, X+ 2bd7c: 3d 91 ld r19, X+ 2bd7e: 4d 91 ld r20, X+ 2bd80: 5c 91 ld r21, X 2bd82: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2bd86: 16 2f mov r17, r22 2bd88: 07 2f mov r16, r23 2bd8a: f8 2e mov r15, r24 2bd8c: e9 2e mov r14, r25 r = MAX(2, r); 2bd8e: 20 e0 ldi r18, 0x00 ; 0 2bd90: 30 e0 ldi r19, 0x00 ; 0 2bd92: 40 e0 ldi r20, 0x00 ; 0 2bd94: 50 e4 ldi r21, 0x40 ; 64 2bd96: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2bd9a: 18 16 cp r1, r24 2bd9c: 2c f0 brlt .+10 ; 0x2bda8 2bd9e: 10 e0 ldi r17, 0x00 ; 0 2bda0: 00 e0 ldi r16, 0x00 ; 0 2bda2: f1 2c mov r15, r1 2bda4: 80 e4 ldi r24, 0x40 ; 64 2bda6: e8 2e mov r14, r24 2bda8: a8 01 movw r20, r16 2bdaa: 97 01 movw r18, r14 2bdac: 85 2f mov r24, r21 2bdae: 90 2f mov r25, r16 2bdb0: a3 2f mov r26, r19 2bdb2: be 2d mov r27, r14 2bdb4: ce 56 subi r28, 0x6E ; 110 2bdb6: de 4f sbci r29, 0xFE ; 254 2bdb8: e8 81 ld r30, Y 2bdba: f9 81 ldd r31, Y+1 ; 0x01 2bdbc: c2 59 subi r28, 0x92 ; 146 2bdbe: d1 40 sbci r29, 0x01 ; 1 2bdc0: 80 83 st Z, r24 2bdc2: 91 83 std Z+1, r25 ; 0x01 2bdc4: a2 83 std Z+2, r26 ; 0x02 2bdc6: b3 83 std Z+3, r27 ; 0x03 2bdc8: cf 56 subi r28, 0x6F ; 111 2bdca: de 4f sbci r29, 0xFE ; 254 2bdcc: f8 81 ld r31, Y 2bdce: c1 59 subi r28, 0x91 ; 145 2bdd0: d1 40 sbci r29, 0x01 ; 1 2bdd2: f1 50 subi r31, 0x01 ; 1 2bdd4: cf 56 subi r28, 0x6F ; 111 2bdd6: de 4f sbci r29, 0xFE ; 254 2bdd8: f8 83 st Y, r31 2bdda: c1 59 subi r28, 0x91 ; 145 2bddc: d1 40 sbci r29, 0x01 ; 1 float shifts_y[blocks]; float shifts_r[blocks]; // DBG(_n(" [%f, %f][%f] start circle\n"), x, y, r); for (int8_t i = iterations; i > 0; --i){ 2bdde: f1 11 cpse r31, r1 2bde0: 37 cd rjmp .-1426 ; 0x2b850 r = MAX(2, r); } //@size=118 DBG(_n(" [%f, %f][%f] final circle\n"), x, y, r); 2bde2: ef 92 push r14 2bde4: ff 92 push r15 2bde6: 0f 93 push r16 2bde8: 1f 93 push r17 2bdea: c1 57 subi r28, 0x71 ; 113 2bdec: de 4f sbci r29, 0xFE ; 254 2bdee: a8 81 ld r26, Y 2bdf0: b9 81 ldd r27, Y+1 ; 0x01 2bdf2: cf 58 subi r28, 0x8F ; 143 2bdf4: d1 40 sbci r29, 0x01 ; 1 2bdf6: 13 96 adiw r26, 0x03 ; 3 2bdf8: 8c 91 ld r24, X 2bdfa: 13 97 sbiw r26, 0x03 ; 3 2bdfc: 8f 93 push r24 2bdfe: 12 96 adiw r26, 0x02 ; 2 2be00: 8c 91 ld r24, X 2be02: 12 97 sbiw r26, 0x02 ; 2 2be04: 8f 93 push r24 2be06: 11 96 adiw r26, 0x01 ; 1 2be08: 8c 91 ld r24, X 2be0a: 11 97 sbiw r26, 0x01 ; 1 2be0c: 8f 93 push r24 2be0e: 8c 91 ld r24, X 2be10: 8f 93 push r24 2be12: c3 57 subi r28, 0x73 ; 115 2be14: de 4f sbci r29, 0xFE ; 254 2be16: e8 81 ld r30, Y 2be18: f9 81 ldd r31, Y+1 ; 0x01 2be1a: cd 58 subi r28, 0x8D ; 141 2be1c: d1 40 sbci r29, 0x01 ; 1 2be1e: 83 81 ldd r24, Z+3 ; 0x03 2be20: 8f 93 push r24 2be22: 82 81 ldd r24, Z+2 ; 0x02 2be24: 8f 93 push r24 2be26: 81 81 ldd r24, Z+1 ; 0x01 2be28: 8f 93 push r24 2be2a: 80 81 ld r24, Z 2be2c: 8f 93 push r24 2be2e: 85 ee ldi r24, 0xE5 ; 229 2be30: 9c e9 ldi r25, 0x9C ; 156 2be32: 9f 93 push r25 2be34: 8f 93 push r24 2be36: 0f 94 a2 a2 call 0x34544 ; 0x34544 2be3a: 0f b6 in r0, 0x3f ; 63 2be3c: f8 94 cli 2be3e: de bf out 0x3e, r29 ; 62 2be40: 0f be out 0x3f, r0 ; 63 2be42: cd bf out 0x3d, r28 ; 61 } 2be44: c3 54 subi r28, 0x43 ; 67 2be46: de 4f sbci r29, 0xFE ; 254 2be48: 0f b6 in r0, 0x3f ; 63 2be4a: f8 94 cli 2be4c: de bf out 0x3e, r29 ; 62 2be4e: 0f be out 0x3f, r0 ; 63 2be50: cd bf out 0x3d, r28 ; 61 2be52: df 91 pop r29 2be54: cf 91 pop r28 2be56: 1f 91 pop r17 2be58: 0f 91 pop r16 2be5a: ff 90 pop r15 2be5c: ef 90 pop r14 2be5e: df 90 pop r13 2be60: cf 90 pop r12 2be62: bf 90 pop r11 2be64: af 90 pop r10 2be66: 9f 90 pop r9 2be68: 8f 90 pop r8 2be6a: 7f 90 pop r7 2be6c: 6f 90 pop r6 2be6e: 5f 90 pop r5 2be70: 4f 90 pop r4 2be72: 3f 90 pop r3 2be74: 2f 90 pop r2 2be76: 08 95 ret /// returns value of any location within data /// uses bilinear interpolation float get_value(uint8_t * matrix_32x32, float c, float r){ if (c <= 0 || r <= 0 || c >= 31 || r >= 31) return 0; 2be78: 60 e0 ldi r22, 0x00 ; 0 2be7a: 70 e0 ldi r23, 0x00 ; 0 2be7c: cb 01 movw r24, r22 2be7e: d5 ce rjmp .-598 ; 0x2bc2a 0002be80 : accelerate_1_step(axes, -dec, delay_us, delay_us); update_position_1_step(axes, dir); } } void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){ 2be80: ef 92 push r14 2be82: ff 92 push r15 2be84: 0f 93 push r16 2be86: 1f 93 push r17 2be88: cf 93 push r28 2be8a: df 93 push r29 2be8c: 1f 92 push r1 2be8e: 1f 92 push r1 2be90: cd b7 in r28, 0x3d ; 61 2be92: de b7 in r29, 0x3e ; 62 2be94: f8 2e mov r15, r24 2be96: e6 2e mov r14, r22 if (steps == 0) return; uint16_t current_delay_us = MAX_DELAY; 2be98: 80 e1 ldi r24, 0x10 ; 16 2be9a: 97 e2 ldi r25, 0x27 ; 39 2be9c: 9a 83 std Y+2, r25 ; 0x02 2be9e: 89 83 std Y+1, r24 ; 0x01 const uint16_t half = steps / 2; 2bea0: 8a 01 movw r16, r20 2bea2: 16 95 lsr r17 2bea4: 07 95 ror r16 } /// Goes defined number of steps while accelerating /// updates global positions void accelerate(uint8_t axes, uint8_t dir, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us, uint16_t steps){ set_axes_dir(axes, dir); 2bea6: 8f 2d mov r24, r15 2bea8: 0e 94 76 d5 call 0x1aaec ; 0x1aaec while (steps--){ 2beac: 01 50 subi r16, 0x01 ; 1 2beae: 11 09 sbc r17, r1 2beb0: 78 f0 brcs .+30 ; 0x2bed0 accelerate_1_step(axes, acc, delay_us, min_delay_us); 2beb2: 28 ec ldi r18, 0xC8 ; 200 2beb4: 30 e0 ldi r19, 0x00 ; 0 2beb6: ae 01 movw r20, r28 2beb8: 4f 5f subi r20, 0xFF ; 255 2beba: 5f 4f sbci r21, 0xFF ; 255 2bebc: 68 ee ldi r22, 0xE8 ; 232 2bebe: 73 e0 ldi r23, 0x03 ; 3 2bec0: 8f 2d mov r24, r15 2bec2: 0e 94 45 d4 call 0x1a88a ; 0x1a88a update_position_1_step(axes, dir); 2bec6: 6e 2d mov r22, r14 2bec8: 8f 2d mov r24, r15 2beca: 0e 94 8f d5 call 0x1ab1e ; 0x1ab1e 2bece: ee cf rjmp .-36 ; 0x2beac } /// \param dir sets direction of movement /// updates global positions void go_and_stop(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us, uint16_t steps){ set_axes_dir(axes, dir); 2bed0: 6e 2d mov r22, r14 2bed2: 8f 2d mov r24, r15 2bed4: 0e 94 76 d5 call 0x1aaec ; 0x1aaec return; uint16_t current_delay_us = MAX_DELAY; const uint16_t half = steps / 2; accelerate(axes, dir, acc, current_delay_us, min_delay_us, half); go_and_stop(axes, dir, -acc, current_delay_us, steps - half); } 2bed8: 0f 90 pop r0 2beda: 0f 90 pop r0 2bedc: df 91 pop r29 2bede: cf 91 pop r28 2bee0: 1f 91 pop r17 2bee2: 0f 91 pop r16 2bee4: ff 90 pop r15 2bee6: ef 90 pop r14 2bee8: 08 95 ret 0002beea : /// Moves printer to absolute position [x,y,z] defined in millimeters bool xyzcal_lineXYZ_to_float(pos_mm_t x, pos_mm_t y, pos_mm_t z, uint16_t delay_us, int8_t check_pinda){ return xyzcal_lineXYZ_to(mm_2_pos(x), mm_2_pos(y), mm_2_pos(z), delay_us, check_pinda); } bool xyzcal_spiral2(int16_t cx, int16_t cy, int16_t z0, int16_t dz, int16_t radius, int16_t rotation, uint16_t delay_us, int8_t check_pinda, uint16_t* pad) 2beea: 2f 92 push r2 2beec: 3f 92 push r3 2beee: 4f 92 push r4 2bef0: 5f 92 push r5 2bef2: 6f 92 push r6 2bef4: 7f 92 push r7 2bef6: 8f 92 push r8 2bef8: 9f 92 push r9 2befa: af 92 push r10 2befc: bf 92 push r11 2befe: cf 92 push r12 2bf00: df 92 push r13 2bf02: ef 92 push r14 2bf04: ff 92 push r15 2bf06: 0f 93 push r16 2bf08: 1f 93 push r17 2bf0a: cf 93 push r28 2bf0c: df 93 push r29 2bf0e: cd b7 in r28, 0x3d ; 61 2bf10: de b7 in r29, 0x3e ; 62 2bf12: 6c 97 sbiw r28, 0x1c ; 28 2bf14: 0f b6 in r0, 0x3f ; 63 2bf16: f8 94 cli 2bf18: de bf out 0x3e, r29 ; 62 2bf1a: 0f be out 0x3f, r0 ; 63 2bf1c: cd bf out 0x3d, r28 ; 61 2bf1e: 6c 01 movw r12, r24 2bf20: 5b 01 movw r10, r22 2bf22: 4a 01 movw r8, r20 2bf24: 19 01 movw r2, r18 2bf26: 18 87 std Y+8, r17 ; 0x08 2bf28: 0f 83 std Y+7, r16 ; 0x07 2bf2a: fa 82 std Y+2, r15 ; 0x02 2bf2c: e9 82 std Y+1, r14 ; 0x01 uint8_t dad = 0; //delta angle [deg] uint8_t dad_min = 4; //delta angle min [deg] uint8_t dad_max = 16; //delta angle max [deg] uint8_t k = 720 / (dad_max - dad_min); //delta calculation constant ad = 0; if (pad) ad = *pad % 720; 2bf2e: d7 01 movw r26, r14 2bf30: 8d 91 ld r24, X+ 2bf32: 9c 91 ld r25, X 2bf34: 60 ed ldi r22, 0xD0 ; 208 2bf36: 72 e0 ldi r23, 0x02 ; 2 2bf38: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 2bf3c: 9c 8f std Y+28, r25 ; 0x1c 2bf3e: 8b 8f std Y+27, r24 ; 0x1b //@size=214 DBG(_n("xyzcal_spiral2 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad); 2bf40: 9f 93 push r25 2bf42: 8f 93 push r24 2bf44: 3f 92 push r3 2bf46: 2f 93 push r18 2bf48: 1f 92 push r1 2bf4a: 84 e6 ldi r24, 0x64 ; 100 2bf4c: 8f 93 push r24 2bf4e: 9f 92 push r9 2bf50: 8f 92 push r8 2bf52: bf 92 push r11 2bf54: af 92 push r10 2bf56: df 92 push r13 2bf58: cf 92 push r12 2bf5a: 83 e6 ldi r24, 0x63 ; 99 2bf5c: 9c e9 ldi r25, 0x9C ; 156 2bf5e: 9f 93 push r25 2bf60: 8f 93 push r24 2bf62: 0f 94 a2 a2 call 0x34544 ; 0x34544 2bf66: 0f b6 in r0, 0x3f ; 63 2bf68: f8 94 cli 2bf6a: de bf out 0x3e, r29 ; 62 2bf6c: 0f be out 0x3f, r0 ; 63 2bf6e: cd bf out 0x3d, r28 ; 61 r = (float)(((uint32_t)ad) * radius) / 720; } else { dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; 2bf70: 22 27 eor r18, r18 2bf72: 33 27 eor r19, r19 2bf74: 22 19 sub r18, r2 2bf76: 33 09 sbc r19, r3 2bf78: 3a 8f std Y+26, r19 ; 0x1a 2bf7a: 29 8f std Y+25, r18 ; 0x19 } ar = radians(ad + rotation); int x = (int)(cx + (cos(ar) * r)); int y = (int)(cy + (sin(ar) * r)); int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720)); 2bf7c: c4 01 movw r24, r8 2bf7e: 99 0c add r9, r9 2bf80: aa 0b sbc r26, r26 2bf82: bb 0b sbc r27, r27 2bf84: 89 87 std Y+9, r24 ; 0x09 2bf86: 9a 87 std Y+10, r25 ; 0x0a 2bf88: ab 87 std Y+11, r26 ; 0x0b 2bf8a: bc 87 std Y+12, r27 ; 0x0c dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; } ar = radians(ad + rotation); int x = (int)(cx + (cos(ar) * r)); int y = (int)(cy + (sin(ar) * r)); 2bf8c: 95 01 movw r18, r10 2bf8e: bb 0c add r11, r11 2bf90: 44 0b sbc r20, r20 2bf92: 55 0b sbc r21, r21 2bf94: 29 8b std Y+17, r18 ; 0x11 2bf96: 3a 8b std Y+18, r19 ; 0x12 2bf98: 4b 8b std Y+19, r20 ; 0x13 2bf9a: 5c 8b std Y+20, r21 ; 0x14 { dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; } ar = radians(ad + rotation); int x = (int)(cx + (cos(ar) * r)); 2bf9c: c6 01 movw r24, r12 2bf9e: dd 0c add r13, r13 2bfa0: aa 0b sbc r26, r26 2bfa2: bb 0b sbc r27, r27 2bfa4: 8d 8b std Y+21, r24 ; 0x15 2bfa6: 9e 8b std Y+22, r25 ; 0x16 2bfa8: af 8b std Y+23, r26 ; 0x17 2bfaa: b8 8f std Y+24, r27 ; 0x18 // snprintf(text, 10, "%4d", z0); // lcd_print(text); for (; ad < 720; ad++) { if (radius > 0) 2bfac: 12 14 cp r1, r2 2bfae: 13 04 cpc r1, r3 2bfb0: 0c f0 brlt .+2 ; 0x2bfb4 2bfb2: ba c0 rjmp .+372 ; 0x2c128 { dad = dad_max - (ad / k); 2bfb4: 8b 8d ldd r24, Y+27 ; 0x1b 2bfb6: 9c 8d ldd r25, Y+28 ; 0x1c 2bfb8: 6c e3 ldi r22, 0x3C ; 60 2bfba: 70 e0 ldi r23, 0x00 ; 0 2bfbc: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 2bfc0: 10 e1 ldi r17, 0x10 ; 16 2bfc2: 16 1b sub r17, r22 r = (float)(((uint32_t)ad) * radius) / 720; 2bfc4: 2b 8d ldd r18, Y+27 ; 0x1b 2bfc6: 3c 8d ldd r19, Y+28 ; 0x1c 2bfc8: d1 01 movw r26, r2 } else { dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; 2bfca: 0f 94 00 a5 call 0x34a00 ; 0x34a00 <__usmulhisi3> 2bfce: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2bfd2: 20 e0 ldi r18, 0x00 ; 0 2bfd4: 30 e0 ldi r19, 0x00 ; 0 2bfd6: 44 e3 ldi r20, 0x34 ; 52 2bfd8: 54 e4 ldi r21, 0x44 ; 68 2bfda: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2bfde: 6b 01 movw r12, r22 2bfe0: 7c 01 movw r14, r24 } ar = radians(ad + rotation); 2bfe2: 6f 81 ldd r22, Y+7 ; 0x07 2bfe4: 78 85 ldd r23, Y+8 ; 0x08 2bfe6: eb 8d ldd r30, Y+27 ; 0x1b 2bfe8: fc 8d ldd r31, Y+28 ; 0x1c 2bfea: 6e 0f add r22, r30 2bfec: 7f 1f adc r23, r31 2bfee: 90 e0 ldi r25, 0x00 ; 0 2bff0: 80 e0 ldi r24, 0x00 ; 0 2bff2: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2bff6: 25 e3 ldi r18, 0x35 ; 53 2bff8: 3a ef ldi r19, 0xFA ; 250 2bffa: 4e e8 ldi r20, 0x8E ; 142 2bffc: 5c e3 ldi r21, 0x3C ; 60 2bffe: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2c002: 4b 01 movw r8, r22 2c004: 5c 01 movw r10, r24 int x = (int)(cx + (cos(ar) * r)); 2c006: 0f 94 02 a6 call 0x34c04 ; 0x34c04 2c00a: 6b 83 std Y+3, r22 ; 0x03 2c00c: 7c 83 std Y+4, r23 ; 0x04 2c00e: 8d 83 std Y+5, r24 ; 0x05 2c010: 9e 83 std Y+6, r25 ; 0x06 int y = (int)(cy + (sin(ar) * r)); 2c012: c5 01 movw r24, r10 2c014: b4 01 movw r22, r8 2c016: 0f 94 c8 a8 call 0x35190 ; 0x35190 2c01a: 2b 01 movw r4, r22 2c01c: 3c 01 movw r6, r24 int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720)); 2c01e: 69 85 ldd r22, Y+9 ; 0x09 2c020: 7a 85 ldd r23, Y+10 ; 0x0a 2c022: 8b 85 ldd r24, Y+11 ; 0x0b 2c024: 9c 85 ldd r25, Y+12 ; 0x0c 2c026: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2c02a: 4b 01 movw r8, r22 2c02c: 5c 01 movw r10, r24 2c02e: 2b 8d ldd r18, Y+27 ; 0x1b 2c030: 3c 8d ldd r19, Y+28 ; 0x1c 2c032: a4 e6 ldi r26, 0x64 ; 100 2c034: b0 e0 ldi r27, 0x00 ; 0 2c036: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 2c03a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2c03e: 20 e0 ldi r18, 0x00 ; 0 2c040: 30 e0 ldi r19, 0x00 ; 0 2c042: 44 e3 ldi r20, 0x34 ; 52 2c044: 54 e4 ldi r21, 0x44 ; 68 2c046: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2c04a: 9b 01 movw r18, r22 2c04c: ac 01 movw r20, r24 2c04e: c5 01 movw r24, r10 2c050: b4 01 movw r22, r8 2c052: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2c056: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2c05a: 6d 87 std Y+13, r22 ; 0x0d 2c05c: 7e 87 std Y+14, r23 ; 0x0e 2c05e: 8f 87 std Y+15, r24 ; 0x0f 2c060: 98 8b std Y+16, r25 ; 0x10 dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; } ar = radians(ad + rotation); int x = (int)(cx + (cos(ar) * r)); int y = (int)(cy + (sin(ar) * r)); 2c062: 69 89 ldd r22, Y+17 ; 0x11 2c064: 7a 89 ldd r23, Y+18 ; 0x12 2c066: 8b 89 ldd r24, Y+19 ; 0x13 2c068: 9c 89 ldd r25, Y+20 ; 0x14 2c06a: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2c06e: 4b 01 movw r8, r22 2c070: 5c 01 movw r10, r24 2c072: a3 01 movw r20, r6 2c074: 92 01 movw r18, r4 2c076: c7 01 movw r24, r14 2c078: b6 01 movw r22, r12 2c07a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2c07e: 9b 01 movw r18, r22 2c080: ac 01 movw r20, r24 2c082: c5 01 movw r24, r10 2c084: b4 01 movw r22, r8 2c086: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2c08a: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2c08e: 4b 01 movw r8, r22 { dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; } ar = radians(ad + rotation); int x = (int)(cx + (cos(ar) * r)); 2c090: 6d 89 ldd r22, Y+21 ; 0x15 2c092: 7e 89 ldd r23, Y+22 ; 0x16 2c094: 8f 89 ldd r24, Y+23 ; 0x17 2c096: 98 8d ldd r25, Y+24 ; 0x18 2c098: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2c09c: 2b 01 movw r4, r22 2c09e: 3c 01 movw r6, r24 2c0a0: a7 01 movw r20, r14 2c0a2: 96 01 movw r18, r12 2c0a4: 6b 81 ldd r22, Y+3 ; 0x03 2c0a6: 7c 81 ldd r23, Y+4 ; 0x04 2c0a8: 8d 81 ldd r24, Y+5 ; 0x05 2c0aa: 9e 81 ldd r25, Y+6 ; 0x06 2c0ac: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2c0b0: 9b 01 movw r18, r22 2c0b2: ac 01 movw r20, r24 2c0b4: c3 01 movw r24, r6 2c0b6: b2 01 movw r22, r4 2c0b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2c0bc: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2c0c0: cb 01 movw r24, r22 int y = (int)(cy + (sin(ar) * r)); int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720)); if (xyzcal_lineXYZ_to(x, y, z, delay_us, check_pinda)) 2c0c2: 01 e0 ldi r16, 0x01 ; 1 2c0c4: 20 e4 ldi r18, 0x40 ; 64 2c0c6: 31 e0 ldi r19, 0x01 ; 1 2c0c8: 4d 85 ldd r20, Y+13 ; 0x0d 2c0ca: 5e 85 ldd r21, Y+14 ; 0x0e 2c0cc: b4 01 movw r22, r8 2c0ce: 0e 94 cf d5 call 0x1ab9e ; 0x1ab9e 2c0d2: 21 2f mov r18, r17 2c0d4: 30 e0 ldi r19, 0x00 ; 0 2c0d6: 88 23 and r24, r24 2c0d8: b9 f1 breq .+110 ; 0x2c148 2c0da: 4b 8d ldd r20, Y+27 ; 0x1b 2c0dc: 5c 8d ldd r21, Y+28 ; 0x1c 2c0de: 42 0f add r20, r18 2c0e0: 53 1f adc r21, r19 { ad += dad + 1; 2c0e2: 4f 5f subi r20, 0xFF ; 255 2c0e4: 5f 4f sbci r21, 0xFF ; 255 2c0e6: 5c 8f std Y+28, r21 ; 0x1c 2c0e8: 4b 8f std Y+27, r20 ; 0x1b ret = true; break; } ad += dad; } if (pad) *pad = ad; 2c0ea: eb 8d ldd r30, Y+27 ; 0x1b 2c0ec: fc 8d ldd r31, Y+28 ; 0x1c 2c0ee: a9 81 ldd r26, Y+1 ; 0x01 2c0f0: ba 81 ldd r27, Y+2 ; 0x02 2c0f2: ed 93 st X+, r30 2c0f4: fc 93 st X, r31 // if(ret){ // lcd_set_cursor(0, 4); // lcd_print(" "); // } return ret; } 2c0f6: 6c 96 adiw r28, 0x1c ; 28 2c0f8: 0f b6 in r0, 0x3f ; 63 2c0fa: f8 94 cli 2c0fc: de bf out 0x3e, r29 ; 62 2c0fe: 0f be out 0x3f, r0 ; 63 2c100: cd bf out 0x3d, r28 ; 61 2c102: df 91 pop r29 2c104: cf 91 pop r28 2c106: 1f 91 pop r17 2c108: 0f 91 pop r16 2c10a: ff 90 pop r15 2c10c: ef 90 pop r14 2c10e: df 90 pop r13 2c110: cf 90 pop r12 2c112: bf 90 pop r11 2c114: af 90 pop r10 2c116: 9f 90 pop r9 2c118: 8f 90 pop r8 2c11a: 7f 90 pop r7 2c11c: 6f 90 pop r6 2c11e: 5f 90 pop r5 2c120: 4f 90 pop r4 2c122: 3f 90 pop r3 2c124: 2f 90 pop r2 2c126: 08 95 ret dad = dad_max - (ad / k); r = (float)(((uint32_t)ad) * radius) / 720; } else { dad = dad_max - ((719 - ad) / k); 2c128: 2f ec ldi r18, 0xCF ; 207 2c12a: 32 e0 ldi r19, 0x02 ; 2 2c12c: ab 8d ldd r26, Y+27 ; 0x1b 2c12e: bc 8d ldd r27, Y+28 ; 0x1c 2c130: 2a 1b sub r18, r26 2c132: 3b 0b sbc r19, r27 2c134: c9 01 movw r24, r18 2c136: 6c e3 ldi r22, 0x3C ; 60 2c138: 70 e0 ldi r23, 0x00 ; 0 2c13a: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 2c13e: 10 e1 ldi r17, 0x10 ; 16 2c140: 16 1b sub r17, r22 r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; 2c142: a9 8d ldd r26, Y+25 ; 0x19 2c144: ba 8d ldd r27, Y+26 ; 0x1a 2c146: 41 cf rjmp .-382 ; 0x2bfca // lcd_set_cursor(0, 4); // char text[10]; // snprintf(text, 10, "%4d", z0); // lcd_print(text); for (; ad < 720; ad++) 2c148: 2f 5f subi r18, 0xFF ; 255 2c14a: 3f 4f sbci r19, 0xFF ; 255 2c14c: ab 8d ldd r26, Y+27 ; 0x1b 2c14e: bc 8d ldd r27, Y+28 ; 0x1c 2c150: a2 0f add r26, r18 2c152: b3 1f adc r27, r19 2c154: bc 8f std Y+28, r27 ; 0x1c 2c156: ab 8f std Y+27, r26 ; 0x1b 2c158: a0 3d cpi r26, 0xD0 ; 208 2c15a: b2 40 sbci r27, 0x02 ; 2 2c15c: 08 f4 brcc .+2 ; 0x2c160 2c15e: 26 cf rjmp .-436 ; 0x2bfac 2c160: c4 cf rjmp .-120 ; 0x2c0ea 0002c162 : length = z - _Z; go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length)); // DBG(_n("\n")); } void __attribute__((noinline)) xyzcal_scan_pixels_32x32_Zhop(int16_t cx, int16_t cy, int16_t min_z, int16_t max_z, uint16_t delay_us, uint8_t *pixels){ 2c162: 2f 92 push r2 2c164: 3f 92 push r3 2c166: 4f 92 push r4 2c168: 5f 92 push r5 2c16a: 6f 92 push r6 2c16c: 7f 92 push r7 2c16e: 8f 92 push r8 2c170: 9f 92 push r9 2c172: af 92 push r10 2c174: bf 92 push r11 2c176: cf 92 push r12 2c178: df 92 push r13 2c17a: ef 92 push r14 2c17c: ff 92 push r15 2c17e: 0f 93 push r16 2c180: 1f 93 push r17 2c182: cf 93 push r28 2c184: df 93 push r29 2c186: cd b7 in r28, 0x3d ; 61 2c188: de b7 in r29, 0x3e ; 62 2c18a: ca 55 subi r28, 0x5A ; 90 2c18c: d1 09 sbc r29, r1 2c18e: 0f b6 in r0, 0x3f ; 63 2c190: f8 94 cli 2c192: de bf out 0x3e, r29 ; 62 2c194: 0f be out 0x3f, r0 ; 63 2c196: cd bf out 0x3d, r28 ; 61 2c198: 63 96 adiw r28, 0x13 ; 19 2c19a: 9f af std Y+63, r25 ; 0x3f 2c19c: 8e af std Y+62, r24 ; 0x3e 2c19e: 63 97 sbiw r28, 0x13 ; 19 2c1a0: 8b 01 movw r16, r22 2c1a2: 6a 01 movw r12, r20 if (!pixels) return; int16_t z_trig; uint16_t line_buffer[32]; uint16_t current_delay_us = MAX_DELAY; ///< defines current speed 2c1a4: 7e 01 movw r14, r28 2c1a6: 25 e4 ldi r18, 0x45 ; 69 2c1a8: e2 0e add r14, r18 2c1aa: f1 1c adc r15, r1 2c1ac: 80 e1 ldi r24, 0x10 ; 16 2c1ae: 97 e2 ldi r25, 0x27 ; 39 2c1b0: f7 01 movw r30, r14 2c1b2: 91 83 std Z+1, r25 ; 0x01 2c1b4: 80 83 st Z, r24 int16_t start_z; uint16_t steps_to_go; DBG(_n("Scan countdown: ")); 2c1b6: 80 eb ldi r24, 0xB0 ; 176 2c1b8: 9c e9 ldi r25, 0x9C ; 156 2c1ba: 9f 93 push r25 2c1bc: 8f 93 push r24 2c1be: 0f 94 a2 a2 call 0x34544 ; 0x34544 2c1c2: 2e e5 ldi r18, 0x5E ; 94 2c1c4: 36 e0 ldi r19, 0x06 ; 6 2c1c6: 61 96 adiw r28, 0x11 ; 17 2c1c8: 3f af std Y+63, r19 ; 0x3f 2c1ca: 2e af std Y+62, r18 ; 0x3e 2c1cc: 61 97 sbiw r28, 0x11 ; 17 2c1ce: c8 01 movw r24, r16 2c1d0: 80 5e subi r24, 0xE0 ; 224 2c1d2: 93 40 sbci r25, 0x03 ; 3 2c1d4: 2b 96 adiw r28, 0x0b ; 11 2c1d6: 9f af std Y+63, r25 ; 0x3f 2c1d8: 8e af std Y+62, r24 ; 0x3e 2c1da: 2b 97 sbiw r28, 0x0b ; 11 2c1dc: 0f 90 pop r0 2c1de: 0f 90 pop r0 2c1e0: e0 e4 ldi r30, 0x40 ; 64 2c1e2: f0 e0 ldi r31, 0x00 ; 0 2c1e4: 29 96 adiw r28, 0x09 ; 9 2c1e6: ff af std Y+63, r31 ; 0x3f 2c1e8: ee af std Y+62, r30 ; 0x3e 2c1ea: 29 97 sbiw r28, 0x09 ; 9 for (uint8_t r = 0; r < 32; r++){ ///< Y axis for (uint8_t d = 0; d < 2; ++d){ go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY); 2c1ec: 63 96 adiw r28, 0x13 ; 19 2c1ee: 2e ad ldd r18, Y+62 ; 0x3e 2c1f0: 3f ad ldd r19, Y+63 ; 0x3f 2c1f2: 63 97 sbiw r28, 0x13 ; 19 2c1f4: 20 5e subi r18, 0xE0 ; 224 2c1f6: 33 40 sbci r19, 0x03 ; 3 2c1f8: 69 96 adiw r28, 0x19 ; 25 2c1fa: 3f af std Y+63, r19 ; 0x3f 2c1fc: 2e af std Y+62, r18 ; 0x3e 2c1fe: 69 97 sbiw r28, 0x19 ; 25 2c200: 29 96 adiw r28, 0x09 ; 9 2c202: 4e ac ldd r4, Y+62 ; 0x3e 2c204: 5f ac ldd r5, Y+63 ; 0x3f 2c206: 29 97 sbiw r28, 0x09 ; 9 uint16_t steps_to_go; DBG(_n("Scan countdown: ")); for (uint8_t r = 0; r < 32; r++){ ///< Y axis for (uint8_t d = 0; d < 2; ++d){ 2c208: 31 2c mov r3, r1 go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY); 2c20a: 63 96 adiw r28, 0x13 ; 19 2c20c: 8e ad ldd r24, Y+62 ; 0x3e 2c20e: 9f ad ldd r25, Y+63 ; 0x3f 2c210: 63 97 sbiw r28, 0x13 ; 19 2c212: 80 52 subi r24, 0x20 ; 32 2c214: 9c 4f sbci r25, 0xFC ; 252 2c216: 6b 96 adiw r28, 0x1b ; 27 2c218: 9f af std Y+63, r25 ; 0x3f 2c21a: 8e af std Y+62, r24 ; 0x3e 2c21c: 6b 97 sbiw r28, 0x1b ; 27 2c21e: 60 90 54 06 lds r6, 0x0654 ; 0x800654 2c222: 70 90 55 06 lds r7, 0x0655 ; 0x800655 2c226: 80 90 56 06 lds r8, 0x0656 ; 0x800656 2c22a: 90 90 57 06 lds r9, 0x0657 ; 0x800657 2c22e: 6b 96 adiw r28, 0x1b ; 27 2c230: ae ac ldd r10, Y+62 ; 0x3e 2c232: bf ac ldd r11, Y+63 ; 0x3f 2c234: 6b 97 sbiw r28, 0x1b ; 27 2c236: 31 10 cpse r3, r1 2c238: 04 c0 rjmp .+8 ; 0x2c242 2c23a: 69 96 adiw r28, 0x19 ; 25 2c23c: ae ac ldd r10, Y+62 ; 0x3e 2c23e: bf ac ldd r11, Y+63 ; 0x3f 2c240: 69 97 sbiw r28, 0x19 ; 25 /// starts and ends at 0 speed void go_manhattan(int16_t x, int16_t y, int16_t z, int16_t acc, uint16_t min_delay_us){ int16_t length; // DBG(_n("x %d -> %d, "), x, _X); length = x - _X; 2c242: 80 91 4c 06 lds r24, 0x064C ; 0x80064c 2c246: 90 91 4d 06 lds r25, 0x064D ; 0x80064d 2c24a: a0 91 4e 06 lds r26, 0x064E ; 0x80064e 2c24e: b0 91 4f 06 lds r27, 0x064F ; 0x80064f 2c252: f5 01 movw r30, r10 2c254: e8 1b sub r30, r24 2c256: f9 0b sbc r31, r25 2c258: cf 01 movw r24, r30 update_position_1_step(axes, dir); } } void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){ if (steps == 0) 2c25a: 71 f0 breq .+28 ; 0x2c278 void go_manhattan(int16_t x, int16_t y, int16_t z, int16_t acc, uint16_t min_delay_us){ int16_t length; // DBG(_n("x %d -> %d, "), x, _X); length = x - _X; go_start_stop(X_AXIS_MASK, length < 0 ? X_MINUS_MASK : X_PLUS_MASK, acc, min_delay_us, ABS(length)); 2c25c: af 01 movw r20, r30 2c25e: f7 ff sbrs r31, 7 2c260: 04 c0 rjmp .+8 ; 0x2c26a 2c262: 44 27 eor r20, r20 2c264: 55 27 eor r21, r21 2c266: 4e 1b sub r20, r30 2c268: 5f 0b sbc r21, r31 2c26a: 69 2f mov r22, r25 2c26c: 66 1f adc r22, r22 2c26e: 66 27 eor r22, r22 2c270: 66 1f adc r22, r22 2c272: 81 e0 ldi r24, 0x01 ; 1 2c274: 0f 94 40 5f call 0x2be80 ; 0x2be80 // DBG(_n("y %d -> %d, "), y, _Y); length = y - _Y; 2c278: 80 91 50 06 lds r24, 0x0650 ; 0x800650 2c27c: 90 91 51 06 lds r25, 0x0651 ; 0x800651 2c280: a0 91 52 06 lds r26, 0x0652 ; 0x800652 2c284: b0 91 53 06 lds r27, 0x0653 ; 0x800653 2c288: 2b 96 adiw r28, 0x0b ; 11 2c28a: 4e ad ldd r20, Y+62 ; 0x3e 2c28c: 5f ad ldd r21, Y+63 ; 0x3f 2c28e: 2b 97 sbiw r28, 0x0b ; 11 2c290: 48 1b sub r20, r24 2c292: 59 0b sbc r21, r25 go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length)); 2c294: 57 fd sbrc r21, 7 2c296: b2 c0 rjmp .+356 ; 0x2c3fc 2c298: 60 e0 ldi r22, 0x00 ; 0 update_position_1_step(axes, dir); } } void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){ if (steps == 0) 2c29a: 41 15 cp r20, r1 2c29c: 51 05 cpc r21, r1 2c29e: 09 f0 breq .+2 ; 0x2c2a2 2c2a0: ae c0 rjmp .+348 ; 0x2c3fe // DBG(_n("y %d -> %d, "), y, _Y); length = y - _Y; go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length)); // DBG(_n("z %d -> %d\n"), z, _Z); length = z - _Z; 2c2a2: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c2a6: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c2aa: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c2ae: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c2b2: 68 1a sub r6, r24 2c2b4: 79 0a sbc r7, r25 go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length)); 2c2b6: 77 fc sbrc r7, 7 2c2b8: ab c0 rjmp .+342 ; 0x2c410 2c2ba: 60 e0 ldi r22, 0x00 ; 0 update_position_1_step(axes, dir); } } void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){ if (steps == 0) 2c2bc: 61 14 cp r6, r1 2c2be: 71 04 cpc r7, r1 2c2c0: 09 f0 breq .+2 ; 0x2c2c4 2c2c2: a7 c0 rjmp .+334 ; 0x2c412 DBG(_n("Scan countdown: ")); for (uint8_t r = 0; r < 32; r++){ ///< Y axis for (uint8_t d = 0; d < 2; ++d){ go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY); xyzcal_lineXYZ_to((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, delay_us, 0); 2c2c4: 40 91 54 06 lds r20, 0x0654 ; 0x800654 2c2c8: 50 91 55 06 lds r21, 0x0655 ; 0x800655 2c2cc: 60 91 56 06 lds r22, 0x0656 ; 0x800656 2c2d0: 70 91 57 06 lds r23, 0x0657 ; 0x800657 2c2d4: 00 e0 ldi r16, 0x00 ; 0 2c2d6: 28 ec ldi r18, 0xC8 ; 200 2c2d8: 30 e0 ldi r19, 0x00 ; 0 2c2da: 2b 96 adiw r28, 0x0b ; 11 2c2dc: 6e ad ldd r22, Y+62 ; 0x3e 2c2de: 7f ad ldd r23, Y+63 ; 0x3f 2c2e0: 2b 97 sbiw r28, 0x0b ; 11 2c2e2: c5 01 movw r24, r10 2c2e4: 0e 94 cf d5 call 0x1ab9e ; 0x1ab9e sm4_set_dir(X_AXIS, d); 2c2e8: 63 2d mov r22, r3 2c2ea: 80 e0 ldi r24, 0x00 ; 0 2c2ec: 0f 94 9c 28 call 0x25138 ; 0x25138 //@size=242 DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive 2c2f0: 5f 92 push r5 2c2f2: 4f 92 push r4 2c2f4: 8c ea ldi r24, 0xAC ; 172 2c2f6: 9c e9 ldi r25, 0x9C ; 156 2c2f8: 9f 93 push r25 2c2fa: 8f 93 push r24 2c2fc: 0f 94 a2 a2 call 0x34544 ; 0x34544 lcd_set_cursor(4,3); 2c300: 63 e0 ldi r22, 0x03 ; 3 2c302: 84 e0 ldi r24, 0x04 ; 4 2c304: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12 2c308: 5f 92 push r5 2c30a: 4f 92 push r4 2c30c: 8d e9 ldi r24, 0x9D ; 157 2c30e: 9c e9 ldi r25, 0x9C ; 156 2c310: 9f 93 push r25 2c312: 8f 93 push r24 2c314: 0e 94 0b 6f call 0xde16 ; 0xde16 2c318: 0f b6 in r0, 0x3f ; 63 2c31a: f8 94 cli 2c31c: de bf out 0x3e, r29 ; 62 2c31e: 0f be out 0x3f, r0 ; 63 2c320: cd bf out 0x3d, r28 ; 61 2c322: 21 e0 ldi r18, 0x01 ; 1 2c324: 30 e0 ldi r19, 0x00 ; 0 2c326: 31 10 cpse r3, r1 2c328: 02 c0 rjmp .+4 ; 0x2c32e 2c32a: 2f ef ldi r18, 0xFF ; 255 2c32c: 3f ef ldi r19, 0xFF ; 255 2c32e: 40 ec ldi r20, 0xC0 ; 192 2c330: 42 03 mulsu r20, r18 2c332: c0 01 movw r24, r0 2c334: 43 9f mul r20, r19 2c336: 90 0d add r25, r0 2c338: 11 24 eor r1, r1 2c33a: 67 96 adiw r28, 0x17 ; 23 2c33c: 9f af std Y+63, r25 ; 0x3f 2c33e: 8e af std Y+62, r24 ; 0x3e 2c340: 67 97 sbiw r28, 0x17 ; 23 2c342: 40 ee ldi r20, 0xE0 ; 224 2c344: 53 e0 ldi r21, 0x03 ; 3 2c346: 24 9f mul r18, r20 2c348: 40 01 movw r8, r0 2c34a: 25 9f mul r18, r21 2c34c: 90 0c add r9, r0 2c34e: 34 9f mul r19, r20 2c350: 90 0c add r9, r0 2c352: 11 24 eor r1, r1 2c354: 63 96 adiw r28, 0x13 ; 19 2c356: ee ad ldd r30, Y+62 ; 0x3e 2c358: ff ad ldd r31, Y+63 ; 0x3f 2c35a: 63 97 sbiw r28, 0x13 ; 19 2c35c: 8e 0e add r8, r30 2c35e: 9f 1e adc r9, r31 2c360: 9e 01 movw r18, r28 2c362: 2f 5f subi r18, 0xFF ; 255 2c364: 3f 4f sbci r19, 0xFF ; 255 2c366: 2d 96 adiw r28, 0x0d ; 13 2c368: 3f af std Y+63, r19 ; 0x3f 2c36a: 2e af std Y+62, r18 ; 0x3e 2c36c: 2d 97 sbiw r28, 0x0d ; 13 2c36e: 61 96 adiw r28, 0x11 ; 17 2c370: 8e ad ldd r24, Y+62 ; 0x3e 2c372: 9f ad ldd r25, Y+63 ; 0x3f 2c374: 61 97 sbiw r28, 0x11 ; 17 2c376: 2f 96 adiw r28, 0x0f ; 15 2c378: 9f af std Y+63, r25 ; 0x3f 2c37a: 8e af std Y+62, r24 ; 0x3e 2c37c: 2f 97 sbiw r28, 0x0f ; 15 2c37e: 71 2c mov r7, r1 2c380: 61 2c mov r6, r1 for (uint8_t c = 0; c < 32; c++){ ///< X axis /// move to the next point and move Z up diagonally (if needed) current_delay_us = MAX_DELAY; 2c382: e0 e1 ldi r30, 0x10 ; 16 2c384: f7 e2 ldi r31, 0x27 ; 39 2c386: 27 96 adiw r28, 0x07 ; 7 2c388: ff af std Y+63, r31 ; 0x3f 2c38a: ee af std Y+62, r30 ; 0x3e 2c38c: 27 97 sbiw r28, 0x07 ; 7 const int16_t end_x = ((d & 1) ? 1 : -1) * (64 * (16 - c) - 32) + cx; const int16_t length_x = ABS(end_x - _X); 2c38e: 80 91 4c 06 lds r24, 0x064C ; 0x80064c 2c392: 90 91 4d 06 lds r25, 0x064D ; 0x80064d 2c396: a0 91 4e 06 lds r26, 0x064E ; 0x80064e 2c39a: b0 91 4f 06 lds r27, 0x064F ; 0x80064f 2c39e: 84 01 movw r16, r8 2c3a0: 08 1b sub r16, r24 2c3a2: 19 0b sbc r17, r25 2c3a4: 17 ff sbrs r17, 7 2c3a6: 03 c0 rjmp .+6 ; 0x2c3ae 2c3a8: 11 95 neg r17 2c3aa: 01 95 neg r16 2c3ac: 11 09 sbc r17, r1 const int16_t half_x = length_x / 2; 2c3ae: 98 01 movw r18, r16 2c3b0: 35 95 asr r19 2c3b2: 27 95 ror r18 2c3b4: 65 96 adiw r28, 0x15 ; 21 2c3b6: 3f af std Y+63, r19 ; 0x3f 2c3b8: 2e af std Y+62, r18 ; 0x3e 2c3ba: 65 97 sbiw r28, 0x15 ; 21 /// don't go up if PINDA not triggered (optimization) const bool up = _PINDA; const uint8_t axes = up ? X_AXIS_MASK | Z_AXIS_MASK : X_AXIS_MASK; 2c3bc: 1c 9b sbis 0x03, 4 ; 3 2c3be: 33 c0 rjmp .+102 ; 0x2c426 2c3c0: 45 e0 ldi r20, 0x05 ; 5 2c3c2: 24 2e mov r2, r20 const uint8_t dir = Z_PLUS_MASK | (d & 1 ? X_MINUS_MASK : X_PLUS_MASK); accelerate(axes, dir, Z_ACCEL, current_delay_us, Z_MIN_DELAY, half_x); 2c3c4: 65 96 adiw r28, 0x15 ; 21 2c3c6: ae ac ldd r10, Y+62 ; 0x3e 2c3c8: bf ac ldd r11, Y+63 ; 0x3f 2c3ca: 65 97 sbiw r28, 0x15 ; 21 } /// Goes defined number of steps while accelerating /// updates global positions void accelerate(uint8_t axes, uint8_t dir, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us, uint16_t steps){ set_axes_dir(axes, dir); 2c3cc: 63 2d mov r22, r3 2c3ce: 82 2d mov r24, r2 2c3d0: 0e 94 76 d5 call 0x1aaec ; 0x1aaec while (steps--){ 2c3d4: 31 e0 ldi r19, 0x01 ; 1 2c3d6: a3 1a sub r10, r19 2c3d8: b1 08 sbc r11, r1 2c3da: 40 f1 brcs .+80 ; 0x2c42c accelerate_1_step(axes, acc, delay_us, min_delay_us); 2c3dc: 28 ec ldi r18, 0xC8 ; 200 2c3de: 30 e0 ldi r19, 0x00 ; 0 2c3e0: a7 01 movw r20, r14 2c3e2: 68 ee ldi r22, 0xE8 ; 232 2c3e4: 73 e0 ldi r23, 0x03 ; 3 2c3e6: 82 2d mov r24, r2 2c3e8: 0e 94 45 d4 call 0x1a88a ; 0x1a88a update_position_1_step(axes, dir); 2c3ec: 63 2d mov r22, r3 2c3ee: 82 2d mov r24, r2 2c3f0: 0e 94 8f d5 call 0x1ab1e ; 0x1ab1e 2c3f4: ef cf rjmp .-34 ; 0x2c3d4 uint16_t steps_to_go; DBG(_n("Scan countdown: ")); for (uint8_t r = 0; r < 32; r++){ ///< Y axis for (uint8_t d = 0; d < 2; ++d){ 2c3f6: 33 24 eor r3, r3 2c3f8: 33 94 inc r3 2c3fa: 11 cf rjmp .-478 ; 0x2c21e length = x - _X; go_start_stop(X_AXIS_MASK, length < 0 ? X_MINUS_MASK : X_PLUS_MASK, acc, min_delay_us, ABS(length)); // DBG(_n("y %d -> %d, "), y, _Y); length = y - _Y; go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length)); 2c3fc: 62 e0 ldi r22, 0x02 ; 2 2c3fe: 57 ff sbrs r21, 7 2c400: 03 c0 rjmp .+6 ; 0x2c408 2c402: 51 95 neg r21 2c404: 41 95 neg r20 2c406: 51 09 sbc r21, r1 2c408: 82 e0 ldi r24, 0x02 ; 2 2c40a: 0f 94 40 5f call 0x2be80 ; 0x2be80 2c40e: 49 cf rjmp .-366 ; 0x2c2a2 // DBG(_n("z %d -> %d\n"), z, _Z); length = z - _Z; go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length)); 2c410: 64 e0 ldi r22, 0x04 ; 4 2c412: a3 01 movw r20, r6 2c414: 77 fe sbrs r7, 7 2c416: 03 c0 rjmp .+6 ; 0x2c41e 2c418: 51 95 neg r21 2c41a: 41 95 neg r20 2c41c: 51 09 sbc r21, r1 2c41e: 84 e0 ldi r24, 0x04 ; 4 2c420: 0f 94 40 5f call 0x2be80 ; 0x2be80 2c424: 4f cf rjmp .-354 ; 0x2c2c4 const int16_t end_x = ((d & 1) ? 1 : -1) * (64 * (16 - c) - 32) + cx; const int16_t length_x = ABS(end_x - _X); const int16_t half_x = length_x / 2; /// don't go up if PINDA not triggered (optimization) const bool up = _PINDA; const uint8_t axes = up ? X_AXIS_MASK | Z_AXIS_MASK : X_AXIS_MASK; 2c426: 22 24 eor r2, r2 2c428: 23 94 inc r2 2c42a: cc cf rjmp .-104 ; 0x2c3c4 const uint8_t dir = Z_PLUS_MASK | (d & 1 ? X_MINUS_MASK : X_PLUS_MASK); accelerate(axes, dir, Z_ACCEL, current_delay_us, Z_MIN_DELAY, half_x); go_and_stop(axes, dir, Z_ACCEL, current_delay_us, length_x - half_x); 2c42c: 65 96 adiw r28, 0x15 ; 21 2c42e: ee ad ldd r30, Y+62 ; 0x3e 2c430: ff ad ldd r31, Y+63 ; 0x3f 2c432: 65 97 sbiw r28, 0x15 ; 21 2c434: 0e 1b sub r16, r30 2c436: 1f 0b sbc r17, r31 2c438: 23 96 adiw r28, 0x03 ; 3 2c43a: 1f af std Y+63, r17 ; 0x3f 2c43c: 0e af std Y+62, r16 ; 0x3e 2c43e: 23 97 sbiw r28, 0x03 ; 3 } /// \param dir sets direction of movement /// updates global positions void go_and_stop(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us, uint16_t steps){ set_axes_dir(axes, dir); 2c440: 63 2d mov r22, r3 2c442: 82 2d mov r24, r2 2c444: 0e 94 76 d5 call 0x1aaec ; 0x1aaec while (go_and_stop_1_step(axes, dec, delay_us, steps)){ 2c448: 9e 01 movw r18, r28 2c44a: 2f 5b subi r18, 0xBF ; 191 2c44c: 3f 4f sbci r19, 0xFF ; 255 2c44e: a7 01 movw r20, r14 2c450: 68 ee ldi r22, 0xE8 ; 232 2c452: 73 e0 ldi r23, 0x03 ; 3 2c454: 82 2d mov r24, r2 2c456: 0e 94 ec d4 call 0x1a9d8 ; 0x1a9d8 2c45a: 88 23 and r24, r24 2c45c: 29 f0 breq .+10 ; 0x2c468 update_position_1_step(axes, dir); 2c45e: 63 2d mov r22, r3 2c460: 82 2d mov r24, r2 2c462: 0e 94 8f d5 call 0x1ab1e ; 0x1ab1e 2c466: f0 cf rjmp .-32 ; 0x2c448 z_trig = min_z; /// move up to un-trigger (surpress hysteresis) sm4_set_dir(Z_AXIS, Z_PLUS); 2c468: 60 e0 ldi r22, 0x00 ; 0 2c46a: 82 e0 ldi r24, 0x02 ; 2 2c46c: 0f 94 9c 28 call 0x25138 ; 0x25138 /// speed up from stop, go half the way current_delay_us = MAX_DELAY; 2c470: 20 e1 ldi r18, 0x10 ; 16 2c472: 37 e2 ldi r19, 0x27 ; 39 2c474: 27 96 adiw r28, 0x07 ; 7 2c476: 3f af std Y+63, r19 ; 0x3f 2c478: 2e af std Y+62, r18 ; 0x3e 2c47a: 27 97 sbiw r28, 0x07 ; 7 for (start_z = _Z; _Z < (max_z + start_z) / 2; ++_Z_){ 2c47c: 00 91 54 06 lds r16, 0x0654 ; 0x800654 2c480: 10 91 55 06 lds r17, 0x0655 ; 0x800655 2c484: 20 91 56 06 lds r18, 0x0656 ; 0x800656 2c488: 30 91 57 06 lds r19, 0x0657 ; 0x800657 2c48c: 00 5a subi r16, 0xA0 ; 160 2c48e: 16 4f sbci r17, 0xF6 ; 246 2c490: 17 ff sbrs r17, 7 2c492: 02 c0 rjmp .+4 ; 0x2c498 2c494: 0f 5f subi r16, 0xFF ; 255 2c496: 1f 4f sbci r17, 0xFF ; 255 2c498: 15 95 asr r17 2c49a: 07 95 ror r16 2c49c: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c4a0: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c4a4: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c4a8: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c4ac: 80 17 cp r24, r16 2c4ae: 91 07 cpc r25, r17 2c4b0: f4 f4 brge .+60 ; 0x2c4ee if (!_PINDA){ 2c4b2: 1c 9b sbis 0x03, 4 ; 3 2c4b4: 1c c0 rjmp .+56 ; 0x2c4ee break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); 2c4b6: 28 ec ldi r18, 0xC8 ; 200 2c4b8: 30 e0 ldi r19, 0x00 ; 0 2c4ba: a7 01 movw r20, r14 2c4bc: 68 ee ldi r22, 0xE8 ; 232 2c4be: 73 e0 ldi r23, 0x03 ; 3 2c4c0: 84 e0 ldi r24, 0x04 ; 4 2c4c2: 0e 94 45 d4 call 0x1a88a ; 0x1a88a /// move up to un-trigger (surpress hysteresis) sm4_set_dir(Z_AXIS, Z_PLUS); /// speed up from stop, go half the way current_delay_us = MAX_DELAY; for (start_z = _Z; _Z < (max_z + start_z) / 2; ++_Z_){ 2c4c6: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c4ca: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c4ce: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c4d2: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c4d6: 01 96 adiw r24, 0x01 ; 1 2c4d8: a1 1d adc r26, r1 2c4da: b1 1d adc r27, r1 2c4dc: 80 93 54 06 sts 0x0654, r24 ; 0x800654 2c4e0: 90 93 55 06 sts 0x0655, r25 ; 0x800655 2c4e4: a0 93 56 06 sts 0x0656, r26 ; 0x800656 2c4e8: b0 93 57 06 sts 0x0657, r27 ; 0x800657 2c4ec: d7 cf rjmp .-82 ; 0x2c49c break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); } if (_PINDA){ 2c4ee: 1c 9b sbis 0x03, 4 ; 3 2c4f0: 3f c0 rjmp .+126 ; 0x2c570 steps_to_go = MAX(0, max_z - _Z); 2c4f2: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c4f6: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c4fa: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c4fe: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c502: e0 e6 ldi r30, 0x60 ; 96 2c504: f9 e0 ldi r31, 0x09 ; 9 2c506: e8 1b sub r30, r24 2c508: f9 0b sbc r31, r25 2c50a: cf 01 movw r24, r30 2c50c: f7 ff sbrs r31, 7 2c50e: 02 c0 rjmp .+4 ; 0x2c514 2c510: 90 e0 ldi r25, 0x00 ; 0 2c512: 80 e0 ldi r24, 0x00 ; 0 2c514: 25 96 adiw r28, 0x05 ; 5 2c516: 9f af std Y+63, r25 ; 0x3f 2c518: 8e af std Y+62, r24 ; 0x3e 2c51a: 25 97 sbiw r28, 0x05 ; 5 while (_PINDA && _Z < max_z){ 2c51c: 1c 9b sbis 0x03, 4 ; 3 2c51e: 28 c0 rjmp .+80 ; 0x2c570 2c520: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c524: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c528: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c52c: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c530: 80 36 cpi r24, 0x60 ; 96 2c532: 99 40 sbci r25, 0x09 ; 9 2c534: ec f4 brge .+58 ; 0x2c570 go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go); 2c536: 9e 01 movw r18, r28 2c538: 2d 5b subi r18, 0xBD ; 189 2c53a: 3f 4f sbci r19, 0xFF ; 255 2c53c: a7 01 movw r20, r14 2c53e: 68 ee ldi r22, 0xE8 ; 232 2c540: 73 e0 ldi r23, 0x03 ; 3 2c542: 84 e0 ldi r24, 0x04 ; 4 2c544: 0e 94 ec d4 call 0x1a9d8 ; 0x1a9d8 ++_Z_; 2c548: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c54c: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c550: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c554: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c558: 01 96 adiw r24, 0x01 ; 1 2c55a: a1 1d adc r26, r1 2c55c: b1 1d adc r27, r1 2c55e: 80 93 54 06 sts 0x0654, r24 ; 0x800654 2c562: 90 93 55 06 sts 0x0655, r25 ; 0x800655 2c566: a0 93 56 06 sts 0x0656, r26 ; 0x800656 2c56a: b0 93 57 06 sts 0x0657, r27 ; 0x800657 2c56e: d6 cf rjmp .-84 ; 0x2c51c /// \returns steps done /// updates global positions void stop_smoothly(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us){ if (dec <= 0) return; set_axes_dir(axes, dir); 2c570: 60 e0 ldi r22, 0x00 ; 0 2c572: 84 e0 ldi r24, 0x04 ; 4 2c574: 0e 94 76 d5 call 0x1aaec ; 0x1aaec while (delay_us < MAX_DELAY){ 2c578: f7 01 movw r30, r14 2c57a: 20 81 ld r18, Z 2c57c: 31 81 ldd r19, Z+1 ; 0x01 2c57e: 20 31 cpi r18, 0x10 ; 16 2c580: f7 e2 ldi r31, 0x27 ; 39 2c582: 3f 07 cpc r19, r31 2c584: 58 f4 brcc .+22 ; 0x2c59c accelerate_1_step(axes, -dec, delay_us, delay_us); 2c586: a7 01 movw r20, r14 2c588: 68 e1 ldi r22, 0x18 ; 24 2c58a: 7c ef ldi r23, 0xFC ; 252 2c58c: 84 e0 ldi r24, 0x04 ; 4 2c58e: 0e 94 45 d4 call 0x1a88a ; 0x1a88a update_position_1_step(axes, dir); 2c592: 60 e0 ldi r22, 0x00 ; 0 2c594: 84 e0 ldi r24, 0x04 ; 4 2c596: 0e 94 8f d5 call 0x1ab1e ; 0x1ab1e 2c59a: ee cf rjmp .-36 ; 0x2c578 } } stop_smoothly(Z_AXIS_MASK, Z_PLUS_MASK, Z_ACCEL, current_delay_us); /// move down to trigger sm4_set_dir(Z_AXIS, Z_MINUS); 2c59c: 61 e0 ldi r22, 0x01 ; 1 2c59e: 82 e0 ldi r24, 0x02 ; 2 2c5a0: 0f 94 9c 28 call 0x25138 ; 0x25138 /// speed up current_delay_us = MAX_DELAY; 2c5a4: 20 e1 ldi r18, 0x10 ; 16 2c5a6: 37 e2 ldi r19, 0x27 ; 39 2c5a8: f7 01 movw r30, r14 2c5aa: 31 83 std Z+1, r19 ; 0x01 2c5ac: 20 83 st Z, r18 for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){ 2c5ae: 00 91 54 06 lds r16, 0x0654 ; 0x800654 2c5b2: 10 91 55 06 lds r17, 0x0655 ; 0x800655 2c5b6: 20 91 56 06 lds r18, 0x0656 ; 0x800656 2c5ba: 30 91 57 06 lds r19, 0x0657 ; 0x800657 2c5be: 0c 0d add r16, r12 2c5c0: 1d 1d adc r17, r13 2c5c2: 17 ff sbrs r17, 7 2c5c4: 02 c0 rjmp .+4 ; 0x2c5ca 2c5c6: 0f 5f subi r16, 0xFF ; 255 2c5c8: 1f 4f sbci r17, 0xFF ; 255 2c5ca: 15 95 asr r17 2c5cc: 07 95 ror r16 2c5ce: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c5d2: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c5d6: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c5da: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c5de: 08 17 cp r16, r24 2c5e0: 19 07 cpc r17, r25 2c5e2: 0c f0 brlt .+2 ; 0x2c5e6 2c5e4: d9 c0 rjmp .+434 ; 0x2c798 if (_PINDA){ 2c5e6: 1c 9b sbis 0x03, 4 ; 3 2c5e8: bb c0 rjmp .+374 ; 0x2c760 z_trig = _Z; 2c5ea: 00 91 54 06 lds r16, 0x0654 ; 0x800654 2c5ee: 10 91 55 06 lds r17, 0x0655 ; 0x800655 2c5f2: 20 91 56 06 lds r18, 0x0656 ; 0x800656 2c5f6: 30 91 57 06 lds r19, 0x0657 ; 0x800657 break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); } /// slow down if (!_PINDA){ 2c5fa: 1c 99 sbic 0x03, 4 ; 3 2c5fc: 28 c0 rjmp .+80 ; 0x2c64e steps_to_go = MAX(0, _Z - min_z); 2c5fe: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c602: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c606: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c60a: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c60e: 8c 19 sub r24, r12 2c610: 9d 09 sbc r25, r13 2c612: 97 ff sbrs r25, 7 2c614: 02 c0 rjmp .+4 ; 0x2c61a 2c616: 90 e0 ldi r25, 0x00 ; 0 2c618: 80 e0 ldi r24, 0x00 ; 0 2c61a: 25 96 adiw r28, 0x05 ; 5 2c61c: 9f af std Y+63, r25 ; 0x3f 2c61e: 8e af std Y+62, r24 ; 0x3e 2c620: 25 97 sbiw r28, 0x05 ; 5 while (!_PINDA && _Z > min_z){ 2c622: 1c 99 sbic 0x03, 4 ; 3 2c624: 0c c0 rjmp .+24 ; 0x2c63e 2c626: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c62a: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c62e: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c632: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c636: c8 16 cp r12, r24 2c638: d9 06 cpc r13, r25 2c63a: 0c f4 brge .+2 ; 0x2c63e 2c63c: af c0 rjmp .+350 ; 0x2c79c go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go); --_Z_; } z_trig = _Z; 2c63e: 00 91 54 06 lds r16, 0x0654 ; 0x800654 2c642: 10 91 55 06 lds r17, 0x0655 ; 0x800655 2c646: 20 91 56 06 lds r18, 0x0656 ; 0x800656 2c64a: 30 91 57 06 lds r19, 0x0657 ; 0x800657 } /// slow down to stop but not lower than min_z while (_Z > min_z && current_delay_us < MAX_DELAY){ 2c64e: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c652: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c656: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c65a: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c65e: c8 16 cp r12, r24 2c660: d9 06 cpc r13, r25 2c662: 3c f4 brge .+14 ; 0x2c672 2c664: f7 01 movw r30, r14 2c666: 80 81 ld r24, Z 2c668: 91 81 ldd r25, Z+1 ; 0x01 2c66a: 80 31 cpi r24, 0x10 ; 16 2c66c: 97 42 sbci r25, 0x27 ; 39 2c66e: 08 f4 brcc .+2 ; 0x2c672 2c670: b2 c0 rjmp .+356 ; 0x2c7d6 2c672: 0c 19 sub r16, r12 2c674: 1d 09 sbc r17, r13 accelerate_1_step(Z_AXIS_MASK, -Z_ACCEL, current_delay_us, Z_MIN_DELAY); --_Z_; } if (d == 0){ 2c676: 31 10 cpse r3, r1 2c678: ca c0 rjmp .+404 ; 0x2c80e line_buffer[c] = (uint16_t)(z_trig - min_z); 2c67a: f3 01 movw r30, r6 2c67c: ee 0f add r30, r30 2c67e: ff 1f adc r31, r31 2c680: 21 e0 ldi r18, 0x01 ; 1 2c682: 30 e0 ldi r19, 0x00 ; 0 2c684: 2c 0f add r18, r28 2c686: 3d 1f adc r19, r29 2c688: e2 0f add r30, r18 2c68a: f3 1f adc r31, r19 2c68c: 11 83 std Z+1, r17 ; 0x01 2c68e: 00 83 st Z, r16 2c690: ff ef ldi r31, 0xFF ; 255 2c692: 6f 1a sub r6, r31 2c694: 7f 0a sbc r7, r31 2c696: 67 96 adiw r28, 0x17 ; 23 2c698: 2e ad ldd r18, Y+62 ; 0x3e 2c69a: 3f ad ldd r19, Y+63 ; 0x3f 2c69c: 67 97 sbiw r28, 0x17 ; 23 2c69e: 82 0e add r8, r18 2c6a0: 93 1e adc r9, r19 2c6a2: 2d 96 adiw r28, 0x0d ; 13 2c6a4: 8e ad ldd r24, Y+62 ; 0x3e 2c6a6: 9f ad ldd r25, Y+63 ; 0x3f 2c6a8: 2d 97 sbiw r28, 0x0d ; 13 2c6aa: 02 97 sbiw r24, 0x02 ; 2 2c6ac: 2d 96 adiw r28, 0x0d ; 13 2c6ae: 9f af std Y+63, r25 ; 0x3f 2c6b0: 8e af std Y+62, r24 ; 0x3e 2c6b2: 2d 97 sbiw r28, 0x0d ; 13 2c6b4: 2f 96 adiw r28, 0x0f ; 15 2c6b6: ee ad ldd r30, Y+62 ; 0x3e 2c6b8: ff ad ldd r31, Y+63 ; 0x3f 2c6ba: 2f 97 sbiw r28, 0x0f ; 15 2c6bc: 31 97 sbiw r30, 0x01 ; 1 2c6be: 2f 96 adiw r28, 0x0f ; 15 2c6c0: ff af std Y+63, r31 ; 0x3f 2c6c2: ee af std Y+62, r30 ; 0x3e 2c6c4: 2f 97 sbiw r28, 0x0f ; 15 //@size=242 DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive lcd_set_cursor(4,3); lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12 for (uint8_t c = 0; c < 32; c++){ ///< X axis 2c6c6: f0 e2 ldi r31, 0x20 ; 32 2c6c8: 6f 16 cp r6, r31 2c6ca: 71 04 cpc r7, r1 2c6cc: 09 f0 breq .+2 ; 0x2c6d0 2c6ce: 59 ce rjmp .-846 ; 0x2c382 2c6d0: 21 e0 ldi r18, 0x01 ; 1 2c6d2: 42 1a sub r4, r18 2c6d4: 51 08 sbc r5, r1 uint16_t steps_to_go; DBG(_n("Scan countdown: ")); for (uint8_t r = 0; r < 32; r++){ ///< Y axis for (uint8_t d = 0; d < 2; ++d){ 2c6d6: 31 e0 ldi r19, 0x01 ; 1 2c6d8: 33 12 cpse r3, r19 2c6da: 8d ce rjmp .-742 ; 0x2c3f6 2c6dc: 61 96 adiw r28, 0x11 ; 17 2c6de: 8e ad ldd r24, Y+62 ; 0x3e 2c6e0: 9f ad ldd r25, Y+63 ; 0x3f 2c6e2: 61 97 sbiw r28, 0x11 ; 17 2c6e4: 80 96 adiw r24, 0x20 ; 32 2c6e6: 61 96 adiw r28, 0x11 ; 17 2c6e8: 9f af std Y+63, r25 ; 0x3f 2c6ea: 8e af std Y+62, r24 ; 0x3e 2c6ec: 61 97 sbiw r28, 0x11 ; 17 2c6ee: 2b 96 adiw r28, 0x0b ; 11 2c6f0: ee ad ldd r30, Y+62 ; 0x3e 2c6f2: ff ad ldd r31, Y+63 ; 0x3f 2c6f4: 2b 97 sbiw r28, 0x0b ; 11 2c6f6: e0 5c subi r30, 0xC0 ; 192 2c6f8: ff 4f sbci r31, 0xFF ; 255 2c6fa: 2b 96 adiw r28, 0x0b ; 11 2c6fc: ff af std Y+63, r31 ; 0x3f 2c6fe: ee af std Y+62, r30 ; 0x3e 2c700: 2b 97 sbiw r28, 0x0b ; 11 2c702: 29 96 adiw r28, 0x09 ; 9 2c704: 2e ad ldd r18, Y+62 ; 0x3e 2c706: 3f ad ldd r19, Y+63 ; 0x3f 2c708: 29 97 sbiw r28, 0x09 ; 9 2c70a: 22 50 subi r18, 0x02 ; 2 2c70c: 31 09 sbc r19, r1 2c70e: 29 96 adiw r28, 0x09 ; 9 2c710: 3f af std Y+63, r19 ; 0x3f 2c712: 2e af std Y+62, r18 ; 0x3e 2c714: 29 97 sbiw r28, 0x09 ; 9 int16_t start_z; uint16_t steps_to_go; DBG(_n("Scan countdown: ")); for (uint8_t r = 0; r < 32; r++){ ///< Y axis 2c716: 23 2b or r18, r19 2c718: 09 f0 breq .+2 ; 0x2c71c 2c71a: 72 cd rjmp .-1308 ; 0x2c200 pixels[(uint16_t)r * 32 + (31 - c)] = (uint8_t)MIN((uint32_t)255, ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2); } } } } DBG(endl); 2c71c: 8b e9 ldi r24, 0x9B ; 155 2c71e: 9c e9 ldi r25, 0x9C ; 156 2c720: 9f 93 push r25 2c722: 8f 93 push r24 2c724: 0f 94 a2 a2 call 0x34544 ; 0x34544 2c728: 0f 90 pop r0 2c72a: 0f 90 pop r0 } 2c72c: c6 5a subi r28, 0xA6 ; 166 2c72e: df 4f sbci r29, 0xFF ; 255 2c730: 0f b6 in r0, 0x3f ; 63 2c732: f8 94 cli 2c734: de bf out 0x3e, r29 ; 62 2c736: 0f be out 0x3f, r0 ; 63 2c738: cd bf out 0x3d, r28 ; 61 2c73a: df 91 pop r29 2c73c: cf 91 pop r28 2c73e: 1f 91 pop r17 2c740: 0f 91 pop r16 2c742: ff 90 pop r15 2c744: ef 90 pop r14 2c746: df 90 pop r13 2c748: cf 90 pop r12 2c74a: bf 90 pop r11 2c74c: af 90 pop r10 2c74e: 9f 90 pop r9 2c750: 8f 90 pop r8 2c752: 7f 90 pop r7 2c754: 6f 90 pop r6 2c756: 5f 90 pop r5 2c758: 4f 90 pop r4 2c75a: 3f 90 pop r3 2c75c: 2f 90 pop r2 2c75e: 08 95 ret for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){ if (_PINDA){ z_trig = _Z; break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); 2c760: 28 ec ldi r18, 0xC8 ; 200 2c762: 30 e0 ldi r19, 0x00 ; 0 2c764: a7 01 movw r20, r14 2c766: 68 ee ldi r22, 0xE8 ; 232 2c768: 73 e0 ldi r23, 0x03 ; 3 2c76a: 84 e0 ldi r24, 0x04 ; 4 2c76c: 0e 94 45 d4 call 0x1a88a ; 0x1a88a /// move down to trigger sm4_set_dir(Z_AXIS, Z_MINUS); /// speed up current_delay_us = MAX_DELAY; for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){ 2c770: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c774: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c778: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c77c: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c780: 01 97 sbiw r24, 0x01 ; 1 2c782: a1 09 sbc r26, r1 2c784: b1 09 sbc r27, r1 2c786: 80 93 54 06 sts 0x0654, r24 ; 0x800654 2c78a: 90 93 55 06 sts 0x0655, r25 ; 0x800655 2c78e: a0 93 56 06 sts 0x0656, r26 ; 0x800656 2c792: b0 93 57 06 sts 0x0657, r27 ; 0x800657 2c796: 1b cf rjmp .-458 ; 0x2c5ce 2c798: 86 01 movw r16, r12 2c79a: 2f cf rjmp .-418 ; 0x2c5fa } /// slow down if (!_PINDA){ steps_to_go = MAX(0, _Z - min_z); while (!_PINDA && _Z > min_z){ go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go); 2c79c: 9e 01 movw r18, r28 2c79e: 2d 5b subi r18, 0xBD ; 189 2c7a0: 3f 4f sbci r19, 0xFF ; 255 2c7a2: a7 01 movw r20, r14 2c7a4: 68 ee ldi r22, 0xE8 ; 232 2c7a6: 73 e0 ldi r23, 0x03 ; 3 2c7a8: 84 e0 ldi r24, 0x04 ; 4 2c7aa: 0e 94 ec d4 call 0x1a9d8 ; 0x1a9d8 --_Z_; 2c7ae: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c7b2: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c7b6: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c7ba: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c7be: 01 97 sbiw r24, 0x01 ; 1 2c7c0: a1 09 sbc r26, r1 2c7c2: b1 09 sbc r27, r1 2c7c4: 80 93 54 06 sts 0x0654, r24 ; 0x800654 2c7c8: 90 93 55 06 sts 0x0655, r25 ; 0x800655 2c7cc: a0 93 56 06 sts 0x0656, r26 ; 0x800656 2c7d0: b0 93 57 06 sts 0x0657, r27 ; 0x800657 2c7d4: 26 cf rjmp .-436 ; 0x2c622 } z_trig = _Z; } /// slow down to stop but not lower than min_z while (_Z > min_z && current_delay_us < MAX_DELAY){ accelerate_1_step(Z_AXIS_MASK, -Z_ACCEL, current_delay_us, Z_MIN_DELAY); 2c7d6: 28 ec ldi r18, 0xC8 ; 200 2c7d8: 30 e0 ldi r19, 0x00 ; 0 2c7da: a7 01 movw r20, r14 2c7dc: 68 e1 ldi r22, 0x18 ; 24 2c7de: 7c ef ldi r23, 0xFC ; 252 2c7e0: 84 e0 ldi r24, 0x04 ; 4 2c7e2: 0e 94 45 d4 call 0x1a88a ; 0x1a88a --_Z_; 2c7e6: 80 91 54 06 lds r24, 0x0654 ; 0x800654 2c7ea: 90 91 55 06 lds r25, 0x0655 ; 0x800655 2c7ee: a0 91 56 06 lds r26, 0x0656 ; 0x800656 2c7f2: b0 91 57 06 lds r27, 0x0657 ; 0x800657 2c7f6: 01 97 sbiw r24, 0x01 ; 1 2c7f8: a1 09 sbc r26, r1 2c7fa: b1 09 sbc r27, r1 2c7fc: 80 93 54 06 sts 0x0654, r24 ; 0x800654 2c800: 90 93 55 06 sts 0x0655, r25 ; 0x800655 2c804: a0 93 56 06 sts 0x0656, r26 ; 0x800656 2c808: b0 93 57 06 sts 0x0657, r27 ; 0x800657 2c80c: 20 cf rjmp .-448 ; 0x2c64e line_buffer[c] = (uint16_t)(z_trig - min_z); } else { /// !!! data reversed in X // DBG(_n("%04x"), ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2); /// save average of both directions (filters effect of hysteresis) pixels[(uint16_t)r * 32 + (31 - c)] = (uint8_t)MIN((uint32_t)255, ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2); 2c80e: 2d 96 adiw r28, 0x0d ; 13 2c810: ee ad ldd r30, Y+62 ; 0x3e 2c812: ff ad ldd r31, Y+63 ; 0x3f 2c814: 2d 97 sbiw r28, 0x0d ; 13 2c816: 86 ad ldd r24, Z+62 ; 0x3e 2c818: 97 ad ldd r25, Z+63 ; 0x3f 2c81a: 01 2e mov r0, r17 2c81c: 00 0c add r0, r0 2c81e: 22 0b sbc r18, r18 2c820: 33 0b sbc r19, r19 2c822: 08 0f add r16, r24 2c824: 19 1f adc r17, r25 2c826: 21 1d adc r18, r1 2c828: 31 1d adc r19, r1 2c82a: 36 95 lsr r19 2c82c: 27 95 ror r18 2c82e: 17 95 ror r17 2c830: 07 95 ror r16 2c832: 0f 3f cpi r16, 0xFF ; 255 2c834: 11 05 cpc r17, r1 2c836: 21 05 cpc r18, r1 2c838: 31 05 cpc r19, r1 2c83a: 29 f0 breq .+10 ; 0x2c846 2c83c: 20 f0 brcs .+8 ; 0x2c846 2c83e: 0f ef ldi r16, 0xFF ; 255 2c840: 10 e0 ldi r17, 0x00 ; 0 2c842: 20 e0 ldi r18, 0x00 ; 0 2c844: 30 e0 ldi r19, 0x00 ; 0 2c846: 2f 96 adiw r28, 0x0f ; 15 2c848: ee ad ldd r30, Y+62 ; 0x3e 2c84a: ff ad ldd r31, Y+63 ; 0x3f 2c84c: 2f 97 sbiw r28, 0x0f ; 15 2c84e: 07 8f std Z+31, r16 ; 0x1f 2c850: 1f cf rjmp .-450 ; 0x2c690 0002c852 : 2c852: ef 92 push r14 2c854: ff 92 push r15 2c856: 0f 93 push r16 2c858: 1f 93 push r17 2c85a: cf 93 push r28 2c85c: df 93 push r29 2c85e: cd b7 in r28, 0x3d ; 61 2c860: de b7 in r29, 0x3e ; 62 2c862: 2f 97 sbiw r28, 0x0f ; 15 2c864: 0f b6 in r0, 0x3f ; 63 2c866: f8 94 cli 2c868: de bf out 0x3e, r29 ; 62 2c86a: 0f be out 0x3f, r0 ; 63 2c86c: cd bf out 0x3d, r28 ; 61 2c86e: 10 92 90 12 sts 0x1290, r1 ; 0x801290 2c872: 02 e9 ldi r16, 0x92 ; 146 2c874: 12 e1 ldi r17, 0x12 ; 18 2c876: ee 24 eor r14, r14 2c878: e3 94 inc r14 2c87a: f1 2c mov r15, r1 2c87c: d8 01 movw r26, r16 2c87e: 11 96 adiw r26, 0x01 ; 1 2c880: fc 92 st X, r15 2c882: ee 92 st -X, r14 2c884: 12 96 adiw r26, 0x02 ; 2 2c886: 1c 92 st X, r1 2c888: 12 97 sbiw r26, 0x02 ; 2 2c88a: 82 e8 ldi r24, 0x82 ; 130 2c88c: 13 96 adiw r26, 0x03 ; 3 2c88e: 8c 93 st X, r24 2c890: 40 e0 ldi r20, 0x00 ; 0 2c892: 60 e0 ldi r22, 0x00 ; 0 2c894: 87 e9 ldi r24, 0x97 ; 151 2c896: 92 e1 ldi r25, 0x12 ; 18 2c898: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 2c89c: 40 e0 ldi r20, 0x00 ; 0 2c89e: 60 e0 ldi r22, 0x00 ; 0 2c8a0: 8c e9 ldi r24, 0x9C ; 156 2c8a2: 92 e1 ldi r25, 0x12 ; 18 2c8a4: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 2c8a8: f8 01 movw r30, r16 2c8aa: 17 86 std Z+15, r1 ; 0x0f 2c8ac: 10 8a std Z+16, r1 ; 0x10 2c8ae: 11 8a std Z+17, r1 ; 0x11 2c8b0: 12 8a std Z+18, r1 ; 0x12 2c8b2: 13 8a std Z+19, r1 ; 0x13 2c8b4: 8a e0 ldi r24, 0x0A ; 10 2c8b6: 84 8b std Z+20, r24 ; 0x14 2c8b8: 40 e0 ldi r20, 0x00 ; 0 2c8ba: 60 e0 ldi r22, 0x00 ; 0 2c8bc: ce 01 movw r24, r28 2c8be: 01 96 adiw r24, 0x01 ; 1 2c8c0: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 2c8c4: 85 e0 ldi r24, 0x05 ; 5 2c8c6: fe 01 movw r30, r28 2c8c8: 31 96 adiw r30, 0x01 ; 1 2c8ca: de 01 movw r26, r28 2c8cc: 16 96 adiw r26, 0x06 ; 6 2c8ce: 01 90 ld r0, Z+ 2c8d0: 0d 92 st X+, r0 2c8d2: 8a 95 dec r24 2c8d4: e1 f7 brne .-8 ; 0x2c8ce 2c8d6: 85 e0 ldi r24, 0x05 ; 5 2c8d8: fe 01 movw r30, r28 2c8da: 36 96 adiw r30, 0x06 ; 6 2c8dc: a7 ea ldi r26, 0xA7 ; 167 2c8de: b2 e1 ldi r27, 0x12 ; 18 2c8e0: 01 90 ld r0, Z+ 2c8e2: 0d 92 st X+, r0 2c8e4: 8a 95 dec r24 2c8e6: e1 f7 brne .-8 ; 0x2c8e0 2c8e8: d8 01 movw r26, r16 2c8ea: 5a 96 adiw r26, 0x1a ; 26 2c8ec: 1c 92 st X, r1 2c8ee: 5a 97 sbiw r26, 0x1a ; 26 2c8f0: 5c 96 adiw r26, 0x1c ; 28 2c8f2: 1c 92 st X, r1 2c8f4: 1e 92 st -X, r1 2c8f6: 5b 97 sbiw r26, 0x1b ; 27 2c8f8: 87 ea ldi r24, 0xA7 ; 167 2c8fa: 92 e1 ldi r25, 0x12 ; 18 2c8fc: 0f 94 b6 50 call 0x2a16c ; 0x2a16c 2c900: f8 01 movw r30, r16 2c902: 81 8f std Z+25, r24 ; 0x19 2c904: 15 8e std Z+29, r1 ; 0x1d 2c906: 16 8e std Z+30, r1 ; 0x1e 2c908: 40 e0 ldi r20, 0x00 ; 0 2c90a: 60 e0 ldi r22, 0x00 ; 0 2c90c: 81 eb ldi r24, 0xB1 ; 177 2c90e: 92 e1 ldi r25, 0x12 ; 18 2c910: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 2c914: d8 01 movw r26, r16 2c916: 94 96 adiw r26, 0x24 ; 36 2c918: 1c 92 st X, r1 2c91a: 40 e0 ldi r20, 0x00 ; 0 2c91c: 60 e0 ldi r22, 0x00 ; 0 2c91e: ce 01 movw r24, r28 2c920: 0b 96 adiw r24, 0x0b ; 11 2c922: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 2c926: 85 e0 ldi r24, 0x05 ; 5 2c928: fe 01 movw r30, r28 2c92a: 3b 96 adiw r30, 0x0b ; 11 2c92c: de 01 movw r26, r28 2c92e: 11 96 adiw r26, 0x01 ; 1 2c930: 01 90 ld r0, Z+ 2c932: 0d 92 st X+, r0 2c934: 8a 95 dec r24 2c936: e1 f7 brne .-8 ; 0x2c930 2c938: 85 e0 ldi r24, 0x05 ; 5 2c93a: fe 01 movw r30, r28 2c93c: 31 96 adiw r30, 0x01 ; 1 2c93e: a7 eb ldi r26, 0xB7 ; 183 2c940: b2 e1 ldi r27, 0x12 ; 18 2c942: 01 90 ld r0, Z+ 2c944: 0d 92 st X+, r0 2c946: 8a 95 dec r24 2c948: e1 f7 brne .-8 ; 0x2c942 2c94a: f8 01 movw r30, r16 2c94c: 12 a6 std Z+42, r1 ; 0x2a 2c94e: 14 a6 std Z+44, r1 ; 0x2c 2c950: 13 a6 std Z+43, r1 ; 0x2b 2c952: 87 eb ldi r24, 0xB7 ; 183 2c954: 92 e1 ldi r25, 0x12 ; 18 2c956: 0f 94 b6 50 call 0x2a16c ; 0x2a16c 2c95a: d8 01 movw r26, r16 2c95c: 99 96 adiw r26, 0x29 ; 41 2c95e: 8c 93 st X, r24 2c960: 99 97 sbiw r26, 0x29 ; 41 2c962: dd 96 adiw r26, 0x3d ; 61 2c964: 1c 92 st X, r1 2c966: dd 97 sbiw r26, 0x3d ; 61 2c968: 81 e9 ldi r24, 0x91 ; 145 2c96a: 92 e1 ldi r25, 0x12 ; 18 2c96c: df 96 adiw r26, 0x3f ; 63 2c96e: 9c 93 st X, r25 2c970: 8e 93 st -X, r24 2c972: de 97 sbiw r26, 0x3e ; 62 2c974: f0 92 d3 12 sts 0x12D3, r15 ; 0x8012d3 2c978: e0 92 d2 12 sts 0x12D2, r14 ; 0x8012d2 2c97c: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 2c980: 1f ef ldi r17, 0xFF ; 255 2c982: 10 93 d5 12 sts 0x12D5, r17 ; 0x8012d5 2c986: 0f 94 0a 51 call 0x2a214 ; 0x2a214 2c98a: 80 93 d6 12 sts 0x12D6, r24 ; 0x8012d6 2c98e: 10 92 d7 12 sts 0x12D7, r1 ; 0x8012d7 2c992: 10 92 d8 12 sts 0x12D8, r1 ; 0x8012d8 2c996: 10 92 d9 12 sts 0x12D9, r1 ; 0x8012d9 2c99a: 10 92 db 12 sts 0x12DB, r1 ; 0x8012db 2c99e: 10 92 da 12 sts 0x12DA, r1 ; 0x8012da 2c9a2: 10 92 dd 12 sts 0x12DD, r1 ; 0x8012dd 2c9a6: 10 92 dc 12 sts 0x12DC, r1 ; 0x8012dc 2c9aa: 10 92 e0 12 sts 0x12E0, r1 ; 0x8012e0 2c9ae: 10 92 e1 12 sts 0x12E1, r1 ; 0x8012e1 2c9b2: 10 92 e2 12 sts 0x12E2, r1 ; 0x8012e2 2c9b6: 10 92 e3 12 sts 0x12E3, r1 ; 0x8012e3 2c9ba: 83 e0 ldi r24, 0x03 ; 3 2c9bc: 80 93 e6 12 sts 0x12E6, r24 ; 0x8012e6 2c9c0: 10 92 e7 12 sts 0x12E7, r1 ; 0x8012e7 2c9c4: 85 e1 ldi r24, 0x15 ; 21 2c9c6: 80 93 de 12 sts 0x12DE, r24 ; 0x8012de 2c9ca: 84 e1 ldi r24, 0x14 ; 20 2c9cc: 80 93 df 12 sts 0x12DF, r24 ; 0x8012df 2c9d0: 83 e6 ldi r24, 0x63 ; 99 2c9d2: 80 93 e8 12 sts 0x12E8, r24 ; 0x8012e8 2c9d6: 80 93 e9 12 sts 0x12E9, r24 ; 0x8012e9 2c9da: 10 92 ea 12 sts 0x12EA, r1 ; 0x8012ea 2c9de: 10 92 eb 12 sts 0x12EB, r1 ; 0x8012eb 2c9e2: 10 92 ec 12 sts 0x12EC, r1 ; 0x8012ec 2c9e6: 10 92 ed 12 sts 0x12ED, r1 ; 0x8012ed 2c9ea: 10 92 ee 12 sts 0x12EE, r1 ; 0x8012ee 2c9ee: 10 92 ef 12 sts 0x12EF, r1 ; 0x8012ef 2c9f2: 10 92 f0 12 sts 0x12F0, r1 ; 0x8012f0 2c9f6: 10 92 f1 12 sts 0x12F1, r1 ; 0x8012f1 2c9fa: 10 92 f2 12 sts 0x12F2, r1 ; 0x8012f2 2c9fe: 10 92 f3 12 sts 0x12F3, r1 ; 0x8012f3 2ca02: 10 92 f4 12 sts 0x12F4, r1 ; 0x8012f4 2ca06: 10 92 f5 12 sts 0x12F5, r1 ; 0x8012f5 2ca0a: 10 92 f7 12 sts 0x12F7, r1 ; 0x8012f7 2ca0e: 10 92 f6 12 sts 0x12F6, r1 ; 0x8012f6 2ca12: 10 92 f8 12 sts 0x12F8, r1 ; 0x8012f8 2ca16: 8e e2 ldi r24, 0x2E ; 46 2ca18: 90 e8 ldi r25, 0x80 ; 128 2ca1a: 90 93 fa 12 sts 0x12FA, r25 ; 0x8012fa 2ca1e: 80 93 f9 12 sts 0x12F9, r24 ; 0x8012f9 2ca22: 10 93 fb 12 sts 0x12FB, r17 ; 0x8012fb 2ca26: 10 93 fc 12 sts 0x12FC, r17 ; 0x8012fc 2ca2a: 10 92 fe 12 sts 0x12FE, r1 ; 0x8012fe 2ca2e: 10 92 fd 12 sts 0x12FD, r1 ; 0x8012fd 2ca32: 10 93 ff 12 sts 0x12FF, r17 ; 0x8012ff 2ca36: 82 e0 ldi r24, 0x02 ; 2 2ca38: 80 93 00 13 sts 0x1300, r24 ; 0x801300 2ca3c: 10 92 01 13 sts 0x1301, r1 ; 0x801301 2ca40: 10 92 02 13 sts 0x1302, r1 ; 0x801302 2ca44: 10 92 03 13 sts 0x1303, r1 ; 0x801303 2ca48: 10 92 04 13 sts 0x1304, r1 ; 0x801304 2ca4c: 10 92 06 13 sts 0x1306, r1 ; 0x801306 2ca50: 10 92 05 13 sts 0x1305, r1 ; 0x801305 2ca54: 10 92 08 13 sts 0x1308, r1 ; 0x801308 2ca58: 10 92 07 13 sts 0x1307, r1 ; 0x801307 2ca5c: 0f 94 e3 7b call 0x2f7c6 ; 0x2f7c6 2ca60: e5 ed ldi r30, 0xD5 ; 213 2ca62: f3 e1 ldi r31, 0x13 ; 19 2ca64: 10 92 5d 14 sts 0x145D, r1 ; 0x80145d 2ca68: 10 92 60 14 sts 0x1460, r1 ; 0x801460 2ca6c: 10 92 82 14 sts 0x1482, r1 ; 0x801482 2ca70: 10 92 85 14 sts 0x1485, r1 ; 0x801485 2ca74: 89 e1 ldi r24, 0x19 ; 25 2ca76: 80 93 44 16 sts 0x1644, r24 ; 0x801644 2ca7a: 10 92 47 16 sts 0x1647, r1 ; 0x801647 2ca7e: 10 92 48 16 sts 0x1648, r1 ; 0x801648 2ca82: 10 92 60 16 sts 0x1660, r1 ; 0x801660 2ca86: 10 92 67 16 sts 0x1667, r1 ; 0x801667 2ca8a: 10 92 6a 16 sts 0x166A, r1 ; 0x80166a 2ca8e: 10 92 e8 16 sts 0x16E8, r1 ; 0x8016e8 2ca92: 10 92 ea 16 sts 0x16EA, r1 ; 0x8016ea 2ca96: 10 92 e9 16 sts 0x16E9, r1 ; 0x8016e9 2ca9a: 10 92 79 15 sts 0x1579, r1 ; 0x801579 2ca9e: 10 92 78 15 sts 0x1578, r1 ; 0x801578 2caa2: 10 92 e4 16 sts 0x16E4, r1 ; 0x8016e4 2caa6: 10 92 e5 16 sts 0x16E5, r1 ; 0x8016e5 2caaa: 10 92 e6 16 sts 0x16E6, r1 ; 0x8016e6 2caae: 10 92 e7 16 sts 0x16E7, r1 ; 0x8016e7 2cab2: 10 92 eb 16 sts 0x16EB, r1 ; 0x8016eb 2cab6: 10 92 ec 16 sts 0x16EC, r1 ; 0x8016ec 2caba: 10 92 ed 16 sts 0x16ED, r1 ; 0x8016ed 2cabe: 10 92 ee 16 sts 0x16EE, r1 ; 0x8016ee 2cac2: 12 82 std Z+2, r1 ; 0x02 2cac4: 13 82 std Z+3, r1 ; 0x03 2cac6: 10 82 st Z, r1 2cac8: 11 82 std Z+1, r1 ; 0x01 2caca: 10 92 77 15 sts 0x1577, r1 ; 0x801577 2cace: 10 92 8a 16 sts 0x168A, r1 ; 0x80168a 2cad2: e5 ea ldi r30, 0xA5 ; 165 2cad4: f4 e1 ldi r31, 0x14 ; 20 2cad6: 82 ed ldi r24, 0xD2 ; 210 2cad8: df 01 movw r26, r30 2cada: 1d 92 st X+, r1 2cadc: 8a 95 dec r24 2cade: e9 f7 brne .-6 ; 0x2cada 2cae0: 10 92 26 14 sts 0x1426, r1 ; 0x801426 2cae4: 10 92 25 14 sts 0x1425, r1 ; 0x801425 2cae8: 10 92 24 14 sts 0x1424, r1 ; 0x801424 2caec: 88 ee ldi r24, 0xE8 ; 232 2caee: 96 e1 ldi r25, 0x16 ; 22 2caf0: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> 2caf4: ee ec ldi r30, 0xCE ; 206 2caf6: f3 e1 ldi r31, 0x13 ; 19 2caf8: 11 82 std Z+1, r1 ; 0x01 2cafa: 12 82 std Z+2, r1 ; 0x02 2cafc: 13 82 std Z+3, r1 ; 0x03 2cafe: 14 82 std Z+4, r1 ; 0x04 2cb00: 15 82 std Z+5, r1 ; 0x05 2cb02: 16 82 std Z+6, r1 ; 0x06 2cb04: 10 83 st Z, r17 2cb06: e1 ef ldi r30, 0xF1 ; 241 2cb08: f6 e1 ldi r31, 0x16 ; 22 2cb0a: 15 82 std Z+5, r1 ; 0x05 2cb0c: 17 82 std Z+7, r1 ; 0x07 2cb0e: 16 82 std Z+6, r1 ; 0x06 2cb10: 11 86 std Z+9, r1 ; 0x09 2cb12: 13 86 std Z+11, r1 ; 0x0b 2cb14: 12 86 std Z+10, r1 ; 0x0a 2cb16: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2cb1a: 60 93 07 17 sts 0x1707, r22 ; 0x801707 2cb1e: 70 93 08 17 sts 0x1708, r23 ; 0x801708 2cb22: 80 93 09 17 sts 0x1709, r24 ; 0x801709 2cb26: 90 93 0a 17 sts 0x170A, r25 ; 0x80170a 2cb2a: 2f 96 adiw r28, 0x0f ; 15 2cb2c: 0f b6 in r0, 0x3f ; 63 2cb2e: f8 94 cli 2cb30: de bf out 0x3e, r29 ; 62 2cb32: 0f be out 0x3f, r0 ; 63 2cb34: cd bf out 0x3d, r28 ; 61 2cb36: df 91 pop r29 2cb38: cf 91 pop r28 2cb3a: 1f 91 pop r17 2cb3c: 0f 91 pop r16 2cb3e: ff 90 pop r15 2cb40: ef 90 pop r14 2cb42: 08 95 ret 0002cb44 : 2cb44: 42 e0 ldi r20, 0x02 ; 2 2cb46: 0e 94 46 7a call 0xf48c ; 0xf48c } void MarlinSerial::println(double n, int digits) { print(n, digits); println(); 2cb4a: 0c 94 bc 7a jmp 0xf578 ; 0xf578 0002cb4e : void MMU2::get_statistics() { logic.Statistics(); } uint8_t __attribute__((noinline)) MMU2::get_current_tool() const { return extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : extruder; 2cb4e: 80 91 e8 12 lds r24, 0x12E8 ; 0x8012e8 2cb52: 83 36 cpi r24, 0x63 ; 99 2cb54: 09 f4 brne .+2 ; 0x2cb58 2cb56: 8f ef ldi r24, 0xFF ; 255 } 2cb58: 08 95 ret 0002cb5a : , tmcFailures(0) { } void MMU2::Status() { // Useful information to see during bootup and change state SERIAL_ECHOPGM("MMU is "); 2cb5a: 8c ed ldi r24, 0xDC ; 220 2cb5c: 91 ea ldi r25, 0xA1 ; 161 2cb5e: 0e 94 c4 7a call 0xf588 ; 0xf588 uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_MMU_ENABLED, 0); 2cb62: 60 e0 ldi r22, 0x00 ; 0 2cb64: 8c ea ldi r24, 0xAC ; 172 2cb66: 9c e0 ldi r25, 0x0C ; 12 2cb68: 0e 94 5d 78 call 0xf0ba ; 0xf0ba if (status == 1) { 2cb6c: 81 30 cpi r24, 0x01 ; 1 2cb6e: 21 f4 brne .+8 ; 0x2cb78 SERIAL_ECHOLNRPGM(_O(MSG_ON)); 2cb70: 8c e9 ldi r24, 0x9C ; 156 2cb72: 92 e6 ldi r25, 0x62 ; 98 } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); 2cb74: 0c 94 bd 7c jmp 0xf97a ; 0xf97a 2cb78: 86 e9 ldi r24, 0x96 ; 150 2cb7a: 92 e6 ldi r25, 0x62 ; 98 2cb7c: fb cf rjmp .-10 ; 0x2cb74 0002cb7e : print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 2cb7e: bc 01 movw r22, r24 2cb80: 99 0f add r25, r25 2cb82: 88 0b sbc r24, r24 2cb84: 99 0b sbc r25, r25 2cb86: 0e 94 2a 7a call 0xf454 ; 0xf454 } void MarlinSerial::println(int n, int base) { print(n, base); println(); 2cb8a: 0c 94 bc 7a jmp 0xf578 ; 0xf578 0002cb8e : uint8_t MMU2::get_tool_change_tool() const { return tool_change_extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : tool_change_extruder; } void MMU2::SetCurrentTool(uint8_t ex){ 2cb8e: cf 93 push r28 2cb90: c8 2f mov r28, r24 extruder = ex; 2cb92: 80 93 e8 12 sts 0x12E8, r24 ; 0x8012e8 MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); 2cb96: 8e ec ldi r24, 0xCE ; 206 2cb98: 91 ea ldi r25, 0xA1 ; 161 2cb9a: 0e 94 c4 7a call 0xf588 ; 0xf588 2cb9e: 82 ec ldi r24, 0xC2 ; 194 2cba0: 91 ea ldi r25, 0xA1 ; 161 2cba2: 0e 94 c4 7a call 0xf588 ; 0xf588 2cba6: 88 eb ldi r24, 0xB8 ; 184 2cba8: 91 ea ldi r25, 0xA1 ; 161 2cbaa: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN((int)ex); 2cbae: 8c 2f mov r24, r28 2cbb0: 90 e0 ldi r25, 0x00 ; 0 } 2cbb2: cf 91 pop r28 } void MMU2::SetCurrentTool(uint8_t ex){ extruder = ex; MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); SERIAL_ECHOLN((int)ex); 2cbb4: 0d 94 bf 65 jmp 0x2cb7e ; 0x2cb7e 0002cbb8 : return 0; } } //------------------------------------------------------------------------------ void Sd2Card::chipSelectHigh() { WRITE(SDSS, 1); 2cbb8: 28 9a sbi 0x05, 0 ; 5 } 2cbba: 08 95 ret 0002cbbc : spiRate_ = sckRateID; return true; } //------------------------------------------------------------------------------ // wait for card to go not busy bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { 2cbbc: 0f 93 push r16 2cbbe: 1f 93 push r17 2cbc0: cf 93 push r28 2cbc2: df 93 push r29 2cbc4: ec 01 movw r28, r24 uint16_t t0 = _millis(); 2cbc6: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2cbca: 8b 01 movw r16, r22 while (spiRec() != 0XFF) { 2cbcc: 0f 94 ca 28 call 0x25194 ; 0x25194 2cbd0: 8f 3f cpi r24, 0xFF ; 255 2cbd2: 69 f0 breq .+26 ; 0x2cbee if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail; 2cbd4: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2cbd8: 60 1b sub r22, r16 2cbda: 71 0b sbc r23, r17 2cbdc: 6c 17 cp r22, r28 2cbde: 7d 07 cpc r23, r29 2cbe0: a8 f3 brcs .-22 ; 0x2cbcc } return true; fail: return false; 2cbe2: 80 e0 ldi r24, 0x00 ; 0 } 2cbe4: df 91 pop r29 2cbe6: cf 91 pop r28 2cbe8: 1f 91 pop r17 2cbea: 0f 91 pop r16 2cbec: 08 95 ret bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { uint16_t t0 = _millis(); while (spiRec() != 0XFF) { if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail; } return true; 2cbee: 81 e0 ldi r24, 0x01 ; 1 2cbf0: f9 cf rjmp .-14 ; 0x2cbe4 0002cbf2 : lastnr++; } void CardReader::closefile(bool store_location) { file.sync(); 2cbf2: 87 e6 ldi r24, 0x67 ; 103 2cbf4: 96 e1 ldi r25, 0x16 ; 22 2cbf6: 0f 94 b4 2e call 0x25d68 ; 0x25d68 file.close(); 2cbfa: 87 e6 ldi r24, 0x67 ; 103 2cbfc: 96 e1 ldi r25, 0x16 ; 22 2cbfe: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 saving = false; 2cc02: e5 ed ldi r30, 0xD5 ; 213 2cc04: f3 e1 ldi r31, 0x13 ; 19 2cc06: 10 82 st Z, r1 logging = false; 2cc08: 11 82 std Z+1, r1 ; 0x01 // so one can unplug the printer and continue printing the next day. } } 2cc0a: 08 95 ret 0002cc0c : //! If printing from sd card, position in file is saved. //! If printing from USB, line number is saved. //! //! @param z_move //! @param e_move void stop_and_save_print_to_ram(float z_move, float e_move) 2cc0c: cf 92 push r12 2cc0e: df 92 push r13 2cc10: ef 92 push r14 2cc12: ff 92 push r15 2cc14: 0f 93 push r16 2cc16: 1f 93 push r17 2cc18: cf 93 push r28 2cc1a: df 93 push r29 { if (saved_printing) return; 2cc1c: 20 91 73 12 lds r18, 0x1273 ; 0x801273 2cc20: 21 11 cpse r18, r1 2cc22: d9 c0 rjmp .+434 ; 0x2cdd6 2cc24: 09 2f mov r16, r25 2cc26: 18 2f mov r17, r24 2cc28: eb 01 movw r28, r22 cli(); 2cc2a: f8 94 cli void save_print_file_state() { uint8_t nlines; uint16_t sdlen_cmdqueue; uint16_t sdlen_planner; if (card.sdprinting) { 2cc2c: 80 91 d7 13 lds r24, 0x13D7 ; 0x8013d7 2cc30: 88 23 and r24, r24 2cc32: 09 f4 brne .+2 ; 0x2cc36 2cc34: d9 c0 rjmp .+434 ; 0x2cde8 saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue 2cc36: 80 91 49 12 lds r24, 0x1249 ; 0x801249 2cc3a: 90 91 4a 12 lds r25, 0x124A ; 0x80124a 2cc3e: a0 91 4b 12 lds r26, 0x124B ; 0x80124b 2cc42: b0 91 4c 12 lds r27, 0x124C ; 0x80124c 2cc46: 80 93 45 12 sts 0x1245, r24 ; 0x801245 2cc4a: 90 93 46 12 sts 0x1246, r25 ; 0x801246 2cc4e: a0 93 47 12 sts 0x1247, r26 ; 0x801247 2cc52: b0 93 48 12 sts 0x1248, r27 ; 0x801248 sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner 2cc56: 0f 94 76 3c call 0x278ec ; 0x278ec saved_sdpos -= sdlen_planner; 2cc5a: c0 90 45 12 lds r12, 0x1245 ; 0x801245 2cc5e: d0 90 46 12 lds r13, 0x1246 ; 0x801246 2cc62: e0 90 47 12 lds r14, 0x1247 ; 0x801247 2cc66: f0 90 48 12 lds r15, 0x1248 ; 0x801248 2cc6a: c8 1a sub r12, r24 2cc6c: d9 0a sbc r13, r25 2cc6e: e1 08 sbc r14, r1 2cc70: f1 08 sbc r15, r1 2cc72: c0 92 45 12 sts 0x1245, r12 ; 0x801245 2cc76: d0 92 46 12 sts 0x1246, r13 ; 0x801246 2cc7a: e0 92 47 12 sts 0x1247, r14 ; 0x801247 2cc7e: f0 92 48 12 sts 0x1248, r15 ; 0x801248 sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue 2cc82: 0e 94 03 79 call 0xf206 ; 0xf206 saved_sdpos -= sdlen_cmdqueue; 2cc86: c8 1a sub r12, r24 2cc88: d9 0a sbc r13, r25 2cc8a: e1 08 sbc r14, r1 2cc8c: f1 08 sbc r15, r1 2cc8e: c0 92 45 12 sts 0x1245, r12 ; 0x801245 2cc92: d0 92 46 12 sts 0x1246, r13 ; 0x801246 2cc96: e0 92 47 12 sts 0x1247, r14 ; 0x801247 2cc9a: f0 92 48 12 sts 0x1248, r15 ; 0x801248 saved_printing_type = PowerPanic::PRINT_TYPE_SD; 2cc9e: 10 92 79 02 sts 0x0279, r1 ; 0x800279 cli(); save_print_file_state(); // save the global state at planning time const bool pos_invalid = mesh_bed_leveling_flag || homing_flag; 2cca2: 80 91 72 12 lds r24, 0x1272 ; 0x801272 2cca6: f0 90 71 12 lds r15, 0x1271 ; 0x801271 2ccaa: 81 11 cpse r24, r1 2ccac: f8 2e mov r15, r24 //not sd printing nor usb printing } } void save_planner_global_state() { if (current_block && !(mesh_bed_leveling_flag || homing_flag)) 2ccae: 20 91 51 12 lds r18, 0x1251 ; 0x801251 2ccb2: 30 91 52 12 lds r19, 0x1252 ; 0x801252 2ccb6: 21 15 cp r18, r1 2ccb8: 31 05 cpc r19, r1 2ccba: 09 f4 brne .+2 ; 0x2ccbe 2ccbc: d1 c0 rjmp .+418 ; 0x2ce60 2ccbe: 81 11 cpse r24, r1 2ccc0: cf c0 rjmp .+414 ; 0x2ce60 2ccc2: 80 91 71 12 lds r24, 0x1271 ; 0x801271 2ccc6: 81 11 cpse r24, r1 2ccc8: cb c0 rjmp .+406 ; 0x2ce60 { memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position)); 2ccca: f9 01 movw r30, r18 2cccc: e8 5a subi r30, 0xA8 ; 168 2ccce: ff 4f sbci r31, 0xFF ; 255 2ccd0: 80 e1 ldi r24, 0x10 ; 16 2ccd2: ae e7 ldi r26, 0x7E ; 126 2ccd4: b2 e0 ldi r27, 0x02 ; 2 2ccd6: 01 90 ld r0, Z+ 2ccd8: 0d 92 st X+, r0 2ccda: 8a 95 dec r24 2ccdc: e1 f7 brne .-8 ; 0x2ccd6 saved_feedrate2 = current_block->gcode_feedrate; 2ccde: f9 01 movw r30, r18 2cce0: e6 59 subi r30, 0x96 ; 150 2cce2: ff 4f sbci r31, 0xFF ; 255 2cce4: 80 81 ld r24, Z 2cce6: 91 81 ldd r25, Z+1 ; 0x01 2cce8: 90 93 50 12 sts 0x1250, r25 ; 0x801250 2ccec: 80 93 4f 12 sts 0x124F, r24 ; 0x80124f saved_segment_idx = current_block->segment_idx; 2ccf0: 28 59 subi r18, 0x98 ; 152 2ccf2: 3f 4f sbci r19, 0xFF ; 255 2ccf4: f9 01 movw r30, r18 2ccf6: 80 81 ld r24, Z 2ccf8: 91 81 ldd r25, Z+1 ; 0x01 2ccfa: 90 93 4e 12 sts 0x124E, r25 ; 0x80124e 2ccfe: 80 93 4d 12 sts 0x124D, r24 ; 0x80124d // save the global state at planning time const bool pos_invalid = mesh_bed_leveling_flag || homing_flag; save_planner_global_state(); planner_abort_hard(); //abort printing 2cd02: 0f 94 fb 4e call 0x29df6 ; 0x29df6 memcpy(saved_pos, current_position, sizeof(saved_pos)); 2cd06: 80 e1 ldi r24, 0x10 ; 16 2cd08: e1 e6 ldi r30, 0x61 ; 97 2cd0a: f2 e1 ldi r31, 0x12 ; 18 2cd0c: a0 e9 ldi r26, 0x90 ; 144 2cd0e: b2 e0 ldi r27, 0x02 ; 2 2cd10: 01 90 ld r0, Z+ 2cd12: 0d 92 st X+, r0 2cd14: 8a 95 dec r24 2cd16: e1 f7 brne .-8 ; 0x2cd10 if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID; 2cd18: ff 20 and r15, r15 2cd1a: 61 f0 breq .+24 ; 0x2cd34 2cd1c: 80 e0 ldi r24, 0x00 ; 0 2cd1e: 90 e0 ldi r25, 0x00 ; 0 2cd20: a0 e8 ldi r26, 0x80 ; 128 2cd22: bf eb ldi r27, 0xBF ; 191 2cd24: 80 93 90 02 sts 0x0290, r24 ; 0x800290 2cd28: 90 93 91 02 sts 0x0291, r25 ; 0x800291 2cd2c: a0 93 92 02 sts 0x0292, r26 ; 0x800292 2cd30: b0 93 93 02 sts 0x0293, r27 ; 0x800293 saved_feedmultiply2 = feedmultiply; //save feedmultiply 2cd34: 80 91 8e 02 lds r24, 0x028E ; 0x80028e 2cd38: 90 91 8f 02 lds r25, 0x028F ; 0x80028f 2cd3c: 90 93 60 12 sts 0x1260, r25 ; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1> 2cd40: 80 93 5f 12 sts 0x125F, r24 ; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498> saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder); 2cd44: 80 91 5d 12 lds r24, 0x125D ; 0x80125d 2cd48: 90 91 5e 12 lds r25, 0x125E ; 0x80125e 2cd4c: 90 93 5c 12 sts 0x125C, r25 ; 0x80125c 2cd50: 80 93 5b 12 sts 0x125B, r24 ; 0x80125b saved_bed_temperature = (uint8_t)degTargetBed(); 2cd54: 80 91 59 12 lds r24, 0x1259 ; 0x801259 2cd58: 80 93 58 12 sts 0x1258, r24 ; 0x801258 saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; 2cd5c: 80 91 57 12 lds r24, 0x1257 ; 0x801257 2cd60: 83 fb bst r24, 3 2cd62: 88 27 eor r24, r24 2cd64: 80 f9 bld r24, 0 2cd66: 80 93 56 12 sts 0x1256, r24 ; 0x801256 saved_fan_speed = fanSpeed; 2cd6a: 80 91 55 12 lds r24, 0x1255 ; 0x801255 2cd6e: 80 93 54 12 sts 0x1254, r24 ; 0x801254 cmdqueue_reset(); //empty cmdqueue 2cd72: 0e 94 3c 85 call 0x10a78 ; 0x10a78 card.sdprinting = false; 2cd76: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 // card.closefile(); saved_printing = true; 2cd7a: 81 e0 ldi r24, 0x01 ; 1 2cd7c: 80 93 73 12 sts 0x1273, r24 ; 0x801273 // We may have missed a stepper timer interrupt. Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); 2cd80: 0f 94 4c 1b call 0x23698 ; 0x23698 sei(); 2cd84: 78 94 sei if ((z_move != 0) || (e_move != 0)) { // extruder or z move 2cd86: 20 e0 ldi r18, 0x00 ; 0 2cd88: 30 e0 ldi r19, 0x00 ; 0 2cd8a: a9 01 movw r20, r18 2cd8c: f8 01 movw r30, r16 2cd8e: 6c 2f mov r22, r28 2cd90: 7d 2f mov r23, r29 2cd92: 8f 2f mov r24, r31 2cd94: 90 2f mov r25, r16 2cd96: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2cd9a: 88 23 and r24, r24 2cd9c: e1 f0 breq .+56 ; 0x2cdd6 // move away from the print. if(e_move) { // First unretract (relative extrusion) if(!saved_extruder_relative_mode){ 2cd9e: 80 91 56 12 lds r24, 0x1256 ; 0x801256 2cda2: 81 11 cpse r24, r1 2cda4: 05 c0 rjmp .+10 ; 0x2cdb0 enquecommand_P(MSG_M83); 2cda6: 61 e0 ldi r22, 0x01 ; 1 2cda8: 83 eb ldi r24, 0xB3 ; 179 2cdaa: 9c e6 ldi r25, 0x6C ; 108 2cdac: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 // A single sprintf may not be faster, but is definitely 20B shorter // than a sequence of commands building the string piece by piece // A snprintf would have been a safer call, but since it is not used // in the whole program, its implementation would bring more bytes to the total size // The behavior of dtostrf 8,3 should be roughly the same as %-0.3 enquecommandf_P(G1_E_F2700, e_move); 2cdb0: 0f 93 push r16 2cdb2: 1f 93 push r17 2cdb4: df 93 push r29 2cdb6: cf 93 push r28 2cdb8: 83 ea ldi r24, 0xA3 ; 163 2cdba: 9c e6 ldi r25, 0x6C ; 108 2cdbc: 9f 93 push r25 2cdbe: 8f 93 push r24 2cdc0: 0e 94 b7 8f call 0x11f6e ; 0x11f6e 2cdc4: 81 e0 ldi r24, 0x01 ; 1 2cdc6: 80 93 53 12 sts 0x1253, r24 ; 0x801253 2cdca: 0f 90 pop r0 2cdcc: 0f 90 pop r0 2cdce: 0f 90 pop r0 2cdd0: 0f 90 pop r0 2cdd2: 0f 90 pop r0 2cdd4: 0f 90 pop r0 // If this call is invoked from the main Arduino loop() function, let the caller know that the command // in the command queue is not the original command, but a new one, so it should not be removed from the queue. repeatcommand_front(); } } 2cdd6: df 91 pop r29 2cdd8: cf 91 pop r28 2cdda: 1f 91 pop r17 2cddc: 0f 91 pop r16 2cdde: ff 90 pop r15 2cde0: ef 90 pop r14 2cde2: df 90 pop r13 2cde4: cf 90 pop r12 2cde6: 08 95 ret saved_sdpos -= sdlen_planner; sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue saved_sdpos -= sdlen_cmdqueue; saved_printing_type = PowerPanic::PRINT_TYPE_SD; } else if (usb_timer.running()) { //reuse saved_sdpos for storing line number 2cde8: 80 91 42 12 lds r24, 0x1242 ; 0x801242 2cdec: 88 23 and r24, r24 2cdee: b1 f1 breq .+108 ; 0x2ce5c saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue 2cdf0: 80 91 3e 12 lds r24, 0x123E ; 0x80123e 2cdf4: 90 91 3f 12 lds r25, 0x123F ; 0x80123f 2cdf8: a0 91 40 12 lds r26, 0x1240 ; 0x801240 2cdfc: b0 91 41 12 lds r27, 0x1241 ; 0x801241 2ce00: 80 93 45 12 sts 0x1245, r24 ; 0x801245 2ce04: 90 93 46 12 sts 0x1246, r25 ; 0x801246 2ce08: a0 93 47 12 sts 0x1247, r26 ; 0x801247 2ce0c: b0 93 48 12 sts 0x1248, r27 ; 0x801248 //reuse planner_calc_sd_length function for getting number of lines of commands in planner: nlines = planner_calc_sd_length(); //number of lines of commands in planner 2ce10: 0f 94 76 3c call 0x278ec ; 0x278ec saved_sdpos -= nlines; 2ce14: 40 91 45 12 lds r20, 0x1245 ; 0x801245 2ce18: 50 91 46 12 lds r21, 0x1246 ; 0x801246 2ce1c: 60 91 47 12 lds r22, 0x1247 ; 0x801247 2ce20: 70 91 48 12 lds r23, 0x1248 ; 0x801248 2ce24: 48 1b sub r20, r24 2ce26: 51 09 sbc r21, r1 2ce28: 61 09 sbc r22, r1 2ce2a: 71 09 sbc r23, r1 saved_sdpos -= buflen; //number of blocks in cmd buffer 2ce2c: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 2ce30: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 2ce34: 09 2e mov r0, r25 2ce36: 00 0c add r0, r0 2ce38: aa 0b sbc r26, r26 2ce3a: bb 0b sbc r27, r27 2ce3c: 48 1b sub r20, r24 2ce3e: 59 0b sbc r21, r25 2ce40: 6a 0b sbc r22, r26 2ce42: 7b 0b sbc r23, r27 2ce44: 40 93 45 12 sts 0x1245, r20 ; 0x801245 2ce48: 50 93 46 12 sts 0x1246, r21 ; 0x801246 2ce4c: 60 93 47 12 sts 0x1247, r22 ; 0x801247 2ce50: 70 93 48 12 sts 0x1248, r23 ; 0x801248 saved_printing_type = PowerPanic::PRINT_TYPE_HOST; 2ce54: 81 e0 ldi r24, 0x01 ; 1 } else { saved_printing_type = PowerPanic::PRINT_TYPE_NONE; 2ce56: 80 93 79 02 sts 0x0279, r24 ; 0x800279 2ce5a: 23 cf rjmp .-442 ; 0x2cca2 2ce5c: 82 e0 ldi r24, 0x02 ; 2 2ce5e: fb cf rjmp .-10 ; 0x2ce56 saved_feedrate2 = current_block->gcode_feedrate; saved_segment_idx = current_block->segment_idx; } else { saved_start_position[0] = SAVED_START_POSITION_UNSET; 2ce60: 80 e0 ldi r24, 0x00 ; 0 2ce62: 90 e0 ldi r25, 0x00 ; 0 2ce64: a0 e8 ldi r26, 0x80 ; 128 2ce66: bf eb ldi r27, 0xBF ; 191 2ce68: 80 93 7e 02 sts 0x027E, r24 ; 0x80027e 2ce6c: 90 93 7f 02 sts 0x027F, r25 ; 0x80027f 2ce70: a0 93 80 02 sts 0x0280, r26 ; 0x800280 2ce74: b0 93 81 02 sts 0x0281, r27 ; 0x800281 saved_feedrate2 = feedrate; 2ce78: 60 91 7a 02 lds r22, 0x027A ; 0x80027a 2ce7c: 70 91 7b 02 lds r23, 0x027B ; 0x80027b 2ce80: 80 91 7c 02 lds r24, 0x027C ; 0x80027c 2ce84: 90 91 7d 02 lds r25, 0x027D ; 0x80027d 2ce88: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 2ce8c: 70 93 50 12 sts 0x1250, r23 ; 0x801250 2ce90: 60 93 4f 12 sts 0x124F, r22 ; 0x80124f saved_segment_idx = 0; 2ce94: 10 92 4e 12 sts 0x124E, r1 ; 0x80124e 2ce98: 10 92 4d 12 sts 0x124D, r1 ; 0x80124d 2ce9c: 32 cf rjmp .-412 ; 0x2cd02 0002ce9e : // "allow_recovery". If recovery is allowed, this forces a printer-initiated instantanenous pause // (just like an LCD pause) that bypasses the host pausing functionality. In this state the printer // is kept in busy state and *must* be recovered from the LCD. void ThermalStop(bool allow_recovery) { if(Stopped == false) { 2ce9e: 80 91 3b 12 lds r24, 0x123B ; 0x80123b 2cea2: 81 11 cpse r24, r1 2cea4: 24 c0 rjmp .+72 ; 0x2ceee Stopped = true; 2cea6: 81 e0 ldi r24, 0x01 ; 1 2cea8: 80 93 3b 12 sts 0x123B, r24 ; 0x80123b saved_extruder_temperature = ext_temp; saved_fan_speed = fan_speed; } } else { // We got a hard thermal error and/or there is no print going on. Just stop. print_stop(false, true); 2ceac: 61 e0 ldi r22, 0x01 ; 1 2ceae: 80 e0 ldi r24, 0x00 ; 0 2ceb0: 0e 94 f9 de call 0x1bdf2 ; 0x1bdf2 } // Report the error on the serial serialprintPGM(allow_recovery ? echomagic : errormagic); 2ceb4: 81 eb ldi r24, 0xB1 ; 177 2ceb6: 91 ea ldi r25, 0xA1 ; 161 2ceb8: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNRPGM(MSG_ERR_STOPPED); 2cebc: 8e e6 ldi r24, 0x6E ; 110 2cebe: 9c e6 ldi r25, 0x6C ; 108 2cec0: 0e 94 bd 7c call 0xf97a ; 0xf97a // Eventually report the stopped status on the lcd (though this is usually overridden by a // higher-priority alert status message) LCD_MESSAGERPGM(_T(MSG_STOPPED)); 2cec4: 89 e8 ldi r24, 0x89 ; 137 2cec6: 92 e6 ldi r25, 0x62 ; 98 2cec8: 0e 94 3a 75 call 0xea74 ; 0xea74 2cecc: 0e 94 94 de call 0x1bd28 ; 0x1bd28 // Make a warning sound! We cannot use Sound_MakeCustom as this would stop further moves. // Turn on the speaker here (if not already), and turn it off when back in the main loop. WRITE(BEEPER, HIGH); 2ced0: 9f b7 in r25, 0x3f ; 63 2ced2: f8 94 cli 2ced4: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2ced8: 84 60 ori r24, 0x04 ; 4 2ceda: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2cede: 9f bf out 0x3f, r25 ; 63 // Always return to the status screen to ensure the NEW error is immediately shown. lcd_return_to_status(); 2cee0: 0f 94 d5 07 call 0x20faa ; 0x20faa if(!allow_recovery) { // prevent menu access for all fatal errors menu_set_block(MENU_BLOCK_THERMAL_ERROR); 2cee4: 80 91 3a 12 lds r24, 0x123A ; 0x80123a 2cee8: 81 60 ori r24, 0x01 ; 1 2ceea: 80 93 3a 12 sts 0x123A, r24 ; 0x80123a } } } 2ceee: 08 95 ret 0002cef0 : bool cmd_buffer_empty() { return (buflen == 0); } void enquecommand_front(const char *cmd, bool from_progmem) 2cef0: 0f 93 push r16 2cef2: 1f 93 push r17 2cef4: cf 93 push r28 2cef6: df 93 push r29 2cef8: ec 01 movw r28, r24 2cefa: 0f 94 9e a1 call 0x3433c ; 0x3433c <__strlen_P> 2cefe: 8c 01 movw r16, r24 // If yes, adjust bufindr to the new position, where the new command could be enqued. // len_asked does not contain the zero terminator size. static bool cmdqueue_could_enqueue_front(size_t len_asked) { // MAX_CMD_SIZE has to accommodate the zero terminator. if (len_asked >= MAX_CMD_SIZE) 2cf00: 80 36 cpi r24, 0x60 ; 96 2cf02: 91 05 cpc r25, r1 2cf04: 08 f0 brcs .+2 ; 0x2cf08 2cf06: 85 c0 rjmp .+266 ; 0x2d012 return false; // Remove the currently processed command from the queue. if (! cmdbuffer_front_already_processed) { 2cf08: 80 91 53 12 lds r24, 0x1253 ; 0x801253 2cf0c: 81 11 cpse r24, r1 2cf0e: 05 c0 rjmp .+10 ; 0x2cf1a cmdqueue_pop_front(); 2cf10: 0e 94 43 79 call 0xf286 ; 0xf286 cmdbuffer_front_already_processed = true; 2cf14: 81 e0 ldi r24, 0x01 ; 1 2cf16: 80 93 53 12 sts 0x1253, r24 ; 0x801253 } if (bufindr == bufindw && buflen > 0) 2cf1a: 40 91 38 12 lds r20, 0x1238 ; 0x801238 2cf1e: 50 91 39 12 lds r21, 0x1239 ; 0x801239 2cf22: 80 91 49 10 lds r24, 0x1049 ; 0x801049 <_ZL7bufindw.lto_priv.514> 2cf26: 90 91 4a 10 lds r25, 0x104A ; 0x80104a <_ZL7bufindw.lto_priv.514+0x1> 2cf2a: 48 17 cp r20, r24 2cf2c: 59 07 cpc r21, r25 2cf2e: 41 f4 brne .+16 ; 0x2cf40 2cf30: 20 91 3c 12 lds r18, 0x123C ; 0x80123c 2cf34: 30 91 3d 12 lds r19, 0x123D ; 0x80123d 2cf38: 12 16 cp r1, r18 2cf3a: 13 06 cpc r1, r19 2cf3c: 0c f4 brge .+2 ; 0x2cf40 2cf3e: 69 c0 rjmp .+210 ; 0x2d012 // Full buffer. return false; // Adjust the end of the write buffer based on whether a partial line is in the receive buffer. int endw = (serial_count > 0) ? (bufindw + MAX_CMD_SIZE + 1) : bufindw; 2cf40: 20 91 47 10 lds r18, 0x1047 ; 0x801047 2cf44: 30 91 48 10 lds r19, 0x1048 ; 0x801048 2cf48: 12 16 cp r1, r18 2cf4a: 13 06 cpc r1, r19 2cf4c: 0c f0 brlt .+2 ; 0x2cf50 2cf4e: 41 c0 rjmp .+130 ; 0x2cfd2 2cf50: 9c 01 movw r18, r24 2cf52: 2f 59 subi r18, 0x9F ; 159 2cf54: 3f 4f sbci r19, 0xFF ; 255 if (bufindw < bufindr) { 2cf56: 84 17 cp r24, r20 2cf58: 95 07 cpc r25, r21 2cf5a: e8 f5 brcc .+122 ; 0x2cfd6 int bufindr_new = bufindr - len_asked - (1 + CMDHDRSIZE); 2cf5c: 44 50 subi r20, 0x04 ; 4 2cf5e: 51 09 sbc r21, r1 2cf60: 40 1b sub r20, r16 2cf62: 51 0b sbc r21, r17 // Simple case. There is a contiguous space between the write buffer and the read buffer. if (endw <= bufindr_new) { 2cf64: 42 17 cp r20, r18 2cf66: 53 07 cpc r21, r19 2cf68: 0c f4 brge .+2 ; 0x2cf6c 2cf6a: 53 c0 rjmp .+166 ; 0x2d012 } } else { // Otherwise the free space is split between the start and end. if (len_asked + (1 + CMDHDRSIZE) <= bufindr) { // Could fit at the start. bufindr -= len_asked + (1 + CMDHDRSIZE); 2cf6c: 50 93 39 12 sts 0x1239, r21 ; 0x801239 2cf70: 40 93 38 12 sts 0x1238, r20 ; 0x801238 void enquecommand_front(const char *cmd, bool from_progmem) { size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd); // Does cmd fit the queue? This call shall move bufindr, so the command may be copied. if (cmdqueue_could_enqueue_front(len)) { cmdbuffer[bufindr] = CMDBUFFER_CURRENT_TYPE_UI; 2cf74: 80 91 38 12 lds r24, 0x1238 ; 0x801238 2cf78: 90 91 39 12 lds r25, 0x1239 ; 0x801239 2cf7c: fc 01 movw r30, r24 2cf7e: e5 5b subi r30, 0xB5 ; 181 2cf80: ff 4e sbci r31, 0xEF ; 239 2cf82: 23 e0 ldi r18, 0x03 ; 3 2cf84: 20 83 st Z, r18 if (from_progmem) strcpy_P(cmdbuffer + bufindr + CMDHDRSIZE, cmd); 2cf86: be 01 movw r22, r28 2cf88: 82 5b subi r24, 0xB2 ; 178 2cf8a: 9f 4e sbci r25, 0xEF ; 239 2cf8c: 0f 94 97 a1 call 0x3432e ; 0x3432e else strcpy(cmdbuffer + bufindr + CMDHDRSIZE, cmd); ++ buflen; 2cf90: 80 91 3c 12 lds r24, 0x123C ; 0x80123c 2cf94: 90 91 3d 12 lds r25, 0x123D ; 0x80123d 2cf98: 01 96 adiw r24, 0x01 ; 1 2cf9a: 90 93 3d 12 sts 0x123D, r25 ; 0x80123d 2cf9e: 80 93 3c 12 sts 0x123C, r24 ; 0x80123c SERIAL_ECHO_START; 2cfa2: 8e ec ldi r24, 0xCE ; 206 2cfa4: 91 ea ldi r25, 0xA1 ; 161 2cfa6: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(enqueingFront); 2cfaa: 88 e9 ldi r24, 0x98 ; 152 2cfac: 91 ea ldi r25, 0xA1 ; 161 2cfae: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHO(cmdbuffer + bufindr + CMDHDRSIZE); 2cfb2: 80 91 38 12 lds r24, 0x1238 ; 0x801238 2cfb6: 90 91 39 12 lds r25, 0x1239 ; 0x801239 2cfba: 82 5b subi r24, 0xB2 ; 178 2cfbc: 9f 4e sbci r25, 0xEF ; 239 2cfbe: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHOLNPGM("\""); 2cfc2: 86 e9 ldi r24, 0x96 ; 150 2cfc4: 91 ea ldi r25, 0xA1 ; 161 SERIAL_ECHOLNRPGM(bufferFull); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 2cfc6: df 91 pop r29 2cfc8: cf 91 pop r28 2cfca: 1f 91 pop r17 2cfcc: 0f 91 pop r16 SERIAL_ECHORPGM(enqueingFront); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 2cfce: 0c 94 bd 7c jmp 0xf97a ; 0xf97a // Remove the currently processed command from the queue. if (! cmdbuffer_front_already_processed) { cmdqueue_pop_front(); cmdbuffer_front_already_processed = true; } if (bufindr == bufindw && buflen > 0) 2cfd2: 9c 01 movw r18, r24 2cfd4: c0 cf rjmp .-128 ; 0x2cf56 bufindr = bufindr_new; return true; } } else { // Otherwise the free space is split between the start and end. if (len_asked + (1 + CMDHDRSIZE) <= bufindr) { 2cfd6: c8 01 movw r24, r16 2cfd8: 04 96 adiw r24, 0x04 ; 4 2cfda: 48 17 cp r20, r24 2cfdc: 59 07 cpc r21, r25 2cfde: 28 f0 brcs .+10 ; 0x2cfea // Could fit at the start. bufindr -= len_asked + (1 + CMDHDRSIZE); 2cfe0: 44 50 subi r20, 0x04 ; 4 2cfe2: 51 09 sbc r21, r1 2cfe4: 40 1b sub r20, r16 2cfe6: 51 0b sbc r21, r17 2cfe8: c1 cf rjmp .-126 ; 0x2cf6c return true; } int bufindr_new = sizeof(cmdbuffer) - len_asked - (1 + CMDHDRSIZE); 2cfea: 89 ee ldi r24, 0xE9 ; 233 2cfec: 91 e0 ldi r25, 0x01 ; 1 2cfee: bc 01 movw r22, r24 2cff0: 60 1b sub r22, r16 2cff2: 71 0b sbc r23, r17 2cff4: 8b 01 movw r16, r22 if (endw <= bufindr_new) { 2cff6: 62 17 cp r22, r18 2cff8: 73 07 cpc r23, r19 2cffa: 5c f0 brlt .+22 ; 0x2d012 memset(cmdbuffer, 0, bufindr); 2cffc: 70 e0 ldi r23, 0x00 ; 0 2cffe: 60 e0 ldi r22, 0x00 ; 0 2d000: 8b e4 ldi r24, 0x4B ; 75 2d002: 90 e1 ldi r25, 0x10 ; 16 2d004: 0f 94 12 aa call 0x35424 ; 0x35424 bufindr = bufindr_new; 2d008: 10 93 39 12 sts 0x1239, r17 ; 0x801239 2d00c: 00 93 38 12 sts 0x1238, r16 ; 0x801238 2d010: b1 cf rjmp .-158 ; 0x2cf74 SERIAL_ECHOLNPGM("\""); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; 2d012: 81 eb ldi r24, 0xB1 ; 177 2d014: 91 ea ldi r25, 0xA1 ; 161 2d016: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(enqueingFront); 2d01a: 88 e9 ldi r24, 0x98 ; 152 2d01c: 91 ea ldi r25, 0xA1 ; 161 2d01e: 0e 94 c4 7a call 0xf588 ; 0xf588 if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); 2d022: ce 01 movw r24, r28 2d024: 0e 94 c4 7a call 0xf588 ; 0xf588 else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 2d028: 8f e7 ldi r24, 0x7F ; 127 2d02a: 91 ea ldi r25, 0xA1 ; 161 2d02c: cc cf rjmp .-104 ; 0x2cfc6 0002d02e : } else { return false; } } bool SdFile::seekSetFilteredGcode(uint32_t pos){ 2d02e: ab 01 movw r20, r22 2d030: bc 01 movw r22, r24 if(! seekSet(pos) )return false; 2d032: 87 e6 ldi r24, 0x67 ; 103 2d034: 96 e1 ldi r25, 0x16 ; 22 2d036: 0f 94 0b 2d call 0x25a16 ; 0x25a16 2d03a: 81 11 cpse r24, r1 2d03c: 02 c0 rjmp .+4 ; 0x2d042 2d03e: 80 e0 ldi r24, 0x00 ; 0 2d040: 08 95 ret } bool SdFile::openFilteredGcode(SdBaseFile* dirFile, const char* path){ if( open(dirFile, path, O_READ) ){ // compute the block to start with if( ! gfComputeNextFileBlock() ) 2d042: 87 e6 ldi r24, 0x67 ; 103 2d044: 96 e1 ldi r25, 0x16 ; 22 2d046: 0f 94 92 2c call 0x25924 ; 0x25924 2d04a: 88 23 and r24, r24 2d04c: c1 f3 breq .-16 ; 0x2d03e return vol_->cache()->data; // this is constant for the whole time, so it should be fast and sleek } void SdFile::gfReset(){ // reset cache read ptr to its begin gfReadPtr = gfBlockBuffBegin() + gfOffset; 2d04e: 20 91 88 16 lds r18, 0x1688 ; 0x801688 2d052: 30 91 89 16 lds r19, 0x1689 ; 0x801689 2d056: 2a 5b subi r18, 0xBA ; 186 2d058: 31 4f sbci r19, 0xF1 ; 241 2d05a: 30 93 83 16 sts 0x1683, r19 ; 0x801683 2d05e: 20 93 82 16 sts 0x1682, r18 ; 0x801682 bool SdFile::seekSetFilteredGcode(uint32_t pos){ if(! seekSet(pos) )return false; if(! gfComputeNextFileBlock() )return false; gfReset(); return true; } 2d062: 08 95 ret 0002d064 : SERIAL_PROTOCOLLNPGM("An error while writing to the SD Card."); } } void CardReader::checkautostart(bool force) 2d064: 8f 92 push r8 2d066: 9f 92 push r9 2d068: af 92 push r10 2d06a: bf 92 push r11 2d06c: cf 92 push r12 2d06e: df 92 push r13 2d070: ef 92 push r14 2d072: ff 92 push r15 2d074: 0f 93 push r16 2d076: 1f 93 push r17 2d078: cf 93 push r28 2d07a: df 93 push r29 2d07c: cd b7 in r28, 0x3d ; 61 2d07e: de b7 in r29, 0x3e ; 62 2d080: ee 97 sbiw r28, 0x3e ; 62 2d082: 0f b6 in r0, 0x3f ; 63 2d084: f8 94 cli 2d086: de bf out 0x3e, r29 ; 62 2d088: 0f be out 0x3f, r0 ; 63 2d08a: cd bf out 0x3d, r28 ; 61 if(!mounted) //fail return; } char autoname[30]; sprintf_P(autoname, PSTR("auto%i.g"), lastnr); 2d08c: 80 91 25 14 lds r24, 0x1425 ; 0x801425 2d090: 8f 93 push r24 2d092: 80 91 24 14 lds r24, 0x1424 ; 0x801424 2d096: 8f 93 push r24 2d098: 8a e3 ldi r24, 0x3A ; 58 2d09a: 91 ea ldi r25, 0xA1 ; 161 2d09c: 9f 93 push r25 2d09e: 8f 93 push r24 2d0a0: 8e 01 movw r16, r28 2d0a2: 0f 5d subi r16, 0xDF ; 223 2d0a4: 1f 4f sbci r17, 0xFF ; 255 2d0a6: 1f 93 push r17 2d0a8: 0f 93 push r16 2d0aa: 0f 94 f7 a2 call 0x345ee ; 0x345ee 2d0ae: 0f 90 pop r0 2d0b0: 0f 90 pop r0 2d0b2: 0f 90 pop r0 2d0b4: 0f 90 pop r0 2d0b6: 0f 90 pop r0 2d0b8: 0f 90 pop r0 for(int8_t i=0;i<(int8_t)strlen(autoname);i++) 2d0ba: f1 2c mov r15, r1 2d0bc: f8 01 movw r30, r16 2d0be: 01 90 ld r0, Z+ 2d0c0: 00 20 and r0, r0 2d0c2: e9 f7 brne .-6 ; 0x2d0be 2d0c4: 31 97 sbiw r30, 0x01 ; 1 2d0c6: e0 1b sub r30, r16 2d0c8: f1 0b sbc r31, r17 2d0ca: fe 16 cp r15, r30 2d0cc: 84 f4 brge .+32 ; 0x2d0ee autoname[i]=tolower(autoname[i]); 2d0ce: 68 01 movw r12, r16 2d0d0: cf 0c add r12, r15 2d0d2: d1 1c adc r13, r1 2d0d4: f7 fc sbrc r15, 7 2d0d6: da 94 dec r13 2d0d8: f6 01 movw r30, r12 2d0da: 80 81 ld r24, Z 2d0dc: 08 2e mov r0, r24 2d0de: 00 0c add r0, r0 2d0e0: 99 0b sbc r25, r25 2d0e2: 0f 94 f4 a9 call 0x353e8 ; 0x353e8 2d0e6: f6 01 movw r30, r12 2d0e8: 80 83 st Z, r24 2d0ea: f3 94 inc r15 2d0ec: e7 cf rjmp .-50 ; 0x2d0bc dir_t p; root.rewind(); 2d0ee: 8d e5 ldi r24, 0x5D ; 93 2d0f0: 94 e1 ldi r25, 0x14 ; 20 2d0f2: 0e 94 a6 79 call 0xf34c ; 0xf34c bool found=false; 2d0f6: a1 2c mov r10, r1 2d0f8: ce 01 movw r24, r28 2d0fa: 01 96 adiw r24, 0x01 ; 1 2d0fc: 7c 01 movw r14, r24 //Serial.println(autoname); if(p.name[9]!='~') //skip safety copies if(strncmp((char*)p.name,autoname,5)==0) { // M23: Select SD file enquecommandf_P(MSG_M23, autoname); 2d0fe: 87 e6 ldi r24, 0x67 ; 103 2d100: c8 2e mov r12, r24 2d102: 8c e6 ldi r24, 0x6C ; 108 2d104: d8 2e mov r13, r24 * a directory file or an I/O error occurred. */ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0X1F & curPosition_)) return -1; 2d106: 80 91 60 14 lds r24, 0x1460 ; 0x801460 2d10a: 82 30 cpi r24, 0x02 ; 2 2d10c: 08 f4 brcc .+2 ; 0x2d110 2d10e: 50 c0 rjmp .+160 ; 0x2d1b0 2d110: 80 91 65 14 lds r24, 0x1465 ; 0x801465 2d114: 90 91 66 14 lds r25, 0x1466 ; 0x801466 2d118: a0 91 67 14 lds r26, 0x1467 ; 0x801467 2d11c: b0 91 68 14 lds r27, 0x1468 ; 0x801468 2d120: 8f 71 andi r24, 0x1F ; 31 2d122: 99 27 eor r25, r25 2d124: aa 27 eor r26, r26 2d126: bb 27 eor r27, r27 2d128: 89 2b or r24, r25 2d12a: 8a 2b or r24, r26 2d12c: 8b 2b or r24, r27 2d12e: 09 f0 breq .+2 ; 0x2d132 2d130: 3f c0 rjmp .+126 ; 0x2d1b0 2d132: 50 e0 ldi r21, 0x00 ; 0 2d134: 40 e0 ldi r20, 0x00 ; 0 2d136: b7 01 movw r22, r14 2d138: 8d e5 ldi r24, 0x5D ; 93 2d13a: 94 e1 ldi r25, 0x14 ; 20 2d13c: 0f 94 48 30 call 0x26090 ; 0x26090 dir_t p; root.rewind(); bool found=false; while (root.readDir(p, NULL) > 0) 2d140: 18 16 cp r1, r24 2d142: b4 f5 brge .+108 ; 0x2d1b0 { for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++) 2d144: b1 2c mov r11, r1 2d146: f7 01 movw r30, r14 2d148: 01 90 ld r0, Z+ 2d14a: 00 20 and r0, r0 2d14c: e9 f7 brne .-6 ; 0x2d148 2d14e: 31 97 sbiw r30, 0x01 ; 1 2d150: ee 19 sub r30, r14 2d152: ff 09 sbc r31, r15 2d154: be 16 cp r11, r30 2d156: 74 f4 brge .+28 ; 0x2d174 p.name[i]=tolower(p.name[i]); 2d158: 47 01 movw r8, r14 2d15a: 8b 0c add r8, r11 2d15c: 91 1c adc r9, r1 2d15e: b7 fc sbrc r11, 7 2d160: 9a 94 dec r9 2d162: f4 01 movw r30, r8 2d164: 80 81 ld r24, Z 2d166: 90 e0 ldi r25, 0x00 ; 0 2d168: 0f 94 f4 a9 call 0x353e8 ; 0x353e8 2d16c: f4 01 movw r30, r8 2d16e: 80 83 st Z, r24 2d170: b3 94 inc r11 2d172: e9 cf rjmp .-46 ; 0x2d146 //Serial.print((char*)p.name); //Serial.print(" "); //Serial.println(autoname); if(p.name[9]!='~') //skip safety copies 2d174: 8a 85 ldd r24, Y+10 ; 0x0a 2d176: 8e 37 cpi r24, 0x7E ; 126 2d178: 31 f2 breq .-116 ; 0x2d106 if(strncmp((char*)p.name,autoname,5)==0) 2d17a: 45 e0 ldi r20, 0x05 ; 5 2d17c: 50 e0 ldi r21, 0x00 ; 0 2d17e: b8 01 movw r22, r16 2d180: c7 01 movw r24, r14 2d182: 0f 94 52 aa call 0x354a4 ; 0x354a4 2d186: 89 2b or r24, r25 2d188: 09 f0 breq .+2 ; 0x2d18c 2d18a: bd cf rjmp .-134 ; 0x2d106 { // M23: Select SD file enquecommandf_P(MSG_M23, autoname); 2d18c: 1f 93 push r17 2d18e: 0f 93 push r16 2d190: df 92 push r13 2d192: cf 92 push r12 2d194: 0e 94 b7 8f call 0x11f6e ; 0x11f6e // M24: Start/resume SD print enquecommand_P(MSG_M24); 2d198: 61 e0 ldi r22, 0x01 ; 1 2d19a: 83 e6 ldi r24, 0x63 ; 99 2d19c: 9c e6 ldi r25, 0x6C ; 108 2d19e: 0e 94 e9 8e call 0x11dd2 ; 0x11dd2 2d1a2: 0f 90 pop r0 2d1a4: 0f 90 pop r0 2d1a6: 0f 90 pop r0 2d1a8: 0f 90 pop r0 found=true; 2d1aa: aa 24 eor r10, r10 2d1ac: a3 94 inc r10 2d1ae: ab cf rjmp .-170 ; 0x2d106 } } if(!found) lastnr=-1; 2d1b0: 8f ef ldi r24, 0xFF ; 255 2d1b2: 9f ef ldi r25, 0xFF ; 255 // M24: Start/resume SD print enquecommand_P(MSG_M24); found=true; } } if(!found) 2d1b4: aa 20 and r10, r10 2d1b6: 29 f0 breq .+10 ; 0x2d1c2 lastnr=-1; else lastnr++; 2d1b8: 80 91 24 14 lds r24, 0x1424 ; 0x801424 2d1bc: 90 91 25 14 lds r25, 0x1425 ; 0x801425 2d1c0: 01 96 adiw r24, 0x01 ; 1 2d1c2: 90 93 25 14 sts 0x1425, r25 ; 0x801425 2d1c6: 80 93 24 14 sts 0x1424, r24 ; 0x801424 } 2d1ca: ee 96 adiw r28, 0x3e ; 62 2d1cc: 0f b6 in r0, 0x3f ; 63 2d1ce: f8 94 cli 2d1d0: de bf out 0x3e, r29 ; 62 2d1d2: 0f be out 0x3f, r0 ; 63 2d1d4: cd bf out 0x3d, r28 ; 61 2d1d6: df 91 pop r29 2d1d8: cf 91 pop r28 2d1da: 1f 91 pop r17 2d1dc: 0f 91 pop r16 2d1de: ff 90 pop r15 2d1e0: ef 90 pop r14 2d1e2: df 90 pop r13 2d1e4: cf 90 pop r12 2d1e6: bf 90 pop r11 2d1e8: af 90 pop r10 2d1ea: 9f 90 pop r9 2d1ec: 8f 90 pop r8 2d1ee: 08 95 ret 0002d1f0 : * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is read only, file is a directory, * \a length is greater than the current file size or an I/O error occurs. */ bool SdBaseFile::truncate(uint32_t length) { 2d1f0: 8f 92 push r8 2d1f2: 9f 92 push r9 2d1f4: af 92 push r10 2d1f6: bf 92 push r11 2d1f8: cf 92 push r12 2d1fa: df 92 push r13 2d1fc: ef 92 push r14 2d1fe: ff 92 push r15 2d200: 0f 93 push r16 2d202: 1f 93 push r17 2d204: cf 93 push r28 2d206: df 93 push r29 2d208: 00 d0 rcall .+0 ; 0x2d20a 2d20a: 1f 92 push r1 2d20c: cd b7 in r28, 0x3d ; 61 2d20e: de b7 in r29, 0x3e ; 62 2d210: fc 01 movw r30, r24 uint32_t newPos; // error if not a normal file or read-only if (!isFile() || !(flags_ & O_WRITE)) goto fail; 2d212: 83 81 ldd r24, Z+3 ; 0x03 2d214: 81 30 cpi r24, 0x01 ; 1 2d216: 11 f0 breq .+4 ; 0x2d21c // set file to correct position return seekSet(newPos); fail: return false; 2d218: 80 e0 ldi r24, 0x00 ; 0 2d21a: 60 c0 rjmp .+192 ; 0x2d2dc * \a length is greater than the current file size or an I/O error occurs. */ bool SdBaseFile::truncate(uint32_t length) { uint32_t newPos; // error if not a normal file or read-only if (!isFile() || !(flags_ & O_WRITE)) goto fail; 2d21c: 81 81 ldd r24, Z+1 ; 0x01 2d21e: 81 ff sbrs r24, 1 2d220: fb cf rjmp .-10 ; 0x2d218 // error if length is greater than current size if (length > fileSize_) goto fail; // fileSize and length are zero - nothing to do if (fileSize_ == 0) return true; 2d222: 81 89 ldd r24, Z+17 ; 0x11 2d224: 92 89 ldd r25, Z+18 ; 0x12 2d226: a3 89 ldd r26, Z+19 ; 0x13 2d228: b4 89 ldd r27, Z+20 ; 0x14 2d22a: 89 2b or r24, r25 2d22c: 8a 2b or r24, r26 2d22e: 8b 2b or r24, r27 2d230: 09 f4 brne .+2 ; 0x2d234 2d232: 6e c0 rjmp .+220 ; 0x2d310 2d234: 7f 01 movw r14, r30 // remember position for seek after truncation newPos = curPosition_ > length ? length : curPosition_; // position to last cluster in truncated file if (!seekSet(length)) goto fail; 2d236: 40 e0 ldi r20, 0x00 ; 0 2d238: 50 e0 ldi r21, 0x00 ; 0 2d23a: ba 01 movw r22, r20 2d23c: cf 01 movw r24, r30 2d23e: 0f 94 0b 2d call 0x25a16 ; 0x25a16 2d242: 88 23 and r24, r24 2d244: 49 f3 breq .-46 ; 0x2d218 if (length == 0) { // free all clusters if (!vol_->freeChain(firstCluster_)) goto fail; 2d246: f7 01 movw r30, r14 2d248: c1 8c ldd r12, Z+25 ; 0x19 2d24a: d2 8c ldd r13, Z+26 ; 0x1a 2d24c: 85 88 ldd r8, Z+21 ; 0x15 2d24e: 96 88 ldd r9, Z+22 ; 0x16 2d250: a7 88 ldd r10, Z+23 ; 0x17 2d252: b0 8c ldd r11, Z+24 ; 0x18 // free a cluster chain bool SdVolume::freeChain(uint32_t cluster) { uint32_t next; // clear free cluster location allocSearchStart_ = 2; 2d254: 82 e0 ldi r24, 0x02 ; 2 2d256: 90 e0 ldi r25, 0x00 ; 0 2d258: a0 e0 ldi r26, 0x00 ; 0 2d25a: b0 e0 ldi r27, 0x00 ; 0 2d25c: f6 01 movw r30, r12 2d25e: 80 83 st Z, r24 2d260: 91 83 std Z+1, r25 ; 0x01 2d262: a2 83 std Z+2, r26 ; 0x02 2d264: b3 83 std Z+3, r27 ; 0x03 do { if (!fatGet(cluster, &next)) goto fail; 2d266: 9e 01 movw r18, r28 2d268: 2f 5f subi r18, 0xFF ; 255 2d26a: 3f 4f sbci r19, 0xFF ; 255 2d26c: b5 01 movw r22, r10 2d26e: a4 01 movw r20, r8 2d270: c6 01 movw r24, r12 2d272: 0f 94 55 2b call 0x256aa ; 0x256aa 2d276: 88 23 and r24, r24 2d278: 79 f2 breq .-98 ; 0x2d218 // free cluster if (!fatPut(cluster, 0)) goto fail; 2d27a: 00 e0 ldi r16, 0x00 ; 0 2d27c: 10 e0 ldi r17, 0x00 ; 0 2d27e: 98 01 movw r18, r16 2d280: b5 01 movw r22, r10 2d282: a4 01 movw r20, r8 2d284: c6 01 movw r24, r12 2d286: 0f 94 c3 2a call 0x25586 ; 0x25586 2d28a: 88 23 and r24, r24 2d28c: 29 f2 breq .-118 ; 0x2d218 cluster = next; 2d28e: 89 80 ldd r8, Y+1 ; 0x01 2d290: 9a 80 ldd r9, Y+2 ; 0x02 2d292: ab 80 ldd r10, Y+3 ; 0x03 2d294: bc 80 ldd r11, Y+4 ; 0x04 return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); bool isEOC(uint32_t cluster) const { if (FAT12_SUPPORT && fatType_ == 12) return cluster >= FAT12EOC_MIN; if (fatType_ == 16) return cluster >= FAT16EOC_MIN; 2d296: f6 01 movw r30, r12 2d298: 87 89 ldd r24, Z+23 ; 0x17 2d29a: 80 31 cpi r24, 0x10 ; 16 2d29c: 81 f5 brne .+96 ; 0x2d2fe 2d29e: f8 ef ldi r31, 0xF8 ; 248 2d2a0: 8f 16 cp r8, r31 2d2a2: ff ef ldi r31, 0xFF ; 255 2d2a4: 9f 06 cpc r9, r31 2d2a6: a1 04 cpc r10, r1 2d2a8: b1 04 cpc r11, r1 2d2aa: e8 f2 brcs .-70 ; 0x2d266 firstCluster_ = 0; 2d2ac: f7 01 movw r30, r14 2d2ae: 15 8a std Z+21, r1 ; 0x15 2d2b0: 16 8a std Z+22, r1 ; 0x16 2d2b2: 17 8a std Z+23, r1 ; 0x17 2d2b4: 10 8e std Z+24, r1 ; 0x18 // current cluster is end of chain if (!vol_->fatPutEOC(curCluster_)) goto fail; } } fileSize_ = length; 2d2b6: 11 8a std Z+17, r1 ; 0x11 2d2b8: 12 8a std Z+18, r1 ; 0x12 2d2ba: 13 8a std Z+19, r1 ; 0x13 2d2bc: 14 8a std Z+20, r1 ; 0x14 // need to update directory entry flags_ |= F_FILE_DIR_DIRTY; 2d2be: 81 81 ldd r24, Z+1 ; 0x01 2d2c0: 80 68 ori r24, 0x80 ; 128 2d2c2: 81 83 std Z+1, r24 ; 0x01 if (!sync()) goto fail; 2d2c4: c7 01 movw r24, r14 2d2c6: 0f 94 b4 2e call 0x25d68 ; 0x25d68 2d2ca: 88 23 and r24, r24 2d2cc: 09 f4 brne .+2 ; 0x2d2d0 2d2ce: a4 cf rjmp .-184 ; 0x2d218 // set file to correct position return seekSet(newPos); 2d2d0: 40 e0 ldi r20, 0x00 ; 0 2d2d2: 50 e0 ldi r21, 0x00 ; 0 2d2d4: ba 01 movw r22, r20 2d2d6: c7 01 movw r24, r14 2d2d8: 0f 94 0b 2d call 0x25a16 ; 0x25a16 fail: return false; } 2d2dc: 0f 90 pop r0 2d2de: 0f 90 pop r0 2d2e0: 0f 90 pop r0 2d2e2: 0f 90 pop r0 2d2e4: df 91 pop r29 2d2e6: cf 91 pop r28 2d2e8: 1f 91 pop r17 2d2ea: 0f 91 pop r16 2d2ec: ff 90 pop r15 2d2ee: ef 90 pop r14 2d2f0: df 90 pop r13 2d2f2: cf 90 pop r12 2d2f4: bf 90 pop r11 2d2f6: af 90 pop r10 2d2f8: 9f 90 pop r9 2d2fa: 8f 90 pop r8 2d2fc: 08 95 ret return cluster >= FAT32EOC_MIN; 2d2fe: 88 ef ldi r24, 0xF8 ; 248 2d300: 88 16 cp r8, r24 2d302: 8f ef ldi r24, 0xFF ; 255 2d304: 98 06 cpc r9, r24 2d306: a8 06 cpc r10, r24 2d308: 8f e0 ldi r24, 0x0F ; 15 2d30a: b8 06 cpc r11, r24 2d30c: 78 f6 brcc .-98 ; 0x2d2ac 2d30e: ab cf rjmp .-170 ; 0x2d266 // error if length is greater than current size if (length > fileSize_) goto fail; // fileSize and length are zero - nothing to do if (fileSize_ == 0) return true; 2d310: 81 e0 ldi r24, 0x01 ; 1 2d312: e4 cf rjmp .-56 ; 0x2d2dc 0002d314 : +* LS_Count - Add +1 to nrFiles for every file within the parent +* LS_GetFilename - Get the filename of the file indexed by nrFiles +* LS_SerialPrint - Print the full path and size of each file to serial output +*/ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/, LsAction lsAction, ls_param lsParams) { 2d314: 2f 92 push r2 2d316: 3f 92 push r3 2d318: 4f 92 push r4 2d31a: 5f 92 push r5 2d31c: 6f 92 push r6 2d31e: 7f 92 push r7 2d320: 8f 92 push r8 2d322: 9f 92 push r9 2d324: af 92 push r10 2d326: bf 92 push r11 2d328: cf 92 push r12 2d32a: df 92 push r13 2d32c: ef 92 push r14 2d32e: ff 92 push r15 2d330: 0f 93 push r16 2d332: 1f 93 push r17 2d334: cf 93 push r28 2d336: df 93 push r29 2d338: cd b7 in r28, 0x3d ; 61 2d33a: de b7 in r29, 0x3e ; 62 2d33c: c6 57 subi r28, 0x76 ; 118 2d33e: d1 09 sbc r29, r1 2d340: 0f b6 in r0, 0x3f ; 63 2d342: f8 94 cli 2d344: de bf out 0x3e, r29 ; 62 2d346: 0f be out 0x3f, r0 ; 63 2d348: cd bf out 0x3d, r28 ; 61 2d34a: 4c 01 movw r8, r24 2d34c: 6b 01 movw r12, r22 2d34e: 3a 01 movw r6, r20 2d350: e5 96 adiw r28, 0x35 ; 53 2d352: 2f af std Y+63, r18 ; 0x3f 2d354: e5 97 sbiw r28, 0x35 ; 53 2d356: 50 2e mov r5, r16 cnt++; break; } } } // while readDir } 2d358: 2d b6 in r2, 0x3d ; 61 2d35a: 3e b6 in r3, 0x3e ; 62 2d35c: 10 2f mov r17, r16 2d35e: 11 70 andi r17, 0x01 ; 1 static uint8_t recursionCnt = 0; // RAII incrementer for the recursionCnt class _incrementer { public: _incrementer() {recursionCnt++;} 2d360: 80 91 45 0e lds r24, 0x0E45 ; 0x800e45 2d364: 8f 5f subi r24, 0xFF ; 255 2d366: 80 93 45 0e sts 0x0E45, r24 ; 0x800e45 } recursionCntIncrementer; dir_t p; uint8_t cnt = 0; // Read the next entry from a directory for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) { 2d36a: fb 01 movw r30, r22 2d36c: 80 85 ldd r24, Z+8 ; 0x08 2d36e: 91 85 ldd r25, Z+9 ; 0x09 2d370: a2 85 ldd r26, Z+10 ; 0x0a 2d372: b3 85 ldd r27, Z+11 ; 0x0b 2d374: 80 93 ea 13 sts 0x13EA, r24 ; 0x8013ea 2d378: 90 93 eb 13 sts 0x13EB, r25 ; 0x8013eb 2d37c: a0 93 ec 13 sts 0x13EC, r26 ; 0x8013ec 2d380: b0 93 ed 13 sts 0x13ED, r27 ; 0x8013ed _incrementer() {recursionCnt++;} ~_incrementer() {recursionCnt--;} } recursionCntIncrementer; dir_t p; uint8_t cnt = 0; 2d384: 41 2c mov r4, r1 if (longFilename[0] == '.') continue; if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint // Get the short name for the item, which we know is a folder char lfilename[FILENAME_LENGTH]; createFilename(lfilename, p); 2d386: 5e 01 movw r10, r28 2d388: f7 e6 ldi r31, 0x67 ; 103 2d38a: af 0e add r10, r31 2d38c: b1 1c adc r11, r1 * a directory file or an I/O error occurred. */ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0X1F & curPosition_)) return -1; 2d38e: f6 01 movw r30, r12 2d390: 83 81 ldd r24, Z+3 ; 0x03 2d392: 82 30 cpi r24, 0x02 ; 2 2d394: 08 f4 brcc .+2 ; 0x2d398 2d396: c0 c1 rjmp .+896 ; 0x2d718 2d398: 80 85 ldd r24, Z+8 ; 0x08 2d39a: 91 85 ldd r25, Z+9 ; 0x09 2d39c: a2 85 ldd r26, Z+10 ; 0x0a 2d39e: b3 85 ldd r27, Z+11 ; 0x0b 2d3a0: 8f 71 andi r24, 0x1F ; 31 2d3a2: 99 27 eor r25, r25 2d3a4: aa 27 eor r26, r26 2d3a6: bb 27 eor r27, r27 2d3a8: 89 2b or r24, r25 2d3aa: 8a 2b or r24, r26 2d3ac: 8b 2b or r24, r27 2d3ae: 09 f0 breq .+2 ; 0x2d3b2 2d3b0: b3 c1 rjmp .+870 ; 0x2d718 //If we have a longFilename buffer, mark it as invalid. If we find a long filename it will be filled automaticly. if (longFilename != NULL) { longFilename[0] = '\0'; 2d3b2: 10 92 ee 13 sts 0x13EE, r1 ; 0x8013ee 2d3b6: 4e ee ldi r20, 0xEE ; 238 2d3b8: 53 e1 ldi r21, 0x13 ; 19 2d3ba: be 01 movw r22, r28 2d3bc: 69 5b subi r22, 0xB9 ; 185 2d3be: 7f 4f sbci r23, 0xFF ; 255 2d3c0: c6 01 movw r24, r12 2d3c2: 0f 94 48 30 call 0x26090 ; 0x26090 } recursionCntIncrementer; dir_t p; uint8_t cnt = 0; // Read the next entry from a directory for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) { 2d3c6: 18 16 cp r1, r24 2d3c8: 0c f0 brlt .+2 ; 0x2d3cc 2d3ca: a6 c1 rjmp .+844 ; 0x2d718 if (recursionCnt > MAX_DIR_DEPTH) 2d3cc: 80 91 45 0e lds r24, 0x0E45 ; 0x800e45 2d3d0: 87 30 cpi r24, 0x07 ; 7 2d3d2: 08 f0 brcs .+2 ; 0x2d3d6 2d3d4: a1 c1 rjmp .+834 ; 0x2d718 return; uint8_t pn0 = p.name[0]; 2d3d6: 28 96 adiw r28, 0x08 ; 8 2d3d8: 8f ad ldd r24, Y+63 ; 0x3f 2d3da: 28 97 sbiw r28, 0x08 ; 8 if (pn0 == DIR_NAME_FREE) break; 2d3dc: 88 23 and r24, r24 2d3de: 09 f4 brne .+2 ; 0x2d3e2 2d3e0: 9b c1 rjmp .+822 ; 0x2d718 if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; 2d3e2: 85 3e cpi r24, 0xE5 ; 229 2d3e4: 09 f4 brne .+2 ; 0x2d3e8 2d3e6: 39 c1 rjmp .+626 ; 0x2d65a 2d3e8: 8e 32 cpi r24, 0x2E ; 46 2d3ea: 09 f4 brne .+2 ; 0x2d3ee 2d3ec: 36 c1 rjmp .+620 ; 0x2d65a if (longFilename[0] == '.') continue; 2d3ee: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2d3f2: 8e 32 cpi r24, 0x2E ; 46 2d3f4: 09 f4 brne .+2 ; 0x2d3f8 2d3f6: 31 c1 rjmp .+610 ; 0x2d65a 2d3f8: 63 96 adiw r28, 0x13 ; 19 2d3fa: 8f ad ldd r24, Y+63 ; 0x3f 2d3fc: 63 97 sbiw r28, 0x13 ; 19 if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; 2d3fe: 98 2f mov r25, r24 2d400: 9a 70 andi r25, 0x0A ; 10 2d402: 09 f0 breq .+2 ; 0x2d406 2d404: 2a c1 rjmp .+596 ; 0x2d65a 2d406: 88 71 andi r24, 0x18 ; 24 * \param[in] dir Pointer to a directory entry. * * \return true if the entry is for a subdirectory else false. */ static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; 2d408: 91 e0 ldi r25, 0x01 ; 1 2d40a: 80 31 cpi r24, 0x10 ; 16 2d40c: 19 f0 breq .+6 ; 0x2d414 2d40e: 90 e0 ldi r25, 0x00 ; 0 if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint 2d410: 80 31 cpi r24, 0x10 ; 16 2d412: 31 f4 brne .+12 ; 0x2d420 2d414: e5 96 adiw r28, 0x35 ; 53 2d416: ff ad ldd r31, Y+63 ; 0x3f 2d418: e5 97 sbiw r28, 0x35 ; 53 2d41a: ff 23 and r31, r31 2d41c: 09 f4 brne .+2 ; 0x2d420 2d41e: 94 c0 rjmp .+296 ; 0x2d548 if (lsParams.LFN) puts_P(PSTR("DIR_EXIT")); } else { filenameIsDir = DIR_IS_SUBDIR(&p); 2d420: 90 93 23 14 sts 0x1423, r25 ; 0x801423 if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; 2d424: 80 31 cpi r24, 0x10 ; 16 2d426: 61 f0 breq .+24 ; 0x2d440 2d428: 60 96 adiw r28, 0x10 ; 16 2d42a: 8f ad ldd r24, Y+63 ; 0x3f 2d42c: 60 97 sbiw r28, 0x10 ; 16 2d42e: 87 34 cpi r24, 0x47 ; 71 2d430: 09 f0 breq .+2 ; 0x2d434 2d432: 13 c1 rjmp .+550 ; 0x2d65a 2d434: 61 96 adiw r28, 0x11 ; 17 2d436: 8f ad ldd r24, Y+63 ; 0x3f 2d438: 61 97 sbiw r28, 0x11 ; 17 2d43a: 8e 37 cpi r24, 0x7E ; 126 2d43c: 09 f4 brne .+2 ; 0x2d440 2d43e: 0d c1 rjmp .+538 ; 0x2d65a switch (lsAction) { 2d440: e5 96 adiw r28, 0x35 ; 53 2d442: ff ad ldd r31, Y+63 ; 0x3f 2d444: e5 97 sbiw r28, 0x35 ; 53 2d446: f1 30 cpi r31, 0x01 ; 1 2d448: 09 f4 brne .+2 ; 0x2d44c 2d44a: 1b c1 rjmp .+566 ; 0x2d682 2d44c: f2 30 cpi r31, 0x02 ; 2 2d44e: 09 f4 brne .+2 ; 0x2d452 2d450: 25 c1 rjmp .+586 ; 0x2d69c case LS_Count: nrFiles++; break; case LS_SerialPrint: createFilename(filename, p); 2d452: be 01 movw r22, r28 2d454: 69 5b subi r22, 0xB9 ; 185 2d456: 7f 4f sbci r23, 0xFF ; 255 2d458: 89 ed ldi r24, 0xD9 ; 217 2d45a: 93 e1 ldi r25, 0x13 ; 19 2d45c: 0e 94 90 79 call 0xf320 ; 0xf320 2d460: c4 01 movw r24, r8 2d462: 0e 94 95 87 call 0x10f2a ; 0x10f2a 2d466: 89 ed ldi r24, 0xD9 ; 217 2d468: 93 e1 ldi r25, 0x13 ; 19 2d46a: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_PROTOCOL(prepend); SERIAL_PROTOCOL(filename); MYSERIAL.write(' '); 2d46e: 80 e2 ldi r24, 0x20 ; 32 2d470: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 2d474: a7 96 adiw r28, 0x27 ; 39 2d476: 6c ad ldd r22, Y+60 ; 0x3c 2d478: 7d ad ldd r23, Y+61 ; 0x3d 2d47a: 8e ad ldd r24, Y+62 ; 0x3e 2d47c: 9f ad ldd r25, Y+63 ; 0x3f 2d47e: a7 97 sbiw r28, 0x27 ; 39 2d480: 4a e0 ldi r20, 0x0A ; 10 2d482: 0e 94 c5 79 call 0xf38a ; 0xf38a SERIAL_PROTOCOL(p.fileSize); if (lsParams.timestamp) 2d486: 51 fe sbrs r5, 1 2d488: 45 c0 rjmp .+138 ; 0x2d514 { crmodDate = p.lastWriteDate; 2d48a: a1 96 adiw r28, 0x21 ; 33 2d48c: 2e ad ldd r18, Y+62 ; 0x3e 2d48e: 3f ad ldd r19, Y+63 ; 0x3f 2d490: a1 97 sbiw r28, 0x21 ; 33 2d492: 30 93 e9 13 sts 0x13E9, r19 ; 0x8013e9 2d496: 20 93 e8 13 sts 0x13E8, r18 ; 0x8013e8 crmodTime = p.lastWriteTime; 2d49a: 6f 96 adiw r28, 0x1f ; 31 2d49c: 4e ad ldd r20, Y+62 ; 0x3e 2d49e: 5f ad ldd r21, Y+63 ; 0x3f 2d4a0: 6f 97 sbiw r28, 0x1f ; 31 2d4a2: 50 93 e7 13 sts 0x13E7, r21 ; 0x8013e7 2d4a6: 40 93 e6 13 sts 0x13E6, r20 ; 0x8013e6 if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){ 2d4aa: 69 96 adiw r28, 0x19 ; 25 2d4ac: 8e ad ldd r24, Y+62 ; 0x3e 2d4ae: 9f ad ldd r25, Y+63 ; 0x3f 2d4b0: 69 97 sbiw r28, 0x19 ; 25 2d4b2: 28 17 cp r18, r24 2d4b4: 39 07 cpc r19, r25 2d4b6: 50 f0 brcs .+20 ; 0x2d4cc 2d4b8: 28 17 cp r18, r24 2d4ba: 39 07 cpc r19, r25 2d4bc: 99 f4 brne .+38 ; 0x2d4e4 2d4be: 67 96 adiw r28, 0x17 ; 23 2d4c0: 2e ad ldd r18, Y+62 ; 0x3e 2d4c2: 3f ad ldd r19, Y+63 ; 0x3f 2d4c4: 67 97 sbiw r28, 0x17 ; 23 2d4c6: 42 17 cp r20, r18 2d4c8: 53 07 cpc r21, r19 2d4ca: 60 f4 brcc .+24 ; 0x2d4e4 crmodDate = p.creationDate; 2d4cc: 90 93 e9 13 sts 0x13E9, r25 ; 0x8013e9 2d4d0: 80 93 e8 13 sts 0x13E8, r24 ; 0x8013e8 crmodTime = p.creationTime; 2d4d4: 67 96 adiw r28, 0x17 ; 23 2d4d6: 8e ad ldd r24, Y+62 ; 0x3e 2d4d8: 9f ad ldd r25, Y+63 ; 0x3f 2d4da: 67 97 sbiw r28, 0x17 ; 23 2d4dc: 90 93 e7 13 sts 0x13E7, r25 ; 0x8013e7 2d4e0: 80 93 e6 13 sts 0x13E6, r24 ; 0x8013e6 } printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime); 2d4e4: 80 91 e9 13 lds r24, 0x13E9 ; 0x8013e9 2d4e8: 8f 93 push r24 2d4ea: 80 91 e8 13 lds r24, 0x13E8 ; 0x8013e8 2d4ee: 8f 93 push r24 2d4f0: 80 91 e7 13 lds r24, 0x13E7 ; 0x8013e7 2d4f4: 8f 93 push r24 2d4f6: 80 91 e6 13 lds r24, 0x13E6 ; 0x8013e6 2d4fa: 8f 93 push r24 2d4fc: 27 e1 ldi r18, 0x17 ; 23 2d4fe: 31 ea ldi r19, 0xA1 ; 161 2d500: 3f 93 push r19 2d502: 2f 93 push r18 2d504: 0f 94 a2 a2 call 0x34544 ; 0x34544 2d508: 0f 90 pop r0 2d50a: 0f 90 pop r0 2d50c: 0f 90 pop r0 2d50e: 0f 90 pop r0 2d510: 0f 90 pop r0 2d512: 0f 90 pop r0 } if (lsParams.LFN) 2d514: 11 23 and r17, r17 2d516: 99 f0 breq .+38 ; 0x2d53e printf_P(PSTR(" \"%s\""), LONGEST_FILENAME); 2d518: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2d51c: 88 23 and r24, r24 2d51e: 09 f4 brne .+2 ; 0x2d522 2d520: ba c0 rjmp .+372 ; 0x2d696 2d522: 8e ee ldi r24, 0xEE ; 238 2d524: 93 e1 ldi r25, 0x13 ; 19 2d526: 9f 93 push r25 2d528: 8f 93 push r24 2d52a: e1 e1 ldi r30, 0x11 ; 17 2d52c: f1 ea ldi r31, 0xA1 ; 161 2d52e: ff 93 push r31 2d530: ef 93 push r30 2d532: 0f 94 a2 a2 call 0x34544 ; 0x34544 2d536: 0f 90 pop r0 2d538: 0f 90 pop r0 2d53a: 0f 90 pop r0 2d53c: 0f 90 pop r0 SERIAL_PROTOCOLLN(); 2d53e: 0e 94 bc 7a call 0xf578 ; 0xf578 manage_heater(); 2d542: 0f 94 1c 3a call 0x27438 ; 0x27438 2d546: 89 c0 rjmp .+274 ; 0x2d65a } lsDive(path, dir, NULL, lsAction, lsParams); // close() is done automatically by destructor of SdFile if (lsParams.LFN) puts_P(PSTR("DIR_EXIT")); 2d548: 2d b7 in r18, 0x3d ; 61 2d54a: 3e b7 in r19, 0x3e ; 62 2d54c: e7 96 adiw r28, 0x37 ; 55 2d54e: 3f af std Y+63, r19 ; 0x3f 2d550: 2e af std Y+62, r18 ; 0x3e 2d552: e7 97 sbiw r28, 0x37 ; 55 if (longFilename[0] == '.') continue; if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint // Get the short name for the item, which we know is a folder char lfilename[FILENAME_LENGTH]; createFilename(lfilename, p); 2d554: be 01 movw r22, r28 2d556: 69 5b subi r22, 0xB9 ; 185 2d558: 7f 4f sbci r23, 0xFF ; 255 2d55a: c5 01 movw r24, r10 2d55c: 0e 94 90 79 call 0xf320 ; 0xf320 // Allocate enough stack space for the full path to a folder, trailing slash, and nul bool prepend_is_empty = (prepend[0] == '\0'); 2d560: f4 01 movw r30, r8 2d562: 80 81 ld r24, Z int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1; 2d564: 88 23 and r24, r24 2d566: 09 f4 brne .+2 ; 0x2d56a 2d568: 86 c0 rjmp .+268 ; 0x2d676 2d56a: 01 90 ld r0, Z+ 2d56c: 00 20 and r0, r0 2d56e: e9 f7 brne .-6 ; 0x2d56a 2d570: 31 97 sbiw r30, 0x01 ; 1 2d572: e8 19 sub r30, r8 2d574: f9 09 sbc r31, r9 2d576: d5 01 movw r26, r10 2d578: 0d 90 ld r0, X+ 2d57a: 00 20 and r0, r0 2d57c: e9 f7 brne .-6 ; 0x2d578 2d57e: ea 19 sub r30, r10 2d580: fb 09 sbc r31, r11 char path[len]; 2d582: ea 0f add r30, r26 2d584: fb 1f adc r31, r27 2d586: 31 96 adiw r30, 0x01 ; 1 2d588: 2d b7 in r18, 0x3d ; 61 2d58a: 3e b7 in r19, 0x3e ; 62 2d58c: 2e 1b sub r18, r30 2d58e: 3f 0b sbc r19, r31 2d590: 0f b6 in r0, 0x3f ; 63 2d592: f8 94 cli 2d594: 3e bf out 0x3e, r19 ; 62 2d596: 0f be out 0x3f, r0 ; 63 2d598: 2d bf out 0x3d, r18 ; 61 2d59a: ed b7 in r30, 0x3d ; 61 2d59c: fe b7 in r31, 0x3e ; 62 2d59e: 31 96 adiw r30, 0x01 ; 1 2d5a0: 7f 01 movw r14, r30 // Append the FOLDERNAME12/ to the passed string. // It contains the full path to the "parent" argument. // We now have the full path to the item in this folder. strcpy(path, prepend_is_empty ? "/" : prepend); // root slash if prepend is empty 2d5a2: 60 ef ldi r22, 0xF0 ; 240 2d5a4: 72 e0 ldi r23, 0x02 ; 2 2d5a6: 81 11 cpse r24, r1 2d5a8: b4 01 movw r22, r8 2d5aa: c7 01 movw r24, r14 2d5ac: 0f 94 4b aa call 0x35496 ; 0x35496 strcat(path, lfilename); // FILENAME_LENGTH-1 characters maximum 2d5b0: b5 01 movw r22, r10 2d5b2: c7 01 movw r24, r14 2d5b4: 0f 94 2c aa call 0x35458 ; 0x35458 strcat(path, "/"); // 1 character 2d5b8: 60 ef ldi r22, 0xF0 ; 240 2d5ba: 72 e0 ldi r23, 0x02 ; 2 2d5bc: c7 01 movw r24, r14 2d5be: 0f 94 2c aa call 0x35458 ; 0x35458 // Serial.print(path); // Get a new directory object using the full path // and dive recursively into it. if (lsParams.LFN) 2d5c2: 11 23 and r17, r17 2d5c4: a9 f0 breq .+42 ; 0x2d5f0 printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename); 2d5c6: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2d5ca: 81 11 cpse r24, r1 2d5cc: 57 c0 rjmp .+174 ; 0x2d67c 2d5ce: c5 01 movw r24, r10 2d5d0: 9f 93 push r25 2d5d2: 8f 93 push r24 2d5d4: ff 92 push r15 2d5d6: ef 92 push r14 2d5d8: 26 e2 ldi r18, 0x26 ; 38 2d5da: 31 ea ldi r19, 0xA1 ; 161 2d5dc: 3f 93 push r19 2d5de: 2f 93 push r18 2d5e0: 0f 94 a2 a2 call 0x34544 ; 0x34544 2d5e4: 0f 90 pop r0 2d5e6: 0f 90 pop r0 2d5e8: 0f 90 pop r0 2d5ea: 0f 90 pop r0 2d5ec: 0f 90 pop r0 2d5ee: 0f 90 pop r0 * \brief Base class for SdFile with Print and C++ streams. */ class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} 2d5f0: 1c a2 std Y+36, r1 ; 0x24 2d5f2: 1f a2 std Y+39, r1 ; 0x27 * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. * \return true for success or false for failure. */ bool open(SdBaseFile& dirFile, // NOLINT const char* path, uint8_t oflag) { return open(&dirFile, path, oflag); 2d5f4: 21 e0 ldi r18, 0x01 ; 1 2d5f6: a5 01 movw r20, r10 2d5f8: b6 01 movw r22, r12 2d5fa: ce 01 movw r24, r28 2d5fc: 84 96 adiw r24, 0x24 ; 36 2d5fe: 0f 94 c5 54 call 0x2a98a ; 0x2a98a if (!dir.open(parent, lfilename, O_READ)) { //SERIAL_ECHO_START(); //SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR //SERIAL_ECHOLN(lfilename); } lsDive(path, dir, NULL, lsAction, lsParams); 2d602: 83 e2 ldi r24, 0x23 ; 35 2d604: fe 01 movw r30, r28 2d606: b4 96 adiw r30, 0x24 ; 36 2d608: de 01 movw r26, r28 2d60a: 11 96 adiw r26, 0x01 ; 1 2d60c: 01 90 ld r0, Z+ 2d60e: 0d 92 st X+, r0 2d610: 8a 95 dec r24 2d612: e1 f7 brne .-8 ; 0x2d60c 2d614: 10 fb bst r17, 0 2d616: 50 f8 bld r5, 0 2d618: 05 2d mov r16, r5 2d61a: 20 e0 ldi r18, 0x00 ; 0 2d61c: 50 e0 ldi r21, 0x00 ; 0 2d61e: 40 e0 ldi r20, 0x00 ; 0 2d620: be 01 movw r22, r28 2d622: 6f 5f subi r22, 0xFF ; 255 2d624: 7f 4f sbci r23, 0xFF ; 255 2d626: c7 01 movw r24, r14 2d628: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2d62c: ce 01 movw r24, r28 2d62e: 01 96 adiw r24, 0x01 ; 1 2d630: 0e 94 ab 79 call 0xf356 ; 0xf356 // close() is done automatically by destructor of SdFile if (lsParams.LFN) 2d634: 11 23 and r17, r17 2d636: 21 f0 breq .+8 ; 0x2d640 puts_P(PSTR("DIR_EXIT")); 2d638: 8d e1 ldi r24, 0x1D ; 29 2d63a: 91 ea ldi r25, 0xA1 ; 161 2d63c: 0f 94 c9 a2 call 0x34592 ; 0x34592 2d640: ce 01 movw r24, r28 2d642: 84 96 adiw r24, 0x24 ; 36 2d644: 0e 94 ab 79 call 0xf356 ; 0xf356 2d648: e7 96 adiw r28, 0x37 ; 55 2d64a: ee ad ldd r30, Y+62 ; 0x3e 2d64c: ff ad ldd r31, Y+63 ; 0x3f 2d64e: e7 97 sbiw r28, 0x37 ; 55 2d650: 0f b6 in r0, 0x3f ; 63 2d652: f8 94 cli 2d654: fe bf out 0x3e, r31 ; 62 2d656: 0f be out 0x3f, r0 ; 63 2d658: ed bf out 0x3d, r30 ; 61 } recursionCntIncrementer; dir_t p; uint8_t cnt = 0; // Read the next entry from a directory for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) { 2d65a: f6 01 movw r30, r12 2d65c: 80 85 ldd r24, Z+8 ; 0x08 2d65e: 91 85 ldd r25, Z+9 ; 0x09 2d660: a2 85 ldd r26, Z+10 ; 0x0a 2d662: b3 85 ldd r27, Z+11 ; 0x0b 2d664: 80 93 ea 13 sts 0x13EA, r24 ; 0x8013ea 2d668: 90 93 eb 13 sts 0x13EB, r25 ; 0x8013eb 2d66c: a0 93 ec 13 sts 0x13EC, r26 ; 0x8013ec 2d670: b0 93 ed 13 sts 0x13ED, r27 ; 0x8013ed 2d674: 8c ce rjmp .-744 ; 0x2d38e // Get the short name for the item, which we know is a folder char lfilename[FILENAME_LENGTH]; createFilename(lfilename, p); // Allocate enough stack space for the full path to a folder, trailing slash, and nul bool prepend_is_empty = (prepend[0] == '\0'); int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1; 2d676: e1 e0 ldi r30, 0x01 ; 1 2d678: f0 e0 ldi r31, 0x00 ; 0 2d67a: 7d cf rjmp .-262 ; 0x2d576 // Serial.print(path); // Get a new directory object using the full path // and dive recursively into it. if (lsParams.LFN) printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename); 2d67c: 8e ee ldi r24, 0xEE ; 238 2d67e: 93 e1 ldi r25, 0x13 ; 19 2d680: a7 cf rjmp .-178 ; 0x2d5d0 else { filenameIsDir = DIR_IS_SUBDIR(&p); if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; switch (lsAction) { case LS_Count: nrFiles++; 2d682: 80 91 ef 16 lds r24, 0x16EF ; 0x8016ef 2d686: 90 91 f0 16 lds r25, 0x16F0 ; 0x8016f0 2d68a: 01 96 adiw r24, 0x01 ; 1 2d68c: 90 93 f0 16 sts 0x16F0, r25 ; 0x8016f0 2d690: 80 93 ef 16 sts 0x16EF, r24 ; 0x8016ef 2d694: e2 cf rjmp .-60 ; 0x2d65a } printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime); } if (lsParams.LFN) printf_P(PSTR(" \"%s\""), LONGEST_FILENAME); 2d696: 89 ed ldi r24, 0xD9 ; 217 2d698: 93 e1 ldi r25, 0x13 ; 19 2d69a: 45 cf rjmp .-374 ; 0x2d526 manage_heater(); break; case LS_GetFilename: //SERIAL_ECHOPGM("File: "); createFilename(filename, p); 2d69c: be 01 movw r22, r28 2d69e: 69 5b subi r22, 0xB9 ; 185 2d6a0: 7f 4f sbci r23, 0xFF ; 255 2d6a2: 89 ed ldi r24, 0xD9 ; 217 2d6a4: 93 e1 ldi r25, 0x13 ; 19 2d6a6: 0e 94 90 79 call 0xf320 ; 0xf320 SERIAL_ECHOPGM("Creation date: "); MYSERIAL.println(p.creationDate); SERIAL_ECHOPGM("Access date: "); MYSERIAL.println(p.lastAccessDate); SERIAL_ECHOLNPGM("");*/ crmodDate = p.lastWriteDate; 2d6aa: a1 96 adiw r28, 0x21 ; 33 2d6ac: 2e ad ldd r18, Y+62 ; 0x3e 2d6ae: 3f ad ldd r19, Y+63 ; 0x3f 2d6b0: a1 97 sbiw r28, 0x21 ; 33 2d6b2: 30 93 e9 13 sts 0x13E9, r19 ; 0x8013e9 2d6b6: 20 93 e8 13 sts 0x13E8, r18 ; 0x8013e8 crmodTime = p.lastWriteTime; 2d6ba: 6f 96 adiw r28, 0x1f ; 31 2d6bc: 4e ad ldd r20, Y+62 ; 0x3e 2d6be: 5f ad ldd r21, Y+63 ; 0x3f 2d6c0: 6f 97 sbiw r28, 0x1f ; 31 2d6c2: 50 93 e7 13 sts 0x13E7, r21 ; 0x8013e7 2d6c6: 40 93 e6 13 sts 0x13E6, r20 ; 0x8013e6 // There are scenarios when simple modification time is not enough (on MS Windows) // For example - extract an old g-code from an archive onto the SD card. // In such case the creation time is current time (which is correct), but the modification time // stays the same - i.e. old. // Therefore let's pick the most recent timestamp from both creation and modification timestamps if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){ 2d6ca: 69 96 adiw r28, 0x19 ; 25 2d6cc: 8e ad ldd r24, Y+62 ; 0x3e 2d6ce: 9f ad ldd r25, Y+63 ; 0x3f 2d6d0: 69 97 sbiw r28, 0x19 ; 25 2d6d2: 28 17 cp r18, r24 2d6d4: 39 07 cpc r19, r25 2d6d6: 50 f0 brcs .+20 ; 0x2d6ec 2d6d8: 28 17 cp r18, r24 2d6da: 39 07 cpc r19, r25 2d6dc: 99 f4 brne .+38 ; 0x2d704 2d6de: 67 96 adiw r28, 0x17 ; 23 2d6e0: 2e ad ldd r18, Y+62 ; 0x3e 2d6e2: 3f ad ldd r19, Y+63 ; 0x3f 2d6e4: 67 97 sbiw r28, 0x17 ; 23 2d6e6: 42 17 cp r20, r18 2d6e8: 53 07 cpc r21, r19 2d6ea: 60 f4 brcc .+24 ; 0x2d704 crmodDate = p.creationDate; 2d6ec: 90 93 e9 13 sts 0x13E9, r25 ; 0x8013e9 2d6f0: 80 93 e8 13 sts 0x13E8, r24 ; 0x8013e8 crmodTime = p.creationTime; 2d6f4: 67 96 adiw r28, 0x17 ; 23 2d6f6: 8e ad ldd r24, Y+62 ; 0x3e 2d6f8: 9f ad ldd r25, Y+63 ; 0x3f 2d6fa: 67 97 sbiw r28, 0x17 ; 23 2d6fc: 90 93 e7 13 sts 0x13E7, r25 ; 0x8013e7 2d700: 80 93 e6 13 sts 0x13E6, r24 ; 0x8013e6 } //writeDate = p.lastAccessDate; if (match != NULL) { 2d704: 61 14 cp r6, r1 2d706: 71 04 cpc r7, r1 2d708: 59 f1 breq .+86 ; 0x2d760 if (strcasecmp(match, filename) == 0) return; 2d70a: 69 ed ldi r22, 0xD9 ; 217 2d70c: 73 e1 ldi r23, 0x13 ; 19 2d70e: c3 01 movw r24, r6 2d710: 0f 94 19 aa call 0x35432 ; 0x35432 2d714: 89 2b or r24, r25 2d716: 59 f5 brne .+86 ; 0x2d76e // RAII incrementer for the recursionCnt class _incrementer { public: _incrementer() {recursionCnt++;} ~_incrementer() {recursionCnt--;} 2d718: 80 91 45 0e lds r24, 0x0E45 ; 0x800e45 2d71c: 81 50 subi r24, 0x01 ; 1 2d71e: 80 93 45 0e sts 0x0E45, r24 ; 0x800e45 cnt++; break; } } } // while readDir } 2d722: 0f b6 in r0, 0x3f ; 63 2d724: f8 94 cli 2d726: 3e be out 0x3e, r3 ; 62 2d728: 0f be out 0x3f, r0 ; 63 2d72a: 2d be out 0x3d, r2 ; 61 2d72c: ca 58 subi r28, 0x8A ; 138 2d72e: df 4f sbci r29, 0xFF ; 255 2d730: 0f b6 in r0, 0x3f ; 63 2d732: f8 94 cli 2d734: de bf out 0x3e, r29 ; 62 2d736: 0f be out 0x3f, r0 ; 63 2d738: cd bf out 0x3d, r28 ; 61 2d73a: df 91 pop r29 2d73c: cf 91 pop r28 2d73e: 1f 91 pop r17 2d740: 0f 91 pop r16 2d742: ff 90 pop r15 2d744: ef 90 pop r14 2d746: df 90 pop r13 2d748: cf 90 pop r12 2d74a: bf 90 pop r11 2d74c: af 90 pop r10 2d74e: 9f 90 pop r9 2d750: 8f 90 pop r8 2d752: 7f 90 pop r7 2d754: 6f 90 pop r6 2d756: 5f 90 pop r5 2d758: 4f 90 pop r4 2d75a: 3f 90 pop r3 2d75c: 2f 90 pop r2 2d75e: 08 95 ret } //writeDate = p.lastAccessDate; if (match != NULL) { if (strcasecmp(match, filename) == 0) return; } else if (cnt == nrFiles) return; 2d760: 80 91 ef 16 lds r24, 0x16EF ; 0x8016ef 2d764: 90 91 f0 16 lds r25, 0x16F0 ; 0x8016f0 2d768: 48 16 cp r4, r24 2d76a: 19 06 cpc r1, r25 2d76c: a9 f2 breq .-86 ; 0x2d718 cnt++; 2d76e: 43 94 inc r4 2d770: 74 cf rjmp .-280 ; 0x2d65a 0002d772 : } } void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) 2d772: cf 92 push r12 2d774: df 92 push r13 2d776: ef 92 push r14 2d778: ff 92 push r15 2d77a: 0f 93 push r16 2d77c: cf 93 push r28 2d77e: df 93 push r29 2d780: cd b7 in r28, 0x3d ; 61 2d782: de b7 in r29, 0x3e ; 62 2d784: a3 97 sbiw r28, 0x23 ; 35 2d786: 0f b6 in r0, 0x3f ; 63 2d788: f8 94 cli 2d78a: de bf out 0x3e, r29 ; 62 2d78c: 0f be out 0x3f, r0 ; 63 2d78e: cd bf out 0x3d, r28 ; 61 2d790: 6c 01 movw r12, r24 { curDir=&workDir; 2d792: 80 e8 ldi r24, 0x80 ; 128 2d794: e8 2e mov r14, r24 2d796: 84 e1 ldi r24, 0x14 ; 20 2d798: f8 2e mov r15, r24 2d79a: 82 e8 ldi r24, 0x82 ; 130 2d79c: 94 e1 ldi r25, 0x14 ; 20 2d79e: d7 01 movw r26, r14 2d7a0: 8d 93 st X+, r24 2d7a2: 9c 93 st X, r25 nrFiles=nr; 2d7a4: 10 92 f0 16 sts 0x16F0, r1 ; 0x8016f0 2d7a8: 10 92 ef 16 sts 0x16EF, r1 ; 0x8016ef curDir->rewind(); 2d7ac: 0e 94 a6 79 call 0xf34c ; 0xf34c }; struct ls_param { bool LFN : 1; bool timestamp : 1; inline ls_param():LFN(0), timestamp(0) { } 2d7b0: 00 e0 ldi r16, 0x00 ; 0 2d7b2: 0e 7f andi r16, 0xFE ; 254 2d7b4: 0d 7f andi r16, 0xFD ; 253 lsDive("",*curDir,match, LS_GetFilename); 2d7b6: d7 01 movw r26, r14 2d7b8: ed 91 ld r30, X+ 2d7ba: fc 91 ld r31, X 2d7bc: 83 e2 ldi r24, 0x23 ; 35 2d7be: de 01 movw r26, r28 2d7c0: 11 96 adiw r26, 0x01 ; 1 2d7c2: 01 90 ld r0, Z+ 2d7c4: 0d 92 st X+, r0 2d7c6: 8a 95 dec r24 2d7c8: e1 f7 brne .-8 ; 0x2d7c2 2d7ca: 22 e0 ldi r18, 0x02 ; 2 2d7cc: a6 01 movw r20, r12 2d7ce: be 01 movw r22, r28 2d7d0: 6f 5f subi r22, 0xFF ; 255 2d7d2: 7f 4f sbci r23, 0xFF ; 255 2d7d4: 8f ed ldi r24, 0xDF ; 223 2d7d6: 92 e0 ldi r25, 0x02 ; 2 2d7d8: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2d7dc: ce 01 movw r24, r28 2d7de: 01 96 adiw r24, 0x01 ; 1 2d7e0: 0e 94 ab 79 call 0xf356 ; 0xf356 } 2d7e4: a3 96 adiw r28, 0x23 ; 35 2d7e6: 0f b6 in r0, 0x3f ; 63 2d7e8: f8 94 cli 2d7ea: de bf out 0x3e, r29 ; 62 2d7ec: 0f be out 0x3f, r0 ; 63 2d7ee: cd bf out 0x3d, r28 ; 61 2d7f0: df 91 pop r29 2d7f2: cf 91 pop r28 2d7f4: 0f 91 pop r16 2d7f6: ff 90 pop r15 2d7f8: ef 90 pop r14 2d7fa: df 90 pop r13 2d7fc: cf 90 pop r12 2d7fe: 08 95 ret 0002d800 : void CardReader::getfilename_simple(uint16_t entry, const char * const match/*=NULL*/) 2d800: ef 92 push r14 2d802: ff 92 push r15 2d804: 0f 93 push r16 2d806: cf 93 push r28 2d808: df 93 push r29 2d80a: cd b7 in r28, 0x3d ; 61 2d80c: de b7 in r29, 0x3e ; 62 2d80e: a3 97 sbiw r28, 0x23 ; 35 2d810: 0f b6 in r0, 0x3f ; 63 2d812: f8 94 cli 2d814: de bf out 0x3e, r29 ; 62 2d816: 0f be out 0x3f, r0 ; 63 2d818: cd bf out 0x3d, r28 ; 61 { curDir = &workDir; 2d81a: 20 e8 ldi r18, 0x80 ; 128 2d81c: e2 2e mov r14, r18 2d81e: 24 e1 ldi r18, 0x14 ; 20 2d820: f2 2e mov r15, r18 2d822: 22 e8 ldi r18, 0x82 ; 130 2d824: 34 e1 ldi r19, 0x14 ; 20 2d826: d7 01 movw r26, r14 2d828: 2d 93 st X+, r18 2d82a: 3c 93 st X, r19 nrFiles = 0; 2d82c: 10 92 f0 16 sts 0x16F0, r1 ; 0x8016f0 2d830: 10 92 ef 16 sts 0x16EF, r1 ; 0x8016ef curDir->seekSet((uint32_t)entry << 5); 2d834: b0 e0 ldi r27, 0x00 ; 0 2d836: a0 e0 ldi r26, 0x00 ; 0 2d838: ac 01 movw r20, r24 2d83a: bd 01 movw r22, r26 2d83c: e5 e0 ldi r30, 0x05 ; 5 2d83e: 44 0f add r20, r20 2d840: 55 1f adc r21, r21 2d842: 66 1f adc r22, r22 2d844: 77 1f adc r23, r23 2d846: ea 95 dec r30 2d848: d1 f7 brne .-12 ; 0x2d83e 2d84a: c9 01 movw r24, r18 2d84c: 0f 94 0b 2d call 0x25a16 ; 0x25a16 2d850: 00 e0 ldi r16, 0x00 ; 0 2d852: 0e 7f andi r16, 0xFE ; 254 2d854: 0d 7f andi r16, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 2d856: d7 01 movw r26, r14 2d858: ed 91 ld r30, X+ 2d85a: fc 91 ld r31, X 2d85c: 83 e2 ldi r24, 0x23 ; 35 2d85e: de 01 movw r26, r28 2d860: 11 96 adiw r26, 0x01 ; 1 2d862: 01 90 ld r0, Z+ 2d864: 0d 92 st X+, r0 2d866: 8a 95 dec r24 2d868: e1 f7 brne .-8 ; 0x2d862 2d86a: 22 e0 ldi r18, 0x02 ; 2 2d86c: 50 e0 ldi r21, 0x00 ; 0 2d86e: 40 e0 ldi r20, 0x00 ; 0 2d870: be 01 movw r22, r28 2d872: 6f 5f subi r22, 0xFF ; 255 2d874: 7f 4f sbci r23, 0xFF ; 255 2d876: 8f ed ldi r24, 0xDF ; 223 2d878: 92 e0 ldi r25, 0x02 ; 2 2d87a: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2d87e: ce 01 movw r24, r28 2d880: 01 96 adiw r24, 0x01 ; 1 2d882: 0e 94 ab 79 call 0xf356 ; 0xf356 } 2d886: a3 96 adiw r28, 0x23 ; 35 2d888: 0f b6 in r0, 0x3f ; 63 2d88a: f8 94 cli 2d88c: de bf out 0x3e, r29 ; 62 2d88e: 0f be out 0x3f, r0 ; 63 2d890: cd bf out 0x3d, r28 ; 61 2d892: df 91 pop r29 2d894: cf 91 pop r28 2d896: 0f 91 pop r16 2d898: ff 90 pop r15 2d89a: ef 90 pop r14 2d89c: 08 95 ret 0002d89e : nrFiles = 1; curDir->seekSet(position); lsDive("", *curDir, match, LS_GetFilename); } uint16_t CardReader::getnrfilenames() 2d89e: cf 92 push r12 2d8a0: df 92 push r13 2d8a2: ef 92 push r14 2d8a4: ff 92 push r15 2d8a6: 0f 93 push r16 2d8a8: cf 93 push r28 2d8aa: df 93 push r29 2d8ac: cd b7 in r28, 0x3d ; 61 2d8ae: de b7 in r29, 0x3e ; 62 2d8b0: a3 97 sbiw r28, 0x23 ; 35 2d8b2: 0f b6 in r0, 0x3f ; 63 2d8b4: f8 94 cli 2d8b6: de bf out 0x3e, r29 ; 62 2d8b8: 0f be out 0x3f, r0 ; 63 2d8ba: cd bf out 0x3d, r28 ; 61 { curDir=&workDir; 2d8bc: 80 e8 ldi r24, 0x80 ; 128 2d8be: c8 2e mov r12, r24 2d8c0: 84 e1 ldi r24, 0x14 ; 20 2d8c2: d8 2e mov r13, r24 2d8c4: 82 e8 ldi r24, 0x82 ; 130 2d8c6: 94 e1 ldi r25, 0x14 ; 20 2d8c8: d6 01 movw r26, r12 2d8ca: 8d 93 st X+, r24 2d8cc: 9c 93 st X, r25 nrFiles=0; 2d8ce: 2f ee ldi r18, 0xEF ; 239 2d8d0: e2 2e mov r14, r18 2d8d2: 26 e1 ldi r18, 0x16 ; 22 2d8d4: f2 2e mov r15, r18 2d8d6: f7 01 movw r30, r14 2d8d8: 11 82 std Z+1, r1 ; 0x01 2d8da: 10 82 st Z, r1 curDir->rewind(); 2d8dc: 0e 94 a6 79 call 0xf34c ; 0xf34c 2d8e0: 00 e0 ldi r16, 0x00 ; 0 2d8e2: 0e 7f andi r16, 0xFE ; 254 2d8e4: 0d 7f andi r16, 0xFD ; 253 lsDive("",*curDir, NULL, LS_Count); 2d8e6: d6 01 movw r26, r12 2d8e8: ed 91 ld r30, X+ 2d8ea: fc 91 ld r31, X 2d8ec: 83 e2 ldi r24, 0x23 ; 35 2d8ee: de 01 movw r26, r28 2d8f0: 11 96 adiw r26, 0x01 ; 1 2d8f2: 01 90 ld r0, Z+ 2d8f4: 0d 92 st X+, r0 2d8f6: 8a 95 dec r24 2d8f8: e1 f7 brne .-8 ; 0x2d8f2 2d8fa: 21 e0 ldi r18, 0x01 ; 1 2d8fc: 50 e0 ldi r21, 0x00 ; 0 2d8fe: 40 e0 ldi r20, 0x00 ; 0 2d900: be 01 movw r22, r28 2d902: 6f 5f subi r22, 0xFF ; 255 2d904: 7f 4f sbci r23, 0xFF ; 255 2d906: 8f ed ldi r24, 0xDF ; 223 2d908: 92 e0 ldi r25, 0x02 ; 2 2d90a: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2d90e: ce 01 movw r24, r28 2d910: 01 96 adiw r24, 0x01 ; 1 2d912: 0e 94 ab 79 call 0xf356 ; 0xf356 //SERIAL_ECHOLN(nrFiles); return nrFiles; } 2d916: f7 01 movw r30, r14 2d918: 80 81 ld r24, Z 2d91a: 91 81 ldd r25, Z+1 ; 0x01 2d91c: a3 96 adiw r28, 0x23 ; 35 2d91e: 0f b6 in r0, 0x3f ; 63 2d920: f8 94 cli 2d922: de bf out 0x3e, r29 ; 62 2d924: 0f be out 0x3f, r0 ; 63 2d926: cd bf out 0x3d, r28 ; 61 2d928: df 91 pop r29 2d92a: cf 91 pop r28 2d92c: 0f 91 pop r16 2d92e: ff 90 pop r15 2d930: ef 90 pop r14 2d932: df 90 pop r13 2d934: cf 90 pop r12 2d936: 08 95 ret 0002d938 : file.getFilename(t); else t[0]=0; } void CardReader::printAbsFilenameFast() 2d938: cf 93 push r28 2d93a: df 93 push r29 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2d93c: 8f e2 ldi r24, 0x2F ; 47 2d93e: 0e 94 b1 79 call 0xf362 ; 0xf362 { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2d942: c0 e0 ldi r28, 0x00 ; 0 { SERIAL_PROTOCOL(dir_names[i]); 2d944: d9 e0 ldi r29, 0x09 ; 9 } void CardReader::printAbsFilenameFast() { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2d946: 80 91 77 15 lds r24, 0x1577 ; 0x801577 2d94a: c8 17 cp r28, r24 2d94c: 60 f4 brcc .+24 ; 0x2d966 { SERIAL_PROTOCOL(dir_names[i]); 2d94e: cd 9f mul r28, r29 2d950: c0 01 movw r24, r0 2d952: 11 24 eor r1, r1 2d954: 89 5d subi r24, 0xD9 ; 217 2d956: 9b 4e sbci r25, 0xEB ; 235 2d958: 0e 94 95 87 call 0x10f2a ; 0x10f2a 2d95c: 8f e2 ldi r24, 0x2F ; 47 2d95e: 0e 94 b1 79 call 0xf362 ; 0xf362 } void CardReader::printAbsFilenameFast() { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2d962: cf 5f subi r28, 0xFF ; 255 2d964: f0 cf rjmp .-32 ; 0x2d946 { SERIAL_PROTOCOL(dir_names[i]); SERIAL_PROTOCOL('/'); } SERIAL_PROTOCOL(LONGEST_FILENAME); 2d966: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2d96a: 81 11 cpse r24, r1 2d96c: 06 c0 rjmp .+12 ; 0x2d97a 2d96e: 89 ed ldi r24, 0xD9 ; 217 2d970: 93 e1 ldi r25, 0x13 ; 19 } 2d972: df 91 pop r29 2d974: cf 91 pop r28 2d976: 0c 94 95 87 jmp 0x10f2a ; 0x10f2a for (uint8_t i = 0; i < getWorkDirDepth(); i++) { SERIAL_PROTOCOL(dir_names[i]); SERIAL_PROTOCOL('/'); } SERIAL_PROTOCOL(LONGEST_FILENAME); 2d97a: 8e ee ldi r24, 0xEE ; 238 2d97c: 93 e1 ldi r25, 0x13 ; 19 2d97e: f9 cf rjmp .-14 ; 0x2d972 0002d980 : void __attribute__((noinline)) eeprom_add_word(uint16_t *__p, uint16_t add) { eeprom_write_word_notify(__p, eeprom_read_word(__p) + add); } void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) { 2d980: cf 92 push r12 2d982: df 92 push r13 2d984: ef 92 push r14 2d986: ff 92 push r15 2d988: 6b 01 movw r12, r22 2d98a: 7c 01 movw r14, r24 eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add); 2d98c: 88 ea ldi r24, 0xA8 ; 168 2d98e: 9c e0 ldi r25, 0x0C ; 12 2d990: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 2d994: ab 01 movw r20, r22 2d996: bc 01 movw r22, r24 2d998: 4c 0d add r20, r12 2d99a: 5d 1d adc r21, r13 2d99c: 6e 1d adc r22, r14 2d99e: 7f 1d adc r23, r15 if (active) { uint32_t previous_value = eeprom_read_dword(dst); eeprom_dword_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_dword(dst, value); 2d9a0: 88 ea ldi r24, 0xA8 ; 168 2d9a2: 9c e0 ldi r25, 0x0C ; 12 eeprom_write_word_notify(__p, eeprom_read_word(__p) + add); } void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) { eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add); } 2d9a4: ff 90 pop r15 2d9a6: ef 90 pop r14 2d9a8: df 90 pop r13 2d9aa: cf 90 pop r12 if (active) { uint32_t previous_value = eeprom_read_dword(dst); eeprom_dword_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_dword(dst, value); 2d9ac: 0d 94 36 a4 jmp 0x3486c ; 0x3486c 0002d9b0 : return def; } return val; } uint32_t __attribute__((noinline)) eeprom_init_default_dword(uint32_t *__p, uint32_t def) { 2d9b0: cf 93 push r28 2d9b2: df 93 push r29 2d9b4: ec 01 movw r28, r24 uint32_t val = eeprom_read_dword(__p); 2d9b6: 0f 94 e8 a3 call 0x347d0 ; 0x347d0 if (val == EEPROM_EMPTY_VALUE32) { 2d9ba: 6f 3f cpi r22, 0xFF ; 255 2d9bc: 2f ef ldi r18, 0xFF ; 255 2d9be: 72 07 cpc r23, r18 2d9c0: 82 07 cpc r24, r18 2d9c2: 92 07 cpc r25, r18 2d9c4: 49 f4 brne .+18 ; 0x2d9d8 if (active) { uint32_t previous_value = eeprom_read_dword(dst); eeprom_dword_notify(dst, previous_value, value, true); } #endif //DEBUG_EEPROM_CHANGES eeprom_write_dword(dst, value); 2d9c6: 40 e0 ldi r20, 0x00 ; 0 2d9c8: 50 e0 ldi r21, 0x00 ; 0 2d9ca: ba 01 movw r22, r20 2d9cc: ce 01 movw r24, r28 2d9ce: 0f 94 36 a4 call 0x3486c ; 0x3486c uint32_t __attribute__((noinline)) eeprom_init_default_dword(uint32_t *__p, uint32_t def) { uint32_t val = eeprom_read_dword(__p); if (val == EEPROM_EMPTY_VALUE32) { eeprom_write_dword_notify(__p, def); return def; 2d9d2: 60 e0 ldi r22, 0x00 ; 0 2d9d4: 70 e0 ldi r23, 0x00 ; 0 2d9d6: cb 01 movw r24, r22 } return val; } 2d9d8: df 91 pop r29 2d9da: cf 91 pop r28 2d9dc: 08 95 ret 0002d9de : : "z" (startP) /* input of the ASM code - in our case the Z register as well (R30:R31) */ \ : "r22" /* modifying register R22 - so that the compiler knows */ \ ) // avoid calling the default heavy-weight read() for just one byte int16_t SdFile::readFilteredGcode(){ 2d9de: 0f 93 push r16 2d9e0: 1f 93 push r17 2d9e2: cf 93 push r28 2d9e4: df 93 push r29 if( ! gfEnsureBlock() ){ 2d9e6: 0f 94 c8 5a call 0x2b590 ; 0x2b590 2d9ea: 88 23 and r24, r24 2d9ec: 39 f1 breq .+78 ; 0x2da3c goto eof_or_fail; // this is unfortunate :( ... other calls are using the cache and we can loose the data block of our gcode file } // assume, we have the 512B block cache filled and terminated with a '\n' { const uint8_t *start = gfReadPtr; 2d9ee: 20 91 82 16 lds r18, 0x1682 ; 0x801682 2d9f2: 30 91 83 16 lds r19, 0x1683 ; 0x801683 // to gfReadPtr within this method, because it is a class member variable. // The compiler cannot see, if omitting read/write won't have any incorrect side-effects to the rest of the whole FW. // So this trick explicitly states, that rdPtr is a local variable limited to the scope of this method, // therefore the compiler can omit read/write to it (keep it in registers!) as it sees fit. // And it does! Codesize dropped by 68B! const uint8_t *rdPtr = gfReadPtr; 2d9f6: e9 01 movw r28, r18 if( ! gfEnsureBlock() ){ goto eof_or_fail; // this is unfortunate :( ... other calls are using the cache and we can loose the data block of our gcode file } // assume, we have the 512B block cache filled and terminated with a '\n' { const uint8_t *start = gfReadPtr; 2d9f8: 1b ef ldi r17, 0xFB ; 251 // the same applies to gfXBegin, codesize dropped another 100B! const uint8_t *blockBuffBegin = gfBlockBuffBegin(); uint8_t consecutiveCommentLines = 0; while( *rdPtr == ';' ){ 2d9fa: 88 81 ld r24, Y 2d9fc: 8b 33 cpi r24, 0x3B ; 59 2d9fe: 51 f5 brne .+84 ; 0x2da54 // 11c68: brne .-12 ; 0x11c5e // Still, even that was suboptimal as the compiler seems not to understand the usage of ld r22, Z+ (the plus is important) // aka automatic increment of the Z register (R30:R31 pair) // There is no other way than pure ASM! find_endl(rdPtr, rdPtr); 2da00: fe 01 movw r30, r28 0002da02 : 2da02: 61 91 ld r22, Z+ 2da04: 6a 30 cpi r22, 0x0A ; 10 2da06: e9 f7 brne .-6 ; 0x2da02 2da08: ef 01 movw r28, r30 // found a newline, prepare the next block if block cache end reached if( rdPtr - blockBuffBegin > 512 ){ 2da0a: cf 01 movw r24, r30 2da0c: 86 54 subi r24, 0x46 ; 70 2da0e: 9e 40 sbci r25, 0x0E ; 14 2da10: 81 30 cpi r24, 0x01 ; 1 2da12: 92 40 sbci r25, 0x02 ; 2 2da14: e4 f0 brlt .+56 ; 0x2da4e // at the end of block cache, fill new data in gfUpdateCurrentPosition( rdPtr - start - 1 ); 2da16: ce 01 movw r24, r28 2da18: 82 1b sub r24, r18 2da1a: 93 0b sbc r25, r19 2da1c: 01 97 sbiw r24, 0x01 ; 1 2da1e: 0f 94 a4 55 call 0x2ab48 ; 0x2ab48 if( ! gfComputeNextFileBlock() )goto eof_or_fail; 2da22: 87 e6 ldi r24, 0x67 ; 103 2da24: 96 e1 ldi r25, 0x16 ; 22 2da26: 0f 94 92 2c call 0x25924 ; 0x25924 2da2a: 88 23 and r24, r24 2da2c: 39 f0 breq .+14 ; 0x2da3c if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM 2da2e: 0f 94 c8 5a call 0x2b590 ; 0x2b590 rdPtr = start = blockBuffBegin; 2da32: 26 e4 ldi r18, 0x46 ; 70 2da34: 3e e0 ldi r19, 0x0E ; 14 2da36: e9 01 movw r28, r18 // found a newline, prepare the next block if block cache end reached if( rdPtr - blockBuffBegin > 512 ){ // at the end of block cache, fill new data in gfUpdateCurrentPosition( rdPtr - start - 1 ); if( ! gfComputeNextFileBlock() )goto eof_or_fail; if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM 2da38: 81 11 cpse r24, r1 2da3a: e2 cf rjmp .-60 ; 0x2da00 } eof_or_fail: // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; 2da3c: 86 e4 ldi r24, 0x46 ; 70 2da3e: 90 e1 ldi r25, 0x10 ; 16 2da40: 90 93 83 16 sts 0x1683, r25 ; 0x801683 2da44: 80 93 82 16 sts 0x1682, r24 ; 0x801682 return -1; 2da48: cf ef ldi r28, 0xFF ; 255 2da4a: df ef ldi r29, 0xFF ; 255 2da4c: 34 c0 rjmp .+104 ; 0x2dab6 2da4e: 11 50 subi r17, 0x01 ; 1 gfUpdateCurrentPosition( rdPtr - start - 1 ); if( ! gfComputeNextFileBlock() )goto eof_or_fail; if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM rdPtr = start = blockBuffBegin; } else { if(consecutiveCommentLines >= 250){ 2da50: c1 f5 brne .+112 ; 0x2dac2 // peek the next byte - we are inside the block at least at 511th index - still safe if( *rdPtr == ';' ){ // consecutive comment ++consecutiveCommentLines; } else { --rdPtr; // unget the already consumed newline 2da52: 21 97 sbiw r28, 0x01 ; 1 } } } emit_char: { gfUpdateCurrentPosition( rdPtr - start + 1 ); 2da54: ce 01 movw r24, r28 2da56: 82 1b sub r24, r18 2da58: 93 0b sbc r25, r19 2da5a: 01 96 adiw r24, 0x01 ; 1 2da5c: 0f 94 a4 55 call 0x2ab48 ; 0x2ab48 int16_t rv = *rdPtr++; 2da60: ce 01 movw r24, r28 2da62: 01 96 adiw r24, 0x01 ; 1 2da64: c8 81 ld r28, Y 2da66: d0 e0 ldi r29, 0x00 ; 0 if( curPosition_ >= fileSize_ ){ 2da68: 00 91 6f 16 lds r16, 0x166F ; 0x80166f 2da6c: 10 91 70 16 lds r17, 0x1670 ; 0x801670 2da70: 20 91 71 16 lds r18, 0x1671 ; 0x801671 2da74: 30 91 72 16 lds r19, 0x1672 ; 0x801672 2da78: 40 91 78 16 lds r20, 0x1678 ; 0x801678 2da7c: 50 91 79 16 lds r21, 0x1679 ; 0x801679 2da80: 60 91 7a 16 lds r22, 0x167A ; 0x80167a 2da84: 70 91 7b 16 lds r23, 0x167B ; 0x80167b 2da88: 04 17 cp r16, r20 2da8a: 15 07 cpc r17, r21 2da8c: 26 07 cpc r18, r22 2da8e: 37 07 cpc r19, r23 2da90: a8 f6 brcc .-86 ; 0x2da3c // past the end of file goto eof_or_fail; } else if( rdPtr - blockBuffBegin >= 512 ){ 2da92: 9c 01 movw r18, r24 2da94: 26 54 subi r18, 0x46 ; 70 2da96: 3e 40 sbci r19, 0x0E ; 14 2da98: 21 15 cp r18, r1 2da9a: 32 40 sbci r19, 0x02 ; 2 2da9c: 44 f0 brlt .+16 ; 0x2daae // past the end of current bufferred block - prepare the next one... if( ! gfComputeNextFileBlock() )goto eof_or_fail; 2da9e: 87 e6 ldi r24, 0x67 ; 103 2daa0: 96 e1 ldi r25, 0x16 ; 22 2daa2: 0f 94 92 2c call 0x25924 ; 0x25924 2daa6: 88 23 and r24, r24 2daa8: 49 f2 breq .-110 ; 0x2da3c // don't need to force fetch the block here, it will get loaded on the next call rdPtr = blockBuffBegin; 2daaa: 86 e4 ldi r24, 0x46 ; 70 2daac: 9e e0 ldi r25, 0x0E ; 14 } // save the current read ptr for the next run gfReadPtr = rdPtr; 2daae: 90 93 83 16 sts 0x1683, r25 ; 0x801683 2dab2: 80 93 82 16 sts 0x1682, r24 ; 0x801682 eof_or_fail: // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; return -1; } 2dab6: ce 01 movw r24, r28 2dab8: df 91 pop r29 2daba: cf 91 pop r28 2dabc: 1f 91 pop r17 2dabe: 0f 91 pop r16 2dac0: 08 95 ret if(consecutiveCommentLines >= 250){ --rdPtr; // unget the already consumed newline goto emit_char; } // peek the next byte - we are inside the block at least at 511th index - still safe if( *rdPtr == ';' ){ 2dac2: 88 81 ld r24, Y 2dac4: 8b 33 cpi r24, 0x3B ; 59 2dac6: 09 f4 brne .+2 ; 0x2daca 2dac8: 98 cf rjmp .-208 ; 0x2d9fa 2daca: c3 cf rjmp .-122 ; 0x2da52 0002dacc : } return 0; } static uint8_t twi_start(uint8_t address, uint8_t reg) 2dacc: cf 93 push r28 2dace: df 93 push r29 2dad0: d8 2f mov r29, r24 { // send start condition TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); 2dad2: 84 ea ldi r24, 0xA4 ; 164 2dad4: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_START)) 2dad8: 88 e0 ldi r24, 0x08 ; 8 2dada: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 2dade: 81 11 cpse r24, r1 2dae0: 16 c0 rjmp .+44 ; 0x2db0e return 1; // send address TWDR = TW_WRITE | (address << 1); 2dae2: 8a ee ldi r24, 0xEA ; 234 2dae4: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2dae8: c4 e8 ldi r28, 0x84 ; 132 2daea: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_SLA_ACK)) 2daee: 88 e1 ldi r24, 0x18 ; 24 2daf0: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 2daf4: 81 11 cpse r24, r1 2daf6: 0f c0 rjmp .+30 ; 0x2db16 return 2; // send register TWDR = reg; 2daf8: d0 93 bb 00 sts 0x00BB, r29 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2dafc: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_DATA_ACK)) 2db00: 88 e2 ldi r24, 0x28 ; 40 2db02: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 2db06: 88 23 and r24, r24 2db08: 19 f0 breq .+6 ; 0x2db10 return 3; 2db0a: 83 e0 ldi r24, 0x03 ; 3 2db0c: 01 c0 rjmp .+2 ; 0x2db10 static uint8_t twi_start(uint8_t address, uint8_t reg) { // send start condition TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); if(twi_wait(TW_START)) return 1; 2db0e: 81 e0 ldi r24, 0x01 ; 1 TWCR = _BV(TWEN) | _BV(TWINT); if(twi_wait(TW_MT_DATA_ACK)) return 3; return 0; } 2db10: df 91 pop r29 2db12: cf 91 pop r28 2db14: 08 95 ret // send address TWDR = TW_WRITE | (address << 1); TWCR = _BV(TWEN) | _BV(TWINT); if(twi_wait(TW_MT_SLA_ACK)) return 2; 2db16: 82 e0 ldi r24, 0x02 ; 2 2db18: fb cf rjmp .-10 ; 0x2db10 0002db1a : ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; } return ret; } void PAT9125_sensor::resetStepCount() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; } 2db1a: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 2db1c: f8 94 cli 2db1e: 10 92 03 17 sts 0x1703, r1 ; 0x801703 2db22: 10 92 02 17 sts 0x1702, r1 ; 0x801702 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2db26: 8f bf out 0x3f, r24 ; 63 } 2db28: 08 95 ret 0002db2a : eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR_ACTION_NA, (uint8_t)state); } } void Filament_sensor::settings_init_common() { bool enabled = eeprom_read_byte((uint8_t *)EEPROM_FSENSOR); 2db2a: 87 e6 ldi r24, 0x67 ; 103 2db2c: 9f e0 ldi r25, 0x0F ; 15 2db2e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2db32: 91 e0 ldi r25, 0x01 ; 1 2db34: 81 11 cpse r24, r1 2db36: 01 c0 rjmp .+2 ; 0x2db3a 2db38: 90 e0 ldi r25, 0x00 ; 0 if ((state != State::disabled) != enabled) { 2db3a: 81 e0 ldi r24, 0x01 ; 1 2db3c: 20 91 f1 16 lds r18, 0x16F1 ; 0x8016f1 2db40: 21 11 cpse r18, r1 2db42: 01 c0 rjmp .+2 ; 0x2db46 2db44: 80 e0 ldi r24, 0x00 ; 0 2db46: 98 13 cpse r25, r24 state = enabled ? State::initializing : State::disabled; 2db48: 90 93 f1 16 sts 0x16F1, r25 ; 0x8016f1 } autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED); 2db4c: 87 e0 ldi r24, 0x07 ; 7 2db4e: 9f e0 ldi r25, 0x0F ; 15 2db50: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2db54: 91 e0 ldi r25, 0x01 ; 1 2db56: 81 11 cpse r24, r1 2db58: 01 c0 rjmp .+2 ; 0x2db5c 2db5a: 90 e0 ldi r25, 0x00 ; 0 2db5c: 90 93 f2 16 sts 0x16F2, r25 ; 0x8016f2 runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED); 2db60: 85 ed ldi r24, 0xD5 ; 213 2db62: 9e e0 ldi r25, 0x0E ; 14 2db64: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2db68: 91 e0 ldi r25, 0x01 ; 1 2db6a: 81 11 cpse r24, r1 2db6c: 01 c0 rjmp .+2 ; 0x2db70 2db6e: 90 e0 ldi r25, 0x00 ; 0 2db70: 90 93 f3 16 sts 0x16F3, r25 ; 0x8016f3 sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA); 2db74: 87 e4 ldi r24, 0x47 ; 71 2db76: 9d e0 ldi r25, 0x0D ; 13 2db78: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 if (sensorActionOnError == SensorActionOnError::_Undef) { 2db7c: 8f 3f cpi r24, 0xFF ; 255 2db7e: c9 f0 breq .+50 ; 0x2dbb2 state = enabled ? State::initializing : State::disabled; } autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED); runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED); sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA); 2db80: 80 93 f9 16 sts 0x16F9, r24 ; 0x8016f9 } void PAT9125_sensor::settings_init() { // puts_P(PSTR("settings_init")); Filament_sensor::settings_init_common(); setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION)); 2db84: 8d ea ldi r24, 0xAD ; 173 2db86: 9c e0 ldi r25, 0x0C ; 12 2db88: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2db8c: 91 e0 ldi r25, 0x01 ; 1 2db8e: 81 11 cpse r24, r1 2db90: 01 c0 rjmp .+2 ; 0x2db94 2db92: 90 e0 ldi r25, 0x00 ; 0 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 2db94: 90 93 ff 16 sts 0x16FF, r25 ; 0x8016ff oldPos = pat9125_y; 2db98: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 2db9c: 90 91 39 0e lds r25, 0x0E39 ; 0x800e39 2dba0: 90 93 01 17 sts 0x1701, r25 ; 0x801701 2dba4: 80 93 00 17 sts 0x1700, r24 ; 0x801700 resetStepCount(); 2dba8: 0f 94 8d 6d call 0x2db1a ; 0x2db1a jamErrCnt = 0; 2dbac: 10 92 06 17 sts 0x1706, r1 ; 0x801706 void PAT9125_sensor::settings_init() { // puts_P(PSTR("settings_init")); Filament_sensor::settings_init_common(); setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION)); } 2dbb0: 08 95 ret autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED); runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED); sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA); if (sensorActionOnError == SensorActionOnError::_Undef) { sensorActionOnError = SensorActionOnError::_Continue; 2dbb2: 10 92 f9 16 sts 0x16F9, r1 ; 0x8016f9 2dbb6: e6 cf rjmp .-52 ; 0x2db84 0002dbb8 : #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) #if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) void PAT9125_sensor::init() { if (state == State::error) { 2dbb8: 80 91 f1 16 lds r24, 0x16F1 ; 0x8016f1 2dbbc: 83 30 cpi r24, 0x03 ; 3 2dbbe: 21 f4 brne .+8 ; 0x2dbc8 } void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; 2dbc0: 10 92 f1 16 sts 0x16F1, r1 ; 0x8016f1 filter = 0; 2dbc4: 10 92 fd 16 sts 0x16FD, r1 ; 0x8016fd if (state == State::error) { deinit(); // deinit first if there was an error. } // puts_P(PSTR("fsensor::init()")); settings_init(); // also sets the state to State::initializing 2dbc8: 0f 94 95 6d call 0x2db2a ; 0x2db2a int16_t stepCount; int16_t chunkSteps; uint8_t jamErrCnt; constexpr void calcChunkSteps(float u) { chunkSteps = (int16_t)(1.25 * u); //[mm] 2dbcc: 20 e0 ldi r18, 0x00 ; 0 2dbce: 30 e0 ldi r19, 0x00 ; 0 2dbd0: 40 ea ldi r20, 0xA0 ; 160 2dbd2: 5f e3 ldi r21, 0x3F ; 63 2dbd4: 60 91 77 0d lds r22, 0x0D77 ; 0x800d77 2dbd8: 70 91 78 0d lds r23, 0x0D78 ; 0x800d78 2dbdc: 80 91 79 0d lds r24, 0x0D79 ; 0x800d79 2dbe0: 90 91 7a 0d lds r25, 0x0D7A ; 0x800d7a 2dbe4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2dbe8: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 2dbec: 70 93 05 17 sts 0x1705, r23 ; 0x801705 2dbf0: 60 93 04 17 sts 0x1704, r22 ; 0x801704 void twi_init(void) { // activate internal pullups for SDA SET_INPUT(SDA_PIN); 2dbf4: 51 98 cbi 0x0a, 1 ; 10 WRITE(SDA_PIN, 1); 2dbf6: 59 9a sbi 0x0b, 1 ; 11 // start with the SDA pulled low WRITE(SCL_PIN, 0); 2dbf8: 58 98 cbi 0x0b, 0 ; 11 SET_OUTPUT(SCL_PIN); 2dbfa: 50 9a sbi 0x0a, 0 ; 10 2dbfc: 8a e0 ldi r24, 0x0A ; 10 // clock 10 cycles to make sure that the sensor is not stuck in a register read. for (uint8_t i = 0; i < 10; i++) { WRITE(SCL_PIN, 1); 2dbfe: 58 9a sbi 0x0b, 0 ; 11 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 2dc00: 95 e0 ldi r25, 0x05 ; 5 2dc02: 9a 95 dec r25 2dc04: f1 f7 brne .-4 ; 0x2dc02 2dc06: 00 00 nop _delay_us((1000000 / TWI_FREQ) / 2); WRITE(SCL_PIN, 0); 2dc08: 58 98 cbi 0x0b, 0 ; 11 2dc0a: 95 e0 ldi r25, 0x05 ; 5 2dc0c: 9a 95 dec r25 2dc0e: f1 f7 brne .-4 ; 0x2dc0c 2dc10: 00 00 nop 2dc12: 81 50 subi r24, 0x01 ; 1 // start with the SDA pulled low WRITE(SCL_PIN, 0); SET_OUTPUT(SCL_PIN); // clock 10 cycles to make sure that the sensor is not stuck in a register read. for (uint8_t i = 0; i < 10; i++) { 2dc14: a1 f7 brne .-24 ; 0x2dbfe WRITE(SCL_PIN, 0); _delay_us((1000000 / TWI_FREQ) / 2); } // activate internal pullups for SCL SET_INPUT(SCL_PIN); 2dc16: 50 98 cbi 0x0a, 0 ; 10 WRITE(SCL_PIN, 1); 2dc18: 58 9a sbi 0x0b, 0 ; 11 // initialize twi prescaler and bit rate TWSR &= ~(_BV(TWPS0) | _BV(TWPS1)); 2dc1a: 80 91 b9 00 lds r24, 0x00B9 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> 2dc1e: 8c 7f andi r24, 0xFC ; 252 2dc20: 80 93 b9 00 sts 0x00B9, r24 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> TWBR = ((F_CPU / TWI_FREQ) - 16) / 2; 2dc24: 8c e0 ldi r24, 0x0C ; 12 2dc26: 80 93 b8 00 sts 0x00B8, r24 ; 0x8000b8 <__TEXT_REGION_LENGTH__+0x7c20b8> uint8_t twi_check(uint8_t address) { // send start condition TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); 2dc2a: 84 ea ldi r24, 0xA4 ; 164 2dc2c: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_START)) 2dc30: 88 e0 ldi r24, 0x08 ; 8 2dc32: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 2dc36: 81 11 cpse r24, r1 2dc38: 67 c0 rjmp .+206 ; 0x2dd08 return 1; // send address TWDR = TW_WRITE | (address << 1); 2dc3a: 8a ee ldi r24, 0xEA ; 234 2dc3c: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2dc40: 84 e8 ldi r24, 0x84 ; 132 2dc42: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_SLA_ACK)) 2dc46: 88 e1 ldi r24, 0x18 ; 24 2dc48: 0f 94 5a 0e call 0x21cb4 ; 0x21cb4 2dc4c: 81 11 cpse r24, r1 2dc4e: 5c c0 rjmp .+184 ; 0x2dd08 } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 2dc50: 84 e9 ldi r24, 0x94 ; 148 2dc52: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> { if (!pat9125_probe()) return 0; // Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register. pat9125_wr_reg(PAT9125_BANK_SELECTION, 0); 2dc56: 60 e0 ldi r22, 0x00 ; 0 2dc58: 8f e7 ldi r24, 0x7F ; 127 2dc5a: 0f 94 46 4f call 0x29e8c ; 0x29e8c // Verify that the sensor responds with its correct product ID. pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); 2dc5e: 80 e0 ldi r24, 0x00 ; 0 2dc60: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dc64: 80 93 66 0d sts 0x0D66, r24 ; 0x800d66 pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2dc68: 81 e0 ldi r24, 0x01 ; 1 2dc6a: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dc6e: 80 93 65 0d sts 0x0D65, r24 ; 0x800d65 if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) 2dc72: 90 91 66 0d lds r25, 0x0D66 ; 0x800d66 2dc76: 91 33 cpi r25, 0x31 ; 49 2dc78: b1 f5 brne .+108 ; 0x2dce6 2dc7a: 81 39 cpi r24, 0x91 ; 145 2dc7c: a1 f5 brne .+104 ; 0x2dce6 } #if PAT9125_NEW_INIT // Software reset (i.e. set bit7 to 1). It will reset to 0 automatically. // pat9125_wr_reg_verify is not allowed because the register contents will change as soon as they are written. No point in verifying those. pat9125_wr_reg(PAT9125_CONFIG, 0x97); 2dc7e: 67 e9 ldi r22, 0x97 ; 151 2dc80: 86 e0 ldi r24, 0x06 ; 6 2dc82: 0f 94 46 4f call 0x29e8c ; 0x29e8c #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 2dc86: 8f e9 ldi r24, 0x9F ; 159 2dc88: 9f e0 ldi r25, 0x0F ; 15 2dc8a: 01 97 sbiw r24, 0x01 ; 1 2dc8c: f1 f7 brne .-4 ; 0x2dc8a 2dc8e: 00 c0 rjmp .+0 ; 0x2dc90 2dc90: 00 00 nop // Wait until the sensor reboots. _delay_ms(1); //Write init sequence in bank0. MUST ALREADY BE IN bank0. if (!pat9125_wr_seq(pat9125_init_bank0)) 2dc92: 80 e0 ldi r24, 0x00 ; 0 2dc94: 91 ea ldi r25, 0xA1 ; 161 2dc96: 0f 94 8e 4f call 0x29f1c ; 0x29f1c 2dc9a: 88 23 and r24, r24 2dc9c: a9 f1 breq .+106 ; 0x2dd08 2dc9e: 8f e3 ldi r24, 0x3F ; 63 2dca0: 9c e9 ldi r25, 0x9C ; 156 2dca2: 01 97 sbiw r24, 0x01 ; 1 2dca4: f1 f7 brne .-4 ; 0x2dca2 2dca6: 00 c0 rjmp .+0 ; 0x2dca8 2dca8: 00 00 nop return 0; _delay_ms(10); // not sure why this is here. But I'll allow it. // Switch to bank1, not allowed to perform pat9125_wr_reg_verify on this register. pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x01); 2dcaa: 61 e0 ldi r22, 0x01 ; 1 2dcac: 8f e7 ldi r24, 0x7F ; 127 2dcae: 0f 94 46 4f call 0x29e8c ; 0x29e8c //Write init sequence in bank1. MUST ALREADY BE IN bank1. if (!pat9125_wr_seq(pat9125_init_bank1)) 2dcb2: 8d ec ldi r24, 0xCD ; 205 2dcb4: 90 ea ldi r25, 0xA0 ; 160 2dcb6: 0f 94 8e 4f call 0x29f1c ; 0x29f1c 2dcba: 88 23 and r24, r24 2dcbc: 29 f1 breq .+74 ; 0x2dd08 return 0; // Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register. pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00); 2dcbe: 60 e0 ldi r22, 0x00 ; 0 2dcc0: 8f e7 ldi r24, 0x7F ; 127 2dcc2: 0f 94 46 4f call 0x29e8c ; 0x29e8c // Enable write protect. pat9125_wr_reg(PAT9125_WP, 0x00); //prevents writing to registers over 0x09 2dcc6: 60 e0 ldi r22, 0x00 ; 0 2dcc8: 89 e0 ldi r24, 0x09 ; 9 2dcca: 0f 94 46 4f call 0x29e8c ; 0x29e8c pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); 2dcce: 80 e0 ldi r24, 0x00 ; 0 2dcd0: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dcd4: 80 93 66 0d sts 0x0D66, r24 ; 0x800d66 pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2dcd8: 81 e0 ldi r24, 0x01 ; 1 2dcda: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dcde: 80 93 65 0d sts 0x0D65, r24 ; 0x800d65 deinit(); triggerError(); ; // } #ifdef IR_SENSOR_PIN else if (!READ(IR_SENSOR_PIN)) { 2dce2: 89 b1 in r24, 0x09 ; 9 2dce4: 08 95 ret // Verify that the sensor responds with its correct product ID. pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) { pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); 2dce6: 80 e0 ldi r24, 0x00 ; 0 2dce8: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dcec: 80 93 66 0d sts 0x0D66, r24 ; 0x800d66 pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2dcf0: 81 e0 ldi r24, 0x01 ; 1 2dcf2: 0f 94 61 4f call 0x29ec2 ; 0x29ec2 2dcf6: 80 93 65 0d sts 0x0D65, r24 ; 0x800d65 if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) 2dcfa: 90 91 66 0d lds r25, 0x0D66 ; 0x800d66 2dcfe: 91 33 cpi r25, 0x31 ; 49 2dd00: 19 f4 brne .+6 ; 0x2dd08 2dd02: 81 39 cpi r24, 0x91 ; 145 2dd04: 09 f4 brne .+2 ; 0x2dd08 2dd06: bb cf rjmp .-138 ; 0x2dc7e void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; filter = 0; 2dd08: 10 92 fd 16 sts 0x16FD, r1 ; 0x8016fd eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); enquecommand_front_P(MSG_M600); } void Filament_sensor::triggerError() { state = State::error; 2dd0c: 83 e0 ldi r24, 0x03 ; 3 2dd0e: 80 93 f1 16 sts 0x16F1, r24 ; 0x8016f1 #ifdef IR_SENSOR_PIN else if (!READ(IR_SENSOR_PIN)) { ; // MK3 fw on MK3S printer } #endif // IR_SENSOR_PIN } 2dd12: 08 95 ret 0002dd14 : eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT); eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); enquecommand_front_P(MSG_M600); } bool PAT9125_sensor::updatePAT9125() { 2dd14: cf 93 push r28 2dd16: df 93 push r29 if (jamDetection) { 2dd18: 80 91 ff 16 lds r24, 0x16FF ; 0x8016ff 2dd1c: 88 23 and r24, r24 2dd1e: 09 f4 brne .+2 ; 0x2dd22 2dd20: 60 c0 rjmp .+192 ; 0x2dde2 setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION)); } int16_t PAT9125_sensor::getStepCount() { int16_t ret; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; } 2dd22: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 2dd24: f8 94 cli 2dd26: c0 91 02 17 lds r28, 0x1702 ; 0x801702 2dd2a: d0 91 03 17 lds r29, 0x1703 ; 0x801703 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2dd2e: 8f bf out 0x3f, r24 ; 63 } bool PAT9125_sensor::updatePAT9125() { if (jamDetection) { int16_t _stepCount = getStepCount(); if (abs(_stepCount) >= chunkSteps) { // end of chunk. Check distance 2dd30: ce 01 movw r24, r28 2dd32: d7 ff sbrs r29, 7 2dd34: 04 c0 rjmp .+8 ; 0x2dd3e 2dd36: 88 27 eor r24, r24 2dd38: 99 27 eor r25, r25 2dd3a: 8c 1b sub r24, r28 2dd3c: 9d 0b sbc r25, r29 2dd3e: 20 91 04 17 lds r18, 0x1704 ; 0x801704 2dd42: 30 91 05 17 lds r19, 0x1705 ; 0x801705 2dd46: 82 17 cp r24, r18 2dd48: 93 07 cpc r25, r19 2dd4a: 4c f1 brlt .+82 ; 0x2dd9e resetStepCount(); 2dd4c: 0f 94 8d 6d call 0x2db1a ; 0x2db1a if (!pat9125_update()) { // get up to date data. reinit on error. 2dd50: 0f 94 ac 4f call 0x29f58 ; 0x29f58 2dd54: 81 11 cpse r24, r1 2dd56: 02 c0 rjmp .+4 ; 0x2dd5c init(); // try to reinit. 2dd58: 0f 94 dc 6d call 0x2dbb8 ; 0x2dbb8 } bool fsDir = (pat9125_y - oldPos) > 0; 2dd5c: 20 91 38 0e lds r18, 0x0E38 ; 0x800e38 2dd60: 30 91 39 0e lds r19, 0x0E39 ; 0x800e39 2dd64: 80 91 06 17 lds r24, 0x1706 ; 0x801706 2dd68: 40 91 00 17 lds r20, 0x1700 ; 0x801700 2dd6c: 50 91 01 17 lds r21, 0x1701 ; 0x801701 2dd70: b9 01 movw r22, r18 2dd72: 64 1b sub r22, r20 2dd74: 75 0b sbc r23, r21 2dd76: 41 e0 ldi r20, 0x01 ; 1 2dd78: 16 16 cp r1, r22 2dd7a: 17 06 cpc r1, r23 2dd7c: 0c f0 brlt .+2 ; 0x2dd80 2dd7e: 40 e0 ldi r20, 0x00 ; 0 bool stDir = _stepCount > 0; 2dd80: 91 e0 ldi r25, 0x01 ; 1 2dd82: 1c 16 cp r1, r28 2dd84: 1d 06 cpc r1, r29 2dd86: 0c f0 brlt .+2 ; 0x2dd8a 2dd88: 90 e0 ldi r25, 0x00 ; 0 if (fsDir != stDir) { 2dd8a: 49 17 cp r20, r25 2dd8c: 09 f4 brne .+2 ; 0x2dd90 2dd8e: 61 c0 rjmp .+194 ; 0x2de52 jamErrCnt++; 2dd90: 8f 5f subi r24, 0xFF ; 255 } else if (jamErrCnt) { jamErrCnt--; 2dd92: 80 93 06 17 sts 0x1706, r24 ; 0x801706 } oldPos = pat9125_y; 2dd96: 30 93 01 17 sts 0x1701, r19 ; 0x801701 2dd9a: 20 93 00 17 sts 0x1700, r18 ; 0x801700 } if (jamErrCnt > 10) { 2dd9e: 80 91 06 17 lds r24, 0x1706 ; 0x801706 2dda2: 8b 30 cpi r24, 0x0B ; 11 2dda4: f0 f0 brcs .+60 ; 0x2dde2 jamErrCnt = 0; 2dda6: 10 92 06 17 sts 0x1706, r1 ; 0x801706 void PAT9125_sensor::resetStepCount() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; } } void PAT9125_sensor::filJam() { runoutEnabled = false; 2ddaa: 10 92 f3 16 sts 0x16F3, r1 ; 0x8016f3 autoLoadEnabled = false; 2ddae: 10 92 f2 16 sts 0x16F2, r1 ; 0x8016f2 jamDetection = false; 2ddb2: 10 92 ff 16 sts 0x16FF, r1 ; 0x8016ff stop_and_save_print_to_ram(0, 0); 2ddb6: 60 e0 ldi r22, 0x00 ; 0 2ddb8: 70 e0 ldi r23, 0x00 ; 0 2ddba: cb 01 movw r24, r22 2ddbc: 0f 94 06 66 call 0x2cc0c ; 0x2cc0c restore_print_from_ram_and_continue(0); 2ddc0: 60 e0 ldi r22, 0x00 ; 0 2ddc2: 70 e0 ldi r23, 0x00 ; 0 2ddc4: cb 01 movw r24, r22 2ddc6: 0e 94 b8 66 call 0xcd70 ; 0xcd70 eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT); 2ddca: 85 e6 ldi r24, 0x65 ; 101 2ddcc: 9f e0 ldi r25, 0x0F ; 15 2ddce: 0e 94 7c 78 call 0xf0f8 ; 0xf0f8 eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); 2ddd2: 81 e0 ldi r24, 0x01 ; 1 2ddd4: 9f e0 ldi r25, 0x0F ; 15 2ddd6: 0e 94 6f 78 call 0xf0de ; 0xf0de enquecommand_front_P(MSG_M600); 2ddda: 8e e5 ldi r24, 0x5E ; 94 2dddc: 9c e6 ldi r25, 0x6C ; 108 2ddde: 0f 94 78 67 call 0x2cef0 ; 0x2cef0 jamErrCnt = 0; filJam(); } } if (pollingTimer.expired_cont(pollingPeriod)) { 2dde2: 6a e0 ldi r22, 0x0A ; 10 2dde4: 70 e0 ldi r23, 0x00 ; 0 2dde6: 8a ef ldi r24, 0xFA ; 250 2dde8: 96 e1 ldi r25, 0x16 ; 22 2ddea: 0f 94 47 0e call 0x21c8e ; 0x21c8e ::expired_cont(unsigned short)> 2ddee: c8 2f mov r28, r24 2ddf0: 88 23 and r24, r24 2ddf2: 39 f1 breq .+78 ; 0x2de42 pollingTimer.start(); 2ddf4: 8a ef ldi r24, 0xFA ; 250 2ddf6: 96 e1 ldi r25, 0x16 ; 22 2ddf8: 0f 94 4e 0e call 0x21c9c ; 0x21c9c ::start()> if (!pat9125_update()) { 2ddfc: 0f 94 ac 4f call 0x29f58 ; 0x29f58 2de00: 81 11 cpse r24, r1 2de02: 02 c0 rjmp .+4 ; 0x2de08 init(); // try to reinit. 2de04: 0f 94 dc 6d call 0x2dbb8 ; 0x2dbb8 } bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50); 2de08: 80 91 64 0d lds r24, 0x0D64 ; 0x800d64 2de0c: 81 31 cpi r24, 0x11 ; 17 2de0e: 30 f0 brcs .+12 ; 0x2de1c 2de10: c1 e0 ldi r28, 0x01 ; 1 2de12: 80 91 63 0d lds r24, 0x0D63 ; 0x800d63 2de16: 82 33 cpi r24, 0x32 ; 50 2de18: 08 f4 brcc .+2 ; 0x2de1c 2de1a: c0 e0 ldi r28, 0x00 ; 0 2de1c: 80 91 fd 16 lds r24, 0x16FD ; 0x8016fd if (present != filterFilPresent) { 2de20: 20 91 fe 16 lds r18, 0x16FE ; 0x8016fe 2de24: 30 e0 ldi r19, 0x00 ; 0 2de26: c2 17 cp r28, r18 2de28: 13 06 cpc r1, r19 2de2a: c1 f0 breq .+48 ; 0x2de5c filter++; 2de2c: 8f 5f subi r24, 0xFF ; 255 } else if (filter) { filter--; 2de2e: 80 93 fd 16 sts 0x16FD, r24 ; 0x8016fd } if (filter >= filterCnt) { 2de32: 80 91 fd 16 lds r24, 0x16FD ; 0x8016fd 2de36: 85 30 cpi r24, 0x05 ; 5 2de38: 20 f0 brcs .+8 ; 0x2de42 filter = 0; 2de3a: 10 92 fd 16 sts 0x16FD, r1 ; 0x8016fd filterFilPresent = present; 2de3e: c0 93 fe 16 sts 0x16FE, r28 ; 0x8016fe } } return (filter == 0); // return stability 2de42: 81 e0 ldi r24, 0x01 ; 1 2de44: 90 91 fd 16 lds r25, 0x16FD ; 0x8016fd 2de48: 91 11 cpse r25, r1 2de4a: 80 e0 ldi r24, 0x00 ; 0 } 2de4c: df 91 pop r29 2de4e: cf 91 pop r28 2de50: 08 95 ret } bool fsDir = (pat9125_y - oldPos) > 0; bool stDir = _stepCount > 0; if (fsDir != stDir) { jamErrCnt++; } else if (jamErrCnt) { 2de52: 88 23 and r24, r24 2de54: 09 f4 brne .+2 ; 0x2de58 2de56: 9f cf rjmp .-194 ; 0x2dd96 jamErrCnt--; 2de58: 81 50 subi r24, 0x01 ; 1 2de5a: 9b cf rjmp .-202 ; 0x2dd92 } bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50); if (present != filterFilPresent) { filter++; } else if (filter) { 2de5c: 88 23 and r24, r24 2de5e: 49 f3 breq .-46 ; 0x2de32 filter--; 2de60: 81 50 subi r24, 0x01 ; 1 2de62: e5 cf rjmp .-54 ; 0x2de2e 0002de64 : * We can do this in 3 ways... * - Minimal RAM: Read two filenames at a time sorting along... * - Some RAM: Buffer the directory just for this sort * - Most RAM: Buffer the directory and return filenames from RAM */ void CardReader::presort() { 2de64: 2f 92 push r2 2de66: 3f 92 push r3 2de68: 4f 92 push r4 2de6a: 5f 92 push r5 2de6c: 6f 92 push r6 2de6e: 7f 92 push r7 2de70: 8f 92 push r8 2de72: 9f 92 push r9 2de74: af 92 push r10 2de76: bf 92 push r11 2de78: cf 92 push r12 2de7a: df 92 push r13 2de7c: ef 92 push r14 2de7e: ff 92 push r15 2de80: 0f 93 push r16 2de82: 1f 93 push r17 2de84: cf 93 push r28 2de86: df 93 push r29 2de88: cd b7 in r28, 0x3d ; 61 2de8a: de b7 in r29, 0x3e ; 62 2de8c: ed 97 sbiw r28, 0x3d ; 61 2de8e: 0f b6 in r0, 0x3f ; 63 2de90: f8 94 cli 2de92: de bf out 0x3e, r29 ; 62 2de94: 0f be out 0x3f, r0 ; 63 2de96: cd bf out 0x3d, r28 ; 61 KEEPALIVE_STATE(NOT_BUSY); } void CardReader::flush_presort() { sort_count = 0; 2de98: 10 92 79 15 sts 0x1579, r1 ; 0x801579 2de9c: 10 92 78 15 sts 0x1578, r1 ; 0x801578 lastSortedFilePosition = 0; 2dea0: 10 92 43 16 sts 0x1643, r1 ; 0x801643 2dea4: 10 92 42 16 sts 0x1642, r1 ; 0x801642 */ void CardReader::presort() { // Throw away old sort index flush_presort(); if (IS_SD_INSERTED == false) return; //sorting is not used in farm mode 2dea8: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2deac: 80 fd sbrc r24, 0 2deae: f7 c0 rjmp .+494 ; 0x2e09e uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); 2deb0: 89 e0 ldi r24, 0x09 ; 9 2deb2: 9f e0 ldi r25, 0x0F ; 15 2deb4: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2deb8: 38 2e mov r3, r24 KEEPALIVE_STATE(IN_HANDLER); 2deba: 82 e0 ldi r24, 0x02 ; 2 2debc: 80 93 78 02 sts 0x0278, r24 ; 0x800278 // If there are files, sort up to the limit uint16_t fileCnt = getnrfilenames(); 2dec0: 0f 94 4f 6c call 0x2d89e ; 0x2d89e 2dec4: 6c 01 movw r12, r24 if (fileCnt > 0) { 2dec6: 00 97 sbiw r24, 0x00 ; 0 2dec8: 09 f4 brne .+2 ; 0x2decc 2deca: e6 c0 rjmp .+460 ; 0x2e098 // Never sort more than the max allowed // If you use folders to organize, 20 may be enough if (fileCnt > SDSORT_LIMIT) { 2decc: 85 36 cpi r24, 0x65 ; 101 2dece: 91 05 cpc r25, r1 2ded0: 80 f0 brcs .+32 ; 0x2def2 if ((sdSort != SD_SORT_NONE) && !farm_mode) { 2ded2: 32 e0 ldi r19, 0x02 ; 2 2ded4: 33 16 cp r3, r19 2ded6: 51 f0 breq .+20 ; 0x2deec 2ded8: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 2dedc: 81 11 cpse r24, r1 2dede: 06 c0 rjmp .+12 ; 0x2deec lcd_show_fullscreen_message_and_wait_P(_T(MSG_FILE_CNT)); 2dee0: 86 e3 ldi r24, 0x36 ; 54 2dee2: 92 e6 ldi r25, 0x62 ; 98 2dee4: 0e 94 3a 75 call 0xea74 ; 0xea74 2dee8: 0e 94 94 ea call 0x1d528 ; 0x1d528 } fileCnt = SDSORT_LIMIT; 2deec: f4 e6 ldi r31, 0x64 ; 100 2deee: cf 2e mov r12, r31 2def0: d1 2c mov r13, r1 } sort_count = fileCnt; 2def2: d0 92 79 15 sts 0x1579, r13 ; 0x801579 2def6: c0 92 78 15 sts 0x1578, r12 ; 0x801578 2defa: 6a e7 ldi r22, 0x7A ; 122 2defc: 66 2e mov r6, r22 2defe: 65 e1 ldi r22, 0x15 ; 21 2df00: 76 2e mov r7, r22 // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { 2df02: f1 2c mov r15, r1 2df04: e1 2c mov r14, r1 lsDive("", *curDir, match, LS_GetFilename); } void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/) { curDir = &workDir; 2df06: 72 e8 ldi r23, 0x82 ; 130 2df08: a7 2e mov r10, r23 2df0a: 74 e1 ldi r23, 0x14 ; 20 2df0c: b7 2e mov r11, r23 nrFiles = 1; 2df0e: 88 24 eor r8, r8 2df10: 83 94 inc r8 2df12: 91 2c mov r9, r1 sort_count = fileCnt; // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { if (!IS_SD_INSERTED) return; 2df14: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2df18: 80 fd sbrc r24, 0 2df1a: c1 c0 rjmp .+386 ; 0x2e09e manage_heater(); 2df1c: 0f 94 1c 3a call 0x27438 ; 0x27438 if (i == 0) 2df20: e1 14 cp r14, r1 2df22: f1 04 cpc r15, r1 2df24: 09 f0 breq .+2 ; 0x2df28 2df26: d4 c0 rjmp .+424 ; 0x2e0d0 getfilename(0); 2df28: 90 e0 ldi r25, 0x00 ; 0 2df2a: 80 e0 ldi r24, 0x00 ; 0 2df2c: 0f 94 b9 6b call 0x2d772 ; 0x2d772 else getfilename_next(position); sort_entries[i] = position >> 5; 2df30: 80 91 ea 13 lds r24, 0x13EA ; 0x8013ea 2df34: 90 91 eb 13 lds r25, 0x13EB ; 0x8013eb 2df38: a0 91 ec 13 lds r26, 0x13EC ; 0x8013ec 2df3c: b0 91 ed 13 lds r27, 0x13ED ; 0x8013ed 2df40: 55 e0 ldi r21, 0x05 ; 5 2df42: b6 95 lsr r27 2df44: a7 95 ror r26 2df46: 97 95 ror r25 2df48: 87 95 ror r24 2df4a: 5a 95 dec r21 2df4c: d1 f7 brne .-12 ; 0x2df42 2df4e: f3 01 movw r30, r6 2df50: 81 93 st Z+, r24 2df52: 91 93 st Z+, r25 2df54: 3f 01 movw r6, r30 } sort_count = fileCnt; // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { 2df56: ff ef ldi r31, 0xFF ; 255 2df58: ef 1a sub r14, r31 2df5a: ff 0a sbc r15, r31 2df5c: ce 14 cp r12, r14 2df5e: df 04 cpc r13, r15 2df60: c9 f6 brne .-78 ; 0x2df14 else getfilename_next(position); sort_entries[i] = position >> 5; } if ((fileCnt > 1) && (sdSort != SD_SORT_NONE) && !farm_mode) { 2df62: 21 e0 ldi r18, 0x01 ; 1 2df64: e2 16 cp r14, r18 2df66: f1 04 cpc r15, r1 2df68: 09 f4 brne .+2 ; 0x2df6c 2df6a: 96 c0 rjmp .+300 ; 0x2e098 2df6c: 32 e0 ldi r19, 0x02 ; 2 2df6e: 33 16 cp r3, r19 2df70: 09 f4 brne .+2 ; 0x2df74 2df72: 92 c0 rjmp .+292 ; 0x2e098 2df74: 20 91 60 0d lds r18, 0x0D60 ; 0x800d60 2df78: 21 11 cpse r18, r1 2df7a: 8e c0 rjmp .+284 ; 0x2e098 #ifdef SORTING_SPEEDTEST LongTimer sortingSpeedtestTimer; sortingSpeedtestTimer.start(); #endif //SORTING_SPEEDTEST lastSortedFilePosition = position >> 5; 2df7c: 90 93 43 16 sts 0x1643, r25 ; 0x801643 2df80: 80 93 42 16 sts 0x1642, r24 ; 0x801642 #define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs < 0 ? dir1 : !dir1)) #define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? dir1 : !dir1)) #endif uint16_t counter = 0; menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES)); 2df84: 86 e2 ldi r24, 0x26 ; 38 2df86: 92 e6 ldi r25, 0x62 ; 98 2df88: 0e 94 3a 75 call 0xea74 ; 0xea74 2df8c: ee 9c mul r14, r14 2df8e: 90 01 movw r18, r0 2df90: ef 9c mul r14, r15 2df92: 30 0d add r19, r0 2df94: 30 0d add r19, r0 2df96: 11 24 eor r1, r1 2df98: bc 01 movw r22, r24 2df9a: c9 01 movw r24, r18 2df9c: 96 95 lsr r25 2df9e: 87 95 ror r24 2dfa0: 0e 94 11 72 call 0xe422 ; 0xe422 2dfa4: 3c e7 ldi r19, 0x7C ; 124 2dfa6: a3 2e mov r10, r19 2dfa8: 35 e1 ldi r19, 0x15 ; 21 2dfaa: b3 2e mov r11, r19 #if HAS_FOLDER_SORTING #define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs < 0 ? dir1 : !dir1)) #define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? dir1 : !dir1)) #endif uint16_t counter = 0; 2dfac: 91 2c mov r9, r1 2dfae: 81 2c mov r8, r1 menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES)); for (uint16_t i = 1; i < fileCnt; ++i){ 2dfb0: cc 24 eor r12, r12 2dfb2: c3 94 inc r12 2dfb4: d1 2c mov r13, r1 // if (!IS_SD_INSERTED) return; menu_progressbar_update(counter); 2dfb6: c4 01 movw r24, r8 2dfb8: 0e 94 47 71 call 0xe28e ; 0xe28e counter += i; 2dfbc: 8c 0c add r8, r12 2dfbe: 9d 1c adc r9, r13 /// pop the position const uint16_t o1 = sort_entries[i]; 2dfc0: f5 01 movw r30, r10 2dfc2: 01 90 ld r0, Z+ 2dfc4: f0 81 ld r31, Z 2dfc6: e0 2d mov r30, r0 2dfc8: f9 af std Y+57, r31 ; 0x39 2dfca: e8 af std Y+56, r30 ; 0x38 getfilename_simple(o1); 2dfcc: cf 01 movw r24, r30 2dfce: 0f 94 00 6c call 0x2d800 ; 0x2d800 strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it) 2dfd2: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2dfd6: 69 ed ldi r22, 0xD9 ; 217 2dfd8: 73 e1 ldi r23, 0x13 ; 19 2dfda: 88 23 and r24, r24 2dfdc: 11 f0 breq .+4 ; 0x2dfe2 2dfde: 6e ee ldi r22, 0xEE ; 238 2dfe0: 73 e1 ldi r23, 0x13 ; 19 2dfe2: ce 01 movw r24, r28 2dfe4: 01 96 adiw r24, 0x01 ; 1 2dfe6: 0f 94 4b aa call 0x35496 ; 0x35496 crmod_date_bckp = crmodDate; 2dfea: 60 90 e8 13 lds r6, 0x13E8 ; 0x8013e8 2dfee: 70 90 e9 13 lds r7, 0x13E9 ; 0x8013e9 crmod_time_bckp = crmodTime; 2dff2: 20 91 e6 13 lds r18, 0x13E6 ; 0x8013e6 2dff6: 30 91 e7 13 lds r19, 0x13E7 ; 0x8013e7 2dffa: 3b af std Y+59, r19 ; 0x3b 2dffc: 2a af std Y+58, r18 ; 0x3a #if HAS_FOLDER_SORTING bool dir1 = filenameIsDir; 2dffe: 20 90 23 14 lds r2, 0x1423 ; 0x801423 2e002: bf aa std Y+55, r11 ; 0x37 2e004: ae aa std Y+54, r10 ; 0x36 2e006: 86 01 movw r16, r12 #endif /// find proper place uint16_t j = i; for (; j > 0; --j){ if (!IS_SD_INSERTED) return; 2e008: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2e00c: 80 fd sbrc r24, 0 2e00e: 47 c0 rjmp .+142 ; 0x2e09e printf_P(PSTR("%2u "), sort_entries[z]); } MYSERIAL.println(); #endif manage_heater(); 2e010: 0f 94 1c 3a call 0x27438 ; 0x27438 const uint16_t o2 = sort_entries[j - 1]; 2e014: c8 01 movw r24, r16 2e016: 01 97 sbiw r24, 0x01 ; 1 2e018: 9d af std Y+61, r25 ; 0x3d 2e01a: 8c af std Y+60, r24 ; 0x3c 2e01c: ee a9 ldd r30, Y+54 ; 0x36 2e01e: ff a9 ldd r31, Y+55 ; 0x37 2e020: 52 90 ld r5, -Z 2e022: 42 90 ld r4, -Z 2e024: ff ab std Y+55, r31 ; 0x37 2e026: ee ab std Y+54, r30 ; 0x36 getfilename_simple(o2); 2e028: c2 01 movw r24, r4 2e02a: 0f 94 00 6c call 0x2d800 ; 0x2d800 char *name2 = LONGEST_FILENAME; // use the string in-place 2e02e: 80 91 ee 13 lds r24, 0x13EE ; 0x8013ee 2e032: 69 ed ldi r22, 0xD9 ; 217 2e034: 73 e1 ldi r23, 0x13 ; 19 2e036: 88 23 and r24, r24 2e038: 11 f0 breq .+4 ; 0x2e03e 2e03a: 6e ee ldi r22, 0xEE ; 238 2e03c: 73 e1 ldi r23, 0x13 ; 19 // Sort the current pair according to settings. if ( 2e03e: 31 10 cpse r3, r1 2e040: 8a c0 rjmp .+276 ; 0x2e156 2e042: 80 91 23 14 lds r24, 0x1423 ; 0x801423 2e046: 28 12 cpse r2, r24 2e048: 83 c0 rjmp .+262 ; 0x2e150 #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2e04a: 80 91 e8 13 lds r24, 0x13E8 ; 0x8013e8 2e04e: 90 91 e9 13 lds r25, 0x13E9 ; 0x8013e9 2e052: 68 16 cp r6, r24 2e054: 79 06 cpc r7, r25 2e056: 09 f0 breq .+2 ; 0x2e05a 2e058: 6c c0 rjmp .+216 ; 0x2e132 2e05a: 80 91 e6 13 lds r24, 0x13E6 ; 0x8013e6 2e05e: 90 91 e7 13 lds r25, 0x13E7 ; 0x8013e7 2e062: 2a ad ldd r18, Y+58 ; 0x3a 2e064: 3b ad ldd r19, Y+59 ; 0x3b 2e066: 82 17 cp r24, r18 2e068: 93 07 cpc r25, r19 2e06a: 08 f0 brcs .+2 ; 0x2e06e 2e06c: 66 c0 rjmp .+204 ; 0x2e13a #endif sort_entries[j] = o2; } } /// place the position sort_entries[j] = o1; 2e06e: 00 0f add r16, r16 2e070: 11 1f adc r17, r17 2e072: f8 01 movw r30, r16 2e074: e6 58 subi r30, 0x86 ; 134 2e076: fa 4e sbci r31, 0xEA ; 234 2e078: 28 ad ldd r18, Y+56 ; 0x38 2e07a: 39 ad ldd r19, Y+57 ; 0x39 2e07c: 31 83 std Z+1, r19 ; 0x01 2e07e: 20 83 st Z, r18 #endif uint16_t counter = 0; menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES)); for (uint16_t i = 1; i < fileCnt; ++i){ 2e080: 3f ef ldi r19, 0xFF ; 255 2e082: c3 1a sub r12, r19 2e084: d3 0a sbc r13, r19 2e086: 82 e0 ldi r24, 0x02 ; 2 2e088: a8 0e add r10, r24 2e08a: b1 1c adc r11, r1 2e08c: ec 14 cp r14, r12 2e08e: fd 04 cpc r15, r13 2e090: 09 f0 breq .+2 ; 0x2e094 2e092: 91 cf rjmp .-222 ; 0x2dfb6 for (uint16_t z = 0; z < fileCnt; z++) printf_P(PSTR("%2u "), sort_entries[z]); SERIAL_PROTOCOLLN(); #endif menu_progressbar_finish(); 2e094: 0e 94 68 71 call 0xe2d0 ; 0xe2d0 } } KEEPALIVE_STATE(NOT_BUSY); 2e098: 81 e0 ldi r24, 0x01 ; 1 2e09a: 80 93 78 02 sts 0x0278, r24 ; 0x800278 } 2e09e: ed 96 adiw r28, 0x3d ; 61 2e0a0: 0f b6 in r0, 0x3f ; 63 2e0a2: f8 94 cli 2e0a4: de bf out 0x3e, r29 ; 62 2e0a6: 0f be out 0x3f, r0 ; 63 2e0a8: cd bf out 0x3d, r28 ; 61 2e0aa: df 91 pop r29 2e0ac: cf 91 pop r28 2e0ae: 1f 91 pop r17 2e0b0: 0f 91 pop r16 2e0b2: ff 90 pop r15 2e0b4: ef 90 pop r14 2e0b6: df 90 pop r13 2e0b8: cf 90 pop r12 2e0ba: bf 90 pop r11 2e0bc: af 90 pop r10 2e0be: 9f 90 pop r9 2e0c0: 8f 90 pop r8 2e0c2: 7f 90 pop r7 2e0c4: 6f 90 pop r6 2e0c6: 5f 90 pop r5 2e0c8: 4f 90 pop r4 2e0ca: 3f 90 pop r3 2e0cc: 2f 90 pop r2 2e0ce: 08 95 ret if (!IS_SD_INSERTED) return; manage_heater(); if (i == 0) getfilename(0); else getfilename_next(position); 2e0d0: 40 91 ea 13 lds r20, 0x13EA ; 0x8013ea 2e0d4: 50 91 eb 13 lds r21, 0x13EB ; 0x8013eb 2e0d8: 60 91 ec 13 lds r22, 0x13EC ; 0x8013ec 2e0dc: 70 91 ed 13 lds r23, 0x13ED ; 0x8013ed lsDive("", *curDir, match, LS_GetFilename); } void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/) { curDir = &workDir; 2e0e0: b0 92 81 14 sts 0x1481, r11 ; 0x801481 2e0e4: a0 92 80 14 sts 0x1480, r10 ; 0x801480 nrFiles = 1; 2e0e8: 90 92 f0 16 sts 0x16F0, r9 ; 0x8016f0 2e0ec: 80 92 ef 16 sts 0x16EF, r8 ; 0x8016ef curDir->seekSet(position); 2e0f0: 82 e8 ldi r24, 0x82 ; 130 2e0f2: 94 e1 ldi r25, 0x14 ; 20 2e0f4: 0f 94 0b 2d call 0x25a16 ; 0x25a16 2e0f8: 1e 7f andi r17, 0xFE ; 254 2e0fa: 1d 7f andi r17, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 2e0fc: e0 91 80 14 lds r30, 0x1480 ; 0x801480 2e100: f0 91 81 14 lds r31, 0x1481 ; 0x801481 2e104: 83 e2 ldi r24, 0x23 ; 35 2e106: de 01 movw r26, r28 2e108: 11 96 adiw r26, 0x01 ; 1 2e10a: 01 90 ld r0, Z+ 2e10c: 0d 92 st X+, r0 2e10e: 8a 95 dec r24 2e110: e1 f7 brne .-8 ; 0x2e10a 2e112: 01 2f mov r16, r17 2e114: 22 e0 ldi r18, 0x02 ; 2 2e116: 50 e0 ldi r21, 0x00 ; 0 2e118: 40 e0 ldi r20, 0x00 ; 0 2e11a: be 01 movw r22, r28 2e11c: 6f 5f subi r22, 0xFF ; 255 2e11e: 7f 4f sbci r23, 0xFF ; 255 2e120: 8f ed ldi r24, 0xDF ; 223 2e122: 92 e0 ldi r25, 0x02 ; 2 2e124: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2e128: ce 01 movw r24, r28 2e12a: 01 96 adiw r24, 0x01 ; 1 2e12c: 0e 94 ab 79 call 0xf356 ; 0xf356 2e130: ff ce rjmp .-514 ; 0x2df30 char *name2 = LONGEST_FILENAME; // use the string in-place // Sort the current pair according to settings. if ( #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2e132: 86 15 cp r24, r6 2e134: 97 05 cpc r25, r7 2e136: 08 f4 brcc .+2 ; 0x2e13a 2e138: 9a cf rjmp .-204 ; 0x2e06e break; } else { #ifdef SORTING_DUMP puts_P(PSTR("shift")); #endif sort_entries[j] = o2; 2e13a: ee a9 ldd r30, Y+54 ; 0x36 2e13c: ff a9 ldd r31, Y+55 ; 0x37 2e13e: 53 82 std Z+3, r5 ; 0x03 2e140: 42 82 std Z+2, r4 ; 0x02 2e142: 0c ad ldd r16, Y+60 ; 0x3c 2e144: 1d ad ldd r17, Y+61 ; 0x3d bool dir1 = filenameIsDir; #endif /// find proper place uint16_t j = i; for (; j > 0; --j){ 2e146: 01 15 cp r16, r1 2e148: 11 05 cpc r17, r1 2e14a: 09 f0 breq .+2 ; 0x2e14e 2e14c: 5d cf rjmp .-326 ; 0x2e008 2e14e: 8f cf rjmp .-226 ; 0x2e06e char *name2 = LONGEST_FILENAME; // use the string in-place // Sort the current pair according to settings. if ( #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2e150: 22 20 and r2, r2 2e152: 99 f3 breq .-26 ; 0x2e13a 2e154: 8c cf rjmp .-232 ; 0x2e06e 2e156: 31 e0 ldi r19, 0x01 ; 1 2e158: 33 12 cpse r3, r19 2e15a: ef cf rjmp .-34 ; 0x2e13a getfilename_simple(o2); char *name2 = LONGEST_FILENAME; // use the string in-place // Sort the current pair according to settings. if ( 2e15c: 80 91 23 14 lds r24, 0x1423 ; 0x801423 2e160: 28 12 cpse r2, r24 2e162: 07 c0 rjmp .+14 ; 0x2e172 #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2e164: ce 01 movw r24, r28 2e166: 01 96 adiw r24, 0x01 ; 1 2e168: 0f 94 19 aa call 0x35432 ; 0x35432 2e16c: 97 fd sbrc r25, 7 2e16e: e5 cf rjmp .-54 ; 0x2e13a 2e170: 7e cf rjmp .-260 ; 0x2e06e 2e172: 21 10 cpse r2, r1 2e174: e2 cf rjmp .-60 ; 0x2e13a 2e176: 7b cf rjmp .-266 ; 0x2e06e 0002e178 : lsDive("",*curDir, NULL, LS_Count); //SERIAL_ECHOLN(nrFiles); return nrFiles; } bool CardReader::chdir(const char * relpath, bool doPresort) 2e178: cf 92 push r12 2e17a: df 92 push r13 2e17c: ef 92 push r14 2e17e: ff 92 push r15 2e180: 0f 93 push r16 2e182: 1f 93 push r17 2e184: cf 93 push r28 2e186: df 93 push r29 2e188: cd b7 in r28, 0x3d ; 61 2e18a: de b7 in r29, 0x3e ; 62 2e18c: a3 97 sbiw r28, 0x23 ; 35 2e18e: 0f b6 in r0, 0x3f ; 63 2e190: f8 94 cli 2e192: de bf out 0x3e, r29 ; 62 2e194: 0f be out 0x3f, r0 ; 63 2e196: cd bf out 0x3d, r28 ; 61 2e198: 7c 01 movw r14, r24 2e19a: 06 2f mov r16, r22 * \brief Base class for SdFile with Print and C++ streams. */ class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} 2e19c: 19 82 std Y+1, r1 ; 0x01 2e19e: 1c 82 std Y+4, r1 ; 0x04 { SdFile newfile; SdFile *parent=&root; if(workDir.isOpen()) 2e1a0: 80 91 85 14 lds r24, 0x1485 ; 0x801485 parent=&workDir; 2e1a4: 92 e8 ldi r25, 0x82 ; 130 2e1a6: c9 2e mov r12, r25 2e1a8: 94 e1 ldi r25, 0x14 ; 20 2e1aa: d9 2e mov r13, r25 bool CardReader::chdir(const char * relpath, bool doPresort) { SdFile newfile; SdFile *parent=&root; if(workDir.isOpen()) 2e1ac: 81 11 cpse r24, r1 2e1ae: 04 c0 rjmp .+8 ; 0x2e1b8 } bool CardReader::chdir(const char * relpath, bool doPresort) { SdFile newfile; SdFile *parent=&root; 2e1b0: 8d e5 ldi r24, 0x5D ; 93 2e1b2: c8 2e mov r12, r24 2e1b4: 84 e1 ldi r24, 0x14 ; 20 2e1b6: d8 2e mov r13, r24 * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. * \return true for success or false for failure. */ bool open(SdBaseFile& dirFile, // NOLINT const char* path, uint8_t oflag) { return open(&dirFile, path, oflag); 2e1b8: 21 e0 ldi r18, 0x01 ; 1 2e1ba: a7 01 movw r20, r14 2e1bc: b6 01 movw r22, r12 2e1be: ce 01 movw r24, r28 2e1c0: 01 96 adiw r24, 0x01 ; 1 2e1c2: 0f 94 c5 54 call 0x2a98a ; 0x2a98a 2e1c6: 18 2f mov r17, r24 if(workDir.isOpen()) parent=&workDir; if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH)) 2e1c8: 88 23 and r24, r24 2e1ca: 21 f1 breq .+72 ; 0x2e214 2e1cc: 80 91 77 15 lds r24, 0x1577 ; 0x801577 2e1d0: 85 30 cpi r24, 0x05 ; 5 2e1d2: 00 f5 brcc .+64 ; 0x2e214 SERIAL_ECHOLN(relpath); return 0; } else { strcpy(dir_names[workDirDepth], relpath); 2e1d4: 29 e0 ldi r18, 0x09 ; 9 2e1d6: 82 9f mul r24, r18 2e1d8: c0 01 movw r24, r0 2e1da: 11 24 eor r1, r1 2e1dc: b7 01 movw r22, r14 2e1de: 89 5d subi r24, 0xD9 ; 217 2e1e0: 9b 4e sbci r25, 0xEB ; 235 2e1e2: 0f 94 4b aa call 0x35496 ; 0x35496 puts(relpath); 2e1e6: c7 01 movw r24, r14 2e1e8: 0f 94 6f aa call 0x354de ; 0x354de if (workDirDepth < MAX_DIR_DEPTH) { 2e1ec: 80 91 77 15 lds r24, 0x1577 ; 0x801577 2e1f0: 86 30 cpi r24, 0x06 ; 6 2e1f2: 80 f1 brcs .+96 ; 0x2e254 for (uint8_t d = ++workDirDepth; d--;) workDirParents[d+1] = workDirParents[d]; workDirParents[0]=*parent; } workDir=newfile; 2e1f4: 83 e2 ldi r24, 0x23 ; 35 2e1f6: fe 01 movw r30, r28 2e1f8: 31 96 adiw r30, 0x01 ; 1 2e1fa: a2 e8 ldi r26, 0x82 ; 130 2e1fc: b4 e1 ldi r27, 0x14 ; 20 2e1fe: 01 90 ld r0, Z+ 2e200: 0d 92 st X+, r0 2e202: 8a 95 dec r24 2e204: e1 f7 brne .-8 ; 0x2e1fe #ifdef SDCARD_SORT_ALPHA if (doPresort) 2e206: 00 23 and r16, r16 2e208: 09 f4 brne .+2 ; 0x2e20c 2e20a: 4c c0 rjmp .+152 ; 0x2e2a4 presort(); 2e20c: 0f 94 32 6f call 0x2de64 ; 0x2de64 else presort_flag = true; #endif return 1; 2e210: 10 2f mov r17, r16 2e212: 0c c0 rjmp .+24 ; 0x2e22c if(workDir.isOpen()) parent=&workDir; if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH)) { SERIAL_ECHO_START; 2e214: 8e ec ldi r24, 0xCE ; 206 2e216: 91 ea ldi r25, 0xA1 ; 161 2e218: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR 2e21c: 88 e4 ldi r24, 0x48 ; 72 2e21e: 9c e6 ldi r25, 0x6C ; 108 2e220: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(relpath); 2e224: c7 01 movw r24, r14 2e226: 0e 94 a1 87 call 0x10f42 ; 0x10f42 return 0; 2e22a: 10 e0 ldi r17, 0x00 ; 0 2e22c: ce 01 movw r24, r28 2e22e: 01 96 adiw r24, 0x01 ; 1 2e230: 0e 94 ab 79 call 0xf356 ; 0xf356 else presort_flag = true; #endif return 1; } } 2e234: 81 2f mov r24, r17 2e236: a3 96 adiw r28, 0x23 ; 35 2e238: 0f b6 in r0, 0x3f ; 63 2e23a: f8 94 cli 2e23c: de bf out 0x3e, r29 ; 62 2e23e: 0f be out 0x3f, r0 ; 63 2e240: cd bf out 0x3d, r28 ; 61 2e242: df 91 pop r29 2e244: cf 91 pop r28 2e246: 1f 91 pop r17 2e248: 0f 91 pop r16 2e24a: ff 90 pop r15 2e24c: ef 90 pop r14 2e24e: df 90 pop r13 2e250: cf 90 pop r12 2e252: 08 95 ret { strcpy(dir_names[workDirDepth], relpath); puts(relpath); if (workDirDepth < MAX_DIR_DEPTH) { for (uint8_t d = ++workDirDepth; d--;) 2e254: 8f 5f subi r24, 0xFF ; 255 2e256: 80 93 77 15 sts 0x1577, r24 ; 0x801577 workDirParents[d+1] = workDirParents[d]; 2e25a: 93 e2 ldi r25, 0x23 ; 35 { strcpy(dir_names[workDirDepth], relpath); puts(relpath); if (workDirDepth < MAX_DIR_DEPTH) { for (uint8_t d = ++workDirDepth; d--;) 2e25c: 81 50 subi r24, 0x01 ; 1 2e25e: c8 f0 brcs .+50 ; 0x2e292 workDirParents[d+1] = workDirParents[d]; 2e260: 28 2f mov r18, r24 2e262: 30 e0 ldi r19, 0x00 ; 0 2e264: a9 01 movw r20, r18 2e266: 4f 5f subi r20, 0xFF ; 255 2e268: 5f 4f sbci r21, 0xFF ; 255 2e26a: 94 9f mul r25, r20 2e26c: d0 01 movw r26, r0 2e26e: 95 9f mul r25, r21 2e270: b0 0d add r27, r0 2e272: 11 24 eor r1, r1 2e274: ab 55 subi r26, 0x5B ; 91 2e276: bb 4e sbci r27, 0xEB ; 235 2e278: 92 9f mul r25, r18 2e27a: f0 01 movw r30, r0 2e27c: 93 9f mul r25, r19 2e27e: f0 0d add r31, r0 2e280: 11 24 eor r1, r1 2e282: eb 55 subi r30, 0x5B ; 91 2e284: fb 4e sbci r31, 0xEB ; 235 2e286: 29 2f mov r18, r25 2e288: 01 90 ld r0, Z+ 2e28a: 0d 92 st X+, r0 2e28c: 2a 95 dec r18 2e28e: e1 f7 brne .-8 ; 0x2e288 2e290: e5 cf rjmp .-54 ; 0x2e25c workDirParents[0]=*parent; 2e292: 83 e2 ldi r24, 0x23 ; 35 2e294: f6 01 movw r30, r12 2e296: a5 ea ldi r26, 0xA5 ; 165 2e298: b4 e1 ldi r27, 0x14 ; 20 2e29a: 01 90 ld r0, Z+ 2e29c: 0d 92 st X+, r0 2e29e: 8a 95 dec r24 2e2a0: e1 f7 brne .-8 ; 0x2e29a 2e2a2: a8 cf rjmp .-176 ; 0x2e1f4 #ifdef SDCARD_SORT_ALPHA if (doPresort) presort(); else presort_flag = true; 2e2a4: 81 e0 ldi r24, 0x01 ; 1 2e2a6: 80 93 26 14 sts 0x1426, r24 ; 0x801426 2e2aa: c0 cf rjmp .-128 ; 0x2e22c 0002e2ac : } } void __attribute__((noinline)) CardReader::cdroot(bool doPresort) { workDir=root; 2e2ac: 93 e2 ldi r25, 0x23 ; 35 2e2ae: ed e5 ldi r30, 0x5D ; 93 2e2b0: f4 e1 ldi r31, 0x14 ; 20 2e2b2: a2 e8 ldi r26, 0x82 ; 130 2e2b4: b4 e1 ldi r27, 0x14 ; 20 2e2b6: 01 90 ld r0, Z+ 2e2b8: 0d 92 st X+, r0 2e2ba: 9a 95 dec r25 2e2bc: e1 f7 brne .-8 ; 0x2e2b6 workDirDepth = 0; 2e2be: 10 92 77 15 sts 0x1577, r1 ; 0x801577 curDir=&workDir; 2e2c2: 22 e8 ldi r18, 0x82 ; 130 2e2c4: 34 e1 ldi r19, 0x14 ; 20 2e2c6: 30 93 81 14 sts 0x1481, r19 ; 0x801481 2e2ca: 20 93 80 14 sts 0x1480, r18 ; 0x801480 #ifdef SDCARD_SORT_ALPHA if (doPresort) 2e2ce: 81 11 cpse r24, r1 presort(); 2e2d0: 0d 94 32 6f jmp 0x2de64 ; 0x2de64 else presort_flag = true; 2e2d4: 81 e0 ldi r24, 0x01 ; 1 2e2d6: 80 93 26 14 sts 0x1426, r24 ; 0x801426 #endif } 2e2da: 08 95 ret 0002e2dc : * * @param[in,out] fileName * expects file name including path * in case of absolute path, file name without path is returned */ bool CardReader::diveSubfolder (const char *&fileName) 2e2dc: 8f 92 push r8 2e2de: 9f 92 push r9 2e2e0: af 92 push r10 2e2e2: bf 92 push r11 2e2e4: cf 92 push r12 2e2e6: df 92 push r13 2e2e8: ef 92 push r14 2e2ea: ff 92 push r15 2e2ec: 0f 93 push r16 2e2ee: 1f 93 push r17 2e2f0: cf 93 push r28 2e2f2: df 93 push r29 2e2f4: cd b7 in r28, 0x3d ; 61 2e2f6: de b7 in r29, 0x3e ; 62 2e2f8: 2d 97 sbiw r28, 0x0d ; 13 2e2fa: 0f b6 in r0, 0x3f ; 63 2e2fc: f8 94 cli 2e2fe: de bf out 0x3e, r29 ; 62 2e300: 0f be out 0x3f, r0 ; 63 2e302: cd bf out 0x3d, r28 ; 61 { curDir=&root; 2e304: 2d e5 ldi r18, 0x5D ; 93 2e306: 34 e1 ldi r19, 0x14 ; 20 2e308: 30 93 81 14 sts 0x1481, r19 ; 0x801481 2e30c: 20 93 80 14 sts 0x1480, r18 ; 0x801480 if (!fileName) 2e310: dc 01 movw r26, r24 2e312: ed 91 ld r30, X+ 2e314: fc 91 ld r31, X 2e316: 30 97 sbiw r30, 0x00 ; 0 2e318: a1 f4 brne .+40 ; 0x2e342 } else //relative path { curDir = &workDir; } return 1; 2e31a: 81 e0 ldi r24, 0x01 ; 1 } 2e31c: 2d 96 adiw r28, 0x0d ; 13 2e31e: 0f b6 in r0, 0x3f ; 63 2e320: f8 94 cli 2e322: de bf out 0x3e, r29 ; 62 2e324: 0f be out 0x3f, r0 ; 63 2e326: cd bf out 0x3d, r28 ; 61 2e328: df 91 pop r29 2e32a: cf 91 pop r28 2e32c: 1f 91 pop r17 2e32e: 0f 91 pop r16 2e330: ff 90 pop r15 2e332: ef 90 pop r14 2e334: df 90 pop r13 2e336: cf 90 pop r12 2e338: bf 90 pop r11 2e33a: af 90 pop r10 2e33c: 9f 90 pop r9 2e33e: 8f 90 pop r8 2e340: 08 95 ret curDir=&root; if (!fileName) return 1; const char *dirname_start, *dirname_end; if (fileName[0] == '/') // absolute path 2e342: 20 81 ld r18, Z 2e344: 2f 32 cpi r18, 0x2F ; 47 2e346: 09 f0 breq .+2 ; 0x2e34a 2e348: 47 c0 rjmp .+142 ; 0x2e3d8 2e34a: 6c 01 movw r12, r24 { cdroot(false); 2e34c: 80 e0 ldi r24, 0x00 ; 0 2e34e: 0f 94 56 71 call 0x2e2ac ; 0x2e2ac dirname_start = fileName + 1; 2e352: f6 01 movw r30, r12 2e354: 00 81 ld r16, Z 2e356: 11 81 ldd r17, Z+1 ; 0x01 2e358: 0f 5f subi r16, 0xFF ; 255 2e35a: 1f 4f sbci r17, 0xFF ; 255 strncpy(subdirname, dirname_start, len); subdirname[len] = 0; if (!chdir(subdirname, false)) return 0; curDir = &workDir; 2e35c: 92 e8 ldi r25, 0x82 ; 130 2e35e: 89 2e mov r8, r25 2e360: 94 e1 ldi r25, 0x14 ; 20 2e362: 99 2e mov r9, r25 const char *dirname_start, *dirname_end; if (fileName[0] == '/') // absolute path { cdroot(false); dirname_start = fileName + 1; while (*dirname_start) 2e364: d8 01 movw r26, r16 2e366: 8c 91 ld r24, X 2e368: 88 23 and r24, r24 2e36a: b9 f2 breq .-82 ; 0x2e31a { dirname_end = strchr(dirname_start, '/'); 2e36c: 6f e2 ldi r22, 0x2F ; 47 2e36e: 70 e0 ldi r23, 0x00 ; 0 2e370: c8 01 movw r24, r16 2e372: 0f 94 37 aa call 0x3546e ; 0x3546e 2e376: 5c 01 movw r10, r24 //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name)); //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name)); if (dirname_end && dirname_end > dirname_start) 2e378: 00 97 sbiw r24, 0x00 ; 0 2e37a: 51 f1 breq .+84 ; 0x2e3d0 2e37c: 08 17 cp r16, r24 2e37e: 19 07 cpc r17, r25 2e380: 38 f5 brcc .+78 ; 0x2e3d0 { const size_t maxLen = 12; char subdirname[maxLen+1]; const size_t len = ((static_cast(dirname_end-dirname_start))>maxLen) ? maxLen : (dirname_end-dirname_start); 2e382: 7c 01 movw r14, r24 2e384: e0 1a sub r14, r16 2e386: f1 0a sbc r15, r17 2e388: bd e0 ldi r27, 0x0D ; 13 2e38a: eb 16 cp r14, r27 2e38c: f1 04 cpc r15, r1 2e38e: 18 f0 brcs .+6 ; 0x2e396 2e390: 8c e0 ldi r24, 0x0C ; 12 2e392: e8 2e mov r14, r24 2e394: f1 2c mov r15, r1 strncpy(subdirname, dirname_start, len); 2e396: a7 01 movw r20, r14 2e398: b8 01 movw r22, r16 2e39a: ce 01 movw r24, r28 2e39c: 01 96 adiw r24, 0x01 ; 1 2e39e: 0f 94 60 aa call 0x354c0 ; 0x354c0 subdirname[len] = 0; 2e3a2: e1 e0 ldi r30, 0x01 ; 1 2e3a4: f0 e0 ldi r31, 0x00 ; 0 2e3a6: ec 0f add r30, r28 2e3a8: fd 1f adc r31, r29 2e3aa: ee 0d add r30, r14 2e3ac: ff 1d adc r31, r15 2e3ae: 10 82 st Z, r1 if (!chdir(subdirname, false)) 2e3b0: 60 e0 ldi r22, 0x00 ; 0 2e3b2: ce 01 movw r24, r28 2e3b4: 01 96 adiw r24, 0x01 ; 1 2e3b6: 0f 94 bc 70 call 0x2e178 ; 0x2e178 2e3ba: 88 23 and r24, r24 2e3bc: 09 f4 brne .+2 ; 0x2e3c0 2e3be: ae cf rjmp .-164 ; 0x2e31c return 0; curDir = &workDir; 2e3c0: 90 92 81 14 sts 0x1481, r9 ; 0x801481 2e3c4: 80 92 80 14 sts 0x1480, r8 ; 0x801480 dirname_start = dirname_end + 1; 2e3c8: 85 01 movw r16, r10 2e3ca: 0f 5f subi r16, 0xFF ; 255 2e3cc: 1f 4f sbci r17, 0xFF ; 255 2e3ce: ca cf rjmp .-108 ; 0x2e364 } else // the reminder after all /fsa/fdsa/ is the filename { fileName = dirname_start; 2e3d0: f6 01 movw r30, r12 2e3d2: 11 83 std Z+1, r17 ; 0x01 2e3d4: 00 83 st Z, r16 2e3d6: a1 cf rjmp .-190 ; 0x2e31a } } else //relative path { curDir = &workDir; 2e3d8: 82 e8 ldi r24, 0x82 ; 130 2e3da: 94 e1 ldi r25, 0x14 ; 20 2e3dc: 90 93 81 14 sts 0x1481, r25 ; 0x801481 2e3e0: 80 93 80 14 sts 0x1480, r24 ; 0x801480 2e3e4: 9a cf rjmp .-204 ; 0x2e31a 0002e3e6 : static const char ofSize[] PROGMEM = " Size: "; static const char ofFileSelected[] PROGMEM = "File selected"; static const char ofSDPrinting[] PROGMEM = "SD-PRINTING"; static const char ofWritingToFile[] PROGMEM = "Writing to file: "; void CardReader::openFileReadFilteredGcode(const char* name, bool replace_current/* = false*/){ 2e3e6: bf 92 push r11 2e3e8: cf 92 push r12 2e3ea: df 92 push r13 2e3ec: ef 92 push r14 2e3ee: ff 92 push r15 2e3f0: 0f 93 push r16 2e3f2: 1f 93 push r17 2e3f4: cf 93 push r28 2e3f6: df 93 push r29 2e3f8: 1f 92 push r1 2e3fa: 1f 92 push r1 2e3fc: cd b7 in r28, 0x3d ; 61 2e3fe: de b7 in r29, 0x3e ; 62 if(!mounted) 2e400: 20 91 d8 13 lds r18, 0x13D8 ; 0x8013d8 2e404: 22 23 and r18, r18 2e406: 09 f4 brne .+2 ; 0x2e40a 2e408: ef c0 rjmp .+478 ; 0x2e5e8 2e40a: 7c 01 movw r14, r24 return; if(file.isOpen()){ //replacing current file by new file, or subfile call 2e40c: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 2e410: 88 23 and r24, r24 2e412: 09 f4 brne .+2 ; 0x2e416 2e414: 04 c1 rjmp .+520 ; 0x2e61e if(!replace_current){ 2e416: 61 11 cpse r22, r1 2e418: f6 c0 rjmp .+492 ; 0x2e606 if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1){ 2e41a: d0 90 8a 16 lds r13, 0x168A ; 0x80168a 2e41e: dd 20 and r13, r13 2e420: 21 f0 breq .+8 ; 0x2e42a // SERIAL_ERROR_START; // SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); // SERIAL_ERRORLN(SD_PROCEDURE_DEPTH); kill(ofKill); 2e422: 88 e9 ldi r24, 0x98 ; 152 2e424: 90 ea ldi r25, 0xA0 ; 160 2e426: 0e 94 23 83 call 0x10646 ; 0x10646 return; } SERIAL_ECHO_START; 2e42a: 8e ec ldi r24, 0xCE ; 206 2e42c: 91 ea ldi r25, 0xA1 ; 161 2e42e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(ofSubroutineCallTgt); 2e432: 8f e7 ldi r24, 0x7F ; 127 2e434: 90 ea ldi r25, 0xA0 ; 160 2e436: 0e 94 c4 7a call 0xf588 ; 0xf588 2e43a: c7 01 movw r24, r14 2e43c: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHO(name); SERIAL_ECHORPGM(ofParent); 2e440: 84 e7 ldi r24, 0x74 ; 116 2e442: 90 ea ldi r25, 0xA0 ; 160 2e444: 0e 94 c4 7a call 0xf588 ; 0xf588 //store current filename and position getAbsFilename(filenames[file_subcall_ctr]); 2e448: 00 91 8a 16 lds r16, 0x168A ; 0x80168a 2e44c: 25 e5 ldi r18, 0x55 ; 85 2e44e: 02 9f mul r16, r18 2e450: 80 01 movw r16, r0 2e452: 11 24 eor r1, r1 } void CardReader::getAbsFilename(char *t) { uint8_t cnt=0; *t='/';t++;cnt++; 2e454: 01 57 subi r16, 0x71 ; 113 2e456: 19 4e sbci r17, 0xE9 ; 233 2e458: 8f e2 ldi r24, 0x2F ; 47 2e45a: f8 01 movw r30, r16 2e45c: 81 93 st Z+, r24 2e45e: 8f 01 movw r16, r30 2e460: cc 24 eor r12, r12 2e462: c3 94 inc r12 for(uint8_t i=0;i 2e46c: d8 16 cp r13, r24 2e46e: b0 f4 brcc .+44 ; 0x2e49c { workDirParents[i].getFilename(t); //SDBaseFile.getfilename! 2e470: db 9c mul r13, r11 2e472: c0 01 movw r24, r0 2e474: 11 24 eor r1, r1 2e476: b8 01 movw r22, r16 2e478: 8b 55 subi r24, 0x5B ; 91 2e47a: 9b 4e sbci r25, 0xEB ; 235 2e47c: 0f 94 f2 2e call 0x25de4 ; 0x25de4 2e480: c8 01 movw r24, r16 2e482: 8c 01 movw r16, r24 2e484: 01 96 adiw r24, 0x01 ; 1 while(*t!=0 && cnt< MAXPATHNAMELENGTH) 2e486: f8 01 movw r30, r16 2e488: 20 81 ld r18, Z 2e48a: 22 23 and r18, r18 2e48c: 29 f0 breq .+10 ; 0x2e498 2e48e: f4 e5 ldi r31, 0x54 ; 84 2e490: fc 15 cp r31, r12 2e492: 10 f0 brcs .+4 ; 0x2e498 {t++;cnt++;} //crawl counter forward. 2e494: c3 94 inc r12 2e496: f5 cf rjmp .-22 ; 0x2e482 void CardReader::getAbsFilename(char *t) { uint8_t cnt=0; *t='/';t++;cnt++; for(uint8_t i=0;i { workDirParents[i].getFilename(t); //SDBaseFile.getfilename! while(*t!=0 && cnt< MAXPATHNAMELENGTH) {t++;cnt++;} //crawl counter forward. } if(cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH) 2e49c: 27 e4 ldi r18, 0x47 ; 71 2e49e: 2c 15 cp r18, r12 2e4a0: 08 f4 brcc .+2 ; 0x2e4a4 2e4a2: ae c0 rjmp .+348 ; 0x2e600 file.getFilename(t); 2e4a4: b8 01 movw r22, r16 2e4a6: 87 e6 ldi r24, 0x67 ; 103 2e4a8: 96 e1 ldi r25, 0x16 ; 22 2e4aa: 0f 94 f2 2e call 0x25de4 ; 0x25de4 SERIAL_ECHORPGM(ofParent); //store current filename and position getAbsFilename(filenames[file_subcall_ctr]); SERIAL_ECHO(filenames[file_subcall_ctr]); 2e4ae: 80 91 8a 16 lds r24, 0x168A ; 0x80168a 2e4b2: f5 e5 ldi r31, 0x55 ; 85 2e4b4: 8f 9f mul r24, r31 2e4b6: c0 01 movw r24, r0 2e4b8: 11 24 eor r1, r1 2e4ba: 81 57 subi r24, 0x71 ; 113 2e4bc: 99 4e sbci r25, 0xE9 ; 233 2e4be: 0e 94 95 87 call 0x10f2a ; 0x10f2a SERIAL_ECHORPGM(ofPos); 2e4c2: 8e e6 ldi r24, 0x6E ; 110 2e4c4: 90 ea ldi r25, 0xA0 ; 160 2e4c6: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 2e4ca: 60 91 eb 16 lds r22, 0x16EB ; 0x8016eb 2e4ce: 70 91 ec 16 lds r23, 0x16EC ; 0x8016ec 2e4d2: 80 91 ed 16 lds r24, 0x16ED ; 0x8016ed 2e4d6: 90 91 ee 16 lds r25, 0x16EE ; 0x8016ee 2e4da: 4a e0 ldi r20, 0x0A ; 10 2e4dc: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 2e4e0: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; 2e4e4: 80 91 8a 16 lds r24, 0x168A ; 0x80168a 2e4e8: 24 e0 ldi r18, 0x04 ; 4 2e4ea: 82 9f mul r24, r18 2e4ec: f0 01 movw r30, r0 2e4ee: 11 24 eor r1, r1 2e4f0: e5 57 subi r30, 0x75 ; 117 2e4f2: f9 4e sbci r31, 0xE9 ; 233 2e4f4: 40 91 eb 16 lds r20, 0x16EB ; 0x8016eb 2e4f8: 50 91 ec 16 lds r21, 0x16EC ; 0x8016ec 2e4fc: 60 91 ed 16 lds r22, 0x16ED ; 0x8016ed 2e500: 70 91 ee 16 lds r23, 0x16EE ; 0x8016ee 2e504: 40 83 st Z, r20 2e506: 51 83 std Z+1, r21 ; 0x01 2e508: 62 83 std Z+2, r22 ; 0x02 2e50a: 73 83 std Z+3, r23 ; 0x03 file_subcall_ctr++; 2e50c: 8f 5f subi r24, 0xFF ; 255 2e50e: 80 93 8a 16 sts 0x168A, r24 ; 0x80168a } else { SERIAL_ECHO_START; SERIAL_ECHORPGM(ofNowDoingFile); SERIAL_ECHOLN(name); } file.close(); 2e512: 87 e6 ldi r24, 0x67 ; 103 2e514: 96 e1 ldi r25, 0x16 ; 22 2e516: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure SERIAL_ECHO_START; SERIAL_ECHORPGM(ofNowFreshFile); SERIAL_ECHOLN(name); } sdprinting = false; 2e51a: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 const char *fname=name; 2e51e: fa 82 std Y+2, r15 ; 0x02 2e520: e9 82 std Y+1, r14 ; 0x01 if (!diveSubfolder(fname)) 2e522: ce 01 movw r24, r28 2e524: 01 96 adiw r24, 0x01 ; 1 2e526: 0f 94 6e 71 call 0x2e2dc ; 0x2e2dc 2e52a: 88 23 and r24, r24 2e52c: 09 f4 brne .+2 ; 0x2e530 2e52e: 5c c0 rjmp .+184 ; 0x2e5e8 */ SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } bool SdFile::openFilteredGcode(SdBaseFile* dirFile, const char* path){ if( open(dirFile, path, O_READ) ){ 2e530: 49 81 ldd r20, Y+1 ; 0x01 2e532: 5a 81 ldd r21, Y+2 ; 0x02 2e534: 60 91 80 14 lds r22, 0x1480 ; 0x801480 2e538: 70 91 81 14 lds r23, 0x1481 ; 0x801481 2e53c: 21 e0 ldi r18, 0x01 ; 1 2e53e: 87 e6 ldi r24, 0x67 ; 103 2e540: 96 e1 ldi r25, 0x16 ; 22 2e542: 0f 94 c5 54 call 0x2a98a ; 0x2a98a 2e546: 88 23 and r24, r24 2e548: 09 f4 brne .+2 ; 0x2e54c 2e54a: 77 c0 rjmp .+238 ; 0x2e63a // compute the block to start with if( ! gfComputeNextFileBlock() ) 2e54c: 87 e6 ldi r24, 0x67 ; 103 2e54e: 96 e1 ldi r25, 0x16 ; 22 2e550: 0f 94 92 2c call 0x25924 ; 0x25924 2e554: 88 23 and r24, r24 2e556: 09 f4 brne .+2 ; 0x2e55a 2e558: 70 c0 rjmp .+224 ; 0x2e63a return vol_->cache()->data; // this is constant for the whole time, so it should be fast and sleek } void SdFile::gfReset(){ // reset cache read ptr to its begin gfReadPtr = gfBlockBuffBegin() + gfOffset; 2e55a: 80 91 88 16 lds r24, 0x1688 ; 0x801688 2e55e: 90 91 89 16 lds r25, 0x1689 ; 0x801689 2e562: 8a 5b subi r24, 0xBA ; 186 2e564: 91 4f sbci r25, 0xF1 ; 241 2e566: 90 93 83 16 sts 0x1683, r25 ; 0x801683 2e56a: 80 93 82 16 sts 0x1682, r24 ; 0x801682 return; if (file.openFilteredGcode(curDir, fname)) { getfilename(0, fname); 2e56e: 89 81 ldd r24, Y+1 ; 0x01 2e570: 9a 81 ldd r25, Y+2 ; 0x02 2e572: 0f 94 b9 6b call 0x2d772 ; 0x2d772 filesize = file.fileSize(); 2e576: 80 91 78 16 lds r24, 0x1678 ; 0x801678 2e57a: 90 91 79 16 lds r25, 0x1679 ; 0x801679 2e57e: a0 91 7a 16 lds r26, 0x167A ; 0x80167a 2e582: b0 91 7b 16 lds r27, 0x167B ; 0x80167b 2e586: 80 93 e4 16 sts 0x16E4, r24 ; 0x8016e4 2e58a: 90 93 e5 16 sts 0x16E5, r25 ; 0x8016e5 2e58e: a0 93 e6 16 sts 0x16E6, r26 ; 0x8016e6 2e592: b0 93 e7 16 sts 0x16E7, r27 ; 0x8016e7 SERIAL_PROTOCOLRPGM(ofFileOpened);////MSG_SD_FILE_OPENED 2e596: 8e e3 ldi r24, 0x3E ; 62 2e598: 90 ea ldi r25, 0xA0 ; 160 2e59a: 0e 94 c4 7a call 0xf588 ; 0xf588 printAbsFilenameFast(); 2e59e: 0f 94 9c 6c call 0x2d938 ; 0x2d938 SERIAL_PROTOCOLRPGM(ofSize);////MSG_SD_SIZE 2e5a2: 86 e3 ldi r24, 0x36 ; 54 2e5a4: 90 ea ldi r25, 0xA0 ; 160 2e5a6: 0e 94 c4 7a call 0xf588 ; 0xf588 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 2e5aa: 60 91 e4 16 lds r22, 0x16E4 ; 0x8016e4 2e5ae: 70 91 e5 16 lds r23, 0x16E5 ; 0x8016e5 2e5b2: 80 91 e6 16 lds r24, 0x16E6 ; 0x8016e6 2e5b6: 90 91 e7 16 lds r25, 0x16E7 ; 0x8016e7 2e5ba: 4a e0 ldi r20, 0x0A ; 10 2e5bc: 0e 94 c5 79 call 0xf38a ; 0xf38a } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 2e5c0: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOLLN(filesize); sdpos = 0; 2e5c4: 10 92 eb 16 sts 0x16EB, r1 ; 0x8016eb 2e5c8: 10 92 ec 16 sts 0x16EC, r1 ; 0x8016ec 2e5cc: 10 92 ed 16 sts 0x16ED, r1 ; 0x8016ed 2e5d0: 10 92 ee 16 sts 0x16EE, r1 ; 0x8016ee SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED 2e5d4: 88 e2 ldi r24, 0x28 ; 40 2e5d6: 90 ea ldi r25, 0xA0 ; 160 2e5d8: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_setstatuspgm(ofFileSelected); 2e5dc: 88 e2 ldi r24, 0x28 ; 40 2e5de: 90 ea ldi r25, 0xA0 ; 160 2e5e0: 0e 94 94 de call 0x1bd28 ; 0x1bd28 scrollstuff = 0; 2e5e4: 10 92 62 0d sts 0x0D62, r1 ; 0x800d62 } else { SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLN('.'); } } 2e5e8: 0f 90 pop r0 2e5ea: 0f 90 pop r0 2e5ec: df 91 pop r29 2e5ee: cf 91 pop r28 2e5f0: 1f 91 pop r17 2e5f2: 0f 91 pop r16 2e5f4: ff 90 pop r15 2e5f6: ef 90 pop r14 2e5f8: df 90 pop r13 2e5fa: cf 90 pop r12 2e5fc: bf 90 pop r11 2e5fe: 08 95 ret {t++;cnt++;} //crawl counter forward. } if(cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH) file.getFilename(t); else t[0]=0; 2e600: f8 01 movw r30, r16 2e602: 10 82 st Z, r1 2e604: 54 cf rjmp .-344 ; 0x2e4ae SERIAL_ECHORPGM(ofPos); SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; file_subcall_ctr++; } else { SERIAL_ECHO_START; 2e606: 8e ec ldi r24, 0xCE ; 206 2e608: 91 ea ldi r25, 0xA1 ; 161 2e60a: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(ofNowDoingFile); 2e60e: 8d e5 ldi r24, 0x5D ; 93 2e610: 90 ea ldi r25, 0xA0 ; 160 2e612: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(name); 2e616: c7 01 movw r24, r14 2e618: 0e 94 a1 87 call 0x10f42 ; 0x10f42 2e61c: 7a cf rjmp .-268 ; 0x2e512 } file.close(); } else { //opening fresh file file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure 2e61e: 10 92 8a 16 sts 0x168A, r1 ; 0x80168a SERIAL_ECHO_START; 2e622: 8e ec ldi r24, 0xCE ; 206 2e624: 91 ea ldi r25, 0xA1 ; 161 2e626: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(ofNowFreshFile); 2e62a: 8c e4 ldi r24, 0x4C ; 76 2e62c: 90 ea ldi r25, 0xA0 ; 160 2e62e: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(name); 2e632: c7 01 movw r24, r14 2e634: 0e 94 a1 87 call 0x10f42 ; 0x10f42 2e638: 70 cf rjmp .-288 ; 0x2e51a SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED lcd_setstatuspgm(ofFileSelected); scrollstuff = 0; } else { SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); 2e63a: 84 e3 ldi r24, 0x34 ; 52 2e63c: 9c e6 ldi r25, 0x6C ; 108 2e63e: 0e 94 c4 7a call 0xf588 ; 0xf588 2e642: 89 81 ldd r24, Y+1 ; 0x01 2e644: 9a 81 ldd r25, Y+2 ; 0x02 2e646: 0e 94 95 87 call 0x10f2a ; 0x10f2a } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2e64a: 8e e2 ldi r24, 0x2E ; 46 2e64c: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 2e650: 0e 94 bc 7a call 0xf578 ; 0xf578 2e654: c9 cf rjmp .-110 ; 0x2e5e8 0002e656 : void CardReader::printingHasFinished() { st_synchronize(); 2e656: 0f 94 fb 1a call 0x235f6 ; 0x235f6 file.close(); 2e65a: 87 e6 ldi r24, 0x67 ; 103 2e65c: 96 e1 ldi r25, 0x16 ; 22 2e65e: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 if(file_subcall_ctr>0) //heading up to a parent file that called current as a procedure. 2e662: 80 91 8a 16 lds r24, 0x168A ; 0x80168a 2e666: 88 23 and r24, r24 2e668: 69 f1 breq .+90 ; 0x2e6c4 { file_subcall_ctr--; 2e66a: 81 50 subi r24, 0x01 ; 1 2e66c: 80 93 8a 16 sts 0x168A, r24 ; 0x80168a openFileReadFilteredGcode(filenames[file_subcall_ctr],true); 2e670: 25 e5 ldi r18, 0x55 ; 85 2e672: 82 9f mul r24, r18 2e674: c0 01 movw r24, r0 2e676: 11 24 eor r1, r1 2e678: 61 e0 ldi r22, 0x01 ; 1 2e67a: 81 57 subi r24, 0x71 ; 113 2e67c: 99 4e sbci r25, 0xE9 ; 233 2e67e: 0f 94 f3 71 call 0x2e3e6 ; 0x2e3e6 setIndex(filespos[file_subcall_ctr]); 2e682: e0 91 8a 16 lds r30, 0x168A ; 0x80168a 2e686: 84 e0 ldi r24, 0x04 ; 4 2e688: e8 9f mul r30, r24 2e68a: f0 01 movw r30, r0 2e68c: 11 24 eor r1, r1 2e68e: e5 57 subi r30, 0x75 ; 117 2e690: f9 4e sbci r31, 0xE9 ; 233 2e692: 60 81 ld r22, Z 2e694: 71 81 ldd r23, Z+1 ; 0x01 2e696: 82 81 ldd r24, Z+2 ; 0x02 2e698: 93 81 ldd r25, Z+3 ; 0x03 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; 2e69a: 60 93 eb 16 sts 0x16EB, r22 ; 0x8016eb 2e69e: 70 93 ec 16 sts 0x16EC, r23 ; 0x8016ec 2e6a2: 80 93 ed 16 sts 0x16ED, r24 ; 0x8016ed 2e6a6: 90 93 ee 16 sts 0x16EE, r25 ; 0x8016ee 2e6aa: 0f 94 17 68 call 0x2d02e ; 0x2d02e SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED } void CardReader::startFileprint() { if(mounted) 2e6ae: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 2e6b2: 88 23 and r24, r24 2e6b4: 71 f0 breq .+28 ; 0x2e6d2 { sdprinting = true; 2e6b6: 81 e0 ldi r24, 0x01 ; 1 2e6b8: 80 93 d7 13 sts 0x13D7, r24 ; 0x8013d7 2e6bc: 85 e0 ldi r24, 0x05 ; 5 2e6be: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> 2e6c2: 08 95 ret setIndex(filespos[file_subcall_ctr]); startFileprint(); } else { sdprinting = false; 2e6c4: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 2e6c8: 83 e0 ldi r24, 0x03 ; 3 2e6ca: 80 93 61 0d sts 0x0D61, r24 ; 0x800d61 <_ZL13printer_state.lto_priv.386> SetPrinterState(PrinterState::SDPrintingFinished); //set printer state to show LCD menu after finished SD print if(SD_FINISHED_STEPPERRELEASE) { finishAndDisableSteppers(); 2e6ce: 0c 94 55 86 jmp 0x10caa ; 0x10caa autotempShutdown(); #ifdef SDCARD_SORT_ALPHA //presort(); #endif } } 2e6d2: 08 95 ret 0002e6d4 : root.rewind(); lsDive("",root, NULL, LS_SerialPrint, params); } void CardReader::mount(bool doPresort/* = true*/) 2e6d4: cf 92 push r12 2e6d6: df 92 push r13 2e6d8: ef 92 push r14 2e6da: ff 92 push r15 2e6dc: 0f 93 push r16 2e6de: 1f 93 push r17 2e6e0: cf 93 push r28 2e6e2: df 93 push r29 2e6e4: 08 2f mov r16, r24 { mounted = false; 2e6e6: 10 92 d8 13 sts 0x13D8, r1 ; 0x8013d8 if(root.isOpen()) 2e6ea: 80 91 60 14 lds r24, 0x1460 ; 0x801460 2e6ee: 88 23 and r24, r24 2e6f0: 21 f0 breq .+8 ; 0x2e6fa root.close(); 2e6f2: 8d e5 ldi r24, 0x5D ; 93 2e6f4: 94 e1 ldi r25, 0x14 ; 20 2e6f6: 0f 94 e9 2e call 0x25dd2 ; 0x25dd2 * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. The reason for failure * can be determined by calling errorCode() and errorData(). */ bool Sd2Card::init(uint8_t sckRateID) { errorCode_ = type_ = 0; 2e6fa: 10 92 47 16 sts 0x1647, r1 ; 0x801647 2e6fe: 10 92 44 16 sts 0x1644, r1 ; 0x801644 // 16-bit init start time allows over a minute uint16_t t0 = (uint16_t)_millis(); 2e702: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e706: eb 01 movw r28, r22 uint32_t arg; // set pin modes chipSelectHigh(); 2e708: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 SET_OUTPUT(SDSS); 2e70c: 20 9a sbi 0x04, 0 ; 4 SET_INPUT(MISO); 2e70e: 23 98 cbi 0x04, 3 ; 4 SET_OUTPUT(MOSI); 2e710: 22 9a sbi 0x04, 2 ; 4 SET_OUTPUT(SCK); 2e712: 21 9a sbi 0x04, 1 ; 4 #ifndef SOFTWARE_SPI // SS must be in output mode even it is not chip select SET_OUTPUT(SS); 2e714: 20 9a sbi 0x04, 0 ; 4 // set SS high - may be chip select for another SPI device #if SET_SPI_SS_HIGH WRITE(SS, 1); 2e716: 28 9a sbi 0x05, 0 ; 5 #endif // SET_SPI_SS_HIGH // set SCK rate for initialization commands spiRate_ = SPI_SD_INIT_RATE; 2e718: 85 e0 ldi r24, 0x05 ; 5 2e71a: 80 93 45 16 sts 0x1645, r24 ; 0x801645 * Initialize hardware SPI * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] */ static void spiInit(uint8_t spiRate) { // See avr processor documentation SPCR = (1 << SPE) | (1 << MSTR) | (spiRate >> 1); 2e71e: 82 e5 ldi r24, 0x52 ; 82 2e720: 8c bd out 0x2c, r24 ; 44 SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; 2e722: 1d bc out 0x2d, r1 ; 45 2e724: 1a e0 ldi r17, 0x0A ; 10 spiRate_ = SPI_SD_INIT_RATE; spiInit(spiRate_); #endif // SOFTWARE_SPI // must supply min of 74 clock cycles with CS high. for (uint8_t i = 0; i < 10; i++) spiSend(0XFF); 2e726: 8f ef ldi r24, 0xFF ; 255 2e728: 0f 94 c5 28 call 0x2518a ; 0x2518a 2e72c: 11 50 subi r17, 0x01 ; 1 2e72e: d9 f7 brne .-10 ; 0x2e726 WRITE(MISO, 1); // temporarily enable the MISO line pullup 2e730: 2b 9a sbi 0x05, 3 ; 5 // command to go idle in SPI mode while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { 2e732: 20 e0 ldi r18, 0x00 ; 0 2e734: 30 e0 ldi r19, 0x00 ; 0 2e736: a9 01 movw r20, r18 2e738: 60 e0 ldi r22, 0x00 ; 0 2e73a: 84 e4 ldi r24, 0x44 ; 68 2e73c: 96 e1 ldi r25, 0x16 ; 22 2e73e: 0f 94 d1 28 call 0x251a2 ; 0x251a2 2e742: 80 93 46 16 sts 0x1646, r24 ; 0x801646 2e746: 81 30 cpi r24, 0x01 ; 1 2e748: 61 f0 breq .+24 ; 0x2e762 if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) { 2e74a: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e74e: 6c 1b sub r22, r28 2e750: 7d 0b sbc r23, r29 2e752: 61 3d cpi r22, 0xD1 ; 209 2e754: 77 40 sbci r23, 0x07 ; 7 2e756: 68 f3 brcs .-38 ; 0x2e732 WRITE(MISO, 0); // disable the MISO line pullup 2e758: 2b 98 cbi 0x05, 3 ; 5 2e75a: 81 e0 ldi r24, 0x01 ; 1 2e75c: 80 93 44 16 sts 0x1644, r24 ; 0x801644 2e760: 22 c0 rjmp .+68 ; 0x2e7a6 error(SD_CARD_ERROR_CMD0); goto fail; } } WRITE(MISO, 0); // disable the MISO line pullup 2e762: 2b 98 cbi 0x05, 3 ; 5 // send 0xFF until 0xFF received to give card some clock cycles t0 = (uint16_t)_millis(); 2e764: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e768: eb 01 movw r28, r22 SERIAL_ECHOLNRPGM(PSTR("Sending 0xFF")); 2e76a: 8b e1 ldi r24, 0x1B ; 27 2e76c: 90 ea ldi r25, 0xA0 ; 160 2e76e: 0e 94 bd 7c call 0xf97a ; 0xf97a spiSend(0XFF); 2e772: 8f ef ldi r24, 0xFF ; 255 2e774: 0f 94 c5 28 call 0x2518a ; 0x2518a while ((status_ = spiRec()) != 0xFF) 2e778: 0f 94 ca 28 call 0x25194 ; 0x25194 2e77c: 80 93 46 16 sts 0x1646, r24 ; 0x801646 2e780: 8f 3f cpi r24, 0xFF ; 255 2e782: 59 f1 breq .+86 ; 0x2e7da { spiSend(0XFF); 2e784: 8f ef ldi r24, 0xFF ; 255 2e786: 0f 94 c5 28 call 0x2518a ; 0x2518a if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT) 2e78a: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e78e: 6c 1b sub r22, r28 2e790: 7d 0b sbc r23, r29 2e792: 62 32 cpi r22, 0x22 ; 34 2e794: 71 05 cpc r23, r1 2e796: 80 f3 brcs .-32 ; 0x2e778 2e798: 82 e0 ldi r24, 0x02 ; 2 2e79a: 80 93 44 16 sts 0x1644, r24 ; 0x801644 { error(SD_CARD_ERROR_CMD8); SERIAL_ECHOLNRPGM(PSTR("No 0xFF received")); 2e79e: 8a e0 ldi r24, 0x0A ; 10 2e7a0: 90 ea ldi r25, 0xA0 ; 160 2e7a2: 0e 94 bd 7c call 0xf97a ; 0xf97a #else // SOFTWARE_SPI return true; #endif // SOFTWARE_SPI fail: chipSelectHigh(); 2e7a6: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 #else if (!card.init(SPI_FULL_SPEED) ) #endif { SERIAL_ECHO_START; 2e7aa: 8e ec ldi r24, 0xCE ; 206 2e7ac: 91 ea ldi r25, 0xA1 ; 161 2e7ae: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL 2e7b2: 87 e2 ldi r24, 0x27 ; 39 2e7b4: 9c e6 ldi r25, 0x6C ; 108 } else { mounted = true; SERIAL_ECHO_START; SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK 2e7b6: 0e 94 bd 7c call 0xf97a ; 0xf97a } if (mounted) 2e7ba: 80 91 d8 13 lds r24, 0x13D8 ; 0x8013d8 2e7be: 88 23 and r24, r24 2e7c0: 09 f4 brne .+2 ; 0x2e7c4 2e7c2: 9a c0 rjmp .+308 ; 0x2e8f8 { cdroot(doPresort); 2e7c4: 80 2f mov r24, r16 } } 2e7c6: df 91 pop r29 2e7c8: cf 91 pop r28 2e7ca: 1f 91 pop r17 2e7cc: 0f 91 pop r16 2e7ce: ff 90 pop r15 2e7d0: ef 90 pop r14 2e7d2: df 90 pop r13 2e7d4: cf 90 pop r12 SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK } if (mounted) { cdroot(doPresort); 2e7d6: 0d 94 56 71 jmp 0x2e2ac ; 0x2e2ac goto fail; } } // check SD version if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { 2e7da: 2a ea ldi r18, 0xAA ; 170 2e7dc: 31 e0 ldi r19, 0x01 ; 1 2e7de: 40 e0 ldi r20, 0x00 ; 0 2e7e0: 50 e0 ldi r21, 0x00 ; 0 2e7e2: 68 e0 ldi r22, 0x08 ; 8 2e7e4: 84 e4 ldi r24, 0x44 ; 68 2e7e6: 96 e1 ldi r25, 0x16 ; 22 2e7e8: 0f 94 d1 28 call 0x251a2 ; 0x251a2 2e7ec: 82 ff sbrs r24, 2 2e7ee: 2b c0 rjmp .+86 ; 0x2e846 bool readData(uint8_t* dst, uint16_t count); bool readRegister(uint8_t cmd, void* buf); void chipSelectHigh(); void chipSelectLow(); void type(uint8_t value) {type_ = value;} 2e7f0: 81 e0 ldi r24, 0x01 ; 1 2e7f2: 80 93 47 16 sts 0x1647, r24 ; 0x801647 goto fail; } type(SD_CARD_TYPE_SD2); } // initialize card and send host supports SDHC if SD2 arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; 2e7f6: 80 91 47 16 lds r24, 0x1647 ; 0x801647 2e7fa: c1 2c mov r12, r1 2e7fc: d1 2c mov r13, r1 2e7fe: 76 01 movw r14, r12 2e800: 82 30 cpi r24, 0x02 ; 2 2e802: 29 f4 brne .+10 ; 0x2e80e 2e804: c1 2c mov r12, r1 2e806: d1 2c mov r13, r1 2e808: e1 2c mov r14, r1 2e80a: 80 e4 ldi r24, 0x40 ; 64 2e80c: f8 2e mov r15, r24 uint8_t status_; uint8_t type_; bool flash_air_compatible_; // private functions uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { cardCommand(CMD55, 0); 2e80e: 20 e0 ldi r18, 0x00 ; 0 2e810: 30 e0 ldi r19, 0x00 ; 0 2e812: a9 01 movw r20, r18 2e814: 67 e3 ldi r22, 0x37 ; 55 2e816: 84 e4 ldi r24, 0x44 ; 68 2e818: 96 e1 ldi r25, 0x16 ; 22 2e81a: 0f 94 d1 28 call 0x251a2 ; 0x251a2 return cardCommand(cmd, arg); 2e81e: a7 01 movw r20, r14 2e820: 96 01 movw r18, r12 2e822: 69 e2 ldi r22, 0x29 ; 41 2e824: 84 e4 ldi r24, 0x44 ; 68 2e826: 96 e1 ldi r25, 0x16 ; 22 2e828: 0f 94 d1 28 call 0x251a2 ; 0x251a2 while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { 2e82c: 80 93 46 16 sts 0x1646, r24 ; 0x801646 2e830: 88 23 and r24, r24 2e832: b1 f0 breq .+44 ; 0x2e860 // check for timeout if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) { 2e834: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e838: 6c 1b sub r22, r28 2e83a: 7d 0b sbc r23, r29 2e83c: 61 3d cpi r22, 0xD1 ; 209 2e83e: 77 40 sbci r23, 0x07 ; 7 2e840: 30 f3 brcs .-52 ; 0x2e80e bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 2e842: 8a e0 ldi r24, 0x0A ; 10 2e844: 8b cf rjmp .-234 ; 0x2e75c goto fail; } } // check SD version if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { 2e846: 14 e0 ldi r17, 0x04 ; 4 type(SD_CARD_TYPE_SD1); } else { // only need last byte of r7 response for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); 2e848: 0f 94 ca 28 call 0x25194 ; 0x25194 2e84c: 80 93 46 16 sts 0x1646, r24 ; 0x801646 2e850: 11 50 subi r17, 0x01 ; 1 2e852: d1 f7 brne .-12 ; 0x2e848 if (status_ != 0XAA) { 2e854: 8a 3a cpi r24, 0xAA ; 170 2e856: 11 f0 breq .+4 ; 0x2e85c 2e858: 82 e0 ldi r24, 0x02 ; 2 2e85a: 80 cf rjmp .-256 ; 0x2e75c bool readData(uint8_t* dst, uint16_t count); bool readRegister(uint8_t cmd, void* buf); void chipSelectHigh(); void chipSelectLow(); void type(uint8_t value) {type_ = value;} 2e85c: 82 e0 ldi r24, 0x02 ; 2 2e85e: c9 cf rjmp .-110 ; 0x2e7f2 error(SD_CARD_ERROR_ACMD41); goto fail; } } // if SD2 read OCR register to check for SDHC card if (type() == SD_CARD_TYPE_SD2) { 2e860: 80 91 47 16 lds r24, 0x1647 ; 0x801647 2e864: 82 30 cpi r24, 0x02 ; 2 2e866: d1 f4 brne .+52 ; 0x2e89c if (cardCommand(CMD58, 0)) { 2e868: 20 e0 ldi r18, 0x00 ; 0 2e86a: 30 e0 ldi r19, 0x00 ; 0 2e86c: a9 01 movw r20, r18 2e86e: 6a e3 ldi r22, 0x3A ; 58 2e870: 84 e4 ldi r24, 0x44 ; 68 2e872: 96 e1 ldi r25, 0x16 ; 22 2e874: 0f 94 d1 28 call 0x251a2 ; 0x251a2 2e878: 88 23 and r24, r24 2e87a: 11 f0 breq .+4 ; 0x2e880 bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 2e87c: 88 e0 ldi r24, 0x08 ; 8 2e87e: 6e cf rjmp .-292 ; 0x2e75c error(SD_CARD_ERROR_CMD58); goto fail; } if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); 2e880: 0f 94 ca 28 call 0x25194 ; 0x25194 2e884: 80 7c andi r24, 0xC0 ; 192 2e886: 80 3c cpi r24, 0xC0 ; 192 2e888: 19 f4 brne .+6 ; 0x2e890 bool readData(uint8_t* dst, uint16_t count); bool readRegister(uint8_t cmd, void* buf); void chipSelectHigh(); void chipSelectLow(); void type(uint8_t value) {type_ = value;} 2e88a: 83 e0 ldi r24, 0x03 ; 3 2e88c: 80 93 47 16 sts 0x1647, r24 ; 0x801647 // discard rest of ocr - contains allowed voltage range for (uint8_t i = 0; i < 3; i++) spiRec(); 2e890: 0f 94 ca 28 call 0x25194 ; 0x25194 2e894: 0f 94 ca 28 call 0x25194 ; 0x25194 2e898: 0f 94 ca 28 call 0x25194 ; 0x25194 } chipSelectHigh(); 2e89c: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 bool Sd2Card::setSckRate(uint8_t sckRateID) { if (sckRateID > 6) { error(SD_CARD_ERROR_SCK_RATE); return false; } spiRate_ = sckRateID; 2e8a0: 10 92 45 16 sts 0x1645, r1 ; 0x801645 * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. Reasons for * failure include not finding a valid partition, not finding a valid * FAT file system or an I/O error. */ bool init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);} 2e8a4: 81 e0 ldi r24, 0x01 ; 1 2e8a6: 0f 94 77 59 call 0x2b2ee ; 0x2b2ee 2e8aa: 81 11 cpse r24, r1 2e8ac: 0c c0 rjmp .+24 ; 0x2e8c6 2e8ae: 80 e0 ldi r24, 0x00 ; 0 2e8b0: 0f 94 77 59 call 0x2b2ee ; 0x2b2ee #endif { SERIAL_ECHO_START; SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL } else if (!volume.init(&card)) 2e8b4: 81 11 cpse r24, r1 2e8b6: 07 c0 rjmp .+14 ; 0x2e8c6 { SERIAL_ERROR_START; 2e8b8: 81 eb ldi r24, 0xB1 ; 177 2e8ba: 91 ea ldi r25, 0xA1 ; 161 2e8bc: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNRPGM(_n("volume.init failed"));////MSG_SD_VOL_INIT_FAIL 2e8c0: 84 e1 ldi r24, 0x14 ; 20 2e8c2: 9c e6 ldi r25, 0x6C ; 108 2e8c4: 78 cf rjmp .-272 ; 0x2e7b6 } else if (!root.openRoot(&volume)) 2e8c6: 69 e4 ldi r22, 0x49 ; 73 2e8c8: 76 e1 ldi r23, 0x16 ; 22 2e8ca: 8d e5 ldi r24, 0x5D ; 93 2e8cc: 94 e1 ldi r25, 0x14 ; 20 2e8ce: 0f 94 42 2c call 0x25884 ; 0x25884 2e8d2: 81 11 cpse r24, r1 2e8d4: 07 c0 rjmp .+14 ; 0x2e8e4 { SERIAL_ERROR_START; 2e8d6: 81 eb ldi r24, 0xB1 ; 177 2e8d8: 91 ea ldi r25, 0xA1 ; 161 2e8da: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ERRORLNRPGM(_n("openRoot failed"));////MSG_SD_OPENROOT_FAIL 2e8de: 84 e0 ldi r24, 0x04 ; 4 2e8e0: 9c e6 ldi r25, 0x6C ; 108 2e8e2: 69 cf rjmp .-302 ; 0x2e7b6 } else { mounted = true; 2e8e4: 81 e0 ldi r24, 0x01 ; 1 2e8e6: 80 93 d8 13 sts 0x13D8, r24 ; 0x8013d8 SERIAL_ECHO_START; 2e8ea: 8e ec ldi r24, 0xCE ; 206 2e8ec: 91 ea ldi r25, 0xA1 ; 161 2e8ee: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK 2e8f2: 89 ef ldi r24, 0xF9 ; 249 2e8f4: 9b e6 ldi r25, 0x6B ; 107 2e8f6: 5f cf rjmp .-322 ; 0x2e7b6 if (mounted) { cdroot(doPresort); } } 2e8f8: df 91 pop r29 2e8fa: cf 91 pop r28 2e8fc: 1f 91 pop r17 2e8fe: 0f 91 pop r16 2e900: ff 90 pop r15 2e902: ef 90 pop r14 2e904: df 90 pop r13 2e906: cf 90 pop r12 2e908: 08 95 ret 0002e90a : ms = 0; } } } static void wait_for_heater(long codenum, uint8_t extruder) { 2e90a: 4f 92 push r4 2e90c: 5f 92 push r5 2e90e: 6f 92 push r6 2e910: 7f 92 push r7 2e912: 8f 92 push r8 2e914: 9f 92 push r9 2e916: af 92 push r10 2e918: bf 92 push r11 2e91a: cf 92 push r12 2e91c: df 92 push r13 2e91e: ef 92 push r14 2e920: ff 92 push r15 2e922: 4b 01 movw r8, r22 2e924: 5c 01 movw r10, r24 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 2e926: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 2e92a: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 2e92e: 07 2e mov r0, r23 2e930: 00 0c add r0, r0 2e932: 88 0b sbc r24, r24 2e934: 99 0b sbc r25, r25 2e936: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> if (!degTargetHotend(extruder)) 2e93a: 20 e0 ldi r18, 0x00 ; 0 2e93c: 30 e0 ldi r19, 0x00 ; 0 2e93e: a9 01 movw r20, r18 2e940: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2e944: 88 23 and r24, r24 2e946: d1 f0 breq .+52 ; 0x2e97c #ifdef TEMP_RESIDENCY_TIME long residencyStart; residencyStart = -1; /* continue to loop until we have reached the target temp _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ cancel_heatup = false; 2e948: 10 92 5f 0d sts 0x0D5F, r1 ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> if (!degTargetHotend(extruder)) return; #ifdef TEMP_RESIDENCY_TIME long residencyStart; residencyStart = -1; 2e94c: cc 24 eor r12, r12 2e94e: ca 94 dec r12 2e950: dc 2c mov r13, r12 2e952: 76 01 movw r14, r12 #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); if (residencyStart > -1) { codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL; 2e954: 98 ee ldi r25, 0xE8 ; 232 2e956: 49 2e mov r4, r25 2e958: 93 e0 ldi r25, 0x03 ; 3 2e95a: 59 2e mov r5, r25 2e95c: 61 2c mov r6, r1 2e95e: 71 2c mov r7, r1 long residencyStart; residencyStart = -1; /* continue to loop until we have reached the target temp _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ cancel_heatup = false; while ((!cancel_heatup) && ((residencyStart == -1) || 2e960: 80 91 5f 0d lds r24, 0x0D5F ; 0x800d5f <_ZL13cancel_heatup.lto_priv.391> 2e964: 81 11 cpse r24, r1 2e966: 0a c0 rjmp .+20 ; 0x2e97c 2e968: 2f ef ldi r18, 0xFF ; 255 2e96a: c2 16 cp r12, r18 2e96c: d2 06 cpc r13, r18 2e96e: e2 06 cpc r14, r18 2e970: f2 06 cpc r15, r18 2e972: 89 f4 brne .+34 ; 0x2e996 (residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) { #else while (target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder) && (CooldownNoWait == false))) { #endif //TEMP_RESIDENCY_TIME if (lcd_commands_type == LcdCommands::LongPause) { 2e974: 80 91 5e 0d lds r24, 0x0D5E ; 0x800d5e 2e978: 82 30 cpi r24, 0x02 ; 2 2e97a: b9 f4 brne .+46 ; 0x2e9aa { residencyStart = _millis(); } #endif //TEMP_RESIDENCY_TIME } } 2e97c: ff 90 pop r15 2e97e: ef 90 pop r14 2e980: df 90 pop r13 2e982: cf 90 pop r12 2e984: bf 90 pop r11 2e986: af 90 pop r10 2e988: 9f 90 pop r9 2e98a: 8f 90 pop r8 2e98c: 7f 90 pop r7 2e98e: 6f 90 pop r6 2e990: 5f 90 pop r5 2e992: 4f 90 pop r4 2e994: 08 95 ret long residencyStart; residencyStart = -1; /* continue to loop until we have reached the target temp _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ cancel_heatup = false; while ((!cancel_heatup) && ((residencyStart == -1) || 2e996: f7 fc sbrc r15, 7 2e998: f1 cf rjmp .-30 ; 0x2e97c (residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) { 2e99a: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e99e: 6c 19 sub r22, r12 2e9a0: 7d 09 sbc r23, r13 2e9a2: 68 3b cpi r22, 0xB8 ; 184 2e9a4: 7b 40 sbci r23, 0x0B ; 11 2e9a6: 30 f3 brcs .-52 ; 0x2e974 2e9a8: e9 cf rjmp .-46 ; 0x2e97c if (lcd_commands_type == LcdCommands::LongPause) { // Print was suddenly paused, break out of the loop // This can happen when the firmware report a fan error break; } if ((_millis() - codenum) > 1000UL) 2e9aa: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2e9ae: 68 19 sub r22, r8 2e9b0: 79 09 sbc r23, r9 2e9b2: 8a 09 sbc r24, r10 2e9b4: 9b 09 sbc r25, r11 2e9b6: 69 3e cpi r22, 0xE9 ; 233 2e9b8: 73 40 sbci r23, 0x03 ; 3 2e9ba: 81 05 cpc r24, r1 2e9bc: 91 05 cpc r25, r1 2e9be: 08 f4 brcc .+2 ; 0x2e9c2 2e9c0: 42 c0 rjmp .+132 ; 0x2ea46 { //Print Temp Reading and remaining time every 1 second while heating up/cooling down if (!farm_mode) { 2e9c2: 80 91 60 0d lds r24, 0x0D60 ; 0x800d60 2e9c6: 81 11 cpse r24, r1 2e9c8: 3a c0 rjmp .+116 ; 0x2ea3e SERIAL_PROTOCOLPGM("T:"); 2e9ca: 87 e0 ldi r24, 0x07 ; 7 2e9cc: 90 ea ldi r25, 0xA0 ; 160 2e9ce: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 2e9d2: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2e9d6: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2e9da: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2e9de: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2e9e2: 41 e0 ldi r20, 0x01 ; 1 2e9e4: 0e 94 46 7a call 0xf48c ; 0xf48c SERIAL_PROTOCOL_F(degHotend(extruder), 1); SERIAL_PROTOCOLPGM(" E:"); 2e9e8: 83 e0 ldi r24, 0x03 ; 3 2e9ea: 90 ea ldi r25, 0xA0 ; 160 2e9ec: 0e 94 c4 7a call 0xf588 ; 0xf588 2e9f0: 60 e0 ldi r22, 0x00 ; 0 2e9f2: 70 e0 ldi r23, 0x00 ; 0 2e9f4: cb 01 movw r24, r22 2e9f6: 0e 94 2a 7a call 0xf454 ; 0xf454 SERIAL_PROTOCOL((int)extruder); #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); 2e9fa: 8f ef ldi r24, 0xFF ; 255 2e9fc: 9f e9 ldi r25, 0x9F ; 159 2e9fe: 0e 94 c4 7a call 0xf588 ; 0xf588 if (residencyStart > -1) 2ea02: f7 fc sbrc r15, 7 2ea04: 52 c0 rjmp .+164 ; 0x2eaaa { codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL; 2ea06: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2ea0a: 46 01 movw r8, r12 2ea0c: 57 01 movw r10, r14 2ea0e: 58 eb ldi r21, 0xB8 ; 184 2ea10: 85 0e add r8, r21 2ea12: 5b e0 ldi r21, 0x0B ; 11 2ea14: 95 1e adc r9, r21 2ea16: a1 1c adc r10, r1 2ea18: b1 1c adc r11, r1 2ea1a: a5 01 movw r20, r10 2ea1c: 94 01 movw r18, r8 2ea1e: 26 1b sub r18, r22 2ea20: 37 0b sbc r19, r23 2ea22: 48 0b sbc r20, r24 2ea24: 59 0b sbc r21, r25 2ea26: ca 01 movw r24, r20 2ea28: b9 01 movw r22, r18 2ea2a: a3 01 movw r20, r6 2ea2c: 92 01 movw r18, r4 2ea2e: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 2ea32: ca 01 movw r24, r20 2ea34: b9 01 movw r22, r18 2ea36: 0e 94 2a 7a call 0xf454 ; 0xf454 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 2ea3a: 0e 94 bc 7a call 0xf578 ; 0xf578 } } #else SERIAL_PROTOCOLLN(); #endif codenum = _millis(); 2ea3e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2ea42: 4b 01 movw r8, r22 2ea44: 5c 01 movw r10, r24 } delay_keep_alive(0); //do not disable steppers 2ea46: 90 e0 ldi r25, 0x00 ; 0 2ea48: 80 e0 ldi r24, 0x00 ; 0 2ea4a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c #ifdef TEMP_RESIDENCY_TIME /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time or when current temp falls outside the hysteresis after target temp was reached */ if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) || (residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) || 2ea4e: 3f ef ldi r19, 0xFF ; 255 2ea50: c3 16 cp r12, r19 2ea52: d3 06 cpc r13, r19 2ea54: e3 06 cpc r14, r19 2ea56: f3 06 cpc r15, r19 2ea58: 09 f0 breq .+2 ; 0x2ea5c 2ea5a: 46 c0 rjmp .+140 ; 0x2eae8 } delay_keep_alive(0); //do not disable steppers #ifdef TEMP_RESIDENCY_TIME /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time or when current temp falls outside the hysteresis after target temp was reached */ if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) || 2ea5c: 80 91 59 0d lds r24, 0x0D59 ; 0x800d59 <_ZL16target_direction.lto_priv.490> 2ea60: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 2ea64: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 2ea68: 88 23 and r24, r24 2ea6a: 19 f1 breq .+70 ; 0x2eab2 2ea6c: 07 2e mov r0, r23 2ea6e: 00 0c add r0, r0 2ea70: 88 0b sbc r24, r24 2ea72: 99 0b sbc r25, r25 2ea74: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2ea78: 20 e0 ldi r18, 0x00 ; 0 2ea7a: 30 e0 ldi r19, 0x00 ; 0 2ea7c: 40 e8 ldi r20, 0x80 ; 128 2ea7e: 5f e3 ldi r21, 0x3F ; 63 2ea80: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2ea84: 9b 01 movw r18, r22 2ea86: ac 01 movw r20, r24 2ea88: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2ea8c: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2ea90: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2ea94: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2ea98: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2ea9c: 87 fd sbrc r24, 7 2ea9e: 60 cf rjmp .-320 ; 0x2e960 (residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) || (residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS)) { residencyStart = _millis(); 2eaa0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2eaa4: 6b 01 movw r12, r22 2eaa6: 7c 01 movw r14, r24 2eaa8: 5b cf rjmp .-330 ; 0x2e960 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2eaaa: 8f e3 ldi r24, 0x3F ; 63 2eaac: 0e 94 b1 79 call 0xf362 ; 0xf362 2eab0: c4 cf rjmp .-120 ; 0x2ea3a 2eab2: 07 2e mov r0, r23 2eab4: 00 0c add r0, r0 2eab6: 88 0b sbc r24, r24 2eab8: 99 0b sbc r25, r25 2eaba: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> delay_keep_alive(0); //do not disable steppers #ifdef TEMP_RESIDENCY_TIME /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time or when current temp falls outside the hysteresis after target temp was reached */ if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) || (residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) || 2eabe: 20 e0 ldi r18, 0x00 ; 0 2eac0: 30 e0 ldi r19, 0x00 ; 0 2eac2: 40 e8 ldi r20, 0x80 ; 128 2eac4: 5f e3 ldi r21, 0x3F ; 63 2eac6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2eaca: 9b 01 movw r18, r22 2eacc: ac 01 movw r20, r24 2eace: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2ead2: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2ead6: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2eada: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2eade: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2eae2: 18 16 cp r1, r24 2eae4: ec f6 brge .-70 ; 0x2eaa0 2eae6: 3c cf rjmp .-392 ; 0x2e960 2eae8: f7 fc sbrc r15, 7 2eaea: 3a cf rjmp .-396 ; 0x2e960 2eaec: 60 91 5d 12 lds r22, 0x125D ; 0x80125d 2eaf0: 70 91 5e 12 lds r23, 0x125E ; 0x80125e 2eaf4: 07 2e mov r0, r23 2eaf6: 00 0c add r0, r0 2eaf8: 88 0b sbc r24, r24 2eafa: 99 0b sbc r25, r25 2eafc: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2eb00: 9b 01 movw r18, r22 2eb02: ac 01 movw r20, r24 (residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS)) 2eb04: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 2eb08: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 2eb0c: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 2eb10: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 2eb14: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2eb18: 9f 77 andi r25, 0x7F ; 127 2eb1a: 20 e0 ldi r18, 0x00 ; 0 2eb1c: 30 e0 ldi r19, 0x00 ; 0 2eb1e: 40 ea ldi r20, 0xA0 ; 160 2eb20: 50 e4 ldi r21, 0x40 ; 64 2eb22: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2eb26: 18 16 cp r1, r24 2eb28: 0c f0 brlt .+2 ; 0x2eb2c 2eb2a: 1a cf rjmp .-460 ; 0x2e960 2eb2c: b9 cf rjmp .-142 ; 0x2eaa0 0002eb2e : // Compensate for configurable Extra Loading Distance planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION)); execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0])); } void MMU2::ReportError(ErrorCode ec, ErrorSource res) { 2eb2e: 1f 93 push r17 2eb30: cf 93 push r28 2eb32: df 93 push r29 2eb34: ec 01 movw r28, r24 2eb36: 16 2f mov r17, r22 // - report only changes of states (we can miss an error message) // - may be some combination of MMUAvailable + UseMMU flags and decide based on their state // Right now the filtering of MMU_NOT_RESPONDING is done in ReportErrorHook() as it is not a problem if mmu2.cpp // Depending on the Progress code, we may want to do some action when an error occurs switch (logic.Progress()) { 2eb38: 80 91 d4 12 lds r24, 0x12D4 ; 0x8012d4 2eb3c: 83 30 cpi r24, 0x03 ; 3 2eb3e: 09 f4 brne .+2 ; 0x2eb42 2eb40: 4e c0 rjmp .+156 ; 0x2ebde 2eb42: 8c 31 cpi r24, 0x1C ; 28 2eb44: 09 f4 brne .+2 ; 0x2eb48 2eb46: 52 c0 rjmp .+164 ; 0x2ebec break; default: break; } if (ec != lastErrorCode) { // deduplicate: only report changes in error codes into the log 2eb48: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 2eb4c: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 2eb50: 8c 17 cp r24, r28 2eb52: 9d 07 cpc r25, r29 2eb54: 79 f1 breq .+94 ; 0x2ebb4 lastErrorCode = ec; 2eb56: d0 93 fa 12 sts 0x12FA, r29 ; 0x8012fa 2eb5a: c0 93 f9 12 sts 0x12F9, r28 ; 0x8012f9 lastErrorSource = res; 2eb5e: 10 93 fb 12 sts 0x12FB, r17 ; 0x8012fb LogErrorEvent_P(_O(PrusaErrorTitle(PrusaErrorCodeIndex(ec)))); 2eb62: ce 01 movw r24, r28 2eb64: 0f 94 11 51 call 0x2a222 ; 0x2a222 uint16_t PrusaErrorCode(uint8_t i) { return pgm_read_word(errorCodes + i); } const char *PrusaErrorTitle(uint8_t i) { return (const char *)pgm_read_ptr(errorTitles + i); 2eb68: e8 2f mov r30, r24 2eb6a: f0 e0 ldi r31, 0x00 ; 0 2eb6c: ee 0f add r30, r30 2eb6e: ff 1f adc r31, r31 2eb70: e0 5e subi r30, 0xE0 ; 224 2eb72: f0 46 sbci r31, 0x60 ; 96 2eb74: 85 91 lpm r24, Z+ 2eb76: 94 91 lpm r25, Z 2eb78: 02 96 adiw r24, 0x02 ; 2 2eb7a: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 if (ec != ErrorCode::OK && ec != ErrorCode::FILAMENT_EJECTED && ec != ErrorCode::FILAMENT_CHANGE) { 2eb7e: c1 30 cpi r28, 0x01 ; 1 2eb80: d1 05 cpc r29, r1 2eb82: c1 f0 breq .+48 ; 0x2ebb4 2eb84: cc 30 cpi r28, 0x0C ; 12 2eb86: 80 e8 ldi r24, 0x80 ; 128 2eb88: d8 07 cpc r29, r24 2eb8a: a1 f0 breq .+40 ; 0x2ebb4 2eb8c: c9 32 cpi r28, 0x29 ; 41 2eb8e: 80 e8 ldi r24, 0x80 ; 128 2eb90: d8 07 cpc r29, r24 2eb92: 81 f0 breq .+32 ; 0x2ebb4 IncrementMMUFails(); 2eb94: 0f 94 28 50 call 0x2a050 ; 0x2a050 | (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_ERROR | (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION ) & 0x7fffU; // skip the top bit // clang-format on static_assert(tmcMask == 0x7e00); // just make sure we fail compilation if any of the TMC error codes change if ((uint16_t)ec & tmcMask) { // @@TODO can be optimized to uint8_t operation 2eb98: ce 01 movw r24, r28 2eb9a: 88 27 eor r24, r24 2eb9c: 9e 77 andi r25, 0x7E ; 126 2eb9e: 89 2b or r24, r25 2eba0: 49 f0 breq .+18 ; 0x2ebb4 /// Set toolchange counter to zero inline void ClearToolChangeCounter() { toolchange_counter = 0; }; inline uint16_t TMCFailures() const { return tmcFailures; } inline void IncrementTMCFailures() { ++tmcFailures; } 2eba2: 80 91 07 13 lds r24, 0x1307 ; 0x801307 2eba6: 90 91 08 13 lds r25, 0x1308 ; 0x801308 2ebaa: 01 96 adiw r24, 0x01 ; 1 2ebac: 90 93 08 13 sts 0x1308, r25 ; 0x801308 2ebb0: 80 93 07 13 sts 0x1307, r24 ; 0x801307 return true; } } bool MMU2::RetryIfPossible(ErrorCode ec) { if (logic.RetryAttempts()) { 2ebb4: 80 91 e6 12 lds r24, 0x12E6 ; 0x8012e6 2ebb8: 88 23 and r24, r24 2ebba: d9 f0 breq .+54 ; 0x2ebf2 return Buttons::NoButton; } void SetButtonResponse(ButtonOperations rsp) { buttonSelectedOperation = rsp; 2ebbc: 11 e0 ldi r17, 0x01 ; 1 2ebbe: 10 93 44 0d sts 0x0D44, r17 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> SetButtonResponse(ButtonOperations::Retry); // check, that Retry is actually allowed on that operation if (ButtonAvailable(ec) != Buttons::NoButton) { 2ebc2: ce 01 movw r24, r28 2ebc4: 0f 94 9c 53 call 0x2a738 ; 0x2a738 2ebc8: 8f 3f cpi r24, 0xFF ; 255 2ebca: 99 f0 breq .+38 ; 0x2ebf2 void ResetCommunicationTimeoutAttempts(); constexpr bool InAutoRetry() const { return inAutoRetry; } void SetInAutoRetry(bool iar) { inAutoRetry = iar; 2ebcc: 10 93 e7 12 sts 0x12E7, r17 ; 0x8012e7 logic.SetInAutoRetry(true); SERIAL_ECHOLNPGM("RetryButtonPressed"); 2ebd0: 8d e0 ldi r24, 0x0D ; 13 2ebd2: 9f e9 ldi r25, 0x9F ; 159 && mmu2Magic[2] == 'U' && mmu2Magic[3] == '2' && mmu2Magic[4] == ':' && strlen_constexpr(mmu2Magic) == 5, "MMU2 logging prefix mismatch, must be updated at various spots"); } 2ebd4: df 91 pop r29 2ebd6: cf 91 pop r28 2ebd8: 1f 91 pop r17 if (logic.RetryAttempts()) { SetButtonResponse(ButtonOperations::Retry); // check, that Retry is actually allowed on that operation if (ButtonAvailable(ec) != Buttons::NoButton) { logic.SetInAutoRetry(true); SERIAL_ECHOLNPGM("RetryButtonPressed"); 2ebda: 0c 94 bd 7c jmp 0xf97a ; 0xf97a // Right now the filtering of MMU_NOT_RESPONDING is done in ReportErrorHook() as it is not a problem if mmu2.cpp // Depending on the Progress code, we may want to do some action when an error occurs switch (logic.Progress()) { case ProgressCode::UnloadingToFinda: unloadFilamentStarted = false; 2ebde: 10 92 04 13 sts 0x1304, r1 ; 0x801304 float move_raise_z(float delta) { return raise_z(delta); } void planner_abort_queued_moves() { planner_abort_hard(); 2ebe2: 0f 94 fb 4e call 0x29df6 ; 0x29df6 // Unblock the planner. This should be safe in the // toolchange context. Currently we are mainly aborting // excess E-moves after detecting filament during toolchange. // If a MMU error is reported, the planner must be unblocked // as well so the extruder can be parked safely. planner_aborted = false; 2ebe6: 10 92 42 0d sts 0x0D42, r1 ; 0x800d42 2ebea: ae cf rjmp .-164 ; 0x2eb48 planner_abort_queued_moves(); // Abort excess E-moves to be safe break; case ProgressCode::FeedingToFSensor: // FSENSOR error during load. Make sure E-motor stops moving. loadFilamentStarted = false; 2ebec: 10 92 03 13 sts 0x1303, r1 ; 0x801303 2ebf0: f8 cf rjmp .-16 ; 0x2ebe2 2ebf2: 10 92 e7 12 sts 0x12E7, r1 ; 0x8012e7 bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { if (putErrorScreenToSleep) return; 2ebf6: 80 91 43 0d lds r24, 0x0D43 ; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451> 2ebfa: 81 11 cpse r24, r1 2ebfc: 06 c0 rjmp .+12 ; 0x2ec0a 2ebfe: ce 01 movw r24, r28 && mmu2Magic[2] == 'U' && mmu2Magic[3] == '2' && mmu2Magic[4] == ':' && strlen_constexpr(mmu2Magic) == 5, "MMU2 logging prefix mismatch, must be updated at various spots"); } 2ec00: df 91 pop r29 2ec02: cf 91 pop r28 2ec04: 1f 91 pop r17 2ec06: 0d 94 62 52 jmp 0x2a4c4 ; 0x2a4c4 2ec0a: df 91 pop r29 2ec0c: cf 91 pop r28 2ec0e: 1f 91 pop r17 2ec10: 08 95 ret 0002ec12 : * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. * */ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { 2ec12: 2f 92 push r2 2ec14: 3f 92 push r3 2ec16: 4f 92 push r4 2ec18: 5f 92 push r5 2ec1a: 6f 92 push r6 2ec1c: 7f 92 push r7 2ec1e: 8f 92 push r8 2ec20: 9f 92 push r9 2ec22: af 92 push r10 2ec24: bf 92 push r11 2ec26: cf 92 push r12 2ec28: df 92 push r13 2ec2a: ef 92 push r14 2ec2c: ff 92 push r15 2ec2e: 0f 93 push r16 2ec30: 1f 93 push r17 2ec32: cf 93 push r28 2ec34: df 93 push r29 2ec36: 00 d0 rcall .+0 ; 0x2ec38 2ec38: 1f 92 push r1 2ec3a: cd b7 in r28, 0x3d ; 61 2ec3c: de b7 in r29, 0x3e ; 62 2ec3e: 5c 01 movw r10, r24 2ec40: 4b 01 movw r8, r22 // number of bytes left to write - must be before goto statements uint16_t nToWrite = nbyte; // error if not a normal file or is read-only if (!isFile() || !(flags_ & O_WRITE)) goto fail; 2ec42: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 2ec46: 81 30 cpi r24, 0x01 ; 1 2ec48: 09 f0 breq .+2 ; 0x2ec4c 2ec4a: de c0 rjmp .+444 ; 0x2ee08 2ec4c: 80 91 68 16 lds r24, 0x1668 ; 0x801668 2ec50: 81 ff sbrs r24, 1 2ec52: da c0 rjmp .+436 ; 0x2ee08 // seek to end of file if append flag if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { 2ec54: 82 fd sbrc r24, 2 2ec56: bc c0 rjmp .+376 ; 0x2edd0 * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. * */ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { 2ec58: 74 01 movw r14, r8 curCluster_ = next; } } } // max space in block uint16_t n = 512 - blockOffset; 2ec5a: 21 2c mov r2, r1 2ec5c: 32 e0 ldi r19, 0x02 ; 2 2ec5e: 33 2e mov r3, r19 2ec60: 00 91 6f 16 lds r16, 0x166F ; 0x80166f 2ec64: 10 91 70 16 lds r17, 0x1670 ; 0x801670 2ec68: 20 91 71 16 lds r18, 0x1671 ; 0x801671 2ec6c: 30 91 72 16 lds r19, 0x1672 ; 0x801672 // seek to end of file if append flag if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { if (!seekEnd()) goto fail; } while (nToWrite > 0) { 2ec70: e1 14 cp r14, r1 2ec72: f1 04 cpc r15, r1 2ec74: 09 f4 brne .+2 ; 0x2ec78 2ec76: 30 c1 rjmp .+608 ; 0x2eed8 uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); 2ec78: 80 91 80 16 lds r24, 0x1680 ; 0x801680 2ec7c: 90 91 81 16 lds r25, 0x1681 ; 0x801681 uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 //---------------------------------------------------------------------------- bool allocContiguous(uint32_t count, uint32_t* curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1);} 2ec80: dc 01 movw r26, r24 2ec82: 14 96 adiw r26, 0x04 ; 4 2ec84: 7c 90 ld r7, X 2ec86: 7a 94 dec r7 2ec88: b9 01 movw r22, r18 2ec8a: a8 01 movw r20, r16 2ec8c: 29 e0 ldi r18, 0x09 ; 9 2ec8e: 76 95 lsr r23 2ec90: 67 95 ror r22 2ec92: 57 95 ror r21 2ec94: 47 95 ror r20 2ec96: 2a 95 dec r18 2ec98: d1 f7 brne .-12 ; 0x2ec8e 2ec9a: 74 22 and r7, r20 uint16_t blockOffset = curPosition_ & 0X1FF; 2ec9c: 11 70 andi r17, 0x01 ; 1 if (blockOfCluster == 0 && blockOffset == 0) { 2ec9e: 71 10 cpse r7, r1 2eca0: 25 c0 rjmp .+74 ; 0x2ecec 2eca2: 01 15 cp r16, r1 2eca4: 11 05 cpc r17, r1 2eca6: 11 f5 brne .+68 ; 0x2ecec 2eca8: 40 91 6b 16 lds r20, 0x166B ; 0x80166b 2ecac: 50 91 6c 16 lds r21, 0x166C ; 0x80166c 2ecb0: 60 91 6d 16 lds r22, 0x166D ; 0x80166d 2ecb4: 70 91 6e 16 lds r23, 0x166E ; 0x80166e // start of new cluster if (curCluster_ == 0) { 2ecb8: 41 15 cp r20, r1 2ecba: 51 05 cpc r21, r1 2ecbc: 61 05 cpc r22, r1 2ecbe: 71 05 cpc r23, r1 2ecc0: 09 f0 breq .+2 ; 0x2ecc4 2ecc2: a8 c0 rjmp .+336 ; 0x2ee14 if (firstCluster_ == 0) { 2ecc4: 80 91 7c 16 lds r24, 0x167C ; 0x80167c 2ecc8: 90 91 7d 16 lds r25, 0x167D ; 0x80167d 2eccc: a0 91 7e 16 lds r26, 0x167E ; 0x80167e 2ecd0: b0 91 7f 16 lds r27, 0x167F ; 0x80167f 2ecd4: 00 97 sbiw r24, 0x00 ; 0 2ecd6: a1 05 cpc r26, r1 2ecd8: b1 05 cpc r27, r1 2ecda: 09 f0 breq .+2 ; 0x2ecde 2ecdc: b4 c0 rjmp .+360 ; 0x2ee46 } else { uint32_t next; if (!vol_->fatGet(curCluster_, &next)) goto fail; if (vol_->isEOC(next)) { // add cluster if at end of chain if (!addCluster()) goto fail; 2ecde: 87 e6 ldi r24, 0x67 ; 103 2ece0: 96 e1 ldi r25, 0x16 ; 22 2ece2: 0f 94 9f 2d call 0x25b3e ; 0x25b3e 2ece6: 88 23 and r24, r24 2ece8: 09 f4 brne .+2 ; 0x2ecec 2ecea: 8e c0 rjmp .+284 ; 0x2ee08 curCluster_ = next; } } } // max space in block uint16_t n = 512 - blockOffset; 2ecec: c1 01 movw r24, r2 2ecee: 80 1b sub r24, r16 2ecf0: 91 0b sbc r25, r17 2ecf2: 67 01 movw r12, r14 2ecf4: 8e 15 cp r24, r14 2ecf6: 9f 05 cpc r25, r15 2ecf8: 08 f4 brcc .+2 ; 0x2ecfc 2ecfa: 6c 01 movw r12, r24 // lesser of space and amount to write if (n > nToWrite) n = nToWrite; // block for data write uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; 2ecfc: e0 91 80 16 lds r30, 0x1680 ; 0x801680 2ed00: f0 91 81 16 lds r31, 0x1681 ; 0x801681 uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 2ed04: 80 91 6b 16 lds r24, 0x166B ; 0x80166b 2ed08: 90 91 6c 16 lds r25, 0x166C ; 0x80166c 2ed0c: a0 91 6d 16 lds r26, 0x166D ; 0x80166d 2ed10: b0 91 6e 16 lds r27, 0x166E ; 0x80166e 2ed14: 02 97 sbiw r24, 0x02 ; 2 2ed16: a1 09 sbc r26, r1 2ed18: b1 09 sbc r27, r1 2ed1a: 25 85 ldd r18, Z+13 ; 0x0d 2ed1c: 04 c0 rjmp .+8 ; 0x2ed26 2ed1e: 88 0f add r24, r24 2ed20: 99 1f adc r25, r25 2ed22: aa 1f adc r26, r26 2ed24: bb 1f adc r27, r27 2ed26: 2a 95 dec r18 2ed28: d2 f7 brpl .-12 ; 0x2ed1e 2ed2a: 46 85 ldd r20, Z+14 ; 0x0e 2ed2c: 57 85 ldd r21, Z+15 ; 0x0f 2ed2e: 60 89 ldd r22, Z+16 ; 0x10 2ed30: 71 89 ldd r23, Z+17 ; 0x11 2ed32: 84 0f add r24, r20 2ed34: 95 1f adc r25, r21 2ed36: a6 1f adc r26, r22 2ed38: b7 1f adc r27, r23 2ed3a: 9c 01 movw r18, r24 2ed3c: ad 01 movw r20, r26 2ed3e: 27 0d add r18, r7 2ed40: 31 1d adc r19, r1 2ed42: 41 1d adc r20, r1 2ed44: 51 1d adc r21, r1 2ed46: 29 01 movw r4, r18 2ed48: 3a 01 movw r6, r20 if (n == 512) { 2ed4a: c1 14 cp r12, r1 2ed4c: 32 e0 ldi r19, 0x02 ; 2 2ed4e: d3 06 cpc r13, r19 2ed50: 09 f0 breq .+2 ; 0x2ed54 2ed52: 8a c0 rjmp .+276 ; 0x2ee68 // full block - don't need to use cache if (vol_->cacheBlockNumber() == block) { 2ed54: 80 91 3a 0e lds r24, 0x0E3A ; 0x800e3a 2ed58: 90 91 3b 0e lds r25, 0x0E3B ; 0x800e3b 2ed5c: a0 91 3c 0e lds r26, 0x0E3C ; 0x800e3c 2ed60: b0 91 3d 0e lds r27, 0x0E3D ; 0x800e3d 2ed64: 48 16 cp r4, r24 2ed66: 59 06 cpc r5, r25 2ed68: 6a 06 cpc r6, r26 2ed6a: 7b 06 cpc r7, r27 2ed6c: 69 f4 brne .+26 ; 0x2ed88 static bool cacheFlush(); static bool cacheRawBlock(uint32_t blockNumber, bool dirty); #endif // USE_MULTIPLE_CARDS // used by SdBaseFile write to assign cache to SD location void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) { cacheDirty_ = dirty; 2ed6e: 10 92 42 0e sts 0x0E42, r1 ; 0x800e42 cacheBlockNumber_ = blockNumber; 2ed72: 8f ef ldi r24, 0xFF ; 255 2ed74: 9f ef ldi r25, 0xFF ; 255 2ed76: dc 01 movw r26, r24 2ed78: 80 93 3a 0e sts 0x0E3A, r24 ; 0x800e3a 2ed7c: 90 93 3b 0e sts 0x0E3B, r25 ; 0x800e3b 2ed80: a0 93 3c 0e sts 0x0E3C, r26 ; 0x800e3c 2ed84: b0 93 3d 0e sts 0x0E3D, r27 ; 0x800e3d return cluster >= FAT32EOC_MIN; } bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst);} bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); 2ed88: 95 01 movw r18, r10 2ed8a: b3 01 movw r22, r6 2ed8c: a2 01 movw r20, r4 2ed8e: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 2ed92: 90 91 44 0e lds r25, 0x0E44 ; 0x800e44 2ed96: 0f 94 2a 29 call 0x25254 ; 0x25254 // invalidate cache if block is in cache vol_->cacheSetBlockNumber(0XFFFFFFFF, false); } if (!vol_->writeBlock(block, src)) goto fail; 2ed9a: 88 23 and r24, r24 2ed9c: a9 f1 breq .+106 ; 0x2ee08 if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; } uint8_t* dst = vol_->cache()->data + blockOffset; memcpy(dst, src, n); } curPosition_ += n; 2ed9e: 80 91 6f 16 lds r24, 0x166F ; 0x80166f 2eda2: 90 91 70 16 lds r25, 0x1670 ; 0x801670 2eda6: a0 91 71 16 lds r26, 0x1671 ; 0x801671 2edaa: b0 91 72 16 lds r27, 0x1672 ; 0x801672 2edae: 8c 0d add r24, r12 2edb0: 9d 1d adc r25, r13 2edb2: a1 1d adc r26, r1 2edb4: b1 1d adc r27, r1 2edb6: 80 93 6f 16 sts 0x166F, r24 ; 0x80166f 2edba: 90 93 70 16 sts 0x1670, r25 ; 0x801670 2edbe: a0 93 71 16 sts 0x1671, r26 ; 0x801671 2edc2: b0 93 72 16 sts 0x1672, r27 ; 0x801672 src += n; 2edc6: ac 0c add r10, r12 2edc8: bd 1c adc r11, r13 nToWrite -= n; 2edca: ec 18 sub r14, r12 2edcc: fd 08 sbc r15, r13 2edce: 48 cf rjmp .-368 ; 0x2ec60 // error if not a normal file or is read-only if (!isFile() || !(flags_ & O_WRITE)) goto fail; // seek to end of file if append flag if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { 2edd0: 40 91 78 16 lds r20, 0x1678 ; 0x801678 2edd4: 50 91 79 16 lds r21, 0x1679 ; 0x801679 2edd8: 60 91 7a 16 lds r22, 0x167A ; 0x80167a 2eddc: 70 91 7b 16 lds r23, 0x167B ; 0x80167b 2ede0: 80 91 6f 16 lds r24, 0x166F ; 0x80166f 2ede4: 90 91 70 16 lds r25, 0x1670 ; 0x801670 2ede8: a0 91 71 16 lds r26, 0x1671 ; 0x801671 2edec: b0 91 72 16 lds r27, 0x1672 ; 0x801672 2edf0: 48 17 cp r20, r24 2edf2: 59 07 cpc r21, r25 2edf4: 6a 07 cpc r22, r26 2edf6: 7b 07 cpc r23, r27 2edf8: 09 f4 brne .+2 ; 0x2edfc 2edfa: 2e cf rjmp .-420 ; 0x2ec58 } /** Set the files position to end-of-file + \a offset. See seekSet(). * \param[in] offset The new position in bytes from end-of-file. * \return true for success or false for failure. */ bool seekEnd(int32_t offset = 0) {return seekSet(fileSize_ + offset);} 2edfc: 87 e6 ldi r24, 0x67 ; 103 2edfe: 96 e1 ldi r25, 0x16 ; 22 2ee00: 0f 94 0b 2d call 0x25a16 ; 0x25a16 if (!seekEnd()) goto fail; 2ee04: 81 11 cpse r24, r1 2ee06: 28 cf rjmp .-432 ; 0x2ec58 } return nbyte; fail: // return for write error writeError = true; 2ee08: 81 e0 ldi r24, 0x01 ; 1 2ee0a: 80 93 67 16 sts 0x1667, r24 ; 0x801667 return -1; 2ee0e: 8f ef ldi r24, 0xFF ; 255 2ee10: 9f ef ldi r25, 0xFF ; 255 2ee12: 81 c0 rjmp .+258 ; 0x2ef16 } else { curCluster_ = firstCluster_; } } else { uint32_t next; if (!vol_->fatGet(curCluster_, &next)) goto fail; 2ee14: 9e 01 movw r18, r28 2ee16: 2f 5f subi r18, 0xFF ; 255 2ee18: 3f 4f sbci r19, 0xFF ; 255 2ee1a: 0f 94 55 2b call 0x256aa ; 0x256aa 2ee1e: 88 23 and r24, r24 2ee20: 99 f3 breq .-26 ; 0x2ee08 if (vol_->isEOC(next)) { 2ee22: 89 81 ldd r24, Y+1 ; 0x01 2ee24: 9a 81 ldd r25, Y+2 ; 0x02 2ee26: ab 81 ldd r26, Y+3 ; 0x03 2ee28: bc 81 ldd r27, Y+4 ; 0x04 return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); bool isEOC(uint32_t cluster) const { if (FAT12_SUPPORT && fatType_ == 12) return cluster >= FAT12EOC_MIN; if (fatType_ == 16) return cluster >= FAT16EOC_MIN; 2ee2a: e0 91 80 16 lds r30, 0x1680 ; 0x801680 2ee2e: f0 91 81 16 lds r31, 0x1681 ; 0x801681 2ee32: 27 89 ldd r18, Z+23 ; 0x17 2ee34: 20 31 cpi r18, 0x10 ; 16 2ee36: 81 f4 brne .+32 ; 0x2ee58 2ee38: 88 3f cpi r24, 0xF8 ; 248 2ee3a: ef ef ldi r30, 0xFF ; 255 2ee3c: 9e 07 cpc r25, r30 2ee3e: a1 05 cpc r26, r1 2ee40: b1 05 cpc r27, r1 2ee42: 08 f0 brcs .+2 ; 0x2ee46 2ee44: 4c cf rjmp .-360 ; 0x2ecde // add cluster if at end of chain if (!addCluster()) goto fail; } else { curCluster_ = next; 2ee46: 80 93 6b 16 sts 0x166B, r24 ; 0x80166b 2ee4a: 90 93 6c 16 sts 0x166C, r25 ; 0x80166c 2ee4e: a0 93 6d 16 sts 0x166D, r26 ; 0x80166d 2ee52: b0 93 6e 16 sts 0x166E, r27 ; 0x80166e 2ee56: 4a cf rjmp .-364 ; 0x2ecec return cluster >= FAT32EOC_MIN; 2ee58: 88 3f cpi r24, 0xF8 ; 248 2ee5a: ff ef ldi r31, 0xFF ; 255 2ee5c: 9f 07 cpc r25, r31 2ee5e: af 07 cpc r26, r31 2ee60: ff e0 ldi r31, 0x0F ; 15 2ee62: bf 07 cpc r27, r31 2ee64: 80 f3 brcs .-32 ; 0x2ee46 2ee66: 3b cf rjmp .-394 ; 0x2ecde // invalidate cache if block is in cache vol_->cacheSetBlockNumber(0XFFFFFFFF, false); } if (!vol_->writeBlock(block, src)) goto fail; } else { if (blockOffset == 0 && curPosition_ >= fileSize_) { 2ee68: 01 15 cp r16, r1 2ee6a: 11 05 cpc r17, r1 2ee6c: 69 f5 brne .+90 ; 0x2eec8 2ee6e: 40 91 6f 16 lds r20, 0x166F ; 0x80166f 2ee72: 50 91 70 16 lds r21, 0x1670 ; 0x801670 2ee76: 60 91 71 16 lds r22, 0x1671 ; 0x801671 2ee7a: 70 91 72 16 lds r23, 0x1672 ; 0x801672 2ee7e: 80 91 78 16 lds r24, 0x1678 ; 0x801678 2ee82: 90 91 79 16 lds r25, 0x1679 ; 0x801679 2ee86: a0 91 7a 16 lds r26, 0x167A ; 0x80167a 2ee8a: b0 91 7b 16 lds r27, 0x167B ; 0x80167b 2ee8e: 48 17 cp r20, r24 2ee90: 59 07 cpc r21, r25 2ee92: 6a 07 cpc r22, r26 2ee94: 7b 07 cpc r23, r27 2ee96: c0 f0 brcs .+48 ; 0x2eec8 // start of new block don't need to read into cache if (!vol_->cacheFlush()) goto fail; 2ee98: 0f 94 8e 29 call 0x2531c ; 0x2531c 2ee9c: 88 23 and r24, r24 2ee9e: 09 f4 brne .+2 ; 0x2eea2 2eea0: b3 cf rjmp .-154 ; 0x2ee08 static bool cacheFlush(); static bool cacheRawBlock(uint32_t blockNumber, bool dirty); #endif // USE_MULTIPLE_CARDS // used by SdBaseFile write to assign cache to SD location void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) { cacheDirty_ = dirty; 2eea2: 81 e0 ldi r24, 0x01 ; 1 2eea4: 80 93 42 0e sts 0x0E42, r24 ; 0x800e42 cacheBlockNumber_ = blockNumber; 2eea8: 40 92 3a 0e sts 0x0E3A, r4 ; 0x800e3a 2eeac: 50 92 3b 0e sts 0x0E3B, r5 ; 0x800e3b 2eeb0: 60 92 3c 0e sts 0x0E3C, r6 ; 0x800e3c 2eeb4: 70 92 3d 0e sts 0x0E3D, r7 ; 0x800e3d } else { // rewrite part of block if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; } uint8_t* dst = vol_->cache()->data + blockOffset; memcpy(dst, src, n); 2eeb8: a6 01 movw r20, r12 2eeba: b5 01 movw r22, r10 2eebc: c8 01 movw r24, r16 2eebe: 8a 5b subi r24, 0xBA ; 186 2eec0: 91 4f sbci r25, 0xF1 ; 241 2eec2: 0f 94 09 aa call 0x35412 ; 0x35412 2eec6: 6b cf rjmp .-298 ; 0x2ed9e if (!vol_->cacheFlush()) goto fail; // set cache dirty and SD address of block vol_->cacheSetBlockNumber(block, true); } else { // rewrite part of block if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; 2eec8: 41 e0 ldi r20, 0x01 ; 1 2eeca: c3 01 movw r24, r6 2eecc: b2 01 movw r22, r4 2eece: 0f 94 86 2a call 0x2550c ; 0x2550c 2eed2: 81 11 cpse r24, r1 2eed4: f1 cf rjmp .-30 ; 0x2eeb8 2eed6: 98 cf rjmp .-208 ; 0x2ee08 } curPosition_ += n; src += n; nToWrite -= n; } if (curPosition_ > fileSize_) { 2eed8: 80 91 78 16 lds r24, 0x1678 ; 0x801678 2eedc: 90 91 79 16 lds r25, 0x1679 ; 0x801679 2eee0: a0 91 7a 16 lds r26, 0x167A ; 0x80167a 2eee4: b0 91 7b 16 lds r27, 0x167B ; 0x80167b 2eee8: 80 17 cp r24, r16 2eeea: 91 07 cpc r25, r17 2eeec: a2 07 cpc r26, r18 2eeee: b3 07 cpc r27, r19 2eef0: 68 f4 brcc .+26 ; 0x2ef0c 2eef2: 80 91 68 16 lds r24, 0x1668 ; 0x801668 // update fileSize and insure sync will update dir entry fileSize_ = curPosition_; 2eef6: 00 93 78 16 sts 0x1678, r16 ; 0x801678 2eefa: 10 93 79 16 sts 0x1679, r17 ; 0x801679 2eefe: 20 93 7a 16 sts 0x167A, r18 ; 0x80167a 2ef02: 30 93 7b 16 sts 0x167B, r19 ; 0x80167b flags_ |= F_FILE_DIR_DIRTY; 2ef06: 80 68 ori r24, 0x80 ; 128 2ef08: 80 93 68 16 sts 0x1668, r24 ; 0x801668 } else if (dateTime_ && nbyte) { // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & O_SYNC) { 2ef0c: 80 91 68 16 lds r24, 0x1668 ; 0x801668 2ef10: 83 fd sbrc r24, 3 2ef12: 18 c0 rjmp .+48 ; 0x2ef44 if (!sync()) goto fail; } return nbyte; 2ef14: c4 01 movw r24, r8 fail: // return for write error writeError = true; return -1; } 2ef16: 0f 90 pop r0 2ef18: 0f 90 pop r0 2ef1a: 0f 90 pop r0 2ef1c: 0f 90 pop r0 2ef1e: df 91 pop r29 2ef20: cf 91 pop r28 2ef22: 1f 91 pop r17 2ef24: 0f 91 pop r16 2ef26: ff 90 pop r15 2ef28: ef 90 pop r14 2ef2a: df 90 pop r13 2ef2c: cf 90 pop r12 2ef2e: bf 90 pop r11 2ef30: af 90 pop r10 2ef32: 9f 90 pop r9 2ef34: 8f 90 pop r8 2ef36: 7f 90 pop r7 2ef38: 6f 90 pop r6 2ef3a: 5f 90 pop r5 2ef3c: 4f 90 pop r4 2ef3e: 3f 90 pop r3 2ef40: 2f 90 pop r2 2ef42: 08 95 ret // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & O_SYNC) { if (!sync()) goto fail; 2ef44: 87 e6 ldi r24, 0x67 ; 103 2ef46: 96 e1 ldi r25, 0x16 ; 22 2ef48: 0f 94 b4 2e call 0x25d68 ; 0x25d68 2ef4c: 81 11 cpse r24, r1 2ef4e: e2 cf rjmp .-60 ; 0x2ef14 2ef50: 5b cf rjmp .-330 ; 0x2ee08 0002ef52 : #ifdef SDCARD_SORT_ALPHA /** * Get the name of a file in the current directory by sort-index */ void CardReader::getfilename_sorted(const uint16_t nr, uint8_t sdSort) { 2ef52: 0f 93 push r16 2ef54: cf 93 push r28 2ef56: df 93 push r29 2ef58: cd b7 in r28, 0x3d ; 61 2ef5a: de b7 in r29, 0x3e ; 62 2ef5c: a3 97 sbiw r28, 0x23 ; 35 2ef5e: 0f b6 in r0, 0x3f ; 63 2ef60: f8 94 cli 2ef62: de bf out 0x3e, r29 ; 62 2ef64: 0f be out 0x3f, r0 ; 63 2ef66: cd bf out 0x3d, r28 ; 61 if (nr < sort_count) 2ef68: 20 91 78 15 lds r18, 0x1578 ; 0x801578 2ef6c: 30 91 79 15 lds r19, 0x1579 ; 0x801579 2ef70: 82 17 cp r24, r18 2ef72: 93 07 cpc r25, r19 2ef74: d8 f4 brcc .+54 ; 0x2efac getfilename_simple(sort_entries[(sdSort == SD_SORT_ALPHA) ? (sort_count - nr - 1) : nr]); 2ef76: 61 30 cpi r22, 0x01 ; 1 2ef78: 31 f4 brne .+12 ; 0x2ef86 2ef7a: 21 50 subi r18, 0x01 ; 1 2ef7c: 31 09 sbc r19, r1 2ef7e: a9 01 movw r20, r18 2ef80: 48 1b sub r20, r24 2ef82: 59 0b sbc r21, r25 2ef84: ca 01 movw r24, r20 2ef86: 88 0f add r24, r24 2ef88: 99 1f adc r25, r25 2ef8a: fc 01 movw r30, r24 2ef8c: e6 58 subi r30, 0x86 ; 134 2ef8e: fa 4e sbci r31, 0xEA ; 234 2ef90: 80 81 ld r24, Z 2ef92: 91 81 ldd r25, Z+1 ; 0x01 2ef94: 0f 94 00 6c call 0x2d800 ; 0x2d800 else getfilename_afterMaxSorting(nr); } 2ef98: a3 96 adiw r28, 0x23 ; 35 2ef9a: 0f b6 in r0, 0x3f ; 63 2ef9c: f8 94 cli 2ef9e: de bf out 0x3e, r29 ; 62 2efa0: 0f be out 0x3f, r0 ; 63 2efa2: cd bf out 0x3d, r28 ; 61 2efa4: df 91 pop r29 2efa6: cf 91 pop r28 2efa8: 0f 91 pop r16 2efaa: 08 95 ret void CardReader::getfilename_afterMaxSorting(uint16_t entry, const char * const match/*=NULL*/) { curDir = &workDir; 2efac: 42 e8 ldi r20, 0x82 ; 130 2efae: 54 e1 ldi r21, 0x14 ; 20 2efb0: 50 93 81 14 sts 0x1481, r21 ; 0x801481 2efb4: 40 93 80 14 sts 0x1480, r20 ; 0x801480 nrFiles = entry - sort_count + 1; 2efb8: 82 1b sub r24, r18 2efba: 93 0b sbc r25, r19 2efbc: 01 96 adiw r24, 0x01 ; 1 2efbe: 90 93 f0 16 sts 0x16F0, r25 ; 0x8016f0 2efc2: 80 93 ef 16 sts 0x16EF, r24 ; 0x8016ef curDir->seekSet(lastSortedFilePosition << 5); 2efc6: 40 91 42 16 lds r20, 0x1642 ; 0x801642 2efca: 50 91 43 16 lds r21, 0x1643 ; 0x801643 2efce: 85 e0 ldi r24, 0x05 ; 5 2efd0: 44 0f add r20, r20 2efd2: 55 1f adc r21, r21 2efd4: 8a 95 dec r24 2efd6: e1 f7 brne .-8 ; 0x2efd0 2efd8: 70 e0 ldi r23, 0x00 ; 0 2efda: 60 e0 ldi r22, 0x00 ; 0 2efdc: 82 e8 ldi r24, 0x82 ; 130 2efde: 94 e1 ldi r25, 0x14 ; 20 2efe0: 0f 94 0b 2d call 0x25a16 ; 0x25a16 }; struct ls_param { bool LFN : 1; bool timestamp : 1; inline ls_param():LFN(0), timestamp(0) { } 2efe4: 00 e0 ldi r16, 0x00 ; 0 2efe6: 0e 7f andi r16, 0xFE ; 254 2efe8: 0d 7f andi r16, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 2efea: e0 91 80 14 lds r30, 0x1480 ; 0x801480 2efee: f0 91 81 14 lds r31, 0x1481 ; 0x801481 2eff2: 83 e2 ldi r24, 0x23 ; 35 2eff4: de 01 movw r26, r28 2eff6: 11 96 adiw r26, 0x01 ; 1 2eff8: 01 90 ld r0, Z+ 2effa: 0d 92 st X+, r0 2effc: 8a 95 dec r24 2effe: e1 f7 brne .-8 ; 0x2eff8 2f000: 22 e0 ldi r18, 0x02 ; 2 2f002: 50 e0 ldi r21, 0x00 ; 0 2f004: 40 e0 ldi r20, 0x00 ; 0 2f006: be 01 movw r22, r28 2f008: 6f 5f subi r22, 0xFF ; 255 2f00a: 7f 4f sbci r23, 0xFF ; 255 2f00c: 8f ed ldi r24, 0xDF ; 223 2f00e: 92 e0 ldi r25, 0x02 ; 2 2f010: 0f 94 8a 69 call 0x2d314 ; 0x2d314 2f014: ce 01 movw r24, r28 2f016: 01 96 adiw r24, 0x01 ; 1 2f018: 0e 94 ab 79 call 0xf356 ; 0xf356 2f01c: bd cf rjmp .-134 ; 0x2ef98 0002f01e : SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLN('.'); } } void CardReader::openFileWrite(const char* name) 2f01e: 0f 93 push r16 2f020: 1f 93 push r17 2f022: cf 93 push r28 2f024: df 93 push r29 2f026: 1f 92 push r1 2f028: 1f 92 push r1 2f02a: cd b7 in r28, 0x3d ; 61 2f02c: de b7 in r29, 0x3e ; 62 { if(!mounted) 2f02e: 20 91 d8 13 lds r18, 0x13D8 ; 0x8013d8 2f032: 22 23 and r18, r18 2f034: 69 f1 breq .+90 ; 0x2f090 2f036: 8c 01 movw r16, r24 return; if(file.isOpen()){ //replacing current file by new file, or subfile call 2f038: 80 91 6a 16 lds r24, 0x166A ; 0x80166a 2f03c: 88 23 and r24, r24 2f03e: 79 f1 breq .+94 ; 0x2f09e SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; file_subcall_ctr++; file.close(); #else SERIAL_ECHOLNPGM("File already opened"); 2f040: 84 e3 ldi r24, 0x34 ; 52 2f042: 9e e9 ldi r25, 0x9E ; 158 2f044: 0e 94 bd 7c call 0xf97a ; 0xf97a file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure SERIAL_ECHO_START; SERIAL_ECHORPGM(ofNowFreshFile); SERIAL_ECHOLN(name); } sdprinting = false; 2f048: 10 92 d7 13 sts 0x13D7, r1 ; 0x8013d7 const char *fname=name; 2f04c: 1a 83 std Y+2, r17 ; 0x02 2f04e: 09 83 std Y+1, r16 ; 0x01 if (!diveSubfolder(fname)) 2f050: ce 01 movw r24, r28 2f052: 01 96 adiw r24, 0x01 ; 1 2f054: 0f 94 6e 71 call 0x2e2dc ; 0x2e2dc 2f058: 88 23 and r24, r24 2f05a: d1 f0 breq .+52 ; 0x2f090 return; //write if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)){ 2f05c: 49 81 ldd r20, Y+1 ; 0x01 2f05e: 5a 81 ldd r21, Y+2 ; 0x02 2f060: 60 91 80 14 lds r22, 0x1480 ; 0x801480 2f064: 70 91 81 14 lds r23, 0x1481 ; 0x801481 2f068: 26 e5 ldi r18, 0x56 ; 86 2f06a: 87 e6 ldi r24, 0x67 ; 103 2f06c: 96 e1 ldi r25, 0x16 ; 22 2f06e: 0f 94 c5 54 call 0x2a98a ; 0x2a98a 2f072: 81 11 cpse r24, r1 2f074: 22 c0 rjmp .+68 ; 0x2f0ba SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); 2f076: 84 e3 ldi r24, 0x34 ; 52 2f078: 9c e6 ldi r25, 0x6C ; 108 2f07a: 0e 94 c4 7a call 0xf588 ; 0xf588 2f07e: 89 81 ldd r24, Y+1 ; 0x01 2f080: 9a 81 ldd r25, Y+2 ; 0x02 2f082: 0e 94 95 87 call 0x10f2a ; 0x10f2a 2f086: 8e e2 ldi r24, 0x2E ; 46 2f088: 0e 94 b1 79 call 0xf362 ; 0xf362 } void MarlinSerial::println(char c, int base) { print(c, base); println(); 2f08c: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED lcd_setstatuspgm(ofFileSelected); scrollstuff = 0; } } 2f090: 0f 90 pop r0 2f092: 0f 90 pop r0 2f094: df 91 pop r29 2f096: cf 91 pop r28 2f098: 1f 91 pop r17 2f09a: 0f 91 pop r16 2f09c: 08 95 ret file.close(); #else SERIAL_ECHOLNPGM("File already opened"); #endif } else { //opening fresh file file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure 2f09e: 10 92 8a 16 sts 0x168A, r1 ; 0x80168a SERIAL_ECHO_START; 2f0a2: 8e ec ldi r24, 0xCE ; 206 2f0a4: 91 ea ldi r25, 0xA1 ; 161 2f0a6: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHORPGM(ofNowFreshFile); 2f0aa: 8c e4 ldi r24, 0x4C ; 76 2f0ac: 90 ea ldi r25, 0xA0 ; 160 2f0ae: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN(name); 2f0b2: c8 01 movw r24, r16 2f0b4: 0e 94 a1 87 call 0x10f42 ; 0x10f42 2f0b8: c7 cf rjmp .-114 ; 0x2f048 if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)){ SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLN('.'); } else { saving = true; 2f0ba: 81 e0 ldi r24, 0x01 ; 1 2f0bc: 80 93 d5 13 sts 0x13D5, r24 ; 0x8013d5 getfilename(0, fname); 2f0c0: 89 81 ldd r24, Y+1 ; 0x01 2f0c2: 9a 81 ldd r25, Y+2 ; 0x02 2f0c4: 0f 94 b9 6b call 0x2d772 ; 0x2d772 SERIAL_PROTOCOLRPGM(ofWritingToFile);////MSG_SD_WRITE_TO_FILE 2f0c8: 82 e2 ldi r24, 0x22 ; 34 2f0ca: 9e e9 ldi r25, 0x9E ; 158 2f0cc: 0e 94 c4 7a call 0xf588 ; 0xf588 printAbsFilenameFast(); 2f0d0: 0f 94 9c 6c call 0x2d938 ; 0x2d938 SERIAL_PROTOCOLLN(); 2f0d4: 0e 94 bc 7a call 0xf578 ; 0xf578 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED 2f0d8: 88 e2 ldi r24, 0x28 ; 40 2f0da: 90 ea ldi r25, 0xA0 ; 160 2f0dc: 0e 94 bd 7c call 0xf97a ; 0xf97a lcd_setstatuspgm(ofFileSelected); 2f0e0: 88 e2 ldi r24, 0x28 ; 40 2f0e2: 90 ea ldi r25, 0xA0 ; 160 2f0e4: 0e 94 94 de call 0x1bd28 ; 0x1bd28 scrollstuff = 0; 2f0e8: 10 92 62 0d sts 0x0D62, r1 ; 0x800d62 2f0ec: d1 cf rjmp .-94 ; 0x2f090 0002f0ee : //presort(); #endif } } bool CardReader::ToshibaFlashAir_GetIP(uint8_t *ip) 2f0ee: 0f 93 push r16 2f0f0: 1f 93 push r17 2f0f2: cf 93 push r28 2f0f4: df 93 push r29 2f0f6: ec 01 movw r28, r24 { memset(ip, 0, 4); 2f0f8: 84 e0 ldi r24, 0x04 ; 4 2f0fa: fe 01 movw r30, r28 2f0fc: 11 92 st Z+, r1 2f0fe: 8a 95 dec r24 2f100: e9 f7 brne .-6 ; 0x2f0fc /** Perform Extention Read. */ uint8_t Sd2Card::readExt(uint32_t arg, uint8_t* dst, uint16_t count) { uint16_t i; // send command and argument. if (cardCommand(CMD48, arg) && cardCommand(CMD17, arg)) { // CMD48 for W-03, CMD17 for W-04 2f102: 23 e0 ldi r18, 0x03 ; 3 2f104: 30 ea ldi r19, 0xA0 ; 160 2f106: 4a e0 ldi r20, 0x0A ; 10 2f108: 50 e9 ldi r21, 0x90 ; 144 2f10a: 60 e3 ldi r22, 0x30 ; 48 2f10c: 84 e4 ldi r24, 0x44 ; 68 2f10e: 96 e1 ldi r25, 0x16 ; 22 2f110: 0f 94 d1 28 call 0x251a2 ; 0x251a2 2f114: 88 23 and r24, r24 2f116: 91 f0 breq .+36 ; 0x2f13c 2f118: 23 e0 ldi r18, 0x03 ; 3 2f11a: 30 ea ldi r19, 0xA0 ; 160 2f11c: 4a e0 ldi r20, 0x0A ; 10 2f11e: 50 e9 ldi r21, 0x90 ; 144 2f120: 61 e1 ldi r22, 0x11 ; 17 2f122: 84 e4 ldi r24, 0x44 ; 68 2f124: 96 e1 ldi r25, 0x16 ; 22 2f126: 0f 94 d1 28 call 0x251a2 ; 0x251a2 2f12a: 88 23 and r24, r24 2f12c: 39 f0 breq .+14 ; 0x2f13c bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 2f12e: 80 e8 ldi r24, 0x80 ; 128 2f130: 80 93 44 16 sts 0x1644, r24 ; 0x801644 chipSelectHigh(); spiSend(0xFF); // dummy clock to force FlashAir finish the command. return true; fail: chipSelectHigh(); 2f134: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 return false; 2f138: 80 e0 ldi r24, 0x00 ; 0 2f13a: 2f c0 rjmp .+94 ; 0x2f19a //------------------------------------------------------------------------------ /** Wait for start block token */ //FIXME Vojtech: Copied from a current version of Sd2Card Arduino code. // We shall likely upgrade the rest of the Sd2Card. uint8_t Sd2Card::waitStartBlock(void) { uint16_t t0 = _millis(); 2f13c: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2f140: 8b 01 movw r16, r22 while ((status_ = spiRec()) == 0XFF) { 2f142: 0f 94 ca 28 call 0x25194 ; 0x25194 2f146: 80 93 46 16 sts 0x1646, r24 ; 0x801646 2f14a: 8f 3f cpi r24, 0xFF ; 255 2f14c: 69 f4 brne .+26 ; 0x2f168 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { 2f14e: 0f 94 f0 0d call 0x21be0 ; 0x21be0 2f152: 60 1b sub r22, r16 2f154: 71 0b sbc r23, r17 2f156: 6d 32 cpi r22, 0x2D ; 45 2f158: 71 40 sbci r23, 0x01 ; 1 2f15a: 98 f3 brcs .-26 ; 0x2f142 2f15c: 81 e1 ldi r24, 0x11 ; 17 2f15e: 80 93 44 16 sts 0x1644, r24 ; 0x801644 goto fail; } return true; fail: chipSelectHigh(); 2f162: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 2f166: e6 cf rjmp .-52 ; 0x2f134 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto fail; } } if (status_ != DATA_START_BLOCK) { 2f168: 8e 3f cpi r24, 0xFE ; 254 2f16a: 11 f0 breq .+4 ; 0x2f170 2f16c: 8f e0 ldi r24, 0x0F ; 15 2f16e: f7 cf rjmp .-18 ; 0x2f15e 2f170: 8e 01 movw r16, r28 2f172: 0c 5f subi r16, 0xFC ; 252 2f174: 1f 4f sbci r17, 0xFF ; 255 goto fail; } // receive data for (i = 0; i < count; ++i) { dst[i] = spiRec(); 2f176: 0f 94 ca 28 call 0x25194 ; 0x25194 2f17a: 89 93 st Y+, r24 if (!waitStartBlock()) { goto fail; } // receive data for (i = 0; i < count; ++i) { 2f17c: c0 17 cp r28, r16 2f17e: d1 07 cpc r29, r17 2f180: d1 f7 brne .-12 ; 0x2f176 2f182: ce ef ldi r28, 0xFE ; 254 2f184: d1 e0 ldi r29, 0x01 ; 1 dst[i] = spiRec(); } // skip dummy bytes and 16-bit crc. for (; i < 514; ++i) { spiRec(); 2f186: 0f 94 ca 28 call 0x25194 ; 0x25194 2f18a: 21 97 sbiw r28, 0x01 ; 1 for (i = 0; i < count; ++i) { dst[i] = spiRec(); } // skip dummy bytes and 16-bit crc. for (; i < 514; ++i) { 2f18c: e1 f7 brne .-8 ; 0x2f186 spiRec(); } chipSelectHigh(); 2f18e: 0f 94 dc 65 call 0x2cbb8 ; 0x2cbb8 spiSend(0xFF); // dummy clock to force FlashAir finish the command. 2f192: 8f ef ldi r24, 0xFF ; 255 2f194: 0f 94 c5 28 call 0x2518a ; 0x2518a 2f198: 81 e0 ldi r24, 0x01 ; 1 return card.readExtMemory(1, 1, 0x400+0x150, 4, ip); } 2f19a: df 91 pop r29 2f19c: cf 91 pop r28 2f19e: 1f 91 pop r17 2f1a0: 0f 91 pop r16 2f1a2: 08 95 ret 0002f1a4 : } enum class dcode_mem_t:uint8_t { sram, eeprom, progmem, xflash }; void print_mem(daddr_t address, daddr_t count, dcode_mem_t type, uint8_t countperline = 16) 2f1a4: cf 92 push r12 2f1a6: df 92 push r13 2f1a8: ef 92 push r14 2f1aa: ff 92 push r15 2f1ac: 0f 93 push r16 2f1ae: 1f 93 push r17 2f1b0: cf 93 push r28 2f1b2: df 93 push r29 2f1b4: ec 01 movw r28, r24 2f1b6: 8b 01 movw r16, r22 2f1b8: e4 2e mov r14, r20 { #if defined(DEBUG_DCODE6) || defined(DEBUG_DCODES) || defined(XFLASH_DUMP) if(type == dcode_mem_t::xflash) XFLASH_SPI_ENTER(); #endif while (count) 2f1ba: 01 15 cp r16, r1 2f1bc: 11 05 cpc r17, r1 2f1be: 09 f4 brne .+2 ; 0x2f1c2 2f1c0: 41 c0 rjmp .+130 ; 0x2f244 void print_hex_word(daddr_t val) { #if DADDR_SIZE > 16 print_hex_byte((val >> 16) & 0xFF); #endif print_hex_byte((val >> 8) & 0xFF); 2f1c2: 8d 2f mov r24, r29 2f1c4: 0e 94 f8 78 call 0xf1f0 ; 0xf1f0 print_hex_byte(val & 0xFF); 2f1c8: 8c 2f mov r24, r28 2f1ca: 0e 94 f8 78 call 0xf1f0 ; 0xf1f0 XFLASH_SPI_ENTER(); #endif while (count) { print_hex_word(address); putchar(' '); 2f1ce: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> 2f1d2: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> 2f1d6: 80 e2 ldi r24, 0x20 ; 32 2f1d8: 90 e0 ldi r25, 0x00 ; 0 2f1da: 0f 94 48 a2 call 0x34490 ; 0x34490 2f1de: 6e 01 movw r12, r28 2f1e0: 80 e1 ldi r24, 0x10 ; 16 2f1e2: c8 0e add r12, r24 2f1e4: d1 1c adc r13, r1 uint8_t count_line = countperline; while (count && count_line) { uint8_t data = 0; switch (type) 2f1e6: 81 e0 ldi r24, 0x01 ; 1 2f1e8: e8 16 cp r14, r24 2f1ea: 39 f1 breq .+78 ; 0x2f23a { case dcode_mem_t::sram: data = *((uint8_t*)address); break; 2f1ec: f8 80 ld r15, Y case dcode_mem_t::xflash: xflash_rd_data(address, &data, 1); break; #else case dcode_mem_t::xflash: break; #endif } ++address; 2f1ee: 21 96 adiw r28, 0x01 ; 1 putchar(' '); 2f1f0: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> 2f1f4: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> 2f1f8: 80 e2 ldi r24, 0x20 ; 32 2f1fa: 90 e0 ldi r25, 0x00 ; 0 2f1fc: 0f 94 48 a2 call 0x34490 ; 0x34490 print_hex_byte(data); 2f200: 8f 2d mov r24, r15 2f202: 0e 94 f8 78 call 0xf1f0 ; 0xf1f0 count_line--; count--; 2f206: 01 50 subi r16, 0x01 ; 1 2f208: 11 09 sbc r17, r1 // sporadically call manage_heater, but only when interrupts are enabled (meaning // print_mem is called by D2). Don't do anything otherwise: we are inside a crash // handler where memory & stack needs to be preserved! if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192)) 2f20a: 0f b6 in r0, 0x3f ; 63 2f20c: 07 fe sbrs r0, 7 2f20e: 06 c0 rjmp .+12 ; 0x2f21c 2f210: c8 01 movw r24, r16 2f212: 9f 71 andi r25, 0x1F ; 31 2f214: 89 2b or r24, r25 2f216: 29 f4 brne .+10 ; 0x2f222 manage_heater(); 2f218: 0f 94 1c 3a call 0x27438 ; 0x27438 while (count) { print_hex_word(address); putchar(' '); uint8_t count_line = countperline; while (count && count_line) 2f21c: 01 15 cp r16, r1 2f21e: 11 05 cpc r17, r1 2f220: 19 f0 breq .+6 ; 0x2f228 2f222: cc 15 cp r28, r12 2f224: dd 05 cpc r29, r13 2f226: f9 f6 brne .-66 ; 0x2f1e6 // print_mem is called by D2). Don't do anything otherwise: we are inside a crash // handler where memory & stack needs to be preserved! if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192)) manage_heater(); } putchar('\n'); 2f228: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> 2f22c: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> 2f230: 8a e0 ldi r24, 0x0A ; 10 2f232: 90 e0 ldi r25, 0x00 ; 0 2f234: 0f 94 48 a2 call 0x34490 ; 0x34490 2f238: c0 cf rjmp .-128 ; 0x2f1ba { uint8_t data = 0; switch (type) { case dcode_mem_t::sram: data = *((uint8_t*)address); break; case dcode_mem_t::eeprom: data = eeprom_read_byte((uint8_t*)address); break; 2f23a: ce 01 movw r24, r28 2f23c: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2f240: f8 2e mov r15, r24 2f242: d5 cf rjmp .-86 ; 0x2f1ee if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192)) manage_heater(); } putchar('\n'); } } 2f244: df 91 pop r29 2f246: cf 91 pop r28 2f248: 1f 91 pop r17 2f24a: 0f 91 pop r16 2f24c: ff 90 pop r15 2f24e: ef 90 pop r14 2f250: df 90 pop r13 2f252: cf 90 pop r12 2f254: 08 95 ret 0002f256 : #include "planner.h" #include "temperature.h" #include "ultralcd.h" #ifdef FILAMENT_SENSOR FSensorBlockRunout::FSensorBlockRunout() { 2f256: cf 93 push r28 2f258: df 93 push r29 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state); } } void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) { runoutEnabled = state; 2f25a: c1 ef ldi r28, 0xF1 ; 241 2f25c: d6 e1 ldi r29, 0x16 ; 22 2f25e: 1a 82 std Y+2, r1 ; 0x02 fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 2f260: 19 82 std Y+1, r1 ; 0x01 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 2f262: 1e 86 std Y+14, r1 ; 0x0e oldPos = pat9125_y; 2f264: 80 91 38 0e lds r24, 0x0E38 ; 0x800e38 2f268: 90 91 39 0e lds r25, 0x0E39 ; 0x800e39 2f26c: 98 8b std Y+16, r25 ; 0x10 2f26e: 8f 87 std Y+15, r24 ; 0x0f resetStepCount(); 2f270: 0f 94 8d 6d call 0x2db1a ; 0x2db1a jamErrCnt = 0; 2f274: 1d 8a std Y+21, r1 ; 0x15 fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament. #if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament. #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } 2f276: df 91 pop r29 2f278: cf 91 pop r28 2f27a: 08 95 ret 0002f27c : //! //! @param layer_height layer height in mm //! @param extrusion_width extrusion width in mm //! @param extrusion_length extrusion length in mm //! @return filament length in mm which needs to be extruded to form line static constexpr float __attribute__((noinline)) count_e(float layer_height, float extrusion_width, float extrusion_length, float filament_diameter=1.75f) 2f27c: cf 92 push r12 2f27e: df 92 push r13 2f280: ef 92 push r14 2f282: ff 92 push r15 2f284: 69 01 movw r12, r18 2f286: 7a 01 movw r14, r20 { return (extrusion_length * ((M_PI * pow(layer_height, 2)) / 4 + layer_height * (extrusion_width - layer_height))) / ((M_PI * pow(filament_diameter, 2)) / 4); 2f288: 2d ec ldi r18, 0xCD ; 205 2f28a: 3c ec ldi r19, 0xCC ; 204 2f28c: 4c e4 ldi r20, 0x4C ; 76 2f28e: 5e e3 ldi r21, 0x3E ; 62 2f290: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2f294: 2d ec ldi r18, 0xCD ; 205 2f296: 3c ec ldi r19, 0xCC ; 204 2f298: 4c e4 ldi r20, 0x4C ; 76 2f29a: 5e e3 ldi r21, 0x3E ; 62 2f29c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f2a0: 2d ef ldi r18, 0xFD ; 253 2f2a2: 3d ea ldi r19, 0xAD ; 173 2f2a4: 40 e0 ldi r20, 0x00 ; 0 2f2a6: 5d e3 ldi r21, 0x3D ; 61 2f2a8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2f2ac: a7 01 movw r20, r14 2f2ae: 96 01 movw r18, r12 2f2b0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f2b4: 24 e2 ldi r18, 0x24 ; 36 2f2b6: 30 ef ldi r19, 0xF0 ; 240 2f2b8: 49 e1 ldi r20, 0x19 ; 25 2f2ba: 50 e4 ldi r21, 0x40 ; 64 2f2bc: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> } 2f2c0: ff 90 pop r15 2f2c2: ef 90 pop r14 2f2c4: df 90 pop r13 2f2c6: cf 90 pop r12 2f2c8: 08 95 ret 0002f2ca : } } void st_set_position(const long *pos) { CRITICAL_SECTION_START; 2f2ca: 9f b7 in r25, 0x3f ; 63 2f2cc: f8 94 cli // Copy 4x4B. // This block locks the interrupts globally for 2.06 us, // which corresponds to a maximum repeat frequency of ~484kHz. // This blocking is safe in the context of a 10kHz stepper driver interrupt // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz. memcpy((long *)count_position, pos, sizeof(count_position)); 2f2ce: 80 e1 ldi r24, 0x10 ; 16 2f2d0: ec e3 ldi r30, 0x3C ; 60 2f2d2: f6 e0 ldi r31, 0x06 ; 6 2f2d4: ac e4 ldi r26, 0x4C ; 76 2f2d6: b6 e0 ldi r27, 0x06 ; 6 2f2d8: 01 90 ld r0, Z+ 2f2da: 0d 92 st X+, r0 2f2dc: 8a 95 dec r24 2f2de: e1 f7 brne .-8 ; 0x2f2d8 CRITICAL_SECTION_END; 2f2e0: 9f bf out 0x3f, r25 ; 63 } 2f2e2: 08 95 ret 0002f2e4 : #include "sound.h" namespace MMU2 { void BeginReport(CommandInProgress /*cip*/, ProgressCode ec) { custom_message_type = CustomMsg::MMUProgress; 2f2e4: 89 e0 ldi r24, 0x09 ; 9 2f2e6: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d }; const char *ProgressCodeToText(ProgressCode pc) { // @@TODO ?? a better fallback option? return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0]))) ? static_cast(pgm_read_ptr(&progressTexts[(uint16_t)pc])) 2f2ea: ea e4 ldi r30, 0x4A ; 74 2f2ec: fe e9 ldi r31, 0x9E ; 158 2f2ee: 85 91 lpm r24, Z+ 2f2f0: 94 91 lpm r25, Z lcd_setstatuspgm( _T(ProgressCodeToText(ec)) ); 2f2f2: 0e 94 3a 75 call 0xea74 ; 0xea74 2f2f6: 0c 94 94 de jmp 0x1bd28 ; 0x1bd28 0002f2fa : void MMU2::filament_ramming() { execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); } void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t stepCount) { 2f2fa: 1f 93 push r17 2f2fc: cf 93 push r28 2f2fe: df 93 push r29 2f300: ec 01 movw r28, r24 2f302: 16 2f mov r17, r22 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 2f304: 0f 94 fb 1a call 0x235f6 ; 0x235f6 planner_synchronize(); // Plan the moves const E_Step *step = sequence; for (uint8_t i = stepCount; i > 0; --i) { extruder_move(pgm_read_float(&(step->extrude)), pgm_read_float(&(step->feedRate))); 2f308: fe 01 movw r30, r28 2f30a: 34 96 adiw r30, 0x04 ; 4 2f30c: 25 91 lpm r18, Z+ 2f30e: 35 91 lpm r19, Z+ 2f310: 45 91 lpm r20, Z+ 2f312: 54 91 lpm r21, Z 2f314: fe 01 movw r30, r28 2f316: 65 91 lpm r22, Z+ 2f318: 75 91 lpm r23, Z+ 2f31a: 85 91 lpm r24, Z+ 2f31c: 94 91 lpm r25, Z 2f31e: 0f 94 d6 50 call 0x2a1ac ; 0x2a1ac step++; 2f322: 28 96 adiw r28, 0x08 ; 8 void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t stepCount) { planner_synchronize(); // Plan the moves const E_Step *step = sequence; for (uint8_t i = stepCount; i > 0; --i) { 2f324: 11 50 subi r17, 0x01 ; 1 2f326: 81 f7 brne .-32 ; 0x2f308 2f328: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Wait for the moves to finish // it looks like it's better to sync the moves at the end - smoother move (if the sequence is not too long). planner_synchronize(); Disable_E0(); } 2f32c: df 91 pop r29 2f32e: cf 91 pop r28 2f330: 1f 91 pop r17 // Wait for the moves to finish // it looks like it's better to sync the moves at the end - smoother move (if the sequence is not too long). planner_synchronize(); Disable_E0(); 2f332: 0d 94 d4 50 jmp 0x2a1a8 ; 0x2a1a8 0002f336 : } void EndReport(CommandInProgress /*cip*/, ProgressCode /*ec*/) { // clear the status msg line - let the printed filename get visible again if (!printJobOngoing()) { 2f336: 0e 94 40 66 call 0xcc80 ; 0xcc80 2f33a: 81 11 cpse r24, r1 2f33c: 04 c0 rjmp .+8 ; 0x2f346 lcd_setstatuspgm(MSG_WELCOME); 2f33e: 86 ee ldi r24, 0xE6 ; 230 2f340: 9b e6 ldi r25, 0x6B ; 107 2f342: 0e 94 94 de call 0x1bd28 ; 0x1bd28 } custom_message_type = CustomMsg::Status; 2f346: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d } 2f34a: 08 95 ret 0002f34c : EndReport(cip, ProgressCode::OK); } }; bool MMU2::WaitForMMUReady() { switch (State()) { 2f34c: 80 91 01 13 lds r24, 0x1301 ; 0x801301 2f350: 88 23 and r24, r24 2f352: 11 f0 breq .+4 ; 0x2f358 return false; case xState::Connecting: // shall we wait until the MMU reconnects? // fire-up a fsm_dlg and show "MMU not responding"? default: return true; 2f354: 81 e0 ldi r24, 0x01 ; 1 2f356: 08 95 ret }; bool MMU2::WaitForMMUReady() { switch (State()) { case xState::Stopped: return false; 2f358: 80 e0 ldi r24, 0x00 ; 0 // shall we wait until the MMU reconnects? // fire-up a fsm_dlg and show "MMU not responding"? default: return true; } } 2f35a: 08 95 ret 0002f35c : } #ifdef TMC2130 void homeaxis(uint8_t axis, uint8_t cnt, uint8_t* pstep) #else void homeaxis(uint8_t axis, uint8_t cnt) 2f35c: 2f 92 push r2 2f35e: 3f 92 push r3 2f360: 4f 92 push r4 2f362: 5f 92 push r5 2f364: 6f 92 push r6 2f366: 7f 92 push r7 2f368: 8f 92 push r8 2f36a: 9f 92 push r9 2f36c: af 92 push r10 2f36e: bf 92 push r11 2f370: cf 92 push r12 2f372: df 92 push r13 2f374: ef 92 push r14 2f376: ff 92 push r15 2f378: 0f 93 push r16 2f37a: 1f 93 push r17 2f37c: cf 93 push r28 2f37e: df 93 push r29 2f380: 00 d0 rcall .+0 ; 0x2f382 2f382: 00 d0 rcall .+0 ; 0x2f384 2f384: 00 d0 rcall .+0 ; 0x2f386 2f386: 1f 92 push r1 2f388: 1f 92 push r1 2f38a: cd b7 in r28, 0x3d ; 61 2f38c: de b7 in r29, 0x3e ; 62 2f38e: 8b 83 std Y+3, r24 ; 0x03 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 2f390: 20 91 77 02 lds r18, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> 2f394: 2d 83 std Y+5, r18 ; 0x05 check_endstops = check; 2f396: 81 e0 ldi r24, 0x01 ; 1 2f398: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> #endif //TMC2130 { bool endstops_enabled = enable_endstops(true); //RP: endstops should be allways enabled durring homing #define HOMEAXIS_DO(LETTER) \ ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) if ((axis==X_AXIS)?HOMEAXIS_DO(X):(axis==Y_AXIS)?HOMEAXIS_DO(Y):0) 2f39c: 9b 81 ldd r25, Y+3 ; 0x03 2f39e: 92 30 cpi r25, 0x02 ; 2 2f3a0: 09 f4 brne .+2 ; 0x2f3a4 2f3a2: 5b c1 rjmp .+694 ; 0x2f65a XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH); XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM); XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); 2f3a4: a9 2f mov r26, r25 2f3a6: b0 e0 ldi r27, 0x00 ; 0 2f3a8: ba 83 std Y+2, r27 ; 0x02 2f3aa: a9 83 std Y+1, r26 ; 0x01 2f3ac: fd 01 movw r30, r26 2f3ae: e7 5e subi r30, 0xE7 ; 231 2f3b0: f2 46 sbci r31, 0x62 ; 98 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); DEFINE_PGM_READ_ANY(signed char, byte); 2f3b2: 24 91 lpm r18, Z 2f3b4: 2c 83 std Y+4, r18 ; 0x04 #define HOMEAXIS_DO(LETTER) \ ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) if ((axis==X_AXIS)?HOMEAXIS_DO(X):(axis==Y_AXIS)?HOMEAXIS_DO(Y):0) { int axis_home_dir = home_dir(axis); feedrate = homing_feedrate[axis]; 2f3b6: 8d 01 movw r16, r26 2f3b8: 00 0f add r16, r16 2f3ba: 11 1f adc r17, r17 2f3bc: 00 0f add r16, r16 2f3be: 11 1f adc r17, r17 2f3c0: f8 01 movw r30, r16 2f3c2: ee 50 subi r30, 0x0E ; 14 2f3c4: fd 4f sbci r31, 0xFD ; 253 2f3c6: 40 80 ld r4, Z 2f3c8: 51 80 ldd r5, Z+1 ; 0x01 2f3ca: 62 80 ldd r6, Z+2 ; 0x02 2f3cc: 73 80 ldd r7, Z+3 ; 0x03 2f3ce: 40 92 7a 02 sts 0x027A, r4 ; 0x80027a 2f3d2: 50 92 7b 02 sts 0x027B, r5 ; 0x80027b 2f3d6: 60 92 7c 02 sts 0x027C, r6 ; 0x80027c 2f3da: 70 92 7d 02 sts 0x027D, r7 ; 0x80027d float feedrate_mm_s = get_feedrate_mm_s(feedrate); 2f3de: c3 01 movw r24, r6 2f3e0: b2 01 movw r22, r4 2f3e2: 0e 94 45 65 call 0xca8a ; 0xca8a 2f3e6: 4b 01 movw r8, r22 2f3e8: 5c 01 movw r10, r24 // Move away a bit, so that the print head does not touch the end position, // and the following movement to endstop has a chance to achieve the required velocity // for the stall guard to work. current_position[axis] = 0; 2f3ea: c8 01 movw r24, r16 2f3ec: 8f 59 subi r24, 0x9F ; 159 2f3ee: 9d 4e sbci r25, 0xED ; 237 2f3f0: 1c 01 movw r2, r24 2f3f2: dc 01 movw r26, r24 2f3f4: 1d 92 st X+, r1 2f3f6: 1d 92 st X+, r1 2f3f8: 1d 92 st X+, r1 2f3fa: 1c 92 st X, r1 2f3fc: 13 97 sbiw r26, 0x03 ; 3 plan_set_position_curposXYZE(); 2f3fe: 0f 94 41 4b call 0x29682 ; 0x29682 set_destination_to_current(); 2f402: 0e 94 ae 66 call 0xcd5c ; 0xcd5c // destination[axis] = 11.f; destination[axis] = -3.f * axis_home_dir; 2f406: bc 81 ldd r27, Y+4 ; 0x04 2f408: 6b 2f mov r22, r27 2f40a: bb 0f add r27, r27 2f40c: 77 0b sbc r23, r23 2f40e: 88 0b sbc r24, r24 2f410: 99 0b sbc r25, r25 2f412: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2f416: 6b 01 movw r12, r22 2f418: 7c 01 movw r14, r24 2f41a: f8 01 movw r30, r16 2f41c: e7 5d subi r30, 0xD7 ; 215 2f41e: f9 4f sbci r31, 0xF9 ; 249 2f420: fb 87 std Y+11, r31 ; 0x0b 2f422: ea 87 std Y+10, r30 ; 0x0a 2f424: 20 e0 ldi r18, 0x00 ; 0 2f426: 30 e0 ldi r19, 0x00 ; 0 2f428: 40 e4 ldi r20, 0x40 ; 64 2f42a: 50 ec ldi r21, 0xC0 ; 192 2f42c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f430: aa 85 ldd r26, Y+10 ; 0x0a 2f432: bb 85 ldd r27, Y+11 ; 0x0b 2f434: 6d 93 st X+, r22 2f436: 7d 93 st X+, r23 2f438: 8d 93 st X+, r24 2f43a: 9c 93 st X, r25 2f43c: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f43e: c5 01 movw r24, r10 2f440: b4 01 movw r22, r8 2f442: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f446: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Move away from the possible collision with opposite endstop with the collision detection disabled. endstops_hit_on_purpose(); 2f44a: 0f 94 a4 25 call 0x24b48 ; 0x24b48 2f44e: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> enable_endstops(false); current_position[axis] = 0; 2f452: f1 01 movw r30, r2 2f454: 10 82 st Z, r1 2f456: 11 82 std Z+1, r1 ; 0x01 2f458: 12 82 std Z+2, r1 ; 0x02 2f45a: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 2f45c: 0f 94 41 4b call 0x29682 ; 0x29682 destination[axis] = 1. * axis_home_dir; 2f460: aa 85 ldd r26, Y+10 ; 0x0a 2f462: bb 85 ldd r27, Y+11 ; 0x0b 2f464: cd 92 st X+, r12 2f466: dd 92 st X+, r13 2f468: ed 92 st X+, r14 2f46a: fc 92 st X, r15 2f46c: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f46e: c5 01 movw r24, r10 2f470: b4 01 movw r22, r8 2f472: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f476: 0f 94 fb 1a call 0x235f6 ; 0x235f6 2f47a: b1 e0 ldi r27, 0x01 ; 1 2f47c: b0 93 77 02 sts 0x0277, r27 ; 0x800277 <_ZL14check_endstops.lto_priv.387> { return pgm_read_any(&array##_P[axis]); } XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH); 2f480: f8 01 movw r30, r16 2f482: e3 5f subi r30, 0xF3 ; 243 2f484: f2 46 sbci r31, 0x62 ; 98 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); 2f486: 85 91 lpm r24, Z+ 2f488: 95 91 lpm r25, Z+ 2f48a: a5 91 lpm r26, Z+ 2f48c: b4 91 lpm r27, Z 2f48e: 8e 83 std Y+6, r24 ; 0x06 2f490: 9f 83 std Y+7, r25 ; 0x07 2f492: a8 87 std Y+8, r26 ; 0x08 2f494: b9 87 std Y+9, r27 ; 0x09 destination[axis] = 1. * axis_home_dir; plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); // Now continue to move up to the left end stop with the collision detection enabled. enable_endstops(true); destination[axis] = 1.1 * axis_home_dir * max_length(axis); 2f496: 2d ec ldi r18, 0xCD ; 205 2f498: 3c ec ldi r19, 0xCC ; 204 2f49a: 4c e8 ldi r20, 0x8C ; 140 2f49c: 5f e3 ldi r21, 0x3F ; 63 2f49e: c7 01 movw r24, r14 2f4a0: b6 01 movw r22, r12 2f4a2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f4a6: 2e 81 ldd r18, Y+6 ; 0x06 2f4a8: 3f 81 ldd r19, Y+7 ; 0x07 2f4aa: 48 85 ldd r20, Y+8 ; 0x08 2f4ac: 59 85 ldd r21, Y+9 ; 0x09 2f4ae: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f4b2: aa 85 ldd r26, Y+10 ; 0x0a 2f4b4: bb 85 ldd r27, Y+11 ; 0x0b 2f4b6: 6d 93 st X+, r22 2f4b8: 7d 93 st X+, r23 2f4ba: 8d 93 st X+, r24 2f4bc: 9c 93 st X, r25 2f4be: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f4c0: c5 01 movw r24, r10 2f4c2: b4 01 movw r22, r8 2f4c4: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f4c8: 0f 94 fb 1a call 0x235f6 ; 0x235f6 for (uint8_t i = 0; i < cnt; i++) { // Move away from the collision to a known distance from the left end stop with the collision detection disabled. endstops_hit_on_purpose(); 2f4cc: 0f 94 a4 25 call 0x24b48 ; 0x24b48 2f4d0: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> enable_endstops(false); current_position[axis] = 0; 2f4d4: f1 01 movw r30, r2 2f4d6: 10 82 st Z, r1 2f4d8: 11 82 std Z+1, r1 ; 0x01 2f4da: 12 82 std Z+2, r1 ; 0x02 2f4dc: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 2f4de: 0f 94 41 4b call 0x29682 ; 0x29682 destination[axis] = -10.f * axis_home_dir; 2f4e2: 20 e0 ldi r18, 0x00 ; 0 2f4e4: 30 e0 ldi r19, 0x00 ; 0 2f4e6: 40 e2 ldi r20, 0x20 ; 32 2f4e8: 51 ec ldi r21, 0xC1 ; 193 2f4ea: c7 01 movw r24, r14 2f4ec: b6 01 movw r22, r12 2f4ee: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f4f2: aa 85 ldd r26, Y+10 ; 0x0a 2f4f4: bb 85 ldd r27, Y+11 ; 0x0b 2f4f6: 6d 93 st X+, r22 2f4f8: 7d 93 st X+, r23 2f4fa: 8d 93 st X+, r24 2f4fc: 9c 93 st X, r25 2f4fe: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f500: c5 01 movw r24, r10 2f502: b4 01 movw r22, r8 2f504: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f508: 0f 94 fb 1a call 0x235f6 ; 0x235f6 endstops_hit_on_purpose(); 2f50c: 0f 94 a4 25 call 0x24b48 ; 0x24b48 2f510: b1 e0 ldi r27, 0x01 ; 1 2f512: b0 93 77 02 sts 0x0277, r27 ; 0x800277 <_ZL14check_endstops.lto_priv.387> // Now move left up to the collision, this time with a repeatable velocity. enable_endstops(true); destination[axis] = 11.f * axis_home_dir; 2f516: 20 e0 ldi r18, 0x00 ; 0 2f518: 30 e0 ldi r19, 0x00 ; 0 2f51a: 40 e3 ldi r20, 0x30 ; 48 2f51c: 51 e4 ldi r21, 0x41 ; 65 2f51e: c7 01 movw r24, r14 2f520: b6 01 movw r22, r12 2f522: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f526: ea 85 ldd r30, Y+10 ; 0x0a 2f528: fb 85 ldd r31, Y+11 ; 0x0b 2f52a: 60 83 st Z, r22 2f52c: 71 83 std Z+1, r23 ; 0x01 2f52e: 82 83 std Z+2, r24 ; 0x02 2f530: 93 83 std Z+3, r25 ; 0x03 #ifdef TMC2130 feedrate = homing_feedrate[axis]; #else //TMC2130 feedrate = homing_feedrate[axis] / 2; 2f532: 20 e0 ldi r18, 0x00 ; 0 2f534: 30 e0 ldi r19, 0x00 ; 0 2f536: 40 e0 ldi r20, 0x00 ; 0 2f538: 5f e3 ldi r21, 0x3F ; 63 2f53a: c3 01 movw r24, r6 2f53c: b2 01 movw r22, r4 2f53e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f542: 60 93 7a 02 sts 0x027A, r22 ; 0x80027a 2f546: 70 93 7b 02 sts 0x027B, r23 ; 0x80027b 2f54a: 80 93 7c 02 sts 0x027C, r24 ; 0x80027c 2f54e: 90 93 7d 02 sts 0x027D, r25 ; 0x80027d feedrate_mm_s = get_feedrate_mm_s(feedrate); 2f552: 0e 94 45 65 call 0xca8a ; 0xca8a 2f556: 6b 01 movw r12, r22 2f558: 7c 01 movw r14, r24 #endif //TMC2130 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f55a: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f55e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 uint16_t mscnt = tmc2130_rd_MSCNT(axis); if (pstep) pstep[i] = mscnt >> 4; printf_P(PSTR("%3d step=%2d mscnt=%4d\n"), i, mscnt >> 4, mscnt); #endif //TMC2130 } endstops_hit_on_purpose(); 2f562: 0f 94 a4 25 call 0x24b48 ; 0x24b48 2f566: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> else tmc2130_do_steps(axis, 8, -axis_home_dir, 1000); tmc2130_home_exit(); #endif //TMC2130 axis_is_at_home(axis); 2f56a: 8b 81 ldd r24, Y+3 ; 0x03 2f56c: 0e 94 8f 65 call 0xcb1e ; 0xcb1e axis_known_position[axis] = true; 2f570: e9 81 ldd r30, Y+1 ; 0x01 2f572: fa 81 ldd r31, Y+2 ; 0x02 2f574: e7 5c subi r30, 0xC7 ; 199 2f576: f9 4f sbci r31, 0xF9 ; 249 2f578: 21 e0 ldi r18, 0x01 ; 1 2f57a: 20 83 st Z, r18 // Move from minimum #ifdef TMC2130 float dist = - axis_home_dir * 0.01f * tmc2130_home_fsteps[axis]; #else //TMC2130 float dist = - axis_home_dir * 0.01f * 64; 2f57c: 8c 81 ldd r24, Y+4 ; 0x04 2f57e: 99 27 eor r25, r25 2f580: 81 95 neg r24 2f582: 0c f4 brge .+2 ; 0x2f586 2f584: 90 95 com r25 2f586: bc 01 movw r22, r24 2f588: 07 2e mov r0, r23 2f58a: 00 0c add r0, r0 2f58c: 88 0b sbc r24, r24 2f58e: 99 0b sbc r25, r25 2f590: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2f594: 2a e0 ldi r18, 0x0A ; 10 2f596: 37 ed ldi r19, 0xD7 ; 215 2f598: 43 e2 ldi r20, 0x23 ; 35 2f59a: 5c e3 ldi r21, 0x3C ; 60 2f59c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f5a0: 20 e0 ldi r18, 0x00 ; 0 2f5a2: 30 e0 ldi r19, 0x00 ; 0 2f5a4: 40 e8 ldi r20, 0x80 ; 128 2f5a6: 52 e4 ldi r21, 0x42 ; 66 2f5a8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f5ac: 4b 01 movw r8, r22 2f5ae: 5c 01 movw r10, r24 #endif //TMC2130 current_position[axis] -= dist; 2f5b0: ac 01 movw r20, r24 2f5b2: 9b 01 movw r18, r22 2f5b4: d1 01 movw r26, r2 2f5b6: 6d 91 ld r22, X+ 2f5b8: 7d 91 ld r23, X+ 2f5ba: 8d 91 ld r24, X+ 2f5bc: 9c 91 ld r25, X 2f5be: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2f5c2: f1 01 movw r30, r2 2f5c4: 60 83 st Z, r22 2f5c6: 71 83 std Z+1, r23 ; 0x01 2f5c8: 82 83 std Z+2, r24 ; 0x02 2f5ca: 93 83 std Z+3, r25 ; 0x03 plan_set_position_curposXYZE(); 2f5cc: 0f 94 41 4b call 0x29682 ; 0x29682 current_position[axis] += dist; 2f5d0: d1 01 movw r26, r2 2f5d2: 2d 91 ld r18, X+ 2f5d4: 3d 91 ld r19, X+ 2f5d6: 4d 91 ld r20, X+ 2f5d8: 5c 91 ld r21, X 2f5da: c5 01 movw r24, r10 2f5dc: b4 01 movw r22, r8 2f5de: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2f5e2: f1 01 movw r30, r2 2f5e4: 60 83 st Z, r22 2f5e6: 71 83 std Z+1, r23 ; 0x01 2f5e8: 82 83 std Z+2, r24 ; 0x02 2f5ea: 93 83 std Z+3, r25 ; 0x03 destination[axis] = current_position[axis]; 2f5ec: aa 85 ldd r26, Y+10 ; 0x0a 2f5ee: bb 85 ldd r27, Y+11 ; 0x0b 2f5f0: 6d 93 st X+, r22 2f5f2: 7d 93 st X+, r23 2f5f4: 8d 93 st X+, r24 2f5f6: 9c 93 st X, r25 2f5f8: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(0.5f*feedrate_mm_s); 2f5fa: 20 e0 ldi r18, 0x00 ; 0 2f5fc: 30 e0 ldi r19, 0x00 ; 0 2f5fe: 40 e0 ldi r20, 0x00 ; 0 2f600: 5f e3 ldi r21, 0x3F ; 63 2f602: c7 01 movw r24, r14 2f604: b6 01 movw r22, r12 2f606: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f60a: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f60e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 feedrate = 0.0; 2f612: 10 92 7a 02 sts 0x027A, r1 ; 0x80027a 2f616: 10 92 7b 02 sts 0x027B, r1 ; 0x80027b 2f61a: 10 92 7c 02 sts 0x027C, r1 ; 0x80027c 2f61e: 10 92 7d 02 sts 0x027D, r1 ; 0x80027d 2f622: 2d 81 ldd r18, Y+5 ; 0x05 2f624: 20 93 77 02 sts 0x0277, r18 ; 0x800277 <_ZL14check_endstops.lto_priv.387> #ifdef TMC2130 FORCE_HIGH_POWER_END; #endif } enable_endstops(endstops_enabled); } 2f628: 2b 96 adiw r28, 0x0b ; 11 2f62a: 0f b6 in r0, 0x3f ; 63 2f62c: f8 94 cli 2f62e: de bf out 0x3e, r29 ; 62 2f630: 0f be out 0x3f, r0 ; 63 2f632: cd bf out 0x3d, r28 ; 61 2f634: df 91 pop r29 2f636: cf 91 pop r28 2f638: 1f 91 pop r17 2f63a: 0f 91 pop r16 2f63c: ff 90 pop r15 2f63e: ef 90 pop r14 2f640: df 90 pop r13 2f642: cf 90 pop r12 2f644: bf 90 pop r11 2f646: af 90 pop r10 2f648: 9f 90 pop r9 2f64a: 8f 90 pop r8 2f64c: 7f 90 pop r7 2f64e: 6f 90 pop r6 2f650: 5f 90 pop r5 2f652: 4f 90 pop r4 2f654: 3f 90 pop r3 2f656: 2f 90 pop r2 2f658: 08 95 ret #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); DEFINE_PGM_READ_ANY(signed char, byte); 2f65a: eb e1 ldi r30, 0x1B ; 27 2f65c: fd e9 ldi r31, 0x9D ; 157 2f65e: b4 91 lpm r27, Z 2f660: b9 83 std Y+1, r27 ; 0x01 { #ifdef TMC2130 FORCE_HIGH_POWER_START; #endif int axis_home_dir = home_dir(axis); current_position[axis] = 0; 2f662: 10 92 69 12 sts 0x1269, r1 ; 0x801269 2f666: 10 92 6a 12 sts 0x126A, r1 ; 0x80126a 2f66a: 10 92 6b 12 sts 0x126B, r1 ; 0x80126b 2f66e: 10 92 6c 12 sts 0x126C, r1 ; 0x80126c plan_set_position_curposXYZE(); 2f672: 0f 94 41 4b call 0x29682 ; 0x29682 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); 2f676: e5 e1 ldi r30, 0x15 ; 21 2f678: fd e9 ldi r31, 0x9D ; 157 2f67a: 85 90 lpm r8, Z+ 2f67c: 95 90 lpm r9, Z+ 2f67e: a5 90 lpm r10, Z+ 2f680: b4 90 lpm r11, Z FORCE_HIGH_POWER_START; #endif int axis_home_dir = home_dir(axis); current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = 1.5 * max_length(axis) * axis_home_dir; 2f682: e9 81 ldd r30, Y+1 ; 0x01 2f684: 6e 2f mov r22, r30 2f686: ee 0f add r30, r30 2f688: 77 0b sbc r23, r23 2f68a: 88 0b sbc r24, r24 2f68c: 99 0b sbc r25, r25 2f68e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2f692: 6b 01 movw r12, r22 2f694: 7c 01 movw r14, r24 2f696: 20 e0 ldi r18, 0x00 ; 0 2f698: 30 e0 ldi r19, 0x00 ; 0 2f69a: 40 ec ldi r20, 0xC0 ; 192 2f69c: 5f e3 ldi r21, 0x3F ; 63 2f69e: c5 01 movw r24, r10 2f6a0: b4 01 movw r22, r8 2f6a2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f6a6: a7 01 movw r20, r14 2f6a8: 96 01 movw r18, r12 2f6aa: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f6ae: 60 93 31 06 sts 0x0631, r22 ; 0x800631 2f6b2: 70 93 32 06 sts 0x0632, r23 ; 0x800632 2f6b6: 80 93 33 06 sts 0x0633, r24 ; 0x800633 2f6ba: 90 93 34 06 sts 0x0634, r25 ; 0x800634 feedrate = homing_feedrate[axis]; 2f6be: 80 e0 ldi r24, 0x00 ; 0 2f6c0: 90 e0 ldi r25, 0x00 ; 0 2f6c2: a8 e4 ldi r26, 0x48 ; 72 2f6c4: b4 e4 ldi r27, 0x44 ; 68 2f6c6: 80 93 7a 02 sts 0x027A, r24 ; 0x80027a 2f6ca: 90 93 7b 02 sts 0x027B, r25 ; 0x80027b 2f6ce: a0 93 7c 02 sts 0x027C, r26 ; 0x80027c 2f6d2: b0 93 7d 02 sts 0x027D, r27 ; 0x80027d float feedrate_mm_s = get_feedrate_mm_s(feedrate); 2f6d6: bc 01 movw r22, r24 2f6d8: cd 01 movw r24, r26 2f6da: 0e 94 45 65 call 0xca8a ; 0xca8a 2f6de: 4b 01 movw r8, r22 2f6e0: 5c 01 movw r10, r24 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f6e2: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f6e6: 0f 94 fb 1a call 0x235f6 ; 0x235f6 #ifdef TMC2130 check_Z_crash(); #endif //TMC2130 current_position[axis] = 0; 2f6ea: 10 92 69 12 sts 0x1269, r1 ; 0x801269 2f6ee: 10 92 6a 12 sts 0x126A, r1 ; 0x80126a 2f6f2: 10 92 6b 12 sts 0x126B, r1 ; 0x80126b 2f6f6: 10 92 6c 12 sts 0x126C, r1 ; 0x80126c plan_set_position_curposXYZE(); 2f6fa: 0f 94 41 4b call 0x29682 ; 0x29682 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); 2f6fe: 09 e0 ldi r16, 0x09 ; 9 2f700: 1d e9 ldi r17, 0x9D ; 157 2f702: f8 01 movw r30, r16 2f704: 65 91 lpm r22, Z+ 2f706: 75 91 lpm r23, Z+ 2f708: 85 91 lpm r24, Z+ 2f70a: 94 91 lpm r25, Z #ifdef TMC2130 check_Z_crash(); #endif //TMC2130 current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = -home_retract_mm(axis) * axis_home_dir; 2f70c: 90 58 subi r25, 0x80 ; 128 2f70e: a7 01 movw r20, r14 2f710: 96 01 movw r18, r12 2f712: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f716: 60 93 31 06 sts 0x0631, r22 ; 0x800631 2f71a: 70 93 32 06 sts 0x0632, r23 ; 0x800632 2f71e: 80 93 33 06 sts 0x0633, r24 ; 0x800633 2f722: 90 93 34 06 sts 0x0634, r25 ; 0x800634 plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f726: c5 01 movw r24, r10 2f728: b4 01 movw r22, r8 2f72a: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f72e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } DEFINE_PGM_READ_ANY(float, float); 2f732: f8 01 movw r30, r16 2f734: 65 91 lpm r22, Z+ 2f736: 75 91 lpm r23, Z+ 2f738: 85 91 lpm r24, Z+ 2f73a: 94 91 lpm r25, Z current_position[axis] = 0; plan_set_position_curposXYZE(); destination[axis] = -home_retract_mm(axis) * axis_home_dir; plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); destination[axis] = 2*home_retract_mm(axis) * axis_home_dir; 2f73c: 9b 01 movw r18, r22 2f73e: ac 01 movw r20, r24 2f740: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2f744: a7 01 movw r20, r14 2f746: 96 01 movw r18, r12 2f748: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 2f74c: 60 93 31 06 sts 0x0631, r22 ; 0x800631 2f750: 70 93 32 06 sts 0x0632, r23 ; 0x800632 2f754: 80 93 33 06 sts 0x0633, r24 ; 0x800633 2f758: 90 93 34 06 sts 0x0634, r25 ; 0x800634 feedrate = homing_feedrate[axis] / 2; 2f75c: 80 e0 ldi r24, 0x00 ; 0 2f75e: 90 e0 ldi r25, 0x00 ; 0 2f760: a8 ec ldi r26, 0xC8 ; 200 2f762: b3 e4 ldi r27, 0x43 ; 67 2f764: 80 93 7a 02 sts 0x027A, r24 ; 0x80027a 2f768: 90 93 7b 02 sts 0x027B, r25 ; 0x80027b 2f76c: a0 93 7c 02 sts 0x027C, r26 ; 0x80027c 2f770: b0 93 7d 02 sts 0x027D, r27 ; 0x80027d feedrate_mm_s = get_feedrate_mm_s(feedrate); 2f774: bc 01 movw r22, r24 2f776: cd 01 movw r24, r26 2f778: 0e 94 45 65 call 0xca8a ; 0xca8a plan_buffer_line_destinationXYZE(feedrate_mm_s); 2f77c: 0f 94 4e 4c call 0x2989c ; 0x2989c st_synchronize(); 2f780: 0f 94 fb 1a call 0x235f6 ; 0x235f6 #ifdef TMC2130 check_Z_crash(); #endif //TMC2130 axis_is_at_home(axis); 2f784: 82 e0 ldi r24, 0x02 ; 2 2f786: 0e 94 8f 65 call 0xcb1e ; 0xcb1e destination[axis] = current_position[axis]; 2f78a: 80 91 69 12 lds r24, 0x1269 ; 0x801269 2f78e: 90 91 6a 12 lds r25, 0x126A ; 0x80126a 2f792: a0 91 6b 12 lds r26, 0x126B ; 0x80126b 2f796: b0 91 6c 12 lds r27, 0x126C ; 0x80126c 2f79a: 80 93 31 06 sts 0x0631, r24 ; 0x800631 2f79e: 90 93 32 06 sts 0x0632, r25 ; 0x800632 2f7a2: a0 93 33 06 sts 0x0633, r26 ; 0x800633 2f7a6: b0 93 34 06 sts 0x0634, r27 ; 0x800634 feedrate = 0.0; 2f7aa: 10 92 7a 02 sts 0x027A, r1 ; 0x80027a 2f7ae: 10 92 7b 02 sts 0x027B, r1 ; 0x80027b 2f7b2: 10 92 7c 02 sts 0x027C, r1 ; 0x80027c 2f7b6: 10 92 7d 02 sts 0x027D, r1 ; 0x80027d endstops_hit_on_purpose(); 2f7ba: 0f 94 a4 25 call 0x24b48 ; 0x24b48 axis_known_position[axis] = true; 2f7be: f1 e0 ldi r31, 0x01 ; 1 2f7c0: f0 93 3b 06 sts 0x063B, r31 ; 0x80063b 2f7c4: 2e cf rjmp .-420 ; 0x2f622 0002f7c6 : #ifdef MESH_BED_LEVELING mesh_bed_leveling mbl; void mesh_bed_leveling::reset() { active = 0; 2f7c6: 10 92 09 13 sts 0x1309, r1 ; 0x801309 memset(z_values, 0, sizeof(z_values)); 2f7ca: ea e0 ldi r30, 0x0A ; 10 2f7cc: f3 e1 ldi r31, 0x13 ; 19 2f7ce: 84 ec ldi r24, 0xC4 ; 196 2f7d0: df 01 movw r26, r30 2f7d2: 1d 92 st X+, r1 2f7d4: 8a 95 dec r24 2f7d6: e9 f7 brne .-6 ; 0x2f7d2 } 2f7d8: 08 95 ret 0002f7da : plan_set_z_position(current_position[Z_AXIS]); } // At the current position, find the Z stop. bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, int 2f7da: 2f 92 push r2 2f7dc: 3f 92 push r3 2f7de: 4f 92 push r4 2f7e0: 5f 92 push r5 2f7e2: 6f 92 push r6 2f7e4: 7f 92 push r7 2f7e6: 8f 92 push r8 2f7e8: 9f 92 push r9 2f7ea: af 92 push r10 2f7ec: bf 92 push r11 2f7ee: cf 92 push r12 2f7f0: df 92 push r13 2f7f2: ef 92 push r14 2f7f4: ff 92 push r15 2f7f6: 0f 93 push r16 2f7f8: 1f 93 push r17 2f7fa: cf 93 push r28 2f7fc: df 93 push r29 2f7fe: 00 d0 rcall .+0 ; 0x2f800 2f800: cd b7 in r28, 0x3d ; 61 2f802: de b7 in r29, 0x3e ; 62 2f804: 4b 01 movw r8, r22 2f806: 5c 01 movw r10, r24 2f808: 04 2f mov r16, r20 verbosity_level #endif //SUPPORT_VERBOSITY ) { bool high_deviation_occured = false; bedPWMDisabled = 1; 2f80a: 81 e0 ldi r24, 0x01 ; 1 2f80c: 80 93 28 06 sts 0x0628, r24 ; 0x800628 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 2f810: 20 91 77 02 lds r18, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> 2f814: 29 83 std Y+1, r18 ; 0x01 check_endstops = check; 2f816: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> //printf_P(PSTR("Min. Z: %f\n"), minimum_z); #ifdef SUPPORT_VERBOSITY if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z"); #endif // SUPPORT_VERBOSITY bool endstops_enabled = enable_endstops(true); bool endstop_z_enabled = enable_z_endstop(false); 2f81a: 80 e0 ldi r24, 0x00 ; 0 2f81c: 0f 94 88 25 call 0x24b10 ; 0x24b10 2f820: 18 2f mov r17, r24 float z = 0.f; endstop_z_hit_on_purpose(); 2f822: 0f 94 96 25 call 0x24b2c ; 0x24b2c // move down until you find the bed current_position[Z_AXIS] = minimum_z; 2f826: 80 92 69 12 sts 0x1269, r8 ; 0x801269 2f82a: 90 92 6a 12 sts 0x126A, r9 ; 0x80126a 2f82e: a0 92 6b 12 sts 0x126B, r10 ; 0x80126b 2f832: b0 92 6c 12 sts 0x126C, r11 ; 0x80126c go_to_current(homing_feedrate[Z_AXIS]/60); 2f836: 65 e5 ldi r22, 0x55 ; 85 2f838: 75 e5 ldi r23, 0x55 ; 85 2f83a: 85 e5 ldi r24, 0x55 ; 85 2f83c: 91 e4 ldi r25, 0x41 ; 65 2f83e: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // we have to let the planner know where we are right now as it is not where we said to go. update_current_position_z(); 2f842: 0e 94 f3 5e call 0xbde6 ; 0xbde6 if (! endstop_z_hit_on_purpose()) 2f846: 0f 94 96 25 call 0x24b2c ; 0x24b2c 2f84a: 8b 83 std Y+3, r24 ; 0x03 2f84c: 88 23 and r24, r24 2f84e: 09 f4 brne .+2 ; 0x2f852 2f850: eb c0 rjmp .+470 ; 0x2fa28 { //printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; //crash Z detected } #endif //TMC2130 for (uint8_t i = 0; i < n_iter; ++ i) 2f852: 1a 82 std Y+2, r1 ; 0x02 #ifdef SUPPORT_VERBOSITY if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z"); #endif // SUPPORT_VERBOSITY bool endstops_enabled = enable_endstops(true); bool endstop_z_enabled = enable_z_endstop(false); float z = 0.f; 2f854: c1 2c mov r12, r1 2f856: d1 2c mov r13, r1 2f858: 76 01 movw r14, r12 #ifdef SUPPORT_VERBOSITY verbosity_level #endif //SUPPORT_VERBOSITY ) { bool high_deviation_occured = false; 2f85a: 31 2c mov r3, r1 { //printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; //crash Z detected } #endif //TMC2130 for (uint8_t i = 0; i < n_iter; ++ i) 2f85c: 8a 81 ldd r24, Y+2 ; 0x02 2f85e: 80 17 cp r24, r16 2f860: 08 f0 brcs .+2 ; 0x2f864 2f862: a4 c0 rjmp .+328 ; 0x2f9ac { current_position[Z_AXIS] += high_deviation_occured ? 0.5 : 0.2; 2f864: 60 91 69 12 lds r22, 0x1269 ; 0x801269 2f868: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 2f86c: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 2f870: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 2f874: 20 e0 ldi r18, 0x00 ; 0 2f876: 30 e0 ldi r19, 0x00 ; 0 2f878: 40 e0 ldi r20, 0x00 ; 0 2f87a: 5f e3 ldi r21, 0x3F ; 63 2f87c: 31 10 cpse r3, r1 2f87e: 04 c0 rjmp .+8 ; 0x2f888 2f880: 2d ec ldi r18, 0xCD ; 205 2f882: 3c ec ldi r19, 0xCC ; 204 2f884: 4c e4 ldi r20, 0x4C ; 76 2f886: 5e e3 ldi r21, 0x3E ; 62 2f888: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2f88c: 2b 01 movw r4, r22 2f88e: 3c 01 movw r6, r24 2f890: 40 92 69 12 sts 0x1269, r4 ; 0x801269 2f894: 50 92 6a 12 sts 0x126A, r5 ; 0x80126a 2f898: 60 92 6b 12 sts 0x126B, r6 ; 0x80126b 2f89c: 70 92 6c 12 sts 0x126C, r7 ; 0x80126c float z_bckp = current_position[Z_AXIS]; go_to_current(homing_feedrate[Z_AXIS]/60); 2f8a0: 65 e5 ldi r22, 0x55 ; 85 2f8a2: 75 e5 ldi r23, 0x55 ; 85 2f8a4: 85 e5 ldi r24, 0x55 ; 85 2f8a6: 91 e4 ldi r25, 0x41 ; 65 2f8a8: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // Move back down slowly to find bed. current_position[Z_AXIS] = minimum_z; 2f8ac: 80 92 69 12 sts 0x1269, r8 ; 0x801269 2f8b0: 90 92 6a 12 sts 0x126A, r9 ; 0x80126a 2f8b4: a0 92 6b 12 sts 0x126B, r10 ; 0x80126b 2f8b8: b0 92 6c 12 sts 0x126C, r11 ; 0x80126c //printf_P(PSTR("init Z = %f, min_z = %f, i = %d\n"), z_bckp, minimum_z, i); go_to_current(homing_feedrate[Z_AXIS]/(4*60)); 2f8bc: 65 e5 ldi r22, 0x55 ; 85 2f8be: 75 e5 ldi r23, 0x55 ; 85 2f8c0: 85 e5 ldi r24, 0x55 ; 85 2f8c2: 90 e4 ldi r25, 0x40 ; 64 2f8c4: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // we have to let the planner know where we are right now as it is not where we said to go. update_current_position_z(); 2f8c8: 0e 94 f3 5e call 0xbde6 ; 0xbde6 //printf_P(PSTR("Zs: %f, Z: %f, delta Z: %f"), z_bckp, current_position[Z_AXIS], (z_bckp - current_position[Z_AXIS])); if (fabs(current_position[Z_AXIS] - z_bckp) < 0.025) { 2f8cc: a3 01 movw r20, r6 2f8ce: 92 01 movw r18, r4 2f8d0: 60 91 69 12 lds r22, 0x1269 ; 0x801269 2f8d4: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 2f8d8: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 2f8dc: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 2f8e0: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2f8e4: 9f 77 andi r25, 0x7F ; 127 2f8e6: 2d ec ldi r18, 0xCD ; 205 2f8e8: 3c ec ldi r19, 0xCC ; 204 2f8ea: 4c ec ldi r20, 0xCC ; 204 2f8ec: 5c e3 ldi r21, 0x3C ; 60 2f8ee: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2f8f2: 87 ff sbrs r24, 7 2f8f4: 16 c0 rjmp .+44 ; 0x2f922 //printf_P(PSTR("PINDA triggered immediately, move Z higher and repeat measurement\n")); raise_z(0.5); 2f8f6: 60 e0 ldi r22, 0x00 ; 0 2f8f8: 70 e0 ldi r23, 0x00 ; 0 2f8fa: 80 e0 ldi r24, 0x00 ; 0 2f8fc: 9f e3 ldi r25, 0x3F ; 63 2f8fe: 0e 94 94 6c call 0xd928 ; 0xd928 current_position[Z_AXIS] = minimum_z; 2f902: 80 92 69 12 sts 0x1269, r8 ; 0x801269 2f906: 90 92 6a 12 sts 0x126A, r9 ; 0x80126a 2f90a: a0 92 6b 12 sts 0x126B, r10 ; 0x80126b 2f90e: b0 92 6c 12 sts 0x126C, r11 ; 0x80126c go_to_current(homing_feedrate[Z_AXIS]/(4*60)); 2f912: 65 e5 ldi r22, 0x55 ; 85 2f914: 75 e5 ldi r23, 0x55 ; 85 2f916: 85 e5 ldi r24, 0x55 ; 85 2f918: 90 e4 ldi r25, 0x40 ; 64 2f91a: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec // we have to let the planner know where we are right now as it is not where we said to go. update_current_position_z(); 2f91e: 0e 94 f3 5e call 0xbde6 ; 0xbde6 } if (!endstop_z_hit_on_purpose()) 2f922: 0f 94 96 25 call 0x24b2c ; 0x24b2c 2f926: 28 2e mov r2, r24 2f928: 88 23 and r24, r24 2f92a: 09 f4 brne .+2 ; 0x2f92e 2f92c: 7d c0 rjmp .+250 ; 0x2fa28 2f92e: 40 90 69 12 lds r4, 0x1269 ; 0x801269 2f932: 50 90 6a 12 lds r5, 0x126A ; 0x80126a 2f936: 60 90 6b 12 lds r6, 0x126B ; 0x80126b 2f93a: 70 90 6c 12 lds r7, 0x126C ; 0x80126c } #endif //TMC2130 // SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: "); // MYSERIAL.print(current_position[Z_AXIS], 5); // SERIAL_ECHOLNPGM(""); float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0; 2f93e: 9a 81 ldd r25, Y+2 ; 0x02 2f940: 99 23 and r25, r25 2f942: d9 f0 breq .+54 ; 0x2f97a 2f944: 69 2f mov r22, r25 2f946: 70 e0 ldi r23, 0x00 ; 0 2f948: 90 e0 ldi r25, 0x00 ; 0 2f94a: 80 e0 ldi r24, 0x00 ; 0 2f94c: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 2f950: 9b 01 movw r18, r22 2f952: ac 01 movw r20, r24 2f954: c7 01 movw r24, r14 2f956: b6 01 movw r22, r12 2f958: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2f95c: 9b 01 movw r18, r22 2f95e: ac 01 movw r20, r24 2f960: c3 01 movw r24, r6 2f962: b2 01 movw r22, r4 2f964: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 2f968: 9f 77 andi r25, 0x7F ; 127 z += current_position[Z_AXIS]; //printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000)); //printf_P(PSTR("Z- measurement deviation from avg value %f um\n"), dz); if (dz > 0.05) { //deviation > 50um 2f96a: 2d ec ldi r18, 0xCD ; 205 2f96c: 3c ec ldi r19, 0xCC ; 204 2f96e: 4c e4 ldi r20, 0x4C ; 76 2f970: 5d e3 ldi r21, 0x3D ; 61 2f972: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2f976: 18 16 cp r1, r24 2f978: 64 f0 brlt .+24 ; 0x2f992 #endif //TMC2130 // SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: "); // MYSERIAL.print(current_position[Z_AXIS], 5); // SERIAL_ECHOLNPGM(""); float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0; z += current_position[Z_AXIS]; 2f97a: a3 01 movw r20, r6 2f97c: 92 01 movw r18, r4 2f97e: c7 01 movw r24, r14 2f980: b6 01 movw r22, r12 2f982: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2f986: 6b 01 movw r12, r22 2f988: 7c 01 movw r14, r24 { //printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; //crash Z detected } #endif //TMC2130 for (uint8_t i = 0; i < n_iter; ++ i) 2f98a: 8a 81 ldd r24, Y+2 ; 0x02 2f98c: 8f 5f subi r24, 0xFF ; 255 2f98e: 8a 83 std Y+2, r24 ; 0x02 2f990: 65 cf rjmp .-310 ; 0x2f85c float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0; z += current_position[Z_AXIS]; //printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000)); //printf_P(PSTR("Z- measurement deviation from avg value %f um\n"), dz); if (dz > 0.05) { //deviation > 50um if (high_deviation_occured == false) { //first occurence may be caused in some cases by mechanic resonance probably especially if printer is placed on unstable surface 2f992: 31 10 cpse r3, r1 2f994: 49 c0 rjmp .+146 ; 0x2fa28 //printf_P(PSTR("high dev. first occurence\n")); delay_keep_alive(500); //damping 2f996: 84 ef ldi r24, 0xF4 ; 244 2f998: 91 e0 ldi r25, 0x01 ; 1 2f99a: 0e 94 8e 8e call 0x11d1c ; 0x11d1c //start measurement from the begining, but this time with higher movements in Z axis which should help to reduce mechanical resonance high_deviation_occured = true; 2f99e: 32 2c mov r3, r2 i = -1; 2f9a0: 2f ef ldi r18, 0xFF ; 255 2f9a2: 2a 83 std Y+2, r18 ; 0x02 z = 0; 2f9a4: c1 2c mov r12, r1 2f9a6: d1 2c mov r13, r1 2f9a8: 76 01 movw r14, r12 2f9aa: ef cf rjmp .-34 ; 0x2f98a } } //printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]); } current_position[Z_AXIS] = z; if (n_iter > 1) 2f9ac: 02 30 cpi r16, 0x02 ; 2 2f9ae: 38 f5 brcc .+78 ; 0x2f9fe goto error; } } //printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]); } current_position[Z_AXIS] = z; 2f9b0: c0 92 69 12 sts 0x1269, r12 ; 0x801269 2f9b4: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 2f9b8: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 2f9bc: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c 2f9c0: 99 81 ldd r25, Y+1 ; 0x01 2f9c2: 90 93 77 02 sts 0x0277, r25 ; 0x800277 <_ZL14check_endstops.lto_priv.387> if (n_iter > 1) current_position[Z_AXIS] /= float(n_iter); enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 2f9c6: 81 2f mov r24, r17 2f9c8: 0f 94 88 25 call 0x24b10 ; 0x24b10 // SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 3"); #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; #endif bedPWMDisabled = 0; 2f9cc: 10 92 28 06 sts 0x0628, r1 ; 0x800628 #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; #endif bedPWMDisabled = 0; return false; } 2f9d0: 8b 81 ldd r24, Y+3 ; 0x03 2f9d2: 0f 90 pop r0 2f9d4: 0f 90 pop r0 2f9d6: 0f 90 pop r0 2f9d8: df 91 pop r29 2f9da: cf 91 pop r28 2f9dc: 1f 91 pop r17 2f9de: 0f 91 pop r16 2f9e0: ff 90 pop r15 2f9e2: ef 90 pop r14 2f9e4: df 90 pop r13 2f9e6: cf 90 pop r12 2f9e8: bf 90 pop r11 2f9ea: af 90 pop r10 2f9ec: 9f 90 pop r9 2f9ee: 8f 90 pop r8 2f9f0: 7f 90 pop r7 2f9f2: 6f 90 pop r6 2f9f4: 5f 90 pop r5 2f9f6: 4f 90 pop r4 2f9f8: 3f 90 pop r3 2f9fa: 2f 90 pop r2 2f9fc: 08 95 ret } //printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]); } current_position[Z_AXIS] = z; if (n_iter > 1) current_position[Z_AXIS] /= float(n_iter); 2f9fe: 60 2f mov r22, r16 2fa00: 70 e0 ldi r23, 0x00 ; 0 2fa02: 90 e0 ldi r25, 0x00 ; 0 2fa04: 80 e0 ldi r24, 0x00 ; 0 2fa06: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 2fa0a: 9b 01 movw r18, r22 2fa0c: ac 01 movw r20, r24 2fa0e: c7 01 movw r24, r14 2fa10: b6 01 movw r22, r12 2fa12: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 2fa16: 60 93 69 12 sts 0x1269, r22 ; 0x801269 2fa1a: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 2fa1e: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 2fa22: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c 2fa26: cc cf rjmp .-104 ; 0x2f9c0 2fa28: 29 81 ldd r18, Y+1 ; 0x01 2fa2a: 20 93 77 02 sts 0x0277, r18 ; 0x800277 <_ZL14check_endstops.lto_priv.387> return true; error: // SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 4"); enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 2fa2e: 81 2f mov r24, r17 2fa30: 0f 94 88 25 call 0x24b10 ; 0x24b10 #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; #endif bedPWMDisabled = 0; 2fa34: 10 92 28 06 sts 0x0628, r1 ; 0x800628 return false; 2fa38: 1b 82 std Y+3, r1 ; 0x03 2fa3a: ca cf rjmp .-108 ; 0x2f9d0 0002fa3c : //! @brief Calibrate XYZ //! @param onlyZ if true, calibrate only Z axis //! @param verbosity_level //! @retval true Succeeded //! @retval false Failed bool gcode_M45(bool onlyZ, int8_t verbosity_level) 2fa3c: 2f 92 push r2 2fa3e: 3f 92 push r3 2fa40: 4f 92 push r4 2fa42: 5f 92 push r5 2fa44: 6f 92 push r6 2fa46: 7f 92 push r7 2fa48: 8f 92 push r8 2fa4a: 9f 92 push r9 2fa4c: af 92 push r10 2fa4e: bf 92 push r11 2fa50: cf 92 push r12 2fa52: df 92 push r13 2fa54: ef 92 push r14 2fa56: ff 92 push r15 2fa58: 0f 93 push r16 2fa5a: 1f 93 push r17 2fa5c: cf 93 push r28 2fa5e: df 93 push r29 2fa60: cd b7 in r28, 0x3d ; 61 2fa62: de b7 in r29, 0x3e ; 62 2fa64: ce 5c subi r28, 0xCE ; 206 2fa66: d1 09 sbc r29, r1 2fa68: 0f b6 in r0, 0x3f ; 63 2fa6a: f8 94 cli 2fa6c: de bf out 0x3e, r29 ; 62 2fa6e: 0f be out 0x3f, r0 ; 63 2fa70: cd bf out 0x3d, r28 ; 61 2fa72: 18 2f mov r17, r24 #endif // TMC2130 FORCE_BL_ON_START; // Only Z calibration? if (!onlyZ) 2fa74: 81 11 cpse r24, r1 2fa76: 04 c0 rjmp .+8 ; 0x2fa80 { disable_heater(); 2fa78: 0f 94 05 11 call 0x2220a ; 0x2220a eeprom_adjust_bed_reset(); //reset bed level correction 2fa7c: 0e 94 df 78 call 0xf1be ; 0xf1be } // Disable the default update procedure of the display. We will do a modal dialog. lcd_update_enable(false); 2fa80: 80 e0 ldi r24, 0x00 ; 0 2fa82: 0e 94 38 70 call 0xe070 ; 0xe070 // Let the planner use the uncorrected coordinates. mbl.reset(); 2fa86: 0f 94 e3 7b call 0x2f7c6 ; 0x2f7c6 // Reset world2machine_rotation_and_skew and world2machine_shift, therefore // the planner will not perform any adjustments in the XY plane. // Wait for the motors to stop and update the current position with the absolute values. world2machine_revert_to_uncorrected(); 2fa8a: 0e 94 2d 62 call 0xc45a ; 0xc45a babystepLoadZ = 0; } void babystep_reset() { babystepLoadZ = 0; 2fa8e: 10 92 27 06 sts 0x0627, r1 ; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1> 2fa92: 10 92 26 06 sts 0x0626, r1 ; 0x800626 <_ZL13babystepLoadZ.lto_priv.452> // Reset the baby step value applied without moving the axes. babystep_reset(); // Mark all axes as in a need for homing. memset(axis_known_position, 0, sizeof(axis_known_position)); 2fa96: e9 e3 ldi r30, 0x39 ; 57 2fa98: f6 e0 ldi r31, 0x06 ; 6 2fa9a: 83 e0 ldi r24, 0x03 ; 3 2fa9c: df 01 movw r26, r30 2fa9e: 1d 92 st X+, r1 2faa0: 8a 95 dec r24 2faa2: e9 f7 brne .-6 ; 0x2fa9e // Home in the XY plane. //set_destination_to_current(); int l_feedmultiply = setup_for_endstop_move(); 2faa4: 81 e0 ldi r24, 0x01 ; 1 2faa6: 0e 94 66 65 call 0xcacc ; 0xcacc 2faaa: c7 55 subi r28, 0x57 ; 87 2faac: df 4f sbci r29, 0xFF ; 255 2faae: 99 83 std Y+1, r25 ; 0x01 2fab0: 88 83 st Y, r24 2fab2: c9 5a subi r28, 0xA9 ; 169 2fab4: d0 40 sbci r29, 0x00 ; 0 lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME)); 2fab6: 81 ec ldi r24, 0xC1 ; 193 2fab8: 91 e6 ldi r25, 0x61 ; 97 2faba: 0e 94 3a 75 call 0xea74 ; 0xea74 2fabe: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 raise_z_above(MESH_HOME_Z_SEARCH); 2fac2: 60 e0 ldi r22, 0x00 ; 0 2fac4: 70 e0 ldi r23, 0x00 ; 0 2fac6: 80 ea ldi r24, 0xA0 ; 160 2fac8: 90 e4 ldi r25, 0x40 ; 64 2faca: 0e 94 f6 6c call 0xd9ec ; 0xd9ec } /**/ void home_xy() { set_destination_to_current(); 2face: 0e 94 ae 66 call 0xcd5c ; 0xcd5c homeaxis(X_AXIS); 2fad2: 80 e0 ldi r24, 0x00 ; 0 2fad4: 0f 94 ae 79 call 0x2f35c ; 0x2f35c homeaxis(Y_AXIS); 2fad8: 81 e0 ldi r24, 0x01 ; 1 2fada: 0f 94 ae 79 call 0x2f35c ; 0x2f35c plan_set_position_curposXYZE(); 2fade: 0f 94 41 4b call 0x29682 ; 0x29682 endstops_hit_on_purpose(); 2fae2: 0f 94 a4 25 call 0x24b48 ; 0x24b48 2fae6: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME)); raise_z_above(MESH_HOME_Z_SEARCH); home_xy(); enable_endstops(false); current_position[X_AXIS] += 5; 2faea: 20 e0 ldi r18, 0x00 ; 0 2faec: 30 e0 ldi r19, 0x00 ; 0 2faee: 40 ea ldi r20, 0xA0 ; 160 2faf0: 50 e4 ldi r21, 0x40 ; 64 2faf2: 60 91 61 12 lds r22, 0x1261 ; 0x801261 2faf6: 70 91 62 12 lds r23, 0x1262 ; 0x801262 2fafa: 80 91 63 12 lds r24, 0x1263 ; 0x801263 2fafe: 90 91 64 12 lds r25, 0x1264 ; 0x801264 2fb02: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2fb06: 60 93 61 12 sts 0x1261, r22 ; 0x801261 2fb0a: 70 93 62 12 sts 0x1262, r23 ; 0x801262 2fb0e: 80 93 63 12 sts 0x1263, r24 ; 0x801263 2fb12: 90 93 64 12 sts 0x1264, r25 ; 0x801264 current_position[Y_AXIS] += 5; 2fb16: 20 e0 ldi r18, 0x00 ; 0 2fb18: 30 e0 ldi r19, 0x00 ; 0 2fb1a: 40 ea ldi r20, 0xA0 ; 160 2fb1c: 50 e4 ldi r21, 0x40 ; 64 2fb1e: 60 91 65 12 lds r22, 0x1265 ; 0x801265 2fb22: 70 91 66 12 lds r23, 0x1266 ; 0x801266 2fb26: 80 91 67 12 lds r24, 0x1267 ; 0x801267 2fb2a: 90 91 68 12 lds r25, 0x1268 ; 0x801268 2fb2e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 2fb32: 60 93 65 12 sts 0x1265, r22 ; 0x801265 2fb36: 70 93 66 12 sts 0x1266, r23 ; 0x801266 2fb3a: 80 93 67 12 sts 0x1267, r24 ; 0x801267 2fb3e: 90 93 68 12 sts 0x1268, r25 ; 0x801268 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 2fb42: 60 e0 ldi r22, 0x00 ; 0 2fb44: 70 e0 ldi r23, 0x00 ; 0 2fb46: 80 ea ldi r24, 0xA0 ; 160 2fb48: 91 e4 ldi r25, 0x41 ; 65 2fb4a: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 2fb4e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // Let the user move the Z axes up to the end stoppers. #ifdef TMC2130 if (calibrate_z_auto()) { #else //TMC2130 if (lcd_calibrate_z_end_stop_manual(onlyZ)) 2fb52: 81 2f mov r24, r17 2fb54: 0e 94 11 fc call 0x1f822 ; 0x1f822 2fb58: e5 96 adiw r28, 0x35 ; 53 2fb5a: 8f af std Y+63, r24 ; 0x3f 2fb5c: e5 97 sbiw r28, 0x35 ; 53 2fb5e: 81 11 cpse r24, r1 2fb60: 04 c0 rjmp .+8 ; 0x2fb6a //! @param verbosity_level //! @retval true Succeeded //! @retval false Failed bool gcode_M45(bool onlyZ, int8_t verbosity_level) { bool final_result = false; 2fb62: e5 96 adiw r28, 0x35 ; 53 2fb64: 1f ae std Y+63, r1 ; 0x3f 2fb66: e5 97 sbiw r28, 0x35 ; 53 2fb68: 6f c4 rjmp .+2270 ; 0x30448 { #else //TMC2130 if (lcd_calibrate_z_end_stop_manual(onlyZ)) { #endif //TMC2130 lcd_show_fullscreen_message_and_wait_P(_T(MSG_CONFIRM_NOZZLE_CLEAN)); 2fb6a: 85 e8 ldi r24, 0x85 ; 133 2fb6c: 91 e6 ldi r25, 0x61 ; 97 2fb6e: 0e 94 3a 75 call 0xea74 ; 0xea74 2fb72: 0e 94 94 ea call 0x1d528 ; 0x1d528 if(onlyZ){ 2fb76: 11 23 and r17, r17 2fb78: 09 f4 brne .+2 ; 0x2fb7c 2fb7a: 41 c4 rjmp .+2178 ; 0x303fe prompt_steel_sheet_on_bed(true); 2fb7c: 81 e0 ldi r24, 0x01 ; 1 2fb7e: 0e 94 60 eb call 0x1d6c0 ; 0x1d6c0 lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1)); 2fb82: 83 e5 ldi r24, 0x53 ; 83 2fb84: 91 e6 ldi r25, 0x61 ; 97 2fb86: 0e 94 3a 75 call 0xea74 ; 0xea74 2fb8a: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_puts_at_P(0,3,_n("1/9")); 2fb8e: 42 ee ldi r20, 0xE2 ; 226 2fb90: 5b e6 ldi r21, 0x6B ; 107 }else{ //lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER)); lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1)); lcd_puts_at_P(0,3,_n("1/4")); 2fb92: 63 e0 ldi r22, 0x03 ; 3 2fb94: 80 e0 ldi r24, 0x00 ; 0 2fb96: 0e 94 07 70 call 0xe00e ; 0xe00e } refresh_cmd_timeout(); 2fb9a: 0e 94 41 65 call 0xca82 ; 0xca82 if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { lcd_wait_for_cool_down(); } #endif //STEEL_SHEET if(!onlyZ) 2fb9e: 11 11 cpse r17, r1 2fba0: 1b c0 rjmp .+54 ; 0x2fbd8 { KEEPALIVE_STATE(PAUSED_FOR_USER); 2fba2: 84 e0 ldi r24, 0x04 ; 4 2fba4: 80 93 78 02 sts 0x0278, r24 ; 0x800278 prompt_steel_sheet_on_bed(false); 2fba8: 80 e0 ldi r24, 0x00 ; 0 2fbaa: 0e 94 60 eb call 0x1d6c0 ; 0x1d6c0 lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER)); 2fbae: 89 e9 ldi r24, 0x99 ; 153 2fbb0: 90 e6 ldi r25, 0x60 ; 96 2fbb2: 0e 94 3a 75 call 0xea74 ; 0xea74 2fbb6: 0e 94 94 ea call 0x1d528 ; 0x1d528 KEEPALIVE_STATE(IN_HANDLER); 2fbba: 82 e0 ldi r24, 0x02 ; 2 2fbbc: 80 93 78 02 sts 0x0278, r24 ; 0x800278 lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1)); 2fbc0: 81 e3 ldi r24, 0x31 ; 49 2fbc2: 91 e6 ldi r25, 0x61 ; 97 2fbc4: 0e 94 3a 75 call 0xea74 ; 0xea74 2fbc8: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_puts_at_P(0,3,_n("1/4")); 2fbcc: 4a ed ldi r20, 0xDA ; 218 2fbce: 5b e6 ldi r21, 0x6B ; 107 2fbd0: 63 e0 ldi r22, 0x03 ; 3 2fbd2: 80 e0 ldi r24, 0x00 ; 0 2fbd4: 0e 94 07 70 call 0xe00e ; 0xe00e return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 2fbd8: 00 91 77 02 lds r16, 0x0277 ; 0x800277 <_ZL14check_endstops.lto_priv.387> check_endstops = check; 2fbdc: 10 92 77 02 sts 0x0277, r1 ; 0x800277 <_ZL14check_endstops.lto_priv.387> } bool endstops_enabled = enable_endstops(false); raise_z(-1); 2fbe0: 60 e0 ldi r22, 0x00 ; 0 2fbe2: 70 e0 ldi r23, 0x00 ; 0 2fbe4: 80 e8 ldi r24, 0x80 ; 128 2fbe6: 9f eb ldi r25, 0xBF ; 191 2fbe8: 0e 94 94 6c call 0xd928 ; 0xd928 // Move the print head close to the bed. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 2fbec: c1 2c mov r12, r1 2fbee: d1 2c mov r13, r1 2fbf0: b0 ea ldi r27, 0xA0 ; 160 2fbf2: eb 2e mov r14, r27 2fbf4: b0 e4 ldi r27, 0x40 ; 64 2fbf6: fb 2e mov r15, r27 2fbf8: c0 92 69 12 sts 0x1269, r12 ; 0x801269 2fbfc: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 2fc00: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 2fc04: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c 2fc08: 81 e0 ldi r24, 0x01 ; 1 2fc0a: 80 93 77 02 sts 0x0277, r24 ; 0x800277 <_ZL14check_endstops.lto_priv.387> enable_endstops(true); #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); #endif //TMC2130 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 2fc0e: 60 e0 ldi r22, 0x00 ; 0 2fc10: 70 e0 ldi r23, 0x00 ; 0 2fc12: 80 ea ldi r24, 0xA0 ; 160 2fc14: 91 e4 ldi r25, 0x41 ; 65 2fc16: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 2fc1a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 2fc1e: 00 93 77 02 sts 0x0277, r16 ; 0x800277 <_ZL14check_endstops.lto_priv.387> #ifdef TMC2130 tmc2130_home_exit(); #endif //TMC2130 enable_endstops(endstops_enabled); if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) && 2fc22: 82 e0 ldi r24, 0x02 ; 2 2fc24: 0f 94 e7 1a call 0x235ce ; 0x235ce 2fc28: 2d ec ldi r18, 0xCD ; 205 2fc2a: 3c ec ldi r19, 0xCC ; 204 2fc2c: 44 ea ldi r20, 0xA4 ; 164 2fc2e: 50 e4 ldi r21, 0x40 ; 64 2fc30: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 2fc34: 18 16 cp r1, r24 2fc36: 0c f4 brge .+2 ; 0x2fc3a 2fc38: eb c3 rjmp .+2006 ; 0x30410 (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD))) 2fc3a: 82 e0 ldi r24, 0x02 ; 2 2fc3c: 0f 94 e7 1a call 0x235ce ; 0x235ce #ifdef TMC2130 tmc2130_home_exit(); #endif //TMC2130 enable_endstops(endstops_enabled); if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) && 2fc40: 23 e3 ldi r18, 0x33 ; 51 2fc42: 33 e3 ldi r19, 0x33 ; 51 2fc44: 4b e9 ldi r20, 0x9B ; 155 2fc46: 50 e4 ldi r21, 0x40 ; 64 2fc48: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 2fc4c: 87 fd sbrc r24, 7 2fc4e: e0 c3 rjmp .+1984 ; 0x30410 (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD))) { if (onlyZ) 2fc50: 11 11 cpse r17, r1 2fc52: e3 c3 rjmp .+1990 ; 0x3041a } } else { // Reset the baby step value and the baby step applied flag. calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 2fc54: 80 e1 ldi r24, 0x10 ; 16 2fc56: 0e 94 f9 d6 call 0x1adf2 ; 0x1adf2 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 2fc5a: 81 ea ldi r24, 0xA1 ; 161 2fc5c: 9d e0 ldi r25, 0x0D ; 13 2fc5e: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 2fc62: bb e0 ldi r27, 0x0B ; 11 2fc64: 8b 9f mul r24, r27 2fc66: c0 01 movw r24, r0 2fc68: 11 24 eor r1, r1 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2fc6a: 70 e0 ldi r23, 0x00 ; 0 2fc6c: 60 e0 ldi r22, 0x00 ; 0 2fc6e: 80 5b subi r24, 0xB0 ; 176 2fc70: 92 4f sbci r25, 0xF2 ; 242 2fc72: 0f 94 22 a4 call 0x34844 ; 0x34844 } BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level, uint8_t &too_far_mask) { // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 2fc76: 0e 94 41 65 call 0xca82 ; 0xca82 // 7x7=49 floats, good for 16 (x,y,z) vectors. float *pts = &mbl.z_values[0][0]; float *vec_x = pts + 2 * 4; float *vec_y = vec_x + 2; float *cntr = vec_y + 2; memset(pts, 0, sizeof(float) * 7 * 7); 2fc7a: ea e0 ldi r30, 0x0A ; 10 2fc7c: f3 e1 ldi r31, 0x13 ; 19 2fc7e: 84 ec ldi r24, 0xC4 ; 196 2fc80: df 01 movw r26, r30 2fc82: 1d 92 st X+, r1 2fc84: 8a 95 dec r24 2fc86: e9 f7 brne .-6 ; 0x2fc82 { #else //NEW_XYZCAL while (iteration < 3) { #endif //NEW_XYZCAL SERIAL_ECHOPGM("Iteration: "); 2fc88: 85 e2 ldi r24, 0x25 ; 37 2fc8a: 9c e9 ldi r25, 0x9C ; 156 2fc8c: 0e 94 c4 7a call 0xf588 ; 0xf588 MYSERIAL.println(int(iteration + 1)); 2fc90: 81 e0 ldi r24, 0x01 ; 1 2fc92: 90 e0 ldi r25, 0x00 ; 0 2fc94: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e MYSERIAL.print(cntr[1], 5); SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY #ifdef MESH_BED_CALIBRATION_SHOW_LCD lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1)); 2fc98: 81 e3 ldi r24, 0x31 ; 49 2fc9a: 91 e6 ldi r25, 0x61 ; 97 2fc9c: 0e 94 3a 75 call 0xea74 ; 0xea74 2fca0: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */ // Collect the rear 2x3 points. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3; 2fca4: c0 92 69 12 sts 0x1269, r12 ; 0x801269 2fca8: d0 92 6a 12 sts 0x126A, r13 ; 0x80126a 2fcac: e0 92 6b 12 sts 0x126B, r14 ; 0x80126b 2fcb0: f0 92 6c 12 sts 0x126C, r15 ; 0x80126c 2fcb4: b2 e0 ldi r27, 0x02 ; 2 2fcb6: e1 96 adiw r28, 0x31 ; 49 2fcb8: bf af std Y+63, r27 ; 0x3f 2fcba: e1 97 sbiw r28, 0x31 ; 49 2fcbc: 20 e0 ldi r18, 0x00 ; 0 2fcbe: 3c e9 ldi r19, 0x9C ; 156 2fcc0: cd 56 subi r28, 0x6D ; 109 2fcc2: df 4f sbci r29, 0xFF ; 255 2fcc4: 39 83 std Y+1, r19 ; 0x01 2fcc6: 28 83 st Y, r18 2fcc8: c3 59 subi r28, 0x93 ; 147 2fcca: d0 40 sbci r29, 0x00 ; 0 2fccc: 49 e0 ldi r20, 0x09 ; 9 2fcce: 53 e1 ldi r21, 0x13 ; 19 2fcd0: cf 56 subi r28, 0x6F ; 111 2fcd2: df 4f sbci r29, 0xFF ; 255 2fcd4: 59 83 std Y+1, r21 ; 0x01 2fcd6: 48 83 st Y, r20 2fcd8: c1 59 subi r28, 0x91 ; 145 2fcda: d0 40 sbci r29, 0x00 ; 0 2fcdc: a0 96 adiw r28, 0x20 ; 32 2fcde: 5f af std Y+63, r21 ; 0x3f 2fce0: 4e af std Y+62, r20 ; 0x3e 2fce2: a0 97 sbiw r28, 0x20 ; 32 2fce4: e0 96 adiw r28, 0x30 ; 48 2fce6: 3f af std Y+63, r19 ; 0x3f 2fce8: 2e af std Y+62, r18 ; 0x3e 2fcea: e0 97 sbiw r28, 0x30 ; 48 /// Retry point scanning if a point with bad data appears. /// Bad data could be cause by "cold" sensor. /// This behavior vanishes after few point scans so retry will help. for (uint8_t retries = 0; retries <= 1; ++retries) { bool retry = false; 2fcec: a7 96 adiw r28, 0x27 ; 39 2fcee: 1f ae std Y+63, r1 ; 0x3f 2fcf0: a7 97 sbiw r28, 0x27 ; 39 for (int k = 0; k < 4; ++k) { 2fcf2: 31 2c mov r3, r1 2fcf4: 21 2c mov r2, r1 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 2fcf6: 0e 94 41 65 call 0xca82 ; 0xca82 #ifdef MESH_BED_CALIBRATION_SHOW_LCD lcd_set_cursor(0, 3); 2fcfa: 63 e0 ldi r22, 0x03 ; 3 2fcfc: 80 e0 ldi r24, 0x00 ; 0 2fcfe: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_printf_P(PSTR("%d/4"),(k+1)); 2fd02: bf ef ldi r27, 0xFF ; 255 2fd04: 2b 1a sub r2, r27 2fd06: 3b 0a sbc r3, r27 2fd08: 3f 92 push r3 2fd0a: 2f 92 push r2 2fd0c: e0 e2 ldi r30, 0x20 ; 32 2fd0e: fc e9 ldi r31, 0x9C ; 156 2fd10: ff 93 push r31 2fd12: ef 93 push r30 2fd14: 0e 94 0b 6f call 0xde16 ; 0xde16 } #endif /* MESH_BED_CALIBRATION_SHOW_LCD */ float *pt = pts + k * 2; // Go up to z_initial. go_to_current(homing_feedrate[Z_AXIS] / 60.f); 2fd18: 65 e5 ldi r22, 0x55 ; 85 2fd1a: 75 e5 ldi r23, 0x55 ; 85 2fd1c: 85 e5 ldi r24, 0x55 ; 85 2fd1e: 91 e4 ldi r25, 0x41 ; 65 2fd20: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec delay_keep_alive(5000); } #endif // SUPPORT_VERBOSITY // Go to the measurement point position. //if (iteration == 0) { current_position[X_AXIS] = pgm_read_float(bed_ref_points_4 + k * 2); 2fd24: e0 96 adiw r28, 0x30 ; 48 2fd26: ee ad ldd r30, Y+62 ; 0x3e 2fd28: ff ad ldd r31, Y+63 ; 0x3f 2fd2a: e0 97 sbiw r28, 0x30 ; 48 2fd2c: 85 91 lpm r24, Z+ 2fd2e: 95 91 lpm r25, Z+ 2fd30: a5 91 lpm r26, Z+ 2fd32: b4 91 lpm r27, Z 2fd34: 80 93 61 12 sts 0x1261, r24 ; 0x801261 2fd38: 90 93 62 12 sts 0x1262, r25 ; 0x801262 2fd3c: a0 93 63 12 sts 0x1263, r26 ; 0x801263 2fd40: b0 93 64 12 sts 0x1264, r27 ; 0x801264 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + k * 2 + 1); 2fd44: e0 96 adiw r28, 0x30 ; 48 2fd46: ee ad ldd r30, Y+62 ; 0x3e 2fd48: ff ad ldd r31, Y+63 ; 0x3f 2fd4a: e0 97 sbiw r28, 0x30 ; 48 2fd4c: 34 96 adiw r30, 0x04 ; 4 2fd4e: 85 91 lpm r24, Z+ 2fd50: 95 91 lpm r25, Z+ 2fd52: a5 91 lpm r26, Z+ 2fd54: b4 91 lpm r27, Z 2fd56: 80 93 65 12 sts 0x1265, r24 ; 0x801265 2fd5a: 90 93 66 12 sts 0x1266, r25 ; 0x801266 2fd5e: a0 93 67 12 sts 0x1267, r26 ; 0x801267 2fd62: b0 93 68 12 sts 0x1268, r27 ; 0x801268 MYSERIAL.print(current_position[Z_AXIS], 5); SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY go_to_current(homing_feedrate[X_AXIS] / 60.f); 2fd66: 60 e0 ldi r22, 0x00 ; 0 2fd68: 70 e0 ldi r23, 0x00 ; 0 2fd6a: 88 e4 ldi r24, 0x48 ; 72 2fd6c: 92 e4 ldi r25, 0x42 ; 66 2fd6e: 0f 94 f6 50 call 0x2a1ec ; 0x2a1ec return pos * 0.01f; } void xyzcal_measure_enter(void) { DBG(_n("xyzcal_measure_enter\n")); 2fd72: 45 e8 ldi r20, 0x85 ; 133 2fd74: 5a e9 ldi r21, 0x9A ; 154 2fd76: 5f 93 push r21 2fd78: 4f 93 push r20 2fd7a: 0f 94 a2 a2 call 0x34544 ; 0x34544 lcd_puts_at_P(4,3,PSTR("Measure center ")); ////MSG_MEASURE_CENTER c=16 2fd7e: 44 e7 ldi r20, 0x74 ; 116 2fd80: 5a e9 ldi r21, 0x9A ; 154 2fd82: 63 e0 ldi r22, 0x03 ; 3 2fd84: 84 e0 ldi r24, 0x04 ; 4 2fd86: 0e 94 07 70 call 0xe00e ; 0xe00e // disable heaters and stop motion before we initialize sm4 disable_heater(); 2fd8a: 0f 94 05 11 call 0x2220a ; 0x2220a st_synchronize(); 2fd8e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // disable incompatible interrupts DISABLE_STEPPER_DRIVER_INTERRUPT(); 2fd92: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 2fd96: 8d 7f andi r24, 0xFD ; 253 2fd98: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> "out __SREG__,__tmp_reg__" "\n\t" : [TEMPREG] "=d" (temp_reg) : [WDTREG] "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), [WDCE_WDE] "n" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))) : "r0" ); 2fd9c: 0f b6 in r0, 0x3f ; 63 2fd9e: f8 94 cli 2fda0: a8 95 wdr 2fda2: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2fda6: 88 61 ori r24, 0x18 ; 24 2fda8: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2fdac: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2fdb0: 0f be out 0x3f, r0 ; 63 #ifdef WATCHDOG wdt_disable(); #endif //WATCHDOG // setup internal callbacks sm4_stop_cb = 0; 2fdb2: 10 92 25 06 sts 0x0625, r1 ; 0x800625 2fdb6: 10 92 24 06 sts 0x0624, r1 ; 0x800624 sm4_update_pos_cb = xyzcal_update_pos; 2fdba: 8c e5 ldi r24, 0x5C ; 92 2fdbc: 9d eb ldi r25, 0xBD ; 189 2fdbe: 90 93 23 06 sts 0x0623, r25 ; 0x800623 2fdc2: 80 93 22 06 sts 0x0622, r24 ; 0x800622 sm4_calc_delay_cb = xyzcal_calc_delay; 2fdc6: a7 e5 ldi r26, 0x57 ; 87 2fdc8: bd eb ldi r27, 0xBD ; 189 2fdca: b0 93 21 06 sts 0x0621, r27 ; 0x800621 2fdce: a0 93 20 06 sts 0x0620, r26 ; 0x800620 const uint16_t xyzcal_point_pattern_10[12] PROGMEM = {0x000, 0x0f0, 0x1f8, 0x3fc, 0x7fe, 0x7fe, 0x7fe, 0x7fe, 0x3fc, 0x1f8, 0x0f0, 0x000}; const uint16_t xyzcal_point_pattern_08[12] PROGMEM = {0x000, 0x000, 0x0f0, 0x1f8, 0x3fc, 0x3fc, 0x3fc, 0x3fc, 0x1f8, 0x0f0, 0x000, 0x000}; bool xyzcal_searchZ(void) { //@size=118 DBG(_n("xyzcal_searchZ x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]); 2fdd2: 00 91 54 06 lds r16, 0x0654 ; 0x800654 2fdd6: 10 91 55 06 lds r17, 0x0655 ; 0x800655 2fdda: 20 91 56 06 lds r18, 0x0656 ; 0x800656 2fdde: 30 91 57 06 lds r19, 0x0657 ; 0x800657 2fde2: 40 91 50 06 lds r20, 0x0650 ; 0x800650 2fde6: 50 91 51 06 lds r21, 0x0651 ; 0x800651 2fdea: 60 91 52 06 lds r22, 0x0652 ; 0x800652 2fdee: 70 91 53 06 lds r23, 0x0653 ; 0x800653 2fdf2: 80 91 4c 06 lds r24, 0x064C ; 0x80064c 2fdf6: 90 91 4d 06 lds r25, 0x064D ; 0x80064d 2fdfa: a0 91 4e 06 lds r26, 0x064E ; 0x80064e 2fdfe: b0 91 4f 06 lds r27, 0x064F ; 0x80064f 2fe02: 3f 93 push r19 2fe04: 2f 93 push r18 2fe06: 1f 93 push r17 2fe08: 0f 93 push r16 2fe0a: 7f 93 push r23 2fe0c: 6f 93 push r22 2fe0e: 5f 93 push r21 2fe10: 4f 93 push r20 2fe12: bf 93 push r27 2fe14: af 93 push r26 2fe16: 9f 93 push r25 2fe18: 8f 93 push r24 2fe1a: e4 e2 ldi r30, 0x24 ; 36 2fe1c: fb e9 ldi r31, 0x9B ; 155 2fe1e: ff 93 push r31 2fe20: ef 93 push r30 2fe22: 0f 94 a2 a2 call 0x34544 ; 0x34544 int16_t x0 = _X; 2fe26: 40 90 4c 06 lds r4, 0x064C ; 0x80064c 2fe2a: 50 90 4d 06 lds r5, 0x064D ; 0x80064d 2fe2e: 60 90 4e 06 lds r6, 0x064E ; 0x80064e 2fe32: 70 90 4f 06 lds r7, 0x064F ; 0x80064f 2fe36: b4 2c mov r11, r4 2fe38: a5 2c mov r10, r5 int16_t y0 = _Y; 2fe3a: 80 91 50 06 lds r24, 0x0650 ; 0x800650 2fe3e: 90 91 51 06 lds r25, 0x0651 ; 0x800651 2fe42: a0 91 52 06 lds r26, 0x0652 ; 0x800652 2fe46: b0 91 53 06 lds r27, 0x0653 ; 0x800653 2fe4a: a6 96 adiw r28, 0x26 ; 38 2fe4c: 8c af std Y+60, r24 ; 0x3c 2fe4e: 9d af std Y+61, r25 ; 0x3d 2fe50: ae af std Y+62, r26 ; 0x3e 2fe52: bf af std Y+63, r27 ; 0x3f 2fe54: a6 97 sbiw r28, 0x26 ; 38 2fe56: a3 96 adiw r28, 0x23 ; 35 2fe58: 9f ac ldd r9, Y+63 ; 0x3f 2fe5a: a3 97 sbiw r28, 0x23 ; 35 2fe5c: a4 96 adiw r28, 0x24 ; 36 2fe5e: 8f ac ldd r8, Y+63 ; 0x3f 2fe60: a4 97 sbiw r28, 0x24 ; 36 int16_t z = _Z; 2fe62: c0 90 54 06 lds r12, 0x0654 ; 0x800654 2fe66: d0 90 55 06 lds r13, 0x0655 ; 0x800655 2fe6a: e0 90 56 06 lds r14, 0x0656 ; 0x800656 2fe6e: f0 90 57 06 lds r15, 0x0657 ; 0x800657 2fe72: 0f b6 in r0, 0x3f ; 63 2fe74: f8 94 cli 2fe76: de bf out 0x3e, r29 ; 62 2fe78: 0f be out 0x3f, r0 ; 63 2fe7a: cd bf out 0x3d, r28 ; 61 // int16_t min_z = -6000; // int16_t dz = 100; while (z > -2300) { //-6mm + 0.25mm 2fe7c: b5 e0 ldi r27, 0x05 ; 5 2fe7e: cb 16 cp r12, r27 2fe80: b7 ef ldi r27, 0xF7 ; 247 2fe82: db 06 cpc r13, r27 2fe84: 0c f4 brge .+2 ; 0x2fe88 2fe86: 3a c3 rjmp .+1652 ; 0x304fc } bool xyzcal_spiral8(int16_t cx, int16_t cy, int16_t z0, int16_t dz, int16_t radius, uint16_t delay_us, int8_t check_pinda, uint16_t* pad) { bool ret = false; uint16_t ad = 0; 2fe88: 1a 82 std Y+2, r1 ; 0x02 2fe8a: 19 82 std Y+1, r1 ; 0x01 if (pad) ad = *pad; //@size=274 DBG(_n("xyzcal_spiral8 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad); 2fe8c: 1f 92 push r1 2fe8e: 1f 92 push r1 2fe90: e3 e0 ldi r30, 0x03 ; 3 2fe92: ef 93 push r30 2fe94: f4 e8 ldi r31, 0x84 ; 132 2fe96: ff 93 push r31 2fe98: 1f 92 push r1 2fe9a: 24 e6 ldi r18, 0x64 ; 100 2fe9c: 2f 93 push r18 2fe9e: df 92 push r13 2fea0: cf 92 push r12 2fea2: 8f 92 push r8 2fea4: 9f 92 push r9 2fea6: af 92 push r10 2fea8: bf 92 push r11 2feaa: 4b e9 ldi r20, 0x9B ; 155 2feac: 5a e9 ldi r21, 0x9A ; 154 2feae: 5f 93 push r21 2feb0: 4f 93 push r20 2feb2: 0f 94 a2 a2 call 0x34544 ; 0x34544 if (!ret && (ad < 720)) 2feb6: 0f b6 in r0, 0x3f ; 63 2feb8: f8 94 cli 2feba: de bf out 0x3e, r29 ; 62 2febc: 0f be out 0x3f, r0 ; 63 2febe: cd bf out 0x3d, r28 ; 61 2fec0: 89 81 ldd r24, Y+1 ; 0x01 2fec2: 9a 81 ldd r25, Y+2 ; 0x02 2fec4: 80 3d cpi r24, 0xD0 ; 208 2fec6: 92 40 sbci r25, 0x02 ; 2 2fec8: 08 f4 brcc .+2 ; 0x2fecc 2feca: e3 c2 rjmp .+1478 ; 0x30492 if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0) ad += 0; if (!ret && (ad < 1440)) 2fecc: 89 81 ldd r24, Y+1 ; 0x01 2fece: 9a 81 ldd r25, Y+2 ; 0x02 2fed0: 80 3a cpi r24, 0xA0 ; 160 2fed2: 95 40 sbci r25, 0x05 ; 5 2fed4: 10 f0 brcs .+4 ; 0x2feda 2fed6: 0d 94 53 8e jmp 0x31ca6 ; 0x31ca6 if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0) 2feda: 9e 01 movw r18, r28 2fedc: 2f 5f subi r18, 0xFF ; 255 2fede: 3f 4f sbci r19, 0xFF ; 255 2fee0: 79 01 movw r14, r18 2fee2: 10 e0 ldi r17, 0x00 ; 0 2fee4: 00 e0 ldi r16, 0x00 ; 0 2fee6: 2c e7 ldi r18, 0x7C ; 124 2fee8: 3c ef ldi r19, 0xFC ; 252 2feea: a6 01 movw r20, r12 2feec: 44 56 subi r20, 0x64 ; 100 2feee: 51 09 sbc r21, r1 2fef0: 69 2d mov r22, r9 2fef2: 78 2d mov r23, r8 2fef4: 8b 2d mov r24, r11 2fef6: 9a 2d mov r25, r10 2fef8: 0f 94 75 5f call 0x2beea ; 0x2beea 2fefc: 88 23 and r24, r24 2fefe: 11 f4 brne .+4 ; 0x2ff04 2ff00: 0d 94 53 8e jmp 0x31ca6 ; 0x31ca6 ad += 720; 2ff04: 89 81 ldd r24, Y+1 ; 0x01 2ff06: 9a 81 ldd r25, Y+2 ; 0x02 2ff08: 80 53 subi r24, 0x30 ; 48 2ff0a: 9d 4f sbci r25, 0xFD ; 253 // int16_t dz = 100; while (z > -2300) { //-6mm + 0.25mm uint16_t ad = 0; if (xyzcal_spiral8(x0, y0, z, 100, 900, 320, 1, &ad)) { //dz=100 radius=900 delay=400 //@size=82 DBG(_n(" ON-SIGNAL at x=%d y=%d z=%d ad=%d\n"), _X, _Y, _Z, ad); 2ff0c: c0 90 54 06 lds r12, 0x0654 ; 0x800654 2ff10: d0 90 55 06 lds r13, 0x0655 ; 0x800655 2ff14: e0 90 56 06 lds r14, 0x0656 ; 0x800656 2ff18: f0 90 57 06 lds r15, 0x0657 ; 0x800657 2ff1c: 00 91 50 06 lds r16, 0x0650 ; 0x800650 2ff20: 10 91 51 06 lds r17, 0x0651 ; 0x800651 2ff24: 20 91 52 06 lds r18, 0x0652 ; 0x800652 2ff28: 30 91 53 06 lds r19, 0x0653 ; 0x800653 2ff2c: 40 91 4c 06 lds r20, 0x064C ; 0x80064c 2ff30: 50 91 4d 06 lds r21, 0x064D ; 0x80064d 2ff34: 60 91 4e 06 lds r22, 0x064E ; 0x80064e 2ff38: 70 91 4f 06 lds r23, 0x064F ; 0x80064f 2ff3c: 9f 93 push r25 2ff3e: 8f 93 push r24 2ff40: df 92 push r13 2ff42: cf 92 push r12 2ff44: 1f 93 push r17 2ff46: 0f 93 push r16 2ff48: 5f 93 push r21 2ff4a: 4f 93 push r20 2ff4c: 80 e0 ldi r24, 0x00 ; 0 2ff4e: 9b e9 ldi r25, 0x9B ; 155 2ff50: 9f 93 push r25 2ff52: 8f 93 push r24 2ff54: 0f 94 a2 a2 call 0x34544 ; 0x34544 /// return to starting XY position /// magic constant, lowers min_z after searchZ to obtain more dense data in scan const pos_i16_t lower_z = 72; xyzcal_lineXYZ_to(x0, y0, _Z - lower_z, 200, 0); 2ff58: 40 91 54 06 lds r20, 0x0654 ; 0x800654 2ff5c: 50 91 55 06 lds r21, 0x0655 ; 0x800655 2ff60: 60 91 56 06 lds r22, 0x0656 ; 0x800656 2ff64: 70 91 57 06 lds r23, 0x0657 ; 0x800657 2ff68: 48 54 subi r20, 0x48 ; 72 2ff6a: 51 09 sbc r21, r1 2ff6c: 00 e0 ldi r16, 0x00 ; 0 2ff6e: 28 ec ldi r18, 0xC8 ; 200 2ff70: 30 e0 ldi r19, 0x00 ; 0 2ff72: a3 96 adiw r28, 0x23 ; 35 2ff74: 6f ad ldd r22, Y+63 ; 0x3f 2ff76: a3 97 sbiw r28, 0x23 ; 35 2ff78: a4 96 adiw r28, 0x24 ; 36 2ff7a: 7f ad ldd r23, Y+63 ; 0x3f 2ff7c: a4 97 sbiw r28, 0x24 ; 36 2ff7e: c2 01 movw r24, r4 2ff80: 0e 94 cf d5 call 0x1ab9e ; 0x1ab9e /// searches for the center of the calibration pin BedSkewOffsetDetectionResultType xyzcal_scan_and_process(){ //@size=44 // DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE); BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND; int16_t x = _X; 2ff84: 20 91 4c 06 lds r18, 0x064C ; 0x80064c 2ff88: 30 91 4d 06 lds r19, 0x064D ; 0x80064d 2ff8c: 40 91 4e 06 lds r20, 0x064E ; 0x80064e 2ff90: 50 91 4f 06 lds r21, 0x064F ; 0x80064f 2ff94: 6e 96 adiw r28, 0x1e ; 30 2ff96: 2c af std Y+60, r18 ; 0x3c 2ff98: 3d af std Y+61, r19 ; 0x3d 2ff9a: 4e af std Y+62, r20 ; 0x3e 2ff9c: 5f af std Y+63, r21 ; 0x3f 2ff9e: 6e 97 sbiw r28, 0x1e ; 30 int16_t y = _Y; 2ffa0: 80 91 50 06 lds r24, 0x0650 ; 0x800650 2ffa4: 90 91 51 06 lds r25, 0x0651 ; 0x800651 2ffa8: a0 91 52 06 lds r26, 0x0652 ; 0x800652 2ffac: b0 91 53 06 lds r27, 0x0653 ; 0x800653 2ffb0: ae 96 adiw r28, 0x2e ; 46 2ffb2: 8c af std Y+60, r24 ; 0x3c 2ffb4: 9d af std Y+61, r25 ; 0x3d 2ffb6: ae af std Y+62, r26 ; 0x3e 2ffb8: bf af std Y+63, r27 ; 0x3f 2ffba: ae 97 sbiw r28, 0x2e ; 46 const int16_t z = _Z; 2ffbc: 20 91 54 06 lds r18, 0x0654 ; 0x800654 2ffc0: 30 91 55 06 lds r19, 0x0655 ; 0x800655 2ffc4: 40 91 56 06 lds r20, 0x0656 ; 0x800656 2ffc8: 50 91 57 06 lds r21, 0x0657 ; 0x800657 2ffcc: e9 96 adiw r28, 0x39 ; 57 2ffce: 2c af std Y+60, r18 ; 0x3c 2ffd0: 3d af std Y+61, r19 ; 0x3d 2ffd2: 4e af std Y+62, r20 ; 0x3e 2ffd4: 5f af std Y+63, r21 ; 0x3f 2ffd6: e9 97 sbiw r28, 0x39 ; 57 2ffd8: ae e5 ldi r26, 0x5E ; 94 2ffda: ba e0 ldi r27, 0x0A ; 10 2ffdc: 0f b6 in r0, 0x3f ; 63 2ffde: f8 94 cli 2ffe0: de bf out 0x3e, r29 ; 62 2ffe2: 0f be out 0x3f, r0 ; 63 2ffe4: cd bf out 0x3d, r28 ; 61 2ffe6: 90 e0 ldi r25, 0x00 ; 0 2ffe8: 80 e0 ldi r24, 0x00 ; 0 uint8_t *matrix32 = (uint8_t *)block_buffer; uint16_t *pattern08 = (uint16_t *)(matrix32 + 32 * 32); uint16_t *pattern10 = (uint16_t *)(pattern08 + 12); for (uint8_t i = 0; i < 12; i++){ pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i)); 2ffea: fc 01 movw r30, r24 2ffec: e5 56 subi r30, 0x65 ; 101 2ffee: f4 46 sbci r31, 0x64 ; 100 2fff0: 25 91 lpm r18, Z+ 2fff2: 34 91 lpm r19, Z 2fff4: 2d 93 st X+, r18 2fff6: 3d 93 st X+, r19 pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i)); 2fff8: fc 01 movw r30, r24 2fffa: ed 57 subi r30, 0x7D ; 125 2fffc: f4 46 sbci r31, 0x64 ; 100 2fffe: 25 91 lpm r18, Z+ 30000: 34 91 lpm r19, Z 30002: 57 96 adiw r26, 0x17 ; 23 30004: 3c 93 st X, r19 30006: 2e 93 st -X, r18 30008: 56 97 sbiw r26, 0x16 ; 22 3000a: 02 96 adiw r24, 0x02 ; 2 uint8_t *matrix32 = (uint8_t *)block_buffer; uint16_t *pattern08 = (uint16_t *)(matrix32 + 32 * 32); uint16_t *pattern10 = (uint16_t *)(pattern08 + 12); for (uint8_t i = 0; i < 12; i++){ 3000c: 88 31 cpi r24, 0x18 ; 24 3000e: 91 05 cpc r25, r1 30010: 61 f7 brne .-40 ; 0x2ffea pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i)); pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i)); } xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32); 30012: e7 96 adiw r28, 0x37 ; 55 30014: 4e ad ldd r20, Y+62 ; 0x3e 30016: 5f ad ldd r21, Y+63 ; 0x3f 30018: e7 97 sbiw r28, 0x37 ; 55 3001a: ac 96 adiw r28, 0x2c ; 44 3001c: 6e ad ldd r22, Y+62 ; 0x3e 3001e: 7f ad ldd r23, Y+63 ; 0x3f 30020: ac 97 sbiw r28, 0x2c ; 44 30022: 6c 96 adiw r28, 0x1c ; 28 30024: 8e ad ldd r24, Y+62 ; 0x3e 30026: 9f ad ldd r25, Y+63 ; 0x3f 30028: 6c 97 sbiw r28, 0x1c ; 28 3002a: 0f 94 b1 60 call 0x2c162 ; 0x2c162 3002e: 2e e5 ldi r18, 0x5E ; 94 30030: 36 e0 ldi r19, 0x06 ; 6 30032: a4 96 adiw r28, 0x24 ; 36 30034: 3f af std Y+63, r19 ; 0x3f 30036: 2e af std Y+62, r18 ; 0x3e 30038: a4 97 sbiw r28, 0x24 ; 36 3003a: 79 01 movw r14, r18 3003c: f0 e2 ldi r31, 0x20 ; 32 3003e: 9f 2e mov r9, r31 /// Prints matrix in hex to debug output (serial line) void print_image(const uint8_t *matrix_32x32){ for (uint8_t y = 0; y < 32; ++y){ const uint16_t idx_y = y * 32; for (uint8_t x = 0; x < 32; ++x){ DBG(_n("%02x"), matrix_32x32[idx_y + x]); 30040: a6 e4 ldi r26, 0x46 ; 70 30042: ca 2e mov r12, r26 30044: ab e9 ldi r26, 0x9B ; 155 30046: da 2e mov r13, r26 } DBG(endl); 30048: 0b e9 ldi r16, 0x9B ; 155 3004a: 1c e9 ldi r17, 0x9C ; 156 for (uint8_t i = 0; i < 12; i++){ pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i)); pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i)); } xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32); 3004c: 57 01 movw r10, r14 3004e: e0 e2 ldi r30, 0x20 ; 32 30050: 8e 2e mov r8, r30 /// Prints matrix in hex to debug output (serial line) void print_image(const uint8_t *matrix_32x32){ for (uint8_t y = 0; y < 32; ++y){ const uint16_t idx_y = y * 32; for (uint8_t x = 0; x < 32; ++x){ DBG(_n("%02x"), matrix_32x32[idx_y + x]); 30052: d5 01 movw r26, r10 30054: 8d 91 ld r24, X+ 30056: 5d 01 movw r10, r26 30058: 1f 92 push r1 3005a: 8f 93 push r24 3005c: df 92 push r13 3005e: cf 92 push r12 30060: 0f 94 a2 a2 call 0x34544 ; 0x34544 30064: 8a 94 dec r8 /// Prints matrix in hex to debug output (serial line) void print_image(const uint8_t *matrix_32x32){ for (uint8_t y = 0; y < 32; ++y){ const uint16_t idx_y = y * 32; for (uint8_t x = 0; x < 32; ++x){ 30066: 0f 90 pop r0 30068: 0f 90 pop r0 3006a: 0f 90 pop r0 3006c: 0f 90 pop r0 3006e: 81 10 cpse r8, r1 30070: f0 cf rjmp .-32 ; 0x30052 DBG(_n("%02x"), matrix_32x32[idx_y + x]); } DBG(endl); 30072: 1f 93 push r17 30074: 0f 93 push r16 30076: 0f 94 a2 a2 call 0x34544 ; 0x34544 3007a: 9a 94 dec r9 3007c: b0 e2 ldi r27, 0x20 ; 32 3007e: eb 0e add r14, r27 30080: f1 1c adc r15, r1 DBG(_n(" [%f, %f][%f] final circle\n"), x, y, r); } /// Prints matrix in hex to debug output (serial line) void print_image(const uint8_t *matrix_32x32){ for (uint8_t y = 0; y < 32; ++y){ 30082: 0f 90 pop r0 30084: 0f 90 pop r0 30086: 91 10 cpse r9, r1 30088: e1 cf rjmp .-62 ; 0x3004c for (uint8_t x = 0; x < 32; ++x){ DBG(_n("%02x"), matrix_32x32[idx_y + x]); } DBG(endl); } DBG(endl); 3008a: 1f 93 push r17 3008c: 0f 93 push r16 3008e: 0f 94 a2 a2 call 0x34544 ; 0x34544 30092: 6e e5 ldi r22, 0x5E ; 94 30094: 7a e0 ldi r23, 0x0A ; 10 30096: 0f 90 pop r0 30098: 0f 90 pop r0 3009a: ee e5 ldi r30, 0x5E ; 94 3009c: f6 e0 ldi r31, 0x06 ; 6 /// magic constants that define normality const int16_t threshold_total = 900; const int threshold_extreme = 50; int16_t mins = 0; int16_t maxs = 0; 3009e: 90 e0 ldi r25, 0x00 ; 0 300a0: 80 e0 ldi r24, 0x00 ; 0 bool check_scan(uint8_t *matrix32){ /// magic constants that define normality const int16_t threshold_total = 900; const int threshold_extreme = 50; int16_t mins = 0; 300a2: 50 e0 ldi r21, 0x00 ; 0 300a4: 40 e0 ldi r20, 0x00 ; 0 int16_t maxs = 0; for (int16_t i = 0; i < 32*32;++i){ if (matrix32[i] == 0) { 300a6: 21 91 ld r18, Z+ 300a8: 21 11 cpse r18, r1 300aa: 67 c4 rjmp .+2254 ; 0x3097a ++mins; 300ac: 4f 5f subi r20, 0xFF ; 255 300ae: 5f 4f sbci r21, 0xFF ; 255 const int threshold_extreme = 50; int16_t mins = 0; int16_t maxs = 0; for (int16_t i = 0; i < 32*32;++i){ 300b0: 6e 17 cp r22, r30 300b2: 7f 07 cpc r23, r31 300b4: c1 f7 brne .-16 ; 0x300a6 ++maxs; } } const int16_t rest = 1024 - mins - maxs; if (mins + maxs > threshold_total 300b6: 9a 01 movw r18, r20 300b8: 28 0f add r18, r24 300ba: 39 1f adc r19, r25 300bc: 25 38 cpi r18, 0x85 ; 133 300be: 33 40 sbci r19, 0x03 ; 3 300c0: a4 f0 brlt .+40 ; 0x300ea && mins > threshold_extreme 300c2: 43 33 cpi r20, 0x33 ; 51 300c4: 51 05 cpc r21, r1 300c6: 8c f0 brlt .+34 ; 0x300ea && maxs > threshold_extreme 300c8: 83 33 cpi r24, 0x33 ; 51 300ca: 91 05 cpc r25, r1 300cc: 74 f0 brlt .+28 ; 0x300ea ++mins; } else if (matrix32[i] == 0xFF){ ++maxs; } } const int16_t rest = 1024 - mins - maxs; 300ce: 20 e0 ldi r18, 0x00 ; 0 300d0: 34 e0 ldi r19, 0x04 ; 4 300d2: 24 1b sub r18, r20 300d4: 35 0b sbc r19, r21 300d6: 28 1b sub r18, r24 300d8: 39 0b sbc r19, r25 if (mins + maxs > threshold_total && mins > threshold_extreme && maxs > threshold_extreme && mins > rest 300da: 24 17 cp r18, r20 300dc: 35 07 cpc r19, r21 300de: 2c f4 brge .+10 ; 0x300ea } xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32); print_image(matrix32); if (!check_scan(matrix32)) return BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED; 300e0: 1d ef ldi r17, 0xFD ; 253 if (mins + maxs > threshold_total && mins > threshold_extreme && maxs > threshold_extreme && mins > rest && maxs > rest) 300e2: 28 17 cp r18, r24 300e4: 39 07 cpc r19, r25 300e6: 0c f4 brge .+2 ; 0x300ea 300e8: 39 c2 rjmp .+1138 ; 0x3055c } /// Takes two patterns and searches them in matrix32 /// \returns best match uint8_t find_patterns(uint8_t *matrix32, uint16_t *pattern08, uint16_t *pattern10, uint8_t &col, uint8_t &row){ uint8_t c08 = 0; 300ea: 66 96 adiw r28, 0x16 ; 22 300ec: 1f ae std Y+63, r1 ; 0x3f 300ee: 66 97 sbiw r28, 0x16 ; 22 uint8_t r08 = 0; 300f0: 62 96 adiw r28, 0x12 ; 18 300f2: 1f ae std Y+63, r1 ; 0x3f 300f4: 62 97 sbiw r28, 0x12 ; 18 uint8_t match08 = 0; uint8_t c10 = 0; 300f6: 22 96 adiw r28, 0x02 ; 2 300f8: 1f ae std Y+63, r1 ; 0x3f 300fa: 22 97 sbiw r28, 0x02 ; 2 uint8_t r10 = 0; 300fc: 19 82 std Y+1, r1 ; 0x01 300fe: ae 01 movw r20, r28 30100: 4f 5a subi r20, 0xAF ; 175 30102: 5f 4f sbci r21, 0xFF ; 255 30104: be 01 movw r22, r28 30106: 6b 5a subi r22, 0xAB ; 171 30108: 7f 4f sbci r23, 0xFF ; 255 3010a: 8e e5 ldi r24, 0x5E ; 94 3010c: 9a e0 ldi r25, 0x0A ; 10 3010e: 0f 94 9a 58 call 0x2b134 ; 0x2b134 30112: 08 2f mov r16, r24 30114: ae 01 movw r20, r28 30116: 4f 5f subi r20, 0xFF ; 255 30118: 5f 4f sbci r21, 0xFF ; 255 3011a: be 01 movw r22, r28 3011c: 6f 5b subi r22, 0xBF ; 191 3011e: 7f 4f sbci r23, 0xFF ; 255 30120: 86 e7 ldi r24, 0x76 ; 118 30122: 9a e0 ldi r25, 0x0A ; 10 30124: 0f 94 9a 58 call 0x2b134 ; 0x2b134 match08 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern08, &c08, &r08); match10 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern10, &c10, &r10); if (match08 > match10){ col = c08; 30128: 66 96 adiw r28, 0x16 ; 22 3012a: 6f ad ldd r22, Y+63 ; 0x3f 3012c: 66 97 sbiw r28, 0x16 ; 22 row = r08; 3012e: 62 96 adiw r28, 0x12 ; 18 30130: 1f ad ldd r17, Y+63 ; 0x3f 30132: 62 97 sbiw r28, 0x12 ; 18 uint8_t match10 = 0; match08 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern08, &c08, &r08); match10 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern10, &c10, &r10); if (match08 > match10){ 30134: 80 17 cp r24, r16 30136: 28 f0 brcs .+10 ; 0x30142 col = c08; row = r08; return match08; } col = c10; 30138: 22 96 adiw r28, 0x02 ; 2 3013a: 6f ad ldd r22, Y+63 ; 0x3f 3013c: 22 97 sbiw r28, 0x02 ; 2 row = r10; 3013e: 19 81 ldd r17, Y+1 ; 0x01 30140: 08 2f mov r16, r24 /// SEARCH FOR BINARY CIRCLE uint8_t uc = 0; uint8_t ur = 0; /// max match = 132, 1/2 good = 66, 2/3 good = 88 if (find_patterns(matrix32, pattern08, pattern10, uc, ur) >= 88){ 30142: 08 35 cpi r16, 0x58 ; 88 30144: 08 f4 brcc .+2 ; 0x30148 30146: 1e c4 rjmp .+2108 ; 0x30984 /// find precise circle /// move to the center of the pattern (+5.5) float xf = uc + 5.5f; 30148: 70 e0 ldi r23, 0x00 ; 0 3014a: 90 e0 ldi r25, 0x00 ; 0 3014c: 80 e0 ldi r24, 0x00 ; 0 3014e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 30152: 20 e0 ldi r18, 0x00 ; 0 30154: 30 e0 ldi r19, 0x00 ; 0 30156: 40 eb ldi r20, 0xB0 ; 176 30158: 50 e4 ldi r21, 0x40 ; 64 3015a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3015e: 2b 01 movw r4, r22 30160: 3c 01 movw r6, r24 30162: 65 96 adiw r28, 0x15 ; 21 30164: 4c ae std Y+60, r4 ; 0x3c 30166: 5d ae std Y+61, r5 ; 0x3d 30168: 6e ae std Y+62, r6 ; 0x3e 3016a: 7f ae std Y+63, r7 ; 0x3f 3016c: 65 97 sbiw r28, 0x15 ; 21 float yf = ur + 5.5f; 3016e: 61 2f mov r22, r17 30170: 70 e0 ldi r23, 0x00 ; 0 30172: 90 e0 ldi r25, 0x00 ; 0 30174: 80 e0 ldi r24, 0x00 ; 0 30176: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 3017a: 20 e0 ldi r18, 0x00 ; 0 3017c: 30 e0 ldi r19, 0x00 ; 0 3017e: 40 eb ldi r20, 0xB0 ; 176 30180: 50 e4 ldi r21, 0x40 ; 64 30182: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30186: 4b 01 movw r8, r22 30188: 5c 01 movw r10, r24 3018a: 25 96 adiw r28, 0x05 ; 5 3018c: 8c ae std Y+60, r8 ; 0x3c 3018e: 9d ae std Y+61, r9 ; 0x3d 30190: ae ae std Y+62, r10 ; 0x3e 30192: bf ae std Y+63, r11 ; 0x3f 30194: 25 97 sbiw r28, 0x05 ; 5 float radius = 4.5f; ///< default radius 30196: 20 e0 ldi r18, 0x00 ; 0 30198: 30 e0 ldi r19, 0x00 ; 0 3019a: 40 e9 ldi r20, 0x90 ; 144 3019c: 50 e4 ldi r21, 0x40 ; 64 3019e: 29 83 std Y+1, r18 ; 0x01 301a0: 3a 83 std Y+2, r19 ; 0x02 301a2: 4b 83 std Y+3, r20 ; 0x03 301a4: 5c 83 std Y+4, r21 ; 0x04 constexpr const uint8_t iterations = 20; dynamic_circle(matrix32, xf, yf, radius, iterations); 301a6: ae 01 movw r20, r28 301a8: 4f 5f subi r20, 0xFF ; 255 301aa: 5f 4f sbci r21, 0xFF ; 255 301ac: be 01 movw r22, r28 301ae: 6f 5b subi r22, 0xBF ; 191 301b0: 7f 4f sbci r23, 0xFF ; 255 301b2: ce 01 movw r24, r28 301b4: 8f 5a subi r24, 0xAF ; 175 301b6: 9f 4f sbci r25, 0xFF ; 255 301b8: 0f 94 f5 5b call 0x2b7ea ; 0x2b7ea if (fabs(xf - (uc + 5.5f)) > 3 || fabs(yf - (ur + 5.5f)) > 3 || fabs(radius - 5) > 3){ 301bc: a3 01 movw r20, r6 301be: 92 01 movw r18, r4 301c0: 65 96 adiw r28, 0x15 ; 21 301c2: 6c ad ldd r22, Y+60 ; 0x3c 301c4: 7d ad ldd r23, Y+61 ; 0x3d 301c6: 8e ad ldd r24, Y+62 ; 0x3e 301c8: 9f ad ldd r25, Y+63 ; 0x3f 301ca: 65 97 sbiw r28, 0x15 ; 21 301cc: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 301d0: 6b 01 movw r12, r22 301d2: 7c 01 movw r14, r24 301d4: 9f 77 andi r25, 0x7F ; 127 301d6: 20 e0 ldi r18, 0x00 ; 0 301d8: 30 e0 ldi r19, 0x00 ; 0 301da: 40 e4 ldi r20, 0x40 ; 64 301dc: 50 e4 ldi r21, 0x40 ; 64 301de: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 301e2: 18 16 cp r1, r24 301e4: 34 f1 brlt .+76 ; 0x30232 301e6: a5 01 movw r20, r10 301e8: 94 01 movw r18, r8 301ea: 25 96 adiw r28, 0x05 ; 5 301ec: 6c ad ldd r22, Y+60 ; 0x3c 301ee: 7d ad ldd r23, Y+61 ; 0x3d 301f0: 8e ad ldd r24, Y+62 ; 0x3e 301f2: 9f ad ldd r25, Y+63 ; 0x3f 301f4: 25 97 sbiw r28, 0x05 ; 5 301f6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 301fa: 9f 77 andi r25, 0x7F ; 127 301fc: 20 e0 ldi r18, 0x00 ; 0 301fe: 30 e0 ldi r19, 0x00 ; 0 30200: 40 e4 ldi r20, 0x40 ; 64 30202: 50 e4 ldi r21, 0x40 ; 64 30204: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 30208: 18 16 cp r1, r24 3020a: 9c f0 brlt .+38 ; 0x30232 3020c: 20 e0 ldi r18, 0x00 ; 0 3020e: 30 e0 ldi r19, 0x00 ; 0 30210: 40 ea ldi r20, 0xA0 ; 160 30212: 50 e4 ldi r21, 0x40 ; 64 30214: 69 81 ldd r22, Y+1 ; 0x01 30216: 7a 81 ldd r23, Y+2 ; 0x02 30218: 8b 81 ldd r24, Y+3 ; 0x03 3021a: 9c 81 ldd r25, Y+4 ; 0x04 3021c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30220: 9f 77 andi r25, 0x7F ; 127 30222: 20 e0 ldi r18, 0x00 ; 0 30224: 30 e0 ldi r19, 0x00 ; 0 30226: 40 e4 ldi r20, 0x40 ; 64 30228: 50 e4 ldi r21, 0x40 ; 64 3022a: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 3022e: 18 16 cp r1, r24 30230: bc f5 brge .+110 ; 0x302a0 //@size=88 DBG(_n(" [%f %f][%f] mm divergence\n"), xf - (uc + 5.5f), yf - (ur + 5.5f), radius - 5); 30232: 20 e0 ldi r18, 0x00 ; 0 30234: 30 e0 ldi r19, 0x00 ; 0 30236: 40 ea ldi r20, 0xA0 ; 160 30238: 50 e4 ldi r21, 0x40 ; 64 3023a: 69 81 ldd r22, Y+1 ; 0x01 3023c: 7a 81 ldd r23, Y+2 ; 0x02 3023e: 8b 81 ldd r24, Y+3 ; 0x03 30240: 9c 81 ldd r25, Y+4 ; 0x04 30242: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30246: 9f 93 push r25 30248: 8f 93 push r24 3024a: 7f 93 push r23 3024c: 6f 93 push r22 3024e: a5 01 movw r20, r10 30250: 94 01 movw r18, r8 30252: 25 96 adiw r28, 0x05 ; 5 30254: 6c ad ldd r22, Y+60 ; 0x3c 30256: 7d ad ldd r23, Y+61 ; 0x3d 30258: 8e ad ldd r24, Y+62 ; 0x3e 3025a: 9f ad ldd r25, Y+63 ; 0x3f 3025c: 25 97 sbiw r28, 0x05 ; 5 3025e: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30262: 9f 93 push r25 30264: 8f 93 push r24 30266: 7f 93 push r23 30268: 6f 93 push r22 3026a: ff 92 push r15 3026c: ef 92 push r14 3026e: df 92 push r13 30270: cf 92 push r12 30272: 87 e6 ldi r24, 0x67 ; 103 30274: 9b e9 ldi r25, 0x9B ; 155 30276: 9f 93 push r25 30278: 8f 93 push r24 3027a: 0f 94 a2 a2 call 0x34544 ; 0x34544 /// dynamic algorithm diverged, use original position instead xf = uc + 5.5f; 3027e: 65 96 adiw r28, 0x15 ; 21 30280: 4c ae std Y+60, r4 ; 0x3c 30282: 5d ae std Y+61, r5 ; 0x3d 30284: 6e ae std Y+62, r6 ; 0x3e 30286: 7f ae std Y+63, r7 ; 0x3f 30288: 65 97 sbiw r28, 0x15 ; 21 yf = ur + 5.5f; 3028a: 25 96 adiw r28, 0x05 ; 5 3028c: 8c ae std Y+60, r8 ; 0x3c 3028e: 9d ae std Y+61, r9 ; 0x3d 30290: ae ae std Y+62, r10 ; 0x3e 30292: bf ae std Y+63, r11 ; 0x3f 30294: 25 97 sbiw r28, 0x05 ; 5 30296: 0f b6 in r0, 0x3f ; 63 30298: f8 94 cli 3029a: de bf out 0x3e, r29 ; 62 3029c: 0f be out 0x3f, r0 ; 63 3029e: cd bf out 0x3d, r28 ; 61 } /// move to the center of area and convert to position xf = (float)x + (xf - 15.5f) * 64; 302a0: 20 e0 ldi r18, 0x00 ; 0 302a2: 30 e0 ldi r19, 0x00 ; 0 302a4: 48 e7 ldi r20, 0x78 ; 120 302a6: 51 e4 ldi r21, 0x41 ; 65 302a8: 65 96 adiw r28, 0x15 ; 21 302aa: 6c ad ldd r22, Y+60 ; 0x3c 302ac: 7d ad ldd r23, Y+61 ; 0x3d 302ae: 8e ad ldd r24, Y+62 ; 0x3e 302b0: 9f ad ldd r25, Y+63 ; 0x3f 302b2: 65 97 sbiw r28, 0x15 ; 21 302b4: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 302b8: 20 e0 ldi r18, 0x00 ; 0 302ba: 30 e0 ldi r19, 0x00 ; 0 302bc: 40 e8 ldi r20, 0x80 ; 128 302be: 52 e4 ldi r21, 0x42 ; 66 302c0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 302c4: 6b 01 movw r12, r22 302c6: 7c 01 movw r14, r24 302c8: 6c 96 adiw r28, 0x1c ; 28 302ca: ae ad ldd r26, Y+62 ; 0x3e 302cc: bf ad ldd r27, Y+63 ; 0x3f 302ce: 6c 97 sbiw r28, 0x1c ; 28 302d0: bd 01 movw r22, r26 302d2: bb 0f add r27, r27 302d4: 88 0b sbc r24, r24 302d6: 99 0b sbc r25, r25 302d8: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 302dc: 9b 01 movw r18, r22 302de: ac 01 movw r20, r24 302e0: c7 01 movw r24, r14 302e2: b6 01 movw r22, r12 302e4: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 302e8: 6b 01 movw r12, r22 302ea: 7c 01 movw r14, r24 302ec: 65 96 adiw r28, 0x15 ; 21 302ee: cc ae std Y+60, r12 ; 0x3c 302f0: dd ae std Y+61, r13 ; 0x3d 302f2: ee ae std Y+62, r14 ; 0x3e 302f4: ff ae std Y+63, r15 ; 0x3f 302f6: 65 97 sbiw r28, 0x15 ; 21 yf = (float)y + (yf - 15.5f) * 64; 302f8: 20 e0 ldi r18, 0x00 ; 0 302fa: 30 e0 ldi r19, 0x00 ; 0 302fc: 48 e7 ldi r20, 0x78 ; 120 302fe: 51 e4 ldi r21, 0x41 ; 65 30300: 25 96 adiw r28, 0x05 ; 5 30302: 6c ad ldd r22, Y+60 ; 0x3c 30304: 7d ad ldd r23, Y+61 ; 0x3d 30306: 8e ad ldd r24, Y+62 ; 0x3e 30308: 9f ad ldd r25, Y+63 ; 0x3f 3030a: 25 97 sbiw r28, 0x05 ; 5 3030c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30310: 20 e0 ldi r18, 0x00 ; 0 30312: 30 e0 ldi r19, 0x00 ; 0 30314: 40 e8 ldi r20, 0x80 ; 128 30316: 52 e4 ldi r21, 0x42 ; 66 30318: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3031c: 4b 01 movw r8, r22 3031e: 5c 01 movw r10, r24 30320: ac 96 adiw r28, 0x2c ; 44 30322: ee ad ldd r30, Y+62 ; 0x3e 30324: ff ad ldd r31, Y+63 ; 0x3f 30326: ac 97 sbiw r28, 0x2c ; 44 30328: bf 01 movw r22, r30 3032a: ff 0f add r31, r31 3032c: 88 0b sbc r24, r24 3032e: 99 0b sbc r25, r25 30330: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 30334: 9b 01 movw r18, r22 30336: ac 01 movw r20, r24 30338: c5 01 movw r24, r10 3033a: b4 01 movw r22, r8 3033c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30340: 25 96 adiw r28, 0x05 ; 5 30342: 6c af std Y+60, r22 ; 0x3c 30344: 7d af std Y+61, r23 ; 0x3d 30346: 8e af std Y+62, r24 ; 0x3e 30348: 9f af std Y+63, r25 ; 0x3f 3034a: 25 97 sbiw r28, 0x05 ; 5 /// converts integer position to millimeters pos_mm_t pos_2_mm(pos_i16_t pos){ return pos * 0.01f; } pos_mm_t pos_2_mm(float pos){ return pos * 0.01f; 3034c: 2a e0 ldi r18, 0x0A ; 10 3034e: 37 ed ldi r19, 0xD7 ; 215 30350: 43 e2 ldi r20, 0x23 ; 35 30352: 5c e3 ldi r21, 0x3C ; 60 30354: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> /// move to the center of area and convert to position xf = (float)x + (xf - 15.5f) * 64; yf = (float)y + (yf - 15.5f) * 64; //@size=114 DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf)); 30358: 9f 93 push r25 3035a: 8f 93 push r24 3035c: 7f 93 push r23 3035e: 6f 93 push r22 /// converts integer position to millimeters pos_mm_t pos_2_mm(pos_i16_t pos){ return pos * 0.01f; } pos_mm_t pos_2_mm(float pos){ return pos * 0.01f; 30360: 2a e0 ldi r18, 0x0A ; 10 30362: 37 ed ldi r19, 0xD7 ; 215 30364: 43 e2 ldi r20, 0x23 ; 35 30366: 5c e3 ldi r21, 0x3C ; 60 30368: c7 01 movw r24, r14 3036a: b6 01 movw r22, r12 3036c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> /// move to the center of area and convert to position xf = (float)x + (xf - 15.5f) * 64; yf = (float)y + (yf - 15.5f) * 64; //@size=114 DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf)); 30370: 9f 93 push r25 30372: 8f 93 push r24 30374: 7f 93 push r23 30376: 6f 93 push r22 30378: 8b e4 ldi r24, 0x4B ; 75 3037a: 9b e9 ldi r25, 0x9B ; 155 3037c: 9f 93 push r25 3037e: 8f 93 push r24 30380: 0f 94 a2 a2 call 0x34544 ; 0x34544 uint16_t round_to_u16(float f){ return (uint16_t)(f + .5f); } int16_t round_to_i16(float f){ return (int16_t)(f + .5f); 30384: 20 e0 ldi r18, 0x00 ; 0 30386: 30 e0 ldi r19, 0x00 ; 0 30388: 40 e0 ldi r20, 0x00 ; 0 3038a: 5f e3 ldi r21, 0x3F ; 63 3038c: 25 96 adiw r28, 0x05 ; 5 3038e: 6c ad ldd r22, Y+60 ; 0x3c 30390: 7d ad ldd r23, Y+61 ; 0x3d 30392: 8e ad ldd r24, Y+62 ; 0x3e 30394: 9f ad ldd r25, Y+63 ; 0x3f 30396: 25 97 sbiw r28, 0x05 ; 5 30398: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3039c: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 303a0: 6b 01 movw r12, r22 303a2: 20 e0 ldi r18, 0x00 ; 0 303a4: 30 e0 ldi r19, 0x00 ; 0 303a6: 40 e0 ldi r20, 0x00 ; 0 303a8: 5f e3 ldi r21, 0x3F ; 63 303aa: 65 96 adiw r28, 0x15 ; 21 303ac: 6c ad ldd r22, Y+60 ; 0x3c 303ae: 7d ad ldd r23, Y+61 ; 0x3d 303b0: 8e ad ldd r24, Y+62 ; 0x3e 303b2: 9f ad ldd r25, Y+63 ; 0x3f 303b4: 65 97 sbiw r28, 0x15 ; 21 303b6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 303ba: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> 303be: cb 01 movw r24, r22 yf = (float)y + (yf - 15.5f) * 64; //@size=114 DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf)); x = round_to_i16(xf); y = round_to_i16(yf); xyzcal_lineXYZ_to(x, y, z, 200, 0); 303c0: 00 e0 ldi r16, 0x00 ; 0 303c2: 28 ec ldi r18, 0xC8 ; 200 303c4: 30 e0 ldi r19, 0x00 ; 0 303c6: e7 96 adiw r28, 0x37 ; 55 303c8: 4e ad ldd r20, Y+62 ; 0x3e 303ca: 5f ad ldd r21, Y+63 ; 0x3f 303cc: e7 97 sbiw r28, 0x37 ; 55 303ce: b6 01 movw r22, r12 303d0: 0e 94 cf d5 call 0x1ab9e ; 0x1ab9e 303d4: 0f b6 in r0, 0x3f ; 63 303d6: f8 94 cli 303d8: de bf out 0x3e, r29 ; 62 303da: 0f be out 0x3f, r0 ; 63 303dc: cd bf out 0x3d, r28 ; 61 ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND; 303de: 10 e0 ldi r17, 0x00 ; 0 303e0: 8e e3 ldi r24, 0x3E ; 62 303e2: 9d e0 ldi r25, 0x0D ; 13 } /// wipe buffer for (uint16_t i = 0; i < sizeof(block_t)*BLOCK_BUFFER_SIZE; i++) matrix32[i] = 0; 303e4: a4 96 adiw r28, 0x24 ; 36 303e6: ae ad ldd r26, Y+62 ; 0x3e 303e8: bf ad ldd r27, Y+63 ; 0x3f 303ea: a4 97 sbiw r28, 0x24 ; 36 303ec: 1d 92 st X+, r1 303ee: a4 96 adiw r28, 0x24 ; 36 303f0: bf af std Y+63, r27 ; 0x3f 303f2: ae af std Y+62, r26 ; 0x3e 303f4: a4 97 sbiw r28, 0x24 ; 36 xyzcal_lineXYZ_to(x, y, z, 200, 0); ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND; } /// wipe buffer for (uint16_t i = 0; i < sizeof(block_t)*BLOCK_BUFFER_SIZE; i++) 303f6: 8a 17 cp r24, r26 303f8: 9b 07 cpc r25, r27 303fa: a1 f7 brne .-24 ; 0x303e4 303fc: af c0 rjmp .+350 ; 0x3055c prompt_steel_sheet_on_bed(true); lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1)); lcd_puts_at_P(0,3,_n("1/9")); }else{ //lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER)); lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1)); 303fe: 81 e3 ldi r24, 0x31 ; 49 30400: 91 e6 ldi r25, 0x61 ; 97 30402: 0e 94 3a 75 call 0xea74 ; 0xea74 30406: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_puts_at_P(0,3,_n("1/4")); 3040a: 4e ed ldi r20, 0xDE ; 222 3040c: 5b e6 ldi r21, 0x6B ; 107 3040e: c1 cb rjmp .-2174 ; 0x2fb92 } } } else { lcd_show_fullscreen_message_and_wait_P(PSTR("Calibration failed! Check the axes and run again.")); 30410: 81 e3 ldi r24, 0x31 ; 49 30412: 9c e9 ldi r25, 0x9C ; 156 // The right and maybe the center point out of reach. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR); else // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); 30414: 0e 94 94 ea call 0x1d528 ; 0x1d528 30418: a4 cb rjmp .-2232 ; 0x2fb62 if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) && (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD))) { if (onlyZ) { clean_up_after_endstop_move(l_feedmultiply); 3041a: c7 55 subi r28, 0x57 ; 87 3041c: df 4f sbci r29, 0xFF ; 255 3041e: 88 81 ld r24, Y 30420: 99 81 ldd r25, Y+1 ; 0x01 30422: c9 5a subi r28, 0xA9 ; 169 30424: d0 40 sbci r29, 0x00 ; 0 30426: 0e 94 4c 65 call 0xca98 ; 0xca98 // Z only calibration. // Load the machine correction matrix world2machine_initialize(); 3042a: 0e 94 c6 60 call 0xc18c ; 0xc18c // and correct the current_position to match the transformed coordinate system. world2machine_update_current(); 3042e: 0e 94 02 5f call 0xbe04 ; 0xbe04 //FIXME bool result = sample_mesh_and_store_reference(); 30432: 0e 94 4a 83 call 0x10694 ; 0x10694 30436: e5 96 adiw r28, 0x35 ; 53 30438: 8f af std Y+63, r24 ; 0x3f 3043a: e5 97 sbiw r28, 0x35 ; 53 if (result) 3043c: 88 23 and r24, r24 3043e: 09 f4 brne .+2 ; 0x30442 30440: 90 cb rjmp .-2272 ; 0x2fb62 { calibration_status_set(CALIBRATION_STATUS_Z); 30442: 84 e0 ldi r24, 0x04 ; 4 30444: 0e 94 4e d7 call 0x1ae9c ; 0x1ae9c } else { // Timeouted. } lcd_update_enable(true); 30448: 81 e0 ldi r24, 0x01 ; 1 3044a: 0e 94 38 70 call 0xe070 ; 0xe070 #endif // TMC2130 FORCE_BL_ON_END; return final_result; } 3044e: e5 96 adiw r28, 0x35 ; 53 30450: 8f ad ldd r24, Y+63 ; 0x3f 30452: e5 97 sbiw r28, 0x35 ; 53 30454: c2 53 subi r28, 0x32 ; 50 30456: df 4f sbci r29, 0xFF ; 255 30458: 0f b6 in r0, 0x3f ; 63 3045a: f8 94 cli 3045c: de bf out 0x3e, r29 ; 62 3045e: 0f be out 0x3f, r0 ; 63 30460: cd bf out 0x3d, r28 ; 61 30462: df 91 pop r29 30464: cf 91 pop r28 30466: 1f 91 pop r17 30468: 0f 91 pop r16 3046a: ff 90 pop r15 3046c: ef 90 pop r14 3046e: df 90 pop r13 30470: cf 90 pop r12 30472: bf 90 pop r11 30474: af 90 pop r10 30476: 9f 90 pop r9 30478: 8f 90 pop r8 3047a: 7f 90 pop r7 3047c: 6f 90 pop r6 3047e: 5f 90 pop r5 30480: 4f 90 pop r4 30482: 3f 90 pop r3 30484: 2f 90 pop r2 30486: 08 95 ret current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3; /// Retry point scanning if a point with bad data appears. /// Bad data could be cause by "cold" sensor. /// This behavior vanishes after few point scans so retry will help. for (uint8_t retries = 0; retries <= 1; ++retries) { 30488: e1 e0 ldi r30, 0x01 ; 1 3048a: e1 96 adiw r28, 0x31 ; 49 3048c: ef af std Y+63, r30 ; 0x3f 3048e: e1 97 sbiw r28, 0x31 ; 49 30490: 15 cc rjmp .-2006 ; 0x2fcbc uint16_t ad = 0; if (pad) ad = *pad; //@size=274 DBG(_n("xyzcal_spiral8 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad); if (!ret && (ad < 720)) if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0) 30492: fe 01 movw r30, r28 30494: 31 96 adiw r30, 0x01 ; 1 30496: 7f 01 movw r14, r30 30498: 10 e0 ldi r17, 0x00 ; 0 3049a: 00 e0 ldi r16, 0x00 ; 0 3049c: 24 e8 ldi r18, 0x84 ; 132 3049e: 33 e0 ldi r19, 0x03 ; 3 304a0: a6 01 movw r20, r12 304a2: 69 2d mov r22, r9 304a4: 78 2d mov r23, r8 304a6: 8b 2d mov r24, r11 304a8: 9a 2d mov r25, r10 304aa: 0f 94 75 5f call 0x2beea ; 0x2beea ad += 0; if (!ret && (ad < 1440)) 304ae: 88 23 and r24, r24 304b0: 09 f4 brne .+2 ; 0x304b4 304b2: 0c cd rjmp .-1512 ; 0x2fecc if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0) ad += 1440; if (!ret && (ad < 2880)) if ((ret = xyzcal_spiral2(cx, cy, z0 - 3*dz, dz, -radius, 180, delay_us, check_pinda, &ad)) != 0) ad += 2160; if (pad) *pad = ad; 304b4: 89 81 ldd r24, Y+1 ; 0x01 304b6: 9a 81 ldd r25, Y+2 ; 0x02 304b8: 29 cd rjmp .-1454 ; 0x2ff0c if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0) ad += 720; if (!ret && (ad < 2160)) if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0) ad += 1440; if (!ret && (ad < 2880)) 304ba: 89 81 ldd r24, Y+1 ; 0x01 304bc: 9a 81 ldd r25, Y+2 ; 0x02 304be: 80 34 cpi r24, 0x40 ; 64 304c0: 9b 40 sbci r25, 0x0B ; 11 304c2: b8 f4 brcc .+46 ; 0x304f2 if ((ret = xyzcal_spiral2(cx, cy, z0 - 3*dz, dz, -radius, 180, delay_us, check_pinda, &ad)) != 0) 304c4: ce 01 movw r24, r28 304c6: 01 96 adiw r24, 0x01 ; 1 304c8: 7c 01 movw r14, r24 304ca: 04 eb ldi r16, 0xB4 ; 180 304cc: 10 e0 ldi r17, 0x00 ; 0 304ce: 2c e7 ldi r18, 0x7C ; 124 304d0: 3c ef ldi r19, 0xFC ; 252 304d2: a6 01 movw r20, r12 304d4: 4c 52 subi r20, 0x2C ; 44 304d6: 51 40 sbci r21, 0x01 ; 1 304d8: 69 2d mov r22, r9 304da: 78 2d mov r23, r8 304dc: 8b 2d mov r24, r11 304de: 9a 2d mov r25, r10 304e0: 0f 94 75 5f call 0x2beea ; 0x2beea 304e4: 88 23 and r24, r24 304e6: 29 f0 breq .+10 ; 0x304f2 ad += 2160; 304e8: 89 81 ldd r24, Y+1 ; 0x01 304ea: 9a 81 ldd r25, Y+2 ; 0x02 304ec: 80 59 subi r24, 0x90 ; 144 304ee: 97 4f sbci r25, 0xF7 ; 247 304f0: 0d cd rjmp .-1510 ; 0x2ff0c /// magic constant, lowers min_z after searchZ to obtain more dense data in scan const pos_i16_t lower_z = 72; xyzcal_lineXYZ_to(x0, y0, _Z - lower_z, 200, 0); return true; } z -= 400; 304f2: 90 e9 ldi r25, 0x90 ; 144 304f4: c9 1a sub r12, r25 304f6: 91 e0 ldi r25, 0x01 ; 1 304f8: d9 0a sbc r13, r25 304fa: c0 cc rjmp .-1664 ; 0x2fe7c } //@size=138 DBG(_n("xyzcal_searchZ no signal\n x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]); 304fc: 00 91 54 06 lds r16, 0x0654 ; 0x800654 30500: 10 91 55 06 lds r17, 0x0655 ; 0x800655 30504: 20 91 56 06 lds r18, 0x0656 ; 0x800656 30508: 30 91 57 06 lds r19, 0x0657 ; 0x800657 3050c: 40 91 50 06 lds r20, 0x0650 ; 0x800650 30510: 50 91 51 06 lds r21, 0x0651 ; 0x800651 30514: 60 91 52 06 lds r22, 0x0652 ; 0x800652 30518: 70 91 53 06 lds r23, 0x0653 ; 0x800653 3051c: 80 91 4c 06 lds r24, 0x064C ; 0x80064c 30520: 90 91 4d 06 lds r25, 0x064D ; 0x80064d 30524: a0 91 4e 06 lds r26, 0x064E ; 0x80064e 30528: b0 91 4f 06 lds r27, 0x064F ; 0x80064f 3052c: 3f 93 push r19 3052e: 2f 93 push r18 30530: 1f 93 push r17 30532: 0f 93 push r16 30534: 7f 93 push r23 30536: 6f 93 push r22 30538: 5f 93 push r21 3053a: 4f 93 push r20 3053c: bf 93 push r27 3053e: af 93 push r26 30540: 9f 93 push r25 30542: 8f 93 push r24 30544: 83 ed ldi r24, 0xD3 ; 211 30546: 9a e9 ldi r25, 0x9A ; 154 30548: 9f 93 push r25 3054a: 8f 93 push r24 3054c: 0f 94 a2 a2 call 0x34544 ; 0x34544 30550: 0f b6 in r0, 0x3f ; 63 30552: f8 94 cli 30554: de bf out 0x3e, r29 ; 62 30556: 0f be out 0x3f, r0 ; 63 30558: cd bf out 0x3d, r28 ; 61 return ret; } BedSkewOffsetDetectionResultType xyzcal_find_bed_induction_sensor_point_xy(void) { // DBG(_n("xyzcal_find_bed_induction_sensor_point_xy x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]); BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND; 3055a: 1f ef ldi r17, 0xFF ; 255 sm4_calc_delay_cb = xyzcal_calc_delay; } void xyzcal_measure_leave(void) { DBG(_n("xyzcal_measure_leave\n")); 3055c: 83 eb ldi r24, 0xB3 ; 179 3055e: 9b e9 ldi r25, 0x9B ; 155 30560: 9f 93 push r25 30562: 8f 93 push r24 30564: 0f 94 a2 a2 call 0x34544 ; 0x34544 lcd_set_cursor(4,3); 30568: 63 e0 ldi r22, 0x03 ; 3 3056a: 84 e0 ldi r24, 0x04 ; 4 3056c: 0e 94 5a 6f call 0xdeb4 ; 0xdeb4 lcd_space(16); 30570: 80 e1 ldi r24, 0x10 ; 16 30572: 0e 94 28 6f call 0xde50 ; 0xde50 // resync planner position from counters (changed by xyzcal_update_pos) planner_reset_position(); 30576: 0f 94 b4 4d call 0x29b68 ; 0x29b68 : "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | _BV(WDE) | (value & 0x07)) ) : "r0" ); 3057a: 88 e1 ldi r24, 0x18 ; 24 3057c: 98 e2 ldi r25, 0x28 ; 40 3057e: 0f b6 in r0, 0x3f ; 63 30580: f8 94 cli 30582: a8 95 wdr 30584: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 30588: 0f be out 0x3f, r0 ; 63 3058a: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> // re-enable interrupts #ifdef WATCHDOG wdt_enable(WDTO_4S); #ifdef EMERGENCY_HANDLERS WDTCSR |= (1 << WDIE); 3058e: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 30592: 80 64 ori r24, 0x40 ; 64 30594: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> #endif //EMERGENCY_HANDLERS #endif //WATCHDOG ENABLE_STEPPER_DRIVER_INTERRUPT(); 30598: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 3059c: 82 60 ori r24, 0x02 ; 2 3059e: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> delay_keep_alive(3000); #endif // SUPPORT_VERBOSITY BedSkewOffsetDetectionResultType result; result = find_bed_induction_sensor_point_xy(verbosity_level); switch(result){ 305a2: 0f 90 pop r0 305a4: 0f 90 pop r0 305a6: 1d 3f cpi r17, 0xFD ; 253 305a8: 09 f4 brne .+2 ; 0x305ac 305aa: ee c1 rjmp .+988 ; 0x30988 305ac: 1f 3f cpi r17, 0xFF ; 255 305ae: 11 f4 brne .+4 ; 0x305b4 305b0: 0d 94 0f 8e jmp 0x31c1e ; 0x31c1e SERIAL_ECHOLNPGM("Measured:"); MYSERIAL.println(current_position[X_AXIS]); MYSERIAL.println(current_position[Y_AXIS]); } #endif // SUPPORT_VERBOSITY pt[0] = (pt[0] * iteration) / (iteration + 1); 305b4: 20 e0 ldi r18, 0x00 ; 0 305b6: 30 e0 ldi r19, 0x00 ; 0 305b8: a9 01 movw r20, r18 305ba: a0 96 adiw r28, 0x20 ; 32 305bc: ee ad ldd r30, Y+62 ; 0x3e 305be: ff ad ldd r31, Y+63 ; 0x3f 305c0: a0 97 sbiw r28, 0x20 ; 32 305c2: 61 81 ldd r22, Z+1 ; 0x01 305c4: 72 81 ldd r23, Z+2 ; 0x02 305c6: 83 81 ldd r24, Z+3 ; 0x03 305c8: 94 81 ldd r25, Z+4 ; 0x04 305ca: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> pt[0] += (current_position[X_AXIS]/(iteration + 1)); //count average 305ce: 20 91 61 12 lds r18, 0x1261 ; 0x801261 305d2: 30 91 62 12 lds r19, 0x1262 ; 0x801262 305d6: 40 91 63 12 lds r20, 0x1263 ; 0x801263 305da: 50 91 64 12 lds r21, 0x1264 ; 0x801264 305de: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 305e2: a0 96 adiw r28, 0x20 ; 32 305e4: ae ad ldd r26, Y+62 ; 0x3e 305e6: bf ad ldd r27, Y+63 ; 0x3f 305e8: a0 97 sbiw r28, 0x20 ; 32 305ea: 11 96 adiw r26, 0x01 ; 1 305ec: 6d 93 st X+, r22 305ee: 7d 93 st X+, r23 305f0: 8d 93 st X+, r24 305f2: 9c 93 st X, r25 305f4: 14 97 sbiw r26, 0x04 ; 4 pt[1] = (pt[1] * iteration) / (iteration + 1); pt[1] += (current_position[Y_AXIS] / (iteration + 1)); 305f6: c0 90 65 12 lds r12, 0x1265 ; 0x801265 305fa: d0 90 66 12 lds r13, 0x1266 ; 0x801266 305fe: e0 90 67 12 lds r14, 0x1267 ; 0x801267 30602: f0 90 68 12 lds r15, 0x1268 ; 0x801268 MYSERIAL.println(current_position[Y_AXIS]); } #endif // SUPPORT_VERBOSITY pt[0] = (pt[0] * iteration) / (iteration + 1); pt[0] += (current_position[X_AXIS]/(iteration + 1)); //count average pt[1] = (pt[1] * iteration) / (iteration + 1); 30606: 20 e0 ldi r18, 0x00 ; 0 30608: 30 e0 ldi r19, 0x00 ; 0 3060a: a9 01 movw r20, r18 3060c: 15 96 adiw r26, 0x05 ; 5 3060e: 6d 91 ld r22, X+ 30610: 7d 91 ld r23, X+ 30612: 8d 91 ld r24, X+ 30614: 9c 91 ld r25, X 30616: 18 97 sbiw r26, 0x08 ; 8 30618: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> pt[1] += (current_position[Y_AXIS] / (iteration + 1)); 3061c: a7 01 movw r20, r14 3061e: 96 01 movw r18, r12 30620: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30624: a0 96 adiw r28, 0x20 ; 32 30626: ee ad ldd r30, Y+62 ; 0x3e 30628: ff ad ldd r31, Y+63 ; 0x3f 3062a: a0 97 sbiw r28, 0x20 ; 32 3062c: 65 83 std Z+5, r22 ; 0x05 3062e: 76 83 std Z+6, r23 ; 0x06 30630: 87 83 std Z+7, r24 ; 0x07 30632: 90 87 std Z+8, r25 ; 0x08 SERIAL_ECHOPGM("pt[1]:"); MYSERIAL.println(pt[1]); } #endif // SUPPORT_VERBOSITY if (current_position[Y_AXIS] < Y_MIN_POS) 30634: 20 e0 ldi r18, 0x00 ; 0 30636: 30 e0 ldi r19, 0x00 ; 0 30638: 40 e8 ldi r20, 0x80 ; 128 3063a: 50 ec ldi r21, 0xC0 ; 192 3063c: c7 01 movw r24, r14 3063e: b6 01 movw r22, r12 30640: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 30644: 87 ff sbrs r24, 7 30646: 0c c0 rjmp .+24 ; 0x30660 current_position[Y_AXIS] = Y_MIN_POS; 30648: 80 e0 ldi r24, 0x00 ; 0 3064a: 90 e0 ldi r25, 0x00 ; 0 3064c: a0 e8 ldi r26, 0x80 ; 128 3064e: b0 ec ldi r27, 0xC0 ; 192 30650: 80 93 65 12 sts 0x1265, r24 ; 0x801265 30654: 90 93 66 12 sts 0x1266, r25 ; 0x801266 30658: a0 93 67 12 sts 0x1267, r26 ; 0x801267 3065c: b0 93 68 12 sts 0x1268, r27 ; 0x801268 // Start searching for the other points at 3mm above the last point. current_position[Z_AXIS] += 3.f + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3; 30660: 20 e0 ldi r18, 0x00 ; 0 30662: 30 e0 ldi r19, 0x00 ; 0 30664: 40 e4 ldi r20, 0x40 ; 64 30666: 50 e4 ldi r21, 0x40 ; 64 30668: 60 91 69 12 lds r22, 0x1269 ; 0x801269 3066c: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 30670: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 30674: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 30678: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3067c: 60 93 69 12 sts 0x1269, r22 ; 0x801269 30680: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 30684: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 30688: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c 3068c: e0 96 adiw r28, 0x30 ; 48 3068e: 2e ad ldd r18, Y+62 ; 0x3e 30690: 3f ad ldd r19, Y+63 ; 0x3f 30692: e0 97 sbiw r28, 0x30 ; 48 30694: 28 5f subi r18, 0xF8 ; 248 30696: 3f 4f sbci r19, 0xFF ; 255 30698: e0 96 adiw r28, 0x30 ; 48 3069a: 3f af std Y+63, r19 ; 0x3f 3069c: 2e af std Y+62, r18 ; 0x3e 3069e: e0 97 sbiw r28, 0x30 ; 48 306a0: a0 96 adiw r28, 0x20 ; 32 306a2: 4e ad ldd r20, Y+62 ; 0x3e 306a4: 5f ad ldd r21, Y+63 ; 0x3f 306a6: a0 97 sbiw r28, 0x20 ; 32 306a8: 48 5f subi r20, 0xF8 ; 248 306aa: 5f 4f sbci r21, 0xFF ; 255 306ac: a0 96 adiw r28, 0x20 ; 32 306ae: 5f af std Y+63, r21 ; 0x3f 306b0: 4e af std Y+62, r20 ; 0x3e 306b2: a0 97 sbiw r28, 0x20 ; 32 /// Retry point scanning if a point with bad data appears. /// Bad data could be cause by "cold" sensor. /// This behavior vanishes after few point scans so retry will help. for (uint8_t retries = 0; retries <= 1; ++retries) { bool retry = false; for (int k = 0; k < 4; ++k) { 306b4: 54 e0 ldi r21, 0x04 ; 4 306b6: 25 16 cp r2, r21 306b8: 31 04 cpc r3, r1 306ba: 09 f0 breq .+2 ; 0x306be 306bc: 1c cb rjmp .-2504 ; 0x2fcf6 go_to_current(homing_feedrate[X_AXIS] / 60.f); delay_keep_alive(3000); } #endif // SUPPORT_VERBOSITY } if (!retry) 306be: a7 96 adiw r28, 0x27 ; 39 306c0: 6f ad ldd r22, Y+63 ; 0x3f 306c2: a7 97 sbiw r28, 0x27 ; 39 306c4: 66 23 and r22, r22 306c6: 31 f0 breq .+12 ; 0x306d4 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3; /// Retry point scanning if a point with bad data appears. /// Bad data could be cause by "cold" sensor. /// This behavior vanishes after few point scans so retry will help. for (uint8_t retries = 0; retries <= 1; ++retries) { 306c8: e1 96 adiw r28, 0x31 ; 49 306ca: 8f ad ldd r24, Y+63 ; 0x3f 306cc: e1 97 sbiw r28, 0x31 ; 49 306ce: 81 30 cpi r24, 0x01 ; 1 306d0: 09 f0 breq .+2 ; 0x306d4 306d2: da ce rjmp .-588 ; 0x30488 #endif // SUPPORT_VERBOSITY } if (!retry) break; } DBG(_n("All 4 calibration points found.\n")); 306d4: 89 eb ldi r24, 0xB9 ; 185 306d6: 9b e6 ldi r25, 0x6B ; 107 306d8: 9f 93 push r25 306da: 8f 93 push r24 306dc: 0f 94 a2 a2 call 0x34544 ; 0x34544 delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity 306e0: 90 e0 ldi r25, 0x00 ; 0 306e2: 80 e0 ldi r24, 0x00 ; 0 306e4: 0e 94 8e 8e call 0x11d1c ; 0x11d1c go_to_current(homing_feedrate[X_AXIS] / 60); delay_keep_alive(3000); } } #endif // SUPPORT_VERBOSITY if (pts[1] < Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH) { 306e8: 0f 90 pop r0 306ea: 0f 90 pop r0 306ec: 20 e0 ldi r18, 0x00 ; 0 306ee: 30 e0 ldi r19, 0x00 ; 0 306f0: 40 e9 ldi r20, 0x90 ; 144 306f2: 50 ec ldi r21, 0xC0 ; 192 306f4: 60 91 0e 13 lds r22, 0x130E ; 0x80130e 306f8: 70 91 0f 13 lds r23, 0x130F ; 0x80130f 306fc: 80 91 10 13 lds r24, 0x1310 ; 0x801310 30700: 90 91 11 13 lds r25, 0x1311 ; 0x801311 30704: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 30708: 87 ff sbrs r24, 7 3070a: 45 c1 rjmp .+650 ; 0x30996 too_far_mask |= 1 << 1; //front center point is out of reach SERIAL_ECHOLNPGM(""); 3070c: 8f ef ldi r24, 0xFF ; 255 3070e: 9b e9 ldi r25, 0x9B ; 155 30710: 0e 94 bd 7c call 0xf97a ; 0xf97a SERIAL_ECHOPGM("WARNING: Front point not reachable. Y coordinate:"); 30714: 8d ec ldi r24, 0xCD ; 205 30716: 9b e9 ldi r25, 0x9B ; 155 30718: 0e 94 c4 7a call 0xf588 ; 0xf588 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 3071c: 60 91 0e 13 lds r22, 0x130E ; 0x80130e 30720: 70 91 0f 13 lds r23, 0x130F ; 0x80130f 30724: 80 91 10 13 lds r24, 0x1310 ; 0x801310 30728: 90 91 11 13 lds r25, 0x1311 ; 0x801311 3072c: 42 e0 ldi r20, 0x02 ; 2 3072e: 0e 94 46 7a call 0xf48c ; 0xf48c MYSERIAL.print(pts[1]); SERIAL_ECHOPGM(" < "); 30732: 89 ec ldi r24, 0xC9 ; 201 30734: 9b e9 ldi r25, 0x9B ; 155 30736: 0e 94 c4 7a call 0xf588 ; 0xf588 MYSERIAL.println(Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 3073a: 60 e0 ldi r22, 0x00 ; 0 3073c: 70 e0 ldi r23, 0x00 ; 0 3073e: 80 e9 ldi r24, 0x90 ; 144 30740: 90 ec ldi r25, 0xC0 ; 192 30742: 0f 94 a2 65 call 0x2cb44 ; 0x2cb44 delay_keep_alive(3000); } } #endif // SUPPORT_VERBOSITY if (pts[1] < Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH) { too_far_mask |= 1 << 1; //front center point is out of reach 30746: 92 e0 ldi r25, 0x02 ; 2 30748: af 96 adiw r28, 0x2f ; 47 3074a: 9f af std Y+63, r25 ; 0x3f 3074c: af 97 sbiw r28, 0x2f ; 47 #endif // SUPPORT_VERBOSITY // Run some iterations of the Gauss-Newton method of non-linear least squares. // Initial set of parameters: // X,Y offset cntr[0] = 0.f; 3074e: 10 92 3a 13 sts 0x133A, r1 ; 0x80133a 30752: 10 92 3b 13 sts 0x133B, r1 ; 0x80133b 30756: 10 92 3c 13 sts 0x133C, r1 ; 0x80133c 3075a: 10 92 3d 13 sts 0x133D, r1 ; 0x80133d cntr[1] = 0.f; 3075e: 10 92 3e 13 sts 0x133E, r1 ; 0x80133e 30762: 10 92 3f 13 sts 0x133F, r1 ; 0x80133f 30766: 10 92 40 13 sts 0x1340, r1 ; 0x801340 3076a: 10 92 41 13 sts 0x1341, r1 ; 0x801341 3076e: a4 e6 ldi r26, 0x64 ; 100 30770: e6 96 adiw r28, 0x36 ; 54 30772: af af std Y+63, r26 ; 0x3f 30774: e6 97 sbiw r28, 0x36 ; 54 // Rotation of the machine X axis from the bed X axis. float a1 = 0; // Rotation of the machine Y axis from the bed Y axis. float a2 = 0; 30776: a2 96 adiw r28, 0x22 ; 34 30778: 1c ae std Y+60, r1 ; 0x3c 3077a: 1d ae std Y+61, r1 ; 0x3d 3077c: 1e ae std Y+62, r1 ; 0x3e 3077e: 1f ae std Y+63, r1 ; 0x3f 30780: a2 97 sbiw r28, 0x22 ; 34 // Initial set of parameters: // X,Y offset cntr[0] = 0.f; cntr[1] = 0.f; // Rotation of the machine X axis from the bed X axis. float a1 = 0; 30782: a6 96 adiw r28, 0x26 ; 38 30784: 1c ae std Y+60, r1 ; 0x3c 30786: 1d ae std Y+61, r1 ; 0x3d 30788: 1e ae std Y+62, r1 ; 0x3e 3078a: 1f ae std Y+63, r1 ; 0x3f 3078c: a6 97 sbiw r28, 0x26 ; 38 float c1 = cos(a1) * MACHINE_AXIS_SCALE_X; float s1 = sin(a1) * MACHINE_AXIS_SCALE_X; float c2 = cos(a2) * MACHINE_AXIS_SCALE_Y; float s2 = sin(a2) * MACHINE_AXIS_SCALE_Y; // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; 3078e: fe 01 movw r30, r28 30790: 31 96 adiw r30, 0x01 ; 1 30792: 68 96 adiw r28, 0x18 ; 24 30794: ff af std Y+63, r31 ; 0x3f 30796: ee af std Y+62, r30 ; 0x3e 30798: 68 97 sbiw r28, 0x18 ; 24 float b[4] = { 0.f }; 3079a: 9e 01 movw r18, r28 3079c: 2f 5b subi r18, 0xBF ; 191 3079e: 3f 4f sbci r19, 0xFF ; 255 307a0: 6a 96 adiw r28, 0x1a ; 26 307a2: 3f af std Y+63, r19 ; 0x3f 307a4: 2e af std Y+62, r18 ; 0x3e 307a6: 6a 97 sbiw r28, 0x1a ; 26 // Rotation of the machine X axis from the bed X axis. float a1 = 0; // Rotation of the machine Y axis from the bed Y axis. float a2 = 0; for (int8_t iter = 0; iter < 100; ++iter) { float c1 = cos(a1) * MACHINE_AXIS_SCALE_X; 307a8: a6 96 adiw r28, 0x26 ; 38 307aa: 6c ad ldd r22, Y+60 ; 0x3c 307ac: 7d ad ldd r23, Y+61 ; 0x3d 307ae: 8e ad ldd r24, Y+62 ; 0x3e 307b0: 9f ad ldd r25, Y+63 ; 0x3f 307b2: a6 97 sbiw r28, 0x26 ; 38 307b4: 0f 94 02 a6 call 0x34c04 ; 0x34c04 307b8: 6e 96 adiw r28, 0x1e ; 30 307ba: 6c af std Y+60, r22 ; 0x3c 307bc: 7d af std Y+61, r23 ; 0x3d 307be: 8e af std Y+62, r24 ; 0x3e 307c0: 9f af std Y+63, r25 ; 0x3f 307c2: 6e 97 sbiw r28, 0x1e ; 30 float s1 = sin(a1) * MACHINE_AXIS_SCALE_X; 307c4: a6 96 adiw r28, 0x26 ; 38 307c6: 6c ad ldd r22, Y+60 ; 0x3c 307c8: 7d ad ldd r23, Y+61 ; 0x3d 307ca: 8e ad ldd r24, Y+62 ; 0x3e 307cc: 9f ad ldd r25, Y+63 ; 0x3f 307ce: a6 97 sbiw r28, 0x26 ; 38 307d0: 0f 94 c8 a8 call 0x35190 ; 0x35190 307d4: cb 57 subi r28, 0x7B ; 123 307d6: df 4f sbci r29, 0xFF ; 255 307d8: 68 83 st Y, r22 307da: 79 83 std Y+1, r23 ; 0x01 307dc: 8a 83 std Y+2, r24 ; 0x02 307de: 9b 83 std Y+3, r25 ; 0x03 307e0: c5 58 subi r28, 0x85 ; 133 307e2: d0 40 sbci r29, 0x00 ; 0 float c2 = cos(a2) * MACHINE_AXIS_SCALE_Y; 307e4: a2 96 adiw r28, 0x22 ; 34 307e6: 6c ad ldd r22, Y+60 ; 0x3c 307e8: 7d ad ldd r23, Y+61 ; 0x3d 307ea: 8e ad ldd r24, Y+62 ; 0x3e 307ec: 9f ad ldd r25, Y+63 ; 0x3f 307ee: a2 97 sbiw r28, 0x22 ; 34 307f0: 0f 94 02 a6 call 0x34c04 ; 0x34c04 307f4: c7 57 subi r28, 0x77 ; 119 307f6: df 4f sbci r29, 0xFF ; 255 307f8: 68 83 st Y, r22 307fa: 79 83 std Y+1, r23 ; 0x01 307fc: 8a 83 std Y+2, r24 ; 0x02 307fe: 9b 83 std Y+3, r25 ; 0x03 30800: c9 58 subi r28, 0x89 ; 137 30802: d0 40 sbci r29, 0x00 ; 0 float s2 = sin(a2) * MACHINE_AXIS_SCALE_Y; 30804: a2 96 adiw r28, 0x22 ; 34 30806: 6c ad ldd r22, Y+60 ; 0x3c 30808: 7d ad ldd r23, Y+61 ; 0x3d 3080a: 8e ad ldd r24, Y+62 ; 0x3e 3080c: 9f ad ldd r25, Y+63 ; 0x3f 3080e: a2 97 sbiw r28, 0x22 ; 34 30810: 0f 94 c8 a8 call 0x35190 ; 0x35190 30814: cb 56 subi r28, 0x6B ; 107 30816: df 4f sbci r29, 0xFF ; 255 30818: 68 83 st Y, r22 3081a: 79 83 std Y+1, r23 ; 0x01 3081c: 8a 83 std Y+2, r24 ; 0x02 3081e: 9b 83 std Y+3, r25 ; 0x03 30820: c5 59 subi r28, 0x95 ; 149 30822: d0 40 sbci r29, 0x00 ; 0 // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; 30824: 68 96 adiw r28, 0x18 ; 24 30826: ae ad ldd r26, Y+62 ; 0x3e 30828: bf ad ldd r27, Y+63 ; 0x3f 3082a: 68 97 sbiw r28, 0x18 ; 24 3082c: e0 e4 ldi r30, 0x40 ; 64 3082e: 1d 92 st X+, r1 30830: ea 95 dec r30 30832: e9 f7 brne .-6 ; 0x3082e float b[4] = { 0.f }; 30834: 80 e1 ldi r24, 0x10 ; 16 30836: 6a 96 adiw r28, 0x1a ; 26 30838: ae ad ldd r26, Y+62 ; 0x3e 3083a: bf ad ldd r27, Y+63 ; 0x3f 3083c: 6a 97 sbiw r28, 0x1a ; 26 3083e: 1d 92 st X+, r1 30840: 8a 95 dec r24 30842: e9 f7 brne .-6 ; 0x3083e float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity 30844: 90 e0 ldi r25, 0x00 ; 0 30846: 80 e0 ldi r24, 0x00 ; 0 30848: 0e 94 8e 8e call 0x11d1c ; 0x11d1c float j = (r == 0) ? 1.f : ((r == 1) ? 0.f : ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1]))); float fx = c1 * measured_pts[2 * i] - s2 * measured_pts[2 * i + 1] + cntr[0] - pgm_read_float(true_pts + i * 2); 3084c: 20 91 3a 13 lds r18, 0x133A ; 0x80133a 30850: 30 91 3b 13 lds r19, 0x133B ; 0x80133b 30854: 40 91 3c 13 lds r20, 0x133C ; 0x80133c 30858: 50 91 3d 13 lds r21, 0x133D ; 0x80133d 3085c: c5 55 subi r28, 0x55 ; 85 3085e: df 4f sbci r29, 0xFF ; 255 30860: 28 83 st Y, r18 30862: 39 83 std Y+1, r19 ; 0x01 30864: 4a 83 std Y+2, r20 ; 0x02 30866: 5b 83 std Y+3, r21 ; 0x03 30868: cb 5a subi r28, 0xAB ; 171 3086a: d0 40 sbci r29, 0x00 ; 0 float j = (r == 0) ? 0.f : ((r == 1) ? 1.f : ((r == 2) ? ( c1 * measured_pts[2 * i]) : (-s2 * measured_pts[2 * i + 1]))); float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1); 3086c: 80 91 3e 13 lds r24, 0x133E ; 0x80133e 30870: 90 91 3f 13 lds r25, 0x133F ; 0x80133f 30874: a0 91 40 13 lds r26, 0x1340 ; 0x801340 30878: b0 91 41 13 lds r27, 0x1341 ; 0x801341 3087c: c1 55 subi r28, 0x51 ; 81 3087e: df 4f sbci r29, 0xFF ; 255 30880: 88 83 st Y, r24 30882: 99 83 std Y+1, r25 ; 0x01 30884: aa 83 std Y+2, r26 ; 0x02 30886: bb 83 std Y+3, r27 ; 0x03 30888: cf 5a subi r28, 0xAF ; 175 3088a: d0 40 sbci r29, 0x00 ; 0 3088c: de 01 movw r26, r28 3088e: af 5b subi r26, 0xBF ; 191 30890: bf 4f sbci r27, 0xFF ; 255 30892: c7 56 subi r28, 0x67 ; 103 30894: df 4f sbci r29, 0xFF ; 255 30896: b9 83 std Y+1, r27 ; 0x01 30898: a8 83 st Y, r26 3089a: c9 59 subi r28, 0x99 ; 153 3089c: d0 40 sbci r29, 0x00 ; 0 3089e: fe 01 movw r30, r28 308a0: 31 96 adiw r30, 0x01 ; 1 308a2: ac 96 adiw r28, 0x2c ; 44 308a4: ff af std Y+63, r31 ; 0x3f 308a6: ee af std Y+62, r30 ; 0x3e 308a8: ac 97 sbiw r28, 0x2c ; 44 // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; float b[4] = { 0.f }; float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity for (uint8_t r = 0; r < 4; ++r) { 308aa: 00 e0 ldi r16, 0x00 ; 0 ((r == 2) ? ( c1 * measured_pts[2 * i]) : (-s2 * measured_pts[2 * i + 1])); float b = (c == 1) ? 1.f : ((c == 2) ? ( c1 * measured_pts[2 * i]) : (-s2 * measured_pts[2 * i + 1])); 308ac: cb 56 subi r28, 0x6B ; 107 308ae: df 4f sbci r29, 0xFF ; 255 308b0: 28 81 ld r18, Y 308b2: 39 81 ldd r19, Y+1 ; 0x01 308b4: 4a 81 ldd r20, Y+2 ; 0x02 308b6: 5b 81 ldd r21, Y+3 ; 0x03 308b8: c5 59 subi r28, 0x95 ; 149 308ba: d0 40 sbci r29, 0x00 ; 0 308bc: 50 58 subi r21, 0x80 ; 128 308be: ed 96 adiw r28, 0x3d ; 61 308c0: 2c af std Y+60, r18 ; 0x3c 308c2: 3d af std Y+61, r19 ; 0x3d 308c4: 4e af std Y+62, r20 ; 0x3e 308c6: 5f af std Y+63, r21 ; 0x3f 308c8: ed 97 sbiw r28, 0x3d ; 61 ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : ((c == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); 308ca: c7 57 subi r28, 0x77 ; 119 308cc: df 4f sbci r29, 0xFF ; 255 308ce: 88 81 ld r24, Y 308d0: 99 81 ldd r25, Y+1 ; 0x01 308d2: aa 81 ldd r26, Y+2 ; 0x02 308d4: bb 81 ldd r27, Y+3 ; 0x03 308d6: c9 58 subi r28, 0x89 ; 137 308d8: d0 40 sbci r29, 0x00 ; 0 308da: b0 58 subi r27, 0x80 ; 128 308dc: c3 58 subi r28, 0x83 ; 131 308de: df 4f sbci r29, 0xFF ; 255 308e0: 88 83 st Y, r24 308e2: 99 83 std Y+1, r25 ; 0x01 308e4: aa 83 std Y+2, r26 ; 0x02 308e6: bb 83 std Y+3, r27 ; 0x03 308e8: cd 57 subi r28, 0x7D ; 125 308ea: d0 40 sbci r29, 0x00 ; 0 (r == 0) ? 1.f : ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : ((c == 2) ? (-s1 * measured_pts[2 * i]) : 308ec: cb 57 subi r28, 0x7B ; 123 308ee: df 4f sbci r29, 0xFF ; 255 308f0: 28 81 ld r18, Y 308f2: 39 81 ldd r19, Y+1 ; 0x01 308f4: 4a 81 ldd r20, Y+2 ; 0x02 308f6: 5b 81 ldd r21, Y+3 ; 0x03 308f8: c5 58 subi r28, 0x85 ; 133 308fa: d0 40 sbci r29, 0x00 ; 0 308fc: 50 58 subi r21, 0x80 ; 128 308fe: cf 57 subi r28, 0x7F ; 127 30900: df 4f sbci r29, 0xFF ; 255 30902: 28 83 st Y, r18 30904: 39 83 std Y+1, r19 ; 0x01 30906: 4a 83 std Y+2, r20 ; 0x02 30908: 5b 83 std Y+3, r21 ; 0x03 3090a: c1 58 subi r28, 0x81 ; 129 3090c: d0 40 sbci r29, 0x00 ; 0 // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; float b[4] = { 0.f }; float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity for (uint8_t r = 0; r < 4; ++r) { 3090e: ac 96 adiw r28, 0x2c ; 44 30910: 2e ac ldd r2, Y+62 ; 0x3e 30912: 3f ac ldd r3, Y+63 ; 0x3f 30914: ac 97 sbiw r28, 0x2c ; 44 for (uint8_t c = 0; c < 4; ++c) { 30916: 10 e0 ldi r17, 0x00 ; 0 30918: 69 e0 ldi r22, 0x09 ; 9 3091a: 46 2e mov r4, r22 3091c: 63 e1 ldi r22, 0x13 ; 19 3091e: 56 2e mov r5, r22 30920: 74 e0 ldi r23, 0x04 ; 4 30922: 77 2e mov r7, r23 acc = 0; 30924: c1 2c mov r12, r1 30926: d1 2c mov r13, r1 30928: 76 01 movw r14, r12 // J^T times J for (uint8_t i = 0; i < npts; ++i) { // First for the residuum in the x axis: if (r != 1 && c != 1) { 3092a: 01 30 cpi r16, 0x01 ; 1 3092c: 11 f4 brne .+4 ; 0x30932 3092e: 0d 94 c3 8e jmp 0x31d86 ; 0x31d86 30932: 11 30 cpi r17, 0x01 ; 1 30934: 11 f4 brne .+4 ; 0x3093a 30936: 0d 94 75 8e jmp 0x31cea ; 0x31cea float a = (r == 0) ? 1.f : 3093a: 00 23 and r16, r16 3093c: 11 f4 brne .+4 ; 0x30942 3093e: 0d 94 b5 8e jmp 0x31d6a ; 0x31d6a ((r == 2) ? (-s1 * measured_pts[2 * i]) : 30942: 02 30 cpi r16, 0x02 ; 2 30944: 61 f5 brne .+88 ; 0x3099e 30946: d2 01 movw r26, r4 30948: 11 96 adiw r26, 0x01 ; 1 3094a: 2d 91 ld r18, X+ 3094c: 3d 91 ld r19, X+ 3094e: 4d 91 ld r20, X+ 30950: 5c 91 ld r21, X 30952: 14 97 sbiw r26, 0x04 ; 4 30954: cf 57 subi r28, 0x7F ; 127 30956: df 4f sbci r29, 0xFF ; 255 30958: 68 81 ld r22, Y 3095a: 79 81 ldd r23, Y+1 ; 0x01 3095c: 8a 81 ldd r24, Y+2 ; 0x02 3095e: 9b 81 ldd r25, Y+3 ; 0x03 30960: c1 58 subi r28, 0x81 ; 129 30962: d0 40 sbci r29, 0x00 ; 0 30964: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30968: 4b 01 movw r8, r22 3096a: 5c 01 movw r10, r24 (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : 3096c: 11 11 cpse r17, r1 3096e: 25 c0 rjmp .+74 ; 0x309ba 30970: 60 e0 ldi r22, 0x00 ; 0 30972: 70 e0 ldi r23, 0x00 ; 0 30974: 80 e8 ldi r24, 0x80 ; 128 30976: 9f e3 ldi r25, 0x3F ; 63 30978: 35 c0 rjmp .+106 ; 0x309e4 int16_t maxs = 0; for (int16_t i = 0; i < 32*32;++i){ if (matrix32[i] == 0) { ++mins; } else if (matrix32[i] == 0xFF){ 3097a: 2f 3f cpi r18, 0xFF ; 255 3097c: 09 f0 breq .+2 ; 0x30980 3097e: 98 cb rjmp .-2256 ; 0x300b0 ++maxs; 30980: 01 96 adiw r24, 0x01 ; 1 30982: 96 cb rjmp .-2260 ; 0x300b0 /// scans area around the current head location and /// searches for the center of the calibration pin BedSkewOffsetDetectionResultType xyzcal_scan_and_process(){ //@size=44 // DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE); BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND; 30984: 1f ef ldi r17, 0xFF ; 255 30986: 2c cd rjmp .-1448 ; 0x303e0 result = find_bed_induction_sensor_point_xy(verbosity_level); switch(result){ case BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND: return BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND; case BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED: retry = true; 30988: e5 96 adiw r28, 0x35 ; 53 3098a: bf ad ldd r27, Y+63 ; 0x3f 3098c: e5 97 sbiw r28, 0x35 ; 53 3098e: a7 96 adiw r28, 0x27 ; 39 30990: bf af std Y+63, r27 ; 0x3f 30992: a7 97 sbiw r28, 0x27 ; 39 30994: 0f ce rjmp .-994 ; 0x305b4 // Reset the baby step value and the baby step applied flag. calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Complete XYZ calibration. uint8_t point_too_far_mask = 0; 30996: af 96 adiw r28, 0x2f ; 47 30998: 1f ae std Y+63, r1 ; 0x3f 3099a: af 97 sbiw r28, 0x2f ; 47 3099c: d8 ce rjmp .-592 ; 0x3074e for (uint8_t i = 0; i < npts; ++i) { // First for the residuum in the x axis: if (r != 1 && c != 1) { float a = (r == 0) ? 1.f : ((r == 2) ? (-s1 * measured_pts[2 * i]) : 3099e: f2 01 movw r30, r4 309a0: 25 81 ldd r18, Z+5 ; 0x05 309a2: 36 81 ldd r19, Z+6 ; 0x06 309a4: 47 81 ldd r20, Z+7 ; 0x07 309a6: 50 85 ldd r21, Z+8 ; 0x08 309a8: c3 58 subi r28, 0x83 ; 131 309aa: df 4f sbci r29, 0xFF ; 255 309ac: 68 81 ld r22, Y 309ae: 79 81 ldd r23, Y+1 ; 0x01 309b0: 8a 81 ldd r24, Y+2 ; 0x02 309b2: 9b 81 ldd r25, Y+3 ; 0x03 309b4: cd 57 subi r28, 0x7D ; 125 309b6: d0 40 sbci r29, 0x00 ; 0 309b8: d5 cf rjmp .-86 ; 0x30964 (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : ((c == 2) ? (-s1 * measured_pts[2 * i]) : 309ba: 12 30 cpi r17, 0x02 ; 2 309bc: 11 f0 breq .+4 ; 0x309c2 309be: 0d 94 b6 8d jmp 0x31b6c ; 0x31b6c 309c2: d2 01 movw r26, r4 309c4: 11 96 adiw r26, 0x01 ; 1 309c6: 2d 91 ld r18, X+ 309c8: 3d 91 ld r19, X+ 309ca: 4d 91 ld r20, X+ 309cc: 5c 91 ld r21, X 309ce: 14 97 sbiw r26, 0x04 ; 4 309d0: cf 57 subi r28, 0x7F ; 127 309d2: df 4f sbci r29, 0xFF ; 255 309d4: 68 81 ld r22, Y 309d6: 79 81 ldd r23, Y+1 ; 0x01 309d8: 8a 81 ldd r24, Y+2 ; 0x02 309da: 9b 81 ldd r25, Y+3 ; 0x03 309dc: c1 58 subi r28, 0x81 ; 129 309de: d0 40 sbci r29, 0x00 ; 0 309e0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> (-c2 * measured_pts[2 * i + 1])); float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += a * b * w; 309e4: 9b 01 movw r18, r22 309e6: ac 01 movw r20, r24 309e8: c5 01 movw r24, r10 309ea: b4 01 movw r22, r8 309ec: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 309f0: 9b 01 movw r18, r22 309f2: ac 01 movw r20, r24 309f4: c7 01 movw r24, r14 309f6: b6 01 movw r22, r12 309f8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 309fc: 6b 01 movw r12, r22 309fe: 7c 01 movw r14, r24 } // Second for the residuum in the y axis. // The first row of the points have a low weight, because their position may not be known // with a sufficient accuracy. if (r != 0 && c != 0) { 30a00: 01 11 cpse r16, r1 30a02: 0d 94 cd 8e jmp 0x31d9a ; 0x31d9a 30a06: 7a 94 dec r7 30a08: f8 e0 ldi r31, 0x08 ; 8 30a0a: 4f 0e add r4, r31 30a0c: 51 1c adc r5, r1 delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity for (uint8_t r = 0; r < 4; ++r) { for (uint8_t c = 0; c < 4; ++c) { acc = 0; // J^T times J for (uint8_t i = 0; i < npts; ++i) { 30a0e: 71 10 cpse r7, r1 30a10: 8c cf rjmp .-232 ; 0x3092a (-s2 * measured_pts[2 * i + 1])); float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += a * b * w; } } A[r][c] = acc; 30a12: d1 01 movw r26, r2 30a14: cd 92 st X+, r12 30a16: dd 92 st X+, r13 30a18: ed 92 st X+, r14 30a1a: fd 92 st X+, r15 30a1c: 1d 01 movw r2, r26 float A[4][4] = { 0.f }; float b[4] = { 0.f }; float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity for (uint8_t r = 0; r < 4; ++r) { for (uint8_t c = 0; c < 4; ++c) { 30a1e: 1f 5f subi r17, 0xFF ; 255 30a20: 14 30 cpi r17, 0x04 ; 4 30a22: 09 f0 breq .+2 ; 0x30a26 30a24: 79 cf rjmp .-270 ; 0x30918 30a26: 30 e0 ldi r19, 0x00 ; 0 30a28: 23 2e mov r2, r19 30a2a: 3c e9 ldi r19, 0x9C ; 156 30a2c: 33 2e mov r3, r19 30a2e: e9 e0 ldi r30, 0x09 ; 9 30a30: f3 e1 ldi r31, 0x13 ; 19 30a32: a8 96 adiw r28, 0x28 ; 40 30a34: ff af std Y+63, r31 ; 0x3f 30a36: ee af std Y+62, r30 ; 0x3e 30a38: a8 97 sbiw r28, 0x28 ; 40 } } A[r][c] = acc; } // J^T times f(x) acc = 0.f; 30a3a: c3 57 subi r28, 0x73 ; 115 30a3c: df 4f sbci r29, 0xFF ; 255 30a3e: 18 82 st Y, r1 30a40: cd 58 subi r28, 0x8D ; 141 30a42: d0 40 sbci r29, 0x00 ; 0 30a44: c3 56 subi r28, 0x63 ; 99 30a46: df 4f sbci r29, 0xFF ; 255 30a48: 18 82 st Y, r1 30a4a: cd 59 subi r28, 0x9D ; 157 30a4c: d0 40 sbci r29, 0x00 ; 0 30a4e: cf 55 subi r28, 0x5F ; 95 30a50: df 4f sbci r29, 0xFF ; 255 30a52: 18 82 st Y, r1 30a54: c1 5a subi r28, 0xA1 ; 161 30a56: d0 40 sbci r29, 0x00 ; 0 30a58: 10 e0 ldi r17, 0x00 ; 0 30a5a: a8 96 adiw r28, 0x28 ; 40 30a5c: ae ad ldd r26, Y+62 ; 0x3e 30a5e: bf ad ldd r27, Y+63 ; 0x3f 30a60: a8 97 sbiw r28, 0x28 ; 40 30a62: 11 96 adiw r26, 0x01 ; 1 30a64: 2d 91 ld r18, X+ 30a66: 3d 91 ld r19, X+ 30a68: 4d 91 ld r20, X+ 30a6a: 5c 91 ld r21, X 30a6c: 14 97 sbiw r26, 0x04 ; 4 30a6e: e4 96 adiw r28, 0x34 ; 52 30a70: 2c af std Y+60, r18 ; 0x3c 30a72: 3d af std Y+61, r19 ; 0x3d 30a74: 4e af std Y+62, r20 ; 0x3e 30a76: 5f af std Y+63, r21 ; 0x3f 30a78: e4 97 sbiw r28, 0x34 ; 52 30a7a: 15 96 adiw r26, 0x05 ; 5 30a7c: 4d 90 ld r4, X+ 30a7e: 5d 90 ld r5, X+ 30a80: 6d 90 ld r6, X+ 30a82: 7c 90 ld r7, X 30a84: 18 97 sbiw r26, 0x08 ; 8 for (uint8_t i = 0; i < npts; ++i) { { float j = (r == 0) ? 1.f : 30a86: 00 23 and r16, r16 30a88: 11 f4 brne .+4 ; 0x30a8e 30a8a: 0d 94 e9 8d jmp 0x31bd2 ; 0x31bd2 ((r == 1) ? 0.f : 30a8e: 81 2c mov r8, r1 30a90: 91 2c mov r9, r1 30a92: 54 01 movw r10, r8 30a94: 01 30 cpi r16, 0x01 ; 1 30a96: 81 f0 breq .+32 ; 0x30ab8 ((r == 2) ? (-s1 * measured_pts[2 * i]) : 30a98: 02 30 cpi r16, 0x02 ; 2 30a9a: 11 f0 breq .+4 ; 0x30aa0 30a9c: 0d 94 dd 8d jmp 0x31bba ; 0x31bba 30aa0: cf 57 subi r28, 0x7F ; 127 30aa2: df 4f sbci r29, 0xFF ; 255 30aa4: 68 81 ld r22, Y 30aa6: 79 81 ldd r23, Y+1 ; 0x01 30aa8: 8a 81 ldd r24, Y+2 ; 0x02 30aaa: 9b 81 ldd r25, Y+3 ; 0x03 30aac: c1 58 subi r28, 0x81 ; 129 30aae: d0 40 sbci r29, 0x00 ; 0 30ab0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30ab4: 4b 01 movw r8, r22 30ab6: 5c 01 movw r10, r24 (-c2 * measured_pts[2 * i + 1]))); float fx = c1 * measured_pts[2 * i] - s2 * measured_pts[2 * i + 1] + cntr[0] - pgm_read_float(true_pts + i * 2); 30ab8: e4 96 adiw r28, 0x34 ; 52 30aba: 2c ad ldd r18, Y+60 ; 0x3c 30abc: 3d ad ldd r19, Y+61 ; 0x3d 30abe: 4e ad ldd r20, Y+62 ; 0x3e 30ac0: 5f ad ldd r21, Y+63 ; 0x3f 30ac2: e4 97 sbiw r28, 0x34 ; 52 30ac4: 6e 96 adiw r28, 0x1e ; 30 30ac6: 6c ad ldd r22, Y+60 ; 0x3c 30ac8: 7d ad ldd r23, Y+61 ; 0x3d 30aca: 8e ad ldd r24, Y+62 ; 0x3e 30acc: 9f ad ldd r25, Y+63 ; 0x3f 30ace: 6e 97 sbiw r28, 0x1e ; 30 30ad0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30ad4: 6b 01 movw r12, r22 30ad6: 7c 01 movw r14, r24 30ad8: f1 01 movw r30, r2 30ada: 25 91 lpm r18, Z+ 30adc: 35 91 lpm r19, Z+ 30ade: 45 91 lpm r20, Z+ 30ae0: 54 91 lpm r21, Z 30ae2: cb 55 subi r28, 0x5B ; 91 30ae4: df 4f sbci r29, 0xFF ; 255 30ae6: 28 83 st Y, r18 30ae8: 39 83 std Y+1, r19 ; 0x01 30aea: 4a 83 std Y+2, r20 ; 0x02 30aec: 5b 83 std Y+3, r21 ; 0x03 30aee: c5 5a subi r28, 0xA5 ; 165 30af0: d0 40 sbci r29, 0x00 ; 0 30af2: a3 01 movw r20, r6 30af4: 92 01 movw r18, r4 30af6: cb 56 subi r28, 0x6B ; 107 30af8: df 4f sbci r29, 0xFF ; 255 30afa: 68 81 ld r22, Y 30afc: 79 81 ldd r23, Y+1 ; 0x01 30afe: 8a 81 ldd r24, Y+2 ; 0x02 30b00: 9b 81 ldd r25, Y+3 ; 0x03 30b02: c5 59 subi r28, 0x95 ; 149 30b04: d0 40 sbci r29, 0x00 ; 0 30b06: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30b0a: 9b 01 movw r18, r22 30b0c: ac 01 movw r20, r24 30b0e: c7 01 movw r24, r14 30b10: b6 01 movw r22, r12 30b12: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30b16: c5 55 subi r28, 0x55 ; 85 30b18: df 4f sbci r29, 0xFF ; 255 30b1a: 28 81 ld r18, Y 30b1c: 39 81 ldd r19, Y+1 ; 0x01 30b1e: 4a 81 ldd r20, Y+2 ; 0x02 30b20: 5b 81 ldd r21, Y+3 ; 0x03 30b22: cb 5a subi r28, 0xAB ; 171 30b24: d0 40 sbci r29, 0x00 ; 0 30b26: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30b2a: cb 55 subi r28, 0x5B ; 91 30b2c: df 4f sbci r29, 0xFF ; 255 30b2e: 28 81 ld r18, Y 30b30: 39 81 ldd r19, Y+1 ; 0x01 30b32: 4a 81 ldd r20, Y+2 ; 0x02 30b34: 5b 81 ldd r21, Y+3 ; 0x03 30b36: c5 5a subi r28, 0xA5 ; 165 30b38: d0 40 sbci r29, 0x00 ; 0 30b3a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += j * fx * w; 30b3e: a5 01 movw r20, r10 30b40: 94 01 movw r18, r8 30b42: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30b46: c3 57 subi r28, 0x73 ; 115 30b48: df 4f sbci r29, 0xFF ; 255 30b4a: 28 81 ld r18, Y 30b4c: cd 58 subi r28, 0x8D ; 141 30b4e: d0 40 sbci r29, 0x00 ; 0 30b50: c3 56 subi r28, 0x63 ; 99 30b52: df 4f sbci r29, 0xFF ; 255 30b54: 38 81 ld r19, Y 30b56: cd 59 subi r28, 0x9D ; 157 30b58: d0 40 sbci r29, 0x00 ; 0 30b5a: cf 55 subi r28, 0x5F ; 95 30b5c: df 4f sbci r29, 0xFF ; 255 30b5e: 48 81 ld r20, Y 30b60: c1 5a subi r28, 0xA1 ; 161 30b62: d0 40 sbci r29, 0x00 ; 0 30b64: 51 2f mov r21, r17 30b66: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30b6a: c3 57 subi r28, 0x73 ; 115 30b6c: df 4f sbci r29, 0xFF ; 255 30b6e: 68 83 st Y, r22 30b70: 79 83 std Y+1, r23 ; 0x01 30b72: 8a 83 std Y+2, r24 ; 0x02 30b74: 9b 83 std Y+3, r25 ; 0x03 30b76: cd 58 subi r28, 0x8D ; 141 30b78: d0 40 sbci r29, 0x00 ; 0 } { float j = (r == 0) ? 0.f : 30b7a: 00 23 and r16, r16 30b7c: 11 f4 brne .+4 ; 0x30b82 30b7e: 0d 94 f1 8d jmp 0x31be2 ; 0x31be2 ((r == 1) ? 1.f : 30b82: 01 30 cpi r16, 0x01 ; 1 30b84: 11 f4 brne .+4 ; 0x30b8a 30b86: 0d 94 f6 8d jmp 0x31bec ; 0x31bec ((r == 2) ? ( c1 * measured_pts[2 * i]) : 30b8a: 02 30 cpi r16, 0x02 ; 2 30b8c: 61 f0 breq .+24 ; 0x30ba6 30b8e: a3 01 movw r20, r6 30b90: 92 01 movw r18, r4 30b92: ed 96 adiw r28, 0x3d ; 61 30b94: 6c ad ldd r22, Y+60 ; 0x3c 30b96: 7d ad ldd r23, Y+61 ; 0x3d 30b98: 8e ad ldd r24, Y+62 ; 0x3e 30b9a: 9f ad ldd r25, Y+63 ; 0x3f 30b9c: ed 97 sbiw r28, 0x3d ; 61 30b9e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30ba2: 6b 01 movw r12, r22 30ba4: 7c 01 movw r14, r24 (-s2 * measured_pts[2 * i + 1]))); float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1); 30ba6: f1 01 movw r30, r2 30ba8: 34 96 adiw r30, 0x04 ; 4 30baa: 85 90 lpm r8, Z+ 30bac: 95 90 lpm r9, Z+ 30bae: a5 90 lpm r10, Z+ 30bb0: b4 90 lpm r11, Z 30bb2: e4 96 adiw r28, 0x34 ; 52 30bb4: 2c ad ldd r18, Y+60 ; 0x3c 30bb6: 3d ad ldd r19, Y+61 ; 0x3d 30bb8: 4e ad ldd r20, Y+62 ; 0x3e 30bba: 5f ad ldd r21, Y+63 ; 0x3f 30bbc: e4 97 sbiw r28, 0x34 ; 52 30bbe: cb 57 subi r28, 0x7B ; 123 30bc0: df 4f sbci r29, 0xFF ; 255 30bc2: 68 81 ld r22, Y 30bc4: 79 81 ldd r23, Y+1 ; 0x01 30bc6: 8a 81 ldd r24, Y+2 ; 0x02 30bc8: 9b 81 ldd r25, Y+3 ; 0x03 30bca: c5 58 subi r28, 0x85 ; 133 30bcc: d0 40 sbci r29, 0x00 ; 0 30bce: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30bd2: e4 96 adiw r28, 0x34 ; 52 30bd4: 6c af std Y+60, r22 ; 0x3c 30bd6: 7d af std Y+61, r23 ; 0x3d 30bd8: 8e af std Y+62, r24 ; 0x3e 30bda: 9f af std Y+63, r25 ; 0x3f 30bdc: e4 97 sbiw r28, 0x34 ; 52 30bde: a3 01 movw r20, r6 30be0: 92 01 movw r18, r4 30be2: c7 57 subi r28, 0x77 ; 119 30be4: df 4f sbci r29, 0xFF ; 255 30be6: 68 81 ld r22, Y 30be8: 79 81 ldd r23, Y+1 ; 0x01 30bea: 8a 81 ldd r24, Y+2 ; 0x02 30bec: 9b 81 ldd r25, Y+3 ; 0x03 30bee: c9 58 subi r28, 0x89 ; 137 30bf0: d0 40 sbci r29, 0x00 ; 0 30bf2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30bf6: 9b 01 movw r18, r22 30bf8: ac 01 movw r20, r24 30bfa: e4 96 adiw r28, 0x34 ; 52 30bfc: 6c ad ldd r22, Y+60 ; 0x3c 30bfe: 7d ad ldd r23, Y+61 ; 0x3d 30c00: 8e ad ldd r24, Y+62 ; 0x3e 30c02: 9f ad ldd r25, Y+63 ; 0x3f 30c04: e4 97 sbiw r28, 0x34 ; 52 30c06: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30c0a: c1 55 subi r28, 0x51 ; 81 30c0c: df 4f sbci r29, 0xFF ; 255 30c0e: 28 81 ld r18, Y 30c10: 39 81 ldd r19, Y+1 ; 0x01 30c12: 4a 81 ldd r20, Y+2 ; 0x02 30c14: 5b 81 ldd r21, Y+3 ; 0x03 30c16: cf 5a subi r28, 0xAF ; 175 30c18: d0 40 sbci r29, 0x00 ; 0 30c1a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30c1e: a5 01 movw r20, r10 30c20: 94 01 movw r18, r8 30c22: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += j * fy * w; 30c26: a7 01 movw r20, r14 30c28: 96 01 movw r18, r12 30c2a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30c2e: c3 57 subi r28, 0x73 ; 115 30c30: df 4f sbci r29, 0xFF ; 255 30c32: 28 81 ld r18, Y 30c34: 39 81 ldd r19, Y+1 ; 0x01 30c36: 4a 81 ldd r20, Y+2 ; 0x02 30c38: 5b 81 ldd r21, Y+3 ; 0x03 30c3a: cd 58 subi r28, 0x8D ; 141 30c3c: d0 40 sbci r29, 0x00 ; 0 30c3e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 30c42: c3 57 subi r28, 0x73 ; 115 30c44: df 4f sbci r29, 0xFF ; 255 30c46: 68 83 st Y, r22 30c48: cd 58 subi r28, 0x8D ; 141 30c4a: d0 40 sbci r29, 0x00 ; 0 30c4c: c3 56 subi r28, 0x63 ; 99 30c4e: df 4f sbci r29, 0xFF ; 255 30c50: 78 83 st Y, r23 30c52: cd 59 subi r28, 0x9D ; 157 30c54: d0 40 sbci r29, 0x00 ; 0 30c56: cf 55 subi r28, 0x5F ; 95 30c58: df 4f sbci r29, 0xFF ; 255 30c5a: 88 83 st Y, r24 30c5c: c1 5a subi r28, 0xA1 ; 161 30c5e: d0 40 sbci r29, 0x00 ; 0 30c60: 19 2f mov r17, r25 30c62: a8 96 adiw r28, 0x28 ; 40 30c64: 4e ad ldd r20, Y+62 ; 0x3e 30c66: 5f ad ldd r21, Y+63 ; 0x3f 30c68: a8 97 sbiw r28, 0x28 ; 40 30c6a: 48 5f subi r20, 0xF8 ; 248 30c6c: 5f 4f sbci r21, 0xFF ; 255 30c6e: a8 96 adiw r28, 0x28 ; 40 30c70: 5f af std Y+63, r21 ; 0x3f 30c72: 4e af std Y+62, r20 ; 0x3e 30c74: a8 97 sbiw r28, 0x28 ; 40 30c76: 58 e0 ldi r21, 0x08 ; 8 30c78: 25 0e add r2, r21 30c7a: 31 1c adc r3, r1 } A[r][c] = acc; } // J^T times f(x) acc = 0.f; for (uint8_t i = 0; i < npts; ++i) { 30c7c: a9 e2 ldi r26, 0x29 ; 41 30c7e: b3 e1 ldi r27, 0x13 ; 19 30c80: a8 96 adiw r28, 0x28 ; 40 30c82: ee ad ldd r30, Y+62 ; 0x3e 30c84: ff ad ldd r31, Y+63 ; 0x3f 30c86: a8 97 sbiw r28, 0x28 ; 40 30c88: ae 17 cp r26, r30 30c8a: bf 07 cpc r27, r31 30c8c: 09 f0 breq .+2 ; 0x30c90 30c8e: e5 ce rjmp .-566 ; 0x30a5a float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1); float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += j * fy * w; } } b[r] = -acc; 30c90: 90 58 subi r25, 0x80 ; 128 30c92: c7 56 subi r28, 0x67 ; 103 30c94: df 4f sbci r29, 0xFF ; 255 30c96: a8 81 ld r26, Y 30c98: b9 81 ldd r27, Y+1 ; 0x01 30c9a: c9 59 subi r28, 0x99 ; 153 30c9c: d0 40 sbci r29, 0x00 ; 0 30c9e: 6d 93 st X+, r22 30ca0: 7d 93 st X+, r23 30ca2: 8d 93 st X+, r24 30ca4: 9d 93 st X+, r25 30ca6: c7 56 subi r28, 0x67 ; 103 30ca8: df 4f sbci r29, 0xFF ; 255 30caa: b9 83 std Y+1, r27 ; 0x01 30cac: a8 83 st Y, r26 30cae: c9 59 subi r28, 0x99 ; 153 30cb0: d0 40 sbci r29, 0x00 ; 0 // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; float b[4] = { 0.f }; float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity for (uint8_t r = 0; r < 4; ++r) { 30cb2: 0f 5f subi r16, 0xFF ; 255 30cb4: ac 96 adiw r28, 0x2c ; 44 30cb6: ee ad ldd r30, Y+62 ; 0x3e 30cb8: ff ad ldd r31, Y+63 ; 0x3f 30cba: ac 97 sbiw r28, 0x2c ; 44 30cbc: 70 96 adiw r30, 0x10 ; 16 30cbe: ac 96 adiw r28, 0x2c ; 44 30cc0: ff af std Y+63, r31 ; 0x3f 30cc2: ee af std Y+62, r30 ; 0x3e 30cc4: ac 97 sbiw r28, 0x2c ; 44 30cc6: 04 30 cpi r16, 0x04 ; 4 30cc8: 09 f0 breq .+2 ; 0x30ccc 30cca: 21 ce rjmp .-958 ; 0x3090e } // Solve for h by a Gauss iteration method. float h[4] = { 0.f }; for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) { h[0] = (b[0] - A[0][1] * h[1] - A[0][2] * h[2] - A[0][3] * h[3]) / A[0][0]; 30ccc: 25 96 adiw r28, 0x05 ; 5 30cce: 2c ad ldd r18, Y+60 ; 0x3c 30cd0: 3d ad ldd r19, Y+61 ; 0x3d 30cd2: 4e ad ldd r20, Y+62 ; 0x3e 30cd4: 5f ad ldd r21, Y+63 ; 0x3f 30cd6: 25 97 sbiw r28, 0x05 ; 5 30cd8: ae 96 adiw r28, 0x2e ; 46 30cda: 2c af std Y+60, r18 ; 0x3c 30cdc: 3d af std Y+61, r19 ; 0x3d 30cde: 4e af std Y+62, r20 ; 0x3e 30ce0: 5f af std Y+63, r21 ; 0x3f 30ce2: ae 97 sbiw r28, 0x2e ; 46 30ce4: 8d 81 ldd r24, Y+5 ; 0x05 30ce6: 9e 81 ldd r25, Y+6 ; 0x06 30ce8: af 81 ldd r26, Y+7 ; 0x07 30cea: b8 85 ldd r27, Y+8 ; 0x08 30cec: e4 96 adiw r28, 0x34 ; 52 30cee: 8c af std Y+60, r24 ; 0x3c 30cf0: 9d af std Y+61, r25 ; 0x3d 30cf2: ae af std Y+62, r26 ; 0x3e 30cf4: bf af std Y+63, r27 ; 0x3f 30cf6: e4 97 sbiw r28, 0x34 ; 52 30cf8: 29 85 ldd r18, Y+9 ; 0x09 30cfa: 3a 85 ldd r19, Y+10 ; 0x0a 30cfc: 4b 85 ldd r20, Y+11 ; 0x0b 30cfe: 5c 85 ldd r21, Y+12 ; 0x0c 30d00: ed 96 adiw r28, 0x3d ; 61 30d02: 2c af std Y+60, r18 ; 0x3c 30d04: 3d af std Y+61, r19 ; 0x3d 30d06: 4e af std Y+62, r20 ; 0x3e 30d08: 5f af std Y+63, r21 ; 0x3f 30d0a: ed 97 sbiw r28, 0x3d ; 61 30d0c: 8d 85 ldd r24, Y+13 ; 0x0d 30d0e: 9e 85 ldd r25, Y+14 ; 0x0e 30d10: af 85 ldd r26, Y+15 ; 0x0f 30d12: b8 89 ldd r27, Y+16 ; 0x10 30d14: c3 58 subi r28, 0x83 ; 131 30d16: df 4f sbci r29, 0xFF ; 255 30d18: 88 83 st Y, r24 30d1a: 99 83 std Y+1, r25 ; 0x01 30d1c: aa 83 std Y+2, r26 ; 0x02 30d1e: bb 83 std Y+3, r27 ; 0x03 30d20: cd 57 subi r28, 0x7D ; 125 30d22: d0 40 sbci r29, 0x00 ; 0 30d24: 29 81 ldd r18, Y+1 ; 0x01 30d26: 3a 81 ldd r19, Y+2 ; 0x02 30d28: 4b 81 ldd r20, Y+3 ; 0x03 30d2a: 5c 81 ldd r21, Y+4 ; 0x04 30d2c: cf 57 subi r28, 0x7F ; 127 30d2e: df 4f sbci r29, 0xFF ; 255 30d30: 28 83 st Y, r18 30d32: 39 83 std Y+1, r19 ; 0x01 30d34: 4a 83 std Y+2, r20 ; 0x02 30d36: 5b 83 std Y+3, r21 ; 0x03 30d38: c1 58 subi r28, 0x81 ; 129 30d3a: d0 40 sbci r29, 0x00 ; 0 h[1] = (b[1] - A[1][0] * h[0] - A[1][2] * h[2] - A[1][3] * h[3]) / A[1][1]; 30d3c: 29 96 adiw r28, 0x09 ; 9 30d3e: 8c ad ldd r24, Y+60 ; 0x3c 30d40: 9d ad ldd r25, Y+61 ; 0x3d 30d42: ae ad ldd r26, Y+62 ; 0x3e 30d44: bf ad ldd r27, Y+63 ; 0x3f 30d46: 29 97 sbiw r28, 0x09 ; 9 30d48: cb 57 subi r28, 0x7B ; 123 30d4a: df 4f sbci r29, 0xFF ; 255 30d4c: 88 83 st Y, r24 30d4e: 99 83 std Y+1, r25 ; 0x01 30d50: aa 83 std Y+2, r26 ; 0x02 30d52: bb 83 std Y+3, r27 ; 0x03 30d54: c5 58 subi r28, 0x85 ; 133 30d56: d0 40 sbci r29, 0x00 ; 0 30d58: 29 89 ldd r18, Y+17 ; 0x11 30d5a: 3a 89 ldd r19, Y+18 ; 0x12 30d5c: 4b 89 ldd r20, Y+19 ; 0x13 30d5e: 5c 89 ldd r21, Y+20 ; 0x14 30d60: c7 57 subi r28, 0x77 ; 119 30d62: df 4f sbci r29, 0xFF ; 255 30d64: 28 83 st Y, r18 30d66: 39 83 std Y+1, r19 ; 0x01 30d68: 4a 83 std Y+2, r20 ; 0x02 30d6a: 5b 83 std Y+3, r21 ; 0x03 30d6c: c9 58 subi r28, 0x89 ; 137 30d6e: d0 40 sbci r29, 0x00 ; 0 30d70: 89 8d ldd r24, Y+25 ; 0x19 30d72: 9a 8d ldd r25, Y+26 ; 0x1a 30d74: ab 8d ldd r26, Y+27 ; 0x1b 30d76: bc 8d ldd r27, Y+28 ; 0x1c 30d78: cb 56 subi r28, 0x6B ; 107 30d7a: df 4f sbci r29, 0xFF ; 255 30d7c: 88 83 st Y, r24 30d7e: 99 83 std Y+1, r25 ; 0x01 30d80: aa 83 std Y+2, r26 ; 0x02 30d82: bb 83 std Y+3, r27 ; 0x03 30d84: c5 59 subi r28, 0x95 ; 149 30d86: d0 40 sbci r29, 0x00 ; 0 30d88: 2d 8d ldd r18, Y+29 ; 0x1d 30d8a: 3e 8d ldd r19, Y+30 ; 0x1e 30d8c: 4f 8d ldd r20, Y+31 ; 0x1f 30d8e: 58 a1 ldd r21, Y+32 ; 0x20 30d90: c7 56 subi r28, 0x67 ; 103 30d92: df 4f sbci r29, 0xFF ; 255 30d94: 28 83 st Y, r18 30d96: 39 83 std Y+1, r19 ; 0x01 30d98: 4a 83 std Y+2, r20 ; 0x02 30d9a: 5b 83 std Y+3, r21 ; 0x03 30d9c: c9 59 subi r28, 0x99 ; 153 30d9e: d0 40 sbci r29, 0x00 ; 0 30da0: 8d 89 ldd r24, Y+21 ; 0x15 30da2: 9e 89 ldd r25, Y+22 ; 0x16 30da4: af 89 ldd r26, Y+23 ; 0x17 30da6: b8 8d ldd r27, Y+24 ; 0x18 30da8: c3 57 subi r28, 0x73 ; 115 30daa: df 4f sbci r29, 0xFF ; 255 30dac: 88 83 st Y, r24 30dae: 99 83 std Y+1, r25 ; 0x01 30db0: aa 83 std Y+2, r26 ; 0x02 30db2: bb 83 std Y+3, r27 ; 0x03 30db4: cd 58 subi r28, 0x8D ; 141 30db6: d0 40 sbci r29, 0x00 ; 0 h[2] = (b[2] - A[2][0] * h[0] - A[2][1] * h[1] - A[2][3] * h[3]) / A[2][2]; 30db8: 2d 96 adiw r28, 0x0d ; 13 30dba: 2c ad ldd r18, Y+60 ; 0x3c 30dbc: 3d ad ldd r19, Y+61 ; 0x3d 30dbe: 4e ad ldd r20, Y+62 ; 0x3e 30dc0: 5f ad ldd r21, Y+63 ; 0x3f 30dc2: 2d 97 sbiw r28, 0x0d ; 13 30dc4: c3 56 subi r28, 0x63 ; 99 30dc6: df 4f sbci r29, 0xFF ; 255 30dc8: 28 83 st Y, r18 30dca: 39 83 std Y+1, r19 ; 0x01 30dcc: 4a 83 std Y+2, r20 ; 0x02 30dce: 5b 83 std Y+3, r21 ; 0x03 30dd0: cd 59 subi r28, 0x9D ; 157 30dd2: d0 40 sbci r29, 0x00 ; 0 30dd4: 89 a1 ldd r24, Y+33 ; 0x21 30dd6: 9a a1 ldd r25, Y+34 ; 0x22 30dd8: ab a1 ldd r26, Y+35 ; 0x23 30dda: bc a1 ldd r27, Y+36 ; 0x24 30ddc: cf 55 subi r28, 0x5F ; 95 30dde: df 4f sbci r29, 0xFF ; 255 30de0: 88 83 st Y, r24 30de2: 99 83 std Y+1, r25 ; 0x01 30de4: aa 83 std Y+2, r26 ; 0x02 30de6: bb 83 std Y+3, r27 ; 0x03 30de8: c1 5a subi r28, 0xA1 ; 161 30dea: d0 40 sbci r29, 0x00 ; 0 30dec: 2d a1 ldd r18, Y+37 ; 0x25 30dee: 3e a1 ldd r19, Y+38 ; 0x26 30df0: 4f a1 ldd r20, Y+39 ; 0x27 30df2: 58 a5 ldd r21, Y+40 ; 0x28 30df4: cb 55 subi r28, 0x5B ; 91 30df6: df 4f sbci r29, 0xFF ; 255 30df8: 28 83 st Y, r18 30dfa: 39 83 std Y+1, r19 ; 0x01 30dfc: 4a 83 std Y+2, r20 ; 0x02 30dfe: 5b 83 std Y+3, r21 ; 0x03 30e00: c5 5a subi r28, 0xA5 ; 165 30e02: d0 40 sbci r29, 0x00 ; 0 30e04: 8d a5 ldd r24, Y+45 ; 0x2d 30e06: 9e a5 ldd r25, Y+46 ; 0x2e 30e08: af a5 ldd r26, Y+47 ; 0x2f 30e0a: b8 a9 ldd r27, Y+48 ; 0x30 30e0c: cd 54 subi r28, 0x4D ; 77 30e0e: df 4f sbci r29, 0xFF ; 255 30e10: 88 83 st Y, r24 30e12: 99 83 std Y+1, r25 ; 0x01 30e14: aa 83 std Y+2, r26 ; 0x02 30e16: bb 83 std Y+3, r27 ; 0x03 30e18: c3 5b subi r28, 0xB3 ; 179 30e1a: d0 40 sbci r29, 0x00 ; 0 30e1c: 29 a5 ldd r18, Y+41 ; 0x29 30e1e: 3a a5 ldd r19, Y+42 ; 0x2a 30e20: 4b a5 ldd r20, Y+43 ; 0x2b 30e22: 5c a5 ldd r21, Y+44 ; 0x2c 30e24: c9 54 subi r28, 0x49 ; 73 30e26: df 4f sbci r29, 0xFF ; 255 30e28: 28 83 st Y, r18 30e2a: 39 83 std Y+1, r19 ; 0x01 30e2c: 4a 83 std Y+2, r20 ; 0x02 30e2e: 5b 83 std Y+3, r21 ; 0x03 30e30: c7 5b subi r28, 0xB7 ; 183 30e32: d0 40 sbci r29, 0x00 ; 0 h[3] = (b[3] - A[3][0] * h[0] - A[3][1] * h[1] - A[3][2] * h[2]) / A[3][3]; 30e34: 61 96 adiw r28, 0x11 ; 17 30e36: 8c ad ldd r24, Y+60 ; 0x3c 30e38: 9d ad ldd r25, Y+61 ; 0x3d 30e3a: ae ad ldd r26, Y+62 ; 0x3e 30e3c: bf ad ldd r27, Y+63 ; 0x3f 30e3e: 61 97 sbiw r28, 0x11 ; 17 30e40: c5 54 subi r28, 0x45 ; 69 30e42: df 4f sbci r29, 0xFF ; 255 30e44: 88 83 st Y, r24 30e46: 99 83 std Y+1, r25 ; 0x01 30e48: aa 83 std Y+2, r26 ; 0x02 30e4a: bb 83 std Y+3, r27 ; 0x03 30e4c: cb 5b subi r28, 0xBB ; 187 30e4e: d0 40 sbci r29, 0x00 ; 0 30e50: 29 a9 ldd r18, Y+49 ; 0x31 30e52: 3a a9 ldd r19, Y+50 ; 0x32 30e54: 4b a9 ldd r20, Y+51 ; 0x33 30e56: 5c a9 ldd r21, Y+52 ; 0x34 30e58: c1 54 subi r28, 0x41 ; 65 30e5a: df 4f sbci r29, 0xFF ; 255 30e5c: 28 83 st Y, r18 30e5e: 39 83 std Y+1, r19 ; 0x01 30e60: 4a 83 std Y+2, r20 ; 0x02 30e62: 5b 83 std Y+3, r21 ; 0x03 30e64: cf 5b subi r28, 0xBF ; 191 30e66: d0 40 sbci r29, 0x00 ; 0 30e68: 8d a9 ldd r24, Y+53 ; 0x35 30e6a: 9e a9 ldd r25, Y+54 ; 0x36 30e6c: af a9 ldd r26, Y+55 ; 0x37 30e6e: b8 ad ldd r27, Y+56 ; 0x38 30e70: cd 53 subi r28, 0x3D ; 61 30e72: df 4f sbci r29, 0xFF ; 255 30e74: 88 83 st Y, r24 30e76: 99 83 std Y+1, r25 ; 0x01 30e78: aa 83 std Y+2, r26 ; 0x02 30e7a: bb 83 std Y+3, r27 ; 0x03 30e7c: c3 5c subi r28, 0xC3 ; 195 30e7e: d0 40 sbci r29, 0x00 ; 0 30e80: 29 ad ldd r18, Y+57 ; 0x39 30e82: 3a ad ldd r19, Y+58 ; 0x3a 30e84: 4b ad ldd r20, Y+59 ; 0x3b 30e86: 5c ad ldd r21, Y+60 ; 0x3c 30e88: c9 53 subi r28, 0x39 ; 57 30e8a: df 4f sbci r29, 0xFF ; 255 30e8c: 28 83 st Y, r18 30e8e: 39 83 std Y+1, r19 ; 0x01 30e90: 4a 83 std Y+2, r20 ; 0x02 30e92: 5b 83 std Y+3, r21 ; 0x03 30e94: c7 5c subi r28, 0xC7 ; 199 30e96: d0 40 sbci r29, 0x00 ; 0 30e98: 21 96 adiw r28, 0x01 ; 1 30e9a: 8c ad ldd r24, Y+60 ; 0x3c 30e9c: 9d ad ldd r25, Y+61 ; 0x3d 30e9e: ae ad ldd r26, Y+62 ; 0x3e 30ea0: bf ad ldd r27, Y+63 ; 0x3f 30ea2: 21 97 sbiw r28, 0x01 ; 1 30ea4: c5 53 subi r28, 0x35 ; 53 30ea6: df 4f sbci r29, 0xFF ; 255 30ea8: 88 83 st Y, r24 30eaa: 99 83 std Y+1, r25 ; 0x01 30eac: aa 83 std Y+2, r26 ; 0x02 30eae: bb 83 std Y+3, r27 ; 0x03 30eb0: cb 5c subi r28, 0xCB ; 203 30eb2: d0 40 sbci r29, 0x00 ; 0 30eb4: 14 e6 ldi r17, 0x64 ; 100 } b[r] = -acc; } // Solve for h by a Gauss iteration method. float h[4] = { 0.f }; 30eb6: c1 2c mov r12, r1 30eb8: d1 2c mov r13, r1 30eba: 76 01 movw r14, r12 30ebc: 46 01 movw r8, r12 30ebe: 57 01 movw r10, r14 30ec0: 26 01 movw r4, r12 30ec2: 37 01 movw r6, r14 for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) { h[0] = (b[0] - A[0][1] * h[1] - A[0][2] * h[2] - A[0][3] * h[3]) / A[0][0]; 30ec4: a3 01 movw r20, r6 30ec6: 92 01 movw r18, r4 30ec8: e4 96 adiw r28, 0x34 ; 52 30eca: 6c ad ldd r22, Y+60 ; 0x3c 30ecc: 7d ad ldd r23, Y+61 ; 0x3d 30ece: 8e ad ldd r24, Y+62 ; 0x3e 30ed0: 9f ad ldd r25, Y+63 ; 0x3f 30ed2: e4 97 sbiw r28, 0x34 ; 52 30ed4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30ed8: 9b 01 movw r18, r22 30eda: ac 01 movw r20, r24 30edc: ae 96 adiw r28, 0x2e ; 46 30ede: 6c ad ldd r22, Y+60 ; 0x3c 30ee0: 7d ad ldd r23, Y+61 ; 0x3d 30ee2: 8e ad ldd r24, Y+62 ; 0x3e 30ee4: 9f ad ldd r25, Y+63 ; 0x3f 30ee6: ae 97 sbiw r28, 0x2e ; 46 30ee8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30eec: 2b 01 movw r4, r22 30eee: 3c 01 movw r6, r24 30ef0: a5 01 movw r20, r10 30ef2: 94 01 movw r18, r8 30ef4: ed 96 adiw r28, 0x3d ; 61 30ef6: 6c ad ldd r22, Y+60 ; 0x3c 30ef8: 7d ad ldd r23, Y+61 ; 0x3d 30efa: 8e ad ldd r24, Y+62 ; 0x3e 30efc: 9f ad ldd r25, Y+63 ; 0x3f 30efe: ed 97 sbiw r28, 0x3d ; 61 30f00: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30f04: 9b 01 movw r18, r22 30f06: ac 01 movw r20, r24 30f08: c3 01 movw r24, r6 30f0a: b2 01 movw r22, r4 30f0c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30f10: 2b 01 movw r4, r22 30f12: 3c 01 movw r6, r24 30f14: a7 01 movw r20, r14 30f16: 96 01 movw r18, r12 30f18: c3 58 subi r28, 0x83 ; 131 30f1a: df 4f sbci r29, 0xFF ; 255 30f1c: 68 81 ld r22, Y 30f1e: 79 81 ldd r23, Y+1 ; 0x01 30f20: 8a 81 ldd r24, Y+2 ; 0x02 30f22: 9b 81 ldd r25, Y+3 ; 0x03 30f24: cd 57 subi r28, 0x7D ; 125 30f26: d0 40 sbci r29, 0x00 ; 0 30f28: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30f2c: 9b 01 movw r18, r22 30f2e: ac 01 movw r20, r24 30f30: c3 01 movw r24, r6 30f32: b2 01 movw r22, r4 30f34: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30f38: cf 57 subi r28, 0x7F ; 127 30f3a: df 4f sbci r29, 0xFF ; 255 30f3c: 28 81 ld r18, Y 30f3e: 39 81 ldd r19, Y+1 ; 0x01 30f40: 4a 81 ldd r20, Y+2 ; 0x02 30f42: 5b 81 ldd r21, Y+3 ; 0x03 30f44: c1 58 subi r28, 0x81 ; 129 30f46: d0 40 sbci r29, 0x00 ; 0 30f48: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 30f4c: 6e 96 adiw r28, 0x1e ; 30 30f4e: 6c af std Y+60, r22 ; 0x3c 30f50: 7d af std Y+61, r23 ; 0x3d 30f52: 8e af std Y+62, r24 ; 0x3e 30f54: 9f af std Y+63, r25 ; 0x3f 30f56: 6e 97 sbiw r28, 0x1e ; 30 h[1] = (b[1] - A[1][0] * h[0] - A[1][2] * h[2] - A[1][3] * h[3]) / A[1][1]; 30f58: c7 57 subi r28, 0x77 ; 119 30f5a: df 4f sbci r29, 0xFF ; 255 30f5c: 28 81 ld r18, Y 30f5e: 39 81 ldd r19, Y+1 ; 0x01 30f60: 4a 81 ldd r20, Y+2 ; 0x02 30f62: 5b 81 ldd r21, Y+3 ; 0x03 30f64: c9 58 subi r28, 0x89 ; 137 30f66: d0 40 sbci r29, 0x00 ; 0 30f68: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30f6c: 9b 01 movw r18, r22 30f6e: ac 01 movw r20, r24 30f70: cb 57 subi r28, 0x7B ; 123 30f72: df 4f sbci r29, 0xFF ; 255 30f74: 68 81 ld r22, Y 30f76: 79 81 ldd r23, Y+1 ; 0x01 30f78: 8a 81 ldd r24, Y+2 ; 0x02 30f7a: 9b 81 ldd r25, Y+3 ; 0x03 30f7c: c5 58 subi r28, 0x85 ; 133 30f7e: d0 40 sbci r29, 0x00 ; 0 30f80: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30f84: 2b 01 movw r4, r22 30f86: 3c 01 movw r6, r24 30f88: a5 01 movw r20, r10 30f8a: 94 01 movw r18, r8 30f8c: cb 56 subi r28, 0x6B ; 107 30f8e: df 4f sbci r29, 0xFF ; 255 30f90: 68 81 ld r22, Y 30f92: 79 81 ldd r23, Y+1 ; 0x01 30f94: 8a 81 ldd r24, Y+2 ; 0x02 30f96: 9b 81 ldd r25, Y+3 ; 0x03 30f98: c5 59 subi r28, 0x95 ; 149 30f9a: d0 40 sbci r29, 0x00 ; 0 30f9c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30fa0: 9b 01 movw r18, r22 30fa2: ac 01 movw r20, r24 30fa4: c3 01 movw r24, r6 30fa6: b2 01 movw r22, r4 30fa8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30fac: 4b 01 movw r8, r22 30fae: 5c 01 movw r10, r24 30fb0: a7 01 movw r20, r14 30fb2: 96 01 movw r18, r12 30fb4: c7 56 subi r28, 0x67 ; 103 30fb6: df 4f sbci r29, 0xFF ; 255 30fb8: 68 81 ld r22, Y 30fba: 79 81 ldd r23, Y+1 ; 0x01 30fbc: 8a 81 ldd r24, Y+2 ; 0x02 30fbe: 9b 81 ldd r25, Y+3 ; 0x03 30fc0: c9 59 subi r28, 0x99 ; 153 30fc2: d0 40 sbci r29, 0x00 ; 0 30fc4: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 30fc8: 9b 01 movw r18, r22 30fca: ac 01 movw r20, r24 30fcc: c5 01 movw r24, r10 30fce: b4 01 movw r22, r8 30fd0: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 30fd4: c3 57 subi r28, 0x73 ; 115 30fd6: df 4f sbci r29, 0xFF ; 255 30fd8: 28 81 ld r18, Y 30fda: 39 81 ldd r19, Y+1 ; 0x01 30fdc: 4a 81 ldd r20, Y+2 ; 0x02 30fde: 5b 81 ldd r21, Y+3 ; 0x03 30fe0: cd 58 subi r28, 0x8D ; 141 30fe2: d0 40 sbci r29, 0x00 ; 0 30fe4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 30fe8: 2b 01 movw r4, r22 30fea: 3c 01 movw r6, r24 h[2] = (b[2] - A[2][0] * h[0] - A[2][1] * h[1] - A[2][3] * h[3]) / A[2][2]; 30fec: cf 55 subi r28, 0x5F ; 95 30fee: df 4f sbci r29, 0xFF ; 255 30ff0: 28 81 ld r18, Y 30ff2: 39 81 ldd r19, Y+1 ; 0x01 30ff4: 4a 81 ldd r20, Y+2 ; 0x02 30ff6: 5b 81 ldd r21, Y+3 ; 0x03 30ff8: c1 5a subi r28, 0xA1 ; 161 30ffa: d0 40 sbci r29, 0x00 ; 0 30ffc: 6e 96 adiw r28, 0x1e ; 30 30ffe: 6c ad ldd r22, Y+60 ; 0x3c 31000: 7d ad ldd r23, Y+61 ; 0x3d 31002: 8e ad ldd r24, Y+62 ; 0x3e 31004: 9f ad ldd r25, Y+63 ; 0x3f 31006: 6e 97 sbiw r28, 0x1e ; 30 31008: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3100c: 9b 01 movw r18, r22 3100e: ac 01 movw r20, r24 31010: c3 56 subi r28, 0x63 ; 99 31012: df 4f sbci r29, 0xFF ; 255 31014: 68 81 ld r22, Y 31016: 79 81 ldd r23, Y+1 ; 0x01 31018: 8a 81 ldd r24, Y+2 ; 0x02 3101a: 9b 81 ldd r25, Y+3 ; 0x03 3101c: cd 59 subi r28, 0x9D ; 157 3101e: d0 40 sbci r29, 0x00 ; 0 31020: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 31024: 4b 01 movw r8, r22 31026: 5c 01 movw r10, r24 31028: cb 55 subi r28, 0x5B ; 91 3102a: df 4f sbci r29, 0xFF ; 255 3102c: 28 81 ld r18, Y 3102e: 39 81 ldd r19, Y+1 ; 0x01 31030: 4a 81 ldd r20, Y+2 ; 0x02 31032: 5b 81 ldd r21, Y+3 ; 0x03 31034: c5 5a subi r28, 0xA5 ; 165 31036: d0 40 sbci r29, 0x00 ; 0 31038: c3 01 movw r24, r6 3103a: b2 01 movw r22, r4 3103c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31040: 9b 01 movw r18, r22 31042: ac 01 movw r20, r24 31044: c5 01 movw r24, r10 31046: b4 01 movw r22, r8 31048: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 3104c: 4b 01 movw r8, r22 3104e: 5c 01 movw r10, r24 31050: a7 01 movw r20, r14 31052: 96 01 movw r18, r12 31054: cd 54 subi r28, 0x4D ; 77 31056: df 4f sbci r29, 0xFF ; 255 31058: 68 81 ld r22, Y 3105a: 79 81 ldd r23, Y+1 ; 0x01 3105c: 8a 81 ldd r24, Y+2 ; 0x02 3105e: 9b 81 ldd r25, Y+3 ; 0x03 31060: c3 5b subi r28, 0xB3 ; 179 31062: d0 40 sbci r29, 0x00 ; 0 31064: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31068: 9b 01 movw r18, r22 3106a: ac 01 movw r20, r24 3106c: c5 01 movw r24, r10 3106e: b4 01 movw r22, r8 31070: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 31074: c9 54 subi r28, 0x49 ; 73 31076: df 4f sbci r29, 0xFF ; 255 31078: 28 81 ld r18, Y 3107a: 39 81 ldd r19, Y+1 ; 0x01 3107c: 4a 81 ldd r20, Y+2 ; 0x02 3107e: 5b 81 ldd r21, Y+3 ; 0x03 31080: c7 5b subi r28, 0xB7 ; 183 31082: d0 40 sbci r29, 0x00 ; 0 31084: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 31088: 4b 01 movw r8, r22 3108a: 5c 01 movw r10, r24 h[3] = (b[3] - A[3][0] * h[0] - A[3][1] * h[1] - A[3][2] * h[2]) / A[3][3]; 3108c: c1 54 subi r28, 0x41 ; 65 3108e: df 4f sbci r29, 0xFF ; 255 31090: 28 81 ld r18, Y 31092: 39 81 ldd r19, Y+1 ; 0x01 31094: 4a 81 ldd r20, Y+2 ; 0x02 31096: 5b 81 ldd r21, Y+3 ; 0x03 31098: cf 5b subi r28, 0xBF ; 191 3109a: d0 40 sbci r29, 0x00 ; 0 3109c: 6e 96 adiw r28, 0x1e ; 30 3109e: 6c ad ldd r22, Y+60 ; 0x3c 310a0: 7d ad ldd r23, Y+61 ; 0x3d 310a2: 8e ad ldd r24, Y+62 ; 0x3e 310a4: 9f ad ldd r25, Y+63 ; 0x3f 310a6: 6e 97 sbiw r28, 0x1e ; 30 310a8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 310ac: 9b 01 movw r18, r22 310ae: ac 01 movw r20, r24 310b0: c5 54 subi r28, 0x45 ; 69 310b2: df 4f sbci r29, 0xFF ; 255 310b4: 68 81 ld r22, Y 310b6: 79 81 ldd r23, Y+1 ; 0x01 310b8: 8a 81 ldd r24, Y+2 ; 0x02 310ba: 9b 81 ldd r25, Y+3 ; 0x03 310bc: cb 5b subi r28, 0xBB ; 187 310be: d0 40 sbci r29, 0x00 ; 0 310c0: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 310c4: 6b 01 movw r12, r22 310c6: 7c 01 movw r14, r24 310c8: cd 53 subi r28, 0x3D ; 61 310ca: df 4f sbci r29, 0xFF ; 255 310cc: 28 81 ld r18, Y 310ce: 39 81 ldd r19, Y+1 ; 0x01 310d0: 4a 81 ldd r20, Y+2 ; 0x02 310d2: 5b 81 ldd r21, Y+3 ; 0x03 310d4: c3 5c subi r28, 0xC3 ; 195 310d6: d0 40 sbci r29, 0x00 ; 0 310d8: c3 01 movw r24, r6 310da: b2 01 movw r22, r4 310dc: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 310e0: 9b 01 movw r18, r22 310e2: ac 01 movw r20, r24 310e4: c7 01 movw r24, r14 310e6: b6 01 movw r22, r12 310e8: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 310ec: 6b 01 movw r12, r22 310ee: 7c 01 movw r14, r24 310f0: c9 53 subi r28, 0x39 ; 57 310f2: df 4f sbci r29, 0xFF ; 255 310f4: 28 81 ld r18, Y 310f6: 39 81 ldd r19, Y+1 ; 0x01 310f8: 4a 81 ldd r20, Y+2 ; 0x02 310fa: 5b 81 ldd r21, Y+3 ; 0x03 310fc: c7 5c subi r28, 0xC7 ; 199 310fe: d0 40 sbci r29, 0x00 ; 0 31100: c5 01 movw r24, r10 31102: b4 01 movw r22, r8 31104: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31108: 9b 01 movw r18, r22 3110a: ac 01 movw r20, r24 3110c: c7 01 movw r24, r14 3110e: b6 01 movw r22, r12 31110: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 31114: c5 53 subi r28, 0x35 ; 53 31116: df 4f sbci r29, 0xFF ; 255 31118: 28 81 ld r18, Y 3111a: 39 81 ldd r19, Y+1 ; 0x01 3111c: 4a 81 ldd r20, Y+2 ; 0x02 3111e: 5b 81 ldd r21, Y+3 ; 0x03 31120: cb 5c subi r28, 0xCB ; 203 31122: d0 40 sbci r29, 0x00 ; 0 31124: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 31128: 6b 01 movw r12, r22 3112a: 7c 01 movw r14, r24 3112c: 11 50 subi r17, 0x01 ; 1 b[r] = -acc; } // Solve for h by a Gauss iteration method. float h[4] = { 0.f }; for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) { 3112e: 09 f0 breq .+2 ; 0x31132 31130: c9 ce rjmp .-622 ; 0x30ec4 // and update the current position with h. // It may be better to use the Levenberg-Marquart method here, // but because we are very close to the solution alread, // the simple Gauss-Newton non-linear Least Squares method works well enough. cntr[0] += h[0]; 31132: 6e 96 adiw r28, 0x1e ; 30 31134: 2c ad ldd r18, Y+60 ; 0x3c 31136: 3d ad ldd r19, Y+61 ; 0x3d 31138: 4e ad ldd r20, Y+62 ; 0x3e 3113a: 5f ad ldd r21, Y+63 ; 0x3f 3113c: 6e 97 sbiw r28, 0x1e ; 30 3113e: c5 55 subi r28, 0x55 ; 85 31140: df 4f sbci r29, 0xFF ; 255 31142: 68 81 ld r22, Y 31144: 79 81 ldd r23, Y+1 ; 0x01 31146: 8a 81 ldd r24, Y+2 ; 0x02 31148: 9b 81 ldd r25, Y+3 ; 0x03 3114a: cb 5a subi r28, 0xAB ; 171 3114c: d0 40 sbci r29, 0x00 ; 0 3114e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31152: 60 93 3a 13 sts 0x133A, r22 ; 0x80133a 31156: 70 93 3b 13 sts 0x133B, r23 ; 0x80133b 3115a: 80 93 3c 13 sts 0x133C, r24 ; 0x80133c 3115e: 90 93 3d 13 sts 0x133D, r25 ; 0x80133d cntr[1] += h[1]; 31162: a3 01 movw r20, r6 31164: 92 01 movw r18, r4 31166: c1 55 subi r28, 0x51 ; 81 31168: df 4f sbci r29, 0xFF ; 255 3116a: 68 81 ld r22, Y 3116c: 79 81 ldd r23, Y+1 ; 0x01 3116e: 8a 81 ldd r24, Y+2 ; 0x02 31170: 9b 81 ldd r25, Y+3 ; 0x03 31172: cf 5a subi r28, 0xAF ; 175 31174: d0 40 sbci r29, 0x00 ; 0 31176: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3117a: 60 93 3e 13 sts 0x133E, r22 ; 0x80133e 3117e: 70 93 3f 13 sts 0x133F, r23 ; 0x80133f 31182: 80 93 40 13 sts 0x1340, r24 ; 0x801340 31186: 90 93 41 13 sts 0x1341, r25 ; 0x801341 a1 += h[2]; 3118a: a5 01 movw r20, r10 3118c: 94 01 movw r18, r8 3118e: a6 96 adiw r28, 0x26 ; 38 31190: 6c ad ldd r22, Y+60 ; 0x3c 31192: 7d ad ldd r23, Y+61 ; 0x3d 31194: 8e ad ldd r24, Y+62 ; 0x3e 31196: 9f ad ldd r25, Y+63 ; 0x3f 31198: a6 97 sbiw r28, 0x26 ; 38 3119a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3119e: a6 96 adiw r28, 0x26 ; 38 311a0: 6c af std Y+60, r22 ; 0x3c 311a2: 7d af std Y+61, r23 ; 0x3d 311a4: 8e af std Y+62, r24 ; 0x3e 311a6: 9f af std Y+63, r25 ; 0x3f 311a8: a6 97 sbiw r28, 0x26 ; 38 a2 += h[3]; 311aa: a7 01 movw r20, r14 311ac: 96 01 movw r18, r12 311ae: a2 96 adiw r28, 0x22 ; 34 311b0: 6c ad ldd r22, Y+60 ; 0x3c 311b2: 7d ad ldd r23, Y+61 ; 0x3d 311b4: 8e ad ldd r24, Y+62 ; 0x3e 311b6: 9f ad ldd r25, Y+63 ; 0x3f 311b8: a2 97 sbiw r28, 0x22 ; 34 311ba: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 311be: a2 96 adiw r28, 0x22 ; 34 311c0: 6c af std Y+60, r22 ; 0x3c 311c2: 7d af std Y+61, r23 ; 0x3d 311c4: 8e af std Y+62, r24 ; 0x3e 311c6: 9f af std Y+63, r25 ; 0x3f 311c8: a2 97 sbiw r28, 0x22 ; 34 311ca: e6 96 adiw r28, 0x36 ; 54 311cc: 9f ad ldd r25, Y+63 ; 0x3f 311ce: e6 97 sbiw r28, 0x36 ; 54 311d0: 91 50 subi r25, 0x01 ; 1 311d2: e6 96 adiw r28, 0x36 ; 54 311d4: 9f af std Y+63, r25 ; 0x3f 311d6: e6 97 sbiw r28, 0x36 ; 54 cntr[1] = 0.f; // Rotation of the machine X axis from the bed X axis. float a1 = 0; // Rotation of the machine Y axis from the bed Y axis. float a2 = 0; for (int8_t iter = 0; iter < 100; ++iter) { 311d8: 91 11 cpse r25, r1 311da: e6 ca rjmp .-2612 ; 0x307a8 SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY } vec_x[0] = cos(a1) * MACHINE_AXIS_SCALE_X; 311dc: a6 96 adiw r28, 0x26 ; 38 311de: 6c ad ldd r22, Y+60 ; 0x3c 311e0: 7d ad ldd r23, Y+61 ; 0x3d 311e2: 8e ad ldd r24, Y+62 ; 0x3e 311e4: 9f ad ldd r25, Y+63 ; 0x3f 311e6: a6 97 sbiw r28, 0x26 ; 38 311e8: 0f 94 02 a6 call 0x34c04 ; 0x34c04 311ec: 60 93 2a 13 sts 0x132A, r22 ; 0x80132a 311f0: 70 93 2b 13 sts 0x132B, r23 ; 0x80132b 311f4: 80 93 2c 13 sts 0x132C, r24 ; 0x80132c 311f8: 90 93 2d 13 sts 0x132D, r25 ; 0x80132d vec_x[1] = sin(a1) * MACHINE_AXIS_SCALE_X; 311fc: a6 96 adiw r28, 0x26 ; 38 311fe: 6c ad ldd r22, Y+60 ; 0x3c 31200: 7d ad ldd r23, Y+61 ; 0x3d 31202: 8e ad ldd r24, Y+62 ; 0x3e 31204: 9f ad ldd r25, Y+63 ; 0x3f 31206: a6 97 sbiw r28, 0x26 ; 38 31208: 0f 94 c8 a8 call 0x35190 ; 0x35190 3120c: 60 93 2e 13 sts 0x132E, r22 ; 0x80132e 31210: 70 93 2f 13 sts 0x132F, r23 ; 0x80132f 31214: 80 93 30 13 sts 0x1330, r24 ; 0x801330 31218: 90 93 31 13 sts 0x1331, r25 ; 0x801331 vec_y[0] = -sin(a2) * MACHINE_AXIS_SCALE_Y; 3121c: a2 96 adiw r28, 0x22 ; 34 3121e: 6c ad ldd r22, Y+60 ; 0x3c 31220: 7d ad ldd r23, Y+61 ; 0x3d 31222: 8e ad ldd r24, Y+62 ; 0x3e 31224: 9f ad ldd r25, Y+63 ; 0x3f 31226: a2 97 sbiw r28, 0x22 ; 34 31228: 0f 94 c8 a8 call 0x35190 ; 0x35190 3122c: 90 58 subi r25, 0x80 ; 128 3122e: 60 93 32 13 sts 0x1332, r22 ; 0x801332 31232: 70 93 33 13 sts 0x1333, r23 ; 0x801333 31236: 80 93 34 13 sts 0x1334, r24 ; 0x801334 3123a: 90 93 35 13 sts 0x1335, r25 ; 0x801335 vec_y[1] = cos(a2) * MACHINE_AXIS_SCALE_Y; 3123e: a2 96 adiw r28, 0x22 ; 34 31240: 6c ad ldd r22, Y+60 ; 0x3c 31242: 7d ad ldd r23, Y+61 ; 0x3d 31244: 8e ad ldd r24, Y+62 ; 0x3e 31246: 9f ad ldd r25, Y+63 ; 0x3f 31248: a2 97 sbiw r28, 0x22 ; 34 3124a: 0f 94 02 a6 call 0x34c04 ; 0x34c04 3124e: 60 93 36 13 sts 0x1336, r22 ; 0x801336 31252: 70 93 37 13 sts 0x1337, r23 ; 0x801337 31256: 80 93 38 13 sts 0x1338, r24 ; 0x801338 3125a: 90 93 39 13 sts 0x1339, r25 ; 0x801339 BedSkewOffsetDetectionResultType result = BED_SKEW_OFFSET_DETECTION_PERFECT; { angleDiff = fabs(a2 - a1); 3125e: a6 96 adiw r28, 0x26 ; 38 31260: 2c ad ldd r18, Y+60 ; 0x3c 31262: 3d ad ldd r19, Y+61 ; 0x3d 31264: 4e ad ldd r20, Y+62 ; 0x3e 31266: 5f ad ldd r21, Y+63 ; 0x3f 31268: a6 97 sbiw r28, 0x26 ; 38 3126a: a2 96 adiw r28, 0x22 ; 34 3126c: 6c ad ldd r22, Y+60 ; 0x3c 3126e: 7d ad ldd r23, Y+61 ; 0x3d 31270: 8e ad ldd r24, Y+62 ; 0x3e 31272: 9f ad ldd r25, Y+63 ; 0x3f 31274: a2 97 sbiw r28, 0x22 ; 34 31276: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 3127a: 4b 01 movw r8, r22 3127c: 5c 01 movw r10, r24 3127e: 7c 01 movw r14, r24 31280: 6b 01 movw r12, r22 31282: e8 94 clt 31284: f7 f8 bld r15, 7 /// XY skew and Y-bed skew DBG(_n("Measured skews: %f %f\n"), degrees(a2 - a1), degrees(a2)); 31286: 21 ee ldi r18, 0xE1 ; 225 31288: 3e e2 ldi r19, 0x2E ; 46 3128a: 45 e6 ldi r20, 0x65 ; 101 3128c: 52 e4 ldi r21, 0x42 ; 66 3128e: a2 96 adiw r28, 0x22 ; 34 31290: 6c ad ldd r22, Y+60 ; 0x3c 31292: 7d ad ldd r23, Y+61 ; 0x3d 31294: 8e ad ldd r24, Y+62 ; 0x3e 31296: 9f ad ldd r25, Y+63 ; 0x3f 31298: a2 97 sbiw r28, 0x22 ; 34 3129a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3129e: 9f 93 push r25 312a0: 8f 93 push r24 312a2: 7f 93 push r23 312a4: 6f 93 push r22 312a6: 21 ee ldi r18, 0xE1 ; 225 312a8: 3e e2 ldi r19, 0x2E ; 46 312aa: 45 e6 ldi r20, 0x65 ; 101 312ac: 52 e4 ldi r21, 0x42 ; 66 312ae: c5 01 movw r24, r10 312b0: b4 01 movw r22, r8 312b2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 312b6: 9f 93 push r25 312b8: 8f 93 push r24 312ba: 7f 93 push r23 312bc: 6f 93 push r22 312be: 85 e6 ldi r24, 0x65 ; 101 312c0: 9b e6 ldi r25, 0x6B ; 107 312c2: 9f 93 push r25 312c4: 8f 93 push r24 312c6: 0f 94 a2 a2 call 0x34544 ; 0x34544 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 312ca: b7 01 movw r22, r14 312cc: a6 01 movw r20, r12 312ce: 80 e6 ldi r24, 0x60 ; 96 312d0: 9f e0 ldi r25, 0x0F ; 15 312d2: 0f 94 16 a4 call 0x3482c ; 0x3482c eeprom_update_float_notify((float *)(EEPROM_XYZ_CAL_SKEW), angleDiff); //storing xyz cal. skew to be able to show in support menu later if (angleDiff > bed_skew_angle_mild) 312d6: 0f b6 in r0, 0x3f ; 63 312d8: f8 94 cli 312da: de bf out 0x3e, r29 ; 62 312dc: 0f be out 0x3f, r0 ; 63 312de: cd bf out 0x3d, r28 ; 61 312e0: 2f e1 ldi r18, 0x1F ; 31 312e2: 32 e4 ldi r19, 0x42 ; 66 312e4: 49 e0 ldi r20, 0x09 ; 9 312e6: 5b e3 ldi r21, 0x3B ; 59 312e8: c7 01 movw r24, r14 312ea: b6 01 movw r22, r12 312ec: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> vec_x[0] = cos(a1) * MACHINE_AXIS_SCALE_X; vec_x[1] = sin(a1) * MACHINE_AXIS_SCALE_X; vec_y[0] = -sin(a2) * MACHINE_AXIS_SCALE_Y; vec_y[1] = cos(a2) * MACHINE_AXIS_SCALE_Y; BedSkewOffsetDetectionResultType result = BED_SKEW_OFFSET_DETECTION_PERFECT; 312f0: 10 e0 ldi r17, 0x00 ; 0 { angleDiff = fabs(a2 - a1); /// XY skew and Y-bed skew DBG(_n("Measured skews: %f %f\n"), degrees(a2 - a1), degrees(a2)); eeprom_update_float_notify((float *)(EEPROM_XYZ_CAL_SKEW), angleDiff); //storing xyz cal. skew to be able to show in support menu later if (angleDiff > bed_skew_angle_mild) 312f2: 18 16 cp r1, r24 312f4: 64 f4 brge .+24 ; 0x3130e result = (angleDiff > bed_skew_angle_extreme) ? 312f6: 25 e3 ldi r18, 0x35 ; 53 312f8: 3a ef ldi r19, 0xFA ; 250 312fa: 4e e8 ldi r20, 0x8E ; 142 312fc: 5b e3 ldi r21, 0x3B ; 59 312fe: c7 01 movw r24, r14 31300: b6 01 movw r22, r12 31302: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 31306: 12 e0 ldi r17, 0x02 ; 2 31308: 18 16 cp r1, r24 3130a: 0c f0 brlt .+2 ; 0x3130e 3130c: 11 e0 ldi r17, 0x01 ; 1 BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME : BED_SKEW_OFFSET_DETECTION_SKEW_MILD; if (fabs(a1) > bed_skew_angle_extreme || 3130e: 25 e3 ldi r18, 0x35 ; 53 31310: 3a ef ldi r19, 0xFA ; 250 31312: 4e e8 ldi r20, 0x8E ; 142 31314: 5b e3 ldi r21, 0x3B ; 59 31316: a6 96 adiw r28, 0x26 ; 38 31318: 6c ad ldd r22, Y+60 ; 0x3c 3131a: 7d ad ldd r23, Y+61 ; 0x3d 3131c: 8e ad ldd r24, Y+62 ; 0x3e 3131e: 9f ad ldd r25, Y+63 ; 0x3f 31320: a6 97 sbiw r28, 0x26 ; 38 31322: 9f 77 andi r25, 0x7F ; 127 31324: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 31328: 18 16 cp r1, r24 3132a: 0c f4 brge .+2 ; 0x3132e 3132c: 67 c4 rjmp .+2254 ; 0x31bfc 3132e: 25 e3 ldi r18, 0x35 ; 53 31330: 3a ef ldi r19, 0xFA ; 250 31332: 4e e8 ldi r20, 0x8E ; 142 31334: 5b e3 ldi r21, 0x3B ; 59 31336: a2 96 adiw r28, 0x22 ; 34 31338: 6c ad ldd r22, Y+60 ; 0x3c 3133a: 7d ad ldd r23, Y+61 ; 0x3d 3133c: 8e ad ldd r24, Y+62 ; 0x3e 3133e: 9f ad ldd r25, Y+63 ; 0x3f 31340: a2 97 sbiw r28, 0x22 ; 34 31342: 9f 77 andi r25, 0x7F ; 127 31344: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 31348: 18 16 cp r1, r24 3134a: 0c f4 brge .+2 ; 0x3134e 3134c: 57 c4 rjmp .+2222 ; 0x31bfc SERIAL_ECHOLNPGM("Error after correction: "); } #endif // SUPPORT_VERBOSITY // Measure the error after correction. for (uint8_t i = 0; i < npts; ++i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0]; 3134e: 20 91 2a 13 lds r18, 0x132A ; 0x80132a 31352: 30 91 2b 13 lds r19, 0x132B ; 0x80132b 31356: 40 91 2c 13 lds r20, 0x132C ; 0x80132c 3135a: 50 91 2d 13 lds r21, 0x132D ; 0x80132d 3135e: ae 96 adiw r28, 0x2e ; 46 31360: 2c af std Y+60, r18 ; 0x3c 31362: 3d af std Y+61, r19 ; 0x3d 31364: 4e af std Y+62, r20 ; 0x3e 31366: 5f af std Y+63, r21 ; 0x3f 31368: ae 97 sbiw r28, 0x2e ; 46 3136a: 80 91 32 13 lds r24, 0x1332 ; 0x801332 3136e: 90 91 33 13 lds r25, 0x1333 ; 0x801333 31372: a0 91 34 13 lds r26, 0x1334 ; 0x801334 31376: b0 91 35 13 lds r27, 0x1335 ; 0x801335 3137a: e9 96 adiw r28, 0x39 ; 57 3137c: 8c af std Y+60, r24 ; 0x3c 3137e: 9d af std Y+61, r25 ; 0x3d 31380: ae af std Y+62, r26 ; 0x3e 31382: bf af std Y+63, r27 ; 0x3f 31384: e9 97 sbiw r28, 0x39 ; 57 31386: 20 91 3a 13 lds r18, 0x133A ; 0x80133a 3138a: 30 91 3b 13 lds r19, 0x133B ; 0x80133b 3138e: 40 91 3c 13 lds r20, 0x133C ; 0x80133c 31392: 50 91 3d 13 lds r21, 0x133D ; 0x80133d 31396: e4 96 adiw r28, 0x34 ; 52 31398: 2c af std Y+60, r18 ; 0x3c 3139a: 3d af std Y+61, r19 ; 0x3d 3139c: 4e af std Y+62, r20 ; 0x3e 3139e: 5f af std Y+63, r21 ; 0x3f 313a0: e4 97 sbiw r28, 0x34 ; 52 float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1]; 313a2: 80 91 2e 13 lds r24, 0x132E ; 0x80132e 313a6: 90 91 2f 13 lds r25, 0x132F ; 0x80132f 313aa: a0 91 30 13 lds r26, 0x1330 ; 0x801330 313ae: b0 91 31 13 lds r27, 0x1331 ; 0x801331 313b2: ed 96 adiw r28, 0x3d ; 61 313b4: 8c af std Y+60, r24 ; 0x3c 313b6: 9d af std Y+61, r25 ; 0x3d 313b8: ae af std Y+62, r26 ; 0x3e 313ba: bf af std Y+63, r27 ; 0x3f 313bc: ed 97 sbiw r28, 0x3d ; 61 313be: 20 91 36 13 lds r18, 0x1336 ; 0x801336 313c2: 30 91 37 13 lds r19, 0x1337 ; 0x801337 313c6: 40 91 38 13 lds r20, 0x1338 ; 0x801338 313ca: 50 91 39 13 lds r21, 0x1339 ; 0x801339 313ce: c3 58 subi r28, 0x83 ; 131 313d0: df 4f sbci r29, 0xFF ; 255 313d2: 28 83 st Y, r18 313d4: 39 83 std Y+1, r19 ; 0x01 313d6: 4a 83 std Y+2, r20 ; 0x02 313d8: 5b 83 std Y+3, r21 ; 0x03 313da: cd 57 subi r28, 0x7D ; 125 313dc: d0 40 sbci r29, 0x00 ; 0 313de: 80 91 3e 13 lds r24, 0x133E ; 0x80133e 313e2: 90 91 3f 13 lds r25, 0x133F ; 0x80133f 313e6: a0 91 40 13 lds r26, 0x1340 ; 0x801340 313ea: b0 91 41 13 lds r27, 0x1341 ; 0x801341 313ee: cf 57 subi r28, 0x7F ; 127 313f0: df 4f sbci r29, 0xFF ; 255 313f2: 88 83 st Y, r24 313f4: 99 83 std Y+1, r25 ; 0x01 313f6: aa 83 std Y+2, r26 ; 0x02 313f8: bb 83 std Y+3, r27 ; 0x03 313fa: c1 58 subi r28, 0x81 ; 129 313fc: d0 40 sbci r29, 0x00 ; 0 313fe: a0 e0 ldi r26, 0x00 ; 0 31400: bc e9 ldi r27, 0x9C ; 156 31402: 6c 96 adiw r28, 0x1c ; 28 31404: bf af std Y+63, r27 ; 0x3f 31406: ae af std Y+62, r26 ; 0x3e 31408: 6c 97 sbiw r28, 0x1c ; 28 3140a: 89 e0 ldi r24, 0x09 ; 9 3140c: 28 2e mov r2, r24 3140e: 83 e1 ldi r24, 0x13 ; 19 31410: 38 2e mov r3, r24 SERIAL_ECHOLNPGM("Error after correction: "); } #endif // SUPPORT_VERBOSITY // Measure the error after correction. for (uint8_t i = 0; i < npts; ++i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0]; 31412: f1 01 movw r30, r2 31414: c1 80 ldd r12, Z+1 ; 0x01 31416: d2 80 ldd r13, Z+2 ; 0x02 31418: e3 80 ldd r14, Z+3 ; 0x03 3141a: f4 80 ldd r15, Z+4 ; 0x04 3141c: 45 80 ldd r4, Z+5 ; 0x05 3141e: 56 80 ldd r5, Z+6 ; 0x06 31420: 67 80 ldd r6, Z+7 ; 0x07 31422: 70 84 ldd r7, Z+8 ; 0x08 float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1]; float errX = pgm_read_float(true_pts + i * 2) - x; 31424: 6c 96 adiw r28, 0x1c ; 28 31426: ee ad ldd r30, Y+62 ; 0x3e 31428: ff ad ldd r31, Y+63 ; 0x3f 3142a: 6c 97 sbiw r28, 0x1c ; 28 3142c: 25 91 lpm r18, Z+ 3142e: 35 91 lpm r19, Z+ 31430: 45 91 lpm r20, Z+ 31432: 54 91 lpm r21, Z 31434: cb 57 subi r28, 0x7B ; 123 31436: df 4f sbci r29, 0xFF ; 255 31438: 28 83 st Y, r18 3143a: 39 83 std Y+1, r19 ; 0x01 3143c: 4a 83 std Y+2, r20 ; 0x02 3143e: 5b 83 std Y+3, r21 ; 0x03 31440: c5 58 subi r28, 0x85 ; 133 31442: d0 40 sbci r29, 0x00 ; 0 float errY = pgm_read_float(true_pts + i * 2 + 1) - y; 31444: 6c 96 adiw r28, 0x1c ; 28 31446: ee ad ldd r30, Y+62 ; 0x3e 31448: ff ad ldd r31, Y+63 ; 0x3f 3144a: 6c 97 sbiw r28, 0x1c ; 28 3144c: 34 96 adiw r30, 0x04 ; 4 3144e: 85 90 lpm r8, Z+ 31450: 95 90 lpm r9, Z+ 31452: a5 90 lpm r10, Z+ 31454: b4 90 lpm r11, Z } #endif // SUPPORT_VERBOSITY // Measure the error after correction. for (uint8_t i = 0; i < npts; ++i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0]; float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1]; 31456: ed 96 adiw r28, 0x3d ; 61 31458: 2c ad ldd r18, Y+60 ; 0x3c 3145a: 3d ad ldd r19, Y+61 ; 0x3d 3145c: 4e ad ldd r20, Y+62 ; 0x3e 3145e: 5f ad ldd r21, Y+63 ; 0x3f 31460: ed 97 sbiw r28, 0x3d ; 61 31462: c7 01 movw r24, r14 31464: b6 01 movw r22, r12 31466: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3146a: c7 57 subi r28, 0x77 ; 119 3146c: df 4f sbci r29, 0xFF ; 255 3146e: 68 83 st Y, r22 31470: 79 83 std Y+1, r23 ; 0x01 31472: 8a 83 std Y+2, r24 ; 0x02 31474: 9b 83 std Y+3, r25 ; 0x03 31476: c9 58 subi r28, 0x89 ; 137 31478: d0 40 sbci r29, 0x00 ; 0 3147a: c3 58 subi r28, 0x83 ; 131 3147c: df 4f sbci r29, 0xFF ; 255 3147e: 28 81 ld r18, Y 31480: 39 81 ldd r19, Y+1 ; 0x01 31482: 4a 81 ldd r20, Y+2 ; 0x02 31484: 5b 81 ldd r21, Y+3 ; 0x03 31486: cd 57 subi r28, 0x7D ; 125 31488: d0 40 sbci r29, 0x00 ; 0 3148a: c3 01 movw r24, r6 3148c: b2 01 movw r22, r4 3148e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31492: 9b 01 movw r18, r22 31494: ac 01 movw r20, r24 31496: c7 57 subi r28, 0x77 ; 119 31498: df 4f sbci r29, 0xFF ; 255 3149a: 68 81 ld r22, Y 3149c: 79 81 ldd r23, Y+1 ; 0x01 3149e: 8a 81 ldd r24, Y+2 ; 0x02 314a0: 9b 81 ldd r25, Y+3 ; 0x03 314a2: c9 58 subi r28, 0x89 ; 137 314a4: d0 40 sbci r29, 0x00 ; 0 314a6: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 314aa: cf 57 subi r28, 0x7F ; 127 314ac: df 4f sbci r29, 0xFF ; 255 314ae: 28 81 ld r18, Y 314b0: 39 81 ldd r19, Y+1 ; 0x01 314b2: 4a 81 ldd r20, Y+2 ; 0x02 314b4: 5b 81 ldd r21, Y+3 ; 0x03 314b6: c1 58 subi r28, 0x81 ; 129 314b8: d0 40 sbci r29, 0x00 ; 0 314ba: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 314be: 9b 01 movw r18, r22 314c0: ac 01 movw r20, r24 float errX = pgm_read_float(true_pts + i * 2) - x; float errY = pgm_read_float(true_pts + i * 2 + 1) - y; 314c2: c5 01 movw r24, r10 314c4: b4 01 movw r22, r8 314c6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 314ca: 4b 01 movw r8, r22 314cc: 5c 01 movw r10, r24 SERIAL_ECHOLNPGM("Error after correction: "); } #endif // SUPPORT_VERBOSITY // Measure the error after correction. for (uint8_t i = 0; i < npts; ++i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0]; 314ce: a7 01 movw r20, r14 314d0: 96 01 movw r18, r12 314d2: ae 96 adiw r28, 0x2e ; 46 314d4: 6c ad ldd r22, Y+60 ; 0x3c 314d6: 7d ad ldd r23, Y+61 ; 0x3d 314d8: 8e ad ldd r24, Y+62 ; 0x3e 314da: 9f ad ldd r25, Y+63 ; 0x3f 314dc: ae 97 sbiw r28, 0x2e ; 46 314de: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 314e2: 6b 01 movw r12, r22 314e4: 7c 01 movw r14, r24 314e6: a3 01 movw r20, r6 314e8: 92 01 movw r18, r4 314ea: e9 96 adiw r28, 0x39 ; 57 314ec: 6c ad ldd r22, Y+60 ; 0x3c 314ee: 7d ad ldd r23, Y+61 ; 0x3d 314f0: 8e ad ldd r24, Y+62 ; 0x3e 314f2: 9f ad ldd r25, Y+63 ; 0x3f 314f4: e9 97 sbiw r28, 0x39 ; 57 314f6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 314fa: 9b 01 movw r18, r22 314fc: ac 01 movw r20, r24 314fe: c7 01 movw r24, r14 31500: b6 01 movw r22, r12 31502: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31506: e4 96 adiw r28, 0x34 ; 52 31508: 2c ad ldd r18, Y+60 ; 0x3c 3150a: 3d ad ldd r19, Y+61 ; 0x3d 3150c: 4e ad ldd r20, Y+62 ; 0x3e 3150e: 5f ad ldd r21, Y+63 ; 0x3f 31510: e4 97 sbiw r28, 0x34 ; 52 31512: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31516: 9b 01 movw r18, r22 31518: ac 01 movw r20, r24 float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1]; float errX = pgm_read_float(true_pts + i * 2) - x; 3151a: cb 57 subi r28, 0x7B ; 123 3151c: df 4f sbci r29, 0xFF ; 255 3151e: 68 81 ld r22, Y 31520: 79 81 ldd r23, Y+1 ; 0x01 31522: 8a 81 ldd r24, Y+2 ; 0x02 31524: 9b 81 ldd r25, Y+3 ; 0x03 31526: c5 58 subi r28, 0x85 ; 133 31528: d0 40 sbci r29, 0x00 ; 0 3152a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> float errY = pgm_read_float(true_pts + i * 2 + 1) - y; float err = hypot(errX, errY); 3152e: a5 01 movw r20, r10 31530: 94 01 movw r18, r8 31532: 0f 94 a4 a7 call 0x34f48 ; 0x34f48 } else { #ifdef SUPPORT_VERBOSITY if(verbosity_level >=20 ) SERIAL_ECHOPGM("Point not on first row"); #endif // SUPPORT_VERBOSITY if (err > BED_CALIBRATION_POINT_OFFSET_MAX_EUCLIDIAN) { 31536: 2d ec ldi r18, 0xCD ; 205 31538: 3c ec ldi r19, 0xCC ; 204 3153a: 4c e4 ldi r20, 0x4C ; 76 3153c: 5f e3 ldi r21, 0x3F ; 63 3153e: 0f 94 91 a7 call 0x34f22 ; 0x34f22 <__gesf2> 31542: 18 16 cp r1, r24 31544: 0c f4 brge .+2 ; 0x31548 result = BED_SKEW_OFFSET_DETECTION_FITTING_FAILED; 31546: 1e ef ldi r17, 0xFE ; 254 31548: 38 e0 ldi r19, 0x08 ; 8 3154a: 23 0e add r2, r19 3154c: 31 1c adc r3, r1 3154e: 6c 96 adiw r28, 0x1c ; 28 31550: 4e ad ldd r20, Y+62 ; 0x3e 31552: 5f ad ldd r21, Y+63 ; 0x3f 31554: 6c 97 sbiw r28, 0x1c ; 28 31556: 48 5f subi r20, 0xF8 ; 248 31558: 5f 4f sbci r21, 0xFF ; 255 3155a: 6c 96 adiw r28, 0x1c ; 28 3155c: 5f af std Y+63, r21 ; 0x3f 3155e: 4e af std Y+62, r20 ; 0x3e 31560: 6c 97 sbiw r28, 0x1c ; 28 SERIAL_ECHOLNPGM("Error after correction: "); } #endif // SUPPORT_VERBOSITY // Measure the error after correction. for (uint8_t i = 0; i < npts; ++i) { 31562: a8 96 adiw r28, 0x28 ; 40 31564: 8e ad ldd r24, Y+62 ; 0x3e 31566: 9f ad ldd r25, Y+63 ; 0x3f 31568: a8 97 sbiw r28, 0x28 ; 40 3156a: 82 15 cp r24, r2 3156c: 93 05 cpc r25, r3 3156e: 09 f0 breq .+2 ; 0x31572 31570: 50 cf rjmp .-352 ; 0x31412 MYSERIAL.println(BED_CALIBRATION_POINT_OFFSET_MAX_EUCLIDIAN); SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY if (result == BED_SKEW_OFFSET_DETECTION_PERFECT) { 31572: 11 11 cpse r17, r1 31574: 62 c1 rjmp .+708 ; 0x3183a #ifdef SUPPORT_VERBOSITY if (verbosity_level > 0) SERIAL_ECHOLNPGM("Very little skew detected. Orthogonalizing the axes."); #endif // SUPPORT_VERBOSITY // Orthogonalize the axes. a1 = 0.5f * (a1 + a2); 31576: a2 96 adiw r28, 0x22 ; 34 31578: 2c ad ldd r18, Y+60 ; 0x3c 3157a: 3d ad ldd r19, Y+61 ; 0x3d 3157c: 4e ad ldd r20, Y+62 ; 0x3e 3157e: 5f ad ldd r21, Y+63 ; 0x3f 31580: a2 97 sbiw r28, 0x22 ; 34 31582: a6 96 adiw r28, 0x26 ; 38 31584: 6c ad ldd r22, Y+60 ; 0x3c 31586: 7d ad ldd r23, Y+61 ; 0x3d 31588: 8e ad ldd r24, Y+62 ; 0x3e 3158a: 9f ad ldd r25, Y+63 ; 0x3f 3158c: a6 97 sbiw r28, 0x26 ; 38 3158e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31592: 20 e0 ldi r18, 0x00 ; 0 31594: 30 e0 ldi r19, 0x00 ; 0 31596: 40 e0 ldi r20, 0x00 ; 0 31598: 5f e3 ldi r21, 0x3F ; 63 3159a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3159e: 6b 01 movw r12, r22 315a0: 7c 01 movw r14, r24 vec_x[0] = cos(a1) * MACHINE_AXIS_SCALE_X; 315a2: 0f 94 02 a6 call 0x34c04 ; 0x34c04 315a6: a2 96 adiw r28, 0x22 ; 34 315a8: 6c af std Y+60, r22 ; 0x3c 315aa: 7d af std Y+61, r23 ; 0x3d 315ac: 8e af std Y+62, r24 ; 0x3e 315ae: 9f af std Y+63, r25 ; 0x3f 315b0: a2 97 sbiw r28, 0x22 ; 34 315b2: 60 93 2a 13 sts 0x132A, r22 ; 0x80132a 315b6: 70 93 2b 13 sts 0x132B, r23 ; 0x80132b 315ba: 80 93 2c 13 sts 0x132C, r24 ; 0x80132c 315be: 90 93 2d 13 sts 0x132D, r25 ; 0x80132d vec_x[1] = sin(a1) * MACHINE_AXIS_SCALE_X; 315c2: c7 01 movw r24, r14 315c4: b6 01 movw r22, r12 315c6: 0f 94 c8 a8 call 0x35190 ; 0x35190 315ca: a6 96 adiw r28, 0x26 ; 38 315cc: 6c af std Y+60, r22 ; 0x3c 315ce: 7d af std Y+61, r23 ; 0x3d 315d0: 8e af std Y+62, r24 ; 0x3e 315d2: 9f af std Y+63, r25 ; 0x3f 315d4: a6 97 sbiw r28, 0x26 ; 38 315d6: 60 93 2e 13 sts 0x132E, r22 ; 0x80132e 315da: 70 93 2f 13 sts 0x132F, r23 ; 0x80132f 315de: 80 93 30 13 sts 0x1330, r24 ; 0x801330 315e2: 90 93 31 13 sts 0x1331, r25 ; 0x801331 vec_y[0] = -sin(a1) * MACHINE_AXIS_SCALE_Y; 315e6: 9b 01 movw r18, r22 315e8: ac 01 movw r20, r24 315ea: 50 58 subi r21, 0x80 ; 128 315ec: aa 96 adiw r28, 0x2a ; 42 315ee: 2c af std Y+60, r18 ; 0x3c 315f0: 3d af std Y+61, r19 ; 0x3d 315f2: 4e af std Y+62, r20 ; 0x3e 315f4: 5f af std Y+63, r21 ; 0x3f 315f6: aa 97 sbiw r28, 0x2a ; 42 315f8: 20 93 32 13 sts 0x1332, r18 ; 0x801332 315fc: 30 93 33 13 sts 0x1333, r19 ; 0x801333 31600: 40 93 34 13 sts 0x1334, r20 ; 0x801334 31604: 50 93 35 13 sts 0x1335, r21 ; 0x801335 vec_y[1] = cos(a1) * MACHINE_AXIS_SCALE_Y; 31608: a2 96 adiw r28, 0x22 ; 34 3160a: 8c ad ldd r24, Y+60 ; 0x3c 3160c: 9d ad ldd r25, Y+61 ; 0x3d 3160e: ae ad ldd r26, Y+62 ; 0x3e 31610: bf ad ldd r27, Y+63 ; 0x3f 31612: a2 97 sbiw r28, 0x22 ; 34 31614: 80 93 36 13 sts 0x1336, r24 ; 0x801336 31618: 90 93 37 13 sts 0x1337, r25 ; 0x801337 3161c: a0 93 38 13 sts 0x1338, r26 ; 0x801338 31620: b0 93 39 13 sts 0x1339, r27 ; 0x801339 // Refresh the offset. cntr[0] = 0.f; 31624: 10 92 3a 13 sts 0x133A, r1 ; 0x80133a 31628: 10 92 3b 13 sts 0x133B, r1 ; 0x80133b 3162c: 10 92 3c 13 sts 0x133C, r1 ; 0x80133c 31630: 10 92 3d 13 sts 0x133D, r1 ; 0x80133d cntr[1] = 0.f; 31634: 10 92 3e 13 sts 0x133E, r1 ; 0x80133e 31638: 10 92 3f 13 sts 0x133F, r1 ; 0x80133f 3163c: 10 92 40 13 sts 0x1340, r1 ; 0x801340 31640: 10 92 41 13 sts 0x1341, r1 ; 0x801341 float wx = 0.f; 31644: 41 2c mov r4, r1 31646: 51 2c mov r5, r1 31648: 32 01 movw r6, r4 float wy = 0.f; for (int8_t i = 0; i < npts; ++ i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1]; 3164a: cf 56 subi r28, 0x6F ; 111 3164c: df 4f sbci r29, 0xFF ; 255 3164e: a8 81 ld r26, Y 31650: b9 81 ldd r27, Y+1 ; 0x01 31652: c1 59 subi r28, 0x91 ; 145 31654: d0 40 sbci r29, 0x00 ; 0 31656: 11 96 adiw r26, 0x01 ; 1 31658: 8d 90 ld r8, X+ 3165a: 9d 90 ld r9, X+ 3165c: ad 90 ld r10, X+ 3165e: bc 90 ld r11, X 31660: 14 97 sbiw r26, 0x04 ; 4 31662: 15 96 adiw r26, 0x05 ; 5 31664: 2d 91 ld r18, X+ 31666: 3d 91 ld r19, X+ 31668: 4d 91 ld r20, X+ 3166a: 5c 91 ld r21, X 3166c: 18 97 sbiw r26, 0x08 ; 8 3166e: 6e 96 adiw r28, 0x1e ; 30 31670: 2c af std Y+60, r18 ; 0x3c 31672: 3d af std Y+61, r19 ; 0x3d 31674: 4e af std Y+62, r20 ; 0x3e 31676: 5f af std Y+63, r21 ; 0x3f 31678: 6e 97 sbiw r28, 0x1e ; 30 float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1]; float w = point_weight_x(i, y); cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x); 3167a: cd 56 subi r28, 0x6D ; 109 3167c: df 4f sbci r29, 0xFF ; 255 3167e: e8 81 ld r30, Y 31680: f9 81 ldd r31, Y+1 ; 0x01 31682: c3 59 subi r28, 0x93 ; 147 31684: d0 40 sbci r29, 0x00 ; 0 31686: c5 90 lpm r12, Z+ 31688: d5 90 lpm r13, Z+ 3168a: e5 90 lpm r14, Z+ 3168c: f4 90 lpm r15, Z cntr[0] = 0.f; cntr[1] = 0.f; float wx = 0.f; float wy = 0.f; for (int8_t i = 0; i < npts; ++ i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1]; 3168e: a5 01 movw r20, r10 31690: 94 01 movw r18, r8 31692: a2 96 adiw r28, 0x22 ; 34 31694: 6c ad ldd r22, Y+60 ; 0x3c 31696: 7d ad ldd r23, Y+61 ; 0x3d 31698: 8e ad ldd r24, Y+62 ; 0x3e 3169a: 9f ad ldd r25, Y+63 ; 0x3f 3169c: a2 97 sbiw r28, 0x22 ; 34 3169e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 316a2: ae 96 adiw r28, 0x2e ; 46 316a4: 6c af std Y+60, r22 ; 0x3c 316a6: 7d af std Y+61, r23 ; 0x3d 316a8: 8e af std Y+62, r24 ; 0x3e 316aa: 9f af std Y+63, r25 ; 0x3f 316ac: ae 97 sbiw r28, 0x2e ; 46 316ae: 6e 96 adiw r28, 0x1e ; 30 316b0: 2c ad ldd r18, Y+60 ; 0x3c 316b2: 3d ad ldd r19, Y+61 ; 0x3d 316b4: 4e ad ldd r20, Y+62 ; 0x3e 316b6: 5f ad ldd r21, Y+63 ; 0x3f 316b8: 6e 97 sbiw r28, 0x1e ; 30 316ba: aa 96 adiw r28, 0x2a ; 42 316bc: 6c ad ldd r22, Y+60 ; 0x3c 316be: 7d ad ldd r23, Y+61 ; 0x3d 316c0: 8e ad ldd r24, Y+62 ; 0x3e 316c2: 9f ad ldd r25, Y+63 ; 0x3f 316c4: aa 97 sbiw r28, 0x2a ; 42 316c6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 316ca: 9b 01 movw r18, r22 316cc: ac 01 movw r20, r24 316ce: ae 96 adiw r28, 0x2e ; 46 316d0: 6c ad ldd r22, Y+60 ; 0x3c 316d2: 7d ad ldd r23, Y+61 ; 0x3d 316d4: 8e ad ldd r24, Y+62 ; 0x3e 316d6: 9f ad ldd r25, Y+63 ; 0x3f 316d8: ae 97 sbiw r28, 0x2e ; 46 316da: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 316de: 9b 01 movw r18, r22 316e0: ac 01 movw r20, r24 float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1]; float w = point_weight_x(i, y); cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x); 316e2: c7 01 movw r24, r14 316e4: b6 01 movw r22, r12 316e6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 316ea: 20 91 3a 13 lds r18, 0x133A ; 0x80133a 316ee: 30 91 3b 13 lds r19, 0x133B ; 0x80133b 316f2: 40 91 3c 13 lds r20, 0x133C ; 0x80133c 316f6: 50 91 3d 13 lds r21, 0x133D ; 0x80133d 316fa: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 316fe: 6b 01 movw r12, r22 31700: 7c 01 movw r14, r24 31702: c0 92 3a 13 sts 0x133A, r12 ; 0x80133a 31706: d0 92 3b 13 sts 0x133B, r13 ; 0x80133b 3170a: e0 92 3c 13 sts 0x133C, r14 ; 0x80133c 3170e: f0 92 3d 13 sts 0x133D, r15 ; 0x80133d wx += w; 31712: 20 e0 ldi r18, 0x00 ; 0 31714: 30 e0 ldi r19, 0x00 ; 0 31716: 40 e8 ldi r20, 0x80 ; 128 31718: 5f e3 ldi r21, 0x3F ; 63 3171a: c3 01 movw r24, r6 3171c: b2 01 movw r22, r4 3171e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31722: 2b 01 movw r4, r22 31724: 3c 01 movw r6, r24 SERIAL_ECHOLNPGM("wx:"); MYSERIAL.print(wx); } #endif // SUPPORT_VERBOSITY w = point_weight_y(i, y); cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y); 31726: cd 56 subi r28, 0x6D ; 109 31728: df 4f sbci r29, 0xFF ; 255 3172a: e8 81 ld r30, Y 3172c: f9 81 ldd r31, Y+1 ; 0x01 3172e: c3 59 subi r28, 0x93 ; 147 31730: d0 40 sbci r29, 0x00 ; 0 31732: 34 96 adiw r30, 0x04 ; 4 31734: 25 91 lpm r18, Z+ 31736: 35 91 lpm r19, Z+ 31738: 45 91 lpm r20, Z+ 3173a: 54 91 lpm r21, Z 3173c: ae 96 adiw r28, 0x2e ; 46 3173e: 2c af std Y+60, r18 ; 0x3c 31740: 3d af std Y+61, r19 ; 0x3d 31742: 4e af std Y+62, r20 ; 0x3e 31744: 5f af std Y+63, r21 ; 0x3f 31746: ae 97 sbiw r28, 0x2e ; 46 cntr[1] = 0.f; float wx = 0.f; float wy = 0.f; for (int8_t i = 0; i < npts; ++ i) { float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1]; float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1]; 31748: a5 01 movw r20, r10 3174a: 94 01 movw r18, r8 3174c: a6 96 adiw r28, 0x26 ; 38 3174e: 6c ad ldd r22, Y+60 ; 0x3c 31750: 7d ad ldd r23, Y+61 ; 0x3d 31752: 8e ad ldd r24, Y+62 ; 0x3e 31754: 9f ad ldd r25, Y+63 ; 0x3f 31756: a6 97 sbiw r28, 0x26 ; 38 31758: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3175c: 4b 01 movw r8, r22 3175e: 5c 01 movw r10, r24 31760: 6e 96 adiw r28, 0x1e ; 30 31762: 2c ad ldd r18, Y+60 ; 0x3c 31764: 3d ad ldd r19, Y+61 ; 0x3d 31766: 4e ad ldd r20, Y+62 ; 0x3e 31768: 5f ad ldd r21, Y+63 ; 0x3f 3176a: 6e 97 sbiw r28, 0x1e ; 30 3176c: a2 96 adiw r28, 0x22 ; 34 3176e: 6c ad ldd r22, Y+60 ; 0x3c 31770: 7d ad ldd r23, Y+61 ; 0x3d 31772: 8e ad ldd r24, Y+62 ; 0x3e 31774: 9f ad ldd r25, Y+63 ; 0x3f 31776: a2 97 sbiw r28, 0x22 ; 34 31778: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3177c: 9b 01 movw r18, r22 3177e: ac 01 movw r20, r24 31780: c5 01 movw r24, r10 31782: b4 01 movw r22, r8 31784: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31788: 9b 01 movw r18, r22 3178a: ac 01 movw r20, r24 SERIAL_ECHOLNPGM("wx:"); MYSERIAL.print(wx); } #endif // SUPPORT_VERBOSITY w = point_weight_y(i, y); cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y); 3178c: ae 96 adiw r28, 0x2e ; 46 3178e: 6c ad ldd r22, Y+60 ; 0x3c 31790: 7d ad ldd r23, Y+61 ; 0x3d 31792: 8e ad ldd r24, Y+62 ; 0x3e 31794: 9f ad ldd r25, Y+63 ; 0x3f 31796: ae 97 sbiw r28, 0x2e ; 46 31798: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 3179c: 20 91 3e 13 lds r18, 0x133E ; 0x80133e 317a0: 30 91 3f 13 lds r19, 0x133F ; 0x80133f 317a4: 40 91 40 13 lds r20, 0x1340 ; 0x801340 317a8: 50 91 41 13 lds r21, 0x1341 ; 0x801341 317ac: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 317b0: 4b 01 movw r8, r22 317b2: 5c 01 movw r10, r24 317b4: 80 92 3e 13 sts 0x133E, r8 ; 0x80133e 317b8: 90 92 3f 13 sts 0x133F, r9 ; 0x80133f 317bc: a0 92 40 13 sts 0x1340, r10 ; 0x801340 317c0: b0 92 41 13 sts 0x1341, r11 ; 0x801341 317c4: cf 56 subi r28, 0x6F ; 111 317c6: df 4f sbci r29, 0xFF ; 255 317c8: 48 81 ld r20, Y 317ca: 59 81 ldd r21, Y+1 ; 0x01 317cc: c1 59 subi r28, 0x91 ; 145 317ce: d0 40 sbci r29, 0x00 ; 0 317d0: 48 5f subi r20, 0xF8 ; 248 317d2: 5f 4f sbci r21, 0xFF ; 255 317d4: cf 56 subi r28, 0x6F ; 111 317d6: df 4f sbci r29, 0xFF ; 255 317d8: 59 83 std Y+1, r21 ; 0x01 317da: 48 83 st Y, r20 317dc: c1 59 subi r28, 0x91 ; 145 317de: d0 40 sbci r29, 0x00 ; 0 317e0: cd 56 subi r28, 0x6D ; 109 317e2: df 4f sbci r29, 0xFF ; 255 317e4: 88 81 ld r24, Y 317e6: 99 81 ldd r25, Y+1 ; 0x01 317e8: c3 59 subi r28, 0x93 ; 147 317ea: d0 40 sbci r29, 0x00 ; 0 317ec: 08 96 adiw r24, 0x08 ; 8 317ee: cd 56 subi r28, 0x6D ; 109 317f0: df 4f sbci r29, 0xFF ; 255 317f2: 99 83 std Y+1, r25 ; 0x01 317f4: 88 83 st Y, r24 317f6: c3 59 subi r28, 0x93 ; 147 317f8: d0 40 sbci r29, 0x00 ; 0 // Refresh the offset. cntr[0] = 0.f; cntr[1] = 0.f; float wx = 0.f; float wy = 0.f; for (int8_t i = 0; i < npts; ++ i) { 317fa: 24 16 cp r2, r20 317fc: 35 06 cpc r3, r21 317fe: 09 f0 breq .+2 ; 0x31802 31800: 24 cf rjmp .-440 ; 0x3164a SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY } cntr[0] /= wx; 31802: a3 01 movw r20, r6 31804: 92 01 movw r18, r4 31806: c7 01 movw r24, r14 31808: b6 01 movw r22, r12 3180a: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 3180e: 60 93 3a 13 sts 0x133A, r22 ; 0x80133a 31812: 70 93 3b 13 sts 0x133B, r23 ; 0x80133b 31816: 80 93 3c 13 sts 0x133C, r24 ; 0x80133c 3181a: 90 93 3d 13 sts 0x133D, r25 ; 0x80133d cntr[1] /= wy; 3181e: a3 01 movw r20, r6 31820: 92 01 movw r18, r4 31822: c5 01 movw r24, r10 31824: b4 01 movw r22, r8 31826: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 3182a: 60 93 3e 13 sts 0x133E, r22 ; 0x80133e 3182e: 70 93 3f 13 sts 0x133F, r23 ; 0x80133f 31832: 80 93 40 13 sts 0x1340, r24 ; 0x801340 31836: 90 93 41 13 sts 0x1341, r25 ; 0x801341 #endif // SUPPORT_VERBOSITY } // Invert the transformation matrix made of vec_x, vec_y and cntr. { float d = vec_x[0] * vec_y[1] - vec_x[1] * vec_y[0]; 3183a: 40 90 2a 13 lds r4, 0x132A ; 0x80132a 3183e: 50 90 2b 13 lds r5, 0x132B ; 0x80132b 31842: 60 90 2c 13 lds r6, 0x132C ; 0x80132c 31846: 70 90 2d 13 lds r7, 0x132D ; 0x80132d 3184a: c0 90 36 13 lds r12, 0x1336 ; 0x801336 3184e: d0 90 37 13 lds r13, 0x1337 ; 0x801337 31852: e0 90 38 13 lds r14, 0x1338 ; 0x801338 31856: f0 90 39 13 lds r15, 0x1339 ; 0x801339 3185a: 20 91 2e 13 lds r18, 0x132E ; 0x80132e 3185e: 30 91 2f 13 lds r19, 0x132F ; 0x80132f 31862: 40 91 30 13 lds r20, 0x1330 ; 0x801330 31866: 50 91 31 13 lds r21, 0x1331 ; 0x801331 3186a: a2 96 adiw r28, 0x22 ; 34 3186c: 2c af std Y+60, r18 ; 0x3c 3186e: 3d af std Y+61, r19 ; 0x3d 31870: 4e af std Y+62, r20 ; 0x3e 31872: 5f af std Y+63, r21 ; 0x3f 31874: a2 97 sbiw r28, 0x22 ; 34 31876: 80 91 32 13 lds r24, 0x1332 ; 0x801332 3187a: 90 91 33 13 lds r25, 0x1333 ; 0x801333 3187e: a0 91 34 13 lds r26, 0x1334 ; 0x801334 31882: b0 91 35 13 lds r27, 0x1335 ; 0x801335 31886: a6 96 adiw r28, 0x26 ; 38 31888: 8c af std Y+60, r24 ; 0x3c 3188a: 9d af std Y+61, r25 ; 0x3d 3188c: ae af std Y+62, r26 ; 0x3e 3188e: bf af std Y+63, r27 ; 0x3f 31890: a6 97 sbiw r28, 0x26 ; 38 31892: a7 01 movw r20, r14 31894: 96 01 movw r18, r12 31896: c3 01 movw r24, r6 31898: b2 01 movw r22, r4 3189a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3189e: 4b 01 movw r8, r22 318a0: 5c 01 movw r10, r24 318a2: a6 96 adiw r28, 0x26 ; 38 318a4: 2c ad ldd r18, Y+60 ; 0x3c 318a6: 3d ad ldd r19, Y+61 ; 0x3d 318a8: 4e ad ldd r20, Y+62 ; 0x3e 318aa: 5f ad ldd r21, Y+63 ; 0x3f 318ac: a6 97 sbiw r28, 0x26 ; 38 318ae: a2 96 adiw r28, 0x22 ; 34 318b0: 6c ad ldd r22, Y+60 ; 0x3c 318b2: 7d ad ldd r23, Y+61 ; 0x3d 318b4: 8e ad ldd r24, Y+62 ; 0x3e 318b6: 9f ad ldd r25, Y+63 ; 0x3f 318b8: a2 97 sbiw r28, 0x22 ; 34 318ba: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 318be: 9b 01 movw r18, r22 318c0: ac 01 movw r20, r24 318c2: c5 01 movw r24, r10 318c4: b4 01 movw r22, r8 318c6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 318ca: 4b 01 movw r8, r22 318cc: 5c 01 movw r10, r24 float Ainv[2][2] = { { vec_y[1] / d, -vec_y[0] / d }, 318ce: ac 01 movw r20, r24 318d0: 9b 01 movw r18, r22 318d2: c7 01 movw r24, r14 318d4: b6 01 movw r22, r12 318d6: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 318da: 6b 01 movw r12, r22 318dc: 7c 01 movw r14, r24 318de: a6 96 adiw r28, 0x26 ; 38 318e0: 6c ad ldd r22, Y+60 ; 0x3c 318e2: 7d ad ldd r23, Y+61 ; 0x3d 318e4: 8e ad ldd r24, Y+62 ; 0x3e 318e6: 9f ad ldd r25, Y+63 ; 0x3f 318e8: a6 97 sbiw r28, 0x26 ; 38 318ea: 90 58 subi r25, 0x80 ; 128 318ec: a5 01 movw r20, r10 318ee: 94 01 movw r18, r8 318f0: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 318f4: a6 96 adiw r28, 0x26 ; 38 318f6: 6c af std Y+60, r22 ; 0x3c 318f8: 7d af std Y+61, r23 ; 0x3d 318fa: 8e af std Y+62, r24 ; 0x3e 318fc: 9f af std Y+63, r25 ; 0x3f 318fe: a6 97 sbiw r28, 0x26 ; 38 { -vec_x[1] / d, vec_x[0] / d } 31900: a2 96 adiw r28, 0x22 ; 34 31902: 6c ad ldd r22, Y+60 ; 0x3c 31904: 7d ad ldd r23, Y+61 ; 0x3d 31906: 8e ad ldd r24, Y+62 ; 0x3e 31908: 9f ad ldd r25, Y+63 ; 0x3f 3190a: a2 97 sbiw r28, 0x22 ; 34 3190c: 90 58 subi r25, 0x80 ; 128 3190e: a5 01 movw r20, r10 31910: 94 01 movw r18, r8 31912: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 31916: aa 96 adiw r28, 0x2a ; 42 31918: 6c af std Y+60, r22 ; 0x3c 3191a: 7d af std Y+61, r23 ; 0x3d 3191c: 8e af std Y+62, r24 ; 0x3e 3191e: 9f af std Y+63, r25 ; 0x3f 31920: aa 97 sbiw r28, 0x2a ; 42 31922: a5 01 movw r20, r10 31924: 94 01 movw r18, r8 31926: c3 01 movw r24, r6 31928: b2 01 movw r22, r4 3192a: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 3192e: 4b 01 movw r8, r22 31930: 5c 01 movw r10, r24 }; float cntrInv[2] = { -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1], 31932: 40 90 3a 13 lds r4, 0x133A ; 0x80133a 31936: 50 90 3b 13 lds r5, 0x133B ; 0x80133b 3193a: 60 90 3c 13 lds r6, 0x133C ; 0x80133c 3193e: 70 90 3d 13 lds r7, 0x133D ; 0x80133d 31942: 20 91 3e 13 lds r18, 0x133E ; 0x80133e 31946: 30 91 3f 13 lds r19, 0x133F ; 0x80133f 3194a: 40 91 40 13 lds r20, 0x1340 ; 0x801340 3194e: 50 91 41 13 lds r21, 0x1341 ; 0x801341 31952: a2 96 adiw r28, 0x22 ; 34 31954: 2c af std Y+60, r18 ; 0x3c 31956: 3d af std Y+61, r19 ; 0x3d 31958: 4e af std Y+62, r20 ; 0x3e 3195a: 5f af std Y+63, r21 ; 0x3f 3195c: a2 97 sbiw r28, 0x22 ; 34 -Ainv[1][0] * cntr[0] - Ainv[1][1] * cntr[1] }; vec_x[0] = Ainv[0][0]; 3195e: c0 92 2a 13 sts 0x132A, r12 ; 0x80132a 31962: d0 92 2b 13 sts 0x132B, r13 ; 0x80132b 31966: e0 92 2c 13 sts 0x132C, r14 ; 0x80132c 3196a: f0 92 2d 13 sts 0x132D, r15 ; 0x80132d vec_x[1] = Ainv[1][0]; 3196e: aa 96 adiw r28, 0x2a ; 42 31970: 8c ad ldd r24, Y+60 ; 0x3c 31972: 9d ad ldd r25, Y+61 ; 0x3d 31974: ae ad ldd r26, Y+62 ; 0x3e 31976: bf ad ldd r27, Y+63 ; 0x3f 31978: aa 97 sbiw r28, 0x2a ; 42 3197a: 80 93 2e 13 sts 0x132E, r24 ; 0x80132e 3197e: 90 93 2f 13 sts 0x132F, r25 ; 0x80132f 31982: a0 93 30 13 sts 0x1330, r26 ; 0x801330 31986: b0 93 31 13 sts 0x1331, r27 ; 0x801331 vec_y[0] = Ainv[0][1]; 3198a: a6 96 adiw r28, 0x26 ; 38 3198c: 2c ad ldd r18, Y+60 ; 0x3c 3198e: 3d ad ldd r19, Y+61 ; 0x3d 31990: 4e ad ldd r20, Y+62 ; 0x3e 31992: 5f ad ldd r21, Y+63 ; 0x3f 31994: a6 97 sbiw r28, 0x26 ; 38 31996: 20 93 32 13 sts 0x1332, r18 ; 0x801332 3199a: 30 93 33 13 sts 0x1333, r19 ; 0x801333 3199e: 40 93 34 13 sts 0x1334, r20 ; 0x801334 319a2: 50 93 35 13 sts 0x1335, r21 ; 0x801335 vec_y[1] = Ainv[1][1]; 319a6: 80 92 36 13 sts 0x1336, r8 ; 0x801336 319aa: 90 92 37 13 sts 0x1337, r9 ; 0x801337 319ae: a0 92 38 13 sts 0x1338, r10 ; 0x801338 319b2: b0 92 39 13 sts 0x1339, r11 ; 0x801339 float Ainv[2][2] = { { vec_y[1] / d, -vec_y[0] / d }, { -vec_x[1] / d, vec_x[0] / d } }; float cntrInv[2] = { -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1], 319b6: c7 01 movw r24, r14 319b8: b6 01 movw r22, r12 319ba: 90 58 subi r25, 0x80 ; 128 319bc: a3 01 movw r20, r6 319be: 92 01 movw r18, r4 319c0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 319c4: 6b 01 movw r12, r22 319c6: 7c 01 movw r14, r24 319c8: a2 96 adiw r28, 0x22 ; 34 319ca: 2c ad ldd r18, Y+60 ; 0x3c 319cc: 3d ad ldd r19, Y+61 ; 0x3d 319ce: 4e ad ldd r20, Y+62 ; 0x3e 319d0: 5f ad ldd r21, Y+63 ; 0x3f 319d2: a2 97 sbiw r28, 0x22 ; 34 319d4: a6 96 adiw r28, 0x26 ; 38 319d6: 6c ad ldd r22, Y+60 ; 0x3c 319d8: 7d ad ldd r23, Y+61 ; 0x3d 319da: 8e ad ldd r24, Y+62 ; 0x3e 319dc: 9f ad ldd r25, Y+63 ; 0x3f 319de: a6 97 sbiw r28, 0x26 ; 38 319e0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 319e4: 9b 01 movw r18, r22 319e6: ac 01 movw r20, r24 319e8: c7 01 movw r24, r14 319ea: b6 01 movw r22, r12 319ec: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> }; vec_x[0] = Ainv[0][0]; vec_x[1] = Ainv[1][0]; vec_y[0] = Ainv[0][1]; vec_y[1] = Ainv[1][1]; cntr[0] = cntrInv[0]; 319f0: 60 93 3a 13 sts 0x133A, r22 ; 0x80133a 319f4: 70 93 3b 13 sts 0x133B, r23 ; 0x80133b 319f8: 80 93 3c 13 sts 0x133C, r24 ; 0x80133c 319fc: 90 93 3d 13 sts 0x133D, r25 ; 0x80133d { vec_y[1] / d, -vec_y[0] / d }, { -vec_x[1] / d, vec_x[0] / d } }; float cntrInv[2] = { -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1], -Ainv[1][0] * cntr[0] - Ainv[1][1] * cntr[1] 31a00: aa 96 adiw r28, 0x2a ; 42 31a02: 6c ad ldd r22, Y+60 ; 0x3c 31a04: 7d ad ldd r23, Y+61 ; 0x3d 31a06: 8e ad ldd r24, Y+62 ; 0x3e 31a08: 9f ad ldd r25, Y+63 ; 0x3f 31a0a: aa 97 sbiw r28, 0x2a ; 42 31a0c: 90 58 subi r25, 0x80 ; 128 31a0e: a3 01 movw r20, r6 31a10: 92 01 movw r18, r4 31a12: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31a16: 6b 01 movw r12, r22 31a18: 7c 01 movw r14, r24 31a1a: a2 96 adiw r28, 0x22 ; 34 31a1c: 2c ad ldd r18, Y+60 ; 0x3c 31a1e: 3d ad ldd r19, Y+61 ; 0x3d 31a20: 4e ad ldd r20, Y+62 ; 0x3e 31a22: 5f ad ldd r21, Y+63 ; 0x3f 31a24: a2 97 sbiw r28, 0x22 ; 34 31a26: c5 01 movw r24, r10 31a28: b4 01 movw r22, r8 31a2a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31a2e: 9b 01 movw r18, r22 31a30: ac 01 movw r20, r24 31a32: c7 01 movw r24, r14 31a34: b6 01 movw r22, r12 31a36: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> vec_x[0] = Ainv[0][0]; vec_x[1] = Ainv[1][0]; vec_y[0] = Ainv[0][1]; vec_y[1] = Ainv[1][1]; cntr[0] = cntrInv[0]; cntr[1] = cntrInv[1]; 31a3a: 60 93 3e 13 sts 0x133E, r22 ; 0x80133e 31a3e: 70 93 3f 13 sts 0x133F, r23 ; 0x80133f 31a42: 80 93 40 13 sts 0x1340, r24 ; 0x801340 31a46: 90 93 41 13 sts 0x1341, r25 ; 0x801341 MYSERIAL.print(pts[1]); SERIAL_ECHOPGM(" < "); MYSERIAL.println(Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); } result = calculate_machine_skew_and_offset_LS(pts, 4, bed_ref_points_4, vec_x, vec_y, cntr, verbosity_level); delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity 31a4a: 90 e0 ldi r25, 0x00 ; 0 31a4c: 80 e0 ldi r24, 0x00 ; 0 31a4e: 0e 94 8e 8e call 0x11d1c ; 0x11d1c if (result >= 0) { 31a52: 17 fd sbrc r17, 7 31a54: d5 c0 rjmp .+426 ; 0x31c00 DBG(_n("Calibration success.\n")); 31a56: 83 ea ldi r24, 0xA3 ; 163 31a58: 9b e6 ldi r25, 0x6B ; 107 31a5a: 9f 93 push r25 31a5c: 8f 93 push r24 31a5e: 0f 94 a2 a2 call 0x34544 ; 0x34544 world2machine_update(vec_x, vec_y, cntr); 31a62: 4a e3 ldi r20, 0x3A ; 58 31a64: 53 e1 ldi r21, 0x13 ; 19 31a66: 62 e3 ldi r22, 0x32 ; 50 31a68: 73 e1 ldi r23, 0x13 ; 19 31a6a: 8a e2 ldi r24, 0x2A ; 42 31a6c: 93 e1 ldi r25, 0x13 ; 19 31a6e: 0e 94 7d 5f call 0xbefa ; 0xbefa #endif //DEBUG_EEPROM_CHANGES } #ifndef DEBUG_EEPROM_CHANGES void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){ eeprom_update_block(__src, __dst, __n); 31a72: 48 e0 ldi r20, 0x08 ; 8 31a74: 50 e0 ldi r21, 0x00 ; 0 31a76: 65 ee ldi r22, 0xE5 ; 229 31a78: 7f e0 ldi r23, 0x0F ; 15 31a7a: 8a e3 ldi r24, 0x3A ; 58 31a7c: 93 e1 ldi r25, 0x13 ; 19 31a7e: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 31a82: 48 e0 ldi r20, 0x08 ; 8 31a84: 50 e0 ldi r21, 0x00 ; 0 31a86: 6d ed ldi r22, 0xDD ; 221 31a88: 7f e0 ldi r23, 0x0F ; 15 31a8a: 8a e2 ldi r24, 0x2A ; 42 31a8c: 93 e1 ldi r25, 0x13 ; 19 31a8e: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 31a92: 48 e0 ldi r20, 0x08 ; 8 31a94: 50 e0 ldi r21, 0x00 ; 0 31a96: 65 ed ldi r22, 0xD5 ; 213 31a98: 7f e0 ldi r23, 0x0F ; 15 31a9a: 82 e3 ldi r24, 0x32 ; 50 31a9c: 93 e1 ldi r25, 0x13 ; 19 31a9e: 0f 94 f4 a3 call 0x347e8 ; 0x347e8 MYSERIAL.println(fabs(l)); SERIAL_ECHOLNPGM("Saving bed calibration vectors to EEPROM"); } #endif // SUPPORT_VERBOSITY // Correct the current_position to match the transformed coordinate system after world2machine_rotation_and_skew and world2machine_shift were set. world2machine_update_current(); 31aa2: 0e 94 02 5f call 0xbe04 ; 0xbe04 } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ DBG(_n("Fitting failed => calibration failed.\n")); 31aa6: 0f 90 pop r0 31aa8: 0f 90 pop r0 BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); clean_up_after_endstop_move(l_feedmultiply); 31aaa: c7 55 subi r28, 0x57 ; 87 31aac: df 4f sbci r29, 0xFF ; 255 31aae: 88 81 ld r24, Y 31ab0: 99 81 ldd r25, Y+1 ; 0x01 31ab2: c9 5a subi r28, 0xA9 ; 169 31ab4: d0 40 sbci r29, 0x00 ; 0 31ab6: 0e 94 4c 65 call 0xca98 ; 0xca98 // Print head up. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 31aba: 80 e0 ldi r24, 0x00 ; 0 31abc: 90 e0 ldi r25, 0x00 ; 0 31abe: a0 ea ldi r26, 0xA0 ; 160 31ac0: b0 e4 ldi r27, 0x40 ; 64 31ac2: 80 93 69 12 sts 0x1269, r24 ; 0x801269 31ac6: 90 93 6a 12 sts 0x126A, r25 ; 0x80126a 31aca: a0 93 6b 12 sts 0x126B, r26 ; 0x80126b 31ace: b0 93 6c 12 sts 0x126C, r27 ; 0x80126c plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 31ad2: 60 e0 ldi r22, 0x00 ; 0 31ad4: 70 e0 ldi r23, 0x00 ; 0 31ad6: 80 ea ldi r24, 0xA0 ; 160 31ad8: 91 e4 ldi r25, 0x41 ; 65 31ada: 0f 94 81 4c call 0x29902 ; 0x29902 st_synchronize(); 31ade: 0f 94 fb 1a call 0x235f6 ; 0x235f6 //#ifndef NEW_XYZCAL if (result >= 0) 31ae2: 17 fd sbrc r17, 7 31ae4: 22 c0 rjmp .+68 ; 0x31b2a bool sample_z() { bool sampled = true; // make some space for the sheet // Avoid calling raise_z(), because a false triggering stallguard may prevent the Z from moving. // The extruder then may ram the sheet hard if not going down from some ~150mm height current_position[Z_AXIS] = 0.F; 31ae6: 10 92 69 12 sts 0x1269, r1 ; 0x801269 31aea: 10 92 6a 12 sts 0x126A, r1 ; 0x80126a 31aee: 10 92 6b 12 sts 0x126B, r1 ; 0x80126b 31af2: 10 92 6c 12 sts 0x126C, r1 ; 0x80126c destination[Z_AXIS] = 150.F; 31af6: 80 e0 ldi r24, 0x00 ; 0 31af8: 90 e0 ldi r25, 0x00 ; 0 31afa: a6 e1 ldi r26, 0x16 ; 22 31afc: b3 e4 ldi r27, 0x43 ; 67 31afe: 80 93 31 06 sts 0x0631, r24 ; 0x800631 31b02: 90 93 32 06 sts 0x0632, r25 ; 0x800632 31b06: a0 93 33 06 sts 0x0633, r26 ; 0x800633 31b0a: b0 93 34 06 sts 0x0634, r27 ; 0x800634 plan_buffer_line_destinationXYZE(homing_feedrate[Z_AXIS] / 60); 31b0e: 65 e5 ldi r22, 0x55 ; 85 31b10: 75 e5 ldi r23, 0x55 ; 85 31b12: 85 e5 ldi r24, 0x55 ; 85 31b14: 91 e4 ldi r25, 0x41 ; 65 31b16: 0f 94 4e 4c call 0x2989c ; 0x2989c lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET)); 31b1a: 83 ed ldi r24, 0xD3 ; 211 31b1c: 9f e5 ldi r25, 0x5F ; 95 31b1e: 0e 94 3a 75 call 0xea74 ; 0xea74 31b22: 0e 94 94 ea call 0x1d528 ; 0x1d528 // Sample Z heights for the mesh bed leveling. // In addition, store the results into an eeprom, to be used later for verification of the bed leveling process. if (!sample_mesh_and_store_reference()) 31b26: 0e 94 4a 83 call 0x10694 ; 0x10694 st_synchronize(); // if (result >= 0) babystep_apply(); #endif //HEATBED_V2 } //#endif //NEW_XYZCAL lcd_update_enable(true); 31b2a: 81 e0 ldi r24, 0x01 ; 1 31b2c: 0e 94 38 70 call 0xe070 ; 0xe070 lcd_update(2); 31b30: 82 e0 ldi r24, 0x02 ; 2 31b32: 0e 94 f9 6e call 0xddf2 ; 0xddf2 void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask) { const char *msg = NULL; if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) { lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND)); 31b36: 84 e9 ldi r24, 0x94 ; 148 31b38: 9f e5 ldi r25, 0x5F ; 95 } void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask) { const char *msg = NULL; if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) { 31b3a: 1f 3f cpi r17, 0xFF ; 255 31b3c: 99 f0 breq .+38 ; 0x31b64 lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND)); } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) { 31b3e: 1e 3f cpi r17, 0xFE ; 254 31b40: 09 f0 breq .+2 ; 0x31b44 31b42: 73 c0 rjmp .+230 ; 0x31c2a if (point_too_far_mask == 0) 31b44: af 96 adiw r28, 0x2f ; 47 31b46: 4f ad ldd r20, Y+63 ; 0x3f 31b48: af 97 sbiw r28, 0x2f ; 47 msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); 31b4a: 8f e5 ldi r24, 0x5F ; 95 31b4c: 9f e5 ldi r25, 0x5F ; 95 { const char *msg = NULL; if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) { lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND)); } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) { if (point_too_far_mask == 0) 31b4e: 44 23 and r20, r20 31b50: 49 f0 breq .+18 ; 0x31b64 msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); else if (point_too_far_mask == 2 || point_too_far_mask == 7) 31b52: af 96 adiw r28, 0x2f ; 47 31b54: 5f ad ldd r21, Y+63 ; 0x3f 31b56: af 97 sbiw r28, 0x2f ; 47 // Only the center point or all the three front points. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR); 31b58: 8d e1 ldi r24, 0x1D ; 29 31b5a: 9f e5 ldi r25, 0x5F ; 95 if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) { lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND)); } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) { if (point_too_far_mask == 0) msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); else if (point_too_far_mask == 2 || point_too_far_mask == 7) 31b5c: 52 30 cpi r21, 0x02 ; 2 31b5e: 11 f0 breq .+4 ; 0x31b64 // Only the center point or all the three front points. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR); else if ((point_too_far_mask & 1) == 0) // The right and maybe the center point out of reach. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR); 31b60: 86 ed ldi r24, 0xD6 ; 214 31b62: 9e e5 ldi r25, 0x5E ; 94 31b64: 0e 94 3a 75 call 0xea74 ; 0xea74 31b68: 0d 94 0a 82 jmp 0x30414 ; 0x30414 (r == 0) ? 1.f : ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : ((c == 2) ? (-s1 * measured_pts[2 * i]) : 31b6c: f2 01 movw r30, r4 31b6e: 25 81 ldd r18, Z+5 ; 0x05 31b70: 36 81 ldd r19, Z+6 ; 0x06 31b72: 47 81 ldd r20, Z+7 ; 0x07 31b74: 50 85 ldd r21, Z+8 ; 0x08 31b76: c3 58 subi r28, 0x83 ; 131 31b78: df 4f sbci r29, 0xFF ; 255 31b7a: 68 81 ld r22, Y 31b7c: 79 81 ldd r23, Y+1 ; 0x01 31b7e: 8a 81 ldd r24, Y+2 ; 0x02 31b80: 9b 81 ldd r25, Y+3 ; 0x03 31b82: cd 57 subi r28, 0x7D ; 125 31b84: d0 40 sbci r29, 0x00 ; 0 31b86: 0d 94 f0 84 jmp 0x309e0 ; 0x309e0 // The first row of the points have a low weight, because their position may not be known // with a sufficient accuracy. if (r != 0 && c != 0) { float a = (r == 1) ? 1.f : ((r == 2) ? ( c1 * measured_pts[2 * i]) : 31b8a: f2 01 movw r30, r4 31b8c: 25 81 ldd r18, Z+5 ; 0x05 31b8e: 36 81 ldd r19, Z+6 ; 0x06 31b90: 47 81 ldd r20, Z+7 ; 0x07 31b92: 50 85 ldd r21, Z+8 ; 0x08 31b94: ed 96 adiw r28, 0x3d ; 61 31b96: 6c ad ldd r22, Y+60 ; 0x3c 31b98: 7d ad ldd r23, Y+61 ; 0x3d 31b9a: 8e ad ldd r24, Y+62 ; 0x3e 31b9c: 9f ad ldd r25, Y+63 ; 0x3f 31b9e: ed 97 sbiw r28, 0x3d ; 61 31ba0: b8 c0 rjmp .+368 ; 0x31d12 (-s2 * measured_pts[2 * i + 1])); float b = (c == 1) ? 1.f : ((c == 2) ? ( c1 * measured_pts[2 * i]) : 31ba2: f2 01 movw r30, r4 31ba4: 25 81 ldd r18, Z+5 ; 0x05 31ba6: 36 81 ldd r19, Z+6 ; 0x06 31ba8: 47 81 ldd r20, Z+7 ; 0x07 31baa: 50 85 ldd r21, Z+8 ; 0x08 31bac: ed 96 adiw r28, 0x3d ; 61 31bae: 6c ad ldd r22, Y+60 ; 0x3c 31bb0: 7d ad ldd r23, Y+61 ; 0x3d 31bb2: 8e ad ldd r24, Y+62 ; 0x3e 31bb4: 9f ad ldd r25, Y+63 ; 0x3f 31bb6: ed 97 sbiw r28, 0x3d ; 61 31bb8: c6 c0 rjmp .+396 ; 0x31d46 for (uint8_t i = 0; i < npts; ++i) { { float j = (r == 0) ? 1.f : ((r == 1) ? 0.f : ((r == 2) ? (-s1 * measured_pts[2 * i]) : 31bba: a3 01 movw r20, r6 31bbc: 92 01 movw r18, r4 31bbe: c3 58 subi r28, 0x83 ; 131 31bc0: df 4f sbci r29, 0xFF ; 255 31bc2: 68 81 ld r22, Y 31bc4: 79 81 ldd r23, Y+1 ; 0x01 31bc6: 8a 81 ldd r24, Y+2 ; 0x02 31bc8: 9b 81 ldd r25, Y+3 ; 0x03 31bca: cd 57 subi r28, 0x7D ; 125 31bcc: d0 40 sbci r29, 0x00 ; 0 31bce: 0d 94 58 85 jmp 0x30ab0 ; 0x30ab0 // J^T times f(x) acc = 0.f; for (uint8_t i = 0; i < npts; ++i) { { float j = (r == 0) ? 1.f : 31bd2: 81 2c mov r8, r1 31bd4: 91 2c mov r9, r1 31bd6: 20 e8 ldi r18, 0x80 ; 128 31bd8: a2 2e mov r10, r18 31bda: 2f e3 ldi r18, 0x3F ; 63 31bdc: b2 2e mov r11, r18 31bde: 0d 94 5c 85 jmp 0x30ab8 ; 0x30ab8 float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += j * fx * w; } { float j = (r == 0) ? 0.f : 31be2: c1 2c mov r12, r1 31be4: d1 2c mov r13, r1 31be6: 76 01 movw r14, r12 31be8: 0d 94 d3 85 jmp 0x30ba6 ; 0x30ba6 ((r == 1) ? 1.f : 31bec: c1 2c mov r12, r1 31bee: d1 2c mov r13, r1 31bf0: 90 e8 ldi r25, 0x80 ; 128 31bf2: e9 2e mov r14, r25 31bf4: 9f e3 ldi r25, 0x3F ; 63 31bf6: f9 2e mov r15, r25 31bf8: 0d 94 d3 85 jmp 0x30ba6 ; 0x30ba6 result = (angleDiff > bed_skew_angle_extreme) ? BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME : BED_SKEW_OFFSET_DETECTION_SKEW_MILD; if (fabs(a1) > bed_skew_angle_extreme || fabs(a2) > bed_skew_angle_extreme) result = BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME; 31bfc: 12 e0 ldi r17, 0x02 ; 2 31bfe: a7 cb rjmp .-2226 ; 0x3134e } } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ 31c00: 1e 3f cpi r17, 0xFE ; 254 31c02: 89 f4 brne .+34 ; 0x31c26 31c04: af 96 adiw r28, 0x2f ; 47 31c06: 3f ad ldd r19, Y+63 ; 0x3f 31c08: af 97 sbiw r28, 0x2f ; 47 31c0a: 32 30 cpi r19, 0x02 ; 2 31c0c: 09 f0 breq .+2 ; 0x31c10 31c0e: 4d cf rjmp .-358 ; 0x31aaa DBG(_n("Fitting failed => calibration failed.\n")); 31c10: 8c e7 ldi r24, 0x7C ; 124 31c12: 9b e6 ldi r25, 0x6B ; 107 31c14: 9f 93 push r25 31c16: 8f 93 push r24 31c18: 0f 94 a2 a2 call 0x34544 ; 0x34544 31c1c: 44 cf rjmp .-376 ; 0x31aa6 // Reset the baby step value and the baby step applied flag. calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Complete XYZ calibration. uint8_t point_too_far_mask = 0; 31c1e: af 96 adiw r28, 0x2f ; 47 31c20: 1f ae std Y+63, r1 ; 0x3f 31c22: af 97 sbiw r28, 0x2f ; 47 31c24: 42 cf rjmp .-380 ; 0x31aaa } } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ 31c26: 1f ef ldi r17, 0xFF ; 255 31c28: 40 cf rjmp .-384 ; 0x31aaa else // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); } else { if (point_too_far_mask != 0) { 31c2a: af 96 adiw r28, 0x2f ; 47 31c2c: 6f ad ldd r22, Y+63 ; 0x3f 31c2e: af 97 sbiw r28, 0x2f ; 47 31c30: 61 11 cpse r22, r1 31c32: 13 c0 rjmp .+38 ; 0x31c5a break; case BED_SKEW_OFFSET_DETECTION_PERFECT: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT); break; case BED_SKEW_OFFSET_DETECTION_SKEW_MILD: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD); 31c34: 8b eb ldi r24, 0xBB ; 187 31c36: 9d e5 ldi r25, 0x5D ; 93 // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); } if (point_too_far_mask == 0 || result > 0) { switch (result) { 31c38: 11 30 cpi r17, 0x01 ; 1 31c3a: 51 f0 breq .+20 ; 0x31c50 break; case BED_SKEW_OFFSET_DETECTION_SKEW_MILD: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD); break; case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME); 31c3c: 88 e7 ldi r24, 0x78 ; 120 31c3e: 9d e5 ldi r25, 0x5D ; 93 // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); } if (point_too_far_mask == 0 || result > 0) { switch (result) { 31c40: 12 30 cpi r17, 0x02 ; 2 31c42: 31 f0 breq .+12 ; 0x31c50 default: // should not happen msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); 31c44: 8f e5 ldi r24, 0x5F ; 95 31c46: 9f e5 ldi r25, 0x5F ; 95 // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); } if (point_too_far_mask == 0 || result > 0) { switch (result) { 31c48: 11 11 cpse r17, r1 31c4a: 02 c0 rjmp .+4 ; 0x31c50 default: // should not happen msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); break; case BED_SKEW_OFFSET_DETECTION_PERFECT: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT); 31c4c: 80 e0 ldi r24, 0x00 ; 0 31c4e: 9e e5 ldi r25, 0x5E ; 94 break; case BED_SKEW_OFFSET_DETECTION_SKEW_MILD: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD); break; case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME: msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME); 31c50: 0e 94 3a 75 call 0xea74 ; 0xea74 break; } lcd_show_fullscreen_message_and_wait_P(msg); 31c54: 0e 94 94 ea call 0x1d528 ; 0x1d528 31c58: 0d c0 rjmp .+26 ; 0x31c74 // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); } else { if (point_too_far_mask != 0) { if (point_too_far_mask == 2 || point_too_far_mask == 7) 31c5a: af 96 adiw r28, 0x2f ; 47 31c5c: 8f ad ldd r24, Y+63 ; 0x3f 31c5e: af 97 sbiw r28, 0x2f ; 47 31c60: 82 30 cpi r24, 0x02 ; 2 31c62: f1 f4 brne .+60 ; 0x31ca0 // Only the center point or all the three front points. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR); 31c64: 8f e8 ldi r24, 0x8F ; 143 31c66: 9e e5 ldi r25, 0x5E ; 94 else if ((point_too_far_mask & 1) == 0) // The right and maybe the center point out of reach. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR); 31c68: 0e 94 3a 75 call 0xea74 ; 0xea74 else // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8 lcd_show_fullscreen_message_and_wait_P(msg); 31c6c: 0e 94 94 ea call 0x1d528 ; 0x1d528 } if (point_too_far_mask == 0 || result > 0) { 31c70: 11 16 cp r1, r17 31c72: 04 f3 brlt .-64 ; 0x31c34 //#endif //NEW_XYZCAL lcd_update_enable(true); lcd_update(2); lcd_bed_calibration_show_result(result, point_too_far_mask); if (result >= 0) 31c74: 1f 3f cpi r17, 0xFF ; 255 31c76: 11 f4 brne .+4 ; 0x31c7c 31c78: 0d 94 b1 7d jmp 0x2fb62 ; 0x2fb62 { // Calibration valid, the machine should be able to print. Advise the user to run the V2Calibration.gcode. calibration_status_set(CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z); 31c7c: 86 e0 ldi r24, 0x06 ; 6 31c7e: 0e 94 4e d7 call 0x1ae9c ; 0x1ae9c if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 31c82: 8f e5 ldi r24, 0x5F ; 95 31c84: 9f e0 ldi r25, 0x0F ; 15 31c86: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 31c8a: 81 11 cpse r24, r1 31c8c: 0d 94 24 82 jmp 0x30448 ; 0x30448 lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET)); 31c90: 8a ef ldi r24, 0xFA ; 250 31c92: 9f e5 ldi r25, 0x5F ; 95 31c94: 0e 94 3a 75 call 0xea74 ; 0xea74 31c98: 0e 94 94 ea call 0x1d528 ; 0x1d528 31c9c: 0d 94 24 82 jmp 0x30448 ; 0x30448 if (point_too_far_mask == 2 || point_too_far_mask == 7) // Only the center point or all the three front points. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR); else if ((point_too_far_mask & 1) == 0) // The right and maybe the center point out of reach. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR); 31ca0: 83 e4 ldi r24, 0x43 ; 67 31ca2: 9e e5 ldi r25, 0x5E ; 94 31ca4: e1 cf rjmp .-62 ; 0x31c68 if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0) ad += 0; if (!ret && (ad < 1440)) if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0) ad += 720; if (!ret && (ad < 2160)) 31ca6: 89 81 ldd r24, Y+1 ; 0x01 31ca8: 9a 81 ldd r25, Y+2 ; 0x02 31caa: 80 37 cpi r24, 0x70 ; 112 31cac: 98 40 sbci r25, 0x08 ; 8 31cae: 10 f0 brcs .+4 ; 0x31cb4 31cb0: 0d 94 5d 82 jmp 0x304ba ; 0x304ba if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0) 31cb4: ae 01 movw r20, r28 31cb6: 4f 5f subi r20, 0xFF ; 255 31cb8: 5f 4f sbci r21, 0xFF ; 255 31cba: 7a 01 movw r14, r20 31cbc: 04 eb ldi r16, 0xB4 ; 180 31cbe: 10 e0 ldi r17, 0x00 ; 0 31cc0: 24 e8 ldi r18, 0x84 ; 132 31cc2: 33 e0 ldi r19, 0x03 ; 3 31cc4: a6 01 movw r20, r12 31cc6: 48 5c subi r20, 0xC8 ; 200 31cc8: 51 09 sbc r21, r1 31cca: 69 2d mov r22, r9 31ccc: 78 2d mov r23, r8 31cce: 8b 2d mov r24, r11 31cd0: 9a 2d mov r25, r10 31cd2: 0f 94 75 5f call 0x2beea ; 0x2beea 31cd6: 88 23 and r24, r24 31cd8: 11 f4 brne .+4 ; 0x31cde 31cda: 0d 94 5d 82 jmp 0x304ba ; 0x304ba ad += 1440; 31cde: 89 81 ldd r24, Y+1 ; 0x01 31ce0: 9a 81 ldd r25, Y+2 ; 0x02 31ce2: 80 56 subi r24, 0x60 ; 96 31ce4: 9a 4f sbci r25, 0xFA ; 250 31ce6: 0d 94 86 7f jmp 0x2ff0c ; 0x2ff0c acc += a * b * w; } // Second for the residuum in the y axis. // The first row of the points have a low weight, because their position may not be known // with a sufficient accuracy. if (r != 0 && c != 0) { 31cea: 00 23 and r16, r16 31cec: 11 f4 brne .+4 ; 0x31cf2 31cee: 0d 94 03 85 jmp 0x30a06 ; 0x30a06 float a = (r == 1) ? 1.f : ((r == 2) ? ( c1 * measured_pts[2 * i]) : 31cf2: 02 30 cpi r16, 0x02 ; 2 31cf4: 09 f0 breq .+2 ; 0x31cf8 31cf6: 49 cf rjmp .-366 ; 0x31b8a 31cf8: d2 01 movw r26, r4 31cfa: 11 96 adiw r26, 0x01 ; 1 31cfc: 2d 91 ld r18, X+ 31cfe: 3d 91 ld r19, X+ 31d00: 4d 91 ld r20, X+ 31d02: 5c 91 ld r21, X 31d04: 14 97 sbiw r26, 0x04 ; 4 31d06: 6e 96 adiw r28, 0x1e ; 30 31d08: 6c ad ldd r22, Y+60 ; 0x3c 31d0a: 7d ad ldd r23, Y+61 ; 0x3d 31d0c: 8e ad ldd r24, Y+62 ; 0x3e 31d0e: 9f ad ldd r25, Y+63 ; 0x3f 31d10: 6e 97 sbiw r28, 0x1e ; 30 31d12: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31d16: 4b 01 movw r8, r22 31d18: 5c 01 movw r10, r24 (-s2 * measured_pts[2 * i + 1])); float b = (c == 1) ? 1.f : 31d1a: 60 e0 ldi r22, 0x00 ; 0 31d1c: 70 e0 ldi r23, 0x00 ; 0 31d1e: 80 e8 ldi r24, 0x80 ; 128 31d20: 9f e3 ldi r25, 0x3F ; 63 31d22: 11 30 cpi r17, 0x01 ; 1 31d24: 91 f0 breq .+36 ; 0x31d4a ((c == 2) ? ( c1 * measured_pts[2 * i]) : 31d26: 12 30 cpi r17, 0x02 ; 2 31d28: 09 f0 breq .+2 ; 0x31d2c 31d2a: 3b cf rjmp .-394 ; 0x31ba2 31d2c: d2 01 movw r26, r4 31d2e: 11 96 adiw r26, 0x01 ; 1 31d30: 2d 91 ld r18, X+ 31d32: 3d 91 ld r19, X+ 31d34: 4d 91 ld r20, X+ 31d36: 5c 91 ld r21, X 31d38: 14 97 sbiw r26, 0x04 ; 4 31d3a: 6e 96 adiw r28, 0x1e ; 30 31d3c: 6c ad ldd r22, Y+60 ; 0x3c 31d3e: 7d ad ldd r23, Y+61 ; 0x3d 31d40: 8e ad ldd r24, Y+62 ; 0x3e 31d42: 9f ad ldd r25, Y+63 ; 0x3f 31d44: 6e 97 sbiw r28, 0x1e ; 30 31d46: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> (-s2 * measured_pts[2 * i + 1])); float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += a * b * w; 31d4a: 9b 01 movw r18, r22 31d4c: ac 01 movw r20, r24 31d4e: c5 01 movw r24, r10 31d50: b4 01 movw r22, r8 31d52: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31d56: 9b 01 movw r18, r22 31d58: ac 01 movw r20, r24 31d5a: c7 01 movw r24, r14 31d5c: b6 01 movw r22, r12 31d5e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 31d62: 6b 01 movw r12, r22 31d64: 7c 01 movw r14, r24 31d66: 0d 94 03 85 jmp 0x30a06 ; 0x30a06 // J^T times J for (uint8_t i = 0; i < npts; ++i) { // First for the residuum in the x axis: if (r != 1 && c != 1) { float a = (r == 0) ? 1.f : 31d6a: 81 2c mov r8, r1 31d6c: 91 2c mov r9, r1 31d6e: 50 e8 ldi r21, 0x80 ; 128 31d70: a5 2e mov r10, r21 31d72: 5f e3 ldi r21, 0x3F ; 63 31d74: b5 2e mov r11, r21 ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : 31d76: 11 11 cpse r17, r1 31d78: 0d 94 dd 84 jmp 0x309ba ; 0x309ba ((c == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += a * b * w; 31d7c: 20 e0 ldi r18, 0x00 ; 0 31d7e: 30 e0 ldi r19, 0x00 ; 0 31d80: 40 e8 ldi r20, 0x80 ; 128 31d82: 5f e3 ldi r21, 0x3F ; 63 31d84: ea cf rjmp .-44 ; 0x31d5a // Second for the residuum in the y axis. // The first row of the points have a low weight, because their position may not be known // with a sufficient accuracy. if (r != 0 && c != 0) { float a = (r == 1) ? 1.f : 31d86: 81 2c mov r8, r1 31d88: 91 2c mov r9, r1 31d8a: 40 e8 ldi r20, 0x80 ; 128 31d8c: a4 2e mov r10, r20 31d8e: 4f e3 ldi r20, 0x3F ; 63 31d90: b4 2e mov r11, r20 acc += a * b * w; } // Second for the residuum in the y axis. // The first row of the points have a low weight, because their position may not be known // with a sufficient accuracy. if (r != 0 && c != 0) { 31d92: 11 11 cpse r17, r1 31d94: c2 cf rjmp .-124 ; 0x31d1a 31d96: 0d 94 03 85 jmp 0x30a06 ; 0x30a06 31d9a: 11 11 cpse r17, r1 31d9c: aa cf rjmp .-172 ; 0x31cf2 31d9e: 0d 94 03 85 jmp 0x30a06 ; 0x30a06 00031da2 : return true; } #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) #endif //FILAMENT_SENSOR static bool lcd_selftest_manual_fan_check(const uint8_t _fan, const bool check_opposite, 31da2: 1f 93 push r17 31da4: cf 93 push r28 31da6: df 93 push r29 31da8: c8 2f mov r28, r24 31daa: d6 2f mov r29, r22 const bool _default) { bool _result = check_opposite; lcd_clear(); 31dac: 0e 94 26 70 call 0xe04c ; 0xe04c lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_FAN)); 31db0: 8d e6 ldi r24, 0x6D ; 109 31db2: 9d e5 ldi r25, 0x5D ; 93 31db4: 0e 94 3a 75 call 0xea74 ; 0xea74 31db8: ac 01 movw r20, r24 31dba: 60 e0 ldi r22, 0x00 ; 0 31dbc: 80 e0 ldi r24, 0x00 ; 0 31dbe: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_PART_FAN) : _T(MSG_SELFTEST_HOTEND_FAN)); setExtruderAutoFanState(3); break; case 1: // object cooling fan lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_HOTEND_FAN) : _T(MSG_SELFTEST_PART_FAN)); 31dc2: 87 e4 ldi r24, 0x47 ; 71 31dc4: 9d e5 ldi r25, 0x5D ; 93 31dc6: c1 11 cpse r28, r1 31dc8: 02 c0 rjmp .+4 ; 0x31dce 31dca: 8a e5 ldi r24, 0x5A ; 90 31dcc: 9d e5 ldi r25, 0x5D ; 93 31dce: 0e 94 3a 75 call 0xea74 ; 0xea74 31dd2: ac 01 movw r20, r24 31dd4: 61 e0 ldi r22, 0x01 ; 1 31dd6: 80 e0 ldi r24, 0x00 ; 0 31dd8: 0e 94 07 70 call 0xe00e ; 0xe00e } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 31ddc: 8f ef ldi r24, 0xFF ; 255 31dde: 80 93 55 12 sts 0x1255, r24 ; 0x801255 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 31de2: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d #endif manage_heater(); 31de6: 0f 94 1c 3a call 0x27438 ; 0x27438 // object cooling fan lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_HOTEND_FAN) : _T(MSG_SELFTEST_PART_FAN)); lcd_selftest_setfan(255); break; } _delay(500); 31dea: 64 ef ldi r22, 0xF4 ; 244 31dec: 71 e0 ldi r23, 0x01 ; 1 31dee: 80 e0 ldi r24, 0x00 ; 0 31df0: 90 e0 ldi r25, 0x00 ; 0 31df2: 0f 94 bd 0d call 0x21b7a ; 0x21b7a lcd_puts_at_P(1, 2, _T(MSG_SELFTEST_FAN_YES)); 31df6: 8c e3 ldi r24, 0x3C ; 60 31df8: 9d e5 ldi r25, 0x5D ; 93 31dfa: 0e 94 3a 75 call 0xea74 ; 0xea74 31dfe: ac 01 movw r20, r24 31e00: 62 e0 ldi r22, 0x02 ; 2 31e02: 81 e0 ldi r24, 0x01 ; 1 31e04: 0e 94 07 70 call 0xe00e ; 0xe00e lcd_putc_at(0, 3, '>'); 31e08: 4e e3 ldi r20, 0x3E ; 62 31e0a: 63 e0 ldi r22, 0x03 ; 3 31e0c: 80 e0 ldi r24, 0x00 ; 0 31e0e: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_puts_P(_T(MSG_SELFTEST_FAN_NO)); 31e12: 8d e2 ldi r24, 0x2D ; 45 31e14: 9d e5 ldi r25, 0x5D ; 93 31e16: 0e 94 3a 75 call 0xea74 ; 0xea74 31e1a: 0e 94 1d 6f call 0xde3a ; 0xde3a lcd_encoder = _default; 31e1e: 6d 2f mov r22, r29 31e20: 70 e0 ldi r23, 0x00 ; 0 31e22: 70 93 1f 06 sts 0x061F, r23 ; 0x80061f 31e26: 60 93 1e 06 sts 0x061E, r22 ; 0x80061e KEEPALIVE_STATE(PAUSED_FOR_USER); 31e2a: 84 e0 ldi r24, 0x04 ; 4 31e2c: 80 93 78 02 sts 0x0278, r24 ; 0x800278 lcd_consume_click(); 31e30: 0e 94 70 73 call 0xe6e0 ; 0xe6e0 31e34: dc 2f mov r29, r28 do { if (lcd_encoder) { if (lcd_encoder < 0) { _result = !check_opposite; 31e36: 11 e0 ldi r17, 0x01 ; 1 31e38: 1c 27 eor r17, r28 KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_consume_click(); do { if (lcd_encoder) { 31e3a: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 31e3e: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 31e42: 00 97 sbiw r24, 0x00 ; 0 31e44: 19 f1 breq .+70 ; 0x31e8c if (lcd_encoder < 0) { 31e46: 97 ff sbrs r25, 7 31e48: 0b c0 rjmp .+22 ; 0x31e60 _result = !check_opposite; 31e4a: d1 2f mov r29, r17 lcd_putc_at(0, 2, '>'); 31e4c: 4e e3 ldi r20, 0x3E ; 62 31e4e: 62 e0 ldi r22, 0x02 ; 2 31e50: 80 e0 ldi r24, 0x00 ; 0 31e52: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_putc_at(0, 3, ' '); 31e56: 40 e2 ldi r20, 0x20 ; 32 31e58: 63 e0 ldi r22, 0x03 ; 3 31e5a: 80 e0 ldi r24, 0x00 ; 0 31e5c: 0e 94 13 70 call 0xe026 ; 0xe026 } if (lcd_encoder > 0) { 31e60: 80 91 1e 06 lds r24, 0x061E ; 0x80061e 31e64: 90 91 1f 06 lds r25, 0x061F ; 0x80061f 31e68: 18 16 cp r1, r24 31e6a: 19 06 cpc r1, r25 31e6c: 5c f4 brge .+22 ; 0x31e84 _result = check_opposite; lcd_putc_at(0, 2, ' '); 31e6e: 40 e2 ldi r20, 0x20 ; 32 31e70: 62 e0 ldi r22, 0x02 ; 2 31e72: 80 e0 ldi r24, 0x00 ; 0 31e74: 0e 94 13 70 call 0xe026 ; 0xe026 lcd_putc_at(0, 3, '>'); 31e78: 4e e3 ldi r20, 0x3E ; 62 31e7a: 63 e0 ldi r22, 0x03 ; 3 31e7c: 80 e0 ldi r24, 0x00 ; 0 31e7e: 0e 94 13 70 call 0xe026 ; 0xe026 31e82: dc 2f mov r29, r28 } lcd_encoder = 0; 31e84: 10 92 1f 06 sts 0x061F, r1 ; 0x80061f 31e88: 10 92 1e 06 sts 0x061E, r1 ; 0x80061e } manage_heater(); 31e8c: 0f 94 1c 3a call 0x27438 ; 0x27438 manage_inactivity(true); 31e90: 81 e0 ldi r24, 0x01 ; 1 31e92: 0e 94 34 8c call 0x11868 ; 0x11868 _delay(100); 31e96: 64 e6 ldi r22, 0x64 ; 100 31e98: 70 e0 ldi r23, 0x00 ; 0 31e9a: 80 e0 ldi r24, 0x00 ; 0 31e9c: 90 e0 ldi r25, 0x00 ; 0 31e9e: 0f 94 bd 0d call 0x21b7a ; 0x21b7a } while (!lcd_clicked()); 31ea2: 0e 94 75 73 call 0xe6ea ; 0xe6ea 31ea6: 88 23 and r24, r24 31ea8: 41 f2 breq .-112 ; 0x31e3a KEEPALIVE_STATE(IN_HANDLER); 31eaa: 82 e0 ldi r24, 0x02 ; 2 31eac: 80 93 78 02 sts 0x0278, r24 ; 0x800278 setExtruderAutoFanState(0); // Turn off hotend fan 31eb0: 80 e0 ldi r24, 0x00 ; 0 31eb2: 0e 94 af 77 call 0xef5e ; 0xef5e } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 31eb6: 10 92 55 12 sts 0x1255, r1 ; 0x801255 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 31eba: 10 92 1d 06 sts 0x061D, r1 ; 0x80061d #endif manage_heater(); 31ebe: 0f 94 1c 3a call 0x27438 ; 0x27438 KEEPALIVE_STATE(IN_HANDLER); setExtruderAutoFanState(0); // Turn off hotend fan lcd_selftest_setfan(0); // Turn off print fan return _result; } 31ec2: 8d 2f mov r24, r29 31ec4: df 91 pop r29 31ec6: cf 91 pop r28 31ec8: 1f 91 pop r17 31eca: 08 95 ret 00031ecc : #define PGM_RD_W(x) (short)pgm_read_word(&x) // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. static float analog2temp(int raw, uint8_t e) { 31ecc: 4f 92 push r4 31ece: 5f 92 push r5 31ed0: 6f 92 push r6 31ed2: 7f 92 push r7 31ed4: af 92 push r10 31ed6: bf 92 push r11 31ed8: cf 92 push r12 31eda: df 92 push r13 31edc: ef 92 push r14 31ede: ff 92 push r15 31ee0: 0f 93 push r16 31ee2: 1f 93 push r17 31ee4: cf 93 push r28 31ee6: df 93 push r29 31ee8: 24 e0 ldi r18, 0x04 ; 4 31eea: 30 e0 ldi r19, 0x00 ; 0 31eec: 41 e0 ldi r20, 0x01 ; 1 31eee: 50 e0 ldi r21, 0x00 ; 0 31ef0: d9 01 movw r26, r18 31ef2: ac 50 subi r26, 0x0C ; 12 31ef4: b6 46 sbci r27, 0x66 ; 102 uint8_t i; short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]); for (i=1; i raw) 31ef6: fd 01 movw r30, r26 31ef8: 65 91 lpm r22, Z+ 31efa: 74 91 lpm r23, Z 31efc: 86 17 cp r24, r22 31efe: 97 07 cpc r25, r23 31f00: 0c f0 brlt .+2 ; 0x31f04 31f02: 66 c0 rjmp .+204 ; 0x31fd0 { celsius = PGM_RD_W((*tt)[i-1][1]) + 31f04: 41 50 subi r20, 0x01 ; 1 31f06: 51 09 sbc r21, r1 31f08: 44 0f add r20, r20 31f0a: 55 1f adc r21, r21 31f0c: 44 0f add r20, r20 31f0e: 55 1f adc r21, r21 31f10: ea 01 movw r28, r20 31f12: ca 50 subi r28, 0x0A ; 10 31f14: d6 46 sbci r29, 0x66 ; 102 31f16: fe 01 movw r30, r28 31f18: 05 91 lpm r16, Z+ 31f1a: 14 91 lpm r17, Z (raw - PGM_RD_W((*tt)[i-1][0])) * 31f1c: 4c 50 subi r20, 0x0C ; 12 31f1e: 56 46 sbci r21, 0x66 ; 102 31f20: fa 01 movw r30, r20 31f22: 65 91 lpm r22, Z+ 31f24: 74 91 lpm r23, Z (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / 31f26: f9 01 movw r30, r18 31f28: ea 50 subi r30, 0x0A ; 10 31f2a: f6 46 sbci r31, 0x66 ; 102 31f2c: e5 90 lpm r14, Z+ 31f2e: f4 90 lpm r15, Z 31f30: fe 01 movw r30, r28 31f32: c5 90 lpm r12, Z+ 31f34: d4 90 lpm r13, Z (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])); 31f36: fd 01 movw r30, r26 31f38: c5 91 lpm r28, Z+ 31f3a: d4 91 lpm r29, Z 31f3c: fa 01 movw r30, r20 31f3e: a5 90 lpm r10, Z+ 31f40: b4 90 lpm r11, Z for (i=1; i raw) { celsius = PGM_RD_W((*tt)[i-1][1]) + (raw - PGM_RD_W((*tt)[i-1][0])) * 31f42: 86 1b sub r24, r22 31f44: 97 0b sbc r25, r23 31f46: bc 01 movw r22, r24 31f48: 99 0f add r25, r25 31f4a: 88 0b sbc r24, r24 31f4c: 99 0b sbc r25, r25 31f4e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 31f52: 2b 01 movw r4, r22 31f54: 3c 01 movw r6, r24 (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / 31f56: b7 01 movw r22, r14 31f58: 6c 19 sub r22, r12 31f5a: 7d 09 sbc r23, r13 31f5c: 07 2e mov r0, r23 31f5e: 00 0c add r0, r0 31f60: 88 0b sbc r24, r24 31f62: 99 0b sbc r25, r25 31f64: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 31f68: 9b 01 movw r18, r22 31f6a: ac 01 movw r20, r24 for (i=1; i raw) { celsius = PGM_RD_W((*tt)[i-1][1]) + (raw - PGM_RD_W((*tt)[i-1][0])) * 31f6c: c3 01 movw r24, r6 31f6e: b2 01 movw r22, r4 31f70: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 31f74: 6b 01 movw r12, r22 31f76: 7c 01 movw r14, r24 (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])); 31f78: be 01 movw r22, r28 31f7a: 6a 19 sub r22, r10 31f7c: 7b 09 sbc r23, r11 31f7e: 07 2e mov r0, r23 31f80: 00 0c add r0, r0 31f82: 88 0b sbc r24, r24 31f84: 99 0b sbc r25, r25 31f86: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 31f8a: 9b 01 movw r18, r22 31f8c: ac 01 movw r20, r24 { if (PGM_RD_W((*tt)[i][0]) > raw) { celsius = PGM_RD_W((*tt)[i-1][1]) + (raw - PGM_RD_W((*tt)[i-1][0])) * (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / 31f8e: c7 01 movw r24, r14 31f90: b6 01 movw r22, r12 31f92: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 31f96: 6b 01 movw r12, r22 31f98: 7c 01 movw r14, r24 for (i=1; i raw) { celsius = PGM_RD_W((*tt)[i-1][1]) + 31f9a: b8 01 movw r22, r16 31f9c: 11 0f add r17, r17 31f9e: 88 0b sbc r24, r24 31fa0: 99 0b sbc r25, r25 31fa2: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 31fa6: 9b 01 movw r18, r22 31fa8: ac 01 movw r20, r24 31faa: c7 01 movw r24, r14 31fac: b6 01 movw r22, r12 31fae: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]); return celsius; } return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET; } 31fb2: df 91 pop r29 31fb4: cf 91 pop r28 31fb6: 1f 91 pop r17 31fb8: 0f 91 pop r16 31fba: ff 90 pop r15 31fbc: ef 90 pop r14 31fbe: df 90 pop r13 31fc0: cf 90 pop r12 31fc2: bf 90 pop r11 31fc4: af 90 pop r10 31fc6: 7f 90 pop r7 31fc8: 6f 90 pop r6 31fca: 5f 90 pop r5 31fcc: 4f 90 pop r4 31fce: 08 95 ret 31fd0: 4f 5f subi r20, 0xFF ; 255 31fd2: 5f 4f sbci r21, 0xFF ; 255 31fd4: 2c 5f subi r18, 0xFC ; 252 31fd6: 3f 4f sbci r19, 0xFF ; 255 { float celsius = 0; uint8_t i; short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]); for (i=1; i 31fde: 88 cf rjmp .-240 ; 0x31ef0 break; } } // Overflow: Set to last value in the table if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]); 31fe0: e2 e7 ldi r30, 0x72 ; 114 31fe2: fa e9 ldi r31, 0x9A ; 154 31fe4: 65 91 lpm r22, Z+ 31fe6: 74 91 lpm r23, Z 31fe8: 07 2e mov r0, r23 31fea: 00 0c add r0, r0 31fec: 88 0b sbc r24, r24 31fee: 99 0b sbc r25, r25 31ff0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 31ff4: de cf rjmp .-68 ; 0x31fb2 00031ff6 : useU2X = false; } #endif // set up the first (original serial port) if (useU2X) { M_UCSRxA = 1 << M_U2Xx; 31ff6: 22 e0 ldi r18, 0x02 ; 2 31ff8: 20 93 c0 00 sts 0x00C0, r18 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> M_UCSRxA = 0; baud_setting = (F_CPU / 8 / baud - 1) / 2; } // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) M_UBRRxH = baud_setting >> 8; 31ffc: 10 92 c5 00 sts 0x00C5, r1 ; 0x8000c5 <__TEXT_REGION_LENGTH__+0x7c20c5> M_UBRRxL = baud_setting; 32000: 90 e1 ldi r25, 0x10 ; 16 32002: 90 93 c4 00 sts 0x00C4, r25 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7c20c4> sbi(M_UCSRxB, M_RXENx); 32006: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 3200a: 80 61 ori r24, 0x10 ; 16 3200c: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> sbi(M_UCSRxB, M_TXENx); 32010: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 32014: 88 60 ori r24, 0x08 ; 8 32016: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> sbi(M_UCSRxB, M_RXCIEx); 3201a: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 3201e: 80 68 ori r24, 0x80 ; 128 32020: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> if (selectedSerialPort == 1) { //set up also the second serial port 32024: 80 91 1c 06 lds r24, 0x061C ; 0x80061c 32028: 81 30 cpi r24, 0x01 ; 1 3202a: a9 f4 brne .+42 ; 0x32056 if (useU2X) { UCSR1A = 1 << U2X1; 3202c: 20 93 c8 00 sts 0x00C8, r18 ; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8> UCSR1A = 0; baud_setting = (F_CPU / 8 / baud - 1) / 2; } // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) UBRR1H = baud_setting >> 8; 32030: 10 92 cd 00 sts 0x00CD, r1 ; 0x8000cd <__TEXT_REGION_LENGTH__+0x7c20cd> UBRR1L = baud_setting; 32034: 90 93 cc 00 sts 0x00CC, r25 ; 0x8000cc <__TEXT_REGION_LENGTH__+0x7c20cc> sbi(UCSR1B, RXEN1); 32038: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 3203c: 80 61 ori r24, 0x10 ; 16 3203e: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> sbi(UCSR1B, TXEN1); 32042: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 32046: 88 60 ori r24, 0x08 ; 8 32048: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> sbi(UCSR1B, RXCIE1); 3204c: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 32050: 80 68 ori r24, 0x80 ; 128 32052: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> } } 32056: 08 95 ret 00032058 : { previous_millis_cmd.start(); } #ifdef FWRETRACT void retract(bool retracting, bool swapretract = false) { 32058: 8f 92 push r8 3205a: 9f 92 push r9 3205c: af 92 push r10 3205e: bf 92 push r11 32060: cf 92 push r12 32062: df 92 push r13 32064: ef 92 push r14 32066: ff 92 push r15 32068: 90 91 1b 06 lds r25, 0x061B ; 0x80061b // Perform FW retraction, just if needed, but behave as if the move has never took place in // order to keep E/Z coordinates unchanged. This is done by manipulating the internal planner // position, which requires a sync if(retracting && !retracted[active_extruder]) { 3206c: 88 23 and r24, r24 3206e: 09 f4 brne .+2 ; 0x32072 32070: 9d c0 rjmp .+314 ; 0x321ac 32072: 91 11 cpse r25, r1 32074: 92 c0 rjmp .+292 ; 0x3219a st_synchronize(); 32076: 0f 94 fb 1a call 0x235f6 ; 0x235f6 set_destination_to_current(); 3207a: 0e 94 ae 66 call 0xcd5c ; 0xcd5c current_position[E_AXIS]+=(swapretract?retract_length_swap:cs.retract_length)*float(extrudemultiply)*0.01f; 3207e: 60 91 75 02 lds r22, 0x0275 ; 0x800275 32082: 70 91 76 02 lds r23, 0x0276 ; 0x800276 32086: 07 2e mov r0, r23 32088: 00 0c add r0, r0 3208a: 88 0b sbc r24, r24 3208c: 99 0b sbc r25, r25 3208e: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 32092: 20 91 ea 0d lds r18, 0x0DEA ; 0x800dea 32096: 30 91 eb 0d lds r19, 0x0DEB ; 0x800deb 3209a: 40 91 ec 0d lds r20, 0x0DEC ; 0x800dec 3209e: 50 91 ed 0d lds r21, 0x0DED ; 0x800ded 320a2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 320a6: 2a e0 ldi r18, 0x0A ; 10 320a8: 37 ed ldi r19, 0xD7 ; 215 320aa: 43 e2 ldi r20, 0x23 ; 35 320ac: 5c e3 ldi r21, 0x3C ; 60 320ae: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 320b2: 20 91 6d 12 lds r18, 0x126D ; 0x80126d 320b6: 30 91 6e 12 lds r19, 0x126E ; 0x80126e 320ba: 40 91 6f 12 lds r20, 0x126F ; 0x80126f 320be: 50 91 70 12 lds r21, 0x1270 ; 0x801270 320c2: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 320c6: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 320ca: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 320ce: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 320d2: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_set_e_position(current_position[E_AXIS]); 320d6: 8d e6 ldi r24, 0x6D ; 109 320d8: 92 e1 ldi r25, 0x12 ; 18 320da: 0f 94 d9 3c call 0x279b2 ; 0x279b2 float oldFeedrate = feedrate; 320de: c0 90 7a 02 lds r12, 0x027A ; 0x80027a 320e2: d0 90 7b 02 lds r13, 0x027B ; 0x80027b 320e6: e0 90 7c 02 lds r14, 0x027C ; 0x80027c 320ea: f0 90 7d 02 lds r15, 0x027D ; 0x80027d feedrate=cs.retract_feedrate*60; 320ee: 20 e0 ldi r18, 0x00 ; 0 320f0: 30 e0 ldi r19, 0x00 ; 0 320f2: 40 e7 ldi r20, 0x70 ; 112 320f4: 52 e4 ldi r21, 0x42 ; 66 320f6: 60 91 ee 0d lds r22, 0x0DEE ; 0x800dee 320fa: 70 91 ef 0d lds r23, 0x0DEF ; 0x800def 320fe: 80 91 f0 0d lds r24, 0x0DF0 ; 0x800df0 32102: 90 91 f1 0d lds r25, 0x0DF1 ; 0x800df1 32106: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3210a: 60 93 7a 02 sts 0x027A, r22 ; 0x80027a 3210e: 70 93 7b 02 sts 0x027B, r23 ; 0x80027b 32112: 80 93 7c 02 sts 0x027C, r24 ; 0x80027c 32116: 90 93 7d 02 sts 0x027D, r25 ; 0x80027d retracted[active_extruder]=true; 3211a: 81 e0 ldi r24, 0x01 ; 1 3211c: 80 93 1b 06 sts 0x061B, r24 ; 0x80061b prepare_move(); 32120: 90 e0 ldi r25, 0x00 ; 0 32122: 80 e0 ldi r24, 0x00 ; 0 32124: 0e 94 bb 6a call 0xd576 ; 0xd576 if(cs.retract_zlift) { 32128: 20 e0 ldi r18, 0x00 ; 0 3212a: 30 e0 ldi r19, 0x00 ; 0 3212c: a9 01 movw r20, r18 3212e: 60 91 f2 0d lds r22, 0x0DF2 ; 0x800df2 32132: 70 91 f3 0d lds r23, 0x0DF3 ; 0x800df3 32136: 80 91 f4 0d lds r24, 0x0DF4 ; 0x800df4 3213a: 90 91 f5 0d lds r25, 0x0DF5 ; 0x800df5 3213e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 32142: 88 23 and r24, r24 32144: 11 f1 breq .+68 ; 0x3218a st_synchronize(); 32146: 0f 94 fb 1a call 0x235f6 ; 0x235f6 current_position[Z_AXIS]-=cs.retract_zlift; 3214a: 20 91 f2 0d lds r18, 0x0DF2 ; 0x800df2 3214e: 30 91 f3 0d lds r19, 0x0DF3 ; 0x800df3 32152: 40 91 f4 0d lds r20, 0x0DF4 ; 0x800df4 32156: 50 91 f5 0d lds r21, 0x0DF5 ; 0x800df5 3215a: 60 91 69 12 lds r22, 0x1269 ; 0x801269 3215e: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 32162: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 32166: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 3216a: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 3216e: 60 93 69 12 sts 0x1269, r22 ; 0x801269 32172: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 32176: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 3217a: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c plan_set_position_curposXYZE(); 3217e: 0f 94 41 4b call 0x29682 ; 0x29682 prepare_move(); 32182: 90 e0 ldi r25, 0x00 ; 0 32184: 80 e0 ldi r24, 0x00 ; 0 32186: 0e 94 bb 6a call 0xd576 ; 0xd576 } feedrate = oldFeedrate; 3218a: c0 92 7a 02 sts 0x027A, r12 ; 0x80027a 3218e: d0 92 7b 02 sts 0x027B, r13 ; 0x80027b 32192: e0 92 7c 02 sts 0x027C, r14 ; 0x80027c 32196: f0 92 7d 02 sts 0x027D, r15 ; 0x80027d plan_set_e_position(current_position[E_AXIS]); retracted[active_extruder]=false; prepare_move(); feedrate = oldFeedrate; } } //retract 3219a: ff 90 pop r15 3219c: ef 90 pop r14 3219e: df 90 pop r13 321a0: cf 90 pop r12 321a2: bf 90 pop r11 321a4: af 90 pop r10 321a6: 9f 90 pop r9 321a8: 8f 90 pop r8 321aa: 08 95 ret current_position[Z_AXIS]-=cs.retract_zlift; plan_set_position_curposXYZE(); prepare_move(); } feedrate = oldFeedrate; } else if(!retracting && retracted[active_extruder]) { 321ac: 99 23 and r25, r25 321ae: a9 f3 breq .-22 ; 0x3219a st_synchronize(); 321b0: 0f 94 fb 1a call 0x235f6 ; 0x235f6 set_destination_to_current(); 321b4: 0e 94 ae 66 call 0xcd5c ; 0xcd5c float oldFeedrate = feedrate; 321b8: 80 90 7a 02 lds r8, 0x027A ; 0x80027a 321bc: 90 90 7b 02 lds r9, 0x027B ; 0x80027b 321c0: a0 90 7c 02 lds r10, 0x027C ; 0x80027c 321c4: b0 90 7d 02 lds r11, 0x027D ; 0x80027d feedrate=cs.retract_recover_feedrate*60; 321c8: 20 e0 ldi r18, 0x00 ; 0 321ca: 30 e0 ldi r19, 0x00 ; 0 321cc: 40 e7 ldi r20, 0x70 ; 112 321ce: 52 e4 ldi r21, 0x42 ; 66 321d0: 60 91 fa 0d lds r22, 0x0DFA ; 0x800dfa 321d4: 70 91 fb 0d lds r23, 0x0DFB ; 0x800dfb 321d8: 80 91 fc 0d lds r24, 0x0DFC ; 0x800dfc 321dc: 90 91 fd 0d lds r25, 0x0DFD ; 0x800dfd 321e0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 321e4: 60 93 7a 02 sts 0x027A, r22 ; 0x80027a 321e8: 70 93 7b 02 sts 0x027B, r23 ; 0x80027b 321ec: 80 93 7c 02 sts 0x027C, r24 ; 0x80027c 321f0: 90 93 7d 02 sts 0x027D, r25 ; 0x80027d if(cs.retract_zlift) { 321f4: c0 90 f2 0d lds r12, 0x0DF2 ; 0x800df2 321f8: d0 90 f3 0d lds r13, 0x0DF3 ; 0x800df3 321fc: e0 90 f4 0d lds r14, 0x0DF4 ; 0x800df4 32200: f0 90 f5 0d lds r15, 0x0DF5 ; 0x800df5 32204: 20 e0 ldi r18, 0x00 ; 0 32206: 30 e0 ldi r19, 0x00 ; 0 32208: a9 01 movw r20, r18 3220a: c7 01 movw r24, r14 3220c: b6 01 movw r22, r12 3220e: 0f 94 fd a5 call 0x34bfa ; 0x34bfa <__cmpsf2> 32212: 88 23 and r24, r24 32214: e1 f0 breq .+56 ; 0x3224e current_position[Z_AXIS]+=cs.retract_zlift; 32216: a7 01 movw r20, r14 32218: 96 01 movw r18, r12 3221a: 60 91 69 12 lds r22, 0x1269 ; 0x801269 3221e: 70 91 6a 12 lds r23, 0x126A ; 0x80126a 32222: 80 91 6b 12 lds r24, 0x126B ; 0x80126b 32226: 90 91 6c 12 lds r25, 0x126C ; 0x80126c 3222a: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3222e: 60 93 69 12 sts 0x1269, r22 ; 0x801269 32232: 70 93 6a 12 sts 0x126A, r23 ; 0x80126a 32236: 80 93 6b 12 sts 0x126B, r24 ; 0x80126b 3223a: 90 93 6c 12 sts 0x126C, r25 ; 0x80126c plan_set_position_curposXYZE(); 3223e: 0f 94 41 4b call 0x29682 ; 0x29682 prepare_move(); 32242: 90 e0 ldi r25, 0x00 ; 0 32244: 80 e0 ldi r24, 0x00 ; 0 32246: 0e 94 bb 6a call 0xd576 ; 0xd576 st_synchronize(); 3224a: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } current_position[E_AXIS]-=(swapretract?(retract_length_swap+retract_recover_length_swap):(cs.retract_length+cs.retract_recover_length))*float(extrudemultiply)*0.01f; 3224e: 20 91 f6 0d lds r18, 0x0DF6 ; 0x800df6 32252: 30 91 f7 0d lds r19, 0x0DF7 ; 0x800df7 32256: 40 91 f8 0d lds r20, 0x0DF8 ; 0x800df8 3225a: 50 91 f9 0d lds r21, 0x0DF9 ; 0x800df9 3225e: 60 91 ea 0d lds r22, 0x0DEA ; 0x800dea 32262: 70 91 eb 0d lds r23, 0x0DEB ; 0x800deb 32266: 80 91 ec 0d lds r24, 0x0DEC ; 0x800dec 3226a: 90 91 ed 0d lds r25, 0x0DED ; 0x800ded 3226e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 32272: 6b 01 movw r12, r22 32274: 7c 01 movw r14, r24 32276: 60 91 75 02 lds r22, 0x0275 ; 0x800275 3227a: 70 91 76 02 lds r23, 0x0276 ; 0x800276 3227e: 07 2e mov r0, r23 32280: 00 0c add r0, r0 32282: 88 0b sbc r24, r24 32284: 99 0b sbc r25, r25 32286: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 3228a: 9b 01 movw r18, r22 3228c: ac 01 movw r20, r24 3228e: c7 01 movw r24, r14 32290: b6 01 movw r22, r12 32292: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32296: 2a e0 ldi r18, 0x0A ; 10 32298: 37 ed ldi r19, 0xD7 ; 215 3229a: 43 e2 ldi r20, 0x23 ; 35 3229c: 5c e3 ldi r21, 0x3C ; 60 3229e: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 322a2: 9b 01 movw r18, r22 322a4: ac 01 movw r20, r24 322a6: 60 91 6d 12 lds r22, 0x126D ; 0x80126d 322aa: 70 91 6e 12 lds r23, 0x126E ; 0x80126e 322ae: 80 91 6f 12 lds r24, 0x126F ; 0x80126f 322b2: 90 91 70 12 lds r25, 0x1270 ; 0x801270 322b6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 322ba: 60 93 6d 12 sts 0x126D, r22 ; 0x80126d 322be: 70 93 6e 12 sts 0x126E, r23 ; 0x80126e 322c2: 80 93 6f 12 sts 0x126F, r24 ; 0x80126f 322c6: 90 93 70 12 sts 0x1270, r25 ; 0x801270 plan_set_e_position(current_position[E_AXIS]); 322ca: 8d e6 ldi r24, 0x6D ; 109 322cc: 92 e1 ldi r25, 0x12 ; 18 322ce: 0f 94 d9 3c call 0x279b2 ; 0x279b2 retracted[active_extruder]=false; 322d2: 10 92 1b 06 sts 0x061B, r1 ; 0x80061b prepare_move(); 322d6: 90 e0 ldi r25, 0x00 ; 0 322d8: 80 e0 ldi r24, 0x00 ; 0 322da: 0e 94 bb 6a call 0xd576 ; 0xd576 feedrate = oldFeedrate; 322de: 80 92 7a 02 sts 0x027A, r8 ; 0x80027a 322e2: 90 92 7b 02 sts 0x027B, r9 ; 0x80027b 322e6: a0 92 7c 02 sts 0x027C, r10 ; 0x80027c 322ea: b0 92 7d 02 sts 0x027D, r11 ; 0x80027d 322ee: 55 cf rjmp .-342 ; 0x3219a 000322f0 : float mesh_bed_leveling::get_z(float x, float y) { 322f0: 2f 92 push r2 322f2: 3f 92 push r3 322f4: 4f 92 push r4 322f6: 5f 92 push r5 322f8: 6f 92 push r6 322fa: 7f 92 push r7 322fc: 8f 92 push r8 322fe: 9f 92 push r9 32300: af 92 push r10 32302: bf 92 push r11 32304: cf 92 push r12 32306: df 92 push r13 32308: ef 92 push r14 3230a: ff 92 push r15 3230c: 0f 93 push r16 3230e: 1f 93 push r17 32310: cf 93 push r28 32312: df 93 push r29 32314: 00 d0 rcall .+0 ; 0x32316 32316: 00 d0 rcall .+0 ; 0x32318 32318: 00 d0 rcall .+0 ; 0x3231a 3231a: 1f 92 push r1 3231c: cd b7 in r28, 0x3d ; 61 3231e: de b7 in r29, 0x3e ; 62 32320: 2b 01 movw r4, r22 32322: 3c 01 movw r6, r24 32324: 49 01 movw r8, r18 32326: 5a 01 movw r10, r20 int i, j; float s, t; i = int(floor((x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density)); 32328: 20 e0 ldi r18, 0x00 ; 0 3232a: 30 e0 ldi r19, 0x00 ; 0 3232c: 40 ec ldi r20, 0xC0 ; 192 3232e: 51 e4 ldi r21, 0x41 ; 65 32330: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32334: 20 e0 ldi r18, 0x00 ; 0 32336: 30 e0 ldi r19, 0x00 ; 0 32338: 48 e0 ldi r20, 0x08 ; 8 3233a: 52 e4 ldi r21, 0x42 ; 66 3233c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 32340: 6b 01 movw r12, r22 32342: 7c 01 movw r14, r24 32344: 0f 94 af a6 call 0x34d5e ; 0x34d5e 32348: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> if (i < 0) { i = 0; 3234c: 31 2c mov r3, r1 3234e: 21 2c mov r2, r1 float mesh_bed_leveling::get_z(float x, float y) { int i, j; float s, t; i = int(floor((x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density)); if (i < 0) { 32350: 77 fd sbrc r23, 7 32352: 1e c0 rjmp .+60 ; 0x32390 32354: 1b 01 movw r2, r22 32356: 66 30 cpi r22, 0x06 ; 6 32358: 71 05 cpc r23, r1 3235a: 1c f0 brlt .+6 ; 0x32362 3235c: 45 e0 ldi r20, 0x05 ; 5 3235e: 24 2e mov r2, r20 32360: 31 2c mov r3, r1 mesh_bed_leveling() { reset(); } void reset(); static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; } 32362: 82 2d mov r24, r2 32364: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 32368: 20 e0 ldi r18, 0x00 ; 0 3236a: 30 e0 ldi r19, 0x00 ; 0 3236c: 48 eb ldi r20, 0xB8 ; 184 3236e: 51 e4 ldi r21, 0x41 ; 65 32370: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 32374: 9b 01 movw r18, r22 32376: ac 01 movw r20, r24 s = (x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density; } else { if (i > MESH_NUM_X_POINTS - 2) { i = MESH_NUM_X_POINTS - 2; } s = (x - get_x(i)) / x_mesh_density; 32378: c3 01 movw r24, r6 3237a: b2 01 movw r22, r4 3237c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32380: 20 e0 ldi r18, 0x00 ; 0 32382: 30 e0 ldi r19, 0x00 ; 0 32384: 48 e0 ldi r20, 0x08 ; 8 32386: 52 e4 ldi r21, 0x42 ; 66 32388: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 3238c: 6b 01 movw r12, r22 3238e: 7c 01 movw r14, r24 } j = int(floor((y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density)); 32390: 20 e0 ldi r18, 0x00 ; 0 32392: 30 e0 ldi r19, 0x00 ; 0 32394: 40 ec ldi r20, 0xC0 ; 192 32396: 50 e4 ldi r21, 0x40 ; 64 32398: c5 01 movw r24, r10 3239a: b4 01 movw r22, r8 3239c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 323a0: 20 e0 ldi r18, 0x00 ; 0 323a2: 30 e0 ldi r19, 0x00 ; 0 323a4: 48 e0 ldi r20, 0x08 ; 8 323a6: 52 e4 ldi r21, 0x42 ; 66 323a8: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 323ac: 69 83 std Y+1, r22 ; 0x01 323ae: 7a 83 std Y+2, r23 ; 0x02 323b0: 8b 83 std Y+3, r24 ; 0x03 323b2: 9c 83 std Y+4, r25 ; 0x04 323b4: 0f 94 af a6 call 0x34d5e ; 0x34d5e 323b8: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> if (j < 0) { 323bc: 77 fd sbrc r23, 7 323be: da c0 rjmp .+436 ; 0x32574 323c0: 7a 87 std Y+10, r23 ; 0x0a 323c2: 69 87 std Y+9, r22 ; 0x09 323c4: 66 30 cpi r22, 0x06 ; 6 323c6: 71 05 cpc r23, r1 323c8: 24 f0 brlt .+8 ; 0x323d2 323ca: e5 e0 ldi r30, 0x05 ; 5 323cc: f0 e0 ldi r31, 0x00 ; 0 323ce: fa 87 std Y+10, r31 ; 0x0a 323d0: e9 87 std Y+9, r30 ; 0x09 static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; } 323d2: 89 85 ldd r24, Y+9 ; 0x09 323d4: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 323d8: 20 e0 ldi r18, 0x00 ; 0 323da: 30 e0 ldi r19, 0x00 ; 0 323dc: 40 ea ldi r20, 0xA0 ; 160 323de: 50 e4 ldi r21, 0x40 ; 64 323e0: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 323e4: 9b 01 movw r18, r22 323e6: ac 01 movw r20, r24 t = (y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density; } else { if (j > MESH_NUM_Y_POINTS - 2) { j = MESH_NUM_Y_POINTS - 2; } t = (y - get_y(j)) / y_mesh_density; 323e8: c5 01 movw r24, r10 323ea: b4 01 movw r22, r8 323ec: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 323f0: 20 e0 ldi r18, 0x00 ; 0 323f2: 30 e0 ldi r19, 0x00 ; 0 323f4: 48 e0 ldi r20, 0x08 ; 8 323f6: 52 e4 ldi r21, 0x42 ; 66 323f8: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 323fc: 69 83 std Y+1, r22 ; 0x01 323fe: 7a 83 std Y+2, r23 ; 0x02 32400: 8b 83 std Y+3, r24 ; 0x03 32402: 9c 83 std Y+4, r25 ; 0x04 } float si = 1.f-s; 32404: a7 01 movw r20, r14 32406: 96 01 movw r18, r12 32408: 60 e0 ldi r22, 0x00 ; 0 3240a: 70 e0 ldi r23, 0x00 ; 0 3240c: 80 e8 ldi r24, 0x80 ; 128 3240e: 9f e3 ldi r25, 0x3F ; 63 32410: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32414: 2b 01 movw r4, r22 32416: 3c 01 movw r6, r24 float z0 = si * z_values[j ][i] + s * z_values[j ][i+1]; 32418: 91 01 movw r18, r2 3241a: 2f 5f subi r18, 0xFF ; 255 3241c: 3f 4f sbci r19, 0xFF ; 255 3241e: 3e 83 std Y+6, r19 ; 0x06 32420: 2d 83 std Y+5, r18 ; 0x05 float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; 32422: 89 85 ldd r24, Y+9 ; 0x09 32424: 9a 85 ldd r25, Y+10 ; 0x0a 32426: 01 96 adiw r24, 0x01 ; 1 32428: 98 87 std Y+8, r25 ; 0x08 3242a: 8f 83 std Y+7, r24 ; 0x07 } t = (y - get_y(j)) / y_mesh_density; } float si = 1.f-s; float z0 = si * z_values[j ][i] + s * z_values[j ][i+1]; 3242c: 27 e0 ldi r18, 0x07 ; 7 3242e: e9 85 ldd r30, Y+9 ; 0x09 32430: fa 85 ldd r31, Y+10 ; 0x0a 32432: 2e 9f mul r18, r30 32434: 80 01 movw r16, r0 32436: 2f 9f mul r18, r31 32438: 10 0d add r17, r0 3243a: 11 24 eor r1, r1 3243c: f8 01 movw r30, r16 3243e: e2 0d add r30, r2 32440: f3 1d adc r31, r3 32442: ee 0f add r30, r30 32444: ff 1f adc r31, r31 32446: ee 0f add r30, r30 32448: ff 1f adc r31, r31 3244a: e7 5f subi r30, 0xF7 ; 247 3244c: fc 4e sbci r31, 0xEC ; 236 3244e: 21 81 ldd r18, Z+1 ; 0x01 32450: 32 81 ldd r19, Z+2 ; 0x02 32452: 43 81 ldd r20, Z+3 ; 0x03 32454: 54 81 ldd r21, Z+4 ; 0x04 32456: c3 01 movw r24, r6 32458: b2 01 movw r22, r4 3245a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3245e: 4b 01 movw r8, r22 32460: 5c 01 movw r10, r24 32462: ed 81 ldd r30, Y+5 ; 0x05 32464: fe 81 ldd r31, Y+6 ; 0x06 32466: e0 0f add r30, r16 32468: f1 1f adc r31, r17 3246a: ee 0f add r30, r30 3246c: ff 1f adc r31, r31 3246e: ee 0f add r30, r30 32470: ff 1f adc r31, r31 32472: e7 5f subi r30, 0xF7 ; 247 32474: fc 4e sbci r31, 0xEC ; 236 32476: 21 81 ldd r18, Z+1 ; 0x01 32478: 32 81 ldd r19, Z+2 ; 0x02 3247a: 43 81 ldd r20, Z+3 ; 0x03 3247c: 54 81 ldd r21, Z+4 ; 0x04 3247e: c7 01 movw r24, r14 32480: b6 01 movw r22, r12 32482: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32486: 9b 01 movw r18, r22 32488: ac 01 movw r20, r24 3248a: c5 01 movw r24, r10 3248c: b4 01 movw r22, r8 3248e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 32492: 4b 01 movw r8, r22 32494: 5c 01 movw r10, r24 float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; return (1.f-t) * z0 + t * z1; 32496: 29 81 ldd r18, Y+1 ; 0x01 32498: 3a 81 ldd r19, Y+2 ; 0x02 3249a: 4b 81 ldd r20, Y+3 ; 0x03 3249c: 5c 81 ldd r21, Y+4 ; 0x04 3249e: 60 e0 ldi r22, 0x00 ; 0 324a0: 70 e0 ldi r23, 0x00 ; 0 324a2: 80 e8 ldi r24, 0x80 ; 128 324a4: 9f e3 ldi r25, 0x3F ; 63 324a6: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 324aa: 9b 01 movw r18, r22 324ac: ac 01 movw r20, r24 324ae: c5 01 movw r24, r10 324b0: b4 01 movw r22, r8 324b2: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 324b6: 4b 01 movw r8, r22 324b8: 5c 01 movw r10, r24 t = (y - get_y(j)) / y_mesh_density; } float si = 1.f-s; float z0 = si * z_values[j ][i] + s * z_values[j ][i+1]; float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; 324ba: 27 e0 ldi r18, 0x07 ; 7 324bc: ef 81 ldd r30, Y+7 ; 0x07 324be: f8 85 ldd r31, Y+8 ; 0x08 324c0: 2e 9f mul r18, r30 324c2: c0 01 movw r24, r0 324c4: 2f 9f mul r18, r31 324c6: 90 0d add r25, r0 324c8: 11 24 eor r1, r1 324ca: 9a 87 std Y+10, r25 ; 0x0a 324cc: 89 87 std Y+9, r24 ; 0x09 324ce: fc 01 movw r30, r24 324d0: e2 0d add r30, r2 324d2: f3 1d adc r31, r3 324d4: ee 0f add r30, r30 324d6: ff 1f adc r31, r31 324d8: ee 0f add r30, r30 324da: ff 1f adc r31, r31 324dc: e7 5f subi r30, 0xF7 ; 247 324de: fc 4e sbci r31, 0xEC ; 236 324e0: 21 81 ldd r18, Z+1 ; 0x01 324e2: 32 81 ldd r19, Z+2 ; 0x02 324e4: 43 81 ldd r20, Z+3 ; 0x03 324e6: 54 81 ldd r21, Z+4 ; 0x04 324e8: c3 01 movw r24, r6 324ea: b2 01 movw r22, r4 324ec: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 324f0: 2b 01 movw r4, r22 324f2: 3c 01 movw r6, r24 324f4: 89 85 ldd r24, Y+9 ; 0x09 324f6: 9a 85 ldd r25, Y+10 ; 0x0a 324f8: ed 81 ldd r30, Y+5 ; 0x05 324fa: fe 81 ldd r31, Y+6 ; 0x06 324fc: 8e 0f add r24, r30 324fe: 9f 1f adc r25, r31 32500: 88 0f add r24, r24 32502: 99 1f adc r25, r25 32504: 88 0f add r24, r24 32506: 99 1f adc r25, r25 32508: 87 5f subi r24, 0xF7 ; 247 3250a: 9c 4e sbci r25, 0xEC ; 236 3250c: fc 01 movw r30, r24 3250e: 21 81 ldd r18, Z+1 ; 0x01 32510: 32 81 ldd r19, Z+2 ; 0x02 32512: 43 81 ldd r20, Z+3 ; 0x03 32514: 54 81 ldd r21, Z+4 ; 0x04 32516: c7 01 movw r24, r14 32518: b6 01 movw r22, r12 3251a: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3251e: 9b 01 movw r18, r22 32520: ac 01 movw r20, r24 32522: c3 01 movw r24, r6 32524: b2 01 movw r22, r4 32526: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> return (1.f-t) * z0 + t * z1; 3252a: 29 81 ldd r18, Y+1 ; 0x01 3252c: 3a 81 ldd r19, Y+2 ; 0x02 3252e: 4b 81 ldd r20, Y+3 ; 0x03 32530: 5c 81 ldd r21, Y+4 ; 0x04 32532: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32536: 9b 01 movw r18, r22 32538: ac 01 movw r20, r24 3253a: c5 01 movw r24, r10 3253c: b4 01 movw r22, r8 3253e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> } 32542: 2a 96 adiw r28, 0x0a ; 10 32544: 0f b6 in r0, 0x3f ; 63 32546: f8 94 cli 32548: de bf out 0x3e, r29 ; 62 3254a: 0f be out 0x3f, r0 ; 63 3254c: cd bf out 0x3d, r28 ; 61 3254e: df 91 pop r29 32550: cf 91 pop r28 32552: 1f 91 pop r17 32554: 0f 91 pop r16 32556: ff 90 pop r15 32558: ef 90 pop r14 3255a: df 90 pop r13 3255c: cf 90 pop r12 3255e: bf 90 pop r11 32560: af 90 pop r10 32562: 9f 90 pop r9 32564: 8f 90 pop r8 32566: 7f 90 pop r7 32568: 6f 90 pop r6 3256a: 5f 90 pop r5 3256c: 4f 90 pop r4 3256e: 3f 90 pop r3 32570: 2f 90 pop r2 32572: 08 95 ret s = (x - get_x(i)) / x_mesh_density; } j = int(floor((y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density)); if (j < 0) { j = 0; 32574: 1a 86 std Y+10, r1 ; 0x0a 32576: 19 86 std Y+9, r1 ; 0x09 32578: 45 cf rjmp .-374 ; 0x32404 0003257a : float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; return (1.f-t) * z0 + t * z1; } // Works for an odd number of MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS void mesh_bed_leveling::upsample_3x3() 3257a: 2f 92 push r2 3257c: 3f 92 push r3 3257e: 4f 92 push r4 32580: 5f 92 push r5 32582: 6f 92 push r6 32584: 7f 92 push r7 32586: 8f 92 push r8 32588: 9f 92 push r9 3258a: af 92 push r10 3258c: bf 92 push r11 3258e: cf 92 push r12 32590: df 92 push r13 32592: ef 92 push r14 32594: ff 92 push r15 32596: 0f 93 push r16 32598: 1f 93 push r17 3259a: cf 93 push r28 3259c: df 93 push r29 3259e: 00 d0 rcall .+0 ; 0x325a0 325a0: 00 d0 rcall .+0 ; 0x325a2 325a2: 00 d0 rcall .+0 ; 0x325a4 325a4: cd b7 in r28, 0x3d ; 61 325a6: de b7 in r29, 0x3e ; 62 325a8: 09 e0 ldi r16, 0x09 ; 9 325aa: 13 e1 ldi r17, 0x13 ; 19 325ac: 1f 83 std Y+7, r17 ; 0x07 325ae: 0e 83 std Y+6, r16 ; 0x06 325b0: 2e 80 ldd r2, Y+6 ; 0x06 325b2: 3f 80 ldd r3, Y+7 ; 0x07 325b4: 19 82 std Y+1, r1 ; 0x01 static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER; static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER; for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) { // Interpolate the remaining values by Largrangian polynomials. for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { if (!isnan(z_values[j][i])) 325b6: f1 01 movw r30, r2 325b8: 61 81 ldd r22, Z+1 ; 0x01 325ba: 72 81 ldd r23, Z+2 ; 0x02 325bc: 83 81 ldd r24, Z+3 ; 0x03 325be: 94 81 ldd r25, Z+4 ; 0x04 325c0: 9b 01 movw r18, r22 325c2: ac 01 movw r20, r24 325c4: 0f 94 16 a9 call 0x3522c ; 0x3522c <__unordsf2> 325c8: 88 23 and r24, r24 325ca: 09 f4 brne .+2 ; 0x325ce 325cc: 7c c0 rjmp .+248 ; 0x326c6 mesh_bed_leveling() { reset(); } void reset(); static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; } 325ce: 89 81 ldd r24, Y+1 ; 0x01 325d0: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 325d4: 20 e0 ldi r18, 0x00 ; 0 325d6: 30 e0 ldi r19, 0x00 ; 0 325d8: 48 eb ldi r20, 0xB8 ; 184 325da: 51 e4 ldi r21, 0x41 ; 65 325dc: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 325e0: 6b 01 movw r12, r22 325e2: 7c 01 movw r14, r24 continue; float x = get_x(i); z_values[j][i] = z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) + 325e4: 20 e0 ldi r18, 0x00 ; 0 325e6: 30 e0 ldi r19, 0x00 ; 0 325e8: 4c ef ldi r20, 0xFC ; 252 325ea: 52 e4 ldi r21, 0x42 ; 66 325ec: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 325f0: 2b 01 movw r4, r22 325f2: 3c 01 movw r6, r24 325f4: 20 e0 ldi r18, 0x00 ; 0 325f6: 30 e0 ldi r19, 0x00 ; 0 325f8: 44 e6 ldi r20, 0x64 ; 100 325fa: 53 e4 ldi r21, 0x43 ; 67 325fc: c7 01 movw r24, r14 325fe: b6 01 movw r22, r12 32600: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32604: 4b 01 movw r8, r22 32606: 5c 01 movw r10, r24 z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + 32608: 20 e0 ldi r18, 0x00 ; 0 3260a: 30 e0 ldi r19, 0x00 ; 0 3260c: 40 ec ldi r20, 0xC0 ; 192 3260e: 51 e4 ldi r21, 0x41 ; 65 32610: c7 01 movw r24, r14 32612: b6 01 movw r22, r12 32614: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32618: 6b 01 movw r12, r22 3261a: 7c 01 movw r14, r24 for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { if (!isnan(z_values[j][i])) continue; float x = get_x(i); z_values[j][i] = z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) + 3261c: ee 81 ldd r30, Y+6 ; 0x06 3261e: ff 81 ldd r31, Y+7 ; 0x07 32620: 21 81 ldd r18, Z+1 ; 0x01 32622: 32 81 ldd r19, Z+2 ; 0x02 32624: 43 81 ldd r20, Z+3 ; 0x03 32626: 54 81 ldd r21, Z+4 ; 0x04 32628: c3 01 movw r24, r6 3262a: b2 01 movw r22, r4 3262c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32630: a5 01 movw r20, r10 32632: 94 01 movw r18, r8 32634: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32638: 20 e0 ldi r18, 0x00 ; 0 3263a: 30 e9 ldi r19, 0x90 ; 144 3263c: 42 ea ldi r20, 0xA2 ; 162 3263e: 56 e4 ldi r21, 0x46 ; 70 32640: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 32644: 6a 83 std Y+2, r22 ; 0x02 32646: 7b 83 std Y+3, r23 ; 0x03 32648: 8c 83 std Y+4, r24 ; 0x04 3264a: 9d 83 std Y+5, r25 ; 0x05 z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + 3264c: ee 81 ldd r30, Y+6 ; 0x06 3264e: ff 81 ldd r31, Y+7 ; 0x07 32650: 25 85 ldd r18, Z+13 ; 0x0d 32652: 36 85 ldd r19, Z+14 ; 0x0e 32654: 47 85 ldd r20, Z+15 ; 0x0f 32656: 50 89 ldd r21, Z+16 ; 0x10 32658: c7 01 movw r24, r14 3265a: b6 01 movw r22, r12 3265c: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32660: a5 01 movw r20, r10 32662: 94 01 movw r18, r8 32664: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32668: 20 e0 ldi r18, 0x00 ; 0 3266a: 30 e9 ldi r19, 0x90 ; 144 3266c: 42 e2 ldi r20, 0x22 ; 34 3266e: 56 ec ldi r21, 0xC6 ; 198 32670: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 32674: 9b 01 movw r18, r22 32676: ac 01 movw r20, r24 for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { if (!isnan(z_values[j][i])) continue; float x = get_x(i); z_values[j][i] = z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) + 32678: 6a 81 ldd r22, Y+2 ; 0x02 3267a: 7b 81 ldd r23, Y+3 ; 0x03 3267c: 8c 81 ldd r24, Y+4 ; 0x04 3267e: 9d 81 ldd r25, Y+5 ; 0x05 32680: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 32684: 4b 01 movw r8, r22 32686: 5c 01 movw r10, r24 z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + z_values[j][idx2] * (x - x0) * (x - x1) / ((x2 - x0) * (x2 - x1)); 32688: ee 81 ldd r30, Y+6 ; 0x06 3268a: ff 81 ldd r31, Y+7 ; 0x07 3268c: 21 8d ldd r18, Z+25 ; 0x19 3268e: 32 8d ldd r19, Z+26 ; 0x1a 32690: 43 8d ldd r20, Z+27 ; 0x1b 32692: 54 8d ldd r21, Z+28 ; 0x1c 32694: c7 01 movw r24, r14 32696: b6 01 movw r22, r12 32698: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3269c: a3 01 movw r20, r6 3269e: 92 01 movw r18, r4 326a0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 326a4: 20 e0 ldi r18, 0x00 ; 0 326a6: 30 e9 ldi r19, 0x90 ; 144 326a8: 42 ea ldi r20, 0xA2 ; 162 326aa: 56 e4 ldi r21, 0x46 ; 70 326ac: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 326b0: 9b 01 movw r18, r22 326b2: ac 01 movw r20, r24 if (!isnan(z_values[j][i])) continue; float x = get_x(i); z_values[j][i] = z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) + z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + 326b4: c5 01 movw r24, r10 326b6: b4 01 movw r22, r8 326b8: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> // Interpolate the remaining values by Largrangian polynomials. for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { if (!isnan(z_values[j][i])) continue; float x = get_x(i); z_values[j][i] = 326bc: f1 01 movw r30, r2 326be: 61 83 std Z+1, r22 ; 0x01 326c0: 72 83 std Z+2, r23 ; 0x02 326c2: 83 83 std Z+3, r24 ; 0x03 326c4: 94 83 std Z+4, r25 ; 0x04 326c6: f4 e0 ldi r31, 0x04 ; 4 326c8: 2f 0e add r2, r31 326ca: 31 1c adc r3, r1 326cc: 29 81 ldd r18, Y+1 ; 0x01 326ce: 2f 5f subi r18, 0xFF ; 255 326d0: 29 83 std Y+1, r18 ; 0x01 static const float x0 = (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER); static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER; static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER; for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) { // Interpolate the remaining values by Largrangian polynomials. for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { 326d2: 27 30 cpi r18, 0x07 ; 7 326d4: 09 f0 breq .+2 ; 0x326d8 326d6: 6f cf rjmp .-290 ; 0x325b6 326d8: 8e 81 ldd r24, Y+6 ; 0x06 326da: 9f 81 ldd r25, Y+7 ; 0x07 326dc: 4c 96 adiw r24, 0x1c ; 28 326de: 9f 83 std Y+7, r25 ; 0x07 326e0: 8e 83 std Y+6, r24 ; 0x06 { // First interpolate the points in X axis. static const float x0 = (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER); static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER; static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER; for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) { 326e2: 8d 5c subi r24, 0xCD ; 205 326e4: 93 41 sbci r25, 0x13 ; 19 326e6: 09 f0 breq .+2 ; 0x326ea 326e8: 63 cf rjmp .-314 ; 0x325b0 float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; return (1.f-t) * z0 + t * z1; } // Works for an odd number of MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS void mesh_bed_leveling::upsample_3x3() 326ea: 19 87 std Y+9, r17 ; 0x09 326ec: 08 87 std Y+8, r16 ; 0x08 326ee: f1 e0 ldi r31, 0x01 ; 1 326f0: f9 83 std Y+1, r31 ; 0x01 if (!isnan(z_values[j][i])) continue; float y = get_y(j); z_values[j][i] = z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) + z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + 326f2: c8 01 movw r24, r16 326f4: 8b 5a subi r24, 0xAB ; 171 326f6: 9f 4f sbci r25, 0xFF ; 255 326f8: 9f 83 std Y+7, r25 ; 0x07 326fa: 8e 83 std Y+6, r24 ; 0x06 z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1)); 326fc: 18 01 movw r2, r16 326fe: 99 ea ldi r25, 0xA9 ; 169 32700: 29 0e add r2, r25 32702: 31 1c adc r3, r1 static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER; static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER; for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { // Interpolate the remaining values by Largrangian polynomials. for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) { if (!isnan(z_values[j][i])) 32704: e8 85 ldd r30, Y+8 ; 0x08 32706: f9 85 ldd r31, Y+9 ; 0x09 32708: 65 8d ldd r22, Z+29 ; 0x1d 3270a: 76 8d ldd r23, Z+30 ; 0x1e 3270c: 87 8d ldd r24, Z+31 ; 0x1f 3270e: 90 a1 ldd r25, Z+32 ; 0x20 32710: 9b 01 movw r18, r22 32712: ac 01 movw r20, r24 32714: 0f 94 16 a9 call 0x3522c ; 0x3522c <__unordsf2> 32718: 88 23 and r24, r24 3271a: 09 f4 brne .+2 ; 0x3271e 3271c: 79 c0 rjmp .+242 ; 0x32810 static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; } 3271e: 89 81 ldd r24, Y+1 ; 0x01 32720: 0e 94 e0 5e call 0xbdc0 ; 0xbdc0 32724: 20 e0 ldi r18, 0x00 ; 0 32726: 30 e0 ldi r19, 0x00 ; 0 32728: 40 ea ldi r20, 0xA0 ; 160 3272a: 50 e4 ldi r21, 0x40 ; 64 3272c: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 32730: 6b 01 movw r12, r22 32732: 7c 01 movw r14, r24 continue; float y = get_y(j); z_values[j][i] = z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) + 32734: 20 e0 ldi r18, 0x00 ; 0 32736: 30 e0 ldi r19, 0x00 ; 0 32738: 48 ed ldi r20, 0xD8 ; 216 3273a: 52 e4 ldi r21, 0x42 ; 66 3273c: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32740: 2b 01 movw r4, r22 32742: 3c 01 movw r6, r24 32744: 20 e0 ldi r18, 0x00 ; 0 32746: 30 e0 ldi r19, 0x00 ; 0 32748: 42 e5 ldi r20, 0x52 ; 82 3274a: 53 e4 ldi r21, 0x43 ; 67 3274c: c7 01 movw r24, r14 3274e: b6 01 movw r22, r12 32750: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32754: 4b 01 movw r8, r22 32756: 5c 01 movw r10, r24 z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + 32758: 20 e0 ldi r18, 0x00 ; 0 3275a: 30 e0 ldi r19, 0x00 ; 0 3275c: 40 ec ldi r20, 0xC0 ; 192 3275e: 50 e4 ldi r21, 0x40 ; 64 32760: c7 01 movw r24, r14 32762: b6 01 movw r22, r12 32764: 0f 94 07 a5 call 0x34a0e ; 0x34a0e <__subsf3> 32768: 6b 01 movw r12, r22 3276a: 7c 01 movw r14, r24 3276c: ee 81 ldd r30, Y+6 ; 0x06 3276e: ff 81 ldd r31, Y+7 ; 0x07 32770: 20 81 ld r18, Z 32772: 31 81 ldd r19, Z+1 ; 0x01 32774: 42 81 ldd r20, Z+2 ; 0x02 32776: 53 81 ldd r21, Z+3 ; 0x03 32778: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3277c: a5 01 movw r20, r10 3277e: 94 01 movw r18, r8 32780: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 32784: 20 e0 ldi r18, 0x00 ; 0 32786: 30 e9 ldi r19, 0x90 ; 144 32788: 42 e2 ldi r20, 0x22 ; 34 3278a: 56 ec ldi r21, 0xC6 ; 198 3278c: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 32790: 6a 83 std Y+2, r22 ; 0x02 32792: 7b 83 std Y+3, r23 ; 0x03 32794: 8c 83 std Y+4, r24 ; 0x04 32796: 9d 83 std Y+5, r25 ; 0x05 for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) { if (!isnan(z_values[j][i])) continue; float y = get_y(j); z_values[j][i] = z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) + 32798: f8 01 movw r30, r16 3279a: 21 81 ldd r18, Z+1 ; 0x01 3279c: 32 81 ldd r19, Z+2 ; 0x02 3279e: 43 81 ldd r20, Z+3 ; 0x03 327a0: 54 81 ldd r21, Z+4 ; 0x04 327a2: c3 01 movw r24, r6 327a4: b2 01 movw r22, r4 327a6: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 327aa: a5 01 movw r20, r10 327ac: 94 01 movw r18, r8 327ae: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 327b2: 20 e0 ldi r18, 0x00 ; 0 327b4: 30 e9 ldi r19, 0x90 ; 144 327b6: 42 ea ldi r20, 0xA2 ; 162 327b8: 56 e4 ldi r21, 0x46 ; 70 327ba: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 327be: 9b 01 movw r18, r22 327c0: ac 01 movw r20, r24 327c2: 6a 81 ldd r22, Y+2 ; 0x02 327c4: 7b 81 ldd r23, Y+3 ; 0x03 327c6: 8c 81 ldd r24, Y+4 ; 0x04 327c8: 9d 81 ldd r25, Y+5 ; 0x05 327ca: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 327ce: 4b 01 movw r8, r22 327d0: 5c 01 movw r10, r24 z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1)); 327d2: f1 01 movw r30, r2 327d4: 20 81 ld r18, Z 327d6: 31 81 ldd r19, Z+1 ; 0x01 327d8: 42 81 ldd r20, Z+2 ; 0x02 327da: 53 81 ldd r21, Z+3 ; 0x03 327dc: c7 01 movw r24, r14 327de: b6 01 movw r22, r12 327e0: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 327e4: a3 01 movw r20, r6 327e6: 92 01 movw r18, r4 327e8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 327ec: 20 e0 ldi r18, 0x00 ; 0 327ee: 30 e9 ldi r19, 0x90 ; 144 327f0: 42 ea ldi r20, 0xA2 ; 162 327f2: 56 e4 ldi r21, 0x46 ; 70 327f4: 0f 94 07 a6 call 0x34c0e ; 0x34c0e <__divsf3> 327f8: 9b 01 movw r18, r22 327fa: ac 01 movw r20, r24 if (!isnan(z_values[j][i])) continue; float y = get_y(j); z_values[j][i] = z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) + z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + 327fc: c5 01 movw r24, r10 327fe: b4 01 movw r22, r8 32800: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> // Interpolate the remaining values by Largrangian polynomials. for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) { if (!isnan(z_values[j][i])) continue; float y = get_y(j); z_values[j][i] = 32804: e8 85 ldd r30, Y+8 ; 0x08 32806: f9 85 ldd r31, Y+9 ; 0x09 32808: 65 8f std Z+29, r22 ; 0x1d 3280a: 76 8f std Z+30, r23 ; 0x1e 3280c: 87 8f std Z+31, r24 ; 0x1f 3280e: 90 a3 std Z+32, r25 ; 0x20 32810: 88 85 ldd r24, Y+8 ; 0x08 32812: 99 85 ldd r25, Y+9 ; 0x09 32814: 4c 96 adiw r24, 0x1c ; 28 32816: 99 87 std Y+9, r25 ; 0x09 32818: 88 87 std Y+8, r24 ; 0x08 3281a: 99 81 ldd r25, Y+1 ; 0x01 3281c: 9f 5f subi r25, 0xFF ; 255 3281e: 99 83 std Y+1, r25 ; 0x01 static const float y0 = (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER); static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER; static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER; for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { // Interpolate the remaining values by Largrangian polynomials. for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) { 32820: 96 30 cpi r25, 0x06 ; 6 32822: 09 f0 breq .+2 ; 0x32826 32824: 6f cf rjmp .-290 ; 0x32704 32826: 0c 5f subi r16, 0xFC ; 252 32828: 1f 4f sbci r17, 0xFF ; 255 { // Second interpolate the points in Y axis. static const float y0 = (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER); static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER; static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER; for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) { 3282a: e3 e1 ldi r30, 0x13 ; 19 3282c: 05 32 cpi r16, 0x25 ; 37 3282e: 1e 07 cpc r17, r30 32830: 09 f0 breq .+2 ; 0x32834 32832: 5b cf rjmp .-330 ; 0x326ea z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1)); } } } } 32834: 29 96 adiw r28, 0x09 ; 9 32836: 0f b6 in r0, 0x3f ; 63 32838: f8 94 cli 3283a: de bf out 0x3e, r29 ; 62 3283c: 0f be out 0x3f, r0 ; 63 3283e: cd bf out 0x3d, r28 ; 61 32840: df 91 pop r29 32842: cf 91 pop r28 32844: 1f 91 pop r17 32846: 0f 91 pop r16 32848: ff 90 pop r15 3284a: ef 90 pop r14 3284c: df 90 pop r13 3284e: cf 90 pop r12 32850: bf 90 pop r11 32852: af 90 pop r10 32854: 9f 90 pop r9 32856: 8f 90 pop r8 32858: 7f 90 pop r7 3285a: 6f 90 pop r6 3285c: 5f 90 pop r5 3285e: 4f 90 pop r4 32860: 3f 90 pop r3 32862: 2f 90 pop r2 32864: 08 95 ret 00032866 : void ProtocolLogic::SendVersion(uint8_t stage) { SendMsg(RequestMsg(RequestMsgCodes::Version, stage)); scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage); } void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) { 32866: 1f 93 push r17 32868: cf 93 push r28 3286a: df 93 push r29 3286c: 00 d0 rcall .+0 ; 0x3286e 3286e: 1f 92 push r1 32870: 1f 92 push r1 32872: cd b7 in r28, 0x3d ; 61 32874: de b7 in r29, 0x3e ; 62 32876: 16 2f mov r17, r22 SendMsg(RequestMsg(RequestMsgCodes::Read, index)); 32878: 48 2f mov r20, r24 3287a: 62 e5 ldi r22, 0x52 ; 82 3287c: ce 01 movw r24, r28 3287e: 01 96 adiw r24, 0x01 ; 1 32880: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32884: 49 81 ldd r20, Y+1 ; 0x01 32886: 5a 81 ldd r21, Y+2 ; 0x02 32888: 6b 81 ldd r22, Y+3 ; 0x03 3288a: 7c 81 ldd r23, Y+4 ; 0x04 3288c: 8d 81 ldd r24, Y+5 ; 0x05 3288e: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 scopeState = nextState; 32892: 10 93 95 12 sts 0x1295, r17 ; 0x801295 } 32896: 0f 90 pop r0 32898: 0f 90 pop r0 3289a: 0f 90 pop r0 3289c: 0f 90 pop r0 3289e: 0f 90 pop r0 328a0: df 91 pop r29 328a2: cf 91 pop r28 328a4: 1f 91 pop r17 328a6: 08 95 ret 000328a8 : SendMsg(RequestMsg(RequestMsgCodes::Query, 0)); scopeState = ScopeState::QuerySent; } void ProtocolLogic::StartReading8bitRegisters() { regIndex = 0; 328a8: 10 92 e0 12 sts 0x12E0, r1 ; 0x8012e0 SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); 328ac: ec e5 ldi r30, 0x5C ; 92 328ae: f1 ea ldi r31, 0xA1 ; 161 328b0: 84 91 lpm r24, Z 328b2: 67 e0 ldi r22, 0x07 ; 7 328b4: 0d 94 33 94 jmp 0x32866 ; 0x32866 000328b8 : regIndex = 0; SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); } ProtocolLogic::ScopeState __attribute__((noinline)) ProtocolLogic::ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd) { regs16[regIndex] = rsp.paramValue; 328b8: e0 91 e0 12 lds r30, 0x12E0 ; 0x8012e0 328bc: ae 2f mov r26, r30 328be: b0 e0 ldi r27, 0x00 ; 0 328c0: aa 0f add r26, r26 328c2: bb 1f adc r27, r27 328c4: a6 52 subi r26, 0x26 ; 38 328c6: bd 4e sbci r27, 0xED ; 237 328c8: 20 91 ad 12 lds r18, 0x12AD ; 0x8012ad 328cc: 30 91 ae 12 lds r19, 0x12AE ; 0x8012ae 328d0: 2d 93 st X+, r18 328d2: 3c 93 st X, r19 ++regIndex; 328d4: ef 5f subi r30, 0xFF ; 255 328d6: e0 93 e0 12 sts 0x12E0, r30 ; 0x8012e0 if (regIndex >= regs16Count) { 328da: e2 30 cpi r30, 0x02 ; 2 328dc: 40 f4 brcc .+16 ; 0x328ee return stateAtEnd; } else { SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); 328de: f0 e0 ldi r31, 0x00 ; 0 328e0: ed 5b subi r30, 0xBD ; 189 328e2: fe 45 sbci r31, 0x5E ; 94 328e4: 84 91 lpm r24, Z 328e6: 68 e0 ldi r22, 0x08 ; 8 328e8: 0f 94 33 94 call 0x32866 ; 0x32866 } return ScopeState::Reading16bitRegisters; 328ec: 88 e0 ldi r24, 0x08 ; 8 } 328ee: 08 95 ret 000328f0 : regIndex = 0; SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); } void ProtocolLogic::ProcessRead8bitRegister() { regs8[regIndex] = rsp.paramValue; 328f0: e0 91 e0 12 lds r30, 0x12E0 ; 0x8012e0 328f4: ae 2f mov r26, r30 328f6: b0 e0 ldi r27, 0x00 ; 0 328f8: a9 52 subi r26, 0x29 ; 41 328fa: bd 4e sbci r27, 0xED ; 237 328fc: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 32900: 8c 93 st X, r24 ++regIndex; 32902: ef 5f subi r30, 0xFF ; 255 32904: e0 93 e0 12 sts 0x12E0, r30 ; 0x8012e0 if (regIndex >= regs8Count) { 32908: e3 30 cpi r30, 0x03 ; 3 3290a: 40 f0 brcs .+16 ; 0x3291c SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); } } void ProtocolLogic::StartReading16bitRegisters() { regIndex = 0; 3290c: 10 92 e0 12 sts 0x12E0, r1 ; 0x8012e0 SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); 32910: e3 e4 ldi r30, 0x43 ; 67 32912: f1 ea ldi r31, 0xA1 ; 161 32914: 84 91 lpm r24, Z 32916: 68 e0 ldi r22, 0x08 ; 8 ++regIndex; if (regIndex >= regs8Count) { // proceed with reading 16bit registers StartReading16bitRegisters(); } else { SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); 32918: 0d 94 33 94 jmp 0x32866 ; 0x32866 3291c: f0 e0 ldi r31, 0x00 ; 0 3291e: e4 5a subi r30, 0xA4 ; 164 32920: fe 45 sbci r31, 0x5E ; 94 32922: 84 91 lpm r24, Z 32924: 67 e0 ldi r22, 0x07 ; 7 32926: f8 cf rjmp .-16 ; 0x32918 00032928 : if (!ExpectsResponse()) { ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } bool ProtocolLogic::ActivatePlannedRequest() { 32928: cf 93 push r28 3292a: df 93 push r29 3292c: 00 d0 rcall .+0 ; 0x3292e 3292e: 00 d0 rcall .+0 ; 0x32930 32930: 00 d0 rcall .+0 ; 0x32932 32932: 1f 92 push r1 32934: cd b7 in r28, 0x3d ; 61 32936: de b7 in r29, 0x3e ; 62 switch (plannedRq.code) { 32938: 80 91 9c 12 lds r24, 0x129C ; 0x80129c 3293c: 82 34 cpi r24, 0x42 ; 66 3293e: 09 f4 brne .+2 ; 0x32942 32940: 46 c0 rjmp .+140 ; 0x329ce 32942: b8 f5 brcc .+110 ; 0x329b2 32944: 88 23 and r24, r24 32946: 09 f4 brne .+2 ; 0x3294a 32948: 72 c0 rjmp .+228 ; 0x32a2e plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::unknown: return false; default: // commands currentScope = Scope::Command; 3294a: 84 e0 ldi r24, 0x04 ; 4 3294c: 80 93 94 12 sts 0x1294, r24 ; 0x801294 32950: 85 e0 ldi r24, 0x05 ; 5 32952: ec e9 ldi r30, 0x9C ; 156 32954: f2 e1 ldi r31, 0x12 ; 18 32956: de 01 movw r26, r28 32958: 16 96 adiw r26, 0x06 ; 6 3295a: 01 90 ld r0, Z+ 3295c: 0d 92 st X+, r0 3295e: 8a 95 dec r24 32960: e1 f7 brne .-8 ; 0x3295a StepStatus StoppedStep() { return Processing; } StepStatus ProcessCommandQueryResponse(); inline void SetRequestMsg(RequestMsg msg) { rq = msg; 32962: 85 e0 ldi r24, 0x05 ; 5 32964: fe 01 movw r30, r28 32966: 36 96 adiw r30, 0x06 ; 6 32968: a7 e9 ldi r26, 0x97 ; 151 3296a: b2 e1 ldi r27, 0x12 ; 18 3296c: 01 90 ld r0, Z+ 3296e: 0d 92 st X+, r0 32970: 8a 95 dec r24 32972: e1 f7 brne .-8 ; 0x3296c SetRequestMsg(plannedRq); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); 32974: 40 e0 ldi r20, 0x00 ; 0 32976: 60 e0 ldi r22, 0x00 ; 0 32978: ce 01 movw r24, r28 3297a: 01 96 adiw r24, 0x01 ; 1 3297c: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32980: 85 e0 ldi r24, 0x05 ; 5 32982: fe 01 movw r30, r28 32984: 31 96 adiw r30, 0x01 ; 1 32986: ac e9 ldi r26, 0x9C ; 156 32988: b2 e1 ldi r27, 0x12 ; 18 3298a: 01 90 ld r0, Z+ 3298c: 0d 92 st X+, r0 3298e: 8a 95 dec r24 32990: e1 f7 brne .-8 ; 0x3298a void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; } void ProtocolLogic::CommandRestart() { scopeState = ScopeState::CommandSent; 32992: 85 e0 ldi r24, 0x05 ; 5 32994: 80 93 95 12 sts 0x1295, r24 ; 0x801295 SendMsg(rq); 32998: 40 91 97 12 lds r20, 0x1297 ; 0x801297 3299c: 50 91 98 12 lds r21, 0x1298 ; 0x801298 329a0: 60 91 99 12 lds r22, 0x1299 ; 0x801299 329a4: 70 91 9a 12 lds r23, 0x129A ; 0x80129a 329a8: 80 91 9b 12 lds r24, 0x129B ; 0x80129b 329ac: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 329b0: 2e c0 rjmp .+92 ; 0x32a0e ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } bool ProtocolLogic::ActivatePlannedRequest() { switch (plannedRq.code) { 329b2: 82 35 cpi r24, 0x52 ; 82 329b4: b1 f1 breq .+108 ; 0x32a22 329b6: 87 35 cpi r24, 0x57 ; 87 329b8: 41 f6 brne .-112 ; 0x3294a case RequestMsgCodes::Read: SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::Write: SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent); 329ba: 60 91 9e 12 lds r22, 0x129E ; 0x80129e 329be: 70 91 9f 12 lds r23, 0x129F ; 0x80129f 329c2: 4c e0 ldi r20, 0x0C ; 12 329c4: 80 91 9d 12 lds r24, 0x129D ; 0x80129d 329c8: 0f 94 c3 57 call 0x2af86 ; 0x2af86 329cc: 11 c0 rjmp .+34 ; 0x329f0 SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament())); scopeState = ScopeState::FilamentSensorStateSent; } void ProtocolLogic::SendButton(uint8_t btn) { SendMsg(RequestMsg(RequestMsgCodes::Button, btn)); 329ce: 40 91 9d 12 lds r20, 0x129D ; 0x80129d 329d2: 62 e4 ldi r22, 0x42 ; 66 329d4: ce 01 movw r24, r28 329d6: 01 96 adiw r24, 0x01 ; 1 329d8: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 329dc: 49 81 ldd r20, Y+1 ; 0x01 329de: 5a 81 ldd r21, Y+2 ; 0x02 329e0: 6b 81 ldd r22, Y+3 ; 0x03 329e2: 7c 81 ldd r23, Y+4 ; 0x04 329e4: 8d 81 ldd r24, Y+5 ; 0x05 329e6: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 scopeState = ScopeState::ButtonSent; 329ea: 8a e0 ldi r24, 0x0A ; 10 329ec: 80 93 95 12 sts 0x1295, r24 ; 0x801295 SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::Write: SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); 329f0: 40 e0 ldi r20, 0x00 ; 0 329f2: 60 e0 ldi r22, 0x00 ; 0 329f4: ce 01 movw r24, r28 329f6: 01 96 adiw r24, 0x01 ; 1 329f8: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 329fc: 85 e0 ldi r24, 0x05 ; 5 329fe: fe 01 movw r30, r28 32a00: 31 96 adiw r30, 0x01 ; 1 32a02: ac e9 ldi r26, 0x9C ; 156 32a04: b2 e1 ldi r27, 0x12 ; 18 32a06: 01 90 ld r0, Z+ 32a08: 0d 92 st X+, r0 32a0a: 8a 95 dec r24 32a0c: e1 f7 brne .-8 ; 0x32a06 default: // commands currentScope = Scope::Command; SetRequestMsg(plannedRq); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); CommandRestart(); return true; 32a0e: 81 e0 ldi r24, 0x01 ; 1 } } 32a10: 2a 96 adiw r28, 0x0a ; 10 32a12: 0f b6 in r0, 0x3f ; 63 32a14: f8 94 cli 32a16: de bf out 0x3e, r29 ; 62 32a18: 0f be out 0x3f, r0 ; 63 32a1a: cd bf out 0x3d, r28 ; 61 32a1c: df 91 pop r29 32a1e: cf 91 pop r28 32a20: 08 95 ret // only issue the button to the MMU and do not restart the state machines SendButton(plannedRq.value); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::Read: SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent); 32a22: 6b e0 ldi r22, 0x0B ; 11 32a24: 80 91 9d 12 lds r24, 0x129D ; 0x80129d 32a28: 0f 94 33 94 call 0x32866 ; 0x32866 32a2c: e1 cf rjmp .-62 ; 0x329f0 case RequestMsgCodes::Write: SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::unknown: return false; 32a2e: 80 e0 ldi r24, 0x00 ; 0 32a30: ef cf rjmp .-34 ; 0x32a10 00032a32 : void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data)); } void ProtocolLogic::PlanGenericRequest(RequestMsg rq) { 32a32: cf 93 push r28 32a34: df 93 push r29 32a36: 00 d0 rcall .+0 ; 0x32a38 32a38: 1f 92 push r1 32a3a: 1f 92 push r1 32a3c: cd b7 in r28, 0x3d ; 61 32a3e: de b7 in r29, 0x3e ; 62 32a40: 49 83 std Y+1, r20 ; 0x01 32a42: 5a 83 std Y+2, r21 ; 0x02 32a44: 6b 83 std Y+3, r22 ; 0x03 32a46: 7c 83 std Y+4, r23 ; 0x04 32a48: 8d 83 std Y+5, r24 ; 0x05 plannedRq = rq; 32a4a: 85 e0 ldi r24, 0x05 ; 5 32a4c: fe 01 movw r30, r28 32a4e: 31 96 adiw r30, 0x01 ; 1 32a50: ac e9 ldi r26, 0x9C ; 156 32a52: b2 e1 ldi r27, 0x12 ; 18 32a54: 01 90 ld r0, Z+ 32a56: 0d 92 st X+, r0 32a58: 8a 95 dec r24 32a5a: e1 f7 brne .-8 ; 0x32a54 if (!ExpectsResponse()) { 32a5c: 80 91 95 12 lds r24, 0x1295 ; 0x801295 32a60: 87 ff sbrs r24, 7 32a62: 09 c0 rjmp .+18 ; 0x32a76 ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } 32a64: 0f 90 pop r0 32a66: 0f 90 pop r0 32a68: 0f 90 pop r0 32a6a: 0f 90 pop r0 32a6c: 0f 90 pop r0 32a6e: df 91 pop r29 32a70: cf 91 pop r28 } void ProtocolLogic::PlanGenericRequest(RequestMsg rq) { plannedRq = rq; if (!ExpectsResponse()) { ActivatePlannedRequest(); 32a72: 0d 94 94 94 jmp 0x32928 ; 0x32928 } // otherwise wait for an empty window to activate the request } 32a76: 0f 90 pop r0 32a78: 0f 90 pop r0 32a7a: 0f 90 pop r0 32a7c: 0f 90 pop r0 32a7e: 0f 90 pop r0 32a80: df 91 pop r29 32a82: cf 91 pop r28 32a84: 08 95 ret 00032a86 : void ProtocolLogic::CutFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot)); } void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) { 32a86: cf 93 push r28 32a88: df 93 push r29 32a8a: 00 d0 rcall .+0 ; 0x32a8c 32a8c: 1f 92 push r1 32a8e: 1f 92 push r1 32a90: cd b7 in r28, 0x3d ; 61 32a92: de b7 in r29, 0x3e ; 62 PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode)); 32a94: 48 2f mov r20, r24 32a96: 68 e5 ldi r22, 0x58 ; 88 32a98: ce 01 movw r24, r28 32a9a: 01 96 adiw r24, 0x01 ; 1 32a9c: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32aa0: 49 81 ldd r20, Y+1 ; 0x01 32aa2: 5a 81 ldd r21, Y+2 ; 0x02 32aa4: 6b 81 ldd r22, Y+3 ; 0x03 32aa6: 7c 81 ldd r23, Y+4 ; 0x04 32aa8: 8d 81 ldd r24, Y+5 ; 0x05 32aaa: 0f 94 19 95 call 0x32a32 ; 0x32a32 } 32aae: 0f 90 pop r0 32ab0: 0f 90 pop r0 32ab2: 0f 90 pop r0 32ab4: 0f 90 pop r0 32ab6: 0f 90 pop r0 32ab8: df 91 pop r29 32aba: cf 91 pop r28 32abc: 08 95 ret 00032abe : void ProtocolLogic::SendButton(uint8_t btn) { SendMsg(RequestMsg(RequestMsgCodes::Button, btn)); scopeState = ScopeState::ButtonSent; } void ProtocolLogic::SendVersion(uint8_t stage) { 32abe: 1f 93 push r17 32ac0: cf 93 push r28 32ac2: df 93 push r29 32ac4: 00 d0 rcall .+0 ; 0x32ac6 32ac6: 1f 92 push r1 32ac8: 1f 92 push r1 32aca: cd b7 in r28, 0x3d ; 61 32acc: de b7 in r29, 0x3e ; 62 32ace: 18 2f mov r17, r24 SendMsg(RequestMsg(RequestMsgCodes::Version, stage)); 32ad0: 48 2f mov r20, r24 32ad2: 63 e5 ldi r22, 0x53 ; 83 32ad4: ce 01 movw r24, r28 32ad6: 01 96 adiw r24, 0x01 ; 1 32ad8: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32adc: 49 81 ldd r20, Y+1 ; 0x01 32ade: 5a 81 ldd r21, Y+2 ; 0x02 32ae0: 6b 81 ldd r22, Y+3 ; 0x03 32ae2: 7c 81 ldd r23, Y+4 ; 0x04 32ae4: 8d 81 ldd r24, Y+5 ; 0x05 32ae6: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage); 32aea: 10 93 95 12 sts 0x1295, r17 ; 0x801295 } 32aee: 0f 90 pop r0 32af0: 0f 90 pop r0 32af2: 0f 90 pop r0 32af4: 0f 90 pop r0 32af6: 0f 90 pop r0 32af8: df 91 pop r29 32afa: cf 91 pop r28 32afc: 1f 91 pop r17 32afe: 08 95 ret 00032b00 : } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); } } void MMU2::Start() { 32b00: 1f 93 push r17 32b02: cf 93 push r28 32b04: df 93 push r29 } //uart init (io + FILE stream) void uart2_init(uint32_t baudRate) { DDRH &= ~0x01; 32b06: e1 e0 ldi r30, 0x01 ; 1 32b08: f1 e0 ldi r31, 0x01 ; 1 32b0a: 80 81 ld r24, Z 32b0c: 8e 7f andi r24, 0xFE ; 254 32b0e: 80 83 st Z, r24 PORTH |= 0x01; 32b10: e2 e0 ldi r30, 0x02 ; 2 32b12: f1 e0 ldi r31, 0x01 ; 1 32b14: 80 81 ld r24, Z 32b16: 81 60 ori r24, 0x01 ; 1 32b18: 80 83 st Z, r24 //#include void rbuf_ini(uint8_t* ptr, uint8_t l) { ptr[0] = l; 32b1a: e5 e4 ldi r30, 0x45 ; 69 32b1c: fd e0 ldi r31, 0x0D ; 13 32b1e: 90 e1 ldi r25, 0x10 ; 16 32b20: 90 83 st Z, r25 ptr[1] = 0; 32b22: 11 82 std Z+1, r1 ; 0x01 ptr[2] = 0; 32b24: 12 82 std Z+2, r1 ; 0x02 rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4); UCSR2A |= (1 << U2X2); // baudrate multiplier 32b26: e0 ed ldi r30, 0xD0 ; 208 32b28: f0 e0 ldi r31, 0x00 ; 0 32b2a: 80 81 ld r24, Z 32b2c: 82 60 ori r24, 0x02 ; 2 32b2e: 80 83 st Z, r24 UBRR2L = UART_BAUD_SELECT(baudRate, F_CPU); // select baudrate 32b30: 90 93 d4 00 sts 0x00D4, r25 ; 0x8000d4 <__TEXT_REGION_LENGTH__+0x7c20d4> UCSR2B = (1 << RXEN2) | (1 << TXEN2); // enable receiver and transmitter 32b34: e1 ed ldi r30, 0xD1 ; 209 32b36: f0 e0 ldi r31, 0x00 ; 0 32b38: 88 e1 ldi r24, 0x18 ; 24 32b3a: 80 83 st Z, r24 UCSR2B |= (1 << RXCIE2); // enable rx interrupt 32b3c: 80 81 ld r24, Z 32b3e: 80 68 ori r24, 0x80 ; 128 32b40: 80 83 st Z, r24 fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream 32b42: e4 e7 ldi r30, 0x74 ; 116 32b44: f2 e1 ldi r31, 0x12 ; 18 32b46: 83 e5 ldi r24, 0x53 ; 83 32b48: 9f ef ldi r25, 0xFF ; 255 32b4a: 91 87 std Z+9, r25 ; 0x09 32b4c: 80 87 std Z+8, r24 ; 0x08 32b4e: 8b e3 ldi r24, 0x3B ; 59 32b50: 9f ef ldi r25, 0xFF ; 255 32b52: 93 87 std Z+11, r25 ; 0x0b 32b54: 82 87 std Z+10, r24 ; 0x0a 32b56: 13 e0 ldi r17, 0x03 ; 3 32b58: 13 83 std Z+3, r17 ; 0x03 32b5a: 15 86 std Z+13, r1 ; 0x0d 32b5c: 14 86 std Z+12, r1 ; 0x0c break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 32b5e: 80 e0 ldi r24, 0x00 ; 0 32b60: 0f 94 43 95 call 0x32a86 ; 0x32a86 mmu2Serial.begin(MMU_BAUD); PowerOn(); mmu2Serial.flush(); // make sure the UART buffer is clear before starting communication SetCurrentTool(MMU2_NO_TOOL); 32b64: 83 e6 ldi r24, 0x63 ; 99 32b66: 0f 94 c7 65 call 0x2cb8e ; 0x2cb8e retryAttempts--; } } void ProtocolLogic::ResetRetryAttempts() { SERIAL_ECHOLNPGM("ResetRetryAttempts"); 32b6a: 88 e9 ldi r24, 0x98 ; 152 32b6c: 9f e9 ldi r25, 0x9F ; 159 32b6e: 0e 94 bd 7c call 0xf97a ; 0xf97a retryAttempts = MAX_RETRIES; 32b72: c2 e9 ldi r28, 0x92 ; 146 32b74: d2 e1 ldi r29, 0x12 ; 18 32b76: 10 93 e6 12 sts 0x12E6, r17 ; 0x8012e6 } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 32b7a: 81 e6 ldi r24, 0x61 ; 97 32b7c: 91 ea ldi r25, 0xA1 ; 161 32b7e: 0e 94 bd 7c call 0xf97a ; 0xf97a /// @returns the initial cause which started this drop out event inline StepStatus InitialCause() const { return cause; } /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2) inline void Reset() { occurrences = maxOccurrences; } 32b82: 8a e0 ldi r24, 0x0A ; 10 32b84: 8c 8b std Y+20, r24 ; 0x14 // start the communication logic.ResetRetryAttempts(); logic.ResetCommunicationTimeoutAttempts(); state = xState::Connecting; 32b86: 82 e0 ldi r24, 0x02 ; 2 32b88: 80 93 01 13 sts 0x1301, r24 ; 0x801301 initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 32b8c: 81 e0 ldi r24, 0x01 ; 1 32b8e: 8d 8f std Y+29, r24 ; 0x1d currentScope = Scope::StartSeq; 32b90: 8a 83 std Y+2, r24 ; 0x02 rqState = RequestStates::Code; } /// resets the internal response decoding state (typically after an error) void ResetResponseDecoder() { rspState = ResponseStates::RequestCode; 32b92: 1c a2 std Y+36, r1 ; 0x24 LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 32b94: 86 e0 ldi r24, 0x06 ; 6 32b96: 8c 83 std Y+4, r24 ; 0x04 SendVersion(0); 32b98: 80 e0 ldi r24, 0x00 ; 0 logic.Start(); } 32b9a: df 91 pop r29 32b9c: cf 91 pop r28 32b9e: 1f 91 pop r17 32ba0: 0d 94 5f 95 jmp 0x32abe ; 0x32abe 00032ba4 : if (fs != lastFSensor) { SendAndUpdateFilamentSensor(); } } void ProtocolLogic::SendQuery() { 32ba4: cf 93 push r28 32ba6: df 93 push r29 32ba8: 00 d0 rcall .+0 ; 0x32baa 32baa: 1f 92 push r1 32bac: 1f 92 push r1 32bae: cd b7 in r28, 0x3d ; 61 32bb0: de b7 in r29, 0x3e ; 62 SendMsg(RequestMsg(RequestMsgCodes::Query, 0)); 32bb2: 40 e0 ldi r20, 0x00 ; 0 32bb4: 61 e5 ldi r22, 0x51 ; 81 32bb6: ce 01 movw r24, r28 32bb8: 01 96 adiw r24, 0x01 ; 1 32bba: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32bbe: 49 81 ldd r20, Y+1 ; 0x01 32bc0: 5a 81 ldd r21, Y+2 ; 0x02 32bc2: 6b 81 ldd r22, Y+3 ; 0x03 32bc4: 7c 81 ldd r23, Y+4 ; 0x04 32bc6: 8d 81 ldd r24, Y+5 ; 0x05 32bc8: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 scopeState = ScopeState::QuerySent; 32bcc: 84 e0 ldi r24, 0x04 ; 4 32bce: 80 93 95 12 sts 0x1295, r24 ; 0x801295 } 32bd2: 0f 90 pop r0 32bd4: 0f 90 pop r0 32bd6: 0f 90 pop r0 32bd8: 0f 90 pop r0 32bda: 0f 90 pop r0 32bdc: df 91 pop r29 32bde: cf 91 pop r28 32be0: 08 95 ret 00032be2 : SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } return false; } void ProtocolLogic::SendAndUpdateFilamentSensor() { 32be2: cf 93 push r28 32be4: df 93 push r29 32be6: 00 d0 rcall .+0 ; 0x32be8 32be8: 1f 92 push r1 32bea: 1f 92 push r1 32bec: cd b7 in r28, 0x3d ; 61 32bee: de b7 in r29, 0x3e ; 62 SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament())); 32bf0: 0f 94 0a 51 call 0x2a214 ; 0x2a214 32bf4: 80 93 d6 12 sts 0x12D6, r24 ; 0x8012d6 32bf8: 48 2f mov r20, r24 32bfa: 66 e6 ldi r22, 0x66 ; 102 32bfc: ce 01 movw r24, r28 32bfe: 01 96 adiw r24, 0x01 ; 1 32c00: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32c04: 49 81 ldd r20, Y+1 ; 0x01 32c06: 5a 81 ldd r21, Y+2 ; 0x02 32c08: 6b 81 ldd r22, Y+3 ; 0x03 32c0a: 7c 81 ldd r23, Y+4 ; 0x04 32c0c: 8d 81 ldd r24, Y+5 ; 0x05 32c0e: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 scopeState = ScopeState::FilamentSensorStateSent; 32c12: 86 e0 ldi r24, 0x06 ; 6 32c14: 80 93 95 12 sts 0x1295, r24 ; 0x801295 } 32c18: 0f 90 pop r0 32c1a: 0f 90 pop r0 32c1c: 0f 90 pop r0 32c1e: 0f 90 pop r0 32c20: 0f 90 pop r0 32c22: df 91 pop r29 32c24: cf 91 pop r28 32c26: 08 95 ret 00032c28 : CheckAndReportAsyncEvents(); } return Processing; } StepStatus ProtocolLogic::ProcessCommandQueryResponse() { 32c28: cf 93 push r28 32c2a: df 93 push r29 32c2c: 00 d0 rcall .+0 ; 0x32c2e 32c2e: 1f 92 push r1 32c30: 1f 92 push r1 32c32: cd b7 in r28, 0x3d ; 61 32c34: de b7 in r29, 0x3e ; 62 switch (rsp.paramCode) { 32c36: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 32c3a: 85 34 cpi r24, 0x45 ; 69 32c3c: f1 f0 breq .+60 ; 0x32c7a 32c3e: 20 f4 brcc .+8 ; 0x32c48 32c40: 82 34 cpi r24, 0x42 ; 66 32c42: 51 f1 breq .+84 ; 0x32c98 } else { // got response to some other command - the originally issued command was interrupted! return Interrupted; } default: return ProtocolError; 32c44: 85 e0 ldi r24, 0x05 ; 5 32c46: 11 c0 rjmp .+34 ; 0x32c6a } return Processing; } StepStatus ProtocolLogic::ProcessCommandQueryResponse() { switch (rsp.paramCode) { 32c48: 86 34 cpi r24, 0x46 ; 70 32c4a: 71 f1 breq .+92 ; 0x32ca8 32c4c: 80 35 cpi r24, 0x50 ; 80 32c4e: d1 f7 brne .-12 ; 0x32c44 case ResponseMsgParamCodes::Processing: progressCode = static_cast(rsp.paramValue); 32c50: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 32c54: 80 93 d4 12 sts 0x12D4, r24 ; 0x8012d4 errorCode = ErrorCode::OK; 32c58: 81 e0 ldi r24, 0x01 ; 1 32c5a: 90 e0 ldi r25, 0x00 ; 0 32c5c: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 32c60: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly 32c64: 0f 94 f1 95 call 0x32be2 ; 0x32be2 return Processing; 32c68: 80 e0 ldi r24, 0x00 ; 0 return Interrupted; } default: return ProtocolError; } } 32c6a: 0f 90 pop r0 32c6c: 0f 90 pop r0 32c6e: 0f 90 pop r0 32c70: 0f 90 pop r0 32c72: 0f 90 pop r0 32c74: df 91 pop r29 32c76: cf 91 pop r28 32c78: 08 95 ret errorCode = ErrorCode::OK; SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly return Processing; case ResponseMsgParamCodes::Error: // in case of an error the progress code remains as it has been before progressCode = ProgressCode::ERRWaitingForUser; 32c7a: 8c e0 ldi r24, 0x0C ; 12 32c7c: 80 93 d4 12 sts 0x12D4, r24 ; 0x8012d4 errorCode = static_cast(rsp.paramValue); 32c80: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 32c84: 90 91 ae 12 lds r25, 0x12AE ; 0x8012ae 32c88: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 32c8c: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 // keep on reporting the state of fsensor regularly even in command error state // - the MMU checks FINDA and fsensor even while recovering from errors SendAndUpdateFilamentSensor(); 32c90: 0f 94 f1 95 call 0x32be2 ; 0x32be2 return CommandError; 32c94: 87 e0 ldi r24, 0x07 ; 7 32c96: e9 cf rjmp .-46 ; 0x32c6a case ResponseMsgParamCodes::Button: // The user pushed a button on the MMU. Save it, do what we need to do // to prepare, then pass it back to the MMU so it can work its magic. buttonCode = static_cast(rsp.paramValue); 32c98: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 32c9c: 80 93 d5 12 sts 0x12D5, r24 ; 0x8012d5 SendAndUpdateFilamentSensor(); 32ca0: 0f 94 f1 95 call 0x32be2 ; 0x32be2 return ButtonPushed; 32ca4: 8b e0 ldi r24, 0x0B ; 11 32ca6: e1 cf rjmp .-62 ; 0x32c6a case ResponseMsgParamCodes::Finished: // We must check whether the "finished" is actually related to the command issued into the MMU // It can also be an X0 F which means MMU just successfully restarted. if (ReqMsg().code == rsp.request.code && ReqMsg().value == rsp.request.value) { 32ca8: 90 91 97 12 lds r25, 0x1297 ; 0x801297 32cac: 80 91 a7 12 lds r24, 0x12A7 ; 0x8012a7 32cb0: 98 13 cpse r25, r24 32cb2: 22 c0 rjmp .+68 ; 0x32cf8 32cb4: 90 91 98 12 lds r25, 0x1298 ; 0x801298 32cb8: 80 91 a8 12 lds r24, 0x12A8 ; 0x8012a8 32cbc: 98 13 cpse r25, r24 32cbe: 1c c0 rjmp .+56 ; 0x32cf8 progressCode = ProgressCode::OK; 32cc0: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 errorCode = ErrorCode::OK; 32cc4: 81 e0 ldi r24, 0x01 ; 1 32cc6: 90 e0 ldi r25, 0x00 ; 0 32cc8: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 32ccc: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 scopeState = ScopeState::Ready; 32cd0: 82 e8 ldi r24, 0x82 ; 130 32cd2: 80 93 95 12 sts 0x1295, r24 ; 0x801295 rq = RequestMsg(RequestMsgCodes::unknown, 0); // clear the successfully finished request 32cd6: 40 e0 ldi r20, 0x00 ; 0 32cd8: 60 e0 ldi r22, 0x00 ; 0 32cda: ce 01 movw r24, r28 32cdc: 01 96 adiw r24, 0x01 ; 1 32cde: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32ce2: 85 e0 ldi r24, 0x05 ; 5 32ce4: fe 01 movw r30, r28 32ce6: 31 96 adiw r30, 0x01 ; 1 32ce8: a7 e9 ldi r26, 0x97 ; 151 32cea: b2 e1 ldi r27, 0x12 ; 18 32cec: 01 90 ld r0, Z+ 32cee: 0d 92 st X+, r0 32cf0: 8a 95 dec r24 32cf2: e1 f7 brne .-8 ; 0x32cec 32cf4: 82 e0 ldi r24, 0x02 ; 2 32cf6: b9 cf rjmp .-142 ; 0x32c6a return Finished; } else { // got response to some other command - the originally issued command was interrupted! return Interrupted; 32cf8: 83 e0 ldi r24, 0x03 ; 3 32cfa: b7 cf rjmp .-146 ; 0x32c6a 00032cfc : mmu_print_saved &= ~(SavedState::ParkExtruder); } } void MMU2::CheckUserInput() { 32cfc: 1f 93 push r17 32cfe: cf 93 push r28 32d00: df 93 push r29 32d02: 00 d0 rcall .+0 ; 0x32d04 32d04: 1f 92 push r1 32d06: 1f 92 push r1 32d08: cd b7 in r28, 0x3d ; 61 32d0a: de b7 in r29, 0x3e ; 62 const char *PrusaErrorButtonMore() { return MSG_BTN_MORE; } Buttons ButtonPressed(ErrorCode ec) { if (buttonSelectedOperation == ButtonOperations::NoOperation) { 32d0c: 80 91 44 0d lds r24, 0x0D44 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> 32d10: 81 11 cpse r24, r1 32d12: 2a c0 rjmp .+84 ; 0x32d68 auto btn = ButtonPressed(lastErrorCode); // Was a button pressed on the MMU itself instead of the LCD? if (btn == Buttons::NoButton && lastButton != Buttons::NoButton) { 32d14: 10 91 fc 12 lds r17, 0x12FC ; 0x8012fc 32d18: 1f 3f cpi r17, 0xFF ; 255 32d1a: 91 f5 brne .+100 ; 0x32d80 btn = lastButton; lastButton = Buttons::NoButton; // Clear it. } if (mmu2.MMULastErrorSource() == ErrorSourcePrinter && btn != Buttons::NoButton) { 32d1c: 80 91 fb 12 lds r24, 0x12FB ; 0x8012fb 32d20: 81 11 cpse r24, r1 32d22: 60 c0 rjmp .+192 ; 0x32de4 32d24: 1f 3f cpi r17, 0xFF ; 255 32d26: b9 f0 breq .+46 ; 0x32d56 inline void SetPrinterError(ErrorCode ec) { explicitPrinterError = ec; } inline void ClearPrinterError() { explicitPrinterError = ErrorCode::OK; 32d28: 81 e0 ldi r24, 0x01 ; 1 32d2a: 90 e0 ldi r25, 0x00 ; 0 32d2c: 90 93 93 12 sts 0x1293, r25 ; 0x801293 32d30: 80 93 92 12 sts 0x1292, r24 ; 0x801292 } } void ClearPrinterError() { logic.ClearPrinterError(); lastErrorCode = ErrorCode::OK; 32d34: 90 93 fa 12 sts 0x12FA, r25 ; 0x8012fa 32d38: 80 93 f9 12 sts 0x12F9, r24 ; 0x8012f9 lastErrorSource = ErrorSource::ErrorSourceNone; 32d3c: 8f ef ldi r24, 0xFF ; 255 32d3e: 80 93 fb 12 sts 0x12FB, r24 ; 0x8012fb // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above) // we'll actually wait for it automagically in manage_response and after it finishes correctly, // we'll issue another command (like toolchange) } switch (btn) { 32d42: 13 30 cpi r17, 0x03 ; 3 32d44: 09 f4 brne .+2 ; 0x32d48 32d46: 82 c0 rjmp .+260 ; 0x32e4c 32d48: f8 f0 brcs .+62 ; 0x32d88 32d4a: 16 30 cpi r17, 0x06 ; 6 32d4c: 08 f4 brcc .+2 ; 0x32d50 32d4e: 7b c0 rjmp .+246 ; 0x32e46 32d50: 17 30 cpi r17, 0x07 ; 7 32d52: 09 f4 brne .+2 ; 0x32d56 32d54: 7f c0 rjmp .+254 ; 0x32e54 // @@TODO not sure if we shall handle this high level operation at this spot break; default: break; } } 32d56: 0f 90 pop r0 32d58: 0f 90 pop r0 32d5a: 0f 90 pop r0 32d5c: 0f 90 pop r0 32d5e: 0f 90 pop r0 32d60: df 91 pop r29 32d62: cf 91 pop r28 32d64: 1f 91 pop r17 32d66: 08 95 ret return Buttons::NoButton; // no button } const auto result = ButtonAvailable(ec); 32d68: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 32d6c: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 32d70: 0f 94 9c 53 call 0x2a738 ; 0x2a738 32d74: 18 2f mov r17, r24 buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation 32d76: 10 92 44 0d sts 0x0D44, r1 ; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450> void MMU2::CheckUserInput() { auto btn = ButtonPressed(lastErrorCode); // Was a button pressed on the MMU itself instead of the LCD? if (btn == Buttons::NoButton && lastButton != Buttons::NoButton) { 32d7a: 8f 3f cpi r24, 0xFF ; 255 32d7c: 79 f6 brne .-98 ; 0x32d1c 32d7e: ca cf rjmp .-108 ; 0x32d14 btn = lastButton; lastButton = Buttons::NoButton; // Clear it. 32d80: 8f ef ldi r24, 0xFF ; 255 32d82: 80 93 fc 12 sts 0x12FC, r24 ; 0x8012fc 32d86: ca cf rjmp .-108 ; 0x32d1c switch (btn) { case Buttons::Left: case Buttons::Middle: case Buttons::Right: SERIAL_ECHOPGM("CheckUserInput-btnLMR "); 32d88: 81 e8 ldi r24, 0x81 ; 129 32d8a: 9f e9 ldi r25, 0x9F ; 159 32d8c: 0e 94 c4 7a call 0xf588 ; 0xf588 SERIAL_ECHOLN((int)buttons_to_uint8t(btn)); 32d90: 81 2f mov r24, r17 32d92: 90 e0 ldi r25, 0x00 ; 0 32d94: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else... 32d98: 0f 94 48 9c call 0x33890 ; 0x33890 if (mmu2.MMULastErrorSource() == ErrorSourceMMU) { 32d9c: 80 91 fb 12 lds r24, 0x12FB ; 0x8012fb 32da0: 81 30 cpi r24, 0x01 ; 1 32da2: 89 f4 brne .+34 ; 0x32dc6 ScreenUpdateEnable(); return true; } void MMU2::Button(uint8_t index) { LogEchoEvent_P(PSTR("Button")); 32da4: 8a e7 ldi r24, 0x7A ; 122 32da6: 9f e9 ldi r25, 0x9F ; 159 32da8: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode)); } void ProtocolLogic::Button(uint8_t index) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Button, index)); 32dac: 41 2f mov r20, r17 32dae: 62 e4 ldi r22, 0x42 ; 66 32db0: ce 01 movw r24, r28 32db2: 01 96 adiw r24, 0x01 ; 1 32db4: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 32db8: 49 81 ldd r20, Y+1 ; 0x01 32dba: 5a 81 ldd r21, Y+2 ; 0x02 32dbc: 6b 81 ldd r22, Y+3 ; 0x03 32dbe: 7c 81 ldd r23, Y+4 ; 0x04 32dc0: 8d 81 ldd r24, Y+5 ; 0x05 32dc2: 0f 94 19 95 call 0x32a32 ; 0x32a32 } // A quick hack: for specific error codes move the E-motor every time. // Not sure if we can rely on the fsensor. // Just plan the move, let the MMU take over when it is ready switch (lastErrorCode) { 32dc6: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 32dca: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 32dce: 84 30 cpi r24, 0x04 ; 4 32dd0: 20 e8 ldi r18, 0x80 ; 128 32dd2: 92 07 cpc r25, r18 32dd4: 21 f0 breq .+8 ; 0x32dde 32dd6: 89 30 cpi r24, 0x09 ; 9 32dd8: 90 48 sbci r25, 0x80 ; 128 32dda: 09 f0 breq .+2 ; 0x32dde 32ddc: bc cf rjmp .-136 ; 0x32d56 case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF: case ErrorCode::FSENSOR_TOO_EARLY: HelpUnloadToFinda(); 32dde: 0f 94 08 5b call 0x2b610 ; 0x2b610 32de2: b9 cf rjmp .-142 ; 0x32d56 // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above) // we'll actually wait for it automagically in manage_response and after it finishes correctly, // we'll issue another command (like toolchange) } switch (btn) { 32de4: 19 30 cpi r17, 0x09 ; 9 32de6: 08 f0 brcs .+2 ; 0x32dea 32de8: b6 cf rjmp .-148 ; 0x32d56 32dea: e1 2f mov r30, r17 32dec: f0 e0 ldi r31, 0x00 ; 0 32dee: 88 27 eor r24, r24 32df0: e3 50 subi r30, 0x03 ; 3 32df2: f9 46 sbci r31, 0x69 ; 105 32df4: 8e 4f sbci r24, 0xFE ; 254 32df6: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 32dfa: fc 37 cpi r31, 0x7C ; 124 32dfc: fc 37 cpi r31, 0x7C ; 124 32dfe: fc 37 cpi r31, 0x7C ; 124 32e00: 86 37 cpi r24, 0x76 ; 118 32e02: b6 37 cpi r27, 0x76 ; 118 32e04: b6 37 cpi r27, 0x76 ; 118 32e06: 06 37 cpi r16, 0x76 ; 118 32e08: 92 37 cpi r25, 0x72 ; 114 32e0a: 20 38 cpi r18, 0x80 ; 128 logic.Stop(); mmu2Serial.close(); } void MMU2::Tune() { switch (lastErrorCode) { 32e0c: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 32e10: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 32e14: 87 38 cpi r24, 0x87 ; 135 32e16: 20 e8 ldi r18, 0x80 ; 128 32e18: 92 07 cpc r25, r18 32e1a: 21 f0 breq .+8 ; 0x32e24 32e1c: 87 30 cpi r24, 0x07 ; 7 32e1e: 91 48 sbci r25, 0x81 ; 129 32e20: 09 f0 breq .+2 ; 0x32e24 32e22: 99 cf rjmp .-206 ; 0x32d56 // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 32e24: 80 91 94 12 lds r24, 0x1294 ; 0x801294 32e28: 84 30 cpi r24, 0x04 ; 4 32e2a: 21 f4 brne .+8 ; 0x32e34 ); MENU_END(); } void tuneIdlerStallguardThreshold() { if ((CommandInProgress)mmu2.GetCommandInProgress() != NoCommand) 32e2c: 80 91 97 12 lds r24, 0x1297 ; 0x801297 32e30: 81 11 cpse r24, r1 32e32: 91 cf rjmp .-222 ; 0x32d56 // homing fails during toolchange. // To save the print, make the Tune button unresponsive for now. return; } putErrorScreenToSleep = true; 32e34: 81 e0 ldi r24, 0x01 ; 1 32e36: 80 93 43 0d sts 0x0D43, r24 ; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451> menu_submenu(tuneIdlerStallguardThresholdMenu); 32e3a: 60 e0 ldi r22, 0x00 ; 0 32e3c: 8c e2 ldi r24, 0x2C ; 44 32e3e: 98 e3 ldi r25, 0x38 ; 56 32e40: 0e 94 dd 62 call 0xc5ba ; 0xc5ba 32e44: 88 cf rjmp .-240 ; 0x32d56 } /// @brief Queue a button operation which the printer can act upon /// @param btn Button operation inline void SetPrinterButtonOperation(Buttons btn) { printerButtonOperation = btn; 32e46: 10 93 ff 12 sts 0x12FF, r17 ; 0x8012ff 32e4a: 85 cf rjmp .-246 ; 0x32d56 break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 32e4c: 80 e0 ldi r24, 0x00 ; 0 32e4e: 0f 94 43 95 call 0x32a86 ; 0x32a86 32e52: 81 cf rjmp .-254 ; 0x32d56 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 32e54: 10 92 01 13 sts 0x1301, r1 ; 0x801301 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 32e58: 10 92 af 12 sts 0x12AF, r1 ; 0x8012af currentScope = Scope::Stopped; 32e5c: 10 92 94 12 sts 0x1294, r1 ; 0x801294 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 32e60: 60 e0 ldi r22, 0x00 ; 0 32e62: 8c ea ldi r24, 0xAC ; 172 32e64: 9c e0 ldi r25, 0x0C ; 12 32e66: 0f 94 04 a4 call 0x34808 ; 0x34808 } /// Disables MMU in EEPROM void DisableMMUInSettings() { eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false); mmu2.Status(); 32e6a: 0f 94 ad 65 call 0x2cb5a ; 0x2cb5a 32e6e: 73 cf rjmp .-282 ; 0x32d56 00032e70 : avoidRecursion = true; mmu_loop_inner(true); avoidRecursion = false; } void __attribute__((noinline)) MMU2::mmu_loop_inner(bool reportErrors) { 32e70: 4f 92 push r4 32e72: 5f 92 push r5 32e74: 6f 92 push r6 32e76: 7f 92 push r7 32e78: 8f 92 push r8 32e7a: 9f 92 push r9 32e7c: af 92 push r10 32e7e: bf 92 push r11 32e80: cf 92 push r12 32e82: df 92 push r13 32e84: ef 92 push r14 32e86: ff 92 push r15 32e88: 0f 93 push r16 32e8a: 1f 93 push r17 32e8c: cf 93 push r28 32e8e: df 93 push r29 32e90: cd b7 in r28, 0x3d ; 61 32e92: de b7 in r29, 0x3e ; 62 32e94: a0 97 sbiw r28, 0x20 ; 32 32e96: 0f b6 in r0, 0x3f ; 63 32e98: f8 94 cli 32e9a: de bf out 0x3e, r29 ; 62 32e9c: 0f be out 0x3f, r0 ; 63 32e9e: cd bf out 0x3d, r28 ; 61 32ea0: 08 2f mov r16, r24 } } StepStatus MMU2::LogicStep(bool reportErrors) { // Process any buttons before proceeding with another MMU Query CheckUserInput(); 32ea2: 0f 94 7e 96 call 0x32cfc ; 0x32cfc DelayedRestartRestart(); return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError); } StepStatus ProtocolLogic::Step() { if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately 32ea6: 80 91 95 12 lds r24, 0x1295 ; 0x801295 32eaa: 87 fd sbrc r24, 7 ActivatePlannedRequest(); 32eac: 0f 94 94 94 call 0x32928 ; 0x32928 32eb0: 90 91 95 12 lds r25, 0x1295 ; 0x801295 } return Processing; } StepStatus ProtocolLogic::ScopeStep() { if (!ExpectsResponse()) { 32eb4: 97 ff sbrs r25, 7 32eb6: 7d c0 rjmp .+250 ; 0x32fb2 // we are waiting for something switch (currentScope) { 32eb8: 80 91 94 12 lds r24, 0x1294 ; 0x801294 32ebc: 82 30 cpi r24, 0x02 ; 2 32ebe: b1 f0 breq .+44 ; 0x32eec 32ec0: 08 f4 brcc .+2 ; 0x32ec4 32ec2: 75 c0 rjmp .+234 ; 0x32fae 32ec4: 83 30 cpi r24, 0x03 ; 3 32ec6: e1 f1 breq .+120 ; 0x32f40 32ec8: 84 30 cpi r24, 0x04 ; 4 32eca: 09 f4 brne .+2 ; 0x32ece 32ecc: 54 c0 rjmp .+168 ; 0x32f76 break; case Finished: { // We are ok, switching to Idle if there is no potential next request planned. // But the trouble is we must report a finished command if the previous command has just been finished // i.e. only try to find some planned command if we just finished the Idle cycle if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle 32ece: 0f 94 94 94 call 0x32928 ; 0x32928 32ed2: 81 11 cpse r24, r1 32ed4: 6b c3 rjmp .+1750 ; 0x335ac // and we have just received a response to a Q0 message about a command progress return ProcessCommandQueryResponse(); } void ProtocolLogic::SwitchToIdle() { state = State::Running; 32ed6: 82 e0 ldi r24, 0x02 ; 2 32ed8: 80 93 af 12 sts 0x12AF, r24 ; 0x8012af currentScope = Scope::Idle; 32edc: 83 e0 ldi r24, 0x03 ; 3 32ede: 80 93 94 12 sts 0x1294, r24 ; 0x801294 scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 32ee2: 82 e8 ldi r24, 0x82 ; 130 32ee4: 80 93 95 12 sts 0x1295, r24 ; 0x801295 // We are ok, switching to Idle if there is no potential next request planned. // But the trouble is we must report a finished command if the previous command has just been finished // i.e. only try to find some planned command if we just finished the Idle cycle if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle SwitchToIdle(); } else if (ExpectsResponse()) { 32ee8: 12 e0 ldi r17, 0x02 ; 2 32eea: db c2 rjmp .+1462 ; 0x334a2 IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 32eec: 0f 94 f0 0d call 0x21be0 ; 0x21be0 32ef0: ab 01 movw r20, r22 32ef2: bc 01 movw r22, r24 32ef4: 80 91 a1 12 lds r24, 0x12A1 ; 0x8012a1 32ef8: 90 91 a2 12 lds r25, 0x12A2 ; 0x8012a2 32efc: a0 91 a3 12 lds r26, 0x12A3 ; 0x8012a3 32f00: b0 91 a4 12 lds r27, 0x12A4 ; 0x8012a4 32f04: 88 51 subi r24, 0x18 ; 24 32f06: 9c 4f sbci r25, 0xFC ; 252 32f08: af 4f sbci r26, 0xFF ; 255 32f0a: bf 4f sbci r27, 0xFF ; 255 return VersionMismatch; } } StepStatus ProtocolLogic::DelayedRestartWait() { if (Elapsed(heartBeatPeriod)) { // this basically means, that we are waiting until there is some traffic on 32f0c: 48 17 cp r20, r24 32f0e: 59 07 cpc r21, r25 32f10: 6a 07 cpc r22, r26 32f12: 7b 07 cpc r23, r27 32f14: 08 f4 brcc .+2 ; 0x32f18 32f16: 4b c0 rjmp .+150 ; 0x32fae void MMU2Serial::close() { // @@TODO - probably turn off the UART } int MMU2Serial::read() { return fgetc(uart2io); 32f18: 84 e7 ldi r24, 0x74 ; 116 32f1a: 92 e1 ldi r25, 0x12 ; 18 32f1c: 0f 94 0c a2 call 0x34418 ; 0x34418 while (uart->read() != -1) 32f20: 01 96 adiw r24, 0x01 ; 1 32f22: d1 f7 brne .-12 ; 0x32f18 initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 32f24: 81 e0 ldi r24, 0x01 ; 1 32f26: 80 93 af 12 sts 0x12AF, r24 ; 0x8012af currentScope = Scope::StartSeq; 32f2a: 80 93 94 12 sts 0x1294, r24 ; 0x801294 32f2e: 10 92 b6 12 sts 0x12B6, r1 ; 0x8012b6 LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 32f32: 86 e0 ldi r24, 0x06 ; 6 32f34: 80 93 96 12 sts 0x1296, r24 ; 0x801296 SendVersion(0); 32f38: 80 e0 ldi r24, 0x00 ; 0 case ScopeState::S2Sent: // received response to S2 - minor return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent); case ScopeState::S3Sent: // received response to S3 - revision if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) { // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0? SendVersion(3); 32f3a: 0f 94 5f 95 call 0x32abe ; 0x32abe 32f3e: 37 c0 rjmp .+110 ; 0x32fae } return Processing; } StepStatus ProtocolLogic::IdleWait() { if (scopeState == ScopeState::Ready) { // check timeout 32f40: 92 38 cpi r25, 0x82 ; 130 32f42: 29 f6 brne .-118 ; 0x32ece IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 32f44: 0f 94 f0 0d call 0x21be0 ; 0x21be0 32f48: ab 01 movw r20, r22 32f4a: bc 01 movw r22, r24 32f4c: 80 91 a1 12 lds r24, 0x12A1 ; 0x8012a1 32f50: 90 91 a2 12 lds r25, 0x12A2 ; 0x8012a2 32f54: a0 91 a3 12 lds r26, 0x12A3 ; 0x8012a3 32f58: b0 91 a4 12 lds r27, 0x12A4 ; 0x8012a4 32f5c: 88 51 subi r24, 0x18 ; 24 32f5e: 9c 4f sbci r25, 0xFC ; 252 32f60: af 4f sbci r26, 0xFF ; 255 32f62: bf 4f sbci r27, 0xFF ; 255 return Processing; } StepStatus ProtocolLogic::IdleWait() { if (scopeState == ScopeState::Ready) { // check timeout if (Elapsed(heartBeatPeriod)) { 32f64: 48 17 cp r20, r24 32f66: 59 07 cpc r21, r25 32f68: 6a 07 cpc r22, r26 32f6a: 7b 07 cpc r23, r27 32f6c: 08 f4 brcc .+2 ; 0x32f70 32f6e: af cf rjmp .-162 ; 0x32ece void ProtocolLogic::SwitchFromStartToIdle() { state = State::Running; currentScope = Scope::Idle; IdleRestart(); SendQuery(); // force sending Q0 immediately 32f70: 0f 94 d2 95 call 0x32ba4 ; 0x32ba4 32f74: 1c c0 rjmp .+56 ; 0x32fae } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 32f76: 0f 94 f0 0d call 0x21be0 ; 0x21be0 32f7a: ab 01 movw r20, r22 32f7c: bc 01 movw r22, r24 32f7e: 80 91 a1 12 lds r24, 0x12A1 ; 0x8012a1 32f82: 90 91 a2 12 lds r25, 0x12A2 ; 0x8012a2 32f86: a0 91 a3 12 lds r26, 0x12A3 ; 0x8012a3 32f8a: b0 91 a4 12 lds r27, 0x12A4 ; 0x8012a4 32f8e: 88 51 subi r24, 0x18 ; 24 32f90: 9c 4f sbci r25, 0xFC ; 252 32f92: af 4f sbci r26, 0xFF ; 255 32f94: bf 4f sbci r27, 0xFF ; 255 } return Processing; } StepStatus ProtocolLogic::CommandWait() { if (Elapsed(heartBeatPeriod)) { 32f96: 48 17 cp r20, r24 32f98: 59 07 cpc r21, r25 32f9a: 6a 07 cpc r22, r26 32f9c: 7b 07 cpc r23, r27 32f9e: 40 f7 brcc .-48 ; 0x32f70 }; void ProtocolLogic::CheckAndReportAsyncEvents() { // even when waiting for a query period, we need to report a change in filament sensor's state // - it is vital for a precise synchronization of moves of the printer and the MMU uint8_t fs = (uint8_t)WhereIsFilament(); 32fa0: 0f 94 0a 51 call 0x2a214 ; 0x2a214 if (fs != lastFSensor) { 32fa4: 90 91 d6 12 lds r25, 0x12D6 ; 0x8012d6 32fa8: 89 13 cpse r24, r25 SendAndUpdateFilamentSensor(); 32faa: 0f 94 f1 95 call 0x32be2 ; 0x32be2 // i.e. only try to find some planned command if we just finished the Idle cycle if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle SwitchToIdle(); } else if (ExpectsResponse()) { // if the previous cycle was Idle and now we have planned a new command -> avoid returning Finished currentStatus = Processing; 32fae: 10 e0 ldi r17, 0x00 ; 0 32fb0: 78 c2 rjmp .+1264 ; 0x334a2 StepStatus ProtocolLogic::ExpectingMessage() { int bytesConsumed = 0; int c = -1; OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;) 32fb2: a1 2c mov r10, r1 return State::SomethingElse; } }; StepStatus ProtocolLogic::ExpectingMessage() { int bytesConsumed = 0; 32fb4: d1 2c mov r13, r1 32fb6: c1 2c mov r12, r1 /// @returns true when "ok\n" gets detected State Detect(uint8_t c) { // consume old MMU FW's data if any -> avoid confusion of protocol decoder if (ok == 0 && c == 'o') { ++ok; 32fb8: 99 24 eor r9, r9 32fba: 93 94 inc r9 responseMsg.paramCode = (ResponseMsgParamCodes)c; responseMsg.paramValue = 0; return DecodeStatus::NeedMoreData; default: responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; 32fbc: 55 e0 ldi r21, 0x05 ; 5 32fbe: b5 2e mov r11, r21 case 'E': case 'F': case 'A': case 'R': case 'B': rspState = ResponseStates::ParamValue; 32fc0: 63 e0 ldi r22, 0x03 ; 3 32fc2: 86 2e mov r8, r22 if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; responseMsg.paramValue += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (IsCRCSeparator(c)) { rspState = ResponseStates::CRC; 32fc4: 74 e0 ldi r23, 0x04 ; 4 32fc6: 77 2e mov r7, r23 if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; responseMsg.request.value += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (c == ' ') { rspState = ResponseStates::ParamCode; 32fc8: e2 e0 ldi r30, 0x02 ; 2 32fca: 6e 2e mov r6, r30 32fcc: 66 c0 rjmp .+204 ; 0x3309a ++i; return i; } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { 32fce: 23 30 cpi r18, 0x03 ; 3 32fd0: 09 f4 brne .+2 ; 0x32fd4 32fd2: e0 c0 rjmp .+448 ; 0x33194 32fd4: 24 30 cpi r18, 0x04 ; 4 32fd6: 09 f0 breq .+2 ; 0x32fda 32fd8: 83 c0 rjmp .+262 ; 0x330e0 } static constexpr bool IsCRCSeparator(uint8_t c) { return c == '*'; } static constexpr bool IsHexDigit(uint8_t c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'); 32fda: 20 ed ldi r18, 0xD0 ; 208 32fdc: 28 0f add r18, r24 32fde: 2a 30 cpi r18, 0x0A ; 10 32fe0: 08 f4 brcc .+2 ; 0x32fe4 32fe2: f8 c0 rjmp .+496 ; 0x331d4 32fe4: 2f e9 ldi r18, 0x9F ; 159 32fe6: 28 0f add r18, r24 32fe8: 26 30 cpi r18, 0x06 ; 6 32fea: 08 f4 brcc .+2 ; 0x32fee 32fec: f3 c0 rjmp .+486 ; 0x331d4 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 32fee: 8a 30 cpi r24, 0x0A ; 10 32ff0: 09 f0 breq .+2 ; 0x32ff4 32ff2: fa c0 rjmp .+500 ; 0x331e8 responseMsg.request.crc8 <<= 4U; responseMsg.request.crc8 += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (IsNewLine(c)) { // check CRC at this spot if (responseMsg.request.crc8 != responseMsg.ComputeCRC8()) { 32ff4: 40 90 bb 12 lds r4, 0x12BB ; 0x8012bb 32ff8: 87 eb ldi r24, 0xB7 ; 183 32ffa: 92 e1 ldi r25, 0x12 ; 18 32ffc: 0f 94 b6 50 call 0x2a16c ; 0x2a16c 33000: 48 12 cpse r4, r24 33002: b8 c0 rjmp .+368 ; 0x33174 // CRC mismatch responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; return DecodeStatus::Error; } else { rspState = ResponseStates::RequestCode; 33004: 10 92 b6 12 sts 0x12B6, r1 ; 0x8012b6 /// @returns the most recently lexed request message inline const RequestMsg GetRequestMsg() const { return requestMsg; } /// @returns the most recently lexed response message inline const ResponseMsg GetResponseMsg() const { return responseMsg; } 33008: 88 e0 ldi r24, 0x08 ; 8 3300a: e7 eb ldi r30, 0xB7 ; 183 3300c: f2 e1 ldi r31, 0x12 ; 18 3300e: de 01 movw r26, r28 33010: 51 96 adiw r26, 0x11 ; 17 33012: 01 90 ld r0, Z+ 33014: 0d 92 st X+, r0 33016: 8a 95 dec r24 33018: e1 f7 brne .-8 ; 0x33012 3301a: 88 e0 ldi r24, 0x08 ; 8 3301c: fe 01 movw r30, r28 3301e: 71 96 adiw r30, 0x11 ; 17 33020: de 01 movw r26, r28 33022: 59 96 adiw r26, 0x19 ; 25 33024: 01 90 ld r0, Z+ 33026: 0d 92 st X+, r0 33028: 8a 95 dec r24 3302a: e1 f7 brne .-8 ; 0x33024 while ((c = uart->read()) >= 0) { ++bytesConsumed; RecordReceivedByte(c); switch (protocol.DecodeResponse(c)) { case DecodeStatus::MessageCompleted: rsp = protocol.GetResponseMsg(); 3302c: 88 e0 ldi r24, 0x08 ; 8 3302e: fe 01 movw r30, r28 33030: 79 96 adiw r30, 0x19 ; 25 33032: a7 ea ldi r26, 0xA7 ; 167 33034: b2 e1 ldi r27, 0x12 ; 18 33036: 01 90 ld r0, Z+ 33038: 0d 92 st X+, r0 3303a: 8a 95 dec r24 3303c: e1 f7 brne .-8 ; 0x33036 } dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly } void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) { *dst++ = '<'; 3303e: 8c e3 ldi r24, 0x3C ; 60 33040: 89 83 std Y+1, r24 ; 0x01 33042: fe 01 movw r30, r28 33044: 32 96 adiw r30, 0x02 ; 2 33046: af eb ldi r26, 0xBF ; 191 33048: b2 e1 ldi r27, 0x12 ; 18 for (uint8_t i = 0; i < lrb; ++i) { 3304a: 20 e0 ldi r18, 0x00 ; 0 3304c: cf 01 movw r24, r30 3304e: 52 16 cp r5, r18 33050: 09 f4 brne .+2 ; 0x33054 33052: cd c0 rjmp .+410 ; 0x331ee uint8_t b = lastReceivedBytes[i]; 33054: 3d 91 ld r19, X+ // Check for printable character, including space if (b < 32 || b > 127) { 33056: 40 ee ldi r20, 0xE0 ; 224 33058: 43 0f add r20, r19 3305a: 40 36 cpi r20, 0x60 ; 96 3305c: 08 f0 brcs .+2 ; 0x33060 b = '.'; 3305e: 3e e2 ldi r19, 0x2E ; 46 } *dst++ = b; 33060: 31 93 st Z+, r19 dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly } void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) { *dst++ = '<'; for (uint8_t i = 0; i < lrb; ++i) { 33062: 2f 5f subi r18, 0xFF ; 255 33064: f4 cf rjmp .-24 ; 0x3304e } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 33066: 8e 34 cpi r24, 0x4E ; 78 33068: 08 f0 brcs .+2 ; 0x3306c 3306a: 56 c0 rjmp .+172 ; 0x33118 3306c: 8b 34 cpi r24, 0x4B ; 75 3306e: 08 f0 brcs .+2 ; 0x33072 33070: 46 c0 rjmp .+140 ; 0x330fe 33072: 82 34 cpi r24, 0x42 ; 66 33074: 09 f4 brne .+2 ; 0x33078 33076: 43 c0 rjmp .+134 ; 0x330fe 33078: e0 f5 brcc .+120 ; 0x330f2 3307a: 8a 30 cpi r24, 0x0A ; 10 3307c: 59 f0 breq .+22 ; 0x33094 3307e: 8d 30 cpi r24, 0x0D ; 13 33080: 49 f0 breq .+18 ; 0x33094 } else if (IsCRCSeparator(c)) { rspState = ResponseStates::CRC; return DecodeStatus::NeedMoreData; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; 33082: b0 92 b6 12 sts 0x12B6, r11 ; 0x8012b6 Matched }; /// @returns true when "ok\n" gets detected State Detect(uint8_t c) { // consume old MMU FW's data if any -> avoid confusion of protocol decoder if (ok == 0 && c == 'o') { 33086: a1 10 cpse r10, r1 33088: 05 c1 rjmp .+522 ; 0x33294 3308a: 1f 36 cpi r17, 0x6F ; 111 3308c: 09 f0 breq .+2 ; 0x33090 3308e: fa c3 rjmp .+2036 ; 0x33884 ++ok; 33090: aa 24 eor r10, r10 33092: a3 94 inc r10 OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;) // try to consume as many rx bytes as possible (until a message has been completed) while ((c = uart->read()) >= 0) { ++bytesConsumed; 33094: 4f ef ldi r20, 0xFF ; 255 33096: c4 1a sub r12, r20 33098: d4 0a sbc r13, r20 3309a: 84 e7 ldi r24, 0x74 ; 116 3309c: 92 e1 ldi r25, 0x12 ; 18 3309e: 0f 94 0c a2 call 0x34418 ; 0x34418 int c = -1; OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;) // try to consume as many rx bytes as possible (until a message has been completed) while ((c = uart->read()) >= 0) { 330a2: 97 fd sbrc r25, 7 330a4: 00 c1 rjmp .+512 ; 0x332a6 ++bytesConsumed; RecordReceivedByte(c); 330a6: 18 2f mov r17, r24 array() = default; inline constexpr T *begin() const { return data; } inline constexpr T *end() const { return data + N; } static constexpr uint8_t size() { return N; } inline T &operator[](uint8_t i) { return data[i]; 330a8: 20 91 cf 12 lds r18, 0x12CF ; 0x8012cf 330ac: 30 e0 ldi r19, 0x00 ; 0 void ProtocolLogic::RecordUARTActivity() { lastUARTActivityMs = _millis(); } void ProtocolLogic::RecordReceivedByte(uint8_t c) { lastReceivedBytes[lrb] = c; 330ae: f9 01 movw r30, r18 330b0: ee 56 subi r30, 0x6E ; 110 330b2: fd 4e sbci r31, 0xED ; 237 330b4: 85 a7 std Z+45, r24 ; 0x2d lrb = (lrb + 1) % lastReceivedBytes.size(); 330b6: 79 01 movw r14, r18 330b8: ef ef ldi r30, 0xFF ; 255 330ba: ee 1a sub r14, r30 330bc: fe 0a sbc r15, r30 330be: ff e0 ldi r31, 0x0F ; 15 330c0: ef 22 and r14, r31 330c2: ff 24 eor r15, r15 330c4: 5e 2c mov r5, r14 330c6: e0 92 cf 12 sts 0x12CF, r14 ; 0x8012cf ++i; return i; } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { 330ca: 20 91 b6 12 lds r18, 0x12B6 ; 0x8012b6 330ce: 22 30 cpi r18, 0x02 ; 2 330d0: 09 f4 brne .+2 ; 0x330d4 330d2: 48 c0 rjmp .+144 ; 0x33164 330d4: 08 f0 brcs .+2 ; 0x330d8 330d6: 7b cf rjmp .-266 ; 0x32fce 330d8: 22 23 and r18, r18 330da: 29 f2 breq .-118 ; 0x33066 330dc: 21 30 cpi r18, 0x01 ; 1 330de: 51 f1 breq .+84 ; 0x33134 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 330e0: 1a 30 cpi r17, 0x0A ; 10 330e2: 09 f4 brne .+2 ; 0x330e6 330e4: 8f cf rjmp .-226 ; 0x33004 330e6: 1d 30 cpi r17, 0x0D ; 13 330e8: 09 f4 brne .+2 ; 0x330ec 330ea: 8c cf rjmp .-232 ; 0x33004 default: //case error: if (IsNewLine(c)) { rspState = ResponseStates::RequestCode; return DecodeStatus::MessageCompleted; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; 330ec: 10 92 bc 12 sts 0x12BC, r1 ; 0x8012bc 330f0: ca cf rjmp .-108 ; 0x33086 } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 330f2: 85 34 cpi r24, 0x45 ; 69 330f4: 30 f2 brcs .-116 ; 0x33082 330f6: 87 34 cpi r24, 0x47 ; 71 330f8: 10 f0 brcs .+4 ; 0x330fe 330fa: 88 34 cpi r24, 0x48 ; 72 330fc: 11 f6 brne .-124 ; 0x33082 case 'K': case 'F': case 'f': case 'H': case 'R': responseMsg.request.code = (RequestMsgCodes)c; 330fe: 80 93 b7 12 sts 0x12B7, r24 ; 0x8012b7 responseMsg.request.value = 0; 33102: 10 92 b8 12 sts 0x12B8, r1 ; 0x8012b8 responseMsg.request.value2 = 0; 33106: 10 92 ba 12 sts 0x12BA, r1 ; 0x8012ba 3310a: 10 92 b9 12 sts 0x12B9, r1 ; 0x8012b9 responseMsg.request.crc8 = 0; 3310e: 10 92 bb 12 sts 0x12BB, r1 ; 0x8012bb rspState = ResponseStates::RequestValue; 33112: 90 92 b6 12 sts 0x12B6, r9 ; 0x8012b6 33116: be cf rjmp .-132 ; 0x33094 } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 33118: 89 35 cpi r24, 0x59 ; 89 3311a: 40 f4 brcc .+16 ; 0x3312c 3311c: 87 35 cpi r24, 0x57 ; 87 3311e: 78 f7 brcc .-34 ; 0x330fe 33120: 20 eb ldi r18, 0xB0 ; 176 33122: 28 0f add r18, r24 33124: 26 30 cpi r18, 0x06 ; 6 33126: 08 f0 brcs .+2 ; 0x3312a 33128: ac cf rjmp .-168 ; 0x33082 3312a: e9 cf rjmp .-46 ; 0x330fe 3312c: 86 36 cpi r24, 0x66 ; 102 3312e: 09 f0 breq .+2 ; 0x33132 33130: a8 cf rjmp .-176 ; 0x33082 33132: e5 cf rjmp .-54 ; 0x330fe } static constexpr bool IsCRCSeparator(uint8_t c) { return c == '*'; } static constexpr bool IsHexDigit(uint8_t c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'); 33134: 20 ed ldi r18, 0xD0 ; 208 33136: 28 0f add r18, r24 33138: 2a 30 cpi r18, 0x0A ; 10 3313a: 50 f0 brcs .+20 ; 0x33150 3313c: 2f e9 ldi r18, 0x9F ; 159 3313e: 28 0f add r18, r24 33140: 26 30 cpi r18, 0x06 ; 6 33142: 30 f0 brcs .+12 ; 0x33150 case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; responseMsg.request.value += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (c == ' ') { 33144: 80 32 cpi r24, 0x20 ; 32 33146: 09 f0 breq .+2 ; 0x3314a 33148: 9c cf rjmp .-200 ; 0x33082 rspState = ResponseStates::ParamCode; 3314a: 60 92 b6 12 sts 0x12B6, r6 ; 0x8012b6 3314e: a2 cf rjmp .-188 ; 0x33094 return DecodeStatus::Error; } case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; responseMsg.request.value += Char2Nibble(c); 33150: 0f 94 95 50 call 0x2a12a ; 0x2a12a rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; 33154: 90 91 b8 12 lds r25, 0x12B8 ; 0x8012b8 33158: 92 95 swap r25 3315a: 90 7f andi r25, 0xF0 ; 240 responseMsg.request.value += Char2Nibble(c); 3315c: 89 0f add r24, r25 3315e: 80 93 b8 12 sts 0x12B8, r24 ; 0x8012b8 33162: 98 cf rjmp .-208 ; 0x33094 } else { rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamCode: switch (c) { 33164: 87 34 cpi r24, 0x47 ; 71 33166: 48 f4 brcc .+18 ; 0x3317a 33168: 85 34 cpi r24, 0x45 ; 69 3316a: 58 f4 brcc .+22 ; 0x33182 3316c: 2f eb ldi r18, 0xBF ; 191 3316e: 28 0f add r18, r24 33170: 22 30 cpi r18, 0x02 ; 2 33172: 38 f0 brcs .+14 ; 0x33182 return DecodeStatus::NeedMoreData; } else if (IsCRCSeparator(c)) { rspState = ResponseStates::CRC; return DecodeStatus::NeedMoreData; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; 33174: 10 92 bc 12 sts 0x12BC, r1 ; 0x8012bc 33178: 84 cf rjmp .-248 ; 0x33082 } else { rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamCode: switch (c) { 3317a: 80 35 cpi r24, 0x50 ; 80 3317c: 11 f0 breq .+4 ; 0x33182 3317e: 82 35 cpi r24, 0x52 ; 82 33180: c9 f7 brne .-14 ; 0x33174 case 'E': case 'F': case 'A': case 'R': case 'B': rspState = ResponseStates::ParamValue; 33182: 80 92 b6 12 sts 0x12B6, r8 ; 0x8012b6 responseMsg.paramCode = (ResponseMsgParamCodes)c; 33186: 80 93 bc 12 sts 0x12BC, r24 ; 0x8012bc responseMsg.paramValue = 0; 3318a: 10 92 be 12 sts 0x12BE, r1 ; 0x8012be 3318e: 10 92 bd 12 sts 0x12BD, r1 ; 0x8012bd 33192: 80 cf rjmp .-256 ; 0x33094 33194: 20 ed ldi r18, 0xD0 ; 208 33196: 28 0f add r18, r24 33198: 2a 30 cpi r18, 0x0A ; 10 3319a: 48 f0 brcs .+18 ; 0x331ae 3319c: 2f e9 ldi r18, 0x9F ; 159 3319e: 28 0f add r18, r24 331a0: 26 30 cpi r18, 0x06 ; 6 331a2: 28 f0 brcs .+10 ; 0x331ae case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; responseMsg.paramValue += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (IsCRCSeparator(c)) { 331a4: 8a 32 cpi r24, 0x2A ; 42 331a6: 31 f7 brne .-52 ; 0x33174 rspState = ResponseStates::CRC; 331a8: 70 92 b6 12 sts 0x12B6, r7 ; 0x8012b6 331ac: 73 cf rjmp .-282 ; 0x33094 return DecodeStatus::Error; } case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; responseMsg.paramValue += Char2Nibble(c); 331ae: 0f 94 95 50 call 0x2a12a ; 0x2a12a rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; 331b2: 20 91 bd 12 lds r18, 0x12BD ; 0x8012bd 331b6: 30 91 be 12 lds r19, 0x12BE ; 0x8012be 331ba: 44 e0 ldi r20, 0x04 ; 4 331bc: 22 0f add r18, r18 331be: 33 1f adc r19, r19 331c0: 4a 95 dec r20 331c2: e1 f7 brne .-8 ; 0x331bc responseMsg.paramValue += Char2Nibble(c); 331c4: 82 0f add r24, r18 331c6: 93 2f mov r25, r19 331c8: 91 1d adc r25, r1 331ca: 90 93 be 12 sts 0x12BE, r25 ; 0x8012be 331ce: 80 93 bd 12 sts 0x12BD, r24 ; 0x8012bd 331d2: 60 cf rjmp .-320 ; 0x33094 return DecodeStatus::Error; } case ResponseStates::CRC: if (IsHexDigit(c)) { responseMsg.request.crc8 <<= 4U; responseMsg.request.crc8 += Char2Nibble(c); 331d4: 0f 94 95 50 call 0x2a12a ; 0x2a12a rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::CRC: if (IsHexDigit(c)) { responseMsg.request.crc8 <<= 4U; 331d8: 90 91 bb 12 lds r25, 0x12BB ; 0x8012bb 331dc: 92 95 swap r25 331de: 90 7f andi r25, 0xF0 ; 240 responseMsg.request.crc8 += Char2Nibble(c); 331e0: 89 0f add r24, r25 331e2: 80 93 bb 12 sts 0x12BB, r24 ; 0x8012bb 331e6: 56 cf rjmp .-340 ; 0x33094 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 331e8: 8d 30 cpi r24, 0x0D ; 13 331ea: 21 f6 brne .-120 ; 0x33174 331ec: 03 cf rjmp .-506 ; 0x32ff4 if (b < 32 || b > 127) { b = '.'; } *dst++ = b; } *dst = 0; // terminate properly 331ee: e8 0e add r14, r24 331f0: f9 1e adc r15, r25 331f2: f7 01 movw r30, r14 331f4: 10 82 st Z, r1 lrb = 0; // reset the input buffer index in case of a clean message 331f6: 10 92 cf 12 sts 0x12CF, r1 ; 0x8012cf } void ProtocolLogic::LogResponse() { char lrb[lastReceivedBytes.size()]; FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); 331fa: 8e ec ldi r24, 0xCE ; 206 331fc: 91 ea ldi r25, 0xA1 ; 161 331fe: 0e 94 c4 7a call 0xf588 ; 0xf588 33202: 88 ec ldi r24, 0xC8 ; 200 33204: 91 ea ldi r25, 0xA1 ; 161 33206: 0e 94 c4 7a call 0xf588 ; 0xf588 3320a: ce 01 movw r24, r28 3320c: 01 96 adiw r24, 0x01 ; 1 3320e: 0e 94 a1 87 call 0x10f42 ; 0x10f42 switch (protocol.DecodeResponse(c)) { case DecodeStatus::MessageCompleted: rsp = protocol.GetResponseMsg(); LogResponse(); // @@TODO reset direction of communication RecordUARTActivity(); // something has happened on the UART, update the timeout record 33212: 0f 94 52 56 call 0x2aca4 ; 0x2aca4 if (auto expmsg = ExpectingMessage(); expmsg != MessageReady) { // this whole statement takes 12B return expmsg; } // process message switch (currentScope) { 33216: 80 91 94 12 lds r24, 0x1294 ; 0x801294 3321a: 81 30 cpi r24, 0x01 ; 1 3321c: 09 f4 brne .+2 ; 0x33220 3321e: 74 c0 rjmp .+232 ; 0x33308 33220: 08 f4 brcc .+2 ; 0x33224 33222: c5 ce rjmp .-630 ; 0x32fae 33224: 83 30 cpi r24, 0x03 ; 3 33226: 09 f4 brne .+2 ; 0x3322a 33228: d1 c0 rjmp .+418 ; 0x333cc 3322a: 84 30 cpi r24, 0x04 ; 4 3322c: 09 f0 breq .+2 ; 0x33230 3322e: 4f ce rjmp .-866 ; 0x32ece return ProtocolError; } } StepStatus ProtocolLogic::CommandStep() { switch (scopeState) { 33230: 80 91 95 12 lds r24, 0x1295 ; 0x801295 33234: 86 30 cpi r24, 0x06 ; 6 33236: 09 f4 brne .+2 ; 0x3323a 33238: 6c c1 rjmp .+728 ; 0x33512 3323a: 08 f0 brcs .+2 ; 0x3323e 3323c: 93 c1 rjmp .+806 ; 0x33564 3323e: 84 30 cpi r24, 0x04 ; 4 33240: 09 f4 brne .+2 ; 0x33244 33242: 09 c1 rjmp .+530 ; 0x33456 33244: 85 30 cpi r24, 0x05 ; 5 33246: 09 f0 breq .+2 ; 0x3324a 33248: cc c0 rjmp .+408 ; 0x333e2 case ScopeState::CommandSent: { switch (rsp.paramCode) { // the response should be either accepted or rejected 3324a: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 3324e: 81 34 cpi r24, 0x41 ; 65 33250: 09 f4 brne .+2 ; 0x33254 33252: 96 c1 rjmp .+812 ; 0x33580 33254: 82 35 cpi r24, 0x52 ; 82 33256: 09 f0 breq .+2 ; 0x3325a 33258: c4 c0 rjmp .+392 ; 0x333e2 errorCode = ErrorCode::RUNNING; scopeState = ScopeState::Wait; break; case ResponseMsgParamCodes::Rejected: // rejected - should normally not happen, but report the error up progressCode = ProgressCode::OK; 3325a: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 errorCode = ErrorCode::PROTOCOL_ERROR; 3325e: 8d e2 ldi r24, 0x2D ; 45 33260: 90 e8 ldi r25, 0x80 ; 128 33262: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 33266: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 } break; case CommandRejected: // we have to repeat it - that's the only thing we can do // no change in state // @@TODO wait until Q0 returns command in progress finished, then we can send this one LogError(PSTR("Command rejected")); 3326a: 8a ee ldi r24, 0xEA ; 234 3326c: 9e e9 ldi r25, 0x9E ; 158 3326e: 0f 94 6f 56 call 0x2acde ; 0x2acde void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; } void ProtocolLogic::CommandRestart() { scopeState = ScopeState::CommandSent; 33272: 85 e0 ldi r24, 0x05 ; 5 33274: 80 93 95 12 sts 0x1295, r24 ; 0x801295 SendMsg(rq); 33278: 40 91 97 12 lds r20, 0x1297 ; 0x801297 3327c: 50 91 98 12 lds r21, 0x1298 ; 0x801298 33280: 60 91 99 12 lds r22, 0x1299 ; 0x801299 33284: 70 91 9a 12 lds r23, 0x129A ; 0x80129a 33288: 80 91 9b 12 lds r24, 0x129B ; 0x80129b 3328c: 0f 94 58 57 call 0x2aeb0 ; 0x2aeb0 33290: 16 e0 ldi r17, 0x06 ; 6 33292: 07 c1 rjmp .+526 ; 0x334a2 State Detect(uint8_t c) { // consume old MMU FW's data if any -> avoid confusion of protocol decoder if (ok == 0 && c == 'o') { ++ok; return State::MatchingPart; } else if (ok == 1 && c == 'k') { 33294: 1b 36 cpi r17, 0x6B ; 107 33296: 09 f0 breq .+2 ; 0x3329a 33298: f5 c2 rjmp .+1514 ; 0x33884 LogError(PSTR("Command Error")); // we shall probably transfer into the Idle state and await further instructions from the upper layer // Idle state may solve the problem of keeping up the heart beat running break; case VersionMismatch: LogError(PSTR("Version mismatch")); 3329a: 8b ec ldi r24, 0xCB ; 203 3329c: 9e e9 ldi r25, 0x9E ; 158 3329e: 0f 94 6f 56 call 0x2acde ; 0x2acde 332a2: 18 e0 ldi r17, 0x08 ; 8 332a4: fe c0 rjmp .+508 ; 0x334a2 default: RecordUARTActivity(); // something has happened on the UART, update the timeout record return ProtocolError; } } if (bytesConsumed != 0) { 332a6: cd 28 or r12, r13 332a8: 19 f0 breq .+6 ; 0x332b0 RecordUARTActivity(); // something has happened on the UART, update the timeout record 332aa: 0f 94 52 56 call 0x2aca4 ; 0x2aca4 332ae: 7f ce rjmp .-770 ; 0x32fae IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 332b0: 0f 94 f0 0d call 0x21be0 ; 0x21be0 332b4: ab 01 movw r20, r22 332b6: bc 01 movw r22, r24 332b8: 80 91 a1 12 lds r24, 0x12A1 ; 0x8012a1 332bc: 90 91 a2 12 lds r25, 0x12A2 ; 0x8012a2 332c0: a0 91 a3 12 lds r26, 0x12A3 ; 0x8012a3 332c4: b0 91 a4 12 lds r27, 0x12A4 ; 0x8012a4 332c8: 80 53 subi r24, 0x30 ; 48 332ca: 98 4f sbci r25, 0xF8 ; 248 332cc: af 4f sbci r26, 0xFF ; 255 332ce: bf 4f sbci r27, 0xFF ; 255 } } if (bytesConsumed != 0) { RecordUARTActivity(); // something has happened on the UART, update the timeout record return Processing; // consumed some bytes, but message still not ready } else if (Elapsed(linkLayerTimeout) && currentScope != Scope::Stopped) { 332d0: 48 17 cp r20, r24 332d2: 59 07 cpc r21, r25 332d4: 6a 07 cpc r22, r26 332d6: 7b 07 cpc r23, r27 332d8: 08 f4 brcc .+2 ; 0x332dc 332da: 69 ce rjmp .-814 ; 0x32fae 332dc: 80 91 94 12 lds r24, 0x1294 ; 0x801294 332e0: 88 23 and r24, r24 332e2: 09 f4 brne .+2 ; 0x332e6 332e4: 64 ce rjmp .-824 ; 0x32fae rqState = RequestStates::Code; } /// resets the internal response decoding state (typically after an error) void ResetResponseDecoder() { rspState = ResponseStates::RequestCode; 332e6: 10 92 b6 12 sts 0x12B6, r1 ; 0x8012b6 initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 332ea: 81 e0 ldi r24, 0x01 ; 1 332ec: 80 93 af 12 sts 0x12AF, r24 ; 0x8012af currentScope = Scope::StartSeq; 332f0: 80 93 94 12 sts 0x1294, r24 ; 0x801294 LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 332f4: 86 e0 ldi r24, 0x06 ; 6 332f6: 80 93 96 12 sts 0x1296, r24 ; 0x801296 SendVersion(0); 332fa: 80 e0 ldi r24, 0x00 ; 0 332fc: 0f 94 5f 95 call 0x32abe ; 0x32abe StepStatus ProtocolLogic::HandleCommunicationTimeout() { uart->flush(); // clear the output buffer protocol.ResetResponseDecoder(); Start(); return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); 33300: 64 e0 ldi r22, 0x04 ; 4 33302: 83 ea ldi r24, 0xA3 ; 163 33304: 9e e9 ldi r25, 0x9E ; 158 33306: 79 c0 rjmp .+242 ; 0x333fa return Finished; } StepStatus ProtocolLogic::StartSeqStep() { // solve initial handshake switch (scopeState) { 33308: 10 91 95 12 lds r17, 0x1295 ; 0x801295 3330c: 13 30 cpi r17, 0x03 ; 3 3330e: b1 f1 breq .+108 ; 0x3337c 33310: 60 f0 brcs .+24 ; 0x3332a 33312: 16 30 cpi r17, 0x06 ; 6 33314: 09 f4 brne .+2 ; 0x33318 33316: 50 c0 rjmp .+160 ; 0x333b8 33318: 19 30 cpi r17, 0x09 ; 9 3331a: 09 f0 breq .+2 ; 0x3331e 3331c: be cf rjmp .-132 ; 0x3329a // Start General Interrogation after line up - initial parametrization is started StartWritingInitRegisters(); } return Processing; case ScopeState::WritingInitRegisters: if (ProcessWritingInitRegister()) { 3331e: 0f 94 82 58 call 0x2b104 ; 0x2b104 33322: 88 23 and r24, r24 33324: 09 f4 brne .+2 ; 0x33328 33326: 43 ce rjmp .-890 ; 0x32fae 33328: 40 ce rjmp .-896 ; 0x32faa void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; } StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) { if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) { 3332a: 80 91 a7 12 lds r24, 0x12A7 ; 0x8012a7 3332e: 83 35 cpi r24, 0x53 ; 83 33330: 21 f4 brne .+8 ; 0x3333a 33332: 80 91 a8 12 lds r24, 0x12A8 ; 0x8012a8 33336: 18 17 cp r17, r24 33338: 11 f0 breq .+4 ; 0x3333e mmuFwVersion[stage] = rsp.paramValue; if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) { if (--retries == 0) { return VersionMismatch; } else { SendVersion(stage); 3333a: 81 2f mov r24, r17 3333c: fe cd rjmp .-1028 ; 0x32f3a StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) { if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) { // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0? SendVersion(stage); } else { mmuFwVersion[stage] = rsp.paramValue; 3333e: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 33342: e1 2f mov r30, r17 33344: f0 e0 ldi r31, 0x00 ; 0 33346: df 01 movw r26, r30 33348: af 51 subi r26, 0x1F ; 31 3334a: bd 4e sbci r27, 0xED ; 237 3334c: 8c 93 st X, r24 if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) { 3334e: e8 53 subi r30, 0x38 ; 56 33350: f1 46 sbci r31, 0x61 ; 97 33352: e4 91 lpm r30, Z 33354: 8e 17 cp r24, r30 33356: 41 f0 breq .+16 ; 0x33368 if (--retries == 0) { 33358: 80 91 96 12 lds r24, 0x1296 ; 0x801296 3335c: 81 50 subi r24, 0x01 ; 1 3335e: 80 93 96 12 sts 0x1296, r24 ; 0x801296 33362: 81 11 cpse r24, r1 33364: ea cf rjmp .-44 ; 0x3333a 33366: 99 cf rjmp .-206 ; 0x3329a SERIAL_ECHOLNPGM("ResetRetryAttempts"); retryAttempts = MAX_RETRIES; } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 33368: 81 e6 ldi r24, 0x61 ; 97 3336a: 91 ea ldi r25, 0xA1 ; 161 3336c: 0e 94 bd 7c call 0xf97a ; 0xf97a /// @returns the initial cause which started this drop out event inline StepStatus InitialCause() const { return cause; } /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2) inline void Reset() { occurrences = maxOccurrences; } 33370: 8a e0 ldi r24, 0x0A ; 10 33372: 80 93 a6 12 sts 0x12A6, r24 ; 0x8012a6 } else { SendVersion(stage); } } else { ResetCommunicationTimeoutAttempts(); // got a meaningful response from the MMU, stop data layer timeout tracking SendVersion(stage + 1); 33376: 81 e0 ldi r24, 0x01 ; 1 33378: 81 0f add r24, r17 3337a: df cd rjmp .-1090 ; 0x32f3a case ScopeState::S0Sent: // received response to S0 - major case ScopeState::S1Sent: // received response to S1 - minor case ScopeState::S2Sent: // received response to S2 - minor return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent); case ScopeState::S3Sent: // received response to S3 - revision if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) { 3337c: 80 91 a7 12 lds r24, 0x12A7 ; 0x8012a7 33380: 83 35 cpi r24, 0x53 ; 83 33382: 21 f4 brne .+8 ; 0x3338c 33384: 80 91 a8 12 lds r24, 0x12A8 ; 0x8012a8 33388: 83 30 cpi r24, 0x03 ; 3 3338a: 11 f0 breq .+4 ; 0x33390 // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0? SendVersion(3); 3338c: 83 e0 ldi r24, 0x03 ; 3 3338e: d5 cd rjmp .-1110 ; 0x32f3a } else { mmuFwVersionBuild = rsp.paramValue; // just register the build number 33390: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 33394: 90 91 ae 12 lds r25, 0x12AE ; 0x8012ae 33398: 90 93 e5 12 sts 0x12E5, r25 ; 0x8012e5 3339c: 80 93 e4 12 sts 0x12E4, r24 ; 0x8012e4 } return ScopeState::Reading16bitRegisters; } void ProtocolLogic::StartWritingInitRegisters() { regIndex = 0; 333a0: 10 92 e0 12 sts 0x12E0, r1 ; 0x8012e0 SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); 333a4: ef e5 ldi r30, 0x5F ; 95 333a6: f1 ea ldi r31, 0xA1 ; 161 333a8: 84 91 lpm r24, Z 333aa: 60 91 de 12 lds r22, 0x12DE ; 0x8012de 333ae: 70 e0 ldi r23, 0x00 ; 0 333b0: 49 e0 ldi r20, 0x09 ; 9 333b2: 0f 94 c3 57 call 0x2af86 ; 0x2af86 333b6: fb cd rjmp .-1034 ; 0x32fae currentScope = Scope::Idle; IdleRestart(); } void ProtocolLogic::SwitchFromStartToIdle() { state = State::Running; 333b8: 82 e0 ldi r24, 0x02 ; 2 333ba: 80 93 af 12 sts 0x12AF, r24 ; 0x8012af currentScope = Scope::Idle; 333be: 83 e0 ldi r24, 0x03 ; 3 333c0: 80 93 94 12 sts 0x1294, r24 ; 0x801294 scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 333c4: 82 e8 ldi r24, 0x82 ; 130 333c6: 80 93 95 12 sts 0x1295, r24 ; 0x801295 333ca: d2 cd rjmp .-1116 ; 0x32f70 } return Finished; } StepStatus ProtocolLogic::IdleStep() { switch (scopeState) { 333cc: 80 91 95 12 lds r24, 0x1295 ; 0x801295 333d0: 88 30 cpi r24, 0x08 ; 8 333d2: 09 f4 brne .+2 ; 0x333d6 333d4: b7 c0 rjmp .+366 ; 0x33544 333d6: a8 f4 brcc .+42 ; 0x33402 333d8: 84 30 cpi r24, 0x04 ; 4 333da: d9 f0 breq .+54 ; 0x33412 333dc: 87 30 cpi r24, 0x07 ; 7 333de: 09 f4 brne .+2 ; 0x333e2 333e0: ae c0 rjmp .+348 ; 0x3353e return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); } StepStatus ProtocolLogic::HandleProtocolError() { uart->flush(); // clear the output buffer state = State::InitSequence; 333e2: 81 e0 ldi r24, 0x01 ; 1 333e4: 80 93 af 12 sts 0x12AF, r24 ; 0x8012af currentScope = Scope::DelayedRestart; 333e8: 82 e0 ldi r24, 0x02 ; 2 333ea: 80 93 94 12 sts 0x1294, r24 ; 0x801294 retries = maxRetries; SendVersion(0); } void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; 333ee: 83 e8 ldi r24, 0x83 ; 131 333f0: 80 93 95 12 sts 0x1295, r24 ; 0x801295 StepStatus ProtocolLogic::HandleProtocolError() { uart->flush(); // clear the output buffer state = State::InitSequence; currentScope = Scope::DelayedRestart; DelayedRestartRestart(); return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError); 333f4: 65 e0 ldi r22, 0x05 ; 5 333f6: 89 eb ldi r24, 0xB9 ; 185 333f8: 9e e9 ldi r25, 0x9E ; 158 StepStatus ProtocolLogic::HandleCommunicationTimeout() { uart->flush(); // clear the output buffer protocol.ResetResponseDecoder(); Start(); return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); 333fa: 0f 94 e0 56 call 0x2adc0 ; 0x2adc0 333fe: 18 2f mov r17, r24 33400: 50 c0 rjmp .+160 ; 0x334a2 } return Finished; } StepStatus ProtocolLogic::IdleStep() { switch (scopeState) { 33402: 8a 30 cpi r24, 0x0A ; 10 33404: 09 f4 brne .+2 ; 0x33408 33406: a7 c0 rjmp .+334 ; 0x33556 33408: 60 f3 brcs .-40 ; 0x333e2 3340a: 8d 30 cpi r24, 0x0D ; 13 3340c: 08 f4 brcc .+2 ; 0x33410 3340e: 5f cd rjmp .-1346 ; 0x32ece 33410: e8 cf rjmp .-48 ; 0x333e2 case ScopeState::QuerySent: // check UART // If we are accidentally in Idle and we receive something like "T0 P1" - that means the communication dropped out while a command was in progress. // That causes no issues here, we just need to switch to Command processing and continue there from now on. // The usual response in this case should be some command and "F" - finished - that confirms we are in an Idle state even on the MMU side. switch (rsp.request.code) { 33412: 80 91 a7 12 lds r24, 0x12A7 ; 0x8012a7 33416: 8e 34 cpi r24, 0x4E ; 78 33418: 60 f5 brcc .+88 ; 0x33472 3341a: 8b 34 cpi r24, 0x4B ; 75 3341c: 10 f4 brcc .+4 ; 0x33422 3341e: 85 34 cpi r24, 0x45 ; 69 33420: 01 f7 brne .-64 ; 0x333e2 case RequestMsgCodes::Eject: case RequestMsgCodes::Load: case RequestMsgCodes::Mode: case RequestMsgCodes::Tool: case RequestMsgCodes::Unload: if (rsp.paramCode != ResponseMsgParamCodes::Finished) { 33422: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 33426: 86 34 cpi r24, 0x46 ; 70 33428: 09 f4 brne .+2 ; 0x3342c 3342a: 73 c0 rjmp .+230 ; 0x33512 return true; } } StepStatus ProtocolLogic::SwitchFromIdleToCommand() { currentScope = Scope::Command; 3342c: 84 e0 ldi r24, 0x04 ; 4 3342e: 80 93 94 12 sts 0x1294, r24 ; 0x801294 33432: 85 e0 ldi r24, 0x05 ; 5 33434: e7 ea ldi r30, 0xA7 ; 167 33436: f2 e1 ldi r31, 0x12 ; 18 33438: de 01 movw r26, r28 3343a: 11 96 adiw r26, 0x01 ; 1 3343c: 01 90 ld r0, Z+ 3343e: 0d 92 st X+, r0 33440: 8a 95 dec r24 33442: e1 f7 brne .-8 ; 0x3343c StepStatus StoppedStep() { return Processing; } StepStatus ProcessCommandQueryResponse(); inline void SetRequestMsg(RequestMsg msg) { rq = msg; 33444: 85 e0 ldi r24, 0x05 ; 5 33446: fe 01 movw r30, r28 33448: 31 96 adiw r30, 0x01 ; 1 3344a: a7 e9 ldi r26, 0x97 ; 151 3344c: b2 e1 ldi r27, 0x12 ; 18 3344e: 01 90 ld r0, Z+ 33450: 0d 92 st X+, r0 33452: 8a 95 dec r24 33454: e1 f7 brne .-8 ; 0x3344e default: return ProtocolError; } } break; case ScopeState::QuerySent: return ProcessCommandQueryResponse(); 33456: 0f 94 14 96 call 0x32c28 ; 0x32c28 3345a: 18 2f mov r17, r24 StepStatus ProtocolLogic::Step() { if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately ActivatePlannedRequest(); } auto currentStatus = ScopeStep(); switch (currentStatus) { 3345c: 85 30 cpi r24, 0x05 ; 5 3345e: 09 f2 breq .-126 ; 0x333e2 33460: 08 f0 brcs .+2 ; 0x33464 33462: 9c c0 rjmp .+312 ; 0x3359c 33464: 82 30 cpi r24, 0x02 ; 2 33466: 09 f4 brne .+2 ; 0x3346a 33468: 32 cd rjmp .-1436 ; 0x32ece 3346a: 84 30 cpi r24, 0x04 ; 4 3346c: 09 f4 brne .+2 ; 0x33470 3346e: 3b cf rjmp .-394 ; 0x332e6 33470: 18 c0 rjmp .+48 ; 0x334a2 switch (scopeState) { case ScopeState::QuerySent: // check UART // If we are accidentally in Idle and we receive something like "T0 P1" - that means the communication dropped out while a command was in progress. // That causes no issues here, we just need to switch to Command processing and continue there from now on. // The usual response in this case should be some command and "F" - finished - that confirms we are in an Idle state even on the MMU side. switch (rsp.request.code) { 33472: 84 35 cpi r24, 0x54 ; 84 33474: 08 f4 brcc .+2 ; 0x33478 33476: b5 cf rjmp .-150 ; 0x333e2 33478: 86 35 cpi r24, 0x56 ; 86 3347a: 98 f2 brcs .-90 ; 0x33422 3347c: 88 35 cpi r24, 0x58 ; 88 3347e: 09 f0 breq .+2 ; 0x33482 33480: b0 cf rjmp .-160 ; 0x333e2 break; case RequestMsgCodes::Reset: // this one is kind of special // we do not transfer to any "running" command (i.e. we stay in Idle), // but in case there is an error reported we must make sure it gets propagated switch (rsp.paramCode) { 33482: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 33486: 86 34 cpi r24, 0x46 ; 70 33488: 89 f1 breq .+98 ; 0x334ec 3348a: 80 35 cpi r24, 0x50 ; 80 3348c: c1 f1 breq .+112 ; 0x334fe 3348e: 82 34 cpi r24, 0x42 ; 66 33490: 09 f0 breq .+2 ; 0x33494 33492: 42 c0 rjmp .+132 ; 0x33518 case ResponseMsgParamCodes::Button: // The user pushed a button on the MMU. Save it, do what we need to do // to prepare, then pass it back to the MMU so it can work its magic. buttonCode = static_cast(rsp.paramValue); 33494: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 33498: 80 93 d5 12 sts 0x12D5, r24 ; 0x8012d5 StartReading8bitRegisters(); 3349c: 0f 94 54 94 call 0x328a8 ; 0x328a8 return ButtonPushed; 334a0: 1b e0 ldi r17, 0x0B ; 11 334a2: 80 91 92 12 lds r24, 0x1292 ; 0x801292 334a6: 90 91 93 12 lds r25, 0x1293 ; 0x801293 break; default: break; } // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; 334aa: 81 30 cpi r24, 0x01 ; 1 334ac: 91 05 cpc r25, r1 334ae: 09 f0 breq .+2 ; 0x334b2 334b0: ec c1 rjmp .+984 ; 0x3388a const StepStatus ss = logic.Step(); switch (ss) { 334b2: 12 30 cpi r17, 0x02 ; 2 334b4: 09 f4 brne .+2 ; 0x334b8 334b6: 90 c0 rjmp .+288 ; 0x335d8 334b8: 08 f0 brcs .+2 ; 0x334bc 334ba: 7d c0 rjmp .+250 ; 0x335b6 334bc: 11 23 and r17, r17 334be: 09 f4 brne .+2 ; 0x334c2 334c0: 16 c1 rjmp .+556 ; 0x336ee case Interrupted: // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { 334c2: 00 23 and r16, r16 334c4: 09 f4 brne .+2 ; 0x334c8 334c6: e2 c0 rjmp .+452 ; 0x3368c switch (ss) { 334c8: 17 30 cpi r17, 0x07 ; 7 334ca: 09 f4 brne .+2 ; 0x334ce 334cc: c2 c1 rjmp .+900 ; 0x33852 334ce: 08 f0 brcs .+2 ; 0x334d2 334d0: b6 c1 rjmp .+876 ; 0x3383e 334d2: 14 30 cpi r17, 0x04 ; 4 334d4: 09 f4 brne .+2 ; 0x334d8 334d6: c5 c1 rjmp .+906 ; 0x33862 334d8: 15 30 cpi r17, 0x05 ; 5 334da: 09 f0 breq .+2 ; 0x334de 334dc: d7 c0 rjmp .+430 ; 0x3368c state = xState::Connecting; ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter); break; case ProtocolError: state = xState::Connecting; 334de: 82 e0 ldi r24, 0x02 ; 2 334e0: 80 93 01 13 sts 0x1301, r24 ; 0x801301 ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); 334e4: 60 e0 ldi r22, 0x00 ; 0 334e6: 8d e2 ldi r24, 0x2D ; 45 334e8: 90 e8 ldi r25, 0x80 ; 128 334ea: b8 c1 rjmp .+880 ; 0x3385c // to prepare, then pass it back to the MMU so it can work its magic. buttonCode = static_cast(rsp.paramValue); StartReading8bitRegisters(); return ButtonPushed; case ResponseMsgParamCodes::Finished: if (ReqMsg().code != RequestMsgCodes::unknown) { 334ec: 80 91 97 12 lds r24, 0x1297 ; 0x801297 334f0: 88 23 and r24, r24 334f2: 29 f0 breq .+10 ; 0x334fe scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 334f4: 82 e8 ldi r24, 0x82 ; 130 334f6: 80 93 95 12 sts 0x1295, r24 ; 0x801295 case ResponseMsgParamCodes::Finished: if (ReqMsg().code != RequestMsgCodes::unknown) { // got reset while doing some other command - the originally issued command was interrupted! // this must be solved by the upper layer, protocol logic doesn't have all the context (like unload before trying again) IdleRestart(); return Interrupted; 334fa: 13 e0 ldi r17, 0x03 ; 3 334fc: d2 cf rjmp .-92 ; 0x334a2 } [[fallthrough]]; case ResponseMsgParamCodes::Processing: // @@TODO we may actually use this branch to report progress of manual operation on the MMU // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector progressCode = static_cast(rsp.paramValue); 334fe: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 33502: 80 93 d4 12 sts 0x12D4, r24 ; 0x8012d4 errorCode = ErrorCode::OK; 33506: 81 e0 ldi r24, 0x01 ; 1 33508: 90 e0 ldi r25, 0x00 ; 0 3350a: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 3350e: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 } } break; case ScopeState::QuerySent: return ProcessCommandQueryResponse(); case ScopeState::FilamentSensorStateSent: StartReading8bitRegisters(); 33512: 0f 94 54 94 call 0x328a8 ; 0x328a8 33516: 4b cd rjmp .-1386 ; 0x32fae // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector progressCode = static_cast(rsp.paramValue); errorCode = ErrorCode::OK; break; default: progressCode = ProgressCode::ERRWaitingForUser; 33518: 8c e0 ldi r24, 0x0C ; 12 3351a: 80 93 d4 12 sts 0x12D4, r24 ; 0x8012d4 errorCode = static_cast(rsp.paramValue); 3351e: 80 91 ad 12 lds r24, 0x12AD ; 0x8012ad 33522: 90 91 ae 12 lds r25, 0x12AE ; 0x8012ae 33526: 90 93 d3 12 sts 0x12D3, r25 ; 0x8012d3 3352a: 80 93 d2 12 sts 0x12D2, r24 ; 0x8012d2 StartReading8bitRegisters(); // continue Idle state without restarting the communication 3352e: 0f 94 54 94 call 0x328a8 ; 0x328a8 // @@TODO wait until Q0 returns command in progress finished, then we can send this one LogError(PSTR("Command rejected")); CommandRestart(); break; case CommandError: LogError(PSTR("Command Error")); 33532: 8c ed ldi r24, 0xDC ; 220 33534: 9e e9 ldi r25, 0x9E ; 158 33536: 0f 94 6f 56 call 0x2acde ; 0x2acde 3353a: 17 e0 ldi r17, 0x07 ; 7 3353c: b2 cf rjmp .-156 ; 0x334a2 return ProtocolError; } StartReading8bitRegisters(); return Processing; case ScopeState::Reading8bitRegisters: ProcessRead8bitRegister(); 3353e: 0f 94 78 94 call 0x328f0 ; 0x328f0 33542: 35 cd rjmp .-1430 ; 0x32fae return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Ready); 33544: 82 e8 ldi r24, 0x82 ; 130 33546: 0f 94 5c 94 call 0x328b8 ; 0x328b8 3354a: 80 93 95 12 sts 0x1295, r24 ; 0x801295 return scopeState == ScopeState::Ready ? Finished : Processing; 3354e: 82 38 cpi r24, 0x82 ; 130 33550: 09 f0 breq .+2 ; 0x33554 33552: 2d cd rjmp .-1446 ; 0x32fae 33554: bc cc rjmp .-1672 ; 0x32ece case ScopeState::ButtonSent: if (rsp.paramCode == ResponseMsgParamCodes::Accepted) { 33556: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 3355a: 81 34 cpi r24, 0x41 ; 65 3355c: d1 f6 brne .-76 ; 0x33512 // Button was accepted, decrement the retry. DecrementRetryAttempts(); 3355e: 0f 94 5d 56 call 0x2acba ; 0x2acba 33562: d7 cf rjmp .-82 ; 0x33512 return ProtocolError; } } StepStatus ProtocolLogic::CommandStep() { switch (scopeState) { 33564: 88 30 cpi r24, 0x08 ; 8 33566: b1 f0 breq .+44 ; 0x33594 33568: 50 f3 brcs .-44 ; 0x3353e 3356a: 8a 30 cpi r24, 0x0A ; 10 3356c: 09 f0 breq .+2 ; 0x33570 3356e: 39 cf rjmp .-398 ; 0x333e2 return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Wait); return Processing; case ScopeState::ButtonSent: if (rsp.paramCode == ResponseMsgParamCodes::Accepted) { 33570: 80 91 ac 12 lds r24, 0x12AC ; 0x8012ac 33574: 81 34 cpi r24, 0x41 ; 65 33576: 09 f0 breq .+2 ; 0x3357a 33578: 18 cd rjmp .-1488 ; 0x32faa // Button was accepted, decrement the retry. DecrementRetryAttempts(); 3357a: 0f 94 5d 56 call 0x2acba ; 0x2acba 3357e: 15 cd rjmp .-1494 ; 0x32faa StepStatus ProtocolLogic::CommandStep() { switch (scopeState) { case ScopeState::CommandSent: { switch (rsp.paramCode) { // the response should be either accepted or rejected case ResponseMsgParamCodes::Accepted: progressCode = ProgressCode::OK; 33580: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 errorCode = ErrorCode::RUNNING; 33584: 10 92 d3 12 sts 0x12D3, r1 ; 0x8012d3 33588: 10 92 d2 12 sts 0x12D2, r1 ; 0x8012d2 scopeState = ScopeState::Wait; 3358c: 81 e8 ldi r24, 0x81 ; 129 return Processing; case ScopeState::Reading8bitRegisters: ProcessRead8bitRegister(); return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Wait); 3358e: 80 93 95 12 sts 0x1295, r24 ; 0x801295 33592: 0d cd rjmp .-1510 ; 0x32fae 33594: 81 e8 ldi r24, 0x81 ; 129 33596: 0f 94 5c 94 call 0x328b8 ; 0x328b8 3359a: f9 cf rjmp .-14 ; 0x3358e StepStatus ProtocolLogic::Step() { if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately ActivatePlannedRequest(); } auto currentStatus = ScopeStep(); switch (currentStatus) { 3359c: 87 30 cpi r24, 0x07 ; 7 3359e: 49 f2 breq .-110 ; 0x33532 335a0: 08 f4 brcc .+2 ; 0x335a4 335a2: 63 ce rjmp .-826 ; 0x3326a 335a4: 88 30 cpi r24, 0x08 ; 8 335a6: 09 f4 brne .+2 ; 0x335aa 335a8: 78 ce rjmp .-784 ; 0x3329a 335aa: 7b cf rjmp .-266 ; 0x334a2 // We are ok, switching to Idle if there is no potential next request planned. // But the trouble is we must report a finished command if the previous command has just been finished // i.e. only try to find some planned command if we just finished the Idle cycle if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle SwitchToIdle(); } else if (ExpectsResponse()) { 335ac: 80 91 95 12 lds r24, 0x1295 ; 0x801295 335b0: 87 fd sbrc r24, 7 335b2: 9a cc rjmp .-1740 ; 0x32ee8 335b4: fc cc rjmp .-1544 ; 0x32fae StepStatus MMU2::LogicStep(bool reportErrors) { // Process any buttons before proceeding with another MMU Query CheckUserInput(); const StepStatus ss = logic.Step(); switch (ss) { 335b6: 13 30 cpi r17, 0x03 ; 3 335b8: 09 f4 brne .+2 ; 0x335bc 335ba: 68 c0 rjmp .+208 ; 0x3368c 335bc: 1b 30 cpi r17, 0x0B ; 11 335be: 09 f0 breq .+2 ; 0x335c2 335c0: 80 cf rjmp .-256 ; 0x334c2 case Processing: OnMMUProgressMsg(logic.Progress()); break; case ButtonPushed: lastButton = logic.Button(); 335c2: 80 91 d5 12 lds r24, 0x12D5 ; 0x8012d5 335c6: 80 93 fc 12 sts 0x12FC, r24 ; 0x8012fc LogEchoEvent_P(PSTR("MMU Button pushed")); 335ca: 8b ef ldi r24, 0xFB ; 251 335cc: 9e e9 ldi r25, 0x9E ; 158 335ce: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 CheckUserInput(); // Process the button immediately 335d2: 0f 94 7e 96 call 0x32cfc ; 0x32cfc 335d6: 5a c0 rjmp .+180 ; 0x3368c CheckErrorScreenUserInput(); } void MMU2::CheckFINDARunout() { // Check for FINDA filament runout if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors 335d8: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 335dc: 81 11 cpse r24, r1 335de: 56 c0 rjmp .+172 ; 0x3368c return (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY); } // Currently only used in one place, allowed to be inlined bool check_fsensor() { return printJobOngoing() 335e0: 0e 94 40 66 call 0xcc80 ; 0xcc80 && mcode_in_progress != 600 && !saved_printing && !mesh_bed_leveling_flag && !homing_flag && e_active(); 335e4: 88 23 and r24, r24 335e6: 09 f4 brne .+2 ; 0x335ea 335e8: 51 c0 rjmp .+162 ; 0x3368c } // Currently only used in one place, allowed to be inlined bool check_fsensor() { return printJobOngoing() && mcode_in_progress != 600 335ea: 80 91 40 0d lds r24, 0x0D40 ; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489> 335ee: 90 91 41 0d lds r25, 0x0D41 ; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1> 335f2: 88 35 cpi r24, 0x58 ; 88 335f4: 92 40 sbci r25, 0x02 ; 2 335f6: 09 f4 brne .+2 ; 0x335fa 335f8: 49 c0 rjmp .+146 ; 0x3368c && !saved_printing 335fa: 80 91 73 12 lds r24, 0x1273 ; 0x801273 335fe: 81 11 cpse r24, r1 33600: 45 c0 rjmp .+138 ; 0x3368c && !mesh_bed_leveling_flag 33602: 80 91 72 12 lds r24, 0x1272 ; 0x801272 33606: 81 11 cpse r24, r1 33608: 41 c0 rjmp .+130 ; 0x3368c && !homing_flag 3360a: 80 91 71 12 lds r24, 0x1271 ; 0x801271 3360e: 81 11 cpse r24, r1 33610: 3d c0 rjmp .+122 ; 0x3368c bool e_active() { unsigned char e_active = 0; block_t *block; if(block_buffer_tail != block_buffer_head) 33612: 90 91 3f 0d lds r25, 0x0D3F ; 0x800d3f 33616: 80 91 3e 0d lds r24, 0x0D3E ; 0x800d3e 3361a: 98 17 cp r25, r24 3361c: b9 f1 breq .+110 ; 0x3368c { uint8_t block_index = block_buffer_tail; 3361e: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f } #endif bool e_active() { unsigned char e_active = 0; 33622: 90 e0 ldi r25, 0x00 ; 0 { uint8_t block_index = block_buffer_tail; while(block_index != block_buffer_head) { block = &block_buffer[block_index]; if(block->steps[E_AXIS].wide != 0) e_active++; 33624: 2e e6 ldi r18, 0x6E ; 110 unsigned char e_active = 0; block_t *block; if(block_buffer_tail != block_buffer_head) { uint8_t block_index = block_buffer_tail; while(block_index != block_buffer_head) 33626: 30 91 3e 0d lds r19, 0x0D3E ; 0x800d3e 3362a: 38 17 cp r19, r24 3362c: 89 f0 breq .+34 ; 0x33650 { block = &block_buffer[block_index]; if(block->steps[E_AXIS].wide != 0) e_active++; 3362e: 28 9f mul r18, r24 33630: f0 01 movw r30, r0 33632: 11 24 eor r1, r1 33634: e2 5a subi r30, 0xA2 ; 162 33636: f9 4f sbci r31, 0xF9 ; 249 33638: 44 85 ldd r20, Z+12 ; 0x0c 3363a: 55 85 ldd r21, Z+13 ; 0x0d 3363c: 66 85 ldd r22, Z+14 ; 0x0e 3363e: 77 85 ldd r23, Z+15 ; 0x0f 33640: 45 2b or r20, r21 33642: 46 2b or r20, r22 33644: 47 2b or r20, r23 33646: 09 f0 breq .+2 ; 0x3364a 33648: 9f 5f subi r25, 0xFF ; 255 block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); 3364a: 8f 5f subi r24, 0xFF ; 255 3364c: 8f 70 andi r24, 0x0F ; 15 3364e: eb cf rjmp .-42 ; 0x33626 && e_active(); 33650: 99 23 and r25, r25 33652: e1 f0 breq .+56 ; 0x3368c SERIAL_ECHOLNPGM("FINDA filament runout!"); 33654: 8c e8 ldi r24, 0x8C ; 140 33656: 9e e9 ldi r25, 0x9E ; 158 33658: 0e 94 bd 7c call 0xf97a ; 0xf97a void marlin_clear_print_state_in_ram() { clear_print_state_in_ram(); } void marlin_stop_and_save_print_to_ram() { stop_and_save_print_to_ram(0,0); 3365c: 60 e0 ldi r22, 0x00 ; 0 3365e: 70 e0 ldi r23, 0x00 ; 0 33660: cb 01 movw r24, r22 33662: 0f 94 06 66 call 0x2cc0c ; 0x2cc0c marlin_stop_and_save_print_to_ram(); restore_print_from_ram_and_continue(0); 33666: 60 e0 ldi r22, 0x00 ; 0 33668: 70 e0 ldi r23, 0x00 ; 0 3366a: cb 01 movw r24, r22 3366c: 0e 94 b8 66 call 0xcd70 ; 0xcd70 } } bool SpoolJoin::isSpoolJoinEnabled() { if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) { 33670: 86 ed ldi r24, 0xD6 ; 214 33672: 9e e0 ldi r25, 0x0E ; 14 33674: 0f 94 e0 a3 call 0x347c0 ; 0x347c0 33678: 81 30 cpi r24, 0x01 ; 1 3367a: 21 f4 brne .+8 ; 0x33684 if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=? 3367c: 0f 94 a7 65 call 0x2cb4e ; 0x2cb4e 33680: 8f 3f cpi r24, 0xFF ; 255 33682: 91 f5 brne .+100 ; 0x336e8 enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command } else { enquecommand_front_P(MSG_M600); // save print and run M600 command 33684: 8e e5 ldi r24, 0x5E ; 94 33686: 9c e6 ldi r25, 0x6C ; 108 if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors SERIAL_ECHOLNPGM("FINDA filament runout!"); marlin_stop_and_save_print_to_ram(); restore_print_from_ram_and_continue(0); if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=? enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command 33688: 0f 94 78 67 call 0x2cef0 ; 0x2cef0 break; } } } if (logic.Running()) { 3368c: 80 91 af 12 lds r24, 0x12AF ; 0x8012af 33690: 82 30 cpi r24, 0x02 ; 2 33692: 19 f4 brne .+6 ; 0x3369a state = xState::Active; 33694: 81 e0 ldi r24, 0x01 ; 1 33696: 80 93 01 13 sts 0x1301, r24 ; 0x801301 mmu_loop_inner(true); avoidRecursion = false; } void __attribute__((noinline)) MMU2::mmu_loop_inner(bool reportErrors) { logicStepLastStatus = LogicStep(reportErrors); // it looks like the mmu_loop doesn't need to be a blocking call 3369a: 10 93 00 13 sts 0x1300, r17 ; 0x801300 // UI to resolve the error screen, for example tuning Idler Stallguard Threshold // Set to false to allow the error screen to render again. static bool putErrorScreenToSleep; void CheckErrorScreenUserInput() { if (is_mmu_error_monitor_active) { 3369e: 80 91 5c 06 lds r24, 0x065C ; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447> 336a2: 88 23 and r24, r24 336a4: 51 f0 breq .+20 ; 0x336ba bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { if (putErrorScreenToSleep) return; 336a6: 80 91 43 0d lds r24, 0x0D43 ; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451> 336aa: 81 11 cpse r24, r1 336ac: 06 c0 rjmp .+12 ; 0x336ba 336ae: 80 91 f9 12 lds r24, 0x12F9 ; 0x8012f9 336b2: 90 91 fa 12 lds r25, 0x12FA ; 0x8012fa 336b6: 0f 94 62 52 call 0x2a4c4 ; 0x2a4c4 CheckErrorScreenUserInput(); } 336ba: a0 96 adiw r28, 0x20 ; 32 336bc: 0f b6 in r0, 0x3f ; 63 336be: f8 94 cli 336c0: de bf out 0x3e, r29 ; 62 336c2: 0f be out 0x3f, r0 ; 63 336c4: cd bf out 0x3d, r28 ; 61 336c6: df 91 pop r29 336c8: cf 91 pop r28 336ca: 1f 91 pop r17 336cc: 0f 91 pop r16 336ce: ff 90 pop r15 336d0: ef 90 pop r14 336d2: df 90 pop r13 336d4: cf 90 pop r12 336d6: bf 90 pop r11 336d8: af 90 pop r10 336da: 9f 90 pop r9 336dc: 8f 90 pop r8 336de: 7f 90 pop r7 336e0: 6f 90 pop r6 336e2: 5f 90 pop r5 336e4: 4f 90 pop r4 336e6: 08 95 ret if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors SERIAL_ECHOLNPGM("FINDA filament runout!"); marlin_stop_and_save_print_to_ram(); restore_print_from_ram_and_continue(0); if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=? enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command 336e8: 82 e8 ldi r24, 0x82 ; 130 336ea: 9e e9 ldi r25, 0x9E ; 158 336ec: cd cf rjmp .-102 ; 0x33688 336ee: 00 91 d4 12 lds r16, 0x12D4 ; 0x8012d4 ReportProgressHook((CommandInProgress)logic.CommandInProgress(), pc); LogEchoEvent_P(_O(ProgressCodeToText(pc))); } void MMU2::OnMMUProgressMsg(ProgressCode pc) { if (pc != lastProgressCode) { 336f2: 80 91 f8 12 lds r24, 0x12F8 ; 0x8012f8 336f6: 08 17 cp r16, r24 336f8: 09 f4 brne .+2 ; 0x336fc 336fa: 49 c0 rjmp .+146 ; 0x3378e // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 336fc: 80 91 94 12 lds r24, 0x1294 ; 0x801294 33700: 84 30 cpi r24, 0x04 ; 4 33702: b9 f4 brne .+46 ; 0x33732 break; } } void ReportProgressHook(CommandInProgress cip, ProgressCode ec) { if (cip != CommandInProgress::NoCommand) { 33704: 80 91 97 12 lds r24, 0x1297 ; 0x801297 33708: 88 23 and r24, r24 3370a: 99 f0 breq .+38 ; 0x33732 custom_message_type = CustomMsg::MMUProgress; 3370c: 89 e0 ldi r24, 0x09 ; 9 3370e: 80 93 5d 06 sts 0x065D, r24 ; 0x80065d : static_cast(pgm_read_ptr(&progressTexts[0])); 33712: e8 e4 ldi r30, 0x48 ; 72 33714: fe e9 ldi r31, 0x9E ; 158 }; const char *ProgressCodeToText(ProgressCode pc) { // @@TODO ?? a better fallback option? return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0]))) ? static_cast(pgm_read_ptr(&progressTexts[(uint16_t)pc])) 33716: 0e 31 cpi r16, 0x1E ; 30 33718: 30 f4 brcc .+12 ; 0x33726 3371a: e0 2f mov r30, r16 3371c: f0 e0 ldi r31, 0x00 ; 0 3371e: ee 0f add r30, r30 33720: ff 1f adc r31, r31 33722: e8 5b subi r30, 0xB8 ; 184 33724: f1 46 sbci r31, 0x61 ; 97 : static_cast(pgm_read_ptr(&progressTexts[0])); 33726: 85 91 lpm r24, Z+ 33728: 94 91 lpm r25, Z lcd_setstatuspgm( _T(ProgressCodeToText(ec)) ); 3372a: 0e 94 3a 75 call 0xea74 ; 0xea74 3372e: 0e 94 94 de call 0x1bd28 ; 0x1bd28 33732: e8 e4 ldi r30, 0x48 ; 72 33734: fe e9 ldi r31, 0x9E ; 158 }; const char *ProgressCodeToText(ProgressCode pc) { // @@TODO ?? a better fallback option? return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0]))) ? static_cast(pgm_read_ptr(&progressTexts[(uint16_t)pc])) 33736: 0e 31 cpi r16, 0x1E ; 30 33738: 30 f4 brcc .+12 ; 0x33746 3373a: e0 2f mov r30, r16 3373c: f0 e0 ldi r31, 0x00 ; 0 3373e: ee 0f add r30, r30 33740: ff 1f adc r31, r31 33742: e8 5b subi r30, 0xB8 ; 184 33744: f1 46 sbci r31, 0x61 ; 97 : static_cast(pgm_read_ptr(&progressTexts[0])); 33746: 85 91 lpm r24, Z+ 33748: 94 91 lpm r25, Z "MMU2 logging prefix mismatch, must be updated at various spots"); } void MMU2::ReportProgress(ProgressCode pc) { ReportProgressHook((CommandInProgress)logic.CommandInProgress(), pc); LogEchoEvent_P(_O(ProgressCodeToText(pc))); 3374a: 02 96 adiw r24, 0x02 ; 2 3374c: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 } } void MMU2::OnMMUProgressMsgChanged(ProgressCode pc) { ReportProgress(pc); lastProgressCode = pc; 33750: 00 93 f8 12 sts 0x12F8, r16 ; 0x8012f8 switch (pc) { 33754: 03 30 cpi r16, 0x03 ; 3 33756: 49 f0 breq .+18 ; 0x3376a 33758: 0c 31 cpi r16, 0x1C ; 28 3375a: 09 f0 breq .+2 ; 0x3375e 3375c: 97 cf rjmp .-210 ; 0x3368c bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 3375e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 } break; case ProgressCode::FeedingToFSensor: // prepare for the movement of the E-motor planner_synchronize(); loadFilamentStarted = true; 33762: 81 e0 ldi r24, 0x01 ; 1 33764: 80 93 03 13 sts 0x1303, r24 ; 0x801303 33768: 91 cf rjmp .-222 ; 0x3368c 3376a: 80 91 94 12 lds r24, 0x1294 ; 0x801294 3376e: 84 30 cpi r24, 0x04 ; 4 33770: 31 f4 brne .+12 ; 0x3377e ReportProgress(pc); lastProgressCode = pc; switch (pc) { case ProgressCode::UnloadingToFinda: if ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::UnloadFilament || ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::ToolChange)) { 33772: 80 91 97 12 lds r24, 0x1297 ; 0x801297 33776: 84 55 subi r24, 0x54 ; 84 33778: 82 30 cpi r24, 0x02 ; 2 3377a: 08 f4 brcc .+2 ; 0x3377e 3377c: 87 cf rjmp .-242 ; 0x3368c 3377e: 0f 94 fb 1a call 0x235f6 ; 0x235f6 // If printing is not in progress, ToolChange will issue a U0 command. break; } else { // We're likely recovering from an MMU error planner_synchronize(); unloadFilamentStarted = true; 33782: 81 e0 ldi r24, 0x01 ; 1 33784: 80 93 04 13 sts 0x1304, r24 ; 0x801304 if (unloadFilamentStarted && !planner_any_moves()) { // Only plan a move if there is no move ongoing switch (WhereIsFilament()) { case FilamentState::AT_FSENSOR: case FilamentState::IN_NOZZLE: case FilamentState::UNAVAILABLE: // actually Unavailable makes sense as well to start the E-move to release the filament from the gears HelpUnloadToFinda(); 33788: 0f 94 08 5b call 0x2b610 ; 0x2b610 3378c: 7f cf rjmp .-258 ; 0x3368c void __attribute__((noinline)) MMU2::HelpUnloadToFinda() { extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE); } void MMU2::OnMMUProgressMsgSame(ProgressCode pc) { switch (pc) { 3378e: 03 30 cpi r16, 0x03 ; 3 33790: 71 f1 breq .+92 ; 0x337ee 33792: 0c 31 cpi r16, 0x1C ; 28 33794: 09 f0 breq .+2 ; 0x33798 33796: 7a cf rjmp .-268 ; 0x3368c unloadFilamentStarted = false; } } break; case ProgressCode::FeedingToFSensor: if (loadFilamentStarted) { 33798: 80 91 03 13 lds r24, 0x1303 ; 0x801303 3379c: 88 23 and r24, r24 3379e: 09 f4 brne .+2 ; 0x337a2 337a0: 75 cf rjmp .-278 ; 0x3368c switch (WhereIsFilament()) { 337a2: 0f 94 0a 51 call 0x2a214 ; 0x2a214 337a6: 88 23 and r24, r24 337a8: b1 f1 breq .+108 ; 0x33816 337aa: 81 30 cpi r24, 0x01 ; 1 337ac: 09 f0 breq .+2 ; 0x337b0 337ae: 6e cf rjmp .-292 ; 0x3368c case FilamentState::AT_FSENSOR: // fsensor triggered, finish FeedingToExtruder state loadFilamentStarted = false; 337b0: 10 92 03 13 sts 0x1303, r1 ; 0x801303 float move_raise_z(float delta) { return raise_z(delta); } void planner_abort_queued_moves() { planner_abort_hard(); 337b4: 0f 94 fb 4e call 0x29df6 ; 0x29df6 // Unblock the planner. This should be safe in the // toolchange context. Currently we are mainly aborting // excess E-moves after detecting filament during toolchange. // If a MMU error is reported, the planner must be unblocked // as well so the extruder can be parked safely. planner_aborted = false; 337b8: 10 92 42 0d sts 0x0D42, r1 ; 0x800d42 planner_abort_queued_moves(); { extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate()); 337bc: 60 91 df 12 lds r22, 0x12DF ; 0x8012df 337c0: 70 e0 ldi r23, 0x00 ; 0 337c2: 90 e0 ldi r25, 0x00 ; 0 337c4: 80 e0 ldi r24, 0x00 ; 0 337c6: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 337ca: 6b 01 movw r12, r22 337cc: 7c 01 movw r14, r24 337ce: 60 91 de 12 lds r22, 0x12DE ; 0x8012de 337d2: 70 e0 ldi r23, 0x00 ; 0 337d4: 6e 5f subi r22, 0xFE ; 254 337d6: 7f 4f sbci r23, 0xFF ; 255 337d8: 07 2e mov r0, r23 337da: 00 0c add r0, r0 337dc: 88 0b sbc r24, r24 337de: 99 0b sbc r25, r25 337e0: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 337e4: a7 01 movw r20, r14 337e6: 96 01 movw r18, r12 // Plan a very long move, where 'very long' is hundreds // of millimeters. Keep in mind though the move can't be much longer // than 450mm because the firmware will ignore too long extrusions // for safety reasons. See PREVENT_LENGTHY_EXTRUDE. // Use 350mm to be safely away from the prevention threshold extruder_move(350.0f, logic.PulleySlowFeedRate()); 337e8: 0f 94 d6 50 call 0x2a1ac ; 0x2a1ac 337ec: 4f cf rjmp .-354 ; 0x3368c } void MMU2::OnMMUProgressMsgSame(ProgressCode pc) { switch (pc) { case ProgressCode::UnloadingToFinda: if (unloadFilamentStarted && !planner_any_moves()) { // Only plan a move if there is no move ongoing 337ee: 80 91 04 13 lds r24, 0x1304 ; 0x801304 337f2: 88 23 and r24, r24 337f4: 09 f4 brne .+2 ; 0x337f8 337f6: 4a cf rjmp .-364 ; 0x3368c return(block); } // Returns true if the buffer has a queued block, false otherwise FORCE_INLINE bool blocks_queued() { return (block_buffer_head != block_buffer_tail); 337f8: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 337fc: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f 33800: 98 13 cpse r25, r24 33802: 44 cf rjmp .-376 ; 0x3368c switch (WhereIsFilament()) { 33804: 0f 94 0a 51 call 0x2a214 ; 0x2a214 33808: 81 50 subi r24, 0x01 ; 1 3380a: 83 30 cpi r24, 0x03 ; 3 3380c: 08 f4 brcc .+2 ; 0x33810 3380e: bc cf rjmp .-136 ; 0x33788 case FilamentState::IN_NOZZLE: case FilamentState::UNAVAILABLE: // actually Unavailable makes sense as well to start the E-move to release the filament from the gears HelpUnloadToFinda(); break; default: unloadFilamentStarted = false; 33810: 10 92 04 13 sts 0x1304, r1 ; 0x801304 33814: 3b cf rjmp .-394 ; 0x3368c 33816: 90 91 3e 0d lds r25, 0x0D3E ; 0x800d3e 3381a: 80 91 3f 0d lds r24, 0x0D3F ; 0x800d3f extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate()); } break; case FilamentState::NOT_PRESENT: // fsensor not triggered, continue moving extruder if (!planner_any_moves()) { // Only plan a move if there is no move ongoing 3381e: 98 13 cpse r25, r24 33820: 35 cf rjmp .-406 ; 0x3368c // Plan a very long move, where 'very long' is hundreds // of millimeters. Keep in mind though the move can't be much longer // than 450mm because the firmware will ignore too long extrusions // for safety reasons. See PREVENT_LENGTHY_EXTRUDE. // Use 350mm to be safely away from the prevention threshold extruder_move(350.0f, logic.PulleySlowFeedRate()); 33822: 60 91 df 12 lds r22, 0x12DF ; 0x8012df 33826: 70 e0 ldi r23, 0x00 ; 0 33828: 90 e0 ldi r25, 0x00 ; 0 3382a: 80 e0 ldi r24, 0x00 ; 0 3382c: 0f 94 6c 9e call 0x33cd8 ; 0x33cd8 <__floatunsisf> 33830: 9b 01 movw r18, r22 33832: ac 01 movw r20, r24 33834: 60 e0 ldi r22, 0x00 ; 0 33836: 70 e0 ldi r23, 0x00 ; 0 33838: 8f ea ldi r24, 0xAF ; 175 3383a: 93 e4 ldi r25, 0x43 ; 67 3383c: d5 cf rjmp .-86 ; 0x337e8 // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { switch (ss) { 3383e: 18 30 cpi r17, 0x08 ; 8 33840: b9 f0 breq .+46 ; 0x33870 33842: 19 30 cpi r17, 0x09 ; 9 33844: 09 f0 breq .+2 ; 0x33848 33846: 22 cf rjmp .-444 ; 0x3368c StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); break; case PrinterError: ReportError(logic.PrinterError(), ErrorSourcePrinter); 33848: 60 e0 ldi r22, 0x00 ; 0 3384a: 0f 94 97 75 call 0x2eb2e ; 0x2eb2e 3384e: 19 e0 ldi r17, 0x09 ; 9 33850: 1d cf rjmp .-454 ; 0x3368c default: if (reportErrors) { switch (ss) { case CommandError: ReportError(logic.Error(), ErrorSourceMMU); 33852: 61 e0 ldi r22, 0x01 ; 1 33854: 80 91 d2 12 lds r24, 0x12D2 ; 0x8012d2 33858: 90 91 d3 12 lds r25, 0x12D3 ; 0x8012d3 ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); break; case VersionMismatch: StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); 3385c: 0f 94 97 75 call 0x2eb2e ; 0x2eb2e 33860: 15 cf rjmp .-470 ; 0x3368c case CommandError: ReportError(logic.Error(), ErrorSourceMMU); break; case CommunicationTimeout: state = xState::Connecting; 33862: 82 e0 ldi r24, 0x02 ; 2 33864: 80 93 01 13 sts 0x1301, r24 ; 0x801301 ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter); 33868: 60 e0 ldi r22, 0x00 ; 0 3386a: 8e e2 ldi r24, 0x2E ; 46 3386c: 90 e8 ldi r25, 0x80 ; 128 3386e: f6 cf rjmp .-20 ; 0x3385c StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 33870: 10 92 01 13 sts 0x1301, r1 ; 0x801301 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 33874: 10 92 af 12 sts 0x12AF, r1 ; 0x8012af currentScope = Scope::Stopped; 33878: 10 92 94 12 sts 0x1294, r1 ; 0x801294 ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); break; case VersionMismatch: StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); 3387c: 60 e0 ldi r22, 0x00 ; 0 3387e: 8c e2 ldi r24, 0x2C ; 44 33880: 90 e8 ldi r25, 0x80 ; 128 33882: ec cf rjmp .-40 ; 0x3385c break; } } [[fallthrough]]; // otherwise default: RecordUARTActivity(); // something has happened on the UART, update the timeout record 33884: 0f 94 52 56 call 0x2aca4 ; 0x2aca4 33888: ac cd rjmp .-1192 ; 0x333e2 case Interrupted: // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { 3388a: 00 23 and r16, r16 3388c: 01 f3 breq .-64 ; 0x3384e 3388e: dc cf rjmp .-72 ; 0x33848 00033890 : } } } void MMU2::ResumeHotendTemp() { if ((mmu_print_saved & SavedState::CooldownPending)) { 33890: 80 91 02 13 lds r24, 0x1302 ; 0x801302 33894: 82 ff sbrs r24, 2 33896: 07 c0 rjmp .+14 ; 0x338a6 // Clear the "pending" flag if we haven't cooled yet. mmu_print_saved &= ~(SavedState::CooldownPending); 33898: 8b 7f andi r24, 0xFB ; 251 3389a: 80 93 02 13 sts 0x1302, r24 ; 0x801302 LogEchoEvent_P(PSTR("Cooldown flag cleared")); 3389e: 89 ee ldi r24, 0xE9 ; 233 338a0: 9f e9 ldi r25, 0x9F ; 159 338a2: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 } if ((mmu_print_saved & SavedState::Cooldown) && resume_hotend_temp) { 338a6: 80 91 02 13 lds r24, 0x1302 ; 0x801302 338aa: 81 ff sbrs r24, 1 338ac: 52 c0 rjmp .+164 ; 0x33952 338ae: 80 91 f6 12 lds r24, 0x12F6 ; 0x8012f6 338b2: 90 91 f7 12 lds r25, 0x12F7 ; 0x8012f7 338b6: 89 2b or r24, r25 338b8: 09 f4 brne .+2 ; 0x338bc 338ba: 4b c0 rjmp .+150 ; 0x33952 LogEchoEvent_P(PSTR("Resuming Temp")); 338bc: 8b ed ldi r24, 0xDB ; 219 338be: 9f e9 ldi r25, 0x9F ; 159 338c0: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 // @@TODO MMU2_ECHO_MSGRPGM(PSTR("Restoring hotend temperature ")); SERIAL_ECHOLN(resume_hotend_temp); 338c4: 80 91 f6 12 lds r24, 0x12F6 ; 0x8012f6 338c8: 90 91 f7 12 lds r25, 0x12F7 ; 0x8012f7 338cc: 0f 94 bf 65 call 0x2cb7e ; 0x2cb7e mmu_print_saved &= ~(SavedState::Cooldown); 338d0: 80 91 02 13 lds r24, 0x1302 ; 0x801302 338d4: 8d 7f andi r24, 0xFD ; 253 338d6: 80 93 02 13 sts 0x1302, r24 ; 0x801302 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 338da: 80 91 f6 12 lds r24, 0x12F6 ; 0x8012f6 338de: 90 91 f7 12 lds r25, 0x12F7 ; 0x8012f7 338e2: 90 93 5e 12 sts 0x125E, r25 ; 0x80125e 338e6: 80 93 5d 12 sts 0x125D, r24 ; 0x80125d void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); } void FullScreenMsgRestoringTemperature(){ lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP)); 338ea: 80 e0 ldi r24, 0x00 ; 0 338ec: 92 e6 ldi r25, 0x62 ; 98 338ee: 0e 94 3a 75 call 0xea74 ; 0xea74 338f2: 0e 94 a9 e0 call 0x1c152 ; 0x1c152 lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore()); } void ReportErrorHookSensorLineRender(){ // Render static characters in third line lcd_puts_at_P(0, 2, PSTR("FI: FS: > " LCD_STR_THERMOMETER " " LCD_STR_DEGREE)); 338f6: 4b ea ldi r20, 0xAB ; 171 338f8: 5f e9 ldi r21, 0x9F ; 159 338fa: 62 e0 ldi r22, 0x02 ; 2 338fc: 80 e0 ldi r24, 0x00 ; 0 338fe: 0e 94 07 70 call 0xe00e ; 0xe00e int16_t thermal_degTargetHotend() { return degTargetHotend(0); } int16_t thermal_degHotend() { return degHotend(0); 33902: 60 91 5a 0d lds r22, 0x0D5A ; 0x800d5a 33906: 70 91 5b 0d lds r23, 0x0D5B ; 0x800d5b 3390a: 80 91 5c 0d lds r24, 0x0D5C ; 0x800d5c 3390e: 90 91 5d 0d lds r25, 0x0D5D ; 0x800d5d 33912: 0f 94 79 a6 call 0x34cf2 ; 0x34cf2 <__fixsfsi> namespace MMU2 { template void waitForHotendTargetTemp(uint16_t delay, F f) { while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) { 33916: 20 91 5d 12 lds r18, 0x125D ; 0x80125d 3391a: 30 91 5e 12 lds r19, 0x125E ; 0x80125e 3391e: c9 01 movw r24, r18 33920: 86 1b sub r24, r22 33922: 97 0b sbc r25, r23 33924: 06 97 sbiw r24, 0x06 ; 6 33926: 6c f0 brlt .+26 ; 0x33942 void marlin_manage_heater() { manage_heater(); } void marlin_manage_inactivity(bool ignore_stepper_queue) { manage_inactivity(ignore_stepper_queue); 33928: 81 e0 ldi r24, 0x01 ; 1 3392a: 0e 94 34 8c call 0x11868 ; 0x11868 FullScreenMsgRestoringTemperature(); //@todo better report the event and let the GUI do its work somewhere else ReportErrorHookSensorLineRender(); waitForHotendTargetTemp(100, [] { marlin_manage_inactivity(true); mmu2.mmu_loop_inner(false); 3392e: 80 e0 ldi r24, 0x00 ; 0 33930: 0f 94 38 97 call 0x32e70 ; 0x32e70 ReportErrorHookDynamicRender(); 33934: 0f 94 30 50 call 0x2a060 ; 0x2a060 void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 33938: 84 e6 ldi r24, 0x64 ; 100 3393a: 90 e0 ldi r25, 0x00 ; 0 3393c: 0e 94 8e 8e call 0x11d1c ; 0x11d1c 33940: e0 cf rjmp .-64 ; 0x33902 }); ScreenUpdateEnable(); // temporary hack to stop this locking the printer... 33942: 0f 94 06 50 call 0x2a00c ; 0x2a00c LogEchoEvent_P(PSTR("Hotend temperature reached")); 33946: 80 ec ldi r24, 0xC0 ; 192 33948: 9f e9 ldi r25, 0x9F ; 159 3394a: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 void ScreenUpdateEnable(){ lcd_update_enable(true); } void ScreenClear(){ lcd_clear(); 3394e: 0c 94 26 70 jmp 0xe04c ; 0xe04c ScreenClear(); } } 33952: 08 95 ret 00033954 : /// just to verify the result of an issued command (which was basically the original idea) /// /// It is closely related to mmu_loop() (which corresponds to our ProtocolLogic::Step()), which does NOT perform any blocking wait for a command to finish. /// But - in case of an error, the command is not yet finished, but we must react accordingly - move the printhead elsewhere, stop heating, eat a cat or so. /// That's what's being done here... bool MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { 33954: 0f 93 push r16 33956: 1f 93 push r17 33958: cf 93 push r28 3395a: df 93 push r29 3395c: 00 d0 rcall .+0 ; 0x3395e 3395e: 1f 92 push r1 33960: 1f 92 push r1 33962: cd b7 in r28, 0x3d ; 61 33964: de b7 in r29, 0x3e ; 62 33966: 18 2f mov r17, r24 33968: 06 2f mov r16, r22 mmu_print_saved = SavedState::None; 3396a: 10 92 02 13 sts 0x1302, r1 ; 0x801302 MARLIN_KEEPALIVE_STATE_IN_PROCESS; 3396e: 83 e0 ldi r24, 0x03 ; 3 33970: 80 93 78 02 sts 0x0278, r24 ; 0x800278 LongTimer nozzleTimeout; 33974: 19 82 std Y+1, r1 ; 0x01 33976: 1a 82 std Y+2, r1 ; 0x02 33978: 1b 82 std Y+3, r1 ; 0x03 3397a: 1c 82 std Y+4, r1 ; 0x04 3397c: 1d 82 std Y+5, r1 ; 0x05 3397e: 90 e0 ldi r25, 0x00 ; 0 33980: 80 e0 ldi r24, 0x00 ; 0 33982: 0e 94 8e 8e call 0x11d1c ; 0x11d1c // - failed -> then do the safety moves on the printer like before // - finished ok -> proceed with reading other commands safe_delay_keep_alive(0); // calls LogicStep() and remembers its return status // also disables stepper motor unlocking if (mmu_print_saved & SavedState::CooldownPending) { 33986: 90 91 02 13 lds r25, 0x1302 ; 0x801302 3398a: 89 81 ldd r24, Y+1 ; 0x01 3398c: 92 ff sbrs r25, 2 3398e: 37 c0 rjmp .+110 ; 0x339fe if (!nozzleTimeout.running()) { 33990: 81 11 cpse r24, r1 33992: 1e c0 rjmp .+60 ; 0x339d0 nozzleTimeout.start(); 33994: ce 01 movw r24, r28 33996: 01 96 adiw r24, 0x01 ; 1 33998: 0f 94 47 10 call 0x2208e ; 0x2208e ::start()> LogEchoEvent_P(PSTR("Cooling Timeout started")); 3399c: 82 ed ldi r24, 0xD2 ; 210 3399e: 9d e9 ldi r25, 0x9D ; 157 thermal_setTargetHotend(0); LogEchoEvent_P(PSTR("Heater cooldown")); } } else if (nozzleTimeout.running()) { nozzleTimeout.stop(); LogEchoEvent_P(PSTR("Cooling timer stopped")); 339a0: 0f 94 fa 50 call 0x2a1f4 ; 0x2a1f4 } switch (logicStepLastStatus) { 339a4: e0 91 00 13 lds r30, 0x1300 ; 0x801300 339a8: e2 50 subi r30, 0x02 ; 2 339aa: ea 30 cpi r30, 0x0A ; 10 339ac: 40 f7 brcc .-48 ; 0x3397e 339ae: f0 e0 ldi r31, 0x00 ; 0 339b0: 88 27 eor r24, r24 339b2: e2 52 subi r30, 0x22 ; 34 339b4: f3 46 sbci r31, 0x63 ; 99 339b6: 8e 4f sbci r24, 0xFE ; 254 339b8: 0d 94 f0 a4 jmp 0x349e0 ; 0x349e0 <__tablejump2__> 339bc: 22 37 cpi r18, 0x72 ; 114 339be: 1e 38 cpi r17, 0x8E ; 142 339c0: a2 38 cpi r26, 0x82 ; 130 339c2: a2 38 cpi r26, 0x82 ; 130 339c4: 72 38 cpi r23, 0x82 ; 130 339c6: a2 38 cpi r26, 0x82 ; 130 339c8: 48 37 cpi r20, 0x78 ; 120 339ca: c4 37 cpi r28, 0x74 ; 116 339cc: 1a 38 cpi r17, 0x8A ; 138 339ce: a2 38 cpi r26, 0x82 ; 130 if (mmu_print_saved & SavedState::CooldownPending) { if (!nozzleTimeout.running()) { nozzleTimeout.start(); LogEchoEvent_P(PSTR("Cooling Timeout started")); } else if (nozzleTimeout.expired(DEFAULT_SAFETYTIMER_TIME_MINS * 60 * 1000ul)) { // mins->msec. 339d0: 40 e4 ldi r20, 0x40 ; 64 339d2: 57 e7 ldi r21, 0x77 ; 119 339d4: 6b e1 ldi r22, 0x1B ; 27 339d6: 70 e0 ldi r23, 0x00 ; 0 339d8: ce 01 movw r24, r28 339da: 01 96 adiw r24, 0x01 ; 1 339dc: 0f 94 88 0e call 0x21d10 ; 0x21d10 ::expired(unsigned long)> 339e0: 88 23 and r24, r24 339e2: 01 f3 breq .-64 ; 0x339a4 mmu_print_saved &= ~(SavedState::CooldownPending); 339e4: 80 91 02 13 lds r24, 0x1302 ; 0x801302 339e8: 8b 7f andi r24, 0xFB ; 251 mmu_print_saved |= SavedState::Cooldown; 339ea: 82 60 ori r24, 0x02 ; 2 339ec: 80 93 02 13 sts 0x1302, r24 ; 0x801302 339f0: 10 92 5e 12 sts 0x125E, r1 ; 0x80125e 339f4: 10 92 5d 12 sts 0x125D, r1 ; 0x80125d thermal_setTargetHotend(0); LogEchoEvent_P(PSTR("Heater cooldown")); 339f8: 82 ec ldi r24, 0xC2 ; 194 339fa: 9d e9 ldi r25, 0x9D ; 157 339fc: d1 cf rjmp .-94 ; 0x339a0 } } else if (nozzleTimeout.running()) { 339fe: 88 23 and r24, r24 33a00: 89 f2 breq .-94 ; 0x339a4 33a02: 19 82 std Y+1, r1 ; 0x01 nozzleTimeout.stop(); LogEchoEvent_P(PSTR("Cooling timer stopped")); 33a04: 8c ea ldi r24, 0xAC ; 172 33a06: 9d e9 ldi r25, 0x9D ; 157 33a08: cb cf rjmp .-106 ; 0x339a0 switch (logicStepLastStatus) { case Finished: // command/operation completed, let Marlin continue its work // the E may have some more moves to finish - wait for them ResumeHotendTemp(); 33a0a: 0f 94 48 9c call 0x33890 ; 0x33890 ResumeUnpark(); // We can now travel back to the tower or wherever we were when we saved. 33a0e: 0f 94 2e 5b call 0x2b65c ; 0x2b65c if (!TuneMenuEntered()) { 33a12: 80 91 43 0d lds r24, 0x0D43 ; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451> 33a16: 81 11 cpse r24, r1 33a18: 07 c0 rjmp .+14 ; 0x33a28 retryAttempts--; } } void ProtocolLogic::ResetRetryAttempts() { SERIAL_ECHOLNPGM("ResetRetryAttempts"); 33a1a: 88 e9 ldi r24, 0x98 ; 152 33a1c: 9f e9 ldi r25, 0x9F ; 159 33a1e: 0e 94 bd 7c call 0xf97a ; 0xf97a retryAttempts = MAX_RETRIES; 33a22: 83 e0 ldi r24, 0x03 ; 3 33a24: 80 93 e6 12 sts 0x12E6, r24 ; 0x8012e6 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 33a28: 0f 94 fb 1a call 0x235f6 ; 0x235f6 case Interrupted: // now what :D ... big bad ... ramming, unload, retry the whole command originally issued return false; case VersionMismatch: // this basically means the MMU will be disabled until reconnected CheckUserInput(); return true; 33a2c: 81 e0 ldi r24, 0x01 ; 1 case Processing: // wait for the MMU to respond default: break; } } } 33a2e: 0f 90 pop r0 33a30: 0f 90 pop r0 33a32: 0f 90 pop r0 33a34: 0f 90 pop r0 33a36: 0f 90 pop r0 33a38: df 91 pop r29 33a3a: cf 91 pop r28 33a3c: 1f 91 pop r17 33a3e: 0f 91 pop r16 33a40: 08 95 ret return true; case Interrupted: // now what :D ... big bad ... ramming, unload, retry the whole command originally issued return false; case VersionMismatch: // this basically means the MMU will be disabled until reconnected CheckUserInput(); 33a42: 0f 94 7e 96 call 0x32cfc ; 0x32cfc 33a46: f2 cf rjmp .-28 ; 0x33a2c break; case CommandError: case CommunicationTimeout: case ProtocolError: case ButtonPushed: if (!logic.InAutoRetry()) { 33a48: 80 91 e7 12 lds r24, 0x12E7 ; 0x8012e7 33a4c: 81 11 cpse r24, r1 33a4e: 97 cf rjmp .-210 ; 0x3397e // Don't proceed to the park/save if we are doing an autoretry. SaveAndPark(move_axes); 33a50: 81 2f mov r24, r17 33a52: 0f 94 78 5b call 0x2b6f0 ; 0x2b6f0 SaveHotendTemp(turn_off_nozzle); 33a56: 80 2f mov r24, r16 33a58: 0f 94 12 5b call 0x2b624 ; 0x2b624 CheckUserInput(); 33a5c: 0f 94 7e 96 call 0x32cfc ; 0x32cfc 33a60: 8e cf rjmp .-228 ; 0x3397e } break; case CommunicationRecovered: // @@TODO communication recovered and may be an error recovered as well // may be the logic layer can detect the change of state a respond with one "Recovered" to be handled here ResumeHotendTemp(); 33a62: 0f 94 48 9c call 0x33890 ; 0x33890 ResumeUnpark(); 33a66: 0f 94 2e 5b call 0x2b65c ; 0x2b65c 33a6a: 89 cf rjmp .-238 ; 0x3397e } planner_synchronize(); return true; case Interrupted: // now what :D ... big bad ... ramming, unload, retry the whole command originally issued return false; 33a6c: 80 e0 ldi r24, 0x00 ; 0 33a6e: df cf rjmp .-66 ; 0x33a2e 00033a70 : } // true, true); -- Comment: how is it possible for a filament type set to fail? return true; } void MMU2::UnloadInner() { 33a70: cf 93 push r28 33a72: df 93 push r29 33a74: 00 d0 rcall .+0 ; 0x33a76 33a76: 1f 92 push r1 33a78: 1f 92 push r1 33a7a: cd b7 in r28, 0x3d ; 61 33a7c: de b7 in r29, 0x3e ; 62 FSensorBlockRunout blockRunout; 33a7e: 0f 94 2b 79 call 0x2f256 ; 0x2f256 return ss; } void MMU2::filament_ramming() { execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); 33a82: 62 e1 ldi r22, 0x12 ; 18 33a84: 8c e1 ldi r24, 0x1C ; 28 33a86: 9d e9 ldi r25, 0x9D ; 157 33a88: 0f 94 7d 79 call 0x2f2fa ; 0x2f2fa filament_ramming(); // we assume the printer managed to relieve filament tip from the gears, // so repeating that part in case of an MMU restart is not necessary for (;;) { Disable_E0(); 33a8c: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 void ProtocolLogic::Statistics() { PlanGenericRequest(RequestMsg(RequestMsgCodes::Version, 3)); } void ProtocolLogic::UnloadFilament() { PlanGenericRequest(RequestMsg(RequestMsgCodes::Unload, 0)); 33a90: 40 e0 ldi r20, 0x00 ; 0 33a92: 65 e5 ldi r22, 0x55 ; 85 33a94: ce 01 movw r24, r28 33a96: 01 96 adiw r24, 0x01 ; 1 33a98: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 33a9c: 49 81 ldd r20, Y+1 ; 0x01 33a9e: 5a 81 ldd r21, Y+2 ; 0x02 33aa0: 6b 81 ldd r22, Y+3 ; 0x03 33aa2: 7c 81 ldd r23, Y+4 ; 0x04 33aa4: 8d 81 ldd r24, Y+5 ; 0x05 33aa6: 0f 94 19 95 call 0x32a32 ; 0x32a32 logic.UnloadFilament(); if (manage_response(false, true)) { 33aaa: 61 e0 ldi r22, 0x01 ; 1 33aac: 80 e0 ldi r24, 0x00 ; 0 33aae: 0f 94 aa 9c call 0x33954 ; 0x33954 33ab2: 81 11 cpse r24, r1 33ab4: 03 c0 rjmp .+6 ; 0x33abc break; } IncrementMMUFails(); 33ab6: 0f 94 28 50 call 0x2a050 ; 0x2a050 33aba: e8 cf rjmp .-48 ; 0x33a8c bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 33abc: 83 e0 ldi r24, 0x03 ; 3 33abe: 0f 94 ad 25 call 0x24b5a ; 0x24b5a } MakeSound(Confirm); // no active tool SetCurrentTool(MMU2_NO_TOOL); 33ac2: 83 e6 ldi r24, 0x63 ; 99 33ac4: 0f 94 c7 65 call 0x2cb8e ; 0x2cb8e tool_change_extruder = MMU2_NO_TOOL; 33ac8: 83 e6 ldi r24, 0x63 ; 99 33aca: 80 93 e9 12 sts 0x12E9, r24 ; 0x8012e9 FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 33ace: 0f 94 95 6d call 0x2db2a ; 0x2db2a } 33ad2: 0f 90 pop r0 33ad4: 0f 90 pop r0 33ad6: 0f 90 pop r0 33ad8: 0f 90 pop r0 33ada: 0f 90 pop r0 33adc: df 91 pop r29 33ade: cf 91 pop r28 33ae0: 08 95 ret 00033ae2 : bool MMU2::unload() { 33ae2: cf 93 push r28 if (!WaitForMMUReady()) { 33ae4: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 33ae8: c8 2f mov r28, r24 33aea: 88 23 and r24, r24 33aec: 79 f0 breq .+30 ; 0x33b0c safe_delay_keep_alive(delay); } } void WaitForHotendTargetTempBeep() { waitForHotendTargetTemp(200, [] {}); 33aee: 88 ec ldi r24, 0xC8 ; 200 33af0: 90 e0 ldi r25, 0x00 ; 0 33af2: 0f 94 58 54 call 0x2a8b0 ; 0x2a8b0 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]> 33af6: 82 e0 ldi r24, 0x02 ; 2 33af8: 0f 94 ad 25 call 0x24b5a ; 0x24b5a struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 33afc: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 WaitForHotendTargetTempBeep(); { ReportingRAII rep(CommandInProgress::UnloadFilament); UnloadInner(); 33b00: 0f 94 38 9d call 0x33a70 ; 0x33a70 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 33b04: 0f 94 9b 79 call 0x2f336 ; 0x2f336 { ReportingRAII rep(CommandInProgress::UnloadFilament); UnloadInner(); } ScreenUpdateEnable(); 33b08: 0f 94 06 50 call 0x2a00c ; 0x2a00c return true; } 33b0c: 8c 2f mov r24, r28 33b0e: cf 91 pop r28 33b10: 08 95 ret 00033b12 : unload(); ScreenUpdateEnable(); return true; } bool MMU2::load_filament(uint8_t slot) { 33b12: 0f 93 push r16 33b14: 1f 93 push r17 33b16: cf 93 push r28 33b18: df 93 push r29 33b1a: 00 d0 rcall .+0 ; 0x33b1c 33b1c: 1f 92 push r1 33b1e: 1f 92 push r1 33b20: cd b7 in r28, 0x3d ; 61 33b22: de b7 in r29, 0x3e ; 62 33b24: 08 2f mov r16, r24 if (!WaitForMMUReady()) { 33b26: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 33b2a: 18 2f mov r17, r24 33b2c: 88 23 and r24, r24 33b2e: 49 f1 breq .+82 ; 0x33b82 void FullScreenMsgTest(uint8_t slot){ FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot); } void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); 33b30: 8d ee ldi r24, 0xED ; 237 33b32: 91 e6 ldi r25, 0x61 ; 97 33b34: 0e 94 3a 75 call 0xea74 ; 0xea74 33b38: 60 2f mov r22, r16 33b3a: 0f 94 09 50 call 0x2a012 ; 0x2a012 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 33b3e: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 FullScreenMsgLoad(slot); { ReportingRAII rep(CommandInProgress::LoadFilament); for (;;) { Disable_E0(); 33b42: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 } void ProtocolLogic::LoadFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Load, slot)); 33b46: 40 2f mov r20, r16 33b48: 6c e4 ldi r22, 0x4C ; 76 33b4a: ce 01 movw r24, r28 33b4c: 01 96 adiw r24, 0x01 ; 1 33b4e: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 33b52: 49 81 ldd r20, Y+1 ; 0x01 33b54: 5a 81 ldd r21, Y+2 ; 0x02 33b56: 6b 81 ldd r22, Y+3 ; 0x03 33b58: 7c 81 ldd r23, Y+4 ; 0x04 33b5a: 8d 81 ldd r24, Y+5 ; 0x05 33b5c: 0f 94 19 95 call 0x32a32 ; 0x32a32 logic.LoadFilament(slot); if (manage_response(false, false)) { 33b60: 60 e0 ldi r22, 0x00 ; 0 33b62: 80 e0 ldi r24, 0x00 ; 0 33b64: 0f 94 aa 9c call 0x33954 ; 0x33954 33b68: 18 2f mov r17, r24 33b6a: 81 11 cpse r24, r1 33b6c: 03 c0 rjmp .+6 ; 0x33b74 break; } IncrementMMUFails(); 33b6e: 0f 94 28 50 call 0x2a050 ; 0x2a050 33b72: e7 cf rjmp .-50 ; 0x33b42 bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 33b74: 83 e0 ldi r24, 0x03 ; 3 33b76: 0f 94 ad 25 call 0x24b5a ; 0x24b5a explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 33b7a: 0f 94 9b 79 call 0x2f336 ; 0x2f336 } IncrementMMUFails(); } MakeSound(SoundType::Confirm); } ScreenUpdateEnable(); 33b7e: 0f 94 06 50 call 0x2a00c ; 0x2a00c return true; } 33b82: 81 2f mov r24, r17 33b84: 0f 90 pop r0 33b86: 0f 90 pop r0 33b88: 0f 90 pop r0 33b8a: 0f 90 pop r0 33b8c: 0f 90 pop r0 33b8e: df 91 pop r29 33b90: cf 91 pop r28 33b92: 1f 91 pop r17 33b94: 0f 91 pop r16 33b96: 08 95 ret 00033b98 : } ScreenUpdateEnable(); return true; } bool MMU2::eject_filament(uint8_t slot, bool enableFullScreenMsg /* = true */) { 33b98: ff 92 push r15 33b9a: 0f 93 push r16 33b9c: 1f 93 push r17 33b9e: cf 93 push r28 33ba0: df 93 push r29 33ba2: 00 d0 rcall .+0 ; 0x33ba4 33ba4: 1f 92 push r1 33ba6: 1f 92 push r1 33ba8: cd b7 in r28, 0x3d ; 61 33baa: de b7 in r29, 0x3e ; 62 33bac: 08 2f mov r16, r24 33bae: f6 2e mov r15, r22 if (!WaitForMMUReady()) { 33bb0: 0f 94 a6 79 call 0x2f34c ; 0x2f34c 33bb4: 18 2f mov r17, r24 33bb6: 88 23 and r24, r24 33bb8: b1 f1 breq .+108 ; 0x33c26 return false; } if (enableFullScreenMsg) { 33bba: ff 20 and r15, r15 33bbc: 39 f0 breq .+14 ; 0x33bcc void FullScreenMsgCut(uint8_t slot){ FullScreenMsg(_T(MSG_CUT_FILAMENT), slot); } void FullScreenMsgEject(uint8_t slot){ FullScreenMsg(_T(MSG_EJECT_FROM_MMU), slot); 33bbe: 8c ed ldi r24, 0xDC ; 220 33bc0: 91 e6 ldi r25, 0x61 ; 97 33bc2: 0e 94 3a 75 call 0xea74 ; 0xea74 33bc6: 60 2f mov r22, r16 33bc8: 0f 94 09 50 call 0x2a012 ; 0x2a012 FullScreenMsgEject(slot); } { if (FindaDetectsFilament()) { 33bcc: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 33bd0: 81 11 cpse r24, r1 unload(); 33bd2: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 33bd6: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 unload(); } ReportingRAII rep(CommandInProgress::EjectFilament); for (;;) { Disable_E0(); 33bda: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 } void ProtocolLogic::EjectFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Eject, slot)); 33bde: 40 2f mov r20, r16 33be0: 65 e4 ldi r22, 0x45 ; 69 33be2: ce 01 movw r24, r28 33be4: 01 96 adiw r24, 0x01 ; 1 33be6: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 33bea: 49 81 ldd r20, Y+1 ; 0x01 33bec: 5a 81 ldd r21, Y+2 ; 0x02 33bee: 6b 81 ldd r22, Y+3 ; 0x03 33bf0: 7c 81 ldd r23, Y+4 ; 0x04 33bf2: 8d 81 ldd r24, Y+5 ; 0x05 33bf4: 0f 94 19 95 call 0x32a32 ; 0x32a32 logic.EjectFilament(slot); if (manage_response(false, true)) { 33bf8: 61 e0 ldi r22, 0x01 ; 1 33bfa: 80 e0 ldi r24, 0x00 ; 0 33bfc: 0f 94 aa 9c call 0x33954 ; 0x33954 33c00: 18 2f mov r17, r24 33c02: 81 11 cpse r24, r1 33c04: 03 c0 rjmp .+6 ; 0x33c0c break; } IncrementMMUFails(); 33c06: 0f 94 28 50 call 0x2a050 ; 0x2a050 33c0a: e7 cf rjmp .-50 ; 0x33bda } SetCurrentTool(MMU2_NO_TOOL); 33c0c: 83 e6 ldi r24, 0x63 ; 99 33c0e: 0f 94 c7 65 call 0x2cb8e ; 0x2cb8e tool_change_extruder = MMU2_NO_TOOL; 33c12: 83 e6 ldi r24, 0x63 ; 99 33c14: 80 93 e9 12 sts 0x12E9, r24 ; 0x8012e9 bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 33c18: 83 e0 ldi r24, 0x03 ; 3 33c1a: 0f 94 ad 25 call 0x24b5a ; 0x24b5a explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 33c1e: 0f 94 9b 79 call 0x2f336 ; 0x2f336 } SetCurrentTool(MMU2_NO_TOOL); tool_change_extruder = MMU2_NO_TOOL; MakeSound(Confirm); } ScreenUpdateEnable(); 33c22: 0f 94 06 50 call 0x2a00c ; 0x2a00c return true; } 33c26: 81 2f mov r24, r17 33c28: 0f 90 pop r0 33c2a: 0f 90 pop r0 33c2c: 0f 90 pop r0 33c2e: 0f 90 pop r0 33c30: 0f 90 pop r0 33c32: df 91 pop r29 33c34: cf 91 pop r28 33c36: 1f 91 pop r17 33c38: 0f 91 pop r16 33c3a: ff 90 pop r15 33c3c: 08 95 ret 00033c3e : ScreenUpdateEnable(); return true; } void MMU2::CutFilamentInner(uint8_t slot) { 33c3e: 1f 93 push r17 33c40: cf 93 push r28 33c42: df 93 push r29 33c44: 00 d0 rcall .+0 ; 0x33c46 33c46: 1f 92 push r1 33c48: 1f 92 push r1 33c4a: cd b7 in r28, 0x3d ; 61 33c4c: de b7 in r29, 0x3e ; 62 33c4e: 18 2f mov r17, r24 for (;;) { Disable_E0(); 33c50: 0f 94 d4 50 call 0x2a1a8 ; 0x2a1a8 } void ProtocolLogic::CutFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot)); 33c54: 41 2f mov r20, r17 33c56: 6b e4 ldi r22, 0x4B ; 75 33c58: ce 01 movw r24, r28 33c5a: 01 96 adiw r24, 0x01 ; 1 33c5c: 0f 94 c7 50 call 0x2a18e ; 0x2a18e 33c60: 49 81 ldd r20, Y+1 ; 0x01 33c62: 5a 81 ldd r21, Y+2 ; 0x02 33c64: 6b 81 ldd r22, Y+3 ; 0x03 33c66: 7c 81 ldd r23, Y+4 ; 0x04 33c68: 8d 81 ldd r24, Y+5 ; 0x05 33c6a: 0f 94 19 95 call 0x32a32 ; 0x32a32 logic.CutFilament(slot); if (manage_response(false, true)) { 33c6e: 61 e0 ldi r22, 0x01 ; 1 33c70: 80 e0 ldi r24, 0x00 ; 0 33c72: 0f 94 aa 9c call 0x33954 ; 0x33954 33c76: 81 11 cpse r24, r1 33c78: 03 c0 rjmp .+6 ; 0x33c80 break; } IncrementMMUFails(); 33c7a: 0f 94 28 50 call 0x2a050 ; 0x2a050 33c7e: e8 cf rjmp .-48 ; 0x33c50 } } 33c80: 0f 90 pop r0 33c82: 0f 90 pop r0 33c84: 0f 90 pop r0 33c86: 0f 90 pop r0 33c88: 0f 90 pop r0 33c8a: df 91 pop r29 33c8c: cf 91 pop r28 33c8e: 1f 91 pop r17 33c90: 08 95 ret 00033c92 : bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { 33c92: cf 93 push r28 33c94: c8 2f mov r28, r24 lcd_print(' '); lcd_print(slot + 1); } void FullScreenMsgCut(uint8_t slot){ FullScreenMsg(_T(MSG_CUT_FILAMENT), slot); 33c96: 8d ec ldi r24, 0xCD ; 205 33c98: 91 e6 ldi r25, 0x61 ; 97 33c9a: 0e 94 3a 75 call 0xea74 ; 0xea74 33c9e: 6c 2f mov r22, r28 33ca0: 0f 94 09 50 call 0x2a012 ; 0x2a012 if (enableFullScreenMsg) { FullScreenMsgCut(slot); } { if (FindaDetectsFilament()) { 33ca4: 80 91 d7 12 lds r24, 0x12D7 ; 0x8012d7 33ca8: 81 11 cpse r24, r1 unload(); 33caa: 0f 94 71 9d call 0x33ae2 ; 0x33ae2 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 33cae: 0f 94 72 79 call 0x2f2e4 ; 0x2f2e4 if (FindaDetectsFilament()) { unload(); } ReportingRAII rep(CommandInProgress::CutFilament); CutFilamentInner(slot); 33cb2: 8c 2f mov r24, r28 33cb4: 0f 94 1f 9e call 0x33c3e ; 0x33c3e SetCurrentTool(MMU2_NO_TOOL); 33cb8: 83 e6 ldi r24, 0x63 ; 99 33cba: 0f 94 c7 65 call 0x2cb8e ; 0x2cb8e tool_change_extruder = MMU2_NO_TOOL; 33cbe: 83 e6 ldi r24, 0x63 ; 99 33cc0: 80 93 e9 12 sts 0x12E9, r24 ; 0x8012e9 bool cutter_enabled(){ return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled; } void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); 33cc4: 83 e0 ldi r24, 0x03 ; 3 33cc6: 0f 94 ad 25 call 0x24b5a ; 0x24b5a explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 33cca: 0f 94 9b 79 call 0x2f336 ; 0x2f336 CutFilamentInner(slot); SetCurrentTool(MMU2_NO_TOOL); tool_change_extruder = MMU2_NO_TOOL; MakeSound(SoundType::Confirm); } ScreenUpdateEnable(); 33cce: 0f 94 06 50 call 0x2a00c ; 0x2a00c return true; } 33cd2: 81 e0 ldi r24, 0x01 ; 1 33cd4: cf 91 pop r28 33cd6: 08 95 ret 00033cd8 <__floatunsisf>: 33cd8: e8 94 clt 33cda: 09 c0 rjmp .+18 ; 0x33cee <__floatsisf+0x12> 00033cdc <__floatsisf>: 33cdc: 97 fb bst r25, 7 33cde: 3e f4 brtc .+14 ; 0x33cee <__floatsisf+0x12> 33ce0: 90 95 com r25 33ce2: 80 95 com r24 33ce4: 70 95 com r23 33ce6: 61 95 neg r22 33ce8: 7f 4f sbci r23, 0xFF ; 255 33cea: 8f 4f sbci r24, 0xFF ; 255 33cec: 9f 4f sbci r25, 0xFF ; 255 33cee: 99 23 and r25, r25 33cf0: a9 f0 breq .+42 ; 0x33d1c <__floatsisf+0x40> 33cf2: f9 2f mov r31, r25 33cf4: 96 e9 ldi r25, 0x96 ; 150 33cf6: bb 27 eor r27, r27 33cf8: 93 95 inc r25 33cfa: f6 95 lsr r31 33cfc: 87 95 ror r24 33cfe: 77 95 ror r23 33d00: 67 95 ror r22 33d02: b7 95 ror r27 33d04: f1 11 cpse r31, r1 33d06: f8 cf rjmp .-16 ; 0x33cf8 <__floatsisf+0x1c> 33d08: fa f4 brpl .+62 ; 0x33d48 <__floatsisf+0x6c> 33d0a: bb 0f add r27, r27 33d0c: 11 f4 brne .+4 ; 0x33d12 <__floatsisf+0x36> 33d0e: 60 ff sbrs r22, 0 33d10: 1b c0 rjmp .+54 ; 0x33d48 <__floatsisf+0x6c> 33d12: 6f 5f subi r22, 0xFF ; 255 33d14: 7f 4f sbci r23, 0xFF ; 255 33d16: 8f 4f sbci r24, 0xFF ; 255 33d18: 9f 4f sbci r25, 0xFF ; 255 33d1a: 16 c0 rjmp .+44 ; 0x33d48 <__floatsisf+0x6c> 33d1c: 88 23 and r24, r24 33d1e: 11 f0 breq .+4 ; 0x33d24 <__floatsisf+0x48> 33d20: 96 e9 ldi r25, 0x96 ; 150 33d22: 11 c0 rjmp .+34 ; 0x33d46 <__floatsisf+0x6a> 33d24: 77 23 and r23, r23 33d26: 21 f0 breq .+8 ; 0x33d30 <__floatsisf+0x54> 33d28: 9e e8 ldi r25, 0x8E ; 142 33d2a: 87 2f mov r24, r23 33d2c: 76 2f mov r23, r22 33d2e: 05 c0 rjmp .+10 ; 0x33d3a <__floatsisf+0x5e> 33d30: 66 23 and r22, r22 33d32: 71 f0 breq .+28 ; 0x33d50 <__floatsisf+0x74> 33d34: 96 e8 ldi r25, 0x86 ; 134 33d36: 86 2f mov r24, r22 33d38: 70 e0 ldi r23, 0x00 ; 0 33d3a: 60 e0 ldi r22, 0x00 ; 0 33d3c: 2a f0 brmi .+10 ; 0x33d48 <__floatsisf+0x6c> 33d3e: 9a 95 dec r25 33d40: 66 0f add r22, r22 33d42: 77 1f adc r23, r23 33d44: 88 1f adc r24, r24 33d46: da f7 brpl .-10 ; 0x33d3e <__floatsisf+0x62> 33d48: 88 0f add r24, r24 33d4a: 96 95 lsr r25 33d4c: 87 95 ror r24 33d4e: 97 f9 bld r25, 7 33d50: 08 95 ret 00033d52 : 33d52: 9b 01 movw r18, r22 33d54: ac 01 movw r20, r24 33d56: 0d 94 ad 9e jmp 0x33d5a ; 0x33d5a <__mulsf3> 00033d5a <__mulsf3>: 33d5a: 0f 94 c0 9e call 0x33d80 ; 0x33d80 <__mulsf3x> 33d5e: 0d 94 31 9f jmp 0x33e62 ; 0x33e62 <__fp_round> 33d62: 0f 94 23 9f call 0x33e46 ; 0x33e46 <__fp_pscA> 33d66: 38 f0 brcs .+14 ; 0x33d76 <__mulsf3+0x1c> 33d68: 0f 94 2a 9f call 0x33e54 ; 0x33e54 <__fp_pscB> 33d6c: 20 f0 brcs .+8 ; 0x33d76 <__mulsf3+0x1c> 33d6e: 95 23 and r25, r21 33d70: 11 f0 breq .+4 ; 0x33d76 <__mulsf3+0x1c> 33d72: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 33d76: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 33d7a: 11 24 eor r1, r1 33d7c: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 00033d80 <__mulsf3x>: 33d80: 0f 94 42 9f call 0x33e84 ; 0x33e84 <__fp_split3> 33d84: 70 f3 brcs .-36 ; 0x33d62 <__mulsf3+0x8> 00033d86 <__mulsf3_pse>: 33d86: 95 9f mul r25, r21 33d88: c1 f3 breq .-16 ; 0x33d7a <__mulsf3+0x20> 33d8a: 95 0f add r25, r21 33d8c: 50 e0 ldi r21, 0x00 ; 0 33d8e: 55 1f adc r21, r21 33d90: 62 9f mul r22, r18 33d92: f0 01 movw r30, r0 33d94: 72 9f mul r23, r18 33d96: bb 27 eor r27, r27 33d98: f0 0d add r31, r0 33d9a: b1 1d adc r27, r1 33d9c: 63 9f mul r22, r19 33d9e: aa 27 eor r26, r26 33da0: f0 0d add r31, r0 33da2: b1 1d adc r27, r1 33da4: aa 1f adc r26, r26 33da6: 64 9f mul r22, r20 33da8: 66 27 eor r22, r22 33daa: b0 0d add r27, r0 33dac: a1 1d adc r26, r1 33dae: 66 1f adc r22, r22 33db0: 82 9f mul r24, r18 33db2: 22 27 eor r18, r18 33db4: b0 0d add r27, r0 33db6: a1 1d adc r26, r1 33db8: 62 1f adc r22, r18 33dba: 73 9f mul r23, r19 33dbc: b0 0d add r27, r0 33dbe: a1 1d adc r26, r1 33dc0: 62 1f adc r22, r18 33dc2: 83 9f mul r24, r19 33dc4: a0 0d add r26, r0 33dc6: 61 1d adc r22, r1 33dc8: 22 1f adc r18, r18 33dca: 74 9f mul r23, r20 33dcc: 33 27 eor r19, r19 33dce: a0 0d add r26, r0 33dd0: 61 1d adc r22, r1 33dd2: 23 1f adc r18, r19 33dd4: 84 9f mul r24, r20 33dd6: 60 0d add r22, r0 33dd8: 21 1d adc r18, r1 33dda: 82 2f mov r24, r18 33ddc: 76 2f mov r23, r22 33dde: 6a 2f mov r22, r26 33de0: 11 24 eor r1, r1 33de2: 9f 57 subi r25, 0x7F ; 127 33de4: 50 40 sbci r21, 0x00 ; 0 33de6: 9a f0 brmi .+38 ; 0x33e0e <__mulsf3_pse+0x88> 33de8: f1 f0 breq .+60 ; 0x33e26 <__mulsf3_pse+0xa0> 33dea: 88 23 and r24, r24 33dec: 4a f0 brmi .+18 ; 0x33e00 <__mulsf3_pse+0x7a> 33dee: ee 0f add r30, r30 33df0: ff 1f adc r31, r31 33df2: bb 1f adc r27, r27 33df4: 66 1f adc r22, r22 33df6: 77 1f adc r23, r23 33df8: 88 1f adc r24, r24 33dfa: 91 50 subi r25, 0x01 ; 1 33dfc: 50 40 sbci r21, 0x00 ; 0 33dfe: a9 f7 brne .-22 ; 0x33dea <__mulsf3_pse+0x64> 33e00: 9e 3f cpi r25, 0xFE ; 254 33e02: 51 05 cpc r21, r1 33e04: 80 f0 brcs .+32 ; 0x33e26 <__mulsf3_pse+0xa0> 33e06: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 33e0a: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 33e0e: 5f 3f cpi r21, 0xFF ; 255 33e10: e4 f3 brlt .-8 ; 0x33e0a <__mulsf3_pse+0x84> 33e12: 98 3e cpi r25, 0xE8 ; 232 33e14: d4 f3 brlt .-12 ; 0x33e0a <__mulsf3_pse+0x84> 33e16: 86 95 lsr r24 33e18: 77 95 ror r23 33e1a: 67 95 ror r22 33e1c: b7 95 ror r27 33e1e: f7 95 ror r31 33e20: e7 95 ror r30 33e22: 9f 5f subi r25, 0xFF ; 255 33e24: c1 f7 brne .-16 ; 0x33e16 <__mulsf3_pse+0x90> 33e26: fe 2b or r31, r30 33e28: 88 0f add r24, r24 33e2a: 91 1d adc r25, r1 33e2c: 96 95 lsr r25 33e2e: 87 95 ror r24 33e30: 97 f9 bld r25, 7 33e32: 08 95 ret 00033e34 <__fp_inf>: 33e34: 97 f9 bld r25, 7 33e36: 9f 67 ori r25, 0x7F ; 127 33e38: 80 e8 ldi r24, 0x80 ; 128 33e3a: 70 e0 ldi r23, 0x00 ; 0 33e3c: 60 e0 ldi r22, 0x00 ; 0 33e3e: 08 95 ret 00033e40 <__fp_nan>: 33e40: 9f ef ldi r25, 0xFF ; 255 33e42: 80 ec ldi r24, 0xC0 ; 192 33e44: 08 95 ret 00033e46 <__fp_pscA>: 33e46: 00 24 eor r0, r0 33e48: 0a 94 dec r0 33e4a: 16 16 cp r1, r22 33e4c: 17 06 cpc r1, r23 33e4e: 18 06 cpc r1, r24 33e50: 09 06 cpc r0, r25 33e52: 08 95 ret 00033e54 <__fp_pscB>: 33e54: 00 24 eor r0, r0 33e56: 0a 94 dec r0 33e58: 12 16 cp r1, r18 33e5a: 13 06 cpc r1, r19 33e5c: 14 06 cpc r1, r20 33e5e: 05 06 cpc r0, r21 33e60: 08 95 ret 00033e62 <__fp_round>: 33e62: 09 2e mov r0, r25 33e64: 03 94 inc r0 33e66: 00 0c add r0, r0 33e68: 11 f4 brne .+4 ; 0x33e6e <__fp_round+0xc> 33e6a: 88 23 and r24, r24 33e6c: 52 f0 brmi .+20 ; 0x33e82 <__fp_round+0x20> 33e6e: bb 0f add r27, r27 33e70: 40 f4 brcc .+16 ; 0x33e82 <__fp_round+0x20> 33e72: bf 2b or r27, r31 33e74: 11 f4 brne .+4 ; 0x33e7a <__fp_round+0x18> 33e76: 60 ff sbrs r22, 0 33e78: 04 c0 rjmp .+8 ; 0x33e82 <__fp_round+0x20> 33e7a: 6f 5f subi r22, 0xFF ; 255 33e7c: 7f 4f sbci r23, 0xFF ; 255 33e7e: 8f 4f sbci r24, 0xFF ; 255 33e80: 9f 4f sbci r25, 0xFF ; 255 33e82: 08 95 ret 00033e84 <__fp_split3>: 33e84: 57 fd sbrc r21, 7 33e86: 90 58 subi r25, 0x80 ; 128 33e88: 44 0f add r20, r20 33e8a: 55 1f adc r21, r21 33e8c: 59 f0 breq .+22 ; 0x33ea4 <__fp_splitA+0x10> 33e8e: 5f 3f cpi r21, 0xFF ; 255 33e90: 71 f0 breq .+28 ; 0x33eae <__fp_splitA+0x1a> 33e92: 47 95 ror r20 00033e94 <__fp_splitA>: 33e94: 88 0f add r24, r24 33e96: 97 fb bst r25, 7 33e98: 99 1f adc r25, r25 33e9a: 61 f0 breq .+24 ; 0x33eb4 <__fp_splitA+0x20> 33e9c: 9f 3f cpi r25, 0xFF ; 255 33e9e: 79 f0 breq .+30 ; 0x33ebe <__fp_splitA+0x2a> 33ea0: 87 95 ror r24 33ea2: 08 95 ret 33ea4: 12 16 cp r1, r18 33ea6: 13 06 cpc r1, r19 33ea8: 14 06 cpc r1, r20 33eaa: 55 1f adc r21, r21 33eac: f2 cf rjmp .-28 ; 0x33e92 <__fp_split3+0xe> 33eae: 46 95 lsr r20 33eb0: f1 df rcall .-30 ; 0x33e94 <__fp_splitA> 33eb2: 08 c0 rjmp .+16 ; 0x33ec4 <__fp_splitA+0x30> 33eb4: 16 16 cp r1, r22 33eb6: 17 06 cpc r1, r23 33eb8: 18 06 cpc r1, r24 33eba: 99 1f adc r25, r25 33ebc: f1 cf rjmp .-30 ; 0x33ea0 <__fp_splitA+0xc> 33ebe: 86 95 lsr r24 33ec0: 71 05 cpc r23, r1 33ec2: 61 05 cpc r22, r1 33ec4: 08 94 sec 33ec6: 08 95 ret 00033ec8 <__fp_zero>: 33ec8: e8 94 clt 00033eca <__fp_szero>: 33eca: bb 27 eor r27, r27 33ecc: 66 27 eor r22, r22 33ece: 77 27 eor r23, r23 33ed0: cb 01 movw r24, r22 33ed2: 97 f9 bld r25, 7 33ed4: 08 95 ret 00033ed6 : 33ed6: 3f 92 push r3 33ed8: 4f 92 push r4 33eda: 5f 92 push r5 33edc: 6f 92 push r6 33ede: 7f 92 push r7 33ee0: 8f 92 push r8 33ee2: 9f 92 push r9 33ee4: af 92 push r10 33ee6: bf 92 push r11 33ee8: cf 92 push r12 33eea: df 92 push r13 33eec: ef 92 push r14 33eee: ff 92 push r15 33ef0: 0f 93 push r16 33ef2: 1f 93 push r17 33ef4: cf 93 push r28 33ef6: df 93 push r29 33ef8: 5c 01 movw r10, r24 33efa: 6b 01 movw r12, r22 33efc: 7a 01 movw r14, r20 33efe: 61 15 cp r22, r1 33f00: 71 05 cpc r23, r1 33f02: 19 f0 breq .+6 ; 0x33f0a 33f04: fb 01 movw r30, r22 33f06: 91 83 std Z+1, r25 ; 0x01 33f08: 80 83 st Z, r24 33f0a: e1 14 cp r14, r1 33f0c: f1 04 cpc r15, r1 33f0e: 51 f0 breq .+20 ; 0x33f24 33f10: c7 01 movw r24, r14 33f12: 02 97 sbiw r24, 0x02 ; 2 33f14: 83 97 sbiw r24, 0x23 ; 35 33f16: 30 f0 brcs .+12 ; 0x33f24 33f18: 40 e0 ldi r20, 0x00 ; 0 33f1a: 30 e0 ldi r19, 0x00 ; 0 33f1c: 20 e0 ldi r18, 0x00 ; 0 33f1e: 90 e0 ldi r25, 0x00 ; 0 33f20: 6b c0 rjmp .+214 ; 0x33ff8 33f22: 5e 01 movw r10, r28 33f24: e5 01 movw r28, r10 33f26: 21 96 adiw r28, 0x01 ; 1 33f28: f5 01 movw r30, r10 33f2a: 10 81 ld r17, Z 33f2c: 81 2f mov r24, r17 33f2e: 90 e0 ldi r25, 0x00 ; 0 33f30: 0f 94 71 a1 call 0x342e2 ; 0x342e2 33f34: 89 2b or r24, r25 33f36: a9 f7 brne .-22 ; 0x33f22 33f38: 1d 32 cpi r17, 0x2D ; 45 33f3a: 01 f5 brne .+64 ; 0x33f7c 33f3c: 21 96 adiw r28, 0x01 ; 1 33f3e: f5 01 movw r30, r10 33f40: 11 81 ldd r17, Z+1 ; 0x01 33f42: 01 e0 ldi r16, 0x01 ; 1 33f44: e1 14 cp r14, r1 33f46: f1 04 cpc r15, r1 33f48: 09 f4 brne .+2 ; 0x33f4c 33f4a: e6 c0 rjmp .+460 ; 0x34118 33f4c: f0 e1 ldi r31, 0x10 ; 16 33f4e: ef 16 cp r14, r31 33f50: f1 04 cpc r15, r1 33f52: 09 f0 breq .+2 ; 0x33f56 33f54: 88 c0 rjmp .+272 ; 0x34066 33f56: 10 33 cpi r17, 0x30 ; 48 33f58: 59 f4 brne .+22 ; 0x33f70 33f5a: 88 81 ld r24, Y 33f5c: 8f 7d andi r24, 0xDF ; 223 33f5e: 88 35 cpi r24, 0x58 ; 88 33f60: 09 f0 breq .+2 ; 0x33f64 33f62: 7c c0 rjmp .+248 ; 0x3405c 33f64: 19 81 ldd r17, Y+1 ; 0x01 33f66: 22 96 adiw r28, 0x02 ; 2 33f68: 02 60 ori r16, 0x02 ; 2 33f6a: f0 e1 ldi r31, 0x10 ; 16 33f6c: ef 2e mov r14, r31 33f6e: f1 2c mov r15, r1 33f70: 81 2c mov r8, r1 33f72: 91 2c mov r9, r1 33f74: a1 2c mov r10, r1 33f76: 88 e0 ldi r24, 0x08 ; 8 33f78: b8 2e mov r11, r24 33f7a: 92 c0 rjmp .+292 ; 0x340a0 33f7c: 1b 32 cpi r17, 0x2B ; 43 33f7e: 21 f4 brne .+8 ; 0x33f88 33f80: e5 01 movw r28, r10 33f82: 22 96 adiw r28, 0x02 ; 2 33f84: f5 01 movw r30, r10 33f86: 11 81 ldd r17, Z+1 ; 0x01 33f88: 00 e0 ldi r16, 0x00 ; 0 33f8a: dc cf rjmp .-72 ; 0x33f44 33f8c: ea e0 ldi r30, 0x0A ; 10 33f8e: ee 16 cp r14, r30 33f90: f1 04 cpc r15, r1 33f92: 09 f4 brne .+2 ; 0x33f96 33f94: c7 c0 rjmp .+398 ; 0x34124 33f96: f0 e1 ldi r31, 0x10 ; 16 33f98: ef 16 cp r14, r31 33f9a: f1 04 cpc r15, r1 33f9c: 09 f0 breq .+2 ; 0x33fa0 33f9e: 73 c0 rjmp .+230 ; 0x34086 33fa0: e7 cf rjmp .-50 ; 0x33f70 33fa2: 78 e0 ldi r23, 0x08 ; 8 33fa4: e7 2e mov r14, r23 33fa6: f1 2c mov r15, r1 33fa8: 81 2c mov r8, r1 33faa: 91 2c mov r9, r1 33fac: a1 2c mov r10, r1 33fae: 60 e1 ldi r22, 0x10 ; 16 33fb0: b6 2e mov r11, r22 33fb2: 76 c0 rjmp .+236 ; 0x340a0 33fb4: 21 e0 ldi r18, 0x01 ; 1 33fb6: ad c0 rjmp .+346 ; 0x34112 33fb8: 30 2f mov r19, r16 33fba: 31 70 andi r19, 0x01 ; 1 33fbc: c1 14 cp r12, r1 33fbe: d1 04 cpc r13, r1 33fc0: 31 f0 breq .+12 ; 0x33fce 33fc2: 22 23 and r18, r18 33fc4: 71 f1 breq .+92 ; 0x34022 33fc6: 21 97 sbiw r28, 0x01 ; 1 33fc8: f6 01 movw r30, r12 33fca: d1 83 std Z+1, r29 ; 0x01 33fcc: c0 83 st Z, r28 33fce: 27 ff sbrs r18, 7 33fd0: 2e c0 rjmp .+92 ; 0x3402e 33fd2: 60 e0 ldi r22, 0x00 ; 0 33fd4: 70 e0 ldi r23, 0x00 ; 0 33fd6: 80 e0 ldi r24, 0x00 ; 0 33fd8: 90 e8 ldi r25, 0x80 ; 128 33fda: 31 11 cpse r19, r1 33fdc: 04 c0 rjmp .+8 ; 0x33fe6 33fde: 6f ef ldi r22, 0xFF ; 255 33fe0: 7f ef ldi r23, 0xFF ; 255 33fe2: 8f ef ldi r24, 0xFF ; 255 33fe4: 9f e7 ldi r25, 0x7F ; 127 33fe6: 22 e2 ldi r18, 0x22 ; 34 33fe8: 30 e0 ldi r19, 0x00 ; 0 33fea: 30 93 0c 17 sts 0x170C, r19 ; 0x80170c 33fee: 20 93 0b 17 sts 0x170B, r18 ; 0x80170b 33ff2: 46 2f mov r20, r22 33ff4: 37 2f mov r19, r23 33ff6: 28 2f mov r18, r24 33ff8: 64 2f mov r22, r20 33ffa: 73 2f mov r23, r19 33ffc: 82 2f mov r24, r18 33ffe: df 91 pop r29 34000: cf 91 pop r28 34002: 1f 91 pop r17 34004: 0f 91 pop r16 34006: ff 90 pop r15 34008: ef 90 pop r14 3400a: df 90 pop r13 3400c: cf 90 pop r12 3400e: bf 90 pop r11 34010: af 90 pop r10 34012: 9f 90 pop r9 34014: 8f 90 pop r8 34016: 7f 90 pop r7 34018: 6f 90 pop r6 3401a: 5f 90 pop r5 3401c: 4f 90 pop r4 3401e: 3f 90 pop r3 34020: 08 95 ret 34022: 01 ff sbrs r16, 1 34024: 04 c0 rjmp .+8 ; 0x3402e 34026: 22 97 sbiw r28, 0x02 ; 2 34028: f6 01 movw r30, r12 3402a: d1 83 std Z+1, r29 ; 0x01 3402c: c0 83 st Z, r28 3402e: 33 23 and r19, r19 34030: 41 f0 breq .+16 ; 0x34042 34032: 90 95 com r25 34034: 80 95 com r24 34036: 70 95 com r23 34038: 61 95 neg r22 3403a: 7f 4f sbci r23, 0xFF ; 255 3403c: 8f 4f sbci r24, 0xFF ; 255 3403e: 9f 4f sbci r25, 0xFF ; 255 34040: d8 cf rjmp .-80 ; 0x33ff2 34042: 97 ff sbrs r25, 7 34044: d6 cf rjmp .-84 ; 0x33ff2 34046: 82 e2 ldi r24, 0x22 ; 34 34048: 90 e0 ldi r25, 0x00 ; 0 3404a: 90 93 0c 17 sts 0x170C, r25 ; 0x80170c 3404e: 80 93 0b 17 sts 0x170B, r24 ; 0x80170b 34052: 6f ef ldi r22, 0xFF ; 255 34054: 7f ef ldi r23, 0xFF ; 255 34056: 8f ef ldi r24, 0xFF ; 255 34058: 9f e7 ldi r25, 0x7F ; 127 3405a: cb cf rjmp .-106 ; 0x33ff2 3405c: 10 e3 ldi r17, 0x30 ; 48 3405e: e1 14 cp r14, r1 34060: f1 04 cpc r15, r1 34062: 09 f4 brne .+2 ; 0x34066 34064: 9e cf rjmp .-196 ; 0x33fa2 34066: 28 e0 ldi r18, 0x08 ; 8 34068: e2 16 cp r14, r18 3406a: f1 04 cpc r15, r1 3406c: 09 f4 brne .+2 ; 0x34070 3406e: 9c cf rjmp .-200 ; 0x33fa8 34070: 0c f0 brlt .+2 ; 0x34074 34072: 8c cf rjmp .-232 ; 0x33f8c 34074: 81 2c mov r8, r1 34076: 91 2c mov r9, r1 34078: a1 2c mov r10, r1 3407a: e0 e4 ldi r30, 0x40 ; 64 3407c: be 2e mov r11, r30 3407e: 82 e0 ldi r24, 0x02 ; 2 34080: e8 16 cp r14, r24 34082: f1 04 cpc r15, r1 34084: 69 f0 breq .+26 ; 0x340a0 34086: 60 e0 ldi r22, 0x00 ; 0 34088: 70 e0 ldi r23, 0x00 ; 0 3408a: 80 e0 ldi r24, 0x00 ; 0 3408c: 90 e8 ldi r25, 0x80 ; 128 3408e: 97 01 movw r18, r14 34090: 0f 2c mov r0, r15 34092: 00 0c add r0, r0 34094: 44 0b sbc r20, r20 34096: 55 0b sbc r21, r21 34098: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 3409c: 49 01 movw r8, r18 3409e: 5a 01 movw r10, r20 340a0: 20 e0 ldi r18, 0x00 ; 0 340a2: 60 e0 ldi r22, 0x00 ; 0 340a4: 70 e0 ldi r23, 0x00 ; 0 340a6: cb 01 movw r24, r22 340a8: 27 01 movw r4, r14 340aa: 0f 2c mov r0, r15 340ac: 00 0c add r0, r0 340ae: 66 08 sbc r6, r6 340b0: 77 08 sbc r7, r7 340b2: fe 01 movw r30, r28 340b4: 50 ed ldi r21, 0xD0 ; 208 340b6: 35 2e mov r3, r21 340b8: 31 0e add r3, r17 340ba: 39 e0 ldi r19, 0x09 ; 9 340bc: 33 15 cp r19, r3 340be: 70 f4 brcc .+28 ; 0x340dc 340c0: 3f eb ldi r19, 0xBF ; 191 340c2: 31 0f add r19, r17 340c4: 49 ec ldi r20, 0xC9 ; 201 340c6: 34 2e mov r3, r20 340c8: 3a 31 cpi r19, 0x1A ; 26 340ca: 38 f0 brcs .+14 ; 0x340da 340cc: 3f e9 ldi r19, 0x9F ; 159 340ce: 31 0f add r19, r17 340d0: 3a 31 cpi r19, 0x1A ; 26 340d2: 08 f0 brcs .+2 ; 0x340d6 340d4: 71 cf rjmp .-286 ; 0x33fb8 340d6: 39 ea ldi r19, 0xA9 ; 169 340d8: 33 2e mov r3, r19 340da: 31 0e add r3, r17 340dc: 3e 14 cp r3, r14 340de: 1f 04 cpc r1, r15 340e0: 0c f0 brlt .+2 ; 0x340e4 340e2: 6a cf rjmp .-300 ; 0x33fb8 340e4: 27 fd sbrc r18, 7 340e6: 15 c0 rjmp .+42 ; 0x34112 340e8: 86 16 cp r8, r22 340ea: 97 06 cpc r9, r23 340ec: a8 06 cpc r10, r24 340ee: b9 06 cpc r11, r25 340f0: 78 f0 brcs .+30 ; 0x34110 340f2: a3 01 movw r20, r6 340f4: 92 01 movw r18, r4 340f6: 0f 94 43 a4 call 0x34886 ; 0x34886 <__mulsi3> 340fa: 63 0d add r22, r3 340fc: 71 1d adc r23, r1 340fe: 81 1d adc r24, r1 34100: 91 1d adc r25, r1 34102: 61 30 cpi r22, 0x01 ; 1 34104: 71 05 cpc r23, r1 34106: 81 05 cpc r24, r1 34108: 20 e8 ldi r18, 0x80 ; 128 3410a: 92 07 cpc r25, r18 3410c: 08 f4 brcc .+2 ; 0x34110 3410e: 52 cf rjmp .-348 ; 0x33fb4 34110: 2f ef ldi r18, 0xFF ; 255 34112: 21 96 adiw r28, 0x01 ; 1 34114: 10 81 ld r17, Z 34116: cd cf rjmp .-102 ; 0x340b2 34118: 10 33 cpi r17, 0x30 ; 48 3411a: 09 f4 brne .+2 ; 0x3411e 3411c: 1e cf rjmp .-452 ; 0x33f5a 3411e: 2a e0 ldi r18, 0x0A ; 10 34120: e2 2e mov r14, r18 34122: f1 2c mov r15, r1 34124: 9c ec ldi r25, 0xCC ; 204 34126: 89 2e mov r8, r25 34128: 98 2c mov r9, r8 3412a: a8 2c mov r10, r8 3412c: 9c e0 ldi r25, 0x0C ; 12 3412e: b9 2e mov r11, r25 34130: b7 cf rjmp .-146 ; 0x340a0 00034132 <__ftoa_engine>: 34132: 28 30 cpi r18, 0x08 ; 8 34134: 08 f0 brcs .+2 ; 0x34138 <__ftoa_engine+0x6> 34136: 27 e0 ldi r18, 0x07 ; 7 34138: 33 27 eor r19, r19 3413a: da 01 movw r26, r20 3413c: 99 0f add r25, r25 3413e: 31 1d adc r19, r1 34140: 87 fd sbrc r24, 7 34142: 91 60 ori r25, 0x01 ; 1 34144: 00 96 adiw r24, 0x00 ; 0 34146: 61 05 cpc r22, r1 34148: 71 05 cpc r23, r1 3414a: 39 f4 brne .+14 ; 0x3415a <__ftoa_engine+0x28> 3414c: 32 60 ori r19, 0x02 ; 2 3414e: 2e 5f subi r18, 0xFE ; 254 34150: 3d 93 st X+, r19 34152: 30 e3 ldi r19, 0x30 ; 48 34154: 2a 95 dec r18 34156: e1 f7 brne .-8 ; 0x34150 <__ftoa_engine+0x1e> 34158: 08 95 ret 3415a: 9f 3f cpi r25, 0xFF ; 255 3415c: 30 f0 brcs .+12 ; 0x3416a <__ftoa_engine+0x38> 3415e: 80 38 cpi r24, 0x80 ; 128 34160: 71 05 cpc r23, r1 34162: 61 05 cpc r22, r1 34164: 09 f0 breq .+2 ; 0x34168 <__ftoa_engine+0x36> 34166: 3c 5f subi r19, 0xFC ; 252 34168: 3c 5f subi r19, 0xFC ; 252 3416a: 3d 93 st X+, r19 3416c: 91 30 cpi r25, 0x01 ; 1 3416e: 08 f0 brcs .+2 ; 0x34172 <__ftoa_engine+0x40> 34170: 80 68 ori r24, 0x80 ; 128 34172: 91 1d adc r25, r1 34174: df 93 push r29 34176: cf 93 push r28 34178: 1f 93 push r17 3417a: 0f 93 push r16 3417c: ff 92 push r15 3417e: ef 92 push r14 34180: 19 2f mov r17, r25 34182: 98 7f andi r25, 0xF8 ; 248 34184: 96 95 lsr r25 34186: e9 2f mov r30, r25 34188: 96 95 lsr r25 3418a: 96 95 lsr r25 3418c: e9 0f add r30, r25 3418e: ff 27 eor r31, r31 34190: e6 52 subi r30, 0x26 ; 38 34192: fe 48 sbci r31, 0x8E ; 142 34194: 99 27 eor r25, r25 34196: 33 27 eor r19, r19 34198: ee 24 eor r14, r14 3419a: ff 24 eor r15, r15 3419c: a7 01 movw r20, r14 3419e: e7 01 movw r28, r14 341a0: 05 90 lpm r0, Z+ 341a2: 08 94 sec 341a4: 07 94 ror r0 341a6: 28 f4 brcc .+10 ; 0x341b2 <__ftoa_engine+0x80> 341a8: 36 0f add r19, r22 341aa: e7 1e adc r14, r23 341ac: f8 1e adc r15, r24 341ae: 49 1f adc r20, r25 341b0: 51 1d adc r21, r1 341b2: 66 0f add r22, r22 341b4: 77 1f adc r23, r23 341b6: 88 1f adc r24, r24 341b8: 99 1f adc r25, r25 341ba: 06 94 lsr r0 341bc: a1 f7 brne .-24 ; 0x341a6 <__ftoa_engine+0x74> 341be: 05 90 lpm r0, Z+ 341c0: 07 94 ror r0 341c2: 28 f4 brcc .+10 ; 0x341ce <__ftoa_engine+0x9c> 341c4: e7 0e add r14, r23 341c6: f8 1e adc r15, r24 341c8: 49 1f adc r20, r25 341ca: 56 1f adc r21, r22 341cc: c1 1d adc r28, r1 341ce: 77 0f add r23, r23 341d0: 88 1f adc r24, r24 341d2: 99 1f adc r25, r25 341d4: 66 1f adc r22, r22 341d6: 06 94 lsr r0 341d8: a1 f7 brne .-24 ; 0x341c2 <__ftoa_engine+0x90> 341da: 05 90 lpm r0, Z+ 341dc: 07 94 ror r0 341de: 28 f4 brcc .+10 ; 0x341ea <__ftoa_engine+0xb8> 341e0: f8 0e add r15, r24 341e2: 49 1f adc r20, r25 341e4: 56 1f adc r21, r22 341e6: c7 1f adc r28, r23 341e8: d1 1d adc r29, r1 341ea: 88 0f add r24, r24 341ec: 99 1f adc r25, r25 341ee: 66 1f adc r22, r22 341f0: 77 1f adc r23, r23 341f2: 06 94 lsr r0 341f4: a1 f7 brne .-24 ; 0x341de <__ftoa_engine+0xac> 341f6: 05 90 lpm r0, Z+ 341f8: 07 94 ror r0 341fa: 20 f4 brcc .+8 ; 0x34204 <__ftoa_engine+0xd2> 341fc: 49 0f add r20, r25 341fe: 56 1f adc r21, r22 34200: c7 1f adc r28, r23 34202: d8 1f adc r29, r24 34204: 99 0f add r25, r25 34206: 66 1f adc r22, r22 34208: 77 1f adc r23, r23 3420a: 88 1f adc r24, r24 3420c: 06 94 lsr r0 3420e: a9 f7 brne .-22 ; 0x341fa <__ftoa_engine+0xc8> 34210: 84 91 lpm r24, Z 34212: 10 95 com r17 34214: 17 70 andi r17, 0x07 ; 7 34216: 41 f0 breq .+16 ; 0x34228 <__ftoa_engine+0xf6> 34218: d6 95 lsr r29 3421a: c7 95 ror r28 3421c: 57 95 ror r21 3421e: 47 95 ror r20 34220: f7 94 ror r15 34222: e7 94 ror r14 34224: 1a 95 dec r17 34226: c1 f7 brne .-16 ; 0x34218 <__ftoa_engine+0xe6> 34228: e0 e8 ldi r30, 0x80 ; 128 3422a: f1 e7 ldi r31, 0x71 ; 113 3422c: 68 94 set 3422e: 15 90 lpm r1, Z+ 34230: 15 91 lpm r17, Z+ 34232: 35 91 lpm r19, Z+ 34234: 65 91 lpm r22, Z+ 34236: 95 91 lpm r25, Z+ 34238: 05 90 lpm r0, Z+ 3423a: 7f e2 ldi r23, 0x2F ; 47 3423c: 73 95 inc r23 3423e: e1 18 sub r14, r1 34240: f1 0a sbc r15, r17 34242: 43 0b sbc r20, r19 34244: 56 0b sbc r21, r22 34246: c9 0b sbc r28, r25 34248: d0 09 sbc r29, r0 3424a: c0 f7 brcc .-16 ; 0x3423c <__ftoa_engine+0x10a> 3424c: e1 0c add r14, r1 3424e: f1 1e adc r15, r17 34250: 43 1f adc r20, r19 34252: 56 1f adc r21, r22 34254: c9 1f adc r28, r25 34256: d0 1d adc r29, r0 34258: 7e f4 brtc .+30 ; 0x34278 <__ftoa_engine+0x146> 3425a: 70 33 cpi r23, 0x30 ; 48 3425c: 11 f4 brne .+4 ; 0x34262 <__ftoa_engine+0x130> 3425e: 8a 95 dec r24 34260: e6 cf rjmp .-52 ; 0x3422e <__ftoa_engine+0xfc> 34262: e8 94 clt 34264: 01 50 subi r16, 0x01 ; 1 34266: 30 f0 brcs .+12 ; 0x34274 <__ftoa_engine+0x142> 34268: 08 0f add r16, r24 3426a: 0a f4 brpl .+2 ; 0x3426e <__ftoa_engine+0x13c> 3426c: 00 27 eor r16, r16 3426e: 02 17 cp r16, r18 34270: 08 f4 brcc .+2 ; 0x34274 <__ftoa_engine+0x142> 34272: 20 2f mov r18, r16 34274: 23 95 inc r18 34276: 02 2f mov r16, r18 34278: 7a 33 cpi r23, 0x3A ; 58 3427a: 28 f0 brcs .+10 ; 0x34286 <__ftoa_engine+0x154> 3427c: 79 e3 ldi r23, 0x39 ; 57 3427e: 7d 93 st X+, r23 34280: 2a 95 dec r18 34282: e9 f7 brne .-6 ; 0x3427e <__ftoa_engine+0x14c> 34284: 10 c0 rjmp .+32 ; 0x342a6 <__ftoa_engine+0x174> 34286: 7d 93 st X+, r23 34288: 2a 95 dec r18 3428a: 89 f6 brne .-94 ; 0x3422e <__ftoa_engine+0xfc> 3428c: 06 94 lsr r0 3428e: 97 95 ror r25 34290: 67 95 ror r22 34292: 37 95 ror r19 34294: 17 95 ror r17 34296: 17 94 ror r1 34298: e1 18 sub r14, r1 3429a: f1 0a sbc r15, r17 3429c: 43 0b sbc r20, r19 3429e: 56 0b sbc r21, r22 342a0: c9 0b sbc r28, r25 342a2: d0 09 sbc r29, r0 342a4: 98 f0 brcs .+38 ; 0x342cc <__ftoa_engine+0x19a> 342a6: 23 95 inc r18 342a8: 7e 91 ld r23, -X 342aa: 73 95 inc r23 342ac: 7a 33 cpi r23, 0x3A ; 58 342ae: 08 f0 brcs .+2 ; 0x342b2 <__ftoa_engine+0x180> 342b0: 70 e3 ldi r23, 0x30 ; 48 342b2: 7c 93 st X, r23 342b4: 20 13 cpse r18, r16 342b6: b8 f7 brcc .-18 ; 0x342a6 <__ftoa_engine+0x174> 342b8: 7e 91 ld r23, -X 342ba: 70 61 ori r23, 0x10 ; 16 342bc: 7d 93 st X+, r23 342be: 30 f0 brcs .+12 ; 0x342cc <__ftoa_engine+0x19a> 342c0: 83 95 inc r24 342c2: 71 e3 ldi r23, 0x31 ; 49 342c4: 7d 93 st X+, r23 342c6: 70 e3 ldi r23, 0x30 ; 48 342c8: 2a 95 dec r18 342ca: e1 f7 brne .-8 ; 0x342c4 <__ftoa_engine+0x192> 342cc: 11 24 eor r1, r1 342ce: ef 90 pop r14 342d0: ff 90 pop r15 342d2: 0f 91 pop r16 342d4: 1f 91 pop r17 342d6: cf 91 pop r28 342d8: df 91 pop r29 342da: 99 27 eor r25, r25 342dc: 87 fd sbrc r24, 7 342de: 90 95 com r25 342e0: 08 95 ret 000342e2 : 342e2: 91 11 cpse r25, r1 342e4: 0d 94 cd a3 jmp 0x3479a ; 0x3479a <__ctype_isfalse> 342e8: 80 32 cpi r24, 0x20 ; 32 342ea: 19 f0 breq .+6 ; 0x342f2 342ec: 89 50 subi r24, 0x09 ; 9 342ee: 85 50 subi r24, 0x05 ; 5 342f0: c8 f7 brcc .-14 ; 0x342e4 342f2: 08 95 ret 000342f4 : 342f4: fb 01 movw r30, r22 342f6: dc 01 movw r26, r24 342f8: 02 c0 rjmp .+4 ; 0x342fe 342fa: 05 90 lpm r0, Z+ 342fc: 0d 92 st X+, r0 342fe: 41 50 subi r20, 0x01 ; 1 34300: 50 40 sbci r21, 0x00 ; 0 34302: d8 f7 brcc .-10 ; 0x342fa 34304: 08 95 ret 00034306 : 34306: fb 01 movw r30, r22 34308: dc 01 movw r26, r24 3430a: 0d 90 ld r0, X+ 3430c: 00 20 and r0, r0 3430e: e9 f7 brne .-6 ; 0x3430a 34310: 11 97 sbiw r26, 0x01 ; 1 34312: 05 90 lpm r0, Z+ 34314: 0d 92 st X+, r0 34316: 00 20 and r0, r0 34318: e1 f7 brne .-8 ; 0x34312 3431a: 08 95 ret 0003431c : 3431c: fb 01 movw r30, r22 3431e: dc 01 movw r26, r24 34320: 8d 91 ld r24, X+ 34322: 05 90 lpm r0, Z+ 34324: 80 19 sub r24, r0 34326: 01 10 cpse r0, r1 34328: d9 f3 breq .-10 ; 0x34320 3432a: 99 0b sbc r25, r25 3432c: 08 95 ret 0003432e : 3432e: fb 01 movw r30, r22 34330: dc 01 movw r26, r24 34332: 05 90 lpm r0, Z+ 34334: 0d 92 st X+, r0 34336: 00 20 and r0, r0 34338: e1 f7 brne .-8 ; 0x34332 3433a: 08 95 ret 0003433c <__strlen_P>: 3433c: fc 01 movw r30, r24 3433e: 05 90 lpm r0, Z+ 34340: 00 20 and r0, r0 34342: e9 f7 brne .-6 ; 0x3433e <__strlen_P+0x2> 34344: 80 95 com r24 34346: 90 95 com r25 34348: 8e 0f add r24, r30 3434a: 9f 1f adc r25, r31 3434c: 08 95 ret 0003434e : 3434e: fb 01 movw r30, r22 34350: dc 01 movw r26, r24 34352: 41 50 subi r20, 0x01 ; 1 34354: 50 40 sbci r21, 0x00 ; 0 34356: 88 f0 brcs .+34 ; 0x3437a 34358: 8d 91 ld r24, X+ 3435a: 81 34 cpi r24, 0x41 ; 65 3435c: 1c f0 brlt .+6 ; 0x34364 3435e: 8b 35 cpi r24, 0x5B ; 91 34360: 0c f4 brge .+2 ; 0x34364 34362: 80 5e subi r24, 0xE0 ; 224 34364: 65 91 lpm r22, Z+ 34366: 61 34 cpi r22, 0x41 ; 65 34368: 1c f0 brlt .+6 ; 0x34370 3436a: 6b 35 cpi r22, 0x5B ; 91 3436c: 0c f4 brge .+2 ; 0x34370 3436e: 60 5e subi r22, 0xE0 ; 224 34370: 86 1b sub r24, r22 34372: 61 11 cpse r22, r1 34374: 71 f3 breq .-36 ; 0x34352 34376: 99 0b sbc r25, r25 34378: 08 95 ret 3437a: 88 1b sub r24, r24 3437c: fc cf rjmp .-8 ; 0x34376 0003437e : 3437e: fb 01 movw r30, r22 34380: dc 01 movw r26, r24 34382: 41 50 subi r20, 0x01 ; 1 34384: 50 40 sbci r21, 0x00 ; 0 34386: 30 f0 brcs .+12 ; 0x34394 34388: 8d 91 ld r24, X+ 3438a: 05 90 lpm r0, Z+ 3438c: 80 19 sub r24, r0 3438e: 19 f4 brne .+6 ; 0x34396 34390: 00 20 and r0, r0 34392: b9 f7 brne .-18 ; 0x34382 34394: 88 1b sub r24, r24 34396: 99 0b sbc r25, r25 34398: 08 95 ret 0003439a : 3439a: fb 01 movw r30, r22 3439c: dc 01 movw r26, r24 3439e: 41 50 subi r20, 0x01 ; 1 343a0: 50 40 sbci r21, 0x00 ; 0 343a2: 48 f0 brcs .+18 ; 0x343b6 343a4: 05 90 lpm r0, Z+ 343a6: 0d 92 st X+, r0 343a8: 00 20 and r0, r0 343aa: c9 f7 brne .-14 ; 0x3439e 343ac: 01 c0 rjmp .+2 ; 0x343b0 343ae: 1d 92 st X+, r1 343b0: 41 50 subi r20, 0x01 ; 1 343b2: 50 40 sbci r21, 0x00 ; 0 343b4: e0 f7 brcc .-8 ; 0x343ae 343b6: 08 95 ret 000343b8 : 343b8: fc 01 movw r30, r24 343ba: 05 90 lpm r0, Z+ 343bc: 61 50 subi r22, 0x01 ; 1 343be: 70 40 sbci r23, 0x00 ; 0 343c0: 01 10 cpse r0, r1 343c2: d8 f7 brcc .-10 ; 0x343ba 343c4: 80 95 com r24 343c6: 90 95 com r25 343c8: 8e 0f add r24, r30 343ca: 9f 1f adc r25, r31 343cc: 08 95 ret 000343ce : 343ce: fb 01 movw r30, r22 343d0: 55 91 lpm r21, Z+ 343d2: 55 23 and r21, r21 343d4: a9 f0 breq .+42 ; 0x34400 343d6: bf 01 movw r22, r30 343d8: dc 01 movw r26, r24 343da: 4d 91 ld r20, X+ 343dc: 45 17 cp r20, r21 343de: 41 11 cpse r20, r1 343e0: e1 f7 brne .-8 ; 0x343da 343e2: 59 f4 brne .+22 ; 0x343fa 343e4: cd 01 movw r24, r26 343e6: 05 90 lpm r0, Z+ 343e8: 00 20 and r0, r0 343ea: 49 f0 breq .+18 ; 0x343fe 343ec: 4d 91 ld r20, X+ 343ee: 40 15 cp r20, r0 343f0: 41 11 cpse r20, r1 343f2: c9 f3 breq .-14 ; 0x343e6 343f4: fb 01 movw r30, r22 343f6: 41 11 cpse r20, r1 343f8: ef cf rjmp .-34 ; 0x343d8 343fa: 81 e0 ldi r24, 0x01 ; 1 343fc: 90 e0 ldi r25, 0x00 ; 0 343fe: 01 97 sbiw r24, 0x01 ; 1 34400: 08 95 ret 00034402 : 34402: fc 01 movw r30, r24 34404: 61 50 subi r22, 0x01 ; 1 34406: 70 40 sbci r23, 0x00 ; 0 34408: 01 90 ld r0, Z+ 3440a: 01 10 cpse r0, r1 3440c: d8 f7 brcc .-10 ; 0x34404 3440e: 80 95 com r24 34410: 90 95 com r25 34412: 8e 0f add r24, r30 34414: 9f 1f adc r25, r31 34416: 08 95 ret 00034418 : 34418: cf 93 push r28 3441a: df 93 push r29 3441c: ec 01 movw r28, r24 3441e: 2b 81 ldd r18, Y+3 ; 0x03 34420: 20 ff sbrs r18, 0 34422: 1a c0 rjmp .+52 ; 0x34458 34424: 26 ff sbrs r18, 6 34426: 0c c0 rjmp .+24 ; 0x34440 34428: 2f 7b andi r18, 0xBF ; 191 3442a: 2b 83 std Y+3, r18 ; 0x03 3442c: 8e 81 ldd r24, Y+6 ; 0x06 3442e: 9f 81 ldd r25, Y+7 ; 0x07 34430: 01 96 adiw r24, 0x01 ; 1 34432: 9f 83 std Y+7, r25 ; 0x07 34434: 8e 83 std Y+6, r24 ; 0x06 34436: 8a 81 ldd r24, Y+2 ; 0x02 34438: 90 e0 ldi r25, 0x00 ; 0 3443a: df 91 pop r29 3443c: cf 91 pop r28 3443e: 08 95 ret 34440: 22 ff sbrs r18, 2 34442: 18 c0 rjmp .+48 ; 0x34474 34444: e8 81 ld r30, Y 34446: f9 81 ldd r31, Y+1 ; 0x01 34448: 80 81 ld r24, Z 3444a: 08 2e mov r0, r24 3444c: 00 0c add r0, r0 3444e: 99 0b sbc r25, r25 34450: 00 97 sbiw r24, 0x00 ; 0 34452: 29 f4 brne .+10 ; 0x3445e 34454: 20 62 ori r18, 0x20 ; 32 34456: 2b 83 std Y+3, r18 ; 0x03 34458: 8f ef ldi r24, 0xFF ; 255 3445a: 9f ef ldi r25, 0xFF ; 255 3445c: ee cf rjmp .-36 ; 0x3443a 3445e: 31 96 adiw r30, 0x01 ; 1 34460: f9 83 std Y+1, r31 ; 0x01 34462: e8 83 st Y, r30 34464: 2e 81 ldd r18, Y+6 ; 0x06 34466: 3f 81 ldd r19, Y+7 ; 0x07 34468: 2f 5f subi r18, 0xFF ; 255 3446a: 3f 4f sbci r19, 0xFF ; 255 3446c: 3f 83 std Y+7, r19 ; 0x07 3446e: 2e 83 std Y+6, r18 ; 0x06 34470: 99 27 eor r25, r25 34472: e3 cf rjmp .-58 ; 0x3443a 34474: ea 85 ldd r30, Y+10 ; 0x0a 34476: fb 85 ldd r31, Y+11 ; 0x0b 34478: 19 95 eicall 3447a: 97 ff sbrs r25, 7 3447c: f3 cf rjmp .-26 ; 0x34464 3447e: 2b 81 ldd r18, Y+3 ; 0x03 34480: 01 96 adiw r24, 0x01 ; 1 34482: 21 f0 breq .+8 ; 0x3448c 34484: 80 e2 ldi r24, 0x20 ; 32 34486: 82 2b or r24, r18 34488: 8b 83 std Y+3, r24 ; 0x03 3448a: e6 cf rjmp .-52 ; 0x34458 3448c: 80 e1 ldi r24, 0x10 ; 16 3448e: fb cf rjmp .-10 ; 0x34486 00034490 : 34490: 0f 93 push r16 34492: 1f 93 push r17 34494: cf 93 push r28 34496: df 93 push r29 34498: 18 2f mov r17, r24 3449a: 09 2f mov r16, r25 3449c: eb 01 movw r28, r22 3449e: 8b 81 ldd r24, Y+3 ; 0x03 344a0: 81 fd sbrc r24, 1 344a2: 09 c0 rjmp .+18 ; 0x344b6 344a4: 1f ef ldi r17, 0xFF ; 255 344a6: 0f ef ldi r16, 0xFF ; 255 344a8: 81 2f mov r24, r17 344aa: 90 2f mov r25, r16 344ac: df 91 pop r29 344ae: cf 91 pop r28 344b0: 1f 91 pop r17 344b2: 0f 91 pop r16 344b4: 08 95 ret 344b6: 82 ff sbrs r24, 2 344b8: 14 c0 rjmp .+40 ; 0x344e2 344ba: 2e 81 ldd r18, Y+6 ; 0x06 344bc: 3f 81 ldd r19, Y+7 ; 0x07 344be: 8c 81 ldd r24, Y+4 ; 0x04 344c0: 9d 81 ldd r25, Y+5 ; 0x05 344c2: 28 17 cp r18, r24 344c4: 39 07 cpc r19, r25 344c6: 3c f4 brge .+14 ; 0x344d6 344c8: e8 81 ld r30, Y 344ca: f9 81 ldd r31, Y+1 ; 0x01 344cc: cf 01 movw r24, r30 344ce: 01 96 adiw r24, 0x01 ; 1 344d0: 99 83 std Y+1, r25 ; 0x01 344d2: 88 83 st Y, r24 344d4: 10 83 st Z, r17 344d6: 8e 81 ldd r24, Y+6 ; 0x06 344d8: 9f 81 ldd r25, Y+7 ; 0x07 344da: 01 96 adiw r24, 0x01 ; 1 344dc: 9f 83 std Y+7, r25 ; 0x07 344de: 8e 83 std Y+6, r24 ; 0x06 344e0: e3 cf rjmp .-58 ; 0x344a8 344e2: e8 85 ldd r30, Y+8 ; 0x08 344e4: f9 85 ldd r31, Y+9 ; 0x09 344e6: 81 2f mov r24, r17 344e8: 19 95 eicall 344ea: 89 2b or r24, r25 344ec: a1 f3 breq .-24 ; 0x344d6 344ee: da cf rjmp .-76 ; 0x344a4 000344f0 : 344f0: ef 92 push r14 344f2: ff 92 push r15 344f4: 0f 93 push r16 344f6: 1f 93 push r17 344f8: cf 93 push r28 344fa: df 93 push r29 344fc: 8c 01 movw r16, r24 344fe: 7b 01 movw r14, r22 34500: db 01 movw r26, r22 34502: 13 96 adiw r26, 0x03 ; 3 34504: 8c 91 ld r24, X 34506: d0 e0 ldi r29, 0x00 ; 0 34508: c0 e0 ldi r28, 0x00 ; 0 3450a: 81 fd sbrc r24, 1 3450c: 0f c0 rjmp .+30 ; 0x3452c 3450e: cf ef ldi r28, 0xFF ; 255 34510: df ef ldi r29, 0xFF ; 255 34512: 10 c0 rjmp .+32 ; 0x34534 34514: d7 01 movw r26, r14 34516: 18 96 adiw r26, 0x08 ; 8 34518: ed 91 ld r30, X+ 3451a: fc 91 ld r31, X 3451c: b7 01 movw r22, r14 3451e: 19 95 eicall 34520: 89 2b or r24, r25 34522: 11 f0 breq .+4 ; 0x34528 34524: cf ef ldi r28, 0xFF ; 255 34526: df ef ldi r29, 0xFF ; 255 34528: 0f 5f subi r16, 0xFF ; 255 3452a: 1f 4f sbci r17, 0xFF ; 255 3452c: f8 01 movw r30, r16 3452e: 84 91 lpm r24, Z 34530: 81 11 cpse r24, r1 34532: f0 cf rjmp .-32 ; 0x34514 34534: ce 01 movw r24, r28 34536: df 91 pop r29 34538: cf 91 pop r28 3453a: 1f 91 pop r17 3453c: 0f 91 pop r16 3453e: ff 90 pop r15 34540: ef 90 pop r14 34542: 08 95 ret 00034544 : 34544: 0f 93 push r16 34546: 1f 93 push r17 34548: cf 93 push r28 3454a: df 93 push r29 3454c: cd b7 in r28, 0x3d ; 61 3454e: de b7 in r29, 0x3e ; 62 34550: ae 01 movw r20, r28 34552: 48 5f subi r20, 0xF8 ; 248 34554: 5f 4f sbci r21, 0xFF ; 255 34556: da 01 movw r26, r20 34558: 6d 91 ld r22, X+ 3455a: 7d 91 ld r23, X+ 3455c: ad 01 movw r20, r26 3455e: 01 e1 ldi r16, 0x11 ; 17 34560: 17 e1 ldi r17, 0x17 ; 23 34562: f8 01 movw r30, r16 34564: 82 81 ldd r24, Z+2 ; 0x02 34566: 93 81 ldd r25, Z+3 ; 0x03 34568: dc 01 movw r26, r24 3456a: 13 96 adiw r26, 0x03 ; 3 3456c: 2c 91 ld r18, X 3456e: 13 97 sbiw r26, 0x03 ; 3 34570: 28 60 ori r18, 0x08 ; 8 34572: 13 96 adiw r26, 0x03 ; 3 34574: 2c 93 st X, r18 34576: 0e 94 27 51 call 0xa24e ; 0xa24e 3457a: d8 01 movw r26, r16 3457c: 12 96 adiw r26, 0x02 ; 2 3457e: ed 91 ld r30, X+ 34580: fc 91 ld r31, X 34582: 23 81 ldd r18, Z+3 ; 0x03 34584: 27 7f andi r18, 0xF7 ; 247 34586: 23 83 std Z+3, r18 ; 0x03 34588: df 91 pop r29 3458a: cf 91 pop r28 3458c: 1f 91 pop r17 3458e: 0f 91 pop r16 34590: 08 95 ret 00034592 : 34592: 0f 93 push r16 34594: 1f 93 push r17 34596: cf 93 push r28 34598: df 93 push r29 3459a: 8c 01 movw r16, r24 3459c: e0 91 13 17 lds r30, 0x1713 ; 0x801713 <__iob+0x2> 345a0: f0 91 14 17 lds r31, 0x1714 ; 0x801714 <__iob+0x3> 345a4: 83 81 ldd r24, Z+3 ; 0x03 345a6: d0 e0 ldi r29, 0x00 ; 0 345a8: c0 e0 ldi r28, 0x00 ; 0 345aa: 81 fd sbrc r24, 1 345ac: 0a c0 rjmp .+20 ; 0x345c2 345ae: cf ef ldi r28, 0xFF ; 255 345b0: df ef ldi r29, 0xFF ; 255 345b2: 17 c0 rjmp .+46 ; 0x345e2 345b4: 19 95 eicall 345b6: 89 2b or r24, r25 345b8: 11 f0 breq .+4 ; 0x345be 345ba: cf ef ldi r28, 0xFF ; 255 345bc: df ef ldi r29, 0xFF ; 255 345be: 0f 5f subi r16, 0xFF ; 255 345c0: 1f 4f sbci r17, 0xFF ; 255 345c2: f8 01 movw r30, r16 345c4: 84 91 lpm r24, Z 345c6: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> 345ca: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> 345ce: db 01 movw r26, r22 345d0: 18 96 adiw r26, 0x08 ; 8 345d2: ed 91 ld r30, X+ 345d4: fc 91 ld r31, X 345d6: 81 11 cpse r24, r1 345d8: ed cf rjmp .-38 ; 0x345b4 345da: 8a e0 ldi r24, 0x0A ; 10 345dc: 19 95 eicall 345de: 89 2b or r24, r25 345e0: 31 f7 brne .-52 ; 0x345ae 345e2: ce 01 movw r24, r28 345e4: df 91 pop r29 345e6: cf 91 pop r28 345e8: 1f 91 pop r17 345ea: 0f 91 pop r16 345ec: 08 95 ret 000345ee : 345ee: 0f 93 push r16 345f0: 1f 93 push r17 345f2: cf 93 push r28 345f4: df 93 push r29 345f6: cd b7 in r28, 0x3d ; 61 345f8: de b7 in r29, 0x3e ; 62 345fa: 2e 97 sbiw r28, 0x0e ; 14 345fc: 0f b6 in r0, 0x3f ; 63 345fe: f8 94 cli 34600: de bf out 0x3e, r29 ; 62 34602: 0f be out 0x3f, r0 ; 63 34604: cd bf out 0x3d, r28 ; 61 34606: 0e 89 ldd r16, Y+22 ; 0x16 34608: 1f 89 ldd r17, Y+23 ; 0x17 3460a: 8e e0 ldi r24, 0x0E ; 14 3460c: 8c 83 std Y+4, r24 ; 0x04 3460e: 1a 83 std Y+2, r17 ; 0x02 34610: 09 83 std Y+1, r16 ; 0x01 34612: 8f ef ldi r24, 0xFF ; 255 34614: 9f e7 ldi r25, 0x7F ; 127 34616: 9e 83 std Y+6, r25 ; 0x06 34618: 8d 83 std Y+5, r24 ; 0x05 3461a: ae 01 movw r20, r28 3461c: 46 5e subi r20, 0xE6 ; 230 3461e: 5f 4f sbci r21, 0xFF ; 255 34620: 68 8d ldd r22, Y+24 ; 0x18 34622: 79 8d ldd r23, Y+25 ; 0x19 34624: ce 01 movw r24, r28 34626: 01 96 adiw r24, 0x01 ; 1 34628: 0e 94 27 51 call 0xa24e ; 0xa24e 3462c: 2f 81 ldd r18, Y+7 ; 0x07 3462e: 38 85 ldd r19, Y+8 ; 0x08 34630: 02 0f add r16, r18 34632: 13 1f adc r17, r19 34634: f8 01 movw r30, r16 34636: 10 82 st Z, r1 34638: 2e 96 adiw r28, 0x0e ; 14 3463a: 0f b6 in r0, 0x3f ; 63 3463c: f8 94 cli 3463e: de bf out 0x3e, r29 ; 62 34640: 0f be out 0x3f, r0 ; 63 34642: cd bf out 0x3d, r28 ; 61 34644: df 91 pop r29 34646: cf 91 pop r28 34648: 1f 91 pop r17 3464a: 0f 91 pop r16 3464c: 08 95 ret 0003464e : 3464e: cf 93 push r28 34650: df 93 push r29 34652: ec 01 movw r28, r24 34654: 8b 81 ldd r24, Y+3 ; 0x03 34656: 88 60 ori r24, 0x08 ; 8 34658: 8b 83 std Y+3, r24 ; 0x03 3465a: ce 01 movw r24, r28 3465c: 0e 94 27 51 call 0xa24e ; 0xa24e 34660: 2b 81 ldd r18, Y+3 ; 0x03 34662: 27 7f andi r18, 0xF7 ; 247 34664: 2b 83 std Y+3, r18 ; 0x03 34666: df 91 pop r29 34668: cf 91 pop r28 3466a: 08 95 ret 0003466c : 3466c: 0f 93 push r16 3466e: 1f 93 push r17 34670: cf 93 push r28 34672: df 93 push r29 34674: cd b7 in r28, 0x3d ; 61 34676: de b7 in r29, 0x3e ; 62 34678: 2e 97 sbiw r28, 0x0e ; 14 3467a: 0f b6 in r0, 0x3f ; 63 3467c: f8 94 cli 3467e: de bf out 0x3e, r29 ; 62 34680: 0f be out 0x3f, r0 ; 63 34682: cd bf out 0x3d, r28 ; 61 34684: 8c 01 movw r16, r24 34686: fa 01 movw r30, r20 34688: 8e e0 ldi r24, 0x0E ; 14 3468a: 8c 83 std Y+4, r24 ; 0x04 3468c: 1a 83 std Y+2, r17 ; 0x02 3468e: 09 83 std Y+1, r16 ; 0x01 34690: 77 ff sbrs r23, 7 34692: 02 c0 rjmp .+4 ; 0x34698 34694: 60 e0 ldi r22, 0x00 ; 0 34696: 70 e8 ldi r23, 0x80 ; 128 34698: 61 50 subi r22, 0x01 ; 1 3469a: 71 09 sbc r23, r1 3469c: 7e 83 std Y+6, r23 ; 0x06 3469e: 6d 83 std Y+5, r22 ; 0x05 346a0: a9 01 movw r20, r18 346a2: bf 01 movw r22, r30 346a4: ce 01 movw r24, r28 346a6: 01 96 adiw r24, 0x01 ; 1 346a8: 0e 94 27 51 call 0xa24e ; 0xa24e 346ac: 4d 81 ldd r20, Y+5 ; 0x05 346ae: 5e 81 ldd r21, Y+6 ; 0x06 346b0: 57 fd sbrc r21, 7 346b2: 0a c0 rjmp .+20 ; 0x346c8 346b4: 2f 81 ldd r18, Y+7 ; 0x07 346b6: 38 85 ldd r19, Y+8 ; 0x08 346b8: 42 17 cp r20, r18 346ba: 53 07 cpc r21, r19 346bc: 0c f4 brge .+2 ; 0x346c0 346be: 9a 01 movw r18, r20 346c0: 02 0f add r16, r18 346c2: 13 1f adc r17, r19 346c4: f8 01 movw r30, r16 346c6: 10 82 st Z, r1 346c8: 2e 96 adiw r28, 0x0e ; 14 346ca: 0f b6 in r0, 0x3f ; 63 346cc: f8 94 cli 346ce: de bf out 0x3e, r29 ; 62 346d0: 0f be out 0x3f, r0 ; 63 346d2: cd bf out 0x3d, r28 ; 61 346d4: df 91 pop r29 346d6: cf 91 pop r28 346d8: 1f 91 pop r17 346da: 0f 91 pop r16 346dc: 08 95 ret 000346de <__ultoa_invert>: 346de: fa 01 movw r30, r20 346e0: aa 27 eor r26, r26 346e2: 28 30 cpi r18, 0x08 ; 8 346e4: 51 f1 breq .+84 ; 0x3473a <__ultoa_invert+0x5c> 346e6: 20 31 cpi r18, 0x10 ; 16 346e8: 81 f1 breq .+96 ; 0x3474a <__ultoa_invert+0x6c> 346ea: e8 94 clt 346ec: 6f 93 push r22 346ee: 6e 7f andi r22, 0xFE ; 254 346f0: 6e 5f subi r22, 0xFE ; 254 346f2: 7f 4f sbci r23, 0xFF ; 255 346f4: 8f 4f sbci r24, 0xFF ; 255 346f6: 9f 4f sbci r25, 0xFF ; 255 346f8: af 4f sbci r26, 0xFF ; 255 346fa: b1 e0 ldi r27, 0x01 ; 1 346fc: 3e d0 rcall .+124 ; 0x3477a <__ultoa_invert+0x9c> 346fe: b4 e0 ldi r27, 0x04 ; 4 34700: 3c d0 rcall .+120 ; 0x3477a <__ultoa_invert+0x9c> 34702: 67 0f add r22, r23 34704: 78 1f adc r23, r24 34706: 89 1f adc r24, r25 34708: 9a 1f adc r25, r26 3470a: a1 1d adc r26, r1 3470c: 68 0f add r22, r24 3470e: 79 1f adc r23, r25 34710: 8a 1f adc r24, r26 34712: 91 1d adc r25, r1 34714: a1 1d adc r26, r1 34716: 6a 0f add r22, r26 34718: 71 1d adc r23, r1 3471a: 81 1d adc r24, r1 3471c: 91 1d adc r25, r1 3471e: a1 1d adc r26, r1 34720: 20 d0 rcall .+64 ; 0x34762 <__ultoa_invert+0x84> 34722: 09 f4 brne .+2 ; 0x34726 <__ultoa_invert+0x48> 34724: 68 94 set 34726: 3f 91 pop r19 34728: 2a e0 ldi r18, 0x0A ; 10 3472a: 26 9f mul r18, r22 3472c: 11 24 eor r1, r1 3472e: 30 19 sub r19, r0 34730: 30 5d subi r19, 0xD0 ; 208 34732: 31 93 st Z+, r19 34734: de f6 brtc .-74 ; 0x346ec <__ultoa_invert+0xe> 34736: cf 01 movw r24, r30 34738: 08 95 ret 3473a: 46 2f mov r20, r22 3473c: 47 70 andi r20, 0x07 ; 7 3473e: 40 5d subi r20, 0xD0 ; 208 34740: 41 93 st Z+, r20 34742: b3 e0 ldi r27, 0x03 ; 3 34744: 0f d0 rcall .+30 ; 0x34764 <__ultoa_invert+0x86> 34746: c9 f7 brne .-14 ; 0x3473a <__ultoa_invert+0x5c> 34748: f6 cf rjmp .-20 ; 0x34736 <__ultoa_invert+0x58> 3474a: 46 2f mov r20, r22 3474c: 4f 70 andi r20, 0x0F ; 15 3474e: 40 5d subi r20, 0xD0 ; 208 34750: 4a 33 cpi r20, 0x3A ; 58 34752: 18 f0 brcs .+6 ; 0x3475a <__ultoa_invert+0x7c> 34754: 49 5d subi r20, 0xD9 ; 217 34756: 31 fd sbrc r19, 1 34758: 40 52 subi r20, 0x20 ; 32 3475a: 41 93 st Z+, r20 3475c: 02 d0 rcall .+4 ; 0x34762 <__ultoa_invert+0x84> 3475e: a9 f7 brne .-22 ; 0x3474a <__ultoa_invert+0x6c> 34760: ea cf rjmp .-44 ; 0x34736 <__ultoa_invert+0x58> 34762: b4 e0 ldi r27, 0x04 ; 4 34764: a6 95 lsr r26 34766: 97 95 ror r25 34768: 87 95 ror r24 3476a: 77 95 ror r23 3476c: 67 95 ror r22 3476e: ba 95 dec r27 34770: c9 f7 brne .-14 ; 0x34764 <__ultoa_invert+0x86> 34772: 00 97 sbiw r24, 0x00 ; 0 34774: 61 05 cpc r22, r1 34776: 71 05 cpc r23, r1 34778: 08 95 ret 3477a: 9b 01 movw r18, r22 3477c: ac 01 movw r20, r24 3477e: 0a 2e mov r0, r26 34780: 06 94 lsr r0 34782: 57 95 ror r21 34784: 47 95 ror r20 34786: 37 95 ror r19 34788: 27 95 ror r18 3478a: ba 95 dec r27 3478c: c9 f7 brne .-14 ; 0x34780 <__ultoa_invert+0xa2> 3478e: 62 0f add r22, r18 34790: 73 1f adc r23, r19 34792: 84 1f adc r24, r20 34794: 95 1f adc r25, r21 34796: a0 1d adc r26, r0 34798: 08 95 ret 0003479a <__ctype_isfalse>: 3479a: 99 27 eor r25, r25 3479c: 88 27 eor r24, r24 0003479e <__ctype_istrue>: 3479e: 08 95 ret 000347a0 : 347a0: dc 01 movw r26, r24 347a2: cb 01 movw r24, r22 000347a4 : 347a4: fc 01 movw r30, r24 347a6: f9 99 sbic 0x1f, 1 ; 31 347a8: fe cf rjmp .-4 ; 0x347a6 347aa: 06 c0 rjmp .+12 ; 0x347b8 347ac: f2 bd out 0x22, r31 ; 34 347ae: e1 bd out 0x21, r30 ; 33 347b0: f8 9a sbi 0x1f, 0 ; 31 347b2: 31 96 adiw r30, 0x01 ; 1 347b4: 00 b4 in r0, 0x20 ; 32 347b6: 0d 92 st X+, r0 347b8: 41 50 subi r20, 0x01 ; 1 347ba: 50 40 sbci r21, 0x00 ; 0 347bc: b8 f7 brcc .-18 ; 0x347ac 347be: 08 95 ret 000347c0 : 347c0: f9 99 sbic 0x1f, 1 ; 31 347c2: fe cf rjmp .-4 ; 0x347c0 347c4: 92 bd out 0x22, r25 ; 34 347c6: 81 bd out 0x21, r24 ; 33 347c8: f8 9a sbi 0x1f, 0 ; 31 347ca: 99 27 eor r25, r25 347cc: 80 b5 in r24, 0x20 ; 32 347ce: 08 95 ret 000347d0 : 347d0: a6 e1 ldi r26, 0x16 ; 22 347d2: b0 e0 ldi r27, 0x00 ; 0 347d4: 44 e0 ldi r20, 0x04 ; 4 347d6: 50 e0 ldi r21, 0x00 ; 0 347d8: 0d 94 d2 a3 jmp 0x347a4 ; 0x347a4 000347dc : 347dc: a8 e1 ldi r26, 0x18 ; 24 347de: b0 e0 ldi r27, 0x00 ; 0 347e0: 42 e0 ldi r20, 0x02 ; 2 347e2: 50 e0 ldi r21, 0x00 ; 0 347e4: 0d 94 d2 a3 jmp 0x347a4 ; 0x347a4 000347e8 : 347e8: dc 01 movw r26, r24 347ea: a4 0f add r26, r20 347ec: b5 1f adc r27, r21 347ee: 41 50 subi r20, 0x01 ; 1 347f0: 50 40 sbci r21, 0x00 ; 0 347f2: 48 f0 brcs .+18 ; 0x34806 347f4: cb 01 movw r24, r22 347f6: 84 0f add r24, r20 347f8: 95 1f adc r25, r21 347fa: 2e 91 ld r18, -X 347fc: 0f 94 05 a4 call 0x3480a ; 0x3480a 34800: 41 50 subi r20, 0x01 ; 1 34802: 50 40 sbci r21, 0x00 ; 0 34804: d0 f7 brcc .-12 ; 0x347fa 34806: 08 95 ret 00034808 : 34808: 26 2f mov r18, r22 0003480a : 3480a: f9 99 sbic 0x1f, 1 ; 31 3480c: fe cf rjmp .-4 ; 0x3480a 3480e: 92 bd out 0x22, r25 ; 34 34810: 81 bd out 0x21, r24 ; 33 34812: f8 9a sbi 0x1f, 0 ; 31 34814: 01 97 sbiw r24, 0x01 ; 1 34816: 00 b4 in r0, 0x20 ; 32 34818: 02 16 cp r0, r18 3481a: 39 f0 breq .+14 ; 0x3482a 3481c: 1f ba out 0x1f, r1 ; 31 3481e: 20 bd out 0x20, r18 ; 32 34820: 0f b6 in r0, 0x3f ; 63 34822: f8 94 cli 34824: fa 9a sbi 0x1f, 2 ; 31 34826: f9 9a sbi 0x1f, 1 ; 31 34828: 0f be out 0x3f, r0 ; 63 3482a: 08 95 ret 0003482c : 3482c: 03 96 adiw r24, 0x03 ; 3 3482e: 27 2f mov r18, r23 34830: 0f 94 05 a4 call 0x3480a ; 0x3480a 34834: 0f 94 04 a4 call 0x34808 ; 0x34808 34838: 25 2f mov r18, r21 3483a: 0f 94 05 a4 call 0x3480a ; 0x3480a 3483e: 24 2f mov r18, r20 34840: 0d 94 05 a4 jmp 0x3480a ; 0x3480a 00034844 : 34844: 01 96 adiw r24, 0x01 ; 1 34846: 27 2f mov r18, r23 34848: 0f 94 05 a4 call 0x3480a ; 0x3480a 3484c: 0d 94 04 a4 jmp 0x34808 ; 0x34808 00034850 : 34850: 26 2f mov r18, r22 00034852 : 34852: f9 99 sbic 0x1f, 1 ; 31 34854: fe cf rjmp .-4 ; 0x34852 34856: 1f ba out 0x1f, r1 ; 31 34858: 92 bd out 0x22, r25 ; 34 3485a: 81 bd out 0x21, r24 ; 33 3485c: 20 bd out 0x20, r18 ; 32 3485e: 0f b6 in r0, 0x3f ; 63 34860: f8 94 cli 34862: fa 9a sbi 0x1f, 2 ; 31 34864: f9 9a sbi 0x1f, 1 ; 31 34866: 0f be out 0x3f, r0 ; 63 34868: 01 96 adiw r24, 0x01 ; 1 3486a: 08 95 ret 0003486c : 3486c: 24 2f mov r18, r20 3486e: 0f 94 29 a4 call 0x34852 ; 0x34852 34872: 25 2f mov r18, r21 34874: 0f 94 29 a4 call 0x34852 ; 0x34852 34878: 0d 94 3e a4 jmp 0x3487c ; 0x3487c 0003487c : 3487c: 0f 94 28 a4 call 0x34850 ; 0x34850 34880: 27 2f mov r18, r23 34882: 0d 94 29 a4 jmp 0x34852 ; 0x34852 00034886 <__mulsi3>: 34886: db 01 movw r26, r22 34888: 8f 93 push r24 3488a: 9f 93 push r25 3488c: 0f 94 75 a4 call 0x348ea ; 0x348ea <__muluhisi3> 34890: bf 91 pop r27 34892: af 91 pop r26 34894: a2 9f mul r26, r18 34896: 80 0d add r24, r0 34898: 91 1d adc r25, r1 3489a: a3 9f mul r26, r19 3489c: 90 0d add r25, r0 3489e: b2 9f mul r27, r18 348a0: 90 0d add r25, r0 348a2: 11 24 eor r1, r1 348a4: 08 95 ret 000348a6 <__udivmodsi4>: 348a6: a1 e2 ldi r26, 0x21 ; 33 348a8: 1a 2e mov r1, r26 348aa: aa 1b sub r26, r26 348ac: bb 1b sub r27, r27 348ae: fd 01 movw r30, r26 348b0: 0d c0 rjmp .+26 ; 0x348cc <__udivmodsi4_ep> 000348b2 <__udivmodsi4_loop>: 348b2: aa 1f adc r26, r26 348b4: bb 1f adc r27, r27 348b6: ee 1f adc r30, r30 348b8: ff 1f adc r31, r31 348ba: a2 17 cp r26, r18 348bc: b3 07 cpc r27, r19 348be: e4 07 cpc r30, r20 348c0: f5 07 cpc r31, r21 348c2: 20 f0 brcs .+8 ; 0x348cc <__udivmodsi4_ep> 348c4: a2 1b sub r26, r18 348c6: b3 0b sbc r27, r19 348c8: e4 0b sbc r30, r20 348ca: f5 0b sbc r31, r21 000348cc <__udivmodsi4_ep>: 348cc: 66 1f adc r22, r22 348ce: 77 1f adc r23, r23 348d0: 88 1f adc r24, r24 348d2: 99 1f adc r25, r25 348d4: 1a 94 dec r1 348d6: 69 f7 brne .-38 ; 0x348b2 <__udivmodsi4_loop> 348d8: 60 95 com r22 348da: 70 95 com r23 348dc: 80 95 com r24 348de: 90 95 com r25 348e0: 9b 01 movw r18, r22 348e2: ac 01 movw r20, r24 348e4: bd 01 movw r22, r26 348e6: cf 01 movw r24, r30 348e8: 08 95 ret 000348ea <__muluhisi3>: 348ea: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 348ee: a5 9f mul r26, r21 348f0: 90 0d add r25, r0 348f2: b4 9f mul r27, r20 348f4: 90 0d add r25, r0 348f6: a4 9f mul r26, r20 348f8: 80 0d add r24, r0 348fa: 91 1d adc r25, r1 348fc: 11 24 eor r1, r1 348fe: 08 95 ret 00034900 <__umulhisi3>: 34900: a2 9f mul r26, r18 34902: b0 01 movw r22, r0 34904: b3 9f mul r27, r19 34906: c0 01 movw r24, r0 34908: a3 9f mul r26, r19 3490a: 70 0d add r23, r0 3490c: 81 1d adc r24, r1 3490e: 11 24 eor r1, r1 34910: 91 1d adc r25, r1 34912: b2 9f mul r27, r18 34914: 70 0d add r23, r0 34916: 81 1d adc r24, r1 34918: 11 24 eor r1, r1 3491a: 91 1d adc r25, r1 3491c: 08 95 ret 0003491e <__udivmodqi4>: 3491e: 99 1b sub r25, r25 34920: 79 e0 ldi r23, 0x09 ; 9 34922: 04 c0 rjmp .+8 ; 0x3492c <__udivmodqi4_ep> 00034924 <__udivmodqi4_loop>: 34924: 99 1f adc r25, r25 34926: 96 17 cp r25, r22 34928: 08 f0 brcs .+2 ; 0x3492c <__udivmodqi4_ep> 3492a: 96 1b sub r25, r22 0003492c <__udivmodqi4_ep>: 3492c: 88 1f adc r24, r24 3492e: 7a 95 dec r23 34930: c9 f7 brne .-14 ; 0x34924 <__udivmodqi4_loop> 34932: 80 95 com r24 34934: 08 95 ret 00034936 <__divmodqi4>: 34936: 87 fb bst r24, 7 34938: 08 2e mov r0, r24 3493a: 06 26 eor r0, r22 3493c: 87 fd sbrc r24, 7 3493e: 81 95 neg r24 34940: 67 fd sbrc r22, 7 34942: 61 95 neg r22 34944: 0f 94 8f a4 call 0x3491e ; 0x3491e <__udivmodqi4> 34948: 0e f4 brtc .+2 ; 0x3494c <__divmodqi4_1> 3494a: 91 95 neg r25 0003494c <__divmodqi4_1>: 3494c: 07 fc sbrc r0, 7 3494e: 81 95 neg r24 00034950 <__divmodqi4_exit>: 34950: 08 95 ret 00034952 <__udivmodhi4>: 34952: aa 1b sub r26, r26 34954: bb 1b sub r27, r27 34956: 51 e1 ldi r21, 0x11 ; 17 34958: 07 c0 rjmp .+14 ; 0x34968 <__udivmodhi4_ep> 0003495a <__udivmodhi4_loop>: 3495a: aa 1f adc r26, r26 3495c: bb 1f adc r27, r27 3495e: a6 17 cp r26, r22 34960: b7 07 cpc r27, r23 34962: 10 f0 brcs .+4 ; 0x34968 <__udivmodhi4_ep> 34964: a6 1b sub r26, r22 34966: b7 0b sbc r27, r23 00034968 <__udivmodhi4_ep>: 34968: 88 1f adc r24, r24 3496a: 99 1f adc r25, r25 3496c: 5a 95 dec r21 3496e: a9 f7 brne .-22 ; 0x3495a <__udivmodhi4_loop> 34970: 80 95 com r24 34972: 90 95 com r25 34974: bc 01 movw r22, r24 34976: cd 01 movw r24, r26 34978: 08 95 ret 0003497a <__divmodhi4>: 3497a: 97 fb bst r25, 7 3497c: 07 2e mov r0, r23 3497e: 16 f4 brtc .+4 ; 0x34984 <__divmodhi4+0xa> 34980: 00 94 com r0 34982: 07 d0 rcall .+14 ; 0x34992 <__divmodhi4_neg1> 34984: 77 fd sbrc r23, 7 34986: 09 d0 rcall .+18 ; 0x3499a <__divmodhi4_neg2> 34988: 0f 94 a9 a4 call 0x34952 ; 0x34952 <__udivmodhi4> 3498c: 07 fc sbrc r0, 7 3498e: 05 d0 rcall .+10 ; 0x3499a <__divmodhi4_neg2> 34990: 3e f4 brtc .+14 ; 0x349a0 <__divmodhi4_exit> 00034992 <__divmodhi4_neg1>: 34992: 90 95 com r25 34994: 81 95 neg r24 34996: 9f 4f sbci r25, 0xFF ; 255 34998: 08 95 ret 0003499a <__divmodhi4_neg2>: 3499a: 70 95 com r23 3499c: 61 95 neg r22 3499e: 7f 4f sbci r23, 0xFF ; 255 000349a0 <__divmodhi4_exit>: 349a0: 08 95 ret 000349a2 <__divmodsi4>: 349a2: 05 2e mov r0, r21 349a4: 97 fb bst r25, 7 349a6: 1e f4 brtc .+6 ; 0x349ae <__divmodsi4+0xc> 349a8: 00 94 com r0 349aa: 0f 94 e8 a4 call 0x349d0 ; 0x349d0 <__negsi2> 349ae: 57 fd sbrc r21, 7 349b0: 07 d0 rcall .+14 ; 0x349c0 <__divmodsi4_neg2> 349b2: 0f 94 53 a4 call 0x348a6 ; 0x348a6 <__udivmodsi4> 349b6: 07 fc sbrc r0, 7 349b8: 03 d0 rcall .+6 ; 0x349c0 <__divmodsi4_neg2> 349ba: 4e f4 brtc .+18 ; 0x349ce <__divmodsi4_exit> 349bc: 0d 94 e8 a4 jmp 0x349d0 ; 0x349d0 <__negsi2> 000349c0 <__divmodsi4_neg2>: 349c0: 50 95 com r21 349c2: 40 95 com r20 349c4: 30 95 com r19 349c6: 21 95 neg r18 349c8: 3f 4f sbci r19, 0xFF ; 255 349ca: 4f 4f sbci r20, 0xFF ; 255 349cc: 5f 4f sbci r21, 0xFF ; 255 000349ce <__divmodsi4_exit>: 349ce: 08 95 ret 000349d0 <__negsi2>: 349d0: 90 95 com r25 349d2: 80 95 com r24 349d4: 70 95 com r23 349d6: 61 95 neg r22 349d8: 7f 4f sbci r23, 0xFF ; 255 349da: 8f 4f sbci r24, 0xFF ; 255 349dc: 9f 4f sbci r25, 0xFF ; 255 349de: 08 95 ret 000349e0 <__tablejump2__>: 349e0: ee 0f add r30, r30 349e2: ff 1f adc r31, r31 349e4: 88 1f adc r24, r24 349e6: 8b bf out 0x3b, r24 ; 59 349e8: 07 90 elpm r0, Z+ 349ea: f6 91 elpm r31, Z 349ec: e0 2d mov r30, r0 349ee: 19 94 eijmp 000349f0 <__mulhisi3>: 349f0: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 349f4: 33 23 and r19, r19 349f6: 12 f4 brpl .+4 ; 0x349fc <__mulhisi3+0xc> 349f8: 8a 1b sub r24, r26 349fa: 9b 0b sbc r25, r27 349fc: 0d 94 02 a5 jmp 0x34a04 ; 0x34a04 <__usmulhisi3_tail> 00034a00 <__usmulhisi3>: 34a00: 0f 94 80 a4 call 0x34900 ; 0x34900 <__umulhisi3> 00034a04 <__usmulhisi3_tail>: 34a04: b7 ff sbrs r27, 7 34a06: 08 95 ret 34a08: 82 1b sub r24, r18 34a0a: 93 0b sbc r25, r19 34a0c: 08 95 ret 00034a0e <__subsf3>: 34a0e: 50 58 subi r21, 0x80 ; 128 00034a10 <__addsf3>: 34a10: bb 27 eor r27, r27 34a12: aa 27 eor r26, r26 34a14: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 34a18: 0d 94 31 9f jmp 0x33e62 ; 0x33e62 <__fp_round> 34a1c: 0f 94 23 9f call 0x33e46 ; 0x33e46 <__fp_pscA> 34a20: 38 f0 brcs .+14 ; 0x34a30 <__addsf3+0x20> 34a22: 0f 94 2a 9f call 0x33e54 ; 0x33e54 <__fp_pscB> 34a26: 20 f0 brcs .+8 ; 0x34a30 <__addsf3+0x20> 34a28: 39 f4 brne .+14 ; 0x34a38 <__addsf3+0x28> 34a2a: 9f 3f cpi r25, 0xFF ; 255 34a2c: 19 f4 brne .+6 ; 0x34a34 <__addsf3+0x24> 34a2e: 26 f4 brtc .+8 ; 0x34a38 <__addsf3+0x28> 34a30: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 34a34: 0e f4 brtc .+2 ; 0x34a38 <__addsf3+0x28> 34a36: e0 95 com r30 34a38: e7 fb bst r30, 7 34a3a: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 00034a3e <__addsf3x>: 34a3e: e9 2f mov r30, r25 34a40: 0f 94 42 9f call 0x33e84 ; 0x33e84 <__fp_split3> 34a44: 58 f3 brcs .-42 ; 0x34a1c <__addsf3+0xc> 34a46: ba 17 cp r27, r26 34a48: 62 07 cpc r22, r18 34a4a: 73 07 cpc r23, r19 34a4c: 84 07 cpc r24, r20 34a4e: 95 07 cpc r25, r21 34a50: 20 f0 brcs .+8 ; 0x34a5a <__addsf3x+0x1c> 34a52: 79 f4 brne .+30 ; 0x34a72 <__addsf3x+0x34> 34a54: a6 f5 brtc .+104 ; 0x34abe <__addsf3x+0x80> 34a56: 0d 94 64 9f jmp 0x33ec8 ; 0x33ec8 <__fp_zero> 34a5a: 0e f4 brtc .+2 ; 0x34a5e <__addsf3x+0x20> 34a5c: e0 95 com r30 34a5e: 0b 2e mov r0, r27 34a60: ba 2f mov r27, r26 34a62: a0 2d mov r26, r0 34a64: 0b 01 movw r0, r22 34a66: b9 01 movw r22, r18 34a68: 90 01 movw r18, r0 34a6a: 0c 01 movw r0, r24 34a6c: ca 01 movw r24, r20 34a6e: a0 01 movw r20, r0 34a70: 11 24 eor r1, r1 34a72: ff 27 eor r31, r31 34a74: 59 1b sub r21, r25 34a76: 99 f0 breq .+38 ; 0x34a9e <__addsf3x+0x60> 34a78: 59 3f cpi r21, 0xF9 ; 249 34a7a: 50 f4 brcc .+20 ; 0x34a90 <__addsf3x+0x52> 34a7c: 50 3e cpi r21, 0xE0 ; 224 34a7e: 68 f1 brcs .+90 ; 0x34ada <__addsf3x+0x9c> 34a80: 1a 16 cp r1, r26 34a82: f0 40 sbci r31, 0x00 ; 0 34a84: a2 2f mov r26, r18 34a86: 23 2f mov r18, r19 34a88: 34 2f mov r19, r20 34a8a: 44 27 eor r20, r20 34a8c: 58 5f subi r21, 0xF8 ; 248 34a8e: f3 cf rjmp .-26 ; 0x34a76 <__addsf3x+0x38> 34a90: 46 95 lsr r20 34a92: 37 95 ror r19 34a94: 27 95 ror r18 34a96: a7 95 ror r26 34a98: f0 40 sbci r31, 0x00 ; 0 34a9a: 53 95 inc r21 34a9c: c9 f7 brne .-14 ; 0x34a90 <__addsf3x+0x52> 34a9e: 7e f4 brtc .+30 ; 0x34abe <__addsf3x+0x80> 34aa0: 1f 16 cp r1, r31 34aa2: ba 0b sbc r27, r26 34aa4: 62 0b sbc r22, r18 34aa6: 73 0b sbc r23, r19 34aa8: 84 0b sbc r24, r20 34aaa: ba f0 brmi .+46 ; 0x34ada <__addsf3x+0x9c> 34aac: 91 50 subi r25, 0x01 ; 1 34aae: a1 f0 breq .+40 ; 0x34ad8 <__addsf3x+0x9a> 34ab0: ff 0f add r31, r31 34ab2: bb 1f adc r27, r27 34ab4: 66 1f adc r22, r22 34ab6: 77 1f adc r23, r23 34ab8: 88 1f adc r24, r24 34aba: c2 f7 brpl .-16 ; 0x34aac <__addsf3x+0x6e> 34abc: 0e c0 rjmp .+28 ; 0x34ada <__addsf3x+0x9c> 34abe: ba 0f add r27, r26 34ac0: 62 1f adc r22, r18 34ac2: 73 1f adc r23, r19 34ac4: 84 1f adc r24, r20 34ac6: 48 f4 brcc .+18 ; 0x34ada <__addsf3x+0x9c> 34ac8: 87 95 ror r24 34aca: 77 95 ror r23 34acc: 67 95 ror r22 34ace: b7 95 ror r27 34ad0: f7 95 ror r31 34ad2: 9e 3f cpi r25, 0xFE ; 254 34ad4: 08 f0 brcs .+2 ; 0x34ad8 <__addsf3x+0x9a> 34ad6: b0 cf rjmp .-160 ; 0x34a38 <__addsf3+0x28> 34ad8: 93 95 inc r25 34ada: 88 0f add r24, r24 34adc: 08 f0 brcs .+2 ; 0x34ae0 <__addsf3x+0xa2> 34ade: 99 27 eor r25, r25 34ae0: ee 0f add r30, r30 34ae2: 97 95 ror r25 34ae4: 87 95 ror r24 34ae6: 08 95 ret 34ae8: 0f 94 23 9f call 0x33e46 ; 0x33e46 <__fp_pscA> 34aec: 60 f0 brcs .+24 ; 0x34b06 <__addsf3x+0xc8> 34aee: 80 e8 ldi r24, 0x80 ; 128 34af0: 91 e0 ldi r25, 0x01 ; 1 34af2: 09 f4 brne .+2 ; 0x34af6 <__addsf3x+0xb8> 34af4: 9e ef ldi r25, 0xFE ; 254 34af6: 0f 94 2a 9f call 0x33e54 ; 0x33e54 <__fp_pscB> 34afa: 28 f0 brcs .+10 ; 0x34b06 <__addsf3x+0xc8> 34afc: 40 e8 ldi r20, 0x80 ; 128 34afe: 51 e0 ldi r21, 0x01 ; 1 34b00: 71 f4 brne .+28 ; 0x34b1e 34b02: 5e ef ldi r21, 0xFE ; 254 34b04: 0c c0 rjmp .+24 ; 0x34b1e 34b06: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 34b0a: 0d 94 64 9f jmp 0x33ec8 ; 0x33ec8 <__fp_zero> 00034b0e : 34b0e: e9 2f mov r30, r25 34b10: e0 78 andi r30, 0x80 ; 128 34b12: 0f 94 42 9f call 0x33e84 ; 0x33e84 <__fp_split3> 34b16: 40 f3 brcs .-48 ; 0x34ae8 <__addsf3x+0xaa> 34b18: 09 2e mov r0, r25 34b1a: 05 2a or r0, r21 34b1c: b1 f3 breq .-20 ; 0x34b0a <__addsf3x+0xcc> 34b1e: 26 17 cp r18, r22 34b20: 37 07 cpc r19, r23 34b22: 48 07 cpc r20, r24 34b24: 59 07 cpc r21, r25 34b26: 38 f0 brcs .+14 ; 0x34b36 34b28: 0e 2e mov r0, r30 34b2a: 07 f8 bld r0, 7 34b2c: e0 25 eor r30, r0 34b2e: 69 f0 breq .+26 ; 0x34b4a 34b30: e0 25 eor r30, r0 34b32: e0 64 ori r30, 0x40 ; 64 34b34: 0a c0 rjmp .+20 ; 0x34b4a 34b36: ef 63 ori r30, 0x3F ; 63 34b38: 07 f8 bld r0, 7 34b3a: 00 94 com r0 34b3c: 07 fa bst r0, 7 34b3e: db 01 movw r26, r22 34b40: b9 01 movw r22, r18 34b42: 9d 01 movw r18, r26 34b44: dc 01 movw r26, r24 34b46: ca 01 movw r24, r20 34b48: ad 01 movw r20, r26 34b4a: ef 93 push r30 34b4c: 0f 94 1e a6 call 0x34c3c ; 0x34c3c <__divsf3_pse> 34b50: 0f 94 31 9f call 0x33e62 ; 0x33e62 <__fp_round> 34b54: 0f 94 b7 a5 call 0x34b6e ; 0x34b6e 34b58: 5f 91 pop r21 34b5a: 55 23 and r21, r21 34b5c: 39 f0 breq .+14 ; 0x34b6c 34b5e: 2b ed ldi r18, 0xDB ; 219 34b60: 3f e0 ldi r19, 0x0F ; 15 34b62: 49 e4 ldi r20, 0x49 ; 73 34b64: 50 fd sbrc r21, 0 34b66: 49 ec ldi r20, 0xC9 ; 201 34b68: 0d 94 08 a5 jmp 0x34a10 ; 0x34a10 <__addsf3> 34b6c: 08 95 ret 00034b6e : 34b6e: df 93 push r29 34b70: dd 27 eor r29, r29 34b72: b9 2f mov r27, r25 34b74: bf 77 andi r27, 0x7F ; 127 34b76: 40 e8 ldi r20, 0x80 ; 128 34b78: 5f e3 ldi r21, 0x3F ; 63 34b7a: 16 16 cp r1, r22 34b7c: 17 06 cpc r1, r23 34b7e: 48 07 cpc r20, r24 34b80: 5b 07 cpc r21, r27 34b82: 18 f4 brcc .+6 ; 0x34b8a 34b84: d9 2f mov r29, r25 34b86: 0f 94 03 a8 call 0x35006 ; 0x35006 34b8a: 9f 93 push r25 34b8c: 8f 93 push r24 34b8e: 7f 93 push r23 34b90: 6f 93 push r22 34b92: 0f 94 a9 9e call 0x33d52 ; 0x33d52 34b96: e7 eb ldi r30, 0xB7 ; 183 34b98: fc e6 ldi r31, 0x6C ; 108 34b9a: 0f 94 13 a7 call 0x34e26 ; 0x34e26 <__fp_powser> 34b9e: 0f 94 31 9f call 0x33e62 ; 0x33e62 <__fp_round> 34ba2: 2f 91 pop r18 34ba4: 3f 91 pop r19 34ba6: 4f 91 pop r20 34ba8: 5f 91 pop r21 34baa: 0f 94 c0 9e call 0x33d80 ; 0x33d80 <__mulsf3x> 34bae: dd 23 and r29, r29 34bb0: 51 f0 breq .+20 ; 0x34bc6 34bb2: 90 58 subi r25, 0x80 ; 128 34bb4: a2 ea ldi r26, 0xA2 ; 162 34bb6: 2a ed ldi r18, 0xDA ; 218 34bb8: 3f e0 ldi r19, 0x0F ; 15 34bba: 49 ec ldi r20, 0xC9 ; 201 34bbc: 5f e3 ldi r21, 0x3F ; 63 34bbe: d0 78 andi r29, 0x80 ; 128 34bc0: 5d 27 eor r21, r29 34bc2: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 34bc6: df 91 pop r29 34bc8: 0d 94 31 9f jmp 0x33e62 ; 0x33e62 <__fp_round> 00034bcc : 34bcc: 0f 94 79 a7 call 0x34ef2 ; 0x34ef2 <__fp_trunc> 34bd0: 90 f0 brcs .+36 ; 0x34bf6 34bd2: 9f 37 cpi r25, 0x7F ; 127 34bd4: 48 f4 brcc .+18 ; 0x34be8 34bd6: 91 11 cpse r25, r1 34bd8: 16 f4 brtc .+4 ; 0x34bde 34bda: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 34bde: 60 e0 ldi r22, 0x00 ; 0 34be0: 70 e0 ldi r23, 0x00 ; 0 34be2: 80 e8 ldi r24, 0x80 ; 128 34be4: 9f e3 ldi r25, 0x3F ; 63 34be6: 08 95 ret 34be8: 26 f0 brts .+8 ; 0x34bf2 34bea: 1b 16 cp r1, r27 34bec: 61 1d adc r22, r1 34bee: 71 1d adc r23, r1 34bf0: 81 1d adc r24, r1 34bf2: 0d 94 ea a6 jmp 0x34dd4 ; 0x34dd4 <__fp_mintl> 34bf6: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 00034bfa <__cmpsf2>: 34bfa: 0f 94 c6 a6 call 0x34d8c ; 0x34d8c <__fp_cmp> 34bfe: 08 f4 brcc .+2 ; 0x34c02 <__cmpsf2+0x8> 34c00: 81 e0 ldi r24, 0x01 ; 1 34c02: 08 95 ret 00034c04 : 34c04: 0f 94 3c a7 call 0x34e78 ; 0x34e78 <__fp_rempio2> 34c08: e3 95 inc r30 34c0a: 0d 94 65 a7 jmp 0x34eca ; 0x34eca <__fp_sinus> 00034c0e <__divsf3>: 34c0e: 0f 94 1b a6 call 0x34c36 ; 0x34c36 <__divsf3x> 34c12: 0d 94 31 9f jmp 0x33e62 ; 0x33e62 <__fp_round> 34c16: 0f 94 2a 9f call 0x33e54 ; 0x33e54 <__fp_pscB> 34c1a: 58 f0 brcs .+22 ; 0x34c32 <__divsf3+0x24> 34c1c: 0f 94 23 9f call 0x33e46 ; 0x33e46 <__fp_pscA> 34c20: 40 f0 brcs .+16 ; 0x34c32 <__divsf3+0x24> 34c22: 29 f4 brne .+10 ; 0x34c2e <__divsf3+0x20> 34c24: 5f 3f cpi r21, 0xFF ; 255 34c26: 29 f0 breq .+10 ; 0x34c32 <__divsf3+0x24> 34c28: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 34c2c: 51 11 cpse r21, r1 34c2e: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 34c32: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 00034c36 <__divsf3x>: 34c36: 0f 94 42 9f call 0x33e84 ; 0x33e84 <__fp_split3> 34c3a: 68 f3 brcs .-38 ; 0x34c16 <__divsf3+0x8> 00034c3c <__divsf3_pse>: 34c3c: 99 23 and r25, r25 34c3e: b1 f3 breq .-20 ; 0x34c2c <__divsf3+0x1e> 34c40: 55 23 and r21, r21 34c42: 91 f3 breq .-28 ; 0x34c28 <__divsf3+0x1a> 34c44: 95 1b sub r25, r21 34c46: 55 0b sbc r21, r21 34c48: bb 27 eor r27, r27 34c4a: aa 27 eor r26, r26 34c4c: 62 17 cp r22, r18 34c4e: 73 07 cpc r23, r19 34c50: 84 07 cpc r24, r20 34c52: 38 f0 brcs .+14 ; 0x34c62 <__divsf3_pse+0x26> 34c54: 9f 5f subi r25, 0xFF ; 255 34c56: 5f 4f sbci r21, 0xFF ; 255 34c58: 22 0f add r18, r18 34c5a: 33 1f adc r19, r19 34c5c: 44 1f adc r20, r20 34c5e: aa 1f adc r26, r26 34c60: a9 f3 breq .-22 ; 0x34c4c <__divsf3_pse+0x10> 34c62: 35 d0 rcall .+106 ; 0x34cce <__divsf3_pse+0x92> 34c64: 0e 2e mov r0, r30 34c66: 3a f0 brmi .+14 ; 0x34c76 <__divsf3_pse+0x3a> 34c68: e0 e8 ldi r30, 0x80 ; 128 34c6a: 32 d0 rcall .+100 ; 0x34cd0 <__divsf3_pse+0x94> 34c6c: 91 50 subi r25, 0x01 ; 1 34c6e: 50 40 sbci r21, 0x00 ; 0 34c70: e6 95 lsr r30 34c72: 00 1c adc r0, r0 34c74: ca f7 brpl .-14 ; 0x34c68 <__divsf3_pse+0x2c> 34c76: 2b d0 rcall .+86 ; 0x34cce <__divsf3_pse+0x92> 34c78: fe 2f mov r31, r30 34c7a: 29 d0 rcall .+82 ; 0x34cce <__divsf3_pse+0x92> 34c7c: 66 0f add r22, r22 34c7e: 77 1f adc r23, r23 34c80: 88 1f adc r24, r24 34c82: bb 1f adc r27, r27 34c84: 26 17 cp r18, r22 34c86: 37 07 cpc r19, r23 34c88: 48 07 cpc r20, r24 34c8a: ab 07 cpc r26, r27 34c8c: b0 e8 ldi r27, 0x80 ; 128 34c8e: 09 f0 breq .+2 ; 0x34c92 <__divsf3_pse+0x56> 34c90: bb 0b sbc r27, r27 34c92: 80 2d mov r24, r0 34c94: bf 01 movw r22, r30 34c96: ff 27 eor r31, r31 34c98: 93 58 subi r25, 0x83 ; 131 34c9a: 5f 4f sbci r21, 0xFF ; 255 34c9c: 3a f0 brmi .+14 ; 0x34cac <__divsf3_pse+0x70> 34c9e: 9e 3f cpi r25, 0xFE ; 254 34ca0: 51 05 cpc r21, r1 34ca2: 78 f0 brcs .+30 ; 0x34cc2 <__divsf3_pse+0x86> 34ca4: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 34ca8: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 34cac: 5f 3f cpi r21, 0xFF ; 255 34cae: e4 f3 brlt .-8 ; 0x34ca8 <__divsf3_pse+0x6c> 34cb0: 98 3e cpi r25, 0xE8 ; 232 34cb2: d4 f3 brlt .-12 ; 0x34ca8 <__divsf3_pse+0x6c> 34cb4: 86 95 lsr r24 34cb6: 77 95 ror r23 34cb8: 67 95 ror r22 34cba: b7 95 ror r27 34cbc: f7 95 ror r31 34cbe: 9f 5f subi r25, 0xFF ; 255 34cc0: c9 f7 brne .-14 ; 0x34cb4 <__divsf3_pse+0x78> 34cc2: 88 0f add r24, r24 34cc4: 91 1d adc r25, r1 34cc6: 96 95 lsr r25 34cc8: 87 95 ror r24 34cca: 97 f9 bld r25, 7 34ccc: 08 95 ret 34cce: e1 e0 ldi r30, 0x01 ; 1 34cd0: 66 0f add r22, r22 34cd2: 77 1f adc r23, r23 34cd4: 88 1f adc r24, r24 34cd6: bb 1f adc r27, r27 34cd8: 62 17 cp r22, r18 34cda: 73 07 cpc r23, r19 34cdc: 84 07 cpc r24, r20 34cde: ba 07 cpc r27, r26 34ce0: 20 f0 brcs .+8 ; 0x34cea <__divsf3_pse+0xae> 34ce2: 62 1b sub r22, r18 34ce4: 73 0b sbc r23, r19 34ce6: 84 0b sbc r24, r20 34ce8: ba 0b sbc r27, r26 34cea: ee 1f adc r30, r30 34cec: 88 f7 brcc .-30 ; 0x34cd0 <__divsf3_pse+0x94> 34cee: e0 95 com r30 34cf0: 08 95 ret 00034cf2 <__fixsfsi>: 34cf2: 0f 94 80 a6 call 0x34d00 ; 0x34d00 <__fixunssfsi> 34cf6: 68 94 set 34cf8: b1 11 cpse r27, r1 34cfa: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 34cfe: 08 95 ret 00034d00 <__fixunssfsi>: 34d00: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 34d04: 88 f0 brcs .+34 ; 0x34d28 <__fixunssfsi+0x28> 34d06: 9f 57 subi r25, 0x7F ; 127 34d08: 98 f0 brcs .+38 ; 0x34d30 <__fixunssfsi+0x30> 34d0a: b9 2f mov r27, r25 34d0c: 99 27 eor r25, r25 34d0e: b7 51 subi r27, 0x17 ; 23 34d10: b0 f0 brcs .+44 ; 0x34d3e <__fixunssfsi+0x3e> 34d12: e1 f0 breq .+56 ; 0x34d4c <__fixunssfsi+0x4c> 34d14: 66 0f add r22, r22 34d16: 77 1f adc r23, r23 34d18: 88 1f adc r24, r24 34d1a: 99 1f adc r25, r25 34d1c: 1a f0 brmi .+6 ; 0x34d24 <__fixunssfsi+0x24> 34d1e: ba 95 dec r27 34d20: c9 f7 brne .-14 ; 0x34d14 <__fixunssfsi+0x14> 34d22: 14 c0 rjmp .+40 ; 0x34d4c <__fixunssfsi+0x4c> 34d24: b1 30 cpi r27, 0x01 ; 1 34d26: 91 f0 breq .+36 ; 0x34d4c <__fixunssfsi+0x4c> 34d28: 0f 94 64 9f call 0x33ec8 ; 0x33ec8 <__fp_zero> 34d2c: b1 e0 ldi r27, 0x01 ; 1 34d2e: 08 95 ret 34d30: 0d 94 64 9f jmp 0x33ec8 ; 0x33ec8 <__fp_zero> 34d34: 67 2f mov r22, r23 34d36: 78 2f mov r23, r24 34d38: 88 27 eor r24, r24 34d3a: b8 5f subi r27, 0xF8 ; 248 34d3c: 39 f0 breq .+14 ; 0x34d4c <__fixunssfsi+0x4c> 34d3e: b9 3f cpi r27, 0xF9 ; 249 34d40: cc f3 brlt .-14 ; 0x34d34 <__fixunssfsi+0x34> 34d42: 86 95 lsr r24 34d44: 77 95 ror r23 34d46: 67 95 ror r22 34d48: b3 95 inc r27 34d4a: d9 f7 brne .-10 ; 0x34d42 <__fixunssfsi+0x42> 34d4c: 3e f4 brtc .+14 ; 0x34d5c <__fixunssfsi+0x5c> 34d4e: 90 95 com r25 34d50: 80 95 com r24 34d52: 70 95 com r23 34d54: 61 95 neg r22 34d56: 7f 4f sbci r23, 0xFF ; 255 34d58: 8f 4f sbci r24, 0xFF ; 255 34d5a: 9f 4f sbci r25, 0xFF ; 255 34d5c: 08 95 ret 00034d5e : 34d5e: 0f 94 79 a7 call 0x34ef2 ; 0x34ef2 <__fp_trunc> 34d62: 90 f0 brcs .+36 ; 0x34d88 34d64: 9f 37 cpi r25, 0x7F ; 127 34d66: 48 f4 brcc .+18 ; 0x34d7a 34d68: 91 11 cpse r25, r1 34d6a: 16 f0 brts .+4 ; 0x34d70 34d6c: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 34d70: 60 e0 ldi r22, 0x00 ; 0 34d72: 70 e0 ldi r23, 0x00 ; 0 34d74: 80 e8 ldi r24, 0x80 ; 128 34d76: 9f eb ldi r25, 0xBF ; 191 34d78: 08 95 ret 34d7a: 26 f4 brtc .+8 ; 0x34d84 34d7c: 1b 16 cp r1, r27 34d7e: 61 1d adc r22, r1 34d80: 71 1d adc r23, r1 34d82: 81 1d adc r24, r1 34d84: 0d 94 ea a6 jmp 0x34dd4 ; 0x34dd4 <__fp_mintl> 34d88: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 00034d8c <__fp_cmp>: 34d8c: 99 0f add r25, r25 34d8e: 00 08 sbc r0, r0 34d90: 55 0f add r21, r21 34d92: aa 0b sbc r26, r26 34d94: e0 e8 ldi r30, 0x80 ; 128 34d96: fe ef ldi r31, 0xFE ; 254 34d98: 16 16 cp r1, r22 34d9a: 17 06 cpc r1, r23 34d9c: e8 07 cpc r30, r24 34d9e: f9 07 cpc r31, r25 34da0: c0 f0 brcs .+48 ; 0x34dd2 <__fp_cmp+0x46> 34da2: 12 16 cp r1, r18 34da4: 13 06 cpc r1, r19 34da6: e4 07 cpc r30, r20 34da8: f5 07 cpc r31, r21 34daa: 98 f0 brcs .+38 ; 0x34dd2 <__fp_cmp+0x46> 34dac: 62 1b sub r22, r18 34dae: 73 0b sbc r23, r19 34db0: 84 0b sbc r24, r20 34db2: 95 0b sbc r25, r21 34db4: 39 f4 brne .+14 ; 0x34dc4 <__fp_cmp+0x38> 34db6: 0a 26 eor r0, r26 34db8: 61 f0 breq .+24 ; 0x34dd2 <__fp_cmp+0x46> 34dba: 23 2b or r18, r19 34dbc: 24 2b or r18, r20 34dbe: 25 2b or r18, r21 34dc0: 21 f4 brne .+8 ; 0x34dca <__fp_cmp+0x3e> 34dc2: 08 95 ret 34dc4: 0a 26 eor r0, r26 34dc6: 09 f4 brne .+2 ; 0x34dca <__fp_cmp+0x3e> 34dc8: a1 40 sbci r26, 0x01 ; 1 34dca: a6 95 lsr r26 34dcc: 8f ef ldi r24, 0xFF ; 255 34dce: 81 1d adc r24, r1 34dd0: 81 1d adc r24, r1 34dd2: 08 95 ret 00034dd4 <__fp_mintl>: 34dd4: 88 23 and r24, r24 34dd6: 71 f4 brne .+28 ; 0x34df4 <__fp_mintl+0x20> 34dd8: 77 23 and r23, r23 34dda: 21 f0 breq .+8 ; 0x34de4 <__fp_mintl+0x10> 34ddc: 98 50 subi r25, 0x08 ; 8 34dde: 87 2b or r24, r23 34de0: 76 2f mov r23, r22 34de2: 07 c0 rjmp .+14 ; 0x34df2 <__fp_mintl+0x1e> 34de4: 66 23 and r22, r22 34de6: 11 f4 brne .+4 ; 0x34dec <__fp_mintl+0x18> 34de8: 99 27 eor r25, r25 34dea: 0d c0 rjmp .+26 ; 0x34e06 <__fp_mintl+0x32> 34dec: 90 51 subi r25, 0x10 ; 16 34dee: 86 2b or r24, r22 34df0: 70 e0 ldi r23, 0x00 ; 0 34df2: 60 e0 ldi r22, 0x00 ; 0 34df4: 2a f0 brmi .+10 ; 0x34e00 <__fp_mintl+0x2c> 34df6: 9a 95 dec r25 34df8: 66 0f add r22, r22 34dfa: 77 1f adc r23, r23 34dfc: 88 1f adc r24, r24 34dfe: da f7 brpl .-10 ; 0x34df6 <__fp_mintl+0x22> 34e00: 88 0f add r24, r24 34e02: 96 95 lsr r25 34e04: 87 95 ror r24 34e06: 97 f9 bld r25, 7 34e08: 08 95 ret 00034e0a <__fp_mpack>: 34e0a: 9f 3f cpi r25, 0xFF ; 255 34e0c: 31 f0 breq .+12 ; 0x34e1a <__fp_mpack_finite+0xc> 00034e0e <__fp_mpack_finite>: 34e0e: 91 50 subi r25, 0x01 ; 1 34e10: 20 f4 brcc .+8 ; 0x34e1a <__fp_mpack_finite+0xc> 34e12: 87 95 ror r24 34e14: 77 95 ror r23 34e16: 67 95 ror r22 34e18: b7 95 ror r27 34e1a: 88 0f add r24, r24 34e1c: 91 1d adc r25, r1 34e1e: 96 95 lsr r25 34e20: 87 95 ror r24 34e22: 97 f9 bld r25, 7 34e24: 08 95 ret 00034e26 <__fp_powser>: 34e26: df 93 push r29 34e28: cf 93 push r28 34e2a: 1f 93 push r17 34e2c: 0f 93 push r16 34e2e: ff 92 push r15 34e30: ef 92 push r14 34e32: df 92 push r13 34e34: 7b 01 movw r14, r22 34e36: 8c 01 movw r16, r24 34e38: 68 94 set 34e3a: 06 c0 rjmp .+12 ; 0x34e48 <__fp_powser+0x22> 34e3c: da 2e mov r13, r26 34e3e: ef 01 movw r28, r30 34e40: 0f 94 c0 9e call 0x33d80 ; 0x33d80 <__mulsf3x> 34e44: fe 01 movw r30, r28 34e46: e8 94 clt 34e48: a5 91 lpm r26, Z+ 34e4a: 25 91 lpm r18, Z+ 34e4c: 35 91 lpm r19, Z+ 34e4e: 45 91 lpm r20, Z+ 34e50: 55 91 lpm r21, Z+ 34e52: a6 f3 brts .-24 ; 0x34e3c <__fp_powser+0x16> 34e54: ef 01 movw r28, r30 34e56: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 34e5a: fe 01 movw r30, r28 34e5c: 97 01 movw r18, r14 34e5e: a8 01 movw r20, r16 34e60: da 94 dec r13 34e62: 69 f7 brne .-38 ; 0x34e3e <__fp_powser+0x18> 34e64: df 90 pop r13 34e66: ef 90 pop r14 34e68: ff 90 pop r15 34e6a: 0f 91 pop r16 34e6c: 1f 91 pop r17 34e6e: cf 91 pop r28 34e70: df 91 pop r29 34e72: 08 95 ret 34e74: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 00034e78 <__fp_rempio2>: 34e78: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 34e7c: d8 f3 brcs .-10 ; 0x34e74 <__fp_powser+0x4e> 34e7e: e8 94 clt 34e80: e0 e0 ldi r30, 0x00 ; 0 34e82: bb 27 eor r27, r27 34e84: 9f 57 subi r25, 0x7F ; 127 34e86: f0 f0 brcs .+60 ; 0x34ec4 <__fp_rempio2+0x4c> 34e88: 2a ed ldi r18, 0xDA ; 218 34e8a: 3f e0 ldi r19, 0x0F ; 15 34e8c: 49 ec ldi r20, 0xC9 ; 201 34e8e: 06 c0 rjmp .+12 ; 0x34e9c <__fp_rempio2+0x24> 34e90: ee 0f add r30, r30 34e92: bb 0f add r27, r27 34e94: 66 1f adc r22, r22 34e96: 77 1f adc r23, r23 34e98: 88 1f adc r24, r24 34e9a: 28 f0 brcs .+10 ; 0x34ea6 <__fp_rempio2+0x2e> 34e9c: b2 3a cpi r27, 0xA2 ; 162 34e9e: 62 07 cpc r22, r18 34ea0: 73 07 cpc r23, r19 34ea2: 84 07 cpc r24, r20 34ea4: 28 f0 brcs .+10 ; 0x34eb0 <__fp_rempio2+0x38> 34ea6: b2 5a subi r27, 0xA2 ; 162 34ea8: 62 0b sbc r22, r18 34eaa: 73 0b sbc r23, r19 34eac: 84 0b sbc r24, r20 34eae: e3 95 inc r30 34eb0: 9a 95 dec r25 34eb2: 72 f7 brpl .-36 ; 0x34e90 <__fp_rempio2+0x18> 34eb4: 80 38 cpi r24, 0x80 ; 128 34eb6: 30 f4 brcc .+12 ; 0x34ec4 <__fp_rempio2+0x4c> 34eb8: 9a 95 dec r25 34eba: bb 0f add r27, r27 34ebc: 66 1f adc r22, r22 34ebe: 77 1f adc r23, r23 34ec0: 88 1f adc r24, r24 34ec2: d2 f7 brpl .-12 ; 0x34eb8 <__fp_rempio2+0x40> 34ec4: 90 48 sbci r25, 0x80 ; 128 34ec6: 0d 94 07 a7 jmp 0x34e0e ; 0x34e0e <__fp_mpack_finite> 00034eca <__fp_sinus>: 34eca: ef 93 push r30 34ecc: e0 ff sbrs r30, 0 34ece: 07 c0 rjmp .+14 ; 0x34ede <__fp_sinus+0x14> 34ed0: a2 ea ldi r26, 0xA2 ; 162 34ed2: 2a ed ldi r18, 0xDA ; 218 34ed4: 3f e0 ldi r19, 0x0F ; 15 34ed6: 49 ec ldi r20, 0xC9 ; 201 34ed8: 5f eb ldi r21, 0xBF ; 191 34eda: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 34ede: 0f 94 31 9f call 0x33e62 ; 0x33e62 <__fp_round> 34ee2: 0f 90 pop r0 34ee4: 03 94 inc r0 34ee6: 01 fc sbrc r0, 1 34ee8: 90 58 subi r25, 0x80 ; 128 34eea: e4 ee ldi r30, 0xE4 ; 228 34eec: fc e6 ldi r31, 0x6C ; 108 34eee: 0d 94 5c a9 jmp 0x352b8 ; 0x352b8 <__fp_powsodd> 00034ef2 <__fp_trunc>: 34ef2: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 34ef6: a0 f0 brcs .+40 ; 0x34f20 <__fp_trunc+0x2e> 34ef8: be e7 ldi r27, 0x7E ; 126 34efa: b9 17 cp r27, r25 34efc: 88 f4 brcc .+34 ; 0x34f20 <__fp_trunc+0x2e> 34efe: bb 27 eor r27, r27 34f00: 9f 38 cpi r25, 0x8F ; 143 34f02: 60 f4 brcc .+24 ; 0x34f1c <__fp_trunc+0x2a> 34f04: 16 16 cp r1, r22 34f06: b1 1d adc r27, r1 34f08: 67 2f mov r22, r23 34f0a: 78 2f mov r23, r24 34f0c: 88 27 eor r24, r24 34f0e: 98 5f subi r25, 0xF8 ; 248 34f10: f7 cf rjmp .-18 ; 0x34f00 <__fp_trunc+0xe> 34f12: 86 95 lsr r24 34f14: 77 95 ror r23 34f16: 67 95 ror r22 34f18: b1 1d adc r27, r1 34f1a: 93 95 inc r25 34f1c: 96 39 cpi r25, 0x96 ; 150 34f1e: c8 f3 brcs .-14 ; 0x34f12 <__fp_trunc+0x20> 34f20: 08 95 ret 00034f22 <__gesf2>: 34f22: 0f 94 c6 a6 call 0x34d8c ; 0x34d8c <__fp_cmp> 34f26: 08 f4 brcc .+2 ; 0x34f2a <__gesf2+0x8> 34f28: 8f ef ldi r24, 0xFF ; 255 34f2a: 08 95 ret 34f2c: 0f 94 23 9f call 0x33e46 ; 0x33e46 <__fp_pscA> 34f30: 29 f0 breq .+10 ; 0x34f3c <__gesf2+0x1a> 34f32: 0f 94 2a 9f call 0x33e54 ; 0x33e54 <__fp_pscB> 34f36: 11 f0 breq .+4 ; 0x34f3c <__gesf2+0x1a> 34f38: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 34f3c: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 34f40: b9 01 movw r22, r18 34f42: ca 01 movw r24, r20 34f44: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 00034f48 : 34f48: 9f 77 andi r25, 0x7F ; 127 34f4a: 5f 77 andi r21, 0x7F ; 127 34f4c: 0f 94 42 9f call 0x33e84 ; 0x33e84 <__fp_split3> 34f50: 68 f3 brcs .-38 ; 0x34f2c <__gesf2+0xa> 34f52: 99 23 and r25, r25 34f54: a9 f3 breq .-22 ; 0x34f40 <__gesf2+0x1e> 34f56: 55 23 and r21, r21 34f58: a9 f3 breq .-22 ; 0x34f44 <__gesf2+0x22> 34f5a: ff 27 eor r31, r31 34f5c: 95 17 cp r25, r21 34f5e: 58 f4 brcc .+22 ; 0x34f76 34f60: e5 2f mov r30, r21 34f62: e9 1b sub r30, r25 34f64: ed 30 cpi r30, 0x0D ; 13 34f66: 60 f7 brcc .-40 ; 0x34f40 <__gesf2+0x1e> 34f68: 5e 3b cpi r21, 0xBE ; 190 34f6a: 10 f0 brcs .+4 ; 0x34f70 34f6c: f1 e4 ldi r31, 0x41 ; 65 34f6e: 1c c0 rjmp .+56 ; 0x34fa8 34f70: 90 34 cpi r25, 0x40 ; 64 34f72: e0 f4 brcc .+56 ; 0x34fac 34f74: 0a c0 rjmp .+20 ; 0x34f8a 34f76: e9 2f mov r30, r25 34f78: e5 1b sub r30, r21 34f7a: ed 30 cpi r30, 0x0D ; 13 34f7c: 18 f7 brcc .-58 ; 0x34f44 <__gesf2+0x22> 34f7e: 9e 3b cpi r25, 0xBE ; 190 34f80: 10 f0 brcs .+4 ; 0x34f86 34f82: f1 e4 ldi r31, 0x41 ; 65 34f84: 11 c0 rjmp .+34 ; 0x34fa8 34f86: 50 34 cpi r21, 0x40 ; 64 34f88: 88 f4 brcc .+34 ; 0x34fac 34f8a: f9 ea ldi r31, 0xA9 ; 169 34f8c: 88 23 and r24, r24 34f8e: 2a f0 brmi .+10 ; 0x34f9a 34f90: 9a 95 dec r25 34f92: 66 0f add r22, r22 34f94: 77 1f adc r23, r23 34f96: 88 1f adc r24, r24 34f98: da f7 brpl .-10 ; 0x34f90 34f9a: 44 23 and r20, r20 34f9c: 2a f0 brmi .+10 ; 0x34fa8 34f9e: 5a 95 dec r21 34fa0: 22 0f add r18, r18 34fa2: 33 1f adc r19, r19 34fa4: 44 1f adc r20, r20 34fa6: da f7 brpl .-10 ; 0x34f9e 34fa8: 9f 1b sub r25, r31 34faa: 5f 1b sub r21, r31 34fac: ff 93 push r31 34fae: 1f 93 push r17 34fb0: 0f 93 push r16 34fb2: ff 92 push r15 34fb4: ef 92 push r14 34fb6: 79 01 movw r14, r18 34fb8: 8a 01 movw r16, r20 34fba: bb 27 eor r27, r27 34fbc: ab 2f mov r26, r27 34fbe: 9b 01 movw r18, r22 34fc0: ac 01 movw r20, r24 34fc2: 0f 94 c3 9e call 0x33d86 ; 0x33d86 <__mulsf3_pse> 34fc6: 97 01 movw r18, r14 34fc8: a8 01 movw r20, r16 34fca: bf 93 push r27 34fcc: 7b 01 movw r14, r22 34fce: 8c 01 movw r16, r24 34fd0: aa 27 eor r26, r26 34fd2: ba 2f mov r27, r26 34fd4: b9 01 movw r22, r18 34fd6: ca 01 movw r24, r20 34fd8: 0f 94 c3 9e call 0x33d86 ; 0x33d86 <__mulsf3_pse> 34fdc: af 91 pop r26 34fde: 97 01 movw r18, r14 34fe0: a8 01 movw r20, r16 34fe2: ef 90 pop r14 34fe4: ff 90 pop r15 34fe6: 0f 91 pop r16 34fe8: 1f 91 pop r17 34fea: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 34fee: 0f 94 31 9f call 0x33e62 ; 0x33e62 <__fp_round> 34ff2: 0f 94 d6 a8 call 0x351ac ; 0x351ac 34ff6: 4f 91 pop r20 34ff8: 40 ff sbrs r20, 0 34ffa: 08 95 ret 34ffc: 55 27 eor r21, r21 34ffe: 47 fd sbrc r20, 7 35000: 50 95 com r21 35002: 0d 94 0f a8 jmp 0x3501e ; 0x3501e 00035006 : 35006: 9b 01 movw r18, r22 35008: ac 01 movw r20, r24 3500a: 60 e0 ldi r22, 0x00 ; 0 3500c: 70 e0 ldi r23, 0x00 ; 0 3500e: 80 e8 ldi r24, 0x80 ; 128 35010: 9f e3 ldi r25, 0x3F ; 63 35012: 0d 94 07 a6 jmp 0x34c0e ; 0x34c0e <__divsf3> 35016: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 3501a: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 0003501e : 3501e: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 35022: d8 f3 brcs .-10 ; 0x3501a 35024: 99 23 and r25, r25 35026: c9 f3 breq .-14 ; 0x3501a 35028: 94 0f add r25, r20 3502a: 51 1d adc r21, r1 3502c: a3 f3 brvs .-24 ; 0x35016 3502e: 91 50 subi r25, 0x01 ; 1 35030: 50 40 sbci r21, 0x00 ; 0 35032: 94 f0 brlt .+36 ; 0x35058 35034: 59 f0 breq .+22 ; 0x3504c 35036: 88 23 and r24, r24 35038: 32 f0 brmi .+12 ; 0x35046 3503a: 66 0f add r22, r22 3503c: 77 1f adc r23, r23 3503e: 88 1f adc r24, r24 35040: 91 50 subi r25, 0x01 ; 1 35042: 50 40 sbci r21, 0x00 ; 0 35044: c1 f7 brne .-16 ; 0x35036 35046: 9e 3f cpi r25, 0xFE ; 254 35048: 51 05 cpc r21, r1 3504a: 2c f7 brge .-54 ; 0x35016 3504c: 88 0f add r24, r24 3504e: 91 1d adc r25, r1 35050: 96 95 lsr r25 35052: 87 95 ror r24 35054: 97 f9 bld r25, 7 35056: 08 95 ret 35058: 5f 3f cpi r21, 0xFF ; 255 3505a: ac f0 brlt .+42 ; 0x35086 3505c: 98 3e cpi r25, 0xE8 ; 232 3505e: 9c f0 brlt .+38 ; 0x35086 35060: bb 27 eor r27, r27 35062: 86 95 lsr r24 35064: 77 95 ror r23 35066: 67 95 ror r22 35068: b7 95 ror r27 3506a: 08 f4 brcc .+2 ; 0x3506e 3506c: b1 60 ori r27, 0x01 ; 1 3506e: 93 95 inc r25 35070: c1 f7 brne .-16 ; 0x35062 35072: bb 0f add r27, r27 35074: 58 f7 brcc .-42 ; 0x3504c 35076: 11 f4 brne .+4 ; 0x3507c 35078: 60 ff sbrs r22, 0 3507a: e8 cf rjmp .-48 ; 0x3504c 3507c: 6f 5f subi r22, 0xFF ; 255 3507e: 7f 4f sbci r23, 0xFF ; 255 35080: 8f 4f sbci r24, 0xFF ; 255 35082: 9f 4f sbci r25, 0xFF ; 255 35084: e3 cf rjmp .-58 ; 0x3504c 35086: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 0003508a : 3508a: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 3508e: 58 f1 brcs .+86 ; 0x350e6 35090: 9e 57 subi r25, 0x7E ; 126 35092: 60 f1 brcs .+88 ; 0x350ec 35094: 98 51 subi r25, 0x18 ; 24 35096: a0 f0 brcs .+40 ; 0x350c0 35098: e9 f0 breq .+58 ; 0x350d4 3509a: 98 30 cpi r25, 0x08 ; 8 3509c: 20 f5 brcc .+72 ; 0x350e6 3509e: 09 2e mov r0, r25 350a0: 99 27 eor r25, r25 350a2: 66 0f add r22, r22 350a4: 77 1f adc r23, r23 350a6: 88 1f adc r24, r24 350a8: 99 1f adc r25, r25 350aa: 0a 94 dec r0 350ac: d1 f7 brne .-12 ; 0x350a2 350ae: 12 c0 rjmp .+36 ; 0x350d4 350b0: 06 2e mov r0, r22 350b2: 67 2f mov r22, r23 350b4: 78 2f mov r23, r24 350b6: 88 27 eor r24, r24 350b8: 98 5f subi r25, 0xF8 ; 248 350ba: 11 f4 brne .+4 ; 0x350c0 350bc: 00 0c add r0, r0 350be: 07 c0 rjmp .+14 ; 0x350ce 350c0: 99 3f cpi r25, 0xF9 ; 249 350c2: b4 f3 brlt .-20 ; 0x350b0 350c4: 86 95 lsr r24 350c6: 77 95 ror r23 350c8: 67 95 ror r22 350ca: 93 95 inc r25 350cc: d9 f7 brne .-10 ; 0x350c4 350ce: 61 1d adc r22, r1 350d0: 71 1d adc r23, r1 350d2: 81 1d adc r24, r1 350d4: 3e f4 brtc .+14 ; 0x350e4 350d6: 90 95 com r25 350d8: 80 95 com r24 350da: 70 95 com r23 350dc: 61 95 neg r22 350de: 7f 4f sbci r23, 0xFF ; 255 350e0: 8f 4f sbci r24, 0xFF ; 255 350e2: 9f 4f sbci r25, 0xFF ; 255 350e4: 08 95 ret 350e6: 68 94 set 350e8: 0d 94 65 9f jmp 0x33eca ; 0x33eca <__fp_szero> 350ec: 0d 94 64 9f jmp 0x33ec8 ; 0x33ec8 <__fp_zero> 000350f0 : 350f0: fa 01 movw r30, r20 350f2: ee 0f add r30, r30 350f4: ff 1f adc r31, r31 350f6: 30 96 adiw r30, 0x00 ; 0 350f8: 21 05 cpc r18, r1 350fa: 31 05 cpc r19, r1 350fc: a1 f1 breq .+104 ; 0x35166 350fe: 61 15 cp r22, r1 35100: 71 05 cpc r23, r1 35102: 61 f4 brne .+24 ; 0x3511c 35104: 80 38 cpi r24, 0x80 ; 128 35106: bf e3 ldi r27, 0x3F ; 63 35108: 9b 07 cpc r25, r27 3510a: 49 f1 breq .+82 ; 0x3515e 3510c: 68 94 set 3510e: 90 38 cpi r25, 0x80 ; 128 35110: 81 05 cpc r24, r1 35112: 61 f0 breq .+24 ; 0x3512c 35114: 80 38 cpi r24, 0x80 ; 128 35116: bf ef ldi r27, 0xFF ; 255 35118: 9b 07 cpc r25, r27 3511a: 41 f0 breq .+16 ; 0x3512c 3511c: 99 23 and r25, r25 3511e: 4a f5 brpl .+82 ; 0x35172 35120: ff 3f cpi r31, 0xFF ; 255 35122: e1 05 cpc r30, r1 35124: 31 05 cpc r19, r1 35126: 21 05 cpc r18, r1 35128: 19 f1 breq .+70 ; 0x35170 3512a: e8 94 clt 3512c: 08 94 sec 3512e: e7 95 ror r30 35130: d9 01 movw r26, r18 35132: aa 23 and r26, r26 35134: 29 f4 brne .+10 ; 0x35140 35136: ab 2f mov r26, r27 35138: be 2f mov r27, r30 3513a: f8 5f subi r31, 0xF8 ; 248 3513c: d0 f3 brcs .-12 ; 0x35132 3513e: 10 c0 rjmp .+32 ; 0x35160 35140: ff 5f subi r31, 0xFF ; 255 35142: 70 f4 brcc .+28 ; 0x35160 35144: a6 95 lsr r26 35146: e0 f7 brcc .-8 ; 0x35140 35148: f7 39 cpi r31, 0x97 ; 151 3514a: 50 f0 brcs .+20 ; 0x35160 3514c: 19 f0 breq .+6 ; 0x35154 3514e: ff 3a cpi r31, 0xAF ; 175 35150: 38 f4 brcc .+14 ; 0x35160 35152: 9f 77 andi r25, 0x7F ; 127 35154: 9f 93 push r25 35156: 0d d0 rcall .+26 ; 0x35172 35158: 0f 90 pop r0 3515a: 07 fc sbrc r0, 7 3515c: 90 58 subi r25, 0x80 ; 128 3515e: 08 95 ret 35160: 46 f0 brts .+16 ; 0x35172 35162: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 35166: 60 e0 ldi r22, 0x00 ; 0 35168: 70 e0 ldi r23, 0x00 ; 0 3516a: 80 e8 ldi r24, 0x80 ; 128 3516c: 9f e3 ldi r25, 0x3F ; 63 3516e: 08 95 ret 35170: 4f e7 ldi r20, 0x7F ; 127 35172: 9f 77 andi r25, 0x7F ; 127 35174: 5f 93 push r21 35176: 4f 93 push r20 35178: 3f 93 push r19 3517a: 2f 93 push r18 3517c: 0f 94 78 a9 call 0x352f0 ; 0x352f0 35180: 2f 91 pop r18 35182: 3f 91 pop r19 35184: 4f 91 pop r20 35186: 5f 91 pop r21 35188: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 3518c: 0d 94 23 a9 jmp 0x35246 ; 0x35246 00035190 : 35190: 9f 93 push r25 35192: 0f 94 3c a7 call 0x34e78 ; 0x34e78 <__fp_rempio2> 35196: 0f 90 pop r0 35198: 07 fc sbrc r0, 7 3519a: ee 5f subi r30, 0xFE ; 254 3519c: 0d 94 65 a7 jmp 0x34eca ; 0x34eca <__fp_sinus> 351a0: 19 f4 brne .+6 ; 0x351a8 351a2: 16 f4 brtc .+4 ; 0x351a8 351a4: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 351a8: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 000351ac : 351ac: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 351b0: b8 f3 brcs .-18 ; 0x351a0 351b2: 99 23 and r25, r25 351b4: c9 f3 breq .-14 ; 0x351a8 351b6: b6 f3 brts .-20 ; 0x351a4 351b8: 9f 57 subi r25, 0x7F ; 127 351ba: 55 0b sbc r21, r21 351bc: 87 ff sbrs r24, 7 351be: 0f 94 55 a9 call 0x352aa ; 0x352aa <__fp_norm2> 351c2: 00 24 eor r0, r0 351c4: a0 e6 ldi r26, 0x60 ; 96 351c6: 40 ea ldi r20, 0xA0 ; 160 351c8: 90 01 movw r18, r0 351ca: 80 58 subi r24, 0x80 ; 128 351cc: 56 95 lsr r21 351ce: 97 95 ror r25 351d0: 28 f4 brcc .+10 ; 0x351dc 351d2: 80 5c subi r24, 0xC0 ; 192 351d4: 66 0f add r22, r22 351d6: 77 1f adc r23, r23 351d8: 88 1f adc r24, r24 351da: 20 f0 brcs .+8 ; 0x351e4 351dc: 26 17 cp r18, r22 351de: 37 07 cpc r19, r23 351e0: 48 07 cpc r20, r24 351e2: 30 f4 brcc .+12 ; 0x351f0 351e4: 62 1b sub r22, r18 351e6: 73 0b sbc r23, r19 351e8: 84 0b sbc r24, r20 351ea: 20 29 or r18, r0 351ec: 31 29 or r19, r1 351ee: 4a 2b or r20, r26 351f0: a6 95 lsr r26 351f2: 17 94 ror r1 351f4: 07 94 ror r0 351f6: 20 25 eor r18, r0 351f8: 31 25 eor r19, r1 351fa: 4a 27 eor r20, r26 351fc: 58 f7 brcc .-42 ; 0x351d4 351fe: 66 0f add r22, r22 35200: 77 1f adc r23, r23 35202: 88 1f adc r24, r24 35204: 20 f0 brcs .+8 ; 0x3520e 35206: 26 17 cp r18, r22 35208: 37 07 cpc r19, r23 3520a: 48 07 cpc r20, r24 3520c: 30 f4 brcc .+12 ; 0x3521a 3520e: 62 0b sbc r22, r18 35210: 73 0b sbc r23, r19 35212: 84 0b sbc r24, r20 35214: 20 0d add r18, r0 35216: 31 1d adc r19, r1 35218: 41 1d adc r20, r1 3521a: a0 95 com r26 3521c: 81 f7 brne .-32 ; 0x351fe 3521e: b9 01 movw r22, r18 35220: 84 2f mov r24, r20 35222: 91 58 subi r25, 0x81 ; 129 35224: 88 0f add r24, r24 35226: 96 95 lsr r25 35228: 87 95 ror r24 3522a: 08 95 ret 0003522c <__unordsf2>: 3522c: 0f 94 c6 a6 call 0x34d8c ; 0x34d8c <__fp_cmp> 35230: 88 0b sbc r24, r24 35232: 99 0b sbc r25, r25 35234: 08 95 ret 35236: 29 f4 brne .+10 ; 0x35242 <__unordsf2+0x16> 35238: 16 f0 brts .+4 ; 0x3523e <__unordsf2+0x12> 3523a: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 3523e: 0d 94 64 9f jmp 0x33ec8 ; 0x33ec8 <__fp_zero> 35242: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 00035246 : 35246: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 3524a: a8 f3 brcs .-22 ; 0x35236 <__unordsf2+0xa> 3524c: 96 38 cpi r25, 0x86 ; 134 3524e: a0 f7 brcc .-24 ; 0x35238 <__unordsf2+0xc> 35250: 07 f8 bld r0, 7 35252: 0f 92 push r0 35254: e8 94 clt 35256: 2b e3 ldi r18, 0x3B ; 59 35258: 3a ea ldi r19, 0xAA ; 170 3525a: 48 eb ldi r20, 0xB8 ; 184 3525c: 5f e7 ldi r21, 0x7F ; 127 3525e: 0f 94 c3 9e call 0x33d86 ; 0x33d86 <__mulsf3_pse> 35262: 0f 92 push r0 35264: 0f 92 push r0 35266: 0f 92 push r0 35268: 4d b7 in r20, 0x3d ; 61 3526a: 5e b7 in r21, 0x3e ; 62 3526c: 0f 92 push r0 3526e: 0f 94 c0 a9 call 0x35380 ; 0x35380 35272: e2 e0 ldi r30, 0x02 ; 2 35274: fd e6 ldi r31, 0x6D ; 109 35276: 0f 94 13 a7 call 0x34e26 ; 0x34e26 <__fp_powser> 3527a: 4f 91 pop r20 3527c: 5f 91 pop r21 3527e: ef 91 pop r30 35280: ff 91 pop r31 35282: e5 95 asr r30 35284: ee 1f adc r30, r30 35286: ff 1f adc r31, r31 35288: 49 f0 breq .+18 ; 0x3529c 3528a: fe 57 subi r31, 0x7E ; 126 3528c: e0 68 ori r30, 0x80 ; 128 3528e: 44 27 eor r20, r20 35290: ee 0f add r30, r30 35292: 44 1f adc r20, r20 35294: fa 95 dec r31 35296: e1 f7 brne .-8 ; 0x35290 35298: 41 95 neg r20 3529a: 55 0b sbc r21, r21 3529c: 0f 94 0f a8 call 0x3501e ; 0x3501e 352a0: 0f 90 pop r0 352a2: 07 fe sbrs r0, 7 352a4: 0d 94 03 a8 jmp 0x35006 ; 0x35006 352a8: 08 95 ret 000352aa <__fp_norm2>: 352aa: 91 50 subi r25, 0x01 ; 1 352ac: 50 40 sbci r21, 0x00 ; 0 352ae: 66 0f add r22, r22 352b0: 77 1f adc r23, r23 352b2: 88 1f adc r24, r24 352b4: d2 f7 brpl .-12 ; 0x352aa <__fp_norm2> 352b6: 08 95 ret 000352b8 <__fp_powsodd>: 352b8: 9f 93 push r25 352ba: 8f 93 push r24 352bc: 7f 93 push r23 352be: 6f 93 push r22 352c0: ff 93 push r31 352c2: ef 93 push r30 352c4: 9b 01 movw r18, r22 352c6: ac 01 movw r20, r24 352c8: 0f 94 ad 9e call 0x33d5a ; 0x33d5a <__mulsf3> 352cc: ef 91 pop r30 352ce: ff 91 pop r31 352d0: 0f 94 13 a7 call 0x34e26 ; 0x34e26 <__fp_powser> 352d4: 2f 91 pop r18 352d6: 3f 91 pop r19 352d8: 4f 91 pop r20 352da: 5f 91 pop r21 352dc: 0d 94 ad 9e jmp 0x33d5a ; 0x33d5a <__mulsf3> 352e0: 16 f0 brts .+4 ; 0x352e6 <__fp_powsodd+0x2e> 352e2: 0d 94 05 a7 jmp 0x34e0a ; 0x34e0a <__fp_mpack> 352e6: 0d 94 20 9f jmp 0x33e40 ; 0x33e40 <__fp_nan> 352ea: 68 94 set 352ec: 0d 94 1a 9f jmp 0x33e34 ; 0x33e34 <__fp_inf> 000352f0 : 352f0: 0f 94 4a 9f call 0x33e94 ; 0x33e94 <__fp_splitA> 352f4: a8 f3 brcs .-22 ; 0x352e0 <__fp_powsodd+0x28> 352f6: 99 23 and r25, r25 352f8: c1 f3 breq .-16 ; 0x352ea <__fp_powsodd+0x32> 352fa: ae f3 brts .-22 ; 0x352e6 <__fp_powsodd+0x2e> 352fc: df 93 push r29 352fe: cf 93 push r28 35300: 1f 93 push r17 35302: 0f 93 push r16 35304: ff 92 push r15 35306: c9 2f mov r28, r25 35308: dd 27 eor r29, r29 3530a: 88 23 and r24, r24 3530c: 2a f0 brmi .+10 ; 0x35318 3530e: 21 97 sbiw r28, 0x01 ; 1 35310: 66 0f add r22, r22 35312: 77 1f adc r23, r23 35314: 88 1f adc r24, r24 35316: da f7 brpl .-10 ; 0x3530e 35318: 20 e0 ldi r18, 0x00 ; 0 3531a: 30 e0 ldi r19, 0x00 ; 0 3531c: 40 e8 ldi r20, 0x80 ; 128 3531e: 5f eb ldi r21, 0xBF ; 191 35320: 9f e3 ldi r25, 0x3F ; 63 35322: 88 39 cpi r24, 0x98 ; 152 35324: 20 f0 brcs .+8 ; 0x3532e 35326: 80 3e cpi r24, 0xE0 ; 224 35328: 38 f0 brcs .+14 ; 0x35338 3532a: 21 96 adiw r28, 0x01 ; 1 3532c: 8f 77 andi r24, 0x7F ; 127 3532e: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 35332: ea e2 ldi r30, 0x2A ; 42 35334: fd e6 ldi r31, 0x6D ; 109 35336: 04 c0 rjmp .+8 ; 0x35340 35338: 0f 94 08 a5 call 0x34a10 ; 0x34a10 <__addsf3> 3533c: e7 e5 ldi r30, 0x57 ; 87 3533e: fd e6 ldi r31, 0x6D ; 109 35340: 0f 94 13 a7 call 0x34e26 ; 0x34e26 <__fp_powser> 35344: 8b 01 movw r16, r22 35346: be 01 movw r22, r28 35348: ec 01 movw r28, r24 3534a: fb 2e mov r15, r27 3534c: 6f 57 subi r22, 0x7F ; 127 3534e: 71 09 sbc r23, r1 35350: 75 95 asr r23 35352: 77 1f adc r23, r23 35354: 88 0b sbc r24, r24 35356: 99 0b sbc r25, r25 35358: 0f 94 6e 9e call 0x33cdc ; 0x33cdc <__floatsisf> 3535c: 28 e1 ldi r18, 0x18 ; 24 3535e: 32 e7 ldi r19, 0x72 ; 114 35360: 41 e3 ldi r20, 0x31 ; 49 35362: 5f e3 ldi r21, 0x3F ; 63 35364: 0f 94 c0 9e call 0x33d80 ; 0x33d80 <__mulsf3x> 35368: af 2d mov r26, r15 3536a: 98 01 movw r18, r16 3536c: ae 01 movw r20, r28 3536e: ff 90 pop r15 35370: 0f 91 pop r16 35372: 1f 91 pop r17 35374: cf 91 pop r28 35376: df 91 pop r29 35378: 0f 94 1f a5 call 0x34a3e ; 0x34a3e <__addsf3x> 3537c: 0d 94 31 9f jmp 0x33e62 ; 0x33e62 <__fp_round> 00035380 : 35380: fa 01 movw r30, r20 35382: dc 01 movw r26, r24 35384: aa 0f add r26, r26 35386: bb 1f adc r27, r27 35388: 9b 01 movw r18, r22 3538a: ac 01 movw r20, r24 3538c: bf 57 subi r27, 0x7F ; 127 3538e: 28 f4 brcc .+10 ; 0x3539a 35390: 22 27 eor r18, r18 35392: 33 27 eor r19, r19 35394: 44 27 eor r20, r20 35396: 50 78 andi r21, 0x80 ; 128 35398: 20 c0 rjmp .+64 ; 0x353da 3539a: b7 51 subi r27, 0x17 ; 23 3539c: 90 f4 brcc .+36 ; 0x353c2 3539e: ab 2f mov r26, r27 353a0: 00 24 eor r0, r0 353a2: 46 95 lsr r20 353a4: 37 95 ror r19 353a6: 27 95 ror r18 353a8: 01 1c adc r0, r1 353aa: a3 95 inc r26 353ac: d2 f3 brmi .-12 ; 0x353a2 353ae: 00 20 and r0, r0 353b0: 71 f0 breq .+28 ; 0x353ce 353b2: 22 0f add r18, r18 353b4: 33 1f adc r19, r19 353b6: 44 1f adc r20, r20 353b8: b3 95 inc r27 353ba: da f3 brmi .-10 ; 0x353b2 353bc: 0e d0 rcall .+28 ; 0x353da 353be: 0d 94 07 a5 jmp 0x34a0e ; 0x34a0e <__subsf3> 353c2: 61 30 cpi r22, 0x01 ; 1 353c4: 71 05 cpc r23, r1 353c6: a0 e8 ldi r26, 0x80 ; 128 353c8: 8a 07 cpc r24, r26 353ca: b9 46 sbci r27, 0x69 ; 105 353cc: 30 f4 brcc .+12 ; 0x353da 353ce: 9b 01 movw r18, r22 353d0: ac 01 movw r20, r24 353d2: 66 27 eor r22, r22 353d4: 77 27 eor r23, r23 353d6: 88 27 eor r24, r24 353d8: 90 78 andi r25, 0x80 ; 128 353da: 30 96 adiw r30, 0x00 ; 0 353dc: 21 f0 breq .+8 ; 0x353e6 353de: 20 83 st Z, r18 353e0: 31 83 std Z+1, r19 ; 0x01 353e2: 42 83 std Z+2, r20 ; 0x02 353e4: 53 83 std Z+3, r21 ; 0x03 353e6: 08 95 ret 000353e8 : 353e8: 91 11 cpse r25, r1 353ea: 08 95 ret 353ec: 81 54 subi r24, 0x41 ; 65 353ee: 8a 51 subi r24, 0x1A ; 26 353f0: 08 f4 brcc .+2 ; 0x353f4 353f2: 80 5e subi r24, 0xE0 ; 224 353f4: 85 5a subi r24, 0xA5 ; 165 353f6: 08 95 ret 000353f8 : 353f8: fb 01 movw r30, r22 353fa: dc 01 movw r26, r24 353fc: 04 c0 rjmp .+8 ; 0x35406 353fe: 8d 91 ld r24, X+ 35400: 01 90 ld r0, Z+ 35402: 80 19 sub r24, r0 35404: 21 f4 brne .+8 ; 0x3540e 35406: 41 50 subi r20, 0x01 ; 1 35408: 50 40 sbci r21, 0x00 ; 0 3540a: c8 f7 brcc .-14 ; 0x353fe 3540c: 88 1b sub r24, r24 3540e: 99 0b sbc r25, r25 35410: 08 95 ret 00035412 : 35412: fb 01 movw r30, r22 35414: dc 01 movw r26, r24 35416: 02 c0 rjmp .+4 ; 0x3541c 35418: 01 90 ld r0, Z+ 3541a: 0d 92 st X+, r0 3541c: 41 50 subi r20, 0x01 ; 1 3541e: 50 40 sbci r21, 0x00 ; 0 35420: d8 f7 brcc .-10 ; 0x35418 35422: 08 95 ret 00035424 : 35424: dc 01 movw r26, r24 35426: 01 c0 rjmp .+2 ; 0x3542a 35428: 6d 93 st X+, r22 3542a: 41 50 subi r20, 0x01 ; 1 3542c: 50 40 sbci r21, 0x00 ; 0 3542e: e0 f7 brcc .-8 ; 0x35428 35430: 08 95 ret 00035432 : 35432: fb 01 movw r30, r22 35434: dc 01 movw r26, r24 35436: 8d 91 ld r24, X+ 35438: 81 34 cpi r24, 0x41 ; 65 3543a: 1c f0 brlt .+6 ; 0x35442 3543c: 8b 35 cpi r24, 0x5B ; 91 3543e: 0c f4 brge .+2 ; 0x35442 35440: 80 5e subi r24, 0xE0 ; 224 35442: 61 91 ld r22, Z+ 35444: 61 34 cpi r22, 0x41 ; 65 35446: 1c f0 brlt .+6 ; 0x3544e 35448: 6b 35 cpi r22, 0x5B ; 91 3544a: 0c f4 brge .+2 ; 0x3544e 3544c: 60 5e subi r22, 0xE0 ; 224 3544e: 86 1b sub r24, r22 35450: 61 11 cpse r22, r1 35452: 89 f3 breq .-30 ; 0x35436 35454: 99 0b sbc r25, r25 35456: 08 95 ret 00035458 : 35458: fb 01 movw r30, r22 3545a: dc 01 movw r26, r24 3545c: 0d 90 ld r0, X+ 3545e: 00 20 and r0, r0 35460: e9 f7 brne .-6 ; 0x3545c 35462: 11 97 sbiw r26, 0x01 ; 1 35464: 01 90 ld r0, Z+ 35466: 0d 92 st X+, r0 35468: 00 20 and r0, r0 3546a: e1 f7 brne .-8 ; 0x35464 3546c: 08 95 ret 0003546e : 3546e: fc 01 movw r30, r24 35470: 81 91 ld r24, Z+ 35472: 86 17 cp r24, r22 35474: 21 f0 breq .+8 ; 0x3547e 35476: 88 23 and r24, r24 35478: d9 f7 brne .-10 ; 0x35470 3547a: 99 27 eor r25, r25 3547c: 08 95 ret 3547e: 31 97 sbiw r30, 0x01 ; 1 35480: cf 01 movw r24, r30 35482: 08 95 ret 00035484 : 35484: fb 01 movw r30, r22 35486: dc 01 movw r26, r24 35488: 8d 91 ld r24, X+ 3548a: 01 90 ld r0, Z+ 3548c: 80 19 sub r24, r0 3548e: 01 10 cpse r0, r1 35490: d9 f3 breq .-10 ; 0x35488 35492: 99 0b sbc r25, r25 35494: 08 95 ret 00035496 : 35496: fb 01 movw r30, r22 35498: dc 01 movw r26, r24 3549a: 01 90 ld r0, Z+ 3549c: 0d 92 st X+, r0 3549e: 00 20 and r0, r0 354a0: e1 f7 brne .-8 ; 0x3549a 354a2: 08 95 ret 000354a4 : 354a4: fb 01 movw r30, r22 354a6: dc 01 movw r26, r24 354a8: 41 50 subi r20, 0x01 ; 1 354aa: 50 40 sbci r21, 0x00 ; 0 354ac: 30 f0 brcs .+12 ; 0x354ba 354ae: 8d 91 ld r24, X+ 354b0: 01 90 ld r0, Z+ 354b2: 80 19 sub r24, r0 354b4: 19 f4 brne .+6 ; 0x354bc 354b6: 00 20 and r0, r0 354b8: b9 f7 brne .-18 ; 0x354a8 354ba: 88 1b sub r24, r24 354bc: 99 0b sbc r25, r25 354be: 08 95 ret 000354c0 : 354c0: fb 01 movw r30, r22 354c2: dc 01 movw r26, r24 354c4: 41 50 subi r20, 0x01 ; 1 354c6: 50 40 sbci r21, 0x00 ; 0 354c8: 48 f0 brcs .+18 ; 0x354dc 354ca: 01 90 ld r0, Z+ 354cc: 0d 92 st X+, r0 354ce: 00 20 and r0, r0 354d0: c9 f7 brne .-14 ; 0x354c4 354d2: 01 c0 rjmp .+2 ; 0x354d6 354d4: 1d 92 st X+, r1 354d6: 41 50 subi r20, 0x01 ; 1 354d8: 50 40 sbci r21, 0x00 ; 0 354da: e0 f7 brcc .-8 ; 0x354d4 354dc: 08 95 ret 000354de : 354de: 0f 93 push r16 354e0: 1f 93 push r17 354e2: cf 93 push r28 354e4: df 93 push r29 354e6: e0 91 13 17 lds r30, 0x1713 ; 0x801713 <__iob+0x2> 354ea: f0 91 14 17 lds r31, 0x1714 ; 0x801714 <__iob+0x3> 354ee: 23 81 ldd r18, Z+3 ; 0x03 354f0: ec 01 movw r28, r24 354f2: 10 e0 ldi r17, 0x00 ; 0 354f4: 00 e0 ldi r16, 0x00 ; 0 354f6: 21 fd sbrc r18, 1 354f8: 08 c0 rjmp .+16 ; 0x3550a 354fa: 0f ef ldi r16, 0xFF ; 255 354fc: 1f ef ldi r17, 0xFF ; 255 354fe: 14 c0 rjmp .+40 ; 0x35528 35500: 19 95 eicall 35502: 89 2b or r24, r25 35504: 11 f0 breq .+4 ; 0x3550a 35506: 0f ef ldi r16, 0xFF ; 255 35508: 1f ef ldi r17, 0xFF ; 255 3550a: 89 91 ld r24, Y+ 3550c: 60 91 13 17 lds r22, 0x1713 ; 0x801713 <__iob+0x2> 35510: 70 91 14 17 lds r23, 0x1714 ; 0x801714 <__iob+0x3> 35514: db 01 movw r26, r22 35516: 18 96 adiw r26, 0x08 ; 8 35518: ed 91 ld r30, X+ 3551a: fc 91 ld r31, X 3551c: 81 11 cpse r24, r1 3551e: f0 cf rjmp .-32 ; 0x35500 35520: 8a e0 ldi r24, 0x0A ; 10 35522: 19 95 eicall 35524: 89 2b or r24, r25 35526: 49 f7 brne .-46 ; 0x354fa 35528: c8 01 movw r24, r16 3552a: df 91 pop r29 3552c: cf 91 pop r28 3552e: 1f 91 pop r17 35530: 0f 91 pop r16 35532: 08 95 ret 00035534 <__do_global_dtors>: 35534: 10 e5 ldi r17, 0x50 ; 80 35536: c3 ef ldi r28, 0xF3 ; 243 35538: d0 e5 ldi r29, 0x50 ; 80 3553a: 00 e0 ldi r16, 0x00 ; 0 3553c: 06 c0 rjmp .+12 ; 0x3554a <__do_global_dtors+0x16> 3553e: 80 2f mov r24, r16 35540: fe 01 movw r30, r28 35542: 0f 94 f0 a4 call 0x349e0 ; 0x349e0 <__tablejump2__> 35546: 21 96 adiw r28, 0x01 ; 1 35548: 01 1d adc r16, r1 3554a: c4 3f cpi r28, 0xF4 ; 244 3554c: d1 07 cpc r29, r17 3554e: 80 e0 ldi r24, 0x00 ; 0 35550: 08 07 cpc r16, r24 35552: a9 f7 brne .-22 ; 0x3553e <__do_global_dtors+0xa> 35554: f8 94 cli 00035556 <__stop_program>: 35556: ff cf rjmp .-2 ; 0x35556 <__stop_program>