MK3_lang_base: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 4e 56 jmp 0xac9c ; 0xac9c <__dtors_end> 4: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 8: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 10: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 14: 0d 94 2e 60 jmp 0x2c05c ; 0x2c05c <__vector_5> 18: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 1c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 20: 0c 94 86 74 jmp 0xe90c ; 0xe90c <__vector_8> 24: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 28: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 2c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 30: 0c 94 0b 67 jmp 0xce16 ; 0xce16 <__vector_12> 34: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 38: 0d 94 ae 33 jmp 0x2675c ; 0x2675c <__vector_14> 3c: 0d 94 3f 2d jmp 0x25a7e ; 0x25a7e <__vector_15> 40: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 44: 0d 94 1f 44 jmp 0x2883e ; 0x2883e <__vector_17> 48: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 4c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 50: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 54: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 58: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 5c: 0c 94 ba 73 jmp 0xe774 ; 0xe774 <__vector_23> 60: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 64: 0d 94 58 d6 jmp 0x3acb0 ; 0x3acb0 <__vector_25> 68: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 6c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 70: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 74: 0c 94 df 8c jmp 0x119be ; 0x119be <__vector_29> 78: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 7c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 80: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 84: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 88: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 8c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 90: 0d 94 14 d6 jmp 0x3ac28 ; 0x3ac28 <__vector_36> 94: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 98: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> 9c: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> a0: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> a4: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> a8: 0d 94 59 23 jmp 0x246b2 ; 0x246b2 <__vector_42> ac: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> b0: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> b4: 0d 94 3b 23 jmp 0x24676 ; 0x24676 <__vector_45> b8: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> bc: 0d 94 f8 38 jmp 0x271f0 ; 0x271f0 <__vector_47> c0: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> c4: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> c8: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> cc: 0d 94 fb 22 jmp 0x245f6 ; 0x245f6 <__vector_51> d0: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> d4: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> d8: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> dc: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__bad_interrupt> e0: 0c 94 7f 56 jmp 0xacfe ; 0xacfe <__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: 43 72 andi r20, 0x23 ; 35 3604: 61 73 andi r22, 0x31 ; 49 3606: 68 20 and r6, r8 3608: 64 65 ori r22, 0x54 ; 84 360a: 74 65 ori r23, 0x54 ; 84 360c: 63 74 andi r22, 0x43 ; 67 360e: 65 64 ori r22, 0x45 ; 69 3610: 2e 00 .word 0x002e ; ???? 00003612 : 3612: ff ff 53 6f 6d 65 20 70 72 6f 62 6c 65 6d 20 65 ..Some problem e 3622: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 5a 2d 6c 65 ncountered, Z-le 3632: 76 65 6c 69 6e 67 20 65 6e 66 6f 72 63 65 64 20 veling enforced 3642: 2e 2e 2e 00 .... 00003646 : 3646: ff ff 4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c ..Mesh bed level 3656: 69 6e 67 20 66 61 69 6c 65 64 2e 20 50 72 69 6e ing failed. Prin 3666: 74 20 63 61 6e 63 65 6c 65 64 2e 00 t canceled.. 00003672 : 3672: ff ff 48 65 61 74 69 6e 67 20 64 69 73 61 62 6c ..Heating disabl 3682: 65 64 20 62 79 20 73 61 66 65 74 79 20 74 69 6d ed by safety tim 3692: 65 72 2e 00 er.. 00003696 : 3696: ff ff 53 54 4f 50 50 45 44 2e 00 ..STOPPED.. 000036a1 : 36a1: ff ff 50 41 55 53 45 44 20 54 48 45 52 4d 41 4c ..PAUSED THERMAL 36b1: 20 45 52 52 4f 52 00 ERROR. 000036b8 : 36b8: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 36c8: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 36d8: 6c 65 76 65 6c 2e 00 level.. 000036df : 36df: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 36ef: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 36ff: 6c 65 76 65 6c 2e 20 50 6c 65 61 73 65 20 72 65 level. Please re 370f: 2d 73 6c 69 63 65 20 74 68 65 20 6d 6f 64 65 6c -slice the model 371f: 20 61 67 61 69 6e 2e 00 again.. 00003727 : 3727: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 3737: 66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d for a newer firm 3747: 77 61 72 65 2e 00 ware.. 0000374d : 374d: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 375d: 66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d for a newer firm 376d: 77 61 72 65 2e 20 50 6c 65 61 73 65 20 75 70 64 ware. Please upd 377d: 61 74 65 20 74 68 65 20 66 69 72 6d 77 61 72 65 ate the firmware 378d: 2e 00 .. 0000378f : 378f: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 379f: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 37af: 70 72 69 6e 74 65 72 20 74 79 70 65 2e 00 printer type.. 000037bd : 37bd: ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20 ..G-code sliced 37cd: 66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20 for a different 37dd: 70 72 69 6e 74 65 72 20 74 79 70 65 2e 20 50 6c printer type. Pl 37ed: 65 61 73 65 20 72 65 2d 73 6c 69 63 65 20 74 68 ease re-slice th 37fd: 65 20 6d 6f 64 65 6c 20 61 67 61 69 6e 2e 00 e model again.. 0000380c : 380c: ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 ..Press the knob 381c: 20 74 6f 20 70 72 65 68 65 61 74 20 6e 6f 7a 7a to preheat nozz 382c: 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e le and continue. ... 0000383d : 383d: ff ff 50 6c 65 61 73 65 20 70 72 65 73 73 20 74 ..Please press t 384d: 68 65 20 6b 6e 6f 62 20 74 6f 20 75 6e 6c 6f 61 he knob to unloa 385d: 64 20 66 69 6c 61 6d 65 6e 74 00 d filament. 00003868 : 3868: ff ff 61 6e 64 20 70 72 65 73 73 20 74 68 65 20 ..and press the 3878: 6b 6e 6f 62 00 knob. 0000387d : 387d: ff ff 49 6e 73 65 72 74 20 66 69 6c 61 6d 65 6e ..Insert filamen 388d: 74 00 t. 0000388f : 388f: ff ff 43 6f 6c 6f 72 20 6e 6f 74 20 63 6f 72 72 ..Color not corr 389f: 65 63 74 00 ect. 000038a3 : 38a3: ff ff 46 69 6c 61 6d 65 6e 74 20 6e 6f 74 20 6c ..Filament not l 38b3: 6f 61 64 65 64 00 oaded. 000038b9 : 38b9: ff ff 43 68 61 6e 67 65 64 20 63 6f 72 72 65 63 ..Changed correc 38c9: 74 6c 79 00 tly. 000038cd : 38cd: ff ff 4c 6f 61 64 69 6e 67 20 63 6f 6c 6f 72 00 ..Loading color. 000038dd : 38dd: ff ff 43 68 61 6e 67 65 20 73 75 63 63 65 73 73 ..Change success 38ed: 21 00 !. 000038ef : 38ef: ff ff 50 6c 65 61 73 65 20 6f 70 65 6e 20 69 64 ..Please open id 38ff: 6c 65 72 20 61 6e 64 20 72 65 6d 6f 76 65 20 66 ler and remove f 390f: 69 6c 61 6d 65 6e 74 20 6d 61 6e 75 61 6c 6c 79 ilament manually 391f: 2e 00 .. 00003921 : 3921: ff ff 57 61 73 20 66 69 6c 61 6d 65 6e 74 20 75 ..Was filament u 3931: 6e 6c 6f 61 64 20 73 75 63 63 65 73 73 66 75 6c nload successful 3941: 3f 00 ?. 00003943 : 3943: ff ff 50 6c 65 61 73 65 20 75 70 67 72 61 64 65 ..Please upgrade 3953: 2e 00 .. 00003955 : 3955: ff ff 4e 65 77 20 66 69 72 6d 77 61 72 65 20 76 ..New firmware v 3965: 65 72 73 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 ersion available 3975: 3a 00 :. 00003977 : 3977: ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 50 49 ..Waiting for PI 3987: 4e 44 41 20 70 72 6f 62 65 20 63 6f 6f 6c 69 6e NDA probe coolin 3997: 67 00 g. 00003999 : 3999: ff ff 50 6c 65 61 73 65 20 77 61 69 74 00 ..Please wait. 000039a7 : 39a7: ff ff 4e 6f 20 6d 6f 76 65 2e 00 ..No move.. 000039b2 : 39b2: ff ff 57 61 69 74 20 66 6f 72 20 75 73 65 72 2e ..Wait for user. 39c2: 2e 2e 00 ... 000039c5 : 39c5: ff ff 53 74 61 62 6c 65 20 61 6d 62 69 65 6e 74 ..Stable ambient 39d5: 20 74 65 6d 70 65 72 61 74 75 72 65 20 32 31 2d temperature 21- 39e5: 32 36 43 20 69 73 20 6e 65 65 64 65 64 20 61 20 26C is needed a 39f5: 72 69 67 69 64 20 73 74 61 6e 64 20 69 73 20 72 rigid stand is r 3a05: 65 71 75 69 72 65 64 2e 00 equired.. 00003a0e : 3a0e: ff ff 50 6c 65 61 73 65 20 72 75 6e 20 58 59 5a ..Please run XYZ 3a1e: 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 69 72 calibration fir 3a2e: 73 74 2e 00 st.. 00003a32 : 3a32: ff ff 45 78 74 72 75 64 65 72 00 ..Extruder. 00003a3d : 3a3d: ff ff 4d 6f 76 65 20 5a 00 ..Move Z. 00003a46 : 3a46: ff ff 4d 6f 76 65 20 59 00 ..Move Y. 00003a4f : 3a4f: ff ff 4d 6f 76 65 20 58 00 ..Move X. 00003a58 : 3a58: ff ff 43 72 61 73 68 20 64 65 74 65 63 74 69 6f ..Crash detectio 3a68: 6e 20 63 61 6e 0a 62 65 20 74 75 72 6e 65 64 20 n can.be turned 3a78: 6f 6e 20 6f 6e 6c 79 20 69 6e 0a 4e 6f 72 6d 61 on only in.Norma 3a88: 6c 20 6d 6f 64 65 00 l mode. 00003a8f : 3a8f: ff ff 57 41 52 4e 49 4e 47 3a 0a 43 72 61 73 68 ..WARNING:.Crash 3a9f: 20 64 65 74 65 63 74 69 6f 6e 0a 64 69 73 61 62 detection.disab 3aaf: 6c 65 64 20 69 6e 0a 53 74 65 61 6c 74 68 20 6d led in.Stealth m 3abf: 6f 64 65 00 ode. 00003ac3 : 3ac3: ff ff 4d 6f 64 65 20 63 68 61 6e 67 65 20 69 6e ..Mode change in 3ad3: 20 70 72 6f 67 72 65 73 73 2e 2e 2e 00 progress.... 00003ae0 : 3ae0: ff ff 43 6f 70 79 20 73 65 6c 65 63 74 65 64 20 ..Copy selected 3af0: 6c 61 6e 67 75 61 67 65 3f 00 language?. 00003afa : 3afa: ff ff 43 6f 6d 6d 75 6e 69 74 79 20 6d 61 64 65 ..Community made ... 00003b0b : 3b0b: ff ff 53 68 65 65 74 20 25 2e 37 73 0a 5a 20 6f ..Sheet %.7s.Z o 3b1b: 66 66 73 65 74 3a 20 25 2b 31 2e 33 66 6d 6d 0a ffset: %+1.3fmm. 3b2b: 25 63 43 6f 6e 74 69 6e 75 65 0a 25 63 52 65 73 %cContinue.%cRes 3b3b: 65 74 00 et. 00003b3e : 3b3e: ff ff 50 6c 65 61 73 65 20 6c 6f 61 64 20 66 69 ..Please load fi 3b4e: 6c 61 6d 65 6e 74 20 66 69 72 73 74 2e 00 lament first.. 00003b5c : 3b5c: ff ff 53 65 6c 65 63 74 20 66 69 6c 61 6d 65 6e ..Select filamen 3b6c: 74 3a 00 t:. 00003b6f : 3b6f: ff ff 43 61 6e 63 65 6c 00 ..Cancel. 00003b78 : 3b78: ff ff 52 75 6e 6e 69 6e 67 20 57 69 7a 61 72 64 ..Running Wizard 3b88: 20 77 69 6c 6c 20 64 65 6c 65 74 65 20 63 75 72 will delete cur 3b98: 72 65 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e rent calibration 3ba8: 20 72 65 73 75 6c 74 73 20 61 6e 64 20 73 74 61 results and sta 3bb8: 72 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 rt from the begi 3bc8: 6e 6e 69 6e 67 2e 00 nning.. 00003bcf : 3bcf: ff ff 50 72 65 68 65 61 74 69 6e 67 20 6e 6f 7a ..Preheating noz 3bdf: 7a 6c 65 2e 20 50 6c 65 61 73 65 20 77 61 69 74 zle. Please wait 3bef: 2e 00 .. 00003bf1 : 3bf1: ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20 ..Please insert 3c01: 66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68 filament into th 3c11: 65 20 65 78 74 72 75 64 65 72 2c 20 74 68 65 6e e extruder, then 3c21: 20 70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 20 press the knob 3c31: 74 6f 20 6c 6f 61 64 20 69 74 2e 00 to load it.. 00003c3d : 3c3d: ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20 ..Please insert 3c4d: 66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68 filament into th 3c5d: 65 20 66 69 72 73 74 20 74 75 62 65 20 6f 66 20 e first tube of 3c6d: 74 68 65 20 4d 4d 55 2c 20 74 68 65 6e 20 70 72 the MMU, then pr 3c7d: 65 73 73 20 74 68 65 20 6b 6e 6f 62 20 74 6f 20 ess the knob to 3c8d: 6c 6f 61 64 20 69 74 2e 00 load it.. 00003c96 : 3c96: ff ff 54 68 65 20 70 72 69 6e 74 65 72 20 77 69 ..The printer wi 3ca6: 6c 6c 20 73 74 61 72 74 20 70 72 69 6e 74 69 6e ll start printin 3cb6: 67 20 61 20 7a 69 67 2d 7a 61 67 20 6c 69 6e 65 g a zig-zag line 3cc6: 2e 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e 6f . Rotate the kno 3cd6: 62 20 75 6e 74 69 6c 20 79 6f 75 20 72 65 61 63 b until you reac 3ce6: 68 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 68 65 h the optimal he 3cf6: 69 67 68 74 2e 20 43 68 65 63 6b 20 74 68 65 20 ight. Check the 3d06: 70 69 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 pictures in the 3d16: 68 61 6e 64 62 6f 6f 6b 20 28 43 61 6c 69 62 72 handbook (Calibr 3d26: 61 74 69 6f 6e 20 63 68 61 70 74 65 72 29 2e 00 ation chapter).. 00003d36 : 3d36: ff ff 53 65 6c 65 63 74 20 74 65 6d 70 65 72 61 ..Select tempera 3d46: 74 75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68 ture which match 3d56: 65 73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c es your material 3d66: 2e 00 .. 00003d68 : 3d68: ff ff 53 65 6c 65 63 74 20 61 20 66 69 6c 61 6d ..Select a filam 3d78: 65 6e 74 20 66 6f 72 20 74 68 65 20 46 69 72 73 ent for the Firs 3d88: 74 20 4c 61 79 65 72 20 43 61 6c 69 62 72 61 74 t Layer Calibrat 3d98: 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 20 69 ion and select i 3da8: 74 20 69 6e 20 74 68 65 20 6f 6e 2d 73 63 72 65 t in the on-scre 3db8: 65 6e 20 6d 65 6e 75 2e 00 en menu.. 00003dc1 : 3dc1: ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 63 61 6c ..Now I will cal 3dd1: 69 62 72 61 74 65 20 64 69 73 74 61 6e 63 65 20 ibrate distance 3de1: 62 65 74 77 65 65 6e 20 74 69 70 20 6f 66 20 74 between tip of t 3df1: 68 65 20 6e 6f 7a 7a 6c 65 20 61 6e 64 20 68 65 he nozzle and he 3e01: 61 74 62 65 64 20 73 75 72 66 61 63 65 2e 00 atbed surface.. 00003e10 : 3e10: ff ff 5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 ..Z calibration 3e20: 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 20 52 75 6e recommended. Run 3e30: 20 69 74 20 6e 6f 77 3f 00 it now?. 00003e39 : 3e39: ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20 ..Please remove 3e49: 73 74 65 65 6c 20 73 68 65 65 74 20 66 72 6f 6d steel sheet from 3e59: 20 68 65 61 74 62 65 64 2e 00 heatbed.. 00003e63 : 3e63: ff ff 49 73 20 73 74 65 65 6c 20 73 68 65 65 74 ..Is steel sheet 3e73: 20 6f 6e 20 68 65 61 74 62 65 64 3f 00 on heatbed?. 00003e80 : 3e80: ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 20 6f ..Please check o 3e90: 75 72 20 68 61 6e 64 62 6f 6f 6b 20 61 6e 64 20 ur handbook and 3ea0: 66 69 78 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e fix the problem. 3eb0: 20 54 68 65 6e 20 72 65 73 75 6d 65 20 74 68 65 Then resume the 3ec0: 20 57 69 7a 61 72 64 20 62 79 20 72 65 62 6f 6f Wizard by reboo 3ed0: 74 69 6e 67 20 74 68 65 20 70 72 69 6e 74 65 72 ting the printer 3ee0: 2e 00 .. 00003ee2 : 3ee2: ff ff 41 6c 6c 20 69 73 20 64 6f 6e 65 2e 20 48 ..All is done. H 3ef2: 61 70 70 79 20 70 72 69 6e 74 69 6e 67 21 00 appy printing!. 00003f01 : 3f01: ff ff 59 6f 75 20 63 61 6e 20 61 6c 77 61 79 73 ..You can always 3f11: 20 72 65 73 75 6d 65 20 74 68 65 20 57 69 7a 61 resume the Wiza 3f21: 72 64 20 66 72 6f 6d 20 43 61 6c 69 62 72 61 74 rd from Calibrat 3f31: 69 6f 6e 20 2d 3e 20 57 69 7a 61 72 64 2e 00 ion -> Wizard.. 00003f40 : 3f40: ff ff 49 66 20 79 6f 75 20 68 61 76 65 20 61 64 ..If you have ad 3f50: 64 69 74 69 6f 6e 61 6c 20 73 74 65 65 6c 20 73 ditional steel s 3f60: 68 65 65 74 73 2c 20 63 61 6c 69 62 72 61 74 65 heets, calibrate 3f70: 20 74 68 65 69 72 20 70 72 65 73 65 74 73 20 69 their presets i 3f80: 6e 20 53 65 74 74 69 6e 67 73 20 2d 20 48 57 20 n Settings - HW 3f90: 53 65 74 75 70 20 2d 20 53 74 65 65 6c 20 73 68 Setup - Steel sh 3fa0: 65 65 74 73 2e 00 eets.. 00003fa6 : 3fa6: ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 68 ..Please clean h 3fb6: 65 61 74 62 65 64 20 61 6e 64 20 74 68 65 6e 20 eatbed and then 3fc6: 70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 2e 00 press the knob.. 00003fd6 : 3fd6: ff ff 44 6f 20 79 6f 75 20 77 61 6e 74 20 74 6f ..Do you want to 3fe6: 20 72 65 70 65 61 74 20 6c 61 73 74 20 73 74 65 repeat last ste 3ff6: 70 20 74 6f 20 72 65 61 64 6a 75 73 74 20 64 69 p to readjust di 4006: 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 6e stance between n 4016: 6f 7a 7a 6c 65 20 61 6e 64 20 68 65 61 74 62 65 ozzle and heatbe 4026: 64 3f 00 d?. 00004029 : 4029: ff ff 53 65 6c 65 63 74 20 6e 6f 7a 7a 6c 65 20 ..Select nozzle 4039: 70 72 65 68 65 61 74 20 74 65 6d 70 65 72 61 74 preheat temperat 4049: 75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68 65 ure which matche 4059: 73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c 2e s your material. ... 0000406a : 406a: ff ff 49 73 20 66 69 6c 61 6d 65 6e 74 20 6c 6f ..Is filament lo 407a: 61 64 65 64 3f 00 aded?. 00004080 : 4080: ff ff 54 68 65 72 6d 61 6c 20 6d 6f 64 65 6c 20 ..Thermal model 4090: 63 61 6c 2e 20 74 61 6b 65 73 20 61 70 70 72 6f cal. takes appro 40a0: 78 2e 20 31 32 20 6d 69 6e 73 2e 20 53 65 65 0a x. 12 mins. See. 40b0: 70 72 75 73 61 2e 69 6f 2f 74 6d 2d 63 61 6c 00 prusa.io/tm-cal. 000040c0 : 40c0: ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 70 72 65 ..Now I will pre 40d0: 68 65 61 74 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20 heat nozzle for 40e0: 50 4c 41 2e 00 PLA.. 000040e5 : 40e5: ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 7a 20 63 ..I will run z c 40f5: 61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77 2e 00 alibration now.. 00004105 : 4105: ff ff 4e 6f 77 20 72 65 6d 6f 76 65 20 74 68 65 ..Now remove the 4115: 20 74 65 73 74 20 70 72 69 6e 74 20 66 72 6f 6d test print from 4125: 20 73 74 65 65 6c 20 73 68 65 65 74 2e 00 steel sheet.. 00004133 : 4133: ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20 ..Please remove 4143: 73 68 69 70 70 69 6e 67 20 68 65 6c 70 65 72 73 shipping helpers 4153: 20 66 69 72 73 74 2e 00 first.. 0000415b : 415b: ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 78 79 7a ..I will run xyz 416b: 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77 calibration now 417b: 2e 20 49 74 20 77 69 6c 6c 20 74 61 6b 65 20 75 . It will take u 418b: 70 20 74 6f 20 32 34 20 6d 69 6e 73 2e 00 p to 24 mins.. 00004199 : 4199: ff ff 46 69 72 73 74 2c 20 49 20 77 69 6c 6c 20 ..First, I will 41a9: 72 75 6e 20 74 68 65 20 73 65 6c 66 74 65 73 74 run the selftest 41b9: 20 74 6f 20 63 68 65 63 6b 20 6d 6f 73 74 20 63 to check most c 41c9: 6f 6d 6d 6f 6e 20 61 73 73 65 6d 62 6c 79 20 70 ommon assembly p 41d9: 72 6f 62 6c 65 6d 73 2e 00 roblems.. 000041e2 : 41e2: ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20 ..Hi, I am your 41f2: 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69 Original Prusa i 4202: 33 20 70 72 69 6e 74 65 72 2e 20 57 6f 75 6c 64 3 printer. Would 4212: 20 79 6f 75 20 6c 69 6b 65 20 6d 65 20 74 6f 20 you like me to 4222: 67 75 69 64 65 20 79 6f 75 20 74 68 72 6f 75 67 guide you throug 4232: 68 20 74 68 65 20 73 65 74 75 70 20 70 72 6f 63 h the setup proc 4242: 65 73 73 3f 00 ess?. 00004247 : 4247: ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20 ..Hi, I am your 4257: 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69 Original Prusa i 4267: 33 20 70 72 69 6e 74 65 72 2e 20 49 20 77 69 6c 3 printer. I wil 4277: 6c 20 67 75 69 64 65 20 79 6f 75 20 74 68 72 6f l guide you thro 4287: 75 67 68 20 61 20 73 68 6f 72 74 20 73 65 74 75 ugh a short setu 4297: 70 20 70 72 6f 63 65 73 73 2c 20 69 6e 20 77 68 p process, in wh 42a7: 69 63 68 20 74 68 65 20 5a 2d 61 78 69 73 20 77 ich the Z-axis w 42b7: 69 6c 6c 20 62 65 20 63 61 6c 69 62 72 61 74 65 ill be calibrate 42c7: 64 2e 20 54 68 65 6e 2c 20 79 6f 75 20 77 69 6c d. Then, you wil 42d7: 6c 20 62 65 20 72 65 61 64 79 20 74 6f 20 70 72 l be ready to pr 42e7: 69 6e 74 2e 00 int.. 000042ec : 42ec: ff ff 45 2d 63 6f 72 72 65 63 74 00 ..E-correct. 000042f8 : 42f8: ff ff 5a 2d 63 6f 72 72 65 63 74 00 ..Z-correct. 00004304 : 4304: ff ff 59 2d 63 6f 72 72 65 63 74 00 ..Y-correct. 00004310 : 4310: ff ff 58 2d 63 6f 72 72 65 63 74 00 ..X-correct. 0000431c : 431c: ff ff 50 61 75 73 65 00 ..Pause. 00004324 : 4324: ff ff 46 53 20 41 63 74 69 6f 6e 00 ..FS Action. 00004330 : 4330: ff ff 43 6f 6e 74 2e 00 ..Cont.. 00004338 : 4338: ff ff 46 2e 20 6a 61 6d 20 64 65 74 65 63 74 00 ..F. jam detect. 00004348 : 4348: ff ff 46 2e 20 61 75 74 6f 6c 6f 61 64 00 ..F. autoload. 00004356 : 4356: ff ff 46 2e 20 72 75 6e 6f 75 74 00 ..F. runout. 00004362 : 4362: ff ff 4d 4d 55 20 4d 6f 64 65 00 ..MMU Mode. 0000436d : 436d: ff ff 43 75 74 74 65 72 00 ..Cutter. 00004376 : 4376: ff ff 53 74 65 61 6c 74 68 00 ..Stealth. 00004380 : 4380: ff ff 43 72 61 73 68 20 64 65 74 2e 00 ..Crash det.. 0000438d : 438d: ff ff 46 61 6e 20 73 70 65 65 64 00 ..Fan speed. 00004399 : 4399: ff ff 42 65 64 00 ..Bed. 0000439f : 439f: ff ff 46 61 6e 73 20 63 68 65 63 6b 00 ..Fans check. 000043ac : 43ac: ff ff 4d 6f 64 65 6c 00 ..Model. 000043b4 : 43b4: ff ff 4e 6f 7a 7a 6c 65 00 ..Nozzle. 000043bd : 43bd: ff ff 50 6c 65 61 73 65 20 75 6e 6c 6f 61 64 20 ..Please unload 43cd: 74 68 65 20 66 69 6c 61 6d 65 6e 74 20 66 69 72 the filament fir 43dd: 73 74 2c 20 74 68 65 6e 20 72 65 70 65 61 74 20 st, then repeat 43ed: 74 68 69 73 20 61 63 74 69 6f 6e 2e 00 this action.. 000043fa : 43fa: ff ff 43 68 65 63 6b 73 00 ..Checks. 00004403 : 4403: ff ff 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 00 ..Nozzle change. 00004413 : 4413: ff ff 4e 6f 7a 7a 6c 65 20 64 2e 00 ..Nozzle d.. 0000441f : 441f: ff ff 41 6c 70 68 61 62 65 74 00 ..Alphabet. 0000442a : 442a: ff ff 53 6f 72 74 00 ..Sort. 00004431 : 4431: ff ff 54 69 6d 65 00 ..Time. 00004438 : 4438: ff ff 4e 6f 72 6d 61 6c 00 ..Normal. 00004441 : 4441: ff ff 53 44 20 63 61 72 64 00 ..SD card. 0000444b : 444b: ff ff 53 65 6c 65 63 74 20 6c 61 6e 67 75 61 67 ..Select languag 445b: 65 00 e. 0000445d : 445d: ff ff 52 50 69 20 70 6f 72 74 00 ..RPi port. 00004468 : 4468: ff ff 4c 69 6e 2e 20 63 6f 72 72 65 63 74 69 6f ..Lin. correctio 4478: 6e 00 n. 0000447a : 447a: ff ff 48 57 20 53 65 74 75 70 00 ..HW Setup. 00004485 : 4485: ff ff 4c 6f 61 64 69 6e 67 20 54 65 73 74 00 ..Loading Test. 00004494 : 4494: ff ff 44 69 73 61 62 6c 65 20 73 74 65 70 70 65 ..Disable steppe 44a4: 72 73 00 rs. 000044a7 : 44a7: ff ff 4d 6f 76 65 20 61 78 69 73 00 ..Move axis. 000044b3 : 44b3: ff ff 54 65 6d 70 65 72 61 74 75 72 65 00 ..Temperature. 000044c1 : 44c1: ff ff 50 49 4e 44 41 20 63 61 6c 2e 00 ..PINDA cal.. 000044ce : 44ce: ff ff 52 65 73 65 74 20 58 59 5a 20 63 61 6c 69 ..Reset XYZ cali 44de: 62 72 2e 00 br.. 000044e2 : 44e2: ff ff 50 49 44 20 63 61 6c 69 62 72 61 74 69 6f ..PID calibratio 44f2: 6e 00 n. 000044f4 : 44f4: ff ff 42 65 64 20 6c 65 76 65 6c 20 63 6f 72 72 ..Bed level corr 4504: 65 63 74 00 ect. 00004508 : 4508: ff ff 4d 65 73 68 20 42 65 64 20 4c 65 76 65 6c ..Mesh Bed Level 4518: 69 6e 67 00 ing. 0000451c : 451c: ff ff 43 61 6c 69 62 72 61 74 65 20 5a 00 ..Calibrate Z. 0000452a : 452a: ff ff 43 61 6c 69 62 72 61 74 65 20 58 59 5a 00 ..Calibrate XYZ. 0000453a : 453a: ff ff 53 65 6c 66 74 65 73 74 00 ..Selftest. 00004545 : 4545: ff ff 42 65 6c 74 20 74 65 73 74 00 ..Belt test. 00004551 : 4551: ff ff 57 69 7a 61 72 64 00 ..Wizard. 0000455a : 455a: ff ff 54 65 73 74 69 6e 67 20 66 69 6c 61 6d 65 ..Testing filame 456a: 6e 74 00 nt. 0000456d : 456d: ff ff 4c 6f 61 64 20 41 6c 6c 00 ..Load All. 00004578 : 4578: ff ff 50 6c 65 61 73 65 20 70 75 6c 6c 20 6f 75 ..Please pull ou 4588: 74 20 66 69 6c 61 6d 65 6e 74 20 69 6d 6d 65 64 t filament immed 4598: 69 61 74 65 6c 79 00 iately. 0000459f : 459f: ff ff 52 65 73 65 74 00 ..Reset. 000045a7 : 45a7: ff ff 52 65 6e 61 6d 65 00 ..Rename. 000045b0 : 45b0: ff ff 46 69 72 73 74 20 6c 61 79 65 72 20 63 61 ..First layer ca 45c0: 6c 2e 00 l.. 000045c3 : 45c3: ff ff 53 65 6c 65 63 74 00 ..Select. 000045cc : 45cc: ff ff 53 74 65 65 6c 20 73 68 65 65 74 73 00 ..Steel sheets. 000045db : 45db: ff ff 53 75 70 70 6f 72 74 00 ..Support. 000045e5 : 45e5: ff ff 46 61 69 6c 20 73 74 61 74 73 20 4d 4d 55 ..Fail stats MMU ... 000045f6 : 45f6: ff ff 46 61 69 6c 20 73 74 61 74 73 00 ..Fail stats. 00004603 : 4603: ff ff 53 74 61 74 69 73 74 69 63 73 00 ..Statistics. 00004610 : 4610: ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 00 ..Calibration. 0000461e : 461e: ff ff 41 75 74 6f 4c 6f 61 64 20 66 69 6c 61 6d ..AutoLoad filam 462e: 65 6e 74 00 ent. 00004632 : 4632: ff ff 4c 6f 61 64 20 66 69 6c 61 6d 65 6e 74 00 ..Load filament. 00004642 : 4642: ff ff 55 6e 6c 6f 61 64 20 66 69 6c 61 6d 65 6e ..Unload filamen 4652: 74 00 t. 00004654 : 4654: ff ff 4c 6f 61 64 20 74 6f 20 6e 6f 7a 7a 6c 65 ..Load to nozzle ... 00004665 : 4665: ff ff 50 72 65 6c 6f 61 64 20 74 6f 20 4d 4d 55 ..Preload to MMU ... 00004676 : 4676: ff ff 4e 6f 20 53 44 20 63 61 72 64 00 ..No SD card. 00004683 : 4683: ff ff 50 72 69 6e 74 20 66 72 6f 6d 20 53 44 00 ..Print from SD. 00004693 : 4693: ff ff 43 6c 65 61 72 20 54 4d 20 65 72 72 6f 72 ..Clear TM error ... 000046a4 : 46a4: ff ff 52 65 73 75 6d 65 20 70 72 69 6e 74 00 ..Resume print. 000046b3 : 46b3: ff ff 50 61 75 73 65 20 70 72 69 6e 74 00 ..Pause print. 000046c1 : 46c1: ff ff 53 65 74 20 52 65 61 64 79 00 ..Set Ready. 000046cd : 46cd: ff ff 53 65 74 20 6e 6f 74 20 52 65 61 64 79 00 ..Set not Ready. 000046dd : 46dd: ff ff 50 72 65 68 65 61 74 00 ..Preheat. 000046e7 : 46e7: ff ff 54 75 6e 65 00 ..Tune. 000046ee : 46ee: ff ff 4c 69 76 65 20 61 64 6a 75 73 74 20 5a 00 ..Live adjust Z. 000046fe : 46fe: ff ff 52 65 70 72 69 6e 74 00 ..Reprint. 00004708 : 4708: ff ff 49 6e 66 6f 20 73 63 72 65 65 6e 00 ..Info screen. 00004716 : 4716: ff ff 42 72 69 67 68 74 6e 65 73 73 00 ..Brightness. 00004723 : 4723: ff ff 41 73 73 69 73 74 00 ..Assist. 0000472c : 472c: ff ff 53 69 6c 65 6e 74 00 ..Silent. 00004735 : 4735: ff ff 4f 6e 63 65 00 ..Once. 0000473c : 473c: ff ff 53 6f 75 6e 64 00 ..Sound. 00004744 : 4744: ff ff 4c 6f 75 64 00 ..Loud. 0000474b : 474b: ff ff 46 69 6c 2e 20 73 65 6e 73 6f 72 00 ..Fil. sensor. 00004759 : 4759: ff ff 43 68 61 6e 67 65 20 66 69 6c 61 6d 65 6e ..Change filamen 4769: 74 00 t. 0000476b : 476b: ff ff 46 6c 6f 77 00 ..Flow. 00004772 : 4772: ff ff 53 70 65 65 64 00 ..Speed. 0000477a : 477a: ff ff 4d 61 67 6e 65 74 73 20 63 6f 6d 70 2e 00 ..Magnets comp.. 0000478a : 478a: ff ff 4e 2f 41 00 ..N/A. 00004790 : 4790: ff ff 5a 2d 70 72 6f 62 65 20 6e 72 2e 00 ..Z-probe nr.. 0000479e : 479e: ff ff 4d 65 73 68 00 ..Mesh. 000047a5 : 47a5: ff ff 54 69 6d 65 6f 75 74 00 ..Timeout. 000047af : 47af: ff ff 4d 6f 64 65 00 ..Mode. 000047b6 : 47b6: ff ff 41 75 74 6f 00 ..Auto. 000047bd : 47bd: ff ff 44 69 6d 00 ..Dim. 000047c3 : 47c3: ff ff 42 72 69 67 68 74 00 ..Bright. 000047cc : 47cc: ff ff 4c 65 76 65 6c 20 44 69 6d 6d 65 64 00 ..Level Dimmed. 000047db : 47db: ff ff 4c 65 76 65 6c 20 42 72 69 67 68 74 00 ..Level Bright. 000047ea : 47ea: ff ff 53 65 74 74 69 6e 67 73 00 ..Settings. 000047f5 : 47f5: ff ff 59 65 73 00 ..Yes. 000047fb : 47fb: ff ff 4e 6f 00 ..No. 00004800 : 4800: ff ff 53 74 6f 70 20 70 72 69 6e 74 00 ..Stop print. 0000480d : 480d: ff ff 43 68 65 63 6b 69 6e 67 20 66 69 6c 65 00 ..Checking file. 0000481d : 481d: ff ff 46 69 6c 65 20 69 6e 63 6f 6d 70 6c 65 74 ..File incomplet 482d: 65 2e 00 e.. 00004830 : 4830: ff ff 84 52 65 66 72 65 73 68 00 ...Refresh. 0000483b : 483b: ff ff 4d 61 69 6e 00 ..Main. 00004842 : 4842: ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 6e 6f ..Waiting for no 4852: 7a 7a 6c 65 20 61 6e 64 20 62 65 64 20 63 6f 6f zzle and bed coo 4862: 6c 69 6e 67 00 ling. 00004867 : 4867: ff ff 53 65 6c 66 74 65 73 74 20 4f 4b 00 ..Selftest OK. 00004875 : 4875: ff ff 53 65 6c 66 74 65 73 74 20 73 74 61 72 74 ..Selftest start ... 00004886 : 4886: ff ff 50 72 69 6e 74 20 66 61 6e 3a 00 ..Print fan:. 00004893 : 4893: ff ff 48 6f 74 65 6e 64 20 66 61 6e 3a 00 ..Hotend fan:. 000048a1 : 48a1: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 68 6f ..Calibrating ho 48b1: 6d 65 00 me. 000048b4 : 48b4: ff ff 41 6c 6c 20 63 6f 72 72 65 63 74 00 ..All correct. 000048c2 : 48c2: ff ff 43 68 65 63 6b 69 6e 67 20 73 65 6e 73 6f ..Checking senso 48d2: 72 73 00 rs. 000048d5 : 48d5: ff ff 43 68 65 63 6b 69 6e 67 20 68 6f 74 65 6e ..Checking hoten 48e5: 64 00 d. 000048e7 : 48e7: ff ff 43 68 65 63 6b 69 6e 67 20 62 65 64 00 ..Checking bed. 000048f6 : 48f6: ff ff 43 68 65 63 6b 69 6e 67 20 5a 20 61 78 69 ..Checking Z axi 4906: 73 00 s. 00004908 : 4908: ff ff 43 68 65 63 6b 69 6e 67 20 59 20 61 78 69 ..Checking Y axi 4918: 73 00 s. 0000491a : 491a: ff ff 43 68 65 63 6b 69 6e 67 20 58 20 61 78 69 ..Checking X axi 492a: 73 00 s. 0000492c : 492c: ff ff 43 68 65 63 6b 69 6e 67 20 65 6e 64 73 74 ..Checking endst 493c: 6f 70 73 00 ops. 00004940 : 4940: ff ff 43 61 72 64 20 72 65 6d 6f 76 65 64 00 ..Card removed. 0000494f : 494f: ff ff 42 61 63 6b 00 ..Back. 00004956 : 4956: ff ff 53 74 72 69 63 74 00 ..Strict. 0000495f : 495f: ff ff 57 61 72 6e 00 ..Warn. 00004966 : 4966: ff ff 4e 6f 6e 65 00 ..None. 0000496d : 496d: ff ff 48 6f 74 65 6e 64 20 61 74 20 32 38 30 43 ..Hotend at 280C 497d: 21 20 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 64 ! Nozzle changed 498d: 20 61 6e 64 20 74 69 67 68 74 65 6e 65 64 20 74 and tightened t 499d: 6f 20 73 70 65 63 73 3f 00 o specs?. 000049a6 : 49a6: ff ff 46 6f 72 20 61 20 4e 6f 7a 7a 6c 65 20 63 ..For a Nozzle c 49b6: 68 61 6e 67 65 20 70 6c 65 61 73 65 20 72 65 61 hange please rea 49c6: 64 0a 70 72 75 73 61 2e 69 6f 2f 6e 6f 7a 7a 6c d.prusa.io/nozzl 49d6: 65 2d 6d 6b 33 73 00 e-mk3s. 000049dd : 49dd: ff ff 50 49 44 20 63 61 6c 2e 20 66 69 6e 69 73 ..PID cal. finis 49ed: 68 65 64 00 hed. 000049f1 : 49f1: ff ff 50 49 44 20 63 61 6c 2e 00 ..PID cal.. 000049fc : 49fc: ff ff 50 72 69 6e 74 20 70 61 75 73 65 64 00 ..Print paused. 00004a0b : 4a0b: ff ff 50 72 69 6e 74 20 61 62 6f 72 74 65 64 00 ..Print aborted. 00004a1b : 4a1b: ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65 ..Nozzle diamete 4a2b: 72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 r differs from t 4a3b: 68 65 20 47 2d 63 6f 64 65 2e 00 he G-code.. 00004a46 : 4a46: ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65 ..Nozzle diamete 4a56: 72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 r differs from t 4a66: 68 65 20 47 2d 63 6f 64 65 2e 20 50 6c 65 61 73 he G-code. Pleas 4a76: 65 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 e check the valu 4a86: 65 20 69 6e 20 73 65 74 74 69 6e 67 73 2e 00 e in settings.. 00004a95 : 4a95: ff ff 54 68 65 72 65 20 69 73 20 6e 6f 20 66 69 ..There is no fi 4aa5: 6c 61 6d 65 6e 74 20 6c 6f 61 64 65 64 2e 00 lament loaded.. 00004ab4 : 4ab4: ff ff 4d 4b 33 20 66 69 72 6d 77 61 72 65 20 64 ..MK3 firmware d 4ac4: 65 74 65 63 74 65 64 20 6f 6e 20 4d 4b 33 53 20 etected on MK3S 4ad4: 70 72 69 6e 74 65 72 00 printer. 00004adc : 4adc: ff ff 42 6c 61 63 6b 6f 75 74 20 6f 63 63 75 72 ..Blackout occur 4aec: 72 65 64 2e 20 52 65 63 6f 76 65 72 20 70 72 69 red. Recover pri 4afc: 6e 74 3f 00 nt?. 00004b00 : 4b00: ff ff 54 68 65 72 6d 61 6c 20 6d 6f 64 65 6c 20 ..Thermal model 4b10: 6e 6f 74 20 63 61 6c 69 62 72 61 74 65 64 20 79 not calibrated y 4b20: 65 74 2e 00 et.. 00004b24 : 4b24: ff ff 54 68 65 72 65 20 69 73 20 73 74 69 6c 6c ..There is still 4b34: 20 61 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 a need to make 4b44: 5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 20 50 Z calibration. P 4b54: 6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65 lease follow the 4b64: 20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72 manual, chapter 4b74: 20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65 First steps, se 4b84: 63 74 69 6f 6e 20 43 61 6c 69 62 72 61 74 69 6f ction Calibratio 4b94: 6e 20 66 6c 6f 77 2e 00 n flow.. 00004b9c : 4b9c: ff ff 50 72 69 6e 74 65 72 20 68 61 73 20 6e 6f ..Printer has no 4bac: 74 20 62 65 65 6e 20 63 61 6c 69 62 72 61 74 65 t been calibrate 4bbc: 64 20 79 65 74 2e 20 50 6c 65 61 73 65 20 66 6f d yet. Please fo 4bcc: 6c 6c 6f 77 20 74 68 65 20 6d 61 6e 75 61 6c 2c llow the manual, 4bdc: 20 63 68 61 70 74 65 72 20 46 69 72 73 74 20 73 chapter First s 4bec: 74 65 70 73 2c 20 73 65 63 74 69 6f 6e 20 43 61 teps, section Ca 4bfc: 6c 69 62 72 61 74 69 6f 6e 20 66 6c 6f 77 2e 00 libration flow.. 00004c0c : 4c0c: ff ff 53 65 6c 66 74 65 73 74 20 77 69 6c 6c 20 ..Selftest will 4c1c: 62 65 20 72 75 6e 20 74 6f 20 63 61 6c 69 62 72 be run to calibr 4c2c: 61 74 65 20 61 63 63 75 72 61 74 65 20 73 65 6e ate accurate sen 4c3c: 73 6f 72 6c 65 73 73 20 72 65 68 6f 6d 69 6e 67 sorless rehoming 4c4c: 2e 00 .. 00004c4e : 4c4e: ff ff 4f 6c 64 20 73 65 74 74 69 6e 67 73 20 66 ..Old settings f 4c5e: 6f 75 6e 64 2e 20 44 65 66 61 75 6c 74 20 50 49 ound. Default PI 4c6e: 44 2c 20 45 73 74 65 70 73 20 65 74 63 2e 20 77 D, Esteps etc. w 4c7e: 69 6c 6c 20 62 65 20 73 65 74 2e 00 ill be set.. 00004c8a : 4c8a: ff ff 57 61 72 6e 69 6e 67 3a 20 62 6f 74 68 20 ..Warning: both 4c9a: 70 72 69 6e 74 65 72 20 74 79 70 65 20 61 6e 64 printer type and 4caa: 20 6d 6f 74 68 65 72 62 6f 61 72 64 20 74 79 70 motherboard typ 4cba: 65 20 63 68 61 6e 67 65 64 2e 00 e changed.. 00004cc5 : 4cc5: ff ff 57 61 72 6e 69 6e 67 3a 20 70 72 69 6e 74 ..Warning: print 4cd5: 65 72 20 74 79 70 65 20 63 68 61 6e 67 65 64 2e er type changed. ... 00004ce6 : 4ce6: ff ff 57 61 72 6e 69 6e 67 3a 20 6d 6f 74 68 65 ..Warning: mothe 4cf6: 72 62 6f 61 72 64 20 74 79 70 65 20 63 68 61 6e rboard type chan 4d06: 67 65 64 2e 00 ged.. 00004d0b : 4d0b: ff ff 53 68 65 65 74 00 ..Sheet. 00004d13 : 4d13: ff ff 52 65 63 6f 76 65 72 69 6e 67 20 70 72 69 ..Recovering pri 4d23: 6e 74 00 nt. 00004d26 : 4d26: ff ff 54 48 45 52 4d 41 4c 20 41 4e 4f 4d 41 4c ..THERMAL ANOMAL 4d36: 59 00 Y. 00004d38 : 4d38: ff ff 52 65 73 75 6d 69 6e 67 20 70 72 69 6e 74 ..Resuming print ... 00004d49 : 4d49: ff ff 50 49 4e 44 41 20 48 65 61 74 69 6e 67 00 ..PINDA Heating. 00004d59 : 4d59: ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 20 64 6f ..Calibration do 4d69: 6e 65 00 ne. 00004d6c : 4d6c: ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 00 ..Calibrating Z. 00004d7c : 4d7c: ff ff 42 65 64 20 64 6f 6e 65 00 ..Bed done. 00004d87 : 4d87: ff ff 42 65 64 20 48 65 61 74 69 6e 67 00 ..Bed Heating. 00004d95 : 4d95: ff ff 48 65 61 74 69 6e 67 20 64 6f 6e 65 2e 00 ..Heating done.. 00004da5 : 4da5: ff ff 48 65 61 74 69 6e 67 00 ..Heating. 00004daf : 4daf: ff ff 4d 4d 55 20 66 61 69 6c 73 00 ..MMU fails. 00004dbb : 4dbb: ff ff 4d 4d 55 20 6c 6f 61 64 20 66 61 69 6c 73 ..MMU load fails ... 00004dcc : 4dcc: ff ff 4d 4d 55 20 70 6f 77 65 72 20 66 61 69 6c ..MMU power fail 4ddc: 73 00 s. 00004dde : 4dde: ff ff 4d 61 74 65 72 69 61 6c 20 63 68 61 6e 67 ..Material chang 4dee: 65 73 00 es. 00004df1 : 4df1: ff ff 54 6f 74 61 6c 20 66 61 69 6c 75 72 65 73 ..Total failures ... 00004e02 : 4e02: ff ff 4c 61 73 74 20 70 72 69 6e 74 20 66 61 69 ..Last print fai 4e12: 6c 75 72 65 73 00 lures. 00004e18 : 4e18: ff ff 50 6f 77 65 72 20 66 61 69 6c 75 72 65 73 ..Power failures ... 00004e29 : 4e29: ff ff 46 69 6c 2e 20 72 75 6e 6f 75 74 73 00 ..Fil. runouts. 00004e38 : 4e38: ff ff 43 72 61 73 68 00 ..Crash. 00004e40 : 4e40: ff ff 54 6f 74 61 6c 00 ..Total. 00004e48 : 4e48: ff ff 4c 61 73 74 20 70 72 69 6e 74 00 ..Last print. 00004e55 : 4e55: ff ff 41 6d 62 69 65 6e 74 00 ..Ambient. 00004e5f : 4e5f: ff ff 56 6f 6c 74 61 67 65 73 00 ..Voltages. 00004e6a : 4e6a: ff ff 54 65 6d 70 65 72 61 74 75 72 65 73 00 ..Temperatures. 00004e79 : 4e79: ff ff 42 65 6c 74 20 73 74 61 74 75 73 00 ..Belt status. 00004e87 : 4e87: ff ff 53 65 6e 73 6f 72 20 69 6e 66 6f 00 ..Sensor info. 00004e95 : 4e95: ff ff 45 78 74 72 75 64 65 72 20 69 6e 66 6f 00 ..Extruder info. 00004ea5 : 4ea5: ff ff 58 59 5a 20 63 61 6c 2e 20 64 65 74 61 69 ..XYZ cal. detai 4eb5: 6c 73 00 ls. 00004eb8 : 4eb8: ff ff 50 72 69 6e 74 65 72 20 49 50 20 41 64 64 ..Printer IP Add 4ec8: 72 3a 00 r:. 00004ecb : 4ecb: ff ff 75 6e 6b 6e 6f 77 6e 00 ..unknown. 00004ed5 : 4ed5: ff ff 4d 4d 55 20 63 6f 6e 6e 65 63 74 65 64 00 ..MMU connected. 00004ee5 : 4ee5: ff ff 44 61 74 65 3a 00 ..Date:. 00004eed : 4eed: ff ff 74 6f 20 75 6e 6c 6f 61 64 20 66 69 6c 61 ..to unload fila 4efd: 6d 65 6e 74 00 ment. 00004f02 : 4f02: ff ff 74 6f 20 6c 6f 61 64 20 66 69 6c 61 6d 65 ..to load filame 4f12: 6e 74 00 nt. 00004f15 : 4f15: ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 ..Press the knob ... 00004f26 : 4f26: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 4f36: 63 75 74 00 cut. 00004f3a : 4f3a: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 4f4a: 65 6a 65 63 74 00 eject. 00004f50 : 4f50: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 4f60: 75 6e 6c 6f 61 64 00 unload. 00004f67 : 4f67: ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20 ..Preheating to 4f77: 6c 6f 61 64 00 load. 00004f7c : 4f7c: ff ff 43 6f 6f 6c 64 6f 77 6e 00 ..Cooldown. 00004f87 : 4f87: ff ff 46 69 6c 61 6d 65 6e 74 20 65 78 74 72 75 ..Filament extru 4f97: 64 69 6e 67 20 26 20 77 69 74 68 20 63 6f 72 72 ding & with corr 4fa7: 65 63 74 20 63 6f 6c 6f 72 3f 00 ect color?. 00004fb2 : 4fb2: ff ff 45 6a 65 63 74 00 ..Eject. 00004fba : 4fba: ff ff 41 75 74 6f 6c 6f 61 64 69 6e 67 20 66 69 ..Autoloading fi 4fca: 6c 61 6d 65 6e 74 20 69 73 20 61 63 74 69 76 65 lament is active 4fda: 2c 20 6a 75 73 74 20 70 72 65 73 73 20 74 68 65 , just press the 4fea: 20 6b 6e 6f 62 20 61 6e 64 20 69 6e 73 65 72 74 knob and insert 4ffa: 20 66 69 6c 61 6d 65 6e 74 2e 2e 2e 00 filament.... 00005007 : 5007: ff ff 54 6f 74 61 6c 20 66 69 6c 61 6d 65 6e 74 ..Total filament ... 00005018 : 5018: ff ff 54 6f 74 61 6c 20 70 72 69 6e 74 20 74 69 ..Total print ti 5028: 6d 65 00 me. 0000502b : 502b: ff ff 46 69 6c 61 6d 65 6e 74 20 75 73 65 64 00 ..Filament used. 0000503b : 503b: ff ff 50 72 69 6e 74 20 74 69 6d 65 00 ..Print time. 00005048 : 5048: ff ff 50 72 65 68 65 61 74 20 74 68 65 20 6e 6f ..Preheat the no 5058: 7a 7a 6c 65 21 00 zzle!. 0000505e : 505e: ff ff 45 52 52 4f 52 3a 00 ..ERROR:. 00005067 : 5067: ff ff 59 20 64 69 73 74 61 6e 63 65 20 66 72 6f ..Y distance fro 5077: 6d 20 6d 69 6e 00 m min. 0000507d : 507d: ff ff 4c 65 66 74 00 ..Left. 00005084 : 5084: ff ff 52 69 67 68 74 00 ..Right. 0000508c : 508c: ff ff 4d 65 61 73 75 72 65 64 20 73 6b 65 77 00 ..Measured skew. 0000509c : 509c: ff ff 53 6c 69 67 68 74 20 73 6b 65 77 00 ..Slight skew. 000050aa : 50aa: ff ff 53 65 76 65 72 65 20 73 6b 65 77 00 ..Severe skew. 000050b8 : 50b8: ff ff 5b 30 3b 30 5d 20 70 6f 69 6e 74 20 6f 66 ..[0;0] point of 50c8: 66 73 65 74 00 fset. 000050cd : 50cd: ff ff 41 64 6a 75 73 74 69 6e 67 20 5a 00 ..Adjusting Z. 000050db : 50db: ff ff 52 65 61 72 20 73 69 64 65 20 5b e4 6d 5d ..Rear side [.m] ... 000050ec : 50ec: ff ff 46 72 6f 6e 74 20 73 69 64 65 5b e4 6d 5d ..Front side[.m] ... 000050fd : 50fd: ff ff 52 69 67 68 74 20 73 69 64 65 5b e4 6d 5d ..Right side[.m] ... 0000510e : 510e: ff ff 4c 65 66 74 20 73 69 64 65 20 5b e4 6d 5d ..Left side [.m] ... 0000511f : 511f: ff ff 53 65 74 20 74 65 6d 70 65 72 61 74 75 72 ..Set temperatur 512f: 65 3a 00 e:. 00005132 : 5132: ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 ..PINDA calibrat 5142: 69 6f 6e 20 66 61 69 6c 65 64 00 ion failed. 0000514d : 514d: ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 ..PINDA calibrat 515d: 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20 ion is finished 516d: 61 6e 64 20 61 63 74 69 76 65 2e 20 49 74 20 63 and active. It c 517d: 61 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 69 an be disabled i 518d: 6e 20 6d 65 6e 75 20 53 65 74 74 69 6e 67 73 2d n menu Settings- 519d: 3e 50 49 4e 44 41 20 63 61 6c 2e 00 >PINDA cal.. 000051a9 : 51a9: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 53 65 ..Feeding to FSe 51b9: 6e 73 6f 72 00 nsor. 000051be : 51be: ff ff 4d 6f 76 69 6e 67 20 73 65 6c 65 63 74 6f ..Moving selecto 51ce: 72 00 r. 000051d0 : 51d0: ff ff 48 6f 6d 69 6e 67 00 ..Homing. 000051d9 : 51d9: ff ff 52 65 74 72 61 63 74 20 66 72 6f 6d 20 46 ..Retract from F 51e9: 49 4e 44 41 00 INDA. 000051ee : 51ee: ff ff 45 6a 65 63 74 69 6e 67 20 66 69 6c 61 6d ..Ejecting filam 51fe: 65 6e 74 00 ent. 00005202 : 5202: ff ff 50 61 72 6b 69 6e 67 20 73 65 6c 65 63 74 ..Parking select 5212: 6f 72 00 or. 00005215 : 5215: ff ff 52 65 74 75 72 6e 69 6e 67 20 73 65 6c 65 ..Returning sele 5225: 63 74 6f 72 00 ctor. 0000522a : 522a: ff ff 50 65 72 66 6f 72 6d 69 6e 67 20 63 75 74 ..Performing cut ... 0000523b : 523b: ff ff 50 75 73 68 69 6e 67 20 66 69 6c 61 6d 65 ..Pushing filame 524b: 6e 74 00 nt. 0000524e : 524e: ff ff 50 72 65 70 61 72 69 6e 67 20 62 6c 61 64 ..Preparing blad 525e: 65 00 e. 00005260 : 5260: ff ff 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 2e ..Selecting fil. 5270: 20 73 6c 6f 74 00 slot. 00005276 : 5276: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61 ..Unloading fila 5286: 6d 65 6e 74 00 ment. 0000528b : 528b: ff ff 45 52 52 20 54 4d 43 20 66 61 69 6c 65 64 ..ERR TMC failed ... 0000529c : 529c: ff ff 45 52 52 20 48 65 6c 70 20 66 69 6c 61 6d ..ERR Help filam 52ac: 65 6e 74 00 ent. 000052b0 : 52b0: ff ff 45 52 52 20 49 6e 74 65 72 6e 61 6c 00 ..ERR Internal. 000052bf : 52bf: ff ff 45 52 52 20 57 61 69 74 20 66 6f 72 20 55 ..ERR Wait for U 52cf: 73 65 72 00 ser. 000052d3 : 52d3: ff ff 46 69 6e 69 73 68 69 6e 67 20 6d 6f 76 65 ..Finishing move 52e3: 6d 65 6e 74 73 00 ments. 000052e9 : 52e9: ff ff 41 76 6f 69 64 69 6e 67 20 67 72 69 6e 64 ..Avoiding grind ... 000052fa : 52fa: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 6e 6f 7a ..Feeding to noz 530a: 7a 6c 65 00 zle. 0000530e : 530e: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 65 78 74 ..Feeding to ext 531e: 72 75 64 65 72 00 ruder. 00005324 : 5324: ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 49 4e ..Feeding to FIN 5334: 44 41 00 DA. 00005337 : 5337: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 70 ..Unloading to p 5347: 75 6c 6c 65 79 00 ulley. 0000534d : 534d: ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 46 ..Unloading to F 535d: 49 4e 44 41 00 INDA. 00005362 : 5362: ff ff 44 69 73 65 6e 67 61 67 69 6e 67 20 69 64 ..Disengaging id 5372: 6c 65 72 00 ler. 00005376 : 5376: ff ff 45 6e 67 61 67 69 6e 67 20 69 64 6c 65 72 ..Engaging idler ... 00005387 : 5387: ff ff 4f 4b 00 ..OK. 0000538c <_ZN4MMU2L23MSG_TITLE_UNKNOWN_ERRORE.lto_priv.530>: 538c: ff ff 55 4e 4b 4e 4f 57 4e 20 45 52 52 4f 52 00 ..UNKNOWN ERROR. 0000539c <_ZN4MMU2L25MSG_TITLE_FILAMENT_CHANGEE.lto_priv.529>: 539c: ff ff 46 49 4c 41 4d 45 4e 54 20 43 48 41 4e 47 ..FILAMENT CHANG 53ac: 45 00 E. 000053ae <_ZN4MMU2L26MSG_TITLE_FILAMENT_EJECTEDE.lto_priv.528>: 53ae: ff ff 46 49 4c 41 4d 45 4e 54 20 45 4a 45 43 54 ..FILAMENT EJECT 53be: 45 44 00 ED. 000053c1 <_ZN4MMU2L25MSG_TITLE_UNLOAD_MANUALLYE.lto_priv.527>: 53c1: ff ff 55 4e 4c 4f 41 44 20 4d 41 4e 55 41 4c 4c ..UNLOAD MANUALL 53d1: 59 00 Y. 000053d3 <_ZN4MMU2L26MSG_TITLE_FW_RUNTIME_ERRORE.lto_priv.526>: 53d3: ff ff 46 57 20 52 55 4e 54 49 4d 45 20 45 52 52 ..FW RUNTIME ERR 53e3: 4f 52 00 OR. 000053e6 <_ZN4MMU2L26MSG_TITLE_FW_UPDATE_NEEDEDE.lto_priv.525>: 53e6: ff ff 4d 4d 55 20 46 57 20 55 50 44 41 54 45 20 ..MMU FW UPDATE 53f6: 4e 45 45 44 45 44 00 NEEDED. 000053fd <_ZN4MMU2L20MSG_TITLE_QUEUE_FULLE.lto_priv.524>: 53fd: ff ff 51 55 45 55 45 20 46 55 4c 4c 00 ..QUEUE FULL. 0000540a <_ZN4MMU2L22MSG_TITLE_INVALID_TOOLE.lto_priv.523>: 540a: ff ff 49 4e 56 41 4c 49 44 20 54 4f 4f 4c 00 ..INVALID TOOL. 00005419 <_ZN4MMU2L33MSG_TITLE_FILAMENT_ALREADY_LOADEDE.lto_priv.522>: 5419: ff ff 46 49 4c 2e 20 41 4c 52 45 41 44 59 20 4c ..FIL. ALREADY L 5429: 4f 41 44 45 44 00 OADED. 0000542f <_ZN4MMU2L29MSG_TITLE_COMMUNICATION_ERRORE.lto_priv.521>: 542f: ff ff 43 4f 4d 4d 55 4e 49 43 41 54 49 4f 4e 20 ..COMMUNICATION 543f: 45 52 52 4f 52 00 ERROR. 00005445 <_ZN4MMU2L28MSG_TITLE_MMU_NOT_RESPONDINGE.lto_priv.520>: 5445: ff ff 4d 4d 55 20 4e 4f 54 20 52 45 53 50 4f 4e ..MMU NOT RESPON 5455: 44 49 4e 47 00 DING. 0000545a <_ZN4MMU2L23MSG_TITLE_MMU_MCU_ERRORE.lto_priv.519>: 545a: ff ff 4d 4d 55 20 4d 43 55 20 45 52 52 4f 52 00 ..MMU MCU ERROR. 0000546a <_ZN4MMU2L25MSG_TITLE_SELFTEST_FAILEDE.lto_priv.518>: 546a: ff ff 4d 4d 55 20 53 45 4c 46 54 45 53 54 20 46 ..MMU SELFTEST F 547a: 41 49 4c 45 44 00 AILED. 00005480 <_ZN4MMU2L28MSG_TITLE_TMC_DRIVER_SHORTEDE.lto_priv.517>: 5480: ff ff 54 4d 43 20 44 52 49 56 45 52 20 53 48 4f ..TMC DRIVER SHO 5490: 52 54 45 44 00 RTED. 00005495 <_ZN4MMU2L32MSG_TITLE_TMC_UNDERVOLTAGE_ERRORE.lto_priv.516>: 5495: ff ff 54 4d 43 20 55 4e 44 45 52 56 4f 4c 54 41 ..TMC UNDERVOLTA 54a5: 47 45 20 45 52 52 00 GE ERR. 000054ac <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_RESETE.lto_priv.515>: 54ac: ff ff 54 4d 43 20 44 52 49 56 45 52 20 52 45 53 ..TMC DRIVER RES 54bc: 45 54 00 ET. 000054bf <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_ERRORE.lto_priv.514>: 54bf: ff ff 54 4d 43 20 44 52 49 56 45 52 20 45 52 52 ..TMC DRIVER ERR 54cf: 4f 52 00 OR. 000054d2 <_ZN4MMU2L28MSG_TITLE_TMC_OVERHEAT_ERRORE.lto_priv.513>: 54d2: ff ff 54 4d 43 20 4f 56 45 52 48 45 41 54 20 45 ..TMC OVERHEAT E 54e2: 52 52 4f 52 00 RROR. 000054e7 <_ZN4MMU2L33MSG_TITLE_TMC_WARNING_TMC_TOO_HOTE.lto_priv.512>: 54e7: ff ff 57 41 52 4e 49 4e 47 20 54 4d 43 20 54 4f ..WARNING TMC TO 54f7: 4f 20 48 4f 54 00 O HOT. 000054fd <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_MOVEE.lto_priv.511>: 54fd: ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 4d ..IDLER CANNOT M 550d: 4f 56 45 00 OVE. 00005511 <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_HOMEE.lto_priv.510>: 5511: ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 48 ..IDLER CANNOT H 5521: 4f 4d 45 00 OME. 00005525 <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_MOVEE.lto_priv.509>: 5525: ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f ..SELECTOR CANNO 5535: 54 20 4d 4f 56 45 00 T MOVE. 0000553c <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_HOMEE.lto_priv.508>: 553c: ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f ..SELECTOR CANNO 554c: 54 20 48 4f 4d 45 00 T HOME. 00005553 <_ZN4MMU2L33MSG_TITLE_LOAD_TO_EXTRUDER_FAILEDE.lto_priv.507>: 5553: ff ff 4c 4f 41 44 20 54 4f 20 45 58 54 52 2e 20 ..LOAD TO EXTR. 5563: 46 41 49 4c 45 44 00 FAILED. 0000556a <_ZN4MMU2L23MSG_TITLE_INSPECT_FINDAE.lto_priv.506>: 556a: ff ff 49 4e 53 50 45 43 54 20 46 49 4e 44 41 00 ..INSPECT FINDA. 0000557a <_ZN4MMU2L27MSG_TITLE_FSENSOR_TOO_EARLYE.lto_priv.505>: 557a: ff ff 46 53 45 4e 53 4f 52 20 54 4f 4f 20 45 41 ..FSENSOR TOO EA 558a: 52 4c 59 00 RLY. 0000558e <_ZN4MMU2L28MSG_TITLE_PULLEY_CANNOT_MOVEE.lto_priv.504>: 558e: ff ff 50 55 4c 4c 45 59 20 43 41 4e 4e 4f 54 20 ..PULLEY CANNOT 559e: 4d 4f 56 45 00 MOVE. 000055a3 <_ZN4MMU2L32MSG_TITLE_FSENSOR_FILAMENT_STUCKE.lto_priv.503>: 55a3: ff ff 46 53 45 4e 53 4f 52 20 46 49 4c 2e 20 53 ..FSENSOR FIL. S 55b3: 54 55 43 4b 00 TUCK. 000055b8 <_ZN4MMU2L31MSG_TITLE_FSENSOR_DIDNT_TRIGGERE.lto_priv.502>: 55b8: ff ff 46 53 45 4e 53 4f 52 20 44 49 44 4e 54 20 ..FSENSOR DIDNT 55c8: 54 52 49 47 47 2e 00 TRIGG.. 000055cf <_ZN4MMU2L30MSG_TITLE_FINDA_FILAMENT_STUCKE.lto_priv.501>: 55cf: ff ff 46 49 4e 44 41 20 46 49 4c 41 4d 2e 20 53 ..FINDA FILAM. S 55df: 54 55 43 4b 00 TUCK. 000055e4 <_ZN4MMU2L29MSG_TITLE_FINDA_DIDNT_TRIGGERE.lto_priv.500>: 55e4: ff ff 46 49 4e 44 41 20 44 49 44 4e 54 20 54 52 ..FINDA DIDNT TR 55f4: 49 47 47 45 52 00 IGGER. 000055fa : 55fa: ff ff 4e 6f 74 20 73 70 69 6e 6e 69 6e 67 00 ..Not spinning. 00005609 : 5609: ff ff 53 70 69 6e 6e 69 6e 67 00 ..Spinning. 00005614 : 5614: ff ff 46 61 6e 20 74 65 73 74 00 ..Fan test. 0000561f : 561f: ff ff 53 65 6c 66 74 65 73 74 20 66 61 69 6c 65 ..Selftest faile 562f: 64 00 d. 00005631 : 5631: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 5641: 72 00 r. 00005643 : 5643: ff ff 53 77 61 70 70 65 64 00 ..Swapped. 0000564d : 564d: ff ff 46 72 6f 6e 74 2f 6c 65 66 74 20 66 61 6e ..Front/left fan 565d: 73 00 s. 0000565f : 565f: ff ff 41 78 69 73 00 ..Axis. 00005666 : 5666: ff ff 41 78 69 73 20 6c 65 6e 67 74 68 00 ..Axis length. 00005674 : 5674: ff ff 4c 6f 6f 73 65 20 70 75 6c 6c 65 79 00 ..Loose pulley. 00005683 : 5683: ff ff 4c 65 66 74 20 68 6f 74 65 6e 64 20 66 61 ..Left hotend fa 5693: 6e 3f 00 n?. 00005696 : 5696: ff ff 46 72 6f 6e 74 20 70 72 69 6e 74 20 66 61 ..Front print fa 56a6: 6e 3f 00 n?. 000056a9 : 56a9: ff ff 45 6e 64 73 74 6f 70 20 6e 6f 74 20 68 69 ..Endstop not hi 56b9: 74 00 t. 000056bb : 56bb: ff ff 45 6e 64 73 74 6f 70 00 ..Endstop. 000056c5 : 56c5: ff ff 4d 6f 74 6f 72 00 ..Motor. 000056cd : 56cd: ff ff 45 6e 64 73 74 6f 70 73 00 ..Endstops. 000056d8 : 56d8: ff ff 57 69 72 69 6e 67 20 65 72 72 6f 72 00 ..Wiring error. 000056e7 : 56e7: ff ff 42 65 64 2f 48 65 61 74 65 72 00 ..Bed/Heater. 000056f4 : 56f4: ff ff 4e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 00 ..Not connected. 00005704 : 5704: ff ff 48 65 61 74 65 72 2f 54 68 65 72 6d 69 73 ..Heater/Thermis 5714: 74 6f 72 00 tor. 00005718 : 5718: ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 3a 00 ..Please check:. 00005728 : 5728: ff ff 53 65 6c 66 74 65 73 74 20 65 72 72 6f 72 ..Selftest error 5738: 21 00 !. 0000573a : 573a: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 574a: 6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 53 6b 65 n all right. Ske 575a: 77 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 65 63 w will be correc 576a: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ted automaticall 577a: 79 2e 00 y.. 0000577d : 577d: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 578d: 6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 58 2f 59 n all right. X/Y 579d: 20 61 78 65 73 20 61 72 65 20 73 6c 69 67 68 74 axes are slight 57ad: 6c 79 20 73 6b 65 77 65 64 2e 20 47 6f 6f 64 20 ly skewed. Good 57bd: 6a 6f 62 21 00 job!. 000057c2 : 57c2: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 57d2: 6e 20 6f 6b 2e 20 58 2f 59 20 61 78 65 73 20 61 n ok. X/Y axes a 57e2: 72 65 20 70 65 72 70 65 6e 64 69 63 75 6c 61 72 re perpendicular 57f2: 2e 20 43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e . Congratulation 5802: 73 21 00 s!. 00005805 : 5805: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5815: 6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 52 n compromised. R 5825: 69 67 68 74 20 66 72 6f 6e 74 20 63 61 6c 69 62 ight front calib 5835: 72 61 74 69 6f 6e 20 70 6f 69 6e 74 20 6e 6f 74 ration point not 5845: 20 72 65 61 63 68 61 62 6c 65 2e 00 reachable.. 00005851 : 5851: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5861: 6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 46 n compromised. F 5871: 72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e ront calibration 5881: 20 70 6f 69 6e 74 73 20 6e 6f 74 20 72 65 61 63 points not reac 5891: 68 61 62 6c 65 2e 00 hable.. 00005898 : 5898: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 58a8: 6e 20 66 61 69 6c 65 64 2e 20 52 69 67 68 74 20 n failed. Right 58b8: 66 72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f front calibratio 58c8: 6e 20 70 6f 69 6e 74 20 6e 6f 74 20 72 65 61 63 n point not reac 58d8: 68 61 62 6c 65 2e 00 hable.. 000058df : 58df: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 58ef: 6e 20 66 61 69 6c 65 64 2e 20 46 72 6f 6e 74 20 n failed. Front 58ff: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 590f: 74 73 20 6e 6f 74 20 72 65 61 63 68 61 62 6c 65 ts not reachable 591f: 2e 00 .. 00005921 : 5921: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5931: 6e 20 66 61 69 6c 65 64 2e 20 50 6c 65 61 73 65 n failed. Please 5941: 20 63 6f 6e 73 75 6c 74 20 74 68 65 20 6d 61 6e consult the man 5951: 75 61 6c 2e 00 ual.. 00005956 : 5956: ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f ..XYZ calibratio 5966: 6e 20 66 61 69 6c 65 64 2e 20 42 65 64 20 63 61 n failed. Bed ca 5976: 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e 74 20 libration point 5986: 77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 00 was not found.. 00005995 : 5995: ff ff 50 6c 65 61 73 65 20 70 6c 61 63 65 20 73 ..Please place s 59a5: 74 65 65 6c 20 73 68 65 65 74 20 6f 6e 20 68 65 teel sheet on he 59b5: 61 74 62 65 64 2e 00 atbed.. 000059bc : 59bc: ff ff 44 69 73 74 61 6e 63 65 20 62 65 74 77 65 ..Distance betwe 59cc: 65 6e 20 74 69 70 20 6f 66 20 74 68 65 20 6e 6f en tip of the no 59dc: 7a 7a 6c 65 20 61 6e 64 20 74 68 65 20 62 65 64 zzle and the bed 59ec: 20 73 75 72 66 61 63 65 20 68 61 73 20 6e 6f 74 surface has not 59fc: 20 62 65 65 6e 20 73 65 74 20 79 65 74 2e 20 50 been set yet. P 5a0c: 6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65 lease follow the 5a1c: 20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72 manual, chapter 5a2c: 20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65 First steps, se 5a3c: 63 74 69 6f 6e 20 46 69 72 73 74 20 6c 61 79 65 ction First laye 5a4c: 72 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 00 r calibration.. 00005a5b : 5a5b: ff ff 50 6c 61 63 65 20 61 20 73 68 65 65 74 20 ..Place a sheet 5a6b: 6f 66 20 70 61 70 65 72 20 75 6e 64 65 72 20 74 of paper under t 5a7b: 68 65 20 6e 6f 7a 7a 6c 65 20 64 75 72 69 6e 67 he nozzle during 5a8b: 20 74 68 65 20 63 61 6c 69 62 72 61 74 69 6f 6e the calibration 5a9b: 20 6f 66 20 66 69 72 73 74 20 34 20 70 6f 69 6e of first 4 poin 5aab: 74 73 2e 20 49 66 20 74 68 65 20 6e 6f 7a 7a 6c ts. If the nozzl 5abb: 65 20 63 61 74 63 68 65 73 20 74 68 65 20 70 61 e catches the pa 5acb: 70 65 72 2c 20 70 6f 77 65 72 20 6f 66 66 20 74 per, power off t 5adb: 68 65 20 70 72 69 6e 74 65 72 20 69 6d 6d 65 64 he printer immed 5aeb: 69 61 74 65 6c 79 2e 00 iately.. 00005af3 : 5af3: ff ff 53 65 61 72 63 68 69 6e 67 20 62 65 64 20 ..Searching bed 5b03: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 5b13: 74 00 t. 00005b15 : 5b15: ff ff 4d 65 61 73 75 72 69 6e 67 20 72 65 66 65 ..Measuring refe 5b25: 72 65 6e 63 65 20 68 65 69 67 68 74 20 6f 66 20 rence height of 5b35: 63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e calibration poin 5b45: 74 00 t. 00005b47 : 5b47: ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 74 ..Please clean t 5b57: 68 65 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20 63 61 he nozzle for ca 5b67: 6c 69 62 72 61 74 69 6f 6e 2e 20 43 6c 69 63 6b libration. Click 5b77: 20 77 68 65 6e 20 64 6f 6e 65 2e 00 when done.. 00005b83 : 5b83: ff ff 41 75 74 6f 20 68 6f 6d 65 00 ..Auto home. 00005b8f : 5b8f: ff ff 43 75 74 20 66 69 6c 61 6d 65 6e 74 00 ..Cut filament. 00005b9e : 5b9e: ff ff 45 6a 65 63 74 20 66 72 6f 6d 20 4d 4d 55 ..Eject from MMU ... 00005baf : 5baf: ff ff 4c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65 ..Loading filame 5bbf: 6e 74 00 nt. 00005bc2 : 5bc2: ff ff 4d 4d 55 20 52 65 74 72 79 3a 20 52 65 73 ..MMU Retry: Res 5bd2: 74 6f 72 69 6e 67 20 74 65 6d 70 65 72 61 74 75 toring temperatu 5be2: 72 65 2e 2e 2e 00 re.... 00005be8 : 5be8: ff ff 53 6f 72 74 69 6e 67 20 66 69 6c 65 73 00 ..Sorting files. 00005bf8 : 5bf8: ff ff 53 6f 6d 65 20 66 69 6c 65 73 20 77 69 6c ..Some files wil 5c08: 6c 20 6e 6f 74 20 62 65 20 73 6f 72 74 65 64 2e l not be sorted. 5c18: 20 4d 61 78 2e 20 4e 6f 2e 20 6f 66 20 66 69 6c Max. No. of fil 5c28: 65 73 20 69 6e 20 31 20 66 6f 6c 64 65 72 20 66 es in 1 folder f 5c38: 6f 72 20 73 6f 72 74 69 6e 67 20 69 73 20 31 30 or sorting is 10 5c48: 30 2e 00 0.. 00005c4b : 5c4b: ff ff 4f 66 66 00 ..Off. 00005c51 : 5c51: ff ff 4f 6e 00 ..On. 00005c56 : 5c56: ff ff 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 ..Unexpected err 5c66: 6f 72 20 6f 63 63 75 72 72 65 64 2e 00 or occurred.. 00005c73 : 5c73: ff ff 4d 36 30 30 20 46 69 6c 61 6d 65 6e 74 20 ..M600 Filament 5c83: 43 68 61 6e 67 65 2e 20 4c 6f 61 64 20 61 20 6e Change. Load a n 5c93: 65 77 20 66 69 6c 61 6d 65 6e 74 20 6f 72 20 65 ew filament or e 5ca3: 6a 65 63 74 20 74 68 65 20 6f 6c 64 20 6f 6e 65 ject the old one 5cb3: 2e 00 .. 00005cb5 : 5cb5: ff ff 52 65 6d 6f 76 65 20 74 68 65 20 65 6a 65 ..Remove the eje 5cc5: 63 74 65 64 20 66 69 6c 61 6d 65 6e 74 20 66 72 cted filament fr 5cd5: 6f 6d 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 om the front of 5ce5: 74 68 65 20 4d 4d 55 2e 00 the MMU.. 00005cee : 5cee: ff ff 46 69 6c 61 6d 65 6e 74 20 64 65 74 65 63 ..Filament detec 5cfe: 74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c 79 ted unexpectedly 5d0e: 2e 20 45 6e 73 75 72 65 20 6e 6f 20 66 69 6c 61 . Ensure no fila 5d1e: 6d 65 6e 74 20 69 73 20 6c 6f 61 64 65 64 2e 20 ment is loaded. 5d2e: 43 68 65 63 6b 20 74 68 65 20 73 65 6e 73 6f 72 Check the sensor 5d3e: 73 20 61 6e 64 20 77 69 72 69 6e 67 2e 00 s and wiring.. 00005d4c : 5d4c: ff ff 49 6e 74 65 72 6e 61 6c 20 72 75 6e 74 69 ..Internal runti 5d5c: 6d 65 20 65 72 72 6f 72 2e 20 54 72 79 20 72 65 me error. Try re 5d6c: 73 65 74 74 69 6e 67 20 74 68 65 20 4d 4d 55 20 setting the MMU 5d7c: 6f 72 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 or updating the 5d8c: 66 69 72 6d 77 61 72 65 2e 00 firmware.. 00005d96 : 5d96: ff ff 4d 4d 55 20 46 57 20 76 65 72 73 69 6f 6e ..MMU FW version 5da6: 20 69 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 is incompatible 5db6: 20 77 69 74 68 20 70 72 69 6e 74 65 72 20 46 57 with printer FW 5dc6: 2e 55 70 64 61 74 65 20 74 6f 20 76 65 72 73 69 .Update to versi 5dd6: 6f 6e 20 33 2e 30 2e 33 2e 00 on 3.0.3.. 00005de0 : 5de0: ff ff 4d 4d 55 20 46 69 72 6d 77 61 72 65 20 69 ..MMU Firmware i 5df0: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 2c 20 70 nternal error, p 5e00: 6c 65 61 73 65 20 72 65 73 65 74 20 74 68 65 20 lease reset the 5e10: 4d 4d 55 2e 00 MMU.. 00005e15 : 5e15: ff ff 52 65 71 75 65 73 74 65 64 20 66 69 6c 61 ..Requested fila 5e25: 6d 65 6e 74 20 74 6f 6f 6c 20 69 73 20 6e 6f 74 ment tool is not 5e35: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 available on th 5e45: 69 73 20 68 61 72 64 77 61 72 65 2e 20 43 68 65 is hardware. Che 5e55: 63 6b 20 74 68 65 20 47 2d 63 6f 64 65 20 66 6f ck the G-code fo 5e65: 72 20 74 6f 6f 6c 20 69 6e 64 65 78 20 6f 75 74 r tool index out 5e75: 20 6f 66 20 72 61 6e 67 65 20 28 54 30 2d 54 34 of range (T0-T4 5e85: 29 2e 00 ).. 00005e88 : 5e88: ff ff 43 61 6e 6e 6f 74 20 70 65 72 66 6f 72 6d ..Cannot perform 5e98: 20 74 68 65 20 61 63 74 69 6f 6e 2c 20 66 69 6c the action, fil 5ea8: 61 6d 65 6e 74 20 69 73 20 61 6c 72 65 61 64 79 ament is already 5eb8: 20 6c 6f 61 64 65 64 2e 20 55 6e 6c 6f 61 64 20 loaded. Unload 5ec8: 69 74 20 66 69 72 73 74 2e 00 it first.. 00005ed2 : 5ed2: ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e ..MMU not respon 5ee2: 64 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20 ding correctly. 5ef2: 43 68 65 63 6b 20 74 68 65 20 77 69 72 69 6e 67 Check the wiring 5f02: 20 61 6e 64 20 63 6f 6e 6e 65 63 74 6f 72 73 2e and connectors. ... 00005f13 : 5f13: ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e ..MMU not respon 5f23: 64 69 6e 67 2e 20 43 68 65 63 6b 20 74 68 65 20 ding. Check the 5f33: 77 69 72 69 6e 67 20 61 6e 64 20 63 6f 6e 6e 65 wiring and conne 5f43: 63 74 6f 72 73 2e 00 ctors.. 00005f4a : 5f4a: ff ff 4d 6f 72 65 20 64 65 74 61 69 6c 73 20 6f ..More details o 5f5a: 6e 6c 69 6e 65 2e 00 nline.. 00005f61 : 5f61: ff ff 54 68 65 20 49 64 6c 65 72 20 63 61 6e 6e ..The Idler cann 5f71: 6f 74 20 68 6f 6d 65 20 70 72 6f 70 65 72 6c 79 ot home properly 5f81: 2e 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 79 74 . Check for anyt 5f91: 68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 69 74 hing blocking it 5fa1: 73 20 6d 6f 76 65 6d 65 6e 74 2e 00 s movement.. 00005fad : 5fad: ff ff 43 61 6e 27 74 20 6d 6f 76 65 20 53 65 6c ..Can't move Sel 5fbd: 65 63 74 6f 72 20 6f 72 20 49 64 6c 65 72 2e 00 ector or Idler.. 00005fcd : 5fcd: ff ff 54 68 65 20 53 65 6c 65 63 74 6f 72 20 63 ..The Selector c 5fdd: 61 6e 6e 6f 74 20 68 6f 6d 65 20 70 72 6f 70 65 annot home prope 5fed: 72 6c 79 2e 20 43 68 65 63 6b 20 66 6f 72 20 61 rly. Check for a 5ffd: 6e 79 74 68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 nything blocking 600d: 20 69 74 73 20 6d 6f 76 65 6d 65 6e 74 2e 00 its movement.. 0000601c : 601c: ff ff 4c 6f 61 64 69 6e 67 20 74 6f 20 65 78 74 ..Loading to ext 602c: 72 75 64 65 72 20 66 61 69 6c 65 64 2e 20 49 6e ruder failed. In 603c: 73 70 65 63 74 20 74 68 65 20 66 69 6c 61 6d 65 spect the filame 604c: 6e 74 20 74 69 70 20 73 68 61 70 65 2e 20 52 65 nt tip shape. Re 605c: 66 69 6e 65 20 74 68 65 20 73 65 6e 73 6f 72 20 fine the sensor 606c: 63 61 6c 69 62 72 61 74 69 6f 6e 2c 20 69 66 20 calibration, if 607c: 6e 65 65 64 65 64 2e 00 needed.. 00006084 : 6084: ff ff 53 65 6c 65 63 74 6f 72 20 63 61 6e 27 74 ..Selector can't 6094: 20 6d 6f 76 65 20 64 75 65 20 74 6f 20 46 49 4e move due to FIN 60a4: 44 41 20 64 65 74 65 63 74 69 6e 67 20 61 20 66 DA detecting a f 60b4: 69 6c 61 6d 65 6e 74 2e 20 4d 61 6b 65 20 73 75 ilament. Make su 60c4: 72 65 20 6e 6f 20 66 69 6c 61 6d 65 6e 74 20 69 re no filament i 60d4: 73 20 69 6e 20 53 65 6c 65 63 74 6f 72 20 61 6e s in Selector an 60e4: 64 20 46 49 4e 44 41 20 77 6f 72 6b 73 20 70 72 d FINDA works pr 60f4: 6f 70 65 72 6c 79 2e 00 operly.. 000060fc : 60fc: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 610c: 72 20 74 72 69 67 67 65 72 65 64 20 74 6f 6f 20 r triggered too 611c: 65 61 72 6c 79 20 77 68 69 6c 65 20 6c 6f 61 64 early while load 612c: 69 6e 67 20 74 6f 20 65 78 74 72 75 64 65 72 2e ing to extruder. 613c: 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 6e Check there isn 614c: 27 74 20 61 6e 79 74 68 69 6e 67 20 73 74 75 63 't anything stuc 615c: 6b 20 69 6e 20 50 54 46 45 20 74 75 62 65 2e 20 k in PTFE tube. 616c: 43 68 65 63 6b 20 74 68 61 74 20 73 65 6e 73 6f Check that senso 617c: 72 20 72 65 61 64 73 20 70 72 6f 70 65 72 6c 79 r reads properly 618c: 2e 00 .. 0000618e : 618e: ff ff 50 75 6c 6c 65 79 20 6d 6f 74 6f 72 20 73 ..Pulley motor s 619e: 74 61 6c 6c 65 64 2e 20 45 6e 73 75 72 65 20 74 talled. Ensure t 61ae: 68 65 20 70 75 6c 6c 65 79 20 63 61 6e 20 6d 6f he pulley can mo 61be: 76 65 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 ve and check the 61ce: 20 77 69 72 69 6e 67 2e 00 wiring.. 000061d7 : 61d7: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 61e7: 72 20 64 69 64 6e 27 74 20 73 77 69 74 63 68 20 r didn't switch 61f7: 6f 66 66 20 77 68 69 6c 65 20 75 6e 6c 6f 61 64 off while unload 6207: 69 6e 67 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e ing filament. En 6217: 73 75 72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61 sure filament ca 6227: 6e 20 6d 6f 76 65 20 61 6e 64 20 74 68 65 20 73 n move and the s 6237: 65 6e 73 6f 72 20 77 6f 72 6b 73 2e 00 ensor works.. 00006244 : 6244: ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f ..Filament senso 6254: 72 20 64 69 64 6e 27 74 20 74 72 69 67 67 65 72 r didn't trigger 6264: 20 77 68 69 6c 65 20 6c 6f 61 64 69 6e 67 20 74 while loading t 6274: 68 65 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e 73 he filament. Ens 6284: 75 72 65 20 74 68 65 20 73 65 6e 73 6f 72 20 69 ure the sensor i 6294: 73 20 63 61 6c 69 62 72 61 74 65 64 20 61 6e 64 s calibrated and 62a4: 20 74 68 65 20 66 69 6c 61 6d 65 6e 74 20 72 65 the filament re 62b4: 61 63 68 65 64 20 69 74 2e 00 ached it.. 000062be : 62be: ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 73 ..FINDA didn't s 62ce: 77 69 74 63 68 20 6f 66 66 20 77 68 69 6c 65 20 witch off while 62de: 75 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65 unloading filame 62ee: 6e 74 2e 20 54 72 79 20 75 6e 6c 6f 61 64 69 6e nt. Try unloadin 62fe: 67 20 6d 61 6e 75 61 6c 6c 79 2e 20 45 6e 73 75 g manually. Ensu 630e: 72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61 6e 20 re filament can 631e: 6d 6f 76 65 20 61 6e 64 20 46 49 4e 44 41 20 77 move and FINDA w 632e: 6f 72 6b 73 2e 00 orks.. 00006334 : 6334: ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 74 ..FINDA didn't t 6344: 72 69 67 67 65 72 20 77 68 69 6c 65 20 6c 6f 61 rigger while loa 6354: 64 69 6e 67 20 74 68 65 20 66 69 6c 61 6d 65 6e ding the filamen 6364: 74 2e 20 45 6e 73 75 72 65 20 74 68 65 20 66 69 t. Ensure the fi 6374: 6c 61 6d 65 6e 74 20 63 61 6e 20 6d 6f 76 65 20 lament can move 6384: 61 6e 64 20 46 49 4e 44 41 20 77 6f 72 6b 73 2e and FINDA works. ... 00006395 : 6395: ff ff 44 69 73 61 62 6c 65 00 ..Disable. 0000639f : 639f: ff ff 53 74 6f 70 00 ..Stop. 000063a6 : 63a6: ff ff 4c 6f 61 64 00 ..Load. 000063ad : 63ad: ff ff 55 6e 6c 6f 61 64 00 ..Unload. 000063b6 : 63b6: ff ff 52 65 73 65 74 4d 4d 55 00 ..ResetMMU. 000063c1 : 63c1: ff ff 52 65 74 72 79 00 ..Retry. 000063c9 : 63c9: ff ff 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 ..Bed leveling f 63d9: 61 69 6c 65 64 2e 20 53 65 6e 73 6f 72 20 64 69 ailed. Sensor di 63e9: 64 6e 27 74 20 74 72 69 67 67 65 72 2e 20 44 65 dn't trigger. De 63f9: 62 72 69 73 20 6f 6e 20 6e 6f 7a 7a 6c 65 3f 20 bris on nozzle? 6409: 57 61 69 74 69 6e 67 20 66 6f 72 20 72 65 73 65 Waiting for rese 6419: 74 2e 00 t.. 0000641c : 641c: ff ff 53 65 6e 73 69 74 69 76 69 74 79 00 ..Sensitivity. 0000642a : 642a: ff ff 44 6f 6e 65 00 ..Done. 00006431 <__loc_pri_end>: 6431: 65 6e ori r22, 0xE5 ; 229 6433: 71 75 andi r23, 0x51 ; 81 6435: 65 69 ori r22, 0x95 ; 149 6437: 6e 67 ori r22, 0x7E ; 126 6439: 20 22 and r2, r16 ... 0000643c : 643c: 44 6f 6e 65 20 70 72 69 6e 74 69 6e 67 20 66 69 Done printing fi 644c: 6c 65 00 le. 0000644f : 644f: 4e 6f 20 4c 69 6e 65 20 4e 75 6d 62 65 72 20 77 No Line Number w 645f: 69 74 68 20 63 68 65 63 6b 73 75 6d 2c 20 4c 61 ith checksum, La 646f: 73 74 20 4c 69 6e 65 3a 20 00 st Line: . 00006479 : 6479: 4e 6f 20 43 68 65 63 6b 73 75 6d 20 77 69 74 68 No Checksum with 6489: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 2c 20 4c 61 line number, La 6499: 73 74 20 4c 69 6e 65 3a 20 00 st Line: . 000064a3 : 64a3: 63 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 checksum mismatc 64b3: 68 2c 20 4c 61 73 74 20 4c 69 6e 65 3a 20 00 h, Last Line: . 000064c2 : 64c2: 4c 69 6e 65 20 4e 75 6d 62 65 72 20 69 73 20 6e Line Number is n 64d2: 6f 74 20 4c 61 73 74 20 4c 69 6e 65 20 4e 75 6d ot Last Line Num 64e2: 62 65 72 2b 31 2c 20 4c 61 73 74 20 4c 69 6e 65 ber+1, Last Line 64f2: 3a 20 00 : . 000064f5 : 64f5: 25 6c 75 20 62 79 74 65 73 20 77 72 69 74 74 65 %lu bytes writte 6505: 6e 20 74 6f 20 25 53 20 61 74 20 61 64 64 72 65 n to %S at addre 6515: 73 73 20 30 78 25 30 34 6c 78 0a 00 ss 0x%04lx.. 00006521 : 6521: 44 25 64 20 2d 20 52 65 61 64 2f 57 72 69 74 65 D%d - Read/Write 6531: 20 25 53 0a 00 %S.. 00006536 <__c.2367>: 6536: 3f 3f 00 ??. 00006539 <__c.2365>: 6539: 52 6f 6d 61 6e 61 00 Romana. 00006540 <__c.2362>: 6540: 48 72 76 61 74 73 6b 69 00 Hrvatski. 00006549 <__c.2359>: 6549: 4d 61 67 79 61 72 00 Magyar. 00006550 <__c.2356>: 6550: 53 6c 6f 76 65 6e 63 69 6e 61 00 Slovencina. 0000655b <__c.2353>: 655b: 4e 6f 72 73 6b 00 Norsk. 00006561 <__c.2350>: 6561: 53 76 65 6e 73 6b 61 00 Svenska. 00006569 <__c.2347>: 6569: 4e 65 64 65 72 6c 61 6e 64 73 00 Nederlands. 00006574 <__c.2344>: 6574: 50 6f 6c 73 6b 69 00 Polski. 0000657b <__c.2341>: 657b: 49 74 61 6c 69 61 6e 6f 00 Italiano. 00006584 <__c.2338>: 6584: 46 72 61 6e 63 61 69 73 00 Francais. 0000658d <__c.2335>: 658d: 45 73 70 61 6e 6f 6c 00 Espanol. 00006595 <__c.2332>: 6595: 44 65 75 74 73 63 68 00 Deutsch. 0000659d <__c.2329>: 659d: 43 65 73 74 69 6e 61 00 Cestina. 000065a5 <__c.2326>: 65a5: 45 6e 67 6c 69 73 68 00 English. 000065ad : 65ad: 20 43 6f 75 6e 74 20 58 3a 20 00 Count X: . 000065b8 : 65b8: 45 30 3a 25 64 20 52 50 4d 20 50 52 4e 31 3a 25 E0:%d RPM PRN1:% 65c8: 64 20 52 50 4d 20 45 30 40 3a 25 75 20 50 52 4e d RPM E0@:%u PRN 65d8: 31 40 3a 25 75 0a 00 1@:%u.. 000065df : 65df: 52 65 73 65 6e 64 00 Resend. 000065e6 : 65e6: 25 53 3a 20 25 6c 64 0a 25 53 0a 00 %S: %ld.%S.. 000065f2 : 65f2: 2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 69 66 69 63 //action:notific 6602: 61 74 69 6f 6e 20 25 53 0a 00 ation %S.. 0000660c : 660c: 46 69 6c 61 6d 65 6e 74 20 72 75 6e 6f 75 74 20 Filament runout 661c: 64 65 74 65 63 74 65 64 21 00 detected!. 00006626 : 6626: 50 72 69 6e 74 65 72 20 73 74 6f 70 70 65 64 20 Printer stopped 6636: 64 75 65 20 74 6f 20 65 72 72 6f 72 73 2e 20 53 due to errors. S 6646: 75 70 65 72 76 69 73 69 6f 6e 20 72 65 71 75 69 upervision requi 6656: 72 65 64 2e 00 red.. 0000665b : 665b: 64 75 6d 70 20 63 6c 65 61 72 65 64 0a 00 dump cleared.. 00006669 : 6669: 6e 6f 20 64 75 6d 70 20 61 76 61 69 6c 61 62 6c no dump availabl 6679: 65 0a 00 e.. 0000667c : 667c: 44 32 31 20 2d 20 72 65 61 64 20 63 72 61 73 68 D21 - read crash 668c: 20 64 75 6d 70 0a 00 dump.. 00006693 : 6693: 6e 6f 20 64 75 6d 70 20 61 76 61 69 6c 61 62 6c no dump availabl 66a3: 65 0a 00 e.. 000066a6 : 66a6: 64 75 6d 70 20 63 6f 6d 70 6c 65 74 65 64 20 69 dump completed i 66b6: 6e 20 25 6c 75 6d 73 0a 00 n %lums.. 000066bf : 66bf: 58 46 4c 41 53 48 00 XFLASH. 000066c6 : 66c6: 45 45 50 52 4f 4d 00 EEPROM. 000066cd : 66cd: 53 52 41 4d 00 SRAM. 000066d2 : 66d2: 44 2d 31 20 2d 20 45 6e 64 6c 65 73 73 20 6c 6f D-1 - Endless lo 66e2: 6f 70 0a 00 op.. 000066e6 : 66e6: 41 63 74 69 76 65 20 45 78 74 72 75 64 65 72 3a Active Extruder: 66f6: 20 30 00 0. 000066f9 : 66f9: 49 6e 76 61 6c 69 64 20 65 78 74 72 75 64 65 72 Invalid extruder ... 0000670a : 670a: 74 6d 63 32 31 33 30 5f 70 72 69 6e 74 5f 63 75 tmc2130_print_cu 671a: 72 72 65 6e 74 73 28 29 0a 09 48 09 52 0a 58 09 rrents()..H.R.X. 672a: 25 64 09 25 64 0a 59 09 25 64 09 25 64 0a 5a 09 %d.%d.Y.%d.%d.Z. 673a: 25 64 09 25 64 0a 45 09 25 64 09 25 64 0a 00 %d.%d.E.%d.%d.. 00006749 : 6749: 53 44 20 70 72 69 6e 74 69 6e 67 20 62 79 74 65 SD printing byte 6759: 20 00 . 0000675b : 675b: 55 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a Unknown command: 676b: 20 22 00 ". 0000676e <_ZZ16process_commandsvE3__c__65_>: 676e: 4d 32 30 30 20 49 6e 76 61 6c 69 64 20 65 78 74 M200 Invalid ext 677e: 72 75 64 65 72 20 00 ruder . 00006785 : 6785: 7a 5f 6d 61 78 3a 20 00 z_max: . 0000678d : 678d: 7a 5f 6d 69 6e 3a 20 00 z_min: . 00006795 <_ZZ16process_commandsvE3__c__64_>: 6795: 79 5f 6d 61 78 3a 20 00 y_max: . 0000679d <_ZZ16process_commandsvE3__c__63_>: 679d: 79 5f 6d 69 6e 3a 20 00 y_min: . 000067a5 <_ZZ16process_commandsvE3__c__62_>: 67a5: 78 5f 6d 61 78 3a 20 00 x_max: . 000067ad : 67ad: 54 52 49 47 47 45 52 45 44 00 TRIGGERED. 000067b7 : 67b7: 6f 70 65 6e 00 open. 000067bc <_ZZ16process_commandsvE3__c__61_>: 67bc: 78 5f 6d 69 6e 3a 20 00 x_min: . 000067c4 <_ZZ16process_commandsvE3__c__60_>: 67c4: 52 65 70 6f 72 74 69 6e 67 20 65 6e 64 73 74 6f Reporting endsto 67d4: 70 20 73 74 61 74 75 73 00 p status. 000067dd : 67dd: 4d 31 31 32 20 63 61 6c 6c 65 64 2e 20 45 6d 65 M112 called. Eme 67ed: 72 67 65 6e 63 79 20 53 74 6f 70 2e 00 rgency Stop.. 000067fa : 67fa: 2f 2f 61 63 74 69 6f 6e 3a 75 76 6c 6f 5f 72 65 //action:uvlo_re 680a: 63 6f 76 65 72 79 5f 72 65 61 64 79 00 covery_ready. 00006817 : 6817: 2f 2f 61 63 74 69 6f 6e 3a 75 76 6c 6f 5f 61 75 //action:uvlo_au 6827: 74 6f 5f 72 65 63 6f 76 65 72 79 5f 72 65 61 64 to_recovery_read 6837: 79 00 y. 00006839 <_ZZ16process_commandsvE3__c__46_>: 6839: 25 53 3a 25 6c 75 20 63 6d 0a 25 53 3a 25 6c 75 %S:%lu cm.%S:%lu 6849: 20 6d 69 6e 0a 00 min.. 0000684f <_ZZ16process_commandsvE3__c__45_>: 684f: 53 49 4c 45 4e 54 00 SILENT. 00006856 <_ZZ16process_commandsvE3__c__44_>: 6856: 4e 4f 52 4d 41 4c 00 NORMAL. 0000685d <_ZZ16process_commandsvE3__c__43_>: 685d: 25 53 20 4d 4f 44 45 3a 20 50 65 72 63 65 6e 74 %S MODE: Percent 686d: 20 64 6f 6e 65 3a 20 25 68 68 64 3b 20 70 72 69 done: %hhd; pri 687d: 6e 74 20 74 69 6d 65 20 72 65 6d 61 69 6e 69 6e nt time remainin 688d: 67 20 69 6e 20 6d 69 6e 73 3a 20 25 64 3b 20 43 g in mins: %d; C 689d: 68 61 6e 67 65 20 69 6e 20 6d 69 6e 73 3a 20 25 hange in mins: % 68ad: 64 0a 00 d.. 000068b0 <_ZZ16process_commandsvE3__c__42_>: 68b0: 50 72 69 6e 74 65 72 53 74 61 74 65 3a 20 25 64 PrinterState: %d 68c0: 0a 00 .. 000068c2 <_ZZ16process_commandsvE3__c__38_>: 68c2: 45 6e 64 20 66 69 6c 65 20 6c 69 73 74 00 End file list. 000068d0 <_ZZ16process_commandsvE3__c__37_>: 68d0: 42 65 67 69 6e 20 66 69 6c 65 20 6c 69 73 74 00 Begin file list. 000068e0 : 68e0: 55 6e 6b 6e 6f 77 6e 20 25 63 20 63 6f 64 65 3a Unknown %c code: 68f0: 20 25 73 0a 00 %s.. 000068f5 <_ZZ16process_commandsvE3__c__35_>: 68f5: 0a 50 49 4e 44 41 20 74 65 6d 70 65 72 61 74 75 .PINDA temperatu 6905: 72 65 3a 20 25 2e 31 66 20 5a 20 73 68 69 66 74 re: %.1f Z shift 6915: 20 28 6d 6d 29 3a 20 25 2e 33 66 00 (mm): %.3f. 00006921 <_ZZ16process_commandsvE3__c__34_>: 6921: 0a 53 74 65 70 3a 20 25 64 2f 36 0a 00 .Step: %d/6.. 0000692e <_ZZ16process_commandsvE3__c__33_>: 692e: 0a 53 74 65 70 3a 20 25 64 2f 36 20 28 73 6b 69 .Step: %d/6 (ski 693e: 70 70 65 64 29 0a 50 49 4e 44 41 20 74 65 6d 70 pped).PINDA temp 694e: 65 72 61 74 75 72 65 3a 20 25 64 20 5a 20 73 68 erature: %d Z sh 695e: 69 66 74 20 28 6d 6d 29 3a 30 0a 00 ift (mm):0.. 0000696a <_ZZ16process_commandsvE3__c__32_>: 696a: 0a 5a 45 52 4f 3a 20 25 2e 33 66 0a 00 .ZERO: %.3f.. 00006977 <_ZZ16process_commandsvE3__c__31_>: 6977: 73 74 61 72 74 20 74 65 6d 70 65 72 61 74 75 72 start temperatur 6987: 65 3a 20 25 2e 31 66 0a 00 e: %.1f.. 00006990 <_ZZ16process_commandsvE3__c__28_>: 6990: 25 64 20 20 25 2e 32 66 00 %d %.2f. 00006999 <_ZZ16process_commandsvE3__c__27_>: 6999: 25 53 20 58 3a 20 25 2e 35 66 20 59 3a 20 25 2e %S X: %.5f Y: %. 69a9: 35 66 20 5a 3a 20 25 2e 35 66 0a 00 5f Z: %.5f.. 000069b5 <_ZZ16process_commandsvE3__c__26_>: 69b5: 53 6c 65 65 70 2e 2e 2e 00 Sleep.... 000069be <_ZZ16process_commandsvE3__c__10_>: 69be: 45 30 3a 25 64 20 52 50 4d 0a 50 52 4e 30 3a 25 E0:%d RPM.PRN0:% 69ce: 64 20 52 50 4d 0a 00 d RPM.. 000069d5 : 69d5: 47 39 30 00 G90. 000069d9 : 69d9: 4d 31 30 37 00 M107. 000069de : 69de: 42 3a 20 25 33 64 20 20 20 20 20 58 64 3a 25 36 B: %3d Xd:%6 69ee: 64 0a 53 3a 20 25 33 64 20 20 20 20 20 59 64 3a d.S: %3d Yd: 69fe: 25 36 64 00 %6d. 00006a02 : 6a02: 46 49 4e 44 41 00 FINDA. 00006a08 : 6a08: 50 49 4e 44 41 00 PINDA. 00006a0e : 6a0e: 57 69 7a 61 72 64 20 65 6e 64 20 73 74 61 74 65 Wizard end state 6a1e: 3a 20 25 64 0a 00 : %d.. 00006a24 : 6a24: 53 70 6f 6f 6c 4a 6f 69 6e 00 SpoolJoin. 00006a2e : 6a2e: 46 69 72 6d 77 61 72 65 00 Firmware. 00006a37 : 6a37: 48 42 65 64 20 6f 6e 20 6c 6f 61 64 00 HBed on load. 00006a44 : 6a44: 46 6c 61 73 68 41 69 72 00 FlashAir. 00006a4d : 6a4d: 54 68 65 72 6d 61 6c 20 4d 6f 64 65 6c 20 63 61 Thermal Model ca 6a5d: 6c 2e 00 l.. 00006a60 : 6a60: 45 72 72 3a 50 52 49 4e 54 20 46 41 4e 20 45 52 Err:PRINT FAN ER 6a70: 52 4f 52 00 ROR. 00006a74 : 6a74: 45 72 72 3a 48 4f 54 45 4e 44 20 46 41 4e 20 45 Err:HOTEND FAN E 6a84: 52 52 4f 52 00 RROR. 00006a89 : 6a89: 2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 64 //action:resumed ... 00006a9a : 6a9a: 2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 00 //action:resume. 00006aaa : 6aaa: 2f 2f 61 63 74 69 6f 6e 3a 72 65 61 64 79 00 //action:ready. 00006ab9 : 6ab9: 2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 5f 72 65 61 //action:not_rea 6ac9: 64 79 00 dy. 00006acc : 6acc: 2f 2f 61 63 74 69 6f 6e 3a 63 61 6e 63 65 6c 00 //action:cancel. 00006adc : 6adc: 4d 38 34 00 M84. 00006ae0 : 6ae0: 41 78 69 73 20 6c 65 6e 67 74 68 20 64 69 66 66 Axis length diff 6af0: 65 72 65 6e 63 65 3a 25 2e 33 66 0a 00 erence:%.3f.. 00006afd : 6afd: 4d 65 61 73 75 72 65 64 20 61 78 69 73 20 6c 65 Measured axis le 6b0d: 6e 67 74 68 3a 25 2e 33 66 0a 00 ngth:%.3f.. 00006b18 : 6b18: 4f 4b 00 OK. 00006b1b : 6b1b: 4c 43 44 20 73 74 61 74 75 73 20 63 68 61 6e 67 LCD status chang 6b2b: 65 64 00 ed. 00006b2e <_ZZN10CardReader7releaseEvE3__c.lto_priv.536>: 6b2e: 53 44 20 63 61 72 64 20 72 65 6c 65 61 73 65 64 SD card released ... 00006b3f : 6b3f: 46 61 6b 65 20 73 65 72 69 61 6c 20 6e 75 6d 62 Fake serial numb 6b4f: 65 72 00 er. 00006b52 : 6b52: 45 2d 63 6f 6f 6c 20 6d 6f 64 65 00 E-cool mode. 00006b5e : 6b5e: 2f 2f 61 63 74 69 6f 6e 3a 73 74 61 72 74 00 //action:start. 00006b6d : 6b6d: 47 39 31 00 G91. 00006b71 : 6b71: 4d 37 30 32 00 M702. 00006b76 : 6b76: 4d 38 33 00 M83. 00006b7a : 6b7a: 47 32 38 20 57 00 G28 W. 00006b80 : 6b80: 4d 35 30 30 00 M500. 00006b85 : 6b85: 45 78 74 65 72 6e 61 6c 20 53 50 49 20 66 6c 61 External SPI fla 6b95: 73 68 0a 58 46 4c 41 53 48 20 69 73 20 6e 6f 74 sh.XFLASH is not 6ba5: 20 72 65 73 2d 0a 70 6f 6e 64 69 6e 67 2e 20 4c res-.ponding. L 6bb5: 61 6e 67 75 61 67 65 0a 73 77 69 74 63 68 20 75 anguage.switch u 6bc5: 6e 61 76 61 69 6c 61 62 6c 65 2e 00 navailable.. 00006bd1 : 6bd1: 58 46 4c 41 53 48 20 6e 6f 74 20 72 65 73 70 6f XFLASH not respo 6be1: 6e 64 69 6e 67 2e 00 nding.. 00006be8 : 6be8: 46 57 20 63 72 61 73 68 20 64 65 74 65 63 74 65 FW crash detecte 6bf8: 64 21 20 59 6f 75 20 63 61 6e 20 63 6f 6e 74 69 d! You can conti 6c08: 6e 75 65 20 70 72 69 6e 74 69 6e 67 2e 20 44 65 nue printing. De 6c18: 62 75 67 20 64 61 74 61 20 61 76 61 69 6c 61 62 bug data availab 6c28: 6c 65 20 66 6f 72 20 61 6e 61 6c 79 73 69 73 2e le for analysis. 6c38: 20 43 6f 6e 74 61 63 74 20 73 75 70 70 6f 72 74 Contact support 6c48: 20 74 6f 20 73 75 62 6d 69 74 20 64 65 74 61 69 to submit detai 6c58: 6c 73 2e 00 ls.. 00006c5c : 6c5c: 2f 2f 61 63 74 69 6f 6e 3a 64 75 6d 70 5f 61 76 //action:dump_av 6c6c: 61 69 6c 61 62 6c 65 00 ailable. 00006c74 <_ZZ5setupE3__c__11_>: 6c74: 43 72 61 73 68 44 65 74 65 63 74 20 44 49 53 41 CrashDetect DISA 6c84: 42 4c 45 44 00 BLED. 00006c89 <_ZZ5setupE3__c__10_>: 6c89: 43 72 61 73 68 44 65 74 65 63 74 20 45 4e 41 42 CrashDetect ENAB 6c99: 4c 45 44 21 00 LED!. 00006c9e : 6c9e: 20 20 50 6c 61 6e 6e 65 72 42 75 66 66 65 72 42 PlannerBufferB 6cae: 79 74 65 73 3a 20 00 ytes: . 00006cb5 : 6cb5: 20 46 72 65 65 20 4d 65 6d 6f 72 79 3a 20 00 Free Memory: . 00006cc4 : 6cc4: 20 7c 20 41 75 74 68 6f 72 3a 20 00 | Author: . 00006cd0 : 6cd0: 20 4c 61 73 74 20 55 70 64 61 74 65 64 3a 20 00 Last Updated: . 00006ce0 : 6ce0: 20 53 6f 66 74 77 61 72 65 20 52 65 73 65 74 00 Software Reset. 00006cf0 : 6cf0: 20 57 61 74 63 68 64 6f 67 20 52 65 73 65 74 00 Watchdog Reset. 00006d00 : 6d00: 20 42 72 6f 77 6e 20 6f 75 74 20 52 65 73 65 74 Brown out Reset ... 00006d11 : 6d11: 20 45 78 74 65 72 6e 61 6c 20 52 65 73 65 74 00 External Reset. 00006d21 : 6d21: 50 6f 77 65 72 55 70 00 PowerUp. 00006d29 : 6d29: 65 72 72 6f 72 20 77 72 69 74 69 6e 67 20 74 6f error writing to 6d39: 20 66 69 6c 65 00 file. 00006d3f : 6d3f: 44 6f 6e 65 20 73 61 76 69 6e 67 20 66 69 6c 65 Done saving file 6d4f: 2e 00 .. 00006d51 : 6d51: 6f 6b 00 ok. 00006d54 : 6d54: 46 69 6c 61 6d 65 6e 74 00 Filament. 00006d5d : 6d5d: 50 4f 57 45 52 20 50 41 4e 49 43 20 44 45 54 45 POWER PANIC DETE 6d6d: 43 54 45 44 00 CTED. 00006d72 : 6d72: 55 56 4c 4f 20 2d 20 65 6e 64 20 25 64 0a 00 UVLO - end %d.. 00006d81 : 6d81: 55 56 4c 4f 5f 54 49 4e 59 20 2d 20 65 6e 64 20 UVLO_TINY - end 6d91: 25 64 0a 00 %d.. 00006d95 : 6d95: 77 6f 72 6c 64 20 63 6f 6f 72 64 69 6e 61 74 65 world coordinate 6da5: 73 3a 20 28 25 2e 33 66 2c 20 25 2e 33 66 2c 20 s: (%.3f, %.3f, 6db5: 25 2e 33 66 29 0a 00 %.3f).. 00006dbc : 6dbc: 4d 32 32 30 20 53 25 64 00 M220 S%d. 00006dc5 : 6dc5: 44 6f 6e 65 20 72 65 61 64 69 6e 67 20 45 45 50 Done reading EEP 6dd5: 52 4f 4d 0a 00 ROM.. 00006dda : 6dda: 54 65 6d 70 65 72 61 74 75 72 65 20 52 65 73 74 Temperature Rest 6dea: 6f 72 65 64 0a 00 ored.. 00006df0 : 6df0: 47 31 20 45 25 2d 2e 33 66 20 46 32 37 30 30 00 G1 E%-.3f F2700. 00006e00 : 6e00: 54 4d 43 20 44 52 49 56 45 52 20 4f 56 45 52 54 TMC DRIVER OVERT 6e10: 45 4d 50 00 EMP. 00006e14 : 6e14: 48 6f 6c 64 20 63 75 72 72 65 6e 74 20 74 72 75 Hold current tru 6e24: 6e 63 61 74 65 64 20 74 6f 20 52 75 6e 20 63 75 ncated to Run cu 6e34: 72 72 65 6e 74 00 rrent. 00006e3a : 6e3a: 25 63 25 33 64 2f 25 64 81 00 %c%3d/%d.. 00006e44 : 6e44: 5a 25 36 2e 32 66 25 63 00 Z%6.2f%c. 00006e4d : 6e4d: 5a 20 20 20 2d 2d 2d 20 00 Z --- . 00006e56 : 6e56: 86 25 33 64 25 25 00 .%3d%%. 00006e5d : 6e5d: 2d 2d 2d 25 25 00 ---%%. 00006e63 : 6e63: 25 33 64 25 25 00 %3d%%. 00006e69 : 6e69: 20 53 44 00 SD. 00006e6d : 6e6d: 20 20 20 00 . 00006e71 : 6e71: 20 48 4f 00 HO. 00006e75 : 6e75: 87 2d 2d 3a 2d 2d 20 20 00 .--:-- . 00006e7e : 6e7e: 87 25 33 75 68 20 25 63 25 63 00 .%3uh %c%c. 00006e89 : 6e89: 87 25 30 32 75 3a 25 30 32 75 25 63 25 63 00 .%02u:%02u%c%c. 00006e98 : 6e98: 2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 64 00 //action:paused. 00006ea8 : 6ea8: 2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 00 //action:pause. 00006eb7 <_ZZL16lcd_support_menuvE3__c__16_>: 6eb7: 44 75 6d 70 20 6d 65 6d 6f 72 79 00 Dump memory. 00006ec3 : 6ec3: 68 65 6c 70 2e 70 72 75 73 61 33 64 2e 63 6f 6d help.prusa3d.com ... 00006ed4 : 6ed4: 66 6f 72 75 6d 2e 70 72 75 73 61 33 64 2e 63 6f forum.prusa3d.co 6ee4: 6d 00 m. 00006ee6 : 6ee6: 70 72 75 73 61 33 64 2e 63 6f 6d 00 prusa3d.com. 00006ef2 : 6ef2: 4d 37 30 31 00 M701. 00006ef7 : 6ef7: 25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a %S:.%18.2fm .%S: 6f07: 0a 25 31 30 6c 64 64 20 25 30 32 64 68 20 25 30 .%10ldd %02dh %0 6f17: 32 64 6d 00 2dm. 00006f1b : 6f1b: 25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a %S:.%18.2fm .%S: 6f2b: 0a 25 31 30 6c 64 68 20 25 30 32 64 6d 20 25 30 .%10ldh %02dm %0 6f3b: 32 64 73 00 2ds. 00006f3f : 6f3f: 25 36 2e 32 66 6d 6d 00 %6.2fmm. 00006f47 : 6f47: 25 53 0a 25 53 0a 25 53 3a 0a 25 53 3a 00 %S.%S.%S:.%S:. 00006f55 : 6f55: 25 33 2e 32 66 81 00 %3.2f.. 00006f5c : 6f5c: 25 2d 31 34 2e 31 34 53 3a 0a 25 53 0a 25 2d 31 %-14.14S:.%S.%-1 6f6c: 34 2e 31 34 53 3a 25 33 2e 32 66 81 0a 25 2d 31 4.14S:%3.2f..%-1 6f7c: 34 2e 31 34 53 3a 25 33 2e 32 66 81 00 4.14S:%3.2f.. 00006f89 : 6f89: 20 20 30 00 0. 00006f8d : 6f8d: 20 20 31 00 1. 00006f91 : 6f91: 4d 65 61 73 75 72 65 64 20 73 6b 65 77 73 3a 20 Measured skews: 6fa1: 25 66 20 25 66 0a 00 %f %f.. 00006fa8 : 6fa8: 46 69 74 74 69 6e 67 20 66 61 69 6c 65 64 20 3d Fitting failed = 6fb8: 3e 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 61 > calibration fa 6fc8: 69 6c 65 64 2e 0a 00 iled... 00006fcf : 6fcf: 43 61 6c 69 62 72 61 74 69 6f 6e 20 73 75 63 63 Calibration succ 6fdf: 65 73 73 2e 0a 00 ess... 00006fe5 : 6fe5: 41 6c 6c 20 34 20 63 61 6c 69 62 72 61 74 69 6f All 4 calibratio 6ff5: 6e 20 70 6f 69 6e 74 73 20 66 6f 75 6e 64 2e 0a n points found.. ... 00007006 : 7006: 31 2f 34 00 1/4. 0000700a : 700a: 31 2f 34 00 1/4. 0000700e : 700e: 31 2f 39 00 1/9. 00007012 : 7012: 50 72 75 73 61 20 69 33 20 4d 4b 33 20 4f 4b 2e Prusa i3 MK3 OK. ... 00007023 : 7023: 53 44 20 63 61 72 64 20 6f 6b 00 SD card ok. 0000702e : 702e: 6f 70 65 6e 52 6f 6f 74 20 66 61 69 6c 65 64 00 openRoot failed. 0000703e : 703e: 76 6f 6c 75 6d 65 2e 69 6e 69 74 20 66 61 69 6c volume.init fail 704e: 65 64 00 ed. 00007051 : 7051: 53 44 20 69 6e 69 74 20 66 61 69 6c 00 SD init fail. 0000705e : 705e: 6f 70 65 6e 20 66 61 69 6c 65 64 2c 20 46 69 6c open failed, Fil 706e: 65 3a 20 00 e: . 00007072 : 7072: 43 61 6e 6e 6f 74 20 65 6e 74 65 72 20 73 75 62 Cannot enter sub 7082: 64 69 72 3a 20 00 dir: . 00007088 : 7088: 4d 36 30 30 00 M600. 0000708d : 708d: 4d 32 34 00 M24. 00007091 : 7091: 4d 32 33 20 25 73 00 M23 %s. 00007098 : 7098: 31 2f 39 00 1/9. 0000709c : 709c: 88 00 .. 0000709e : 709e: 20 74 6f 6f 20 6c 6f 6e 67 20 65 78 74 72 75 73 too long extrus 70ae: 69 6f 6e 20 70 72 65 76 65 6e 74 65 64 00 ion prevented. 000070bc : 70bc: 20 63 6f 6c 64 20 65 78 74 72 75 73 69 6f 6e 20 cold extrusion 70cc: 70 72 65 76 65 6e 74 65 64 00 prevented. 000070d6 : 70d6: 4d 6f 76 65 20 61 62 6f 72 74 65 64 00 Move aborted. 000070e3 <__noloc_end>: 70e3: 08 4a sbci r16, 0xA8 ; 168 70e5: d7 3b cpi r29, 0xB7 ; 183 70e7: 3b ce rjmp .-906 ; 0x6d5f 70e9: 01 6e ori r16, 0xE1 ; 225 70eb: 84 bc out 0x24, r8 ; 36 70ed: bf fd .word 0xfdbf ; ???? 70ef: c1 2f mov r28, r17 70f1: 3d 6c ori r19, 0xCD ; 205 70f3: 74 31 cpi r23, 0x14 ; 20 70f5: 9a bd out 0x2a, r25 ; 42 70f7: 56 83 std Z+6, r21 ; 0x06 70f9: 3d da rcall .-2950 ; 0x6575 <__c.2344+0x1> 70fb: 3d 00 .word 0x003d ; ???? 70fd: c7 7f andi r28, 0xF7 ; 247 70ff: 11 be out 0x31, r1 ; 49 7101: d9 e4 ldi r29, 0x49 ; 73 7103: bb 4c sbci r27, 0xCB ; 203 7105: 3e 91 ld r19, -X 7107: 6b aa std Y+51, r6 ; 0x33 7109: aa be out 0x3a, r10 ; 58 710b: 00 00 nop 710d: 00 80 ld r0, Z 710f: 3f 05 cpc r19, r15 7111: a8 4c sbci r26, 0xC8 ; 200 7113: cd b2 in r12, 0x1d ; 29 7115: d4 4e sbci r29, 0xE4 ; 228 7117: b9 38 cpi r27, 0x89 ; 137 7119: 36 a9 ldd r19, Z+54 ; 0x36 711b: 02 0c add r0, r2 711d: 50 b9 out 0x00, r21 ; 0 711f: 91 86 std Z+9, r9 ; 0x09 7121: 88 08 sbc r8, r8 7123: 3c a6 std Y+44, r3 ; 0x2c 7125: aa aa std Y+50, r10 ; 0x32 7127: 2a be out 0x3a, r2 ; 58 7129: 00 00 nop 712b: 00 80 ld r0, Z 712d: 3f 07 cpc r19, r31 712f: 63 42 sbci r22, 0x23 ; 35 7131: 36 b7 in r19, 0x36 ; 54 7133: 9b d8 rcall .-3786 ; 0x626b 7135: a7 1a sub r10, r23 7137: 39 68 ori r19, 0x89 ; 137 7139: 56 18 sub r5, r6 713b: ae ba out 0x1e, r10 ; 30 713d: ab 55 subi r26, 0x5B ; 91 713f: 8c 1d adc r24, r12 7141: 3c b7 in r19, 0x3c ; 60 7143: cc 57 subi r28, 0x7C ; 124 7145: 63 bd out 0x23, r22 ; 35 7147: 6d ed ldi r22, 0xDD ; 221 7149: fd 75 andi r31, 0x5D ; 93 714b: 3e f6 brtc .-114 ; 0x70db 714d: 17 72 andi r17, 0x27 ; 39 714f: 31 bf out 0x31, r19 ; 49 7151: 00 00 nop 7153: 00 80 ld r0, Z 7155: 3f 08 sbc r3, r15 7157: 00 00 nop 7159: 00 be out 0x30, r0 ; 48 715b: 92 24 eor r9, r2 715d: 49 12 cpse r4, r25 715f: 3e ab std Y+54, r19 ; 0x36 7161: aa aa std Y+50, r10 ; 0x32 7163: 2a be out 0x3a, r2 ; 58 7165: cd cc rjmp .-1638 ; 0x6b01 7167: cc 4c sbci r28, 0xCC ; 204 7169: 3e 00 .word 0x003e ; ???? 716b: 00 00 nop 716d: 80 be out 0x30, r8 ; 48 716f: ab aa std Y+51, r10 ; 0x33 7171: aa aa std Y+50, r10 ; 0x32 7173: 3e 00 .word 0x003e ; ???? 7175: 00 00 nop 7177: 00 bf out 0x30, r16 ; 48 7179: 00 00 nop 717b: 00 80 ld r0, Z 717d: 3f 00 .word 0x003f ; ???? 717f: 00 00 nop 7181: 00 00 nop 7183: 08 41 sbci r16, 0x18 ; 24 7185: 78 d3 rcall .+1776 ; 0x7877 7187: bb 43 sbci r27, 0x3B ; 59 7189: 87 d1 rcall .+782 ; 0x7499 <__trampolines_start+0x2e9> 718b: 13 3d cpi r17, 0xD3 ; 211 718d: 19 0e add r1, r25 718f: 3c c3 rjmp .+1656 ; 0x7809 7191: bd 42 sbci r27, 0x2D ; 45 7193: 82 ad ldd r24, Z+58 ; 0x3a 7195: 2b 3e cpi r18, 0xEB ; 235 7197: 68 ec ldi r22, 0xC8 ; 200 7199: 82 76 andi r24, 0x62 ; 98 719b: be d9 rcall .-3204 ; 0x6519 719d: 8f e1 ldi r24, 0x1F ; 31 719f: a9 3e cpi r26, 0xE9 ; 233 71a1: 4c 80 ldd r4, Y+4 ; 0x04 71a3: ef ff .word 0xffef ; ???? 71a5: be 01 movw r22, r28 71a7: c4 ff sbrs r28, 4 71a9: 7f 3f cpi r23, 0xFF ; 255 71ab: 00 00 nop 71ad: 00 00 nop ... 000071b0 <__trampolines_start>: 71b0: 0c 94 65 ef jmp 0x1deca ; 0x1deca 71b4: 0c 94 fd fa jmp 0x1f5fa ; 0x1f5fa 71b8: 0c 94 4c ea jmp 0x1d498 ; 0x1d498 71bc: 0d 94 79 15 jmp 0x22af2 ; 0x22af2 71c0: 0d 94 a3 08 jmp 0x21146 ; 0x21146 71c4: 0c 94 2e e2 jmp 0x1c45c ; 0x1c45c 71c8: 0c 94 87 e0 jmp 0x1c10e ; 0x1c10e 71cc: 0d 94 e8 a6 jmp 0x34dd0 ; 0x34dd0 71d0: 0d 94 26 74 jmp 0x2e84c ; 0x2e84c 71d4: 0c 94 92 cf jmp 0x19f24 ; 0x19f24 71d8: 0c 94 79 ea jmp 0x1d4f2 ; 0x1d4f2 71dc: 0c 94 4e 74 jmp 0xe89c ; 0xe89c <__vector_23+0x128> 71e0: 0c 94 d1 f0 jmp 0x1e1a2 ; 0x1e1a2 71e4: 0c 94 bc e0 jmp 0x1c178 ; 0x1c178 71e8: 0c 94 b0 d2 jmp 0x1a560 ; 0x1a560 71ec: 0c 94 04 d1 jmp 0x1a208 ; 0x1a208 71f0: 0c 94 a6 f5 jmp 0x1eb4c ; 0x1eb4c 71f4: 0c 94 cd d5 jmp 0x1ab9a ; 0x1ab9a 71f8: 0d 94 47 1a jmp 0x2348e ; 0x2348e 71fc: 0c 94 a1 ea jmp 0x1d542 ; 0x1d542 7200: 0c 94 e3 f0 jmp 0x1e1c6 ; 0x1e1c6 7204: 0c 94 ab d1 jmp 0x1a356 ; 0x1a356 7208: 0c 94 83 ea jmp 0x1d506 ; 0x1d506 720c: 0c 94 28 fb jmp 0x1f650 ; 0x1f650 7210: 0d 94 8d 40 jmp 0x2811a ; 0x2811a 7214: 0c 94 8a e3 jmp 0x1c714 ; 0x1c714 7218: 0d 94 f1 ac jmp 0x359e2 ; 0x359e2 721c: 0d 94 c2 9f jmp 0x33f84 ; 0x33f84 7220: 0c 94 2b 74 jmp 0xe856 ; 0xe856 <__vector_23+0xe2> 7224: 0d 94 b6 9f jmp 0x33f6c ; 0x33f6c 7228: 0d 94 c1 0b jmp 0x21782 ; 0x21782 722c: 0c 94 f7 cd jmp 0x19bee ; 0x19bee 7230: 0c 94 46 fa jmp 0x1f48c ; 0x1f48c 7234: 0c 94 8b 70 jmp 0xe116 ; 0xe116 7238: 0c 94 46 da jmp 0x1b48c ; 0x1b48c 723c: 0c 94 c5 ce jmp 0x19d8a ; 0x19d8a 7240: 0c 94 ef cd jmp 0x19bde ; 0x19bde 7244: 0d 94 37 17 jmp 0x22e6e ; 0x22e6e 7248: 0d 94 02 1a jmp 0x23404 ; 0x23404 724c: 0d 94 2b 17 jmp 0x22e56 ; 0x22e56 7250: 0c 94 f1 d0 jmp 0x1a1e2 ; 0x1a1e2 7254: 0d 94 62 28 jmp 0x250c4 ; 0x250c4 7258: 0d 94 0c 2c jmp 0x25818 ; 0x25818 725c: 0d 94 ee 51 jmp 0x2a3dc ; 0x2a3dc 7260: 0c 94 ba d4 jmp 0x1a974 ; 0x1a974 7264: 0c 94 0b ce jmp 0x19c16 ; 0x19c16 7268: 0c 94 f6 f9 jmp 0x1f3ec ; 0x1f3ec 726c: 0c 94 48 dc jmp 0x1b890 ; 0x1b890 7270: 0c 94 9d d4 jmp 0x1a93a ; 0x1a93a ()> 7274: 0c 94 ca cd jmp 0x19b94 ; 0x19b94 7278: 0d 94 bd 0b jmp 0x2177a ; 0x2177a 727c: 0c 94 1a e2 jmp 0x1c434 ; 0x1c434 7280: 0c 94 bf ce jmp 0x19d7e ; 0x19d7e 7284: 0c 94 04 ef jmp 0x1de08 ; 0x1de08 7288: 0d 94 0e 11 jmp 0x2221c ; 0x2221c 728c: 0c 94 bc fa jmp 0x1f578 ; 0x1f578 7290: 0d 94 dd 51 jmp 0x2a3ba ; 0x2a3ba 7294: 0c 94 c1 e2 jmp 0x1c582 ; 0x1c582 7298: 0c 94 e9 cd jmp 0x19bd2 ; 0x19bd2 729c: 0d 94 7d 51 jmp 0x2a2fa ; 0x2a2fa 72a0: 0c 94 8d ea jmp 0x1d51a ; 0x1d51a 72a4: 0c 94 e5 cd jmp 0x19bca ; 0x19bca 72a8: 0c 94 89 e2 jmp 0x1c512 ; 0x1c512 72ac: 0d 94 75 15 jmp 0x22aea ; 0x22aea 72b0: 0c 94 b3 d0 jmp 0x1a166 ; 0x1a166 72b4: 0d 94 67 1d jmp 0x23ace ; 0x23ace 72b8: 0d 94 a8 18 jmp 0x23150 ; 0x23150 72bc: 0c 94 1e ea jmp 0x1d43c ; 0x1d43c 72c0: 0c 94 c8 fa jmp 0x1f590 ; 0x1f590 72c4: 0c 94 6f ea jmp 0x1d4de ; 0x1d4de 72c8: 0c 94 0f ea jmp 0x1d41e ; 0x1d41e 72cc: 0c 94 60 ea jmp 0x1d4c0 ; 0x1d4c0 72d0: 0d 94 93 29 jmp 0x25326 ; 0x25326 72d4: 0c 94 94 e1 jmp 0x1c328 ; 0x1c328 72d8: 0c 94 b6 d4 jmp 0x1a96c ; 0x1a96c ()> 72dc: 0c 94 f3 cd jmp 0x19be6 ; 0x19be6 72e0: 0d 94 a9 08 jmp 0x21152 ; 0x21152 72e4: 0d 94 a8 22 jmp 0x24550 ; 0x24550 72e8: 0c 94 fb 75 jmp 0xebf6 ; 0xebf6 72ec: 0c 94 32 ea jmp 0x1d464 ; 0x1d464 72f0: 0c 94 97 ea jmp 0x1d52e ; 0x1d52e 72f4: 0c 94 ac d4 jmp 0x1a958 ; 0x1a958 ()> 72f8: 0d 94 44 17 jmp 0x22e88 ; 0x22e88 72fc: 0c 94 88 f8 jmp 0x1f110 ; 0x1f110 7300: 0c 94 dc cd jmp 0x19bb8 ; 0x19bb8 7304: 0d 94 dc 1a jmp 0x235b8 ; 0x235b8 7308: 0c 94 7f d0 jmp 0x1a0fe ; 0x1a0fe 730c: 0c 94 a4 d1 jmp 0x1a348 ; 0x1a348 7310: 0c 94 85 e1 jmp 0x1c30a ; 0x1c30a 7314: 0c 94 98 d4 jmp 0x1a930 ; 0x1a930 ()> 7318: 0c 94 26 da jmp 0x1b44c ; 0x1b44c 731c: 0d 94 34 a0 jmp 0x34068 ; 0x34068 7320: 0d 94 1f 2c jmp 0x2583e ; 0x2583e 7324: 0c 94 e1 d7 jmp 0x1afc2 ; 0x1afc2 7328: 0d 94 e8 ac jmp 0x359d0 ; 0x359d0 732c: 0c 94 e2 fa jmp 0x1f5c4 ; 0x1f5c4 7330: 0c 94 e0 e3 jmp 0x1c7c0 ; 0x1c7c0 7334: 0c 94 3c d5 jmp 0x1aa78 ; 0x1aa78 7338: 0c 94 2e f5 jmp 0x1ea5c ; 0x1ea5c 733c: 0d 94 73 0c jmp 0x218e6 ; 0x218e6 7340: 0c 94 48 e2 jmp 0x1c490 ; 0x1c490 7344: 0c 94 39 e2 jmp 0x1c472 ; 0x1c472 7348: 0d 94 1e 1d jmp 0x23a3c ; 0x23a3c 734c: 0c 94 9a f0 jmp 0x1e134 ; 0x1e134 7350: 0c 94 59 d0 jmp 0x1a0b2 ; 0x1a0b2 7354: 0d 94 af 51 jmp 0x2a35e ; 0x2a35e 7358: 0d 94 44 51 jmp 0x2a288 ; 0x2a288 735c: 0c 94 7f e1 jmp 0x1c2fe ; 0x1c2fe 7360: 0d 94 83 a6 jmp 0x34d06 ; 0x34d06 7364: 0c 94 f8 d4 jmp 0x1a9f0 ; 0x1a9f0 7368: 0c 94 28 ea jmp 0x1d450 ; 0x1d450 736c: 0c 94 7c e1 jmp 0x1c2f8 ; 0x1c2f8 7370: 0c 94 45 d5 jmp 0x1aa8a ; 0x1aa8a 7374: 0d 94 26 19 jmp 0x2324c ; 0x2324c 7378: 0c 94 82 fa jmp 0x1f504 ; 0x1f504 737c: 0d 94 57 16 jmp 0x22cae ; 0x22cae 7380: 0c 94 22 74 jmp 0xe844 ; 0xe844 <__vector_23+0xd0> 7384: 0d 94 c5 ac jmp 0x3598a ; 0x3598a 7388: 0d 94 8a 17 jmp 0x22f14 ; 0x22f14 738c: 0d 94 2e 52 jmp 0x2a45c ; 0x2a45c 7390: 0d 94 36 52 jmp 0x2a46c ; 0x2a46c 7394: 0d 94 fc 0a jmp 0x215f8 ; 0x215f8 7398: 0c 94 0a db jmp 0x1b614 ; 0x1b614 739c: 0c 94 30 d0 jmp 0x1a060 ; 0x1a060 73a0: 0d 94 9b 2c jmp 0x25936 ; 0x25936 73a4: 0d 94 4c a0 jmp 0x34098 ; 0x34098 73a8: 0c 94 0f ce jmp 0x19c1e ; 0x19c1e 73ac: 0c 94 99 cf jmp 0x19f32 ; 0x19f32 73b0: 0d 94 6b 0a jmp 0x214d6 ; 0x214d6 73b4: 0d 94 12 51 jmp 0x2a224 ; 0x2a224 73b8: 0d 94 3c 17 jmp 0x22e78 ; 0x22e78 73bc: 0d 94 26 52 jmp 0x2a44c ; 0x2a44c 73c0: 0c 94 89 d0 jmp 0x1a112 ; 0x1a112 73c4: 0c 94 da d0 jmp 0x1a1b4 ; 0x1a1b4 73c8: 0d 94 2b 10 jmp 0x22056 ; 0x22056 73cc: 0c 94 93 d0 jmp 0x1a126 ; 0x1a126 73d0: 0d 94 f6 51 jmp 0x2a3ec ; 0x2a3ec 73d4: 0c 94 e9 df jmp 0x1bfd2 ; 0x1bfd2 73d8: 0d 94 c1 0f jmp 0x21f82 ; 0x21f82 73dc: 0d 94 fa 50 jmp 0x2a1f4 ; 0x2a1f4 73e0: 0d 94 72 21 jmp 0x242e4 ; 0x242e4 73e4: 0c 94 ef df jmp 0x1bfde ; 0x1bfde 73e8: 0c 94 fe 73 jmp 0xe7fc ; 0xe7fc <__vector_23+0x88> 73ec: 0c 94 d0 cd jmp 0x19ba0 ; 0x19ba0 73f0: 0d 94 fe 51 jmp 0x2a3fc ; 0x2a3fc 73f4: 0d 94 a9 51 jmp 0x2a352 ; 0x2a352 73f8: 0c 94 f3 fa jmp 0x1f5e6 ; 0x1f5e6 73fc: 0d 94 47 18 jmp 0x2308e ; 0x2308e 7400: 0d 94 30 1d jmp 0x23a60 ; 0x23a60 7404: 0c 94 a0 cf jmp 0x19f40 ; 0x19f40 7408: 0d 94 67 0a jmp 0x214ce ; 0x214ce 740c: 0c 94 54 d9 jmp 0x1b2a8 ; 0x1b2a8 7410: 0d 94 9b 19 jmp 0x23336 ; 0x23336 7414: 0c 94 fa cf jmp 0x19ff4 ; 0x19ff4 7418: 0c 94 d8 cd jmp 0x19bb0 ; 0x19bb0 741c: 0c 94 a7 e4 jmp 0x1c94e ; 0x1c94e 7420: 0c 94 bd d0 jmp 0x1a17a ; 0x1a17a 7424: 0c 94 78 fa jmp 0x1f4f0 ; 0x1f4f0 7428: 0c 94 9d d0 jmp 0x1a13a ; 0x1a13a 742c: 0d 94 93 1f jmp 0x23f26 ; 0x23f26 7430: 0d 94 7f ac jmp 0x358fe ; 0x358fe 7434: 0d 94 1f 17 jmp 0x22e3e ; 0x22e3e 7438: 0d 94 e1 ac jmp 0x359c2 ; 0x359c2 743c: 0d 94 ac 2c jmp 0x25958 ; 0x25958 7440: 0c 94 27 f1 jmp 0x1e24e ; 0x1e24e 7444: 0c 94 cf d0 jmp 0x1a19e ; 0x1a19e 7448: 0d 94 26 11 jmp 0x2224c ; 0x2224c 744c: 0c 94 07 ea jmp 0x1d40e ; 0x1d40e 7450: 0d 94 1f 22 jmp 0x2443e ; 0x2443e 7454: 0c 94 a2 d4 jmp 0x1a944 ; 0x1a944 ()> 7458: 0c 94 d0 f8 jmp 0x1f1a0 ; 0x1f1a0 745c: 0d 94 e3 51 jmp 0x2a3c6 ; 0x2a3c6 7460: 0d 94 a3 0d jmp 0x21b46 ; 0x21b46 7464: 0c 94 82 e1 jmp 0x1c304 ; 0x1c304 7468: 0c 94 0b fb jmp 0x1f616 ; 0x1f616 746c: 0c 94 22 f0 jmp 0x1e044 ; 0x1e044 7470: 0d 94 e6 51 jmp 0x2a3cc ; 0x2a3cc 7474: 0d 94 2e a0 jmp 0x3405c ; 0x3405c 7478: 0c 94 26 d0 jmp 0x1a04c ; 0x1a04c 747c: 0c 94 0a e2 jmp 0x1c414 ; 0x1c414 7480: 0d 94 da 9f jmp 0x33fb4 ; 0x33fb4 7484: 0d 94 1f a0 jmp 0x3403e ; 0x3403e 7488: 0d 94 ad 3f jmp 0x27f5a ; 0x27f5a 748c: 0c 94 c7 d1 jmp 0x1a38e ; 0x1a38e 7490: 0d 94 7a d4 jmp 0x3a8f4 ; 0x3a8f4 7494: 0d 94 09 30 jmp 0x26012 ; 0x26012 7498: 0d 94 ac 51 jmp 0x2a358 ; 0x2a358 749c: 0d 94 31 a0 jmp 0x34062 ; 0x34062 74a0: 0c 94 88 e1 jmp 0x1c310 ; 0x1c310 74a4: 0c 94 3a d0 jmp 0x1a074 ; 0x1a074 74a8: 0d 94 6a a6 jmp 0x34cd4 ; 0x34cd4 74ac: 0d 94 16 52 jmp 0x2a42c ; 0x2a42c 74b0: 0c 94 a7 d0 jmp 0x1a14e ; 0x1a14e 74b4: 0c 94 d9 73 jmp 0xe7b2 ; 0xe7b2 <__vector_23+0x3e> 74b8: 0d 94 1e 52 jmp 0x2a43c ; 0x2a43c 74bc: 0c 94 93 d4 jmp 0x1a926 ; 0x1a926 ()> 74c0: 0c 94 74 d0 jmp 0x1a0e8 ; 0x1a0e8 74c4: 0d 94 73 d2 jmp 0x3a4e6 ; 0x3a4e6 <_menu_edit_P()> 74c8: 0c 94 6c fa jmp 0x1f4d8 ; 0x1f4d8 74cc: 0c 94 1c ce jmp 0x19c38 ; 0x19c38 74d0: 0d 94 40 10 jmp 0x22080 ; 0x22080 74d4: 0c 94 03 e0 jmp 0x1c006 ; 0x1c006 74d8: 0c 94 f3 73 jmp 0xe7e6 ; 0xe7e6 <__vector_23+0x72> 74dc: 0d 94 06 52 jmp 0x2a40c ; 0x2a40c 74e0: 0c 94 68 d0 jmp 0x1a0d0 ; 0x1a0d0 74e4: 0d 94 53 0b jmp 0x216a6 ; 0x216a6 74e8: 0c 94 a7 d4 jmp 0x1a94e ; 0x1a94e ()> 74ec: 0c 94 e3 76 jmp 0xedc6 ; 0xedc6 74f0: 0c 94 b1 d4 jmp 0x1a962 ; 0x1a962 ()> 74f4: 0d 94 2b a0 jmp 0x34056 ; 0x34056 74f8: 0c 94 27 f2 jmp 0x1e44e ; 0x1e44e 74fc: 0c 94 91 e0 jmp 0x1c122 ; 0x1c122 7500: 0c 94 60 74 jmp 0xe8c0 ; 0xe8c0 <__vector_23+0x14c> 7504: 0c 94 fd cd jmp 0x19bfa ; 0x19bfa 7508: 0c 94 45 e1 jmp 0x1c28a ; 0x1c28a 750c: 0d 94 dc 17 jmp 0x22fb8 ; 0x22fb8 7510: 0c 94 90 e5 jmp 0x1cb20 ; 0x1cb20 7514: 0c 94 0c 74 jmp 0xe818 ; 0xe818 <__vector_23+0xa4> 7518: 0d 94 e5 a6 jmp 0x34dca ; 0x34dca 751c: 0c 94 14 fb jmp 0x1f628 ; 0x1f628 7520: 0d 94 0e 52 jmp 0x2a41c ; 0x2a41c 7524: 0c 94 0a ce jmp 0x19c14 ; 0x19c14 7528: 0c 94 8b e1 jmp 0x1c316 ; 0x1c316 752c: 0c 94 0d 64 jmp 0xc81a ; 0xc81a <_GLOBAL__sub_D_card> 7530: 0d 94 f6 ac jmp 0x359ec ; 0x359ec 7534: 0d 94 40 a0 jmp 0x34080 ; 0x34080 7538: 0d 94 fa 09 jmp 0x213f4 ; 0x213f4 753c: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 7540: 0c 94 ff f8 jmp 0x1f1fe ; 0x1f1fe 7544: 0d 94 39 1d jmp 0x23a72 ; 0x23a72 7548: 0d 94 68 2c jmp 0x258d0 ; 0x258d0 754c: 0d 94 37 51 jmp 0x2a26e ; 0x2a26e 7550: 0c 94 56 ea jmp 0x1d4ac ; 0x1d4ac 7554: 0d 94 63 1f jmp 0x23ec6 ; 0x23ec6 7558: 0d 94 c5 a6 jmp 0x34d8a ; 0x34d8a 755c: 0c 94 35 e1 jmp 0x1c26a ; 0x1c26a 7560: 0d 94 c8 2c jmp 0x25990 ; 0x25990 7564: 0c 94 d4 cd jmp 0x19ba8 ; 0x19ba8 7568: 0c 94 12 e2 jmp 0x1c424 ; 0x1c424 756c: 0c 94 df cd jmp 0x19bbe ; 0x19bbe 7570: 0d 94 f7 18 jmp 0x231ee ; 0x231ee 7574: 0c 94 42 ea jmp 0x1d484 ; 0x1d484 7578: 0d 94 e2 a6 jmp 0x34dc4 ; 0x34dc4 757c: 0d 94 58 0d jmp 0x21ab0 ; 0x21ab0 7580: 0c 94 46 d0 jmp 0x1a08c ; 0x1a08c 7584: 0c 94 14 ea jmp 0x1d428 ; 0x1d428 7588: 0d 94 e0 51 jmp 0x2a3c0 ; 0x2a3c0 758c: 0c 94 01 ce jmp 0x19c02 ; 0x19c02 7590: 0d 94 74 10 jmp 0x220e8 ; 0x220e8 7594: 0c 94 7f d3 jmp 0x1a6fe ; 0x1a6fe 7598: 0c 94 17 ce jmp 0x19c2e ; 0x19c2e 759c: 0d 94 a6 1d jmp 0x23b4c ; 0x23b4c 75a0: 0c 94 3a ea jmp 0x1d474 ; 0x1d474 75a4: 0c 94 f9 fa jmp 0x1f5f2 ; 0x1f5f2 75a8: 0c 94 84 cf jmp 0x19f08 ; 0x19f08 75ac: 0d 94 27 1d jmp 0x23a4e ; 0x23a4e 75b0: 0d 94 41 51 jmp 0x2a282 ; 0x2a282 75b4: 0d 94 3a 51 jmp 0x2a274 ; 0x2a274 75b8: 0d 94 e4 ac jmp 0x359c8 ; 0x359c8 75bc: 0c 94 22 e2 jmp 0x1c444 ; 0x1c444 75c0: 0c 94 ad ce jmp 0x19d5a ; 0x19d5a 75c4: 0c 94 13 ce jmp 0x19c26 ; 0x19c26 75c8: 0c 94 42 d3 jmp 0x1a684 ; 0x1a684 75cc: 0c 94 f9 df jmp 0x1bff2 ; 0x1bff2 75d0: 0c 94 8b cf jmp 0x19f16 ; 0x19f16 75d4: 0d 94 34 2a jmp 0x25468 ; 0x25468 75d8: 0c 94 05 ce jmp 0x19c0a ; 0x19c0a 000075dc <__trampolines_end>: 75dc: 6e 61 ori r22, 0x1E ; 30 75de: 6e 00 .word 0x006e ; ???? 000075e0 <__c.2228>: 75e0: 69 6e 66 00 00 40 7a 10 f3 5a 00 a0 72 4e 18 09 inf..@z..Z..rN.. 75f0: 00 10 a5 d4 e8 00 00 e8 76 48 17 00 00 e4 0b 54 ........vH.....T 7600: 02 00 00 ca 9a 3b 00 00 00 e1 f5 05 00 00 80 96 .....;.......... 7610: 98 00 00 00 40 42 0f 00 00 00 a0 86 01 00 00 00 ....@B.......... 7620: 10 27 00 00 00 00 e8 03 00 00 00 00 64 00 00 00 .'..........d... 7630: 00 00 0a 00 00 00 00 00 01 00 00 00 00 00 2c 76 ..............,v 7640: d8 88 dc 67 4f 08 23 df c1 df ae 59 e1 b1 b7 96 ...gO.#....Y.... 7650: e5 e3 e4 53 c6 3a e6 51 99 76 96 e8 e6 c2 84 26 ...S.:.Q.v.....& 7660: eb 89 8c 9b 62 ed 40 7c 6f fc ef bc 9c 9f 40 f2 ....b.@|o.....@. 7670: ba a5 6f a5 f4 90 05 5a 2a f7 5c 93 6b 6c f9 67 ..o....Z*.\.kl.g 7680: 6d c1 1b fc e0 e4 0d 47 fe f5 20 e6 b5 00 d0 ed m......G.. ..... 7690: 90 2e 03 00 94 35 77 05 00 80 84 1e 08 00 00 20 .....5w........ 76a0: 4e 0a 00 00 00 c8 0c 33 33 33 33 0f 98 6e 12 83 N......3333..n.. 76b0: 11 41 ef 8d 21 14 89 3b e6 55 16 cf fe e6 db 18 .A..!..;.U...... 76c0: d1 84 4b 38 1b f7 7c 1d 90 1d a4 bb e4 24 20 32 ..K8..|......$ 2 76d0: 84 72 5e 22 81 00 c9 f1 24 ec a1 e5 3d 27 .r^"....$...=' 000076de : 76de: 22 00 ". 000076e0 : ... 000076e1 : 76e1: 20 45 53 50 00 ESP. 000076e6 : 76e6: 20 4e 53 50 00 NSP. 000076eb : 76eb: 20 4f 46 46 00 OFF. 000076f0 : 76f0: 20 4f 4e 00 ON. 000076f4 : 76f4: 50 56 30 31 00 PV01. 000076f9 : 76f9: 20 5b 4d 50 5d 20 00 [MP] . 00007700 : 7700: 25 69 20 68 6f 75 72 73 20 25 69 20 6d 69 6e 75 %i hours %i minu 7710: 74 65 73 00 tes. 00007714 : 7714: 52 58 20 74 69 6d 65 6f 75 74 00 RX timeout. 0000771f : 771f: 4d 33 31 30 00 M310. 00007724 : 7724: 4d 31 31 32 00 M112. 00007729 : 7729: 4d 31 31 30 00 M110. 0000772e : 772e: 46 75 6c 6c 20 52 58 20 42 75 66 66 65 72 00 Full RX Buffer. 0000773d : 773d: 53 65 74 74 69 6e 67 73 20 53 74 6f 72 65 64 00 Settings Stored. 0000774d : 774d: 54 4d 3a 20 73 74 6f 72 65 64 20 63 61 6c 69 62 TM: stored calib 775d: 72 61 74 69 6f 6e 20 69 6e 76 61 6c 69 64 2c 20 ration invalid, 776d: 72 65 73 65 74 74 69 6e 67 00 resetting. 00007777 : 7777: 53 74 6f 72 65 64 20 73 65 74 74 69 6e 67 73 20 Stored settings 7787: 72 65 74 72 69 65 76 65 64 00 retrieved. 00007791 : 7791: 48 61 72 64 63 6f 64 65 64 20 44 65 66 61 75 6c Hardcoded Defaul 77a1: 74 20 53 65 74 74 69 6e 67 73 20 4c 6f 61 64 65 t Settings Loade 77b1: 64 00 d. 000077b3 : 77b3: 56 32 00 00 00 00 c8 42 00 00 c8 42 00 00 c8 43 V2.....B...B...C 77c3: 00 00 8c 43 00 00 48 43 00 00 48 43 00 00 40 41 ...C..HC..HC..@A 77d3: 00 00 f0 42 e8 03 00 00 e8 03 00 00 c8 00 00 00 ...B............ 77e3: 88 13 00 00 00 40 9c 44 00 40 9c 44 00 00 00 00 .....@.D.@.D.... 77f3: 00 00 00 00 20 4e 00 00 00 00 20 41 00 00 20 41 .... N.... A.. A 7803: cd cc cc 3e 00 00 90 40 00 00 00 00 00 00 00 00 ...>...@........ 7813: 00 00 00 00 cd cc cc 3e 3d 0a 81 41 ff 08 43 3e .......>=..A..C> 7823: b0 99 ab 43 8f 42 fc 42 e6 5a 34 3f 4c 62 b0 45 ...C.B.B.Z4?Lb.E 7833: 00 00 00 00 00 40 40 00 00 34 42 00 00 00 00 00 .....@@..4B..... 7843: 00 00 00 00 00 00 41 00 00 00 e0 3f 00 00 c8 42 ......A....?...B 7853: 00 00 c8 42 00 00 40 41 00 00 f0 42 c0 03 00 00 ...B..@A...B.... 7863: c0 03 00 00 c8 00 00 00 88 13 00 00 10 10 10 20 ............... 7873: 00 40 9c 44 00 00 80 3f 00 00 00 3f 19 14 00 00 .@.D...?...?.... ... 00007884 : 7884: 43 75 73 74 6f 6d 00 Custom. 0000788b : 788b: 4e 79 6c 6f 6e 50 41 00 NylonPA. 00007893 : 7893: 53 61 74 69 6e 20 20 00 Satin . 0000789b : 789b: 54 65 78 74 75 72 00 Textur. 000078a2 : 78a2: 53 6d 6f 6f 74 68 00 Smooth. 000078a9 : 78a9: 48 6f 74 65 6e 64 20 66 61 6e 20 73 70 65 65 64 Hotend fan speed 78b9: 20 69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65 is lower than e 78c9: 78 70 65 63 74 65 64 00 xpected. 000078d1 : 78d1: 50 72 69 6e 74 20 66 61 6e 20 73 70 65 65 64 20 Print fan speed 78e1: 69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65 78 is lower than ex 78f1: 70 65 63 74 65 64 00 pected. 000078f8 : 78f8: 31 2e 30 00 1.0. 000078fc : 78fc: 31 2e 35 00 1.5. 00007900 : 7900: 55 4e 4b 4e 4f 57 4e 00 UNKNOWN. 00007908 : 7908: 4c 41 31 30 43 3a 20 4c 69 6e 65 61 72 20 41 64 LA10C: Linear Ad 7918: 76 61 6e 63 65 20 6d 6f 64 65 3a 20 00 vance mode: . 00007925 : 7925: 4c 41 31 30 43 3a 20 41 64 6a 75 73 74 65 64 20 LA10C: Adjusted 7935: 45 2d 4a 65 72 6b 3a 20 00 E-Jerk: . 0000793e <_PRI_LANG_SIGNATURE>: 793e: ff ff ff ff .... 00007942 : 7942: 3e 0f a8 af 00 48 00 69 96 00 00 df 60 25 55 58 >....H.i....`%UX 7952: 87 68 04 27 f2 e0 00 5e 34 03 cc 19 60 f3 3c 0e .h.'...^4...`.<. 7962: f8 8f 00 db 08 02 94 92 00 3e 1c 07 9a 87 00 e5 .........>...... 7972: 24 00 85 28 52 7e 06 00 1b e4 00 7e 78 12 70 78 $..(R~.....~x.px 7982: 70 61 f8 12 78 8f 88 41 78 42 70 78 70 61 78 25 pa..x..AxBpxpax% 7992: 70 78 70 61 f8 50 78 8f 88 d1 f0 25 27 07 87 61 pxpa.Px....%'..a 79a2: f0 25 27 8f 88 41 2c 0d 27 aa 50 d1 bc 07 07 87 .%'..A,.'.P..... 79b2: 11 61 be 78 8f 88 11 41 78 52 70 78 70 61 f8 52 .a.x...AxRpxpa.R 79c2: 78 8f 88 41 20 12 78 88 70 63 20 52 78 88 70 63 x..A .x.pc Rx.pc 79d2: 48 52 78 88 87 43 03 11 17 99 70 64 18 12 78 f8 HRx..C....pd..x. 79e2: 70 65 44 12 f8 f8 f0 45 18 42 78 f8 70 65 18 25 peD....E.Bx.pe.% 79f2: 78 f8 70 65 18 52 78 f8 70 65 18 50 78 f8 70 65 x.pe.Rx.pe.Px.pe 7a02: 0c 07 8f 87 23 65 a2 0f 8f 8f 11 45 00 12 06 22 ....#e.....E..." 7a12: 70 69 00 12 07 22 27 49 00 25 06 22 70 69 00 25 pi..."'I.%."pi.% 7a22: 07 22 27 49 00 12 06 22 27 6c 02 62 36 a2 70 6c ."'I..."'l.b6.pl 7a32: 40 45 6c 44 70 4c 03 62 22 22 70 6c 43 88 88 88 @ElDpL.b""plC... 7a42: f0 4c 78 12 bc 88 80 6e 78 52 bc 88 80 6e 38 12 .Lx....nxR...n8. 7a52: 78 88 70 6f 78 12 78 88 87 4f 38 42 78 88 70 6f x.pox.x..O8Bx.po 7a62: 38 25 78 88 70 6f 3a 00 79 ac 78 6f 3d 07 9a ac 8%x.po:.y.xo=... 7a72: 78 6f 78 50 78 88 87 ef 39 49 78 88 70 6f 08 52 xoxPx...9Ix.po.R 7a82: bc 88 80 72 98 52 f8 8f 98 52 20 12 78 70 f0 73 ...r.R...R .xp.s 7a92: 48 12 78 63 87 53 20 52 78 70 f0 73 48 52 78 63 H.xc.S Rxp.sHRxc 7aa2: 87 53 10 07 87 0f 24 73 12 78 63 87 24 53 60 69 .S....$s.xc.$S`i 7ab2: 9a 98 8b e2 23 04 e4 44 30 74 10 4e 44 43 24 74 ....#..D0t.NDC$t 7ac2: 7c 12 88 89 60 75 3c 50 88 88 70 55 78 25 28 89 |...`u: 7afe: 00 40 14 54 .@.T 00007b02 : 7b02: cd cc cc 3d 0a d7 23 3c 17 b7 d1 38 77 cc 2b 32 ...=..#<...8w.+2 7b12: 95 95 e6 24 1f b1 4f 0a ...$..O. 00007b1a : 7b1a: 00 00 20 41 00 00 c8 42 00 40 1c 46 20 bc be 4c .. A...B.@.F ..L 7b2a: ca 1b 0e 5a ae c5 9d 74 ...Z...t 00007b32 : 7b32: 4e 41 4e NAN 00007b35 : 7b35: 49 4e 46 INF 00007b38 : 7b38: 62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72 busy: paused for 7b48: 20 69 6e 70 75 74 00 input. 00007b4f : 7b4f: 62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72 busy: paused for 7b5f: 20 75 73 65 72 00 user. 00007b65 : 7b65: 62 75 73 79 3a 20 70 72 6f 63 65 73 73 69 6e 67 busy: processing ... 00007b76 : 7b76: 00 00 7f 43 00 80 54 43 00 00 52 43 ...C..TC..RC 00007b82 : 7b82: 00 00 00 00 00 00 80 c0 9a 99 19 3e ...........> 00007b8e : 7b8e: 00 00 00 00 00 00 80 c0 9a 99 19 3e ...........> 00007b9a : 7b9a: 00 00 a0 40 00 00 a0 40 00 00 00 40 ...@...@...@ 00007ba6 : 7ba6: 25 33 64 20 73 74 65 70 3d 25 32 64 20 6d 73 63 %3d step=%2d msc 7bb6: 6e 74 3d 25 34 64 0a 00 nt=%4d.. 00007bbe : 7bbe: 00 00 7f 43 00 80 58 43 9a d9 51 43 ...C..XC..QC 00007bca : 7bca: ff ff ff ... 00007bcd : 7bcd: 20 41 3a 00 A:. 00007bd1 : 7bd1: 20 50 3a 00 P:. 00007bd5 : 7bd5: 20 42 40 3a 00 B@:. 00007bda : 7bda: 20 40 3a 00 @:. 00007bde : 7bde: 20 2f 00 /. 00007be1 : 7be1: 20 54 30 3a 00 T0:. 00007be6 : 7be6: 20 2f 00 /. 00007be9 : 7be9: 20 42 3a 00 B:. 00007bed : 7bed: 20 2f 00 /. 00007bf0 : 7bf0: 54 3a 00 T:. 00007bf3 : 7bf3: 25 53 45 78 63 65 73 73 69 76 65 20 62 65 64 20 %SExcessive bed 7c03: 6c 65 76 65 6c 69 6e 67 20 63 6f 72 72 65 63 74 leveling correct 7c13: 69 6f 6e 3a 20 25 69 20 6d 69 63 72 6f 6e 73 0a ion: %i microns. ... 00007c24 : 7c24: 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69 Bed leveling fai 7c34: 6c 65 64 2e 20 54 6f 6f 20 6d 75 63 68 20 76 61 led. Too much va 7c44: 72 69 61 74 69 6f 6e 20 66 72 6f 6d 20 65 65 70 riation from eep 7c54: 72 6f 6d 20 6d 65 73 68 00 rom mesh. 00007c5d : 7c5d: 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69 Bed leveling fai 7c6d: 6c 65 64 2e 20 53 65 6e 73 6f 72 20 74 72 69 67 led. Sensor trig 7c7d: 67 65 72 65 64 20 74 6f 6f 20 73 6f 6f 6e 00 gered too soon. 00007c8c : 7c8c: 20 20 00 . 00007c8f : 7c8f: 4d 65 61 73 75 72 65 64 20 70 6f 69 6e 74 73 3a Measured points: ... 00007ca0 : 7ca0: 5a 20 73 65 61 72 63 68 20 68 65 69 67 68 74 3a Z search height: 7cb0: 20 35 2e 30 66 00 5.0f. 00007cb6 : 7cb6: 4e 75 6d 20 58 2c 59 3a 20 37 2c 37 00 Num X,Y: 7,7. 00007cc3 : 7cc3: 4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c 69 6e Mesh bed levelin 7cd3: 67 20 6e 6f 74 20 61 63 74 69 76 65 2e 00 g not active.. 00007ce1 : 7ce1: 20 45 3a 00 E:. 00007ce5 : 7ce5: 20 5a 3a 00 Z:. 00007ce9 : 7ce9: 20 59 3a 00 Y:. 00007ced : 7ced: 20 45 3a 00 E:. 00007cf1 : 7cf1: 20 5a 3a 00 Z:. 00007cf5 : 7cf5: 20 59 3a 00 Y:. 00007cf9 : 7cf9: 58 3a 00 X:. 00007cfc : 7cfc: 20 2d 3e 20 00 -> . 00007d01 : 7d01: 53 70 6f 6f 6c 4a 6f 69 6e 3a 20 00 SpoolJoin: . 00007d0d : 7d0d: 2c 20 00 , . 00007d10 : 7d10: 49 6e 61 63 74 69 76 69 74 79 20 53 68 75 74 64 Inactivity Shutd 7d20: 6f 77 6e 00 own. 00007d24 : 7d24: 4b 49 4c 4c 45 44 2e 00 KILLED.. 00007d2c : 7d2c: 50 72 69 6e 74 65 72 20 68 61 6c 74 65 64 2e 20 Printer halted. 7d3c: 6b 69 6c 6c 28 29 20 63 61 6c 6c 65 64 21 00 kill() called!. 00007d4b : 7d4b: 5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75 Z live adjust ou 7d5b: 74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74 t of range. Sett 7d6b: 69 6e 67 20 74 6f 20 30 2e 20 43 6c 69 63 6b 20 ing to 0. Click 7d7b: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 00 to continue.. 00007d88 : 7d88: 5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75 Z live adjust ou 7d98: 74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74 t of range. Sett 7da8: 69 6e 67 20 74 6f 20 30 00 ing to 0. 00007db1 : 7db1: 20 45 3a 30 20 42 3a 00 E:0 B:. 00007db9 : 7db9: 54 3a 00 T:. 00007dbc : 7dbc: 47 31 20 5a 25 2d 2e 33 66 20 46 25 2d 2e 33 66 G1 Z%-.3f F%-.3f ... 00007dcd : 7dcd: 49 6e 76 61 6c 69 64 20 54 20 63 6f 64 65 2e 00 Invalid T code.. 00007ddd : 7ddd: 44 75 70 6c 69 63 61 74 65 20 54 2d 63 6f 64 65 Duplicate T-code 7ded: 20 69 67 6e 6f 72 65 64 2e 00 ignored.. 00007df7 : 7df7: 41 64 76 61 6e 63 65 20 4b 3d 00 Advance K=. 00007e02 : 7e02: 4b 20 6f 75 74 20 6f 66 20 61 6c 6c 6f 77 65 64 K out of allowed 7e12: 20 72 61 6e 67 65 21 00 range!. 00007e1a <_sPrinterName>: 7e1a: 4d 4b 33 00 MK3. 00007e1e <_sPrinterMmuName>: 7e1e: 4d 4b 33 4d 4d 55 33 00 MK3MMU3. 00007e26 <_nPrinterMmuType>: 7e26: 5c 76 \v 00007e28 <_nPrinterType>: 7e28: 2c 01 ,. 00007e2a : 7e2a: 25 33 64 2f 25 33 64 00 %3d/%3d. 00007e32 : 7e32: 25 33 64 00 %3d. 00007e36 : 7e36: 20 0a 20 0a 20 0a 20 00 . . . . 00007e3e : 7e3e: 25 53 53 74 61 74 69 73 74 69 63 73 3a 0a 25 53 %SStatistics:.%S 7e4e: 20 20 4d 37 38 20 53 25 6c 75 20 54 25 6c 75 0a M78 S%lu T%lu. ... 00007e5f : 7e5f: 25 53 41 72 63 20 53 65 74 74 69 6e 67 73 3a 20 %SArc Settings: 7e6f: 50 3a 4d 61 78 20 6c 65 6e 67 74 68 28 6d 6d 29 P:Max length(mm) 7e7f: 20 53 3a 4d 69 6e 20 6c 65 6e 67 74 68 20 28 6d S:Min length (m 7e8f: 6d 29 20 4e 3a 43 6f 72 72 65 63 74 69 6f 6e 73 m) N:Corrections 7e9f: 20 52 3a 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 R:Min segments 7eaf: 46 3a 53 65 67 6d 65 6e 74 73 2f 73 65 63 2e 0a F:Segments/sec.. 7ebf: 25 53 20 20 4d 32 31 34 20 50 25 2e 32 66 20 53 %S M214 P%.2f S 7ecf: 25 2e 32 66 20 4e 25 64 20 52 25 64 20 46 25 64 %.2f N%d R%d F%d 7edf: 0a 00 .. 00007ee1 : 7ee1: 25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69 %SFilament setti 7ef1: 6e 67 73 3a 20 44 69 73 61 62 6c 65 64 0a 00 ngs: Disabled.. 00007f00 : 7f00: 25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69 %SFilament setti 7f10: 6e 67 73 3a 0a 25 53 20 20 20 4d 32 30 30 20 44 ngs:.%S M200 D 7f20: 25 2e 32 66 0a 00 %.2f.. 00007f26 : 7f26: 25 53 52 65 74 72 61 63 74 3a 20 53 3d 4c 65 6e %SRetract: S=Len 7f36: 67 74 68 20 28 6d 6d 29 20 46 3a 53 70 65 65 64 gth (mm) F:Speed 7f46: 20 28 6d 6d 2f 6d 29 20 5a 3a 20 5a 4c 69 66 74 (mm/m) Z: ZLift 7f56: 20 28 6d 6d 29 0a 25 53 20 20 20 4d 32 30 37 20 (mm).%S M207 7f66: 53 25 2e 32 66 20 46 25 2e 32 66 20 5a 25 2e 32 S%.2f F%.2f Z%.2 7f76: 66 0a 25 53 52 65 63 6f 76 65 72 3a 20 53 3d 45 f.%SRecover: S=E 7f86: 78 74 72 61 20 6c 65 6e 67 74 68 20 28 6d 6d 29 xtra length (mm) 7f96: 20 46 3a 53 70 65 65 64 20 28 6d 6d 2f 6d 29 0a F:Speed (mm/m). 7fa6: 25 53 20 20 20 4d 32 30 38 20 53 25 2e 32 66 20 %S M208 S%.2f 7fb6: 46 25 2e 32 66 0a 25 53 41 75 74 6f 2d 52 65 74 F%.2f.%SAuto-Ret 7fc6: 72 61 63 74 3a 20 53 3d 30 20 74 6f 20 64 69 73 ract: S=0 to dis 7fd6: 61 62 6c 65 2c 20 31 20 74 6f 20 69 6e 74 65 72 able, 1 to inter 7fe6: 70 72 65 74 20 65 78 74 72 75 64 65 2d 6f 6e 6c pret extrude-onl 7ff6: 79 20 6d 6f 76 65 73 20 61 73 20 72 65 74 72 61 y moves as retra 8006: 63 74 73 20 6f 72 20 72 65 63 6f 76 65 72 69 65 cts or recoverie 8016: 73 0a 25 53 20 20 20 4d 32 30 39 20 53 25 64 0a s.%S M209 S%d. ... 00008027 : 8027: 25 53 50 49 44 20 68 65 61 74 62 65 64 20 73 65 %SPID heatbed se 8037: 74 74 69 6e 67 73 3a 0a 25 53 20 20 20 4d 33 30 ttings:.%S M30 8047: 34 20 50 25 2e 32 66 20 49 25 2e 32 66 20 44 25 4 P%.2f I%.2f D% 8057: 2e 32 66 0a 00 .2f.. 0000805c : 805c: 25 53 50 49 44 20 73 65 74 74 69 6e 67 73 3a 0a %SPID settings:. 806c: 25 53 20 20 20 4d 33 30 31 20 50 25 2e 32 66 20 %S M301 P%.2f 807c: 49 25 2e 32 66 20 44 25 2e 32 66 0a 00 I%.2f D%.2f.. 00008089 : 8089: 25 53 53 74 65 70 73 20 70 65 72 20 75 6e 69 74 %SSteps per unit 8099: 3a 0a 25 53 20 20 4d 39 32 20 58 25 2e 32 66 20 :.%S M92 X%.2f 80a9: 59 25 2e 32 66 20 5a 25 2e 32 66 20 45 25 2e 32 Y%.2f Z%.2f E%.2 80b9: 66 0a 25 53 55 53 74 65 70 20 72 65 73 6f 6c 75 f.%SUStep resolu 80c9: 74 69 6f 6e 3a 20 0a 25 53 20 4d 33 35 30 20 58 tion: .%S M350 X 80d9: 25 64 20 59 25 64 20 5a 25 64 20 45 25 64 0a 25 %d Y%d Z%d E%d.% 80e9: 53 4d 61 78 69 6d 75 6d 20 66 65 65 64 72 61 74 SMaximum feedrat 80f9: 65 73 20 2d 20 6e 6f 72 6d 61 6c 20 28 6d 6d 2f es - normal (mm/ 8109: 73 29 3a 0a 25 53 20 20 4d 32 30 33 20 58 25 2e s):.%S M203 X%. 8119: 32 66 20 59 25 2e 32 66 20 5a 25 2e 32 66 20 45 2f Y%.2f Z%.2f E 8129: 25 2e 32 66 0a 25 53 4d 61 78 69 6d 75 6d 20 66 %.2f.%SMaximum f 8139: 65 65 64 72 61 74 65 73 20 2d 20 73 74 65 61 6c eedrates - steal 8149: 74 68 20 28 6d 6d 2f 73 29 3a 0a 25 53 20 20 4d th (mm/s):.%S M 8159: 32 30 33 20 58 25 2e 32 66 20 59 25 2e 32 66 20 203 X%.2f Y%.2f 8169: 5a 25 2e 32 66 20 45 25 2e 32 66 0a 25 53 4d 61 Z%.2f E%.2f.%SMa 8179: 78 69 6d 75 6d 20 61 63 63 65 6c 65 72 61 74 69 ximum accelerati 8189: 6f 6e 20 2d 20 6e 6f 72 6d 61 6c 20 28 6d 6d 2f on - normal (mm/ 8199: 73 32 29 3a 0a 25 53 20 20 4d 32 30 31 20 58 25 s2):.%S M201 X% 81a9: 6c 75 20 59 25 6c 75 20 5a 25 6c 75 20 45 25 6c lu Y%lu Z%lu E%l 81b9: 75 0a 25 53 4d 61 78 69 6d 75 6d 20 61 63 63 65 u.%SMaximum acce 81c9: 6c 65 72 61 74 69 6f 6e 20 2d 20 73 74 65 61 6c leration - steal 81d9: 74 68 20 28 6d 6d 2f 73 32 29 3a 0a 25 53 20 20 th (mm/s2):.%S 81e9: 4d 32 30 31 20 58 25 6c 75 20 59 25 6c 75 20 5a M201 X%lu Y%lu Z 81f9: 25 6c 75 20 45 25 6c 75 0a 25 53 41 63 63 65 6c %lu E%lu.%SAccel 8209: 65 72 61 74 69 6f 6e 3a 20 50 3d 70 72 69 6e 74 eration: P=print 8219: 2c 20 52 3d 72 65 74 72 61 63 74 2c 20 54 3d 74 , R=retract, T=t 8229: 72 61 76 65 6c 0a 25 53 20 20 4d 32 30 34 20 50 ravel.%S M204 P 8239: 25 2e 32 66 20 52 25 2e 32 66 20 54 25 2e 32 66 %.2f R%.2f T%.2f 8249: 0a 25 53 41 64 76 61 6e 63 65 64 20 76 61 72 69 .%SAdvanced vari 8259: 61 62 6c 65 73 3a 20 53 3d 4d 69 6e 20 66 65 65 ables: S=Min fee 8269: 64 72 61 74 65 20 28 6d 6d 2f 73 29 2c 20 54 3d drate (mm/s), T= 8279: 4d 69 6e 20 74 72 61 76 65 6c 20 66 65 65 64 72 Min travel feedr 8289: 61 74 65 20 28 6d 6d 2f 73 29 2c 20 42 3d 6d 69 ate (mm/s), B=mi 8299: 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74 20 74 69 nimum segment ti 82a9: 6d 65 20 28 75 73 29 2c 20 58 3d 6d 61 78 69 6d me (us), X=maxim 82b9: 75 6d 20 58 59 20 6a 65 72 6b 20 28 6d 6d 2f 73 um XY jerk (mm/s 82c9: 29 2c 20 20 5a 3d 6d 61 78 69 6d 75 6d 20 5a 20 ), Z=maximum Z 82d9: 6a 65 72 6b 20 28 6d 6d 2f 73 29 2c 20 20 45 3d jerk (mm/s), E= 82e9: 6d 61 78 69 6d 75 6d 20 45 20 6a 65 72 6b 20 28 maximum E jerk ( 82f9: 6d 6d 2f 73 29 0a 25 53 20 20 4d 32 30 35 20 53 mm/s).%S M205 S 8309: 25 2e 32 66 20 54 25 2e 32 66 20 42 25 6c 75 20 %.2f T%.2f B%lu 8319: 58 25 2e 32 66 20 59 25 2e 32 66 20 5a 25 2e 32 X%.2f Y%.2f Z%.2 8329: 66 20 45 25 2e 32 66 0a 25 53 48 6f 6d 65 20 6f f E%.2f.%SHome o 8339: 66 66 73 65 74 20 28 6d 6d 29 3a 0a 25 53 20 20 ffset (mm):.%S 8349: 4d 32 30 36 20 58 25 2e 32 66 20 59 25 2e 32 66 M206 X%.2f Y%.2f 8359: 20 5a 25 2e 32 66 0a 00 Z%.2f.. 00008361 : 8361: 54 4d 3a 20 52 5b 25 75 5d 20 65 73 74 69 6d 61 TM: R[%u] estima 8371: 74 65 2e 00 te.. 00008375 : 8375: 54 4d 3a 20 25 53 20 52 20 25 64 43 00 TM: %S R %dC. 00008382 : 8382: 54 4d 3a 20 25 53 20 43 20 65 73 74 2e 00 TM: %S C est.. 00008390 : 8390: 54 4d 3a 20 63 6f 6f 6c 20 64 6f 77 6e 20 3c 25 TM: cool down <% 83a0: 64 43 00 dC. 000083a3 : 83a3: 72 65 66 69 6e 65 00 refine. 000083aa : 83aa: 69 6e 69 74 69 61 6c 00 initial. 000083b2 : 83b2: 54 4d 3a 20 63 61 6c 69 62 72 2e 20 66 61 69 6c TM: calibr. fail 83c2: 65 64 21 00 ed!. 000083c6 : 83c6: 54 4d 3a 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 TM: calibration 83d6: 73 74 61 72 74 00 start. 000083dc : 83dc: 54 4d 3a 20 43 61 6c 2e 20 4e 4f 54 20 49 44 4c TM: Cal. NOT IDL 83ec: 45 00 E. 000083ee : 83ee: 43 61 70 3a 25 53 3a 25 63 0a 00 Cap:%S:%c.. 000083f9 : 83f9: 50 52 55 53 41 5f 4d 4d 55 32 00 PRUSA_MMU2. 00008404 : 8404: 45 58 54 45 4e 44 45 44 5f 4d 32 30 00 EXTENDED_M20. 00008411 : 8411: 41 55 54 4f 52 45 50 4f 52 54 5f 50 4f 53 49 54 AUTOREPORT_POSIT 8421: 49 4f 4e 00 ION. 00008425 : 8425: 41 55 54 4f 52 45 50 4f 52 54 5f 46 41 4e 53 00 AUTOREPORT_FANS. 00008435 : 8435: 41 55 54 4f 52 45 50 4f 52 54 5f 54 45 4d 50 00 AUTOREPORT_TEMP. 00008445 : ... 00008446 : 8446: 33 2e 31 34 2e 31 00 3.14.1. 0000844d : 844d: 44 65 6c 65 74 69 6f 6e 20 66 61 69 6c 65 64 2c Deletion failed, 845d: 20 46 69 6c 65 3a 20 00 File: . 00008465 : 8465: 46 69 6c 65 20 64 65 6c 65 74 65 64 3a 00 File deleted:. 00008473 : 8473: 4e 6f 74 20 53 44 20 70 72 69 6e 74 69 6e 67 00 Not SD printing. 00008483 : 8483: 50 72 69 6e 74 20 73 61 76 65 64 00 Print saved. 0000848f : 848f: 53 44 20 70 72 69 6e 74 20 70 61 75 73 65 64 00 SD print paused. 0000849f : 849f: 25 33 64 2f 25 33 64 00 %3d/%3d. 000084a7 : 84a7: 4f 4b 00 OK. 000084aa : 84aa: 42 41 44 00 BAD. 000084ae : 84ae: 52 41 4d 42 6f 20 46 41 4e 20 00 RAMBo FAN . 000084b9 : 84b9: 43 52 41 53 48 5f 43 41 4e 43 45 4c 00 CRASH_CANCEL. 000084c6 : 84c6: 43 52 41 53 48 5f 52 45 43 4f 56 45 52 00 CRASH_RECOVER. 000084d4 : 84d4: 43 52 41 53 48 5f 52 45 43 4f 56 45 52 00 CRASH_RECOVER. 000084e2 <_ZZ16process_commandsvE3__c__97_>: 84e2: 22 28 32 29 00 "(2). 000084e7 <_ZZ16process_commandsvE3__c__96_>: 84e7: 25 53 3a 20 25 53 0a 00 %S: %S.. 000084ef <_ZZ16process_commandsvE3__c__95_>: 84ef: 2c 20 4d 39 30 37 20 45 20 69 67 6e 6f 72 65 64 , M907 E ignored ... 00008500 <_ZZ16process_commandsvE3__c__94_>: 8500: 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 no valid command ... 00008511 <_ZZ16process_commandsvE3__c__93_>: 8511: 7a 65 72 6f 72 69 7a 65 64 00 zerorized. 0000851b <_ZZ16process_commandsvE3__c__92_>: 851b: 66 61 63 74 6f 72 79 20 72 65 73 74 6f 72 65 64 factory restored ... 0000852c <_ZZ16process_commandsvE3__c__90_>: 852c: 69 6e 64 65 78 2c 20 74 65 6d 70 2c 20 75 73 74 index, temp, ust 853c: 65 70 2c 20 75 6d 00 ep, um. 00008543 <_ZZ16process_commandsvE3__c__91_>: 8543: 50 49 4e 44 41 20 63 61 6c 20 73 74 61 74 75 73 PINDA cal status 8553: 3a 20 00 : . 00008556 <_ZZ16process_commandsvE3__c__89_>: 8556: 50 3a 00 P:. 00008559 <_ZZ16process_commandsvE3__c__88_>: 8559: 57 61 69 74 20 66 6f 72 20 50 49 4e 44 41 20 74 Wait for PINDA t 8569: 61 72 67 65 74 20 74 65 6d 70 65 72 61 74 75 72 arget temperatur 8579: 65 3a 00 e:. 0000857c <_ZZ16process_commandsvE3__c__87_>: 857c: 20 41 00 A. 0000857f <_ZZ16process_commandsvE3__c__86_>: 857f: 20 50 00 P. 00008582 <_ZZ16process_commandsvE3__c__85_>: 8582: 20 42 00 B. 00008585 <_ZZ16process_commandsvE3__c__84_>: 8585: 20 4c 00 L. 00008588 <_ZZ16process_commandsvE3__c__83_>: 8588: 20 52 00 R. 0000858b <_ZZ16process_commandsvE3__c__82_>: 858b: 20 5a 00 Z. 0000858e <_ZZ16process_commandsvE3__c__81_>: 858e: 20 4e 4f 54 20 49 4e 49 54 49 41 4c 49 5a 45 44 NOT INITIALIZED ... 0000859f <_ZZ16process_commandsvE3__c__80_>: 859f: 53 68 65 65 74 20 00 Sheet . 000085a6 <_ZZ16process_commandsvE3__c__79_>: 85a6: 20 5a 20 56 41 4c 55 45 20 4f 55 54 20 4f 46 20 Z VALUE OUT OF 85b6: 52 41 4e 47 45 00 RANGE. 000085bc <_ZZ16process_commandsvE3__c__78_>: 85bc: 49 6e 76 61 6c 69 64 20 73 68 65 65 74 20 49 44 Invalid sheet ID 85cc: 2e 20 41 6c 6c 6f 77 65 64 3a 20 30 2e 2e 00 . Allowed: 0... 000085db <_ZZ16process_commandsvE3__c__77_>: 85db: 41 55 54 4f 00 AUTO. 000085e0 <_ZZ16process_commandsvE3__c__76_>: 85e0: 4c 41 4e 47 20 53 45 4c 20 46 4f 52 43 45 44 00 LANG SEL FORCED. 000085f0 <_ZZ16process_commandsvE3__c__75_>: 85f0: 4d 32 35 36 20 42 25 64 20 44 25 64 20 53 25 64 M256 B%d D%d S%d 8600: 20 54 25 75 0a 00 T%u.. 00008606 <_ZZ16process_commandsvE3__c__74_>: 8606: 20 64 3a 00 d:. 0000860a <_ZZ16process_commandsvE3__c__73_>: 860a: 20 69 3a 00 i:. 0000860e <_ZZ16process_commandsvE3__c__72_>: 860e: 20 70 3a 00 p:. 00008612 <_ZZ16process_commandsvE3__c__71_>: 8612: 20 64 3a 00 d:. 00008616 <_ZZ16process_commandsvE3__c__70_>: 8616: 20 69 3a 00 i:. 0000861a <_ZZ16process_commandsvE3__c__69_>: 861a: 20 70 3a 00 p:. 0000861e <_ZZ16process_commandsvE3__c__68_>: 861e: 25 69 25 25 0a 00 %i%%.. 00008624 <_ZZ16process_commandsvE3__c__67_>: 8624: 25 69 25 25 0a 00 %i%%.. 0000862a <_ZZ16process_commandsvE3__c__66_>: 862a: 22 28 31 29 00 "(1). 0000862f <_ZZ16process_commandsvE3__c__59_>: 862f: 2f 2f 00 //. 00008632 <_ZZ16process_commandsvE3__c__58_>: ... 00008633 <_ZZ16process_commandsvE3__c__57_>: 8633: 20 45 58 54 52 55 44 45 52 5f 43 4f 55 4e 54 3a EXTRUDER_COUNT: 8643: 31 00 1. 00008645 <_ZZ16process_commandsvE3__c__56_>: 8645: 20 4d 41 43 48 49 4e 45 5f 54 59 50 45 3a 00 MACHINE_TYPE:. 00008654 <_ZZ16process_commandsvE3__c__55_>: 8654: 31 2e 30 00 1.0. 00008658 <_ZZ16process_commandsvE3__c__54_>: 8658: 20 62 61 73 65 64 20 6f 6e 20 4d 61 72 6c 69 6e based on Marlin 8668: 20 46 49 52 4d 57 41 52 45 5f 55 52 4c 3a 68 74 FIRMWARE_URL:ht 8678: 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d tps://github.com 8688: 2f 70 72 75 73 61 33 64 2f 50 72 75 73 61 2d 46 /prusa3d/Prusa-F 8698: 69 72 6d 77 61 72 65 20 50 52 4f 54 4f 43 4f 4c irmware PROTOCOL 86a8: 5f 56 45 52 53 49 4f 4e 3a 00 _VERSION:. 000086b2 <_ZZ16process_commandsvE3__c__53_>: 86b2: 37 37 33 31 30 32 34 65 64 00 7731024ed. 000086bc <_ZZ16process_commandsvE3__c__52_>: 86bc: 5f 00 _. 000086be <_ZZ16process_commandsvE3__c__51_>: 86be: 38 32 37 39 00 8279. 000086c3 <_ZZ16process_commandsvE3__c__50_>: 86c3: 2b 00 +. 000086c5 <_ZZ16process_commandsvE3__c__49_>: 86c5: 46 49 52 4d 57 41 52 45 5f 4e 41 4d 45 3a 50 72 FIRMWARE_NAME:Pr 86d5: 75 73 61 2d 46 69 72 6d 77 61 72 65 20 00 usa-Firmware . 000086e3 <_ZZ16process_commandsvE3__c__48_>: 86e3: 4d 31 31 33 20 53 00 M113 S. 000086ea <_ZZ16process_commandsvE3__c__47_>: 86ea: 6f 6b 20 00 ok . 000086ee <_ZZ16process_commandsvE3__c__41_>: 86ee: 6e 2f 61 00 n/a. 000086f2 <_ZZ16process_commandsvE3__c__40_>: 86f2: 3f 54 6f 73 68 69 62 61 20 46 6c 61 73 68 41 69 ?Toshiba FlashAi 8702: 72 20 47 65 74 49 50 20 66 61 69 6c 65 64 0a 00 r GetIP failed.. 00008712 : 8712: 00 01 25 31 1d 0c 40 24 30 1c 0b 45 23 2f 1b 0a ..%1..@$0..E#/.. 8722: 17 ff 04 06 22 2b 1a 03 36 37 35 38 ...."+..6758 0000872e <_ZZ16process_commandsvE3__c__39_>: 872e: 25 69 20 6d 69 6e 2c 20 25 69 20 73 65 63 00 %i min, %i sec. 0000873d <_ZZ16process_commandsvE3__c__36_>: 873d: 49 6e 76 61 6c 69 64 20 4d 20 63 6f 64 65 3a 20 Invalid M code: 874d: 25 73 0a 00 %s.. 00008751 <_ZZ16process_commandsvE3__c__30_>: 8751: 50 49 4e 44 41 20 70 72 6f 62 65 20 63 61 6c 69 PINDA probe cali 8761: 62 72 61 74 69 6f 6e 20 73 74 61 72 74 00 bration start. 0000876f <_ZZ16process_commandsvE3__c__29_>: 876f: 4e 6f 20 50 49 4e 44 41 20 74 68 65 72 6d 69 73 No PINDA thermis 877f: 74 6f 72 00 tor. 00008783 <_ZZ16process_commandsvE3__c__25_>: 8783: 73 65 74 00 set. 00008787 <_ZZ16process_commandsvE3__c__24_>: 8787: 6e 6f 7a 7a 6c 65 00 nozzle. 0000878e <_ZZ16process_commandsvE3__c__23_>: 878e: 4d 42 4c 00 MBL. 00008792 <_ZZ16process_commandsvE3__c__22_>: 8792: 46 52 00 FR. 00008795 <_ZZ16process_commandsvE3__c__21_>: 8795: 4c 7a 00 Lz. 00008798 <_ZZ16process_commandsvE3__c__20_>: 8798: 4c 61 6e 67 00 Lang. 0000879d <_ZZ16process_commandsvE3__c__19_>: 879d: 31 5f 37 35 6d 6d 5f 4d 4b 33 2d 45 49 4e 53 79 1_75mm_MK3-EINSy 87ad: 5f 31 30 61 2d 45 33 44 76 36 66 75 6c 6c 00 _10a-E3Dv6full. 000087bc <_ZZ16process_commandsvE3__c__18_>: 87bc: 52 65 76 00 Rev. 000087c0 <_ZZ16process_commandsvE3__c__17_>: 87c0: 33 2e 31 34 2e 31 2d 38 32 37 39 00 3.14.1-8279. 000087cc <_ZZ16process_commandsvE3__c__16_>: 87cc: 46 69 72 00 Fir. 000087d0 <_ZZ16process_commandsvE3__c__15_>: 87d0: 53 4e 20 69 6e 76 61 6c 69 64 00 SN invalid. 000087db <_ZZ16process_commandsvE3__c__14_>: 87db: 53 4e 00 SN. 000087de <_ZZ16process_commandsvE3__c__13_>: 87de: 52 45 53 45 54 00 RESET. 000087e4 <_ZZ16process_commandsvE3__c__12_>: 87e4: 4d 4d 55 52 45 53 00 MMURES. 000087eb <_ZZ16process_commandsvE3__c__11_>: 87eb: 75 76 6c 6f 00 uvlo. 000087f0 : 87f0: 46 41 4e 00 FAN. 000087f4 : 87f4: 46 41 4e 50 49 4e 54 53 54 00 FANPINTST. 000087fe : 87fe: 50 52 55 53 41 00 PRUSA. 00008804 : 8804: 53 45 54 5f 43 48 4f 50 5f 00 SET_CHOP_. 0000880e : 880e: 53 45 54 5f 53 54 45 50 5f 00 SET_STEP_. 00008818 : 8818: 53 45 54 5f 57 41 56 45 5f 00 SET_WAVE_. 00008822 : 8822: 54 4d 43 5f 00 TMC_. 00008827 : 8827: 43 52 41 53 48 5f 43 41 4e 43 45 4c 00 CRASH_CANCEL. 00008834 : 8834: 43 52 41 53 48 5f 52 45 43 4f 56 45 52 00 CRASH_RECOVER. 00008842 : 8842: 43 52 41 53 48 5f 44 45 54 45 43 54 45 44 00 CRASH_DETECTED. 00008851 : 8851: 43 52 41 53 48 5f 00 CRASH_. 00008858 : 8858: 4d 31 30 34 53 30 00 M104S0. 0000885f : 885f: 47 31 58 31 30 59 31 38 30 46 34 30 30 30 00 G1X10Y180F4000. 0000886e : 886e: 47 31 5a 31 30 46 31 33 30 30 00 G1Z10F1300. 00008879 : 8879: 4d 31 34 30 53 30 00 M140S0. 00008880 : 8880: 47 31 45 2d 30 2e 30 37 35 46 32 31 30 30 00 G1E-0.075F2100. 0000888f : 888f: 4d 32 30 34 53 31 30 30 30 00 M204S1000. 00008899 : 8899: 47 31 5a 35 46 37 32 30 30 00 G1Z5F7200. 000088a3 : 88a3: 47 31 45 2d 31 2e 35 46 32 31 30 30 00 G1E-1.5F2100. 000088b0 : 88b0: 47 31 5a 30 2e 32 00 G1Z0.2. 000088b7 : 88b7: 47 31 58 32 30 32 2e 35 45 38 46 31 34 30 30 00 G1X202.5E8F1400. 000088c7 : 88c7: 47 31 59 2d 32 46 31 30 30 30 00 G1Y-2F1000. 000088d2 : 88d2: 47 31 58 32 34 30 45 32 35 46 32 32 30 30 00 G1X240E25F2200. 000088e1 : 88e1: 47 31 5a 30 2e 33 46 31 30 30 30 00 G1Z0.3F1000. 000088ed : 88ed: 47 31 58 35 35 45 38 46 32 30 30 30 00 G1X55E8F2000. 000088fa : 88fa: 47 31 58 35 45 32 39 46 31 38 30 30 00 G1X5E29F1800. 00008907 : 8907: 47 31 58 35 35 45 32 39 46 31 30 37 33 00 G1X55E29F1073. 00008915 : 8915: 47 39 32 45 30 00 G92E0. 0000891b : 891b: 47 32 38 00 G28. 0000891f : 891f: 4d 31 30 39 00 M109. 00008924 : 8924: 4d 31 39 30 00 M190. 00008929 : 8929: 47 38 30 00 G80. 0000892d : 892d: 4d 34 35 00 M45. 00008931 : 8931: 4d 34 35 20 5a 00 M45 Z. 00008937 : 8937: 47 37 36 00 G76. 0000893b : 893b: 4d 37 30 31 20 50 30 00 M701 P0. 00008943 : 8943: 57 69 7a 61 72 64 20 73 74 61 74 65 3a 20 25 64 Wizard state: %d 8953: 0a 00 .. 00008955 : 8955: 4d 39 31 34 00 M914. 0000895a : 895a: 4d 39 31 35 00 M915. 0000895f : 895f: 45 78 70 65 72 69 6d 65 6e 74 61 6c 00 Experimental. 0000896c : 896c: 30 2e 38 30 00 0.80. 00008971 : 8971: 30 2e 36 30 00 0.60. 00008976 : 8976: 30 2e 34 30 00 0.40. 0000897b : 897b: 30 2e 32 35 00 0.25. 00008980 : 8980: 52 65 73 65 74 20 4d 4d 55 00 Reset MMU. 0000898a : 898a: 4d 4d 55 00 MMU. 0000898e : 898e: 4d 34 34 00 M44. 00008992 : 8992: 47 32 38 20 58 59 00 G28 XY. 00008999 : 8999: 4d 20 38 34 00 M 84. 0000899e : 899e: 85 2e 2e 00 .... 000089a2 : 89a2: 59 3a 20 25 75 20 2d 3e 20 2e 2e 2e 00 Y: %u -> .... 000089af : 89af: 58 3a 20 25 75 20 2d 3e 20 2e 2e 2e 00 X: %u -> .... 000089bc : 89bc: 25 33 64 2f 30 00 %3d/0. 000089c2 : 89c2: 25 33 64 2f 30 00 %3d/0. 000089c8 : 89c8: 25 63 20 41 58 49 53 20 53 47 31 3d 25 64 0a 00 %c AXIS SG1=%d.. 000089d8 : 89d8: 48 6f 74 65 6e 64 00 Hotend. 000089df : 89df: 42 65 64 00 Bed. 000089e3 : 89e3: 5a 00 Z. 000089e5 : 89e5: 59 00 Y. 000089e7 : 89e7: 58 00 X. 000089e9 <_ZL13STR_SEPARATOR.lto_priv.444>: 89e9: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------- 89f9: 2d 2d 2d 2d 00 ----. 000089fe : 89fe: 43 5a 50 58 49 6e 76 61 6c 69 64 53 65 72 69 61 CZPXInvalidSeria 8a0e: 6c 4e 72 00 lNr. 00008a12 : 8a12: d5 69 d9 69 80 88 79 88 6e 88 5f 88 71 6b 58 88 .i.i..y.n._.qkX. 8a22: dc 6a .j 00008a24 : 8a24: 47 31 59 25 2e 34 66 45 25 2e 34 66 00 G1Y%.4fE%.4f. 00008a31 : 8a31: 47 31 5a 25 2e 32 66 00 G1Z%.2f. 00008a39 : 8a39: 47 31 58 35 30 59 31 35 35 00 G1X50Y155. 00008a43 : 8a43: 15 89 d5 69 76 6b a3 88 99 88 8f 88 ...ivk...... 00008a4f : 8a4f: 47 31 58 25 2e 34 66 45 25 2e 34 66 00 G1X%.4fE%.4f. 00008a5c : 8a5c: 47 31 46 31 30 38 30 00 G1F1080. 00008a64 : 8a64: 07 89 fa 88 ed 88 e1 88 15 89 d2 88 c7 88 b7 88 ................ 8a74: b0 88 .. 00008a76 : 8a76: 54 25 64 00 T%d. 00008a7a : 8a7a: 47 31 5a 30 2e 34 00 G1Z0.4. 00008a81 : 8a81: 47 31 59 2d 33 46 31 30 30 30 00 G1Y-3F1000. 00008a8c : 8a8c: d9 69 24 89 1f 89 1b 89 15 89 .i$....... 00008a96 : 8a96: 4d 38 34 20 58 59 00 M84 XY. 00008a9d : 8a9d: 4d 31 30 39 20 53 32 38 30 00 M109 S280. 00008aa7 : 8aa7: 47 31 20 58 31 32 35 20 5a 32 30 30 20 46 31 30 G1 X125 Z200 F10 8ab7: 30 30 00 00. 00008aba : 8aba: 4d 33 31 30 20 41 20 46 31 00 M310 A F1. 00008ac4 : 8ac4: 47 31 20 58 31 32 35 20 59 31 30 35 20 5a 31 20 G1 X125 Y105 Z1 8ad4: 46 38 30 30 30 00 F8000. 00008ada : 8ada: 49 6e 76 61 6c 69 64 20 50 49 44 20 63 61 6c 2e Invalid PID cal. 8aea: 20 72 65 73 75 6c 74 73 2e 20 4e 6f 74 20 73 74 results. Not st 8afa: 6f 72 65 64 20 74 6f 20 45 45 50 52 4f 4d 2e 00 ored to EEPROM.. 00008b0a : 8b0a: 4d 33 30 31 20 50 25 2e 32 66 20 49 25 2e 32 66 M301 P%.2f I%.2f 8b1a: 20 44 25 2e 32 66 00 D%.2f. 00008b21 : 8b21: 4d 33 30 33 20 45 30 20 53 25 33 75 00 M303 E0 S%3u. 00008b2e : 8b2e: 52 43 00 RC. 00008b31 : 8b31: 44 45 56 00 DEV. 00008b35 : 8b35: 42 45 54 41 00 BETA. 00008b3a : 8b3a: 41 4c 50 48 41 00 ALPHA. 00008b40 : 8b40: 00 00 21 00 24 00 27 00 2a 00 2d 00 30 00 33 00 ..!.$.'.*.-.0.3. 8b50: 01 01 00 00 04 01 07 01 0a 01 .......... 00008b5a : 8b5a: 00 00 22 00 25 00 28 00 2b 00 2e 00 31 00 34 00 ..".%.(.+...1.4. 8b6a: 02 01 00 00 05 01 08 01 0b 01 .......... 00008b74 : 8b74: 00 00 20 00 23 00 26 00 29 00 2c 00 2f 00 32 00 .. .#.&.).,./.2. 8b84: 00 01 00 00 03 01 06 01 09 01 .......... 00008b8e : 8b8e: 05 05 05 05 07 05 08 08 08 08 02 02 02 02 0a 0a ................ 8b9e: 08 08 04 04 04 04 01 01 01 01 01 01 01 01 03 03 ................ 8bae: 03 03 03 03 03 03 04 07 07 07 0c 0c 0c 0c 0c 0c ................ 8bbe: 0c 0c 02 02 02 02 06 06 06 06 06 06 06 06 0b 0b ................ 8bce: 0b 0b 0b 0b 0b 0b 07 07 0a 0a 0a 0a 0a 0a 05 05 ................ 8bde: 05 04 04 04 08 08 ...... 00008be4 : 8be4: 01 02 10 20 20 08 08 10 20 40 10 20 40 80 02 01 ... ... @. @... 8bf4: 02 01 08 04 02 01 01 02 04 08 10 20 40 80 80 40 ........... @..@ 8c04: 20 10 08 04 02 01 80 04 02 01 80 40 20 10 08 04 ..........@ ... 8c14: 02 01 08 04 02 01 01 02 04 08 10 20 40 80 01 02 ........... @... 8c24: 04 08 10 20 40 80 10 08 04 08 80 10 20 40 04 40 ... @....... @.@ 8c34: 80 10 20 40 04 80 .. @.. 00008c3a : 8c3a: 00 00 0a 0b 02 09 0c 0d 0e 08 07 03 04 01 00 00 ................ ... 8c66: 12 11 10 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ... 00008c90 : 8c90: 33 2e 31 34 2e 31 00 3.14.1. 00008c97 : 8c97: 0a 20 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 . Original Prusa 8ca7: 20 69 33 0a 20 20 20 50 72 75 73 61 20 52 65 73 i3. Prusa Res 8cb7: 65 61 72 63 68 0a 25 32 30 2e 32 30 53 00 earch.%20.20S. 00008cc5 : 8cc5: 4c 61 6e 67 75 61 67 65 20 75 70 64 61 74 65 00 Language update. 00008cd5 : 8cd5: 43 5a 50 58 00 CZPX. 00008cda : 8cda: 3b 53 00 ;S. 00008cdd : 8cdd: 53 70 6f 6f 6c 4a 6f 69 6e 20 69 73 20 00 SpoolJoin is . 00008ceb : 8ceb: 61 64 63 5f 69 6e 69 74 00 adc_init. 00008cf4 : 8cf4: 20 0a 20 0a 20 0a 20 00 . . . . 00008cfc : 8cfc: 41 6c 6c 20 44 61 74 61 00 All Data. 00008d05 : 8d05: 53 65 72 76 69 63 65 20 70 72 65 70 00 Service prep. 00008d12 : 8d12: 53 68 69 70 70 69 6e 67 20 70 72 65 70 00 Shipping prep. 00008d20 : 8d20: 53 74 61 74 69 73 74 69 63 73 00 Statistics. 00008d2b : 8d2b: 4c 61 6e 67 75 61 67 65 00 Language. 00008d34 <_ZZL13factory_resetcE3__c.lto_priv.535>: 8d34: 45 52 41 53 49 4e 47 20 61 6c 6c 20 64 61 74 61 ERASING all data ... 00008d45 : 8d45: 46 61 63 74 6f 72 79 20 52 45 53 45 54 00 Factory RESET. 00008d53 : 8d53: 50 52 55 53 41 33 44 46 57 00 PRUSA3DFW. 00008d5d <_ZL8MSG_INT4.lto_priv.484>: 8d5d: 49 4e 54 34 00 INT4. 00008d62 : 8d62: 03 00 0e 00 01 00 40 00 ......@. 00008d6a : 8d6a: 03 00 02 00 00 00 04 00 ........ 00008d72 : 8d72: 70 72 75 73 61 33 64 00 prusa3d. 00008d7a : 8d7a: 32 30 32 35 2d 30 34 2d 32 32 20 32 32 3a 30 33 2025-04-22 22:03 8d8a: 3a 35 33 00 :53. 00008d8e : 8d8e: 20 33 2e 31 34 2e 31 2d 38 32 37 39 5f 37 37 33 3.14.1-8279_773 8d9e: 31 30 32 34 65 64 00 1024ed. 00008da5 : 8da5: 73 74 61 72 74 00 start. 00008dab : 8dab: 53 4e 20 75 70 64 61 74 65 20 66 61 69 6c 65 64 SN update failed ... 00008dbc : 8dbc: 53 4e 20 75 70 64 61 74 65 64 00 SN updated. 00008dc7 : 8dc7: 43 5a 50 58 00 CZPX. 00008dcc : 8dcc: 43 52 41 53 48 5f 44 45 54 45 43 54 45 44 58 59 CRASH_DETECTEDXY ... 00008ddd : 8ddd: 43 52 41 53 48 5f 44 45 54 45 43 54 45 44 59 00 CRASH_DETECTEDY. 00008ded : 8ded: 43 52 41 53 48 5f 44 45 54 45 43 54 45 44 58 00 CRASH_DETECTEDX. 00008dfd : 8dfd: 4d 32 39 00 M29. 00008e01 : 8e01: 25 2d 39 2e 39 53 5b 00 %-9.9S[. 00008e09 : 8e09: 54 4d 20 65 73 74 69 6d 61 74 69 6f 6e 20 64 69 TM estimation di 8e19: 64 20 6e 6f 74 20 63 6f 6e 76 65 72 67 65 00 d not converge. 00008e28 : 8e28: 54 4d 20 69 74 65 72 3a 25 75 20 76 3a 25 2e 32 TM iter:%u v:%.2 8e38: 66 20 65 3a 25 2e 33 66 0a 00 f e:%.3f.. 00008e42 : 8e42: 20 0a 20 0a 20 00 . . . 00008e48 : 8e48: 00 00 48 42 00 00 58 41 9a 99 8d 41 33 33 53 40 ..HB..XA...A33S@ 00008e58 : 8e58: 4d 4d 55 32 3a 00 MMU2:. 00008e5e : 8e5e: 4d 49 4e 54 45 4d 50 20 42 45 44 20 66 69 78 65 MINTEMP BED fixe 8e6e: 64 00 d. 00008e70 : 8e70: 4d 49 4e 54 45 4d 50 20 48 4f 54 45 4e 44 20 66 MINTEMP HOTEND f 8e80: 69 78 65 64 00 ixed. 00008e85 : 8e85: 72 65 63 6f 76 65 72 5f 6d 61 63 68 69 6e 65 5f recover_machine_ 8e95: 73 74 61 74 65 5f 61 66 74 65 72 5f 70 6f 77 65 state_after_powe 8ea5: 72 5f 70 61 6e 69 63 2c 20 69 6e 69 74 69 61 6c r_panic, initial 8eb5: 20 00 . 00008eb7 <_ZZL25restore_print_from_eeprombE3__c__12_>: 8eb7: 50 52 55 53 41 20 75 76 6c 6f 00 PRUSA uvlo. 00008ec2 <_ZZL25restore_print_from_eeprombE3__c__11_>: 8ec2: 47 34 20 53 30 00 G4 S0. 00008ec8 <_ZZL25restore_print_from_eeprombE3__c__10_>: 8ec8: 4d 31 31 30 20 4e 25 6c 75 00 M110 N%lu. 00008ed2 : 8ed2: 4d 32 36 20 53 25 6c 75 00 M26 S%lu. 00008edb : 8edb: 4d 31 30 36 20 53 25 75 00 M106 S%u. 00008ee4 : 8ee4: 47 31 20 46 25 64 00 G1 F%d. 00008eeb : 8eeb: 4d 38 32 00 M82. 00008eef : 8eef: 47 39 32 20 45 25 2d 2e 33 66 00 G92 E%-.3f. 00008efa : 8efa: 4d 32 30 34 20 50 25 2d 2e 31 66 20 52 25 2d 2e M204 P%-.1f R%-. 8f0a: 31 66 20 54 25 2d 2e 31 66 00 1f T%-.1f. 00008f14 : 8f14: 47 31 20 5a 25 2d 2e 33 66 00 G1 Z%-.3f. 00008f1e : 8f1e: 50 52 55 53 41 20 4d 42 4c 20 56 31 00 PRUSA MBL V1. 00008f2b : 8f2b: 47 31 20 58 25 2d 2e 33 66 20 59 25 2d 2e 33 66 G1 X%-.3f Y%-.3f 8f3b: 20 46 33 30 30 30 00 F3000. 00008f42 : 8f42: 2c 20 66 65 65 64 6d 75 6c 74 69 70 6c 79 3a 00 , feedmultiply:. 00008f52 : 8f52: 46 65 65 64 72 61 74 65 3a 00 Feedrate:. 00008f5c : 8f5c: 47 31 20 45 35 20 46 31 32 30 00 G1 E5 F120. 00008f67 : 8f67: 4d 31 30 39 20 53 25 64 00 M109 S%d. 00008f70 : 8f70: 4d 31 34 30 20 53 25 64 00 M140 S%d. 00008f79 : 8f79: 4d 31 30 34 20 53 25 64 00 M104 S%d. 00008f82 : 8f82: 47 32 38 20 58 20 59 00 G28 X Y. 00008f8a : 8f8a: 47 31 20 5a 25 2e 33 66 20 46 38 30 30 00 G1 Z%.3f F800. 00008f98 : 8f98: 00 00 21 10 42 20 63 30 84 40 a5 50 c6 60 e7 70 ..!.B c0.@.P.`.p 8fa8: 08 81 29 91 4a a1 6b b1 8c c1 ad d1 ce e1 ef f1 ..).J.k......... 8fb8: 31 12 10 02 73 32 52 22 b5 52 94 42 f7 72 d6 62 1...s2R".R.B.r.b 8fc8: 39 93 18 83 7b b3 5a a3 bd d3 9c c3 ff f3 de e3 9...{.Z......... 8fd8: 62 24 43 34 20 04 01 14 e6 64 c7 74 a4 44 85 54 b$C4 ....d.t.D.T 8fe8: 6a a5 4b b5 28 85 09 95 ee e5 cf f5 ac c5 8d d5 j.K.(........... 8ff8: 53 36 72 26 11 16 30 06 d7 76 f6 66 95 56 b4 46 S6r&..0..v.f.V.F 9008: 5b b7 7a a7 19 97 38 87 df f7 fe e7 9d d7 bc c7 [.z...8......... 9018: c4 48 e5 58 86 68 a7 78 40 08 61 18 02 28 23 38 .H.X.h.x@.a..(#8 9028: cc c9 ed d9 8e e9 af f9 48 89 69 99 0a a9 2b b9 ........H.i...+. 9038: f5 5a d4 4a b7 7a 96 6a 71 1a 50 0a 33 3a 12 2a .Z.J.z.jq.P.3:.* 9048: fd db dc cb bf fb 9e eb 79 9b 58 8b 3b bb 1a ab ........y.X.;... 9058: a6 6c 87 7c e4 4c c5 5c 22 2c 03 3c 60 0c 41 1c .l.|.L.\",.<`.A. 9068: ae ed 8f fd ec cd cd dd 2a ad 0b bd 68 8d 49 9d ........*...h.I. 9078: 97 7e b6 6e d5 5e f4 4e 13 3e 32 2e 51 1e 70 0e .~.n.^.N.>2.Q.p. 9088: 9f ff be ef dd df fc cf 1b bf 3a af 59 9f 78 8f ..........:.Y.x. 9098: 88 91 a9 81 ca b1 eb a1 0c d1 2d c1 4e f1 6f e1 ..........-.N.o. 90a8: 80 10 a1 00 c2 30 e3 20 04 50 25 40 46 70 67 60 .....0. .P%@Fpg` 90b8: b9 83 98 93 fb a3 da b3 3d c3 1c d3 7f e3 5e f3 ........=.....^. 90c8: b1 02 90 12 f3 22 d2 32 35 42 14 52 77 62 56 72 .....".25B.RwbVr 90d8: ea b5 cb a5 a8 95 89 85 6e f5 4f e5 2c d5 0d c5 ........n.O.,... 90e8: e2 34 c3 24 a0 14 81 04 66 74 47 64 24 54 05 44 .4.$....ftGd$T.D 90f8: db a7 fa b7 99 87 b8 97 5f e7 7e f7 1d c7 3c d7 ........_.~...<. 9108: d3 26 f2 36 91 06 b0 16 57 66 76 76 15 46 34 56 .&.6....Wfvv.F4V 9118: 4c d9 6d c9 0e f9 2f e9 c8 99 e9 89 8a b9 ab a9 L.m.../......... 9128: 44 58 65 48 06 78 27 68 c0 18 e1 08 82 38 a3 28 DXeH.x'h.....8.( 9138: 7d cb 5c db 3f eb 1e fb f9 8b d8 9b bb ab 9a bb }.\.?........... 9148: 75 4a 54 5a 37 6a 16 7a f1 0a d0 1a b3 2a 92 3a uJTZ7j.z.....*.: 9158: 2e fd 0f ed 6c dd 4d cd aa bd 8b ad e8 9d c9 8d ....l.M......... 9168: 26 7c 07 6c 64 5c 45 4c a2 3c 83 2c e0 1c c1 0c &|.ld\EL.<.,.... 9178: 1f ef 3e ff 5d cf 7c df 9b af ba bf d9 8f f8 9f ..>.].|......... 9188: 17 6e 36 7e 55 4e 74 5e 93 2e b2 3e d1 0e f0 1e .n6~UNt^...>.... 00009198 : 9198: 7c 3c 3e 3f 2f 2a 22 5c 00 |<>?/*"\. 000091a1 : 91a1: 24 f4 d4 30 50 c3 8e 20 c2 a2 40 17 82 8b 70 11 $..0P.. ..@...p. 91b1: 12 7a 91 0d 81 6c d9 0a a8 61 e1 08 c7 58 66 07 .z...l...a...Xf. 91c1: 61 51 43 06 1e 4b 5d 05 c1 45 a7 04 1a 41 11 04 aQC..K]..E...A.. 91d1: 09 3d 98 03 71 39 31 03 40 36 db 02 65 33 91 02 .=..q91.@6..e3.. 91e1: d4 30 54 02 80 2e 1d 02 63 2c ee 01 75 2a c5 01 .0T.....c,..u*.. 91f1: b0 28 a0 01 10 27 81 01 8f 25 64 01 2b 24 4b 01 .(...'...%d.+$K. 9201: e0 22 34 01 ac 21 1f 01 8d 20 0d 01 80 1f fc 00 ."4..!... ...... 9211: 84 1e ed 00 97 1d df 00 b8 1c d2 00 e6 1b c6 00 ................ 9221: 20 1b bc 00 64 1a b2 00 b2 19 a8 00 0a 19 a0 00 ...d........... 9231: 6a 18 99 00 d1 17 91 00 40 17 8b 00 b5 16 84 00 j.......@....... 9241: 31 16 7e 00 b3 15 79 00 3a 15 73 00 c7 14 6f 00 1.~...y.:.s...o. 9251: 58 14 6a 00 ee 13 66 00 88 13 63 00 25 13 5e 00 X.j...f...c.%.^. 9261: c7 12 5b 00 6c 12 57 00 15 12 54 00 c1 11 51 00 ..[.l.W...T...Q. 9271: 70 11 4f 00 21 11 4b 00 d6 10 49 00 8d 10 47 00 p.O.!.K...I...G. 9281: 46 10 44 00 02 10 42 00 c0 0f 40 00 80 0f 3e 00 F.D...B...@...>. 9291: 42 0f 3c 00 06 0f 3b 00 cb 0e 38 00 93 0e 37 00 B.<...;...8...7. 92a1: 5c 0e 35 00 27 0e 34 00 f3 0d 32 00 c1 0d 31 00 \.5.'.4...2...1. 92b1: 90 0d 30 00 60 0d 2e 00 32 0d 2d 00 05 0d 2c 00 ..0.`...2.-...,. 92c1: d9 0c 2b 00 ae 0c 29 00 85 0c 29 00 5c 0c 27 00 ..+...)...).\.'. 92d1: 35 0c 27 00 0e 0c 26 00 e8 0b 24 00 c4 0b 24 00 5.'...&...$...$. 92e1: a0 0b 23 00 7d 0b 23 00 5a 0b 21 00 39 0b 21 00 ..#.}.#.Z.!.9.!. 92f1: 18 0b 20 00 f8 0a 1f 00 d9 0a 1e 00 bb 0a 1e 00 .. ............. 9301: 9d 0a 1d 00 80 0a 1d 00 63 0a 1c 00 47 0a 1b 00 ........c...G... 9311: 2c 0a 1b 00 11 0a 1a 00 f7 09 1a 00 dd 09 19 00 ,............... 9321: c4 09 19 00 ab 09 19 00 92 09 17 00 7b 09 18 00 ............{... 9331: 63 09 17 00 4c 09 16 00 36 09 16 00 20 09 16 00 c...L...6... ... 9341: 0a 09 15 00 f5 08 15 00 e0 08 14 00 cc 08 14 00 ................ 9351: b8 08 14 00 a4 08 14 00 90 08 13 00 7d 08 12 00 ............}... 9361: 6b 08 13 00 58 08 12 00 46 08 12 00 34 08 11 00 k...X...F...4... 9371: 23 08 11 00 12 08 11 00 01 08 11 00 f0 07 10 00 #............... 9381: e0 07 10 00 d0 07 10 00 c0 07 10 00 b0 07 0f 00 ................ 9391: a1 07 10 00 91 07 0e 00 83 07 0f 00 74 07 0f 00 ............t... 93a1: 65 07 0e 00 57 07 0e 00 49 07 0e 00 3b 07 0d 00 e...W...I...;... 93b1: 2e 07 0e 00 20 07 0d 00 13 07 0d 00 06 07 0d 00 .... ........... 93c1: f9 06 0c 00 ed 06 0d 00 e0 06 0c 00 d4 06 0c 00 ................ 93d1: c8 06 0c 00 bc 06 0c 00 b0 06 0c 00 a4 06 0b 00 ................ 93e1: 99 06 0c 00 8d 06 0b 00 82 06 0b 00 77 06 0b 00 ............w... 93f1: 6c 06 0b 00 61 06 0a 00 57 06 0b 00 4c 06 0a 00 l...a...W...L... 9401: 42 06 0a 00 38 06 0a 00 2e 06 0a 00 24 06 0a 00 B...8.......$... 9411: 1a 06 0a 00 10 06 09 00 07 06 0a 00 fd 05 09 00 ................ 9421: f4 05 09 00 eb 05 09 00 e2 05 09 00 d9 05 09 00 ................ 9431: d0 05 09 00 c7 05 09 00 be 05 09 00 b5 05 08 00 ................ 9441: ad 05 08 00 a5 05 09 00 9c 05 08 00 94 05 08 00 ................ 9451: 8c 05 08 00 84 05 08 00 7c 05 08 00 74 05 08 00 ........|...t... 9461: 6c 05 07 00 65 05 08 00 5d 05 07 00 56 05 08 00 l...e...]...V... 9471: 4e 05 07 00 47 05 07 00 40 05 08 00 38 05 07 00 N...G...@...8... 9481: 31 05 07 00 2a 05 07 00 23 05 07 00 1c 05 06 00 1...*...#....... 9491: 16 05 07 00 0f 05 07 00 08 05 06 00 02 05 07 00 ................ 94a1: fb 04 06 00 f5 04 07 00 ee 04 06 00 e8 04 06 00 ................ 94b1: e2 04 07 00 db 04 06 00 d5 04 06 00 cf 04 06 00 ................ 94c1: c9 04 06 00 c3 04 06 00 bd 04 06 00 b7 04 06 00 ................ 94d1: b1 04 05 00 ac 04 06 00 a6 04 06 00 a0 04 05 00 ................ 94e1: 9b 04 06 00 95 04 05 00 90 04 06 00 8a 04 05 00 ................ 94f1: 85 04 05 00 80 04 06 00 7a 04 05 00 75 04 05 00 ........z...u... 9501: 70 04 05 00 6b 04 05 00 66 04 05 00 61 04 05 00 p...k...f...a... 9511: 5c 04 05 00 57 04 05 00 52 04 05 00 4d 04 05 00 \...W...R...M... 9521: 48 04 05 00 43 04 05 00 3e 04 04 00 3a 04 05 00 H...C...>...:... 9531: 35 04 05 00 30 04 04 00 2c 04 05 00 27 04 04 00 5...0...,...'... 9541: 23 04 05 00 1e 04 04 00 1a 04 04 00 16 04 05 00 #............... 9551: 11 04 04 00 0d 04 04 00 09 04 05 00 04 04 04 00 ................ 9561: 00 04 04 00 fc 03 04 00 f8 03 04 00 f4 03 04 00 ................ 9571: f0 03 04 00 ec 03 04 00 e8 03 04 00 e4 03 04 00 ................ 9581: e0 03 04 00 dc 03 04 00 d8 03 04 00 d4 03 04 00 ................ 9591: d0 03 04 00 cc 03 04 00 c8 03 03 00 c5 03 03 00 ................ 000095a1 : 95a1: 24 f4 04 d9 20 1b c4 0c 5c 0e 98 04 c4 09 5f 02 $... ...\....._. 95b1: 65 07 71 01 f4 05 f9 00 fb 04 b3 00 48 04 87 00 e.q.........H... 95c1: c1 03 69 00 58 03 55 00 03 03 45 00 be 02 3a 00 ..i.X.U...E...:. 95d1: 84 02 31 00 53 02 2a 00 29 02 25 00 04 02 20 00 ..1.S.*.).%... . 95e1: e4 01 1c 00 c8 01 19 00 af 01 17 00 98 01 14 00 ................ 95f1: 84 01 13 00 71 01 10 00 61 01 10 00 51 01 0e 00 ....q...a...Q... 9601: 43 01 0d 00 36 01 0b 00 2b 01 0b 00 20 01 0b 00 C...6...+... ... 9611: 15 01 09 00 0c 01 09 00 03 01 08 00 fb 00 08 00 ................ 9621: f3 00 08 00 eb 00 07 00 e4 00 06 00 de 00 06 00 ................ 9631: d8 00 06 00 d2 00 06 00 cc 00 05 00 c7 00 05 00 ................ 9641: c2 00 05 00 bd 00 04 00 b9 00 04 00 b5 00 04 00 ................ 9651: b1 00 04 00 ad 00 04 00 a9 00 04 00 a5 00 03 00 ................ 9661: a2 00 03 00 9f 00 04 00 9b 00 03 00 98 00 03 00 ................ 9671: 95 00 02 00 93 00 03 00 90 00 03 00 8d 00 02 00 ................ 9681: 8b 00 03 00 88 00 02 00 86 00 02 00 84 00 03 00 ................ 9691: 81 00 02 00 7f 00 02 00 7d 00 02 00 7b 00 02 00 ........}...{... 96a1: 79 00 02 00 77 00 01 00 76 00 02 00 74 00 02 00 y...w...v...t... 96b1: 72 00 01 00 71 00 02 00 6f 00 02 00 6d 00 01 00 r...q...o...m... 96c1: 6c 00 02 00 6a 00 01 00 69 00 02 00 67 00 01 00 l...j...i...g... 96d1: 66 00 01 00 65 00 01 00 64 00 02 00 62 00 01 00 f...e...d...b... 96e1: 61 00 01 00 60 00 01 00 5f 00 02 00 5d 00 01 00 a...`..._...]... 96f1: 5c 00 01 00 5b 00 01 00 5a 00 01 00 59 00 01 00 \...[...Z...Y... 9701: 58 00 01 00 57 00 01 00 56 00 01 00 55 00 01 00 X...W...V...U... 9711: 54 00 01 00 53 00 00 00 53 00 01 00 52 00 01 00 T...S...S...R... 9721: 51 00 01 00 50 00 01 00 4f 00 01 00 4e 00 00 00 Q...P...O...N... 9731: 4e 00 01 00 4d 00 01 00 4c 00 01 00 4b 00 00 00 N...M...L...K... 9741: 4b 00 01 00 4a 00 01 00 49 00 01 00 48 00 00 00 K...J...I...H... 9751: 48 00 01 00 47 00 01 00 46 00 00 00 46 00 01 00 H...G...F...F... 9761: 45 00 00 00 45 00 01 00 44 00 01 00 43 00 00 00 E...E...D...C... 9771: 43 00 01 00 42 00 00 00 42 00 01 00 41 00 00 00 C...B...B...A... 9781: 41 00 01 00 40 00 01 00 3f 00 00 00 3f 00 01 00 A...@...?...?... 9791: 3e 00 00 00 3e 00 01 00 3d 00 00 00 3d 00 01 00 >...>...=...=... 97a1: 3c 00 00 00 3c 00 00 00 3c 00 01 00 3b 00 00 00 <...<...<...;... 97b1: 3b 00 01 00 3a 00 00 00 3a 00 01 00 39 00 00 00 ;...:...:...9... 97c1: 39 00 01 00 38 00 00 00 38 00 00 00 38 00 01 00 9...8...8...8... 97d1: 37 00 00 00 37 00 01 00 36 00 00 00 36 00 00 00 7...7...6...6... 97e1: 36 00 01 00 35 00 00 00 35 00 00 00 35 00 01 00 6...5...5...5... 97f1: 34 00 00 00 34 00 00 00 34 00 01 00 33 00 00 00 4...4...4...3... 9801: 33 00 00 00 33 00 01 00 32 00 00 00 32 00 00 00 3...3...2...2... 9811: 32 00 01 00 31 00 00 00 31 00 00 00 31 00 01 00 2...1...1...1... 9821: 30 00 00 00 30 00 00 00 30 00 01 00 2f 00 00 00 0...0...0.../... 9831: 2f 00 00 00 2f 00 00 00 2f 00 01 00 2e 00 00 00 /.../.../....... 9841: 2e 00 00 00 2e 00 01 00 2d 00 00 00 2d 00 00 00 ........-...-... 9851: 2d 00 00 00 2d 00 01 00 2c 00 00 00 2c 00 00 00 -...-...,...,... 9861: 2c 00 00 00 2c 00 01 00 2b 00 00 00 2b 00 00 00 ,...,...+...+... 9871: 2b 00 00 00 2b 00 01 00 2a 00 00 00 2a 00 00 00 +...+...*...*... 9881: 2a 00 00 00 2a 00 01 00 29 00 00 00 29 00 00 00 *...*...)...)... 9891: 29 00 00 00 29 00 00 00 29 00 01 00 28 00 00 00 )...)...)...(... 98a1: 28 00 00 00 28 00 00 00 28 00 00 00 28 00 01 00 (...(...(...(... 98b1: 27 00 00 00 27 00 00 00 27 00 00 00 27 00 00 00 '...'...'...'... 98c1: 27 00 01 00 26 00 00 00 26 00 00 00 26 00 00 00 '...&...&...&... 98d1: 26 00 00 00 26 00 01 00 25 00 00 00 25 00 00 00 &...&...%...%... 98e1: 25 00 00 00 25 00 00 00 25 00 00 00 25 00 01 00 %...%...%...%... 98f1: 24 00 00 00 24 00 00 00 24 00 00 00 24 00 00 00 $...$...$...$... 9901: 24 00 01 00 23 00 00 00 23 00 00 00 23 00 00 00 $...#...#...#... 9911: 23 00 00 00 23 00 00 00 23 00 00 00 23 00 01 00 #...#...#...#... 9921: 22 00 00 00 22 00 00 00 22 00 00 00 22 00 00 00 "..."..."..."... 9931: 22 00 00 00 22 00 01 00 21 00 00 00 21 00 00 00 "..."...!...!... 9941: 21 00 00 00 21 00 00 00 21 00 00 00 21 00 00 00 !...!...!...!... 9951: 21 00 01 00 20 00 00 00 20 00 00 00 20 00 00 00 !... ... ... ... 9961: 20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00 ... ... ... ... 9971: 20 00 01 00 1f 00 00 00 1f 00 00 00 1f 00 00 00 ............... 9981: 1f 00 00 00 1f 00 00 00 1f 00 00 00 1f 00 01 00 ................ 9991: 1e 00 00 00 1e 00 00 00 1e 00 00 00 1e 00 00 00 ................ 000099a1 <_ZZ12PID_autotunefiiE3__c__16_>: 99a1: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 69 6e PID Autotune fin 99b1: 69 73 68 65 64 21 20 50 75 74 20 74 68 65 20 6c ished! Put the l 99c1: 61 73 74 20 4b 70 2c 20 4b 69 20 61 6e 64 20 4b ast Kp, Ki and K 99d1: 64 20 63 6f 6e 73 74 61 6e 74 73 20 66 72 6f 6d d constants from 99e1: 20 61 62 6f 76 65 20 69 6e 74 6f 20 43 6f 6e 66 above into Conf 99f1: 69 67 75 72 61 74 69 6f 6e 2e 68 00 iguration.h. 000099fd <_ZZ12PID_autotunefiiE3__c__15_>: 99fd: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 9a0d: 6c 65 64 21 20 74 69 6d 65 6f 75 74 00 led! timeout. 00009a1a <_ZZ12PID_autotunefiiE3__c__14_>: 9a1a: 20 40 3a 00 @:. 00009a1e <_ZZ12PID_autotunefiiE3__c__13_>: 9a1e: 54 3a 00 T:. 00009a21 <_ZZ12PID_autotunefiiE3__c__12_>: 9a21: 42 3a 00 B:. 00009a24 <_ZZ12PID_autotunefiiE3__c__11_>: 9a24: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 9a34: 6c 65 64 21 20 54 65 6d 70 65 72 61 74 75 72 65 led! Temperature 9a44: 20 74 6f 6f 20 68 69 67 68 00 too high. 00009a4e <_ZZ12PID_autotunefiiE3__c__10_>: 9a4e: 20 4b 64 3a 20 00 Kd: . 00009a54 : 9a54: 20 4b 69 3a 20 00 Ki: . 00009a5a : 9a5a: 20 4b 70 3a 20 00 Kp: . 00009a60 : 9a60: 20 43 6c 61 73 73 69 63 20 50 49 44 20 00 Classic PID . 00009a6e : 9a6e: 20 54 75 3a 20 00 Tu: . 00009a74 : 9a74: 20 4b 75 3a 20 00 Ku: . 00009a7a : 9a7a: 20 6d 61 78 3a 20 00 max: . 00009a81 : 9a81: 20 6d 69 6e 3a 20 00 min: . 00009a88 : 9a88: 20 64 3a 20 00 d: . 00009a8d : 9a8d: 20 62 69 61 73 3a 20 00 bias: . 00009a95 : 9a95: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 73 74 61 PID Autotune sta 9aa5: 72 74 00 rt. 00009aa8 : 9aa8: 50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69 PID Autotune fai 9ab8: 6c 65 64 2e 20 42 61 64 20 65 78 74 72 75 64 65 led. Bad extrude 9ac8: 72 20 6e 75 6d 62 65 72 2e 00 r number.. 00009ad2 : 9ad2: 54 4d 4c 20 25 64 20 25 64 20 25 78 20 25 6c 78 TML %d %d %x %lx 9ae2: 20 25 6c 78 0a 00 %lx.. 00009ae8 : 9ae8: 4d 49 4e 54 45 4d 50 00 MINTEMP. 00009af0 : 9af0: 4d 49 4e 54 45 4d 50 20 42 45 44 00 MINTEMP BED. 00009afc : 9afc: 4d 49 4e 54 45 4d 50 20 41 4d 42 00 MINTEMP AMB. 00009b08 : 9b08: 4d 41 58 54 45 4d 50 00 MAXTEMP. 00009b10 : 9b10: 4d 41 58 54 45 4d 50 20 42 45 44 00 MAXTEMP BED. 00009b1c : 9b1c: 4d 41 58 54 45 4d 50 20 41 4d 42 00 MAXTEMP AMB. 00009b28 : 9b28: 54 4d 3a 20 65 72 72 6f 72 20 63 6c 65 61 72 65 TM: error cleare 9b38: 64 00 d. 00009b3a : 9b3a: 54 4d 3a 20 65 72 72 6f 72 20 74 72 69 67 67 65 TM: error trigge 9b4a: 72 65 64 21 00 red!. 00009b4f : 9b4f: 54 4d 3a 20 65 72 72 6f 72 20 7c 25 66 7c 3e 25 TM: error |%f|>% 9b5f: 66 0a 00 f.. 00009b62 : 9b62: 70 01 2c 01 90 01 27 01 b0 01 22 01 c0 01 1d 01 p.,...'..."..... 9b72: f0 01 18 01 10 02 13 01 30 02 0e 01 60 02 09 01 ........0...`... 9b82: 90 02 04 01 c0 02 ff 00 00 03 fa 00 40 03 f5 00 ............@... 9b92: 80 03 f0 00 d0 03 eb 00 20 04 e6 00 70 04 e1 00 ........ ...p... 9ba2: e0 04 dc 00 40 05 d7 00 c0 05 d2 00 40 06 cd 00 ....@.......@... 9bb2: d0 06 c8 00 80 07 c3 00 30 08 be 00 f0 08 b9 00 ........0....... 9bc2: c0 09 b4 00 b0 0a af 00 b0 0b aa 00 d0 0c a5 00 ................ 9bd2: 00 0e a0 00 50 0f 9b 00 c0 10 96 00 50 12 91 00 ....P.......P... 9be2: 00 14 8c 00 c0 15 87 00 b0 17 82 00 b0 19 7d 00 ..............}. 9bf2: d0 1b 78 00 00 1e 73 00 40 20 6e 00 90 22 69 00 ..x...s.@ n.."i. 9c02: f0 24 64 00 40 27 5f 00 90 29 5a 00 e0 2b 55 00 .$d.@'_..)Z..+U. 9c12: 10 2e 50 00 20 30 4b 00 10 32 46 00 e0 33 41 00 ..P. 0K..2F..3A. 9c22: 90 35 3c 00 10 37 37 00 70 38 32 00 a0 39 2d 00 .5<..77.p82..9-. 9c32: b0 3a 28 00 a0 3b 23 00 60 3c 1e 00 10 3d 19 00 .:(..;#.`<...=.. 9c42: 90 3d 14 00 10 3e 0f 00 70 3e 0a 00 c0 3e 05 00 .=...>..p>...>.. 9c52: 00 3f 00 00 .?.. 00009c56 : 9c56: 90 13 7d 00 b0 15 78 00 f0 17 73 00 60 1a 6e 00 ..}...x...s.`.n. 9c66: f0 1c 69 00 a0 1f 64 00 50 22 5f 00 20 25 5a 00 ..i...d.P"_. %Z. 9c76: e0 27 55 00 90 2a 50 00 20 2d 4b 00 a0 2f 46 00 .'U..*P. -K../F. 9c86: f0 31 41 00 10 34 3c 00 f0 35 37 00 a0 37 32 00 .1A..4<..57..72. 9c96: 20 39 2d 00 60 3a 28 00 70 3b 23 00 60 3c 1e 00 9-.`:(.p;#.`<.. 9ca6: 20 3d 19 00 c0 3d 14 00 40 3e 0f 00 a0 3e 0a 00 =...=..@>...>.. 9cb6: f0 3e 05 00 40 3f 00 00 70 3f fb ff 90 3f f6 ff .>..@?..p?...?.. 9cc6: b0 3f f1 ff c0 3f ec ff d0 3f e7 ff e0 3f e2 ff .?...?...?...?.. 9cd6: f0 3f dd ff f0 3f d8 ff .?...?.. 00009cde : 9cde: 20 48 4f 54 45 4e 44 20 54 48 45 52 4d 41 4c 20 HOTEND THERMAL 9cee: 52 55 4e 41 57 41 59 00 RUNAWAY. 00009cf6 : 9cf6: 20 48 45 41 54 42 45 44 20 54 48 45 52 4d 41 4c HEATBED THERMAL 9d06: 20 52 55 4e 41 57 41 59 00 RUNAWAY. 00009d0f : 9d0f: 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 00 THERMAL RUNAWAY. 00009d1f : 9d1f: 42 45 44 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 BED THERMAL RUNA 9d2f: 57 41 59 00 WAY. 00009d33 : 9d33: 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 THERMAL RUNAWAY 9d43: 20 28 50 52 45 48 45 41 54 20 48 4f 54 45 4e 44 (PREHEAT HOTEND 9d53: 29 00 ). 00009d55 : 9d55: 20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 THERMAL RUNAWAY 9d65: 20 28 50 52 45 48 45 41 54 20 48 45 41 54 42 45 (PREHEAT HEATBE 9d75: 44 29 00 D). 00009d78 : 9d78: 50 52 45 48 45 41 54 20 45 52 52 4f 52 00 PREHEAT ERROR. 00009d86 : 9d86: 42 45 44 20 50 52 45 48 45 41 54 20 45 52 52 4f BED PREHEAT ERRO 9d96: 52 00 R. 00009d98 : 9d98: 20 74 72 69 67 67 65 72 65 64 21 00 triggered!. 00009da4 : 9da4: 48 65 61 74 65 72 73 20 73 77 69 74 63 68 65 64 Heaters switched 9db4: 20 6f 66 66 2e 20 00 off. . 00009dbb : 9dbb: 3a 20 00 : . 00009dbe : 9dbe: 45 72 72 3a 20 00 Err: . 00009dc4 : 9dc4: 00 ff 01 02 01 00 02 ff ff fe 00 01 fe 01 ff 00 ................ 00009dd4 : 9dd4: 50 6c 65 61 73 65 20 72 65 73 74 61 72 74 00 Please restart. 00009de3 : 9de3: 54 4d 3a 20 69 6e 76 61 6c 69 64 20 70 61 72 61 TM: invalid para 9df3: 6d 65 74 65 72 73 2c 20 63 61 6e 6e 6f 74 20 65 meters, cannot e 9e03: 6e 61 62 6c 65 00 nable. 00009e09 : 9e09: 25 53 20 20 4d 33 31 30 20 50 25 2e 32 66 20 55 %S M310 P%.2f U 9e19: 25 2e 34 66 20 56 25 2e 32 66 20 43 25 2e 32 66 %.4f V%.2f C%.2f 9e29: 20 44 25 2e 34 66 20 4c 25 75 20 53 25 75 20 42 D%.4f L%u S%u B 9e39: 25 75 20 45 25 2e 32 66 20 57 25 2e 32 66 20 54 %u E%.2f W%.2f T 9e49: 25 2e 32 66 0a 00 %.2f.. 00009e4f : 9e4f: 25 53 20 20 4d 33 31 30 20 49 25 75 20 52 25 2e %S M310 I%u R%. 9e5f: 32 66 0a 00 2f.. 00009e63 : 9e63: 54 68 65 72 6d 61 6c 20 4d 6f 64 65 6c 20 73 65 Thermal Model se 9e73: 74 74 69 6e 67 73 3a 00 ttings:. 00009e7b : 9e7b: 00 00 a4 41 33 33 93 41 9a 99 85 41 33 33 73 41 ...A33.A...A33sA 9e8b: 9a 99 61 41 cd cc 54 41 33 33 4b 41 9a 99 41 41 ..aA..TA33KA..AA 9e9b: 33 33 3b 41 cd cc 34 41 00 00 30 41 cd cc 2c 41 33;A..4A..0A..,A 9eab: 9a 99 29 41 66 66 26 41 33 33 23 41 9a 99 21 41 ..)Aff&A33#A..!A 00009ebb : 9ebb: 45 2d 6d 6f 74 6f 72 20 63 75 72 72 65 6e 74 20 E-motor current 9ecb: 73 63 61 6c 69 6e 67 20 65 6e 61 62 6c 65 64 00 scaling enabled. 00009edb : 9edb: 01 08 08 01 0a 0a 01 14 14 01 12 12 ............ 00009ee7 : 9ee7: 74 6d 63 32 31 33 30 5f 68 6f 6d 65 5f 65 6e 74 tmc2130_home_ent 9ef7: 65 72 28 61 78 65 73 5f 6d 61 73 6b 3d 30 78 25 er(axes_mask=0x% 9f07: 30 32 78 29 0a 00 02x).. 00009f0d : 9f0d: 74 6d 63 32 31 33 30 5f 68 6f 6d 65 5f 65 78 69 tmc2130_home_exi 9f1d: 74 20 74 6d 63 32 31 33 30 5f 73 67 5f 68 6f 6d t tmc2130_sg_hom 9f2d: 69 6e 67 5f 61 78 65 73 5f 6d 61 73 6b 3d 30 78 ing_axes_mask=0x 9f3d: 25 30 32 78 0a 00 %02x.. 00009f43 : 9f43: 72 65 73 75 6c 74 20 76 61 6c 75 65 3a 20 25 64 result value: %d 9f53: 0a 00 .. 00009f55 : 9f55: 20 69 3d 25 32 64 20 63 6e 74 3d 25 32 64 20 76 i=%2d cnt=%2d v 9f65: 61 6c 3d 25 32 64 0a 00 al=%2d.. 00009f6d : 9f6d: 63 6c 75 73 74 65 72 73 3a 00 clusters:. 00009f77 : 9f77: 20 69 3d 25 32 64 20 73 74 65 70 3d 25 32 64 0a i=%2d step=%2d. ... 00009f88 : 9f88: 73 6f 72 74 65 64 20 73 61 6d 70 6c 65 73 3a 00 sorted samples:. 00009f98 <__vector_51::__c>: 9f98: 55 53 41 52 54 32 20 72 78 20 46 75 6c 6c 21 21 USART2 rx Full!! 9fa8: 21 00 !. 00009faa : 9faa: 3a 20 00 : . 00009fad : 9fad: 25 2d 31 32 2e 31 32 53 25 2d 64 2f 36 00 %-12.12S%-d/6. 00009fbb : 9fbb: 25 33 64 2f 25 2d 33 64 00 %3d/%-3d. 00009fc4 : 9fc4: 20 3a 20 00 : . 00009fc8 : 9fc8: 25 33 53 00 %3S. 00009fcc : 9fcc: 25 2d 37 73 00 %-7s. 00009fd1 : 9fd1: 25 2d 31 35 2e 31 35 53 25 2d 35 64 0a 25 2d 31 %-15.15S%-5d.%-1 9fe1: 35 2e 31 35 53 25 2d 35 64 0a 00 5.15S%-5d.. 00009fec : 9fec: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d 9ffc: 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 00 . %-16.16S%-3d. 0000a00b : a00b: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d a01b: 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 0a 20 . %-16.16S%-3d. a02b: 25 2d 31 36 2e 31 36 53 25 2d 33 64 00 %-16.16S%-3d. 0000a038 : a038: 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 %S. %-16.16S%-3d a048: 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 0a 20 . %-16.16S%-3d. a058: 25 2d 37 2e 37 53 58 20 25 2d 33 64 20 20 59 20 %-7.7SX %-3d Y a068: 25 2d 33 64 00 %-3d. 0000a06d : a06d: 20 25 73 25 33 64 81 20 0a 00 %s%3d. .. 0000a077 : a077: 20 50 57 52 3a 20 20 20 20 20 20 25 34 2e 31 66 PWR: %4.1f a087: 56 0a 20 42 45 44 3a 20 20 20 20 20 20 25 34 2e V. BED: %4. a097: 31 66 56 00 1fV. 0000a09b : a09b: 25 53 0a 20 58 20 25 64 0a 20 59 20 25 64 00 %S. X %d. Y %d. 0000a0aa : a0aa: 25 75 2e 25 75 2e 25 75 2e 25 75 00 %u.%u.%u.%u. 0000a0b6 <_ZZL16lcd_support_menuvE3__c__15_>: a0b6: 20 00 . 0000a0b8 <_ZZL16lcd_support_menuvE3__c__14_>: a0b8: 20 00 . 0000a0ba <_ZZL16lcd_support_menuvE3__c__13_>: a0ba: 46 6c 61 73 68 41 69 72 20 49 50 20 41 64 64 72 FlashAir IP Addr a0ca: 3a 00 :. 0000a0cc <_ZZL16lcd_support_menuvE3__c__12_>: a0cc: 4d 4d 55 20 20 20 20 20 20 20 20 4e 2f 41 00 MMU N/A. 0000a0db <_ZZL16lcd_support_menuvE3__c__11_>: a0db: 25 64 2e 25 64 2e 25 64 00 %d.%d.%d. 0000a0e4 <_ZZL16lcd_support_menuvE3__c__10_>: a0e4: 20 46 57 3a 00 FW:. 0000a0e9 : a0e9: 32 30 32 35 2d 30 34 2d 32 32 00 2025-04-22. 0000a0f4 : a0f4: 45 33 44 76 36 66 75 6c 6c 00 E3Dv6full. 0000a0fe : a0fe: 45 49 4e 53 79 5f 31 30 61 00 EINSy_10a. 0000a108 : a108: 31 5f 37 35 6d 6d 5f 4d 4b 33 00 1_75mm_MK3. 0000a113 : a113: 20 48 61 73 68 3a 37 37 33 31 30 32 34 65 64 00 Hash:7731024ed. 0000a123 : a123: 20 52 65 70 6f 3a 70 72 75 73 61 33 64 00 Repo:prusa3d. 0000a131 : a131: 20 33 2e 31 34 2e 31 2d 38 32 37 39 00 3.14.1-8279. 0000a13e : a13e: 46 69 72 6d 77 61 72 65 3a 00 Firmware:. 0000a148 : a148: 3e 00 >. 0000a14a <_ZZ24lcd_generic_preheat_menuvE3__c__20_>: a14a: 46 4c 45 58 20 2d 20 20 32 34 30 2f 35 30 00 FLEX - 240/50. 0000a159 <_ZZ24lcd_generic_preheat_menuvE3__c__19_>: a159: 46 4c 45 58 20 2d 20 20 32 34 30 00 FLEX - 240. 0000a165 <_ZZ24lcd_generic_preheat_menuvE3__c__18_>: a165: 50 50 20 20 20 2d 20 20 32 35 34 2f 31 30 30 00 PP - 254/100. 0000a175 <_ZZ24lcd_generic_preheat_menuvE3__c__17_>: a175: 50 50 20 20 20 2d 20 20 32 35 34 00 PP - 254. 0000a181 <_ZZ24lcd_generic_preheat_menuvE3__c__16_>: a181: 48 49 50 53 20 2d 20 20 32 32 30 2f 31 30 30 00 HIPS - 220/100. 0000a191 <_ZZ24lcd_generic_preheat_menuvE3__c__15_>: a191: 48 49 50 53 20 2d 20 20 32 32 30 00 HIPS - 220. 0000a19d <_ZZ24lcd_generic_preheat_menuvE3__c__14_>: a19d: 41 42 53 20 20 2d 20 20 32 35 35 2f 31 30 30 00 ABS - 255/100. 0000a1ad <_ZZ24lcd_generic_preheat_menuvE3__c__13_>: a1ad: 41 42 53 20 20 2d 20 20 32 35 35 00 ABS - 255. 0000a1b9 <_ZZ24lcd_generic_preheat_menuvE3__c__12_>: a1b9: 50 41 20 20 20 2d 20 20 32 37 35 2f 39 30 00 PA - 275/90. 0000a1c8 <_ZZ24lcd_generic_preheat_menuvE3__c__11_>: a1c8: 50 41 20 20 20 2d 20 20 32 37 35 00 PA - 275. 0000a1d4 <_ZZ24lcd_generic_preheat_menuvE3__c__10_>: a1d4: 50 56 42 20 20 2d 20 20 32 31 35 2f 37 35 00 PVB - 215/75. 0000a1e3 : a1e3: 50 56 42 20 20 2d 20 20 32 31 35 00 PVB - 215. 0000a1ef : a1ef: 50 43 20 20 20 2d 20 20 32 37 35 2f 31 31 30 00 PC - 275/110. 0000a1ff : a1ff: 50 43 20 20 20 2d 20 20 32 37 35 00 PC - 275. 0000a20b : a20b: 41 53 41 20 20 2d 20 20 32 36 30 2f 31 30 35 00 ASA - 260/105. 0000a21b : a21b: 41 53 41 20 20 2d 20 20 32 36 30 00 ASA - 260. 0000a227 : a227: 50 45 54 20 20 2d 20 20 32 33 30 2f 38 35 00 PET - 230/85. 0000a236 : a236: 50 45 54 20 20 2d 20 20 32 33 30 00 PET - 230. 0000a242 : a242: 50 4c 41 20 20 2d 20 20 32 31 35 2f 36 30 00 PLA - 215/60. 0000a251 : a251: 50 4c 41 20 20 2d 20 20 32 31 35 00 PLA - 215. 0000a25d : a25d: 25 2d 31 32 2e 31 32 53 25 2b 38 2e 31 66 00 %-12.12S%+8.1f. 0000a26c : a26c: 45 78 74 72 75 64 65 72 3a 00 Extruder:. 0000a276 : a276: 25 63 25 31 37 2e 32 66 6d 6d 00 %c%17.2fmm. 0000a281 : a281: 58 3a 00 X:. 0000a284 : a284: 59 3a 00 Y:. 0000a287 : a287: 5a 3a 00 Z:. 0000a28a : a28a: 25 63 25 2d 31 33 2e 31 33 53 25 2b 35 2e 33 66 %c%-13.13S%+5.3f ... 0000a29b : a29b: 25 33 75 00 %3u. 0000a29f : a29f: 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f PINDA calibratio a2af: 6e 20 66 61 69 6c 65 64 2e 20 43 6f 6e 74 69 6e n failed. Contin a2bf: 75 65 20 77 69 74 68 20 70 72 65 73 73 69 6e 67 ue with pressing a2cf: 20 74 68 65 20 6b 6e 6f 62 2e 00 the knob.. 0000a2da : a2da: 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f PINDA calibratio a2ea: 6e 20 64 6f 6e 65 2e 20 43 6f 6e 74 69 6e 75 65 n done. Continue a2fa: 20 77 69 74 68 20 70 72 65 73 73 69 6e 67 20 74 with pressing t a30a: 68 65 20 6b 6e 6f 62 2e 00 he knob.. 0000a313 : a313: 10 00 c9 02 10 01 2c 01 40 01 22 01 70 01 18 01 ......,.@.".p... a323: b0 01 0e 01 f0 01 04 01 50 02 fa 00 b0 02 f0 00 ........P....... a333: 30 03 e6 00 d0 03 dc 00 90 04 d2 00 70 05 c8 00 0...........p... a343: a0 06 be 00 00 08 b4 00 b0 09 aa 00 d0 0b a0 00 ................ a353: 60 0e 96 00 60 11 8c 00 00 15 82 00 20 19 78 00 `...`....... .x. a363: c0 1d 6e 00 a0 22 64 00 b0 27 5a 00 90 2c 50 00 ..n.."d..'Z..,P. a373: 00 31 46 00 e0 34 3c 00 10 38 32 00 90 3a 28 00 .1F..4<..82..:(. a383: 60 3c 1e 00 a0 3d 14 00 80 3e 0a 00 20 3f 00 00 `<...=...>.. ?.. 0000a393 : a393: 4d 65 61 73 75 72 65 20 63 65 6e 74 65 72 20 20 Measure center ... 0000a3a4 : a3a4: 78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 65 xyzcal_measure_e a3b4: 6e 74 65 72 0a 00 nter.. 0000a3ba : a3ba: 78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 38 20 63 xyzcal_spiral8 c a3ca: 78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64 x=%d cy=%d z0=%d a3da: 20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64 dz=%d radius=%d a3ea: 20 61 64 3d 25 64 0a 00 ad=%d.. 0000a3f2 : a3f2: 78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 6e xyzcal_searchZ n a402: 6f 20 73 69 67 6e 61 6c 0a 20 78 3d 25 6c 64 20 o signal. x=%ld a412: 79 3d 25 6c 64 20 7a 3d 25 6c 64 0a 00 y=%ld z=%ld.. 0000a41f : a41f: 20 4f 4e 2d 53 49 47 4e 41 4c 20 61 74 20 78 3d ON-SIGNAL at x= a42f: 25 64 20 79 3d 25 64 20 7a 3d 25 64 20 61 64 3d %d y=%d z=%d ad= a43f: 25 64 0a 00 %d.. 0000a443 : a443: 78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 78 xyzcal_searchZ x a453: 3d 25 6c 64 20 79 3d 25 6c 64 20 7a 3d 25 6c 64 =%ld y=%ld z=%ld a463: 0a 00 .. 0000a465 : a465: 25 30 32 78 00 %02x. 0000a46a : a46a: 20 5b 25 66 20 25 66 5d 20 6d 6d 20 70 61 74 74 [%f %f] mm patt a47a: 65 72 6e 20 63 65 6e 74 65 72 0a 00 ern center.. 0000a486 : a486: 20 5b 25 66 20 25 66 5d 5b 25 66 5d 20 6d 6d 20 [%f %f][%f] mm a496: 64 69 76 65 72 67 65 6e 63 65 0a 00 divergence.. 0000a4a2 : a4a2: 00 00 f0 00 f8 01 fc 03 fe 07 fe 07 fe 07 fe 07 ................ a4b2: fc 03 f8 01 f0 00 00 00 ........ 0000a4ba : a4ba: 00 00 00 00 f0 00 f8 01 fc 03 fc 03 fc 03 fc 03 ................ a4ca: f8 01 f0 00 00 00 00 00 ........ 0000a4d2 : a4d2: 78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 6c xyzcal_measure_l a4e2: 65 61 76 65 0a 00 eave.. 0000a4e8 : a4e8: 20 3c 20 00 < . 0000a4ec : a4ec: 57 41 52 4e 49 4e 47 3a 20 46 72 6f 6e 74 20 70 WARNING: Front p a4fc: 6f 69 6e 74 20 6e 6f 74 20 72 65 61 63 68 61 62 oint not reachab a50c: 6c 65 2e 20 59 20 63 6f 6f 72 64 69 6e 61 74 65 le. Y coordinate a51c: 3a 00 :. 0000a51e : ... 0000a51f : a51f: 00 00 40 41 00 00 c0 40 00 00 5c 43 00 00 c0 40 ..@A...@..\C...@ a52f: 00 00 5c 43 00 00 46 43 00 00 40 41 00 00 46 43 ..\C..FC..@A..FC 0000a53f : a53f: 25 64 2f 34 00 %d/4. 0000a544 : a544: 49 74 65 72 61 74 69 6f 6e 3a 20 00 Iteration: . 0000a550 : a550: 43 61 6c 69 62 72 61 74 69 6f 6e 20 66 61 69 6c Calibration fail a560: 65 64 21 20 43 68 65 63 6b 20 74 68 65 20 61 78 ed! Check the ax a570: 65 73 20 61 6e 64 20 72 75 6e 20 61 67 61 69 6e es and run again a580: 2e 00 .. 0000a582 : a582: 78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 32 20 63 xyzcal_spiral2 c a592: 78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64 x=%d cy=%d z0=%d a5a2: 20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64 dz=%d radius=%d a5b2: 20 61 64 3d 25 64 0a 00 ad=%d.. 0000a5ba : a5ba: 0a 00 .. 0000a5bc : a5bc: 43 6f 75 6e 74 64 6f 77 6e 3a 20 25 64 20 00 Countdown: %d . 0000a5cb : a5cb: 25 64 0a 00 %d.. 0000a5cf : a5cf: 53 63 61 6e 20 63 6f 75 6e 74 64 6f 77 6e 3a 20 Scan countdown: ... 0000a5e0 : a5e0: 50 61 74 74 65 72 6e 20 63 65 6e 74 65 72 20 5b Pattern center [ a5f0: 25 66 20 25 66 5d 2c 20 6d 61 74 63 68 20 25 66 %f %f], match %f a600: 25 25 0a 00 %%.. 0000a604 : a604: 20 5b 25 66 2c 20 25 66 5d 5b 25 66 5d 20 66 69 [%f, %f][%f] fi a614: 6e 61 6c 20 63 69 72 63 6c 65 0a 00 nal circle.. 0000a620 : a620: 74 6d 63 32 31 33 30 5f 67 6f 74 6f 5f 73 74 65 tmc2130_goto_ste a630: 70 20 25 64 20 25 64 20 25 64 20 25 64 20 0a 00 p %d %d %d %d .. 0000a640 <_ZL16ramming_sequence.lto_priv.401>: a640: e0 2d 90 3e 89 88 b2 41 11 36 9c 3e 77 77 c1 41 .-.>...A.6.>ww.A a650: 29 cb b0 3e ef ee da 41 ba 49 cc 3e ef ee fc 41 )..>...A.I.>...A a660: 61 c3 f3 3e ef ee 16 42 9c a2 13 3f cd cc 36 42 a..>...B...?..6B a670: 8a b0 11 3f ab aa 56 42 88 63 dd 3d ab aa 56 42 ...?..VB.c.=..VB a680: b8 af 43 3f 55 55 72 42 18 26 53 3f 33 b3 82 42 ..C?UUrB.&S?3..B a690: 30 2a 59 3f ef 6e 86 42 00 00 70 c1 00 00 c8 42 0*Y?.n.B..p....B a6a0: 00 00 c4 c1 00 00 a0 41 00 00 e0 c0 00 00 20 41 .......A...... A a6b0: 00 00 60 c0 00 00 c0 40 00 00 a0 41 22 22 f2 40 ..`....@...A"".@ a6c0: 00 00 a0 c1 9a 99 a1 40 00 00 0c c2 55 55 05 42 .......@....UU.B 0000a6d0 <_ZZN4MMU213ProtocolLogic18ResetRetryAttemptsEvE3__c.lto_priv.399>: a6d0: 52 65 73 65 74 52 65 74 72 79 41 74 74 65 6d 70 ResetRetryAttemp a6e0: 74 73 00 ts. 0000a6e3 : a6e3: 43 6f 6f 6c 69 6e 67 20 74 69 6d 65 72 20 73 74 Cooling timer st a6f3: 6f 70 70 65 64 00 opped. 0000a6f9 : a6f9: 48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 00 Heater cooldown. 0000a709 : a709: 43 6f 6f 6c 69 6e 67 20 54 69 6d 65 6f 75 74 20 Cooling Timeout a719: 73 74 61 72 74 65 64 00 started. 0000a721 : a721: 53 61 76 69 6e 67 20 61 6e 64 20 70 61 72 6b 69 Saving and parki a731: 6e 67 00 ng. 0000a734 : a734: 48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 20 Heater cooldown a744: 70 65 6e 64 69 6e 67 00 pending. 0000a74c : a74c: 52 65 73 75 6d 69 6e 67 20 58 59 5a 00 Resuming XYZ. 0000a759 : a759: 4d 4d 55 32 74 6f 6f 6c 3d 00 MMU2tool=. 0000a763 <_ZL9mmu2Magic.lto_priv.374>: a763: 4d 4d 55 32 3a 00 MMU2:. 0000a769 : a769: 57 72 69 74 69 6e 67 20 74 6f 20 66 69 6c 65 3a Writing to file: a779: 20 00 . 0000a77b : a77b: 46 69 6c 65 20 61 6c 72 65 61 64 79 20 6f 70 65 File already ope a78b: 6e 65 64 00 ned. 0000a78f : a78f: 87 53 76 53 62 53 4d 53 37 53 24 53 0e 53 fa 52 .SvSbSMS7S$S.S.R a79f: e9 52 d3 52 62 53 76 53 bf 52 b0 52 9c 52 8b 52 .R.RbSvS.R.R.R.R a7af: 76 52 af 5b 60 52 4e 52 3b 52 2a 52 15 52 02 52 vR.[`RNR;R*R.R.R a7bf: ee 51 d9 51 d0 51 be 51 a9 51 .Q.Q.Q.Q.Q 0000a7c9 : a7c9: 4d 36 30 30 20 41 55 54 4f 00 M600 AUTO. 0000a7d3 : a7d3: 46 49 4e 44 41 20 66 69 6c 61 6d 65 6e 74 20 72 FINDA filament r a7e3: 75 6e 6f 75 74 21 00 unout!. 0000a7ea : a7ea: 43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 74 69 Communication ti a7fa: 6d 65 6f 75 74 00 meout. 0000a800 : a800: 50 72 6f 74 6f 63 6f 6c 20 45 72 72 6f 72 00 Protocol Error. 0000a80f : a80f: 03 00 03 ... 0000a812 : a812: 56 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 Version mismatch ... 0000a823 : a823: 43 6f 6d 6d 61 6e 64 20 45 72 72 6f 72 00 Command Error. 0000a831 : a831: 43 6f 6d 6d 61 6e 64 20 72 65 6a 65 63 74 65 64 Command rejected ... 0000a842 : a842: 4d 4d 55 20 42 75 74 74 6f 6e 20 70 75 73 68 65 MMU Button pushe a852: 64 00 d. 0000a854 : a854: 52 65 74 72 79 42 75 74 74 6f 6e 50 72 65 73 73 RetryButtonPress a864: 65 64 00 ed. 0000a867 <_ZN4MMU2L11errorTitlesE.lto_priv.494>: a867: e4 55 cf 55 b8 55 a3 55 8e 55 7a 55 6a 55 53 55 .U.U.U.U.UzUjUSU a877: 3c 55 25 55 11 55 fd 54 e7 54 e7 54 e7 54 d2 54 : a8c1: 42 75 74 74 6f 6e 00 Button. 0000a8c8 : a8c8: 43 68 65 63 6b 55 73 65 72 49 6e 70 75 74 2d 62 CheckUserInput-b a8d8: 74 6e 4c 4d 52 20 00 tnLMR . 0000a8df <_ZZN4MMU231ReportErrorHookSensorLineRenderEvE3__c.lto_priv.493>: a8df: 46 49 3a 20 20 46 53 3a 20 20 20 20 3e 20 20 82 FI: FS: > . a8ef: 20 20 20 81 00 .. 0000a8f4 : a8f4: 48 6f 74 65 6e 64 20 74 65 6d 70 65 72 61 74 75 Hotend temperatu a904: 72 65 20 72 65 61 63 68 65 64 00 re reached. 0000a90f : a90f: 52 65 73 75 6d 69 6e 67 20 54 65 6d 70 00 Resuming Temp. 0000a91d : a91d: 43 6f 6f 6c 64 6f 77 6e 20 66 6c 61 67 20 63 6c Cooldown flag cl a92d: 65 61 72 65 64 00 eared. 0000a933 : a933: 20 57 3a 00 W:. 0000a937 : a937: 20 45 3a 00 E:. 0000a93b : a93b: 54 3a 00 T:. 0000a93e : a93e: 4e 6f 20 30 78 46 46 20 72 65 63 65 69 76 65 64 No 0xFF received ... 0000a94f : a94f: 53 65 6e 64 69 6e 67 20 30 78 46 46 00 Sending 0xFF. 0000a95c : a95c: 46 69 6c 65 20 73 65 6c 65 63 74 65 64 00 File selected. 0000a96a : a96a: 20 53 69 7a 65 3a 20 00 Size: . 0000a972 : a972: 46 69 6c 65 20 6f 70 65 6e 65 64 3a 20 00 File opened: . 0000a980 : a980: 4e 6f 77 20 66 72 65 73 68 20 66 69 6c 65 3a 20 Now fresh file: ... 0000a991 : a991: 4e 6f 77 20 64 6f 69 6e 67 20 66 69 6c 65 3a 20 Now doing file: ... 0000a9a2 : a9a2: 22 20 70 6f 73 00 " pos. 0000a9a8 : a9a8: 22 20 70 61 72 65 6e 74 3a 22 00 " parent:". 0000a9b3 : a9b3: 53 55 42 52 4f 55 54 49 4e 45 20 43 41 4c 4c 20 SUBROUTINE CALL a9c3: 74 61 72 67 65 74 3a 22 00 target:". 0000a9cc : a9cc: 74 72 79 69 6e 67 20 74 6f 20 63 61 6c 6c 20 73 trying to call s a9dc: 75 62 2d 67 63 6f 64 65 20 66 69 6c 65 73 20 77 ub-gcode files w a9ec: 69 74 68 20 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 ith too many lev a9fc: 65 6c 73 2e 00 els.. 0000aa01 : aa01: 06 28 33 d0 36 c2 3e 01 3f 15 41 32 42 3b 43 f2 .(3.6.>.?.A2B;C. aa11: 44 3b 45 f2 46 22 47 3b 48 f2 49 3b 4a f0 58 98 D;E.F"G;H.I;J.X. aa21: 59 0c 5a 08 5b 0c 5c 08 61 10 67 9b 6e 22 71 07 Y.Z.[.\.a.g.n"q. aa31: 72 08 ff r.. 0000aa34 : aa34: 09 5a 0d 00 0e f0 19 14 5e 08 20 64 2b 6d 32 2f .Z......^. d+m2/ aa44: ff . 0000aa45 : aa45: 20 22 25 73 22 00 "%s". 0000aa4b : aa4b: 20 25 23 6c 78 00 %#lx. 0000aa51 : aa51: 44 49 52 5f 45 58 49 54 00 DIR_EXIT. 0000aa5a : aa5a: 44 49 52 5f 45 4e 54 45 52 3a 20 25 73 20 22 25 DIR_ENTER: %s "% aa6a: 73 22 0a 00 s".. 0000aa6e : aa6e: 61 75 74 6f 25 69 2e 67 00 auto%i.g. 0000aa77 : aa77: 04 1a .. 0000aa79 : aa79: 44 65 63 72 65 6d 65 6e 74 52 65 74 72 79 41 74 DecrementRetryAt aa89: 74 65 6d 70 74 73 00 tempts. 0000aa90 : aa90: 08 1b 1c ... 0000aa93 : aa93: 0b 14 .. 0000aa95 <_ZZN4MMU213ProtocolLogic33ResetCommunicationTimeoutAttemptsEvE3__c.lto_priv.400>: aa95: 52 53 54 43 6f 6d 6d 54 69 6d 65 6f 75 74 00 RSTCommTimeout. 0000aaa4 : aaa4: 2c 20 6c 61 73 74 20 62 79 74 65 73 3a 20 00 , last bytes: . 0000aab3 <_ZL10bufferFull.lto_priv.554>: aab3: 22 20 66 61 69 6c 65 64 3a 20 42 75 66 66 65 72 " failed: Buffer aac3: 20 66 75 6c 6c 21 00 full!. 0000aaca : aaca: 45 72 72 6f 72 3a 00 Error:. 0000aad1 : aad1: 22 00 ". 0000aad3 : aad3: 45 6e 71 75 65 69 6e 67 20 74 6f 20 74 68 65 20 Enqueing to the aae3: 66 72 6f 6e 74 3a 20 22 00 front: ". 0000aaec <_ZL9mmu2Magic.lto_priv.375>: aaec: 4d 4d 55 32 3a 00 MMU2:. 0000aaf2 : aaf2: 65 63 68 6f 3a 00 echo:. 0000aaf8 : aaf8: 3e 53 30 2a 63 36 2e 00 >S0*c6.. 0000ab00 : ab00: 4d 4d 55 20 69 73 20 00 MMU is . 0000ab08 : ab08: 25 2e 31 30 53 20 00 %.10S . 0000ab0f : ab0f: 25 34 64 00 %4d. 0000ab13 : ab13: 45 78 72 65 6d 65 20 73 70 61 6e 20 6f 66 20 74 Exreme span of t ab23: 68 65 20 5a 20 76 61 6c 75 65 73 21 00 he Z values!. 0000ab30 : ab30: 25 64 2f 39 00 %d/9. 0000ab35 : ab35: 4d 4d 55 32 3a 00 MMU2:. 0000ab3b : ab3b: 25 33 64 00 %3d. 0000ab3f : ab3f: 18 01 04 19 02 0a ...... 0000ab45 : ab45: 34 63 be 62 44 62 d7 61 8e 61 fc 60 84 60 1c 60 4c.bDb.a.a.`.`.` ab55: cd 5f ad 5f 61 5f ad 5f 4a 5f 4a 5f 4a 5f 4a 5f ._._a_._J_J_J_J_ ab65: 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f J_J_J_J_J_J_J_J_ ab75: 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f 4a 5f J_J_J_J_J_J_J_J_ ab85: 4a 5f 4a 5f 13 5f d2 5e 88 5e 15 5e e0 5d 96 5d J_J_._.^.^.^.].] ab95: 4c 5d ee 5c b5 5c 73 5c 56 5c L].\.\s\V\ 0000ab9f : ab9f: 01 01 01 01 01 01 01 02 71 01 71 01 32 32 32 03 ........q.q.222. abaf: 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 ................ abbf: 03 03 93 93 24 38 03 93 03 01 02 56 03 ....$8.....V. 0000abcc : abcc: 65 00 66 00 67 00 68 00 69 00 6a 00 6b 00 6c 00 e.f.g.h.i.j.k.l. abdc: 73 00 74 00 7d 00 7e 00 c9 00 d3 00 dd 00 ca 00 s.t.}.~......... abec: d4 00 de 00 2d 01 37 01 41 01 2e 01 38 01 42 01 ....-.7.A...8.B. abfc: 2f 01 39 01 43 01 30 01 3a 01 44 01 31 01 3b 01 /.9.C.0.:.D.1.;. ac0c: 45 01 32 01 91 01 92 01 f5 01 f6 01 f7 01 f8 01 E.2............. ac1c: f9 01 fa 01 fb 01 fc 01 84 03 .......... 0000ac26 : ac26: c1 63 2a 64 b6 63 ad 63 a6 63 b2 4f e7 46 9f 63 .c*d.c.c.c.O.F.c ac36: 95 63 .c 0000ac38 : ac38: 25 2e 32 30 53 0a 70 72 75 73 61 2e 69 6f 2f 30 %.20S.prusa.io/0 ac48: 34 25 68 75 00 4%hu. 0000ac4d : ac4d: 20 55 70 67 72 61 64 69 6e 67 20 78 66 6c 61 73 Upgrading xflas ac5d: 68 0a 20 44 6f 20 6e 6f 74 20 64 69 73 63 6f 6e h. Do not discon ac6d: 6e 65 63 74 21 00 nect!. 0000ac73 : ac73: 77 32 35 78 32 30 63 6c 5f 63 66 6d 0a 00 w25x20cl_cfm.. 0000ac81 : ac81: 77 32 35 78 32 30 63 6c 5f 65 6e 74 65 72 0a 00 w25x20cl_enter.. 0000ac91 : ac91: 73 74 61 72 74 0a 00 start.. 0000ac98 <__ctors_start>: ac98: e8 38 cpi r30, 0x88 ; 136 0000ac9a <__ctors_end>: ac9a: 0d 64 ori r16, 0x4D ; 77 0000ac9c <__dtors_end>: ac9c: 11 24 eor r1, r1 ac9e: 1f be out 0x3f, r1 ; 63 aca0: cf ef ldi r28, 0xFF ; 255 aca2: d1 e2 ldi r29, 0x21 ; 33 aca4: de bf out 0x3e, r29 ; 62 aca6: cd bf out 0x3d, r28 ; 61 aca8: 00 e0 ldi r16, 0x00 ; 0 acaa: 0c bf out 0x3c, r16 ; 60 0000acac <__do_copy_data>: acac: 13 e0 ldi r17, 0x03 ; 3 acae: a0 e0 ldi r26, 0x00 ; 0 acb0: b2 e0 ldi r27, 0x02 ; 2 acb2: e8 eb ldi r30, 0xB8 ; 184 acb4: f5 ec ldi r31, 0xC5 ; 197 acb6: 03 e0 ldi r16, 0x03 ; 3 acb8: 0b bf out 0x3b, r16 ; 59 acba: 02 c0 rjmp .+4 ; 0xacc0 <__do_copy_data+0x14> acbc: 07 90 elpm r0, Z+ acbe: 0d 92 st X+, r0 acc0: a2 32 cpi r26, 0x22 ; 34 acc2: b1 07 cpc r27, r17 acc4: d9 f7 brne .-10 ; 0xacbc <__do_copy_data+0x10> 0000acc6 <__do_clear_bss>: acc6: 28 e1 ldi r18, 0x18 ; 24 acc8: a2 e2 ldi r26, 0x22 ; 34 acca: b3 e0 ldi r27, 0x03 ; 3 accc: 01 c0 rjmp .+2 ; 0xacd0 <.do_clear_bss_start> 0000acce <.do_clear_bss_loop>: acce: 1d 92 st X+, r1 0000acd0 <.do_clear_bss_start>: acd0: af 31 cpi r26, 0x1F ; 31 acd2: b2 07 cpc r27, r18 acd4: e1 f7 brne .-8 ; 0xacce <.do_clear_bss_loop> 0000acd6 <__do_global_ctors>: acd6: 16 e5 ldi r17, 0x56 ; 86 acd8: cd e4 ldi r28, 0x4D ; 77 acda: d6 e5 ldi r29, 0x56 ; 86 acdc: 00 e0 ldi r16, 0x00 ; 0 acde: 06 c0 rjmp .+12 ; 0xacec <__do_global_ctors+0x16> ace0: 21 97 sbiw r28, 0x01 ; 1 ace2: 01 09 sbc r16, r1 ace4: 80 2f mov r24, r16 ace6: fe 01 movw r30, r28 ace8: 0f 94 20 dd call 0x3ba40 ; 0x3ba40 <__tablejump2__> acec: cc 34 cpi r28, 0x4C ; 76 acee: d1 07 cpc r29, r17 acf0: 80 e0 ldi r24, 0x00 ; 0 acf2: 08 07 cpc r16, r24 acf4: a9 f7 brne .-22 ; 0xace0 <__do_global_ctors+0xa> acf6: 0e 94 49 fb call 0x1f692 ; 0x1f692
acfa: 0d 94 ca e2 jmp 0x3c594 ; 0x3c594 <__do_global_dtors> 0000acfe <__bad_interrupt>: acfe: 0c 94 03 67 jmp 0xce06 ; 0xce06 <__vector_default> 0000ad02 : ad02: 2f 92 push r2 ad04: 3f 92 push r3 ad06: 4f 92 push r4 ad08: 5f 92 push r5 ad0a: 6f 92 push r6 ad0c: 7f 92 push r7 ad0e: 8f 92 push r8 ad10: 9f 92 push r9 ad12: af 92 push r10 ad14: bf 92 push r11 ad16: cf 92 push r12 ad18: df 92 push r13 ad1a: ef 92 push r14 ad1c: ff 92 push r15 ad1e: 0f 93 push r16 ad20: 1f 93 push r17 ad22: cf 93 push r28 ad24: df 93 push r29 ad26: cd b7 in r28, 0x3d ; 61 ad28: de b7 in r29, 0x3e ; 62 ad2a: 2f 97 sbiw r28, 0x0f ; 15 ad2c: 0f b6 in r0, 0x3f ; 63 ad2e: f8 94 cli ad30: de bf out 0x3e, r29 ; 62 ad32: 0f be out 0x3f, r0 ; 63 ad34: cd bf out 0x3d, r28 ; 61 ad36: 6c 01 movw r12, r24 ad38: 1b 01 movw r2, r22 ad3a: 5a 01 movw r10, r20 ad3c: fc 01 movw r30, r24 ad3e: 17 82 std Z+7, r1 ; 0x07 ad40: 16 82 std Z+6, r1 ; 0x06 ad42: 83 81 ldd r24, Z+3 ; 0x03 ad44: 9e 01 movw r18, r28 ad46: 2f 5f subi r18, 0xFF ; 255 ad48: 3f 4f sbci r19, 0xFF ; 255 ad4a: 49 01 movw r8, r18 ad4c: 81 fd sbrc r24, 1 ad4e: d2 c0 rjmp .+420 ; 0xaef4 ad50: 8f ef ldi r24, 0xFF ; 255 ad52: 9f ef ldi r25, 0xFF ; 255 ad54: ee c2 rjmp .+1500 ; 0xb332 ad56: f1 2c mov r15, r1 ad58: 51 2c mov r5, r1 ad5a: 00 e0 ldi r16, 0x00 ; 0 ad5c: 00 32 cpi r16, 0x20 ; 32 ad5e: 38 f4 brcc .+14 ; 0xad6e ad60: 8b 32 cpi r24, 0x2B ; 43 ad62: 09 f1 breq .+66 ; 0xada6 ad64: 90 f4 brcc .+36 ; 0xad8a ad66: 80 32 cpi r24, 0x20 ; 32 ad68: f9 f0 breq .+62 ; 0xada8 ad6a: 83 32 cpi r24, 0x23 ; 35 ad6c: 09 f1 breq .+66 ; 0xadb0 ad6e: 07 fd sbrc r16, 7 ad70: 34 c0 rjmp .+104 ; 0xadda ad72: 20 ed ldi r18, 0xD0 ; 208 ad74: 28 0f add r18, r24 ad76: 2a 30 cpi r18, 0x0A ; 10 ad78: 20 f5 brcc .+72 ; 0xadc2 ad7a: 06 ff sbrs r16, 6 ad7c: 1b c0 rjmp .+54 ; 0xadb4 ad7e: fa e0 ldi r31, 0x0A ; 10 ad80: ff 9e mul r15, r31 ad82: 20 0d add r18, r0 ad84: 11 24 eor r1, r1 ad86: f2 2e mov r15, r18 ad88: 05 c0 rjmp .+10 ; 0xad94 ad8a: 8d 32 cpi r24, 0x2D ; 45 ad8c: 79 f0 breq .+30 ; 0xadac ad8e: 80 33 cpi r24, 0x30 ; 48 ad90: 71 f7 brne .-36 ; 0xad6e ad92: 01 60 ori r16, 0x01 ; 1 ad94: f1 01 movw r30, r2 ad96: 93 fd sbrc r25, 3 ad98: 85 91 lpm r24, Z+ ad9a: 93 ff sbrs r25, 3 ad9c: 81 91 ld r24, Z+ ad9e: 1f 01 movw r2, r30 ada0: 81 11 cpse r24, r1 ada2: dc cf rjmp .-72 ; 0xad5c ada4: 1a c0 rjmp .+52 ; 0xadda ada6: 02 60 ori r16, 0x02 ; 2 ada8: 04 60 ori r16, 0x04 ; 4 adaa: f4 cf rjmp .-24 ; 0xad94 adac: 08 60 ori r16, 0x08 ; 8 adae: f2 cf rjmp .-28 ; 0xad94 adb0: 00 61 ori r16, 0x10 ; 16 adb2: f0 cf rjmp .-32 ; 0xad94 adb4: 3a e0 ldi r19, 0x0A ; 10 adb6: 53 9e mul r5, r19 adb8: 20 0d add r18, r0 adba: 11 24 eor r1, r1 adbc: 52 2e mov r5, r18 adbe: 00 62 ori r16, 0x20 ; 32 adc0: e9 cf rjmp .-46 ; 0xad94 adc2: 8e 32 cpi r24, 0x2E ; 46 adc4: 21 f4 brne .+8 ; 0xadce adc6: 06 fd sbrc r16, 6 adc8: b1 c2 rjmp .+1378 ; 0xb32c adca: 00 64 ori r16, 0x40 ; 64 adcc: e3 cf rjmp .-58 ; 0xad94 adce: 8c 36 cpi r24, 0x6C ; 108 add0: 11 f4 brne .+4 ; 0xadd6 add2: 00 68 ori r16, 0x80 ; 128 add4: df cf rjmp .-66 ; 0xad94 add6: 88 36 cpi r24, 0x68 ; 104 add8: e9 f2 breq .-70 ; 0xad94 adda: 9b eb ldi r25, 0xBB ; 187 addc: 98 0f add r25, r24 adde: 93 30 cpi r25, 0x03 ; 3 ade0: 08 f0 brcs .+2 ; 0xade4 ade2: 5f c0 rjmp .+190 ; 0xaea2 ade4: 00 61 ori r16, 0x10 ; 16 ade6: 80 5e subi r24, 0xE0 ; 224 ade8: 06 fd sbrc r16, 6 adea: 02 c0 rjmp .+4 ; 0xadf0 adec: 46 e0 ldi r20, 0x06 ; 6 adee: f4 2e mov r15, r20 adf0: 10 2f mov r17, r16 adf2: 1f 73 andi r17, 0x3F ; 63 adf4: 85 36 cpi r24, 0x65 ; 101 adf6: 09 f0 breq .+2 ; 0xadfa adf8: 5b c0 rjmp .+182 ; 0xaeb0 adfa: 10 64 ori r17, 0x40 ; 64 adfc: 17 ff sbrs r17, 7 adfe: 61 c0 rjmp .+194 ; 0xaec2 ae00: 8f 2d mov r24, r15 ae02: 9b e3 ldi r25, 0x3B ; 59 ae04: 9f 15 cp r25, r15 ae06: 08 f4 brcc .+2 ; 0xae0a ae08: 8b e3 ldi r24, 0x3B ; 59 ae0a: 44 24 eor r4, r4 ae0c: 43 94 inc r4 ae0e: 48 0e add r4, r24 ae10: 27 e0 ldi r18, 0x07 ; 7 ae12: 35 01 movw r6, r10 ae14: f4 e0 ldi r31, 0x04 ; 4 ae16: 6f 0e add r6, r31 ae18: 71 1c adc r7, r1 ae1a: f5 01 movw r30, r10 ae1c: 60 81 ld r22, Z ae1e: 71 81 ldd r23, Z+1 ; 0x01 ae20: 82 81 ldd r24, Z+2 ; 0x02 ae22: 93 81 ldd r25, Z+3 ; 0x03 ae24: 04 2d mov r16, r4 ae26: a4 01 movw r20, r8 ae28: 0f 94 c9 d8 call 0x3b192 ; 0x3b192 <__ftoa_engine> ae2c: 5c 01 movw r10, r24 ae2e: f9 81 ldd r31, Y+1 ; 0x01 ae30: fc 87 std Y+12, r31 ; 0x0c ae32: f0 ff sbrs r31, 0 ae34: 03 c0 rjmp .+6 ; 0xae3c ae36: 0d e2 ldi r16, 0x2D ; 45 ae38: f3 ff sbrs r31, 3 ae3a: 07 c0 rjmp .+14 ; 0xae4a ae3c: 0b e2 ldi r16, 0x2B ; 43 ae3e: 11 fd sbrc r17, 1 ae40: 04 c0 rjmp .+8 ; 0xae4a ae42: 01 2f mov r16, r17 ae44: 04 70 andi r16, 0x04 ; 4 ae46: 12 fd sbrc r17, 2 ae48: 00 e2 ldi r16, 0x20 ; 32 ae4a: 2c 85 ldd r18, Y+12 ; 0x0c ae4c: 2c 70 andi r18, 0x0C ; 12 ae4e: e2 2e mov r14, r18 ae50: 09 f4 brne .+2 ; 0xae54 ae52: 6b c0 rjmp .+214 ; 0xaf2a ae54: 01 11 cpse r16, r1 ae56: d8 c2 rjmp .+1456 ; 0xb408 ae58: f3 e0 ldi r31, 0x03 ; 3 ae5a: e1 2c mov r14, r1 ae5c: f5 15 cp r31, r5 ae5e: a0 f4 brcc .+40 ; 0xae88 ae60: 83 e0 ldi r24, 0x03 ; 3 ae62: e5 2c mov r14, r5 ae64: e8 1a sub r14, r24 ae66: 13 fd sbrc r17, 3 ae68: 08 c0 rjmp .+16 ; 0xae7a ae6a: b6 01 movw r22, r12 ae6c: 80 e2 ldi r24, 0x20 ; 32 ae6e: 90 e0 ldi r25, 0x00 ; 0 ae70: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 ae74: ea 94 dec r14 ae76: e1 10 cpse r14, r1 ae78: f8 cf rjmp .-16 ; 0xae6a ae7a: 00 23 and r16, r16 ae7c: 29 f0 breq .+10 ; 0xae88 ae7e: b6 01 movw r22, r12 ae80: 80 2f mov r24, r16 ae82: 90 e0 ldi r25, 0x00 ; 0 ae84: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 ae88: 3c 85 ldd r19, Y+12 ; 0x0c ae8a: 2c ed ldi r18, 0xDC ; 220 ae8c: a2 2e mov r10, r18 ae8e: 25 e7 ldi r18, 0x75 ; 117 ae90: b2 2e mov r11, r18 ae92: 33 fd sbrc r19, 3 ae94: 04 c0 rjmp .+8 ; 0xae9e ae96: 90 ee ldi r25, 0xE0 ; 224 ae98: a9 2e mov r10, r25 ae9a: 95 e7 ldi r25, 0x75 ; 117 ae9c: b9 2e mov r11, r25 ae9e: 10 71 andi r17, 0x10 ; 16 aea0: 22 c0 rjmp .+68 ; 0xaee6 aea2: 9b e9 ldi r25, 0x9B ; 155 aea4: 98 0f add r25, r24 aea6: 93 30 cpi r25, 0x03 ; 3 aea8: 08 f0 brcs .+2 ; 0xaeac aeaa: 47 c1 rjmp .+654 ; 0xb13a aeac: 0f 7e andi r16, 0xEF ; 239 aeae: 9c cf rjmp .-200 ; 0xade8 aeb0: 86 36 cpi r24, 0x66 ; 102 aeb2: 11 f4 brne .+4 ; 0xaeb8 aeb4: 10 68 ori r17, 0x80 ; 128 aeb6: a2 cf rjmp .-188 ; 0xadfc aeb8: ff 20 and r15, r15 aeba: 09 f4 brne .+2 ; 0xaebe aebc: 9f cf rjmp .-194 ; 0xadfc aebe: fa 94 dec r15 aec0: 9d cf rjmp .-198 ; 0xadfc aec2: e7 e0 ldi r30, 0x07 ; 7 aec4: 2f 2d mov r18, r15 aec6: ef 15 cp r30, r15 aec8: 18 f4 brcc .+6 ; 0xaed0 aeca: 27 e0 ldi r18, 0x07 ; 7 aecc: 37 e0 ldi r19, 0x07 ; 7 aece: f3 2e mov r15, r19 aed0: 41 2c mov r4, r1 aed2: 9f cf rjmp .-194 ; 0xae12 aed4: 11 11 cpse r17, r1 aed6: 80 52 subi r24, 0x20 ; 32 aed8: b6 01 movw r22, r12 aeda: 90 e0 ldi r25, 0x00 ; 0 aedc: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 aee0: 8f ef ldi r24, 0xFF ; 255 aee2: a8 1a sub r10, r24 aee4: b8 0a sbc r11, r24 aee6: f5 01 movw r30, r10 aee8: 84 91 lpm r24, Z aeea: 81 11 cpse r24, r1 aeec: f3 cf rjmp .-26 ; 0xaed4 aeee: e1 10 cpse r14, r1 aef0: 84 c2 rjmp .+1288 ; 0xb3fa aef2: 53 01 movw r10, r6 aef4: f6 01 movw r30, r12 aef6: 93 81 ldd r25, Z+3 ; 0x03 aef8: f1 01 movw r30, r2 aefa: 93 fd sbrc r25, 3 aefc: 85 91 lpm r24, Z+ aefe: 93 ff sbrs r25, 3 af00: 81 91 ld r24, Z+ af02: 1f 01 movw r2, r30 af04: 88 23 and r24, r24 af06: 09 f4 brne .+2 ; 0xaf0a af08: 11 c2 rjmp .+1058 ; 0xb32c af0a: 85 32 cpi r24, 0x25 ; 37 af0c: 41 f4 brne .+16 ; 0xaf1e af0e: 93 fd sbrc r25, 3 af10: 85 91 lpm r24, Z+ af12: 93 ff sbrs r25, 3 af14: 81 91 ld r24, Z+ af16: 1f 01 movw r2, r30 af18: 85 32 cpi r24, 0x25 ; 37 af1a: 09 f0 breq .+2 ; 0xaf1e af1c: 1c cf rjmp .-456 ; 0xad56 af1e: b6 01 movw r22, r12 af20: 90 e0 ldi r25, 0x00 ; 0 af22: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 af26: 35 01 movw r6, r10 af28: e4 cf rjmp .-56 ; 0xaef2 af2a: 17 ff sbrs r17, 7 af2c: 6f c0 rjmp .+222 ; 0xb00c af2e: 4a 0c add r4, r10 af30: fc 85 ldd r31, Y+12 ; 0x0c af32: f4 ff sbrs r31, 4 af34: 04 c0 rjmp .+8 ; 0xaf3e af36: 8a 81 ldd r24, Y+2 ; 0x02 af38: 81 33 cpi r24, 0x31 ; 49 af3a: 09 f4 brne .+2 ; 0xaf3e af3c: 4a 94 dec r4 af3e: 14 14 cp r1, r4 af40: 0c f0 brlt .+2 ; 0xaf44 af42: 86 c0 rjmp .+268 ; 0xb050 af44: 28 e0 ldi r18, 0x08 ; 8 af46: 24 15 cp r18, r4 af48: 10 f4 brcc .+4 ; 0xaf4e af4a: 88 e0 ldi r24, 0x08 ; 8 af4c: 48 2e mov r4, r24 af4e: 85 e0 ldi r24, 0x05 ; 5 af50: 90 e0 ldi r25, 0x00 ; 0 af52: 17 ff sbrs r17, 7 af54: 06 c0 rjmp .+12 ; 0xaf62 af56: c5 01 movw r24, r10 af58: b7 fe sbrs r11, 7 af5a: 02 c0 rjmp .+4 ; 0xaf60 af5c: 90 e0 ldi r25, 0x00 ; 0 af5e: 80 e0 ldi r24, 0x00 ; 0 af60: 01 96 adiw r24, 0x01 ; 1 af62: 01 11 cpse r16, r1 af64: 01 96 adiw r24, 0x01 ; 1 af66: ff 20 and r15, r15 af68: 31 f0 breq .+12 ; 0xaf76 af6a: 2f 2d mov r18, r15 af6c: 30 e0 ldi r19, 0x00 ; 0 af6e: 2f 5f subi r18, 0xFF ; 255 af70: 3f 4f sbci r19, 0xFF ; 255 af72: 82 0f add r24, r18 af74: 93 1f adc r25, r19 af76: 58 16 cp r5, r24 af78: 19 06 cpc r1, r25 af7a: 19 f0 breq .+6 ; 0xaf82 af7c: 14 f0 brlt .+4 ; 0xaf82 af7e: e5 2c mov r14, r5 af80: e8 1a sub r14, r24 af82: 81 2f mov r24, r17 af84: 89 70 andi r24, 0x09 ; 9 af86: 11 f4 brne .+4 ; 0xaf8c af88: e1 10 cpse r14, r1 af8a: 67 c0 rjmp .+206 ; 0xb05a af8c: 00 23 and r16, r16 af8e: 29 f0 breq .+10 ; 0xaf9a af90: b6 01 movw r22, r12 af92: 80 2f mov r24, r16 af94: 90 e0 ldi r25, 0x00 ; 0 af96: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 af9a: 13 fd sbrc r17, 3 af9c: 02 c0 rjmp .+4 ; 0xafa2 af9e: e1 10 cpse r14, r1 afa0: 63 c0 rjmp .+198 ; 0xb068 afa2: 17 ff sbrs r17, 7 afa4: 7c c0 rjmp .+248 ; 0xb09e afa6: 85 01 movw r16, r10 afa8: b7 fe sbrs r11, 7 afaa: 02 c0 rjmp .+4 ; 0xafb0 afac: 10 e0 ldi r17, 0x00 ; 0 afae: 00 e0 ldi r16, 0x00 ; 0 afb0: c5 01 movw r24, r10 afb2: 84 19 sub r24, r4 afb4: 91 09 sbc r25, r1 afb6: 2c 01 movw r4, r24 afb8: 6f 2d mov r22, r15 afba: 70 e0 ldi r23, 0x00 ; 0 afbc: ee 27 eor r30, r30 afbe: ff 27 eor r31, r31 afc0: e6 1b sub r30, r22 afc2: f7 0b sbc r31, r23 afc4: ff 87 std Y+15, r31 ; 0x0f afc6: ee 87 std Y+14, r30 ; 0x0e afc8: 0f 3f cpi r16, 0xFF ; 255 afca: 10 07 cpc r17, r16 afcc: 29 f4 brne .+10 ; 0xafd8 afce: b6 01 movw r22, r12 afd0: 8e e2 ldi r24, 0x2E ; 46 afd2: 90 e0 ldi r25, 0x00 ; 0 afd4: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 afd8: a0 16 cp r10, r16 afda: b1 06 cpc r11, r17 afdc: 0c f4 brge .+2 ; 0xafe0 afde: 4b c0 rjmp .+150 ; 0xb076 afe0: 40 16 cp r4, r16 afe2: 51 06 cpc r5, r17 afe4: 0c f0 brlt .+2 ; 0xafe8 afe6: 47 c0 rjmp .+142 ; 0xb076 afe8: f5 01 movw r30, r10 afea: e0 1b sub r30, r16 afec: f1 0b sbc r31, r17 afee: e8 0d add r30, r8 aff0: f9 1d adc r31, r9 aff2: 81 81 ldd r24, Z+1 ; 0x01 aff4: 01 50 subi r16, 0x01 ; 1 aff6: 11 09 sbc r17, r1 aff8: 2e 85 ldd r18, Y+14 ; 0x0e affa: 3f 85 ldd r19, Y+15 ; 0x0f affc: 02 17 cp r16, r18 affe: 13 07 cpc r17, r19 b000: e4 f1 brlt .+120 ; 0xb07a b002: b6 01 movw r22, r12 b004: 90 e0 ldi r25, 0x00 ; 0 b006: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b00a: de cf rjmp .-68 ; 0xafc8 b00c: 16 fd sbrc r17, 6 b00e: 9f cf rjmp .-194 ; 0xaf4e b010: ef 2d mov r30, r15 b012: f0 e0 ldi r31, 0x00 ; 0 b014: ea 15 cp r30, r10 b016: fb 05 cpc r31, r11 b018: 34 f0 brlt .+12 ; 0xb026 b01a: 3c ef ldi r19, 0xFC ; 252 b01c: a3 16 cp r10, r19 b01e: 3f ef ldi r19, 0xFF ; 255 b020: b3 06 cpc r11, r19 b022: 0c f0 brlt .+2 ; 0xb026 b024: 10 68 ori r17, 0x80 ; 128 b026: 32 96 adiw r30, 0x02 ; 2 b028: e8 0d add r30, r8 b02a: f9 1d adc r31, r9 b02c: 01 c0 rjmp .+2 ; 0xb030 b02e: fa 94 dec r15 b030: ff 20 and r15, r15 b032: 19 f0 breq .+6 ; 0xb03a b034: 82 91 ld r24, -Z b036: 80 33 cpi r24, 0x30 ; 48 b038: d1 f3 breq .-12 ; 0xb02e b03a: 17 ff sbrs r17, 7 b03c: 88 cf rjmp .-240 ; 0xaf4e b03e: 44 24 eor r4, r4 b040: 43 94 inc r4 b042: 4f 0c add r4, r15 b044: fa 14 cp r15, r10 b046: 1b 04 cpc r1, r11 b048: 31 f0 breq .+12 ; 0xb056 b04a: 2c f0 brlt .+10 ; 0xb056 b04c: fa 18 sub r15, r10 b04e: 7f cf rjmp .-258 ; 0xaf4e b050: 44 24 eor r4, r4 b052: 43 94 inc r4 b054: 7c cf rjmp .-264 ; 0xaf4e b056: f1 2c mov r15, r1 b058: 7a cf rjmp .-268 ; 0xaf4e b05a: b6 01 movw r22, r12 b05c: 80 e2 ldi r24, 0x20 ; 32 b05e: 90 e0 ldi r25, 0x00 ; 0 b060: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b064: ea 94 dec r14 b066: 90 cf rjmp .-224 ; 0xaf88 b068: b6 01 movw r22, r12 b06a: 80 e3 ldi r24, 0x30 ; 48 b06c: 90 e0 ldi r25, 0x00 ; 0 b06e: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b072: ea 94 dec r14 b074: 94 cf rjmp .-216 ; 0xaf9e b076: 80 e3 ldi r24, 0x30 ; 48 b078: bd cf rjmp .-134 ; 0xaff4 b07a: a0 16 cp r10, r16 b07c: b1 06 cpc r11, r17 b07e: 41 f4 brne .+16 ; 0xb090 b080: 9a 81 ldd r25, Y+2 ; 0x02 b082: 96 33 cpi r25, 0x36 ; 54 b084: 50 f4 brcc .+20 ; 0xb09a b086: 95 33 cpi r25, 0x35 ; 53 b088: 19 f4 brne .+6 ; 0xb090 b08a: 3c 85 ldd r19, Y+12 ; 0x0c b08c: 34 ff sbrs r19, 4 b08e: 05 c0 rjmp .+10 ; 0xb09a b090: b6 01 movw r22, r12 b092: 90 e0 ldi r25, 0x00 ; 0 b094: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b098: 2a cf rjmp .-428 ; 0xaeee b09a: 81 e3 ldi r24, 0x31 ; 49 b09c: f9 cf rjmp .-14 ; 0xb090 b09e: 8a 81 ldd r24, Y+2 ; 0x02 b0a0: 81 33 cpi r24, 0x31 ; 49 b0a2: 19 f0 breq .+6 ; 0xb0aa b0a4: 9c 85 ldd r25, Y+12 ; 0x0c b0a6: 9f 7e andi r25, 0xEF ; 239 b0a8: 9c 87 std Y+12, r25 ; 0x0c b0aa: b6 01 movw r22, r12 b0ac: 90 e0 ldi r25, 0x00 ; 0 b0ae: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b0b2: ff 20 and r15, r15 b0b4: a9 f0 breq .+42 ; 0xb0e0 b0b6: b6 01 movw r22, r12 b0b8: 8e e2 ldi r24, 0x2E ; 46 b0ba: 90 e0 ldi r25, 0x00 ; 0 b0bc: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b0c0: f3 94 inc r15 b0c2: f3 94 inc r15 b0c4: e2 e0 ldi r30, 0x02 ; 2 b0c6: 01 e0 ldi r16, 0x01 ; 1 b0c8: 0e 0f add r16, r30 b0ca: e8 0d add r30, r8 b0cc: f9 2d mov r31, r9 b0ce: f1 1d adc r31, r1 b0d0: 80 81 ld r24, Z b0d2: b6 01 movw r22, r12 b0d4: 90 e0 ldi r25, 0x00 ; 0 b0d6: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b0da: e0 2f mov r30, r16 b0dc: 0f 11 cpse r16, r15 b0de: f3 cf rjmp .-26 ; 0xb0c6 b0e0: 85 e6 ldi r24, 0x65 ; 101 b0e2: 90 e0 ldi r25, 0x00 ; 0 b0e4: 14 ff sbrs r17, 4 b0e6: 02 c0 rjmp .+4 ; 0xb0ec b0e8: 85 e4 ldi r24, 0x45 ; 69 b0ea: 90 e0 ldi r25, 0x00 ; 0 b0ec: b6 01 movw r22, r12 b0ee: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b0f2: b7 fc sbrc r11, 7 b0f4: 06 c0 rjmp .+12 ; 0xb102 b0f6: a1 14 cp r10, r1 b0f8: b1 04 cpc r11, r1 b0fa: c1 f4 brne .+48 ; 0xb12c b0fc: ec 85 ldd r30, Y+12 ; 0x0c b0fe: e4 ff sbrs r30, 4 b100: 15 c0 rjmp .+42 ; 0xb12c b102: b1 94 neg r11 b104: a1 94 neg r10 b106: b1 08 sbc r11, r1 b108: 8d e2 ldi r24, 0x2D ; 45 b10a: b6 01 movw r22, r12 b10c: 90 e0 ldi r25, 0x00 ; 0 b10e: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b112: 80 e3 ldi r24, 0x30 ; 48 b114: 2a e0 ldi r18, 0x0A ; 10 b116: a2 16 cp r10, r18 b118: b1 04 cpc r11, r1 b11a: 54 f4 brge .+20 ; 0xb130 b11c: b6 01 movw r22, r12 b11e: 90 e0 ldi r25, 0x00 ; 0 b120: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b124: b6 01 movw r22, r12 b126: c5 01 movw r24, r10 b128: c0 96 adiw r24, 0x30 ; 48 b12a: b4 cf rjmp .-152 ; 0xb094 b12c: 8b e2 ldi r24, 0x2B ; 43 b12e: ed cf rjmp .-38 ; 0xb10a b130: 8f 5f subi r24, 0xFF ; 255 b132: fa e0 ldi r31, 0x0A ; 10 b134: af 1a sub r10, r31 b136: b1 08 sbc r11, r1 b138: ed cf rjmp .-38 ; 0xb114 b13a: 83 36 cpi r24, 0x63 ; 99 b13c: c9 f0 breq .+50 ; 0xb170 b13e: 83 37 cpi r24, 0x73 ; 115 b140: 71 f1 breq .+92 ; 0xb19e b142: 83 35 cpi r24, 0x53 ; 83 b144: 09 f0 breq .+2 ; 0xb148 b146: 5b c0 rjmp .+182 ; 0xb1fe b148: 35 01 movw r6, r10 b14a: f2 e0 ldi r31, 0x02 ; 2 b14c: 6f 0e add r6, r31 b14e: 71 1c adc r7, r1 b150: f5 01 movw r30, r10 b152: a0 80 ld r10, Z b154: b1 80 ldd r11, Z+1 ; 0x01 b156: 6f 2d mov r22, r15 b158: 70 e0 ldi r23, 0x00 ; 0 b15a: 06 fd sbrc r16, 6 b15c: 02 c0 rjmp .+4 ; 0xb162 b15e: 6f ef ldi r22, 0xFF ; 255 b160: 7f ef ldi r23, 0xFF ; 255 b162: c5 01 movw r24, r10 b164: 0f 94 0c da call 0x3b418 ; 0x3b418 b168: 9d 87 std Y+13, r25 ; 0x0d b16a: 8c 87 std Y+12, r24 ; 0x0c b16c: 00 68 ori r16, 0x80 ; 128 b16e: 0d c0 rjmp .+26 ; 0xb18a b170: 35 01 movw r6, r10 b172: 32 e0 ldi r19, 0x02 ; 2 b174: 63 0e add r6, r19 b176: 71 1c adc r7, r1 b178: f5 01 movw r30, r10 b17a: 80 81 ld r24, Z b17c: 89 83 std Y+1, r24 ; 0x01 b17e: 21 e0 ldi r18, 0x01 ; 1 b180: 30 e0 ldi r19, 0x00 ; 0 b182: 3d 87 std Y+13, r19 ; 0x0d b184: 2c 87 std Y+12, r18 ; 0x0c b186: 54 01 movw r10, r8 b188: 0f 77 andi r16, 0x7F ; 127 b18a: 03 fd sbrc r16, 3 b18c: 06 c0 rjmp .+12 ; 0xb19a b18e: 2c 85 ldd r18, Y+12 ; 0x0c b190: 3d 85 ldd r19, Y+13 ; 0x0d b192: 52 16 cp r5, r18 b194: 13 06 cpc r1, r19 b196: 09 f0 breq .+2 ; 0xb19a b198: a8 f4 brcc .+42 ; 0xb1c4 b19a: e5 2c mov r14, r5 b19c: 2b c0 rjmp .+86 ; 0xb1f4 b19e: 35 01 movw r6, r10 b1a0: 32 e0 ldi r19, 0x02 ; 2 b1a2: 63 0e add r6, r19 b1a4: 71 1c adc r7, r1 b1a6: f5 01 movw r30, r10 b1a8: a0 80 ld r10, Z b1aa: b1 80 ldd r11, Z+1 ; 0x01 b1ac: 6f 2d mov r22, r15 b1ae: 70 e0 ldi r23, 0x00 ; 0 b1b0: 06 fd sbrc r16, 6 b1b2: 02 c0 rjmp .+4 ; 0xb1b8 b1b4: 6f ef ldi r22, 0xFF ; 255 b1b6: 7f ef ldi r23, 0xFF ; 255 b1b8: c5 01 movw r24, r10 b1ba: 0f 94 31 da call 0x3b462 ; 0x3b462 b1be: 9d 87 std Y+13, r25 ; 0x0d b1c0: 8c 87 std Y+12, r24 ; 0x0c b1c2: e2 cf rjmp .-60 ; 0xb188 b1c4: b6 01 movw r22, r12 b1c6: 80 e2 ldi r24, 0x20 ; 32 b1c8: 90 e0 ldi r25, 0x00 ; 0 b1ca: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b1ce: 5a 94 dec r5 b1d0: de cf rjmp .-68 ; 0xb18e b1d2: f5 01 movw r30, r10 b1d4: 07 fd sbrc r16, 7 b1d6: 85 91 lpm r24, Z+ b1d8: 07 ff sbrs r16, 7 b1da: 81 91 ld r24, Z+ b1dc: 5f 01 movw r10, r30 b1de: b6 01 movw r22, r12 b1e0: 90 e0 ldi r25, 0x00 ; 0 b1e2: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b1e6: e1 10 cpse r14, r1 b1e8: ea 94 dec r14 b1ea: 8c 85 ldd r24, Y+12 ; 0x0c b1ec: 9d 85 ldd r25, Y+13 ; 0x0d b1ee: 01 97 sbiw r24, 0x01 ; 1 b1f0: 9d 87 std Y+13, r25 ; 0x0d b1f2: 8c 87 std Y+12, r24 ; 0x0c b1f4: ec 85 ldd r30, Y+12 ; 0x0c b1f6: fd 85 ldd r31, Y+13 ; 0x0d b1f8: ef 2b or r30, r31 b1fa: 59 f7 brne .-42 ; 0xb1d2 b1fc: 78 ce rjmp .-784 ; 0xaeee b1fe: 84 36 cpi r24, 0x64 ; 100 b200: 19 f0 breq .+6 ; 0xb208 b202: 89 36 cpi r24, 0x69 ; 105 b204: 09 f0 breq .+2 ; 0xb208 b206: 74 c0 rjmp .+232 ; 0xb2f0 b208: 35 01 movw r6, r10 b20a: 07 ff sbrs r16, 7 b20c: 66 c0 rjmp .+204 ; 0xb2da b20e: f4 e0 ldi r31, 0x04 ; 4 b210: 6f 0e add r6, r31 b212: 71 1c adc r7, r1 b214: f5 01 movw r30, r10 b216: 60 81 ld r22, Z b218: 71 81 ldd r23, Z+1 ; 0x01 b21a: 82 81 ldd r24, Z+2 ; 0x02 b21c: 93 81 ldd r25, Z+3 ; 0x03 b21e: 10 2f mov r17, r16 b220: 1f 76 andi r17, 0x6F ; 111 b222: 97 ff sbrs r25, 7 b224: 08 c0 rjmp .+16 ; 0xb236 b226: 90 95 com r25 b228: 80 95 com r24 b22a: 70 95 com r23 b22c: 61 95 neg r22 b22e: 7f 4f sbci r23, 0xFF ; 255 b230: 8f 4f sbci r24, 0xFF ; 255 b232: 9f 4f sbci r25, 0xFF ; 255 b234: 10 68 ori r17, 0x80 ; 128 b236: 2a e0 ldi r18, 0x0A ; 10 b238: 30 e0 ldi r19, 0x00 ; 0 b23a: a4 01 movw r20, r8 b23c: 0f 94 9f db call 0x3b73e ; 0x3b73e <__ultoa_invert> b240: a8 2e mov r10, r24 b242: a8 18 sub r10, r8 b244: ba 2c mov r11, r10 b246: 01 2f mov r16, r17 b248: 16 ff sbrs r17, 6 b24a: 0a c0 rjmp .+20 ; 0xb260 b24c: 0e 7f andi r16, 0xFE ; 254 b24e: af 14 cp r10, r15 b250: 38 f4 brcc .+14 ; 0xb260 b252: 14 ff sbrs r17, 4 b254: 04 c0 rjmp .+8 ; 0xb25e b256: 12 fd sbrc r17, 2 b258: 02 c0 rjmp .+4 ; 0xb25e b25a: 01 2f mov r16, r17 b25c: 0e 7e andi r16, 0xEE ; 238 b25e: bf 2c mov r11, r15 b260: 04 ff sbrs r16, 4 b262: a3 c0 rjmp .+326 ; 0xb3aa b264: fe 01 movw r30, r28 b266: ea 0d add r30, r10 b268: f1 1d adc r31, r1 b26a: 80 81 ld r24, Z b26c: 80 33 cpi r24, 0x30 ; 48 b26e: 09 f0 breq .+2 ; 0xb272 b270: 95 c0 rjmp .+298 ; 0xb39c b272: 09 7e andi r16, 0xE9 ; 233 b274: f0 2f mov r31, r16 b276: f8 70 andi r31, 0x08 ; 8 b278: ef 2e mov r14, r31 b27a: 03 fd sbrc r16, 3 b27c: a5 c0 rjmp .+330 ; 0xb3c8 b27e: 00 ff sbrs r16, 0 b280: 9f c0 rjmp .+318 ; 0xb3c0 b282: fa 2c mov r15, r10 b284: b5 14 cp r11, r5 b286: 10 f4 brcc .+4 ; 0xb28c b288: f5 0c add r15, r5 b28a: fb 18 sub r15, r11 b28c: 04 ff sbrs r16, 4 b28e: a2 c0 rjmp .+324 ; 0xb3d4 b290: b6 01 movw r22, r12 b292: 80 e3 ldi r24, 0x30 ; 48 b294: 90 e0 ldi r25, 0x00 ; 0 b296: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b29a: 02 ff sbrs r16, 2 b29c: 09 c0 rjmp .+18 ; 0xb2b0 b29e: 88 e7 ldi r24, 0x78 ; 120 b2a0: 90 e0 ldi r25, 0x00 ; 0 b2a2: 01 ff sbrs r16, 1 b2a4: 02 c0 rjmp .+4 ; 0xb2aa b2a6: 88 e5 ldi r24, 0x58 ; 88 b2a8: 90 e0 ldi r25, 0x00 ; 0 b2aa: b6 01 movw r22, r12 b2ac: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b2b0: af 14 cp r10, r15 b2b2: 08 f4 brcc .+2 ; 0xb2b6 b2b4: 9b c0 rjmp .+310 ; 0xb3ec b2b6: aa 94 dec r10 b2b8: 0a 2d mov r16, r10 b2ba: 10 e0 ldi r17, 0x00 ; 0 b2bc: 0f 5f subi r16, 0xFF ; 255 b2be: 1f 4f sbci r17, 0xFF ; 255 b2c0: 08 0d add r16, r8 b2c2: 19 1d adc r17, r9 b2c4: f8 01 movw r30, r16 b2c6: 82 91 ld r24, -Z b2c8: 8f 01 movw r16, r30 b2ca: b6 01 movw r22, r12 b2cc: 90 e0 ldi r25, 0x00 ; 0 b2ce: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b2d2: 80 16 cp r8, r16 b2d4: 91 06 cpc r9, r17 b2d6: b1 f7 brne .-20 ; 0xb2c4 b2d8: 0a ce rjmp .-1004 ; 0xaeee b2da: f2 e0 ldi r31, 0x02 ; 2 b2dc: 6f 0e add r6, r31 b2de: 71 1c adc r7, r1 b2e0: f5 01 movw r30, r10 b2e2: 60 81 ld r22, Z b2e4: 71 81 ldd r23, Z+1 ; 0x01 b2e6: 07 2e mov r0, r23 b2e8: 00 0c add r0, r0 b2ea: 88 0b sbc r24, r24 b2ec: 99 0b sbc r25, r25 b2ee: 97 cf rjmp .-210 ; 0xb21e b2f0: 10 2f mov r17, r16 b2f2: 85 37 cpi r24, 0x75 ; 117 b2f4: a9 f4 brne .+42 ; 0xb320 b2f6: 1f 7e andi r17, 0xEF ; 239 b2f8: 2a e0 ldi r18, 0x0A ; 10 b2fa: 30 e0 ldi r19, 0x00 ; 0 b2fc: 35 01 movw r6, r10 b2fe: 17 ff sbrs r17, 7 b300: 44 c0 rjmp .+136 ; 0xb38a b302: f4 e0 ldi r31, 0x04 ; 4 b304: 6f 0e add r6, r31 b306: 71 1c adc r7, r1 b308: f5 01 movw r30, r10 b30a: 60 81 ld r22, Z b30c: 71 81 ldd r23, Z+1 ; 0x01 b30e: 82 81 ldd r24, Z+2 ; 0x02 b310: 93 81 ldd r25, Z+3 ; 0x03 b312: a4 01 movw r20, r8 b314: 0f 94 9f db call 0x3b73e ; 0x3b73e <__ultoa_invert> b318: a8 2e mov r10, r24 b31a: a8 18 sub r10, r8 b31c: 1f 77 andi r17, 0x7F ; 127 b31e: 92 cf rjmp .-220 ; 0xb244 b320: 19 7f andi r17, 0xF9 ; 249 b322: 8f 36 cpi r24, 0x6F ; 111 b324: 79 f1 breq .+94 ; 0xb384 b326: f0 f4 brcc .+60 ; 0xb364 b328: 88 35 cpi r24, 0x58 ; 88 b32a: 39 f1 breq .+78 ; 0xb37a b32c: f6 01 movw r30, r12 b32e: 86 81 ldd r24, Z+6 ; 0x06 b330: 97 81 ldd r25, Z+7 ; 0x07 b332: 2f 96 adiw r28, 0x0f ; 15 b334: 0f b6 in r0, 0x3f ; 63 b336: f8 94 cli b338: de bf out 0x3e, r29 ; 62 b33a: 0f be out 0x3f, r0 ; 63 b33c: cd bf out 0x3d, r28 ; 61 b33e: df 91 pop r29 b340: cf 91 pop r28 b342: 1f 91 pop r17 b344: 0f 91 pop r16 b346: ff 90 pop r15 b348: ef 90 pop r14 b34a: df 90 pop r13 b34c: cf 90 pop r12 b34e: bf 90 pop r11 b350: af 90 pop r10 b352: 9f 90 pop r9 b354: 8f 90 pop r8 b356: 7f 90 pop r7 b358: 6f 90 pop r6 b35a: 5f 90 pop r5 b35c: 4f 90 pop r4 b35e: 3f 90 pop r3 b360: 2f 90 pop r2 b362: 08 95 ret b364: 80 37 cpi r24, 0x70 ; 112 b366: 39 f0 breq .+14 ; 0xb376 b368: 88 37 cpi r24, 0x78 ; 120 b36a: 01 f7 brne .-64 ; 0xb32c b36c: 14 fd sbrc r17, 4 b36e: 14 60 ori r17, 0x04 ; 4 b370: 20 e1 ldi r18, 0x10 ; 16 b372: 30 e0 ldi r19, 0x00 ; 0 b374: c3 cf rjmp .-122 ; 0xb2fc b376: 10 61 ori r17, 0x10 ; 16 b378: f9 cf rjmp .-14 ; 0xb36c b37a: 04 fd sbrc r16, 4 b37c: 16 60 ori r17, 0x06 ; 6 b37e: 20 e1 ldi r18, 0x10 ; 16 b380: 32 e0 ldi r19, 0x02 ; 2 b382: bc cf rjmp .-136 ; 0xb2fc b384: 28 e0 ldi r18, 0x08 ; 8 b386: 30 e0 ldi r19, 0x00 ; 0 b388: b9 cf rjmp .-142 ; 0xb2fc b38a: f2 e0 ldi r31, 0x02 ; 2 b38c: 6f 0e add r6, r31 b38e: 71 1c adc r7, r1 b390: f5 01 movw r30, r10 b392: 60 81 ld r22, Z b394: 71 81 ldd r23, Z+1 ; 0x01 b396: 90 e0 ldi r25, 0x00 ; 0 b398: 80 e0 ldi r24, 0x00 ; 0 b39a: bb cf rjmp .-138 ; 0xb312 b39c: 02 fd sbrc r16, 2 b39e: 02 c0 rjmp .+4 ; 0xb3a4 b3a0: b3 94 inc r11 b3a2: 68 cf rjmp .-304 ; 0xb274 b3a4: b3 94 inc r11 b3a6: b3 94 inc r11 b3a8: 65 cf rjmp .-310 ; 0xb274 b3aa: 80 2f mov r24, r16 b3ac: 86 78 andi r24, 0x86 ; 134 b3ae: 09 f4 brne .+2 ; 0xb3b2 b3b0: 61 cf rjmp .-318 ; 0xb274 b3b2: f6 cf rjmp .-20 ; 0xb3a0 b3b4: b6 01 movw r22, r12 b3b6: 80 e2 ldi r24, 0x20 ; 32 b3b8: 90 e0 ldi r25, 0x00 ; 0 b3ba: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b3be: b3 94 inc r11 b3c0: b5 14 cp r11, r5 b3c2: c0 f3 brcs .-16 ; 0xb3b4 b3c4: e1 2c mov r14, r1 b3c6: 62 cf rjmp .-316 ; 0xb28c b3c8: e5 2c mov r14, r5 b3ca: eb 18 sub r14, r11 b3cc: b5 14 cp r11, r5 b3ce: 08 f4 brcc .+2 ; 0xb3d2 b3d0: 5d cf rjmp .-326 ; 0xb28c b3d2: f8 cf rjmp .-16 ; 0xb3c4 b3d4: 80 2f mov r24, r16 b3d6: 86 78 andi r24, 0x86 ; 134 b3d8: 09 f4 brne .+2 ; 0xb3dc b3da: 6a cf rjmp .-300 ; 0xb2b0 b3dc: 8b e2 ldi r24, 0x2B ; 43 b3de: 01 ff sbrs r16, 1 b3e0: 80 e2 ldi r24, 0x20 ; 32 b3e2: 07 fd sbrc r16, 7 b3e4: 8d e2 ldi r24, 0x2D ; 45 b3e6: b6 01 movw r22, r12 b3e8: 90 e0 ldi r25, 0x00 ; 0 b3ea: 60 cf rjmp .-320 ; 0xb2ac b3ec: b6 01 movw r22, r12 b3ee: 80 e3 ldi r24, 0x30 ; 48 b3f0: 90 e0 ldi r25, 0x00 ; 0 b3f2: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b3f6: fa 94 dec r15 b3f8: 5b cf rjmp .-330 ; 0xb2b0 b3fa: b6 01 movw r22, r12 b3fc: 80 e2 ldi r24, 0x20 ; 32 b3fe: 90 e0 ldi r25, 0x00 ; 0 b400: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 b404: ea 94 dec r14 b406: 73 cd rjmp .-1306 ; 0xaeee b408: 24 e0 ldi r18, 0x04 ; 4 b40a: e1 2c mov r14, r1 b40c: 25 15 cp r18, r5 b40e: 08 f0 brcs .+2 ; 0xb412 b410: 36 cd rjmp .-1428 ; 0xae7e b412: 84 e0 ldi r24, 0x04 ; 4 b414: 26 cd rjmp .-1460 ; 0xae62 0000b416 : 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 ( b416: 20 e0 ldi r18, 0x00 ; 0 b418: 30 e0 ldi r19, 0x00 ; 0 b41a: 40 e8 ldi r20, 0x80 ; 128 b41c: 5f eb ldi r21, 0xBF ; 191 b41e: 60 91 83 02 lds r22, 0x0283 ; 0x800283 b422: 70 91 84 02 lds r23, 0x0284 ; 0x800284 b426: 80 91 85 02 lds r24, 0x0285 ; 0x800285 b42a: 90 91 86 02 lds r25, 0x0286 ; 0x800286 b42e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> b432: 88 23 and r24, r24 b434: 21 f1 breq .+72 ; 0xb47e (saved_start_position[0] != SAVED_START_POSITION_UNSET) && ( (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) || b436: e0 91 91 12 lds r30, 0x1291 ; 0x801291 b43a: f0 91 92 12 lds r31, 0x1292 ; 0x801292 b43e: ec 55 subi r30, 0x5C ; 92 b440: 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) && ( b442: 80 81 ld r24, Z b444: 8b 7f andi r24, 0xFB ; 251 b446: 82 30 cpi r24, 0x02 ; 2 b448: d1 f4 brne .+52 ; 0xb47e (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)); b44a: 80 e1 ldi r24, 0x10 ; 16 b44c: e3 e8 ldi r30, 0x83 ; 131 b44e: f2 e0 ldi r31, 0x02 ; 2 b450: a1 e9 ldi r26, 0x91 ; 145 b452: b6 e0 ldi r27, 0x06 ; 6 b454: 01 90 ld r0, Z+ b456: 0d 92 st X+, r0 b458: 8a 95 dec r24 b45a: e1 f7 brne .-8 ; 0xb454 saved_start_position[0] = SAVED_START_POSITION_UNSET; b45c: 80 e0 ldi r24, 0x00 ; 0 b45e: 90 e0 ldi r25, 0x00 ; 0 b460: a0 e8 ldi r26, 0x80 ; 128 b462: bf eb ldi r27, 0xBF ; 191 b464: 80 93 83 02 sts 0x0283, r24 ; 0x800283 b468: 90 93 84 02 sts 0x0284, r25 ; 0x800284 b46c: a0 93 85 02 sts 0x0285, r26 ; 0x800285 b470: b0 93 86 02 sts 0x0286, r27 ; 0x800286 return saved_segment_idx; b474: 80 91 68 05 lds r24, 0x0568 ; 0x800568 b478: 90 91 69 05 lds r25, 0x0569 ; 0x800569 b47c: 08 95 ret } else return 1; //begin with the first segment b47e: 81 e0 ldi r24, 0x01 ; 1 b480: 90 e0 ldi r25, 0x00 ; 0 } b482: 08 95 ret 0000b484 : 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) { b484: cf 92 push r12 b486: df 92 push r13 b488: ef 92 push r14 b48a: ff 92 push r15 b48c: 0f 93 push r16 b48e: 1f 93 push r17 b490: cf 93 push r28 b492: 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); b494: 90 e0 ldi r25, 0x00 ; 0 b496: ec 01 movw r28, r24 b498: cc 0f add r28, r28 b49a: dd 1f adc r29, r29 b49c: cc 0f add r28, r28 b49e: dd 1f adc r29, r29 b4a0: fe 01 movw r30, r28 b4a2: e2 57 subi r30, 0x72 ; 114 b4a4: f4 48 sbci r31, 0x84 ; 132 #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); b4a6: 25 91 lpm r18, Z+ b4a8: 35 91 lpm r19, Z+ b4aa: 45 91 lpm r20, Z+ b4ac: 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]; b4ae: fe 01 movw r30, r28 b4b0: eb 5e subi r30, 0xEB ; 235 b4b2: f1 4f sbci r31, 0xF1 ; 241 b4b4: c0 80 ld r12, Z b4b6: d1 80 ldd r13, Z+1 ; 0x01 b4b8: e2 80 ldd r14, Z+2 ; 0x02 b4ba: f3 80 ldd r15, Z+3 ; 0x03 b4bc: 8e 01 movw r16, r28 b4be: 0f 56 subi r16, 0x6F ; 111 b4c0: 19 4f sbci r17, 0xF9 ; 249 b4c2: c7 01 movw r24, r14 b4c4: b6 01 movw r22, r12 b4c6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> b4ca: f8 01 movw r30, r16 b4cc: 60 83 st Z, r22 b4ce: 71 83 std Z+1, r23 ; 0x01 b4d0: 82 83 std Z+2, r24 ; 0x02 b4d2: 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); b4d4: fe 01 movw r30, r28 b4d6: ee 57 subi r30, 0x7E ; 126 b4d8: f4 48 sbci r31, 0x84 ; 132 #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); b4da: 25 91 lpm r18, Z+ b4dc: 35 91 lpm r19, Z+ b4de: 45 91 lpm r20, Z+ b4e0: 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]; b4e2: 8e 01 movw r16, r28 b4e4: 0f 5d subi r16, 0xDF ; 223 b4e6: 1d 4f sbci r17, 0xFD ; 253 b4e8: c7 01 movw r24, r14 b4ea: b6 01 movw r22, r12 b4ec: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> b4f0: f8 01 movw r30, r16 b4f2: 60 83 st Z, r22 b4f4: 71 83 std Z+1, r23 ; 0x01 b4f6: 82 83 std Z+2, r24 ; 0x02 b4f8: 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); b4fa: fe 01 movw r30, r28 b4fc: ea 58 subi r30, 0x8A ; 138 b4fe: f4 48 sbci r31, 0x84 ; 132 #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); b500: 25 91 lpm r18, Z+ b502: 35 91 lpm r19, Z+ b504: 45 91 lpm r20, Z+ b506: 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]; b508: cb 5e subi r28, 0xEB ; 235 b50a: dd 4f sbci r29, 0xFD ; 253 b50c: c7 01 movw r24, r14 b50e: b6 01 movw r22, r12 b510: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> b514: 68 83 st Y, r22 b516: 79 83 std Y+1, r23 ; 0x01 b518: 8a 83 std Y+2, r24 ; 0x02 b51a: 9b 83 std Y+3, r25 ; 0x03 } b51c: df 91 pop r29 b51e: cf 91 pop r28 b520: 1f 91 pop r17 b522: 0f 91 pop r16 b524: ff 90 pop r15 b526: ef 90 pop r14 b528: df 90 pop r13 b52a: cf 90 pop r12 b52c: 08 95 ret 0000b52e : 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)); } b52e: 80 e1 ldi r24, 0x10 ; 16 b530: e3 e7 ldi r30, 0x73 ; 115 b532: f6 e0 ldi r31, 0x06 ; 6 b534: a1 e9 ldi r26, 0x91 ; 145 b536: b6 e0 ldi r27, 0x06 ; 6 b538: 01 90 ld r0, Z+ b53a: 0d 92 st X+, r0 b53c: 8a 95 dec r24 b53e: e1 f7 brne .-8 ; 0xb538 b540: 08 95 ret 0000b542 : /// @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)); b542: e1 e0 ldi r30, 0x01 ; 1 b544: fb e7 ldi r31, 0x7B ; 123 b546: 83 30 cpi r24, 0x03 ; 3 b548: 21 f0 breq .+8 ; 0xb552 b54a: e8 2f mov r30, r24 b54c: f0 e0 ldi r31, 0x00 ; 0 b54e: e2 50 subi r30, 0x02 ; 2 b550: f5 48 sbci r31, 0x85 ; 133 b552: 84 91 lpm r24, Z } b554: 08 95 ret 0000b556 : #endif //SDSUPPORT } uint16_t cmdqueue_calc_sd_length() { if (buflen == 0) b556: 40 91 a2 10 lds r20, 0x10A2 ; 0x8010a2 b55a: 50 91 a3 10 lds r21, 0x10A3 ; 0x8010a3 return 0; b55e: 90 e0 ldi r25, 0x00 ; 0 b560: 80 e0 ldi r24, 0x00 ; 0 #endif //SDSUPPORT } uint16_t cmdqueue_calc_sd_length() { if (buflen == 0) b562: 41 15 cp r20, r1 b564: 51 05 cpc r21, r1 b566: b1 f1 breq .+108 ; 0xb5d4 char hi; } lohi; uint16_t value; } sdlen_single; uint16_t sdlen = 0; for (size_t _buflen = buflen, _bufindr = bufindr;;) { b568: 20 91 91 12 lds r18, 0x1291 ; 0x801291 b56c: 30 91 92 12 lds r19, 0x1292 ; 0x801292 char lo; char hi; } lohi; uint16_t value; } sdlen_single; uint16_t sdlen = 0; b570: 90 e0 ldi r25, 0x00 ; 0 b572: 80 e0 ldi r24, 0x00 ; 0 for (size_t _buflen = buflen, _bufindr = bufindr;;) { if (cmdbuffer[_bufindr] == CMDBUFFER_CURRENT_TYPE_SDCARD) { b574: f9 01 movw r30, r18 b576: ec 55 subi r30, 0x5C ; 92 b578: ff 4e sbci r31, 0xEF ; 239 b57a: a0 81 ld r26, Z b57c: a2 30 cpi r26, 0x02 ; 2 b57e: 21 f4 brne .+8 ; 0xb588 sdlen_single.lohi.lo = cmdbuffer[_bufindr + 1]; b580: 61 81 ldd r22, Z+1 ; 0x01 sdlen_single.lohi.hi = cmdbuffer[_bufindr + 2]; b582: 72 81 ldd r23, Z+2 ; 0x02 sdlen += sdlen_single.value; b584: 86 0f add r24, r22 b586: 97 1f adc r25, r23 } if (-- _buflen == 0) b588: 41 50 subi r20, 0x01 ; 1 b58a: 51 09 sbc r21, r1 b58c: 19 f1 breq .+70 ; 0xb5d4 b58e: f9 01 movw r30, r18 b590: e9 55 subi r30, 0x59 ; 89 b592: 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) ; b594: a1 91 ld r26, Z+ b596: 9f 01 movw r18, r30 b598: 24 5a subi r18, 0xA4 ; 164 b59a: 30 41 sbci r19, 0x10 ; 16 b59c: a1 11 cpse r26, r1 b59e: fa cf rjmp .-12 ; 0xb594 b5a0: f9 01 movw r30, r18 b5a2: ec 55 subi r30, 0x5C ; 92 b5a4: 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) ; b5a6: 2d 3e cpi r18, 0xED ; 237 b5a8: a1 e0 ldi r26, 0x01 ; 1 b5aa: 3a 07 cpc r19, r26 b5ac: 30 f4 brcc .+12 ; 0xb5ba b5ae: a1 91 ld r26, Z+ b5b0: a1 11 cpse r26, r1 b5b2: e0 cf rjmp .-64 ; 0xb574 b5b4: 2f 5f subi r18, 0xFF ; 255 b5b6: 3f 4f sbci r19, 0xFF ; 255 b5b8: f6 cf rjmp .-20 ; 0xb5a6 // If the end of the buffer was empty, if (_bufindr == sizeof(cmdbuffer)) { b5ba: 2d 3e cpi r18, 0xED ; 237 b5bc: e1 e0 ldi r30, 0x01 ; 1 b5be: 3e 07 cpc r19, r30 b5c0: c9 f6 brne .-78 ; 0xb574 b5c2: e4 ea ldi r30, 0xA4 ; 164 b5c4: f0 e1 ldi r31, 0x10 ; 16 b5c6: 9f 01 movw r18, r30 b5c8: 24 5a subi r18, 0xA4 ; 164 b5ca: 30 41 sbci r19, 0x10 ; 16 // skip to the start and find the nonzero command. for (_bufindr = 0; cmdbuffer[_bufindr] == 0; ++ _bufindr) ; b5cc: a1 91 ld r26, Z+ b5ce: aa 23 and r26, r26 b5d0: d1 f3 breq .-12 ; 0xb5c6 b5d2: d0 cf rjmp .-96 ; 0xb574 } } return sdlen; } b5d4: 08 95 ret 0000b5d6 : memset((void*)adc_values, 0, sizeof(adc_values)); } static void adc_setmux(uint8_t ch) { ch &= 0x0f; b5d6: 98 2f mov r25, r24 b5d8: 9f 70 andi r25, 0x0F ; 15 if (ch & 0x08) ADCSRB |= (1 << MUX5); b5da: 83 ff sbrs r24, 3 b5dc: 0d c0 rjmp .+26 ; 0xb5f8 b5de: 80 91 7b 00 lds r24, 0x007B ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> b5e2: 88 60 ori r24, 0x08 ; 8 else ADCSRB &= ~(1 << MUX5); b5e4: 80 93 7b 00 sts 0x007B, r24 ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); b5e8: 80 91 7c 00 lds r24, 0x007C ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> b5ec: 88 7f andi r24, 0xF8 ; 248 b5ee: 97 70 andi r25, 0x07 ; 7 b5f0: 89 2b or r24, r25 b5f2: 80 93 7c 00 sts 0x007C, r24 ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> } b5f6: 08 95 ret static void adc_setmux(uint8_t ch) { ch &= 0x0f; if (ch & 0x08) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); b5f8: 80 91 7b 00 lds r24, 0x007B ; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b> b5fc: 87 7f andi r24, 0xF7 ; 247 b5fe: f2 cf rjmp .-28 ; 0xb5e4 0000b600 : 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)); }; static inline uint8_t code_value_uint8() { return uint8_t(strtol(strchr_pointer+1, NULL, 10)); }; b600: 80 91 93 03 lds r24, 0x0393 ; 0x800393 b604: 90 91 94 03 lds r25, 0x0394 ; 0x800394 b608: 4a e0 ldi r20, 0x0A ; 10 b60a: 50 e0 ldi r21, 0x00 ; 0 b60c: 70 e0 ldi r23, 0x00 ; 0 b60e: 60 e0 ldi r22, 0x00 ; 0 b610: 01 96 adiw r24, 0x01 ; 1 b612: 0f 94 9b d7 call 0x3af36 ; 0x3af36 b616: 86 2f mov r24, r22 b618: 08 95 ret 0000b61a : // 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)); }; b61a: 80 91 93 03 lds r24, 0x0393 ; 0x800393 b61e: 90 91 94 03 lds r25, 0x0394 ; 0x800394 b622: 4a e0 ldi r20, 0x0A ; 10 b624: 50 e0 ldi r21, 0x00 ; 0 b626: 70 e0 ldi r23, 0x00 ; 0 b628: 60 e0 ldi r22, 0x00 ; 0 b62a: 01 96 adiw r24, 0x01 ; 1 b62c: 0f 94 9b d7 call 0x3af36 ; 0x3af36 b630: cb 01 movw r24, r22 b632: 08 95 ret 0000b634 : // 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); } b634: 80 91 93 03 lds r24, 0x0393 ; 0x800393 b638: 90 91 94 03 lds r25, 0x0394 ; 0x800394 b63c: 4a e0 ldi r20, 0x0A ; 10 b63e: 50 e0 ldi r21, 0x00 ; 0 b640: 70 e0 ldi r23, 0x00 ; 0 b642: 60 e0 ldi r22, 0x00 ; 0 b644: 01 96 adiw r24, 0x01 ; 1 b646: 0d 94 9b d7 jmp 0x3af36 ; 0x3af36 0000b64a : // 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; b64a: 80 91 9a 04 lds r24, 0x049A ; 0x80049a b64e: 90 91 9b 04 lds r25, 0x049B ; 0x80049b b652: 90 93 99 04 sts 0x0499, r25 ; 0x800499 b656: 80 93 98 04 sts 0x0498, r24 ; 0x800498 void FlushSerialRequestResend() { //char cmdbuffer[bufindr][100]="Resend:"; MYSERIAL.flush(); printf_P(_N("%S: %ld\n%S\n"), _n("Resend"), gcode_LastN + 1, MSG_OK); b65a: 81 e5 ldi r24, 0x51 ; 81 b65c: 9d e6 ldi r25, 0x6D ; 109 b65e: 9f 93 push r25 b660: 8f 93 push r24 b662: 80 91 78 03 lds r24, 0x0378 ; 0x800378 b666: 90 91 79 03 lds r25, 0x0379 ; 0x800379 b66a: a0 91 7a 03 lds r26, 0x037A ; 0x80037a b66e: b0 91 7b 03 lds r27, 0x037B ; 0x80037b b672: 01 96 adiw r24, 0x01 ; 1 b674: a1 1d adc r26, r1 b676: b1 1d adc r27, r1 b678: bf 93 push r27 b67a: af 93 push r26 b67c: 9f 93 push r25 b67e: 8f 93 push r24 b680: 8f ed ldi r24, 0xDF ; 223 b682: 95 e6 ldi r25, 0x65 ; 101 b684: 9f 93 push r25 b686: 8f 93 push r24 b688: 86 ee ldi r24, 0xE6 ; 230 b68a: 95 e6 ldi r25, 0x65 ; 101 b68c: 9f 93 push r25 b68e: 8f 93 push r24 b690: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 b694: 8d b7 in r24, 0x3d ; 61 b696: 9e b7 in r25, 0x3e ; 62 b698: 0a 96 adiw r24, 0x0a ; 10 b69a: 0f b6 in r0, 0x3f ; 63 b69c: f8 94 cli b69e: 9e bf out 0x3e, r25 ; 62 b6a0: 0f be out 0x3f, r0 ; 63 b6a2: 8d bf out 0x3d, r24 ; 61 } b6a4: 08 95 ret 0000b6a6 : 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) { b6a6: 0f 93 push r16 b6a8: 1f 93 push r17 b6aa: cf 93 push r28 b6ac: df 93 push r29 b6ae: ec 01 movw r28, r24 b6b0: c6 0f add r28, r22 b6b2: d7 1f adc r29, r23 const uint8_t *p = (const uint8_t*)__p; while (__n--) { b6b4: 8c 17 cp r24, r28 b6b6: 9d 07 cpc r25, r29 b6b8: 79 f0 breq .+30 ; 0xb6d8 if (eeprom_read_byte(p++) != EEPROM_EMPTY_VALUE) b6ba: 8c 01 movw r16, r24 b6bc: 0f 5f subi r16, 0xFF ; 255 b6be: 1f 4f sbci r17, 0xFF ; 255 b6c0: 0f 94 10 dc call 0x3b820 ; 0x3b820 b6c4: 8f 3f cpi r24, 0xFF ; 255 b6c6: 31 f0 breq .+12 ; 0xb6d4 return true; b6c8: 81 e0 ldi r24, 0x01 ; 1 } return false; } b6ca: df 91 pop r29 b6cc: cf 91 pop r28 b6ce: 1f 91 pop r17 b6d0: 0f 91 pop r16 b6d2: 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) b6d4: c8 01 movw r24, r16 b6d6: ee cf rjmp .-36 ; 0xb6b4 return true; } return false; b6d8: 80 e0 ldi r24, 0x00 ; 0 b6da: f7 cf rjmp .-18 ; 0xb6ca 0000b6dc : #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; } b6dc: 68 2f mov r22, r24 b6de: 88 0f add r24, r24 b6e0: 77 0b sbc r23, r23 b6e2: 80 91 91 12 lds r24, 0x1291 ; 0x801291 b6e6: 90 91 92 12 lds r25, 0x1292 ; 0x801292 b6ea: 89 55 subi r24, 0x59 ; 89 b6ec: 9f 4e sbci r25, 0xEF ; 239 b6ee: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce b6f2: 9c 01 movw r18, r24 b6f4: 90 93 94 03 sts 0x0394, r25 ; 0x800394 b6f8: 80 93 93 03 sts 0x0393, r24 ; 0x800393 b6fc: 81 e0 ldi r24, 0x01 ; 1 b6fe: 23 2b or r18, r19 b700: 09 f4 brne .+2 ; 0xb704 b702: 80 e0 ldi r24, 0x00 ; 0 b704: 08 95 ret 0000b706 : #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 { b706: 0f 93 push r16 b708: 1f 93 push r17 b70a: cf 93 push r28 b70c: df 93 push r29 b70e: 8c 01 movw r16, r24 b710: 86 2f mov r24, r22 b712: ea 01 movw r28, r20 if (code_seen(code)) { b714: 0e 94 6e 5b call 0xb6dc ; 0xb6dc b718: 88 23 and r24, r24 b71a: 19 f1 breq .+70 ; 0xb762 // Verify value is within allowed range int16_t temp = code_value_short(); b71c: 0e 94 0d 5b call 0xb61a ; 0xb61a if (abs(temp) > BED_ADJUSTMENT_UM_MAX) { b720: 9c 01 movw r18, r24 b722: 97 ff sbrs r25, 7 b724: 03 c0 rjmp .+6 ; 0xb72c b726: 31 95 neg r19 b728: 21 95 neg r18 b72a: 31 09 sbc r19, r1 b72c: 25 36 cpi r18, 0x65 ; 101 b72e: 31 05 cpc r19, r1 b730: 9c f0 brlt .+38 ; 0xb758 printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp); b732: 9f 93 push r25 b734: 8f 93 push r24 b736: 8a ec ldi r24, 0xCA ; 202 b738: 9a ea ldi r25, 0xAA ; 170 b73a: 9f 93 push r25 b73c: 8f 93 push r24 b73e: 83 ef ldi r24, 0xF3 ; 243 b740: 9b e7 ldi r25, 0x7B ; 123 b742: 9f 93 push r25 b744: 8f 93 push r24 b746: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 b74a: 0f 90 pop r0 b74c: 0f 90 pop r0 b74e: 0f 90 pop r0 b750: 0f 90 pop r0 b752: 0f 90 pop r0 b754: 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; b756: 80 e0 ldi r24, 0x00 ; 0 }; b758: df 91 pop r29 b75a: cf 91 pop r28 b75c: 1f 91 pop r17 b75e: 0f 91 pop r16 b760: 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) { b762: f8 01 movw r30, r16 b764: 80 81 ld r24, Z b766: 88 23 and r24, r24 b768: b1 f3 breq .-20 ; 0xb756 return (int8_t)eeprom_read_byte(eep_address); b76a: ce 01 movw r24, r28 } return 0; }; b76c: df 91 pop r29 b76e: cf 91 pop r28 b770: 1f 91 pop r17 b772: 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); b774: 0d 94 10 dc jmp 0x3b820 ; 0x3b820 0000b778 : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); b778: 60 e0 ldi r22, 0x00 ; 0 b77a: 86 e6 ldi r24, 0x66 ; 102 b77c: 9f e0 ldi r25, 0x0F ; 15 b77e: 0f 94 34 dc call 0x3b868 ; 0x3b868 b782: 60 e0 ldi r22, 0x00 ; 0 b784: 88 e6 ldi r24, 0x68 ; 104 b786: 9f e0 ldi r25, 0x0F ; 15 b788: 0f 94 34 dc call 0x3b868 ; 0x3b868 b78c: 60 e0 ldi r22, 0x00 ; 0 b78e: 85 e6 ldi r24, 0x65 ; 101 b790: 9f e0 ldi r25, 0x0F ; 15 b792: 0f 94 34 dc call 0x3b868 ; 0x3b868 b796: 60 e0 ldi r22, 0x00 ; 0 b798: 84 e6 ldi r24, 0x64 ; 100 b79a: 9f e0 ldi r25, 0x0F ; 15 b79c: 0f 94 34 dc call 0x3b868 ; 0x3b868 b7a0: 60 e0 ldi r22, 0x00 ; 0 b7a2: 82 ed ldi r24, 0xD2 ; 210 b7a4: 9e e0 ldi r25, 0x0E ; 14 b7a6: 0f 94 34 dc call 0x3b868 ; 0x3b868 b7aa: 60 e0 ldi r22, 0x00 ; 0 b7ac: 8f ec ldi r24, 0xCF ; 207 b7ae: 9e e0 ldi r25, 0x0E ; 14 b7b0: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0000b7b4 : // 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) b7b4: 80 36 cpi r24, 0x60 ; 96 b7b6: 91 05 cpc r25, r1 b7b8: f8 f4 brcc .+62 ; 0xb7f8 return false; if (bufindr == bufindw && buflen > 0) b7ba: 40 91 91 12 lds r20, 0x1291 ; 0x801291 b7be: 50 91 92 12 lds r21, 0x1292 ; 0x801292 b7c2: 20 91 9f 10 lds r18, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> b7c6: 30 91 a0 10 lds r19, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> b7ca: 42 17 cp r20, r18 b7cc: 53 07 cpc r21, r19 b7ce: 39 f4 brne .+14 ; 0xb7de b7d0: 60 91 a2 10 lds r22, 0x10A2 ; 0x8010a2 b7d4: 70 91 a3 10 lds r23, 0x10A3 ; 0x8010a3 b7d8: 16 16 cp r1, r22 b7da: 17 06 cpc r1, r23 b7dc: 6c f0 brlt .+26 ; 0xb7f8 // 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); b7de: b9 01 movw r22, r18 b7e0: 68 0f add r22, r24 b7e2: 79 1f adc r23, r25 b7e4: fb 01 movw r30, r22 b7e6: e3 59 subi r30, 0x93 ; 147 b7e8: ff 4f sbci r31, 0xFF ; 255 if (bufindw < bufindr) b7ea: 24 17 cp r18, r20 b7ec: 35 07 cpc r19, r21 b7ee: 30 f4 brcc .+12 ; 0xb7fc // Simple case. There is a contiguous space between the write buffer and the read buffer. return endw + CMDBUFFER_RESERVE_FRONT <= bufindr; b7f0: 81 e0 ldi r24, 0x01 ; 1 b7f2: 4e 17 cp r20, r30 b7f4: 5f 07 cpc r21, r31 b7f6: 08 f4 brcc .+2 ; 0xb7fa // 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; b7f8: 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; } b7fa: 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? b7fc: ee 3e cpi r30, 0xEE ; 238 b7fe: f1 40 sbci r31, 0x01 ; 1 b800: f8 f0 brcs .+62 ; 0xb840 // 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); b802: 6c 5f subi r22, 0xFC ; 252 b804: 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) || b806: 6e 3e cpi r22, 0xEE ; 238 b808: 71 40 sbci r23, 0x01 ; 1 b80a: 18 f4 brcc .+6 ; 0xb812 // Could one fit to the end, and the reserve to the start? (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr)) b80c: 49 36 cpi r20, 0x69 ; 105 b80e: 51 05 cpc r21, r1 b810: b8 f4 brcc .+46 ; 0xb840 return true; // Could one fit both to the start? if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) { b812: 83 59 subi r24, 0x93 ; 147 b814: 9f 4f sbci r25, 0xFF ; 255 b816: 48 17 cp r20, r24 b818: 59 07 cpc r21, r25 b81a: 70 f3 brcs .-36 ; 0xb7f8 // Mark the rest of the buffer as used. memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw); b81c: 4d ee ldi r20, 0xED ; 237 b81e: 51 e0 ldi r21, 0x01 ; 1 b820: 42 1b sub r20, r18 b822: 53 0b sbc r21, r19 b824: 70 e0 ldi r23, 0x00 ; 0 b826: 60 e0 ldi r22, 0x00 ; 0 b828: c9 01 movw r24, r18 b82a: 8c 55 subi r24, 0x5C ; 92 b82c: 9f 4e sbci r25, 0xEF ; 239 b82e: 0f 94 42 e2 call 0x3c484 ; 0x3c484 // 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; } b832: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); b834: f8 94 cli b836: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> b83a: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; b83e: 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; b840: 81 e0 ldi r24, 0x01 ; 1 b842: 08 95 ret 0000b844 : //we have no temp compensation data } } #endif //ndef PINDA_THERMISTOR float temp_comp_interpolation(float inp_temperature) { b844: 2f 92 push r2 b846: 3f 92 push r3 b848: 4f 92 push r4 b84a: 5f 92 push r5 b84c: 6f 92 push r6 b84e: 7f 92 push r7 b850: 8f 92 push r8 b852: 9f 92 push r9 b854: af 92 push r10 b856: bf 92 push r11 b858: cf 92 push r12 b85a: df 92 push r13 b85c: ef 92 push r14 b85e: ff 92 push r15 b860: 0f 93 push r16 b862: 1f 93 push r17 b864: cf 93 push r28 b866: df 93 push r29 b868: cd b7 in r28, 0x3d ; 61 b86a: de b7 in r29, 0x3e ; 62 b86c: cc 58 subi r28, 0x8C ; 140 b86e: d2 40 sbci r29, 0x02 ; 2 b870: 0f b6 in r0, 0x3f ; 63 b872: f8 94 cli b874: de bf out 0x3e, r29 ; 62 b876: 0f be out 0x3f, r0 ; 63 b878: cd bf out 0x3d, r28 ; 61 b87a: cb 58 subi r28, 0x8B ; 139 b87c: dd 4f sbci r29, 0xFD ; 253 b87e: 68 83 st Y, r22 b880: 79 83 std Y+1, r23 ; 0x01 b882: 8a 83 std Y+2, r24 ; 0x02 b884: 9b 83 std Y+3, r25 ; 0x03 b886: c5 57 subi r28, 0x75 ; 117 b888: 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; b88a: fe 01 movw r30, r28 b88c: e7 54 subi r30, 0x47 ; 71 b88e: fe 4f sbci r31, 0xFE ; 254 b890: 88 e2 ldi r24, 0x28 ; 40 b892: df 01 movw r26, r30 b894: 1d 92 st X+, r1 b896: 8a 95 dec r24 b898: e9 f7 brne .-6 ; 0xb894 b89a: e8 5b subi r30, 0xB8 ; 184 b89c: f1 40 sbci r31, 0x01 ; 1 b89e: 1f 01 movw r2, r30 b8a0: 80 e9 ldi r24, 0x90 ; 144 b8a2: 91 e0 ldi r25, 0x01 ; 1 b8a4: df 01 movw r26, r30 b8a6: fc 01 movw r30, r24 b8a8: 1d 92 st X+, r1 b8aa: 31 97 sbiw r30, 0x01 ; 1 b8ac: e9 f7 brne .-6 ; 0xb8a8 int shift[10]; int temp_C[10]; n = 6; //number of measured points shift[0] = 0; b8ae: c7 5a subi r28, 0xA7 ; 167 b8b0: dd 4f sbci r29, 0xFD ; 253 b8b2: 19 82 std Y+1, r1 ; 0x01 b8b4: 18 82 st Y, r1 b8b6: c9 55 subi r28, 0x59 ; 89 b8b8: d2 40 sbci r29, 0x02 ; 2 b8ba: 9e 01 movw r18, r28 b8bc: 2f 51 subi r18, 0x1F ; 31 b8be: 3e 4f sbci r19, 0xFE ; 254 b8c0: c1 59 subi r28, 0x91 ; 145 b8c2: dd 4f sbci r29, 0xFD ; 253 b8c4: 39 83 std Y+1, r19 ; 0x01 b8c6: 28 83 st Y, r18 b8c8: cf 56 subi r28, 0x6F ; 111 b8ca: d2 40 sbci r29, 0x02 ; 2 b8cc: 8e 01 movw r16, r28 b8ce: 07 5a subi r16, 0xA7 ; 167 b8d0: 1d 4f sbci r17, 0xFD ; 253 b8d2: ce 01 movw r24, r28 b8d4: 8f 5c subi r24, 0xCF ; 207 b8d6: 9d 4f sbci r25, 0xFD ; 253 b8d8: c3 59 subi r28, 0x93 ; 147 b8da: dd 4f sbci r29, 0xFD ; 253 b8dc: 99 83 std Y+1, r25 ; 0x01 b8de: 88 83 st Y, r24 b8e0: cd 56 subi r28, 0x6D ; 109 b8e2: d2 40 sbci r29, 0x02 ; 2 b8e4: 3c 01 movw r6, r24 b8e6: 49 01 movw r8, r18 b8e8: 40 eb ldi r20, 0xB0 ; 176 b8ea: a4 2e mov r10, r20 b8ec: 4f e0 ldi r20, 0x0F ; 15 b8ee: b4 2e mov r11, r20 b8f0: 53 e2 ldi r21, 0x23 ; 35 b8f2: c5 2e mov r12, r21 b8f4: d1 2c mov r13, r1 for (i = 0; i < n; i++) { b8f6: f1 2c mov r15, r1 b8f8: 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]; b8fa: b6 01 movw r22, r12 b8fc: 0d 2c mov r0, r13 b8fe: 00 0c add r0, r0 b900: 88 0b sbc r24, r24 b902: 99 0b sbc r25, r25 b904: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> b908: d4 01 movw r26, r8 b90a: 6d 93 st X+, r22 b90c: 7d 93 st X+, r23 b90e: 8d 93 st X+, r24 b910: 9d 93 st X+, r25 b912: 4d 01 movw r8, r26 f[i] = (float)shift[i]; b914: f8 01 movw r30, r16 b916: 61 91 ld r22, Z+ b918: 71 91 ld r23, Z+ b91a: 8f 01 movw r16, r30 b91c: 07 2e mov r0, r23 b91e: 00 0c add r0, r0 b920: 88 0b sbc r24, r24 b922: 99 0b sbc r25, r25 b924: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> b928: d3 01 movw r26, r6 b92a: 6d 93 st X+, r22 b92c: 7d 93 st X+, r23 b92e: 8d 93 st X+, r24 b930: 9d 93 st X+, r25 b932: 3d 01 movw r6, r26 int temp_C[10]; n = 6; //number of measured points shift[0] = 0; for (i = 0; i < n; i++) { b934: bf ef ldi r27, 0xFF ; 255 b936: eb 1a sub r14, r27 b938: fb 0a sbc r15, r27 b93a: e6 e0 ldi r30, 0x06 ; 6 b93c: ee 16 cp r14, r30 b93e: f1 04 cpc r15, r1 b940: 09 f0 breq .+2 ; 0xb944 b942: 38 c3 rjmp .+1648 ; 0xbfb4 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; b944: cb 58 subi r28, 0x8B ; 139 b946: dd 4f sbci r29, 0xFD ; 253 b948: 28 81 ld r18, Y b94a: 39 81 ldd r19, Y+1 ; 0x01 b94c: 4a 81 ldd r20, Y+2 ; 0x02 b94e: 5b 81 ldd r21, Y+3 ; 0x03 b950: c5 57 subi r28, 0x75 ; 117 b952: d2 40 sbci r29, 0x02 ; 2 b954: c1 59 subi r28, 0x91 ; 145 b956: dd 4f sbci r29, 0xFD ; 253 b958: a8 81 ld r26, Y b95a: b9 81 ldd r27, Y+1 ; 0x01 b95c: cf 56 subi r28, 0x6F ; 111 b95e: d2 40 sbci r29, 0x02 ; 2 b960: 6d 91 ld r22, X+ b962: 7d 91 ld r23, X+ b964: 8d 91 ld r24, X+ b966: 9c 91 ld r25, X b968: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> b96c: 41 2c mov r4, r1 b96e: 51 2c mov r5, r1 b970: 32 01 movw r6, r4 b972: 18 16 cp r1, r24 b974: 0c f4 brge .+2 ; 0xb978 b976: 02 c3 rjmp .+1540 ; 0xbf7c b978: c3 59 subi r28, 0x93 ; 147 b97a: dd 4f sbci r29, 0xFD ; 253 b97c: 08 81 ld r16, Y b97e: 19 81 ldd r17, Y+1 ; 0x01 b980: cd 56 subi r28, 0x6D ; 109 b982: d2 40 sbci r29, 0x02 ; 2 b984: 0c 5e subi r16, 0xEC ; 236 b986: 1f 4f sbci r17, 0xFF ; 255 b988: c1 59 subi r28, 0x91 ; 145 b98a: dd 4f sbci r29, 0xFD ; 253 b98c: e8 80 ld r14, Y b98e: f9 80 ldd r15, Y+1 ; 0x01 b990: cf 56 subi r28, 0x6F ; 111 b992: d2 40 sbci r29, 0x02 ; 2 b994: b4 e1 ldi r27, 0x14 ; 20 b996: eb 0e add r14, r27 b998: f1 1c adc r15, r1 b99a: 6e 01 movw r12, r28 b99c: ef ed ldi r30, 0xDF ; 223 b99e: ce 1a sub r12, r30 b9a0: ed ef ldi r30, 0xFD ; 253 b9a2: de 0a sbc r13, r30 b9a4: 9e 01 movw r18, r28 b9a6: 2b 55 subi r18, 0x5B ; 91 b9a8: 3e 4f sbci r19, 0xFE ; 254 b9aa: cf 58 subi r28, 0x8F ; 143 b9ac: dd 4f sbci r29, 0xFD ; 253 b9ae: 39 83 std Y+1, r19 ; 0x01 b9b0: 28 83 st Y, r18 b9b2: c1 57 subi r28, 0x71 ; 113 b9b4: 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]); b9b6: d8 01 movw r26, r16 b9b8: 4d 90 ld r4, X+ b9ba: 5d 90 ld r5, X+ b9bc: 6d 90 ld r6, X+ b9be: 7c 90 ld r7, X b9c0: f7 01 movw r30, r14 b9c2: 60 81 ld r22, Z b9c4: 71 81 ldd r23, Z+1 ; 0x01 b9c6: 82 81 ldd r24, Z+2 ; 0x02 b9c8: 93 81 ldd r25, Z+3 ; 0x03 b9ca: d7 01 movw r26, r14 b9cc: 5e 91 ld r21, -X b9ce: 4e 91 ld r20, -X b9d0: 3e 91 ld r19, -X b9d2: 2e 91 ld r18, -X b9d4: 7d 01 movw r14, r26 b9d6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> b9da: 4b 01 movw r8, r22 b9dc: 5c 01 movw r10, r24 b9de: f8 01 movw r30, r16 b9e0: 52 91 ld r21, -Z b9e2: 42 91 ld r20, -Z b9e4: 32 91 ld r19, -Z b9e6: 22 91 ld r18, -Z b9e8: 8f 01 movw r16, r30 b9ea: c3 01 movw r24, r6 b9ec: b2 01 movw r22, r4 b9ee: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> b9f2: a5 01 movw r20, r10 b9f4: 94 01 movw r18, r8 b9f6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> b9fa: d6 01 movw r26, r12 b9fc: 9e 93 st -X, r25 b9fe: 8e 93 st -X, r24 ba00: 7e 93 st -X, r23 ba02: 6e 93 st -X, r22 ba04: 6d 01 movw r12, r26 h[i - 1] = x[i] - x[i - 1]; ba06: cf 58 subi r28, 0x8F ; 143 ba08: dd 4f sbci r29, 0xFD ; 253 ba0a: e8 81 ld r30, Y ba0c: f9 81 ldd r31, Y+1 ; 0x01 ba0e: c1 57 subi r28, 0x71 ; 113 ba10: d2 40 sbci r29, 0x02 ; 2 ba12: b2 92 st -Z, r11 ba14: a2 92 st -Z, r10 ba16: 92 92 st -Z, r9 ba18: 82 92 st -Z, r8 ba1a: cf 58 subi r28, 0x8F ; 143 ba1c: dd 4f sbci r29, 0xFD ; 253 ba1e: f9 83 std Y+1, r31 ; 0x01 ba20: e8 83 st Y, r30 ba22: c1 57 subi r28, 0x71 ; 113 ba24: 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--) { ba26: c3 59 subi r28, 0x93 ; 147 ba28: dd 4f sbci r29, 0xFD ; 253 ba2a: 28 81 ld r18, Y ba2c: 39 81 ldd r19, Y+1 ; 0x01 ba2e: cd 56 subi r28, 0x6D ; 109 ba30: d2 40 sbci r29, 0x02 ; 2 ba32: 02 17 cp r16, r18 ba34: 13 07 cpc r17, r19 ba36: 09 f0 breq .+2 ; 0xba3a ba38: be cf rjmp .-132 ; 0xb9b6 ba3a: 4e 01 movw r8, r28 ba3c: 3f e6 ldi r19, 0x6F ; 111 ba3e: 83 1a sub r8, r19 ba40: 3e ef ldi r19, 0xFE ; 254 ba42: 93 0a sbc r9, r19 ba44: 5e 01 movw r10, r28 ba46: 83 ef ldi r24, 0xF3 ; 243 ba48: a8 1a sub r10, r24 ba4a: 8d ef ldi r24, 0xFD ; 253 ba4c: b8 0a sbc r11, r24 ba4e: 61 01 movw r12, r2 ba50: 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 ba74: 9b 01 movw r18, r22 ba76: ac 01 movw r20, r24 ba78: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> ba7c: f8 01 movw r30, r16 ba7e: 64 a7 std Z+44, r22 ; 0x2c ba80: 75 a7 std Z+45, r23 ; 0x2d ba82: 86 a7 std Z+46, r24 ; 0x2e ba84: 97 a7 std Z+47, r25 ; 0x2f if (i != 1) { ba86: f1 e0 ldi r31, 0x01 ; 1 ba88: ef 16 cp r14, r31 ba8a: f1 04 cpc r15, r1 ba8c: 61 f0 breq .+24 ; 0xbaa6 m[i][i - 1] = h[i - 1]; ba8e: d8 01 movw r26, r16 ba90: 98 96 adiw r26, 0x28 ; 40 ba92: 4d 92 st X+, r4 ba94: 5d 92 st X+, r5 ba96: 6d 92 st X+, r6 ba98: 7c 92 st X, r7 ba9a: 9b 97 sbiw r26, 0x2b ; 43 m[i - 1][i] = h[i - 1]; ba9c: f8 01 movw r30, r16 ba9e: 44 82 std Z+4, r4 ; 0x04 baa0: 55 82 std Z+5, r5 ; 0x05 baa2: 66 82 std Z+6, r6 ; 0x06 baa4: 77 82 std Z+7, r7 ; 0x07 } m[i][n - 1] = 6 * (F[i + 1] - F[i]); baa6: ff ef ldi r31, 0xFF ; 255 baa8: ef 1a sub r14, r31 baaa: ff 0a sbc r15, r31 baac: f5 01 movw r30, r10 baae: 20 81 ld r18, Z bab0: 31 81 ldd r19, Z+1 ; 0x01 bab2: 42 81 ldd r20, Z+2 ; 0x02 bab4: 53 81 ldd r21, Z+3 ; 0x03 bab6: 84 e0 ldi r24, 0x04 ; 4 bab8: a8 0e add r10, r24 baba: b1 1c adc r11, r1 babc: 64 81 ldd r22, Z+4 ; 0x04 babe: 75 81 ldd r23, Z+5 ; 0x05 bac0: 86 81 ldd r24, Z+6 ; 0x06 bac2: 97 81 ldd r25, Z+7 ; 0x07 bac4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bac8: 20 e0 ldi r18, 0x00 ; 0 baca: 30 e0 ldi r19, 0x00 ; 0 bacc: 40 ec ldi r20, 0xC0 ; 192 bace: 50 e4 ldi r21, 0x40 ; 64 bad0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bad4: d6 01 movw r26, r12 bad6: dc 96 adiw r26, 0x3c ; 60 bad8: 6d 93 st X+, r22 bada: 7d 93 st X+, r23 badc: 8d 93 st X+, r24 bade: 9c 93 st X, r25 bae0: df 97 sbiw r26, 0x3f ; 63 bae2: 04 5d subi r16, 0xD4 ; 212 bae4: 1f 4f sbci r17, 0xFF ; 255 bae6: b8 e2 ldi r27, 0x28 ; 40 bae8: cb 0e add r12, r27 baea: 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 baf4: b1 cf rjmp .-158 ; 0xba58 baf6: 7e 01 movw r14, r28 baf8: fd e2 ldi r31, 0x2D ; 45 bafa: ef 0e add r14, r31 bafc: f1 1c adc r15, r1 bafe: 28 e2 ldi r18, 0x28 ; 40 bb00: a2 2e mov r10, r18 bb02: b1 2c mov r11, r1 bb04: 00 eb ldi r16, 0xB0 ; 176 bb06: 1f ef ldi r17, 0xFF ; 255 bb08: 24 e0 ldi r18, 0x04 ; 4 bb0a: 22 0e add r2, r18 bb0c: 31 1c adc r3, r1 } m[i][n - 1] = 6 * (F[i + 1] - F[i]); } //*********** forward elimination ************** for (i = 1; i bb2a: 2b 01 movw r4, r22 bb2c: 3c 01 movw r6, r24 bb2e: 61 01 movw r12, r2 bb30: c0 1a sub r12, r16 bb32: d1 0a sbc r13, r17 for (j = 1; j <= n - 1; j++) bb34: 88 24 eor r8, r8 bb36: 83 94 inc r8 bb38: 91 2c mov r9, r1 m[i + 1][j] -= temp*m[i][j]; bb3a: f6 01 movw r30, r12 bb3c: e0 0f add r30, r16 bb3e: f1 1f adc r31, r17 bb40: ea 0d add r30, r10 bb42: fb 1d adc r31, r11 bb44: 20 81 ld r18, Z bb46: 31 81 ldd r19, Z+1 ; 0x01 bb48: 42 81 ldd r20, Z+2 ; 0x02 bb4a: 53 81 ldd r21, Z+3 ; 0x03 bb4c: c3 01 movw r24, r6 bb4e: b2 01 movw r22, r4 bb50: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bb54: 9b 01 movw r18, r22 bb56: ac 01 movw r20, r24 bb58: f6 01 movw r30, r12 bb5a: 60 81 ld r22, Z bb5c: 71 81 ldd r23, Z+1 ; 0x01 bb5e: 82 81 ldd r24, Z+2 ; 0x02 bb60: 93 81 ldd r25, Z+3 ; 0x03 bb62: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bb66: d6 01 movw r26, r12 bb68: 6d 93 st X+, r22 bb6a: 7d 93 st X+, r23 bb6c: 8d 93 st X+, r24 bb6e: 9d 93 st X+, r25 bb70: 6d 01 movw r12, r26 m[i][n - 1] = 6 * (F[i + 1] - F[i]); } //*********** forward elimination ************** for (i = 1; i bb80: 3c e2 ldi r19, 0x2C ; 44 bb82: e3 0e add r14, r19 bb84: f1 1c adc r15, r1 bb86: 08 52 subi r16, 0x28 ; 40 bb88: 11 09 sbc r17, r1 bb8a: 88 e2 ldi r24, 0x28 ; 40 bb8c: a8 0e add r10, r24 bb8e: 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 bb98: ba cf rjmp .-140 ; 0xbb0e bb9a: 1e 01 movw r2, r28 bb9c: f5 eb ldi r31, 0xB5 ; 181 bb9e: 2f 0e add r2, r31 bba0: 31 1c adc r3, r1 bba2: 6e 01 movw r12, r28 bba4: 21 eb ldi r18, 0xB1 ; 177 bba6: c2 0e add r12, r18 bba8: d1 1c adc r13, r1 bbaa: 7e 01 movw r14, r28 bbac: 37 e3 ldi r19, 0x37 ; 55 bbae: e3 1a sub r14, r19 bbb0: 3e ef ldi r19, 0xFE ; 254 bbb2: 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--) { bbb4: 04 e0 ldi r16, 0x04 ; 4 bbb6: 10 e0 ldi r17, 0x00 ; 0 bbb8: 48 01 movw r8, r16 bbba: b1 2c mov r11, r1 bbbc: a1 2c mov r10, r1 sum = 0; bbbe: 41 2c mov r4, r1 bbc0: 51 2c mov r5, r1 bbc2: 32 01 movw r6, r4 for (j = i; j <= n - 2; j++) sum += m[i][j] * s[j]; bbc4: f6 01 movw r30, r12 bbc6: ea 0d add r30, r10 bbc8: fb 1d adc r31, r11 bbca: d7 01 movw r26, r14 bbcc: aa 0d add r26, r10 bbce: bb 1d adc r27, r11 bbd0: 2d 91 ld r18, X+ bbd2: 3d 91 ld r19, X+ bbd4: 4d 91 ld r20, X+ bbd6: 5c 91 ld r21, X bbd8: 60 81 ld r22, Z bbda: 71 81 ldd r23, Z+1 ; 0x01 bbdc: 82 81 ldd r24, Z+2 ; 0x02 bbde: 93 81 ldd r25, Z+3 ; 0x03 bbe0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bbe4: 9b 01 movw r18, r22 bbe6: ac 01 movw r20, r24 bbe8: c3 01 movw r24, r6 bbea: b2 01 movw r22, r4 bbec: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> bbf0: 2b 01 movw r4, r22 bbf2: 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++) bbf4: 8f ef ldi r24, 0xFF ; 255 bbf6: 88 1a sub r8, r24 bbf8: 98 0a sbc r9, r24 bbfa: 94 e0 ldi r25, 0x04 ; 4 bbfc: a9 0e add r10, r25 bbfe: b1 1c adc r11, r1 bc00: a5 e0 ldi r26, 0x05 ; 5 bc02: 8a 16 cp r8, r26 bc04: 91 04 cpc r9, r1 bc06: f1 f6 brne .-68 ; 0xbbc4 sum += m[i][j] * s[j]; s[i] = (m[i][n - 1] - sum) / m[i][i]; bc08: a3 01 movw r20, r6 bc0a: 92 01 movw r18, r4 bc0c: f1 01 movw r30, r2 bc0e: 60 81 ld r22, Z bc10: 71 81 ldd r23, Z+1 ; 0x01 bc12: 82 81 ldd r24, Z+2 ; 0x02 bc14: 93 81 ldd r25, Z+3 ; 0x03 bc16: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bc1a: d6 01 movw r26, r12 bc1c: 2d 91 ld r18, X+ bc1e: 3d 91 ld r19, X+ bc20: 4d 91 ld r20, X+ bc22: 5c 91 ld r21, X bc24: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> bc28: f7 01 movw r30, r14 bc2a: 60 83 st Z, r22 bc2c: 71 83 std Z+1, r23 ; 0x01 bc2e: 82 83 std Z+2, r24 ; 0x02 bc30: 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--) { bc32: 01 50 subi r16, 0x01 ; 1 bc34: 11 09 sbc r17, r1 bc36: f8 e2 ldi r31, 0x28 ; 40 bc38: 2f 1a sub r2, r31 bc3a: 31 08 sbc r3, r1 bc3c: 2c e2 ldi r18, 0x2C ; 44 bc3e: c2 1a sub r12, r18 bc40: d1 08 sbc r13, r1 bc42: 34 e0 ldi r19, 0x04 ; 4 bc44: e3 1a sub r14, r19 bc46: f1 08 sbc r15, r1 bc48: 01 15 cp r16, r1 bc4a: 11 05 cpc r17, r1 bc4c: 09 f0 breq .+2 ; 0xbc50 bc4e: b4 cf rjmp .-152 ; 0xbbb8 sum += m[i][j] * s[j]; s[i] = (m[i][n - 1] - sum) / m[i][i]; } for (i = 0; i x[i + 1])) { bc50: cb 50 subi r28, 0x0B ; 11 bc52: de 4f sbci r29, 0xFE ; 254 bc54: 88 81 ld r24, Y bc56: 99 81 ldd r25, Y+1 ; 0x01 bc58: aa 81 ldd r26, Y+2 ; 0x02 bc5a: bb 81 ldd r27, Y+3 ; 0x03 bc5c: c5 5f subi r28, 0xF5 ; 245 bc5e: d1 40 sbci r29, 0x01 ; 1 bc60: cf 57 subi r28, 0x7F ; 127 bc62: dd 4f sbci r29, 0xFD ; 253 bc64: 88 83 st Y, r24 bc66: 99 83 std Y+1, r25 ; 0x01 bc68: aa 83 std Y+2, r26 ; 0x02 bc6a: bb 83 std Y+3, r27 ; 0x03 bc6c: c1 58 subi r28, 0x81 ; 129 bc6e: d2 40 sbci r29, 0x02 ; 2 bc70: 1e 01 movw r2, r28 bc72: 97 e4 ldi r25, 0x47 ; 71 bc74: 29 1a sub r2, r25 bc76: 9e ef ldi r25, 0xFE ; 254 bc78: 39 0a sbc r3, r25 bc7a: 10 e0 ldi r17, 0x00 ; 0 bc7c: 00 e0 ldi r16, 0x00 ; 0 bc7e: c1 59 subi r28, 0x91 ; 145 bc80: dd 4f sbci r29, 0xFD ; 253 bc82: a8 81 ld r26, Y bc84: b9 81 ldd r27, Y+1 ; 0x01 bc86: cf 56 subi r28, 0x6F ; 111 bc88: d2 40 sbci r29, 0x02 ; 2 bc8a: cd 90 ld r12, X+ bc8c: dd 90 ld r13, X+ bc8e: ed 90 ld r14, X+ bc90: fd 90 ld r15, X+ bc92: c1 59 subi r28, 0x91 ; 145 bc94: dd 4f sbci r29, 0xFD ; 253 bc96: b9 83 std Y+1, r27 ; 0x01 bc98: a8 83 st Y, r26 bc9a: cf 56 subi r28, 0x6F ; 111 bc9c: d2 40 sbci r29, 0x02 ; 2 bc9e: cb 58 subi r28, 0x8B ; 139 bca0: dd 4f sbci r29, 0xFD ; 253 bca2: 28 81 ld r18, Y bca4: 39 81 ldd r19, Y+1 ; 0x01 bca6: 4a 81 ldd r20, Y+2 ; 0x02 bca8: 5b 81 ldd r21, Y+3 ; 0x03 bcaa: c5 57 subi r28, 0x75 ; 117 bcac: d2 40 sbci r29, 0x02 ; 2 bcae: c7 01 movw r24, r14 bcb0: b6 01 movw r22, r12 bcb2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> bcb6: 18 16 cp r1, r24 bcb8: b4 f0 brlt .+44 ; 0xbce6 bcba: cb 58 subi r28, 0x8B ; 139 bcbc: dd 4f sbci r29, 0xFD ; 253 bcbe: 28 81 ld r18, Y bcc0: 39 81 ldd r19, Y+1 ; 0x01 bcc2: 4a 81 ldd r20, Y+2 ; 0x02 bcc4: 5b 81 ldd r21, Y+3 ; 0x03 bcc6: c5 57 subi r28, 0x75 ; 117 bcc8: d2 40 sbci r29, 0x02 ; 2 bcca: c1 59 subi r28, 0x91 ; 145 bccc: dd 4f sbci r29, 0xFD ; 253 bcce: e8 81 ld r30, Y bcd0: f9 81 ldd r31, Y+1 ; 0x01 bcd2: cf 56 subi r28, 0x6F ; 111 bcd4: d2 40 sbci r29, 0x02 ; 2 bcd6: 60 81 ld r22, Z bcd8: 71 81 ldd r23, Z+1 ; 0x01 bcda: 82 81 ldd r24, Z+2 ; 0x02 bcdc: 93 81 ldd r25, Z+3 ; 0x03 bcde: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> bce2: 87 ff sbrs r24, 7 bce4: 18 c0 rjmp .+48 ; 0xbd16 bce6: 04 30 cpi r16, 0x04 ; 4 bce8: 11 05 cpc r17, r1 bcea: 09 f0 breq .+2 ; 0xbcee bcec: 30 c1 rjmp .+608 ; 0xbf4e bcee: cb 58 subi r28, 0x8B ; 139 bcf0: dd 4f sbci r29, 0xFD ; 253 bcf2: 28 81 ld r18, Y bcf4: 39 81 ldd r19, Y+1 ; 0x01 bcf6: 4a 81 ldd r20, Y+2 ; 0x02 bcf8: 5b 81 ldd r21, Y+3 ; 0x03 bcfa: c5 57 subi r28, 0x75 ; 117 bcfc: d2 40 sbci r29, 0x02 ; 2 bcfe: cf 57 subi r28, 0x7F ; 127 bd00: dd 4f sbci r29, 0xFD ; 253 bd02: 68 81 ld r22, Y bd04: 79 81 ldd r23, Y+1 ; 0x01 bd06: 8a 81 ldd r24, Y+2 ; 0x02 bd08: 9b 81 ldd r25, Y+3 ; 0x03 bd0a: c1 58 subi r28, 0x81 ; 129 bd0c: d2 40 sbci r29, 0x02 ; 2 bd0e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> bd12: 87 ff sbrs r24, 7 bd14: 1c c1 rjmp .+568 ; 0xbf4e a = (s[i + 1] - s[i]) / (6 * h[i]); bd16: d1 01 movw r26, r2 bd18: 14 96 adiw r26, 0x04 ; 4 bd1a: 8d 90 ld r8, X+ bd1c: 9d 90 ld r9, X+ bd1e: ad 90 ld r10, X+ bd20: bc 90 ld r11, X bd22: 17 97 sbiw r26, 0x07 ; 7 bd24: 8d 91 ld r24, X+ bd26: 9d 91 ld r25, X+ bd28: 0d 90 ld r0, X+ bd2a: bc 91 ld r27, X bd2c: a0 2d mov r26, r0 bd2e: cf 58 subi r28, 0x8F ; 143 bd30: dd 4f sbci r29, 0xFD ; 253 bd32: 88 83 st Y, r24 bd34: 99 83 std Y+1, r25 ; 0x01 bd36: aa 83 std Y+2, r26 ; 0x02 bd38: bb 83 std Y+3, r27 ; 0x03 bd3a: c1 57 subi r28, 0x71 ; 113 bd3c: d2 40 sbci r29, 0x02 ; 2 bd3e: f8 01 movw r30, r16 bd40: ee 0f add r30, r30 bd42: ff 1f adc r31, r31 bd44: ee 0f add r30, r30 bd46: ff 1f adc r31, r31 bd48: 21 e9 ldi r18, 0x91 ; 145 bd4a: 31 e0 ldi r19, 0x01 ; 1 bd4c: 2c 0f add r18, r28 bd4e: 3d 1f adc r19, r29 bd50: e2 0f add r30, r18 bd52: f3 1f adc r31, r19 bd54: 40 80 ld r4, Z bd56: 51 80 ldd r5, Z+1 ; 0x01 bd58: 62 80 ldd r6, Z+2 ; 0x02 bd5a: 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; bd5c: c3 59 subi r28, 0x93 ; 147 bd5e: dd 4f sbci r29, 0xFD ; 253 bd60: a8 81 ld r26, Y bd62: b9 81 ldd r27, Y+1 ; 0x01 bd64: cd 56 subi r28, 0x6D ; 109 bd66: d2 40 sbci r29, 0x02 ; 2 bd68: 8d 91 ld r24, X+ bd6a: 9d 91 ld r25, X+ bd6c: 0d 90 ld r0, X+ bd6e: bc 91 ld r27, X bd70: a0 2d mov r26, r0 bd72: c3 58 subi r28, 0x83 ; 131 bd74: dd 4f sbci r29, 0xFD ; 253 bd76: 88 83 st Y, r24 bd78: 99 83 std Y+1, r25 ; 0x01 bd7a: aa 83 std Y+2, r26 ; 0x02 bd7c: bb 83 std Y+3, r27 ; 0x03 bd7e: cd 57 subi r28, 0x7D ; 125 bd80: 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; bd82: a7 01 movw r20, r14 bd84: 96 01 movw r18, r12 bd86: cb 58 subi r28, 0x8B ; 139 bd88: dd 4f sbci r29, 0xFD ; 253 bd8a: 68 81 ld r22, Y bd8c: 79 81 ldd r23, Y+1 ; 0x01 bd8e: 8a 81 ldd r24, Y+2 ; 0x02 bd90: 9b 81 ldd r25, Y+3 ; 0x03 bd92: c5 57 subi r28, 0x75 ; 117 bd94: d2 40 sbci r29, 0x02 ; 2 bd96: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bd9a: 6b 01 movw r12, r22 bd9c: 7c 01 movw r14, r24 bd9e: 20 e0 ldi r18, 0x00 ; 0 bda0: 30 e0 ldi r19, 0x00 ; 0 bda2: 40 e4 ldi r20, 0x40 ; 64 bda4: 50 e4 ldi r21, 0x40 ; 64 bda6: 0f 94 a8 e0 call 0x3c150 ; 0x3c150 bdaa: cb 57 subi r28, 0x7B ; 123 bdac: dd 4f sbci r29, 0xFD ; 253 bdae: 68 83 st Y, r22 bdb0: 79 83 std Y+1, r23 ; 0x01 bdb2: 8a 83 std Y+2, r24 ; 0x02 bdb4: 9b 83 std Y+3, r25 ; 0x03 bdb6: c5 58 subi r28, 0x85 ; 133 bdb8: 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; bdba: c3 58 subi r28, 0x83 ; 131 bdbc: dd 4f sbci r29, 0xFD ; 253 bdbe: 28 81 ld r18, Y bdc0: 39 81 ldd r19, Y+1 ; 0x01 bdc2: 4a 81 ldd r20, Y+2 ; 0x02 bdc4: 5b 81 ldd r21, Y+3 ; 0x03 bdc6: cd 57 subi r28, 0x7D ; 125 bdc8: d2 40 sbci r29, 0x02 ; 2 bdca: c3 59 subi r28, 0x93 ; 147 bdcc: dd 4f sbci r29, 0xFD ; 253 bdce: e8 81 ld r30, Y bdd0: f9 81 ldd r31, Y+1 ; 0x01 bdd2: cd 56 subi r28, 0x6D ; 109 bdd4: d2 40 sbci r29, 0x02 ; 2 bdd6: 64 81 ldd r22, Z+4 ; 0x04 bdd8: 75 81 ldd r23, Z+5 ; 0x05 bdda: 86 81 ldd r24, Z+6 ; 0x06 bddc: 97 81 ldd r25, Z+7 ; 0x07 bdde: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bde2: a3 01 movw r20, r6 bde4: 92 01 movw r18, r4 bde6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> bdea: c7 58 subi r28, 0x87 ; 135 bdec: dd 4f sbci r29, 0xFD ; 253 bdee: 68 83 st Y, r22 bdf0: 79 83 std Y+1, r23 ; 0x01 bdf2: 8a 83 std Y+2, r24 ; 0x02 bdf4: 9b 83 std Y+3, r25 ; 0x03 bdf6: c9 57 subi r28, 0x79 ; 121 bdf8: d2 40 sbci r29, 0x02 ; 2 bdfa: a3 01 movw r20, r6 bdfc: 92 01 movw r18, r4 bdfe: c3 01 movw r24, r6 be00: b2 01 movw r22, r4 be02: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> be06: cf 58 subi r28, 0x8F ; 143 be08: dd 4f sbci r29, 0xFD ; 253 be0a: 28 81 ld r18, Y be0c: 39 81 ldd r19, Y+1 ; 0x01 be0e: 4a 81 ldd r20, Y+2 ; 0x02 be10: 5b 81 ldd r21, Y+3 ; 0x03 be12: c1 57 subi r28, 0x71 ; 113 be14: d2 40 sbci r29, 0x02 ; 2 be16: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> be1a: c7 57 subi r28, 0x77 ; 119 be1c: dd 4f sbci r29, 0xFD ; 253 be1e: 68 83 st Y, r22 be20: 79 83 std Y+1, r23 ; 0x01 be22: 8a 83 std Y+2, r24 ; 0x02 be24: 9b 83 std Y+3, r25 ; 0x03 be26: c9 58 subi r28, 0x89 ; 137 be28: d2 40 sbci r29, 0x02 ; 2 be2a: a3 01 movw r20, r6 be2c: 92 01 movw r18, r4 be2e: c5 01 movw r24, r10 be30: b4 01 movw r22, r8 be32: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> be36: 9b 01 movw r18, r22 be38: ac 01 movw r20, r24 be3a: c7 57 subi r28, 0x77 ; 119 be3c: dd 4f sbci r29, 0xFD ; 253 be3e: 68 81 ld r22, Y be40: 79 81 ldd r23, Y+1 ; 0x01 be42: 8a 81 ldd r24, Y+2 ; 0x02 be44: 9b 81 ldd r25, Y+3 ; 0x03 be46: c9 58 subi r28, 0x89 ; 137 be48: d2 40 sbci r29, 0x02 ; 2 be4a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> be4e: 20 e0 ldi r18, 0x00 ; 0 be50: 30 e0 ldi r19, 0x00 ; 0 be52: 40 ec ldi r20, 0xC0 ; 192 be54: 50 e4 ldi r21, 0x40 ; 64 be56: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> be5a: 9b 01 movw r18, r22 be5c: ac 01 movw r20, r24 be5e: c7 58 subi r28, 0x87 ; 135 be60: dd 4f sbci r29, 0xFD ; 253 be62: 68 81 ld r22, Y be64: 79 81 ldd r23, Y+1 ; 0x01 be66: 8a 81 ldd r24, Y+2 ; 0x02 be68: 9b 81 ldd r25, Y+3 ; 0x03 be6a: c9 57 subi r28, 0x79 ; 121 be6c: d2 40 sbci r29, 0x02 ; 2 be6e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__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; be72: a7 01 movw r20, r14 be74: 96 01 movw r18, r12 be76: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> be7a: c7 58 subi r28, 0x87 ; 135 be7c: dd 4f sbci r29, 0xFD ; 253 be7e: 68 83 st Y, r22 be80: 79 83 std Y+1, r23 ; 0x01 be82: 8a 83 std Y+2, r24 ; 0x02 be84: 9b 83 std Y+3, r25 ; 0x03 be86: c9 57 subi r28, 0x79 ; 121 be88: 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]); be8a: cf 58 subi r28, 0x8F ; 143 be8c: dd 4f sbci r29, 0xFD ; 253 be8e: 28 81 ld r18, Y be90: 39 81 ldd r19, Y+1 ; 0x01 be92: 4a 81 ldd r20, Y+2 ; 0x02 be94: 5b 81 ldd r21, Y+3 ; 0x03 be96: c1 57 subi r28, 0x71 ; 113 be98: d2 40 sbci r29, 0x02 ; 2 be9a: c5 01 movw r24, r10 be9c: b4 01 movw r22, r8 be9e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> bea2: 4b 01 movw r8, r22 bea4: 5c 01 movw r10, r24 bea6: 20 e0 ldi r18, 0x00 ; 0 bea8: 30 e0 ldi r19, 0x00 ; 0 beaa: 40 ec ldi r20, 0xC0 ; 192 beac: 50 e4 ldi r21, 0x40 ; 64 beae: c3 01 movw r24, r6 beb0: b2 01 movw r22, r4 beb2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> beb6: 9b 01 movw r18, r22 beb8: ac 01 movw r20, r24 beba: c5 01 movw r24, r10 bebc: b4 01 movw r22, r8 bebe: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__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; bec2: cb 57 subi r28, 0x7B ; 123 bec4: dd 4f sbci r29, 0xFD ; 253 bec6: 28 81 ld r18, Y bec8: 39 81 ldd r19, Y+1 ; 0x01 beca: 4a 81 ldd r20, Y+2 ; 0x02 becc: 5b 81 ldd r21, Y+3 ; 0x03 bece: c5 58 subi r28, 0x85 ; 133 bed0: d2 40 sbci r29, 0x02 ; 2 bed2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bed6: 4b 01 movw r8, r22 bed8: 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; beda: 20 e0 ldi r18, 0x00 ; 0 bedc: 30 e0 ldi r19, 0x00 ; 0 bede: 40 e0 ldi r20, 0x00 ; 0 bee0: 5f e3 ldi r21, 0x3F ; 63 bee2: cf 58 subi r28, 0x8F ; 143 bee4: dd 4f sbci r29, 0xFD ; 253 bee6: 68 81 ld r22, Y bee8: 79 81 ldd r23, Y+1 ; 0x01 beea: 8a 81 ldd r24, Y+2 ; 0x02 beec: 9b 81 ldd r25, Y+3 ; 0x03 beee: c1 57 subi r28, 0x71 ; 113 bef0: d2 40 sbci r29, 0x02 ; 2 bef2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bef6: 2b 01 movw r4, r22 bef8: 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; befa: a7 01 movw r20, r14 befc: 96 01 movw r18, r12 befe: c7 01 movw r24, r14 bf00: b6 01 movw r22, r12 bf02: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bf06: 9b 01 movw r18, r22 bf08: ac 01 movw r20, r24 bf0a: c3 01 movw r24, r6 bf0c: b2 01 movw r22, r4 bf0e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> bf12: 9b 01 movw r18, r22 bf14: ac 01 movw r20, r24 bf16: c5 01 movw r24, r10 bf18: b4 01 movw r22, r8 bf1a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> bf1e: 9b 01 movw r18, r22 bf20: ac 01 movw r20, r24 bf22: c7 58 subi r28, 0x87 ; 135 bf24: dd 4f sbci r29, 0xFD ; 253 bf26: 68 81 ld r22, Y bf28: 79 81 ldd r23, Y+1 ; 0x01 bf2a: 8a 81 ldd r24, Y+2 ; 0x02 bf2c: 9b 81 ldd r25, Y+3 ; 0x03 bf2e: c9 57 subi r28, 0x79 ; 121 bf30: d2 40 sbci r29, 0x02 ; 2 bf32: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> bf36: c3 58 subi r28, 0x83 ; 131 bf38: dd 4f sbci r29, 0xFD ; 253 bf3a: 28 81 ld r18, Y bf3c: 39 81 ldd r19, Y+1 ; 0x01 bf3e: 4a 81 ldd r20, Y+2 ; 0x02 bf40: 5b 81 ldd r21, Y+3 ; 0x03 bf42: cd 57 subi r28, 0x7D ; 125 bf44: d2 40 sbci r29, 0x02 ; 2 bf46: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> bf4a: 2b 01 movw r4, r22 bf4c: 3c 01 movw r6, r24 bf4e: 0f 5f subi r16, 0xFF ; 255 bf50: 1f 4f sbci r17, 0xFF ; 255 bf52: f4 e0 ldi r31, 0x04 ; 4 bf54: 2f 0e add r2, r31 bf56: 31 1c adc r3, r1 bf58: c3 59 subi r28, 0x93 ; 147 bf5a: dd 4f sbci r29, 0xFD ; 253 bf5c: 28 81 ld r18, Y bf5e: 39 81 ldd r19, Y+1 ; 0x01 bf60: cd 56 subi r28, 0x6D ; 109 bf62: d2 40 sbci r29, 0x02 ; 2 bf64: 2c 5f subi r18, 0xFC ; 252 bf66: 3f 4f sbci r19, 0xFF ; 255 bf68: c3 59 subi r28, 0x93 ; 147 bf6a: dd 4f sbci r29, 0xFD ; 253 bf6c: 39 83 std Y+1, r19 ; 0x01 bf6e: 28 83 st Y, r18 bf70: cd 56 subi r28, 0x6D ; 109 bf72: 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 bf7a: 81 ce rjmp .-766 ; 0xbc7e sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d; } return sum; } bf7c: c3 01 movw r24, r6 bf7e: b2 01 movw r22, r4 bf80: c4 57 subi r28, 0x74 ; 116 bf82: dd 4f sbci r29, 0xFD ; 253 bf84: 0f b6 in r0, 0x3f ; 63 bf86: f8 94 cli bf88: de bf out 0x3e, r29 ; 62 bf8a: 0f be out 0x3f, r0 ; 63 bf8c: cd bf out 0x3d, r28 ; 61 bf8e: df 91 pop r29 bf90: cf 91 pop r28 bf92: 1f 91 pop r17 bf94: 0f 91 pop r16 bf96: ff 90 pop r15 bf98: ef 90 pop r14 bf9a: df 90 pop r13 bf9c: cf 90 pop r12 bf9e: bf 90 pop r11 bfa0: af 90 pop r10 bfa2: 9f 90 pop r9 bfa4: 8f 90 pop r8 bfa6: 7f 90 pop r7 bfa8: 6f 90 pop r6 bfaa: 5f 90 pop r5 bfac: 4f 90 pop r4 bfae: 3f 90 pop r3 bfb0: 2f 90 pop r2 bfb2: 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)); bfb4: c5 01 movw r24, r10 bfb6: 0f 94 1e dc call 0x3b83c ; 0x3b83c bfba: d8 01 movw r26, r16 bfbc: 8d 93 st X+, r24 bfbe: 9c 93 st X, r25 bfc0: b5 e0 ldi r27, 0x05 ; 5 bfc2: cb 0e add r12, r27 bfc4: d1 1c adc r13, r1 bfc6: e2 e0 ldi r30, 0x02 ; 2 bfc8: ae 0e add r10, r30 bfca: b1 1c adc r11, r1 bfcc: 96 cc rjmp .-1748 ; 0xb8fa 0000bfce : eFilamentAction = FilamentAction::None; } // Common gcode shared by the gcodes. This saves some flash memory static void gcodes_M704_M705_M706(uint16_t gcode) { bfce: 0f 93 push r16 bfd0: 1f 93 push r17 bfd2: cf 93 push r28 uint8_t mmuSlotIndex = 0xffU; if (MMU2::mmu2.Enabled() && code_seen('P')) bfd4: 20 91 b9 13 lds r18, 0x13B9 ; 0x8013b9 bfd8: 21 30 cpi r18, 0x01 ; 1 bfda: 79 f5 brne .+94 ; 0xc03a bfdc: 8c 01 movw r16, r24 bfde: 80 e5 ldi r24, 0x50 ; 80 bfe0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc bfe4: 88 23 and r24, r24 bfe6: 49 f1 breq .+82 ; 0xc03a { mmuSlotIndex = code_value_uint8(); bfe8: 0e 94 00 5b call 0xb600 ; 0xb600 bfec: c8 2f mov r28, r24 if (mmuSlotIndex < MMU_FILAMENT_COUNT) { bfee: 85 30 cpi r24, 0x05 ; 5 bff0: 20 f5 brcc .+72 ; 0xc03a switch (gcode) bff2: 01 3c cpi r16, 0xC1 ; 193 bff4: 82 e0 ldi r24, 0x02 ; 2 bff6: 18 07 cpc r17, r24 bff8: 49 f0 breq .+18 ; 0xc00c bffa: 02 3c cpi r16, 0xC2 ; 194 bffc: 12 40 sbci r17, 0x02 ; 2 bffe: 69 f0 breq .+26 ; 0xc01a { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); c000: 8c 2f mov r24, r28 default: break; } } } } c002: cf 91 pop r28 c004: 1f 91 pop r17 c006: 0f 91 pop r16 mmuSlotIndex = code_value_uint8(); if (mmuSlotIndex < MMU_FILAMENT_COUNT) { switch (gcode) { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); c008: 0d 94 49 ad jmp 0x35a92 ; 0x35a92 break; case 705: MMU2::mmu2.eject_filament(mmuSlotIndex, false); c00c: 60 e0 ldi r22, 0x00 ; 0 c00e: 8c 2f mov r24, r28 default: break; } } } } c010: cf 91 pop r28 c012: 1f 91 pop r17 c014: 0f 91 pop r16 { case 704: MMU2::mmu2.load_filament(mmuSlotIndex); break; case 705: MMU2::mmu2.eject_filament(mmuSlotIndex, false); c016: 0d 94 8c ad jmp 0x35b18 ; 0x35b18 break; case 706: #ifdef MMU_HAS_CUTTER if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0){ c01a: 8e ec ldi r24, 0xCE ; 206 c01c: 9e e0 ldi r25, 0x0E ; 14 c01e: 0f 94 10 dc call 0x3b820 ; 0x3b820 c022: 88 23 and r24, r24 c024: 51 f0 breq .+20 ; 0xc03a IncrementMMUFails(); } } bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { if (!WaitForMMUReady()) { c026: 0f 94 78 88 call 0x310f0 ; 0x310f0 c02a: 88 23 and r24, r24 c02c: 31 f0 breq .+12 ; 0xc03a c02e: 8c 2f mov r24, r28 default: break; } } } } c030: cf 91 pop r28 c032: 1f 91 pop r17 c034: 0f 91 pop r16 c036: 0d 94 09 ae jmp 0x35c12 ; 0x35c12 c03a: cf 91 pop r28 c03c: 1f 91 pop r17 c03e: 0f 91 pop r16 c040: 08 95 ret 0000c042 : #ifdef TMC2130 void change_power_mode_live(uint8_t mode) { c042: cf 93 push r28 c044: c8 2f mov r28, r24 // Wait for the planner queue to drain and for the stepper timer routine to reach an idle state. st_synchronize(); c046: 0f 94 a9 43 call 0x28752 ; 0x28752 cli(); c04a: f8 94 cli tmc2130_mode = mode; c04c: c0 93 8b 06 sts 0x068B, r28 ; 0x80068b update_mode_profile(); c050: 0f 94 98 64 call 0x2c930 ; 0x2c930 return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); c054: 0e 94 8a f0 call 0x1e114 ; 0x1e114 1 #else 0 #endif ) , enableECool(enableECool) { } c058: 88 0f add r24, r24 tmc2130_init(TMCInitParams(FarmOrUserECool())); c05a: 82 70 andi r24, 0x02 ; 2 c05c: 0f 94 3c 27 call 0x24e78 ; 0x24e78 // We may have missed a stepper timer interrupt due to the time spent in the tmc2130_init() routine. // Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); c060: 0f 94 03 44 call 0x28806 ; 0x28806 sei(); c064: 78 94 sei } c066: cf 91 pop r28 c068: 08 95 ret 0000c06a : 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);} c06a: 8f 92 push r8 c06c: 9f 92 push r9 c06e: af 92 push r10 c070: bf 92 push r11 c072: cf 92 push r12 c074: df 92 push r13 c076: ef 92 push r14 c078: ff 92 push r15 c07a: 0f 93 push r16 c07c: 1f 93 push r17 c07e: cf 93 push r28 c080: df 93 push r29 c082: 00 91 93 03 lds r16, 0x0393 ; 0x800393 c086: 10 91 94 03 lds r17, 0x0394 ; 0x800394 c08a: 0f 5f subi r16, 0xFF ; 255 c08c: 1f 4f sbci r17, 0xFF ; 255 if (endptr) *endptr = (char*)nptr; do { c = *nptr++; c08e: 68 01 movw r12, r16 c090: 8f ef ldi r24, 0xFF ; 255 c092: c8 1a sub r12, r24 c094: d8 0a sbc r13, r24 c096: d8 01 movw r26, r16 c098: dc 91 ld r29, X } while (isspace(c)); c09a: 8d 2f mov r24, r29 c09c: 90 e0 ldi r25, 0x00 ; 0 c09e: 0f 94 a1 d9 call 0x3b342 ; 0x3b342 c0a2: 7c 01 movw r14, r24 c0a4: 89 2b or r24, r25 c0a6: 01 f5 brne .+64 ; 0xc0e8 flag = 0; if (c == '-') { c0a8: dd 32 cpi r29, 0x2D ; 45 c0aa: 01 f5 brne .+64 ; 0xc0ec flag = FL_MINUS; c = *nptr++; c0ac: 68 01 movw r12, r16 c0ae: b2 e0 ldi r27, 0x02 ; 2 c0b0: cb 0e add r12, r27 c0b2: d1 1c adc r13, r1 c0b4: f8 01 movw r30, r16 c0b6: d1 81 ldd r29, Z+1 ; 0x01 c = *nptr++; } while (isspace(c)); flag = 0; if (c == '-') { flag = FL_MINUS; c0b8: c1 e0 ldi r28, 0x01 ; 1 } else if (c == '+') { c = *nptr++; } if (!strncasecmp_P(nptr - 1, pstr_inf, 3)) { c0ba: 86 01 movw r16, r12 c0bc: 01 50 subi r16, 0x01 ; 1 c0be: 11 09 sbc r17, r1 c0c0: 43 e0 ldi r20, 0x03 ; 3 c0c2: 50 e0 ldi r21, 0x00 ; 0 c0c4: 65 e3 ldi r22, 0x35 ; 53 c0c6: 7b e7 ldi r23, 0x7B ; 123 c0c8: c8 01 movw r24, r16 c0ca: 0f 94 d7 d9 call 0x3b3ae ; 0x3b3ae c0ce: 89 2b or r24, r25 c0d0: c1 f4 brne .+48 ; 0xc102 nptr += 2; if (!strncasecmp_P(nptr, pstr_inity, 5)) nptr += 5; if (endptr) *endptr = (char*)nptr; return flag & FL_MINUS ? -INFINITY : +INFINITY; c0d2: 60 e0 ldi r22, 0x00 ; 0 c0d4: 70 e0 ldi r23, 0x00 ; 0 c0d6: 80 e8 ldi r24, 0x80 ; 128 c0d8: 9f ef ldi r25, 0xFF ; 255 c0da: c1 11 cpse r28, r1 c0dc: db c0 rjmp .+438 ; 0xc294 c0de: 60 e0 ldi r22, 0x00 ; 0 c0e0: 70 e0 ldi r23, 0x00 ; 0 c0e2: 80 e8 ldi r24, 0x80 ; 128 c0e4: 9f e7 ldi r25, 0x7F ; 127 c0e6: d6 c0 rjmp .+428 ; 0xc294 if (endptr) *endptr = (char*)nptr; do { c = *nptr++; c0e8: 86 01 movw r16, r12 c0ea: d1 cf rjmp .-94 ; 0xc08e flag = 0; if (c == '-') { flag = FL_MINUS; c = *nptr++; } else if (c == '+') { c0ec: db 32 cpi r29, 0x2B ; 43 c0ee: 39 f4 brne .+14 ; 0xc0fe c = *nptr++; c0f0: 68 01 movw r12, r16 c0f2: f2 e0 ldi r31, 0x02 ; 2 c0f4: cf 0e add r12, r31 c0f6: d1 1c adc r13, r1 c0f8: d8 01 movw r26, r16 c0fa: 11 96 adiw r26, 0x01 ; 1 c0fc: dc 91 ld r29, X do { c = *nptr++; } while (isspace(c)); flag = 0; c0fe: c0 e0 ldi r28, 0x00 ; 0 c100: dc cf rjmp .-72 ; 0xc0ba 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)) { c102: 43 e0 ldi r20, 0x03 ; 3 c104: 50 e0 ldi r21, 0x00 ; 0 c106: 62 e3 ldi r22, 0x32 ; 50 c108: 7b e7 ldi r23, 0x7B ; 123 c10a: c8 01 movw r24, r16 c10c: 0f 94 d7 d9 call 0x3b3ae ; 0x3b3ae c110: 89 2b or r24, r25 c112: 09 f4 brne .+2 ; 0xc116 c114: cc c0 rjmp .+408 ; 0xc2ae c116: f6 01 movw r30, r12 *endptr = (char*)nptr + 2; return NAN; } x.u32 = 0; exp = 0; c118: 10 e0 ldi r17, 0x00 ; 0 c11a: 00 e0 ldi r16, 0x00 ; 0 if (endptr) *endptr = (char*)nptr + 2; return NAN; } x.u32 = 0; c11c: 20 e0 ldi r18, 0x00 ; 0 c11e: 30 e0 ldi r19, 0x00 ; 0 c120: a9 01 movw r20, r18 c122: 6f 01 movw r12, r30 exp = 0; while (1) { c -= '0'; c124: d0 53 subi r29, 0x30 ; 48 if (c <= 9) { c126: da 30 cpi r29, 0x0A ; 10 c128: 60 f5 brcc .+88 ; 0xc182 flag |= FL_ANY; c12a: bc 2e mov r11, r28 c12c: 68 94 set c12e: b1 f8 bld r11, 1 c130: 8c 2f mov r24, r28 c132: 88 70 andi r24, 0x08 ; 8 if (flag & FL_OVFL) { c134: c2 ff sbrs r28, 2 c136: 09 c0 rjmp .+18 ; 0xc14a if (!(flag & FL_DOT)) c138: 81 11 cpse r24, r1 c13a: 02 c0 rjmp .+4 ; 0xc140 exp += 1; c13c: 0f 5f subi r16, 0xFF ; 255 c13e: 1f 4f sbci r17, 0xFF ; 255 c140: 31 96 adiw r30, 0x01 ; 1 flag |= FL_DOT; } else { break; } c = *nptr++; c142: d6 01 movw r26, r12 c144: dc 91 ld r29, X c146: cb 2d mov r28, r11 c148: ec cf rjmp .-40 ; 0xc122 if (flag & FL_OVFL) { if (!(flag & FL_DOT)) exp += 1; } else { if (flag & FL_DOT) c14a: 88 23 and r24, r24 c14c: 11 f0 breq .+4 ; 0xc152 exp -= 1; c14e: 01 50 subi r16, 0x01 ; 1 c150: 11 09 sbc r17, r1 /* x.u32 = x.u32 * 10 + c */ x.u32 = (((x.u32 << 2) + x.u32) << 1) + c; c152: a5 e0 ldi r26, 0x05 ; 5 c154: b0 e0 ldi r27, 0x00 ; 0 c156: 0f 94 a5 dc call 0x3b94a ; 0x3b94a <__muluhisi3> c15a: 9b 01 movw r18, r22 c15c: ac 01 movw r20, r24 c15e: 22 0f add r18, r18 c160: 33 1f adc r19, r19 c162: 44 1f adc r20, r20 c164: 55 1f adc r21, r21 c166: 2d 0f add r18, r29 c168: 31 1d adc r19, r1 c16a: 41 1d adc r20, r1 c16c: 51 1d adc r21, r1 if (x.u32 >= (ULONG_MAX - 9) / 10) c16e: 28 39 cpi r18, 0x98 ; 152 c170: b9 e9 ldi r27, 0x99 ; 153 c172: 3b 07 cpc r19, r27 c174: 4b 07 cpc r20, r27 c176: b9 e1 ldi r27, 0x19 ; 25 c178: 5b 07 cpc r21, r27 c17a: 10 f3 brcs .-60 ; 0xc140 flag |= FL_OVFL; c17c: c6 60 ori r28, 0x06 ; 6 c17e: bc 2e mov r11, r28 c180: df cf rjmp .-66 ; 0xc140 } } else if (c == (('.' - '0') & 0xff) && !(flag & FL_DOT)) { c182: de 3f cpi r29, 0xFE ; 254 c184: 31 f4 brne .+12 ; 0xc192 c186: c3 fd sbrc r28, 3 c188: 33 c0 rjmp .+102 ; 0xc1f0 flag |= FL_DOT; c18a: bc 2e mov r11, r28 c18c: 68 94 set c18e: b3 f8 bld r11, 3 c190: d7 cf rjmp .-82 ; 0xc140 } c = *nptr++; } // Check for exponent "E", but disable capital E if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/) c192: d5 33 cpi r29, 0x35 ; 53 c194: 69 f5 brne .+90 ; 0xc1f0 { int i; c = *nptr++; c196: 80 81 ld r24, Z i = 2; if (c == '-') { c198: 8d 32 cpi r24, 0x2D ; 45 c19a: 31 f4 brne .+12 ; 0xc1a8 flag |= FL_MEXP; c19c: c0 61 ori r28, 0x10 ; 16 c = *nptr++; c19e: bf 01 movw r22, r30 } else if (c == '+') { c = *nptr++; c1a0: 6e 5f subi r22, 0xFE ; 254 c1a2: 7f 4f sbci r23, 0xFF ; 255 c1a4: 81 81 ldd r24, Z+1 ; 0x01 c1a6: 05 c0 rjmp .+10 ; 0xc1b2 c1a8: bf 01 movw r22, r30 i = 2; if (c == '-') { flag |= FL_MEXP; c = *nptr++; } else if (c == '+') { c1aa: 8b 32 cpi r24, 0x2B ; 43 c1ac: c9 f3 breq .-14 ; 0xc1a0 // Check for exponent "E", but disable capital E if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/) { int i; c = *nptr++; c1ae: 6f 5f subi r22, 0xFF ; 255 c1b0: 7f 4f sbci r23, 0xFF ; 255 c = *nptr++; } else { i = 1; } c -= '0'; c1b2: 80 53 subi r24, 0x30 ; 48 if (c > 9) { c1b4: 8a 30 cpi r24, 0x0A ; 10 c1b6: e0 f4 brcc .+56 ; 0xc1f0 c1b8: fb 01 movw r30, r22 nptr -= i; } else { i = 0; do { if (i < 3200) c1ba: b0 e8 ldi r27, 0x80 ; 128 c1bc: eb 16 cp r14, r27 c1be: bc e0 ldi r27, 0x0C ; 12 c1c0: fb 06 cpc r15, r27 c1c2: 5c f4 brge .+22 ; 0xc1da i = (((i << 2) + i) << 1) + c; /* i = 10*i + c */ c1c4: b7 01 movw r22, r14 c1c6: 66 0f add r22, r22 c1c8: 77 1f adc r23, r23 c1ca: 66 0f add r22, r22 c1cc: 77 1f adc r23, r23 c1ce: e6 0e add r14, r22 c1d0: f7 1e adc r15, r23 c1d2: ee 0c add r14, r14 c1d4: ff 1c adc r15, r15 c1d6: e8 0e add r14, r24 c1d8: f1 1c adc r15, r1 c = *nptr++ - '0'; c1da: 81 91 ld r24, Z+ c1dc: 80 53 subi r24, 0x30 ; 48 } while (c <= 9); c1de: 8a 30 cpi r24, 0x0A ; 10 c1e0: 60 f3 brcs .-40 ; 0xc1ba if (flag & FL_MEXP) c1e2: c4 ff sbrs r28, 4 c1e4: 03 c0 rjmp .+6 ; 0xc1ec i = -i; c1e6: f1 94 neg r15 c1e8: e1 94 neg r14 c1ea: f1 08 sbc r15, r1 exp += i; c1ec: 0e 0d add r16, r14 c1ee: 1f 1d adc r17, r15 } if ((flag & FL_ANY) && endptr) *endptr = (char*)nptr - 1; x.flt = __floatunsisf(x.u32); /* manually */ c1f0: ca 01 movw r24, r20 c1f2: b9 01 movw r22, r18 c1f4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> if ((flag & FL_MINUS) && (flag & FL_ANY)) c1f8: c3 70 andi r28, 0x03 ; 3 c1fa: c3 30 cpi r28, 0x03 ; 3 c1fc: 09 f4 brne .+2 ; 0xc200 x.flt = -x.flt; c1fe: 90 58 subi r25, 0x80 ; 128 c200: 4b 01 movw r8, r22 c202: 5c 01 movw r10, r24 if (x.flt != 0) { c204: 20 e0 ldi r18, 0x00 ; 0 c206: 30 e0 ldi r19, 0x00 ; 0 c208: a9 01 movw r20, r18 c20a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> c20e: 88 23 and r24, r24 c210: 09 f4 brne .+2 ; 0xc214 c212: 3e c0 rjmp .+124 ; 0xc290 if (exp < 0) { nptr = (void*)(pwr_m10 + 5); exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); c214: ce e2 ldi r28, 0x2E ; 46 c216: db e7 ldi r29, 0x7B ; 123 if ((flag & FL_MINUS) && (flag & FL_ANY)) x.flt = -x.flt; if (x.flt != 0) { int pwr; if (exp < 0) { c218: 17 ff sbrs r17, 7 c21a: 05 c0 rjmp .+10 ; 0xc226 nptr = (void*)(pwr_m10 + 5); exp = -exp; c21c: 11 95 neg r17 c21e: 01 95 neg r16 c220: 11 09 sbc r17, r1 x.flt = -x.flt; if (x.flt != 0) { int pwr; if (exp < 0) { nptr = (void*)(pwr_m10 + 5); c222: c6 e1 ldi r28, 0x16 ; 22 c224: db e7 ldi r29, 0x7B ; 123 c226: 6e 01 movw r12, r28 c228: e8 e1 ldi r30, 0x18 ; 24 c22a: ce 1a sub r12, r30 c22c: d1 08 sbc r13, r1 exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); c22e: 80 e2 ldi r24, 0x20 ; 32 c230: e8 2e mov r14, r24 c232: f1 2c mov r15, r1 c234: 0d c0 rjmp .+26 ; 0xc250 for (; exp >= pwr; exp -= pwr) { union { unsigned long u32; float flt; } y; y.u32 = pgm_read_dword((float*)nptr); c236: fe 01 movw r30, r28 c238: 25 91 lpm r18, Z+ c23a: 35 91 lpm r19, Z+ c23c: 45 91 lpm r20, Z+ c23e: 54 91 lpm r21, Z } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { for (; exp >= pwr; exp -= pwr) { c240: 0e 19 sub r16, r14 c242: 1f 09 sbc r17, r15 union { unsigned long u32; float flt; } y; y.u32 = pgm_read_dword((float*)nptr); x.flt *= y.flt; c244: c5 01 movw r24, r10 c246: b4 01 movw r22, r8 c248: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> c24c: 4b 01 movw r8, r22 c24e: 5c 01 movw r10, r24 c250: d5 01 movw r26, r10 c252: c4 01 movw r24, r8 } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { for (; exp >= pwr; exp -= pwr) { c254: 0e 15 cp r16, r14 c256: 1f 05 cpc r17, r15 c258: 74 f7 brge .-36 ; 0xc236 float flt; } y; y.u32 = pgm_read_dword((float*)nptr); x.flt *= y.flt; } nptr -= sizeof(float); c25a: 24 97 sbiw r28, 0x04 ; 4 exp = -exp; } else { nptr = (void*)(pwr_p10 + 5); } for (pwr = 32; pwr; pwr >>= 1) { c25c: f5 94 asr r15 c25e: e7 94 ror r14 c260: cc 16 cp r12, r28 c262: dd 06 cpc r13, r29 c264: a9 f7 brne .-22 ; 0xc250 not plus or minus infinity, and not NaN. */ __ATTR_CONST__ static inline int isfinite (double __x) { unsigned char __exp; __asm__ ( c266: 8a 2f mov r24, r26 c268: 88 0f add r24, r24 c26a: 8b 2f mov r24, r27 c26c: 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) c26e: 8f 3f cpi r24, 0xFF ; 255 c270: 49 f0 breq .+18 ; 0xc284 c272: 20 e0 ldi r18, 0x00 ; 0 c274: 30 e0 ldi r19, 0x00 ; 0 c276: a9 01 movw r20, r18 c278: c5 01 movw r24, r10 c27a: b4 01 movw r22, r8 c27c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> c280: 81 11 cpse r24, r1 c282: 06 c0 rjmp .+12 ; 0xc290 errno = ERANGE; c284: 82 e2 ldi r24, 0x22 ; 34 c286: 90 e0 ldi r25, 0x00 ; 0 c288: 90 93 14 18 sts 0x1814, r25 ; 0x801814 c28c: 80 93 13 18 sts 0x1813, r24 ; 0x801813 } return x.flt; c290: c5 01 movw r24, r10 c292: b4 01 movw r22, r8 c294: df 91 pop r29 c296: cf 91 pop r28 c298: 1f 91 pop r17 c29a: 0f 91 pop r16 c29c: ff 90 pop r15 c29e: ef 90 pop r14 c2a0: df 90 pop r13 c2a2: cf 90 pop r12 c2a4: bf 90 pop r11 c2a6: af 90 pop r10 c2a8: 9f 90 pop r9 c2aa: 8f 90 pop r8 c2ac: 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; c2ae: 60 e0 ldi r22, 0x00 ; 0 c2b0: 70 e0 ldi r23, 0x00 ; 0 c2b2: 80 ec ldi r24, 0xC0 ; 192 c2b4: 9f e7 ldi r25, 0x7F ; 127 c2b6: ee cf rjmp .-36 ; 0xc294 0000c2b8 : } } } #endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3 void get_coordinates() { c2b8: 2f 92 push r2 c2ba: 3f 92 push r3 c2bc: 4f 92 push r4 c2be: 5f 92 push r5 c2c0: 6f 92 push r6 c2c2: 7f 92 push r7 c2c4: 8f 92 push r8 c2c6: 9f 92 push r9 c2c8: af 92 push r10 c2ca: bf 92 push r11 c2cc: cf 92 push r12 c2ce: df 92 push r13 c2d0: ef 92 push r14 c2d2: ff 92 push r15 c2d4: 0f 93 push r16 c2d6: 1f 93 push r17 c2d8: cf 93 push r28 c2da: df 93 push r29 c2dc: 00 d0 rcall .+0 ; 0xc2de c2de: cd b7 in r28, 0x3d ; 61 c2e0: de b7 in r29, 0x3e ; 62 c2e2: 8d ed ldi r24, 0xDD ; 221 c2e4: c8 2e mov r12, r24 c2e6: 82 e0 ldi r24, 0x02 ; 2 c2e8: d8 2e mov r13, r24 c2ea: 83 e7 ldi r24, 0x73 ; 115 c2ec: 96 e0 ldi r25, 0x06 ; 6 c2ee: 9b 83 std Y+3, r25 ; 0x03 c2f0: 8a 83 std Y+2, r24 ; 0x02 c2f2: 91 e9 ldi r25, 0x91 ; 145 c2f4: e9 2e mov r14, r25 c2f6: 96 e0 ldi r25, 0x06 ; 6 c2f8: f9 2e mov r15, r25 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) { c2fa: 33 24 eor r3, r3 c2fc: 33 94 inc r3 c2fe: 00 e0 ldi r16, 0x00 ; 0 if(code_seen(axis_codes[i])) c300: f6 01 movw r30, r12 c302: 81 91 ld r24, Z+ c304: 6f 01 movw r12, r30 c306: 0e 94 6e 5b call 0xb6dc ; 0xb6dc c30a: 28 2e mov r2, r24 c30c: 88 23 and r24, r24 c30e: 09 f4 brne .+2 ; 0xc312 c310: a6 c0 rjmp .+332 ; 0xc45e { bool relative = axis_relative_modes & mask; c312: 10 91 e3 03 lds r17, 0x03E3 ; 0x8003e3 c316: 13 21 and r17, r3 destination[i] = code_value(); c318: 0e 94 35 60 call 0xc06a ; 0xc06a c31c: 2b 01 movw r4, r22 c31e: 3c 01 movw r6, r24 c320: ea 81 ldd r30, Y+2 ; 0x02 c322: fb 81 ldd r31, Y+3 ; 0x03 c324: 40 82 st Z, r4 c326: 51 82 std Z+1, r5 ; 0x01 c328: 62 82 std Z+2, r6 ; 0x02 c32a: 73 82 std Z+3, r7 ; 0x03 if (i == E_AXIS) { c32c: 03 30 cpi r16, 0x03 ; 3 c32e: 09 f0 breq .+2 ; 0xc332 c330: 46 c0 rjmp .+140 ; 0xc3be 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; c332: f1 e0 ldi r31, 0x01 ; 1 c334: f9 83 std Y+1, r31 ; 0x01 c336: 11 11 cpse r17, r1 c338: 01 c0 rjmp .+2 ; 0xc33c c33a: 19 82 std Y+1, r1 ; 0x01 destination[i] = code_value(); if (i == E_AXIS) { float emult = extruder_multiplier[active_extruder]; c33c: 80 90 93 02 lds r8, 0x0293 ; 0x800293 c340: 90 90 94 02 lds r9, 0x0294 ; 0x800294 c344: a0 90 95 02 lds r10, 0x0295 ; 0x800295 c348: b0 90 96 02 lds r11, 0x0296 ; 0x800296 if (emult != 1.) { c34c: 20 e0 ldi r18, 0x00 ; 0 c34e: 30 e0 ldi r19, 0x00 ; 0 c350: 40 e8 ldi r20, 0x80 ; 128 c352: 5f e3 ldi r21, 0x3F ; 63 c354: c5 01 movw r24, r10 c356: b4 01 movw r22, r8 c358: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> c35c: 88 23 and r24, r24 c35e: 59 f1 breq .+86 ; 0xc3b6 if (! relative) { c360: 11 11 cpse r17, r1 c362: 15 c0 rjmp .+42 ; 0xc38e destination[i] -= current_position[i]; c364: 20 91 9d 06 lds r18, 0x069D ; 0x80069d c368: 30 91 9e 06 lds r19, 0x069E ; 0x80069e c36c: 40 91 9f 06 lds r20, 0x069F ; 0x80069f c370: 50 91 a0 06 lds r21, 0x06A0 ; 0x8006a0 c374: c3 01 movw r24, r6 c376: b2 01 movw r22, r4 c378: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> c37c: 60 93 7f 06 sts 0x067F, r22 ; 0x80067f c380: 70 93 80 06 sts 0x0680, r23 ; 0x800680 c384: 80 93 81 06 sts 0x0681, r24 ; 0x800681 c388: 90 93 82 06 sts 0x0682, r25 ; 0x800682 relative = true; c38c: 29 82 std Y+1, r2 ; 0x01 } destination[i] *= emult; c38e: a5 01 movw r20, r10 c390: 94 01 movw r18, r8 c392: 60 91 7f 06 lds r22, 0x067F ; 0x80067f c396: 70 91 80 06 lds r23, 0x0680 ; 0x800680 c39a: 80 91 81 06 lds r24, 0x0681 ; 0x800681 c39e: 90 91 82 06 lds r25, 0x0682 ; 0x800682 c3a2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> c3a6: 60 93 7f 06 sts 0x067F, r22 ; 0x80067f c3aa: 70 93 80 06 sts 0x0680, r23 ; 0x800680 c3ae: 80 93 81 06 sts 0x0681, r24 ; 0x800681 c3b2: 90 93 82 06 sts 0x0682, r25 ; 0x800682 } } if (relative) c3b6: e9 81 ldd r30, Y+1 ; 0x01 c3b8: e1 11 cpse r30, r1 c3ba: 03 c0 rjmp .+6 ; 0xc3c2 c3bc: 22 c0 rjmp .+68 ; 0xc402 c3be: 11 23 and r17, r17 c3c0: 99 f0 breq .+38 ; 0xc3e8 destination[i] += current_position[i]; c3c2: f7 01 movw r30, r14 c3c4: 20 81 ld r18, Z c3c6: 31 81 ldd r19, Z+1 ; 0x01 c3c8: 42 81 ldd r20, Z+2 ; 0x02 c3ca: 53 81 ldd r21, Z+3 ; 0x03 c3cc: ea 81 ldd r30, Y+2 ; 0x02 c3ce: fb 81 ldd r31, Y+3 ; 0x03 c3d0: 60 81 ld r22, Z c3d2: 71 81 ldd r23, Z+1 ; 0x01 c3d4: 82 81 ldd r24, Z+2 ; 0x02 c3d6: 93 81 ldd r25, Z+3 ; 0x03 c3d8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> c3dc: ea 81 ldd r30, Y+2 ; 0x02 c3de: fb 81 ldd r31, Y+3 ; 0x03 c3e0: 60 83 st Z, r22 c3e2: 71 83 std Z+1, r23 ; 0x01 c3e4: 82 83 std Z+2, r24 ; 0x02 c3e6: 93 83 std Z+3, r25 ; 0x03 } } #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) { c3e8: 0f 5f subi r16, 0xFF ; 255 c3ea: 33 0c add r3, r3 c3ec: 8a 81 ldd r24, Y+2 ; 0x02 c3ee: 9b 81 ldd r25, Y+3 ; 0x03 c3f0: 04 96 adiw r24, 0x04 ; 4 c3f2: 9b 83 std Y+3, r25 ; 0x03 c3f4: 8a 83 std Y+2, r24 ; 0x02 c3f6: 94 e0 ldi r25, 0x04 ; 4 c3f8: e9 0e add r14, r25 c3fa: f1 1c adc r15, r1 c3fc: 04 30 cpi r16, 0x04 ; 4 c3fe: 09 f0 breq .+2 ; 0xc402 c400: 7f cf rjmp .-258 ; 0xc300 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')) { c402: 86 e4 ldi r24, 0x46 ; 70 c404: 0e 94 6e 5b call 0xb6dc ; 0xb6dc c408: 88 23 and r24, r24 c40a: 99 f0 breq .+38 ; 0xc432 const float next_feedrate = code_value(); c40c: 0e 94 35 60 call 0xc06a ; 0xc06a c410: 6b 01 movw r12, r22 c412: 7c 01 movw r14, r24 if(next_feedrate > 0.f) feedrate = next_feedrate; c414: 20 e0 ldi r18, 0x00 ; 0 c416: 30 e0 ldi r19, 0x00 ; 0 c418: a9 01 movw r20, r18 c41a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> c41e: 18 16 cp r1, r24 c420: 44 f4 brge .+16 ; 0xc432 c422: c0 92 b8 02 sts 0x02B8, r12 ; 0x8002b8 c426: d0 92 b9 02 sts 0x02B9, r13 ; 0x8002b9 c42a: e0 92 ba 02 sts 0x02BA, r14 ; 0x8002ba c42e: f0 92 bb 02 sts 0x02BB, r15 ; 0x8002bb } } c432: 0f 90 pop r0 c434: 0f 90 pop r0 c436: 0f 90 pop r0 c438: df 91 pop r29 c43a: cf 91 pop r28 c43c: 1f 91 pop r17 c43e: 0f 91 pop r16 c440: ff 90 pop r15 c442: ef 90 pop r14 c444: df 90 pop r13 c446: cf 90 pop r12 c448: bf 90 pop r11 c44a: af 90 pop r10 c44c: 9f 90 pop r9 c44e: 8f 90 pop r8 c450: 7f 90 pop r7 c452: 6f 90 pop r6 c454: 5f 90 pop r5 c456: 4f 90 pop r4 c458: 3f 90 pop r3 c45a: 2f 90 pop r2 c45c: 08 95 ret 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? c45e: f7 01 movw r30, r14 c460: 80 81 ld r24, Z c462: 91 81 ldd r25, Z+1 ; 0x01 c464: a2 81 ldd r26, Z+2 ; 0x02 c466: b3 81 ldd r27, Z+3 ; 0x03 c468: ea 81 ldd r30, Y+2 ; 0x02 c46a: fb 81 ldd r31, Y+3 ; 0x03 c46c: 80 83 st Z, r24 c46e: 91 83 std Z+1, r25 ; 0x01 c470: a2 83 std Z+2, r26 ; 0x02 c472: b3 83 std Z+3, r27 ; 0x03 c474: b9 cf rjmp .-142 ; 0xc3e8 0000c476 : } } void dcode_core(daddr_t addr_start, const daddr_t addr_end, const dcode_mem_t type, uint8_t dcode, const char* type_desc) { c476: 2f 92 push r2 c478: 3f 92 push r3 c47a: 4f 92 push r4 c47c: 5f 92 push r5 c47e: 6f 92 push r6 c480: 7f 92 push r7 c482: 8f 92 push r8 c484: 9f 92 push r9 c486: af 92 push r10 c488: bf 92 push r11 c48a: cf 92 push r12 c48c: df 92 push r13 c48e: ef 92 push r14 c490: ff 92 push r15 c492: 0f 93 push r16 c494: 1f 93 push r17 c496: cf 93 push r28 c498: df 93 push r29 c49a: cd b7 in r28, 0x3d ; 61 c49c: de b7 in r29, 0x3e ; 62 c49e: 65 97 sbiw r28, 0x15 ; 21 c4a0: 0f b6 in r0, 0x3f ; 63 c4a2: f8 94 cli c4a4: de bf out 0x3e, r29 ; 62 c4a6: 0f be out 0x3f, r0 ; 63 c4a8: cd bf out 0x3d, r28 ; 61 c4aa: 69 8b std Y+17, r22 ; 0x11 c4ac: 7a 8b std Y+18, r23 ; 0x12 c4ae: 8b 8b std Y+19, r24 ; 0x13 c4b0: 9c 8b std Y+20, r25 ; 0x14 c4b2: 49 01 movw r8, r18 c4b4: 5a 01 movw r10, r20 c4b6: 30 2e mov r3, r16 c4b8: cd 8a std Y+21, r12 ; 0x15 c4ba: 2d 2c mov r2, r13 KEEPALIVE_STATE(NOT_BUSY); c4bc: 81 e0 ldi r24, 0x01 ; 1 c4be: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc); c4c2: df 92 push r13 c4c4: 2d 89 ldd r18, Y+21 ; 0x15 c4c6: 2f 93 push r18 c4c8: 1f 92 push r1 c4ca: ef 92 push r14 c4cc: 81 e2 ldi r24, 0x21 ; 33 c4ce: 95 e6 ldi r25, 0x65 ; 101 c4d0: 9f 93 push r25 c4d2: 8f 93 push r24 c4d4: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 daddr_t count = -1; // RW the entire space by default if (code_seen('A')) c4d8: 81 e4 ldi r24, 0x41 ; 65 c4da: 0e 94 6e 5b call 0xb6dc ; 0xb6dc c4de: 0f 90 pop r0 c4e0: 0f 90 pop r0 c4e2: 0f 90 pop r0 c4e4: 0f 90 pop r0 c4e6: 0f 90 pop r0 c4e8: 0f 90 pop r0 c4ea: 88 23 and r24, r24 c4ec: a1 f0 breq .+40 ; 0xc516 addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value(); c4ee: 80 91 93 03 lds r24, 0x0393 ; 0x800393 c4f2: 90 91 94 03 lds r25, 0x0394 ; 0x800394 c4f6: fc 01 movw r30, r24 c4f8: 21 81 ldd r18, Z+1 ; 0x01 c4fa: 28 37 cpi r18, 0x78 ; 120 c4fc: 09 f0 breq .+2 ; 0xc500 c4fe: 69 c0 rjmp .+210 ; 0xc5d2 c500: 40 e1 ldi r20, 0x10 ; 16 c502: 50 e0 ldi r21, 0x00 ; 0 c504: 70 e0 ldi r23, 0x00 ; 0 c506: 60 e0 ldi r22, 0x00 ; 0 c508: 02 96 adiw r24, 0x02 ; 2 c50a: 0f 94 9b d7 call 0x3af36 ; 0x3af36 c50e: 69 8b std Y+17, r22 ; 0x11 c510: 7a 8b std Y+18, r23 ; 0x12 c512: 8b 8b std Y+19, r24 ; 0x13 c514: 9c 8b std Y+20, r25 ; 0x14 if (code_seen('C')) c516: 83 e4 ldi r24, 0x43 ; 67 c518: 0e 94 6e 5b call 0xb6dc ; 0xb6dc c51c: 88 23 and r24, r24 c51e: 09 f4 brne .+2 ; 0xc522 c520: 65 c0 rjmp .+202 ; 0xc5ec count = code_value_long(); c522: 0e 94 1a 5b call 0xb634 ; 0xb634 c526: 2b 01 movw r4, r22 c528: 3c 01 movw r6, r24 c52a: c9 88 ldd r12, Y+17 ; 0x11 c52c: da 88 ldd r13, Y+18 ; 0x12 c52e: eb 88 ldd r14, Y+19 ; 0x13 c530: fc 88 ldd r15, Y+20 ; 0x14 c532: 8c 14 cp r8, r12 c534: 9d 04 cpc r9, r13 c536: ae 04 cpc r10, r14 c538: bf 04 cpc r11, r15 c53a: 10 f4 brcc .+4 ; 0xc540 c53c: 75 01 movw r14, r10 c53e: 64 01 movw r12, r8 if (addr_start > addr_end) addr_start = addr_end; if ((addr_start + count) > addr_end || (addr_start + count) < addr_start) c540: d3 01 movw r26, r6 c542: c2 01 movw r24, r4 c544: 8c 0d add r24, r12 c546: 9d 1d adc r25, r13 c548: ae 1d adc r26, r14 c54a: bf 1d adc r27, r15 c54c: 88 16 cp r8, r24 c54e: 99 06 cpc r9, r25 c550: aa 06 cpc r10, r26 c552: bb 06 cpc r11, r27 c554: 28 f0 brcs .+10 ; 0xc560 c556: 8c 15 cp r24, r12 c558: 9d 05 cpc r25, r13 c55a: ae 05 cpc r26, r14 c55c: bf 05 cpc r27, r15 c55e: 30 f4 brcc .+12 ; 0xc56c count = addr_end - addr_start; c560: 24 01 movw r4, r8 c562: 35 01 movw r6, r10 c564: 4c 18 sub r4, r12 c566: 5d 08 sbc r5, r13 c568: 6e 08 sbc r6, r14 c56a: 7f 08 sbc r7, r15 if (code_seen('X')) c56c: 88 e5 ldi r24, 0x58 ; 88 c56e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc c572: 88 23 and r24, r24 c574: 09 f4 brne .+2 ; 0xc578 c576: 91 c0 rjmp .+290 ; 0xc69a { uint8_t data[16]; count = parse_hex(strchr_pointer + 1, data, 16); c578: 20 91 93 03 lds r18, 0x0393 ; 0x800393 c57c: 30 91 94 03 lds r19, 0x0394 ; 0x800394 c580: 2f 5f subi r18, 0xFF ; 255 c582: 3f 4f sbci r19, 0xFF ; 255 c584: fe 01 movw r30, r28 c586: 31 96 adiw r30, 0x01 ; 1 print_hex_byte(val & 0xFF); } int parse_hex(const char* hex, uint8_t* data, int count) { int parsed = 0; c588: 10 e0 ldi r17, 0x00 ; 0 c58a: 00 e0 ldi r16, 0x00 ; 0 c58c: 4f 01 movw r8, r30 c58e: d9 01 movw r26, r18 while (*hex) c590: 8c 91 ld r24, X c592: 2f 5f subi r18, 0xFF ; 255 c594: 3f 4f sbci r19, 0xFF ; 255 c596: 88 23 and r24, r24 c598: 09 f4 brne .+2 ; 0xc59c c59a: 3f c0 rjmp .+126 ; 0xc61a { if (count && (parsed >= count)) break; c59c: 00 31 cpi r16, 0x10 ; 16 c59e: 11 05 cpc r17, r1 c5a0: e1 f1 breq .+120 ; 0xc61a char c = *(hex++); if (c == ' ') continue; c5a2: 80 32 cpi r24, 0x20 ; 32 c5a4: a1 f3 breq .-24 ; 0xc58e if (c == '\n') break; c5a6: 8a 30 cpi r24, 0x0A ; 10 c5a8: c1 f1 breq .+112 ; 0xc61a uint8_t val = 0x00; if ((c >= '0') && (c <= '9')) val |= ((c - '0') << 4); c5aa: 90 ed ldi r25, 0xD0 ; 208 c5ac: 98 0f add r25, r24 c5ae: 9a 30 cpi r25, 0x0A ; 10 c5b0: 10 f5 brcc .+68 ; 0xc5f6 c5b2: 82 95 swap r24 c5b4: 80 7f andi r24, 0xF0 ; 240 else if ((c >= 'a') && (c <= 'f')) val |= ((c - 'a' + 10) << 4); else return -parsed; c = *(hex++); c5b6: 9d 01 movw r18, r26 c5b8: 2e 5f subi r18, 0xFE ; 254 c5ba: 3f 4f sbci r19, 0xFF ; 255 if ((c >= '0') && (c <= '9')) val |= (c - '0'); c5bc: 11 96 adiw r26, 0x01 ; 1 c5be: 9c 91 ld r25, X c5c0: 40 ed ldi r20, 0xD0 ; 208 c5c2: 49 0f add r20, r25 c5c4: 4a 30 cpi r20, 0x0A ; 10 c5c6: f8 f4 brcc .+62 ; 0xc606 c5c8: 84 2b or r24, r20 else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10); else return -parsed; data[parsed] = val; c5ca: 81 93 st Z+, r24 parsed++; c5cc: 0f 5f subi r16, 0xFF ; 255 c5ce: 1f 4f sbci r17, 0xFF ; 255 c5d0: de cf rjmp .-68 ; 0xc58e { 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(); c5d2: 0e 94 35 60 call 0xc06a ; 0xc06a c5d6: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> c5da: 9b 01 movw r18, r22 c5dc: 77 0f add r23, r23 c5de: 44 0b sbc r20, r20 c5e0: 55 0b sbc r21, r21 c5e2: 29 8b std Y+17, r18 ; 0x11 c5e4: 3a 8b std Y+18, r19 ; 0x12 c5e6: 4b 8b std Y+19, r20 ; 0x13 c5e8: 5c 8b std Y+20, r21 ; 0x14 c5ea: 95 cf rjmp .-214 ; 0xc516 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 c5ec: 44 24 eor r4, r4 c5ee: 4a 94 dec r4 c5f0: 54 2c mov r5, r4 c5f2: 32 01 movw r6, r4 c5f4: 9a cf rjmp .-204 ; 0xc52a 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); c5f6: 9f e9 ldi r25, 0x9F ; 159 c5f8: 98 0f add r25, r24 c5fa: 96 30 cpi r25, 0x06 ; 6 c5fc: 58 f4 brcc .+22 ; 0xc614 c5fe: 82 95 swap r24 c600: 80 7f andi r24, 0xF0 ; 240 c602: 80 57 subi r24, 0x70 ; 112 c604: d8 cf rjmp .-80 ; 0xc5b6 else return -parsed; c = *(hex++); if ((c >= '0') && (c <= '9')) val |= (c - '0'); else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10); c606: 4f e9 ldi r20, 0x9F ; 159 c608: 49 0f add r20, r25 c60a: 46 30 cpi r20, 0x06 ; 6 c60c: 18 f4 brcc .+6 ; 0xc614 c60e: 97 55 subi r25, 0x57 ; 87 c610: 89 2b or r24, r25 c612: db cf rjmp .-74 ; 0xc5ca else return -parsed; c614: 11 95 neg r17 c616: 01 95 neg r16 c618: 11 09 sbc r17, r1 if ((addr_start + count) > addr_end || (addr_start + count) < addr_start) count = addr_end - addr_start; if (code_seen('X')) { uint8_t data[16]; count = parse_hex(strchr_pointer + 1, data, 16); c61a: 28 01 movw r4, r16 c61c: 01 2e mov r0, r17 c61e: 00 0c add r0, r0 c620: 66 08 sbc r6, r6 c622: 77 08 sbc r7, r7 write_mem(addr_start, count, data, type); c624: da 8a std Y+18, r13 ; 0x12 c626: c9 8a std Y+17, r12 ; 0x11 } // 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++) c628: b1 2c mov r11, r1 c62a: a1 2c mov r10, r1 c62c: 0a 15 cp r16, r10 c62e: 1b 05 cpc r17, r11 c630: f1 f0 breq .+60 ; 0xc66e { switch (type) c632: 33 20 and r3, r3 c634: 39 f0 breq .+14 ; 0xc644 c636: 31 e0 ldi r19, 0x01 ; 1 c638: 33 16 cp r3, r19 c63a: 71 f0 breq .+28 ; 0xc658 } // 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++) c63c: 4f ef ldi r20, 0xFF ; 255 c63e: a4 1a sub r10, r20 c640: b4 0a sbc r11, r20 c642: f4 cf rjmp .-24 ; 0xc62c { switch (type) { case dcode_mem_t::sram: *((uint8_t*)address) = data[i]; break; c644: f4 01 movw r30, r8 c646: ea 0d add r30, r10 c648: fb 1d adc r31, r11 c64a: 80 81 ld r24, Z c64c: e9 89 ldd r30, Y+17 ; 0x11 c64e: fa 89 ldd r31, Y+18 ; 0x12 c650: ea 0d add r30, r10 c652: fb 1d adc r31, r11 c654: 80 83 st Z, r24 c656: f2 cf rjmp .-28 ; 0xc63c case dcode_mem_t::eeprom: eeprom_write_byte_notify((uint8_t*)address, data[i]); break; c658: f4 01 movw r30, r8 c65a: ea 0d add r30, r10 c65c: fb 1d adc r31, r11 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); c65e: 60 81 ld r22, Z c660: 89 89 ldd r24, Y+17 ; 0x11 c662: 9a 89 ldd r25, Y+18 ; 0x12 c664: 8a 0d add r24, r10 c666: 9b 1d adc r25, r11 c668: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 c66c: e7 cf rjmp .-50 ; 0xc63c { uint8_t data[16]; 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); c66e: ff 92 push r15 c670: ef 92 push r14 c672: df 92 push r13 c674: cf 92 push r12 c676: 2f 92 push r2 c678: 5d 89 ldd r21, Y+21 ; 0x15 c67a: 5f 93 push r21 c67c: 7f 92 push r7 c67e: 6f 92 push r6 c680: 5f 92 push r5 c682: 4f 92 push r4 c684: 85 ef ldi r24, 0xF5 ; 245 c686: 94 e6 ldi r25, 0x64 ; 100 c688: 9f 93 push r25 c68a: 8f 93 push r24 c68c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 c690: 0f b6 in r0, 0x3f ; 63 c692: f8 94 cli c694: de bf out 0x3e, r29 ; 62 c696: 0f be out 0x3f, r0 ; 63 c698: cd bf out 0x3d, r28 ; 61 #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); c69a: 03 2d mov r16, r3 c69c: a3 01 movw r20, r6 c69e: 92 01 movw r18, r4 c6a0: c7 01 movw r24, r14 c6a2: b6 01 movw r22, r12 c6a4: 0f 94 20 87 call 0x30e40 ; 0x30e40 } c6a8: 65 96 adiw r28, 0x15 ; 21 c6aa: 0f b6 in r0, 0x3f ; 63 c6ac: f8 94 cli c6ae: de bf out 0x3e, r29 ; 62 c6b0: 0f be out 0x3f, r0 ; 63 c6b2: cd bf out 0x3d, r28 ; 61 c6b4: df 91 pop r29 c6b6: cf 91 pop r28 c6b8: 1f 91 pop r17 c6ba: 0f 91 pop r16 c6bc: ff 90 pop r15 c6be: ef 90 pop r14 c6c0: df 90 pop r13 c6c2: cf 90 pop r12 c6c4: bf 90 pop r11 c6c6: af 90 pop r10 c6c8: 9f 90 pop r9 c6ca: 8f 90 pop r8 c6cc: 7f 90 pop r7 c6ce: 6f 90 pop r6 c6d0: 5f 90 pop r5 c6d2: 4f 90 pop r4 c6d4: 3f 90 pop r3 c6d6: 2f 90 pop r2 c6d8: 08 95 ret 0000c6da : #define DBG(args...) printf_P(args) inline void print_hex_nibble(uint8_t val) { putchar((val > 9)?(val - 10 + 'a'):(val + '0')); c6da: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> c6de: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> c6e2: 90 e0 ldi r25, 0x00 ; 0 c6e4: 8a 30 cpi r24, 0x0A ; 10 c6e6: 20 f0 brcs .+8 ; 0xc6f0 c6e8: 89 5a subi r24, 0xA9 ; 169 c6ea: 9f 4f sbci r25, 0xFF ; 255 c6ec: 0d 94 78 da jmp 0x3b4f0 ; 0x3b4f0 c6f0: c0 96 adiw r24, 0x30 ; 48 c6f2: fc cf rjmp .-8 ; 0xc6ec 0000c6f4 : 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); c6f4: 84 ff sbrs r24, 4 c6f6: 18 c0 rjmp .+48 ; 0xc728 c6f8: 8d 9a sbi 0x11, 5 ; 17 WRITE(LCD_PINS_D5, value & 0x20); c6fa: 85 ff sbrs r24, 5 c6fc: 17 c0 rjmp .+46 ; 0xc72c c6fe: a4 9a sbi 0x14, 4 ; 20 WRITE(LCD_PINS_D6, value & 0x40); c700: 2f b7 in r18, 0x3f ; 63 c702: 86 ff sbrs r24, 6 c704: 15 c0 rjmp .+42 ; 0xc730 c706: f8 94 cli c708: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> c70c: 90 68 ori r25, 0x80 ; 128 c70e: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> c712: 2f bf out 0x3f, r18 ; 63 WRITE(LCD_PINS_D7, value & 0x80); c714: 87 ff sbrs r24, 7 c716: 11 c0 rjmp .+34 ; 0xc73a c718: 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); c71a: 8f 9a sbi 0x11, 7 ; 17 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); c71c: 85 e0 ldi r24, 0x05 ; 5 c71e: 8a 95 dec r24 c720: f1 f7 brne .-4 ; 0xc71e c722: 00 00 nop _delay_us(1); // enable pulse must be >450ns WRITE(LCD_PINS_ENABLE,LOW); c724: 8f 98 cbi 0x11, 7 ; 17 WRITE(LCD_PINS_D5, value & 0x20); WRITE(LCD_PINS_D6, value & 0x40); WRITE(LCD_PINS_D7, value & 0x80); lcd_pulseEnable(); } c726: 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); c728: 8d 98 cbi 0x11, 5 ; 17 c72a: e7 cf rjmp .-50 ; 0xc6fa WRITE(LCD_PINS_D5, value & 0x20); c72c: a4 98 cbi 0x14, 4 ; 20 c72e: e8 cf rjmp .-48 ; 0xc700 WRITE(LCD_PINS_D6, value & 0x40); c730: f8 94 cli c732: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> c736: 9f 77 andi r25, 0x7F ; 127 c738: ea cf rjmp .-44 ; 0xc70e WRITE(LCD_PINS_D7, value & 0x80); c73a: a3 98 cbi 0x14, 3 ; 20 c73c: ee cf rjmp .-36 ; 0xc71a 0000c73e : lcd_pulseEnable(); } static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY) { c73e: 0f 93 push r16 c740: 1f 93 push r17 c742: cf 93 push r28 c744: df 93 push r29 c746: c8 2f mov r28, r24 c748: d6 2f mov r29, r22 c74a: 8a 01 movw r16, r20 WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG); c74c: 60 ff sbrs r22, 0 c74e: 15 c0 rjmp .+42 ; 0xc77a c750: 5d 9a sbi 0x0b, 5 ; 11 c752: 8a e1 ldi r24, 0x1A ; 26 c754: 8a 95 dec r24 c756: f1 f7 brne .-4 ; 0xc754 c758: 00 c0 rjmp .+0 ; 0xc75a _delay_us(5); lcd_writebits(data); c75a: 8c 2f mov r24, r28 c75c: 0e 94 7a 63 call 0xc6f4 ; 0xc6f4 #ifndef LCD_8BIT if (!(flags & LCD_HALF_FLAG)) { c760: d1 fd sbrc r29, 1 c762: 04 c0 rjmp .+8 ; 0xc76c // _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 c764: 8c 2f mov r24, r28 c766: 82 95 swap r24 c768: 0e 94 7a 63 call 0xc6f4 ; 0xc6f4 } #endif delayMicroseconds(duration); c76c: c8 01 movw r24, r16 } c76e: df 91 pop r29 c770: cf 91 pop r28 c772: 1f 91 pop r17 c774: 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); c776: 0c 94 3c e9 jmp 0x1d278 ; 0x1d278 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); c77a: 5d 98 cbi 0x0b, 5 ; 11 c77c: ea cf rjmp .-44 ; 0xc752 0000c77e : return def; } return val; } void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) { c77e: cf 92 push r12 c780: df 92 push r13 c782: ef 92 push r14 c784: ff 92 push r15 c786: cf 93 push r28 c788: df 93 push r29 c78a: ec 01 movw r28, r24 c78c: 6a 01 movw r12, r20 c78e: 7b 01 movw r14, r22 if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32) c790: 0f 94 18 dc call 0x3b830 ; 0x3b830 c794: 6f 3f cpi r22, 0xFF ; 255 c796: 7f 4f sbci r23, 0xFF ; 255 c798: 8f 4f sbci r24, 0xFF ; 255 c79a: 9f 4f sbci r25, 0xFF ; 255 c79c: 59 f4 brne .+22 ; 0xc7b4 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); c79e: b7 01 movw r22, r14 c7a0: a6 01 movw r20, r12 c7a2: 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); } c7a4: df 91 pop r29 c7a6: cf 91 pop r28 c7a8: ff 90 pop r15 c7aa: ef 90 pop r14 c7ac: df 90 pop r13 c7ae: 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); c7b0: 0d 94 66 dc jmp 0x3b8cc ; 0x3b8cc } 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); } c7b4: df 91 pop r29 c7b6: cf 91 pop r28 c7b8: ff 90 pop r15 c7ba: ef 90 pop r14 c7bc: df 90 pop r13 c7be: cf 90 pop r12 c7c0: 08 95 ret 0000c7c2 : /// 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)); c7c2: 80 e1 ldi r24, 0x10 ; 16 c7c4: e1 e9 ldi r30, 0x91 ; 145 c7c6: f6 e0 ldi r31, 0x06 ; 6 c7c8: a3 e7 ldi r26, 0x73 ; 115 c7ca: b2 e0 ldi r27, 0x02 ; 2 c7cc: 01 90 ld r0, Z+ c7ce: 0d 92 st X+, r0 c7d0: 8a 95 dec r24 c7d2: e1 f7 brne .-8 ; 0xc7cc saved_feedmultiply2 = feedmultiply; //save feedmultiply c7d4: 80 91 39 02 lds r24, 0x0239 ; 0x800239 c7d8: 90 91 3a 02 lds r25, 0x023A ; 0x80023a c7dc: 90 93 70 03 sts 0x0370, r25 ; 0x800370 c7e0: 80 93 6f 03 sts 0x036F, r24 ; 0x80036f saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder); c7e4: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 c7e8: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 c7ec: 90 93 ac 05 sts 0x05AC, r25 ; 0x8005ac c7f0: 80 93 ab 05 sts 0x05AB, r24 ; 0x8005ab saved_bed_temperature = (uint8_t)degTargetBed(); c7f4: 80 91 71 06 lds r24, 0x0671 ; 0x800671 c7f8: 80 93 ad 05 sts 0x05AD, r24 ; 0x8005ad saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; c7fc: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 c800: 83 fb bst r24, 3 c802: 88 27 eor r24, r24 c804: 80 f9 bld r24, 0 c806: 80 93 63 05 sts 0x0563, r24 ; 0x800563 saved_fan_speed = fanSpeed; c80a: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 c80e: 80 93 aa 05 sts 0x05AA, r24 ; 0x8005aa isPartialBackupAvailable = true; c812: 81 e0 ldi r24, 0x01 ; 1 c814: 80 93 a1 06 sts 0x06A1, r24 ; 0x8006a1 } c818: 08 95 ret 0000c81a <_GLOBAL__sub_D_card>: while(!lcd_clicked()) { delay_keep_alive(0); } KEEPALIVE_STATE(busy_state_backup); } c81a: cf 93 push r28 c81c: df 93 push r29 //------------------------------------------------------------------------------ /** * \class SdFile * \brief SdBaseFile with Print. */ class SdFile : public SdBaseFile/*, public Print*/ { c81e: 8f e1 ldi r24, 0x1F ; 31 c820: 97 e1 ldi r25, 0x17 ; 23 c822: 0e 94 c9 76 call 0xed92 ; 0xed92 #ifdef SDSUPPORT #define MAX_DIR_DEPTH 6 #include "SdFile.h" class CardReader c826: 8d e5 ldi r24, 0x5D ; 93 c828: 95 e1 ldi r25, 0x15 ; 21 c82a: 89 2b or r24, r25 c82c: 51 f0 breq .+20 ; 0xc842 <_GLOBAL__sub_D_card+0x28> c82e: cf e2 ldi r28, 0x2F ; 47 c830: d6 e1 ldi r29, 0x16 ; 22 c832: a3 97 sbiw r28, 0x23 ; 35 c834: ce 01 movw r24, r28 c836: 0e 94 c9 76 call 0xed92 ; 0xed92 c83a: 85 e1 ldi r24, 0x15 ; 21 c83c: cd 35 cpi r28, 0x5D ; 93 c83e: d8 07 cpc r29, r24 c840: c1 f7 brne .-16 ; 0xc832 <_GLOBAL__sub_D_card+0x18> c842: 8a e3 ldi r24, 0x3A ; 58 c844: 95 e1 ldi r25, 0x15 ; 21 c846: 0e 94 c9 76 call 0xed92 ; 0xed92 c84a: 85 e1 ldi r24, 0x15 ; 21 c84c: 95 e1 ldi r25, 0x15 ; 21 c84e: df 91 pop r29 c850: cf 91 pop r28 c852: 0c 94 c9 76 jmp 0xed92 ; 0xed92 0000c856 : print_time_to_change_normal = PRINT_TIME_REMAINING_INIT; print_time_to_change_silent = PRINT_TIME_REMAINING_INIT; } void load_filament_final_feed() { c856: cf 93 push r28 c858: df 93 push r29 current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED; c85a: c1 e9 ldi r28, 0x91 ; 145 c85c: d6 e0 ldi r29, 0x06 ; 6 c85e: 20 e0 ldi r18, 0x00 ; 0 c860: 30 e0 ldi r19, 0x00 ; 0 c862: 48 ec ldi r20, 0xC8 ; 200 c864: 51 e4 ldi r21, 0x41 ; 65 c866: 6c 85 ldd r22, Y+12 ; 0x0c c868: 7d 85 ldd r23, Y+13 ; 0x0d c86a: 8e 85 ldd r24, Y+14 ; 0x0e c86c: 9f 85 ldd r25, Y+15 ; 0x0f c86e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> c872: 6c 87 std Y+12, r22 ; 0x0c c874: 7d 87 std Y+13, r23 ; 0x0d c876: 8e 87 std Y+14, r24 ; 0x0e c878: 9f 87 std Y+15, r25 ; 0x0f plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL); c87a: 63 e3 ldi r22, 0x33 ; 51 c87c: 73 e3 ldi r23, 0x33 ; 51 c87e: 83 e5 ldi r24, 0x53 ; 83 c880: 90 e4 ldi r25, 0x40 ; 64 } c882: df 91 pop r29 c884: cf 91 pop r28 } void load_filament_final_feed() { current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED; plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL); c886: 0d 94 3d c0 jmp 0x3807a ; 0x3807a 0000c88a : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); c88a: 60 e0 ldi r22, 0x00 ; 0 c88c: 85 ea ldi r24, 0xA5 ; 165 c88e: 9f e0 ldi r25, 0x0F ; 15 c890: 0f 94 34 dc call 0x3b868 ; 0x3b868 c894: 60 e0 ldi r22, 0x00 ; 0 c896: 8f e7 ldi r24, 0x7F ; 127 c898: 9c e0 ldi r25, 0x0C ; 12 c89a: 0f 94 34 dc call 0x3b868 ; 0x3b868 // 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; c89e: 80 e0 ldi r24, 0x00 ; 0 c8a0: 90 e0 ldi r25, 0x00 ; 0 c8a2: a0 e8 ldi r26, 0x80 ; 128 c8a4: bf eb ldi r27, 0xBF ; 191 c8a6: 80 93 83 02 sts 0x0283, r24 ; 0x800283 c8aa: 90 93 84 02 sts 0x0284, r25 ; 0x800284 c8ae: a0 93 85 02 sts 0x0285, r26 ; 0x800285 c8b2: b0 93 86 02 sts 0x0286, r27 ; 0x800286 saved_printing_type = PowerPanic::PRINT_TYPE_NONE; c8b6: 82 e0 ldi r24, 0x02 ; 2 c8b8: 80 93 6a 02 sts 0x026A, r24 ; 0x80026a saved_printing = false; c8bc: 10 92 a8 0d sts 0x0DA8, r1 ; 0x800da8 } c8c0: 08 95 ret 0000c8c2 : enquecommandf_P(MSG_M23, filename); } void restore_extruder_temperature_from_ram() { if ((uint16_t)degTargetHotend(active_extruder) != saved_extruder_temperature) c8c2: 80 91 ab 05 lds r24, 0x05AB ; 0x8005ab c8c6: 90 91 ac 05 lds r25, 0x05AC ; 0x8005ac c8ca: 20 91 b5 0d lds r18, 0x0DB5 ; 0x800db5 c8ce: 30 91 b6 0d lds r19, 0x0DB6 ; 0x800db6 c8d2: 28 17 cp r18, r24 c8d4: 39 07 cpc r19, r25 c8d6: 71 f0 breq .+28 ; 0xc8f4 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; c8d8: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 c8dc: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 { setTargetHotend(saved_extruder_temperature); heating_status = HeatingStatus::EXTRUDER_HEATING; c8e0: 81 e0 ldi r24, 0x01 ; 1 c8e2: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 wait_for_heater(_millis(), active_extruder); c8e6: 0f 94 28 2a call 0x25450 ; 0x25450 c8ea: 0f 94 d8 82 call 0x305b0 ; 0x305b0 heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE; c8ee: 82 e0 ldi r24, 0x02 ; 2 c8f0: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 } } c8f4: 08 95 ret 0000c8f6 : saved_fan_speed = fanSpeed; isPartialBackupAvailable = true; } void __attribute__((noinline)) refresh_saved_feedrate_multiplier_in_ram() { if (!saved_printing) { c8f6: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 c8fa: 88 23 and r24, r24 c8fc: 41 f0 breq .+16 ; 0xc90e // There is no saved print, therefore nothing to refresh return; } saved_feedmultiply2 = feedmultiply; c8fe: 80 91 39 02 lds r24, 0x0239 ; 0x800239 c902: 90 91 3a 02 lds r25, 0x023A ; 0x80023a c906: 90 93 70 03 sts 0x0370, r25 ; 0x800370 c90a: 80 93 6f 03 sts 0x036F, r24 ; 0x80036f } c90e: 08 95 ret 0000c910 : //not sd printing nor usb printing } } void save_planner_global_state() { if (current_block && !(mesh_bed_leveling_flag || homing_flag)) c910: 80 91 a0 05 lds r24, 0x05A0 ; 0x8005a0 c914: 90 91 a1 05 lds r25, 0x05A1 ; 0x8005a1 c918: 00 97 sbiw r24, 0x00 ; 0 c91a: 29 f1 breq .+74 ; 0xc966 c91c: 20 91 a7 0d lds r18, 0x0DA7 ; 0x800da7 c920: 21 11 cpse r18, r1 c922: 21 c0 rjmp .+66 ; 0xc966 c924: 20 91 a6 0d lds r18, 0x0DA6 ; 0x800da6 c928: 21 11 cpse r18, r1 c92a: 1d c0 rjmp .+58 ; 0xc966 { memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position)); c92c: fc 01 movw r30, r24 c92e: e8 5a subi r30, 0xA8 ; 168 c930: ff 4f sbci r31, 0xFF ; 255 c932: 20 e1 ldi r18, 0x10 ; 16 c934: a3 e8 ldi r26, 0x83 ; 131 c936: b2 e0 ldi r27, 0x02 ; 2 c938: 01 90 ld r0, Z+ c93a: 0d 92 st X+, r0 c93c: 2a 95 dec r18 c93e: e1 f7 brne .-8 ; 0xc938 saved_feedrate2 = current_block->gcode_feedrate; c940: fc 01 movw r30, r24 c942: e6 59 subi r30, 0x96 ; 150 c944: ff 4f sbci r31, 0xFF ; 255 c946: 20 81 ld r18, Z c948: 31 81 ldd r19, Z+1 ; 0x01 c94a: 30 93 5e 05 sts 0x055E, r19 ; 0x80055e c94e: 20 93 5d 05 sts 0x055D, r18 ; 0x80055d saved_segment_idx = current_block->segment_idx; c952: 88 59 subi r24, 0x98 ; 152 c954: 9f 4f sbci r25, 0xFF ; 255 c956: fc 01 movw r30, r24 c958: 80 81 ld r24, Z c95a: 91 81 ldd r25, Z+1 ; 0x01 c95c: 90 93 69 05 sts 0x0569, r25 ; 0x800569 c960: 80 93 68 05 sts 0x0568, r24 ; 0x800568 c964: 08 95 ret } else { saved_start_position[0] = SAVED_START_POSITION_UNSET; c966: 80 e0 ldi r24, 0x00 ; 0 c968: 90 e0 ldi r25, 0x00 ; 0 c96a: a0 e8 ldi r26, 0x80 ; 128 c96c: bf eb ldi r27, 0xBF ; 191 c96e: 80 93 83 02 sts 0x0283, r24 ; 0x800283 c972: 90 93 84 02 sts 0x0284, r25 ; 0x800284 c976: a0 93 85 02 sts 0x0285, r26 ; 0x800285 c97a: b0 93 86 02 sts 0x0286, r27 ; 0x800286 saved_feedrate2 = feedrate; c97e: 60 91 b8 02 lds r22, 0x02B8 ; 0x8002b8 c982: 70 91 b9 02 lds r23, 0x02B9 ; 0x8002b9 c986: 80 91 ba 02 lds r24, 0x02BA ; 0x8002ba c98a: 90 91 bb 02 lds r25, 0x02BB ; 0x8002bb c98e: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> c992: 70 93 5e 05 sts 0x055E, r23 ; 0x80055e c996: 60 93 5d 05 sts 0x055D, r22 ; 0x80055d saved_segment_idx = 0; c99a: 10 92 69 05 sts 0x0569, r1 ; 0x800569 c99e: 10 92 68 05 sts 0x0568, r1 ; 0x800568 } } c9a2: 08 95 ret 0000c9a4 : SERIAL_PROTOCOLPGM(" E:0 B:"); SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(); } void save_print_file_state() { c9a4: cf 92 push r12 c9a6: df 92 push r13 c9a8: ef 92 push r14 c9aa: ff 92 push r15 uint8_t nlines; uint16_t sdlen_cmdqueue; uint16_t sdlen_planner; if (card.sdprinting) { c9ac: 80 91 8f 14 lds r24, 0x148F ; 0x80148f c9b0: 88 23 and r24, r24 c9b2: d9 f1 breq .+118 ; 0xca2a saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue c9b4: 80 91 80 03 lds r24, 0x0380 ; 0x800380 c9b8: 90 91 81 03 lds r25, 0x0381 ; 0x800381 c9bc: a0 91 82 03 lds r26, 0x0382 ; 0x800382 c9c0: b0 91 83 03 lds r27, 0x0383 ; 0x800383 c9c4: 80 93 5f 05 sts 0x055F, r24 ; 0x80055f c9c8: 90 93 60 05 sts 0x0560, r25 ; 0x800560 c9cc: a0 93 61 05 sts 0x0561, r26 ; 0x800561 c9d0: b0 93 62 05 sts 0x0562, r27 ; 0x800562 sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner c9d4: 0f 94 26 64 call 0x2c84c ; 0x2c84c saved_sdpos -= sdlen_planner; c9d8: c0 90 5f 05 lds r12, 0x055F ; 0x80055f c9dc: d0 90 60 05 lds r13, 0x0560 ; 0x800560 c9e0: e0 90 61 05 lds r14, 0x0561 ; 0x800561 c9e4: f0 90 62 05 lds r15, 0x0562 ; 0x800562 c9e8: c8 1a sub r12, r24 c9ea: d9 0a sbc r13, r25 c9ec: e1 08 sbc r14, r1 c9ee: f1 08 sbc r15, r1 c9f0: c0 92 5f 05 sts 0x055F, r12 ; 0x80055f c9f4: d0 92 60 05 sts 0x0560, r13 ; 0x800560 c9f8: e0 92 61 05 sts 0x0561, r14 ; 0x800561 c9fc: f0 92 62 05 sts 0x0562, r15 ; 0x800562 sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue ca00: 0e 94 ab 5a call 0xb556 ; 0xb556 saved_sdpos -= sdlen_cmdqueue; ca04: c8 1a sub r12, r24 ca06: d9 0a sbc r13, r25 ca08: e1 08 sbc r14, r1 ca0a: f1 08 sbc r15, r1 ca0c: c0 92 5f 05 sts 0x055F, r12 ; 0x80055f ca10: d0 92 60 05 sts 0x0560, r13 ; 0x800560 ca14: e0 92 61 05 sts 0x0561, r14 ; 0x800561 ca18: f0 92 62 05 sts 0x0562, r15 ; 0x800562 saved_printing_type = PowerPanic::PRINT_TYPE_SD; ca1c: 10 92 6a 02 sts 0x026A, r1 ; 0x80026a } else { saved_printing_type = PowerPanic::PRINT_TYPE_NONE; //not sd printing nor usb printing } } ca20: ff 90 pop r15 ca22: ef 90 pop r14 ca24: df 90 pop r13 ca26: cf 90 pop r12 ca28: 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 ca2a: 80 91 0d 05 lds r24, 0x050D ; 0x80050d ca2e: 88 23 and r24, r24 ca30: b1 f1 breq .+108 ; 0xca9e saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue ca32: 80 91 78 03 lds r24, 0x0378 ; 0x800378 ca36: 90 91 79 03 lds r25, 0x0379 ; 0x800379 ca3a: a0 91 7a 03 lds r26, 0x037A ; 0x80037a ca3e: b0 91 7b 03 lds r27, 0x037B ; 0x80037b ca42: 80 93 5f 05 sts 0x055F, r24 ; 0x80055f ca46: 90 93 60 05 sts 0x0560, r25 ; 0x800560 ca4a: a0 93 61 05 sts 0x0561, r26 ; 0x800561 ca4e: b0 93 62 05 sts 0x0562, r27 ; 0x800562 //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 ca52: 0f 94 26 64 call 0x2c84c ; 0x2c84c saved_sdpos -= nlines; ca56: 40 91 5f 05 lds r20, 0x055F ; 0x80055f ca5a: 50 91 60 05 lds r21, 0x0560 ; 0x800560 ca5e: 60 91 61 05 lds r22, 0x0561 ; 0x800561 ca62: 70 91 62 05 lds r23, 0x0562 ; 0x800562 ca66: 48 1b sub r20, r24 ca68: 51 09 sbc r21, r1 ca6a: 61 09 sbc r22, r1 ca6c: 71 09 sbc r23, r1 saved_sdpos -= buflen; //number of blocks in cmd buffer ca6e: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 ca72: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 ca76: 09 2e mov r0, r25 ca78: 00 0c add r0, r0 ca7a: aa 0b sbc r26, r26 ca7c: bb 0b sbc r27, r27 ca7e: 48 1b sub r20, r24 ca80: 59 0b sbc r21, r25 ca82: 6a 0b sbc r22, r26 ca84: 7b 0b sbc r23, r27 ca86: 40 93 5f 05 sts 0x055F, r20 ; 0x80055f ca8a: 50 93 60 05 sts 0x0560, r21 ; 0x800560 ca8e: 60 93 61 05 sts 0x0561, r22 ; 0x800561 ca92: 70 93 62 05 sts 0x0562, r23 ; 0x800562 saved_printing_type = PowerPanic::PRINT_TYPE_HOST; ca96: 81 e0 ldi r24, 0x01 ; 1 } else { saved_printing_type = PowerPanic::PRINT_TYPE_NONE; ca98: 80 93 6a 02 sts 0x026A, r24 ; 0x80026a ca9c: c1 cf rjmp .-126 ; 0xca20 ca9e: 82 e0 ldi r24, 0x02 ; 2 caa0: fb cf rjmp .-10 ; 0xca98 0000caa2 : if (extrudemultiply != 100) out *= float(extrudemultiply) * 0.01f; return out; } void calculate_extruder_multipliers() { caa2: cf 92 push r12 caa4: df 92 push r13 caa6: ef 92 push r14 caa8: ff 92 push r15 extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]); caaa: c0 90 55 0e lds r12, 0x0E55 ; 0x800e55 caae: d0 90 56 0e lds r13, 0x0E56 ; 0x800e56 cab2: e0 90 57 0e lds r14, 0x0E57 ; 0x800e57 cab6: f0 90 58 0e lds r15, 0x0E58 ; 0x800e58 } } float calculate_extruder_multiplier(float diameter) { float out = 1.f; if (cs.volumetric_enabled && diameter > 0.f) { caba: 80 91 54 0e lds r24, 0x0E54 ; 0x800e54 cabe: 88 23 and r24, r24 cac0: 09 f4 brne .+2 ; 0xcac4 cac2: 4e c0 rjmp .+156 ; 0xcb60 cac4: 20 e0 ldi r18, 0x00 ; 0 cac6: 30 e0 ldi r19, 0x00 ; 0 cac8: a9 01 movw r20, r18 caca: c7 01 movw r24, r14 cacc: b6 01 movw r22, r12 cace: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> cad2: 18 16 cp r1, r24 cad4: 0c f0 brlt .+2 ; 0xcad8 cad6: 44 c0 rjmp .+136 ; 0xcb60 float area = M_PI * diameter * diameter * 0.25; cad8: 2b ed ldi r18, 0xDB ; 219 cada: 3f e0 ldi r19, 0x0F ; 15 cadc: 49 e4 ldi r20, 0x49 ; 73 cade: 50 e4 ldi r21, 0x40 ; 64 cae0: c7 01 movw r24, r14 cae2: b6 01 movw r22, r12 cae4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> cae8: a7 01 movw r20, r14 caea: 96 01 movw r18, r12 caec: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> caf0: 20 e0 ldi r18, 0x00 ; 0 caf2: 30 e0 ldi r19, 0x00 ; 0 caf4: 40 e8 ldi r20, 0x80 ; 128 caf6: 5e e3 ldi r21, 0x3E ; 62 caf8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> cafc: 9b 01 movw r18, r22 cafe: ac 01 movw r20, r24 out = 1.f / area; cb00: 60 e0 ldi r22, 0x00 ; 0 cb02: 70 e0 ldi r23, 0x00 ; 0 cb04: 80 e8 ldi r24, 0x80 ; 128 cb06: 9f e3 ldi r25, 0x3F ; 63 cb08: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> cb0c: 6b 01 movw r12, r22 cb0e: 7c 01 movw r14, r24 } if (extrudemultiply != 100) cb10: 60 91 bc 02 lds r22, 0x02BC ; 0x8002bc cb14: 70 91 bd 02 lds r23, 0x02BD ; 0x8002bd cb18: 64 36 cpi r22, 0x64 ; 100 cb1a: 71 05 cpc r23, r1 cb1c: a1 f0 breq .+40 ; 0xcb46 out *= float(extrudemultiply) * 0.01f; cb1e: 07 2e mov r0, r23 cb20: 00 0c add r0, r0 cb22: 88 0b sbc r24, r24 cb24: 99 0b sbc r25, r25 cb26: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> cb2a: 2a e0 ldi r18, 0x0A ; 10 cb2c: 37 ed ldi r19, 0xD7 ; 215 cb2e: 43 e2 ldi r20, 0x23 ; 35 cb30: 5c e3 ldi r21, 0x3C ; 60 cb32: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> cb36: 9b 01 movw r18, r22 cb38: ac 01 movw r20, r24 cb3a: c7 01 movw r24, r14 cb3c: b6 01 movw r22, r12 cb3e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> cb42: 6b 01 movw r12, r22 cb44: 7c 01 movw r14, r24 return out; } void calculate_extruder_multipliers() { extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]); cb46: c0 92 93 02 sts 0x0293, r12 ; 0x800293 cb4a: d0 92 94 02 sts 0x0294, r13 ; 0x800294 cb4e: e0 92 95 02 sts 0x0295, r14 ; 0x800295 cb52: f0 92 96 02 sts 0x0296, r15 ; 0x800296 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 } cb56: ff 90 pop r15 cb58: ef 90 pop r14 cb5a: df 90 pop r13 cb5c: cf 90 pop r12 cb5e: 08 95 ret MMU2::mmu2.ClearTMCFailures(); // not stored into EEPROM } } float calculate_extruder_multiplier(float diameter) { float out = 1.f; cb60: c1 2c mov r12, r1 cb62: d1 2c mov r13, r1 cb64: 80 e8 ldi r24, 0x80 ; 128 cb66: e8 2e mov r14, r24 cb68: 8f e3 ldi r24, 0x3F ; 63 cb6a: f8 2e mov r15, r24 cb6c: d1 cf rjmp .-94 ; 0xcb10 0000cb6e : } } #endif //FAST_PWM_FAN void save_statistics() { cb6e: 8f 92 push r8 cb70: 9f 92 push r9 cb72: af 92 push r10 cb74: bf 92 push r11 cb76: cf 92 push r12 cb78: df 92 push r13 cb7a: ef 92 push r14 cb7c: ff 92 push r15 uint32_t _previous_filament = eeprom_init_default_dword((uint32_t *)EEPROM_FILAMENTUSED, 0); //_previous_filament unit: centimeter cb7e: 81 ef ldi r24, 0xF1 ; 241 cb80: 9f e0 ldi r25, 0x0F ; 15 cb82: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 cb86: 6b 01 movw r12, r22 cb88: 7c 01 movw r14, r24 uint32_t _previous_time = eeprom_init_default_dword((uint32_t *)EEPROM_TOTALTIME, 0); //_previous_time unit: min cb8a: 8d ee ldi r24, 0xED ; 237 cb8c: 9f e0 ldi r25, 0x0F ; 15 cb8e: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 cb92: 4b 01 movw r8, r22 cb94: 5c 01 movw r10, r24 uint32_t time_minutes = print_job_timer.duration() / 60; cb96: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 cb9a: 2c e3 ldi r18, 0x3C ; 60 cb9c: 30 e0 ldi r19, 0x00 ; 0 cb9e: 40 e0 ldi r20, 0x00 ; 0 cba0: 50 e0 ldi r21, 0x00 ; 0 cba2: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, _previous_time + time_minutes); // EEPROM_TOTALTIME unit: min cba6: ba 01 movw r22, r20 cba8: a9 01 movw r20, r18 cbaa: 48 0d add r20, r8 cbac: 59 1d adc r21, r9 cbae: 6a 1d adc r22, r10 cbb0: 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); cbb2: 8d ee ldi r24, 0xED ; 237 cbb4: 9f e0 ldi r25, 0x0F ; 15 cbb6: 0f 94 46 dc call 0x3b88c ; 0x3b88c eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, _previous_filament + (total_filament_used / 1000)); cbba: 60 91 64 06 lds r22, 0x0664 ; 0x800664 cbbe: 70 91 65 06 lds r23, 0x0665 ; 0x800665 cbc2: 80 91 66 06 lds r24, 0x0666 ; 0x800666 cbc6: 90 91 67 06 lds r25, 0x0667 ; 0x800667 cbca: 28 ee ldi r18, 0xE8 ; 232 cbcc: 33 e0 ldi r19, 0x03 ; 3 cbce: 40 e0 ldi r20, 0x00 ; 0 cbd0: 50 e0 ldi r21, 0x00 ; 0 cbd2: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> cbd6: ba 01 movw r22, r20 cbd8: a9 01 movw r20, r18 cbda: 4c 0d add r20, r12 cbdc: 5d 1d adc r21, r13 cbde: 6e 1d adc r22, r14 cbe0: 7f 1d adc r23, r15 cbe2: 81 ef ldi r24, 0xF1 ; 241 cbe4: 9f e0 ldi r25, 0x0F ; 15 cbe6: 0f 94 46 dc call 0x3b88c ; 0x3b88c print_job_timer.reset(); cbea: 0f 94 33 43 call 0x28666 ; 0x28666 total_filament_used = 0; cbee: 10 92 64 06 sts 0x0664, r1 ; 0x800664 cbf2: 10 92 65 06 sts 0x0665, r1 ; 0x800665 cbf6: 10 92 66 06 sts 0x0666, r1 ; 0x800666 cbfa: 10 92 67 06 sts 0x0667, r1 ; 0x800667 if (MMU2::mmu2.Enabled()) { cbfe: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 cc02: 81 30 cpi r24, 0x01 ; 1 cc04: 81 f4 brne .+32 ; 0xcc26 eeprom_add_dword((uint32_t *)EEPROM_MMU_MATERIAL_CHANGES, MMU2::mmu2.ToolChangeCounter()); cc06: 60 91 bd 13 lds r22, 0x13BD ; 0x8013bd cc0a: 70 91 be 13 lds r23, 0x13BE ; 0x8013be cc0e: 90 e0 ldi r25, 0x00 ; 0 cc10: 80 e0 ldi r24, 0x00 ; 0 cc12: 0f 94 3c 7b call 0x2f678 ; 0x2f678 /// @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; }; cc16: 10 92 be 13 sts 0x13BE, r1 ; 0x8013be cc1a: 10 92 bd 13 sts 0x13BD, r1 ; 0x8013bd inline uint16_t TMCFailures() const { return tmcFailures; } inline void IncrementTMCFailures() { ++tmcFailures; } inline void ClearTMCFailures() { tmcFailures = 0; } cc1e: 10 92 c0 13 sts 0x13C0, r1 ; 0x8013c0 cc22: 10 92 bf 13 sts 0x13BF, r1 ; 0x8013bf // @@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 } } cc26: ff 90 pop r15 cc28: ef 90 pop r14 cc2a: df 90 pop r13 cc2c: cf 90 pop r12 cc2e: bf 90 pop r11 cc30: af 90 pop r10 cc32: 9f 90 pop r9 cc34: 8f 90 pop r8 cc36: 08 95 ret 0000cc38 : } #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); cc38: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 cc3c: 1f 92 push r1 cc3e: 8f 93 push r24 cc40: 80 91 69 03 lds r24, 0x0369 ; 0x800369 cc44: 1f 92 push r1 cc46: 8f 93 push r24 cc48: e7 ec ldi r30, 0xC7 ; 199 cc4a: f3 e0 ldi r31, 0x03 ; 3 cc4c: 42 81 ldd r20, Z+2 ; 0x02 cc4e: 53 81 ldd r21, Z+3 ; 0x03 cc50: 2c e3 ldi r18, 0x3C ; 60 cc52: 24 9f mul r18, r20 cc54: c0 01 movw r24, r0 cc56: 25 9f mul r18, r21 cc58: 90 0d add r25, r0 cc5a: 11 24 eor r1, r1 cc5c: 9f 93 push r25 cc5e: 8f 93 push r24 cc60: 40 81 ld r20, Z cc62: 51 81 ldd r21, Z+1 ; 0x01 cc64: 24 9f mul r18, r20 cc66: c0 01 movw r24, r0 cc68: 25 9f mul r18, r21 cc6a: 90 0d add r25, r0 cc6c: 11 24 eor r1, r1 cc6e: 9f 93 push r25 cc70: 8f 93 push r24 cc72: 88 eb ldi r24, 0xB8 ; 184 cc74: 95 e6 ldi r25, 0x65 ; 101 cc76: 9f 93 push r25 cc78: 8f 93 push r24 cc7a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 cc7e: 8d b7 in r24, 0x3d ; 61 cc80: 9e b7 in r25, 0x3e ; 62 cc82: 0a 96 adiw r24, 0x0a ; 10 cc84: 0f b6 in r0, 0x3f ; 63 cc86: f8 94 cli cc88: 9e bf out 0x3e, r25 ; 62 cc8a: 0f be out 0x3f, r0 ; 63 cc8c: 8d bf out 0x3d, r24 ; 61 } cc8e: 08 95 ret 0000cc90 : // Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); sei(); } void force_high_power_mode(bool start_high_power_section) { cc90: cf 93 push r28 cc92: c8 2f mov r28, r24 #ifdef PSU_Delta if (start_high_power_section == true) enable_force_z(); #endif //PSU_Delta uint8_t silent; silent = eeprom_read_byte((uint8_t*)EEPROM_SILENT); cc94: 8f ef ldi r24, 0xFF ; 255 cc96: 9f e0 ldi r25, 0x0F ; 15 cc98: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (silent == 1 || tmc2130_mode == TMC2130_MODE_SILENT) { cc9c: 81 30 cpi r24, 0x01 ; 1 cc9e: 21 f0 breq .+8 ; 0xcca8 cca0: 80 91 8b 06 lds r24, 0x068B ; 0x80068b cca4: 81 30 cpi r24, 0x01 ; 1 cca6: 29 f4 brne .+10 ; 0xccb2 //we are in silent mode, set to normal mode to enable crash detection change_power_mode_live((start_high_power_section == true) ? TMC2130_MODE_NORMAL : TMC2130_MODE_SILENT); cca8: 81 e0 ldi r24, 0x01 ; 1 ccaa: 8c 27 eor r24, r28 } } ccac: cf 91 pop r28 #endif //PSU_Delta uint8_t silent; silent = eeprom_read_byte((uint8_t*)EEPROM_SILENT); if (silent == 1 || tmc2130_mode == TMC2130_MODE_SILENT) { //we are in silent mode, set to normal mode to enable crash detection change_power_mode_live((start_high_power_section == true) ? TMC2130_MODE_NORMAL : TMC2130_MODE_SILENT); ccae: 0c 94 21 60 jmp 0xc042 ; 0xc042 } } ccb2: cf 91 pop r28 ccb4: 08 95 ret 0000ccb6 : endstops_hit_on_purpose(); } void refresh_cmd_timeout(void) { previous_millis_cmd.start(); ccb6: 84 e8 ldi r24, 0x84 ; 132 ccb8: 93 e0 ldi r25, 0x03 ; 3 ccba: 0d 94 cb 2c jmp 0x25996 ; 0x25996 ::start()> 0000ccbe : } } #endif //TMC2130 float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min) { return feedrate_mm_min / 60.f; ccbe: 20 e0 ldi r18, 0x00 ; 0 ccc0: 30 e0 ldi r19, 0x00 ; 0 ccc2: 40 e7 ldi r20, 0x70 ; 112 ccc4: 52 e4 ldi r21, 0x42 ; 66 ccc6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> } ccca: 08 95 ret 0000cccc : } bool enable_endstops(bool check) { bool old = check_endstops; check_endstops = check; cccc: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> //! @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; ccd0: 40 91 64 03 lds r20, 0x0364 ; 0x800364 ccd4: 50 91 65 03 lds r21, 0x0365 ; 0x800365 ccd8: 60 91 66 03 lds r22, 0x0366 ; 0x800366 ccdc: 70 91 67 03 lds r23, 0x0367 ; 0x800367 cce0: 40 93 b8 02 sts 0x02B8, r20 ; 0x8002b8 cce4: 50 93 b9 02 sts 0x02B9, r21 ; 0x8002b9 cce8: 60 93 ba 02 sts 0x02BA, r22 ; 0x8002ba ccec: 70 93 bb 02 sts 0x02BB, r23 ; 0x8002bb feedmultiply = original_feedmultiply; ccf0: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a ccf4: 80 93 39 02 sts 0x0239, r24 ; 0x800239 previous_millis_cmd.start(); ccf8: 84 e8 ldi r24, 0x84 ; 132 ccfa: 93 e0 ldi r25, 0x03 ; 3 ccfc: 0d 94 cb 2c jmp 0x25996 ; 0x25996 ::start()> 0000cd00 : 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) { cd00: 1f 93 push r17 cd02: cf 93 push r28 cd04: df 93 push r29 cd06: 18 2f mov r17, r24 saved_feedrate = feedrate; cd08: 80 91 b8 02 lds r24, 0x02B8 ; 0x8002b8 cd0c: 90 91 b9 02 lds r25, 0x02B9 ; 0x8002b9 cd10: a0 91 ba 02 lds r26, 0x02BA ; 0x8002ba cd14: b0 91 bb 02 lds r27, 0x02BB ; 0x8002bb cd18: 80 93 64 03 sts 0x0364, r24 ; 0x800364 cd1c: 90 93 65 03 sts 0x0365, r25 ; 0x800365 cd20: a0 93 66 03 sts 0x0366, r26 ; 0x800366 cd24: b0 93 67 03 sts 0x0367, r27 ; 0x800367 int l_feedmultiply = feedmultiply; cd28: c0 91 39 02 lds r28, 0x0239 ; 0x800239 cd2c: d0 91 3a 02 lds r29, 0x023A ; 0x80023a feedmultiply = 100; cd30: 84 e6 ldi r24, 0x64 ; 100 cd32: 90 e0 ldi r25, 0x00 ; 0 cd34: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a cd38: 80 93 39 02 sts 0x0239, r24 ; 0x800239 previous_millis_cmd.start(); cd3c: 84 e8 ldi r24, 0x84 ; 132 cd3e: 93 e0 ldi r25, 0x03 ; 3 cd40: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> cd44: 10 93 b7 02 sts 0x02B7, r17 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(enable_endstops_now); return l_feedmultiply; } cd48: ce 01 movw r24, r28 cd4a: df 91 pop r29 cd4c: cf 91 pop r28 cd4e: 1f 91 pop r17 cd50: 08 95 ret 0000cd52 : cd52: 40 e0 ldi r20, 0x00 ; 0 cd54: 50 e0 ldi r21, 0x00 ; 0 cd56: ba 01 movw r22, r20 cd58: 8d ee ldi r24, 0xED ; 237 cd5a: 9f e0 ldi r25, 0x0F ; 15 cd5c: 0f 94 46 dc call 0x3b88c ; 0x3b88c cd60: 40 e0 ldi r20, 0x00 ; 0 cd62: 50 e0 ldi r21, 0x00 ; 0 cd64: ba 01 movw r22, r20 cd66: 81 ef ldi r24, 0xF1 ; 241 cd68: 9f e0 ldi r25, 0x0F ; 15 cd6a: 0f 94 46 dc call 0x3b88c ; 0x3b88c 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(); cd6e: 0e 94 bc 5b call 0xb778 ; 0xb778 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); cd72: 70 e0 ldi r23, 0x00 ; 0 cd74: 60 e0 ldi r22, 0x00 ; 0 cd76: 85 e0 ldi r24, 0x05 ; 5 cd78: 9f e0 ldi r25, 0x0F ; 15 cd7a: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 cd7e: 70 e0 ldi r23, 0x00 ; 0 cd80: 60 e0 ldi r22, 0x00 ; 0 cd82: 83 e0 ldi r24, 0x03 ; 3 cd84: 9f e0 ldi r25, 0x0F ; 15 cd86: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 cd8a: 70 e0 ldi r23, 0x00 ; 0 cd8c: 60 e0 ldi r22, 0x00 ; 0 cd8e: 81 e0 ldi r24, 0x01 ; 1 cd90: 9f e0 ldi r25, 0x0F ; 15 cd92: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 cd96: 70 e0 ldi r23, 0x00 ; 0 cd98: 60 e0 ldi r22, 0x00 ; 0 cd9a: 8f ef ldi r24, 0xFF ; 255 cd9c: 9e e0 ldi r25, 0x0E ; 14 cd9e: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 cda2: 70 e0 ldi r23, 0x00 ; 0 cda4: 60 e0 ldi r22, 0x00 ; 0 cda6: 83 ed ldi r24, 0xD3 ; 211 cda8: 9e e0 ldi r25, 0x0E ; 14 cdaa: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 cdae: 70 e0 ldi r23, 0x00 ; 0 cdb0: 60 e0 ldi r22, 0x00 ; 0 cdb2: 80 ed ldi r24, 0xD0 ; 208 cdb4: 9e e0 ldi r25, 0x0E ; 14 cdb6: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); cdba: 40 e0 ldi r20, 0x00 ; 0 cdbc: 50 e0 ldi r21, 0x00 ; 0 cdbe: ba 01 movw r22, r20 cdc0: 88 ea ldi r24, 0xA8 ; 168 cdc2: 9c e0 ldi r25, 0x0C ; 12 cdc4: 0d 94 46 dc jmp 0x3b88c ; 0x3b88c 0000cdc8 : wdt_disable(); } } void softReset(void) { cli(); cdc8: 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" ); cdca: 88 e1 ldi r24, 0x18 ; 24 cdcc: 98 e0 ldi r25, 0x08 ; 8 cdce: 0f b6 in r0, 0x3f ; 63 cdd0: f8 94 cli cdd2: a8 95 wdr cdd4: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> cdd8: 0f be out 0x3f, r0 ; 63 cdda: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> cdde: ff cf rjmp .-2 ; 0xcdde 0000cde0 : #endif //EMERGENCY_HANDLERS #endif //WATCHDOG } static inline void crash_and_burn(dump_crash_reason reason) { cde0: c8 2f mov r28, r24 WRITE(BEEPER, HIGH); cde2: 9f b7 in r25, 0x3f ; 63 cde4: f8 94 cli cde6: e2 e0 ldi r30, 0x02 ; 2 cde8: f1 e0 ldi r31, 0x01 ; 1 cdea: 80 81 ld r24, Z cdec: 84 60 ori r24, 0x04 ; 4 cdee: 80 83 st Z, r24 cdf0: 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); cdf2: 6c 2f mov r22, r28 cdf4: 83 e0 ldi r24, 0x03 ; 3 cdf6: 9d e0 ldi r25, 0x0D ; 13 cdf8: 0f 94 34 dc call 0x3b868 ; 0x3b868 eeprom_update_byte_notify((uint8_t*)EEPROM_FW_CRASH_FLAG, (uint8_t)reason); #ifdef EMERGENCY_DUMP xfdump_full_dump_and_reset(reason); cdfc: 8c 2f mov r24, r28 cdfe: 0e 94 75 ee call 0x1dcea ; 0x1dcea #elif defined(EMERGENCY_SERIAL_DUMP) if(emergency_serial_dump) serial_dump_and_reset(reason); #endif softReset(); ce02: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 0000ce06 <__vector_default>: crash_and_burn(dump_crash_reason::watchdog); } #endif ISR(BADISR_vect) { ce06: 1f 92 push r1 ce08: 0f 92 push r0 ce0a: 0f b6 in r0, 0x3f ; 63 ce0c: 0f 92 push r0 ce0e: 11 24 eor r1, r1 crash_and_burn(dump_crash_reason::bad_isr); ce10: 83 e0 ldi r24, 0x03 ; 3 ce12: 0e 94 f0 66 call 0xcde0 ; 0xcde0 0000ce16 <__vector_12>: } #ifdef EMERGENCY_HANDLERS #ifdef WATCHDOG ISR(WDT_vect) { ce16: 1f 92 push r1 ce18: 0f 92 push r0 ce1a: 0f b6 in r0, 0x3f ; 63 ce1c: 0f 92 push r0 ce1e: 11 24 eor r1, r1 crash_and_burn(dump_crash_reason::watchdog); ce20: 82 e0 ldi r24, 0x02 ; 2 ce22: 0e 94 f0 66 call 0xcde0 ; 0xcde0 0000ce26 : } #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); ce26: 85 ea ldi r24, 0xA5 ; 165 ce28: 9f e0 ldi r25, 0x0F ; 15 ce2a: 0f 94 10 dc call 0x3b820 ; 0x3b820 ce2e: 91 e0 ldi r25, 0x01 ; 1 ce30: 81 11 cpse r24, r1 ce32: 01 c0 rjmp .+2 ; 0xce36 ce34: 90 e0 ldi r25, 0x00 ; 0 } ce36: 89 2f mov r24, r25 ce38: 08 95 ret 0000ce3a : 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(); ce3a: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 ce3e: 81 11 cpse r24, r1 ce40: 06 c0 rjmp .+12 ; 0xce4e ce42: 81 e0 ldi r24, 0x01 ; 1 ce44: 90 91 9b 03 lds r25, 0x039B ; 0x80039b ce48: 92 30 cpi r25, 0x02 ; 2 ce4a: 09 f0 breq .+2 ; 0xce4e ce4c: 80 e0 ldi r24, 0x00 ; 0 } ce4e: 08 95 ret 0000ce50 : WRITE(SUICIDE_PIN, LOW); #endif } bool __attribute__((noinline)) printJobOngoing() { return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning()); ce50: 80 91 8f 14 lds r24, 0x148F ; 0x80148f ce54: 81 11 cpse r24, r1 ce56: 0a c0 rjmp .+20 ; 0xce6c ce58: 80 91 0d 05 lds r24, 0x050D ; 0x80050d ce5c: 81 11 cpse r24, r1 ce5e: 06 c0 rjmp .+12 ; 0xce6c ce60: 81 e0 ldi r24, 0x01 ; 1 ce62: 90 91 9b 03 lds r25, 0x039B ; 0x80039b ce66: 91 30 cpi r25, 0x01 ; 1 ce68: 09 f0 breq .+2 ; 0xce6c ce6a: 80 e0 ldi r24, 0x00 ; 0 } ce6c: 08 95 ret 0000ce6e : && !mesh_bed_leveling_flag && !homing_flag && e_active(); } bool __attribute__((noinline)) babystep_allowed() { ce6e: cf 93 push r28 ce70: df 93 push r29 return ( !homing_flag ce72: c0 91 a6 0d lds r28, 0x0DA6 ; 0x800da6 && !mesh_bed_leveling_flag && !printingIsPaused() && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) ce76: c1 11 cpse r28, r1 ce78: 1f c0 rjmp .+62 ; 0xceb8 && e_active(); } bool __attribute__((noinline)) babystep_allowed() { return ( !homing_flag && !mesh_bed_leveling_flag ce7a: 80 91 a7 0d lds r24, 0x0DA7 ; 0x800da7 ce7e: 81 11 cpse r24, r1 ce80: 1c c0 rjmp .+56 ; 0xceba && !printingIsPaused() ce82: 0e 94 1d 67 call 0xce3a ; 0xce3a ce86: 81 11 cpse r24, r1 ce88: 18 c0 rjmp .+48 ; 0xceba && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) ce8a: d0 91 b3 0d lds r29, 0x0DB3 ; 0x800db3 ce8e: d4 30 cpi r29, 0x04 ; 4 ce90: 61 f4 brne .+24 ; 0xceaa ce92: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 ce96: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 ce9a: 89 2b or r24, r25 ce9c: 91 f4 brne .+36 ; 0xcec2 ce9e: 80 91 71 06 lds r24, 0x0671 ; 0x800671 cea2: 90 91 72 06 lds r25, 0x0672 ; 0x800672 cea6: 89 2b or r24, r25 cea8: 61 f4 brne .+24 ; 0xcec2 || printJobOngoing() ceaa: 0e 94 28 67 call 0xce50 ; 0xce50 ceae: c8 2f mov r28, r24 ceb0: 81 11 cpse r24, r1 ceb2: 03 c0 rjmp .+6 ; 0xceba || lcd_commands_type == LcdCommands::Idle ceb4: c1 e0 ldi r28, 0x01 ; 1 ceb6: 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) ceb8: c0 e0 ldi r28, 0x00 ; 0 || printJobOngoing() || lcd_commands_type == LcdCommands::Idle ) ); } ceba: 8c 2f mov r24, r28 cebc: df 91 pop r29 cebe: cf 91 pop r28 cec0: 08 95 ret bool __attribute__((noinline)) babystep_allowed() { return ( !homing_flag && !mesh_bed_leveling_flag && !printingIsPaused() && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS) cec2: c1 e0 ldi r28, 0x01 ; 1 cec4: fa cf rjmp .-12 ; 0xceba 0000cec6 : ) ); } bool __attribute__((noinline)) babystep_allowed_strict() { return ( babystep_allowed() && current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU); cec6: 0e 94 37 67 call 0xce6e ; 0xce6e ceca: 88 23 and r24, r24 cecc: 89 f0 breq .+34 ; 0xcef0 cece: 20 e0 ldi r18, 0x00 ; 0 ced0: 30 e0 ldi r19, 0x00 ; 0 ced2: 40 e0 ldi r20, 0x00 ; 0 ced4: 50 e4 ldi r21, 0x40 ; 64 ced6: 60 91 99 06 lds r22, 0x0699 ; 0x800699 ceda: 70 91 9a 06 lds r23, 0x069A ; 0x80069a cede: 80 91 9b 06 lds r24, 0x069B ; 0x80069b cee2: 90 91 9c 06 lds r25, 0x069C ; 0x80069c cee6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> ceea: 88 1f adc r24, r24 ceec: 88 27 eor r24, r24 ceee: 88 1f adc r24, r24 } cef0: 08 95 ret 0000cef2 : bool printingIsPaused() { return did_pause_print || print_job_timer.isPaused(); } bool __attribute__((noinline)) printer_active() { return printJobOngoing() cef2: 0e 94 28 67 call 0xce50 ; 0xce50 || printingIsPaused() || saved_printing || (lcd_commands_type != LcdCommands::Idle) || MMU2::mmu2.MMU_PRINT_SAVED() || homing_flag || mesh_bed_leveling_flag; cef6: 81 11 cpse r24, r1 cef8: 18 c0 rjmp .+48 ; 0xcf2a return did_pause_print || print_job_timer.isPaused(); } bool __attribute__((noinline)) printer_active() { return printJobOngoing() || printingIsPaused() cefa: 0e 94 1d 67 call 0xce3a ; 0xce3a cefe: 81 11 cpse r24, r1 cf00: 14 c0 rjmp .+40 ; 0xcf2a || saved_printing cf02: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 cf06: 81 11 cpse r24, r1 cf08: 10 c0 rjmp .+32 ; 0xcf2a || (lcd_commands_type != LcdCommands::Idle) cf0a: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 cf0e: 81 11 cpse r24, r1 cf10: 0b c0 rjmp .+22 ; 0xcf28 || MMU2::mmu2.MMU_PRINT_SAVED() cf12: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba cf16: 81 11 cpse r24, r1 cf18: 07 c0 rjmp .+14 ; 0xcf28 || homing_flag cf1a: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 cf1e: 81 11 cpse r24, r1 cf20: 04 c0 rjmp .+8 ; 0xcf2a || mesh_bed_leveling_flag; cf22: 80 91 a7 0d lds r24, 0x0DA7 ; 0x800da7 cf26: 08 95 ret cf28: 81 e0 ldi r24, 0x01 ; 1 } cf2a: 08 95 ret 0000cf2c : // accordingly refreshCurrentScaling(); } void __attribute__((noinline)) setiHold(uint8_t ih) { iHold = vSense ? ih : ih >> 1; cf2c: fc 01 movw r30, r24 cf2e: 20 81 ld r18, Z cf30: 21 11 cpse r18, r1 cf32: 01 c0 rjmp .+2 ; 0xcf36 cf34: 66 95 lsr r22 cf36: fc 01 movw r30, r24 cf38: 62 83 std Z+2, r22 ; 0x02 // Note that iHold cannot change the vSense bit. If iHold is larger // than iRun, then iHold is truncated later in SetCurrents() } cf3a: 08 95 ret 0000cf3c : inline uint8_t getOriginaliRun() const { return vSense ? iRun : iRun << 1; } inline uint8_t getOriginaliHold() const { return min(vSense ? iHold : iHold << 1, getOriginaliRun()); } inline bool iHoldIsClamped() const { return iHold > iRun; } inline uint8_t getvSense() const { return vSense; } void __attribute__((noinline)) setiRun(uint8_t ir) { cf3c: fc 01 movw r30, r24 iRun = ir; cf3e: 61 83 std Z+1, r22 ; 0x01 void refreshCurrentScaling() { // IMPORTANT: iRun must have range 0 to 63 (2^6) so we can properly // update the current scaling back and forth // Detect new vSense value const bool newvSense = (iRun < 32); cf40: 21 e0 ldi r18, 0x01 ; 1 cf42: 60 32 cpi r22, 0x20 ; 32 cf44: 08 f0 brcs .+2 ; 0xcf48 cf46: 20 e0 ldi r18, 0x00 ; 0 if (vSense != newvSense) { cf48: 90 81 ld r25, Z cf4a: 29 17 cp r18, r25 cf4c: 81 f0 breq .+32 ; 0xcf6e cf4e: 82 81 ldd r24, Z+2 ; 0x02 // Update currents to match current scaling if (vSense) { cf50: 99 23 and r25, r25 cf52: 51 f0 breq .+20 ; 0xcf68 // vSense was 1 [V_FS = 0.32V] but is changing to 0 [V_FS = 0.18V] // Half both current values to be in sync with current scale range iHold >>= 1; cf54: 90 e0 ldi r25, 0x00 ; 0 cf56: 95 95 asr r25 cf58: 87 95 ror r24 cf5a: 82 83 std Z+2, r24 ; 0x02 iRun >>= 1; cf5c: 70 e0 ldi r23, 0x00 ; 0 cf5e: 75 95 asr r23 cf60: 67 95 ror r22 cf62: 61 83 std Z+1, r22 ; 0x01 // Keep in mind, only a change in iRun can change vSense. iHold <<= 1; } // Update vSense vSense = newvSense; cf64: 20 83 st Z, r18 cf66: 08 95 ret } else { // vSense was 0 [V_FS = 0.18V], but is changing to 1 [V_FS = 0.32V] // double the Hold current value // iRun is expected to already be correct so no shift needed. // Keep in mind, only a change in iRun can change vSense. iHold <<= 1; cf68: 88 0f add r24, r24 cf6a: 82 83 std Z+2, r24 ; 0x02 cf6c: fb cf rjmp .-10 ; 0xcf64 } // Update vSense vSense = newvSense; } else if (!vSense) { cf6e: 21 11 cpse r18, r1 cf70: 04 c0 rjmp .+8 ; 0xcf7a // No change in vSense, but vSense = 0, which means we must scale down the iRun value // from range [0, 63] to range [0, 31] iRun >>= 1; cf72: 70 e0 ldi r23, 0x00 ; 0 cf74: 75 95 asr r23 cf76: 67 95 ror r22 cf78: 61 83 std Z+1, r22 ; 0x01 iRun = ir; // Refresh the vSense bit and take care of updating Hold/Run currents // accordingly refreshCurrentScaling(); } cf7a: 08 95 ret 0000cf7c : } #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; } cf7c: 20 91 91 12 lds r18, 0x1291 ; 0x801291 cf80: 30 91 92 12 lds r19, 0x1292 ; 0x801292 cf84: bc 01 movw r22, r24 cf86: c9 01 movw r24, r18 cf88: 89 55 subi r24, 0x59 ; 89 cf8a: 9f 4e sbci r25, 0xEF ; 239 cf8c: 0f 94 17 da call 0x3b42e ; 0x3b42e cf90: 9c 01 movw r18, r24 cf92: 90 93 94 03 sts 0x0394, r25 ; 0x800394 cf96: 80 93 93 03 sts 0x0393, r24 ; 0x800393 cf9a: 81 e0 ldi r24, 0x01 ; 1 cf9c: 23 2b or r18, r19 cf9e: 09 f4 brne .+2 ; 0xcfa2 cfa0: 80 e0 ldi r24, 0x00 ; 0 cfa2: 08 95 ret 0000cfa4 : inline void set_destination_to_current() { memcpy(destination, current_position, sizeof(destination)); } cfa4: 80 e1 ldi r24, 0x10 ; 16 cfa6: e1 e9 ldi r30, 0x91 ; 145 cfa8: f6 e0 ldi r31, 0x06 ; 6 cfaa: a3 e7 ldi r26, 0x73 ; 115 cfac: b6 e0 ldi r27, 0x06 ; 6 cfae: 01 90 ld r0, Z+ cfb0: 0d 92 st X+, r0 cfb2: 8a 95 dec r24 cfb4: e1 f7 brne .-8 ; 0xcfae cfb6: 08 95 ret 0000cfb8 : //! //! Internally lcd_update() is called by wait_for_heater(). //! //! @param e_move void restore_print_from_ram_and_continue(float e_move) { cfb8: 4f 92 push r4 cfba: 5f 92 push r5 cfbc: 6f 92 push r6 cfbe: 7f 92 push r7 cfc0: 8f 92 push r8 cfc2: 9f 92 push r9 cfc4: af 92 push r10 cfc6: bf 92 push r11 cfc8: cf 92 push r12 cfca: df 92 push r13 cfcc: ef 92 push r14 cfce: ff 92 push r15 cfd0: 0f 93 push r16 cfd2: 1f 93 push r17 cfd4: cf 93 push r28 cfd6: df 93 push r29 cfd8: 00 d0 rcall .+0 ; 0xcfda cfda: 00 d0 rcall .+0 ; 0xcfdc cfdc: 1f 92 push r1 cfde: 1f 92 push r1 cfe0: cd b7 in r28, 0x3d ; 61 cfe2: de b7 in r29, 0x3e ; 62 if (!saved_printing) return; cfe4: 20 91 a8 0d lds r18, 0x0DA8 ; 0x800da8 cfe8: 22 23 and r18, r18 cfea: 09 f4 brne .+2 ; 0xcfee cfec: 73 c1 rjmp .+742 ; 0xd2d4 #ifdef FANCHECK // Do not allow resume printing if fans are still not ok if (fan_check_error == EFCE_REPORTED) return; cfee: 20 91 e4 03 lds r18, 0x03E4 ; 0x8003e4 cff2: 22 30 cpi r18, 0x02 ; 2 cff4: 09 f4 brne .+2 ; 0xcff8 cff6: 6e c1 rjmp .+732 ; 0xd2d4 if (fan_check_error == EFCE_FIXED) fan_check_error = EFCE_OK; //reenable serial stream processing if printing from usb cff8: 20 91 e4 03 lds r18, 0x03E4 ; 0x8003e4 cffc: 21 30 cpi r18, 0x01 ; 1 cffe: 11 f4 brne .+4 ; 0xd004 d000: 10 92 e4 03 sts 0x03E4, r1 ; 0x8003e4 d004: 2b 01 movw r4, r22 d006: 3c 01 movw r6, r24 #endif // Make sure fan is turned off fanSpeed = 0; d008: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 // restore bed temperature (bed can be disabled during a thermal warning) if ((uint8_t)degBed() != saved_bed_temperature) d00c: 10 91 ad 05 lds r17, 0x05AD ; 0x8005ad d010: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed d014: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee d018: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef d01c: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 d020: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> d024: 61 17 cp r22, r17 d026: 31 f0 breq .+12 ; 0xd034 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; d028: 81 2f mov r24, r17 d02a: 90 e0 ldi r25, 0x00 ; 0 d02c: 90 93 72 06 sts 0x0672, r25 ; 0x800672 d030: 80 93 71 06 sts 0x0671, r24 ; 0x800671 setTargetBed(saved_bed_temperature); restore_extruder_temperature_from_ram(); d034: 0e 94 61 64 call 0xc8c2 ; 0xc8c2 // Restore saved fan speed fanSpeed = saved_fan_speed; d038: 80 91 aa 05 lds r24, 0x05AA ; 0x8005aa d03c: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK; d040: 90 91 e3 03 lds r25, 0x03E3 ; 0x8003e3 d044: 80 91 63 05 lds r24, 0x0563 ; 0x800563 d048: 81 95 neg r24 d04a: 89 27 eor r24, r25 d04c: 88 70 andi r24, 0x08 ; 8 d04e: 89 27 eor r24, r25 d050: 80 93 e3 03 sts 0x03E3, r24 ; 0x8003e3 float e = saved_pos[E_AXIS] - e_move; d054: a3 01 movw r20, r6 d056: 92 01 movw r18, r4 d058: 60 91 7f 02 lds r22, 0x027F ; 0x80027f d05c: 70 91 80 02 lds r23, 0x0280 ; 0x800280 d060: 80 91 81 02 lds r24, 0x0281 ; 0x800281 d064: 90 91 82 02 lds r25, 0x0282 ; 0x800282 d068: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d06c: 6d 83 std Y+5, r22 ; 0x05 d06e: 7e 83 std Y+6, r23 ; 0x06 d070: 8f 83 std Y+7, r24 ; 0x07 d072: 98 87 std Y+8, r25 ; 0x08 plan_set_e_position(e); d074: ce 01 movw r24, r28 d076: 05 96 adiw r24, 0x05 ; 5 d078: 0f 94 b5 64 call 0x2c96a ; 0x2c96a #ifdef FANCHECK fans_check_enabled = false; d07c: 10 92 38 02 sts 0x0238, r1 ; 0x800238 #endif // do not restore XY for commands that do not require that if (saved_pos[X_AXIS] == X_COORD_INVALID) d080: 20 e0 ldi r18, 0x00 ; 0 d082: 30 e0 ldi r19, 0x00 ; 0 d084: 40 e8 ldi r20, 0x80 ; 128 d086: 5f eb ldi r21, 0xBF ; 191 d088: 60 91 73 02 lds r22, 0x0273 ; 0x800273 d08c: 70 91 74 02 lds r23, 0x0274 ; 0x800274 d090: 80 91 75 02 lds r24, 0x0275 ; 0x800275 d094: 90 91 76 02 lds r25, 0x0276 ; 0x800276 d098: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d09c: 81 11 cpse r24, r1 d09e: 20 c0 rjmp .+64 ; 0xd0e0 { saved_pos[X_AXIS] = current_position[X_AXIS]; d0a0: 80 91 91 06 lds r24, 0x0691 ; 0x800691 d0a4: 90 91 92 06 lds r25, 0x0692 ; 0x800692 d0a8: a0 91 93 06 lds r26, 0x0693 ; 0x800693 d0ac: b0 91 94 06 lds r27, 0x0694 ; 0x800694 d0b0: 80 93 73 02 sts 0x0273, r24 ; 0x800273 d0b4: 90 93 74 02 sts 0x0274, r25 ; 0x800274 d0b8: a0 93 75 02 sts 0x0275, r26 ; 0x800275 d0bc: b0 93 76 02 sts 0x0276, r27 ; 0x800276 saved_pos[Y_AXIS] = current_position[Y_AXIS]; d0c0: 80 91 95 06 lds r24, 0x0695 ; 0x800695 d0c4: 90 91 96 06 lds r25, 0x0696 ; 0x800696 d0c8: a0 91 97 06 lds r26, 0x0697 ; 0x800697 d0cc: b0 91 98 06 lds r27, 0x0698 ; 0x800698 d0d0: 80 93 77 02 sts 0x0277, r24 ; 0x800277 d0d4: 90 93 78 02 sts 0x0278, r25 ; 0x800278 d0d8: a0 93 79 02 sts 0x0279, r26 ; 0x800279 d0dc: b0 93 7a 02 sts 0x027A, r27 ; 0x80027a } //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); d0e0: a3 01 movw r20, r6 d0e2: 92 01 movw r18, r4 d0e4: 60 91 7f 02 lds r22, 0x027F ; 0x80027f d0e8: 70 91 80 02 lds r23, 0x0280 ; 0x800280 d0ec: 80 91 81 02 lds r24, 0x0281 ; 0x800281 d0f0: 90 91 82 02 lds r25, 0x0282 ; 0x800282 d0f4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d0f8: 69 83 std Y+1, r22 ; 0x01 d0fa: 7a 83 std Y+2, r23 ; 0x02 d0fc: 8b 83 std Y+3, r24 ; 0x03 d0fe: 9c 83 std Y+4, r25 ; 0x04 d100: e0 90 99 06 lds r14, 0x0699 ; 0x800699 d104: f0 90 9a 06 lds r15, 0x069A ; 0x80069a d108: 00 91 9b 06 lds r16, 0x069B ; 0x80069b d10c: 10 91 9c 06 lds r17, 0x069C ; 0x80069c d110: 20 91 77 02 lds r18, 0x0277 ; 0x800277 d114: 30 91 78 02 lds r19, 0x0278 ; 0x800278 d118: 40 91 79 02 lds r20, 0x0279 ; 0x800279 d11c: 50 91 7a 02 lds r21, 0x027A ; 0x80027a d120: 60 91 73 02 lds r22, 0x0273 ; 0x800273 d124: 70 91 74 02 lds r23, 0x0274 ; 0x800274 d128: 80 91 75 02 lds r24, 0x0275 ; 0x800275 d12c: 90 91 76 02 lds r25, 0x0276 ; 0x800276 d130: 1f 92 push r1 d132: 1f 92 push r1 d134: 1f 92 push r1 d136: 1f 92 push r1 d138: e2 e6 ldi r30, 0x62 ; 98 d13a: 8e 2e mov r8, r30 d13c: e7 e2 ldi r30, 0x27 ; 39 d13e: 9e 2e mov r9, r30 d140: e6 e7 ldi r30, 0x76 ; 118 d142: ae 2e mov r10, r30 d144: e2 e4 ldi r30, 0x42 ; 66 d146: be 2e mov r11, r30 d148: fe 01 movw r30, r28 d14a: 31 96 adiw r30, 0x01 ; 1 d14c: 6f 01 movw r12, r30 d14e: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 //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); d152: a3 01 movw r20, r6 d154: 92 01 movw r18, r4 d156: 60 91 7f 02 lds r22, 0x027F ; 0x80027f d15a: 70 91 80 02 lds r23, 0x0280 ; 0x800280 d15e: 80 91 81 02 lds r24, 0x0281 ; 0x800281 d162: 90 91 82 02 lds r25, 0x0282 ; 0x800282 d166: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d16a: 69 83 std Y+1, r22 ; 0x01 d16c: 7a 83 std Y+2, r23 ; 0x02 d16e: 8b 83 std Y+3, r24 ; 0x03 d170: 9c 83 std Y+4, r25 ; 0x04 d172: e0 90 7b 02 lds r14, 0x027B ; 0x80027b d176: f0 90 7c 02 lds r15, 0x027C ; 0x80027c d17a: 00 91 7d 02 lds r16, 0x027D ; 0x80027d d17e: 10 91 7e 02 lds r17, 0x027E ; 0x80027e d182: 20 91 77 02 lds r18, 0x0277 ; 0x800277 d186: 30 91 78 02 lds r19, 0x0278 ; 0x800278 d18a: 40 91 79 02 lds r20, 0x0279 ; 0x800279 d18e: 50 91 7a 02 lds r21, 0x027A ; 0x80027a d192: 60 91 73 02 lds r22, 0x0273 ; 0x800273 d196: 70 91 74 02 lds r23, 0x0274 ; 0x800274 d19a: 80 91 75 02 lds r24, 0x0275 ; 0x800275 d19e: 90 91 76 02 lds r25, 0x0276 ; 0x800276 d1a2: 1f 92 push r1 d1a4: 1f 92 push r1 d1a6: 1f 92 push r1 d1a8: 1f 92 push r1 d1aa: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 //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); d1ae: e0 90 7b 02 lds r14, 0x027B ; 0x80027b d1b2: f0 90 7c 02 lds r15, 0x027C ; 0x80027c d1b6: 00 91 7d 02 lds r16, 0x027D ; 0x80027d d1ba: 10 91 7e 02 lds r17, 0x027E ; 0x80027e d1be: 20 91 77 02 lds r18, 0x0277 ; 0x800277 d1c2: 30 91 78 02 lds r19, 0x0278 ; 0x800278 d1c6: 40 91 79 02 lds r20, 0x0279 ; 0x800279 d1ca: 50 91 7a 02 lds r21, 0x027A ; 0x80027a d1ce: 60 91 73 02 lds r22, 0x0273 ; 0x800273 d1d2: 70 91 74 02 lds r23, 0x0274 ; 0x800274 d1d6: 80 91 75 02 lds r24, 0x0275 ; 0x800275 d1da: 90 91 76 02 lds r25, 0x0276 ; 0x800276 d1de: 1f 92 push r1 d1e0: 1f 92 push r1 d1e2: 1f 92 push r1 d1e4: 1f 92 push r1 d1e6: 81 2c mov r8, r1 d1e8: 91 2c mov r9, r1 d1ea: f8 ee ldi r31, 0xE8 ; 232 d1ec: af 2e mov r10, r31 d1ee: f2 e4 ldi r31, 0x42 ; 66 d1f0: bf 2e mov r11, r31 d1f2: af e7 ldi r26, 0x7F ; 127 d1f4: ca 2e mov r12, r26 d1f6: a2 e0 ldi r26, 0x02 ; 2 d1f8: da 2e mov r13, r26 d1fa: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 st_synchronize(); d1fe: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef FANCHECK fans_check_enabled = true; d202: 11 e0 ldi r17, 0x01 ; 1 d204: 10 93 38 02 sts 0x0238, r17 ; 0x800238 #endif // restore original feedrate/feedmultiply _after_ restoring the extruder position feedrate = saved_feedrate2; d208: 60 91 5d 05 lds r22, 0x055D ; 0x80055d d20c: 70 91 5e 05 lds r23, 0x055E ; 0x80055e d210: 90 e0 ldi r25, 0x00 ; 0 d212: 80 e0 ldi r24, 0x00 ; 0 d214: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> d218: 60 93 b8 02 sts 0x02B8, r22 ; 0x8002b8 d21c: 70 93 b9 02 sts 0x02B9, r23 ; 0x8002b9 d220: 80 93 ba 02 sts 0x02BA, r24 ; 0x8002ba d224: 90 93 bb 02 sts 0x02BB, r25 ; 0x8002bb feedmultiply = saved_feedmultiply2; d228: 80 91 6f 03 lds r24, 0x036F ; 0x80036f d22c: 90 91 70 03 lds r25, 0x0370 ; 0x800370 d230: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a d234: 80 93 39 02 sts 0x0239, r24 ; 0x800239 memcpy(current_position, saved_pos, sizeof(saved_pos)); d238: 80 e1 ldi r24, 0x10 ; 16 d23a: e3 e7 ldi r30, 0x73 ; 115 d23c: f2 e0 ldi r31, 0x02 ; 2 d23e: a1 e9 ldi r26, 0x91 ; 145 d240: b6 e0 ldi r27, 0x06 ; 6 d242: 01 90 ld r0, Z+ d244: 0d 92 st X+, r0 d246: 8a 95 dec r24 d248: e1 f7 brne .-8 ; 0xd242 set_destination_to_current(); d24a: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 //not sd printing nor usb printing } } void restore_print_file_state() { if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { //was sd printing d24e: 80 91 6a 02 lds r24, 0x026A ; 0x80026a d252: 0f b6 in r0, 0x3f ; 63 d254: f8 94 cli d256: de bf out 0x3e, r29 ; 62 d258: 0f be out 0x3f, r0 ; 63 d25a: cd bf out 0x3d, r28 ; 61 d25c: 81 11 cpse r24, r1 d25e: 51 c0 rjmp .+162 ; 0xd302 card.setIndex(saved_sdpos); d260: 60 91 5f 05 lds r22, 0x055F ; 0x80055f d264: 70 91 60 05 lds r23, 0x0560 ; 0x800560 d268: 80 91 61 05 lds r24, 0x0561 ; 0x800561 d26c: 90 91 62 05 lds r25, 0x0562 ; 0x800562 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; d270: 60 93 a3 17 sts 0x17A3, r22 ; 0x8017a3 d274: 70 93 a4 17 sts 0x17A4, r23 ; 0x8017a4 d278: 80 93 a5 17 sts 0x17A5, r24 ; 0x8017a5 d27c: 90 93 a6 17 sts 0x17A6, r25 ; 0x8017a6 d280: 0f 94 93 76 call 0x2ed26 ; 0x2ed26 sdpos_atomic = saved_sdpos; d284: 80 91 5f 05 lds r24, 0x055F ; 0x80055f d288: 90 91 60 05 lds r25, 0x0560 ; 0x800560 d28c: a0 91 61 05 lds r26, 0x0561 ; 0x800561 d290: b0 91 62 05 lds r27, 0x0562 ; 0x800562 d294: 80 93 80 03 sts 0x0380, r24 ; 0x800380 d298: 90 93 81 03 sts 0x0381, r25 ; 0x800381 d29c: a0 93 82 03 sts 0x0382, r26 ; 0x800382 d2a0: b0 93 83 03 sts 0x0383, r27 ; 0x800383 card.sdprinting = true; d2a4: 10 93 8f 14 sts 0x148F, r17 ; 0x80148f d2a8: 60 e0 ldi r22, 0x00 ; 0 d2aa: 85 ea ldi r24, 0xA5 ; 165 d2ac: 9f e0 ldi r25, 0x0F ; 15 d2ae: 0f 94 34 dc call 0x3b868 ; 0x3b868 d2b2: 60 e0 ldi r22, 0x00 ; 0 d2b4: 8f e7 ldi r24, 0x7F ; 127 d2b6: 9c e0 ldi r25, 0x0C ; 12 d2b8: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); d2bc: 82 e1 ldi r24, 0x12 ; 18 d2be: 90 e7 ldi r25, 0x70 ; 112 d2c0: 0e 94 16 f2 call 0x1e42c ; 0x1e42c saved_printing_type = PowerPanic::PRINT_TYPE_NONE; d2c4: 82 e0 ldi r24, 0x02 ; 2 d2c6: 80 93 6a 02 sts 0x026A, r24 ; 0x80026a saved_printing = false; d2ca: 10 92 a8 0d sts 0x0DA8, r1 ; 0x800da8 planner_aborted = true; // unroll the stack d2ce: 81 e0 ldi r24, 0x01 ; 1 d2d0: 80 93 ab 0d sts 0x0DAB, r24 ; 0x800dab } d2d4: 28 96 adiw r28, 0x08 ; 8 d2d6: 0f b6 in r0, 0x3f ; 63 d2d8: f8 94 cli d2da: de bf out 0x3e, r29 ; 62 d2dc: 0f be out 0x3f, r0 ; 63 d2de: cd bf out 0x3d, r28 ; 61 d2e0: df 91 pop r29 d2e2: cf 91 pop r28 d2e4: 1f 91 pop r17 d2e6: 0f 91 pop r16 d2e8: ff 90 pop r15 d2ea: ef 90 pop r14 d2ec: df 90 pop r13 d2ee: cf 90 pop r12 d2f0: bf 90 pop r11 d2f2: af 90 pop r10 d2f4: 9f 90 pop r9 d2f6: 8f 90 pop r8 d2f8: 7f 90 pop r7 d2fa: 6f 90 pop r6 d2fc: 5f 90 pop r5 d2fe: 4f 90 pop r4 d300: 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 d302: 81 30 cpi r24, 0x01 ; 1 d304: 89 f6 brne .-94 ; 0xd2a8 gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing d306: 80 91 5f 05 lds r24, 0x055F ; 0x80055f d30a: 90 91 60 05 lds r25, 0x0560 ; 0x800560 d30e: a0 91 61 05 lds r26, 0x0561 ; 0x800561 d312: b0 91 62 05 lds r27, 0x0562 ; 0x800562 d316: 80 93 78 03 sts 0x0378, r24 ; 0x800378 d31a: 90 93 79 03 sts 0x0379, r25 ; 0x800379 d31e: a0 93 7a 03 sts 0x037A, r26 ; 0x80037a d322: b0 93 7b 03 sts 0x037B, r27 ; 0x80037b serial_count = 0; d326: 10 92 9e 10 sts 0x109E, r1 ; 0x80109e d32a: 10 92 9d 10 sts 0x109D, r1 ; 0x80109d FlushSerialRequestResend(); d32e: 0e 94 25 5b call 0xb64a ; 0xb64a d332: ba cf rjmp .-140 ; 0xd2a8 0000d334 : 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) { d334: 3f 92 push r3 d336: 4f 92 push r4 d338: 5f 92 push r5 d33a: 6f 92 push r6 d33c: 7f 92 push r7 d33e: 8f 92 push r8 d340: 9f 92 push r9 d342: af 92 push r10 d344: bf 92 push r11 d346: cf 92 push r12 d348: df 92 push r13 d34a: ef 92 push r14 d34c: ff 92 push r15 d34e: 0f 93 push r16 d350: 1f 93 push r17 d352: cf 93 push r28 d354: df 93 push r29 if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { d356: 30 90 0e 18 lds r3, 0x180E ; 0x80180e d35a: 33 20 and r3, r3 d35c: 09 f4 brne .+2 ; 0xd360 d35e: 80 c0 rjmp .+256 ; 0xd460 d360: 8b 01 movw r16, r22 d362: ec 01 movw r28, r24 // No correction. } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { d364: 31 fe sbrs r3, 1 d366: 54 c0 rjmp .+168 ; 0xd410 // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew[0][0] * x + world2machine_rotation_and_skew[0][1] * y; d368: 88 80 ld r8, Y d36a: 99 80 ldd r9, Y+1 ; 0x01 d36c: aa 80 ldd r10, Y+2 ; 0x02 d36e: bb 80 ldd r11, Y+3 ; 0x03 d370: fb 01 movw r30, r22 d372: c0 80 ld r12, Z d374: d1 80 ldd r13, Z+1 ; 0x01 d376: e2 80 ldd r14, Z+2 ; 0x02 d378: f3 80 ldd r15, Z+3 ; 0x03 float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y; d37a: 20 91 e3 17 lds r18, 0x17E3 ; 0x8017e3 d37e: 30 91 e4 17 lds r19, 0x17E4 ; 0x8017e4 d382: 40 91 e5 17 lds r20, 0x17E5 ; 0x8017e5 d386: 50 91 e6 17 lds r21, 0x17E6 ; 0x8017e6 d38a: c5 01 movw r24, r10 d38c: b4 01 movw r22, r8 d38e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d392: 2b 01 movw r4, r22 d394: 3c 01 movw r6, r24 d396: 20 91 e7 17 lds r18, 0x17E7 ; 0x8017e7 d39a: 30 91 e8 17 lds r19, 0x17E8 ; 0x8017e8 d39e: 40 91 e9 17 lds r20, 0x17E9 ; 0x8017e9 d3a2: 50 91 ea 17 lds r21, 0x17EA ; 0x8017ea d3a6: c7 01 movw r24, r14 d3a8: b6 01 movw r22, r12 d3aa: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d3ae: 9b 01 movw r18, r22 d3b0: ac 01 movw r20, r24 d3b2: c3 01 movw r24, r6 d3b4: b2 01 movw r22, r4 d3b6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d3ba: 2b 01 movw r4, r22 d3bc: 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; d3be: 20 91 db 17 lds r18, 0x17DB ; 0x8017db d3c2: 30 91 dc 17 lds r19, 0x17DC ; 0x8017dc d3c6: 40 91 dd 17 lds r20, 0x17DD ; 0x8017dd d3ca: 50 91 de 17 lds r21, 0x17DE ; 0x8017de d3ce: c5 01 movw r24, r10 d3d0: b4 01 movw r22, r8 d3d2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d3d6: 4b 01 movw r8, r22 d3d8: 5c 01 movw r10, r24 d3da: 20 91 df 17 lds r18, 0x17DF ; 0x8017df d3de: 30 91 e0 17 lds r19, 0x17E0 ; 0x8017e0 d3e2: 40 91 e1 17 lds r20, 0x17E1 ; 0x8017e1 d3e6: 50 91 e2 17 lds r21, 0x17E2 ; 0x8017e2 d3ea: c7 01 movw r24, r14 d3ec: b6 01 movw r22, r12 d3ee: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d3f2: 9b 01 movw r18, r22 d3f4: ac 01 movw r20, r24 d3f6: c5 01 movw r24, r10 d3f8: b4 01 movw r22, r8 d3fa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y; x = out_x; d3fe: 68 83 st Y, r22 d400: 79 83 std Y+1, r23 ; 0x01 d402: 8a 83 std Y+2, r24 ; 0x02 d404: 9b 83 std Y+3, r25 ; 0x03 y = out_y; d406: f8 01 movw r30, r16 d408: 40 82 st Z, r4 d40a: 51 82 std Z+1, r5 ; 0x01 d40c: 62 82 std Z+2, r6 ; 0x02 d40e: 73 82 std Z+3, r7 ; 0x03 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { d410: 30 fe sbrs r3, 0 d412: 26 c0 rjmp .+76 ; 0xd460 // Then add the offset. x += world2machine_shift[0]; d414: 20 91 06 18 lds r18, 0x1806 ; 0x801806 d418: 30 91 07 18 lds r19, 0x1807 ; 0x801807 d41c: 40 91 08 18 lds r20, 0x1808 ; 0x801808 d420: 50 91 09 18 lds r21, 0x1809 ; 0x801809 d424: 68 81 ld r22, Y d426: 79 81 ldd r23, Y+1 ; 0x01 d428: 8a 81 ldd r24, Y+2 ; 0x02 d42a: 9b 81 ldd r25, Y+3 ; 0x03 d42c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d430: 68 83 st Y, r22 d432: 79 83 std Y+1, r23 ; 0x01 d434: 8a 83 std Y+2, r24 ; 0x02 d436: 9b 83 std Y+3, r25 ; 0x03 y += world2machine_shift[1]; d438: 20 91 0a 18 lds r18, 0x180A ; 0x80180a d43c: 30 91 0b 18 lds r19, 0x180B ; 0x80180b d440: 40 91 0c 18 lds r20, 0x180C ; 0x80180c d444: 50 91 0d 18 lds r21, 0x180D ; 0x80180d d448: f8 01 movw r30, r16 d44a: 60 81 ld r22, Z d44c: 71 81 ldd r23, Z+1 ; 0x01 d44e: 82 81 ldd r24, Z+2 ; 0x02 d450: 93 81 ldd r25, Z+3 ; 0x03 d452: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d456: f8 01 movw r30, r16 d458: 60 83 st Z, r22 d45a: 71 83 std Z+1, r23 ; 0x01 d45c: 82 83 std Z+2, r24 ; 0x02 d45e: 93 83 std Z+3, r25 ; 0x03 } } } d460: df 91 pop r29 d462: cf 91 pop r28 d464: 1f 91 pop r17 d466: 0f 91 pop r16 d468: ff 90 pop r15 d46a: ef 90 pop r14 d46c: df 90 pop r13 d46e: cf 90 pop r12 d470: bf 90 pop r11 d472: af 90 pop r10 d474: 9f 90 pop r9 d476: 8f 90 pop r8 d478: 7f 90 pop r7 d47a: 6f 90 pop r6 d47c: 5f 90 pop r5 d47e: 4f 90 pop r4 d480: 3f 90 pop r3 d482: 08 95 ret 0000d484 : } } } inline bool world2machine_clamp(float &x, float &y) { d484: 2f 92 push r2 d486: 3f 92 push r3 d488: 4f 92 push r4 d48a: 5f 92 push r5 d48c: 6f 92 push r6 d48e: 7f 92 push r7 d490: 8f 92 push r8 d492: 9f 92 push r9 d494: af 92 push r10 d496: bf 92 push r11 d498: cf 92 push r12 d49a: df 92 push r13 d49c: ef 92 push r14 d49e: ff 92 push r15 d4a0: 0f 93 push r16 d4a2: 1f 93 push r17 d4a4: cf 93 push r28 d4a6: df 93 push r29 d4a8: 00 d0 rcall .+0 ; 0xd4aa d4aa: 00 d0 rcall .+0 ; 0xd4ac d4ac: 1f 92 push r1 d4ae: 1f 92 push r1 d4b0: cd b7 in r28, 0x3d ; 61 d4b2: de b7 in r29, 0x3e ; 62 d4b4: 8c 01 movw r16, r24 d4b6: 1b 01 movw r2, r22 } } inline void world2machine(const float &x, const float &y, float &out_x, float &out_y) { out_x = x; d4b8: fc 01 movw r30, r24 d4ba: 80 81 ld r24, Z d4bc: 91 81 ldd r25, Z+1 ; 0x01 d4be: a2 81 ldd r26, Z+2 ; 0x02 d4c0: b3 81 ldd r27, Z+3 ; 0x03 d4c2: 89 83 std Y+1, r24 ; 0x01 d4c4: 9a 83 std Y+2, r25 ; 0x02 d4c6: ab 83 std Y+3, r26 ; 0x03 d4c8: bc 83 std Y+4, r27 ; 0x04 out_y = y; d4ca: fb 01 movw r30, r22 d4cc: 80 81 ld r24, Z d4ce: 91 81 ldd r25, Z+1 ; 0x01 d4d0: a2 81 ldd r26, Z+2 ; 0x02 d4d2: b3 81 ldd r27, Z+3 ; 0x03 d4d4: 8d 83 std Y+5, r24 ; 0x05 d4d6: 9e 83 std Y+6, r25 ; 0x06 d4d8: af 83 std Y+7, r26 ; 0x07 d4da: b8 87 std Y+8, r27 ; 0x08 world2machine(out_x, out_y); d4dc: be 01 movw r22, r28 d4de: 6b 5f subi r22, 0xFB ; 251 d4e0: 7f 4f sbci r23, 0xFF ; 255 d4e2: ce 01 movw r24, r28 d4e4: 01 96 adiw r24, 0x01 ; 1 d4e6: 0e 94 9a 69 call 0xd334 ; 0xd334 inline bool world2machine_clamp(float &x, float &y) { bool clamped = false; float tmpx, tmpy; world2machine(x, y, tmpx, tmpy); if (tmpx < X_MIN_POS) { d4ea: c9 80 ldd r12, Y+1 ; 0x01 d4ec: da 80 ldd r13, Y+2 ; 0x02 d4ee: eb 80 ldd r14, Y+3 ; 0x03 d4f0: fc 80 ldd r15, Y+4 ; 0x04 d4f2: 20 e0 ldi r18, 0x00 ; 0 d4f4: 30 e0 ldi r19, 0x00 ; 0 d4f6: a9 01 movw r20, r18 d4f8: c7 01 movw r24, r14 d4fa: b6 01 movw r22, r12 d4fc: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d500: 87 ff sbrs r24, 7 d502: 35 c0 rjmp .+106 ; 0xd56e tmpx = X_MIN_POS; d504: 19 82 std Y+1, r1 ; 0x01 d506: 1a 82 std Y+2, r1 ; 0x02 d508: 1b 82 std Y+3, r1 ; 0x03 d50a: 1c 82 std Y+4, r1 ; 0x04 clamped = true; } else if (tmpx > X_MAX_POS) { tmpx = X_MAX_POS; clamped = true; d50c: ff 24 eor r15, r15 d50e: f3 94 inc r15 } if (tmpy < Y_MIN_POS) { d510: 8d 80 ldd r8, Y+5 ; 0x05 d512: 9e 80 ldd r9, Y+6 ; 0x06 d514: af 80 ldd r10, Y+7 ; 0x07 d516: b8 84 ldd r11, Y+8 ; 0x08 d518: 20 e0 ldi r18, 0x00 ; 0 d51a: 30 e0 ldi r19, 0x00 ; 0 d51c: 40 e8 ldi r20, 0x80 ; 128 d51e: 50 ec ldi r21, 0xC0 ; 192 d520: c5 01 movw r24, r10 d522: b4 01 movw r22, r8 d524: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d528: 87 ff sbrs r24, 7 d52a: 35 c0 rjmp .+106 ; 0xd596 tmpy = Y_MIN_POS; d52c: 80 e0 ldi r24, 0x00 ; 0 d52e: 90 e0 ldi r25, 0x00 ; 0 d530: a0 e8 ldi r26, 0x80 ; 128 d532: b0 ec ldi r27, 0xC0 ; 192 clamped = true; } else if (tmpy > Y_MAX_POS) { tmpy = Y_MAX_POS; d534: 8d 83 std Y+5, r24 ; 0x05 d536: 9e 83 std Y+6, r25 ; 0x06 d538: af 83 std Y+7, r26 ; 0x07 d53a: b8 87 std Y+8, r27 ; 0x08 clamped = true; } if (clamped) machine2world(tmpx, tmpy, x, y); d53c: cd 80 ldd r12, Y+5 ; 0x05 d53e: de 80 ldd r13, Y+6 ; 0x06 d540: ef 80 ldd r14, Y+7 ; 0x07 d542: f8 84 ldd r15, Y+8 ; 0x08 d544: 89 80 ldd r8, Y+1 ; 0x01 d546: 9a 80 ldd r9, Y+2 ; 0x02 d548: ab 80 ldd r10, Y+3 ; 0x03 d54a: 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) { d54c: 70 90 0e 18 lds r7, 0x180E ; 0x80180e d550: 71 10 cpse r7, r1 d552: 4c c0 rjmp .+152 ; 0xd5ec // No correction. out_x = x; d554: f8 01 movw r30, r16 d556: 80 82 st Z, r8 d558: 91 82 std Z+1, r9 ; 0x01 d55a: a2 82 std Z+2, r10 ; 0x02 d55c: b3 82 std Z+3, r11 ; 0x03 out_y = y; d55e: f1 01 movw r30, r2 d560: c0 82 st Z, r12 d562: d1 82 std Z+1, r13 ; 0x01 d564: e2 82 std Z+2, r14 ; 0x02 d566: 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) { d568: ff 24 eor r15, r15 d56a: f3 94 inc r15 d56c: 25 c0 rjmp .+74 ; 0xd5b8 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) { d56e: 20 e0 ldi r18, 0x00 ; 0 d570: 30 e0 ldi r19, 0x00 ; 0 d572: 4f e7 ldi r20, 0x7F ; 127 d574: 53 e4 ldi r21, 0x43 ; 67 d576: c7 01 movw r24, r14 d578: b6 01 movw r22, r12 d57a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> } } inline bool world2machine_clamp(float &x, float &y) { bool clamped = false; d57e: 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) { d580: 18 16 cp r1, r24 d582: 34 f6 brge .-116 ; 0xd510 tmpx = X_MAX_POS; d584: 80 e0 ldi r24, 0x00 ; 0 d586: 90 e0 ldi r25, 0x00 ; 0 d588: af e7 ldi r26, 0x7F ; 127 d58a: b3 e4 ldi r27, 0x43 ; 67 d58c: 89 83 std Y+1, r24 ; 0x01 d58e: 9a 83 std Y+2, r25 ; 0x02 d590: ab 83 std Y+3, r26 ; 0x03 d592: bc 83 std Y+4, r27 ; 0x04 d594: bb cf rjmp .-138 ; 0xd50c } if (tmpy < Y_MIN_POS) { tmpy = Y_MIN_POS; clamped = true; } else if (tmpy > Y_MAX_POS) { d596: 20 e0 ldi r18, 0x00 ; 0 d598: 30 e8 ldi r19, 0x80 ; 128 d59a: 44 e5 ldi r20, 0x54 ; 84 d59c: 53 e4 ldi r21, 0x43 ; 67 d59e: c5 01 movw r24, r10 d5a0: b4 01 movw r22, r8 d5a2: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> d5a6: 18 16 cp r1, r24 d5a8: 2c f4 brge .+10 ; 0xd5b4 tmpy = Y_MAX_POS; d5aa: 80 e0 ldi r24, 0x00 ; 0 d5ac: 90 e8 ldi r25, 0x80 ; 128 d5ae: a4 e5 ldi r26, 0x54 ; 84 d5b0: b3 e4 ldi r27, 0x43 ; 67 d5b2: c0 cf rjmp .-128 ; 0xd534 clamped = true; } if (clamped) d5b4: f1 10 cpse r15, r1 d5b6: c2 cf rjmp .-124 ; 0xd53c machine2world(tmpx, tmpy, x, y); return clamped; } d5b8: 8f 2d mov r24, r15 d5ba: 28 96 adiw r28, 0x08 ; 8 d5bc: 0f b6 in r0, 0x3f ; 63 d5be: f8 94 cli d5c0: de bf out 0x3e, r29 ; 62 d5c2: 0f be out 0x3f, r0 ; 63 d5c4: cd bf out 0x3d, r28 ; 61 d5c6: df 91 pop r29 d5c8: cf 91 pop r28 d5ca: 1f 91 pop r17 d5cc: 0f 91 pop r16 d5ce: ff 90 pop r15 d5d0: ef 90 pop r14 d5d2: df 90 pop r13 d5d4: cf 90 pop r12 d5d6: bf 90 pop r11 d5d8: af 90 pop r10 d5da: 9f 90 pop r9 d5dc: 8f 90 pop r8 d5de: 7f 90 pop r7 d5e0: 6f 90 pop r6 d5e2: 5f 90 pop r5 d5e4: 4f 90 pop r4 d5e6: 3f 90 pop r3 d5e8: 2f 90 pop r2 d5ea: 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) { d5ec: 70 fe sbrs r7, 0 d5ee: 1c c0 rjmp .+56 ; 0xd628 // Then add the offset. x -= world2machine_shift[0]; d5f0: 20 91 06 18 lds r18, 0x1806 ; 0x801806 d5f4: 30 91 07 18 lds r19, 0x1807 ; 0x801807 d5f8: 40 91 08 18 lds r20, 0x1808 ; 0x801808 d5fc: 50 91 09 18 lds r21, 0x1809 ; 0x801809 d600: c5 01 movw r24, r10 d602: b4 01 movw r22, r8 d604: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d608: 4b 01 movw r8, r22 d60a: 5c 01 movw r10, r24 y -= world2machine_shift[1]; d60c: 20 91 0a 18 lds r18, 0x180A ; 0x80180a d610: 30 91 0b 18 lds r19, 0x180B ; 0x80180b d614: 40 91 0c 18 lds r20, 0x180C ; 0x80180c d618: 50 91 0d 18 lds r21, 0x180D ; 0x80180d d61c: c7 01 movw r24, r14 d61e: b6 01 movw r22, r12 d620: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d624: 6b 01 movw r12, r22 d626: 7c 01 movw r14, r24 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { d628: 71 fe sbrs r7, 1 d62a: 9e cf rjmp .-196 ; 0xd568 // Firs the skew & rotation correction. out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; d62c: 20 91 f6 17 lds r18, 0x17F6 ; 0x8017f6 d630: 30 91 f7 17 lds r19, 0x17F7 ; 0x8017f7 d634: 40 91 f8 17 lds r20, 0x17F8 ; 0x8017f8 d638: 50 91 f9 17 lds r21, 0x17F9 ; 0x8017f9 d63c: c5 01 movw r24, r10 d63e: b4 01 movw r22, r8 d640: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d644: 2b 01 movw r4, r22 d646: 3c 01 movw r6, r24 d648: 20 91 fa 17 lds r18, 0x17FA ; 0x8017fa d64c: 30 91 fb 17 lds r19, 0x17FB ; 0x8017fb d650: 40 91 fc 17 lds r20, 0x17FC ; 0x8017fc d654: 50 91 fd 17 lds r21, 0x17FD ; 0x8017fd d658: c7 01 movw r24, r14 d65a: b6 01 movw r22, r12 d65c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d660: 9b 01 movw r18, r22 d662: ac 01 movw r20, r24 d664: c3 01 movw r24, r6 d666: b2 01 movw r22, r4 d668: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d66c: f8 01 movw r30, r16 d66e: 60 83 st Z, r22 d670: 71 83 std Z+1, r23 ; 0x01 d672: 82 83 std Z+2, r24 ; 0x02 d674: 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; d676: 20 91 fe 17 lds r18, 0x17FE ; 0x8017fe d67a: 30 91 ff 17 lds r19, 0x17FF ; 0x8017ff d67e: 40 91 00 18 lds r20, 0x1800 ; 0x801800 d682: 50 91 01 18 lds r21, 0x1801 ; 0x801801 d686: c5 01 movw r24, r10 d688: b4 01 movw r22, r8 d68a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d68e: 4b 01 movw r8, r22 d690: 5c 01 movw r10, r24 d692: 20 91 02 18 lds r18, 0x1802 ; 0x801802 d696: 30 91 03 18 lds r19, 0x1803 ; 0x801803 d69a: 40 91 04 18 lds r20, 0x1804 ; 0x801804 d69e: 50 91 05 18 lds r21, 0x1805 ; 0x801805 d6a2: c7 01 movw r24, r14 d6a4: b6 01 movw r22, r12 d6a6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d6aa: 9b 01 movw r18, r22 d6ac: ac 01 movw r20, r24 d6ae: c5 01 movw r24, r10 d6b0: b4 01 movw r22, r8 d6b2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d6b6: f1 01 movw r30, r2 d6b8: 60 83 st Z, r22 d6ba: 71 83 std Z+1, r23 ; 0x01 d6bc: 82 83 std Z+2, r24 ; 0x02 d6be: 93 83 std Z+3, r25 ; 0x03 d6c0: 53 cf rjmp .-346 ; 0xd568 0000d6c2 : if(next_feedrate > 0.f) feedrate = next_feedrate; } } void clamp_to_software_endstops(float target[3]) { d6c2: cf 92 push r12 d6c4: df 92 push r13 d6c6: ef 92 push r14 d6c8: ff 92 push r15 d6ca: cf 93 push r28 d6cc: df 93 push r29 d6ce: ec 01 movw r28, r24 #ifdef DEBUG_DISABLE_SWLIMITS return; #endif //DEBUG_DISABLE_SWLIMITS world2machine_clamp(target[0], target[1]); d6d0: bc 01 movw r22, r24 d6d2: 6c 5f subi r22, 0xFC ; 252 d6d4: 7f 4f sbci r23, 0xFF ; 255 d6d6: 0e 94 42 6a call 0xd484 ; 0xd484 // Clamp the Z coordinate. if (min_software_endstops) { if (target[Z_AXIS] < min_pos[Z_AXIS]) target[Z_AXIS] = min_pos[Z_AXIS]; d6da: c0 90 29 02 lds r12, 0x0229 ; 0x800229 d6de: d0 90 2a 02 lds r13, 0x022A ; 0x80022a d6e2: e0 90 2b 02 lds r14, 0x022B ; 0x80022b d6e6: f0 90 2c 02 lds r15, 0x022C ; 0x80022c d6ea: a7 01 movw r20, r14 d6ec: 96 01 movw r18, r12 d6ee: 68 85 ldd r22, Y+8 ; 0x08 d6f0: 79 85 ldd r23, Y+9 ; 0x09 d6f2: 8a 85 ldd r24, Y+10 ; 0x0a d6f4: 9b 85 ldd r25, Y+11 ; 0x0b d6f6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d6fa: 87 ff sbrs r24, 7 d6fc: 04 c0 rjmp .+8 ; 0xd706 d6fe: c8 86 std Y+8, r12 ; 0x08 d700: d9 86 std Y+9, r13 ; 0x09 d702: ea 86 std Y+10, r14 ; 0x0a d704: 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]; d706: c0 90 1d 02 lds r12, 0x021D ; 0x80021d d70a: d0 90 1e 02 lds r13, 0x021E ; 0x80021e d70e: e0 90 1f 02 lds r14, 0x021F ; 0x80021f d712: f0 90 20 02 lds r15, 0x0220 ; 0x800220 d716: a7 01 movw r20, r14 d718: 96 01 movw r18, r12 d71a: 68 85 ldd r22, Y+8 ; 0x08 d71c: 79 85 ldd r23, Y+9 ; 0x09 d71e: 8a 85 ldd r24, Y+10 ; 0x0a d720: 9b 85 ldd r25, Y+11 ; 0x0b d722: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> d726: 18 16 cp r1, r24 d728: 24 f4 brge .+8 ; 0xd732 d72a: c8 86 std Y+8, r12 ; 0x08 d72c: d9 86 std Y+9, r13 ; 0x09 d72e: ea 86 std Y+10, r14 ; 0x0a d730: fb 86 std Y+11, r15 ; 0x0b } } d732: df 91 pop r29 d734: cf 91 pop r28 d736: ff 90 pop r15 d738: ef 90 pop r14 d73a: df 90 pop r13 d73c: cf 90 pop r12 d73e: 08 95 ret 0000d740 : plan_buffer_line(x, y, z, e, feed_rate, current_position); } #endif // MESH_BED_LEVELING void prepare_move(uint16_t start_segment_idx) { d740: 2f 92 push r2 d742: 3f 92 push r3 d744: 4f 92 push r4 d746: 5f 92 push r5 d748: 6f 92 push r6 d74a: 7f 92 push r7 d74c: 8f 92 push r8 d74e: 9f 92 push r9 d750: af 92 push r10 d752: bf 92 push r11 d754: cf 92 push r12 d756: df 92 push r13 d758: ef 92 push r14 d75a: ff 92 push r15 d75c: 0f 93 push r16 d75e: 1f 93 push r17 d760: cf 93 push r28 d762: df 93 push r29 d764: cd b7 in r28, 0x3d ; 61 d766: de b7 in r29, 0x3e ; 62 d768: a2 97 sbiw r28, 0x22 ; 34 d76a: 0f b6 in r0, 0x3f ; 63 d76c: f8 94 cli d76e: de bf out 0x3e, r29 ; 62 d770: 0f be out 0x3f, r0 ; 63 d772: cd bf out 0x3d, r28 ; 61 d774: 1c 01 movw r2, r24 clamp_to_software_endstops(destination); d776: 83 e7 ldi r24, 0x73 ; 115 d778: 96 e0 ldi r25, 0x06 ; 6 d77a: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 previous_millis_cmd.start(); d77e: 84 e8 ldi r24, 0x84 ; 132 d780: 93 e0 ldi r25, 0x03 ; 3 d782: 0f 94 cb 2c call 0x25996 ; 0x25996 ::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])) { d786: 40 90 91 06 lds r4, 0x0691 ; 0x800691 d78a: 50 90 92 06 lds r5, 0x0692 ; 0x800692 d78e: 60 90 93 06 lds r6, 0x0693 ; 0x800693 d792: 70 90 94 06 lds r7, 0x0694 ; 0x800694 d796: c0 90 73 06 lds r12, 0x0673 ; 0x800673 d79a: d0 90 74 06 lds r13, 0x0674 ; 0x800674 d79e: e0 90 75 06 lds r14, 0x0675 ; 0x800675 d7a2: f0 90 76 06 lds r15, 0x0676 ; 0x800676 d7a6: a7 01 movw r20, r14 d7a8: 96 01 movw r18, r12 d7aa: c3 01 movw r24, r6 d7ac: b2 01 movw r22, r4 d7ae: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d7b2: 81 11 cpse r24, r1 d7b4: 3f c0 rjmp .+126 ; 0xd834 d7b6: 20 91 77 06 lds r18, 0x0677 ; 0x800677 d7ba: 30 91 78 06 lds r19, 0x0678 ; 0x800678 d7be: 40 91 79 06 lds r20, 0x0679 ; 0x800679 d7c2: 50 91 7a 06 lds r21, 0x067A ; 0x80067a d7c6: 60 91 95 06 lds r22, 0x0695 ; 0x800695 d7ca: 70 91 96 06 lds r23, 0x0696 ; 0x800696 d7ce: 80 91 97 06 lds r24, 0x0697 ; 0x800697 d7d2: 90 91 98 06 lds r25, 0x0698 ; 0x800698 d7d6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> d7da: 81 11 cpse r24, r1 d7dc: 2b c0 rjmp .+86 ; 0xd834 plan_buffer_line_destinationXYZE(feedrate/60); d7de: 20 e0 ldi r18, 0x00 ; 0 d7e0: 30 e0 ldi r19, 0x00 ; 0 d7e2: 40 e7 ldi r20, 0x70 ; 112 d7e4: 52 e4 ldi r21, 0x42 ; 66 d7e6: 60 91 b8 02 lds r22, 0x02B8 ; 0x8002b8 d7ea: 70 91 b9 02 lds r23, 0x02B9 ; 0x8002b9 d7ee: 80 91 ba 02 lds r24, 0x02BA ; 0x8002ba d7f2: 90 91 bb 02 lds r25, 0x02BB ; 0x8002bb d7f6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> d7fa: 0f 94 0a c0 call 0x38014 ; 0x38014 #else plan_buffer_line_destinationXYZE(feedrate*feedmultiply*(1./(60.f*100.f))); #endif } set_current_to_destination(); d7fe: 0e 94 97 5a call 0xb52e ; 0xb52e } d802: a2 96 adiw r28, 0x22 ; 34 d804: 0f b6 in r0, 0x3f ; 63 d806: f8 94 cli d808: de bf out 0x3e, r29 ; 62 d80a: 0f be out 0x3f, r0 ; 63 d80c: cd bf out 0x3d, r28 ; 61 d80e: df 91 pop r29 d810: cf 91 pop r28 d812: 1f 91 pop r17 d814: 0f 91 pop r16 d816: ff 90 pop r15 d818: ef 90 pop r14 d81a: df 90 pop r13 d81c: cf 90 pop r12 d81e: bf 90 pop r11 d820: af 90 pop r10 d822: 9f 90 pop r9 d824: 8f 90 pop r8 d826: 7f 90 pop r7 d828: 6f 90 pop r6 d82a: 5f 90 pop r5 d82c: 4f 90 pop r4 d82e: 3f 90 pop r3 d830: 2f 90 pop r2 d832: 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); d834: 60 91 39 02 lds r22, 0x0239 ; 0x800239 d838: 70 91 3a 02 lds r23, 0x023A ; 0x80023a d83c: 07 2e mov r0, r23 d83e: 00 0c add r0, r0 d840: 88 0b sbc r24, r24 d842: 99 0b sbc r25, r25 d844: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> d848: 20 91 b8 02 lds r18, 0x02B8 ; 0x8002b8 d84c: 30 91 b9 02 lds r19, 0x02B9 ; 0x8002b9 d850: 40 91 ba 02 lds r20, 0x02BA ; 0x8002ba d854: 50 91 bb 02 lds r21, 0x02BB ; 0x8002bb d858: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d85c: 2e e3 ldi r18, 0x3E ; 62 d85e: 33 ec ldi r19, 0xC3 ; 195 d860: 4e e2 ldi r20, 0x2E ; 46 d862: 59 e3 ldi r21, 0x39 ; 57 d864: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d868: 6f 83 std Y+7, r22 ; 0x07 d86a: 78 87 std Y+8, r23 ; 0x08 d86c: 89 87 std Y+9, r24 ; 0x09 d86e: 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) { d870: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 d874: 88 23 and r24, r24 d876: 09 f4 brne .+2 ; 0xd87a d878: 0f c1 rjmp .+542 ; 0xda98 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]; d87a: a3 01 movw r20, r6 d87c: 92 01 movw r18, r4 d87e: c7 01 movw r24, r14 d880: b6 01 movw r22, r12 d882: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d886: 2b 01 movw r4, r22 d888: 3c 01 movw r6, r24 float dy = y - current_position[Y_AXIS]; d88a: 20 91 95 06 lds r18, 0x0695 ; 0x800695 d88e: 30 91 96 06 lds r19, 0x0696 ; 0x800696 d892: 40 91 97 06 lds r20, 0x0697 ; 0x800697 d896: 50 91 98 06 lds r21, 0x0698 ; 0x800698 d89a: 60 91 77 06 lds r22, 0x0677 ; 0x800677 d89e: 70 91 78 06 lds r23, 0x0678 ; 0x800678 d8a2: 80 91 79 06 lds r24, 0x0679 ; 0x800679 d8a6: 90 91 7a 06 lds r25, 0x067A ; 0x80067a d8aa: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d8ae: 6b 87 std Y+11, r22 ; 0x0b d8b0: 7c 87 std Y+12, r23 ; 0x0c d8b2: 8d 87 std Y+13, r24 ; 0x0d d8b4: 9e 87 std Y+14, r25 ; 0x0e uint16_t n_segments = 0; if (mbl.active) { float len = fabs(dx) + fabs(dy); d8b6: c3 01 movw r24, r6 d8b8: b2 01 movw r22, r4 d8ba: 9f 77 andi r25, 0x7F ; 127 d8bc: 2b 85 ldd r18, Y+11 ; 0x0b d8be: 3c 85 ldd r19, Y+12 ; 0x0c d8c0: 4d 85 ldd r20, Y+13 ; 0x0d d8c2: 5e 85 ldd r21, Y+14 ; 0x0e d8c4: 5f 77 andi r21, 0x7F ; 127 d8c6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d8ca: 6b 01 movw r12, r22 d8cc: 7c 01 movw r14, r24 if (len > 0) d8ce: 20 e0 ldi r18, 0x00 ; 0 d8d0: 30 e0 ldi r19, 0x00 ; 0 d8d2: a9 01 movw r20, r18 d8d4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> d8d8: 18 16 cp r1, r24 d8da: 0c f0 brlt .+2 ; 0xd8de d8dc: dd c0 rjmp .+442 ; 0xda98 // Split to 3cm segments or shorter. n_segments = uint16_t(ceil(len / 30.f)); d8de: 20 e0 ldi r18, 0x00 ; 0 d8e0: 30 e0 ldi r19, 0x00 ; 0 d8e2: 40 ef ldi r20, 0xF0 ; 240 d8e4: 51 e4 ldi r21, 0x41 ; 65 d8e6: c7 01 movw r24, r14 d8e8: b6 01 movw r22, r12 d8ea: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> d8ee: 0f 94 16 de call 0x3bc2c ; 0x3bc2c d8f2: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> d8f6: 7e 83 std Y+6, r23 ; 0x06 d8f8: 6d 83 std Y+5, r22 ; 0x05 } if (n_segments > 1 && start_segment_idx) { d8fa: 62 30 cpi r22, 0x02 ; 2 d8fc: 71 05 cpc r23, r1 d8fe: 08 f4 brcc .+2 ; 0xd902 d900: cb c0 rjmp .+406 ; 0xda98 d902: 21 14 cp r2, r1 d904: 31 04 cpc r3, r1 d906: 09 f4 brne .+2 ; 0xd90a d908: c7 c0 rjmp .+398 ; 0xda98 float dz = z - current_position[Z_AXIS]; d90a: 20 91 99 06 lds r18, 0x0699 ; 0x800699 d90e: 30 91 9a 06 lds r19, 0x069A ; 0x80069a d912: 40 91 9b 06 lds r20, 0x069B ; 0x80069b d916: 50 91 9c 06 lds r21, 0x069C ; 0x80069c d91a: 60 91 7b 06 lds r22, 0x067B ; 0x80067b d91e: 70 91 7c 06 lds r23, 0x067C ; 0x80067c d922: 80 91 7d 06 lds r24, 0x067D ; 0x80067d d926: 90 91 7e 06 lds r25, 0x067E ; 0x80067e d92a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d92e: 6f 87 std Y+15, r22 ; 0x0f d930: 78 8b std Y+16, r23 ; 0x10 d932: 89 8b std Y+17, r24 ; 0x11 d934: 9a 8b std Y+18, r25 ; 0x12 float de = e - current_position[E_AXIS]; d936: 20 91 9d 06 lds r18, 0x069D ; 0x80069d d93a: 30 91 9e 06 lds r19, 0x069E ; 0x80069e d93e: 40 91 9f 06 lds r20, 0x069F ; 0x80069f d942: 50 91 a0 06 lds r21, 0x06A0 ; 0x8006a0 d946: 60 91 7f 06 lds r22, 0x067F ; 0x80067f d94a: 70 91 80 06 lds r23, 0x0680 ; 0x800680 d94e: 80 91 81 06 lds r24, 0x0681 ; 0x800681 d952: 90 91 82 06 lds r25, 0x0682 ; 0x800682 d956: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> d95a: 6b 8b std Y+19, r22 ; 0x13 d95c: 7c 8b std Y+20, r23 ; 0x14 d95e: 8d 8b std Y+21, r24 ; 0x15 d960: 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); d962: ad 81 ldd r26, Y+5 ; 0x05 d964: be 81 ldd r27, Y+6 ; 0x06 d966: cd 01 movw r24, r26 d968: b0 e0 ldi r27, 0x00 ; 0 d96a: a0 e0 ldi r26, 0x00 ; 0 d96c: 8f 8f std Y+31, r24 ; 0x1f d96e: 98 a3 std Y+32, r25 ; 0x20 d970: a9 a3 std Y+33, r26 ; 0x21 d972: 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) { d974: 2d 81 ldd r18, Y+5 ; 0x05 d976: 3e 81 ldd r19, Y+6 ; 0x06 d978: 22 16 cp r2, r18 d97a: 33 06 cpc r3, r19 d97c: 08 f0 brcs .+2 ; 0xd980 d97e: 8c c0 rjmp .+280 ; 0xda98 float t = float(i) / float(n_segments); d980: b1 01 movw r22, r2 d982: 90 e0 ldi r25, 0x00 ; 0 d984: 80 e0 ldi r24, 0x00 ; 0 d986: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> d98a: 6b 01 movw r12, r22 d98c: 7c 01 movw r14, r24 d98e: 6f 8d ldd r22, Y+31 ; 0x1f d990: 78 a1 ldd r23, Y+32 ; 0x20 d992: 89 a1 ldd r24, Y+33 ; 0x21 d994: 9a a1 ldd r25, Y+34 ; 0x22 d996: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> d99a: 9b 01 movw r18, r22 d99c: ac 01 movw r20, r24 d99e: c7 01 movw r24, r14 d9a0: b6 01 movw r22, r12 d9a2: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> d9a6: 6b 01 movw r12, r22 d9a8: 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, d9aa: ac 01 movw r20, r24 d9ac: 9b 01 movw r18, r22 d9ae: 6b 89 ldd r22, Y+19 ; 0x13 d9b0: 7c 89 ldd r23, Y+20 ; 0x14 d9b2: 8d 89 ldd r24, Y+21 ; 0x15 d9b4: 9e 89 ldd r25, Y+22 ; 0x16 d9b6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> d9ba: 9b 01 movw r18, r22 d9bc: ac 01 movw r20, r24 d9be: 60 91 9d 06 lds r22, 0x069D ; 0x80069d d9c2: 70 91 9e 06 lds r23, 0x069E ; 0x80069e d9c6: 80 91 9f 06 lds r24, 0x069F ; 0x80069f d9ca: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 d9ce: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d9d2: 69 83 std Y+1, r22 ; 0x01 d9d4: 7a 83 std Y+2, r23 ; 0x02 d9d6: 8b 83 std Y+3, r24 ; 0x03 d9d8: 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, d9da: a7 01 movw r20, r14 d9dc: 96 01 movw r18, r12 d9de: 6f 85 ldd r22, Y+15 ; 0x0f d9e0: 78 89 ldd r23, Y+16 ; 0x10 d9e2: 89 89 ldd r24, Y+17 ; 0x11 d9e4: 9a 89 ldd r25, Y+18 ; 0x12 d9e6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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, d9ea: 20 91 99 06 lds r18, 0x0699 ; 0x800699 d9ee: 30 91 9a 06 lds r19, 0x069A ; 0x80069a d9f2: 40 91 9b 06 lds r20, 0x069B ; 0x80069b d9f6: 50 91 9c 06 lds r21, 0x069C ; 0x80069c d9fa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> d9fe: 6f 8b std Y+23, r22 ; 0x17 da00: 78 8f std Y+24, r23 ; 0x18 da02: 89 8f std Y+25, r24 ; 0x19 da04: 9a 8f std Y+26, r25 ; 0x1a current_position[Y_AXIS] + t * dy, da06: a7 01 movw r20, r14 da08: 96 01 movw r18, r12 da0a: 6b 85 ldd r22, Y+11 ; 0x0b da0c: 7c 85 ldd r23, Y+12 ; 0x0c da0e: 8d 85 ldd r24, Y+13 ; 0x0d da10: 9e 85 ldd r25, Y+14 ; 0x0e da12: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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, da16: 20 91 95 06 lds r18, 0x0695 ; 0x800695 da1a: 30 91 96 06 lds r19, 0x0696 ; 0x800696 da1e: 40 91 97 06 lds r20, 0x0697 ; 0x800697 da22: 50 91 98 06 lds r21, 0x0698 ; 0x800698 da26: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> da2a: 6b 8f std Y+27, r22 ; 0x1b da2c: 7c 8f std Y+28, r23 ; 0x1c da2e: 8d 8f std Y+29, r24 ; 0x1d da30: 9e 8f std Y+30, r25 ; 0x1e da32: a7 01 movw r20, r14 da34: 96 01 movw r18, r12 da36: c3 01 movw r24, r6 da38: b2 01 movw r22, r4 da3a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> da3e: 20 91 91 06 lds r18, 0x0691 ; 0x800691 da42: 30 91 92 06 lds r19, 0x0692 ; 0x800692 da46: 40 91 93 06 lds r20, 0x0693 ; 0x800693 da4a: 50 91 94 06 lds r21, 0x0694 ; 0x800694 da4e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> da52: 3f 92 push r3 da54: 2f 92 push r2 da56: a1 e9 ldi r26, 0x91 ; 145 da58: b6 e0 ldi r27, 0x06 ; 6 da5a: bf 93 push r27 da5c: af 93 push r26 da5e: 8f 80 ldd r8, Y+7 ; 0x07 da60: 98 84 ldd r9, Y+8 ; 0x08 da62: a9 84 ldd r10, Y+9 ; 0x09 da64: ba 84 ldd r11, Y+10 ; 0x0a da66: de 01 movw r26, r28 da68: 11 96 adiw r26, 0x01 ; 1 da6a: 6d 01 movw r12, r26 da6c: ef 88 ldd r14, Y+23 ; 0x17 da6e: f8 8c ldd r15, Y+24 ; 0x18 da70: 09 8d ldd r16, Y+25 ; 0x19 da72: 1a 8d ldd r17, Y+26 ; 0x1a da74: 2b 8d ldd r18, Y+27 ; 0x1b da76: 3c 8d ldd r19, Y+28 ; 0x1c da78: 4d 8d ldd r20, Y+29 ; 0x1d da7a: 5e 8d ldd r21, Y+30 ; 0x1e da7c: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 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) da80: 0f 90 pop r0 da82: 0f 90 pop r0 da84: 0f 90 pop r0 da86: 0f 90 pop r0 da88: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab da8c: 81 11 cpse r24, r1 da8e: b7 ce rjmp .-658 ; 0xd7fe 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) { da90: bf ef ldi r27, 0xFF ; 255 da92: 2b 1a sub r2, r27 da94: 3b 0a sbc r3, r27 da96: 6e cf rjmp .-292 ; 0xd974 if (planner_aborted) return; } } // The rest of the path. plan_buffer_line(x, y, z, e, feed_rate, current_position); da98: e0 90 7b 06 lds r14, 0x067B ; 0x80067b da9c: f0 90 7c 06 lds r15, 0x067C ; 0x80067c daa0: 00 91 7d 06 lds r16, 0x067D ; 0x80067d daa4: 10 91 7e 06 lds r17, 0x067E ; 0x80067e daa8: 20 91 77 06 lds r18, 0x0677 ; 0x800677 daac: 30 91 78 06 lds r19, 0x0678 ; 0x800678 dab0: 40 91 79 06 lds r20, 0x0679 ; 0x800679 dab4: 50 91 7a 06 lds r21, 0x067A ; 0x80067a dab8: 60 91 73 06 lds r22, 0x0673 ; 0x800673 dabc: 70 91 74 06 lds r23, 0x0674 ; 0x800674 dac0: 80 91 75 06 lds r24, 0x0675 ; 0x800675 dac4: 90 91 76 06 lds r25, 0x0676 ; 0x800676 dac8: 1f 92 push r1 daca: 1f 92 push r1 dacc: e1 e9 ldi r30, 0x91 ; 145 dace: f6 e0 ldi r31, 0x06 ; 6 dad0: ff 93 push r31 dad2: ef 93 push r30 dad4: 8f 80 ldd r8, Y+7 ; 0x07 dad6: 98 84 ldd r9, Y+8 ; 0x08 dad8: a9 84 ldd r10, Y+9 ; 0x09 dada: ba 84 ldd r11, Y+10 ; 0x0a dadc: ef e7 ldi r30, 0x7F ; 127 dade: ce 2e mov r12, r30 dae0: e6 e0 ldi r30, 0x06 ; 6 dae2: de 2e mov r13, r30 dae4: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 dae8: 0f 90 pop r0 daea: 0f 90 pop r0 daec: 0f 90 pop r0 daee: 0f 90 pop r0 daf0: 86 ce rjmp .-756 ; 0xd7fe 0000daf2 : /// @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) { daf2: cf 92 push r12 daf4: df 92 push r13 daf6: ef 92 push r14 daf8: ff 92 push r15 dafa: cf 93 push r28 dafc: 9b 01 movw r18, r22 dafe: ac 01 movw r20, r24 float travel_z = current_position[Z_AXIS]; db00: c0 90 99 06 lds r12, 0x0699 ; 0x800699 db04: d0 90 9a 06 lds r13, 0x069A ; 0x80069a db08: e0 90 9b 06 lds r14, 0x069B ; 0x80069b db0c: f0 90 9c 06 lds r15, 0x069C ; 0x80069c // Prepare to move Z axis current_position[Z_AXIS] += delta; db10: c7 01 movw r24, r14 db12: b6 01 movw r22, r12 db14: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> db18: 60 93 99 06 sts 0x0699, r22 ; 0x800699 db1c: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a db20: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b db24: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c #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); db28: 83 b1 in r24, 0x03 ; 3 #else bool z_min_endstop = false; #endif if (axis_known_position[Z_AXIS] || z_min_endstop) db2a: 90 91 90 06 lds r25, 0x0690 ; 0x800690 db2e: 91 11 cpse r25, r1 db30: 02 c0 rjmp .+4 ; 0xdb36 db32: 84 ff sbrs r24, 4 db34: 26 c0 rjmp .+76 ; 0xdb82 { // current position is known or very low, it's safe to raise Z clamp_to_software_endstops(current_position); db36: 81 e9 ldi r24, 0x91 ; 145 db38: 96 e0 ldi r25, 0x06 ; 6 db3a: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]); db3e: e0 91 71 02 lds r30, 0x0271 ; 0x800271 db42: f0 91 72 02 lds r31, 0x0272 ; 0x800272 db46: 60 85 ldd r22, Z+8 ; 0x08 db48: 71 85 ldd r23, Z+9 ; 0x09 db4a: 82 85 ldd r24, Z+10 ; 0x0a db4c: 93 85 ldd r25, Z+11 ; 0x0b db4e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); db52: 0f 94 a9 43 call 0x28752 ; 0x28752 // Get the final travel distance travel_z = current_position[Z_AXIS] - travel_z; db56: a7 01 movw r20, r14 db58: 96 01 movw r18, r12 db5a: 60 91 99 06 lds r22, 0x0699 ; 0x800699 db5e: 70 91 9a 06 lds r23, 0x069A ; 0x80069a db62: 80 91 9b 06 lds r24, 0x069B ; 0x80069b db66: 90 91 9c 06 lds r25, 0x069C ; 0x80069c db6a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> db6e: 6b 01 movw r12, r22 db70: 7c 01 movw r14, r24 #endif //TMC2130 enable_z_endstop(z_endstop_enabled); } return travel_z; } db72: c7 01 movw r24, r14 db74: b6 01 movw r22, r12 db76: cf 91 pop r28 db78: ff 90 pop r15 db7a: ef 90 pop r14 db7c: df 90 pop r13 db7e: cf 90 pop r12 db80: 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(); db82: 15 98 cbi 0x02, 5 ; 2 st_synchronize(); db84: 0f 94 a9 43 call 0x28752 ; 0x28752 // rely on crashguard to limit damage bool z_endstop_enabled = enable_z_endstop(true); db88: 81 e0 ldi r24, 0x01 ; 1 db8a: 0f 94 a3 4e call 0x29d46 ; 0x29d46 db8e: c8 2f mov r28, r24 #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); db90: 84 e0 ldi r24, 0x04 ; 4 db92: 0f 94 b4 26 call 0x24d68 ; 0x24d68 #endif //TMC2130 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); db96: 65 e5 ldi r22, 0x55 ; 85 db98: 75 e5 ldi r23, 0x55 ; 85 db9a: 85 e5 ldi r24, 0x55 ; 85 db9c: 91 e4 ldi r25, 0x41 ; 65 db9e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); dba2: 0f 94 a9 43 call 0x28752 ; 0x28752 // Get the final travel distance travel_z = st_get_position_mm(Z_AXIS) - travel_z; dba6: 82 e0 ldi r24, 0x02 ; 2 dba8: 0f 94 95 43 call 0x2872a ; 0x2872a dbac: a7 01 movw r20, r14 dbae: 96 01 movw r18, r12 dbb0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> dbb4: 6b 01 movw r12, r22 dbb6: 7c 01 movw r14, r24 #ifdef TMC2130 if (endstop_z_hit_on_purpose()) dbb8: 0f 94 b1 4e call 0x29d62 ; 0x29d62 dbbc: 88 23 and r24, r24 dbbe: 91 f0 breq .+36 ; 0xdbe4 { // not necessarily exact, but will avoid further vertical moves current_position[Z_AXIS] = max_pos[Z_AXIS]; dbc0: 80 91 1d 02 lds r24, 0x021D ; 0x80021d dbc4: 90 91 1e 02 lds r25, 0x021E ; 0x80021e dbc8: a0 91 1f 02 lds r26, 0x021F ; 0x80021f dbcc: b0 91 20 02 lds r27, 0x0220 ; 0x800220 dbd0: 80 93 99 06 sts 0x0699, r24 ; 0x800699 dbd4: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a dbd8: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b dbdc: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_set_position_curposXYZE(); dbe0: 0f 94 fd be call 0x37dfa ; 0x37dfa } tmc2130_home_exit(); dbe4: 0f 94 85 26 call 0x24d0a ; 0x24d0a #endif //TMC2130 enable_z_endstop(z_endstop_enabled); dbe8: 8c 2f mov r24, r28 dbea: 0f 94 a3 4e call 0x29d46 ; 0x29d46 dbee: c1 cf rjmp .-126 ; 0xdb72 0000dbf0 : // // 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) { dbf0: 8f 92 push r8 dbf2: 9f 92 push r9 dbf4: af 92 push r10 dbf6: bf 92 push r11 dbf8: cf 92 push r12 dbfa: df 92 push r13 dbfc: ef 92 push r14 dbfe: ff 92 push r15 dc00: 4b 01 movw r8, r22 dc02: 5c 01 movw r10, r24 if (current_position[Z_AXIS] >= target) dc04: c0 90 99 06 lds r12, 0x0699 ; 0x800699 dc08: d0 90 9a 06 lds r13, 0x069A ; 0x80069a dc0c: e0 90 9b 06 lds r14, 0x069B ; 0x80069b dc10: f0 90 9c 06 lds r15, 0x069C ; 0x80069c dc14: ac 01 movw r20, r24 dc16: 9b 01 movw r18, r22 dc18: c7 01 movw r24, r14 dc1a: b6 01 movw r22, r12 dc1c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> dc20: 87 ff sbrs r24, 7 dc22: 11 c0 rjmp .+34 ; 0xdc46 return; // Use absolute value in case the current position is unknown raise_z(fabs(current_position[Z_AXIS] - target)); dc24: a5 01 movw r20, r10 dc26: 94 01 movw r18, r8 dc28: c7 01 movw r24, r14 dc2a: b6 01 movw r22, r12 dc2c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> dc30: 9f 77 andi r25, 0x7F ; 127 } dc32: ff 90 pop r15 dc34: ef 90 pop r14 dc36: df 90 pop r13 dc38: cf 90 pop r12 dc3a: bf 90 pop r11 dc3c: af 90 pop r10 dc3e: 9f 90 pop r9 dc40: 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)); dc42: 0c 94 79 6d jmp 0xdaf2 ; 0xdaf2 } dc46: ff 90 pop r15 dc48: ef 90 pop r14 dc4a: df 90 pop r13 dc4c: cf 90 pop r12 dc4e: bf 90 pop r11 dc50: af 90 pop r10 dc52: 9f 90 pop r9 dc54: 8f 90 pop r8 dc56: 08 95 ret 0000dc58 : static void lcd_invalidate_custom_characters() { memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters)); } void lcd_frame_start() { dc58: ec e5 ldi r30, 0x5C ; 92 dc5a: 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; dc5c: 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]; dc5e: 81 91 ld r24, Z+ if (c == 0x7F) { //slot empty dc60: 8f 37 cpi r24, 0x7F ; 127 dc62: 31 f0 breq .+12 ; 0xdc70 dc64: df 01 movw r26, r30 dc66: 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 dc68: 87 ff sbrs r24, 7 dc6a: 07 c0 rjmp .+14 ; 0xdc7a lcd_custom_characters[i] = c & 0x7F; dc6c: 8f 77 andi r24, 0x7F ; 127 dc6e: 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++) { dc70: 83 e0 ldi r24, 0x03 ; 3 dc72: e4 36 cpi r30, 0x64 ; 100 dc74: f8 07 cpc r31, r24 dc76: 99 f7 brne .-26 ; 0xdc5e for (uint8_t i = 0; i < 8; i++) { printf_P(PSTR(" %02x"), lcd_custom_characters[i]); } printf_P(PSTR("\n")); #endif // DEBUG_CUSTOM_CHARACTERS } dc78: 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; dc7a: 9c 93 st X, r25 dc7c: f9 cf rjmp .-14 ; 0xdc70 0000dc7e : } } void lcd_update(uint8_t lcdDrawUpdateOverride) { if (lcd_draw_update < lcdDrawUpdateOverride) dc7e: 90 91 6d 02 lds r25, 0x026D ; 0x80026d dc82: 98 17 cp r25, r24 dc84: 10 f4 brcc .+4 ; 0xdc8a lcd_draw_update = lcdDrawUpdateOverride; dc86: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d if (!lcd_update_enabled) return; dc8a: 80 91 6e 02 lds r24, 0x026E ; 0x80026e dc8e: 88 23 and r24, r24 dc90: 39 f0 breq .+14 ; 0xdca0 if (lcd_lcdupdate_func) dc92: e0 91 14 04 lds r30, 0x0414 ; 0x800414 dc96: f0 91 15 04 lds r31, 0x0415 ; 0x800415 dc9a: 30 97 sbiw r30, 0x00 ; 0 dc9c: 09 f0 breq .+2 ; 0xdca0 lcd_lcdupdate_func(); dc9e: 19 94 eijmp } dca0: 08 95 ret 0000dca2 : lcd_set_cursor(c, r); return fputs_P(str, lcdout); } int lcd_printf_P(const char* format, ...) { dca2: cf 93 push r28 dca4: df 93 push r29 dca6: cd b7 in r28, 0x3d ; 61 dca8: de b7 in r29, 0x3e ; 62 dcaa: ae 01 movw r20, r28 dcac: 4a 5f subi r20, 0xFA ; 250 dcae: 5f 4f sbci r21, 0xFF ; 255 dcb0: fa 01 movw r30, r20 dcb2: 61 91 ld r22, Z+ dcb4: 71 91 ld r23, Z+ dcb6: af 01 movw r20, r30 va_list args; va_start(args, format); int ret = vfprintf_P(lcdout, format, args); dcb8: 82 e0 ldi r24, 0x02 ; 2 dcba: 94 e0 ldi r25, 0x04 ; 4 dcbc: 0f 94 57 db call 0x3b6ae ; 0x3b6ae va_end(args); return ret; } dcc0: df 91 pop r29 dcc2: cf 91 pop r28 dcc4: 08 95 ret 0000dcc6 : return fputc(ch, lcdout); } int lcd_puts_P(const char* str) { return fputs_P(str, lcdout); dcc6: 62 e0 ldi r22, 0x02 ; 2 dcc8: 74 e0 ldi r23, 0x04 ; 4 dcca: 0d 94 a8 da jmp 0x3b550 ; 0x3b550 0000dcce : lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address } int lcd_putc(char c) { return fputc(c, lcdout); dcce: 62 e0 ldi r22, 0x02 ; 2 dcd0: 74 e0 ldi r23, 0x04 ; 4 dcd2: 08 2e mov r0, r24 dcd4: 00 0c add r0, r0 dcd6: 99 0b sbc r25, r25 dcd8: 0d 94 78 da jmp 0x3b4f0 ; 0x3b4f0 0000dcdc : va_end(args); return ret; } void lcd_space(uint8_t n) { dcdc: cf 93 push r28 dcde: c8 2f mov r28, r24 while (n--) lcd_putc(' '); dce0: c1 50 subi r28, 0x01 ; 1 dce2: 20 f0 brcs .+8 ; 0xdcec dce4: 80 e2 ldi r24, 0x20 ; 32 dce6: 0e 94 67 6e call 0xdcce ; 0xdcce dcea: fa cf rjmp .-12 ; 0xdce0 } dcec: cf 91 pop r28 dcee: 08 95 ret 0000dcf0 : { return pgm_read_byte(row_offsets + min(row, LCD_HEIGHT - 1)); } void lcd_set_cursor(uint8_t col, uint8_t row) { dcf0: cf 93 push r28 dcf2: c8 2f mov r28, r24 dcf4: 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); dcf6: 64 30 cpi r22, 0x04 ; 4 dcf8: 08 f0 brcs .+2 ; 0xdcfc dcfa: 83 e0 ldi r24, 0x03 ; 3 dcfc: 80 93 5b 03 sts 0x035B, r24 ; 0x80035b } 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); dd00: 0e 94 a1 5a call 0xb542 ; 0xb542 dd04: 8c 0f add r24, r28 lcd_ddram_address = addr; dd06: 80 93 5a 03 sts 0x035A, r24 ; 0x80035a delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); dd0a: 44 e6 ldi r20, 0x64 ; 100 dd0c: 50 e0 ldi r21, 0x00 ; 0 dd0e: 60 e0 ldi r22, 0x00 ; 0 dd10: 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); } dd12: cf 91 pop r28 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); dd14: 0c 94 9f 63 jmp 0xc73e ; 0xc73e 0000dd18 : { return fputs_P(str, lcdout); } int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str) { dd18: cf 93 push r28 dd1a: df 93 push r29 dd1c: ea 01 movw r28, r20 lcd_set_cursor(c, r); dd1e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 return fputs_P(str, lcdout); dd22: 62 e0 ldi r22, 0x02 ; 2 dd24: 74 e0 ldi r23, 0x04 ; 4 dd26: ce 01 movw r24, r28 } dd28: df 91 pop r29 dd2a: 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); dd2c: 0d 94 a8 da jmp 0x3b550 ; 0x3b550 0000dd30 : { return fputc(c, lcdout); } int lcd_putc_at(uint8_t c, uint8_t r, char ch) { dd30: cf 93 push r28 dd32: c4 2f mov r28, r20 lcd_set_cursor(c, r); dd34: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 return fputc(ch, lcdout); dd38: 62 e0 ldi r22, 0x02 ; 2 dd3a: 74 e0 ldi r23, 0x04 ; 4 dd3c: 8c 2f mov r24, r28 dd3e: cc 0f add r28, r28 dd40: 99 0b sbc r25, r25 } dd42: 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); dd44: 0d 94 78 da jmp 0x3b4f0 ; 0x3b4f0 0000dd48 : } // Set cursor position to zero and in DDRAM. It does not unshift the display. void lcd_home(void) { lcd_set_cursor(0, 0); dd48: 60 e0 ldi r22, 0x00 ; 0 dd4a: 80 e0 ldi r24, 0x00 ; 0 dd4c: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_ddram_address = 0; dd50: 10 92 5a 03 sts 0x035A, r1 ; 0x80035a } dd54: 08 95 ret 0000dd56 : delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); dd56: 40 e4 ldi r20, 0x40 ; 64 dd58: 56 e0 ldi r21, 0x06 ; 6 dd5a: 60 e0 ldi r22, 0x00 ; 0 dd5c: 81 e0 ldi r24, 0x01 ; 1 dd5e: 0e 94 9f 63 call 0xc73e ; 0xc73e // 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; dd62: 10 92 5b 03 sts 0x035B, r1 ; 0x80035b lcd_ddram_address = 0; dd66: 10 92 5a 03 sts 0x035A, r1 ; 0x80035a 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)); dd6a: 48 e0 ldi r20, 0x08 ; 8 dd6c: 50 e0 ldi r21, 0x00 ; 0 dd6e: 6f e7 ldi r22, 0x7F ; 127 dd70: 70 e0 ldi r23, 0x00 ; 0 dd72: 8c e5 ldi r24, 0x5C ; 92 dd74: 93 e0 ldi r25, 0x03 ; 3 dd76: 0d 94 42 e2 jmp 0x3c484 ; 0x3c484 0000dd7a : } 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) dd7a: 90 91 6e 02 lds r25, 0x026E ; 0x80026e dd7e: 98 17 cp r25, r24 dd80: 09 f1 breq .+66 ; 0xddc4 { lcd_update_enabled = enabled; dd82: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e if (enabled) dd86: 88 23 and r24, r24 dd88: e9 f0 breq .+58 ; 0xddc4 { // Reset encoder position. This is equivalent to re-entering a menu. lcd_encoder = 0; dd8a: 10 92 70 06 sts 0x0670, r1 ; 0x800670 dd8e: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f lcd_encoder_diff = 0; dd92: 10 92 d0 05 sts 0x05D0, r1 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> // Enabling the normal LCD update procedure. // Reset the timeout interval. lcd_timeoutToStatus.start(); dd96: 8a ed ldi r24, 0xDA ; 218 dd98: 93 e0 ldi r25, 0x03 ; 3 dd9a: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> // Force the keypad update now. lcd_next_update_millis = _millis() - 1; dd9e: 0f 94 28 2a call 0x25450 ; 0x25450 dda2: 61 50 subi r22, 0x01 ; 1 dda4: 71 09 sbc r23, r1 dda6: 81 09 sbc r24, r1 dda8: 91 09 sbc r25, r1 ddaa: 60 93 d6 03 sts 0x03D6, r22 ; 0x8003d6 ddae: 70 93 d7 03 sts 0x03D7, r23 ; 0x8003d7 ddb2: 80 93 d8 03 sts 0x03D8, r24 ; 0x8003d8 ddb6: 90 93 d9 03 sts 0x03D9, r25 ; 0x8003d9 // Full update. lcd_clear(); ddba: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_update(2); ddbe: 82 e0 ldi r24, 0x02 ; 2 ddc0: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e } else { // Clear the LCD always, or let it to the caller? } } } ddc4: 08 95 ret 0000ddc6 : lcd_ddram_address++; // no need for preventing ddram overflow } } static void lcd_begin(uint8_t clear) { ddc6: cf 93 push r28 ddc8: c8 2f mov r28, r24 lcd_currline = 0; ddca: 10 92 5b 03 sts 0x035B, r1 ; 0x80035b lcd_ddram_address = 0; ddce: 10 92 5a 03 sts 0x035A, r1 ; 0x80035a 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)); ddd2: 48 e0 ldi r20, 0x08 ; 8 ddd4: 50 e0 ldi r21, 0x00 ; 0 ddd6: 6f e7 ldi r22, 0x7F ; 127 ddd8: 70 e0 ldi r23, 0x00 ; 0 ddda: 8c e5 ldi r24, 0x5C ; 92 dddc: 93 e0 ldi r25, 0x03 ; 3 ddde: 0f 94 42 e2 call 0x3c484 ; 0x3c484 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 dde2: 44 e9 ldi r20, 0x94 ; 148 dde4: 51 e1 ldi r21, 0x11 ; 17 dde6: 62 e0 ldi r22, 0x02 ; 2 dde8: 80 e3 ldi r24, 0x30 ; 48 ddea: 0e 94 9f 63 call 0xc73e ; 0xc73e // second try lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150); ddee: 46 e9 ldi r20, 0x96 ; 150 ddf0: 50 e0 ldi r21, 0x00 ; 0 ddf2: 62 e0 ldi r22, 0x02 ; 2 ddf4: 80 e3 ldi r24, 0x30 ; 48 ddf6: 0e 94 9f 63 call 0xc73e ; 0xc73e // third go! lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150); ddfa: 46 e9 ldi r20, 0x96 ; 150 ddfc: 50 e0 ldi r21, 0x00 ; 0 ddfe: 62 e0 ldi r22, 0x02 ; 2 de00: 80 e3 ldi r24, 0x30 ; 48 de02: 0e 94 9f 63 call 0xc73e ; 0xc73e #ifndef LCD_8BIT // set to 4-bit interface lcd_send(LCD_FUNCTIONSET | LCD_4BITMODE, LOW | LCD_HALF_FLAG, 150); de06: 46 e9 ldi r20, 0x96 ; 150 de08: 50 e0 ldi r21, 0x00 ; 0 de0a: 62 e0 ldi r22, 0x02 ; 2 de0c: 80 e2 ldi r24, 0x20 ; 32 de0e: 0e 94 9f 63 call 0xc73e ; 0xc73e #endif // finally, set # lines, font size, etc.0 lcd_command(LCD_FUNCTIONSET | lcd_displayfunction); de12: 80 91 10 04 lds r24, 0x0410 ; 0x800410 <_ZL19lcd_displayfunction.lto_priv.551> delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); de16: 44 e6 ldi r20, 0x64 ; 100 de18: 50 e0 ldi r21, 0x00 ; 0 de1a: 60 e0 ldi r22, 0x00 ; 0 de1c: 80 62 ori r24, 0x20 ; 32 de1e: 0e 94 9f 63 call 0xc73e ; 0xc73e } // Turn the display on/off (quickly) void lcd_display(void) { lcd_displaycontrol |= LCD_DISPLAYON; de22: 84 e0 ldi r24, 0x04 ; 4 de24: 80 93 59 03 sts 0x0359, r24 ; 0x800359 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); de28: 44 e6 ldi r20, 0x64 ; 100 de2a: 50 e0 ldi r21, 0x00 ; 0 de2c: 60 e0 ldi r22, 0x00 ; 0 de2e: 8c e0 ldi r24, 0x0C ; 12 de30: 0e 94 9f 63 call 0xc73e ; 0xc73e 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(); de34: c1 11 cpse r28, r1 de36: 0e 94 ab 6e call 0xdd56 ; 0xdd56 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); de3a: 44 e6 ldi r20, 0x64 ; 100 de3c: 50 e0 ldi r21, 0x00 ; 0 de3e: 60 e0 ldi r22, 0x00 ; 0 de40: 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); } de42: cf 91 pop r28 delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); de44: 0c 94 9f 63 jmp 0xc73e ; 0xc73e 0000de48 : fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream } void lcd_refresh(void) { lcd_begin(1); de48: 81 e0 ldi r24, 0x01 ; 1 de4a: 0c 94 e3 6e jmp 0xddc6 ; 0xddc6 0000de4e : { lcd_send(value, LOW, duration); } static void lcd_write(uint8_t value) { de4e: cf 92 push r12 de50: df 92 push r13 de52: ff 92 push r15 de54: 0f 93 push r16 de56: 1f 93 push r17 de58: cf 93 push r28 de5a: df 93 push r29 de5c: 00 d0 rcall .+0 ; 0xde5e de5e: 00 d0 rcall .+0 ; 0xde60 de60: 1f 92 push r1 de62: 1f 92 push r1 de64: cd b7 in r28, 0x3d ; 61 de66: de b7 in r29, 0x3e ; 62 if (value == '\n') { de68: 8a 30 cpi r24, 0x0A ; 10 de6a: d9 f4 brne .+54 ; 0xdea2 if (lcd_currline > 3) lcd_currline = -1; de6c: 80 91 5b 03 lds r24, 0x035B ; 0x80035b de70: 84 30 cpi r24, 0x04 ; 4 de72: 18 f0 brcs .+6 ; 0xde7a de74: 8f ef ldi r24, 0xFF ; 255 de76: 80 93 5b 03 sts 0x035B, r24 ; 0x80035b lcd_set_cursor(0, lcd_currline + 1); // LF de7a: 60 91 5b 03 lds r22, 0x035B ; 0x80035b de7e: 6f 5f subi r22, 0xFF ; 255 de80: 80 e0 ldi r24, 0x00 ; 0 de82: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print_custom(value); } else { lcd_send(value, HIGH); lcd_ddram_address++; // no need for preventing ddram overflow } } de86: 28 96 adiw r28, 0x08 ; 8 de88: 0f b6 in r0, 0x3f ; 63 de8a: f8 94 cli de8c: de bf out 0x3e, r29 ; 62 de8e: 0f be out 0x3f, r0 ; 63 de90: cd bf out 0x3d, r28 ; 61 de92: df 91 pop r29 de94: cf 91 pop r28 de96: 1f 91 pop r17 de98: 0f 91 pop r16 de9a: ff 90 pop r15 de9c: df 90 pop r13 de9e: cf 90 pop r12 dea0: 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))) { dea2: 90 e8 ldi r25, 0x80 ; 128 dea4: 98 0f add r25, r24 lcd_print_custom(value); } else { lcd_send(value, HIGH); dea6: 44 e6 ldi r20, 0x64 ; 100 dea8: 50 e0 ldi r21, 0x00 ; 0 deaa: 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))) { deac: 9a 34 cpi r25, 0x4A ; 74 deae: 08 f5 brcc .+66 ; 0xdef2 // 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. deb0: 48 2f mov r20, r24 deb2: 40 58 subi r20, 0x80 ; 128 deb4: 55 0b sbc r21, r21 deb6: 9a 01 movw r18, r20 deb8: 96 e0 ldi r25, 0x06 ; 6 deba: 92 9f mul r25, r18 debc: a0 01 movw r20, r0 debe: 93 9f mul r25, r19 dec0: 50 0d add r21, r0 dec2: 11 24 eor r1, r1 dec4: fa 01 movw r30, r20 dec6: e9 5b subi r30, 0xB9 ; 185 dec8: f6 48 sbci r31, 0x86 ; 134 deca: f4 90 lpm r15, Z decc: ec e5 ldi r30, 0x5C ; 92 dece: f3 e0 ldi r31, 0x03 ; 3 ded0: 30 e0 ldi r19, 0x00 ; 0 ded2: 20 e0 ldi r18, 0x00 ; 0 int8_t slotToUse = -1; ded4: 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)) { ded6: 61 91 ld r22, Z+ ded8: 78 2f mov r23, r24 deda: 76 27 eor r23, r22 dedc: 7f 77 andi r23, 0x7F ; 127 dede: 89 f4 brne .+34 ; 0xdf02 lcd_custom_characters[i] = c; // mark the custom character as used dee0: f9 01 movw r30, r18 dee2: e4 5a subi r30, 0xA4 ; 164 dee4: fc 4f sbci r31, 0xFC ; 252 dee6: 80 83 st Z, r24 dee8: 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); deea: 44 e6 ldi r20, 0x64 ; 100 deec: 50 e0 ldi r21, 0x00 ; 0 deee: 61 e0 ldi r22, 0x01 ; 1 def0: 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); def2: 0e 94 9f 63 call 0xc73e ; 0xc73e lcd_ddram_address++; // no need for preventing ddram overflow def6: 80 91 5a 03 lds r24, 0x035A ; 0x80035a defa: 8f 5f subi r24, 0xFF ; 255 defc: 80 93 5a 03 sts 0x035A, r24 ; 0x80035a df00: c2 cf rjmp .-124 ; 0xde86 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 df02: 6f 37 cpi r22, 0x7F ; 127 df04: 09 f0 breq .+2 ; 0xdf08 df06: 3c c0 rjmp .+120 ; 0xdf80 lcd_custom_characters[i] = c; // mark the custom character as used df08: f9 01 movw r30, r18 df0a: e4 5a subi r30, 0xA4 ; 164 df0c: fc 4f sbci r31, 0xFC ; 252 df0e: 80 83 st Z, r24 slotToUse = i; df10: 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; df12: f9 2e mov r15, r25 lcd_createChar_P(slotToUse, &Font[c - 0x80]); df14: fa 01 movw r30, r20 df16: ee 5b subi r30, 0xBE ; 190 df18: f6 48 sbci r31, 0x86 ; 134 "dec __zero_reg__" "\n\t" "brne forBegin_%=" "\n\t" : "=&d" (temp), "=&r" (colByte) : "z" (char_p), "e" (charmap) ); df1a: 8e 01 movw r16, r28 df1c: 0f 5f subi r16, 0xFF ; 255 df1e: 1f 4f sbci r17, 0xFF ; 255 df20: d8 01 movw r26, r16 df22: 95 91 lpm r25, Z+ df24: 88 e0 ldi r24, 0x08 ; 8 df26: 18 2e mov r1, r24 0000df28 : df28: 10 fe sbrs r1, 0 df2a: 05 90 lpm r0, Z+ df2c: 02 94 swap r0 df2e: 80 2d mov r24, r0 df30: 97 95 ror r25 df32: 88 1f adc r24, r24 df34: 8d 93 st X+, r24 df36: 1a 94 dec r1 df38: b9 f7 brne .-18 ; 0xdf28 lcd_command(LCD_SETCGRAMADDR | (location << 3)); df3a: bf 2d mov r27, r15 df3c: e8 e0 ldi r30, 0x08 ; 8 df3e: be 02 muls r27, r30 df40: c0 01 movw r24, r0 df42: 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); df44: 44 e6 ldi r20, 0x64 ; 100 df46: 50 e0 ldi r21, 0x00 ; 0 df48: 60 e0 ldi r22, 0x00 ; 0 df4a: 80 64 ori r24, 0x40 ; 64 df4c: 0e 94 9f 63 call 0xc73e ; 0xc73e df50: 6e 01 movw r12, r28 df52: f9 e0 ldi r31, 0x09 ; 9 df54: cf 0e add r12, r31 df56: 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); df58: 44 e6 ldi r20, 0x64 ; 100 df5a: 50 e0 ldi r21, 0x00 ; 0 df5c: 61 e0 ldi r22, 0x01 ; 1 df5e: d8 01 movw r26, r16 df60: 8d 91 ld r24, X+ df62: 8d 01 movw r16, r26 df64: 0e 94 9f 63 call 0xc73e ; 0xc73e : "=&d" (temp), "=&r" (colByte) : "z" (char_p), "e" (charmap) ); lcd_command(LCD_SETCGRAMADDR | (location << 3)); for (uint8_t i = 0; i < 8; i++) { df68: c0 16 cp r12, r16 df6a: d1 06 cpc r13, r17 df6c: a9 f7 brne .-22 ; 0xdf58 lcd_send(charmap[i], HIGH); } lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address df6e: 80 91 5a 03 lds r24, 0x035A ; 0x80035a delayMicroseconds(duration); } static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY) { lcd_send(value, LOW, duration); df72: 44 e6 ldi r20, 0x64 ; 100 df74: 50 e0 ldi r21, 0x00 ; 0 df76: 60 e0 ldi r22, 0x00 ; 0 df78: 80 68 ori r24, 0x80 ; 128 df7a: 0e 94 9f 63 call 0xc73e ; 0xc73e df7e: b5 cf rjmp .-150 ; 0xdeea 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 df80: 67 ff sbrs r22, 7 slotToUse = i; df82: 92 2f mov r25, r18 df84: 2f 5f subi r18, 0xFF ; 255 df86: 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++) { df88: 28 30 cpi r18, 0x08 ; 8 df8a: 31 05 cpc r19, r1 df8c: 09 f0 breq .+2 ; 0xdf90 df8e: a3 cf rjmp .-186 ; 0xded6 } // 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) { df90: 9f 3f cpi r25, 0xFF ; 255 df92: 09 f0 breq .+2 ; 0xdf96 df94: be cf rjmp .-132 ; 0xdf12 df96: a9 cf rjmp .-174 ; 0xdeea 0000df98 : else lcd_printNumber(n, base); } void lcd_printNumber(unsigned long n, uint8_t base) { df98: 8f 92 push r8 df9a: 9f 92 push r9 df9c: af 92 push r10 df9e: bf 92 push r11 dfa0: ef 92 push r14 dfa2: ff 92 push r15 dfa4: 0f 93 push r16 dfa6: 1f 93 push r17 dfa8: cf 93 push r28 dfaa: df 93 push r29 dfac: cd b7 in r28, 0x3d ; 61 dfae: de b7 in r29, 0x3e ; 62 dfb0: a0 97 sbiw r28, 0x20 ; 32 dfb2: 0f b6 in r0, 0x3f ; 63 dfb4: f8 94 cli dfb6: de bf out 0x3e, r29 ; 62 dfb8: 0f be out 0x3f, r0 ; 63 dfba: cd bf out 0x3d, r28 ; 61 unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; if (n == 0) dfbc: 61 15 cp r22, r1 dfbe: 71 05 cpc r23, r1 dfc0: 81 05 cpc r24, r1 dfc2: 91 05 cpc r25, r1 dfc4: 99 f4 brne .+38 ; 0xdfec } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); dfc6: 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)); } dfc8: a0 96 adiw r28, 0x20 ; 32 dfca: 0f b6 in r0, 0x3f ; 63 dfcc: f8 94 cli dfce: de bf out 0x3e, r29 ; 62 dfd0: 0f be out 0x3f, r0 ; 63 dfd2: cd bf out 0x3d, r28 ; 61 dfd4: df 91 pop r29 dfd6: cf 91 pop r28 dfd8: 1f 91 pop r17 dfda: 0f 91 pop r16 dfdc: ff 90 pop r15 dfde: ef 90 pop r14 dfe0: bf 90 pop r11 dfe2: af 90 pop r10 dfe4: 9f 90 pop r9 dfe6: 8f 90 pop r8 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); dfe8: 0c 94 27 6f jmp 0xde4e ; 0xde4e } void lcd_printNumber(unsigned long n, uint8_t base) { unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; dfec: 00 e0 ldi r16, 0x00 ; 0 lcd_print('0'); return; } while (n > 0) { buf[i++] = n % base; dfee: 84 2e mov r8, r20 dff0: 91 2c mov r9, r1 dff2: b1 2c mov r11, r1 dff4: a1 2c mov r10, r1 dff6: 9e 01 movw r18, r28 dff8: 2f 5f subi r18, 0xFF ; 255 dffa: 3f 4f sbci r19, 0xFF ; 255 dffc: 79 01 movw r14, r18 dffe: a5 01 movw r20, r10 e000: 94 01 movw r18, r8 e002: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> e006: f7 01 movw r30, r14 e008: e0 0f add r30, r16 e00a: f1 1d adc r31, r1 e00c: 60 83 st Z, r22 n /= base; e00e: b9 01 movw r22, r18 e010: ca 01 movw r24, r20 lcd_print('0'); return; } while (n > 0) { buf[i++] = n % base; e012: 0f 5f subi r16, 0xFF ; 255 if (n == 0) { lcd_print('0'); return; } while (n > 0) e014: 61 15 cp r22, r1 e016: 71 05 cpc r23, r1 e018: 81 05 cpc r24, r1 e01a: 91 05 cpc r25, r1 e01c: 81 f7 brne .-32 ; 0xdffe e01e: 0e 0d add r16, r14 e020: 1f 2d mov r17, r15 e022: 11 1d adc r17, r1 { buf[i++] = n % base; n /= base; } for (; i > 0; i--) e024: e0 16 cp r14, r16 e026: f1 06 cpc r15, r17 e028: 59 f0 breq .+22 ; 0xe040 lcd_print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); e02a: f8 01 movw r30, r16 e02c: 82 91 ld r24, -Z e02e: 8f 01 movw r16, r30 e030: 8a 30 cpi r24, 0x0A ; 10 e032: 20 f4 brcc .+8 ; 0xe03c e034: 80 5d subi r24, 0xD0 ; 208 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e036: 0e 94 27 6f call 0xde4e ; 0xde4e e03a: f4 cf rjmp .-24 ; 0xe024 { 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)); e03c: 89 5c subi r24, 0xC9 ; 201 e03e: fb cf rjmp .-10 ; 0xe036 } e040: a0 96 adiw r28, 0x20 ; 32 e042: 0f b6 in r0, 0x3f ; 63 e044: f8 94 cli e046: de bf out 0x3e, r29 ; 62 e048: 0f be out 0x3f, r0 ; 63 e04a: cd bf out 0x3d, r28 ; 61 e04c: df 91 pop r29 e04e: cf 91 pop r28 e050: 1f 91 pop r17 e052: 0f 91 pop r16 e054: ff 90 pop r15 e056: ef 90 pop r14 e058: bf 90 pop r11 e05a: af 90 pop r10 e05c: 9f 90 pop r9 e05e: 8f 90 pop r8 e060: 08 95 ret 0000e062 : void lcd_print(unsigned int n, int base) { lcd_print((unsigned long) n, base); } void lcd_print(long n, int base) e062: cf 92 push r12 e064: df 92 push r13 e066: ef 92 push r14 e068: ff 92 push r15 e06a: 6b 01 movw r12, r22 e06c: 7c 01 movw r14, r24 { if (base == 0) lcd_write(n); else if (base == 10) { if (n < 0) e06e: f7 fe sbrs r15, 7 e070: 0b c0 rjmp .+22 ; 0xe088 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e072: 8d e2 ldi r24, 0x2D ; 45 e074: 0e 94 27 6f call 0xde4e ; 0xde4e else if (base == 10) { if (n < 0) { lcd_print('-'); n = -n; e078: f0 94 com r15 e07a: e0 94 com r14 e07c: d0 94 com r13 e07e: c0 94 com r12 e080: c1 1c adc r12, r1 e082: d1 1c adc r13, r1 e084: e1 1c adc r14, r1 e086: f1 1c adc r15, r1 } lcd_printNumber(n, 10); e088: 4a e0 ldi r20, 0x0A ; 10 e08a: c7 01 movw r24, r14 e08c: b6 01 movw r22, r12 } else lcd_printNumber(n, base); } e08e: ff 90 pop r15 e090: ef 90 pop r14 e092: df 90 pop r13 e094: cf 90 pop r12 if (n < 0) { lcd_print('-'); n = -n; } lcd_printNumber(n, 10); e096: 0c 94 cc 6f jmp 0xdf98 ; 0xdf98 0000e09a : lcd_space(len); return len; } uint8_t lcd_print_pad_P(const char* s, uint8_t len) { e09a: 0f 93 push r16 e09c: 1f 93 push r17 e09e: cf 93 push r28 e0a0: 8c 01 movw r16, r24 e0a2: c6 2f mov r28, r22 while (len && pgm_read_byte(s)) { e0a4: cc 23 and r28, r28 e0a6: 59 f0 breq .+22 ; 0xe0be e0a8: f8 01 movw r30, r16 e0aa: 24 91 lpm r18, Z e0ac: 22 23 and r18, r18 e0ae: 39 f0 breq .+14 ; 0xe0be lcd_write(pgm_read_byte(s++)); e0b0: 0f 5f subi r16, 0xFF ; 255 e0b2: 1f 4f sbci r17, 0xFF ; 255 e0b4: 84 91 lpm r24, Z e0b6: 0e 94 27 6f call 0xde4e ; 0xde4e --len; e0ba: c1 50 subi r28, 0x01 ; 1 e0bc: f3 cf rjmp .-26 ; 0xe0a4 } lcd_space(len); e0be: 8c 2f mov r24, r28 e0c0: 0e 94 6e 6e call 0xdcdc ; 0xdcdc return len; } e0c4: 8c 2f mov r24, r28 e0c6: cf 91 pop r28 e0c8: 1f 91 pop r17 e0ca: 0f 91 pop r16 e0cc: 08 95 ret 0000e0ce : { while (*s) lcd_write(*(s++)); } uint8_t lcd_print_pad(const char* s, uint8_t len) { e0ce: 0f 93 push r16 e0d0: 1f 93 push r17 e0d2: cf 93 push r28 e0d4: 8c 01 movw r16, r24 e0d6: c6 2f mov r28, r22 while (len && *s) { e0d8: cc 23 and r28, r28 e0da: 49 f0 breq .+18 ; 0xe0ee e0dc: f8 01 movw r30, r16 e0de: 81 91 ld r24, Z+ e0e0: 8f 01 movw r16, r30 e0e2: 88 23 and r24, r24 e0e4: 21 f0 breq .+8 ; 0xe0ee lcd_write(*(s++)); e0e6: 0e 94 27 6f call 0xde4e ; 0xde4e --len; e0ea: c1 50 subi r28, 0x01 ; 1 e0ec: f5 cf rjmp .-22 ; 0xe0d8 } lcd_space(len); e0ee: 8c 2f mov r24, r28 e0f0: 0e 94 6e 6e call 0xdcdc ; 0xdcdc return len; } e0f4: 8c 2f mov r24, r28 e0f6: cf 91 pop r28 e0f8: 1f 91 pop r17 e0fa: 0f 91 pop r16 e0fc: 08 95 ret 0000e0fe : while (n--) lcd_putc(' '); } void lcd_print(const char* s) { e0fe: cf 93 push r28 e100: df 93 push r29 e102: ec 01 movw r28, r24 while (*s) lcd_write(*(s++)); e104: 89 91 ld r24, Y+ e106: 88 23 and r24, r24 e108: 19 f0 breq .+6 ; 0xe110 e10a: 0e 94 27 6f call 0xde4e ; 0xde4e e10e: fa cf rjmp .-12 ; 0xe104 } e110: df 91 pop r29 e112: cf 91 pop r28 e114: 08 95 ret 0000e116 : lcd_command(LCD_ENTRYMODESET | lcd_displaymode); } static int lcd_putchar(char c, FILE *) { lcd_write(c); e116: 0e 94 27 6f call 0xde4e ; 0xde4e return 0; } e11a: 90 e0 ldi r25, 0x00 ; 0 e11c: 80 e0 ldi r24, 0x00 ; 0 e11e: 08 95 ret 0000e120 : extern void lcd_frame_start(); //! @brief Consume click and longpress event inline void lcd_consume_click() { lcd_click_trigger = 0; e120: 10 92 a6 03 sts 0x03A6, r1 ; 0x8003a6 lcd_longpress_trigger = 0; e124: 10 92 d3 05 sts 0x05D3, r1 ; 0x8005d3 } e128: 08 95 ret 0000e12a : //! Generally is used in modal dialogs. //! //! @retval 0 not clicked //! @retval nonzero clicked uint8_t lcd_clicked(void) { e12a: cf 93 push r28 bool clicked = LCD_CLICKED; e12c: 80 91 a6 03 lds r24, 0x03A6 ; 0x8003a6 e130: c1 e0 ldi r28, 0x01 ; 1 e132: 81 11 cpse r24, r1 e134: 04 c0 rjmp .+8 ; 0xe13e e136: c0 e0 ldi r28, 0x00 ; 0 if(clicked) { lcd_consume_click(); } return clicked; } e138: 8c 2f mov r24, r28 e13a: cf 91 pop r28 e13c: 08 95 ret uint8_t lcd_clicked(void) { bool clicked = LCD_CLICKED; if(clicked) { lcd_consume_click(); e13e: 0e 94 90 70 call 0xe120 ; 0xe120 e142: fa cf rjmp .-12 ; 0xe138 0000e144 : if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN #ifdef XFLASH if (lang == LANG_ID_SEC) { uint16_t ui = _SEC_LANG_TABLE; //table pointer if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return LANG_CODE_XX; //magic not valid e144: e0 e0 ldi r30, 0x00 ; 0 e146: f1 e0 ldi r31, 0x01 ; 1 e148: 85 91 lpm r24, Z+ e14a: 95 91 lpm r25, Z+ e14c: a5 91 lpm r26, Z+ e14e: b4 91 lpm r27, Z e150: 85 3a cpi r24, 0xA5 ; 165 e152: 9a 45 sbci r25, 0x5A ; 90 e154: a4 4b sbci r26, 0xB4 ; 180 e156: bb 44 sbci r27, 0x4B ; 75 e158: 29 f4 brne .+10 ; 0xe164 return pgm_read_word(((uint32_t*)(ui + 10))); //return lang code from progmem e15a: ea e0 ldi r30, 0x0A ; 10 e15c: f1 e0 ldi r31, 0x01 ; 1 e15e: 85 91 lpm r24, Z+ e160: 94 91 lpm r25, Z e162: 08 95 ret if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN #ifdef XFLASH if (lang == LANG_ID_SEC) { uint16_t ui = _SEC_LANG_TABLE; //table pointer if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return LANG_CODE_XX; //magic not valid e164: 8f e3 ldi r24, 0x3F ; 63 e166: 9f e3 ldi r25, 0x3F ; 63 table += pgm_read_word((uint16_t*)(table + 4)); count++; } #endif //XFLASH return LANG_CODE_XX; } e168: 08 95 ret 0000e16a : 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); e16a: 8e ef ldi r24, 0xFE ; 254 e16c: 9f e0 ldi r25, 0x0F ; 15 e16e: 0f 94 10 dc call 0x3b820 ; 0x3b820 return (lang_eeprom != LANG_ID_FORCE_SELECTION) && (lang_eeprom == lang_selected); e172: 8e 3f cpi r24, 0xFE ; 254 e174: 39 f0 breq .+14 ; 0xe184 e176: 91 e0 ldi r25, 0x01 ; 1 e178: 20 91 58 03 lds r18, 0x0358 ; 0x800358 e17c: 28 13 cpse r18, r24 e17e: 90 e0 ldi r25, 0x00 ; 0 e180: 89 2f mov r24, r25 e182: 08 95 ret e184: 80 e0 ldi r24, 0x00 ; 0 } e186: 08 95 ret 0000e188 : return _n("??"); } void lang_reset(void) { lang_selected = 0; e188: 10 92 58 03 sts 0x0358, r1 ; 0x800358 eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION); e18c: 6e ef ldi r22, 0xFE ; 254 e18e: 8e ef ldi r24, 0xFE ; 254 e190: 9f e0 ldi r25, 0x0F ; 15 e192: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0000e196 : return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e196: 85 37 cpi r24, 0x75 ; 117 e198: 28 e6 ldi r18, 0x68 ; 104 e19a: 92 07 cpc r25, r18 e19c: 09 f4 brne .+2 ; 0xe1a0 e19e: 59 c0 rjmp .+178 ; 0xe252 e1a0: f8 f4 brcc .+62 ; 0xe1e0 e1a2: 8e 36 cpi r24, 0x6E ; 110 e1a4: 25 e6 ldi r18, 0x65 ; 101 e1a6: 92 07 cpc r25, r18 e1a8: 09 f4 brne .+2 ; 0xe1ac e1aa: 59 c0 rjmp .+178 ; 0xe25e e1ac: 50 f4 brcc .+20 ; 0xe1c2 e1ae: 83 37 cpi r24, 0x73 ; 115 e1b0: 23 e6 ldi r18, 0x63 ; 99 e1b2: 92 07 cpc r25, r18 e1b4: b1 f1 breq .+108 ; 0xe222 e1b6: 85 36 cpi r24, 0x65 ; 101 e1b8: 94 46 sbci r25, 0x64 ; 100 e1ba: b1 f1 breq .+108 ; 0xe228 //#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("??"); e1bc: 86 e3 ldi r24, 0x36 ; 54 e1be: 95 e6 ldi r25, 0x65 ; 101 e1c0: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e1c2: 82 37 cpi r24, 0x72 ; 114 e1c4: 26 e6 ldi r18, 0x66 ; 102 e1c6: 92 07 cpc r25, r18 e1c8: 91 f1 breq .+100 ; 0xe22e e1ca: 82 37 cpi r24, 0x72 ; 114 e1cc: 28 e6 ldi r18, 0x68 ; 104 e1ce: 92 07 cpc r25, r18 e1d0: 09 f4 brne .+2 ; 0xe1d4 e1d2: 42 c0 rjmp .+132 ; 0xe258 e1d4: 83 37 cpi r24, 0x73 ; 115 e1d6: 95 46 sbci r25, 0x65 ; 101 e1d8: 89 f7 brne .-30 ; 0xe1bc { 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"); e1da: 8d e8 ldi r24, 0x8D ; 141 e1dc: 95 e6 ldi r25, 0x65 ; 101 e1de: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e1e0: 8c 36 cpi r24, 0x6C ; 108 e1e2: 20 e7 ldi r18, 0x70 ; 112 e1e4: 92 07 cpc r25, r18 e1e6: 31 f1 breq .+76 ; 0xe234 e1e8: 70 f4 brcc .+28 ; 0xe206 e1ea: 8c 36 cpi r24, 0x6C ; 108 e1ec: 2e e6 ldi r18, 0x6E ; 110 e1ee: 92 07 cpc r25, r18 e1f0: 21 f1 breq .+72 ; 0xe23a e1f2: 8f 36 cpi r24, 0x6F ; 111 e1f4: 2e e6 ldi r18, 0x6E ; 110 e1f6: 92 07 cpc r25, r18 e1f8: 31 f1 breq .+76 ; 0xe246 e1fa: 84 37 cpi r24, 0x74 ; 116 e1fc: 99 46 sbci r25, 0x69 ; 105 e1fe: f1 f6 brne .-68 ; 0xe1bc 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"); e200: 8b e7 ldi r24, 0x7B ; 123 e202: 95 e6 ldi r25, 0x65 ; 101 e204: 08 95 ret return LANG_CODE_XX; } const char* lang_get_name_by_code(uint16_t code) { switch (code) e206: 8b 36 cpi r24, 0x6B ; 107 e208: 23 e7 ldi r18, 0x73 ; 115 e20a: 92 07 cpc r25, r18 e20c: f9 f0 breq .+62 ; 0xe24c e20e: 86 37 cpi r24, 0x76 ; 118 e210: 23 e7 ldi r18, 0x73 ; 115 e212: 92 07 cpc r25, r18 e214: a9 f0 breq .+42 ; 0xe240 e216: 8f 36 cpi r24, 0x6F ; 111 e218: 92 47 sbci r25, 0x72 ; 114 e21a: 81 f6 brne .-96 ; 0xe1bc #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 e21c: 89 e3 ldi r24, 0x39 ; 57 e21e: 95 e6 ldi r25, 0x65 ; 101 e220: 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"); e222: 8d e9 ldi r24, 0x9D ; 157 e224: 95 e6 ldi r25, 0x65 ; 101 e226: 08 95 ret case LANG_CODE_DE: return _n("Deutsch"); e228: 85 e9 ldi r24, 0x95 ; 149 e22a: 95 e6 ldi r25, 0x65 ; 101 e22c: 08 95 ret case LANG_CODE_ES: return _n("Espanol"); case LANG_CODE_FR: return _n("Francais"); e22e: 84 e8 ldi r24, 0x84 ; 132 e230: 95 e6 ldi r25, 0x65 ; 101 e232: 08 95 ret case LANG_CODE_IT: return _n("Italiano"); case LANG_CODE_PL: return _n("Polski"); e234: 84 e7 ldi r24, 0x74 ; 116 e236: 95 e6 ldi r25, 0x65 ; 101 e238: 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 e23a: 89 e6 ldi r24, 0x69 ; 105 e23c: 95 e6 ldi r25, 0x65 ; 101 e23e: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_NL #ifdef COMMUNITY_LANG_GROUP1_SV case LANG_CODE_SV: return _n("Svenska"); //community Swedish contribution e240: 81 e6 ldi r24, 0x61 ; 97 e242: 95 e6 ldi r25, 0x65 ; 101 e244: 08 95 ret #endif // COMMUNITY_LANG_GROUP1_SV #ifdef COMMUNITY_LANG_GROUP1_NO case LANG_CODE_NO: return _n("Norsk"); //community Swedish contribution e246: 8b e5 ldi r24, 0x5B ; 91 e248: 95 e6 ldi r25, 0x65 ; 101 e24a: 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 e24c: 80 e5 ldi r24, 0x50 ; 80 e24e: 95 e6 ldi r25, 0x65 ; 101 e250: 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 e252: 89 e4 ldi r24, 0x49 ; 73 e254: 95 e6 ldi r25, 0x65 ; 101 e256: 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 e258: 80 e4 ldi r24, 0x40 ; 64 e25a: 95 e6 ldi r25, 0x65 ; 101 e25c: 08 95 ret const char* lang_get_name_by_code(uint16_t code) { switch (code) { case LANG_CODE_EN: return _n("English"); e25e: 85 ea ldi r24, 0xA5 ; 165 e260: 95 e6 ldi r25, 0x65 ; 101 // case LANG_CODE_QR: return _n("New language"); //community contribution //#endif // COMMUNITY_LANG_GROUP1_QR #endif // COMMUNITY_LANGUAGE_SUPPORT } return _n("??"); } e262: 08 95 ret 0000e264 : #endif //XFLASH return 0; } uint16_t lang_get_code(uint8_t lang) { e264: cf 92 push r12 e266: df 92 push r13 e268: ef 92 push r14 e26a: ff 92 push r15 e26c: 1f 93 push r17 e26e: cf 93 push r28 e270: df 93 push r29 e272: cd b7 in r28, 0x3d ; 61 e274: de b7 in r29, 0x3e ; 62 e276: 60 97 sbiw r28, 0x10 ; 16 e278: 0f b6 in r0, 0x3f ; 63 e27a: f8 94 cli e27c: de bf out 0x3e, r29 ; 62 e27e: 0f be out 0x3f, r0 ; 63 e280: cd bf out 0x3d, r28 ; 61 if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN e282: 88 23 and r24, r24 e284: c1 f1 breq .+112 ; 0xe2f6 e286: 18 2f mov r17, r24 #ifdef XFLASH if (lang == LANG_ID_SEC) e288: 81 30 cpi r24, 0x01 ; 1 e28a: 81 f4 brne .+32 ; 0xe2ac e28c: 0e 94 a2 70 call 0xe144 ; 0xe144 table += pgm_read_word((uint16_t*)(table + 4)); count++; } #endif //XFLASH return LANG_CODE_XX; } e290: 60 96 adiw r28, 0x10 ; 16 e292: 0f b6 in r0, 0x3f ; 63 e294: f8 94 cli e296: de bf out 0x3e, r29 ; 62 e298: 0f be out 0x3f, r0 ; 63 e29a: cd bf out 0x3d, r28 ; 61 e29c: df 91 pop r29 e29e: cf 91 pop r28 e2a0: 1f 91 pop r17 e2a2: ff 90 pop r15 e2a4: ef 90 pop r14 e2a6: df 90 pop r13 e2a8: cf 90 pop r12 e2aa: 08 95 ret SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; e2ac: 8c e5 ldi r24, 0x5C ; 92 e2ae: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; e2b0: 1d bc out 0x2d, r1 ; 45 return pgm_read_word(((uint32_t*)(ui + 10))); //return lang code from progmem } XFLASH_SPI_ENTER(); uint32_t addr = LANG_OFFSET; lang_table_header_t header; //table header structure lang--; e2b2: 11 50 subi r17, 0x01 ; 1 uint16_t ui = _SEC_LANG_TABLE; //table pointer if (pgm_read_dword(((uint32_t*)(ui + 0))) != LANG_MAGIC) return LANG_CODE_XX; //magic not valid return pgm_read_word(((uint32_t*)(ui + 10))); //return lang code from progmem } XFLASH_SPI_ENTER(); uint32_t addr = LANG_OFFSET; e2b4: c1 2c mov r12, r1 e2b6: d1 2c mov r13, r1 e2b8: 76 01 movw r14, r12 lang_table_header_t header; //table header structure lang--; while (1) { xflash_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash e2ba: 20 e1 ldi r18, 0x10 ; 16 e2bc: 30 e0 ldi r19, 0x00 ; 0 e2be: ae 01 movw r20, r28 e2c0: 4f 5f subi r20, 0xFF ; 255 e2c2: 5f 4f sbci r21, 0xFF ; 255 e2c4: c7 01 movw r24, r14 e2c6: b6 01 movw r22, r12 e2c8: 0e 94 a0 ed call 0x1db40 ; 0x1db40 if (header.magic != LANG_MAGIC) break; //break if not valid e2cc: 89 81 ldd r24, Y+1 ; 0x01 e2ce: 9a 81 ldd r25, Y+2 ; 0x02 e2d0: ab 81 ldd r26, Y+3 ; 0x03 e2d2: bc 81 ldd r27, Y+4 ; 0x04 e2d4: 85 3a cpi r24, 0xA5 ; 165 e2d6: 9a 45 sbci r25, 0x5A ; 90 e2d8: a4 4b sbci r26, 0xB4 ; 180 e2da: bb 44 sbci r27, 0x4B ; 75 e2dc: 79 f4 brne .+30 ; 0xe2fc if (--lang == 0) return header.code; e2de: 11 50 subi r17, 0x01 ; 1 e2e0: 19 f4 brne .+6 ; 0xe2e8 e2e2: 8b 85 ldd r24, Y+11 ; 0x0b e2e4: 9c 85 ldd r25, Y+12 ; 0x0c e2e6: d4 cf rjmp .-88 ; 0xe290 addr += header.size; //calc address of next table e2e8: 8d 81 ldd r24, Y+5 ; 0x05 e2ea: 9e 81 ldd r25, Y+6 ; 0x06 e2ec: c8 0e add r12, r24 e2ee: d9 1e adc r13, r25 e2f0: e1 1c adc r14, r1 e2f2: f1 1c adc r15, r1 e2f4: e2 cf rjmp .-60 ; 0xe2ba return 0; } uint16_t lang_get_code(uint8_t lang) { if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN e2f6: 8e e6 ldi r24, 0x6E ; 110 e2f8: 95 e6 ldi r25, 0x65 ; 101 e2fa: ca cf rjmp .-108 ; 0xe290 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; e2fc: 8f e3 ldi r24, 0x3F ; 63 e2fe: 9f e3 ldi r25, 0x3F ; 63 e300: c7 cf rjmp .-114 ; 0xe290 0000e302 : sum = (sum >> 8) | ((sum & 0xff) << 8); //swap bytes return (sum == lt_sum); } uint8_t lang_get_count() { e302: cf 92 push r12 e304: df 92 push r13 e306: ef 92 push r14 e308: ff 92 push r15 e30a: 1f 93 push r17 e30c: cf 93 push r28 e30e: df 93 push r29 e310: cd b7 in r28, 0x3d ; 61 e312: de b7 in r29, 0x3e ; 62 e314: 60 97 sbiw r28, 0x10 ; 16 e316: 0f b6 in r0, 0x3f ; 63 e318: f8 94 cli e31a: de bf out 0x3e, r29 ; 62 e31c: 0f be out 0x3f, r0 ; 63 e31e: cd bf out 0x3d, r28 ; 61 if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff) e320: ee e3 ldi r30, 0x3E ; 62 e322: f9 e7 ldi r31, 0x79 ; 121 e324: 85 91 lpm r24, Z+ e326: 95 91 lpm r25, Z+ e328: a5 91 lpm r26, Z+ e32a: b4 91 lpm r27, Z return 1; //signature not set - only primary language will be available e32c: 11 e0 ldi r17, 0x01 ; 1 return (sum == lt_sum); } uint8_t lang_get_count() { if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff) e32e: 8f 3f cpi r24, 0xFF ; 255 e330: 9f 4f sbci r25, 0xFF ; 255 e332: af 4f sbci r26, 0xFF ; 255 e334: bf 4f sbci r27, 0xFF ; 255 e336: 09 f1 breq .+66 ; 0xe37a SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; e338: 8c e5 ldi r24, 0x5C ; 92 e33a: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; e33c: 1d bc out 0x2d, r1 ; 45 return 1; //signature not set - only primary language will be available #ifdef XFLASH XFLASH_SPI_ENTER(); uint8_t count = 2; //count = 1+n (primary + secondary + all in xflash) uint32_t addr = LANG_OFFSET; e33e: c1 2c mov r12, r1 e340: d1 2c mov r13, r1 e342: 76 01 movw r14, r12 { if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff) return 1; //signature not set - only primary language will be available #ifdef XFLASH XFLASH_SPI_ENTER(); uint8_t count = 2; //count = 1+n (primary + secondary + all in xflash) e344: 12 e0 ldi r17, 0x02 ; 2 uint32_t addr = LANG_OFFSET; lang_table_header_t header; //table header structure while (1) { xflash_rd_data(addr, (uint8_t*)&header, sizeof(lang_table_header_t)); //read table header from xflash e346: 20 e1 ldi r18, 0x10 ; 16 e348: 30 e0 ldi r19, 0x00 ; 0 e34a: ae 01 movw r20, r28 e34c: 4f 5f subi r20, 0xFF ; 255 e34e: 5f 4f sbci r21, 0xFF ; 255 e350: c7 01 movw r24, r14 e352: b6 01 movw r22, r12 e354: 0e 94 a0 ed call 0x1db40 ; 0x1db40 if (header.magic != LANG_MAGIC) break; //break if magic not valid e358: 89 81 ldd r24, Y+1 ; 0x01 e35a: 9a 81 ldd r25, Y+2 ; 0x02 e35c: ab 81 ldd r26, Y+3 ; 0x03 e35e: bc 81 ldd r27, Y+4 ; 0x04 e360: 85 3a cpi r24, 0xA5 ; 165 e362: 9a 45 sbci r25, 0x5A ; 90 e364: a4 4b sbci r26, 0xB4 ; 180 e366: bb 44 sbci r27, 0x4B ; 75 e368: 41 f4 brne .+16 ; 0xe37a addr += header.size; //calc address of next table e36a: 8d 81 ldd r24, Y+5 ; 0x05 e36c: 9e 81 ldd r25, Y+6 ; 0x06 e36e: c8 0e add r12, r24 e370: d9 1e adc r13, r25 e372: e1 1c adc r14, r1 e374: f1 1c adc r15, r1 count++; //inc counter e376: 1f 5f subi r17, 0xFF ; 255 e378: e6 cf rjmp .-52 ; 0xe346 table += pgm_read_word((uint16_t*)(table + 4)); count++; } #endif //XFLASH return count; } e37a: 81 2f mov r24, r17 e37c: 60 96 adiw r28, 0x10 ; 16 e37e: 0f b6 in r0, 0x3f ; 63 e380: f8 94 cli e382: de bf out 0x3e, r29 ; 62 e384: 0f be out 0x3f, r0 ; 63 e386: cd bf out 0x3d, r28 ; 61 e388: df 91 pop r29 e38a: cf 91 pop r28 e38c: 1f 91 pop r17 e38e: ff 90 pop r15 e390: ef 90 pop r14 e392: df 90 pop r13 e394: cf 90 pop r12 e396: 08 95 ret 0000e398 : 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) { e398: 0f 93 push r16 e39a: 1f 93 push r17 e39c: cf 93 push r28 e39e: c8 2f mov r28, r24 if (lang == LANG_ID_PRI) //primary language e3a0: 81 11 cpse r24, r1 e3a2: 06 c0 rjmp .+12 ; 0xe3b0 { lang_table = 0; e3a4: 10 92 57 03 sts 0x0357, r1 ; 0x800357 e3a8: 10 92 56 03 sts 0x0356, r1 ; 0x800356 lang_selected = lang; e3ac: 10 92 58 03 sts 0x0358, r1 ; 0x800358 } #ifdef XFLASH if (lang_get_code(lang) == lang_get_code(LANG_ID_SEC)) lang = LANG_ID_SEC; e3b0: 8c 2f mov r24, r28 e3b2: 0e 94 32 71 call 0xe264 ; 0xe264 e3b6: 8c 01 movw r16, r24 e3b8: 0e 94 a2 70 call 0xe144 ; 0xe144 e3bc: 08 17 cp r16, r24 e3be: 19 07 cpc r17, r25 e3c0: 19 f0 breq .+6 ; 0xe3c8 if (lang == LANG_ID_SEC) //current secondary language e3c2: c1 30 cpi r28, 0x01 ; 1 e3c4: 09 f0 breq .+2 ; 0xe3c8 e3c6: 3e c0 rjmp .+124 ; 0xe444 { if (pgm_read_dword(((uint32_t*)_SEC_LANG_TABLE)) == LANG_MAGIC) //magic valid e3c8: e0 e0 ldi r30, 0x00 ; 0 e3ca: f1 e0 ldi r31, 0x01 ; 1 e3cc: 85 91 lpm r24, Z+ e3ce: 95 91 lpm r25, Z+ e3d0: a5 91 lpm r26, Z+ e3d2: b4 91 lpm r27, Z e3d4: 85 3a cpi r24, 0xA5 ; 165 e3d6: 9a 45 sbci r25, 0x5A ; 90 e3d8: a4 4b sbci r26, 0xB4 ; 180 e3da: bb 44 sbci r27, 0x4B ; 75 e3dc: 09 f0 breq .+2 ; 0xe3e0 e3de: 31 c0 rjmp .+98 ; 0xe442 } uint8_t lang_check(uint16_t addr) { uint16_t sum = 0; uint16_t size = pgm_read_word((uint16_t*)(addr + 4)); e3e0: e4 e0 ldi r30, 0x04 ; 4 e3e2: f1 e0 ldi r31, 0x01 ; 1 e3e4: 65 91 lpm r22, Z+ e3e6: 74 91 lpm r23, Z uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8)); e3e8: e8 e0 ldi r30, 0x08 ; 8 e3ea: f1 e0 ldi r31, 0x01 ; 1 e3ec: 45 91 lpm r20, Z+ e3ee: 54 91 lpm r21, Z uint16_t i; for (i = 0; i < size; i++) e3f0: 30 e0 ldi r19, 0x00 ; 0 e3f2: 20 e0 ldi r18, 0x00 ; 0 return 0; } uint8_t lang_check(uint16_t addr) { uint16_t sum = 0; e3f4: 90 e0 ldi r25, 0x00 ; 0 e3f6: 80 e0 ldi r24, 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++) e3f8: 62 17 cp r22, r18 e3fa: 73 07 cpc r23, r19 e3fc: 89 f5 brne .+98 ; 0xe460 sum += (uint16_t)pgm_read_byte((uint8_t*)(addr + i)) << ((i & 1)?0:8); sum -= lt_sum; //subtract checksum e3fe: 84 1b sub r24, r20 e400: 95 0b sbc r25, r21 sum = (sum >> 8) | ((sum & 0xff) << 8); //swap bytes e402: 98 27 eor r25, r24 e404: 89 27 eor r24, r25 e406: 98 27 eor r25, r24 if (lang_get_code(lang) == lang_get_code(LANG_ID_SEC)) lang = LANG_ID_SEC; if (lang == LANG_ID_SEC) //current secondary language { if (pgm_read_dword(((uint32_t*)_SEC_LANG_TABLE)) == LANG_MAGIC) //magic valid { if (lang_check(_SEC_LANG_TABLE)) e408: 48 17 cp r20, r24 e40a: 59 07 cpc r21, r25 e40c: d1 f4 brne .+52 ; 0xe442 if (pgm_read_dword(((uint32_t*)(_SEC_LANG_TABLE + 12))) == pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE)))) //signature valid e40e: ec e0 ldi r30, 0x0C ; 12 e410: f1 e0 ldi r31, 0x01 ; 1 e412: 45 91 lpm r20, Z+ e414: 55 91 lpm r21, Z+ e416: 65 91 lpm r22, Z+ e418: 74 91 lpm r23, Z e41a: ee e3 ldi r30, 0x3E ; 62 e41c: f9 e7 ldi r31, 0x79 ; 121 e41e: 85 91 lpm r24, Z+ e420: 95 91 lpm r25, Z+ e422: a5 91 lpm r26, Z+ e424: b4 91 lpm r27, Z e426: 48 17 cp r20, r24 e428: 59 07 cpc r21, r25 e42a: 6a 07 cpc r22, r26 e42c: 7b 07 cpc r23, r27 e42e: 49 f4 brne .+18 ; 0xe442 { lang_table = (lang_table_t*)(_SEC_LANG_TABLE); // set table pointer e430: 80 e0 ldi r24, 0x00 ; 0 e432: 91 e0 ldi r25, 0x01 ; 1 e434: 90 93 57 03 sts 0x0357, r25 ; 0x800357 e438: 80 93 56 03 sts 0x0356, r24 ; 0x800356 lang_selected = lang; // set language id e43c: 81 e0 ldi r24, 0x01 ; 1 e43e: 80 93 58 03 sts 0x0358, r24 ; 0x800358 if (lang == LANG_ID_SEC) //current secondary language { if (pgm_read_dword(((uint32_t*)_SEC_LANG_TABLE)) == LANG_MAGIC) //magic valid { if (lang_check(_SEC_LANG_TABLE)) if (pgm_read_dword(((uint32_t*)(_SEC_LANG_TABLE + 12))) == pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE)))) //signature valid e442: c1 e0 ldi r28, 0x01 ; 1 lang_selected = lang; // set language id } } } #endif //XFLASH if (lang_selected == lang) e444: 80 91 58 03 lds r24, 0x0358 ; 0x800358 e448: 8c 13 cpse r24, r28 e44a: 1c c0 rjmp .+56 ; 0xe484 { eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected); e44c: 6c 2f mov r22, r28 e44e: 8e ef ldi r24, 0xFE ; 254 e450: 9f e0 ldi r25, 0x0F ; 15 e452: 0f 94 34 dc call 0x3b868 ; 0x3b868 return 1; e456: 81 e0 ldi r24, 0x01 ; 1 } return 0; } e458: cf 91 pop r28 e45a: 1f 91 pop r17 e45c: 0f 91 pop r16 e45e: 08 95 ret { 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); e460: f9 01 movw r30, r18 e462: e0 50 subi r30, 0x00 ; 0 e464: ff 4f sbci r31, 0xFF ; 255 e466: e4 91 lpm r30, Z e468: f0 e0 ldi r31, 0x00 ; 0 e46a: a8 e0 ldi r26, 0x08 ; 8 e46c: 20 fd sbrc r18, 0 e46e: a0 e0 ldi r26, 0x00 ; 0 e470: 02 c0 rjmp .+4 ; 0xe476 e472: ee 0f add r30, r30 e474: ff 1f adc r31, r31 e476: aa 95 dec r26 e478: e2 f7 brpl .-8 ; 0xe472 e47a: 8e 0f add r24, r30 e47c: 9f 1f adc r25, 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++) e47e: 2f 5f subi r18, 0xFF ; 255 e480: 3f 4f sbci r19, 0xFF ; 255 e482: ba cf rjmp .-140 ; 0xe3f8 if (lang_selected == lang) { eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected); return 1; } return 0; e484: 80 e0 ldi r24, 0x00 ; 0 e486: e8 cf rjmp .-48 ; 0xe458 0000e488 : //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. e488: 20 91 58 03 lds r18, 0x0358 ; 0x800358 e48c: 21 11 cpse r18, r1 e48e: 04 c0 rjmp .+8 ; 0xe498 e490: fc 01 movw r30, r24 e492: 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 } e494: cf 01 movw r24, r30 e496: 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. e498: 40 91 56 03 lds r20, 0x0356 ; 0x800356 e49c: 50 91 57 03 lds r21, 0x0357 ; 0x800357 e4a0: 41 15 cp r20, r1 e4a2: 51 05 cpc r21, r1 e4a4: a9 f3 breq .-22 ; 0xe490 uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id e4a6: fc 01 movw r30, r24 e4a8: 25 91 lpm r18, Z+ e4aa: 34 91 lpm r19, Z if (ui == 0xffff) return s + 2; //id not assigned, return orig. str. e4ac: 2f 3f cpi r18, 0xFF ; 255 e4ae: 32 07 cpc r19, r18 e4b0: 79 f3 breq .-34 ; 0xe490 ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset e4b2: f9 01 movw r30, r18 e4b4: 38 96 adiw r30, 0x08 ; 8 e4b6: ee 0f add r30, r30 e4b8: ff 1f adc r31, r31 e4ba: e4 0f add r30, r20 e4bc: f5 1f adc r31, r21 e4be: 25 91 lpm r18, Z+ e4c0: 34 91 lpm r19, Z if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character e4c2: fa 01 movw r30, r20 e4c4: e2 0f add r30, r18 e4c6: f3 1f adc r31, r19 e4c8: 24 91 lpm r18, Z e4ca: 22 23 and r18, r18 e4cc: 09 f3 breq .-62 ; 0xe490 e4ce: e2 cf rjmp .-60 ; 0xe494 0000e4d0 : } sound_wait_for_user_reset(); } void M600_load_filament_movements(const char* filament_name) { e4d0: cf 93 push r28 e4d2: df 93 push r29 e4d4: ec 01 movw r28, r24 current_position[E_AXIS]+= FILAMENTCHANGE_FIRSTFEED; e4d6: 20 e0 ldi r18, 0x00 ; 0 e4d8: 30 e0 ldi r19, 0x00 ; 0 e4da: 4c e8 ldi r20, 0x8C ; 140 e4dc: 52 e4 ldi r21, 0x42 ; 66 e4de: 60 91 9d 06 lds r22, 0x069D ; 0x80069d e4e2: 70 91 9e 06 lds r23, 0x069E ; 0x80069e e4e6: 80 91 9f 06 lds r24, 0x069F ; 0x80069f e4ea: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 e4ee: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> e4f2: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d e4f6: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e e4fa: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f e4fe: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); e502: 60 e0 ldi r22, 0x00 ; 0 e504: 70 e0 ldi r23, 0x00 ; 0 e506: 80 ea ldi r24, 0xA0 ; 160 e508: 91 e4 ldi r25, 0x41 ; 65 e50a: 0f 94 3d c0 call 0x3807a ; 0x3807a load_filament_final_feed(); e50e: 0e 94 2b 64 call 0xc856 ; 0xc856 } void lcd_loading_filament(const char* filament_name) { lcd_clear(); e512: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_LOADING_FILAMENT)); e516: 8f ea ldi r24, 0xAF ; 175 e518: 9b e5 ldi r25, 0x5B ; 91 e51a: 0e 94 44 72 call 0xe488 ; 0xe488 e51e: ac 01 movw r20, r24 e520: 60 e0 ldi r22, 0x00 ; 0 e522: 80 e0 ldi r24, 0x00 ; 0 e524: 0e 94 8c 6e call 0xdd18 ; 0xdd18 if (filament_name[0]) { e528: 88 81 ld r24, Y e52a: 88 23 and r24, r24 e52c: 39 f0 breq .+14 ; 0xe53c lcd_set_cursor(0, 1); e52e: 61 e0 ldi r22, 0x01 ; 1 e530: 80 e0 ldi r24, 0x00 ; 0 e532: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print(filament_name); e536: ce 01 movw r24, r28 e538: 0e 94 7f 70 call 0xe0fe ; 0xe0fe } lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); e53c: 89 e9 ldi r24, 0x99 ; 153 e53e: 99 e3 ldi r25, 0x39 ; 57 e540: 0e 94 44 72 call 0xe488 ; 0xe488 e544: ac 01 movw r20, r24 e546: 62 e0 ldi r22, 0x02 ; 2 e548: 80 e0 ldi r24, 0x00 ; 0 e54a: 0e 94 8c 6e call 0xdd18 ; 0xdd18 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 e54e: 83 e4 ldi r24, 0x43 ; 67 e550: 9b e2 ldi r25, 0x2B ; 43 e552: 0f 94 4b 21 call 0x24296 ; 0x24296 lcd_loading_filament(filament_name); st_synchronize(); } e556: df 91 pop r29 e558: 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(); e55a: 0d 94 a9 43 jmp 0x28752 ; 0x28752 0000e55e : * 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; e55e: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 e562: 8f 3f cpi r24, 0xFF ; 255 e564: 11 f1 breq .+68 ; 0xe5aa lcd_update_enable(false); e566: 80 e0 ldi r24, 0x00 ; 0 e568: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); e56c: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 1, _T(MSG_UNLOADING_FILAMENT)); e570: 86 e7 ldi r24, 0x76 ; 118 e572: 92 e5 ldi r25, 0x52 ; 82 e574: 0e 94 44 72 call 0xe488 ; 0xe488 e578: ac 01 movw r20, r24 e57a: 61 e0 ldi r22, 0x01 ; 1 e57c: 80 e0 ldi r24, 0x00 ; 0 e57e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); e582: 80 e2 ldi r24, 0x20 ; 32 e584: 0e 94 27 6f call 0xde4e ; 0xde4e lcd_print(' '); lcd_print(MMU2::mmu2.get_current_tool() + 1); e588: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 e58c: 68 2f mov r22, r24 e58e: 70 e0 ldi r23, 0x00 ; 0 e590: 6f 5f subi r22, 0xFF ; 255 e592: 7f 4f sbci r23, 0xFF ; 255 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); e594: 07 2e mov r0, r23 e596: 00 0c add r0, r0 e598: 88 0b sbc r24, r24 e59a: 99 0b sbc r25, r25 e59c: 0e 94 31 70 call 0xe062 ; 0xe062 // unload just current filament for multimaterial printers (used also in M702) MMU2::mmu2.unload(); e5a0: 0f 94 31 ad call 0x35a62 ; 0x35a62 lcd_update_enable(true); e5a4: 81 e0 ldi r24, 0x01 ; 1 e5a6: 0c 94 bd 6e jmp 0xdd7a ; 0xdd7a } e5aa: 08 95 ret 0000e5ac : } #ifdef TMC2130 bool calibrate_z_auto() { e5ac: 4f 92 push r4 e5ae: 5f 92 push r5 e5b0: 6f 92 push r6 e5b2: 7f 92 push r7 e5b4: 8f 92 push r8 e5b6: 9f 92 push r9 e5b8: af 92 push r10 e5ba: bf 92 push r11 e5bc: ef 92 push r14 e5be: ff 92 push r15 e5c0: 0f 93 push r16 e5c2: 1f 93 push r17 e5c4: cf 93 push r28 e5c6: df 93 push r29 //lcd_display_message_fullscreen_P(_T(MSG_CALIBRATE_Z_AUTO)); lcd_clear(); e5c8: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 1, _T(MSG_CALIBRATE_Z_AUTO)); e5cc: 8c e6 ldi r24, 0x6C ; 108 e5ce: 9d e4 ldi r25, 0x4D ; 77 e5d0: 0e 94 44 72 call 0xe488 ; 0xe488 e5d4: ac 01 movw r20, r24 e5d6: 61 e0 ldi r22, 0x01 ; 1 e5d8: 80 e0 ldi r24, 0x00 ; 0 e5da: 0e 94 8c 6e call 0xdd18 ; 0xdd18 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; e5de: d0 91 b7 02 lds r29, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> check_endstops = check; e5e2: 81 e0 ldi r24, 0x01 ; 1 e5e4: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #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); e5e8: ec ec ldi r30, 0xCC ; 204 e5ea: fb e7 ldi r31, 0x7B ; 123 e5ec: c4 91 lpm r28, Z //lcd_display_message_fullscreen_P(_T(MSG_CALIBRATE_Z_AUTO)); lcd_clear(); lcd_puts_at_P(0, 1, _T(MSG_CALIBRATE_Z_AUTO)); bool endstops_enabled = enable_endstops(true); int axis_up_dir = -home_dir(Z_AXIS); tmc2130_home_enter(Z_AXIS_MASK); e5ee: 84 e0 ldi r24, 0x04 ; 4 e5f0: 0f 94 b4 26 call 0x24d68 ; 0x24d68 current_position[Z_AXIS] = 0; e5f4: 81 e9 ldi r24, 0x91 ; 145 e5f6: e8 2e mov r14, r24 e5f8: 86 e0 ldi r24, 0x06 ; 6 e5fa: f8 2e mov r15, r24 e5fc: f7 01 movw r30, r14 e5fe: 10 86 std Z+8, r1 ; 0x08 e600: 11 86 std Z+9, r1 ; 0x09 e602: 12 86 std Z+10, r1 ; 0x0a e604: 13 86 std Z+11, r1 ; 0x0b plan_set_position_curposXYZE(); e606: 0f 94 fd be call 0x37dfa ; 0x37dfa set_destination_to_current(); e60a: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 #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); e60e: e6 ec ldi r30, 0xC6 ; 198 e610: fb e7 ldi r31, 0x7B ; 123 e612: 85 90 lpm r8, Z+ e614: 95 90 lpm r9, Z+ e616: a5 90 lpm r10, Z+ e618: b4 90 lpm r11, Z int axis_up_dir = -home_dir(Z_AXIS); tmc2130_home_enter(Z_AXIS_MASK); current_position[Z_AXIS] = 0; plan_set_position_curposXYZE(); set_destination_to_current(); destination[Z_AXIS] += (1.1 * max_length(Z_AXIS) * axis_up_dir); e61a: 03 e7 ldi r16, 0x73 ; 115 e61c: 16 e0 ldi r17, 0x06 ; 6 { //lcd_display_message_fullscreen_P(_T(MSG_CALIBRATE_Z_AUTO)); lcd_clear(); lcd_puts_at_P(0, 1, _T(MSG_CALIBRATE_Z_AUTO)); bool endstops_enabled = enable_endstops(true); int axis_up_dir = -home_dir(Z_AXIS); e61e: 8c 2f mov r24, r28 e620: 99 27 eor r25, r25 e622: 81 95 neg r24 e624: 0c f4 brge .+2 ; 0xe628 e626: 90 95 com r25 e628: bc 01 movw r22, r24 tmc2130_home_enter(Z_AXIS_MASK); current_position[Z_AXIS] = 0; plan_set_position_curposXYZE(); set_destination_to_current(); destination[Z_AXIS] += (1.1 * max_length(Z_AXIS) * axis_up_dir); e62a: 07 2e mov r0, r23 e62c: 00 0c add r0, r0 e62e: 88 0b sbc r24, r24 e630: 99 0b sbc r25, r25 e632: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> e636: 2b 01 movw r4, r22 e638: 3c 01 movw r6, r24 e63a: 2d ec ldi r18, 0xCD ; 205 e63c: 3c ec ldi r19, 0xCC ; 204 e63e: 4c e8 ldi r20, 0x8C ; 140 e640: 5f e3 ldi r21, 0x3F ; 63 e642: c5 01 movw r24, r10 e644: b4 01 movw r22, r8 e646: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> e64a: 9b 01 movw r18, r22 e64c: ac 01 movw r20, r24 e64e: c3 01 movw r24, r6 e650: b2 01 movw r22, r4 e652: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> e656: f8 01 movw r30, r16 e658: 20 85 ldd r18, Z+8 ; 0x08 e65a: 31 85 ldd r19, Z+9 ; 0x09 e65c: 42 85 ldd r20, Z+10 ; 0x0a e65e: 53 85 ldd r21, Z+11 ; 0x0b e660: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> e664: f8 01 movw r30, r16 e666: 60 87 std Z+8, r22 ; 0x08 e668: 71 87 std Z+9, r23 ; 0x09 e66a: 82 87 std Z+10, r24 ; 0x0a e66c: 93 87 std Z+11, r25 ; 0x0b feedrate = homing_feedrate[Z_AXIS]; e66e: 80 e0 ldi r24, 0x00 ; 0 e670: 90 e0 ldi r25, 0x00 ; 0 e672: a8 e4 ldi r26, 0x48 ; 72 e674: b4 e4 ldi r27, 0x44 ; 68 e676: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 e67a: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 e67e: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba e682: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb plan_buffer_line_destinationXYZE(feedrate / 60); e686: 65 e5 ldi r22, 0x55 ; 85 e688: 75 e5 ldi r23, 0x55 ; 85 e68a: 85 e5 ldi r24, 0x55 ; 85 e68c: 91 e4 ldi r25, 0x41 ; 65 e68e: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); e692: 0f 94 a9 43 call 0x28752 ; 0x28752 // current_position[axis] = 0; // plan_set_position_curposXYZE(); tmc2130_home_exit(); e696: 0f 94 85 26 call 0x24d0a ; 0x24d0a e69a: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); current_position[Z_AXIS] = 0; e69e: f7 01 movw r30, r14 e6a0: 10 86 std Z+8, r1 ; 0x08 e6a2: 11 86 std Z+9, r1 ; 0x09 e6a4: 12 86 std Z+10, r1 ; 0x0a e6a6: 13 86 std Z+11, r1 ; 0x0b plan_set_position_curposXYZE(); e6a8: 0f 94 fd be call 0x37dfa ; 0x37dfa set_destination_to_current(); e6ac: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 destination[Z_AXIS] += 10 * axis_up_dir; //10mm up e6b0: f6 ef ldi r31, 0xF6 ; 246 e6b2: cf 02 muls r28, r31 e6b4: b0 01 movw r22, r0 e6b6: 11 24 eor r1, r1 e6b8: 07 2e mov r0, r23 e6ba: 00 0c add r0, r0 e6bc: 88 0b sbc r24, r24 e6be: 99 0b sbc r25, r25 e6c0: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> e6c4: 9b 01 movw r18, r22 e6c6: ac 01 movw r20, r24 e6c8: f8 01 movw r30, r16 e6ca: 60 85 ldd r22, Z+8 ; 0x08 e6cc: 71 85 ldd r23, Z+9 ; 0x09 e6ce: 82 85 ldd r24, Z+10 ; 0x0a e6d0: 93 85 ldd r25, Z+11 ; 0x0b e6d2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> e6d6: f8 01 movw r30, r16 e6d8: 60 87 std Z+8, r22 ; 0x08 e6da: 71 87 std Z+9, r23 ; 0x09 e6dc: 82 87 std Z+10, r24 ; 0x0a e6de: 93 87 std Z+11, r25 ; 0x0b feedrate = homing_feedrate[Z_AXIS] / 2; e6e0: 80 e0 ldi r24, 0x00 ; 0 e6e2: 90 e0 ldi r25, 0x00 ; 0 e6e4: a8 ec ldi r26, 0xC8 ; 200 e6e6: b3 e4 ldi r27, 0x43 ; 67 e6e8: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 e6ec: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 e6f0: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba e6f4: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb plan_buffer_line_destinationXYZE(feedrate / 60); e6f8: 65 e5 ldi r22, 0x55 ; 85 e6fa: 75 e5 ldi r23, 0x55 ; 85 e6fc: 85 ed ldi r24, 0xD5 ; 213 e6fe: 90 e4 ldi r25, 0x40 ; 64 e700: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); e704: 0f 94 a9 43 call 0x28752 ; 0x28752 e708: d0 93 b7 02 sts 0x02B7, r29 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(endstops_enabled); current_position[Z_AXIS] = Z_MAX_POS + Z_MAX_POS_XYZ_CALIBRATION_CORRECTION; e70c: 80 e0 ldi r24, 0x00 ; 0 e70e: 90 e0 ldi r25, 0x00 ; 0 e710: a4 e5 ldi r26, 0x54 ; 84 e712: b3 e4 ldi r27, 0x43 ; 67 e714: f7 01 movw r30, r14 e716: 80 87 std Z+8, r24 ; 0x08 e718: 91 87 std Z+9, r25 ; 0x09 e71a: a2 87 std Z+10, r26 ; 0x0a e71c: b3 87 std Z+11, r27 ; 0x0b plan_set_position_curposXYZE(); e71e: 0f 94 fd be call 0x37dfa ; 0x37dfa return true; } e722: 81 e0 ldi r24, 0x01 ; 1 e724: df 91 pop r29 e726: cf 91 pop r28 e728: 1f 91 pop r17 e72a: 0f 91 pop r16 e72c: ff 90 pop r15 e72e: ef 90 pop r14 e730: bf 90 pop r11 e732: af 90 pop r10 e734: 9f 90 pop r9 e736: 8f 90 pop r8 e738: 7f 90 pop r7 e73a: 6f 90 pop r6 e73c: 5f 90 pop r5 e73e: 4f 90 pop r4 e740: 08 95 ret 0000e742 : restore_print_from_ram_and_continue(default_retraction); //XYZ = orig, E +1mm unretract //babystep_apply(); } void crashdet_fmt_error(char* buf, uint8_t mask) { e742: cf 93 push r28 e744: df 93 push r29 e746: ec 01 movw r28, r24 if(mask & X_AXIS_MASK) *buf++ = axis_codes[X_AXIS]; e748: 60 ff sbrs r22, 0 e74a: 03 c0 rjmp .+6 ; 0xe752 e74c: 28 e5 ldi r18, 0x58 ; 88 e74e: 28 83 st Y, r18 e750: 21 96 adiw r28, 0x01 ; 1 if(mask & Y_AXIS_MASK) *buf++ = axis_codes[Y_AXIS]; e752: 61 ff sbrs r22, 1 e754: 03 c0 rjmp .+6 ; 0xe75c e756: 29 e5 ldi r18, 0x59 ; 89 e758: 28 83 st Y, r18 e75a: 21 96 adiw r28, 0x01 ; 1 *buf++ = ' '; e75c: 80 e2 ldi r24, 0x20 ; 32 e75e: 89 93 st Y+, r24 strcpy_P(buf, _T(MSG_CRASH_DETECTED)); e760: 80 e0 ldi r24, 0x00 ; 0 e762: 96 e3 ldi r25, 0x36 ; 54 e764: 0e 94 44 72 call 0xe488 ; 0xe488 e768: bc 01 movw r22, r24 e76a: ce 01 movw r24, r28 } e76c: df 91 pop r29 e76e: cf 91 pop r28 void crashdet_fmt_error(char* buf, uint8_t mask) { if(mask & X_AXIS_MASK) *buf++ = axis_codes[X_AXIS]; if(mask & Y_AXIS_MASK) *buf++ = axis_codes[Y_AXIS]; *buf++ = ' '; strcpy_P(buf, _T(MSG_CRASH_DETECTED)); e770: 0d 94 c7 d9 jmp 0x3b38e ; 0x3b38e 0000e774 <__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 { e774: 1f 92 push r1 e776: 0f 92 push r0 e778: 0f b6 in r0, 0x3f ; 63 e77a: 0f 92 push r0 e77c: 11 24 eor r1, r1 e77e: 0b b6 in r0, 0x3b ; 59 e780: 0f 92 push r0 e782: 2f 93 push r18 e784: 8f 93 push r24 e786: 9f 93 push r25 e788: ef 93 push r30 e78a: ff 93 push r31 switch(state){ e78c: e0 91 51 03 lds r30, 0x0351 ; 0x800351 e790: e8 30 cpi r30, 0x08 ; 8 e792: e8 f4 brcc .+58 ; 0xe7ce <__vector_23+0x5a> e794: f0 e0 ldi r31, 0x00 ; 0 e796: 88 27 eor r24, r24 e798: ef 52 subi r30, 0x2F ; 47 e79a: fc 48 sbci r31, 0x8C ; 140 e79c: 8f 4f sbci r24, 0xFF ; 255 e79e: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> e7a2: d9 73 andi r29, 0x39 ; 57 e7a4: f3 73 andi r31, 0x33 ; 51 e7a6: fe 73 andi r31, 0x3E ; 62 e7a8: 0c 74 andi r16, 0x4C ; 76 e7aa: 22 74 andi r18, 0x42 ; 66 e7ac: 2b 74 andi r18, 0x4B ; 75 e7ae: 4e 74 andi r20, 0x4E ; 78 e7b0: 60 74 andi r22, 0x40 ; 64 case States::ZERO_START: if (bedPWMDisabled) return; // stay in the OFF state and do not change the output pin e7b2: 80 91 8c 06 lds r24, 0x068C ; 0x80068c e7b6: 81 11 cpse r24, r1 e7b8: 0a c0 rjmp .+20 ; 0xe7ce <__vector_23+0x5a> pwm = soft_pwm_bed << 1;// expecting soft_pwm_bed to be 7bit! e7ba: 80 91 1c 06 lds r24, 0x061C ; 0x80061c e7be: 88 0f add r24, r24 e7c0: 80 93 50 03 sts 0x0350, r24 ; 0x800350 if( pwm != 0 ){ e7c4: 88 23 and r24, r24 e7c6: 19 f0 breq .+6 ; 0xe7ce <__vector_23+0x5a> state = States::ZERO; // do nothing, let it tick once again after the 30Hz period e7c8: 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 e7ca: 80 93 51 03 sts 0x0351, r24 ; 0x800351 TCNT0 = 128; OCR0B = 255; TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz break; } } e7ce: ff 91 pop r31 e7d0: ef 91 pop r30 e7d2: 9f 91 pop r25 e7d4: 8f 91 pop r24 e7d6: 2f 91 pop r18 e7d8: 0f 90 pop r0 e7da: 0b be out 0x3b, r0 ; 59 e7dc: 0f 90 pop r0 e7de: 0f be out 0x3f, r0 ; 63 e7e0: 0f 90 pop r0 e7e2: 1f 90 pop r1 e7e4: 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) e7e6: 80 91 4f 03 lds r24, 0x034F ; 0x80034f e7ea: 8f 5f subi r24, 0xFF ; 255 e7ec: 80 93 4f 03 sts 0x034F, r24 ; 0x80034f if( slowCounter > pwm ){ e7f0: 90 91 50 03 lds r25, 0x0350 ; 0x800350 e7f4: 98 17 cp r25, r24 e7f6: 58 f3 brcs .-42 ; 0xe7ce <__vector_23+0x5a> return; } // otherwise moving towards RISE state = States::ZERO_TO_RISE; // and finalize the change in a transitional state RISE0 e7f8: 82 e0 ldi r24, 0x02 ; 2 e7fa: e7 cf rjmp .-50 ; 0xe7ca <__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 e7fc: 83 e0 ldi r24, 0x03 ; 3 e7fe: 80 93 51 03 sts 0x0351, r24 ; 0x800351 fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE e802: 8f e0 ldi r24, 0x0F ; 15 e804: 80 93 4e 03 sts 0x034E, r24 ; 0x80034e TCNT0 = 255; // force overflow on the next clock cycle e808: 8f ef ldi r24, 0xFF ; 255 e80a: 86 bd out 0x26, r24 ; 38 TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz e80c: 81 e0 ldi r24, 0x01 ; 1 e80e: 85 bd out 0x25, r24 ; 37 TCCR0A &= ~(1 << COM0B0); // Clear OC0B on Compare Match, set OC0B at BOTTOM (non-inverting mode) e810: 84 b5 in r24, 0x24 ; 36 e812: 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 e814: 84 bd out 0x24, r24 ; 36 e816: db cf rjmp .-74 ; 0xe7ce <__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; e818: 80 91 4e 03 lds r24, 0x034E ; 0x80034e e81c: 82 95 swap r24 e81e: 80 7f andi r24, 0xF0 ; 240 e820: 81 95 neg r24 e822: 88 bd out 0x28, r24 ; 40 if( fastCounter ){ e824: 80 91 4e 03 lds r24, 0x034E ; 0x80034e e828: 88 23 and r24, r24 e82a: 21 f0 breq .+8 ; 0xe834 <__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; e82c: 81 50 subi r24, 0x01 ; 1 e82e: 80 93 4e 03 sts 0x034E, r24 ; 0x80034e e832: cd cf rjmp .-102 ; 0xe7ce <__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; e834: 84 e0 ldi r24, 0x04 ; 4 e836: 80 93 51 03 sts 0x0351, r24 ; 0x800351 OCR0B = 255; // full duty e83a: 8f ef ldi r24, 0xFF ; 255 e83c: 88 bd out 0x28, r24 ; 40 TCNT0 = 254; // make the timer overflow in the next cycle e83e: 8e ef ldi r24, 0xFE ; 254 e840: 86 bd out 0x26, r24 ; 38 e842: c5 cf rjmp .-118 ; 0xe7ce <__vector_23+0x5a> // @@TODO these constants are still subject to investigation } break; case States::RISE_TO_ONE: state = States::ONE; e844: 85 e0 ldi r24, 0x05 ; 5 e846: 80 93 51 03 sts 0x0351, r24 ; 0x800351 OCR0B = 255; // full duty e84a: 8f ef ldi r24, 0xFF ; 255 e84c: 88 bd out 0x28, r24 ; 40 TCNT0 = 255; // make the timer overflow in the next cycle e84e: 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 e850: 82 e0 ldi r24, 0x02 ; 2 e852: 85 bd out 0x25, r24 ; 37 e854: bc cf rjmp .-136 ; 0xe7ce <__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; e856: 2f ef ldi r18, 0xFF ; 255 e858: 28 bd out 0x28, r18 ; 40 if (bedPWMDisabled) return; // stay in the ON state and do not change the output pin e85a: 80 91 8c 06 lds r24, 0x068C ; 0x80068c e85e: 81 11 cpse r24, r1 e860: b6 cf rjmp .-148 ; 0xe7ce <__vector_23+0x5a> slowCounter += slowInc; // this does software timer_clk/256 or less e862: 80 91 4f 03 lds r24, 0x034F ; 0x80034f e866: 8f 5f subi r24, 0xFF ; 255 e868: 80 93 4f 03 sts 0x034F, r24 ; 0x80034f if( slowCounter < pwm ){ e86c: 90 91 50 03 lds r25, 0x0350 ; 0x800350 e870: 89 17 cp r24, r25 e872: 08 f4 brcc .+2 ; 0xe876 <__vector_23+0x102> e874: ac cf rjmp .-168 ; 0xe7ce <__vector_23+0x5a> return; } if( (soft_pwm_bed << 1) >= (255 - slowInc - 1) ){ //@@TODO simplify & explain e876: 80 91 1c 06 lds r24, 0x061C ; 0x80061c e87a: 90 e0 ldi r25, 0x00 ; 0 e87c: 8f 37 cpi r24, 0x7F ; 127 e87e: 91 05 cpc r25, r1 e880: 0c f0 brlt .+2 ; 0xe884 <__vector_23+0x110> e882: a5 cf rjmp .-182 ; 0xe7ce <__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; e884: 86 e0 ldi r24, 0x06 ; 6 e886: 80 93 51 03 sts 0x0351, r24 ; 0x800351 fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE e88a: 8f e0 ldi r24, 0x0F ; 15 e88c: 80 93 4e 03 sts 0x034E, r24 ; 0x80034e TCNT0 = 255; // force overflow on the next clock cycle e890: 26 bd out 0x26, r18 ; 38 TCCR0B = (1 << CS00); // change prescaler to 1, i.e. 62.5kHz e892: 81 e0 ldi r24, 0x01 ; 1 e894: 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 e896: 84 b5 in r24, 0x24 ; 36 e898: 80 61 ori r24, 0x10 ; 16 e89a: bc cf rjmp .-136 ; 0xe814 <__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 e89c: 80 91 4e 03 lds r24, 0x034E ; 0x80034e e8a0: 82 95 swap r24 e8a2: 80 7f andi r24, 0xF0 ; 240 e8a4: 81 95 neg r24 e8a6: 88 bd out 0x28, r24 ; 40 //TCCR0A |= (1 << COM0B0); // already set in ONE_TO_FALL if( fastCounter ){ e8a8: 80 91 4e 03 lds r24, 0x034E ; 0x80034e e8ac: 81 11 cpse r24, r1 e8ae: be cf rjmp .-132 ; 0xe82c <__vector_23+0xb8> --fastCounter; } else { // end of FALL cycles, changing into state ZERO state = States::FALL_TO_ZERO; e8b0: 87 e0 ldi r24, 0x07 ; 7 e8b2: 80 93 51 03 sts 0x0351, r24 ; 0x800351 TCNT0 = 128; //@@TODO again - need to wait long enough to propagate the timer state changes e8b6: 80 e8 ldi r24, 0x80 ; 128 e8b8: 86 bd out 0x26, r24 ; 38 OCR0B = 255; e8ba: 8f ef ldi r24, 0xFF ; 255 e8bc: 88 bd out 0x28, r24 ; 40 e8be: 87 cf rjmp .-242 ; 0xe7ce <__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 e8c0: 10 92 51 03 sts 0x0351, r1 ; 0x800351 TCNT0 = 128; e8c4: 80 e8 ldi r24, 0x80 ; 128 e8c6: 86 bd out 0x26, r24 ; 38 OCR0B = 255; e8c8: 8f ef ldi r24, 0xFF ; 255 e8ca: 88 bd out 0x28, r24 ; 40 e8cc: c1 cf rjmp .-126 ; 0xe850 <__vector_23+0xdc> 0000e8ce : #else // FILAMENT_SENSOR FSensorBlockRunout::FSensorBlockRunout() { } FSensorBlockRunout::~FSensorBlockRunout() { } #endif // FILAMENT_SENSOR void Filament_sensor::setEnabled(bool enabled) { e8ce: cf 93 push r28 e8d0: c8 2f mov r28, r24 e8d2: 68 2f mov r22, r24 e8d4: 87 e6 ldi r24, 0x67 ; 103 e8d6: 9f e0 ldi r25, 0x0F ; 15 e8d8: 0f 94 34 dc call 0x3b868 ; 0x3b868 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled); if (enabled) { e8dc: cc 23 and r28, r28 e8de: 19 f0 breq .+6 ; 0xe8e6 fsensor.init(); } else { fsensor.deinit(); } } e8e0: 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(); e8e2: 0d 94 30 7c jmp 0x2f860 ; 0x2f860 } void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; e8e6: 10 92 a9 17 sts 0x17A9, r1 ; 0x8017a9 filter = 0; e8ea: 10 92 b5 17 sts 0x17B5, r1 ; 0x8017b5 if (enabled) { fsensor.init(); } else { fsensor.deinit(); } } e8ee: cf 91 pop r28 e8f0: 08 95 ret 0000e8f2 : #endif #endif //DEBUG_DISABLE_FANCHECK } void resetFanCheck() { fan_measuring = false; e8f2: 10 92 6e 06 sts 0x066E, r1 ; 0x80066e extruder_autofan_last_check = _millis(); e8f6: 0f 94 28 2a call 0x25450 ; 0x25450 e8fa: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf e8fe: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 e902: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 e906: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 } e90a: 08 95 ret 0000e90c <__vector_8>: EIMSK |= (1 << 7); } // The fan interrupt is triggered at maximum 325Hz (may be a bit more due to component tollerances), // and it takes 4.24 us to process (the interrupt invocation overhead not taken into account). ISR(INT7_vect) { e90c: 1f 92 push r1 e90e: 0f 92 push r0 e910: 0f b6 in r0, 0x3f ; 63 e912: 0f 92 push r0 e914: 11 24 eor r1, r1 e916: 2f 93 push r18 e918: 4f 93 push r20 e91a: 5f 93 push r21 e91c: 6f 93 push r22 e91e: 7f 93 push r23 e920: 8f 93 push r24 e922: 9f 93 push r25 e924: af 93 push r26 e926: bf 93 push r27 //measuring speed now works for fanSpeed > 18 (approximately), which is sufficient because MIN_PRINT_FAN_SPEED is higher #ifdef FAN_SOFT_PWM if (!fan_measuring || (fanSpeedSoftPwm < MIN_PRINT_FAN_SPEED)) return; e928: 80 91 6e 06 lds r24, 0x066E ; 0x80066e e92c: 88 23 and r24, r24 e92e: f1 f0 breq .+60 ; 0xe96c <__vector_8+0x60> e930: 80 91 a5 04 lds r24, 0x04A5 ; 0x8004a5 e934: 8b 34 cpi r24, 0x4B ; 75 e936: d0 f0 brcs .+52 ; 0xe96c <__vector_8+0x60> #else //FAN_SOFT_PWM if (fanSpeed < MIN_PRINT_FAN_SPEED) return; #endif //FAN_SOFT_PWM if ((1 << 6) & EICRB) { //interrupt was triggered by rising edge e938: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> e93c: 86 ff sbrs r24, 6 e93e: 24 c0 rjmp .+72 ; 0xe988 <__vector_8+0x7c> // An unsynchronized equivalent to a standard Arduino _millis() function. // To be used inside an interrupt routine. FORCE_INLINE unsigned long millis_nc() { #ifdef SYSTEM_TIMER_2 return timer2_millis; e940: 80 91 3a 06 lds r24, 0x063A ; 0x80063a e944: 90 91 3b 06 lds r25, 0x063B ; 0x80063b e948: a0 91 3c 06 lds r26, 0x063C ; 0x80063c e94c: b0 91 3d 06 lds r27, 0x063D ; 0x80063d t_fan_rising_edge = millis_nc(); e950: 80 93 47 03 sts 0x0347, r24 ; 0x800347 e954: 90 93 48 03 sts 0x0348, r25 ; 0x800348 e958: a0 93 49 03 sts 0x0349, r26 ; 0x800349 e95c: b0 93 4a 03 sts 0x034A, r27 ; 0x80034a else { //interrupt was triggered by falling edge if ((millis_nc() - t_fan_rising_edge) >= FAN_PULSE_WIDTH_LIMIT) {//this pulse was from sensor and not from pwm fan_edge_counter[1] += 2; //we are currently counting all edges so lets count two edges for one pulse } } EICRB ^= (1 << 6); //change edge e960: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> e964: 90 e4 ldi r25, 0x40 ; 64 e966: 89 27 eor r24, r25 e968: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> } e96c: bf 91 pop r27 e96e: af 91 pop r26 e970: 9f 91 pop r25 e972: 8f 91 pop r24 e974: 7f 91 pop r23 e976: 6f 91 pop r22 e978: 5f 91 pop r21 e97a: 4f 91 pop r20 e97c: 2f 91 pop r18 e97e: 0f 90 pop r0 e980: 0f be out 0x3f, r0 ; 63 e982: 0f 90 pop r0 e984: 1f 90 pop r1 e986: 18 95 reti e988: 80 91 3a 06 lds r24, 0x063A ; 0x80063a e98c: 90 91 3b 06 lds r25, 0x063B ; 0x80063b e990: a0 91 3c 06 lds r26, 0x063C ; 0x80063c e994: b0 91 3d 06 lds r27, 0x063D ; 0x80063d if ((1 << 6) & EICRB) { //interrupt was triggered by rising edge t_fan_rising_edge = millis_nc(); } else { //interrupt was triggered by falling edge if ((millis_nc() - t_fan_rising_edge) >= FAN_PULSE_WIDTH_LIMIT) {//this pulse was from sensor and not from pwm e998: 40 91 47 03 lds r20, 0x0347 ; 0x800347 e99c: 50 91 48 03 lds r21, 0x0348 ; 0x800348 e9a0: 60 91 49 03 lds r22, 0x0349 ; 0x800349 e9a4: 70 91 4a 03 lds r23, 0x034A ; 0x80034a e9a8: 84 1b sub r24, r20 e9aa: 95 0b sbc r25, r21 e9ac: a6 0b sbc r26, r22 e9ae: b7 0b sbc r27, r23 e9b0: 20 91 e5 03 lds r18, 0x03E5 ; 0x8003e5 e9b4: 44 e0 ldi r20, 0x04 ; 4 e9b6: 50 e0 ldi r21, 0x00 ; 0 e9b8: 60 e0 ldi r22, 0x00 ; 0 e9ba: 70 e0 ldi r23, 0x00 ; 0 e9bc: 25 36 cpi r18, 0x65 ; 101 e9be: 20 f0 brcs .+8 ; 0xe9c8 <__vector_8+0xbc> e9c0: 43 e0 ldi r20, 0x03 ; 3 e9c2: 50 e0 ldi r21, 0x00 ; 0 e9c4: 60 e0 ldi r22, 0x00 ; 0 e9c6: 70 e0 ldi r23, 0x00 ; 0 e9c8: 84 17 cp r24, r20 e9ca: 95 07 cpc r25, r21 e9cc: a6 07 cpc r26, r22 e9ce: b7 07 cpc r27, r23 e9d0: 38 f2 brcs .-114 ; 0xe960 <__vector_8+0x54> fan_edge_counter[1] += 2; //we are currently counting all edges so lets count two edges for one pulse e9d2: 80 91 e3 05 lds r24, 0x05E3 ; 0x8005e3 e9d6: 90 91 e4 05 lds r25, 0x05E4 ; 0x8005e4 e9da: 02 96 adiw r24, 0x02 ; 2 e9dc: 90 93 e4 05 sts 0x05E4, r25 ; 0x8005e4 e9e0: 80 93 e3 05 sts 0x05E3, r24 ; 0x8005e3 e9e4: bd cf rjmp .-134 ; 0xe960 <__vector_8+0x54> 0000e9e6 : 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; e9e6: 80 93 4b 03 sts 0x034B, r24 ; 0x80034b newFanSpeed = 0; if (fanState & 0x01) e9ea: 80 fd sbrc r24, 0 e9ec: 1c c0 rjmp .+56 ; 0xea26 { //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; e9ee: 10 92 69 03 sts 0x0369, r1 ; 0x800369 else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #else //EXTRUDER_ALTFAN_DETECT newFanSpeed = EXTRUDER_AUTO_FAN_SPEED; #endif //EXTRUDER_ALTFAN_DETECT } timer4_set_fan0(newFanSpeed); e9f2: 20 91 69 03 lds r18, 0x0369 ; 0x800369 } #ifdef EXTRUDER_0_AUTO_FAN_PIN void timer4_set_fan0(uint8_t duty) { if (duty == 0 || duty == 255) e9f6: 8f ef ldi r24, 0xFF ; 255 e9f8: 82 0f add r24, r18 e9fa: 8e 3f cpi r24, 0xFE ; 254 e9fc: e8 f0 brcs .+58 ; 0xea38 { // We use digital logic if the duty cycle is 0% or 100% TCCR4A &= ~_BV(COM4C1); e9fe: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> ea02: 87 7f andi r24, 0xF7 ; 247 ea04: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = 0; ea08: 10 92 ad 00 sts 0x00AD, r1 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> ea0c: 10 92 ac 00 sts 0x00AC, r1 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> WRITE(EXTRUDER_0_AUTO_FAN_PIN, duty); ea10: 9f b7 in r25, 0x3f ; 63 ea12: 22 23 and r18, r18 ea14: 61 f0 breq .+24 ; 0xea2e ea16: f8 94 cli ea18: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> ea1c: 80 62 ori r24, 0x20 ; 32 ea1e: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> ea22: 9f bf out 0x3f, r25 ; 63 ea24: 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; ea26: 8f ef ldi r24, 0xFF ; 255 ea28: 80 93 69 03 sts 0x0369, r24 ; 0x800369 ea2c: e2 cf rjmp .-60 ; 0xe9f2 ea2e: f8 94 cli ea30: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> ea34: 8f 7d andi r24, 0xDF ; 223 ea36: f3 cf rjmp .-26 ; 0xea1e 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; ea38: ef b7 in r30, 0x3f ; 63 ea3a: f8 94 cli // Enable the PWM output on the fan pin. TCCR4A |= _BV(COM4C1); ea3c: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> ea40: 88 60 ori r24, 0x08 ; 8 ea42: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = (((uint16_t)duty) * ((uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U))) / 255U; ea46: 30 e0 ldi r19, 0x00 ; 0 ea48: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> ea4c: 4f ef ldi r20, 0xFF ; 255 ea4e: 50 e0 ldi r21, 0x00 ; 0 ea50: 81 ff sbrs r24, 1 ea52: 04 c0 rjmp .+8 ; 0xea5c ea54: 40 91 a8 00 lds r20, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> ea58: 50 91 a9 00 lds r21, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> ea5c: 24 9f mul r18, r20 ea5e: c0 01 movw r24, r0 ea60: 25 9f mul r18, r21 ea62: 90 0d add r25, r0 ea64: 34 9f mul r19, r20 ea66: 90 0d add r25, r0 ea68: 11 24 eor r1, r1 ea6a: 6f ef ldi r22, 0xFF ; 255 ea6c: 70 e0 ldi r23, 0x00 ; 0 ea6e: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> ea72: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> ea76: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> CRITICAL_SECTION_END; ea7a: ef bf out 0x3f, r30 ; 63 #endif //EXTRUDER_ALTFAN_DETECT } timer4_set_fan0(newFanSpeed); } ea7c: 08 95 ret 0000ea7e : } #endif //EXTRUDER_ALTFAN_DETECT void checkExtruderAutoFans() { ea7e: 1f 93 push r17 ea80: cf 93 push r28 ea82: df 93 push r29 #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1 if (!(fanState & 0x02)) ea84: d0 91 4b 03 lds r29, 0x034B ; 0x80034b ea88: d1 fd sbrc r29, 1 ea8a: 1d c0 rjmp .+58 ; 0xeac6 temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; ea8c: 10 91 1a 05 lds r17, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> { fanState &= ~1; fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; ea90: c1 e0 ldi r28, 0x01 ; 1 ea92: 20 e0 ldi r18, 0x00 ; 0 ea94: 30 e0 ldi r19, 0x00 ; 0 ea96: 48 e4 ldi r20, 0x48 ; 72 ea98: 52 e4 ldi r21, 0x42 ; 66 ea9a: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf ea9e: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 eaa2: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 eaa6: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 eaaa: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> eaae: 18 16 cp r1, r24 eab0: 0c f0 brlt .+2 ; 0xeab4 eab2: 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; eab4: de 7f andi r29, 0xFE ; 254 fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; eab6: cd 2b or r28, r29 eab8: 81 e0 ldi r24, 0x01 ; 1 eaba: 11 11 cpse r17, r1 eabc: 01 c0 rjmp .+2 ; 0xeac0 eabe: 80 e0 ldi r24, 0x00 ; 0 fanState |= get_temp_error(); eac0: c8 2b or r28, r24 eac2: c0 93 4b 03 sts 0x034B, r28 ; 0x80034b } setExtruderAutoFanState(fanState); eac6: 80 91 4b 03 lds r24, 0x034B ; 0x80034b #endif } eaca: df 91 pop r29 eacc: cf 91 pop r28 eace: 1f 91 pop r17 { fanState &= ~1; fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE; fanState |= get_temp_error(); } setExtruderAutoFanState(fanState); ead0: 0c 94 f3 74 jmp 0xe9e6 ; 0xe9e6 0000ead4 : 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) { ead4: ef 92 push r14 ead6: ff 92 push r15 ead8: 0f 93 push r16 eada: 1f 93 push r17 eadc: cf 93 push r28 eade: df 93 push r29 eae0: ec 01 movw r28, r24 eae2: 8b 01 movw r16, r22 eae4: 7a 01 movw r14, r20 if (!eeprom_is_initialized_block(__p, __n)) eae6: 0e 94 53 5b call 0xb6a6 ; 0xb6a6 eaea: 81 11 cpse r24, r1 eaec: 0b c0 rjmp .+22 ; 0xeb04 #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); eaee: a8 01 movw r20, r16 eaf0: be 01 movw r22, r28 eaf2: 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); } eaf4: df 91 pop r29 eaf6: cf 91 pop r28 eaf8: 1f 91 pop r17 eafa: 0f 91 pop r16 eafc: ff 90 pop r15 eafe: 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); eb00: 0d 94 24 dc jmp 0x3b848 ; 0x3b848 } 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); } eb04: df 91 pop r29 eb06: cf 91 pop r28 eb08: 1f 91 pop r17 eb0a: 0f 91 pop r16 eb0c: ff 90 pop r15 eb0e: ef 90 pop r14 eb10: 08 95 ret 0000eb12 : return def; } return val; } uint16_t __attribute__((noinline)) eeprom_init_default_word(uint16_t *__p, uint16_t def) { eb12: 0f 93 push r16 eb14: 1f 93 push r17 eb16: cf 93 push r28 eb18: df 93 push r29 eb1a: 8c 01 movw r16, r24 eb1c: d6 2f mov r29, r22 eb1e: c7 2f mov r28, r23 uint16_t val = eeprom_read_word(__p); eb20: 0f 94 1e dc call 0x3b83c ; 0x3b83c if (val == EEPROM_EMPTY_VALUE16) { eb24: 8f 3f cpi r24, 0xFF ; 255 eb26: 98 07 cpc r25, r24 eb28: 39 f4 brne .+14 ; 0xeb38 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); eb2a: 6d 2f mov r22, r29 eb2c: 7c 2f mov r23, r28 eb2e: c8 01 movw r24, r16 eb30: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc 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; eb34: 8d 2f mov r24, r29 eb36: 9c 2f mov r25, r28 } return val; } eb38: df 91 pop r29 eb3a: cf 91 pop r28 eb3c: 1f 91 pop r17 eb3e: 0f 91 pop r16 eb40: 08 95 ret 0000eb42 : 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) { eb42: 0f 93 push r16 eb44: 1f 93 push r17 eb46: cf 93 push r28 eb48: 8c 01 movw r16, r24 eb4a: c6 2f mov r28, r22 uint8_t val = eeprom_read_byte(__p); eb4c: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (val == EEPROM_EMPTY_VALUE) { eb50: 8f 3f cpi r24, 0xFF ; 255 eb52: 29 f4 brne .+10 ; 0xeb5e 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); eb54: 6c 2f mov r22, r28 eb56: c8 01 movw r24, r16 eb58: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 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; eb5c: 8c 2f mov r24, r28 } return val; } eb5e: cf 91 pop r28 eb60: 1f 91 pop r17 eb62: 0f 91 pop r16 eb64: 08 95 ret 0000eb66 : 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) { eb66: cf 93 push r28 eb68: df 93 push r29 eb6a: ec 01 movw r28, r24 eeprom_write_word_notify(__p, eeprom_read_word(__p) + 1); eb6c: 0f 94 1e dc call 0x3b83c ; 0x3b83c eb70: bc 01 movw r22, r24 eb72: 6f 5f subi r22, 0xFF ; 255 eb74: 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); eb76: 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); } eb78: df 91 pop r29 eb7a: 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); eb7c: 0d 94 6e dc jmp 0x3b8dc ; 0x3b8dc 0000eb80 : void eeprom_toggle(uint8_t *__p) { eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); } void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) { eb80: cf 93 push r28 eb82: df 93 push r29 eb84: ec 01 movw r28, r24 eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1); eb86: 0f 94 10 dc call 0x3b820 ; 0x3b820 eb8a: 61 e0 ldi r22, 0x01 ; 1 eb8c: 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); eb8e: 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); } eb90: df 91 pop r29 eb92: 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); eb94: 0d 94 58 dc jmp 0x3b8b0 ; 0x3b8b0 0000eb98 : while (__n--) { eeprom_update_byte_notify(dst++, pgm_read_byte(src++)); } } void eeprom_toggle(uint8_t *__p) { eb98: cf 93 push r28 eb9a: df 93 push r29 eb9c: ec 01 movw r28, r24 eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); eb9e: 0f 94 10 dc call 0x3b820 ; 0x3b820 eba2: 61 e0 ldi r22, 0x01 ; 1 eba4: 81 11 cpse r24, r1 eba6: 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); eba8: ce 01 movw r24, r28 } } void eeprom_toggle(uint8_t *__p) { eeprom_write_byte_notify(__p, !eeprom_read_byte(__p)); } ebaa: df 91 pop r29 ebac: 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); ebae: 0d 94 58 dc jmp 0x3b8b0 ; 0x3b8b0 0000ebb2 : 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); ebb2: 2b e0 ldi r18, 0x0B ; 11 ebb4: 82 9f mul r24, r18 ebb6: c0 01 movw r24, r0 ebb8: 11 24 eor r1, r1 ebba: 80 5b subi r24, 0xB0 ; 176 ebbc: 92 4f sbci r25, 0xF2 ; 242 ebbe: 0f 94 1e dc call 0x3b83c ; 0x3b83c ebc2: 21 e0 ldi r18, 0x01 ; 1 ebc4: 01 96 adiw r24, 0x01 ; 1 ebc6: 09 f4 brne .+2 ; 0xebca ebc8: 20 e0 ldi r18, 0x00 ; 0 } ebca: 82 2f mov r24, r18 ebcc: 08 95 ret 0000ebce : //! //! @param sheet Current sheet //! @return next initialized sheet //! @retval -1 no sheet is initialized int8_t eeprom_next_initialized_sheet(int8_t sheet) { ebce: cf 93 push r28 ebd0: df 93 push r29 ebd2: c8 2f mov r28, r24 ebd4: d8 e0 ldi r29, 0x08 ; 8 for (int8_t i = 0; i < static_cast(sizeof(Sheets::s)/sizeof(Sheet)); ++i) { ++sheet; ebd6: cf 5f subi r28, 0xFF ; 255 if (sheet >= static_cast(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0; ebd8: c8 30 cpi r28, 0x08 ; 8 ebda: 0c f0 brlt .+2 ; 0xebde ebdc: c0 e0 ldi r28, 0x00 ; 0 if (eeprom_is_sheet_initialized(sheet)) return sheet; ebde: 8c 2f mov r24, r28 ebe0: 0e 94 d9 75 call 0xebb2 ; 0xebb2 ebe4: 81 11 cpse r24, r1 ebe6: 03 c0 rjmp .+6 ; 0xebee ebe8: 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) ebea: a9 f7 brne .-22 ; 0xebd6 { ++sheet; if (sheet >= static_cast(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0; if (eeprom_is_sheet_initialized(sheet)) return sheet; } return -1; ebec: cf ef ldi r28, 0xFF ; 255 } ebee: 8c 2f mov r24, r28 ebf0: df 91 pop r29 ebf2: cf 91 pop r28 ebf4: 08 95 ret 0000ebf6 : #endif //DEBUG_EEPROM_CHANGES } void eeprom_switch_to_next_sheet() { int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); ebf6: 81 ea ldi r24, 0xA1 ; 161 ebf8: 9d e0 ldi r25, 0x0D ; 13 ebfa: 0f 94 10 dc call 0x3b820 ; 0x3b820 sheet = eeprom_next_initialized_sheet(sheet); ebfe: 0e 94 e7 75 call 0xebce ; 0xebce if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet); ec02: 87 fd sbrc r24, 7 ec04: 05 c0 rjmp .+10 ; 0xec10 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); ec06: 68 2f mov r22, r24 ec08: 81 ea ldi r24, 0xA1 ; 161 ec0a: 9d e0 ldi r25, 0x0D ; 13 ec0c: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 { 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); } ec10: 08 95 ret 0000ec12 : //! | 7 | Custom2 | //! //! @param[in] index //! @param[out] sheetName void eeprom_default_sheet_name(uint8_t index, SheetName &sheetName) { ec12: 0f 93 push r16 ec14: 1f 93 push r17 ec16: cf 93 push r28 ec18: c8 2f mov r28, r24 ec1a: 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")); ec1c: 62 ea ldi r22, 0xA2 ; 162 ec1e: 78 e7 ldi r23, 0x78 ; 120 //! @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) ec20: 82 30 cpi r24, 0x02 ; 2 ec22: 70 f0 brcs .+28 ; 0xec40 { strcpy_P(sheetName.c, PSTR("Smooth")); } else if (index < 4) { strcpy_P(sheetName.c, PSTR("Textur")); ec24: 6b e9 ldi r22, 0x9B ; 155 ec26: 78 e7 ldi r23, 0x78 ; 120 if (index < 2) { strcpy_P(sheetName.c, PSTR("Smooth")); } else if (index < 4) ec28: 84 30 cpi r24, 0x04 ; 4 ec2a: 50 f0 brcs .+20 ; 0xec40 { strcpy_P(sheetName.c, PSTR("Textur")); } else if (index < 5) { strcpy_P(sheetName.c, PSTR("Satin ")); ec2c: 63 e9 ldi r22, 0x93 ; 147 ec2e: 78 e7 ldi r23, 0x78 ; 120 } else if (index < 4) { strcpy_P(sheetName.c, PSTR("Textur")); } else if (index < 5) ec30: 84 30 cpi r24, 0x04 ; 4 ec32: 31 f0 breq .+12 ; 0xec40 { strcpy_P(sheetName.c, PSTR("Satin ")); } else if (index < 6) { strcpy_P(sheetName.c, PSTR("NylonPA")); ec34: 6b e8 ldi r22, 0x8B ; 139 ec36: 78 e7 ldi r23, 0x78 ; 120 } else if (index < 5) { strcpy_P(sheetName.c, PSTR("Satin ")); } else if (index < 6) ec38: 85 30 cpi r24, 0x05 ; 5 ec3a: 11 f0 breq .+4 ; 0xec40 { strcpy_P(sheetName.c, PSTR("NylonPA")); } else { strcpy_P(sheetName.c, PSTR("Custom")); ec3c: 64 e8 ldi r22, 0x84 ; 132 ec3e: 78 e7 ldi r23, 0x78 ; 120 ec40: c8 01 movw r24, r16 ec42: 0f 94 c7 d9 call 0x3b38e ; 0x3b38e } if (index <4 || index >5) ec46: 8c ef ldi r24, 0xFC ; 252 ec48: 8c 0f add r24, r28 ec4a: 82 30 cpi r24, 0x02 ; 2 ec4c: 28 f0 brcs .+10 ; 0xec58 { sheetName.c[6] = '0' + ((index % 2)+1); ec4e: c1 70 andi r28, 0x01 ; 1 ec50: cf 5c subi r28, 0xCF ; 207 ec52: f8 01 movw r30, r16 ec54: c6 83 std Z+6, r28 ; 0x06 sheetName.c[7] = '\0'; ec56: 17 82 std Z+7, r1 ; 0x07 } } ec58: cf 91 pop r28 ec5a: 1f 91 pop r17 ec5c: 0f 91 pop r16 ec5e: 08 95 ret 0000ec60 : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); ec60: 61 e0 ldi r22, 0x01 ; 1 ec62: 80 ec ldi r24, 0xC0 ; 192 ec64: 9f e0 ldi r25, 0x0F ; 15 ec66: 0f 94 34 dc call 0x3b868 ; 0x3b868 ec6a: 60 e0 ldi r22, 0x00 ; 0 ec6c: 8f eb ldi r24, 0xBF ; 191 ec6e: 9f e0 ldi r25, 0x0F ; 15 ec70: 0f 94 34 dc call 0x3b868 ; 0x3b868 ec74: 60 e0 ldi r22, 0x00 ; 0 ec76: 8e eb ldi r24, 0xBE ; 190 ec78: 9f e0 ldi r25, 0x0F ; 15 ec7a: 0f 94 34 dc call 0x3b868 ; 0x3b868 ec7e: 60 e0 ldi r22, 0x00 ; 0 ec80: 8d eb ldi r24, 0xBD ; 189 ec82: 9f e0 ldi r25, 0x0F ; 15 ec84: 0f 94 34 dc call 0x3b868 ; 0x3b868 ec88: 60 e0 ldi r22, 0x00 ; 0 ec8a: 8c eb ldi r24, 0xBC ; 188 ec8c: 9f e0 ldi r25, 0x0F ; 15 ec8e: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0000ec92 : } void print_hex_byte(uint8_t val) { ec92: cf 93 push r28 ec94: c8 2f mov r28, r24 print_hex_nibble(val >> 4); ec96: 82 95 swap r24 ec98: 8f 70 andi r24, 0x0F ; 15 ec9a: 0e 94 6d 63 call 0xc6da ; 0xc6da print_hex_nibble(val & 15); ec9e: 8c 2f mov r24, r28 eca0: 8f 70 andi r24, 0x0F ; 15 } eca2: cf 91 pop r28 } void print_hex_byte(uint8_t val) { print_hex_nibble(val >> 4); print_hex_nibble(val & 15); eca4: 0c 94 6d 63 jmp 0xc6da ; 0xc6da 0000eca8 : // 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) { eca8: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 ecac: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 ecb0: 18 16 cp r1, r24 ecb2: 19 06 cpc r1, r25 ecb4: 0c f0 brlt .+2 ; 0xecb8 ecb6: 43 c0 rjmp .+134 ; 0xed3e SERIAL_ECHO(serial_count); SERIAL_ECHOPGM(", bufsize "); SERIAL_ECHO(sizeof(cmdbuffer)); SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ if (-- buflen == 0) { ecb8: 01 97 sbiw r24, 0x01 ; 1 ecba: 90 93 a3 10 sts 0x10A3, r25 ; 0x8010a3 ecbe: 80 93 a2 10 sts 0x10A2, r24 ; 0x8010a2 ecc2: 89 2b or r24, r25 ecc4: a1 f4 brne .+40 ; 0xecee // Empty buffer. if (serial_count == 0) ecc6: 80 91 9d 10 lds r24, 0x109D ; 0x80109d ecca: 90 91 9e 10 lds r25, 0x109E ; 0x80109e ecce: 89 2b or r24, r25 ecd0: 21 f4 brne .+8 ; 0xecda // No serial communication is pending. Reset both pointers to zero. bufindw = 0; ecd2: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> ecd6: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> bufindr = bufindw; ecda: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> ecde: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> ece2: 90 93 92 12 sts 0x1292, r25 ; 0x801292 ece6: 80 93 91 12 sts 0x1291, r24 ; 0x801291 SERIAL_ECHOPGM(" new command on the top: "); SERIAL_ECHO(cmdbuffer+bufindr+CMDHDRSIZE); SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ } return true; ecea: 81 e0 ldi r24, 0x01 ; 1 ecec: 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) ; ecee: 80 91 91 12 lds r24, 0x1291 ; 0x801291 ecf2: 90 91 92 12 lds r25, 0x1292 ; 0x801292 ecf6: 03 96 adiw r24, 0x03 ; 3 ecf8: fc 01 movw r30, r24 ecfa: ec 55 subi r30, 0x5C ; 92 ecfc: ff 4e sbci r31, 0xEF ; 239 ecfe: 20 81 ld r18, Z ed00: 01 96 adiw r24, 0x01 ; 1 ed02: 21 11 cpse r18, r1 ed04: f9 cf rjmp .-14 ; 0xecf8 ed06: fc 01 movw r30, r24 ed08: ec 55 subi r30, 0x5C ; 92 ed0a: 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) ; ed0c: 8d 3e cpi r24, 0xED ; 237 ed0e: 21 e0 ldi r18, 0x01 ; 1 ed10: 92 07 cpc r25, r18 ed12: 40 f4 brcc .+16 ; 0xed24 ed14: 41 91 ld r20, Z+ ed16: 9c 01 movw r18, r24 ed18: 2f 5f subi r18, 0xFF ; 255 ed1a: 3f 4f sbci r19, 0xFF ; 255 ed1c: 41 11 cpse r20, r1 ed1e: e1 cf rjmp .-62 ; 0xece2 ed20: c9 01 movw r24, r18 ed22: f4 cf rjmp .-24 ; 0xed0c // If the end of the buffer was empty, if (bufindr == sizeof(cmdbuffer)) { ed24: e4 ea ldi r30, 0xA4 ; 164 ed26: f0 e1 ldi r31, 0x10 ; 16 ed28: 8d 3e cpi r24, 0xED ; 237 ed2a: 21 e0 ldi r18, 0x01 ; 1 ed2c: 92 07 cpc r25, r18 ed2e: c9 f6 brne .-78 ; 0xece2 ed30: cf 01 movw r24, r30 ed32: 84 5a subi r24, 0xA4 ; 164 ed34: 90 41 sbci r25, 0x10 ; 16 // skip to the start and find the nonzero command. for (bufindr = 0; cmdbuffer[bufindr] == 0; ++ bufindr) ; ed36: 21 91 ld r18, Z+ ed38: 22 23 and r18, r18 ed3a: d1 f3 breq .-12 ; 0xed30 ed3c: d2 cf rjmp .-92 ; 0xece2 SERIAL_ECHOLNPGM(""); #endif /* CMDBUFFER_DEBUG */ } return true; } return false; ed3e: 80 e0 ldi r24, 0x00 ; 0 } ed40: 08 95 ret 0000ed42 : 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; ed42: 80 91 98 04 lds r24, 0x0498 ; 0x800498 ed46: 90 91 99 04 lds r25, 0x0499 ; 0x800499 ed4a: 20 91 9a 04 lds r18, 0x049A ; 0x80049a ed4e: 30 91 9b 04 lds r19, 0x049B ; 0x80049b ed52: 82 1b sub r24, r18 ed54: 93 0b sbc r25, r19 } ed56: 8f 77 andi r24, 0x7F ; 127 ed58: 99 27 eor r25, r25 ed5a: 08 95 ret 0000ed5c : autostart_atmillis.start(); // reset timer } char *createFilename(char *buffer,const dir_t &p) //buffer>12characters { char *pos=buffer; ed5c: fc 01 movw r30, r24 for (uint8_t i = 0; i < 11; i++) ed5e: 20 e0 ldi r18, 0x00 ; 0 { if (p.name[i] == ' ')continue; if (i == 8) { *pos++='.'; ed60: 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; ed62: db 01 movw r26, r22 ed64: 4d 91 ld r20, X+ ed66: bd 01 movw r22, r26 ed68: 40 32 cpi r20, 0x20 ; 32 ed6a: 49 f0 breq .+18 ; 0xed7e if (i == 8) ed6c: 28 30 cpi r18, 0x08 ; 8 ed6e: 11 f4 brne .+4 ; 0xed74 { *pos++='.'; ed70: 30 83 st Z, r19 ed72: 31 96 adiw r30, 0x01 ; 1 } *pos++=p.name[i]; ed74: db 01 movw r26, r22 ed76: 11 97 sbiw r26, 0x01 ; 1 ed78: 4c 91 ld r20, X ed7a: 40 83 st Z, r20 ed7c: 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++) ed7e: 2f 5f subi r18, 0xFF ; 255 ed80: 2b 30 cpi r18, 0x0B ; 11 ed82: 79 f7 brne .-34 ; 0xed62 { *pos++='.'; } *pos++=p.name[i]; } *pos++=0; ed84: 10 82 st Z, r1 return buffer; } ed86: 08 95 ret 0000ed88 : 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);} ed88: 40 e0 ldi r20, 0x00 ; 0 ed8a: 50 e0 ldi r21, 0x00 ; 0 ed8c: ba 01 movw r22, r20 ed8e: 0d 94 89 57 jmp 0x2af12 ; 0x2af12 0000ed92 : 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();} ed92: fc 01 movw r30, r24 ed94: 23 81 ldd r18, Z+3 ; 0x03 ed96: 21 11 cpse r18, r1 ed98: 0d 94 67 59 jmp 0x2b2ce ; 0x2b2ce ed9c: 08 95 ret 0000ed9e : M_UDRx = c; } */ static void write(uint8_t c) { if (selectedSerialPort == 0) ed9e: 90 91 38 05 lds r25, 0x0538 ; 0x800538 eda2: 91 11 cpse r25, r1 eda4: 07 c0 rjmp .+14 ; 0xedb4 { while (!((M_UCSRxA) & (1 << M_UDREx))); eda6: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> edaa: 95 ff sbrs r25, 5 edac: fc cf rjmp .-8 ; 0xeda6 M_UDRx = c; edae: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> edb2: 08 95 ret } else if (selectedSerialPort == 1) edb4: 91 30 cpi r25, 0x01 ; 1 edb6: 31 f4 brne .+12 ; 0xedc4 { while (!((UCSR1A) & (1 << UDRE1))); edb8: 90 91 c8 00 lds r25, 0x00C8 ; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8> edbc: 95 ff sbrs r25, 5 edbe: fc cf rjmp .-8 ; 0xedb8 UDR1 = c; edc0: 80 93 ce 00 sts 0x00CE, r24 ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> } } edc4: 08 95 ret 0000edc6 : static FILE _uartout; #define uartout (&_uartout) int uart_putchar(char c, FILE *) { MYSERIAL.write(c); edc6: 0e 94 cf 76 call 0xed9e ; 0xed9e return 0; } edca: 90 e0 ldi r25, 0x00 ; 0 edcc: 80 e0 ldi r24, 0x00 ; 0 edce: 08 95 ret 0000edd0 : 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) { edd0: cf 93 push r28 edd2: df 93 push r29 edd4: ec 01 movw r28, r24 while(uint8_t ch = pgm_read_byte(str)) { edd6: fe 01 movw r30, r28 edd8: 84 91 lpm r24, Z edda: 88 23 and r24, r24 eddc: 21 f0 breq .+8 ; 0xede6 MYSERIAL.write((char)ch); edde: 0e 94 cf 76 call 0xed9e ; 0xed9e ++str; ede2: 21 96 adiw r28, 0x01 ; 1 ede4: f8 cf rjmp .-16 ; 0xedd6 } } ede6: df 91 pop r29 ede8: cf 91 pop r28 edea: 08 95 ret 0000edec : // Turn off the print fan fanSpeed = 0; } } void serialecho_temperatures() { edec: cf 92 push r12 edee: df 92 push r13 edf0: ef 92 push r14 edf2: 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]; edf4: c0 90 af 0d lds r12, 0x0DAF ; 0x800daf edf8: d0 90 b0 0d lds r13, 0x0DB0 ; 0x800db0 edfc: e0 90 b1 0d lds r14, 0x0DB1 ; 0x800db1 ee00: f0 90 b2 0d lds r15, 0x0DB2 ; 0x800db2 float tt = degHotend(active_extruder); SERIAL_PROTOCOLPGM("T:"); ee04: 89 eb ldi r24, 0xB9 ; 185 ee06: 9d e7 ldi r25, 0x7D ; 125 ee08: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); ee0c: 42 e0 ldi r20, 0x02 ; 2 ee0e: c7 01 movw r24, r14 ee10: b6 01 movw r22, r12 ee12: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(tt); SERIAL_PROTOCOLPGM(" E:0 B:"); ee16: 81 eb ldi r24, 0xB1 ; 177 ee18: 9d e7 ldi r25, 0x7D ; 125 ee1a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 ee1e: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed ee22: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee ee26: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef ee2a: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 ee2e: 41 e0 ldi r20, 0x01 ; 1 ee30: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(); } ee34: ff 90 pop r15 ee36: ef 90 pop r14 ee38: df 90 pop r13 ee3a: 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(); ee3c: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0000ee40 : } } /// @brief Helper function to reduce code size in M861 /// by extracting common code into one function static void gcode_M861_print_pinda_cal_eeprom() { ee40: 4f 92 push r4 ee42: 5f 92 push r5 ee44: 6f 92 push r6 ee46: 7f 92 push r7 ee48: 8f 92 push r8 ee4a: 9f 92 push r9 ee4c: af 92 push r10 ee4e: bf 92 push r11 ee50: cf 92 push r12 ee52: df 92 push r13 ee54: ef 92 push r14 ee56: ff 92 push r15 ee58: 0f 93 push r16 ee5a: 1f 93 push r17 ee5c: cf 93 push r28 ee5e: df 93 push r29 ee60: cc 24 eor r12, r12 ee62: ca 94 dec r12 ee64: dc 2c mov r13, r12 ee66: 76 01 movw r14, r12 ee68: 0e ea ldi r16, 0xAE ; 174 ee6a: 1f e0 ldi r17, 0x0F ; 15 ee6c: 93 e2 ldi r25, 0x23 ; 35 ee6e: 89 2e mov r8, r25 ee70: 91 2c mov r9, r1 ee72: a1 2c mov r10, r1 ee74: b1 2c mov r11, r1 int16_t usteps = 0; float mm = 0; ee76: 41 2c mov r4, r1 ee78: 51 2c mov r5, r1 ee7a: 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; ee7c: d0 e0 ldi r29, 0x00 ; 0 ee7e: 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) { ee80: 8f ef ldi r24, 0xFF ; 255 ee82: c8 16 cp r12, r24 ee84: 09 f4 brne .+2 ; 0xee88 ee86: 5d c0 rjmp .+186 ; 0xef42 usteps = eeprom_read_word((uint16_t*) EEPROM_PROBE_TEMP_SHIFT + (i - 1)); ee88: c8 01 movw r24, r16 ee8a: 0f 94 1e dc call 0x3b83c ; 0x3b83c ee8e: ec 01 movw r28, r24 mm = ((float)usteps) / cs.axis_steps_per_mm[Z_AXIS]; ee90: bc 01 movw r22, r24 ee92: 99 0f add r25, r25 ee94: 88 0b sbc r24, r24 ee96: 99 0b sbc r25, r25 ee98: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> ee9c: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 eea0: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca eea4: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb eea8: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc eeac: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> eeb0: 2b 01 movw r4, r22 eeb2: 3c 01 movw r6, r24 eeb4: c7 01 movw r24, r14 eeb6: b6 01 movw r22, r12 eeb8: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL(i - 1); } else { SERIAL_PROTOCOLRPGM(MSG_NA); } SERIAL_PROTOCOLRPGM(comma_sep); eebc: 8d e0 ldi r24, 0x0D ; 13 eebe: 9d e7 ldi r25, 0x7D ; 125 eec0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 eec4: c5 01 movw r24, r10 eec6: b4 01 movw r22, r8 eec8: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL(35 + (i * 5)); SERIAL_PROTOCOLRPGM(comma_sep); eecc: 8d e0 ldi r24, 0x0D ; 13 eece: 9d e7 ldi r25, 0x7D ; 125 eed0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); eed4: be 01 movw r22, r28 eed6: 0d 2e mov r0, r29 eed8: 00 0c add r0, r0 eeda: 88 0b sbc r24, r24 eedc: 99 0b sbc r25, r25 eede: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOLRPGM(comma_sep); eee2: 8d e0 ldi r24, 0x0D ; 13 eee4: 9d e7 ldi r25, 0x7D ; 125 eee6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(mm * 1000); eeea: 20 e0 ldi r18, 0x00 ; 0 eeec: 30 e0 ldi r19, 0x00 ; 0 eeee: 4a e7 ldi r20, 0x7A ; 122 eef0: 54 e4 ldi r21, 0x44 ; 68 eef2: c3 01 movw r24, r6 eef4: b2 01 movw r22, r4 eef6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> eefa: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 eefe: 85 e0 ldi r24, 0x05 ; 5 ef00: 88 0e add r8, r24 ef02: 91 1c adc r9, r1 ef04: a1 1c adc r10, r1 ef06: b1 1c adc r11, r1 ef08: 0e 5f subi r16, 0xFE ; 254 ef0a: 1f 4f sbci r17, 0xFF ; 255 ef0c: 8f ef ldi r24, 0xFF ; 255 ef0e: c8 1a sub r12, r24 ef10: d8 0a sbc r13, r24 ef12: e8 0a sbc r14, r24 ef14: 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++) { ef16: 0a 3b cpi r16, 0xBA ; 186 ef18: 8f e0 ldi r24, 0x0F ; 15 ef1a: 18 07 cpc r17, r24 ef1c: 09 f0 breq .+2 ; 0xef20 ef1e: b0 cf rjmp .-160 ; 0xee80 SERIAL_PROTOCOLRPGM(comma_sep); SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOLRPGM(comma_sep); SERIAL_PROTOCOLLN(mm * 1000); } } ef20: df 91 pop r29 ef22: cf 91 pop r28 ef24: 1f 91 pop r17 ef26: 0f 91 pop r16 ef28: ff 90 pop r15 ef2a: ef 90 pop r14 ef2c: df 90 pop r13 ef2e: cf 90 pop r12 ef30: bf 90 pop r11 ef32: af 90 pop r10 ef34: 9f 90 pop r9 ef36: 8f 90 pop r8 ef38: 7f 90 pop r7 ef3a: 6f 90 pop r6 ef3c: 5f 90 pop r5 ef3e: 4f 90 pop r4 ef40: 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); ef42: 8a e8 ldi r24, 0x8A ; 138 ef44: 97 e4 ldi r25, 0x47 ; 71 ef46: 0e 94 e8 76 call 0xedd0 ; 0xedd0 ef4a: b8 cf rjmp .-144 ; 0xeebc 0000ef4c : /// @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) { ef4c: 88 23 and r24, r24 ef4e: 71 f1 breq .+92 ; 0xefac currentMMUSlot = slot; } uint8_t SpoolJoin::nextSlot() { SERIAL_ECHOPGM("SpoolJoin: "); ef50: 81 e0 ldi r24, 0x01 ; 1 ef52: 9d e7 ldi r25, 0x7D ; 125 ef54: 0e 94 e8 76 call 0xedd0 ; 0xedd0 ef58: 60 91 48 13 lds r22, 0x1348 ; 0x801348 ef5c: 70 e0 ldi r23, 0x00 ; 0 ef5e: 90 e0 ldi r25, 0x00 ; 0 ef60: 80 e0 ldi r24, 0x00 ; 0 ef62: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_ECHO((int)currentMMUSlot); if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0; ef66: 80 91 48 13 lds r24, 0x1348 ; 0x801348 ef6a: 84 30 cpi r24, 0x04 ; 4 ef6c: d8 f0 brcs .+54 ; 0xefa4 ef6e: 10 92 48 13 sts 0x1348, r1 ; 0x801348 else currentMMUSlot++; SERIAL_ECHOPGM(" -> "); ef72: 8c ef ldi r24, 0xFC ; 252 ef74: 9c e7 ldi r25, 0x7C ; 124 ef76: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN((int)currentMMUSlot); ef7a: 80 91 48 13 lds r24, 0x1348 ; 0x801348 ef7e: 90 e0 ldi r25, 0x00 ; 0 ef80: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 return currentMMUSlot; ef84: 80 91 48 13 lds r24, 0x1348 ; 0x801348 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; ef88: 20 91 ab 05 lds r18, 0x05AB ; 0x8005ab ef8c: 30 91 ac 05 lds r19, 0x05AC ; 0x8005ac ef90: 30 93 b6 0d sts 0x0DB6, r19 ; 0x800db6 ef94: 20 93 b5 0d sts 0x0DB5, r18 ; 0x800db5 slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT); } setTargetHotend(saved_extruder_temperature); MMU2::mmu2.load_filament_to_nozzle(slot); ef98: 0f 94 8c 0f call 0x21f18 ; 0x21f18 load_filament_final_feed(); // @@TODO verify ef9c: 0e 94 2b 64 call 0xc856 ; 0xc856 st_synchronize(); efa0: 0d 94 a9 43 jmp 0x28752 ; 0x28752 { SERIAL_ECHOPGM("SpoolJoin: "); SERIAL_ECHO((int)currentMMUSlot); if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0; else currentMMUSlot++; efa4: 8f 5f subi r24, 0xFF ; 255 efa6: 80 93 48 13 sts 0x1348, r24 ; 0x801348 efaa: e3 cf rjmp .-58 ; 0xef72 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); efac: 8c e5 ldi r24, 0x5C ; 92 efae: 9b e3 ldi r25, 0x3B ; 59 efb0: 0e 94 44 72 call 0xe488 ; 0xe488 efb4: 70 e0 ldi r23, 0x00 ; 0 efb6: 60 e0 ldi r22, 0x00 ; 0 efb8: 0e 94 bc e4 call 0x1c978 ; 0x1c978 efbc: e5 cf rjmp .-54 ; 0xef88 0000efbe : return final_result; } void gcode_M114() { efbe: cf 93 push r28 efc0: df 93 push r29 SERIAL_PROTOCOLPGM("X:"); efc2: 89 ef ldi r24, 0xF9 ; 249 efc4: 9c e7 ldi r25, 0x7C ; 124 efc6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOL(current_position[X_AXIS]); efca: c1 e9 ldi r28, 0x91 ; 145 efcc: d6 e0 ldi r29, 0x06 ; 6 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); efce: 68 81 ld r22, Y efd0: 79 81 ldd r23, Y+1 ; 0x01 efd2: 8a 81 ldd r24, Y+2 ; 0x02 efd4: 9b 81 ldd r25, Y+3 ; 0x03 efd6: 42 e0 ldi r20, 0x02 ; 2 efd8: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" Y:"); efdc: 85 ef ldi r24, 0xF5 ; 245 efde: 9c e7 ldi r25, 0x7C ; 124 efe0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 efe4: 6c 81 ldd r22, Y+4 ; 0x04 efe6: 7d 81 ldd r23, Y+5 ; 0x05 efe8: 8e 81 ldd r24, Y+6 ; 0x06 efea: 9f 81 ldd r25, Y+7 ; 0x07 efec: 42 e0 ldi r20, 0x02 ; 2 efee: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(current_position[Y_AXIS]); SERIAL_PROTOCOLPGM(" Z:"); eff2: 81 ef ldi r24, 0xF1 ; 241 eff4: 9c e7 ldi r25, 0x7C ; 124 eff6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 effa: 68 85 ldd r22, Y+8 ; 0x08 effc: 79 85 ldd r23, Y+9 ; 0x09 effe: 8a 85 ldd r24, Y+10 ; 0x0a f000: 9b 85 ldd r25, Y+11 ; 0x0b f002: 42 e0 ldi r20, 0x02 ; 2 f004: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(current_position[Z_AXIS]); SERIAL_PROTOCOLPGM(" E:"); f008: 8d ee ldi r24, 0xED ; 237 f00a: 9c e7 ldi r25, 0x7C ; 124 f00c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f010: 6c 85 ldd r22, Y+12 ; 0x0c f012: 7d 85 ldd r23, Y+13 ; 0x0d f014: 8e 85 ldd r24, Y+14 ; 0x0e f016: 9f 85 ldd r25, Y+15 ; 0x0f f018: 42 e0 ldi r20, 0x02 ; 2 f01a: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(current_position[E_AXIS]); SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X f01e: 8d ea ldi r24, 0xAD ; 173 f020: 95 e6 ldi r25, 0x65 ; 101 f022: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / cs.axis_steps_per_mm[X_AXIS]); f026: 80 e0 ldi r24, 0x00 ; 0 f028: 0f 94 87 43 call 0x2870e ; 0x2870e f02c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f030: cd eb ldi r28, 0xBD ; 189 f032: dd e0 ldi r29, 0x0D ; 13 f034: 2c 81 ldd r18, Y+4 ; 0x04 f036: 3d 81 ldd r19, Y+5 ; 0x05 f038: 4e 81 ldd r20, Y+6 ; 0x06 f03a: 5f 81 ldd r21, Y+7 ; 0x07 f03c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> f040: 42 e0 ldi r20, 0x02 ; 2 f042: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" Y:"); f046: 89 ee ldi r24, 0xE9 ; 233 f048: 9c e7 ldi r25, 0x7C ; 124 f04a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_mm[Y_AXIS]); f04e: 81 e0 ldi r24, 0x01 ; 1 f050: 0f 94 87 43 call 0x2870e ; 0x2870e f054: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f058: 28 85 ldd r18, Y+8 ; 0x08 f05a: 39 85 ldd r19, Y+9 ; 0x09 f05c: 4a 85 ldd r20, Y+10 ; 0x0a f05e: 5b 85 ldd r21, Y+11 ; 0x0b f060: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> f064: 42 e0 ldi r20, 0x02 ; 2 f066: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" Z:"); f06a: 85 ee ldi r24, 0xE5 ; 229 f06c: 9c e7 ldi r25, 0x7C ; 124 f06e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_mm[Z_AXIS]); f072: 82 e0 ldi r24, 0x02 ; 2 f074: 0f 94 87 43 call 0x2870e ; 0x2870e f078: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f07c: 2c 85 ldd r18, Y+12 ; 0x0c f07e: 3d 85 ldd r19, Y+13 ; 0x0d f080: 4e 85 ldd r20, Y+14 ; 0x0e f082: 5f 85 ldd r21, Y+15 ; 0x0f f084: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> f088: 42 e0 ldi r20, 0x02 ; 2 f08a: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" E:"); f08e: 81 ee ldi r24, 0xE1 ; 225 f090: 9c e7 ldi r25, 0x7C ; 124 f092: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_mm[E_AXIS]); f096: 83 e0 ldi r24, 0x03 ; 3 f098: 0f 94 87 43 call 0x2870e ; 0x2870e f09c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f0a0: 28 89 ldd r18, Y+16 ; 0x10 f0a2: 39 89 ldd r19, Y+17 ; 0x11 f0a4: 4a 89 ldd r20, Y+18 ; 0x12 f0a6: 5b 89 ldd r21, Y+19 ; 0x13 f0a8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> } f0ac: df 91 pop r29 f0ae: 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]); f0b0: 0d 94 ab 75 jmp 0x2eb56 ; 0x2eb56 0000f0b4 : #endif //TMC2130 void gcode_M105() { #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 SERIAL_PROTOCOLPGM("T:"); f0b4: 80 ef ldi r24, 0xF0 ; 240 f0b6: 9b e7 ldi r25, 0x7B ; 123 f0b8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f0bc: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf f0c0: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 f0c4: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 f0c8: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 f0cc: 41 e0 ldi r20, 0x01 ; 1 f0ce: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degHotend(active_extruder),1); SERIAL_PROTOCOLPGM(" /"); f0d2: 8d ee ldi r24, 0xED ; 237 f0d4: 9b e7 ldi r25, 0x7B ; 123 f0d6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; f0da: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 f0de: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 f0e2: 07 2e mov r0, r23 f0e4: 00 0c add r0, r0 f0e6: 88 0b sbc r24, r24 f0e8: 99 0b sbc r25, r25 f0ea: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f0ee: 41 e0 ldi r20, 0x01 ; 1 f0f0: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degTargetHotend(active_extruder),1); #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 SERIAL_PROTOCOLPGM(" B:"); f0f4: 89 ee ldi r24, 0xE9 ; 233 f0f6: 9b e7 ldi r25, 0x7B ; 123 f0f8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f0fc: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed f100: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee f104: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef f108: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 f10c: 41 e0 ldi r20, 0x01 ; 1 f10e: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degBed(),1); SERIAL_PROTOCOLPGM(" /"); f112: 86 ee ldi r24, 0xE6 ; 230 f114: 9b e7 ldi r25, 0x7B ; 123 f116: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; f11a: 60 91 71 06 lds r22, 0x0671 ; 0x800671 f11e: 70 91 72 06 lds r23, 0x0672 ; 0x800672 f122: 07 2e mov r0, r23 f124: 00 0c add r0, r0 f126: 88 0b sbc r24, r24 f128: 99 0b sbc r25, r25 f12a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f12e: 41 e0 ldi r20, 0x01 ; 1 f130: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degTargetBed(),1); #endif //TEMP_BED_PIN SERIAL_PROTOCOLPGM(" T0:"); f134: 81 ee ldi r24, 0xE1 ; 225 f136: 9b e7 ldi r25, 0x7B ; 123 f138: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f13c: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf f140: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 f144: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 f148: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 f14c: 41 e0 ldi r20, 0x01 ; 1 f14e: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degHotend(active_extruder),1); SERIAL_PROTOCOLPGM(" /"); f152: 8e ed ldi r24, 0xDE ; 222 f154: 9b e7 ldi r25, 0x7B ; 123 f156: 0e 94 e8 76 call 0xedd0 ; 0xedd0 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; f15a: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 f15e: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 f162: 07 2e mov r0, r23 f164: 00 0c add r0, r0 f166: 88 0b sbc r24, r24 f168: 99 0b sbc r25, r25 f16a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f16e: 41 e0 ldi r20, 0x01 ; 1 f170: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 #else SERIAL_ERROR_START; SERIAL_ERRORLNRPGM(_n("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS #endif SERIAL_PROTOCOLPGM(" @:"); f174: 8a ed ldi r24, 0xDA ; 218 f176: 9b e7 ldi r25, 0x7B ; 123 f178: 0e 94 e8 76 call 0xedd0 ; 0xedd0 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); f17c: 60 91 15 05 lds r22, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> f180: 70 e0 ldi r23, 0x00 ; 0 f182: 90 e0 ldi r25, 0x00 ; 0 f184: 80 e0 ldi r24, 0x00 ; 0 f186: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOLPGM("W"); #else SERIAL_PROTOCOL(getHeaterPower(active_extruder)); #endif SERIAL_PROTOCOLPGM(" B@:"); f18a: 85 ed ldi r24, 0xD5 ; 213 f18c: 9b e7 ldi r25, 0x7B ; 123 f18e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f192: 60 91 1c 06 lds r22, 0x061C ; 0x80061c f196: 70 e0 ldi r23, 0x00 ; 0 f198: 90 e0 ldi r25, 0x00 ; 0 f19a: 80 e0 ldi r24, 0x00 ; 0 f19c: 0f 94 5f d5 call 0x3aabe ; 0x3aabe #else SERIAL_PROTOCOL(getHeaterPower(-1)); #endif #ifdef PINDA_THERMISTOR SERIAL_PROTOCOLPGM(" P:"); f1a0: 81 ed ldi r24, 0xD1 ; 209 f1a2: 9b e7 ldi r25, 0x7B ; 123 f1a4: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); f1a8: 60 91 97 03 lds r22, 0x0397 ; 0x800397 f1ac: 70 91 98 03 lds r23, 0x0398 ; 0x800398 f1b0: 80 91 99 03 lds r24, 0x0399 ; 0x800399 f1b4: 90 91 9a 03 lds r25, 0x039A ; 0x80039a f1b8: 41 e0 ldi r20, 0x01 ; 1 f1ba: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(current_temperature_pinda,1); #endif //PINDA_THERMISTOR #ifdef AMBIENT_THERMISTOR SERIAL_PROTOCOLPGM(" A:"); f1be: 8d ec ldi r24, 0xCD ; 205 f1c0: 9b e7 ldi r25, 0x7B ; 123 f1c2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 f1c6: 60 91 55 06 lds r22, 0x0655 ; 0x800655 f1ca: 70 91 56 06 lds r23, 0x0656 ; 0x800656 f1ce: 80 91 57 06 lds r24, 0x0657 ; 0x800657 f1d2: 90 91 58 06 lds r25, 0x0658 ; 0x800658 f1d6: 41 e0 ldi r20, 0x01 ; 1 f1d8: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); SERIAL_PROTOCOLPGM(" Rx0->"); SERIAL_PROTOCOL_F(raw, 5); } #endif SERIAL_PROTOCOLLN(); f1dc: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0000f1e0 : } } 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); } f1e0: 20 91 87 14 lds r18, 0x1487 ; 0x801487 f1e4: 30 e0 ldi r19, 0x00 ; 0 f1e6: a8 ee ldi r26, 0xE8 ; 232 f1e8: b3 e0 ldi r27, 0x03 ; 3 f1ea: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> f1ee: ab 01 movw r20, r22 f1f0: bc 01 movw r22, r24 f1f2: 88 e8 ldi r24, 0x88 ; 136 f1f4: 94 e1 ldi r25, 0x14 ; 20 f1f6: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> * Output autoreport values according to features requested in M155 */ #if defined(AUTO_REPORT) void host_autoreport() { if (autoReportFeatures.TimerExpired()) f1fa: 88 23 and r24, r24 f1fc: 99 f0 breq .+38 ; 0xf224 f1fe: 80 91 86 14 lds r24, 0x1486 ; 0x801486 { if(autoReportFeatures.Temp()){ f202: 80 fd sbrc r24, 0 gcode_M105(); f204: 0e 94 5a 78 call 0xf0b4 ; 0xf0b4 f208: 80 91 86 14 lds r24, 0x1486 ; 0x801486 } if(autoReportFeatures.Pos()){ f20c: 82 fd sbrc r24, 2 gcode_M114(); f20e: 0e 94 df 77 call 0xefbe ; 0xefbe f212: 80 91 86 14 lds r24, 0x1486 ; 0x801486 } #if defined(AUTO_REPORT) && (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))) if(autoReportFeatures.Fans()){ f216: 81 fd sbrc r24, 1 gcode_M123(); f218: 0e 94 1c 66 call 0xcc38 ; 0xcc38 } else{ auto_report_timer.stop(); } } inline void TimerStart() { auto_report_timer.start(); } f21c: 88 e8 ldi r24, 0x88 ; 136 f21e: 94 e1 ldi r25, 0x14 ; 20 f220: 0d 94 cb 2c jmp 0x25996 ; 0x25996 ::start()> gcode_M123(); } #endif //AUTO_REPORT and (FANCHECK and TACH_0 or TACH_1) autoReportFeatures.TimerStart(); } } f224: 08 95 ret 0000f226 : ++str; } } void serialprintlnPGM(const char *str) { serialprintPGM(str); f226: 0e 94 e8 76 call 0xedd0 ; 0xedd0 MYSERIAL.println(); f22a: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0000f22e : #endif //TEMP_RESIDENCY_TIME } } void check_babystep() { f22e: 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))); f230: 81 ea ldi r24, 0xA1 ; 161 f232: 9d e0 ldi r25, 0x0D ; 13 f234: 0f 94 10 dc call 0x3b820 ; 0x3b820 } } void check_babystep() { int babystep_z = eeprom_read_word(reinterpret_cast(&(EEPROM_Sheets_base-> f238: cb e0 ldi r28, 0x0B ; 11 f23a: 8c 9f mul r24, r28 f23c: c0 01 movw r24, r0 f23e: 11 24 eor r1, r1 f240: 80 5b subi r24, 0xB0 ; 176 f242: 92 4f sbci r25, 0xF2 ; 242 f244: 0f 94 1e dc call 0x3b83c ; 0x3b83c s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset))); if ((babystep_z < Z_BABYSTEP_MIN) || (babystep_z > Z_BABYSTEP_MAX)) { f248: 81 56 subi r24, 0x61 ; 97 f24a: 90 4f sbci r25, 0xF0 ; 240 f24c: 80 3a cpi r24, 0xA0 ; 160 f24e: 9f 40 sbci r25, 0x0F ; 15 f250: c8 f0 brcs .+50 ; 0xf284 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"); f252: 88 e8 ldi r24, 0x88 ; 136 f254: 9d e7 ldi r25, 0x7D ; 125 f256: 0e 94 13 79 call 0xf226 ; 0xf226 eeprom_write_word_notify(reinterpret_cast(&(EEPROM_Sheets_base-> s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), f25a: 81 ea ldi r24, 0xA1 ; 161 f25c: 9d e0 ldi r25, 0x0D ; 13 f25e: 0f 94 10 dc call 0x3b820 ; 0x3b820 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-> f262: 8c 9f mul r24, r28 f264: c0 01 movw r24, r0 f266: 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); f268: 70 e0 ldi r23, 0x00 ; 0 f26a: 60 e0 ldi r22, 0x00 ; 0 f26c: 80 5b subi r24, 0xB0 ; 176 f26e: 92 4f sbci r25, 0xF2 ; 242 f270: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc 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.")); f274: 8b e4 ldi r24, 0x4B ; 75 f276: 9d e7 ldi r25, 0x7D ; 125 f278: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_update_enable(true); f27c: 81 e0 ldi r24, 0x01 ; 1 } } f27e: 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); f280: 0c 94 bd 6e jmp 0xdd7a ; 0xdd7a } } f284: cf 91 pop r28 f286: 08 95 ret 0000f288 : // This either pauses (for thermal model errors) or stops *without recovery* depending on // "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) { f288: ff 92 push r15 f28a: 0f 93 push r16 f28c: 1f 93 push r17 f28e: cf 93 push r28 f290: df 93 push r29 if(Stopped == false) { f292: 90 91 10 05 lds r25, 0x0510 ; 0x800510 f296: 91 11 cpse r25, r1 f298: 4f c0 rjmp .+158 ; 0xf338 f29a: c8 2f mov r28, r24 Stopped = true; f29c: 81 e0 ldi r24, 0x01 ; 1 f29e: 80 93 10 05 sts 0x0510, r24 ; 0x800510 // Either pause or stop the print if(allow_recovery && printJobOngoing()) { f2a2: cc 23 and r28, r28 f2a4: 11 f1 breq .+68 ; 0xf2ea f2a6: 0e 94 28 67 call 0xce50 ; 0xce50 f2aa: 88 23 and r24, r24 f2ac: f1 f0 breq .+60 ; 0xf2ea if (!printingIsPaused()) { f2ae: 0e 94 1d 67 call 0xce3a ; 0xce3a f2b2: 81 11 cpse r24, r1 f2b4: 22 c0 rjmp .+68 ; 0xf2fa lcd_setalertstatuspgm(_T(MSG_PAUSED_THERMAL_ERROR), LCD_STATUS_CRITICAL); f2b6: 81 ea ldi r24, 0xA1 ; 161 f2b8: 96 e3 ldi r25, 0x36 ; 54 f2ba: 0e 94 44 72 call 0xe488 ; 0xe488 f2be: 63 e0 ldi r22, 0x03 ; 3 f2c0: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac // we cannot make a distinction for the host here, the pause must be instantaneous // so we call the lcd_pause_print to save the print state internally. Thermal errors // disable heaters and save the original temperatures to saved_*, which will get // overwritten by stop_and_save_print_to_ram. For this corner-case, re-instate the // original values after the pause handler is called. uint8_t bed_temp = saved_bed_temperature; f2c4: f0 90 ad 05 lds r15, 0x05AD ; 0x8005ad uint16_t ext_temp = saved_extruder_temperature; f2c8: 00 91 ab 05 lds r16, 0x05AB ; 0x8005ab f2cc: 10 91 ac 05 lds r17, 0x05AC ; 0x8005ac uint8_t fan_speed = saved_fan_speed; f2d0: d0 91 aa 05 lds r29, 0x05AA ; 0x8005aa lcd_pause_print(); f2d4: 0f 94 34 2a call 0x25468 ; 0x25468 saved_bed_temperature = bed_temp; f2d8: f0 92 ad 05 sts 0x05AD, r15 ; 0x8005ad saved_extruder_temperature = ext_temp; f2dc: 10 93 ac 05 sts 0x05AC, r17 ; 0x8005ac f2e0: 00 93 ab 05 sts 0x05AB, r16 ; 0x8005ab saved_fan_speed = fan_speed; f2e4: d0 93 aa 05 sts 0x05AA, r29 ; 0x8005aa f2e8: 08 c0 rjmp .+16 ; 0xf2fa } } else { // We got a hard thermal error and/or there is no print going on. Just stop. print_stop(false, true); f2ea: 61 e0 ldi r22, 0x01 ; 1 f2ec: 80 e0 ldi r24, 0x00 ; 0 f2ee: 0e 94 53 f5 call 0x1eaa6 ; 0x1eaa6 } // Report the error on the serial serialprintPGM(allow_recovery ? echomagic : errormagic); f2f2: 8a ec ldi r24, 0xCA ; 202 f2f4: 9a ea ldi r25, 0xAA ; 170 f2f6: cc 23 and r28, r28 f2f8: 11 f0 breq .+4 ; 0xf2fe f2fa: 82 ef ldi r24, 0xF2 ; 242 f2fc: 9a ea ldi r25, 0xAA ; 170 f2fe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNRPGM(MSG_ERR_STOPPED); f302: 86 e2 ldi r24, 0x26 ; 38 f304: 96 e6 ldi r25, 0x66 ; 102 f306: 0e 94 13 79 call 0xf226 ; 0xf226 // 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)); f30a: 86 e9 ldi r24, 0x96 ; 150 f30c: 96 e3 ldi r25, 0x36 ; 54 f30e: 0e 94 44 72 call 0xe488 ; 0xe488 f312: 0e 94 16 f2 call 0x1e42c ; 0x1e42c // 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); f316: 9f b7 in r25, 0x3f ; 63 f318: f8 94 cli f31a: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> f31e: 84 60 ori r24, 0x04 ; 4 f320: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> f324: 9f bf out 0x3f, r25 ; 63 // Always return to the status screen to ensure the NEW error is immediately shown. lcd_return_to_status(); f326: 0f 94 82 1f call 0x23f04 ; 0x23f04 if(!allow_recovery) { f32a: c1 11 cpse r28, r1 f32c: 05 c0 rjmp .+10 ; 0xf338 // prevent menu access for all fatal errors menu_set_block(MENU_BLOCK_THERMAL_ERROR); f32e: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 f332: 81 60 ori r24, 0x01 ; 1 f334: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 } } } f338: df 91 pop r29 f33a: cf 91 pop r28 f33c: 1f 91 pop r17 f33e: 0f 91 pop r16 f340: ff 90 pop r15 f342: 08 95 ret 0000f344 : #endif //AUTO_REPORT host_keepalive(); M79_timer_update_status(); } void kill(const char *full_screen_message) { f344: ec 01 movw r28, r24 cli(); // Stop interrupts f346: f8 94 cli disable_heater(); f348: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 disable_x(); f34c: 17 9a sbi 0x02, 7 ; 2 f34e: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e disable_y(); f352: 16 9a sbi 0x02, 6 ; 2 f354: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f poweroff_z(); disable_e0(); f358: 14 9a sbi 0x02, 4 ; 2 SERIAL_ERROR_START; f35a: 8a ec ldi r24, 0xCA ; 202 f35c: 9a ea ldi r25, 0xAA ; 170 f35e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!")); f362: 8c e2 ldi r24, 0x2C ; 44 f364: 9d e7 ldi r25, 0x7D ; 125 f366: 0e 94 13 79 call 0xf226 ; 0xf226 if (full_screen_message != NULL) { f36a: 20 97 sbiw r28, 0x00 ; 0 f36c: 79 f0 breq .+30 ; 0xf38c SERIAL_ERRORLNRPGM(full_screen_message); f36e: ce 01 movw r24, r28 f370: 0e 94 13 79 call 0xf226 ; 0xf226 f374: be 01 movw r22, r28 f376: 85 e9 ldi r24, 0x95 ; 149 f378: 9c e0 ldi r25, 0x0C ; 12 f37a: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc 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); f37e: 62 e4 ldi r22, 0x42 ; 66 f380: 84 e9 ldi r24, 0x94 ; 148 f382: 9c e0 ldi r25, 0x0C ; 12 f384: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 // 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(); f388: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!")); if (full_screen_message != NULL) { SERIAL_ERRORLNRPGM(full_screen_message); } else { full_screen_message = PSTR("KILLED."); f38c: c4 e2 ldi r28, 0x24 ; 36 f38e: dd e7 ldi r29, 0x7D ; 125 f390: f1 cf rjmp .-30 ; 0xf374 0000f392 : #endif //TMC2130 #ifdef TMC2130 void check_Z_crash(void) { if (!READ(Z_TMC2130_DIAG)) { //Z crash f392: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> f396: 86 fd sbrc r24, 6 f398: 35 c0 rjmp .+106 ; 0xf404 FORCE_HIGH_POWER_END; f39a: 80 e0 ldi r24, 0x00 ; 0 f39c: 0e 94 48 66 call 0xcc90 ; 0xcc90 current_position[Z_AXIS] = 0; f3a0: 10 92 99 06 sts 0x0699, r1 ; 0x800699 f3a4: 10 92 9a 06 sts 0x069A, r1 ; 0x80069a f3a8: 10 92 9b 06 sts 0x069B, r1 ; 0x80069b f3ac: 10 92 9c 06 sts 0x069C, r1 ; 0x80069c plan_set_position_curposXYZE(); f3b0: 0f 94 fd be call 0x37dfa ; 0x37dfa current_position[Z_AXIS] += MESH_HOME_Z_SEARCH; f3b4: 20 e0 ldi r18, 0x00 ; 0 f3b6: 30 e0 ldi r19, 0x00 ; 0 f3b8: 40 ea ldi r20, 0xA0 ; 160 f3ba: 50 e4 ldi r21, 0x40 ; 64 f3bc: 60 91 99 06 lds r22, 0x0699 ; 0x800699 f3c0: 70 91 9a 06 lds r23, 0x069A ; 0x80069a f3c4: 80 91 9b 06 lds r24, 0x069B ; 0x80069b f3c8: 90 91 9c 06 lds r25, 0x069C ; 0x80069c f3cc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> f3d0: 60 93 99 06 sts 0x0699, r22 ; 0x800699 f3d4: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a f3d8: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b f3dc: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]); f3e0: e0 91 71 02 lds r30, 0x0271 ; 0x800271 f3e4: f0 91 72 02 lds r31, 0x0272 ; 0x800272 f3e8: 60 85 ldd r22, Z+8 ; 0x08 f3ea: 71 85 ldd r23, Z+9 ; 0x09 f3ec: 82 85 ldd r24, Z+10 ; 0x0a f3ee: 93 85 ldd r25, Z+11 ; 0x0b f3f0: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); f3f4: 0f 94 a9 43 call 0x28752 ; 0x28752 kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); f3f8: 89 ec ldi r24, 0xC9 ; 201 f3fa: 93 e6 ldi r25, 0x63 ; 99 f3fc: 0e 94 44 72 call 0xe488 ; 0xe488 f400: 0e 94 a2 79 call 0xf344 ; 0xf344 } } f404: 08 95 ret 0000f406 : #ifdef TMC2130 void homeaxis(uint8_t axis, uint8_t cnt, uint8_t* pstep) #else void homeaxis(uint8_t axis, uint8_t cnt) #endif //TMC2130 { f406: 2f 92 push r2 f408: 3f 92 push r3 f40a: 4f 92 push r4 f40c: 5f 92 push r5 f40e: 6f 92 push r6 f410: 7f 92 push r7 f412: 8f 92 push r8 f414: 9f 92 push r9 f416: af 92 push r10 f418: bf 92 push r11 f41a: cf 92 push r12 f41c: df 92 push r13 f41e: ef 92 push r14 f420: ff 92 push r15 f422: 0f 93 push r16 f424: 1f 93 push r17 f426: cf 93 push r28 f428: df 93 push r29 f42a: cd b7 in r28, 0x3d ; 61 f42c: de b7 in r29, 0x3e ; 62 f42e: 60 97 sbiw r28, 0x10 ; 16 f430: 0f b6 in r0, 0x3f ; 63 f432: f8 94 cli f434: de bf out 0x3e, r29 ; 62 f436: 0f be out 0x3f, r0 ; 63 f438: cd bf out 0x3d, r28 ; 61 f43a: 28 2e mov r2, r24 f43c: 6e 87 std Y+14, r22 ; 0x0e f43e: 5a 87 std Y+10, r21 ; 0x0a f440: 49 87 std Y+9, r20 ; 0x09 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; f442: 20 91 b7 02 lds r18, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> f446: 2d 87 std Y+13, r18 ; 0x0d check_endstops = check; f448: 77 24 eor r7, r7 f44a: 73 94 inc r7 f44c: 70 92 b7 02 sts 0x02B7, r7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> 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) f450: 42 e0 ldi r20, 0x02 ; 2 f452: 84 17 cp r24, r20 f454: 09 f4 brne .+2 ; 0xf458 f456: d4 c1 rjmp .+936 ; 0xf800 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); f458: 08 2f mov r16, r24 f45a: 10 e0 ldi r17, 0x00 ; 0 f45c: f8 01 movw r30, r16 f45e: e6 53 subi r30, 0x36 ; 54 f460: f4 48 sbci r31, 0x84 ; 132 #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); f462: 34 90 lpm r3, Z 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) { int axis_home_dir = home_dir(axis); f464: 83 2d mov r24, r3 f466: 03 2c mov r0, r3 f468: 00 0c add r0, r0 f46a: 99 0b sbc r25, r25 f46c: 9c 87 std Y+12, r25 ; 0x0c f46e: 8b 87 std Y+11, r24 ; 0x0b feedrate = homing_feedrate[axis]; f470: d8 01 movw r26, r16 f472: aa 0f add r26, r26 f474: bb 1f adc r27, r27 f476: aa 0f add r26, r26 f478: bb 1f adc r27, r27 f47a: ba 83 std Y+2, r27 ; 0x02 f47c: a9 83 std Y+1, r26 ; 0x01 f47e: fd 01 movw r30, r26 f480: e3 53 subi r30, 0x33 ; 51 f482: fd 4f sbci r31, 0xFD ; 253 f484: 80 81 ld r24, Z f486: 91 81 ldd r25, Z+1 ; 0x01 f488: a2 81 ldd r26, Z+2 ; 0x02 f48a: b3 81 ldd r27, Z+3 ; 0x03 f48c: 8b 83 std Y+3, r24 ; 0x03 f48e: 9c 83 std Y+4, r25 ; 0x04 f490: ad 83 std Y+5, r26 ; 0x05 f492: be 83 std Y+6, r27 ; 0x06 f494: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 f498: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 f49c: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba f4a0: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb float feedrate_mm_s = get_feedrate_mm_s(feedrate); f4a4: bc 01 movw r22, r24 f4a6: cd 01 movw r24, r26 f4a8: 0e 94 5f 66 call 0xccbe ; 0xccbe f4ac: 6b 01 movw r12, r22 f4ae: 7c 01 movw r14, r24 #ifdef TMC2130 tmc2130_home_enter(X_AXIS_MASK << axis); f4b0: 81 e0 ldi r24, 0x01 ; 1 f4b2: 02 2c mov r0, r2 f4b4: 01 c0 rjmp .+2 ; 0xf4b8 f4b6: 88 0f add r24, r24 f4b8: 0a 94 dec r0 f4ba: ea f7 brpl .-6 ; 0xf4b6 f4bc: 0f 94 b4 26 call 0x24d68 ; 0x24d68 // 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; f4c0: a9 81 ldd r26, Y+1 ; 0x01 f4c2: ba 81 ldd r27, Y+2 ; 0x02 f4c4: af 56 subi r26, 0x6F ; 111 f4c6: b9 4f sbci r27, 0xF9 ; 249 f4c8: b8 87 std Y+8, r27 ; 0x08 f4ca: af 83 std Y+7, r26 ; 0x07 f4cc: fd 01 movw r30, r26 f4ce: 10 82 st Z, r1 f4d0: 11 82 std Z+1, r1 ; 0x01 f4d2: 12 82 std Z+2, r1 ; 0x02 f4d4: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); f4d6: 0f 94 fd be call 0x37dfa ; 0x37dfa set_destination_to_current(); f4da: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 // destination[axis] = 11.f; destination[axis] = -3.f * axis_home_dir; f4de: 63 2d mov r22, r3 f4e0: 03 2c mov r0, r3 f4e2: 00 0c add r0, r0 f4e4: 77 0b sbc r23, r23 f4e6: 88 0b sbc r24, r24 f4e8: 99 0b sbc r25, r25 f4ea: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f4ee: 4b 01 movw r8, r22 f4f0: 5c 01 movw r10, r24 f4f2: 49 81 ldd r20, Y+1 ; 0x01 f4f4: 5a 81 ldd r21, Y+2 ; 0x02 f4f6: 4d 58 subi r20, 0x8D ; 141 f4f8: 59 4f sbci r21, 0xF9 ; 249 f4fa: 58 8b std Y+16, r21 ; 0x10 f4fc: 4f 87 std Y+15, r20 ; 0x0f f4fe: 20 e0 ldi r18, 0x00 ; 0 f500: 30 e0 ldi r19, 0x00 ; 0 f502: 40 e4 ldi r20, 0x40 ; 64 f504: 50 ec ldi r21, 0xC0 ; 192 f506: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f50a: af 85 ldd r26, Y+15 ; 0x0f f50c: b8 89 ldd r27, Y+16 ; 0x10 f50e: 6d 93 st X+, r22 f510: 7d 93 st X+, r23 f512: 8d 93 st X+, r24 f514: 9c 93 st X, r25 f516: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); f518: c7 01 movw r24, r14 f51a: b6 01 movw r22, r12 f51c: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f520: 0f 94 a9 43 call 0x28752 ; 0x28752 // Move away from the possible collision with opposite endstop with the collision detection disabled. endstops_hit_on_purpose(); f524: 0f 94 bf 4e call 0x29d7e ; 0x29d7e f528: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); current_position[axis] = 0; f52c: ef 81 ldd r30, Y+7 ; 0x07 f52e: f8 85 ldd r31, Y+8 ; 0x08 f530: 10 82 st Z, r1 f532: 11 82 std Z+1, r1 ; 0x01 f534: 12 82 std Z+2, r1 ; 0x02 f536: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); f538: 0f 94 fd be call 0x37dfa ; 0x37dfa destination[axis] = 1. * axis_home_dir; f53c: af 85 ldd r26, Y+15 ; 0x0f f53e: b8 89 ldd r27, Y+16 ; 0x10 f540: 8d 92 st X+, r8 f542: 9d 92 st X+, r9 f544: ad 92 st X+, r10 f546: bc 92 st X, r11 f548: 13 97 sbiw r26, 0x03 ; 3 plan_buffer_line_destinationXYZE(feedrate_mm_s); f54a: c7 01 movw r24, r14 f54c: b6 01 movw r22, r12 f54e: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f552: 0f 94 a9 43 call 0x28752 ; 0x28752 f556: 70 92 b7 02 sts 0x02B7, r7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> { 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); f55a: e9 81 ldd r30, Y+1 ; 0x01 f55c: fa 81 ldd r31, Y+2 ; 0x02 f55e: e2 54 subi r30, 0x42 ; 66 f560: f4 48 sbci r31, 0x84 ; 132 #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); f562: 45 90 lpm r4, Z+ f564: 55 90 lpm r5, Z+ f566: 65 90 lpm r6, Z+ f568: 74 90 lpm r7, Z 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); f56a: 2d ec ldi r18, 0xCD ; 205 f56c: 3c ec ldi r19, 0xCC ; 204 f56e: 4c e8 ldi r20, 0x8C ; 140 f570: 5f e3 ldi r21, 0x3F ; 63 f572: c5 01 movw r24, r10 f574: b4 01 movw r22, r8 f576: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f57a: a3 01 movw r20, r6 f57c: 92 01 movw r18, r4 f57e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f582: ef 85 ldd r30, Y+15 ; 0x0f f584: f8 89 ldd r31, Y+16 ; 0x10 f586: 60 83 st Z, r22 f588: 71 83 std Z+1, r23 ; 0x01 f58a: 82 83 std Z+2, r24 ; 0x02 f58c: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_destinationXYZE(feedrate_mm_s); f58e: c7 01 movw r24, r14 f590: b6 01 movw r22, r12 f592: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f596: 0f 94 a9 43 call 0x28752 ; 0x28752 f59a: 71 2c mov r7, r1 f59c: 61 2c mov r6, r1 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(); enable_endstops(false); current_position[axis] = 0; f59e: 4f 80 ldd r4, Y+7 ; 0x07 f5a0: 58 84 ldd r5, Y+8 ; 0x08 plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); 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(); f5a2: 0f 94 bf 4e call 0x29d7e ; 0x29d7e f5a6: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); current_position[axis] = 0; f5aa: d2 01 movw r26, r4 f5ac: 1d 92 st X+, r1 f5ae: 1d 92 st X+, r1 f5b0: 1d 92 st X+, r1 f5b2: 1c 92 st X, r1 f5b4: 13 97 sbiw r26, 0x03 ; 3 plan_set_position_curposXYZE(); f5b6: 0f 94 fd be call 0x37dfa ; 0x37dfa destination[axis] = -10.f * axis_home_dir; f5ba: 20 e0 ldi r18, 0x00 ; 0 f5bc: 30 e0 ldi r19, 0x00 ; 0 f5be: 40 e2 ldi r20, 0x20 ; 32 f5c0: 51 ec ldi r21, 0xC1 ; 193 f5c2: c5 01 movw r24, r10 f5c4: b4 01 movw r22, r8 f5c6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f5ca: ef 85 ldd r30, Y+15 ; 0x0f f5cc: f8 89 ldd r31, Y+16 ; 0x10 f5ce: 60 83 st Z, r22 f5d0: 71 83 std Z+1, r23 ; 0x01 f5d2: 82 83 std Z+2, r24 ; 0x02 f5d4: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_destinationXYZE(feedrate_mm_s); f5d6: c7 01 movw r24, r14 f5d8: b6 01 movw r22, r12 f5da: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f5de: 0f 94 a9 43 call 0x28752 ; 0x28752 endstops_hit_on_purpose(); f5e2: 0f 94 bf 4e call 0x29d7e ; 0x29d7e f5e6: f1 e0 ldi r31, 0x01 ; 1 f5e8: f0 93 b7 02 sts 0x02B7, r31 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> // Now move left up to the collision, this time with a repeatable velocity. enable_endstops(true); destination[axis] = 11.f * axis_home_dir; f5ec: 20 e0 ldi r18, 0x00 ; 0 f5ee: 30 e0 ldi r19, 0x00 ; 0 f5f0: 40 e3 ldi r20, 0x30 ; 48 f5f2: 51 e4 ldi r21, 0x41 ; 65 f5f4: c5 01 movw r24, r10 f5f6: b4 01 movw r22, r8 f5f8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f5fc: af 85 ldd r26, Y+15 ; 0x0f f5fe: b8 89 ldd r27, Y+16 ; 0x10 f600: 6d 93 st X+, r22 f602: 7d 93 st X+, r23 f604: 8d 93 st X+, r24 f606: 9c 93 st X, r25 f608: 13 97 sbiw r26, 0x03 ; 3 #ifdef TMC2130 feedrate = homing_feedrate[axis]; f60a: 8b 81 ldd r24, Y+3 ; 0x03 f60c: 9c 81 ldd r25, Y+4 ; 0x04 f60e: ad 81 ldd r26, Y+5 ; 0x05 f610: be 81 ldd r27, Y+6 ; 0x06 f612: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 f616: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 f61a: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba f61e: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb #else //TMC2130 feedrate = homing_feedrate[axis] / 2; feedrate_mm_s = get_feedrate_mm_s(feedrate); #endif //TMC2130 plan_buffer_line_destinationXYZE(feedrate_mm_s); f622: c7 01 movw r24, r14 f624: b6 01 movw r22, r12 f626: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f62a: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef TMC2130 uint16_t mscnt = tmc2130_rd_MSCNT(axis); f62e: 82 2d mov r24, r2 f630: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 f634: 9c 01 movw r18, r24 f636: 44 e0 ldi r20, 0x04 ; 4 f638: 36 95 lsr r19 f63a: 27 95 ror r18 f63c: 4a 95 dec r20 f63e: e1 f7 brne .-8 ; 0xf638 if (pstep) pstep[i] = mscnt >> 4; f640: a9 85 ldd r26, Y+9 ; 0x09 f642: ba 85 ldd r27, Y+10 ; 0x0a f644: 10 97 sbiw r26, 0x00 ; 0 f646: 21 f0 breq .+8 ; 0xf650 f648: fd 01 movw r30, r26 f64a: e6 0d add r30, r6 f64c: f7 1d adc r31, r7 f64e: 20 83 st Z, r18 printf_P(PSTR("%3d step=%2d mscnt=%4d\n"), i, mscnt >> 4, mscnt); f650: 9f 93 push r25 f652: 8f 93 push r24 f654: 3f 93 push r19 f656: 2f 93 push r18 f658: 7f 92 push r7 f65a: 6f 92 push r6 f65c: e6 ea ldi r30, 0xA6 ; 166 f65e: fb e7 ldi r31, 0x7B ; 123 f660: ff 93 push r31 f662: ef 93 push r30 f664: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 f668: 4f ef ldi r20, 0xFF ; 255 f66a: 64 1a sub r6, r20 f66c: 74 0a sbc r7, r20 // 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); plan_buffer_line_destinationXYZE(feedrate_mm_s); st_synchronize(); for (uint8_t i = 0; i < cnt; i++) f66e: 0f b6 in r0, 0x3f ; 63 f670: f8 94 cli f672: de bf out 0x3e, r29 ; 62 f674: 0f be out 0x3f, r0 ; 63 f676: cd bf out 0x3d, r28 ; 61 f678: 9e 85 ldd r25, Y+14 ; 0x0e f67a: 69 16 cp r6, r25 f67c: 08 f4 brcc .+2 ; 0xf680 f67e: 91 cf rjmp .-222 ; 0xf5a2 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(); f680: 0f 94 bf 4e call 0x29d7e ; 0x29d7e f684: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); #ifdef TMC2130 uint8_t orig = tmc2130_home_origin[axis]; uint8_t back = tmc2130_home_bsteps[axis]; if (tmc2130_home_enabled && (orig <= 63)) f688: 80 91 f1 04 lds r24, 0x04F1 ; 0x8004f1 f68c: 88 23 and r24, r24 f68e: 09 f4 brne .+2 ; 0xf692 f690: b2 c0 rjmp .+356 ; 0xf7f6 } endstops_hit_on_purpose(); enable_endstops(false); #ifdef TMC2130 uint8_t orig = tmc2130_home_origin[axis]; f692: f8 01 movw r30, r16 f694: ee 50 subi r30, 0x0E ; 14 f696: fb 4f sbci r31, 0xFB ; 251 f698: 60 81 ld r22, Z uint8_t back = tmc2130_home_bsteps[axis]; if (tmc2130_home_enabled && (orig <= 63)) f69a: 60 34 cpi r22, 0x40 ; 64 f69c: 08 f0 brcs .+2 ; 0xf6a0 f69e: ab c0 rjmp .+342 ; 0xf7f6 endstops_hit_on_purpose(); enable_endstops(false); #ifdef TMC2130 uint8_t orig = tmc2130_home_origin[axis]; uint8_t back = tmc2130_home_bsteps[axis]; f6a0: f8 01 movw r30, r16 f6a2: e6 5a subi r30, 0xA6 ; 166 f6a4: fd 4f sbci r31, 0xFD ; 253 f6a6: a0 81 ld r26, Z f6a8: ab 83 std Y+3, r26 ; 0x03 return stat; } uint16_t tmc2130_get_res(uint8_t axis) { return tmc2130_mres2usteps(tmc2130_mres[axis]); f6aa: f8 01 movw r30, r16 f6ac: ec 50 subi r30, 0x0C ; 12 f6ae: fb 4f sbci r31, 0xFB ; 251 f6b0: 80 81 ld r24, Z f6b2: 40 e0 ldi r20, 0x00 ; 0 f6b4: 51 e0 ldi r21, 0x01 ; 1 f6b6: 02 c0 rjmp .+4 ; 0xf6bc f6b8: 56 95 lsr r21 f6ba: 47 95 ror r20 f6bc: 8a 95 dec r24 f6be: e2 f7 brpl .-8 ; 0xf6b8 if (tmc2130_home_enabled && (orig <= 63)) { tmc2130_goto_step(axis, orig, 2, 1000, tmc2130_get_res(axis)); f6c0: 82 2d mov r24, r2 f6c2: 0f 94 97 8b call 0x3172e ; 0x3172e if (back > 0) f6c6: bb 81 ldd r27, Y+3 ; 0x03 f6c8: bb 23 and r27, r27 f6ca: 39 f0 breq .+14 ; 0xf6da tmc2130_do_steps(axis, back, -axis_home_dir, 1000); f6cc: 43 2d mov r20, r3 f6ce: 41 95 neg r20 f6d0: 6b 2f mov r22, r27 f6d2: 70 e0 ldi r23, 0x00 ; 0 } else tmc2130_do_steps(axis, 8, -axis_home_dir, 1000); f6d4: 82 2d mov r24, r2 f6d6: 0f 94 68 8b call 0x316d0 ; 0x316d0 tmc2130_home_exit(); f6da: 0f 94 85 26 call 0x24d0a ; 0x24d0a #endif //TMC2130 axis_is_at_home(axis); f6de: 82 2d mov r24, r2 f6e0: 0e 94 42 5a call 0xb484 ; 0xb484 axis_known_position[axis] = true; f6e4: f8 01 movw r30, r16 f6e6: e2 57 subi r30, 0x72 ; 114 f6e8: f9 4f sbci r31, 0xF9 ; 249 f6ea: 81 e0 ldi r24, 0x01 ; 1 f6ec: 80 83 st Z, r24 // Move from minimum #ifdef TMC2130 float dist = - axis_home_dir * 0.01f * tmc2130_home_fsteps[axis]; f6ee: 6b 85 ldd r22, Y+11 ; 0x0b f6f0: 7c 85 ldd r23, Y+12 ; 0x0c f6f2: 71 95 neg r23 f6f4: 61 95 neg r22 f6f6: 71 09 sbc r23, r1 f6f8: 07 2e mov r0, r23 f6fa: 00 0c add r0, r0 f6fc: 88 0b sbc r24, r24 f6fe: 99 0b sbc r25, r25 f700: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f704: 2a e0 ldi r18, 0x0A ; 10 f706: 37 ed ldi r19, 0xD7 ; 215 f708: 43 e2 ldi r20, 0x23 ; 35 f70a: 5c e3 ldi r21, 0x3C ; 60 f70c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f710: 4b 01 movw r8, r22 f712: 5c 01 movw r10, r24 f714: f8 01 movw r30, r16 f716: e8 5a subi r30, 0xA8 ; 168 f718: fd 4f sbci r31, 0xFD ; 253 f71a: 60 81 ld r22, Z f71c: 70 e0 ldi r23, 0x00 ; 0 f71e: 90 e0 ldi r25, 0x00 ; 0 f720: 80 e0 ldi r24, 0x00 ; 0 f722: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f726: 9b 01 movw r18, r22 f728: ac 01 movw r20, r24 f72a: c5 01 movw r24, r10 f72c: b4 01 movw r22, r8 f72e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f732: 4b 01 movw r8, r22 f734: 5c 01 movw r10, r24 #else //TMC2130 float dist = - axis_home_dir * 0.01f * 64; #endif //TMC2130 current_position[axis] -= dist; f736: e9 81 ldd r30, Y+1 ; 0x01 f738: fa 81 ldd r31, Y+2 ; 0x02 f73a: ef 56 subi r30, 0x6F ; 111 f73c: f9 4f sbci r31, 0xF9 ; 249 f73e: fc 83 std Y+4, r31 ; 0x04 f740: eb 83 std Y+3, r30 ; 0x03 f742: ac 01 movw r20, r24 f744: 9b 01 movw r18, r22 f746: 60 81 ld r22, Z f748: 71 81 ldd r23, Z+1 ; 0x01 f74a: 82 81 ldd r24, Z+2 ; 0x02 f74c: 93 81 ldd r25, Z+3 ; 0x03 f74e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> f752: ab 81 ldd r26, Y+3 ; 0x03 f754: bc 81 ldd r27, Y+4 ; 0x04 f756: 6d 93 st X+, r22 f758: 7d 93 st X+, r23 f75a: 8d 93 st X+, r24 f75c: 9c 93 st X, r25 f75e: 13 97 sbiw r26, 0x03 ; 3 plan_set_position_curposXYZE(); f760: 0f 94 fd be call 0x37dfa ; 0x37dfa current_position[axis] += dist; f764: eb 81 ldd r30, Y+3 ; 0x03 f766: fc 81 ldd r31, Y+4 ; 0x04 f768: 20 81 ld r18, Z f76a: 31 81 ldd r19, Z+1 ; 0x01 f76c: 42 81 ldd r20, Z+2 ; 0x02 f76e: 53 81 ldd r21, Z+3 ; 0x03 f770: c5 01 movw r24, r10 f772: b4 01 movw r22, r8 f774: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> f778: ab 81 ldd r26, Y+3 ; 0x03 f77a: bc 81 ldd r27, Y+4 ; 0x04 f77c: 6d 93 st X+, r22 f77e: 7d 93 st X+, r23 f780: 8d 93 st X+, r24 f782: 9c 93 st X, r25 f784: 13 97 sbiw r26, 0x03 ; 3 destination[axis] = current_position[axis]; f786: e9 81 ldd r30, Y+1 ; 0x01 f788: fa 81 ldd r31, Y+2 ; 0x02 f78a: ed 58 subi r30, 0x8D ; 141 f78c: f9 4f sbci r31, 0xF9 ; 249 f78e: 60 83 st Z, r22 f790: 71 83 std Z+1, r23 ; 0x01 f792: 82 83 std Z+2, r24 ; 0x02 f794: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_destinationXYZE(0.5f*feedrate_mm_s); f796: 20 e0 ldi r18, 0x00 ; 0 f798: 30 e0 ldi r19, 0x00 ; 0 f79a: 40 e0 ldi r20, 0x00 ; 0 f79c: 5f e3 ldi r21, 0x3F ; 63 f79e: c7 01 movw r24, r14 f7a0: b6 01 movw r22, r12 f7a2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f7a6: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f7aa: 0f 94 a9 43 call 0x28752 ; 0x28752 feedrate = 0.0; f7ae: 10 92 b8 02 sts 0x02B8, r1 ; 0x8002b8 f7b2: 10 92 b9 02 sts 0x02B9, r1 ; 0x8002b9 f7b6: 10 92 ba 02 sts 0x02BA, r1 ; 0x8002ba f7ba: 10 92 bb 02 sts 0x02BB, r1 ; 0x8002bb f7be: fd 85 ldd r31, Y+13 ; 0x0d f7c0: f0 93 b7 02 sts 0x02B7, r31 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #ifdef TMC2130 FORCE_HIGH_POWER_END; #endif } enable_endstops(endstops_enabled); } f7c4: 60 96 adiw r28, 0x10 ; 16 f7c6: 0f b6 in r0, 0x3f ; 63 f7c8: f8 94 cli f7ca: de bf out 0x3e, r29 ; 62 f7cc: 0f be out 0x3f, r0 ; 63 f7ce: cd bf out 0x3d, r28 ; 61 f7d0: df 91 pop r29 f7d2: cf 91 pop r28 f7d4: 1f 91 pop r17 f7d6: 0f 91 pop r16 f7d8: ff 90 pop r15 f7da: ef 90 pop r14 f7dc: df 90 pop r13 f7de: cf 90 pop r12 f7e0: bf 90 pop r11 f7e2: af 90 pop r10 f7e4: 9f 90 pop r9 f7e6: 8f 90 pop r8 f7e8: 7f 90 pop r7 f7ea: 6f 90 pop r6 f7ec: 5f 90 pop r5 f7ee: 4f 90 pop r4 f7f0: 3f 90 pop r3 f7f2: 2f 90 pop r2 f7f4: 08 95 ret tmc2130_goto_step(axis, orig, 2, 1000, tmc2130_get_res(axis)); if (back > 0) tmc2130_do_steps(axis, back, -axis_home_dir, 1000); } else tmc2130_do_steps(axis, 8, -axis_home_dir, 1000); f7f6: 43 2d mov r20, r3 f7f8: 41 95 neg r20 f7fa: 68 e0 ldi r22, 0x08 ; 8 f7fc: 70 e0 ldi r23, 0x00 ; 0 f7fe: 6a cf rjmp .-300 ; 0xf6d4 feedrate = 0.0; } else if ((axis==Z_AXIS)?HOMEAXIS_DO(Z):0) { #ifdef TMC2130 FORCE_HIGH_POWER_START; f800: 81 e0 ldi r24, 0x01 ; 1 f802: 0e 94 48 66 call 0xcc90 ; 0xcc90 #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); f806: ec ec ldi r30, 0xCC ; 204 f808: fb e7 ldi r31, 0x7B ; 123 f80a: b4 91 lpm r27, Z f80c: 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; f80e: 10 92 99 06 sts 0x0699, r1 ; 0x800699 f812: 10 92 9a 06 sts 0x069A, r1 ; 0x80069a f816: 10 92 9b 06 sts 0x069B, r1 ; 0x80069b f81a: 10 92 9c 06 sts 0x069C, r1 ; 0x80069c plan_set_position_curposXYZE(); f81e: 0f 94 fd be call 0x37dfa ; 0x37dfa #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); f822: e6 ec ldi r30, 0xC6 ; 198 f824: fb e7 ldi r31, 0x7B ; 123 f826: 85 90 lpm r8, Z+ f828: 95 90 lpm r9, Z+ f82a: a5 90 lpm r10, Z+ f82c: 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; f82e: e9 81 ldd r30, Y+1 ; 0x01 f830: 6e 2f mov r22, r30 f832: ee 0f add r30, r30 f834: 77 0b sbc r23, r23 f836: 88 0b sbc r24, r24 f838: 99 0b sbc r25, r25 f83a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> f83e: 6b 01 movw r12, r22 f840: 7c 01 movw r14, r24 f842: 20 e0 ldi r18, 0x00 ; 0 f844: 30 e0 ldi r19, 0x00 ; 0 f846: 40 ec ldi r20, 0xC0 ; 192 f848: 5f e3 ldi r21, 0x3F ; 63 f84a: c5 01 movw r24, r10 f84c: b4 01 movw r22, r8 f84e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f852: a7 01 movw r20, r14 f854: 96 01 movw r18, r12 f856: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f85a: 60 93 7b 06 sts 0x067B, r22 ; 0x80067b f85e: 70 93 7c 06 sts 0x067C, r23 ; 0x80067c f862: 80 93 7d 06 sts 0x067D, r24 ; 0x80067d f866: 90 93 7e 06 sts 0x067E, r25 ; 0x80067e feedrate = homing_feedrate[axis]; f86a: 80 e0 ldi r24, 0x00 ; 0 f86c: 90 e0 ldi r25, 0x00 ; 0 f86e: a8 e4 ldi r26, 0x48 ; 72 f870: b4 e4 ldi r27, 0x44 ; 68 f872: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 f876: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 f87a: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba f87e: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb float feedrate_mm_s = get_feedrate_mm_s(feedrate); f882: bc 01 movw r22, r24 f884: cd 01 movw r24, r26 f886: 0e 94 5f 66 call 0xccbe ; 0xccbe f88a: 4b 01 movw r8, r22 f88c: 5c 01 movw r10, r24 plan_buffer_line_destinationXYZE(feedrate_mm_s); f88e: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f892: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef TMC2130 check_Z_crash(); f896: 0e 94 c9 79 call 0xf392 ; 0xf392 #endif //TMC2130 current_position[axis] = 0; f89a: 10 92 99 06 sts 0x0699, r1 ; 0x800699 f89e: 10 92 9a 06 sts 0x069A, r1 ; 0x80069a f8a2: 10 92 9b 06 sts 0x069B, r1 ; 0x80069b f8a6: 10 92 9c 06 sts 0x069C, r1 ; 0x80069c plan_set_position_curposXYZE(); f8aa: 0f 94 fd be call 0x37dfa ; 0x37dfa #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); f8ae: e2 ea ldi r30, 0xA2 ; 162 f8b0: fb e7 ldi r31, 0x7B ; 123 f8b2: 65 91 lpm r22, Z+ f8b4: 75 91 lpm r23, Z+ f8b6: 85 91 lpm r24, Z+ f8b8: 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; f8ba: 90 58 subi r25, 0x80 ; 128 f8bc: a7 01 movw r20, r14 f8be: 96 01 movw r18, r12 f8c0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f8c4: 60 93 7b 06 sts 0x067B, r22 ; 0x80067b f8c8: 70 93 7c 06 sts 0x067C, r23 ; 0x80067c f8cc: 80 93 7d 06 sts 0x067D, r24 ; 0x80067d f8d0: 90 93 7e 06 sts 0x067E, r25 ; 0x80067e plan_buffer_line_destinationXYZE(feedrate_mm_s); f8d4: c5 01 movw r24, r10 f8d6: b4 01 movw r22, r8 f8d8: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f8dc: 0f 94 a9 43 call 0x28752 ; 0x28752 #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); f8e0: e2 ea ldi r30, 0xA2 ; 162 f8e2: fb e7 ldi r31, 0x7B ; 123 f8e4: 65 91 lpm r22, Z+ f8e6: 75 91 lpm r23, Z+ f8e8: 85 91 lpm r24, Z+ f8ea: 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; f8ec: 9b 01 movw r18, r22 f8ee: ac 01 movw r20, r24 f8f0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> f8f4: a7 01 movw r20, r14 f8f6: 96 01 movw r18, r12 f8f8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> f8fc: 60 93 7b 06 sts 0x067B, r22 ; 0x80067b f900: 70 93 7c 06 sts 0x067C, r23 ; 0x80067c f904: 80 93 7d 06 sts 0x067D, r24 ; 0x80067d f908: 90 93 7e 06 sts 0x067E, r25 ; 0x80067e feedrate = homing_feedrate[axis] / 2; f90c: 80 e0 ldi r24, 0x00 ; 0 f90e: 90 e0 ldi r25, 0x00 ; 0 f910: a8 ec ldi r26, 0xC8 ; 200 f912: b3 e4 ldi r27, 0x43 ; 67 f914: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 f918: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 f91c: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba f920: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb feedrate_mm_s = get_feedrate_mm_s(feedrate); f924: bc 01 movw r22, r24 f926: cd 01 movw r24, r26 f928: 0e 94 5f 66 call 0xccbe ; 0xccbe plan_buffer_line_destinationXYZE(feedrate_mm_s); f92c: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); f930: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef TMC2130 check_Z_crash(); f934: 0e 94 c9 79 call 0xf392 ; 0xf392 #endif //TMC2130 axis_is_at_home(axis); f938: 82 e0 ldi r24, 0x02 ; 2 f93a: 0e 94 42 5a call 0xb484 ; 0xb484 destination[axis] = current_position[axis]; f93e: 80 91 99 06 lds r24, 0x0699 ; 0x800699 f942: 90 91 9a 06 lds r25, 0x069A ; 0x80069a f946: a0 91 9b 06 lds r26, 0x069B ; 0x80069b f94a: b0 91 9c 06 lds r27, 0x069C ; 0x80069c f94e: 80 93 7b 06 sts 0x067B, r24 ; 0x80067b f952: 90 93 7c 06 sts 0x067C, r25 ; 0x80067c f956: a0 93 7d 06 sts 0x067D, r26 ; 0x80067d f95a: b0 93 7e 06 sts 0x067E, r27 ; 0x80067e feedrate = 0.0; f95e: 10 92 b8 02 sts 0x02B8, r1 ; 0x8002b8 f962: 10 92 b9 02 sts 0x02B9, r1 ; 0x8002b9 f966: 10 92 ba 02 sts 0x02BA, r1 ; 0x8002ba f96a: 10 92 bb 02 sts 0x02BB, r1 ; 0x8002bb endstops_hit_on_purpose(); f96e: 0f 94 bf 4e call 0x29d7e ; 0x29d7e axis_known_position[axis] = true; f972: 70 92 90 06 sts 0x0690, r7 ; 0x800690 #ifdef TMC2130 FORCE_HIGH_POWER_END; f976: 80 e0 ldi r24, 0x00 ; 0 f978: 0e 94 48 66 call 0xcc90 ; 0xcc90 f97c: 20 cf rjmp .-448 ; 0xf7be 0000f97e : #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 { f97e: 2f 92 push r2 f980: 3f 92 push r3 f982: 4f 92 push r4 f984: 5f 92 push r5 f986: 6f 92 push r6 f988: 7f 92 push r7 f98a: 8f 92 push r8 f98c: 9f 92 push r9 f98e: af 92 push r10 f990: bf 92 push r11 f992: cf 92 push r12 f994: df 92 push r13 f996: ef 92 push r14 f998: ff 92 push r15 f99a: 0f 93 push r16 f99c: 1f 93 push r17 f99e: cf 93 push r28 f9a0: df 93 push r29 f9a2: 00 d0 rcall .+0 ; 0xf9a4 f9a4: 1f 92 push r1 f9a6: 1f 92 push r1 f9a8: cd b7 in r28, 0x3d ; 61 f9aa: de b7 in r29, 0x3e ; 62 f9ac: d8 2e mov r13, r24 f9ae: 2a 01 movw r4, r20 f9b0: 3b 01 movw r6, r22 f9b2: 32 2e mov r3, r18 f9b4: e9 82 std Y+1, r14 ; 0x01 f9b6: fa 82 std Y+2, r15 ; 0x02 f9b8: 0b 83 std Y+3, r16 ; 0x03 f9ba: 1c 83 std Y+4, r17 ; 0x04 // Flag for the display update routine and to disable the print cancelation during homing. st_synchronize(); f9bc: 0f 94 a9 43 call 0x28752 ; 0x28752 homing_flag = true; f9c0: 81 e0 ldi r24, 0x01 ; 1 f9c2: 80 93 a6 0d sts 0x0DA6, r24 ; 0x800da6 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; f9c6: fc 2c mov r15, r12 f9c8: e3 2c mov r14, r3 f9ca: d3 10 cpse r13, r3 f9cc: 10 c0 rjmp .+32 ; 0xf9ee f9ce: ed 2c mov r14, r13 f9d0: dc 10 cpse r13, r12 f9d2: 0d c0 rjmp .+26 ; 0xf9ee // 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); f9d4: 60 e0 ldi r22, 0x00 ; 0 f9d6: 70 e0 ldi r23, 0x00 ; 0 f9d8: 80 ea ldi r24, 0xA0 ; 160 f9da: 90 e4 ldi r25, 0x40 ; 64 f9dc: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 // 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; f9e0: ff 24 eor r15, r15 f9e2: f3 94 inc r15 f9e4: ee 24 eor r14, r14 f9e6: e3 94 inc r14 f9e8: 22 24 eor r2, r2 f9ea: 23 94 inc r2 f9ec: 01 c0 rjmp .+2 ; 0xf9f0 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; f9ee: 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(); f9f0: 0f 94 2a ce call 0x39c54 ; 0x39c54 // 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; f9f4: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 f9f8: 8d 83 std Y+5, r24 ; 0x05 mbl.active = 0; f9fa: 10 92 c1 13 sts 0x13C1, r1 ; 0x8013c1 current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); f9fe: 82 e0 ldi r24, 0x02 ; 2 fa00: 0f 94 95 43 call 0x2872a ; 0x2872a fa04: 60 93 99 06 sts 0x0699, r22 ; 0x800699 fa08: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a fa0c: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b fa10: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c #endif // Reset baby stepping to zero, if the babystepping has already been loaded before. if (home_z) fa14: f1 10 cpse r15, r1 babystep_undo(); fa16: 0f 94 cf c9 call 0x3939e ; 0x3939e int l_feedmultiply = setup_for_endstop_move(); fa1a: 81 e0 ldi r24, 0x01 ; 1 fa1c: 0e 94 80 66 call 0xcd00 ; 0xcd00 fa20: 8c 01 movw r16, r24 set_destination_to_current(); fa22: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 feedrate = 0.0; fa26: 10 92 b8 02 sts 0x02B8, r1 ; 0x8002b8 fa2a: 10 92 b9 02 sts 0x02B9, r1 ; 0x8002b9 fa2e: 10 92 ba 02 sts 0x02BA, r1 ; 0x8002ba fa32: 10 92 bb 02 sts 0x02BB, r1 ; 0x8002bb current_position[Z_AXIS] = destination[Z_AXIS]; } #endif /* QUICK_HOME */ #ifdef TMC2130 if(home_x) fa36: 22 20 and r2, r2 fa38: 09 f4 brne .+2 ; 0xfa3c fa3a: 77 c1 rjmp .+750 ; 0xfd2a { if (!calib) fa3c: 9b 8d ldd r25, Y+27 ; 0x1b fa3e: 91 11 cpse r25, r1 fa40: 6a c1 rjmp .+724 ; 0xfd16 homeaxis(X_AXIS); fa42: 50 e0 ldi r21, 0x00 ; 0 fa44: 40 e0 ldi r20, 0x00 ; 0 fa46: 61 e0 ldi r22, 0x01 ; 1 fa48: 80 e0 ldi r24, 0x00 ; 0 fa4a: 0e 94 03 7a call 0xf406 ; 0xf406 else tmc2130_home_calibrate(X_AXIS); } if(home_y) fa4e: ee 20 and r14, r14 fa50: 31 f0 breq .+12 ; 0xfa5e { if (!calib) homeaxis(Y_AXIS); fa52: 50 e0 ldi r21, 0x00 ; 0 fa54: 40 e0 ldi r20, 0x00 ; 0 fa56: 61 e0 ldi r22, 0x01 ; 1 fa58: 81 e0 ldi r24, 0x01 ; 1 fa5a: 0e 94 03 7a call 0xf406 ; 0xf406 if(home_x) homeaxis(X_AXIS); if(home_y) homeaxis(Y_AXIS); #endif //TMC2130 if(home_x_axis && home_x_value != 0) fa5e: dd 20 and r13, r13 fa60: e9 f0 breq .+58 ; 0xfa9c fa62: 41 14 cp r4, r1 fa64: 51 04 cpc r5, r1 fa66: 61 04 cpc r6, r1 fa68: 71 04 cpc r7, r1 fa6a: c1 f0 breq .+48 ; 0xfa9c current_position[X_AXIS]=home_x_value+cs.add_homing[X_AXIS]; fa6c: c3 01 movw r24, r6 fa6e: b2 01 movw r22, r4 fa70: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> fa74: 9b 01 movw r18, r22 fa76: ac 01 movw r20, r24 fa78: 60 91 15 0e lds r22, 0x0E15 ; 0x800e15 fa7c: 70 91 16 0e lds r23, 0x0E16 ; 0x800e16 fa80: 80 91 17 0e lds r24, 0x0E17 ; 0x800e17 fa84: 90 91 18 0e lds r25, 0x0E18 ; 0x800e18 fa88: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> fa8c: 60 93 91 06 sts 0x0691, r22 ; 0x800691 fa90: 70 93 92 06 sts 0x0692, r23 ; 0x800692 fa94: 80 93 93 06 sts 0x0693, r24 ; 0x800693 fa98: 90 93 94 06 sts 0x0694, r25 ; 0x800694 if(home_y_axis && home_y_value != 0) fa9c: 33 20 and r3, r3 fa9e: 01 f1 breq .+64 ; 0xfae0 faa0: 89 81 ldd r24, Y+1 ; 0x01 faa2: 9a 81 ldd r25, Y+2 ; 0x02 faa4: ab 81 ldd r26, Y+3 ; 0x03 faa6: bc 81 ldd r27, Y+4 ; 0x04 faa8: 00 97 sbiw r24, 0x00 ; 0 faaa: a1 05 cpc r26, r1 faac: b1 05 cpc r27, r1 faae: c1 f0 breq .+48 ; 0xfae0 current_position[Y_AXIS]=home_y_value+cs.add_homing[Y_AXIS]; fab0: bc 01 movw r22, r24 fab2: cd 01 movw r24, r26 fab4: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> fab8: 9b 01 movw r18, r22 faba: ac 01 movw r20, r24 fabc: 60 91 19 0e lds r22, 0x0E19 ; 0x800e19 fac0: 70 91 1a 0e lds r23, 0x0E1A ; 0x800e1a fac4: 80 91 1b 0e lds r24, 0x0E1B ; 0x800e1b fac8: 90 91 1c 0e lds r25, 0x0E1C ; 0x800e1c facc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> fad0: 60 93 95 06 sts 0x0695, r22 ; 0x800695 fad4: 70 93 96 06 sts 0x0696, r23 ; 0x800696 fad8: 80 93 97 06 sts 0x0697, r24 ; 0x800697 fadc: 90 93 98 06 sts 0x0698, r25 ; 0x800698 #if Z_HOME_DIR < 0 // If homing towards BED do Z last if(home_z) { fae0: ff 20 and r15, r15 fae2: 09 f4 brne .+2 ; 0xfae6 fae4: a2 c0 rjmp .+324 ; 0xfc2a #ifdef MESH_BED_LEVELING // If Mesh bed leveling, move X&Y to safe position for home raise_z_above(MESH_HOME_Z_SEARCH); fae6: 60 e0 ldi r22, 0x00 ; 0 fae8: 70 e0 ldi r23, 0x00 ; 0 faea: 80 ea ldi r24, 0xA0 ; 160 faec: 90 e4 ldi r25, 0x40 ; 64 faee: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS); faf2: 80 91 8e 06 lds r24, 0x068E ; 0x80068e faf6: 81 11 cpse r24, r1 faf8: 05 c0 rjmp .+10 ; 0xfb04 fafa: 50 e0 ldi r21, 0x00 ; 0 fafc: 40 e0 ldi r20, 0x00 ; 0 fafe: 61 e0 ldi r22, 0x01 ; 1 fb00: 0e 94 03 7a call 0xf406 ; 0xf406 if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS); fb04: 80 91 8f 06 lds r24, 0x068F ; 0x80068f fb08: 81 11 cpse r24, r1 fb0a: 06 c0 rjmp .+12 ; 0xfb18 fb0c: 50 e0 ldi r21, 0x00 ; 0 fb0e: 40 e0 ldi r20, 0x00 ; 0 fb10: 61 e0 ldi r22, 0x01 ; 1 fb12: 81 e0 ldi r24, 0x01 ; 1 fb14: 0e 94 03 7a call 0xf406 ; 0xf406 // 1st mesh bed leveling measurement point, corrected. world2machine_initialize(); fb18: 0f 94 8f ce call 0x39d1e ; 0x39d1e world2machine(pgm_read_float(bed_ref_points_4), pgm_read_float(bed_ref_points_4+1), destination[X_AXIS], destination[Y_AXIS]); fb1c: e3 e2 ldi r30, 0x23 ; 35 fb1e: f5 ea ldi r31, 0xA5 ; 165 fb20: 85 91 lpm r24, Z+ fb22: 95 91 lpm r25, Z+ fb24: a5 91 lpm r26, Z+ fb26: b4 91 lpm r27, Z fb28: ef e1 ldi r30, 0x1F ; 31 fb2a: f5 ea ldi r31, 0xA5 ; 165 fb2c: 45 91 lpm r20, Z+ fb2e: 55 91 lpm r21, Z+ fb30: 65 91 lpm r22, Z+ fb32: 74 91 lpm r23, Z } } inline void world2machine(const float &x, const float &y, float &out_x, float &out_y) { out_x = x; fb34: 40 93 73 06 sts 0x0673, r20 ; 0x800673 fb38: 50 93 74 06 sts 0x0674, r21 ; 0x800674 fb3c: 60 93 75 06 sts 0x0675, r22 ; 0x800675 fb40: 70 93 76 06 sts 0x0676, r23 ; 0x800676 out_y = y; fb44: 80 93 77 06 sts 0x0677, r24 ; 0x800677 fb48: 90 93 78 06 sts 0x0678, r25 ; 0x800678 fb4c: a0 93 79 06 sts 0x0679, r26 ; 0x800679 fb50: b0 93 7a 06 sts 0x067A, r27 ; 0x80067a world2machine(out_x, out_y); fb54: 67 e7 ldi r22, 0x77 ; 119 fb56: 76 e0 ldi r23, 0x06 ; 6 fb58: 83 e7 ldi r24, 0x73 ; 115 fb5a: 96 e0 ldi r25, 0x06 ; 6 fb5c: 0e 94 9a 69 call 0xd334 ; 0xd334 world2machine_reset(); fb60: 0f 94 f1 cd call 0x39be2 ; 0x39be2 if (destination[Y_AXIS] < Y_MIN_POS) fb64: 20 e0 ldi r18, 0x00 ; 0 fb66: 30 e0 ldi r19, 0x00 ; 0 fb68: 40 e8 ldi r20, 0x80 ; 128 fb6a: 50 ec ldi r21, 0xC0 ; 192 fb6c: 60 91 77 06 lds r22, 0x0677 ; 0x800677 fb70: 70 91 78 06 lds r23, 0x0678 ; 0x800678 fb74: 80 91 79 06 lds r24, 0x0679 ; 0x800679 fb78: 90 91 7a 06 lds r25, 0x067A ; 0x80067a fb7c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> fb80: 87 ff sbrs r24, 7 fb82: 0c c0 rjmp .+24 ; 0xfb9c destination[Y_AXIS] = Y_MIN_POS; fb84: 80 e0 ldi r24, 0x00 ; 0 fb86: 90 e0 ldi r25, 0x00 ; 0 fb88: a0 e8 ldi r26, 0x80 ; 128 fb8a: b0 ec ldi r27, 0xC0 ; 192 fb8c: 80 93 77 06 sts 0x0677, r24 ; 0x800677 fb90: 90 93 78 06 sts 0x0678, r25 ; 0x800678 fb94: a0 93 79 06 sts 0x0679, r26 ; 0x800679 fb98: b0 93 7a 06 sts 0x067A, r27 ; 0x80067a feedrate = homing_feedrate[X_AXIS] / 20; fb9c: 80 e0 ldi r24, 0x00 ; 0 fb9e: 90 e0 ldi r25, 0x00 ; 0 fba0: a6 e1 ldi r26, 0x16 ; 22 fba2: b3 e4 ldi r27, 0x43 ; 67 fba4: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 fba8: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 fbac: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba fbb0: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb fbb4: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #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(); fbb8: 0f 94 fd be call 0x37dfa ; 0x37dfa 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); fbbc: 60 91 b8 02 lds r22, 0x02B8 ; 0x8002b8 fbc0: 70 91 b9 02 lds r23, 0x02B9 ; 0x8002b9 fbc4: 80 91 ba 02 lds r24, 0x02BA ; 0x8002ba fbc8: 90 91 bb 02 lds r25, 0x02BB ; 0x8002bb fbcc: 0f 94 0a c0 call 0x38014 ; 0x38014 st_synchronize(); fbd0: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[X_AXIS] = destination[X_AXIS]; fbd4: 80 91 73 06 lds r24, 0x0673 ; 0x800673 fbd8: 90 91 74 06 lds r25, 0x0674 ; 0x800674 fbdc: a0 91 75 06 lds r26, 0x0675 ; 0x800675 fbe0: b0 91 76 06 lds r27, 0x0676 ; 0x800676 fbe4: 80 93 91 06 sts 0x0691, r24 ; 0x800691 fbe8: 90 93 92 06 sts 0x0692, r25 ; 0x800692 fbec: a0 93 93 06 sts 0x0693, r26 ; 0x800693 fbf0: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = destination[Y_AXIS]; fbf4: 80 91 77 06 lds r24, 0x0677 ; 0x800677 fbf8: 90 91 78 06 lds r25, 0x0678 ; 0x800678 fbfc: a0 91 79 06 lds r26, 0x0679 ; 0x800679 fc00: b0 91 7a 06 lds r27, 0x067A ; 0x80067a fc04: 80 93 95 06 sts 0x0695, r24 ; 0x800695 fc08: 90 93 96 06 sts 0x0696, r25 ; 0x800696 fc0c: a0 93 97 06 sts 0x0697, r26 ; 0x800697 fc10: b0 93 98 06 sts 0x0698, r27 ; 0x800698 fc14: 81 e0 ldi r24, 0x01 ; 1 fc16: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(true); endstops_hit_on_purpose(); fc1a: 0f 94 bf 4e call 0x29d7e ; 0x29d7e homeaxis(Z_AXIS); fc1e: 50 e0 ldi r21, 0x00 ; 0 fc20: 40 e0 ldi r20, 0x00 ; 0 fc22: 61 e0 ldi r22, 0x01 ; 1 fc24: 82 e0 ldi r24, 0x02 ; 2 fc26: 0e 94 03 7a call 0xf406 ; 0xf406 homeaxis(Z_AXIS); #endif // MESH_BED_LEVELING } #endif // Z_HOME_DIR < 0 if(home_z_axis && home_z_value != 0) fc2a: cc 20 and r12, r12 fc2c: e9 f0 breq .+58 ; 0xfc68 fc2e: 81 14 cp r8, r1 fc30: 91 04 cpc r9, r1 fc32: a1 04 cpc r10, r1 fc34: b1 04 cpc r11, r1 fc36: c1 f0 breq .+48 ; 0xfc68 current_position[Z_AXIS]=home_z_value+cs.add_homing[Z_AXIS]; fc38: c5 01 movw r24, r10 fc3a: b4 01 movw r22, r8 fc3c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> fc40: 9b 01 movw r18, r22 fc42: ac 01 movw r20, r24 fc44: 60 91 1d 0e lds r22, 0x0E1D ; 0x800e1d fc48: 70 91 1e 0e lds r23, 0x0E1E ; 0x800e1e fc4c: 80 91 1f 0e lds r24, 0x0E1F ; 0x800e1f fc50: 90 91 20 0e lds r25, 0x0E20 ; 0x800e20 fc54: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> fc58: 60 93 99 06 sts 0x0699, r22 ; 0x800699 fc5c: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a fc60: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b fc64: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c // 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(); fc68: 0f 94 fd be call 0x37dfa ; 0x37dfa clean_up_after_endstop_move(l_feedmultiply); fc6c: c8 01 movw r24, r16 fc6e: 0e 94 66 66 call 0xcccc ; 0xcccc endstops_hit_on_purpose(); fc72: 0f 94 bf 4e call 0x29d7e ; 0x29d7e // Load the machine correction matrix world2machine_initialize(); fc76: 0f 94 8f ce call 0x39d1e ; 0x39d1e // and correct the current_position XY axes to match the transformed coordinate system. world2machine_update_current(); fc7a: 0f 94 2d cc call 0x3985a ; 0x3985a #ifdef MESH_BED_LEVELING if (home_x_axis || home_y_axis || without_mbl || home_z_axis) fc7e: d1 10 cpse r13, r1 fc80: 07 c0 rjmp .+14 ; 0xfc90 fc82: 31 10 cpse r3, r1 fc84: 05 c0 rjmp .+10 ; 0xfc90 fc86: 8c 8d ldd r24, Y+28 ; 0x1c fc88: 81 11 cpse r24, r1 fc8a: 02 c0 rjmp .+4 ; 0xfc90 fc8c: cc 20 and r12, r12 fc8e: 39 f1 breq .+78 ; 0xfcde { if (! home_z && mbl_was_active) { fc90: f1 10 cpse r15, r1 fc92: 25 c0 rjmp .+74 ; 0xfcde fc94: 9d 81 ldd r25, Y+5 ; 0x05 fc96: 99 23 and r25, r25 fc98: 11 f1 breq .+68 ; 0xfcde // Re-enable the mesh bed leveling if only the X and Y axes were re-homed. mbl.active = true; fc9a: 81 e0 ldi r24, 0x01 ; 1 fc9c: 80 93 c1 13 sts 0x13C1, r24 ; 0x8013c1 // 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)); fca0: 0f 94 95 43 call 0x2872a ; 0x2872a fca4: 6b 01 movw r12, r22 fca6: 7c 01 movw r14, r24 fca8: 80 e0 ldi r24, 0x00 ; 0 fcaa: 0f 94 95 43 call 0x2872a ; 0x2872a fcae: a7 01 movw r20, r14 fcb0: 96 01 movw r18, r12 fcb2: 0f 94 a5 a1 call 0x3434a ; 0x3434a fcb6: 9b 01 movw r18, r22 fcb8: ac 01 movw r20, r24 fcba: 60 91 99 06 lds r22, 0x0699 ; 0x800699 fcbe: 70 91 9a 06 lds r23, 0x069A ; 0x80069a fcc2: 80 91 9b 06 lds r24, 0x069B ; 0x80069b fcc6: 90 91 9c 06 lds r25, 0x069C ; 0x80069c fcca: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> fcce: 60 93 99 06 sts 0x0699, r22 ; 0x800699 fcd2: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a fcd6: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b fcda: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c } #endif prusa_statistics(20); st_synchronize(); fcde: 0f 94 a9 43 call 0x28752 ; 0x28752 homing_flag = false; fce2: 10 92 a6 0d sts 0x0DA6, r1 ; 0x800da6 #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 } fce6: 0f 90 pop r0 fce8: 0f 90 pop r0 fcea: 0f 90 pop r0 fcec: 0f 90 pop r0 fcee: 0f 90 pop r0 fcf0: df 91 pop r29 fcf2: cf 91 pop r28 fcf4: 1f 91 pop r17 fcf6: 0f 91 pop r16 fcf8: ff 90 pop r15 fcfa: ef 90 pop r14 fcfc: df 90 pop r13 fcfe: cf 90 pop r12 fd00: bf 90 pop r11 fd02: af 90 pop r10 fd04: 9f 90 pop r9 fd06: 8f 90 pop r8 fd08: 7f 90 pop r7 fd0a: 6f 90 pop r6 fd0c: 5f 90 pop r5 fd0e: 4f 90 pop r4 fd10: 3f 90 pop r3 fd12: 2f 90 pop r2 fd14: 08 95 ret if(home_x) { if (!calib) homeaxis(X_AXIS); else tmc2130_home_calibrate(X_AXIS); fd16: 80 e0 ldi r24, 0x00 ; 0 fd18: 0f 94 77 23 call 0x246ee ; 0x246ee } if(home_y) fd1c: ee 20 and r14, r14 fd1e: 09 f4 brne .+2 ; 0xfd22 fd20: 9e ce rjmp .-708 ; 0xfa5e { if (!calib) homeaxis(Y_AXIS); else tmc2130_home_calibrate(Y_AXIS); fd22: 81 e0 ldi r24, 0x01 ; 1 fd24: 0f 94 77 23 call 0x246ee ; 0x246ee fd28: 9a ce rjmp .-716 ; 0xfa5e homeaxis(X_AXIS); else tmc2130_home_calibrate(X_AXIS); } if(home_y) fd2a: ee 20 and r14, r14 fd2c: 09 f4 brne .+2 ; 0xfd30 fd2e: 97 ce rjmp .-722 ; 0xfa5e { if (!calib) fd30: ab 8d ldd r26, Y+27 ; 0x1b fd32: aa 23 and r26, r26 fd34: 09 f4 brne .+2 ; 0xfd38 fd36: 8d ce rjmp .-742 ; 0xfa52 fd38: f4 cf rjmp .-24 ; 0xfd22 0000fd3a : SERIAL_ECHOPGM("G28, final "); print_mesh_bed_leveling_table(); #endif } static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) { fd3a: 8f 92 push r8 fd3c: 9f 92 push r9 fd3e: af 92 push r10 fd40: bf 92 push r11 fd42: cf 92 push r12 fd44: ef 92 push r14 fd46: ff 92 push r15 fd48: 0f 93 push r16 fd4a: 1f 93 push r17 fd4c: 26 2f mov r18, r22 #ifdef TMC2130 gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true); fd4e: 91 e0 ldi r25, 0x01 ; 1 fd50: 9f 93 push r25 fd52: 1f 92 push r1 fd54: 81 2c mov r8, r1 fd56: 91 2c mov r9, r1 fd58: 54 01 movw r10, r8 fd5a: c4 2e mov r12, r20 fd5c: e1 2c mov r14, r1 fd5e: f1 2c mov r15, r1 fd60: 87 01 movw r16, r14 fd62: 40 e0 ldi r20, 0x00 ; 0 fd64: 50 e0 ldi r21, 0x00 ; 0 fd66: ba 01 movw r22, r20 fd68: 0e 94 bf 7c call 0xf97e ; 0xf97e fd6c: 0f 90 pop r0 fd6e: 0f 90 pop r0 #else gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, true); #endif //TMC2130 } fd70: 1f 91 pop r17 fd72: 0f 91 pop r16 fd74: ff 90 pop r15 fd76: ef 90 pop r14 fd78: cf 90 pop r12 fd7a: bf 90 pop r11 fd7c: af 90 pop r10 fd7e: 9f 90 pop r9 fd80: 8f 90 pop r8 fd82: 08 95 ret 0000fd84 : // 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(); fd84: 84 e8 ldi r24, 0x84 ; 132 fd86: 93 e0 ldi r25, 0x03 ; 3 fd88: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> if (buflen && ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR))) fd8c: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 fd90: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 fd94: 89 2b or r24, r25 fd96: 79 f0 breq .+30 ; 0xfdb6 fd98: e0 91 91 12 lds r30, 0x1291 ; 0x801291 fd9c: f0 91 92 12 lds r31, 0x1292 ; 0x801292 fda0: ec 55 subi r30, 0x5C ; 92 fda2: ff 4e sbci r31, 0xEF ; 239 fda4: 80 81 ld r24, Z fda6: 81 30 cpi r24, 0x01 ; 1 fda8: 11 f0 breq .+4 ; 0xfdae fdaa: 86 30 cpi r24, 0x06 ; 6 fdac: 21 f4 brne .+8 ; 0xfdb6 SERIAL_PROTOCOLLNRPGM(MSG_OK); fdae: 81 e5 ldi r24, 0x51 ; 81 fdb0: 9d e6 ldi r25, 0x6D ; 109 fdb2: 0c 94 13 79 jmp 0xf226 ; 0xf226 } fdb6: 08 95 ret 0000fdb8 : void cmdqueue_reset() { while (buflen) fdb8: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 fdbc: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 fdc0: 89 2b or r24, r25 fdc2: 29 f0 breq .+10 ; 0xfdce { // printf_P(PSTR("dumping: \"%s\" of type %u\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE); ClearToSend(); fdc4: 0e 94 c2 7e call 0xfd84 ; 0xfd84 cmdqueue_pop_front(); fdc8: 0e 94 54 76 call 0xeca8 ; 0xeca8 fdcc: f5 cf rjmp .-22 ; 0xfdb8 } bufindr = 0; fdce: 10 92 92 12 sts 0x1292, r1 ; 0x801292 fdd2: 10 92 91 12 sts 0x1291, r1 ; 0x801291 bufindw = 0; fdd6: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> fdda: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> //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; fdde: 81 e0 ldi r24, 0x01 ; 1 fde0: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 } fde4: 08 95 ret 0000fde6 : } // G81_M420 Mesh bed leveling status static void gcode_G81_M420() { fde6: ef 92 push r14 fde8: ff 92 push r15 fdea: 0f 93 push r16 fdec: 1f 93 push r17 fdee: cf 93 push r28 fdf0: df 93 push r29 if (mbl.active) { fdf2: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 fdf6: 88 23 and r24, r24 fdf8: 89 f1 breq .+98 ; 0xfe5c } } } void mesh_bed_leveling::print() { SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(MESH_NUM_X_POINTS) "," STRINGIFY(MESH_NUM_Y_POINTS)); fdfa: 86 eb ldi r24, 0xB6 ; 182 fdfc: 9c e7 ldi r25, 0x7C ; 124 fdfe: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_PROTOCOLLNPGM("Z search height: " STRINGIFY(MESH_HOME_Z_SEARCH)); fe02: 80 ea ldi r24, 0xA0 ; 160 fe04: 9c e7 ldi r25, 0x7C ; 124 fe06: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_PROTOCOLLNPGM("Measured points:"); fe0a: 8f e8 ldi r24, 0x8F ; 143 fe0c: 9c e7 ldi r25, 0x7C ; 124 fe0e: 0e 94 13 79 call 0xf226 ; 0xf226 for (uint8_t y = MESH_NUM_Y_POINTS; y-- > 0;) { fe12: c7 e0 ldi r28, 0x07 ; 7 fe14: dc e1 ldi r29, 0x1C ; 28 fe16: c1 50 subi r28, 0x01 ; 1 fe18: 58 f1 brcs .+86 ; 0xfe70 fe1a: cd 9f mul r28, r29 fe1c: 70 01 movw r14, r0 fe1e: 11 24 eor r1, r1 fe20: 01 e0 ldi r16, 0x01 ; 1 fe22: 10 e0 ldi r17, 0x00 ; 0 for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) { SERIAL_PROTOCOLPGM(" "); fe24: 8c e8 ldi r24, 0x8C ; 140 fe26: 9c e7 ldi r25, 0x7C ; 124 fe28: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOL_F(z_values[y][x], 5); fe2c: f8 01 movw r30, r16 fe2e: ee 0f add r30, r30 fe30: ff 1f adc r31, r31 fe32: ee 0f add r30, r30 fe34: ff 1f adc r31, r31 fe36: ee 0d add r30, r14 fe38: ff 1d adc r31, r15 fe3a: e2 54 subi r30, 0x42 ; 66 fe3c: fc 4e sbci r31, 0xEC ; 236 fe3e: 60 81 ld r22, Z fe40: 71 81 ldd r23, Z+1 ; 0x01 fe42: 82 81 ldd r24, Z+2 ; 0x02 fe44: 93 81 ldd r25, Z+3 ; 0x03 fe46: 45 e0 ldi r20, 0x05 ; 5 fe48: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 fe4c: 0f 5f subi r16, 0xFF ; 255 fe4e: 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++) { fe50: 08 30 cpi r16, 0x08 ; 8 fe52: 11 05 cpc r17, r1 fe54: 39 f7 brne .-50 ; 0xfe24 SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOL_F(z_values[y][x], 5); } SERIAL_PROTOCOLLN(); fe56: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 fe5a: dd cf rjmp .-70 ; 0xfe16 mbl.print(); } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active."); fe5c: 83 ec ldi r24, 0xC3 ; 195 fe5e: 9c e7 ldi r25, 0x7C ; 124 return; } fe60: df 91 pop r29 fe62: cf 91 pop r28 fe64: 1f 91 pop r17 fe66: 0f 91 pop r16 fe68: ff 90 pop r15 fe6a: ef 90 pop r14 static void gcode_G81_M420() { if (mbl.active) { mbl.print(); } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active."); fe6c: 0c 94 13 79 jmp 0xf226 ; 0xf226 return; } fe70: df 91 pop r29 fe72: cf 91 pop r28 fe74: 1f 91 pop r17 fe76: 0f 91 pop r16 fe78: ff 90 pop r15 fe7a: ef 90 pop r14 fe7c: 08 95 ret 0000fe7e : /** * Output a "busy" message at regular intervals * while the machine is not accepting commands. */ void host_keepalive() { fe7e: 8f 92 push r8 fe80: 9f 92 push r9 fe82: af 92 push r10 fe84: bf 92 push r11 fe86: cf 92 push r12 fe88: df 92 push r13 fe8a: ef 92 push r14 fe8c: ff 92 push r15 #ifndef HOST_KEEPALIVE_FEATURE return; #endif //HOST_KEEPALIVE_FEATURE if (farm_mode) return; long ms = _millis(); fe8e: 0f 94 28 2a call 0x25450 ; 0x25450 fe92: 6b 01 movw r12, r22 fe94: 7c 01 movw r14, r24 if (host_keepalive_interval && busy_state != NOT_BUSY) { fe96: 20 91 2f 02 lds r18, 0x022F ; 0x80022f fe9a: 22 23 and r18, r18 fe9c: 09 f1 breq .+66 ; 0xfee0 fe9e: 40 91 be 02 lds r20, 0x02BE ; 0x8002be fea2: 41 30 cpi r20, 0x01 ; 1 fea4: e9 f0 breq .+58 ; 0xfee0 if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return; fea6: 80 91 10 02 lds r24, 0x0210 ; 0x800210 feaa: 90 91 11 02 lds r25, 0x0211 ; 0x800211 feae: a0 91 12 02 lds r26, 0x0212 ; 0x800212 feb2: b0 91 13 02 lds r27, 0x0213 ; 0x800213 feb6: 46 01 movw r8, r12 feb8: 57 01 movw r10, r14 feba: 88 1a sub r8, r24 febc: 99 0a sbc r9, r25 febe: aa 0a sbc r10, r26 fec0: bb 0a sbc r11, r27 fec2: 30 e0 ldi r19, 0x00 ; 0 fec4: a8 ee ldi r26, 0xE8 ; 232 fec6: b3 e0 ldi r27, 0x03 ; 3 fec8: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> fecc: 86 16 cp r8, r22 fece: 97 06 cpc r9, r23 fed0: a8 06 cpc r10, r24 fed2: b9 06 cpc r11, r25 fed4: 6c f0 brlt .+26 ; 0xfef0 switch (busy_state) { fed6: 44 30 cpi r20, 0x04 ; 4 fed8: 31 f1 breq .+76 ; 0xff26 feda: 9c f4 brge .+38 ; 0xff02 fedc: 42 30 cpi r20, 0x02 ; 2 fede: d4 f4 brge .+52 ; 0xff14 break; default: break; } } prev_busy_signal_ms = ms; fee0: c0 92 10 02 sts 0x0210, r12 ; 0x800210 fee4: d0 92 11 02 sts 0x0211, r13 ; 0x800211 fee8: e0 92 12 02 sts 0x0212, r14 ; 0x800212 feec: f0 92 13 02 sts 0x0213, r15 ; 0x800213 } fef0: ff 90 pop r15 fef2: ef 90 pop r14 fef4: df 90 pop r13 fef6: cf 90 pop r12 fef8: bf 90 pop r11 fefa: af 90 pop r10 fefc: 9f 90 pop r9 fefe: 8f 90 pop r8 ff00: 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) { ff02: 45 30 cpi r20, 0x05 ; 5 ff04: 69 f7 brne .-38 ; 0xfee0 case PAUSED_FOR_USER: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for user"); break; case PAUSED_FOR_INPUT: SERIAL_ECHO_START; ff06: 82 ef ldi r24, 0xF2 ; 242 ff08: 9a ea ldi r25, 0xAA ; 170 ff0a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("busy: paused for input"); ff0e: 88 e3 ldi r24, 0x38 ; 56 ff10: 9b e7 ldi r25, 0x7B ; 123 ff12: 06 c0 rjmp .+12 ; 0xff20 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; ff14: 82 ef ldi r24, 0xF2 ; 242 ff16: 9a ea ldi r25, 0xAA ; 170 ff18: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("busy: processing"); ff1c: 85 e6 ldi r24, 0x65 ; 101 ff1e: 9b e7 ldi r25, 0x7B ; 123 SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for user"); break; case PAUSED_FOR_INPUT: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: paused for input"); ff20: 0e 94 13 79 call 0xf226 ; 0xf226 ff24: dd cf rjmp .-70 ; 0xfee0 case IN_PROCESS: SERIAL_ECHO_START; SERIAL_ECHOLNPGM("busy: processing"); break; case PAUSED_FOR_USER: SERIAL_ECHO_START; ff26: 82 ef ldi r24, 0xF2 ; 242 ff28: 9a ea ldi r25, 0xAA ; 170 ff2a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("busy: paused for user"); ff2e: 8f e4 ldi r24, 0x4F ; 79 ff30: 9b e7 ldi r25, 0x7B ; 123 ff32: f6 cf rjmp .-20 ; 0xff20 0000ff34 : //} } #endif //TACH_0 void checkFans() { ff34: cf 92 push r12 ff36: df 92 push r13 ff38: ef 92 push r14 ff3a: ff 92 push r15 ff3c: 0f 93 push r16 ff3e: 1f 93 push r17 ff40: cf 93 push r28 ff42: df 93 push r29 ff44: 1f 92 push r1 ff46: 1f 92 push r1 ff48: cd b7 in r28, 0x3d ; 61 ff4a: de b7 in r29, 0x3e ; 62 #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)) { ff4c: 0f 94 28 2a call 0x25450 ; 0x25450 ff50: 00 91 bf 17 lds r16, 0x17BF ; 0x8017bf ff54: 10 91 c0 17 lds r17, 0x17C0 ; 0x8017c0 ff58: 20 91 c1 17 lds r18, 0x17C1 ; 0x8017c1 ff5c: 30 91 c2 17 lds r19, 0x17C2 ; 0x8017c2 ff60: 60 1b sub r22, r16 ff62: 71 0b sbc r23, r17 ff64: 82 0b sbc r24, r18 ff66: 93 0b sbc r25, r19 ff68: 69 38 cpi r22, 0x89 ; 137 ff6a: 73 41 sbci r23, 0x13 ; 19 ff6c: 81 05 cpc r24, r1 ff6e: 91 05 cpc r25, r1 ff70: d0 f0 brcs .+52 ; 0xffa6 ff72: 80 91 6e 06 lds r24, 0x066E ; 0x80066e ff76: 81 11 cpse r24, r1 ff78: 16 c0 rjmp .+44 ; 0xffa6 extruder_autofan_last_check = _millis(); ff7a: 0f 94 28 2a call 0x25450 ; 0x25450 ff7e: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf ff82: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 ff86: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 ff8a: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 fanSpeedBckp = fanSpeedSoftPwm; ff8e: 80 91 a5 04 lds r24, 0x04A5 ; 0x8004a5 ff92: 80 93 14 02 sts 0x0214, r24 ; 0x800214 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 ff96: 8b 34 cpi r24, 0x4B ; 75 ff98: 18 f0 brcs .+6 ; 0xffa0 // printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm); fanSpeedSoftPwm = 255; ff9a: 8f ef ldi r24, 0xFF ; 255 ff9c: 80 93 a5 04 sts 0x04A5, r24 ; 0x8004a5 } fan_measuring = true; ffa0: 81 e0 ldi r24, 0x01 ; 1 ffa2: 80 93 6e 06 sts 0x066E, r24 ; 0x80066e } if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) { ffa6: 0f 94 28 2a call 0x25450 ; 0x25450 ffaa: 00 91 bf 17 lds r16, 0x17BF ; 0x8017bf ffae: 10 91 c0 17 lds r17, 0x17C0 ; 0x8017c0 ffb2: 20 91 c1 17 lds r18, 0x17C1 ; 0x8017c1 ffb6: 30 91 c2 17 lds r19, 0x17C2 ; 0x8017c2 ffba: 60 1b sub r22, r16 ffbc: 71 0b sbc r23, r17 ffbe: 82 0b sbc r24, r18 ffc0: 93 0b sbc r25, r19 ffc2: 65 36 cpi r22, 0x65 ; 101 ffc4: 71 05 cpc r23, r1 ffc6: 81 05 cpc r24, r1 ffc8: 91 05 cpc r25, r1 ffca: 08 f4 brcc .+2 ; 0xffce ffcc: 57 c1 rjmp .+686 ; 0x1027c ffce: 80 91 6e 06 lds r24, 0x066E ; 0x80066e ffd2: 88 23 and r24, r24 ffd4: 09 f4 brne .+2 ; 0xffd8 ffd6: 52 c1 rjmp .+676 ; 0x1027c #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))); ffd8: 60 91 e1 05 lds r22, 0x05E1 ; 0x8005e1 ffdc: 70 91 e2 05 lds r23, 0x05E2 ; 0x8005e2 ffe0: 07 2e mov r0, r23 ffe2: 00 0c add r0, r0 ffe4: 88 0b sbc r24, r24 ffe6: 99 0b sbc r25, r25 ffe8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> ffec: 6b 01 movw r12, r22 ffee: 7c 01 movw r14, r24 fff0: 0f 94 28 2a call 0x25450 ; 0x25450 fff4: 00 91 bf 17 lds r16, 0x17BF ; 0x8017bf fff8: 10 91 c0 17 lds r17, 0x17C0 ; 0x8017c0 fffc: 20 91 c1 17 lds r18, 0x17C1 ; 0x8017c1 10000: 30 91 c2 17 lds r19, 0x17C2 ; 0x8017c2 10004: 60 1b sub r22, r16 10006: 71 0b sbc r23, r17 10008: 82 0b sbc r24, r18 1000a: 93 0b sbc r25, r19 1000c: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 10010: 9b 01 movw r18, r22 10012: ac 01 movw r20, r24 10014: 60 e0 ldi r22, 0x00 ; 0 10016: 70 e0 ldi r23, 0x00 ; 0 10018: 8a e7 ldi r24, 0x7A ; 122 1001a: 93 e4 ldi r25, 0x43 ; 67 1001c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 10020: a7 01 movw r20, r14 10022: 96 01 movw r18, r12 10024: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 10028: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1002c: 70 93 c8 03 sts 0x03C8, r23 ; 0x8003c8 10030: 60 93 c7 03 sts 0x03C7, r22 ; 0x8003c7 fan_speed[1] = (fan_edge_counter[1] * (float(250) / (_millis() - extruder_autofan_last_check))); 10034: 60 91 e3 05 lds r22, 0x05E3 ; 0x8005e3 10038: 70 91 e4 05 lds r23, 0x05E4 ; 0x8005e4 1003c: 07 2e mov r0, r23 1003e: 00 0c add r0, r0 10040: 88 0b sbc r24, r24 10042: 99 0b sbc r25, r25 10044: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 10048: 6b 01 movw r12, r22 1004a: 7c 01 movw r14, r24 1004c: 0f 94 28 2a call 0x25450 ; 0x25450 10050: 00 91 bf 17 lds r16, 0x17BF ; 0x8017bf 10054: 10 91 c0 17 lds r17, 0x17C0 ; 0x8017c0 10058: 20 91 c1 17 lds r18, 0x17C1 ; 0x8017c1 1005c: 30 91 c2 17 lds r19, 0x17C2 ; 0x8017c2 10060: 60 1b sub r22, r16 10062: 71 0b sbc r23, r17 10064: 82 0b sbc r24, r18 10066: 93 0b sbc r25, r19 10068: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 1006c: 9b 01 movw r18, r22 1006e: ac 01 movw r20, r24 10070: 60 e0 ldi r22, 0x00 ; 0 10072: 70 e0 ldi r23, 0x00 ; 0 10074: 8a e7 ldi r24, 0x7A ; 122 10076: 93 e4 ldi r25, 0x43 ; 67 10078: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1007c: a7 01 movw r20, r14 1007e: 96 01 movw r18, r12 10080: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 10084: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 10088: 8b 01 movw r16, r22 1008a: 70 93 ca 03 sts 0x03CA, r23 ; 0x8003ca 1008e: 60 93 c9 03 sts 0x03C9, r22 ; 0x8003c9 /*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; 10092: 10 92 e2 05 sts 0x05E2, r1 ; 0x8005e2 10096: 10 92 e1 05 sts 0x05E1, r1 ; 0x8005e1 fan_edge_counter[1] = 0; 1009a: 10 92 e4 05 sts 0x05E4, r1 ; 0x8005e4 1009e: 10 92 e3 05 sts 0x05E3, r1 ; 0x8005e3 void checkFanSpeed() { uint8_t max_fan_errors[2]; #ifdef FAN_SOFT_PWM max_fan_errors[1] = 3; // 15 seconds (Print fan) 100a2: 83 e0 ldi r24, 0x03 ; 3 100a4: 8a 83 std Y+2, r24 ; 0x02 max_fan_errors[0] = 2; // 10 seconds (Hotend fan) 100a6: 82 e0 ldi r24, 0x02 ; 2 100a8: 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) 100aa: 80 91 38 02 lds r24, 0x0238 ; 0x800238 100ae: 88 23 and r24, r24 100b0: 51 f0 breq .+20 ; 0x100c6 fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0); 100b2: 87 e8 ldi r24, 0x87 ; 135 100b4: 9f e0 ldi r25, 0x0F ; 15 100b6: 0f 94 10 dc call 0x3b820 ; 0x3b820 100ba: 91 e0 ldi r25, 0x01 ; 1 100bc: 81 11 cpse r24, r1 100be: 01 c0 rjmp .+2 ; 0x100c2 100c0: 90 e0 ldi r25, 0x00 ; 0 100c2: 90 93 38 02 sts 0x0238, r25 ; 0x800238 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]++;} 100c6: 80 91 c7 03 lds r24, 0x03C7 ; 0x8003c7 100ca: 90 91 c8 03 lds r25, 0x03C8 ; 0x8003c8 100ce: 44 97 sbiw r24, 0x14 ; 20 100d0: 0c f0 brlt .+2 ; 0x100d4 100d2: 9d c0 rjmp .+314 ; 0x1020e 100d4: 20 e0 ldi r18, 0x00 ; 0 100d6: 30 e0 ldi r19, 0x00 ; 0 100d8: 48 e4 ldi r20, 0x48 ; 72 100da: 52 e4 ldi r21, 0x42 ; 66 100dc: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 100e0: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 100e4: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 100e8: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 100ec: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 100f0: 18 16 cp r1, r24 100f2: 0c f0 brlt .+2 ; 0x100f6 100f4: 8c c0 rjmp .+280 ; 0x1020e 100f6: 80 91 4c 03 lds r24, 0x034C ; 0x80034c 100fa: 8f 5f subi r24, 0xFF ; 255 100fc: 80 93 4c 03 sts 0x034C, r24 ; 0x80034c else fan_speed_errors[0] = 0; #endif #if (defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1)) if ((fan_speed[1] < 5) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++; 10100: 05 30 cpi r16, 0x05 ; 5 10102: 11 05 cpc r17, r1 10104: 0c f0 brlt .+2 ; 0x10108 10106: 89 c0 rjmp .+274 ; 0x1021a 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); 10108: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 1010c: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 10110: 98 17 cp r25, r24 10112: 09 f4 brne .+2 ; 0x10116 10114: 7f c0 rjmp .+254 ; 0x10214 10116: e0 91 a5 0d lds r30, 0x0DA5 ; 0x800da5 1011a: 8e e6 ldi r24, 0x6E ; 110 1011c: e8 9f mul r30, r24 1011e: f0 01 movw r30, r0 10120: 11 24 eor r1, r1 10122: e6 5f subi r30, 0xF6 ; 246 10124: f8 4f sbci r31, 0xF8 ; 248 10126: 80 81 ld r24, Z 10128: 8c 34 cpi r24, 0x4C ; 76 1012a: 08 f4 brcc .+2 ; 0x1012e 1012c: 76 c0 rjmp .+236 ; 0x1021a 1012e: 80 91 4d 03 lds r24, 0x034D ; 0x80034d 10132: 8f 5f subi r24, 0xFF ; 255 10134: 80 93 4d 03 sts 0x034D, r24 ; 0x80034d 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){ 10138: 80 91 4c 03 lds r24, 0x034C ; 0x80034c 1013c: 81 11 cpse r24, r1 1013e: 0b c0 rjmp .+22 ; 0x10156 10140: 80 91 4d 03 lds r24, 0x034D ; 0x80034d 10144: 81 11 cpse r24, r1 10146: 07 c0 rjmp .+14 ; 0x10156 10148: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 1014c: 82 30 cpi r24, 0x02 ; 2 1014e: 19 f4 brne .+6 ; 0x10156 // we may even send some info to the LCD from here fan_check_error = EFCE_FIXED; 10150: 81 e0 ldi r24, 0x01 ; 1 10152: 80 93 e4 03 sts 0x03E4, r24 ; 0x8003e4 } if ((fan_check_error == EFCE_FIXED) && !printer_active()){ 10156: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 1015a: 81 30 cpi r24, 0x01 ; 1 1015c: 61 f4 brne .+24 ; 0x10176 1015e: 0e 94 79 67 call 0xcef2 ; 0xcef2 10162: 81 11 cpse r24, r1 10164: 08 c0 rjmp .+16 ; 0x10176 fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately. 10166: 10 92 e4 03 sts 0x03E4, r1 ; 0x8003e4 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1016a: 10 92 d3 03 sts 0x03D3, r1 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 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 1016e: 82 e1 ldi r24, 0x12 ; 18 10170: 90 e7 ldi r25, 0x70 ; 112 10172: 0e 94 16 f2 call 0x1e42c ; 0x1e42c } if (fans_check_enabled && (fan_check_error != EFCE_REPORTED)) 10176: 80 91 38 02 lds r24, 0x0238 ; 0x800238 1017a: 88 23 and r24, r24 1017c: 09 f4 brne .+2 ; 0x10180 1017e: 6e c0 rjmp .+220 ; 0x1025c 10180: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 10184: 82 30 cpi r24, 0x02 ; 2 10186: 09 f4 brne .+2 ; 0x1018a 10188: 69 c0 rjmp .+210 ; 0x1025c 1018a: 8c e4 ldi r24, 0x4C ; 76 1018c: e8 2e mov r14, r24 1018e: 83 e0 ldi r24, 0x03 ; 3 10190: f8 2e mov r15, r24 10192: fe 01 movw r30, r28 10194: 31 96 adiw r30, 0x01 ; 1 10196: 6f 01 movw r12, r30 { for (uint8_t fan = 0; fan < 2; fan++) 10198: 10 e0 ldi r17, 0x00 ; 0 } } void fanSpeedError(unsigned char _fan) { if (fan_check_error == EFCE_REPORTED) return; fan_check_error = EFCE_REPORTED; 1019a: 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]) 1019c: f7 01 movw r30, r14 1019e: 91 91 ld r25, Z+ 101a0: 7f 01 movw r14, r30 101a2: f6 01 movw r30, r12 101a4: 81 91 ld r24, Z+ 101a6: 6f 01 movw r12, r30 101a8: 89 17 cp r24, r25 101aa: 68 f5 brcc .+90 ; 0x10206 { fan_speed_errors[fan] = 0; 101ac: f7 01 movw r30, r14 101ae: 31 97 sbiw r30, 0x01 ; 1 101b0: 10 82 st Z, r1 LCD_ALERTMESSAGERPGM(lcdMsg); } } void fanSpeedError(unsigned char _fan) { if (fan_check_error == EFCE_REPORTED) return; 101b2: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 101b6: 82 30 cpi r24, 0x02 ; 2 101b8: 31 f1 breq .+76 ; 0x10206 fan_check_error = EFCE_REPORTED; 101ba: 00 93 e4 03 sts 0x03E4, r16 ; 0x8003e4 if (printJobOngoing()) { 101be: 0e 94 28 67 call 0xce50 ; 0xce50 101c2: 88 23 and r24, r24 101c4: 81 f1 breq .+96 ; 0x10226 // A print is ongoing, pause the print normally if(!printingIsPaused()) { 101c6: 0e 94 1d 67 call 0xce3a ; 0xce3a 101ca: 81 11 cpse r24, r1 101cc: 06 c0 rjmp .+12 ; 0x101da if (usb_timer.running()) 101ce: 80 91 0d 05 lds r24, 0x050D ; 0x80050d 101d2: 88 23 and r24, r24 101d4: 29 f1 breq .+74 ; 0x10220 lcd_pause_usb_print(); 101d6: 0f 94 75 15 call 0x22aea ; 0x22aea else { // Nothing is going on, but still turn off heaters and report the error setTargetHotend(0); heating_status = HeatingStatus::NO_HEATING; } switch (_fan) { 101da: 11 30 cpi r17, 0x01 ; 1 101dc: 59 f1 breq .+86 ; 0x10234 //! 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); 101de: 89 ea ldi r24, 0xA9 ; 169 101e0: 98 e7 ldi r25, 0x78 ; 120 101e2: 0e 94 13 79 call 0xf226 ; 0xf226 if (get_message_level() == 0) { 101e6: 80 91 d3 03 lds r24, 0x03D3 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 101ea: 81 11 cpse r24, r1 101ec: 0c c0 rjmp .+24 ; 0x10206 Sound_MakeCustom(200,0,true); 101ee: 41 e0 ldi r20, 0x01 ; 1 101f0: 70 e0 ldi r23, 0x00 ; 0 101f2: 60 e0 ldi r22, 0x00 ; 0 101f4: 88 ec ldi r24, 0xC8 ; 200 101f6: 90 e0 ldi r25, 0x00 ; 0 101f8: 0f 94 3d 52 call 0x2a47a ; 0x2a47a LCD_ALERTMESSAGERPGM(lcdMsg); 101fc: 62 e0 ldi r22, 0x02 ; 2 101fe: 84 e7 ldi r24, 0x74 ; 116 10200: 9a e6 ldi r25, 0x6A ; 106 10202: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac 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++) 10206: 11 30 cpi r17, 0x01 ; 1 10208: 49 f1 breq .+82 ; 0x1025c 1020a: 11 e0 ldi r17, 0x01 ; 1 1020c: c7 cf rjmp .-114 ; 0x1019c 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; 1020e: 10 92 4c 03 sts 0x034C, r1 ; 0x80034c 10212: 76 cf rjmp .-276 ; 0x10100 #endif #if (defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1)) if ((fan_speed[1] < 5) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++; 10214: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 10218: 87 cf rjmp .-242 ; 0x10128 else fan_speed_errors[1] = 0; 1021a: 10 92 4d 03 sts 0x034D, r1 ; 0x80034d 1021e: 8c cf rjmp .-232 ; 0x10138 // A print is ongoing, pause the print normally if(!printingIsPaused()) { if (usb_timer.running()) lcd_pause_usb_print(); else lcd_pause_print(); 10220: 0f 94 34 2a call 0x25468 ; 0x25468 10224: da cf rjmp .-76 ; 0x101da return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 10226: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 1022a: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 } } else { // Nothing is going on, but still turn off heaters and report the error setTargetHotend(0); heating_status = HeatingStatus::NO_HEATING; 1022e: 10 92 e1 03 sts 0x03E1, r1 ; 0x8003e1 10232: d3 cf rjmp .-90 ; 0x101da //! 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); 10234: 81 ed ldi r24, 0xD1 ; 209 10236: 98 e7 ldi r25, 0x78 ; 120 10238: 0e 94 13 79 call 0xf226 ; 0xf226 if (get_message_level() == 0) { 1023c: 80 91 d3 03 lds r24, 0x03D3 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 10240: 81 11 cpse r24, r1 10242: 0c c0 rjmp .+24 ; 0x1025c Sound_MakeCustom(200,0,true); 10244: 41 e0 ldi r20, 0x01 ; 1 10246: 70 e0 ldi r23, 0x00 ; 0 10248: 60 e0 ldi r22, 0x00 ; 0 1024a: 88 ec ldi r24, 0xC8 ; 200 1024c: 90 e0 ldi r25, 0x00 ; 0 1024e: 0f 94 3d 52 call 0x2a47a ; 0x2a47a LCD_ALERTMESSAGERPGM(lcdMsg); 10252: 62 e0 ldi r22, 0x02 ; 2 10254: 80 e6 ldi r24, 0x60 ; 96 10256: 9a e6 ldi r25, 0x6A ; 106 10258: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac } if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) { countFanSpeed(); checkFanSpeed(); //printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm); fanSpeedSoftPwm = fanSpeedBckp; 1025c: 80 91 14 02 lds r24, 0x0214 ; 0x800214 10260: 80 93 a5 04 sts 0x04A5, r24 ; 0x8004a5 //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(); 10264: 0f 94 28 2a call 0x25450 ; 0x25450 10268: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf 1026c: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 10270: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 10274: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 fan_measuring = false; 10278: 10 92 6e 06 sts 0x066E, r1 ; 0x80066e } #endif //FAN_SOFT_PWM #endif #endif //DEBUG_DISABLE_FANCHECK } 1027c: 0f 90 pop r0 1027e: 0f 90 pop r0 10280: df 91 pop r29 10282: cf 91 pop r28 10284: 1f 91 pop r17 10286: 0f 91 pop r16 10288: ff 90 pop r15 1028a: ef 90 pop r14 1028c: df 90 pop r13 1028e: cf 90 pop r12 //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(); fan_measuring = false; } #endif //FANCHECK checkExtruderAutoFans(); 10290: 0c 94 3f 75 jmp 0xea7e ; 0xea7e 00010294 : return (k >= 0? la10c_convert(k): -1); } float la10c_jerk(float j) { 10294: cf 92 push r12 10296: df 92 push r13 10298: ef 92 push r14 1029a: ff 92 push r15 1029c: 6b 01 movw r12, r22 1029e: 7c 01 movw r14, r24 la10c_orig_jerk = j; 102a0: c0 92 52 03 sts 0x0352, r12 ; 0x800352 102a4: d0 92 53 03 sts 0x0353, r13 ; 0x800353 102a8: e0 92 54 03 sts 0x0354, r14 ; 0x800354 102ac: f0 92 55 03 sts 0x0355, r15 ; 0x800355 if(la10c_mode != LA10C_LA10) 102b0: 80 91 6e 03 lds r24, 0x036E ; 0x80036e 102b4: 82 30 cpi r24, 0x02 ; 2 102b6: b1 f4 brne .+44 ; 0x102e4 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) 102b8: 20 e0 ldi r18, 0x00 ; 0 102ba: 30 e0 ldi r19, 0x00 ; 0 102bc: 40 e9 ldi r20, 0x90 ; 144 102be: 50 e4 ldi r21, 0x40 ; 64 102c0: c7 01 movw r24, r14 102c2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 102c6: 87 ff sbrs r24, 7 102c8: 14 c0 rjmp .+40 ; 0x102f2 102ca: 80 91 ed 0d lds r24, 0x0DED ; 0x800ded 102ce: 90 91 ee 0d lds r25, 0x0DEE ; 0x800dee 102d2: a0 91 ef 0d lds r26, 0x0DEF ; 0x800def 102d6: b0 91 f0 0d lds r27, 0x0DF0 ; 0x800df0 102da: 80 3d cpi r24, 0xD0 ; 208 102dc: 97 40 sbci r25, 0x07 ; 7 102de: a1 05 cpc r26, r1 102e0: b1 05 cpc r27, r1 102e2: 20 f5 brcc .+72 ; 0x1032c j; SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: "); SERIAL_ECHOLN(j); return j; } 102e4: c7 01 movw r24, r14 102e6: b6 01 movw r22, r12 102e8: ff 90 pop r15 102ea: ef 90 pop r14 102ec: df 90 pop r13 102ee: cf 90 pop r12 102f0: 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: 102f2: 2a e9 ldi r18, 0x9A ; 154 102f4: 39 e9 ldi r19, 0x99 ; 153 102f6: 49 e9 ldi r20, 0x99 ; 153 102f8: 5e e3 ldi r21, 0x3E ; 62 102fa: c7 01 movw r24, r14 102fc: b6 01 movw r22, r12 102fe: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 10302: 87 ff sbrs r24, 7 10304: 0a c0 rjmp .+20 ; 0x1031a 10306: 20 e0 ldi r18, 0x00 ; 0 10308: 30 e0 ldi r19, 0x00 ; 0 1030a: 48 e3 ldi r20, 0x38 ; 56 1030c: 51 e4 ldi r21, 0x41 ; 65 1030e: c7 01 movw r24, r14 10310: b6 01 movw r22, r12 10312: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 10316: 6b 01 movw r12, r22 10318: 7c 01 movw r14, r24 j < 4.5? j * 0.25 + 3.375: j; SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: "); 1031a: 85 e2 ldi r24, 0x25 ; 37 1031c: 99 e7 ldi r25, 0x79 ; 121 1031e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(j); 10322: c7 01 movw r24, r14 10324: b6 01 movw r22, r12 10326: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 1032a: dc cf rjmp .-72 ; 0x102e4 // 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: 1032c: 2a e9 ldi r18, 0x9A ; 154 1032e: 39 e9 ldi r19, 0x99 ; 153 10330: 49 e9 ldi r20, 0x99 ; 153 10332: 5e e3 ldi r21, 0x3E ; 62 10334: c7 01 movw r24, r14 10336: b6 01 movw r22, r12 10338: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1033c: 87 fd sbrc r24, 7 1033e: e3 cf rjmp .-58 ; 0x10306 j < 4.5? j * 0.25 + 3.375: 10340: 20 e0 ldi r18, 0x00 ; 0 10342: 30 e0 ldi r19, 0x00 ; 0 10344: 40 e8 ldi r20, 0x80 ; 128 10346: 5e e3 ldi r21, 0x3E ; 62 10348: c7 01 movw r24, r14 1034a: b6 01 movw r22, r12 1034c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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: 10350: 20 e0 ldi r18, 0x00 ; 0 10352: 30 e0 ldi r19, 0x00 ; 0 10354: 48 e5 ldi r20, 0x58 ; 88 10356: 50 e4 ldi r21, 0x40 ; 64 10358: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1035c: dc cf rjmp .-72 ; 0x10316 0001035e : return la10c_mode; } void la10c_mode_change(LA10C_MODE mode) { 1035e: cf 92 push r12 10360: df 92 push r13 10362: ef 92 push r14 10364: ff 92 push r15 10366: cf 93 push r28 if(mode == la10c_mode) return; 10368: 90 91 6e 03 lds r25, 0x036E ; 0x80036e 1036c: 98 17 cp r25, r24 1036e: b9 f1 breq .+110 ; 0x103de 10370: c8 2f mov r28, r24 // always restore to the last unadjusted E-jerk value if(la10c_orig_jerk) 10372: c0 90 52 03 lds r12, 0x0352 ; 0x800352 10376: d0 90 53 03 lds r13, 0x0353 ; 0x800353 1037a: e0 90 54 03 lds r14, 0x0354 ; 0x800354 1037e: f0 90 55 03 lds r15, 0x0355 ; 0x800355 10382: 20 e0 ldi r18, 0x00 ; 0 10384: 30 e0 ldi r19, 0x00 ; 0 10386: a9 01 movw r20, r18 10388: c7 01 movw r24, r14 1038a: b6 01 movw r22, r12 1038c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 10390: 88 23 and r24, r24 10392: 41 f0 breq .+16 ; 0x103a4 cs.max_jerk[E_AXIS] = la10c_orig_jerk; 10394: c0 92 11 0e sts 0x0E11, r12 ; 0x800e11 10398: d0 92 12 0e sts 0x0E12, r13 ; 0x800e12 1039c: e0 92 13 0e sts 0x0E13, r14 ; 0x800e13 103a0: f0 92 14 0e sts 0x0E14, r15 ; 0x800e14 SERIAL_ECHOPGM("LA10C: Linear Advance mode: "); 103a4: 88 e0 ldi r24, 0x08 ; 8 103a6: 99 e7 ldi r25, 0x79 ; 121 103a8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 switch(mode) 103ac: c1 30 cpi r28, 0x01 ; 1 103ae: 11 f1 breq .+68 ; 0x103f4 103b0: e0 f0 brcs .+56 ; 0x103ea 103b2: c2 30 cpi r28, 0x02 ; 2 103b4: 11 f1 breq .+68 ; 0x103fa { 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; 103b6: c0 93 6e 03 sts 0x036E, r28 ; 0x80036e // adjust the E-jerk if needed cs.max_jerk[E_AXIS] = la10c_jerk(cs.max_jerk[E_AXIS]); 103ba: 60 91 11 0e lds r22, 0x0E11 ; 0x800e11 103be: 70 91 12 0e lds r23, 0x0E12 ; 0x800e12 103c2: 80 91 13 0e lds r24, 0x0E13 ; 0x800e13 103c6: 90 91 14 0e lds r25, 0x0E14 ; 0x800e14 103ca: 0e 94 4a 81 call 0x10294 ; 0x10294 103ce: 60 93 11 0e sts 0x0E11, r22 ; 0x800e11 103d2: 70 93 12 0e sts 0x0E12, r23 ; 0x800e12 103d6: 80 93 13 0e sts 0x0E13, r24 ; 0x800e13 103da: 90 93 14 0e sts 0x0E14, r25 ; 0x800e14 } 103de: cf 91 pop r28 103e0: ff 90 pop r15 103e2: ef 90 pop r14 103e4: df 90 pop r13 103e6: cf 90 pop r12 103e8: 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; 103ea: 80 e0 ldi r24, 0x00 ; 0 103ec: 99 e7 ldi r25, 0x79 ; 121 case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break; case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break; 103ee: 0e 94 13 79 call 0xf226 ; 0xf226 103f2: e1 cf rjmp .-62 ; 0x103b6 SERIAL_ECHOPGM("LA10C: Linear Advance mode: "); switch(mode) { case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break; case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break; 103f4: 8c ef ldi r24, 0xFC ; 252 103f6: 98 e7 ldi r25, 0x78 ; 120 103f8: fa cf rjmp .-12 ; 0x103ee case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break; 103fa: 88 ef ldi r24, 0xF8 ; 248 103fc: 98 e7 ldi r25, 0x78 ; 120 103fe: f7 cf rjmp .-18 ; 0x103ee 00010400 : bool IsStopped() { return Stopped; }; void finishAndDisableSteppers() { st_synchronize(); 10400: 0f 94 a9 43 call 0x28752 ; 0x28752 disable_x(); 10404: 17 9a sbi 0x02, 7 ; 2 10406: ee e8 ldi r30, 0x8E ; 142 10408: f6 e0 ldi r31, 0x06 ; 6 1040a: 10 82 st Z, r1 disable_y(); 1040c: 16 9a sbi 0x02, 6 ; 2 1040e: 11 82 std Z+1, r1 ; 0x01 disable_z(); disable_e0(); 10410: 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); } 10412: 80 e0 ldi r24, 0x00 ; 0 10414: 0e 94 af 81 call 0x1035e ; 0x1035e return percent_done; } static void print_time_remaining_init() { print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; 10418: 8f ef ldi r24, 0xFF ; 255 1041a: 9f ef ldi r25, 0xFF ; 255 1041c: 90 93 b2 02 sts 0x02B2, r25 ; 0x8002b2 10420: 80 93 b1 02 sts 0x02B1, r24 ; 0x8002b1 print_percent_done_normal = PRINT_PERCENT_DONE_INIT; 10424: 2f ef ldi r18, 0xFF ; 255 10426: 20 93 ae 02 sts 0x02AE, r18 ; 0x8002ae print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; 1042a: 90 93 b6 02 sts 0x02B6, r25 ; 0x8002b6 1042e: 80 93 b5 02 sts 0x02B5, r24 ; 0x8002b5 print_percent_done_silent = PRINT_PERCENT_DONE_INIT; 10432: 20 93 ad 02 sts 0x02AD, r18 ; 0x8002ad print_time_to_change_normal = PRINT_TIME_REMAINING_INIT; 10436: 90 93 b0 02 sts 0x02B0, r25 ; 0x8002b0 1043a: 80 93 af 02 sts 0x02AF, r24 ; 0x8002af print_time_to_change_silent = PRINT_TIME_REMAINING_INIT; 1043e: 90 93 b4 02 sts 0x02B4, r25 ; 0x8002b4 10442: 80 93 b3 02 sts 0x02B3, r24 ; 0x8002b3 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(); } 10446: 08 95 ret 00010448 : } #endif void Config_ResetDefault() { memcpy_P(&cs,&default_conf, sizeof(cs)); 10448: 41 ed ldi r20, 0xD1 ; 209 1044a: 50 e0 ldi r21, 0x00 ; 0 1044c: 63 eb ldi r22, 0xB3 ; 179 1044e: 77 e7 ldi r23, 0x77 ; 119 10450: 8d eb ldi r24, 0xBD ; 189 10452: 9d e0 ldi r25, 0x0D ; 13 10454: 0f 94 aa d9 call 0x3b354 ; 0x3b354 // steps per sq second need to be updated to agree with the units per sq second reset_acceleration_rates(); 10458: 0f 94 56 64 call 0x2c8ac ; 0x2c8ac #ifdef PIDTEMP updatePID(); 1045c: 0f 94 ab 3b call 0x27756 ; 0x27756 #endif//PIDTEMP #ifdef THERMAL_MODEL thermal_model_reset_settings(); 10460: 0f 94 84 32 call 0x26508 ; 0x26508 #endif calculate_extruder_multipliers(); 10464: 0e 94 51 65 call 0xcaa2 ; 0xcaa2 SERIAL_ECHO_START; 10468: 82 ef ldi r24, 0xF2 ; 242 1046a: 9a ea ldi r25, 0xAA ; 170 1046c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded"); 10470: 81 e9 ldi r24, 0x91 ; 145 10472: 97 e7 ldi r25, 0x77 ; 119 10474: 0c 94 13 79 jmp 0xf226 ; 0xf226 00010478 : DEFAULT_ARC_SEGMENTS_PER_SEC }; void Config_StoreSettings() { 10478: cf 93 push r28 1047a: df 93 push r29 strcpy_P(cs.version, default_conf.version); 1047c: 63 eb ldi r22, 0xB3 ; 179 1047e: 77 e7 ldi r23, 0x77 ; 119 10480: 8d eb ldi r24, 0xBD ; 189 10482: 9d e0 ldi r25, 0x0D ; 13 10484: 0f 94 c7 d9 call 0x3b38e ; 0x3b38e #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); 10488: 41 ed ldi r20, 0xD1 ; 209 1048a: 50 e0 ldi r21, 0x00 ; 0 1048c: 64 e1 ldi r22, 0x14 ; 20 1048e: 70 e0 ldi r23, 0x00 ; 0 10490: 8d eb ldi r24, 0xBD ; 189 10492: 9d e0 ldi r25, 0x0D ; 13 10494: 0f 94 24 dc call 0x3b848 ; 0x3b848 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 10498: 60 91 1c 05 lds r22, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 1049c: 82 e0 ldi r24, 0x02 ; 2 1049e: 9d e0 ldi r25, 0x0D ; 13 104a0: 0f 94 34 dc call 0x3b868 ; 0x3b868 } void thermal_model_save_settings() { eeprom_update_byte_notify((uint8_t*)EEPROM_THERMAL_MODEL_ENABLE, thermal_model::enabled); eeprom_update_float_notify((float*)EEPROM_THERMAL_MODEL_P, thermal_model::data.P); 104a4: cf ea ldi r28, 0xAF ; 175 104a6: d2 e1 ldi r29, 0x12 ; 18 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 104a8: 4a a5 ldd r20, Y+42 ; 0x2a 104aa: 5b a5 ldd r21, Y+43 ; 0x2b 104ac: 6c a5 ldd r22, Y+44 ; 0x2c 104ae: 7d a5 ldd r23, Y+45 ; 0x2d 104b0: 8e ef ldi r24, 0xFE ; 254 104b2: 9c e0 ldi r25, 0x0C ; 12 104b4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 104b8: 4e a5 ldd r20, Y+46 ; 0x2e 104ba: 5f a5 ldd r21, Y+47 ; 0x2f 104bc: 68 a9 ldd r22, Y+48 ; 0x30 104be: 79 a9 ldd r23, Y+49 ; 0x31 104c0: 82 ea ldi r24, 0xA2 ; 162 104c2: 9c e0 ldi r25, 0x0C ; 12 104c4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 104c8: 4a a9 ldd r20, Y+50 ; 0x32 104ca: 5b a9 ldd r21, Y+51 ; 0x33 104cc: 6c a9 ldd r22, Y+52 ; 0x34 104ce: 7d a9 ldd r23, Y+53 ; 0x35 104d0: 8e e9 ldi r24, 0x9E ; 158 104d2: 9c e0 ldi r25, 0x0C ; 12 104d4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 104d8: 4e a9 ldd r20, Y+54 ; 0x36 104da: 5f a9 ldd r21, Y+55 ; 0x37 104dc: 68 ad ldd r22, Y+56 ; 0x38 104de: 79 ad ldd r23, Y+57 ; 0x39 104e0: 8a ef ldi r24, 0xFA ; 250 104e2: 9c e0 ldi r25, 0x0C ; 12 104e4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 104e8: 4a ad ldd r20, Y+58 ; 0x3a 104ea: 5b ad ldd r21, Y+59 ; 0x3b 104ec: 6c ad ldd r22, Y+60 ; 0x3c 104ee: 7d ad ldd r23, Y+61 ; 0x3d 104f0: 8a e9 ldi r24, 0x9A ; 154 104f2: 9c e0 ldi r25, 0x0C ; 12 104f4: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 104f8: 6e ad ldd r22, Y+62 ; 0x3e 104fa: 7f ad ldd r23, Y+63 ; 0x3f 104fc: 88 e9 ldi r24, 0x98 ; 152 104fe: 9c e0 ldi r25, 0x0C ; 12 10500: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 #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); 10504: 40 e4 ldi r20, 0x40 ; 64 10506: 50 e0 ldi r21, 0x00 ; 0 10508: 6a eb ldi r22, 0xBA ; 186 1050a: 7c e0 ldi r23, 0x0C ; 12 1050c: 8f ee ldi r24, 0xEF ; 239 1050e: 92 e1 ldi r25, 0x12 ; 18 10510: 0f 94 24 dc call 0x3b848 ; 0x3b848 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 10514: 40 91 2f 13 lds r20, 0x132F ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 10518: 50 91 30 13 lds r21, 0x1330 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 1051c: 60 91 31 13 lds r22, 0x1331 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 10520: 70 91 32 13 lds r23, 0x1332 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> 10524: 86 eb ldi r24, 0xB6 ; 182 10526: 9c e0 ldi r25, 0x0C ; 12 10528: 0f 94 46 dc call 0x3b88c ; 0x3b88c 1052c: 40 91 33 13 lds r20, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 10530: 50 91 34 13 lds r21, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 10534: 60 91 35 13 lds r22, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 10538: 70 91 36 13 lds r23, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> 1053c: 82 eb ldi r24, 0xB2 ; 178 1053e: 9c e0 ldi r25, 0x0C ; 12 10540: 0f 94 46 dc call 0x3b88c ; 0x3b88c 10544: 40 91 37 13 lds r20, 0x1337 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 10548: 50 91 38 13 lds r21, 0x1338 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 1054c: 60 91 39 13 lds r22, 0x1339 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 10550: 70 91 3a 13 lds r23, 0x133A ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> 10554: 8e ea ldi r24, 0xAE ; 174 10556: 9c e0 ldi r25, 0x0C ; 12 10558: 0f 94 46 dc call 0x3b88c ; 0x3b88c 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; 1055c: 82 ef ldi r24, 0xF2 ; 242 1055e: 9a ea ldi r25, 0xAA ; 170 10560: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("Settings Stored"); 10564: 8d e3 ldi r24, 0x3D ; 61 10566: 97 e7 ldi r25, 0x77 ; 119 } 10568: df 91 pop r29 1056a: cf 91 pop r28 #ifdef THERMAL_MODEL thermal_model_save_settings(); #endif SERIAL_ECHO_START; SERIAL_ECHOLNPGM("Settings Stored"); 1056c: 0c 94 13 79 jmp 0xf226 ; 0xf226 00010570 : { cmdbuffer_front_already_processed = true; } void get_command() { 10570: 2f 92 push r2 10572: 3f 92 push r3 10574: 4f 92 push r4 10576: 5f 92 push r5 10578: 6f 92 push r6 1057a: 7f 92 push r7 1057c: 8f 92 push r8 1057e: 9f 92 push r9 10580: af 92 push r10 10582: bf 92 push r11 10584: cf 92 push r12 10586: df 92 push r13 10588: ef 92 push r14 1058a: ff 92 push r15 1058c: 0f 93 push r16 1058e: 1f 93 push r17 10590: cf 93 push r28 10592: df 93 push r29 10594: cd b7 in r28, 0x3d ; 61 10596: de b7 in r29, 0x3e ; 62 10598: a2 97 sbiw r28, 0x22 ; 34 1059a: 0f b6 in r0, 0x3f ; 63 1059c: f8 94 cli 1059e: de bf out 0x3e, r29 ; 62 105a0: 0f be out 0x3f, r0 ; 63 105a2: cd bf out 0x3d, r28 ; 61 // Test and reserve space for the new command string. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1)) 105a4: 8f e5 ldi r24, 0x5F ; 95 105a6: 90 e0 ldi r25, 0x00 ; 0 105a8: 0e 94 da 5b call 0xb7b4 ; 0xb7b4 105ac: 88 23 and r24, r24 105ae: 09 f4 brne .+2 ; 0x105b2 105b0: 91 c0 rjmp .+290 ; 0x106d4 return; if (MYSERIAL.available() == RX_BUFFER_SIZE - 1) { //compare number of chars buffered in rx buffer with rx buffer size 105b2: 0e 94 a1 76 call 0xed42 ; 0xed42 105b6: 8f 37 cpi r24, 0x7F ; 127 105b8: 91 05 cpc r25, r1 105ba: 61 f4 brne .+24 ; 0x105d4 // 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; 105bc: 80 91 9a 04 lds r24, 0x049A ; 0x80049a 105c0: 90 91 9b 04 lds r25, 0x049B ; 0x80049b 105c4: 90 93 99 04 sts 0x0499, r25 ; 0x800499 105c8: 80 93 98 04 sts 0x0498, r24 ; 0x800498 MYSERIAL.flush(); SERIAL_ECHOLNPGM("Full RX Buffer"); //if buffer was full, there is danger that reading of last gcode will not be completed 105cc: 8e e2 ldi r24, 0x2E ; 46 105ce: 97 e7 ldi r25, 0x77 ; 119 105d0: 0e 94 13 79 call 0xf226 ; 0xf226 105d4: 1e 01 movw r2, r28 105d6: 2f e1 ldi r18, 0x1F ; 31 105d8: 22 0e add r2, r18 105da: 31 1c adc r3, 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; 105dc: dd 24 eor r13, r13 105de: d3 94 inc r13 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 105e0: 0e 94 a1 76 call 0xed42 ; 0xed42 105e4: 18 16 cp r1, r24 105e6: 19 06 cpc r1, r25 105e8: 0c f0 brlt .+2 ; 0x105ec 105ea: 68 c0 rjmp .+208 ; 0x106bc 105ec: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 105f0: 88 23 and r24, r24 105f2: 29 f0 breq .+10 ; 0x105fe 105f4: 0e 94 1d 67 call 0xce3a ; 0xce3a 105f8: 88 23 and r24, r24 105fa: 09 f4 brne .+2 ; 0x105fe 105fc: 5f c0 rjmp .+190 ; 0x106bc 105fe: 80 91 a4 03 lds r24, 0x03A4 ; 0x8003a4 10602: 81 11 cpse r24, r1 10604: 5b c0 rjmp .+182 ; 0x106bc #ifdef ENABLE_MEATPACK // MeatPack Changes // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - const int rec = MYSERIAL.read(); 10606: 0f 94 f8 d5 call 0x3abf0 ; 0x3abf0 if (rec < 0) continue; 1060a: 97 fd sbrc r25, 7 1060c: e9 cf rjmp .-46 ; 0x105e0 mp_handle_rx_char((uint8_t)rec); 1060e: 28 2f mov r18, r24 //========================================================================== void mp_handle_rx_char(const uint8_t c) { // Check for commit complete // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (c == (uint8_t)(MeatPack_CommandByte)) { 10610: 8f 3f cpi r24, 0xFF ; 255 10612: 09 f0 breq .+2 ; 0x10616 10614: 7b c0 rjmp .+246 ; 0x1070c if (mp_cmd_count > 0) { 10616: 80 91 3e 03 lds r24, 0x033E ; 0x80033e 1061a: 88 23 and r24, r24 1061c: 09 f4 brne .+2 ; 0x10620 1061e: 73 c0 rjmp .+230 ; 0x10706 mp_cmd_active = 1; 10620: d0 92 3d 03 sts 0x033D, r13 ; 0x80033d mp_cmd_count = 0; 10624: 10 92 3e 03 sts 0x033E, r1 ; 0x80033e char c_res[2] = {0, 0}; 10628: 1f 8e std Y+31, r1 ; 0x1f 1062a: 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) { 1062c: c0 90 41 03 lds r12, 0x0341 ; 0x800341 10630: cc 20 and r12, r12 10632: b1 f2 breq .-84 ; 0x105e0 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]; 10634: 80 91 3f 03 lds r24, 0x033F ; 0x80033f 10638: 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) 1063a: 91 e0 ldi r25, 0x01 ; 1 1063c: 9c 15 cp r25, r12 1063e: 18 f4 brcc .+6 ; 0x10646 out[i] = (char)mp_char_out_buf[i]; 10640: 80 91 40 03 lds r24, 0x0340 ; 0x800340 10644: 88 a3 std Y+32, r24 ; 0x20 mp_char_out_count = 0; 10646: 10 92 41 03 sts 0x0341, r1 ; 0x800341 1064a: 3a a2 std Y+34, r3 ; 0x22 1064c: 29 a2 std Y+33, r2 ; 0x21 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]; 1064e: 89 a1 ldd r24, Y+33 ; 0x21 10650: 82 19 sub r24, r2 10652: 8c 15 cp r24, r12 10654: 28 f6 brcc .-118 ; 0x105e0 10656: e9 a1 ldd r30, Y+33 ; 0x21 10658: fa a1 ldd r31, Y+34 ; 0x22 1065a: 11 91 ld r17, Z+ 1065c: fa a3 std Y+34, r31 ; 0x22 1065e: e9 a3 std Y+33, r30 ; 0x21 #else char serial_char = MYSERIAL.read(); #endif serialTimeoutTimer.start(); 10660: 84 e4 ldi r24, 0x44 ; 68 10662: 93 e0 ldi r25, 0x03 ; 3 10664: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> if (serial_char < 0) 10668: 17 fd sbrc r17, 7 1066a: f1 cf rjmp .-30 ; 0x1064e 1066c: 80 91 9d 10 lds r24, 0x109D ; 0x80109d 10670: 90 91 9e 10 lds r25, 0x109E ; 0x80109e // 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' || 10674: 1a 30 cpi r17, 0x0A ; 10 10676: 09 f4 brne .+2 ; 0x1067a 10678: 4a c1 rjmp .+660 ; 0x1090e 1067a: 1d 30 cpi r17, 0x0D ; 13 1067c: 09 f4 brne .+2 ; 0x10680 1067e: 47 c1 rjmp .+654 ; 0x1090e serial_char == '\r' || 10680: 8f 35 cpi r24, 0x5F ; 95 10682: 91 05 cpc r25, r1 10684: 0c f0 brlt .+2 ; 0x10688 10686: 48 c1 rjmp .+656 ; 0x10918 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; 10688: 1b 33 cpi r17, 0x3B ; 59 1068a: 11 f4 brne .+4 ; 0x10690 1068c: d0 92 43 03 sts 0x0343, r13 ; 0x800343 if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char; 10690: 20 91 43 03 lds r18, 0x0343 ; 0x800343 10694: 21 11 cpse r18, r1 10696: db cf rjmp .-74 ; 0x1064e 10698: 9c 01 movw r18, r24 1069a: 2f 5f subi r18, 0xFF ; 255 1069c: 3f 4f sbci r19, 0xFF ; 255 1069e: 30 93 9e 10 sts 0x109E, r19 ; 0x80109e 106a2: 20 93 9d 10 sts 0x109D, r18 ; 0x80109d 106a6: 20 91 9f 10 lds r18, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 106aa: 30 91 a0 10 lds r19, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 106ae: 2c 55 subi r18, 0x5C ; 92 106b0: 3f 4e sbci r19, 0xEF ; 239 106b2: 82 0f add r24, r18 106b4: 93 1f adc r25, r19 106b6: fc 01 movw r30, r24 106b8: 13 83 std Z+3, r17 ; 0x03 106ba: c9 cf rjmp .-110 ; 0x1064e #ifdef ENABLE_MEATPACK } #endif } // end of serial line processing loop if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) { 106bc: 80 91 9d 10 lds r24, 0x109D ; 0x80109d 106c0: 90 91 9e 10 lds r25, 0x109E ; 0x80109e 106c4: 18 16 cp r1, r24 106c6: 19 06 cpc r1, r25 106c8: 0c f4 brge .+2 ; 0x106cc 106ca: 56 c2 rjmp .+1196 ; 0x10b78 SERIAL_ECHOLNPGM("RX timeout"); return; } #ifdef SDSUPPORT if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){ 106cc: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 106d0: 81 11 cpse r24, r1 106d2: 66 c2 rjmp .+1228 ; 0x10ba0 prusa_statistics(6); } } #endif //SDSUPPORT } 106d4: a2 96 adiw r28, 0x22 ; 34 106d6: 0f b6 in r0, 0x3f ; 63 106d8: f8 94 cli 106da: de bf out 0x3e, r29 ; 62 106dc: 0f be out 0x3f, r0 ; 63 106de: cd bf out 0x3d, r28 ; 61 106e0: df 91 pop r29 106e2: cf 91 pop r28 106e4: 1f 91 pop r17 106e6: 0f 91 pop r16 106e8: ff 90 pop r15 106ea: ef 90 pop r14 106ec: df 90 pop r13 106ee: cf 90 pop r12 106f0: bf 90 pop r11 106f2: af 90 pop r10 106f4: 9f 90 pop r9 106f6: 8f 90 pop r8 106f8: 7f 90 pop r7 106fa: 6f 90 pop r6 106fc: 5f 90 pop r5 106fe: 4f 90 pop r4 10700: 3f 90 pop r3 10702: 2f 90 pop r2 10704: 08 95 ret if (mp_cmd_count > 0) { mp_cmd_active = 1; mp_cmd_count = 0; } else ++mp_cmd_count; 10706: d0 92 3e 03 sts 0x033E, r13 ; 0x80033e 1070a: 8e cf rjmp .-228 ; 0x10628 return; } if (mp_cmd_active > 0) { 1070c: 30 91 3d 03 lds r19, 0x033D ; 0x80033d 10710: 33 23 and r19, r19 10712: 09 f4 brne .+2 ; 0x10716 10714: 57 c0 rjmp .+174 ; 0x107c4 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 10716: 89 3f cpi r24, 0xF9 ; 249 10718: 09 f4 brne .+2 ; 0x1071c 1071a: 3f c0 rjmp .+126 ; 0x1079a 1071c: 80 f5 brcc .+96 ; 0x1077e 1071e: 86 3f cpi r24, 0xF6 ; 246 10720: 09 f4 brne .+2 ; 0x10724 10722: 48 c0 rjmp .+144 ; 0x107b4 #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] RESET REC"); #endif } break; case MPCommand_EnableNoSpaces: { mp_config |= MPConfig_NoSpaces; 10724: 80 91 3c 03 lds r24, 0x033C ; 0x80033c 10728: 82 60 ori r24, 0x02 ; 2 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 1072a: 27 3f cpi r18, 0xF7 ; 247 1072c: 79 f1 breq .+94 ; 0x1078c 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. 1072e: 89 ef ldi r24, 0xF9 ; 249 10730: 96 e7 ldi r25, 0x76 ; 118 10732: 0e 94 e8 76 call 0xedd0 ; 0xedd0 // 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); 10736: 84 ef ldi r24, 0xF4 ; 244 10738: 96 e7 ldi r25, 0x76 ; 118 1073a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 // Echo current state if (mp_config & MPConfig_Active) 1073e: 10 91 3c 03 lds r17, 0x033C ; 0x80033c SERIAL_ECHOPGM(" ON"); 10742: 80 ef ldi r24, 0xF0 ; 240 10744: 96 e7 ldi r25, 0x76 ; 118 // 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) 10746: 10 fd sbrc r17, 0 10748: 02 c0 rjmp .+4 ; 0x1074e SERIAL_ECHOPGM(" ON"); else SERIAL_ECHOPGM(" OFF"); 1074a: 8b ee ldi r24, 0xEB ; 235 1074c: 96 e7 ldi r25, 0x76 ; 118 1074e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (mp_config & MPConfig_NoSpaces) 10752: 01 2f mov r16, r17 10754: 02 70 andi r16, 0x02 ; 2 SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces 10756: 86 ee ldi r24, 0xE6 ; 230 10758: 96 e7 ldi r25, 0x76 ; 118 if (mp_config & MPConfig_Active) SERIAL_ECHOPGM(" ON"); else SERIAL_ECHOPGM(" OFF"); if (mp_config & MPConfig_NoSpaces) 1075a: 11 fd sbrc r17, 1 1075c: 02 c0 rjmp .+4 ; 0x10762 SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces else SERIAL_ECHOPGM(" ESP"); // [E]nabled [SP]aces 1075e: 81 ee ldi r24, 0xE1 ; 225 10760: 96 e7 ldi r25, 0x76 ; 118 10762: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM(""); 10766: 80 ee ldi r24, 0xE0 ; 224 10768: 96 e7 ldi r25, 0x76 ; 118 1076a: 0e 94 13 79 call 0xf226 ; 0xf226 // Validate config vars #ifdef USE_LOOKUP_TABLE if (mp_config & MPConfig_NoSpaces) 1076e: 00 23 and r16, r16 10770: 29 f1 breq .+74 ; 0x107bc MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace); 10772: 45 e4 ldi r20, 0x45 ; 69 10774: 40 93 0b 02 sts 0x020B, r20 ; 0x80020b <__DATA_REGION_ORIGIN__+0xb> return; } if (mp_cmd_active > 0) { mp_handle_cmd((MeatPack_Command)c); mp_cmd_active = 0; 10778: 10 92 3d 03 sts 0x033D, r1 ; 0x80033d 1077c: 55 cf rjmp .-342 ; 0x10628 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 1077e: 8a 3f cpi r24, 0xFA ; 250 10780: 41 f0 breq .+16 ; 0x10792 case MPCommand_EnablePacking: { mp_config |= MPConfig_Active; 10782: 80 91 3c 03 lds r24, 0x033C ; 0x80033c 10786: 81 60 ori r24, 0x01 ; 1 } //========================================================================== void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) { switch (c) { 10788: 2b 3f cpi r18, 0xFB ; 251 1078a: 89 f6 brne .-94 ; 0x1072e #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP"); #endif } break; case MPCommand_DisableNoSpaces: { mp_config &= ~(MPConfig_NoSpaces); 1078c: 80 93 3c 03 sts 0x033C, r24 ; 0x80033c 10790: ce cf rjmp .-100 ; 0x1072e #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL REC"); #endif } break; case MPCommand_DisablePacking: { mp_config &= ~(MPConfig_Active); 10792: 80 91 3c 03 lds r24, 0x033C ; 0x80033c 10796: 8e 7f andi r24, 0xFE ; 254 10798: f9 cf rjmp .-14 ; 0x1078c return out; } //============================================================================== void FORCE_INLINE mp_reset_state() { mp_char_out_count = 0; 1079a: 10 92 41 03 sts 0x0341, r1 ; 0x800341 mp_cmd_active = MPCommand_None; 1079e: 10 92 3d 03 sts 0x033D, r1 ; 0x80033d mp_config = MPConfig_None; 107a2: 10 92 3c 03 sts 0x033C, r1 ; 0x80033c mp_char_buf = 0; 107a6: 10 92 3b 03 sts 0x033B, r1 ; 0x80033b mp_cmd_count = 0; 107aa: 10 92 3e 03 sts 0x033E, r1 ; 0x80033e mp_cmd_active = 0; mp_full_char_queue = 0; 107ae: 10 92 3a 03 sts 0x033A, r1 ; 0x80033a 107b2: bd cf rjmp .-134 ; 0x1072e #ifdef MP_DEBUG SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP"); #endif } break; case MPCommand_DisableNoSpaces: { mp_config &= ~(MPConfig_NoSpaces); 107b4: 80 91 3c 03 lds r24, 0x033C ; 0x80033c 107b8: 8d 7f andi r24, 0xFD ; 253 107ba: e8 cf rjmp .-48 ; 0x1078c // Validate config vars #ifdef USE_LOOKUP_TABLE if (mp_config & MPConfig_NoSpaces) MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace); else MeatPackLookupTbl[MeatPack_SpaceCharIdx] = ' '; 107bc: 50 e2 ldi r21, 0x20 ; 32 107be: 50 93 0b 02 sts 0x020B, r21 ; 0x80020b <__DATA_REGION_ORIGIN__+0xb> 107c2: da cf rjmp .-76 ; 0x10778 mp_handle_cmd((MeatPack_Command)c); mp_cmd_active = 0; return; } if (mp_cmd_count > 0) { 107c4: 20 91 3e 03 lds r18, 0x033E ; 0x80033e 107c8: 40 91 3c 03 lds r20, 0x033C ; 0x80033c 107cc: 22 23 and r18, r18 107ce: 31 f1 breq .+76 ; 0x1081c 107d0: e0 91 41 03 lds r30, 0x0341 ; 0x800341 //========================================================================== 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) { 107d4: 40 ff sbrs r20, 0 107d6: 49 c0 rjmp .+146 ; 0x1086a if (mp_full_char_queue > 0) { 107d8: 30 91 3a 03 lds r19, 0x033A ; 0x80033a 107dc: 33 23 and r19, r19 107de: 09 f4 brne .+2 ; 0x107e2 107e0: 40 c0 rjmp .+128 ; 0x10862 #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; 107e2: 21 e0 ldi r18, 0x01 ; 1 107e4: 2e 0f add r18, r30 107e6: 20 93 41 03 sts 0x0341, r18 ; 0x800341 107ea: ae 2f mov r26, r30 107ec: b0 e0 ldi r27, 0x00 ; 0 107ee: a1 5c subi r26, 0xC1 ; 193 107f0: bc 4f sbci r27, 0xFC ; 252 107f2: ff ef ldi r31, 0xFF ; 255 107f4: 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) { 107f6: 50 91 3b 03 lds r21, 0x033B ; 0x80033b 107fa: 55 23 and r21, r21 107fc: 51 f0 breq .+20 ; 0x10812 #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; 107fe: ee 5f subi r30, 0xFE ; 254 10800: e0 93 41 03 sts 0x0341, r30 ; 0x800341 10804: e2 2f mov r30, r18 10806: f0 e0 ldi r31, 0x00 ; 0 10808: e1 5c subi r30, 0xC1 ; 193 1080a: fc 4f sbci r31, 0xFC ; 252 1080c: 50 83 st Z, r21 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; 1080e: 10 92 3b 03 sts 0x033B, r1 ; 0x80033b } --mp_full_char_queue; 10812: 31 50 subi r19, 0x01 ; 1 10814: 30 93 3a 03 sts 0x033A, r19 ; 0x80033a return; } if (mp_cmd_count > 0) { mp_handle_rx_char_inner((uint8_t)(MeatPack_CommandByte)); mp_cmd_count = 0; 10818: 10 92 3e 03 sts 0x033E, r1 ; 0x80033e 1081c: e0 91 41 03 lds r30, 0x0341 ; 0x800341 //========================================================================== 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) { 10820: 40 ff sbrs r20, 0 10822: 6c c0 rjmp .+216 ; 0x108fc if (mp_full_char_queue > 0) { 10824: 20 91 3a 03 lds r18, 0x033A ; 0x80033a 10828: 22 23 and r18, r18 1082a: 49 f1 breq .+82 ; 0x1087e #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; 1082c: 91 e0 ldi r25, 0x01 ; 1 1082e: 9e 0f add r25, r30 10830: 90 93 41 03 sts 0x0341, r25 ; 0x800341 10834: ae 2f mov r26, r30 10836: b0 e0 ldi r27, 0x00 ; 0 10838: a1 5c subi r26, 0xC1 ; 193 1083a: bc 4f sbci r27, 0xFC ; 252 1083c: 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) { 1083e: 80 91 3b 03 lds r24, 0x033B ; 0x80033b 10842: 88 23 and r24, r24 10844: 51 f0 breq .+20 ; 0x1085a #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; 10846: ee 5f subi r30, 0xFE ; 254 10848: e0 93 41 03 sts 0x0341, r30 ; 0x800341 1084c: e9 2f mov r30, r25 1084e: f0 e0 ldi r31, 0x00 ; 0 10850: e1 5c subi r30, 0xC1 ; 193 10852: fc 4f sbci r31, 0xFC ; 252 10854: 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; 10856: 10 92 3b 03 sts 0x033B, r1 ; 0x80033b } --mp_full_char_queue; 1085a: 21 50 subi r18, 0x01 ; 1 1085c: 20 93 3a 03 sts 0x033A, r18 ; 0x80033a 10860: e3 ce rjmp .-570 ; 0x10628 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; 10862: 22 e0 ldi r18, 0x02 ; 2 10864: 20 93 3a 03 sts 0x033A, r18 ; 0x80033a 10868: d7 cf rjmp .-82 ; 0x10818 #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; 1086a: 21 e0 ldi r18, 0x01 ; 1 1086c: 2e 0f add r18, r30 1086e: 20 93 41 03 sts 0x0341, r18 ; 0x800341 10872: f0 e0 ldi r31, 0x00 ; 0 10874: e1 5c subi r30, 0xC1 ; 193 10876: fc 4f sbci r31, 0xFC ; 252 10878: 5f ef ldi r21, 0xFF ; 255 1087a: 50 83 st Z, r21 1087c: cd cf rjmp .-102 ; 0x10818 1087e: a8 2f mov r26, r24 10880: af 70 andi r26, 0x0F ; 15 mp_char_buf = 0; } --mp_full_char_queue; } else { uint8_t buf[2] = { 0,0 }; 10882: 40 e0 ldi r20, 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; 10884: 31 e0 ldi r19, 0x01 ; 1 10886: af 30 cpi r26, 0x0F ; 15 10888: 29 f0 breq .+10 ; 0x10894 1088a: b0 e0 ldi r27, 0x00 ; 0 else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char 1088c: a0 50 subi r26, 0x00 ; 0 1088e: be 4f sbci r27, 0xFE ; 254 10890: 4c 91 ld r20, 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; 10892: 30 e0 ldi r19, 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; 10894: 58 2f mov r21, r24 10896: 50 7f andi r21, 0xF0 ; 240 10898: 50 3f cpi r21, 0xF0 ; 240 1089a: 59 f4 brne .+22 ; 0x108b2 1089c: 32 60 ori r19, 0x02 ; 2 } else { uint8_t buf[2] = { 0,0 }; const uint8_t res = mp_unpack_chars(c, buf); if (res & MeatPack_NextPackedFirst) { 1089e: 30 ff sbrs r19, 0 108a0: 13 c0 rjmp .+38 ; 0x108c8 ++mp_full_char_queue; 108a2: d0 92 3a 03 sts 0x033A, r13 ; 0x80033a if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; 108a6: 31 ff sbrs r19, 1 108a8: 0c c0 rjmp .+24 ; 0x108c2 108aa: 82 e0 ldi r24, 0x02 ; 2 108ac: 80 93 3a 03 sts 0x033A, r24 ; 0x80033a 108b0: bb ce rjmp .-650 ; 0x10628 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 108b2: 82 95 swap r24 108b4: 8f 70 andi r24, 0x0F ; 15 108b6: a8 2f mov r26, r24 108b8: b0 e0 ldi r27, 0x00 ; 0 108ba: a0 50 subi r26, 0x00 ; 0 108bc: be 4f sbci r27, 0xFE ; 254 108be: 2c 91 ld r18, X 108c0: ee cf rjmp .-36 ; 0x1089e 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]; 108c2: 20 93 3b 03 sts 0x033B, r18 ; 0x80033b 108c6: b0 ce rjmp .-672 ; 0x10628 #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; 108c8: 81 e0 ldi r24, 0x01 ; 1 108ca: 8e 0f add r24, r30 108cc: 80 93 41 03 sts 0x0341, r24 ; 0x800341 108d0: ae 2f mov r26, r30 108d2: b0 e0 ldi r27, 0x00 ; 0 108d4: a1 5c subi r26, 0xC1 ; 193 108d6: bc 4f sbci r27, 0xFC ; 252 108d8: 4c 93 st X, r20 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') { 108da: 4a 30 cpi r20, 0x0A ; 10 108dc: 09 f4 brne .+2 ; 0x108e0 108de: a4 ce rjmp .-696 ; 0x10628 if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue; 108e0: 31 ff sbrs r19, 1 108e2: 03 c0 rjmp .+6 ; 0x108ea 108e4: d0 92 3a 03 sts 0x033A, r13 ; 0x80033a 108e8: 9f ce rjmp .-706 ; 0x10628 #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; 108ea: ee 5f subi r30, 0xFE ; 254 108ec: e0 93 41 03 sts 0x0341, r30 ; 0x800341 108f0: e8 2f mov r30, r24 108f2: f0 e0 ldi r31, 0x00 ; 0 108f4: e1 5c subi r30, 0xC1 ; 193 108f6: fc 4f sbci r31, 0xFC ; 252 108f8: 20 83 st Z, r18 108fa: 96 ce rjmp .-724 ; 0x10628 108fc: 91 e0 ldi r25, 0x01 ; 1 108fe: 9e 0f add r25, r30 10900: 90 93 41 03 sts 0x0341, r25 ; 0x800341 10904: f0 e0 ldi r31, 0x00 ; 0 10906: e1 5c subi r30, 0xC1 ; 193 10908: fc 4f sbci r31, 0xFC ; 252 1090a: 80 83 st Z, r24 1090c: 8d ce rjmp .-742 ; 0x10628 continue; if(serial_char == '\n' || serial_char == '\r' || serial_count >= (MAX_CMD_SIZE - 1) ) { if(!serial_count) { //if empty line 1090e: 00 97 sbiw r24, 0x00 ; 0 10910: 19 f4 brne .+6 ; 0x10918 comment_mode = false; //for new command 10912: 10 92 43 03 sts 0x0343, r1 ; 0x800343 10916: de ce rjmp .-580 ; 0x106d4 10918: 00 91 9f 10 lds r16, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 1091c: 10 91 a0 10 lds r17, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> return; } cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; // terminate string 10920: 09 55 subi r16, 0x59 ; 89 10922: 1f 4e sbci r17, 0xEF ; 239 10924: 80 0f add r24, r16 10926: 91 1f adc r25, r17 10928: fc 01 movw r30, r24 1092a: 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) 1092c: 1a 83 std Y+2, r17 ; 0x02 1092e: 09 83 std Y+1, r16 ; 0x01 if(!comment_mode){ 10930: 80 91 43 03 lds r24, 0x0343 ; 0x800343 10934: 81 11 cpse r24, r1 10936: 03 c1 rjmp .+518 ; 0x10b3e long gcode_N = -1; // seen line number // Line numbers must be first in buffer if (*cmd_head == 'N') { 10938: f8 01 movw r30, r16 1093a: 80 81 ld r24, Z 1093c: 8e 34 cpi r24, 0x4E ; 78 1093e: 09 f0 breq .+2 ; 0x10942 10940: 8a c0 rjmp .+276 ; 0x10a56 // Line number met: decode the number, then move cmd_start past all spaces. gcode_N = (strtol(cmd_head+1, &cmd_start, 10)); 10942: 4a e0 ldi r20, 0x0A ; 10 10944: 50 e0 ldi r21, 0x00 ; 0 10946: be 01 movw r22, r28 10948: 6f 5f subi r22, 0xFF ; 255 1094a: 7f 4f sbci r23, 0xFF ; 255 1094c: c8 01 movw r24, r16 1094e: 01 96 adiw r24, 0x01 ; 1 10950: 0f 94 9b d7 call 0x3af36 ; 0x3af36 10954: 2b 01 movw r4, r22 10956: 3c 01 movw r6, r24 while (*cmd_start == ' ') ++cmd_start; 10958: e9 80 ldd r14, Y+1 ; 0x01 1095a: fa 80 ldd r15, Y+2 ; 0x02 1095c: f7 01 movw r30, r14 1095e: 80 81 ld r24, Z 10960: 80 32 cpi r24, 0x20 ; 32 10962: 31 f4 brne .+12 ; 0x10970 10964: ff ef ldi r31, 0xFF ; 255 10966: ef 1a sub r14, r31 10968: ff 0a sbc r15, r31 1096a: fa 82 std Y+2, r15 ; 0x02 1096c: e9 82 std Y+1, r14 ; 0x01 1096e: f4 cf rjmp .-24 ; 0x10958 // 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)) { 10970: 80 90 78 03 lds r8, 0x0378 ; 0x800378 10974: 90 90 79 03 lds r9, 0x0379 ; 0x800379 10978: a0 90 7a 03 lds r10, 0x037A ; 0x80037a 1097c: b0 90 7b 03 lds r11, 0x037B ; 0x80037b 10980: d5 01 movw r26, r10 10982: c4 01 movw r24, r8 10984: 01 96 adiw r24, 0x01 ; 1 10986: a1 1d adc r26, r1 10988: b1 1d adc r27, r1 1098a: 84 15 cp r24, r4 1098c: 95 05 cpc r25, r5 1098e: a6 05 cpc r26, r6 10990: b7 05 cpc r27, r7 10992: 49 f0 breq .+18 ; 0x109a6 10994: 44 e0 ldi r20, 0x04 ; 4 10996: 50 e0 ldi r21, 0x00 ; 0 10998: 69 e2 ldi r22, 0x29 ; 41 1099a: 77 e7 ldi r23, 0x77 ; 119 1099c: c7 01 movw r24, r14 1099e: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 109a2: 89 2b or r24, r25 109a4: a1 f4 brne .+40 ; 0x109ce FlushSerialRequestResend(); serial_count = 0; return; } if((strchr_pointer = strchr(cmd_start, '*')) != NULL) 109a6: 6a e2 ldi r22, 0x2A ; 42 109a8: 70 e0 ldi r23, 0x00 ; 0 109aa: c7 01 movw r24, r14 109ac: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 109b0: 90 93 94 03 sts 0x0394, r25 ; 0x800394 109b4: 80 93 93 03 sts 0x0393, r24 ; 0x800393 109b8: 00 97 sbiw r24, 0x00 ; 0 109ba: 09 f4 brne .+2 ; 0x109be 109bc: 45 c0 rjmp .+138 ; 0x10a48 109be: f8 01 movw r30, r16 { byte checksum = 0; 109c0: f1 2c mov r15, r1 char *p = cmd_head; while (p != strchr_pointer) 109c2: e8 17 cp r30, r24 109c4: f9 07 cpc r31, r25 109c6: 71 f0 breq .+28 ; 0x109e4 checksum = checksum^(*p++); 109c8: 21 91 ld r18, Z+ 109ca: f2 26 eor r15, r18 109cc: fa cf rjmp .-12 ; 0x109c2 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; 109ce: 8a ec ldi r24, 0xCA ; 202 109d0: 9a ea ldi r25, 0xAA ; 170 109d2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO 109d6: 82 ec ldi r24, 0xC2 ; 194 109d8: 94 e6 ldi r25, 0x64 ; 100 *strchr_pointer = 0; } else { SERIAL_ERROR_START; SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM 109da: 0e 94 e8 76 call 0xedd0 ; 0xedd0 109de: c5 01 movw r24, r10 109e0: b4 01 movw r22, r8 109e2: 15 c0 rjmp .+42 ; 0x10a0e { byte checksum = 0; char *p = cmd_head; while (p != strchr_pointer) checksum = checksum^(*p++); if (code_value_short() != (int16_t)checksum) { 109e4: 0e 94 0d 5b call 0xb61a ; 0xb61a 109e8: f8 16 cp r15, r24 109ea: 19 06 cpc r1, r25 109ec: d9 f0 breq .+54 ; 0x10a24 SERIAL_ERROR_START; 109ee: 8a ec ldi r24, 0xCA ; 202 109f0: 9a ea ldi r25, 0xAA ; 170 109f2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH 109f6: 83 ea ldi r24, 0xA3 ; 163 109f8: 94 e6 ldi r25, 0x64 ; 100 109fa: 0e 94 e8 76 call 0xedd0 ; 0xedd0 109fe: 60 91 78 03 lds r22, 0x0378 ; 0x800378 10a02: 70 91 79 03 lds r23, 0x0379 ; 0x800379 10a06: 80 91 7a 03 lds r24, 0x037A ; 0x80037a 10a0a: 90 91 7b 03 lds r25, 0x037B ; 0x80037b 10a0e: 0f 94 5f d5 call 0x3aabe ; 0x3aabe } void MarlinSerial::println(long n, int base) { print(n, base); println(); 10a12: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_ERRORLN(gcode_LastN); FlushSerialRequestResend(); 10a16: 0e 94 25 5b call 0xb64a ; 0xb64a serial_count = 0; 10a1a: 10 92 9e 10 sts 0x109E, r1 ; 0x80109e 10a1e: 10 92 9d 10 sts 0x109D, r1 ; 0x80109d 10a22: 58 ce rjmp .-848 ; 0x106d4 return; } // If no errors, remove the checksum and continue parsing. *strchr_pointer = 0; 10a24: e0 91 93 03 lds r30, 0x0393 ; 0x800393 10a28: f0 91 94 03 lds r31, 0x0394 ; 0x800394 10a2c: 10 82 st Z, r1 return; } } // Handle KILL early, even when Stopped if(strcmp_P(cmd_start, PSTR("M112")) == 0) 10a2e: e9 80 ldd r14, Y+1 ; 0x01 10a30: fa 80 ldd r15, Y+2 ; 0x02 10a32: 64 e2 ldi r22, 0x24 ; 36 10a34: 77 e7 ldi r23, 0x77 ; 119 10a36: c7 01 movw r24, r14 10a38: 0f 94 be d9 call 0x3b37c ; 0x3b37c 10a3c: 89 2b or r24, r25 10a3e: 39 f5 brne .+78 ; 0x10a8e kill(MSG_M112_KILL); 10a40: 8d ed ldi r24, 0xDD ; 221 10a42: 97 e6 ldi r25, 0x67 ; 103 10a44: 0e 94 a2 79 call 0xf344 ; 0xf344 // If no errors, remove the checksum and continue parsing. *strchr_pointer = 0; } else { SERIAL_ERROR_START; 10a48: 8a ec ldi r24, 0xCA ; 202 10a4a: 9a ea ldi r25, 0xAA ; 170 10a4c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM 10a50: 89 e7 ldi r24, 0x79 ; 121 10a52: 94 e6 ldi r25, 0x64 ; 100 10a54: c2 cf rjmp .-124 ; 0x109da } } else { // move cmd_start past all spaces while (*cmd_start == ' ') ++cmd_start; 10a56: 89 81 ldd r24, Y+1 ; 0x01 10a58: 9a 81 ldd r25, Y+2 ; 0x02 10a5a: fc 01 movw r30, r24 10a5c: 20 81 ld r18, Z 10a5e: 20 32 cpi r18, 0x20 ; 32 10a60: 21 f4 brne .+8 ; 0x10a6a 10a62: 01 96 adiw r24, 0x01 ; 1 10a64: 9a 83 std Y+2, r25 ; 0x02 10a66: 89 83 std Y+1, r24 ; 0x01 10a68: f6 cf rjmp .-20 ; 0x10a56 // if we didn't receive 'N' but still see '*' if (strchr(cmd_start, '*') != NULL) 10a6a: 6a e2 ldi r22, 0x2A ; 42 10a6c: 70 e0 ldi r23, 0x00 ; 0 10a6e: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 10a72: 89 2b or r24, r25 10a74: 39 f0 breq .+14 ; 0x10a84 { SERIAL_ERROR_START; 10a76: 8a ec ldi r24, 0xCA ; 202 10a78: 9a ea ldi r25, 0xAA ; 170 10a7a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM 10a7e: 8f e4 ldi r24, 0x4F ; 79 10a80: 94 e6 ldi r25, 0x64 ; 100 10a82: bb cf rjmp .-138 ; 0x109fa 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 10a84: 44 24 eor r4, r4 10a86: 4a 94 dec r4 10a88: 54 2c mov r5, r4 10a8a: 32 01 movw r6, r4 10a8c: d0 cf rjmp .-96 ; 0x10a2e 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) 10a8e: 44 e0 ldi r20, 0x04 ; 4 10a90: 50 e0 ldi r21, 0x00 ; 0 10a92: 6f e1 ldi r22, 0x1F ; 31 10a94: 77 e7 ldi r23, 0x77 ; 119 10a96: c7 01 movw r24, r14 10a98: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 10a9c: 5c 01 movw r10, r24 allow_when_stopped = true; // Handle the USB timer if ((*cmd_start == 'G') && (GetPrinterState() != PrinterState::IsSDPrinting)) { 10a9e: f7 01 movw r30, r14 10aa0: 80 81 ld r24, Z 10aa2: 87 34 cpi r24, 0x47 ; 71 10aa4: 81 f4 brne .+32 ; 0x10ac6 10aa6: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 10aaa: 85 30 cpi r24, 0x05 ; 5 10aac: 61 f0 breq .+24 ; 0x10ac6 usb_timer.start(); 10aae: 8d e0 ldi r24, 0x0D ; 13 10ab0: 95 e0 ldi r25, 0x05 ; 5 10ab2: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> PrinterState GetPrinterState() { return printer_state; } PrinterState SetPrinterState(PrinterState status) { return printer_state = status; 10ab6: f6 e0 ldi r31, 0x06 ; 6 10ab8: f0 93 b7 0d sts 0x0DB7, r31 ; 0x800db7 <_ZL13printer_state.lto_priv.403> if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 10abc: 60 e0 ldi r22, 0x00 ; 0 10abe: 85 ea ldi r24, 0xA5 ; 165 10ac0: 9f e0 ldi r25, 0x0F ; 15 10ac2: 0f 94 34 dc call 0x3b868 ; 0x3b868 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) { 10ac6: ab 28 or r10, r11 10ac8: 21 f0 breq .+8 ; 0x10ad2 10aca: 80 91 10 05 lds r24, 0x0510 ; 0x800510 10ace: 81 11 cpse r24, r1 10ad0: a4 cf rjmp .-184 ; 0x10a1a } // 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; 10ad2: 26 e0 ldi r18, 0x06 ; 6 10ad4: 77 fc sbrc r7, 7 10ad6: 21 e0 ldi r18, 0x01 ; 1 10ad8: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10adc: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10ae0: fc 01 movw r30, r24 10ae2: ec 55 subi r30, 0x5C ; 92 10ae4: ff 4e sbci r31, 0xEF ; 239 10ae6: 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) 10ae8: 49 81 ldd r20, Y+1 ; 0x01 10aea: 5a 81 ldd r21, Y+2 ; 0x02 cmd_len = strlen(cmd_start) + 1; 10aec: 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) 10aee: da 01 movw r26, r20 10af0: 40 17 cp r20, r16 10af2: 51 07 cpc r21, r17 10af4: a1 f5 brne .+104 ; 0x10b5e cmd_len = strlen(cmd_start) + 1; 10af6: 01 90 ld r0, Z+ 10af8: 00 20 and r0, r0 10afa: e9 f7 brne .-6 ; 0x10af6 10afc: 9f 01 movw r18, r30 10afe: 20 1b sub r18, r16 10b00: 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; 10b02: 03 96 adiw r24, 0x03 ; 3 10b04: 28 0f add r18, r24 10b06: 39 1f adc r19, r25 if (bufindw == sizeof(cmdbuffer)) 10b08: 2d 3e cpi r18, 0xED ; 237 10b0a: f1 e0 ldi r31, 0x01 ; 1 10b0c: 3f 07 cpc r19, r31 10b0e: 79 f1 breq .+94 ; 0x10b6e // 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; 10b10: 30 93 a0 10 sts 0x10A0, r19 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10b14: 20 93 9f 10 sts 0x109F, r18 ; 0x80109f <_ZL7bufindw.lto_priv.552> if (bufindw == sizeof(cmdbuffer)) bufindw = 0; ++ buflen; 10b18: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 10b1c: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 10b20: 01 96 adiw r24, 0x01 ; 1 10b22: 90 93 a3 10 sts 0x10A3, r25 ; 0x8010a3 10b26: 80 93 a2 10 sts 0x10A2, r24 ; 0x8010a2 // Update the processed gcode line if (gcode_N >= 0) 10b2a: 77 fc sbrc r7, 7 10b2c: 08 c0 rjmp .+16 ; 0x10b3e gcode_LastN = gcode_N; 10b2e: 40 92 78 03 sts 0x0378, r4 ; 0x800378 10b32: 50 92 79 03 sts 0x0379, r5 ; 0x800379 10b36: 60 92 7a 03 sts 0x037A, r6 ; 0x80037a 10b3a: 70 92 7b 03 sts 0x037B, r7 ; 0x80037b 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 10b3e: 10 92 9e 10 sts 0x109E, r1 ; 0x80109e 10b42: 10 92 9d 10 sts 0x109D, r1 ; 0x80109d // 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)) 10b46: 0e 94 a1 76 call 0xed42 ; 0xed42 10b4a: 89 2b or r24, r25 10b4c: 09 f4 brne .+2 ; 0x10b50 10b4e: c2 cd rjmp .-1148 ; 0x106d4 10b50: 8f e5 ldi r24, 0x5F ; 95 10b52: 90 e0 ldi r25, 0x00 ; 0 10b54: 0e 94 da 5b call 0xb7b4 ; 0xb7b4 10b58: 81 11 cpse r24, r1 10b5a: 79 cd rjmp .-1294 ; 0x1064e 10b5c: bb cd rjmp .-1162 ; 0x106d4 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]; } 10b5e: 6d 91 ld r22, X+ 10b60: 61 93 st Z+, r22 10b62: 9d 01 movw r18, r26 10b64: 24 1b sub r18, r20 10b66: 35 0b sbc r19, r21 while (cmd_head[cmd_len++]); 10b68: 61 11 cpse r22, r1 10b6a: f9 cf rjmp .-14 ; 0x10b5e 10b6c: ca cf rjmp .-108 ; 0x10b02 } bufindw += cmd_len + CMDHDRSIZE; if (bufindw == sizeof(cmdbuffer)) bufindw = 0; 10b6e: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10b72: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> 10b76: d0 cf rjmp .-96 ; 0x10b18 #ifdef ENABLE_MEATPACK } #endif } // end of serial line processing loop if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) { 10b78: 60 ed ldi r22, 0xD0 ; 208 10b7a: 77 e0 ldi r23, 0x07 ; 7 10b7c: 84 e4 ldi r24, 0x44 ; 68 10b7e: 93 e0 ldi r25, 0x03 ; 3 10b80: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 10b84: 88 23 and r24, r24 10b86: 09 f4 brne .+2 ; 0x10b8a 10b88: a1 cd rjmp .-1214 ; 0x106cc comment_mode = false; 10b8a: 10 92 43 03 sts 0x0343, r1 ; 0x800343 serial_count = 0; 10b8e: 10 92 9e 10 sts 0x109E, r1 ; 0x80109e 10b92: 10 92 9d 10 sts 0x109D, r1 ; 0x80109d SERIAL_ECHOLNPGM("RX timeout"); 10b96: 84 e1 ldi r24, 0x14 ; 20 10b98: 97 e7 ldi r25, 0x77 ; 119 10b9a: 0e 94 13 79 call 0xf226 ; 0xf226 10b9e: 9a cd rjmp .-1228 ; 0x106d4 return; } #ifdef SDSUPPORT if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){ 10ba0: 80 91 22 17 lds r24, 0x1722 ; 0x801722 10ba4: 88 23 and r24, r24 10ba6: 09 f4 brne .+2 ; 0x10baa 10ba8: 95 cd rjmp .-1238 ; 0x106d4 10baa: 80 91 9d 10 lds r24, 0x109D ; 0x80109d 10bae: 90 91 9e 10 lds r25, 0x109E ; 0x80109e 10bb2: 89 2b or r24, r25 10bb4: 09 f0 breq .+2 ; 0x10bb8 10bb6: 8e cd rjmp .-1252 ; 0x106d4 //'#' 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; 10bb8: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 10bbc: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 10bc0: 89 2b or r24, r25 10bc2: 11 f4 brne .+4 ; 0x10bc8 10bc4: 10 92 42 03 sts 0x0342, r1 ; 0x800342 } eof_or_fail: // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; 10bc8: 2c e9 ldi r18, 0x9C ; 156 10bca: e2 2e mov r14, r18 10bcc: 20 e1 ldi r18, 0x10 ; 16 10bce: f2 2e mov r15, r18 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; 10bd0: 32 e0 ldi r19, 0x02 ; 2 10bd2: d3 2e mov r13, r19 || serial_char == '#' || serial_count >= (MAX_CMD_SIZE - 1) || n==-1 ){ if(serial_char=='#') stop_buffering=true; 10bd4: cc 24 eor r12, r12 10bd6: c3 94 inc r12 } 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) { 10bd8: 40 91 a3 17 lds r20, 0x17A3 ; 0x8017a3 10bdc: 50 91 a4 17 lds r21, 0x17A4 ; 0x8017a4 10be0: 60 91 a5 17 lds r22, 0x17A5 ; 0x8017a5 10be4: 70 91 a6 17 lds r23, 0x17A6 ; 0x8017a6 10be8: 80 91 9c 17 lds r24, 0x179C ; 0x80179c 10bec: 90 91 9d 17 lds r25, 0x179D ; 0x80179d 10bf0: a0 91 9e 17 lds r26, 0x179E ; 0x80179e 10bf4: b0 91 9f 17 lds r27, 0x179F ; 0x80179f 10bf8: 48 17 cp r20, r24 10bfa: 59 07 cpc r21, r25 10bfc: 6a 07 cpc r22, r26 10bfe: 7b 07 cpc r23, r27 10c00: 08 f0 brcs .+2 ; 0x10c04 10c02: 2f c1 rjmp .+606 ; 0x10e62 10c04: 80 91 42 03 lds r24, 0x0342 ; 0x800342 10c08: 81 11 cpse r24, r1 10c0a: 2b c1 rjmp .+598 ; 0x10e62 : "r22" /* modifying register R22 - so that the compiler knows */ \ ) // avoid calling the default heavy-weight read() for just one byte int16_t SdFile::readFilteredGcode(){ if( ! gfEnsureBlock() ){ 10c0c: 0f 94 7a 7b call 0x2f6f4 ; 0x2f6f4 10c10: 88 23 and r24, r24 10c12: 49 f1 breq .+82 ; 0x10c66 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; 10c14: 20 91 3a 17 lds r18, 0x173A ; 0x80173a 10c18: 30 91 3b 17 lds r19, 0x173B ; 0x80173b // 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; 10c1c: 89 01 movw r16, 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; 10c1e: 9b ef ldi r25, 0xFB ; 251 10c20: b9 2e mov r11, r25 // the same applies to gfXBegin, codesize dropped another 100B! const uint8_t *blockBuffBegin = gfBlockBuffBegin(); uint8_t consecutiveCommentLines = 0; while( *rdPtr == ';' ){ 10c22: f8 01 movw r30, r16 10c24: 80 81 ld r24, Z 10c26: 8b 33 cpi r24, 0x3B ; 59 10c28: 51 f5 brne .+84 ; 0x10c7e // 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); 10c2a: f8 01 movw r30, r16 00010c2c : 10c2c: 61 91 ld r22, Z+ 10c2e: 6a 30 cpi r22, 0x0A ; 10 10c30: e9 f7 brne .-6 ; 0x10c2c 10c32: 8f 01 movw r16, r30 // found a newline, prepare the next block if block cache end reached if( rdPtr - blockBuffBegin > 512 ){ 10c34: cf 01 movw r24, r30 10c36: 8c 59 subi r24, 0x9C ; 156 10c38: 9e 40 sbci r25, 0x0E ; 14 10c3a: 81 30 cpi r24, 0x01 ; 1 10c3c: 92 40 sbci r25, 0x02 ; 2 10c3e: d4 f0 brlt .+52 ; 0x10c74 // at the end of block cache, fill new data in gfUpdateCurrentPosition( rdPtr - start - 1 ); 10c40: c8 01 movw r24, r16 10c42: 82 1b sub r24, r18 10c44: 93 0b sbc r25, r19 10c46: 01 97 sbiw r24, 0x01 ; 1 10c48: 0f 94 6b 7b call 0x2f6d6 ; 0x2f6d6 if( ! gfComputeNextFileBlock() )goto eof_or_fail; 10c4c: 8f e1 ldi r24, 0x1F ; 31 10c4e: 97 e1 ldi r25, 0x17 ; 23 10c50: 0f 94 10 57 call 0x2ae20 ; 0x2ae20 10c54: 88 23 and r24, r24 10c56: 39 f0 breq .+14 ; 0x10c66 if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM 10c58: 0f 94 7a 7b call 0x2f6f4 ; 0x2f6f4 rdPtr = start = blockBuffBegin; 10c5c: 2c e9 ldi r18, 0x9C ; 156 10c5e: 3e e0 ldi r19, 0x0E ; 14 10c60: 89 01 movw r16, 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 10c62: 81 11 cpse r24, r1 10c64: e2 cf rjmp .-60 ; 0x10c2a } eof_or_fail: // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; 10c66: f0 92 3b 17 sts 0x173B, r15 ; 0x80173b 10c6a: e0 92 3a 17 sts 0x173A, r14 ; 0x80173a return -1; 10c6e: 0f ef ldi r16, 0xFF ; 255 10c70: 1f ef ldi r17, 0xFF ; 255 10c72: 37 c0 rjmp .+110 ; 0x10ce2 10c74: ba 94 dec r11 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){ 10c76: b1 10 cpse r11, r1 10c78: d5 c0 rjmp .+426 ; 0x10e24 // 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 10c7a: 01 50 subi r16, 0x01 ; 1 10c7c: 11 09 sbc r17, r1 } } } emit_char: { gfUpdateCurrentPosition( rdPtr - start + 1 ); 10c7e: c8 01 movw r24, r16 10c80: 82 1b sub r24, r18 10c82: 93 0b sbc r25, r19 10c84: 01 96 adiw r24, 0x01 ; 1 10c86: 0f 94 6b 7b call 0x2f6d6 ; 0x2f6d6 int16_t rv = *rdPtr++; 10c8a: c8 01 movw r24, r16 10c8c: 01 96 adiw r24, 0x01 ; 1 10c8e: f8 01 movw r30, r16 10c90: 00 81 ld r16, Z 10c92: 10 e0 ldi r17, 0x00 ; 0 if( curPosition_ >= fileSize_ ){ 10c94: 80 90 27 17 lds r8, 0x1727 ; 0x801727 10c98: 90 90 28 17 lds r9, 0x1728 ; 0x801728 10c9c: a0 90 29 17 lds r10, 0x1729 ; 0x801729 10ca0: b0 90 2a 17 lds r11, 0x172A ; 0x80172a 10ca4: 40 91 30 17 lds r20, 0x1730 ; 0x801730 10ca8: 50 91 31 17 lds r21, 0x1731 ; 0x801731 10cac: 60 91 32 17 lds r22, 0x1732 ; 0x801732 10cb0: 70 91 33 17 lds r23, 0x1733 ; 0x801733 10cb4: 84 16 cp r8, r20 10cb6: 95 06 cpc r9, r21 10cb8: a6 06 cpc r10, r22 10cba: b7 06 cpc r11, r23 10cbc: a0 f6 brcc .-88 ; 0x10c66 // past the end of file goto eof_or_fail; } else if( rdPtr - blockBuffBegin >= 512 ){ 10cbe: 9c 01 movw r18, r24 10cc0: 2c 59 subi r18, 0x9C ; 156 10cc2: 3e 40 sbci r19, 0x0E ; 14 10cc4: 21 15 cp r18, r1 10cc6: 32 40 sbci r19, 0x02 ; 2 10cc8: 44 f0 brlt .+16 ; 0x10cda // past the end of current bufferred block - prepare the next one... if( ! gfComputeNextFileBlock() )goto eof_or_fail; 10cca: 8f e1 ldi r24, 0x1F ; 31 10ccc: 97 e1 ldi r25, 0x17 ; 23 10cce: 0f 94 10 57 call 0x2ae20 ; 0x2ae20 10cd2: 88 23 and r24, r24 10cd4: 41 f2 breq .-112 ; 0x10c66 // don't need to force fetch the block here, it will get loaded on the next call rdPtr = blockBuffBegin; 10cd6: 8c e9 ldi r24, 0x9C ; 156 10cd8: 9e e0 ldi r25, 0x0E ; 14 } // save the current read ptr for the next run gfReadPtr = rdPtr; 10cda: 90 93 3b 17 sts 0x173B, r25 ; 0x80173b 10cde: 80 93 3a 17 sts 0x173A, r24 ; 0x80173a 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_;} 10ce2: 40 91 27 17 lds r20, 0x1727 ; 0x801727 10ce6: 50 91 28 17 lds r21, 0x1728 ; 0x801728 10cea: 60 91 29 17 lds r22, 0x1729 ; 0x801729 10cee: 70 91 2a 17 lds r23, 0x172A ; 0x80172a FORCE_INLINE bool isFileOpen() { return file.isOpen(); } bool eof() { return sdpos>=filesize; } FORCE_INLINE int16_t getFilteredGcodeChar() { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); 10cf2: 40 93 a3 17 sts 0x17A3, r20 ; 0x8017a3 10cf6: 50 93 a4 17 sts 0x17A4, r21 ; 0x8017a4 10cfa: 60 93 a5 17 sts 0x17A5, r22 ; 0x8017a5 10cfe: 70 93 a6 17 sts 0x17A6, r23 ; 0x8017a6 10d02: 80 91 9d 10 lds r24, 0x109D ; 0x80109d 10d06: 90 91 9e 10 lds r25, 0x109E ; 0x80109e int16_t n=card.getFilteredGcodeChar(); char serial_char = (char)n; if( serial_char == '\n' 10d0a: 0a 30 cpi r16, 0x0A ; 10 10d0c: 61 f0 breq .+24 ; 0x10d26 || serial_char == '\r' 10d0e: 0d 30 cpi r16, 0x0D ; 13 10d10: 51 f0 breq .+20 ; 0x10d26 || serial_char == '#' 10d12: 03 32 cpi r16, 0x23 ; 35 10d14: 09 f4 brne .+2 ; 0x10d18 10d16: 8c c0 rjmp .+280 ; 0x10e30 || serial_count >= (MAX_CMD_SIZE - 1) 10d18: 8f 35 cpi r24, 0x5F ; 95 10d1a: 91 05 cpc r25, r1 10d1c: 3c f4 brge .+14 ; 0x10d2c || n==-1 10d1e: 0f 3f cpi r16, 0xFF ; 255 10d20: 10 07 cpc r17, r16 10d22: 09 f0 breq .+2 ; 0x10d26 10d24: 8c c0 rjmp .+280 ; 0x10e3e ){ if(serial_char=='#') stop_buffering=true; if(!serial_count) 10d26: 00 97 sbiw r24, 0x00 ; 0 10d28: 09 f4 brne .+2 ; 0x10d2c 10d2a: d4 cc rjmp .-1624 ; 0x106d4 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); }; 10d2c: 20 91 22 17 lds r18, 0x1722 ; 0x801722 10d30: 21 11 cpse r18, r1 10d32: 03 c0 rjmp .+6 ; 0x10d3a 10d34: 40 e0 ldi r20, 0x00 ; 0 10d36: 50 e0 ldi r21, 0x00 ; 0 10d38: 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; 10d3a: 20 91 80 03 lds r18, 0x0380 ; 0x800380 10d3e: 30 91 81 03 lds r19, 0x0381 ; 0x800381 10d42: 42 1b sub r20, r18 10d44: 53 0b sbc r21, r19 cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD; 10d46: a0 91 9f 10 lds r26, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10d4a: b0 91 a0 10 lds r27, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10d4e: fd 01 movw r30, r26 10d50: ec 55 subi r30, 0x5C ; 92 10d52: ff 4e sbci r31, 0xEF ; 239 10d54: d0 82 st Z, r13 cmdbuffer[bufindw+1] = sd_count.lohi.lo; 10d56: 41 83 std Z+1, r20 ; 0x01 cmdbuffer[bufindw+2] = sd_count.lohi.hi; 10d58: 52 83 std Z+2, r21 ; 0x02 10d5a: 13 96 adiw r26, 0x03 ; 3 cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; //terminate string 10d5c: 8c 55 subi r24, 0x5C ; 92 10d5e: 9f 4e sbci r25, 0xEF ; 239 10d60: fc 01 movw r30, r24 10d62: ea 0f add r30, r26 10d64: fb 1f adc r31, r27 10d66: 10 82 st Z, r1 // Calculate the length before disabling the interrupts. uint8_t len = strlen(cmdbuffer+bufindw+CMDHDRSIZE) + (1 + CMDHDRSIZE); 10d68: ac 55 subi r26, 0x5C ; 92 10d6a: bf 4e sbci r27, 0xEF ; 239 10d6c: fd 01 movw r30, r26 10d6e: 01 90 ld r0, Z+ 10d70: 00 20 and r0, r0 10d72: e9 f7 brne .-6 ; 0x10d6e 10d74: 31 97 sbiw r30, 0x01 ; 1 10d76: ea 1b sub r30, r26 10d78: fb 0b sbc r31, r27 // MYSERIAL.print(cmdbuffer); // SERIAL_ECHOPGM("buflen:"); // MYSERIAL.print(buflen+1); sd_count.value = 0; cli(); 10d7a: 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; 10d7c: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 10d80: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 10d84: 01 96 adiw r24, 0x01 ; 1 10d86: 90 93 a3 10 sts 0x10A3, r25 ; 0x8010a3 10d8a: 80 93 a2 10 sts 0x10A2, r24 ; 0x8010a2 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); 10d8e: 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; 10d90: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10d94: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10d98: e8 0f add r30, r24 10d9a: f9 2f mov r31, r25 10d9c: f1 1d adc r31, r1 10d9e: f0 93 a0 10 sts 0x10A0, r31 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10da2: e0 93 9f 10 sts 0x109F, r30 ; 0x80109f <_ZL7bufindw.lto_priv.552> 10da6: 80 91 22 17 lds r24, 0x1722 ; 0x801722 10daa: 88 23 and r24, r24 10dac: 09 f4 brne .+2 ; 0x10db0 10dae: 43 c0 rjmp .+134 ; 0x10e36 10db0: 80 91 a3 17 lds r24, 0x17A3 ; 0x8017a3 10db4: 90 91 a4 17 lds r25, 0x17A4 ; 0x8017a4 10db8: a0 91 a5 17 lds r26, 0x17A5 ; 0x8017a5 10dbc: b0 91 a6 17 lds r27, 0x17A6 ; 0x8017a6 sdpos_atomic = card.get_sdpos(); 10dc0: 80 93 80 03 sts 0x0380, r24 ; 0x800380 10dc4: 90 93 81 03 sts 0x0381, r25 ; 0x800381 10dc8: a0 93 82 03 sts 0x0382, r26 ; 0x800382 10dcc: b0 93 83 03 sts 0x0383, r27 ; 0x800383 if (bufindw == sizeof(cmdbuffer)) 10dd0: ed 3e cpi r30, 0xED ; 237 10dd2: f1 40 sbci r31, 0x01 ; 1 10dd4: 21 f4 brne .+8 ; 0x10dde bufindw = 0; 10dd6: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10dda: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> sei(); 10dde: 78 94 sei comment_mode = false; //for new command 10de0: 10 92 43 03 sts 0x0343, r1 ; 0x800343 serial_count = 0; //clear buffer 10de4: 10 92 9e 10 sts 0x109E, r1 ; 0x80109e 10de8: 10 92 9d 10 sts 0x109D, r1 ; 0x80109d if(card.eof()) break; 10dec: 40 91 a3 17 lds r20, 0x17A3 ; 0x8017a3 10df0: 50 91 a4 17 lds r21, 0x17A4 ; 0x8017a4 10df4: 60 91 a5 17 lds r22, 0x17A5 ; 0x8017a5 10df8: 70 91 a6 17 lds r23, 0x17A6 ; 0x8017a6 10dfc: 80 91 9c 17 lds r24, 0x179C ; 0x80179c 10e00: 90 91 9d 17 lds r25, 0x179D ; 0x80179d 10e04: a0 91 9e 17 lds r26, 0x179E ; 0x80179e 10e08: b0 91 9f 17 lds r27, 0x179F ; 0x80179f 10e0c: 48 17 cp r20, r24 10e0e: 59 07 cpc r21, r25 10e10: 6a 07 cpc r22, r26 10e12: 7b 07 cpc r23, r27 10e14: 30 f5 brcc .+76 ; 0x10e62 // The following line will reserve buffer space if available. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1)) 10e16: 8f e5 ldi r24, 0x5F ; 95 10e18: 90 e0 ldi r25, 0x00 ; 0 10e1a: 0e 94 da 5b call 0xb7b4 ; 0xb7b4 10e1e: 81 11 cpse r24, r1 10e20: db ce rjmp .-586 ; 0x10bd8 10e22: 58 cc rjmp .-1872 ; 0x106d4 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 == ';' ){ 10e24: f8 01 movw r30, r16 10e26: 80 81 ld r24, Z 10e28: 8b 33 cpi r24, 0x3B ; 59 10e2a: 09 f4 brne .+2 ; 0x10e2e 10e2c: fa ce rjmp .-524 ; 0x10c22 10e2e: 25 cf rjmp .-438 ; 0x10c7a || serial_char == '#' || serial_count >= (MAX_CMD_SIZE - 1) || n==-1 ){ if(serial_char=='#') stop_buffering=true; 10e30: c0 92 42 03 sts 0x0342, r12 ; 0x800342 10e34: 78 cf rjmp .-272 ; 0x10d26 10e36: 80 e0 ldi r24, 0x00 ; 0 10e38: 90 e0 ldi r25, 0x00 ; 0 10e3a: dc 01 movw r26, r24 10e3c: c1 cf rjmp .-126 ; 0x10dc0 return; } else { // there are no comments coming from the filtered file cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char; 10e3e: 9c 01 movw r18, r24 10e40: 2f 5f subi r18, 0xFF ; 255 10e42: 3f 4f sbci r19, 0xFF ; 255 10e44: 30 93 9e 10 sts 0x109E, r19 ; 0x80109e 10e48: 20 93 9d 10 sts 0x109D, r18 ; 0x80109d 10e4c: 20 91 9f 10 lds r18, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10e50: 30 91 a0 10 lds r19, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10e54: 2c 55 subi r18, 0x5C ; 92 10e56: 3f 4e sbci r19, 0xEF ; 239 10e58: 82 0f add r24, r18 10e5a: 93 1f adc r25, r19 10e5c: fc 01 movw r30, r24 10e5e: 03 83 std Z+3, r16 ; 0x03 10e60: bb ce rjmp .-650 ; 0x10bd8 } } if(card.eof()) 10e62: 40 91 a3 17 lds r20, 0x17A3 ; 0x8017a3 10e66: 50 91 a4 17 lds r21, 0x17A4 ; 0x8017a4 10e6a: 60 91 a5 17 lds r22, 0x17A5 ; 0x8017a5 10e6e: 70 91 a6 17 lds r23, 0x17A6 ; 0x8017a6 10e72: 80 91 9c 17 lds r24, 0x179C ; 0x80179c 10e76: 90 91 9d 17 lds r25, 0x179D ; 0x80179d 10e7a: a0 91 9e 17 lds r26, 0x179E ; 0x80179e 10e7e: b0 91 9f 17 lds r27, 0x179F ; 0x80179f 10e82: 48 17 cp r20, r24 10e84: 59 07 cpc r21, r25 10e86: 6a 07 cpc r22, r26 10e88: 7b 07 cpc r23, r27 10e8a: 08 f4 brcc .+2 ; 0x10e8e 10e8c: 23 cc rjmp .-1978 ; 0x106d4 { // 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()) 10e8e: 0e 94 ab 5a call 0xb556 ; 0xb556 10e92: 89 2b or r24, r25 10e94: 09 f0 breq .+2 ; 0x10e98 10e96: 1e cc rjmp .-1988 ; 0x106d4 lastnr++; } void CardReader::closefile(bool store_location) { file.sync(); 10e98: 8f e1 ldi r24, 0x1F ; 31 10e9a: 97 e1 ldi r25, 0x17 ; 23 10e9c: 0f 94 32 59 call 0x2b264 ; 0x2b264 file.close(); 10ea0: 8f e1 ldi r24, 0x1F ; 31 10ea2: 97 e1 ldi r25, 0x17 ; 23 10ea4: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce saving = false; 10ea8: 10 92 8d 14 sts 0x148D, r1 ; 0x80148d logging = false; 10eac: 10 92 8e 14 sts 0x148E, r1 ; 0x80148e { // queue is complete, but before we process EOF commands prevent // re-entry by disabling SD processing from any st_synchronize call card.closefile(); SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED 10eb0: 8c e3 ldi r24, 0x3C ; 60 10eb2: 94 e6 ldi r25, 0x64 ; 100 10eb4: 0e 94 13 79 call 0xf226 ; 0xf226 char time[30]; uint32_t t = print_job_timer.duration() / 60; 10eb8: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 10ebc: 6b 01 movw r12, r22 10ebe: 7c 01 movw r14, r24 int hours, minutes; minutes = t % 60; hours = t / 60; save_statistics(); 10ec0: 0e 94 b7 65 call 0xcb6e ; 0xcb6e // 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; 10ec4: 8c e3 ldi r24, 0x3C ; 60 10ec6: 88 2e mov r8, r24 10ec8: 91 2c mov r9, r1 10eca: a1 2c mov r10, r1 10ecc: b1 2c mov r11, r1 10ece: c7 01 movw r24, r14 10ed0: b6 01 movw r22, r12 10ed2: a5 01 movw r20, r10 10ed4: 94 01 movw r18, r8 10ed6: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> int hours, minutes; minutes = t % 60; 10eda: ca 01 movw r24, r20 10edc: b9 01 movw r22, r18 10ede: a5 01 movw r20, r10 10ee0: 94 01 movw r18, r8 10ee2: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> hours = t / 60; save_statistics(); sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); 10ee6: 7f 93 push r23 10ee8: 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; 10eea: c7 01 movw r24, r14 10eec: b6 01 movw r22, r12 10eee: 20 e1 ldi r18, 0x10 ; 16 10ef0: 3e e0 ldi r19, 0x0E ; 14 10ef2: 40 e0 ldi r20, 0x00 ; 0 10ef4: 50 e0 ldi r21, 0x00 ; 0 10ef6: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> save_statistics(); sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes); 10efa: 3f 93 push r19 10efc: 2f 93 push r18 10efe: 80 e0 ldi r24, 0x00 ; 0 10f00: 97 e7 ldi r25, 0x77 ; 119 10f02: 9f 93 push r25 10f04: 8f 93 push r24 10f06: 8e 01 movw r16, r28 10f08: 0f 5f subi r16, 0xFF ; 255 10f0a: 1f 4f sbci r17, 0xFF ; 255 10f0c: 1f 93 push r17 10f0e: 0f 93 push r16 10f10: 0f 94 27 db call 0x3b64e ; 0x3b64e SERIAL_ECHO_START; 10f14: 82 ef ldi r24, 0xF2 ; 242 10f16: 9a ea ldi r25, 0xAA ; 170 10f18: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(time); 10f1c: c8 01 movw r24, r16 10f1e: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 #ifndef SHOW_FILENAME_AFTER_FINISH lcd_setstatus(time); 10f22: c8 01 movw r24, r16 10f24: 0e 94 42 f5 call 0x1ea84 ; 0x1ea84 #endif //SHOW_FILENAME_AFTER_FINISH card.printingHasFinished(); 10f28: 0f 94 7a 81 call 0x302f4 ; 0x302f4 if(!autostart_stilltocheck) return; if(autostart_atmillis.expired(5000)) return; } autostart_stilltocheck = false; 10f2c: 10 92 69 02 sts 0x0269, r1 ; 0x800269 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.553> if(!mounted) 10f30: 0f b6 in r0, 0x3f ; 63 10f32: f8 94 cli 10f34: de bf out 0x3e, r29 ; 62 10f36: 0f be out 0x3f, r0 ; 63 10f38: cd bf out 0x3d, r28 ; 61 10f3a: 80 91 90 14 lds r24, 0x1490 ; 0x801490 10f3e: 88 23 and r24, r24 10f40: 19 f0 breq .+6 ; 0x10f48 10f42: 0f 94 ae 76 call 0x2ed5c ; 0x2ed5c 10f46: c6 cb rjmp .-2164 ; 0x106d4 { mount(); 10f48: 81 e0 ldi r24, 0x01 ; 1 10f4a: 0f 94 b9 81 call 0x30372 ; 0x30372 if(!mounted) //fail 10f4e: 80 91 90 14 lds r24, 0x1490 ; 0x801490 10f52: 81 11 cpse r24, r1 10f54: f6 cf rjmp .-20 ; 0x10f42 10f56: be cb rjmp .-2180 ; 0x106d4 00010f58 : static void printFloat(double, uint8_t); public: static /*FORCE_INLINE*/ void write(const char *str) 10f58: cf 93 push r28 10f5a: df 93 push r29 10f5c: ec 01 movw r28, r24 { while (*str) 10f5e: 89 91 ld r24, Y+ 10f60: 88 23 and r24, r24 10f62: 19 f0 breq .+6 ; 0x10f6a write(*str++); 10f64: 0e 94 cf 76 call 0xed9e ; 0xed9e 10f68: fa cf rjmp .-12 ; 0x10f5e } 10f6a: df 91 pop r29 10f6c: cf 91 pop r28 10f6e: 08 95 ret 00010f70 : //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) { 10f70: ff 92 push r15 10f72: 0f 93 push r16 10f74: 1f 93 push r17 10f76: cf 93 push r28 10f78: df 93 push r29 10f7a: ec 01 movw r28, r24 10f7c: f6 2e mov r15, r22 size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd); 10f7e: 66 23 and r22, r22 10f80: 09 f4 brne .+2 ; 0x10f84 10f82: 4b c0 rjmp .+150 ; 0x1101a #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); 10f84: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> 10f88: 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)) { 10f8a: c8 01 movw r24, r16 10f8c: 0e 94 da 5b call 0xb7b4 ; 0xb7b4 10f90: 88 23 and r24, r24 10f92: 09 f4 brne .+2 ; 0x10f96 10f94: 53 c0 rjmp .+166 ; 0x1103c // 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; 10f96: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10f9a: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10f9e: fc 01 movw r30, r24 10fa0: ec 55 subi r30, 0x5C ; 92 10fa2: ff 4e sbci r31, 0xEF ; 239 10fa4: 23 e0 ldi r18, 0x03 ; 3 10fa6: 20 83 st Z, r18 10fa8: 89 55 subi r24, 0x59 ; 89 10faa: 9f 4e sbci r25, 0xEF ; 239 if (from_progmem) strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd); 10fac: 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) 10fae: ff 20 and r15, r15 10fb0: e9 f1 breq .+122 ; 0x1102c strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd); 10fb2: 0f 94 c7 d9 call 0x3b38e ; 0x3b38e else strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd); SERIAL_ECHO_START; 10fb6: 82 ef ldi r24, 0xF2 ; 242 10fb8: 9a ea ldi r25, 0xAA ; 170 10fba: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(MSG_Enqueing); 10fbe: 81 e3 ldi r24, 0x31 ; 49 10fc0: 94 e6 ldi r25, 0x64 ; 100 10fc2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); 10fc6: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10fca: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> } }*/ static FORCE_INLINE void print(const char *str) { write(str); 10fce: 89 55 subi r24, 0x59 ; 89 10fd0: 9f 4e sbci r25, 0xEF ; 239 10fd2: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHOLNPGM("\""); 10fd6: 8e ed ldi r24, 0xDE ; 222 10fd8: 96 e7 ldi r25, 0x76 ; 118 10fda: 0e 94 13 79 call 0xf226 ; 0xf226 bufindw += len + (CMDHDRSIZE + 1); 10fde: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 10fe2: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10fe6: 04 96 adiw r24, 0x04 ; 4 10fe8: 08 0f add r16, r24 10fea: 19 1f adc r17, r25 if (bufindw == sizeof(cmdbuffer)) 10fec: 0d 3e cpi r16, 0xED ; 237 10fee: 81 e0 ldi r24, 0x01 ; 1 10ff0: 18 07 cpc r17, r24 10ff2: f9 f0 breq .+62 ; 0x11032 strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd); SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_Enqueing); SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); SERIAL_ECHOLNPGM("\""); bufindw += len + (CMDHDRSIZE + 1); 10ff4: 10 93 a0 10 sts 0x10A0, r17 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 10ff8: 00 93 9f 10 sts 0x109F, r16 ; 0x80109f <_ZL7bufindw.lto_priv.552> if (bufindw == sizeof(cmdbuffer)) bufindw = 0; ++ buflen; 10ffc: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 11000: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 11004: 01 96 adiw r24, 0x01 ; 1 11006: 90 93 a3 10 sts 0x10A3, r25 ; 0x8010a3 1100a: 80 93 a2 10 sts 0x10A2, r24 ; 0x8010a2 SERIAL_ECHOLNRPGM(bufferFull); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 1100e: df 91 pop r29 11010: cf 91 pop r28 11012: 1f 91 pop r17 11014: 0f 91 pop r16 11016: ff 90 pop r15 11018: 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); 1101a: fc 01 movw r30, r24 1101c: 01 90 ld r0, Z+ 1101e: 00 20 and r0, r0 11020: e9 f7 brne .-6 ; 0x1101c 11022: 31 97 sbiw r30, 0x01 ; 1 11024: 8f 01 movw r16, r30 11026: 08 1b sub r16, r24 11028: 19 0b sbc r17, r25 1102a: af cf rjmp .-162 ; 0x10f8a // 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); 1102c: 0f 94 7b e2 call 0x3c4f6 ; 0x3c4f6 11030: c2 cf rjmp .-124 ; 0x10fb6 SERIAL_ECHORPGM(MSG_Enqueing); SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE); SERIAL_ECHOLNPGM("\""); bufindw += len + (CMDHDRSIZE + 1); if (bufindw == sizeof(cmdbuffer)) bufindw = 0; 11032: 10 92 a0 10 sts 0x10A0, r1 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 11036: 10 92 9f 10 sts 0x109F, r1 ; 0x80109f <_ZL7bufindw.lto_priv.552> 1103a: e0 cf rjmp .-64 ; 0x10ffc ++ buflen; #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; 1103c: 8a ec ldi r24, 0xCA ; 202 1103e: 9a ea ldi r25, 0xAA ; 170 11040: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(MSG_Enqueing); 11044: 81 e3 ldi r24, 0x31 ; 49 11046: 94 e6 ldi r25, 0x64 ; 100 11048: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); 1104c: ce 01 movw r24, r28 cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; SERIAL_ECHORPGM(MSG_Enqueing); if (from_progmem) 1104e: ff 20 and r15, r15 11050: 59 f0 breq .+22 ; 0x11068 SERIAL_PROTOCOLRPGM(cmd); 11052: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 11056: 83 eb ldi r24, 0xB3 ; 179 11058: 9a ea ldi r25, 0xAA ; 170 #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 1105a: df 91 pop r29 1105c: cf 91 pop r28 1105e: 1f 91 pop r17 11060: 0f 91 pop r16 11062: ff 90 pop r15 SERIAL_ECHORPGM(MSG_Enqueing); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 11064: 0c 94 13 79 jmp 0xf226 ; 0xf226 11068: 0e 94 ac 87 call 0x10f58 ; 0x10f58 1106c: f4 cf rjmp .-24 ; 0x11056 0001106e : { 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) { 1106e: 0f 93 push r16 11070: 1f 93 push r17 11072: cf 93 push r28 11074: df 93 push r29 11076: d6 2f mov r29, r22 11078: 8c 01 movw r16, r24 for (uint8_t i = 0; i < steps; ++i) 1107a: c0 e0 ldi r28, 0x00 ; 0 { void * const pgm_ptr = pgm_read_ptr(cmd_sequence + i); 1107c: f8 01 movw r30, r16 1107e: 85 91 lpm r24, Z+ 11080: 94 91 lpm r25, Z // M702 is currently only used with MMU enabled if (pgm_ptr == MSG_M702 && !MMU2::mmu2.Enabled()) { 11082: 2b e6 ldi r18, 0x6B ; 107 11084: 81 37 cpi r24, 0x71 ; 113 11086: 92 07 cpc r25, r18 11088: 21 f4 brne .+8 ; 0x11092 1108a: 20 91 b9 13 lds r18, 0x13B9 ; 0x8013b9 1108e: 21 30 cpi r18, 0x01 ; 1 11090: 19 f4 brne .+6 ; 0x11098 continue; } enquecommand_P(static_cast(pgm_ptr)); 11092: 61 e0 ldi r22, 0x01 ; 1 11094: 0e 94 b8 87 call 0x10f70 ; 0x10f70 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) 11098: cf 5f subi r28, 0xFF ; 255 1109a: 0e 5f subi r16, 0xFE ; 254 1109c: 1f 4f sbci r17, 0xFF ; 255 1109e: dc 13 cpse r29, r28 110a0: ed cf rjmp .-38 ; 0x1107c continue; } enquecommand_P(static_cast(pgm_ptr)); } } 110a2: df 91 pop r29 110a4: cf 91 pop r28 110a6: 1f 91 pop r17 110a8: 0f 91 pop r16 110aa: 08 95 ret 000110ac : static const char bufferFull[] PROGMEM = "\" failed: Buffer full!"; static const char enqueingFront[] PROGMEM = "Enqueing to the front: \""; void enquecommandf_P(const char *fmt, ...) { 110ac: cf 93 push r28 110ae: df 93 push r29 110b0: cd b7 in r28, 0x3d ; 61 110b2: de b7 in r29, 0x3e ; 62 110b4: 6e 97 sbiw r28, 0x1e ; 30 110b6: 0f b6 in r0, 0x3f ; 63 110b8: f8 94 cli 110ba: de bf out 0x3e, r29 ; 62 110bc: 0f be out 0x3f, r0 ; 63 110be: cd bf out 0x3d, r28 ; 61 110c0: 9e 01 movw r18, r28 110c2: 2c 5d subi r18, 0xDC ; 220 110c4: 3f 4f sbci r19, 0xFF ; 255 110c6: f9 01 movw r30, r18 110c8: 41 91 ld r20, Z+ 110ca: 51 91 ld r21, Z+ 110cc: 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); 110ce: 6e e1 ldi r22, 0x1E ; 30 110d0: 70 e0 ldi r23, 0x00 ; 0 110d2: ce 01 movw r24, r28 110d4: 01 96 adiw r24, 0x01 ; 1 110d6: 0f 94 66 db call 0x3b6cc ; 0x3b6cc va_end(ap); enquecommand(cmd_buffer, false); 110da: 60 e0 ldi r22, 0x00 ; 0 110dc: ce 01 movw r24, r28 110de: 01 96 adiw r24, 0x01 ; 1 110e0: 0e 94 b8 87 call 0x10f70 ; 0x10f70 } 110e4: 6e 96 adiw r28, 0x1e ; 30 110e6: 0f b6 in r0, 0x3f ; 63 110e8: f8 94 cli 110ea: de bf out 0x3e, r29 ; 62 110ec: 0f be out 0x3f, r0 ; 63 110ee: cd bf out 0x3d, r28 ; 61 110f0: df 91 pop r29 110f2: cf 91 pop r28 110f4: 08 95 ret 000110f6 : } } /// @brief Read saved filename from EEPROM and send g-code command: M23 void restore_file_from_sd() { 110f6: ef 92 push r14 110f8: ff 92 push r15 110fa: 0f 93 push r16 110fc: 1f 93 push r17 110fe: cf 93 push r28 11100: df 93 push r29 11102: cd b7 in r28, 0x3d ; 61 11104: de b7 in r29, 0x3e ; 62 11106: 6b 97 sbiw r28, 0x1b ; 27 11108: 0f b6 in r0, 0x3f ; 63 1110a: f8 94 cli 1110c: de bf out 0x3e, r29 ; 62 1110e: 0f be out 0x3f, r0 ; 63 11110: cd bf out 0x3d, r28 ; 61 char filename[FILENAME_LENGTH]; char dir_name[9]; char extension_ptr[5]; uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH); 11112: 8a e5 ldi r24, 0x5A ; 90 11114: 9f e0 ldi r25, 0x0F ; 15 11116: 0f 94 10 dc call 0x3b820 ; 0x3b820 1111a: e8 2e mov r14, r24 1111c: 0a e0 ldi r16, 0x0A ; 10 1111e: 1f e0 ldi r17, 0x0F ; 15 for (uint8_t i = 0; i < depth; i++) { 11120: 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); 11122: 48 e0 ldi r20, 0x08 ; 8 11124: 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++) { 11126: fe 14 cp r15, r14 11128: 79 f0 breq .+30 ; 0x11148 eeprom_read_block(dir_name, (const char *)EEPROM_DIRS + 8 * i, 8); 1112a: b8 01 movw r22, r16 1112c: ce 01 movw r24, r28 1112e: 0e 96 adiw r24, 0x0e ; 14 11130: 0f 94 00 dc call 0x3b800 ; 0x3b800 dir_name[8] = '\0'; 11134: 1e 8a std Y+22, r1 ; 0x16 card.chdir(dir_name, false); 11136: 60 e0 ldi r22, 0x00 ; 0 11138: ce 01 movw r24, r28 1113a: 0e 96 adiw r24, 0x0e ; 14 1113c: 0f 94 0b 7f call 0x2fe16 ; 0x2fe16 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++) { 11140: f3 94 inc r15 11142: 08 5f subi r16, 0xF8 ; 248 11144: 1f 4f sbci r17, 0xFF ; 255 11146: ed cf rjmp .-38 ; 0x11122 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); 11148: 65 e9 ldi r22, 0x95 ; 149 1114a: 7f e0 ldi r23, 0x0F ; 15 1114c: 8e 01 movw r16, r28 1114e: 0f 5f subi r16, 0xFF ; 255 11150: 1f 4f sbci r17, 0xFF ; 255 11152: c8 01 movw r24, r16 11154: 0f 94 00 dc call 0x3b800 ; 0x3b800 // Add null delimiter in case all 8 characters were not NULL filename[8] = '\0'; 11158: 19 86 std Y+9, r1 ; 0x09 // Add extension to complete the DOS 8.3 filename e.g. ".gco" or ".g" extension_ptr[0] = '.'; 1115a: 8e e2 ldi r24, 0x2E ; 46 1115c: 8f 8b std Y+23, r24 ; 0x17 eeprom_read_block(&extension_ptr[1], (const char *)EEPROM_FILENAME_EXTENSION, 3); 1115e: 43 e0 ldi r20, 0x03 ; 3 11160: 50 e0 ldi r21, 0x00 ; 0 11162: 61 e9 ldi r22, 0x91 ; 145 11164: 7c e0 ldi r23, 0x0C ; 12 11166: ce 01 movw r24, r28 11168: 48 96 adiw r24, 0x18 ; 24 1116a: 0f 94 00 dc call 0x3b800 ; 0x3b800 extension_ptr[4] = '\0'; 1116e: 1b 8e std Y+27, r1 ; 0x1b strcat(filename, extension_ptr); 11170: be 01 movw r22, r28 11172: 69 5e subi r22, 0xE9 ; 233 11174: 7f 4f sbci r23, 0xFF ; 255 11176: c8 01 movw r24, r16 11178: 0f 94 5c e2 call 0x3c4b8 ; 0x3c4b8 enquecommandf_P(MSG_M23, filename); 1117c: 1f 93 push r17 1117e: 0f 93 push r16 11180: 81 e9 ldi r24, 0x91 ; 145 11182: 90 e7 ldi r25, 0x70 ; 112 11184: 9f 93 push r25 11186: 8f 93 push r24 11188: 0e 94 56 88 call 0x110ac ; 0x110ac 1118c: 0f 90 pop r0 1118e: 0f 90 pop r0 11190: 0f 90 pop r0 11192: 0f 90 pop r0 } 11194: 6b 96 adiw r28, 0x1b ; 27 11196: 0f b6 in r0, 0x3f ; 63 11198: f8 94 cli 1119a: de bf out 0x3e, r29 ; 62 1119c: 0f be out 0x3f, r0 ; 63 1119e: cd bf out 0x3d, r28 ; 61 111a0: df 91 pop r29 111a2: cf 91 pop r28 111a4: 1f 91 pop r17 111a6: 0f 91 pop r16 111a8: ff 90 pop r15 111aa: ef 90 pop r14 111ac: 08 95 ret 000111ae : //! 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) { 111ae: bf 92 push r11 111b0: cf 92 push r12 111b2: df 92 push r13 111b4: ef 92 push r14 111b6: ff 92 push r15 111b8: 0f 93 push r16 111ba: 1f 93 push r17 111bc: cf 93 push r28 111be: df 93 push r29 if (saved_printing) return; 111c0: e0 91 a8 0d lds r30, 0x0DA8 ; 0x800da8 111c4: e1 11 cpse r30, r1 111c6: b1 c0 rjmp .+354 ; 0x1132a 111c8: 05 2f mov r16, r21 111ca: 14 2f mov r17, r20 111cc: e9 01 movw r28, r18 111ce: 6b 01 movw r12, r22 111d0: 7c 01 movw r14, r24 cli(); 111d2: f8 94 cli save_print_file_state(); 111d4: 0e 94 d2 64 call 0xc9a4 ; 0xc9a4 // save the global state at planning time const bool pos_invalid = mesh_bed_leveling_flag || homing_flag; 111d8: b0 90 a7 0d lds r11, 0x0DA7 ; 0x800da7 111dc: b1 10 cpse r11, r1 111de: 02 c0 rjmp .+4 ; 0x111e4 111e0: b0 90 a6 0d lds r11, 0x0DA6 ; 0x800da6 save_planner_global_state(); 111e4: 0e 94 88 64 call 0xc910 ; 0xc910 planner_abort_hard(); //abort printing 111e8: 0f 94 b7 c1 call 0x3836e ; 0x3836e memcpy(saved_pos, current_position, sizeof(saved_pos)); 111ec: 80 e1 ldi r24, 0x10 ; 16 111ee: e1 e9 ldi r30, 0x91 ; 145 111f0: f6 e0 ldi r31, 0x06 ; 6 111f2: a3 e7 ldi r26, 0x73 ; 115 111f4: b2 e0 ldi r27, 0x02 ; 2 111f6: 01 90 ld r0, Z+ 111f8: 0d 92 st X+, r0 111fa: 8a 95 dec r24 111fc: e1 f7 brne .-8 ; 0x111f6 if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID; 111fe: bb 20 and r11, r11 11200: 61 f0 breq .+24 ; 0x1121a 11202: 80 e0 ldi r24, 0x00 ; 0 11204: 90 e0 ldi r25, 0x00 ; 0 11206: a0 e8 ldi r26, 0x80 ; 128 11208: bf eb ldi r27, 0xBF ; 191 1120a: 80 93 73 02 sts 0x0273, r24 ; 0x800273 1120e: 90 93 74 02 sts 0x0274, r25 ; 0x800274 11212: a0 93 75 02 sts 0x0275, r26 ; 0x800275 11216: b0 93 76 02 sts 0x0276, r27 ; 0x800276 saved_feedmultiply2 = feedmultiply; //save feedmultiply 1121a: 80 91 39 02 lds r24, 0x0239 ; 0x800239 1121e: 90 91 3a 02 lds r25, 0x023A ; 0x80023a 11222: 90 93 70 03 sts 0x0370, r25 ; 0x800370 11226: 80 93 6f 03 sts 0x036F, r24 ; 0x80036f saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder); 1122a: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 1122e: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 11232: 90 93 ac 05 sts 0x05AC, r25 ; 0x8005ac 11236: 80 93 ab 05 sts 0x05AB, r24 ; 0x8005ab saved_bed_temperature = (uint8_t)degTargetBed(); 1123a: 80 91 71 06 lds r24, 0x0671 ; 0x800671 1123e: 80 93 ad 05 sts 0x05AD, r24 ; 0x8005ad saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; 11242: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 11246: 83 fb bst r24, 3 11248: 88 27 eor r24, r24 1124a: 80 f9 bld r24, 0 1124c: 80 93 63 05 sts 0x0563, r24 ; 0x800563 saved_fan_speed = fanSpeed; 11250: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 11254: 80 93 aa 05 sts 0x05AA, r24 ; 0x8005aa cmdqueue_reset(); //empty cmdqueue 11258: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 card.sdprinting = false; 1125c: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f // card.closefile(); saved_printing = true; 11260: 81 e0 ldi r24, 0x01 ; 1 11262: 80 93 a8 0d sts 0x0DA8, r24 ; 0x800da8 // We may have missed a stepper timer interrupt. Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); 11266: 0f 94 03 44 call 0x28806 ; 0x28806 sei(); 1126a: 78 94 sei if ((z_move != 0) || (e_move != 0)) { // extruder or z move 1126c: 20 e0 ldi r18, 0x00 ; 0 1126e: 30 e0 ldi r19, 0x00 ; 0 11270: a9 01 movw r20, r18 11272: c7 01 movw r24, r14 11274: b6 01 movw r22, r12 11276: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> // Rather than calling plan_buffer_line directly, push the move into the command queue so that // the caller can continue processing. This is used during powerpanic to save the state as we // move away from the print. if(e_move) 1127a: 20 e0 ldi r18, 0x00 ; 0 1127c: 30 e0 ldi r19, 0x00 ; 0 1127e: a9 01 movw r20, r18 11280: f8 01 movw r30, r16 11282: 6c 2f mov r22, r28 11284: 7d 2f mov r23, r29 // card.closefile(); saved_printing = true; // We may have missed a stepper timer interrupt. Be safe than sorry, reset the stepper timer before re-enabling interrupts. st_reset_timer(); sei(); if ((z_move != 0) || (e_move != 0)) { // extruder or z move 11286: 81 11 cpse r24, r1 11288: 5a c0 rjmp .+180 ; 0x1133e 1128a: 8f 2f mov r24, r31 1128c: 90 2f mov r25, r16 1128e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 11292: 88 23 and r24, r24 11294: 09 f4 brne .+2 ; 0x11298 11296: 49 c0 rjmp .+146 ; 0x1132a // move away from the print. if(e_move) { // First unretract (relative extrusion) if(!saved_extruder_relative_mode){ 11298: 80 91 63 05 lds r24, 0x0563 ; 0x800563 1129c: 81 11 cpse r24, r1 1129e: 05 c0 rjmp .+10 ; 0x112aa enquecommand_P(MSG_M83); 112a0: 61 e0 ldi r22, 0x01 ; 1 112a2: 86 e7 ldi r24, 0x76 ; 118 112a4: 9b e6 ldi r25, 0x6B ; 107 112a6: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // 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); 112aa: 0f 93 push r16 112ac: 1f 93 push r17 112ae: df 93 push r29 112b0: cf 93 push r28 112b2: 80 ef ldi r24, 0xF0 ; 240 112b4: 9d e6 ldi r25, 0x6D ; 109 112b6: 9f 93 push r25 112b8: 8f 93 push r24 112ba: 0e 94 56 88 call 0x110ac ; 0x110ac } if(z_move) 112be: 0f 90 pop r0 112c0: 0f 90 pop r0 112c2: 0f 90 pop r0 112c4: 0f 90 pop r0 112c6: 0f 90 pop r0 112c8: 0f 90 pop r0 112ca: 20 e0 ldi r18, 0x00 ; 0 112cc: 30 e0 ldi r19, 0x00 ; 0 112ce: a9 01 movw r20, r18 112d0: c7 01 movw r24, r14 112d2: b6 01 movw r22, r12 112d4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 112d8: 88 23 and r24, r24 112da: 21 f1 breq .+72 ; 0x11324 { // Then lift Z axis enquecommandf_P(PSTR("G1 Z%-.3f F%-.3f"), saved_pos[Z_AXIS] + z_move, homing_feedrate[Z_AXIS]); 112dc: 84 e4 ldi r24, 0x44 ; 68 112de: 8f 93 push r24 112e0: 88 e4 ldi r24, 0x48 ; 72 112e2: 8f 93 push r24 112e4: 1f 92 push r1 112e6: 1f 92 push r1 112e8: 20 91 7b 02 lds r18, 0x027B ; 0x80027b 112ec: 30 91 7c 02 lds r19, 0x027C ; 0x80027c 112f0: 40 91 7d 02 lds r20, 0x027D ; 0x80027d 112f4: 50 91 7e 02 lds r21, 0x027E ; 0x80027e 112f8: c7 01 movw r24, r14 112fa: b6 01 movw r22, r12 112fc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 11300: 9f 93 push r25 11302: 8f 93 push r24 11304: 7f 93 push r23 11306: 6f 93 push r22 11308: 8c eb ldi r24, 0xBC ; 188 1130a: 9d e7 ldi r25, 0x7D ; 125 1130c: 9f 93 push r25 1130e: 8f 93 push r24 11310: 0e 94 56 88 call 0x110ac ; 0x110ac 11314: 8d b7 in r24, 0x3d ; 61 11316: 9e b7 in r25, 0x3e ; 62 11318: 0a 96 adiw r24, 0x0a ; 10 1131a: 0f b6 in r0, 0x3f ; 63 1131c: f8 94 cli 1131e: 9e bf out 0x3e, r25 ; 62 11320: 0f be out 0x3f, r0 ; 63 11322: 8d bf out 0x3d, r24 ; 61 // 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; 11324: 81 e0 ldi r24, 0x01 ; 1 11326: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 // 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(); } } 1132a: df 91 pop r29 1132c: cf 91 pop r28 1132e: 1f 91 pop r17 11330: 0f 91 pop r16 11332: ff 90 pop r15 11334: ef 90 pop r14 11336: df 90 pop r13 11338: cf 90 pop r12 1133a: bf 90 pop r11 1133c: 08 95 ret // Rather than calling plan_buffer_line directly, push the move into the command queue so that // the caller can continue processing. This is used during powerpanic to save the state as we // move away from the print. if(e_move) 1133e: 8f 2f mov r24, r31 11340: 90 2f mov r25, r16 11342: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 11346: 88 23 and r24, r24 11348: 49 f2 breq .-110 ; 0x112dc 1134a: a6 cf rjmp .-180 ; 0x11298 0001134c : eeprom_update_word_notify((uint16_t *)EEPROM_BACKLIGHT_TIMEOUT, backlightTimer_period); } void backlight_update() { if (!backlightSupport) return; 1134c: 80 91 01 04 lds r24, 0x0401 ; 0x800401 11350: 88 23 and r24, r24 11352: 21 f1 breq .+72 ; 0x1139c if (backlightMode == BACKLIGHT_MODE_AUTO) 11354: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 11358: 82 30 cpi r24, 0x02 ; 2 1135a: e9 f4 brne .+58 ; 0x11396 { if (backlightTimer.expired((uint32_t)backlightTimer_period * 1000ul)) analogWrite(LCD_BL_PIN, backlightLevel_LOW); 1135c: a0 91 4d 02 lds r26, 0x024D ; 0x80024d 11360: b0 91 4e 02 lds r27, 0x024E ; 0x80024e 11364: 28 ee ldi r18, 0xE8 ; 232 11366: 33 e0 ldi r19, 0x03 ; 3 11368: 0f 94 30 dd call 0x3ba60 ; 0x3ba60 <__usmulhisi3> 1136c: ab 01 movw r20, r22 1136e: bc 01 movw r22, r24 11370: 85 e3 ldi r24, 0x35 ; 53 11372: 93 e0 ldi r25, 0x03 ; 3 11374: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 11378: 88 23 and r24, r24 1137a: 31 f0 breq .+12 ; 0x11388 else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH); else {/*do nothing*/;} //display is dimmed. } else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW); 1137c: 60 91 ff 03 lds r22, 0x03FF ; 0x8003ff else analogWrite(LCD_BL_PIN, backlightLevel_HIGH); 11380: 70 e0 ldi r23, 0x00 ; 0 11382: 85 e0 ldi r24, 0x05 ; 5 11384: 0c 94 cf e9 jmp 0x1d39e ; 0x1d39e if (!backlightSupport) return; if (backlightMode == BACKLIGHT_MODE_AUTO) { if (backlightTimer.expired((uint32_t)backlightTimer_period * 1000ul)) analogWrite(LCD_BL_PIN, backlightLevel_LOW); else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH); 11388: 80 91 35 03 lds r24, 0x0335 ; 0x800335 1138c: 88 23 and r24, r24 1138e: 31 f0 breq .+12 ; 0x1139c else {/*do nothing*/;} //display is dimmed. } else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW); else analogWrite(LCD_BL_PIN, backlightLevel_HIGH); 11390: 60 91 00 04 lds r22, 0x0400 ; 0x800400 11394: f5 cf rjmp .-22 ; 0x11380 { if (backlightTimer.expired((uint32_t)backlightTimer_period * 1000ul)) analogWrite(LCD_BL_PIN, backlightLevel_LOW); else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH); else {/*do nothing*/;} //display is dimmed. } else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW); 11396: 81 11 cpse r24, r1 11398: fb cf rjmp .-10 ; 0x11390 1139a: f0 cf rjmp .-32 ; 0x1137c else analogWrite(LCD_BL_PIN, backlightLevel_HIGH); } 1139c: 08 95 ret 0001139e : 1139e: 60 91 00 04 lds r22, 0x0400 ; 0x800400 113a2: 84 e3 ldi r24, 0x34 ; 52 113a4: 9d e0 ldi r25, 0x0D ; 13 113a6: 0f 94 34 dc call 0x3b868 ; 0x3b868 113aa: 60 91 ff 03 lds r22, 0x03FF ; 0x8003ff 113ae: 83 e3 ldi r24, 0x33 ; 51 113b0: 9d e0 ldi r25, 0x0D ; 13 113b2: 0f 94 34 dc call 0x3b868 ; 0x3b868 113b6: 60 91 4f 02 lds r22, 0x024F ; 0x80024f 113ba: 82 e3 ldi r24, 0x32 ; 50 113bc: 9d e0 ldi r25, 0x0D ; 13 113be: 0f 94 34 dc call 0x3b868 ; 0x3b868 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 113c2: 60 91 4d 02 lds r22, 0x024D ; 0x80024d 113c6: 70 91 4e 02 lds r23, 0x024E ; 0x80024e 113ca: 80 e3 ldi r24, 0x30 ; 48 113cc: 9d e0 ldi r25, 0x0D ; 13 113ce: 0d 94 52 dc jmp 0x3b8a4 ; 0x3b8a4 000113d2 : backlight_update(); } void force_bl_on(bool section_start) { if (section_start) 113d2: 88 23 and r24, r24 113d4: 61 f0 breq .+24 ; 0x113ee { backlightMode = BACKLIGHT_MODE_BRIGHT; 113d6: 81 e0 ldi r24, 0x01 ; 1 113d8: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f if (backlightLevel_HIGH < LCD_BACKLIGHT_FORCE_ON) backlightLevel_HIGH = LCD_BACKLIGHT_FORCE_ON; 113dc: 80 91 00 04 lds r24, 0x0400 ; 0x800400 113e0: 8e 31 cpi r24, 0x1E ; 30 113e2: 18 f4 brcc .+6 ; 0x113ea 113e4: 8e e1 ldi r24, 0x1E ; 30 } else { backlightMode = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_MODE); backlightLevel_HIGH = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH); 113e6: 80 93 00 04 sts 0x0400, r24 ; 0x800400 } backlight_update(); 113ea: 0c 94 a6 89 jmp 0x1134c ; 0x1134c backlightMode = BACKLIGHT_MODE_BRIGHT; if (backlightLevel_HIGH < LCD_BACKLIGHT_FORCE_ON) backlightLevel_HIGH = LCD_BACKLIGHT_FORCE_ON; } else { backlightMode = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_MODE); 113ee: 82 e3 ldi r24, 0x32 ; 50 113f0: 9d e0 ldi r25, 0x0D ; 13 113f2: 0f 94 10 dc call 0x3b820 ; 0x3b820 113f6: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f backlightLevel_HIGH = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH); 113fa: 84 e3 ldi r24, 0x34 ; 52 113fc: 9d e0 ldi r25, 0x0D ; 13 113fe: 0f 94 10 dc call 0x3b820 ; 0x3b820 11402: f1 cf rjmp .-30 ; 0x113e6 00011404 : int16_t backlightTimer_period = LCD_BACKLIGHT_TIMEOUT; LongTimer backlightTimer; static void backlightTimer_reset() //used for resetting the timer and waking the display. Triggered on user interactions. { if (!backlightSupport) return; 11404: 80 91 01 04 lds r24, 0x0401 ; 0x800401 11408: 88 23 and r24, r24 1140a: 31 f0 breq .+12 ; 0x11418 backlightTimer.start(); 1140c: 85 e3 ldi r24, 0x35 ; 53 1140e: 93 e0 ldi r25, 0x03 ; 3 11410: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> backlight_update(); 11414: 0c 94 a6 89 jmp 0x1134c ; 0x1134c } 11418: 08 95 ret 0001141a : } backlight_update(); } void backlight_wake(const uint8_t flashNo) { 1141a: ff 92 push r15 1141c: 0f 93 push r16 1141e: 1f 93 push r17 11420: cf 93 push r28 11422: df 93 push r29 if (!backlightSupport) return; 11424: 90 91 01 04 lds r25, 0x0401 ; 0x800401 11428: 99 23 and r25, r25 1142a: 99 f1 breq .+102 ; 0x11492 if (flashNo) 1142c: 88 23 and r24, r24 1142e: 51 f1 breq .+84 ; 0x11484 { uint8_t backlightMode_bck = backlightMode; 11430: 00 91 4f 02 lds r16, 0x024F ; 0x80024f for (uint8_t i = 0; i < (((backlightMode_bck == BACKLIGHT_MODE_AUTO) && !backlightTimer.running()) + (flashNo * 2)); i++) 11434: c8 2f mov r28, r24 11436: d0 e0 ldi r29, 0x00 ; 0 11438: cc 0f add r28, r28 1143a: dd 1f adc r29, r29 1143c: 10 e0 ldi r17, 0x00 ; 0 1143e: ff 24 eor r15, r15 11440: f3 94 inc r15 11442: 21 2f mov r18, r17 11444: 30 e0 ldi r19, 0x00 ; 0 11446: 80 91 35 03 lds r24, 0x0335 ; 0x800335 1144a: 8f 25 eor r24, r15 1144c: 02 30 cpi r16, 0x02 ; 2 1144e: 09 f0 breq .+2 ; 0x11452 11450: 80 e0 ldi r24, 0x00 ; 0 11452: 8c 0f add r24, r28 11454: 9d 2f mov r25, r29 11456: 91 1d adc r25, r1 11458: 28 17 cp r18, r24 1145a: 39 07 cpc r19, r25 1145c: 8c f4 brge .+34 ; 0x11480 { backlightMode = !backlightMode; //toggles between BACKLIGHT_MODE_BRIGHT and BACKLIGHT_MODE_DIM 1145e: 81 e0 ldi r24, 0x01 ; 1 11460: 90 91 4f 02 lds r25, 0x024F ; 0x80024f 11464: 91 11 cpse r25, r1 11466: 80 e0 ldi r24, 0x00 ; 0 11468: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f backlight_update(); 1146c: 0e 94 a6 89 call 0x1134c ; 0x1134c _delay(BL_FLASH_DELAY_MS); 11470: 69 e1 ldi r22, 0x19 ; 25 11472: 70 e0 ldi r23, 0x00 ; 0 11474: 80 e0 ldi r24, 0x00 ; 0 11476: 90 e0 ldi r25, 0x00 ; 0 11478: 0f 94 2f 28 call 0x2505e ; 0x2505e if (!backlightSupport) return; if (flashNo) { uint8_t backlightMode_bck = backlightMode; for (uint8_t i = 0; i < (((backlightMode_bck == BACKLIGHT_MODE_AUTO) && !backlightTimer.running()) + (flashNo * 2)); i++) 1147c: 1f 5f subi r17, 0xFF ; 255 1147e: e1 cf rjmp .-62 ; 0x11442 { backlightMode = !backlightMode; //toggles between BACKLIGHT_MODE_BRIGHT and BACKLIGHT_MODE_DIM backlight_update(); _delay(BL_FLASH_DELAY_MS); } backlightMode = backlightMode_bck; 11480: 00 93 4f 02 sts 0x024F, r16 ; 0x80024f } backlightTimer_reset(); } 11484: df 91 pop r29 11486: cf 91 pop r28 11488: 1f 91 pop r17 1148a: 0f 91 pop r16 1148c: ff 90 pop r15 backlight_update(); _delay(BL_FLASH_DELAY_MS); } backlightMode = backlightMode_bck; } backlightTimer_reset(); 1148e: 0c 94 02 8a jmp 0x11404 ; 0x11404 } 11492: df 91 pop r29 11494: cf 91 pop r28 11496: 1f 91 pop r17 11498: 0f 91 pop r16 1149a: ff 90 pop r15 1149c: 08 95 ret 0001149e : } } #endif //SAFETYTIMER void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h { 1149e: 0f 93 push r16 114a0: 1f 93 push r17 114a2: cf 93 push r28 114a4: df 93 push r29 114a6: c8 2f mov r28, r24 state = State::disabled; filter = 0; } bool PAT9125_sensor::update() { switch (state) { 114a8: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 114ac: 81 30 cpi r24, 0x01 ; 1 114ae: 09 f4 brne .+2 ; 0x114b2 114b0: 41 c0 rjmp .+130 ; 0x11534 114b2: 82 30 cpi r24, 0x02 ; 2 114b4: 09 f4 brne .+2 ; 0x114b8 114b6: 57 c0 rjmp .+174 ; 0x11566 * * 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) 114b8: 0e 94 79 67 call 0xcef2 ; 0xcef2 114bc: 81 11 cpse r24, r1 114be: f9 c0 rjmp .+498 ; 0x116b2 114c0: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 114c4: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 114c8: 00 97 sbiw r24, 0x00 ; 0 114ca: 39 f4 brne .+14 ; 0x114da 114cc: 20 91 71 06 lds r18, 0x0671 ; 0x800671 114d0: 30 91 72 06 lds r19, 0x0672 ; 0x800672 114d4: 23 2b or r18, r19 114d6: 09 f4 brne .+2 ; 0x114da 114d8: ec c0 rjmp .+472 ; 0x116b2 114da: 40 91 30 02 lds r20, 0x0230 ; 0x800230 114de: 50 91 31 02 lds r21, 0x0231 ; 0x800231 114e2: 60 91 32 02 lds r22, 0x0232 ; 0x800232 114e6: 70 91 33 02 lds r23, 0x0233 ; 0x800233 114ea: 41 15 cp r20, r1 114ec: 51 05 cpc r21, r1 114ee: 61 05 cpc r22, r1 114f0: 71 05 cpc r23, r1 114f2: 09 f4 brne .+2 ; 0x114f6 114f4: de c0 rjmp .+444 ; 0x116b2 { safetyTimer.stop(); } else if ((CHECK_ALL_HEATERS) && !safetyTimer.running()) 114f6: 89 2b or r24, r25 114f8: 31 f4 brne .+12 ; 0x11506 114fa: 80 91 71 06 lds r24, 0x0671 ; 0x800671 114fe: 90 91 72 06 lds r25, 0x0672 ; 0x800672 11502: 89 2b or r24, r25 11504: 29 f0 breq .+10 ; 0x11510 11506: 80 91 d9 05 lds r24, 0x05D9 ; 0x8005d9 1150a: 88 23 and r24, r24 1150c: 09 f4 brne .+2 ; 0x11510 1150e: 39 c1 rjmp .+626 ; 0x11782 { safetyTimer.start(); } else if (safetyTimer.expired(farm_mode?FARM_DEFAULT_SAFETYTIMER_TIME_ms:safetytimer_inactive_time)) 11510: 89 ed ldi r24, 0xD9 ; 217 11512: 95 e0 ldi r25, 0x05 ; 5 11514: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 11518: 88 23 and r24, r24 1151a: 09 f4 brne .+2 ; 0x1151e 1151c: cc c0 rjmp .+408 ; 0x116b6 { disable_heater(); 1151e: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_HEATING_SAFETY_DISABLED)); 11522: 82 e7 ldi r24, 0x72 ; 114 11524: 96 e3 ldi r25, 0x36 ; 54 11526: 0e 94 44 72 call 0xe488 ; 0xe488 1152a: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_return_to_status(); 1152e: 0f 94 82 1f call 0x23f04 ; 0x23f04 11532: c1 c0 rjmp .+386 ; 0x116b6 case State::initializing: if (!updatePAT9125()) { 11534: 0f 94 df 7c call 0x2f9be ; 0x2f9be 11538: 88 23 and r24, r24 1153a: 09 f4 brne .+2 ; 0x1153e 1153c: bd cf rjmp .-134 ; 0x114b8 class PAT9125_sensor: public Filament_sensor { public: void init(); void deinit(); bool update(); bool getFilamentPresent() const { return filterFilPresent; } 1153e: 81 e0 ldi r24, 0x01 ; 1 11540: 90 91 b6 17 lds r25, 0x17B6 ; 0x8017b6 11544: 91 11 cpse r25, r1 11546: 01 c0 rjmp .+2 ; 0x1154a 11548: 80 e0 ldi r24, 0x00 ; 0 break; // still not stable. Stay in the initialization state. } oldFilamentPresent = 1154a: 80 93 ac 17 sts 0x17AC, r24 ; 0x8017ac getFilamentPresent(); // initialize the current filament state so that we don't create a switching event right after the sensor is ready. oldPos = pat9125_y; 1154e: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 11552: 90 91 8f 0e lds r25, 0x0E8F ; 0x800e8f 11556: 90 93 b9 17 sts 0x17B9, r25 ; 0x8017b9 1155a: 80 93 b8 17 sts 0x17B8, r24 ; 0x8017b8 state = State::ready; 1155e: 82 e0 ldi r24, 0x02 ; 2 11560: 80 93 a9 17 sts 0x17A9, r24 ; 0x8017a9 11564: a9 cf rjmp .-174 ; 0x114b8 break; case State::ready: { updatePAT9125(); 11566: 0f 94 df 7c call 0x2f9be ; 0x2f9be postponedLoadEvent = false; 1156a: 10 92 ad 17 sts 0x17AD, r1 ; 0x8017ad sensorActionOnError = SensorActionOnError::_Continue; } } bool Filament_sensor::checkFilamentEvents() { if (state != State::ready) 1156e: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 11572: 82 30 cpi r24, 0x02 ; 2 11574: 09 f0 breq .+2 ; 0x11578 11576: a0 cf rjmp .-192 ; 0x114b8 return false; if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms 11578: 80 91 ae 17 lds r24, 0x17AE ; 0x8017ae 1157c: 81 11 cpse r24, r1 1157e: 40 c0 rjmp .+128 ; 0x11600 11580: d0 91 b6 17 lds r29, 0x17B6 ; 0x8017b6 11584: 81 e0 ldi r24, 0x01 ; 1 11586: d1 11 cpse r29, r1 11588: 01 c0 rjmp .+2 ; 0x1158c 1158a: 80 e0 ldi r24, 0x00 ; 0 return false; } bool newFilamentPresent = fsensor.getFilamentPresent(); if (oldFilamentPresent != newFilamentPresent) { 1158c: 90 91 ac 17 lds r25, 0x17AC ; 0x8017ac 11590: 89 17 cp r24, r25 11592: 09 f4 brne .+2 ; 0x11596 11594: 91 cf rjmp .-222 ; 0x114b8 oldFilamentPresent = newFilamentPresent; 11596: 80 93 ac 17 sts 0x17AC, r24 ; 0x8017ac eventBlankingTimer.start(); 1159a: 8e ea ldi r24, 0xAE ; 174 1159c: 97 e1 ldi r25, 0x17 ; 23 1159e: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> if (newFilamentPresent) { // filament insertion 115a2: dd 23 and r29, r29 115a4: b1 f1 breq .+108 ; 0x11612 } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) && !( 115a6: 80 91 aa 17 lds r24, 0x17AA ; 0x8017aa 115aa: 88 23 and r24, r24 115ac: 11 f1 breq .+68 ; 0x115f2 return false; } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) 115ae: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 115b2: 81 11 cpse r24, r1 115b4: 1e c0 rjmp .+60 ; 0x115f2 && !( 115b6: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 115ba: 81 30 cpi r24, 0x01 ; 1 115bc: d1 f0 breq .+52 ; 0x115f2 } //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); 115be: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 115c2: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 115c6: 89 1b sub r24, r25 115c8: 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 115ca: 99 f4 brne .+38 ; 0x115f2 || printJobOngoing() 115cc: 0e 94 28 67 call 0xce50 ; 0xce50 115d0: 81 11 cpse r24, r1 115d2: 0f c0 rjmp .+30 ; 0x115f2 || (lcd_commands_type == LcdCommands::Layer1Cal) 115d4: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 115d8: 84 30 cpi r24, 0x04 ; 4 115da: 59 f0 breq .+22 ; 0x115f2 || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) 115dc: 8f e5 ldi r24, 0x5F ; 95 115de: 9f e0 ldi r25, 0x0F ; 15 115e0: 0f 94 10 dc call 0x3b820 ; 0x3b820 } void Filament_sensor::triggerFilamentInserted() { if (autoLoadEnabled && (eFilamentAction == FilamentAction::None) && !( 115e4: 81 11 cpse r24, r1 115e6: 05 c0 rjmp .+10 ; 0x115f2 || printJobOngoing() || (lcd_commands_type == LcdCommands::Layer1Cal) || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) ) ) { menu_submenu(lcd_AutoLoadFilament, true); 115e8: 61 e0 ldi r22, 0x01 ; 1 115ea: 88 e4 ldi r24, 0x48 ; 72 115ec: 99 e3 ldi r25, 0x39 ; 57 115ee: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee oldFilamentPresent = newFilamentPresent; eventBlankingTimer.start(); if (newFilamentPresent) { // filament insertion // puts_P(PSTR("filament inserted")); triggerFilamentInserted(); postponedLoadEvent = true; 115f2: 81 e0 ldi r24, 0x01 ; 1 115f4: 80 93 ad 17 sts 0x17AD, r24 ; 0x8017ad 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. 115f8: 81 e0 ldi r24, 0x01 ; 1 115fa: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d 115fe: 5c cf rjmp .-328 ; 0x114b8 } bool Filament_sensor::checkFilamentEvents() { if (state != State::ready) return false; if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms 11600: 64 e6 ldi r22, 0x64 ; 100 11602: 70 e0 ldi r23, 0x00 ; 0 11604: 8e ea ldi r24, 0xAE ; 174 11606: 97 e1 ldi r25, 0x17 ; 23 11608: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 1160c: 81 11 cpse r24, r1 1160e: b8 cf rjmp .-144 ; 0x11580 11610: 53 cf rjmp .-346 ; 0x114b8 && (eFilamentAction == FilamentAction::None) && ( moves_planned() != 0 || printJobOngoing() ) && !( 11612: 80 91 ab 17 lds r24, 0x17AB ; 0x8017ab 11616: 88 23 and r24, r24 11618: 79 f3 breq .-34 ; 0x115f8 } void Filament_sensor::triggerFilamentRemoved() { // SERIAL_ECHOLNPGM("triggerFilamentRemoved"); if (runoutEnabled && (eFilamentAction == FilamentAction::None) 1161a: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 1161e: 81 11 cpse r24, r1 11620: eb cf rjmp .-42 ; 0x115f8 11622: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 11626: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 1162a: 89 1b sub r24, r25 1162c: 8f 70 andi r24, 0x0F ; 15 && ( 1162e: 21 f4 brne .+8 ; 0x11638 moves_planned() != 0 || printJobOngoing() 11630: 0e 94 28 67 call 0xce50 ; 0xce50 11634: 88 23 and r24, r24 11636: 01 f3 breq .-64 ; 0x115f8 ) && !( 11638: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 1163c: 81 11 cpse r24, r1 1163e: dc cf rjmp .-72 ; 0x115f8 saved_printing || MMU2::mmu2.Enabled() // quick and dirty hack to prevent spurious runouts just before the toolchange 11640: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 11644: 81 30 cpi r24, 0x01 ; 1 11646: c1 f2 breq .-80 ; 0x115f8 || (lcd_commands_type == LcdCommands::Layer1Cal) 11648: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1164c: 84 30 cpi r24, 0x04 ; 4 1164e: a1 f2 breq .-88 ; 0x115f8 || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE) 11650: 8f e5 ldi r24, 0x5F ; 95 11652: 9f e0 ldi r25, 0x0F ; 15 11654: 0f 94 10 dc call 0x3b820 ; 0x3b820 && (eFilamentAction == FilamentAction::None) && ( moves_planned() != 0 || printJobOngoing() ) && !( 11658: 81 11 cpse r24, r1 1165a: ce cf rjmp .-100 ; 0x115f8 } //! @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); 1165c: 8c e0 ldi r24, 0x0C ; 12 1165e: 96 e6 ldi r25, 0x66 ; 102 11660: 9f 93 push r25 11662: 8f 93 push r24 11664: 82 ef ldi r24, 0xF2 ; 242 11666: 95 e6 ldi r25, 0x65 ; 101 11668: 9f 93 push r25 1166a: 8f 93 push r24 1166c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 void Filament_sensor::filRunout() { // SERIAL_ECHOLNPGM("filRunout"); sendHostNotification_P(MSG_FILAMENT_RUNOUT_DETECTED); runoutEnabled = false; 11670: 10 92 ab 17 sts 0x17AB, r1 ; 0x8017ab autoLoadEnabled = false; 11674: 10 92 aa 17 sts 0x17AA, r1 ; 0x8017aa stop_and_save_print_to_ram(0, 0); 11678: 20 e0 ldi r18, 0x00 ; 0 1167a: 30 e0 ldi r19, 0x00 ; 0 1167c: a9 01 movw r20, r18 1167e: ca 01 movw r24, r20 11680: b9 01 movw r22, r18 11682: 0e 94 d7 88 call 0x111ae ; 0x111ae restore_print_from_ram_and_continue(0); 11686: 60 e0 ldi r22, 0x00 ; 0 11688: 70 e0 ldi r23, 0x00 ; 0 1168a: cb 01 movw r24, r22 1168c: 0e 94 dc 67 call 0xcfb8 ; 0xcfb8 eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT); 11690: 85 e6 ldi r24, 0x65 ; 101 11692: 9f e0 ldi r25, 0x0F ; 15 11694: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); 11698: 81 e0 ldi r24, 0x01 ; 1 1169a: 9f e0 ldi r25, 0x0F ; 15 1169c: 0e 94 b3 75 call 0xeb66 ; 0xeb66 enquecommand_front_P(MSG_M600); 116a0: 88 e8 ldi r24, 0x88 ; 136 116a2: 90 e7 ldi r25, 0x70 ; 112 116a4: 0f 94 f4 75 call 0x2ebe8 ; 0x2ebe8 116a8: 0f 90 pop r0 116aa: 0f 90 pop r0 116ac: 0f 90 pop r0 116ae: 0f 90 pop r0 116b0: a3 cf rjmp .-186 ; 0x115f8 inline constexpr Timer() : m_isRunning(false) , m_started(0) {}; void start(); void stop(){m_isRunning = false;} 116b2: 10 92 d9 05 sts 0x05D9, r1 ; 0x8005d9 #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)){ 116b6: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 116ba: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 116be: 03 97 sbiw r24, 0x03 ; 3 116c0: 14 f4 brge .+4 ; 0x116c6 get_command(); 116c2: 0e 94 b8 82 call 0x10570 ; 0x10570 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); 116c6: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 116ca: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 } if (blocks_queued() && GetPrinterState() == PrinterState::IsHostPrinting && usb_timer.expired((USB_TIMER_TIMEOUT) / 2)) 116ce: 98 17 cp r25, r24 116d0: 81 f0 breq .+32 ; 0x116f2 116d2: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 116d6: 86 30 cpi r24, 0x06 ; 6 116d8: 61 f4 brne .+24 ; 0x116f2 116da: 68 e8 ldi r22, 0x88 ; 136 116dc: 73 e1 ldi r23, 0x13 ; 19 116de: 8d e0 ldi r24, 0x0D ; 13 116e0: 95 e0 ldi r25, 0x05 ; 5 116e2: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 116e6: 88 23 and r24, r24 116e8: 21 f0 breq .+8 ; 0x116f2 { // 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(); 116ea: 8d e0 ldi r24, 0x0D ; 13 116ec: 95 e0 ldi r25, 0x05 ; 5 116ee: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> } if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time)) 116f2: 40 91 7c 03 lds r20, 0x037C ; 0x80037c 116f6: 50 91 7d 03 lds r21, 0x037D ; 0x80037d 116fa: 60 91 7e 03 lds r22, 0x037E ; 0x80037e 116fe: 70 91 7f 03 lds r23, 0x037F ; 0x80037f 11702: 41 15 cp r20, r1 11704: 51 05 cpc r21, r1 11706: 61 05 cpc r22, r1 11708: 71 05 cpc r23, r1 1170a: 09 f0 breq .+2 ; 0x1170e 1170c: 3f c0 rjmp .+126 ; 0x1178c kill(PSTR("Inactivity Shutdown")); if(stepper_inactive_time && previous_millis_cmd.expired(stepper_inactive_time)) { 1170e: 40 91 34 02 lds r20, 0x0234 ; 0x800234 11712: 50 91 35 02 lds r21, 0x0235 ; 0x800235 11716: 60 91 36 02 lds r22, 0x0236 ; 0x800236 1171a: 70 91 37 02 lds r23, 0x0237 ; 0x800237 1171e: 41 15 cp r20, r1 11720: 51 05 cpc r21, r1 11722: 61 05 cpc r22, r1 11724: 71 05 cpc r23, r1 11726: a9 f0 breq .+42 ; 0x11752 11728: 84 e8 ldi r24, 0x84 ; 132 1172a: 93 e0 ldi r25, 0x03 ; 3 1172c: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 11730: 88 23 and r24, r24 11732: 79 f0 breq .+30 ; 0x11752 11734: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 11738: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 if(blocks_queued() == false && ignore_stepper_queue == false) { 1173c: 98 13 cpse r25, r24 1173e: 09 c0 rjmp .+18 ; 0x11752 11740: c1 11 cpse r28, r1 11742: 07 c0 rjmp .+14 ; 0x11752 disable_x(); 11744: 17 9a sbi 0x02, 7 ; 2 11746: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e disable_y(); 1174a: 16 9a sbi 0x02, 6 ; 2 1174c: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f disable_z(); disable_e0(); 11750: 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; 11752: c0 91 e5 03 lds r28, 0x03E5 ; 0x8003e5 block_t *block; if(block_buffer_tail != block_buffer_head) 11756: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 1175a: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 1175e: 98 17 cp r25, r24 11760: 01 f1 breq .+64 ; 0x117a2 { uint8_t block_index = block_buffer_tail; 11762: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 tail_fan_speed = block_buffer[block_index].fan_speed; 11766: 9e e6 ldi r25, 0x6E ; 110 11768: 89 9f mul r24, r25 1176a: f0 01 movw r30, r0 1176c: 11 24 eor r1, r1 1176e: e6 5f subi r30, 0xF6 ; 246 11770: f8 4f sbci r31, 0xF8 ; 248 11772: c0 81 ld r28, Z while(block_index != block_buffer_head) 11774: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 11778: 98 17 cp r25, r24 1177a: 99 f0 breq .+38 ; 0x117a2 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); 1177c: 8f 5f subi r24, 0xFF ; 255 1177e: 8f 70 andi r24, 0x0F ; 15 11780: f9 cf rjmp .-14 ; 0x11774 { safetyTimer.stop(); } else if ((CHECK_ALL_HEATERS) && !safetyTimer.running()) { safetyTimer.start(); 11782: 89 ed ldi r24, 0xD9 ; 217 11784: 95 e0 ldi r25, 0x05 ; 5 11786: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> 1178a: 95 cf rjmp .-214 ; 0x116b6 // 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)) 1178c: 84 e8 ldi r24, 0x84 ; 132 1178e: 93 e0 ldi r25, 0x03 ; 3 11790: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 11794: 88 23 and r24, r24 11796: 09 f4 brne .+2 ; 0x1179a 11798: ba cf rjmp .-140 ; 0x1170e kill(PSTR("Inactivity Shutdown")); 1179a: 80 e1 ldi r24, 0x10 ; 16 1179c: 9d e7 ldi r25, 0x7D ; 125 1179e: 0e 94 a2 79 call 0xf344 ; 0xf344 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) { 117a2: cc 23 and r28, r28 117a4: 09 f4 brne .+2 ; 0x117a8 117a6: 9f c0 rjmp .+318 ; 0x118e6 if (fan_kick_end == 0) { 117a8: 80 91 6a 03 lds r24, 0x036A ; 0x80036a 117ac: 90 91 6b 03 lds r25, 0x036B ; 0x80036b 117b0: a0 91 6c 03 lds r26, 0x036C ; 0x80036c 117b4: b0 91 6d 03 lds r27, 0x036D ; 0x80036d 117b8: 89 2b or r24, r25 117ba: 8a 2b or r24, r26 117bc: 8b 2b or r24, r27 117be: 81 f4 brne .+32 ; 0x117e0 // Just starting up fan - run at full power. fan_kick_end = _millis() + FAN_KICKSTART_TIME; 117c0: 0f 94 28 2a call 0x25450 ; 0x25450 117c4: 60 5e subi r22, 0xE0 ; 224 117c6: 7c 4f sbci r23, 0xFC ; 252 117c8: 8f 4f sbci r24, 0xFF ; 255 117ca: 9f 4f sbci r25, 0xFF ; 255 117cc: 60 93 6a 03 sts 0x036A, r22 ; 0x80036a 117d0: 70 93 6b 03 sts 0x036B, r23 ; 0x80036b 117d4: 80 93 6c 03 sts 0x036C, r24 ; 0x80036c 117d8: 90 93 6d 03 sts 0x036D, r25 ; 0x80036d tail_fan_speed = 255; } else if (fan_kick_end > _millis()) // Fan still spinning up. tail_fan_speed = 255; 117dc: cf ef ldi r28, 0xFF ; 255 117de: 0f c0 rjmp .+30 ; 0x117fe 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()) 117e0: 0f 94 28 2a call 0x25450 ; 0x25450 117e4: 00 91 6a 03 lds r16, 0x036A ; 0x80036a 117e8: 10 91 6b 03 lds r17, 0x036B ; 0x80036b 117ec: 20 91 6c 03 lds r18, 0x036C ; 0x80036c 117f0: 30 91 6d 03 lds r19, 0x036D ; 0x80036d 117f4: 60 17 cp r22, r16 117f6: 71 07 cpc r23, r17 117f8: 82 07 cpc r24, r18 117fa: 93 07 cpc r25, r19 117fc: 78 f3 brcs .-34 ; 0x117dc } 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 117fe: 80 91 6e 06 lds r24, 0x066E ; 0x80066e 11802: 88 23 and r24, r24 11804: 09 f4 brne .+2 ; 0x11808 11806: 78 c0 rjmp .+240 ; 0x118f8 fanSpeedBckp = tail_fan_speed; 11808: c0 93 14 02 sts 0x0214, r28 ; 0x800214 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) { 1180c: 80 91 0b 05 lds r24, 0x050B ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> 11810: 81 11 cpse r24, r1 11812: 07 c0 rjmp .+14 ; 0x11822 return; } avoidRecursion = true; 11814: 81 e0 ldi r24, 0x01 ; 1 11816: 80 93 0b 05 sts 0x050B, r24 ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> mmu_loop_inner(true); 1181a: 0f 94 f6 a6 call 0x34dec ; 0x34dec avoidRecursion = false; 1181e: 10 92 0b 05 sts 0x050B, r1 ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> lcd_draw_update = 2; lcd_beeper_quick_feedback(); } void lcd_knob_update() { if (lcd_backlight_wake_trigger) { 11822: 80 91 d2 05 lds r24, 0x05D2 ; 0x8005d2 <_ZL26lcd_backlight_wake_trigger.lto_priv.540> 11826: 88 23 and r24, r24 11828: e1 f1 breq .+120 ; 0x118a2 lcd_backlight_wake_trigger = false; 1182a: 10 92 d2 05 sts 0x05D2, r1 ; 0x8005d2 <_ZL26lcd_backlight_wake_trigger.lto_priv.540> backlight_wake(); 1182e: 80 e0 ldi r24, 0x00 ; 0 11830: 0e 94 0d 8a call 0x1141a ; 0x1141a bool did_rotate = false; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 11834: 4f b7 in r20, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 11836: f8 94 cli if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { 11838: 80 91 d0 05 lds r24, 0x05D0 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> 1183c: 28 2f mov r18, r24 1183e: 08 2e mov r0, r24 11840: 00 0c add r0, r0 11842: 33 0b sbc r19, r19 11844: 37 ff sbrs r19, 7 11846: 03 c0 rjmp .+6 ; 0x1184e 11848: 31 95 neg r19 1184a: 21 95 neg r18 1184c: 31 09 sbc r19, r1 1184e: 24 30 cpi r18, 0x04 ; 4 11850: 31 05 cpc r19, r1 11852: 0c f4 brge .+2 ; 0x11856 11854: 54 c0 rjmp .+168 ; 0x118fe lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP; 11856: 98 2f mov r25, r24 11858: 87 ff sbrs r24, 7 1185a: 02 c0 rjmp .+4 ; 0x11860 1185c: 93 e0 ldi r25, 0x03 ; 3 1185e: 98 0f add r25, r24 11860: 95 95 asr r25 11862: 95 95 asr r25 11864: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 11868: 30 91 70 06 lds r19, 0x0670 ; 0x800670 1186c: 29 0f add r18, r25 1186e: 31 1d adc r19, r1 11870: 97 fd sbrc r25, 7 11872: 3a 95 dec r19 11874: 30 93 70 06 sts 0x0670, r19 ; 0x800670 11878: 20 93 6f 06 sts 0x066F, r18 ; 0x80066f lcd_encoder_diff %= ENCODER_PULSES_PER_STEP; 1187c: 83 78 andi r24, 0x83 ; 131 1187e: 87 ff sbrs r24, 7 11880: 03 c0 rjmp .+6 ; 0x11888 11882: 81 50 subi r24, 0x01 ; 1 11884: 8c 6f ori r24, 0xFC ; 252 11886: 8f 5f subi r24, 0xFF ; 255 11888: 80 93 d0 05 sts 0x05D0, r24 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 1188c: 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); 1188e: 86 e0 ldi r24, 0x06 ; 6 11890: 0f 94 c8 4e call 0x29d90 ; 0x29d90 if (lcd_draw_update == 0) { 11894: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 11898: 81 11 cpse r24, r1 1189a: 03 c0 rjmp .+6 ; 0x118a2 // Update LCD rendering at minimum lcd_draw_update = 1; 1189c: 81 e0 ldi r24, 0x01 ; 1 1189e: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d #endif check_axes_activity(); MMU2::mmu2.mmu_loop(); lcd_knob_update(); backlight_update(); 118a2: 0e 94 a6 89 call 0x1134c ; 0x1134c // handle longpress if(lcd_longpress_trigger) 118a6: 80 91 d3 05 lds r24, 0x05D3 ; 0x8005d3 118aa: 88 23 and r24, r24 118ac: 61 f0 breq .+24 ; 0x118c6 { lcd_consume_click(); // Reset trigger to prevent recursion 118ae: 0e 94 90 70 call 0xe120 ; 0xe120 // long press is not possible in modal mode, wait until ready if (lcd_longpress_func && lcd_update_enabled) 118b2: e0 91 16 04 lds r30, 0x0416 ; 0x800416 118b6: f0 91 17 04 lds r31, 0x0417 ; 0x800417 118ba: 30 97 sbiw r30, 0x00 ; 0 118bc: 21 f0 breq .+8 ; 0x118c6 118be: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 118c2: 81 11 cpse r24, r1 { lcd_longpress_func(); 118c4: 19 95 eicall } } #if defined(AUTO_REPORT) host_autoreport(); 118c6: 0e 94 f0 78 call 0xf1e0 ; 0xf1e0 #endif //AUTO_REPORT host_keepalive(); 118ca: 0e 94 3f 7f call 0xfe7e ; 0xfe7e bool M79_timer_get_status() { return M79_timer.running(); } void M79_timer_update_status() { M79_timer.expired(M79_TIMEOUT); 118ce: 40 e3 ldi r20, 0x30 ; 48 118d0: 55 e7 ldi r21, 0x75 ; 117 118d2: 60 e0 ldi r22, 0x00 ; 0 118d4: 70 e0 ldi r23, 0x00 ; 0 118d6: 8c e9 ldi r24, 0x9C ; 156 118d8: 93 e0 ldi r25, 0x03 ; 3 M79_timer_update_status(); } 118da: df 91 pop r29 118dc: cf 91 pop r28 118de: 1f 91 pop r17 118e0: 0f 91 pop r16 118e2: 0d 94 0c 2b jmp 0x25618 ; 0x25618 ::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; 118e6: 10 92 6a 03 sts 0x036A, r1 ; 0x80036a 118ea: 10 92 6b 03 sts 0x036B, r1 ; 0x80036b 118ee: 10 92 6c 03 sts 0x036C, r1 ; 0x80036c 118f2: 10 92 6d 03 sts 0x036D, r1 ; 0x80036d 118f6: 83 cf rjmp .-250 ; 0x117fe #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; 118f8: c0 93 a5 04 sts 0x04A5, r28 ; 0x8004a5 118fc: 87 cf rjmp .-242 ; 0x1180c 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; 118fe: 10 92 d0 05 sts 0x05D0, r1 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> 11902: 4f bf out 0x3f, r20 ; 63 } } Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho); 11904: 80 e0 ldi r24, 0x00 ; 0 11906: c4 cf rjmp .-120 ; 0x11890 00011908 : #endif #endif } void delay_keep_alive(unsigned int ms) { 11908: cf 93 push r28 1190a: df 93 push r29 1190c: ec 01 movw r28, r24 for (;;) { manage_heater(); 1190e: 0f 94 34 39 call 0x27268 ; 0x27268 // Manage inactivity, but don't disable steppers on timeout. manage_inactivity(true); 11912: 81 e0 ldi r24, 0x01 ; 1 11914: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 11918: 80 e0 ldi r24, 0x00 ; 0 1191a: 0e 94 3f 6e call 0xdc7e ; 0xdc7e if (ms == 0) 1191e: 20 97 sbiw r28, 0x00 ; 0 11920: 99 f0 breq .+38 ; 0x11948 break; else if (ms >= 50) { 11922: c2 33 cpi r28, 0x32 ; 50 11924: d1 05 cpc r29, r1 11926: 40 f0 brcs .+16 ; 0x11938 _delay(50); 11928: 62 e3 ldi r22, 0x32 ; 50 1192a: 70 e0 ldi r23, 0x00 ; 0 1192c: 80 e0 ldi r24, 0x00 ; 0 1192e: 90 e0 ldi r25, 0x00 ; 0 11930: 0f 94 2f 28 call 0x2505e ; 0x2505e ms -= 50; 11934: e2 97 sbiw r28, 0x32 ; 50 11936: eb cf rjmp .-42 ; 0x1190e } else { _delay(ms); 11938: be 01 movw r22, r28 1193a: 90 e0 ldi r25, 0x00 ; 0 1193c: 80 e0 ldi r24, 0x00 ; 0 1193e: 0f 94 2f 28 call 0x2505e ; 0x2505e ms = 0; 11942: d0 e0 ldi r29, 0x00 ; 0 11944: c0 e0 ldi r28, 0x00 ; 0 11946: e3 cf rjmp .-58 ; 0x1190e } } } 11948: df 91 pop r29 1194a: cf 91 pop r28 1194c: 08 95 ret 0001194e : /// @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) { 1194e: cf 93 push r28 11950: df 93 push r29 11952: c8 2f mov r28, r24 inline Buttons GetPrinterButtonOperation() { return printerButtonOperation; } inline void ClearPrinterButtonOperation() { printerButtonOperation = Buttons::NoButton; 11954: df ef ldi r29, 0xFF ; 255 MMU2::Buttons btn; for(;;) { manage_heater(); 11956: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1195a: 81 e0 ldi r24, 0x01 ; 1 1195c: 0e 94 4f 8a call 0x1149e ; 0x1149e 11960: 80 91 b7 13 lds r24, 0x13B7 ; 0x8013b7 btn = MMU2::mmu2.GetPrinterButtonOperation(); if (btn != MMU2::Buttons::NoButton) 11964: 8f 3f cpi r24, 0xFF ; 255 11966: d9 f4 brne .+54 ; 0x1199e // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 11968: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 1196c: 84 30 cpi r24, 0x04 ; 4 1196e: 21 f4 brne .+8 ; 0x11978 }; 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 11970: 80 91 4f 13 lds r24, 0x134F ; 0x80134f 11974: 81 11 cpse r24, r1 11976: ef cf rjmp .-34 ; 0x11956 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 11978: 80 91 8a 13 lds r24, 0x138A ; 0x80138a 1197c: 90 91 8b 13 lds r25, 0x138B ; 0x80138b 11980: 01 97 sbiw r24, 0x01 ; 1 11982: 49 f7 brne .-46 ; 0x11956 && lastErrorCode != ec) // The error code is not a duplicate 11984: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 11988: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 1198c: 89 32 cpi r24, 0x29 ; 41 1198e: 90 48 sbci r25, 0x80 ; 128 11990: 11 f3 breq .-60 ; 0x11956 { ReportError(ec, ErrorSource::ErrorSourcePrinter); 11992: 60 e0 ldi r22, 0x00 ; 0 11994: 89 e2 ldi r24, 0x29 ; 41 11996: 90 e8 ldi r25, 0x80 ; 128 11998: 0f 94 e5 83 call 0x307ca ; 0x307ca 1199c: dc cf rjmp .-72 ; 0x11956 inline Buttons GetPrinterButtonOperation() { return printerButtonOperation; } inline void ClearPrinterButtonOperation() { printerButtonOperation = Buttons::NoButton; 1199e: d0 93 b7 13 sts 0x13B7, r29 ; 0x8013b7 { MMU2::mmu2.ClearPrinterButtonOperation(); if (btn == MMU2::Buttons::Eject) { 119a2: 85 30 cpi r24, 0x05 ; 5 119a4: 39 f4 brne .+14 ; 0x119b4 if (eject_slot != (uint8_t)MMU2::FILAMENT_UNKNOWN) { 119a6: cf 3f cpi r28, 0xFF ; 255 119a8: f9 f2 breq .-66 ; 0x11968 MMU2::mmu2.eject_filament(eject_slot, true); 119aa: 61 e0 ldi r22, 0x01 ; 1 119ac: 8c 2f mov r24, r28 119ae: 0f 94 8c ad call 0x35b18 ; 0x35b18 119b2: d1 cf rjmp .-94 ; 0x11956 // the operation is done. We must be careful to not raise FILAMENT_CHANGE // screen too quickly continue; } } else if (btn == MMU2::Buttons::Load) 119b4: 84 30 cpi r24, 0x04 ; 4 119b6: c1 f6 brne .-80 ; 0x11968 } } MMU2::mmu2.InvokeErrorScreen(ErrorCode::FILAMENT_CHANGE); } } 119b8: df 91 pop r29 119ba: cf 91 pop r28 119bc: 08 95 ret 000119be <__vector_29>: #ifdef ADC_CALLBACK extern void ADC_CALLBACK(); #endif //ADC_CALLBACK ISR(ADC_vect) { 119be: 1f 92 push r1 119c0: 0f 92 push r0 119c2: 0f b6 in r0, 0x3f ; 63 119c4: 0f 92 push r0 119c6: 11 24 eor r1, r1 119c8: 0b b6 in r0, 0x3b ; 59 119ca: 0f 92 push r0 119cc: 2f 93 push r18 119ce: 3f 93 push r19 119d0: 4f 93 push r20 119d2: 5f 93 push r21 119d4: 6f 93 push r22 119d6: 7f 93 push r23 119d8: 8f 93 push r24 119da: 9f 93 push r25 119dc: af 93 push r26 119de: bf 93 push r27 119e0: ef 93 push r30 119e2: ff 93 push r31 adc_values[adc_channel] += ADC; 119e4: 20 91 78 00 lds r18, 0x0078 ; 0x800078 <__TEXT_REGION_LENGTH__+0x7c2078> 119e8: 30 91 79 00 lds r19, 0x0079 ; 0x800079 <__TEXT_REGION_LENGTH__+0x7c2079> 119ec: e0 91 34 03 lds r30, 0x0334 ; 0x800334 119f0: f0 e0 ldi r31, 0x00 ; 0 119f2: ee 0f add r30, r30 119f4: ff 1f adc r31, r31 119f6: ec 5d subi r30, 0xDC ; 220 119f8: fc 4f sbci r31, 0xFC ; 252 119fa: 80 81 ld r24, Z 119fc: 91 81 ldd r25, Z+1 ; 0x01 119fe: 82 0f add r24, r18 11a00: 93 1f adc r25, r19 11a02: 91 83 std Z+1, r25 ; 0x01 11a04: 80 83 st Z, r24 if (++adc_count == ADC_OVRSAMPL) 11a06: 80 91 23 03 lds r24, 0x0323 ; 0x800323 11a0a: 8f 5f subi r24, 0xFF ; 255 11a0c: 80 93 23 03 sts 0x0323, r24 ; 0x800323 11a10: 80 31 cpi r24, 0x10 ; 16 11a12: 09 f0 breq .+2 ; 0x11a16 <__vector_29+0x58> 11a14: 56 c0 rjmp .+172 ; 0x11ac2 <__vector_29+0x104> { // go to the next channel if (++adc_channel == ADC_CHAN_CNT) { 11a16: 80 91 34 03 lds r24, 0x0334 ; 0x800334 11a1a: 8f 5f subi r24, 0xFF ; 255 11a1c: 80 93 34 03 sts 0x0334, r24 ; 0x800334 11a20: 88 30 cpi r24, 0x08 ; 8 11a22: 09 f0 breq .+2 ; 0x11a26 <__vector_29+0x68> 11a24: 46 c0 rjmp .+140 ; 0x11ab2 <__vector_29+0xf4> #endif // ISR callback from adc when sampling finished void adc_callback() { current_temperature_raw[0] = adc_values[ADC_PIN_IDX(TEMP_0_PIN)]; //heater 11a26: 80 91 24 03 lds r24, 0x0324 ; 0x800324 11a2a: 90 91 25 03 lds r25, 0x0325 ; 0x800325 11a2e: 90 93 0b 06 sts 0x060B, r25 ; 0x80060b 11a32: 80 93 0a 06 sts 0x060A, r24 ; 0x80060a current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)]; 11a36: 80 91 28 03 lds r24, 0x0328 ; 0x800328 11a3a: 90 91 29 03 lds r25, 0x0329 ; 0x800329 11a3e: 90 93 09 06 sts 0x0609, r25 ; 0x800609 11a42: 80 93 08 06 sts 0x0608, r24 ; 0x800608 #ifdef PINDA_THERMISTOR current_temperature_raw_pinda = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)]; 11a46: 80 91 2a 03 lds r24, 0x032A ; 0x80032a 11a4a: 90 91 2b 03 lds r25, 0x032B ; 0x80032b 11a4e: 90 93 07 06 sts 0x0607, r25 ; 0x800607 11a52: 80 93 06 06 sts 0x0606, r24 ; 0x800606 #endif //PINDA_THERMISTOR #ifdef AMBIENT_THERMISTOR current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)]; // 5->6 11a56: 80 91 2e 03 lds r24, 0x032E ; 0x80032e 11a5a: 90 91 2f 03 lds r25, 0x032F ; 0x80032f 11a5e: 90 93 15 06 sts 0x0615, r25 ; 0x800615 11a62: 80 93 14 06 sts 0x0614, r24 ; 0x800614 #endif //AMBIENT_THERMISTOR #ifdef VOLT_PWR_PIN current_voltage_raw_pwr = adc_values[ADC_PIN_IDX(VOLT_PWR_PIN)]; 11a66: 80 91 2c 03 lds r24, 0x032C ; 0x80032c 11a6a: 90 91 2d 03 lds r25, 0x032D ; 0x80032d 11a6e: 90 93 5c 06 sts 0x065C, r25 ; 0x80065c 11a72: 80 93 5b 06 sts 0x065B, r24 ; 0x80065b #endif #ifdef VOLT_BED_PIN current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9 11a76: 80 91 32 03 lds r24, 0x0332 ; 0x800332 11a7a: 90 91 33 03 lds r25, 0x0333 ; 0x800333 11a7e: 90 93 5a 06 sts 0x065A, r25 ; 0x80065a 11a82: 80 93 59 06 sts 0x0659, r24 ; 0x800659 #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; 11a86: 81 e0 ldi r24, 0x01 ; 1 11a88: 80 93 1b 05 sts 0x051B, r24 ; 0x80051b <_ZL16adc_values_ready.lto_priv.459> break; } } } ADCSRA |= (1 << ADSC); //start conversion } 11a8c: ff 91 pop r31 11a8e: ef 91 pop r30 11a90: bf 91 pop r27 11a92: af 91 pop r26 11a94: 9f 91 pop r25 11a96: 8f 91 pop r24 11a98: 7f 91 pop r23 11a9a: 6f 91 pop r22 11a9c: 5f 91 pop r21 11a9e: 4f 91 pop r20 11aa0: 3f 91 pop r19 11aa2: 2f 91 pop r18 11aa4: 0f 90 pop r0 11aa6: 0b be out 0x3b, r0 ; 59 11aa8: 0f 90 pop r0 11aaa: 0f be out 0x3f, r0 ; 63 11aac: 0f 90 pop r0 11aae: 1f 90 pop r1 11ab0: 18 95 reti 11ab2: 80 91 22 03 lds r24, 0x0322 ; 0x800322 <__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)) { 11ab6: 4f e5 ldi r20, 0x5F ; 95 11ab8: 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) { 11aba: 8f 5f subi r24, 0xFF ; 255 11abc: 41 f4 brne .+16 ; 0x11ace <__vector_29+0x110> 11abe: 10 92 22 03 sts 0x0322, r1 ; 0x800322 <__data_end> adc_count = 0; break; } } } ADCSRA |= (1 << ADSC); //start conversion 11ac2: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 11ac6: 80 64 ori r24, 0x40 ; 64 11ac8: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 11acc: df cf rjmp .-66 ; 0x11a8c <__vector_29+0xce> 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)) { 11ace: 9a 01 movw r18, r20 11ad0: 08 2e mov r0, r24 11ad2: 02 c0 rjmp .+4 ; 0x11ad8 <__vector_29+0x11a> 11ad4: 35 95 asr r19 11ad6: 27 95 ror r18 11ad8: 0a 94 dec r0 11ada: e2 f7 brpl .-8 ; 0x11ad4 <__vector_29+0x116> 11adc: 20 ff sbrs r18, 0 11ade: ed cf rjmp .-38 ; 0x11aba <__vector_29+0xfc> 11ae0: 80 93 22 03 sts 0x0322, r24 ; 0x800322 <__data_end> adc_setmux(adc_channel_idx); 11ae4: 0e 94 eb 5a call 0xb5d6 ; 0xb5d6 adc_count = 0; 11ae8: 10 92 23 03 sts 0x0323, r1 ; 0x800323 11aec: ea cf rjmp .-44 ; 0x11ac2 <__vector_29+0x104> 00011aee : if (ch & 0x08) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); } void adc_start_cycle() { 11aee: cf 93 push r28 11af0: 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 11af2: ca e7 ldi r28, 0x7A ; 122 11af4: d0 e0 ldi r29, 0x00 ; 0 11af6: 88 81 ld r24, Y 11af8: 8f 7b andi r24, 0xBF ; 191 11afa: 88 83 st Y, r24 adc_count = 0; 11afc: 10 92 23 03 sts 0x0323, r1 ; 0x800323 adc_channel = 0; 11b00: 10 92 34 03 sts 0x0334, r1 ; 0x800334 adc_channel_idx = first_channel_idx; 11b04: 10 92 22 03 sts 0x0322, r1 ; 0x800322 <__data_end> adc_setmux(adc_channel_idx); 11b08: 80 e0 ldi r24, 0x00 ; 0 11b0a: 0e 94 eb 5a call 0xb5d6 ; 0xb5d6 memset((void*)adc_values, 0, sizeof(adc_values)); 11b0e: e4 e2 ldi r30, 0x24 ; 36 11b10: f3 e0 ldi r31, 0x03 ; 3 11b12: 80 e1 ldi r24, 0x10 ; 16 11b14: df 01 movw r26, r30 11b16: 1d 92 st X+, r1 11b18: 8a 95 dec r24 11b1a: e9 f7 brne .-6 ; 0x11b16 ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07); } void adc_start_cycle() { adc_reset(); ADCSRA |= (1 << ADSC); //start conversion 11b1c: 88 81 ld r24, Y 11b1e: 80 64 ori r24, 0x40 ; 64 11b20: 88 83 st Y, r24 } 11b22: df 91 pop r29 11b24: cf 91 pop r28 11b26: 08 95 ret 00011b28 : } // G80 - Automatic mesh bed leveling static void gcode_G80() { 11b28: 2f 92 push r2 11b2a: 3f 92 push r3 11b2c: 4f 92 push r4 11b2e: 5f 92 push r5 11b30: 6f 92 push r6 11b32: 7f 92 push r7 11b34: 8f 92 push r8 11b36: 9f 92 push r9 11b38: af 92 push r10 11b3a: bf 92 push r11 11b3c: cf 92 push r12 11b3e: df 92 push r13 11b40: ef 92 push r14 11b42: ff 92 push r15 11b44: 0f 93 push r16 11b46: 1f 93 push r17 11b48: cf 93 push r28 11b4a: df 93 push r29 11b4c: cd b7 in r28, 0x3d ; 61 11b4e: de b7 in r29, 0x3e ; 62 11b50: a4 97 sbiw r28, 0x24 ; 36 11b52: 0f b6 in r0, 0x3f ; 63 11b54: f8 94 cli 11b56: de bf out 0x3e, r29 ; 62 11b58: 0f be out 0x3f, r0 ; 63 11b5a: 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(); 11b5c: 0f 94 a9 43 call 0x28752 ; 0x28752 if (planner_aborted) 11b60: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 11b64: 81 11 cpse r24, r1 11b66: 17 c0 rjmp .+46 ; 0x11b96 return; mesh_bed_leveling_flag = true; 11b68: 81 e0 ldi r24, 0x01 ; 1 11b6a: 80 93 a7 0d sts 0x0DA7, r24 ; 0x800da7 // Firstly check if we know where we are if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) { 11b6e: 80 91 8e 06 lds r24, 0x068E ; 0x80068e 11b72: 88 23 and r24, r24 11b74: 49 f0 breq .+18 ; 0x11b88 11b76: 80 91 8f 06 lds r24, 0x068F ; 0x80068f 11b7a: 88 23 and r24, r24 11b7c: 29 f0 breq .+10 ; 0x11b88 11b7e: 20 91 90 06 lds r18, 0x0690 ; 0x800690 11b82: 2f 83 std Y+7, r18 ; 0x07 11b84: 21 11 cpse r18, r1 11b86: 20 c0 rjmp .+64 ; 0x11bc8 11b88: 81 e0 ldi r24, 0x01 ; 1 11b8a: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 // 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); 11b8e: 8a e7 ldi r24, 0x7A ; 122 11b90: 9b e6 ldi r25, 0x6B ; 107 11b92: 0f 94 f4 75 call 0x2ebe8 ; 0x2ebe8 custom_message_state = custom_message_state_old; lcd_update(2); st_synchronize(); mesh_bed_leveling_flag = false; } 11b96: a4 96 adiw r28, 0x24 ; 36 11b98: 0f b6 in r0, 0x3f ; 63 11b9a: f8 94 cli 11b9c: de bf out 0x3e, r29 ; 62 11b9e: 0f be out 0x3f, r0 ; 63 11ba0: cd bf out 0x3d, r28 ; 61 11ba2: df 91 pop r29 11ba4: cf 91 pop r28 11ba6: 1f 91 pop r17 11ba8: 0f 91 pop r16 11baa: ff 90 pop r15 11bac: ef 90 pop r14 11bae: df 90 pop r13 11bb0: cf 90 pop r12 11bb2: bf 90 pop r11 11bb4: af 90 pop r10 11bb6: 9f 90 pop r9 11bb8: 8f 90 pop r8 11bba: 7f 90 pop r7 11bbc: 6f 90 pop r6 11bbe: 5f 90 pop r5 11bc0: 4f 90 pop r4 11bc2: 3f 90 pop r3 11bc4: 2f 90 pop r2 11bc6: 08 95 ret return; } run = false; #endif //PINDA_THERMISTOR uint8_t nMeasPoints = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); 11bc8: 8b ea ldi r24, 0xAB ; 171 11bca: 9d e0 ldi r25, 0x0D ; 13 11bcc: 0f 94 10 dc call 0x3b820 ; 0x3b820 11bd0: 18 2f mov r17, r24 if (uint8_t codeSeen = code_seen('N'), value = code_value_uint8(); codeSeen && (value == 7 || value == 3)) 11bd2: 8e e4 ldi r24, 0x4E ; 78 11bd4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11bd8: 08 2f mov r16, r24 11bda: 0e 94 00 5b call 0xb600 ; 0xb600 11bde: 8e 83 std Y+6, r24 ; 0x06 11be0: 00 23 and r16, r16 11be2: 29 f0 breq .+10 ; 0x11bee 11be4: 87 30 cpi r24, 0x07 ; 7 11be6: 09 f4 brne .+2 ; 0x11bea 11be8: c9 c0 rjmp .+402 ; 0x11d7c 11bea: 83 30 cpi r24, 0x03 ; 3 11bec: 29 f0 breq .+10 ; 0x11bf8 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; 11bee: 13 30 cpi r17, 0x03 ; 3 11bf0: 09 f0 breq .+2 ; 0x11bf4 11bf2: c3 c0 rjmp .+390 ; 0x11d7a 11bf4: 63 e0 ldi r22, 0x03 ; 3 11bf6: 6e 83 std Y+6, r22 ; 0x06 11bf8: 80 e0 ldi r24, 0x00 ; 0 11bfa: 90 e0 ldi r25, 0x00 ; 0 11bfc: a0 e8 ldi r26, 0x80 ; 128 11bfe: bf e3 ldi r27, 0x3F ; 63 11c00: 8a 83 std Y+2, r24 ; 0x02 11c02: 9b 83 std Y+3, r25 ; 0x03 11c04: ac 83 std Y+4, r26 ; 0x04 11c06: bd 83 std Y+5, r27 ; 0x05 uint8_t nProbeRetryCount = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); 11c08: 8a ea ldi r24, 0xAA ; 170 11c0a: 9d e0 ldi r25, 0x0D ; 13 11c0c: 0f 94 10 dc call 0x3b820 ; 0x3b820 11c10: 88 8f std Y+24, r24 ; 0x18 if (uint8_t codeSeen = code_seen('C'), value = code_value_uint8(); codeSeen && value >= 1 && value <= 10) 11c12: 83 e4 ldi r24, 0x43 ; 67 11c14: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11c18: 18 2f mov r17, r24 11c1a: 0e 94 00 5b call 0xb600 ; 0xb600 11c1e: 11 23 and r17, r17 11c20: 29 f0 breq .+10 ; 0x11c2c 11c22: 88 23 and r24, r24 11c24: 19 f0 breq .+6 ; 0x11c2c 11c26: 8b 30 cpi r24, 0x0B ; 11 11c28: 08 f4 brcc .+2 ; 0x11c2c 11c2a: 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; 11c2c: 88 e5 ldi r24, 0x58 ; 88 11c2e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11c32: 88 23 and r24, r24 11c34: 09 f4 brne .+2 ; 0x11c38 11c36: ab c0 rjmp .+342 ; 0x11d8e 11c38: 0e 94 35 60 call 0xc06a ; 0xc06a 11c3c: 20 e0 ldi r18, 0x00 ; 0 11c3e: 30 e0 ldi r19, 0x00 ; 0 11c40: 48 e0 ldi r20, 0x08 ; 8 11c42: 52 e4 ldi r21, 0x42 ; 66 11c44: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 11c48: 20 e0 ldi r18, 0x00 ; 0 11c4a: 30 e0 ldi r19, 0x00 ; 0 11c4c: 48 eb ldi r20, 0xB8 ; 184 11c4e: 51 e4 ldi r21, 0x41 ; 65 11c50: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 11c54: 6a 87 std Y+10, r22 ; 0x0a 11c56: 7b 87 std Y+11, r23 ; 0x0b 11c58: 8c 87 std Y+12, r24 ; 0x0c 11c5a: 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; 11c5c: 89 e5 ldi r24, 0x59 ; 89 11c5e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11c62: 88 23 and r24, r24 11c64: 09 f4 brne .+2 ; 0x11c68 11c66: 9c c0 rjmp .+312 ; 0x11da0 11c68: 0e 94 35 60 call 0xc06a ; 0xc06a 11c6c: 20 e0 ldi r18, 0x00 ; 0 11c6e: 30 e0 ldi r19, 0x00 ; 0 11c70: 48 e0 ldi r20, 0x08 ; 8 11c72: 52 e4 ldi r21, 0x42 ; 66 11c74: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 11c78: 20 e0 ldi r18, 0x00 ; 0 11c7a: 30 e0 ldi r19, 0x00 ; 0 11c7c: 40 ea ldi r20, 0xA0 ; 160 11c7e: 50 e4 ldi r21, 0x40 ; 64 11c80: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 11c84: 6c 8b std Y+20, r22 ; 0x14 11c86: 7d 8b std Y+21, r23 ; 0x15 11c88: 8e 8b std Y+22, r24 ; 0x16 11c8a: 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; 11c8c: 87 e5 ldi r24, 0x57 ; 87 11c8e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11c92: 88 23 and r24, r24 11c94: 09 f4 brne .+2 ; 0x11c98 11c96: 89 c0 rjmp .+274 ; 0x11daa 11c98: 0e 94 35 60 call 0xc06a ; 0xc06a 11c9c: 2a 85 ldd r18, Y+10 ; 0x0a 11c9e: 3b 85 ldd r19, Y+11 ; 0x0b 11ca0: 4c 85 ldd r20, Y+12 ; 0x0c 11ca2: 5d 85 ldd r21, Y+13 ; 0x0d 11ca4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 11ca8: 20 e0 ldi r18, 0x00 ; 0 11caa: 30 e0 ldi r19, 0x00 ; 0 11cac: 48 e8 ldi r20, 0x88 ; 136 11cae: 52 e4 ldi r21, 0x42 ; 66 11cb0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 11cb4: 69 8f std Y+25, r22 ; 0x19 11cb6: 7a 8f std Y+26, r23 ; 0x1a 11cb8: 8b 8f std Y+27, r24 ; 0x1b 11cba: 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; 11cbc: 88 e4 ldi r24, 0x48 ; 72 11cbe: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 11cc2: 88 23 and r24, r24 11cc4: 09 f4 brne .+2 ; 0x11cc8 11cc6: 7a c0 rjmp .+244 ; 0x11dbc 11cc8: 0e 94 35 60 call 0xc06a ; 0xc06a 11ccc: 2c 89 ldd r18, Y+20 ; 0x14 11cce: 3d 89 ldd r19, Y+21 ; 0x15 11cd0: 4e 89 ldd r20, Y+22 ; 0x16 11cd2: 5f 89 ldd r21, Y+23 ; 0x17 11cd4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 11cd8: 20 e0 ldi r18, 0x00 ; 0 11cda: 30 e0 ldi r19, 0x00 ; 0 11cdc: 48 e8 ldi r20, 0x88 ; 136 11cde: 52 e4 ldi r21, 0x42 ; 66 11ce0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 11ce4: 6d 8f std Y+29, r22 ; 0x1d 11ce6: 7e 8f std Y+30, r23 ; 0x1e 11ce8: 8f 8f std Y+31, r24 ; 0x1f 11cea: 98 a3 std Y+32, r25 ; 0x20 mbl.reset(); //reset mesh bed leveling 11cec: 0f 94 41 8c call 0x31882 ; 0x31882 mbl.z_values[0][0] = min_pos[Z_AXIS]; 11cf0: 80 91 29 02 lds r24, 0x0229 ; 0x800229 11cf4: 90 91 2a 02 lds r25, 0x022A ; 0x80022a 11cf8: a0 91 2b 02 lds r26, 0x022B ; 0x80022b 11cfc: b0 91 2c 02 lds r27, 0x022C ; 0x80022c 11d00: 80 93 c2 13 sts 0x13C2, r24 ; 0x8013c2 11d04: 90 93 c3 13 sts 0x13C3, r25 ; 0x8013c3 11d08: a0 93 c4 13 sts 0x13C4, r26 ; 0x8013c4 11d0c: b0 93 c5 13 sts 0x13C5, r27 ; 0x8013c5 // Reset baby stepping to zero, if the babystepping has already been loaded before. babystep_undo(); 11d10: 0f 94 cf c9 call 0x3939e ; 0x3939e 11d14: 05 ec ldi r16, 0xC5 ; 197 11d16: 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) 11d18: c8 01 movw r24, r16 11d1a: 0f 94 1e dc call 0x3b83c ; 0x3b83c 11d1e: 01 96 adiw r24, 0x01 ; 1 11d20: 09 f0 breq .+2 ; 0x11d24 11d22: 51 c0 rjmp .+162 ; 0x11dc6 11d24: 0e 5f subi r16, 0xFE ; 254 11d26: 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) { 11d28: 05 3d cpi r16, 0xD5 ; 213 11d2a: 8f e0 ldi r24, 0x0F ; 15 11d2c: 18 07 cpc r17, r24 11d2e: a1 f7 brne .-24 ; 0x11d18 if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF) return true; } return false; 11d30: 21 2c mov r2, r1 11d32: a1 ec ldi r26, 0xC1 ; 193 11d34: b3 e1 ldi r27, 0x13 ; 19 11d36: ba a3 std Y+34, r27 ; 0x22 11d38: 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; 11d3a: b9 87 std Y+9, r27 ; 0x09 11d3c: a8 87 std Y+8, r26 ; 0x08 11d3e: 51 2c mov r5, r1 11d40: 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; 11d42: 31 2c mov r3, r1 11d44: 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)); 11d46: 84 2d mov r24, r4 11d48: 63 e0 ldi r22, 0x03 ; 3 11d4a: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 11d4e: 98 8b std Y+16, r25 ; 0x10 11d50: 68 84 ldd r6, Y+8 ; 0x08 11d52: 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++) { 11d54: 10 e0 ldi r17, 0x00 ; 0 bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0)); 11d56: f8 89 ldd r31, Y+16 ; 0x10 11d58: f1 11 cpse r31, r1 11d5a: 37 c0 rjmp .+110 ; 0x11dca 11d5c: 81 2f mov r24, r17 11d5e: 63 e0 ldi r22, 0x03 ; 3 11d60: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 11d64: 91 11 cpse r25, r1 11d66: 31 c0 rjmp .+98 ; 0x11dca if (isOn3x3Mesh) { if (has_z && (row || col)) { 11d68: 21 10 cpse r2, r1 11d6a: 3f c1 rjmp .+638 ; 0x11fea } else { mbl.set_z(col, row, NAN); } // check for points that are skipped if (nMeasPoints == 3) { 11d6c: 7e 81 ldd r23, Y+6 ; 0x06 11d6e: 73 30 cpi r23, 0x03 ; 3 11d70: 09 f4 brne .+2 ; 0x11d74 11d72: 70 c0 rjmp .+224 ; 0x11e54 11d74: 8f 81 ldd r24, Y+7 ; 0x07 11d76: 8e 87 std Y+14, r24 ; 0x0e 11d78: 37 c0 rjmp .+110 ; 0x11de8 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; 11d7a: 1e 83 std Y+6, r17 ; 0x06 11d7c: 6a e9 ldi r22, 0x9A ; 154 11d7e: 79 e9 ldi r23, 0x99 ; 153 11d80: 89 e1 ldi r24, 0x19 ; 25 11d82: 9f e3 ldi r25, 0x3F ; 63 11d84: 6a 83 std Y+2, r22 ; 0x02 11d86: 7b 83 std Y+3, r23 ; 0x03 11d88: 8c 83 std Y+4, r24 ; 0x04 11d8a: 9d 83 std Y+5, r25 ; 0x05 11d8c: 3d cf rjmp .-390 ; 0x11c08 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; 11d8e: 80 e0 ldi r24, 0x00 ; 0 11d90: 90 e0 ldi r25, 0x00 ; 0 11d92: a0 e8 ldi r26, 0x80 ; 128 11d94: bf ef ldi r27, 0xFF ; 255 11d96: 8a 87 std Y+10, r24 ; 0x0a 11d98: 9b 87 std Y+11, r25 ; 0x0b 11d9a: ac 87 std Y+12, r26 ; 0x0c 11d9c: bd 87 std Y+13, r27 ; 0x0d 11d9e: 5e cf rjmp .-324 ; 0x11c5c const float area_min_y = code_seen('Y') ? code_value() - y_mesh_density - Y_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY; 11da0: 60 e0 ldi r22, 0x00 ; 0 11da2: 70 e0 ldi r23, 0x00 ; 0 11da4: 80 e8 ldi r24, 0x80 ; 128 11da6: 9f ef ldi r25, 0xFF ; 255 11da8: 6d cf rjmp .-294 ; 0x11c84 const float area_max_x = code_seen('W') ? area_min_x + code_value() + 2 * x_mesh_density : INFINITY; 11daa: 80 e0 ldi r24, 0x00 ; 0 11dac: 90 e0 ldi r25, 0x00 ; 0 11dae: a0 e8 ldi r26, 0x80 ; 128 11db0: bf e7 ldi r27, 0x7F ; 127 11db2: 89 8f std Y+25, r24 ; 0x19 11db4: 9a 8f std Y+26, r25 ; 0x1a 11db6: ab 8f std Y+27, r26 ; 0x1b 11db8: bc 8f std Y+28, r27 ; 0x1c 11dba: 80 cf rjmp .-256 ; 0x11cbc const float area_max_y = code_seen('H') ? area_min_y + code_value() + 2 * y_mesh_density : INFINITY; 11dbc: 60 e0 ldi r22, 0x00 ; 0 11dbe: 70 e0 ldi r23, 0x00 ; 0 11dc0: 80 e8 ldi r24, 0x80 ; 128 11dc2: 9f e7 ldi r25, 0x7F ; 127 11dc4: 8f cf rjmp .-226 ; 0x11ce4 11dc6: 2f 80 ldd r2, Y+7 ; 0x07 11dc8: b4 cf rjmp .-152 ; 0x11d32 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; } 11dca: 60 e0 ldi r22, 0x00 ; 0 11dcc: 70 e0 ldi r23, 0x00 ; 0 11dce: 80 ec ldi r24, 0xC0 ; 192 11dd0: 9f e7 ldi r25, 0x7F ; 127 11dd2: d3 01 movw r26, r6 11dd4: 11 96 adiw r26, 0x01 ; 1 11dd6: 6d 93 st X+, r22 11dd8: 7d 93 st X+, r23 11dda: 8d 93 st X+, r24 11ddc: 9c 93 st X, r25 11dde: 14 97 sbiw r26, 0x04 ; 4 } else { mbl.set_z(col, row, NAN); } // check for points that are skipped if (nMeasPoints == 3) { 11de0: be 81 ldd r27, Y+6 ; 0x06 11de2: b3 30 cpi r27, 0x03 ; 3 11de4: c1 f1 breq .+112 ; 0x11e56 11de6: 1e 86 std Y+14, r1 ; 0x0e if (!isOn3x3Mesh) continue; } else { const float x_pos = BED_X(col); 11de8: 81 2f mov r24, r17 11dea: 0f 94 29 ca call 0x39452 ; 0x39452 11dee: 4b 01 movw r8, r22 11df0: 5c 01 movw r10, r24 const float y_pos = BED_Y(row); 11df2: 80 2f mov r24, r16 11df4: 0f 94 29 ca call 0x39452 ; 0x39452 11df8: 6b 01 movw r12, r22 11dfa: 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)) { 11dfc: a5 01 movw r20, r10 11dfe: 94 01 movw r18, r8 11e00: 6a 85 ldd r22, Y+10 ; 0x0a 11e02: 7b 85 ldd r23, Y+11 ; 0x0b 11e04: 8c 85 ldd r24, Y+12 ; 0x0c 11e06: 9d 85 ldd r25, Y+13 ; 0x0d 11e08: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 11e0c: 18 16 cp r1, r24 11e0e: 0c f4 brge .+2 ; 0x11e12 11e10: 1c c1 rjmp .+568 ; 0x1204a 11e12: 29 8d ldd r18, Y+25 ; 0x19 11e14: 3a 8d ldd r19, Y+26 ; 0x1a 11e16: 4b 8d ldd r20, Y+27 ; 0x1b 11e18: 5c 8d ldd r21, Y+28 ; 0x1c 11e1a: c5 01 movw r24, r10 11e1c: b4 01 movw r22, r8 11e1e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 11e22: 18 16 cp r1, r24 11e24: 0c f4 brge .+2 ; 0x11e28 11e26: 11 c1 rjmp .+546 ; 0x1204a 11e28: a7 01 movw r20, r14 11e2a: 96 01 movw r18, r12 11e2c: 6c 89 ldd r22, Y+20 ; 0x14 11e2e: 7d 89 ldd r23, Y+21 ; 0x15 11e30: 8e 89 ldd r24, Y+22 ; 0x16 11e32: 9f 89 ldd r25, Y+23 ; 0x17 11e34: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 11e38: 18 16 cp r1, r24 11e3a: 0c f4 brge .+2 ; 0x11e3e 11e3c: 06 c1 rjmp .+524 ; 0x1204a 11e3e: 2d 8d ldd r18, Y+29 ; 0x1d 11e40: 3e 8d ldd r19, Y+30 ; 0x1e 11e42: 4f 8d ldd r20, Y+31 ; 0x1f 11e44: 58 a1 ldd r21, Y+32 ; 0x20 11e46: c7 01 movw r24, r14 11e48: b6 01 movw r22, r12 11e4a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 11e4e: 18 16 cp r1, r24 11e50: 0c f4 brge .+2 ; 0x11e54 11e52: fb c0 rjmp .+502 ; 0x1204a continue; } } // increment the total point counter if the points are not skipped meshPointsToProbe++; 11e54: 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++) { 11e56: 1f 5f subi r17, 0xFF ; 255 11e58: 24 e0 ldi r18, 0x04 ; 4 11e5a: 62 0e add r6, r18 11e5c: 71 1c adc r7, r1 11e5e: 17 30 cpi r17, 0x07 ; 7 11e60: 09 f0 breq .+2 ; 0x11e64 11e62: 79 cf rjmp .-270 ; 0x11d56 11e64: 6f ef ldi r22, 0xFF ; 255 11e66: 46 1a sub r4, r22 11e68: 56 0a sbc r5, r22 11e6a: 88 85 ldd r24, Y+8 ; 0x08 11e6c: 99 85 ldd r25, Y+9 ; 0x09 11e6e: 4c 96 adiw r24, 0x1c ; 28 11e70: 99 87 std Y+9, r25 ; 0x09 11e72: 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++) { 11e74: 97 e0 ldi r25, 0x07 ; 7 11e76: 49 16 cp r4, r25 11e78: 51 04 cpc r5, r1 11e7a: 09 f0 breq .+2 ; 0x11e7e 11e7c: 63 cf rjmp .-314 ; 0x11d44 // increment the total point counter if the points are not skipped meshPointsToProbe++; } } mbl.upsample_3x3(); //upsample the default mesh 11e7e: 0f 94 ea a2 call 0x345d4 ; 0x345d4 // Save custom message state, set a new custom message state to display: Calibrating point 9. CustomMsg custom_message_type_old = custom_message_type; 11e82: a0 91 c3 06 lds r26, 0x06C3 ; 0x8006c3 11e86: af 83 std Y+7, r26 ; 0x07 uint8_t custom_message_state_old = custom_message_state; 11e88: b0 91 f6 03 lds r27, 0x03F6 ; 0x8003f6 11e8c: b8 87 std Y+8, r27 ; 0x08 custom_message_type = CustomMsg::MeshBedLeveling; 11e8e: 81 e0 ldi r24, 0x01 ; 1 11e90: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 custom_message_state = meshPointsToProbe + 10; 11e94: 8a e0 ldi r24, 0x0A ; 10 11e96: 83 0d add r24, r3 11e98: 80 93 f6 03 sts 0x03F6, r24 ; 0x8003f6 lcd_update(1); 11e9c: 81 e0 ldi r24, 0x01 ; 1 11e9e: 0e 94 3f 6e call 0xdc7e ; 0xdc7e // Lift Z to a safe position before probing the first point current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 11ea2: 80 e0 ldi r24, 0x00 ; 0 11ea4: 90 e0 ldi r25, 0x00 ; 0 11ea6: a0 ea ldi r26, 0xA0 ; 160 11ea8: b0 e4 ldi r27, 0x40 ; 64 11eaa: 80 93 99 06 sts 0x0699, r24 ; 0x800699 11eae: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 11eb2: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 11eb6: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 11eba: 65 e5 ldi r22, 0x55 ; 85 11ebc: 75 e5 ldi r23, 0x55 ; 85 11ebe: 85 e5 ldi r24, 0x55 ; 85 11ec0: 91 e4 ldi r25, 0x41 ; 65 11ec2: 0f 94 3d c0 call 0x3807a ; 0x3807a // Cycle through all points and probe them int l_feedmultiply = setup_for_endstop_move(false); //save feedrate and feedmultiply, sets feedmultiply to 100 11ec6: 80 e0 ldi r24, 0x00 ; 0 11ec8: 0e 94 80 66 call 0xcd00 ; 0xcd00 11ecc: 9c a3 std Y+36, r25 ; 0x24 11ece: 8b a3 std Y+35, r24 ; 0x23 11ed0: 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 11ed2: 83 2d mov r24, r3 11ed4: 67 e0 ldi r22, 0x07 ; 7 11ed6: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 11eda: f8 2e mov r15, r24 11edc: 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 11ede: 68 2f mov r22, r24 11ee0: 70 e0 ldi r23, 0x00 ; 0 11ee2: 7f 87 std Y+15, r23 ; 0x0f 11ee4: 6e 87 std Y+14, r22 ; 0x0e 11ee6: 80 ff sbrs r24, 0 11ee8: 03 c0 rjmp .+6 ; 0x11ef0 11eea: 76 e0 ldi r23, 0x06 ; 6 11eec: 79 1b sub r23, r25 11eee: 07 2f mov r16, r23 bool isOn3x3Mesh = ((ix % 3 == 0) && (iy % 3 == 0)); 11ef0: 80 2f mov r24, r16 11ef2: 63 e0 ldi r22, 0x03 ; 3 11ef4: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 11ef8: 91 11 cpse r25, r1 11efa: 05 c0 rjmp .+10 ; 0x11f06 11efc: 8f 2d mov r24, r15 11efe: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 11f02: 11 e0 ldi r17, 0x01 ; 1 11f04: 91 11 cpse r25, r1 11f06: 10 e0 ldi r17, 0x00 ; 0 float x_pos = BED_X(ix); 11f08: 80 2f mov r24, r16 11f0a: 0f 94 29 ca call 0x39452 ; 0x39452 11f0e: 68 8b std Y+16, r22 ; 0x10 11f10: 79 8b std Y+17, r23 ; 0x11 11f12: 8a 8b std Y+18, r24 ; 0x12 11f14: 9b 8b std Y+19, r25 ; 0x13 float y_pos = BED_Y(iy); 11f16: 8f 2d mov r24, r15 11f18: 0f 94 29 ca call 0x39452 ; 0x39452 11f1c: 4b 01 movw r8, r22 11f1e: 5c 01 movw r10, r24 if (nMeasPoints == 3) { 11f20: 8e 81 ldd r24, Y+6 ; 0x06 11f22: 83 30 cpi r24, 0x03 ; 3 11f24: 09 f0 breq .+2 ; 0x11f28 11f26: 99 c0 rjmp .+306 ; 0x1205a if (!isOn3x3Mesh) { 11f28: 11 11 cpse r17, r1 11f2a: c8 c0 rjmp .+400 ; 0x120bc 11f2c: 27 e0 ldi r18, 0x07 ; 7 11f2e: ae 85 ldd r26, Y+14 ; 0x0e 11f30: bf 85 ldd r27, Y+15 ; 0x0f 11f32: 2a 9f mul r18, r26 11f34: f0 01 movw r30, r0 11f36: 2b 9f mul r18, r27 11f38: f0 0d add r31, r0 11f3a: 11 24 eor r1, r1 11f3c: e0 0f add r30, r16 11f3e: f1 1d adc r31, r1 11f40: ee 0f add r30, r30 11f42: ff 1f adc r31, r31 11f44: ee 0f add r30, r30 11f46: ff 1f adc r31, r31 11f48: ef 53 subi r30, 0x3F ; 63 11f4a: fc 4e sbci r31, 0xEC ; 236 11f4c: 60 e0 ldi r22, 0x00 ; 0 11f4e: 70 e0 ldi r23, 0x00 ; 0 11f50: 80 ec ldi r24, 0xC0 ; 192 11f52: 9f e7 ldi r25, 0x7F ; 127 11f54: 61 83 std Z+1, r22 ; 0x01 11f56: 72 83 std Z+2, r23 ; 0x02 11f58: 83 83 std Z+3, r24 ; 0x03 11f5a: 94 83 std Z+4, r25 ; 0x04 11f5c: 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) { 11f5e: e1 e3 ldi r30, 0x31 ; 49 11f60: 3e 12 cpse r3, r30 11f62: b7 cf rjmp .-146 ; 0x11ed2 custom_message_state--; mesh_point++; lcd_update(1); } current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 11f64: 80 e0 ldi r24, 0x00 ; 0 11f66: 90 e0 ldi r25, 0x00 ; 0 11f68: a0 ea ldi r26, 0xA0 ; 160 11f6a: b0 e4 ldi r27, 0x40 ; 64 11f6c: 80 93 99 06 sts 0x0699, r24 ; 0x800699 11f70: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 11f74: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 11f78: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 11f7c: 65 e5 ldi r22, 0x55 ; 85 11f7e: 75 e5 ldi r23, 0x55 ; 85 11f80: 85 e5 ldi r24, 0x55 ; 85 11f82: 91 e4 ldi r25, 0x41 ; 65 11f84: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 11f88: 0f 94 a9 43 call 0x28752 ; 0x28752 static uint8_t g80_fail_cnt = 0; if (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) { 11f8c: b1 e3 ldi r27, 0x31 ; 49 11f8e: 3b 16 cp r3, r27 11f90: 09 f4 brne .+2 ; 0x11f94 11f92: 33 c2 rjmp .+1126 ; 0x123fa if (g80_fail_cnt++ >= 1) { 11f94: 80 91 68 03 lds r24, 0x0368 ; 0x800368 11f98: 91 e0 ldi r25, 0x01 ; 1 11f9a: 98 0f add r25, r24 11f9c: 90 93 68 03 sts 0x0368, r25 ; 0x800368 11fa0: 88 23 and r24, r24 11fa2: 09 f4 brne .+2 ; 0x11fa6 11fa4: d3 c1 rjmp .+934 ; 0x1234c print_stop(); 11fa6: 60 e0 ldi r22, 0x00 ; 0 11fa8: 80 e0 ldi r24, 0x00 ; 0 11faa: 0e 94 53 f5 call 0x1eaa6 ; 0x1eaa6 lcd_show_fullscreen_message_and_wait_P(_T(MSG_MBL_FAILED)); 11fae: 86 e4 ldi r24, 0x46 ; 70 11fb0: 96 e3 ldi r25, 0x36 ; 54 11fb2: 0e 94 44 72 call 0xe488 ; 0xe488 11fb6: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_z_calibration_prompt(false); 11fba: 80 e0 ldi r24, 0x00 ; 0 11fbc: 0f 94 92 0d call 0x21b24 ; 0x21b24 current_position[E_AXIS] += default_retraction; plan_buffer_line_curposXYZE(400); } #endif // !PINDA_THERMISTOR exit: KEEPALIVE_STATE(NOT_BUSY); 11fc0: 81 e0 ldi r24, 0x01 ; 1 11fc2: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be // Restore custom message state lcd_setstatuspgm(MSG_WELCOME); 11fc6: 82 e1 ldi r24, 0x12 ; 18 11fc8: 90 e7 ldi r25, 0x70 ; 112 11fca: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = custom_message_type_old; 11fce: 2f 81 ldd r18, Y+7 ; 0x07 11fd0: 20 93 c3 06 sts 0x06C3, r18 ; 0x8006c3 custom_message_state = custom_message_state_old; 11fd4: 68 85 ldd r22, Y+8 ; 0x08 11fd6: 60 93 f6 03 sts 0x03F6, r22 ; 0x8003f6 lcd_update(2); 11fda: 82 e0 ldi r24, 0x02 ; 2 11fdc: 0e 94 3f 6e call 0xdc7e ; 0xdc7e st_synchronize(); 11fe0: 0f 94 a9 43 call 0x28752 ; 0x28752 mesh_bed_leveling_flag = false; 11fe4: 10 92 a7 0d sts 0x0DA7, r1 ; 0x800da7 11fe8: d6 cd rjmp .-1108 ; 0x11b96 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)) { 11fea: 01 11 cpse r16, r1 11fec: 03 c0 rjmp .+6 ; 0x11ff4 11fee: 11 23 and r17, r17 11ff0: 09 f4 brne .+2 ; 0x11ff4 11ff2: bc ce rjmp .-648 ; 0x11d6c // 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))); 11ff4: 81 2f mov r24, r17 11ff6: 63 e0 ldi r22, 0x03 ; 3 11ff8: 0f 94 cb dc call 0x3b996 ; 0x3b996 <__divmodqi4> 11ffc: 84 0d add r24, r4 11ffe: 95 2d mov r25, r5 12000: 91 1d adc r25, r1 12002: 88 0f add r24, r24 12004: 99 1f adc r25, r25 12006: 8d 53 subi r24, 0x3D ; 61 12008: 90 4f sbci r25, 0xF0 ; 240 1200a: 0f 94 1e dc call 0x3b83c ; 0x3b83c const float z0 = mbl.z_values[0][0] + *reinterpret_cast(&z_offset_u) * 0.01; 1200e: bc 01 movw r22, r24 12010: 99 0f add r25, r25 12012: 88 0b sbc r24, r24 12014: 99 0b sbc r25, r25 12016: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1201a: 2a e0 ldi r18, 0x0A ; 10 1201c: 37 ed ldi r19, 0xD7 ; 215 1201e: 43 e2 ldi r20, 0x23 ; 35 12020: 5c e3 ldi r21, 0x3C ; 60 12022: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 12026: 9b 01 movw r18, r22 12028: ac 01 movw r20, r24 1202a: 60 91 c2 13 lds r22, 0x13C2 ; 0x8013c2 1202e: 70 91 c3 13 lds r23, 0x13C3 ; 0x8013c3 12032: 80 91 c4 13 lds r24, 0x13C4 ; 0x8013c4 12036: 90 91 c5 13 lds r25, 0x13C5 ; 0x8013c5 1203a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1203e: f3 01 movw r30, r6 12040: 61 83 std Z+1, r22 ; 0x01 12042: 72 83 std Z+2, r23 ; 0x02 12044: 83 83 std Z+3, r24 ; 0x03 12046: 94 83 std Z+4, r25 ; 0x04 12048: 91 ce rjmp .-734 ; 0x11d6c 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)) { 1204a: fe 85 ldd r31, Y+14 ; 0x0e 1204c: ff 23 and r31, r31 1204e: 09 f4 brne .+2 ; 0x12052 12050: 02 cf rjmp .-508 ; 0x11e56 12052: 22 20 and r2, r2 12054: 09 f4 brne .+2 ; 0x12058 12056: fe ce rjmp .-516 ; 0x11e54 12058: fe ce rjmp .-516 ; 0x11e56 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)) { 1205a: 28 89 ldd r18, Y+16 ; 0x10 1205c: 39 89 ldd r19, Y+17 ; 0x11 1205e: 4a 89 ldd r20, Y+18 ; 0x12 12060: 5b 89 ldd r21, Y+19 ; 0x13 12062: 6a 85 ldd r22, Y+10 ; 0x0a 12064: 7b 85 ldd r23, Y+11 ; 0x0b 12066: 8c 85 ldd r24, Y+12 ; 0x0c 12068: 9d 85 ldd r25, Y+13 ; 0x0d 1206a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1206e: 18 16 cp r1, r24 12070: 04 f1 brlt .+64 ; 0x120b2 12072: 28 89 ldd r18, Y+16 ; 0x10 12074: 39 89 ldd r19, Y+17 ; 0x11 12076: 4a 89 ldd r20, Y+18 ; 0x12 12078: 5b 89 ldd r21, Y+19 ; 0x13 1207a: 69 8d ldd r22, Y+25 ; 0x19 1207c: 7a 8d ldd r23, Y+26 ; 0x1a 1207e: 8b 8d ldd r24, Y+27 ; 0x1b 12080: 9c 8d ldd r25, Y+28 ; 0x1c 12082: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 12086: 87 fd sbrc r24, 7 12088: 14 c0 rjmp .+40 ; 0x120b2 1208a: a5 01 movw r20, r10 1208c: 94 01 movw r18, r8 1208e: 6c 89 ldd r22, Y+20 ; 0x14 12090: 7d 89 ldd r23, Y+21 ; 0x15 12092: 8e 89 ldd r24, Y+22 ; 0x16 12094: 9f 89 ldd r25, Y+23 ; 0x17 12096: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1209a: 18 16 cp r1, r24 1209c: 54 f0 brlt .+20 ; 0x120b2 1209e: a5 01 movw r20, r10 120a0: 94 01 movw r18, r8 120a2: 6d 8d ldd r22, Y+29 ; 0x1d 120a4: 7e 8d ldd r23, Y+30 ; 0x1e 120a6: 8f 8d ldd r24, Y+31 ; 0x1f 120a8: 98 a1 ldd r25, Y+32 ; 0x20 120aa: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 120ae: 87 ff sbrs r24, 7 120b0: 05 c0 rjmp .+10 ; 0x120bc 120b2: 11 23 and r17, r17 120b4: 09 f4 brne .+2 ; 0x120b8 120b6: 52 cf rjmp .-348 ; 0x11f5c 120b8: 21 10 cpse r2, r1 120ba: 50 cf rjmp .-352 ; 0x11f5c mesh_point++; continue; //skip } // Move Z up to the probe height of the current Z point. const float z0 = mbl.z_values[iy][ix]; 120bc: 10 e0 ldi r17, 0x00 ; 0 120be: a7 e0 ldi r26, 0x07 ; 7 120c0: 8e 85 ldd r24, Y+14 ; 0x0e 120c2: 9f 85 ldd r25, Y+15 ; 0x0f 120c4: a8 9f mul r26, r24 120c6: f0 01 movw r30, r0 120c8: a9 9f mul r26, r25 120ca: f0 0d add r31, r0 120cc: 11 24 eor r1, r1 120ce: e0 0f add r30, r16 120d0: f1 1f adc r31, r17 120d2: ee 0f add r30, r30 120d4: ff 1f adc r31, r31 120d6: ee 0f add r30, r30 120d8: ff 1f adc r31, r31 120da: ef 53 subi r30, 0x3F ; 63 120dc: fc 4e sbci r31, 0xEC ; 236 120de: 41 80 ldd r4, Z+1 ; 0x01 120e0: 52 80 ldd r5, Z+2 ; 0x02 120e2: 63 80 ldd r6, Z+3 ; 0x03 120e4: 74 80 ldd r7, Z+4 ; 0x04 const float init_z_bckp = !has_z ? MESH_HOME_Z_SEARCH : z0 + MESH_HOME_Z_SEARCH_FAST; 120e6: c1 2c mov r12, r1 120e8: d1 2c mov r13, r1 120ea: e0 ea ldi r30, 0xA0 ; 160 120ec: ee 2e mov r14, r30 120ee: e0 e4 ldi r30, 0x40 ; 64 120f0: fe 2e mov r15, r30 120f2: 22 20 and r2, r2 120f4: 51 f0 breq .+20 ; 0x1210a 120f6: 23 e3 ldi r18, 0x33 ; 51 120f8: 33 e3 ldi r19, 0x33 ; 51 120fa: 43 eb ldi r20, 0xB3 ; 179 120fc: 5e e3 ldi r21, 0x3E ; 62 120fe: c3 01 movw r24, r6 12100: b2 01 movw r22, r4 12102: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 12106: 6b 01 movw r12, r22 12108: 7c 01 movw r14, r24 if (init_z_bckp > current_position[Z_AXIS]) { 1210a: a7 01 movw r20, r14 1210c: 96 01 movw r18, r12 1210e: 60 91 99 06 lds r22, 0x0699 ; 0x800699 12112: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 12116: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 1211a: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 1211e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 12122: 87 ff sbrs r24, 7 12124: 10 c0 rjmp .+32 ; 0x12146 current_position[Z_AXIS] = init_z_bckp; 12126: c0 92 99 06 sts 0x0699, r12 ; 0x800699 1212a: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 1212e: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 12132: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 12136: 65 e5 ldi r22, 0x55 ; 85 12138: 75 e5 ldi r23, 0x55 ; 85 1213a: 85 e5 ldi r24, 0x55 ; 85 1213c: 91 e4 ldi r25, 0x41 ; 65 1213e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 12142: 0f 94 a9 43 call 0x28752 ; 0x28752 } // Move to XY position of the sensor point. current_position[X_AXIS] = x_pos; 12146: 68 89 ldd r22, Y+16 ; 0x10 12148: 79 89 ldd r23, Y+17 ; 0x11 1214a: 8a 89 ldd r24, Y+18 ; 0x12 1214c: 9b 89 ldd r25, Y+19 ; 0x13 1214e: 60 93 91 06 sts 0x0691, r22 ; 0x800691 12152: 70 93 92 06 sts 0x0692, r23 ; 0x800692 12156: 80 93 93 06 sts 0x0693, r24 ; 0x800693 1215a: 90 93 94 06 sts 0x0694, r25 ; 0x800694 current_position[Y_AXIS] = y_pos; 1215e: 80 92 95 06 sts 0x0695, r8 ; 0x800695 12162: 90 92 96 06 sts 0x0696, r9 ; 0x800696 12166: a0 92 97 06 sts 0x0697, r10 ; 0x800697 1216a: b0 92 98 06 sts 0x0698, r11 ; 0x800698 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 1216e: 65 e9 ldi r22, 0x95 ; 149 12170: 76 e0 ldi r23, 0x06 ; 6 12172: 81 e9 ldi r24, 0x91 ; 145 12174: 96 e0 ldi r25, 0x06 ; 6 12176: 0e 94 42 6a call 0xd484 ; 0xd484 plan_buffer_line_curposXYZE(XY_AXIS_FEEDRATE); 1217a: 60 e0 ldi r22, 0x00 ; 0 1217c: 70 e0 ldi r23, 0x00 ; 0 1217e: 86 e1 ldi r24, 0x16 ; 22 12180: 93 e4 ldi r25, 0x43 ; 67 12182: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 12186: 0f 94 a9 43 call 0x28752 ; 0x28752 if (planner_aborted) 1218a: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 1218e: 88 23 and r24, r24 12190: 39 f0 breq .+14 ; 0x121a0 { custom_message_type = custom_message_type_old; 12192: 7f 81 ldd r23, Y+7 ; 0x07 12194: 70 93 c3 06 sts 0x06C3, r23 ; 0x8006c3 custom_message_state = custom_message_state_old; 12198: 88 85 ldd r24, Y+8 ; 0x08 1219a: 80 93 f6 03 sts 0x03F6, r24 ; 0x8003f6 1219e: fb cc rjmp .-1546 ; 0x11b96 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 121a0: 81 2c mov r8, r1 121a2: 91 2c mov r9, r1 121a4: 70 e2 ldi r23, 0x20 ; 32 121a6: a7 2e mov r10, r23 121a8: 71 ec ldi r23, 0xC1 ; 193 121aa: b7 2e mov r11, r23 121ac: 22 20 and r2, r2 121ae: 51 f0 breq .+20 ; 0x121c4 121b0: 2a 81 ldd r18, Y+2 ; 0x02 121b2: 3b 81 ldd r19, Y+3 ; 0x03 121b4: 4c 81 ldd r20, Y+4 ; 0x04 121b6: 5d 81 ldd r21, Y+5 ; 0x05 121b8: c3 01 movw r24, r6 121ba: b2 01 movw r22, r4 121bc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 121c0: 4b 01 movw r8, r22 121c2: 5c 01 movw r10, r24 121c4: 48 8d ldd r20, Y+24 ; 0x18 121c6: c5 01 movw r24, r10 121c8: b4 01 movw r22, r8 121ca: 0f 94 4b 8c call 0x31896 ; 0x31896 121ce: 81 11 cpse r24, r1 121d0: 0b c0 rjmp .+22 ; 0x121e8 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)); 121d2: 89 ec ldi r24, 0xC9 ; 201 121d4: 93 e6 ldi r25, 0x63 ; 99 121d6: 0e 94 44 72 call 0xe488 ; 0xe488 121da: 9f 93 push r25 121dc: 8f 93 push r24 121de: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 121e2: 0f 90 pop r0 121e4: 0f 90 pop r0 121e6: be ce rjmp .-644 ; 0x11f64 // 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. 121e8: 20 91 99 06 lds r18, 0x0699 ; 0x800699 121ec: 30 91 9a 06 lds r19, 0x069A ; 0x80069a 121f0: 40 91 9b 06 lds r20, 0x069B ; 0x80069b 121f4: 50 91 9c 06 lds r21, 0x069C ; 0x80069c 121f8: c7 01 movw r24, r14 121fa: b6 01 movw r22, r12 121fc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 12200: 20 e0 ldi r18, 0x00 ; 0 12202: 30 e0 ldi r19, 0x00 ; 0 12204: a9 01 movw r20, r18 12206: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1220a: 87 ff sbrs r24, 7 1220c: 36 c0 rjmp .+108 ; 0x1227a current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 1220e: 60 e0 ldi r22, 0x00 ; 0 12210: 70 e0 ldi r23, 0x00 ; 0 12212: 80 ea ldi r24, 0xA0 ; 160 12214: 90 e4 ldi r25, 0x40 ; 64 12216: 60 93 99 06 sts 0x0699, r22 ; 0x800699 1221a: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 1221e: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 12222: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 12226: 65 e5 ldi r22, 0x55 ; 85 12228: 75 e5 ldi r23, 0x55 ; 85 1222a: 85 e5 ldi r24, 0x55 ; 85 1222c: 91 e4 ldi r25, 0x41 ; 65 1222e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 12232: 0f 94 a9 43 call 0x28752 ; 0x28752 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 12236: 48 8d ldd r20, Y+24 ; 0x18 12238: c5 01 movw r24, r10 1223a: b4 01 movw r22, r8 1223c: 0f 94 4b 8c call 0x31896 ; 0x31896 12240: 88 23 and r24, r24 12242: 39 f2 breq .-114 ; 0x121d2 printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); break; } if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) { 12244: 20 91 99 06 lds r18, 0x0699 ; 0x800699 12248: 30 91 9a 06 lds r19, 0x069A ; 0x80069a 1224c: 40 91 9b 06 lds r20, 0x069B ; 0x80069b 12250: 50 91 9c 06 lds r21, 0x069C ; 0x80069c 12254: 60 e0 ldi r22, 0x00 ; 0 12256: 70 e0 ldi r23, 0x00 ; 0 12258: 80 ea ldi r24, 0xA0 ; 160 1225a: 90 e4 ldi r25, 0x40 ; 64 1225c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 12260: 2d ec ldi r18, 0xCD ; 205 12262: 3c ec ldi r19, 0xCC ; 204 12264: 4c ec ldi r20, 0xCC ; 204 12266: 5d e3 ldi r21, 0x3D ; 61 12268: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1226c: 87 ff sbrs r24, 7 1226e: 05 c0 rjmp .+10 ; 0x1227a puts_P(PSTR("Bed leveling failed. Sensor triggered too soon")); 12270: 8d e5 ldi r24, 0x5D ; 93 12272: 9c e7 ldi r25, 0x7C ; 124 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")); 12274: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 12278: 75 ce rjmp .-790 ; 0x11f64 1227a: c0 90 99 06 lds r12, 0x0699 ; 0x800699 1227e: d0 90 9a 06 lds r13, 0x069A ; 0x80069a 12282: e0 90 9b 06 lds r14, 0x069B ; 0x80069b 12286: f0 90 9c 06 lds r15, 0x069C ; 0x80069c 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 1228a: 22 20 and r2, r2 1228c: a1 f0 breq .+40 ; 0x122b6 1228e: a7 01 movw r20, r14 12290: 96 01 movw r18, r12 12292: c3 01 movw r24, r6 12294: b2 01 movw r22, r4 12296: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1229a: 9b 01 movw r18, r22 1229c: ac 01 movw r20, r24 1229e: 5f 77 andi r21, 0x7F ; 127 122a0: 6a 81 ldd r22, Y+2 ; 0x02 122a2: 7b 81 ldd r23, Y+3 ; 0x03 122a4: 8c 81 ldd r24, Y+4 ; 0x04 122a6: 9d 81 ldd r25, Y+5 ; 0x05 122a8: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 122ac: 87 ff sbrs r24, 7 122ae: 03 c0 rjmp .+6 ; 0x122b6 puts_P(PSTR("Bed leveling failed. Too much variation from eeprom mesh")); 122b0: 84 e2 ldi r24, 0x24 ; 36 122b2: 9c e7 ldi r25, 0x7C ; 124 122b4: df cf rjmp .-66 ; 0x12274 } #ifdef PINDA_THERMISTOR float temp_compensation_pinda_thermistor_offset(float temperature_pinda) { if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0; 122b6: 8f ea ldi r24, 0xAF ; 175 122b8: 9f e0 ldi r25, 0x0F ; 15 122ba: 0f 94 10 dc call 0x3b820 ; 0x3b820 122be: 88 23 and r24, r24 122c0: 09 f4 brne .+2 ; 0x122c4 122c2: 40 c0 rjmp .+128 ; 0x12344 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); } 122c4: 86 ea ldi r24, 0xA6 ; 166 122c6: 9f e0 ldi r25, 0x0F ; 15 122c8: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (!calibration_status_pinda()) return 0; 122cc: 88 23 and r24, r24 122ce: d1 f1 breq .+116 ; 0x12344 return temp_comp_interpolation(temperature_pinda) / cs.axis_steps_per_mm[Z_AXIS]; 122d0: 60 91 97 03 lds r22, 0x0397 ; 0x800397 122d4: 70 91 98 03 lds r23, 0x0398 ; 0x800398 122d8: 80 91 99 03 lds r24, 0x0399 ; 0x800399 122dc: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 122e0: 0e 94 22 5c call 0xb844 ; 0xb844 122e4: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 122e8: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 122ec: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 122f0: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 122f4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 122f8: 9b 01 movw r18, r22 122fa: ac 01 movw r20, r24 122fc: e7 e0 ldi r30, 0x07 ; 7 122fe: ae 85 ldd r26, Y+14 ; 0x0e 12300: bf 85 ldd r27, Y+15 ; 0x0f 12302: ea 9f mul r30, r26 12304: c0 01 movw r24, r0 12306: eb 9f mul r30, r27 12308: 90 0d add r25, r0 1230a: 11 24 eor r1, r1 1230c: 08 0f add r16, r24 1230e: 19 1f adc r17, r25 12310: 00 0f add r16, r16 12312: 11 1f adc r17, r17 12314: 00 0f add r16, r16 12316: 11 1f adc r17, r17 12318: 0f 53 subi r16, 0x3F ; 63 1231a: 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; 1231c: c7 01 movw r24, r14 1231e: b6 01 movw r22, r12 12320: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 12324: d8 01 movw r26, r16 12326: 11 96 adiw r26, 0x01 ; 1 12328: 6d 93 st X+, r22 1232a: 7d 93 st X+, r23 1232c: 8d 93 st X+, r24 1232e: 9c 93 st X, r25 12330: 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--; 12332: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 12336: 81 50 subi r24, 0x01 ; 1 12338: 80 93 f6 03 sts 0x03F6, r24 ; 0x8003f6 mesh_point++; lcd_update(1); 1233c: 81 e0 ldi r24, 0x01 ; 1 1233e: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 12342: 0c ce rjmp .-1000 ; 0x11f5c } #ifdef PINDA_THERMISTOR float temp_compensation_pinda_thermistor_offset(float temperature_pinda) { if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0; 12344: 20 e0 ldi r18, 0x00 ; 0 12346: 30 e0 ldi r19, 0x00 ; 0 12348: a9 01 movw r20, r18 1234a: d8 cf rjmp .-80 ; 0x122fc 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); 1234c: 85 e0 ldi r24, 0x05 ; 5 1234e: 0f 94 c8 4e call 0x29d90 ; 0x29d90 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; 12352: c1 2c mov r12, r1 12354: d1 2c mov r13, r1 12356: 90 ea ldi r25, 0xA0 ; 160 12358: e9 2e mov r14, r25 1235a: 90 e4 ldi r25, 0x40 ; 64 1235c: 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)); 1235e: 82 e1 ldi r24, 0x12 ; 18 12360: 96 e3 ldi r25, 0x36 ; 54 12362: 0e 94 44 72 call 0xe488 ; 0xe488 12366: 0f 94 c0 20 call 0x24180 ; 0x24180 #ifdef TMC2130 lcd_wait_for_click_delay(MSG_BED_LEVELING_FAILED_TIMEOUT); 1236a: 8e e1 ldi r24, 0x1E ; 30 1236c: 90 e0 ldi r25, 0x00 ; 0 1236e: 0f 94 07 3b call 0x2760e ; 0x2760e calibrate_z_auto(); // Z-leveling (X-assembly stay up!!!) 12372: 0e 94 d6 72 call 0xe5ac ; 0xe5ac #else // TMC2130 lcd_wait_for_click_delay(0); // ~ no timeout lcd_calibrate_z_end_stop_manual(true); // Z-leveling (X-assembly stay up!!!) #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); 12376: 80 e0 ldi r24, 0x00 ; 0 12378: 0f 94 a3 4e call 0x29d46 ; 0x29d46 1237c: 18 2f mov r17, r24 raise_z(-1); 1237e: 60 e0 ldi r22, 0x00 ; 0 12380: 70 e0 ldi r23, 0x00 ; 0 12382: 80 e8 ldi r24, 0x80 ; 128 12384: 9f eb ldi r25, 0xBF ; 191 12386: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 enable_z_endstop(true); 1238a: 81 e0 ldi r24, 0x01 ; 1 1238c: 0f 94 a3 4e call 0x29d46 ; 0x29d46 #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); 12390: 84 e0 ldi r24, 0x04 ; 4 12392: 0f 94 b4 26 call 0x24d68 ; 0x24d68 #endif // TMC2130 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 12396: c0 92 99 06 sts 0x0699, r12 ; 0x800699 1239a: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 1239e: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 123a2: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE); 123a6: 65 e5 ldi r22, 0x55 ; 85 123a8: 75 e5 ldi r23, 0x55 ; 85 123aa: 85 e5 ldi r24, 0x55 ; 85 123ac: 91 e4 ldi r25, 0x41 ; 65 123ae: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 123b2: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef TMC2130 tmc2130_home_exit(); 123b6: 0f 94 85 26 call 0x24d0a ; 0x24d0a #endif // TMC2130 enable_z_endstop(bState); 123ba: 81 2f mov r24, r17 123bc: 0f 94 a3 4e call 0x29d46 ; 0x29d46 } while (st_get_position_mm(Z_AXIS) > MESH_HOME_Z_SEARCH); // i.e. Z-leveling not o.k. 123c0: 82 e0 ldi r24, 0x02 ; 2 123c2: 0f 94 95 43 call 0x2872a ; 0x2872a 123c6: 20 e0 ldi r18, 0x00 ; 0 123c8: 30 e0 ldi r19, 0x00 ; 0 123ca: 40 ea ldi r20, 0xA0 ; 160 123cc: 50 e4 ldi r21, 0x40 ; 64 123ce: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 123d2: 18 16 cp r1, r24 123d4: 24 f2 brlt .-120 ; 0x1235e custom_message_type = custom_message_type_old; 123d6: ef 81 ldd r30, Y+7 ; 0x07 123d8: e0 93 c3 06 sts 0x06C3, r30 ; 0x8006c3 custom_message_state = custom_message_state_old; 123dc: f8 85 ldd r31, Y+8 ; 0x08 123de: f0 93 f6 03 sts 0x03F6, r31 ; 0x8003f6 lcd_update_enable(true); // display / status-line recovery 123e2: 81 e0 ldi r24, 0x01 ; 1 123e4: 0e 94 bd 6e call 0xdd7a ; 0xdd7a gcode_G28(true, true, true); // X & Y & Z-homing (must be after individual Z-homing (problem with spool-holder)!) 123e8: 41 e0 ldi r20, 0x01 ; 1 123ea: 61 e0 ldi r22, 0x01 ; 1 123ec: 81 e0 ldi r24, 0x01 ; 1 123ee: 0e 94 9d 7e call 0xfd3a ; 0xfd3a 123f2: 81 e0 ldi r24, 0x01 ; 1 123f4: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 123f8: ce cb rjmp .-2148 ; 0x11b96 repeatcommand_front(); // re-run (i.e. of "G80") return; } g80_fail_cnt = 0; // no fail was detected. Reset the error counter. 123fa: 10 92 68 03 sts 0x0368, r1 ; 0x800368 clean_up_after_endstop_move(l_feedmultiply); 123fe: 8b a1 ldd r24, Y+35 ; 0x23 12400: 9c a1 ldd r25, Y+36 ; 0x24 12402: 0e 94 66 66 call 0xcccc ; 0xcccc } } void babystep_apply() { babystep_load(); 12406: 0f 94 79 c9 call 0x392f2 ; 0x392f2 shift_z(- float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS])); 1240a: 60 91 89 06 lds r22, 0x0689 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> 1240e: 70 91 8a 06 lds r23, 0x068A ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 12412: 07 2e mov r0, r23 12414: 00 0c add r0, r0 12416: 88 0b sbc r24, r24 12418: 99 0b sbc r25, r25 1241a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1241e: 90 58 subi r25, 0x80 ; 128 12420: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 12424: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 12428: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 1242c: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 12430: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 12434: 0f 94 95 c9 call 0x3932a ; 0x3932a 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; 12438: 80 ec ldi r24, 0xC0 ; 192 1243a: 9f e0 ldi r25, 0x0F ; 15 1243c: 0f 94 10 dc call 0x3b820 ; 0x3b820 12440: 91 e0 ldi r25, 0x01 ; 1 12442: 81 30 cpi r24, 0x01 ; 1 12444: 09 f0 breq .+2 ; 0x12448 12446: 90 e0 ldi r25, 0x00 ; 0 } } else if (eeprom_bed_correction_valid) { return (int8_t)eeprom_read_byte(eep_address); } return 0; }; 12448: 99 83 std Y+1, r25 ; 0x01 const int8_t correction[4] = { bedCorrectHelper('L', (uint8_t*)EEPROM_BED_CORRECTION_LEFT), 1244a: 4f eb ldi r20, 0xBF ; 191 1244c: 5f e0 ldi r21, 0x0F ; 15 1244e: 6c e4 ldi r22, 0x4C ; 76 12450: ce 01 movw r24, r28 12452: 01 96 adiw r24, 0x01 ; 1 12454: 0e 94 83 5b call 0xb706 ; 0xb706 12458: f8 2e mov r15, r24 bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT), 1245a: 4e eb ldi r20, 0xBE ; 190 1245c: 5f e0 ldi r21, 0x0F ; 15 1245e: 62 e5 ldi r22, 0x52 ; 82 12460: ce 01 movw r24, r28 12462: 01 96 adiw r24, 0x01 ; 1 12464: 0e 94 83 5b call 0xb706 ; 0xb706 12468: 08 2f mov r16, r24 bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT), 1246a: 4d eb ldi r20, 0xBD ; 189 1246c: 5f e0 ldi r21, 0x0F ; 15 1246e: 66 e4 ldi r22, 0x46 ; 70 12470: ce 01 movw r24, r28 12472: 01 96 adiw r24, 0x01 ; 1 12474: 0e 94 83 5b call 0xb706 ; 0xb706 12478: 18 2f mov r17, r24 bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR), 1247a: 4c eb ldi r20, 0xBC ; 188 1247c: 5f e0 ldi r21, 0x0F ; 15 1247e: 62 e4 ldi r22, 0x42 ; 66 12480: ce 01 movw r24, r28 12482: 01 96 adiw r24, 0x01 ; 1 12484: 0e 94 83 5b call 0xb706 ; 0xb706 12488: 21 2f mov r18, r17 1248a: 11 0f add r17, r17 1248c: 33 0b sbc r19, r19 1248e: 08 2e mov r0, r24 12490: 00 0c add r0, r0 12492: 99 0b sbc r25, r25 12494: 5c 01 movw r10, r24 12496: a2 1a sub r10, r18 12498: b3 0a sbc r11, r19 1249a: 8f 2d mov r24, r15 1249c: ff 0c add r15, r15 1249e: 99 0b sbc r25, r25 124a0: 28 0f add r18, r24 124a2: 39 1f adc r19, r25 124a4: 46 e0 ldi r20, 0x06 ; 6 124a6: 42 9f mul r20, r18 124a8: 60 01 movw r12, r0 124aa: 43 9f mul r20, r19 124ac: d0 0c add r13, r0 124ae: 11 24 eor r1, r1 124b0: f1 2c mov r15, r1 124b2: e1 2c mov r14, r1 124b4: 00 2e mov r0, r16 124b6: 00 0c add r0, r0 124b8: 11 0b sbc r17, r17 124ba: 08 1b sub r16, r24 124bc: 19 0b sbc r17, r25 124be: b7 01 movw r22, r14 124c0: 6e 53 subi r22, 0x3E ; 62 124c2: 7c 4e sbci r23, 0xEC ; 236 124c4: 3b 01 movw r6, r22 124c6: 46 01 movw r8, r12 124c8: 77 e0 ldi r23, 0x07 ; 7 124ca: 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 * ( 124cc: d3 01 movw r26, r6 124ce: 2d 90 ld r2, X+ 124d0: 3d 90 ld r3, X+ 124d2: 4d 90 ld r4, X+ 124d4: 5d 90 ld r5, X+ 124d6: 3d 01 movw r6, r26 124d8: fd 01 movw r30, r26 124da: 34 97 sbiw r30, 0x04 ; 4 124dc: fb 87 std Y+11, r31 ; 0x0b 124de: ea 87 std Y+10, r30 ; 0x0a 124e0: b4 01 movw r22, r8 124e2: 09 2c mov r0, r9 124e4: 00 0c add r0, r0 124e6: 88 0b sbc r24, r24 124e8: 99 0b sbc r25, r25 124ea: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 124ee: 2f e3 ldi r18, 0x3F ; 63 124f0: 33 ec ldi r19, 0xC3 ; 195 124f2: 4e e2 ldi r20, 0x2E ; 46 124f4: 59 e3 ldi r21, 0x39 ; 57 124f6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 124fa: a2 01 movw r20, r4 124fc: 91 01 movw r18, r2 124fe: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 12502: aa 85 ldd r26, Y+10 ; 0x0a 12504: bb 85 ldd r27, Y+11 ; 0x0b 12506: 6d 93 st X+, r22 12508: 7d 93 st X+, r23 1250a: 8d 93 st X+, r24 1250c: 9c 93 st X, r25 1250e: 13 97 sbiw r26, 0x03 ; 3 12510: ba 81 ldd r27, Y+2 ; 0x02 12512: b1 50 subi r27, 0x01 ; 1 12514: ba 83 std Y+2, r27 ; 0x02 12516: 80 0e add r8, r16 12518: 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++) { 1251a: b1 11 cpse r27, r1 1251c: d7 cf rjmp .-82 ; 0x124cc 1251e: ca 0c add r12, r10 12520: db 1c adc r13, r11 12522: ec e1 ldi r30, 0x1C ; 28 12524: ee 0e add r14, r30 12526: 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++) { 12528: f4 ec ldi r31, 0xC4 ; 196 1252a: ef 16 cp r14, r31 1252c: f1 04 cpc r15, r1 1252e: 39 f6 brne .-114 ; 0x124be + 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) 12530: 0f 94 ea a2 call 0x345d4 ; 0x345d4 { // apply magnet compensation uint8_t useMagnetCompensation = code_seen('M') ? code_value_uint8() : eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION); 12534: 8d e4 ldi r24, 0x4D ; 77 12536: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1253a: 88 23 and r24, r24 1253c: 09 f4 brne .+2 ; 0x12540 1253e: 84 c0 rjmp .+264 ; 0x12648 12540: 0e 94 00 5b call 0xb600 ; 0xb600 if (nMeasPoints == 7 && useMagnetCompensation) { 12544: 2e 81 ldd r18, Y+6 ; 0x06 12546: 27 30 cpi r18, 0x07 ; 7 12548: 09 f0 breq .+2 ; 0x1254c 1254a: 94 c0 rjmp .+296 ; 0x12674 1254c: 88 23 and r24, r24 1254e: 09 f4 brne .+2 ; 0x12552 12550: 91 c0 rjmp .+290 ; 0x12674 12552: bb 24 eor r11, r11 12554: b3 94 inc r11 12556: aa 24 eor r10, r10 12558: aa 94 dec r10 1255a: ab 0c add r10, r11 1255c: 09 a1 ldd r16, Y+33 ; 0x21 1255e: 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++) { 12560: 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++; } 12562: 8e ef ldi r24, 0xFE ; 254 12564: 88 2e mov r8, r24 12566: 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)) { 12568: 6a 2d mov r22, r10 1256a: 86 2d mov r24, r6 1256c: 0f 94 44 c9 call 0x39288 ; 0x39288 12570: 99 24 eor r9, r9 12572: 93 94 inc r9 12574: 96 0c add r9, r6 12576: 81 11 cpse r24, r1 12578: 6e c0 rjmp .+220 ; 0x12656 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++; } 1257a: 6b 2d mov r22, r11 1257c: 86 2d mov r24, r6 1257e: 0f 94 44 c9 call 0x39288 ; 0x39288 } 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; 12582: c1 2c mov r12, r1 12584: d1 2c mov r13, r1 12586: 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; 12588: 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++; } 1258a: 88 23 and r24, r24 1258c: 81 f0 breq .+32 ; 0x125ae 1258e: 20 e0 ldi r18, 0x00 ; 0 12590: 30 e0 ldi r19, 0x00 ; 0 12592: a9 01 movw r20, r18 12594: d8 01 movw r26, r16 12596: 5d 96 adiw r26, 0x1d ; 29 12598: 6d 91 ld r22, X+ 1259a: 7d 91 ld r23, X+ 1259c: 8d 91 ld r24, X+ 1259e: 9c 91 ld r25, X 125a0: 90 97 sbiw r26, 0x20 ; 32 125a2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 125a6: 6b 01 movw r12, r22 125a8: 7c 01 movw r14, r24 125aa: 77 24 eor r7, r7 125ac: 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++; } 125ae: 68 2d mov r22, r8 125b0: 86 2d mov r24, r6 125b2: 0f 94 44 c9 call 0x39288 ; 0x39288 125b6: 88 23 and r24, r24 125b8: 69 f0 breq .+26 ; 0x125d4 125ba: f8 01 movw r30, r16 125bc: 7b 97 sbiw r30, 0x1b ; 27 125be: 20 81 ld r18, Z 125c0: 31 81 ldd r19, Z+1 ; 0x01 125c2: 42 81 ldd r20, Z+2 ; 0x02 125c4: 53 81 ldd r21, Z+3 ; 0x03 125c6: c7 01 movw r24, r14 125c8: b6 01 movw r22, r12 125ca: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 125ce: 6b 01 movw r12, r22 125d0: 7c 01 movw r14, r24 125d2: 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++; } 125d4: 6a 2d mov r22, r10 125d6: 89 2d mov r24, r9 125d8: 0f 94 44 c9 call 0x39288 ; 0x39288 125dc: 88 23 and r24, r24 125de: 61 f0 breq .+24 ; 0x125f8 125e0: f8 01 movw r30, r16 125e2: 25 81 ldd r18, Z+5 ; 0x05 125e4: 36 81 ldd r19, Z+6 ; 0x06 125e6: 47 81 ldd r20, Z+7 ; 0x07 125e8: 50 85 ldd r21, Z+8 ; 0x08 125ea: c7 01 movw r24, r14 125ec: b6 01 movw r22, r12 125ee: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 125f2: 6b 01 movw r12, r22 125f4: 7c 01 movw r14, r24 125f6: 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++; } 125f8: 6a 2d mov r22, r10 125fa: 8f ef ldi r24, 0xFF ; 255 125fc: 86 0d add r24, r6 125fe: 0f 94 44 c9 call 0x39288 ; 0x39288 12602: 88 23 and r24, r24 12604: 31 f1 breq .+76 ; 0x12652 12606: f8 01 movw r30, r16 12608: 33 97 sbiw r30, 0x03 ; 3 1260a: 20 81 ld r18, Z 1260c: 31 81 ldd r19, Z+1 ; 0x01 1260e: 42 81 ldd r20, Z+2 ; 0x02 12610: 53 81 ldd r21, Z+3 ; 0x03 12612: c7 01 movw r24, r14 12614: b6 01 movw r22, r12 12616: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1261a: 6b 01 movw r12, r22 1261c: 7c 01 movw r14, r24 1261e: 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 12620: 67 2d mov r22, r7 12622: 70 e0 ldi r23, 0x00 ; 0 12624: 90 e0 ldi r25, 0x00 ; 0 12626: 80 e0 ldi r24, 0x00 ; 0 12628: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1262c: 9b 01 movw r18, r22 1262e: ac 01 movw r20, r24 12630: c7 01 movw r24, r14 12632: b6 01 movw r22, r12 12634: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 12638: d8 01 movw r26, r16 1263a: 11 96 adiw r26, 0x01 ; 1 1263c: 6d 93 st X+, r22 1263e: 7d 93 st X+, r23 12640: 8d 93 st X+, r24 12642: 9c 93 st X, r25 12644: 14 97 sbiw r26, 0x04 ; 4 12646: 07 c0 rjmp .+14 ; 0x12656 } 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); 12648: 8c ea ldi r24, 0xAC ; 172 1264a: 9d e0 ldi r25, 0x0D ; 13 1264c: 0f 94 10 dc call 0x3b820 ; 0x3b820 12650: 79 cf rjmp .-270 ; 0x12544 12652: 71 10 cpse r7, r1 12654: e5 cf rjmp .-54 ; 0x12620 //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++) { 12656: 69 2c mov r6, r9 12658: 0c 5f subi r16, 0xFC ; 252 1265a: 1f 4f sbci r17, 0xFF ; 255 1265c: b7 e0 ldi r27, 0x07 ; 7 1265e: 9b 12 cpse r9, r27 12660: 83 cf rjmp .-250 ; 0x12568 12662: b3 94 inc r11 12664: e9 a1 ldd r30, Y+33 ; 0x21 12666: fa a1 ldd r31, Y+34 ; 0x22 12668: 7c 96 adiw r30, 0x1c ; 28 1266a: fa a3 std Y+34, r31 ; 0x22 1266c: 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++) { 1266e: f8 e0 ldi r31, 0x08 ; 8 12670: bf 12 cpse r11, r31 12672: 71 cf rjmp .-286 ; 0x12556 if (nMeasPoints == 7 && useMagnetCompensation) { mbl_magnet_elimination(); } } mbl.active = 1; //activate mesh bed leveling 12674: 81 e0 ldi r24, 0x01 ; 1 12676: 80 93 c1 13 sts 0x13C1, r24 ; 0x8013c1 if (code_seen('O') && !code_value_uint8()) { 1267a: 8f e4 ldi r24, 0x4F ; 79 1267c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 12680: 81 11 cpse r24, r1 12682: 03 c0 rjmp .+6 ; 0x1268a // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); } else { go_home_with_z_lift(); 12684: 0f 94 ea c9 call 0x393d4 ; 0x393d4 12688: 9b cc rjmp .-1738 ; 0x11fc0 } } mbl.active = 1; //activate mesh bed leveling if (code_seen('O') && !code_value_uint8()) { 1268a: 0e 94 00 5b call 0xb600 ; 0xb600 1268e: 81 11 cpse r24, r1 12690: f9 cf rjmp .-14 ; 0x12684 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 12692: 0e 94 5b 66 call 0xccb6 ; 0xccb6 12696: 94 cc rjmp .-1752 ; 0x11fc0 00012698 : //! @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() { 12698: 4f 92 push r4 1269a: 5f 92 push r5 1269c: 6f 92 push r6 1269e: 7f 92 push r7 126a0: 8f 92 push r8 126a2: 9f 92 push r9 126a4: af 92 push r10 126a6: bf 92 push r11 126a8: ef 92 push r14 126aa: ff 92 push r15 126ac: 0f 93 push r16 126ae: 1f 93 push r17 126b0: cf 93 push r28 126b2: df 93 push r29 126b4: 1f 92 push r1 126b6: cd b7 in r28, 0x3d ; 61 126b8: de b7 in r29, 0x3e ; 62 eeprom_read_block(reinterpret_cast(cs.version), reinterpret_cast(EEPROM_M500_base->version), sizeof(cs.version)); 126ba: 44 e0 ldi r20, 0x04 ; 4 126bc: 50 e0 ldi r21, 0x00 ; 0 126be: 64 e1 ldi r22, 0x14 ; 20 126c0: 70 e0 ldi r23, 0x00 ; 0 126c2: 8d eb ldi r24, 0xBD ; 189 126c4: 9d e0 ldi r25, 0x0D ; 13 126c6: 0f 94 00 dc call 0x3b800 ; 0x3b800 // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << cs.version << "]"); if (strncmp_P(cs.version, default_conf.version, sizeof(EEPROM_VERSION)) == 0) // version number match 126ca: 43 e0 ldi r20, 0x03 ; 3 126cc: 50 e0 ldi r21, 0x00 ; 0 126ce: 63 eb ldi r22, 0xB3 ; 179 126d0: 77 e7 ldi r23, 0x77 ; 119 126d2: 8d eb ldi r24, 0xBD ; 189 126d4: 9d e0 ldi r25, 0x0D ; 13 126d6: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 126da: 89 2b or r24, r25 126dc: 09 f0 breq .+2 ; 0x126e0 126de: 9f c1 rjmp .+830 ; 0x12a1e { // 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)); 126e0: e7 e7 ldi r30, 0x77 ; 119 126e2: f8 e7 ldi r31, 0x78 ; 120 126e4: 45 91 lpm r20, Z+ 126e6: 55 91 lpm r21, Z+ 126e8: 65 91 lpm r22, Z+ 126ea: 74 91 lpm r23, Z 126ec: 88 ed ldi r24, 0xD8 ; 216 126ee: 90 e0 ldi r25, 0x00 ; 0 126f0: 0e 94 bf 63 call 0xc77e ; 0xc77e eeprom_init_default_float(&EEPROM_M500_base->min_mm_per_arc_segment, pgm_read_float(&default_conf.min_mm_per_arc_segment)); 126f4: eb e7 ldi r30, 0x7B ; 123 126f6: f8 e7 ldi r31, 0x78 ; 120 126f8: 45 91 lpm r20, Z+ 126fa: 55 91 lpm r21, Z+ 126fc: 65 91 lpm r22, Z+ 126fe: 74 91 lpm r23, Z 12700: 8c ed ldi r24, 0xDC ; 220 12702: 90 e0 ldi r25, 0x00 ; 0 12704: 0e 94 bf 63 call 0xc77e ; 0xc77e eeprom_init_default_byte(&EEPROM_M500_base->n_arc_correction, pgm_read_byte(&default_conf.n_arc_correction)); 12708: ef e7 ldi r30, 0x7F ; 127 1270a: f8 e7 ldi r31, 0x78 ; 120 1270c: 64 91 lpm r22, Z 1270e: 80 ee ldi r24, 0xE0 ; 224 12710: 90 e0 ldi r25, 0x00 ; 0 12712: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_word(&EEPROM_M500_base->min_arc_segments, pgm_read_word(&default_conf.min_arc_segments)); 12716: e0 e8 ldi r30, 0x80 ; 128 12718: f8 e7 ldi r31, 0x78 ; 120 1271a: 65 91 lpm r22, Z+ 1271c: 74 91 lpm r23, Z 1271e: 81 ee ldi r24, 0xE1 ; 225 12720: 90 e0 ldi r25, 0x00 ; 0 12722: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word(&EEPROM_M500_base->arc_segments_per_sec, pgm_read_word(&default_conf.arc_segments_per_sec)); 12726: e2 e8 ldi r30, 0x82 ; 130 12728: f8 e7 ldi r31, 0x78 ; 120 1272a: 65 91 lpm r22, Z+ 1272c: 74 91 lpm r23, Z 1272e: 83 ee ldi r24, 0xE3 ; 227 12730: 90 e0 ldi r25, 0x00 ; 0 12732: 0e 94 89 75 call 0xeb12 ; 0xeb12 // 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)); 12736: e3 e7 ldi r30, 0x73 ; 115 12738: f8 e7 ldi r31, 0x78 ; 120 1273a: 45 91 lpm r20, Z+ 1273c: 55 91 lpm r21, Z+ 1273e: 65 91 lpm r22, Z+ 12740: 74 91 lpm r23, Z 12742: 84 ed ldi r24, 0xD4 ; 212 12744: 90 e0 ldi r25, 0x00 ; 0 12746: 0e 94 bf 63 call 0xc77e ; 0xc77e // 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); 1274a: 4f e4 ldi r20, 0x4F ; 79 1274c: 58 e7 ldi r21, 0x78 ; 120 1274e: 60 e1 ldi r22, 0x10 ; 16 12750: 70 e0 ldi r23, 0x00 ; 0 12752: 80 eb ldi r24, 0xB0 ; 176 12754: 90 e0 ldi r25, 0x00 ; 0 12756: 0e 94 6a 75 call 0xead4 ; 0xead4 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); 1275a: 4f e5 ldi r20, 0x5F ; 95 1275c: 58 e7 ldi r21, 0x78 ; 120 1275e: 60 e1 ldi r22, 0x10 ; 16 12760: 70 e0 ldi r23, 0x00 ; 0 12762: 80 ec ldi r24, 0xC0 ; 192 12764: 90 e0 ldi r25, 0x00 ; 0 12766: 0e 94 6a 75 call 0xead4 ; 0xead4 #ifdef TMC2130 eeprom_init_default_block(&EEPROM_M500_base->axis_ustep_resolution, sizeof(EEPROM_M500_base->axis_ustep_resolution), default_conf.axis_ustep_resolution); 1276a: 4f e6 ldi r20, 0x6F ; 111 1276c: 58 e7 ldi r21, 0x78 ; 120 1276e: 64 e0 ldi r22, 0x04 ; 4 12770: 70 e0 ldi r23, 0x00 ; 0 12772: 80 ed ldi r24, 0xD0 ; 208 12774: 90 e0 ldi r25, 0x00 ; 0 12776: 0e 94 6a 75 call 0xead4 ; 0xead4 #endif // TMC2130 // load the CS to RAM eeprom_read_block(reinterpret_cast(&cs), reinterpret_cast(EEPROM_M500_base), sizeof(cs)); 1277a: 41 ed ldi r20, 0xD1 ; 209 1277c: 50 e0 ldi r21, 0x00 ; 0 1277e: 64 e1 ldi r22, 0x14 ; 20 12780: 70 e0 ldi r23, 0x00 ; 0 12782: 8d eb ldi r24, 0xBD ; 189 12784: 9d e0 ldi r25, 0x0D ; 13 12786: 0f 94 00 dc call 0x3b800 ; 0x3b800 calculate_extruder_multipliers(); 1278a: 0e 94 51 65 call 0xcaa2 ; 0xcaa2 1278e: 0d eb ldi r16, 0xBD ; 189 12790: 1d e0 ldi r17, 0x0D ; 13 12792: 89 e5 ldi r24, 0x59 ; 89 12794: e8 2e mov r14, r24 12796: 8e e0 ldi r24, 0x0E ; 14 12798: f8 2e mov r15, r24 if (cs.max_feedrate_normal[j] > NORMAL_MAX_FEEDRATE_XY) cs.max_feedrate_normal[j] = NORMAL_MAX_FEEDRATE_XY; if (cs.max_feedrate_silent[j] > SILENT_MAX_FEEDRATE_XY) cs.max_feedrate_silent[j] = SILENT_MAX_FEEDRATE_XY; if (cs.max_acceleration_mm_per_s2_normal[j] > NORMAL_MAX_ACCEL_XY) cs.max_acceleration_mm_per_s2_normal[j] = NORMAL_MAX_ACCEL_XY; 1279a: 94 ec ldi r25, 0xC4 ; 196 1279c: 89 2e mov r8, r25 1279e: 99 e0 ldi r25, 0x09 ; 9 127a0: 99 2e mov r9, r25 127a2: a1 2c mov r10, r1 127a4: b1 2c mov r11, r1 if (cs.max_acceleration_mm_per_s2_silent[j] > SILENT_MAX_ACCEL_XY) cs.max_acceleration_mm_per_s2_silent[j] = SILENT_MAX_ACCEL_XY; 127a6: 20 ec ldi r18, 0xC0 ; 192 127a8: 42 2e mov r4, r18 127aa: 23 e0 ldi r18, 0x03 ; 3 127ac: 52 2e mov r5, r18 127ae: 61 2c mov r6, r1 127b0: 71 2c mov r7, r1 calculate_extruder_multipliers(); #ifdef TMC2130 for (uint8_t j = X_AXIS; j <= Y_AXIS; j++) { if (cs.max_feedrate_normal[j] > NORMAL_MAX_FEEDRATE_XY) 127b2: 20 e0 ldi r18, 0x00 ; 0 127b4: 30 e0 ldi r19, 0x00 ; 0 127b6: 48 e4 ldi r20, 0x48 ; 72 127b8: 53 e4 ldi r21, 0x43 ; 67 127ba: f8 01 movw r30, r16 127bc: 64 89 ldd r22, Z+20 ; 0x14 127be: 75 89 ldd r23, Z+21 ; 0x15 127c0: 86 89 ldd r24, Z+22 ; 0x16 127c2: 97 89 ldd r25, Z+23 ; 0x17 127c4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 127c8: 18 16 cp r1, r24 127ca: 4c f4 brge .+18 ; 0x127de cs.max_feedrate_normal[j] = NORMAL_MAX_FEEDRATE_XY; 127cc: 80 e0 ldi r24, 0x00 ; 0 127ce: 90 e0 ldi r25, 0x00 ; 0 127d0: a8 e4 ldi r26, 0x48 ; 72 127d2: b3 e4 ldi r27, 0x43 ; 67 127d4: f8 01 movw r30, r16 127d6: 84 8b std Z+20, r24 ; 0x14 127d8: 95 8b std Z+21, r25 ; 0x15 127da: a6 8b std Z+22, r26 ; 0x16 127dc: b7 8b std Z+23, r27 ; 0x17 if (cs.max_feedrate_silent[j] > SILENT_MAX_FEEDRATE_XY) 127de: f7 01 movw r30, r14 127e0: 61 91 ld r22, Z+ 127e2: 71 91 ld r23, Z+ 127e4: 81 91 ld r24, Z+ 127e6: 91 91 ld r25, Z+ 127e8: 7f 01 movw r14, r30 127ea: 20 e0 ldi r18, 0x00 ; 0 127ec: 30 e0 ldi r19, 0x00 ; 0 127ee: 48 ec ldi r20, 0xC8 ; 200 127f0: 52 e4 ldi r21, 0x42 ; 66 127f2: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 127f6: 18 16 cp r1, r24 127f8: 54 f4 brge .+20 ; 0x1280e cs.max_feedrate_silent[j] = SILENT_MAX_FEEDRATE_XY; 127fa: 80 e0 ldi r24, 0x00 ; 0 127fc: 90 e0 ldi r25, 0x00 ; 0 127fe: a8 ec ldi r26, 0xC8 ; 200 12800: b2 e4 ldi r27, 0x42 ; 66 12802: f7 01 movw r30, r14 12804: 34 97 sbiw r30, 0x04 ; 4 12806: 80 83 st Z, r24 12808: 91 83 std Z+1, r25 ; 0x01 1280a: a2 83 std Z+2, r26 ; 0x02 1280c: b3 83 std Z+3, r27 ; 0x03 if (cs.max_acceleration_mm_per_s2_normal[j] > NORMAL_MAX_ACCEL_XY) 1280e: f8 01 movw r30, r16 12810: 84 a1 ldd r24, Z+36 ; 0x24 12812: 95 a1 ldd r25, Z+37 ; 0x25 12814: a6 a1 ldd r26, Z+38 ; 0x26 12816: b7 a1 ldd r27, Z+39 ; 0x27 12818: 85 3c cpi r24, 0xC5 ; 197 1281a: 99 40 sbci r25, 0x09 ; 9 1281c: a1 05 cpc r26, r1 1281e: b1 05 cpc r27, r1 12820: 28 f0 brcs .+10 ; 0x1282c cs.max_acceleration_mm_per_s2_normal[j] = NORMAL_MAX_ACCEL_XY; 12822: f8 01 movw r30, r16 12824: 84 a2 std Z+36, r8 ; 0x24 12826: 95 a2 std Z+37, r9 ; 0x25 12828: a6 a2 std Z+38, r10 ; 0x26 1282a: b7 a2 std Z+39, r11 ; 0x27 if (cs.max_acceleration_mm_per_s2_silent[j] > SILENT_MAX_ACCEL_XY) 1282c: f7 01 movw r30, r14 1282e: 84 85 ldd r24, Z+12 ; 0x0c 12830: 95 85 ldd r25, Z+13 ; 0x0d 12832: a6 85 ldd r26, Z+14 ; 0x0e 12834: b7 85 ldd r27, Z+15 ; 0x0f 12836: 81 3c cpi r24, 0xC1 ; 193 12838: 93 40 sbci r25, 0x03 ; 3 1283a: a1 05 cpc r26, r1 1283c: b1 05 cpc r27, r1 1283e: 28 f0 brcs .+10 ; 0x1284a cs.max_acceleration_mm_per_s2_silent[j] = SILENT_MAX_ACCEL_XY; 12840: f7 01 movw r30, r14 12842: 44 86 std Z+12, r4 ; 0x0c 12844: 55 86 std Z+13, r5 ; 0x0d 12846: 66 86 std Z+14, r6 ; 0x0e 12848: 77 86 std Z+15, r7 ; 0x0f 1284a: 0c 5f subi r16, 0xFC ; 252 1284c: 1f 4f sbci r17, 0xFF ; 255 // load the CS to RAM eeprom_read_block(reinterpret_cast(&cs), reinterpret_cast(EEPROM_M500_base), sizeof(cs)); calculate_extruder_multipliers(); #ifdef TMC2130 for (uint8_t j = X_AXIS; j <= Y_AXIS; j++) 1284e: fd e0 ldi r31, 0x0D ; 13 12850: 05 3c cpi r16, 0xC5 ; 197 12852: 1f 07 cpc r17, r31 12854: 09 f0 breq .+2 ; 0x12858 12856: ad cf rjmp .-166 ; 0x127b2 cs.max_acceleration_mm_per_s2_normal[j] = NORMAL_MAX_ACCEL_XY; if (cs.max_acceleration_mm_per_s2_silent[j] > SILENT_MAX_ACCEL_XY) cs.max_acceleration_mm_per_s2_silent[j] = SILENT_MAX_ACCEL_XY; } tmc2130_set_res(X_AXIS, cs.axis_ustep_resolution[X_AXIS]); 12858: 60 91 79 0e lds r22, 0x0E79 ; 0x800e79 1285c: 70 e0 ldi r23, 0x00 ; 0 1285e: 80 e0 ldi r24, 0x00 ; 0 12860: 0f 94 d6 25 call 0x24bac ; 0x24bac tmc2130_set_res(Y_AXIS, cs.axis_ustep_resolution[Y_AXIS]); 12864: 60 91 7a 0e lds r22, 0x0E7A ; 0x800e7a 12868: 70 e0 ldi r23, 0x00 ; 0 1286a: 81 e0 ldi r24, 0x01 ; 1 1286c: 0f 94 d6 25 call 0x24bac ; 0x24bac tmc2130_set_res(Z_AXIS, cs.axis_ustep_resolution[Z_AXIS]); 12870: 60 91 7b 0e lds r22, 0x0E7B ; 0x800e7b 12874: 70 e0 ldi r23, 0x00 ; 0 12876: 82 e0 ldi r24, 0x02 ; 2 12878: 0f 94 d6 25 call 0x24bac ; 0x24bac tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]); 1287c: 60 91 7c 0e lds r22, 0x0E7C ; 0x800e7c 12880: 70 e0 ldi r23, 0x00 ; 0 12882: 83 e0 ldi r24, 0x03 ; 3 12884: 0f 94 d6 25 call 0x24bac ; 0x24bac #endif //TMC2130 reset_acceleration_rates(); 12888: 0f 94 56 64 call 0x2c8ac ; 0x2c8ac // Call updatePID (similar to when we have processed M301) updatePID(); 1288c: 0f 94 ab 3b call 0x27756 ; 0x27756 } void thermal_model_load_settings() { static_assert(THERMAL_MODEL_R_SIZE == 16); // ensure we don't desync with the eeprom table TempMgrGuard temp_mgr_guard; 12890: ce 01 movw r24, r28 12892: 01 96 adiw r24, 0x01 ; 1 12894: 0f 94 76 32 call 0x264ec ; 0x264ec // handle upgrade from a model without UVDL (FW<3.13, TM VER<1): model is retro-compatible, // reset UV to an identity without doing any special handling eeprom_init_default_float((float*)EEPROM_THERMAL_MODEL_U, THERMAL_MODEL_DEF(U)); 12898: 40 e0 ldi r20, 0x00 ; 0 1289a: 50 e0 ldi r21, 0x00 ; 0 1289c: ba 01 movw r22, r20 1289e: 82 ea ldi r24, 0xA2 ; 162 128a0: 9c e0 ldi r25, 0x0C ; 12 128a2: 0e 94 bf 63 call 0xc77e ; 0xc77e eeprom_init_default_float((float*)EEPROM_THERMAL_MODEL_V, THERMAL_MODEL_DEF(V)); 128a6: 40 e0 ldi r20, 0x00 ; 0 128a8: 50 e0 ldi r21, 0x00 ; 0 128aa: 60 e8 ldi r22, 0x80 ; 128 128ac: 7f e3 ldi r23, 0x3F ; 63 128ae: 8e e9 ldi r24, 0x9E ; 158 128b0: 9c e0 ldi r25, 0x0C ; 12 128b2: 0e 94 bf 63 call 0xc77e ; 0xc77e eeprom_init_default_float((float*)EEPROM_THERMAL_MODEL_D, THERMAL_MODEL_DEF(fS)); 128b6: 48 eb ldi r20, 0xB8 ; 184 128b8: 5e e1 ldi r21, 0x1E ; 30 128ba: 65 e8 ldi r22, 0x85 ; 133 128bc: 7d e3 ldi r23, 0x3D ; 61 128be: 8a e9 ldi r24, 0x9A ; 154 128c0: 9c e0 ldi r25, 0x0C ; 12 128c2: 0e 94 bf 63 call 0xc77e ; 0xc77e eeprom_init_default_word((uint16_t*)EEPROM_THERMAL_MODEL_L, THERMAL_MODEL_DEF(LAG)); 128c6: 64 e3 ldi r22, 0x34 ; 52 128c8: 78 e0 ldi r23, 0x08 ; 8 128ca: 88 e9 ldi r24, 0x98 ; 152 128cc: 9c e0 ldi r25, 0x0C ; 12 128ce: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_byte((uint8_t*)EEPROM_THERMAL_MODEL_VER, THERMAL_MODEL_DEF(VER)); 128d2: 61 e0 ldi r22, 0x01 ; 1 128d4: 87 e9 ldi r24, 0x97 ; 151 128d6: 9c e0 ldi r25, 0x0C ; 12 128d8: 0e 94 a1 75 call 0xeb42 ; 0xeb42 thermal_model::enabled = eeprom_read_byte((uint8_t*)EEPROM_THERMAL_MODEL_ENABLE); 128dc: 82 e0 ldi r24, 0x02 ; 2 128de: 9d e0 ldi r25, 0x0D ; 13 128e0: 0f 94 10 dc call 0x3b820 ; 0x3b820 128e4: 91 e0 ldi r25, 0x01 ; 1 128e6: 81 11 cpse r24, r1 128e8: 01 c0 rjmp .+2 ; 0x128ec 128ea: 90 e0 ldi r25, 0x00 ; 0 128ec: 90 93 1c 05 sts 0x051C, r25 ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> thermal_model::data.P = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_P); 128f0: 8e ef ldi r24, 0xFE ; 254 128f2: 9c e0 ldi r25, 0x0C ; 12 128f4: 0f 94 18 dc call 0x3b830 ; 0x3b830 128f8: 60 93 d9 12 sts 0x12D9, r22 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 128fc: 70 93 da 12 sts 0x12DA, r23 ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 12900: 80 93 db 12 sts 0x12DB, r24 ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 12904: 90 93 dc 12 sts 0x12DC, r25 ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> thermal_model::data.U = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_U); 12908: 82 ea ldi r24, 0xA2 ; 162 1290a: 9c e0 ldi r25, 0x0C ; 12 1290c: 0f 94 18 dc call 0x3b830 ; 0x3b830 12910: 60 93 dd 12 sts 0x12DD, r22 ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 12914: 70 93 de 12 sts 0x12DE, r23 ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 12918: 80 93 df 12 sts 0x12DF, r24 ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 1291c: 90 93 e0 12 sts 0x12E0, r25 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> thermal_model::data.V = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_V); 12920: 8e e9 ldi r24, 0x9E ; 158 12922: 9c e0 ldi r25, 0x0C ; 12 12924: 0f 94 18 dc call 0x3b830 ; 0x3b830 12928: 60 93 e1 12 sts 0x12E1, r22 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 1292c: 70 93 e2 12 sts 0x12E2, r23 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 12930: 80 93 e3 12 sts 0x12E3, r24 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 12934: 90 93 e4 12 sts 0x12E4, r25 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> thermal_model::data.C = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_C); 12938: 8a ef ldi r24, 0xFA ; 250 1293a: 9c e0 ldi r25, 0x0C ; 12 1293c: 0f 94 18 dc call 0x3b830 ; 0x3b830 12940: 60 93 e5 12 sts 0x12E5, r22 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 12944: 70 93 e6 12 sts 0x12E6, r23 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 12948: 80 93 e7 12 sts 0x12E7, r24 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 1294c: 90 93 e8 12 sts 0x12E8, r25 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> thermal_model::data.fS = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_D); 12950: 8a e9 ldi r24, 0x9A ; 154 12952: 9c e0 ldi r25, 0x0C ; 12 12954: 0f 94 18 dc call 0x3b830 ; 0x3b830 12958: 60 93 e9 12 sts 0x12E9, r22 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 1295c: 70 93 ea 12 sts 0x12EA, r23 ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 12960: 80 93 eb 12 sts 0x12EB, r24 ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 12964: 90 93 ec 12 sts 0x12EC, r25 ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> thermal_model_set_lag(eeprom_read_word((uint16_t*)EEPROM_THERMAL_MODEL_L)); 12968: 88 e9 ldi r24, 0x98 ; 152 1296a: 9c e0 ldi r25, 0x0C ; 12 1296c: 0f 94 1e dc call 0x3b83c ; 0x3b83c 12970: 0f 94 5e 2f call 0x25ebc ; 0x25ebc eeprom_read_block(&thermal_model::data.R[0], (float*)EEPROM_THERMAL_MODEL_R, THERMAL_MODEL_R_SIZE * sizeof(float)); 12974: 40 e4 ldi r20, 0x40 ; 64 12976: 50 e0 ldi r21, 0x00 ; 0 12978: 6a eb ldi r22, 0xBA ; 186 1297a: 7c e0 ldi r23, 0x0C ; 12 1297c: 8f ee ldi r24, 0xEF ; 239 1297e: 92 e1 ldi r25, 0x12 ; 18 12980: 0f 94 00 dc call 0x3b800 ; 0x3b800 thermal_model::data.Ta_corr = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_Ta_corr); 12984: 86 eb ldi r24, 0xB6 ; 182 12986: 9c e0 ldi r25, 0x0C ; 12 12988: 0f 94 18 dc call 0x3b830 ; 0x3b830 1298c: 60 93 2f 13 sts 0x132F, r22 ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 12990: 70 93 30 13 sts 0x1330, r23 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 12994: 80 93 31 13 sts 0x1331, r24 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 12998: 90 93 32 13 sts 0x1332, r25 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> thermal_model::data.warn = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_W); 1299c: 82 eb ldi r24, 0xB2 ; 178 1299e: 9c e0 ldi r25, 0x0C ; 12 129a0: 0f 94 18 dc call 0x3b830 ; 0x3b830 129a4: 60 93 33 13 sts 0x1333, r22 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 129a8: 70 93 34 13 sts 0x1334, r23 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 129ac: 80 93 35 13 sts 0x1335, r24 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 129b0: 90 93 36 13 sts 0x1336, r25 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> thermal_model::data.err = eeprom_read_float((float*)EEPROM_THERMAL_MODEL_E); 129b4: 8e ea ldi r24, 0xAE ; 174 129b6: 9c e0 ldi r25, 0x0C ; 12 129b8: 0f 94 18 dc call 0x3b830 ; 0x3b830 129bc: 60 93 37 13 sts 0x1337, r22 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 129c0: 70 93 38 13 sts 0x1338, r23 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 129c4: 80 93 39 13 sts 0x1339, r24 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 129c8: 90 93 3a 13 sts 0x133A, r25 ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> if(!thermal_model::calibrated()) { 129cc: 0f 94 7d 2f call 0x25efa ; 0x25efa 129d0: 81 11 cpse r24, r1 129d2: 06 c0 rjmp .+12 ; 0x129e0 SERIAL_ECHOLNPGM("TM: stored calibration invalid, resetting"); 129d4: 8d e4 ldi r24, 0x4D ; 77 129d6: 97 e7 ldi r25, 0x77 ; 119 129d8: 0e 94 13 79 call 0xf226 ; 0xf226 thermal_model_reset_settings(); 129dc: 0f 94 84 32 call 0x26508 ; 0x26508 } thermal_model::setup(); 129e0: 0f 94 e5 2f call 0x25fca ; 0x25fca } void thermal_model_load_settings() { static_assert(THERMAL_MODEL_R_SIZE == 16); // ensure we don't desync with the eeprom table TempMgrGuard temp_mgr_guard; 129e4: ce 01 movw r24, r28 129e6: 01 96 adiw r24, 0x01 ; 1 129e8: 0f 94 69 32 call 0x264d2 ; 0x264d2 #ifdef THERMAL_MODEL thermal_model_load_settings(); #endif SERIAL_ECHO_START; 129ec: 82 ef ldi r24, 0xF2 ; 242 129ee: 9a ea ldi r25, 0xAA ; 170 129f0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("Stored settings retrieved"); 129f4: 87 e7 ldi r24, 0x77 ; 119 129f6: 97 e7 ldi r25, 0x77 ; 119 129f8: 0e 94 13 79 call 0xf226 ; 0xf226 129fc: 81 e0 ldi r24, 0x01 ; 1 if (eeprom_is_initialized_block(EEPROM_M500_base->version, sizeof(EEPROM_M500_base->version))) { return false; } } return true; } 129fe: 0f 90 pop r0 12a00: df 91 pop r29 12a02: cf 91 pop r28 12a04: 1f 91 pop r17 12a06: 0f 91 pop r16 12a08: ff 90 pop r15 12a0a: ef 90 pop r14 12a0c: bf 90 pop r11 12a0e: af 90 pop r10 12a10: 9f 90 pop r9 12a12: 8f 90 pop r8 12a14: 7f 90 pop r7 12a16: 6f 90 pop r6 12a18: 5f 90 pop r5 12a1a: 4f 90 pop r4 12a1c: 08 95 ret SERIAL_ECHO_START; SERIAL_ECHOLNPGM("Stored settings retrieved"); } else { Config_ResetDefault(); 12a1e: 0e 94 24 82 call 0x10448 ; 0x10448 //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))) { 12a22: 64 e0 ldi r22, 0x04 ; 4 12a24: 70 e0 ldi r23, 0x00 ; 0 12a26: 84 e1 ldi r24, 0x14 ; 20 12a28: 90 e0 ldi r25, 0x00 ; 0 12a2a: 0e 94 53 5b call 0xb6a6 ; 0xb6a6 12a2e: 91 e0 ldi r25, 0x01 ; 1 12a30: 89 27 eor r24, r25 12a32: e5 cf rjmp .-54 ; 0x129fe 00012a34 : 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() 12a34: 2f 92 push r2 12a36: 3f 92 push r3 12a38: 4f 92 push r4 12a3a: 5f 92 push r5 12a3c: 6f 92 push r6 12a3e: 7f 92 push r7 12a40: 8f 92 push r8 12a42: 9f 92 push r9 12a44: af 92 push r10 12a46: bf 92 push r11 12a48: cf 92 push r12 12a4a: df 92 push r13 12a4c: ef 92 push r14 12a4e: ff 92 push r15 12a50: 0f 93 push r16 12a52: 1f 93 push r17 12a54: cf 93 push r28 12a56: df 93 push r29 12a58: cd b7 in r28, 0x3d ; 61 12a5a: de b7 in r29, 0x3e ; 62 12a5c: cf 58 subi r28, 0x8F ; 143 12a5e: d1 09 sbc r29, r1 12a60: 0f b6 in r0, 0x3f ; 63 12a62: f8 94 cli 12a64: de bf out 0x3e, r29 ; 62 12a66: 0f be out 0x3f, r0 ; 63 12a68: cd bf out 0x3d, r28 ; 61 #endif /* CMDBUFFER_DEBUG */ unsigned long codenum; //throw away variable // PRUSA GCODES KEEPALIVE_STATE(IN_HANDLER); 12a6a: 82 e0 ldi r24, 0x02 ; 2 12a6c: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be - TMC_SET_STEP - TMC_SET_CHOP */ if (false) {} // allow chaining of optional next else if blocks #ifdef TMC2130 else if (strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("CRASH_"), 6) == 0) 12a70: a0 90 91 12 lds r10, 0x1291 ; 0x801291 12a74: b0 90 92 12 lds r11, 0x1292 ; 0x801292 12a78: 85 01 movw r16, r10 12a7a: 09 55 subi r16, 0x59 ; 89 12a7c: 1f 4e sbci r17, 0xEF ; 239 12a7e: 46 e0 ldi r20, 0x06 ; 6 12a80: 50 e0 ldi r21, 0x00 ; 0 12a82: 61 e5 ldi r22, 0x51 ; 81 12a84: 78 e8 ldi r23, 0x88 ; 136 12a86: c8 01 movw r24, r16 12a88: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12a8c: 89 2b or r24, r25 12a8e: 09 f0 breq .+2 ; 0x12a92 12a90: b8 c0 rjmp .+368 ; 0x12c02 { // ### CRASH_DETECTED - TMC2130 // --------------------------------- if(code_seen_P(PSTR("CRASH_DETECTED"))) 12a92: 82 e4 ldi r24, 0x42 ; 66 12a94: 98 e8 ldi r25, 0x88 ; 136 12a96: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12a9a: 88 23 and r24, r24 12a9c: 09 f4 brne .+2 ; 0x12aa0 12a9e: 91 c0 rjmp .+290 ; 0x12bc2 { uint8_t mask = 0; if (code_seen('X')) mask |= X_AXIS_MASK; 12aa0: 88 e5 ldi r24, 0x58 ; 88 12aa2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 12aa6: 18 2f mov r17, r24 if (code_seen('Y')) mask |= Y_AXIS_MASK; 12aa8: 89 e5 ldi r24, 0x59 ; 89 12aaa: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 12aae: 81 11 cpse r24, r1 12ab0: 12 60 ori r17, 0x02 ; 2 strcpy_P(buf, _T(MSG_CRASH_DETECTED)); } void crashdet_detected(uint8_t mask) { st_synchronize(); 12ab2: 0f 94 a9 43 call 0x28752 ; 0x28752 static uint8_t crashDet_counter = 0; static uint8_t crashDet_axes = 0; bool automatic_recovery_after_crash = true; char msg[LCD_WIDTH+1] = ""; 12ab6: 1a 82 std Y+2, r1 ; 0x02 12ab8: 19 82 std Y+1, r1 ; 0x01 12aba: fe 01 movw r30, r28 12abc: 33 96 adiw r30, 0x03 ; 3 12abe: 83 e1 ldi r24, 0x13 ; 19 12ac0: df 01 movw r26, r30 12ac2: 1d 92 st X+, r1 12ac4: 8a 95 dec r24 12ac6: e9 f7 brne .-6 ; 0x12ac2 if (crashDetTimer.expired(CRASHDET_TIMER * 1000ul)) { 12ac8: 48 ec ldi r20, 0xC8 ; 200 12aca: 5f ea ldi r21, 0xAF ; 175 12acc: 60 e0 ldi r22, 0x00 ; 0 12ace: 70 e0 ldi r23, 0x00 ; 0 12ad0: 83 e7 ldi r24, 0x73 ; 115 12ad2: 93 e0 ldi r25, 0x03 ; 3 12ad4: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 12ad8: 81 11 cpse r24, r1 crashDet_counter = 0; 12ada: 10 92 72 03 sts 0x0372, r1 ; 0x800372 } if(++crashDet_counter >= CRASHDET_COUNTER_MAX) { 12ade: 00 91 72 03 lds r16, 0x0372 ; 0x800372 12ae2: 0f 5f subi r16, 0xFF ; 255 12ae4: 00 93 72 03 sts 0x0372, r16 ; 0x800372 automatic_recovery_after_crash = false; } crashDetTimer.start(); 12ae8: 83 e7 ldi r24, 0x73 ; 115 12aea: 93 e0 ldi r25, 0x03 ; 3 12aec: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> crashDet_axes |= mask; 12af0: 80 91 71 03 lds r24, 0x0371 ; 0x800371 12af4: 81 2b or r24, r17 12af6: 80 93 71 03 sts 0x0371, r24 ; 0x800371 if (mask & X_AXIS_MASK) { 12afa: 10 ff sbrs r17, 0 12afc: 08 c0 rjmp .+16 ; 0x12b0e eeprom_increment_byte((uint8_t*)EEPROM_CRASH_COUNT_X); 12afe: 86 e6 ldi r24, 0x66 ; 102 12b00: 9f e0 ldi r25, 0x0F ; 15 12b02: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT); 12b06: 85 e0 ldi r24, 0x05 ; 5 12b08: 9f e0 ldi r25, 0x0F ; 15 12b0a: 0e 94 b3 75 call 0xeb66 ; 0xeb66 } if (mask & Y_AXIS_MASK) { 12b0e: 11 ff sbrs r17, 1 12b10: 08 c0 rjmp .+16 ; 0x12b22 eeprom_increment_byte((uint8_t*)EEPROM_CRASH_COUNT_Y); 12b12: 88 e6 ldi r24, 0x68 ; 104 12b14: 9f e0 ldi r25, 0x0F ; 15 12b16: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT); 12b1a: 83 e0 ldi r24, 0x03 ; 3 12b1c: 9f e0 ldi r25, 0x0F ; 15 12b1e: 0e 94 b3 75 call 0xeb66 ; 0xeb66 } lcd_update_enable(true); 12b22: 81 e0 ldi r24, 0x01 ; 1 12b24: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 12b28: 82 e0 ldi r24, 0x02 ; 2 12b2a: 0e 94 3f 6e call 0xdc7e ; 0xdc7e // prepare the status message with the _current_ axes status crashdet_fmt_error(msg, mask); 12b2e: 61 2f mov r22, r17 12b30: ce 01 movw r24, r28 12b32: 01 96 adiw r24, 0x01 ; 1 12b34: 0e 94 a1 73 call 0xe742 ; 0xe742 lcd_setstatus(msg); 12b38: ce 01 movw r24, r28 12b3a: 01 96 adiw r24, 0x01 ; 1 12b3c: 0e 94 42 f5 call 0x1ea84 ; 0x1ea84 gcode_G28(true, true, false); //home X and Y 12b40: 40 e0 ldi r20, 0x00 ; 0 12b42: 61 e0 ldi r22, 0x01 ; 1 12b44: 81 e0 ldi r24, 0x01 ; 1 12b46: 0e 94 9d 7e call 0xfd3a ; 0xfd3a if (automatic_recovery_after_crash) { enquecommand_P(PSTR("CRASH_RECOVER")); 12b4a: 61 e0 ldi r22, 0x01 ; 1 12b4c: 84 ed ldi r24, 0xD4 ; 212 12b4e: 94 e8 ldi r25, 0x84 ; 132 crashdet_fmt_error(msg, mask); lcd_setstatus(msg); gcode_G28(true, true, false); //home X and Y if (automatic_recovery_after_crash) { 12b50: 03 30 cpi r16, 0x03 ; 3 12b52: 60 f1 brcs .+88 ; 0x12bac 12b54: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 12b58: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 enquecommand_P(PSTR("CRASH_RECOVER")); }else{ setTargetHotend(0); // notify the user of *all* the axes previously affected, not just the last one lcd_update_enable(false); 12b5c: 80 e0 ldi r24, 0x00 ; 0 12b5e: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 12b62: 0e 94 ab 6e call 0xdd56 ; 0xdd56 crashdet_fmt_error(msg, crashDet_axes); 12b66: 60 91 71 03 lds r22, 0x0371 ; 0x800371 12b6a: ce 01 movw r24, r28 12b6c: 01 96 adiw r24, 0x01 ; 1 12b6e: 0e 94 a1 73 call 0xe742 ; 0xe742 crashDet_axes = 0; 12b72: 10 92 71 03 sts 0x0371, r1 ; 0x800371 lcd_print(msg); 12b76: ce 01 movw r24, r28 12b78: 01 96 adiw r24, 0x01 ; 1 12b7a: 0e 94 7f 70 call 0xe0fe ; 0xe0fe // ask whether to resume printing lcd_puts_at_P(0, 1, _T(MSG_RESUME_PRINT)); 12b7e: 84 ea ldi r24, 0xA4 ; 164 12b80: 96 e4 ldi r25, 0x46 ; 70 12b82: 0e 94 44 72 call 0xe488 ; 0xe488 12b86: ac 01 movw r20, r24 12b88: 61 e0 ldi r22, 0x01 ; 1 12b8a: 80 e0 ldi r24, 0x00 ; 0 12b8c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc('?'); 12b90: 8f e3 ldi r24, 0x3F ; 63 12b92: 0e 94 67 6e call 0xdcce ; 0xdcce //! @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_yes_no_and_wait(bool allow_timeouting, uint8_t default_selection) { return lcd_show_multiscreen_message_yes_no_and_wait_P(NULL, allow_timeouting, default_selection); 12b96: 40 e0 ldi r20, 0x00 ; 0 12b98: 60 e0 ldi r22, 0x00 ; 0 12b9a: 90 e0 ldi r25, 0x00 ; 0 12b9c: 80 e0 ldi r24, 0x00 ; 0 12b9e: 0f 94 2a 50 call 0x2a054 ; 0x2a054 uint8_t yesno = lcd_show_yes_no_and_wait(false, LCD_LEFT_BUTTON_CHOICE); if (yesno == LCD_LEFT_BUTTON_CHOICE) { enquecommand_P(PSTR("CRASH_RECOVER")); 12ba2: 61 e0 ldi r22, 0x01 ; 1 // ask whether to resume printing lcd_puts_at_P(0, 1, _T(MSG_RESUME_PRINT)); lcd_putc('?'); uint8_t yesno = lcd_show_yes_no_and_wait(false, LCD_LEFT_BUTTON_CHOICE); if (yesno == LCD_LEFT_BUTTON_CHOICE) 12ba4: 81 11 cpse r24, r1 12ba6: 0a c0 rjmp .+20 ; 0x12bbc { enquecommand_P(PSTR("CRASH_RECOVER")); 12ba8: 86 ec ldi r24, 0xC6 ; 198 12baa: 94 e8 ldi r25, 0x84 ; 132 } else // LCD_MIDDLE_BUTTON_CHOICE { enquecommand_P(PSTR("CRASH_CANCEL")); 12bac: 0e 94 b8 87 call 0x10f70 ; 0x10f70 SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); } KEEPALIVE_STATE(NOT_BUSY); 12bb0: 81 e0 ldi r24, 0x01 ; 1 12bb2: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be ClearToSend(); 12bb6: 0e 94 c2 7e call 0xfd84 ; 0xfd84 12bba: 5e c3 rjmp .+1724 ; 0x13278 { enquecommand_P(PSTR("CRASH_RECOVER")); } else // LCD_MIDDLE_BUTTON_CHOICE { enquecommand_P(PSTR("CRASH_CANCEL")); 12bbc: 89 eb ldi r24, 0xB9 ; 185 12bbe: 94 e8 ldi r25, 0x84 ; 132 12bc0: f5 cf rjmp .-22 ; 0x12bac crashdet_detected(mask); } // ### CRASH_RECOVER - TMC2130 // ---------------------------------- else if(code_seen_P(PSTR("CRASH_RECOVER"))) 12bc2: 84 e3 ldi r24, 0x34 ; 52 12bc4: 98 e8 ldi r25, 0x88 ; 136 12bc6: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12bca: 88 23 and r24, r24 12bcc: 69 f0 breq .+26 ; 0x12be8 } } void crashdet_recover() { if (!printingIsPaused()) crashdet_restore_print_and_continue(); 12bce: 0e 94 1d 67 call 0xce3a ; 0xce3a 12bd2: 81 11 cpse r24, r1 12bd4: 06 c0 rjmp .+12 ; 0x12be2 stop_and_save_print_to_ram(pause_position[Z_AXIS], -default_retraction); //XY - no change, Pause Z LIFT mm up, E -1mm retract } void crashdet_restore_print_and_continue() { restore_print_from_ram_and_continue(default_retraction); //XYZ = orig, E +1mm unretract 12bd6: 60 e0 ldi r22, 0x00 ; 0 12bd8: 70 e0 ldi r23, 0x00 ; 0 12bda: 80 e8 ldi r24, 0x80 ; 128 12bdc: 9f e3 ldi r25, 0x3F ; 63 12bde: 0e 94 dc 67 call 0xcfb8 ; 0xcfb8 } void crashdet_recover() { if (!printingIsPaused()) crashdet_restore_print_and_continue(); crashdet_use_eeprom_setting(); 12be2: 0f 94 31 27 call 0x24e62 ; 0x24e62 12be6: e4 cf rjmp .-56 ; 0x12bb0 else if(code_seen_P(PSTR("CRASH_RECOVER"))) crashdet_recover(); // ### CRASH_CANCEL - TMC2130 // ---------------------------------- else if(code_seen_P(PSTR("CRASH_CANCEL"))) 12be8: 87 e2 ldi r24, 0x27 ; 39 12bea: 98 e8 ldi r25, 0x88 ; 136 12bec: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12bf0: 88 23 and r24, r24 12bf2: f1 f2 breq .-68 ; 0x12bb0 } /// Crash detection cancels the print void crashdet_cancel() { // Restore crash detection crashdet_use_eeprom_setting(); 12bf4: 0f 94 31 27 call 0x24e62 ; 0x24e62 // Abort the print print_stop(); 12bf8: 60 e0 ldi r22, 0x00 ; 0 12bfa: 80 e0 ldi r24, 0x00 ; 0 12bfc: 0e 94 53 f5 call 0x1eaa6 ; 0x1eaa6 12c00: d7 cf rjmp .-82 ; 0x12bb0 // ### CRASH_CANCEL - TMC2130 // ---------------------------------- else if(code_seen_P(PSTR("CRASH_CANCEL"))) crashdet_cancel(); } else if (strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("TMC_"), 4) == 0) 12c02: 44 e0 ldi r20, 0x04 ; 4 12c04: 50 e0 ldi r21, 0x00 ; 0 12c06: 62 e2 ldi r22, 0x22 ; 34 12c08: 78 e8 ldi r23, 0x88 ; 136 12c0a: c8 01 movw r24, r16 12c0c: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12c10: 89 2b or r24, r25 12c12: 09 f0 breq .+2 ; 0x12c16 12c14: fc c0 rjmp .+504 ; 0x12e0e { // ### TMC_SET_WAVE_ // -------------------- if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_WAVE_"), 9) == 0) 12c16: 85 01 movw r16, r10 12c18: 05 55 subi r16, 0x55 ; 85 12c1a: 1f 4e sbci r17, 0xEF ; 239 12c1c: 49 e0 ldi r20, 0x09 ; 9 12c1e: 50 e0 ldi r21, 0x00 ; 0 12c20: 68 e1 ldi r22, 0x18 ; 24 12c22: 78 e8 ldi r23, 0x88 ; 136 12c24: c8 01 movw r24, r16 12c26: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12c2a: 89 2b or r24, r25 12c2c: c9 f4 brne .+50 ; 0x12c60 { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); 12c2e: f5 01 movw r30, r10 12c30: ec 54 subi r30, 0x4C ; 76 12c32: ff 4e sbci r31, 0xEF ; 239 12c34: 10 81 ld r17, Z axis = (axis == 'E')?3:(axis - 'X'); 12c36: 15 34 cpi r17, 0x45 ; 69 12c38: 89 f0 breq .+34 ; 0x12c5c 12c3a: 18 55 subi r17, 0x58 ; 88 if (axis < 4) 12c3c: 14 30 cpi r17, 0x04 ; 4 12c3e: 08 f0 brcs .+2 ; 0x12c42 12c40: b7 cf rjmp .-146 ; 0x12bb0 { uint8_t fac = (uint8_t)strtol(CMDBUFFER_CURRENT_STRING + 14, NULL, 10); 12c42: 4a e0 ldi r20, 0x0A ; 10 12c44: 50 e0 ldi r21, 0x00 ; 0 12c46: 70 e0 ldi r23, 0x00 ; 0 12c48: 60 e0 ldi r22, 0x00 ; 0 12c4a: c5 01 movw r24, r10 12c4c: 8b 54 subi r24, 0x4B ; 75 12c4e: 9f 4e sbci r25, 0xEF ; 239 12c50: 0f 94 9b d7 call 0x3af36 ; 0x3af36 tmc2130_set_wave(axis, 247, fac); 12c54: 81 2f mov r24, r17 12c56: 0f 94 80 88 call 0x31100 ; 0x31100 12c5a: aa cf rjmp .-172 ; 0x12bb0 // ### TMC_SET_WAVE_ // -------------------- if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_WAVE_"), 9) == 0) { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); axis = (axis == 'E')?3:(axis - 'X'); 12c5c: 13 e0 ldi r17, 0x03 ; 3 12c5e: f1 cf rjmp .-30 ; 0x12c42 } } // ### TMC_SET_STEP_ // ------------------ else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_STEP_"), 9) == 0) 12c60: 49 e0 ldi r20, 0x09 ; 9 12c62: 50 e0 ldi r21, 0x00 ; 0 12c64: 6e e0 ldi r22, 0x0E ; 14 12c66: 78 e8 ldi r23, 0x88 ; 136 12c68: c8 01 movw r24, r16 12c6a: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12c6e: 89 2b or r24, r25 12c70: 51 f5 brne .+84 ; 0x12cc6 { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); 12c72: f5 01 movw r30, r10 12c74: ec 54 subi r30, 0x4C ; 76 12c76: ff 4e sbci r31, 0xEF ; 239 12c78: 10 81 ld r17, Z axis = (axis == 'E')?3:(axis - 'X'); 12c7a: 15 34 cpi r17, 0x45 ; 69 12c7c: 11 f1 breq .+68 ; 0x12cc2 12c7e: 18 55 subi r17, 0x58 ; 88 if (axis < 4) 12c80: 14 30 cpi r17, 0x04 ; 4 12c82: 08 f0 brcs .+2 ; 0x12c86 12c84: 95 cf rjmp .-214 ; 0x12bb0 { uint8_t step = (uint8_t)strtol(CMDBUFFER_CURRENT_STRING + 14, NULL, 10); 12c86: 4a e0 ldi r20, 0x0A ; 10 12c88: 50 e0 ldi r21, 0x00 ; 0 12c8a: 70 e0 ldi r23, 0x00 ; 0 12c8c: 60 e0 ldi r22, 0x00 ; 0 12c8e: c5 01 movw r24, r10 12c90: 8b 54 subi r24, 0x4B ; 75 12c92: 9f 4e sbci r25, 0xEF ; 239 12c94: 0f 94 9b d7 call 0x3af36 ; 0x3af36 12c98: e1 2f mov r30, r17 12c9a: f0 e0 ldi r31, 0x00 ; 0 12c9c: ec 50 subi r30, 0x0C ; 12 12c9e: fb 4f sbci r31, 0xFB ; 251 12ca0: 80 81 ld r24, Z 12ca2: 40 e0 ldi r20, 0x00 ; 0 12ca4: 51 e0 ldi r21, 0x01 ; 1 12ca6: 02 c0 rjmp .+4 ; 0x12cac 12ca8: 56 95 lsr r21 12caa: 47 95 ror r20 12cac: 8a 95 dec r24 12cae: e2 f7 brpl .-8 ; 0x12ca8 uint16_t res = tmc2130_get_res(axis); tmc2130_goto_step(axis, step & (4*res - 1), 2, 1000, res); 12cb0: 84 2f mov r24, r20 12cb2: 88 0f add r24, r24 12cb4: 88 0f add r24, r24 12cb6: 81 50 subi r24, 0x01 ; 1 12cb8: 68 23 and r22, r24 12cba: 81 2f mov r24, r17 12cbc: 0f 94 97 8b call 0x3172e ; 0x3172e 12cc0: 77 cf rjmp .-274 ; 0x12bb0 // ### TMC_SET_STEP_ // ------------------ else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_STEP_"), 9) == 0) { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); axis = (axis == 'E')?3:(axis - 'X'); 12cc2: 13 e0 ldi r17, 0x03 ; 3 12cc4: e0 cf rjmp .-64 ; 0x12c86 } } // ### TMC_SET_CHOP_ // ------------------- else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_CHOP_"), 9) == 0) 12cc6: 49 e0 ldi r20, 0x09 ; 9 12cc8: 50 e0 ldi r21, 0x00 ; 0 12cca: 64 e0 ldi r22, 0x04 ; 4 12ccc: 78 e8 ldi r23, 0x88 ; 136 12cce: c8 01 movw r24, r16 12cd0: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12cd4: 89 2b or r24, r25 12cd6: 09 f0 breq .+2 ; 0x12cda 12cd8: 6b cf rjmp .-298 ; 0x12bb0 { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); 12cda: f5 01 movw r30, r10 12cdc: ec 54 subi r30, 0x4C ; 76 12cde: ff 4e sbci r31, 0xEF ; 239 12ce0: 80 81 ld r24, Z axis = (axis == 'E')?3:(axis - 'X'); 12ce2: 85 34 cpi r24, 0x45 ; 69 12ce4: 09 f4 brne .+2 ; 0x12ce8 12ce6: 90 c0 rjmp .+288 ; 0x12e08 12ce8: 98 ea ldi r25, 0xA8 ; 168 12cea: c9 2e mov r12, r25 12cec: c8 0e add r12, r24 if (axis < 4) 12cee: b3 e0 ldi r27, 0x03 ; 3 12cf0: bc 15 cp r27, r12 12cf2: 08 f4 brcc .+2 ; 0x12cf6 12cf4: 5d cf rjmp .-326 ; 0x12bb0 { uint8_t chop0 = tmc2130_chopper_config[axis].toff; 12cf6: ec 2c mov r14, r12 12cf8: f1 2c mov r15, r1 12cfa: 47 01 movw r8, r14 12cfc: 88 0c add r8, r8 12cfe: 99 1c adc r9, r9 12d00: f4 01 movw r30, r8 12d02: eb 55 subi r30, 0x5B ; 91 12d04: fd 4f sbci r31, 0xFD ; 253 12d06: 00 81 ld r16, Z 12d08: 20 2f mov r18, r16 12d0a: 2f 70 andi r18, 0x0F ; 15 uint8_t chop1 = tmc2130_chopper_config[axis].hstr; 12d0c: 10 2f mov r17, r16 12d0e: 12 95 swap r17 12d10: 17 70 andi r17, 0x07 ; 7 uint8_t chop2 = tmc2130_chopper_config[axis].hend; 12d12: 00 1f adc r16, r16 12d14: 00 27 eor r16, r16 12d16: 00 1f adc r16, r16 12d18: 61 81 ldd r22, Z+1 ; 0x01 12d1a: 67 70 andi r22, 0x07 ; 7 12d1c: 66 0f add r22, r22 12d1e: 06 2b or r16, r22 uint8_t chop3 = tmc2130_chopper_config[axis].tbl; 12d20: f4 01 movw r30, r8 12d22: ea 55 subi r30, 0x5A ; 90 12d24: fd 4f sbci r31, 0xFD ; 253 12d26: d0 80 ld r13, Z 12d28: d6 94 lsr r13 12d2a: d6 94 lsr r13 12d2c: d6 94 lsr r13 12d2e: ed 2d mov r30, r13 12d30: e3 70 andi r30, 0x03 ; 3 12d32: de 2e mov r13, r30 char* str_end = 0; 12d34: 1a 82 std Y+2, r1 ; 0x02 12d36: 19 82 std Y+1, r1 ; 0x01 if (CMDBUFFER_CURRENT_STRING[14]) 12d38: c5 01 movw r24, r10 12d3a: 8b 54 subi r24, 0x4B ; 75 12d3c: 9f 4e sbci r25, 0xEF ; 239 12d3e: dc 01 movw r26, r24 12d40: 3c 91 ld r19, X { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); axis = (axis == 'E')?3:(axis - 'X'); if (axis < 4) { uint8_t chop0 = tmc2130_chopper_config[axis].toff; 12d42: b2 2e mov r11, r18 uint8_t chop1 = tmc2130_chopper_config[axis].hstr; uint8_t chop2 = tmc2130_chopper_config[axis].hend; uint8_t chop3 = tmc2130_chopper_config[axis].tbl; char* str_end = 0; if (CMDBUFFER_CURRENT_STRING[14]) 12d44: 33 23 and r19, r19 12d46: e1 f1 breq .+120 ; 0x12dc0 { chop0 = (uint8_t)strtol(CMDBUFFER_CURRENT_STRING + 14, &str_end, 10) & 15; 12d48: 4a e0 ldi r20, 0x0A ; 10 12d4a: 50 e0 ldi r21, 0x00 ; 0 12d4c: be 01 movw r22, r28 12d4e: 6f 5f subi r22, 0xFF ; 255 12d50: 7f 4f sbci r23, 0xFF ; 255 12d52: 0f 94 9b d7 call 0x3af36 ; 0x3af36 12d56: 6f 70 andi r22, 0x0F ; 15 12d58: b6 2e mov r11, r22 if (str_end && *str_end) 12d5a: 89 81 ldd r24, Y+1 ; 0x01 12d5c: 9a 81 ldd r25, Y+2 ; 0x02 12d5e: 00 97 sbiw r24, 0x00 ; 0 12d60: 79 f1 breq .+94 ; 0x12dc0 12d62: fc 01 movw r30, r24 12d64: 20 81 ld r18, Z 12d66: 22 23 and r18, r18 12d68: 59 f1 breq .+86 ; 0x12dc0 { chop1 = (uint8_t)strtol(str_end, &str_end, 10) & 7; 12d6a: 4a e0 ldi r20, 0x0A ; 10 12d6c: 50 e0 ldi r21, 0x00 ; 0 12d6e: be 01 movw r22, r28 12d70: 6f 5f subi r22, 0xFF ; 255 12d72: 7f 4f sbci r23, 0xFF ; 255 12d74: 0f 94 9b d7 call 0x3af36 ; 0x3af36 12d78: 16 2f mov r17, r22 12d7a: 17 70 andi r17, 0x07 ; 7 if (str_end && *str_end) 12d7c: 89 81 ldd r24, Y+1 ; 0x01 12d7e: 9a 81 ldd r25, Y+2 ; 0x02 12d80: 00 97 sbiw r24, 0x00 ; 0 12d82: f1 f0 breq .+60 ; 0x12dc0 12d84: dc 01 movw r26, r24 12d86: 2c 91 ld r18, X 12d88: 22 23 and r18, r18 12d8a: d1 f0 breq .+52 ; 0x12dc0 { chop2 = (uint8_t)strtol(str_end, &str_end, 10) & 15; 12d8c: 4a e0 ldi r20, 0x0A ; 10 12d8e: 50 e0 ldi r21, 0x00 ; 0 12d90: be 01 movw r22, r28 12d92: 6f 5f subi r22, 0xFF ; 255 12d94: 7f 4f sbci r23, 0xFF ; 255 12d96: 0f 94 9b d7 call 0x3af36 ; 0x3af36 12d9a: 06 2f mov r16, r22 12d9c: 0f 70 andi r16, 0x0F ; 15 if (str_end && *str_end) 12d9e: 89 81 ldd r24, Y+1 ; 0x01 12da0: 9a 81 ldd r25, Y+2 ; 0x02 12da2: 00 97 sbiw r24, 0x00 ; 0 12da4: 69 f0 breq .+26 ; 0x12dc0 12da6: fc 01 movw r30, r24 12da8: 20 81 ld r18, Z 12daa: 22 23 and r18, r18 12dac: 49 f0 breq .+18 ; 0x12dc0 chop3 = (uint8_t)strtol(str_end, &str_end, 10) & 3; 12dae: 4a e0 ldi r20, 0x0A ; 10 12db0: 50 e0 ldi r21, 0x00 ; 0 12db2: be 01 movw r22, r28 12db4: 6f 5f subi r22, 0xFF ; 255 12db6: 7f 4f sbci r23, 0xFF ; 255 12db8: 0f 94 9b d7 call 0x3af36 ; 0x3af36 12dbc: 63 70 andi r22, 0x03 ; 3 12dbe: d6 2e mov r13, r22 } } } tmc2130_chopper_config[axis].toff = chop0; 12dc0: f4 01 movw r30, r8 12dc2: eb 55 subi r30, 0x5B ; 91 12dc4: fd 4f sbci r31, 0xFD ; 253 tmc2130_chopper_config[axis].hstr = chop1 & 7; 12dc6: 17 70 andi r17, 0x07 ; 7 12dc8: 12 95 swap r17 12dca: 10 7f andi r17, 0xF0 ; 240 tmc2130_chopper_config[axis].hend = chop2 & 15; 12dcc: 60 2f mov r22, r16 12dce: 67 95 ror r22 12dd0: 66 27 eor r22, r22 12dd2: 67 95 ror r22 12dd4: 1b 29 or r17, r11 12dd6: 16 2b or r17, r22 12dd8: 10 83 st Z, r17 12dda: 60 2f mov r22, r16 12ddc: 66 95 lsr r22 12dde: 01 81 ldd r16, Z+1 ; 0x01 12de0: 00 7e andi r16, 0xE0 ; 224 tmc2130_chopper_config[axis].tbl = chop3 & 3; 12de2: 2d 2d mov r18, r13 12de4: 23 70 andi r18, 0x03 ; 3 12de6: d2 2e mov r13, r18 12de8: dd 0c add r13, r13 12dea: dd 0c add r13, r13 12dec: dd 0c add r13, r13 12dee: 06 2b or r16, r22 12df0: d0 2a or r13, r16 12df2: d1 82 std Z+1, r13 ; 0x01 tmc2130_setup_chopper(axis, tmc2130_mres[axis]); 12df4: f7 01 movw r30, r14 12df6: ec 50 subi r30, 0x0C ; 12 12df8: fb 4f sbci r31, 0xFB ; 251 12dfa: 50 e0 ldi r21, 0x00 ; 0 12dfc: 40 e0 ldi r20, 0x00 ; 0 12dfe: 60 81 ld r22, Z 12e00: 8c 2d mov r24, r12 12e02: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 12e06: d4 ce rjmp .-600 ; 0x12bb0 // ### TMC_SET_CHOP_ // ------------------- else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_CHOP_"), 9) == 0) { uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13); axis = (axis == 'E')?3:(axis - 'X'); 12e08: 03 e0 ldi r16, 0x03 ; 3 12e0a: c0 2e mov r12, r16 12e0c: 74 cf rjmp .-280 ; 0x12cf6 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) { 12e0e: 45 e0 ldi r20, 0x05 ; 5 12e10: 50 e0 ldi r21, 0x00 ; 0 12e12: 6e ef ldi r22, 0xFE ; 254 12e14: 77 e8 ldi r23, 0x87 ; 135 12e16: c8 01 movw r24, r16 12e18: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 12e1c: 89 2b or r24, r25 12e1e: 09 f0 breq .+2 ; 0x12e22 12e20: 64 c1 rjmp .+712 ; 0x130ea - `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"))) { 12e22: 84 ef ldi r24, 0xF4 ; 244 12e24: 97 e8 ldi r25, 0x87 ; 135 12e26: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12e2a: 88 23 and r24, r24 12e2c: 09 f4 brne .+2 ; 0x12e30 12e2e: 3c c0 rjmp .+120 ; 0x12ea8 //! So basically we are interested in maximum time, the minima are mostly the same. //! May be that's why the bad RAMBo's still produce some fan RPM reading, but not corresponding to reality static void gcode_PRUSA_BadRAMBoFanTest(){ //printf_P(PSTR("Enter fan pin test\n")); #if !defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && TACH_1 >-1 fan_measuring = false; // prevent EXTINT7 breaking into the measurement 12e30: 10 92 6e 06 sts 0x066E, r1 ; 0x80066e 12e34: 14 e6 ldi r17, 0x64 ; 100 unsigned long tach1max = 0; 12e36: c1 2c mov r12, r1 12e38: d1 2c mov r13, r1 12e3a: 76 01 movw r14, r12 uint8_t tach1cntr = 0; for( /* nothing */; tach1cntr < 100; ++tach1cntr){ //printf_P(PSTR("TACH_1: %d\n"), tach1cntr); SET_OUTPUT(TACH_1); 12e3c: 6f 9a sbi 0x0d, 7 ; 13 WRITE(TACH_1, LOW); 12e3e: 77 98 cbi 0x0e, 7 ; 14 _delay(20); // the delay may be lower 12e40: 64 e1 ldi r22, 0x14 ; 20 12e42: 70 e0 ldi r23, 0x00 ; 0 12e44: 80 e0 ldi r24, 0x00 ; 0 12e46: 90 e0 ldi r25, 0x00 ; 0 12e48: 0f 94 2f 28 call 0x2505e ; 0x2505e unsigned long tachMeasure = _micros(); 12e4c: 0f 94 09 28 call 0x25012 ; 0x25012 12e50: 4b 01 movw r8, r22 12e52: 5c 01 movw r10, r24 cli(); 12e54: f8 94 cli SET_INPUT(TACH_1); 12e56: 6f 98 cbi 0x0d, 7 ; 13 // just wait brutally in an endless cycle until we reach HIGH // if this becomes a problem it may be improved to non-endless cycle while( READ(TACH_1) == 0 ) ; 12e58: 67 9b sbis 0x0c, 7 ; 12 12e5a: fe cf rjmp .-4 ; 0x12e58 sei(); 12e5c: 78 94 sei tachMeasure = _micros() - tachMeasure; 12e5e: 0f 94 09 28 call 0x25012 ; 0x25012 12e62: dc 01 movw r26, r24 12e64: cb 01 movw r24, r22 12e66: 88 19 sub r24, r8 12e68: 99 09 sbc r25, r9 12e6a: aa 09 sbc r26, r10 12e6c: bb 09 sbc r27, r11 12e6e: c8 16 cp r12, r24 12e70: d9 06 cpc r13, r25 12e72: ea 06 cpc r14, r26 12e74: fb 06 cpc r15, r27 12e76: 10 f4 brcc .+4 ; 0x12e7c 12e78: 6c 01 movw r12, r24 12e7a: 7d 01 movw r14, r26 12e7c: 11 50 subi r17, 0x01 ; 1 //printf_P(PSTR("Enter fan pin test\n")); #if !defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && TACH_1 >-1 fan_measuring = false; // prevent EXTINT7 breaking into the measurement unsigned long tach1max = 0; uint8_t tach1cntr = 0; for( /* nothing */; tach1cntr < 100; ++tach1cntr){ 12e7e: f1 f6 brne .-68 ; 0x12e3c if( tach1max < tachMeasure ) tach1max = tachMeasure; //printf_P(PSTR("TACH_1: %d: capacitor check time=%lu us\n"), (int)tach1cntr, tachMeasure); } //printf_P(PSTR("TACH_1: max=%lu us\n"), tach1max); SERIAL_PROTOCOLPGM("RAMBo FAN "); 12e80: 8e ea ldi r24, 0xAE ; 174 12e82: 94 e8 ldi r25, 0x84 ; 132 12e84: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if( tach1max > 500 ){ // bad RAMBo SERIAL_PROTOCOLLNPGM("BAD"); 12e88: 8a ea ldi r24, 0xAA ; 170 12e8a: 94 e8 ldi r25, 0x84 ; 132 tach1max = tachMeasure; //printf_P(PSTR("TACH_1: %d: capacitor check time=%lu us\n"), (int)tach1cntr, tachMeasure); } //printf_P(PSTR("TACH_1: max=%lu us\n"), tach1max); SERIAL_PROTOCOLPGM("RAMBo FAN "); if( tach1max > 500 ){ 12e8c: 35 ef ldi r19, 0xF5 ; 245 12e8e: c3 16 cp r12, r19 12e90: 31 e0 ldi r19, 0x01 ; 1 12e92: d3 06 cpc r13, r19 12e94: e1 04 cpc r14, r1 12e96: f1 04 cpc r15, r1 12e98: 10 f4 brcc .+4 ; 0x12e9e // bad RAMBo SERIAL_PROTOCOLLNPGM("BAD"); } else { SERIAL_PROTOCOLLNPGM("OK"); 12e9a: 87 ea ldi r24, 0xA7 ; 167 12e9c: 94 e8 ldi r25, 0x84 ; 132 12e9e: 0e 94 13 79 call 0xf226 ; 0xf226 } // cleanup after the test function SET_INPUT(TACH_1); 12ea2: 6f 98 cbi 0x0d, 7 ; 13 WRITE(TACH_1, HIGH); 12ea4: 77 9a sbi 0x0e, 7 ; 14 12ea6: 84 ce rjmp .-760 ; 0x12bb0 */ if (farm_prusa_code_seen()) {} else if(code_seen_P(PSTR("FANPINTST"))) { gcode_PRUSA_BadRAMBoFanTest(); } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN 12ea8: 80 ef ldi r24, 0xF0 ; 240 12eaa: 97 e8 ldi r25, 0x87 ; 135 12eac: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12eb0: 88 23 and r24, r24 12eb2: 21 f1 breq .+72 ; 0x12efc printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]); 12eb4: 40 91 c9 03 lds r20, 0x03C9 ; 0x8003c9 12eb8: 50 91 ca 03 lds r21, 0x03CA ; 0x8003ca 12ebc: 2c e3 ldi r18, 0x3C ; 60 12ebe: 24 9f mul r18, r20 12ec0: c0 01 movw r24, r0 12ec2: 25 9f mul r18, r21 12ec4: 90 0d add r25, r0 12ec6: 11 24 eor r1, r1 12ec8: 9f 93 push r25 12eca: 8f 93 push r24 12ecc: 40 91 c7 03 lds r20, 0x03C7 ; 0x8003c7 12ed0: 50 91 c8 03 lds r21, 0x03C8 ; 0x8003c8 12ed4: 24 9f mul r18, r20 12ed6: c0 01 movw r24, r0 12ed8: 25 9f mul r18, r21 12eda: 90 0d add r25, r0 12edc: 11 24 eor r1, r1 12ede: 9f 93 push r25 12ee0: 8f 93 push r24 12ee2: 8e eb ldi r24, 0xBE ; 190 12ee4: 99 e6 ldi r25, 0x69 ; 105 #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //DEBUG_DCODES default: printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE); 12ee6: 9f 93 push r25 12ee8: 8f 93 push r24 12eea: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 12eee: 0f 90 pop r0 12ef0: 0f 90 pop r0 12ef2: 0f 90 pop r0 12ef4: 0f 90 pop r0 12ef6: 0f 90 pop r0 12ef8: 0f 90 pop r0 12efa: 5a ce rjmp .-844 ; 0x12bb0 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 12efc: 8b ee ldi r24, 0xEB ; 235 12efe: 97 e8 ldi r25, 0x87 ; 135 12f00: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12f04: 88 23 and r24, r24 12f06: 11 f1 breq .+68 ; 0x12f4c if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_SD) { 12f08: 8c e8 ldi r24, 0x8C ; 140 12f0a: 9f e0 ldi r25, 0x0F ; 15 12f0c: 0f 94 10 dc call 0x3b820 ; 0x3b820 12f10: 81 11 cpse r24, r1 12f12: 10 c0 rjmp .+32 ; 0x12f34 // M24 - Start SD print enquecommand_P(MSG_M24); 12f14: 61 e0 ldi r22, 0x01 ; 1 12f16: 8d e8 ldi r24, 0x8D ; 141 12f18: 90 e7 ldi r25, 0x70 ; 112 12f1a: 0e 94 b8 87 call 0x10f70 ; 0x10f70 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 12f1e: 60 e0 ldi r22, 0x00 ; 0 12f20: 85 ea ldi r24, 0xA5 ; 165 12f22: 9f e0 ldi r25, 0x0F ; 15 12f24: 0f 94 34 dc call 0x3b868 ; 0x3b868 12f28: 60 e0 ldi r22, 0x00 ; 0 12f2a: 8f e7 ldi r24, 0x7F ; 127 12f2c: 9c e0 ldi r25, 0x0C ; 12 12f2e: 0f 94 34 dc call 0x3b868 ; 0x3b868 12f32: 3e ce rjmp .-900 ; 0x12bb0 // 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) { 12f34: 81 30 cpi r24, 0x01 ; 1 12f36: 09 f0 breq .+2 ; 0x12f3a 12f38: 3b ce rjmp .-906 ; 0x12bb0 // 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(); 12f3a: 0f 94 4e 43 call 0x2869c ; 0x2869c usb_timer.start(); 12f3e: 8d e0 ldi r24, 0x0D ; 13 12f40: 95 e0 ldi r25, 0x05 ; 5 12f42: 0f 94 89 2a call 0x25512 ; 0x25512 ::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(); 12f46: 0f 94 34 2a call 0x25468 ; 0x25468 12f4a: 32 ce rjmp .-924 ; 0x12bb0 } } else if (code_seen_P(PSTR("MMURES"))) { // PRUSA MMURES 12f4c: 84 ee ldi r24, 0xE4 ; 228 12f4e: 97 e8 ldi r25, 0x87 ; 135 12f50: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12f54: 88 23 and r24, r24 12f56: 21 f0 breq .+8 ; 0x12f60 break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 12f58: 80 e0 ldi r24, 0x00 ; 0 12f5a: 0f 94 58 10 call 0x220b0 ; 0x220b0 12f5e: 28 ce rjmp .-944 ; 0x12bb0 MMU2::mmu2.Reset(MMU2::MMU2::Software); } else if (code_seen_P(PSTR("RESET"))) { // PRUSA RESET 12f60: 8e ed ldi r24, 0xDE ; 222 12f62: 97 e8 ldi r25, 0x87 ; 135 12f64: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12f68: 88 23 and r24, r24 12f6a: 51 f0 breq .+20 ; 0x12f80 #if defined(XFLASH) && defined(BOOTAPP) boot_app_magic = 0; 12f6c: 10 92 fc 1f sts 0x1FFC, r1 ; 0x801ffc <__bss_end+0x7dd> 12f70: 10 92 fd 1f sts 0x1FFD, r1 ; 0x801ffd <__bss_end+0x7de> 12f74: 10 92 fe 1f sts 0x1FFE, r1 ; 0x801ffe <__bss_end+0x7df> 12f78: 10 92 ff 1f sts 0x1FFF, r1 ; 0x801fff <__bss_end+0x7e0> #endif //defined(XFLASH) && defined(BOOTAPP) softReset(); 12f7c: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 } else if (code_seen_P(PSTR("SN"))) { // PRUSA SN 12f80: 8b ed ldi r24, 0xDB ; 219 12f82: 97 e8 ldi r25, 0x87 ; 135 12f84: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12f88: 88 23 and r24, r24 12f8a: a9 f0 breq .+42 ; 0x12fb6 char SN[20]; eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); 12f8c: 44 e1 ldi r20, 0x14 ; 20 12f8e: 50 e0 ldi r21, 0x00 ; 0 12f90: 65 e1 ldi r22, 0x15 ; 21 12f92: 7d e0 ldi r23, 0x0D ; 13 12f94: ce 01 movw r24, r28 12f96: 01 96 adiw r24, 0x01 ; 1 12f98: 0f 94 00 dc call 0x3b800 ; 0x3b800 if (SN[19]) 12f9c: 8c 89 ldd r24, Y+20 ; 0x14 12f9e: 88 23 and r24, r24 12fa0: 29 f0 breq .+10 ; 0x12fac puts_P(PSTR("SN invalid")); 12fa2: 80 ed ldi r24, 0xD0 ; 208 12fa4: 97 e8 ldi r25, 0x87 ; 135 12fa6: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 12faa: 02 ce rjmp .-1020 ; 0x12bb0 else puts(SN); 12fac: ce 01 movw r24, r28 12fae: 01 96 adiw r24, 0x01 ; 1 12fb0: 0f 94 9f e2 call 0x3c53e ; 0x3c53e 12fb4: fd cd rjmp .-1030 ; 0x12bb0 } else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir 12fb6: 8c ec ldi r24, 0xCC ; 204 12fb8: 97 e8 ldi r25, 0x87 ; 135 12fba: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12fbe: 88 23 and r24, r24 12fc0: 29 f0 breq .+10 ; 0x12fcc SERIAL_PROTOCOLLNPGM(FW_VERSION_FULL); 12fc2: 80 ec ldi r24, 0xC0 ; 192 12fc4: 97 e8 ldi r25, 0x87 ; 135 else { SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); 12fc6: 0e 94 13 79 call 0xf226 ; 0xf226 12fca: f2 cd rjmp .-1052 ; 0x12bb0 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 12fcc: 8c eb ldi r24, 0xBC ; 188 12fce: 97 e8 ldi r25, 0x87 ; 135 12fd0: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12fd4: 88 23 and r24, r24 12fd6: 19 f0 breq .+6 ; 0x12fde SERIAL_PROTOCOLLNPGM(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE ); 12fd8: 8d e9 ldi r24, 0x9D ; 157 12fda: 97 e8 ldi r25, 0x87 ; 135 12fdc: f4 cf rjmp .-24 ; 0x12fc6 } else if(code_seen_P(PSTR("Lang"))) { // PRUSA Lang 12fde: 88 e9 ldi r24, 0x98 ; 152 12fe0: 97 e8 ldi r25, 0x87 ; 135 12fe2: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12fe6: 88 23 and r24, r24 12fe8: 19 f0 breq .+6 ; 0x12ff0 lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { case 0: // Level 0: Language reset lang_reset(); 12fea: 0e 94 c4 70 call 0xe188 ; 0xe188 12fee: e0 cd rjmp .-1088 ; 0x12bb0 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 12ff0: 85 e9 ldi r24, 0x95 ; 149 12ff2: 97 e8 ldi r25, 0x87 ; 135 12ff4: 0e 94 be 67 call 0xcf7c ; 0xcf7c 12ff8: 88 23 and r24, r24 12ffa: 79 f0 breq .+30 ; 0x1301a eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 12ffc: 81 ea ldi r24, 0xA1 ; 161 12ffe: 9d e0 ldi r25, 0x0D ; 13 13000: 0f 94 10 dc call 0x3b820 ; 0x3b820 13004: 4b e0 ldi r20, 0x0B ; 11 13006: 84 9f mul r24, r20 13008: c0 01 movw r24, r0 1300a: 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); 1300c: 70 e0 ldi r23, 0x00 ; 0 1300e: 60 e0 ldi r22, 0x00 ; 0 13010: 80 5b subi r24, 0xB0 ; 176 13012: 92 4f sbci r25, 0xF2 ; 242 13014: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 13018: cb cd rjmp .-1130 ; 0x12bb0 } else if(code_seen_P(PSTR("FR"))) { // PRUSA FR 1301a: 82 e9 ldi r24, 0x92 ; 146 1301c: 97 e8 ldi r25, 0x87 ; 135 1301e: 0e 94 be 67 call 0xcf7c ; 0xcf7c 13022: 88 23 and r24, r24 13024: 51 f0 breq .+20 ; 0x1303a // 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(); 13026: 0e 94 ab 6e call 0xdd56 ; 0xdd56 Sound_MakeCustom(100,0,false); 1302a: 40 e0 ldi r20, 0x00 ; 0 1302c: 70 e0 ldi r23, 0x00 ; 0 1302e: 60 e0 ldi r22, 0x00 ; 0 13030: 84 e6 ldi r24, 0x64 ; 100 13032: 90 e0 ldi r25, 0x00 ; 0 13034: 0f 94 3d 52 call 0x2a47a ; 0x2a47a 13038: d8 cf rjmp .-80 ; 0x12fea 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 1303a: 8e e8 ldi r24, 0x8E ; 142 1303c: 97 e8 ldi r25, 0x87 ; 135 1303e: 0e 94 be 67 call 0xcf7c ; 0xcf7c 13042: 88 23 and r24, r24 13044: e1 f0 breq .+56 ; 0x1307e // Change the MBL status without changing the logical Z position. if(code_seen('V')) { 13046: 86 e5 ldi r24, 0x56 ; 86 13048: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1304c: 88 23 and r24, r24 1304e: 09 f4 brne .+2 ; 0x13052 13050: af cd rjmp .-1186 ; 0x12bb0 bool value = code_value_short(); 13052: 0e 94 0d 5b call 0xb61a ; 0xb61a 13056: 11 e0 ldi r17, 0x01 ; 1 13058: 89 2b or r24, r25 1305a: 09 f4 brne .+2 ; 0x1305e 1305c: 10 e0 ldi r17, 0x00 ; 0 st_synchronize(); 1305e: 0f 94 a9 43 call 0x28752 ; 0x28752 if(value != mbl.active) { 13062: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 13066: 90 e0 ldi r25, 0x00 ; 0 13068: 18 17 cp r17, r24 1306a: 19 06 cpc r1, r25 1306c: 09 f4 brne .+2 ; 0x13070 1306e: a0 cd rjmp .-1216 ; 0x12bb0 mbl.active = value; 13070: 10 93 c1 13 sts 0x13C1, r17 ; 0x8013c1 // Use plan_set_z_position to reset the physical values plan_set_z_position(current_position[Z_AXIS]); 13074: 89 e9 ldi r24, 0x99 ; 153 13076: 96 e0 ldi r25, 0x06 ; 6 13078: 0f 94 e8 64 call 0x2c9d0 ; 0x2c9d0 1307c: 99 cd rjmp .-1230 ; 0x12bb0 } } } else if (code_seen_P(PSTR("nozzle"))) { // PRUSA nozzle 1307e: 87 e8 ldi r24, 0x87 ; 135 13080: 97 e8 ldi r25, 0x87 ; 135 13082: 0e 94 be 67 call 0xcf7c ; 0xcf7c 13086: 88 23 and r24, r24 13088: 09 f4 brne .+2 ; 0x1308c 1308a: 92 cd rjmp .-1244 ; 0x12bb0 uint16_t nDiameter; if(code_seen('D')) { 1308c: 84 e4 ldi r24, 0x44 ; 68 1308e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 13092: 88 23 and r24, r24 13094: a1 f0 breq .+40 ; 0x130be nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 13096: 0e 94 35 60 call 0xc06a ; 0xc06a 1309a: 20 e0 ldi r18, 0x00 ; 0 1309c: 30 e0 ldi r19, 0x00 ; 0 1309e: 4a e7 ldi r20, 0x7A ; 122 130a0: 54 e4 ldi r21, 0x44 ; 68 130a2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 130a6: 20 e0 ldi r18, 0x00 ; 0 130a8: 30 e0 ldi r19, 0x00 ; 0 130aa: 40 e0 ldi r20, 0x00 ; 0 130ac: 5f e3 ldi r21, 0x3F ; 63 130ae: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 130b2: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> nozzle_diameter_check(nDiameter); 130b6: cb 01 movw r24, r22 130b8: 0e 94 e9 f5 call 0x1ebd2 ; 0x1ebd2 130bc: 79 cd rjmp .-1294 ; 0x12bb0 } else if(code_seen_P(PSTR("set")) && farm_mode) { 130be: 83 e8 ldi r24, 0x83 ; 131 130c0: 97 e8 ldi r25, 0x87 ; 135 130c2: 0e 94 be 67 call 0xcf7c ; 0xcf7c strchr_pointer++; // skip 1st char (~ 's') strchr_pointer++; // skip 2nd char (~ 'e') nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 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); 130c6: 85 ea ldi r24, 0xA5 ; 165 130c8: 9d e0 ldi r25, 0x0D ; 13 130ca: 0f 94 1e dc call 0x3b83c ; 0x3b83c 130ce: bc 01 movw r22, r24 130d0: 90 e0 ldi r25, 0x00 ; 0 130d2: 80 e0 ldi r24, 0x00 ; 0 130d4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 130d8: 20 e0 ldi r18, 0x00 ; 0 130da: 30 e0 ldi r19, 0x00 ; 0 130dc: 4a e7 ldi r20, 0x7A ; 122 130de: 54 e4 ldi r21, 0x44 ; 68 130e0: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 130e4: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 130e8: 63 cd rjmp .-1338 ; 0x12bb0 } } else if(*CMDBUFFER_CURRENT_STRING == 'G') 130ea: d8 01 movw r26, r16 130ec: 8c 91 ld r24, X 130ee: 87 34 cpi r24, 0x47 ; 71 130f0: 11 f0 breq .+4 ; 0x130f6 130f2: 0c 94 10 a4 jmp 0x14820 ; 0x14820 { strchr_pointer = CMDBUFFER_CURRENT_STRING; 130f6: 10 93 94 03 sts 0x0394, r17 ; 0x800394 130fa: 00 93 93 03 sts 0x0393, r16 ; 0x800393 gcode_in_progress = code_value_short(); 130fe: 0e 94 0d 5b call 0xb61a ; 0xb61a 13102: 90 93 92 03 sts 0x0392, r25 ; 0x800392 13106: 80 93 91 03 sts 0x0391, r24 ; 0x800391 // printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress); switch (gcode_in_progress) 1310a: 8e 31 cpi r24, 0x1E ; 30 1310c: 91 05 cpc r25, r1 1310e: 09 f4 brne .+2 ; 0x13112 13110: da c6 rjmp .+3508 ; 0x13ec6 13112: 0c f0 brlt .+2 ; 0x13116 13114: 45 c1 rjmp .+650 ; 0x133a0 13116: 84 30 cpi r24, 0x04 ; 4 13118: 91 05 cpc r25, r1 1311a: 09 f4 brne .+2 ; 0x1311e 1311c: 7e c6 rjmp .+3324 ; 0x13e1a 1311e: 0c f0 brlt .+2 ; 0x13122 13120: c5 c0 rjmp .+394 ; 0x132ac 13122: 97 fd sbrc r25, 7 13124: cb c0 rjmp .+406 ; 0x132bc 13126: 02 97 sbiw r24, 0x02 ; 2 13128: 0c f0 brlt .+2 ; 0x1312c 1312a: fc c1 rjmp .+1016 ; 0x13524 */ case 0: // G0 -> G1 case 1: // G1 { uint16_t start_segment_idx = restore_interrupted_gcode(); 1312c: 0e 94 0b 5a call 0xb416 ; 0xb416 13130: 8c 01 movw r16, r24 get_coordinates(); // For X Y Z E F 13132: 0e 94 5c 61 call 0xc2b8 ; 0xc2b8 if (total_filament_used > ((current_position[E_AXIS] - destination[E_AXIS]) * 100)) { //protection against total_filament_used overflow 13136: 60 91 64 06 lds r22, 0x0664 ; 0x800664 1313a: 70 91 65 06 lds r23, 0x0665 ; 0x800665 1313e: 80 91 66 06 lds r24, 0x0666 ; 0x800666 13142: 90 91 67 06 lds r25, 0x0667 ; 0x800667 13146: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 1314a: 6b 01 movw r12, r22 1314c: 7c 01 movw r14, r24 1314e: 40 90 9d 06 lds r4, 0x069D ; 0x80069d 13152: 50 90 9e 06 lds r5, 0x069E ; 0x80069e 13156: 60 90 9f 06 lds r6, 0x069F ; 0x80069f 1315a: 70 90 a0 06 lds r7, 0x06A0 ; 0x8006a0 1315e: 80 90 7f 06 lds r8, 0x067F ; 0x80067f 13162: 90 90 80 06 lds r9, 0x0680 ; 0x800680 13166: a0 90 81 06 lds r10, 0x0681 ; 0x800681 1316a: b0 90 82 06 lds r11, 0x0682 ; 0x800682 1316e: a5 01 movw r20, r10 13170: 94 01 movw r18, r8 13172: c3 01 movw r24, r6 13174: b2 01 movw r22, r4 13176: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1317a: 20 e0 ldi r18, 0x00 ; 0 1317c: 30 e0 ldi r19, 0x00 ; 0 1317e: 48 ec ldi r20, 0xC8 ; 200 13180: 52 e4 ldi r21, 0x42 ; 66 13182: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13186: 9b 01 movw r18, r22 13188: ac 01 movw r20, r24 1318a: c7 01 movw r24, r14 1318c: b6 01 movw r22, r12 1318e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 13192: 18 16 cp r1, r24 13194: d4 f4 brge .+52 ; 0x131ca total_filament_used = total_filament_used + ((destination[E_AXIS] - current_position[E_AXIS]) * 100); 13196: a3 01 movw r20, r6 13198: 92 01 movw r18, r4 1319a: c5 01 movw r24, r10 1319c: b4 01 movw r22, r8 1319e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 131a2: 20 e0 ldi r18, 0x00 ; 0 131a4: 30 e0 ldi r19, 0x00 ; 0 131a6: 48 ec ldi r20, 0xC8 ; 200 131a8: 52 e4 ldi r21, 0x42 ; 66 131aa: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 131ae: a7 01 movw r20, r14 131b0: 96 01 movw r18, r12 131b2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 131b6: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 131ba: 60 93 64 06 sts 0x0664, r22 ; 0x800664 131be: 70 93 65 06 sts 0x0665, r23 ; 0x800665 131c2: 80 93 66 06 sts 0x0666, r24 ; 0x800666 131c6: 90 93 67 06 sts 0x0667, r25 ; 0x800667 } #ifdef FWRETRACT if(cs.autoretract_enabled) { 131ca: 80 91 3f 0e lds r24, 0x0E3F ; 0x800e3f 131ce: 88 23 and r24, r24 131d0: 09 f4 brne .+2 ; 0x131d4 131d2: a4 c1 rjmp .+840 ; 0x1351c if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { 131d4: 88 e5 ldi r24, 0x58 ; 88 131d6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 131da: 81 11 cpse r24, r1 131dc: 9f c1 rjmp .+830 ; 0x1351c 131de: 89 e5 ldi r24, 0x59 ; 89 131e0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 131e4: 81 11 cpse r24, r1 131e6: 9a c1 rjmp .+820 ; 0x1351c 131e8: 8a e5 ldi r24, 0x5A ; 90 131ea: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 131ee: 81 11 cpse r24, r1 131f0: 95 c1 rjmp .+810 ; 0x1351c 131f2: 85 e4 ldi r24, 0x45 ; 69 131f4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 131f8: 88 23 and r24, r24 131fa: 09 f4 brne .+2 ; 0x131fe 131fc: 8f c1 rjmp .+798 ; 0x1351c float echange=destination[E_AXIS]-current_position[E_AXIS]; 131fe: 20 91 9d 06 lds r18, 0x069D ; 0x80069d 13202: 30 91 9e 06 lds r19, 0x069E ; 0x80069e 13206: 40 91 9f 06 lds r20, 0x069F ; 0x80069f 1320a: 50 91 a0 06 lds r21, 0x06A0 ; 0x8006a0 1320e: 60 91 7f 06 lds r22, 0x067F ; 0x80067f 13212: 70 91 80 06 lds r23, 0x0680 ; 0x800680 13216: 80 91 81 06 lds r24, 0x0681 ; 0x800681 1321a: 90 91 82 06 lds r25, 0x0682 ; 0x800682 1321e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13222: 6b 01 movw r12, r22 13224: 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 13226: 2d ec ldi r18, 0xCD ; 205 13228: 3c ec ldi r19, 0xCC ; 204 1322a: 4c ec ldi r20, 0xCC ; 204 1322c: 5d eb ldi r21, 0xBD ; 189 1322e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 13232: 87 ff sbrs r24, 7 13234: 65 c1 rjmp .+714 ; 0x13500 13236: 80 91 8d 06 lds r24, 0x068D ; 0x80068d 1323a: 81 11 cpse r24, r1 1323c: 0c 94 24 cd jmp 0x19a48 ; 0x19a48 st_synchronize(); 13240: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations 13244: 80 91 7f 06 lds r24, 0x067F ; 0x80067f 13248: 90 91 80 06 lds r25, 0x0680 ; 0x800680 1324c: a0 91 81 06 lds r26, 0x0681 ; 0x800681 13250: b0 91 82 06 lds r27, 0x0682 ; 0x800682 13254: 80 93 9d 06 sts 0x069D, r24 ; 0x80069d 13258: 90 93 9e 06 sts 0x069E, r25 ; 0x80069e 1325c: a0 93 9f 06 sts 0x069F, r26 ; 0x80069f 13260: b0 93 a0 06 sts 0x06A0, r27 ; 0x8006a0 plan_set_e_position(current_position[E_AXIS]); //AND from the planner 13264: 8d e9 ldi r24, 0x9D ; 157 13266: 96 e0 ldi r25, 0x06 ; 6 13268: 0f 94 b5 64 call 0x2c96a ; 0x2c96a retract(!retracted[active_extruder]); 1326c: 90 91 8d 06 lds r25, 0x068D ; 0x80068d 13270: 81 e0 ldi r24, 0x01 ; 1 13272: 89 27 eor r24, r25 13274: 0f 94 1c 8a call 0x31438 ; 0x31438 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); SERIAL_ECHOLNPGM("\"(2)"); } KEEPALIVE_STATE(NOT_BUSY); ClearToSend(); } 13278: c1 57 subi r28, 0x71 ; 113 1327a: df 4f sbci r29, 0xFF ; 255 1327c: 0f b6 in r0, 0x3f ; 63 1327e: f8 94 cli 13280: de bf out 0x3e, r29 ; 62 13282: 0f be out 0x3f, r0 ; 63 13284: cd bf out 0x3d, r28 ; 61 13286: df 91 pop r29 13288: cf 91 pop r28 1328a: 1f 91 pop r17 1328c: 0f 91 pop r16 1328e: ff 90 pop r15 13290: ef 90 pop r14 13292: df 90 pop r13 13294: cf 90 pop r12 13296: bf 90 pop r11 13298: af 90 pop r10 1329a: 9f 90 pop r9 1329c: 8f 90 pop r8 1329e: 7f 90 pop r7 132a0: 6f 90 pop r6 132a2: 5f 90 pop r5 132a4: 4f 90 pop r4 132a6: 3f 90 pop r3 132a8: 2f 90 pop r2 132aa: 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) 132ac: 8b 30 cpi r24, 0x0B ; 11 132ae: 91 05 cpc r25, r1 132b0: 09 f4 brne .+2 ; 0x132b4 132b2: 00 c6 rjmp .+3072 ; 0x13eb4 132b4: dc f4 brge .+54 ; 0x132ec 132b6: 0a 97 sbiw r24, 0x0a ; 10 132b8: 09 f4 brne .+2 ; 0x132bc 132ba: f8 c5 rjmp .+3056 ; 0x13eac case 99: farm_gcode_g99(); break; #endif //PRUSA_FARM default: printf_P(MSG_UNKNOWN_CODE, 'G', cmdbuffer + bufindr + CMDHDRSIZE); 132bc: 80 91 91 12 lds r24, 0x1291 ; 0x801291 132c0: 90 91 92 12 lds r25, 0x1292 ; 0x801292 132c4: 89 55 subi r24, 0x59 ; 89 132c6: 9f 4e sbci r25, 0xEF ; 239 132c8: 9f 93 push r25 132ca: 8f 93 push r24 132cc: 1f 92 push r1 132ce: 87 e4 ldi r24, 0x47 ; 71 132d0: 8f 93 push r24 132d2: 80 ee ldi r24, 0xE0 ; 224 132d4: 98 e6 ldi r25, 0x68 ; 104 132d6: 9f 93 push r25 132d8: 8f 93 push r24 132da: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 132de: 0f 90 pop r0 132e0: 0f 90 pop r0 132e2: 0f 90 pop r0 132e4: 0f 90 pop r0 132e6: 0f 90 pop r0 132e8: 0f 90 pop r0 132ea: a5 c0 rjmp .+330 ; 0x13436 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) 132ec: 85 31 cpi r24, 0x15 ; 21 132ee: 91 05 cpc r25, r1 132f0: 09 f4 brne .+2 ; 0x132f4 132f2: a1 c0 rjmp .+322 ; 0x13436 132f4: 4c 97 sbiw r24, 0x1c ; 28 132f6: 11 f7 brne .-60 ; 0x132bc { 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]); 132f8: 88 e5 ldi r24, 0x58 ; 88 132fa: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 132fe: 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; 13300: 41 2c mov r4, r1 13302: 51 2c mov r5, r1 13304: 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(); 13306: 88 23 and r24, r24 13308: 21 f0 breq .+8 ; 0x13312 1330a: 0e 94 1a 5b call 0xb634 ; 0xb634 1330e: 2b 01 movw r4, r22 13310: 3c 01 movw r6, r24 bool home_y = code_seen(axis_codes[Y_AXIS]); 13312: 89 e5 ldi r24, 0x59 ; 89 13314: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 13318: 28 2e mov r2, r24 if (home_y) home_y_value = code_value_long(); 1331a: 88 23 and r24, r24 1331c: 09 f4 brne .+2 ; 0x13320 1331e: cc c5 rjmp .+2968 ; 0x13eb8 13320: 0e 94 1a 5b call 0xb634 ; 0xb634 13324: 6e 96 adiw r28, 0x1e ; 30 13326: 6c af std Y+60, r22 ; 0x3c 13328: 7d af std Y+61, r23 ; 0x3d 1332a: 8e af std Y+62, r24 ; 0x3e 1332c: 9f af std Y+63, r25 ; 0x3f 1332e: 6e 97 sbiw r28, 0x1e ; 30 bool home_z = code_seen(axis_codes[Z_AXIS]); 13330: 8a e5 ldi r24, 0x5A ; 90 13332: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 13336: d8 2e mov r13, r24 */ case 28: { long home_x_value = 0; long home_y_value = 0; long home_z_value = 0; 13338: 81 2c mov r8, r1 1333a: 91 2c mov r9, r1 1333c: 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(); 1333e: 88 23 and r24, r24 13340: 21 f0 breq .+8 ; 0x1334a 13342: 0e 94 1a 5b call 0xb634 ; 0xb634 13346: 4b 01 movw r8, r22 13348: 5c 01 movw r10, r24 bool without_mbl = code_seen('W'); 1334a: 87 e5 ldi r24, 0x57 ; 87 1334c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 13350: 67 96 adiw r28, 0x17 ; 23 13352: 8f af std Y+63, r24 ; 0x3f 13354: 67 97 sbiw r28, 0x17 ; 23 // calibrate? #ifdef TMC2130 bool calib = code_seen('C'); 13356: 83 e4 ldi r24, 0x43 ; 67 13358: 0e 94 6e 5b call 0xb6dc ; 0xb6dc gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); 1335c: 67 96 adiw r28, 0x17 ; 23 1335e: ff ad ldd r31, Y+63 ; 0x3f 13360: 67 97 sbiw r28, 0x17 ; 23 13362: ff 93 push r31 13364: 8f 93 push r24 13366: cd 2c mov r12, r13 13368: 6e 96 adiw r28, 0x1e ; 30 1336a: ec ac ldd r14, Y+60 ; 0x3c 1336c: fd ac ldd r15, Y+61 ; 0x3d 1336e: 0e ad ldd r16, Y+62 ; 0x3e 13370: 1f ad ldd r17, Y+63 ; 0x3f 13372: 6e 97 sbiw r28, 0x1e ; 30 13374: 22 2d mov r18, r2 13376: b3 01 movw r22, r6 13378: a2 01 movw r20, r4 1337a: 83 2d mov r24, r3 1337c: 0e 94 bf 7c call 0xf97e ; 0xf97e #else gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, without_mbl); #endif //TMC2130 if ((home_x || home_y || without_mbl || home_z) == false) { 13380: 0f 90 pop r0 13382: 0f 90 pop r0 13384: 31 10 cpse r3, r1 13386: 57 c0 rjmp .+174 ; 0x13436 13388: 21 10 cpse r2, r1 1338a: 55 c0 rjmp .+170 ; 0x13436 1338c: 67 96 adiw r28, 0x17 ; 23 1338e: 2f ad ldd r18, Y+63 ; 0x3f 13390: 67 97 sbiw r28, 0x17 ; 23 13392: 21 11 cpse r18, r1 13394: 50 c0 rjmp .+160 ; 0x13436 13396: d1 10 cpse r13, r1 13398: 4e c0 rjmp .+156 ; 0x13436 - `W` - area width (on X axis) - `H` - area height (on Y axis) */ case 80: { gcode_G80(); 1339a: 0e 94 94 8d call 0x11b28 ; 0x11b28 1339e: 4b c0 rjmp .+150 ; 0x13436 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) 133a0: 86 35 cpi r24, 0x56 ; 86 133a2: 91 05 cpc r25, r1 133a4: 11 f4 brne .+4 ; 0x133aa 133a6: 0c 94 bf a3 jmp 0x1477e ; 0x1477e 133aa: b4 f5 brge .+108 ; 0x13418 133ac: 8c 34 cpi r24, 0x4C ; 76 133ae: 91 05 cpc r25, r1 133b0: 09 f4 brne .+2 ; 0x133b4 133b2: df c5 rjmp .+3006 ; 0x13f72 133b4: 3c f5 brge .+78 ; 0x13404 133b6: 08 e2 ldi r16, 0x28 ; 40 133b8: 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)); 133ba: f0 e9 ldi r31, 0x90 ; 144 133bc: ef 2e mov r14, r31 133be: f9 e6 ldi r31, 0x69 ; 105 133c0: ff 2e mov r15, r31 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) 133c2: 8b 34 cpi r24, 0x4B ; 75 133c4: 91 05 cpc r25, r1 133c6: 09 f0 breq .+2 ; 0x133ca 133c8: 79 cf rjmp .-270 ; 0x132bc 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)); 133ca: 60 2f mov r22, r16 133cc: 70 e0 ldi r23, 0x00 ; 0 133ce: 90 e0 ldi r25, 0x00 ; 0 133d0: 80 e0 ldi r24, 0x00 ; 0 133d2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 133d6: 0e 94 22 5c call 0xb844 ; 0xb844 133da: 9f 93 push r25 133dc: 8f 93 push r24 133de: 7f 93 push r23 133e0: 6f 93 push r22 133e2: 1f 93 push r17 133e4: 0f 93 push r16 133e6: ff 92 push r15 133e8: ef 92 push r14 133ea: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 133ee: 0f 5f subi r16, 0xFF ; 255 133f0: 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++) 133f2: 0f b6 in r0, 0x3f ; 63 133f4: f8 94 cli 133f6: de bf out 0x3e, r29 ; 62 133f8: 0f be out 0x3f, r0 ; 63 133fa: cd bf out 0x3d, r28 ; 61 133fc: 0f 36 cpi r16, 0x6F ; 111 133fe: 11 05 cpc r17, r1 13400: 21 f7 brne .-56 ; 0x133ca 13402: 19 c0 rjmp .+50 ; 0x13436 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) 13404: 80 35 cpi r24, 0x50 ; 80 13406: 91 05 cpc r25, r1 13408: 41 f2 breq .-112 ; 0x1339a 1340a: 81 35 cpi r24, 0x51 ; 81 1340c: 91 05 cpc r25, r1 1340e: 09 f0 breq .+2 ; 0x13412 13410: 55 cf rjmp .-342 ; 0x132bc /*! ### 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(); 13412: 0e 94 f3 7e call 0xfde6 ; 0xfde6 13416: 0f c0 rjmp .+30 ; 0x13436 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) 13418: 8a 35 cpi r24, 0x5A ; 90 1341a: 91 05 cpc r25, r1 1341c: 11 f4 brne .+4 ; 0x13422 1341e: 0c 94 c9 a3 jmp 0x14792 ; 0x14792 13422: 74 f4 brge .+28 ; 0x13440 13424: 87 35 cpi r24, 0x57 ; 87 13426: 91 05 cpc r25, r1 13428: 11 f4 brne .+4 ; 0x1342e 1342a: 0c 94 c4 a3 jmp 0x14788 ; 0x14788 1342e: 88 35 cpi r24, 0x58 ; 88 13430: 91 05 cpc r25, r1 13432: 09 f0 breq .+2 ; 0x13436 13434: 43 cf rjmp .-378 ; 0x132bc #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; 13436: 10 92 92 03 sts 0x0392, r1 ; 0x800392 1343a: 10 92 91 03 sts 0x0391, r1 ; 0x800391 1343e: b8 cb rjmp .-2192 ; 0x12bb0 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) 13440: 8b 35 cpi r24, 0x5B ; 91 13442: 91 05 cpc r25, r1 13444: 11 f4 brne .+4 ; 0x1344a 13446: 0c 94 d0 a3 jmp 0x147a0 ; 0x147a0 1344a: 8c 35 cpi r24, 0x5C ; 92 1344c: 91 05 cpc r25, r1 1344e: 09 f0 breq .+2 ; 0x13452 13450: 35 cf rjmp .-406 ; 0x132bc 13452: bd ed ldi r27, 0xDD ; 221 13454: cb 2e mov r12, r27 13456: b2 e0 ldi r27, 0x02 ; 2 13458: db 2e mov r13, r27 1345a: 8e 01 movw r16, r28 1345c: 0f 5b subi r16, 0xBF ; 191 1345e: 1f 4f sbci r17, 0xFF ; 255 13460: 9e 01 movw r18, r28 13462: 2f 5f subi r18, 0xFF ; 255 13464: 3f 4f sbci r19, 0xFF ; 255 13466: 79 01 movw r14, r18 13468: 81 ee ldi r24, 0xE1 ; 225 1346a: 88 2e mov r8, r24 1346c: 82 e0 ldi r24, 0x02 ; 2 1346e: 98 2e mov r9, r24 13470: 58 01 movw r10, r16 13472: 39 01 movw r6, r18 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]); 13474: d6 01 movw r26, r12 13476: 8d 91 ld r24, X+ 13478: 6d 01 movw r12, r26 1347a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1347e: f5 01 movw r30, r10 13480: 81 93 st Z+, r24 13482: 5f 01 movw r10, r30 if(codes[i]) 13484: 88 23 and r24, r24 13486: 41 f0 breq .+16 ; 0x13498 values[i] = code_value(); 13488: 0e 94 35 60 call 0xc06a ; 0xc06a 1348c: d7 01 movw r26, r14 1348e: 6d 93 st X+, r22 13490: 7d 93 st X+, r23 13492: 8d 93 st X+, r24 13494: 9c 93 st X, r25 13496: 13 97 sbiw r26, 0x03 ; 3 13498: b4 e0 ldi r27, 0x04 ; 4 1349a: eb 0e add r14, r27 1349c: f1 1c adc r15, r1 { bool codes[NUM_AXIS]; float values[NUM_AXIS]; // Check which axes need to be set for(uint8_t i = 0; i < NUM_AXIS; ++i) 1349e: 8c 14 cp r8, r12 134a0: 9d 04 cpc r9, r13 134a2: 41 f7 brne .-48 ; 0x13474 codes[i] = code_seen(axis_codes[i]); if(codes[i]) values[i] = code_value(); } if((codes[E_AXIS] && values[E_AXIS] == 0) && 134a4: f8 01 movw r30, r16 134a6: d3 80 ldd r13, Z+3 ; 0x03 134a8: dd 20 and r13, r13 134aa: 11 f4 brne .+4 ; 0x134b0 134ac: 0c 94 d4 a3 jmp 0x147a8 ; 0x147a8 134b0: 20 e0 ldi r18, 0x00 ; 0 134b2: 30 e0 ldi r19, 0x00 ; 0 134b4: a9 01 movw r20, r18 134b6: 6d 85 ldd r22, Y+13 ; 0x0d 134b8: 7e 85 ldd r23, Y+14 ; 0x0e 134ba: 8f 85 ldd r24, Y+15 ; 0x0f 134bc: 98 89 ldd r25, Y+16 ; 0x10 134be: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 134c2: 81 11 cpse r24, r1 134c4: 0c 94 d4 a3 jmp 0x147a8 ; 0x147a8 134c8: d8 01 movw r26, r16 134ca: 8c 91 ld r24, X 134cc: 81 11 cpse r24, r1 134ce: 0c 94 d4 a3 jmp 0x147a8 ; 0x147a8 (!codes[X_AXIS] && !codes[Y_AXIS] && !codes[Z_AXIS])) 134d2: 11 96 adiw r26, 0x01 ; 1 134d4: 8c 91 ld r24, X 134d6: 11 97 sbiw r26, 0x01 ; 1 134d8: 81 11 cpse r24, r1 134da: 0c 94 d4 a3 jmp 0x147a8 ; 0x147a8 134de: 12 96 adiw r26, 0x02 ; 2 134e0: 8c 91 ld r24, X 134e2: 81 11 cpse r24, r1 134e4: 0c 94 d4 a3 jmp 0x147a8 ; 0x147a8 { // 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; 134e8: 10 92 9d 06 sts 0x069D, r1 ; 0x80069d 134ec: 10 92 9e 06 sts 0x069E, r1 ; 0x80069e 134f0: 10 92 9f 06 sts 0x069F, r1 ; 0x80069f 134f4: 10 92 a0 06 sts 0x06A0, r1 ; 0x8006a0 st_set_e_position(position[E_AXIS]); } void plan_reset_next_e() { plan_reset_next_e_queue = true; 134f8: 81 e0 ldi r24, 0x01 ; 1 134fa: 80 93 b7 04 sts 0x04B7, r24 ; 0x8004b7 <_ZL23plan_reset_next_e_queue.lto_priv.488> 134fe: 9b cf rjmp .-202 ; 0x13436 #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 13500: 2d ec ldi r18, 0xCD ; 205 13502: 3c ec ldi r19, 0xCC ; 204 13504: 4c ec ldi r20, 0xCC ; 204 13506: 5d e3 ldi r21, 0x3D ; 61 13508: c7 01 movw r24, r14 1350a: b6 01 movw r22, r12 1350c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 13510: 18 16 cp r1, r24 13512: 24 f4 brge .+8 ; 0x1351c 13514: 80 91 8d 06 lds r24, 0x068D ; 0x80068d 13518: 81 11 cpse r24, r1 1351a: 92 ce rjmp .-732 ; 0x13240 } } } #endif //FWRETRACT prepare_move(start_segment_idx); 1351c: c8 01 movw r24, r16 1351e: 0e 94 a0 6b call 0xd740 ; 0xd740 13522: 89 cf rjmp .-238 ; 0x13436 */ case 2: case 3: { uint16_t start_segment_idx = restore_interrupted_gcode(); 13524: 0e 94 0b 5a call 0xb416 ; 0xb416 13528: e0 96 adiw r28, 0x30 ; 48 1352a: 9f af std Y+63, r25 ; 0x3f 1352c: 8e af std Y+62, r24 ; 0x3e 1352e: e0 97 sbiw r28, 0x30 ; 48 #ifdef SF_ARC_FIX bool relative_mode_backup = relative_mode; relative_mode = true; #endif get_coordinates(); // For X Y Z E F 13530: 0e 94 5c 61 call 0xc2b8 ; 0xc2b8 #ifdef SF_ARC_FIX relative_mode=relative_mode_backup; #endif offset[0] = code_seen('I') ? code_value() : 0.f; 13534: 89 e4 ldi r24, 0x49 ; 73 13536: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1353a: 88 23 and r24, r24 1353c: 09 f4 brne .+2 ; 0x13540 1353e: 00 c4 rjmp .+2048 ; 0x13d40 13540: 0e 94 35 60 call 0xc06a ; 0xc06a 13544: 60 93 89 03 sts 0x0389, r22 ; 0x800389 13548: 70 93 8a 03 sts 0x038A, r23 ; 0x80038a 1354c: 80 93 8b 03 sts 0x038B, r24 ; 0x80038b 13550: 90 93 8c 03 sts 0x038C, r25 ; 0x80038c offset[1] = code_seen('J') ? code_value() : 0.f; 13554: 8a e4 ldi r24, 0x4A ; 74 13556: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1355a: c1 2c mov r12, r1 1355c: d1 2c mov r13, r1 1355e: 76 01 movw r14, r12 13560: 88 23 and r24, r24 13562: 21 f0 breq .+8 ; 0x1356c 13564: 0e 94 35 60 call 0xc06a ; 0xc06a 13568: 6b 01 movw r12, r22 1356a: 7c 01 movw r14, r24 1356c: c0 92 8d 03 sts 0x038D, r12 ; 0x80038d 13570: d0 92 8e 03 sts 0x038E, r13 ; 0x80038e 13574: e0 92 8f 03 sts 0x038F, r14 ; 0x80038f 13578: f0 92 90 03 sts 0x0390, r15 ; 0x800390 prepare_arc_move((gcode_in_progress == 2), start_segment_idx); 1357c: e0 91 91 03 lds r30, 0x0391 ; 0x800391 13580: f0 91 92 03 lds r31, 0x0392 ; 0x800392 13584: c2 57 subi r28, 0x72 ; 114 13586: df 4f sbci r29, 0xFF ; 255 13588: f9 83 std Y+1, r31 ; 0x01 1358a: e8 83 st Y, r30 1358c: ce 58 subi r28, 0x8E ; 142 1358e: d0 40 sbci r29, 0x00 ; 0 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 13590: 80 90 89 03 lds r8, 0x0389 ; 0x800389 13594: 90 90 8a 03 lds r9, 0x038A ; 0x80038a 13598: a0 90 8b 03 lds r10, 0x038B ; 0x80038b 1359c: b0 90 8c 03 lds r11, 0x038C ; 0x80038c 135a0: a7 01 movw r20, r14 135a2: 96 01 movw r18, r12 135a4: c5 01 movw r24, r10 135a6: b4 01 movw r22, r8 135a8: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 135ac: ae 96 adiw r28, 0x2e ; 46 135ae: 6c af std Y+60, r22 ; 0x3c 135b0: 7d af std Y+61, r23 ; 0x3d 135b2: 8e af std Y+62, r24 ; 0x3e 135b4: 9f af std Y+63, r25 ; 0x3f 135b6: ae 97 sbiw r28, 0x2e ; 46 // Trace the arc mc_arc(current_position, destination, offset, (feedrate * feedmultiply) * (1.f / 6000.f), r, isclockwise, start_segment_idx); 135b8: 60 91 39 02 lds r22, 0x0239 ; 0x800239 135bc: 70 91 3a 02 lds r23, 0x023A ; 0x80023a 135c0: 07 2e mov r0, r23 135c2: 00 0c add r0, r0 135c4: 88 0b sbc r24, r24 135c6: 99 0b sbc r25, r25 135c8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 135cc: 20 91 b8 02 lds r18, 0x02B8 ; 0x8002b8 135d0: 30 91 b9 02 lds r19, 0x02B9 ; 0x8002b9 135d4: 40 91 ba 02 lds r20, 0x02BA ; 0x8002ba 135d8: 50 91 bb 02 lds r21, 0x02BB ; 0x8002bb 135dc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 135e0: 2e e3 ldi r18, 0x3E ; 62 135e2: 33 ec ldi r19, 0xC3 ; 195 135e4: 4e e2 ldi r20, 0x2E ; 46 135e6: 59 e3 ldi r21, 0x39 ; 57 135e8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 135ec: aa 96 adiw r28, 0x2a ; 42 135ee: 6c af std Y+60, r22 ; 0x3c 135f0: 7d af std Y+61, r23 ; 0x3d 135f2: 8e af std Y+62, r24 ; 0x3e 135f4: 9f af std Y+63, r25 ; 0x3f 135f6: aa 97 sbiw r28, 0x2a ; 42 // 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)); 135f8: 80 e1 ldi r24, 0x10 ; 16 135fa: e1 e9 ldi r30, 0x91 ; 145 135fc: f6 e0 ldi r31, 0x06 ; 6 135fe: de 01 movw r26, r28 13600: 11 96 adiw r26, 0x01 ; 1 13602: 01 90 ld r0, Z+ 13604: 0d 92 st X+, r0 13606: 8a 95 dec r24 13608: e1 f7 brne .-8 ; 0x13602 float r_axis_x = -offset[X_AXIS]; // Radius vector from center to current location 1360a: a5 01 movw r20, r10 1360c: 94 01 movw r18, r8 1360e: 50 58 subi r21, 0x80 ; 128 13610: 6a 96 adiw r28, 0x1a ; 26 13612: 2c af std Y+60, r18 ; 0x3c 13614: 3d af std Y+61, r19 ; 0x3d 13616: 4e af std Y+62, r20 ; 0x3e 13618: 5f af std Y+63, r21 ; 0x3f 1361a: 6a 97 sbiw r28, 0x1a ; 26 float r_axis_y = -offset[Y_AXIS]; 1361c: d7 01 movw r26, r14 1361e: c6 01 movw r24, r12 13620: b0 58 subi r27, 0x80 ; 128 13622: 6e 96 adiw r28, 0x1e ; 30 13624: 8c af std Y+60, r24 ; 0x3c 13626: 9d af std Y+61, r25 ; 0x3d 13628: ae af std Y+62, r26 ; 0x3e 1362a: bf af std Y+63, r27 ; 0x3f 1362c: 6e 97 sbiw r28, 0x1e ; 30 float center_axis_x = start_position[X_AXIS] - r_axis_x; 1362e: 29 81 ldd r18, Y+1 ; 0x01 13630: 3a 81 ldd r19, Y+2 ; 0x02 13632: 4b 81 ldd r20, Y+3 ; 0x03 13634: 5c 81 ldd r21, Y+4 ; 0x04 13636: e6 96 adiw r28, 0x36 ; 54 13638: 2c af std Y+60, r18 ; 0x3c 1363a: 3d af std Y+61, r19 ; 0x3d 1363c: 4e af std Y+62, r20 ; 0x3e 1363e: 5f af std Y+63, r21 ; 0x3f 13640: e6 97 sbiw r28, 0x36 ; 54 13642: c5 01 movw r24, r10 13644: b4 01 movw r22, r8 13646: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1364a: ea 96 adiw r28, 0x3a ; 58 1364c: 6c af std Y+60, r22 ; 0x3c 1364e: 7d af std Y+61, r23 ; 0x3d 13650: 8e af std Y+62, r24 ; 0x3e 13652: 9f af std Y+63, r25 ; 0x3f 13654: ea 97 sbiw r28, 0x3a ; 58 float center_axis_y = start_position[Y_AXIS] - r_axis_y; 13656: 8d 81 ldd r24, Y+5 ; 0x05 13658: 9e 81 ldd r25, Y+6 ; 0x06 1365a: af 81 ldd r26, Y+7 ; 0x07 1365c: b8 85 ldd r27, Y+8 ; 0x08 1365e: ee 96 adiw r28, 0x3e ; 62 13660: 8c af std Y+60, r24 ; 0x3c 13662: 9d af std Y+61, r25 ; 0x3d 13664: ae af std Y+62, r26 ; 0x3e 13666: bf af std Y+63, r27 ; 0x3f 13668: ee 97 sbiw r28, 0x3e ; 62 1366a: 9c 01 movw r18, r24 1366c: ad 01 movw r20, r26 1366e: c7 01 movw r24, r14 13670: b6 01 movw r22, r12 13672: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13676: ce 57 subi r28, 0x7E ; 126 13678: df 4f sbci r29, 0xFF ; 255 1367a: 68 83 st Y, r22 1367c: 79 83 std Y+1, r23 ; 0x01 1367e: 8a 83 std Y+2, r24 ; 0x02 13680: 9b 83 std Y+3, r25 ; 0x03 13682: c2 58 subi r28, 0x82 ; 130 13684: d0 40 sbci r29, 0x00 ; 0 float travel_z = target[Z_AXIS] - start_position[Z_AXIS]; 13686: 29 85 ldd r18, Y+9 ; 0x09 13688: 3a 85 ldd r19, Y+10 ; 0x0a 1368a: 4b 85 ldd r20, Y+11 ; 0x0b 1368c: 5c 85 ldd r21, Y+12 ; 0x0c 1368e: 60 91 7b 06 lds r22, 0x067B ; 0x80067b 13692: 70 91 7c 06 lds r23, 0x067C ; 0x80067c 13696: 80 91 7d 06 lds r24, 0x067D ; 0x80067d 1369a: 90 91 7e 06 lds r25, 0x067E ; 0x80067e 1369e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 136a2: c2 58 subi r28, 0x82 ; 130 136a4: df 4f sbci r29, 0xFF ; 255 136a6: 68 83 st Y, r22 136a8: 79 83 std Y+1, r23 ; 0x01 136aa: 8a 83 std Y+2, r24 ; 0x02 136ac: 9b 83 std Y+3, r25 ; 0x03 136ae: ce 57 subi r28, 0x7E ; 126 136b0: d0 40 sbci r29, 0x00 ; 0 float rt_x = target[X_AXIS] - center_axis_x; 136b2: 20 91 73 06 lds r18, 0x0673 ; 0x800673 136b6: 30 91 74 06 lds r19, 0x0674 ; 0x800674 136ba: 40 91 75 06 lds r20, 0x0675 ; 0x800675 136be: 50 91 76 06 lds r21, 0x0676 ; 0x800676 136c2: ca 57 subi r28, 0x7A ; 122 136c4: df 4f sbci r29, 0xFF ; 255 136c6: 28 83 st Y, r18 136c8: 39 83 std Y+1, r19 ; 0x01 136ca: 4a 83 std Y+2, r20 ; 0x02 136cc: 5b 83 std Y+3, r21 ; 0x03 136ce: c6 58 subi r28, 0x86 ; 134 136d0: d0 40 sbci r29, 0x00 ; 0 136d2: ea 96 adiw r28, 0x3a ; 58 136d4: 2c ad ldd r18, Y+60 ; 0x3c 136d6: 3d ad ldd r19, Y+61 ; 0x3d 136d8: 4e ad ldd r20, Y+62 ; 0x3e 136da: 5f ad ldd r21, Y+63 ; 0x3f 136dc: ea 97 sbiw r28, 0x3a ; 58 136de: ca 57 subi r28, 0x7A ; 122 136e0: df 4f sbci r29, 0xFF ; 255 136e2: 68 81 ld r22, Y 136e4: 79 81 ldd r23, Y+1 ; 0x01 136e6: 8a 81 ldd r24, Y+2 ; 0x02 136e8: 9b 81 ldd r25, Y+3 ; 0x03 136ea: c6 58 subi r28, 0x86 ; 134 136ec: d0 40 sbci r29, 0x00 ; 0 136ee: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 136f2: 6b 01 movw r12, r22 136f4: 7c 01 movw r14, r24 float rt_y = target[Y_AXIS] - center_axis_y; 136f6: 80 91 77 06 lds r24, 0x0677 ; 0x800677 136fa: 90 91 78 06 lds r25, 0x0678 ; 0x800678 136fe: a0 91 79 06 lds r26, 0x0679 ; 0x800679 13702: b0 91 7a 06 lds r27, 0x067A ; 0x80067a 13706: c6 57 subi r28, 0x76 ; 118 13708: df 4f sbci r29, 0xFF ; 255 1370a: 88 83 st Y, r24 1370c: 99 83 std Y+1, r25 ; 0x01 1370e: aa 83 std Y+2, r26 ; 0x02 13710: bb 83 std Y+3, r27 ; 0x03 13712: ca 58 subi r28, 0x8A ; 138 13714: d0 40 sbci r29, 0x00 ; 0 13716: ce 57 subi r28, 0x7E ; 126 13718: df 4f sbci r29, 0xFF ; 255 1371a: 28 81 ld r18, Y 1371c: 39 81 ldd r19, Y+1 ; 0x01 1371e: 4a 81 ldd r20, Y+2 ; 0x02 13720: 5b 81 ldd r21, Y+3 ; 0x03 13722: c2 58 subi r28, 0x82 ; 130 13724: d0 40 sbci r29, 0x00 ; 0 13726: bc 01 movw r22, r24 13728: cd 01 movw r24, r26 1372a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1372e: 4b 01 movw r8, r22 13730: 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; 13732: 30 90 81 0e lds r3, 0x0E81 ; 0x800e81 13736: 20 90 82 0e lds r2, 0x0E82 ; 0x800e82 1373a: 90 91 83 0e lds r25, 0x0E83 ; 0x800e83 1373e: 6f 96 adiw r28, 0x1f ; 31 13740: 9f af std Y+63, r25 ; 0x3f 13742: 6f 97 sbiw r28, 0x1f ; 31 13744: a0 91 84 0e lds r26, 0x0E84 ; 0x800e84 13748: a3 96 adiw r28, 0x23 ; 35 1374a: af af std Y+63, r26 ; 0x3f 1374c: a3 97 sbiw r28, 0x23 ; 35 // 20210109 - Add a variable to hold the n_arc_correction value unsigned char n_arc_correction = cs.n_arc_correction; // 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); 1374e: a7 01 movw r20, r14 13750: 96 01 movw r18, r12 13752: 6a 96 adiw r28, 0x1a ; 26 13754: 6c ad ldd r22, Y+60 ; 0x3c 13756: 7d ad ldd r23, Y+61 ; 0x3d 13758: 8e ad ldd r24, Y+62 ; 0x3e 1375a: 9f ad ldd r25, Y+63 ; 0x3f 1375c: 6a 97 sbiw r28, 0x1a ; 26 1375e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13762: 2b 01 movw r4, r22 13764: 3c 01 movw r6, r24 13766: a5 01 movw r20, r10 13768: 94 01 movw r18, r8 1376a: 6e 96 adiw r28, 0x1e ; 30 1376c: 6c ad ldd r22, Y+60 ; 0x3c 1376e: 7d ad ldd r23, Y+61 ; 0x3d 13770: 8e ad ldd r24, Y+62 ; 0x3e 13772: 9f ad ldd r25, Y+63 ; 0x3f 13774: 6e 97 sbiw r28, 0x1e ; 30 13776: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1377a: 9b 01 movw r18, r22 1377c: ac 01 movw r20, r24 1377e: c3 01 movw r24, r6 13780: b2 01 movw r22, r4 13782: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13786: 2b 01 movw r4, r22 13788: 3c 01 movw r6, r24 1378a: a5 01 movw r20, r10 1378c: 94 01 movw r18, r8 1378e: 6a 96 adiw r28, 0x1a ; 26 13790: 6c ad ldd r22, Y+60 ; 0x3c 13792: 7d ad ldd r23, Y+61 ; 0x3d 13794: 8e ad ldd r24, Y+62 ; 0x3e 13796: 9f ad ldd r25, Y+63 ; 0x3f 13798: 6a 97 sbiw r28, 0x1a ; 26 1379a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1379e: 4b 01 movw r8, r22 137a0: 5c 01 movw r10, r24 137a2: a7 01 movw r20, r14 137a4: 96 01 movw r18, r12 137a6: 6e 96 adiw r28, 0x1e ; 30 137a8: 6c ad ldd r22, Y+60 ; 0x3c 137aa: 7d ad ldd r23, Y+61 ; 0x3d 137ac: 8e ad ldd r24, Y+62 ; 0x3e 137ae: 9f ad ldd r25, Y+63 ; 0x3f 137b0: 6e 97 sbiw r28, 0x1e ; 30 137b2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 137b6: 9b 01 movw r18, r22 137b8: ac 01 movw r20, r24 137ba: c5 01 movw r24, r10 137bc: b4 01 movw r22, r8 137be: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 137c2: a3 01 movw r20, r6 137c4: 92 01 movw r18, r4 137c6: 0f 94 b7 dd call 0x3bb6e ; 0x3bb6e 137ca: 6b 01 movw r12, r22 137cc: 7c 01 movw r14, r24 if (angular_travel_total < 0) { angular_travel_total += 2 * M_PI; } 137ce: 20 e0 ldi r18, 0x00 ; 0 137d0: 30 e0 ldi r19, 0x00 ; 0 137d2: a9 01 movw r20, r18 137d4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 137d8: 87 ff sbrs r24, 7 137da: 0a c0 rjmp .+20 ; 0x137f0 137dc: 2b ed ldi r18, 0xDB ; 219 137de: 3f e0 ldi r19, 0x0F ; 15 137e0: 49 ec ldi r20, 0xC9 ; 201 137e2: 50 e4 ldi r21, 0x40 ; 64 137e4: c7 01 movw r24, r14 137e6: b6 01 movw r22, r12 137e8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 137ec: 6b 01 movw r12, r22 137ee: 7c 01 movw r14, r24 if (cs.min_arc_segments > 0) 137f0: 60 91 8a 0e lds r22, 0x0E8A ; 0x800e8a 137f4: 70 91 8b 0e lds r23, 0x0E8B ; 0x800e8b 137f8: 61 15 cp r22, r1 137fa: 71 05 cpc r23, r1 137fc: 09 f4 brne .+2 ; 0x13800 137fe: a4 c2 rjmp .+1352 ; 0x13d48 { // 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); 13800: 90 e0 ldi r25, 0x00 ; 0 13802: 80 e0 ldi r24, 0x00 ; 0 13804: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 13808: 9b 01 movw r18, r22 1380a: ac 01 movw r20, r24 1380c: 6b ed ldi r22, 0xDB ; 219 1380e: 7f e0 ldi r23, 0x0F ; 15 13810: 89 ec ldi r24, 0xC9 ; 201 13812: 90 e4 ldi r25, 0x40 ; 64 13814: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 13818: ae 96 adiw r28, 0x2e ; 46 1381a: 2c ad ldd r18, Y+60 ; 0x3c 1381c: 3d ad ldd r19, Y+61 ; 0x3d 1381e: 4e ad ldd r20, Y+62 ; 0x3e 13820: 5f ad ldd r21, Y+63 ; 0x3f 13822: ae 97 sbiw r28, 0x2e ; 46 13824: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13828: 5b 01 movw r10, r22 1382a: 8c 01 movw r16, r24 } if (cs.arc_segments_per_sec > 0) 1382c: 60 91 8c 0e lds r22, 0x0E8C ; 0x800e8c 13830: 70 91 8d 0e lds r23, 0x0E8D ; 0x800e8d 13834: 61 15 cp r22, r1 13836: 71 05 cpc r23, r1 13838: f1 f0 breq .+60 ; 0x13876 { // 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)); 1383a: 90 e0 ldi r25, 0x00 ; 0 1383c: 80 e0 ldi r24, 0x00 ; 0 1383e: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 13842: 20 e0 ldi r18, 0x00 ; 0 13844: 30 e0 ldi r19, 0x00 ; 0 13846: 40 e7 ldi r20, 0x70 ; 112 13848: 52 e4 ldi r21, 0x42 ; 66 1384a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1384e: 9b 01 movw r18, r22 13850: ac 01 movw r20, r24 13852: aa 96 adiw r28, 0x2a ; 42 13854: 6c ad ldd r22, Y+60 ; 0x3c 13856: 7d ad ldd r23, Y+61 ; 0x3d 13858: 8e ad ldd r24, Y+62 ; 0x3e 1385a: 9f ad ldd r25, Y+63 ; 0x3f 1385c: aa 97 sbiw r28, 0x2a ; 42 1385e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 13862: 3b 01 movw r6, r22 13864: 4c 01 movw r8, r24 if (mm_per_arc_segment_sec < mm_per_arc_segment) 13866: 95 01 movw r18, r10 13868: a8 01 movw r20, r16 1386a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1386e: 87 ff sbrs r24, 7 13870: 02 c0 rjmp .+4 ; 0x13876 mm_per_arc_segment = mm_per_arc_segment_sec; 13872: 53 01 movw r10, r6 13874: 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) 13876: 40 90 85 0e lds r4, 0x0E85 ; 0x800e85 1387a: 50 90 86 0e lds r5, 0x0E86 ; 0x800e86 1387e: 60 90 87 0e lds r6, 0x0E87 ; 0x800e87 13882: 70 90 88 0e lds r7, 0x0E88 ; 0x800e88 13886: 95 01 movw r18, r10 13888: a8 01 movw r20, r16 1388a: b2 01 movw r22, r4 1388c: c3 01 movw r24, r6 1388e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 13892: 18 16 cp r1, r24 13894: c4 f0 brlt .+48 ; 0x138c6 { // 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) { 13896: 95 01 movw r18, r10 13898: a8 01 movw r20, r16 1389a: 63 2d mov r22, r3 1389c: 72 2d mov r23, r2 1389e: 6f 96 adiw r28, 0x1f ; 31 138a0: 8f ad ldd r24, Y+63 ; 0x3f 138a2: 6f 97 sbiw r28, 0x1f ; 31 138a4: a3 96 adiw r28, 0x23 ; 35 138a6: 9f ad ldd r25, Y+63 ; 0x3f 138a8: a3 97 sbiw r28, 0x23 ; 35 138aa: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 138ae: 25 01 movw r4, r10 138b0: 38 01 movw r6, r16 138b2: 87 ff sbrs r24, 7 138b4: 08 c0 rjmp .+16 ; 0x138c6 // 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; 138b6: 43 2c mov r4, r3 138b8: 52 2c mov r5, r2 138ba: 6f 96 adiw r28, 0x1f ; 31 138bc: 6f ac ldd r6, Y+63 ; 0x3f 138be: 6f 97 sbiw r28, 0x1f ; 31 138c0: a3 96 adiw r28, 0x23 ; 35 138c2: 7f ac ldd r7, Y+63 ; 0x3f 138c4: a3 97 sbiw r28, 0x23 ; 35 } // Adjust the angular travel if the direction is clockwise if (isclockwise) { angular_travel_total -= 2 * M_PI; } 138c6: c2 57 subi r28, 0x72 ; 114 138c8: df 4f sbci r29, 0xFF ; 255 138ca: e8 81 ld r30, Y 138cc: f9 81 ldd r31, Y+1 ; 0x01 138ce: ce 58 subi r28, 0x8E ; 142 138d0: d0 40 sbci r29, 0x00 ; 0 138d2: 32 97 sbiw r30, 0x02 ; 2 138d4: 51 f4 brne .+20 ; 0x138ea 138d6: 2b ed ldi r18, 0xDB ; 219 138d8: 3f e0 ldi r19, 0x0F ; 15 138da: 49 ec ldi r20, 0xC9 ; 201 138dc: 50 e4 ldi r21, 0x40 ; 64 138de: c7 01 movw r24, r14 138e0: b6 01 movw r22, r12 138e2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 138e6: 6b 01 movw r12, r22 138e8: 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) 138ea: ca 57 subi r28, 0x7A ; 122 138ec: df 4f sbci r29, 0xFF ; 255 138ee: 28 81 ld r18, Y 138f0: 39 81 ldd r19, Y+1 ; 0x01 138f2: 4a 81 ldd r20, Y+2 ; 0x02 138f4: 5b 81 ldd r21, Y+3 ; 0x03 138f6: c6 58 subi r28, 0x86 ; 134 138f8: d0 40 sbci r29, 0x00 ; 0 138fa: e6 96 adiw r28, 0x36 ; 54 138fc: 6c ad ldd r22, Y+60 ; 0x3c 138fe: 7d ad ldd r23, Y+61 ; 0x3d 13900: 8e ad ldd r24, Y+62 ; 0x3e 13902: 9f ad ldd r25, Y+63 ; 0x3f 13904: e6 97 sbiw r28, 0x36 ; 54 13906: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1390a: 81 11 cpse r24, r1 1390c: 25 c0 rjmp .+74 ; 0x13958 1390e: c6 57 subi r28, 0x76 ; 118 13910: df 4f sbci r29, 0xFF ; 255 13912: 28 81 ld r18, Y 13914: 39 81 ldd r19, Y+1 ; 0x01 13916: 4a 81 ldd r20, Y+2 ; 0x02 13918: 5b 81 ldd r21, Y+3 ; 0x03 1391a: ca 58 subi r28, 0x8A ; 138 1391c: d0 40 sbci r29, 0x00 ; 0 1391e: ee 96 adiw r28, 0x3e ; 62 13920: 6c ad ldd r22, Y+60 ; 0x3c 13922: 7d ad ldd r23, Y+61 ; 0x3d 13924: 8e ad ldd r24, Y+62 ; 0x3e 13926: 9f ad ldd r25, Y+63 ; 0x3f 13928: ee 97 sbiw r28, 0x3e ; 62 1392a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1392e: 81 11 cpse r24, r1 13930: 13 c0 rjmp .+38 ; 0x13958 13932: 20 e0 ldi r18, 0x00 ; 0 13934: 30 e0 ldi r19, 0x00 ; 0 13936: a9 01 movw r20, r18 13938: c7 01 movw r24, r14 1393a: b6 01 movw r22, r12 1393c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 13940: 81 11 cpse r24, r1 13942: 0a c0 rjmp .+20 ; 0x13958 { angular_travel_total += 2 * M_PI; 13944: 2b ed ldi r18, 0xDB ; 219 13946: 3f e0 ldi r19, 0x0F ; 15 13948: 49 ec ldi r20, 0xC9 ; 201 1394a: 50 e4 ldi r21, 0x40 ; 64 1394c: c7 01 movw r24, r14 1394e: b6 01 movw r22, r12 13950: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13954: 6b 01 movw r12, r22 13956: 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)); 13958: a7 01 movw r20, r14 1395a: 96 01 movw r18, r12 1395c: ae 96 adiw r28, 0x2e ; 46 1395e: 6c ad ldd r22, Y+60 ; 0x3c 13960: 7d ad ldd r23, Y+61 ; 0x3d 13962: 8e ad ldd r24, Y+62 ; 0x3e 13964: 9f ad ldd r25, Y+63 ; 0x3f 13966: ae 97 sbiw r28, 0x2e ; 46 13968: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1396c: c2 58 subi r28, 0x82 ; 130 1396e: df 4f sbci r29, 0xFF ; 255 13970: 28 81 ld r18, Y 13972: 39 81 ldd r19, Y+1 ; 0x01 13974: 4a 81 ldd r20, Y+2 ; 0x02 13976: 5b 81 ldd r21, Y+3 ; 0x03 13978: ce 57 subi r28, 0x7E ; 126 1397a: d0 40 sbci r29, 0x00 ; 0 1397c: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 13980: 4b 01 movw r8, r22 13982: 5c 01 movw r10, r24 if (millimeters_of_travel_arc < 0.001) { return; } 13984: 2f e6 ldi r18, 0x6F ; 111 13986: 32 e1 ldi r19, 0x12 ; 18 13988: 43 e8 ldi r20, 0x83 ; 131 1398a: 5a e3 ldi r21, 0x3A ; 58 1398c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 13990: 87 fd sbrc r24, 7 13992: cf c1 rjmp .+926 ; 0x13d32 // Calculate the number of arc segments unsigned short segments = static_cast(ceil(millimeters_of_travel_arc / mm_per_arc_segment)); 13994: 92 01 movw r18, r4 13996: a3 01 movw r20, r6 13998: c5 01 movw r24, r10 1399a: b4 01 movw r22, r8 1399c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 139a0: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 139a4: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 139a8: a4 96 adiw r28, 0x24 ; 36 139aa: 7f af std Y+63, r23 ; 0x3f 139ac: 6e af std Y+62, r22 ; 0x3e 139ae: a4 97 sbiw r28, 0x24 ; 36 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) 139b0: 62 30 cpi r22, 0x02 ; 2 139b2: 71 05 cpc r23, r1 139b4: 08 f4 brcc .+2 ; 0x139b8 139b6: 8b c1 rjmp .+790 ; 0x13cce 139b8: e0 96 adiw r28, 0x30 ; 48 139ba: 4e ad ldd r20, Y+62 ; 0x3e 139bc: 5f ad ldd r21, Y+63 ; 0x3f 139be: e0 97 sbiw r28, 0x30 ; 48 139c0: 45 2b or r20, r21 139c2: 09 f4 brne .+2 ; 0x139c6 139c4: 84 c1 rjmp .+776 ; 0x13cce 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; // 20210109 - Add a variable to hold the n_arc_correction value unsigned char n_arc_correction = cs.n_arc_correction; 139c6: 50 91 89 0e lds r21, 0x0E89 ; 0x800e89 139ca: 6f 96 adiw r28, 0x1f ; 31 139cc: 5f af std Y+63, r21 ; 0x3f 139ce: 6f 97 sbiw r28, 0x1f ; 31 // 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) { // 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, 139d0: 90 e0 ldi r25, 0x00 ; 0 139d2: 80 e0 ldi r24, 0x00 ; 0 139d4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 139d8: 4b 01 movw r8, r22 139da: 5c 01 movw r10, r24 139dc: ac 01 movw r20, r24 139de: 9b 01 movw r18, r22 139e0: c7 01 movw r24, r14 139e2: b6 01 movw r22, r12 139e4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 139e8: 2b 01 movw r4, r22 139ea: 3c 01 movw r6, r24 linear_per_segment = travel_z / (segments), 139ec: a5 01 movw r20, r10 139ee: 94 01 movw r18, r8 139f0: c2 58 subi r28, 0x82 ; 130 139f2: df 4f sbci r29, 0xFF ; 255 139f4: 68 81 ld r22, Y 139f6: 79 81 ldd r23, Y+1 ; 0x01 139f8: 8a 81 ldd r24, Y+2 ; 0x02 139fa: 9b 81 ldd r25, Y+3 ; 0x03 139fc: ce 57 subi r28, 0x7E ; 126 139fe: d0 40 sbci r29, 0x00 ; 0 13a00: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 13a04: ee 96 adiw r28, 0x3e ; 62 13a06: 6c af std Y+60, r22 ; 0x3c 13a08: 7d af std Y+61, r23 ; 0x3d 13a0a: 8e af std Y+62, r24 ; 0x3e 13a0c: 9f af std Y+63, r25 ; 0x3f 13a0e: ee 97 sbiw r28, 0x3e ; 62 segment_extruder_travel = (target[E_AXIS] - start_position[E_AXIS]) / (segments), 13a10: 2d 85 ldd r18, Y+13 ; 0x0d 13a12: 3e 85 ldd r19, Y+14 ; 0x0e 13a14: 4f 85 ldd r20, Y+15 ; 0x0f 13a16: 58 89 ldd r21, Y+16 ; 0x10 13a18: 60 91 7f 06 lds r22, 0x067F ; 0x80067f 13a1c: 70 91 80 06 lds r23, 0x0680 ; 0x800680 13a20: 80 91 81 06 lds r24, 0x0681 ; 0x800681 13a24: 90 91 82 06 lds r25, 0x0682 ; 0x800682 13a28: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13a2c: a5 01 movw r20, r10 13a2e: 94 01 movw r18, r8 13a30: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 13a34: c2 58 subi r28, 0x82 ; 130 13a36: df 4f sbci r29, 0xFF ; 255 13a38: 68 83 st Y, r22 13a3a: 79 83 std Y+1, r23 ; 0x01 13a3c: 8a 83 std Y+2, r24 ; 0x02 13a3e: 9b 83 std Y+3, r25 ; 0x03 13a40: ce 57 subi r28, 0x7E ; 126 13a42: d0 40 sbci r29, 0x00 ; 0 sq_theta_per_segment = theta_per_segment * theta_per_segment, 13a44: a3 01 movw r20, r6 13a46: 92 01 movw r18, r4 13a48: c3 01 movw r24, r6 13a4a: b2 01 movw r22, r4 13a4c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13a50: 6b 01 movw r12, r22 13a52: 7c 01 movw r14, r24 sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6, 13a54: ac 01 movw r20, r24 13a56: 9b 01 movw r18, r22 13a58: c3 01 movw r24, r6 13a5a: b2 01 movw r22, r4 13a5c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13a60: 20 e0 ldi r18, 0x00 ; 0 13a62: 30 e0 ldi r19, 0x00 ; 0 13a64: 40 ec ldi r20, 0xC0 ; 192 13a66: 50 e4 ldi r21, 0x40 ; 64 13a68: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 13a6c: 9b 01 movw r18, r22 13a6e: ac 01 movw r20, r24 13a70: c3 01 movw r24, r6 13a72: b2 01 movw r22, r4 13a74: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13a78: ae 96 adiw r28, 0x2e ; 46 13a7a: 6c af std Y+60, r22 ; 0x3c 13a7c: 7d af std Y+61, r23 ; 0x3d 13a7e: 8e af std Y+62, r24 ; 0x3e 13a80: 9f af std Y+63, r25 ; 0x3f 13a82: ae 97 sbiw r28, 0x2e ; 46 cos_T = 1 - 0.5f * sq_theta_per_segment; 13a84: 20 e0 ldi r18, 0x00 ; 0 13a86: 30 e0 ldi r19, 0x00 ; 0 13a88: 40 e0 ldi r20, 0x00 ; 0 13a8a: 5f e3 ldi r21, 0x3F ; 63 13a8c: c7 01 movw r24, r14 13a8e: b6 01 movw r22, r12 13a90: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13a94: 9b 01 movw r18, r22 13a96: ac 01 movw r20, r24 13a98: 60 e0 ldi r22, 0x00 ; 0 13a9a: 70 e0 ldi r23, 0x00 ; 0 13a9c: 80 e8 ldi r24, 0x80 ; 128 13a9e: 9f e3 ldi r25, 0x3F ; 63 13aa0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13aa4: e6 96 adiw r28, 0x36 ; 54 13aa6: 6c af std Y+60, r22 ; 0x3c 13aa8: 7d af std Y+61, r23 ; 0x3d 13aaa: 8e af std Y+62, r24 ; 0x3e 13aac: 9f af std Y+63, r25 ; 0x3f 13aae: e6 97 sbiw r28, 0x36 ; 54 // 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++) { 13ab0: 22 24 eor r2, r2 13ab2: 23 94 inc r2 13ab4: 31 2c mov r3, r1 if (n_arc_correction-- == 0) { 13ab6: 6f 96 adiw r28, 0x1f ; 31 13ab8: 8f ad ldd r24, Y+63 ; 0x3f 13aba: 6f 97 sbiw r28, 0x1f ; 31 13abc: 81 11 cpse r24, r1 13abe: 4d c1 rjmp .+666 ; 0x13d5a // 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); 13ac0: b1 01 movw r22, r2 13ac2: 90 e0 ldi r25, 0x00 ; 0 13ac4: 80 e0 ldi r24, 0x00 ; 0 13ac6: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 13aca: a3 01 movw r20, r6 13acc: 92 01 movw r18, r4 13ace: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13ad2: 6b 01 movw r12, r22 13ad4: 7c 01 movw r14, r24 13ad6: 0f 94 32 de call 0x3bc64 ; 0x3bc64 13ada: 6e 96 adiw r28, 0x1e ; 30 13adc: 6c af std Y+60, r22 ; 0x3c 13ade: 7d af std Y+61, r23 ; 0x3d 13ae0: 8e af std Y+62, r24 ; 0x3e 13ae2: 9f af std Y+63, r25 ; 0x3f 13ae4: 6e 97 sbiw r28, 0x1e ; 30 13ae6: c7 01 movw r24, r14 13ae8: b6 01 movw r22, r12 13aea: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 13aee: 4b 01 movw r8, r22 13af0: 5c 01 movw r10, r24 r_axis_x = -offset[X_AXIS] * cos_Ti + offset[Y_AXIS] * sin_Ti; 13af2: c0 90 89 03 lds r12, 0x0389 ; 0x800389 13af6: d0 90 8a 03 lds r13, 0x038A ; 0x80038a 13afa: e0 90 8b 03 lds r14, 0x038B ; 0x80038b 13afe: f0 90 8c 03 lds r15, 0x038C ; 0x80038c 13b02: f7 fa bst r15, 7 13b04: f0 94 com r15 13b06: f7 f8 bld r15, 7 13b08: f0 94 com r15 13b0a: 20 91 8d 03 lds r18, 0x038D ; 0x80038d 13b0e: 30 91 8e 03 lds r19, 0x038E ; 0x80038e 13b12: 40 91 8f 03 lds r20, 0x038F ; 0x80038f 13b16: 50 91 90 03 lds r21, 0x0390 ; 0x800390 13b1a: a2 96 adiw r28, 0x22 ; 34 13b1c: 2c af std Y+60, r18 ; 0x3c 13b1e: 3d af std Y+61, r19 ; 0x3d 13b20: 4e af std Y+62, r20 ; 0x3e 13b22: 5f af std Y+63, r21 ; 0x3f 13b24: a2 97 sbiw r28, 0x22 ; 34 13b26: a7 01 movw r20, r14 13b28: 96 01 movw r18, r12 13b2a: 6e 96 adiw r28, 0x1e ; 30 13b2c: 6c ad ldd r22, Y+60 ; 0x3c 13b2e: 7d ad ldd r23, Y+61 ; 0x3d 13b30: 8e ad ldd r24, Y+62 ; 0x3e 13b32: 9f ad ldd r25, Y+63 ; 0x3f 13b34: 6e 97 sbiw r28, 0x1e ; 30 13b36: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13b3a: 6a 96 adiw r28, 0x1a ; 26 13b3c: 6c af std Y+60, r22 ; 0x3c 13b3e: 7d af std Y+61, r23 ; 0x3d 13b40: 8e af std Y+62, r24 ; 0x3e 13b42: 9f af std Y+63, r25 ; 0x3f 13b44: 6a 97 sbiw r28, 0x1a ; 26 13b46: a2 96 adiw r28, 0x22 ; 34 13b48: 2c ad ldd r18, Y+60 ; 0x3c 13b4a: 3d ad ldd r19, Y+61 ; 0x3d 13b4c: 4e ad ldd r20, Y+62 ; 0x3e 13b4e: 5f ad ldd r21, Y+63 ; 0x3f 13b50: a2 97 sbiw r28, 0x22 ; 34 13b52: c5 01 movw r24, r10 13b54: b4 01 movw r22, r8 13b56: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13b5a: 9b 01 movw r18, r22 13b5c: ac 01 movw r20, r24 13b5e: 6a 96 adiw r28, 0x1a ; 26 13b60: 6c ad ldd r22, Y+60 ; 0x3c 13b62: 7d ad ldd r23, Y+61 ; 0x3d 13b64: 8e ad ldd r24, Y+62 ; 0x3e 13b66: 9f ad ldd r25, Y+63 ; 0x3f 13b68: 6a 97 sbiw r28, 0x1a ; 26 13b6a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13b6e: 6a 96 adiw r28, 0x1a ; 26 13b70: 6c af std Y+60, r22 ; 0x3c 13b72: 7d af std Y+61, r23 ; 0x3d 13b74: 8e af std Y+62, r24 ; 0x3e 13b76: 9f af std Y+63, r25 ; 0x3f 13b78: 6a 97 sbiw r28, 0x1a ; 26 r_axis_y = -offset[X_AXIS] * sin_Ti - offset[Y_AXIS] * cos_Ti; 13b7a: a7 01 movw r20, r14 13b7c: 96 01 movw r18, r12 13b7e: c5 01 movw r24, r10 13b80: b4 01 movw r22, r8 13b82: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13b86: 6b 01 movw r12, r22 13b88: 7c 01 movw r14, r24 13b8a: a2 96 adiw r28, 0x22 ; 34 13b8c: 2c ad ldd r18, Y+60 ; 0x3c 13b8e: 3d ad ldd r19, Y+61 ; 0x3d 13b90: 4e ad ldd r20, Y+62 ; 0x3e 13b92: 5f ad ldd r21, Y+63 ; 0x3f 13b94: a2 97 sbiw r28, 0x22 ; 34 13b96: 6e 96 adiw r28, 0x1e ; 30 13b98: 6c ad ldd r22, Y+60 ; 0x3c 13b9a: 7d ad ldd r23, Y+61 ; 0x3d 13b9c: 8e ad ldd r24, Y+62 ; 0x3e 13b9e: 9f ad ldd r25, Y+63 ; 0x3f 13ba0: 6e 97 sbiw r28, 0x1e ; 30 13ba2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13ba6: 9b 01 movw r18, r22 13ba8: ac 01 movw r20, r24 13baa: c7 01 movw r24, r14 13bac: b6 01 movw r22, r12 13bae: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13bb2: 6e 96 adiw r28, 0x1e ; 30 13bb4: 6c af std Y+60, r22 ; 0x3c 13bb6: 7d af std Y+61, r23 ; 0x3d 13bb8: 8e af std Y+62, r24 ; 0x3e 13bba: 9f af std Y+63, r25 ; 0x3f 13bbc: 6e 97 sbiw r28, 0x1e ; 30 // reset n_arc_correction n_arc_correction = cs.n_arc_correction; 13bbe: 30 91 89 0e lds r19, 0x0E89 ; 0x800e89 13bc2: 6f 96 adiw r28, 0x1f ; 31 13bc4: 3f af std Y+63, r19 ; 0x3f 13bc6: 6f 97 sbiw r28, 0x1f ; 31 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; 13bc8: 6a 96 adiw r28, 0x1a ; 26 13bca: 2c ad ldd r18, Y+60 ; 0x3c 13bcc: 3d ad ldd r19, Y+61 ; 0x3d 13bce: 4e ad ldd r20, Y+62 ; 0x3e 13bd0: 5f ad ldd r21, Y+63 ; 0x3f 13bd2: 6a 97 sbiw r28, 0x1a ; 26 13bd4: ea 96 adiw r28, 0x3a ; 58 13bd6: 6c ad ldd r22, Y+60 ; 0x3c 13bd8: 7d ad ldd r23, Y+61 ; 0x3d 13bda: 8e ad ldd r24, Y+62 ; 0x3e 13bdc: 9f ad ldd r25, Y+63 ; 0x3f 13bde: ea 97 sbiw r28, 0x3a ; 58 13be0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13be4: 69 83 std Y+1, r22 ; 0x01 13be6: 7a 83 std Y+2, r23 ; 0x02 13be8: 8b 83 std Y+3, r24 ; 0x03 13bea: 9c 83 std Y+4, r25 ; 0x04 start_position[Y_AXIS] = center_axis_y + r_axis_y; 13bec: 6e 96 adiw r28, 0x1e ; 30 13bee: 2c ad ldd r18, Y+60 ; 0x3c 13bf0: 3d ad ldd r19, Y+61 ; 0x3d 13bf2: 4e ad ldd r20, Y+62 ; 0x3e 13bf4: 5f ad ldd r21, Y+63 ; 0x3f 13bf6: 6e 97 sbiw r28, 0x1e ; 30 13bf8: ce 57 subi r28, 0x7E ; 126 13bfa: df 4f sbci r29, 0xFF ; 255 13bfc: 68 81 ld r22, Y 13bfe: 79 81 ldd r23, Y+1 ; 0x01 13c00: 8a 81 ldd r24, Y+2 ; 0x02 13c02: 9b 81 ldd r25, Y+3 ; 0x03 13c04: c2 58 subi r28, 0x82 ; 130 13c06: d0 40 sbci r29, 0x00 ; 0 13c08: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13c0c: 6d 83 std Y+5, r22 ; 0x05 13c0e: 7e 83 std Y+6, r23 ; 0x06 13c10: 8f 83 std Y+7, r24 ; 0x07 13c12: 98 87 std Y+8, r25 ; 0x08 start_position[Z_AXIS] += linear_per_segment; 13c14: ee 96 adiw r28, 0x3e ; 62 13c16: 2c ad ldd r18, Y+60 ; 0x3c 13c18: 3d ad ldd r19, Y+61 ; 0x3d 13c1a: 4e ad ldd r20, Y+62 ; 0x3e 13c1c: 5f ad ldd r21, Y+63 ; 0x3f 13c1e: ee 97 sbiw r28, 0x3e ; 62 13c20: 69 85 ldd r22, Y+9 ; 0x09 13c22: 7a 85 ldd r23, Y+10 ; 0x0a 13c24: 8b 85 ldd r24, Y+11 ; 0x0b 13c26: 9c 85 ldd r25, Y+12 ; 0x0c 13c28: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13c2c: 69 87 std Y+9, r22 ; 0x09 13c2e: 7a 87 std Y+10, r23 ; 0x0a 13c30: 8b 87 std Y+11, r24 ; 0x0b 13c32: 9c 87 std Y+12, r25 ; 0x0c start_position[E_AXIS] += segment_extruder_travel; 13c34: c2 58 subi r28, 0x82 ; 130 13c36: df 4f sbci r29, 0xFF ; 255 13c38: 28 81 ld r18, Y 13c3a: 39 81 ldd r19, Y+1 ; 0x01 13c3c: 4a 81 ldd r20, Y+2 ; 0x02 13c3e: 5b 81 ldd r21, Y+3 ; 0x03 13c40: ce 57 subi r28, 0x7E ; 126 13c42: d0 40 sbci r29, 0x00 ; 0 13c44: 6d 85 ldd r22, Y+13 ; 0x0d 13c46: 7e 85 ldd r23, Y+14 ; 0x0e 13c48: 8f 85 ldd r24, Y+15 ; 0x0f 13c4a: 98 89 ldd r25, Y+16 ; 0x10 13c4c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13c50: 6d 87 std Y+13, r22 ; 0x0d 13c52: 7e 87 std Y+14, r23 ; 0x0e 13c54: 8f 87 std Y+15, r24 ; 0x0f 13c56: 98 8b std Y+16, r25 ; 0x10 // Clamp to the calculated position. clamp_to_software_endstops(start_position); 13c58: ce 01 movw r24, r28 13c5a: 01 96 adiw r24, 0x01 ; 1 13c5c: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 // Insert the segment into the buffer if (i >= start_segment_idx) 13c60: e0 96 adiw r28, 0x30 ; 48 13c62: 8e ad ldd r24, Y+62 ; 0x3e 13c64: 9f ad ldd r25, Y+63 ; 0x3f 13c66: e0 97 sbiw r28, 0x30 ; 48 13c68: 28 16 cp r2, r24 13c6a: 39 06 cpc r3, r25 13c6c: 08 f1 brcs .+66 ; 0x13cb0 plan_buffer_line(start_position[X_AXIS], start_position[Y_AXIS], start_position[Z_AXIS], start_position[E_AXIS], feed_rate, position, i); 13c6e: e9 84 ldd r14, Y+9 ; 0x09 13c70: fa 84 ldd r15, Y+10 ; 0x0a 13c72: 0b 85 ldd r16, Y+11 ; 0x0b 13c74: 1c 85 ldd r17, Y+12 ; 0x0c 13c76: 2d 81 ldd r18, Y+5 ; 0x05 13c78: 3e 81 ldd r19, Y+6 ; 0x06 13c7a: 4f 81 ldd r20, Y+7 ; 0x07 13c7c: 58 85 ldd r21, Y+8 ; 0x08 13c7e: 69 81 ldd r22, Y+1 ; 0x01 13c80: 7a 81 ldd r23, Y+2 ; 0x02 13c82: 8b 81 ldd r24, Y+3 ; 0x03 13c84: 9c 81 ldd r25, Y+4 ; 0x04 13c86: 3f 92 push r3 13c88: 2f 92 push r2 13c8a: a1 e9 ldi r26, 0x91 ; 145 13c8c: b6 e0 ldi r27, 0x06 ; 6 13c8e: bf 93 push r27 13c90: af 93 push r26 13c92: aa 96 adiw r28, 0x2a ; 42 13c94: 8c ac ldd r8, Y+60 ; 0x3c 13c96: 9d ac ldd r9, Y+61 ; 0x3d 13c98: ae ac ldd r10, Y+62 ; 0x3e 13c9a: bf ac ldd r11, Y+63 ; 0x3f 13c9c: aa 97 sbiw r28, 0x2a ; 42 13c9e: de 01 movw r26, r28 13ca0: 1d 96 adiw r26, 0x0d ; 13 13ca2: 6d 01 movw r12, r26 13ca4: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 13ca8: 0f 90 pop r0 13caa: 0f 90 pop r0 13cac: 0f 90 pop r0 13cae: 0f 90 pop r0 // Handle the situation where the planner is aborted hard. if (planner_aborted) 13cb0: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 13cb4: 81 11 cpse r24, r1 13cb6: 3d c0 rjmp .+122 ; 0x13d32 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++) { 13cb8: bf ef ldi r27, 0xFF ; 255 13cba: 2b 1a sub r2, r27 13cbc: 3b 0a sbc r3, r27 13cbe: a4 96 adiw r28, 0x24 ; 36 13cc0: ee ad ldd r30, Y+62 ; 0x3e 13cc2: ff ad ldd r31, Y+63 ; 0x3f 13cc4: a4 97 sbiw r28, 0x24 ; 36 13cc6: e2 15 cp r30, r2 13cc8: f3 05 cpc r31, r3 13cca: 09 f0 breq .+2 ; 0x13cce 13ccc: f4 ce rjmp .-536 ; 0x13ab6 if (planner_aborted) return; } } // Clamp to the target position. clamp_to_software_endstops(target); 13cce: 83 e7 ldi r24, 0x73 ; 115 13cd0: 96 e0 ldi r25, 0x06 ; 6 13cd2: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 // 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); 13cd6: e0 90 7b 06 lds r14, 0x067B ; 0x80067b 13cda: f0 90 7c 06 lds r15, 0x067C ; 0x80067c 13cde: 00 91 7d 06 lds r16, 0x067D ; 0x80067d 13ce2: 10 91 7e 06 lds r17, 0x067E ; 0x80067e 13ce6: 20 91 77 06 lds r18, 0x0677 ; 0x800677 13cea: 30 91 78 06 lds r19, 0x0678 ; 0x800678 13cee: 40 91 79 06 lds r20, 0x0679 ; 0x800679 13cf2: 50 91 7a 06 lds r21, 0x067A ; 0x80067a 13cf6: 60 91 73 06 lds r22, 0x0673 ; 0x800673 13cfa: 70 91 74 06 lds r23, 0x0674 ; 0x800674 13cfe: 80 91 75 06 lds r24, 0x0675 ; 0x800675 13d02: 90 91 76 06 lds r25, 0x0676 ; 0x800676 13d06: 1f 92 push r1 13d08: 1f 92 push r1 13d0a: e1 e9 ldi r30, 0x91 ; 145 13d0c: f6 e0 ldi r31, 0x06 ; 6 13d0e: ff 93 push r31 13d10: ef 93 push r30 13d12: aa 96 adiw r28, 0x2a ; 42 13d14: 8c ac ldd r8, Y+60 ; 0x3c 13d16: 9d ac ldd r9, Y+61 ; 0x3d 13d18: ae ac ldd r10, Y+62 ; 0x3e 13d1a: bf ac ldd r11, Y+63 ; 0x3f 13d1c: aa 97 sbiw r28, 0x2a ; 42 13d1e: af e7 ldi r26, 0x7F ; 127 13d20: ca 2e mov r12, r26 13d22: a6 e0 ldi r26, 0x06 ; 6 13d24: da 2e mov r13, r26 13d26: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 13d2a: 0f 90 pop r0 13d2c: 0f 90 pop r0 13d2e: 0f 90 pop r0 13d30: 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(); 13d32: 0e 94 97 5a call 0xb52e ; 0xb52e previous_millis_cmd.start(); 13d36: 84 e8 ldi r24, 0x84 ; 132 13d38: 93 e0 ldi r25, 0x03 ; 3 13d3a: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> 13d3e: 7b cb rjmp .-2314 ; 0x13436 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; 13d40: 60 e0 ldi r22, 0x00 ; 0 13d42: 70 e0 ldi r23, 0x00 ; 0 13d44: cb 01 movw r24, r22 13d46: fe cb rjmp .-2052 ; 0x13544 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; 13d48: a3 2c mov r10, r3 13d4a: b2 2c mov r11, r2 13d4c: 6f 96 adiw r28, 0x1f ; 31 13d4e: 0f ad ldd r16, Y+63 ; 0x3f 13d50: 6f 97 sbiw r28, 0x1f ; 31 13d52: a3 96 adiw r28, 0x23 ; 35 13d54: 1f ad ldd r17, Y+63 ; 0x3f 13d56: a3 97 sbiw r28, 0x23 ; 35 13d58: 69 cd rjmp .-1326 ; 0x1382c 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++) { if (n_arc_correction-- == 0) { 13d5a: 6f 96 adiw r28, 0x1f ; 31 13d5c: 4f ad ldd r20, Y+63 ; 0x3f 13d5e: 6f 97 sbiw r28, 0x1f ; 31 13d60: 41 50 subi r20, 0x01 ; 1 13d62: 6f 96 adiw r28, 0x1f ; 31 13d64: 4f af std Y+63, r20 ; 0x3f 13d66: 6f 97 sbiw r28, 0x1f ; 31 // 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; 13d68: ae 96 adiw r28, 0x2e ; 46 13d6a: 2c ad ldd r18, Y+60 ; 0x3c 13d6c: 3d ad ldd r19, Y+61 ; 0x3d 13d6e: 4e ad ldd r20, Y+62 ; 0x3e 13d70: 5f ad ldd r21, Y+63 ; 0x3f 13d72: ae 97 sbiw r28, 0x2e ; 46 13d74: 6a 96 adiw r28, 0x1a ; 26 13d76: 6c ad ldd r22, Y+60 ; 0x3c 13d78: 7d ad ldd r23, Y+61 ; 0x3d 13d7a: 8e ad ldd r24, Y+62 ; 0x3e 13d7c: 9f ad ldd r25, Y+63 ; 0x3f 13d7e: 6a 97 sbiw r28, 0x1a ; 26 13d80: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13d84: 6b 01 movw r12, r22 13d86: 7c 01 movw r14, r24 13d88: e6 96 adiw r28, 0x36 ; 54 13d8a: 2c ad ldd r18, Y+60 ; 0x3c 13d8c: 3d ad ldd r19, Y+61 ; 0x3d 13d8e: 4e ad ldd r20, Y+62 ; 0x3e 13d90: 5f ad ldd r21, Y+63 ; 0x3f 13d92: e6 97 sbiw r28, 0x36 ; 54 13d94: 6e 96 adiw r28, 0x1e ; 30 13d96: 6c ad ldd r22, Y+60 ; 0x3c 13d98: 7d ad ldd r23, Y+61 ; 0x3d 13d9a: 8e ad ldd r24, Y+62 ; 0x3e 13d9c: 9f ad ldd r25, Y+63 ; 0x3f 13d9e: 6e 97 sbiw r28, 0x1e ; 30 13da0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13da4: 9b 01 movw r18, r22 13da6: ac 01 movw r20, r24 13da8: c7 01 movw r24, r14 13daa: b6 01 movw r22, r12 13dac: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 13db0: 7b 01 movw r14, r22 13db2: 8c 01 movw r16, r24 r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T; 13db4: e6 96 adiw r28, 0x36 ; 54 13db6: 2c ad ldd r18, Y+60 ; 0x3c 13db8: 3d ad ldd r19, Y+61 ; 0x3d 13dba: 4e ad ldd r20, Y+62 ; 0x3e 13dbc: 5f ad ldd r21, Y+63 ; 0x3f 13dbe: e6 97 sbiw r28, 0x36 ; 54 13dc0: 6a 96 adiw r28, 0x1a ; 26 13dc2: 6c ad ldd r22, Y+60 ; 0x3c 13dc4: 7d ad ldd r23, Y+61 ; 0x3d 13dc6: 8e ad ldd r24, Y+62 ; 0x3e 13dc8: 9f ad ldd r25, Y+63 ; 0x3f 13dca: 6a 97 sbiw r28, 0x1a ; 26 13dcc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13dd0: 4b 01 movw r8, r22 13dd2: 5c 01 movw r10, r24 13dd4: ae 96 adiw r28, 0x2e ; 46 13dd6: 2c ad ldd r18, Y+60 ; 0x3c 13dd8: 3d ad ldd r19, Y+61 ; 0x3d 13dda: 4e ad ldd r20, Y+62 ; 0x3e 13ddc: 5f ad ldd r21, Y+63 ; 0x3f 13dde: ae 97 sbiw r28, 0x2e ; 46 13de0: 6e 96 adiw r28, 0x1e ; 30 13de2: 6c ad ldd r22, Y+60 ; 0x3c 13de4: 7d ad ldd r23, Y+61 ; 0x3d 13de6: 8e ad ldd r24, Y+62 ; 0x3e 13de8: 9f ad ldd r25, Y+63 ; 0x3f 13dea: 6e 97 sbiw r28, 0x1e ; 30 13dec: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13df0: 9b 01 movw r18, r22 13df2: ac 01 movw r20, r24 13df4: c5 01 movw r24, r10 13df6: b4 01 movw r22, r8 13df8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 13dfc: 6a 96 adiw r28, 0x1a ; 26 13dfe: 6c af std Y+60, r22 ; 0x3c 13e00: 7d af std Y+61, r23 ; 0x3d 13e02: 8e af std Y+62, r24 ; 0x3e 13e04: 9f af std Y+63, r25 ; 0x3f 13e06: 6a 97 sbiw r28, 0x1a ; 26 r_axis_y = r_axisi; 13e08: c7 01 movw r24, r14 13e0a: d8 01 movw r26, r16 13e0c: 6e 96 adiw r28, 0x1e ; 30 13e0e: 8c af std Y+60, r24 ; 0x3c 13e10: 9d af std Y+61, r25 ; 0x3d 13e12: ae af std Y+62, r26 ; 0x3e 13e14: bf af std Y+63, r27 ; 0x3f 13e16: 6e 97 sbiw r28, 0x1e ; 30 13e18: d7 ce rjmp .-594 ; 0x13bc8 - `S` - Time to wait, in seconds */ case 4: codenum = 0; if(code_seen('P')) codenum = code_value(); // milliseconds to wait 13e1a: 80 e5 ldi r24, 0x50 ; 80 13e1c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `P` - Time to wait, in milliseconds - `S` - Time to wait, in seconds */ case 4: codenum = 0; 13e20: c1 2c mov r12, r1 13e22: d1 2c mov r13, r1 13e24: 76 01 movw r14, r12 if(code_seen('P')) codenum = code_value(); // milliseconds to wait 13e26: 88 23 and r24, r24 13e28: 31 f0 breq .+12 ; 0x13e36 13e2a: 0e 94 35 60 call 0xc06a ; 0xc06a 13e2e: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 13e32: 6b 01 movw r12, r22 13e34: 7c 01 movw r14, r24 if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait 13e36: 83 e5 ldi r24, 0x53 ; 83 13e38: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 13e3c: 88 23 and r24, r24 13e3e: 61 f0 breq .+24 ; 0x13e58 13e40: 0e 94 35 60 call 0xc06a ; 0xc06a 13e44: 20 e0 ldi r18, 0x00 ; 0 13e46: 30 e0 ldi r19, 0x00 ; 0 13e48: 4a e7 ldi r20, 0x7A ; 122 13e4a: 54 e4 ldi r21, 0x44 ; 68 13e4c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 13e50: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 13e54: 6b 01 movw r12, r22 13e56: 7c 01 movw r14, r24 if(codenum != 0) 13e58: c1 14 cp r12, r1 13e5a: d1 04 cpc r13, r1 13e5c: e1 04 cpc r14, r1 13e5e: f1 04 cpc r15, r1 13e60: 41 f0 breq .+16 ; 0x13e72 { if(custom_message_type != CustomMsg::M117) 13e62: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 13e66: 87 30 cpi r24, 0x07 ; 7 13e68: 21 f0 breq .+8 ; 0x13e72 { LCD_MESSAGERPGM(_n("Sleep..."));////MSG_DWELL 13e6a: 85 eb ldi r24, 0xB5 ; 181 13e6c: 99 e6 ldi r25, 0x69 ; 105 13e6e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c } } st_synchronize(); 13e72: 0f 94 a9 43 call 0x28752 ; 0x28752 codenum += _millis(); // keep track of when we started waiting 13e76: 0f 94 28 2a call 0x25450 ; 0x25450 13e7a: c6 0e add r12, r22 13e7c: d7 1e adc r13, r23 13e7e: e8 1e adc r14, r24 13e80: f9 1e adc r15, r25 previous_millis_cmd.start(); 13e82: 84 e8 ldi r24, 0x84 ; 132 13e84: 93 e0 ldi r25, 0x03 ; 3 13e86: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> while(_millis() < codenum) { 13e8a: 0f 94 28 2a call 0x25450 ; 0x25450 13e8e: 6c 15 cp r22, r12 13e90: 7d 05 cpc r23, r13 13e92: 8e 05 cpc r24, r14 13e94: 9f 05 cpc r25, r15 13e96: 08 f0 brcs .+2 ; 0x13e9a 13e98: ce ca rjmp .-2660 ; 0x13436 manage_heater(); 13e9a: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 13e9e: 80 e0 ldi r24, 0x00 ; 0 13ea0: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 13ea4: 80 e0 ldi r24, 0x00 ; 0 13ea6: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 13eaa: ef cf rjmp .-34 ; 0x13e8a 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); 13eac: 81 e0 ldi r24, 0x01 ; 1 */ case 11: #if EXTRUDERS > 1 retract(false,retracted_swap[active_extruder]); #else retract(false); 13eae: 0f 94 1c 8a call 0x31438 ; 0x31438 13eb2: c1 ca rjmp .-2686 ; 0x13436 13eb4: 80 e0 ldi r24, 0x00 ; 0 13eb6: fb cf rjmp .-10 ; 0x13eae - `C` - Calibrate X and Y origin (home) - Only on MK3/s */ case 28: { long home_x_value = 0; long home_y_value = 0; 13eb8: 6e 96 adiw r28, 0x1e ; 30 13eba: 1c ae std Y+60, r1 ; 0x3c 13ebc: 1d ae std Y+61, r1 ; 0x3d 13ebe: 1e ae std Y+62, r1 ; 0x3e 13ec0: 1f ae std Y+63, r1 ; 0x3f 13ec2: 6e 97 sbiw r28, 0x1e ; 30 13ec4: 35 ca rjmp .-2966 ; 0x13330 Sensor must be over the bed. The maximum travel distance before an error is triggered is 10mm. */ case 30: { st_synchronize(); 13ec6: 0f 94 a9 43 call 0x28752 ; 0x28752 homing_flag = true; 13eca: 81 e0 ldi r24, 0x01 ; 1 13ecc: 80 93 a6 0d sts 0x0DA6, r24 ; 0x800da6 // TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly int l_feedmultiply = setup_for_endstop_move(); 13ed0: 0e 94 80 66 call 0xcd00 ; 0xcd00 13ed4: 8c 01 movw r16, r24 feedrate = homing_feedrate[Z_AXIS]; 13ed6: 80 e0 ldi r24, 0x00 ; 0 13ed8: 90 e0 ldi r25, 0x00 ; 0 13eda: a8 e4 ldi r26, 0x48 ; 72 13edc: b4 e4 ldi r27, 0x44 ; 68 13ede: 80 93 b8 02 sts 0x02B8, r24 ; 0x8002b8 13ee2: 90 93 b9 02 sts 0x02B9, r25 ; 0x8002b9 13ee6: a0 93 ba 02 sts 0x02BA, r26 ; 0x8002ba 13eea: b0 93 bb 02 sts 0x02BB, r27 ; 0x8002bb find_bed_induction_sensor_point_z(-10.f, 3); 13eee: 43 e0 ldi r20, 0x03 ; 3 13ef0: 60 e0 ldi r22, 0x00 ; 0 13ef2: 70 e0 ldi r23, 0x00 ; 0 13ef4: 80 e2 ldi r24, 0x20 ; 32 13ef6: 91 ec ldi r25, 0xC1 ; 193 13ef8: 0f 94 4b 8c call 0x31896 ; 0x31896 printf_P(_N("%S X: %.5f Y: %.5f Z: %.5f\n"), _T(MSG_BED), _x, _y, _z); 13efc: 70 90 99 06 lds r7, 0x0699 ; 0x800699 13f00: 60 90 9a 06 lds r6, 0x069A ; 0x80069a 13f04: 50 90 9b 06 lds r5, 0x069B ; 0x80069b 13f08: 40 90 9c 06 lds r4, 0x069C ; 0x80069c 13f0c: b0 90 95 06 lds r11, 0x0695 ; 0x800695 13f10: a0 90 96 06 lds r10, 0x0696 ; 0x800696 13f14: 90 90 97 06 lds r9, 0x0697 ; 0x800697 13f18: 80 90 98 06 lds r8, 0x0698 ; 0x800698 13f1c: f0 90 91 06 lds r15, 0x0691 ; 0x800691 13f20: e0 90 92 06 lds r14, 0x0692 ; 0x800692 13f24: d0 90 93 06 lds r13, 0x0693 ; 0x800693 13f28: c0 90 94 06 lds r12, 0x0694 ; 0x800694 13f2c: 89 e9 ldi r24, 0x99 ; 153 13f2e: 93 e4 ldi r25, 0x43 ; 67 13f30: 0e 94 44 72 call 0xe488 ; 0xe488 13f34: 4f 92 push r4 13f36: 5f 92 push r5 13f38: 6f 92 push r6 13f3a: 7f 92 push r7 13f3c: 8f 92 push r8 13f3e: 9f 92 push r9 13f40: af 92 push r10 13f42: bf 92 push r11 13f44: cf 92 push r12 13f46: df 92 push r13 13f48: ef 92 push r14 13f4a: ff 92 push r15 13f4c: 9f 93 push r25 13f4e: 8f 93 push r24 13f50: 89 e9 ldi r24, 0x99 ; 153 13f52: 99 e6 ldi r25, 0x69 ; 105 13f54: 9f 93 push r25 13f56: 8f 93 push r24 13f58: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 clean_up_after_endstop_move(l_feedmultiply); 13f5c: c8 01 movw r24, r16 13f5e: 0e 94 66 66 call 0xcccc ; 0xcccc homing_flag = false; 13f62: 10 92 a6 0d sts 0x0DA6, r1 ; 0x800da6 13f66: 0f b6 in r0, 0x3f ; 63 13f68: f8 94 cli 13f6a: de bf out 0x3e, r29 ; 62 13f6c: 0f be out 0x3f, r0 ; 63 13f6e: cd bf out 0x3d, r28 ; 61 13f70: 62 ca rjmp .-2876 ; 0x13436 ``` */ case 76: { #ifdef PINDA_THERMISTOR if (!has_temperature_compensation()) 13f72: 20 e0 ldi r18, 0x00 ; 0 13f74: 30 e0 ldi r19, 0x00 ; 0 13f76: 40 e2 ldi r20, 0x20 ; 32 13f78: 51 e4 ldi r21, 0x41 ; 65 13f7a: 60 91 97 03 lds r22, 0x0397 ; 0x800397 13f7e: 70 91 98 03 lds r23, 0x0398 ; 0x800398 13f82: 80 91 99 03 lds r24, 0x0399 ; 0x800399 13f86: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 13f8a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 13f8e: 87 ff sbrs r24, 7 13f90: 05 c0 rjmp .+10 ; 0x13f9c { SERIAL_ECHOLNPGM("No PINDA thermistor"); 13f92: 8f e6 ldi r24, 0x6F ; 111 13f94: 97 e8 ldi r25, 0x87 ; 135 13f96: 0e 94 13 79 call 0xf226 ; 0xf226 13f9a: 4d ca rjmp .-2918 ; 0x13436 break; } if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { 13f9c: 82 e0 ldi r24, 0x02 ; 2 13f9e: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 13fa2: 81 11 cpse r24, r1 13fa4: 07 c0 rjmp .+14 ; 0x13fb4 //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)); 13fa6: 8e e0 ldi r24, 0x0E ; 14 13fa8: 9a e3 ldi r25, 0x3A ; 58 13faa: 0e 94 44 72 call 0xe488 ; 0xe488 13fae: 0f 94 cd 20 call 0x2419a ; 0x2419a 13fb2: 41 ca rjmp .-2942 ; 0x13436 break; } if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) 13fb4: 80 91 8e 06 lds r24, 0x068E ; 0x80068e 13fb8: 88 23 and r24, r24 13fba: 41 f0 breq .+16 ; 0x13fcc 13fbc: 80 91 8f 06 lds r24, 0x068F ; 0x80068f 13fc0: 88 23 and r24, r24 13fc2: 21 f0 breq .+8 ; 0x13fcc 13fc4: 10 91 90 06 lds r17, 0x0690 ; 0x800690 13fc8: 11 11 cpse r17, r1 13fca: 08 c0 rjmp .+16 ; 0x13fdc 13fcc: 81 e0 ldi r24, 0x01 ; 1 13fce: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 { // 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); 13fd2: 8a e7 ldi r24, 0x7A ; 122 13fd4: 9b e6 ldi r25, 0x6B ; 107 13fd6: 0f 94 f4 75 call 0x2ebe8 ; 0x2ebe8 13fda: 2d ca rjmp .-2982 ; 0x13436 break; } lcd_show_fullscreen_message_and_wait_P(_T(MSG_TEMP_CAL_WARNING)); 13fdc: 85 ec ldi r24, 0xC5 ; 197 13fde: 99 e3 ldi r25, 0x39 ; 57 13fe0: 0e 94 44 72 call 0xe488 ; 0xe488 13fe4: 0f 94 cd 20 call 0x2419a ; 0x2419a uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false); 13fe8: 83 e6 ldi r24, 0x63 ; 99 13fea: 9e e3 ldi r25, 0x3E ; 62 13fec: 0e 94 44 72 call 0xe488 ; 0xe488 13ff0: 41 e0 ldi r20, 0x01 ; 1 13ff2: 60 e0 ldi r22, 0x00 ; 0 13ff4: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if (result == LCD_LEFT_BUTTON_CHOICE) 13ff8: 81 11 cpse r24, r1 13ffa: 61 c0 rjmp .+194 ; 0x140be { current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 13ffc: 80 e0 ldi r24, 0x00 ; 0 13ffe: 90 e0 ldi r25, 0x00 ; 0 14000: a0 ea ldi r26, 0xA0 ; 160 14002: b0 e4 ldi r27, 0x40 ; 64 14004: 80 93 99 06 sts 0x0699, r24 ; 0x800699 14008: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 1400c: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 14010: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 14014: 60 e0 ldi r22, 0x00 ; 0 14016: 70 e0 ldi r23, 0x00 ; 0 14018: 88 e4 ldi r24, 0x48 ; 72 1401a: 92 e4 ldi r25, 0x42 ; 66 1401c: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[Z_AXIS] = 50; 14020: 80 e0 ldi r24, 0x00 ; 0 14022: 90 e0 ldi r25, 0x00 ; 0 14024: a8 e4 ldi r26, 0x48 ; 72 14026: b2 e4 ldi r27, 0x42 ; 66 14028: 80 93 99 06 sts 0x0699, r24 ; 0x800699 1402c: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 14030: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 14034: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c current_position[Y_AXIS] = 180; 14038: 80 e0 ldi r24, 0x00 ; 0 1403a: 90 e0 ldi r25, 0x00 ; 0 1403c: a4 e3 ldi r26, 0x34 ; 52 1403e: b3 e4 ldi r27, 0x43 ; 67 14040: 80 93 95 06 sts 0x0695, r24 ; 0x800695 14044: 90 93 96 06 sts 0x0696, r25 ; 0x800696 14048: a0 93 97 06 sts 0x0697, r26 ; 0x800697 1404c: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(3000 / 60); 14050: 60 e0 ldi r22, 0x00 ; 0 14052: 70 e0 ldi r23, 0x00 ; 0 14054: 88 e4 ldi r24, 0x48 ; 72 14056: 92 e4 ldi r25, 0x42 ; 66 14058: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1405c: 0f 94 a9 43 call 0x28752 ; 0x28752 lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_STEEL_SHEET)); 14060: 89 e3 ldi r24, 0x39 ; 57 14062: 9e e3 ldi r25, 0x3E ; 62 14064: 0e 94 44 72 call 0xe488 ; 0xe488 14068: 0f 94 cd 20 call 0x2419a ; 0x2419a current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 1406c: e3 e2 ldi r30, 0x23 ; 35 1406e: f5 ea ldi r31, 0xA5 ; 165 14070: 85 91 lpm r24, Z+ 14072: 95 91 lpm r25, Z+ 14074: a5 91 lpm r26, Z+ 14076: b4 91 lpm r27, Z 14078: 80 93 95 06 sts 0x0695, r24 ; 0x800695 1407c: 90 93 96 06 sts 0x0696, r25 ; 0x800696 14080: a0 93 97 06 sts 0x0697, r26 ; 0x800697 14084: b0 93 98 06 sts 0x0698, r27 ; 0x800698 current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 14088: ef e1 ldi r30, 0x1F ; 31 1408a: f5 ea ldi r31, 0xA5 ; 165 1408c: 85 91 lpm r24, Z+ 1408e: 95 91 lpm r25, Z+ 14090: a5 91 lpm r26, Z+ 14092: b4 91 lpm r27, Z 14094: 80 93 91 06 sts 0x0691, r24 ; 0x800691 14098: 90 93 92 06 sts 0x0692, r25 ; 0x800692 1409c: a0 93 93 06 sts 0x0693, r26 ; 0x800693 140a0: b0 93 94 06 sts 0x0694, r27 ; 0x800694 plan_buffer_line_curposXYZE(3000 / 60); 140a4: 60 e0 ldi r22, 0x00 ; 0 140a6: 70 e0 ldi r23, 0x00 ; 0 140a8: 88 e4 ldi r24, 0x48 ; 72 140aa: 92 e4 ldi r25, 0x42 ; 66 140ac: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 140b0: 0f 94 a9 43 call 0x28752 ; 0x28752 gcode_G28(false, false, true); 140b4: 41 e0 ldi r20, 0x01 ; 1 140b6: 60 e0 ldi r22, 0x00 ; 0 140b8: 80 e0 ldi r24, 0x00 ; 0 140ba: 0e 94 9d 7e call 0xfd3a ; 0xfd3a } if ((current_temperature_pinda > 35) && (farm_mode == false)) { 140be: 20 e0 ldi r18, 0x00 ; 0 140c0: 30 e0 ldi r19, 0x00 ; 0 140c2: 4c e0 ldi r20, 0x0C ; 12 140c4: 52 e4 ldi r21, 0x42 ; 66 140c6: 60 91 97 03 lds r22, 0x0397 ; 0x800397 140ca: 70 91 98 03 lds r23, 0x0398 ; 0x800398 140ce: 80 91 99 03 lds r24, 0x0399 ; 0x800399 140d2: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 140d6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 140da: 18 16 cp r1, r24 140dc: 0c f0 brlt .+2 ; 0x140e0 140de: 73 c0 rjmp .+230 ; 0x141c6 //waiting for PIDNA probe to cool down in case that we are not in farm mode current_position[Z_AXIS] = 100; 140e0: 80 e0 ldi r24, 0x00 ; 0 140e2: 90 e0 ldi r25, 0x00 ; 0 140e4: a8 ec ldi r26, 0xC8 ; 200 140e6: b2 e4 ldi r27, 0x42 ; 66 140e8: 80 93 99 06 sts 0x0699, r24 ; 0x800699 140ec: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 140f0: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 140f4: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 140f8: 60 e0 ldi r22, 0x00 ; 0 140fa: 70 e0 ldi r23, 0x00 ; 0 140fc: 88 e4 ldi r24, 0x48 ; 72 140fe: 92 e4 ldi r25, 0x42 ; 66 14100: 0f 94 3d c0 call 0x3807a ; 0x3807a } #ifdef PINDA_THERMISTOR bool lcd_wait_for_pinda(float temp) { disable_heater(); 14104: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 LongTimer pinda_timeout; 14108: 19 82 std Y+1, r1 ; 0x01 1410a: 1a 82 std Y+2, r1 ; 0x02 1410c: 1b 82 std Y+3, r1 ; 0x03 1410e: 1c 82 std Y+4, r1 ; 0x04 14110: 1d 82 std Y+5, r1 ; 0x05 pinda_timeout.start(); 14112: ce 01 movw r24, r28 14114: 01 96 adiw r24, 0x01 ; 1 14116: 0f 94 cb 2c call 0x25996 ; 0x25996 ::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); 1411a: 03 e2 ldi r16, 0x23 ; 35 1411c: ef e9 ldi r30, 0x9F ; 159 1411e: ee 2e mov r14, r30 14120: e4 e8 ldi r30, 0x84 ; 132 14122: fe 2e mov r15, r30 disable_heater(); LongTimer pinda_timeout; pinda_timeout.start(); bool target_temp_reached = true; while (current_temperature_pinda > temp){ 14124: 20 e0 ldi r18, 0x00 ; 0 14126: 30 e0 ldi r19, 0x00 ; 0 14128: 4c e0 ldi r20, 0x0C ; 12 1412a: 52 e4 ldi r21, 0x42 ; 66 1412c: 60 91 97 03 lds r22, 0x0397 ; 0x800397 14130: 70 91 98 03 lds r23, 0x0398 ; 0x800398 14134: 80 91 99 03 lds r24, 0x0399 ; 0x800399 14138: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1413c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 14140: 18 16 cp r1, r24 14142: c4 f5 brge .+112 ; 0x141b4 lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP_PINDA)); 14144: 87 e7 ldi r24, 0x77 ; 119 14146: 99 e3 ldi r25, 0x39 ; 57 14148: 0e 94 44 72 call 0xe488 ; 0xe488 1414c: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 14150: 42 e8 ldi r20, 0x82 ; 130 14152: 64 e0 ldi r22, 0x04 ; 4 14154: 80 e0 ldi r24, 0x00 ; 0 14156: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp); 1415a: 1f 92 push r1 1415c: 0f 93 push r16 1415e: 60 91 97 03 lds r22, 0x0397 ; 0x800397 14162: 70 91 98 03 lds r23, 0x0398 ; 0x800398 14166: 80 91 99 03 lds r24, 0x0399 ; 0x800399 1416a: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1416e: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 14172: 7f 93 push r23 14174: 6f 93 push r22 14176: ff 92 push r15 14178: ef 92 push r14 1417a: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_putc(LCD_STR_DEGREE[0]); 1417e: 81 e8 ldi r24, 0x81 ; 129 14180: 0e 94 67 6e call 0xdcce ; 0xdcce delay_keep_alive(1000); 14184: 88 ee ldi r24, 0xE8 ; 232 14186: 93 e0 ldi r25, 0x03 ; 3 14188: 0e 94 84 8c call 0x11908 ; 0x11908 serialecho_temperatures(); 1418c: 0e 94 f6 76 call 0xedec ; 0xedec if (pinda_timeout.expired(8 * 60 * 1000ul)) { //PINDA cooling from 60 C to 35 C takes about 7 minutes 14190: 40 e0 ldi r20, 0x00 ; 0 14192: 53 e5 ldi r21, 0x53 ; 83 14194: 67 e0 ldi r22, 0x07 ; 7 14196: 70 e0 ldi r23, 0x00 ; 0 14198: ce 01 movw r24, r28 1419a: 01 96 adiw r24, 0x01 ; 1 1419c: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 141a0: 0f 90 pop r0 141a2: 0f 90 pop r0 141a4: 0f 90 pop r0 141a6: 0f 90 pop r0 141a8: 0f 90 pop r0 141aa: 0f 90 pop r0 141ac: 88 23 and r24, r24 141ae: 09 f4 brne .+2 ; 0x141b2 141b0: b9 cf rjmp .-142 ; 0x14124 target_temp_reached = false; 141b2: 10 e0 ldi r17, 0x00 ; 0 break; } } lcd_update_enable(true); 141b4: 81 e0 ldi r24, 0x01 ; 1 141b6: 0e 94 bd 6e call 0xdd7a ; 0xdd7a if (lcd_wait_for_pinda(35) == false) { //waiting for PINDA probe to cool, if this takes more then time expected, temp. cal. fails 141ba: 11 11 cpse r17, r1 141bc: 04 c0 rjmp .+8 ; 0x141c6 lcd_temp_cal_show_result(false); 141be: 80 e0 ldi r24, 0x00 ; 0 141c0: 0f 94 18 21 call 0x24230 ; 0x24230 141c4: 38 c9 rjmp .-3472 ; 0x13436 break; } } st_synchronize(); 141c6: 0f 94 a9 43 call 0x28752 ; 0x28752 homing_flag = true; // keep homing on to avoid babystepping while the LCD is enabled 141ca: 81 e0 ldi r24, 0x01 ; 1 141cc: 80 93 a6 0d sts 0x0DA6, r24 ; 0x800da6 lcd_update_enable(true); 141d0: 0e 94 bd 6e call 0xdd7a ; 0xdd7a SERIAL_ECHOLNPGM("PINDA probe calibration start"); 141d4: 81 e5 ldi r24, 0x51 ; 81 141d6: 97 e8 ldi r25, 0x87 ; 135 141d8: 0e 94 13 79 call 0xf226 ; 0xf226 float zero_z; int z_shift = 0; //unit: steps float start_temp = 5 * (int)(current_temperature_pinda / 5); 141dc: 80 90 97 03 lds r8, 0x0397 ; 0x800397 141e0: 90 90 98 03 lds r9, 0x0398 ; 0x800398 141e4: a0 90 99 03 lds r10, 0x0399 ; 0x800399 141e8: b0 90 9a 03 lds r11, 0x039A ; 0x80039a 141ec: 20 e0 ldi r18, 0x00 ; 0 141ee: 30 e0 ldi r19, 0x00 ; 0 141f0: 40 ea ldi r20, 0xA0 ; 160 141f2: 50 e4 ldi r21, 0x40 ; 64 141f4: c5 01 movw r24, r10 141f6: b4 01 movw r22, r8 141f8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 141fc: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 14200: 25 e0 ldi r18, 0x05 ; 5 14202: 26 9f mul r18, r22 14204: a0 01 movw r20, r0 14206: 27 9f mul r18, r23 14208: 50 0d add r21, r0 1420a: 11 24 eor r1, r1 1420c: ba 01 movw r22, r20 1420e: 55 0f add r21, r21 14210: 88 0b sbc r24, r24 14212: 99 0b sbc r25, r25 14214: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 14218: 1b 01 movw r2, r22 1421a: 7c 01 movw r14, r24 if (start_temp < 35) start_temp = 35; 1421c: 20 e0 ldi r18, 0x00 ; 0 1421e: 30 e0 ldi r19, 0x00 ; 0 14220: 4c e0 ldi r20, 0x0C ; 12 14222: 52 e4 ldi r21, 0x42 ; 66 14224: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 14228: 87 ff sbrs r24, 7 1422a: 06 c0 rjmp .+12 ; 0x14238 1422c: 21 2c mov r2, r1 1422e: 31 2c mov r3, r1 14230: 6c e0 ldi r22, 0x0C ; 12 14232: e6 2e mov r14, r22 14234: 72 e4 ldi r23, 0x42 ; 66 14236: f7 2e mov r15, r23 if (start_temp < current_temperature_pinda) start_temp += 5; 14238: 22 2d mov r18, r2 1423a: 33 2d mov r19, r3 1423c: 4e 2d mov r20, r14 1423e: 5f 2d mov r21, r15 14240: c5 01 movw r24, r10 14242: b4 01 movw r22, r8 14244: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 14248: 18 16 cp r1, r24 1424a: 64 f4 brge .+24 ; 0x14264 1424c: 20 e0 ldi r18, 0x00 ; 0 1424e: 30 e0 ldi r19, 0x00 ; 0 14250: 40 ea ldi r20, 0xA0 ; 160 14252: 50 e4 ldi r21, 0x40 ; 64 14254: 62 2d mov r22, r2 14256: 73 2d mov r23, r3 14258: 8e 2d mov r24, r14 1425a: 9f 2d mov r25, r15 1425c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 14260: 1b 01 movw r2, r22 14262: 7c 01 movw r14, r24 printf_P(_N("start temperature: %.1f\n"), start_temp); 14264: ff 92 push r15 14266: ef 92 push r14 14268: 3f 92 push r3 1426a: 2f 92 push r2 1426c: 87 e7 ldi r24, 0x77 ; 119 1426e: 99 e6 ldi r25, 0x69 ; 105 14270: 9f 93 push r25 14272: 8f 93 push r24 14274: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 setTargetBed(70 + (start_temp - 30)); 14278: 20 e0 ldi r18, 0x00 ; 0 1427a: 30 e0 ldi r19, 0x00 ; 0 1427c: 40 ef ldi r20, 0xF0 ; 240 1427e: 51 e4 ldi r21, 0x41 ; 65 14280: 62 2d mov r22, r2 14282: 73 2d mov r23, r3 14284: 8e 2d mov r24, r14 14286: 9f 2d mov r25, r15 14288: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1428c: 20 e0 ldi r18, 0x00 ; 0 1428e: 30 e0 ldi r19, 0x00 ; 0 14290: 4c e8 ldi r20, 0x8C ; 140 14292: 52 e4 ldi r21, 0x42 ; 66 14294: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 14298: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1429c: 70 93 72 06 sts 0x0672, r23 ; 0x800672 142a0: 60 93 71 06 sts 0x0671, r22 ; 0x800671 custom_message_type = CustomMsg::TempCal; 142a4: 84 e0 ldi r24, 0x04 ; 4 142a6: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 custom_message_state = 1; 142aa: 81 e0 ldi r24, 0x01 ; 1 142ac: 80 93 f6 03 sts 0x03F6, r24 ; 0x8003f6 lcd_setstatuspgm(_T(MSG_PINDA_CALIBRATION)); 142b0: 81 ec ldi r24, 0xC1 ; 193 142b2: 94 e4 ldi r25, 0x44 ; 68 142b4: 0e 94 44 72 call 0xe488 ; 0xe488 142b8: 0e 94 16 f2 call 0x1e42c ; 0x1e42c current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 142bc: 80 e0 ldi r24, 0x00 ; 0 142be: 90 e0 ldi r25, 0x00 ; 0 142c0: a0 ea ldi r26, 0xA0 ; 160 142c2: b0 e4 ldi r27, 0x40 ; 64 142c4: 80 93 99 06 sts 0x0699, r24 ; 0x800699 142c8: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 142cc: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 142d0: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 142d4: 60 e0 ldi r22, 0x00 ; 0 142d6: 70 e0 ldi r23, 0x00 ; 0 142d8: 88 e4 ldi r24, 0x48 ; 72 142da: 92 e4 ldi r25, 0x42 ; 66 142dc: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[X_AXIS] = PINDA_PREHEAT_X; 142e0: 80 e0 ldi r24, 0x00 ; 0 142e2: 90 e0 ldi r25, 0x00 ; 0 142e4: a0 ea ldi r26, 0xA0 ; 160 142e6: b1 e4 ldi r27, 0x41 ; 65 142e8: 80 93 91 06 sts 0x0691, r24 ; 0x800691 142ec: 90 93 92 06 sts 0x0692, r25 ; 0x800692 142f0: a0 93 93 06 sts 0x0693, r26 ; 0x800693 142f4: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = PINDA_PREHEAT_Y; 142f8: 80 e0 ldi r24, 0x00 ; 0 142fa: 90 e0 ldi r25, 0x00 ; 0 142fc: a0 e7 ldi r26, 0x70 ; 112 142fe: b2 e4 ldi r27, 0x42 ; 66 14300: 80 93 95 06 sts 0x0695, r24 ; 0x800695 14304: 90 93 96 06 sts 0x0696, r25 ; 0x800696 14308: a0 93 97 06 sts 0x0697, r26 ; 0x800697 1430c: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(3000 / 60); 14310: 60 e0 ldi r22, 0x00 ; 0 14312: 70 e0 ldi r23, 0x00 ; 0 14314: 88 e4 ldi r24, 0x48 ; 72 14316: 92 e4 ldi r25, 0x42 ; 66 14318: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[Z_AXIS] = PINDA_PREHEAT_Z; 1431c: 8a e9 ldi r24, 0x9A ; 154 1431e: 99 e9 ldi r25, 0x99 ; 153 14320: a9 e1 ldi r26, 0x19 ; 25 14322: be e3 ldi r27, 0x3E ; 62 14324: 80 93 99 06 sts 0x0699, r24 ; 0x800699 14328: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 1432c: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 14330: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 14334: 60 e0 ldi r22, 0x00 ; 0 14336: 70 e0 ldi r23, 0x00 ; 0 14338: 88 e4 ldi r24, 0x48 ; 72 1433a: 92 e4 ldi r25, 0x42 ; 66 1433c: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 14340: 0f 94 a9 43 call 0x28752 ; 0x28752 14344: 0f 90 pop r0 14346: 0f 90 pop r0 14348: 0f 90 pop r0 1434a: 0f 90 pop r0 1434c: 0f 90 pop r0 1434e: 0f 90 pop r0 while (current_temperature_pinda < start_temp) 14350: 20 91 97 03 lds r18, 0x0397 ; 0x800397 14354: 30 91 98 03 lds r19, 0x0398 ; 0x800398 14358: 40 91 99 03 lds r20, 0x0399 ; 0x800399 1435c: 50 91 9a 03 lds r21, 0x039A ; 0x80039a 14360: 62 2d mov r22, r2 14362: 73 2d mov r23, r3 14364: 8e 2d mov r24, r14 14366: 9f 2d mov r25, r15 14368: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1436c: 18 16 cp r1, r24 1436e: 3c f4 brge .+14 ; 0x1437e { delay_keep_alive(1000); 14370: 88 ee ldi r24, 0xE8 ; 232 14372: 93 e0 ldi r25, 0x03 ; 3 14374: 0e 94 84 8c call 0x11908 ; 0x11908 serialecho_temperatures(); 14378: 0e 94 f6 76 call 0xedec ; 0xedec 1437c: e9 cf rjmp .-46 ; 0x14350 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1437e: 60 e0 ldi r22, 0x00 ; 0 14380: 86 ea ldi r24, 0xA6 ; 166 14382: 9f e0 ldi r25, 0x0F ; 15 14384: 0f 94 34 dc call 0x3b868 ; 0x3b868 } 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; 14388: 80 e0 ldi r24, 0x00 ; 0 1438a: 90 e0 ldi r25, 0x00 ; 0 1438c: a0 ea ldi r26, 0xA0 ; 160 1438e: b0 e4 ldi r27, 0x40 ; 64 14390: 80 93 99 06 sts 0x0699, r24 ; 0x800699 14394: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 14398: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 1439c: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 143a0: 60 e0 ldi r22, 0x00 ; 0 143a2: 70 e0 ldi r23, 0x00 ; 0 143a4: 88 e4 ldi r24, 0x48 ; 72 143a6: 92 e4 ldi r25, 0x42 ; 66 143a8: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 143ac: ef e1 ldi r30, 0x1F ; 31 143ae: f5 ea ldi r31, 0xA5 ; 165 143b0: 85 91 lpm r24, Z+ 143b2: 95 91 lpm r25, Z+ 143b4: a5 91 lpm r26, Z+ 143b6: b4 91 lpm r27, Z 143b8: 80 93 91 06 sts 0x0691, r24 ; 0x800691 143bc: 90 93 92 06 sts 0x0692, r25 ; 0x800692 143c0: a0 93 93 06 sts 0x0693, r26 ; 0x800693 143c4: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 143c8: e3 e2 ldi r30, 0x23 ; 35 143ca: f5 ea ldi r31, 0xA5 ; 165 143cc: 85 91 lpm r24, Z+ 143ce: 95 91 lpm r25, Z+ 143d0: a5 91 lpm r26, Z+ 143d2: b4 91 lpm r27, Z 143d4: 80 93 95 06 sts 0x0695, r24 ; 0x800695 143d8: 90 93 96 06 sts 0x0696, r25 ; 0x800696 143dc: a0 93 97 06 sts 0x0697, r26 ; 0x800697 143e0: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(3000 / 60); 143e4: 60 e0 ldi r22, 0x00 ; 0 143e6: 70 e0 ldi r23, 0x00 ; 0 143e8: 88 e4 ldi r24, 0x48 ; 72 143ea: 92 e4 ldi r25, 0x42 ; 66 143ec: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 143f0: 0f 94 a9 43 call 0x28752 ; 0x28752 bool find_z_result = find_bed_induction_sensor_point_z(-1.f); 143f4: 43 e0 ldi r20, 0x03 ; 3 143f6: 60 e0 ldi r22, 0x00 ; 0 143f8: 70 e0 ldi r23, 0x00 ; 0 143fa: 80 e8 ldi r24, 0x80 ; 128 143fc: 9f eb ldi r25, 0xBF ; 191 143fe: 0f 94 4b 8c call 0x31896 ; 0x31896 if (find_z_result == false) { 14402: 81 11 cpse r24, r1 14404: 06 c0 rjmp .+12 ; 0x14412 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); 14406: 0f 94 18 21 call 0x24230 ; 0x24230 homing_flag = false; 1440a: 10 92 a6 0d sts 0x0DA6, r1 ; 0x800da6 1440e: 0c 94 1b 9a jmp 0x13436 ; 0x13436 if (find_z_result == false) { lcd_temp_cal_show_result(find_z_result); homing_flag = false; break; } zero_z = current_position[Z_AXIS]; 14412: 90 91 99 06 lds r25, 0x0699 ; 0x800699 14416: 67 96 adiw r28, 0x17 ; 23 14418: 9f af std Y+63, r25 ; 0x3f 1441a: 67 97 sbiw r28, 0x17 ; 23 1441c: a0 91 9a 06 lds r26, 0x069A ; 0x80069a 14420: 6b 96 adiw r28, 0x1b ; 27 14422: af af std Y+63, r26 ; 0x3f 14424: 6b 97 sbiw r28, 0x1b ; 27 14426: b0 91 9b 06 lds r27, 0x069B ; 0x80069b 1442a: 6f 96 adiw r28, 0x1f ; 31 1442c: bf af std Y+63, r27 ; 0x3f 1442e: 6f 97 sbiw r28, 0x1f ; 31 14430: e0 91 9c 06 lds r30, 0x069C ; 0x80069c 14434: a7 96 adiw r28, 0x27 ; 39 14436: ef af std Y+63, r30 ; 0x3f 14438: a7 97 sbiw r28, 0x27 ; 39 printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]); 1443a: ef 93 push r30 1443c: bf 93 push r27 1443e: af 93 push r26 14440: 9f 93 push r25 14442: 8a e6 ldi r24, 0x6A ; 106 14444: 99 e6 ldi r25, 0x69 ; 105 14446: 9f 93 push r25 14448: 8f 93 push r24 1444a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 1444e: 0f 90 pop r0 14450: 0f 90 pop r0 14452: 0f 90 pop r0 14454: 0f 90 pop r0 14456: 0f 90 pop r0 14458: 0f 90 pop r0 1445a: 4e ea ldi r20, 0xAE ; 174 1445c: 84 2e mov r8, r20 1445e: 4f e0 ldi r20, 0x0F ; 15 14460: 94 2e mov r9, r20 14462: 53 e2 ldi r21, 0x23 ; 35 14464: c5 2e mov r12, r21 14466: d1 2c mov r13, r1 int i = -1; for (; i < 5; i++) 14468: 0f ef ldi r16, 0xFF ; 255 1446a: 1f ef ldi r17, 0xFF ; 255 { float temp = (40 + i * 5); 1446c: b6 01 movw r22, r12 1446e: 0d 2c mov r0, r13 14470: 00 0c add r0, r0 14472: 88 0b sbc r24, r24 14474: 99 0b sbc r25, r25 14476: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1447a: 2b 01 movw r4, r22 1447c: 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)); 1447e: df 92 push r13 14480: cf 92 push r12 14482: c8 01 movw r24, r16 14484: 02 96 adiw r24, 0x02 ; 2 14486: 9f 93 push r25 14488: 8f 93 push r24 1448a: 2e e2 ldi r18, 0x2E ; 46 1448c: 39 e6 ldi r19, 0x69 ; 105 1448e: 3f 93 push r19 14490: 2f 93 push r18 14492: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 14496: 58 01 movw r10, r16 14498: 5f ef ldi r21, 0xFF ; 255 1449a: a5 1a sub r10, r21 1449c: b5 0a sbc r11, r21 if (i >= 0) { 1449e: 0f 90 pop r0 144a0: 0f 90 pop r0 144a2: 0f 90 pop r0 144a4: 0f 90 pop r0 144a6: 0f 90 pop r0 144a8: 0f 90 pop r0 144aa: 11 f4 brne .+4 ; 0x144b0 144ac: 0c 94 32 cd jmp 0x19a64 ; 0x19a64 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 144b0: 70 e0 ldi r23, 0x00 ; 0 144b2: 60 e0 ldi r22, 0x00 ; 0 144b4: c4 01 movw r24, r8 144b6: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } if (start_temp <= temp) break; 144ba: a3 01 movw r20, r6 144bc: 92 01 movw r18, r4 144be: 62 2d mov r22, r2 144c0: 73 2d mov r23, r3 144c2: 8e 2d mov r24, r14 144c4: 9f 2d mov r25, r15 144c6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 144ca: 18 16 cp r1, r24 144cc: 44 f4 brge .+16 ; 0x144de } zero_z = current_position[Z_AXIS]; printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]); int i = -1; for (; i < 5; i++) 144ce: 85 e0 ldi r24, 0x05 ; 5 144d0: a8 16 cp r10, r24 144d2: b1 04 cpc r11, r1 144d4: 11 f0 breq .+4 ; 0x144da 144d6: 0c 94 3e cd jmp 0x19a7c ; 0x19a7c 144da: 05 e0 ldi r16, 0x05 ; 5 144dc: 10 e0 ldi r17, 0x00 ; 0 144de: 58 01 movw r10, r16 144e0: 97 e2 ldi r25, 0x27 ; 39 144e2: a9 1a sub r10, r25 144e4: 98 ef ldi r25, 0xF8 ; 248 144e6: b9 0a sbc r11, r25 144e8: aa 0c add r10, r10 144ea: bb 1c adc r11, r11 144ec: 85 e0 ldi r24, 0x05 ; 5 144ee: 80 9f mul r24, r16 144f0: 10 01 movw r2, r0 144f2: 81 9f mul r24, r17 144f4: 30 0c add r3, r0 144f6: 11 24 eor r1, r1 144f8: 0d 5f subi r16, 0xFD ; 253 144fa: 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; 144fc: 2a e9 ldi r18, 0x9A ; 154 144fe: 42 2e mov r4, r18 14500: 29 e9 ldi r18, 0x99 ; 153 14502: 52 2e mov r5, r18 14504: 29 e1 ldi r18, 0x19 ; 25 14506: 62 2e mov r6, r18 14508: 2e e3 ldi r18, 0x3E ; 62 1450a: 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); 1450c: 35 ef ldi r19, 0xF5 ; 245 1450e: 83 2e mov r8, r19 14510: 38 e6 ldi r19, 0x68 ; 104 14512: 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++) 14514: c8 01 movw r24, r16 14516: 02 97 sbiw r24, 0x02 ; 2 14518: 05 97 sbiw r24, 0x05 ; 5 1451a: 0c f0 brlt .+2 ; 0x1451e 1451c: d4 c0 rjmp .+424 ; 0x146c6 { float temp = (40 + i * 5); 1451e: b1 01 movw r22, r2 14520: 63 5d subi r22, 0xD3 ; 211 14522: 7f 4f sbci r23, 0xFF ; 255 14524: 07 2e mov r0, r23 14526: 00 0c add r0, r0 14528: 88 0b sbc r24, r24 1452a: 99 0b sbc r25, r25 1452c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 14530: 6b 01 movw r12, r22 14532: 7c 01 movw r14, r24 printf_P(_N("\nStep: %d/6\n"), i + 2); 14534: 1f 93 push r17 14536: 0f 93 push r16 14538: a1 e2 ldi r26, 0x21 ; 33 1453a: b9 e6 ldi r27, 0x69 ; 105 1453c: bf 93 push r27 1453e: af 93 push r26 14540: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 custom_message_state = i + 2; 14544: 00 93 f6 03 sts 0x03F6, r16 ; 0x8003f6 setTargetBed(50 + 10 * (temp - 30) / 5); 14548: 20 e0 ldi r18, 0x00 ; 0 1454a: 30 e0 ldi r19, 0x00 ; 0 1454c: 40 ef ldi r20, 0xF0 ; 240 1454e: 51 e4 ldi r21, 0x41 ; 65 14550: c7 01 movw r24, r14 14552: b6 01 movw r22, r12 14554: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 14558: 20 e0 ldi r18, 0x00 ; 0 1455a: 30 e0 ldi r19, 0x00 ; 0 1455c: 40 e2 ldi r20, 0x20 ; 32 1455e: 51 e4 ldi r21, 0x41 ; 65 14560: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 14564: 20 e0 ldi r18, 0x00 ; 0 14566: 30 e0 ldi r19, 0x00 ; 0 14568: 40 ea ldi r20, 0xA0 ; 160 1456a: 50 e4 ldi r21, 0x40 ; 64 1456c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 14570: 20 e0 ldi r18, 0x00 ; 0 14572: 30 e0 ldi r19, 0x00 ; 0 14574: 48 e4 ldi r20, 0x48 ; 72 14576: 52 e4 ldi r21, 0x42 ; 66 14578: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1457c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 14580: 70 93 72 06 sts 0x0672, r23 ; 0x800672 14584: 60 93 71 06 sts 0x0671, r22 ; 0x800671 current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 14588: 80 e0 ldi r24, 0x00 ; 0 1458a: 90 e0 ldi r25, 0x00 ; 0 1458c: a0 ea ldi r26, 0xA0 ; 160 1458e: b0 e4 ldi r27, 0x40 ; 64 14590: 80 93 99 06 sts 0x0699, r24 ; 0x800699 14594: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 14598: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 1459c: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 145a0: 60 e0 ldi r22, 0x00 ; 0 145a2: 70 e0 ldi r23, 0x00 ; 0 145a4: 88 e4 ldi r24, 0x48 ; 72 145a6: 92 e4 ldi r25, 0x42 ; 66 145a8: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[X_AXIS] = PINDA_PREHEAT_X; 145ac: 20 e0 ldi r18, 0x00 ; 0 145ae: 30 e0 ldi r19, 0x00 ; 0 145b0: 40 ea ldi r20, 0xA0 ; 160 145b2: 51 e4 ldi r21, 0x41 ; 65 145b4: 20 93 91 06 sts 0x0691, r18 ; 0x800691 145b8: 30 93 92 06 sts 0x0692, r19 ; 0x800692 145bc: 40 93 93 06 sts 0x0693, r20 ; 0x800693 145c0: 50 93 94 06 sts 0x0694, r21 ; 0x800694 current_position[Y_AXIS] = PINDA_PREHEAT_Y; 145c4: 80 e0 ldi r24, 0x00 ; 0 145c6: 90 e0 ldi r25, 0x00 ; 0 145c8: a0 e7 ldi r26, 0x70 ; 112 145ca: b2 e4 ldi r27, 0x42 ; 66 145cc: 80 93 95 06 sts 0x0695, r24 ; 0x800695 145d0: 90 93 96 06 sts 0x0696, r25 ; 0x800696 145d4: a0 93 97 06 sts 0x0697, r26 ; 0x800697 145d8: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(3000 / 60); 145dc: 60 e0 ldi r22, 0x00 ; 0 145de: 70 e0 ldi r23, 0x00 ; 0 145e0: 88 e4 ldi r24, 0x48 ; 72 145e2: 92 e4 ldi r25, 0x42 ; 66 145e4: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[Z_AXIS] = PINDA_PREHEAT_Z; 145e8: 40 92 99 06 sts 0x0699, r4 ; 0x800699 145ec: 50 92 9a 06 sts 0x069A, r5 ; 0x80069a 145f0: 60 92 9b 06 sts 0x069B, r6 ; 0x80069b 145f4: 70 92 9c 06 sts 0x069C, r7 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 145f8: 60 e0 ldi r22, 0x00 ; 0 145fa: 70 e0 ldi r23, 0x00 ; 0 145fc: 88 e4 ldi r24, 0x48 ; 72 145fe: 92 e4 ldi r25, 0x42 ; 66 14600: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 14604: 0f 94 a9 43 call 0x28752 ; 0x28752 14608: 0f 90 pop r0 1460a: 0f 90 pop r0 1460c: 0f 90 pop r0 1460e: 0f 90 pop r0 while (current_temperature_pinda < temp) 14610: 20 91 97 03 lds r18, 0x0397 ; 0x800397 14614: 30 91 98 03 lds r19, 0x0398 ; 0x800398 14618: 40 91 99 03 lds r20, 0x0399 ; 0x800399 1461c: 50 91 9a 03 lds r21, 0x039A ; 0x80039a 14620: c7 01 movw r24, r14 14622: b6 01 movw r22, r12 14624: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 14628: 18 16 cp r1, r24 1462a: 3c f4 brge .+14 ; 0x1463a { delay_keep_alive(1000); 1462c: 88 ee ldi r24, 0xE8 ; 232 1462e: 93 e0 ldi r25, 0x03 ; 3 14630: 0e 94 84 8c call 0x11908 ; 0x11908 serialecho_temperatures(); 14634: 0e 94 f6 76 call 0xedec ; 0xedec 14638: eb cf rjmp .-42 ; 0x14610 } current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 1463a: 80 e0 ldi r24, 0x00 ; 0 1463c: 90 e0 ldi r25, 0x00 ; 0 1463e: a0 ea ldi r26, 0xA0 ; 160 14640: b0 e4 ldi r27, 0x40 ; 64 14642: 80 93 99 06 sts 0x0699, r24 ; 0x800699 14646: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 1464a: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 1464e: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(3000 / 60); 14652: 60 e0 ldi r22, 0x00 ; 0 14654: 70 e0 ldi r23, 0x00 ; 0 14656: 88 e4 ldi r24, 0x48 ; 72 14658: 92 e4 ldi r25, 0x42 ; 66 1465a: 0f 94 3d c0 call 0x3807a ; 0x3807a current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 1465e: ef e1 ldi r30, 0x1F ; 31 14660: f5 ea ldi r31, 0xA5 ; 165 14662: 85 91 lpm r24, Z+ 14664: 95 91 lpm r25, Z+ 14666: a5 91 lpm r26, Z+ 14668: b4 91 lpm r27, Z 1466a: 80 93 91 06 sts 0x0691, r24 ; 0x800691 1466e: 90 93 92 06 sts 0x0692, r25 ; 0x800692 14672: a0 93 93 06 sts 0x0693, r26 ; 0x800693 14676: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1); 1467a: e3 e2 ldi r30, 0x23 ; 35 1467c: f5 ea ldi r31, 0xA5 ; 165 1467e: 85 91 lpm r24, Z+ 14680: 95 91 lpm r25, Z+ 14682: a5 91 lpm r26, Z+ 14684: b4 91 lpm r27, Z 14686: 80 93 95 06 sts 0x0695, r24 ; 0x800695 1468a: 90 93 96 06 sts 0x0696, r25 ; 0x800696 1468e: a0 93 97 06 sts 0x0697, r26 ; 0x800697 14692: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(3000 / 60); 14696: 60 e0 ldi r22, 0x00 ; 0 14698: 70 e0 ldi r23, 0x00 ; 0 1469a: 88 e4 ldi r24, 0x48 ; 72 1469c: 92 e4 ldi r25, 0x42 ; 66 1469e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 146a2: 0f 94 a9 43 call 0x28752 ; 0x28752 find_z_result = find_bed_induction_sensor_point_z(-1.f); 146a6: 43 e0 ldi r20, 0x03 ; 3 146a8: 60 e0 ldi r22, 0x00 ; 0 146aa: 70 e0 ldi r23, 0x00 ; 0 146ac: 80 e8 ldi r24, 0x80 ; 128 146ae: 9f eb ldi r25, 0xBF ; 191 146b0: 0f 94 4b 8c call 0x31896 ; 0x31896 146b4: 95 e0 ldi r25, 0x05 ; 5 146b6: 29 0e add r2, r25 146b8: 31 1c adc r3, r1 146ba: 0f 5f subi r16, 0xFF ; 255 146bc: 1f 4f sbci r17, 0xFF ; 255 if (find_z_result == false) { 146be: 81 11 cpse r24, r1 146c0: 04 c0 rjmp .+8 ; 0x146ca lcd_temp_cal_show_result(find_z_result); 146c2: 0f 94 18 21 call 0x24230 ; 0x24230 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); 146c6: 81 e0 ldi r24, 0x01 ; 1 146c8: 9e ce rjmp .-708 ; 0x14406 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]); 146ca: 67 96 adiw r28, 0x17 ; 23 146cc: 7f ad ldd r23, Y+63 ; 0x3f 146ce: 67 97 sbiw r28, 0x17 ; 23 146d0: 6b 96 adiw r28, 0x1b ; 27 146d2: 6f ad ldd r22, Y+63 ; 0x3f 146d4: 6b 97 sbiw r28, 0x1b ; 27 146d6: 6f 96 adiw r28, 0x1f ; 31 146d8: 9f ad ldd r25, Y+63 ; 0x3f 146da: 6f 97 sbiw r28, 0x1f ; 31 146dc: a7 96 adiw r28, 0x27 ; 39 146de: 8f ad ldd r24, Y+63 ; 0x3f 146e0: a7 97 sbiw r28, 0x27 ; 39 146e2: 27 2f mov r18, r23 146e4: 36 2f mov r19, r22 146e6: 49 2f mov r20, r25 146e8: 58 2f mov r21, r24 146ea: 60 91 99 06 lds r22, 0x0699 ; 0x800699 146ee: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 146f2: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 146f6: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 146fa: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 146fe: f6 2e mov r15, r22 14700: e7 2e mov r14, r23 14702: d8 2e mov r13, r24 14704: c9 2e mov r12, r25 14706: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 1470a: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 1470e: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 14712: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 14716: d7 01 movw r26, r14 14718: f6 01 movw r30, r12 1471a: 6b 2f mov r22, r27 1471c: 7a 2f mov r23, r26 1471e: 8f 2f mov r24, r31 14720: 9e 2f mov r25, r30 14722: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 14726: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1472a: a6 96 adiw r28, 0x26 ; 38 1472c: 6c af std Y+60, r22 ; 0x3c 1472e: 7d af std Y+61, r23 ; 0x3d 14730: 8e af std Y+62, r24 ; 0x3e 14732: 9f af std Y+63, r25 ; 0x3f 14734: a6 97 sbiw r28, 0x26 ; 38 printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z); 14736: cf 92 push r12 14738: df 92 push r13 1473a: ef 92 push r14 1473c: ff 92 push r15 1473e: 80 91 9a 03 lds r24, 0x039A ; 0x80039a 14742: 8f 93 push r24 14744: 80 91 99 03 lds r24, 0x0399 ; 0x800399 14748: 8f 93 push r24 1474a: 80 91 98 03 lds r24, 0x0398 ; 0x800398 1474e: 8f 93 push r24 14750: 80 91 97 03 lds r24, 0x0397 ; 0x800397 14754: 8f 93 push r24 14756: 9f 92 push r9 14758: 8f 92 push r8 1475a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 1475e: a4 96 adiw r28, 0x24 ; 36 14760: 6e ad ldd r22, Y+62 ; 0x3e 14762: 7f ad ldd r23, Y+63 ; 0x3f 14764: a4 97 sbiw r28, 0x24 ; 36 14766: c5 01 movw r24, r10 14768: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 1476c: a2 e0 ldi r26, 0x02 ; 2 1476e: aa 0e add r10, r26 14770: b1 1c adc r11, r1 14772: 0f b6 in r0, 0x3f ; 63 14774: f8 94 cli 14776: de bf out 0x3e, r29 ; 62 14778: 0f be out 0x3f, r0 ; 63 1477a: cd bf out 0x3d, r28 ; 61 1477c: cb ce rjmp .-618 ; 0x14514 This G-code will be performed at the start of a calibration script. (Prusa3D specific) */ case 86: calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 1477e: 80 e1 ldi r24, 0x10 ; 16 14780: 0e 94 f6 ee call 0x1ddec ; 0x1ddec 14784: 0c 94 1b 9a jmp 0x13436 ; 0x13436 This G-code will be performed at the end of a calibration script. (Prusa3D specific) */ case 87: calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST); 14788: 80 e1 ldi r24, 0x10 ; 16 1478a: 0e 94 4b ef call 0x1de96 ; 0x1de96 1478e: 0c 94 1b 9a jmp 0x13436 ; 0x13436 /*! ### 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); 14792: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 14796: 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; 14798: 80 93 e3 03 sts 0x03E3, r24 ; 0x8003e3 1479c: 0c 94 1b 9a jmp 0x13436 ; 0x13436 147a0: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 147a4: 87 60 ori r24, 0x07 ; 7 147a6: f8 cf rjmp .-16 ; 0x14798 plan_reset_next_e(); } else { // In any other case we're forced to synchronize st_synchronize(); 147a8: 0f 94 a9 43 call 0x28752 ; 0x28752 147ac: f1 2c mov r15, r1 147ae: e1 2c mov r14, r1 for(uint8_t i = 0; i < 3; ++i) { if(codes[i]) 147b0: f8 01 movw r30, r16 147b2: 81 91 ld r24, Z+ 147b4: 8f 01 movw r16, r30 147b6: 88 23 and r24, r24 147b8: d1 f0 breq .+52 ; 0x147ee current_position[i] = values[i] + cs.add_homing[i]; 147ba: 97 01 movw r18, r14 147bc: 2f 56 subi r18, 0x6F ; 111 147be: 39 4f sbci r19, 0xF9 ; 249 147c0: 59 01 movw r10, r18 147c2: f3 01 movw r30, r6 147c4: ee 0d add r30, r14 147c6: ff 1d adc r31, r15 147c8: 20 81 ld r18, Z 147ca: 31 81 ldd r19, Z+1 ; 0x01 147cc: 42 81 ldd r20, Z+2 ; 0x02 147ce: 53 81 ldd r21, Z+3 ; 0x03 147d0: f7 01 movw r30, r14 147d2: eb 5e subi r30, 0xEB ; 235 147d4: f1 4f sbci r31, 0xF1 ; 241 147d6: 60 81 ld r22, Z 147d8: 71 81 ldd r23, Z+1 ; 0x01 147da: 82 81 ldd r24, Z+2 ; 0x02 147dc: 93 81 ldd r25, Z+3 ; 0x03 147de: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 147e2: d5 01 movw r26, r10 147e4: 6d 93 st X+, r22 147e6: 7d 93 st X+, r23 147e8: 8d 93 st X+, r24 147ea: 9c 93 st X, r25 147ec: 13 97 sbiw r26, 0x03 ; 3 147ee: b4 e0 ldi r27, 0x04 ; 4 147f0: eb 0e add r14, r27 147f2: 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) 147f4: ec e0 ldi r30, 0x0C ; 12 147f6: ee 16 cp r14, r30 147f8: f1 04 cpc r15, r1 147fa: d1 f6 brne .-76 ; 0x147b0 { if(codes[i]) current_position[i] = values[i] + cs.add_homing[i]; } if(codes[E_AXIS]) 147fc: dd 20 and r13, r13 147fe: 61 f0 breq .+24 ; 0x14818 current_position[E_AXIS] = values[E_AXIS]; 14800: 8d 85 ldd r24, Y+13 ; 0x0d 14802: 9e 85 ldd r25, Y+14 ; 0x0e 14804: af 85 ldd r26, Y+15 ; 0x0f 14806: b8 89 ldd r27, Y+16 ; 0x10 14808: 80 93 9d 06 sts 0x069D, r24 ; 0x80069d 1480c: 90 93 9e 06 sts 0x069E, r25 ; 0x80069e 14810: a0 93 9f 06 sts 0x069F, r26 ; 0x80069f 14814: b0 93 a0 06 sts 0x06A0, r27 ; 0x8006a0 // Set all at once plan_set_position_curposXYZE(); 14818: 0f 94 fd be call 0x37dfa ; 0x37dfa 1481c: 0c 94 1b 9a jmp 0x13436 ; 0x13436 /*! --------------------------------------------------------------------------------- # M Commands */ else if(*CMDBUFFER_CURRENT_STRING == 'M') 14820: 8d 34 cpi r24, 0x4D ; 77 14822: 11 f0 breq .+4 ; 0x14828 14824: 0c 94 a3 cb jmp 0x19746 ; 0x19746 { strchr_pointer = CMDBUFFER_CURRENT_STRING; 14828: 10 93 94 03 sts 0x0394, r17 ; 0x800394 1482c: 00 93 93 03 sts 0x0393, r16 ; 0x800393 14830: f8 01 movw r30, r16 14832: 31 96 adiw r30, 0x01 ; 1 int index; for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); 14834: 81 91 ld r24, Z+ 14836: 80 32 cpi r24, 0x20 ; 32 14838: e9 f3 breq .-6 ; 0x14834 1483a: 89 30 cpi r24, 0x09 ; 9 1483c: d9 f3 breq .-10 ; 0x14834 /*for (++strchr_pointer; *strchr_pointer == ' ' || *strchr_pointer == '\t'; ++strchr_pointer);*/ if (*(strchr_pointer+index) < '0' || *(strchr_pointer+index) > '9') { 1483e: 80 53 subi r24, 0x30 ; 48 14840: 8a 30 cpi r24, 0x0A ; 10 14842: 70 f0 brcs .+28 ; 0x14860 printf_P(PSTR("Invalid M code: %s\n"), cmdbuffer + bufindr + CMDHDRSIZE); 14844: 1f 93 push r17 14846: 0f 93 push r16 14848: 8d e3 ldi r24, 0x3D ; 61 1484a: 97 e8 ldi r25, 0x87 ; 135 1484c: 9f 93 push r25 1484e: 8f 93 push r24 14850: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 14854: 0f 90 pop r0 14856: 0f 90 pop r0 14858: 0f 90 pop r0 1485a: 0f 90 pop r0 1485c: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 } else { mcode_in_progress = code_value_short(); 14860: 0e 94 0d 5b call 0xb61a ; 0xb61a 14864: 90 93 aa 0d sts 0x0DAA, r25 ; 0x800daa <_ZL17mcode_in_progress.lto_priv.532+0x1> 14868: 80 93 a9 0d sts 0x0DA9, r24 ; 0x800da9 <_ZL17mcode_in_progress.lto_priv.532> // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 1486c: 89 3c cpi r24, 0xC9 ; 201 1486e: 91 05 cpc r25, r1 14870: 11 f4 brne .+4 ; 0x14876 14872: 0c 94 5c b8 jmp 0x170b8 ; 0x170b8 14876: 0c f0 brlt .+2 ; 0x1487a 14878: 40 c3 rjmp .+1664 ; 0x14efa 1487a: 8e 34 cpi r24, 0x4E ; 78 1487c: 91 05 cpc r25, r1 1487e: 11 f4 brne .+4 ; 0x14884 14880: 0c 94 be b3 jmp 0x1677c ; 0x1677c 14884: 0c f0 brlt .+2 ; 0x14888 14886: 35 c2 rjmp .+1130 ; 0x14cf2 14888: 8c 31 cpi r24, 0x1C ; 28 1488a: 91 05 cpc r25, r1 1488c: 11 f4 brne .+4 ; 0x14892 1488e: 0c 94 1d b2 jmp 0x1643a ; 0x1643a 14892: 0c f0 brlt .+2 ; 0x14896 14894: 00 c1 rjmp .+512 ; 0x14a96 14896: 85 31 cpi r24, 0x15 ; 21 14898: 91 05 cpc r25, r1 1489a: 11 f4 brne .+4 ; 0x148a0 1489c: 0c 94 36 b1 jmp 0x1626c ; 0x1626c 148a0: 0c f0 brlt .+2 ; 0x148a4 148a2: 5e c0 rjmp .+188 ; 0x14960 148a4: 81 31 cpi r24, 0x11 ; 17 148a6: 91 05 cpc r25, r1 148a8: 11 f4 brne .+4 ; 0x148ae 148aa: 0c 94 2b b1 jmp 0x16256 ; 0x16256 148ae: ec f4 brge .+58 ; 0x148ea 148b0: 02 97 sbiw r24, 0x02 ; 2 148b2: 10 f4 brcc .+4 ; 0x148b8 148b4: 0c 94 9f b0 jmp 0x1613e ; 0x1613e /*! #### End of M-Commands */ default: printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE); 148b8: 80 91 91 12 lds r24, 0x1291 ; 0x801291 148bc: 90 91 92 12 lds r25, 0x1292 ; 0x801292 148c0: 89 55 subi r24, 0x59 ; 89 148c2: 9f 4e sbci r25, 0xEF ; 239 148c4: 9f 93 push r25 148c6: 8f 93 push r24 148c8: 1f 92 push r1 148ca: 8d e4 ldi r24, 0x4D ; 77 148cc: 8f 93 push r24 148ce: 80 ee ldi r24, 0xE0 ; 224 148d0: 98 e6 ldi r25, 0x68 ; 104 148d2: 9f 93 push r25 148d4: 8f 93 push r24 148d6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 148da: 0f 90 pop r0 148dc: 0f 90 pop r0 148de: 0f 90 pop r0 148e0: 0f 90 pop r0 148e2: 0f 90 pop r0 148e4: 0f 90 pop r0 148e6: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 148ea: 82 31 cpi r24, 0x12 ; 18 148ec: 91 05 cpc r25, r1 148ee: 11 f4 brne .+4 ; 0x148f4 148f0: 0c 94 75 b5 jmp 0x16aea ; 0x16aea 148f4: 44 97 sbiw r24, 0x14 ; 20 148f6: 01 f7 brne .-64 ; 0x148b8 #### 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() 148f8: 81 e0 ldi r24, 0x01 ; 1 148fa: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST 148fe: 80 ed ldi r24, 0xD0 ; 208 14900: 98 e6 ldi r25, 0x68 ; 104 14902: 0e 94 13 79 call 0xf226 ; 0xf226 card.ls(CardReader::ls_param(code_seen('L'), code_seen('T'))); 14906: 84 e5 ldi r24, 0x54 ; 84 14908: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1490c: 18 2f mov r17, r24 1490e: 8c e4 ldi r24, 0x4C ; 76 14910: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14914: 00 e0 ldi r16, 0x00 ; 0 14916: 80 fb bst r24, 0 14918: 00 f9 bld r16, 0 1491a: 10 fb bst r17, 0 1491c: 01 f9 bld r16, 1 } // while readDir } void CardReader::ls(ls_param params) { root.rewind(); 1491e: 85 e1 ldi r24, 0x15 ; 21 14920: 95 e1 ldi r25, 0x15 ; 21 14922: 0e 94 c4 76 call 0xed88 ; 0xed88 lsDive("",root, NULL, LS_SerialPrint, params); 14926: 83 e2 ldi r24, 0x23 ; 35 14928: e5 e1 ldi r30, 0x15 ; 21 1492a: f5 e1 ldi r31, 0x15 ; 21 1492c: de 01 movw r26, r28 1492e: 11 96 adiw r26, 0x01 ; 1 14930: 01 90 ld r0, Z+ 14932: 0d 92 st X+, r0 14934: 8a 95 dec r24 14936: e1 f7 brne .-8 ; 0x14930 14938: 20 e0 ldi r18, 0x00 ; 0 1493a: 50 e0 ldi r21, 0x00 ; 0 1493c: 40 e0 ldi r20, 0x00 ; 0 1493e: be 01 movw r22, r28 14940: 6f 5f subi r22, 0xFF ; 255 14942: 7f 4f sbci r23, 0xFF ; 255 14944: 86 ef ldi r24, 0xF6 ; 246 14946: 92 e0 ldi r25, 0x02 ; 2 14948: 0f 94 06 78 call 0x2f00c ; 0x2f00c 1494c: ce 01 movw r24, r28 1494e: 01 96 adiw r24, 0x01 ; 1 14950: 0e 94 c9 76 call 0xed92 ; 0xed92 SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST 14954: 82 ec ldi r24, 0xC2 ; 194 14956: 98 e6 ldi r25, 0x68 ; 104 14958: 0e 94 13 79 call 0xf226 ; 0xf226 1495c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14960: 88 31 cpi r24, 0x18 ; 24 14962: 91 05 cpc r25, r1 14964: 11 f4 brne .+4 ; 0x1496a 14966: 0c 94 47 b1 jmp 0x1628e ; 0x1628e 1496a: 94 f4 brge .+36 ; 0x14990 1496c: 86 31 cpi r24, 0x16 ; 22 1496e: 91 05 cpc r25, r1 14970: 11 f4 brne .+4 ; 0x14976 14972: 0c 94 3a b1 jmp 0x16274 ; 0x16274 14976: 47 97 sbiw r24, 0x17 ; 23 14978: 09 f0 breq .+2 ; 0x1497c 1497a: 9e cf rjmp .-196 ; 0x148b8 M23 [filename] */ case 23: card.openFileReadFilteredGcode(strchr_pointer + 4, true); 1497c: 80 91 93 03 lds r24, 0x0393 ; 0x800393 14980: 90 91 94 03 lds r25, 0x0394 ; 0x800394 14984: 61 e0 ldi r22, 0x01 ; 1 14986: 04 96 adiw r24, 0x04 ; 4 14988: 0f 94 42 80 call 0x30084 ; 0x30084 1498c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14990: 8a 31 cpi r24, 0x1A ; 26 14992: 91 05 cpc r25, r1 14994: 11 f4 brne .+4 ; 0x1499a 14996: 0c 94 8d b1 jmp 0x1631a ; 0x1631a 1499a: 14 f0 brlt .+4 ; 0x149a0 1499c: 0c 94 af b1 jmp 0x1635e ; 0x1635e 149a0: 0d ed ldi r16, 0xDD ; 221 149a2: 12 e0 ldi r17, 0x02 ; 2 149a4: ff e3 ldi r31, 0x3F ; 63 149a6: af 2e mov r10, r31 149a8: f2 e0 ldi r31, 0x02 ; 2 149aa: bf 2e mov r11, r31 149ac: a1 e2 ldi r26, 0x21 ; 33 149ae: ca 2e mov r12, r26 149b0: a2 e0 ldi r26, 0x02 ; 2 149b2: da 2e mov r13, r26 149b4: b5 e1 ldi r27, 0x15 ; 21 149b6: eb 2e mov r14, r27 149b8: b2 e0 ldi r27, 0x02 ; 2 149ba: fb 2e mov r15, r27 149bc: 80 ee ldi r24, 0xE0 ; 224 149be: 88 2e mov r8, r24 149c0: 82 e0 ldi r24, 0x02 ; 2 149c2: 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])) { 149c4: f8 01 movw r30, r16 149c6: 81 91 ld r24, Z+ 149c8: 8f 01 movw r16, r30 149ca: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 149ce: 88 23 and r24, r24 149d0: 21 f1 breq .+72 ; 0x14a1a //Check that the positions are within hardware limits pause_position[axis] = constrain(code_value(), min_pos[axis], max_pos[axis]); 149d2: 0e 94 35 60 call 0xc06a ; 0xc06a 149d6: d6 01 movw r26, r12 149d8: 4d 90 ld r4, X+ 149da: 5d 90 ld r5, X+ 149dc: 6d 90 ld r6, X+ 149de: 7c 90 ld r7, X 149e0: a3 01 movw r20, r6 149e2: 92 01 movw r18, r4 149e4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 149e8: 87 fd sbrc r24, 7 149ea: 11 c0 rjmp .+34 ; 0x14a0e 149ec: 0e 94 35 60 call 0xc06a ; 0xc06a 149f0: f7 01 movw r30, r14 149f2: 40 80 ld r4, Z 149f4: 51 80 ldd r5, Z+1 ; 0x01 149f6: 62 80 ldd r6, Z+2 ; 0x02 149f8: 73 80 ldd r7, Z+3 ; 0x03 149fa: a3 01 movw r20, r6 149fc: 92 01 movw r18, r4 149fe: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 14a02: 18 16 cp r1, r24 14a04: 24 f0 brlt .+8 ; 0x14a0e 14a06: 0e 94 35 60 call 0xc06a ; 0xc06a 14a0a: 2b 01 movw r4, r22 14a0c: 3c 01 movw r6, r24 14a0e: d5 01 movw r26, r10 14a10: 4d 92 st X+, r4 14a12: 5d 92 st X+, r5 14a14: 6d 92 st X+, r6 14a16: 7c 92 st X, r7 14a18: 13 97 sbiw r26, 0x03 ; 3 14a1a: b4 e0 ldi r27, 0x04 ; 4 14a1c: ab 0e add r10, r27 14a1e: b1 1c adc r11, r1 14a20: e4 e0 ldi r30, 0x04 ; 4 14a22: ce 0e add r12, r30 14a24: d1 1c adc r13, r1 14a26: f4 e0 ldi r31, 0x04 ; 4 14a28: ef 0e add r14, r31 14a2a: 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++) { 14a2c: 80 16 cp r8, r16 14a2e: 91 06 cpc r9, r17 14a30: 49 f6 brne .-110 ; 0x149c4 //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')) { 14a32: 83 e5 ldi r24, 0x53 ; 83 14a34: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14a38: 88 23 and r24, r24 14a3a: 11 f4 brne .+4 ; 0x14a40 14a3c: 0c 94 21 c4 jmp 0x18842 ; 0x18842 if ( code_value_uint8() == 0 ) { 14a40: 0e 94 00 5b call 0xb600 ; 0xb600 14a44: 81 11 cpse r24, r1 14a46: 0c 94 83 b0 jmp 0x16106 ; 0x16106 pause_position[X_AXIS] = X_PAUSE_POS; 14a4a: 80 e0 ldi r24, 0x00 ; 0 14a4c: 90 e0 ldi r25, 0x00 ; 0 14a4e: a8 e4 ldi r26, 0x48 ; 72 14a50: b2 e4 ldi r27, 0x42 ; 66 14a52: 80 93 3f 02 sts 0x023F, r24 ; 0x80023f <_ZL14pause_position.lto_priv.483> 14a56: 90 93 40 02 sts 0x0240, r25 ; 0x800240 <_ZL14pause_position.lto_priv.483+0x1> 14a5a: a0 93 41 02 sts 0x0241, r26 ; 0x800241 <_ZL14pause_position.lto_priv.483+0x2> 14a5e: b0 93 42 02 sts 0x0242, r27 ; 0x800242 <_ZL14pause_position.lto_priv.483+0x3> pause_position[Y_AXIS] = Y_PAUSE_POS; 14a62: 80 e0 ldi r24, 0x00 ; 0 14a64: 90 e0 ldi r25, 0x00 ; 0 14a66: ae e3 ldi r26, 0x3E ; 62 14a68: b3 e4 ldi r27, 0x43 ; 67 14a6a: 80 93 43 02 sts 0x0243, r24 ; 0x800243 <_ZL14pause_position.lto_priv.483+0x4> 14a6e: 90 93 44 02 sts 0x0244, r25 ; 0x800244 <_ZL14pause_position.lto_priv.483+0x5> 14a72: a0 93 45 02 sts 0x0245, r26 ; 0x800245 <_ZL14pause_position.lto_priv.483+0x6> 14a76: b0 93 46 02 sts 0x0246, r27 ; 0x800246 <_ZL14pause_position.lto_priv.483+0x7> pause_position[Z_AXIS] = Z_PAUSE_LIFT; 14a7a: 80 e0 ldi r24, 0x00 ; 0 14a7c: 90 e0 ldi r25, 0x00 ; 0 14a7e: a0 ea ldi r26, 0xA0 ; 160 14a80: b1 e4 ldi r27, 0x41 ; 65 14a82: 80 93 47 02 sts 0x0247, r24 ; 0x800247 <_ZL14pause_position.lto_priv.483+0x8> 14a86: 90 93 48 02 sts 0x0248, r25 ; 0x800248 <_ZL14pause_position.lto_priv.483+0x9> 14a8a: a0 93 49 02 sts 0x0249, r26 ; 0x800249 <_ZL14pause_position.lto_priv.483+0xa> 14a8e: b0 93 4a 02 sts 0x024A, r27 ; 0x80024a <_ZL14pause_position.lto_priv.483+0xb> 14a92: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14a96: 8d 32 cpi r24, 0x2D ; 45 14a98: 91 05 cpc r25, r1 14a9a: 11 f4 brne .+4 ; 0x14aa0 14a9c: 0c 94 c2 b2 jmp 0x16584 ; 0x16584 14aa0: 0c f0 brlt .+2 ; 0x14aa4 14aa2: f0 c0 rjmp .+480 ; 0x14c84 14aa4: 8f 31 cpi r24, 0x1F ; 31 14aa6: 91 05 cpc r25, r1 14aa8: 11 f4 brne .+4 ; 0x14aae 14aaa: 0c 94 4f b2 jmp 0x1649e ; 0x1649e 14aae: 0c f0 brlt .+2 ; 0x14ab2 14ab0: 6a c0 rjmp .+212 ; 0x14b86 14ab2: 8d 31 cpi r24, 0x1D ; 29 14ab4: 91 05 cpc r25, r1 14ab6: 11 f4 brne .+4 ; 0x14abc 14ab8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 14abc: 4e 97 sbiw r24, 0x1e ; 30 14abe: 09 f0 breq .+2 ; 0x14ac2 14ac0: fb ce rjmp .-522 ; 0x148b8 M30 [filename] */ case 30: if (card.mounted){ 14ac2: 80 91 90 14 lds r24, 0x1490 ; 0x801490 14ac6: 88 23 and r24, r24 14ac8: 11 f4 brne .+4 ; 0x14ace 14aca: 0c 94 83 b0 jmp 0x16106 ; 0x16106 lastnr++; } void CardReader::closefile(bool store_location) { file.sync(); 14ace: 8f e1 ldi r24, 0x1F ; 31 14ad0: 97 e1 ldi r25, 0x17 ; 23 14ad2: 0f 94 32 59 call 0x2b264 ; 0x2b264 file.close(); 14ad6: 8f e1 ldi r24, 0x1F ; 31 14ad8: 97 e1 ldi r25, 0x17 ; 23 14ada: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce saving = false; 14ade: 10 92 8d 14 sts 0x148D, r1 ; 0x80148d logging = false; 14ae2: 10 92 8e 14 sts 0x148E, r1 ; 0x80148e card.closefile(); card.removeFile(strchr_pointer + 4); 14ae6: 00 91 93 03 lds r16, 0x0393 ; 0x800393 14aea: 10 91 94 03 lds r17, 0x0394 ; 0x800394 14aee: 0c 5f subi r16, 0xFC ; 252 14af0: 1f 4f sbci r17, 0xFF ; 255 } } void CardReader::removeFile(const char* name) { if(!mounted) return; 14af2: 80 91 90 14 lds r24, 0x1490 ; 0x801490 14af6: 88 23 and r24, r24 14af8: 11 f4 brne .+4 ; 0x14afe 14afa: 0c 94 83 b0 jmp 0x16106 ; 0x16106 file.close(); 14afe: 8f e1 ldi r24, 0x1F ; 31 14b00: 97 e1 ldi r25, 0x17 ; 23 14b02: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce sdprinting = false; 14b06: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f const char *fname=name; 14b0a: 23 96 adiw r28, 0x03 ; 3 14b0c: 1f af std Y+63, r17 ; 0x3f 14b0e: 0e af std Y+62, r16 ; 0x3e 14b10: 23 97 sbiw r28, 0x03 ; 3 if (!diveSubfolder(fname)) 14b12: ce 01 movw r24, r28 14b14: 8f 5b subi r24, 0xBF ; 191 14b16: 9f 4f sbci r25, 0xFF ; 255 14b18: 0f 94 bd 7f call 0x2ff7a ; 0x2ff7a 14b1c: 88 23 and r24, r24 14b1e: 11 f4 brne .+4 ; 0x14b24 14b20: 0c 94 83 b0 jmp 0x16106 ; 0x16106 return; if (file.remove(curDir, fname)) 14b24: 23 96 adiw r28, 0x03 ; 3 14b26: 4e ad ldd r20, Y+62 ; 0x3e 14b28: 5f ad ldd r21, Y+63 ; 0x3f 14b2a: 23 97 sbiw r28, 0x03 ; 3 14b2c: 60 91 38 15 lds r22, 0x1538 ; 0x801538 14b30: 70 91 39 15 lds r23, 0x1539 ; 0x801539 * \brief Base class for SdFile with Print and C++ streams. */ class SdBaseFile { public: /** Create an instance. */ SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} 14b34: 19 82 std Y+1, r1 ; 0x01 14b36: 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; 14b38: 22 e0 ldi r18, 0x02 ; 2 14b3a: ce 01 movw r24, r28 14b3c: 01 96 adiw r24, 0x01 ; 1 14b3e: 0f 94 0f 65 call 0x2ca1e ; 0x2ca1e 14b42: 81 11 cpse r24, r1 14b44: 0c 94 25 b2 jmp 0x1644a ; 0x1644a return file.remove(); fail: // can't set iostate - static function return false; 14b48: 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; 14b4a: ce 01 movw r24, r28 14b4c: 01 96 adiw r24, 0x01 ; 1 14b4e: 0e 94 c9 76 call 0xed92 ; 0xed92 14b52: 11 23 and r17, r17 14b54: 11 f4 brne .+4 ; 0x14b5a 14b56: 0c 94 3f b2 jmp 0x1647e ; 0x1647e { SERIAL_PROTOCOLPGM("File deleted:"); 14b5a: 85 e6 ldi r24, 0x65 ; 101 14b5c: 94 e8 ldi r25, 0x84 ; 132 14b5e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(fname); 14b62: 23 96 adiw r28, 0x03 ; 3 14b64: 8e ad ldd r24, Y+62 ; 0x3e 14b66: 9f ad ldd r25, Y+63 ; 0x3f 14b68: 23 97 sbiw r28, 0x03 ; 3 14b6a: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 sdpos = 0; 14b6e: 10 92 a3 17 sts 0x17A3, r1 ; 0x8017a3 14b72: 10 92 a4 17 sts 0x17A4, r1 ; 0x8017a4 14b76: 10 92 a5 17 sts 0x17A5, r1 ; 0x8017a5 14b7a: 10 92 a6 17 sts 0x17A6, r1 ; 0x8017a6 #ifdef SDCARD_SORT_ALPHA presort(); 14b7e: 0f 94 89 7d call 0x2fb12 ; 0x2fb12 14b82: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14b86: 8a 32 cpi r24, 0x2A ; 42 14b88: 91 05 cpc r25, r1 14b8a: 11 f4 brne .+4 ; 0x14b90 14b8c: 0c 94 76 b2 jmp 0x164ec ; 0x164ec 14b90: 8c 32 cpi r24, 0x2C ; 44 14b92: 91 05 cpc r25, r1 14b94: 11 f4 brne .+4 ; 0x14b9a 14b96: 0c 94 a9 b2 jmp 0x16552 ; 0x16552 14b9a: 80 97 sbiw r24, 0x20 ; 32 14b9c: 09 f0 breq .+2 ; 0x14ba0 14b9e: 8c ce rjmp .-744 ; 0x148b8 - `S` - Starting file offset */ case 32: { if(card.sdprinting) { 14ba0: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 14ba4: 81 11 cpse r24, r1 st_synchronize(); 14ba6: 0f 94 a9 43 call 0x28752 ; 0x28752 } const char* namestartpos = (strchr(strchr_pointer + 4,'!')); //find ! to indicate filename string start. 14baa: 00 91 93 03 lds r16, 0x0393 ; 0x800393 14bae: 10 91 94 03 lds r17, 0x0394 ; 0x800394 14bb2: 0c 5f subi r16, 0xFC ; 252 14bb4: 1f 4f sbci r17, 0xFF ; 255 14bb6: 61 e2 ldi r22, 0x21 ; 33 14bb8: 70 e0 ldi r23, 0x00 ; 0 14bba: c8 01 movw r24, r16 14bbc: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce if(namestartpos==NULL) 14bc0: 00 97 sbiw r24, 0x00 ; 0 14bc2: 19 f0 breq .+6 ; 0x14bca { namestartpos=strchr_pointer + 4; //default name position, 4 letters after the M } else namestartpos++; //to skip the '!' 14bc4: 8c 01 movw r16, r24 14bc6: 0f 5f subi r16, 0xFF ; 255 14bc8: 1f 4f sbci r17, 0xFF ; 255 bool call_procedure=(code_seen('P')); 14bca: 80 e5 ldi r24, 0x50 ; 80 14bcc: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14bd0: f8 2e mov r15, r24 if(strchr_pointer>namestartpos) 14bd2: 80 91 93 03 lds r24, 0x0393 ; 0x800393 14bd6: 90 91 94 03 lds r25, 0x0394 ; 0x800394 14bda: 08 17 cp r16, r24 14bdc: 19 07 cpc r17, r25 14bde: 08 f4 brcc .+2 ; 0x14be2 call_procedure=false; //false alert, 'P' found within filename 14be0: f1 2c mov r15, r1 if( card.mounted ) 14be2: 80 91 90 14 lds r24, 0x1490 ; 0x801490 14be6: 88 23 and r24, r24 14be8: 11 f4 brne .+4 ; 0x14bee 14bea: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { card.openFileReadFilteredGcode(namestartpos,!call_procedure); 14bee: 61 e0 ldi r22, 0x01 ; 1 14bf0: 6f 25 eor r22, r15 14bf2: c8 01 movw r24, r16 14bf4: 0f 94 42 80 call 0x30084 ; 0x30084 if(code_seen('S')) 14bf8: 83 e5 ldi r24, 0x53 ; 83 14bfa: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14bfe: 88 23 and r24, r24 14c00: 99 f0 breq .+38 ; 0x14c28 if(strchr_pointer 14c06: 90 91 94 03 lds r25, 0x0394 ; 0x800394 14c0a: 80 17 cp r24, r16 14c0c: 91 07 cpc r25, r17 14c0e: 60 f4 brcc .+24 ; 0x14c28 card.setIndex(code_value_long()); 14c10: 0e 94 1a 5b call 0xb634 ; 0xb634 { int16_t c = (int16_t)file.readFilteredGcode(); sdpos = file.curPosition(); return c; }; void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);}; 14c14: 60 93 a3 17 sts 0x17A3, r22 ; 0x8017a3 14c18: 70 93 a4 17 sts 0x17A4, r23 ; 0x8017a4 14c1c: 80 93 a5 17 sts 0x17A5, r24 ; 0x8017a5 14c20: 90 93 a6 17 sts 0x17A6, r25 ; 0x8017a6 14c24: 0f 94 93 76 call 0x2ed26 ; 0x2ed26 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED } void CardReader::startFileprint() { if(mounted) 14c28: 80 91 90 14 lds r24, 0x1490 ; 0x801490 14c2c: 88 23 and r24, r24 14c2e: 31 f0 breq .+12 ; 0x14c3c { sdprinting = true; 14c30: 81 e0 ldi r24, 0x01 ; 1 14c32: 80 93 8f 14 sts 0x148F, r24 ; 0x80148f 14c36: 85 e0 ldi r24, 0x05 ; 5 14c38: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> card.startFileprint(); if(!call_procedure) 14c3c: f1 10 cpse r15, r1 14c3e: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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); }; 14c42: 80 91 22 17 lds r24, 0x1722 ; 0x801722 14c46: 88 23 and r24, r24 14c48: 61 f0 breq .+24 ; 0x14c62 { if(!card.get_sdpos()) 14c4a: 80 91 a3 17 lds r24, 0x17A3 ; 0x8017a3 14c4e: 90 91 a4 17 lds r25, 0x17A4 ; 0x8017a4 14c52: a0 91 a5 17 lds r26, 0x17A5 ; 0x8017a5 14c56: b0 91 a6 17 lds r27, 0x17A6 ; 0x8017a6 14c5a: 89 2b or r24, r25 14c5c: 8a 2b or r24, r26 14c5e: 8b 2b or r24, r27 14c60: 69 f4 brne .+26 ; 0x14c7c { // A new print has started from scratch, reset stats failstats_reset_print(); 14c62: 0e 94 bc 5b call 0xb778 ; 0xb778 sdpos_atomic = 0; 14c66: 10 92 80 03 sts 0x0380, r1 ; 0x800380 14c6a: 10 92 81 03 sts 0x0381, r1 ; 0x800381 14c6e: 10 92 82 03 sts 0x0382, r1 ; 0x800382 14c72: 10 92 83 03 sts 0x0383, r1 ; 0x800383 14c76: 80 e0 ldi r24, 0x00 ; 0 14c78: 0e 94 af 81 call 0x1035e ; 0x1035e #ifndef LA_NOCOMPAT la10c_reset(); #endif } print_job_timer.start(); // procedure calls count as normal print time. 14c7c: 0f 94 4e 43 call 0x2869c ; 0x2869c 14c80: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14c84: 89 34 cpi r24, 0x49 ; 73 14c86: 91 05 cpc r25, r1 14c88: 11 f4 brne .+4 ; 0x14c8e 14c8a: 0c 94 06 b3 jmp 0x1660c ; 0x1660c 14c8e: f4 f4 brge .+60 ; 0x14ccc 14c90: 8e 32 cpi r24, 0x2E ; 46 14c92: 91 05 cpc r25, r1 14c94: 11 f4 brne .+4 ; 0x14c9a 14c96: 0c 94 c8 b2 jmp 0x16590 ; 0x16590 14c9a: 88 34 cpi r24, 0x48 ; 72 14c9c: 91 05 cpc r25, r1 14c9e: 09 f0 breq .+2 ; 0x14ca2 14ca0: 0b ce rjmp .-1002 ; 0x148b8 #### Parameters - `Snnn` - Set printer state 0 = not_ready, 1 = ready */ case 72: { if(code_seen('S')){ 14ca2: 83 e5 ldi r24, 0x53 ; 83 14ca4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14ca8: 88 23 and r24, r24 14caa: 11 f4 brne .+4 ; 0x14cb0 14cac: 0c 94 f7 b2 jmp 0x165ee ; 0x165ee switch (code_value_uint8()){ 14cb0: 0e 94 00 5b call 0xb600 ; 0xb600 14cb4: 88 23 and r24, r24 14cb6: 11 f4 brne .+4 ; 0x14cbc 14cb8: 0c 94 f4 b2 jmp 0x165e8 ; 0x165e8 14cbc: 81 30 cpi r24, 0x01 ; 1 14cbe: 11 f0 breq .+4 ; 0x14cc4 14cc0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 14cc4: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 14cc8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14ccc: 8c 34 cpi r24, 0x4C ; 76 14cce: 91 05 cpc r25, r1 14cd0: 11 f4 brne .+4 ; 0x14cd6 14cd2: 0c 94 a6 b3 jmp 0x1674c ; 0x1674c 14cd6: 14 f0 brlt .+4 ; 0x14cdc 14cd8: 0c 94 b9 b3 jmp 0x16772 ; 0x16772 14cdc: 8b 34 cpi r24, 0x4B ; 75 14cde: 91 05 cpc r25, r1 14ce0: 09 f0 breq .+2 ; 0x14ce4 14ce2: ea cd rjmp .-1068 ; 0x148b8 /*! ### M75 - Start the print job timer M75: Start the print job timer */ case 75: { if (!filament_presence_check()) { 14ce4: 0e 94 bb f5 call 0x1eb76 ; 0x1eb76 14ce8: 88 23 and r24, r24 14cea: 11 f4 brne .+4 ; 0x14cf0 14cec: 0c 94 83 b0 jmp 0x16106 ; 0x16106 14cf0: c5 cf rjmp .-118 ; 0x14c7c } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14cf2: 8e 36 cpi r24, 0x6E ; 110 14cf4: 91 05 cpc r25, r1 14cf6: 11 f4 brne .+4 ; 0x14cfc 14cf8: 0c 94 6c b6 jmp 0x16cd8 ; 0x16cd8 14cfc: 0c f0 brlt .+2 ; 0x14d00 14cfe: 86 c0 rjmp .+268 ; 0x14e0c 14d00: 86 35 cpi r24, 0x56 ; 86 14d02: 91 05 cpc r25, r1 14d04: 11 f4 brne .+4 ; 0x14d0a 14d06: 0c 94 c5 b5 jmp 0x16b8a ; 0x16b8a 14d0a: d4 f5 brge .+116 ; 0x14d80 14d0c: 83 35 cpi r24, 0x53 ; 83 14d0e: 91 05 cpc r25, r1 14d10: 11 f4 brne .+4 ; 0x14d16 14d12: 0c 94 6f b5 jmp 0x16ade ; 0x16ade 14d16: 84 f4 brge .+32 ; 0x14d38 14d18: 8f 34 cpi r24, 0x4F ; 79 14d1a: 91 05 cpc r25, r1 14d1c: 11 f4 brne .+4 ; 0x14d22 14d1e: 0c 94 29 b4 jmp 0x16852 ; 0x16852 14d22: 82 35 cpi r24, 0x52 ; 82 14d24: 91 05 cpc r25, r1 14d26: 09 f0 breq .+2 ; 0x14d2a 14d28: c7 cd rjmp .-1138 ; 0x148b8 /*! ### 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; 14d2a: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 14d2e: 87 7f andi r24, 0xF7 ; 247 14d30: 80 93 e3 03 sts 0x03E3, r24 ; 0x8003e3 14d34: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14d38: 84 35 cpi r24, 0x54 ; 84 14d3a: 91 05 cpc r25, r1 14d3c: 11 f4 brne .+4 ; 0x14d42 14d3e: 0c 94 75 b5 jmp 0x16aea ; 0x16aea 14d42: 85 35 cpi r24, 0x55 ; 85 14d44: 91 05 cpc r25, r1 14d46: 09 f0 breq .+2 ; 0x14d4a 14d48: b7 cd rjmp .-1170 ; 0x148b8 #### 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')) { 14d4a: 83 e5 ldi r24, 0x53 ; 83 14d4c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14d50: 88 23 and r24, r24 14d52: 11 f4 brne .+4 ; 0x14d58 14d54: 0c 94 83 b0 jmp 0x16106 ; 0x16106 max_inactive_time = code_value() * 1000; 14d58: 0e 94 35 60 call 0xc06a ; 0xc06a 14d5c: 20 e0 ldi r18, 0x00 ; 0 14d5e: 30 e0 ldi r19, 0x00 ; 0 14d60: 4a e7 ldi r20, 0x7A ; 122 14d62: 54 e4 ldi r21, 0x44 ; 68 14d64: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 14d68: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 14d6c: 60 93 7c 03 sts 0x037C, r22 ; 0x80037c 14d70: 70 93 7d 03 sts 0x037D, r23 ; 0x80037d 14d74: 80 93 7e 03 sts 0x037E, r24 ; 0x80037e 14d78: 90 93 7f 03 sts 0x037F, r25 ; 0x80037f 14d7c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14d80: 89 36 cpi r24, 0x69 ; 105 14d82: 91 05 cpc r25, r1 14d84: 11 f4 brne .+4 ; 0x14d8a 14d86: 0c 94 85 b4 jmp 0x1690a ; 0x1690a 14d8a: d4 f4 brge .+52 ; 0x14dc0 14d8c: 8c 35 cpi r24, 0x5C ; 92 14d8e: 91 05 cpc r25, r1 14d90: 11 f4 brne .+4 ; 0x14d96 14d92: 0c 94 e2 b5 jmp 0x16bc4 ; 0x16bc4 14d96: 88 36 cpi r24, 0x68 ; 104 14d98: 91 05 cpc r25, r1 14d9a: 09 f0 breq .+2 ; 0x14d9e 14d9c: 8d cd rjmp .-1254 ; 0x148b8 #### Parameters - `S` - Target temperature */ case 104: // M104 { if (code_seen('S')) 14d9e: 83 e5 ldi r24, 0x53 ; 83 14da0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14da4: 88 23 and r24, r24 14da6: 11 f4 brne .+4 ; 0x14dac 14da8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { setTargetHotend(code_value()); 14dac: 0e 94 35 60 call 0xc06a ; 0xc06a return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 14db0: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 14db4: 70 93 b6 0d sts 0x0DB6, r23 ; 0x800db6 14db8: 60 93 b5 0d sts 0x0DB5, r22 ; 0x800db5 14dbc: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14dc0: 8b 36 cpi r24, 0x6B ; 107 14dc2: 91 05 cpc r25, r1 14dc4: 11 f4 brne .+4 ; 0x14dca 14dc6: 0c 94 6c b5 jmp 0x16ad8 ; 0x16ad8 14dca: 14 f4 brge .+4 ; 0x14dd0 14dcc: 0c 94 5e b5 jmp 0x16abc ; 0x16abc 14dd0: 8d 36 cpi r24, 0x6D ; 109 14dd2: 91 05 cpc r25, r1 14dd4: 09 f0 breq .+2 ; 0x14dd8 14dd6: 70 cd rjmp .-1312 ; 0x148b8 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)); 14dd8: 85 ea ldi r24, 0xA5 ; 165 14dda: 9d e4 ldi r25, 0x4D ; 77 14ddc: 0e 94 44 72 call 0xe488 ; 0xe488 14de0: 0e 94 16 f2 call 0x1e42c ; 0x1e42c heating_status = HeatingStatus::EXTRUDER_HEATING; 14de4: 81 e0 ldi r24, 0x01 ; 1 14de6: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 prusa_statistics(1); #ifdef AUTOTEMP autotemp_enabled=false; #endif if (code_seen('S')) { 14dea: 83 e5 ldi r24, 0x53 ; 83 14dec: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14df0: 88 23 and r24, r24 14df2: 11 f4 brne .+4 ; 0x14df8 14df4: 0c 94 99 b4 jmp 0x16932 ; 0x16932 setTargetHotend(code_value()); } else if (code_seen('R')) { setTargetHotend(code_value()); 14df8: 0e 94 35 60 call 0xc06a ; 0xc06a 14dfc: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 14e00: 70 93 b6 0d sts 0x0DB6, r23 ; 0x800db6 14e04: 60 93 b5 0d sts 0x0DB5, r22 ; 0x800db5 14e08: 0c 94 9f b4 jmp 0x1693e ; 0x1693e } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14e0c: 87 37 cpi r24, 0x77 ; 119 14e0e: 91 05 cpc r25, r1 14e10: 11 f4 brne .+4 ; 0x14e16 14e12: 0c 94 b1 b7 jmp 0x16f62 ; 0x16f62 14e16: ac f5 brge .+106 ; 0x14e82 14e18: 82 37 cpi r24, 0x72 ; 114 14e1a: 91 05 cpc r25, r1 14e1c: 11 f4 brne .+4 ; 0x14e22 14e1e: 0c 94 66 b7 jmp 0x16ecc ; 0x16ecc 14e22: b4 f4 brge .+44 ; 0x14e50 14e24: 80 37 cpi r24, 0x70 ; 112 14e26: 91 05 cpc r25, r1 14e28: 11 f4 brne .+4 ; 0x14e2e 14e2a: 0c 94 72 b4 jmp 0x168e4 ; 0x168e4 14e2e: 81 37 cpi r24, 0x71 ; 113 14e30: 91 05 cpc r25, r1 14e32: 09 f0 breq .+2 ; 0x14e36 14e34: 41 cd rjmp .-1406 ; 0x148b8 #### Parameters - `S` - Seconds. Default is 2 seconds between "busy" messages */ case 113: if (code_seen('S')) { 14e36: 83 e5 ldi r24, 0x53 ; 83 14e38: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14e3c: 88 23 and r24, r24 14e3e: 11 f4 brne .+4 ; 0x14e44 14e40: 0c 94 7d b6 jmp 0x16cfa ; 0x16cfa host_keepalive_interval = code_value_uint8(); 14e44: 0e 94 00 5b call 0xb600 ; 0xb600 14e48: 80 93 2f 02 sts 0x022F, r24 ; 0x80022f 14e4c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14e50: 85 37 cpi r24, 0x75 ; 117 14e52: 91 05 cpc r25, r1 14e54: 11 f4 brne .+4 ; 0x14e5a 14e56: 0c 94 69 b7 jmp 0x16ed2 ; 0x16ed2 14e5a: 14 f0 brlt .+4 ; 0x14e60 14e5c: 0c 94 79 b7 jmp 0x16ef2 ; 0x16ef2 14e60: 83 37 cpi r24, 0x73 ; 115 14e62: 91 05 cpc r25, r1 14e64: 09 f0 breq .+2 ; 0x14e68 14e66: 28 cd rjmp .-1456 ; 0x148b8 #### 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')) { 14e68: 86 e5 ldi r24, 0x56 ; 86 14e6a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14e6e: 88 23 and r24, r24 14e70: 11 f4 brne .+4 ; 0x14e76 14e72: 0c 94 92 b6 jmp 0x16d24 ; 0x16d24 // Report the Prusa version number. SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P()); 14e76: 86 e4 ldi r24, 0x46 ; 70 14e78: 94 e8 ldi r25, 0x84 ; 132 14e7a: 0e 94 13 79 call 0xf226 ; 0xf226 14e7e: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14e82: 8c 38 cpi r24, 0x8C ; 140 14e84: 91 05 cpc r25, r1 14e86: 11 f4 brne .+4 ; 0x14e8c 14e88: 0c 94 76 b4 jmp 0x168ec ; 0x168ec 14e8c: 54 f4 brge .+20 ; 0x14ea2 14e8e: 8b 37 cpi r24, 0x7B ; 123 14e90: 91 05 cpc r25, r1 14e92: 11 f4 brne .+4 ; 0x14e98 14e94: 0c 94 16 b8 jmp 0x1702c ; 0x1702c 14e98: 8d 37 cpi r24, 0x7D ; 125 14e9a: 91 05 cpc r25, r1 14e9c: 09 f4 brne .+2 ; 0x14ea0 14e9e: 80 cd rjmp .-1280 ; 0x149a0 14ea0: 0b cd rjmp .-1514 ; 0x148b8 14ea2: 8e 3b cpi r24, 0xBE ; 190 14ea4: 91 05 cpc r25, r1 14ea6: 11 f4 brne .+4 ; 0x14eac 14ea8: 0c 94 cf b4 jmp 0x1699e ; 0x1699e 14eac: 88 3c cpi r24, 0xC8 ; 200 14eae: 91 05 cpc r25, r1 14eb0: 11 f4 brne .+4 ; 0x14eb6 14eb2: 0c 94 19 b8 jmp 0x17032 ; 0x17032 14eb6: 8b 39 cpi r24, 0x9B ; 155 14eb8: 91 05 cpc r25, r1 14eba: 09 f0 breq .+2 ; 0x14ebe 14ebc: fd cc rjmp .-1542 ; 0x148b8 bit 6 = free bit 7 = free */ case 155: { if (code_seen('S')){ 14ebe: 83 e5 ldi r24, 0x53 ; 83 14ec0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14ec4: 88 23 and r24, r24 14ec6: 61 f0 breq .+24 ; 0x14ee0 autoReportFeatures.SetPeriod( code_value_uint8() ); 14ec8: 0e 94 00 5b call 0xb600 ; 0xb600 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; 14ecc: 80 93 87 14 sts 0x1487, r24 ; 0x801487 if (auto_report_period != 0){ 14ed0: 88 23 and r24, r24 14ed2: 11 f4 brne .+4 ; 0x14ed8 14ed4: 0c 94 91 b4 jmp 0x16922 ; 0x16922 auto_report_timer.start(); 14ed8: 88 e8 ldi r24, 0x88 ; 136 14eda: 94 e1 ldi r25, 0x14 ; 20 14edc: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> case 155: { if (code_seen('S')){ autoReportFeatures.SetPeriod( code_value_uint8() ); } if (code_seen('C')){ 14ee0: 83 e4 ldi r24, 0x43 ; 67 14ee2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14ee6: 88 23 and r24, r24 14ee8: 11 f4 brne .+4 ; 0x14eee 14eea: 0c 94 95 b4 jmp 0x1692a ; 0x1692a autoReportFeatures.SetMask(code_value_uint8()); 14eee: 0e 94 00 5b call 0xb600 ; 0xb600 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; } 14ef2: 80 93 86 14 sts 0x1486, r24 ; 0x801486 14ef6: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14efa: 85 3f cpi r24, 0xF5 ; 245 14efc: f1 e0 ldi r31, 0x01 ; 1 14efe: 9f 07 cpc r25, r31 14f00: 11 f4 brne .+4 ; 0x14f06 14f02: 0c 94 03 c0 jmp 0x18006 ; 0x18006 14f06: 0c f0 brlt .+2 ; 0x14f0a 14f08: 60 c4 rjmp .+2240 ; 0x157ca 14f0a: 81 15 cp r24, r1 14f0c: 31 e0 ldi r19, 0x01 ; 1 14f0e: 93 07 cpc r25, r19 14f10: 11 f4 brne .+4 ; 0x14f16 14f12: 0c 94 85 bb jmp 0x1770a ; 0x1770a 14f16: 0c f0 brlt .+2 ; 0x14f1a 14f18: 24 c1 rjmp .+584 ; 0x15162 14f1a: 80 3d cpi r24, 0xD0 ; 208 14f1c: 91 05 cpc r25, r1 14f1e: 11 f4 brne .+4 ; 0x14f24 14f20: 0c 94 c8 b9 jmp 0x17390 ; 0x17390 14f24: 0c f0 brlt .+2 ; 0x14f28 14f26: 77 c0 rjmp .+238 ; 0x15016 14f28: 8d 3c cpi r24, 0xCD ; 205 14f2a: 91 05 cpc r25, r1 14f2c: 11 f4 brne .+4 ; 0x14f32 14f2e: 0c 94 32 b9 jmp 0x17264 ; 0x17264 14f32: ac f5 brge .+106 ; 0x14f9e 14f34: 8b 3c cpi r24, 0xCB ; 203 14f36: 91 05 cpc r25, r1 14f38: 11 f4 brne .+4 ; 0x14f3e 14f3a: 0c 94 a9 b8 jmp 0x17152 ; 0x17152 14f3e: 8c 3c cpi r24, 0xCC ; 204 14f40: 91 05 cpc r25, r1 14f42: 09 f0 breq .+2 ; 0x14f46 14f44: b9 cc rjmp .-1678 ; 0x148b8 - `R` - filmanent only moves - `T` - travel moves (as of now T is ignored) */ case 204: { if(code_seen('S')) { 14f46: 83 e5 ldi r24, 0x53 ; 83 14f48: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14f4c: 88 23 and r24, r24 14f4e: 11 f4 brne .+4 ; 0x14f54 14f50: 0c 94 01 b9 jmp 0x17202 ; 0x17202 // 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(); 14f54: 0e 94 35 60 call 0xc06a ; 0xc06a 14f58: 60 93 7d 0e sts 0x0E7D, r22 ; 0x800e7d 14f5c: 70 93 7e 0e sts 0x0E7E, r23 ; 0x800e7e 14f60: 80 93 7f 0e sts 0x0E7F, r24 ; 0x800e7f 14f64: 90 93 80 0e sts 0x0E80, r25 ; 0x800e80 14f68: 60 93 f1 0d sts 0x0DF1, r22 ; 0x800df1 14f6c: 70 93 f2 0d sts 0x0DF2, r23 ; 0x800df2 14f70: 80 93 f3 0d sts 0x0DF3, r24 ; 0x800df3 14f74: 90 93 f4 0d sts 0x0DF4, r25 ; 0x800df4 // Interpret the T value as retract acceleration in the old Marlin format. if(code_seen('T')) 14f78: 84 e5 ldi r24, 0x54 ; 84 14f7a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14f7e: 88 23 and r24, r24 14f80: 11 f4 brne .+4 ; 0x14f86 14f82: 0c 94 83 b0 jmp 0x16106 ; 0x16106 cs.retract_acceleration = code_value(); 14f86: 0e 94 35 60 call 0xc06a ; 0xc06a 14f8a: 60 93 f5 0d sts 0x0DF5, r22 ; 0x800df5 14f8e: 70 93 f6 0d sts 0x0DF6, r23 ; 0x800df6 14f92: 80 93 f7 0d sts 0x0DF7, r24 ; 0x800df7 14f96: 90 93 f8 0d sts 0x0DF8, r25 ; 0x800df8 14f9a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 14f9e: 8e 3c cpi r24, 0xCE ; 206 14fa0: 91 05 cpc r25, r1 14fa2: 11 f4 brne .+4 ; 0x14fa8 14fa4: 0c 94 ab b9 jmp 0x17356 ; 0x17356 14fa8: 8f 3c cpi r24, 0xCF ; 207 14faa: 91 05 cpc r25, r1 14fac: 09 f0 breq .+2 ; 0x14fb0 14fae: 84 cc rjmp .-1784 ; 0x148b8 - `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')) 14fb0: 83 e5 ldi r24, 0x53 ; 83 14fb2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14fb6: 88 23 and r24, r24 14fb8: 51 f0 breq .+20 ; 0x14fce { cs.retract_length = code_value() ; 14fba: 0e 94 35 60 call 0xc06a ; 0xc06a 14fbe: 60 93 40 0e sts 0x0E40, r22 ; 0x800e40 14fc2: 70 93 41 0e sts 0x0E41, r23 ; 0x800e41 14fc6: 80 93 42 0e sts 0x0E42, r24 ; 0x800e42 14fca: 90 93 43 0e sts 0x0E43, r25 ; 0x800e43 } if(code_seen('F')) 14fce: 86 e4 ldi r24, 0x46 ; 70 14fd0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14fd4: 88 23 and r24, r24 14fd6: 61 f0 breq .+24 ; 0x14ff0 { cs.retract_feedrate = get_feedrate_mm_s(code_value()); 14fd8: 0e 94 35 60 call 0xc06a ; 0xc06a 14fdc: 0e 94 5f 66 call 0xccbe ; 0xccbe 14fe0: 60 93 44 0e sts 0x0E44, r22 ; 0x800e44 14fe4: 70 93 45 0e sts 0x0E45, r23 ; 0x800e45 14fe8: 80 93 46 0e sts 0x0E46, r24 ; 0x800e46 14fec: 90 93 47 0e sts 0x0E47, r25 ; 0x800e47 } if(code_seen('Z')) 14ff0: 8a e5 ldi r24, 0x5A ; 90 14ff2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 14ff6: 88 23 and r24, r24 14ff8: 11 f4 brne .+4 ; 0x14ffe 14ffa: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { cs.retract_zlift = code_value() ; 14ffe: 0e 94 35 60 call 0xc06a ; 0xc06a 15002: 60 93 48 0e sts 0x0E48, r22 ; 0x800e48 15006: 70 93 49 0e sts 0x0E49, r23 ; 0x800e49 1500a: 80 93 4a 0e sts 0x0E4A, r24 ; 0x800e4a 1500e: 90 93 4b 0e sts 0x0E4B, r25 ; 0x800e4b 15012: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15016: 8c 3d cpi r24, 0xDC ; 220 15018: 91 05 cpc r25, r1 1501a: 11 f4 brne .+4 ; 0x15020 1501c: 0c 94 2f ba jmp 0x1745e ; 0x1745e 15020: 0c f0 brlt .+2 ; 0x15024 15022: 82 c0 rjmp .+260 ; 0x15128 15024: 81 3d cpi r24, 0xD1 ; 209 15026: 91 05 cpc r25, r1 15028: 11 f4 brne .+4 ; 0x1502e 1502a: 0c 94 ec b9 jmp 0x173d8 ; 0x173d8 1502e: 86 3d cpi r24, 0xD6 ; 214 15030: 91 05 cpc r25, r1 15032: 09 f0 breq .+2 ; 0x15036 15034: 41 cc rjmp .-1918 ; 0x148b8 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; 15036: 80 e5 ldi r24, 0x50 ; 80 15038: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1503c: 88 23 and r24, r24 1503e: 11 f4 brne .+4 ; 0x15044 15040: 0c 94 1b ba jmp 0x17436 ; 0x17436 15044: 0e 94 35 60 call 0xc06a ; 0xc06a 15048: 2b 01 movw r4, r22 1504a: 3c 01 movw r6, r24 float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment; 1504c: 83 e5 ldi r24, 0x53 ; 83 1504e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15052: 88 23 and r24, r24 15054: 11 f4 brne .+4 ; 0x1505a 15056: 0c 94 25 ba jmp 0x1744a ; 0x1744a 1505a: 0e 94 35 60 call 0xc06a ; 0xc06a 1505e: 4b 01 movw r8, r22 15060: 5c 01 movw r10, r24 unsigned char n = code_seen('N') ? code_value() : cs.n_arc_correction; 15062: 8e e4 ldi r24, 0x4E ; 78 15064: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15068: d0 90 89 0e lds r13, 0x0E89 ; 0x800e89 1506c: 88 23 and r24, r24 1506e: 29 f0 breq .+10 ; 0x1507a 15070: 0e 94 35 60 call 0xc06a ; 0xc06a 15074: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 15078: d6 2e mov r13, r22 unsigned short r = code_seen('R') ? code_value() : cs.min_arc_segments; 1507a: 82 e5 ldi r24, 0x52 ; 82 1507c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15080: e0 90 8a 0e lds r14, 0x0E8A ; 0x800e8a 15084: f0 90 8b 0e lds r15, 0x0E8B ; 0x800e8b 15088: 88 23 and r24, r24 1508a: 29 f0 breq .+10 ; 0x15096 1508c: 0e 94 35 60 call 0xc06a ; 0xc06a 15090: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 15094: 7b 01 movw r14, r22 unsigned short f = code_seen('F') ? code_value() : cs.arc_segments_per_sec; 15096: 86 e4 ldi r24, 0x46 ; 70 15098: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1509c: 00 91 8c 0e lds r16, 0x0E8C ; 0x800e8c 150a0: 10 91 8d 0e lds r17, 0x0E8D ; 0x800e8d 150a4: 88 23 and r24, r24 150a6: 29 f0 breq .+10 ; 0x150b2 150a8: 0e 94 35 60 call 0xc06a ; 0xc06a 150ac: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 150b0: 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) 150b2: 20 e0 ldi r18, 0x00 ; 0 150b4: 30 e0 ldi r19, 0x00 ; 0 150b6: a9 01 movw r20, r18 150b8: c3 01 movw r24, r6 150ba: b2 01 movw r22, r4 150bc: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 150c0: 18 16 cp r1, r24 150c2: 14 f0 brlt .+4 ; 0x150c8 150c4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 150c8: 20 e0 ldi r18, 0x00 ; 0 150ca: 30 e0 ldi r19, 0x00 ; 0 150cc: a9 01 movw r20, r18 150ce: c5 01 movw r24, r10 150d0: b4 01 movw r22, r8 150d2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 150d6: 87 ff sbrs r24, 7 150d8: 02 c0 rjmp .+4 ; 0x150de 150da: 0c 94 83 b0 jmp 0x16106 ; 0x16106 150de: a5 01 movw r20, r10 150e0: 94 01 movw r18, r8 150e2: c3 01 movw r24, r6 150e4: b2 01 movw r22, r4 150e6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 150ea: 87 ff sbrs r24, 7 150ec: 02 c0 rjmp .+4 ; 0x150f2 150ee: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { // Should we display some error here? break; } cs.mm_per_arc_segment = p; 150f2: 40 92 81 0e sts 0x0E81, r4 ; 0x800e81 150f6: 50 92 82 0e sts 0x0E82, r5 ; 0x800e82 150fa: 60 92 83 0e sts 0x0E83, r6 ; 0x800e83 150fe: 70 92 84 0e sts 0x0E84, r7 ; 0x800e84 cs.min_mm_per_arc_segment = s; 15102: 80 92 85 0e sts 0x0E85, r8 ; 0x800e85 15106: 90 92 86 0e sts 0x0E86, r9 ; 0x800e86 1510a: a0 92 87 0e sts 0x0E87, r10 ; 0x800e87 1510e: b0 92 88 0e sts 0x0E88, r11 ; 0x800e88 cs.n_arc_correction = n; 15112: d0 92 89 0e sts 0x0E89, r13 ; 0x800e89 cs.min_arc_segments = r; 15116: f0 92 8b 0e sts 0x0E8B, r15 ; 0x800e8b 1511a: e0 92 8a 0e sts 0x0E8A, r14 ; 0x800e8a cs.arc_segments_per_sec = f; 1511e: 10 93 8d 0e sts 0x0E8D, r17 ; 0x800e8d 15122: 00 93 8c 0e sts 0x0E8C, r16 ; 0x800e8c 15126: ef c7 rjmp .+4062 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15128: 82 3e cpi r24, 0xE2 ; 226 1512a: 91 05 cpc r25, r1 1512c: 11 f4 brne .+4 ; 0x15132 1512e: 0c 94 80 ba jmp 0x17500 ; 0x17500 15132: 80 3f cpi r24, 0xF0 ; 240 15134: 91 05 cpc r25, r1 15136: 09 f4 brne .+2 ; 0x1513a 15138: e6 c7 rjmp .+4044 ; 0x16106 1513a: 8d 3d cpi r24, 0xDD ; 221 1513c: 91 05 cpc r25, r1 1513e: 09 f0 breq .+2 ; 0x15142 15140: bb cb rjmp .-2186 ; 0x148b8 #### Parameters - `S` - Extrude factor override percentage (0..100 or higher), default 100% */ case 221: { if (code_seen('S')) 15142: 83 e5 ldi r24, 0x53 ; 83 15144: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15148: 88 23 and r24, r24 1514a: 11 f4 brne .+4 ; 0x15150 1514c: 0c 94 6e ba jmp 0x174dc ; 0x174dc { extrudemultiply = code_value_short(); 15150: 0e 94 0d 5b call 0xb61a ; 0xb61a 15154: 90 93 bd 02 sts 0x02BD, r25 ; 0x8002bd 15158: 80 93 bc 02 sts 0x02BC, r24 ; 0x8002bc calculate_extruder_multipliers(); 1515c: 0e 94 51 65 call 0xcaa2 ; 0xcaa2 15160: d2 c7 rjmp .+4004 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15162: 8e 35 cpi r24, 0x5E ; 94 15164: 51 e0 ldi r21, 0x01 ; 1 15166: 95 07 cpc r25, r21 15168: 11 f4 brne .+4 ; 0x1516e 1516a: 0c 94 b5 c9 jmp 0x1936a ; 0x1936a 1516e: 0c f0 brlt .+2 ; 0x15172 15170: ec c2 rjmp .+1496 ; 0x1574a 15172: 8e 32 cpi r24, 0x2E ; 46 15174: b1 e0 ldi r27, 0x01 ; 1 15176: 9b 07 cpc r25, r27 15178: 11 f4 brne .+4 ; 0x1517e 1517a: 0c 94 e3 bb jmp 0x177c6 ; 0x177c6 1517e: 0c f0 brlt .+2 ; 0x15182 15180: 82 c0 rjmp .+260 ; 0x15286 15182: 8c 32 cpi r24, 0x2C ; 44 15184: f1 e0 ldi r31, 0x01 ; 1 15186: 9f 07 cpc r25, r31 15188: 11 f4 brne .+4 ; 0x1518e 1518a: 0c 94 d9 ba jmp 0x175b2 ; 0x175b2 1518e: 8d 32 cpi r24, 0x2D ; 45 15190: 91 40 sbci r25, 0x01 ; 1 15192: 09 f0 breq .+2 ; 0x15196 15194: 91 cb rjmp .-2270 ; 0x148b8 - `I` - integral (Ki) - `D` - derivative (Kd) */ case 301: { if(code_seen('P')) cs.Kp = code_value(); 15196: 80 e5 ldi r24, 0x50 ; 80 15198: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1519c: 88 23 and r24, r24 1519e: 51 f0 breq .+20 ; 0x151b4 151a0: 0e 94 35 60 call 0xc06a ; 0xc06a 151a4: 60 93 25 0e sts 0x0E25, r22 ; 0x800e25 151a8: 70 93 26 0e sts 0x0E26, r23 ; 0x800e26 151ac: 80 93 27 0e sts 0x0E27, r24 ; 0x800e27 151b0: 90 93 28 0e sts 0x0E28, r25 ; 0x800e28 if(code_seen('I')) cs.Ki = scalePID_i(code_value()); 151b4: 89 e4 ldi r24, 0x49 ; 73 151b6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 151ba: 88 23 and r24, r24 151bc: 81 f0 breq .+32 ; 0x151de 151be: 0e 94 35 60 call 0xc06a ; 0xc06a #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 151c2: 2c ea ldi r18, 0xAC ; 172 151c4: 35 ec ldi r19, 0xC5 ; 197 151c6: 47 e2 ldi r20, 0x27 ; 39 151c8: 5e e3 ldi r21, 0x3E ; 62 151ca: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 151ce: 60 93 29 0e sts 0x0E29, r22 ; 0x800e29 151d2: 70 93 2a 0e sts 0x0E2A, r23 ; 0x800e2a 151d6: 80 93 2b 0e sts 0x0E2B, r24 ; 0x800e2b 151da: 90 93 2c 0e sts 0x0E2C, r25 ; 0x800e2c if(code_seen('D')) cs.Kd = scalePID_d(code_value()); 151de: 84 e4 ldi r24, 0x44 ; 68 151e0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 151e4: 88 23 and r24, r24 151e6: 81 f0 breq .+32 ; 0x15208 151e8: 0e 94 35 60 call 0xc06a ; 0xc06a } float unscalePID_i(float i) { return i/PID_dT; 151ec: 2c ea ldi r18, 0xAC ; 172 151ee: 35 ec ldi r19, 0xC5 ; 197 151f0: 47 e2 ldi r20, 0x27 ; 39 151f2: 5e e3 ldi r21, 0x3E ; 62 151f4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 151f8: 60 93 2d 0e sts 0x0E2D, r22 ; 0x800e2d 151fc: 70 93 2e 0e sts 0x0E2E, r23 ; 0x800e2e 15200: 80 93 2f 0e sts 0x0E2F, r24 ; 0x800e2f 15204: 90 93 30 0e sts 0x0E30, r25 ; 0x800e30 updatePID(); 15208: 0f 94 ab 3b call 0x27756 ; 0x27756 SERIAL_PROTOCOLRPGM(MSG_OK); 1520c: 81 e5 ldi r24, 0x51 ; 81 1520e: 9d e6 ldi r25, 0x6D ; 109 15210: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLPGM(" p:"); 15214: 8a e1 ldi r24, 0x1A ; 26 15216: 96 e8 ldi r25, 0x86 ; 134 15218: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 1521c: 60 91 25 0e lds r22, 0x0E25 ; 0x800e25 15220: 70 91 26 0e lds r23, 0x0E26 ; 0x800e26 15224: 80 91 27 0e lds r24, 0x0E27 ; 0x800e27 15228: 90 91 28 0e lds r25, 0x0E28 ; 0x800e28 1522c: 42 e0 ldi r20, 0x02 ; 2 1522e: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(cs.Kp); SERIAL_PROTOCOLPGM(" i:"); 15232: 86 e1 ldi r24, 0x16 ; 22 15234: 96 e8 ldi r25, 0x86 ; 134 15236: 0e 94 e8 76 call 0xedd0 ; 0xedd0 1523a: 2c ea ldi r18, 0xAC ; 172 1523c: 35 ec ldi r19, 0xC5 ; 197 1523e: 47 e2 ldi r20, 0x27 ; 39 15240: 5e e3 ldi r21, 0x3E ; 62 15242: 60 91 29 0e lds r22, 0x0E29 ; 0x800e29 15246: 70 91 2a 0e lds r23, 0x0E2A ; 0x800e2a 1524a: 80 91 2b 0e lds r24, 0x0E2B ; 0x800e2b 1524e: 90 91 2c 0e lds r25, 0x0E2C ; 0x800e2c 15252: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 15256: 42 e0 ldi r20, 0x02 ; 2 15258: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(unscalePID_i(cs.Ki)); SERIAL_PROTOCOLPGM(" d:"); 1525c: 82 e1 ldi r24, 0x12 ; 18 1525e: 96 e8 ldi r25, 0x86 ; 134 15260: 0e 94 e8 76 call 0xedd0 ; 0xedd0 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15264: 2c ea ldi r18, 0xAC ; 172 15266: 35 ec ldi r19, 0xC5 ; 197 15268: 47 e2 ldi r20, 0x27 ; 39 1526a: 5e e3 ldi r21, 0x3E ; 62 1526c: 60 91 2d 0e lds r22, 0x0E2D ; 0x800e2d 15270: 70 91 2e 0e lds r23, 0x0E2E ; 0x800e2e 15274: 80 91 2f 0e lds r24, 0x0E2F ; 0x800e2f 15278: 90 91 30 0e lds r25, 0x0E30 ; 0x800e30 1527c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> SERIAL_PROTOCOLLN(unscalePID_d(cs.Kd)); 15280: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 15284: 40 c7 rjmp .+3712 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15286: 80 33 cpi r24, 0x30 ; 48 15288: 31 e0 ldi r19, 0x01 ; 1 1528a: 93 07 cpc r25, r19 1528c: 11 f4 brne .+4 ; 0x15292 1528e: 0c 94 0c bb jmp 0x17618 ; 0x17618 15292: 14 f4 brge .+4 ; 0x15298 15294: 0c 94 f3 bb jmp 0x177e6 ; 0x177e6 15298: 86 33 cpi r24, 0x36 ; 54 1529a: 91 40 sbci r25, 0x01 ; 1 1529c: 09 f0 breq .+2 ; 0x152a0 1529e: 0c cb rjmp .-2536 ; 0x148b8 { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; int8_t I = -1, S = -1, B = -1, F = -1; int16_t A = -1, L = -1; if(code_seen('I')) I = code_value_short(); 152a0: 89 e4 ldi r24, 0x49 ; 73 152a2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 152a6: 88 23 and r24, r24 152a8: 11 f4 brne .+4 ; 0x152ae 152aa: 0c 94 26 bc jmp 0x1784c ; 0x1784c 152ae: 0e 94 0d 5b call 0xb61a ; 0xb61a 152b2: ab 96 adiw r28, 0x2b ; 43 152b4: 8f af std Y+63, r24 ; 0x3f 152b6: ab 97 sbiw r28, 0x2b ; 43 if(code_seen('R')) R = code_value(); 152b8: 82 e5 ldi r24, 0x52 ; 82 152ba: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 152be: 88 23 and r24, r24 152c0: 11 f4 brne .+4 ; 0x152c6 152c2: 0c 94 2c bc jmp 0x17858 ; 0x17858 152c6: 0e 94 35 60 call 0xc06a ; 0xc06a 152ca: e2 96 adiw r28, 0x32 ; 50 152cc: 6c af std Y+60, r22 ; 0x3c 152ce: 7d af std Y+61, r23 ; 0x3d 152d0: 8e af std Y+62, r24 ; 0x3e 152d2: 9f af std Y+63, r25 ; 0x3f 152d4: e2 97 sbiw r28, 0x32 ; 50 if(code_seen('P')) P = code_value(); 152d6: 80 e5 ldi r24, 0x50 ; 80 152d8: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `F` - force model self-test state (0=off 1=on) during autotune using current values */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; 152dc: c1 2c mov r12, r1 152de: d1 2c mov r13, r1 152e0: f0 ec ldi r31, 0xC0 ; 192 152e2: ef 2e mov r14, r31 152e4: ff e7 ldi r31, 0x7F ; 127 152e6: ff 2e mov r15, r31 int8_t I = -1, S = -1, B = -1, F = -1; int16_t A = -1, L = -1; if(code_seen('I')) I = code_value_short(); if(code_seen('R')) R = code_value(); if(code_seen('P')) P = code_value(); 152e8: 88 23 and r24, r24 152ea: 21 f0 breq .+8 ; 0x152f4 152ec: 0e 94 35 60 call 0xc06a ; 0xc06a 152f0: 6b 01 movw r12, r22 152f2: 7c 01 movw r14, r24 if(code_seen('U')) U = code_value(); 152f4: 85 e5 ldi r24, 0x55 ; 85 152f6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 152fa: 88 23 and r24, r24 152fc: 11 f4 brne .+4 ; 0x15302 152fe: 0c 94 38 bc jmp 0x17870 ; 0x17870 15302: 0e 94 35 60 call 0xc06a ; 0xc06a 15306: 6e 96 adiw r28, 0x1e ; 30 15308: 6c af std Y+60, r22 ; 0x3c 1530a: 7d af std Y+61, r23 ; 0x3d 1530c: 8e af std Y+62, r24 ; 0x3e 1530e: 9f af std Y+63, r25 ; 0x3f 15310: 6e 97 sbiw r28, 0x1e ; 30 if(code_seen('V')) V = code_value(); 15312: 86 e5 ldi r24, 0x56 ; 86 15314: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15318: 88 23 and r24, r24 1531a: 11 f4 brne .+4 ; 0x15320 1531c: 0c 94 44 bc jmp 0x17888 ; 0x17888 15320: 0e 94 35 60 call 0xc06a ; 0xc06a 15324: a2 96 adiw r28, 0x22 ; 34 15326: 6c af std Y+60, r22 ; 0x3c 15328: 7d af std Y+61, r23 ; 0x3d 1532a: 8e af std Y+62, r24 ; 0x3e 1532c: 9f af std Y+63, r25 ; 0x3f 1532e: a2 97 sbiw r28, 0x22 ; 34 if(code_seen('C')) C = code_value(); 15330: 83 e4 ldi r24, 0x43 ; 67 15332: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15336: 88 23 and r24, r24 15338: 11 f4 brne .+4 ; 0x1533e 1533a: 0c 94 50 bc jmp 0x178a0 ; 0x178a0 1533e: 0e 94 35 60 call 0xc06a ; 0xc06a 15342: 6a 96 adiw r28, 0x1a ; 26 15344: 6c af std Y+60, r22 ; 0x3c 15346: 7d af std Y+61, r23 ; 0x3d 15348: 8e af std Y+62, r24 ; 0x3e 1534a: 9f af std Y+63, r25 ; 0x3f 1534c: 6a 97 sbiw r28, 0x1a ; 26 if(code_seen('D')) D = code_value(); 1534e: 84 e4 ldi r24, 0x44 ; 68 15350: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15354: 88 23 and r24, r24 15356: 11 f4 brne .+4 ; 0x1535c 15358: 0c 94 5c bc jmp 0x178b8 ; 0x178b8 1535c: 0e 94 35 60 call 0xc06a ; 0xc06a 15360: aa 96 adiw r28, 0x2a ; 42 15362: 6c af std Y+60, r22 ; 0x3c 15364: 7d af std Y+61, r23 ; 0x3d 15366: 8e af std Y+62, r24 ; 0x3e 15368: 9f af std Y+63, r25 ; 0x3f 1536a: aa 97 sbiw r28, 0x2a ; 42 if(code_seen('L')) L = code_value_short(); 1536c: 8c e4 ldi r24, 0x4C ; 76 1536e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; int8_t I = -1, S = -1, B = -1, F = -1; int16_t A = -1, L = -1; 15372: 0f ef ldi r16, 0xFF ; 255 15374: 1f ef ldi r17, 0xFF ; 255 if(code_seen('P')) P = code_value(); if(code_seen('U')) U = code_value(); if(code_seen('V')) V = code_value(); if(code_seen('C')) C = code_value(); if(code_seen('D')) D = code_value(); if(code_seen('L')) L = code_value_short(); 15376: 88 23 and r24, r24 15378: 19 f0 breq .+6 ; 0x15380 1537a: 0e 94 0d 5b call 0xb61a ; 0xb61a 1537e: 8c 01 movw r16, r24 if(code_seen('S')) S = code_value_short(); 15380: 83 e5 ldi r24, 0x53 ; 83 15382: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15386: 88 23 and r24, r24 15388: 11 f4 brne .+4 ; 0x1538e 1538a: 0c 94 68 bc jmp 0x178d0 ; 0x178d0 1538e: 0e 94 0d 5b call 0xb61a ; 0xb61a 15392: e3 96 adiw r28, 0x33 ; 51 15394: 8f af std Y+63, r24 ; 0x3f 15396: e3 97 sbiw r28, 0x33 ; 51 if(code_seen('B')) B = code_value_short(); 15398: 82 e4 ldi r24, 0x42 ; 66 1539a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1539e: 88 23 and r24, r24 153a0: 11 f4 brne .+4 ; 0x153a6 153a2: 0c 94 6e bc jmp 0x178dc ; 0x178dc 153a6: 0e 94 0d 5b call 0xb61a ; 0xb61a 153aa: e7 96 adiw r28, 0x37 ; 55 153ac: 8f af std Y+63, r24 ; 0x3f 153ae: e7 97 sbiw r28, 0x37 ; 55 if(code_seen('T')) T = code_value(); 153b0: 84 e5 ldi r24, 0x54 ; 84 153b2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 153b6: 88 23 and r24, r24 153b8: 11 f4 brne .+4 ; 0x153be 153ba: 0c 94 74 bc jmp 0x178e8 ; 0x178e8 153be: 0e 94 35 60 call 0xc06a ; 0xc06a 153c2: a6 96 adiw r28, 0x26 ; 38 153c4: 6c af std Y+60, r22 ; 0x3c 153c6: 7d af std Y+61, r23 ; 0x3d 153c8: 8e af std Y+62, r24 ; 0x3e 153ca: 9f af std Y+63, r25 ; 0x3f 153cc: a6 97 sbiw r28, 0x26 ; 38 if(code_seen('E')) E = code_value(); 153ce: 85 e4 ldi r24, 0x45 ; 69 153d0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `F` - force model self-test state (0=off 1=on) during autotune using current values */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; 153d4: 41 2c mov r4, r1 153d6: 51 2c mov r5, r1 153d8: e0 ec ldi r30, 0xC0 ; 192 153da: 6e 2e mov r6, r30 153dc: ef e7 ldi r30, 0x7F ; 127 153de: 7e 2e mov r7, r30 if(code_seen('D')) D = code_value(); if(code_seen('L')) L = code_value_short(); if(code_seen('S')) S = code_value_short(); if(code_seen('B')) B = code_value_short(); if(code_seen('T')) T = code_value(); if(code_seen('E')) E = code_value(); 153e0: 88 23 and r24, r24 153e2: 21 f0 breq .+8 ; 0x153ec 153e4: 0e 94 35 60 call 0xc06a ; 0xc06a 153e8: 2b 01 movw r4, r22 153ea: 3c 01 movw r6, r24 if(code_seen('W')) W = code_value(); 153ec: 87 e5 ldi r24, 0x57 ; 87 153ee: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `F` - force model self-test state (0=off 1=on) during autotune using current values */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; 153f2: 81 2c mov r8, r1 153f4: 91 2c mov r9, r1 153f6: 70 ec ldi r23, 0xC0 ; 192 153f8: a7 2e mov r10, r23 153fa: 7f e7 ldi r23, 0x7F ; 127 153fc: b7 2e mov r11, r23 if(code_seen('L')) L = code_value_short(); if(code_seen('S')) S = code_value_short(); if(code_seen('B')) B = code_value_short(); if(code_seen('T')) T = code_value(); if(code_seen('E')) E = code_value(); if(code_seen('W')) W = code_value(); 153fe: 88 23 and r24, r24 15400: 21 f0 breq .+8 ; 0x1540a 15402: 0e 94 35 60 call 0xc06a ; 0xc06a 15406: 4b 01 movw r8, r22 15408: 5c 01 movw r10, r24 if(code_seen('A')) A = code_value_short(); 1540a: 81 e4 ldi r24, 0x41 ; 65 1540c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; int8_t I = -1, S = -1, B = -1, F = -1; int16_t A = -1, L = -1; 15410: 22 24 eor r2, r2 15412: 2a 94 dec r2 15414: 32 2c mov r3, r2 if(code_seen('S')) S = code_value_short(); if(code_seen('B')) B = code_value_short(); if(code_seen('T')) T = code_value(); if(code_seen('E')) E = code_value(); if(code_seen('W')) W = code_value(); if(code_seen('A')) A = code_value_short(); 15416: 88 23 and r24, r24 15418: 19 f0 breq .+6 ; 0x15420 1541a: 0e 94 0d 5b call 0xb61a ; 0xb61a 1541e: 1c 01 movw r2, r24 if(code_seen('F')) F = code_value_short(); 15420: 86 e4 ldi r24, 0x46 ; 70 15422: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15426: 88 23 and r24, r24 15428: 11 f4 brne .+4 ; 0x1542e 1542a: 0c 94 80 bc jmp 0x17900 ; 0x17900 1542e: 0e 94 0d 5b call 0xb61a ; 0xb61a 15432: eb 96 adiw r28, 0x3b ; 59 15434: 8f af std Y+63, r24 ; 0x3f 15436: eb 97 sbiw r28, 0x3b ; 59 // report values if nothing has been requested if(isnan(R) && isnan(P) && isnan(U) && isnan(V) && isnan(C) && isnan(D) && isnan(T) && isnan(W) && isnan(E) 15438: e2 96 adiw r28, 0x32 ; 50 1543a: 2c ad ldd r18, Y+60 ; 0x3c 1543c: 3d ad ldd r19, Y+61 ; 0x3d 1543e: 4e ad ldd r20, Y+62 ; 0x3e 15440: 5f ad ldd r21, Y+63 ; 0x3f 15442: e2 97 sbiw r28, 0x32 ; 50 15444: ca 01 movw r24, r20 15446: b9 01 movw r22, r18 15448: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1544c: 88 23 and r24, r24 1544e: 11 f4 brne .+4 ; 0x15454 15450: 0c 94 8a bc jmp 0x17914 ; 0x17914 15454: a7 01 movw r20, r14 15456: 96 01 movw r18, r12 15458: c7 01 movw r24, r14 1545a: b6 01 movw r22, r12 1545c: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 15460: 88 23 and r24, r24 15462: 11 f4 brne .+4 ; 0x15468 15464: 0c 94 8a bc jmp 0x17914 ; 0x17914 15468: 6e 96 adiw r28, 0x1e ; 30 1546a: 2c ad ldd r18, Y+60 ; 0x3c 1546c: 3d ad ldd r19, Y+61 ; 0x3d 1546e: 4e ad ldd r20, Y+62 ; 0x3e 15470: 5f ad ldd r21, Y+63 ; 0x3f 15472: 6e 97 sbiw r28, 0x1e ; 30 15474: ca 01 movw r24, r20 15476: b9 01 movw r22, r18 15478: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1547c: 88 23 and r24, r24 1547e: 11 f4 brne .+4 ; 0x15484 15480: 0c 94 8a bc jmp 0x17914 ; 0x17914 15484: a2 96 adiw r28, 0x22 ; 34 15486: 2c ad ldd r18, Y+60 ; 0x3c 15488: 3d ad ldd r19, Y+61 ; 0x3d 1548a: 4e ad ldd r20, Y+62 ; 0x3e 1548c: 5f ad ldd r21, Y+63 ; 0x3f 1548e: a2 97 sbiw r28, 0x22 ; 34 15490: ca 01 movw r24, r20 15492: b9 01 movw r22, r18 15494: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 15498: 88 23 and r24, r24 1549a: 11 f4 brne .+4 ; 0x154a0 1549c: 0c 94 8a bc jmp 0x17914 ; 0x17914 154a0: 6a 96 adiw r28, 0x1a ; 26 154a2: 2c ad ldd r18, Y+60 ; 0x3c 154a4: 3d ad ldd r19, Y+61 ; 0x3d 154a6: 4e ad ldd r20, Y+62 ; 0x3e 154a8: 5f ad ldd r21, Y+63 ; 0x3f 154aa: 6a 97 sbiw r28, 0x1a ; 26 154ac: ca 01 movw r24, r20 154ae: b9 01 movw r22, r18 154b0: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 154b4: 88 23 and r24, r24 154b6: 11 f4 brne .+4 ; 0x154bc 154b8: 0c 94 8a bc jmp 0x17914 ; 0x17914 154bc: aa 96 adiw r28, 0x2a ; 42 154be: 2c ad ldd r18, Y+60 ; 0x3c 154c0: 3d ad ldd r19, Y+61 ; 0x3d 154c2: 4e ad ldd r20, Y+62 ; 0x3e 154c4: 5f ad ldd r21, Y+63 ; 0x3f 154c6: aa 97 sbiw r28, 0x2a ; 42 154c8: ca 01 movw r24, r20 154ca: b9 01 movw r22, r18 154cc: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 154d0: 88 23 and r24, r24 154d2: 11 f4 brne .+4 ; 0x154d8 154d4: 0c 94 8a bc jmp 0x17914 ; 0x17914 154d8: a6 96 adiw r28, 0x26 ; 38 154da: 2c ad ldd r18, Y+60 ; 0x3c 154dc: 3d ad ldd r19, Y+61 ; 0x3d 154de: 4e ad ldd r20, Y+62 ; 0x3e 154e0: 5f ad ldd r21, Y+63 ; 0x3f 154e2: a6 97 sbiw r28, 0x26 ; 38 154e4: ca 01 movw r24, r20 154e6: b9 01 movw r22, r18 154e8: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 154ec: 88 23 and r24, r24 154ee: 11 f4 brne .+4 ; 0x154f4 154f0: 0c 94 8a bc jmp 0x17914 ; 0x17914 154f4: a5 01 movw r20, r10 154f6: 94 01 movw r18, r8 154f8: c5 01 movw r24, r10 154fa: b4 01 movw r22, r8 154fc: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 15500: 88 23 and r24, r24 15502: 11 f4 brne .+4 ; 0x15508 15504: 0c 94 8a bc jmp 0x17914 ; 0x17914 15508: a3 01 movw r20, r6 1550a: 92 01 movw r18, r4 1550c: c3 01 movw r24, r6 1550e: b2 01 movw r22, r4 15510: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 15514: 88 23 and r24, r24 15516: 11 f4 brne .+4 ; 0x1551c 15518: 0c 94 8a bc jmp 0x17914 ; 0x17914 && I < 0 && S < 0 && B < 0 && A < 0 && L < 0) { 1551c: ab 96 adiw r28, 0x2b ; 43 1551e: af ad ldd r26, Y+63 ; 0x3f 15520: ab 97 sbiw r28, 0x2b ; 43 15522: a7 fd sbrc r26, 7 15524: 02 c0 rjmp .+4 ; 0x1552a 15526: 0c 94 8a bc jmp 0x17914 ; 0x17914 1552a: e3 96 adiw r28, 0x33 ; 51 1552c: bf ad ldd r27, Y+63 ; 0x3f 1552e: e3 97 sbiw r28, 0x33 ; 51 15530: b7 fd sbrc r27, 7 15532: 02 c0 rjmp .+4 ; 0x15538 15534: 0c 94 8a bc jmp 0x17914 ; 0x17914 15538: e7 96 adiw r28, 0x37 ; 55 1553a: ef ad ldd r30, Y+63 ; 0x3f 1553c: e7 97 sbiw r28, 0x37 ; 55 1553e: e7 fd sbrc r30, 7 15540: 02 c0 rjmp .+4 ; 0x15546 15542: 0c 94 8f bc jmp 0x1791e ; 0x1791e 15546: 37 fc sbrc r3, 7 15548: 02 c0 rjmp .+4 ; 0x1554e 1554a: 0c 94 da bc jmp 0x179b4 ; 0x179b4 1554e: 17 ff sbrs r17, 7 15550: 02 c0 rjmp .+4 ; 0x15556 15552: 0c 94 86 bc jmp 0x1790c ; 0x1790c thermal_model::data.L = samples * intv_ms; } void thermal_model_set_params(float P, float U, float V, float C, float D, int16_t L, float Ta_corr, float warn, float err) { TempMgrGuard temp_mgr_guard; 15556: ce 01 movw r24, r28 15558: 01 96 adiw r24, 0x01 ; 1 1555a: 0f 94 76 32 call 0x264ec ; 0x264ec if(!isnan(P) && P > 0) thermal_model::data.P = P; 1555e: a7 01 movw r20, r14 15560: 96 01 movw r18, r12 15562: c7 01 movw r24, r14 15564: b6 01 movw r22, r12 15566: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1556a: 88 23 and r24, r24 1556c: 11 f4 brne .+4 ; 0x15572 1556e: 0c 94 7e bd jmp 0x17afc ; 0x17afc if(!isnan(U)) thermal_model::data.U = U; 15572: 6e 96 adiw r28, 0x1e ; 30 15574: 2c ad ldd r18, Y+60 ; 0x3c 15576: 3d ad ldd r19, Y+61 ; 0x3d 15578: 4e ad ldd r20, Y+62 ; 0x3e 1557a: 5f ad ldd r21, Y+63 ; 0x3f 1557c: 6e 97 sbiw r28, 0x1e ; 30 1557e: ca 01 movw r24, r20 15580: b9 01 movw r22, r18 15582: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 15586: 81 11 cpse r24, r1 15588: 0e c0 rjmp .+28 ; 0x155a6 1558a: 6e 96 adiw r28, 0x1e ; 30 1558c: 8c ad ldd r24, Y+60 ; 0x3c 1558e: 9d ad ldd r25, Y+61 ; 0x3d 15590: ae ad ldd r26, Y+62 ; 0x3e 15592: bf ad ldd r27, Y+63 ; 0x3f 15594: 6e 97 sbiw r28, 0x1e ; 30 15596: 80 93 dd 12 sts 0x12DD, r24 ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 1559a: 90 93 de 12 sts 0x12DE, r25 ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 1559e: a0 93 df 12 sts 0x12DF, r26 ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 155a2: b0 93 e0 12 sts 0x12E0, r27 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> if(!isnan(V)) thermal_model::data.V = V; 155a6: a2 96 adiw r28, 0x22 ; 34 155a8: 2c ad ldd r18, Y+60 ; 0x3c 155aa: 3d ad ldd r19, Y+61 ; 0x3d 155ac: 4e ad ldd r20, Y+62 ; 0x3e 155ae: 5f ad ldd r21, Y+63 ; 0x3f 155b0: a2 97 sbiw r28, 0x22 ; 34 155b2: ca 01 movw r24, r20 155b4: b9 01 movw r22, r18 155b6: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 155ba: 81 11 cpse r24, r1 155bc: 0e c0 rjmp .+28 ; 0x155da 155be: a2 96 adiw r28, 0x22 ; 34 155c0: 2c ad ldd r18, Y+60 ; 0x3c 155c2: 3d ad ldd r19, Y+61 ; 0x3d 155c4: 4e ad ldd r20, Y+62 ; 0x3e 155c6: 5f ad ldd r21, Y+63 ; 0x3f 155c8: a2 97 sbiw r28, 0x22 ; 34 155ca: 20 93 e1 12 sts 0x12E1, r18 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 155ce: 30 93 e2 12 sts 0x12E2, r19 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 155d2: 40 93 e3 12 sts 0x12E3, r20 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 155d6: 50 93 e4 12 sts 0x12E4, r21 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> if(!isnan(C) && C > 0) thermal_model::data.C = C; 155da: 6a 96 adiw r28, 0x1a ; 26 155dc: 2c ad ldd r18, Y+60 ; 0x3c 155de: 3d ad ldd r19, Y+61 ; 0x3d 155e0: 4e ad ldd r20, Y+62 ; 0x3e 155e2: 5f ad ldd r21, Y+63 ; 0x3f 155e4: 6a 97 sbiw r28, 0x1a ; 26 155e6: ca 01 movw r24, r20 155e8: b9 01 movw r22, r18 155ea: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 155ee: 81 11 cpse r24, r1 155f0: 1b c0 rjmp .+54 ; 0x15628 155f2: 20 e0 ldi r18, 0x00 ; 0 155f4: 30 e0 ldi r19, 0x00 ; 0 155f6: a9 01 movw r20, r18 155f8: 6a 96 adiw r28, 0x1a ; 26 155fa: 6c ad ldd r22, Y+60 ; 0x3c 155fc: 7d ad ldd r23, Y+61 ; 0x3d 155fe: 8e ad ldd r24, Y+62 ; 0x3e 15600: 9f ad ldd r25, Y+63 ; 0x3f 15602: 6a 97 sbiw r28, 0x1a ; 26 15604: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 15608: 18 16 cp r1, r24 1560a: 74 f4 brge .+28 ; 0x15628 1560c: 6a 96 adiw r28, 0x1a ; 26 1560e: 8c ad ldd r24, Y+60 ; 0x3c 15610: 9d ad ldd r25, Y+61 ; 0x3d 15612: ae ad ldd r26, Y+62 ; 0x3e 15614: bf ad ldd r27, Y+63 ; 0x3f 15616: 6a 97 sbiw r28, 0x1a ; 26 15618: 80 93 e5 12 sts 0x12E5, r24 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 1561c: 90 93 e6 12 sts 0x12E6, r25 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 15620: a0 93 e7 12 sts 0x12E7, r26 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 15624: b0 93 e8 12 sts 0x12E8, r27 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> if(!isnan(D)) thermal_model::data.fS = D; 15628: aa 96 adiw r28, 0x2a ; 42 1562a: 2c ad ldd r18, Y+60 ; 0x3c 1562c: 3d ad ldd r19, Y+61 ; 0x3d 1562e: 4e ad ldd r20, Y+62 ; 0x3e 15630: 5f ad ldd r21, Y+63 ; 0x3f 15632: aa 97 sbiw r28, 0x2a ; 42 15634: ca 01 movw r24, r20 15636: b9 01 movw r22, r18 15638: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1563c: 81 11 cpse r24, r1 1563e: 0e c0 rjmp .+28 ; 0x1565c 15640: aa 96 adiw r28, 0x2a ; 42 15642: 2c ad ldd r18, Y+60 ; 0x3c 15644: 3d ad ldd r19, Y+61 ; 0x3d 15646: 4e ad ldd r20, Y+62 ; 0x3e 15648: 5f ad ldd r21, Y+63 ; 0x3f 1564a: aa 97 sbiw r28, 0x2a ; 42 1564c: 20 93 e9 12 sts 0x12E9, r18 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 15650: 30 93 ea 12 sts 0x12EA, r19 ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 15654: 40 93 eb 12 sts 0x12EB, r20 ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 15658: 50 93 ec 12 sts 0x12EC, r21 ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> if(L >= 0) thermal_model_set_lag(L); 1565c: 17 fd sbrc r17, 7 1565e: 03 c0 rjmp .+6 ; 0x15666 15660: c8 01 movw r24, r16 15662: 0f 94 5e 2f call 0x25ebc ; 0x25ebc if(!isnan(Ta_corr)) thermal_model::data.Ta_corr = Ta_corr; 15666: a6 96 adiw r28, 0x26 ; 38 15668: 2c ad ldd r18, Y+60 ; 0x3c 1566a: 3d ad ldd r19, Y+61 ; 0x3d 1566c: 4e ad ldd r20, Y+62 ; 0x3e 1566e: 5f ad ldd r21, Y+63 ; 0x3f 15670: a6 97 sbiw r28, 0x26 ; 38 15672: ca 01 movw r24, r20 15674: b9 01 movw r22, r18 15676: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1567a: 81 11 cpse r24, r1 1567c: 0e c0 rjmp .+28 ; 0x1569a 1567e: a6 96 adiw r28, 0x26 ; 38 15680: 8c ad ldd r24, Y+60 ; 0x3c 15682: 9d ad ldd r25, Y+61 ; 0x3d 15684: ae ad ldd r26, Y+62 ; 0x3e 15686: bf ad ldd r27, Y+63 ; 0x3f 15688: a6 97 sbiw r28, 0x26 ; 38 1568a: 80 93 2f 13 sts 0x132F, r24 ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 1568e: 90 93 30 13 sts 0x1330, r25 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 15692: a0 93 31 13 sts 0x1331, r26 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 15696: b0 93 32 13 sts 0x1332, r27 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> if(!isnan(warn) && warn > 0) thermal_model::data.warn = warn; 1569a: a5 01 movw r20, r10 1569c: 94 01 movw r18, r8 1569e: c5 01 movw r24, r10 156a0: b4 01 movw r22, r8 156a2: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 156a6: 81 11 cpse r24, r1 156a8: 11 c0 rjmp .+34 ; 0x156cc 156aa: 20 e0 ldi r18, 0x00 ; 0 156ac: 30 e0 ldi r19, 0x00 ; 0 156ae: a9 01 movw r20, r18 156b0: c5 01 movw r24, r10 156b2: b4 01 movw r22, r8 156b4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 156b8: 18 16 cp r1, r24 156ba: 44 f4 brge .+16 ; 0x156cc 156bc: 80 92 33 13 sts 0x1333, r8 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 156c0: 90 92 34 13 sts 0x1334, r9 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 156c4: a0 92 35 13 sts 0x1335, r10 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 156c8: b0 92 36 13 sts 0x1336, r11 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> if(!isnan(err) && err > 0) thermal_model::data.err = err; 156cc: a3 01 movw r20, r6 156ce: 92 01 movw r18, r4 156d0: c3 01 movw r24, r6 156d2: b2 01 movw r22, r4 156d4: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 156d8: 81 11 cpse r24, r1 156da: 11 c0 rjmp .+34 ; 0x156fe 156dc: 20 e0 ldi r18, 0x00 ; 0 156de: 30 e0 ldi r19, 0x00 ; 0 156e0: a9 01 movw r20, r18 156e2: c3 01 movw r24, r6 156e4: b2 01 movw r22, r4 156e6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 156ea: 18 16 cp r1, r24 156ec: 44 f4 brge .+16 ; 0x156fe 156ee: 40 92 37 13 sts 0x1337, r4 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 156f2: 50 92 38 13 sts 0x1338, r5 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 156f6: 60 92 39 13 sts 0x1339, r6 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 156fa: 70 92 3a 13 sts 0x133A, r7 ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> // ensure warn <= err if (thermal_model::data.warn > thermal_model::data.err) 156fe: c0 90 37 13 lds r12, 0x1337 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 15702: d0 90 38 13 lds r13, 0x1338 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 15706: e0 90 39 13 lds r14, 0x1339 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 1570a: f0 90 3a 13 lds r15, 0x133A ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> 1570e: a7 01 movw r20, r14 15710: 96 01 movw r18, r12 15712: 60 91 33 13 lds r22, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 15716: 70 91 34 13 lds r23, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 1571a: 80 91 35 13 lds r24, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 1571e: 90 91 36 13 lds r25, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> 15722: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 15726: 18 16 cp r1, r24 15728: 44 f4 brge .+16 ; 0x1573a thermal_model::data.warn = thermal_model::data.err; 1572a: c0 92 33 13 sts 0x1333, r12 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 1572e: d0 92 34 13 sts 0x1334, r13 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 15732: e0 92 35 13 sts 0x1335, r14 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 15736: f0 92 36 13 sts 0x1336, r15 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> thermal_model::setup(); 1573a: 0f 94 e5 2f call 0x25fca ; 0x25fca thermal_model::data.L = samples * intv_ms; } void thermal_model_set_params(float P, float U, float V, float C, float D, int16_t L, float Ta_corr, float warn, float err) { TempMgrGuard temp_mgr_guard; 1573e: ce 01 movw r24, r28 15740: 01 96 adiw r24, 0x01 ; 1 15742: 0f 94 69 32 call 0x264d2 ; 0x264d2 15746: 0c 94 00 bd jmp 0x17a00 ; 0x17a00 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 1574a: 85 39 cpi r24, 0x95 ; 149 1574c: a1 e0 ldi r26, 0x01 ; 1 1574e: 9a 07 cpc r25, r26 15750: 11 f4 brne .+4 ; 0x15756 15752: 0c 94 f6 bf jmp 0x17fec ; 0x17fec 15756: 2c f5 brge .+74 ; 0x157a2 15758: 80 39 cpi r24, 0x90 ; 144 1575a: e1 e0 ldi r30, 0x01 ; 1 1575c: 9e 07 cpc r25, r30 1575e: 11 f4 brne .+4 ; 0x15764 15760: 0c 94 f2 bf jmp 0x17fe4 ; 0x17fe4 15764: 83 39 cpi r24, 0x93 ; 147 15766: 91 40 sbci r25, 0x01 ; 1 15768: 09 f0 breq .+2 ; 0x1576c 1576a: a6 c8 rjmp .-3764 ; 0x148b8 */ 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()) 1576c: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 15770: 81 30 cpi r24, 0x01 ; 1 15772: 09 f0 breq .+2 ; 0x15776 15774: c8 c4 rjmp .+2448 ; 0x16106 { uint8_t extruder = 255; uint8_t filament = FILAMENT_UNDEFINED; if(code_seen('E')) extruder = code_value_uint8(); 15776: 85 e4 ldi r24, 0x45 ; 69 15778: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1577c: 81 11 cpse r24, r1 1577e: 0e 94 00 5b call 0xb600 ; 0xb600 if(code_seen('F')) filament = code_value_uint8(); 15782: 86 e4 ldi r24, 0x46 ; 70 15784: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15788: 81 11 cpse r24, r1 1578a: 0e 94 00 5b call 0xb600 ; 0xb600 MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); SERIAL_ECHOLN((int)ex); } bool MMU2::set_filament_type(uint8_t /*slot*/, uint8_t /*type*/) { if (!WaitForMMUReady()) { 1578e: 0f 94 78 88 call 0x310f0 ; 0x310f0 15792: 88 23 and r24, r24 15794: 09 f4 brne .+2 ; 0x15798 15796: b7 c4 rjmp .+2414 ; 0x16106 // slot = slot; // @@TODO // type = type; // @@TODO // cmd_arg = filamentType; // command(MMU_CMD_F0 + index); if (!manage_response(false, false)) { 15798: 60 e0 ldi r22, 0x00 ; 0 1579a: 80 e0 ldi r24, 0x00 ; 0 1579c: 0f 94 6a ac call 0x358d4 ; 0x358d4 157a0: b2 c4 rjmp .+2404 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 157a2: 84 3a cpi r24, 0xA4 ; 164 157a4: 21 e0 ldi r18, 0x01 ; 1 157a6: 92 07 cpc r25, r18 157a8: 11 f4 brne .+4 ; 0x157ae 157aa: 0c 94 fb bf jmp 0x17ff6 ; 0x17ff6 157ae: 84 3f cpi r24, 0xF4 ; 244 157b0: 31 e0 ldi r19, 0x01 ; 1 157b2: 93 07 cpc r25, r19 157b4: 11 f4 brne .+4 ; 0x157ba 157b6: 0c 94 ff bf jmp 0x17ffe ; 0x17ffe 157ba: 86 39 cpi r24, 0x96 ; 150 157bc: 91 40 sbci r25, 0x01 ; 1 157be: 09 f0 breq .+2 ; 0x157c2 157c0: 7b c8 rjmp .-3850 ; 0x148b8 */ case 406: // M406 Disable Filament Sensor { fsensor.setEnabled(0); 157c2: 80 e0 ldi r24, 0x00 ; 0 157c4: 0e 94 67 74 call 0xe8ce ; 0xe8ce 157c8: 9e c4 rjmp .+2364 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 157ca: 83 3c cpi r24, 0xC3 ; 195 157cc: 52 e0 ldi r21, 0x02 ; 2 157ce: 95 07 cpc r25, r21 157d0: 11 f4 brne .+4 ; 0x157d6 157d2: 0c 94 39 cb jmp 0x19672 ; 0x19672 157d6: 0c f0 brlt .+2 ; 0x157da 157d8: e3 c3 rjmp .+1990 ; 0x15fa0 157da: 8a 35 cpi r24, 0x5A ; 90 157dc: b2 e0 ldi r27, 0x02 ; 2 157de: 9b 07 cpc r25, r27 157e0: 11 f4 brne .+4 ; 0x157e6 157e2: 0c 94 30 c4 jmp 0x18860 ; 0x18860 157e6: 0c f0 brlt .+2 ; 0x157ea 157e8: 76 c3 rjmp .+1772 ; 0x15ed6 157ea: 8d 3f cpi r24, 0xFD ; 253 157ec: f1 e0 ldi r31, 0x01 ; 1 157ee: 9f 07 cpc r25, r31 157f0: 11 f4 brne .+4 ; 0x157f6 157f2: 0c 94 19 c0 jmp 0x18032 ; 0x18032 157f6: 0c f0 brlt .+2 ; 0x157fa 157f8: 2e c3 rjmp .+1628 ; 0x15e56 157fa: 86 3f cpi r24, 0xF6 ; 246 157fc: 31 e0 ldi r19, 0x01 ; 1 157fe: 93 07 cpc r25, r19 15800: 11 f4 brne .+4 ; 0x15806 15802: 0c 94 07 c0 jmp 0x1800e ; 0x1800e 15806: 87 3f cpi r24, 0xF7 ; 247 15808: 91 40 sbci r25, 0x01 ; 1 1580a: 09 f0 breq .+2 ; 0x1580e 1580c: 55 c8 rjmp .-3926 ; 0x148b8 #ifndef DISABLE_M503 void Config_PrintSettings(uint8_t level) { // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown #ifdef TMC2130 printf_P(PSTR( 1580e: 80 91 20 0e lds r24, 0x0E20 ; 0x800e20 15812: 8f 93 push r24 15814: 80 91 1f 0e lds r24, 0x0E1F ; 0x800e1f 15818: 8f 93 push r24 1581a: 80 91 1e 0e lds r24, 0x0E1E ; 0x800e1e 1581e: 8f 93 push r24 15820: 80 91 1d 0e lds r24, 0x0E1D ; 0x800e1d 15824: 8f 93 push r24 15826: 80 91 1c 0e lds r24, 0x0E1C ; 0x800e1c 1582a: 8f 93 push r24 1582c: 80 91 1b 0e lds r24, 0x0E1B ; 0x800e1b 15830: 8f 93 push r24 15832: 80 91 1a 0e lds r24, 0x0E1A ; 0x800e1a 15836: 8f 93 push r24 15838: 80 91 19 0e lds r24, 0x0E19 ; 0x800e19 1583c: 8f 93 push r24 1583e: 80 91 18 0e lds r24, 0x0E18 ; 0x800e18 15842: 8f 93 push r24 15844: 80 91 17 0e lds r24, 0x0E17 ; 0x800e17 15848: 8f 93 push r24 1584a: 80 91 16 0e lds r24, 0x0E16 ; 0x800e16 1584e: 8f 93 push r24 15850: 80 91 15 0e lds r24, 0x0E15 ; 0x800e15 15854: 8f 93 push r24 15856: 02 ef ldi r16, 0xF2 ; 242 15858: 1a ea ldi r17, 0xAA ; 170 1585a: 1f 93 push r17 1585c: 0f 93 push r16 1585e: 1f 93 push r17 15860: 0f 93 push r16 15862: 80 91 14 0e lds r24, 0x0E14 ; 0x800e14 15866: 8f 93 push r24 15868: 80 91 13 0e lds r24, 0x0E13 ; 0x800e13 1586c: 8f 93 push r24 1586e: 80 91 12 0e lds r24, 0x0E12 ; 0x800e12 15872: 8f 93 push r24 15874: 80 91 11 0e lds r24, 0x0E11 ; 0x800e11 15878: 8f 93 push r24 1587a: 80 91 10 0e lds r24, 0x0E10 ; 0x800e10 1587e: 8f 93 push r24 15880: 80 91 0f 0e lds r24, 0x0E0F ; 0x800e0f 15884: 8f 93 push r24 15886: 80 91 0e 0e lds r24, 0x0E0E ; 0x800e0e 1588a: 8f 93 push r24 1588c: 80 91 0d 0e lds r24, 0x0E0D ; 0x800e0d 15890: 8f 93 push r24 15892: 80 91 0c 0e lds r24, 0x0E0C ; 0x800e0c 15896: 8f 93 push r24 15898: 80 91 0b 0e lds r24, 0x0E0B ; 0x800e0b 1589c: 8f 93 push r24 1589e: 80 91 0a 0e lds r24, 0x0E0A ; 0x800e0a 158a2: 8f 93 push r24 158a4: 80 91 09 0e lds r24, 0x0E09 ; 0x800e09 158a8: 8f 93 push r24 158aa: 80 91 08 0e lds r24, 0x0E08 ; 0x800e08 158ae: 8f 93 push r24 158b0: 80 91 07 0e lds r24, 0x0E07 ; 0x800e07 158b4: 8f 93 push r24 158b6: 80 91 06 0e lds r24, 0x0E06 ; 0x800e06 158ba: 8f 93 push r24 158bc: 80 91 05 0e lds r24, 0x0E05 ; 0x800e05 158c0: 8f 93 push r24 158c2: 80 91 04 0e lds r24, 0x0E04 ; 0x800e04 158c6: 8f 93 push r24 158c8: 80 91 03 0e lds r24, 0x0E03 ; 0x800e03 158cc: 8f 93 push r24 158ce: 80 91 02 0e lds r24, 0x0E02 ; 0x800e02 158d2: 8f 93 push r24 158d4: 80 91 01 0e lds r24, 0x0E01 ; 0x800e01 158d8: 8f 93 push r24 158da: 80 91 00 0e lds r24, 0x0E00 ; 0x800e00 158de: 8f 93 push r24 158e0: 80 91 ff 0d lds r24, 0x0DFF ; 0x800dff 158e4: 8f 93 push r24 158e6: 80 91 fe 0d lds r24, 0x0DFE ; 0x800dfe 158ea: 8f 93 push r24 158ec: 80 91 fd 0d lds r24, 0x0DFD ; 0x800dfd 158f0: 8f 93 push r24 158f2: 80 91 fc 0d lds r24, 0x0DFC ; 0x800dfc 158f6: 8f 93 push r24 158f8: 80 91 fb 0d lds r24, 0x0DFB ; 0x800dfb 158fc: 8f 93 push r24 158fe: 80 91 fa 0d lds r24, 0x0DFA ; 0x800dfa 15902: 8f 93 push r24 15904: 80 91 f9 0d lds r24, 0x0DF9 ; 0x800df9 15908: 8f 93 push r24 1590a: 1f 93 push r17 1590c: 0f 93 push r16 1590e: 1f 93 push r17 15910: 0f 93 push r16 15912: 80 91 80 0e lds r24, 0x0E80 ; 0x800e80 15916: 8f 93 push r24 15918: 80 91 7f 0e lds r24, 0x0E7F ; 0x800e7f 1591c: 8f 93 push r24 1591e: 80 91 7e 0e lds r24, 0x0E7E ; 0x800e7e 15922: 8f 93 push r24 15924: 80 91 7d 0e lds r24, 0x0E7D ; 0x800e7d 15928: 8f 93 push r24 1592a: 80 91 f8 0d lds r24, 0x0DF8 ; 0x800df8 1592e: 8f 93 push r24 15930: 80 91 f7 0d lds r24, 0x0DF7 ; 0x800df7 15934: 8f 93 push r24 15936: 80 91 f6 0d lds r24, 0x0DF6 ; 0x800df6 1593a: 8f 93 push r24 1593c: 80 91 f5 0d lds r24, 0x0DF5 ; 0x800df5 15940: 8f 93 push r24 15942: 80 91 f4 0d lds r24, 0x0DF4 ; 0x800df4 15946: 8f 93 push r24 15948: 80 91 f3 0d lds r24, 0x0DF3 ; 0x800df3 1594c: 8f 93 push r24 1594e: 80 91 f2 0d lds r24, 0x0DF2 ; 0x800df2 15952: 8f 93 push r24 15954: 80 91 f1 0d lds r24, 0x0DF1 ; 0x800df1 15958: 8f 93 push r24 1595a: 1f 93 push r17 1595c: 0f 93 push r16 1595e: 1f 93 push r17 15960: 0f 93 push r16 15962: 80 91 78 0e lds r24, 0x0E78 ; 0x800e78 15966: 8f 93 push r24 15968: 80 91 77 0e lds r24, 0x0E77 ; 0x800e77 1596c: 8f 93 push r24 1596e: 80 91 76 0e lds r24, 0x0E76 ; 0x800e76 15972: 8f 93 push r24 15974: 80 91 75 0e lds r24, 0x0E75 ; 0x800e75 15978: 8f 93 push r24 1597a: 80 91 74 0e lds r24, 0x0E74 ; 0x800e74 1597e: 8f 93 push r24 15980: 80 91 73 0e lds r24, 0x0E73 ; 0x800e73 15984: 8f 93 push r24 15986: 80 91 72 0e lds r24, 0x0E72 ; 0x800e72 1598a: 8f 93 push r24 1598c: 80 91 71 0e lds r24, 0x0E71 ; 0x800e71 15990: 8f 93 push r24 15992: 80 91 70 0e lds r24, 0x0E70 ; 0x800e70 15996: 8f 93 push r24 15998: 80 91 6f 0e lds r24, 0x0E6F ; 0x800e6f 1599c: 8f 93 push r24 1599e: 80 91 6e 0e lds r24, 0x0E6E ; 0x800e6e 159a2: 8f 93 push r24 159a4: 80 91 6d 0e lds r24, 0x0E6D ; 0x800e6d 159a8: 8f 93 push r24 159aa: 80 91 6c 0e lds r24, 0x0E6C ; 0x800e6c 159ae: 8f 93 push r24 159b0: 80 91 6b 0e lds r24, 0x0E6B ; 0x800e6b 159b4: 8f 93 push r24 159b6: 80 91 6a 0e lds r24, 0x0E6A ; 0x800e6a 159ba: 8f 93 push r24 159bc: 80 91 69 0e lds r24, 0x0E69 ; 0x800e69 159c0: 8f 93 push r24 159c2: 1f 93 push r17 159c4: 0f 93 push r16 159c6: 1f 93 push r17 159c8: 0f 93 push r16 159ca: 80 91 f0 0d lds r24, 0x0DF0 ; 0x800df0 159ce: 8f 93 push r24 159d0: 80 91 ef 0d lds r24, 0x0DEF ; 0x800def 159d4: 8f 93 push r24 159d6: 80 91 ee 0d lds r24, 0x0DEE ; 0x800dee 159da: 8f 93 push r24 159dc: 80 91 ed 0d lds r24, 0x0DED ; 0x800ded 159e0: 8f 93 push r24 159e2: 80 91 ec 0d lds r24, 0x0DEC ; 0x800dec 159e6: 8f 93 push r24 159e8: 80 91 eb 0d lds r24, 0x0DEB ; 0x800deb 159ec: 8f 93 push r24 159ee: 80 91 ea 0d lds r24, 0x0DEA ; 0x800dea 159f2: 8f 93 push r24 159f4: 80 91 e9 0d lds r24, 0x0DE9 ; 0x800de9 159f8: 8f 93 push r24 159fa: 80 91 e8 0d lds r24, 0x0DE8 ; 0x800de8 159fe: 8f 93 push r24 15a00: 80 91 e7 0d lds r24, 0x0DE7 ; 0x800de7 15a04: 8f 93 push r24 15a06: 80 91 e6 0d lds r24, 0x0DE6 ; 0x800de6 15a0a: 8f 93 push r24 15a0c: 80 91 e5 0d lds r24, 0x0DE5 ; 0x800de5 15a10: 8f 93 push r24 15a12: 80 91 e4 0d lds r24, 0x0DE4 ; 0x800de4 15a16: 8f 93 push r24 15a18: 80 91 e3 0d lds r24, 0x0DE3 ; 0x800de3 15a1c: 8f 93 push r24 15a1e: 80 91 e2 0d lds r24, 0x0DE2 ; 0x800de2 15a22: 8f 93 push r24 15a24: 80 91 e1 0d lds r24, 0x0DE1 ; 0x800de1 15a28: 8f 93 push r24 15a2a: 1f 93 push r17 15a2c: 0f 93 push r16 15a2e: 1f 93 push r17 15a30: 0f 93 push r16 15a32: 80 91 68 0e lds r24, 0x0E68 ; 0x800e68 15a36: 8f 93 push r24 15a38: 80 91 67 0e lds r24, 0x0E67 ; 0x800e67 15a3c: 8f 93 push r24 15a3e: 80 91 66 0e lds r24, 0x0E66 ; 0x800e66 15a42: 8f 93 push r24 15a44: 80 91 65 0e lds r24, 0x0E65 ; 0x800e65 15a48: 8f 93 push r24 15a4a: 80 91 64 0e lds r24, 0x0E64 ; 0x800e64 15a4e: 8f 93 push r24 15a50: 80 91 63 0e lds r24, 0x0E63 ; 0x800e63 15a54: 8f 93 push r24 15a56: 80 91 62 0e lds r24, 0x0E62 ; 0x800e62 15a5a: 8f 93 push r24 15a5c: 80 91 61 0e lds r24, 0x0E61 ; 0x800e61 15a60: 8f 93 push r24 15a62: 80 91 60 0e lds r24, 0x0E60 ; 0x800e60 15a66: 8f 93 push r24 15a68: 80 91 5f 0e lds r24, 0x0E5F ; 0x800e5f 15a6c: 8f 93 push r24 15a6e: 80 91 5e 0e lds r24, 0x0E5E ; 0x800e5e 15a72: 8f 93 push r24 15a74: 80 91 5d 0e lds r24, 0x0E5D ; 0x800e5d 15a78: 8f 93 push r24 15a7a: 80 91 5c 0e lds r24, 0x0E5C ; 0x800e5c 15a7e: 8f 93 push r24 15a80: 80 91 5b 0e lds r24, 0x0E5B ; 0x800e5b 15a84: 8f 93 push r24 15a86: 80 91 5a 0e lds r24, 0x0E5A ; 0x800e5a 15a8a: 8f 93 push r24 15a8c: 80 91 59 0e lds r24, 0x0E59 ; 0x800e59 15a90: 8f 93 push r24 15a92: 1f 93 push r17 15a94: 0f 93 push r16 15a96: 1f 93 push r17 15a98: 0f 93 push r16 15a9a: 80 91 e0 0d lds r24, 0x0DE0 ; 0x800de0 15a9e: 8f 93 push r24 15aa0: 80 91 df 0d lds r24, 0x0DDF ; 0x800ddf 15aa4: 8f 93 push r24 15aa6: 80 91 de 0d lds r24, 0x0DDE ; 0x800dde 15aaa: 8f 93 push r24 15aac: 80 91 dd 0d lds r24, 0x0DDD ; 0x800ddd 15ab0: 8f 93 push r24 15ab2: 80 91 dc 0d lds r24, 0x0DDC ; 0x800ddc 15ab6: 8f 93 push r24 15ab8: 80 91 db 0d lds r24, 0x0DDB ; 0x800ddb 15abc: 8f 93 push r24 15abe: 80 91 da 0d lds r24, 0x0DDA ; 0x800dda 15ac2: 8f 93 push r24 15ac4: 80 91 d9 0d lds r24, 0x0DD9 ; 0x800dd9 15ac8: 8f 93 push r24 15aca: 80 91 d8 0d lds r24, 0x0DD8 ; 0x800dd8 15ace: 8f 93 push r24 15ad0: 80 91 d7 0d lds r24, 0x0DD7 ; 0x800dd7 15ad4: 8f 93 push r24 15ad6: 80 91 d6 0d lds r24, 0x0DD6 ; 0x800dd6 15ada: 8f 93 push r24 15adc: 80 91 d5 0d lds r24, 0x0DD5 ; 0x800dd5 15ae0: 8f 93 push r24 15ae2: 80 91 d4 0d lds r24, 0x0DD4 ; 0x800dd4 15ae6: 8f 93 push r24 15ae8: 80 91 d3 0d lds r24, 0x0DD3 ; 0x800dd3 15aec: 8f 93 push r24 15aee: 80 91 d2 0d lds r24, 0x0DD2 ; 0x800dd2 15af2: 8f 93 push r24 15af4: 80 91 d1 0d lds r24, 0x0DD1 ; 0x800dd1 15af8: 8f 93 push r24 15afa: 1f 93 push r17 15afc: 0f 93 push r16 15afe: 1f 93 push r17 15b00: 0f 93 push r16 15b02: 80 91 7c 0e lds r24, 0x0E7C ; 0x800e7c 15b06: 1f 92 push r1 15b08: 8f 93 push r24 15b0a: 80 91 7b 0e lds r24, 0x0E7B ; 0x800e7b 15b0e: 1f 92 push r1 15b10: 8f 93 push r24 15b12: 80 91 7a 0e lds r24, 0x0E7A ; 0x800e7a 15b16: 1f 92 push r1 15b18: 8f 93 push r24 15b1a: 80 91 79 0e lds r24, 0x0E79 ; 0x800e79 15b1e: 1f 92 push r1 15b20: 8f 93 push r24 15b22: 1f 93 push r17 15b24: 0f 93 push r16 15b26: 1f 93 push r17 15b28: 0f 93 push r16 15b2a: 80 91 d0 0d lds r24, 0x0DD0 ; 0x800dd0 15b2e: 8f 93 push r24 15b30: 80 91 cf 0d lds r24, 0x0DCF ; 0x800dcf 15b34: 8f 93 push r24 15b36: 80 91 ce 0d lds r24, 0x0DCE ; 0x800dce 15b3a: 8f 93 push r24 15b3c: 80 91 cd 0d lds r24, 0x0DCD ; 0x800dcd 15b40: 8f 93 push r24 15b42: 80 91 cc 0d lds r24, 0x0DCC ; 0x800dcc 15b46: 8f 93 push r24 15b48: 80 91 cb 0d lds r24, 0x0DCB ; 0x800dcb 15b4c: 8f 93 push r24 15b4e: 80 91 ca 0d lds r24, 0x0DCA ; 0x800dca 15b52: 8f 93 push r24 15b54: 80 91 c9 0d lds r24, 0x0DC9 ; 0x800dc9 15b58: 8f 93 push r24 15b5a: 80 91 c8 0d lds r24, 0x0DC8 ; 0x800dc8 15b5e: 8f 93 push r24 15b60: 80 91 c7 0d lds r24, 0x0DC7 ; 0x800dc7 15b64: 8f 93 push r24 15b66: 80 91 c6 0d lds r24, 0x0DC6 ; 0x800dc6 15b6a: 8f 93 push r24 15b6c: 80 91 c5 0d lds r24, 0x0DC5 ; 0x800dc5 15b70: 8f 93 push r24 15b72: 80 91 c4 0d lds r24, 0x0DC4 ; 0x800dc4 15b76: 8f 93 push r24 15b78: 80 91 c3 0d lds r24, 0x0DC3 ; 0x800dc3 15b7c: 8f 93 push r24 15b7e: 80 91 c2 0d lds r24, 0x0DC2 ; 0x800dc2 15b82: 8f 93 push r24 15b84: 80 91 c1 0d lds r24, 0x0DC1 ; 0x800dc1 15b88: 8f 93 push r24 15b8a: 1f 93 push r17 15b8c: 0f 93 push r16 15b8e: 1f 93 push r17 15b90: 0f 93 push r16 15b92: 89 e8 ldi r24, 0x89 ; 137 15b94: 90 e8 ldi r25, 0x80 ; 128 15b96: 9f 93 push r25 15b98: 8f 93 push r24 15b9a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 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"), 15b9e: 0f b6 in r0, 0x3f ; 63 15ba0: f8 94 cli 15ba2: de bf out 0x3e, r29 ; 62 15ba4: 0f be out 0x3f, r0 ; 63 15ba6: cd bf out 0x3d, r28 ; 61 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 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 2d 0e lds r22, 0x0E2D ; 0x800e2d 15bb4: 70 91 2e 0e lds r23, 0x0E2E ; 0x800e2e 15bb8: 80 91 2f 0e lds r24, 0x0E2F ; 0x800e2f 15bbc: 90 91 30 0e lds r25, 0x0E30 ; 0x800e30 15bc0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 15bc4: 9f 93 push r25 15bc6: 8f 93 push r24 15bc8: 7f 93 push r23 15bca: 6f 93 push r22 } float unscalePID_i(float i) { return i/PID_dT; 15bcc: 2c ea ldi r18, 0xAC ; 172 15bce: 35 ec ldi r19, 0xC5 ; 197 15bd0: 47 e2 ldi r20, 0x27 ; 39 15bd2: 5e e3 ldi r21, 0x3E ; 62 15bd4: 60 91 29 0e lds r22, 0x0E29 ; 0x800e29 15bd8: 70 91 2a 0e lds r23, 0x0E2A ; 0x800e2a 15bdc: 80 91 2b 0e lds r24, 0x0E2B ; 0x800e2b 15be0: 90 91 2c 0e lds r25, 0x0E2C ; 0x800e2c 15be4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 15be8: 9f 93 push r25 15bea: 8f 93 push r24 15bec: 7f 93 push r23 15bee: 6f 93 push r22 15bf0: 80 91 28 0e lds r24, 0x0E28 ; 0x800e28 15bf4: 8f 93 push r24 15bf6: 80 91 27 0e lds r24, 0x0E27 ; 0x800e27 15bfa: 8f 93 push r24 15bfc: 80 91 26 0e lds r24, 0x0E26 ; 0x800e26 15c00: 8f 93 push r24 15c02: 80 91 25 0e lds r24, 0x0E25 ; 0x800e25 15c06: 8f 93 push r24 15c08: 1f 93 push r17 15c0a: 0f 93 push r16 15c0c: 1f 93 push r17 15c0e: 0f 93 push r16 15c10: 8c e5 ldi r24, 0x5C ; 92 15c12: 90 e8 ldi r25, 0x80 ; 128 15c14: 9f 93 push r25 15c16: 8f 93 push r24 15c18: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 15c1c: 2c ea ldi r18, 0xAC ; 172 15c1e: 35 ec ldi r19, 0xC5 ; 197 15c20: 47 e2 ldi r20, 0x27 ; 39 15c22: 5e e3 ldi r21, 0x3E ; 62 15c24: 60 91 39 0e lds r22, 0x0E39 ; 0x800e39 15c28: 70 91 3a 0e lds r23, 0x0E3A ; 0x800e3a 15c2c: 80 91 3b 0e lds r24, 0x0E3B ; 0x800e3b 15c30: 90 91 3c 0e lds r25, 0x0E3C ; 0x800e3c 15c34: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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"), 15c38: 9f 93 push r25 15c3a: 8f 93 push r24 15c3c: 7f 93 push r23 15c3e: 6f 93 push r22 } float unscalePID_i(float i) { return i/PID_dT; 15c40: 2c ea ldi r18, 0xAC ; 172 15c42: 35 ec ldi r19, 0xC5 ; 197 15c44: 47 e2 ldi r20, 0x27 ; 39 15c46: 5e e3 ldi r21, 0x3E ; 62 15c48: 60 91 35 0e lds r22, 0x0E35 ; 0x800e35 15c4c: 70 91 36 0e lds r23, 0x0E36 ; 0x800e36 15c50: 80 91 37 0e lds r24, 0x0E37 ; 0x800e37 15c54: 90 91 38 0e lds r25, 0x0E38 ; 0x800e38 15c58: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 15c5c: 9f 93 push r25 15c5e: 8f 93 push r24 15c60: 7f 93 push r23 15c62: 6f 93 push r22 15c64: 80 91 34 0e lds r24, 0x0E34 ; 0x800e34 15c68: 8f 93 push r24 15c6a: 80 91 33 0e lds r24, 0x0E33 ; 0x800e33 15c6e: 8f 93 push r24 15c70: 80 91 32 0e lds r24, 0x0E32 ; 0x800e32 15c74: 8f 93 push r24 15c76: 80 91 31 0e lds r24, 0x0E31 ; 0x800e31 15c7a: 8f 93 push r24 15c7c: 1f 93 push r17 15c7e: 0f 93 push r16 15c80: 1f 93 push r17 15c82: 0f 93 push r16 15c84: 87 e2 ldi r24, 0x27 ; 39 15c86: 90 e8 ldi r25, 0x80 ; 128 15c88: 9f 93 push r25 15c8a: 8f 93 push r24 15c8c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 echomagic, echomagic, cs.bedKp, unscalePID_i(cs.bedKi), unscalePID_d(cs.bedKd)); #endif #ifdef FWRETRACT printf_P(PSTR( 15c90: 0f b6 in r0, 0x3f ; 63 15c92: f8 94 cli 15c94: de bf out 0x3e, r29 ; 62 15c96: 0f be out 0x3f, r0 ; 63 15c98: cd bf out 0x3d, r28 ; 61 15c9a: 80 91 3f 0e lds r24, 0x0E3F ; 0x800e3f 15c9e: 1f 92 push r1 15ca0: 8f 93 push r24 15ca2: 1f 93 push r17 15ca4: 0f 93 push r16 15ca6: 1f 93 push r17 15ca8: 0f 93 push r16 15caa: 20 e0 ldi r18, 0x00 ; 0 15cac: 30 e0 ldi r19, 0x00 ; 0 15cae: 40 e7 ldi r20, 0x70 ; 112 15cb0: 52 e4 ldi r21, 0x42 ; 66 15cb2: 60 91 50 0e lds r22, 0x0E50 ; 0x800e50 15cb6: 70 91 51 0e lds r23, 0x0E51 ; 0x800e51 15cba: 80 91 52 0e lds r24, 0x0E52 ; 0x800e52 15cbe: 90 91 53 0e lds r25, 0x0E53 ; 0x800e53 15cc2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 15cc6: 9f 93 push r25 15cc8: 8f 93 push r24 15cca: 7f 93 push r23 15ccc: 6f 93 push r22 15cce: 80 91 4f 0e lds r24, 0x0E4F ; 0x800e4f 15cd2: 8f 93 push r24 15cd4: 80 91 4e 0e lds r24, 0x0E4E ; 0x800e4e 15cd8: 8f 93 push r24 15cda: 80 91 4d 0e lds r24, 0x0E4D ; 0x800e4d 15cde: 8f 93 push r24 15ce0: 80 91 4c 0e lds r24, 0x0E4C ; 0x800e4c 15ce4: 8f 93 push r24 15ce6: 1f 93 push r17 15ce8: 0f 93 push r16 15cea: 1f 93 push r17 15cec: 0f 93 push r16 15cee: 80 91 4b 0e lds r24, 0x0E4B ; 0x800e4b 15cf2: 8f 93 push r24 15cf4: 80 91 4a 0e lds r24, 0x0E4A ; 0x800e4a 15cf8: 8f 93 push r24 15cfa: 80 91 49 0e lds r24, 0x0E49 ; 0x800e49 15cfe: 8f 93 push r24 15d00: 80 91 48 0e lds r24, 0x0E48 ; 0x800e48 15d04: 8f 93 push r24 15d06: 20 e0 ldi r18, 0x00 ; 0 15d08: 30 e0 ldi r19, 0x00 ; 0 15d0a: 40 e7 ldi r20, 0x70 ; 112 15d0c: 52 e4 ldi r21, 0x42 ; 66 15d0e: 60 91 44 0e lds r22, 0x0E44 ; 0x800e44 15d12: 70 91 45 0e lds r23, 0x0E45 ; 0x800e45 15d16: 80 91 46 0e lds r24, 0x0E46 ; 0x800e46 15d1a: 90 91 47 0e lds r25, 0x0E47 ; 0x800e47 15d1e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 15d22: 9f 93 push r25 15d24: 8f 93 push r24 15d26: 7f 93 push r23 15d28: 6f 93 push r22 15d2a: 80 91 43 0e lds r24, 0x0E43 ; 0x800e43 15d2e: 8f 93 push r24 15d30: 80 91 42 0e lds r24, 0x0E42 ; 0x800e42 15d34: 8f 93 push r24 15d36: 80 91 41 0e lds r24, 0x0E41 ; 0x800e41 15d3a: 8f 93 push r24 15d3c: 80 91 40 0e lds r24, 0x0E40 ; 0x800e40 15d40: 8f 93 push r24 15d42: 1f 93 push r17 15d44: 0f 93 push r16 15d46: 1f 93 push r17 15d48: 0f 93 push r16 15d4a: 86 e2 ldi r24, 0x26 ; 38 15d4c: 9f e7 ldi r25, 0x7F ; 127 15d4e: 9f 93 push r25 15d50: 8f 93 push r24 15d52: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 ); #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) { 15d56: 0f b6 in r0, 0x3f ; 63 15d58: f8 94 cli 15d5a: de bf out 0x3e, r29 ; 62 15d5c: 0f be out 0x3f, r0 ; 63 15d5e: cd bf out 0x3d, r28 ; 61 15d60: 80 91 54 0e lds r24, 0x0E54 ; 0x800e54 15d64: 88 23 and r24, r24 15d66: 11 f4 brne .+4 ; 0x15d6c 15d68: 0c 94 0b c0 jmp 0x18016 ; 0x18016 printf_P(PSTR("%SFilament settings:\n%S M200 D%.2f\n"), 15d6c: 80 91 58 0e lds r24, 0x0E58 ; 0x800e58 15d70: 8f 93 push r24 15d72: 80 91 57 0e lds r24, 0x0E57 ; 0x800e57 15d76: 8f 93 push r24 15d78: 80 91 56 0e lds r24, 0x0E56 ; 0x800e56 15d7c: 8f 93 push r24 15d7e: 80 91 55 0e lds r24, 0x0E55 ; 0x800e55 15d82: 8f 93 push r24 15d84: 1f 93 push r17 15d86: 0f 93 push r16 15d88: 1f 93 push r17 15d8a: 0f 93 push r16 15d8c: 80 e0 ldi r24, 0x00 ; 0 15d8e: 9f e7 ldi r25, 0x7F ; 127 15d90: 9f 93 push r25 15d92: 8f 93 push r24 15d94: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 15d98: 0f b6 in r0, 0x3f ; 63 15d9a: f8 94 cli 15d9c: de bf out 0x3e, r29 ; 62 15d9e: 0f be out 0x3f, r0 ; 63 15da0: 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( 15da2: 80 91 8d 0e lds r24, 0x0E8D ; 0x800e8d 15da6: 8f 93 push r24 15da8: 80 91 8c 0e lds r24, 0x0E8C ; 0x800e8c 15dac: 8f 93 push r24 15dae: 80 91 8b 0e lds r24, 0x0E8B ; 0x800e8b 15db2: 8f 93 push r24 15db4: 80 91 8a 0e lds r24, 0x0E8A ; 0x800e8a 15db8: 8f 93 push r24 15dba: 80 91 89 0e lds r24, 0x0E89 ; 0x800e89 15dbe: 1f 92 push r1 15dc0: 8f 93 push r24 15dc2: 80 91 88 0e lds r24, 0x0E88 ; 0x800e88 15dc6: 8f 93 push r24 15dc8: 80 91 87 0e lds r24, 0x0E87 ; 0x800e87 15dcc: 8f 93 push r24 15dce: 80 91 86 0e lds r24, 0x0E86 ; 0x800e86 15dd2: 8f 93 push r24 15dd4: 80 91 85 0e lds r24, 0x0E85 ; 0x800e85 15dd8: 8f 93 push r24 15dda: 80 91 84 0e lds r24, 0x0E84 ; 0x800e84 15dde: 8f 93 push r24 15de0: 80 91 83 0e lds r24, 0x0E83 ; 0x800e83 15de4: 8f 93 push r24 15de6: 80 91 82 0e lds r24, 0x0E82 ; 0x800e82 15dea: 8f 93 push r24 15dec: 80 91 81 0e lds r24, 0x0E81 ; 0x800e81 15df0: 8f 93 push r24 15df2: 02 ef ldi r16, 0xF2 ; 242 15df4: 1a ea ldi r17, 0xAA ; 170 15df6: 1f 93 push r17 15df8: 0f 93 push r16 15dfa: 1f 93 push r17 15dfc: 0f 93 push r16 15dfe: 8f e5 ldi r24, 0x5F ; 95 15e00: 9e e7 ldi r25, 0x7E ; 126 15e02: 9f 93 push r25 15e04: 8f 93 push r24 15e06: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 "%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(); 15e0a: 0f 94 9d 2e call 0x25d3a ; 0x25d3a #endif printf_P(PSTR( 15e0e: 8d ee ldi r24, 0xED ; 237 15e10: 9f e0 ldi r25, 0x0F ; 15 15e12: 0f 94 18 dc call 0x3b830 ; 0x3b830 15e16: f6 2e mov r15, r22 15e18: e7 2e mov r14, r23 15e1a: d8 2e mov r13, r24 15e1c: c9 2e mov r12, r25 15e1e: 81 ef ldi r24, 0xF1 ; 241 15e20: 9f e0 ldi r25, 0x0F ; 15 15e22: 0f 94 18 dc call 0x3b830 ; 0x3b830 15e26: cf 92 push r12 15e28: df 92 push r13 15e2a: ef 92 push r14 15e2c: ff 92 push r15 15e2e: 9f 93 push r25 15e30: 8f 93 push r24 15e32: 7f 93 push r23 15e34: 6f 93 push r22 15e36: 1f 93 push r17 15e38: 0f 93 push r16 15e3a: 1f 93 push r17 15e3c: 0f 93 push r16 15e3e: 8e e3 ldi r24, 0x3E ; 62 15e40: 9e e7 ldi r25, 0x7E ; 126 15e42: 9f 93 push r25 15e44: 8f 93 push r24 15e46: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 15e4a: 0f b6 in r0, 0x3f ; 63 15e4c: f8 94 cli 15e4e: de bf out 0x3e, r29 ; 62 15e50: 0f be out 0x3f, r0 ; 63 15e52: cd bf out 0x3d, r28 ; 61 15e54: 58 c1 rjmp .+688 ; 0x16106 15e56: 88 35 cpi r24, 0x58 ; 88 15e58: 52 e0 ldi r21, 0x02 ; 2 15e5a: 95 07 cpc r25, r21 15e5c: 11 f4 brne .+4 ; 0x15e62 15e5e: 0c 94 25 c0 jmp 0x1804a ; 0x1804a 15e62: 14 f0 brlt .+4 ; 0x15e68 15e64: 0c 94 d0 a4 jmp 0x149a0 ; 0x149a0 15e68: 88 32 cpi r24, 0x28 ; 40 15e6a: 92 40 sbci r25, 0x02 ; 2 15e6c: 11 f0 breq .+4 ; 0x15e72 15e6e: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 #### Parameters - `P` - The IP address in xxx.xxx.xxx.xxx format. Eg: P192.168.1.14 */ case 552: { if (code_seen('P')) 15e72: 80 e5 ldi r24, 0x50 ; 80 15e74: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15e78: 88 23 and r24, r24 15e7a: 09 f4 brne .+2 ; 0x15e7e 15e7c: 44 c1 rjmp .+648 ; 0x16106 { uint8_t valCnt = 0; IP_address = 0; 15e7e: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d 15e82: 10 92 5e 06 sts 0x065E, r1 ; 0x80065e 15e86: 10 92 5f 06 sts 0x065F, r1 ; 0x80065f 15e8a: 10 92 60 06 sts 0x0660, r1 ; 0x800660 15e8e: 0d e5 ldi r16, 0x5D ; 93 15e90: 16 e0 ldi r17, 0x06 ; 6 15e92: 41 e6 ldi r20, 0x61 ; 97 15e94: e4 2e mov r14, r20 15e96: 46 e0 ldi r20, 0x06 ; 6 15e98: f4 2e mov r15, r20 do { *strchr_pointer = '*'; 15e9a: 5a e2 ldi r21, 0x2A ; 42 15e9c: d5 2e mov r13, r21 15e9e: e0 91 93 03 lds r30, 0x0393 ; 0x800393 15ea2: f0 91 94 03 lds r31, 0x0394 ; 0x800394 15ea6: d0 82 st Z, r13 ((uint8_t*)&IP_address)[valCnt] = code_value_short(); 15ea8: 0e 94 0d 5b call 0xb61a ; 0xb61a 15eac: d8 01 movw r26, r16 15eae: 8d 93 st X+, r24 15eb0: 8d 01 movw r16, r26 valCnt++; } while ((valCnt < 4) && code_seen('.')); 15eb2: ea 16 cp r14, r26 15eb4: fb 06 cpc r15, r27 15eb6: 09 f4 brne .+2 ; 0x15eba 15eb8: 26 c1 rjmp .+588 ; 0x16106 15eba: 8e e2 ldi r24, 0x2E ; 46 15ebc: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15ec0: 81 11 cpse r24, r1 15ec2: ed cf rjmp .-38 ; 0x15e9e if (valCnt != 4) IP_address = 0; 15ec4: 10 92 5d 06 sts 0x065D, r1 ; 0x80065d 15ec8: 10 92 5e 06 sts 0x065E, r1 ; 0x80065e 15ecc: 10 92 5f 06 sts 0x065F, r1 ; 0x80065f 15ed0: 10 92 60 06 sts 0x0660, r1 ; 0x800660 15ed4: 18 c1 rjmp .+560 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15ed6: 8e 3b cpi r24, 0xBE ; 190 15ed8: e2 e0 ldi r30, 0x02 ; 2 15eda: 9e 07 cpc r25, r30 15edc: 11 f4 brne .+4 ; 0x15ee2 15ede: 0c 94 f9 ca jmp 0x195f2 ; 0x195f2 15ee2: 0c f0 brlt .+2 ; 0x15ee6 15ee4: 4a c0 rjmp .+148 ; 0x15f7a 15ee6: 8b 35 cpi r24, 0x5B ; 91 15ee8: 22 e0 ldi r18, 0x02 ; 2 15eea: 92 07 cpc r25, r18 15eec: 11 f4 brne .+4 ; 0x15ef2 15eee: 0c 94 38 c4 jmp 0x18870 ; 0x18870 15ef2: 8d 3b cpi r24, 0xBD ; 189 15ef4: 92 40 sbci r25, 0x02 ; 2 15ef6: 11 f0 breq .+4 ; 0x15efc 15ef8: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 case 701: { uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU float z_target = 0; if( MMU2::mmu2.Enabled() ) 15efc: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 15f00: 81 30 cpi r24, 0x01 ; 1 15f02: 11 f4 brne .+4 ; 0x15f08 15f04: 0c 94 9a ca jmp 0x19534 ; 0x19534 - `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; 15f08: 1f ef ldi r17, 0xFF ; 255 if( code_seen('P') || code_seen('T') ) { mmuSlotIndex = code_value_uint8(); } } if (code_seen('L')) fastLoadLength = code_value(); 15f0a: 8c e4 ldi r24, 0x4C ; 76 15f0c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `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 15f10: c1 2c mov r12, r1 15f12: d1 2c mov r13, r1 15f14: 6c e8 ldi r22, 0x8C ; 140 15f16: e6 2e mov r14, r22 15f18: 62 e4 ldi r22, 0x42 ; 66 15f1a: f6 2e mov r15, r22 if( code_seen('P') || code_seen('T') ) { mmuSlotIndex = code_value_uint8(); } } if (code_seen('L')) fastLoadLength = code_value(); 15f1c: 88 23 and r24, r24 15f1e: 21 f0 breq .+8 ; 0x15f28 15f20: 0e 94 35 60 call 0xc06a ; 0xc06a 15f24: 6b 01 movw r12, r22 15f26: 7c 01 movw r14, r24 // Z lift. For safety only allow positive values if (code_seen('Z')) z_target = fabs(code_value()); 15f28: 8a e5 ldi r24, 0x5A ; 90 15f2a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15f2e: 88 23 and r24, r24 15f30: 11 f4 brne .+4 ; 0x15f36 15f32: 0c 94 ab ca jmp 0x19556 ; 0x19556 15f36: 0e 94 35 60 call 0xc06a ; 0xc06a 15f3a: 9f 77 andi r25, 0x7F ; 127 // Raise the Z axis float delta = raise_z(z_target); 15f3c: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 15f40: 4b 01 movw r8, r22 15f42: 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 15f44: 8a e5 ldi r24, 0x5A ; 90 15f46: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15f4a: 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; 15f4c: 0f 94 a5 87 call 0x30f4a ; 0x30f4a prusa_statistics(22); if (MMU2::mmu2.Enabled()) { 15f50: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 15f54: 81 30 cpi r24, 0x01 ; 1 15f56: 11 f0 breq .+4 ; 0x15f5c 15f58: 0c 94 b0 ca jmp 0x19560 ; 0x19560 if (mmuSlotIndex < MMU_FILAMENT_COUNT) { 15f5c: 15 30 cpi r17, 0x05 ; 5 15f5e: 18 f4 brcc .+6 ; 0x15f66 MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex); 15f60: 81 2f mov r24, r17 15f62: 0f 94 8c 0f call 0x21f18 ; 0x21f18 lcd_update(2); lcd_setstatuspgm(MSG_WELCOME); custom_message_type = CustomMsg::Status; } eFilamentAction = FilamentAction::None; 15f66: 10 92 a5 03 sts 0x03A5, r1 ; 0x8003a5 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 15f6a: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 // 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); 15f6e: c5 01 movw r24, r10 15f70: b4 01 movw r22, r8 15f72: 90 58 subi r25, 0x80 ; 128 15f74: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 15f78: c6 c0 rjmp .+396 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15f7a: 81 3c cpi r24, 0xC1 ; 193 15f7c: 42 e0 ldi r20, 0x02 ; 2 15f7e: 94 07 cpc r25, r20 15f80: 11 f4 brne .+4 ; 0x15f86 15f82: 0c 94 2d cb jmp 0x1965a ; 0x1965a 15f86: 14 f0 brlt .+4 ; 0x15f8c 15f88: 0c 94 33 cb jmp 0x19666 ; 0x19666 15f8c: 80 3c cpi r24, 0xC0 ; 192 15f8e: 92 40 sbci r25, 0x02 ; 2 15f90: 11 f0 breq .+4 ; 0x15f96 15f92: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 704: { gcodes_M704_M705_M706(704); 15f96: 80 ec ldi r24, 0xC0 ; 192 15f98: 92 e0 ldi r25, 0x02 ; 2 15f9a: 0e 94 e7 5f call 0xbfce ; 0xbfce 15f9e: b3 c0 rjmp .+358 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 15fa0: 84 38 cpi r24, 0x84 ; 132 15fa2: b3 e0 ldi r27, 0x03 ; 3 15fa4: 9b 07 cpc r25, r27 15fa6: 11 f4 brne .+4 ; 0x15fac 15fa8: 0c 94 e2 c7 jmp 0x18fc4 ; 0x18fc4 15fac: 0c f0 brlt .+2 ; 0x15fb0 15fae: 99 c0 rjmp .+306 ; 0x160e2 15fb0: 82 35 cpi r24, 0x52 ; 82 15fb2: f3 e0 ldi r31, 0x03 ; 3 15fb4: 9f 07 cpc r25, r31 15fb6: 11 f4 brne .+4 ; 0x15fbc 15fb8: 0c 94 3e c4 jmp 0x1887c ; 0x1887c 15fbc: 9c f5 brge .+102 ; 0x16024 15fbe: 84 3c cpi r24, 0xC4 ; 196 15fc0: 32 e0 ldi r19, 0x02 ; 2 15fc2: 93 07 cpc r25, r19 15fc4: 11 f4 brne .+4 ; 0x15fca 15fc6: 0c 94 56 cb jmp 0x196ac ; 0x196ac 15fca: 85 3c cpi r24, 0xC5 ; 197 15fcc: 92 40 sbci r25, 0x02 ; 2 15fce: 11 f0 breq .+4 ; 0x15fd4 15fd0: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 M709 - Serial message if en- or disabled */ case 709: { if (code_seen('S')) 15fd4: 83 e5 ldi r24, 0x53 ; 83 15fd6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 15fda: 88 23 and r24, r24 15fdc: 51 f0 breq .+20 ; 0x15ff2 { switch (code_value_uint8()) 15fde: 0e 94 00 5b call 0xb600 ; 0xb600 15fe2: 88 23 and r24, r24 15fe4: 11 f4 brne .+4 ; 0x15fea 15fe6: 0c 94 82 cb jmp 0x19704 ; 0x19704 15fea: 81 30 cpi r24, 0x01 ; 1 15fec: 11 f4 brne .+4 ; 0x15ff2 15fee: 0c 94 8f cb jmp 0x1971e ; 0x1971e break; default: break; } } if (MMU2::mmu2.Enabled() && code_seen('X')) 15ff2: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 15ff6: 81 30 cpi r24, 0x01 ; 1 15ff8: 91 f4 brne .+36 ; 0x1601e 15ffa: 88 e5 ldi r24, 0x58 ; 88 15ffc: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16000: 88 23 and r24, r24 16002: 69 f0 breq .+26 ; 0x1601e { switch (code_value_uint8()) 16004: 0e 94 00 5b call 0xb600 ; 0xb600 16008: 81 30 cpi r24, 0x01 ; 1 1600a: 11 f4 brne .+4 ; 0x16010 1600c: 0c 94 9d cb jmp 0x1973a ; 0x1973a 16010: 10 f4 brcc .+4 ; 0x16016 16012: 0c 94 98 cb jmp 0x19730 ; 0x19730 16016: 8a 32 cpi r24, 0x2A ; 42 16018: 11 f4 brne .+4 ; 0x1601e 1601a: 0c 94 a1 cb jmp 0x19742 ; 0x19742 break; default: break; } } MMU2::mmu2.Status(); 1601e: 0f 94 da 75 call 0x2ebb4 ; 0x2ebb4 16022: 71 c0 rjmp .+226 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 16024: 8d 35 cpi r24, 0x5D ; 93 16026: 53 e0 ldi r21, 0x03 ; 3 16028: 95 07 cpc r25, r21 1602a: 11 f4 brne .+4 ; 0x16030 1602c: 0c 94 b4 c5 jmp 0x18b68 ; 0x18b68 16030: 8e 35 cpi r24, 0x5E ; 94 16032: a3 e0 ldi r26, 0x03 ; 3 16034: 9a 07 cpc r25, r26 16036: 11 f4 brne .+4 ; 0x1603c 16038: 0c 94 4c c6 jmp 0x18c98 ; 0x18c98 1603c: 8c 35 cpi r24, 0x5C ; 92 1603e: 93 40 sbci r25, 0x03 ; 3 16040: 11 f0 breq .+4 ; 0x16046 16042: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 */ case 860: { int set_target_pinda = 0; if (code_seen('S')) { 16046: 83 e5 ldi r24, 0x53 ; 83 16048: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1604c: 88 23 and r24, r24 1604e: 09 f4 brne .+2 ; 0x16052 16050: 5a c0 rjmp .+180 ; 0x16106 set_target_pinda = code_value_short(); 16052: 0e 94 0d 5b call 0xb61a ; 0xb61a 16056: 8c 01 movw r16, r24 } else { break; } LCD_MESSAGERPGM(_T(MSG_PLEASE_WAIT)); 16058: 89 e9 ldi r24, 0x99 ; 153 1605a: 99 e3 ldi r25, 0x39 ; 57 1605c: 0e 94 44 72 call 0xe488 ; 0xe488 16060: 0e 94 16 f2 call 0x1e42c ; 0x1e42c SERIAL_PROTOCOLPGM("Wait for PINDA target temperature:"); 16064: 89 e5 ldi r24, 0x59 ; 89 16066: 95 e8 ldi r25, 0x85 ; 133 16068: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(set_target_pinda); 1606c: c8 01 movw r24, r16 1606e: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 codenum = _millis(); 16072: 0f 94 28 2a call 0x25450 ; 0x25450 16076: 4b 01 movw r8, r22 16078: 5c 01 movw r10, r24 cancel_heatup = false; 1607a: 10 92 b4 0d sts 0x0DB4, r1 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> bool is_pinda_cooling = false; if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true; 1607e: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 16082: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 16086: 89 2b or r24, r25 16088: 41 f4 brne .+16 ; 0x1609a 1608a: ff 24 eor r15, r15 1608c: f3 94 inc r15 1608e: 80 91 71 06 lds r24, 0x0671 ; 0x800671 16092: 90 91 72 06 lds r25, 0x0672 ; 0x800672 16096: 89 2b or r24, r25 16098: 09 f0 breq .+2 ; 0x1609c SERIAL_PROTOCOLLN(set_target_pinda); codenum = _millis(); cancel_heatup = false; bool is_pinda_cooling = false; 1609a: 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)) ) { 1609c: 28 01 movw r4, r16 1609e: 01 2e mov r0, r17 160a0: 00 0c add r0, r0 160a2: 66 08 sbc r6, r6 160a4: 77 08 sbc r7, r7 160a6: f1 10 cpse r15, r1 160a8: 0c 94 74 c5 jmp 0x18ae8 ; 0x18ae8 160ac: 80 91 b4 0d lds r24, 0x0DB4 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> 160b0: 81 11 cpse r24, r1 160b2: 12 c0 rjmp .+36 ; 0x160d8 160b4: c3 01 movw r24, r6 160b6: b2 01 movw r22, r4 160b8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 160bc: 20 91 97 03 lds r18, 0x0397 ; 0x800397 160c0: 30 91 98 03 lds r19, 0x0398 ; 0x800398 160c4: 40 91 99 03 lds r20, 0x0399 ; 0x800399 160c8: 50 91 9a 03 lds r21, 0x039A ; 0x80039a 160cc: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 160d0: 18 16 cp r1, r24 160d2: 14 f4 brge .+4 ; 0x160d8 160d4: 0c 94 86 c5 jmp 0x18b0c ; 0x18b0c } manage_heater(); manage_inactivity(); lcd_update(0); } LCD_MESSAGERPGM(MSG_OK); 160d8: 81 e5 ldi r24, 0x51 ; 81 160da: 9d e6 ldi r25, 0x6D ; 109 160dc: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 160e0: 12 c0 rjmp .+36 ; 0x16106 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 160e2: 81 39 cpi r24, 0x91 ; 145 160e4: e3 e0 ldi r30, 0x03 ; 3 160e6: 9e 07 cpc r25, r30 160e8: 11 f4 brne .+4 ; 0x160ee 160ea: 0c 94 15 c9 jmp 0x1922a ; 0x1922a 160ee: 8c f4 brge .+34 ; 0x16112 160f0: 8b 38 cpi r24, 0x8B ; 139 160f2: 23 e0 ldi r18, 0x03 ; 3 160f4: 92 07 cpc r25, r18 160f6: 11 f4 brne .+4 ; 0x160fc 160f8: 0c 94 91 c8 jmp 0x19122 ; 0x19122 160fc: 8c 38 cpi r24, 0x8C ; 140 160fe: 93 40 sbci r25, 0x03 ; 3 16100: 11 f0 breq .+4 ; 0x16106 16102: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 */ 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; 16106: 10 92 aa 0d sts 0x0DAA, r1 ; 0x800daa <_ZL17mcode_in_progress.lto_priv.532+0x1> 1610a: 10 92 a9 0d sts 0x0DA9, r1 ; 0x800da9 <_ZL17mcode_in_progress.lto_priv.532> 1610e: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 } else { mcode_in_progress = code_value_short(); // printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress); switch(mcode_in_progress) 16112: 84 39 cpi r24, 0x94 ; 148 16114: 43 e0 ldi r20, 0x03 ; 3 16116: 94 07 cpc r25, r20 16118: 14 f4 brge .+4 ; 0x1611e 1611a: 0c 94 64 c9 jmp 0x192c8 ; 0x192c8 1611e: 80 3a cpi r24, 0xA0 ; 160 16120: 93 40 sbci r25, 0x03 ; 3 16122: 11 f0 breq .+4 ; 0x16128 16124: 0c 94 5c a4 jmp 0x148b8 ; 0x148b8 M928 [filename] */ case 928: card.openLogFile(strchr_pointer+5); 16128: 80 91 93 03 lds r24, 0x0393 ; 0x800393 1612c: 90 91 94 03 lds r25, 0x0394 ; 0x800394 } } void CardReader::openLogFile(const char* name) { logging = true; 16130: 21 e0 ldi r18, 0x01 ; 1 16132: 20 93 8e 14 sts 0x148E, r18 ; 0x80148e openFileWrite(name); 16136: 05 96 adiw r24, 0x05 ; 5 16138: 0f 94 5d 86 call 0x30cba ; 0x30cba 1613c: e4 cf rjmp .-56 ; 0x16106 - `string` - Must for M1 and optional for M0 message to display on the LCD */ case 0: case 1: { const char *src = strchr_pointer + 2; 1613e: 00 91 93 03 lds r16, 0x0393 ; 0x800393 16142: 10 91 94 03 lds r17, 0x0394 ; 0x800394 16146: 0e 5f subi r16, 0xFE ; 254 16148: 1f 4f sbci r17, 0xFF ; 255 codenum = 0; if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait 1614a: 80 e5 ldi r24, 0x50 ; 80 1614c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc */ case 0: case 1: { const char *src = strchr_pointer + 2; codenum = 0; 16150: c1 2c mov r12, r1 16152: d1 2c mov r13, r1 16154: 76 01 movw r14, r12 if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait 16156: 88 23 and r24, r24 16158: 21 f0 breq .+8 ; 0x16162 1615a: 0e 94 1a 5b call 0xb634 ; 0xb634 1615e: 6b 01 movw r12, r22 16160: 7c 01 movw r14, r24 if (code_seen('S')) codenum = code_value_long() * 1000; // seconds to wait 16162: 83 e5 ldi r24, 0x53 ; 83 16164: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16168: 88 23 and r24, r24 1616a: 51 f0 breq .+20 ; 0x16180 1616c: 0e 94 1a 5b call 0xb634 ; 0xb634 16170: 9b 01 movw r18, r22 16172: ac 01 movw r20, r24 16174: a8 ee ldi r26, 0xE8 ; 232 16176: b3 e0 ldi r27, 0x03 ; 3 16178: 0f 94 a5 dc call 0x3b94a ; 0x3b94a <__muluhisi3> 1617c: 6b 01 movw r12, r22 1617e: 7c 01 movw r14, r24 16180: c8 01 movw r24, r16 16182: 0f 5f subi r16, 0xFF ; 255 16184: 1f 4f sbci r17, 0xFF ; 255 bool expiration_time_set = bool(codenum); while (*src == ' ') ++src; 16186: dc 01 movw r26, r24 16188: 4c 91 ld r20, X 1618a: 40 32 cpi r20, 0x20 ; 32 1618c: c9 f3 breq .-14 ; 0x16180 custom_message_type = CustomMsg::M0Wait; 1618e: 26 e0 ldi r18, 0x06 ; 6 16190: 20 93 c3 06 sts 0x06C3, r18 ; 0x8006c3 if (!expiration_time_set && *src != '\0') { 16194: c1 14 cp r12, r1 16196: d1 04 cpc r13, r1 16198: e1 04 cpc r14, r1 1619a: f1 04 cpc r15, r1 1619c: a1 f5 brne .+104 ; 0x16206 1619e: 2c 91 ld r18, X 161a0: 22 23 and r18, r18 161a2: 89 f1 breq .+98 ; 0x16206 lcd_setstatus(src); 161a4: 0e 94 42 f5 call 0x1ea84 ; 0x1ea84 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(); 161a8: 0f 94 a9 43 call 0x28752 ; 0x28752 menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0); 161ac: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 161b0: 84 60 ori r24, 0x04 ; 4 161b2: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 previous_millis_cmd.start(); 161b6: 84 e8 ldi r24, 0x84 ; 132 161b8: 93 e0 ldi r25, 0x03 ; 3 161ba: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> if (expiration_time_set) { 161be: c1 14 cp r12, r1 161c0: d1 04 cpc r13, r1 161c2: e1 04 cpc r14, r1 161c4: f1 04 cpc r15, r1 161c6: 79 f1 breq .+94 ; 0x16226 codenum += _millis(); // keep track of when we started waiting 161c8: 0f 94 28 2a call 0x25450 ; 0x25450 161cc: c6 0e add r12, r22 161ce: d7 1e adc r13, r23 161d0: e8 1e adc r14, r24 161d2: f9 1e adc r15, r25 KEEPALIVE_STATE(PAUSED_FOR_USER); 161d4: 84 e0 ldi r24, 0x04 ; 4 161d6: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be while(_millis() < codenum && !lcd_clicked()) { 161da: 0f 94 28 2a call 0x25450 ; 0x25450 161de: 6c 15 cp r22, r12 161e0: 7d 05 cpc r23, r13 161e2: 8e 05 cpc r24, r14 161e4: 9f 05 cpc r25, r15 161e6: b0 f0 brcs .+44 ; 0x16214 delay_keep_alive(0); } KEEPALIVE_STATE(IN_HANDLER); 161e8: 82 e0 ldi r24, 0x02 ; 2 161ea: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be } else { marlin_wait_for_click(); } menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0); 161ee: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 161f2: 8b 7f andi r24, 0xFB ; 251 161f4: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 if (IS_SD_PRINTING) 161f8: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 161fc: 88 23 and r24, r24 161fe: 31 f1 breq .+76 ; 0x1624c custom_message_type = CustomMsg::Status; 16200: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 16204: 80 cf rjmp .-256 ; 0x16106 } 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){ LCD_MESSAGERPGM(_T(MSG_USERWAIT)); 16206: 82 eb ldi r24, 0xB2 ; 178 16208: 99 e3 ldi r25, 0x39 ; 57 1620a: 0e 94 44 72 call 0xe488 ; 0xe488 1620e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 16212: ca cf rjmp .-108 ; 0x161a8 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()) { 16214: 0e 94 95 70 call 0xe12a ; 0xe12a 16218: 81 11 cpse r24, r1 1621a: e6 cf rjmp .-52 ; 0x161e8 delay_keep_alive(0); 1621c: 90 e0 ldi r25, 0x00 ; 0 1621e: 80 e0 ldi r24, 0x00 ; 0 16220: 0e 94 84 8c call 0x11908 ; 0x11908 16224: da cf rjmp .-76 ; 0x161da //! @brief Wait for click //! //! Set void marlin_wait_for_click() { int8_t busy_state_backup = busy_state; 16226: 10 91 be 02 lds r17, 0x02BE ; 0x8002be KEEPALIVE_STATE(PAUSED_FOR_USER); 1622a: 84 e0 ldi r24, 0x04 ; 4 1622c: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be lcd_consume_click(); 16230: 0e 94 90 70 call 0xe120 ; 0xe120 while(!lcd_clicked()) 16234: 0e 94 95 70 call 0xe12a ; 0xe12a 16238: 81 11 cpse r24, r1 1623a: 05 c0 rjmp .+10 ; 0x16246 { delay_keep_alive(0); 1623c: 90 e0 ldi r25, 0x00 ; 0 1623e: 80 e0 ldi r24, 0x00 ; 0 16240: 0e 94 84 8c call 0x11908 ; 0x11908 16244: f7 cf rjmp .-18 ; 0x16234 } KEEPALIVE_STATE(busy_state_backup); 16246: 10 93 be 02 sts 0x02BE, r17 ; 0x8002be 1624a: d1 cf rjmp .-94 ; 0x161ee } menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0); if (IS_SD_PRINTING) custom_message_type = CustomMsg::Status; else LCD_MESSAGERPGM(MSG_WELCOME); 1624c: 82 e1 ldi r24, 0x12 ; 18 1624e: 90 e7 ldi r25, 0x70 ; 112 16250: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 16254: 58 cf rjmp .-336 ; 0x16106 /*! ### M17 - Enable all axes M17: Enable/Power all stepper motors */ case 17: LCD_MESSAGERPGM(_T(MSG_NO_MOVE)); 16256: 87 ea ldi r24, 0xA7 ; 167 16258: 99 e3 ldi r25, 0x39 ; 57 1625a: 0e 94 44 72 call 0xe488 ; 0xe488 1625e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c enable_x(); 16262: 17 98 cbi 0x02, 7 ; 2 enable_y(); 16264: 16 98 cbi 0x02, 6 ; 2 enable_z(); 16266: 15 98 cbi 0x02, 5 ; 2 enable_e0(); 16268: 14 98 cbi 0x02, 4 ; 2 1626a: 4d cf rjmp .-358 ; 0x16106 /*! ### M21 - Init SD card M21: Initialize SD card */ case 21: card.mount(); 1626c: 81 e0 ldi r24, 0x01 ; 1 1626e: 0f 94 b9 81 call 0x30372 ; 0x30372 16272: 49 cf rjmp .-366 ; 0x16106 presort_flag = true; #endif } void CardReader::release() { sdprinting = false; 16274: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f mounted = false; 16278: 10 92 90 14 sts 0x1490, r1 ; 0x801490 SERIAL_ECHO_START; 1627c: 82 ef ldi r24, 0xF2 ; 242 1627e: 9a ea ldi r25, 0xAA ; 170 16280: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED 16284: 8e e2 ldi r24, 0x2E ; 46 16286: 9b e6 ldi r25, 0x6B ; 107 16288: 0e 94 13 79 call 0xf226 ; 0xf226 1628c: 3c cf rjmp .-392 ; 0x16106 /*! ### M24 - Start SD print M24: Start/resume SD print */ case 24: if (printingIsPaused()) 1628e: 0e 94 1d 67 call 0xce3a ; 0xce3a 16292: 88 23 and r24, r24 16294: 19 f0 breq .+6 ; 0x1629c lcd_resume_print(); 16296: 0e 94 d0 f8 call 0x1f1a0 ; 0x1f1a0 1629a: 35 cf rjmp .-406 ; 0x16106 else { if (!filament_presence_check()) { 1629c: 0e 94 bb f5 call 0x1eb76 ; 0x1eb76 162a0: 88 23 and r24, r24 162a2: 09 f4 brne .+2 ; 0x162a6 162a4: 30 cf rjmp .-416 ; 0x16106 162a6: 80 91 22 17 lds r24, 0x1722 ; 0x801722 162aa: 88 23 and r24, r24 162ac: 61 f0 breq .+24 ; 0x162c6 // Print was aborted break; } if (!card.get_sdpos()) 162ae: 80 91 a3 17 lds r24, 0x17A3 ; 0x8017a3 162b2: 90 91 a4 17 lds r25, 0x17A4 ; 0x8017a4 162b6: a0 91 a5 17 lds r26, 0x17A5 ; 0x8017a5 162ba: b0 91 a6 17 lds r27, 0x17A6 ; 0x8017a6 162be: 89 2b or r24, r25 162c0: 8a 2b or r24, r26 162c2: 8b 2b or r24, r27 162c4: 69 f4 brne .+26 ; 0x162e0 { // A new print has started from scratch, reset stats failstats_reset_print(); 162c6: 0e 94 bc 5b call 0xb778 ; 0xb778 sdpos_atomic = 0; 162ca: 10 92 80 03 sts 0x0380, r1 ; 0x800380 162ce: 10 92 81 03 sts 0x0381, r1 ; 0x800381 162d2: 10 92 82 03 sts 0x0382, r1 ; 0x800382 162d6: 10 92 83 03 sts 0x0383, r1 ; 0x800383 162da: 80 e0 ldi r24, 0x00 ; 0 162dc: 0e 94 af 81 call 0x1035e ; 0x1035e } void CardReader::startFileprint() { if(mounted) 162e0: 80 91 90 14 lds r24, 0x1490 ; 0x801490 162e4: 88 23 and r24, r24 162e6: 31 f0 breq .+12 ; 0x162f4 { sdprinting = true; 162e8: 81 e0 ldi r24, 0x01 ; 1 162ea: 80 93 8f 14 sts 0x148F, r24 ; 0x80148f 162ee: 85 e0 ldi r24, 0x05 ; 5 162f0: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> la10c_reset(); #endif } card.startFileprint(); print_job_timer.start(); 162f4: 0f 94 4e 43 call 0x2869c ; 0x2869c if (MMU2::mmu2.Enabled()) 162f8: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 162fc: 81 30 cpi r24, 0x01 ; 1 162fe: 09 f0 breq .+2 ; 0x16302 16300: 02 cf rjmp .-508 ; 0x16106 { if (MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) 16302: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 16306: 88 23 and r24, r24 16308: 09 f4 brne .+2 ; 0x1630c 1630a: fd ce rjmp .-518 ; 0x16106 1630c: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 16310: 81 11 cpse r24, r1 16312: f9 ce rjmp .-526 ; 0x16106 { // Filament only half way into the PTFE. Unload the filament. MMU2::mmu2.unload(); 16314: 0f 94 31 ad call 0x35a62 ; 0x35a62 16318: f6 ce rjmp .-532 ; 0x16106 #### Parameters - `S` - Index in bytes */ case 26: if(card.mounted && code_seen('S')) { 1631a: 80 91 90 14 lds r24, 0x1490 ; 0x801490 1631e: 88 23 and r24, r24 16320: 09 f4 brne .+2 ; 0x16324 16322: f1 ce rjmp .-542 ; 0x16106 16324: 83 e5 ldi r24, 0x53 ; 83 16326: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1632a: 88 23 and r24, r24 1632c: 09 f4 brne .+2 ; 0x16330 1632e: eb ce rjmp .-554 ; 0x16106 long index = code_value_long(); 16330: 0e 94 1a 5b call 0xb634 ; 0xb634 16334: 6b 01 movw r12, r22 16336: 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);}; 16338: c0 92 a3 17 sts 0x17A3, r12 ; 0x8017a3 1633c: d0 92 a4 17 sts 0x17A4, r13 ; 0x8017a4 16340: e0 92 a5 17 sts 0x17A5, r14 ; 0x8017a5 16344: f0 92 a6 17 sts 0x17A6, r15 ; 0x8017a6 16348: 0f 94 93 76 call 0x2ed26 ; 0x2ed26 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; 1634c: c0 92 80 03 sts 0x0380, r12 ; 0x800380 16350: d0 92 81 03 sts 0x0381, r13 ; 0x800381 16354: e0 92 82 03 sts 0x0382, r14 ; 0x800382 16358: f0 92 83 03 sts 0x0383, r15 ; 0x800383 1635c: d4 ce rjmp .-600 ; 0x16106 #### Parameters - `P` - Show full SFN path instead of LFN only. */ case 27: card.getStatus(code_seen('P')); 1635e: 80 e5 ldi r24, 0x50 ; 80 16360: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16364: 18 2f mov r17, r24 return filesize; } void CardReader::getStatus(bool arg_P) { if (printingIsPaused()) 16366: 0e 94 1d 67 call 0xce3a ; 0xce3a 1636a: 88 23 and r24, r24 1636c: 91 f0 breq .+36 ; 0x16392 { if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD)) 1636e: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 16372: 88 23 and r24, r24 16374: 49 f0 breq .+18 ; 0x16388 16376: 80 91 6a 02 lds r24, 0x026A ; 0x80026a 1637a: 81 11 cpse r24, r1 1637c: 05 c0 rjmp .+10 ; 0x16388 SERIAL_PROTOCOLLNPGM("SD print paused"); 1637e: 8f e8 ldi r24, 0x8F ; 143 16380: 94 e8 ldi r25, 0x84 ; 132 16382: 0e 94 13 79 call 0xf226 ; 0xf226 16386: bf ce rjmp .-642 ; 0x16106 else SERIAL_PROTOCOLLNPGM("Print saved"); 16388: 83 e8 ldi r24, 0x83 ; 131 1638a: 94 e8 ldi r25, 0x84 ; 132 1638c: 0e 94 13 79 call 0xf226 ; 0xf226 16390: ba ce rjmp .-652 ; 0x16106 } else if (sdprinting) 16392: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 16396: 88 23 and r24, r24 16398: 09 f4 brne .+2 ; 0x1639c 1639a: 4a c0 rjmp .+148 ; 0x16430 { if (arg_P) 1639c: 11 23 and r17, r17 1639e: e1 f1 breq .+120 ; 0x16418 { printAbsFilenameFast(); 163a0: 0f 94 18 7b call 0x2f630 ; 0x2f630 SERIAL_PROTOCOLLN(); 163a4: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 } else SERIAL_PROTOCOLLN(LONGEST_FILENAME); SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE 163a8: 89 e4 ldi r24, 0x49 ; 73 163aa: 97 e6 ldi r25, 0x67 ; 103 163ac: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 163b0: 60 91 a3 17 lds r22, 0x17A3 ; 0x8017a3 163b4: 70 91 a4 17 lds r23, 0x17A4 ; 0x8017a4 163b8: 80 91 a5 17 lds r24, 0x17A5 ; 0x8017a5 163bc: 90 91 a6 17 lds r25, 0x17A6 ; 0x8017a6 163c0: 4a e0 ldi r20, 0x0A ; 10 163c2: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 163c6: 8f e2 ldi r24, 0x2F ; 47 163c8: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 163cc: 60 91 9c 17 lds r22, 0x179C ; 0x80179c 163d0: 70 91 9d 17 lds r23, 0x179D ; 0x80179d 163d4: 80 91 9e 17 lds r24, 0x179E ; 0x80179e 163d8: 90 91 9f 17 lds r25, 0x179F ; 0x80179f 163dc: 4a e0 ldi r20, 0x0A ; 10 163de: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 163e2: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_PROTOCOL(sdpos); SERIAL_PROTOCOL('/'); SERIAL_PROTOCOLLN(filesize); uint16_t time = print_job_timer.duration() / 60; 163e6: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 163ea: 2c e3 ldi r18, 0x3C ; 60 163ec: 30 e0 ldi r19, 0x00 ; 0 163ee: 40 e0 ldi r20, 0x00 ; 0 163f0: 50 e0 ldi r21, 0x00 ; 0 163f2: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> SERIAL_PROTOCOL((int)(time / 60)); 163f6: c9 01 movw r24, r18 163f8: 6c e3 ldi r22, 0x3C ; 60 163fa: 70 e0 ldi r23, 0x00 ; 0 163fc: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 16400: 8c 01 movw r16, r24 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 16402: 90 e0 ldi r25, 0x00 ; 0 16404: 80 e0 ldi r24, 0x00 ; 0 16406: 0f 94 5f d5 call 0x3aabe ; 0x3aabe } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 1640a: 8a e3 ldi r24, 0x3A ; 58 1640c: 0e 94 cf 76 call 0xed9e ; 0xed9e SERIAL_PROTOCOL(':'); SERIAL_PROTOCOLLN((int)(time % 60)); 16410: c8 01 movw r24, r16 16412: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 16416: 77 ce rjmp .-786 ; 0x16106 { printAbsFilenameFast(); SERIAL_PROTOCOLLN(); } else SERIAL_PROTOCOLLN(LONGEST_FILENAME); 16418: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 1641c: 88 23 and r24, r24 1641e: 29 f0 breq .+10 ; 0x1642a 16420: 86 ea ldi r24, 0xA6 ; 166 16422: 94 e1 ldi r25, 0x14 ; 20 16424: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 16428: bf cf rjmp .-130 ; 0x163a8 1642a: 81 e9 ldi r24, 0x91 ; 145 1642c: 94 e1 ldi r25, 0x14 ; 20 1642e: fa cf rjmp .-12 ; 0x16424 SERIAL_PROTOCOL((int)(time / 60)); SERIAL_PROTOCOL(':'); SERIAL_PROTOCOLLN((int)(time % 60)); } else SERIAL_PROTOCOLLNPGM("Not SD printing"); 16430: 83 e7 ldi r24, 0x73 ; 115 16432: 94 e8 ldi r25, 0x84 ; 132 16434: 0e 94 13 79 call 0xf226 ; 0xf226 16438: 66 ce rjmp .-820 ; 0x16106 /*! ### M28 - Start SD write M28: Begin write to SD card */ case 28: card.openFileWrite(strchr_pointer+4); 1643a: 80 91 93 03 lds r24, 0x0393 ; 0x800393 1643e: 90 91 94 03 lds r25, 0x0394 ; 0x800394 16442: 04 96 adiw r24, 0x04 ; 4 16444: 0f 94 5d 86 call 0x30cba ; 0x30cba 16448: 5e ce rjmp .-836 ; 0x16106 * 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; 1644a: ce 01 movw r24, r28 1644c: 01 96 adiw r24, 0x01 ; 1 1644e: 0f 94 74 77 call 0x2eee8 ; 0x2eee8 16452: 88 23 and r24, r24 16454: 11 f4 brne .+4 ; 0x1645a 16456: 0c 94 a4 a5 jmp 0x14b48 ; 0x14b48 // cache directory entry d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 1645a: 61 e0 ldi r22, 0x01 ; 1 1645c: ce 01 movw r24, r28 1645e: 01 96 adiw r24, 0x01 ; 1 16460: 0f 94 18 59 call 0x2b230 ; 0x2b230 if (!d) goto fail; 16464: 00 97 sbiw r24, 0x00 ; 0 16466: 11 f4 brne .+4 ; 0x1646c 16468: 0c 94 a4 a5 jmp 0x14b48 ; 0x14b48 // mark entry deleted d->name[0] = DIR_NAME_DELETED; 1646c: 25 ee ldi r18, 0xE5 ; 229 1646e: fc 01 movw r30, r24 16470: 20 83 st Z, r18 // set this file closed type_ = FAT_FILE_TYPE_CLOSED; 16472: 1c 82 std Y+4, r1 ; 0x04 // write entry to SD return vol_->cacheFlush(); 16474: 0f 94 0c 54 call 0x2a818 ; 0x2a818 16478: 18 2f mov r17, r24 1647a: 0c 94 a5 a5 jmp 0x14b4a ; 0x14b4a presort(); #endif } else { SERIAL_PROTOCOLPGM("Deletion failed, File: "); 1647e: 8d e4 ldi r24, 0x4D ; 77 16480: 94 e8 ldi r25, 0x84 ; 132 16482: 0e 94 e8 76 call 0xedd0 ; 0xedd0 16486: 23 96 adiw r28, 0x03 ; 3 16488: 8e ad ldd r24, Y+62 ; 0x3e 1648a: 9f ad ldd r25, Y+63 ; 0x3f 1648c: 23 97 sbiw r28, 0x03 ; 3 1648e: 0e 94 ac 87 call 0x10f58 ; 0x10f58 16492: 8e e2 ldi r24, 0x2E ; 46 16494: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::println(char c, int base) { print(c, base); println(); 16498: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 1649c: 34 ce rjmp .-920 ; 0x16106 ### 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(); 1649e: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 int16_t sec, min; min = t / 60; sec = t % 60; 164a2: 2c e3 ldi r18, 0x3C ; 60 164a4: 30 e0 ldi r19, 0x00 ; 0 164a6: 40 e0 ldi r20, 0x00 ; 0 164a8: 50 e0 ldi r21, 0x00 ; 0 164aa: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> sprintf_P(time, PSTR("%i min, %i sec"), min, sec); 164ae: 7f 93 push r23 164b0: 6f 93 push r22 164b2: 3f 93 push r19 164b4: 2f 93 push r18 164b6: 8e e2 ldi r24, 0x2E ; 46 164b8: 97 e8 ldi r25, 0x87 ; 135 164ba: 9f 93 push r25 164bc: 8f 93 push r24 164be: 8e 01 movw r16, r28 164c0: 0f 5f subi r16, 0xFF ; 255 164c2: 1f 4f sbci r17, 0xFF ; 255 164c4: 1f 93 push r17 164c6: 0f 93 push r16 164c8: 0f 94 27 db call 0x3b64e ; 0x3b64e SERIAL_ECHO_START; 164cc: 82 ef ldi r24, 0xF2 ; 242 164ce: 9a ea ldi r25, 0xAA ; 170 164d0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(time); 164d4: c8 01 movw r24, r16 164d6: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 lcd_setstatus(time); 164da: c8 01 movw r24, r16 164dc: 0e 94 42 f5 call 0x1ea84 ; 0x1ea84 autotempShutdown(); 164e0: 0f b6 in r0, 0x3f ; 63 164e2: f8 94 cli 164e4: de bf out 0x3e, r29 ; 62 164e6: 0f be out 0x3f, r0 ; 63 164e8: cd bf out 0x3d, r28 ; 61 164ea: 0d ce rjmp .-998 ; 0x16106 #### 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')) 164ec: 83 e5 ldi r24, 0x53 ; 83 164ee: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 164f2: 88 23 and r24, r24 164f4: 09 f4 brne .+2 ; 0x164f8 164f6: 07 ce rjmp .-1010 ; 0x16106 { uint8_t pin_status = code_value_uint8(); 164f8: 0e 94 00 5b call 0xb600 ; 0xb600 164fc: 08 2f mov r16, r24 int8_t pin_number = LED_PIN; if (code_seen('P')) 164fe: 80 e5 ldi r24, 0x50 ; 80 16500: 0e 94 6e 5b call 0xb6dc ; 0xb6dc */ case 42: if (code_seen('S')) { uint8_t pin_status = code_value_uint8(); int8_t pin_number = LED_PIN; 16504: 1d e0 ldi r17, 0x0D ; 13 if (code_seen('P')) 16506: 88 23 and r24, r24 16508: 19 f0 breq .+6 ; 0x16510 pin_number = code_value_uint8(); 1650a: 0e 94 00 5b call 0xb600 ; 0xb600 1650e: 18 2f mov r17, r24 16510: e2 e1 ldi r30, 0x12 ; 18 16512: f7 e8 ldi r31, 0x87 ; 135 16514: 8e e2 ldi r24, 0x2E ; 46 16516: 97 e8 ldi r25, 0x87 ; 135 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) 16518: 24 91 lpm r18, Z 1651a: 21 17 cp r18, r17 1651c: 09 f4 brne .+2 ; 0x16520 1651e: f3 cd rjmp .-1050 ; 0x16106 16520: 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++) 16522: 8e 17 cp r24, r30 16524: 9f 07 cpc r25, r31 16526: c1 f7 brne .-16 ; 0x16518 pin_number = -1; break; } } #if defined(FAN_PIN) && FAN_PIN > -1 if (pin_number == FAN_PIN) 16528: 16 30 cpi r17, 0x06 ; 6 1652a: 81 f4 brne .+32 ; 0x1654c fanSpeed = pin_status; 1652c: 00 93 e5 03 sts 0x03E5, r16 ; 0x8003e5 #endif if (pin_number > -1) { pinMode(pin_number, OUTPUT); 16530: 61 e0 ldi r22, 0x01 ; 1 16532: 81 2f mov r24, r17 16534: 0e 94 9e e9 call 0x1d33c ; 0x1d33c digitalWrite(pin_number, pin_status); 16538: 60 2f mov r22, r16 1653a: 81 2f mov r24, r17 1653c: 0e 94 70 e9 call 0x1d2e0 ; 0x1d2e0 analogWrite(pin_number, pin_status); 16540: 60 2f mov r22, r16 16542: 70 e0 ldi r23, 0x00 ; 0 16544: 81 2f mov r24, r17 16546: 0e 94 cf e9 call 0x1d39e ; 0x1d39e 1654a: dd cd rjmp .-1094 ; 0x16106 } #if defined(FAN_PIN) && FAN_PIN > -1 if (pin_number == FAN_PIN) fanSpeed = pin_status; #endif if (pin_number > -1) 1654c: 17 fd sbrc r17, 7 1654e: db cd rjmp .-1098 ; 0x16106 16550: ef cf rjmp .-34 ; 0x16530 ### 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); 16552: 80 e1 ldi r24, 0x10 ; 16 16554: 0e 94 f6 ee call 0x1ddec ; 0x1ddec eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 16558: 81 ea ldi r24, 0xA1 ; 161 1655a: 9d e0 ldi r25, 0x0D ; 13 1655c: 0f 94 10 dc call 0x3b820 ; 0x3b820 16560: 3b e0 ldi r19, 0x0B ; 11 16562: 83 9f mul r24, r19 16564: c0 01 movw r24, r0 16566: 11 24 eor r1, r1 16568: 70 e0 ldi r23, 0x00 ; 0 1656a: 60 e0 ldi r22, 0x00 ; 0 1656c: 80 5b subi r24, 0xB0 ; 176 1656e: 92 4f sbci r25, 0xF2 ; 242 16570: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 // Reset the skew and offset in both RAM and EEPROM. calibration_status_clear(CALIBRATION_STATUS_XYZ); 16574: 82 e0 ldi r24, 0x02 ; 2 16576: 0e 94 f6 ee call 0x1ddec ; 0x1ddec reset_bed_offset_and_skew(); 1657a: 0f 94 49 ce call 0x39c92 ; 0x39c92 // 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(); 1657e: 0f 94 2a ce call 0x39c54 ; 0x39c54 16582: c1 cd rjmp .-1150 ; 0x16106 */ case 45: // M45: Prusa3D: bed skew and offset with manual Z up { int8_t verbosity_level = 0; bool only_Z = code_seen('Z'); 16584: 8a e5 ldi r24, 0x5A ; 90 16586: 0e 94 6e 5b call 0xb6dc ; 0xb6dc // 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); 1658a: 0f 94 99 8d call 0x31b32 ; 0x31b32 1658e: bb cd rjmp .-1162 ; 0x16106 ### 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()) { 16590: 80 91 00 17 lds r24, 0x1700 ; 0x801700 16594: 88 23 and r24, r24 16596: 19 f1 breq .+70 ; 0x165de uint8_t ip[4]; if (card.ToshibaFlashAir_GetIP(ip)) { 16598: ce 01 movw r24, r28 1659a: 01 96 adiw r24, 0x01 ; 1 1659c: 0f 94 c5 86 call 0x30d8a ; 0x30d8a 165a0: 88 23 and r24, r24 165a2: c1 f0 breq .+48 ; 0x165d4 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 165a4: 89 81 ldd r24, Y+1 ; 0x01 165a6: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 165aa: 8e e2 ldi r24, 0x2E ; 46 165ac: 0e 94 cf 76 call 0xed9e ; 0xed9e } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 165b0: 8a 81 ldd r24, Y+2 ; 0x02 165b2: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 165b6: 8e e2 ldi r24, 0x2E ; 46 165b8: 0e 94 cf 76 call 0xed9e ; 0xed9e } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 165bc: 8b 81 ldd r24, Y+3 ; 0x03 165be: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 165c2: 8e e2 ldi r24, 0x2E ; 46 165c4: 0e 94 cf 76 call 0xed9e ; 0xed9e } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 165c8: 8c 81 ldd r24, Y+4 ; 0x04 165ca: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::println(unsigned char b, int base) { print(b, base); println(); 165ce: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 165d2: 99 cd rjmp .-1230 ; 0x16106 SERIAL_PROTOCOL('.'); SERIAL_PROTOCOL(uint8_t(ip[2])); SERIAL_PROTOCOL('.'); SERIAL_PROTOCOLLN(uint8_t(ip[3])); } else { SERIAL_PROTOCOLPGM("?Toshiba FlashAir GetIP failed\n"); 165d4: 82 ef ldi r24, 0xF2 ; 242 165d6: 96 e8 ldi r25, 0x86 ; 134 165d8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 165dc: 94 cd rjmp .-1240 ; 0x16106 } } else { SERIAL_PROTOCOLLNPGM("n/a"); 165de: 8e ee ldi r24, 0xEE ; 238 165e0: 96 e8 ldi r25, 0x86 ; 134 165e2: 0e 94 13 79 call 0xf226 ; 0xf226 165e6: 8f cd rjmp .-1250 ; 0x16106 165e8: 10 92 b7 0d sts 0x0DB7, r1 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 165ec: 8c cd rjmp .-1256 ; 0x16106 break; default: break; } } else { printf_P(_N("PrinterState: %d\n"),uint8_t(GetPrinterState())); 165ee: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 165f2: 1f 92 push r1 165f4: 8f 93 push r24 165f6: 80 eb ldi r24, 0xB0 ; 176 165f8: 98 e6 ldi r25, 0x68 ; 104 165fa: 9f 93 push r25 165fc: 8f 93 push r24 165fe: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16602: 0f 90 pop r0 16604: 0f 90 pop r0 16606: 0f 90 pop r0 16608: 0f 90 pop r0 1660a: 7d cd rjmp .-1286 ; 0x16106 - `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(); 1660c: 80 e5 ldi r24, 0x50 ; 80 1660e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16612: 88 23 and r24, r24 16614: 21 f0 breq .+8 ; 0x1661e 16616: 0e 94 00 5b call 0xb600 ; 0xb600 1661a: 80 93 ae 02 sts 0x02AE, r24 ; 0x8002ae if(code_seen('R')) print_time_remaining_normal = code_value(); 1661e: 82 e5 ldi r24, 0x52 ; 82 16620: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16624: 88 23 and r24, r24 16626: 41 f0 breq .+16 ; 0x16638 16628: 0e 94 35 60 call 0xc06a ; 0xc06a 1662c: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16630: 70 93 b2 02 sts 0x02B2, r23 ; 0x8002b2 16634: 60 93 b1 02 sts 0x02B1, r22 ; 0x8002b1 if(code_seen('Q')) print_percent_done_silent = code_value_uint8(); 16638: 81 e5 ldi r24, 0x51 ; 81 1663a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1663e: 88 23 and r24, r24 16640: 21 f0 breq .+8 ; 0x1664a 16642: 0e 94 00 5b call 0xb600 ; 0xb600 16646: 80 93 ad 02 sts 0x02AD, r24 ; 0x8002ad if(code_seen('S')) print_time_remaining_silent = code_value(); 1664a: 83 e5 ldi r24, 0x53 ; 83 1664c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16650: 88 23 and r24, r24 16652: 41 f0 breq .+16 ; 0x16664 16654: 0e 94 35 60 call 0xc06a ; 0xc06a 16658: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 1665c: 70 93 b6 02 sts 0x02B6, r23 ; 0x8002b6 16660: 60 93 b5 02 sts 0x02B5, r22 ; 0x8002b5 if(code_seen('C')){ 16664: 83 e4 ldi r24, 0x43 ; 67 16666: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1666a: 88 23 and r24, r24 1666c: a9 f0 breq .+42 ; 0x16698 float print_time_to_change_normal_f = code_value(); 1666e: 0e 94 35 60 call 0xc06a ; 0xc06a 16672: 6b 01 movw r12, r22 16674: 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; 16676: 20 e0 ldi r18, 0x00 ; 0 16678: 30 e0 ldi r19, 0x00 ; 0 1667a: a9 01 movw r20, r18 1667c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 16680: 6f ef ldi r22, 0xFF ; 255 16682: 7f ef ldi r23, 0xFF ; 255 16684: 18 16 cp r1, r24 16686: 24 f4 brge .+8 ; 0x16690 16688: c7 01 movw r24, r14 1668a: b6 01 movw r22, r12 1668c: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16690: 70 93 b0 02 sts 0x02B0, r23 ; 0x8002b0 16694: 60 93 af 02 sts 0x02AF, r22 ; 0x8002af } if(code_seen('D')){ 16698: 84 e4 ldi r24, 0x44 ; 68 1669a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1669e: 88 23 and r24, r24 166a0: a9 f0 breq .+42 ; 0x166cc float print_time_to_change_silent_f = code_value(); 166a2: 0e 94 35 60 call 0xc06a ; 0xc06a 166a6: 6b 01 movw r12, r22 166a8: 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; 166aa: 20 e0 ldi r18, 0x00 ; 0 166ac: 30 e0 ldi r19, 0x00 ; 0 166ae: a9 01 movw r20, r18 166b0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 166b4: 6f ef ldi r22, 0xFF ; 255 166b6: 7f ef ldi r23, 0xFF ; 255 166b8: 18 16 cp r1, r24 166ba: 24 f4 brge .+8 ; 0x166c4 166bc: c7 01 movw r24, r14 166be: b6 01 movw r22, r12 166c0: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 166c4: 70 93 b4 02 sts 0x02B4, r23 ; 0x8002b4 166c8: 60 93 b3 02 sts 0x02B3, r22 ; 0x8002b3 } { 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); 166cc: 80 91 b0 02 lds r24, 0x02B0 ; 0x8002b0 166d0: 8f 93 push r24 166d2: 80 91 af 02 lds r24, 0x02AF ; 0x8002af 166d6: 8f 93 push r24 166d8: 80 91 b2 02 lds r24, 0x02B2 ; 0x8002b2 166dc: 8f 93 push r24 166de: 80 91 b1 02 lds r24, 0x02B1 ; 0x8002b1 166e2: 8f 93 push r24 166e4: 80 91 ae 02 lds r24, 0x02AE ; 0x8002ae 166e8: 28 2f mov r18, r24 166ea: 08 2e mov r0, r24 166ec: 00 0c add r0, r0 166ee: 33 0b sbc r19, r19 166f0: 3f 93 push r19 166f2: 8f 93 push r24 166f4: 86 e5 ldi r24, 0x56 ; 86 166f6: 98 e6 ldi r25, 0x68 ; 104 166f8: 9f 93 push r25 166fa: 8f 93 push r24 166fc: 0d e5 ldi r16, 0x5D ; 93 166fe: 18 e6 ldi r17, 0x68 ; 104 16700: 1f 93 push r17 16702: 0f 93 push r16 16704: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 printf_P(_msg_mode_done_remain, _N("SILENT"), int8_t(print_percent_done_silent), print_time_remaining_silent, print_time_to_change_silent); 16708: 80 91 b4 02 lds r24, 0x02B4 ; 0x8002b4 1670c: 8f 93 push r24 1670e: 80 91 b3 02 lds r24, 0x02B3 ; 0x8002b3 16712: 8f 93 push r24 16714: 80 91 b6 02 lds r24, 0x02B6 ; 0x8002b6 16718: 8f 93 push r24 1671a: 80 91 b5 02 lds r24, 0x02B5 ; 0x8002b5 1671e: 8f 93 push r24 16720: 80 91 ad 02 lds r24, 0x02AD ; 0x8002ad 16724: 28 2f mov r18, r24 16726: 08 2e mov r0, r24 16728: 00 0c add r0, r0 1672a: 33 0b sbc r19, r19 1672c: 3f 93 push r19 1672e: 8f 93 push r24 16730: 8f e4 ldi r24, 0x4F ; 79 16732: 98 e6 ldi r25, 0x68 ; 104 16734: 9f 93 push r25 16736: 8f 93 push r24 16738: 1f 93 push r17 1673a: 0f 93 push r16 1673c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16740: 0f b6 in r0, 0x3f ; 63 16742: f8 94 cli 16744: de bf out 0x3e, r29 ; 62 16746: 0f be out 0x3f, r0 ; 63 16748: cd bf out 0x3d, r28 ; 61 1674a: dd cc rjmp .-1606 ; 0x16106 } else return false; } bool Stopwatch::pause() { if (isRunning()) { 1674c: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 16750: 81 30 cpi r24, 0x01 ; 1 16752: 09 f0 breq .+2 ; 0x16756 16754: d8 cc rjmp .-1616 ; 0x16106 state = PAUSED; 16756: 82 e0 ldi r24, 0x02 ; 2 16758: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b stopTimestamp = _millis(); 1675c: 0f 94 28 2a call 0x25450 ; 0x25450 16760: 60 93 51 06 sts 0x0651, r22 ; 0x800651 16764: 70 93 52 06 sts 0x0652, r23 ; 0x800652 16768: 80 93 53 06 sts 0x0653, r24 ; 0x800653 1676c: 90 93 54 06 sts 0x0654, r25 ; 0x800654 16770: ca cc rjmp .-1644 ; 0x16106 /*! ### M77 - Stop the print job timer M77: Stop the print job timer */ case 77: { print_job_timer.stop(); 16772: 0f 94 72 43 call 0x286e4 ; 0x286e4 save_statistics(); 16776: 0e 94 b7 65 call 0xcb6e ; 0xcb6e 1677a: c5 cc rjmp .-1654 ; 0x16106 const char *_m_fil; const char *_m_time; uint32_t _cm = 0; uint32_t _min = 0; if (printJobOngoing()) { 1677c: 0e 94 28 67 call 0xce50 ; 0xce50 16780: 88 23 and r24, r24 16782: c1 f1 breq .+112 ; 0x167f4 _m_fil = _O(MSG_FILAMENT_USED); _m_time = _O(MSG_PRINT_TIME); _cm = (uint32_t)total_filament_used / 1000; 16784: 60 91 64 06 lds r22, 0x0664 ; 0x800664 16788: 70 91 65 06 lds r23, 0x0665 ; 0x800665 1678c: 80 91 66 06 lds r24, 0x0666 ; 0x800666 16790: 90 91 67 06 lds r25, 0x0667 ; 0x800667 16794: 28 ee ldi r18, 0xE8 ; 232 16796: 33 e0 ldi r19, 0x03 ; 3 16798: 40 e0 ldi r20, 0x00 ; 0 1679a: 50 e0 ldi r21, 0x00 ; 0 1679c: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 167a0: 12 2f mov r17, r18 167a2: 03 2f mov r16, r19 167a4: f4 2e mov r15, r20 167a6: e5 2e mov r14, r21 _min = print_job_timer.duration() / 60; 167a8: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 167ac: 2c e3 ldi r18, 0x3C ; 60 167ae: 30 e0 ldi r19, 0x00 ; 0 167b0: 40 e0 ldi r20, 0x00 ; 0 167b2: 50 e0 ldi r21, 0x00 ; 0 167b4: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 167b8: b9 01 movw r22, r18 167ba: 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); 167bc: 4d e3 ldi r20, 0x3D ; 61 167be: 50 e5 ldi r21, 0x50 ; 80 const char *_m_time; uint32_t _cm = 0; uint32_t _min = 0; if (printJobOngoing()) { _m_fil = _O(MSG_FILAMENT_USED); 167c0: 2d e2 ldi r18, 0x2D ; 45 167c2: 30 e5 ldi r19, 0x50 ; 80 _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); 167c4: 9f 93 push r25 167c6: 8f 93 push r24 167c8: 7f 93 push r23 167ca: 6f 93 push r22 167cc: 5f 93 push r21 167ce: 4f 93 push r20 167d0: ef 92 push r14 167d2: ff 92 push r15 167d4: 0f 93 push r16 167d6: 1f 93 push r17 167d8: 3f 93 push r19 167da: 2f 93 push r18 167dc: 89 e3 ldi r24, 0x39 ; 57 167de: 98 e6 ldi r25, 0x68 ; 104 167e0: 9f 93 push r25 167e2: 8f 93 push r24 167e4: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 167e8: 0f b6 in r0, 0x3f ; 63 167ea: f8 94 cli 167ec: de bf out 0x3e, r29 ; 62 167ee: 0f be out 0x3f, r0 ; 63 167f0: cd bf out 0x3d, r28 ; 61 167f2: 89 cc rjmp .-1774 ; 0x16106 _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')) { 167f4: 83 e5 ldi r24, 0x53 ; 83 167f6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 167fa: 88 23 and r24, r24 167fc: 51 f0 breq .+20 ; 0x16812 eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value()); 167fe: 0e 94 35 60 call 0xc06a ; 0xc06a 16802: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16806: ab 01 movw r20, r22 16808: 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); 1680a: 81 ef ldi r24, 0xF1 ; 241 1680c: 9f e0 ldi r25, 0x0F ; 15 1680e: 0f 94 46 dc call 0x3b88c ; 0x3b88c } if (code_seen('T')) { 16812: 84 e5 ldi r24, 0x54 ; 84 16814: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16818: 88 23 and r24, r24 1681a: 51 f0 breq .+20 ; 0x16830 eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value()); 1681c: 0e 94 35 60 call 0xc06a ; 0xc06a 16820: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16824: ab 01 movw r20, r22 16826: bc 01 movw r22, r24 16828: 8d ee ldi r24, 0xED ; 237 1682a: 9f e0 ldi r25, 0x0F ; 15 1682c: 0f 94 46 dc call 0x3b88c ; 0x3b88c } _m_fil = _O(MSG_TOTAL_FILAMENT); _m_time = _O(MSG_TOTAL_PRINT_TIME); _cm = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); 16830: 81 ef ldi r24, 0xF1 ; 241 16832: 9f e0 ldi r25, 0x0F ; 15 16834: 0f 94 18 dc call 0x3b830 ; 0x3b830 16838: 16 2f mov r17, r22 1683a: 07 2f mov r16, r23 1683c: f8 2e mov r15, r24 1683e: e9 2e mov r14, r25 _min = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); 16840: 8d ee ldi r24, 0xED ; 237 16842: 9f e0 ldi r25, 0x0F ; 15 16844: 0f 94 18 dc call 0x3b830 ; 0x3b830 } 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); 16848: 4a e1 ldi r20, 0x1A ; 26 1684a: 50 e5 ldi r21, 0x50 ; 80 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); 1684c: 29 e0 ldi r18, 0x09 ; 9 1684e: 30 e5 ldi r19, 0x50 ; 80 16850: b9 cf rjmp .-142 ; 0x167c4 void ResetHostStatusScreenName() { memset(host_status_screen_name, 0, sizeof(host_status_screen_name)); } void M79_timer_restart() { M79_timer.start(); 16852: 8c e9 ldi r24, 0x9C ; 156 16854: 93 e0 ldi r25, 0x03 ; 3 16856: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> - `S` - Quoted string containing two characters e.g. "PL" */ case 79: M79_timer_restart(); if (code_seen('S')) 1685a: 83 e5 ldi r24, 0x53 ; 83 1685c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16860: 88 23 and r24, r24 16862: 09 f1 breq .+66 ; 0x168a6 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 16864: 62 e2 ldi r22, 0x22 ; 34 16866: 70 e0 ldi r23, 0x00 ; 0 16868: 80 91 93 03 lds r24, 0x0393 ; 0x800393 1686c: 90 91 94 03 lds r25, 0x0394 ; 0x800394 16870: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 16874: 8c 01 movw r16, r24 if (!this->ptr) { 16876: 89 2b or r24, r25 16878: b1 f0 breq .+44 ; 0x168a6 // First quote not found return; } // Skip the leading quote this->ptr++; 1687a: 0f 5f subi r16, 0xFF ; 255 1687c: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 1687e: 62 e2 ldi r22, 0x22 ; 34 16880: 70 e0 ldi r23, 0x00 ; 0 16882: c8 01 movw r24, r16 16884: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce if(!pStrEnd) { 16888: 89 2b or r24, r25 1688a: 69 f0 breq .+26 ; 0x168a6 char * GetHostStatusScreenName() { return host_status_screen_name; } void ResetHostStatusScreenName() { memset(host_status_screen_name, 0, sizeof(host_status_screen_name)); 1688c: eb e4 ldi r30, 0x4B ; 75 1688e: f6 e0 ldi r31, 0x06 ; 6 16890: 83 e0 ldi r24, 0x03 ; 3 16892: df 01 movw r26, r30 16894: 1d 92 st X+, r1 16896: 8a 95 dec r24 16898: e9 f7 brne .-6 ; 0x16894 static LongTimer M79_timer; static char host_status_screen_name[3]; void SetHostStatusScreenName(const char * name) { strncpy(host_status_screen_name, name, 2); 1689a: 42 e0 ldi r20, 0x02 ; 2 1689c: 50 e0 ldi r21, 0x00 ; 0 1689e: b8 01 movw r22, r16 168a0: cf 01 movw r24, r30 168a2: 0f 94 90 e2 call 0x3c520 ; 0x3c520 } #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 168a6: 8c e8 ldi r24, 0x8C ; 140 168a8: 9f e0 ldi r25, 0x0F ; 15 168aa: 0f 94 10 dc call 0x3b820 ; 0x3b820 && printer_recovering() && printingIsPaused()) { 168ae: 81 30 cpi r24, 0x01 ; 1 168b0: 09 f0 breq .+2 ; 0x168b4 168b2: 29 cc rjmp .-1966 ; 0x16106 #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() 168b4: 0e 94 13 67 call 0xce26 ; 0xce26 168b8: 88 23 and r24, r24 168ba: 09 f4 brne .+2 ; 0x168be 168bc: 24 cc rjmp .-1976 ; 0x16106 && printingIsPaused()) { 168be: 0e 94 1d 67 call 0xce3a ; 0xce3a 168c2: 88 23 and r24, r24 168c4: 09 f4 brne .+2 ; 0x168c8 168c6: 1f cc rjmp .-1986 ; 0x16106 // The print is in a paused state. The print was recovered following a power panic // but up to this point the printer has been waiting for the M79 from the host // 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) { 168c8: 80 91 ec 04 lds r24, 0x04EC ; 0x8004ec <_ZL24uvlo_auto_recovery_ready.lto_priv.533> 168cc: 88 23 and r24, r24 168ce: 29 f0 breq .+10 ; 0x168da SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY); 168d0: 87 e1 ldi r24, 0x17 ; 23 168d2: 98 e6 ldi r25, 0x68 ; 104 168d4: 0e 94 13 79 call 0xf226 ; 0xf226 168d8: 16 cc rjmp .-2004 ; 0x16106 } else { SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_RECOVERY_READY); 168da: 8a ef ldi r24, 0xFA ; 250 168dc: 97 e6 ldi r25, 0x67 ; 103 168de: 0e 94 13 79 call 0xf226 ; 0xf226 168e2: 11 cc rjmp .-2014 ; 0x16106 /*! ### M112 - Emergency stop M112: Full (Emergency) Stop It is processed much earlier as to bypass the cmdqueue. */ case 112: kill(MSG_M112_KILL); 168e4: 8d ed ldi r24, 0xDD ; 221 168e6: 97 e6 ldi r25, 0x67 ; 103 168e8: 0e 94 a2 79 call 0xf344 ; 0xf344 #### Parameters - `S` - Target temperature */ case 140: if (code_seen('S')) setTargetBed(code_value()); 168ec: 83 e5 ldi r24, 0x53 ; 83 168ee: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 168f2: 88 23 and r24, r24 168f4: 09 f4 brne .+2 ; 0x168f8 168f6: 07 cc rjmp .-2034 ; 0x16106 168f8: 0e 94 35 60 call 0xc06a ; 0xc06a resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 168fc: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 16900: 70 93 72 06 sts 0x0672, r23 ; 0x800672 16904: 60 93 71 06 sts 0x0671, r22 ; 0x800671 16908: fe cb rjmp .-2052 ; 0x16106 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 "); 1690a: 8a ee ldi r24, 0xEA ; 234 1690c: 96 e8 ldi r25, 0x86 ; 134 1690e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 gcode_M105(); 16912: 0e 94 5a 78 call 0xf0b4 ; 0xf0b4 cmdqueue_pop_front(); //prevent an ok after the command since this command uses an ok at the beginning. 16916: 0e 94 54 76 call 0xeca8 ; 0xeca8 cmdbuffer_front_already_processed = true; 1691a: 81 e0 ldi r24, 0x01 ; 1 1691c: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 16920: f2 cb rjmp .-2076 ; 0x16106 16922: 10 92 88 14 sts 0x1488, r1 ; 0x801488 16926: 0c 94 70 a7 jmp 0x14ee0 ; 0x14ee0 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; } 1692a: 81 e0 ldi r24, 0x01 ; 1 1692c: 80 93 86 14 sts 0x1486, r24 ; 0x801486 16930: ea cb rjmp .-2092 ; 0x16106 #ifdef AUTOTEMP autotemp_enabled=false; #endif if (code_seen('S')) { setTargetHotend(code_value()); } else if (code_seen('R')) { 16932: 82 e5 ldi r24, 0x52 ; 82 16934: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16938: 81 11 cpse r24, r1 1693a: 0c 94 fc a6 jmp 0x14df8 ; 0x14df8 autotemp_factor=code_value(); autotemp_enabled=true; } #endif codenum = _millis(); 1693e: 0f 94 28 2a call 0x25450 ; 0x25450 16942: 6b 01 movw r12, r22 16944: 7c 01 movw r14, r24 }; FORCE_INLINE bool isHeatingHotend(uint8_t extruder){ return target_temperature[extruder] > current_temperature[extruder]; 16946: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 1694a: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 1694e: 07 2e mov r0, r23 16950: 00 0c add r0, r0 16952: 88 0b sbc r24, r24 16954: 99 0b sbc r25, r25 16956: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1695a: 11 e0 ldi r17, 0x01 ; 1 1695c: 20 91 af 0d lds r18, 0x0DAF ; 0x800daf 16960: 30 91 b0 0d lds r19, 0x0DB0 ; 0x800db0 16964: 40 91 b1 0d lds r20, 0x0DB1 ; 0x800db1 16968: 50 91 b2 0d lds r21, 0x0DB2 ; 0x800db2 1696c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 16970: 18 16 cp r1, r24 16972: 0c f0 brlt .+2 ; 0x16976 16974: 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 16976: 10 93 ae 0d sts 0x0DAE, r17 ; 0x800dae <_ZL16target_direction.lto_priv.534> wait_for_heater(codenum, active_extruder); //loops until target temperature is reached 1697a: c7 01 movw r24, r14 1697c: b6 01 movw r22, r12 1697e: 0f 94 d8 82 call 0x305b0 ; 0x305b0 LCD_MESSAGERPGM(_T(MSG_HEATING_COMPLETE)); 16982: 85 e9 ldi r24, 0x95 ; 149 16984: 9d e4 ldi r25, 0x4D ; 77 16986: 0e 94 44 72 call 0xe488 ; 0xe488 1698a: 0e 94 16 f2 call 0x1e42c ; 0x1e42c heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE; 1698e: 82 e0 ldi r24, 0x02 ; 2 16990: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 prusa_statistics(2); previous_millis_cmd.start(); 16994: 84 e8 ldi r24, 0x84 ; 132 16996: 93 e0 ldi r25, 0x03 ; 3 16998: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> 1699c: b4 cb rjmp .-2200 ; 0x16106 */ case 190: #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 { bool CooldownNoWait = false; LCD_MESSAGERPGM(_T(MSG_BED_HEATING)); 1699e: 87 e8 ldi r24, 0x87 ; 135 169a0: 9d e4 ldi r25, 0x4D ; 77 169a2: 0e 94 44 72 call 0xe488 ; 0xe488 169a6: 0e 94 16 f2 call 0x1e42c ; 0x1e42c heating_status = HeatingStatus::BED_HEATING; 169aa: 83 e0 ldi r24, 0x03 ; 3 169ac: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 prusa_statistics(1); if (code_seen('S')) 169b0: 83 e5 ldi r24, 0x53 ; 83 169b2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 169b6: 18 2f mov r17, r24 169b8: 88 23 and r24, r24 169ba: 49 f0 breq .+18 ; 0x169ce setTargetBed(code_value()); CooldownNoWait = true; } else if (code_seen('R')) { setTargetBed(code_value()); 169bc: 0e 94 35 60 call 0xc06a ; 0xc06a target_temperature[0] = celsius; resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 169c0: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 169c4: 70 93 72 06 sts 0x0672, r23 ; 0x800672 169c8: 60 93 71 06 sts 0x0671, r22 ; 0x800671 169cc: 05 c0 rjmp .+10 ; 0x169d8 if (code_seen('S')) { setTargetBed(code_value()); CooldownNoWait = true; } else if (code_seen('R')) 169ce: 82 e5 ldi r24, 0x52 ; 82 169d0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 169d4: 81 11 cpse r24, r1 169d6: f2 cf rjmp .-28 ; 0x169bc { setTargetBed(code_value()); } codenum = _millis(); 169d8: 0f 94 28 2a call 0x25450 ; 0x25450 169dc: 6b 01 movw r12, r22 169de: 7c 01 movw r14, r24 cancel_heatup = false; 169e0: 10 92 b4 0d sts 0x0DB4, r1 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> 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; 169e4: 60 91 71 06 lds r22, 0x0671 ; 0x800671 169e8: 70 91 72 06 lds r23, 0x0672 ; 0x800672 169ec: 07 2e mov r0, r23 169ee: 00 0c add r0, r0 169f0: 88 0b sbc r24, r24 169f2: 99 0b sbc r25, r25 169f4: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 169f8: 01 e0 ldi r16, 0x01 ; 1 169fa: 20 91 ed 04 lds r18, 0x04ED ; 0x8004ed 169fe: 30 91 ee 04 lds r19, 0x04EE ; 0x8004ee 16a02: 40 91 ef 04 lds r20, 0x04EF ; 0x8004ef 16a06: 50 91 f0 04 lds r21, 0x04F0 ; 0x8004f0 16a0a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 16a0e: 18 16 cp r1, r24 16a10: 0c f0 brlt .+2 ; 0x16a14 16a12: 00 e0 ldi r16, 0x00 ; 0 target_direction = isHeatingBed(); // true if heating, false if cooling 16a14: 00 93 ae 0d sts 0x0DAE, r16 ; 0x800dae <_ZL16target_direction.lto_priv.534> while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) ) 16a18: 80 91 b4 0d lds r24, 0x0DB4 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> 16a1c: 81 11 cpse r24, r1 16a1e: 1c c0 rjmp .+56 ; 0x16a58 16a20: 60 91 71 06 lds r22, 0x0671 ; 0x800671 16a24: 70 91 72 06 lds r23, 0x0672 ; 0x800672 16a28: 07 2e mov r0, r23 16a2a: 00 0c add r0, r0 16a2c: 88 0b sbc r24, r24 16a2e: 99 0b sbc r25, r25 16a30: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 16a34: 9b 01 movw r18, r22 16a36: ac 01 movw r20, r24 16a38: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 16a3c: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 16a40: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 16a44: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 16a48: e0 91 ae 0d lds r30, 0x0DAE ; 0x800dae <_ZL16target_direction.lto_priv.534> 16a4c: ee 23 and r30, r30 16a4e: 91 f0 breq .+36 ; 0x16a74 16a50: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 16a54: 87 fd sbrc r24, 7 16a56: 14 c0 rjmp .+40 ; 0x16a80 } manage_heater(); manage_inactivity(); lcd_update(0); } LCD_MESSAGERPGM(_T(MSG_BED_DONE)); 16a58: 8c e7 ldi r24, 0x7C ; 124 16a5a: 9d e4 ldi r25, 0x4D ; 77 16a5c: 0e 94 44 72 call 0xe488 ; 0xe488 16a60: 0e 94 16 f2 call 0x1e42c ; 0x1e42c heating_status = HeatingStatus::BED_HEATING_COMPLETE; 16a64: 84 e0 ldi r24, 0x04 ; 4 16a66: 80 93 e1 03 sts 0x03E1, r24 ; 0x8003e1 previous_millis_cmd.start(); 16a6a: 84 e8 ldi r24, 0x84 ; 132 16a6c: 93 e0 ldi r25, 0x03 ; 3 16a6e: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> 16a72: 49 cb rjmp .-2414 ; 0x16106 codenum = _millis(); cancel_heatup = false; target_direction = isHeatingBed(); // true if heating, false if cooling while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) ) 16a74: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 16a78: 18 16 cp r1, r24 16a7a: 74 f7 brge .-36 ; 0x16a58 16a7c: 11 11 cpse r17, r1 16a7e: ec cf rjmp .-40 ; 0x16a58 { if (lcd_commands_type == LcdCommands::LongPause) { 16a80: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 16a84: 82 30 cpi r24, 0x02 ; 2 16a86: 41 f3 breq .-48 ; 0x16a58 // 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. 16a88: 0f 94 28 2a call 0x25450 ; 0x25450 16a8c: 6c 19 sub r22, r12 16a8e: 7d 09 sbc r23, r13 16a90: 8e 09 sbc r24, r14 16a92: 9f 09 sbc r25, r15 16a94: 69 3e cpi r22, 0xE9 ; 233 16a96: 73 40 sbci r23, 0x03 ; 3 16a98: 81 05 cpc r24, r1 16a9a: 91 05 cpc r25, r1 16a9c: 30 f0 brcs .+12 ; 0x16aaa { if (!farm_mode) { serialecho_temperatures(); 16a9e: 0e 94 f6 76 call 0xedec ; 0xedec } codenum = _millis(); 16aa2: 0f 94 28 2a call 0x25450 ; 0x25450 16aa6: 6b 01 movw r12, r22 16aa8: 7c 01 movw r14, r24 } manage_heater(); 16aaa: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 16aae: 80 e0 ldi r24, 0x00 ; 0 16ab0: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 16ab4: 80 e0 ldi r24, 0x00 ; 0 16ab6: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 16aba: ae cf rjmp .-164 ; 0x16a18 #### 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')){ 16abc: 83 e5 ldi r24, 0x53 ; 83 16abe: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16ac2: 88 23 and r24, r24 16ac4: 29 f0 breq .+10 ; 0x16ad0 fanSpeed = code_value_uint8(); 16ac6: 0e 94 00 5b call 0xb600 ; 0xb600 16aca: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 16ace: 1b cb rjmp .-2506 ; 0x16106 } else { fanSpeed = 255; 16ad0: 8f ef ldi r24, 0xFF ; 255 16ad2: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 16ad6: 17 cb rjmp .-2514 ; 0x16106 /*! ### M107 - Fan off M107: Fan Off */ case 107: fanSpeed = 0; 16ad8: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 16adc: 14 cb rjmp .-2520 ; 0x16106 /*! ### 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; 16ade: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 16ae2: 88 60 ori r24, 0x08 ; 8 16ae4: 80 93 e3 03 sts 0x03E3, r24 ; 0x8003e3 16ae8: 0e cb rjmp .-2532 ; 0x16106 ### M18 - Disable steppers M18: Disable all stepper motors Equal to M84 (compatibility) */ case 18: //compatibility case 84: // M84 if(code_seen('S')){ 16aea: 83 e5 ldi r24, 0x53 ; 83 16aec: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16af0: 88 23 and r24, r24 16af2: 99 f0 breq .+38 ; 0x16b1a stepper_inactive_time = code_value() * 1000; 16af4: 0e 94 35 60 call 0xc06a ; 0xc06a 16af8: 20 e0 ldi r18, 0x00 ; 0 16afa: 30 e0 ldi r19, 0x00 ; 0 16afc: 4a e7 ldi r20, 0x7A ; 122 16afe: 54 e4 ldi r21, 0x44 ; 68 16b00: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 16b04: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16b08: 60 93 34 02 sts 0x0234, r22 ; 0x800234 16b0c: 70 93 35 02 sts 0x0235, r23 ; 0x800235 16b10: 80 93 36 02 sts 0x0236, r24 ; 0x800236 16b14: 90 93 37 02 sts 0x0237, r25 ; 0x800237 16b18: f6 ca rjmp .-2580 ; 0x16106 } 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]))); 16b1a: 88 e5 ldi r24, 0x58 ; 88 16b1c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b20: 88 23 and r24, r24 16b22: d1 f0 breq .+52 ; 0x16b58 disable_e0(); finishAndDisableSteppers(); } else { st_synchronize(); 16b24: 0f 94 a9 43 call 0x28752 ; 0x28752 if (code_seen('X')) disable_x(); 16b28: 88 e5 ldi r24, 0x58 ; 88 16b2a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b2e: 81 11 cpse r24, r1 16b30: 28 c0 rjmp .+80 ; 0x16b82 if (code_seen('Y')) disable_y(); 16b32: 89 e5 ldi r24, 0x59 ; 89 16b34: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b38: 88 23 and r24, r24 16b3a: 19 f0 breq .+6 ; 0x16b42 16b3c: 16 9a sbi 0x02, 6 ; 2 16b3e: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f if (code_seen('Z')) disable_z(); 16b42: 8a e5 ldi r24, 0x5A ; 90 16b44: 0e 94 6e 5b call 0xb6dc ; 0xb6dc #if (E0_ENABLE_PIN != X_ENABLE_PIN) // Only enable on boards that have seperate ENABLE_PINS if (code_seen('E')) disable_e0(); 16b48: 85 e4 ldi r24, 0x45 ; 69 16b4a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b4e: 88 23 and r24, r24 16b50: 09 f4 brne .+2 ; 0x16b54 16b52: d9 ca rjmp .-2638 ; 0x16106 16b54: 14 9a sbi 0x02, 4 ; 2 16b56: d7 ca rjmp .-2642 ; 0x16106 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]))); 16b58: 89 e5 ldi r24, 0x59 ; 89 16b5a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b5e: 81 11 cpse r24, r1 16b60: e1 cf rjmp .-62 ; 0x16b24 16b62: 8a e5 ldi r24, 0x5A ; 90 16b64: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b68: 81 11 cpse r24, r1 16b6a: dc cf rjmp .-72 ; 0x16b24 16b6c: 85 e4 ldi r24, 0x45 ; 69 16b6e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b72: 81 11 cpse r24, r1 16b74: d7 cf rjmp .-82 ; 0x16b24 if(all_axis) { st_synchronize(); 16b76: 0f 94 a9 43 call 0x28752 ; 0x28752 disable_e0(); 16b7a: 14 9a sbi 0x02, 4 ; 2 finishAndDisableSteppers(); 16b7c: 0e 94 00 82 call 0x10400 ; 0x10400 16b80: c2 ca rjmp .-2684 ; 0x16106 } else { st_synchronize(); if (code_seen('X')) disable_x(); 16b82: 17 9a sbi 0x02, 7 ; 2 16b84: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e 16b88: d4 cf rjmp .-88 ; 0x16b32 #### Parameters - `S` - specifies the time in seconds. If a value of 0 is specified, the timer is disabled. */ case 86: if (code_seen('S')) { 16b8a: 83 e5 ldi r24, 0x53 ; 83 16b8c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16b90: 88 23 and r24, r24 16b92: 09 f4 brne .+2 ; 0x16b96 16b94: b8 ca rjmp .-2704 ; 0x16106 safetytimer_inactive_time = code_value() * 1000; 16b96: 0e 94 35 60 call 0xc06a ; 0xc06a 16b9a: 20 e0 ldi r18, 0x00 ; 0 16b9c: 30 e0 ldi r19, 0x00 ; 0 16b9e: 4a e7 ldi r20, 0x7A ; 122 16ba0: 54 e4 ldi r21, 0x44 ; 68 16ba2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 16ba6: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16baa: 60 93 30 02 sts 0x0230, r22 ; 0x800230 16bae: 70 93 31 02 sts 0x0231, r23 ; 0x800231 16bb2: 80 93 32 02 sts 0x0232, r24 ; 0x800232 16bb6: 90 93 33 02 sts 0x0233, r25 ; 0x800233 safetyTimer.start(); 16bba: 89 ed ldi r24, 0xD9 ; 217 16bbc: 95 e0 ldi r25, 0x05 ; 5 16bbe: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> 16bc2: a1 ca rjmp .-2750 ; 0x16106 16bc4: fd ed ldi r31, 0xDD ; 221 16bc6: cf 2e mov r12, r31 16bc8: f2 e0 ldi r31, 0x02 ; 2 16bca: df 2e mov r13, r31 16bcc: ad eb ldi r26, 0xBD ; 189 16bce: ea 2e mov r14, r26 16bd0: ad e0 ldi r26, 0x0D ; 13 16bd2: fa 2e mov r15, r26 - `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++) 16bd4: 10 e0 ldi r17, 0x00 ; 0 { if(code_seen(axis_codes[i])) 16bd6: f6 01 movw r30, r12 16bd8: 81 91 ld r24, Z+ 16bda: 6f 01 movw r12, r30 16bdc: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16be0: 88 23 and r24, r24 16be2: 09 f4 brne .+2 ; 0x16be6 16be4: 67 c0 rjmp .+206 ; 0x16cb4 { float value = code_value(); 16be6: 0e 94 35 60 call 0xc06a ; 0xc06a 16bea: 2b 01 movw r4, r22 16bec: 3c 01 movw r6, r24 if(i == E_AXIS) { // E 16bee: 13 30 cpi r17, 0x03 ; 3 16bf0: 09 f0 breq .+2 ; 0x16bf4 16bf2: 6a c0 rjmp .+212 ; 0x16cc8 if(value < 20.0) { 16bf4: 20 e0 ldi r18, 0x00 ; 0 16bf6: 30 e0 ldi r19, 0x00 ; 0 16bf8: 40 ea ldi r20, 0xA0 ; 160 16bfa: 51 e4 ldi r21, 0x41 ; 65 16bfc: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 16c00: 87 ff sbrs r24, 7 16c02: 4e c0 rjmp .+156 ; 0x16ca0 const float factor = cs.axis_steps_per_mm[E_AXIS] / value; // increase e constants if M92 E14 is given for netfab. 16c04: a3 01 movw r20, r6 16c06: 92 01 movw r18, r4 16c08: 60 91 cd 0d lds r22, 0x0DCD ; 0x800dcd 16c0c: 70 91 ce 0d lds r23, 0x0DCE ; 0x800dce 16c10: 80 91 cf 0d lds r24, 0x0DCF ; 0x800dcf 16c14: 90 91 d0 0d lds r25, 0x0DD0 ; 0x800dd0 16c18: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 16c1c: 4b 01 movw r8, r22 16c1e: 5c 01 movw r10, r24 cs.max_jerk[E_AXIS] *= factor; 16c20: ac 01 movw r20, r24 16c22: 9b 01 movw r18, r22 16c24: 60 91 11 0e lds r22, 0x0E11 ; 0x800e11 16c28: 70 91 12 0e lds r23, 0x0E12 ; 0x800e12 16c2c: 80 91 13 0e lds r24, 0x0E13 ; 0x800e13 16c30: 90 91 14 0e lds r25, 0x0E14 ; 0x800e14 16c34: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 16c38: 60 93 11 0e sts 0x0E11, r22 ; 0x800e11 16c3c: 70 93 12 0e sts 0x0E12, r23 ; 0x800e12 16c40: 80 93 13 0e sts 0x0E13, r24 ; 0x800e13 16c44: 90 93 14 0e sts 0x0E14, r25 ; 0x800e14 max_feedrate[E_AXIS] *= factor; 16c48: 20 90 71 02 lds r2, 0x0271 ; 0x800271 16c4c: 30 90 72 02 lds r3, 0x0272 ; 0x800272 16c50: a5 01 movw r20, r10 16c52: 94 01 movw r18, r8 16c54: d1 01 movw r26, r2 16c56: 1c 96 adiw r26, 0x0c ; 12 16c58: 6d 91 ld r22, X+ 16c5a: 7d 91 ld r23, X+ 16c5c: 8d 91 ld r24, X+ 16c5e: 9c 91 ld r25, X 16c60: 1f 97 sbiw r26, 0x0f ; 15 16c62: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 16c66: f1 01 movw r30, r2 16c68: 64 87 std Z+12, r22 ; 0x0c 16c6a: 75 87 std Z+13, r23 ; 0x0d 16c6c: 86 87 std Z+14, r24 ; 0x0e 16c6e: 97 87 std Z+15, r25 ; 0x0f max_acceleration_steps_per_s2[E_AXIS] *= factor; 16c70: 60 91 59 05 lds r22, 0x0559 ; 0x800559 16c74: 70 91 5a 05 lds r23, 0x055A ; 0x80055a 16c78: 80 91 5b 05 lds r24, 0x055B ; 0x80055b 16c7c: 90 91 5c 05 lds r25, 0x055C ; 0x80055c 16c80: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 16c84: a5 01 movw r20, r10 16c86: 94 01 movw r18, r8 16c88: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 16c8c: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 16c90: 60 93 59 05 sts 0x0559, r22 ; 0x800559 16c94: 70 93 5a 05 sts 0x055A, r23 ; 0x80055a 16c98: 80 93 5b 05 sts 0x055B, r24 ; 0x80055b 16c9c: 90 93 5c 05 sts 0x055C, r25 ; 0x80055c } cs.axis_steps_per_mm[E_AXIS] = value; 16ca0: 40 92 cd 0d sts 0x0DCD, r4 ; 0x800dcd 16ca4: 50 92 ce 0d sts 0x0DCE, r5 ; 0x800dce 16ca8: 60 92 cf 0d sts 0x0DCF, r6 ; 0x800dcf 16cac: 70 92 d0 0d sts 0x0DD0, r7 ; 0x800dd0 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.init(); 16cb0: 0f 94 30 7c call 0x2f860 ; 0x2f860 16cb4: b4 e0 ldi r27, 0x04 ; 4 16cb6: eb 0e add r14, r27 16cb8: f1 1c adc r15, r1 16cba: 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++) 16cbc: 14 30 cpi r17, 0x04 ; 4 16cbe: 09 f0 breq .+2 ; 0x16cc2 16cc0: 8a cf rjmp .-236 ; 0x16bd6 } else { cs.axis_steps_per_mm[i] = value; } } } reset_acceleration_rates(); 16cc2: 0f 94 56 64 call 0x2c8ac ; 0x2c8ac 16cc6: 1f ca rjmp .-3010 ; 0x16106 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; 16cc8: d7 01 movw r26, r14 16cca: 14 96 adiw r26, 0x04 ; 4 16ccc: 4d 92 st X+, r4 16cce: 5d 92 st X+, r5 16cd0: 6d 92 st X+, r6 16cd2: 7c 92 st X, r7 16cd4: 17 97 sbiw r26, 0x07 ; 7 16cd6: ee cf rjmp .-36 ; 0x16cb4 #### Parameters - `N` - Line number */ case 110: if (code_seen('N')) 16cd8: 8e e4 ldi r24, 0x4E ; 78 16cda: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16cde: 88 23 and r24, r24 16ce0: 09 f4 brne .+2 ; 0x16ce4 16ce2: 11 ca rjmp .-3038 ; 0x16106 gcode_LastN = code_value_long(); 16ce4: 0e 94 1a 5b call 0xb634 ; 0xb634 16ce8: 60 93 78 03 sts 0x0378, r22 ; 0x800378 16cec: 70 93 79 03 sts 0x0379, r23 ; 0x800379 16cf0: 80 93 7a 03 sts 0x037A, r24 ; 0x80037a 16cf4: 90 93 7b 03 sts 0x037B, r25 ; 0x80037b 16cf8: 06 ca rjmp .-3060 ; 0x16106 case 113: if (code_seen('S')) { host_keepalive_interval = code_value_uint8(); } else { SERIAL_ECHO_START; 16cfa: 82 ef ldi r24, 0xF2 ; 242 16cfc: 9a ea ldi r25, 0xAA ; 170 16cfe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); 16d02: c0 90 2f 02 lds r12, 0x022F ; 0x80022f 16d06: d1 2c mov r13, r1 16d08: f1 2c mov r15, r1 16d0a: 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); } 16d0c: 83 ee ldi r24, 0xE3 ; 227 16d0e: 96 e8 ldi r25, 0x86 ; 134 16d10: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 16d14: 4a e0 ldi r20, 0x0A ; 10 16d16: c7 01 movw r24, r14 16d18: b6 01 movw r22, r12 16d1a: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 host_keepalive_interval = code_value_uint8(); } else { SERIAL_ECHO_START; SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); SERIAL_PROTOCOLLN(); 16d1e: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 16d22: f1 c9 rjmp .-3102 ; 0x16106 */ case 115: // M115 if (code_seen('V')) { // Report the Prusa version number. SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P()); } else if (code_seen('U')) { 16d24: 85 e5 ldi r24, 0x55 ; 85 16d26: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 16d2a: 88 23 and r24, r24 16d2c: 09 f4 brne .+2 ; 0x16d30 16d2e: 5a c0 rjmp .+180 ; 0x16de4 // 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); 16d30: 00 91 93 03 lds r16, 0x0393 ; 0x800393 16d34: 10 91 94 03 lds r17, 0x0394 ; 0x800394 16d38: 0f 5f subi r16, 0xFF ; 255 16d3a: 1f 4f sbci r17, 0xFF ; 255 16d3c: 10 93 94 03 sts 0x0394, r17 ; 0x800394 16d40: 00 93 93 03 sts 0x0393, r16 ; 0x800393 return false; } bool show_upgrade_dialog_if_version_newer(const char *version_string) { if(oCheckVersion == ClCheckMode::_None) 16d44: 80 91 e8 04 lds r24, 0x04E8 ; 0x8004e8 16d48: 88 23 and r24, r24 16d4a: 09 f4 brne .+2 ; 0x16d4e 16d4c: dc c9 rjmp .-3144 ; 0x16106 // 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)) 16d4e: be 01 movw r22, r28 16d50: 6f 5f subi r22, 0xFF ; 255 16d52: 7f 4f sbci r23, 0xFF ; 255 16d54: c8 01 movw r24, r16 16d56: 0e 94 2a f0 call 0x1e054 ; 0x1e054 16d5a: 88 23 and r24, r24 16d5c: 09 f4 brne .+2 ; 0x16d60 16d5e: d3 c9 rjmp .-3162 ; 0x16106 16d60: 82 e6 ldi r24, 0x62 ; 98 16d62: 9d e8 ldi r25, 0x8D ; 141 16d64: de 01 movw r26, r28 16d66: 11 96 adiw r26, 0x01 ; 1 16d68: be 01 movw r22, r28 16d6a: 67 5f subi r22, 0xF7 ; 247 16d6c: 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]); 16d6e: fc 01 movw r30, r24 16d70: 45 91 lpm r20, Z+ 16d72: 54 91 lpm r21, Z if (ver_gcode[i] > v) 16d74: 2d 91 ld r18, X+ 16d76: 3d 91 ld r19, X+ 16d78: 42 17 cp r20, r18 16d7a: 53 07 cpc r21, r19 16d7c: 10 f4 brcc .+4 ; 0x16d82 16d7e: 0c 94 54 cd jmp 0x19aa8 ; 0x19aa8 return 1; else if (ver_gcode[i] < v) 16d82: 24 17 cp r18, r20 16d84: 35 07 cpc r19, r21 16d86: 08 f4 brcc .+2 ; 0x16d8a 16d88: be c9 rjmp .-3204 ; 0x16106 16d8a: 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) 16d8c: a6 17 cp r26, r22 16d8e: b7 07 cpc r27, r23 16d90: 71 f7 brne .-36 ; 0x16d6e 16d92: b9 c9 rjmp .-3214 ; 0x16106 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)); 16d94: 83 e4 ldi r24, 0x43 ; 67 16d96: 99 e3 ldi r25, 0x39 ; 57 16d98: 0e 94 44 72 call 0xe488 ; 0xe488 16d9c: ac 01 movw r20, r24 16d9e: 63 e0 ldi r22, 0x03 ; 3 16da0: 80 e0 ldi r24, 0x00 ; 0 16da2: 0e 94 8c 6e call 0xdd18 ; 0xdd18 Sound_MakeCustom(50,1000,false); 16da6: 40 e0 ldi r20, 0x00 ; 0 16da8: 68 ee ldi r22, 0xE8 ; 232 16daa: 73 e0 ldi r23, 0x03 ; 3 16dac: 82 e3 ldi r24, 0x32 ; 50 16dae: 90 e0 ldi r25, 0x00 ; 0 16db0: 0f 94 3d 52 call 0x2a47a ; 0x2a47a delay_keep_alive(500); 16db4: 84 ef ldi r24, 0xF4 ; 244 16db6: 91 e0 ldi r25, 0x01 ; 1 16db8: 0e 94 84 8c call 0x11908 ; 0x11908 Sound_MakeCustom(50,1000,false); 16dbc: 40 e0 ldi r20, 0x00 ; 0 16dbe: 68 ee ldi r22, 0xE8 ; 232 16dc0: 73 e0 ldi r23, 0x03 ; 3 16dc2: 82 e3 ldi r24, 0x32 ; 50 16dc4: 90 e0 ldi r25, 0x00 ; 0 16dc6: 0f 94 3d 52 call 0x2a47a ; 0x2a47a lcd_wait_for_click_delay(30); 16dca: 8e e1 ldi r24, 0x1E ; 30 16dcc: 90 e0 ldi r25, 0x00 ; 0 16dce: 0f 94 07 3b call 0x2760e ; 0x2760e lcd_update_enable(true); 16dd2: 81 e0 ldi r24, 0x01 ; 1 16dd4: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 16dd8: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_update(0); 16ddc: 80 e0 ldi r24, 0x00 ; 0 16dde: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 16de2: 91 c9 rjmp .-3294 ; 0x16106 } 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); 16de4: 41 e1 ldi r20, 0x11 ; 17 16de6: 50 e0 ldi r21, 0x00 ; 0 16de8: 60 e8 ldi r22, 0x80 ; 128 16dea: 7c e0 ldi r23, 0x0C ; 12 16dec: ce 01 movw r24, r28 16dee: 01 96 adiw r24, 0x01 ; 1 16df0: 0f 94 00 dc call 0x3b800 ; 0x3b800 SERIAL_ECHOPGM("FIRMWARE_NAME:Prusa-Firmware "); 16df4: 85 ec ldi r24, 0xC5 ; 197 16df6: 96 e8 ldi r25, 0x86 ; 134 16df8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(FW_VERSION_STR_P()); 16dfc: 86 e4 ldi r24, 0x46 ; 70 16dfe: 94 e8 ldi r25, 0x84 ; 132 16e00: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM("+"); 16e04: 83 ec ldi r24, 0xC3 ; 195 16e06: 96 e8 ldi r25, 0x86 ; 134 16e08: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(STR(FW_COMMITNR)); 16e0c: 8e eb ldi r24, 0xBE ; 190 16e0e: 96 e8 ldi r25, 0x86 ; 134 16e10: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM("_"); 16e14: 8c eb ldi r24, 0xBC ; 188 16e16: 96 e8 ldi r25, 0x86 ; 134 16e18: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(FW_COMMIT_HASH); 16e1c: 82 eb ldi r24, 0xB2 ; 178 16e1e: 96 e8 ldi r25, 0x86 ; 134 16e20: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(" based on Marlin FIRMWARE_URL:https://github.com/prusa3d/Prusa-Firmware PROTOCOL_VERSION:"); 16e24: 88 e5 ldi r24, 0x58 ; 88 16e26: 96 e8 ldi r25, 0x86 ; 134 16e28: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(PROTOCOL_VERSION); 16e2c: 84 e5 ldi r24, 0x54 ; 84 16e2e: 96 e8 ldi r25, 0x86 ; 134 16e30: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(" MACHINE_TYPE:"); 16e34: 85 e4 ldi r24, 0x45 ; 69 16e36: 96 e8 ldi r25, 0x86 ; 134 16e38: 0e 94 e8 76 call 0xedd0 ; 0xedd0 16e3c: ce 01 movw r24, r28 16e3e: 01 96 adiw r24, 0x01 ; 1 16e40: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_PROTOCOL(custom_mendel_name); SERIAL_ECHOPGM(" EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS)); 16e44: 83 e3 ldi r24, 0x33 ; 51 16e46: 96 e8 ldi r25, 0x86 ; 134 16e48: 0e 94 e8 76 call 0xedd0 ; 0xedd0 #ifdef MACHINE_UUID SERIAL_ECHOPGM(" UUID:"); SERIAL_ECHOPGM(MACHINE_UUID); #endif //MACHINE_UUID SERIAL_ECHOLNPGM(""); 16e4c: 82 e3 ldi r24, 0x32 ; 50 16e4e: 96 e8 ldi r25, 0x86 ; 134 16e50: 0e 94 13 79 call 0xf226 ; 0xf226 } #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'); 16e54: 1f 92 push r1 16e56: e1 e3 ldi r30, 0x31 ; 49 16e58: fe 2e mov r15, r30 16e5a: ff 92 push r15 16e5c: 85 e3 ldi r24, 0x35 ; 53 16e5e: 94 e8 ldi r25, 0x84 ; 132 16e60: 9f 93 push r25 16e62: 8f 93 push r24 16e64: 0e ee ldi r16, 0xEE ; 238 16e66: 13 e8 ldi r17, 0x83 ; 131 16e68: 1f 93 push r17 16e6a: 0f 93 push r16 16e6c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16e70: 1f 92 push r1 16e72: ff 92 push r15 16e74: 85 e2 ldi r24, 0x25 ; 37 16e76: 94 e8 ldi r25, 0x84 ; 132 16e78: 9f 93 push r25 16e7a: 8f 93 push r24 16e7c: 1f 93 push r17 16e7e: 0f 93 push r16 16e80: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16e84: 1f 92 push r1 16e86: ff 92 push r15 16e88: 81 e1 ldi r24, 0x11 ; 17 16e8a: 94 e8 ldi r25, 0x84 ; 132 16e8c: 9f 93 push r25 16e8e: 8f 93 push r24 16e90: 1f 93 push r17 16e92: 0f 93 push r16 16e94: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16e98: 1f 92 push r1 16e9a: ff 92 push r15 16e9c: 84 e0 ldi r24, 0x04 ; 4 16e9e: 94 e8 ldi r25, 0x84 ; 132 16ea0: 9f 93 push r25 16ea2: 8f 93 push r24 16ea4: 1f 93 push r17 16ea6: 0f 93 push r16 16ea8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16eac: 1f 92 push r1 16eae: ff 92 push r15 16eb0: 89 ef ldi r24, 0xF9 ; 249 16eb2: 93 e8 ldi r25, 0x83 ; 131 16eb4: 9f 93 push r25 16eb6: 8f 93 push r24 16eb8: 1f 93 push r17 16eba: 0f 93 push r16 16ebc: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 16ec0: 0f b6 in r0, 0x3f ; 63 16ec2: f8 94 cli 16ec4: de bf out 0x3e, r29 ; 62 16ec6: 0f be out 0x3f, r0 ; 63 16ec8: cd bf out 0x3d, r28 ; 61 16eca: 1d c9 rjmp .-3526 ; 0x16106 /*! ### M114 - Get current position M114: Get Current Position */ case 114: gcode_M114(); 16ecc: 0e 94 df 77 call 0xefbe ; 0xefbe 16ed0: 1a c9 rjmp .-3532 ; 0x16106 /*! ### M117 - Display Message M117: Display Message */ case 117: { const char *src = strchr_pointer + 4; // "M117" 16ed2: e0 91 93 03 lds r30, 0x0393 ; 0x800393 16ed6: f0 91 94 03 lds r31, 0x0394 ; 0x800394 16eda: cf 01 movw r24, r30 16edc: 04 96 adiw r24, 0x04 ; 4 lcd_setstatus(*src == ' '? src + 1: src); 16ede: 24 81 ldd r18, Z+4 ; 0x04 16ee0: 20 32 cpi r18, 0x20 ; 32 16ee2: 09 f4 brne .+2 ; 0x16ee6 16ee4: 01 96 adiw r24, 0x01 ; 1 16ee6: 0e 94 42 f5 call 0x1ea84 ; 0x1ea84 custom_message_type = CustomMsg::M117; 16eea: 87 e0 ldi r24, 0x07 ; 7 16eec: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 16ef0: 0a c9 rjmp .-3564 ; 0x16106 - `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; 16ef2: 00 91 93 03 lds r16, 0x0393 ; 0x800393 16ef6: 10 91 94 03 lds r17, 0x0394 ; 0x800394 16efa: 0b 5f subi r16, 0xFB ; 251 16efc: 1f 4f sbci r17, 0xFF ; 255 16efe: 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; 16f00: f1 2c mov r15, r1 16f02: 40 e0 ldi r20, 0x00 ; 0 16f04: 81 50 subi r24, 0x01 ; 1 char *p = strchr_pointer + 5; for (uint8_t i = 2; i--;) { 16f06: e9 f0 breq .+58 ; 0x16f42 // A1, E1, and Pn are always parsed out if (!((p[0] == 'A' || p[0] == 'E') && p[1] == '1')) break; 16f08: d8 01 movw r26, r16 16f0a: 9c 91 ld r25, X 16f0c: 29 2f mov r18, r25 16f0e: 2b 7f andi r18, 0xFB ; 251 16f10: 21 34 cpi r18, 0x41 ; 65 16f12: b9 f4 brne .+46 ; 0x16f42 16f14: 11 96 adiw r26, 0x01 ; 1 16f16: 2c 91 ld r18, X 16f18: 21 33 cpi r18, 0x31 ; 49 16f1a: 99 f4 brne .+38 ; 0x16f42 switch (p[0]) { 16f1c: 91 34 cpi r25, 0x41 ; 65 16f1e: 71 f0 breq .+28 ; 0x16f3c 16f20: 95 34 cpi r25, 0x45 ; 69 16f22: 09 f4 brne .+2 ; 0x16f26 case 'A': hasA = true; break; case 'E': hasE = true; break; 16f24: 41 e0 ldi r20, 0x01 ; 1 } p += 2; 16f26: 98 01 movw r18, r16 16f28: 2e 5f subi r18, 0xFE ; 254 16f2a: 3f 4f sbci r19, 0xFF ; 255 16f2c: 89 01 movw r16, r18 16f2e: 2f 5f subi r18, 0xFF ; 255 16f30: 3f 4f sbci r19, 0xFF ; 255 while (*p == ' ') ++p; 16f32: f8 01 movw r30, r16 16f34: 90 81 ld r25, Z 16f36: 90 32 cpi r25, 0x20 ; 32 16f38: c9 f3 breq .-14 ; 0x16f2c 16f3a: e4 cf rjmp .-56 ; 0x16f04 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; 16f3c: ff 24 eor r15, r15 16f3e: f3 94 inc r15 16f40: f2 cf rjmp .-28 ; 0x16f26 } p += 2; while (*p == ' ') ++p; } if (hasE) SERIAL_ECHO_START; 16f42: 44 23 and r20, r20 16f44: 21 f0 breq .+8 ; 0x16f4e 16f46: 82 ef ldi r24, 0xF2 ; 242 16f48: 9a ea ldi r25, 0xAA ; 170 16f4a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (hasA) SERIAL_ECHOPGM("//"); 16f4e: ff 20 and r15, r15 16f50: 21 f0 breq .+8 ; 0x16f5a 16f52: 8f e2 ldi r24, 0x2F ; 47 16f54: 96 e8 ldi r25, 0x86 ; 134 16f56: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(p); 16f5a: c8 01 movw r24, r16 16f5c: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 16f60: d2 c8 rjmp .-3676 ; 0x16106 /*! ### 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 16f62: 84 ec ldi r24, 0xC4 ; 196 16f64: 97 e6 ldi r25, 0x67 ; 103 16f66: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(); 16f6a: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN 16f6e: 8c eb ldi r24, 0xBC ; 188 16f70: 97 e6 ldi r25, 0x67 ; 103 16f72: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){ 16f76: 1e 99 sbic 0x03, 6 ; 3 16f78: 47 c0 rjmp .+142 ; 0x17008 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16f7a: 87 eb ldi r24, 0xB7 ; 183 16f7c: 97 e6 ldi r25, 0x67 ; 103 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); 16f7e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 16f82: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #endif #if defined(X_MAX_PIN) && X_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX 16f86: 85 ea ldi r24, 0xA5 ; 165 16f88: 97 e6 ldi r25, 0x67 ; 103 16f8a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){ 16f8e: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 16f92: 82 fd sbrc r24, 2 16f94: 3c c0 rjmp .+120 ; 0x1700e SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16f96: 87 eb ldi r24, 0xB7 ; 183 16f98: 97 e6 ldi r25, 0x67 ; 103 SERIAL_PROTOCOLLN(); #endif #if defined(X_MAX_PIN) && X_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 16f9a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 16f9e: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN 16fa2: 8d e9 ldi r24, 0x9D ; 157 16fa4: 97 e6 ldi r25, 0x67 ; 103 16fa6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){ 16faa: 1d 99 sbic 0x03, 5 ; 3 16fac: 33 c0 rjmp .+102 ; 0x17014 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16fae: 87 eb ldi r24, 0xB7 ; 183 16fb0: 97 e6 ldi r25, 0x67 ; 103 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); 16fb2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 16fb6: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #endif #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX 16fba: 85 e9 ldi r24, 0x95 ; 149 16fbc: 97 e6 ldi r25, 0x67 ; 103 16fbe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){ 16fc2: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 16fc6: 87 fd sbrc r24, 7 16fc8: 28 c0 rjmp .+80 ; 0x1701a SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16fca: 87 eb ldi r24, 0xB7 ; 183 16fcc: 97 e6 ldi r25, 0x67 ; 103 SERIAL_PROTOCOLLN(); #endif #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 16fce: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 16fd2: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MIN); 16fd6: 8d e8 ldi r24, 0x8D ; 141 16fd8: 97 e6 ldi r25, 0x67 ; 103 16fda: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){ 16fde: 1c 99 sbic 0x03, 4 ; 3 16fe0: 1f c0 rjmp .+62 ; 0x17020 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16fe2: 87 eb ldi r24, 0xB7 ; 183 16fe4: 97 e6 ldi r25, 0x67 ; 103 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); 16fe6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 16fea: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(MSG_Z_MAX); 16fee: 85 e8 ldi r24, 0x85 ; 133 16ff0: 97 e6 ldi r25, 0x67 ; 103 16ff2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){ 16ff6: 01 9b sbis 0x00, 1 ; 0 16ff8: 16 c0 rjmp .+44 ; 0x17026 SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); 16ffa: 87 eb ldi r24, 0xB7 ; 183 16ffc: 97 e6 ldi r25, 0x67 ; 103 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); 16ffe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 }else{ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN); } SERIAL_PROTOCOLLN(); 17002: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 17006: 7f c8 rjmp .-3842 ; 0x16106 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); 17008: 8d ea ldi r24, 0xAD ; 173 1700a: 97 e6 ldi r25, 0x67 ; 103 1700c: b8 cf rjmp .-144 ; 0x16f7e SERIAL_PROTOCOLLN(); #endif #if defined(X_MAX_PIN) && X_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 1700e: 8d ea ldi r24, 0xAD ; 173 17010: 97 e6 ldi r25, 0x67 ; 103 17012: c3 cf rjmp .-122 ; 0x16f9a 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); 17014: 8d ea ldi r24, 0xAD ; 173 17016: 97 e6 ldi r25, 0x67 ; 103 17018: cc cf rjmp .-104 ; 0x16fb2 SERIAL_PROTOCOLLN(); #endif #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){ SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); 1701a: 8d ea ldi r24, 0xAD ; 173 1701c: 97 e6 ldi r25, 0x67 ; 103 1701e: d7 cf rjmp .-82 ; 0x16fce 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); 17020: 8d ea ldi r24, 0xAD ; 173 17022: 97 e6 ldi r25, 0x67 ; 103 17024: e0 cf rjmp .-64 ; 0x16fe6 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); 17026: 8d ea ldi r24, 0xAD ; 173 17028: 97 e6 ldi r25, 0x67 ; 103 1702a: e9 cf rjmp .-46 ; 0x16ffe E0:3240 RPM PRN1:4560 RPM E0@:255 PRN1@:255 */ case 123: gcode_M123(); 1702c: 0e 94 1c 66 call 0xcc38 ; 0xcc38 17030: 6a c8 rjmp .-3884 ; 0x16106 */ 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')) { 17032: 84 e5 ldi r24, 0x54 ; 84 17034: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17038: 88 23 and r24, r24 1703a: 69 f0 breq .+26 ; 0x17056 extruder = code_value_uint8(); 1703c: 0e 94 00 5b call 0xb600 ; 0xb600 if(extruder >= EXTRUDERS) { 17040: 88 23 and r24, r24 17042: 49 f0 breq .+18 ; 0x17056 SERIAL_ECHO_START; 17044: 82 ef ldi r24, 0xF2 ; 242 17046: 9a ea ldi r25, 0xAA ; 170 17048: 0e 94 e8 76 call 0xedd0 ; 0xedd0 1704c: 8e e6 ldi r24, 0x6E ; 110 1704e: 97 e6 ldi r25, 0x67 ; 103 17050: 0e 94 ac 87 call 0x10f58 ; 0x10f58 17054: 58 c8 rjmp .-3920 ; 0x16106 SERIAL_ECHO(_n("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER break; } } if(code_seen('D')) { 17056: 84 e4 ldi r24, 0x44 ; 68 17058: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1705c: 88 23 and r24, r24 1705e: 09 f4 brne .+2 ; 0x17062 17060: 52 c8 rjmp .-3932 ; 0x16106 float diameter = code_value(); 17062: 0e 94 35 60 call 0xc06a ; 0xc06a if (diameter == 0.0) { 17066: 20 e0 ldi r18, 0x00 ; 0 17068: 30 e0 ldi r19, 0x00 ; 0 1706a: a9 01 movw r20, r18 1706c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 17070: 81 11 cpse r24, r1 17072: 05 c0 rjmp .+10 ; 0x1707e // 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; 17074: 10 92 54 0e sts 0x0E54, r1 ; 0x800e54 } } else { //reserved for setting filament diameter via UFID or filament measuring device break; } calculate_extruder_multipliers(); 17078: 0e 94 51 65 call 0xcaa2 ; 0xcaa2 1707c: 44 c8 rjmp .-3960 ; 0x16106 // 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(); 1707e: 0e 94 35 60 call 0xc06a ; 0xc06a 17082: 6b 01 movw r12, r22 17084: 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]); 17086: 20 e0 ldi r18, 0x00 ; 0 17088: 30 e0 ldi r19, 0x00 ; 0 1708a: a9 01 movw r20, r18 1708c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 17090: 81 11 cpse r24, r1 17092: 06 c0 rjmp .+12 ; 0x170a0 17094: c1 2c mov r12, r1 17096: d1 2c mov r13, r1 17098: 70 ee ldi r23, 0xE0 ; 224 1709a: e7 2e mov r14, r23 1709c: 7f e3 ldi r23, 0x3F ; 63 1709e: f7 2e mov r15, r23 170a0: c0 92 55 0e sts 0x0E55, r12 ; 0x800e55 170a4: d0 92 56 0e sts 0x0E56, r13 ; 0x800e56 170a8: e0 92 57 0e sts 0x0E57, r14 ; 0x800e57 170ac: f0 92 58 0e sts 0x0E58, r15 ; 0x800e58 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; 170b0: 81 e0 ldi r24, 0x01 ; 1 170b2: 80 93 54 0e sts 0x0E54, r24 ; 0x800e54 170b6: e0 cf rjmp .-64 ; 0x17078 170b8: 5d ed ldi r21, 0xDD ; 221 170ba: c5 2e mov r12, r21 170bc: 52 e0 ldi r21, 0x02 ; 2 170be: d5 2e mov r13, r21 170c0: 6d eb ldi r22, 0xBD ; 189 170c2: e6 2e mov r14, r22 170c4: 6d e0 ldi r22, 0x0D ; 13 170c6: f6 2e mov r15, r22 - `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++) 170c8: 10 e0 ldi r17, 0x00 ; 0 { if (code_seen(axis_codes[i])) 170ca: d6 01 movw r26, r12 170cc: 8d 91 ld r24, X+ 170ce: 6d 01 movw r12, r26 170d0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 170d4: 88 23 and r24, r24 170d6: 41 f1 breq .+80 ; 0x17128 { unsigned long val = code_value(); 170d8: 0e 94 35 60 call 0xc06a ; 0xc06a 170dc: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> #ifdef TMC2130 unsigned long val_silent = val; if ((i == X_AXIS) || (i == Y_AXIS)) 170e0: 12 30 cpi r17, 0x02 ; 2 170e2: 4c f5 brge .+82 ; 0x17136 { if (val > NORMAL_MAX_ACCEL_XY) 170e4: 65 3c cpi r22, 0xC5 ; 197 170e6: b9 e0 ldi r27, 0x09 ; 9 170e8: 7b 07 cpc r23, r27 170ea: 81 05 cpc r24, r1 170ec: 91 05 cpc r25, r1 170ee: 40 f5 brcc .+80 ; 0x17140 170f0: 56 2f mov r21, r22 170f2: 47 2f mov r20, r23 170f4: 38 2f mov r19, r24 170f6: 29 2f mov r18, r25 170f8: 61 3c cpi r22, 0xC1 ; 193 170fa: e3 e0 ldi r30, 0x03 ; 3 170fc: 7e 07 cpc r23, r30 170fe: 81 05 cpc r24, r1 17100: 91 05 cpc r25, r1 17102: 20 f0 brcs .+8 ; 0x1710c 17104: 50 ec ldi r21, 0xC0 ; 192 17106: 43 e0 ldi r20, 0x03 ; 3 17108: 30 e0 ldi r19, 0x00 ; 0 1710a: 20 e0 ldi r18, 0x00 ; 0 val = NORMAL_MAX_ACCEL_XY; if (val_silent > SILENT_MAX_ACCEL_XY) val_silent = SILENT_MAX_ACCEL_XY; } cs.max_acceleration_mm_per_s2_normal[i] = val; 1710c: d7 01 movw r26, r14 1710e: 94 96 adiw r26, 0x24 ; 36 17110: 6d 93 st X+, r22 17112: 7d 93 st X+, r23 17114: 8d 93 st X+, r24 17116: 9c 93 st X, r25 17118: 97 97 sbiw r26, 0x27 ; 39 cs.max_acceleration_mm_per_s2_silent[i] = val_silent; 1711a: f7 01 movw r30, r14 1711c: e4 55 subi r30, 0x54 ; 84 1711e: ff 4f sbci r31, 0xFF ; 255 17120: 50 83 st Z, r21 17122: 41 83 std Z+1, r20 ; 0x01 17124: 32 83 std Z+2, r19 ; 0x02 17126: 23 83 std Z+3, r18 ; 0x03 17128: b4 e0 ldi r27, 0x04 ; 4 1712a: eb 0e add r14, r27 1712c: f1 1c adc r15, r1 1712e: 1f 5f subi r17, 0xFF ; 255 - `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++) 17130: 14 30 cpi r17, 0x04 ; 4 17132: 59 f6 brne .-106 ; 0x170ca 17134: c6 cd rjmp .-1140 ; 0x16cc2 { if (code_seen(axis_codes[i])) { unsigned long val = code_value(); 17136: 56 2f mov r21, r22 17138: 47 2f mov r20, r23 1713a: 38 2f mov r19, r24 1713c: 29 2f mov r18, r25 1713e: e6 cf rjmp .-52 ; 0x1710c if ((i == X_AXIS) || (i == Y_AXIS)) { if (val > NORMAL_MAX_ACCEL_XY) val = NORMAL_MAX_ACCEL_XY; if (val_silent > SILENT_MAX_ACCEL_XY) val_silent = SILENT_MAX_ACCEL_XY; 17140: 50 ec ldi r21, 0xC0 ; 192 17142: 43 e0 ldi r20, 0x03 ; 3 17144: 30 e0 ldi r19, 0x00 ; 0 17146: 20 e0 ldi r18, 0x00 ; 0 #ifdef TMC2130 unsigned long val_silent = val; if ((i == X_AXIS) || (i == Y_AXIS)) { if (val > NORMAL_MAX_ACCEL_XY) val = NORMAL_MAX_ACCEL_XY; 17148: 64 ec ldi r22, 0xC4 ; 196 1714a: 79 e0 ldi r23, 0x09 ; 9 1714c: 80 e0 ldi r24, 0x00 ; 0 1714e: 90 e0 ldi r25, 0x00 ; 0 17150: dd cf rjmp .-70 ; 0x1710c 17152: 3d ed ldi r19, 0xDD ; 221 17154: a3 2e mov r10, r19 17156: 32 e0 ldi r19, 0x02 ; 2 17158: b3 2e mov r11, r19 1715a: 4d eb ldi r20, 0xBD ; 189 1715c: c4 2e mov r12, r20 1715e: 4d e0 ldi r20, 0x0D ; 13 17160: d4 2e mov r13, r20 - `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++) 17162: 91 2c mov r9, r1 { if (code_seen(axis_codes[i])) 17164: f5 01 movw r30, r10 17166: 81 91 ld r24, Z+ 17168: 5f 01 movw r10, r30 1716a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1716e: 88 23 and r24, r24 17170: 71 f1 breq .+92 ; 0x171ce { float val = code_value(); 17172: 0e 94 35 60 call 0xc06a ; 0xc06a 17176: 7b 01 movw r14, r22 17178: 8c 01 movw r16, r24 #ifdef TMC2130 float val_silent = val; if ((i == X_AXIS) || (i == Y_AXIS)) 1717a: f1 e0 ldi r31, 0x01 ; 1 1717c: f9 15 cp r31, r9 1717e: b8 f1 brcs .+110 ; 0x171ee { if (val > NORMAL_MAX_FEEDRATE_XY) 17180: 20 e0 ldi r18, 0x00 ; 0 17182: 30 e0 ldi r19, 0x00 ; 0 17184: 48 e4 ldi r20, 0x48 ; 72 17186: 53 e4 ldi r21, 0x43 ; 67 17188: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1718c: 18 16 cp r1, r24 1718e: 44 f1 brlt .+80 ; 0x171e0 case 203: // M203 max feedrate mm/sec for (uint8_t i = 0; i < NUM_AXIS; i++) { if (code_seen(axis_codes[i])) { float val = code_value(); 17190: 5e 2c mov r5, r14 17192: 6f 2c mov r6, r15 17194: 70 2e mov r7, r16 17196: 81 2e mov r8, r17 float val_silent = val; if ((i == X_AXIS) || (i == Y_AXIS)) { if (val > NORMAL_MAX_FEEDRATE_XY) val = NORMAL_MAX_FEEDRATE_XY; if (val_silent > SILENT_MAX_FEEDRATE_XY) 17198: 20 e0 ldi r18, 0x00 ; 0 1719a: 30 e0 ldi r19, 0x00 ; 0 1719c: 48 ec ldi r20, 0xC8 ; 200 1719e: 52 e4 ldi r21, 0x42 ; 66 171a0: b7 01 movw r22, r14 171a2: c8 01 movw r24, r16 171a4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 171a8: 18 16 cp r1, r24 171aa: 34 f1 brlt .+76 ; 0x171f8 val_silent = SILENT_MAX_FEEDRATE_XY; } cs.max_feedrate_normal[i] = val; 171ac: 85 2d mov r24, r5 171ae: 96 2d mov r25, r6 171b0: a7 2d mov r26, r7 171b2: b8 2d mov r27, r8 171b4: f6 01 movw r30, r12 171b6: 84 8b std Z+20, r24 ; 0x14 171b8: 95 8b std Z+21, r25 ; 0x15 171ba: a6 8b std Z+22, r26 ; 0x16 171bc: b7 8b std Z+23, r27 ; 0x17 cs.max_feedrate_silent[i] = val_silent; 171be: c7 01 movw r24, r14 171c0: d8 01 movw r26, r16 171c2: e4 56 subi r30, 0x64 ; 100 171c4: ff 4f sbci r31, 0xFF ; 255 171c6: 80 83 st Z, r24 171c8: 91 83 std Z+1, r25 ; 0x01 171ca: a2 83 std Z+2, r26 ; 0x02 171cc: b3 83 std Z+3, r27 ; 0x03 - `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++) 171ce: 93 94 inc r9 171d0: f4 e0 ldi r31, 0x04 ; 4 171d2: cf 0e add r12, r31 171d4: d1 1c adc r13, r1 171d6: 24 e0 ldi r18, 0x04 ; 4 171d8: 92 12 cpse r9, r18 171da: c4 cf rjmp .-120 ; 0x17164 171dc: 0c 94 83 b0 jmp 0x16106 ; 0x16106 #ifdef TMC2130 float val_silent = val; if ((i == X_AXIS) || (i == Y_AXIS)) { if (val > NORMAL_MAX_FEEDRATE_XY) val = NORMAL_MAX_FEEDRATE_XY; 171e0: 51 2c mov r5, r1 171e2: 61 2c mov r6, r1 171e4: 98 e4 ldi r25, 0x48 ; 72 171e6: 79 2e mov r7, r25 171e8: 23 e4 ldi r18, 0x43 ; 67 171ea: 82 2e mov r8, r18 171ec: d5 cf rjmp .-86 ; 0x17198 case 203: // M203 max feedrate mm/sec for (uint8_t i = 0; i < NUM_AXIS; i++) { if (code_seen(axis_codes[i])) { float val = code_value(); 171ee: 56 2e mov r5, r22 171f0: 6f 2c mov r6, r15 171f2: 78 2e mov r7, r24 171f4: 81 2e mov r8, r17 171f6: da cf rjmp .-76 ; 0x171ac if ((i == X_AXIS) || (i == Y_AXIS)) { if (val > NORMAL_MAX_FEEDRATE_XY) val = NORMAL_MAX_FEEDRATE_XY; if (val_silent > SILENT_MAX_FEEDRATE_XY) val_silent = SILENT_MAX_FEEDRATE_XY; 171f8: e1 2c mov r14, r1 171fa: f1 2c mov r15, r1 171fc: 08 ec ldi r16, 0xC8 ; 200 171fe: 12 e4 ldi r17, 0x42 ; 66 17200: d5 cf rjmp .-86 ; 0x171ac // Interpret the T value as retract acceleration in the old Marlin format. if(code_seen('T')) cs.retract_acceleration = code_value(); } else { // New acceleration format, compatible with the upstream Marlin. if(code_seen('P')) 17202: 80 e5 ldi r24, 0x50 ; 80 17204: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17208: 88 23 and r24, r24 1720a: 51 f0 breq .+20 ; 0x17220 cs.acceleration = code_value(); 1720c: 0e 94 35 60 call 0xc06a ; 0xc06a 17210: 60 93 f1 0d sts 0x0DF1, r22 ; 0x800df1 17214: 70 93 f2 0d sts 0x0DF2, r23 ; 0x800df2 17218: 80 93 f3 0d sts 0x0DF3, r24 ; 0x800df3 1721c: 90 93 f4 0d sts 0x0DF4, r25 ; 0x800df4 if(code_seen('R')) 17220: 82 e5 ldi r24, 0x52 ; 82 17222: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17226: 88 23 and r24, r24 17228: 51 f0 breq .+20 ; 0x1723e cs.retract_acceleration = code_value(); 1722a: 0e 94 35 60 call 0xc06a ; 0xc06a 1722e: 60 93 f5 0d sts 0x0DF5, r22 ; 0x800df5 17232: 70 93 f6 0d sts 0x0DF6, r23 ; 0x800df6 17236: 80 93 f7 0d sts 0x0DF7, r24 ; 0x800df7 1723a: 90 93 f8 0d sts 0x0DF8, r25 ; 0x800df8 if(code_seen('T')) 1723e: 84 e5 ldi r24, 0x54 ; 84 17240: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17244: 88 23 and r24, r24 17246: 11 f4 brne .+4 ; 0x1724c 17248: 0c 94 83 b0 jmp 0x16106 ; 0x16106 cs.travel_acceleration = code_value(); 1724c: 0e 94 35 60 call 0xc06a ; 0xc06a 17250: 60 93 7d 0e sts 0x0E7D, r22 ; 0x800e7d 17254: 70 93 7e 0e sts 0x0E7E, r23 ; 0x800e7e 17258: 80 93 7f 0e sts 0x0E7F, r24 ; 0x800e7f 1725c: 90 93 80 0e sts 0x0E80, r25 ; 0x800e80 17260: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `Z` - Maximum Z jerk (units/s) - `E` - Maximum E jerk (units/s) */ case 205: { if(code_seen('S')) cs.minimumfeedrate = code_value(); 17264: 83 e5 ldi r24, 0x53 ; 83 17266: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1726a: 88 23 and r24, r24 1726c: 51 f0 breq .+20 ; 0x17282 1726e: 0e 94 35 60 call 0xc06a ; 0xc06a 17272: 60 93 f9 0d sts 0x0DF9, r22 ; 0x800df9 17276: 70 93 fa 0d sts 0x0DFA, r23 ; 0x800dfa 1727a: 80 93 fb 0d sts 0x0DFB, r24 ; 0x800dfb 1727e: 90 93 fc 0d sts 0x0DFC, r25 ; 0x800dfc if(code_seen('T')) cs.mintravelfeedrate = code_value(); 17282: 84 e5 ldi r24, 0x54 ; 84 17284: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17288: 88 23 and r24, r24 1728a: 51 f0 breq .+20 ; 0x172a0 1728c: 0e 94 35 60 call 0xc06a ; 0xc06a 17290: 60 93 fd 0d sts 0x0DFD, r22 ; 0x800dfd 17294: 70 93 fe 0d sts 0x0DFE, r23 ; 0x800dfe 17298: 80 93 ff 0d sts 0x0DFF, r24 ; 0x800dff 1729c: 90 93 00 0e sts 0x0E00, r25 ; 0x800e00 if(code_seen('B')) cs.min_segment_time_us = (uint32_t)code_value(); 172a0: 82 e4 ldi r24, 0x42 ; 66 172a2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 172a6: 88 23 and r24, r24 172a8: 61 f0 breq .+24 ; 0x172c2 172aa: 0e 94 35 60 call 0xc06a ; 0xc06a 172ae: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 172b2: 60 93 01 0e sts 0x0E01, r22 ; 0x800e01 172b6: 70 93 02 0e sts 0x0E02, r23 ; 0x800e02 172ba: 80 93 03 0e sts 0x0E03, r24 ; 0x800e03 172be: 90 93 04 0e sts 0x0E04, r25 ; 0x800e04 if(code_seen('X')) cs.max_jerk[X_AXIS] = cs.max_jerk[Y_AXIS] = code_value(); 172c2: 88 e5 ldi r24, 0x58 ; 88 172c4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 172c8: 88 23 and r24, r24 172ca: 91 f0 breq .+36 ; 0x172f0 172cc: 0e 94 35 60 call 0xc06a ; 0xc06a 172d0: 60 93 09 0e sts 0x0E09, r22 ; 0x800e09 172d4: 70 93 0a 0e sts 0x0E0A, r23 ; 0x800e0a 172d8: 80 93 0b 0e sts 0x0E0B, r24 ; 0x800e0b 172dc: 90 93 0c 0e sts 0x0E0C, r25 ; 0x800e0c 172e0: 60 93 05 0e sts 0x0E05, r22 ; 0x800e05 172e4: 70 93 06 0e sts 0x0E06, r23 ; 0x800e06 172e8: 80 93 07 0e sts 0x0E07, r24 ; 0x800e07 172ec: 90 93 08 0e sts 0x0E08, r25 ; 0x800e08 if(code_seen('Y')) cs.max_jerk[Y_AXIS] = code_value(); 172f0: 89 e5 ldi r24, 0x59 ; 89 172f2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 172f6: 88 23 and r24, r24 172f8: 51 f0 breq .+20 ; 0x1730e 172fa: 0e 94 35 60 call 0xc06a ; 0xc06a 172fe: 60 93 09 0e sts 0x0E09, r22 ; 0x800e09 17302: 70 93 0a 0e sts 0x0E0A, r23 ; 0x800e0a 17306: 80 93 0b 0e sts 0x0E0B, r24 ; 0x800e0b 1730a: 90 93 0c 0e sts 0x0E0C, r25 ; 0x800e0c if(code_seen('Z')) cs.max_jerk[Z_AXIS] = code_value(); 1730e: 8a e5 ldi r24, 0x5A ; 90 17310: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17314: 88 23 and r24, r24 17316: 51 f0 breq .+20 ; 0x1732c 17318: 0e 94 35 60 call 0xc06a ; 0xc06a 1731c: 60 93 0d 0e sts 0x0E0D, r22 ; 0x800e0d 17320: 70 93 0e 0e sts 0x0E0E, r23 ; 0x800e0e 17324: 80 93 0f 0e sts 0x0E0F, r24 ; 0x800e0f 17328: 90 93 10 0e sts 0x0E10, r25 ; 0x800e10 if(code_seen('E')) 1732c: 85 e4 ldi r24, 0x45 ; 69 1732e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17332: 88 23 and r24, r24 17334: 11 f4 brne .+4 ; 0x1733a 17336: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { float e = code_value(); 1733a: 0e 94 35 60 call 0xc06a ; 0xc06a #ifndef LA_NOCOMPAT e = la10c_jerk(e); 1733e: 0e 94 4a 81 call 0x10294 ; 0x10294 #endif cs.max_jerk[E_AXIS] = e; 17342: 60 93 11 0e sts 0x0E11, r22 ; 0x800e11 17346: 70 93 12 0e sts 0x0E12, r23 ; 0x800e12 1734a: 80 93 13 0e sts 0x0E13, r24 ; 0x800e13 1734e: 90 93 14 0e sts 0x0E14, r25 ; 0x800e14 17352: 0c 94 83 b0 jmp 0x16106 ; 0x16106 17356: 0d ed ldi r16, 0xDD ; 221 17358: 12 e0 ldi r17, 0x02 ; 2 1735a: 85 e1 ldi r24, 0x15 ; 21 1735c: e8 2e mov r14, r24 1735e: 8e e0 ldi r24, 0x0E ; 14 17360: f8 2e mov r15, r24 - `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(); 17362: d8 01 movw r26, r16 17364: 8d 91 ld r24, X+ 17366: 8d 01 movw r16, r26 17368: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1736c: 88 23 and r24, r24 1736e: 39 f0 breq .+14 ; 0x1737e 17370: 0e 94 35 60 call 0xc06a ; 0xc06a 17374: f7 01 movw r30, r14 17376: 60 83 st Z, r22 17378: 71 83 std Z+1, r23 ; 0x01 1737a: 82 83 std Z+2, r24 ; 0x02 1737c: 93 83 std Z+3, r25 ; 0x03 1737e: f4 e0 ldi r31, 0x04 ; 4 17380: ef 0e add r14, r31 17382: 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++) 17384: 22 e0 ldi r18, 0x02 ; 2 17386: 00 3e cpi r16, 0xE0 ; 224 17388: 12 07 cpc r17, r18 1738a: 59 f7 brne .-42 ; 0x17362 1738c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `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')) 17390: 83 e5 ldi r24, 0x53 ; 83 17392: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17396: 88 23 and r24, r24 17398: 51 f0 breq .+20 ; 0x173ae { cs.retract_recover_length = code_value() ; 1739a: 0e 94 35 60 call 0xc06a ; 0xc06a 1739e: 60 93 4c 0e sts 0x0E4C, r22 ; 0x800e4c 173a2: 70 93 4d 0e sts 0x0E4D, r23 ; 0x800e4d 173a6: 80 93 4e 0e sts 0x0E4E, r24 ; 0x800e4e 173aa: 90 93 4f 0e sts 0x0E4F, r25 ; 0x800e4f } if(code_seen('F')) 173ae: 86 e4 ldi r24, 0x46 ; 70 173b0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 173b4: 88 23 and r24, r24 173b6: 11 f4 brne .+4 ; 0x173bc 173b8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { cs.retract_recover_feedrate = get_feedrate_mm_s(code_value()); 173bc: 0e 94 35 60 call 0xc06a ; 0xc06a 173c0: 0e 94 5f 66 call 0xccbe ; 0xccbe 173c4: 60 93 50 0e sts 0x0E50, r22 ; 0x800e50 173c8: 70 93 51 0e sts 0x0E51, r23 ; 0x800e51 173cc: 80 93 52 0e sts 0x0E52, r24 ; 0x800e52 173d0: 90 93 53 0e sts 0x0E53, r25 ; 0x800e53 173d4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 #### 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')) 173d8: 83 e5 ldi r24, 0x53 ; 83 173da: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 173de: 88 23 and r24, r24 173e0: 11 f4 brne .+4 ; 0x173e6 173e2: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { switch(code_value_uint8()) 173e6: 0e 94 00 5b call 0xb600 ; 0xb600 173ea: 88 23 and r24, r24 173ec: c1 f0 breq .+48 ; 0x1741e 173ee: 81 30 cpi r24, 0x01 ; 1 173f0: e1 f0 breq .+56 ; 0x1742a #if EXTRUDERS > 2 retracted[2]=false; #endif }break; default: SERIAL_ECHO_START; 173f2: 82 ef ldi r24, 0xF2 ; 242 173f4: 9a ea ldi r25, 0xAA ; 170 173f6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); 173fa: 8b e5 ldi r24, 0x5B ; 91 173fc: 97 e6 ldi r25, 0x67 ; 103 173fe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); 17402: 80 91 91 12 lds r24, 0x1291 ; 0x801291 17406: 90 91 92 12 lds r25, 0x1292 ; 0x801292 1740a: 89 55 subi r24, 0x59 ; 89 1740c: 9f 4e sbci r25, 0xEF ; 239 1740e: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHOLNPGM("\"(1)"); 17412: 8a e2 ldi r24, 0x2A ; 42 17414: 96 e8 ldi r25, 0x86 ; 134 17416: 0e 94 13 79 call 0xf226 ; 0xf226 1741a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { switch(code_value_uint8()) { case 0: { cs.autoretract_enabled=false; 1741e: 10 92 3f 0e sts 0x0E3F, r1 ; 0x800e3f retracted[0]=false; 17422: 10 92 8d 06 sts 0x068D, r1 ; 0x80068d 17426: 0c 94 83 b0 jmp 0x16106 ; 0x16106 retracted[2]=false; #endif }break; case 1: { cs.autoretract_enabled=true; 1742a: 80 93 3f 0e sts 0x0E3F, r24 ; 0x800e3f retracted[0]=false; 1742e: 10 92 8d 06 sts 0x068D, r1 ; 0x80068d 17432: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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; 17436: 40 90 81 0e lds r4, 0x0E81 ; 0x800e81 1743a: 50 90 82 0e lds r5, 0x0E82 ; 0x800e82 1743e: 60 90 83 0e lds r6, 0x0E83 ; 0x800e83 17442: 70 90 84 0e lds r7, 0x0E84 ; 0x800e84 17446: 0c 94 26 a8 jmp 0x1504c ; 0x1504c float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment; 1744a: 80 90 85 0e lds r8, 0x0E85 ; 0x800e85 1744e: 90 90 86 0e lds r9, 0x0E86 ; 0x800e86 17452: a0 90 87 0e lds r10, 0x0E87 ; 0x800e87 17456: b0 90 88 0e lds r11, 0x0E88 ; 0x800e88 1745a: 0c 94 31 a8 jmp 0x15062 ; 0x15062 - `R` - Restore previous speed factor */ case 220: { bool codesWereSeen = false; if (code_seen('B')) //backup current speed factor 1745e: 82 e4 ldi r24, 0x42 ; 66 17460: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17464: 18 2f mov r17, r24 17466: 88 23 and r24, r24 17468: 41 f0 breq .+16 ; 0x1747a { saved_feedmultiply_mm = feedmultiply; 1746a: 80 91 39 02 lds r24, 0x0239 ; 0x800239 1746e: 90 91 3a 02 lds r25, 0x023A ; 0x80023a 17472: 90 93 2e 02 sts 0x022E, r25 ; 0x80022e 17476: 80 93 2d 02 sts 0x022D, r24 ; 0x80022d codesWereSeen = true; } if (code_seen('S')) 1747a: 83 e5 ldi r24, 0x53 ; 83 1747c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17480: 08 2f mov r16, r24 17482: 88 23 and r24, r24 17484: 39 f0 breq .+14 ; 0x17494 { feedmultiply = code_value_short(); 17486: 0e 94 0d 5b call 0xb61a ; 0xb61a 1748a: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a 1748e: 80 93 39 02 sts 0x0239, r24 ; 0x800239 codesWereSeen = true; 17492: 10 2f mov r17, r16 } if (code_seen('R')) //restore previous feedmultiply 17494: 82 e5 ldi r24, 0x52 ; 82 17496: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1749a: 88 23 and r24, r24 1749c: 51 f0 breq .+20 ; 0x174b2 { feedmultiply = saved_feedmultiply_mm; 1749e: 80 91 2d 02 lds r24, 0x022D ; 0x80022d 174a2: 90 91 2e 02 lds r25, 0x022E ; 0x80022e 174a6: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a 174aa: 80 93 39 02 sts 0x0239, r24 ; 0x800239 174ae: 0c 94 83 b0 jmp 0x16106 ; 0x16106 codesWereSeen = true; } if (!codesWereSeen) 174b2: 11 11 cpse r17, r1 174b4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { printf_P(PSTR("%i%%\n"), feedmultiply); 174b8: 80 91 3a 02 lds r24, 0x023A ; 0x80023a 174bc: 8f 93 push r24 174be: 80 91 39 02 lds r24, 0x0239 ; 0x800239 174c2: 8f 93 push r24 174c4: 84 e2 ldi r24, 0x24 ; 36 174c6: 96 e8 ldi r25, 0x86 ; 134 174c8: 9f 93 push r25 174ca: 8f 93 push r24 174cc: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 174d0: 0f 90 pop r0 174d2: 0f 90 pop r0 174d4: 0f 90 pop r0 174d6: 0f 90 pop r0 174d8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 extrudemultiply = code_value_short(); calculate_extruder_multipliers(); } else { printf_P(PSTR("%i%%\n"), extrudemultiply); 174dc: 80 91 bd 02 lds r24, 0x02BD ; 0x8002bd 174e0: 8f 93 push r24 174e2: 80 91 bc 02 lds r24, 0x02BC ; 0x8002bc 174e6: 8f 93 push r24 174e8: 8e e1 ldi r24, 0x1E ; 30 174ea: 96 e8 ldi r25, 0x86 ; 134 174ec: 9f 93 push r25 174ee: 8f 93 push r24 174f0: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 174f4: 0f 90 pop r0 174f6: 0f 90 pop r0 174f8: 0f 90 pop r0 174fa: 0f 90 pop r0 174fc: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `P` - pin number - `S` - pin state */ case 226: { if(code_seen('P')){ 17500: 80 e5 ldi r24, 0x50 ; 80 17502: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17506: 88 23 and r24, r24 17508: 11 f4 brne .+4 ; 0x1750e 1750a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 int pin_number = code_value_short(); // pin number 1750e: 0e 94 0d 5b call 0xb61a ; 0xb61a 17512: 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 17514: 83 e5 ldi r24, 0x53 ; 83 17516: 0e 94 6e 5b call 0xb6dc ; 0xb6dc */ case 226: { if(code_seen('P')){ int pin_number = code_value_short(); // pin number int pin_state = -1; // required pin state - default is inverted 1751a: 0f ef ldi r16, 0xFF ; 255 1751c: 1f ef ldi r17, 0xFF ; 255 if(code_seen('S')) pin_state = code_value_short(); // required pin state 1751e: 88 23 and r24, r24 17520: 19 f0 breq .+6 ; 0x17528 17522: 0e 94 0d 5b call 0xb61a ; 0xb61a 17526: 8c 01 movw r16, r24 if(pin_state >= -1 && pin_state <= 1){ 17528: c8 01 movw r24, r16 1752a: 01 96 adiw r24, 0x01 ; 1 1752c: 03 97 sbiw r24, 0x03 ; 3 1752e: 10 f0 brcs .+4 ; 0x17534 17530: 0c 94 83 b0 jmp 0x16106 ; 0x16106 17534: e2 e1 ldi r30, 0x12 ; 18 17536: f7 e8 ldi r31, 0x87 ; 135 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)) 17538: 84 91 lpm r24, Z 1753a: 08 2e mov r0, r24 1753c: 00 0c add r0, r0 1753e: 99 0b sbc r25, r25 17540: e8 16 cp r14, r24 17542: f9 06 cpc r15, r25 17544: 11 f4 brne .+4 ; 0x1754a 17546: 0c 94 83 b0 jmp 0x16106 ; 0x16106 1754a: 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++) 1754c: 37 e8 ldi r19, 0x87 ; 135 1754e: ee 32 cpi r30, 0x2E ; 46 17550: f3 07 cpc r31, r19 17552: 91 f7 brne .-28 ; 0x17538 pin_number = -1; break; } } if (pin_number > -1) 17554: f7 fe sbrs r15, 7 17556: 02 c0 rjmp .+4 ; 0x1755c 17558: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { int target = LOW; st_synchronize(); 1755c: 0f 94 a9 43 call 0x28752 ; 0x28752 pinMode(pin_number, INPUT); 17560: de 2c mov r13, r14 17562: 60 e0 ldi r22, 0x00 ; 0 17564: 8e 2d mov r24, r14 17566: 0e 94 9e e9 call 0x1d33c ; 0x1d33c switch(pin_state){ 1756a: 0f 3f cpi r16, 0xFF ; 255 1756c: 10 07 cpc r17, r16 1756e: b1 f0 breq .+44 ; 0x1759c 17570: 01 30 cpi r16, 0x01 ; 1 17572: 11 05 cpc r17, r1 17574: 11 f0 breq .+4 ; 0x1757a } } if (pin_number > -1) { int target = LOW; 17576: 10 e0 ldi r17, 0x00 ; 0 17578: 00 e0 ldi r16, 0x00 ; 0 case -1: target = !digitalRead(pin_number); break; } while(digitalRead(pin_number) != target){ 1757a: 8d 2d mov r24, r13 1757c: 0e 94 47 e9 call 0x1d28e ; 0x1d28e 17580: 80 17 cp r24, r16 17582: 91 07 cpc r25, r17 17584: 11 f4 brne .+4 ; 0x1758a 17586: 0c 94 83 b0 jmp 0x16106 ; 0x16106 manage_heater(); 1758a: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 1758e: 80 e0 ldi r24, 0x00 ; 0 17590: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 17594: 80 e0 ldi r24, 0x00 ; 0 17596: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 1759a: ef cf rjmp .-34 ; 0x1757a case 0: target = LOW; break; case -1: target = !digitalRead(pin_number); 1759c: 8e 2d mov r24, r14 1759e: 0e 94 47 e9 call 0x1d28e ; 0x1d28e 175a2: 31 e0 ldi r19, 0x01 ; 1 175a4: 20 e0 ldi r18, 0x00 ; 0 175a6: 89 2b or r24, r25 175a8: 09 f0 breq .+2 ; 0x175ac 175aa: 30 e0 ldi r19, 0x00 ; 0 175ac: 03 2f mov r16, r19 175ae: 12 2f mov r17, r18 175b0: e4 cf rjmp .-56 ; 0x1757a - `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; 175b2: 80 e5 ldi r24, 0x50 ; 80 175b4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 175b8: 08 ee ldi r16, 0xE8 ; 232 175ba: 13 e0 ldi r17, 0x03 ; 3 175bc: 88 23 and r24, r24 175be: 89 f0 breq .+34 ; 0x175e2 175c0: 0e 94 35 60 call 0xc06a ; 0xc06a 175c4: 20 e0 ldi r18, 0x00 ; 0 175c6: 30 ec ldi r19, 0xC0 ; 192 175c8: 4a e5 ldi r20, 0x5A ; 90 175ca: 55 e4 ldi r21, 0x45 ; 69 175cc: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 175d0: 0c ea ldi r16, 0xAC ; 172 175d2: 1d e0 ldi r17, 0x0D ; 13 175d4: 87 ff sbrs r24, 7 175d6: 05 c0 rjmp .+10 ; 0x175e2 175d8: 0e 94 35 60 call 0xc06a ; 0xc06a 175dc: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 175e0: 8b 01 movw r16, r22 uint16_t beepS; if (!code_seen('S')) 175e2: 83 e5 ldi r24, 0x53 ; 83 175e4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 175e8: 88 23 and r24, r24 175ea: 71 f0 breq .+28 ; 0x17608 beepS = 0; else { beepS = code_value(); 175ec: 0e 94 35 60 call 0xc06a ; 0xc06a 175f0: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> if (!beepS) { 175f4: 61 15 cp r22, r1 175f6: 71 05 cpc r23, r1 175f8: 49 f4 brne .+18 ; 0x1760c // handle S0 as a pause _delay(beepP); 175fa: b8 01 movw r22, r16 175fc: 90 e0 ldi r25, 0x00 ; 0 175fe: 80 e0 ldi r24, 0x00 ; 0 17600: 0f 94 2f 28 call 0x2505e ; 0x2505e 17604: 0c 94 83 b0 jmp 0x16106 ; 0x16106 case 300: // M300 { uint16_t beepP = code_seen('P') ? min(code_value(), 3500) : 1000; uint16_t beepS; if (!code_seen('S')) beepS = 0; 17608: 70 e0 ldi r23, 0x00 ; 0 1760a: 60 e0 ldi r22, 0x00 ; 0 // handle S0 as a pause _delay(beepP); break; } } Sound_MakeCustom(beepP, beepS, false); 1760c: 40 e0 ldi r20, 0x00 ; 0 1760e: c8 01 movw r24, r16 17610: 0f 94 3d 52 call 0x2a47a ; 0x2a47a 17614: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `I` - integral (Ki) - `D` - derivative (Kd) */ case 304: { if(code_seen('P')) cs.bedKp = code_value(); 17618: 80 e5 ldi r24, 0x50 ; 80 1761a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1761e: 88 23 and r24, r24 17620: 51 f0 breq .+20 ; 0x17636 17622: 0e 94 35 60 call 0xc06a ; 0xc06a 17626: 60 93 31 0e sts 0x0E31, r22 ; 0x800e31 1762a: 70 93 32 0e sts 0x0E32, r23 ; 0x800e32 1762e: 80 93 33 0e sts 0x0E33, r24 ; 0x800e33 17632: 90 93 34 0e sts 0x0E34, r25 ; 0x800e34 if(code_seen('I')) cs.bedKi = scalePID_i(code_value()); 17636: 89 e4 ldi r24, 0x49 ; 73 17638: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1763c: 88 23 and r24, r24 1763e: 81 f0 breq .+32 ; 0x17660 17640: 0e 94 35 60 call 0xc06a ; 0xc06a #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 17644: 2c ea ldi r18, 0xAC ; 172 17646: 35 ec ldi r19, 0xC5 ; 197 17648: 47 e2 ldi r20, 0x27 ; 39 1764a: 5e e3 ldi r21, 0x3E ; 62 1764c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 17650: 60 93 35 0e sts 0x0E35, r22 ; 0x800e35 17654: 70 93 36 0e sts 0x0E36, r23 ; 0x800e36 17658: 80 93 37 0e sts 0x0E37, r24 ; 0x800e37 1765c: 90 93 38 0e sts 0x0E38, r25 ; 0x800e38 if(code_seen('D')) cs.bedKd = scalePID_d(code_value()); 17660: 84 e4 ldi r24, 0x44 ; 68 17662: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17666: 88 23 and r24, r24 17668: 81 f0 breq .+32 ; 0x1768a 1766a: 0e 94 35 60 call 0xc06a ; 0xc06a } float unscalePID_i(float i) { return i/PID_dT; 1766e: 2c ea ldi r18, 0xAC ; 172 17670: 35 ec ldi r19, 0xC5 ; 197 17672: 47 e2 ldi r20, 0x27 ; 39 17674: 5e e3 ldi r21, 0x3E ; 62 17676: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1767a: 60 93 39 0e sts 0x0E39, r22 ; 0x800e39 1767e: 70 93 3a 0e sts 0x0E3A, r23 ; 0x800e3a 17682: 80 93 3b 0e sts 0x0E3B, r24 ; 0x800e3b 17686: 90 93 3c 0e sts 0x0E3C, r25 ; 0x800e3c updatePID(); 1768a: 0f 94 ab 3b call 0x27756 ; 0x27756 SERIAL_PROTOCOLRPGM(MSG_OK); 1768e: 81 e5 ldi r24, 0x51 ; 81 17690: 9d e6 ldi r25, 0x6D ; 109 17692: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLPGM(" p:"); 17696: 8e e0 ldi r24, 0x0E ; 14 17698: 96 e8 ldi r25, 0x86 ; 134 1769a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 1769e: 60 91 31 0e lds r22, 0x0E31 ; 0x800e31 176a2: 70 91 32 0e lds r23, 0x0E32 ; 0x800e32 176a6: 80 91 33 0e lds r24, 0x0E33 ; 0x800e33 176aa: 90 91 34 0e lds r25, 0x0E34 ; 0x800e34 176ae: 42 e0 ldi r20, 0x02 ; 2 176b0: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(cs.bedKp); SERIAL_PROTOCOLPGM(" i:"); 176b4: 8a e0 ldi r24, 0x0A ; 10 176b6: 96 e8 ldi r25, 0x86 ; 134 176b8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 176bc: 2c ea ldi r18, 0xAC ; 172 176be: 35 ec ldi r19, 0xC5 ; 197 176c0: 47 e2 ldi r20, 0x27 ; 39 176c2: 5e e3 ldi r21, 0x3E ; 62 176c4: 60 91 35 0e lds r22, 0x0E35 ; 0x800e35 176c8: 70 91 36 0e lds r23, 0x0E36 ; 0x800e36 176cc: 80 91 37 0e lds r24, 0x0E37 ; 0x800e37 176d0: 90 91 38 0e lds r25, 0x0E38 ; 0x800e38 176d4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 176d8: 42 e0 ldi r20, 0x02 ; 2 176da: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL(unscalePID_i(cs.bedKi)); SERIAL_PROTOCOLPGM(" d:"); 176de: 86 e0 ldi r24, 0x06 ; 6 176e0: 96 e8 ldi r25, 0x86 ; 134 176e2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 #ifdef PIDTEMP // Apply the scale factors to the PID values float scalePID_i(float i) { return i*PID_dT; 176e6: 2c ea ldi r18, 0xAC ; 172 176e8: 35 ec ldi r19, 0xC5 ; 197 176ea: 47 e2 ldi r20, 0x27 ; 39 176ec: 5e e3 ldi r21, 0x3E ; 62 176ee: 60 91 39 0e lds r22, 0x0E39 ; 0x800e39 176f2: 70 91 3a 0e lds r23, 0x0E3A ; 0x800e3a 176f6: 80 91 3b 0e lds r24, 0x0E3B ; 0x800e3b 176fa: 90 91 3c 0e lds r25, 0x0E3C ; 0x800e3c 176fe: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> SERIAL_PROTOCOLLN(unscalePID_d(cs.bedKd)); 17702: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 17706: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `T` - Brightness timeout (15 - 900), default 15 seconds */ #ifdef LCD_BL_PIN case 256: { if (backlightSupport) { 1770a: 80 91 01 04 lds r24, 0x0401 ; 0x800401 1770e: 88 23 and r24, r24 17710: 11 f4 brne .+4 ; 0x17716 17712: 0c 94 83 b0 jmp 0x16106 ; 0x16106 if (code_seen('B') ) backlightLevel_HIGH = code_value_uint8(); 17716: 82 e4 ldi r24, 0x42 ; 66 17718: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1771c: 88 23 and r24, r24 1771e: 21 f0 breq .+8 ; 0x17728 17720: 0e 94 00 5b call 0xb600 ; 0xb600 17724: 80 93 00 04 sts 0x0400, r24 ; 0x800400 if (code_seen('D')) backlightLevel_LOW = code_value_uint8(); 17728: 84 e4 ldi r24, 0x44 ; 68 1772a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1772e: 88 23 and r24, r24 17730: 21 f0 breq .+8 ; 0x1773a 17732: 0e 94 00 5b call 0xb600 ; 0xb600 17736: 80 93 ff 03 sts 0x03FF, r24 ; 0x8003ff if (code_seen('S')) { 1773a: 83 e5 ldi r24, 0x53 ; 83 1773c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17740: 88 23 and r24, r24 17742: 31 f0 breq .+12 ; 0x17750 uint8_t mode = code_value_uint8(); 17744: 0e 94 00 5b call 0xb600 ; 0xb600 if (mode <= BACKLIGHT_MODE_AUTO) { 17748: 83 30 cpi r24, 0x03 ; 3 1774a: 10 f4 brcc .+4 ; 0x17750 backlightMode = static_cast(mode); 1774c: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f } } if (code_seen('T')) backlightTimer_period = constrain(code_value_short(), LCD_BACKLIGHT_TIMEOUT, LCD_BACKLIGHT_TIMEOUT*60); 17750: 84 e5 ldi r24, 0x54 ; 84 17752: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 17756: 88 23 and r24, r24 17758: 79 f0 breq .+30 ; 0x17778 1775a: 0e 94 0d 5b call 0xb61a ; 0xb61a 1775e: 0f 97 sbiw r24, 0x0f ; 15 17760: 64 f1 brlt .+88 ; 0x177ba 17762: 0e 94 0d 5b call 0xb61a ; 0xb61a 17766: 85 38 cpi r24, 0x85 ; 133 17768: 93 40 sbci r25, 0x03 ; 3 1776a: 54 f5 brge .+84 ; 0x177c0 1776c: 0e 94 0d 5b call 0xb61a ; 0xb61a 17770: 90 93 4e 02 sts 0x024E, r25 ; 0x80024e 17774: 80 93 4d 02 sts 0x024D, r24 ; 0x80024d printf_P(PSTR("M256 B%d D%d S%d T%u\n"), backlightLevel_HIGH, backlightLevel_LOW, backlightMode, backlightTimer_period); 17778: 80 91 4e 02 lds r24, 0x024E ; 0x80024e 1777c: 8f 93 push r24 1777e: 80 91 4d 02 lds r24, 0x024D ; 0x80024d 17782: 8f 93 push r24 17784: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 17788: 1f 92 push r1 1778a: 8f 93 push r24 1778c: 80 91 ff 03 lds r24, 0x03FF ; 0x8003ff 17790: 1f 92 push r1 17792: 8f 93 push r24 17794: 80 91 00 04 lds r24, 0x0400 ; 0x800400 17798: 1f 92 push r1 1779a: 8f 93 push r24 1779c: 80 ef ldi r24, 0xF0 ; 240 1779e: 95 e8 ldi r25, 0x85 ; 133 177a0: 9f 93 push r25 177a2: 8f 93 push r24 177a4: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 backlight_save(); 177a8: 0e 94 cf 89 call 0x1139e ; 0x1139e 177ac: 0f b6 in r0, 0x3f ; 63 177ae: f8 94 cli 177b0: de bf out 0x3e, r29 ; 62 177b2: 0f be out 0x3f, r0 ; 63 177b4: cd bf out 0x3d, r28 ; 61 177b6: 0c 94 83 b0 jmp 0x16106 ; 0x16106 uint8_t mode = code_value_uint8(); if (mode <= BACKLIGHT_MODE_AUTO) { backlightMode = static_cast(mode); } } if (code_seen('T')) backlightTimer_period = constrain(code_value_short(), LCD_BACKLIGHT_TIMEOUT, LCD_BACKLIGHT_TIMEOUT*60); 177ba: 8f e0 ldi r24, 0x0F ; 15 177bc: 90 e0 ldi r25, 0x00 ; 0 177be: d8 cf rjmp .-80 ; 0x17770 177c0: 84 e8 ldi r24, 0x84 ; 132 177c2: 93 e0 ldi r25, 0x03 ; 3 177c4: d5 cf rjmp .-86 ; 0x17770 - `S` - Cold extrude minimum temperature */ case 302: { int temp = 0; if (code_seen('S')) temp=code_value_short(); 177c6: 83 e5 ldi r24, 0x53 ; 83 177c8: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 177cc: 88 23 and r24, r24 177ce: 41 f0 breq .+16 ; 0x177e0 177d0: 0e 94 0d 5b call 0xb61a ; 0xb61a } #ifdef PREVENT_DANGEROUS_EXTRUDE void set_extrude_min_temp(int temp) { extrude_min_temp = temp; 177d4: 90 93 6c 02 sts 0x026C, r25 ; 0x80026c 177d8: 80 93 6b 02 sts 0x026B, r24 ; 0x80026b 177dc: 0c 94 83 b0 jmp 0x16106 ; 0x16106 #### Parameters - `S` - Cold extrude minimum temperature */ case 302: { int temp = 0; 177e0: 90 e0 ldi r25, 0x00 ; 0 177e2: 80 e0 ldi r24, 0x00 ; 0 177e4: f7 cf rjmp .-18 ; 0x177d4 case 303: { float temp = 150.0; int e = 0; int c = 5; if (code_seen('E')) e = code_value_short(); 177e6: 85 e4 ldi r24, 0x45 ; 69 177e8: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `C` - Cycles, default `5` */ case 303: { float temp = 150.0; int e = 0; 177ec: 10 e0 ldi r17, 0x00 ; 0 177ee: 00 e0 ldi r16, 0x00 ; 0 int c = 5; if (code_seen('E')) e = code_value_short(); 177f0: 88 23 and r24, r24 177f2: 59 f0 breq .+22 ; 0x1780a 177f4: 0e 94 0d 5b call 0xb61a ; 0xb61a 177f8: 8c 01 movw r16, r24 if (e < 0) temp = 70; 177fa: c1 2c mov r12, r1 177fc: d1 2c mov r13, r1 177fe: ac e8 ldi r26, 0x8C ; 140 17800: ea 2e mov r14, r26 17802: a2 e4 ldi r26, 0x42 ; 66 17804: fa 2e mov r15, r26 { float temp = 150.0; int e = 0; int c = 5; if (code_seen('E')) e = code_value_short(); if (e < 0) 17806: 97 fd sbrc r25, 7 17808: 06 c0 rjmp .+12 ; 0x17816 - `S` - Target temperature, default `210°C` for hotend, 70 for bed - `C` - Cycles, default `5` */ case 303: { float temp = 150.0; 1780a: c1 2c mov r12, r1 1780c: d1 2c mov r13, r1 1780e: b6 e1 ldi r27, 0x16 ; 22 17810: eb 2e mov r14, r27 17812: b3 e4 ldi r27, 0x43 ; 67 17814: fb 2e mov r15, r27 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(); 17816: 83 e5 ldi r24, 0x53 ; 83 17818: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1781c: 88 23 and r24, r24 1781e: 21 f0 breq .+8 ; 0x17828 17820: 0e 94 35 60 call 0xc06a ; 0xc06a 17824: 6b 01 movw r12, r22 17826: 7c 01 movw r14, r24 if (code_seen('C')) c = code_value_short(); 17828: 83 e4 ldi r24, 0x43 ; 67 1782a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1782e: 88 23 and r24, r24 17830: 51 f0 breq .+20 ; 0x17846 17832: 0e 94 0d 5b call 0xb61a ; 0xb61a PID_autotune(temp, e, c); 17836: 9c 01 movw r18, r24 17838: a8 01 movw r20, r16 1783a: c7 01 movw r24, r14 1783c: b6 01 movw r22, r12 1783e: 0f 94 d8 3b call 0x277b0 ; 0x277b0 17842: 0c 94 83 b0 jmp 0x16106 ; 0x16106 */ case 303: { float temp = 150.0; int e = 0; int c = 5; 17846: 85 e0 ldi r24, 0x05 ; 5 17848: 90 e0 ldi r25, 0x00 ; 0 1784a: f5 cf rjmp .-22 ; 0x17836 */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; int8_t I = -1, S = -1, B = -1, F = -1; 1784c: 9f ef ldi r25, 0xFF ; 255 1784e: ab 96 adiw r28, 0x2b ; 43 17850: 9f af std Y+63, r25 ; 0x3f 17852: ab 97 sbiw r28, 0x2b ; 43 17854: 0c 94 5c a9 jmp 0x152b8 ; 0x152b8 - `F` - force model self-test state (0=off 1=on) during autotune using current values */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; 17858: 20 e0 ldi r18, 0x00 ; 0 1785a: 30 e0 ldi r19, 0x00 ; 0 1785c: 40 ec ldi r20, 0xC0 ; 192 1785e: 5f e7 ldi r21, 0x7F ; 127 17860: e2 96 adiw r28, 0x32 ; 50 17862: 2c af std Y+60, r18 ; 0x3c 17864: 3d af std Y+61, r19 ; 0x3d 17866: 4e af std Y+62, r20 ; 0x3e 17868: 5f af std Y+63, r21 ; 0x3f 1786a: e2 97 sbiw r28, 0x32 ; 50 1786c: 0c 94 6b a9 jmp 0x152d6 ; 0x152d6 17870: 80 e0 ldi r24, 0x00 ; 0 17872: 90 e0 ldi r25, 0x00 ; 0 17874: a0 ec ldi r26, 0xC0 ; 192 17876: bf e7 ldi r27, 0x7F ; 127 17878: 6e 96 adiw r28, 0x1e ; 30 1787a: 8c af std Y+60, r24 ; 0x3c 1787c: 9d af std Y+61, r25 ; 0x3d 1787e: ae af std Y+62, r26 ; 0x3e 17880: bf af std Y+63, r27 ; 0x3f 17882: 6e 97 sbiw r28, 0x1e ; 30 17884: 0c 94 89 a9 jmp 0x15312 ; 0x15312 17888: 20 e0 ldi r18, 0x00 ; 0 1788a: 30 e0 ldi r19, 0x00 ; 0 1788c: 40 ec ldi r20, 0xC0 ; 192 1788e: 5f e7 ldi r21, 0x7F ; 127 17890: a2 96 adiw r28, 0x22 ; 34 17892: 2c af std Y+60, r18 ; 0x3c 17894: 3d af std Y+61, r19 ; 0x3d 17896: 4e af std Y+62, r20 ; 0x3e 17898: 5f af std Y+63, r21 ; 0x3f 1789a: a2 97 sbiw r28, 0x22 ; 34 1789c: 0c 94 98 a9 jmp 0x15330 ; 0x15330 178a0: 80 e0 ldi r24, 0x00 ; 0 178a2: 90 e0 ldi r25, 0x00 ; 0 178a4: a0 ec ldi r26, 0xC0 ; 192 178a6: bf e7 ldi r27, 0x7F ; 127 178a8: 6a 96 adiw r28, 0x1a ; 26 178aa: 8c af std Y+60, r24 ; 0x3c 178ac: 9d af std Y+61, r25 ; 0x3d 178ae: ae af std Y+62, r26 ; 0x3e 178b0: bf af std Y+63, r27 ; 0x3f 178b2: 6a 97 sbiw r28, 0x1a ; 26 178b4: 0c 94 a7 a9 jmp 0x1534e ; 0x1534e 178b8: 20 e0 ldi r18, 0x00 ; 0 178ba: 30 e0 ldi r19, 0x00 ; 0 178bc: 40 ec ldi r20, 0xC0 ; 192 178be: 5f e7 ldi r21, 0x7F ; 127 178c0: aa 96 adiw r28, 0x2a ; 42 178c2: 2c af std Y+60, r18 ; 0x3c 178c4: 3d af std Y+61, r19 ; 0x3d 178c6: 4e af std Y+62, r20 ; 0x3e 178c8: 5f af std Y+63, r21 ; 0x3f 178ca: aa 97 sbiw r28, 0x2a ; 42 178cc: 0c 94 b6 a9 jmp 0x1536c ; 0x1536c int8_t I = -1, S = -1, B = -1, F = -1; 178d0: 3f ef ldi r19, 0xFF ; 255 178d2: e3 96 adiw r28, 0x33 ; 51 178d4: 3f af std Y+63, r19 ; 0x3f 178d6: e3 97 sbiw r28, 0x33 ; 51 178d8: 0c 94 cc a9 jmp 0x15398 ; 0x15398 178dc: 4f ef ldi r20, 0xFF ; 255 178de: e7 96 adiw r28, 0x37 ; 55 178e0: 4f af std Y+63, r20 ; 0x3f 178e2: e7 97 sbiw r28, 0x37 ; 55 178e4: 0c 94 d8 a9 jmp 0x153b0 ; 0x153b0 - `F` - force model self-test state (0=off 1=on) during autotune using current values */ case 310: { // parse all parameters float R = NAN, P = NAN, U = NAN, V = NAN, C = NAN, D = NAN, T = NAN, W = NAN, E = NAN; 178e8: 80 e0 ldi r24, 0x00 ; 0 178ea: 90 e0 ldi r25, 0x00 ; 0 178ec: a0 ec ldi r26, 0xC0 ; 192 178ee: bf e7 ldi r27, 0x7F ; 127 178f0: a6 96 adiw r28, 0x26 ; 38 178f2: 8c af std Y+60, r24 ; 0x3c 178f4: 9d af std Y+61, r25 ; 0x3d 178f6: ae af std Y+62, r26 ; 0x3e 178f8: bf af std Y+63, r27 ; 0x3f 178fa: a6 97 sbiw r28, 0x26 ; 38 178fc: 0c 94 e7 a9 jmp 0x153ce ; 0x153ce int8_t I = -1, S = -1, B = -1, F = -1; 17900: 9f ef ldi r25, 0xFF ; 255 17902: eb 96 adiw r28, 0x3b ; 59 17904: 9f af std Y+63, r25 ; 0x3f 17906: eb 97 sbiw r28, 0x3b ; 59 17908: 0c 94 1c aa jmp 0x15438 ; 0x15438 if(code_seen('F')) F = code_value_short(); // report values if nothing has been requested if(isnan(R) && isnan(P) && isnan(U) && isnan(V) && isnan(C) && isnan(D) && isnan(T) && isnan(W) && isnan(E) && I < 0 && S < 0 && B < 0 && A < 0 && L < 0) { thermal_model_report_settings(); 1790c: 0f 94 9d 2e call 0x25d3a ; 0x25d3a 17910: 0c 94 83 b0 jmp 0x16106 ; 0x16106 break; } // update all parameters if(B >= 0) 17914: e7 96 adiw r28, 0x37 ; 55 17916: ff ad ldd r31, Y+63 ; 0x3f 17918: e7 97 sbiw r28, 0x37 ; 55 1791a: f7 fd sbrc r31, 7 1791c: 09 c0 rjmp .+18 ; 0x17930 thermal_model_set_warn_beep(B); 1791e: 81 e0 ldi r24, 0x01 ; 1 17920: e7 96 adiw r28, 0x37 ; 55 17922: 2f ad ldd r18, Y+63 ; 0x3f 17924: e7 97 sbiw r28, 0x37 ; 55 17926: 21 11 cpse r18, r1 17928: 01 c0 rjmp .+2 ; 0x1792c 1792a: 80 e0 ldi r24, 0x00 ; 0 SERIAL_ECHOLNPGM("TM: invalid parameters, cannot enable"); } void thermal_model_set_warn_beep(bool enabled) { thermal_model::warn_beep = enabled; 1792c: 80 93 3d 02 sts 0x023D, r24 ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> if(!isnan(P) || !isnan(U) || !isnan(V) || !isnan(C) || !isnan(D) || (L >= 0) || !isnan(T) || !isnan(W) || !isnan(E)) 17930: a7 01 movw r20, r14 17932: 96 01 movw r18, r12 17934: c7 01 movw r24, r14 17936: b6 01 movw r22, r12 17938: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1793c: 88 23 and r24, r24 1793e: 11 f4 brne .+4 ; 0x17944 17940: 0c 94 ab aa jmp 0x15556 ; 0x15556 17944: 6e 96 adiw r28, 0x1e ; 30 17946: 2c ad ldd r18, Y+60 ; 0x3c 17948: 3d ad ldd r19, Y+61 ; 0x3d 1794a: 4e ad ldd r20, Y+62 ; 0x3e 1794c: 5f ad ldd r21, Y+63 ; 0x3f 1794e: 6e 97 sbiw r28, 0x1e ; 30 17950: ca 01 movw r24, r20 17952: b9 01 movw r22, r18 17954: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17958: 88 23 and r24, r24 1795a: 11 f4 brne .+4 ; 0x17960 1795c: 0c 94 ab aa jmp 0x15556 ; 0x15556 17960: a2 96 adiw r28, 0x22 ; 34 17962: 2c ad ldd r18, Y+60 ; 0x3c 17964: 3d ad ldd r19, Y+61 ; 0x3d 17966: 4e ad ldd r20, Y+62 ; 0x3e 17968: 5f ad ldd r21, Y+63 ; 0x3f 1796a: a2 97 sbiw r28, 0x22 ; 34 1796c: ca 01 movw r24, r20 1796e: b9 01 movw r22, r18 17970: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17974: 88 23 and r24, r24 17976: 11 f4 brne .+4 ; 0x1797c 17978: 0c 94 ab aa jmp 0x15556 ; 0x15556 1797c: 6a 96 adiw r28, 0x1a ; 26 1797e: 2c ad ldd r18, Y+60 ; 0x3c 17980: 3d ad ldd r19, Y+61 ; 0x3d 17982: 4e ad ldd r20, Y+62 ; 0x3e 17984: 5f ad ldd r21, Y+63 ; 0x3f 17986: 6a 97 sbiw r28, 0x1a ; 26 17988: ca 01 movw r24, r20 1798a: b9 01 movw r22, r18 1798c: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17990: 88 23 and r24, r24 17992: 11 f4 brne .+4 ; 0x17998 17994: 0c 94 ab aa jmp 0x15556 ; 0x15556 17998: aa 96 adiw r28, 0x2a ; 42 1799a: 2c ad ldd r18, Y+60 ; 0x3c 1799c: 3d ad ldd r19, Y+61 ; 0x3d 1799e: 4e ad ldd r20, Y+62 ; 0x3e 179a0: 5f ad ldd r21, Y+63 ; 0x3f 179a2: aa 97 sbiw r28, 0x2a ; 42 179a4: ca 01 movw r24, r20 179a6: b9 01 movw r22, r18 179a8: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 179ac: 88 23 and r24, r24 179ae: 11 f4 brne .+4 ; 0x179b4 179b0: 0c 94 ab aa jmp 0x15556 ; 0x15556 179b4: 17 fd sbrc r17, 7 179b6: 02 c0 rjmp .+4 ; 0x179bc 179b8: 0c 94 75 cd jmp 0x19aea ; 0x19aea 179bc: a6 96 adiw r28, 0x26 ; 38 179be: 2c ad ldd r18, Y+60 ; 0x3c 179c0: 3d ad ldd r19, Y+61 ; 0x3d 179c2: 4e ad ldd r20, Y+62 ; 0x3e 179c4: 5f ad ldd r21, Y+63 ; 0x3f 179c6: a6 97 sbiw r28, 0x26 ; 38 179c8: ca 01 movw r24, r20 179ca: b9 01 movw r22, r18 179cc: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 179d0: 88 23 and r24, r24 179d2: 11 f4 brne .+4 ; 0x179d8 179d4: 0c 94 ab aa jmp 0x15556 ; 0x15556 179d8: a5 01 movw r20, r10 179da: 94 01 movw r18, r8 179dc: c5 01 movw r24, r10 179de: b4 01 movw r22, r8 179e0: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 179e4: 88 23 and r24, r24 179e6: 11 f4 brne .+4 ; 0x179ec 179e8: 0c 94 ab aa jmp 0x15556 ; 0x15556 179ec: a3 01 movw r20, r6 179ee: 92 01 movw r18, r4 179f0: c3 01 movw r24, r6 179f2: b2 01 movw r22, r4 179f4: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 179f8: 88 23 and r24, r24 179fa: 11 f4 brne .+4 ; 0x17a00 179fc: 0c 94 ab aa jmp 0x15556 ; 0x15556 thermal_model_set_params(P, U, V, C, D, L, T, W, E); if(I >= 0 && !isnan(R)) 17a00: ab 96 adiw r28, 0x2b ; 43 17a02: 9f ad ldd r25, Y+63 ; 0x3f 17a04: ab 97 sbiw r28, 0x2b ; 43 17a06: 97 fd sbrc r25, 7 17a08: 3b c0 rjmp .+118 ; 0x17a80 17a0a: e2 96 adiw r28, 0x32 ; 50 17a0c: 2c ad ldd r18, Y+60 ; 0x3c 17a0e: 3d ad ldd r19, Y+61 ; 0x3d 17a10: 4e ad ldd r20, Y+62 ; 0x3e 17a12: 5f ad ldd r21, Y+63 ; 0x3f 17a14: e2 97 sbiw r28, 0x32 ; 50 17a16: ca 01 movw r24, r20 17a18: b9 01 movw r22, r18 17a1a: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17a1e: 81 11 cpse r24, r1 17a20: 2f c0 rjmp .+94 ; 0x17a80 thermal_model::setup(); } void thermal_model_set_resistance(uint8_t index, float R) { if(index >= THERMAL_MODEL_R_SIZE || R <= 0) 17a22: ab 96 adiw r28, 0x2b ; 43 17a24: af ad ldd r26, Y+63 ; 0x3f 17a26: ab 97 sbiw r28, 0x2b ; 43 17a28: a0 31 cpi r26, 0x10 ; 16 17a2a: 54 f5 brge .+84 ; 0x17a80 17a2c: 20 e0 ldi r18, 0x00 ; 0 17a2e: 30 e0 ldi r19, 0x00 ; 0 17a30: a9 01 movw r20, r18 17a32: e2 96 adiw r28, 0x32 ; 50 17a34: 6c ad ldd r22, Y+60 ; 0x3c 17a36: 7d ad ldd r23, Y+61 ; 0x3d 17a38: 8e ad ldd r24, Y+62 ; 0x3e 17a3a: 9f ad ldd r25, Y+63 ; 0x3f 17a3c: e2 97 sbiw r28, 0x32 ; 50 17a3e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 17a42: 18 16 cp r1, r24 17a44: ec f4 brge .+58 ; 0x17a80 return; TempMgrGuard temp_mgr_guard; 17a46: ce 01 movw r24, r28 17a48: 01 96 adiw r24, 0x01 ; 1 17a4a: 0f 94 76 32 call 0x264ec ; 0x264ec thermal_model::data.R[index] = R; 17a4e: ab 96 adiw r28, 0x2b ; 43 17a50: bf ad ldd r27, Y+63 ; 0x3f 17a52: ab 97 sbiw r28, 0x2b ; 43 17a54: 24 e0 ldi r18, 0x04 ; 4 17a56: b2 02 muls r27, r18 17a58: f0 01 movw r30, r0 17a5a: 11 24 eor r1, r1 17a5c: e1 51 subi r30, 0x11 ; 17 17a5e: fd 4e sbci r31, 0xED ; 237 17a60: e2 96 adiw r28, 0x32 ; 50 17a62: 8c ad ldd r24, Y+60 ; 0x3c 17a64: 9d ad ldd r25, Y+61 ; 0x3d 17a66: ae ad ldd r26, Y+62 ; 0x3e 17a68: bf ad ldd r27, Y+63 ; 0x3f 17a6a: e2 97 sbiw r28, 0x32 ; 50 17a6c: 80 83 st Z, r24 17a6e: 91 83 std Z+1, r25 ; 0x01 17a70: a2 83 std Z+2, r26 ; 0x02 17a72: b3 83 std Z+3, r27 ; 0x03 thermal_model::setup(); 17a74: 0f 94 e5 2f call 0x25fca ; 0x25fca void thermal_model_set_resistance(uint8_t index, float R) { if(index >= THERMAL_MODEL_R_SIZE || R <= 0) return; TempMgrGuard temp_mgr_guard; 17a78: ce 01 movw r24, r28 17a7a: 01 96 adiw r24, 0x01 ; 1 17a7c: 0f 94 69 32 call 0x264d2 ; 0x264d2 thermal_model_set_resistance(I, R); // enable the model last, if requested if(S >= 0) thermal_model_set_enabled(S); 17a80: e3 96 adiw r28, 0x33 ; 51 17a82: 9f ad ldd r25, Y+63 ; 0x3f 17a84: e3 97 sbiw r28, 0x33 ; 51 17a86: 97 fd sbrc r25, 7 17a88: 06 c0 rjmp .+12 ; 0x17a96 17a8a: 81 e0 ldi r24, 0x01 ; 1 17a8c: 91 11 cpse r25, r1 17a8e: 01 c0 rjmp .+2 ; 0x17a92 17a90: 80 e0 ldi r24, 0x00 ; 0 17a92: 0f 94 15 33 call 0x2662a ; 0x2662a // run autotune if(A >= 0) thermal_model_autotune(A, F > 0); 17a96: 37 fe sbrs r3, 7 17a98: 02 c0 rjmp .+4 ; 0x17a9e 17a9a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 17a9e: 11 e0 ldi r17, 0x01 ; 1 17aa0: eb 96 adiw r28, 0x3b ; 59 17aa2: af ad ldd r26, Y+63 ; 0x3f 17aa4: eb 97 sbiw r28, 0x3b ; 59 17aa6: 1a 16 cp r1, r26 17aa8: 0c f0 brlt .+2 ; 0x17aac 17aaa: 10 e0 ldi r17, 0x00 ; 0 float orig_C, orig_R[THERMAL_MODEL_R_SIZE]; bool orig_enabled; static_assert(sizeof(orig_R) == sizeof(thermal_model::data.R)); // fail-safe error state thermal_model_autotune_err = true; 17aac: 81 e0 ldi r24, 0x01 ; 1 17aae: 80 93 3c 02 sts 0x023C, r24 ; 0x80023c <_ZL26thermal_model_autotune_err.lto_priv.538> } //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); 17ab2: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 17ab6: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 17aba: 89 1b sub r24, r25 17abc: 8f 70 andi r24, 0x0F ; 15 char tm_message[LCD_WIDTH+1]; if(moves_planned() || (lcd_commands_type != LcdCommands::ThermalModel && printer_active())) { 17abe: 41 f4 brne .+16 ; 0x17ad0 17ac0: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 17ac4: 85 30 cpi r24, 0x05 ; 5 17ac6: 79 f1 breq .+94 ; 0x17b26 17ac8: 0e 94 79 67 call 0xcef2 ; 0xcef2 17acc: 88 23 and r24, r24 17ace: 59 f1 breq .+86 ; 0x17b26 sprintf_P(tm_message, PSTR("TM: Cal. NOT IDLE")); 17ad0: 8c ed ldi r24, 0xDC ; 220 17ad2: 93 e8 ldi r25, 0x83 ; 131 17ad4: 9f 93 push r25 17ad6: 8f 93 push r24 17ad8: e1 e0 ldi r30, 0x01 ; 1 17ada: f0 e0 ldi r31, 0x00 ; 0 17adc: ec 0f add r30, r28 17ade: fd 1f adc r31, r29 17ae0: ff 93 push r31 17ae2: ef 93 push r30 17ae4: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17ae8: ce 01 movw r24, r28 17aea: 01 96 adiw r24, 0x01 ; 1 17aec: 0e 94 05 f2 call 0x1e40a ; 0x1e40a return; 17af0: 0f 90 pop r0 17af2: 0f 90 pop r0 17af4: 0f 90 pop r0 17af6: 0f 90 pop r0 17af8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 void thermal_model_set_params(float P, float U, float V, float C, float D, int16_t L, float Ta_corr, float warn, float err) { TempMgrGuard temp_mgr_guard; if(!isnan(P) && P > 0) thermal_model::data.P = P; 17afc: 20 e0 ldi r18, 0x00 ; 0 17afe: 30 e0 ldi r19, 0x00 ; 0 17b00: a9 01 movw r20, r18 17b02: c7 01 movw r24, r14 17b04: b6 01 movw r22, r12 17b06: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 17b0a: 18 16 cp r1, r24 17b0c: 14 f0 brlt .+4 ; 0x17b12 17b0e: 0c 94 b9 aa jmp 0x15572 ; 0x15572 17b12: c0 92 d9 12 sts 0x12D9, r12 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 17b16: d0 92 da 12 sts 0x12DA, r13 ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 17b1a: e0 92 db 12 sts 0x12DB, r14 ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 17b1e: f0 92 dc 12 sts 0x12DC, r15 ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> 17b22: 0c 94 b9 aa jmp 0x15572 ; 0x15572 lcd_setstatus_serial(tm_message); return; } // lockout the printer during calibration KEEPALIVE_STATE(IN_PROCESS); 17b26: 83 e0 ldi r24, 0x03 ; 3 17b28: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be menu_set_block(MENU_BLOCK_THERMAL_MODEL_AUTOTUNE); 17b2c: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 17b30: 82 60 ori r24, 0x02 ; 2 17b32: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 lcd_return_to_status(); 17b36: 0f 94 82 1f call 0x23f04 ; 0x23f04 // save the original model data and set the model checking state during self-calibration orig_C = thermal_model::data.C; 17b3a: 20 91 e5 12 lds r18, 0x12E5 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 17b3e: 30 91 e6 12 lds r19, 0x12E6 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 17b42: 40 91 e7 12 lds r20, 0x12E7 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 17b46: 50 91 e8 12 lds r21, 0x12E8 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> 17b4a: 6e 96 adiw r28, 0x1e ; 30 17b4c: 2c af std Y+60, r18 ; 0x3c 17b4e: 3d af std Y+61, r19 ; 0x3d 17b50: 4e af std Y+62, r20 ; 0x3e 17b52: 5f af std Y+63, r21 ; 0x3f 17b54: 6e 97 sbiw r28, 0x1e ; 30 memcpy(orig_R, thermal_model::data.R, sizeof(thermal_model::data.R)); 17b56: 80 e4 ldi r24, 0x40 ; 64 17b58: ef ee ldi r30, 0xEF ; 239 17b5a: f2 e1 ldi r31, 0x12 ; 18 17b5c: de 01 movw r26, r28 17b5e: 11 96 adiw r26, 0x01 ; 1 17b60: 01 90 ld r0, Z+ 17b62: 0d 92 st X+, r0 17b64: 8a 95 dec r24 17b66: e1 f7 brne .-8 ; 0x17b60 orig_enabled = thermal_model::enabled; 17b68: 30 91 1c 05 lds r19, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 17b6c: 67 96 adiw r28, 0x17 ; 23 17b6e: 3f af std Y+63, r19 ; 0x3f 17b70: 67 97 sbiw r28, 0x17 ; 23 thermal_model_reset_enabled(selftest); 17b72: 81 2f mov r24, r17 17b74: 0f 94 37 33 call 0x2666e ; 0x2666e // autotune SERIAL_ECHOLNPGM("TM: calibration start"); 17b78: 86 ec ldi r24, 0xC6 ; 198 17b7a: 93 e8 ldi r25, 0x83 ; 131 17b7c: 0e 94 13 79 call 0xf226 ; 0xf226 thermal_model_autotune_err = thermal_model_cal::autotune(temp > 0 ? temp : THERMAL_MODEL_CAL_T_high); 17b80: 21 14 cp r2, r1 17b82: 31 04 cpc r3, r1 17b84: 19 f4 brne .+6 ; 0x17b8c 17b86: 56 ee ldi r21, 0xE6 ; 230 17b88: 25 2e mov r2, r21 17b8a: 31 2c mov r3, r1 uint16_t samples; float e; char tm_message[LCD_WIDTH+1]; // bootstrap C/R values without fan set_fan_speed(0); 17b8c: 80 e0 ldi r24, 0x00 ; 0 17b8e: 0f 94 93 2e call 0x25d26 ; 0x25d26 17b92: 32 e0 ldi r19, 0x02 ; 2 17b94: 43 2e mov r4, r19 17b96: 51 2c mov r5, r1 for(uint8_t i = 0; i != 2; ++i) { const char* PROGMEM verb = (i == 0? PSTR("initial"): PSTR("refine")); 17b98: 4a ea ldi r20, 0xAA ; 170 17b9a: 64 2e mov r6, r20 17b9c: 43 e8 ldi r20, 0x83 ; 131 17b9e: 74 2e mov r7, r20 17ba0: ae 01 movw r20, r28 17ba2: 4f 5b subi r20, 0xBF ; 191 17ba4: 5f 4f sbci r21, 0xFF ; 255 17ba6: 4a 01 movw r8, r20 target_temperature[0] = 0; if(current_temperature[0] >= THERMAL_MODEL_CAL_T_low) { sprintf_P(tm_message, PSTR("TM: cool down <%dC"), THERMAL_MODEL_CAL_T_low); 17ba8: 12 e3 ldi r17, 0x32 ; 50 // bootstrap C/R values without fan set_fan_speed(0); for(uint8_t i = 0; i != 2; ++i) { const char* PROGMEM verb = (i == 0? PSTR("initial"): PSTR("refine")); target_temperature[0] = 0; 17baa: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 17bae: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 if(current_temperature[0] >= THERMAL_MODEL_CAL_T_low) { 17bb2: 20 e0 ldi r18, 0x00 ; 0 17bb4: 30 e0 ldi r19, 0x00 ; 0 17bb6: 48 e4 ldi r20, 0x48 ; 72 17bb8: 52 e4 ldi r21, 0x42 ; 66 17bba: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 17bbe: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 17bc2: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 17bc6: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 17bca: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 17bce: 87 fd sbrc r24, 7 17bd0: 58 c0 rjmp .+176 ; 0x17c82 sprintf_P(tm_message, PSTR("TM: cool down <%dC"), THERMAL_MODEL_CAL_T_low); 17bd2: 1f 92 push r1 17bd4: 1f 93 push r17 17bd6: 80 e9 ldi r24, 0x90 ; 144 17bd8: 93 e8 ldi r25, 0x83 ; 131 17bda: 9f 93 push r25 17bdc: 8f 93 push r24 17bde: 9f 92 push r9 17be0: 8f 92 push r8 17be2: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17be6: c4 01 movw r24, r8 17be8: 0e 94 05 f2 call 0x1e40a ; 0x1e40a } } static void cooldown(float temp) { uint8_t old_speed = fanSpeed; 17bec: 00 91 e5 03 lds r16, 0x03E5 ; 0x8003e5 set_fan_speed(255); 17bf0: 8f ef ldi r24, 0xFF ; 255 17bf2: 0f 94 93 2e call 0x25d26 ; 0x25d26 17bf6: 0f 90 pop r0 17bf8: 0f 90 pop r0 17bfa: 0f 90 pop r0 17bfc: 0f 90 pop r0 17bfe: 0f 90 pop r0 17c00: 0f 90 pop r0 while(current_temperature[0] >= temp) { 17c02: c0 90 af 0d lds r12, 0x0DAF ; 0x800daf 17c06: d0 90 b0 0d lds r13, 0x0DB0 ; 0x800db0 17c0a: e0 90 b1 0d lds r14, 0x0DB1 ; 0x800db1 17c0e: f0 90 b2 0d lds r15, 0x0DB2 ; 0x800db2 17c12: 20 e0 ldi r18, 0x00 ; 0 17c14: 30 e0 ldi r19, 0x00 ; 0 17c16: 48 e4 ldi r20, 0x48 ; 72 17c18: 52 e4 ldi r21, 0x42 ; 66 17c1a: c7 01 movw r24, r14 17c1c: b6 01 movw r22, r12 17c1e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 17c22: 87 fd sbrc r24, 7 17c24: 27 c0 rjmp .+78 ; 0x17c74 if(temp_error_state.v) break; 17c26: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 17c2a: 81 11 cpse r24, r1 17c2c: 23 c0 rjmp .+70 ; 0x17c74 float ambient = current_temperature_ambient + thermal_model::data.Ta_corr; 17c2e: 20 91 55 06 lds r18, 0x0655 ; 0x800655 17c32: 30 91 56 06 lds r19, 0x0656 ; 0x800656 17c36: 40 91 57 06 lds r20, 0x0657 ; 0x800657 17c3a: 50 91 58 06 lds r21, 0x0658 ; 0x800658 17c3e: 60 91 2f 13 lds r22, 0x132F ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 17c42: 70 91 30 13 lds r23, 0x1330 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 17c46: 80 91 31 13 lds r24, 0x1331 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 17c4a: 90 91 32 13 lds r25, 0x1332 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> 17c4e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> if(current_temperature[0] < (ambient + TEMP_HYSTERESIS)) { 17c52: 20 e0 ldi r18, 0x00 ; 0 17c54: 30 e0 ldi r19, 0x00 ; 0 17c56: 40 ea ldi r20, 0xA0 ; 160 17c58: 50 e4 ldi r21, 0x40 ; 64 17c5a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 17c5e: 9b 01 movw r18, r22 17c60: ac 01 movw r20, r24 17c62: c7 01 movw r24, r14 17c64: b6 01 movw r22, r12 17c66: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 17c6a: 87 fd sbrc r24, 7 17c6c: 03 c0 rjmp .+6 ; 0x17c74 // do not get stuck waiting very close to ambient temperature break; } waiting_handler(); 17c6e: 0f 94 5c 3b call 0x276b8 ; 0x276b8 17c72: c7 cf rjmp .-114 ; 0x17c02 } set_fan_speed(old_speed); 17c74: 80 2f mov r24, r16 17c76: 0f 94 93 2e call 0x25d26 ; 0x25d26 target_temperature[0] = 0; if(current_temperature[0] >= THERMAL_MODEL_CAL_T_low) { sprintf_P(tm_message, PSTR("TM: cool down <%dC"), THERMAL_MODEL_CAL_T_low); lcd_setstatus_serial(tm_message); cooldown(THERMAL_MODEL_CAL_T_low); wait(10000); 17c7a: 80 e1 ldi r24, 0x10 ; 16 17c7c: 97 e2 ldi r25, 0x27 ; 39 17c7e: 0f 94 89 3b call 0x27712 ; 0x27712 } sprintf_P(tm_message, PSTR("TM: %S C est."), verb); 17c82: 7f 92 push r7 17c84: 6f 92 push r6 17c86: e2 e8 ldi r30, 0x82 ; 130 17c88: f3 e8 ldi r31, 0x83 ; 131 17c8a: ff 93 push r31 17c8c: ef 93 push r30 17c8e: 9f 92 push r9 17c90: 8f 92 push r8 17c92: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17c96: c4 01 movw r24, r8 17c98: 0e 94 05 f2 call 0x1e40a ; 0x1e40a target_temperature[0] = cal_temp; 17c9c: 30 92 b6 0d sts 0x0DB6, r3 ; 0x800db6 17ca0: 20 92 b5 0d sts 0x0DB5, r2 ; 0x800db5 samples = record(); 17ca4: 0f 94 a8 10 call 0x22150 ; 0x22150 17ca8: 5c 01 movw r10, r24 if(temp_error_state.v || !samples) 17caa: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 17cae: 0f 90 pop r0 17cb0: 0f 90 pop r0 17cb2: 0f 90 pop r0 17cb4: 0f 90 pop r0 17cb6: 0f 90 pop r0 17cb8: 0f 90 pop r0 17cba: 81 11 cpse r24, r1 17cbc: 7a c0 rjmp .+244 ; 0x17db2 17cbe: a1 14 cp r10, r1 17cc0: b1 04 cpc r11, r1 17cc2: 09 f4 brne .+2 ; 0x17cc6 17cc4: 76 c0 rjmp .+236 ; 0x17db2 return true; // we need a high R value for the initial C guess if(isnan(thermal_model::data.R[0])) 17cc6: 60 91 ef 12 lds r22, 0x12EF ; 0x8012ef <_ZN13thermal_modelL4dataE.lto_priv.402+0x40> 17cca: 70 91 f0 12 lds r23, 0x12F0 ; 0x8012f0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x41> 17cce: 80 91 f1 12 lds r24, 0x12F1 ; 0x8012f1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x42> 17cd2: 90 91 f2 12 lds r25, 0x12F2 ; 0x8012f2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x43> 17cd6: 9b 01 movw r18, r22 17cd8: ac 01 movw r20, r24 17cda: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17cde: 88 23 and r24, r24 17ce0: 61 f0 breq .+24 ; 0x17cfa thermal_model::data.R[0] = THERMAL_MODEL_CAL_R_high; 17ce2: 80 e0 ldi r24, 0x00 ; 0 17ce4: 90 e0 ldi r25, 0x00 ; 0 17ce6: a8 e4 ldi r26, 0x48 ; 72 17ce8: b2 e4 ldi r27, 0x42 ; 66 17cea: 80 93 ef 12 sts 0x12EF, r24 ; 0x8012ef <_ZN13thermal_modelL4dataE.lto_priv.402+0x40> 17cee: 90 93 f0 12 sts 0x12F0, r25 ; 0x8012f0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x41> 17cf2: a0 93 f1 12 sts 0x12F1, r26 ; 0x8012f1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x42> 17cf6: b0 93 f2 12 sts 0x12F2, r27 ; 0x8012f2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x43> e = estimate(samples, &thermal_model::data.C, 17cfa: c0 90 55 06 lds r12, 0x0655 ; 0x800655 17cfe: d0 90 56 06 lds r13, 0x0656 ; 0x800656 17d02: e0 90 57 06 lds r14, 0x0657 ; 0x800657 17d06: f0 90 58 06 lds r15, 0x0658 ; 0x800658 17d0a: 00 e0 ldi r16, 0x00 ; 0 17d0c: 20 e0 ldi r18, 0x00 ; 0 17d0e: 30 e0 ldi r19, 0x00 ; 0 17d10: 40 ea ldi r20, 0xA0 ; 160 17d12: 51 e4 ldi r21, 0x41 ; 65 17d14: 65 ee ldi r22, 0xE5 ; 229 17d16: 72 e1 ldi r23, 0x12 ; 18 17d18: c5 01 movw r24, r10 17d1a: 0e 94 70 e7 call 0x1cee0 ; 0x1cee0 THERMAL_MODEL_CAL_C_low, THERMAL_MODEL_CAL_C_high, THERMAL_MODEL_CAL_C_thr, THERMAL_MODEL_CAL_C_itr, 0, current_temperature_ambient); if(isnan(e)) 17d1e: 9b 01 movw r18, r22 17d20: ac 01 movw r20, r24 17d22: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17d26: 81 11 cpse r24, r1 17d28: 44 c0 rjmp .+136 ; 0x17db2 return true; wait_temp(); 17d2a: 0f 94 67 3b call 0x276ce ; 0x276ce if(i) break; // we don't need to refine R 17d2e: 4a 94 dec r4 17d30: 45 28 or r4, r5 17d32: 09 f4 brne .+2 ; 0x17d36 17d34: 85 c0 rjmp .+266 ; 0x17e40 wait(30000); // settle PID regulation 17d36: 80 e3 ldi r24, 0x30 ; 48 17d38: 95 e7 ldi r25, 0x75 ; 117 17d3a: 0f 94 89 3b call 0x27712 ; 0x27712 sprintf_P(tm_message, PSTR("TM: %S R %dC"), verb, cal_temp); 17d3e: 3f 92 push r3 17d40: 2f 92 push r2 17d42: 7f 92 push r7 17d44: 6f 92 push r6 17d46: 45 e7 ldi r20, 0x75 ; 117 17d48: 53 e8 ldi r21, 0x83 ; 131 17d4a: 5f 93 push r21 17d4c: 4f 93 push r20 17d4e: 9f 92 push r9 17d50: 8f 92 push r8 17d52: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17d56: c4 01 movw r24, r8 17d58: 0e 94 05 f2 call 0x1e40a ; 0x1e40a samples = record(); 17d5c: 0f 94 a8 10 call 0x22150 ; 0x22150 if(temp_error_state.v || !samples) 17d60: 20 91 1a 05 lds r18, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 17d64: 0f b6 in r0, 0x3f ; 63 17d66: f8 94 cli 17d68: de bf out 0x3e, r29 ; 62 17d6a: 0f be out 0x3f, r0 ; 63 17d6c: cd bf out 0x3d, r28 ; 61 17d6e: 21 11 cpse r18, r1 17d70: 20 c0 rjmp .+64 ; 0x17db2 17d72: 00 97 sbiw r24, 0x00 ; 0 17d74: f1 f0 breq .+60 ; 0x17db2 return true; e = estimate(samples, &thermal_model::data.R[0], 17d76: c0 90 55 06 lds r12, 0x0655 ; 0x800655 17d7a: d0 90 56 06 lds r13, 0x0656 ; 0x800656 17d7e: e0 90 57 06 lds r14, 0x0657 ; 0x800657 17d82: f0 90 58 06 lds r15, 0x0658 ; 0x800658 17d86: 20 e0 ldi r18, 0x00 ; 0 17d88: 30 e0 ldi r19, 0x00 ; 0 17d8a: 48 e4 ldi r20, 0x48 ; 72 17d8c: 52 e4 ldi r21, 0x42 ; 66 17d8e: 6f ee ldi r22, 0xEF ; 239 17d90: 72 e1 ldi r23, 0x12 ; 18 17d92: 0e 94 70 e7 call 0x1cee0 ; 0x1cee0 // bootstrap C/R values without fan set_fan_speed(0); for(uint8_t i = 0; i != 2; ++i) { const char* PROGMEM verb = (i == 0? PSTR("initial"): PSTR("refine")); 17d96: 03 ea ldi r16, 0xA3 ; 163 17d98: 60 2e mov r6, r16 17d9a: 03 e8 ldi r16, 0x83 ; 131 17d9c: 70 2e mov r7, r16 17d9e: 44 24 eor r4, r4 17da0: 43 94 inc r4 17da2: 51 2c mov r5, r1 e = estimate(samples, &thermal_model::data.R[0], THERMAL_MODEL_CAL_R_low, THERMAL_MODEL_CAL_R_high, THERMAL_MODEL_CAL_R_thr, THERMAL_MODEL_CAL_R_itr, 0, current_temperature_ambient); if(isnan(e)) 17da4: 9b 01 movw r18, r22 17da6: ac 01 movw r20, r24 17da8: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17dac: 88 23 and r24, r24 17dae: 09 f4 brne .+2 ; 0x17db2 17db0: fc ce rjmp .-520 ; 0x17baa sprintf_P(tm_message, PSTR("TM: %S C est."), verb); lcd_setstatus_serial(tm_message); target_temperature[0] = cal_temp; samples = record(); if(temp_error_state.v || !samples) return true; 17db2: 81 e0 ldi r24, 0x01 ; 1 orig_enabled = thermal_model::enabled; thermal_model_reset_enabled(selftest); // autotune SERIAL_ECHOLNPGM("TM: calibration start"); thermal_model_autotune_err = thermal_model_cal::autotune(temp > 0 ? temp : THERMAL_MODEL_CAL_T_high); 17db4: 80 93 3c 02 sts 0x023C, r24 ; 0x80023c <_ZL26thermal_model_autotune_err.lto_priv.538> // always reset temperature disable_heater(); 17db8: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 if(thermal_model_autotune_err) { 17dbc: 80 91 3c 02 lds r24, 0x023C ; 0x80023c <_ZL26thermal_model_autotune_err.lto_priv.538> 17dc0: 88 23 and r24, r24 17dc2: 09 f4 brne .+2 ; 0x17dc6 17dc4: fd c0 rjmp .+506 ; 0x17fc0 sprintf_P(tm_message, PSTR("TM: calibr. failed!")); 17dc6: 82 eb ldi r24, 0xB2 ; 178 17dc8: 93 e8 ldi r25, 0x83 ; 131 17dca: 9f 93 push r25 17dcc: 8f 93 push r24 17dce: 9f 92 push r9 17dd0: 8f 92 push r8 17dd2: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17dd6: c4 01 movw r24, r8 17dd8: 0e 94 05 f2 call 0x1e40a ; 0x1e40a if(temp_error_state.v) 17ddc: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 17de0: 0f 90 pop r0 17de2: 0f 90 pop r0 17de4: 0f 90 pop r0 17de6: 0f 90 pop r0 17de8: 88 23 and r24, r24 17dea: 19 f0 breq .+6 ; 0x17df2 thermal_model_cal::set_fan_speed(255); 17dec: 8f ef ldi r24, 0xFF ; 255 17dee: 0f 94 93 2e call 0x25d26 ; 0x25d26 // show calibrated values before overwriting them thermal_model_report_settings(); 17df2: 0f 94 9d 2e call 0x25d3a ; 0x25d3a // restore original state thermal_model::data.C = orig_C; 17df6: 6e 96 adiw r28, 0x1e ; 30 17df8: 2c ad ldd r18, Y+60 ; 0x3c 17dfa: 3d ad ldd r19, Y+61 ; 0x3d 17dfc: 4e ad ldd r20, Y+62 ; 0x3e 17dfe: 5f ad ldd r21, Y+63 ; 0x3f 17e00: 6e 97 sbiw r28, 0x1e ; 30 17e02: 20 93 e5 12 sts 0x12E5, r18 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 17e06: 30 93 e6 12 sts 0x12E6, r19 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 17e0a: 40 93 e7 12 sts 0x12E7, r20 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 17e0e: 50 93 e8 12 sts 0x12E8, r21 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> memcpy(thermal_model::data.R, orig_R, sizeof(thermal_model::data.R)); 17e12: 80 e4 ldi r24, 0x40 ; 64 17e14: fe 01 movw r30, r28 17e16: 31 96 adiw r30, 0x01 ; 1 17e18: af ee ldi r26, 0xEF ; 239 17e1a: b2 e1 ldi r27, 0x12 ; 18 17e1c: 01 90 ld r0, Z+ 17e1e: 0d 92 st X+, r0 17e20: 8a 95 dec r24 17e22: e1 f7 brne .-8 ; 0x17e1c thermal_model_set_enabled(orig_enabled); 17e24: 67 96 adiw r28, 0x17 ; 23 17e26: 8f ad ldd r24, Y+63 ; 0x3f 17e28: 67 97 sbiw r28, 0x17 ; 23 17e2a: 0f 94 15 33 call 0x2662a ; 0x2662a thermal_model_cal::set_fan_speed(0); thermal_model_set_enabled(orig_enabled); thermal_model_report_settings(); } lcd_consume_click(); 17e2e: 0e 94 90 70 call 0xe120 ; 0xe120 menu_unset_block(MENU_BLOCK_THERMAL_MODEL_AUTOTUNE); 17e32: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 17e36: 8d 7f andi r24, 0xFD ; 253 17e38: 80 93 d4 03 sts 0x03D4, r24 ; 0x8003d4 17e3c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 // Estimate fan losses at regular intervals, starting from full speed to avoid low-speed // kickstart issues, although this requires us to wait more for the PID stabilization. // Normally exhibits logarithmic behavior with the stock fan+shroud, so the shorter interval // at lower speeds is helpful to increase the resolution of the interpolation. set_fan_speed(255); 17e40: 8f ef ldi r24, 0xFF ; 255 17e42: 0f 94 93 2e call 0x25d26 ; 0x25d26 wait(30000); 17e46: 80 e3 ldi r24, 0x30 ; 48 17e48: 95 e7 ldi r25, 0x75 ; 117 17e4a: 0f 94 89 3b call 0x27712 ; 0x27712 17e4e: fb e2 ldi r31, 0x2B ; 43 17e50: 6f 2e mov r6, r31 17e52: f3 e1 ldi r31, 0x13 ; 19 17e54: 7f 2e mov r7, r31 17e56: 1f ef ldi r17, 0xFF ; 255 17e58: af e0 ldi r26, 0x0F ; 15 17e5a: aa 2e mov r10, r26 17e5c: b1 2c mov r11, r1 for(int8_t i = THERMAL_MODEL_R_SIZE - 1; i > 0; i -= THERMAL_MODEL_CAL_R_STEP) { // always disable the checker while estimating fan resistance as the difference // (esp with 3rd-party blowers) can be massive thermal_model::data.R[i] = NAN; 17e5e: 21 2c mov r2, r1 17e60: 31 2c mov r3, r1 17e62: b0 ec ldi r27, 0xC0 ; 192 17e64: 4b 2e mov r4, r27 17e66: bf e7 ldi r27, 0x7F ; 127 17e68: 5b 2e mov r5, r27 17e6a: f3 01 movw r30, r6 17e6c: 20 82 st Z, r2 17e6e: 31 82 std Z+1, r3 ; 0x01 17e70: 42 82 std Z+2, r4 ; 0x02 17e72: 53 82 std Z+3, r5 ; 0x03 uint8_t speed = 256 / THERMAL_MODEL_R_SIZE * (i + 1) - 1; set_fan_speed(speed); 17e74: 81 2f mov r24, r17 17e76: 0f 94 93 2e call 0x25d26 ; 0x25d26 wait(10000); 17e7a: 80 e1 ldi r24, 0x10 ; 16 17e7c: 97 e2 ldi r25, 0x27 ; 39 17e7e: 0f 94 89 3b call 0x27712 ; 0x27712 sprintf_P(tm_message, PSTR("TM: R[%u] estimate."), (unsigned)i); 17e82: bf 92 push r11 17e84: af 92 push r10 17e86: 21 e6 ldi r18, 0x61 ; 97 17e88: 33 e8 ldi r19, 0x83 ; 131 17e8a: 3f 93 push r19 17e8c: 2f 93 push r18 17e8e: 9f 92 push r9 17e90: 8f 92 push r8 17e92: 0f 94 27 db call 0x3b64e ; 0x3b64e lcd_setstatus_serial(tm_message); 17e96: c4 01 movw r24, r8 17e98: 0e 94 05 f2 call 0x1e40a ; 0x1e40a samples = record(); 17e9c: 0f 94 a8 10 call 0x22150 ; 0x22150 if(temp_error_state.v || !samples) 17ea0: 20 91 1a 05 lds r18, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 17ea4: 0f 90 pop r0 17ea6: 0f 90 pop r0 17ea8: 0f 90 pop r0 17eaa: 0f 90 pop r0 17eac: 0f 90 pop r0 17eae: 0f 90 pop r0 17eb0: 21 11 cpse r18, r1 17eb2: 7f cf rjmp .-258 ; 0x17db2 17eb4: 00 97 sbiw r24, 0x00 ; 0 17eb6: 09 f4 brne .+2 ; 0x17eba 17eb8: 7c cf rjmp .-264 ; 0x17db2 return true; // a fixed fan pwm (the norminal value) is used here, as soft_pwm_fan will be modified // during fan measurements and we'd like to include that skew during normal operation. e = estimate(samples, &thermal_model::data.R[i], 17eba: c0 90 55 06 lds r12, 0x0655 ; 0x800655 17ebe: d0 90 56 06 lds r13, 0x0656 ; 0x800656 17ec2: e0 90 57 06 lds r14, 0x0657 ; 0x800657 17ec6: f0 90 58 06 lds r15, 0x0658 ; 0x800658 17eca: 20 91 ef 12 lds r18, 0x12EF ; 0x8012ef <_ZN13thermal_modelL4dataE.lto_priv.402+0x40> 17ece: 30 91 f0 12 lds r19, 0x12F0 ; 0x8012f0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x41> 17ed2: 40 91 f1 12 lds r20, 0x12F1 ; 0x8012f1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x42> 17ed6: 50 91 f2 12 lds r21, 0x12F2 ; 0x8012f2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x43> 17eda: 0a 2d mov r16, r10 17edc: b3 01 movw r22, r6 17ede: 0e 94 70 e7 call 0x1cee0 ; 0x1cee0 THERMAL_MODEL_CAL_R_low, thermal_model::data.R[0], THERMAL_MODEL_CAL_R_thr, THERMAL_MODEL_CAL_R_itr, i, current_temperature_ambient); if(isnan(e)) 17ee2: 9b 01 movw r18, r22 17ee4: ac 01 movw r20, r24 17ee6: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 17eea: 81 11 cpse r24, r1 17eec: 62 cf rjmp .-316 ; 0x17db2 17eee: 54 e0 ldi r21, 0x04 ; 4 17ef0: a5 1a sub r10, r21 17ef2: b1 08 sbc r11, r1 17ef4: 80 e1 ldi r24, 0x10 ; 16 17ef6: 68 1a sub r6, r24 17ef8: 71 08 sbc r7, r1 17efa: 10 54 subi r17, 0x40 ; 64 // Normally exhibits logarithmic behavior with the stock fan+shroud, so the shorter interval // at lower speeds is helpful to increase the resolution of the interpolation. set_fan_speed(255); wait(30000); for(int8_t i = THERMAL_MODEL_R_SIZE - 1; i > 0; i -= THERMAL_MODEL_CAL_R_STEP) { 17efc: 9f ef ldi r25, 0xFF ; 255 17efe: a9 16 cp r10, r25 17f00: b9 06 cpc r11, r25 17f02: 09 f0 breq .+2 ; 0x17f06 17f04: b2 cf rjmp .-156 ; 0x17e6a 17f06: 77 e2 ldi r23, 0x27 ; 39 17f08: e7 2e mov r14, r23 17f0a: 73 e1 ldi r23, 0x13 ; 19 17f0c: f7 2e mov r15, r23 17f0e: 0e e0 ldi r16, 0x0E ; 14 17f10: 10 e0 ldi r17, 0x00 ; 0 return true; } // interpolate remaining steps to speed-up calibration // TODO: verify that the sampled values are monotically increasing? int8_t next = THERMAL_MODEL_R_SIZE - 1; 17f12: ef e0 ldi r30, 0x0F ; 15 17f14: 3e 2e mov r3, r30 for(uint8_t i = THERMAL_MODEL_R_SIZE - 2; i != 0; --i) { if(!((THERMAL_MODEL_R_SIZE - i - 1) % THERMAL_MODEL_CAL_R_STEP)) { 17f16: 8f e0 ldi r24, 0x0F ; 15 17f18: 90 e0 ldi r25, 0x00 ; 0 17f1a: 80 1b sub r24, r16 17f1c: 91 0b sbc r25, r17 17f1e: 83 70 andi r24, 0x03 ; 3 17f20: 99 27 eor r25, r25 17f22: 89 2b or r24, r25 17f24: 59 f4 brne .+22 ; 0x17f3c next = i; 17f26: 30 2e mov r3, r16 17f28: 01 50 subi r16, 0x01 ; 1 17f2a: 11 09 sbc r17, r1 17f2c: f4 e0 ldi r31, 0x04 ; 4 17f2e: ef 1a sub r14, r31 17f30: f1 08 sbc r15, r1 } // interpolate remaining steps to speed-up calibration // TODO: verify that the sampled values are monotically increasing? int8_t next = THERMAL_MODEL_R_SIZE - 1; for(uint8_t i = THERMAL_MODEL_R_SIZE - 2; i != 0; --i) { 17f32: 01 15 cp r16, r1 17f34: 11 05 cpc r17, r1 17f36: 79 f7 brne .-34 ; 0x17f16 float f = (float)(i - prev) / THERMAL_MODEL_CAL_R_STEP; float d = (thermal_model::data.R[next] - thermal_model::data.R[prev]); thermal_model::data.R[i] = thermal_model::data.R[prev] + d * f; } return false; 17f38: 80 e0 ldi r24, 0x00 ; 0 17f3a: 3c cf rjmp .-392 ; 0x17db4 for(uint8_t i = THERMAL_MODEL_R_SIZE - 2; i != 0; --i) { if(!((THERMAL_MODEL_R_SIZE - i - 1) % THERMAL_MODEL_CAL_R_STEP)) { next = i; continue; } int8_t prev = next - THERMAL_MODEL_CAL_R_STEP; 17f3c: 8c ef ldi r24, 0xFC ; 252 17f3e: 83 0d add r24, r3 if(prev < 0) prev = 0; float f = (float)(i - prev) / THERMAL_MODEL_CAL_R_STEP; 17f40: 87 fd sbrc r24, 7 17f42: 80 e0 ldi r24, 0x00 ; 0 17f44: 08 2e mov r0, r24 17f46: 00 0c add r0, r0 17f48: 99 0b sbc r25, r25 float d = (thermal_model::data.R[next] - thermal_model::data.R[prev]); 17f4a: fc 01 movw r30, r24 17f4c: ee 0f add r30, r30 17f4e: ff 1f adc r31, r31 17f50: ee 0f add r30, r30 17f52: ff 1f adc r31, r31 17f54: e1 51 subi r30, 0x11 ; 17 17f56: fd 4e sbci r31, 0xED ; 237 17f58: 40 80 ld r4, Z 17f5a: 51 80 ldd r5, Z+1 ; 0x01 17f5c: 62 80 ldd r6, Z+2 ; 0x02 17f5e: 73 80 ldd r7, Z+3 ; 0x03 next = i; continue; } int8_t prev = next - THERMAL_MODEL_CAL_R_STEP; if(prev < 0) prev = 0; float f = (float)(i - prev) / THERMAL_MODEL_CAL_R_STEP; 17f60: b8 01 movw r22, r16 17f62: 68 1b sub r22, r24 17f64: 79 0b sbc r23, r25 17f66: 07 2e mov r0, r23 17f68: 00 0c add r0, r0 17f6a: 88 0b sbc r24, r24 17f6c: 99 0b sbc r25, r25 17f6e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 17f72: 20 e0 ldi r18, 0x00 ; 0 17f74: 30 e0 ldi r19, 0x00 ; 0 17f76: 40 e8 ldi r20, 0x80 ; 128 17f78: 5e e3 ldi r21, 0x3E ; 62 17f7a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 17f7e: 5b 01 movw r10, r22 17f80: 6c 01 movw r12, r24 float d = (thermal_model::data.R[next] - thermal_model::data.R[prev]); 17f82: a3 2d mov r26, r3 17f84: b4 e0 ldi r27, 0x04 ; 4 17f86: ab 02 muls r26, r27 17f88: f0 01 movw r30, r0 17f8a: 11 24 eor r1, r1 17f8c: e1 51 subi r30, 0x11 ; 17 17f8e: fd 4e sbci r31, 0xED ; 237 17f90: a3 01 movw r20, r6 17f92: 92 01 movw r18, r4 17f94: 60 81 ld r22, Z 17f96: 71 81 ldd r23, Z+1 ; 0x01 17f98: 82 81 ldd r24, Z+2 ; 0x02 17f9a: 93 81 ldd r25, Z+3 ; 0x03 17f9c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 17fa0: 9b 01 movw r18, r22 17fa2: ac 01 movw r20, r24 thermal_model::data.R[i] = thermal_model::data.R[prev] + d * f; 17fa4: c6 01 movw r24, r12 17fa6: b5 01 movw r22, r10 17fa8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 17fac: a3 01 movw r20, r6 17fae: 92 01 movw r18, r4 17fb0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 17fb4: f7 01 movw r30, r14 17fb6: 60 83 st Z, r22 17fb8: 71 83 std Z+1, r23 ; 0x01 17fba: 82 83 std Z+2, r24 ; 0x02 17fbc: 93 83 std Z+3, r25 ; 0x03 17fbe: b4 cf rjmp .-152 ; 0x17f28 // restore original state thermal_model::data.C = orig_C; memcpy(thermal_model::data.R, orig_R, sizeof(thermal_model::data.R)); thermal_model_set_enabled(orig_enabled); } else { calibration_status_set(CALIBRATION_STATUS_THERMAL_MODEL); 17fc0: 88 e0 ldi r24, 0x08 ; 8 17fc2: 0e 94 4b ef call 0x1de96 ; 0x1de96 lcd_setstatuspgm(MSG_WELCOME); 17fc6: 82 e1 ldi r24, 0x12 ; 18 17fc8: 90 e7 ldi r25, 0x70 ; 112 17fca: 0e 94 16 f2 call 0x1e42c ; 0x1e42c thermal_model_cal::set_fan_speed(0); 17fce: 80 e0 ldi r24, 0x00 ; 0 17fd0: 0f 94 93 2e call 0x25d26 ; 0x25d26 thermal_model_set_enabled(orig_enabled); 17fd4: 67 96 adiw r28, 0x17 ; 23 17fd6: 8f ad ldd r24, Y+63 ; 0x3f 17fd8: 67 97 sbiw r28, 0x17 ; 23 17fda: 0f 94 15 33 call 0x2662a ; 0x2662a thermal_model_report_settings(); 17fde: 0f 94 9d 2e call 0x25d3a ; 0x25d3a 17fe2: 25 cf rjmp .-438 ; 0x17e2e M400 */ case 400: { st_synchronize(); 17fe4: 0f 94 a9 43 call 0x28752 ; 0x28752 17fe8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 */ case 405: // M405 Enable Filament Sensor { fsensor.setEnabled(1); 17fec: 81 e0 ldi r24, 0x01 ; 1 17fee: 0e 94 67 74 call 0xe8ce ; 0xe8ce 17ff2: 0c 94 83 b0 jmp 0x16106 ; 0x16106 M420 */ case 420: // M420 Mesh bed leveling status { gcode_G81_M420(); 17ff6: 0e 94 f3 7e call 0xfde6 ; 0xfde6 17ffa: 0c 94 83 b0 jmp 0x16106 ; 0x16106 M500 */ case 500: { Config_StoreSettings(); 17ffe: 0e 94 3c 82 call 0x10478 ; 0x10478 18002: 0c 94 83 b0 jmp 0x16106 ; 0x16106 M501 */ case 501: { Config_RetrieveSettings(); 18006: 0e 94 4c 93 call 0x12698 ; 0x12698 1800a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 M502 */ case 502: { Config_ResetDefault(); 1800e: 0e 94 24 82 call 0x10448 ; 0x10448 18012: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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); 18016: 1f 93 push r17 18018: 0f 93 push r16 1801a: 81 ee ldi r24, 0xE1 ; 225 1801c: 9e e7 ldi r25, 0x7E ; 126 1801e: 9f 93 push r25 18020: 8f 93 push r24 18022: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 18026: 0f 90 pop r0 18028: 0f 90 pop r0 1802a: 0f 90 pop r0 1802c: 0f 90 pop r0 1802e: 0c 94 d1 ae jmp 0x15da2 ; 0x15da2 M509 */ case 509: { lang_reset(); 18032: 0e 94 c4 70 call 0xe188 ; 0xe188 SERIAL_ECHO_START; 18036: 82 ef ldi r24, 0xF2 ; 242 18038: 9a ea ldi r25, 0xAA ; 170 1803a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLPGM("LANG SEL FORCED"); 1803e: 80 ee ldi r24, 0xE0 ; 224 18040: 95 e8 ldi r25, 0x85 ; 133 18042: 0e 94 e8 76 call 0xedd0 ; 0xedd0 18046: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `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(); 1804a: 0f 94 a9 43 call 0x28752 ; 0x28752 /// 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; 1804e: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 18052: 81 11 cpse r24, r1 18054: 02 c0 rjmp .+4 ; 0x1805a 18056: 0e 94 e1 63 call 0xc7c2 ; 0xc7c2 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(); 1805a: 85 e4 ldi r24, 0x45 ; 69 1805c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 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; 18060: 81 2c mov r8, r1 18062: 91 2c mov r9, r1 18064: a1 2c mov r10, r1 18066: 30 ec ldi r19, 0xC0 ; 192 18068: 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(); 1806a: 88 23 and r24, r24 1806c: 21 f0 breq .+8 ; 0x18076 1806e: 0e 94 35 60 call 0xc06a ; 0xc06a 18072: 4b 01 movw r8, r22 18074: 5c 01 movw r10, r24 if (code_seen('L')) e_shift_late = code_value(); 18076: 8c e4 ldi r24, 0x4C ; 76 18078: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 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; 1807c: c1 2c mov r12, r1 1807e: d1 2c mov r13, r1 18080: 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(); 18082: 88 23 and r24, r24 18084: 21 f0 breq .+8 ; 0x1808e 18086: 0e 94 35 60 call 0xc06a ; 0xc06a 1808a: 6b 01 movw r12, r22 1808c: 7c 01 movw r14, r24 // Z lift. For safety only allow positive values if (code_seen('Z')) z_shift = fabs(code_value()); 1808e: 8a e5 ldi r24, 0x5A ; 90 18090: 0e 94 6e 5b call 0xb6dc ; 0xb6dc // 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; 18094: 41 2c mov r4, r1 18096: 51 2c mov r5, r1 18098: 28 ed ldi r18, 0xD8 ; 216 1809a: 62 2e mov r6, r18 1809c: 21 e4 ldi r18, 0x41 ; 65 1809e: 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()); 180a0: 88 23 and r24, r24 180a2: 31 f0 breq .+12 ; 0x180b0 180a4: 0e 94 35 60 call 0xc06a ; 0xc06a 180a8: 2b 01 movw r4, r22 180aa: 3c 01 movw r6, r24 180ac: e8 94 clt 180ae: 77 f8 bld r7, 7 //Move XY to side if (code_seen('X')) x_position = code_value(); 180b0: 88 e5 ldi r24, 0x58 ; 88 180b2: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 180b6: 88 23 and r24, r24 180b8: 09 f4 brne .+2 ; 0x180bc 180ba: 49 c1 rjmp .+658 ; 0x1834e 180bc: 0e 94 35 60 call 0xc06a ; 0xc06a 180c0: 6a 96 adiw r28, 0x1a ; 26 180c2: 6c af std Y+60, r22 ; 0x3c 180c4: 7d af std Y+61, r23 ; 0x3d 180c6: 8e af std Y+62, r24 ; 0x3e 180c8: 9f af std Y+63, r25 ; 0x3f 180ca: 6a 97 sbiw r28, 0x1a ; 26 if (code_seen('Y')) y_position = code_value(); 180cc: 89 e5 ldi r24, 0x59 ; 89 180ce: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 180d2: 88 23 and r24, r24 180d4: 09 f4 brne .+2 ; 0x180d8 180d6: 46 c1 rjmp .+652 ; 0x18364 180d8: 0e 94 35 60 call 0xc06a ; 0xc06a 180dc: 6e 96 adiw r28, 0x1e ; 30 180de: 6c af std Y+60, r22 ; 0x3c 180e0: 7d af std Y+61, r23 ; 0x3d 180e2: 8e af std Y+62, r24 ; 0x3e 180e4: 9f af std Y+63, r25 ; 0x3f 180e6: 6e 97 sbiw r28, 0x1e ; 30 // Filament name to show during the loading char filament_name[LCD_WIDTH + 1] = ""; 180e8: 1a 82 std Y+2, r1 ; 0x02 180ea: 19 82 std Y+1, r1 ; 0x01 180ec: fe 01 movw r30, r28 180ee: 33 96 adiw r30, 0x03 ; 3 180f0: 83 e1 ldi r24, 0x13 ; 19 180f2: df 01 movw r26, r30 180f4: 1d 92 st X+, r1 180f6: 8a 95 dec r24 180f8: e9 f7 brne .-6 ; 0x180f4 if (code_seen('C')) { 180fa: 83 e4 ldi r24, 0x43 ; 67 180fc: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18100: 88 23 and r24, r24 18102: f9 f0 breq .+62 ; 0x18142 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 18104: 62 e2 ldi r22, 0x22 ; 34 18106: 70 e0 ldi r23, 0x00 ; 0 18108: 80 91 93 03 lds r24, 0x0393 ; 0x800393 1810c: 90 91 94 03 lds r25, 0x0394 ; 0x800394 18110: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 18114: 8c 01 movw r16, r24 if (!this->ptr) { 18116: 89 2b or r24, r25 18118: a1 f0 breq .+40 ; 0x18142 // First quote not found return; } // Skip the leading quote this->ptr++; 1811a: 0f 5f subi r16, 0xFF ; 255 1811c: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 1811e: 62 e2 ldi r22, 0x22 ; 34 18120: 70 e0 ldi r23, 0x00 ; 0 18122: c8 01 movw r24, r16 18124: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce if(!pStrEnd) { 18128: 00 97 sbiw r24, 0x00 ; 0 1812a: 59 f0 breq .+22 ; 0x18142 // Second quote not found return; } this->len = pStrEnd - this->ptr; 1812c: 80 1b sub r24, r16 unquoted_string str = unquoted_string(strchr_pointer); if (str.WasFound()) { const uint8_t len = min(str.GetLength(), LCD_WIDTH); 1812e: 84 31 cpi r24, 0x14 ; 20 18130: 08 f0 brcs .+2 ; 0x18134 18132: 84 e1 ldi r24, 0x14 ; 20 memcpy(filament_name, str.GetUnquotedString(), len); 18134: 48 2f mov r20, r24 18136: 50 e0 ldi r21, 0x00 ; 0 18138: b8 01 movw r22, r16 1813a: ce 01 movw r24, r28 1813c: 01 96 adiw r24, 0x01 ; 1 1813e: 0f 94 39 e2 call 0x3c472 ; 0x3c472 } } if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO"))) 18142: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 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; 18146: 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"))) 18148: 81 30 cpi r24, 0x01 ; 1 1814a: 29 f4 brne .+10 ; 0x18156 1814c: 8b ed ldi r24, 0xDB ; 219 1814e: 95 e8 ldi r25, 0x85 ; 133 18150: 0e 94 be 67 call 0xcf7c ; 0xcf7c 18154: 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(); 18156: 0f 94 a9 43 call 0x28752 ; 0x28752 uint8_t eject_slot = 0; prusa_statistics(22); // Turn off the fan fanSpeed = 0; 1815a: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 // Retract E if (!printingIsPaused()) 1815e: 0e 94 1d 67 call 0xce3a ; 0xce3a 18162: 81 11 cpse r24, r1 18164: 06 c1 rjmp .+524 ; 0x18372 { current_position[E_AXIS] += e_shift; 18166: a5 01 movw r20, r10 18168: 94 01 movw r18, r8 1816a: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 1816e: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 18172: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 18176: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 1817a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1817e: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 18182: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 18186: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 1818a: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED); 1818e: 60 e0 ldi r22, 0x00 ; 0 18190: 70 e0 ldi r23, 0x00 ; 0 18192: 88 ee ldi r24, 0xE8 ; 232 18194: 92 e4 ldi r25, 0x42 ; 66 18196: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1819a: 0f 94 a9 43 call 0x28752 ; 0x28752 SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED); 1819e: 88 e9 ldi r24, 0x98 ; 152 181a0: 9e e6 ldi r25, 0x6E ; 110 181a2: 0e 94 13 79 call 0xf226 ; 0xf226 // Filament change can be issued via the Tune menu restore_extruder_temperature_from_ram(); } // Raise the Z axis raise_z(z_shift); 181a6: c3 01 movw r24, r6 181a8: b2 01 movw r22, r4 181aa: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 // Move XY to side current_position[X_AXIS] = x_position; 181ae: 6a 96 adiw r28, 0x1a ; 26 181b0: 2c ad ldd r18, Y+60 ; 0x3c 181b2: 3d ad ldd r19, Y+61 ; 0x3d 181b4: 4e ad ldd r20, Y+62 ; 0x3e 181b6: 5f ad ldd r21, Y+63 ; 0x3f 181b8: 6a 97 sbiw r28, 0x1a ; 26 181ba: 20 93 91 06 sts 0x0691, r18 ; 0x800691 181be: 30 93 92 06 sts 0x0692, r19 ; 0x800692 181c2: 40 93 93 06 sts 0x0693, r20 ; 0x800693 181c6: 50 93 94 06 sts 0x0694, r21 ; 0x800694 current_position[Y_AXIS] = y_position; 181ca: 6e 96 adiw r28, 0x1e ; 30 181cc: 8c ad ldd r24, Y+60 ; 0x3c 181ce: 9d ad ldd r25, Y+61 ; 0x3d 181d0: ae ad ldd r26, Y+62 ; 0x3e 181d2: bf ad ldd r27, Y+63 ; 0x3f 181d4: 6e 97 sbiw r28, 0x1e ; 30 181d6: 80 93 95 06 sts 0x0695, r24 ; 0x800695 181da: 90 93 96 06 sts 0x0696, r25 ; 0x800696 181de: a0 93 97 06 sts 0x0697, r26 ; 0x800697 181e2: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); 181e6: 60 e0 ldi r22, 0x00 ; 0 181e8: 70 e0 ldi r23, 0x00 ; 0 181ea: 88 e4 ldi r24, 0x48 ; 72 181ec: 92 e4 ldi r25, 0x42 ; 66 181ee: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 181f2: 0f 94 a9 43 call 0x28752 ; 0x28752 bool repeat = false; 181f6: 67 96 adiw r28, 0x17 ; 23 181f8: 1f ae std Y+63, r1 ; 0x3f 181fa: 67 97 sbiw r28, 0x17 ; 23 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; 181fc: 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)); 181fe: 0a e2 ldi r16, 0x2A ; 42 18200: 20 2e mov r2, r16 18202: 0e e7 ldi r16, 0x7E ; 126 18204: 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; 18206: 82 e0 ldi r24, 0x02 ; 2 18208: 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)); 1820a: 92 e3 ldi r25, 0x32 ; 50 1820c: 89 2e mov r8, r25 1820e: 9e e7 ldi r25, 0x7E ; 126 18210: 99 2e mov r9, r25 st_synchronize(); bool repeat = false; do { // Unload filament if (MMU2::mmu2.Enabled()) { 18212: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 18216: 81 30 cpi r24, 0x01 ; 1 18218: 09 f0 breq .+2 ; 0x1821c 1821a: ae c0 rjmp .+348 ; 0x18378 eject_slot = MMU2::mmu2.get_current_tool(); 1821c: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 18220: b8 2e mov r11, r24 mmu_M600_unload_filament(); 18222: 0e 94 af 72 call 0xe55e ; 0xe55e } 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 18226: 0f 94 a9 43 call 0x28752 ; 0x28752 FSensorBlockRunout fsBlockRunout; 1822a: 0f 94 a5 87 call 0x30f4a ; 0x30f4a if (!MMU2::mmu2.Enabled()) 1822e: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 18232: 81 30 cpi r24, 0x01 ; 1 18234: 09 f4 brne .+2 ; 0x18238 18236: 6e c1 rjmp .+732 ; 0x18514 { KEEPALIVE_STATE(PAUSED_FOR_USER); 18238: 84 e0 ldi r24, 0x04 ; 4 1823a: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be uint8_t choice = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_UNLOAD_SUCCESSFUL), false, LCD_LEFT_BUTTON_CHOICE); 1823e: 81 e2 ldi r24, 0x21 ; 33 18240: 99 e3 ldi r25, 0x39 ; 57 18242: 0e 94 44 72 call 0xe488 ; 0xe488 18246: 40 e0 ldi r20, 0x00 ; 0 18248: 60 e0 ldi r22, 0x00 ; 0 1824a: 0f 94 2a 50 call 0x2a054 ; 0x2a054 1824e: 08 2f mov r16, r24 lcd_update_enable(false); 18250: 80 e0 ldi r24, 0x00 ; 0 18252: 0e 94 bd 6e call 0xdd7a ; 0xdd7a if (choice == LCD_MIDDLE_BUTTON_CHOICE) { 18256: 01 30 cpi r16, 0x01 ; 1 18258: 29 f5 brne .+74 ; 0x182a4 lcd_clear(); 1825a: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); 1825e: 89 e9 ldi r24, 0x99 ; 153 18260: 99 e3 ldi r25, 0x39 ; 57 18262: 0e 94 44 72 call 0xe488 ; 0xe488 18266: ac 01 movw r20, r24 18268: 62 e0 ldi r22, 0x02 ; 2 1826a: 80 e0 ldi r24, 0x00 ; 0 1826c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 current_position[X_AXIS] = 100; 18270: 80 e0 ldi r24, 0x00 ; 0 18272: 90 e0 ldi r25, 0x00 ; 0 18274: a8 ec ldi r26, 0xC8 ; 200 18276: b2 e4 ldi r27, 0x42 ; 66 18278: 80 93 91 06 sts 0x0691, r24 ; 0x800691 1827c: 90 93 92 06 sts 0x0692, r25 ; 0x800692 18280: a0 93 93 06 sts 0x0693, r26 ; 0x800693 18284: b0 93 94 06 sts 0x0694, r27 ; 0x800694 plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); 18288: 60 e0 ldi r22, 0x00 ; 0 1828a: 70 e0 ldi r23, 0x00 ; 0 1828c: 88 e4 ldi r24, 0x48 ; 72 1828e: 92 e4 ldi r25, 0x42 ; 66 18290: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 18294: 0f 94 a9 43 call 0x28752 ; 0x28752 lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHECK_IDLER)); 18298: 8f ee ldi r24, 0xEF ; 239 1829a: 98 e3 ldi r25, 0x38 ; 56 1829c: 0e 94 44 72 call 0xe488 ; 0xe488 182a0: 0f 94 cd 20 call 0x2419a ; 0x2419a preheat_or_continue(FilamentAction::UnLoad); } void lcd_wait_interact(const char* filament_name) { lcd_clear(); 182a4: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_INSERT_FILAMENT)); 182a8: 8d e7 ldi r24, 0x7D ; 125 182aa: 98 e3 ldi r25, 0x38 ; 56 182ac: 0e 94 44 72 call 0xe488 ; 0xe488 182b0: ac 01 movw r20, r24 182b2: 60 e0 ldi r22, 0x00 ; 0 182b4: 80 e0 ldi r24, 0x00 ; 0 182b6: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(0, 1); 182ba: 61 e0 ldi r22, 0x01 ; 1 182bc: 80 e0 ldi r24, 0x00 ; 0 182be: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 if (filament_name[0]) { 182c2: 89 81 ldd r24, Y+1 ; 0x01 182c4: 88 23 and r24, r24 182c6: 41 f0 breq .+16 ; 0x182d8 lcd_print(filament_name); 182c8: ce 01 movw r24, r28 182ca: 01 96 adiw r24, 0x01 ; 1 182cc: 0e 94 7f 70 call 0xe0fe ; 0xe0fe lcd_set_cursor(0, 2); 182d0: 62 e0 ldi r22, 0x02 ; 2 182d2: 80 e0 ldi r24, 0x00 ; 0 182d4: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 } #ifdef FILAMENT_SENSOR if (!fsensor.getAutoLoadEnabled()) 182d8: 80 91 aa 17 lds r24, 0x17AA ; 0x8017aa 182dc: 81 11 cpse r24, r1 182de: 06 c0 rjmp .+12 ; 0x182ec #endif //FILAMENT_SENSOR { lcd_puts_P(_T(MSG_PRESS)); 182e0: 88 e6 ldi r24, 0x68 ; 104 182e2: 98 e3 ldi r25, 0x38 ; 56 182e4: 0e 94 44 72 call 0xe488 ; 0xe488 182e8: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 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); 182ec: 84 e0 ldi r24, 0x04 ; 4 182ee: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be while(!lcd_clicked()) 182f2: 0e 94 95 70 call 0xe12a ; 0xe12a 182f6: 81 11 cpse r24, r1 182f8: 10 c0 rjmp .+32 ; 0x1831a { manage_heater(); 182fa: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 182fe: 81 e0 ldi r24, 0x01 ; 1 18300: 0e 94 4f 8a call 0x1149e ; 0x1149e #ifdef FILAMENT_SENSOR if (fsensor.getFilamentLoadEvent()) { 18304: 80 91 ad 17 lds r24, 0x17AD ; 0x8017ad 18308: 88 23 and r24, r24 1830a: 99 f3 breq .-26 ; 0x182f2 Sound_MakeCustom(50,1000,false); 1830c: 40 e0 ldi r20, 0x00 ; 0 1830e: 68 ee ldi r22, 0xE8 ; 232 18310: 73 e0 ldi r23, 0x03 ; 3 18312: 82 e3 ldi r24, 0x32 ; 50 18314: 90 e0 ldi r25, 0x00 ; 0 18316: 0f 94 3d 52 call 0x2a47a ; 0x2a47a break; } #endif //FILAMENT_SENSOR } KEEPALIVE_STATE(IN_HANDLER); 1831a: a0 92 be 02 sts 0x02BE, r10 ; 0x8002be M600_load_filament_movements(filament_name); 1831e: ce 01 movw r24, r28 18320: 01 96 adiw r24, 0x01 ; 1 18322: 0e 94 68 72 call 0xe4d0 ; 0xe4d0 Sound_MakeCustom(50,1000,false); 18326: 40 e0 ldi r20, 0x00 ; 0 18328: 68 ee ldi r22, 0xE8 ; 232 1832a: 73 e0 ldi r23, 0x03 ; 3 1832c: 82 e3 ldi r24, 0x32 ; 50 1832e: 90 e0 ldi r25, 0x00 ; 0 18330: 0f 94 3d 52 call 0x2a47a ; 0x2a47a 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); 18334: b4 e0 ldi r27, 0x04 ; 4 18336: 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) 18338: 11 23 and r17, r17 1833a: 09 f4 brne .+2 ; 0x1833e 1833c: 00 c1 rjmp .+512 ; 0x1853e 1833e: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 current_position[Y_AXIS] = y_position; plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); st_synchronize(); bool repeat = false; do { 18342: 67 96 adiw r28, 0x17 ; 23 18344: 4f ad ldd r20, Y+63 ; 0x3f 18346: 67 97 sbiw r28, 0x17 ; 23 18348: 41 11 cpse r20, r1 1834a: 63 cf rjmp .-314 ; 0x18212 1834c: a1 c1 rjmp .+834 ; 0x18690 // 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; 1834e: 20 e0 ldi r18, 0x00 ; 0 18350: 30 e0 ldi r19, 0x00 ; 0 18352: 43 e5 ldi r20, 0x53 ; 83 18354: 53 e4 ldi r21, 0x43 ; 67 18356: 6a 96 adiw r28, 0x1a ; 26 18358: 2c af std Y+60, r18 ; 0x3c 1835a: 3d af std Y+61, r19 ; 0x3d 1835c: 4e af std Y+62, r20 ; 0x3e 1835e: 5f af std Y+63, r21 ; 0x3f 18360: 6a 97 sbiw r28, 0x1a ; 26 18362: b4 ce rjmp .-664 ; 0x180cc float y_position = FILAMENTCHANGE_YPOS; 18364: 6e 96 adiw r28, 0x1e ; 30 18366: 1c ae std Y+60, r1 ; 0x3c 18368: 1d ae std Y+61, r1 ; 0x3d 1836a: 1e ae std Y+62, r1 ; 0x3e 1836c: 1f ae std Y+63, r1 ; 0x3f 1836e: 6e 97 sbiw r28, 0x1e ; 30 18370: bb ce rjmp .-650 ; 0x180e8 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(); 18372: 0e 94 61 64 call 0xc8c2 ; 0xc8c2 18376: 17 cf rjmp .-466 ; 0x181a6 //! //! 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); 18378: 84 e0 ldi r24, 0x04 ; 4 1837a: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be unsigned long waiting_start_time = _millis(); 1837e: 0f 94 28 2a call 0x25450 ; 0x25450 18382: 2b 01 movw r4, r22 18384: 3c 01 movw r6, r24 uint8_t wait_for_user_state = 0; lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); 18386: 8d e3 ldi r24, 0x3D ; 61 18388: 98 e3 ldi r25, 0x38 ; 56 1838a: 0e 94 44 72 call 0xe488 ; 0xe488 1838e: 0f 94 c0 20 call 0x24180 ; 0x24180 while (!(wait_for_user_state == 0 && lcd_clicked())){ 18392: 0e 94 95 70 call 0xe12a ; 0xe12a 18396: 08 2f mov r16, r24 18398: 81 11 cpse r24, r1 1839a: 38 c0 rjmp .+112 ; 0x1840c 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) { 1839c: a3 01 movw r20, r6 1839e: 92 01 movw r18, r4 183a0: 20 54 subi r18, 0x40 ; 64 183a2: 38 4d sbci r19, 0xD8 ; 216 183a4: 46 4f sbci r20, 0xF6 ; 246 183a6: 5f 4f sbci r21, 0xFF ; 255 183a8: 6e 96 adiw r28, 0x1e ; 30 183aa: 2c af std Y+60, r18 ; 0x3c 183ac: 3d af std Y+61, r19 ; 0x3d 183ae: 4e af std Y+62, r20 ; 0x3e 183b0: 5f af std Y+63, r21 ; 0x3f 183b2: 6e 97 sbiw r28, 0x1e ; 30 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(); 183b4: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 183b8: 81 e0 ldi r24, 0x01 ; 1 183ba: 0e 94 4f 8a call 0x1149e ; 0x1149e if (wait_for_user_state != 2) sound_wait_for_user(); 183be: 02 30 cpi r16, 0x02 ; 2 183c0: 09 f4 brne .+2 ; 0x183c4 183c2: 67 c0 rjmp .+206 ; 0x18492 183c4: 0f 94 e1 52 call 0x2a5c2 ; 0x2a5c2 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); 183c8: 84 e0 ldi r24, 0x04 ; 4 183ca: 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) { 183cc: 01 30 cpi r16, 0x01 ; 1 183ce: 39 f1 breq .+78 ; 0x1841e case 0: //nozzle is hot, waiting for user to press the knob to unload filament delay_keep_alive(4); 183d0: 0e 94 84 8c call 0x11908 ; 0x11908 if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) { 183d4: 0f 94 28 2a call 0x25450 ; 0x25450 183d8: 6e 96 adiw r28, 0x1e ; 30 183da: 2c ad ldd r18, Y+60 ; 0x3c 183dc: 3d ad ldd r19, Y+61 ; 0x3d 183de: 4e ad ldd r20, Y+62 ; 0x3e 183e0: 5f ad ldd r21, Y+63 ; 0x3f 183e2: 6e 97 sbiw r28, 0x1e ; 30 183e4: 26 17 cp r18, r22 183e6: 37 07 cpc r19, r23 183e8: 48 07 cpc r20, r24 183ea: 59 07 cpc r21, r25 183ec: 90 f6 brcc .-92 ; 0x18392 lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_PREHEAT)); 183ee: 8c e0 ldi r24, 0x0C ; 12 183f0: 98 e3 ldi r25, 0x38 ; 56 183f2: 0e 94 44 72 call 0xe488 ; 0xe488 183f6: 0f 94 c0 20 call 0x24180 ; 0x24180 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 183fa: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 183fe: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 wait_for_user_state = 1; setTargetHotend(0); st_synchronize(); 18402: 0f 94 a9 43 call 0x28752 ; 0x28752 disable_e0(); 18406: 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; 18408: 01 e0 ldi r16, 0x01 ; 1 1840a: d4 cf rjmp .-88 ; 0x183b4 1840c: 10 92 6a 05 sts 0x056A, r1 ; 0x80056a <_ZL10beep_timer.lto_priv.496> /// @brief Resets the global state of sound_wait_for_user() void sound_wait_for_user_reset() { beep_timer.stop(); bFirst = false; 18410: 10 92 6d 05 sts 0x056D, r1 ; 0x80056d <_ZL6bFirst.lto_priv.497> 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); 18414: c7 01 movw r24, r14 18416: b6 01 movw r22, r12 18418: 0e 94 08 f9 call 0x1f210 ; 0x1f210 1841c: 04 cf rjmp .-504 ; 0x18226 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); 1841e: 0e 94 84 8c call 0x11908 ; 0x11908 if (lcd_clicked()) { 18422: 0e 94 95 70 call 0xe12a ; 0xe12a 18426: 88 23 and r24, r24 18428: 29 f2 breq .-118 ; 0x183b4 1842a: 80 91 ab 05 lds r24, 0x05AB ; 0x8005ab 1842e: 90 91 ac 05 lds r25, 0x05AC ; 0x8005ac 18432: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 18436: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 return target_temp_reached; } #endif //PINDA_THERMISTOR void lcd_wait_for_heater() { lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 1843a: 8f ec ldi r24, 0xCF ; 207 1843c: 9b e3 ldi r25, 0x3B ; 59 1843e: 0e 94 44 72 call 0xe488 ; 0xe488 18442: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 18446: 42 e8 ldi r20, 0x82 ; 130 18448: 64 e0 ldi r22, 0x04 ; 4 1844a: 80 e0 ldi r24, 0x00 ; 0 1844c: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder)); 18450: 80 91 b6 0d lds r24, 0x0DB6 ; 0x800db6 18454: 8f 93 push r24 18456: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 1845a: 8f 93 push r24 1845c: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 18460: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 18464: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 18468: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1846c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 18470: 7f 93 push r23 18472: 6f 93 push r22 18474: 3f 92 push r3 18476: 2f 92 push r2 18478: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_putc(LCD_STR_DEGREE[0]); 1847c: 81 e8 ldi r24, 0x81 ; 129 1847e: 0e 94 67 6e call 0xdcce ; 0xdcce 18482: 0f 90 pop r0 18484: 0f 90 pop r0 18486: 0f 90 pop r0 18488: 0f 90 pop r0 1848a: 0f 90 pop r0 1848c: 0f 90 pop r0 setTargetHotend(saved_extruder_temperature); lcd_wait_for_heater(); wait_for_user_state = 2; 1848e: 02 e0 ldi r16, 0x02 ; 2 18490: 91 cf rjmp .-222 ; 0x183b4 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 18492: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 18496: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 1849a: 07 2e mov r0, r23 1849c: 00 0c add r0, r0 1849e: 88 0b sbc r24, r24 184a0: 99 0b sbc r25, r25 184a2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> } break; case 2: //waiting for nozzle to reach target temperature if (fabs(degTargetHotend(active_extruder) - degHotend(active_extruder)) < TEMP_HYSTERESIS) { 184a6: 20 91 af 0d lds r18, 0x0DAF ; 0x800daf 184aa: 30 91 b0 0d lds r19, 0x0DB0 ; 0x800db0 184ae: 40 91 b1 0d lds r20, 0x0DB1 ; 0x800db1 184b2: 50 91 b2 0d lds r21, 0x0DB2 ; 0x800db2 184b6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 184ba: 9f 77 andi r25, 0x7F ; 127 184bc: 20 e0 ldi r18, 0x00 ; 0 184be: 30 e0 ldi r19, 0x00 ; 0 184c0: 40 ea ldi r20, 0xA0 ; 160 184c2: 50 e4 ldi r21, 0x40 ; 64 184c4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 184c8: 87 ff sbrs r24, 7 184ca: 0b c0 rjmp .+22 ; 0x184e2 lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD)); 184cc: 8d e3 ldi r24, 0x3D ; 61 184ce: 98 e3 ldi r25, 0x38 ; 56 184d0: 0e 94 44 72 call 0xe488 ; 0xe488 184d4: 0f 94 c0 20 call 0x24180 ; 0x24180 waiting_start_time = _millis(); 184d8: 0f 94 28 2a call 0x25450 ; 0x25450 184dc: 2b 01 movw r4, r22 184de: 3c 01 movw r6, r24 184e0: 58 cf rjmp .-336 ; 0x18392 wait_for_user_state = 0; } else { lcd_set_cursor(1, 4); 184e2: 64 e0 ldi r22, 0x04 ; 4 184e4: 81 e0 ldi r24, 0x01 ; 1 184e6: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder)); 184ea: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 184ee: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 184f2: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 184f6: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 184fa: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 184fe: 7f 93 push r23 18500: 6f 93 push r22 18502: 9f 92 push r9 18504: 8f 92 push r8 18506: 0e 94 51 6e call 0xdca2 ; 0xdca2 1850a: 0f 90 pop r0 1850c: 0f 90 pop r0 1850e: 0f 90 pop r0 18510: 0f 90 pop r0 18512: 50 cf rjmp .-352 ; 0x183b4 } M600_load_filament(filament_name); } else // MMU is enabled { if (!automatic) mmu_M600_filament_change_screen(eject_slot); 18514: 11 11 cpse r17, r1 18516: 03 c0 rjmp .+6 ; 0x1851e 18518: 8b 2d mov r24, r11 1851a: 0e 94 a7 8c call 0x1194e ; 0x1194e mmu_M600_load_filament(automatic); 1851e: 81 2f mov r24, r17 18520: 0e 94 a6 77 call 0xef4c ; 0xef4c 18524: 07 cf rjmp .-498 ; 0x18334 cursor_pos--; else Sound_MakeSound(e_SOUND_TYPE_BlindAlert); } else if (lcd_encoder > 0) { // Rotating knob clockwise if (cursor_pos < 3) 18526: 03 30 cpi r16, 0x03 ; 3 18528: 10 f4 brcc .+4 ; 0x1852e cursor_pos++; 1852a: 0f 5f subi r16, 0xFF ; 255 1852c: 49 c0 rjmp .+146 ; 0x185c0 else Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1852e: 87 e0 ldi r24, 0x07 ; 7 18530: 0f 94 c8 4e call 0x29d90 ; 0x29d90 18534: 45 c0 rjmp .+138 ; 0x185c0 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); 18536: ce 01 movw r24, r28 18538: 01 96 adiw r24, 0x01 ; 1 1853a: 0e 94 68 72 call 0xe4d0 ; 0xe4d0 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); 1853e: 70 92 be 02 sts 0x02BE, r7 ; 0x8002be uint8_t lcd_alright() { uint8_t cursor_pos = 0; lcd_clear(); 18542: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(1, 0, _T(MSG_CORRECTLY)); 18546: 89 eb ldi r24, 0xB9 ; 185 18548: 98 e3 ldi r25, 0x38 ; 56 1854a: 0e 94 44 72 call 0xe488 ; 0xe488 1854e: ac 01 movw r20, r24 18550: 60 e0 ldi r22, 0x00 ; 0 18552: 81 e0 ldi r24, 0x01 ; 1 18554: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(1, 1, _T(MSG_NOT_LOADED)); 18558: 83 ea ldi r24, 0xA3 ; 163 1855a: 98 e3 ldi r25, 0x38 ; 56 1855c: 0e 94 44 72 call 0xe488 ; 0xe488 18560: ac 01 movw r20, r24 18562: 61 e0 ldi r22, 0x01 ; 1 18564: 81 e0 ldi r24, 0x01 ; 1 18566: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(1, 2, _T(MSG_NOT_COLOR)); 1856a: 8f e8 ldi r24, 0x8F ; 143 1856c: 98 e3 ldi r25, 0x38 ; 56 1856e: 0e 94 44 72 call 0xe488 ; 0xe488 18572: ac 01 movw r20, r24 18574: 62 e0 ldi r22, 0x02 ; 2 18576: 81 e0 ldi r24, 0x01 ; 1 18578: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(1, 3, _T(MSG_UNLOAD_FILAMENT)); 1857c: 82 e4 ldi r24, 0x42 ; 66 1857e: 96 e4 ldi r25, 0x46 ; 70 18580: 0e 94 44 72 call 0xe488 ; 0xe488 18584: ac 01 movw r20, r24 18586: 63 e0 ldi r22, 0x03 ; 3 18588: 81 e0 ldi r24, 0x01 ; 1 1858a: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc_at(0, cursor_pos, '>'); 1858e: 4e e3 ldi r20, 0x3E ; 62 18590: 60 e0 ldi r22, 0x00 ; 0 18592: 80 e0 ldi r24, 0x00 ; 0 18594: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_consume_click(); 18598: 0e 94 90 70 call 0xe120 ; 0xe120 uint8_t lcd_alright() { uint8_t cursor_pos = 0; 1859c: 00 e0 ldi r16, 0x00 ; 0 lcd_putc_at(0, cursor_pos, '>'); lcd_consume_click(); while (1) { manage_heater(); 1859e: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 185a2: 81 e0 ldi r24, 0x01 ; 1 185a4: 0e 94 4f 8a call 0x1149e ; 0x1149e if (lcd_encoder) 185a8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 185ac: 90 91 70 06 lds r25, 0x0670 ; 0x800670 185b0: 00 97 sbiw r24, 0x00 ; 0 185b2: d9 f0 breq .+54 ; 0x185ea { if (lcd_encoder < 0 ) { 185b4: 97 ff sbrs r25, 7 185b6: b7 cf rjmp .-146 ; 0x18526 // Rotating knob counter clockwise if (cursor_pos > 0) 185b8: 00 23 and r16, r16 185ba: 09 f4 brne .+2 ; 0x185be 185bc: b8 cf rjmp .-144 ; 0x1852e cursor_pos--; 185be: 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 ")); 185c0: 46 e3 ldi r20, 0x36 ; 54 185c2: 5e e7 ldi r21, 0x7E ; 126 185c4: 60 e0 ldi r22, 0x00 ; 0 185c6: 80 e0 ldi r24, 0x00 ; 0 185c8: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc_at(0, cursor_pos, '>'); 185cc: 4e e3 ldi r20, 0x3E ; 62 185ce: 60 2f mov r22, r16 185d0: 80 e0 ldi r24, 0x00 ; 0 185d2: 0e 94 98 6e call 0xdd30 ; 0xdd30 // Consume rotation event and make feedback sound lcd_encoder = 0; 185d6: 10 92 70 06 sts 0x0670, r1 ; 0x800670 185da: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f _delay(100); 185de: 64 e6 ldi r22, 0x64 ; 100 185e0: 70 e0 ldi r23, 0x00 ; 0 185e2: 80 e0 ldi r24, 0x00 ; 0 185e4: 90 e0 ldi r25, 0x00 ; 0 185e6: 0f 94 2f 28 call 0x2505e ; 0x2505e } if (lcd_clicked()) 185ea: 0e 94 95 70 call 0xe12a ; 0xe12a 185ee: 88 23 and r24, r24 185f0: b1 f2 breq .-84 ; 0x1859e { lcd_clear(); 185f2: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_return_to_status(); 185f6: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_change_filament_state = lcd_alright(); KEEPALIVE_STATE(IN_HANDLER); 185fa: a0 92 be 02 sts 0x02BE, r10 ; 0x8002be switch(lcd_change_filament_state) 185fe: 02 30 cpi r16, 0x02 ; 2 18600: b1 f0 breq .+44 ; 0x1862e 18602: 03 30 cpi r16, 0x03 ; 3 18604: 09 f4 brne .+2 ; 0x18608 18606: f8 c0 rjmp .+496 ; 0x187f8 18608: 01 30 cpi r16, 0x01 ; 1 1860a: 81 f5 brne .+96 ; 0x1866c { // Filament failed to load so load it again case 1: if (MMU2::mmu2.Enabled()) { 1860c: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 18610: 81 30 cpi r24, 0x01 ; 1 18612: 09 f0 breq .+2 ; 0x18616 18614: 90 cf rjmp .-224 ; 0x18536 uint8_t eject_slot = MMU2::mmu2.get_current_tool(); 18616: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 1861a: 08 2f mov r16, r24 // Unload filament mmu_M600_unload_filament(); 1861c: 0e 94 af 72 call 0xe55e ; 0xe55e // Ask to remove any old filament and load new mmu_M600_filament_change_screen(eject_slot); 18620: 80 2f mov r24, r16 18622: 0e 94 a7 8c call 0x1194e ; 0x1194e // After user clicks knob, MMU will load the filament mmu_M600_load_filament(false); 18626: 80 e0 ldi r24, 0x00 ; 0 18628: 0e 94 a6 77 call 0xef4c ; 0xef4c 1862c: 88 cf rjmp .-240 ; 0x1853e } break; // Filament loaded properly but color is not clear case 2: st_synchronize(); 1862e: 0f 94 a9 43 call 0x28752 ; 0x28752 load_filament_final_feed(); 18632: 0e 94 2b 64 call 0xc856 ; 0xc856 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(); 18636: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_LOADING_COLOR)); 1863a: 8d ec ldi r24, 0xCD ; 205 1863c: 98 e3 ldi r25, 0x38 ; 56 1863e: 0e 94 44 72 call 0xe488 ; 0xe488 18642: ac 01 movw r20, r24 18644: 60 e0 ldi r22, 0x00 ; 0 18646: 80 e0 ldi r24, 0x00 ; 0 18648: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); 1864c: 89 e9 ldi r24, 0x99 ; 153 1864e: 99 e3 ldi r25, 0x39 ; 57 18650: 0e 94 44 72 call 0xe488 ; 0xe488 18654: ac 01 movw r20, r24 18656: 62 e0 ldi r22, 0x02 ; 2 18658: 80 e0 ldi r24, 0x00 ; 0 1865a: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_loading_progress_bar((FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL); //show progress bar during filament loading slow sequence 1865e: 87 e9 ldi r24, 0x97 ; 151 18660: 9d e1 ldi r25, 0x1D ; 29 18662: 0f 94 4b 21 call 0x24296 ; 0x24296 lcd_loading_color(); st_synchronize(); 18666: 0f 94 a9 43 call 0x28752 ; 0x28752 1866a: 69 cf rjmp .-302 ; 0x1853e } void lcd_change_success() { lcd_clear(); 1866c: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS)); 18670: 8d ed ldi r24, 0xDD ; 221 18672: 98 e3 ldi r25, 0x38 ; 56 18674: 0e 94 44 72 call 0xe488 ; 0xe488 18678: ac 01 movw r20, r24 1867a: 62 e0 ldi r22, 0x02 ; 2 1867c: 80 e0 ldi r24, 0x00 ; 0 1867e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 //! @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) 18682: 00 23 and r16, r16 18684: 19 f0 breq .+6 ; 0x1868c 18686: 03 30 cpi r16, 0x03 ; 3 18688: 09 f0 breq .+2 ; 0x1868c 1868a: 59 cf rjmp .-334 ; 0x1853e 1868c: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 if (!automatic) repeat = M600_check_state_and_repeat(filament_name); } while (repeat); lcd_update_enable(true); 18690: 81 e0 ldi r24, 0x01 ; 1 18692: 0e 94 bd 6e call 0xdd7a ; 0xdd7a // Not let's go back to print fanSpeed = saved_fan_speed; 18696: 80 91 aa 05 lds r24, 0x05AA ; 0x8005aa 1869a: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 // Feed a little of filament to stabilize pressure if (!automatic) { 1869e: 11 11 cpse r17, r1 186a0: 27 c0 rjmp .+78 ; 0x186f0 if (printingIsPaused()) 186a2: 0e 94 1d 67 call 0xce3a ; 0xce3a 186a6: c0 90 9d 06 lds r12, 0x069D ; 0x80069d 186aa: d0 90 9e 06 lds r13, 0x069E ; 0x80069e 186ae: e0 90 9f 06 lds r14, 0x069F ; 0x80069f 186b2: f0 90 a0 06 lds r15, 0x06A0 ; 0x8006a0 186b6: 88 23 and r24, r24 186b8: 09 f4 brne .+2 ; 0x186bc 186ba: a3 c0 rjmp .+326 ; 0x18802 { // 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; 186bc: 20 e0 ldi r18, 0x00 ; 0 186be: 30 e0 ldi r19, 0x00 ; 0 186c0: 40 e8 ldi r20, 0x80 ; 128 186c2: 5f e3 ldi r21, 0x3F ; 63 186c4: c7 01 movw r24, r14 186c6: b6 01 movw r22, r12 186c8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 186cc: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 186d0: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 186d4: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 186d8: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED); 186dc: 60 e0 ldi r22, 0x00 ; 0 186de: 70 e0 ldi r23, 0x00 ; 0 186e0: 88 ee ldi r24, 0xE8 ; 232 186e2: 92 e4 ldi r25, 0x42 ; 66 186e4: 0f 94 3d c0 call 0x3807a ; 0x3807a return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 186e8: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 186ec: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 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); 186f0: e0 90 99 06 lds r14, 0x0699 ; 0x800699 186f4: f0 90 9a 06 lds r15, 0x069A ; 0x80069a 186f8: 00 91 9b 06 lds r16, 0x069B ; 0x80069b 186fc: 10 91 9c 06 lds r17, 0x069C ; 0x80069c 18700: 20 91 77 02 lds r18, 0x0277 ; 0x800277 18704: 30 91 78 02 lds r19, 0x0278 ; 0x800278 18708: 40 91 79 02 lds r20, 0x0279 ; 0x800279 1870c: 50 91 7a 02 lds r21, 0x027A ; 0x80027a 18710: 60 91 73 02 lds r22, 0x0273 ; 0x800273 18714: 70 91 74 02 lds r23, 0x0274 ; 0x800274 18718: 80 91 75 02 lds r24, 0x0275 ; 0x800275 1871c: 90 91 76 02 lds r25, 0x0276 ; 0x800276 18720: 1f 92 push r1 18722: 1f 92 push r1 18724: 1f 92 push r1 18726: 1f 92 push r1 18728: 81 2c mov r8, r1 1872a: 91 2c mov r9, r1 1872c: e8 e4 ldi r30, 0x48 ; 72 1872e: ae 2e mov r10, r30 18730: e2 e4 ldi r30, 0x42 ; 66 18732: be 2e mov r11, r30 18734: fd e9 ldi r31, 0x9D ; 157 18736: cf 2e mov r12, r31 18738: f6 e0 ldi r31, 0x06 ; 6 1873a: df 2e mov r13, r31 1873c: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 st_synchronize(); 18740: 0f 94 a9 43 call 0x28752 ; 0x28752 // Move Z back plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED); 18744: e0 90 7b 02 lds r14, 0x027B ; 0x80027b 18748: f0 90 7c 02 lds r15, 0x027C ; 0x80027c 1874c: 00 91 7d 02 lds r16, 0x027D ; 0x80027d 18750: 10 91 7e 02 lds r17, 0x027E ; 0x80027e 18754: 20 91 77 02 lds r18, 0x0277 ; 0x800277 18758: 30 91 78 02 lds r19, 0x0278 ; 0x800278 1875c: 40 91 79 02 lds r20, 0x0279 ; 0x800279 18760: 50 91 7a 02 lds r21, 0x027A ; 0x80027a 18764: 60 91 73 02 lds r22, 0x0273 ; 0x800273 18768: 70 91 74 02 lds r23, 0x0274 ; 0x800274 1876c: 80 91 75 02 lds r24, 0x0275 ; 0x800275 18770: 90 91 76 02 lds r25, 0x0276 ; 0x800276 18774: 1f 92 push r1 18776: 1f 92 push r1 18778: 1f 92 push r1 1877a: 1f 92 push r1 1877c: 81 2c mov r8, r1 1877e: 91 2c mov r9, r1 18780: a0 e7 ldi r26, 0x70 ; 112 18782: aa 2e mov r10, r26 18784: a1 e4 ldi r26, 0x41 ; 65 18786: ba 2e mov r11, r26 18788: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 st_synchronize(); 1878c: 0f 94 a9 43 call 0x28752 ; 0x28752 // Set E position to original plan_set_e_position(saved_pos[E_AXIS]); 18790: 8f e7 ldi r24, 0x7F ; 127 18792: 92 e0 ldi r25, 0x02 ; 2 18794: 0f 94 b5 64 call 0x2c96a ; 0x2c96a memcpy(current_position, saved_pos, sizeof(saved_pos)); 18798: 80 e1 ldi r24, 0x10 ; 16 1879a: e3 e7 ldi r30, 0x73 ; 115 1879c: f2 e0 ldi r31, 0x02 ; 2 1879e: a1 e9 ldi r26, 0x91 ; 145 187a0: b6 e0 ldi r27, 0x06 ; 6 187a2: 01 90 ld r0, Z+ 187a4: 0d 92 st X+, r0 187a6: 8a 95 dec r24 187a8: e1 f7 brne .-8 ; 0x187a2 set_destination_to_current(); 187aa: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 // Recover feed rate feedmultiply = saved_feedmultiply2; 187ae: 80 91 6f 03 lds r24, 0x036F ; 0x80036f 187b2: 90 91 70 03 lds r25, 0x0370 ; 0x800370 187b6: 80 93 39 02 sts 0x0239, r24 ; 0x800239 187ba: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a enquecommandf_P(MSG_M220, saved_feedmultiply2); 187be: 9f 93 push r25 187c0: 8f 93 push r24 187c2: 8c eb ldi r24, 0xBC ; 188 187c4: 9d e6 ldi r25, 0x6D ; 109 187c6: 9f 93 push r25 187c8: 8f 93 push r24 187ca: 0e 94 56 88 call 0x110ac ; 0x110ac if (printingIsPaused()) { 187ce: 0e 94 1d 67 call 0xce3a ; 0xce3a 187d2: 0f b6 in r0, 0x3f ; 63 187d4: f8 94 cli 187d6: de bf out 0x3e, r29 ; 62 187d8: 0f be out 0x3f, r0 ; 63 187da: cd bf out 0x3d, r28 ; 61 187dc: 88 23 and r24, r24 187de: 41 f1 breq .+80 ; 0x18830 lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); 187e0: 8c ef ldi r24, 0xFC ; 252 187e2: 99 e4 ldi r25, 0x49 ; 73 187e4: 0e 94 44 72 call 0xe488 ; 0xe488 187e8: 0e 94 16 f2 call 0x1e42c ; 0x1e42c } else { lcd_setstatuspgm(MSG_WELCOME); SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED); } custom_message_type = CustomMsg::Status; 187ec: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 void clear_print_state_in_ram() { // Set flag to false in order to avoid using // the saved values during power panic isPartialBackupAvailable = false; 187f0: 10 92 a1 06 sts 0x06A1, r1 ; 0x8006a1 187f4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 st_synchronize(); break; // Unload filament case 3: return true; 187f8: 31 e0 ldi r19, 0x01 ; 1 187fa: 67 96 adiw r28, 0x17 ; 23 187fc: 3f af std Y+63, r19 ; 0x3f 187fe: 67 97 sbiw r28, 0x17 ; 23 18800: 9e cd rjmp .-1220 ; 0x1833e setTargetHotend(0); } else { // Feed a little of filament to stabilize pressure current_position[E_AXIS] += FILAMENTCHANGE_RECFEED; 18802: 20 e0 ldi r18, 0x00 ; 0 18804: 30 e0 ldi r19, 0x00 ; 0 18806: 40 ea ldi r20, 0xA0 ; 160 18808: 50 e4 ldi r21, 0x40 ; 64 1880a: c7 01 movw r24, r14 1880c: b6 01 movw r22, r12 1880e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 18812: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 18816: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 1881a: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 1881e: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED); 18822: 60 e0 ldi r22, 0x00 ; 0 18824: 70 e0 ldi r23, 0x00 ; 0 18826: 80 e0 ldi r24, 0x00 ; 0 18828: 90 e4 ldi r25, 0x40 ; 64 1882a: 0f 94 3d c0 call 0x3807a ; 0x3807a 1882e: 60 cf rjmp .-320 ; 0x186f0 if (printingIsPaused()) { lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); } else { lcd_setstatuspgm(MSG_WELCOME); 18830: 82 e1 ldi r24, 0x12 ; 18 18832: 90 e7 ldi r25, 0x70 ; 112 18834: 0e 94 16 f2 call 0x1e42c ; 0x1e42c SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED); 18838: 89 e8 ldi r24, 0x89 ; 137 1883a: 9a e6 ldi r25, 0x6A ; 106 1883c: 0e 94 13 79 call 0xf226 ; 0xf226 18840: d5 cf rjmp .-86 ; 0x187ec SERIAL_ECHOPGM("Y:"); SERIAL_ECHOLN(pause_position[Y_AXIS]); SERIAL_ECHOPGM("Z:"); SERIAL_ECHOLN(pause_position[Z_AXIS]); */ if (!printingIsPaused()) { 18842: 0e 94 1d 67 call 0xce3a ; 0xce3a 18846: 81 11 cpse r24, r1 18848: 0c 94 83 b0 jmp 0x16106 ; 0x16106 st_synchronize(); 1884c: 0f 94 a9 43 call 0x28752 ; 0x28752 ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front(); 18850: 0e 94 c2 7e call 0xfd84 ; 0xfd84 cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore 18854: 0e 94 54 76 call 0xeca8 ; 0xeca8 lcd_pause_print(); 18858: 0f 94 34 2a call 0x25468 ; 0x25468 1885c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 /*! ### M602 - Resume print M602: Resume print */ case 602: { if (printingIsPaused()) lcd_resume_print(); 18860: 0e 94 1d 67 call 0xce3a ; 0xce3a 18864: 88 23 and r24, r24 18866: 11 f4 brne .+4 ; 0x1886c 18868: 0c 94 83 b0 jmp 0x16106 ; 0x16106 1886c: 0c 94 4b b1 jmp 0x16296 ; 0x16296 /*! ### M603 - Stop print M603: Stop print */ case 603: { print_stop(); 18870: 60 e0 ldi r22, 0x00 ; 0 18872: 80 e0 ldi r24, 0x00 ; 0 18874: 0e 94 53 f5 call 0x1eaa6 ; 0x1eaa6 18878: 0c 94 83 b0 jmp 0x16106 ; 0x16106 float z_val = 0; char strLabel[8]; uint8_t iBedC = 0; uint8_t iPindaC = 0; bool bIsActive=false; strLabel[7] = '\0'; // null terminate. 1887c: 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')) { 1887e: 83 e5 ldi r24, 0x53 ; 83 18880: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18884: 88 23 and r24, r24 18886: b1 f0 breq .+44 ; 0x188b4 iSel = code_value_uint8(); 18888: 0e 94 00 5b call 0xb600 ; 0xb600 1888c: 18 2f mov r17, r24 if (iSel>=max_sheets) 1888e: 88 30 cpi r24, 0x08 ; 8 18890: b0 f0 brcs .+44 ; 0x188be { SERIAL_PROTOCOLPGM("Invalid sheet ID. Allowed: 0.."); 18892: 8c eb ldi r24, 0xBC ; 188 18894: 95 e8 ldi r25, 0x85 ; 133 18896: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 1889a: 4a e0 ldi r20, 0x0A ; 10 1889c: 67 e0 ldi r22, 0x07 ; 7 1889e: 70 e0 ldi r23, 0x00 ; 0 188a0: 80 e0 ldi r24, 0x00 ; 0 188a2: 90 e0 ldi r25, 0x00 ; 0 188a4: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 SERIAL_PROTOCOL(max_sheets-1); SERIAL_PROTOCOLLN(""); 188a8: 86 ef ldi r24, 0xF6 ; 246 188aa: 92 e0 ldi r25, 0x02 ; 2 188ac: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 188b0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 break; // invalid sheet ID } } else { iSel = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 188b4: 81 ea ldi r24, 0xA1 ; 161 188b6: 9d e0 ldi r25, 0x0D ; 13 188b8: 0f 94 10 dc call 0x3b820 ; 0x3b820 188bc: 18 2f mov r17, r24 } if (code_seen('Z')){ 188be: 8a e5 ldi r24, 0x5A ; 90 188c0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 188c4: 88 23 and r24, r24 188c6: 09 f4 brne .+2 ; 0x188ca 188c8: d7 c0 rjmp .+430 ; 0x18a78 z_val = code_value(); 188ca: 0e 94 35 60 call 0xc06a ; 0xc06a 188ce: 2b 01 movw r4, r22 188d0: 3c 01 movw r6, r24 zraw = z_val*cs.axis_steps_per_mm[Z_AXIS]; 188d2: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 188d6: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 188da: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 188de: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 188e2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 188e6: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 188ea: 6b 01 movw r12, r22 if ((zraw < Z_BABYSTEP_MIN) || (zraw > Z_BABYSTEP_MAX)) 188ec: 9b 01 movw r18, r22 188ee: 21 56 subi r18, 0x61 ; 97 188f0: 30 4f sbci r19, 0xF0 ; 240 188f2: 20 3a cpi r18, 0xA0 ; 160 188f4: 3f 40 sbci r19, 0x0F ; 15 188f6: 30 f0 brcs .+12 ; 0x18904 { SERIAL_PROTOCOLLNPGM(" Z VALUE OUT OF RANGE"); 188f8: 86 ea ldi r24, 0xA6 ; 166 188fa: 95 e8 ldi r25, 0x85 ; 133 188fc: 0e 94 13 79 call 0xf226 ; 0xf226 18900: 0c 94 83 b0 jmp 0x16106 ; 0x16106 break; } eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw); 18904: 5b e0 ldi r21, 0x0B ; 11 18906: 15 9f mul r17, r21 18908: 90 01 movw r18, r0 1890a: 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); 1890c: c9 01 movw r24, r18 1890e: 80 5b subi r24, 0xB0 ; 176 18910: 92 4f sbci r25, 0xF2 ; 242 18912: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 { 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')) 18916: 8c e4 ldi r24, 0x4C ; 76 18918: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1891c: bb e0 ldi r27, 0x0B ; 11 1891e: 1b 9f mul r17, r27 18920: 70 01 movw r14, r0 18922: 11 24 eor r1, r1 18924: 57 01 movw r10, r14 18926: e7 eb ldi r30, 0xB7 ; 183 18928: ae 1a sub r10, r30 1892a: e2 ef ldi r30, 0xF2 ; 242 1892c: be 0a sbc r11, r30 1892e: 88 23 and r24, r24 18930: 09 f4 brne .+2 ; 0x18934 18932: be c0 rjmp .+380 ; 0x18ab0 { char *src = strchr_pointer + 1; 18934: e0 91 93 03 lds r30, 0x0393 ; 0x800393 18938: f0 91 94 03 lds r31, 0x0394 ; 0x800394 1893c: 31 96 adiw r30, 0x01 ; 1 1893e: bf 01 movw r22, r30 while (*src == ' ') ++src; 18940: 81 91 ld r24, Z+ 18942: 80 32 cpi r24, 0x20 ; 32 18944: e1 f3 breq .-8 ; 0x1893e if (*src != '\0') 18946: 88 23 and r24, r24 18948: 31 f0 breq .+12 ; 0x18956 { strncpy(strLabel,src,7); 1894a: 47 e0 ldi r20, 0x07 ; 7 1894c: 50 e0 ldi r21, 0x00 ; 0 1894e: ce 01 movw r24, r28 18950: 01 96 adiw r24, 0x01 ; 1 18952: 0f 94 90 e2 call 0x3c520 ; 0x3c520 #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); 18956: 47 e0 ldi r20, 0x07 ; 7 18958: 50 e0 ldi r21, 0x00 ; 0 1895a: b5 01 movw r22, r10 1895c: ce 01 movw r24, r28 1895e: 01 96 adiw r24, 0x01 ; 1 18960: 0f 94 24 dc call 0x3b848 ; 0x3b848 else { eeprom_read_block(strLabel, EEPROM_Sheets_base->s[iSel].name, sizeof(Sheet::name)); } if (code_seen('B')) 18964: 82 e4 ldi r24, 0x42 ; 66 18966: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1896a: 57 01 movw r10, r14 1896c: fe ea ldi r31, 0xAE ; 174 1896e: af 1a sub r10, r31 18970: f2 ef ldi r31, 0xF2 ; 242 18972: bf 0a sbc r11, r31 18974: 88 23 and r24, r24 18976: 09 f4 brne .+2 ; 0x1897a 18978: a3 c0 rjmp .+326 ; 0x18ac0 { iBedC = code_value_uint8(); 1897a: 0e 94 00 5b call 0xb600 ; 0xb600 1897e: 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); 18980: 68 2f mov r22, r24 18982: c5 01 movw r24, r10 18984: 0f 94 34 dc call 0x3b868 ; 0x3b868 else { iBedC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].bed_temp); } if (code_seen('P')) 18988: 80 e5 ldi r24, 0x50 ; 80 1898a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1898e: 2d ea ldi r18, 0xAD ; 173 18990: e2 1a sub r14, r18 18992: 22 ef ldi r18, 0xF2 ; 242 18994: f2 0a sbc r15, r18 18996: 88 23 and r24, r24 18998: 09 f4 brne .+2 ; 0x1899c 1899a: 97 c0 rjmp .+302 ; 0x18aca { iPindaC = code_value_uint8(); 1899c: 0e 94 00 5b call 0xb600 ; 0xb600 189a0: b8 2e mov r11, r24 189a2: 68 2f mov r22, r24 189a4: c7 01 movw r24, r14 189a6: 0f 94 34 dc call 0x3b868 ; 0x3b868 else { iPindaC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].pinda_temp); } if (code_seen('A')) 189aa: 81 e4 ldi r24, 0x41 ; 65 189ac: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 189b0: 88 23 and r24, r24 189b2: 09 f4 brne .+2 ; 0x189b6 189b4: 8f c0 rjmp .+286 ; 0x18ad4 { bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); 189b6: 0e 94 00 5b call 0xb600 ; 0xb600 189ba: 81 11 cpse r24, r1 189bc: 06 c0 rjmp .+12 ; 0x189ca 189be: 81 ea ldi r24, 0xA1 ; 161 189c0: 9d e0 ldi r25, 0x0D ; 13 189c2: 0f 94 10 dc call 0x3b820 ; 0x3b820 189c6: 18 13 cpse r17, r24 189c8: 8d c0 rjmp .+282 ; 0x18ae4 if(bIsActive && eeprom_is_sheet_initialized(iSel)) { 189ca: 81 2f mov r24, r17 189cc: 0e 94 d9 75 call 0xebb2 ; 0xebb2 189d0: 08 2f mov r16, r24 189d2: 88 23 and r24, r24 189d4: 29 f0 breq .+10 ; 0x189e0 189d6: 61 2f mov r22, r17 189d8: 81 ea ldi r24, 0xA1 ; 161 189da: 9d e0 ldi r25, 0x0D ; 13 189dc: 0f 94 34 dc call 0x3b868 ; 0x3b868 else { bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); } SERIAL_PROTOCOLPGM("Sheet "); 189e0: 8f e9 ldi r24, 0x9F ; 159 189e2: 95 e8 ldi r25, 0x85 ; 133 189e4: 0e 94 e8 76 call 0xedd0 ; 0xedd0 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 189e8: 61 2f mov r22, r17 189ea: 70 e0 ldi r23, 0x00 ; 0 189ec: 90 e0 ldi r25, 0x00 ; 0 189ee: 80 e0 ldi r24, 0x00 ; 0 189f0: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL((int)iSel); if (!eeprom_is_sheet_initialized(iSel)) 189f4: 81 2f mov r24, r17 189f6: 0e 94 d9 75 call 0xebb2 ; 0xebb2 189fa: 81 11 cpse r24, r1 189fc: 04 c0 rjmp .+8 ; 0x18a06 SERIAL_PROTOCOLLNPGM(" NOT INITIALIZED"); 189fe: 8e e8 ldi r24, 0x8E ; 142 18a00: 95 e8 ldi r25, 0x85 ; 133 18a02: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_PROTOCOLPGM(" Z"); 18a06: 8b e8 ldi r24, 0x8B ; 139 18a08: 95 e8 ldi r25, 0x85 ; 133 18a0a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 18a0e: 44 e0 ldi r20, 0x04 ; 4 18a10: c3 01 movw r24, r6 18a12: b2 01 movw r22, r4 18a14: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(z_val,4); SERIAL_PROTOCOLPGM(" R"); 18a18: 88 e8 ldi r24, 0x88 ; 136 18a1a: 95 e8 ldi r25, 0x85 ; 133 18a1c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 18a20: b6 01 movw r22, r12 18a22: dd 0c add r13, r13 18a24: 88 0b sbc r24, r24 18a26: 99 0b sbc r25, r25 18a28: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL((int)zraw); SERIAL_PROTOCOLPGM(" L"); 18a2c: 85 e8 ldi r24, 0x85 ; 133 18a2e: 95 e8 ldi r25, 0x85 ; 133 18a30: 0e 94 e8 76 call 0xedd0 ; 0xedd0 18a34: ce 01 movw r24, r28 18a36: 01 96 adiw r24, 0x01 ; 1 18a38: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_PROTOCOL(strLabel); SERIAL_PROTOCOLPGM(" B"); 18a3c: 82 e8 ldi r24, 0x82 ; 130 18a3e: 95 e8 ldi r25, 0x85 ; 133 18a40: 0e 94 e8 76 call 0xedd0 ; 0xedd0 18a44: 69 2d mov r22, r9 18a46: 70 e0 ldi r23, 0x00 ; 0 18a48: 90 e0 ldi r25, 0x00 ; 0 18a4a: 80 e0 ldi r24, 0x00 ; 0 18a4c: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL((int)iBedC); SERIAL_PROTOCOLPGM(" P"); 18a50: 8f e7 ldi r24, 0x7F ; 127 18a52: 95 e8 ldi r25, 0x85 ; 133 18a54: 0e 94 e8 76 call 0xedd0 ; 0xedd0 18a58: 6b 2d mov r22, r11 18a5a: 70 e0 ldi r23, 0x00 ; 0 18a5c: 90 e0 ldi r25, 0x00 ; 0 18a5e: 80 e0 ldi r24, 0x00 ; 0 18a60: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL((int)iPindaC); SERIAL_PROTOCOLPGM(" A"); 18a64: 8c e7 ldi r24, 0x7C ; 124 18a66: 95 e8 ldi r25, 0x85 ; 133 18a68: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN((int)bIsActive); 18a6c: 80 2f mov r24, r16 18a6e: 90 e0 ldi r25, 0x00 ; 0 18a70: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 18a74: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } 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))); 18a78: ab e0 ldi r26, 0x0B ; 11 18a7a: 1a 9f mul r17, r26 18a7c: c0 01 movw r24, r0 18a7e: 11 24 eor r1, r1 18a80: 80 5b subi r24, 0xB0 ; 176 18a82: 92 4f sbci r25, 0xF2 ; 242 18a84: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18a88: 6c 01 movw r12, r24 z_val = ((float)zraw/cs.axis_steps_per_mm[Z_AXIS]); 18a8a: bc 01 movw r22, r24 18a8c: 99 0f add r25, r25 18a8e: 88 0b sbc r24, r24 18a90: 99 0b sbc r25, r25 18a92: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 18a96: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 18a9a: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 18a9e: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 18aa2: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 18aa6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 18aaa: 2b 01 movw r4, r22 18aac: 3c 01 movw r6, r24 18aae: 33 cf rjmp .-410 ; 0x18916 } 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)); 18ab0: 47 e0 ldi r20, 0x07 ; 7 18ab2: 50 e0 ldi r21, 0x00 ; 0 18ab4: b5 01 movw r22, r10 18ab6: ce 01 movw r24, r28 18ab8: 01 96 adiw r24, 0x01 ; 1 18aba: 0f 94 00 dc call 0x3b800 ; 0x3b800 18abe: 52 cf rjmp .-348 ; 0x18964 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); 18ac0: c5 01 movw r24, r10 18ac2: 0f 94 10 dc call 0x3b820 ; 0x3b820 18ac6: 98 2e mov r9, r24 18ac8: 5f cf rjmp .-322 ; 0x18988 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); 18aca: c7 01 movw r24, r14 18acc: 0f 94 10 dc call 0x3b820 ; 0x3b820 18ad0: b8 2e mov r11, r24 18ad2: 6b cf rjmp .-298 ; 0x189aa bIsActive = 0; } } else { bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel); 18ad4: 81 ea ldi r24, 0xA1 ; 161 18ad6: 9d e0 ldi r25, 0x0D ; 13 18ad8: 0f 94 10 dc call 0x3b820 ; 0x3b820 18adc: 01 e0 ldi r16, 0x01 ; 1 18ade: 18 17 cp r17, r24 18ae0: 09 f4 brne .+2 ; 0x18ae4 18ae2: 7e cf rjmp .-260 ; 0x189e0 { 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; 18ae4: 00 e0 ldi r16, 0x00 ; 0 18ae6: 7c cf rjmp .-264 ; 0x189e0 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)) ) { 18ae8: c3 01 movw r24, r6 18aea: b2 01 movw r22, r4 18aec: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 18af0: 20 91 97 03 lds r18, 0x0397 ; 0x800397 18af4: 30 91 98 03 lds r19, 0x0398 ; 0x800398 18af8: 40 91 99 03 lds r20, 0x0399 ; 0x800399 18afc: 50 91 9a 03 lds r21, 0x039A ; 0x80039a 18b00: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 18b04: 87 fd sbrc r24, 7 18b06: 02 c0 rjmp .+4 ; 0x18b0c 18b08: 0c 94 6c b0 jmp 0x160d8 ; 0x160d8 if ((_millis() - codenum) > 1000) //Print Temp Reading every 1 second while waiting. 18b0c: 0f 94 28 2a call 0x25450 ; 0x25450 18b10: 68 19 sub r22, r8 18b12: 79 09 sbc r23, r9 18b14: 8a 09 sbc r24, r10 18b16: 9b 09 sbc r25, r11 18b18: 69 3e cpi r22, 0xE9 ; 233 18b1a: 73 40 sbci r23, 0x03 ; 3 18b1c: 81 05 cpc r24, r1 18b1e: 91 05 cpc r25, r1 18b20: c8 f0 brcs .+50 ; 0x18b54 { SERIAL_PROTOCOLPGM("P:"); 18b22: 86 e5 ldi r24, 0x56 ; 86 18b24: 95 e8 ldi r25, 0x85 ; 133 18b26: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 18b2a: 60 91 97 03 lds r22, 0x0397 ; 0x800397 18b2e: 70 91 98 03 lds r23, 0x0398 ; 0x800398 18b32: 80 91 99 03 lds r24, 0x0399 ; 0x800399 18b36: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 18b3a: 41 e0 ldi r20, 0x01 ; 1 18b3c: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 18b40: 8f e2 ldi r24, 0x2F ; 47 18b42: 0e 94 cf 76 call 0xed9e ; 0xed9e SERIAL_PROTOCOL_F(current_temperature_pinda, 1); SERIAL_PROTOCOL('/'); SERIAL_PROTOCOLLN(set_target_pinda); 18b46: c8 01 movw r24, r16 18b48: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 codenum = _millis(); 18b4c: 0f 94 28 2a call 0x25450 ; 0x25450 18b50: 4b 01 movw r8, r22 18b52: 5c 01 movw r10, r24 } manage_heater(); 18b54: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 18b58: 80 e0 ldi r24, 0x00 ; 0 18b5a: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 18b5e: 80 e0 ldi r24, 0x00 ; 0 18b60: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 18b64: 0c 94 53 b0 jmp 0x160a6 ; 0x160a6 - `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 18b68: 8f e3 ldi r24, 0x3F ; 63 18b6a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18b6e: 88 23 and r24, r24 18b70: c9 f0 breq .+50 ; 0x18ba4 SERIAL_PROTOCOLPGM("PINDA cal status: "); 18b72: 83 e4 ldi r24, 0x43 ; 67 18b74: 95 e8 ldi r25, 0x85 ; 133 18b76: 0e 94 e8 76 call 0xedd0 ; 0xedd0 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); } 18b7a: 86 ea ldi r24, 0xA6 ; 166 18b7c: 9f e0 ldi r25, 0x0F ; 15 18b7e: 0f 94 10 dc call 0x3b820 ; 0x3b820 18b82: 21 e0 ldi r18, 0x01 ; 1 18b84: 30 e0 ldi r19, 0x00 ; 0 18b86: 81 11 cpse r24, r1 18b88: 02 c0 rjmp .+4 ; 0x18b8e 18b8a: 30 e0 ldi r19, 0x00 ; 0 18b8c: 20 e0 ldi r18, 0x00 ; 0 SERIAL_PROTOCOLLN(calibration_status_pinda()); 18b8e: c9 01 movw r24, r18 18b90: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 SERIAL_PROTOCOLLNRPGM(_header); 18b94: 8c e2 ldi r24, 0x2C ; 44 18b96: 95 e8 ldi r25, 0x85 ; 133 18b98: 0e 94 13 79 call 0xf226 ; 0xf226 gcode_M861_print_pinda_cal_eeprom(); 18b9c: 0e 94 20 77 call 0xee40 ; 0xee40 18ba0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else if (code_seen('!')) { // ! - Set factory default values 18ba4: 81 e2 ldi r24, 0x21 ; 33 18ba6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18baa: 88 23 and r24, r24 18bac: 49 f1 breq .+82 ; 0x18c00 18bae: 61 e0 ldi r22, 0x01 ; 1 18bb0: 86 ea ldi r24, 0xA6 ; 166 18bb2: 9f e0 ldi r25, 0x0F ; 15 18bb4: 0f 94 34 dc call 0x3b868 ; 0x3b868 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 18bb8: 68 e0 ldi r22, 0x08 ; 8 18bba: 70 e0 ldi r23, 0x00 ; 0 18bbc: 80 eb ldi r24, 0xB0 ; 176 18bbe: 9f e0 ldi r25, 0x0F ; 15 18bc0: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 18bc4: 68 e1 ldi r22, 0x18 ; 24 18bc6: 70 e0 ldi r23, 0x00 ; 0 18bc8: 82 eb ldi r24, 0xB2 ; 178 18bca: 9f e0 ldi r25, 0x0F ; 15 18bcc: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 18bd0: 60 e3 ldi r22, 0x30 ; 48 18bd2: 70 e0 ldi r23, 0x00 ; 0 18bd4: 84 eb ldi r24, 0xB4 ; 180 18bd6: 9f e0 ldi r25, 0x0F ; 15 18bd8: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 18bdc: 60 e5 ldi r22, 0x50 ; 80 18bde: 70 e0 ldi r23, 0x00 ; 0 18be0: 86 eb ldi r24, 0xB6 ; 182 18be2: 9f e0 ldi r25, 0x0F ; 15 18be4: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 18be8: 68 e7 ldi r22, 0x78 ; 120 18bea: 70 e0 ldi r23, 0x00 ; 0 18bec: 88 eb ldi r24, 0xB8 ; 184 18bee: 9f e0 ldi r25, 0x0F ; 15 18bf0: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 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"); 18bf4: 8b e1 ldi r24, 0x1B ; 27 18bf6: 95 e8 ldi r25, 0x85 ; 133 18bf8: 0e 94 13 79 call 0xf226 ; 0xf226 18bfc: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation) 18c00: 8a e5 ldi r24, 0x5A ; 90 18c02: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18c06: 88 23 and r24, r24 18c08: c1 f0 breq .+48 ; 0x18c3a if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 18c0a: 61 e0 ldi r22, 0x01 ; 1 18c0c: 86 ea ldi r24, 0xA6 ; 166 18c0e: 9f e0 ldi r25, 0x0F ; 15 18c10: 0f 94 34 dc call 0x3b868 ; 0x3b868 18c14: 00 eb ldi r16, 0xB0 ; 176 18c16: 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); 18c18: 70 e0 ldi r23, 0x00 ; 0 18c1a: 60 e0 ldi r22, 0x00 ; 0 18c1c: c8 01 movw r24, r16 18c1e: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 18c22: 0e 5f subi r16, 0xFE ; 254 18c24: 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++) { 18c26: 0a 3b cpi r16, 0xBA ; 186 18c28: 4f e0 ldi r20, 0x0F ; 15 18c2a: 14 07 cpc r17, r20 18c2c: a9 f7 brne .-22 ; 0x18c18 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); } SERIAL_PROTOCOLLNPGM("zerorized"); 18c2e: 81 e1 ldi r24, 0x11 ; 17 18c30: 95 e8 ldi r25, 0x85 ; 133 18c32: 0e 94 13 79 call 0xf226 ; 0xf226 18c36: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I 18c3a: 83 e5 ldi r24, 0x53 ; 83 18c3c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18c40: 88 23 and r24, r24 18c42: 21 f1 breq .+72 ; 0x18c8c int16_t usteps = code_value_short(); 18c44: 0e 94 0d 5b call 0xb61a ; 0xb61a 18c48: 8c 01 movw r16, r24 if (code_seen('I')) { 18c4a: 89 e4 ldi r24, 0x49 ; 73 18c4c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18c50: 88 23 and r24, r24 18c52: 11 f4 brne .+4 ; 0x18c58 18c54: 0c 94 83 b0 jmp 0x16106 ; 0x16106 uint8_t index = code_value_uint8(); 18c58: 0e 94 00 5b call 0xb600 ; 0xb600 if (index < 5) { 18c5c: 85 30 cpi r24, 0x05 ; 5 18c5e: 10 f0 brcs .+4 ; 0x18c64 18c60: 0c 94 83 b0 jmp 0x16106 ; 0x16106 eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + index, usteps); 18c64: 90 e0 ldi r25, 0x00 ; 0 18c66: 88 52 subi r24, 0x28 ; 40 18c68: 98 4f sbci r25, 0xF8 ; 248 18c6a: b8 01 movw r22, r16 18c6c: 88 0f add r24, r24 18c6e: 99 1f adc r25, r25 18c70: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 SERIAL_PROTOCOLLNRPGM(MSG_OK); 18c74: 81 e5 ldi r24, 0x51 ; 81 18c76: 9d e6 ldi r25, 0x6D ; 109 18c78: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_PROTOCOLLNRPGM(_header); 18c7c: 8c e2 ldi r24, 0x2C ; 44 18c7e: 95 e8 ldi r25, 0x85 ; 133 18c80: 0e 94 13 79 call 0xf226 ; 0xf226 gcode_M861_print_pinda_cal_eeprom(); 18c84: 0e 94 20 77 call 0xee40 ; 0xee40 18c88: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } } } else { SERIAL_PROTOCOLLNPGM("no valid command"); 18c8c: 80 e0 ldi r24, 0x00 ; 0 18c8e: 95 e8 ldi r25, 0x85 ; 133 18c90: 0e 94 13 79 call 0xf226 ; 0xf226 18c94: 0c 94 83 b0 jmp 0x16106 ; 0x16106 */ 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); 18c98: 0e 94 35 60 call 0xc06a ; 0xc06a 18c9c: 20 e0 ldi r18, 0x00 ; 0 18c9e: 30 e0 ldi r19, 0x00 ; 0 18ca0: 40 e2 ldi r20, 0x20 ; 32 18ca2: 51 e4 ldi r21, 0x41 ; 65 18ca4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 18ca8: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 18cac: 6c 5a subi r22, 0xAC ; 172 switch(nCommand) 18cae: 63 30 cpi r22, 0x03 ; 3 18cb0: 09 f4 brne .+2 ; 0x18cb4 18cb2: a2 c0 rjmp .+324 ; 0x18df8 18cb4: 98 f5 brcc .+102 ; 0x18d1c 18cb6: 61 30 cpi r22, 0x01 ; 1 18cb8: 09 f4 brne .+2 ; 0x18cbc 18cba: 59 c0 rjmp .+178 ; 0x18d6e 18cbc: 62 30 cpi r22, 0x02 ; 2 18cbe: 11 f0 breq .+4 ; 0x18cc4 18cc0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 ,(uint8_t)oCheckModel ); } uint16_t nPrinterType(bool bMMu) { if (bMMu) { 18cc4: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 return pgm_read_word(&_nPrinterMmuType); 18cc8: e6 e2 ldi r30, 0x26 ; 38 18cca: fe e7 ldi r31, 0x7E ; 126 ,(uint8_t)oCheckModel ); } uint16_t nPrinterType(bool bMMu) { if (bMMu) { 18ccc: 81 30 cpi r24, 0x01 ; 1 18cce: 11 f0 breq .+4 ; 0x18cd4 return pgm_read_word(&_nPrinterMmuType); } else { return pgm_read_word(&_nPrinterType); 18cd0: e8 e2 ldi r30, 0x28 ; 40 18cd2: fe e7 ldi r31, 0x7E ; 126 18cd4: 05 91 lpm r16, Z+ 18cd6: 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')) 18cd8: 80 e5 ldi r24, 0x50 ; 80 18cda: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18cde: 88 23 and r24, r24 18ce0: 09 f4 brne .+2 ; 0x18ce4 18ce2: 79 c0 rjmp .+242 ; 0x18dd6 { uint16_t nPrinterModel; nPrinterModel=(uint16_t)code_value_long(); 18ce4: 0e 94 1a 5b call 0xb634 ; 0xb634 menu_submenu(lcd_hw_setup_menu); } } void printer_model_check(uint16_t nPrinterModel, uint16_t actualPrinterModel) { if (oCheckModel == ClCheckMode::_None) 18ce8: f0 90 e9 04 lds r15, 0x04E9 ; 0x8004e9 18cec: ff 20 and r15, r15 18cee: 11 f4 brne .+4 ; 0x18cf4 18cf0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 return; if (nPrinterModel == actualPrinterModel) 18cf4: 60 17 cp r22, r16 18cf6: 71 07 cpc r23, r17 18cf8: 11 f4 brne .+4 ; 0x18cfe 18cfa: 0c 94 83 b0 jmp 0x16106 ; 0x16106 // SERIAL_ECHOLNPGM("Printer model differs from the G-code ..."); // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN(actualPrinterModel); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN(nPrinterModel); render_M862_warnings( 18cfe: 8d eb ldi r24, 0xBD ; 189 18d00: 97 e3 ldi r25, 0x37 ; 55 18d02: 0e 94 44 72 call 0xe488 ; 0xe488 18d06: 8c 01 movw r16, r24 18d08: 8f e8 ldi r24, 0x8F ; 143 18d0a: 97 e3 ldi r25, 0x37 ; 55 18d0c: 0e 94 44 72 call 0xe488 ; 0xe488 18d10: 4f 2d mov r20, r15 18d12: b8 01 movw r22, r16 18d14: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 18d18: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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) 18d1c: 64 30 cpi r22, 0x04 ; 4 18d1e: 09 f4 brne .+2 ; 0x18d22 18d20: be c0 rjmp .+380 ; 0x18e9e 18d22: 65 30 cpi r22, 0x05 ; 5 18d24: 11 f0 breq .+4 ; 0x18d2a 18d26: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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')) 18d2a: 80 e5 ldi r24, 0x50 ; 80 18d2c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18d30: 88 23 and r24, r24 18d32: 09 f4 brne .+2 ; 0x18d36 18d34: 3a c1 rjmp .+628 ; 0x18faa { uint16_t nGcodeLevel; nGcodeLevel=(uint16_t)code_value_long(); 18d36: 0e 94 1a 5b call 0xb634 ; 0xb634 done: return true; } void gcode_level_check(uint16_t nGcodeLevel) { if (oCheckGcode == ClCheckMode::_None) 18d3a: 10 91 e7 04 lds r17, 0x04E7 ; 0x8004e7 18d3e: 11 23 and r17, r17 18d40: 11 f4 brne .+4 ; 0x18d46 18d42: 0c 94 83 b0 jmp 0x16106 ; 0x16106 return; if (nGcodeLevel <= (uint16_t)GCODE_LEVEL) 18d46: 62 30 cpi r22, 0x02 ; 2 18d48: 71 05 cpc r23, r1 18d4a: 10 f4 brcc .+4 ; 0x18d50 18d4c: 0c 94 83 b0 jmp 0x16106 ; 0x16106 // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN(GCODE_LEVEL); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN(nGcodeLevel); render_M862_warnings( 18d50: 8f ed ldi r24, 0xDF ; 223 18d52: 96 e3 ldi r25, 0x36 ; 54 18d54: 0e 94 44 72 call 0xe488 ; 0xe488 18d58: 7c 01 movw r14, r24 18d5a: 88 eb ldi r24, 0xB8 ; 184 18d5c: 96 e3 ldi r25, 0x36 ; 54 18d5e: 0e 94 44 72 call 0xe488 ; 0xe488 18d62: 41 2f mov r20, r17 18d64: b7 01 movw r22, r14 18d66: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 18d6a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 ClPrintChecking nCommand = static_cast((uint16_t)(code_value()*10) - 8620u); switch(nCommand) { case ClPrintChecking::_Nozzle: // ~ .1 uint16_t nDiameter; if(code_seen('P')) 18d6e: 80 e5 ldi r24, 0x50 ; 80 18d70: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18d74: 88 23 and r24, r24 18d76: a9 f0 breq .+42 ; 0x18da2 { nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] 18d78: 0e 94 35 60 call 0xc06a ; 0xc06a 18d7c: 20 e0 ldi r18, 0x00 ; 0 18d7e: 30 e0 ldi r19, 0x00 ; 0 18d80: 4a e7 ldi r20, 0x7A ; 122 18d82: 54 e4 ldi r21, 0x44 ; 68 18d84: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 18d88: 20 e0 ldi r18, 0x00 ; 0 18d8a: 30 e0 ldi r19, 0x00 ; 0 18d8c: 40 e0 ldi r20, 0x00 ; 0 18d8e: 5f e3 ldi r21, 0x3F ; 63 18d90: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 18d94: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> nozzle_diameter_check(nDiameter); 18d98: cb 01 movw r24, r22 18d9a: 0e 94 e9 f5 call 0x1ebd2 ; 0x1ebd2 18d9e: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } else if(code_seen('Q')) 18da2: 81 e5 ldi r24, 0x51 ; 81 18da4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18da8: 88 23 and r24, r24 18daa: 11 f4 brne .+4 ; 0x18db0 18dac: 0c 94 83 b0 jmp 0x16106 ; 0x16106 SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); 18db0: 85 ea ldi r24, 0xA5 ; 165 18db2: 9d e0 ldi r25, 0x0D ; 13 18db4: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18db8: bc 01 movw r22, r24 18dba: 90 e0 ldi r25, 0x00 ; 0 18dbc: 80 e0 ldi r24, 0x00 ; 0 18dbe: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 18dc2: 20 e0 ldi r18, 0x00 ; 0 18dc4: 30 e0 ldi r19, 0x00 ; 0 18dc6: 4a e7 ldi r20, 0x7A ; 122 18dc8: 54 e4 ldi r21, 0x44 ; 68 18dca: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 18dce: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 18dd2: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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')) 18dd6: 81 e5 ldi r24, 0x51 ; 81 18dd8: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18ddc: 88 23 and r24, r24 18dde: 11 f4 brne .+4 ; 0x18de4 18de0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 print((long) n, base); } void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); 18de4: b8 01 movw r22, r16 18de6: 90 e0 ldi r25, 0x00 ; 0 18de8: 80 e0 ldi r24, 0x00 ; 0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 18dea: 4a e0 ldi r20, 0x0A ; 10 18dec: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 } void MarlinSerial::println(unsigned int n, int base) { print(n, base); println(); 18df0: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 18df4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 return pgm_read_word(&_nPrinterType); } } const char *sPrinterType(bool bMMu) { if (bMMu) { 18df8: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 return _sPrinterMmuName; 18dfc: 6e e1 ldi r22, 0x1E ; 30 18dfe: e6 2e mov r14, r22 18e00: 6e e7 ldi r22, 0x7E ; 126 18e02: f6 2e mov r15, r22 return pgm_read_word(&_nPrinterType); } } const char *sPrinterType(bool bMMu) { if (bMMu) { 18e04: 81 30 cpi r24, 0x01 ; 1 18e06: 21 f0 breq .+8 ; 0x18e10 return _sPrinterMmuName; } else { return _sPrinterName; 18e08: 5a e1 ldi r21, 0x1A ; 26 18e0a: e5 2e mov r14, r21 18e0c: 5e e7 ldi r21, 0x7E ; 126 18e0e: f5 2e mov r15, r21 SERIAL_PROTOCOLLN(type); } break; case ClPrintChecking::_Smodel: { // ~ .3 const char *type = sPrinterType(MMU2::mmu2.Enabled()); if(code_seen('P')) 18e10: 80 e5 ldi r24, 0x50 ; 80 18e12: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18e16: 88 23 and r24, r24 18e18: b1 f1 breq .+108 ; 0x18e86 , found(false) { const char * pStrEnd = NULL; // Start of the string this->ptr = strchr(pStr, '"'); 18e1a: 62 e2 ldi r22, 0x22 ; 34 18e1c: 70 e0 ldi r23, 0x00 ; 0 18e1e: 80 91 93 03 lds r24, 0x0393 ; 0x800393 18e22: 90 91 94 03 lds r25, 0x0394 ; 0x800394 18e26: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 18e2a: 8c 01 movw r16, r24 if (!this->ptr) { 18e2c: 89 2b or r24, r25 18e2e: d1 f0 breq .+52 ; 0x18e64 // First quote not found return; } // Skip the leading quote this->ptr++; 18e30: 0f 5f subi r16, 0xFF ; 255 18e32: 1f 4f sbci r17, 0xFF ; 255 // End of the string pStrEnd = strchr(this->ptr, '"'); 18e34: 62 e2 ldi r22, 0x22 ; 34 18e36: 70 e0 ldi r23, 0x00 ; 0 18e38: c8 01 movw r24, r16 18e3a: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce if(!pStrEnd) { 18e3e: 00 97 sbiw r24, 0x00 ; 0 18e40: 89 f0 breq .+34 ; 0x18e64 // Second quote not found return; } this->len = pStrEnd - this->ptr; 18e42: d8 2e mov r13, r24 18e44: d0 1a sub r13, r16 18e46: c7 01 movw r24, r14 18e48: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> unquoted_string smodel = unquoted_string(pStrPos); if(smodel.WasFound()) { const uint8_t compareLength = strlen_P(actualPrinterSModel); if(compareLength == smodel.GetLength()) { 18e4c: d8 12 cpse r13, r24 18e4e: 0a c0 rjmp .+20 ; 0x18e64 if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return; 18e50: ac 01 movw r20, r24 18e52: 55 27 eor r21, r21 18e54: b7 01 movw r22, r14 18e56: c8 01 movw r24, r16 18e58: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 18e5c: 89 2b or r24, r25 18e5e: 11 f4 brne .+4 ; 0x18e64 18e60: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } } render_M862_warnings( 18e64: f0 90 e9 04 lds r15, 0x04E9 ; 0x8004e9 18e68: 8d eb ldi r24, 0xBD ; 189 18e6a: 97 e3 ldi r25, 0x37 ; 55 18e6c: 0e 94 44 72 call 0xe488 ; 0xe488 18e70: 8c 01 movw r16, r24 18e72: 8f e8 ldi r24, 0x8F ; 143 18e74: 97 e3 ldi r25, 0x37 ; 55 18e76: 0e 94 44 72 call 0xe488 ; 0xe488 18e7a: 4f 2d mov r20, r15 18e7c: b8 01 movw r22, r16 18e7e: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 18e82: 0c 94 83 b0 jmp 0x16106 ; 0x16106 { printer_smodel_check(strchr_pointer, type); } else if(code_seen('Q')) 18e86: 81 e5 ldi r24, 0x51 ; 81 18e88: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18e8c: 88 23 and r24, r24 18e8e: 11 f4 brne .+4 ; 0x18e94 18e90: 0c 94 83 b0 jmp 0x16106 ; 0x16106 SERIAL_PROTOCOLLNRPGM(type); 18e94: c7 01 movw r24, r14 18e96: 0e 94 13 79 call 0xf226 ; 0xf226 18e9a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } break; case ClPrintChecking::_Version: // ~ .4 if(code_seen('P')) 18e9e: 80 e5 ldi r24, 0x50 ; 80 18ea0: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18ea4: 88 23 and r24, r24 18ea6: 09 f4 brne .+2 ; 0x18eaa 18ea8: 77 c0 rjmp .+238 ; 0x18f98 fw_version_check(++strchr_pointer); 18eaa: 80 91 93 03 lds r24, 0x0393 ; 0x800393 18eae: 90 91 94 03 lds r25, 0x0394 ; 0x800394 18eb2: 01 96 adiw r24, 0x01 ; 1 18eb4: 90 93 94 03 sts 0x0394, r25 ; 0x800394 18eb8: 80 93 93 03 sts 0x0393, r24 ; 0x800393 return ((uint8_t)ClCompareValue::_Less); return ((uint8_t)ClCompareValue::_Equal); } void fw_version_check(const char *pVersion) { if (oCheckVersion == ClCheckMode::_None) 18ebc: 20 91 e8 04 lds r18, 0x04E8 ; 0x8004e8 18ec0: 22 23 and r18, r18 18ec2: 11 f4 brne .+4 ; 0x18ec8 18ec4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 return; uint16_t aVersion[4]; uint8_t nCompareValueResult; parse_version(pVersion, aVersion); 18ec8: be 01 movw r22, r28 18eca: 6f 5f subi r22, 0xFF ; 255 18ecc: 7f 4f sbci r23, 0xFF ; 255 18ece: 0e 94 2a f0 call 0x1e054 ; 0x1e054 nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6; 18ed2: 8a e0 ldi r24, 0x0A ; 10 18ed4: 90 e0 ldi r25, 0x00 ; 0 18ed6: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18eda: 29 81 ldd r18, Y+1 ; 0x01 18edc: 3a 81 ldd r19, Y+2 ; 0x02 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 18ede: 12 e0 ldi r17, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 18ee0: 82 17 cp r24, r18 18ee2: 93 07 cpc r25, r19 18ee4: 28 f0 brcs .+10 ; 0x18ef0 return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 18ee6: 11 e0 ldi r17, 0x01 ; 1 18ee8: 28 17 cp r18, r24 18eea: 39 07 cpc r19, r25 18eec: 08 f4 brcc .+2 ; 0x18ef0 18eee: 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; 18ef0: 12 95 swap r17 18ef2: 11 0f add r17, r17 18ef4: 11 0f add r17, r17 18ef6: 10 7c andi r17, 0xC0 ; 192 nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4; 18ef8: 8c e0 ldi r24, 0x0C ; 12 18efa: 90 e0 ldi r25, 0x00 ; 0 18efc: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18f00: ac 01 movw r20, r24 18f02: 2b 81 ldd r18, Y+3 ; 0x03 18f04: 3c 81 ldd r19, Y+4 ; 0x04 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 18f06: 82 e0 ldi r24, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 18f08: 42 17 cp r20, r18 18f0a: 53 07 cpc r21, r19 18f0c: 28 f0 brcs .+10 ; 0x18f18 return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 18f0e: 81 e0 ldi r24, 0x01 ; 1 18f10: 24 17 cp r18, r20 18f12: 35 07 cpc r19, r21 18f14: 08 f4 brcc .+2 ; 0x18f18 18f16: 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; 18f18: 50 e1 ldi r21, 0x10 ; 16 18f1a: 85 9f mul r24, r21 18f1c: c0 01 movw r24, r0 18f1e: 11 24 eor r1, r1 18f20: 18 0f add r17, r24 nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2; 18f22: 8e e0 ldi r24, 0x0E ; 14 18f24: 90 e0 ldi r25, 0x00 ; 0 18f26: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18f2a: ac 01 movw r20, r24 18f2c: 2d 81 ldd r18, Y+5 ; 0x05 18f2e: 3e 81 ldd r19, Y+6 ; 0x06 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 18f30: 82 e0 ldi r24, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 18f32: 42 17 cp r20, r18 18f34: 53 07 cpc r21, r19 18f36: 28 f0 brcs .+10 ; 0x18f42 return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 18f38: 81 e0 ldi r24, 0x01 ; 1 18f3a: 24 17 cp r18, r20 18f3c: 35 07 cpc r19, r21 18f3e: 08 f4 brcc .+2 ; 0x18f42 18f40: 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; 18f42: a4 e0 ldi r26, 0x04 ; 4 18f44: 8a 9f mul r24, r26 18f46: c0 01 movw r24, r0 18f48: 11 24 eor r1, r1 18f4a: 18 0f add r17, r24 nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR)); 18f4c: 80 e1 ldi r24, 0x10 ; 16 18f4e: 90 e0 ldi r25, 0x00 ; 0 18f50: 0f 94 1e dc call 0x3b83c ; 0x3b83c 18f54: ac 01 movw r20, r24 18f56: 2f 81 ldd r18, Y+7 ; 0x07 18f58: 38 85 ldd r19, Y+8 ; 0x08 ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) return ((uint8_t)ClCompareValue::_Greater); 18f5a: 92 e0 ldi r25, 0x02 ; 2 ,(uint8_t)oCheckModel ); } uint8_t mCompareValue(uint16_t nX, uint16_t nY) { if (nX > nY) 18f5c: 42 17 cp r20, r18 18f5e: 53 07 cpc r21, r19 18f60: 28 f0 brcs .+10 ; 0x18f6c return ((uint8_t)ClCompareValue::_Greater); if (nX < nY) 18f62: 91 e0 ldi r25, 0x01 ; 1 18f64: 24 17 cp r18, r20 18f66: 35 07 cpc r19, r21 18f68: 08 f4 brcc .+2 ; 0x18f6c 18f6a: 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)); 18f6c: 19 0f add r17, r25 if (nCompareValueResult <= COMPARE_VALUE_EQUAL) 18f6e: 16 35 cpi r17, 0x56 ; 86 18f70: 10 f4 brcc .+4 ; 0x18f76 18f72: 0c 94 83 b0 jmp 0x16106 ; 0x16106 SERIAL_ECHO(aVersion[2]); SERIAL_ECHO('.'); SERIAL_ECHOLN(aVersion[3]); */ render_M862_warnings( 18f76: f0 90 e8 04 lds r15, 0x04E8 ; 0x8004e8 18f7a: 8d e4 ldi r24, 0x4D ; 77 18f7c: 97 e3 ldi r25, 0x37 ; 55 18f7e: 0e 94 44 72 call 0xe488 ; 0xe488 18f82: 8c 01 movw r16, r24 18f84: 87 e2 ldi r24, 0x27 ; 39 18f86: 97 e3 ldi r25, 0x37 ; 55 18f88: 0e 94 44 72 call 0xe488 ; 0xe488 18f8c: 4f 2d mov r20, r15 18f8e: b8 01 movw r22, r16 18f90: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 18f94: 0c 94 83 b0 jmp 0x16106 ; 0x16106 else if(code_seen('Q')) 18f98: 81 e5 ldi r24, 0x51 ; 81 18f9a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18f9e: 88 23 and r24, r24 18fa0: 11 f4 brne .+4 ; 0x18fa6 18fa2: 0c 94 83 b0 jmp 0x16106 ; 0x16106 18fa6: 0c 94 3b a7 jmp 0x14e76 ; 0x14e76 { uint16_t nGcodeLevel; nGcodeLevel=(uint16_t)code_value_long(); gcode_level_check(nGcodeLevel); } else if(code_seen('Q')) 18faa: 81 e5 ldi r24, 0x51 ; 81 18fac: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18fb0: 88 23 and r24, r24 18fb2: 11 f4 brne .+4 ; 0x18fb8 18fb4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 SERIAL_PROTOCOLLN(GCODE_LEVEL); 18fb8: 81 e0 ldi r24, 0x01 ; 1 18fba: 90 e0 ldi r25, 0x00 ; 0 18fbc: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 18fc0: 0c 94 83 b0 jmp 0x16106 ; 0x16106 * 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; 18fc4: 8b e4 ldi r24, 0x4B ; 75 18fc6: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 18fca: c1 2c mov r12, r1 18fcc: d1 2c mov r13, r1 18fce: e1 2c mov r14, r1 18fd0: 40 ec ldi r20, 0xC0 ; 192 18fd2: f4 2e mov r15, r20 18fd4: 88 23 and r24, r24 18fd6: 49 f1 breq .+82 ; 0x1902a 18fd8: 0e 94 35 60 call 0xc06a ; 0xc06a 18fdc: 6b 01 movw r12, r22 18fde: 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) 18fe0: 20 e0 ldi r18, 0x00 ; 0 18fe2: 30 e0 ldi r19, 0x00 ; 0 18fe4: a9 01 movw r20, r18 18fe6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 18fea: 81 11 cpse r24, r1 18fec: 1e c0 rjmp .+60 ; 0x1902a { extruder_advance_K = 0; 18fee: 10 92 64 05 sts 0x0564, r1 ; 0x800564 18ff2: 10 92 65 05 sts 0x0565, r1 ; 0x800565 18ff6: 10 92 66 05 sts 0x0566, r1 ; 0x800566 18ffa: 10 92 67 05 sts 0x0567, r1 ; 0x800567 18ffe: 0e 94 af 81 call 0x1035e ; 0x1035e else extruder_advance_K = newK; } #endif SERIAL_ECHO_START; 19002: 82 ef ldi r24, 0xF2 ; 242 19004: 9a ea ldi r25, 0xAA ; 170 19006: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM("Advance K="); 1900a: 87 ef ldi r24, 0xF7 ; 247 1900c: 9d e7 ldi r25, 0x7D ; 125 1900e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(extruder_advance_K); 19012: 60 91 64 05 lds r22, 0x0564 ; 0x800564 19016: 70 91 65 05 lds r23, 0x0565 ; 0x800565 1901a: 80 91 66 05 lds r24, 0x0566 ; 0x800566 1901e: 90 91 67 05 lds r25, 0x0567 ; 0x800567 19022: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 19026: 0c 94 83 b0 jmp 0x16106 ; 0x16106 } float la10c_value(float k) { if(la10c_mode == LA10C_UNKNOWN) 1902a: 80 91 6e 03 lds r24, 0x036E ; 0x80036e 1902e: 81 11 cpse r24, r1 19030: 1b c0 rjmp .+54 ; 0x19068 { // do not autodetect until a valid value is seen if(k == 0) return 0; else if(k < 0) 19032: 20 e0 ldi r18, 0x00 ; 0 19034: 30 e0 ldi r19, 0x00 ; 0 19036: a9 01 movw r20, r18 19038: c7 01 movw r24, r14 1903a: b6 01 movw r22, r12 1903c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 19040: 87 ff sbrs r24, 7 19042: 05 c0 rjmp .+10 ; 0x1904e } else { newK = la10c_value(newK); if (newK < 0) SERIAL_ECHOLNPGM("K out of allowed range!"); 19044: 82 e0 ldi r24, 0x02 ; 2 19046: 9e e7 ldi r25, 0x7E ; 126 19048: 0e 94 13 79 call 0xf226 ; 0xf226 1904c: da cf rjmp .-76 ; 0x19002 return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); 1904e: 20 e0 ldi r18, 0x00 ; 0 19050: 30 e0 ldi r19, 0x00 ; 0 19052: 40 e2 ldi r20, 0x20 ; 32 19054: 51 e4 ldi r21, 0x41 ; 65 19056: c7 01 movw r24, r14 19058: b6 01 movw r22, r12 1905a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1905e: 87 ff sbrs r24, 7 19060: 2c c0 rjmp .+88 ; 0x190ba 19062: 81 e0 ldi r24, 0x01 ; 1 19064: 0e 94 af 81 call 0x1035e ; 0x1035e } if(la10c_mode == LA10C_LA15) 19068: 80 91 6e 03 lds r24, 0x036E ; 0x80036e return (k >= 0 && k < LA_K_MAX? k: -1); 1906c: 20 e0 ldi r18, 0x00 ; 0 1906e: 30 e0 ldi r19, 0x00 ; 0 19070: a9 01 movw r20, r18 return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); } if(la10c_mode == LA10C_LA15) 19072: 81 30 cpi r24, 0x01 ; 1 19074: 21 f5 brne .+72 ; 0x190be return (k >= 0 && k < LA_K_MAX? k: -1); 19076: c7 01 movw r24, r14 19078: b6 01 movw r22, r12 1907a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1907e: 87 fd sbrc r24, 7 19080: e1 cf rjmp .-62 ; 0x19044 19082: 20 e0 ldi r18, 0x00 ; 0 19084: 30 e0 ldi r19, 0x00 ; 0 19086: 40 e2 ldi r20, 0x20 ; 32 19088: 51 e4 ldi r21, 0x41 ; 65 1908a: c7 01 movw r24, r14 1908c: b6 01 movw r22, r12 1908e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 19092: 87 ff sbrs r24, 7 19094: d7 cf rjmp .-82 ; 0x19044 la10c_reset(); } else { newK = la10c_value(newK); if (newK < 0) 19096: 20 e0 ldi r18, 0x00 ; 0 19098: 30 e0 ldi r19, 0x00 ; 0 1909a: a9 01 movw r20, r18 1909c: c7 01 movw r24, r14 1909e: b6 01 movw r22, r12 190a0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 190a4: 87 fd sbrc r24, 7 190a6: ce cf rjmp .-100 ; 0x19044 SERIAL_ECHOLNPGM("K out of allowed range!"); else extruder_advance_K = newK; 190a8: c0 92 64 05 sts 0x0564, r12 ; 0x800564 190ac: d0 92 65 05 sts 0x0565, r13 ; 0x800565 190b0: e0 92 66 05 sts 0x0566, r14 ; 0x800566 190b4: f0 92 67 05 sts 0x0567, r15 ; 0x800567 190b8: a4 cf rjmp .-184 ; 0x19002 if(k == 0) return 0; else if(k < 0) return -1; la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10); 190ba: 82 e0 ldi r24, 0x02 ; 2 190bc: d3 cf rjmp .-90 ; 0x19064 } if(la10c_mode == LA10C_LA15) return (k >= 0 && k < LA_K_MAX? k: -1); else return (k >= 0? la10c_convert(k): -1); 190be: c7 01 movw r24, r14 190c0: b6 01 movw r22, r12 190c2: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 190c6: 87 fd sbrc r24, 7 190c8: bd cf rjmp .-134 ; 0x19044 // Approximate a LA10 value to a LA15 equivalent. static float la10c_convert(float k) { float new_K = k * 0.002 - 0.01; 190ca: 2f e6 ldi r18, 0x6F ; 111 190cc: 32 e1 ldi r19, 0x12 ; 18 190ce: 43 e0 ldi r20, 0x03 ; 3 190d0: 5b e3 ldi r21, 0x3B ; 59 190d2: c7 01 movw r24, r14 190d4: b6 01 movw r22, r12 190d6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 190da: 2a e0 ldi r18, 0x0A ; 10 190dc: 37 ed ldi r19, 0xD7 ; 215 190de: 43 e2 ldi r20, 0x23 ; 35 190e0: 5c e3 ldi r21, 0x3C ; 60 190e2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 190e6: 6b 01 movw r12, r22 190e8: 7c 01 movw r14, r24 return new_K < 0? 0: 190ea: 20 e0 ldi r18, 0x00 ; 0 190ec: 30 e0 ldi r19, 0x00 ; 0 190ee: a9 01 movw r20, r18 190f0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 190f4: 87 fd sbrc r24, 7 190f6: 11 c0 rjmp .+34 ; 0x1911a new_K > (LA_K_MAX - FLT_EPSILON)? (LA_K_MAX - FLT_EPSILON): 190f8: 20 e0 ldi r18, 0x00 ; 0 190fa: 30 e0 ldi r19, 0x00 ; 0 190fc: 40 e2 ldi r20, 0x20 ; 32 190fe: 51 e4 ldi r21, 0x41 ; 65 19100: c7 01 movw r24, r14 19102: b6 01 movw r22, r12 19104: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 19108: 18 16 cp r1, r24 1910a: 2c f6 brge .-118 ; 0x19096 1910c: c1 2c mov r12, r1 1910e: d1 2c mov r13, r1 19110: 30 e2 ldi r19, 0x20 ; 32 19112: e3 2e mov r14, r19 19114: 31 e4 ldi r19, 0x41 ; 65 19116: f3 2e mov r15, r19 19118: c7 cf rjmp .-114 ; 0x190a8 // 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: 1911a: c1 2c mov r12, r1 1911c: d1 2c mov r13, r1 1911e: 76 01 movw r14, r12 19120: c3 cf rjmp .-122 ; 0x190a8 19122: 9d ed ldi r25, 0xDD ; 221 19124: 89 2e mov r8, r25 19126: 92 e0 ldi r25, 0x02 ; 2 19128: 99 2e mov r9, r25 1912a: 0d e5 ldi r16, 0x5D ; 93 1912c: 12 e0 ldi r17, 0x02 ; 2 1912e: 24 ef ldi r18, 0xF4 ; 244 19130: a2 2e mov r10, r18 19132: 24 e0 ldi r18, 0x04 ; 4 19134: b2 2e mov r11, r18 */ case 907: { #ifdef TMC2130 // See tmc2130_cur2val() for translation to 0 .. 63 range for (uint_least8_t i = 0; i < NUM_AXIS; i++){ 19136: 71 2c mov r7, r1 if(code_seen(axis_codes[i])){ 19138: f4 01 movw r30, r8 1913a: 81 91 ld r24, Z+ 1913c: 4f 01 movw r8, r30 1913e: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 19142: 88 23 and r24, r24 19144: 09 f4 brne .+2 ; 0x19148 19146: 45 c0 rjmp .+138 ; 0x191d2 if( i == E_AXIS && FarmOrUserECool() ){ 19148: f3 e0 ldi r31, 0x03 ; 3 1914a: 7f 12 cpse r7, r31 1914c: 04 c0 rjmp .+8 ; 0x19156 return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); 1914e: 0e 94 8a f0 call 0x1e114 ; 0x1e114 19152: 81 11 cpse r24, r1 19154: 61 c0 rjmp .+194 ; 0x19218 SERIAL_ECHORPGM(eMotorCurrentScalingEnabled); SERIAL_ECHOLNPGM(", M907 E ignored"); continue; } float cur_mA = code_value(); 19156: 0e 94 35 60 call 0xc06a ; 0xc06a 1915a: 6b 01 movw r12, r22 1915c: 7c 01 movw r14, r24 //! | 1020 | 62 | | //! | 1029 | 63 | | uint8_t tmc2130_cur2val(float cur) { if (cur < 0) cur = 0; //limit min 1915e: 20 e0 ldi r18, 0x00 ; 0 19160: 30 e0 ldi r19, 0x00 ; 0 19162: a9 01 movw r20, r18 19164: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 19168: 87 fd sbrc r24, 7 1916a: 46 c0 rjmp .+140 ; 0x191f8 if (cur > 1029) cur = 1029; //limit max 1916c: 20 e0 ldi r18, 0x00 ; 0 1916e: 30 ea ldi r19, 0xA0 ; 160 19170: 40 e8 ldi r20, 0x80 ; 128 19172: 54 e4 ldi r21, 0x44 ; 68 19174: c7 01 movw r24, r14 19176: b6 01 movw r22, r12 19178: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1917c: 18 16 cp r1, r24 1917e: a4 f1 brlt .+104 ; 0x191e8 //540mA is threshold for switch from high sense to low sense //for higher currents is maximum current 1029mA if (cur >= 540) return 63 * (float)cur / 1029; 19180: 20 e0 ldi r18, 0x00 ; 0 19182: 30 e0 ldi r19, 0x00 ; 0 19184: 47 e0 ldi r20, 0x07 ; 7 19186: 54 e4 ldi r21, 0x44 ; 68 19188: c7 01 movw r24, r14 1918a: b6 01 movw r22, r12 1918c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 19190: 87 fd sbrc r24, 7 19192: 35 c0 rjmp .+106 ; 0x191fe 19194: 20 e0 ldi r18, 0x00 ; 0 19196: 30 e0 ldi r19, 0x00 ; 0 19198: 4c e7 ldi r20, 0x7C ; 124 1919a: 52 e4 ldi r21, 0x42 ; 66 1919c: c7 01 movw r24, r14 1919e: b6 01 movw r22, r12 191a0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 191a4: 20 e0 ldi r18, 0x00 ; 0 191a6: 30 ea ldi r19, 0xA0 ; 160 191a8: 40 e8 ldi r20, 0x80 ; 128 191aa: 54 e4 ldi r21, 0x44 ; 68 //for lower currents must be the value divided by 1.125 (= 0.18*2/0.32) return 63 * (float)cur / (1029 * 1.125); 191ac: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 191b0: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 191b4: f6 2e mov r15, r22 uint8_t val = tmc2130_cur2val(cur_mA); currents[i].setiHold(val); 191b6: c8 01 movw r24, r16 191b8: 0e 94 96 67 call 0xcf2c ; 0xcf2c currents[i].setiRun(val); 191bc: 6f 2d mov r22, r15 191be: c8 01 movw r24, r16 191c0: 0e 94 9e 67 call 0xcf3c ; 0xcf3c tmc2130_setup_chopper(i, tmc2130_mres[i]); 191c4: 50 e0 ldi r21, 0x00 ; 0 191c6: 40 e0 ldi r20, 0x00 ; 0 191c8: d5 01 movw r26, r10 191ca: 6c 91 ld r22, X 191cc: 87 2d mov r24, r7 191ce: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 */ case 907: { #ifdef TMC2130 // See tmc2130_cur2val() for translation to 0 .. 63 range for (uint_least8_t i = 0; i < NUM_AXIS; i++){ 191d2: 73 94 inc r7 191d4: 0d 5f subi r16, 0xFD ; 253 191d6: 1f 4f sbci r17, 0xFF ; 255 191d8: bf ef ldi r27, 0xFF ; 255 191da: ab 1a sub r10, r27 191dc: bb 0a sbc r11, r27 191de: e4 e0 ldi r30, 0x04 ; 4 191e0: 7e 12 cpse r7, r30 191e2: aa cf rjmp .-172 ; 0x19138 191e4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 //! | 1029 | 63 | | uint8_t tmc2130_cur2val(float cur) { if (cur < 0) cur = 0; //limit min if (cur > 1029) cur = 1029; //limit max 191e8: c1 2c mov r12, r1 191ea: 80 ea ldi r24, 0xA0 ; 160 191ec: d8 2e mov r13, r24 191ee: 80 e8 ldi r24, 0x80 ; 128 191f0: e8 2e mov r14, r24 191f2: 84 e4 ldi r24, 0x44 ; 68 191f4: f8 2e mov r15, r24 191f6: ce cf rjmp .-100 ; 0x19194 //! | 1020 | 62 | | //! | 1029 | 63 | | uint8_t tmc2130_cur2val(float cur) { if (cur < 0) cur = 0; //limit min 191f8: c1 2c mov r12, r1 191fa: d1 2c mov r13, r1 191fc: 76 01 movw r14, r12 if (cur > 1029) cur = 1029; //limit max //540mA is threshold for switch from high sense to low sense //for higher currents is maximum current 1029mA if (cur >= 540) return 63 * (float)cur / 1029; //for lower currents must be the value divided by 1.125 (= 0.18*2/0.32) return 63 * (float)cur / (1029 * 1.125); 191fe: 20 e0 ldi r18, 0x00 ; 0 19200: 30 e0 ldi r19, 0x00 ; 0 19202: 4c e7 ldi r20, 0x7C ; 124 19204: 52 e4 ldi r21, 0x42 ; 66 19206: c7 01 movw r24, r14 19208: b6 01 movw r22, r12 1920a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1920e: 20 e0 ldi r18, 0x00 ; 0 19210: 34 eb ldi r19, 0xB4 ; 180 19212: 40 e9 ldi r20, 0x90 ; 144 19214: 54 e4 ldi r21, 0x44 ; 68 19216: ca cf rjmp .-108 ; 0x191ac if(code_seen(axis_codes[i])){ if( i == E_AXIS && FarmOrUserECool() ){ SERIAL_ECHORPGM(eMotorCurrentScalingEnabled); 19218: 8b eb ldi r24, 0xBB ; 187 1921a: 9e e9 ldi r25, 0x9E ; 158 1921c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM(", M907 E ignored"); 19220: 8f ee ldi r24, 0xEF ; 239 19222: 94 e8 ldi r25, 0x84 ; 132 19224: 0e 94 13 79 call 0xf226 ; 0xf226 19228: d4 cf rjmp .-88 ; 0x191d2 1922a: a0 90 67 02 lds r10, 0x0267 ; 0x800267 , iRun((ir < 32) ? ir : (ir >> 1)) , iHold((ir < 32) ? ih : (ih >> 1)) {} inline uint8_t getiRun() const { return iRun; } inline uint8_t getiHold() const { return min(iHold, iRun); } inline uint8_t getOriginaliRun() const { return vSense ? iRun : iRun << 1; } 1922e: 80 91 66 02 lds r24, 0x0266 ; 0x800266 19232: 81 11 cpse r24, r1 19234: 01 c0 rjmp .+2 ; 0x19238 19236: aa 0c add r10, r10 SetCurrents(axis, *curr); } void tmc2130_print_currents() { printf_P(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), 19238: b1 2c mov r11, r1 currents[0].getOriginaliHold(), currents[0].getOriginaliRun(), currents[1].getOriginaliHold(), currents[1].getOriginaliRun(), currents[2].getOriginaliHold(), currents[2].getOriginaliRun(), currents[3].getOriginaliHold(), currents[3].getOriginaliRun() 1923a: 86 e6 ldi r24, 0x66 ; 102 1923c: 92 e0 ldi r25, 0x02 ; 2 1923e: 0f 94 f2 27 call 0x24fe4 ; 0x24fe4 19242: 88 2e mov r8, r24 19244: c0 90 64 02 lds r12, 0x0264 ; 0x800264 19248: 80 91 63 02 lds r24, 0x0263 ; 0x800263 1924c: 81 11 cpse r24, r1 1924e: 01 c0 rjmp .+2 ; 0x19252 19250: cc 0c add r12, r12 SetCurrents(axis, *curr); } void tmc2130_print_currents() { printf_P(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), 19252: d1 2c mov r13, r1 currents[0].getOriginaliHold(), currents[0].getOriginaliRun(), currents[1].getOriginaliHold(), currents[1].getOriginaliRun(), currents[2].getOriginaliHold(), currents[2].getOriginaliRun(), 19254: 83 e6 ldi r24, 0x63 ; 99 19256: 92 e0 ldi r25, 0x02 ; 2 19258: 0f 94 f2 27 call 0x24fe4 ; 0x24fe4 1925c: 98 2e mov r9, r24 1925e: 00 91 61 02 lds r16, 0x0261 ; 0x800261 19262: 80 91 60 02 lds r24, 0x0260 ; 0x800260 19266: 81 11 cpse r24, r1 19268: 01 c0 rjmp .+2 ; 0x1926c 1926a: 00 0f add r16, r16 SetCurrents(axis, *curr); } void tmc2130_print_currents() { printf_P(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), 1926c: 10 e0 ldi r17, 0x00 ; 0 currents[0].getOriginaliHold(), currents[0].getOriginaliRun(), currents[1].getOriginaliHold(), currents[1].getOriginaliRun(), 1926e: 80 e6 ldi r24, 0x60 ; 96 19270: 92 e0 ldi r25, 0x02 ; 2 19272: 0f 94 f2 27 call 0x24fe4 ; 0x24fe4 19276: e8 2e mov r14, r24 19278: f0 90 5e 02 lds r15, 0x025E ; 0x80025e 1927c: 80 91 5d 02 lds r24, 0x025D ; 0x80025d 19280: 81 11 cpse r24, r1 19282: 01 c0 rjmp .+2 ; 0x19286 19284: ff 0c add r15, r15 } void tmc2130_print_currents() { printf_P(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), currents[0].getOriginaliHold(), currents[0].getOriginaliRun(), 19286: 8d e5 ldi r24, 0x5D ; 93 19288: 92 e0 ldi r25, 0x02 ; 2 1928a: 0f 94 f2 27 call 0x24fe4 ; 0x24fe4 SetCurrents(axis, *curr); } void tmc2130_print_currents() { printf_P(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), 1928e: bf 92 push r11 19290: af 92 push r10 19292: 1f 92 push r1 19294: 8f 92 push r8 19296: df 92 push r13 19298: cf 92 push r12 1929a: 1f 92 push r1 1929c: 9f 92 push r9 1929e: 1f 93 push r17 192a0: 0f 93 push r16 192a2: 1f 92 push r1 192a4: ef 92 push r14 192a6: 1f 92 push r1 192a8: ff 92 push r15 192aa: 1f 92 push r1 192ac: 8f 93 push r24 192ae: 8a e0 ldi r24, 0x0A ; 10 192b0: 97 e6 ldi r25, 0x67 ; 103 192b2: 9f 93 push r25 192b4: 8f 93 push r24 192b6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 192ba: 0f b6 in r0, 0x3f ; 63 192bc: f8 94 cli 192be: de bf out 0x3e, r29 ; 62 192c0: 0f be out 0x3f, r0 ; 63 192c2: cd bf out 0x3d, r28 ; 61 192c4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 - `Q` - Print effective silent/normal status. (Does not report override) */ case 914: case 915: { uint8_t newMode = (mcode_in_progress==914) ? TMC2130_MODE_NORMAL : TMC2130_MODE_SILENT; 192c8: 11 e0 ldi r17, 0x01 ; 1 192ca: 82 39 cpi r24, 0x92 ; 146 192cc: 93 40 sbci r25, 0x03 ; 3 192ce: 09 f4 brne .+2 ; 0x192d2 192d0: 10 e0 ldi r17, 0x00 ; 0 //printf_P(_n("tmc2130mode/smm/eep: %d %d %d %d"),tmc2130_mode,SilentModeMenu,eeprom_read_byte((uint8_t*)EEPROM_SILENT), bEnableForce_z); if (code_seen('R')) 192d2: 82 e5 ldi r24, 0x52 ; 82 192d4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 192d8: 88 23 and r24, r24 192da: 81 f0 breq .+32 ; 0x192fc { newMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); 192dc: 8f ef ldi r24, 0xFF ; 255 192de: 9f e0 ldi r25, 0x0F ; 15 192e0: 0f 94 10 dc call 0x3b820 ; 0x3b820 192e4: 18 2f mov r17, r24 tmc2130_mode == TMC2130_MODE_NORMAL ? _O(MSG_NORMAL) : _O(MSG_SILENT) ); } if (tmc2130_mode != newMode 192e6: 80 91 8b 06 lds r24, 0x068B ; 0x80068b 192ea: 81 17 cp r24, r17 192ec: 11 f4 brne .+4 ; 0x192f2 192ee: 0c 94 83 b0 jmp 0x16106 ; 0x16106 ) { #ifdef PSU_Delta enable_force_z(); #endif change_power_mode_live(newMode); 192f2: 81 2f mov r24, r17 192f4: 0e 94 21 60 call 0xc042 ; 0xc042 192f8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 //printf_P(_n("tmc2130mode/smm/eep: %d %d %d %d"),tmc2130_mode,SilentModeMenu,eeprom_read_byte((uint8_t*)EEPROM_SILENT), bEnableForce_z); if (code_seen('R')) { newMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); } else if (code_seen('P')) 192fc: 80 e5 ldi r24, 0x50 ; 80 192fe: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 19302: 88 23 and r24, r24 19304: 89 f0 breq .+34 ; 0x19328 { uint8_t newMenuMode = (mcode_in_progress==914) ? SILENT_MODE_NORMAL : SILENT_MODE_STEALTH; 19306: 01 e0 ldi r16, 0x01 ; 1 19308: 80 91 a9 0d lds r24, 0x0DA9 ; 0x800da9 <_ZL17mcode_in_progress.lto_priv.532> 1930c: 90 91 aa 0d lds r25, 0x0DAA ; 0x800daa <_ZL17mcode_in_progress.lto_priv.532+0x1> 19310: 82 39 cpi r24, 0x92 ; 146 19312: 93 40 sbci r25, 0x03 ; 3 19314: 09 f4 brne .+2 ; 0x19318 19316: 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); 19318: 60 2f mov r22, r16 1931a: 8f ef ldi r24, 0xFF ; 255 1931c: 9f e0 ldi r25, 0x0F ; 15 1931e: 0f 94 34 dc call 0x3b868 ; 0x3b868 eeprom_update_byte_notify((unsigned char *)EEPROM_SILENT, newMenuMode); SilentModeMenu = newMenuMode; 19322: 00 93 a2 03 sts 0x03A2, r16 ; 0x8003a2 19326: df cf rjmp .-66 ; 0x192e6 //printf_P(_n("tmc2130mode/smm/eep: %d %d %d %d"),tmc2130_mode,SilentModeMenu,eeprom_read_byte((uint8_t*)EEPROM_SILENT), bEnableForce_z); } else if (code_seen('Q')) 19328: 81 e5 ldi r24, 0x51 ; 81 1932a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1932e: 88 23 and r24, r24 19330: d1 f2 breq .-76 ; 0x192e6 { printf_P(PSTR("%S: %S\n"), _O(MSG_MODE), 19332: 80 91 8b 06 lds r24, 0x068B ; 0x80068b 19336: 81 11 cpse r24, r1 19338: 15 c0 rjmp .+42 ; 0x19364 1933a: 8a e3 ldi r24, 0x3A ; 58 1933c: 94 e4 ldi r25, 0x44 ; 68 1933e: 9f 93 push r25 19340: 8f 93 push r24 19342: 81 eb ldi r24, 0xB1 ; 177 19344: 97 e4 ldi r25, 0x47 ; 71 19346: 9f 93 push r25 19348: 8f 93 push r24 1934a: 87 ee ldi r24, 0xE7 ; 231 1934c: 94 e8 ldi r25, 0x84 ; 132 1934e: 9f 93 push r25 19350: 8f 93 push r24 19352: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 19356: 0f 90 pop r0 19358: 0f 90 pop r0 1935a: 0f 90 pop r0 1935c: 0f 90 pop r0 1935e: 0f 90 pop r0 19360: 0f 90 pop r0 19362: c1 cf rjmp .-126 ; 0x192e6 19364: 8e e2 ldi r24, 0x2E ; 46 19366: 97 e4 ldi r25, 0x47 ; 71 19368: ea cf rjmp .-44 ; 0x1933e 1936a: 8d ed ldi r24, 0xDD ; 221 1936c: 92 e0 ldi r25, 0x02 ; 2 1936e: 6c 96 adiw r28, 0x1c ; 28 19370: 9f af std Y+63, r25 ; 0x3f 19372: 8e af std Y+62, r24 ; 0x3e 19374: 6c 97 sbiw r28, 0x1c ; 28 19376: ed eb ldi r30, 0xBD ; 189 19378: ee 2e mov r14, r30 1937a: ed e0 ldi r30, 0x0D ; 13 1937c: fe 2e mov r15, r30 1937e: f2 ea ldi r31, 0xA2 ; 162 19380: cf 2e mov r12, r31 19382: f6 e0 ldi r31, 0x06 ; 6 19384: df 2e mov r13, r31 19386: a4 ef ldi r26, 0xF4 ; 244 19388: 8a 2e mov r8, r26 1938a: a4 e0 ldi r26, 0x04 ; 4 1938c: 9a 2e mov r9, r26 1938e: b9 e7 ldi r27, 0x79 ; 121 19390: 2b 2e mov r2, r27 19392: be e0 ldi r27, 0x0E ; 14 19394: 3b 2e mov r3, r27 - `S` - All axes new resolution */ case 350: { #ifdef TMC2130 for (uint_least8_t i=0; i 193b2: b8 2e mov r11, r24 193b4: 88 23 and r24, r24 193b6: 09 f4 brne .+2 ; 0x193ba 193b8: 7c c0 rjmp .+248 ; 0x194b2 { uint16_t res_new = code_value(); 193ba: 0e 94 35 60 call 0xc06a ; 0xc06a 193be: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 193c2: 2b 01 movw r4, r22 193c4: 8b 01 movw r16, r22 #ifdef ALLOW_ALL_MRES bool res_valid = res_new > 0 && res_new <= 256 && !(res_new & (res_new - 1)); // must be a power of two #else bool res_valid = (res_new == 8) || (res_new == 16) || (res_new == 32); // resolutions valid for all axis 193c6: 68 30 cpi r22, 0x08 ; 8 193c8: 71 05 cpc r23, r1 193ca: 09 f4 brne .+2 ; 0x193ce 193cc: 60 c3 rjmp .+1728 ; 0x19a8e 193ce: 60 31 cpi r22, 0x10 ; 16 193d0: 71 05 cpc r23, r1 193d2: 09 f4 brne .+2 ; 0x193d6 193d4: 5c c3 rjmp .+1720 ; 0x19a8e 193d6: 81 e0 ldi r24, 0x01 ; 1 193d8: 00 32 cpi r16, 0x20 ; 32 193da: 11 05 cpc r17, r1 193dc: 09 f0 breq .+2 ; 0x193e0 193de: 80 e0 ldi r24, 0x00 ; 0 res_valid |= (i != E_AXIS) && ((res_new == 1) || (res_new == 2) || (res_new == 4)); // resolutions valid for X Y Z only 193e0: 67 96 adiw r28, 0x17 ; 23 193e2: bf ad ldd r27, Y+63 ; 0x3f 193e4: 67 97 sbiw r28, 0x17 ; 23 193e6: b3 30 cpi r27, 0x03 ; 3 193e8: 09 f4 brne .+2 ; 0x193ec 193ea: 5c c3 rjmp .+1720 ; 0x19aa4 193ec: 92 01 movw r18, r4 193ee: 21 50 subi r18, 0x01 ; 1 193f0: 31 09 sbc r19, r1 193f2: 22 30 cpi r18, 0x02 ; 2 193f4: 31 05 cpc r19, r1 193f6: 08 f0 brcs .+2 ; 0x193fa 193f8: 50 c3 rjmp .+1696 ; 0x19a9a 193fa: 9b 2d mov r25, r11 193fc: 89 2b or r24, r25 res_valid |= (i == E_AXIS) && ((res_new == 64) || (res_new == 128)); // resolutions valid for E only 193fe: 67 96 adiw r28, 0x17 ; 23 19400: ef ad ldd r30, Y+63 ; 0x3f 19402: 67 97 sbiw r28, 0x17 ; 23 19404: e3 30 cpi r30, 0x03 ; 3 19406: 41 f4 brne .+16 ; 0x19418 19408: 00 34 cpi r16, 0x40 ; 64 1940a: 11 05 cpc r17, r1 1940c: 31 f0 breq .+12 ; 0x1941a 1940e: bb 24 eor r11, r11 19410: b3 94 inc r11 19412: 00 38 cpi r16, 0x80 ; 128 19414: 11 05 cpc r17, r1 19416: 09 f0 breq .+2 ; 0x1941a 19418: b1 2c mov r11, r1 #endif if (res_valid) 1941a: 81 11 cpse r24, r1 1941c: 03 c0 rjmp .+6 ; 0x19424 1941e: bb 20 and r11, r11 19420: 09 f4 brne .+2 ; 0x19424 19422: 47 c0 rjmp .+142 ; 0x194b2 { st_synchronize(); 19424: 0f 94 a9 43 call 0x28752 ; 0x28752 return stat; } uint16_t tmc2130_get_res(uint8_t axis) { return tmc2130_mres2usteps(tmc2130_mres[axis]); 19428: d4 01 movw r26, r8 1942a: 8c 91 ld r24, X 1942c: a1 2c mov r10, r1 1942e: bb 24 eor r11, r11 19430: b3 94 inc r11 19432: 02 c0 rjmp .+4 ; 0x19438 19434: b6 94 lsr r11 19436: a7 94 ror r10 19438: 8a 95 dec r24 1943a: e2 f7 brpl .-8 ; 0x19434 uint16_t res = tmc2130_get_res(i); tmc2130_set_res(i, res_new); 1943c: b2 01 movw r22, r4 1943e: 67 96 adiw r28, 0x17 ; 23 19440: 8f ad ldd r24, Y+63 ; 0x3f 19442: 67 97 sbiw r28, 0x17 ; 23 19444: 0f 94 d6 25 call 0x24bac ; 0x24bac cs.axis_ustep_resolution[i] = res_new; 19448: f1 01 movw r30, r2 1944a: 40 82 st Z, r4 if (res_new > res) 1944c: a0 16 cp r10, r16 1944e: b1 06 cpc r11, r17 19450: 08 f0 brcs .+2 ; 0x19454 19452: 47 c0 rjmp .+142 ; 0x194e2 { uint16_t fac = (res_new / res); 19454: c8 01 movw r24, r16 19456: b5 01 movw r22, r10 19458: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> cs.axis_steps_per_mm[i] *= fac; 1945c: 2b 01 movw r4, r22 1945e: 71 2c mov r7, r1 19460: 61 2c mov r6, r1 19462: c3 01 movw r24, r6 19464: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 19468: 9b 01 movw r18, r22 1946a: ac 01 movw r20, r24 1946c: d7 01 movw r26, r14 1946e: 14 96 adiw r26, 0x04 ; 4 19470: 6d 91 ld r22, X+ 19472: 7d 91 ld r23, X+ 19474: 8d 91 ld r24, X+ 19476: 9c 91 ld r25, X 19478: 17 97 sbiw r26, 0x07 ; 7 1947a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1947e: f7 01 movw r30, r14 19480: 64 83 std Z+4, r22 ; 0x04 19482: 75 83 std Z+5, r23 ; 0x05 19484: 86 83 std Z+6, r24 ; 0x06 19486: 97 83 std Z+7, r25 ; 0x07 position[i] *= fac; 19488: d6 01 movw r26, r12 1948a: 2d 91 ld r18, X+ 1948c: 3d 91 ld r19, X+ 1948e: 4d 91 ld r20, X+ 19490: 5c 91 ld r21, X 19492: c3 01 movw r24, r6 19494: b2 01 movw r22, r4 19496: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 1949a: f6 01 movw r30, r12 1949c: 60 83 st Z, r22 1949e: 71 83 std Z+1, r23 ; 0x01 194a0: 82 83 std Z+2, r24 ; 0x02 194a2: 93 83 std Z+3, r25 ; 0x03 uint16_t fac = (res / res_new); cs.axis_steps_per_mm[i] /= fac; position[i] /= fac; } #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) if (i == E_AXIS) 194a4: 67 96 adiw r28, 0x17 ; 23 194a6: ff ad ldd r31, Y+63 ; 0x3f 194a8: 67 97 sbiw r28, 0x17 ; 23 194aa: f3 30 cpi r31, 0x03 ; 3 194ac: 11 f4 brne .+4 ; 0x194b2 fsensor.init(); 194ae: 0f 94 30 7c call 0x2f860 ; 0x2f860 - `S` - All axes new resolution */ case 350: { #ifdef TMC2130 for (uint_least8_t i=0; i 194dc: 5f cf rjmp .-322 ; 0x1939c 194de: 0c 94 61 b6 jmp 0x16cc2 ; 0x16cc2 cs.axis_steps_per_mm[i] *= fac; position[i] *= fac; } else { uint16_t fac = (res / res_new); 194e2: c5 01 movw r24, r10 194e4: b8 01 movw r22, r16 194e6: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> cs.axis_steps_per_mm[i] /= fac; 194ea: 2b 01 movw r4, r22 194ec: 71 2c mov r7, r1 194ee: 61 2c mov r6, r1 194f0: c3 01 movw r24, r6 194f2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 194f6: 9b 01 movw r18, r22 194f8: ac 01 movw r20, r24 194fa: d7 01 movw r26, r14 194fc: 14 96 adiw r26, 0x04 ; 4 194fe: 6d 91 ld r22, X+ 19500: 7d 91 ld r23, X+ 19502: 8d 91 ld r24, X+ 19504: 9c 91 ld r25, X 19506: 17 97 sbiw r26, 0x07 ; 7 19508: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1950c: f7 01 movw r30, r14 1950e: 64 83 std Z+4, r22 ; 0x04 19510: 75 83 std Z+5, r23 ; 0x05 19512: 86 83 std Z+6, r24 ; 0x06 19514: 97 83 std Z+7, r25 ; 0x07 position[i] /= fac; 19516: d6 01 movw r26, r12 19518: 6d 91 ld r22, X+ 1951a: 7d 91 ld r23, X+ 1951c: 8d 91 ld r24, X+ 1951e: 9c 91 ld r25, X 19520: a3 01 movw r20, r6 19522: 92 01 movw r18, r4 19524: 0f 94 01 dd call 0x3ba02 ; 0x3ba02 <__divmodsi4> 19528: f6 01 movw r30, r12 1952a: 20 83 st Z, r18 1952c: 31 83 std Z+1, r19 ; 0x01 1952e: 42 83 std Z+2, r20 ; 0x02 19530: 53 83 std Z+3, r21 ; 0x03 19532: b8 cf rjmp .-144 ; 0x194a4 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') ) { 19534: 80 e5 ldi r24, 0x50 ; 80 19536: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1953a: 88 23 and r24, r24 1953c: 29 f0 breq .+10 ; 0x19548 mmuSlotIndex = code_value_uint8(); 1953e: 0e 94 00 5b call 0xb600 ; 0xb600 19542: 18 2f mov r17, r24 19544: 0c 94 85 af jmp 0x15f0a ; 0x15f0a 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') ) { 19548: 84 e5 ldi r24, 0x54 ; 84 1954a: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 1954e: 81 11 cpse r24, r1 19550: f6 cf rjmp .-20 ; 0x1953e 19552: 0c 94 84 af jmp 0x15f08 ; 0x15f08 */ case 701: { uint8_t mmuSlotIndex = 0xffU; float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU float z_target = 0; 19556: 60 e0 ldi r22, 0x00 ; 0 19558: 70 e0 ldi r23, 0x00 ; 0 1955a: cb 01 movw r24, r22 1955c: 0c 94 9e af jmp 0x15f3c ; 0x15f3c 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; 19560: 82 e0 ldi r24, 0x02 ; 2 19562: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); 19566: 8f ea ldi r24, 0xAF ; 175 19568: 9b e5 ldi r25, 0x5B ; 91 1956a: 0e 94 44 72 call 0xe488 ; 0xe488 1956e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c current_position[E_AXIS] += fastLoadLength; 19572: a7 01 movw r20, r14 19574: 96 01 movw r18, r12 19576: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 1957a: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 1957e: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 19582: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 19586: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1958a: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 1958e: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 19592: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 19596: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence 1959a: 60 e0 ldi r22, 0x00 ; 0 1959c: 70 e0 ldi r23, 0x00 ; 0 1959e: 80 ea ldi r24, 0xA0 ; 160 195a0: 91 e4 ldi r25, 0x41 ; 65 195a2: 0f 94 3d c0 call 0x3807a ; 0x3807a if (raise_z_axis) { // backwards compatibility for 3.12 and older FW 195a6: 01 11 cpse r16, r1 195a8: 06 c0 rjmp .+12 ; 0x195b6 raise_z_above(MIN_Z_FOR_LOAD); 195aa: 60 e0 ldi r22, 0x00 ; 0 195ac: 70 e0 ldi r23, 0x00 ; 0 195ae: 8c e0 ldi r24, 0x0C ; 12 195b0: 92 e4 ldi r25, 0x42 ; 66 195b2: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 } load_filament_final_feed(); // slow sequence 195b6: 0e 94 2b 64 call 0xc856 ; 0xc856 st_synchronize(); 195ba: 0f 94 a9 43 call 0x28752 ; 0x28752 Sound_MakeCustom(50, 500, false); 195be: 40 e0 ldi r20, 0x00 ; 0 195c0: 64 ef ldi r22, 0xF4 ; 244 195c2: 71 e0 ldi r23, 0x01 ; 1 195c4: 82 e3 ldi r24, 0x32 ; 50 195c6: 90 e0 ldi r25, 0x00 ; 0 195c8: 0f 94 3d 52 call 0x2a47a ; 0x2a47a if (!farm_mode && (eFilamentAction != FilamentAction::None)) { 195cc: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 195d0: 81 11 cpse r24, r1 lcd_load_filament_color_check(); 195d2: 0f 94 53 50 call 0x2a0a6 ; 0x2a0a6 #ifdef COMMUNITY_PREVENT_OOZE // Retract filament to prevent oozing retract_for_ooze_prevention(); #endif //COMMUNITY_PREVENT_OOZE lcd_update_enable(true); 195d6: 81 e0 ldi r24, 0x01 ; 1 195d8: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 195dc: 82 e0 ldi r24, 0x02 ; 2 195de: 0e 94 3f 6e call 0xdc7e ; 0xdc7e lcd_setstatuspgm(MSG_WELCOME); 195e2: 82 e1 ldi r24, 0x12 ; 18 195e4: 90 e7 ldi r25, 0x70 ; 112 195e6: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = CustomMsg::Status; 195ea: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 195ee: 0c 94 b3 af jmp 0x15f66 ; 0x15f66 */ case 702: { float z_target = 0; float unloadLength = FILAMENTCHANGE_FINALRETRACT; if (code_seen('U')) unloadLength = code_value(); 195f2: 85 e5 ldi r24, 0x55 ; 85 195f4: 0e 94 6e 5b call 0xb6dc ; 0xb6dc - `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; 195f8: c1 2c mov r12, r1 195fa: d1 2c mov r13, r1 195fc: 76 01 movw r14, r12 if (code_seen('U')) unloadLength = code_value(); 195fe: 88 23 and r24, r24 19600: 21 f0 breq .+8 ; 0x1960a 19602: 0e 94 35 60 call 0xc06a ; 0xc06a 19606: 6b 01 movw r12, r22 19608: 7c 01 movw r14, r24 // For safety only allow positive values if (code_seen('Z')) z_target = fabs(code_value()); 1960a: 8a e5 ldi r24, 0x5A ; 90 1960c: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 19610: 88 23 and r24, r24 19612: a1 f0 breq .+40 ; 0x1963c 19614: 0e 94 35 60 call 0xc06a ; 0xc06a 19618: 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); 1961a: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 1961e: 4b 01 movw r8, r22 19620: 5c 01 movw r10, r24 // Unload filament if (MMU2::mmu2.Enabled()) MMU2::mmu2.unload(); 19622: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 19626: 81 30 cpi r24, 0x01 ; 1 19628: 99 f4 brne .+38 ; 0x19650 1962a: 0f 94 31 ad call 0x35a62 ; 0x35a62 else unload_filament(unloadLength); // Restore Z axis raise_z(-delta); 1962e: c5 01 movw r24, r10 19630: b4 01 movw r22, r8 19632: 90 58 subi r25, 0x80 ; 128 19634: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 19638: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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 1963c: 60 e0 ldi r22, 0x00 ; 0 1963e: 70 e0 ldi r23, 0x00 ; 0 19640: 8c e0 ldi r24, 0x0C ; 12 19642: 92 e4 ldi r25, 0x42 ; 66 19644: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 - `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; 19648: 60 e0 ldi r22, 0x00 ; 0 1964a: 70 e0 ldi r23, 0x00 ; 0 1964c: cb 01 movw r24, r22 1964e: e5 cf rjmp .-54 ; 0x1961a // Raise the Z axis float delta = raise_z(z_target); // Unload filament if (MMU2::mmu2.Enabled()) MMU2::mmu2.unload(); else unload_filament(unloadLength); 19650: c7 01 movw r24, r14 19652: b6 01 movw r22, r12 19654: 0e 94 08 f9 call 0x1f210 ; 0x1f210 19658: ea cf rjmp .-44 ; 0x1962e #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 705: { gcodes_M704_M705_M706(705); 1965a: 81 ec ldi r24, 0xC1 ; 193 1965c: 92 e0 ldi r25, 0x02 ; 2 1965e: 0e 94 e7 5f call 0xbfce ; 0xbfce 19662: 0c 94 83 b0 jmp 0x16106 ; 0x16106 #### Parameters - `P` - n index of slot (zero based, so 0-4 like T0 and T4) */ case 706: { gcodes_M704_M705_M706(706); 19666: 82 ec ldi r24, 0xC2 ; 194 19668: 92 e0 ldi r25, 0x02 ; 2 1966a: 0e 94 e7 5f call 0xbfce ; 0xbfce 1966e: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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() ) { 19672: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 19676: 81 30 cpi r24, 0x01 ; 1 19678: 11 f0 breq .+4 ; 0x1967e 1967a: 0c 94 83 b0 jmp 0x16106 ; 0x16106 if( code_seen('A') ) { 1967e: 81 e4 ldi r24, 0x41 ; 65 19680: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 19684: 88 23 and r24, r24 19686: 11 f4 brne .+4 ; 0x1968c 19688: 0c 94 83 b0 jmp 0x16106 ; 0x16106 MMU2::mmu2.ReadRegister(uint8_t(strtol(strchr_pointer+1, NULL, 16))); 1968c: 80 91 93 03 lds r24, 0x0393 ; 0x800393 19690: 90 91 94 03 lds r25, 0x0394 ; 0x800394 19694: 40 e1 ldi r20, 0x10 ; 16 19696: 50 e0 ldi r21, 0x00 ; 0 19698: 70 e0 ldi r23, 0x00 ; 0 1969a: 60 e0 ldi r22, 0x00 ; 0 1969c: 01 96 adiw r24, 0x01 ; 1 1969e: 0f 94 9b d7 call 0x3af36 ; 0x3af36 196a2: 86 2f mov r24, r22 196a4: 0f 94 77 10 call 0x220ee ; 0x220ee 196a8: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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() ){ 196ac: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 196b0: 81 30 cpi r24, 0x01 ; 1 196b2: 11 f0 breq .+4 ; 0x196b8 196b4: 0c 94 83 b0 jmp 0x16106 ; 0x16106 uint8_t addr = 0; if( code_seen('A') ) { 196b8: 81 e4 ldi r24, 0x41 ; 65 196ba: 0e 94 6e 5b call 0xb6dc ; 0xb6dc Does nothing if A parameter is missing or if MMU is not enabled. */ case 708: { if ( MMU2::mmu2.Enabled() ){ uint8_t addr = 0; 196be: 10 e0 ldi r17, 0x00 ; 0 if( code_seen('A') ) { 196c0: 88 23 and r24, r24 196c2: 61 f0 breq .+24 ; 0x196dc addr = uint8_t(strtol(strchr_pointer+1, NULL, 16)); 196c4: 80 91 93 03 lds r24, 0x0393 ; 0x800393 196c8: 90 91 94 03 lds r25, 0x0394 ; 0x800394 196cc: 40 e1 ldi r20, 0x10 ; 16 196ce: 50 e0 ldi r21, 0x00 ; 0 196d0: 70 e0 ldi r23, 0x00 ; 0 196d2: 60 e0 ldi r22, 0x00 ; 0 196d4: 01 96 adiw r24, 0x01 ; 1 196d6: 0f 94 9b d7 call 0x3af36 ; 0x3af36 196da: 16 2f mov r17, r22 } uint16_t data = 0; if( code_seen('X') ) { 196dc: 88 e5 ldi r24, 0x58 ; 88 196de: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 196e2: 88 23 and r24, r24 196e4: 61 f0 breq .+24 ; 0x196fe data = code_value_short(); 196e6: 0e 94 0d 5b call 0xb61a ; 0xb61a } if(addr){ 196ea: 11 23 and r17, r17 196ec: 11 f4 brne .+4 ; 0x196f2 196ee: 0c 94 83 b0 jmp 0x16106 ; 0x16106 MMU2::mmu2.WriteRegister(addr, data); 196f2: bc 01 movw r22, r24 196f4: 81 2f mov r24, r17 196f6: 0e 94 fd e8 call 0x1d1fa ; 0x1d1fa 196fa: 0c 94 83 b0 jmp 0x16106 ; 0x16106 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; 196fe: 90 e0 ldi r25, 0x00 ; 0 19700: 80 e0 ldi r24, 0x00 ; 0 19702: f3 cf rjmp .-26 ; 0x196ea 19704: 60 e0 ldi r22, 0x00 ; 0 19706: 8c ea ldi r24, 0xAC ; 172 19708: 9c e0 ldi r25, 0x0C ; 12 1970a: 0f 94 34 dc call 0x3b868 ; 0x3b868 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 1970e: 10 92 b9 13 sts 0x13B9, r1 ; 0x8013b9 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 19712: 10 92 67 13 sts 0x1367, r1 ; 0x801367 currentScope = Scope::Stopped; 19716: 10 92 4c 13 sts 0x134C, r1 ; 0x80134c 1971a: 0c 94 f9 af jmp 0x15ff2 ; 0x15ff2 1971e: 61 e0 ldi r22, 0x01 ; 1 19720: 8c ea ldi r24, 0xAC ; 172 19722: 9c e0 ldi r25, 0x0C ; 12 19724: 0f 94 34 dc call 0x3b868 ; 0x3b868 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(); 19728: 0e 94 49 e4 call 0x1c892 ; 0x1c892 1972c: 0c 94 f9 af jmp 0x15ff2 ; 0x15ff2 break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 19730: 80 e0 ldi r24, 0x00 ; 0 } void MMU2::ResetX42() { logic.ResetMMU(42); 19732: 0f 94 58 10 call 0x220b0 ; 0x220b0 19736: 0c 94 0f b0 jmp 0x1601e ; 0x1601e } void MMU2::TriggerResetPin() { reset(); 1973a: 0f 94 8e c5 call 0x38b1c ; 0x38b1c 1973e: 0c 94 0f b0 jmp 0x1601e ; 0x1601e void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset } void MMU2::ResetX42() { logic.ResetMMU(42); 19742: 8a e2 ldi r24, 0x2A ; 42 19744: f6 cf rjmp .-20 ; 0x19732 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') { 19746: 84 35 cpi r24, 0x54 ; 84 19748: 09 f0 breq .+2 ; 0x1974c 1974a: 79 c0 rjmp .+242 ; 0x1983e strchr_pointer = CMDBUFFER_CURRENT_STRING; 1974c: 10 93 94 03 sts 0x0394, r17 ; 0x800394 19750: 00 93 93 03 sts 0x0393, r16 ; 0x800393 processing_tcode = true; 19754: 81 e0 ldi r24, 0x01 ; 1 19756: 80 93 a1 03 sts 0x03A1, r24 ; 0x8003a1 TCodes(strchr_pointer, code_value_uint8()); 1975a: 0e 94 00 5b call 0xb600 ; 0xb600 1975e: 18 2f mov r17, r24 19760: 20 91 93 03 lds r18, 0x0393 ; 0x800393 19764: 30 91 94 03 lds r19, 0x0394 ; 0x800394 inline void TCodeInvalid() { SERIAL_ECHOLNPGM("Invalid T code."); } void TCodes(char *const strchr_pointer, const uint8_t codeValue) { uint8_t index = 1; 19768: 91 e0 ldi r25, 0x01 ; 1 for ( /*nothing*/ ; strchr_pointer[index] == ' ' || strchr_pointer[index] == '\t'; index++) 1976a: 79 01 movw r14, r18 1976c: e9 0e add r14, r25 1976e: f1 1c adc r15, r1 19770: d7 01 movw r26, r14 19772: 8c 91 ld r24, X 19774: 80 32 cpi r24, 0x20 ; 32 19776: 11 f0 breq .+4 ; 0x1977c 19778: 89 30 cpi r24, 0x09 ; 9 1977a: 11 f4 brne .+4 ; 0x19780 1977c: 9f 5f subi r25, 0xFF ; 255 1977e: f5 cf rjmp .-22 ; 0x1976a ; strchr_pointer[index] = tolower(strchr_pointer[index]); 19780: 08 2e mov r0, r24 19782: 00 0c add r0, r0 19784: 99 0b sbc r25, r25 19786: 0f 94 24 e2 call 0x3c448 ; 0x3c448 1978a: f7 01 movw r30, r14 1978c: 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'); 1978e: 90 ed ldi r25, 0xD0 ; 208 19790: 98 0f add r25, r24 19792: 95 30 cpi r25, 0x05 ; 5 19794: 58 f0 brcs .+22 ; 0x197ac 19796: 8f 33 cpi r24, 0x3F ; 63 19798: 59 f0 breq .+22 ; 0x197b0 1979a: 88 37 cpi r24, 0x78 ; 120 1979c: 49 f0 breq .+18 ; 0x197b0 1979e: 83 36 cpi r24, 0x63 ; 99 197a0: f1 f0 breq .+60 ; 0x197de } inline void TCodeInvalid() { SERIAL_ECHOLNPGM("Invalid T code."); 197a2: 8d ec ldi r24, 0xCD ; 205 197a4: 9d e7 ldi r25, 0x7D ; 125 } else { SERIAL_ECHO_START; if (codeValue >= EXTRUDERS) { SERIAL_ECHO('T'); SERIAL_ECHOLN(codeValue + '0'); SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER 197a6: 0e 94 13 79 call 0xf226 ; 0xf226 197aa: 13 c0 rjmp .+38 ; 0x197d2 strchr_pointer[index] = tolower(strchr_pointer[index]); if (IsInvalidTCode(strchr_pointer, index)){ TCodeInvalid(); } else if (strchr_pointer[index] == 'x' || strchr_pointer[index] == '?'){ 197ac: 8f 33 cpi r24, 0x3F ; 63 197ae: a9 f4 brne .+42 ; 0x197da // load to extruder gears; if mmu is not present do nothing if (MMU2::mmu2.Enabled()) { 197b0: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 197b4: 81 30 cpi r24, 0x01 ; 1 197b6: 69 f4 brne .+26 ; 0x197d2 MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT)); 197b8: 8c e5 ldi r24, 0x5C ; 92 197ba: 9b e3 ldi r25, 0x3B ; 59 197bc: 0e 94 44 72 call 0xe488 ; 0xe488 197c0: 70 e0 ldi r23, 0x00 ; 0 197c2: 60 e0 ldi r22, 0x00 ; 0 197c4: 0e 94 bc e4 call 0x1c978 ; 0x1c978 197c8: 68 2f mov r22, r24 197ca: d7 01 movw r26, r14 197cc: 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()); 197ce: 0f 94 f6 0f call 0x21fec ; 0x21fec processing_tcode = false; 197d2: 10 92 a1 03 sts 0x03A1, r1 ; 0x8003a1 197d6: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 } 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'){ 197da: 83 36 cpi r24, 0x63 ; 99 197dc: 49 f4 brne .+18 ; 0x197f0 // load from extruder gears to nozzle (nozzle should be preheated) if (MMU2::mmu2.Enabled()) { 197de: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 197e2: 81 30 cpi r24, 0x01 ; 1 197e4: b1 f7 brne .-20 ; 0x197d2 MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool()); 197e6: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 197ea: 68 2f mov r22, r24 197ec: 83 e6 ldi r24, 0x63 ; 99 197ee: ef cf rjmp .-34 ; 0x197ce } } else { // Process T0 ... T4 if (MMU2::mmu2.Enabled()) { 197f0: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 197f4: 81 30 cpi r24, 0x01 ; 1 197f6: 69 f4 brne .+26 ; 0x19812 if (codeValue == MMU2::mmu2.get_current_tool()){ 197f8: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 197fc: 18 13 cpse r17, r24 197fe: 05 c0 rjmp .+10 ; 0x1980a // don't execute the same T-code twice in a row puts_P(duplicate_Tcode_ignored); 19800: 8d ed ldi r24, 0xDD ; 221 19802: 9d e7 ldi r25, 0x7D ; 125 19804: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 19808: e4 cf rjmp .-56 ; 0x197d2 #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); 1980a: 81 2f mov r24, r17 1980c: 0f 94 d3 0f call 0x21fa6 ; 0x21fa6 19810: e0 cf rjmp .-64 ; 0x197d2 } } else { SERIAL_ECHO_START; 19812: 82 ef ldi r24, 0xF2 ; 242 19814: 9a ea ldi r25, 0xAA ; 170 19816: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (codeValue >= EXTRUDERS) { 1981a: 11 23 and r17, r17 1981c: 59 f0 breq .+22 ; 0x19834 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 1981e: 84 e5 ldi r24, 0x54 ; 84 19820: 0e 94 cf 76 call 0xed9e ; 0xed9e SERIAL_ECHO('T'); SERIAL_ECHOLN(codeValue + '0'); 19824: 81 2f mov r24, r17 19826: 90 e0 ldi r25, 0x00 ; 0 19828: c0 96 adiw r24, 0x30 ; 48 1982a: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER 1982e: 89 ef ldi r24, 0xF9 ; 249 19830: 96 e6 ldi r25, 0x66 ; 102 19832: b9 cf rjmp .-142 ; 0x197a6 // next_feedrate = code_value(); // if (next_feedrate > 0.0) { // feedrate = next_feedrate; // } // } SERIAL_ECHORPGM(_n("Active Extruder: 0")); ////MSG_ACTIVE_EXTRUDER 19834: 86 ee ldi r24, 0xE6 ; 230 19836: 96 e6 ldi r25, 0x66 ; 102 19838: 0e 94 e8 76 call 0xedd0 ; 0xedd0 1983c: ca cf rjmp .-108 ; 0x197d2 /** *--------------------------------------------------------------------------------- *# D codes */ else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug) 1983e: 84 34 cpi r24, 0x44 ; 68 19840: 09 f0 breq .+2 ; 0x19844 19842: ee c0 rjmp .+476 ; 0x19a20 { strchr_pointer = CMDBUFFER_CURRENT_STRING; 19844: 10 93 94 03 sts 0x0394, r17 ; 0x800394 19848: 00 93 93 03 sts 0x0393, r16 ; 0x800393 switch(code_value_short()) 1984c: 0e 94 0d 5b call 0xb61a ; 0xb61a 19850: 86 30 cpi r24, 0x06 ; 6 19852: 91 05 cpc r25, r1 19854: 09 f4 brne .+2 ; 0x19858 19856: 79 c0 rjmp .+242 ; 0x1994a 19858: 9c f4 brge .+38 ; 0x19880 1985a: 82 30 cpi r24, 0x02 ; 2 1985c: 91 05 cpc r25, r1 1985e: 09 f4 brne .+2 ; 0x19862 19860: 52 c0 rjmp .+164 ; 0x19906 19862: 83 30 cpi r24, 0x03 ; 3 19864: 91 05 cpc r25, r1 19866: 09 f4 brne .+2 ; 0x1986a 19868: 61 c0 rjmp .+194 ; 0x1992c 1986a: 01 96 adiw r24, 0x01 ; 1 1986c: 89 f4 brne .+34 ; 0x19890 * */ void dcode__1() { DBG(_N("D-1 - Endless loop\n")); 1986e: 82 ed ldi r24, 0xD2 ; 210 19870: 96 e6 ldi r25, 0x66 ; 102 19872: 9f 93 push r25 19874: 8f 93 push r24 19876: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 1987a: 0f 90 pop r0 1987c: 0f 90 pop r0 1987e: ff cf rjmp .-2 ; 0x1987e 19880: 85 31 cpi r24, 0x15 ; 21 19882: 91 05 cpc r25, r1 19884: 09 f4 brne .+2 ; 0x19888 19886: 8d c0 rjmp .+282 ; 0x199a2 19888: 94 f4 brge .+36 ; 0x198ae 1988a: 44 97 sbiw r24, 0x14 ; 20 1988c: 09 f4 brne .+2 ; 0x19890 1988e: 69 c0 rjmp .+210 ; 0x19962 #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //DEBUG_DCODES default: printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE); 19890: 80 91 91 12 lds r24, 0x1291 ; 0x801291 19894: 90 91 92 12 lds r25, 0x1292 ; 0x801292 19898: 89 55 subi r24, 0x59 ; 89 1989a: 9f 4e sbci r25, 0xEF ; 239 1989c: 9f 93 push r25 1989e: 8f 93 push r24 198a0: 1f 92 push r1 198a2: 84 e4 ldi r24, 0x44 ; 68 198a4: 8f 93 push r24 198a6: 80 ee ldi r24, 0xE0 ; 224 198a8: 98 e6 ldi r25, 0x68 ; 104 198aa: 0c 94 73 97 jmp 0x12ee6 ; 0x12ee6 *# D codes */ else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug) { strchr_pointer = CMDBUFFER_CURRENT_STRING; switch(code_value_short()) 198ae: 86 31 cpi r24, 0x16 ; 22 198b0: 91 05 cpc r25, r1 198b2: 09 f4 brne .+2 ; 0x198b6 198b4: 9b c0 rjmp .+310 ; 0x199ec 198b6: 86 34 cpi r24, 0x46 ; 70 198b8: 91 05 cpc r25, r1 198ba: 51 f7 brne .-44 ; 0x19890 #### Parameters - `S` - Enable 0-1 (default 0) */ case 70: { if(code_seen('S')) 198bc: 83 e5 ldi r24, 0x53 ; 83 198be: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 198c2: 88 23 and r24, r24 198c4: 11 f4 brne .+4 ; 0x198ca 198c6: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 thermal_model_log_enable(code_value_short()); 198ca: 0e 94 0d 5b call 0xb61a ; 0xb61a 198ce: 11 e0 ldi r17, 0x01 ; 1 198d0: 00 97 sbiw r24, 0x00 ; 0 198d2: 09 f4 brne .+2 ; 0x198d6 198d4: 10 e0 ldi r17, 0x00 ; 0 } #ifdef THERMAL_MODEL_DEBUG void thermal_model_log_enable(bool enable) { if(enable) { 198d6: 89 2b or r24, r25 198d8: 91 f0 breq .+36 ; 0x198fe TempMgrGuard temp_mgr_guard; 198da: ce 01 movw r24, r28 198dc: 01 96 adiw r24, 0x01 ; 1 198de: 0f 94 76 32 call 0x264ec ; 0x264ec thermal_model::log_buf.entry.stamp = _millis(); 198e2: 0f 94 28 2a call 0x25450 ; 0x25450 198e6: 60 93 23 06 sts 0x0623, r22 ; 0x800623 <_ZN13thermal_modelL7log_bufE.lto_priv.539> 198ea: 70 93 24 06 sts 0x0624, r23 ; 0x800624 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x1> 198ee: 80 93 25 06 sts 0x0625, r24 ; 0x800625 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x2> 198f2: 90 93 26 06 sts 0x0626, r25 ; 0x800626 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x3> #ifdef THERMAL_MODEL_DEBUG void thermal_model_log_enable(bool enable) { if(enable) { TempMgrGuard temp_mgr_guard; 198f6: ce 01 movw r24, r28 198f8: 01 96 adiw r24, 0x01 ; 1 198fa: 0f 94 69 32 call 0x264d2 ; 0x264d2 thermal_model::log_buf.entry.stamp = _millis(); } thermal_model::log_buf.enabled = enable; 198fe: 10 93 33 06 sts 0x0633, r17 ; 0x800633 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x10> 19902: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 - The hex data needs to be lowercase */ void dcode_2() { dcode_core(RAMSTART, RAMEND+1, dcode_mem_t::sram, 2, _N("SRAM")); 19906: 4d ec ldi r20, 0xCD ; 205 19908: c4 2e mov r12, r20 1990a: 46 e6 ldi r20, 0x66 ; 102 1990c: d4 2e mov r13, r20 1990e: 52 e0 ldi r21, 0x02 ; 2 19910: e5 2e mov r14, r21 19912: 00 e0 ldi r16, 0x00 ; 0 19914: 20 e0 ldi r18, 0x00 ; 0 19916: 32 e2 ldi r19, 0x22 ; 34 19918: 40 e0 ldi r20, 0x00 ; 0 1991a: 50 e0 ldi r21, 0x00 ; 0 1991c: 60 e0 ldi r22, 0x00 ; 0 1991e: 72 e0 ldi r23, 0x02 ; 2 19920: 80 e0 ldi r24, 0x00 ; 0 19922: 90 e0 ldi r25, 0x00 ; 0 - The hex data needs to be lowercase - Writing is currently not implemented */ void dcode_6() { dcode_core(0x0, XFLASH_SIZE, dcode_mem_t::xflash, 6, _N("XFLASH")); 19924: 0e 94 3b 62 call 0xc476 ; 0xc476 19928: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 - The hex data needs to be lowercase */ void dcode_3() { dcode_core(0, EEPROM_SIZE, dcode_mem_t::eeprom, 3, _N("EEPROM")); 1992c: 26 ec ldi r18, 0xC6 ; 198 1992e: c2 2e mov r12, r18 19930: 26 e6 ldi r18, 0x66 ; 102 19932: d2 2e mov r13, r18 19934: 33 e0 ldi r19, 0x03 ; 3 19936: e3 2e mov r14, r19 19938: 01 e0 ldi r16, 0x01 ; 1 1993a: 20 e0 ldi r18, 0x00 ; 0 1993c: 30 e1 ldi r19, 0x10 ; 16 1993e: 40 e0 ldi r20, 0x00 ; 0 19940: 50 e0 ldi r21, 0x00 ; 0 - The hex data needs to be lowercase - Writing is currently not implemented */ void dcode_6() { dcode_core(0x0, XFLASH_SIZE, dcode_mem_t::xflash, 6, _N("XFLASH")); 19942: 60 e0 ldi r22, 0x00 ; 0 19944: 70 e0 ldi r23, 0x00 ; 0 19946: cb 01 movw r24, r22 19948: ed cf rjmp .-38 ; 0x19924 1994a: 8f eb ldi r24, 0xBF ; 191 1994c: c8 2e mov r12, r24 1994e: 86 e6 ldi r24, 0x66 ; 102 19950: d8 2e mov r13, r24 19952: 96 e0 ldi r25, 0x06 ; 6 19954: e9 2e mov r14, r25 19956: 03 e0 ldi r16, 0x03 ; 3 19958: 20 e0 ldi r18, 0x00 ; 0 1995a: 30 e0 ldi r19, 0x00 ; 0 1995c: 44 e0 ldi r20, 0x04 ; 4 1995e: 50 e0 ldi r21, 0x00 ; 0 19960: f0 cf rjmp .-32 ; 0x19942 #ifdef XFLASH_DUMP #include "xflash_dump.h" void dcode_20() { if(code_seen('E')) 19962: 85 e4 ldi r24, 0x45 ; 69 19964: 0e 94 6e 5b call 0xb6dc ; 0xb6dc 19968: 88 23 and r24, r24 1996a: 29 f0 breq .+10 ; 0x19976 xfdump_full_dump_and_reset(); 1996c: 80 e0 ldi r24, 0x00 ; 0 1996e: 0e 94 75 ee call 0x1dcea ; 0x1dcea 19972: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 else { unsigned long ts = _millis(); 19976: 0f 94 28 2a call 0x25450 ; 0x25450 1997a: 6b 01 movw r12, r22 1997c: 7c 01 movw r14, r24 xfdump_dump(); 1997e: 0e 94 a3 ee call 0x1dd46 ; 0x1dd46 ts = _millis() - ts; 19982: 0f 94 28 2a call 0x25450 ; 0x25450 19986: dc 01 movw r26, r24 19988: cb 01 movw r24, r22 1998a: 8c 19 sub r24, r12 1998c: 9d 09 sbc r25, r13 1998e: ae 09 sbc r26, r14 19990: bf 09 sbc r27, r15 DBG(_N("dump completed in %lums\n"), ts); 19992: bf 93 push r27 19994: af 93 push r26 19996: 9f 93 push r25 19998: 8f 93 push r24 1999a: 86 ea ldi r24, 0xA6 ; 166 1999c: 96 e6 ldi r25, 0x66 ; 102 1999e: 0c 94 73 97 jmp 0x12ee6 ; 0x12ee6 } } void dcode_21() { if(!xfdump_check_state()) 199a2: 90 e0 ldi r25, 0x00 ; 0 199a4: 80 e0 ldi r24, 0x00 ; 0 199a6: 0e 94 c1 ed call 0x1db82 ; 0x1db82 199aa: 81 11 cpse r24, r1 199ac: 07 c0 rjmp .+14 ; 0x199bc DBG(_N("no dump available\n")); 199ae: 83 e9 ldi r24, 0x93 ; 147 199b0: 96 e6 ldi r25, 0x66 ; 102 if(!xfdump_check_state()) DBG(_N("no dump available\n")); else { xfdump_reset(); DBG(_N("dump cleared\n")); 199b2: 9f 93 push r25 199b4: 8f 93 push r24 199b6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 199ba: 14 c0 rjmp .+40 ; 0x199e4 { if(!xfdump_check_state()) DBG(_N("no dump available\n")); else { KEEPALIVE_STATE(NOT_BUSY); 199bc: 81 e0 ldi r24, 0x01 ; 1 199be: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be DBG(_N("D21 - read crash dump\n")); 199c2: 8c e7 ldi r24, 0x7C ; 124 199c4: 96 e6 ldi r25, 0x66 ; 102 199c6: 9f 93 push r25 199c8: 8f 93 push r24 199ca: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 print_mem(DUMP_OFFSET, sizeof(dump_t), dcode_mem_t::xflash); 199ce: 03 e0 ldi r16, 0x03 ; 3 199d0: 20 e0 ldi r18, 0x00 ; 0 199d2: 33 e2 ldi r19, 0x23 ; 35 199d4: 40 e0 ldi r20, 0x00 ; 0 199d6: 50 e0 ldi r21, 0x00 ; 0 199d8: 60 e0 ldi r22, 0x00 ; 0 199da: 70 ed ldi r23, 0xD0 ; 208 199dc: 83 e0 ldi r24, 0x03 ; 3 199de: 90 e0 ldi r25, 0x00 ; 0 199e0: 0f 94 20 87 call 0x30e40 ; 0x30e40 if(!xfdump_check_state()) DBG(_N("no dump available\n")); else { xfdump_reset(); DBG(_N("dump cleared\n")); 199e4: 0f 90 pop r0 199e6: 0f 90 pop r0 199e8: 0c 94 d8 95 jmp 0x12bb0 ; 0x12bb0 } } void dcode_22() { if(!xfdump_check_state()) 199ec: 90 e0 ldi r25, 0x00 ; 0 199ee: 80 e0 ldi r24, 0x00 ; 0 199f0: 0e 94 c1 ed call 0x1db82 ; 0x1db82 199f4: 81 11 cpse r24, r1 199f6: 03 c0 rjmp .+6 ; 0x199fe DBG(_N("no dump available\n")); 199f8: 89 e6 ldi r24, 0x69 ; 105 199fa: 96 e6 ldi r25, 0x66 ; 102 199fc: da cf rjmp .-76 ; 0x199b2 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 199fe: 8c e5 ldi r24, 0x5C ; 92 19a00: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 19a02: 1d bc out 0x2d, r1 ; 45 void xfdump_reset() { XFLASH_SPI_ENTER(); xflash_enable_wr(); 19a04: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 _CS_HIGH(); } void xflash_sector_erase(uint32_t addr) { return xflash_erase(_CMD_SECTOR_ERASE, addr); 19a08: 40 e0 ldi r20, 0x00 ; 0 19a0a: 50 ed ldi r21, 0xD0 ; 208 19a0c: 63 e0 ldi r22, 0x03 ; 3 19a0e: 70 e0 ldi r23, 0x00 ; 0 19a10: 80 e2 ldi r24, 0x20 ; 32 19a12: 0e 94 7b ed call 0x1daf6 ; 0x1daf6 xflash_sector_erase(DUMP_OFFSET + offsetof(dump_t, header.magic)); xflash_wait_busy(); 19a16: 0e 94 5d ed call 0x1daba ; 0x1daba else { xfdump_reset(); DBG(_N("dump cleared\n")); 19a1a: 8b e5 ldi r24, 0x5B ; 91 19a1c: 96 e6 ldi r25, 0x66 ; 102 19a1e: c9 cf rjmp .-110 ; 0x199b2 } } else { SERIAL_ECHO_START; 19a20: 82 ef ldi r24, 0xF2 ; 242 19a22: 9a ea ldi r25, 0xAA ; 170 19a24: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND); 19a28: 8b e5 ldi r24, 0x5B ; 91 19a2a: 97 e6 ldi r25, 0x67 ; 103 19a2c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHO(CMDBUFFER_CURRENT_STRING); 19a30: 80 91 91 12 lds r24, 0x1291 ; 0x801291 19a34: 90 91 92 12 lds r25, 0x1292 ; 0x801292 19a38: 89 55 subi r24, 0x59 ; 89 19a3a: 9f 4e sbci r25, 0xEF ; 239 19a3c: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHOLNPGM("\"(2)"); 19a40: 82 ee ldi r24, 0xE2 ; 226 19a42: 94 e8 ldi r25, 0x84 ; 132 19a44: 0c 94 e3 97 jmp 0x12fc6 ; 0x12fc6 #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 19a48: 2d ec ldi r18, 0xCD ; 205 19a4a: 3c ec ldi r19, 0xCC ; 204 19a4c: 4c ec ldi r20, 0xCC ; 204 19a4e: 5d e3 ldi r21, 0x3D ; 61 19a50: c7 01 movw r24, r14 19a52: b6 01 movw r22, r12 19a54: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 19a58: 18 16 cp r1, r24 19a5a: 14 f4 brge .+4 ; 0x19a60 19a5c: 0c 94 20 99 jmp 0x13240 ; 0x13240 19a60: 0c 94 8e 9a jmp 0x1351c ; 0x1351c 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; 19a64: a3 01 movw r20, r6 19a66: 92 01 movw r18, r4 19a68: 62 2d mov r22, r2 19a6a: 73 2d mov r23, r3 19a6c: 8e 2d mov r24, r14 19a6e: 9f 2d mov r25, r15 19a70: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 19a74: 18 16 cp r1, r24 19a76: 14 f0 brlt .+4 ; 0x19a7c 19a78: 0c 94 6f a2 jmp 0x144de ; 0x144de 19a7c: e5 e0 ldi r30, 0x05 ; 5 19a7e: ce 0e add r12, r30 19a80: d1 1c adc r13, r1 19a82: f2 e0 ldi r31, 0x02 ; 2 19a84: 8f 0e add r8, r31 19a86: 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; 19a88: 85 01 movw r16, r10 19a8a: 0c 94 36 a2 jmp 0x1446c ; 0x1446c uint16_t res_new = code_value(); #ifdef ALLOW_ALL_MRES bool res_valid = res_new > 0 && res_new <= 256 && !(res_new & (res_new - 1)); // must be a power of two #else bool res_valid = (res_new == 8) || (res_new == 16) || (res_new == 32); // resolutions valid for all axis res_valid |= (i != E_AXIS) && ((res_new == 1) || (res_new == 2) || (res_new == 4)); // resolutions valid for X Y Z only 19a8e: 67 96 adiw r28, 0x17 ; 23 19a90: 2f ad ldd r18, Y+63 ; 0x3f 19a92: 67 97 sbiw r28, 0x17 ; 23 19a94: 8b 2d mov r24, r11 19a96: 23 30 cpi r18, 0x03 ; 3 19a98: 29 f0 breq .+10 ; 0x19aa4 19a9a: 91 e0 ldi r25, 0x01 ; 1 19a9c: 04 30 cpi r16, 0x04 ; 4 19a9e: 11 05 cpc r17, r1 19aa0: 09 f4 brne .+2 ; 0x19aa4 19aa2: ac cc rjmp .-1704 ; 0x193fc 19aa4: 90 e0 ldi r25, 0x00 ; 0 19aa6: aa cc rjmp .-1708 ; 0x193fc 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)); 19aa8: 85 e5 ldi r24, 0x55 ; 85 19aaa: 99 e3 ldi r25, 0x39 ; 57 19aac: 0e 94 44 72 call 0xe488 ; 0xe488 19ab0: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_puts_at_P(0, 2, PSTR("")); 19ab4: 45 e4 ldi r20, 0x45 ; 69 19ab6: 54 e8 ldi r21, 0x84 ; 132 19ab8: 62 e0 ldi r22, 0x02 ; 2 19aba: 80 e0 ldi r24, 0x00 ; 0 19abc: 0e 94 8c 6e call 0xdd18 ; 0xdd18 for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c) 19ac0: f8 01 movw r30, r16 19ac2: 81 91 ld r24, Z+ 19ac4: 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'; 19ac6: 98 2f mov r25, r24 19ac8: 9f 7d andi r25, 0xDF ; 223 19aca: 11 f4 brne .+4 ; 0x19ad0 19acc: 0c 94 ca b6 jmp 0x16d94 ; 0x16d94 19ad0: 97 ef ldi r25, 0xF7 ; 247 19ad2: 98 0f add r25, r24 19ad4: 92 30 cpi r25, 0x02 ; 2 19ad6: 10 f4 brcc .+4 ; 0x19adc 19ad8: 0c 94 ca b6 jmp 0x16d94 ; 0x16d94 19adc: 8d 30 cpi r24, 0x0D ; 13 19ade: 11 f4 brne .+4 ; 0x19ae4 19ae0: 0c 94 ca b6 jmp 0x16d94 ; 0x16d94 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); 19ae4: 0e 94 67 6e call 0xdcce ; 0xdcce 19ae8: eb cf rjmp .-42 ; 0x19ac0 thermal_model::data.L = samples * intv_ms; } void thermal_model_set_params(float P, float U, float V, float C, float D, int16_t L, float Ta_corr, float warn, float err) { TempMgrGuard temp_mgr_guard; 19aea: ce 01 movw r24, r28 19aec: 01 96 adiw r24, 0x01 ; 1 19aee: 0f 94 76 32 call 0x264ec ; 0x264ec 19af2: 0c 94 b9 aa jmp 0x15572 ; 0x15572 00019af6 : uint8_t check_pinda_0() { return _PINDA?0:1; } 19af6: 22 e0 ldi r18, 0x02 ; 2 19af8: 20 93 c0 00 sts 0x00C0, r18 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> 19afc: 10 92 c5 00 sts 0x00C5, r1 ; 0x8000c5 <__TEXT_REGION_LENGTH__+0x7c20c5> 19b00: 90 e1 ldi r25, 0x10 ; 16 19b02: 90 93 c4 00 sts 0x00C4, r25 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7c20c4> 19b06: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b0a: 80 61 ori r24, 0x10 ; 16 19b0c: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b10: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b14: 88 60 ori r24, 0x08 ; 8 19b16: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b1a: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b1e: 80 68 ori r24, 0x80 ; 128 19b20: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 19b24: 80 91 38 05 lds r24, 0x0538 ; 0x800538 19b28: 81 30 cpi r24, 0x01 ; 1 19b2a: a9 f4 brne .+42 ; 0x19b56 19b2c: 20 93 c8 00 sts 0x00C8, r18 ; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8> 19b30: 10 92 cd 00 sts 0x00CD, r1 ; 0x8000cd <__TEXT_REGION_LENGTH__+0x7c20cd> 19b34: 90 93 cc 00 sts 0x00CC, r25 ; 0x8000cc <__TEXT_REGION_LENGTH__+0x7c20cc> 19b38: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b3c: 80 61 ori r24, 0x10 ; 16 19b3e: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b42: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b46: 88 60 ori r24, 0x08 ; 8 19b48: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b4c: 80 91 c9 00 lds r24, 0x00C9 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b50: 80 68 ori r24, 0x80 ; 128 19b52: 80 93 c9 00 sts 0x00C9, r24 ; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9> 19b56: 08 95 ret 00019b58 : 19b58: 81 50 subi r24, 0x01 ; 1 19b5a: 82 31 cpi r24, 0x12 ; 18 19b5c: 08 f0 brcs .+2 ; 0x19b60 19b5e: 5a c0 rjmp .+180 ; 0x19c14 19b60: e8 2f mov r30, r24 19b62: f0 e0 ldi r31, 0x00 ; 0 19b64: 88 27 eor r24, r24 19b66: e8 54 subi r30, 0x48 ; 72 19b68: f2 43 sbci r31, 0x32 ; 50 19b6a: 8f 4f sbci r24, 0xFF ; 255 19b6c: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 19b70: d8 cd rjmp .-1104 ; 0x19722 19b72: dc cd rjmp .-1096 ; 0x1972c 19b74: ca cd rjmp .-1132 ; 0x1970a 19b76: d0 cd rjmp .-1120 ; 0x19718 19b78: d4 cd rjmp .-1112 ; 0x19722 19b7a: 0a ce rjmp .-1004 ; 0x19790 19b7c: df cd rjmp .-1090 ; 0x1973c 19b7e: e5 cd rjmp .-1078 ; 0x1974a 19b80: e9 cd rjmp .-1070 ; 0x19754 19b82: ef cd rjmp .-1058 ; 0x19762 19b84: f3 cd rjmp .-1050 ; 0x1976c 19b86: f7 cd rjmp .-1042 ; 0x19776 19b88: fd cd rjmp .-1030 ; 0x19784 19b8a: 01 ce rjmp .-1022 ; 0x1978e 19b8c: 0a ce rjmp .-1004 ; 0x197a2 19b8e: 05 ce rjmp .-1014 ; 0x1979a 19b90: 0b ce rjmp .-1002 ; 0x197a8 19b92: 0f ce rjmp .-994 ; 0x197b2 19b94: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 19b98: 8f 77 andi r24, 0x7F ; 127 19b9a: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 19b9e: 08 95 ret 19ba0: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 19ba4: 8f 7d andi r24, 0xDF ; 223 19ba6: f9 cf rjmp .-14 ; 0x19b9a 19ba8: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 19bac: 87 7f andi r24, 0xF7 ; 247 19bae: f5 cf rjmp .-22 ; 0x19b9a 19bb0: 84 b5 in r24, 0x24 ; 36 19bb2: 8f 77 andi r24, 0x7F ; 127 19bb4: 84 bd out 0x24, r24 ; 36 19bb6: 08 95 ret 19bb8: 84 b5 in r24, 0x24 ; 36 19bba: 8f 7d andi r24, 0xDF ; 223 19bbc: fb cf rjmp .-10 ; 0x19bb4 19bbe: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 19bc2: 8f 77 andi r24, 0x7F ; 127 19bc4: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 19bc8: 08 95 ret 19bca: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 19bce: 8f 7d andi r24, 0xDF ; 223 19bd0: f9 cf rjmp .-14 ; 0x19bc4 19bd2: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 19bd6: 8f 77 andi r24, 0x7F ; 127 19bd8: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 19bdc: 08 95 ret 19bde: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 19be2: 8f 7d andi r24, 0xDF ; 223 19be4: f9 cf rjmp .-14 ; 0x19bd8 19be6: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 19bea: 87 7f andi r24, 0xF7 ; 247 19bec: f5 cf rjmp .-22 ; 0x19bd8 19bee: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 19bf2: 8f 77 andi r24, 0x7F ; 127 19bf4: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 19bf8: 08 95 ret 19bfa: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 19bfe: 8f 7d andi r24, 0xDF ; 223 19c00: f9 cf rjmp .-14 ; 0x19bf4 19c02: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 19c06: 87 7f andi r24, 0xF7 ; 247 19c08: f5 cf rjmp .-22 ; 0x19bf4 19c0a: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 19c0e: 8f 77 andi r24, 0x7F ; 127 19c10: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 19c14: 08 95 ret 19c16: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 19c1a: 8f 7d andi r24, 0xDF ; 223 19c1c: f9 cf rjmp .-14 ; 0x19c10 19c1e: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 19c22: 87 7f andi r24, 0xF7 ; 247 19c24: f5 cf rjmp .-22 ; 0x19c10 00019c26 : 19c26: 83 b1 in r24, 0x03 ; 3 19c28: 82 95 swap r24 19c2a: 81 70 andi r24, 0x01 ; 1 19c2c: 08 95 ret 00019c2e : } #else //SM4_ACCEL_TEST uint16_t xyzcal_calc_delay(uint16_t, uint16_t) { return xyzcal_sm4_delay; } 19c2e: 80 91 fc 03 lds r24, 0x03FC ; 0x8003fc 19c32: 90 91 fd 03 lds r25, 0x03FD ; 0x8003fd 19c36: 08 95 ret 00019c38 : } uint8_t xyzcal_dm = 0; void xyzcal_update_pos(uint16_t dx, uint16_t dy, uint16_t dz, uint16_t) { 19c38: cf 92 push r12 19c3a: df 92 push r13 19c3c: ef 92 push r14 19c3e: 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; 19c40: 20 91 fe 03 lds r18, 0x03FE ; 0x8003fe 19c44: b0 e0 ldi r27, 0x00 ; 0 19c46: a0 e0 ldi r26, 0x00 ; 0 19c48: c0 90 b2 06 lds r12, 0x06B2 ; 0x8006b2 19c4c: d0 90 b3 06 lds r13, 0x06B3 ; 0x8006b3 19c50: e0 90 b4 06 lds r14, 0x06B4 ; 0x8006b4 19c54: f0 90 b5 06 lds r15, 0x06B5 ; 0x8006b5 19c58: 20 ff sbrs r18, 0 19c5a: 42 c0 rjmp .+132 ; 0x19ce0 19c5c: c8 1a sub r12, r24 19c5e: d9 0a sbc r13, r25 19c60: ea 0a sbc r14, r26 19c62: fb 0a sbc r15, r27 19c64: c0 92 b2 06 sts 0x06B2, r12 ; 0x8006b2 19c68: d0 92 b3 06 sts 0x06B3, r13 ; 0x8006b3 19c6c: e0 92 b4 06 sts 0x06B4, r14 ; 0x8006b4 19c70: f0 92 b5 06 sts 0x06B5, r15 ; 0x8006b5 19c74: cb 01 movw r24, r22 19c76: b0 e0 ldi r27, 0x00 ; 0 19c78: a0 e0 ldi r26, 0x00 ; 0 if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy; 19c7a: c0 90 b6 06 lds r12, 0x06B6 ; 0x8006b6 19c7e: d0 90 b7 06 lds r13, 0x06B7 ; 0x8006b7 19c82: e0 90 b8 06 lds r14, 0x06B8 ; 0x8006b8 19c86: f0 90 b9 06 lds r15, 0x06B9 ; 0x8006b9 19c8a: 21 ff sbrs r18, 1 19c8c: 36 c0 rjmp .+108 ; 0x19cfa 19c8e: c8 1a sub r12, r24 19c90: d9 0a sbc r13, r25 19c92: ea 0a sbc r14, r26 19c94: fb 0a sbc r15, r27 19c96: c0 92 b6 06 sts 0x06B6, r12 ; 0x8006b6 19c9a: d0 92 b7 06 sts 0x06B7, r13 ; 0x8006b7 19c9e: e0 92 b8 06 sts 0x06B8, r14 ; 0x8006b8 19ca2: f0 92 b9 06 sts 0x06B9, r15 ; 0x8006b9 19ca6: 70 e0 ldi r23, 0x00 ; 0 19ca8: 60 e0 ldi r22, 0x00 ; 0 if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz; 19caa: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 19cae: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 19cb2: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 19cb6: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 19cba: 22 ff sbrs r18, 2 19cbc: 2b c0 rjmp .+86 ; 0x19d14 19cbe: 84 1b sub r24, r20 19cc0: 95 0b sbc r25, r21 19cc2: a6 0b sbc r26, r22 19cc4: b7 0b sbc r27, r23 19cc6: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 19cca: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 19cce: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 19cd2: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd // DBG(_n(" after xyzcal_update_pos x=%ld y=%ld z=%ld\n"), count_position[0], count_position[1], count_position[2]); } 19cd6: ff 90 pop r15 19cd8: ef 90 pop r14 19cda: df 90 pop r13 19cdc: cf 90 pop r12 19cde: 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; 19ce0: 8c 0d add r24, r12 19ce2: 9d 1d adc r25, r13 19ce4: ae 1d adc r26, r14 19ce6: bf 1d adc r27, r15 19ce8: 80 93 b2 06 sts 0x06B2, r24 ; 0x8006b2 19cec: 90 93 b3 06 sts 0x06B3, r25 ; 0x8006b3 19cf0: a0 93 b4 06 sts 0x06B4, r26 ; 0x8006b4 19cf4: b0 93 b5 06 sts 0x06B5, r27 ; 0x8006b5 19cf8: bd cf rjmp .-134 ; 0x19c74 if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy; 19cfa: 8c 0d add r24, r12 19cfc: 9d 1d adc r25, r13 19cfe: ae 1d adc r26, r14 19d00: bf 1d adc r27, r15 19d02: 80 93 b6 06 sts 0x06B6, r24 ; 0x8006b6 19d06: 90 93 b7 06 sts 0x06B7, r25 ; 0x8006b7 19d0a: a0 93 b8 06 sts 0x06B8, r26 ; 0x8006b8 19d0e: b0 93 b9 06 sts 0x06B9, r27 ; 0x8006b9 19d12: c9 cf rjmp .-110 ; 0x19ca6 if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz; 19d14: 84 0f add r24, r20 19d16: 95 1f adc r25, r21 19d18: a6 1f adc r26, r22 19d1a: b7 1f adc r27, r23 19d1c: d4 cf rjmp .-88 ; 0x19cc6 00019d1e : inline bool is_digit(char c) { return c >= '0' && c <= '9'; } char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){ 19d1e: fb 01 movw r30, r22 *v = 0; 19d20: 11 82 std Z+1, r1 ; 0x01 19d22: 10 82 st Z, r1 while(is_digit(*str)){ *v *= 10; 19d24: 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'; 19d26: dc 01 movw r26, r24 19d28: 2c 91 ld r18, X 19d2a: 20 53 subi r18, 0x30 ; 48 } char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){ *v = 0; while(is_digit(*str)){ 19d2c: 2a 30 cpi r18, 0x0A ; 10 19d2e: a0 f4 brcc .+40 ; 0x19d58 *v *= 10; 19d30: 40 81 ld r20, Z 19d32: 51 81 ldd r21, Z+1 ; 0x01 19d34: 64 9f mul r22, r20 19d36: 90 01 movw r18, r0 19d38: 65 9f mul r22, r21 19d3a: 30 0d add r19, r0 19d3c: 11 24 eor r1, r1 19d3e: 31 83 std Z+1, r19 ; 0x01 19d40: 20 83 st Z, r18 *v += *str - '0'; 19d42: 4d 91 ld r20, X+ 19d44: cd 01 movw r24, r26 19d46: 20 53 subi r18, 0x30 ; 48 19d48: 31 09 sbc r19, r1 19d4a: 24 0f add r18, r20 19d4c: 31 1d adc r19, r1 19d4e: 47 fd sbrc r20, 7 19d50: 3a 95 dec r19 19d52: 31 83 std Z+1, r19 ; 0x01 19d54: 20 83 st Z, r18 19d56: e7 cf rjmp .-50 ; 0x19d26 ++str; } return str; } 19d58: 08 95 ret 00019d5a : } #ifdef THERMAL_MODEL void lcd_thermal_model_cal() { lcd_commands_type = LcdCommands::ThermalModel; 19d5a: 85 e0 ldi r24, 0x05 ; 5 19d5c: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 lcd_return_to_status(); 19d60: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019d64 : 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) { 19d64: fc 01 movw r30, r24 switch(*oCheckSetting) { 19d66: 80 81 ld r24, Z 19d68: 88 23 and r24, r24 19d6a: 21 f0 breq .+8 ; 0x19d74 19d6c: 81 30 cpi r24, 0x01 ; 1 19d6e: 29 f4 brne .+10 ; 0x19d7a case ClCheckMode::_None: *oCheckSetting = ClCheckMode::_Warn; break; case ClCheckMode::_Warn: *oCheckSetting = ClCheckMode::_Strict; 19d70: 82 e0 ldi r24, 0x02 ; 2 19d72: 01 c0 rjmp .+2 ; 0x19d76 while (0) static void lcd_check_update_RAM(ClCheckMode * oCheckSetting) { switch(*oCheckSetting) { case ClCheckMode::_None: *oCheckSetting = ClCheckMode::_Warn; 19d74: 81 e0 ldi r24, 0x01 ; 1 break; case ClCheckMode::_Warn: *oCheckSetting = ClCheckMode::_Strict; 19d76: 80 83 st Z, r24 19d78: 08 95 ret break; case ClCheckMode::_Strict: *oCheckSetting = ClCheckMode::_None; 19d7a: 10 82 st Z, r1 break; default: *oCheckSetting = ClCheckMode::_None; } } 19d7c: 08 95 ret 00019d7e : } //! @brief Send host action "start" void lcd_send_action_start() { SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_START); 19d7e: 8e e5 ldi r24, 0x5E ; 94 19d80: 9b e6 ldi r25, 0x6B ; 107 19d82: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_return_to_status(); 19d86: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019d8a : //! 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) { 19d8a: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 19d8e: 81 30 cpi r24, 0x01 ; 1 19d90: 21 f4 brne .+8 ; 0x19d9a SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_NOT_READY); 19d92: 89 eb ldi r24, 0xB9 ; 185 19d94: 9a e6 ldi r25, 0x6A ; 106 } else { SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_READY); 19d96: 0c 94 13 79 jmp 0xf226 ; 0xf226 19d9a: 8a ea ldi r24, 0xAA ; 170 19d9c: 9a e6 ldi r25, 0x6A ; 106 19d9e: fb cf rjmp .-10 ; 0x19d96 00019da0 : planner_synchronize(); Disable_E0(); } void MMU2::execute_load_to_nozzle_sequence() { 19da0: cf 93 push r28 19da2: df 93 push r29 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 19da4: 0f 94 a9 43 call 0x28752 ; 0x28752 float planner_get_current_position_E() { return current_position[E_AXIS]; } void planner_set_current_position_E(float e) { current_position[E_AXIS] = e; 19da8: c1 e9 ldi r28, 0x91 ; 145 19daa: d6 e0 ldi r29, 0x06 ; 6 planner_synchronize(); // Compensate for configurable Extra Loading Distance planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION)); 19dac: 60 91 96 13 lds r22, 0x1396 ; 0x801396 19db0: 70 e0 ldi r23, 0x00 ; 0 19db2: 90 e0 ldi r25, 0x00 ; 0 19db4: 80 e0 ldi r24, 0x00 ; 0 19db6: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 19dba: 20 e0 ldi r18, 0x00 ; 0 19dbc: 30 e0 ldi r19, 0x00 ; 0 19dbe: 40 e8 ldi r20, 0x80 ; 128 19dc0: 51 e4 ldi r21, 0x41 ; 65 19dc2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 19dc6: 9b 01 movw r18, r22 19dc8: ac 01 movw r20, r24 19dca: 6c 85 ldd r22, Y+12 ; 0x0c 19dcc: 7d 85 ldd r23, Y+13 ; 0x0d 19dce: 8e 85 ldd r24, Y+14 ; 0x0e 19dd0: 9f 85 ldd r25, Y+15 ; 0x0f 19dd2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 19dd6: 6c 87 std Y+12, r22 ; 0x0c 19dd8: 7d 87 std Y+13, r23 ; 0x0d 19dda: 8e 87 std Y+14, r24 ; 0x0e 19ddc: 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])); 19dde: 62 e0 ldi r22, 0x02 ; 2 19de0: 88 e4 ldi r24, 0x48 ; 72 19de2: 9e e8 ldi r25, 0x8E ; 142 } 19de4: df 91 pop r29 19de6: 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])); 19de8: 0d 94 4f 88 jmp 0x3109e ; 0x3109e 00019dec : } } menu_item++; } void __attribute__((noinline)) menu_item_function_E(const Sheet &sheet, menu_func_t func) 19dec: df 92 push r13 19dee: ef 92 push r14 19df0: ff 92 push r15 19df2: 0f 93 push r16 19df4: 1f 93 push r17 19df6: cf 93 push r28 19df8: df 93 push r29 19dfa: cd b7 in r28, 0x3d ; 61 19dfc: de b7 in r29, 0x3e ; 62 19dfe: 63 97 sbiw r28, 0x13 ; 19 19e00: 0f b6 in r0, 0x3f ; 63 19e02: f8 94 cli 19e04: de bf out 0x3e, r29 ; 62 19e06: 0f be out 0x3f, r0 ; 63 19e08: cd bf out 0x3d, r28 ; 61 { if (menu_item == menu_line) 19e0a: 30 91 14 05 lds r19, 0x0514 ; 0x800514 19e0e: 20 91 13 05 lds r18, 0x0513 ; 0x800513 19e12: 32 13 cpse r19, r18 19e14: 73 c0 rjmp .+230 ; 0x19efc 19e16: 7c 01 movw r14, r24 { if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet); 19e18: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 19e1c: 88 23 and r24, r24 19e1e: 09 f4 brne .+2 ; 0x19e22 19e20: 45 c0 rjmp .+138 ; 0x19eac //! //! @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)); 19e22: 8b e0 ldi r24, 0x0B ; 11 19e24: 9d e4 ldi r25, 0x4D ; 77 19e26: 0e 94 44 72 call 0xe488 ; 0xe488 19e2a: 9f 93 push r25 19e2c: 8f 93 push r24 19e2e: 81 e0 ldi r24, 0x01 ; 1 19e30: 9e e8 ldi r25, 0x8E ; 142 19e32: 9f 93 push r25 19e34: 8f 93 push r24 19e36: 8e 01 movw r16, r28 19e38: 0f 5f subi r16, 0xFF ; 255 19e3a: 1f 4f sbci r17, 0xFF ; 255 19e3c: 1f 93 push r17 19e3e: 0f 93 push r16 19e40: 0f 94 27 db call 0x3b64e ; 0x3b64e 19e44: d8 2e mov r13, r24 eeprom_read_block(&(buffer.c[index]), sheet_E.name, sizeof(sheet_E.name)/sizeof(sheet_E.name[0])); 19e46: 47 e0 ldi r20, 0x07 ; 7 19e48: 50 e0 ldi r21, 0x00 ; 0 19e4a: b7 01 movw r22, r14 19e4c: 80 0f add r24, r16 19e4e: 91 2f mov r25, r17 19e50: 91 1d adc r25, r1 19e52: 0f 94 00 dc call 0x3b800 ; 0x3b800 19e56: 0f 90 pop r0 19e58: 0f 90 pop r0 19e5a: 0f 90 pop r0 19e5c: 0f 90 pop r0 19e5e: 0f 90 pop r0 19e60: 0f 90 pop r0 19e62: 20 e0 ldi r18, 0x00 ; 0 19e64: 82 2f mov r24, r18 19e66: 8d 0d add r24, r13 19e68: 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) 19e6a: 27 30 cpi r18, 0x07 ; 7 19e6c: 39 f0 breq .+14 ; 0x19e7c 19e6e: 2f 5f subi r18, 0xFF ; 255 { if (buffer.c[index] == '\0') break; 19e70: f8 01 movw r30, r16 19e72: e8 0f add r30, r24 19e74: f9 1f adc r31, r25 19e76: 30 81 ld r19, Z 19e78: 31 11 cpse r19, r1 19e7a: f4 cf rjmp .-24 ; 0x19e64 } buffer.c[index] = ']'; 19e7c: f8 01 movw r30, r16 19e7e: e8 0f add r30, r24 19e80: f9 1f adc r31, r25 19e82: 2d e5 ldi r18, 0x5D ; 93 19e84: 20 83 st Z, r18 buffer.c[index + 1] = '\0'; 19e86: 8c 0f add r24, r28 19e88: 9d 1f adc r25, r29 19e8a: fc 01 movw r30, r24 19e8c: 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()); 19e8e: 0f 94 4c d0 call 0x3a098 ; 0x3a098 19e92: 48 2f mov r20, r24 19e94: 60 91 11 05 lds r22, 0x0511 ; 0x800511 19e98: 80 e0 ldi r24, 0x00 ; 0 19e9a: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_print_pad(buffer.c, LCD_WIDTH - 2); 19e9e: 62 e1 ldi r22, 0x12 ; 18 19ea0: c8 01 movw r24, r16 19ea2: 0e 94 67 70 call 0xe0ce ; 0xe0ce lcd_putc(type_char); 19ea6: 80 e2 ldi r24, 0x20 ; 32 19ea8: 0e 94 67 6e call 0xdcce ; 0xdcce 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)) 19eac: 80 91 12 05 lds r24, 0x0512 ; 0x800512 19eb0: 88 23 and r24, r24 19eb2: 21 f1 breq .+72 ; 0x19efc 19eb4: 20 91 14 05 lds r18, 0x0514 ; 0x800514 19eb8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 19ebc: 90 91 70 06 lds r25, 0x0670 ; 0x800670 19ec0: 28 17 cp r18, r24 19ec2: 19 06 cpc r1, r25 19ec4: d9 f4 brne .+54 ; 0x19efc { lcd_update_enabled = 0; 19ec6: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e if (func) func(); 19eca: 8b ef ldi r24, 0xFB ; 251 19ecc: 95 e7 ldi r25, 0x75 ; 117 19ece: 89 2b or r24, r25 19ed0: 11 f0 breq .+4 ; 0x19ed6 19ed2: 0e 94 fb 75 call 0xebf6 ; 0xebf6 lcd_update_enabled = 1; 19ed6: 81 e0 ldi r24, 0x01 ; 1 19ed8: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e menu_item_ret(); 19edc: 0f 94 70 d0 call 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; } 19ee0: 63 96 adiw r28, 0x13 ; 19 19ee2: 0f b6 in r0, 0x3f ; 63 19ee4: f8 94 cli 19ee6: de bf out 0x3e, r29 ; 62 19ee8: 0f be out 0x3f, r0 ; 63 19eea: cd bf out 0x3d, r28 ; 61 19eec: df 91 pop r29 19eee: cf 91 pop r28 19ef0: 1f 91 pop r17 19ef2: 0f 91 pop r16 19ef4: ff 90 pop r15 19ef6: ef 90 pop r14 19ef8: df 90 pop r13 19efa: 08 95 ret lcd_update_enabled = 1; menu_item_ret(); return; } } menu_item++; 19efc: 80 91 14 05 lds r24, 0x0514 ; 0x800514 19f00: 8f 5f subi r24, 0xFF ; 255 19f02: 80 93 14 05 sts 0x0514, r24 ; 0x800514 19f06: ec cf rjmp .-40 ; 0x19ee0 00019f08 : lcd_return_to_status(); } void lcd_mesh_calibration() { enquecommand_P(PSTR("M45")); 19f08: 61 e0 ldi r22, 0x01 ; 1 19f0a: 8d e2 ldi r24, 0x2D ; 45 19f0c: 99 e8 ldi r25, 0x89 ; 137 19f0e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_return_to_status(); 19f12: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019f16 : } void lcd_mesh_calibration_z() { enquecommand_P(PSTR("M45 Z")); 19f16: 61 e0 ldi r22, 0x01 ; 1 19f18: 81 e3 ldi r24, 0x31 ; 49 19f1a: 99 e8 ldi r25, 0x89 ; 137 19f1c: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_return_to_status(); 19f20: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019f24 : } #endif //(LANG_MODE != 0) void lcd_mesh_bedleveling() { enquecommand_P(PSTR("G80")); 19f24: 61 e0 ldi r22, 0x01 ; 1 19f26: 89 e2 ldi r24, 0x29 ; 41 19f28: 99 e8 ldi r25, 0x89 ; 137 19f2a: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_return_to_status(); 19f2e: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019f32 : MYSERIAL.begin(BAUDRATE); } #endif //HAS_SECOND_SERIAL_PORT void lcd_calibrate_pinda() { enquecommand_P(PSTR("G76")); 19f32: 61 e0 ldi r22, 0x01 ; 1 19f34: 87 e3 ldi r24, 0x37 ; 55 19f36: 99 e8 ldi r25, 0x89 ; 137 19f38: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_return_to_status(); 19f3c: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00019f40 : } static void nozzle_change() { #ifdef FILAMENT_SENSOR if (fsensor.isEnabled() && fsensor.getFilamentPresent()) { 19f40: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 19f44: 88 23 and r24, r24 19f46: 61 f0 breq .+24 ; 0x19f60 19f48: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 19f4c: 88 23 and r24, r24 19f4e: 41 f0 breq .+16 ; 0x19f60 lcd_show_fullscreen_message_and_wait_P(_T(MSG_UNLOAD_FILAMENT_REPEAT)); 19f50: 8d eb ldi r24, 0xBD ; 189 19f52: 93 e4 ldi r25, 0x43 ; 67 19f54: 0e 94 44 72 call 0xe488 ; 0xe488 19f58: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_return_to_status(); return; } #endif //FILAMENT_SENSOR lcd_commands_type = LcdCommands::NozzleCNG; lcd_return_to_status(); 19f5c: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 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; 19f60: 86 e0 ldi r24, 0x06 ; 6 19f62: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 19f66: fa cf rjmp .-12 ; 0x19f5c 00019f68 : // When MMU is disabled P parameter is ignored enquecommand_P(PSTR("M701 P0")); } static void wizard_lay1cal_message(bool cold) { 19f68: cf 93 push r28 19f6a: c8 2f mov r28, r24 lcd_show_fullscreen_message_and_wait_P( 19f6c: 81 ec ldi r24, 0xC1 ; 193 19f6e: 9d e3 ldi r25, 0x3D ; 61 19f70: 0e 94 44 72 call 0xe488 ; 0xe488 19f74: 0f 94 cd 20 call 0x2419a ; 0x2419a _T(MSG_WIZARD_V2_CAL)); if (MMU2::mmu2.Enabled()) 19f78: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 19f7c: 81 30 cpi r24, 0x01 ; 1 19f7e: 69 f4 brne .+26 ; 0x19f9a { lcd_show_fullscreen_message_and_wait_P( 19f80: 88 e6 ldi r24, 0x68 ; 104 19f82: 9d e3 ldi r25, 0x3D ; 61 _T(MSG_SELECT_FIL_1ST_LAYERCAL)); } else if (cold) { lcd_show_fullscreen_message_and_wait_P( 19f84: 0e 94 44 72 call 0xe488 ; 0xe488 19f88: 0f 94 cd 20 call 0x2419a ; 0x2419a _T(MSG_SELECT_TEMP_MATCHES_MATERIAL)); } lcd_show_fullscreen_message_and_wait_P( 19f8c: 86 e9 ldi r24, 0x96 ; 150 19f8e: 9c e3 ldi r25, 0x3C ; 60 19f90: 0e 94 44 72 call 0xe488 ; 0xe488 _T(MSG_WIZARD_V2_CAL_2)); } 19f94: 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( 19f96: 0d 94 cd 20 jmp 0x2419a ; 0x2419a if (MMU2::mmu2.Enabled()) { lcd_show_fullscreen_message_and_wait_P( _T(MSG_SELECT_FIL_1ST_LAYERCAL)); } else if (cold) 19f9a: cc 23 and r28, r28 19f9c: b9 f3 breq .-18 ; 0x19f8c { lcd_show_fullscreen_message_and_wait_P( 19f9e: 86 e3 ldi r24, 0x36 ; 54 19fa0: 9d e3 ldi r25, 0x3D ; 61 19fa2: f0 cf rjmp .-32 ; 0x19f84 00019fa4 : } } static void lcd_wizard_load() { if (MMU2::mmu2.Enabled()) { 19fa4: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 19fa8: 81 30 cpi r24, 0x01 ; 1 19faa: 71 f4 brne .+28 ; 0x19fc8 lcd_show_fullscreen_message_and_wait_P( 19fac: 8d e3 ldi r24, 0x3D ; 61 19fae: 9c e3 ldi r25, 0x3C ; 60 19fb0: 0e 94 44 72 call 0xe488 ; 0xe488 19fb4: 0f 94 cd 20 call 0x2419a ; 0x2419a _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; 19fb8: 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; 19fba: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 } // When MMU is disabled P parameter is ignored enquecommand_P(PSTR("M701 P0")); 19fbe: 61 e0 ldi r22, 0x01 ; 1 19fc0: 8b e3 ldi r24, 0x3B ; 59 19fc2: 99 e8 ldi r25, 0x89 ; 137 19fc4: 0c 94 b8 87 jmp 0x10f70 ; 0x10f70 // 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( 19fc8: 81 ef ldi r24, 0xF1 ; 241 19fca: 9b e3 ldi r25, 0x3B ; 59 19fcc: 0e 94 44 72 call 0xe488 ; 0xe488 19fd0: 0f 94 cd 20 call 0x2419a ; 0x2419a _T(MSG_WIZARD_LOAD_FILAMENT)); lcd_update_enable(false); 19fd4: 80 e0 ldi r24, 0x00 ; 0 19fd6: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 19fda: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT)); 19fde: 8f ea ldi r24, 0xAF ; 175 19fe0: 9b e5 ldi r25, 0x5B ; 91 19fe2: 0e 94 44 72 call 0xe488 ; 0xe488 19fe6: ac 01 movw r20, r24 19fe8: 62 e0 ldi r22, 0x02 ; 2 19fea: 80 e0 ldi r24, 0x00 ; 0 19fec: 0e 94 8c 6e call 0xdd18 ; 0xdd18 eFilamentAction = FilamentAction::Load; 19ff0: 81 e0 ldi r24, 0x01 ; 1 19ff2: e3 cf rjmp .-58 ; 0x19fba 00019ff4 : #endif // TMC2130 #ifdef FILAMENT_SENSOR static void fsensor_reinit() { fsensor.init(); 19ff4: 0d 94 30 7c jmp 0x2f860 ; 0x2f860 00019ff8 : bool __attribute__((noinline)) Tag(const char *str, const char *tag_P, uint8_t tagSize, uint16_t tagMask, uint16_t *v){ 19ff8: cf 92 push r12 19ffa: df 92 push r13 19ffc: ef 92 push r14 19ffe: ff 92 push r15 1a000: 0f 93 push r16 1a002: 1f 93 push r17 1a004: cf 93 push r28 1a006: df 93 push r29 1a008: 6c 01 movw r12, r24 1a00a: 79 01 movw r14, r18 if( ! strncmp_P(str, tag_P, tagSize) ){ 1a00c: c4 2f mov r28, r20 1a00e: d0 e0 ldi r29, 0x00 ; 0 1a010: ae 01 movw r20, r28 1a012: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 1a016: 89 2b or r24, r25 1a018: b9 f4 brne .+46 ; 0x1a048 Number(str + tagSize, v); 1a01a: b8 01 movw r22, r16 1a01c: c6 01 movw r24, r12 1a01e: 8c 0f add r24, r28 1a020: 9d 1f adc r25, r29 1a022: 0e 94 8f ce call 0x19d1e ; 0x19d1e *v |= tagMask; 1a026: f8 01 movw r30, r16 1a028: 20 81 ld r18, Z 1a02a: 31 81 ldd r19, Z+1 ; 0x01 1a02c: 2e 29 or r18, r14 1a02e: 3f 29 or r19, r15 1a030: 31 83 std Z+1, r19 ; 0x01 1a032: 20 83 st Z, r18 return true; 1a034: 81 e0 ldi r24, 0x01 ; 1 } return false; } 1a036: df 91 pop r29 1a038: cf 91 pop r28 1a03a: 1f 91 pop r17 1a03c: 0f 91 pop r16 1a03e: ff 90 pop r15 1a040: ef 90 pop r14 1a042: df 90 pop r13 1a044: cf 90 pop r12 1a046: 08 95 ret if( ! strncmp_P(str, tag_P, tagSize) ){ Number(str + tagSize, v); *v |= tagMask; return true; } return false; 1a048: 80 e0 ldi r24, 0x00 ; 0 1a04a: f5 cf rjmp .-22 ; 0x1a036 0001a04c : static void lcd_fsensor_enabled_set(void) { fsensor.setEnabled(!fsensor.isEnabled()); } static void lcd_fsensor_runout_set() { fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true); 1a04c: e9 ea ldi r30, 0xA9 ; 169 1a04e: f7 e1 ldi r31, 0x17 ; 23 1a050: 62 81 ldd r22, Z+2 ; 0x02 1a052: 81 e0 ldi r24, 0x01 ; 1 1a054: 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; 1a056: 62 83 std Z+2, r22 ; 0x02 1a058: 85 ed ldi r24, 0xD5 ; 213 1a05a: 9e e0 ldi r25, 0x0E ; 14 1a05c: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a060 : } static void lcd_fsensor_autoload_set() { fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true); 1a060: e9 ea ldi r30, 0xA9 ; 169 1a062: f7 e1 ldi r31, 0x17 ; 23 1a064: 61 81 ldd r22, Z+1 ; 0x01 1a066: 81 e0 ldi r24, 0x01 ; 1 1a068: 68 27 eor r22, r24 fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 1a06a: 61 83 std Z+1, r22 ; 0x01 1a06c: 87 e0 ldi r24, 0x07 ; 7 1a06e: 9f e0 ldi r25, 0x0F ; 15 1a070: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a074 : } #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); 1a074: 87 ea ldi r24, 0xA7 ; 167 1a076: 9c e0 ldi r25, 0x0C ; 12 1a078: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (value > 1) value = 1; 1a07c: 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) 1a07e: 82 30 cpi r24, 0x02 ; 2 1a080: 08 f4 brcc .+2 ; 0x1a084 1a082: 68 27 eor r22, r24 1a084: 87 ea ldi r24, 0xA7 ; 167 1a086: 9c e0 ldi r25, 0x0C ; 12 1a088: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a08c : bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); } #ifdef PRUSA_SN_SUPPORT void WorkaroundPrusaSN() { 1a08c: cf 93 push r28 1a08e: df 93 push r29 1a090: c5 e1 ldi r28, 0x15 ; 21 1a092: dd e0 ldi r29, 0x0D ; 13 const char *SN = PSTR("CZPXInvalidSerialNr"); for (uint8_t i = 0; i < 20; i++) { eeprom_update_byte_notify((uint8_t*)EEPROM_PRUSA_SN + i, pgm_read_byte(SN++)); 1a094: fe 01 movw r30, r28 1a096: e7 51 subi r30, 0x17 ; 23 1a098: f3 48 sbci r31, 0x83 ; 131 1a09a: 64 91 lpm r22, Z 1a09c: ce 01 movw r24, r28 1a09e: 0f 94 34 dc call 0x3b868 ; 0x3b868 1a0a2: 21 96 adiw r28, 0x01 ; 1 } #ifdef PRUSA_SN_SUPPORT void WorkaroundPrusaSN() { const char *SN = PSTR("CZPXInvalidSerialNr"); for (uint8_t i = 0; i < 20; i++) { 1a0a4: c9 32 cpi r28, 0x29 ; 41 1a0a6: 8d e0 ldi r24, 0x0D ; 13 1a0a8: d8 07 cpc r29, r24 1a0aa: a1 f7 brne .-24 ; 0x1a094 eeprom_update_byte_notify((uint8_t*)EEPROM_PRUSA_SN + i, pgm_read_byte(SN++)); } } 1a0ac: df 91 pop r29 1a0ae: cf 91 pop r28 1a0b0: 08 95 ret 0001a0b2 : 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); 1a0b2: 8a ea ldi r24, 0xAA ; 170 1a0b4: 9d e0 ldi r25, 0x0D ; 13 1a0b6: 0f 94 10 dc call 0x3b820 ; 0x3b820 switch (mbl_z_probe_nr) { case 1: mbl_z_probe_nr = 3; break; case 3: mbl_z_probe_nr = 5; break; 1a0ba: 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) { 1a0bc: 83 30 cpi r24, 0x03 ; 3 1a0be: 21 f0 breq .+8 ; 0x1a0c8 case 1: mbl_z_probe_nr = 3; break; case 3: mbl_z_probe_nr = 5; break; case 5: mbl_z_probe_nr = 1; break; 1a0c0: 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) { 1a0c2: 85 30 cpi r24, 0x05 ; 5 1a0c4: 09 f0 breq .+2 ; 0x1a0c8 case 1: mbl_z_probe_nr = 3; break; 1a0c6: 63 e0 ldi r22, 0x03 ; 3 1a0c8: 8a ea ldi r24, 0xAA ; 170 1a0ca: 9d e0 ldi r25, 0x0D ; 13 1a0cc: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a0d0 : 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); 1a0d0: 8b ea ldi r24, 0xAB ; 171 1a0d2: 9d e0 ldi r25, 0x0D ; 13 1a0d4: 0f 94 10 dc call 0x3b820 ; 0x3b820 if(mesh_nr == 3) mesh_nr = 7; else mesh_nr = 3; 1a0d8: 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; 1a0da: 83 30 cpi r24, 0x03 ; 3 1a0dc: 09 f4 brne .+2 ; 0x1a0e0 1a0de: 67 e0 ldi r22, 0x07 ; 7 1a0e0: 8b ea ldi r24, 0xAB ; 171 1a0e2: 9d e0 ldi r25, 0x0D ; 13 1a0e4: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a0e8 : #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); 1a0e8: 8c ea ldi r24, 0xAC ; 172 1a0ea: 9d e0 ldi r25, 0x0D ; 13 1a0ec: 0f 94 10 dc call 0x3b820 ; 0x3b820 magnet_elimination = !magnet_elimination; 1a0f0: 61 e0 ldi r22, 0x01 ; 1 1a0f2: 81 11 cpse r24, r1 1a0f4: 60 e0 ldi r22, 0x00 ; 0 1a0f6: 8c ea ldi r24, 0xAC ; 172 1a0f8: 9d e0 ldi r25, 0x0D ; 13 1a0fa: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a0fe : 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); 1a0fe: 86 ee ldi r24, 0xE6 ; 230 1a100: 94 e0 ldi r25, 0x04 ; 4 1a102: 0e 94 b2 ce call 0x19d64 ; 0x19d64 1a106: 60 91 e6 04 lds r22, 0x04E6 ; 0x8004e6 1a10a: 80 e2 ldi r24, 0x20 ; 32 1a10c: 9c e0 ldi r25, 0x0C ; 12 1a10e: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a112 : 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); 1a112: 88 ee ldi r24, 0xE8 ; 232 1a114: 94 e0 ldi r25, 0x04 ; 4 1a116: 0e 94 b2 ce call 0x19d64 ; 0x19d64 1a11a: 60 91 e8 04 lds r22, 0x04E8 ; 0x8004e8 1a11e: 83 ea ldi r24, 0xA3 ; 163 1a120: 9d e0 ldi r25, 0x0D ; 13 1a122: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a126 : 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); 1a126: 89 ee ldi r24, 0xE9 ; 233 1a128: 94 e0 ldi r25, 0x04 ; 4 1a12a: 0e 94 b2 ce call 0x19d64 ; 0x19d64 1a12e: 60 91 e9 04 lds r22, 0x04E9 ; 0x8004e9 1a132: 84 ea ldi r24, 0xA4 ; 164 1a134: 9d e0 ldi r25, 0x0D ; 13 1a136: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a13a : *oCheckSetting = ClCheckMode::_None; } } static void lcd_check_mode_set() { lcd_check_update_RAM(&oCheckMode); 1a13a: 8b ee ldi r24, 0xEB ; 235 1a13c: 94 e0 ldi r25, 0x04 ; 4 1a13e: 0e 94 b2 ce call 0x19d64 ; 0x19d64 1a142: 60 91 eb 04 lds r22, 0x04EB ; 0x8004eb 1a146: 88 ea ldi r24, 0xA8 ; 168 1a148: 9d e0 ldi r25, 0x0D ; 13 1a14a: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a14e : #endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static void lcd_fsensor_actionNA_set(void) { Filament_sensor::SensorActionOnError act = fsensor.getActionOnError(); switch(act) { 1a14e: 80 91 b1 17 lds r24, 0x17B1 ; 0x8017b1 case Filament_sensor::SensorActionOnError::_Continue: act = Filament_sensor::SensorActionOnError::_Pause; break; case Filament_sensor::SensorActionOnError::_Pause: act = Filament_sensor::SensorActionOnError::_Continue; 1a152: 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) { 1a154: 81 11 cpse r24, r1 1a156: 01 c0 rjmp .+2 ; 0x1a15a case Filament_sensor::SensorActionOnError::_Continue: act = Filament_sensor::SensorActionOnError::_Pause; 1a158: 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; 1a15a: 60 93 b1 17 sts 0x17B1, r22 ; 0x8017b1 1a15e: 87 e4 ldi r24, 0x47 ; 71 1a160: 9d e0 ldi r25, 0x0D ; 13 1a162: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a166 : lcd_return_to_status(); } void lcd_toshiba_flash_air_compatibility_toggle() { card.ToshibaFlashAir_enable(! card.ToshibaFlashAir_isEnabled()); 1a166: e0 e0 ldi r30, 0x00 ; 0 1a168: f7 e1 ldi r31, 0x17 ; 23 1a16a: 60 81 ld r22, Z 1a16c: 81 e0 ldi r24, 0x01 ; 1 1a16e: 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; } 1a170: 60 83 st Z, r22 1a172: 8b eb ldi r24, 0xBB ; 187 1a174: 9f e0 ldi r25, 0x0F ; 15 1a176: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a17a : eeprom_update_byte_notify((unsigned char *)EEPROM_TEMP_CAL_ACTIVE, temp_cal_active); } #ifdef HAS_SECOND_SERIAL_PORT void lcd_second_serial_set() { if(selectedSerialPort == 1) selectedSerialPort = 0; 1a17a: 80 91 38 05 lds r24, 0x0538 ; 0x800538 1a17e: 81 30 cpi r24, 0x01 ; 1 1a180: 51 f4 brne .+20 ; 0x1a196 1a182: 10 92 38 05 sts 0x0538, r1 ; 0x800538 1a186: 60 91 38 05 lds r22, 0x0538 ; 0x800538 1a18a: 88 e0 ldi r24, 0x08 ; 8 1a18c: 9f e0 ldi r25, 0x0F ; 15 1a18e: 0f 94 34 dc call 0x3b868 ; 0x3b868 else selectedSerialPort = 1; eeprom_update_byte_notify((unsigned char *)EEPROM_SECOND_SERIAL_ACTIVE, selectedSerialPort); MYSERIAL.begin(BAUDRATE); 1a192: 0c 94 7b cd jmp 0x19af6 ; 0x19af6 } #ifdef HAS_SECOND_SERIAL_PORT void lcd_second_serial_set() { if(selectedSerialPort == 1) selectedSerialPort = 0; else selectedSerialPort = 1; 1a196: 81 e0 ldi r24, 0x01 ; 1 1a198: 80 93 38 05 sts 0x0538, r24 ; 0x800538 1a19c: f4 cf rjmp .-24 ; 0x1a186 0001a19e : 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); 1a19e: 8f ea ldi r24, 0xAF ; 175 1a1a0: 9f e0 ldi r25, 0x0F ; 15 1a1a2: 0f 94 10 dc call 0x3b820 ; 0x3b820 temp_cal_active = !temp_cal_active; 1a1a6: 61 e0 ldi r22, 0x01 ; 1 1a1a8: 81 11 cpse r24, r1 1a1aa: 60 e0 ldi r22, 0x00 ; 0 1a1ac: 8f ea ldi r24, 0xAF ; 175 1a1ae: 9f e0 ldi r25, 0x0F ; 15 1a1b0: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a1b4 : eeprom_update_byte_notify((uint8_t*)EEPROM_SOUND_MODE,(uint8_t)eSoundMode); } void Sound_CycleState(void) { switch(eSoundMode) 1a1b4: 80 91 dd 04 lds r24, 0x04DD ; 0x8004dd 1a1b8: 81 30 cpi r24, 0x01 ; 1 1a1ba: 71 f0 breq .+28 ; 0x1a1d8 1a1bc: 20 f0 brcs .+8 ; 0x1a1c6 1a1be: 82 30 cpi r24, 0x02 ; 2 1a1c0: 69 f4 brne .+26 ; 0x1a1dc break; case e_SOUND_MODE_ONCE: eSoundMode=e_SOUND_MODE_SILENT; break; case e_SOUND_MODE_SILENT: eSoundMode=e_SOUND_MODE_BLIND; 1a1c2: 83 e0 ldi r24, 0x03 ; 3 1a1c4: 01 c0 rjmp .+2 ; 0x1a1c8 void Sound_CycleState(void) { switch(eSoundMode) { case e_SOUND_MODE_LOUD: eSoundMode=e_SOUND_MODE_ONCE; 1a1c6: 81 e0 ldi r24, 0x01 ; 1 break; case e_SOUND_MODE_ONCE: eSoundMode=e_SOUND_MODE_SILENT; 1a1c8: 80 93 dd 04 sts 0x04DD, r24 ; 0x8004dd 1a1cc: 60 91 dd 04 lds r22, 0x04DD ; 0x8004dd 1a1d0: 87 ed ldi r24, 0xD7 ; 215 1a1d2: 9e e0 ldi r25, 0x0E ; 14 1a1d4: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 1a1d8: 82 e0 ldi r24, 0x02 ; 2 1a1da: f6 cf rjmp .-20 ; 0x1a1c8 break; case e_SOUND_MODE_SILENT: eSoundMode=e_SOUND_MODE_BLIND; break; case e_SOUND_MODE_BLIND: eSoundMode=e_SOUND_MODE_LOUD; 1a1dc: 10 92 dd 04 sts 0x04DD, r1 ; 0x8004dd 1a1e0: f5 cf rjmp .-22 ; 0x1a1cc 0001a1e2 : } #ifdef SDCARD_SORT_ALPHA static void lcd_sort_type_set() { uint8_t sdSort; sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT); 1a1e2: 89 e0 ldi r24, 0x09 ; 9 1a1e4: 9f e0 ldi r25, 0x0F ; 15 1a1e6: 0f 94 10 dc call 0x3b820 ; 0x3b820 switch (sdSort) { case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; 1a1ea: 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) { 1a1ec: 88 23 and r24, r24 1a1ee: 21 f0 breq .+8 ; 0x1a1f8 case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break; 1a1f0: 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) { 1a1f2: 81 30 cpi r24, 0x01 ; 1 1a1f4: 09 f0 breq .+2 ; 0x1a1f8 case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break; case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break; default: sdSort = SD_SORT_TIME; 1a1f6: 60 e0 ldi r22, 0x00 ; 0 1a1f8: 89 e0 ldi r24, 0x09 ; 9 1a1fa: 9f e0 ldi r25, 0x0F ; 15 1a1fc: 0f 94 34 dc call 0x3b868 ; 0x3b868 } eeprom_update_byte_notify((uint8_t*)EEPROM_SD_SORT, sdSort); card.presort_flag = true; 1a200: 81 e0 ldi r24, 0x01 ; 1 1a202: 80 93 de 14 sts 0x14DE, r24 ; 0x8014de } 1a206: 08 95 ret 0001a208 : MENU_ITEM_TOGGLE_P(_T(MSG_SOUND), _T(MSG_SOUND_LOUD), lcd_sound_state_set);\ }\ }\ while (0) static void lcd_nozzle_diameter_cycle(void) { 1a208: cf 93 push r28 1a20a: df 93 push r29 uint16_t nDiameter; switch(oNozzleDiameter){ 1a20c: 80 91 ea 04 lds r24, 0x04EA ; 0x8004ea 1a210: 8c 33 cpi r24, 0x3C ; 60 1a212: e1 f0 breq .+56 ; 0x1a24c 1a214: 80 35 cpi r24, 0x50 ; 80 1a216: 01 f1 breq .+64 ; 0x1a258 1a218: 88 32 cpi r24, 0x28 ; 40 1a21a: 91 f0 breq .+36 ; 0x1a240 case ClNozzleDiameter::_Diameter_250: oNozzleDiameter=ClNozzleDiameter::_Diameter_400; 1a21c: 88 e2 ldi r24, 0x28 ; 40 1a21e: 80 93 ea 04 sts 0x04EA, r24 ; 0x8004ea nDiameter=400; 1a222: c0 e9 ldi r28, 0x90 ; 144 1a224: d1 e0 ldi r29, 0x01 ; 1 1a226: 60 91 ea 04 lds r22, 0x04EA ; 0x8004ea 1a22a: 87 ea ldi r24, 0xA7 ; 167 1a22c: 9d e0 ldi r25, 0x0D ; 13 1a22e: 0f 94 34 dc call 0x3b868 ; 0x3b868 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 1a232: be 01 movw r22, r28 1a234: 85 ea ldi r24, 0xA5 ; 165 1a236: 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); } 1a238: df 91 pop r29 1a23a: cf 91 pop r28 1a23c: 0d 94 52 dc jmp 0x3b8a4 ; 0x3b8a4 case ClNozzleDiameter::_Diameter_250: oNozzleDiameter=ClNozzleDiameter::_Diameter_400; nDiameter=400; break; case ClNozzleDiameter::_Diameter_400: oNozzleDiameter=ClNozzleDiameter::_Diameter_600; 1a240: 8c e3 ldi r24, 0x3C ; 60 1a242: 80 93 ea 04 sts 0x04EA, r24 ; 0x8004ea nDiameter=600; 1a246: c8 e5 ldi r28, 0x58 ; 88 1a248: d2 e0 ldi r29, 0x02 ; 2 1a24a: ed cf rjmp .-38 ; 0x1a226 break; case ClNozzleDiameter::_Diameter_600: oNozzleDiameter=ClNozzleDiameter::_Diameter_800; 1a24c: 80 e5 ldi r24, 0x50 ; 80 1a24e: 80 93 ea 04 sts 0x04EA, r24 ; 0x8004ea nDiameter=800; 1a252: c0 e2 ldi r28, 0x20 ; 32 1a254: d3 e0 ldi r29, 0x03 ; 3 1a256: e7 cf rjmp .-50 ; 0x1a226 break; case ClNozzleDiameter::_Diameter_800: oNozzleDiameter=ClNozzleDiameter::_Diameter_250; 1a258: 89 e1 ldi r24, 0x19 ; 25 1a25a: 80 93 ea 04 sts 0x04EA, r24 ; 0x8004ea nDiameter=250; 1a25e: ca ef ldi r28, 0xFA ; 250 1a260: d0 e0 ldi r29, 0x00 ; 0 1a262: e1 cf rjmp .-62 ; 0x1a226 0001a264 : } return 0; } bool eeprom_fw_version_older_than_p(const uint16_t (&ver_req)[4]) { 1a264: 0f 93 push r16 1a266: 1f 93 push r17 1a268: cf 93 push r28 1a26a: df 93 push r29 1a26c: 00 d0 rcall .+0 ; 0x1a26e 1a26e: 00 d0 rcall .+0 ; 0x1a270 1a270: 1f 92 push r1 1a272: 1f 92 push r1 1a274: cd b7 in r28, 0x3d ; 61 1a276: de b7 in r29, 0x3e ; 62 1a278: 8c 01 movw r16, r24 uint16_t ver_eeprom[4]; ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR); 1a27a: 8a e0 ldi r24, 0x0A ; 10 1a27c: 90 e0 ldi r25, 0x00 ; 0 1a27e: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1a282: 9a 83 std Y+2, r25 ; 0x02 1a284: 89 83 std Y+1, r24 ; 0x01 ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR); 1a286: 8c e0 ldi r24, 0x0C ; 12 1a288: 90 e0 ldi r25, 0x00 ; 0 1a28a: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1a28e: 9c 83 std Y+4, r25 ; 0x04 1a290: 8b 83 std Y+3, r24 ; 0x03 ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION); 1a292: 8e e0 ldi r24, 0x0E ; 14 1a294: 90 e0 ldi r25, 0x00 ; 0 1a296: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1a29a: 9e 83 std Y+6, r25 ; 0x06 1a29c: 8d 83 std Y+5, r24 ; 0x05 ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR); 1a29e: 80 e1 ldi r24, 0x10 ; 16 1a2a0: 90 e0 ldi r25, 0x00 ; 0 1a2a2: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1a2a6: 98 87 std Y+8, r25 ; 0x08 1a2a8: 8f 83 std Y+7, r24 ; 0x07 1a2aa: c8 01 movw r24, r16 1a2ac: de 01 movw r26, r28 1a2ae: 11 96 adiw r26, 0x01 ; 1 1a2b0: be 01 movw r22, r28 1a2b2: 67 5f subi r22, 0xF7 ; 247 1a2b4: 7f 4f sbci r23, 0xFF ; 255 for (uint8_t i = 0; i < 4; ++i) { uint16_t v = pgm_read_word(&ver_req[i]); 1a2b6: fc 01 movw r30, r24 1a2b8: 25 91 lpm r18, Z+ 1a2ba: 34 91 lpm r19, Z if (v > ver_eeprom[i]) 1a2bc: 4d 91 ld r20, X+ 1a2be: 5d 91 ld r21, X+ 1a2c0: 42 17 cp r20, r18 1a2c2: 53 07 cpc r21, r19 1a2c4: 48 f0 brcs .+18 ; 0x1a2d8 return true; else if (v < ver_eeprom[i]) 1a2c6: 24 17 cp r18, r20 1a2c8: 35 07 cpc r19, r21 1a2ca: 20 f0 brcs .+8 ; 0x1a2d4 1a2cc: 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) { 1a2ce: a6 17 cp r26, r22 1a2d0: b7 07 cpc r27, r23 1a2d2: 89 f7 brne .-30 ; 0x1a2b6 return true; else if (v < ver_eeprom[i]) break; } return false; 1a2d4: 80 e0 ldi r24, 0x00 ; 0 1a2d6: 01 c0 rjmp .+2 ; 0x1a2da 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; 1a2d8: 81 e0 ldi r24, 0x01 ; 1 else if (v < ver_eeprom[i]) break; } return false; } 1a2da: 28 96 adiw r28, 0x08 ; 8 1a2dc: 0f b6 in r0, 0x3f ; 63 1a2de: f8 94 cli 1a2e0: de bf out 0x3e, r29 ; 62 1a2e2: 0f be out 0x3f, r0 ; 63 1a2e4: cd bf out 0x3d, r28 ; 61 1a2e6: df 91 pop r29 1a2e8: cf 91 pop r28 1a2ea: 1f 91 pop r17 1a2ec: 0f 91 pop r16 1a2ee: 08 95 ret 0001a2f0 : 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) { 1a2f0: 0f 93 push r16 1a2f2: 1f 93 push r17 1a2f4: cf 93 push r28 1a2f6: df 93 push r29 1a2f8: 98 2f mov r25, r24 1a2fa: 86 2f mov r24, r22 1a2fc: 14 2f mov r17, r20 1a2fe: e9 01 movw r28, r18 lcd_set_cursor(_col, _row); 1a300: 69 2f mov r22, r25 1a302: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 switch (_state) 1a306: 11 30 cpi r17, 0x01 ; 1 1a308: 21 f0 breq .+8 ; 0x1a312 1a30a: 12 30 cpi r17, 0x02 ; 2 1a30c: 79 f0 breq .+30 ; 0x1a32c lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); 1a30e: ce 01 movw r24, r28 1a310: 15 c0 rjmp .+42 ; 0x1a33c { lcd_set_cursor(_col, _row); switch (_state) { case 1: lcd_puts_P(_name_PROGMEM); 1a312: ce 01 movw r24, r28 1a314: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_putc(':'); 1a318: 8a e3 ldi r24, 0x3A ; 58 1a31a: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_putc(_indicator); 1a31e: 80 2f mov r24, r16 lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); } } 1a320: df 91 pop r29 1a322: cf 91 pop r28 1a324: 1f 91 pop r17 1a326: 0f 91 pop r16 switch (_state) { case 1: lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_putc(_indicator); 1a328: 0c 94 67 6e jmp 0xdcce ; 0xdcce break; case 2: lcd_puts_P(_name_PROGMEM); 1a32c: ce 01 movw r24, r28 1a32e: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_putc(':'); 1a332: 8a e3 ldi r24, 0x3A ; 58 1a334: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_puts_P(MSG_OK_CAPS); 1a338: 88 e1 ldi r24, 0x18 ; 24 1a33a: 9b e6 ldi r25, 0x6B ; 107 break; default: lcd_puts_P(_name_PROGMEM); } } 1a33c: df 91 pop r29 1a33e: cf 91 pop r28 1a340: 1f 91 pop r17 1a342: 0f 91 pop r16 lcd_puts_P(_name_PROGMEM); lcd_putc(':'); lcd_puts_P(MSG_OK_CAPS); break; default: lcd_puts_P(_name_PROGMEM); 1a344: 0c 94 63 6e jmp 0xdcc6 ; 0xdcc6 0001a348 : static void fsensor_reinit() { fsensor.init(); } static void lcd_fsensor_enabled_set(void) { fsensor.setEnabled(!fsensor.isEnabled()); 1a348: 81 e0 ldi r24, 0x01 ; 1 1a34a: 90 91 a9 17 lds r25, 0x17A9 ; 0x8017a9 1a34e: 91 11 cpse r25, r1 1a350: 80 e0 ldi r24, 0x00 ; 0 1a352: 0c 94 67 74 jmp 0xe8ce ; 0xe8ce 0001a356 : static void lcd_fsensor_autoload_set() { fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true); } #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static void lcd_fsensor_jam_detection_set() { 1a356: 0f 93 push r16 1a358: 1f 93 push r17 1a35a: cf 93 push r28 fsensor.setJamDetectionEnabled(!fsensor.getJamDetectionEnabled(), true); 1a35c: 09 ea ldi r16, 0xA9 ; 169 1a35e: 17 e1 ldi r17, 0x17 ; 23 1a360: f8 01 movw r30, r16 1a362: c6 85 ldd r28, Z+14 ; 0x0e 1a364: 81 e0 ldi r24, 0x01 ; 1 1a366: c8 27 eor r28, r24 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 1a368: c6 87 std Z+14, r28 ; 0x0e oldPos = pat9125_y; 1a36a: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 1a36e: 90 91 8f 0e lds r25, 0x0E8F ; 0x800e8f 1a372: 90 8b std Z+16, r25 ; 0x10 1a374: 87 87 std Z+15, r24 ; 0x0f resetStepCount(); 1a376: 0f 94 e1 7b call 0x2f7c2 ; 0x2f7c2 jamErrCnt = 0; 1a37a: f8 01 movw r30, r16 1a37c: 15 8a std Z+21, r1 ; 0x15 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1a37e: 6c 2f mov r22, r28 1a380: 8d ea ldi r24, 0xAD ; 173 1a382: 9c e0 ldi r25, 0x0C ; 12 } 1a384: cf 91 pop r28 1a386: 1f 91 pop r17 1a388: 0f 91 pop r16 1a38a: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001a38e : Sound_CycleState(); } #ifndef MMU_FORCE_STEALTH_MODE static void lcd_mmu_mode_toggle() { eeprom_toggle((uint8_t*)EEPROM_MMU_STEALTH); 1a38e: 89 ea ldi r24, 0xA9 ; 169 1a390: 9d e0 ldi r25, 0x0D ; 13 1a392: 0c 94 cc 75 jmp 0xeb98 ; 0xeb98 0001a396 : 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)) { 1a396: 0f 93 push r16 1a398: 1f 93 push r17 1a39a: cf 93 push r28 1a39c: df 93 push r29 1a39e: eb 01 movw r28, r22 1a3a0: 8a 01 movw r16, r20 switch(*oCheckSetting) { 1a3a2: 81 30 cpi r24, 0x01 ; 1 1a3a4: 81 f0 breq .+32 ; 0x1a3c6 1a3a6: 82 30 cpi r24, 0x02 ; 2 1a3a8: 89 f0 breq .+34 ; 0x1a3cc case ClCheckMode::_None: MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func); 1a3aa: 86 e6 ldi r24, 0x66 ; 102 1a3ac: 99 e4 ldi r25, 0x49 ; 73 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); 1a3ae: 0e 94 44 72 call 0xe488 ; 0xe488 1a3b2: 22 e0 ldi r18, 0x02 ; 2 1a3b4: a8 01 movw r20, r16 1a3b6: bc 01 movw r22, r24 1a3b8: ce 01 movw r24, r28 break; default: MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func); } } 1a3ba: df 91 pop r29 1a3bc: cf 91 pop r28 1a3be: 1f 91 pop r17 1a3c0: 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); 1a3c2: 0d 94 19 d3 jmp 0x3a632 ; 0x3a632 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); 1a3c6: 8f e5 ldi r24, 0x5F ; 95 1a3c8: 99 e4 ldi r25, 0x49 ; 73 1a3ca: f1 cf rjmp .-30 ; 0x1a3ae break; case ClCheckMode::_Strict: MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func); 1a3cc: 86 e5 ldi r24, 0x56 ; 86 1a3ce: 99 e4 ldi r25, 0x49 ; 73 1a3d0: ee cf rjmp .-36 ; 0x1a3ae 0001a3d2 : 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() { 1a3d2: cf 93 push r28 1a3d4: 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); 1a3d6: 80 91 38 02 lds r24, 0x0238 ; 0x800238 1a3da: 88 23 and r24, r24 1a3dc: 89 f0 breq .+34 ; 0x1a400 1a3de: 81 e5 ldi r24, 0x51 ; 81 1a3e0: 9c e5 ldi r25, 0x5C ; 92 1a3e2: 0e 94 44 72 call 0xe488 ; 0xe488 1a3e6: ec 01 movw r28, r24 1a3e8: 8f e9 ldi r24, 0x9F ; 159 1a3ea: 93 e4 ldi r25, 0x43 ; 67 1a3ec: 0e 94 44 72 call 0xe488 ; 0xe488 1a3f0: 22 e0 ldi r18, 0x02 ; 2 1a3f2: 4e ed ldi r20, 0xDE ; 222 1a3f4: 58 e3 ldi r21, 0x38 ; 56 1a3f6: be 01 movw r22, r28 } 1a3f8: df 91 pop r29 1a3fa: 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); 1a3fc: 0d 94 19 d3 jmp 0x3a632 ; 0x3a632 1a400: 8b e4 ldi r24, 0x4B ; 75 1a402: 9c e5 ldi r25, 0x5C ; 92 1a404: ee cf rjmp .-36 ; 0x1a3e2 0001a406 : eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED); MMU2::mmu2.Status(); } static void SETTINGS_SILENT_MODE() { 1a406: cf 93 push r28 1a408: df 93 push r29 if (!farm_mode) { // dont show in menu if we are in farm mode #ifdef TMC2130 uint8_t eeprom_mode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); 1a40a: 8f ef ldi r24, 0xFF ; 255 1a40c: 9f e0 ldi r25, 0x0F ; 15 1a40e: 0f 94 10 dc call 0x3b820 ; 0x3b820 bool bDesync = tmc2130_mode ^ eeprom_mode; 1a412: 90 91 8b 06 lds r25, 0x068B ; 0x80068b if (eeprom_mode == SILENT_MODE_NORMAL) 1a416: 81 11 cpse r24, r1 1a418: 35 c0 rjmp .+106 ; 0x1a484 { if (bDesync) 1a41a: 99 23 and r25, r25 1a41c: 11 f1 breq .+68 ; 0x1a462 { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), PSTR("M915"), lcd_silent_mode_set); 1a41e: 8f ea ldi r24, 0xAF ; 175 1a420: 97 e4 ldi r25, 0x47 ; 71 1a422: 0e 94 44 72 call 0xe488 ; 0xe488 1a426: 22 e0 ldi r18, 0x02 ; 2 1a428: 43 ee ldi r20, 0xE3 ; 227 1a42a: 50 ef ldi r21, 0xF0 ; 240 1a42c: 6a e5 ldi r22, 0x5A ; 90 1a42e: 79 e8 ldi r23, 0x89 ; 137 } else { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_NORMAL), lcd_silent_mode_set); 1a430: 0f 94 19 d3 call 0x3a632 ; 0x3a632 } MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET) ? _T(MSG_ON) : _T(MSG_OFF), crash_mode_switch); 1a434: 89 e6 ldi r24, 0x69 ; 105 1a436: 9f e0 ldi r25, 0x0F ; 15 1a438: 0f 94 10 dc call 0x3b820 ; 0x3b820 1a43c: 88 23 and r24, r24 1a43e: f9 f0 breq .+62 ; 0x1a47e 1a440: 81 e5 ldi r24, 0x51 ; 81 1a442: 9c e5 ldi r25, 0x5C ; 92 1a444: 0e 94 44 72 call 0xe488 ; 0xe488 1a448: ec 01 movw r28, r24 1a44a: 80 e8 ldi r24, 0x80 ; 128 1a44c: 93 e4 ldi r25, 0x43 ; 67 1a44e: 0e 94 44 72 call 0xe488 ; 0xe488 1a452: 22 e0 ldi r18, 0x02 ; 2 1a454: 49 ee ldi r20, 0xE9 ; 233 1a456: 5f ed ldi r21, 0xDF ; 223 1a458: 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 } } 1a45a: df 91 pop r29 1a45c: cf 91 pop r28 } else { 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); 1a45e: 0d 94 19 d3 jmp 0x3a632 ; 0x3a632 { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), PSTR("M915"), lcd_silent_mode_set); } else { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_NORMAL), lcd_silent_mode_set); 1a462: 88 e3 ldi r24, 0x38 ; 56 1a464: 94 e4 ldi r25, 0x44 ; 68 1a466: 0e 94 44 72 call 0xe488 ; 0xe488 1a46a: ec 01 movw r28, r24 1a46c: 8f ea ldi r24, 0xAF ; 175 1a46e: 97 e4 ldi r25, 0x47 ; 71 1a470: 0e 94 44 72 call 0xe488 ; 0xe488 1a474: 22 e0 ldi r18, 0x02 ; 2 1a476: 43 ee ldi r20, 0xE3 ; 227 1a478: 50 ef ldi r21, 0xF0 ; 240 1a47a: be 01 movw r22, r28 1a47c: d9 cf rjmp .-78 ; 0x1a430 } MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET) ? _T(MSG_ON) : _T(MSG_OFF), crash_mode_switch); 1a47e: 8b e4 ldi r24, 0x4B ; 75 1a480: 9c e5 ldi r25, 0x5C ; 92 1a482: e0 cf rjmp .-64 ; 0x1a444 } else { if (bDesync) 1a484: 98 17 cp r25, r24 1a486: a9 f0 breq .+42 ; 0x1a4b2 { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), PSTR("M914") , lcd_silent_mode_set); 1a488: 8f ea ldi r24, 0xAF ; 175 1a48a: 97 e4 ldi r25, 0x47 ; 71 1a48c: 0e 94 44 72 call 0xe488 ; 0xe488 1a490: 22 e0 ldi r18, 0x02 ; 2 1a492: 43 ee ldi r20, 0xE3 ; 227 1a494: 50 ef ldi r21, 0xF0 ; 240 1a496: 65 e5 ldi r22, 0x55 ; 85 1a498: 79 e8 ldi r23, 0x89 ; 137 } else { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set); 1a49a: 0f 94 19 d3 call 0x3a632 ; 0x3a632 } MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), NULL, lcd_crash_mode_info); 1a49e: 80 e8 ldi r24, 0x80 ; 128 1a4a0: 93 e4 ldi r25, 0x43 ; 67 1a4a2: 0e 94 44 72 call 0xe488 ; 0xe488 1a4a6: 22 e0 ldi r18, 0x02 ; 2 1a4a8: 4f ee ldi r20, 0xEF ; 239 1a4aa: 5f ed ldi r21, 0xDF ; 223 1a4ac: 70 e0 ldi r23, 0x00 ; 0 1a4ae: 60 e0 ldi r22, 0x00 ; 0 1a4b0: d4 cf rjmp .-88 ; 0x1a45a { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), PSTR("M914") , lcd_silent_mode_set); } else { MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set); 1a4b2: 86 e7 ldi r24, 0x76 ; 118 1a4b4: 93 e4 ldi r25, 0x43 ; 67 1a4b6: 0e 94 44 72 call 0xe488 ; 0xe488 1a4ba: ec 01 movw r28, r24 1a4bc: 8f ea ldi r24, 0xAF ; 175 1a4be: 97 e4 ldi r25, 0x47 ; 71 1a4c0: 0e 94 44 72 call 0xe488 ; 0xe488 1a4c4: 22 e0 ldi r18, 0x02 ; 2 1a4c6: 43 ee ldi r20, 0xE3 ; 227 1a4c8: 50 ef ldi r21, 0xF0 ; 240 1a4ca: be 01 movw r22, r28 1a4cc: e6 cf rjmp .-52 ; 0x1a49a 0001a4ce : } #endif //FILAMENT_SENSOR static void menuitems_MMU_settings_common() { 1a4ce: cf 93 push r28 1a4d0: df 93 push r29 } } bool SpoolJoin::isSpoolJoinEnabled() { if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) { 1a4d2: 86 ed ldi r24, 0xD6 ; 214 1a4d4: 9e e0 ldi r25, 0x0E ; 14 1a4d6: 0f 94 10 dc call 0x3b820 ; 0x3b820 1a4da: 81 30 cpi r24, 0x01 ; 1 1a4dc: c1 f5 brne .+112 ; 0x1a54e MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin); 1a4de: 81 e5 ldi r24, 0x51 ; 81 1a4e0: 9c e5 ldi r25, 0x5C ; 92 1a4e2: 0e 94 44 72 call 0xe488 ; 0xe488 1a4e6: 22 e0 ldi r18, 0x02 ; 2 1a4e8: 46 e2 ldi r20, 0x26 ; 38 1a4ea: 59 e3 ldi r21, 0x39 ; 57 1a4ec: bc 01 movw r22, r24 1a4ee: 84 e2 ldi r24, 0x24 ; 36 1a4f0: 9a e6 ldi r25, 0x6A ; 106 1a4f2: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #ifdef MMU_HAS_CUTTER if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED)) 1a4f6: 8e ec ldi r24, 0xCE ; 206 1a4f8: 9e e0 ldi r25, 0x0E ; 14 1a4fa: 0f 94 10 dc call 0x3b820 ; 0x3b820 1a4fe: 81 30 cpi r24, 0x01 ; 1 1a500: 49 f5 brne .+82 ; 0x1a554 { MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ON), lcd_cutter_enabled); 1a502: 81 e5 ldi r24, 0x51 ; 81 1a504: 9c e5 ldi r25, 0x5C ; 92 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); 1a506: 0e 94 44 72 call 0xe488 ; 0xe488 1a50a: ec 01 movw r28, r24 1a50c: 8d e6 ldi r24, 0x6D ; 109 1a50e: 93 e4 ldi r25, 0x43 ; 67 1a510: 0e 94 44 72 call 0xe488 ; 0xe488 1a514: 22 e0 ldi r18, 0x02 ; 2 1a516: 4a e1 ldi r20, 0x1A ; 26 1a518: 5a e3 ldi r21, 0x3A ; 58 1a51a: be 01 movw r22, r28 1a51c: 0f 94 19 d3 call 0x3a632 ; 0x3a632 } #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); 1a520: 89 ea ldi r24, 0xA9 ; 169 1a522: 9d e0 ldi r25, 0x0D ; 13 1a524: 0f 94 10 dc call 0x3b820 ; 0x3b820 1a528: 88 23 and r24, r24 1a52a: b9 f0 breq .+46 ; 0x1a55a 1a52c: 86 e7 ldi r24, 0x76 ; 118 1a52e: 93 e4 ldi r25, 0x43 ; 67 1a530: 0e 94 44 72 call 0xe488 ; 0xe488 1a534: ec 01 movw r28, r24 1a536: 82 e6 ldi r24, 0x62 ; 98 1a538: 93 e4 ldi r25, 0x43 ; 67 1a53a: 0e 94 44 72 call 0xe488 ; 0xe488 1a53e: 22 e0 ldi r18, 0x02 ; 2 1a540: 47 ec ldi r20, 0xC7 ; 199 1a542: 51 ed ldi r21, 0xD1 ; 209 1a544: be 01 movw r22, r28 #endif // MMU_FORCE_STEALTH_MODE } 1a546: df 91 pop r29 1a548: cf 91 pop r28 MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled); } #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); 1a54a: 0d 94 19 d3 jmp 0x3a632 ; 0x3a632 #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); 1a54e: 8b e4 ldi r24, 0x4B ; 75 1a550: 9c e5 ldi r25, 0x5C ; 92 1a552: c7 cf rjmp .-114 ; 0x1a4e2 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); 1a554: 8b e4 ldi r24, 0x4B ; 75 1a556: 9c e5 ldi r25, 0x5C ; 92 1a558: d6 cf rjmp .-84 ; 0x1a506 } #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); 1a55a: 88 e3 ldi r24, 0x38 ; 56 1a55c: 94 e4 ldi r25, 0x44 ; 68 1a55e: e8 cf rjmp .-48 ; 0x1a530 0001a560 : 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) 1a560: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 1a564: 88 23 and r24, r24 1a566: 21 f0 breq .+8 ; 0x1a570 1a568: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 1a56c: 88 23 and r24, r24 1a56e: 51 f0 breq .+20 ; 0x1a584 { _md->status = 1; 1a570: 81 e0 ldi r24, 0x01 ; 1 1a572: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0); 1a576: 60 e0 ldi r22, 0x00 ; 0 1a578: 8a e2 ldi r24, 0x2A ; 42 1a57a: 9d e0 ldi r25, 0x0D ; 13 1a57c: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1a580: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 } MENU_BEGIN(); 1a584: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a588: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1a58c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a590: 84 30 cpi r24, 0x04 ; 4 1a592: 08 f0 brcs .+2 ; 0x1a596 1a594: 76 c0 rjmp .+236 ; 0x1a682 1a596: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch 1a59a: 80 91 fb 03 lds r24, 0x03FB ; 0x8003fb 1a59e: 81 11 cpse r24, r1 1a5a0: 3f c0 rjmp .+126 ; 0x1a620 1a5a2: 8f e4 ldi r24, 0x4F ; 79 1a5a4: 99 e4 ldi r25, 0x49 ; 73 1a5a6: 0e 94 44 72 call 0xe488 ; 0xe488 1a5aa: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu); 1a5ae: 8c ec ldi r24, 0xCC ; 204 1a5b0: 95 e4 ldi r25, 0x45 ; 69 1a5b2: 0e 94 44 72 call 0xe488 ; 0xe488 1a5b6: 61 ec ldi r22, 0xC1 ; 193 1a5b8: 72 ee ldi r23, 0xE2 ; 226 1a5ba: 0f 94 08 d4 call 0x3a810 ; 0x3a810 SETTINGS_NOZZLE; 1a5be: 80 91 ea 04 lds r24, 0x04EA ; 0x8004ea 1a5c2: 8c 33 cpi r24, 0x3C ; 60 1a5c4: 09 f4 brne .+2 ; 0x1a5c8 1a5c6: 49 c0 rjmp .+146 ; 0x1a65a 1a5c8: 70 f5 brcc .+92 ; 0x1a626 1a5ca: 89 31 cpi r24, 0x19 ; 25 1a5cc: d1 f1 breq .+116 ; 0x1a642 1a5ce: 88 32 cpi r24, 0x28 ; 40 1a5d0: 71 f1 breq .+92 ; 0x1a62e MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change); 1a5d2: 83 e0 ldi r24, 0x03 ; 3 1a5d4: 94 e4 ldi r25, 0x44 ; 68 1a5d6: 0e 94 44 72 call 0xe488 ; 0xe488 1a5da: 60 ea ldi r22, 0xA0 ; 160 1a5dc: 7f ec ldi r23, 0xCF ; 207 1a5de: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_ITEM_SUBMENU_P(_T(MSG_CHECKS), lcd_checking_menu); 1a5e2: 8a ef ldi r24, 0xFA ; 250 1a5e4: 93 e4 ldi r25, 0x43 ; 67 1a5e6: 0e 94 44 72 call 0xe488 ; 0xe488 1a5ea: 68 ef ldi r22, 0xF8 ; 248 1a5ec: 74 ed ldi r23, 0xD4 ; 212 1a5ee: 0f 94 08 d4 call 0x3a810 ; 0x3a810 //! 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) 1a5f2: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 1a5f6: 88 23 and r24, r24 1a5f8: 31 f0 breq .+12 ; 0x1a606 { MENU_ITEM_SUBMENU_P(PSTR("Experimental"), lcd_experimental_menu);////MSG_MENU_EXPERIMENTAL c=18 1a5fa: 6a e9 ldi r22, 0x9A ; 154 1a5fc: 70 ef ldi r23, 0xF0 ; 240 1a5fe: 8f e5 ldi r24, 0x5F ; 95 1a600: 99 e8 ldi r25, 0x89 ; 137 1a602: 0f 94 08 d4 call 0x3a810 ; 0x3a810 //! //! 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); #endif //PINDA_TEMP_COMP MENU_END(); 1a606: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc _md->status = 1; _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0); } MENU_BEGIN(); 1a60a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a60e: 8f 5f subi r24, 0xFF ; 255 1a610: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1a614: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1a618: 8f 5f subi r24, 0xFF ; 255 1a61a: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1a61e: b6 cf rjmp .-148 ; 0x1a58c MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch 1a620: 8a ee ldi r24, 0xEA ; 234 1a622: 97 e4 ldi r25, 0x47 ; 71 1a624: c0 cf rjmp .-128 ; 0x1a5a6 MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu); SETTINGS_NOZZLE; 1a626: 80 35 cpi r24, 0x50 ; 80 1a628: 11 f1 breq .+68 ; 0x1a66e 1a62a: 8f 3f cpi r24, 0xFF ; 255 1a62c: 91 f6 brne .-92 ; 0x1a5d2 1a62e: 83 e1 ldi r24, 0x13 ; 19 1a630: 94 e4 ldi r25, 0x44 ; 68 1a632: 0e 94 44 72 call 0xe488 ; 0xe488 1a636: 22 e0 ldi r18, 0x02 ; 2 1a638: 44 e0 ldi r20, 0x04 ; 4 1a63a: 51 ed ldi r21, 0xD1 ; 209 1a63c: 66 e7 ldi r22, 0x76 ; 118 1a63e: 79 e8 ldi r23, 0x89 ; 137 1a640: 09 c0 rjmp .+18 ; 0x1a654 1a642: 83 e1 ldi r24, 0x13 ; 19 1a644: 94 e4 ldi r25, 0x44 ; 68 1a646: 0e 94 44 72 call 0xe488 ; 0xe488 1a64a: 22 e0 ldi r18, 0x02 ; 2 1a64c: 44 e0 ldi r20, 0x04 ; 4 1a64e: 51 ed ldi r21, 0xD1 ; 209 1a650: 6b e7 ldi r22, 0x7B ; 123 1a652: 79 e8 ldi r23, 0x89 ; 137 1a654: 0f 94 19 d3 call 0x3a632 ; 0x3a632 1a658: bc cf rjmp .-136 ; 0x1a5d2 1a65a: 83 e1 ldi r24, 0x13 ; 19 1a65c: 94 e4 ldi r25, 0x44 ; 68 1a65e: 0e 94 44 72 call 0xe488 ; 0xe488 1a662: 22 e0 ldi r18, 0x02 ; 2 1a664: 44 e0 ldi r20, 0x04 ; 4 1a666: 51 ed ldi r21, 0xD1 ; 209 1a668: 61 e7 ldi r22, 0x71 ; 113 1a66a: 79 e8 ldi r23, 0x89 ; 137 1a66c: f3 cf rjmp .-26 ; 0x1a654 1a66e: 83 e1 ldi r24, 0x13 ; 19 1a670: 94 e4 ldi r25, 0x44 ; 68 1a672: 0e 94 44 72 call 0xe488 ; 0xe488 1a676: 22 e0 ldi r18, 0x02 ; 2 1a678: 44 e0 ldi r20, 0x04 ; 4 1a67a: 51 ed ldi r21, 0xD1 ; 209 1a67c: 6c e6 ldi r22, 0x6C ; 108 1a67e: 79 e8 ldi r23, 0x89 ; 137 1a680: e9 cf rjmp .-46 ; 0x1a654 //! 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); #endif //PINDA_TEMP_COMP MENU_END(); } 1a682: 08 95 ret 0001a684 : lcd_return_to_status(); } #endif //THERMAL_MODEL void lcd_sdcard_stop() { 1a684: cf 93 push r28 // Show static message lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT)); 1a686: 80 e0 ldi r24, 0x00 ; 0 1a688: 98 e4 ldi r25, 0x48 ; 72 1a68a: 0e 94 44 72 call 0xe488 ; 0xe488 1a68e: ac 01 movw r20, r24 1a690: 60 e0 ldi r22, 0x00 ; 0 1a692: 80 e0 ldi r24, 0x00 ; 0 1a694: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc_at(0, 1, '\n'); 1a698: 4a e0 ldi r20, 0x0A ; 10 1a69a: 61 e0 ldi r22, 0x01 ; 1 1a69c: 80 e0 ldi r24, 0x00 ; 0 1a69e: 0e 94 98 6e call 0xdd30 ; 0xdd30 MENU_BEGIN(); 1a6a2: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a6a6: 10 92 11 05 sts 0x0511, r1 ; 0x800511 // Skip first two LCD rows used by static message if(menu_row == 0) menu_row = 2; 1a6aa: 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(); 1a6ac: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a6b0: 84 30 cpi r24, 0x04 ; 4 1a6b2: 18 f5 brcc .+70 ; 0x1a6fa 1a6b4: 10 92 14 05 sts 0x0514, r1 ; 0x800514 // Skip first two LCD rows used by static message if(menu_row == 0) menu_row = 2; 1a6b8: 81 11 cpse r24, r1 1a6ba: 02 c0 rjmp .+4 ; 0x1a6c0 1a6bc: c0 93 11 05 sts 0x0511, r28 ; 0x800511 // Show No options first, the default selection MENU_ITEM_FUNCTION_P(_T(MSG_NO), lcd_return_to_status); 1a6c0: 8b ef ldi r24, 0xFB ; 251 1a6c2: 97 e4 ldi r25, 0x47 ; 71 1a6c4: 0e 94 44 72 call 0xe488 ; 0xe488 1a6c8: 6e e9 ldi r22, 0x9E ; 158 1a6ca: 7a e3 ldi r23, 0x3A ; 58 1a6cc: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop); 1a6d0: 85 ef ldi r24, 0xF5 ; 245 1a6d2: 97 e4 ldi r25, 0x47 ; 71 1a6d4: 0e 94 44 72 call 0xe488 ; 0xe488 1a6d8: 66 ea ldi r22, 0xA6 ; 166 1a6da: 75 ef ldi r23, 0xF5 ; 245 1a6dc: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_END(); 1a6e0: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc { // Show static message lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT)); lcd_putc_at(0, 1, '\n'); MENU_BEGIN(); 1a6e4: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a6e8: 8f 5f subi r24, 0xFF ; 255 1a6ea: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1a6ee: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1a6f2: 8f 5f subi r24, 0xFF ; 255 1a6f4: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1a6f8: d9 cf rjmp .-78 ; 0x1a6ac // 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(); } 1a6fa: cf 91 pop r28 1a6fc: 08 95 ret 0001a6fe : act = Filament_sensor::SensorActionOnError::_Continue; } fsensor.setActionOnError(act, true); } static void lcd_fsensor_settings_menu() { 1a6fe: cf 93 push r28 1a700: df 93 push r29 MENU_BEGIN(); 1a702: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a706: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1a70a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a70e: 84 30 cpi r24, 0x04 ; 4 1a710: 08 f0 brcs .+2 ; 0x1a714 1a712: bd c0 rjmp .+378 ; 0x1a88e 1a714: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_BACK)); 1a718: 8f e4 ldi r24, 0x4F ; 79 1a71a: 99 e4 ldi r25, 0x49 ; 73 1a71c: 0e 94 44 72 call 0xe488 ; 0xe488 1a720: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set); 1a724: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1a728: 88 23 and r24, r24 1a72a: 09 f4 brne .+2 ; 0x1a72e 1a72c: 4e c0 rjmp .+156 ; 0x1a7ca 1a72e: 81 e5 ldi r24, 0x51 ; 81 1a730: 9c e5 ldi r25, 0x5C ; 92 1a732: 0e 94 44 72 call 0xe488 ; 0xe488 1a736: ec 01 movw r28, r24 1a738: 8b e4 ldi r24, 0x4B ; 75 1a73a: 97 e4 ldi r25, 0x47 ; 71 1a73c: 0e 94 44 72 call 0xe488 ; 0xe488 1a740: 22 e0 ldi r18, 0x02 ; 2 1a742: 44 ea ldi r20, 0xA4 ; 164 1a744: 51 ed ldi r21, 0xD1 ; 209 1a746: be 01 movw r22, r28 1a748: 0f 94 19 d3 call 0x3a632 ; 0x3a632 1a74c: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 if (fsensor.isEnabled()) { 1a750: 88 23 and r24, r24 1a752: 09 f4 brne .+2 ; 0x1a756 1a754: 8c c0 rjmp .+280 ; 0x1a86e if (fsensor.isError()) { 1a756: 83 30 cpi r24, 0x03 ; 3 1a758: d9 f5 brne .+118 ; 0x1a7d0 MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), _T(MSG_NA), fsensor_reinit); 1a75a: 8a e8 ldi r24, 0x8A ; 138 1a75c: 97 e4 ldi r25, 0x47 ; 71 1a75e: 0e 94 44 72 call 0xe488 ; 0xe488 1a762: ec 01 movw r28, r24 1a764: 86 e5 ldi r24, 0x56 ; 86 1a766: 93 e4 ldi r25, 0x43 ; 67 1a768: 0e 94 44 72 call 0xe488 ; 0xe488 1a76c: 22 e0 ldi r18, 0x02 ; 2 1a76e: 4a ef ldi r20, 0xFA ; 250 1a770: 5f ec ldi r21, 0xCF ; 207 1a772: be 01 movw r22, r28 1a774: 0f 94 19 d3 call 0x3a632 ; 0x3a632 MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_NA), fsensor_reinit); 1a778: 8a e8 ldi r24, 0x8A ; 138 1a77a: 97 e4 ldi r25, 0x47 ; 71 1a77c: 0e 94 44 72 call 0xe488 ; 0xe488 1a780: ec 01 movw r28, r24 1a782: 88 e4 ldi r24, 0x48 ; 72 1a784: 93 e4 ldi r25, 0x43 ; 67 1a786: 0e 94 44 72 call 0xe488 ; 0xe488 1a78a: 22 e0 ldi r18, 0x02 ; 2 1a78c: 4a ef ldi r20, 0xFA ; 250 1a78e: 5f ec ldi r21, 0xCF ; 207 1a790: be 01 movw r22, r28 1a792: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit); 1a796: 8a e8 ldi r24, 0x8A ; 138 1a798: 97 e4 ldi r25, 0x47 ; 71 1a79a: 0e 94 44 72 call 0xe488 ; 0xe488 1a79e: ec 01 movw r28, r24 1a7a0: 88 e3 ldi r24, 0x38 ; 56 1a7a2: 93 e4 ldi r25, 0x43 ; 67 1a7a4: 0e 94 44 72 call 0xe488 ; 0xe488 1a7a8: 22 e0 ldi r18, 0x02 ; 2 1a7aa: 4a ef ldi r20, 0xFA ; 250 1a7ac: 5f ec ldi r21, 0xCF ; 207 } 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); 1a7ae: be 01 movw r22, r28 1a7b0: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } switch(fsensor.getActionOnError()) { 1a7b4: 80 91 b1 17 lds r24, 0x17B1 ; 0x8017b1 1a7b8: 88 23 and r24, r24 1a7ba: 09 f4 brne .+2 ; 0x1a7be 1a7bc: 49 c0 rjmp .+146 ; 0x1a850 1a7be: 81 30 cpi r24, 0x01 ; 1 1a7c0: 09 f4 brne .+2 ; 0x1a7c4 1a7c2: 62 c0 rjmp .+196 ; 0x1a888 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(); 1a7c4: 0e 94 a7 d0 call 0x1a14e ; 0x1a14e 1a7c8: 52 c0 rjmp .+164 ; 0x1a86e 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); 1a7ca: 8b e4 ldi r24, 0x4B ; 75 1a7cc: 9c e5 ldi r25, 0x5C ; 92 1a7ce: b1 cf rjmp .-158 ; 0x1a732 #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); 1a7d0: 80 91 ab 17 lds r24, 0x17AB ; 0x8017ab 1a7d4: 88 23 and r24, r24 1a7d6: 99 f1 breq .+102 ; 0x1a83e 1a7d8: 81 e5 ldi r24, 0x51 ; 81 1a7da: 9c e5 ldi r25, 0x5C ; 92 1a7dc: 0e 94 44 72 call 0xe488 ; 0xe488 1a7e0: ec 01 movw r28, r24 1a7e2: 86 e5 ldi r24, 0x56 ; 86 1a7e4: 93 e4 ldi r25, 0x43 ; 67 1a7e6: 0e 94 44 72 call 0xe488 ; 0xe488 1a7ea: 22 e0 ldi r18, 0x02 ; 2 1a7ec: 46 e2 ldi r20, 0x26 ; 38 1a7ee: 50 ed ldi r21, 0xD0 ; 208 1a7f0: be 01 movw r22, r28 1a7f2: 0f 94 19 d3 call 0x3a632 ; 0x3a632 MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set); 1a7f6: 80 91 aa 17 lds r24, 0x17AA ; 0x8017aa 1a7fa: 88 23 and r24, r24 1a7fc: 19 f1 breq .+70 ; 0x1a844 1a7fe: 81 e5 ldi r24, 0x51 ; 81 1a800: 9c e5 ldi r25, 0x5C ; 92 1a802: 0e 94 44 72 call 0xe488 ; 0xe488 1a806: ec 01 movw r28, r24 1a808: 88 e4 ldi r24, 0x48 ; 72 1a80a: 93 e4 ldi r25, 0x43 ; 67 1a80c: 0e 94 44 72 call 0xe488 ; 0xe488 1a810: 22 e0 ldi r18, 0x02 ; 2 1a812: 40 e3 ldi r20, 0x30 ; 48 1a814: 50 ed ldi r21, 0xD0 ; 208 1a816: be 01 movw r22, r28 1a818: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #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); 1a81c: 80 91 b7 17 lds r24, 0x17B7 ; 0x8017b7 1a820: 88 23 and r24, r24 1a822: 99 f0 breq .+38 ; 0x1a84a 1a824: 81 e5 ldi r24, 0x51 ; 81 1a826: 9c e5 ldi r25, 0x5C ; 92 1a828: 0e 94 44 72 call 0xe488 ; 0xe488 1a82c: ec 01 movw r28, r24 1a82e: 88 e3 ldi r24, 0x38 ; 56 1a830: 93 e4 ldi r25, 0x43 ; 67 1a832: 0e 94 44 72 call 0xe488 ; 0xe488 1a836: 22 e0 ldi r18, 0x02 ; 2 1a838: 4b ea ldi r20, 0xAB ; 171 1a83a: 51 ed ldi r21, 0xD1 ; 209 1a83c: b8 cf rjmp .-144 ; 0x1a7ae #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); 1a83e: 8b e4 ldi r24, 0x4B ; 75 1a840: 9c e5 ldi r25, 0x5C ; 92 1a842: cc cf rjmp .-104 ; 0x1a7dc MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set); 1a844: 8b e4 ldi r24, 0x4B ; 75 1a846: 9c e5 ldi r25, 0x5C ; 92 1a848: dc cf rjmp .-72 ; 0x1a802 #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); 1a84a: 8b e4 ldi r24, 0x4B ; 75 1a84c: 9c e5 ldi r25, 0x5C ; 92 1a84e: ec cf rjmp .-40 ; 0x1a828 #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); 1a850: 80 e3 ldi r24, 0x30 ; 48 1a852: 93 e4 ldi r25, 0x43 ; 67 break; case Filament_sensor::SensorActionOnError::_Pause: MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set); 1a854: 0e 94 44 72 call 0xe488 ; 0xe488 1a858: ec 01 movw r28, r24 1a85a: 84 e2 ldi r24, 0x24 ; 36 1a85c: 93 e4 ldi r25, 0x43 ; 67 1a85e: 0e 94 44 72 call 0xe488 ; 0xe488 1a862: 22 e0 ldi r18, 0x02 ; 2 1a864: 47 ea ldi r20, 0xA7 ; 167 1a866: 50 ed ldi r21, 0xD0 ; 208 1a868: be 01 movw r22, r28 1a86a: 0f 94 19 d3 call 0x3a632 ; 0x3a632 default: lcd_fsensor_actionNA_set(); } } MENU_END(); 1a86e: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } fsensor.setActionOnError(act, true); } static void lcd_fsensor_settings_menu() { MENU_BEGIN(); 1a872: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a876: 8f 5f subi r24, 0xFF ; 255 1a878: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1a87c: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1a880: 8f 5f subi r24, 0xFF ; 255 1a882: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1a886: 41 cf rjmp .-382 ; 0x1a70a 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); 1a888: 8c e1 ldi r24, 0x1C ; 28 1a88a: 93 e4 ldi r25, 0x43 ; 67 1a88c: e3 cf rjmp .-58 ; 0x1a854 lcd_fsensor_actionNA_set(); } } MENU_END(); } 1a88e: df 91 pop r29 1a890: cf 91 pop r28 1a892: 08 95 ret 0001a894 : lcd_first_layer_calibration_reset(); } static void lcd_sheet_menu() { MENU_BEGIN(); 1a894: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a898: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1a89c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a8a0: 84 30 cpi r24, 0x04 ; 4 1a8a2: 08 f0 brcs .+2 ; 0x1a8a6 1a8a4: 3f c0 rjmp .+126 ; 0x1a924 1a8a6: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_STEEL_SHEETS)); 1a8aa: 8c ec ldi r24, 0xCC ; 204 1a8ac: 95 e4 ldi r25, 0x45 ; 69 1a8ae: 0e 94 44 72 call 0xe488 ; 0xe488 1a8b2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if(eeprom_is_sheet_initialized(selected_sheet)){ 1a8b6: 80 91 e0 03 lds r24, 0x03E0 ; 0x8003e0 1a8ba: 0e 94 d9 75 call 0xebb2 ; 0xebb2 1a8be: 88 23 and r24, r24 1a8c0: 41 f0 breq .+16 ; 0x1a8d2 MENU_ITEM_SUBMENU_P(_T(MSG_SELECT), change_sheet); 1a8c2: 83 ec ldi r24, 0xC3 ; 195 1a8c4: 95 e4 ldi r25, 0x45 ; 69 1a8c6: 0e 94 44 72 call 0xe488 ; 0xe488 1a8ca: 6b e8 ldi r22, 0x8B ; 139 1a8cc: 71 ee ldi r23, 0xE1 ; 225 1a8ce: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } if (lcd_commands_type == LcdCommands::Idle) 1a8d2: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1a8d6: 81 11 cpse r24, r1 1a8d8: 08 c0 rjmp .+16 ; 0x1a8ea { MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), activate_calibrate_sheet); 1a8da: 80 eb ldi r24, 0xB0 ; 176 1a8dc: 95 e4 ldi r25, 0x45 ; 69 1a8de: 0e 94 44 72 call 0xe488 ; 0xe488 1a8e2: 62 e2 ldi r22, 0x22 ; 34 1a8e4: 70 ef ldi r23, 0xF0 ; 240 1a8e6: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu); 1a8ea: 87 ea ldi r24, 0xA7 ; 167 1a8ec: 95 e4 ldi r25, 0x45 ; 69 1a8ee: 0e 94 44 72 call 0xe488 ; 0xe488 1a8f2: 68 e4 ldi r22, 0x48 ; 72 1a8f4: 7c ed ldi r23, 0xDC ; 220 1a8f6: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet); 1a8fa: 8f e9 ldi r24, 0x9F ; 159 1a8fc: 95 e4 ldi r25, 0x45 ; 69 1a8fe: 0e 94 44 72 call 0xe488 ; 0xe488 1a902: 64 e0 ldi r22, 0x04 ; 4 1a904: 7f ee ldi r23, 0xEF ; 239 1a906: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_END(); 1a90a: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc lcd_first_layer_calibration_reset(); } static void lcd_sheet_menu() { MENU_BEGIN(); 1a90e: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a912: 8f 5f subi r24, 0xFF ; 255 1a914: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1a918: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1a91c: 8f 5f subi r24, 0xFF ; 255 1a91e: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1a922: bc cf rjmp .-136 ; 0x1a89c } MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu); MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet); MENU_END(); } 1a924: 08 95 ret 0001a926 ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a926: 87 e0 ldi r24, 0x07 ; 7 1a928: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a92c: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a930 ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a930: 86 e0 ldi r24, 0x06 ; 6 1a932: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a936: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a93a ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a93a: 85 e0 ldi r24, 0x05 ; 5 1a93c: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a940: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a944 ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a944: 84 e0 ldi r24, 0x04 ; 4 1a946: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a94a: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a94e ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a94e: 83 e0 ldi r24, 0x03 ; 3 1a950: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a954: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a958 ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a958: 82 e0 ldi r24, 0x02 ; 2 1a95a: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a95e: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a962 ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a962: 81 e0 ldi r24, 0x01 ; 1 1a964: 80 93 e0 03 sts 0x03E0, r24 ; 0x8003e0 lcd_sheet_menu(); 1a968: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a96c ()>: } template static void select_sheet_menu() { selected_sheet = number; 1a96c: 10 92 e0 03 sts 0x03E0, r1 ; 0x8003e0 lcd_sheet_menu(); 1a970: 0c 94 4a d4 jmp 0x1a894 ; 0x1a894 0001a974 : menu_back_if_clicked(); } void lcd_move_menu_axis() { MENU_BEGIN(); 1a974: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a978: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1a97c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a980: 84 30 cpi r24, 0x04 ; 4 1a982: a8 f5 brcc .+106 ; 0x1a9ee 1a984: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 1a988: 8a ee ldi r24, 0xEA ; 234 1a98a: 97 e4 ldi r25, 0x47 ; 71 1a98c: 0e 94 44 72 call 0xe488 ; 0xe488 1a990: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_X), lcd_move_x); 1a994: 8f e4 ldi r24, 0x4F ; 79 1a996: 9a e3 ldi r25, 0x3A ; 58 1a998: 0e 94 44 72 call 0xe488 ; 0xe488 1a99c: 60 e0 ldi r22, 0x00 ; 0 1a99e: 7a e3 ldi r23, 0x3A ; 58 1a9a0: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Y), lcd_move_y); 1a9a4: 86 e4 ldi r24, 0x46 ; 70 1a9a6: 9a e3 ldi r25, 0x3A ; 58 1a9a8: 0e 94 44 72 call 0xe488 ; 0xe488 1a9ac: 66 ed ldi r22, 0xD6 ; 214 1a9ae: 7a e3 ldi r23, 0x3A ; 58 1a9b0: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Z), lcd_move_z); 1a9b4: 8d e3 ldi r24, 0x3D ; 61 1a9b6: 9a e3 ldi r25, 0x3A ; 58 1a9b8: 0e 94 44 72 call 0xe488 ; 0xe488 1a9bc: 64 ea ldi r22, 0xA4 ; 164 1a9be: 79 e3 ldi r23, 0x39 ; 57 1a9c0: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_EXTRUDER), lcd_move_e); 1a9c4: 82 e3 ldi r24, 0x32 ; 50 1a9c6: 9a e3 ldi r25, 0x3A ; 58 1a9c8: 0e 94 44 72 call 0xe488 ; 0xe488 1a9cc: 68 e6 ldi r22, 0x68 ; 104 1a9ce: 79 e3 ldi r23, 0x39 ; 57 1a9d0: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_END(); 1a9d4: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc menu_back_if_clicked(); } void lcd_move_menu_axis() { MENU_BEGIN(); 1a9d8: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a9dc: 8f 5f subi r24, 0xFF ; 255 1a9de: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1a9e2: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1a9e6: 8f 5f subi r24, 0xFF ; 255 1a9e8: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1a9ec: c7 cf rjmp .-114 ; 0x1a97c 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(); } 1a9ee: 08 95 ret 0001a9f0 : } } static void lcd_checking_menu(void) { MENU_BEGIN(); 1a9f0: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1a9f4: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1a9f8: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1a9fc: 84 30 cpi r24, 0x04 ; 4 1a9fe: d8 f5 brcc .+118 ; 0x1aa76 1aa00: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_HW_SETUP)); 1aa04: 8a e7 ldi r24, 0x7A ; 122 1aa06: 94 e4 ldi r25, 0x44 ; 68 1aa08: 0e 94 44 72 call 0xe488 ; 0xe488 1aa0c: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa settings_check_toggle(&oCheckMode, _T(MSG_NOZZLE), lcd_check_mode_set); 1aa10: 84 eb ldi r24, 0xB4 ; 180 1aa12: 93 e4 ldi r25, 0x43 ; 67 1aa14: 0e 94 44 72 call 0xe488 ; 0xe488 1aa18: 4d e9 ldi r20, 0x9D ; 157 1aa1a: 50 ed ldi r21, 0xD0 ; 208 1aa1c: bc 01 movw r22, r24 1aa1e: 80 91 eb 04 lds r24, 0x04EB ; 0x8004eb 1aa22: 0e 94 cb d1 call 0x1a396 ; 0x1a396 settings_check_toggle(&oCheckModel, _T(MSG_MODEL), lcd_check_model_set); 1aa26: 8c ea ldi r24, 0xAC ; 172 1aa28: 93 e4 ldi r25, 0x43 ; 67 1aa2a: 0e 94 44 72 call 0xe488 ; 0xe488 1aa2e: 43 e9 ldi r20, 0x93 ; 147 1aa30: 50 ed ldi r21, 0xD0 ; 208 1aa32: bc 01 movw r22, r24 1aa34: 80 91 e9 04 lds r24, 0x04E9 ; 0x8004e9 1aa38: 0e 94 cb d1 call 0x1a396 ; 0x1a396 settings_check_toggle(&oCheckVersion, MSG_FIRMWARE, lcd_check_version_set); 1aa3c: 49 e8 ldi r20, 0x89 ; 137 1aa3e: 50 ed ldi r21, 0xD0 ; 208 1aa40: 6e e2 ldi r22, 0x2E ; 46 1aa42: 7a e6 ldi r23, 0x6A ; 106 1aa44: 80 91 e8 04 lds r24, 0x04E8 ; 0x8004e8 1aa48: 0e 94 cb d1 call 0x1a396 ; 0x1a396 settings_check_toggle(&oCheckFilament, MSG_FILAMENT, lcd_check_filament_set); 1aa4c: 4f e7 ldi r20, 0x7F ; 127 1aa4e: 50 ed ldi r21, 0xD0 ; 208 1aa50: 64 e5 ldi r22, 0x54 ; 84 1aa52: 7d e6 ldi r23, 0x6D ; 109 1aa54: 80 91 e6 04 lds r24, 0x04E6 ; 0x8004e6 1aa58: 0e 94 cb d1 call 0x1a396 ; 0x1a396 MENU_END(); 1aa5c: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } } static void lcd_checking_menu(void) { MENU_BEGIN(); 1aa60: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1aa64: 8f 5f subi r24, 0xFF ; 255 1aa66: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1aa6a: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1aa6e: 8f 5f subi r24, 0xFF ; 255 1aa70: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1aa74: c1 cf rjmp .-126 ; 0x1a9f8 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(); } 1aa76: 08 95 ret 0001aa78 : value = !value; eeprom_update_byte_notify((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, value); } void lcd_reprint_from_eeprom() { restore_file_from_sd(); 1aa78: 0e 94 7b 88 call 0x110f6 ; 0x110f6 // M24: Start/resume SD print enquecommand_P(MSG_M24); 1aa7c: 61 e0 ldi r22, 0x01 ; 1 1aa7e: 8d e8 ldi r24, 0x8D ; 141 1aa80: 90 e7 ldi r25, 0x70 ; 112 1aa82: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_return_to_status(); 1aa86: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 0001aa8a : { return lcd_status_message_level; } void menu_lcd_longpress_func(void) { 1aa8a: cf 93 push r28 1aa8c: df 93 push r29 // Wake up the LCD backlight and, // start LCD inactivity timer lcd_timeoutToStatus.start(); 1aa8e: 8a ed ldi r24, 0xDA ; 218 1aa90: 93 e0 ldi r25, 0x03 ; 3 1aa92: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> if (homing_flag || mesh_bed_leveling_flag || menu_menu == lcd_babystep_z || menu_menu == lcd_move_z || menu_is_any_block() || Stopped) 1aa96: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 1aa9a: 81 11 cpse r24, r1 1aa9c: 18 c0 rjmp .+48 ; 0x1aace 1aa9e: 80 91 a7 0d lds r24, 0x0DA7 ; 0x800da7 1aaa2: 81 11 cpse r24, r1 1aaa4: 14 c0 rjmp .+40 ; 0x1aace 1aaa6: c0 91 12 04 lds r28, 0x0412 ; 0x800412 1aaaa: d0 91 13 04 lds r29, 0x0413 ; 0x800413 1aaae: 89 e3 ldi r24, 0x39 ; 57 1aab0: ca 32 cpi r28, 0x2A ; 42 1aab2: d8 07 cpc r29, r24 1aab4: 61 f0 breq .+24 ; 0x1aace 1aab6: 89 e3 ldi r24, 0x39 ; 57 1aab8: c4 3a cpi r28, 0xA4 ; 164 1aaba: d8 07 cpc r29, r24 1aabc: 41 f0 breq .+16 ; 0x1aace 1aabe: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 1aac2: 81 11 cpse r24, r1 1aac4: 04 c0 rjmp .+8 ; 0x1aace 1aac6: 80 91 10 05 lds r24, 0x0510 ; 0x800510 1aaca: 88 23 and r24, r24 1aacc: 31 f0 breq .+12 ; 0x1aada { // disable longpress during re-entry, while homing, calibration or if a serious error lcd_draw_update = 2; 1aace: 82 e0 ldi r24, 0x02 ; 2 1aad0: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 1aad4: df 91 pop r29 1aad6: cf 91 pop r28 1aad8: 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) 1aada: 82 ed ldi r24, 0xD2 ; 210 1aadc: c0 3b cpi r28, 0xB0 ; 176 1aade: d8 07 cpc r29, r24 1aae0: 49 f4 brne .+18 ; 0x1aaf4 { // only toggle the experimental menu visibility flag lcd_draw_update = 2; 1aae2: 82 e0 ldi r24, 0x02 ; 2 1aae4: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d eeprom_toggle((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY); 1aae8: 8a e2 ldi r24, 0x2A ; 42 1aaea: 9d e0 ldi r25, 0x0D ; 13 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 1aaec: df 91 pop r29 1aaee: cf 91 pop r28 } if (menu_menu == lcd_hw_setup_menu) { // only toggle the experimental menu visibility flag lcd_draw_update = 2; eeprom_toggle((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY); 1aaf0: 0c 94 cc 75 jmp 0xeb98 ; 0xeb98 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); 1aaf4: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 1aaf8: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 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 1aafc: 98 13 cpse r25, r24 1aafe: 04 c0 rjmp .+8 ; 0x1ab08 1ab00: 0e 94 28 67 call 0xce50 ; 0xce50 1ab04: 88 23 and r24, r24 1ab06: 61 f0 breq .+24 ; 0x1ab20 if ( babystep_allowed_strict() 1ab08: 0e 94 63 67 call 0xcec6 ; 0xcec6 && (menu_menu == lcd_status_screen // and in listed menus... 1ab0c: 81 11 cpse r24, r1 1ab0e: 10 c0 rjmp .+32 ; 0x1ab30 Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); } void lcd_quick_feedback(void) { lcd_draw_update = 2; 1ab10: 82 e0 ldi r24, 0x02 ; 2 1ab12: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 1ab16: 80 e0 ldi r24, 0x00 ; 0 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 1ab18: df 91 pop r29 1ab1a: cf 91 pop r28 1ab1c: 0d 94 c8 4e jmp 0x29d90 ; 0x29d90 menu_submenu(lcd_babystep_z); } else { lcd_quick_feedback(); } } else { // long press as move-z if (menu_menu == lcd_status_screen 1ab20: 89 e3 ldi r24, 0x39 ; 57 1ab22: c8 30 cpi r28, 0x08 ; 8 1ab24: d8 07 cpc r29, r24 1ab26: e1 f4 brne .+56 ; 0x1ab60 #if (LANG_MODE != 0) || menu_menu == lcd_language #endif || menu_menu == lcd_support_menu ){ menu_submenu(lcd_move_z); 1ab28: 60 e0 ldi r22, 0x00 ; 0 1ab2a: 84 ea ldi r24, 0xA4 ; 164 1ab2c: 99 e3 ldi r25, 0x39 ; 57 1ab2e: 14 c0 rjmp .+40 ; 0x1ab58 // 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... 1ab30: 89 e3 ldi r24, 0x39 ; 57 1ab32: c8 30 cpi r28, 0x08 ; 8 1ab34: d8 07 cpc r29, r24 1ab36: 59 f0 breq .+22 ; 0x1ab4e || menu_menu == lcd_main_menu 1ab38: 85 ed ldi r24, 0xD5 ; 213 1ab3a: cd 3c cpi r28, 0xCD ; 205 1ab3c: d8 07 cpc r29, r24 1ab3e: 39 f0 breq .+14 ; 0x1ab4e || menu_menu == lcd_tune_menu 1ab40: 8a ed ldi r24, 0xDA ; 218 1ab42: c6 34 cpi r28, 0x46 ; 70 1ab44: d8 07 cpc r29, r24 1ab46: 19 f0 breq .+6 ; 0x1ab4e || menu_menu == lcd_support_menu 1ab48: ce 5c subi r28, 0xCE ; 206 1ab4a: da 43 sbci r29, 0x3A ; 58 1ab4c: 09 f7 brne .-62 ; 0x1ab10 ) ){ lcd_clear(); 1ab4e: 0e 94 ab 6e call 0xdd56 ; 0xdd56 menu_submenu(lcd_babystep_z); 1ab52: 60 e0 ldi r22, 0x00 ; 0 1ab54: 8a e2 ldi r24, 0x2A ; 42 1ab56: 99 e3 ldi r25, 0x39 ; 57 menu_submenu(lcd_move_z); } else { lcd_quick_feedback(); } } } 1ab58: df 91 pop r29 1ab5a: cf 91 pop r28 #if (LANG_MODE != 0) || menu_menu == lcd_language #endif || menu_menu == lcd_support_menu ){ menu_submenu(lcd_move_z); 1ab5c: 0d 94 f7 d2 jmp 0x3a5ee ; 0x3a5ee } else { lcd_quick_feedback(); } } else { // long press as move-z if (menu_menu == lcd_status_screen || menu_menu == lcd_main_menu 1ab60: 85 ed ldi r24, 0xD5 ; 213 1ab62: cd 3c cpi r28, 0xCD ; 205 1ab64: d8 07 cpc r29, r24 1ab66: 01 f3 breq .-64 ; 0x1ab28 || menu_menu == lcd_preheat_menu 1ab68: 8a e3 ldi r24, 0x3A ; 58 1ab6a: c8 32 cpi r28, 0x28 ; 40 1ab6c: d8 07 cpc r29, r24 1ab6e: e1 f2 breq .-72 ; 0x1ab28 || menu_menu == lcd_sdcard_menu 1ab70: 82 ef ldi r24, 0xF2 ; 242 1ab72: c7 32 cpi r28, 0x27 ; 39 1ab74: d8 07 cpc r29, r24 1ab76: c1 f2 breq .-80 ; 0x1ab28 || menu_menu == lcd_settings_menu 1ab78: 87 ed ldi r24, 0xD7 ; 215 1ab7a: c1 3e cpi r28, 0xE1 ; 225 1ab7c: d8 07 cpc r29, r24 1ab7e: a1 f2 breq .-88 ; 0x1ab28 || menu_menu == lcd_control_temperature_menu 1ab80: 8a ed ldi r24, 0xDA ; 218 1ab82: c6 32 cpi r28, 0x26 ; 38 1ab84: d8 07 cpc r29, r24 1ab86: 81 f2 breq .-96 ; 0x1ab28 #if (LANG_MODE != 0) || menu_menu == lcd_language 1ab88: 8b ed ldi r24, 0xDB ; 219 1ab8a: ca 30 cpi r28, 0x0A ; 10 1ab8c: d8 07 cpc r29, r24 1ab8e: 61 f2 breq .-104 ; 0x1ab28 #endif || menu_menu == lcd_support_menu 1ab90: ce 5c subi r28, 0xCE ; 206 1ab92: da 43 sbci r29, 0x3A ; 58 1ab94: 09 f0 breq .+2 ; 0x1ab98 1ab96: bc cf rjmp .-136 ; 0x1ab10 1ab98: c7 cf rjmp .-114 ; 0x1ab28 0001ab9a : //! | Fail stats | allways //! | Fail stats MMU | mmu //! | Support | allways //! @endcode static void lcd_main_menu() { 1ab9a: 1f 93 push r17 1ab9c: cf 93 push r28 1ab9e: df 93 push r29 MENU_BEGIN(); 1aba0: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1aba4: 10 92 11 05 sts 0x0511, r1 ; 0x800511 #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); 1aba8: 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 1abaa: d1 e0 ldi r29, 0x01 ; 1 //! | Support | allways //! @endcode static void lcd_main_menu() { MENU_BEGIN(); 1abac: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1abb0: 84 30 cpi r24, 0x04 ; 4 1abb2: 08 f0 brcs .+2 ; 0x1abb6 1abb4: 02 c2 rjmp .+1028 ; 0x1afba 1abb6: 10 92 14 05 sts 0x0514, r1 ; 0x800514 // Majkl superawesome menu MENU_ITEM_BACK_P(_T(MSG_INFO_SCREEN)); 1abba: 88 e0 ldi r24, 0x08 ; 8 1abbc: 97 e4 ldi r25, 0x47 ; 71 1abbe: 0e 94 44 72 call 0xe488 ; 0xe488 1abc2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 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)) { 1abc6: 0e 94 79 67 call 0xcef2 ; 0xcef2 1abca: 81 11 cpse r24, r1 1abcc: 19 c0 rjmp .+50 ; 0x1ac00 1abce: 0e 94 13 67 call 0xce26 ; 0xce26 1abd2: 81 11 cpse r24, r1 1abd4: 15 c0 rjmp .+42 ; 0x1ac00 1abd6: 80 91 e1 03 lds r24, 0x03E1 ; 0x8003e1 1abda: 81 11 cpse r24, r1 1abdc: 11 c0 rjmp .+34 ; 0x1ac00 #include "printer_state.h" static PrinterState printer_state; PrinterState GetPrinterState() { return printer_state; 1abde: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> if ((GetPrinterState() == PrinterState::SDPrintingFinished) && card.mounted) { 1abe2: 83 30 cpi r24, 0x03 ; 3 1abe4: 09 f0 breq .+2 ; 0x1abe8 1abe6: 51 c0 rjmp .+162 ; 0x1ac8a 1abe8: 80 91 90 14 lds r24, 0x1490 ; 0x801490 1abec: 88 23 and r24, r24 1abee: 41 f0 breq .+16 ; 0x1ac00 MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_reprint_from_eeprom); 1abf0: 8e ef ldi r24, 0xFE ; 254 1abf2: 96 e4 ldi r25, 0x46 ; 70 1abf4: 0e 94 44 72 call 0xe488 ; 0xe488 1abf8: 6c e3 ldi r22, 0x3C ; 60 1abfa: 75 ed ldi r23, 0xD5 ; 213 } else if ((GetPrinterState() == PrinterState::HostPrintingFinished) && M79_timer_get_status()) { MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start); 1abfc: 0f 94 07 d1 call 0x3a20e ; 0x3a20e } } // Menu is never shown when idle if (babystep_allowed_strict() && (printJobOngoing() || lcd_commands_type == LcdCommands::Layer1Cal)) 1ac00: 0e 94 63 67 call 0xcec6 ; 0xcec6 1ac04: 88 23 and r24, r24 1ac06: 81 f0 breq .+32 ; 0x1ac28 1ac08: 0e 94 28 67 call 0xce50 ; 0xce50 1ac0c: 81 11 cpse r24, r1 1ac0e: 04 c0 rjmp .+8 ; 0x1ac18 1ac10: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1ac14: 84 30 cpi r24, 0x04 ; 4 1ac16: 41 f4 brne .+16 ; 0x1ac28 MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8 1ac18: 8e ee ldi r24, 0xEE ; 238 1ac1a: 96 e4 ldi r25, 0x46 ; 70 1ac1c: 0e 94 44 72 call 0xe488 ; 0xe488 1ac20: 6a e2 ldi r22, 0x2A ; 42 1ac22: 79 e3 ldi r23, 0x39 ; 57 1ac24: 0f 94 08 d4 call 0x3a810 ; 0x3a810 if (farm_mode) MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8 if (!printer_recovering()) { 1ac28: 0e 94 13 67 call 0xce26 ; 0xce26 1ac2c: 81 11 cpse r24, r1 1ac2e: 61 c0 rjmp .+194 ; 0x1acf2 } //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); 1ac30: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 1ac34: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 1ac38: 89 1b sub r24, r25 1ac3a: 8f 70 andi r24, 0x0F ; 15 if ( moves_planned() || printer_active() #ifdef FANCHECK || fan_check_error == EFCE_REPORTED 1ac3c: a9 f5 brne .+106 ; 0x1aca8 if (farm_mode) MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8 if (!printer_recovering()) { if ( moves_planned() || printer_active() 1ac3e: 0e 94 79 67 call 0xcef2 ; 0xcef2 1ac42: 81 11 cpse r24, r1 1ac44: 31 c0 rjmp .+98 ; 0x1aca8 #ifdef FANCHECK || fan_check_error == EFCE_REPORTED 1ac46: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 1ac4a: 82 30 cpi r24, 0x02 ; 2 1ac4c: 69 f1 breq .+90 ; 0x1aca8 #endif //End FANCHECK ) { MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu); } else if (!Stopped) { 1ac4e: 80 91 10 05 lds r24, 0x0510 ; 0x800510 1ac52: 81 11 cpse r24, r1 1ac54: 31 c0 rjmp .+98 ; 0x1acb8 MENU_ITEM_SUBMENU_P(_T(MSG_PREHEAT), lcd_preheat_menu); 1ac56: 8d ed ldi r24, 0xDD ; 221 1ac58: 96 e4 ldi r25, 0x46 ; 70 1ac5a: 0e 94 44 72 call 0xe488 ; 0xe488 1ac5e: 68 e2 ldi r22, 0x28 ; 40 1ac60: 7a e3 ldi r23, 0x3A ; 58 1ac62: 0f 94 08 d4 call 0x3a810 ; 0x3a810 if (M79_timer_get_status()) { 1ac66: 80 91 9c 03 lds r24, 0x039C ; 0x80039c <_ZL9M79_timer.lto_priv.452> 1ac6a: 88 23 and r24, r24 1ac6c: 29 f1 breq .+74 ; 0x1acb8 #ifndef REPLACE_SETREADY if(GetPrinterState() == PrinterState::IsReady) { 1ac6e: 80 91 b7 0d lds r24, 0x0DB7 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 1ac72: 81 30 cpi r24, 0x01 ; 1 1ac74: 09 f0 breq .+2 ; 0x1ac78 1ac76: 7e c0 rjmp .+252 ; 0x1ad74 MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle); 1ac78: 8d ec ldi r24, 0xCD ; 205 1ac7a: 96 e4 ldi r25, 0x46 ; 70 } else { MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle); 1ac7c: 0e 94 44 72 call 0xe488 ; 0xe488 1ac80: 65 ec ldi r22, 0xC5 ; 197 1ac82: 7e ec ldi r23, 0xCE ; 206 1ac84: 0f 94 07 d1 call 0x3a20e ; 0x3a20e 1ac88: 17 c0 rjmp .+46 ; 0x1acb8 // 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()) { 1ac8a: 84 30 cpi r24, 0x04 ; 4 1ac8c: 09 f0 breq .+2 ; 0x1ac90 1ac8e: b8 cf rjmp .-144 ; 0x1ac00 1ac90: 80 91 9c 03 lds r24, 0x039C ; 0x80039c <_ZL9M79_timer.lto_priv.452> 1ac94: 88 23 and r24, r24 1ac96: 09 f4 brne .+2 ; 0x1ac9a 1ac98: b3 cf rjmp .-154 ; 0x1ac00 MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start); 1ac9a: 8e ef ldi r24, 0xFE ; 254 1ac9c: 96 e4 ldi r25, 0x46 ; 70 1ac9e: 0e 94 44 72 call 0xe488 ; 0xe488 1aca2: 6f eb ldi r22, 0xBF ; 191 1aca4: 7e ec ldi r23, 0xCE ; 206 1aca6: aa cf rjmp .-172 ; 0x1abfc 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); 1aca8: 87 ee ldi r24, 0xE7 ; 231 1acaa: 96 e4 ldi r25, 0x46 ; 70 1acac: 0e 94 44 72 call 0xe488 ; 0xe488 1acb0: 66 e4 ldi r22, 0x46 ; 70 1acb2: 7a ed ldi r23, 0xDA ; 218 1acb4: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #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) { 1acb8: c0 91 a7 0d lds r28, 0x0DA7 ; 0x800da7 1acbc: 0e 94 1d 67 call 0xce3a ; 0xce3a 1acc0: c1 11 cpse r28, r1 1acc2: 17 c0 rjmp .+46 ; 0x1acf2 1acc4: 90 91 a6 0d lds r25, 0x0DA6 ; 0x800da6 1acc8: 91 11 cpse r25, r1 1acca: 13 c0 rjmp .+38 ; 0x1acf2 1accc: 81 11 cpse r24, r1 1acce: 15 c0 rjmp .+42 ; 0x1acfa 1acd0: 80 91 a1 03 lds r24, 0x03A1 ; 0x8003a1 1acd4: 81 11 cpse r24, r1 1acd6: 0d c0 rjmp .+26 ; 0x1acf2 if (usb_timer.running()) { 1acd8: 80 91 0d 05 lds r24, 0x050D ; 0x80050d 1acdc: 88 23 and r24, r24 1acde: 09 f4 brne .+2 ; 0x1ace2 1ace0: 4c c0 rjmp .+152 ; 0x1ad7a MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print); 1ace2: 83 eb ldi r24, 0xB3 ; 179 1ace4: 96 e4 ldi r25, 0x46 ; 70 1ace6: 0e 94 44 72 call 0xe488 ; 0xe488 1acea: 66 e5 ldi r22, 0x56 ; 86 1acec: 79 e3 ldi r23, 0x39 ; 57 } else if (IS_SD_PRINTING) { MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print); 1acee: 0f 94 07 d1 call 0x3a20e ; 0x3a20e } } } if (printingIsPaused() 1acf2: 0e 94 1d 67 call 0xce3a ; 0xce3a && !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) { 1acf6: 88 23 and r24, r24 1acf8: f1 f0 breq .+60 ; 0x1ad36 temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; 1acfa: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> } } } if (printingIsPaused() // only allow resuming if hardware errors (temperature or fan) are cleared && !get_temp_error() 1acfe: 81 11 cpse r24, r1 1ad00: 1a c0 rjmp .+52 ; 0x1ad36 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 1ad02: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 1ad06: 82 30 cpi r24, 0x02 ; 2 1ad08: b1 f0 breq .+44 ; 0x1ad36 #endif //FANCHECK && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing) 1ad0a: 80 91 6a 02 lds r24, 0x026A ; 0x80026a 1ad0e: 82 30 cpi r24, 0x02 ; 2 1ad10: 21 f4 brne .+8 ; 0x1ad1a 1ad12: 90 91 a8 0d lds r25, 0x0DA8 ; 0x800da8 1ad16: 99 23 and r25, r25 1ad18: 71 f0 breq .+28 ; 0x1ad36 && custom_message_type != CustomMsg::Resuming) { 1ad1a: 90 91 c3 06 lds r25, 0x06C3 ; 0x8006c3 1ad1e: 98 30 cpi r25, 0x08 ; 8 1ad20: 51 f0 breq .+20 ; 0x1ad36 if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { 1ad22: 81 11 cpse r24, r1 1ad24: 36 c0 rjmp .+108 ; 0x1ad92 MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print); 1ad26: 84 ea ldi r24, 0xA4 ; 164 1ad28: 96 e4 ldi r25, 0x46 ; 70 1ad2a: 0e 94 44 72 call 0xe488 ; 0xe488 1ad2e: 60 ed ldi r22, 0xD0 ; 208 1ad30: 78 ef ldi r23, 0xF8 ; 248 } 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); 1ad32: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } } if((printJobOngoing() || printingIsPaused() || (printer_recovering())) 1ad36: 0e 94 28 67 call 0xce50 ; 0xce50 && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { 1ad3a: 81 11 cpse r24, r1 1ad3c: 08 c0 rjmp .+16 ; 0x1ad4e 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())) 1ad3e: 0e 94 1d 67 call 0xce3a ; 0xce3a 1ad42: 81 11 cpse r24, r1 1ad44: 04 c0 rjmp .+8 ; 0x1ad4e 1ad46: 0e 94 13 67 call 0xce26 ; 0xce26 1ad4a: 88 23 and r24, r24 1ad4c: 41 f0 breq .+16 ; 0x1ad5e && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { 1ad4e: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 1ad52: 81 30 cpi r24, 0x01 ; 1 1ad54: 21 f0 breq .+8 ; 0x1ad5e 1ad56: 80 91 a1 03 lds r24, 0x03A1 ; 0x8003a1 1ad5a: 88 23 and r24, r24 1ad5c: 39 f1 breq .+78 ; 0x1adac MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop); } #ifdef THERMAL_MODEL else if(Stopped) { 1ad5e: 80 91 10 05 lds r24, 0x0510 ; 0x800510 1ad62: 88 23 and r24, r24 1ad64: 59 f1 breq .+86 ; 0x1adbc MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop); 1ad66: 83 e9 ldi r24, 0x93 ; 147 1ad68: 96 e4 ldi r25, 0x46 ; 70 1ad6a: 0e 94 44 72 call 0xe488 ; 0xe488 1ad6e: 66 ea ldi r22, 0xA6 ; 166 1ad70: 75 ef ldi r23, 0xF5 ; 245 1ad72: 22 c0 rjmp .+68 ; 0x1adb8 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); 1ad74: 81 ec ldi r24, 0xC1 ; 193 1ad76: 96 e4 ldi r25, 0x46 ; 70 1ad78: 81 cf rjmp .-254 ; 0x1ac7c } } 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) { 1ad7a: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 1ad7e: 88 23 and r24, r24 1ad80: 09 f4 brne .+2 ; 0x1ad84 1ad82: b7 cf rjmp .-146 ; 0x1acf2 MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print); 1ad84: 83 eb ldi r24, 0xB3 ; 179 1ad86: 96 e4 ldi r25, 0x46 ; 70 1ad88: 0e 94 44 72 call 0xe488 ; 0xe488 1ad8c: 6a ee ldi r22, 0xEA ; 234 1ad8e: 7a e3 ldi r23, 0x3A ; 58 1ad90: ae cf rjmp .-164 ; 0x1acee #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())) { 1ad92: 81 30 cpi r24, 0x01 ; 1 1ad94: 81 f6 brne .-96 ; 0x1ad36 1ad96: 80 91 9c 03 lds r24, 0x039C ; 0x80039c <_ZL9M79_timer.lto_priv.452> 1ad9a: 88 23 and r24, r24 1ad9c: 61 f2 breq .-104 ; 0x1ad36 MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print); 1ad9e: 84 ea ldi r24, 0xA4 ; 164 1ada0: 96 e4 ldi r25, 0x46 ; 70 1ada2: 0e 94 44 72 call 0xe488 ; 0xe488 1ada6: 6f ef ldi r22, 0xFF ; 255 1ada8: 78 ef ldi r23, 0xF8 ; 248 1adaa: c3 cf rjmp .-122 ; 0x1ad32 } } if((printJobOngoing() || printingIsPaused() || (printer_recovering())) && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) { MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop); 1adac: 80 e0 ldi r24, 0x00 ; 0 1adae: 98 e4 ldi r25, 0x48 ; 72 1adb0: 0e 94 44 72 call 0xe488 ; 0xe488 1adb4: 62 e4 ldi r22, 0x42 ; 66 1adb6: 73 ed ldi r23, 0xD3 ; 211 } #ifdef THERMAL_MODEL else if(Stopped) { MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop); 1adb8: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } #endif // only allow starting SD print if hardware errors (temperature or fan) are cleared if (!printer_recovering() && !printer_active() && !get_temp_error() 1adbc: 0e 94 13 67 call 0xce26 ; 0xce26 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 1adc0: 81 11 cpse r24, r1 1adc2: 91 c0 rjmp .+290 ; 0x1aee6 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() 1adc4: 0e 94 79 67 call 0xcef2 ; 0xcef2 1adc8: 81 11 cpse r24, r1 1adca: 8d c0 rjmp .+282 ; 0x1aee6 1adcc: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 1add0: 81 11 cpse r24, r1 1add2: 89 c0 rjmp .+274 ; 0x1aee6 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 1add4: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 1add8: 82 30 cpi r24, 0x02 ; 2 1adda: 09 f4 brne .+2 ; 0x1adde 1addc: 84 c0 rjmp .+264 ; 0x1aee6 #endif //FANCHECK ) { #ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code if (card.mounted 1adde: 80 91 90 14 lds r24, 0x1490 ; 0x801490 1ade2: 81 11 cpse r24, r1 1ade4: 05 c0 rjmp .+10 ; 0x1adf0 || lcd_commands_type != LcdCommands::Idle) { 1ade6: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1adea: 88 23 and r24, r24 1adec: 09 f4 brne .+2 ; 0x1adf0 1adee: ac c0 rjmp .+344 ; 0x1af48 if (!card.isFileOpen()) { 1adf0: 80 91 22 17 lds r24, 0x1722 ; 0x801722 1adf4: 81 11 cpse r24, r1 1adf6: 12 c0 rjmp .+36 ; 0x1ae1c if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) { 1adf8: 80 91 0d 05 lds r24, 0x050D ; 0x80050d 1adfc: 81 11 cpse r24, r1 1adfe: 0e c0 rjmp .+28 ; 0x1ae1c 1ae00: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1ae04: 81 11 cpse r24, r1 1ae06: 0a c0 rjmp .+20 ; 0x1ae1c bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function 1ae08: d0 93 df 03 sts 0x03DF, r29 ; 0x8003df MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu); 1ae0c: 83 e8 ldi r24, 0x83 ; 131 1ae0e: 96 e4 ldi r25, 0x46 ; 70 1ae10: 0e 94 44 72 call 0xe488 ; 0xe488 1ae14: 67 e2 ldi r22, 0x27 ; 39 1ae16: 72 ef ldi r23, 0xF2 ; 242 1ae18: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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) { const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 1ae1c: 81 ea ldi r24, 0xA1 ; 161 1ae1e: 9d e0 ldi r25, 0x0D ; 13 1ae20: 0f 94 10 dc call 0x3b820 ; 0x3b820 1ae24: c8 2f mov r28, r24 const int8_t nextSheet = eeprom_next_initialized_sheet(sheet); 1ae26: 0e 94 e7 75 call 0xebce ; 0xebce if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized 1ae2a: 87 fd sbrc r24, 7 1ae2c: 09 c0 rjmp .+18 ; 0x1ae40 1ae2e: c8 17 cp r28, r24 1ae30: 39 f0 breq .+14 ; 0x1ae40 MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet); 1ae32: c1 02 muls r28, r17 1ae34: c0 01 movw r24, r0 1ae36: 11 24 eor r1, r1 1ae38: 87 5b subi r24, 0xB7 ; 183 1ae3a: 92 4f sbci r25, 0xF2 ; 242 1ae3c: 0e 94 f6 ce call 0x19dec ; 0x19dec SETTINGS_NOZZLE; #endif //QUICK_NOZZLE_CHANGE } if (!((eFilamentAction != FilamentAction::None) || Stopped )) { 1ae40: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 1ae44: 81 11 cpse r24, r1 1ae46: 4f c0 rjmp .+158 ; 0x1aee6 1ae48: 80 91 10 05 lds r24, 0x0510 ; 0x800510 1ae4c: 81 11 cpse r24, r1 1ae4e: 4b c0 rjmp .+150 ; 0x1aee6 if (MMU2::mmu2.Enabled()) { 1ae50: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1ae54: 81 30 cpi r24, 0x01 ; 1 1ae56: 09 f0 breq .+2 ; 0x1ae5a 1ae58: 80 c0 rjmp .+256 ; 0x1af5a if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) { 1ae5a: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 1ae5e: 81 11 cpse r24, r1 1ae60: 0c c0 rjmp .+24 ; 0x1ae7a 1ae62: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 1ae66: 81 11 cpse r24, r1 1ae68: 08 c0 rjmp .+16 ; 0x1ae7a // 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); 1ae6a: 85 e6 ldi r24, 0x65 ; 101 1ae6c: 96 e4 ldi r25, 0x46 ; 70 1ae6e: 0e 94 44 72 call 0xe488 ; 0xe488 1ae72: 65 e4 ldi r22, 0x45 ; 69 1ae74: 71 ee ldi r23, 0xE1 ; 225 1ae76: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_TO_NOZZLE), lcd_mmuLoadFilament); 1ae7a: 84 e5 ldi r24, 0x54 ; 84 1ae7c: 96 e4 ldi r25, 0x46 ; 70 1ae7e: 0e 94 44 72 call 0xe488 ; 0xe488 1ae82: 6c e7 ldi r22, 0x7C ; 124 1ae84: 71 ee ldi r23, 0xE1 ; 225 1ae86: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_mmuUnloadFilament); 1ae8a: 82 e4 ldi r24, 0x42 ; 66 1ae8c: 96 e4 ldi r25, 0x46 ; 70 1ae8e: 0e 94 44 72 call 0xe488 ; 0xe488 1ae92: 6f e7 ldi r22, 0x7F ; 127 1ae94: 71 ee ldi r23, 0xE1 ; 225 1ae96: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FROM_MMU), lcd_mmuEjectFilament); 1ae9a: 8e e9 ldi r24, 0x9E ; 158 1ae9c: 9b e5 ldi r25, 0x5B ; 91 1ae9e: 0e 94 44 72 call 0xe488 ; 0xe488 1aea2: 62 e8 ldi r22, 0x82 ; 130 1aea4: 71 ee ldi r23, 0xE1 ; 225 1aea6: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #ifdef MMU_HAS_CUTTER if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0) { 1aeaa: 8e ec ldi r24, 0xCE ; 206 1aeac: 9e e0 ldi r25, 0x0E ; 14 1aeae: 0f 94 10 dc call 0x3b820 ; 0x3b820 1aeb2: 88 23 and r24, r24 1aeb4: 41 f0 breq .+16 ; 0x1aec6 MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament); 1aeb6: 8f e8 ldi r24, 0x8F ; 143 1aeb8: 9b e5 ldi r25, 0x5B ; 91 1aeba: 0e 94 44 72 call 0xe488 ; 0xe488 1aebe: 65 e8 ldi r22, 0x85 ; 133 1aec0: 71 ee ldi r23, 0xE1 ; 225 } #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); 1aec2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #ifdef FILAMENT_SENSOR } #endif //FILAMENT_SENSOR } MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu); 1aec6: 8a ee ldi r24, 0xEA ; 234 1aec8: 97 e4 ldi r25, 0x47 ; 71 1aeca: 0e 94 44 72 call 0xe488 ; 0xe488 1aece: 61 ee ldi r22, 0xE1 ; 225 1aed0: 77 ed ldi r23, 0xD7 ; 215 1aed2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu); 1aed6: 80 e1 ldi r24, 0x10 ; 16 1aed8: 96 e4 ldi r25, 0x46 ; 70 1aeda: 0e 94 44 72 call 0xe488 ; 0xe488 1aede: 64 e5 ldi r22, 0x54 ; 84 1aee0: 79 ed ldi r23, 0xD9 ; 217 1aee2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } } MENU_ITEM_SUBMENU_P(_T(MSG_STATISTICS), lcd_menu_statistics); 1aee6: 83 e0 ldi r24, 0x03 ; 3 1aee8: 96 e4 ldi r25, 0x46 ; 70 1aeea: 0e 94 44 72 call 0xe488 ; 0xe488 1aeee: 64 e4 ldi r22, 0x44 ; 68 1aef0: 7a e3 ldi r23, 0x3A ; 58 1aef2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #if defined(TMC2130) || defined(FILAMENT_SENSOR) MENU_ITEM_SUBMENU_P(_T(MSG_FAIL_STATS), lcd_menu_fails_stats); 1aef6: 86 ef ldi r24, 0xF6 ; 246 1aef8: 95 e4 ldi r25, 0x45 ; 69 1aefa: 0e 94 44 72 call 0xe488 ; 0xe488 1aefe: 62 ea ldi r22, 0xA2 ; 162 1af00: 7a e3 ldi r23, 0x3A ; 58 1af02: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif if (MMU2::mmu2.Enabled()) { 1af06: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1af0a: 81 30 cpi r24, 0x01 ; 1 1af0c: 41 f4 brne .+16 ; 0x1af1e MENU_ITEM_SUBMENU_P(_T(MSG_MMU_FAIL_STATS), lcd_menu_fails_stats_mmu); 1af0e: 85 ee ldi r24, 0xE5 ; 229 1af10: 95 e4 ldi r25, 0x45 ; 69 1af12: 0e 94 44 72 call 0xe488 ; 0xe488 1af16: 6a e5 ldi r22, 0x5A ; 90 1af18: 79 e3 ldi r23, 0x39 ; 57 1af1a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 1af1e: 8b ed ldi r24, 0xDB ; 219 1af20: 95 e4 ldi r25, 0x45 ; 69 1af22: 0e 94 44 72 call 0xe488 ; 0xe488 1af26: 6e ec ldi r22, 0xCE ; 206 1af28: 7a e3 ldi r23, 0x3A ; 58 1af2a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_END(); 1af2e: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc //! | Support | allways //! @endcode static void lcd_main_menu() { MENU_BEGIN(); 1af32: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1af36: 8f 5f subi r24, 0xFF ; 255 1af38: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1af3c: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1af40: 8f 5f subi r24, 0xFF ; 255 1af42: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1af46: 32 ce rjmp .-924 ; 0x1abac #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 1af48: d0 93 df 03 sts 0x03DF, r29 ; 0x8003df MENU_ITEM_BACK_P(_T(MSG_NO_CARD)); 1af4c: 86 e7 ldi r24, 0x76 ; 118 1af4e: 96 e4 ldi r25, 0x46 ; 70 1af50: 0e 94 44 72 call 0xe488 ; 0xe488 1af54: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 1af58: 61 cf rjmp .-318 ; 0x1ae1c MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament); } #endif //MMU_HAS_CUTTER } else { #ifdef FILAMENT_SENSOR if (fsensor.isEnabled()) { 1af5a: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1af5e: 88 23 and r24, r24 1af60: 19 f1 breq .+70 ; 0x1afa8 if (!fsensor.getAutoLoadEnabled()) { 1af62: 80 91 aa 17 lds r24, 0x17AA ; 0x8017aa 1af66: 81 11 cpse r24, r1 1af68: 08 c0 rjmp .+16 ; 0x1af7a MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); 1af6a: 82 e3 ldi r24, 0x32 ; 50 1af6c: 96 e4 ldi r25, 0x46 ; 70 1af6e: 0e 94 44 72 call 0xe488 ; 0xe488 1af72: 64 ec ldi r22, 0xC4 ; 196 1af74: 7a e3 ldi r23, 0x3A ; 58 1af76: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } if (fsensor.getFilamentPresent()) { 1af7a: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 1af7e: 88 23 and r24, r24 1af80: 39 f0 breq .+14 ; 0x1af90 } #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); 1af82: 82 e4 ldi r24, 0x42 ; 66 1af84: 96 e4 ldi r25, 0x46 ; 70 1af86: 0e 94 44 72 call 0xe488 ; 0xe488 1af8a: 6e e2 ldi r22, 0x2E ; 46 1af8c: 7a e3 ldi r23, 0x3A ; 58 1af8e: 99 cf rjmp .-206 ; 0x1aec2 if (fsensor.getFilamentPresent()) { MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament); } #ifndef REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY else { if (fsensor.getAutoLoadEnabled()) { 1af90: 80 91 aa 17 lds r24, 0x17AA ; 0x8017aa 1af94: 88 23 and r24, r24 1af96: 09 f4 brne .+2 ; 0x1af9a 1af98: 96 cf rjmp .-212 ; 0x1aec6 MENU_ITEM_SUBMENU_P(_T(MSG_AUTOLOAD_FILAMENT), lcd_menu_AutoLoadFilament); 1af9a: 8e e1 ldi r24, 0x1E ; 30 1af9c: 96 e4 ldi r25, 0x46 ; 70 1af9e: 0e 94 44 72 call 0xe488 ; 0xe488 1afa2: 6c ed ldi r22, 0xDC ; 220 1afa4: 79 e3 ldi r23, 0x39 ; 57 1afa6: 8d cf rjmp .-230 ; 0x1aec2 } } #endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY } else { #endif //FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament); 1afa8: 82 e3 ldi r24, 0x32 ; 50 1afaa: 96 e4 ldi r25, 0x46 ; 70 1afac: 0e 94 44 72 call 0xe488 ; 0xe488 1afb0: 64 ec ldi r22, 0xC4 ; 196 1afb2: 7a e3 ldi r23, 0x3A ; 58 1afb4: 0f 94 08 d4 call 0x3a810 ; 0x3a810 1afb8: e4 cf rjmp .-56 ; 0x1af82 #endif //HOST_SHUTOWN MENU_ITEM_SUBMENU_P(_T(MSG_SUPPORT), lcd_support_menu); MENU_END(); } 1afba: df 91 pop r29 1afbc: cf 91 pop r28 1afbe: 1f 91 pop r17 1afc0: 08 95 ret 0001afc2 : MENU_END(); } static void lcd_settings_menu() { 1afc2: 1f 93 push r17 1afc4: cf 93 push r28 1afc6: df 93 push r29 SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); 1afc8: 8f ef ldi r24, 0xFF ; 255 1afca: 9f e0 ldi r25, 0x0F ; 15 1afcc: 0f 94 10 dc call 0x3b820 ; 0x3b820 1afd0: 80 93 a2 03 sts 0x03A2, r24 ; 0x8003a2 MENU_BEGIN(); 1afd4: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1afd8: 10 92 11 05 sts 0x0511, r1 ; 0x800511 SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); if(!farm_mode) { bSettings=true; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 1afdc: 11 e0 ldi r17, 0x01 ; 1 } static void lcd_settings_menu() { SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 1afde: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1afe2: 84 30 cpi r24, 0x04 ; 4 1afe4: 08 f0 brcs .+2 ; 0x1afe8 1afe6: 5c c1 rjmp .+696 ; 0x1b2a0 1afe8: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1afec: 8b e3 ldi r24, 0x3B ; 59 1afee: 98 e4 ldi r25, 0x48 ; 72 1aff0: 0e 94 44 72 call 0xe488 ; 0xe488 1aff4: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_TEMPERATURE), lcd_control_temperature_menu); 1aff8: 83 eb ldi r24, 0xB3 ; 179 1affa: 94 e4 ldi r25, 0x44 ; 68 1affc: 0e 94 44 72 call 0xe488 ; 0xe488 1b000: 66 e2 ldi r22, 0x26 ; 38 1b002: 7a ed ldi r23, 0xDA ; 218 1b004: 0f 94 08 d4 call 0x3a810 ; 0x3a810 if (!printer_active() || printingIsPaused()) 1b008: 0e 94 79 67 call 0xcef2 ; 0xcef2 1b00c: 88 23 and r24, r24 1b00e: 21 f0 breq .+8 ; 0x1b018 1b010: 0e 94 1d 67 call 0xce3a ; 0xce3a 1b014: 88 23 and r24, r24 1b016: 81 f0 breq .+32 ; 0x1b038 { MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_AXIS), lcd_move_menu_axis); 1b018: 87 ea ldi r24, 0xA7 ; 167 1b01a: 94 e4 ldi r25, 0x44 ; 68 1b01c: 0e 94 44 72 call 0xe488 ; 0xe488 1b020: 6a eb ldi r22, 0xBA ; 186 1b022: 74 ed ldi r23, 0xD4 ; 212 1b024: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_GCODE_P(_T(MSG_DISABLE_STEPPERS), MSG_M84); 1b028: 84 e9 ldi r24, 0x94 ; 148 1b02a: 94 e4 ldi r25, 0x44 ; 68 1b02c: 0e 94 44 72 call 0xe488 ; 0xe488 1b030: 6c ed ldi r22, 0xDC ; 220 1b032: 7a e6 ldi r23, 0x6A ; 106 1b034: 0f 94 80 d0 call 0x3a100 ; 0x3a100 } #ifdef FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu); 1b038: 8b e4 ldi r24, 0x4B ; 75 1b03a: 97 e4 ldi r25, 0x47 ; 71 1b03c: 0e 94 44 72 call 0xe488 ; 0xe488 1b040: 6f e7 ldi r22, 0x7F ; 127 1b042: 73 ed ldi r23, 0xD3 ; 211 1b044: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #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); 1b048: 8c ea ldi r24, 0xAC ; 172 1b04a: 9c e0 ldi r25, 0x0C ; 12 1b04c: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b050: 88 23 and r24, r24 1b052: 09 f4 brne .+2 ; 0x1b056 1b054: ac c0 rjmp .+344 ; 0x1b1ae 1b056: 81 e5 ldi r24, 0x51 ; 81 1b058: 9c e5 ldi r25, 0x5C ; 92 1b05a: 0e 94 44 72 call 0xe488 ; 0xe488 1b05e: 22 e0 ldi r18, 0x02 ; 2 1b060: 47 ea ldi r20, 0xA7 ; 167 1b062: 54 ee ldi r21, 0xE4 ; 228 1b064: bc 01 movw r22, r24 1b066: 8a e8 ldi r24, 0x8A ; 138 1b068: 99 e8 ldi r25, 0x89 ; 137 1b06a: 0f 94 19 d3 call 0x3a632 ; 0x3a632 if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED)) 1b06e: 8c ea ldi r24, 0xAC ; 172 1b070: 9c e0 ldi r25, 0x0C ; 12 1b072: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b076: 88 23 and r24, r24 1b078: 31 f0 breq .+12 ; 0x1b086 { // Communication with MMU not required to reset MMU MENU_ITEM_FUNCTION_P(PSTR("Reset MMU"), []() { MMU2::mmu2.Reset(MMU2::MMU2::ResetForm::Software); }); 1b07a: 68 ec ldi r22, 0xC8 ; 200 1b07c: 7a e3 ldi r23, 0x3A ; 58 1b07e: 80 e8 ldi r24, 0x80 ; 128 1b080: 99 e8 ldi r25, 0x89 ; 137 1b082: 0f 94 07 d1 call 0x3a20e ; 0x3a20e } if (MMU2::mmu2.Enabled()) 1b086: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1b08a: 81 30 cpi r24, 0x01 ; 1 1b08c: 51 f4 brne .+20 ; 0x1b0a2 { // Only show menus when communicating with MMU menuitems_MMU_settings_common(); 1b08e: 0e 94 67 d2 call 0x1a4ce ; 0x1a4ce MENU_ITEM_SUBMENU_P(_T(MSG_LOADING_TEST), lcd_mmuLoadingTest); 1b092: 85 e8 ldi r24, 0x85 ; 133 1b094: 94 e4 ldi r25, 0x44 ; 68 1b096: 0e 94 44 72 call 0xe488 ; 0xe488 1b09a: 68 e8 ldi r22, 0x88 ; 136 1b09c: 71 ee ldi r23, 0xE1 ; 225 1b09e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } SETTINGS_FANS_CHECK(); 1b0a2: 0e 94 e9 d1 call 0x1a3d2 ; 0x1a3d2 SETTINGS_SILENT_MODE(); 1b0a6: 0e 94 03 d2 call 0x1a406 ; 0x1a406 if(!farm_mode) { bSettings=true; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 1b0aa: 10 93 fb 03 sts 0x03FB, r17 ; 0x8003fb MENU_ITEM_SUBMENU_P(_T(MSG_HW_SETUP), lcd_hw_setup_menu); 1b0ae: 8a e7 ldi r24, 0x7A ; 122 1b0b0: 94 e4 ldi r25, 0x44 ; 68 1b0b2: 0e 94 44 72 call 0xe488 ; 0xe488 1b0b6: 60 eb ldi r22, 0xB0 ; 176 1b0b8: 72 ed ldi r23, 0xD2 ; 210 1b0ba: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } 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); 1b0be: 88 e0 ldi r24, 0x08 ; 8 1b0c0: 95 e4 ldi r25, 0x45 ; 69 1b0c2: 0e 94 44 72 call 0xe488 ; 0xe488 1b0c6: 60 e3 ldi r22, 0x30 ; 48 1b0c8: 7a e3 ldi r23, 0x3A ; 58 1b0ca: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #if defined (TMC2130) && defined (LINEARITY_CORRECTION) MENU_ITEM_SUBMENU_P(_T(MSG_LIN_CORRECTION), lcd_settings_linearity_correction_menu); 1b0ce: 88 e6 ldi r24, 0x68 ; 104 1b0d0: 94 e4 ldi r25, 0x44 ; 68 1b0d2: 0e 94 44 72 call 0xe488 ; 0xe488 1b0d6: 67 e2 ldi r22, 0x27 ; 39 1b0d8: 71 ef ldi r23, 0xF1 ; 241 1b0da: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //LINEARITY_CORRECTION && TMC2130 #ifdef PINDA_THERMISTOR if(has_temperature_compensation()) 1b0de: 20 e0 ldi r18, 0x00 ; 0 1b0e0: 30 e0 ldi r19, 0x00 ; 0 1b0e2: 40 e2 ldi r20, 0x20 ; 32 1b0e4: 51 e4 ldi r21, 0x41 ; 65 1b0e6: 60 91 97 03 lds r22, 0x0397 ; 0x800397 1b0ea: 70 91 98 03 lds r23, 0x0398 ; 0x800398 1b0ee: 80 91 99 03 lds r24, 0x0399 ; 0x800399 1b0f2: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1b0f6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1b0fa: 87 fd sbrc r24, 7 1b0fc: 16 c0 rjmp .+44 ; 0x1b12a 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); 1b0fe: 8f ea ldi r24, 0xAF ; 175 1b100: 9f e0 ldi r25, 0x0F ; 15 1b102: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b106: 88 23 and r24, r24 1b108: 09 f4 brne .+2 ; 0x1b10c 1b10a: 54 c0 rjmp .+168 ; 0x1b1b4 1b10c: 81 e5 ldi r24, 0x51 ; 81 1b10e: 9c e5 ldi r25, 0x5C ; 92 1b110: 0e 94 44 72 call 0xe488 ; 0xe488 1b114: ec 01 movw r28, r24 1b116: 81 ec ldi r24, 0xC1 ; 193 1b118: 94 e4 ldi r25, 0x44 ; 68 1b11a: 0e 94 44 72 call 0xe488 ; 0xe488 1b11e: 22 e0 ldi r18, 0x02 ; 2 1b120: 4f ec ldi r20, 0xCF ; 207 1b122: 50 ed ldi r21, 0xD0 ; 208 1b124: be 01 movw r22, r28 1b126: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #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); 1b12a: 80 91 38 05 lds r24, 0x0538 ; 0x800538 1b12e: 81 11 cpse r24, r1 1b130: 44 c0 rjmp .+136 ; 0x1b1ba 1b132: 8b e4 ldi r24, 0x4B ; 75 1b134: 9c e5 ldi r25, 0x5C ; 92 1b136: 0e 94 44 72 call 0xe488 ; 0xe488 1b13a: ec 01 movw r28, r24 1b13c: 8d e5 ldi r24, 0x5D ; 93 1b13e: 94 e4 ldi r25, 0x44 ; 68 1b140: 0e 94 44 72 call 0xe488 ; 0xe488 1b144: 22 e0 ldi r18, 0x02 ; 2 1b146: 4d eb ldi r20, 0xBD ; 189 1b148: 50 ed ldi r21, 0xD0 ; 208 1b14a: be 01 movw r22, r28 1b14c: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #endif //HAS_SECOND_SERIAL if (!printingIsPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z); 1b150: 0e 94 1d 67 call 0xce3a ; 0xce3a 1b154: 81 11 cpse r24, r1 1b156: 08 c0 rjmp .+16 ; 0x1b168 1b158: 8e ee ldi r24, 0xEE ; 238 1b15a: 96 e4 ldi r25, 0x46 ; 70 1b15c: 0e 94 44 72 call 0xe488 ; 0xe488 1b160: 6a e2 ldi r22, 0x2A ; 42 1b162: 79 e3 ldi r23, 0x39 ; 57 1b164: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #if (LANG_MODE != 0) MENU_ITEM_SUBMENU_P(_T(MSG_SELECT_LANGUAGE), lcd_language_menu); 1b168: 8b e4 ldi r24, 0x4B ; 75 1b16a: 94 e4 ldi r25, 0x44 ; 68 1b16c: 0e 94 44 72 call 0xe488 ; 0xe488 1b170: 6a e8 ldi r22, 0x8A ; 138 1b172: 73 ee ldi r23, 0xE3 ; 227 1b174: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //(LANG_MODE != 0) if (!farm_mode) { //SD related settings are not available in farm mode if (card.ToshibaFlashAir_isEnabled()) 1b178: 80 91 00 17 lds r24, 0x1700 ; 0x801700 1b17c: 88 23 and r24, r24 1b17e: 01 f1 breq .+64 ; 0x1b1c0 MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY, lcd_toshiba_flash_air_compatibility_toggle); 1b180: 81 e4 ldi r24, 0x41 ; 65 1b182: 94 e4 ldi r25, 0x44 ; 68 1b184: 0e 94 44 72 call 0xe488 ; 0xe488 1b188: 22 e0 ldi r18, 0x02 ; 2 1b18a: 43 eb ldi r20, 0xB3 ; 179 1b18c: 50 ed ldi r21, 0xD0 ; 208 1b18e: 64 e4 ldi r22, 0x44 ; 68 1b190: 7a e6 ldi r23, 0x6A ; 106 else MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle); 1b192: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #ifdef SDCARD_SORT_ALPHA switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) { 1b196: 89 e0 ldi r24, 0x09 ; 9 1b198: 9f e0 ldi r25, 0x0F ; 15 1b19a: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b19e: 88 23 and r24, r24 1b1a0: e9 f0 breq .+58 ; 0x1b1dc 1b1a2: 81 30 cpi r24, 0x01 ; 1 1b1a4: 09 f4 brne .+2 ; 0x1b1a8 1b1a6: 6d c0 rjmp .+218 ; 0x1b282 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); 1b1a8: 86 e6 ldi r24, 0x66 ; 102 1b1aa: 99 e4 ldi r25, 0x49 ; 73 1b1ac: 19 c0 rjmp .+50 ; 0x1b1e0 #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); 1b1ae: 8b e4 ldi r24, 0x4B ; 75 1b1b0: 9c e5 ldi r25, 0x5C ; 92 1b1b2: 53 cf rjmp .-346 ; 0x1b05a #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); 1b1b4: 8b e4 ldi r24, 0x4B ; 75 1b1b6: 9c e5 ldi r25, 0x5C ; 92 1b1b8: ab cf rjmp .-170 ; 0x1b110 #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); 1b1ba: 81 e5 ldi r24, 0x51 ; 81 1b1bc: 9c e5 ldi r25, 0x5C ; 92 1b1be: bb cf rjmp .-138 ; 0x1b136 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); 1b1c0: 88 e3 ldi r24, 0x38 ; 56 1b1c2: 94 e4 ldi r25, 0x44 ; 68 1b1c4: 0e 94 44 72 call 0xe488 ; 0xe488 1b1c8: ec 01 movw r28, r24 1b1ca: 81 e4 ldi r24, 0x41 ; 65 1b1cc: 94 e4 ldi r25, 0x44 ; 68 1b1ce: 0e 94 44 72 call 0xe488 ; 0xe488 1b1d2: 22 e0 ldi r18, 0x02 ; 2 1b1d4: 43 eb ldi r20, 0xB3 ; 179 1b1d6: 50 ed ldi r21, 0xD0 ; 208 1b1d8: be 01 movw r22, r28 1b1da: db cf rjmp .-74 ; 0x1b192 #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; 1b1dc: 81 e3 ldi r24, 0x31 ; 49 1b1de: 94 e4 ldi r25, 0x44 ; 68 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); 1b1e0: 0e 94 44 72 call 0xe488 ; 0xe488 1b1e4: ec 01 movw r28, r24 1b1e6: 8a e2 ldi r24, 0x2A ; 42 1b1e8: 94 e4 ldi r25, 0x44 ; 68 1b1ea: 0e 94 44 72 call 0xe488 ; 0xe488 1b1ee: 22 e0 ldi r18, 0x02 ; 2 1b1f0: 41 ef ldi r20, 0xF1 ; 241 1b1f2: 50 ed ldi r21, 0xD0 ; 208 1b1f4: be 01 movw r22, r28 1b1f6: 0f 94 19 d3 call 0x3a632 ; 0x3a632 } } #endif //SDCARD_SORT_ALPHA SETTINGS_SOUND; 1b1fa: 80 91 dd 04 lds r24, 0x04DD ; 0x8004dd 1b1fe: 82 30 cpi r24, 0x02 ; 2 1b200: 09 f4 brne .+2 ; 0x1b204 1b202: 45 c0 rjmp .+138 ; 0x1b28e 1b204: 83 30 cpi r24, 0x03 ; 3 1b206: 09 f4 brne .+2 ; 0x1b20a 1b208: 45 c0 rjmp .+138 ; 0x1b294 1b20a: 81 30 cpi r24, 0x01 ; 1 1b20c: e9 f1 breq .+122 ; 0x1b288 1b20e: 84 e4 ldi r24, 0x44 ; 68 1b210: 97 e4 ldi r25, 0x47 ; 71 1b212: 0e 94 44 72 call 0xe488 ; 0xe488 1b216: ec 01 movw r28, r24 1b218: 8c e3 ldi r24, 0x3C ; 60 1b21a: 97 e4 ldi r25, 0x47 ; 71 1b21c: 0e 94 44 72 call 0xe488 ; 0xe488 1b220: 22 e0 ldi r18, 0x02 ; 2 1b222: 4a ed ldi r20, 0xDA ; 218 1b224: 50 ed ldi r21, 0xD0 ; 208 1b226: be 01 movw r22, r28 1b228: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #ifdef LCD_BL_PIN if (backlightSupport) 1b22c: 80 91 01 04 lds r24, 0x0401 ; 0x800401 1b230: 88 23 and r24, r24 1b232: 41 f0 breq .+16 ; 0x1b244 { MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); 1b234: 86 e1 ldi r24, 0x16 ; 22 1b236: 97 e4 ldi r25, 0x47 ; 71 1b238: 0e 94 44 72 call 0xe488 ; 0xe488 1b23c: 6c eb ldi r22, 0xBC ; 188 1b23e: 70 ee ldi r23, 0xE0 ; 224 1b240: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } #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 1b244: 87 ea ldi r24, 0xA7 ; 167 1b246: 9c e0 ldi r25, 0x0C ; 12 1b248: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b24c: 88 23 and r24, r24 1b24e: 29 f1 breq .+74 ; 0x1b29a 1b250: 85 ef ldi r24, 0xF5 ; 245 1b252: 97 e4 ldi r25, 0x47 ; 71 1b254: 0e 94 44 72 call 0xe488 ; 0xe488 1b258: 22 e0 ldi r18, 0x02 ; 2 1b25a: 4a e3 ldi r20, 0x3A ; 58 1b25c: 50 ed ldi r21, 0xD0 ; 208 1b25e: bc 01 movw r22, r24 1b260: 87 e3 ldi r24, 0x37 ; 55 1b262: 9a e6 ldi r25, 0x6A ; 106 1b264: 0f 94 19 d3 call 0x3a632 ; 0x3a632 if (farm_mode) { MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode); } MENU_END(); 1b268: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } static void lcd_settings_menu() { SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 1b26c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b270: 8f 5f subi r24, 0xFF ; 255 1b272: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1b276: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1b27a: 8f 5f subi r24, 0xFF ; 255 1b27c: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1b280: ae ce rjmp .-676 ; 0x1afde 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; 1b282: 8f e1 ldi r24, 0x1F ; 31 1b284: 94 e4 ldi r25, 0x44 ; 68 1b286: ac cf rjmp .-168 ; 0x1b1e0 default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set); } } #endif //SDCARD_SORT_ALPHA SETTINGS_SOUND; 1b288: 85 e3 ldi r24, 0x35 ; 53 1b28a: 97 e4 ldi r25, 0x47 ; 71 1b28c: c2 cf rjmp .-124 ; 0x1b212 1b28e: 8c e2 ldi r24, 0x2C ; 44 1b290: 97 e4 ldi r25, 0x47 ; 71 1b292: bf cf rjmp .-130 ; 0x1b212 1b294: 83 e2 ldi r24, 0x23 ; 35 1b296: 97 e4 ldi r25, 0x47 ; 71 1b298: bc cf rjmp .-136 ; 0x1b212 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 1b29a: 8b ef ldi r24, 0xFB ; 251 1b29c: 97 e4 ldi r25, 0x47 ; 71 1b29e: da cf rjmp .-76 ; 0x1b254 { MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode); } MENU_END(); } 1b2a0: df 91 pop r29 1b2a2: cf 91 pop r28 1b2a4: 1f 91 pop r17 1b2a6: 08 95 ret 0001b2a8 : } #endif //TMC2130 static void lcd_calibration_menu() { MENU_BEGIN(); 1b2a8: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1b2ac: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1b2b0: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b2b4: 84 30 cpi r24, 0x04 ; 4 1b2b6: 08 f0 brcs .+2 ; 0x1b2ba 1b2b8: 8f c0 rjmp .+286 ; 0x1b3d8 1b2ba: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1b2be: 8b e3 ldi r24, 0x3B ; 59 1b2c0: 98 e4 ldi r25, 0x48 ; 72 1b2c2: 0e 94 44 72 call 0xe488 ; 0xe488 1b2c6: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_FUNCTION_P(_T(MSG_WIZARD), lcd_wizard); 1b2ca: 81 e5 ldi r24, 0x51 ; 81 1b2cc: 95 e4 ldi r25, 0x45 ; 69 1b2ce: 0e 94 44 72 call 0xe488 ; 0xe488 1b2d2: 6e eb ldi r22, 0xBE ; 190 1b2d4: 7a e3 ldi r23, 0x3A ; 58 1b2d6: 0f 94 07 d1 call 0x3a20e ; 0x3a20e if (lcd_commands_type == LcdCommands::Idle) 1b2da: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 1b2de: 81 11 cpse r24, r1 1b2e0: 08 c0 rjmp .+16 ; 0x1b2f2 { MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), lcd_first_layer_calibration_reset); 1b2e2: 80 eb ldi r24, 0xB0 ; 176 1b2e4: 95 e4 ldi r25, 0x45 ; 69 1b2e6: 0e 94 44 72 call 0xe488 ; 0xe488 1b2ea: 65 e6 ldi r22, 0x65 ; 101 1b2ec: 7f ee ldi r23, 0xEF ; 239 1b2ee: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), G28W); 1b2f2: 83 e8 ldi r24, 0x83 ; 131 1b2f4: 9b e5 ldi r25, 0x5B ; 91 1b2f6: 0e 94 44 72 call 0xe488 ; 0xe488 1b2fa: 6a e7 ldi r22, 0x7A ; 122 1b2fc: 7b e6 ldi r23, 0x6B ; 107 1b2fe: 0f 94 80 d0 call 0x3a100 ; 0x3a100 #ifdef TMC2130 MENU_ITEM_FUNCTION_P(_T(MSG_BELTTEST), lcd_belttest_v); 1b302: 85 e4 ldi r24, 0x45 ; 69 1b304: 95 e4 ldi r25, 0x45 ; 69 1b306: 0e 94 44 72 call 0xe488 ; 0xe488 1b30a: 63 e0 ldi r22, 0x03 ; 3 1b30c: 70 ee ldi r23, 0xE0 ; 224 1b30e: 0f 94 07 d1 call 0x3a20e ; 0x3a20e #endif //TMC2130 MENU_ITEM_FUNCTION_P(_T(MSG_SELFTEST), lcd_selftest_v); 1b312: 8a e3 ldi r24, 0x3A ; 58 1b314: 95 e4 ldi r25, 0x45 ; 69 1b316: 0e 94 44 72 call 0xe488 ; 0xe488 1b31a: 68 e8 ldi r22, 0x88 ; 136 1b31c: 78 ef ldi r23, 0xF8 ; 248 1b31e: 0f 94 07 d1 call 0x3a20e ; 0x3a20e // MK2 MENU_ITEM_FUNCTION_P(_T(MSG_CALIBRATE_BED), lcd_mesh_calibration); 1b322: 8a e2 ldi r24, 0x2A ; 42 1b324: 95 e4 ldi r25, 0x45 ; 69 1b326: 0e 94 44 72 call 0xe488 ; 0xe488 1b32a: 64 e8 ldi r22, 0x84 ; 132 1b32c: 7f ec ldi r23, 0xCF ; 207 1b32e: 0f 94 07 d1 call 0x3a20e ; 0x3a20e // "Calibrate Z" with storing the reference values to EEPROM. MENU_ITEM_FUNCTION_P(_T(MSG_HOMEYZ), lcd_mesh_calibration_z); 1b332: 8c e1 ldi r24, 0x1C ; 28 1b334: 95 e4 ldi r25, 0x45 ; 69 1b336: 0e 94 44 72 call 0xe488 ; 0xe488 1b33a: 6b e8 ldi r22, 0x8B ; 139 1b33c: 7f ec ldi r23, 0xCF ; 207 1b33e: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bedleveling); ////MSG_MESH_BED_LEVELING c=18 1b342: 88 e0 ldi r24, 0x08 ; 8 1b344: 95 e4 ldi r25, 0x45 ; 69 1b346: 0e 94 44 72 call 0xe488 ; 0xe488 1b34a: 62 e9 ldi r22, 0x92 ; 146 1b34c: 7f ec ldi r23, 0xCF ; 207 1b34e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_BED_CORRECTION_MENU), lcd_adjust_bed); 1b352: 84 ef ldi r24, 0xF4 ; 244 1b354: 94 e4 ldi r25, 0x44 ; 68 1b356: 0e 94 44 72 call 0xe488 ; 0xe488 1b35a: 6e eb ldi r22, 0xBE ; 190 1b35c: 79 e3 ldi r23, 0x39 ; 57 1b35e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_PID_EXTRUDER), pid_extruder); 1b362: 82 ee ldi r24, 0xE2 ; 226 1b364: 94 e4 ldi r25, 0x44 ; 68 1b366: 0e 94 44 72 call 0xe488 ; 0xe488 1b36a: 66 e1 ldi r22, 0x16 ; 22 1b36c: 7a e3 ldi r23, 0x3A ; 58 1b36e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #ifndef TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_SHOW_END_STOPS), menu_show_end_stops); #endif MENU_ITEM_GCODE_P(_T(MSG_CALIBRATE_BED_RESET), PSTR("M44")); 1b372: 8e ec ldi r24, 0xCE ; 206 1b374: 94 e4 ldi r25, 0x44 ; 68 1b376: 0e 94 44 72 call 0xe488 ; 0xe488 1b37a: 6e e8 ldi r22, 0x8E ; 142 1b37c: 79 e8 ldi r23, 0x89 ; 137 1b37e: 0f 94 80 d0 call 0x3a100 ; 0x3a100 #ifdef PINDA_THERMISTOR if(has_temperature_compensation()) 1b382: 20 e0 ldi r18, 0x00 ; 0 1b384: 30 e0 ldi r19, 0x00 ; 0 1b386: 40 e2 ldi r20, 0x20 ; 32 1b388: 51 e4 ldi r21, 0x41 ; 65 1b38a: 60 91 97 03 lds r22, 0x0397 ; 0x800397 1b38e: 70 91 98 03 lds r23, 0x0398 ; 0x800398 1b392: 80 91 99 03 lds r24, 0x0399 ; 0x800399 1b396: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 1b39a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1b39e: 87 fd sbrc r24, 7 1b3a0: 08 c0 rjmp .+16 ; 0x1b3b2 MENU_ITEM_FUNCTION_P(_T(MSG_PINDA_CALIBRATION), lcd_calibrate_pinda); 1b3a2: 81 ec ldi r24, 0xC1 ; 193 1b3a4: 94 e4 ldi r25, 0x44 ; 68 1b3a6: 0e 94 44 72 call 0xe488 ; 0xe488 1b3aa: 69 e9 ldi r22, 0x99 ; 153 1b3ac: 7f ec ldi r23, 0xCF ; 207 1b3ae: 0f 94 07 d1 call 0x3a20e ; 0x3a20e #endif #ifdef THERMAL_MODEL MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal); 1b3b2: 6d ea ldi r22, 0xAD ; 173 1b3b4: 7e ec ldi r23, 0xCE ; 206 1b3b6: 8d e4 ldi r24, 0x4D ; 77 1b3b8: 9a e6 ldi r25, 0x6A ; 106 1b3ba: 0f 94 07 d1 call 0x3a20e ; 0x3a20e #endif //THERMAL_MODEL MENU_END(); 1b3be: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } #endif //TMC2130 static void lcd_calibration_menu() { MENU_BEGIN(); 1b3c2: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b3c6: 8f 5f subi r24, 0xFF ; 255 1b3c8: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1b3cc: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1b3d0: 8f 5f subi r24, 0xFF ; 255 1b3d2: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1b3d6: 6c cf rjmp .-296 ; 0x1b2b0 #ifdef THERMAL_MODEL MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal); #endif //THERMAL_MODEL MENU_END(); } 1b3d8: 08 95 ret 0001b3da : } #endif // TMC2130 } } static void menuitems_temperature_common() { 1b3da: ef 92 push r14 1b3dc: ff 92 push r15 1b3de: 0f 93 push r16 1b3e0: 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); 1b3e2: 84 eb ldi r24, 0xB4 ; 180 1b3e4: 93 e4 ldi r25, 0x43 ; 67 1b3e6: 0e 94 44 72 call 0xe488 ; 0xe488 1b3ea: 28 ec ldi r18, 0xC8 ; 200 1b3ec: e2 2e mov r14, r18 1b3ee: f1 2c mov r15, r1 1b3f0: 07 e2 ldi r16, 0x27 ; 39 1b3f2: 11 e0 ldi r17, 0x01 ; 1 1b3f4: 30 e0 ldi r19, 0x00 ; 0 1b3f6: 20 e0 ldi r18, 0x00 ; 0 1b3f8: 40 e1 ldi r20, 0x10 ; 16 1b3fa: 65 eb ldi r22, 0xB5 ; 181 1b3fc: 7d e0 ldi r23, 0x0D ; 13 1b3fe: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 #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); 1b402: 89 e9 ldi r24, 0x99 ; 153 1b404: 93 e4 ldi r25, 0x43 ; 67 1b406: 0e 94 44 72 call 0xe488 ; 0xe488 1b40a: 32 e3 ldi r19, 0x32 ; 50 1b40c: e3 2e mov r14, r19 1b40e: f1 2c mov r15, r1 1b410: 08 e7 ldi r16, 0x78 ; 120 1b412: 10 e0 ldi r17, 0x00 ; 0 1b414: 30 e0 ldi r19, 0x00 ; 0 1b416: 20 e0 ldi r18, 0x00 ; 0 1b418: 40 e1 ldi r20, 0x10 ; 16 1b41a: 61 e7 ldi r22, 0x71 ; 113 1b41c: 76 e0 ldi r23, 0x06 ; 6 1b41e: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 #endif MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED); 1b422: 8d e8 ldi r24, 0x8D ; 141 1b424: 93 e4 ldi r25, 0x43 ; 67 1b426: 0e 94 44 72 call 0xe488 ; 0xe488 1b42a: 4f e7 ldi r20, 0x7F ; 127 1b42c: e4 2e mov r14, r20 1b42e: f1 2c mov r15, r1 1b430: 0f ef ldi r16, 0xFF ; 255 1b432: 10 e0 ldi r17, 0x00 ; 0 1b434: 30 e0 ldi r19, 0x00 ; 0 1b436: 20 e0 ldi r18, 0x00 ; 0 1b438: 48 e0 ldi r20, 0x08 ; 8 1b43a: 65 ee ldi r22, 0xE5 ; 229 1b43c: 73 e0 ldi r23, 0x03 ; 3 1b43e: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 } 1b442: 1f 91 pop r17 1b444: 0f 91 pop r16 1b446: ff 90 pop r15 1b448: ef 90 pop r14 1b44a: 08 95 ret 0001b44c : } #endif //LCD_BL_PIN static void lcd_control_temperature_menu() { MENU_BEGIN(); 1b44c: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1b450: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1b454: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b458: 84 30 cpi r24, 0x04 ; 4 1b45a: b8 f4 brcc .+46 ; 0x1b48a 1b45c: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 1b460: 8a ee ldi r24, 0xEA ; 234 1b462: 97 e4 ldi r25, 0x47 ; 71 1b464: 0e 94 44 72 call 0xe488 ; 0xe488 1b468: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa menuitems_temperature_common(); 1b46c: 0e 94 ed d9 call 0x1b3da ; 0x1b3da MENU_END(); 1b470: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } #endif //LCD_BL_PIN static void lcd_control_temperature_menu() { MENU_BEGIN(); 1b474: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b478: 8f 5f subi r24, 0xFF ; 255 1b47a: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1b47e: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1b482: 8f 5f subi r24, 0xFF ; 255 1b484: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1b488: e5 cf rjmp .-54 ; 0x1b454 MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); menuitems_temperature_common(); MENU_END(); } 1b48a: 08 95 ret 0001b48c : #define MENU_ITEM_EDIT_advance_K() do { lcd_advance_K(); } while (0) #endif static void lcd_tune_menu() { 1b48c: ef 92 push r14 1b48e: ff 92 push r15 1b490: 0f 93 push r16 1b492: 1f 93 push r17 1b494: cf 93 push r28 1b496: df 93 push r29 1b498: 80 91 bc 02 lds r24, 0x02BC ; 0x8002bc 1b49c: 90 91 bd 02 lds r25, 0x02BD ; 0x8002bd //! 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) 1b4a0: 20 91 b4 03 lds r18, 0x03B4 ; 0x8003b4 1b4a4: 21 11 cpse r18, r1 1b4a6: 97 c0 rjmp .+302 ; 0x1b5d6 { // Menu was entered. Mark the menu as entered and save the current extrudemultiply value. _md->status = 1; 1b4a8: 21 e0 ldi r18, 0x01 ; 1 1b4aa: 20 93 b4 03 sts 0x03B4, r18 ; 0x8003b4 _md->extrudemultiply = extrudemultiply; 1b4ae: 90 93 b6 03 sts 0x03B6, r25 ; 0x8003b6 1b4b2: 80 93 b5 03 sts 0x03B5, r24 ; 0x8003b5 // 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); 1b4b6: 8f ef ldi r24, 0xFF ; 255 1b4b8: 9f e0 ldi r25, 0x0F ; 15 1b4ba: 0f 94 10 dc call 0x3b820 ; 0x3b820 1b4be: 80 93 a2 03 sts 0x03A2, r24 ; 0x8003a2 MENU_BEGIN(); 1b4c2: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1b4c6: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1b4ca: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b4ce: 84 30 cpi r24, 0x04 ; 4 1b4d0: 08 f0 brcs .+2 ; 0x1b4d4 1b4d2: 99 c0 rjmp .+306 ; 0x1b606 1b4d4: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 1b4d8: 0f 94 0a d0 call 0x3a014 ; 0x3a014 1b4dc: 81 11 cpse r24, r1 1b4de: 0e 94 7b 64 call 0xc8f6 ; 0xc8f6 refresh_saved_feedrate_multiplier_in_ram(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1b4e2: 8b e3 ldi r24, 0x3B ; 59 1b4e4: 98 e4 ldi r25, 0x48 ; 72 1b4e6: 0e 94 44 72 call 0xe488 ; 0xe488 1b4ea: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_EDIT_int3_P(_T(MSG_SPEED), &feedmultiply, 10, 999); 1b4ee: 82 e7 ldi r24, 0x72 ; 114 1b4f0: 97 e4 ldi r25, 0x47 ; 71 1b4f2: 0e 94 44 72 call 0xe488 ; 0xe488 1b4f6: f1 2c mov r15, r1 1b4f8: e1 2c mov r14, r1 1b4fa: 07 ee ldi r16, 0xE7 ; 231 1b4fc: 13 e0 ldi r17, 0x03 ; 3 1b4fe: 2a e0 ldi r18, 0x0A ; 10 1b500: 30 e0 ldi r19, 0x00 ; 0 1b502: 40 e1 ldi r20, 0x10 ; 16 1b504: 69 e3 ldi r22, 0x39 ; 57 1b506: 72 e0 ldi r23, 0x02 ; 2 1b508: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 menuitems_temperature_common(); 1b50c: 0e 94 ed d9 call 0x1b3da ; 0x1b3da MENU_ITEM_EDIT_int3_P(_T(MSG_FLOW), &extrudemultiply, 10, 999); 1b510: 8b e6 ldi r24, 0x6B ; 107 1b512: 97 e4 ldi r25, 0x47 ; 71 1b514: 0e 94 44 72 call 0xe488 ; 0xe488 1b518: 2a e0 ldi r18, 0x0A ; 10 1b51a: 30 e0 ldi r19, 0x00 ; 0 1b51c: 40 e1 ldi r20, 0x10 ; 16 1b51e: 6c eb ldi r22, 0xBC ; 188 1b520: 72 e0 ldi r23, 0x02 ; 2 1b522: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 #ifdef LA_LIVE_K MENU_ITEM_EDIT_advance_K(); #endif #ifdef FILAMENTCHANGEENABLE if (!farm_mode) MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change); 1b526: 89 e5 ldi r24, 0x59 ; 89 1b528: 97 e4 ldi r25, 0x47 ; 71 1b52a: 0e 94 44 72 call 0xe488 ; 0xe488 1b52e: 6e e2 ldi r22, 0x2E ; 46 1b530: 75 ef ldi r23, 0xF5 ; 245 1b532: 0f 94 07 d1 call 0x3a20e ; 0x3a20e #endif if (printingIsPaused()) {// Don't allow rehome if actively printing. Maaaaybe it could work to insert on the fly, seems too risky. 1b536: 0e 94 1d 67 call 0xce3a ; 0xce3a 1b53a: 88 23 and r24, r24 1b53c: 41 f0 breq .+16 ; 0x1b54e MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME),PSTR("G28 XY")); 1b53e: 83 e8 ldi r24, 0x83 ; 131 1b540: 9b e5 ldi r25, 0x5B ; 91 1b542: 0e 94 44 72 call 0xe488 ; 0xe488 1b546: 62 e9 ldi r22, 0x92 ; 146 1b548: 79 e8 ldi r23, 0x89 ; 137 1b54a: 0f 94 80 d0 call 0x3a100 ; 0x3a100 } #ifdef FILAMENT_SENSOR MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu); 1b54e: 8b e4 ldi r24, 0x4B ; 75 1b550: 97 e4 ldi r25, 0x47 ; 71 1b552: 0e 94 44 72 call 0xe488 ; 0xe488 1b556: 6f e7 ldi r22, 0x7F ; 127 1b558: 73 ed ldi r23, 0xD3 ; 211 1b55a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //FILAMENT_SENSOR if (MMU2::mmu2.Enabled()) 1b55e: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1b562: 81 30 cpi r24, 0x01 ; 1 1b564: 11 f4 brne .+4 ; 0x1b56a { menuitems_MMU_settings_common(); 1b566: 0e 94 67 d2 call 0x1a4ce ; 0x1a4ce } SETTINGS_FANS_CHECK(); 1b56a: 0e 94 e9 d1 call 0x1a3d2 ; 0x1a3d2 SETTINGS_SILENT_MODE(); 1b56e: 0e 94 03 d2 call 0x1a406 ; 0x1a406 SETTINGS_SOUND; 1b572: 80 91 dd 04 lds r24, 0x04DD ; 0x8004dd 1b576: 82 30 cpi r24, 0x02 ; 2 1b578: 09 f4 brne .+2 ; 0x1b57c 1b57a: 3f c0 rjmp .+126 ; 0x1b5fa 1b57c: 83 30 cpi r24, 0x03 ; 3 1b57e: 09 f4 brne .+2 ; 0x1b582 1b580: 3f c0 rjmp .+126 ; 0x1b600 1b582: 81 30 cpi r24, 0x01 ; 1 1b584: b9 f1 breq .+110 ; 0x1b5f4 1b586: 84 e4 ldi r24, 0x44 ; 68 1b588: 97 e4 ldi r25, 0x47 ; 71 1b58a: 0e 94 44 72 call 0xe488 ; 0xe488 1b58e: ec 01 movw r28, r24 1b590: 8c e3 ldi r24, 0x3C ; 60 1b592: 97 e4 ldi r25, 0x47 ; 71 1b594: 0e 94 44 72 call 0xe488 ; 0xe488 1b598: 22 e0 ldi r18, 0x02 ; 2 1b59a: 4a ed ldi r20, 0xDA ; 218 1b59c: 50 ed ldi r21, 0xD0 ; 208 1b59e: be 01 movw r22, r28 1b5a0: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #ifdef LCD_BL_PIN if (backlightSupport) 1b5a4: 80 91 01 04 lds r24, 0x0401 ; 0x800401 1b5a8: 88 23 and r24, r24 1b5aa: 41 f0 breq .+16 ; 0x1b5bc { MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); 1b5ac: 86 e1 ldi r24, 0x16 ; 22 1b5ae: 97 e4 ldi r25, 0x47 ; 71 1b5b0: 0e 94 44 72 call 0xe488 ; 0xe488 1b5b4: 6c eb ldi r22, 0xBC ; 188 1b5b6: 70 ee ldi r23, 0xE0 ; 224 1b5b8: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } #endif //LCD_BL_PIN MENU_END(); 1b5bc: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc calculate_extruder_multipliers(); } SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT); MENU_BEGIN(); 1b5c0: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1b5c4: 8f 5f subi r24, 0xFF ; 255 1b5c6: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1b5ca: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1b5ce: 8f 5f subi r24, 0xFF ; 255 1b5d0: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1b5d4: 7a cf rjmp .-268 ; 0x1b4ca { // 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) 1b5d6: 20 91 b5 03 lds r18, 0x03B5 ; 0x8003b5 1b5da: 30 91 b6 03 lds r19, 0x03B6 ; 0x8003b6 1b5de: 28 17 cp r18, r24 1b5e0: 39 07 cpc r19, r25 1b5e2: 09 f4 brne .+2 ; 0x1b5e6 1b5e4: 68 cf rjmp .-304 ; 0x1b4b6 { // extrudemultiply has been changed from the child menu. Apply the new value. _md->extrudemultiply = extrudemultiply; 1b5e6: 90 93 b6 03 sts 0x03B6, r25 ; 0x8003b6 1b5ea: 80 93 b5 03 sts 0x03B5, r24 ; 0x8003b5 calculate_extruder_multipliers(); 1b5ee: 0e 94 51 65 call 0xcaa2 ; 0xcaa2 1b5f2: 61 cf rjmp .-318 ; 0x1b4b6 menuitems_MMU_settings_common(); } SETTINGS_FANS_CHECK(); SETTINGS_SILENT_MODE(); SETTINGS_SOUND; 1b5f4: 85 e3 ldi r24, 0x35 ; 53 1b5f6: 97 e4 ldi r25, 0x47 ; 71 1b5f8: c8 cf rjmp .-112 ; 0x1b58a 1b5fa: 8c e2 ldi r24, 0x2C ; 44 1b5fc: 97 e4 ldi r25, 0x47 ; 71 1b5fe: c5 cf rjmp .-118 ; 0x1b58a 1b600: 83 e2 ldi r24, 0x23 ; 35 1b602: 97 e4 ldi r25, 0x47 ; 71 1b604: c2 cf rjmp .-124 ; 0x1b58a { MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu); } #endif //LCD_BL_PIN MENU_END(); } 1b606: df 91 pop r29 1b608: cf 91 pop r28 1b60a: 1f 91 pop r17 1b60c: 0f 91 pop r16 1b60e: ff 90 pop r15 1b610: ef 90 pop r14 1b612: 08 95 ret 0001b614 : } } #if (LANG_MODE != 0) void lcd_language() { 1b614: cf 93 push r28 1b616: df 93 push r29 lcd_update_enable(true); 1b618: 81 e0 ldi r24, 0x01 ; 1 1b61a: 0e 94 bd 6e call 0xdd7a ; 0xdd7a menu_goto(lcd_language_menu, 0, true, true); 1b61e: 21 e0 ldi r18, 0x01 ; 1 1b620: 41 e0 ldi r20, 0x01 ; 1 1b622: 70 e0 ldi r23, 0x00 ; 0 1b624: 60 e0 ldi r22, 0x00 ; 0 1b626: 8a e8 ldi r24, 0x8A ; 138 1b628: 93 ee ldi r25, 0xE3 ; 227 1b62a: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 1b62e: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout while ((menu_menu != lcd_status_screen) && (!lang_is_selected())) 1b632: c0 91 12 04 lds r28, 0x0412 ; 0x800412 1b636: d0 91 13 04 lds r29, 0x0413 ; 0x800413 1b63a: 0e 94 b5 70 call 0xe16a ; 0xe16a 1b63e: c8 50 subi r28, 0x08 ; 8 1b640: d9 43 sbci r29, 0x39 ; 57 1b642: 39 f0 breq .+14 ; 0x1b652 1b644: 81 11 cpse r24, r1 1b646: 07 c0 rjmp .+14 ; 0x1b656 { delay_keep_alive(50); 1b648: 82 e3 ldi r24, 0x32 ; 50 1b64a: 90 e0 ldi r25, 0x00 ; 0 1b64c: 0e 94 84 8c call 0x11908 ; 0x11908 1b650: f0 cf rjmp .-32 ; 0x1b632 } if (lang_is_selected()) 1b652: 88 23 and r24, r24 1b654: 21 f0 breq .+8 ; 0x1b65e lcd_return_to_status(); else lang_select(LANG_ID_PRI); } 1b656: df 91 pop r29 1b658: 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(); 1b65a: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 else lang_select(LANG_ID_PRI); 1b65e: 80 e0 ldi r24, 0x00 ; 0 } 1b660: df 91 pop r29 1b662: cf 91 pop r28 delay_keep_alive(50); } if (lang_is_selected()) lcd_return_to_status(); else lang_select(LANG_ID_PRI); 1b664: 0c 94 cc 71 jmp 0xe398 ; 0xe398 0001b668 : } #endif //FANCHECK static uint8_t lcd_selftest_screen(TestScreen screen, uint8_t _progress, uint8_t _progress_scale, bool _clear, uint16_t _delay) { 1b668: bf 92 push r11 1b66a: cf 92 push r12 1b66c: df 92 push r13 1b66e: ef 92 push r14 1b670: ff 92 push r15 1b672: 0f 93 push r16 1b674: 1f 93 push r17 1b676: cf 93 push r28 1b678: df 93 push r29 1b67a: c8 2f mov r28, r24 1b67c: f6 2e mov r15, r22 1b67e: e4 2e mov r14, r20 1b680: b2 2e mov r11, r18 1b682: 68 01 movw r12, r16 lcd_update_enable(false); 1b684: 80 e0 ldi r24, 0x00 ; 0 1b686: 0e 94 bd 6e call 0xdd7a ; 0xdd7a const char _indicator = (_progress >= _progress_scale) ? '-' : '|'; 1b68a: dc e7 ldi r29, 0x7C ; 124 1b68c: fe 14 cp r15, r14 1b68e: 08 f0 brcs .+2 ; 0x1b692 1b690: dd e2 ldi r29, 0x2D ; 45 if (_clear) 1b692: bb 20 and r11, r11 1b694: 09 f1 breq .+66 ; 0x1b6d8 lcd_clear(); 1b696: 0e 94 ab 6e call 0xdd56 ; 0xdd56 else lcd_home(); if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 1b69a: c1 11 cpse r28, r1 1b69c: 20 c0 rjmp .+64 ; 0x1b6de if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 1b69e: 84 e1 ldi r24, 0x14 ; 20 1b6a0: 96 e5 ldi r25, 0x56 ; 86 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)); 1b6a2: 0e 94 44 72 call 0xe488 ; 0xe488 1b6a6: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 if (screen == TestScreen::Hotend || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); 1b6aa: 88 ef ldi r24, 0xF8 ; 248 1b6ac: 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 1b6ae: 82 30 cpi r24, 0x02 ; 2 1b6b0: 78 f5 brcc .+94 ; 0x1b710 || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND)); 1b6b2: 85 ed ldi r24, 0xD5 ; 213 1b6b4: 98 e4 ldi r25, 0x48 ; 72 1b6b6: 0e 94 44 72 call 0xe488 ; 0xe488 1b6ba: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 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)); 1b6be: 84 eb ldi r24, 0xB4 ; 180 1b6c0: 98 e4 ldi r25, 0x48 ; 72 1b6c2: cc 30 cpi r28, 0x0C ; 12 1b6c4: 49 f1 breq .+82 ; 0x1b718 if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED)); 1b6c6: 8f e1 ldi r24, 0x1F ; 31 1b6c8: 96 e5 ldi r25, 0x56 ; 86 1b6ca: cd 30 cpi r28, 0x0D ; 13 1b6cc: 29 f1 breq .+74 ; 0x1b718 if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME)); 1b6ce: ce 30 cpi r28, 0x0E ; 14 1b6d0: 39 f5 brne .+78 ; 0x1b720 1b6d2: 81 ea ldi r24, 0xA1 ; 161 1b6d4: 98 e4 ldi r25, 0x48 ; 72 1b6d6: 20 c0 rjmp .+64 ; 0x1b718 lcd_update_enable(false); const char _indicator = (_progress >= _progress_scale) ? '-' : '|'; if (_clear) lcd_clear(); else lcd_home(); 1b6d8: 0e 94 a4 6e call 0xdd48 ; 0xdd48 1b6dc: de cf rjmp .-68 ; 0x1b69a if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 1b6de: c1 30 cpi r28, 0x01 ; 1 1b6e0: f1 f2 breq .-68 ; 0x1b69e if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN)); 1b6e2: c2 30 cpi r28, 0x02 ; 2 1b6e4: e1 f2 breq .-72 ; 0x1b69e if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS)); 1b6e6: 8c e2 ldi r24, 0x2C ; 44 1b6e8: 99 e4 ldi r25, 0x49 ; 73 1b6ea: c3 30 cpi r28, 0x03 ; 3 1b6ec: d1 f2 breq .-76 ; 0x1b6a2 if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X)); 1b6ee: 8a e1 ldi r24, 0x1A ; 26 1b6f0: 99 e4 ldi r25, 0x49 ; 73 1b6f2: c4 30 cpi r28, 0x04 ; 4 1b6f4: b1 f2 breq .-84 ; 0x1b6a2 if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y)); 1b6f6: 88 e0 ldi r24, 0x08 ; 8 1b6f8: 99 e4 ldi r25, 0x49 ; 73 1b6fa: c5 30 cpi r28, 0x05 ; 5 1b6fc: 91 f2 breq .-92 ; 0x1b6a2 if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z)); 1b6fe: 86 ef ldi r24, 0xF6 ; 246 1b700: 98 e4 ldi r25, 0x48 ; 72 1b702: c6 30 cpi r28, 0x06 ; 6 1b704: 71 f2 breq .-100 ; 0x1b6a2 if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED)); 1b706: c7 30 cpi r28, 0x07 ; 7 1b708: 81 f6 brne .-96 ; 0x1b6aa 1b70a: 87 ee ldi r24, 0xE7 ; 231 1b70c: 98 e4 ldi r25, 0x48 ; 72 1b70e: c9 cf rjmp .-110 ; 0x1b6a2 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)); 1b710: ca 30 cpi r28, 0x0A ; 10 1b712: 99 f5 brne .+102 ; 0x1b77a if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR)); 1b714: 82 ec ldi r24, 0xC2 ; 194 1b716: 98 e4 ldi r25, 0x48 ; 72 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)); 1b718: 0e 94 44 72 call 0xe488 ; 0xe488 1b71c: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_puts_at_P(0, 1, STR_SEPARATOR); 1b720: 49 ee ldi r20, 0xE9 ; 233 1b722: 59 e8 ldi r21, 0x89 ; 137 1b724: 61 e0 ldi r22, 0x01 ; 1 1b726: 80 e0 ldi r24, 0x00 ; 0 1b728: 0e 94 8c 6e call 0xdd18 ; 0xdd18 if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk)) 1b72c: c3 30 cpi r28, 0x03 ; 3 1b72e: 70 f5 brcc .+92 ; 0x1b78c { //SERIAL_ECHOLNPGM("Fan test"); lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED)); 1b730: 83 e9 ldi r24, 0x93 ; 147 1b732: 98 e4 ldi r25, 0x48 ; 72 1b734: 0e 94 44 72 call 0xe488 ; 0xe488 1b738: ac 01 movw r20, r24 1b73a: 62 e0 ldi r22, 0x02 ; 2 1b73c: 80 e0 ldi r24, 0x00 ; 0 1b73e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(18, 2); 1b742: 62 e0 ldi r22, 0x02 ; 2 1b744: 82 e1 ldi r24, 0x12 ; 18 1b746: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 (screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 1b74a: c1 11 cpse r28, r1 1b74c: 1a c0 rjmp .+52 ; 0x1b782 1b74e: 8d 2f mov r24, r29 1b750: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED)); 1b754: 86 e8 ldi r24, 0x86 ; 134 1b756: 98 e4 ldi r25, 0x48 ; 72 1b758: 0e 94 44 72 call 0xe488 ; 0xe488 1b75c: ac 01 movw r20, r24 1b75e: 63 e0 ldi r22, 0x03 ; 3 1b760: 80 e0 ldi r24, 0x00 ; 0 1b762: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(18, 3); 1b766: 63 e0 ldi r22, 0x03 ; 3 1b768: 82 e1 ldi r24, 0x12 ; 18 1b76a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 (screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 1b76e: c2 30 cpi r28, 0x02 ; 2 1b770: 19 f1 breq .+70 ; 0x1b7b8 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); 1b772: 8d 2f mov r24, r29 1b774: 0e 94 67 6e call 0xdcce ; 0xdcce 1b778: 23 c0 rjmp .+70 ; 0x1b7c0 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)); 1b77a: cb 30 cpi r28, 0x0B ; 11 1b77c: 09 f0 breq .+2 ; 0x1b780 1b77e: 9f cf rjmp .-194 ; 0x1b6be 1b780: c9 cf rjmp .-110 ; 0x1b714 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); 1b782: 88 e1 ldi r24, 0x18 ; 24 1b784: 9b e6 ldi r25, 0x6B ; 107 1b786: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 1b78a: e4 cf rjmp .-56 ; 0x1b754 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) 1b78c: 86 ef ldi r24, 0xF6 ; 246 1b78e: 8c 0f add r24, r28 1b790: 82 30 cpi r24, 0x02 ; 2 1b792: a8 f5 brcc .+106 ; 0x1b7fe { lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); 1b794: 81 e3 ldi r24, 0x31 ; 49 1b796: 96 e5 ldi r25, 0x56 ; 86 1b798: 0e 94 44 72 call 0xe488 ; 0xe488 1b79c: ac 01 movw r20, r24 1b79e: 62 e0 ldi r22, 0x02 ; 2 1b7a0: 80 e0 ldi r24, 0x00 ; 0 1b7a2: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc(':'); 1b7a6: 8a e3 ldi r24, 0x3A ; 58 1b7a8: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_set_cursor(18, 2); 1b7ac: 62 e0 ldi r22, 0x02 ; 2 1b7ae: 82 e1 ldi r24, 0x12 ; 18 1b7b0: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 (screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS); 1b7b4: ca 30 cpi r28, 0x0A ; 10 1b7b6: e9 f2 breq .-70 ; 0x1b772 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); 1b7b8: 88 e1 ldi r24, 0x18 ; 24 1b7ba: 9b e6 ldi r25, 0x6B ; 107 1b7bc: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 _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); 1b7c0: c1 14 cp r12, r1 1b7c2: d1 04 cpc r13, r1 1b7c4: 19 f0 breq .+6 ; 0x1b7cc 1b7c6: c6 01 movw r24, r12 1b7c8: 0e 94 84 8c call 0x11908 ; 0x11908 _progress++; 1b7cc: 81 e0 ldi r24, 0x01 ; 1 1b7ce: 8f 0d add r24, r15 return (_progress >= _progress_scale * 2) ? 0 : _progress; 1b7d0: 48 2f mov r20, r24 1b7d2: 50 e0 ldi r21, 0x00 ; 0 1b7d4: 92 e0 ldi r25, 0x02 ; 2 1b7d6: 24 e0 ldi r18, 0x04 ; 4 1b7d8: 30 e0 ldi r19, 0x00 ; 0 1b7da: e9 16 cp r14, r25 1b7dc: 11 f0 breq .+4 ; 0x1b7e2 1b7de: 26 e0 ldi r18, 0x06 ; 6 1b7e0: 30 e0 ldi r19, 0x00 ; 0 1b7e2: 42 17 cp r20, r18 1b7e4: 53 07 cpc r21, r19 1b7e6: 0c f0 brlt .+2 ; 0x1b7ea 1b7e8: 80 e0 ldi r24, 0x00 ; 0 } 1b7ea: df 91 pop r29 1b7ec: cf 91 pop r28 1b7ee: 1f 91 pop r17 1b7f0: 0f 91 pop r16 1b7f2: ff 90 pop r15 1b7f4: ef 90 pop r14 1b7f6: df 90 pop r13 1b7f8: cf 90 pop r12 1b7fa: bf 90 pop r11 1b7fc: 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) 1b7fe: ca 30 cpi r28, 0x0A ; 10 1b800: f8 f6 brcc .-66 ; 0x1b7c0 { //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); 1b802: 41 e0 ldi r20, 0x01 ; 1 1b804: c4 30 cpi r28, 0x04 ; 4 1b806: 21 f0 breq .+8 ; 0x1b810 1b808: 42 e0 ldi r20, 0x02 ; 2 1b80a: c3 30 cpi r28, 0x03 ; 3 1b80c: 09 f4 brne .+2 ; 0x1b810 1b80e: 40 e0 ldi r20, 0x00 ; 0 1b810: 0d 2f mov r16, r29 1b812: 27 ee ldi r18, 0xE7 ; 231 1b814: 39 e8 ldi r19, 0x89 ; 137 1b816: 62 e0 ldi r22, 0x02 ; 2 1b818: 82 e0 ldi r24, 0x02 ; 2 1b81a: 0e 94 78 d1 call 0x1a2f0 ; 0x1a2f0 _step_block = TestScreen::AxisY; lcd_selftest_screen_step(2, 8, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Y"), _indicator); 1b81e: 41 e0 ldi r20, 0x01 ; 1 1b820: c5 30 cpi r28, 0x05 ; 5 1b822: 21 f0 breq .+8 ; 0x1b82c 1b824: 42 e0 ldi r20, 0x02 ; 2 1b826: c5 30 cpi r28, 0x05 ; 5 1b828: 08 f4 brcc .+2 ; 0x1b82c 1b82a: 40 e0 ldi r20, 0x00 ; 0 1b82c: 0d 2f mov r16, r29 1b82e: 25 ee ldi r18, 0xE5 ; 229 1b830: 39 e8 ldi r19, 0x89 ; 137 1b832: 68 e0 ldi r22, 0x08 ; 8 1b834: 82 e0 ldi r24, 0x02 ; 2 1b836: 0e 94 78 d1 call 0x1a2f0 ; 0x1a2f0 _step_block = TestScreen::AxisZ; lcd_selftest_screen_step(2, 14, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Z"), _indicator); 1b83a: 41 e0 ldi r20, 0x01 ; 1 1b83c: c6 30 cpi r28, 0x06 ; 6 1b83e: 21 f0 breq .+8 ; 0x1b848 1b840: 42 e0 ldi r20, 0x02 ; 2 1b842: c6 30 cpi r28, 0x06 ; 6 1b844: 08 f4 brcc .+2 ; 0x1b848 1b846: 40 e0 ldi r20, 0x00 ; 0 1b848: 0d 2f mov r16, r29 1b84a: 23 ee ldi r18, 0xE3 ; 227 1b84c: 39 e8 ldi r19, 0x89 ; 137 1b84e: 6e e0 ldi r22, 0x0E ; 14 1b850: 82 e0 ldi r24, 0x02 ; 2 1b852: 0e 94 78 d1 call 0x1a2f0 ; 0x1a2f0 _step_block = TestScreen::Bed; lcd_selftest_screen_step(3, 0, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Bed"), _indicator); 1b856: 41 e0 ldi r20, 0x01 ; 1 1b858: c7 30 cpi r28, 0x07 ; 7 1b85a: 21 f0 breq .+8 ; 0x1b864 1b85c: 42 e0 ldi r20, 0x02 ; 2 1b85e: c7 30 cpi r28, 0x07 ; 7 1b860: 08 f4 brcc .+2 ; 0x1b864 1b862: 40 e0 ldi r20, 0x00 ; 0 1b864: 0d 2f mov r16, r29 1b866: 2f ed ldi r18, 0xDF ; 223 1b868: 39 e8 ldi r19, 0x89 ; 137 1b86a: 60 e0 ldi r22, 0x00 ; 0 1b86c: 83 e0 ldi r24, 0x03 ; 3 1b86e: 0e 94 78 d1 call 0x1a2f0 ; 0x1a2f0 _step_block = TestScreen::Hotend; lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Hotend"), _indicator); 1b872: 41 e0 ldi r20, 0x01 ; 1 1b874: c8 30 cpi r28, 0x08 ; 8 1b876: 21 f0 breq .+8 ; 0x1b880 1b878: 42 e0 ldi r20, 0x02 ; 2 1b87a: c8 30 cpi r28, 0x08 ; 8 1b87c: 08 f4 brcc .+2 ; 0x1b880 1b87e: 40 e0 ldi r20, 0x00 ; 0 1b880: 0d 2f mov r16, r29 1b882: 28 ed ldi r18, 0xD8 ; 216 1b884: 39 e8 ldi r19, 0x89 ; 137 1b886: 69 e0 ldi r22, 0x09 ; 9 1b888: 83 e0 ldi r24, 0x03 ; 3 1b88a: 0e 94 78 d1 call 0x1a2f0 ; 0x1a2f0 1b88e: 98 cf rjmp .-208 ; 0x1b7c0 0001b890 : { printf_P(MSG_HOST_ACTION_NOTIFICATION, message); } static void lcd_rename_sheet_menu() { 1b890: cf 93 push r28 1b892: 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) 1b894: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 1b898: 81 11 cpse r24, r1 1b89a: 18 c0 rjmp .+48 ; 0x1b8cc { eeprom_read_block(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); 1b89c: 60 91 e0 03 lds r22, 0x03E0 ; 0x8003e0 1b8a0: 8b e0 ldi r24, 0x0B ; 11 1b8a2: 68 9f mul r22, r24 1b8a4: b0 01 movw r22, r0 1b8a6: 11 24 eor r1, r1 1b8a8: 67 5b subi r22, 0xB7 ; 183 1b8aa: 72 4f sbci r23, 0xF2 ; 242 1b8ac: 47 e0 ldi r20, 0x07 ; 7 1b8ae: 50 e0 ldi r21, 0x00 ; 0 1b8b0: 89 ea ldi r24, 0xA9 ; 169 1b8b2: 93 e0 ldi r25, 0x03 ; 3 1b8b4: 0f 94 00 dc call 0x3b800 ; 0x3b800 lcd_encoder = menuData->name[0]; 1b8b8: 80 91 a9 03 lds r24, 0x03A9 ; 0x8003a9 1b8bc: 90 e0 ldi r25, 0x00 ; 0 1b8be: 90 93 70 06 sts 0x0670, r25 ; 0x800670 1b8c2: 80 93 6f 06 sts 0x066F, r24 ; 0x80066f menuData->initialized = true; 1b8c6: 81 e0 ldi r24, 0x01 ; 1 1b8c8: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 } if (lcd_encoder < 0x20) lcd_encoder = 0x20; 1b8cc: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 1b8d0: 90 91 70 06 lds r25, 0x0670 ; 0x800670 1b8d4: 80 97 sbiw r24, 0x20 ; 32 1b8d6: 34 f4 brge .+12 ; 0x1b8e4 1b8d8: 80 e2 ldi r24, 0x20 ; 32 1b8da: 90 e0 ldi r25, 0x00 ; 0 1b8dc: 90 93 70 06 sts 0x0670, r25 ; 0x800670 1b8e0: 80 93 6f 06 sts 0x066F, r24 ; 0x80066f if (lcd_encoder > 0xFF) lcd_encoder = 0xFF; 1b8e4: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 1b8e8: 90 91 70 06 lds r25, 0x0670 ; 0x800670 1b8ec: 8f 3f cpi r24, 0xFF ; 255 1b8ee: 91 05 cpc r25, r1 1b8f0: 39 f0 breq .+14 ; 0x1b900 1b8f2: 34 f0 brlt .+12 ; 0x1b900 1b8f4: 8f ef ldi r24, 0xFF ; 255 1b8f6: 90 e0 ldi r25, 0x00 ; 0 1b8f8: 90 93 70 06 sts 0x0670, r25 ; 0x800670 1b8fc: 80 93 6f 06 sts 0x066F, r24 ; 0x80066f menuData->name[menuData->selected] = lcd_encoder; 1b900: e0 91 a8 03 lds r30, 0x03A8 ; 0x8003a8 1b904: f0 e0 ldi r31, 0x00 ; 0 1b906: e9 55 subi r30, 0x59 ; 89 1b908: fc 4f sbci r31, 0xFC ; 252 1b90a: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 1b90e: 82 83 std Z+2, r24 ; 0x02 lcd_home(); 1b910: 0e 94 a4 6e call 0xdd48 ; 0xdd48 1b914: c9 ea ldi r28, 0xA9 ; 169 1b916: d3 e0 ldi r29, 0x03 ; 3 for (uint_least8_t i = 0; i < sizeof(Sheet::name); ++i) { lcd_putc(menuData->name[i]); 1b918: 89 91 ld r24, Y+ 1b91a: 0e 94 67 6e call 0xdcce ; 0xdcce 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) 1b91e: 83 e0 ldi r24, 0x03 ; 3 1b920: c0 3b cpi r28, 0xB0 ; 176 1b922: d8 07 cpc r29, r24 1b924: c9 f7 brne .-14 ; 0x1b918 { lcd_putc(menuData->name[i]); } lcd_putc_at(menuData->selected, 1, '^'); 1b926: 4e e5 ldi r20, 0x5E ; 94 1b928: 61 e0 ldi r22, 0x01 ; 1 1b92a: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 1b92e: 0e 94 98 6e call 0xdd30 ; 0xdd30 if (menuData->selected > 0) 1b932: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 1b936: 88 23 and r24, r24 1b938: 29 f0 breq .+10 ; 0x1b944 { lcd_putc_at(menuData->selected-1, 1, ' '); 1b93a: 40 e2 ldi r20, 0x20 ; 32 1b93c: 61 e0 ldi r22, 0x01 ; 1 1b93e: 81 50 subi r24, 0x01 ; 1 1b940: 0e 94 98 6e call 0xdd30 ; 0xdd30 } if (lcd_clicked()) 1b944: 0e 94 95 70 call 0xe12a ; 0xe12a 1b948: 88 23 and r24, r24 1b94a: 99 f0 breq .+38 ; 0x1b972 { if ((menuData->selected + 1u) < sizeof(Sheet::name)) 1b94c: e0 91 a8 03 lds r30, 0x03A8 ; 0x8003a8 1b950: 8e 2f mov r24, r30 1b952: 90 e0 ldi r25, 0x00 ; 0 1b954: 01 96 adiw r24, 0x01 ; 1 1b956: 07 97 sbiw r24, 0x07 ; 7 1b958: 78 f4 brcc .+30 ; 0x1b978 { lcd_encoder = menuData->name[++(menuData->selected)]; 1b95a: ef 5f subi r30, 0xFF ; 255 1b95c: e0 93 a8 03 sts 0x03A8, r30 ; 0x8003a8 1b960: f0 e0 ldi r31, 0x00 ; 0 1b962: e9 55 subi r30, 0x59 ; 89 1b964: fc 4f sbci r31, 0xFC ; 252 1b966: 82 81 ldd r24, Z+2 ; 0x02 1b968: 90 e0 ldi r25, 0x00 ; 0 1b96a: 90 93 70 06 sts 0x0670, r25 ; 0x800670 1b96e: 80 93 6f 06 sts 0x066F, r24 ; 0x80066f EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); } } } 1b972: df 91 pop r29 1b974: cf 91 pop r28 1b976: 08 95 ret { lcd_encoder = menuData->name[++(menuData->selected)]; } else { eeprom_update_block_notify(menuData->name, 1b978: 60 91 e0 03 lds r22, 0x03E0 ; 0x8003e0 1b97c: 8b e0 ldi r24, 0x0B ; 11 1b97e: 68 9f mul r22, r24 1b980: b0 01 movw r22, r0 1b982: 11 24 eor r1, r1 1b984: 67 5b subi r22, 0xB7 ; 183 1b986: 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); 1b988: 47 e0 ldi r20, 0x07 ; 7 1b98a: 50 e0 ldi r21, 0x00 ; 0 1b98c: 89 ea ldi r24, 0xA9 ; 169 1b98e: 93 e0 ldi r25, 0x03 ; 3 1b990: 0f 94 24 dc call 0x3b848 ; 0x3b848 EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); } } } 1b994: df 91 pop r29 1b996: cf 91 pop r28 else { eeprom_update_block_notify(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name)); menu_back(); 1b998: 0d 94 52 d4 jmp 0x3a8a4 ; 0x3a8a4 0001b99c : manage_inactivity(true); return _result; } static bool lcd_selfcheck_check_heater(bool _isbed) { 1b99c: 8f 92 push r8 1b99e: 9f 92 push r9 1b9a0: af 92 push r10 1b9a2: bf 92 push r11 1b9a4: cf 92 push r12 1b9a6: df 92 push r13 1b9a8: ef 92 push r14 1b9aa: ff 92 push r15 1b9ac: 0f 93 push r16 1b9ae: 1f 93 push r17 1b9b0: cf 93 push r28 1b9b2: df 93 push r29 1b9b4: f8 2e mov r15, r24 1b9b6: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1b9ba: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1b9be: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1b9c2: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1b9c6: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1b9ca: 4b 01 movw r8, r22 1b9cc: 6b 01 movw r12, r22 1b9ce: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 1b9d2: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 1b9d6: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 1b9da: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 1b9de: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1b9e2: eb 01 movw r28, r22 uint8_t _progress = 0; int _checked_snapshot = (_isbed) ? degBed() : degHotend(0); 1b9e4: ff 20 and r15, r15 1b9e6: 09 f4 brne .+2 ; 0x1b9ea 1b9e8: a6 c0 rjmp .+332 ; 0x1bb36 1b9ea: 6b 01 movw r12, r22 int _opposite_snapshot = (_isbed) ? degHotend(0) : degBed(); 1b9ec: e4 01 movw r28, r8 uint8_t _cycles = (_isbed) ? 180 : 60; //~ 90s / 30s 1b9ee: 24 eb ldi r18, 0xB4 ; 180 1b9f0: 92 2e mov r9, r18 target_temperature[0] = (_isbed) ? 0 : 200; 1b9f2: 90 e0 ldi r25, 0x00 ; 0 1b9f4: 80 e0 ldi r24, 0x00 ; 0 1b9f6: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 1b9fa: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 target_temperature_bed = (_isbed) ? 100 : 0; 1b9fe: 84 e6 ldi r24, 0x64 ; 100 1ba00: 90 e0 ldi r25, 0x00 ; 0 1ba02: f1 10 cpse r15, r1 1ba04: 02 c0 rjmp .+4 ; 0x1ba0a 1ba06: 90 e0 ldi r25, 0x00 ; 0 1ba08: 80 e0 ldi r24, 0x00 ; 0 1ba0a: 90 93 72 06 sts 0x0672, r25 ; 0x800672 1ba0e: 80 93 71 06 sts 0x0671, r24 ; 0x800671 thermal_model::reinitialize(); } bool thermal_model_enabled() { return thermal_model::enabled; 1ba12: e0 90 1c 05 lds r14, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> #ifdef THERMAL_MODEL bool tm_was_enabled = thermal_model_enabled(); thermal_model_set_enabled(false); 1ba16: 80 e0 ldi r24, 0x00 ; 0 1ba18: 0f 94 15 33 call 0x2662a ; 0x2662a #endif //THERMAL_MODEL manage_heater(); 1ba1c: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1ba20: 81 e0 ldi r24, 0x01 ; 1 1ba22: 0e 94 4f 8a call 0x1149e ; 0x1149e for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1ba26: b1 2c mov r11, r1 return _result; } static bool lcd_selfcheck_check_heater(bool _isbed) { uint8_t _progress = 0; 1ba28: a1 2c mov r10, r1 } else { MYSERIAL.print("Hotend temp:"); MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds 1ba2a: 85 e0 ldi r24, 0x05 ; 5 1ba2c: 88 2e mov r8, r24 thermal_model_set_enabled(false); #endif //THERMAL_MODEL manage_heater(); manage_inactivity(true); for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1ba2e: 80 91 10 05 lds r24, 0x0510 ; 0x800510 1ba32: 81 11 cpse r24, r1 1ba34: 1c c0 rjmp .+56 ; 0x1ba6e { manage_heater(); 1ba36: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1ba3a: 81 e0 ldi r24, 0x01 ; 1 1ba3c: 0e 94 4f 8a call 0x1149e ; 0x1149e _progress = (_isbed? 1ba40: 00 e9 ldi r16, 0x90 ; 144 1ba42: 11 e0 ldi r17, 0x01 ; 1 1ba44: 20 e0 ldi r18, 0x00 ; 0 1ba46: 42 e0 ldi r20, 0x02 ; 2 1ba48: 6a 2d mov r22, r10 1ba4a: 87 e0 ldi r24, 0x07 ; 7 1ba4c: f1 10 cpse r15, r1 1ba4e: 01 c0 rjmp .+2 ; 0x1ba52 1ba50: 88 e0 ldi r24, 0x08 ; 8 1ba52: 0e 94 34 db call 0x1b668 ; 0x1b668 1ba56: a8 2e mov r10, r24 } else { MYSERIAL.print("Hotend temp:"); MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds 1ba58: 8b 2d mov r24, r11 1ba5a: 68 2d mov r22, r8 1ba5c: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 1ba60: 91 11 cpse r25, r1 1ba62: 02 c0 rjmp .+4 ; 0x1ba68 1ba64: 0e 94 f6 76 call 0xedec ; 0xedec thermal_model_set_enabled(false); #endif //THERMAL_MODEL manage_heater(); manage_inactivity(true); for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter) 1ba68: b3 94 inc r11 1ba6a: b9 10 cpse r11, r9 1ba6c: e0 cf rjmp .-64 ; 0x1ba2e MYSERIAL.println(degHotend(0)); }*/ if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds } target_temperature[0] = 0; 1ba6e: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 1ba72: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 target_temperature_bed = 0; 1ba76: 10 92 72 06 sts 0x0672, r1 ; 0x800672 1ba7a: 10 92 71 06 sts 0x0671, r1 ; 0x800671 manage_heater(); 1ba7e: 0f 94 34 39 call 0x27268 ; 0x27268 1ba82: b6 01 movw r22, r12 1ba84: dd 0c add r13, r13 1ba86: 88 0b sbc r24, r24 1ba88: 99 0b sbc r25, r25 1ba8a: 4e 01 movw r8, r28 1ba8c: dd 0f add r29, r29 1ba8e: aa 08 sbc r10, r10 1ba90: bb 08 sbc r11, r11 int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot; 1ba92: ff 20 and r15, r15 1ba94: 09 f4 brne .+2 ; 0x1ba98 1ba96: 54 c0 rjmp .+168 ; 0x1bb40 1ba98: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1ba9c: 9b 01 movw r18, r22 1ba9e: ac 01 movw r20, r24 1baa0: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 1baa4: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 1baa8: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 1baac: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 1bab0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bab4: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1bab8: eb 01 movw r28, r22 int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot; 1baba: c5 01 movw r24, r10 1babc: b4 01 movw r22, r8 1babe: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1bac2: 9b 01 movw r18, r22 1bac4: ac 01 movw r20, r24 1bac6: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1baca: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1bace: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1bad2: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1bad6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bada: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) 1bade: 10 91 10 05 lds r17, 0x0510 ; 0x800510 1bae2: 11 11 cpse r17, r1 1bae4: 0c c0 rjmp .+24 ; 0x1bafe 1bae6: f1 10 cpse r15, r1 1bae8: 4b c0 rjmp .+150 ; 0x1bb80 1baea: 69 30 cpi r22, 0x09 ; 9 1baec: 71 05 cpc r23, r1 1baee: 0c f0 brlt .+2 ; 0x1baf2 1baf0: 4d c0 rjmp .+154 ; 0x1bb8c { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1baf2: 8e e1 ldi r24, 0x1E ; 30 1baf4: 90 e0 ldi r25, 0x00 ; 0 _stepresult = true; 1baf6: 11 e0 ldi r17, 0x01 ; 1 */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1baf8: c8 17 cp r28, r24 1bafa: d9 07 cpc r29, r25 1bafc: 34 f4 brge .+12 ; 0x1bb0a _stepresult = true; else lcd_selftest_error(TestError::Heater, "", ""); 1bafe: 66 ef ldi r22, 0xF6 ; 246 1bb00: 72 e0 ldi r23, 0x02 ; 2 1bb02: 80 e0 ldi r24, 0x00 ; 0 1bb04: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 MYSERIAL.println(_checked_result); MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; 1bb08: 10 e0 ldi r17, 0x00 ; 0 { lcd_selftest_error(TestError::Bed, "", ""); } #ifdef THERMAL_MODEL thermal_model_set_enabled(tm_was_enabled); 1bb0a: 8e 2d mov r24, r14 1bb0c: 0f 94 15 33 call 0x2662a ; 0x2662a #endif //THERMAL_MODEL manage_heater(); 1bb10: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1bb14: 81 e0 ldi r24, 0x01 ; 1 1bb16: 0e 94 4f 8a call 0x1149e ; 0x1149e return _stepresult; } 1bb1a: 81 2f mov r24, r17 1bb1c: df 91 pop r29 1bb1e: cf 91 pop r28 1bb20: 1f 91 pop r17 1bb22: 0f 91 pop r16 1bb24: ff 90 pop r15 1bb26: ef 90 pop r14 1bb28: df 90 pop r13 1bb2a: cf 90 pop r12 1bb2c: bf 90 pop r11 1bb2e: af 90 pop r10 1bb30: 9f 90 pop r9 1bb32: 8f 90 pop r8 1bb34: 08 95 ret static bool lcd_selfcheck_check_heater(bool _isbed) { 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 1bb36: 9c e3 ldi r25, 0x3C ; 60 1bb38: 99 2e mov r9, r25 target_temperature[0] = (_isbed) ? 0 : 200; 1bb3a: 88 ec ldi r24, 0xC8 ; 200 1bb3c: 90 e0 ldi r25, 0x00 ; 0 1bb3e: 5b cf rjmp .-330 ; 0x1b9f6 target_temperature[0] = 0; target_temperature_bed = 0; manage_heater(); int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot; 1bb40: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1bb44: 9b 01 movw r18, r22 1bb46: ac 01 movw r20, r24 1bb48: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1bb4c: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1bb50: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1bb54: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1bb58: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bb5c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1bb60: eb 01 movw r28, r22 int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot; 1bb62: c5 01 movw r24, r10 1bb64: b4 01 movw r22, r8 1bb66: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1bb6a: 9b 01 movw r18, r22 1bb6c: ac 01 movw r20, r24 1bb6e: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 1bb72: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 1bb76: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 1bb7a: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 1bb7e: ab cf rjmp .-170 ; 0x1bad6 */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) { if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30)) 1bb80: 89 e0 ldi r24, 0x09 ; 9 1bb82: 90 e0 ldi r25, 0x00 ; 0 MYSERIAL.print("Opposite result:"); MYSERIAL.println(_opposite_result); */ bool _stepresult = false; if (Stopped || _opposite_result < ((_isbed) ? 30 : 9)) 1bb84: 6e 31 cpi r22, 0x1E ; 30 1bb86: 71 05 cpc r23, r1 1bb88: 0c f4 brge .+2 ; 0x1bb8c 1bb8a: b5 cf rjmp .-150 ; 0x1baf6 else lcd_selftest_error(TestError::Heater, "", ""); } else { lcd_selftest_error(TestError::Bed, "", ""); 1bb8c: 66 ef ldi r22, 0xF6 ; 246 1bb8e: 72 e0 ldi r23, 0x02 ; 2 1bb90: 81 e0 ldi r24, 0x01 ; 1 1bb92: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 1bb96: b9 cf rjmp .-142 ; 0x1bb0a 0001bb98 : return(_result); } #ifdef TMC2130 static void reset_crash_det(uint8_t axis) { 1bb98: cf 93 push r28 1bb9a: df 93 push r29 current_position[axis] += 10; 1bb9c: 94 e0 ldi r25, 0x04 ; 4 1bb9e: 89 9f mul r24, r25 1bba0: e0 01 movw r28, r0 1bba2: 11 24 eor r1, r1 1bba4: cf 56 subi r28, 0x6F ; 111 1bba6: d9 4f sbci r29, 0xF9 ; 249 1bba8: 20 e0 ldi r18, 0x00 ; 0 1bbaa: 30 e0 ldi r19, 0x00 ; 0 1bbac: 40 e2 ldi r20, 0x20 ; 32 1bbae: 51 e4 ldi r21, 0x41 ; 65 1bbb0: 68 81 ld r22, Y 1bbb2: 79 81 ldd r23, Y+1 ; 0x01 1bbb4: 8a 81 ldd r24, Y+2 ; 0x02 1bbb6: 9b 81 ldd r25, Y+3 ; 0x03 1bbb8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1bbbc: 68 83 st Y, r22 1bbbe: 79 83 std Y+1, r23 ; 0x01 1bbc0: 8a 83 std Y+2, r24 ; 0x02 1bbc2: 9b 83 std Y+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bbc4: 60 e0 ldi r22, 0x00 ; 0 1bbc6: 70 e0 ldi r23, 0x00 ; 0 1bbc8: 84 e3 ldi r24, 0x34 ; 52 1bbca: 92 e4 ldi r25, 0x42 ; 66 1bbcc: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1bbd0: 0f 94 a9 43 call 0x28752 ; 0x28752 crashdet_use_eeprom_setting(); } 1bbd4: df 91 pop r29 1bbd6: cf 91 pop r28 static void reset_crash_det(uint8_t axis) { current_position[axis] += 10; plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); st_synchronize(); crashdet_use_eeprom_setting(); 1bbd8: 0d 94 31 27 jmp 0x24e62 ; 0x24e62 0001bbdc : } static bool lcd_selfcheck_axis_sg(uint8_t axis) { 1bbdc: 2f 92 push r2 1bbde: 3f 92 push r3 1bbe0: 4f 92 push r4 1bbe2: 5f 92 push r5 1bbe4: 6f 92 push r6 1bbe6: 7f 92 push r7 1bbe8: 8f 92 push r8 1bbea: 9f 92 push r9 1bbec: af 92 push r10 1bbee: bf 92 push r11 1bbf0: cf 92 push r12 1bbf2: df 92 push r13 1bbf4: ef 92 push r14 1bbf6: ff 92 push r15 1bbf8: 1f 93 push r17 1bbfa: cf 93 push r28 1bbfc: df 93 push r29 1bbfe: 00 d0 rcall .+0 ; 0x1bc00 1bc00: 00 d0 rcall .+0 ; 0x1bc02 1bc02: 1f 92 push r1 1bc04: cd b7 in r28, 0x3d ; 61 1bc06: de b7 in r29, 0x3e ; 62 1bc08: 18 2f mov r17, r24 // each axis length is measured twice float axis_length, current_position_init, current_position_final; float measured_axis_length[2]; float margin = 60; float max_error_mm = 5; switch (axis) { 1bc0a: 68 2e mov r6, r24 1bc0c: 71 2c mov r7, r1 case 0: axis_length = X_MAX_POS; break; case 1: axis_length = Y_MAX_POS - Y_MIN_POS + 4; break; 1bc0e: 81 2c mov r8, r1 1bc10: 20 e8 ldi r18, 0x80 ; 128 1bc12: 92 2e mov r9, r18 1bc14: 2c e5 ldi r18, 0x5C ; 92 1bc16: a2 2e mov r10, r18 1bc18: 23 e4 ldi r18, 0x43 ; 67 1bc1a: b2 2e mov r11, r18 // each axis length is measured twice float axis_length, current_position_init, current_position_final; float measured_axis_length[2]; float margin = 60; float max_error_mm = 5; switch (axis) { 1bc1c: 81 30 cpi r24, 0x01 ; 1 1bc1e: 31 f0 breq .+12 ; 0x1bc2c case 0: axis_length = X_MAX_POS; break; 1bc20: 81 2c mov r8, r1 1bc22: 91 2c mov r9, r1 1bc24: 9f e7 ldi r25, 0x7F ; 127 1bc26: a9 2e mov r10, r25 1bc28: 93 e4 ldi r25, 0x43 ; 67 1bc2a: b9 2e mov r11, r25 case 1: axis_length = Y_MAX_POS - Y_MIN_POS + 4; break; default: axis_length = 210; break; } tmc2130_sg_stop_on_crash = false; 1bc2c: 10 92 5c 02 sts 0x025C, r1 ; 0x80025c tmc2130_home_exit(); 1bc30: 0f 94 85 26 call 0x24d0a ; 0x24d0a 1bc34: 81 e0 ldi r24, 0x01 ; 1 1bc36: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(true); raise_z_above(MESH_HOME_Z_SEARCH); 1bc3a: 60 e0 ldi r22, 0x00 ; 0 1bc3c: 70 e0 ldi r23, 0x00 ; 0 1bc3e: 80 ea ldi r24, 0xA0 ; 160 1bc40: 90 e4 ldi r25, 0x40 ; 64 1bc42: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 tmc2130_home_enter(1 << axis); 1bc46: 81 e0 ldi r24, 0x01 ; 1 1bc48: 01 2e mov r0, r17 1bc4a: 01 c0 rjmp .+2 ; 0x1bc4e 1bc4c: 88 0f add r24, r24 1bc4e: 0a 94 dec r0 1bc50: ea f7 brpl .-6 ; 0x1bc4c 1bc52: 0f 94 b4 26 call 0x24d68 ; 0x24d68 // first axis length measurement begin current_position[axis] -= (axis_length + margin); 1bc56: 20 e0 ldi r18, 0x00 ; 0 1bc58: 30 e0 ldi r19, 0x00 ; 0 1bc5a: 40 e7 ldi r20, 0x70 ; 112 1bc5c: 52 e4 ldi r21, 0x42 ; 66 1bc5e: c5 01 movw r24, r10 1bc60: b4 01 movw r22, r8 1bc62: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1bc66: 69 83 std Y+1, r22 ; 0x01 1bc68: 7a 83 std Y+2, r23 ; 0x02 1bc6a: 8b 83 std Y+3, r24 ; 0x03 1bc6c: 9c 83 std Y+4, r25 ; 0x04 1bc6e: 13 01 movw r2, r6 1bc70: 22 0c add r2, r2 1bc72: 33 1c adc r3, r3 1bc74: 22 0c add r2, r2 1bc76: 33 1c adc r3, r3 1bc78: c1 01 movw r24, r2 1bc7a: 8f 56 subi r24, 0x6F ; 111 1bc7c: 99 4f sbci r25, 0xF9 ; 249 1bc7e: 9e 83 std Y+6, r25 ; 0x06 1bc80: 8d 83 std Y+5, r24 ; 0x05 1bc82: 29 81 ldd r18, Y+1 ; 0x01 1bc84: 3a 81 ldd r19, Y+2 ; 0x02 1bc86: 4b 81 ldd r20, Y+3 ; 0x03 1bc88: 5c 81 ldd r21, Y+4 ; 0x04 1bc8a: fc 01 movw r30, r24 1bc8c: 60 81 ld r22, Z 1bc8e: 71 81 ldd r23, Z+1 ; 0x01 1bc90: 82 81 ldd r24, Z+2 ; 0x02 1bc92: 93 81 ldd r25, Z+3 ; 0x03 1bc94: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bc98: ed 81 ldd r30, Y+5 ; 0x05 1bc9a: fe 81 ldd r31, Y+6 ; 0x06 1bc9c: 60 83 st Z, r22 1bc9e: 71 83 std Z+1, r23 ; 0x01 1bca0: 82 83 std Z+2, r24 ; 0x02 1bca2: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bca4: 60 e0 ldi r22, 0x00 ; 0 1bca6: 70 e0 ldi r23, 0x00 ; 0 1bca8: 84 e3 ldi r24, 0x34 ; 52 1bcaa: 92 e4 ldi r25, 0x42 ; 66 1bcac: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1bcb0: 0f 94 a9 43 call 0x28752 ; 0x28752 #endif } void tmc2130_sg_measure_start(uint8_t axis) { tmc2130_sg_measure = axis; 1bcb4: 10 93 3b 02 sts 0x023B, r17 ; 0x80023b <_ZL18tmc2130_sg_measure.lto_priv.475> tmc2130_sg_measure_cnt = 0; 1bcb8: 10 92 cb 03 sts 0x03CB, r1 ; 0x8003cb <_ZL22tmc2130_sg_measure_cnt.lto_priv.477> 1bcbc: 10 92 cc 03 sts 0x03CC, r1 ; 0x8003cc <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x1> 1bcc0: 10 92 cd 03 sts 0x03CD, r1 ; 0x8003cd <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x2> 1bcc4: 10 92 ce 03 sts 0x03CE, r1 ; 0x8003ce <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x3> tmc2130_sg_measure_val = 0; 1bcc8: 10 92 cf 03 sts 0x03CF, r1 ; 0x8003cf <_ZL22tmc2130_sg_measure_val.lto_priv.476> 1bccc: 10 92 d0 03 sts 0x03D0, r1 ; 0x8003d0 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x1> 1bcd0: 10 92 d1 03 sts 0x03D1, r1 ; 0x8003d1 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x2> 1bcd4: 10 92 d2 03 sts 0x03D2, r1 ; 0x8003d2 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x3> tmc2130_sg_measure_start(axis); current_position_init = st_get_position_mm(axis); 1bcd8: 81 2f mov r24, r17 1bcda: 0f 94 95 43 call 0x2872a ; 0x2872a 1bcde: 6b 01 movw r12, r22 1bce0: 7c 01 movw r14, r24 current_position[axis] += 2 * margin; 1bce2: 20 e0 ldi r18, 0x00 ; 0 1bce4: 30 e0 ldi r19, 0x00 ; 0 1bce6: 40 ef ldi r20, 0xF0 ; 240 1bce8: 52 e4 ldi r21, 0x42 ; 66 1bcea: ed 81 ldd r30, Y+5 ; 0x05 1bcec: fe 81 ldd r31, Y+6 ; 0x06 1bcee: 60 81 ld r22, Z 1bcf0: 71 81 ldd r23, Z+1 ; 0x01 1bcf2: 82 81 ldd r24, Z+2 ; 0x02 1bcf4: 93 81 ldd r25, Z+3 ; 0x03 1bcf6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1bcfa: ed 81 ldd r30, Y+5 ; 0x05 1bcfc: fe 81 ldd r31, Y+6 ; 0x06 1bcfe: 60 83 st Z, r22 1bd00: 71 83 std Z+1, r23 ; 0x01 1bd02: 82 83 std Z+2, r24 ; 0x02 1bd04: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bd06: 60 e0 ldi r22, 0x00 ; 0 1bd08: 70 e0 ldi r23, 0x00 ; 0 1bd0a: 84 e3 ldi r24, 0x34 ; 52 1bd0c: 92 e4 ldi r25, 0x42 ; 66 1bd0e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1bd12: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[axis] += axis_length; 1bd16: a5 01 movw r20, r10 1bd18: 94 01 movw r18, r8 1bd1a: ed 81 ldd r30, Y+5 ; 0x05 1bd1c: fe 81 ldd r31, Y+6 ; 0x06 1bd1e: 60 81 ld r22, Z 1bd20: 71 81 ldd r23, Z+1 ; 0x01 1bd22: 82 81 ldd r24, Z+2 ; 0x02 1bd24: 93 81 ldd r25, Z+3 ; 0x03 1bd26: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1bd2a: ed 81 ldd r30, Y+5 ; 0x05 1bd2c: fe 81 ldd r31, Y+6 ; 0x06 1bd2e: 60 83 st Z, r22 1bd30: 71 83 std Z+1, r23 ; 0x01 1bd32: 82 83 std Z+2, r24 ; 0x02 1bd34: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bd36: 60 e0 ldi r22, 0x00 ; 0 1bd38: 70 e0 ldi r23, 0x00 ; 0 1bd3a: 84 e3 ldi r24, 0x34 ; 52 1bd3c: 92 e4 ldi r25, 0x42 ; 66 1bd3e: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1bd42: 0f 94 a9 43 call 0x28752 ; 0x28752 } uint16_t tmc2130_sg_measure_stop() { tmc2130_sg_measure = 0xff; 1bd46: 8f ef ldi r24, 0xFF ; 255 1bd48: 80 93 3b 02 sts 0x023B, r24 ; 0x80023b <_ZL18tmc2130_sg_measure.lto_priv.475> return tmc2130_sg_measure_val / tmc2130_sg_measure_cnt; 1bd4c: 60 91 cf 03 lds r22, 0x03CF ; 0x8003cf <_ZL22tmc2130_sg_measure_val.lto_priv.476> 1bd50: 70 91 d0 03 lds r23, 0x03D0 ; 0x8003d0 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x1> 1bd54: 80 91 d1 03 lds r24, 0x03D1 ; 0x8003d1 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x2> 1bd58: 90 91 d2 03 lds r25, 0x03D2 ; 0x8003d2 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x3> 1bd5c: 20 91 cb 03 lds r18, 0x03CB ; 0x8003cb <_ZL22tmc2130_sg_measure_cnt.lto_priv.477> 1bd60: 30 91 cc 03 lds r19, 0x03CC ; 0x8003cc <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x1> 1bd64: 40 91 cd 03 lds r20, 0x03CD ; 0x8003cd <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x2> 1bd68: 50 91 ce 03 lds r21, 0x03CE ; 0x8003ce <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x3> 1bd6c: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 1bd70: 2d 83 std Y+5, r18 ; 0x05 1bd72: 3f 83 std Y+7, r19 ; 0x07 uint16_t sg1 = tmc2130_sg_measure_stop(); printf_P(PSTR("%c AXIS SG1=%d\n"), 'X'+axis, sg1); 1bd74: 3f 93 push r19 1bd76: 2f 93 push r18 1bd78: f8 e5 ldi r31, 0x58 ; 88 1bd7a: 6f 0e add r6, r31 1bd7c: 71 1c adc r7, r1 1bd7e: 7f 92 push r7 1bd80: 6f 92 push r6 1bd82: 88 ec ldi r24, 0xC8 ; 200 1bd84: 99 e8 ldi r25, 0x89 ; 137 1bd86: 9f 93 push r25 1bd88: 8f 93 push r24 1bd8a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 eeprom_write_word_notify(((uint16_t*)((axis == X_AXIS)?EEPROM_BELTSTATUS_X:EEPROM_BELTSTATUS_Y)), sg1); 1bd8e: 0f 90 pop r0 1bd90: 0f 90 pop r0 1bd92: 0f 90 pop r0 1bd94: 0f 90 pop r0 1bd96: 0f 90 pop r0 1bd98: 0f 90 pop r0 1bd9a: 8b e5 ldi r24, 0x5B ; 91 1bd9c: 9f e0 ldi r25, 0x0F ; 15 1bd9e: 11 11 cpse r17, r1 1bda0: 02 c0 rjmp .+4 ; 0x1bda6 1bda2: 8d e5 ldi r24, 0x5D ; 93 1bda4: 9f e0 ldi r25, 0x0F ; 15 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); 1bda6: 6d 81 ldd r22, Y+5 ; 0x05 1bda8: 7f 81 ldd r23, Y+7 ; 0x07 1bdaa: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc current_position_final = st_get_position_mm(axis); 1bdae: 81 2f mov r24, r17 1bdb0: 0f 94 95 43 call 0x2872a ; 0x2872a 1bdb4: 2b 01 movw r4, r22 1bdb6: 3c 01 movw r6, r24 measured_axis_length[0] = fabs(current_position_final - current_position_init); 1bdb8: a7 01 movw r20, r14 1bdba: 96 01 movw r18, r12 1bdbc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bdc0: 6b 01 movw r12, r22 1bdc2: 7c 01 movw r14, r24 1bdc4: e8 94 clt 1bdc6: f7 f8 bld r15, 7 // first measurement end and second measurement begin current_position[axis] -= margin; 1bdc8: c1 01 movw r24, r2 1bdca: 8f 56 subi r24, 0x6F ; 111 1bdcc: 99 4f sbci r25, 0xF9 ; 249 1bdce: 9e 83 std Y+6, r25 ; 0x06 1bdd0: 8d 83 std Y+5, r24 ; 0x05 1bdd2: 20 e0 ldi r18, 0x00 ; 0 1bdd4: 30 e0 ldi r19, 0x00 ; 0 1bdd6: 40 e7 ldi r20, 0x70 ; 112 1bdd8: 52 e4 ldi r21, 0x42 ; 66 1bdda: fc 01 movw r30, r24 1bddc: 60 81 ld r22, Z 1bdde: 71 81 ldd r23, Z+1 ; 0x01 1bde0: 82 81 ldd r24, Z+2 ; 0x02 1bde2: 93 81 ldd r25, Z+3 ; 0x03 1bde4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bde8: ed 81 ldd r30, Y+5 ; 0x05 1bdea: fe 81 ldd r31, Y+6 ; 0x06 1bdec: 60 83 st Z, r22 1bdee: 71 83 std Z+1, r23 ; 0x01 1bdf0: 82 83 std Z+2, r24 ; 0x02 1bdf2: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1bdf4: 60 e0 ldi r22, 0x00 ; 0 1bdf6: 70 e0 ldi r23, 0x00 ; 0 1bdf8: 84 e3 ldi r24, 0x34 ; 52 1bdfa: 92 e4 ldi r25, 0x42 ; 66 1bdfc: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1be00: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[axis] -= (axis_length + margin); 1be04: 29 81 ldd r18, Y+1 ; 0x01 1be06: 3a 81 ldd r19, Y+2 ; 0x02 1be08: 4b 81 ldd r20, Y+3 ; 0x03 1be0a: 5c 81 ldd r21, Y+4 ; 0x04 1be0c: ed 81 ldd r30, Y+5 ; 0x05 1be0e: fe 81 ldd r31, Y+6 ; 0x06 1be10: 60 81 ld r22, Z 1be12: 71 81 ldd r23, Z+1 ; 0x01 1be14: 82 81 ldd r24, Z+2 ; 0x02 1be16: 93 81 ldd r25, Z+3 ; 0x03 1be18: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1be1c: ed 81 ldd r30, Y+5 ; 0x05 1be1e: fe 81 ldd r31, Y+6 ; 0x06 1be20: 60 83 st Z, r22 1be22: 71 83 std Z+1, r23 ; 0x01 1be24: 82 83 std Z+2, r24 ; 0x02 1be26: 93 83 std Z+3, r25 ; 0x03 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1be28: 60 e0 ldi r22, 0x00 ; 0 1be2a: 70 e0 ldi r23, 0x00 ; 0 1be2c: 84 e3 ldi r24, 0x34 ; 52 1be2e: 92 e4 ldi r25, 0x42 ; 66 1be30: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1be34: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position_init = st_get_position_mm(axis); 1be38: 81 2f mov r24, r17 1be3a: 0f 94 95 43 call 0x2872a ; 0x2872a 1be3e: 9b 01 movw r18, r22 1be40: ac 01 movw r20, r24 measured_axis_length[1] = fabs(current_position_final - current_position_init); 1be42: c3 01 movw r24, r6 1be44: b2 01 movw r22, r4 1be46: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1be4a: 2b 01 movw r4, r22 1be4c: 3c 01 movw r6, r24 1be4e: e8 94 clt 1be50: 77 f8 bld r7, 7 tmc2130_home_exit(); 1be52: 0f 94 85 26 call 0x24d0a ; 0x24d0a //end of second measurement, now check for possible errors: for(uint_least8_t i = 0; i < 2; i++){ //check if measured axis length corresponds to expected length printf_P(_N("Measured axis length:%.3f\n"), measured_axis_length[i]); 1be56: ff 92 push r15 1be58: ef 92 push r14 1be5a: df 92 push r13 1be5c: cf 92 push r12 1be5e: 8d ef ldi r24, 0xFD ; 253 1be60: 9a e6 ldi r25, 0x6A ; 106 1be62: 9f 93 push r25 1be64: 8f 93 push r24 1be66: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (fabs(measured_axis_length[i] - axis_length) > max_error_mm) { 1be6a: a5 01 movw r20, r10 1be6c: 94 01 movw r18, r8 1be6e: c7 01 movw r24, r14 1be70: b6 01 movw r22, r12 1be72: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1be76: 9f 77 andi r25, 0x7F ; 127 1be78: 0f 90 pop r0 1be7a: 0f 90 pop r0 1be7c: 0f 90 pop r0 1be7e: 0f 90 pop r0 1be80: 0f 90 pop r0 1be82: 0f 90 pop r0 1be84: 20 e0 ldi r18, 0x00 ; 0 1be86: 30 e0 ldi r19, 0x00 ; 0 1be88: 40 ea ldi r20, 0xA0 ; 160 1be8a: 50 e4 ldi r21, 0x40 ; 64 1be8c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1be90: 18 16 cp r1, r24 1be92: 0c f4 brge .+2 ; 0x1be96 1be94: 53 c0 rjmp .+166 ; 0x1bf3c tmc2130_home_exit(); //end of second measurement, now check for possible errors: for(uint_least8_t i = 0; i < 2; i++){ //check if measured axis length corresponds to expected length printf_P(_N("Measured axis length:%.3f\n"), measured_axis_length[i]); 1be96: 7f 92 push r7 1be98: 6f 92 push r6 1be9a: 5f 92 push r5 1be9c: 4f 92 push r4 1be9e: 8d ef ldi r24, 0xFD ; 253 1bea0: 9a e6 ldi r25, 0x6A ; 106 1bea2: 9f 93 push r25 1bea4: 8f 93 push r24 1bea6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (fabs(measured_axis_length[i] - axis_length) > max_error_mm) { 1beaa: a5 01 movw r20, r10 1beac: 94 01 movw r18, r8 1beae: c3 01 movw r24, r6 1beb0: b2 01 movw r22, r4 1beb2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1beb6: 9f 77 andi r25, 0x7F ; 127 1beb8: 0f 90 pop r0 1beba: 0f 90 pop r0 1bebc: 0f 90 pop r0 1bebe: 0f 90 pop r0 1bec0: 0f 90 pop r0 1bec2: 0f 90 pop r0 1bec4: 20 e0 ldi r18, 0x00 ; 0 1bec6: 30 e0 ldi r19, 0x00 ; 0 1bec8: 40 ea ldi r20, 0xA0 ; 160 1beca: 50 e4 ldi r21, 0x40 ; 64 1becc: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1bed0: 18 16 cp r1, r24 1bed2: a4 f1 brlt .+104 ; 0x1bf3c endstops_hit_on_purpose(); return false; } } printf_P(_N("Axis length difference:%.3f\n"), fabs(measured_axis_length[0] - measured_axis_length[1])); 1bed4: a3 01 movw r20, r6 1bed6: 92 01 movw r18, r4 1bed8: c7 01 movw r24, r14 1beda: b6 01 movw r22, r12 1bedc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1bee0: 6b 01 movw r12, r22 1bee2: 7c 01 movw r14, r24 1bee4: e8 94 clt 1bee6: f7 f8 bld r15, 7 1bee8: ff 92 push r15 1beea: ef 92 push r14 1beec: df 92 push r13 1beee: cf 92 push r12 1bef0: 80 ee ldi r24, 0xE0 ; 224 1bef2: 9a e6 ldi r25, 0x6A ; 106 1bef4: 9f 93 push r25 1bef6: 8f 93 push r24 1bef8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (fabs(measured_axis_length[0] - measured_axis_length[1]) > 1) { //check if difference between first and second measurement is low 1befc: 0f 90 pop r0 1befe: 0f 90 pop r0 1bf00: 0f 90 pop r0 1bf02: 0f 90 pop r0 1bf04: 0f 90 pop r0 1bf06: 0f 90 pop r0 1bf08: 20 e0 ldi r18, 0x00 ; 0 1bf0a: 30 e0 ldi r19, 0x00 ; 0 1bf0c: 40 e8 ldi r20, 0x80 ; 128 1bf0e: 5f e3 ldi r21, 0x3F ; 63 1bf10: c7 01 movw r24, r14 1bf12: b6 01 movw r22, r12 1bf14: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1bf18: 18 16 cp r1, r24 1bf1a: 0c f4 brge .+2 ; 0x1bf1e 1bf1c: 44 c0 rjmp .+136 ; 0x1bfa6 plan_set_position_curposXYZE(); reset_crash_det(axis); endstops_hit_on_purpose(); return false; } current_position[axis] = 0; 1bf1e: ed 81 ldd r30, Y+5 ; 0x05 1bf20: fe 81 ldd r31, Y+6 ; 0x06 1bf22: 10 82 st Z, r1 1bf24: 11 82 std Z+1, r1 ; 0x01 1bf26: 12 82 std Z+2, r1 ; 0x02 1bf28: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 1bf2a: 0f 94 fd be call 0x37dfa ; 0x37dfa reset_crash_det(axis); 1bf2e: 81 2f mov r24, r17 1bf30: 0e 94 cc dd call 0x1bb98 ; 0x1bb98 endstops_hit_on_purpose(); 1bf34: 0f 94 bf 4e call 0x29d7e ; 0x29d7e return true; 1bf38: 81 e0 ldi r24, 0x01 ; 1 1bf3a: 1d c0 rjmp .+58 ; 0x1bf76 1bf3c: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); const char *_error_1; if (axis == X_AXIS) _error_1 = "X"; if (axis == Y_AXIS) _error_1 = "Y"; 1bf40: 63 ee ldi r22, 0xE3 ; 227 1bf42: 72 e0 ldi r23, 0x02 ; 2 1bf44: 11 30 cpi r17, 0x01 ; 1 1bf46: 11 f0 breq .+4 ; 0x1bf4c 1bf48: 61 ee ldi r22, 0xE1 ; 225 1bf4a: 72 e0 ldi r23, 0x02 ; 2 if (axis == Z_AXIS) _error_1 = "Z"; lcd_selftest_error(TestError::Axis, _error_1, ""); 1bf4c: 88 e0 ldi r24, 0x08 ; 8 1bf4e: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 current_position[axis] = 0; 1bf52: f1 01 movw r30, r2 1bf54: ef 56 subi r30, 0x6F ; 111 1bf56: f9 4f sbci r31, 0xF9 ; 249 1bf58: 10 82 st Z, r1 1bf5a: 11 82 std Z+1, r1 ; 0x01 1bf5c: 12 82 std Z+2, r1 ; 0x02 1bf5e: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 1bf60: 0f 94 fd be call 0x37dfa ; 0x37dfa reset_crash_det(axis); 1bf64: 81 2f mov r24, r17 1bf66: 0e 94 cc dd call 0x1bb98 ; 0x1bb98 1bf6a: 81 e0 ldi r24, 0x01 ; 1 1bf6c: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> lcd_selftest_error(TestError::Pulley, _error_1, ""); current_position[axis] = 0; plan_set_position_curposXYZE(); reset_crash_det(axis); endstops_hit_on_purpose(); 1bf70: 0f 94 bf 4e call 0x29d7e ; 0x29d7e return false; 1bf74: 80 e0 ldi r24, 0x00 ; 0 current_position[axis] = 0; plan_set_position_curposXYZE(); reset_crash_det(axis); endstops_hit_on_purpose(); return true; } 1bf76: 27 96 adiw r28, 0x07 ; 7 1bf78: 0f b6 in r0, 0x3f ; 63 1bf7a: f8 94 cli 1bf7c: de bf out 0x3e, r29 ; 62 1bf7e: 0f be out 0x3f, r0 ; 63 1bf80: cd bf out 0x3d, r28 ; 61 1bf82: df 91 pop r29 1bf84: cf 91 pop r28 1bf86: 1f 91 pop r17 1bf88: ff 90 pop r15 1bf8a: ef 90 pop r14 1bf8c: df 90 pop r13 1bf8e: cf 90 pop r12 1bf90: bf 90 pop r11 1bf92: af 90 pop r10 1bf94: 9f 90 pop r9 1bf96: 8f 90 pop r8 1bf98: 7f 90 pop r7 1bf9a: 6f 90 pop r6 1bf9c: 5f 90 pop r5 1bf9e: 4f 90 pop r4 1bfa0: 3f 90 pop r3 1bfa2: 2f 90 pop r2 1bfa4: 08 95 ret if (fabs(measured_axis_length[0] - measured_axis_length[1]) > 1) { //check if difference between first and second measurement is low //loose pulleys const char *_error_1; if (axis == X_AXIS) _error_1 = "X"; if (axis == Y_AXIS) _error_1 = "Y"; 1bfa6: 63 ee ldi r22, 0xE3 ; 227 1bfa8: 72 e0 ldi r23, 0x02 ; 2 1bfaa: 11 30 cpi r17, 0x01 ; 1 1bfac: 11 f0 breq .+4 ; 0x1bfb2 1bfae: 61 ee ldi r22, 0xE1 ; 225 1bfb0: 72 e0 ldi r23, 0x02 ; 2 if (axis == Z_AXIS) _error_1 = "Z"; lcd_selftest_error(TestError::Pulley, _error_1, ""); 1bfb2: 87 e0 ldi r24, 0x07 ; 7 1bfb4: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 current_position[axis] = 0; 1bfb8: f1 01 movw r30, r2 1bfba: ef 56 subi r30, 0x6F ; 111 1bfbc: f9 4f sbci r31, 0xF9 ; 249 1bfbe: 10 82 st Z, r1 1bfc0: 11 82 std Z+1, r1 ; 0x01 1bfc2: 12 82 std Z+2, r1 ; 0x02 1bfc4: 13 82 std Z+3, r1 ; 0x03 plan_set_position_curposXYZE(); 1bfc6: 0f 94 fd be call 0x37dfa ; 0x37dfa reset_crash_det(axis); 1bfca: 81 2f mov r24, r17 1bfcc: 0e 94 cc dd call 0x1bb98 ; 0x1bb98 1bfd0: cf cf rjmp .-98 ; 0x1bf70 0001bfd2 : } #ifdef TMC2130 static void crash_mode_switch() { eeprom_toggle((uint8_t*)EEPROM_CRASH_DET); 1bfd2: 89 e6 ldi r24, 0x69 ; 105 1bfd4: 9f e0 ldi r25, 0x0F ; 15 1bfd6: 0e 94 cc 75 call 0xeb98 ; 0xeb98 crashdet_use_eeprom_setting(); 1bfda: 0d 94 31 27 jmp 0x24e62 ; 0x24e62 0001bfde : #endif //SDCARD_SORT_ALPHA #ifdef TMC2130 static void lcd_crash_mode_info() { lcd_home(); 1bfde: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_puts_P(_T(MSG_CRASH_DET_ONLY_IN_NORMAL)); 1bfe2: 88 e5 ldi r24, 0x58 ; 88 1bfe4: 9a e3 ldi r25, 0x3A ; 58 1bfe6: 0e 94 44 72 call 0xe488 ; 0xe488 1bfea: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 menu_back_if_clicked(); 1bfee: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0001bff2 : } static void lcd_crash_mode_info2() { lcd_home(); 1bff2: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_puts_P(_T(MSG_CRASH_DET_STEALTH_FORCE_OFF)); 1bff6: 8f e8 ldi r24, 0x8F ; 143 1bff8: 9a e3 ldi r25, 0x3A ; 58 1bffa: 0e 94 44 72 call 0xe488 ; 0xe488 1bffe: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 menu_back_if_clicked(); 1c002: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0001c006 : default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu. } } #ifdef TMC2130 static void lcd_belttest_v() { 1c006: 0f 93 push r16 1c008: 1f 93 push r17 1c00a: cf 93 push r28 1c00c: df 93 push r29 menu_back_if_clicked(); } void lcd_belttest() { lcd_clear(); 1c00e: 0e 94 ab 6e call 0xdd56 ; 0xdd56 // Belttest requires high power mode. Enable it. FORCE_HIGH_POWER_START; 1c012: 81 e0 ldi r24, 0x01 ; 1 1c014: 0e 94 48 66 call 0xcc90 ; 0xcc90 uint16_t X = eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_X)); 1c018: 8d e5 ldi r24, 0x5D ; 93 1c01a: 9f e0 ldi r25, 0x0F ; 15 1c01c: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1c020: ec 01 movw r28, r24 uint16_t Y = eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_Y)); 1c022: 8b e5 ldi r24, 0x5B ; 91 1c024: 9f e0 ldi r25, 0x0F ; 15 1c026: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1c02a: 18 2f mov r17, r24 1c02c: 09 2f mov r16, r25 lcd_puts_P(_T(MSG_CHECKING_X)); 1c02e: 8a e1 ldi r24, 0x1A ; 26 1c030: 99 e4 ldi r25, 0x49 ; 73 1c032: 0e 94 44 72 call 0xe488 ; 0xe488 1c036: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_set_cursor(0,1), lcd_printf_P(PSTR("X: %u -> ..."),X); 1c03a: 61 e0 ldi r22, 0x01 ; 1 1c03c: 80 e0 ldi r24, 0x00 ; 0 1c03e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 1c042: df 93 push r29 1c044: cf 93 push r28 1c046: 8f ea ldi r24, 0xAF ; 175 1c048: 99 e8 ldi r25, 0x89 ; 137 1c04a: 9f 93 push r25 1c04c: 8f 93 push r24 1c04e: 0e 94 51 6e call 0xdca2 ; 0xdca2 KEEPALIVE_STATE(IN_HANDLER); 1c052: 82 e0 ldi r24, 0x02 ; 2 1c054: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be // N.B: it doesn't make sense to handle !lcd_selfcheck...() because selftest_sg throws its own error screen // that clobbers ours, with more info than we could provide. So on fail we just fall through to take us back to status. if (lcd_selfcheck_axis_sg(X_AXIS)){ 1c058: 80 e0 ldi r24, 0x00 ; 0 1c05a: 0e 94 ee dd call 0x1bbdc ; 0x1bbdc 1c05e: 0f 90 pop r0 1c060: 0f 90 pop r0 1c062: 0f 90 pop r0 1c064: 0f 90 pop r0 1c066: 88 23 and r24, r24 1c068: 09 f4 brne .+2 ; 0x1c06c 1c06a: 45 c0 rjmp .+138 ; 0x1c0f6 X = eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_X)); 1c06c: 8d e5 ldi r24, 0x5D ; 93 1c06e: 9f e0 ldi r25, 0x0F ; 15 1c070: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1c074: ec 01 movw r28, r24 lcd_set_cursor(10, 1); 1c076: 61 e0 ldi r22, 0x01 ; 1 1c078: 8a e0 ldi r24, 0x0A ; 10 1c07a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print((long) n, base); } void lcd_print(unsigned int n, int base) { lcd_print((unsigned long) n, base); 1c07e: be 01 movw r22, r28 1c080: 90 e0 ldi r25, 0x00 ; 0 1c082: 80 e0 ldi r24, 0x00 ; 0 void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); else lcd_printNumber(n, base); 1c084: 4a e0 ldi r20, 0x0A ; 10 1c086: 0e 94 cc 6f call 0xdf98 ; 0xdf98 lcd_print(X); // Show new X value next to old one. lcd_puts_at_P(0, 2, _T(MSG_CHECKING_Y)); 1c08a: 88 e0 ldi r24, 0x08 ; 8 1c08c: 99 e4 ldi r25, 0x49 ; 73 1c08e: 0e 94 44 72 call 0xe488 ; 0xe488 1c092: ac 01 movw r20, r24 1c094: 62 e0 ldi r22, 0x02 ; 2 1c096: 80 e0 ldi r24, 0x00 ; 0 1c098: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(0, 3), lcd_printf_P(PSTR("Y: %u -> ..."),Y); 1c09c: 63 e0 ldi r22, 0x03 ; 3 1c09e: 80 e0 ldi r24, 0x00 ; 0 1c0a0: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 1c0a4: 0f 93 push r16 1c0a6: 1f 93 push r17 1c0a8: 82 ea ldi r24, 0xA2 ; 162 1c0aa: 99 e8 ldi r25, 0x89 ; 137 1c0ac: 9f 93 push r25 1c0ae: 8f 93 push r24 1c0b0: 0e 94 51 6e call 0xdca2 ; 0xdca2 if (lcd_selfcheck_axis_sg(Y_AXIS)) 1c0b4: 81 e0 ldi r24, 0x01 ; 1 1c0b6: 0e 94 ee dd call 0x1bbdc ; 0x1bbdc 1c0ba: 0f 90 pop r0 1c0bc: 0f 90 pop r0 1c0be: 0f 90 pop r0 1c0c0: 0f 90 pop r0 1c0c2: 88 23 and r24, r24 1c0c4: c1 f0 breq .+48 ; 0x1c0f6 { Y = eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_Y)); 1c0c6: 8b e5 ldi r24, 0x5B ; 91 1c0c8: 9f e0 ldi r25, 0x0F ; 15 1c0ca: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1c0ce: ec 01 movw r28, r24 lcd_set_cursor(10, 3); 1c0d0: 63 e0 ldi r22, 0x03 ; 3 1c0d2: 8a e0 ldi r24, 0x0A ; 10 1c0d4: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print((long) n, base); } void lcd_print(unsigned int n, int base) { lcd_print((unsigned long) n, base); 1c0d8: be 01 movw r22, r28 1c0da: 90 e0 ldi r25, 0x00 ; 0 1c0dc: 80 e0 ldi r24, 0x00 ; 0 void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); else lcd_printNumber(n, base); 1c0de: 4a e0 ldi r20, 0x0A ; 10 1c0e0: 0e 94 cc 6f call 0xdf98 ; 0xdf98 lcd_print(Y); lcd_putc_at(19, 3, LCD_STR_UPLEVEL[0]); 1c0e4: 43 e8 ldi r20, 0x83 ; 131 1c0e6: 63 e0 ldi r22, 0x03 ; 3 1c0e8: 83 e1 ldi r24, 0x13 ; 19 1c0ea: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_wait_for_click_delay(10); 1c0ee: 8a e0 ldi r24, 0x0A ; 10 1c0f0: 90 e0 ldi r25, 0x00 ; 0 1c0f2: 0f 94 07 3b call 0x2760e ; 0x2760e } } FORCE_HIGH_POWER_END; 1c0f6: 80 e0 ldi r24, 0x00 ; 0 1c0f8: 0e 94 48 66 call 0xcc90 ; 0xcc90 KEEPALIVE_STATE(NOT_BUSY); 1c0fc: 81 e0 ldi r24, 0x01 ; 1 1c0fe: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be #ifdef TMC2130 static void lcd_belttest_v() { lcd_belttest(); menu_back_if_clicked(); } 1c102: df 91 pop r29 1c104: cf 91 pop r28 1c106: 1f 91 pop r17 1c108: 0f 91 pop r16 } #ifdef TMC2130 static void lcd_belttest_v() { lcd_belttest(); menu_back_if_clicked(); 1c10a: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0001c10e : static void lcd_sd_refresh() { #if SDCARDDETECT == -1 card.mount(); #else card.presort(); 1c10e: 0f 94 89 7d call 0x2fb12 ; 0x2fb12 #endif menu_top = 0; 1c112: 10 92 a3 03 sts 0x03A3, r1 ; 0x8003a3 lcd_encoder = 0; 1c116: 10 92 70 06 sts 0x0670, r1 ; 0x800670 1c11a: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f menu_data_reset(); //Forces reloading of cached variables. 1c11e: 0d 94 ac d1 jmp 0x3a358 ; 0x3a358 0001c122 : } } void CardReader::updir() { if(workDirDepth > 0) 1c122: 80 91 2f 16 lds r24, 0x162F ; 0x80162f 1c126: 88 23 and r24, r24 1c128: f9 f0 breq .+62 ; 0x1c168 { --workDirDepth; 1c12a: 81 50 subi r24, 0x01 ; 1 1c12c: 80 93 2f 16 sts 0x162F, r24 ; 0x80162f workDir = workDirParents[0]; 1c130: 93 e2 ldi r25, 0x23 ; 35 1c132: ed e5 ldi r30, 0x5D ; 93 1c134: f5 e1 ldi r31, 0x15 ; 21 1c136: aa e3 ldi r26, 0x3A ; 58 1c138: b5 e1 ldi r27, 0x15 ; 21 1c13a: 01 90 ld r0, Z+ 1c13c: 0d 92 st X+, r0 1c13e: 9a 95 dec r25 1c140: e1 f7 brne .-8 ; 0x1c13a 1c142: 2d e5 ldi r18, 0x5D ; 93 1c144: 35 e1 ldi r19, 0x15 ; 21 for (uint8_t d = 0; d < workDirDepth; d++) 1c146: 90 e0 ldi r25, 0x00 ; 0 1c148: 98 17 cp r25, r24 1c14a: 60 f4 brcc .+24 ; 0x1c164 { workDirParents[d] = workDirParents[d+1]; 1c14c: 43 e2 ldi r20, 0x23 ; 35 1c14e: f9 01 movw r30, r18 1c150: b3 96 adiw r30, 0x23 ; 35 1c152: d9 01 movw r26, r18 1c154: 01 90 ld r0, Z+ 1c156: 0d 92 st X+, r0 1c158: 4a 95 dec r20 1c15a: e1 f7 brne .-8 ; 0x1c154 { if(workDirDepth > 0) { --workDirDepth; workDir = workDirParents[0]; for (uint8_t d = 0; d < workDirDepth; d++) 1c15c: 9f 5f subi r25, 0xFF ; 255 1c15e: 2d 5d subi r18, 0xDD ; 221 1c160: 3f 4f sbci r19, 0xFF ; 255 1c162: f2 cf rjmp .-28 ; 0x1c148 { workDirParents[d] = workDirParents[d+1]; } #ifdef SDCARD_SORT_ALPHA presort(); 1c164: 0f 94 89 7d call 0x2fb12 ; 0x2fb12 } static void lcd_sd_updir() { card.updir(); menu_top = 0; 1c168: 10 92 a3 03 sts 0x03A3, r1 ; 0x8003a3 lcd_encoder = 0; 1c16c: 10 92 70 06 sts 0x0670, r1 ; 0x800670 1c170: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f menu_data_reset(); //Forces reloading of cached variables. 1c174: 0d 94 ac d1 jmp 0x3a358 ; 0x3a358 0001c178 : } backlight_save(); } static void lcd_backlight_menu() { 1c178: ef 92 push r14 1c17a: ff 92 push r15 1c17c: 0f 93 push r16 1c17e: 1f 93 push r17 1c180: cf 93 push r28 1c182: df 93 push r29 MENU_BEGIN(); 1c184: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c188: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c18c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c190: 84 30 cpi r24, 0x04 ; 4 1c192: 08 f0 brcs .+2 ; 0x1c196 1c194: 63 c0 rjmp .+198 ; 0x1c25c 1c196: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 1c19a: 0f 94 0a d0 call 0x3a014 ; 0x3a014 1c19e: 81 11 cpse r24, r1 1c1a0: 0e 94 cf 89 call 0x1139e ; 0x1139e backlight_save(); ); MENU_ITEM_BACK_P(_T(MSG_BACK)); 1c1a4: 8f e4 ldi r24, 0x4F ; 79 1c1a6: 99 e4 ldi r25, 0x49 ; 73 1c1a8: 0e 94 44 72 call 0xe488 ; 0xe488 1c1ac: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_EDIT_int3_P(_T(MSG_BL_HIGH), &backlightLevel_HIGH, backlightLevel_LOW, 255); 1c1b0: c0 91 ff 03 lds r28, 0x03FF ; 0x8003ff 1c1b4: d0 e0 ldi r29, 0x00 ; 0 1c1b6: 8b ed ldi r24, 0xDB ; 219 1c1b8: 97 e4 ldi r25, 0x47 ; 71 1c1ba: 0e 94 44 72 call 0xe488 ; 0xe488 1c1be: f1 2c mov r15, r1 1c1c0: e1 2c mov r14, r1 1c1c2: 0f ef ldi r16, 0xFF ; 255 1c1c4: 10 e0 ldi r17, 0x00 ; 0 1c1c6: 9e 01 movw r18, r28 1c1c8: 48 e0 ldi r20, 0x08 ; 8 1c1ca: 60 e0 ldi r22, 0x00 ; 0 1c1cc: 74 e0 ldi r23, 0x04 ; 4 1c1ce: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_BL_LOW), &backlightLevel_LOW, 0, backlightLevel_HIGH); 1c1d2: 00 91 00 04 lds r16, 0x0400 ; 0x800400 1c1d6: 10 e0 ldi r17, 0x00 ; 0 1c1d8: 8c ec ldi r24, 0xCC ; 204 1c1da: 97 e4 ldi r25, 0x47 ; 71 1c1dc: 0e 94 44 72 call 0xe488 ; 0xe488 1c1e0: 30 e0 ldi r19, 0x00 ; 0 1c1e2: 20 e0 ldi r18, 0x00 ; 0 1c1e4: 48 e0 ldi r20, 0x08 ; 8 1c1e6: 6f ef ldi r22, 0xFF ; 255 1c1e8: 73 e0 ldi r23, 0x03 ; 3 1c1ea: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_TOGGLE_P(_T(MSG_MODE), ((backlightMode==BACKLIGHT_MODE_BRIGHT) ? _T(MSG_BRIGHT) : ((backlightMode==BACKLIGHT_MODE_DIM) ? _T(MSG_DIM) : _T(MSG_AUTO))), backlight_mode_toggle); 1c1ee: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 1c1f2: 81 30 cpi r24, 0x01 ; 1 1c1f4: 59 f5 brne .+86 ; 0x1c24c 1c1f6: 83 ec ldi r24, 0xC3 ; 195 1c1f8: 97 e4 ldi r25, 0x47 ; 71 1c1fa: 0e 94 44 72 call 0xe488 ; 0xe488 1c1fe: ec 01 movw r28, r24 1c200: 8f ea ldi r24, 0xAF ; 175 1c202: 97 e4 ldi r25, 0x47 ; 71 1c204: 0e 94 44 72 call 0xe488 ; 0xe488 1c208: 22 e0 ldi r18, 0x02 ; 2 1c20a: 45 e3 ldi r20, 0x35 ; 53 1c20c: 51 ee ldi r21, 0xE1 ; 225 1c20e: be 01 movw r22, r28 1c210: 0f 94 19 d3 call 0x3a632 ; 0x3a632 MENU_ITEM_EDIT_int3_P(_T(MSG_TIMEOUT), &backlightTimer_period, LCD_BACKLIGHT_TIMEOUT, LCD_BACKLIGHT_TIMEOUT*60); 1c214: 85 ea ldi r24, 0xA5 ; 165 1c216: 97 e4 ldi r25, 0x47 ; 71 1c218: 0e 94 44 72 call 0xe488 ; 0xe488 1c21c: f1 2c mov r15, r1 1c21e: e1 2c mov r14, r1 1c220: 04 e8 ldi r16, 0x84 ; 132 1c222: 13 e0 ldi r17, 0x03 ; 3 1c224: 2f e0 ldi r18, 0x0F ; 15 1c226: 30 e0 ldi r19, 0x00 ; 0 1c228: 40 e1 ldi r20, 0x10 ; 16 1c22a: 6d e4 ldi r22, 0x4D ; 77 1c22c: 72 e0 ldi r23, 0x02 ; 2 1c22e: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_END(); 1c232: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc backlight_save(); } static void lcd_backlight_menu() { MENU_BEGIN(); 1c236: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c23a: 8f 5f subi r24, 0xFF ; 255 1c23c: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c240: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c244: 8f 5f subi r24, 0xFF ; 255 1c246: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c24a: a0 cf rjmp .-192 ; 0x1c18c ); MENU_ITEM_BACK_P(_T(MSG_BACK)); MENU_ITEM_EDIT_int3_P(_T(MSG_BL_HIGH), &backlightLevel_HIGH, backlightLevel_LOW, 255); MENU_ITEM_EDIT_int3_P(_T(MSG_BL_LOW), &backlightLevel_LOW, 0, backlightLevel_HIGH); MENU_ITEM_TOGGLE_P(_T(MSG_MODE), ((backlightMode==BACKLIGHT_MODE_BRIGHT) ? _T(MSG_BRIGHT) : ((backlightMode==BACKLIGHT_MODE_DIM) ? _T(MSG_DIM) : _T(MSG_AUTO))), backlight_mode_toggle); 1c24c: 81 11 cpse r24, r1 1c24e: 03 c0 rjmp .+6 ; 0x1c256 1c250: 8d eb ldi r24, 0xBD ; 189 1c252: 97 e4 ldi r25, 0x47 ; 71 1c254: d2 cf rjmp .-92 ; 0x1c1fa 1c256: 86 eb ldi r24, 0xB6 ; 182 1c258: 97 e4 ldi r25, 0x47 ; 71 1c25a: cf cf rjmp .-98 ; 0x1c1fa MENU_ITEM_EDIT_int3_P(_T(MSG_TIMEOUT), &backlightTimer_period, LCD_BACKLIGHT_TIMEOUT, LCD_BACKLIGHT_TIMEOUT*60); MENU_END(); } 1c25c: df 91 pop r29 1c25e: cf 91 pop r28 1c260: 1f 91 pop r17 1c262: 0f 91 pop r16 1c264: ff 90 pop r15 1c266: ef 90 pop r14 1c268: 08 95 ret 0001c26a : } #ifdef LCD_BL_PIN static void backlight_mode_toggle() { switch (backlightMode) 1c26a: 80 91 4f 02 lds r24, 0x024F ; 0x80024f 1c26e: 88 23 and r24, r24 1c270: 31 f0 breq .+12 ; 0x1c27e 1c272: 81 30 cpi r24, 0x01 ; 1 1c274: 41 f4 brne .+16 ; 0x1c286 { case BACKLIGHT_MODE_BRIGHT: backlightMode = BACKLIGHT_MODE_DIM; break; 1c276: 10 92 4f 02 sts 0x024F, r1 ; 0x80024f case BACKLIGHT_MODE_DIM: backlightMode = BACKLIGHT_MODE_AUTO; break; case BACKLIGHT_MODE_AUTO: backlightMode = BACKLIGHT_MODE_BRIGHT; break; default: backlightMode = BACKLIGHT_MODE_BRIGHT; break; } backlight_save(); 1c27a: 0c 94 cf 89 jmp 0x1139e ; 0x1139e static void backlight_mode_toggle() { switch (backlightMode) { case BACKLIGHT_MODE_BRIGHT: backlightMode = BACKLIGHT_MODE_DIM; break; case BACKLIGHT_MODE_DIM: backlightMode = BACKLIGHT_MODE_AUTO; break; 1c27e: 82 e0 ldi r24, 0x02 ; 2 case BACKLIGHT_MODE_AUTO: backlightMode = BACKLIGHT_MODE_BRIGHT; break; 1c280: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f 1c284: fa cf rjmp .-12 ; 0x1c27a 1c286: 81 e0 ldi r24, 0x01 ; 1 1c288: fb cf rjmp .-10 ; 0x1c280 0001c28a : static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); } static void mmu_preload_filament_menu() { 1c28a: cf 93 push r28 MENU_BEGIN(); 1c28c: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c290: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c294: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c298: 84 30 cpi r24, 0x04 ; 4 1c29a: 60 f5 brcc .+88 ; 0x1c2f4 1c29c: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1c2a0: 8b e3 ldi r24, 0x3B ; 59 1c2a2: 98 e4 ldi r25, 0x48 ; 72 1c2a4: 0e 94 44 72 call 0xe488 ; 0xe488 1c2a8: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper); 1c2ac: 8d e6 ldi r24, 0x6D ; 109 1c2ae: 95 e4 ldi r25, 0x45 ; 69 1c2b0: 0e 94 44 72 call 0xe488 ; 0xe488 1c2b4: 69 e3 ldi r22, 0x39 ; 57 1c2b6: 72 ee ldi r23, 0xE2 ; 226 1c2b8: 0f 94 07 d1 call 0x3a20e ; 0x3a20e for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1c2bc: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); 1c2be: 82 e3 ldi r24, 0x32 ; 50 1c2c0: 96 e4 ldi r25, 0x46 ; 70 1c2c2: 0e 94 44 72 call 0xe488 ; 0xe488 1c2c6: 61 e3 ldi r22, 0x31 ; 49 1c2c8: 6c 0f add r22, r28 1c2ca: 2c 2f mov r18, r28 1c2cc: 48 e4 ldi r20, 0x48 ; 72 1c2ce: 52 ee ldi r21, 0xE2 ; 226 1c2d0: 0f 94 b0 d0 call 0x3a160 ; 0x3a160 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++) 1c2d4: cf 5f subi r28, 0xFF ; 255 1c2d6: c5 30 cpi r28, 0x05 ; 5 1c2d8: 91 f7 brne .-28 ; 0x1c2be MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i); MENU_END(); 1c2da: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); } static void mmu_preload_filament_menu() { MENU_BEGIN(); 1c2de: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c2e2: 8f 5f subi r24, 0xFF ; 255 1c2e4: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c2e8: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c2ec: 8f 5f subi r24, 0xFF ; 255 1c2ee: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c2f2: d0 cf rjmp .-96 ; 0x1c294 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(); } 1c2f4: cf 91 pop r28 1c2f6: 08 95 ret 0001c2f8 : static void lcd_mmuCutFilament() { preheat_or_continue(FilamentAction::MmuCut); } static void lcd_mmuLoadFilament() { preheat_or_continue(FilamentAction::MmuLoad); 1c2f8: 84 e0 ldi r24, 0x04 ; 4 1c2fa: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0001c2fe : } static void lcd_mmuUnloadFilament() { preheat_or_continue(FilamentAction::MmuUnLoad); 1c2fe: 85 e0 ldi r24, 0x05 ; 5 1c300: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0001c304 : } static void lcd_mmuEjectFilament() { preheat_or_continue(FilamentAction::MmuEject); 1c304: 86 e0 ldi r24, 0x06 ; 6 1c306: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0001c30a : static void lcd_mmuLoadingTest() { preheat_or_continue(FilamentAction::MmuLoadingTest); } static void lcd_mmuCutFilament() { preheat_or_continue(FilamentAction::MmuCut); 1c30a: 87 e0 ldi r24, 0x07 ; 7 1c30c: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0001c310 : 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); 1c310: 88 e0 ldi r24, 0x08 ; 8 1c312: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0001c316 : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1c316: 60 91 e0 03 lds r22, 0x03E0 ; 0x8003e0 1c31a: 81 ea ldi r24, 0xA1 ; 161 1c31c: 9d e0 ldi r25, 0x0D ; 13 1c31e: 0f 94 34 dc call 0x3b868 ; 0x3b868 } static void change_sheet() { eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), selected_sheet); menu_back(3); 1c322: 83 e0 ldi r24, 0x03 ; 3 1c324: 0d 94 36 d4 jmp 0x3a86c ; 0x3a86c 0001c328 : // Clear the filament action clearFilamentAction(); } static void mmu_loading_test_menu() { 1c328: cf 93 push r28 MENU_BEGIN(); 1c32a: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c32e: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c332: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c336: 84 30 cpi r24, 0x04 ; 4 1c338: 88 f5 brcc .+98 ; 0x1c39c 1c33a: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 1c33e: 0f 94 0a d0 call 0x3a014 ; 0x3a014 1c342: 81 11 cpse r24, r1 1c344: 0f 94 6f 21 call 0x242de ; 0x242de clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1c348: 8b e3 ldi r24, 0x3B ; 59 1c34a: 98 e4 ldi r25, 0x48 ; 72 1c34c: 0e 94 44 72 call 0xe488 ; 0xe488 1c350: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper); 1c354: 8d e6 ldi r24, 0x6D ; 109 1c356: 95 e4 ldi r25, 0x45 ; 69 1c358: 0e 94 44 72 call 0xe488 ; 0xe488 1c35c: 68 e6 ldi r22, 0x68 ; 104 1c35e: 7a e3 ldi r23, 0x3A ; 58 1c360: 0f 94 07 d1 call 0x3a20e ; 0x3a20e for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1c364: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); 1c366: 82 e3 ldi r24, 0x32 ; 50 1c368: 96 e4 ldi r25, 0x46 ; 70 1c36a: 0e 94 44 72 call 0xe488 ; 0xe488 1c36e: 61 e3 ldi r22, 0x31 ; 49 1c370: 6c 0f add r22, r28 1c372: 2c 2f mov r18, r28 1c374: 44 ee ldi r20, 0xE4 ; 228 1c376: 59 e3 ldi r21, 0x39 ; 57 1c378: 0f 94 b0 d0 call 0x3a160 ; 0x3a160 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++) 1c37c: cf 5f subi r28, 0xFF ; 255 1c37e: c5 30 cpi r28, 0x05 ; 5 1c380: 91 f7 brne .-28 ; 0x1c366 MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i); MENU_END(); 1c382: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc // Clear the filament action clearFilamentAction(); } static void mmu_loading_test_menu() { MENU_BEGIN(); 1c386: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c38a: 8f 5f subi r24, 0xFF ; 255 1c38c: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c390: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c394: 8f 5f subi r24, 0xFF ; 255 1c396: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c39a: cb cf rjmp .-106 ; 0x1c332 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(); } 1c39c: cf 91 pop r28 1c39e: 08 95 ret 0001c3a0 : } // 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)) { 1c3a0: ef 92 push r14 1c3a2: ff 92 push r15 1c3a4: 0f 93 push r16 1c3a6: 1f 93 push r17 1c3a8: cf 93 push r28 1c3aa: 8c 01 movw r16, r24 1c3ac: 7b 01 movw r14, r22 MENU_BEGIN(); 1c3ae: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c3b2: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c3b6: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c3ba: 84 30 cpi r24, 0x04 ; 4 1c3bc: 28 f5 brcc .+74 ; 0x1c408 1c3be: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 1c3c2: 0f 94 0a d0 call 0x3a014 ; 0x3a014 1c3c6: 81 11 cpse r24, r1 1c3c8: 0f 94 6f 21 call 0x242de ; 0x242de clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); 1c3cc: 8b e3 ldi r24, 0x3B ; 59 1c3ce: 98 e4 ldi r25, 0x48 ; 72 1c3d0: 0e 94 44 72 call 0xe488 ; 0xe488 1c3d4: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1c3d8: c0 e0 ldi r28, 0x00 ; 0 MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); 1c3da: 61 e3 ldi r22, 0x31 ; 49 1c3dc: 6c 0f add r22, r28 1c3de: 2c 2f mov r18, r28 1c3e0: a7 01 movw r20, r14 1c3e2: c8 01 movw r24, r16 1c3e4: 0f 94 b0 d0 call 0x3a160 ; 0x3a160 MENU_BEGIN(); ON_MENU_LEAVE( clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(MSG_MAIN)); for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++) 1c3e8: cf 5f subi r28, 0xFF ; 255 1c3ea: c5 30 cpi r28, 0x05 ; 5 1c3ec: b1 f7 brne .-20 ; 0x1c3da MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i); MENU_END(); 1c3ee: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc // 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(); 1c3f2: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c3f6: 8f 5f subi r24, 0xFF ; 255 1c3f8: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c3fc: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c400: 8f 5f subi r24, 0xFF ; 255 1c402: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c406: d7 cf rjmp .-82 ; 0x1c3b6 ); 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(); } 1c408: cf 91 pop r28 1c40a: 1f 91 pop r17 1c40c: 0f 91 pop r16 1c40e: ff 90 pop r15 1c410: ef 90 pop r14 1c412: 08 95 ret 0001c414 : 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); 1c414: 8f e8 ldi r24, 0x8F ; 143 1c416: 9b e5 ldi r25, 0x5B ; 91 1c418: 0e 94 44 72 call 0xe488 ; 0xe488 1c41c: 62 e2 ldi r22, 0x22 ; 34 1c41e: 72 ee ldi r23, 0xE2 ; 226 1c420: 0c 94 d0 e1 jmp 0x1c3a0 ; 0x1c3a0 0001c424 : // Clear the filament action clearFilamentAction(); } static void mmu_fil_eject_menu() { mmu_common_choose_filament_menu(_T(MSG_EJECT_FROM_MMU), mmu_eject_filament); 1c424: 8e e9 ldi r24, 0x9E ; 158 1c426: 9b e5 ldi r25, 0x5B ; 91 1c428: 0e 94 44 72 call 0xe488 ; 0xe488 1c42c: 6e e2 ldi r22, 0x2E ; 46 1c42e: 72 ee ldi r23, 0xE2 ; 226 1c430: 0c 94 d0 e1 jmp 0x1c3a0 ; 0x1c3a0 0001c434 : 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); 1c434: 82 e3 ldi r24, 0x32 ; 50 1c436: 96 e4 ldi r25, 0x46 ; 70 1c438: 0e 94 44 72 call 0xe488 ; 0xe488 1c43c: 6c ee ldi r22, 0xEC ; 236 1c43e: 79 e3 ldi r23, 0x39 ; 57 1c440: 0c 94 d0 e1 jmp 0x1c3a0 ; 0x1c3a0 0001c444 : 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){ 1c444: cf 93 push r28 1c446: c8 2f mov r28, r24 IncrementMMUFails(); } } bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { if (!WaitForMMUReady()) { 1c448: 0f 94 78 88 call 0x310f0 ; 0x310f0 1c44c: 88 23 and r24, r24 1c44e: 21 f0 breq .+8 ; 0x1c458 1c450: 8c 2f mov r24, r28 MMU2::mmu2.cut_filament(index); } 1c452: cf 91 pop r28 1c454: 0d 94 09 ae jmp 0x35c12 ; 0x35c12 1c458: cf 91 pop r28 1c45a: 08 95 ret 0001c45c : 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) { 1c45c: cf 93 push r28 1c45e: c8 2f mov r28, r24 menu_back(); 1c460: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 MMU2::mmu2.eject_filament(filament, true); 1c464: 61 e0 ldi r22, 0x01 ; 1 1c466: 8c 2f mov r24, r28 1c468: 0f 94 8c ad call 0x35b18 ; 0x35b18 // Clear the filament action clearFilamentAction(); } 1c46c: 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(); 1c46e: 0d 94 6f 21 jmp 0x242de ; 0x242de 0001c472 : } static inline void load_all_wrapper(){ for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ MMU2::mmu2.load_filament(i); 1c472: 80 e0 ldi r24, 0x00 ; 0 1c474: 0f 94 49 ad call 0x35a92 ; 0x35a92 1c478: 81 e0 ldi r24, 0x01 ; 1 1c47a: 0f 94 49 ad call 0x35a92 ; 0x35a92 1c47e: 82 e0 ldi r24, 0x02 ; 2 1c480: 0f 94 49 ad call 0x35a92 ; 0x35a92 1c484: 83 e0 ldi r24, 0x03 ; 3 1c486: 0f 94 49 ad call 0x35a92 ; 0x35a92 1c48a: 84 e0 ldi r24, 0x04 ; 4 1c48c: 0d 94 49 ad jmp 0x35a92 ; 0x35a92 0001c490 : } } static inline void load_filament_wrapper(uint8_t i){ MMU2::mmu2.load_filament(i); 1c490: 0d 94 49 ad jmp 0x35a92 ; 0x35a92 0001c494 : } #endif //TMC2130 #if (LANG_MODE != 0) static void menu_setlang(uint8_t lang) { 1c494: cf 93 push r28 1c496: c8 2f mov r28, r24 if (!lang_select(lang)) 1c498: 0e 94 cc 71 call 0xe398 ; 0xe398 1c49c: 81 11 cpse r24, r1 1c49e: 37 c0 rjmp .+110 ; 0x1c50e { if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_COPY_SEL_LANG), false, LCD_LEFT_BUTTON_CHOICE) == LCD_LEFT_BUTTON_CHOICE) 1c4a0: 80 ee ldi r24, 0xE0 ; 224 1c4a2: 9a e3 ldi r25, 0x3A ; 58 1c4a4: 0e 94 44 72 call 0xe488 ; 0xe488 1c4a8: 40 e0 ldi r20, 0x00 ; 0 1c4aa: 60 e0 ldi r22, 0x00 ; 0 1c4ac: 0f 94 2a 50 call 0x2a054 ; 0x2a054 1c4b0: 81 11 cpse r24, r1 1c4b2: 20 c0 rjmp .+64 ; 0x1c4f4 #endif //(LANG_MODE == 0) void lang_boot_update_start(uint8_t lang) { uint8_t cnt = lang_get_count(); 1c4b4: 0e 94 81 71 call 0xe302 ; 0xe302 if ((lang < 2) || (lang > cnt)) return; //only languages from xflash can be selected 1c4b8: c2 30 cpi r28, 0x02 ; 2 1c4ba: e0 f0 brcs .+56 ; 0x1c4f4 1c4bc: 8c 17 cp r24, r28 1c4be: d0 f0 brcs .+52 ; 0x1c4f4 softReset(); } void bootapp_reboot_user0(uint8_t reserved) { cli(); 1c4c0: f8 94 cli boot_app_magic = BOOT_APP_MAGIC; 1c4c2: 8a ea ldi r24, 0xAA ; 170 1c4c4: 95 e5 ldi r25, 0x55 ; 85 1c4c6: dc 01 movw r26, r24 1c4c8: 80 93 fc 1f sts 0x1FFC, r24 ; 0x801ffc <__bss_end+0x7dd> 1c4cc: 90 93 fd 1f sts 0x1FFD, r25 ; 0x801ffd <__bss_end+0x7de> 1c4d0: a0 93 fe 1f sts 0x1FFE, r26 ; 0x801ffe <__bss_end+0x7df> 1c4d4: b0 93 ff 1f sts 0x1FFF, r27 ; 0x801fff <__bss_end+0x7e0> boot_app_flags = BOOT_APP_FLG_USER0; 1c4d8: 80 e8 ldi r24, 0x80 ; 128 1c4da: 80 93 fb 1f sts 0x1FFB, r24 ; 0x801ffb <__bss_end+0x7dc> boot_copy_size = 0; 1c4de: 10 92 f9 1f sts 0x1FF9, r1 ; 0x801ff9 <__bss_end+0x7da> 1c4e2: 10 92 f8 1f sts 0x1FF8, r1 ; 0x801ff8 <__bss_end+0x7d9> bootapp_reboot_user0(lang << 3); 1c4e6: cc 0f add r28, r28 1c4e8: cc 0f add r28, r28 1c4ea: cc 0f add r28, r28 boot_reserved = reserved; 1c4ec: c0 93 fa 1f sts 0x1FFA, r28 ; 0x801ffa <__bss_end+0x7db> // bootapp_print_vars(); softReset(); 1c4f0: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 lang_boot_update_start(lang); lcd_update_enable(true); 1c4f4: 81 e0 ldi r24, 0x01 ; 1 1c4f6: 0e 94 bd 6e call 0xdd7a ; 0xdd7a menu_goto(lcd_language_menu, 0, true, true); 1c4fa: 21 e0 ldi r18, 0x01 ; 1 1c4fc: 41 e0 ldi r20, 0x01 ; 1 1c4fe: 70 e0 ldi r23, 0x00 ; 0 1c500: 60 e0 ldi r22, 0x00 ; 0 1c502: 8a e8 ldi r24, 0x8A ; 138 1c504: 93 ee ldi r25, 0xE3 ; 227 1c506: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 1c50a: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout } } 1c50e: cf 91 pop r28 1c510: 08 95 ret 0001c512 : #ifdef COMMUNITY_LANGUAGE_SUPPORT #ifdef XFLASH static void lcd_community_language_menu() { 1c512: cf 93 push r28 1c514: df 93 push r29 MENU_BEGIN(); 1c516: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c51a: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c51e: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c522: 84 30 cpi r24, 0x04 ; 4 1c524: 58 f5 brcc .+86 ; 0x1c57c 1c526: 10 92 14 05 sts 0x0514, r1 ; 0x800514 uint8_t cnt = lang_get_count(); 1c52a: 0e 94 81 71 call 0xe302 ; 0xe302 1c52e: d8 2f mov r29, r24 MENU_ITEM_BACK_P(_T(MSG_SELECT_LANGUAGE)); //Back to previous Menu 1c530: 8b e4 ldi r24, 0x4B ; 75 1c532: 94 e4 ldi r25, 0x44 ; 68 1c534: 0e 94 44 72 call 0xe488 ; 0xe488 1c538: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa for (uint8_t i = 8; i < cnt; i++) //all community languages 1c53c: c8 e0 ldi r28, 0x08 ; 8 1c53e: cd 17 cp r28, r29 1c540: 80 f4 brcc .+32 ; 0x1c562 if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) 1c542: 8c 2f mov r24, r28 1c544: 0e 94 32 71 call 0xe264 ; 0xe264 1c548: 0e 94 cb 70 call 0xe196 ; 0xe196 1c54c: 0f 94 38 d1 call 0x3a270 ; 0x3a270 1c550: 88 23 and r24, r24 1c552: 29 f0 breq .+10 ; 0x1c55e { menu_setlang(i); 1c554: 8c 2f mov r24, r28 return; } MENU_END(); } 1c556: df 91 pop r29 1c558: cf 91 pop r28 uint8_t cnt = lang_get_count(); MENU_ITEM_BACK_P(_T(MSG_SELECT_LANGUAGE)); //Back to previous Menu for (uint8_t i = 8; i < cnt; i++) //all community languages if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) { menu_setlang(i); 1c55a: 0c 94 4a e2 jmp 0x1c494 ; 0x1c494 static void lcd_community_language_menu() { MENU_BEGIN(); uint8_t cnt = lang_get_count(); MENU_ITEM_BACK_P(_T(MSG_SELECT_LANGUAGE)); //Back to previous Menu for (uint8_t i = 8; i < cnt; i++) //all community languages 1c55e: cf 5f subi r28, 0xFF ; 255 1c560: ee cf rjmp .-36 ; 0x1c53e if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) { menu_setlang(i); return; } MENU_END(); 1c562: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc #ifdef COMMUNITY_LANGUAGE_SUPPORT #ifdef XFLASH static void lcd_community_language_menu() { MENU_BEGIN(); 1c566: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c56a: 8f 5f subi r24, 0xFF ; 255 1c56c: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c570: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c574: 8f 5f subi r24, 0xFF ; 255 1c576: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c57a: d1 cf rjmp .-94 ; 0x1c51e { menu_setlang(i); return; } MENU_END(); } 1c57c: df 91 pop r29 1c57e: cf 91 pop r28 1c580: 08 95 ret 0001c582 : lcd_sheet_menu(); } static void sheets_menu() { MENU_BEGIN(); 1c582: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c586: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c58a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c58e: 84 30 cpi r24, 0x04 ; 4 1c590: 08 f0 brcs .+2 ; 0x1c594 1c592: 45 c0 rjmp .+138 ; 0x1c61e 1c594: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_HW_SETUP)); 1c598: 8a e7 ldi r24, 0x7A ; 122 1c59a: 94 e4 ldi r25, 0x44 ; 68 1c59c: 0e 94 44 72 call 0xe488 ; 0xe488 1c5a0: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[0], select_sheet_menu<0>); 1c5a4: 66 eb ldi r22, 0xB6 ; 182 1c5a6: 74 ed ldi r23, 0xD4 ; 212 1c5a8: 89 e4 ldi r24, 0x49 ; 73 1c5aa: 9d e0 ldi r25, 0x0D ; 13 1c5ac: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[1], select_sheet_menu<1>); 1c5b0: 61 eb ldi r22, 0xB1 ; 177 1c5b2: 74 ed ldi r23, 0xD4 ; 212 1c5b4: 84 e5 ldi r24, 0x54 ; 84 1c5b6: 9d e0 ldi r25, 0x0D ; 13 1c5b8: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[2], select_sheet_menu<2>); 1c5bc: 6c ea ldi r22, 0xAC ; 172 1c5be: 74 ed ldi r23, 0xD4 ; 212 1c5c0: 8f e5 ldi r24, 0x5F ; 95 1c5c2: 9d e0 ldi r25, 0x0D ; 13 1c5c4: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[3], select_sheet_menu<3>); 1c5c8: 67 ea ldi r22, 0xA7 ; 167 1c5ca: 74 ed ldi r23, 0xD4 ; 212 1c5cc: 8a e6 ldi r24, 0x6A ; 106 1c5ce: 9d e0 ldi r25, 0x0D ; 13 1c5d0: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[4], select_sheet_menu<4>); 1c5d4: 62 ea ldi r22, 0xA2 ; 162 1c5d6: 74 ed ldi r23, 0xD4 ; 212 1c5d8: 85 e7 ldi r24, 0x75 ; 117 1c5da: 9d e0 ldi r25, 0x0D ; 13 1c5dc: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[5], select_sheet_menu<5>); 1c5e0: 6d e9 ldi r22, 0x9D ; 157 1c5e2: 74 ed ldi r23, 0xD4 ; 212 1c5e4: 80 e8 ldi r24, 0x80 ; 128 1c5e6: 9d e0 ldi r25, 0x0D ; 13 1c5e8: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[6], select_sheet_menu<6>); 1c5ec: 68 e9 ldi r22, 0x98 ; 152 1c5ee: 74 ed ldi r23, 0xD4 ; 212 1c5f0: 8b e8 ldi r24, 0x8B ; 139 1c5f2: 9d e0 ldi r25, 0x0D ; 13 1c5f4: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[7], select_sheet_menu<7>); 1c5f8: 63 e9 ldi r22, 0x93 ; 147 1c5fa: 74 ed ldi r23, 0xD4 ; 212 1c5fc: 86 e9 ldi r24, 0x96 ; 150 1c5fe: 9d e0 ldi r25, 0x0D ; 13 1c600: 0f 94 b8 d3 call 0x3a770 ; 0x3a770 MENU_END(); 1c604: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc lcd_sheet_menu(); } static void sheets_menu() { MENU_BEGIN(); 1c608: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c60c: 8f 5f subi r24, 0xFF ; 255 1c60e: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c612: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c616: 8f 5f subi r24, 0xFF ; 255 1c618: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c61c: b6 cf rjmp .-148 ; 0x1c58a 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(); } 1c61e: 08 95 ret 0001c620 : lang_select(LANG_ID_PRI); } #endif static void wait_preheat() { 1c620: cf 92 push r12 1c622: df 92 push r13 1c624: ef 92 push r14 1c626: ff 92 push r15 current_position[Z_AXIS] = 100; //move in z axis to make space for loading filament 1c628: 80 e0 ldi r24, 0x00 ; 0 1c62a: 90 e0 ldi r25, 0x00 ; 0 1c62c: a8 ec ldi r26, 0xC8 ; 200 1c62e: b2 e4 ldi r27, 0x42 ; 66 1c630: 80 93 99 06 sts 0x0699, r24 ; 0x800699 1c634: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 1c638: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 1c63c: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); 1c640: 65 e5 ldi r22, 0x55 ; 85 1c642: 75 e5 ldi r23, 0x55 ; 85 1c644: 85 e5 ldi r24, 0x55 ; 85 1c646: 91 e4 ldi r25, 0x41 ; 65 1c648: 0f 94 3d c0 call 0x3807a ; 0x3807a delay_keep_alive(2000); 1c64c: 80 ed ldi r24, 0xD0 ; 208 1c64e: 97 e0 ldi r25, 0x07 ; 7 1c650: 0e 94 84 8c call 0x11908 ; 0x11908 lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 1c654: 8f ec ldi r24, 0xCF ; 207 1c656: 9b e3 ldi r25, 0x3B ; 59 1c658: 0e 94 44 72 call 0xe488 ; 0xe488 1c65c: 0f 94 c0 20 call 0x24180 ; 0x24180 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 1c660: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 1c664: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 1c668: 07 2e mov r0, r23 1c66a: 00 0c add r0, r0 1c66c: 88 0b sbc r24, r24 1c66e: 99 0b sbc r25, r25 1c670: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1c674: 9b 01 movw r18, r22 1c676: ac 01 movw r20, r24 while (fabs(degHotend(0) - degTargetHotend(0)) > TEMP_HYSTERESIS) { 1c678: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1c67c: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1c680: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1c684: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1c688: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1c68c: 9f 77 andi r25, 0x7F ; 127 1c68e: 20 e0 ldi r18, 0x00 ; 0 1c690: 30 e0 ldi r19, 0x00 ; 0 1c692: 40 ea ldi r20, 0xA0 ; 160 1c694: 50 e4 ldi r21, 0x40 ; 64 1c696: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1c69a: 18 16 cp r1, r24 1c69c: b4 f5 brge .+108 ; 0x1c70a lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); 1c69e: 8f ec ldi r24, 0xCF ; 207 1c6a0: 9b e3 ldi r25, 0x3B ; 59 1c6a2: 0e 94 44 72 call 0xe488 ; 0xe488 1c6a6: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_set_cursor(0, 4); 1c6aa: 64 e0 ldi r22, 0x04 ; 4 1c6ac: 80 e0 ldi r24, 0x00 ; 0 1c6ae: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 1c6b2: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 1c6b6: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 1c6ba: 07 2e mov r0, r23 1c6bc: 00 0c add r0, r0 1c6be: 88 0b sbc r24, r24 1c6c0: 99 0b sbc r25, r25 1c6c2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__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)); 1c6c6: 20 e0 ldi r18, 0x00 ; 0 1c6c8: 30 e0 ldi r19, 0x00 ; 0 1c6ca: 40 e0 ldi r20, 0x00 ; 0 1c6cc: 5f e3 ldi r21, 0x3F ; 63 1c6ce: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1c6d2: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1c6d6: 6b 01 movw r12, r22 1c6d8: 20 e0 ldi r18, 0x00 ; 0 1c6da: 30 e0 ldi r19, 0x00 ; 0 1c6dc: 40 e0 ldi r20, 0x00 ; 0 1c6de: 5f e3 ldi r21, 0x3F ; 63 1c6e0: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1c6e4: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1c6e8: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1c6ec: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1c6f0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1c6f4: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1c6f8: a6 01 movw r20, r12 1c6fa: 82 e8 ldi r24, 0x82 ; 130 1c6fc: 0f 94 55 22 call 0x244aa ; 0x244aa delay_keep_alive(1000); 1c700: 88 ee ldi r24, 0xE8 ; 232 1c702: 93 e0 ldi r25, 0x03 ; 3 1c704: 0e 94 84 8c call 0x11908 ; 0x11908 1c708: ab cf rjmp .-170 ; 0x1c660 } } 1c70a: ff 90 pop r15 1c70c: ef 90 pop r14 1c70e: df 90 pop r13 1c710: cf 90 pop r12 1c712: 08 95 ret 0001c714 : } #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL static void lcd_language_menu() { 1c714: cf 93 push r28 MENU_BEGIN(); 1c716: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1c71a: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1c71e: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c722: 84 30 cpi r24, 0x04 ; 4 1c724: 08 f0 brcs .+2 ; 0x1c728 1c726: 4a c0 rjmp .+148 ; 0x1c7bc 1c728: 10 92 14 05 sts 0x0514, r1 ; 0x800514 if (lang_is_selected()) MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); // 1c72c: 0e 94 b5 70 call 0xe16a ; 0xe16a 1c730: 88 23 and r24, r24 1c732: 31 f0 breq .+12 ; 0x1c740 1c734: 8a ee ldi r24, 0xEA ; 234 1c736: 97 e4 ldi r25, 0x47 ; 71 1c738: 0e 94 44 72 call 0xe488 ; 0xe488 1c73c: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language 1c740: 8e e6 ldi r24, 0x6E ; 110 1c742: 95 e6 ldi r25, 0x65 ; 101 1c744: 0e 94 cb 70 call 0xe196 ; 0xe196 1c748: 0f 94 38 d1 call 0x3a270 ; 0x3a270 1c74c: 88 23 and r24, r24 1c74e: 21 f0 breq .+8 ; 0x1c758 { menu_setlang(0); 1c750: 80 e0 ldi r24, 0x00 ; 0 MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); } 1c752: cf 91 pop r28 #else //XFLASH for (uint8_t i = 1; i < cnt; i++) //all seconday languages (MK2/25) #endif //XFLASH if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) { menu_setlang(i); 1c754: 0c 94 4a e2 jmp 0x1c494 ; 0x1c494 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(); 1c758: 0e 94 81 71 call 0xe302 ; 0xe302 menu_setlang(1); return; } } else for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8' for 7 official languages 1c75c: c2 e0 ldi r28, 0x02 ; 2 menu_setlang(0); return; } uint8_t cnt = lang_get_count(); #ifdef XFLASH if (cnt == 2) //display secondary language in case of clear xflash 1c75e: 82 30 cpi r24, 0x02 ; 2 1c760: 51 f4 brne .+20 ; 0x1c776 1c762: 0e 94 a2 70 call 0xe144 ; 0xe144 { if (menu_item_text_P(lang_get_name_by_code(lang_get_code(1)))) 1c766: 0e 94 cb 70 call 0xe196 ; 0xe196 1c76a: 0f 94 38 d1 call 0x3a270 ; 0x3a270 1c76e: 88 23 and r24, r24 1c770: 81 f0 breq .+32 ; 0x1c792 { menu_setlang(1); 1c772: 81 e0 ldi r24, 0x01 ; 1 1c774: ee cf rjmp .-36 ; 0x1c752 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) #endif //XFLASH if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i)))) 1c776: 8c 2f mov r24, r28 1c778: 0e 94 32 71 call 0xe264 ; 0xe264 1c77c: 0e 94 cb 70 call 0xe196 ; 0xe196 1c780: 0f 94 38 d1 call 0x3a270 ; 0x3a270 1c784: 88 23 and r24, r24 1c786: 11 f0 breq .+4 ; 0x1c78c { menu_setlang(i); 1c788: 8c 2f mov r24, r28 1c78a: e3 cf rjmp .-58 ; 0x1c752 menu_setlang(1); return; } } else for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8' for 7 official languages 1c78c: cf 5f subi r28, 0xFF ; 255 1c78e: c8 30 cpi r28, 0x08 ; 8 1c790: 91 f7 brne .-28 ; 0x1c776 return; } #ifdef COMMUNITY_LANGUAGE_SUPPORT #ifdef XFLASH MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); 1c792: 8a ef ldi r24, 0xFA ; 250 1c794: 9a e3 ldi r25, 0x3A ; 58 1c796: 0e 94 44 72 call 0xe488 ; 0xe488 1c79a: 69 e8 ldi r22, 0x89 ; 137 1c79c: 72 ee ldi r23, 0xE2 ; 226 1c79e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); 1c7a2: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL static void lcd_language_menu() { MENU_BEGIN(); 1c7a6: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1c7aa: 8f 5f subi r24, 0xFF ; 255 1c7ac: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1c7b0: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1c7b4: 8f 5f subi r24, 0xFF ; 255 1c7b6: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1c7ba: b1 cf rjmp .-158 ; 0x1c71e MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu); #endif //XFLASH #endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL MENU_END(); } 1c7bc: cf 91 pop r28 1c7be: 08 95 ret 0001c7c0 : 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()") { 1c7c0: cf 93 push r28 1c7c2: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da { //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); 1c7c6: c3 b1 in r28, 0x03 ; 3 lcd_puts_at_P(0, 0, MSG_PINDA); 1c7c8: 48 e0 ldi r20, 0x08 ; 8 1c7ca: 5a e6 ldi r21, 0x6A ; 106 1c7cc: 60 e0 ldi r22, 0x00 ; 0 1c7ce: 80 e0 ldi r24, 0x00 ; 0 1c7d0: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(LCD_WIDTH - 14, 0); 1c7d4: 60 e0 ldi r22, 0x00 ; 0 1c7d6: 86 e0 ldi r24, 0x06 ; 6 1c7d8: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print_state(pinda_state); 1c7dc: c4 fb bst r28, 4 1c7de: 88 27 eor r24, r24 1c7e0: 80 f9 bld r24, 0 1c7e2: 0f 94 66 20 call 0x240cc ; 0x240cc if (MMU2::mmu2.Enabled()) { 1c7e6: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1c7ea: 81 30 cpi r24, 0x01 ; 1 1c7ec: 99 f4 brne .+38 ; 0x1c814 inline bool Running() const { return state == State::Running; } inline bool FindaPressed() const { return regs8[0]; 1c7ee: c1 e0 ldi r28, 0x01 ; 1 1c7f0: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 1c7f4: 81 11 cpse r24, r1 1c7f6: 01 c0 rjmp .+2 ; 0x1c7fa 1c7f8: 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 1c7fa: 42 e0 ldi r20, 0x02 ; 2 1c7fc: 5a e6 ldi r21, 0x6A ; 106 1c7fe: 60 e0 ldi r22, 0x00 ; 0 1c800: 8a e0 ldi r24, 0x0A ; 10 1c802: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(LCD_WIDTH - 3, 0); 1c806: 60 e0 ldi r22, 0x00 ; 0 1c808: 81 e1 ldi r24, 0x11 ; 17 1c80a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print_state(finda_state); 1c80e: 8c 2f mov r24, r28 1c810: 0f 94 66 20 call 0x240cc ; 0x240cc 1c814: c1 e0 ldi r28, 0x01 ; 1 1c816: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 1c81a: 81 11 cpse r24, r1 1c81c: 01 c0 rjmp .+2 ; 0x1c820 1c81e: c0 e0 ldi r28, 0x00 ; 0 } #ifdef FILAMENT_SENSOR idler_state = fsensor.getFilamentPresent(); lcd_puts_at_P(0, 1, _T(MSG_FSENSOR)); 1c820: 8b e4 ldi r24, 0x4B ; 75 1c822: 97 e4 ldi r25, 0x47 ; 71 1c824: 0e 94 44 72 call 0xe488 ; 0xe488 1c828: ac 01 movw r20, r24 1c82a: 61 e0 ldi r22, 0x01 ; 1 1c82c: 80 e0 ldi r24, 0x00 ; 0 1c82e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(LCD_WIDTH - 3, 1); 1c832: 61 e0 ldi r22, 0x01 ; 1 1c834: 81 e1 ldi r24, 0x11 ; 17 1c836: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print_state(idler_state); 1c83a: 8c 2f mov r24, r28 1c83c: 0f 94 66 20 call 0x240cc ; 0x240cc // 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); 1c840: 62 e0 ldi r22, 0x02 ; 2 1c842: 80 e0 ldi r24, 0x00 ; 0 1c844: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(_N("B: %3d Xd:%6d\n" 1c848: 80 91 8f 0e lds r24, 0x0E8F ; 0x800e8f 1c84c: 8f 93 push r24 1c84e: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 1c852: 8f 93 push r24 1c854: 80 91 ba 0d lds r24, 0x0DBA ; 0x800dba 1c858: 1f 92 push r1 1c85a: 8f 93 push r24 1c85c: 80 91 96 03 lds r24, 0x0396 ; 0x800396 1c860: 8f 93 push r24 1c862: 80 91 95 03 lds r24, 0x0395 ; 0x800395 1c866: 8f 93 push r24 1c868: 80 91 b9 0d lds r24, 0x0DB9 ; 0x800db9 1c86c: 1f 92 push r1 1c86e: 8f 93 push r24 1c870: 8e ed ldi r24, 0xDE ; 222 1c872: 99 e6 ldi r25, 0x69 ; 105 1c874: 9f 93 push r25 1c876: 8f 93 push r24 1c878: 0e 94 51 6e call 0xdca2 ; 0xdca2 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(); 1c87c: 8d b7 in r24, 0x3d ; 61 1c87e: 9e b7 in r25, 0x3e ; 62 1c880: 0a 96 adiw r24, 0x0a ; 10 1c882: 0f b6 in r0, 0x3f ; 63 1c884: f8 94 cli 1c886: 9e bf out 0x3e, r25 ; 62 1c888: 0f be out 0x3f, r0 ; 63 1c88a: 8d bf out 0x3d, r24 ; 61 } 1c88c: 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(); 1c88e: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0001c892 : } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); } } void MMU2::Start() { 1c892: 1f 93 push r17 1c894: cf 93 push r28 1c896: df 93 push r29 } //uart init (io + FILE stream) void uart2_init(uint32_t baudRate) { DDRH &= ~0x01; 1c898: e1 e0 ldi r30, 0x01 ; 1 1c89a: f1 e0 ldi r31, 0x01 ; 1 1c89c: 80 81 ld r24, Z 1c89e: 8e 7f andi r24, 0xFE ; 254 1c8a0: 80 83 st Z, r24 PORTH |= 0x01; 1c8a2: e2 e0 ldi r30, 0x02 ; 2 1c8a4: f1 e0 ldi r31, 0x01 ; 1 1c8a6: 80 81 ld r24, Z 1c8a8: 81 60 ori r24, 0x01 ; 1 1c8aa: 80 83 st Z, r24 //#include void rbuf_ini(uint8_t* ptr, uint8_t l) { ptr[0] = l; 1c8ac: e9 e3 ldi r30, 0x39 ; 57 1c8ae: f5 e0 ldi r31, 0x05 ; 5 1c8b0: 90 e1 ldi r25, 0x10 ; 16 1c8b2: 90 83 st Z, r25 ptr[1] = 0; 1c8b4: 11 82 std Z+1, r1 ; 0x01 ptr[2] = 0; 1c8b6: 12 82 std Z+2, r1 ; 0x02 rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4); UCSR2A |= (1 << U2X2); // baudrate multiplier 1c8b8: e0 ed ldi r30, 0xD0 ; 208 1c8ba: f0 e0 ldi r31, 0x00 ; 0 1c8bc: 80 81 ld r24, Z 1c8be: 82 60 ori r24, 0x02 ; 2 1c8c0: 80 83 st Z, r24 UBRR2L = UART_BAUD_SELECT(baudRate, F_CPU); // select baudrate 1c8c2: 90 93 d4 00 sts 0x00D4, r25 ; 0x8000d4 <__TEXT_REGION_LENGTH__+0x7c20d4> UCSR2B = (1 << RXEN2) | (1 << TXEN2); // enable receiver and transmitter 1c8c6: e1 ed ldi r30, 0xD1 ; 209 1c8c8: f0 e0 ldi r31, 0x00 ; 0 1c8ca: 88 e1 ldi r24, 0x18 ; 24 1c8cc: 80 83 st Z, r24 UCSR2B |= (1 << RXCIE2); // enable rx interrupt 1c8ce: 80 81 ld r24, Z 1c8d0: 80 68 ori r24, 0x80 ; 128 1c8d2: 80 83 st Z, r24 fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream 1c8d4: e3 e9 ldi r30, 0x93 ; 147 1c8d6: f2 e1 ldi r31, 0x12 ; 18 1c8d8: 84 e2 ldi r24, 0x24 ; 36 1c8da: 9a e3 ldi r25, 0x3A ; 58 1c8dc: 91 87 std Z+9, r25 ; 0x09 1c8de: 80 87 std Z+8, r24 ; 0x08 1c8e0: 84 e4 ldi r24, 0x44 ; 68 1c8e2: 99 e3 ldi r25, 0x39 ; 57 1c8e4: 93 87 std Z+11, r25 ; 0x0b 1c8e6: 82 87 std Z+10, r24 ; 0x0a 1c8e8: 13 e0 ldi r17, 0x03 ; 3 1c8ea: 13 83 std Z+3, r17 ; 0x03 1c8ec: 15 86 std Z+13, r1 ; 0x0d 1c8ee: 14 86 std Z+12, r1 ; 0x0c namespace MMU2 { // On MK3 we cannot do actual power cycle on HW. Instead trigger a hardware reset. void power_on() { #ifdef MMU_HWRESET WRITE(MMU_RST_PIN, 1); 1c8f0: 9f b7 in r25, 0x3f ; 63 1c8f2: f8 94 cli 1c8f4: e5 e0 ldi r30, 0x05 ; 5 1c8f6: f1 e0 ldi r31, 0x01 ; 1 1c8f8: 80 81 ld r24, Z 1c8fa: 80 62 ori r24, 0x20 ; 32 1c8fc: 80 83 st Z, r24 1c8fe: 9f bf out 0x3f, r25 ; 63 SET_OUTPUT(MMU_RST_PIN); // setup reset pin 1c900: e4 e0 ldi r30, 0x04 ; 4 1c902: f1 e0 ldi r31, 0x01 ; 1 1c904: 80 81 ld r24, Z 1c906: 80 62 ori r24, 0x20 ; 32 1c908: 80 83 st Z, r24 #endif //MMU_HWRESET reset(); 1c90a: 0f 94 8e c5 call 0x38b1c ; 0x38b1c mmu2Serial.begin(MMU_BAUD); PowerOn(); mmu2Serial.flush(); // make sure the UART buffer is clear before starting communication SetCurrentTool(MMU2_NO_TOOL); 1c90e: 83 e6 ldi r24, 0x63 ; 99 1c910: 0f 94 f7 87 call 0x30fee ; 0x30fee retryAttempts--; } } void ProtocolLogic::ResetRetryAttempts() { SERIAL_ECHOLNPGM("ResetRetryAttempts"); 1c914: 80 ed ldi r24, 0xD0 ; 208 1c916: 96 ea ldi r25, 0xA6 ; 166 1c918: 0e 94 13 79 call 0xf226 ; 0xf226 retryAttempts = MAX_RETRIES; 1c91c: ca e4 ldi r28, 0x4A ; 74 1c91e: d3 e1 ldi r29, 0x13 ; 19 1c920: 10 93 9e 13 sts 0x139E, r17 ; 0x80139e } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 1c924: 85 e9 ldi r24, 0x95 ; 149 1c926: 9a ea ldi r25, 0xAA ; 170 1c928: 0e 94 13 79 call 0xf226 ; 0xf226 /// @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; } 1c92c: 8a e0 ldi r24, 0x0A ; 10 1c92e: 8c 8b std Y+20, r24 ; 0x14 // start the communication logic.ResetRetryAttempts(); logic.ResetCommunicationTimeoutAttempts(); state = xState::Connecting; 1c930: 82 e0 ldi r24, 0x02 ; 2 1c932: 80 93 b9 13 sts 0x13B9, r24 ; 0x8013b9 initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 1c936: 81 e0 ldi r24, 0x01 ; 1 1c938: 8d 8f std Y+29, r24 ; 0x1d currentScope = Scope::StartSeq; 1c93a: 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; 1c93c: 1c a2 std Y+36, r1 ; 0x24 LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 1c93e: 86 e0 ldi r24, 0x06 ; 6 1c940: 8c 83 std Y+4, r24 ; 0x04 SendVersion(0); 1c942: 80 e0 ldi r24, 0x00 ; 0 logic.Start(); } 1c944: df 91 pop r29 1c946: cf 91 pop r28 1c948: 1f 91 pop r17 1c94a: 0d 94 70 a5 jmp 0x34ae0 ; 0x34ae0 0001c94e : #endif // MMU_FORCE_STEALTH_MODE } static void mmu_enable_switch() { uint8_t current_state = eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED); 1c94e: 8c ea ldi r24, 0xAC ; 172 1c950: 9c e0 ldi r25, 0x0C ; 12 1c952: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (current_state) 1c956: 88 23 and r24, r24 1c958: 61 f0 breq .+24 ; 0x1c972 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 1c95a: 10 92 b9 13 sts 0x13B9, r1 ; 0x8013b9 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 1c95e: 10 92 67 13 sts 0x1367, r1 ; 0x801367 currentScope = Scope::Stopped; 1c962: 10 92 4c 13 sts 0x134C, r1 ; 0x80134c else { MMU2::mmu2.Start(); } eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED); 1c966: 8c ea ldi r24, 0xAC ; 172 1c968: 9c e0 ldi r25, 0x0C ; 12 1c96a: 0e 94 cc 75 call 0xeb98 ; 0xeb98 MMU2::mmu2.Status(); 1c96e: 0d 94 da 75 jmp 0x2ebb4 ; 0x2ebb4 { MMU2::mmu2.Stop(); } else { MMU2::mmu2.Start(); 1c972: 0e 94 49 e4 call 0x1c892 ; 0x1c892 1c976: f7 cf rjmp .-18 ; 0x1c966 0001c978 : //! //! @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) 1c978: 4f 92 push r4 1c97a: 5f 92 push r5 1c97c: 6f 92 push r6 1c97e: 7f 92 push r7 1c980: 8f 92 push r8 1c982: 9f 92 push r9 1c984: af 92 push r10 1c986: bf 92 push r11 1c988: cf 92 push r12 1c98a: df 92 push r13 1c98c: ef 92 push r14 1c98e: ff 92 push r15 1c990: 0f 93 push r16 1c992: 1f 93 push r17 1c994: cf 93 push r28 1c996: df 93 push r29 1c998: 6c 01 movw r12, r24 1c99a: 7b 01 movw r14, r22 1c99c: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 { //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); 1c9a0: 67 2b or r22, r23 1c9a2: 29 f0 breq .+10 ; 0x1c9ae 1c9a4: 06 e0 ldi r16, 0x06 ; 6 1c9a6: 81 30 cpi r24, 0x01 ; 1 1c9a8: 29 f0 breq .+10 ; 0x1c9b4 1c9aa: 05 e0 ldi r16, 0x05 ; 5 1c9ac: 03 c0 rjmp .+6 ; 0x1c9b4 1c9ae: 04 e0 ldi r16, 0x04 ; 4 1c9b0: 81 30 cpi r24, 0x01 ; 1 1c9b2: d9 f3 breq .-10 ; 0x1c9aa const uint8_t item_len = item?strlen_P(item):0; int8_t first = 0; int8_t cursor_pos = 1; lcd_clear(); 1c9b4: 0e 94 ab 6e call 0xdd56 ; 0xdd56 KEEPALIVE_STATE(PAUSED_FOR_USER); 1c9b8: 84 e0 ldi r24, 0x04 ; 4 1c9ba: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be { //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; 1c9be: 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; 1c9c0: 81 2c mov r8, r1 } if (cursor_pos > 3) { cursor_pos = 3; if (first < items_no - 3) 1c9c2: 03 50 subi r16, 0x03 ; 3 1c9c4: 11 0b sbc r17, r17 lcd_clear(); KEEPALIVE_STATE(PAUSED_FOR_USER); while (1) { manage_heater(); 1c9c6: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1c9ca: 81 e0 ldi r24, 0x01 ; 1 1c9cc: 0e 94 4f 8a call 0x1149e ; 0x1149e if (lcd_encoder) 1c9d0: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 1c9d4: 90 91 70 06 lds r25, 0x0670 ; 0x800670 1c9d8: 00 97 sbiw r24, 0x00 ; 0 1c9da: 09 f4 brne .+2 ; 0x1c9de 1c9dc: 9d c0 rjmp .+314 ; 0x1cb18 { if (lcd_encoder < 0) 1c9de: 97 ff sbrs r25, 7 1c9e0: 88 c0 rjmp .+272 ; 0x1caf2 { cursor_pos--; 1c9e2: c1 50 subi r28, 0x01 ; 1 if (lcd_encoder > 0) { cursor_pos++; } lcd_encoder = 0; 1c9e4: 10 92 70 06 sts 0x0670, r1 ; 0x800670 1c9e8: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f } if (cursor_pos > 3) 1c9ec: c4 30 cpi r28, 0x04 ; 4 1c9ee: 0c f4 brge .+2 ; 0x1c9f2 1c9f0: 86 c0 rjmp .+268 ; 0x1cafe { cursor_pos = 3; if (first < items_no - 3) 1c9f2: 88 2d mov r24, r8 1c9f4: 08 2c mov r0, r8 1c9f6: 00 0c add r0, r0 1c9f8: 99 0b sbc r25, r25 1c9fa: 80 17 cp r24, r16 1c9fc: 91 07 cpc r25, r17 1c9fe: 0c f0 brlt .+2 ; 0x1ca02 1ca00: 7a c0 rjmp .+244 ; 0x1caf6 { first++; 1ca02: 83 94 inc r8 lcd_clear(); 1ca04: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_encoder = 0; } if (cursor_pos > 3) { cursor_pos = 3; 1ca08: 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); 1ca0a: c1 14 cp r12, r1 1ca0c: d1 04 cpc r13, r1 1ca0e: 29 f0 breq .+10 ; 0x1ca1a 1ca10: a6 01 movw r20, r12 1ca12: 60 e0 ldi r22, 0x00 ; 0 1ca14: 80 e0 ldi r24, 0x00 ; 0 1ca16: 0e 94 8c 6e call 0xdd18 ; 0xdd18 const bool last_visible = (first == items_no - 3); 1ca1a: a8 2c mov r10, r8 1ca1c: 08 2c mov r0, r8 1ca1e: 00 0c add r0, r0 1ca20: bb 08 sbc r11, r11 const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3; 1ca22: e1 14 cp r14, r1 1ca24: f1 04 cpc r15, r1 1ca26: 29 f0 breq .+10 ; 0x1ca32 1ca28: 82 e0 ldi r24, 0x02 ; 2 1ca2a: 98 2e mov r9, r24 1ca2c: a0 16 cp r10, r16 1ca2e: b1 06 cpc r11, r17 1ca30: 11 f0 breq .+4 ; 0x1ca36 1ca32: 93 e0 ldi r25, 0x03 ; 3 1ca34: 99 2e mov r9, r25 for (uint_least8_t i = 0; i < ordinary_items; i++) 1ca36: d0 e0 ldi r29, 0x00 ; 0 { if (item) lcd_puts_at_P(1, i + 1, item); 1ca38: df 5f subi r29, 0xFF ; 255 1ca3a: 44 e5 ldi r20, 0x54 ; 84 1ca3c: 5d e6 ldi r21, 0x6D ; 109 1ca3e: 6d 2f mov r22, r29 1ca40: 81 e0 ldi r24, 0x01 ; 1 1ca42: 0e 94 8c 6e call 0xdd18 ; 0xdd18 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++) 1ca46: 9d 12 cpse r9, r29 1ca48: f7 cf rjmp .-18 ; 0x1ca38 1ca4a: 48 2c mov r4, r8 1ca4c: 08 2c mov r0, r8 1ca4e: 00 0c add r0, r0 1ca50: 55 08 sbc r5, r5 1ca52: 66 08 sbc r6, r6 1ca54: 77 08 sbc r7, r7 1ca56: 8f ef ldi r24, 0xFF ; 255 1ca58: 48 1a sub r4, r24 1ca5a: 58 0a sbc r5, r24 1ca5c: 68 0a sbc r6, r24 1ca5e: 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++) 1ca60: 91 2c mov r9, r1 { lcd_set_cursor(2 + item_len, i+1); 1ca62: 93 94 inc r9 1ca64: 69 2d mov r22, r9 1ca66: 8a e0 ldi r24, 0x0A ; 10 1ca68: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 1ca6c: c3 01 movw r24, r6 1ca6e: b2 01 movw r22, r4 1ca70: 0e 94 31 70 call 0xe062 ; 0xe062 1ca74: 8f ef ldi r24, 0xFF ; 255 1ca76: 48 1a sub r4, r24 1ca78: 58 0a sbc r5, r24 1ca7a: 68 0a sbc r6, r24 1ca7c: 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++) 1ca7e: d9 11 cpse r29, r9 1ca80: f0 cf rjmp .-32 ; 0x1ca62 { 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); 1ca82: e1 14 cp r14, r1 1ca84: f1 04 cpc r15, r1 1ca86: 41 f0 breq .+16 ; 0x1ca98 1ca88: a0 16 cp r10, r16 1ca8a: b1 06 cpc r11, r17 1ca8c: 29 f4 brne .+10 ; 0x1ca98 1ca8e: a7 01 movw r20, r14 1ca90: 63 e0 ldi r22, 0x03 ; 3 1ca92: 81 e0 ldi r24, 0x01 ; 1 1ca94: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 1, PSTR(" \n \n ")); 1ca98: 42 e4 ldi r20, 0x42 ; 66 1ca9a: 5e e8 ldi r21, 0x8E ; 142 1ca9c: 61 e0 ldi r22, 0x01 ; 1 1ca9e: 80 e0 ldi r24, 0x00 ; 0 1caa0: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc_at(0, cursor_pos, '>'); 1caa4: 4e e3 ldi r20, 0x3E ; 62 1caa6: 6c 2f mov r22, r28 1caa8: 80 e0 ldi r24, 0x00 ; 0 1caaa: 0e 94 98 6e call 0xdd30 ; 0xdd30 _delay(100); 1caae: 64 e6 ldi r22, 0x64 ; 100 1cab0: 70 e0 ldi r23, 0x00 ; 0 1cab2: 80 e0 ldi r24, 0x00 ; 0 1cab4: 90 e0 ldi r25, 0x00 ; 0 1cab6: 0f 94 2f 28 call 0x2505e ; 0x2505e if (lcd_clicked()) 1caba: 0e 94 95 70 call 0xe12a ; 0xe12a 1cabe: 88 23 and r24, r24 1cac0: 09 f4 brne .+2 ; 0x1cac4 1cac2: 81 cf rjmp .-254 ; 0x1c9c6 { KEEPALIVE_STATE(IN_HANDLER); 1cac4: 82 e0 ldi r24, 0x02 ; 2 1cac6: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be return(cursor_pos + first - 1); 1caca: 8f ef ldi r24, 0xFF ; 255 1cacc: 8c 0f add r24, r28 1cace: 88 0d add r24, r8 } } } 1cad0: df 91 pop r29 1cad2: cf 91 pop r28 1cad4: 1f 91 pop r17 1cad6: 0f 91 pop r16 1cad8: ff 90 pop r15 1cada: ef 90 pop r14 1cadc: df 90 pop r13 1cade: cf 90 pop r12 1cae0: bf 90 pop r11 1cae2: af 90 pop r10 1cae4: 9f 90 pop r9 1cae6: 8f 90 pop r8 1cae8: 7f 90 pop r7 1caea: 6f 90 pop r6 1caec: 5f 90 pop r5 1caee: 4f 90 pop r4 1caf0: 08 95 ret cursor_pos--; } if (lcd_encoder > 0) { cursor_pos++; 1caf2: cf 5f subi r28, 0xFF ; 255 1caf4: 77 cf rjmp .-274 ; 0x1c9e4 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); 1caf6: 87 e0 ldi r24, 0x07 ; 7 1caf8: 0f 94 c8 4e call 0x29d90 ; 0x29d90 1cafc: 85 cf rjmp .-246 ; 0x1ca08 } } if (cursor_pos < 1) 1cafe: c1 11 cpse r28, r1 1cb00: 84 cf rjmp .-248 ; 0x1ca0a { cursor_pos = 1; if (first > 0) 1cb02: 18 14 cp r1, r8 1cb04: 2c f4 brge .+10 ; 0x1cb10 { first--; 1cb06: 8a 94 dec r8 lcd_clear(); 1cb08: 0e 94 ab 6e call 0xdd56 ; 0xdd56 } } if (cursor_pos < 1) { cursor_pos = 1; 1cb0c: c1 e0 ldi r28, 0x01 ; 1 1cb0e: 7d cf rjmp .-262 ; 0x1ca0a if (first > 0) { first--; lcd_clear(); } else { // here we are at the very end of the list Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 1cb10: 87 e0 ldi r24, 0x07 ; 7 1cb12: 0f 94 c8 4e call 0x29d90 ; 0x29d90 1cb16: fa cf rjmp .-12 ; 0x1cb0c cursor_pos++; } lcd_encoder = 0; } if (cursor_pos > 3) 1cb18: c4 30 cpi r28, 0x04 ; 4 1cb1a: 0c f0 brlt .+2 ; 0x1cb1e 1cb1c: 6a cf rjmp .-300 ; 0x1c9f2 1cb1e: 75 cf rjmp .-278 ; 0x1ca0a 0001cb20 : 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() { 1cb20: cf 93 push r28 1cb22: df 93 push r29 if (MMU2::mmu2.Enabled()) { 1cb24: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1cb28: 81 30 cpi r24, 0x01 ; 1 1cb2a: e9 f4 brne .+58 ; 0x1cb66 const uint8_t filament = choose_menu_P( 1cb2c: 8f e6 ldi r24, 0x6F ; 111 1cb2e: 9b e3 ldi r25, 0x3B ; 59 1cb30: 0e 94 44 72 call 0xe488 ; 0xe488 1cb34: ec 01 movw r28, r24 1cb36: 8c e5 ldi r24, 0x5C ; 92 1cb38: 9b e3 ldi r25, 0x3B ; 59 1cb3a: 0e 94 44 72 call 0xe488 ; 0xe488 _T(MSG_SELECT_FILAMENT), MSG_FILAMENT,_T(MSG_CANCEL)); 1cb3e: be 01 movw r22, r28 1cb40: 0e 94 bc e4 call 0x1c978 ; 0x1c978 if (filament < MMU_FILAMENT_COUNT) { 1cb44: 85 30 cpi r24, 0x05 ; 5 1cb46: 98 f5 brcc .+102 ; 0x1cbae lay1cal_filament = filament; 1cb48: 80 93 f9 03 sts 0x03F9, r24 ; 0x8003f9 return; } } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; 1cb4c: 8a e0 ldi r24, 0x0A ; 10 1cb4e: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 menu_goto(lcd_generic_preheat_menu, 0, true); 1cb52: 20 e0 ldi r18, 0x00 ; 0 1cb54: 41 e0 ldi r20, 0x01 ; 1 1cb56: 70 e0 ldi r23, 0x00 ; 0 1cb58: 60 e0 ldi r22, 0x00 ; 0 1cb5a: 80 ef ldi r24, 0xF0 ; 240 1cb5c: 99 e3 ldi r25, 0x39 ; 57 } 1cb5e: df 91 pop r29 1cb60: cf 91 pop r28 } } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; menu_goto(lcd_generic_preheat_menu, 0, true); 1cb62: 0d 94 b4 d1 jmp 0x3a368 ; 0x3a368 menu_back(); return; } } #ifdef FILAMENT_SENSOR else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 1cb66: 8f e5 ldi r24, 0x5F ; 95 1cb68: 9f e0 ldi r25, 0x0F ; 15 1cb6a: 0f 94 10 dc call 0x3b820 ; 0x3b820 1cb6e: 81 11 cpse r24, r1 1cb70: ed cf rjmp .-38 ; 0x1cb4c { bool loaded = false; if (fsensor.isReady()) { 1cb72: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1cb76: 82 30 cpi r24, 0x02 ; 2 1cb78: f1 f4 brne .+60 ; 0x1cbb6 1cb7a: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 1cb7e: 81 11 cpse r24, r1 1cb80: e5 cf rjmp .-54 ; 0x1cb4c 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)); 1cb82: 8e e3 ldi r24, 0x3E ; 62 1cb84: 9b e3 ldi r25, 0x3B ; 59 1cb86: 0e 94 44 72 call 0xe488 ; 0xe488 1cb8a: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_consume_click(); 1cb8e: 0e 94 90 70 call 0xe120 ; 0xe120 1cb92: c4 e1 ldi r28, 0x14 ; 20 for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s delay_keep_alive(100); 1cb94: 84 e6 ldi r24, 0x64 ; 100 1cb96: 90 e0 ldi r25, 0x00 ; 0 1cb98: 0e 94 84 8c call 0x11908 ; 0x11908 if (lcd_clicked()) { 1cb9c: 0e 94 95 70 call 0xe12a ; 0xe12a 1cba0: 81 11 cpse r24, r1 1cba2: 02 c0 rjmp .+4 ; 0x1cba8 1cba4: 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 1cba6: b1 f7 brne .-20 ; 0x1cb94 delay_keep_alive(100); if (lcd_clicked()) { break; } } lcd_update_enabled = true; 1cba8: 81 e0 ldi r24, 0x01 ; 1 1cbaa: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e } #endif //FILAMENT_SENSOR eFilamentAction = FilamentAction::Lay1Cal; menu_goto(lcd_generic_preheat_menu, 0, true); } 1cbae: df 91 pop r29 1cbb0: cf 91 pop r28 if (lcd_clicked()) { break; } } lcd_update_enabled = true; menu_back(); 1cbb2: 0d 94 52 d4 jmp 0x3a8a4 ; 0x3a8a4 { 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); 1cbb6: 8a e6 ldi r24, 0x6A ; 106 1cbb8: 90 e4 ldi r25, 0x40 ; 64 1cbba: 0e 94 44 72 call 0xe488 ; 0xe488 1cbbe: 41 e0 ldi r20, 0x01 ; 1 1cbc0: 60 e0 ldi r22, 0x00 ; 0 1cbc2: 0f 94 2a 50 call 0x2a054 ; 0x2a054 1cbc6: 91 e0 ldi r25, 0x01 ; 1 1cbc8: 81 11 cpse r24, r1 1cbca: 90 e0 ldi r25, 0x00 ; 0 lcd_update_enabled = true; 1cbcc: 81 e0 ldi r24, 0x01 ; 1 1cbce: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e } if (!loaded) { 1cbd2: 91 11 cpse r25, r1 1cbd4: bb cf rjmp .-138 ; 0x1cb4c 1cbd6: d5 cf rjmp .-86 ; 0x1cb82 0001cbd8 : { const float a_ = !isnan(a) ? a : nanv; return (a_ * (1.f - f)) + (b * f); } void model_data::step(uint8_t heater_pwm, uint8_t fan_pwm, float heater_temp, float ambient_temp) 1cbd8: 2f 92 push r2 1cbda: 3f 92 push r3 1cbdc: 4f 92 push r4 1cbde: 5f 92 push r5 1cbe0: 6f 92 push r6 1cbe2: 7f 92 push r7 1cbe4: 8f 92 push r8 1cbe6: 9f 92 push r9 1cbe8: af 92 push r10 1cbea: bf 92 push r11 1cbec: cf 92 push r12 1cbee: df 92 push r13 1cbf0: ef 92 push r14 1cbf2: ff 92 push r15 1cbf4: 0f 93 push r16 1cbf6: 1f 93 push r17 1cbf8: cf 93 push r28 1cbfa: df 93 push r29 1cbfc: 00 d0 rcall .+0 ; 0x1cbfe 1cbfe: 00 d0 rcall .+0 ; 0x1cc00 1cc00: 1f 92 push r1 1cc02: cd b7 in r28, 0x3d ; 61 1cc04: de b7 in r29, 0x3e ; 62 1cc06: 69 83 std Y+1, r22 ; 0x01 1cc08: 49 01 movw r8, r18 1cc0a: 5a 01 movw r10, r20 1cc0c: 27 01 movw r4, r14 { constexpr float soft_pwm_inv = 1. / ((1 << 7) - 1); // input values const float heater_scale = soft_pwm_inv * heater_pwm; 1cc0e: 68 2f mov r22, r24 1cc10: 70 e0 ldi r23, 0x00 ; 0 1cc12: 90 e0 ldi r25, 0x00 ; 0 1cc14: 80 e0 ldi r24, 0x00 ; 0 1cc16: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1cc1a: 24 e0 ldi r18, 0x04 ; 4 1cc1c: 32 e0 ldi r19, 0x02 ; 2 1cc1e: 41 e0 ldi r20, 0x01 ; 1 1cc20: 5c e3 ldi r21, 0x3C ; 60 1cc22: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> const float cur_heater_temp = heater_temp; const float cur_ambient_temp = ambient_temp + Ta_corr; const float cur_R = R[fan_pwm]; // resistance at current fan power (K/W) float dP = P * heater_scale; // current power [W] 1cc26: 20 91 d9 12 lds r18, 0x12D9 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 1cc2a: 30 91 da 12 lds r19, 0x12DA ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 1cc2e: 40 91 db 12 lds r20, 0x12DB ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 1cc32: 50 91 dc 12 lds r21, 0x12DC ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> 1cc36: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cc3a: 6b 01 movw r12, r22 1cc3c: 7c 01 movw r14, r24 dP *= (cur_heater_temp * U) + V; // linear temp. correction 1cc3e: 20 91 dd 12 lds r18, 0x12DD ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 1cc42: 30 91 de 12 lds r19, 0x12DE ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 1cc46: 40 91 df 12 lds r20, 0x12DF ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 1cc4a: 50 91 e0 12 lds r21, 0x12E0 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> 1cc4e: c5 01 movw r24, r10 1cc50: b4 01 movw r22, r8 1cc52: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cc56: 20 91 e1 12 lds r18, 0x12E1 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 1cc5a: 30 91 e2 12 lds r19, 0x12E2 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 1cc5e: 40 91 e3 12 lds r20, 0x12E3 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 1cc62: 50 91 e4 12 lds r21, 0x12E4 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> 1cc66: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1cc6a: a7 01 movw r20, r14 1cc6c: 96 01 movw r18, r12 1cc6e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cc72: 6b 01 movw r12, r22 1cc74: 7c 01 movw r14, r24 constexpr float soft_pwm_inv = 1. / ((1 << 7) - 1); // input values const float heater_scale = soft_pwm_inv * heater_pwm; const float cur_heater_temp = heater_temp; const float cur_ambient_temp = ambient_temp + Ta_corr; 1cc76: 20 91 2f 13 lds r18, 0x132F ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 1cc7a: 30 91 30 13 lds r19, 0x1330 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 1cc7e: 40 91 31 13 lds r20, 0x1331 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 1cc82: 50 91 32 13 lds r21, 0x1332 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> 1cc86: c8 01 movw r24, r16 1cc88: b2 01 movw r22, r4 1cc8a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1cc8e: 9b 01 movw r18, r22 1cc90: ac 01 movw r20, r24 const float cur_R = R[fan_pwm]; // resistance at current fan power (K/W) float dP = P * heater_scale; // current power [W] dP *= (cur_heater_temp * U) + V; // linear temp. correction float dPl = (cur_heater_temp - cur_ambient_temp) / cur_R; // [W] leakage power 1cc92: c5 01 movw r24, r10 1cc94: b4 01 movw r22, r8 1cc96: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> // input values const float heater_scale = soft_pwm_inv * heater_pwm; const float cur_heater_temp = heater_temp; const float cur_ambient_temp = ambient_temp + Ta_corr; const float cur_R = R[fan_pwm]; // resistance at current fan power (K/W) 1cc9a: 39 81 ldd r19, Y+1 ; 0x01 1cc9c: 24 e0 ldi r18, 0x04 ; 4 1cc9e: 32 9f mul r19, r18 1cca0: f0 01 movw r30, r0 1cca2: 11 24 eor r1, r1 1cca4: e1 51 subi r30, 0x11 ; 17 1cca6: fd 4e sbci r31, 0xED ; 237 float dP = P * heater_scale; // current power [W] dP *= (cur_heater_temp * U) + V; // linear temp. correction float dPl = (cur_heater_temp - cur_ambient_temp) / cur_R; // [W] leakage power 1cca8: 20 81 ld r18, Z 1ccaa: 31 81 ldd r19, Z+1 ; 0x01 1ccac: 42 81 ldd r20, Z+2 ; 0x02 1ccae: 53 81 ldd r21, Z+3 ; 0x03 1ccb0: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1ccb4: 9b 01 movw r18, r22 1ccb6: ac 01 movw r20, r24 float dT = (dP - dPl) * C_i; // expected temperature difference (K) 1ccb8: c7 01 movw r24, r14 1ccba: b6 01 movw r22, r12 1ccbc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1ccc0: 20 91 3c 13 lds r18, 0x133C ; 0x80133c <_ZN13thermal_modelL4dataE.lto_priv.402+0x8d> 1ccc4: 30 91 3d 13 lds r19, 0x133D ; 0x80133d <_ZN13thermal_modelL4dataE.lto_priv.402+0x8e> 1ccc8: 40 91 3e 13 lds r20, 0x133E ; 0x80133e <_ZN13thermal_modelL4dataE.lto_priv.402+0x8f> 1cccc: 50 91 3f 13 lds r21, 0x133F ; 0x80133f <_ZN13thermal_modelL4dataE.lto_priv.402+0x90> 1ccd0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1ccd4: 6f 83 std Y+7, r22 ; 0x07 1ccd6: 79 83 std Y+1, r23 ; 0x01 1ccd8: 18 2f mov r17, r24 1ccda: 09 2f mov r16, r25 // filter and lag dT uint8_t dT_next_idx = (dT_lag_idx == (dT_lag_size - 1) ? 0: dT_lag_idx + 1); 1ccdc: 20 91 d0 12 lds r18, 0x12D0 ; 0x8012d0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x21> 1cce0: e2 2f mov r30, r18 1cce2: f0 e0 ldi r31, 0x00 ; 0 1cce4: 80 91 cf 12 lds r24, 0x12CF ; 0x8012cf <_ZN13thermal_modelL4dataE.lto_priv.402+0x20> 1cce8: 81 50 subi r24, 0x01 ; 1 1ccea: 99 0b sbc r25, r25 1ccec: e8 17 cp r30, r24 1ccee: f9 07 cpc r31, r25 1ccf0: 09 f4 brne .+2 ; 0x1ccf4 1ccf2: f4 c0 rjmp .+488 ; 0x1cedc 1ccf4: 2f 5f subi r18, 0xFF ; 255 1ccf6: 2e 83 std Y+6, r18 ; 0x06 float dT_lag = dT_lag_buf[dT_next_idx]; 1ccf8: 5e 81 ldd r21, Y+6 ; 0x06 1ccfa: 44 e0 ldi r20, 0x04 ; 4 1ccfc: 54 9f mul r21, r20 1ccfe: 10 01 movw r2, r0 1cd00: 11 24 eor r1, r1 1cd02: d1 01 movw r26, r2 1cd04: a1 55 subi r26, 0x51 ; 81 1cd06: bd 4e sbci r27, 0xED ; 237 1cd08: 2d 91 ld r18, X+ 1cd0a: 3d 91 ld r19, X+ 1cd0c: 4d 91 ld r20, X+ 1cd0e: 5c 91 ld r21, X 1cd10: 2a 83 std Y+2, r18 ; 0x02 1cd12: 3b 83 std Y+3, r19 ; 0x03 1cd14: 4c 83 std Y+4, r20 ; 0x04 1cd16: 5d 83 std Y+5, r21 ; 0x05 float dT_lag_prev = dT_lag_buf[dT_lag_idx]; 1cd18: ee 0f add r30, r30 1cd1a: ff 1f adc r31, r31 1cd1c: ee 0f add r30, r30 1cd1e: ff 1f adc r31, r31 1cd20: e1 55 subi r30, 0x51 ; 81 1cd22: fd 4e sbci r31, 0xED ; 237 1cd24: 40 80 ld r4, Z 1cd26: 51 80 ldd r5, Z+1 ; 0x01 1cd28: 62 80 ldd r6, Z+2 ; 0x02 1cd2a: 73 80 ldd r7, Z+3 ; 0x03 float dT_f = iir_mul(dT_lag_prev, dT, fS, dT); 1cd2c: c0 90 e9 12 lds r12, 0x12E9 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 1cd30: d0 90 ea 12 lds r13, 0x12EA ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 1cd34: e0 90 eb 12 lds r14, 0x12EB ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 1cd38: f0 90 ec 12 lds r15, 0x12EC ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> flag_bits.uninitialized = false; } static constexpr float iir_mul(const float a, const float b, const float f, const float nanv) { const float a_ = !isnan(a) ? a : nanv; 1cd3c: 92 01 movw r18, r4 1cd3e: a3 01 movw r20, r6 1cd40: b2 01 movw r22, r4 1cd42: c3 01 movw r24, r6 1cd44: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1cd48: 88 23 and r24, r24 1cd4a: 21 f0 breq .+8 ; 0x1cd54 1cd4c: 4f 80 ldd r4, Y+7 ; 0x07 1cd4e: 59 80 ldd r5, Y+1 ; 0x01 1cd50: 61 2e mov r6, r17 1cd52: 70 2e mov r7, r16 // filter and lag dT uint8_t dT_next_idx = (dT_lag_idx == (dT_lag_size - 1) ? 0: dT_lag_idx + 1); float dT_lag = dT_lag_buf[dT_next_idx]; float dT_lag_prev = dT_lag_buf[dT_lag_idx]; float dT_f = iir_mul(dT_lag_prev, dT, fS, dT); dT_lag_buf[dT_next_idx] = dT_f; 1cd54: a1 01 movw r20, r2 1cd56: 41 55 subi r20, 0x51 ; 81 1cd58: 5d 4e sbci r21, 0xED ; 237 1cd5a: 1a 01 movw r2, r20 } static constexpr float iir_mul(const float a, const float b, const float f, const float nanv) { const float a_ = !isnan(a) ? a : nanv; return (a_ * (1.f - f)) + (b * f); 1cd5c: a7 01 movw r20, r14 1cd5e: 96 01 movw r18, r12 1cd60: 60 e0 ldi r22, 0x00 ; 0 1cd62: 70 e0 ldi r23, 0x00 ; 0 1cd64: 80 e8 ldi r24, 0x80 ; 128 1cd66: 9f e3 ldi r25, 0x3F ; 63 1cd68: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1cd6c: 92 01 movw r18, r4 1cd6e: a3 01 movw r20, r6 1cd70: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cd74: 2b 01 movw r4, r22 1cd76: 3c 01 movw r6, r24 1cd78: a7 01 movw r20, r14 1cd7a: 96 01 movw r18, r12 1cd7c: 6f 81 ldd r22, Y+7 ; 0x07 1cd7e: 79 81 ldd r23, Y+1 ; 0x01 1cd80: 81 2f mov r24, r17 1cd82: 90 2f mov r25, r16 1cd84: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cd88: 9b 01 movw r18, r22 1cd8a: ac 01 movw r20, r24 1cd8c: c3 01 movw r24, r6 1cd8e: b2 01 movw r22, r4 1cd90: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> // filter and lag dT uint8_t dT_next_idx = (dT_lag_idx == (dT_lag_size - 1) ? 0: dT_lag_idx + 1); float dT_lag = dT_lag_buf[dT_next_idx]; float dT_lag_prev = dT_lag_buf[dT_lag_idx]; float dT_f = iir_mul(dT_lag_prev, dT, fS, dT); dT_lag_buf[dT_next_idx] = dT_f; 1cd94: f1 01 movw r30, r2 1cd96: 60 83 st Z, r22 1cd98: 71 83 std Z+1, r23 ; 0x01 1cd9a: 82 83 std Z+2, r24 ; 0x02 1cd9c: 93 83 std Z+3, r25 ; 0x03 dT_lag_idx = dT_next_idx; 1cd9e: fe 81 ldd r31, Y+6 ; 0x06 1cda0: f0 93 d0 12 sts 0x12D0, r31 ; 0x8012d0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x21> // calculate and filter dT_err float dT_err = (cur_heater_temp - T_prev) - dT_lag; 1cda4: 20 91 d5 12 lds r18, 0x12D5 ; 0x8012d5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x26> 1cda8: 30 91 d6 12 lds r19, 0x12D6 ; 0x8012d6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x27> 1cdac: 40 91 d7 12 lds r20, 0x12D7 ; 0x8012d7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x28> 1cdb0: 50 91 d8 12 lds r21, 0x12D8 ; 0x8012d8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x29> 1cdb4: c5 01 movw r24, r10 1cdb6: b4 01 movw r22, r8 1cdb8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1cdbc: 2a 81 ldd r18, Y+2 ; 0x02 1cdbe: 3b 81 ldd r19, Y+3 ; 0x03 1cdc0: 4c 81 ldd r20, Y+4 ; 0x04 1cdc2: 5d 81 ldd r21, Y+5 ; 0x05 1cdc4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1cdc8: 2b 01 movw r4, r22 1cdca: 3c 01 movw r6, r24 float dT_err_f = iir_mul(dT_err_prev, dT_err, THERMAL_MODEL_fE, 0.); 1cdcc: c0 90 d1 12 lds r12, 0x12D1 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 1cdd0: d0 90 d2 12 lds r13, 0x12D2 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 1cdd4: e0 90 d3 12 lds r14, 0x12D3 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 1cdd8: f0 90 d4 12 lds r15, 0x12D4 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> flag_bits.uninitialized = false; } static constexpr float iir_mul(const float a, const float b, const float f, const float nanv) { const float a_ = !isnan(a) ? a : nanv; 1cddc: a7 01 movw r20, r14 1cdde: 96 01 movw r18, r12 1cde0: c7 01 movw r24, r14 1cde2: b6 01 movw r22, r12 1cde4: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 1cde8: 88 23 and r24, r24 1cdea: 19 f0 breq .+6 ; 0x1cdf2 1cdec: c1 2c mov r12, r1 1cdee: d1 2c mov r13, r1 1cdf0: 76 01 movw r14, r12 return (a_ * (1.f - f)) + (b * f); 1cdf2: 23 e3 ldi r18, 0x33 ; 51 1cdf4: 33 e3 ldi r19, 0x33 ; 51 1cdf6: 43 e7 ldi r20, 0x73 ; 115 1cdf8: 5f e3 ldi r21, 0x3F ; 63 1cdfa: c7 01 movw r24, r14 1cdfc: b6 01 movw r22, r12 1cdfe: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1ce02: 6b 01 movw r12, r22 1ce04: 7c 01 movw r14, r24 1ce06: 2d ec ldi r18, 0xCD ; 205 1ce08: 3c ec ldi r19, 0xCC ; 204 1ce0a: 4c e4 ldi r20, 0x4C ; 76 1ce0c: 5d e3 ldi r21, 0x3D ; 61 1ce0e: c3 01 movw r24, r6 1ce10: b2 01 movw r22, r4 1ce12: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1ce16: 9b 01 movw r18, r22 1ce18: ac 01 movw r20, r24 1ce1a: c7 01 movw r24, r14 1ce1c: b6 01 movw r22, r12 1ce1e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> dT_lag_idx = dT_next_idx; // calculate and filter dT_err float dT_err = (cur_heater_temp - T_prev) - dT_lag; float dT_err_f = iir_mul(dT_err_prev, dT_err, THERMAL_MODEL_fE, 0.); T_prev = cur_heater_temp; 1ce22: 80 92 d5 12 sts 0x12D5, r8 ; 0x8012d5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x26> 1ce26: 90 92 d6 12 sts 0x12D6, r9 ; 0x8012d6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x27> 1ce2a: a0 92 d7 12 sts 0x12D7, r10 ; 0x8012d7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x28> 1ce2e: b0 92 d8 12 sts 0x12D8, r11 ; 0x8012d8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x29> dT_err_prev = dT_err_f; 1ce32: 60 93 d1 12 sts 0x12D1, r22 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 1ce36: 70 93 d2 12 sts 0x12D2, r23 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 1ce3a: 80 93 d3 12 sts 0x12D3, r24 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 1ce3e: 90 93 d4 12 sts 0x12D4, r25 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> // check and trigger errors flag_bits.error = (fabsf(dT_err_f) > err_s); 1ce42: 6b 01 movw r12, r22 1ce44: 7c 01 movw r14, r24 1ce46: e8 94 clt 1ce48: f7 f8 bld r15, 7 1ce4a: 21 e0 ldi r18, 0x01 ; 1 1ce4c: 29 83 std Y+1, r18 ; 0x01 1ce4e: 20 91 44 13 lds r18, 0x1344 ; 0x801344 <_ZN13thermal_modelL4dataE.lto_priv.402+0x95> 1ce52: 30 91 45 13 lds r19, 0x1345 ; 0x801345 <_ZN13thermal_modelL4dataE.lto_priv.402+0x96> 1ce56: 40 91 46 13 lds r20, 0x1346 ; 0x801346 <_ZN13thermal_modelL4dataE.lto_priv.402+0x97> 1ce5a: 50 91 47 13 lds r21, 0x1347 ; 0x801347 <_ZN13thermal_modelL4dataE.lto_priv.402+0x98> 1ce5e: c7 01 movw r24, r14 1ce60: b6 01 movw r22, r12 1ce62: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1ce66: 18 16 cp r1, r24 1ce68: 0c f0 brlt .+2 ; 0x1ce6c 1ce6a: 19 82 std Y+1, r1 ; 0x01 1ce6c: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 1ce70: 39 81 ldd r19, Y+1 ; 0x01 1ce72: 30 fb bst r19, 0 1ce74: 81 f9 bld r24, 1 1ce76: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> flag_bits.warning = (fabsf(dT_err_f) > warn_s); 1ce7a: 41 e0 ldi r20, 0x01 ; 1 1ce7c: 49 83 std Y+1, r20 ; 0x01 1ce7e: 20 91 40 13 lds r18, 0x1340 ; 0x801340 <_ZN13thermal_modelL4dataE.lto_priv.402+0x91> 1ce82: 30 91 41 13 lds r19, 0x1341 ; 0x801341 <_ZN13thermal_modelL4dataE.lto_priv.402+0x92> 1ce86: 40 91 42 13 lds r20, 0x1342 ; 0x801342 <_ZN13thermal_modelL4dataE.lto_priv.402+0x93> 1ce8a: 50 91 43 13 lds r21, 0x1343 ; 0x801343 <_ZN13thermal_modelL4dataE.lto_priv.402+0x94> 1ce8e: c7 01 movw r24, r14 1ce90: b6 01 movw r22, r12 1ce92: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1ce96: 18 16 cp r1, r24 1ce98: 0c f0 brlt .+2 ; 0x1ce9c 1ce9a: 19 82 std Y+1, r1 ; 0x01 1ce9c: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 1cea0: 59 81 ldd r21, Y+1 ; 0x01 1cea2: 50 fb bst r21, 0 1cea4: 82 f9 bld r24, 2 1cea6: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> } 1ceaa: 27 96 adiw r28, 0x07 ; 7 1ceac: 0f b6 in r0, 0x3f ; 63 1ceae: f8 94 cli 1ceb0: de bf out 0x3e, r29 ; 62 1ceb2: 0f be out 0x3f, r0 ; 63 1ceb4: cd bf out 0x3d, r28 ; 61 1ceb6: df 91 pop r29 1ceb8: cf 91 pop r28 1ceba: 1f 91 pop r17 1cebc: 0f 91 pop r16 1cebe: ff 90 pop r15 1cec0: ef 90 pop r14 1cec2: df 90 pop r13 1cec4: cf 90 pop r12 1cec6: bf 90 pop r11 1cec8: af 90 pop r10 1ceca: 9f 90 pop r9 1cecc: 8f 90 pop r8 1cece: 7f 90 pop r7 1ced0: 6f 90 pop r6 1ced2: 5f 90 pop r5 1ced4: 4f 90 pop r4 1ced6: 3f 90 pop r3 1ced8: 2f 90 pop r2 1ceda: 08 95 ret dP *= (cur_heater_temp * U) + V; // linear temp. correction float dPl = (cur_heater_temp - cur_ambient_temp) / cur_R; // [W] leakage power float dT = (dP - dPl) * C_i; // expected temperature difference (K) // filter and lag dT uint8_t dT_next_idx = (dT_lag_idx == (dT_lag_size - 1) ? 0: dT_lag_idx + 1); 1cedc: 1e 82 std Y+6, r1 ; 0x06 1cede: 0c cf rjmp .-488 ; 0x1ccf8 0001cee0 : float d = GOLDEN_RATIO * (bounds[1] - bounds[0]); points[0] = bounds[0] + d; points[1] = bounds[1] - d; } static float estimate(uint16_t samples, 1cee0: 2f 92 push r2 1cee2: 3f 92 push r3 1cee4: 4f 92 push r4 1cee6: 5f 92 push r5 1cee8: 6f 92 push r6 1ceea: 7f 92 push r7 1ceec: 8f 92 push r8 1ceee: 9f 92 push r9 1cef0: af 92 push r10 1cef2: bf 92 push r11 1cef4: cf 92 push r12 1cef6: df 92 push r13 1cef8: ef 92 push r14 1cefa: ff 92 push r15 1cefc: 0f 93 push r16 1cefe: 1f 93 push r17 1cf00: cf 93 push r28 1cf02: df 93 push r29 1cf04: cd b7 in r28, 0x3d ; 61 1cf06: de b7 in r29, 0x3e ; 62 1cf08: a4 97 sbiw r28, 0x24 ; 36 1cf0a: 0f b6 in r0, 0x3f ; 63 1cf0c: f8 94 cli 1cf0e: de bf out 0x3e, r29 ; 62 1cf10: 0f be out 0x3f, r0 ; 63 1cf12: cd bf out 0x3d, r28 ; 61 1cf14: 9b 8f std Y+27, r25 ; 0x1b 1cf16: 8a 8f std Y+26, r24 ; 0x1a 1cf18: 7a 8b std Y+18, r23 ; 0x12 1cf1a: 69 8b std Y+17, r22 ; 0x11 1cf1c: 2b 8b std Y+19, r18 ; 0x13 1cf1e: 3c 8b std Y+20, r19 ; 0x14 1cf20: 4d 8b std Y+21, r20 ; 0x15 1cf22: 5e 8b std Y+22, r21 ; 0x16 1cf24: 0c 8f std Y+28, r16 ; 0x1c 1cf26: cd 8e std Y+29, r12 ; 0x1d 1cf28: de 8e std Y+30, r13 ; 0x1e 1cf2a: ef 8e std Y+31, r14 ; 0x1f 1cf2c: f8 a2 std Y+32, r15 ; 0x20 float thr, uint16_t max_itr, uint8_t fan_pwm, float ambient) { // during estimation we alter the model values without an extra copy to conserve memory // so we cannot keep the main checker active until a value has been found bool was_enabled = thermal_model::enabled; 1cf2e: 20 91 1c 05 lds r18, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 1cf32: 29 8f std Y+25, r18 ; 0x19 thermal_model_reset_enabled(false); 1cf34: 80 e0 ldi r24, 0x00 ; 0 1cf36: 0f 94 37 33 call 0x2666e ; 0x2666e float orig = *var; 1cf3a: a9 89 ldd r26, Y+17 ; 0x11 1cf3c: ba 89 ldd r27, Y+18 ; 0x12 1cf3e: 8d 91 ld r24, X+ 1cf40: 9d 91 ld r25, X+ 1cf42: 0d 90 ld r0, X+ 1cf44: bc 91 ld r27, X 1cf46: a0 2d mov r26, r0 1cf48: 89 a3 std Y+33, r24 ; 0x21 1cf4a: 9a a3 std Y+34, r25 ; 0x22 1cf4c: ab a3 std Y+35, r26 ; 0x23 1cf4e: bc a3 std Y+36, r27 ; 0x24 float e = NAN; float points[2]; float bounds[2] = {min, max}; 1cf50: 80 e0 ldi r24, 0x00 ; 0 1cf52: 90 e0 ldi r25, 0x00 ; 0 1cf54: a0 ea ldi r26, 0xA0 ; 160 1cf56: b0 e4 ldi r27, 0x40 ; 64 1cf58: 89 83 std Y+1, r24 ; 0x01 1cf5a: 9a 83 std Y+2, r25 ; 0x02 1cf5c: ab 83 std Y+3, r26 ; 0x03 1cf5e: bc 83 std Y+4, r27 ; 0x04 1cf60: 8b 89 ldd r24, Y+19 ; 0x13 1cf62: 9c 89 ldd r25, Y+20 ; 0x14 1cf64: ad 89 ldd r26, Y+21 ; 0x15 1cf66: be 89 ldd r27, Y+22 ; 0x16 1cf68: 8d 83 std Y+5, r24 ; 0x05 1cf6a: 9e 83 std Y+6, r25 ; 0x06 1cf6c: af 83 std Y+7, r26 ; 0x07 1cf6e: b8 87 std Y+8, r27 ; 0x08 constexpr float GOLDEN_RATIO = 0.6180339887498949; static void update_section(float points[2], const float bounds[2]) { float d = GOLDEN_RATIO * (bounds[1] - bounds[0]); 1cf70: 20 e0 ldi r18, 0x00 ; 0 1cf72: 30 e0 ldi r19, 0x00 ; 0 1cf74: 40 ea ldi r20, 0xA0 ; 160 1cf76: 50 e4 ldi r21, 0x40 ; 64 1cf78: bc 01 movw r22, r24 1cf7a: cd 01 movw r24, r26 1cf7c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1cf80: 2a e7 ldi r18, 0x7A ; 122 1cf82: 37 e3 ldi r19, 0x37 ; 55 1cf84: 4e e1 ldi r20, 0x1E ; 30 1cf86: 5f e3 ldi r21, 0x3F ; 63 1cf88: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1cf8c: 6b 01 movw r12, r22 1cf8e: 7c 01 movw r14, r24 points[0] = bounds[0] + d; 1cf90: 20 e0 ldi r18, 0x00 ; 0 1cf92: 30 e0 ldi r19, 0x00 ; 0 1cf94: 40 ea ldi r20, 0xA0 ; 160 1cf96: 50 e4 ldi r21, 0x40 ; 64 1cf98: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1cf9c: 69 87 std Y+9, r22 ; 0x09 1cf9e: 7a 87 std Y+10, r23 ; 0x0a 1cfa0: 8b 87 std Y+11, r24 ; 0x0b 1cfa2: 9c 87 std Y+12, r25 ; 0x0c points[1] = bounds[1] - d; 1cfa4: a7 01 movw r20, r14 1cfa6: 96 01 movw r18, r12 1cfa8: 6b 89 ldd r22, Y+19 ; 0x13 1cfaa: 7c 89 ldd r23, Y+20 ; 0x14 1cfac: 8d 89 ldd r24, Y+21 ; 0x15 1cfae: 9e 89 ldd r25, Y+22 ; 0x16 1cfb0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1cfb4: 6d 87 std Y+13, r22 ; 0x0d 1cfb6: 7e 87 std Y+14, r23 ; 0x0e 1cfb8: 8f 87 std Y+15, r24 ; 0x0f 1cfba: 98 8b std Y+16, r25 ; 0x10 1cfbc: 31 2c mov r3, r1 1cfbe: 21 2c mov r2, r1 float points[2]; float bounds[2] = {min, max}; update_section(points, bounds); for(uint8_t it = 0; it != max_itr; ++it) { float c1 = cost_fn(samples, var, points[0], fan_pwm, ambient); 1cfc0: 29 85 ldd r18, Y+9 ; 0x09 1cfc2: 3a 85 ldd r19, Y+10 ; 0x0a 1cfc4: 4b 85 ldd r20, Y+11 ; 0x0b 1cfc6: 5c 85 ldd r21, Y+12 ; 0x0c 1cfc8: cd 8c ldd r12, Y+29 ; 0x1d 1cfca: de 8c ldd r13, Y+30 ; 0x1e 1cfcc: ef 8c ldd r14, Y+31 ; 0x1f 1cfce: f8 a0 ldd r15, Y+32 ; 0x20 1cfd0: 0c 8d ldd r16, Y+28 ; 0x1c 1cfd2: 69 89 ldd r22, Y+17 ; 0x11 1cfd4: 7a 89 ldd r23, Y+18 ; 0x12 1cfd6: 8a 8d ldd r24, Y+26 ; 0x1a 1cfd8: 9b 8d ldd r25, Y+27 ; 0x1b 1cfda: 0f 94 89 2d call 0x25b12 ; 0x25b12 1cfde: 4b 01 movw r8, r22 1cfe0: 5c 01 movw r10, r24 float c2 = cost_fn(samples, var, points[1], fan_pwm, ambient); 1cfe2: 2d 85 ldd r18, Y+13 ; 0x0d 1cfe4: 3e 85 ldd r19, Y+14 ; 0x0e 1cfe6: 4f 85 ldd r20, Y+15 ; 0x0f 1cfe8: 58 89 ldd r21, Y+16 ; 0x10 1cfea: cd 8c ldd r12, Y+29 ; 0x1d 1cfec: de 8c ldd r13, Y+30 ; 0x1e 1cfee: ef 8c ldd r14, Y+31 ; 0x1f 1cff0: f8 a0 ldd r15, Y+32 ; 0x20 1cff2: 0c 8d ldd r16, Y+28 ; 0x1c 1cff4: 69 89 ldd r22, Y+17 ; 0x11 1cff6: 7a 89 ldd r23, Y+18 ; 0x12 1cff8: 8a 8d ldd r24, Y+26 ; 0x1a 1cffa: 9b 8d ldd r25, Y+27 ; 0x1b 1cffc: 0f 94 89 2d call 0x25b12 ; 0x25b12 1d000: 9b 01 movw r18, r22 1d002: ac 01 movw r20, r24 bool dir = (c2 < c1); 1d004: 11 e0 ldi r17, 0x01 ; 1 1d006: c5 01 movw r24, r10 1d008: b4 01 movw r22, r8 1d00a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1d00e: 18 16 cp r1, r24 1d010: 0c f0 brlt .+2 ; 0x1d014 1d012: 10 e0 ldi r17, 0x00 ; 0 bounds[dir] = points[!dir]; 1d014: 01 e0 ldi r16, 0x01 ; 1 1d016: 01 27 eor r16, r17 1d018: 80 2f mov r24, r16 1d01a: 90 e0 ldi r25, 0x00 ; 0 1d01c: e1 2f mov r30, r17 1d01e: f0 e0 ldi r31, 0x00 ; 0 1d020: ee 0f add r30, r30 1d022: ff 1f adc r31, r31 1d024: ee 0f add r30, r30 1d026: ff 1f adc r31, r31 1d028: 41 e0 ldi r20, 0x01 ; 1 1d02a: 50 e0 ldi r21, 0x00 ; 0 1d02c: 4c 0f add r20, r28 1d02e: 5d 1f adc r21, r29 1d030: 4e 0f add r20, r30 1d032: 5f 1f adc r21, r31 1d034: 8c 01 movw r16, r24 1d036: 00 0f add r16, r16 1d038: 11 1f adc r17, r17 1d03a: 00 0f add r16, r16 1d03c: 11 1f adc r17, r17 1d03e: a1 e0 ldi r26, 0x01 ; 1 1d040: b0 e0 ldi r27, 0x00 ; 0 1d042: ac 0f add r26, r28 1d044: bd 1f adc r27, r29 1d046: 0a 0f add r16, r26 1d048: 1b 1f adc r17, r27 1d04a: f8 01 movw r30, r16 1d04c: 38 96 adiw r30, 0x08 ; 8 1d04e: f8 8f std Y+24, r31 ; 0x18 1d050: ef 8b std Y+23, r30 ; 0x17 1d052: f8 01 movw r30, r16 1d054: 80 85 ldd r24, Z+8 ; 0x08 1d056: 91 85 ldd r25, Z+9 ; 0x09 1d058: a2 85 ldd r26, Z+10 ; 0x0a 1d05a: b3 85 ldd r27, Z+11 ; 0x0b 1d05c: fa 01 movw r30, r20 1d05e: 80 83 st Z, r24 1d060: 91 83 std Z+1, r25 ; 0x01 1d062: a2 83 std Z+2, r26 ; 0x02 1d064: b3 83 std Z+3, r27 ; 0x03 constexpr float GOLDEN_RATIO = 0.6180339887498949; static void update_section(float points[2], const float bounds[2]) { float d = GOLDEN_RATIO * (bounds[1] - bounds[0]); 1d066: 8d 80 ldd r8, Y+5 ; 0x05 1d068: 9e 80 ldd r9, Y+6 ; 0x06 1d06a: af 80 ldd r10, Y+7 ; 0x07 1d06c: b8 84 ldd r11, Y+8 ; 0x08 1d06e: c9 80 ldd r12, Y+1 ; 0x01 1d070: da 80 ldd r13, Y+2 ; 0x02 1d072: eb 80 ldd r14, Y+3 ; 0x03 1d074: fc 80 ldd r15, Y+4 ; 0x04 1d076: a7 01 movw r20, r14 1d078: 96 01 movw r18, r12 1d07a: c5 01 movw r24, r10 1d07c: b4 01 movw r22, r8 1d07e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1d082: 2a e7 ldi r18, 0x7A ; 122 1d084: 37 e3 ldi r19, 0x37 ; 55 1d086: 4e e1 ldi r20, 0x1E ; 30 1d088: 5f e3 ldi r21, 0x3F ; 63 1d08a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d08e: 2b 01 movw r4, r22 1d090: 3c 01 movw r6, r24 points[0] = bounds[0] + d; 1d092: ac 01 movw r20, r24 1d094: 9b 01 movw r18, r22 1d096: c7 01 movw r24, r14 1d098: b6 01 movw r22, r12 1d09a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1d09e: 69 87 std Y+9, r22 ; 0x09 1d0a0: 7a 87 std Y+10, r23 ; 0x0a 1d0a2: 8b 87 std Y+11, r24 ; 0x0b 1d0a4: 9c 87 std Y+12, r25 ; 0x0c points[1] = bounds[1] - d; 1d0a6: a3 01 movw r20, r6 1d0a8: 92 01 movw r18, r4 1d0aa: c5 01 movw r24, r10 1d0ac: b4 01 movw r22, r8 1d0ae: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1d0b2: 6d 87 std Y+13, r22 ; 0x0d 1d0b4: 7e 87 std Y+14, r23 ; 0x0e 1d0b6: 8f 87 std Y+15, r24 ; 0x0f 1d0b8: 98 8b std Y+16, r25 ; 0x10 float c1 = cost_fn(samples, var, points[0], fan_pwm, ambient); float c2 = cost_fn(samples, var, points[1], fan_pwm, ambient); bool dir = (c2 < c1); bounds[dir] = points[!dir]; update_section(points, bounds); float x = points[!dir]; 1d0ba: d8 01 movw r26, r16 1d0bc: 18 96 adiw r26, 0x08 ; 8 1d0be: 4c 90 ld r4, X 1d0c0: ef 89 ldd r30, Y+23 ; 0x17 1d0c2: f8 8d ldd r31, Y+24 ; 0x18 1d0c4: 51 80 ldd r5, Z+1 ; 0x01 1d0c6: 62 80 ldd r6, Z+2 ; 0x02 1d0c8: 73 80 ldd r7, Z+3 ; 0x03 e = (1-GOLDEN_RATIO) * fabsf((bounds[0]-bounds[1]) / x); 1d0ca: a5 01 movw r20, r10 1d0cc: 94 01 movw r18, r8 1d0ce: c7 01 movw r24, r14 1d0d0: b6 01 movw r22, r12 1d0d2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1d0d6: 24 2d mov r18, r4 1d0d8: 35 2d mov r19, r5 1d0da: 46 2d mov r20, r6 1d0dc: 57 2d mov r21, r7 1d0de: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1d0e2: 9f 77 andi r25, 0x7F ; 127 1d0e4: 2c e0 ldi r18, 0x0C ; 12 1d0e6: 31 e9 ldi r19, 0x91 ; 145 1d0e8: 43 ec ldi r20, 0xC3 ; 195 1d0ea: 5e e3 ldi r21, 0x3E ; 62 1d0ec: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d0f0: 6b 01 movw r12, r22 1d0f2: 7c 01 movw r14, r24 1d0f4: 5b 01 movw r10, r22 1d0f6: 8c 01 movw r16, r24 printf_P(PSTR("TM iter:%u v:%.2f e:%.3f\n"), it, x, e); 1d0f8: ff 92 push r15 1d0fa: 8f 93 push r24 1d0fc: df 92 push r13 1d0fe: 6f 93 push r22 1d100: 7f 92 push r7 1d102: 6f 92 push r6 1d104: 5f 92 push r5 1d106: 4f 92 push r4 1d108: 3f 92 push r3 1d10a: 2f 92 push r2 1d10c: 28 e2 ldi r18, 0x28 ; 40 1d10e: 3e e8 ldi r19, 0x8E ; 142 1d110: 3f 93 push r19 1d112: 2f 93 push r18 1d114: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if(e < thr) { 1d118: 0f b6 in r0, 0x3f ; 63 1d11a: f8 94 cli 1d11c: de bf out 0x3e, r29 ; 62 1d11e: 0f be out 0x3f, r0 ; 63 1d120: cd bf out 0x3d, r28 ; 61 1d122: 2a e0 ldi r18, 0x0A ; 10 1d124: 37 ed ldi r19, 0xD7 ; 215 1d126: 43 e2 ldi r20, 0x23 ; 35 1d128: 5c e3 ldi r21, 0x3C ; 60 1d12a: 6c 2d mov r22, r12 1d12c: 7d 2d mov r23, r13 1d12e: 8e 2d mov r24, r14 1d130: 9f 2d mov r25, r15 1d132: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1d136: 87 ff sbrs r24, 7 1d138: 42 c0 rjmp .+132 ; 0x1d1be if(x == min || x == max) { 1d13a: 20 e0 ldi r18, 0x00 ; 0 1d13c: 30 e0 ldi r19, 0x00 ; 0 1d13e: 40 ea ldi r20, 0xA0 ; 160 1d140: 50 e4 ldi r21, 0x40 ; 64 1d142: 64 2d mov r22, r4 1d144: 75 2d mov r23, r5 1d146: 86 2d mov r24, r6 1d148: 97 2d mov r25, r7 1d14a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1d14e: 88 23 and r24, r24 1d150: f1 f1 breq .+124 ; 0x1d1ce 1d152: 24 2d mov r18, r4 1d154: 35 2d mov r19, r5 1d156: 46 2d mov r20, r6 1d158: 57 2d mov r21, r7 1d15a: 6b 89 ldd r22, Y+19 ; 0x13 1d15c: 7c 89 ldd r23, Y+20 ; 0x14 1d15e: 8d 89 ldd r24, Y+21 ; 0x15 1d160: 9e 89 ldd r25, Y+22 ; 0x16 1d162: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1d166: 88 23 and r24, r24 1d168: 91 f1 breq .+100 ; 0x1d1ce // real value likely outside of the search boundaries break; } *var = x; 1d16a: 84 2d mov r24, r4 1d16c: 95 2d mov r25, r5 1d16e: a6 2d mov r26, r6 1d170: b7 2d mov r27, r7 1d172: e9 89 ldd r30, Y+17 ; 0x11 1d174: fa 89 ldd r31, Y+18 ; 0x12 1d176: 80 83 st Z, r24 1d178: 91 83 std Z+1, r25 ; 0x01 1d17a: a2 83 std Z+2, r26 ; 0x02 1d17c: b3 83 std Z+3, r27 ; 0x03 thermal_model_reset_enabled(was_enabled); 1d17e: 89 8d ldd r24, Y+25 ; 0x19 1d180: 0f 94 37 33 call 0x2666e ; 0x2666e SERIAL_ECHOLNPGM("TM estimation did not converge"); *var = orig; thermal_model_reset_enabled(was_enabled); return NAN; } 1d184: 6a 2d mov r22, r10 1d186: 7b 2d mov r23, r11 1d188: 80 2f mov r24, r16 1d18a: 91 2f mov r25, r17 1d18c: a4 96 adiw r28, 0x24 ; 36 1d18e: 0f b6 in r0, 0x3f ; 63 1d190: f8 94 cli 1d192: de bf out 0x3e, r29 ; 62 1d194: 0f be out 0x3f, r0 ; 63 1d196: cd bf out 0x3d, r28 ; 61 1d198: df 91 pop r29 1d19a: cf 91 pop r28 1d19c: 1f 91 pop r17 1d19e: 0f 91 pop r16 1d1a0: ff 90 pop r15 1d1a2: ef 90 pop r14 1d1a4: df 90 pop r13 1d1a6: cf 90 pop r12 1d1a8: bf 90 pop r11 1d1aa: af 90 pop r10 1d1ac: 9f 90 pop r9 1d1ae: 8f 90 pop r8 1d1b0: 7f 90 pop r7 1d1b2: 6f 90 pop r6 1d1b4: 5f 90 pop r5 1d1b6: 4f 90 pop r4 1d1b8: 3f 90 pop r3 1d1ba: 2f 90 pop r2 1d1bc: 08 95 ret 1d1be: ff ef ldi r31, 0xFF ; 255 1d1c0: 2f 1a sub r2, r31 1d1c2: 3f 0a sbc r3, r31 float e = NAN; float points[2]; float bounds[2] = {min, max}; update_section(points, bounds); for(uint8_t it = 0; it != max_itr; ++it) { 1d1c4: 2e e1 ldi r18, 0x1E ; 30 1d1c6: 22 16 cp r2, r18 1d1c8: 31 04 cpc r3, r1 1d1ca: 09 f0 breq .+2 ; 0x1d1ce 1d1cc: f9 ce rjmp .-526 ; 0x1cfc0 thermal_model_reset_enabled(was_enabled); return e; } } SERIAL_ECHOLNPGM("TM estimation did not converge"); 1d1ce: 89 e0 ldi r24, 0x09 ; 9 1d1d0: 9e e8 ldi r25, 0x8E ; 142 1d1d2: 0e 94 13 79 call 0xf226 ; 0xf226 *var = orig; 1d1d6: 89 a1 ldd r24, Y+33 ; 0x21 1d1d8: 9a a1 ldd r25, Y+34 ; 0x22 1d1da: ab a1 ldd r26, Y+35 ; 0x23 1d1dc: bc a1 ldd r27, Y+36 ; 0x24 1d1de: e9 89 ldd r30, Y+17 ; 0x11 1d1e0: fa 89 ldd r31, Y+18 ; 0x12 1d1e2: 80 83 st Z, r24 1d1e4: 91 83 std Z+1, r25 ; 0x01 1d1e6: a2 83 std Z+2, r26 ; 0x02 1d1e8: b3 83 std Z+3, r27 ; 0x03 thermal_model_reset_enabled(was_enabled); 1d1ea: 89 8d ldd r24, Y+25 ; 0x19 1d1ec: 0f 94 37 33 call 0x2666e ; 0x2666e return NAN; 1d1f0: a1 2c mov r10, r1 1d1f2: b1 2c mov r11, r1 1d1f4: 00 ec ldi r16, 0xC0 ; 192 1d1f6: 1f e7 ldi r17, 0x7F ; 127 1d1f8: c5 cf rjmp .-118 ; 0x1d184 0001d1fa : // Update cached value lastReadRegisterValue = logic.rsp.paramValue; return true; } bool __attribute__((noinline)) MMU2::WriteRegister(uint8_t address, uint16_t data) { 1d1fa: ef 92 push r14 1d1fc: ff 92 push r15 1d1fe: 0f 93 push r16 1d200: 1f 93 push r17 1d202: cf 93 push r28 1d204: df 93 push r29 1d206: 00 d0 rcall .+0 ; 0x1d208 1d208: 1f 92 push r1 1d20a: 1f 92 push r1 1d20c: cd b7 in r28, 0x3d ; 61 1d20e: de b7 in r29, 0x3e ; 62 1d210: 08 2f mov r16, r24 1d212: 16 2f mov r17, r22 1d214: f7 2e mov r15, r23 if (!WaitForMMUReady()) { 1d216: 0f 94 78 88 call 0x310f0 ; 0x310f0 1d21a: 88 23 and r24, r24 1d21c: d9 f0 breq .+54 ; 0x1d254 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) { 1d21e: 0b 30 cpi r16, 0x0B ; 11 1d220: 29 f1 breq .+74 ; 0x1d26c 1d222: 04 31 cpi r16, 0x14 ; 20 1d224: 31 f1 breq .+76 ; 0x1d272 /// @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()) { 1d226: 87 e5 ldi r24, 0x57 ; 87 1d228: e8 2e mov r14, r24 1d22a: e9 82 std Y+1, r14 ; 0x01 1d22c: 0a 83 std Y+2, r16 ; 0x02 1d22e: 1b 83 std Y+3, r17 ; 0x03 1d230: fc 82 std Y+4, r15 ; 0x04 1d232: ce 01 movw r24, r28 1d234: 01 96 adiw r24, 0x01 ; 1 1d236: 0f 94 5d c5 call 0x38aba ; 0x38aba 1d23a: 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)); 1d23c: 47 e5 ldi r20, 0x57 ; 87 1d23e: 50 2f mov r21, r16 1d240: 61 2f mov r22, r17 1d242: 7f 2d mov r23, r15 1d244: 0f 94 46 a5 call 0x34a8c ; 0x34a8c 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)); 1d248: 60 e0 ldi r22, 0x00 ; 0 1d24a: 80 e0 ldi r24, 0x00 ; 0 1d24c: 0f 94 6a ac call 0x358d4 ; 0x358d4 1d250: 88 23 and r24, r24 1d252: 59 f3 breq .-42 ; 0x1d22a return true; } 1d254: 0f 90 pop r0 1d256: 0f 90 pop r0 1d258: 0f 90 pop r0 1d25a: 0f 90 pop r0 1d25c: 0f 90 pop r0 1d25e: df 91 pop r29 1d260: cf 91 pop r28 1d262: 1f 91 pop r17 1d264: 0f 91 pop r16 1d266: ff 90 pop r15 1d268: ef 90 pop r14 1d26a: 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); 1d26c: 10 93 96 13 sts 0x1396, r17 ; 0x801396 1d270: da cf rjmp .-76 ; 0x1d226 break; case (uint8_t)Register::Pulley_Slow_Feedrate: logic.PlanPulleySlowFeedRate(data); 1d272: 10 93 97 13 sts 0x1397, r17 ; 0x801397 1d276: d7 cf rjmp .-82 ; 0x1d226 0001d278 : #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) 1d278: 82 30 cpi r24, 0x02 ; 2 1d27a: 91 05 cpc r25, r1 1d27c: 38 f0 brcs .+14 ; 0x1d28c // 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 1d27e: 88 0f add r24, r24 1d280: 99 1f adc r25, r25 1d282: 88 0f add r24, r24 1d284: 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, 1d286: 05 97 sbiw r24, 0x05 ; 5 #endif // busy wait __asm__ __volatile__ ( 1d288: 01 97 sbiw r24, 0x01 ; 1 1d28a: f1 f7 brne .-4 ; 0x1d288 "1: sbiw %0,1" "\n\t" // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles ); // return = 4 cycles } 1d28c: 08 95 ret 0001d28e : SREG = oldSREG; } int digitalRead(uint8_t pin) { 1d28e: cf 93 push r28 1d290: df 93 push r29 uint8_t timer = digitalPinToTimer(pin); 1d292: 28 2f mov r18, r24 1d294: 30 e0 ldi r19, 0x00 ; 0 1d296: f9 01 movw r30, r18 1d298: e6 5c subi r30, 0xC6 ; 198 1d29a: f3 47 sbci r31, 0x73 ; 115 1d29c: 84 91 lpm r24, Z uint8_t bit = digitalPinToBitMask(pin); 1d29e: f9 01 movw r30, r18 1d2a0: ec 51 subi r30, 0x1C ; 28 1d2a2: f4 47 sbci r31, 0x74 ; 116 1d2a4: d4 91 lpm r29, Z uint8_t port = digitalPinToPort(pin); 1d2a6: f9 01 movw r30, r18 1d2a8: e2 57 subi r30, 0x72 ; 114 1d2aa: f4 47 sbci r31, 0x74 ; 116 1d2ac: c4 91 lpm r28, Z if (port == NOT_A_PIN) return LOW; 1d2ae: cc 23 and r28, r28 1d2b0: a1 f0 breq .+40 ; 0x1d2da // 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); 1d2b2: 81 11 cpse r24, r1 1d2b4: 0e 94 ac cd call 0x19b58 ; 0x19b58 if (*portInputRegister(port) & bit) return HIGH; 1d2b8: ec 2f mov r30, r28 1d2ba: f0 e0 ldi r31, 0x00 ; 0 1d2bc: ee 0f add r30, r30 1d2be: ff 1f adc r31, r31 1d2c0: ec 58 subi r30, 0x8C ; 140 1d2c2: f4 47 sbci r31, 0x74 ; 116 1d2c4: a5 91 lpm r26, Z+ 1d2c6: b4 91 lpm r27, Z 1d2c8: ec 91 ld r30, X 1d2ca: ed 23 and r30, r29 1d2cc: 81 e0 ldi r24, 0x01 ; 1 1d2ce: 90 e0 ldi r25, 0x00 ; 0 1d2d0: 09 f4 brne .+2 ; 0x1d2d4 1d2d2: 80 e0 ldi r24, 0x00 ; 0 return LOW; } 1d2d4: df 91 pop r29 1d2d6: cf 91 pop r28 1d2d8: 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; 1d2da: 80 e0 ldi r24, 0x00 ; 0 1d2dc: 90 e0 ldi r25, 0x00 ; 0 1d2de: fa cf rjmp .-12 ; 0x1d2d4 0001d2e0 : #endif } } void digitalWrite(uint8_t pin, uint8_t val) { 1d2e0: 1f 93 push r17 1d2e2: cf 93 push r28 1d2e4: df 93 push r29 uint8_t timer = digitalPinToTimer(pin); 1d2e6: 28 2f mov r18, r24 1d2e8: 30 e0 ldi r19, 0x00 ; 0 1d2ea: f9 01 movw r30, r18 1d2ec: e6 5c subi r30, 0xC6 ; 198 1d2ee: f3 47 sbci r31, 0x73 ; 115 1d2f0: 84 91 lpm r24, Z uint8_t bit = digitalPinToBitMask(pin); 1d2f2: f9 01 movw r30, r18 1d2f4: ec 51 subi r30, 0x1C ; 28 1d2f6: f4 47 sbci r31, 0x74 ; 116 1d2f8: d4 91 lpm r29, Z uint8_t port = digitalPinToPort(pin); 1d2fa: f9 01 movw r30, r18 1d2fc: e2 57 subi r30, 0x72 ; 114 1d2fe: f4 47 sbci r31, 0x74 ; 116 1d300: c4 91 lpm r28, Z volatile uint8_t *out; if (port == NOT_A_PIN) return; 1d302: cc 23 and r28, r28 1d304: a9 f0 breq .+42 ; 0x1d330 1d306: 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); 1d308: 81 11 cpse r24, r1 1d30a: 0e 94 ac cd call 0x19b58 ; 0x19b58 out = portOutputRegister(port); 1d30e: ec 2f mov r30, r28 1d310: f0 e0 ldi r31, 0x00 ; 0 1d312: ee 0f add r30, r30 1d314: ff 1f adc r31, r31 1d316: e6 5a subi r30, 0xA6 ; 166 1d318: f4 47 sbci r31, 0x74 ; 116 1d31a: a5 91 lpm r26, Z+ 1d31c: b4 91 lpm r27, Z uint8_t oldSREG = SREG; 1d31e: 8f b7 in r24, 0x3f ; 63 cli(); 1d320: f8 94 cli if (val == LOW) { *out &= ~bit; 1d322: ec 91 ld r30, X out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { 1d324: 11 11 cpse r17, r1 1d326: 08 c0 rjmp .+16 ; 0x1d338 *out &= ~bit; 1d328: d0 95 com r29 1d32a: de 23 and r29, r30 } else { *out |= bit; 1d32c: dc 93 st X, r29 } SREG = oldSREG; 1d32e: 8f bf out 0x3f, r24 ; 63 } 1d330: df 91 pop r29 1d332: cf 91 pop r28 1d334: 1f 91 pop r17 1d336: 08 95 ret cli(); if (val == LOW) { *out &= ~bit; } else { *out |= bit; 1d338: de 2b or r29, r30 1d33a: f8 cf rjmp .-16 ; 0x1d32c 0001d33c : #define ARDUINO_MAIN #include "wiring_private.h" #include "pins_arduino.h" void pinMode(uint8_t pin, uint8_t mode) { 1d33c: cf 93 push r28 1d33e: df 93 push r29 uint8_t bit = digitalPinToBitMask(pin); 1d340: 90 e0 ldi r25, 0x00 ; 0 1d342: fc 01 movw r30, r24 1d344: ec 51 subi r30, 0x1C ; 28 1d346: f4 47 sbci r31, 0x74 ; 116 1d348: 24 91 lpm r18, Z uint8_t port = digitalPinToPort(pin); 1d34a: 82 57 subi r24, 0x72 ; 114 1d34c: 94 47 sbci r25, 0x74 ; 116 1d34e: fc 01 movw r30, r24 1d350: 84 91 lpm r24, Z volatile uint8_t *reg, *out; if (port == NOT_A_PIN) return; 1d352: 88 23 and r24, r24 1d354: d1 f0 breq .+52 ; 0x1d38a // JWS: can I let the optimizer do this? reg = portModeRegister(port); 1d356: 90 e0 ldi r25, 0x00 ; 0 1d358: 88 0f add r24, r24 1d35a: 99 1f adc r25, r25 1d35c: fc 01 movw r30, r24 1d35e: e0 5c subi r30, 0xC0 ; 192 1d360: f4 47 sbci r31, 0x74 ; 116 1d362: a5 91 lpm r26, Z+ 1d364: b4 91 lpm r27, Z out = portOutputRegister(port); 1d366: fc 01 movw r30, r24 1d368: e6 5a subi r30, 0xA6 ; 166 1d36a: f4 47 sbci r31, 0x74 ; 116 1d36c: c5 91 lpm r28, Z+ 1d36e: d4 91 lpm r29, Z if (mode == INPUT) { 1d370: 61 11 cpse r22, r1 1d372: 0e c0 rjmp .+28 ; 0x1d390 uint8_t oldSREG = SREG; 1d374: 9f b7 in r25, 0x3f ; 63 cli(); 1d376: f8 94 cli *reg &= ~bit; 1d378: 8c 91 ld r24, X 1d37a: e2 2f mov r30, r18 1d37c: e0 95 com r30 1d37e: 8e 23 and r24, r30 1d380: 8c 93 st X, r24 *out &= ~bit; 1d382: 28 81 ld r18, Y 1d384: e2 23 and r30, r18 1d386: e8 83 st Y, r30 SREG = oldSREG; 1d388: 9f bf out 0x3f, r25 ; 63 uint8_t oldSREG = SREG; cli(); *reg |= bit; SREG = oldSREG; } } 1d38a: df 91 pop r29 1d38c: cf 91 pop r28 1d38e: 08 95 ret cli(); *reg &= ~bit; *out |= bit; SREG = oldSREG; } else { uint8_t oldSREG = SREG; 1d390: 8f b7 in r24, 0x3f ; 63 cli(); 1d392: f8 94 cli *reg |= bit; 1d394: ec 91 ld r30, X 1d396: e2 2b or r30, r18 1d398: ec 93 st X, r30 SREG = oldSREG; 1d39a: 8f bf out 0x3f, r24 ; 63 1d39c: f6 cf rjmp .-20 ; 0x1d38a 0001d39e : // 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) { 1d39e: 1f 93 push r17 1d3a0: cf 93 push r28 1d3a2: df 93 push r29 1d3a4: 18 2f mov r17, r24 1d3a6: 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); 1d3a8: 61 e0 ldi r22, 0x01 ; 1 1d3aa: 0e 94 9e e9 call 0x1d33c ; 0x1d33c if (val == 0) 1d3ae: 20 97 sbiw r28, 0x00 ; 0 1d3b0: 39 f4 brne .+14 ; 0x1d3c0 { digitalWrite(pin, LOW); 1d3b2: 60 e0 ldi r22, 0x00 ; 0 } else if (val == 255) { digitalWrite(pin, HIGH); 1d3b4: 81 2f mov r24, r17 } else { digitalWrite(pin, HIGH); } } } } 1d3b6: df 91 pop r29 1d3b8: cf 91 pop r28 1d3ba: 1f 91 pop r17 { digitalWrite(pin, LOW); } else if (val == 255) { digitalWrite(pin, HIGH); 1d3bc: 0c 94 70 e9 jmp 0x1d2e0 ; 0x1d2e0 pinMode(pin, OUTPUT); if (val == 0) { digitalWrite(pin, LOW); } else if (val == 255) 1d3c0: cf 3f cpi r28, 0xFF ; 255 1d3c2: d1 05 cpc r29, r1 1d3c4: 11 f4 brne .+4 ; 0x1d3ca { digitalWrite(pin, HIGH); 1d3c6: 61 e0 ldi r22, 0x01 ; 1 1d3c8: f5 cf rjmp .-22 ; 0x1d3b4 } else { switch(digitalPinToTimer(pin)) 1d3ca: e1 2f mov r30, r17 1d3cc: f0 e0 ldi r31, 0x00 ; 0 1d3ce: e6 5c subi r30, 0xC6 ; 198 1d3d0: f3 47 sbci r31, 0x73 ; 115 1d3d2: e4 91 lpm r30, Z 1d3d4: e1 50 subi r30, 0x01 ; 1 1d3d6: e2 31 cpi r30, 0x12 ; 18 1d3d8: 08 f0 brcs .+2 ; 0x1d3dc 1d3da: b3 c0 rjmp .+358 ; 0x1d542 1d3dc: f0 e0 ldi r31, 0x00 ; 0 1d3de: 88 27 eor r24, r24 1d3e0: eb 50 subi r30, 0x0B ; 11 1d3e2: f6 41 sbci r31, 0x16 ; 22 1d3e4: 8f 4f sbci r24, 0xFF ; 255 1d3e6: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 1d3ea: 07 ea ldi r16, 0xA7 ; 167 1d3ec: 0f ea ldi r16, 0xAF ; 175 1d3ee: 14 ea ldi r17, 0xA4 ; 164 1d3f0: 1e ea ldi r17, 0xAE ; 174 1d3f2: 28 ea ldi r18, 0xA8 ; 168 1d3f4: a1 ea ldi r26, 0xA1 ; 161 1d3f6: 32 ea ldi r19, 0xA2 ; 162 1d3f8: 3a ea ldi r19, 0xAA ; 170 1d3fa: 42 ea ldi r20, 0xA2 ; 162 1d3fc: 4c ea ldi r20, 0xAC ; 172 1d3fe: 56 ea ldi r21, 0xA6 ; 166 1d400: 60 ea ldi r22, 0xA0 ; 160 1d402: 6f ea ldi r22, 0xAF ; 175 1d404: 79 ea ldi r23, 0xA9 ; 169 1d406: a1 ea ldi r26, 0xA1 ; 161 1d408: 83 ea ldi r24, 0xA3 ; 163 1d40a: 8d ea ldi r24, 0xAD ; 173 1d40c: 97 ea ldi r25, 0xA7 ; 167 #endif #if defined(TCCR0A) && defined(COM0A1) case TIMER0A: // connect pwm to pin on timer 0, channel A sbi(TCCR0A, COM0A1); 1d40e: 84 b5 in r24, 0x24 ; 36 1d410: 80 68 ori r24, 0x80 ; 128 1d412: 84 bd out 0x24, r24 ; 36 OCR0A = val; // set pwm duty 1d414: c7 bd out 0x27, r28 ; 39 } else { digitalWrite(pin, HIGH); } } } } 1d416: df 91 pop r29 1d418: cf 91 pop r28 1d41a: 1f 91 pop r17 1d41c: 08 95 ret #endif #if defined(TCCR0A) && defined(COM0B1) case TIMER0B: // connect pwm to pin on timer 0, channel B sbi(TCCR0A, COM0B1); 1d41e: 84 b5 in r24, 0x24 ; 36 1d420: 80 62 ori r24, 0x20 ; 32 1d422: 84 bd out 0x24, r24 ; 36 OCR0B = val; // set pwm duty 1d424: c8 bd out 0x28, r28 ; 40 1d426: f7 cf rjmp .-18 ; 0x1d416 #endif #if defined(TCCR1A) && defined(COM1A1) case TIMER1A: // connect pwm to pin on timer 1, channel A sbi(TCCR1A, COM1A1); 1d428: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1d42c: 80 68 ori r24, 0x80 ; 128 1d42e: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1A = val; // set pwm duty 1d432: d0 93 89 00 sts 0x0089, r29 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 1d436: c0 93 88 00 sts 0x0088, r28 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 1d43a: ed cf rjmp .-38 ; 0x1d416 #endif #if defined(TCCR1A) && defined(COM1B1) case TIMER1B: // connect pwm to pin on timer 1, channel B sbi(TCCR1A, COM1B1); 1d43c: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1d440: 80 62 ori r24, 0x20 ; 32 1d442: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1B = val; // set pwm duty 1d446: d0 93 8b 00 sts 0x008B, r29 ; 0x80008b <__TEXT_REGION_LENGTH__+0x7c208b> 1d44a: c0 93 8a 00 sts 0x008A, r28 ; 0x80008a <__TEXT_REGION_LENGTH__+0x7c208a> 1d44e: e3 cf rjmp .-58 ; 0x1d416 #endif #if defined(TCCR1A) && defined(COM1C1) case TIMER1C: // connect pwm to pin on timer 1, channel C sbi(TCCR1A, COM1C1); 1d450: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1d454: 88 60 ori r24, 0x08 ; 8 1d456: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> OCR1C = val; // set pwm duty 1d45a: d0 93 8d 00 sts 0x008D, r29 ; 0x80008d <__TEXT_REGION_LENGTH__+0x7c208d> 1d45e: c0 93 8c 00 sts 0x008C, r28 ; 0x80008c <__TEXT_REGION_LENGTH__+0x7c208c> 1d462: d9 cf rjmp .-78 ; 0x1d416 #endif #if defined(TCCR2A) && defined(COM2A1) case TIMER2A: // connect pwm to pin on timer 2, channel A sbi(TCCR2A, COM2A1); 1d464: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1d468: 80 68 ori r24, 0x80 ; 128 1d46a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> OCR2A = val; // set pwm duty 1d46e: c0 93 b3 00 sts 0x00B3, r28 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3> 1d472: d1 cf rjmp .-94 ; 0x1d416 #endif #if defined(TCCR2A) && defined(COM2B1) case TIMER2B: // connect pwm to pin on timer 2, channel B sbi(TCCR2A, COM2B1); 1d474: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1d478: 80 62 ori r24, 0x20 ; 32 1d47a: 80 93 b0 00 sts 0x00B0, r24 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> OCR2B = val; // set pwm duty 1d47e: c0 93 b4 00 sts 0x00B4, r28 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4> 1d482: c9 cf rjmp .-110 ; 0x1d416 #endif #if defined(TCCR3A) && defined(COM3A1) case TIMER3A: // connect pwm to pin on timer 3, channel A sbi(TCCR3A, COM3A1); 1d484: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1d488: 80 68 ori r24, 0x80 ; 128 1d48a: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3A = val; // set pwm duty 1d48e: d0 93 99 00 sts 0x0099, r29 ; 0x800099 <__TEXT_REGION_LENGTH__+0x7c2099> 1d492: c0 93 98 00 sts 0x0098, r28 ; 0x800098 <__TEXT_REGION_LENGTH__+0x7c2098> 1d496: bf cf rjmp .-130 ; 0x1d416 #endif #if defined(TCCR3A) && defined(COM3B1) case TIMER3B: // connect pwm to pin on timer 3, channel B sbi(TCCR3A, COM3B1); 1d498: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1d49c: 80 62 ori r24, 0x20 ; 32 1d49e: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3B = val; // set pwm duty 1d4a2: d0 93 9b 00 sts 0x009B, r29 ; 0x80009b <__TEXT_REGION_LENGTH__+0x7c209b> 1d4a6: c0 93 9a 00 sts 0x009A, r28 ; 0x80009a <__TEXT_REGION_LENGTH__+0x7c209a> 1d4aa: b5 cf rjmp .-150 ; 0x1d416 #endif #if defined(TCCR3A) && defined(COM3C1) case TIMER3C: // connect pwm to pin on timer 3, channel C sbi(TCCR3A, COM3C1); 1d4ac: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1d4b0: 88 60 ori r24, 0x08 ; 8 1d4b2: 80 93 90 00 sts 0x0090, r24 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> OCR3C = val; // set pwm duty 1d4b6: d0 93 9d 00 sts 0x009D, r29 ; 0x80009d <__TEXT_REGION_LENGTH__+0x7c209d> 1d4ba: c0 93 9c 00 sts 0x009C, r28 ; 0x80009c <__TEXT_REGION_LENGTH__+0x7c209c> 1d4be: ab cf rjmp .-170 ; 0x1d416 #endif #if defined(TCCR4A) case TIMER4A: //connect pwm to pin on timer 4, channel A sbi(TCCR4A, COM4A1); 1d4c0: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1d4c4: 80 68 ori r24, 0x80 ; 128 1d4c6: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> #if defined(COM4A0) // only used on 32U4 cbi(TCCR4A, COM4A0); 1d4ca: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1d4ce: 8f 7b andi r24, 0xBF ; 191 1d4d0: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> #endif OCR4A = val; // set pwm duty 1d4d4: d0 93 a9 00 sts 0x00A9, r29 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 1d4d8: c0 93 a8 00 sts 0x00A8, r28 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 1d4dc: 9c cf rjmp .-200 ; 0x1d416 #endif #if defined(TCCR4A) && defined(COM4B1) case TIMER4B: // connect pwm to pin on timer 4, channel B sbi(TCCR4A, COM4B1); 1d4de: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1d4e2: 80 62 ori r24, 0x20 ; 32 1d4e4: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4B = val; // set pwm duty 1d4e8: d0 93 ab 00 sts 0x00AB, r29 ; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab> 1d4ec: c0 93 aa 00 sts 0x00AA, r28 ; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa> 1d4f0: 92 cf rjmp .-220 ; 0x1d416 #endif #if defined(TCCR4A) && defined(COM4C1) case TIMER4C: // connect pwm to pin on timer 4, channel C sbi(TCCR4A, COM4C1); 1d4f2: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1d4f6: 88 60 ori r24, 0x08 ; 8 1d4f8: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> OCR4C = val; // set pwm duty 1d4fc: d0 93 ad 00 sts 0x00AD, r29 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 1d500: c0 93 ac 00 sts 0x00AC, r28 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 1d504: 88 cf rjmp .-240 ; 0x1d416 #if defined(TCCR5A) && defined(COM5A1) case TIMER5A: // connect pwm to pin on timer 5, channel A sbi(TCCR5A, COM5A1); 1d506: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1d50a: 80 68 ori r24, 0x80 ; 128 1d50c: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5A = val; // set pwm duty 1d510: d0 93 29 01 sts 0x0129, r29 ; 0x800129 <__TEXT_REGION_LENGTH__+0x7c2129> 1d514: c0 93 28 01 sts 0x0128, r28 ; 0x800128 <__TEXT_REGION_LENGTH__+0x7c2128> 1d518: 7e cf rjmp .-260 ; 0x1d416 #endif #if defined(TCCR5A) && defined(COM5B1) case TIMER5B: // connect pwm to pin on timer 5, channel B sbi(TCCR5A, COM5B1); 1d51a: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1d51e: 80 62 ori r24, 0x20 ; 32 1d520: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5B = val; // set pwm duty 1d524: d0 93 2b 01 sts 0x012B, r29 ; 0x80012b <__TEXT_REGION_LENGTH__+0x7c212b> 1d528: c0 93 2a 01 sts 0x012A, r28 ; 0x80012a <__TEXT_REGION_LENGTH__+0x7c212a> 1d52c: 74 cf rjmp .-280 ; 0x1d416 #endif #if defined(TCCR5A) && defined(COM5C1) case TIMER5C: // connect pwm to pin on timer 5, channel C sbi(TCCR5A, COM5C1); 1d52e: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1d532: 88 60 ori r24, 0x08 ; 8 1d534: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> OCR5C = val; // set pwm duty 1d538: d0 93 2d 01 sts 0x012D, r29 ; 0x80012d <__TEXT_REGION_LENGTH__+0x7c212d> 1d53c: c0 93 2c 01 sts 0x012C, r28 ; 0x80012c <__TEXT_REGION_LENGTH__+0x7c212c> 1d540: 6a cf rjmp .-300 ; 0x1d416 break; #endif case NOT_ON_TIMER: default: if (val < 128) { 1d542: c0 38 cpi r28, 0x80 ; 128 1d544: d1 05 cpc r29, r1 1d546: 0c f0 brlt .+2 ; 0x1d54a 1d548: 3e cf rjmp .-388 ; 0x1d3c6 1d54a: 33 cf rjmp .-410 ; 0x1d3b2 0001d54c : } } /// 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){ 1d54c: 4f 92 push r4 1d54e: 5f 92 push r5 1d550: 6f 92 push r6 1d552: 7f 92 push r7 1d554: 8f 92 push r8 1d556: 9f 92 push r9 1d558: af 92 push r10 1d55a: bf 92 push r11 1d55c: cf 92 push r12 1d55e: df 92 push r13 1d560: ef 92 push r14 1d562: ff 92 push r15 1d564: 0f 93 push r16 1d566: 1f 93 push r17 1d568: cf 93 push r28 1d56a: df 93 push r29 void sm4_do_step(uint8_t axes_mask) { #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 1d56c: 86 b9 out 0x06, r24 ; 6 1d56e: fa 01 movw r30, r20 1d570: e0 80 ld r14, Z 1d572: f1 80 ldd r15, Z+1 ; 0x01 sm4_do_step(axes); /// keep max speed (avoid extra computation) if (acc > 0 && delay_us == min_delay_us){ 1d574: 16 16 cp r1, r22 1d576: 17 06 cpc r1, r23 1d578: b4 f4 brge .+44 ; 0x1d5a6 1d57a: e2 16 cp r14, r18 1d57c: f3 06 cpc r15, r19 1d57e: 99 f4 brne .+38 ; 0x1d5a6 delayMicroseconds(delay_us); 1d580: c7 01 movw r24, r14 //DBG(_n("%d "), t1); delayMicroseconds(t1); delay_us = t1; } 1d582: df 91 pop r29 1d584: cf 91 pop r28 1d586: 1f 91 pop r17 1d588: 0f 91 pop r16 1d58a: ff 90 pop r15 1d58c: ef 90 pop r14 1d58e: df 90 pop r13 1d590: cf 90 pop r12 1d592: bf 90 pop r11 1d594: af 90 pop r10 1d596: 9f 90 pop r9 1d598: 8f 90 pop r8 1d59a: 7f 90 pop r7 1d59c: 6f 90 pop r6 1d59e: 5f 90 pop r5 1d5a0: 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); 1d5a2: 0c 94 3c e9 jmp 0x1d278 ; 0x1d278 1d5a6: 89 01 movw r16, r18 1d5a8: 6a 01 movw r12, r20 1d5aa: eb 01 movw r28, r22 return; } // v1 = v0 + a * t // 0.01 = length of a step const float t0 = delay_us * 0.000001f; 1d5ac: b7 01 movw r22, r14 1d5ae: 90 e0 ldi r25, 0x00 ; 0 1d5b0: 80 e0 ldi r24, 0x00 ; 0 1d5b2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 1d5b6: 2d eb ldi r18, 0xBD ; 189 1d5b8: 37 e3 ldi r19, 0x37 ; 55 1d5ba: 46 e8 ldi r20, 0x86 ; 134 1d5bc: 55 e3 ldi r21, 0x35 ; 53 1d5be: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d5c2: 4b 01 movw r8, r22 1d5c4: 5c 01 movw r10, r24 const float v1 = (0.01f / t0 + acc * t0); 1d5c6: be 01 movw r22, r28 1d5c8: 0d 2e mov r0, r29 1d5ca: 00 0c add r0, r0 1d5cc: 88 0b sbc r24, r24 1d5ce: 99 0b sbc r25, r25 1d5d0: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1d5d4: a5 01 movw r20, r10 1d5d6: 94 01 movw r18, r8 1d5d8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d5dc: 2b 01 movw r4, r22 1d5de: 3c 01 movw r6, r24 1d5e0: a5 01 movw r20, r10 1d5e2: 94 01 movw r18, r8 1d5e4: 6a e0 ldi r22, 0x0A ; 10 1d5e6: 77 ed ldi r23, 0xD7 ; 215 1d5e8: 83 e2 ldi r24, 0x23 ; 35 1d5ea: 9c e3 ldi r25, 0x3C ; 60 1d5ec: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1d5f0: 9b 01 movw r18, r22 1d5f2: ac 01 movw r20, r24 1d5f4: c3 01 movw r24, r6 1d5f6: b2 01 movw r22, r4 1d5f8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1d5fc: 4b 01 movw r8, r22 1d5fe: 5c 01 movw r10, r24 uint16_t t1; if (v1 <= 0.16f){ ///< slowest speed convertible to uint16_t delay 1d600: 2a e0 ldi r18, 0x0A ; 10 1d602: 37 ed ldi r19, 0xD7 ; 215 1d604: 43 e2 ldi r20, 0x23 ; 35 1d606: 5e e3 ldi r21, 0x3E ; 62 1d608: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1d60c: 18 16 cp r1, r24 1d60e: dc f5 brge .+118 ; 0x1d686 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)); 1d610: a5 01 movw r20, r10 1d612: 94 01 movw r18, r8 1d614: 6a e0 ldi r22, 0x0A ; 10 1d616: 77 ed ldi r23, 0xD7 ; 215 1d618: 83 e2 ldi r24, 0x23 ; 35 1d61a: 9c e3 ldi r25, 0x3C ; 60 1d61c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1d620: 20 e0 ldi r18, 0x00 ; 0 1d622: 34 e2 ldi r19, 0x24 ; 36 1d624: 44 e7 ldi r20, 0x74 ; 116 1d626: 59 e4 ldi r21, 0x49 ; 73 1d628: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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); 1d62c: 20 e0 ldi r18, 0x00 ; 0 1d62e: 30 e0 ldi r19, 0x00 ; 0 1d630: 40 e0 ldi r20, 0x00 ; 0 1d632: 5f e3 ldi r21, 0x3F ; 63 1d634: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1d638: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 1d63c: 5b 01 movw r10, r22 1d63e: 60 17 cp r22, r16 1d640: 71 07 cpc r23, r17 1d642: 08 f4 brcc .+2 ; 0x1d646 1d644: 58 01 movw r10, r16 /// 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){ 1d646: ea 14 cp r14, r10 1d648: fb 04 cpc r15, r11 1d64a: 31 f4 brne .+12 ; 0x1d658 1d64c: 20 97 sbiw r28, 0x00 ; 0 1d64e: 21 f0 breq .+8 ; 0x1d658 if (acc > 0) 1d650: fc f0 brlt .+62 ; 0x1d690 t1--; 1d652: f1 e0 ldi r31, 0x01 ; 1 1d654: af 1a sub r10, r31 1d656: b1 08 sbc r11, r1 t1++; } //DBG(_n("%d "), t1); delayMicroseconds(t1); 1d658: c5 01 movw r24, r10 1d65a: 0e 94 3c e9 call 0x1d278 ; 0x1d278 delay_us = t1; 1d65e: f6 01 movw r30, r12 1d660: b1 82 std Z+1, r11 ; 0x01 1d662: a0 82 st Z, r10 } 1d664: df 91 pop r29 1d666: cf 91 pop r28 1d668: 1f 91 pop r17 1d66a: 0f 91 pop r16 1d66c: ff 90 pop r15 1d66e: ef 90 pop r14 1d670: df 90 pop r13 1d672: cf 90 pop r12 1d674: bf 90 pop r11 1d676: af 90 pop r10 1d678: 9f 90 pop r9 1d67a: 8f 90 pop r8 1d67c: 7f 90 pop r7 1d67e: 6f 90 pop r6 1d680: 5f 90 pop r5 1d682: 4f 90 pop r4 1d684: 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 1d686: 80 e1 ldi r24, 0x10 ; 16 1d688: a8 2e mov r10, r24 1d68a: 87 e2 ldi r24, 0x27 ; 39 1d68c: b8 2e mov r11, r24 1d68e: db cf rjmp .-74 ; 0x1d646 /// make sure delay has changed a bit at least if (t1 == delay_us && acc != 0){ if (acc > 0) t1--; else t1++; 1d690: 8f ef ldi r24, 0xFF ; 255 1d692: a8 1a sub r10, r24 1d694: b8 0a sbc r11, r24 1d696: e0 cf rjmp .-64 ; 0x1d658 0001d698 : /// 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){ 1d698: 2f 92 push r2 1d69a: 3f 92 push r3 1d69c: 4f 92 push r4 1d69e: 5f 92 push r5 1d6a0: 6f 92 push r6 1d6a2: 7f 92 push r7 1d6a4: 8f 92 push r8 1d6a6: 9f 92 push r9 1d6a8: af 92 push r10 1d6aa: bf 92 push r11 1d6ac: cf 92 push r12 1d6ae: df 92 push r13 1d6b0: ef 92 push r14 1d6b2: ff 92 push r15 1d6b4: 0f 93 push r16 1d6b6: 1f 93 push r17 1d6b8: cf 93 push r28 1d6ba: df 93 push r29 1d6bc: 00 d0 rcall .+0 ; 0x1d6be 1d6be: cd b7 in r28, 0x3d ; 61 1d6c0: de b7 in r29, 0x3e ; 62 if (steps <= 0 || dec <= 0) 1d6c2: f9 01 movw r30, r18 1d6c4: e0 80 ld r14, Z 1d6c6: f1 80 ldd r15, Z+1 ; 0x01 1d6c8: e1 14 cp r14, r1 1d6ca: f1 04 cpc r15, r1 1d6cc: 09 f4 brne .+2 ; 0x1d6d0 1d6ce: 6b c0 rjmp .+214 ; 0x1d7a6 1d6d0: 16 16 cp r1, r22 1d6d2: 17 06 cpc r1, r23 1d6d4: 0c f0 brlt .+2 ; 0x1d6d8 1d6d6: 67 c0 rjmp .+206 ; 0x1d7a6 1d6d8: 19 01 movw r2, r18 1d6da: 5b 83 std Y+3, r21 ; 0x03 1d6dc: 4a 83 std Y+2, r20 ; 0x02 1d6de: 6b 01 movw r12, r22 1d6e0: 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)); 1d6e2: fa 01 movw r30, r20 1d6e4: 00 81 ld r16, Z 1d6e6: 11 81 ldd r17, Z+1 ; 0x01 1d6e8: b8 01 movw r22, r16 1d6ea: 90 e0 ldi r25, 0x00 ; 0 1d6ec: 80 e0 ldi r24, 0x00 ; 0 1d6ee: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 1d6f2: 4b 01 movw r8, r22 1d6f4: 5c 01 movw r10, r24 1d6f6: b6 01 movw r22, r12 1d6f8: 0d 2c mov r0, r13 1d6fa: 00 0c add r0, r0 1d6fc: 88 0b sbc r24, r24 1d6fe: 99 0b sbc r25, r25 1d700: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1d704: 2b 01 movw r4, r22 1d706: 3c 01 movw r6, r24 1d708: a5 01 movw r20, r10 1d70a: 94 01 movw r18, r8 1d70c: c5 01 movw r24, r10 1d70e: b4 01 movw r22, r8 1d710: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d714: 9b 01 movw r18, r22 1d716: ac 01 movw r20, r24 1d718: c3 01 movw r24, r6 1d71a: b2 01 movw r22, r4 1d71c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 1d720: 9b 01 movw r18, r22 1d722: ac 01 movw r20, r24 1d724: 6a e0 ldi r22, 0x0A ; 10 1d726: 77 ed ldi r23, 0xD7 ; 215 1d728: 83 ea ldi r24, 0xA3 ; 163 1d72a: 9b e3 ldi r25, 0x3B ; 59 1d72c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__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); 1d730: 20 e0 ldi r18, 0x00 ; 0 1d732: 30 e0 ldi r19, 0x00 ; 0 1d734: 40 e0 ldi r20, 0x00 ; 0 1d736: 5f e3 ldi r21, 0x3F ; 63 1d738: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1d73c: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__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){ 1d740: 6e 15 cp r22, r14 1d742: 7f 05 cpc r23, r15 1d744: 28 f5 brcc .+74 ; 0x1d790 1d746: f9 81 ldd r31, Y+1 ; 0x01 1d748: f6 b9 out 0x06, r31 ; 6 /// go steady sm4_do_step(axes); delayMicroseconds(delay_us); 1d74a: ea 81 ldd r30, Y+2 ; 0x02 1d74c: fb 81 ldd r31, Y+3 ; 0x03 1d74e: 80 81 ld r24, Z 1d750: 91 81 ldd r25, Z+1 ; 0x01 1d752: 0e 94 3c e9 call 0x1d278 ; 0x1d278 } else { /// decelerate accelerate_1_step(axes, -dec, delay_us, delay_us); } --steps; 1d756: f1 01 movw r30, r2 1d758: 80 81 ld r24, Z 1d75a: 91 81 ldd r25, Z+1 ; 0x01 1d75c: 01 97 sbiw r24, 0x01 ; 1 1d75e: 91 83 std Z+1, r25 ; 0x01 1d760: 80 83 st Z, r24 return true; 1d762: 81 e0 ldi r24, 0x01 ; 1 } 1d764: 0f 90 pop r0 1d766: 0f 90 pop r0 1d768: 0f 90 pop r0 1d76a: df 91 pop r29 1d76c: cf 91 pop r28 1d76e: 1f 91 pop r17 1d770: 0f 91 pop r16 1d772: ff 90 pop r15 1d774: ef 90 pop r14 1d776: df 90 pop r13 1d778: cf 90 pop r12 1d77a: bf 90 pop r11 1d77c: af 90 pop r10 1d77e: 9f 90 pop r9 1d780: 8f 90 pop r8 1d782: 7f 90 pop r7 1d784: 6f 90 pop r6 1d786: 5f 90 pop r5 1d788: 4f 90 pop r4 1d78a: 3f 90 pop r3 1d78c: 2f 90 pop r2 1d78e: 08 95 ret /// go steady sm4_do_step(axes); delayMicroseconds(delay_us); } else { /// decelerate accelerate_1_step(axes, -dec, delay_us, delay_us); 1d790: 66 27 eor r22, r22 1d792: 77 27 eor r23, r23 1d794: 6c 19 sub r22, r12 1d796: 7d 09 sbc r23, r13 1d798: 98 01 movw r18, r16 1d79a: 4a 81 ldd r20, Y+2 ; 0x02 1d79c: 5b 81 ldd r21, Y+3 ; 0x03 1d79e: 89 81 ldd r24, Y+1 ; 0x01 1d7a0: 0e 94 a6 ea call 0x1d54c ; 0x1d54c 1d7a4: d8 cf rjmp .-80 ; 0x1d756 /// 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; 1d7a6: 80 e0 ldi r24, 0x00 ; 0 1d7a8: dd cf rjmp .-70 ; 0x1d764 0001d7aa : count_position[i] += dir & mask ? -1L : 1L; } } } static void __attribute__((noinline)) set_axes_dir(const uint8_t axis, const uint8_t dir) { 1d7aa: 0f 93 push r16 1d7ac: 1f 93 push r17 1d7ae: cf 93 push r28 1d7b0: df 93 push r29 1d7b2: 18 2f mov r17, r24 1d7b4: 06 2f mov r16, r22 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1d7b6: d1 e0 ldi r29, 0x01 ; 1 1d7b8: c0 e0 ldi r28, 0x00 ; 0 if (axis & mask) { 1d7ba: 81 2f mov r24, r17 1d7bc: 8d 23 and r24, r29 1d7be: 29 f0 breq .+10 ; 0x1d7ca sm4_set_dir(i, dir & mask); 1d7c0: 60 2f mov r22, r16 1d7c2: 6d 23 and r22, r29 1d7c4: 8c 2f mov r24, r28 1d7c6: 0f 94 13 53 call 0x2a626 ; 0x2a626 } } } 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) { 1d7ca: cf 5f subi r28, 0xFF ; 255 1d7cc: dd 0f add r29, r29 1d7ce: c3 30 cpi r28, 0x03 ; 3 1d7d0: a1 f7 brne .-24 ; 0x1d7ba if (axis & mask) { sm4_set_dir(i, dir & mask); } } } 1d7d2: df 91 pop r29 1d7d4: cf 91 pop r28 1d7d6: 1f 91 pop r17 1d7d8: 0f 91 pop r16 1d7da: 08 95 ret 0001d7dc : //@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) { 1d7dc: 8f 92 push r8 1d7de: 9f 92 push r9 1d7e0: af 92 push r10 1d7e2: bf 92 push r11 1d7e4: cf 92 push r12 1d7e6: df 92 push r13 1d7e8: ef 92 push r14 1d7ea: ff 92 push r15 1d7ec: 30 e0 ldi r19, 0x00 ; 0 1d7ee: 20 e0 ldi r18, 0x00 ; 0 for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) { 1d7f0: 91 e0 ldi r25, 0x01 ; 1 if (axis & mask) { 1d7f2: 48 2f mov r20, r24 1d7f4: 49 23 and r20, r25 1d7f6: 19 f1 breq .+70 ; 0x1d83e count_position[i] += dir & mask ? -1L : 1L; 1d7f8: a9 01 movw r20, r18 1d7fa: 44 0f add r20, r20 1d7fc: 55 1f adc r21, r21 1d7fe: 44 0f add r20, r20 1d800: 55 1f adc r21, r21 1d802: fa 01 movw r30, r20 1d804: ee 54 subi r30, 0x4E ; 78 1d806: f9 4f sbci r31, 0xF9 ; 249 1d808: c0 80 ld r12, Z 1d80a: d1 80 ldd r13, Z+1 ; 0x01 1d80c: e2 80 ldd r14, Z+2 ; 0x02 1d80e: f3 80 ldd r15, Z+3 ; 0x03 1d810: 76 2f mov r23, r22 1d812: 79 23 and r23, r25 1d814: 81 2c mov r8, r1 1d816: 91 2c mov r9, r1 1d818: 54 01 movw r10, r8 1d81a: 83 94 inc r8 1d81c: 77 23 and r23, r23 1d81e: 21 f0 breq .+8 ; 0x1d828 1d820: 88 24 eor r8, r8 1d822: 8a 94 dec r8 1d824: 98 2c mov r9, r8 1d826: 54 01 movw r10, r8 1d828: c8 0c add r12, r8 1d82a: d9 1c adc r13, r9 1d82c: ea 1c adc r14, r10 1d82e: fb 1c adc r15, r11 1d830: 4e 54 subi r20, 0x4E ; 78 1d832: 59 4f sbci r21, 0xF9 ; 249 1d834: fa 01 movw r30, r20 1d836: c0 82 st Z, r12 1d838: d1 82 std Z+1, r13 ; 0x01 1d83a: e2 82 std Z+2, r14 ; 0x02 1d83c: 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) { 1d83e: 99 0f add r25, r25 1d840: 2f 5f subi r18, 0xFF ; 255 1d842: 3f 4f sbci r19, 0xFF ; 255 1d844: 23 30 cpi r18, 0x03 ; 3 1d846: 31 05 cpc r19, r1 1d848: a1 f6 brne .-88 ; 0x1d7f2 if (axis & mask) { count_position[i] += dir & mask ? -1L : 1L; } } } 1d84a: ff 90 pop r15 1d84c: ef 90 pop r14 1d84e: df 90 pop r13 1d850: cf 90 pop r12 1d852: bf 90 pop r11 1d854: af 90 pop r10 1d856: 9f 90 pop r9 1d858: 8f 90 pop r8 1d85a: 08 95 ret 0001d85c : /// 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) { 1d85c: 2f 92 push r2 1d85e: 3f 92 push r3 1d860: 4f 92 push r4 1d862: 5f 92 push r5 1d864: 6f 92 push r6 1d866: 7f 92 push r7 1d868: 8f 92 push r8 1d86a: 9f 92 push r9 1d86c: af 92 push r10 1d86e: bf 92 push r11 1d870: cf 92 push r12 1d872: df 92 push r13 1d874: ef 92 push r14 1d876: ff 92 push r15 1d878: 0f 93 push r16 1d87a: 1f 93 push r17 1d87c: cf 93 push r28 1d87e: df 93 push r29 1d880: 00 d0 rcall .+0 ; 0x1d882 1d882: 00 d0 rcall .+0 ; 0x1d884 1d884: cd b7 in r28, 0x3d ; 61 1d886: 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]; 1d888: c0 90 b2 06 lds r12, 0x06B2 ; 0x8006b2 1d88c: d0 90 b3 06 lds r13, 0x06B3 ; 0x8006b3 1d890: e0 90 b4 06 lds r14, 0x06B4 ; 0x8006b4 1d894: f0 90 b5 06 lds r15, 0x06B5 ; 0x8006b5 1d898: 7c 01 movw r14, r24 1d89a: ec 18 sub r14, r12 1d89c: fd 08 sbc r15, r13 y -= (int16_t)count_position[1]; 1d89e: 80 91 b6 06 lds r24, 0x06B6 ; 0x8006b6 1d8a2: 90 91 b7 06 lds r25, 0x06B7 ; 0x8006b7 1d8a6: a0 91 b8 06 lds r26, 0x06B8 ; 0x8006b8 1d8aa: b0 91 b9 06 lds r27, 0x06B9 ; 0x8006b9 1d8ae: 68 1b sub r22, r24 1d8b0: 79 0b sbc r23, r25 z -= (int16_t)count_position[2]; 1d8b2: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 1d8b6: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 1d8ba: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 1d8be: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 1d8c2: fa 01 movw r30, r20 1d8c4: e8 1b sub r30, r24 1d8c6: f9 0b sbc r31, r25 1d8c8: fa 83 std Y+2, r31 ; 0x02 1d8ca: e9 83 std Y+1, r30 ; 0x01 xyzcal_dm = ((x<0)?1:0) | ((y<0)?2:0) | ((z<0)?4:0); 1d8cc: fb 01 movw r30, r22 1d8ce: ff 0f add r31, r31 1d8d0: ee 0b sbc r30, r30 1d8d2: ff 0f add r31, r31 1d8d4: fe 2f mov r31, r30 1d8d6: ee 1f adc r30, r30 1d8d8: e2 70 andi r30, 0x02 ; 2 1d8da: 89 81 ldd r24, Y+1 ; 0x01 1d8dc: 9a 81 ldd r25, Y+2 ; 0x02 1d8de: 88 e0 ldi r24, 0x08 ; 8 1d8e0: 98 02 muls r25, r24 1d8e2: 81 2d mov r24, r1 1d8e4: 99 0b sbc r25, r25 1d8e6: 11 24 eor r1, r1 1d8e8: 84 70 andi r24, 0x04 ; 4 1d8ea: e8 2b or r30, r24 1d8ec: 8f 2d mov r24, r15 1d8ee: 88 1f adc r24, r24 1d8f0: 88 27 eor r24, r24 1d8f2: 88 1f adc r24, r24 1d8f4: e8 2b or r30, r24 1d8f6: e0 93 fe 03 sts 0x03FE, r30 ; 0x8003fe asm("nop"); } void sm4_set_dir_bits(uint8_t dir_bits) { uint8_t portL = PORTL; 1d8fa: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> portL &= 0xb8; //set direction bits to zero 1d8fe: 98 7b andi r25, 0xB8 ; 184 if (dir_bits & 1) portL |= 2; //set X direction bit if (dir_bits & 2) portL |= 1; //set Y direction bit if (dir_bits & 4) portL |= 4; //set Z direction bit if (dir_bits & 8) portL |= 64; //set E direction bit #elif ((MOTHERBOARD == BOARD_EINSY_1_0a)) dir_bits ^= dir_mask; 1d900: 8a e0 ldi r24, 0x0A ; 10 1d902: e8 27 eor r30, r24 if (dir_bits & 1) portL |= 1; //set X direction bit 1d904: e0 fd sbrc r30, 0 1d906: 91 60 ori r25, 0x01 ; 1 if (dir_bits & 2) portL |= 2; //set Y direction bit 1d908: e1 fd sbrc r30, 1 1d90a: 92 60 ori r25, 0x02 ; 2 if (dir_bits & 4) portL |= 4; //set Z direction bit 1d90c: e2 fd sbrc r30, 2 1d90e: 94 60 ori r25, 0x04 ; 4 if (dir_bits & 8) portL |= 64; //set E direction bit 1d910: 90 64 ori r25, 0x40 ; 64 #endif PORTL = portL; 1d912: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> asm("nop"); 1d916: 00 00 nop sm4_set_dir_bits(xyzcal_dm); sm4_stop_cb = check_pinda?((check_pinda<0)?check_pinda_0:check_pinda_1):0; 1d918: 83 e1 ldi r24, 0x13 ; 19 1d91a: 9e ec ldi r25, 0xCE ; 206 1d91c: 01 11 cpse r16, r1 1d91e: 02 c0 rjmp .+4 ; 0x1d924 1d920: 90 e0 ldi r25, 0x00 ; 0 1d922: 80 e0 ldi r24, 0x00 ; 0 1d924: 90 93 88 06 sts 0x0688, r25 ; 0x800688 1d928: 80 93 87 06 sts 0x0687, r24 ; 0x800687 xyzcal_sm4_delay = delay_us; 1d92c: 30 93 fd 03 sts 0x03FD, r19 ; 0x8003fd 1d930: 20 93 fc 03 sts 0x03FC, r18 ; 0x8003fc // uint32_t u = _micros(); bool ret = sm4_line_xyz_ui(abs(x), abs(y), abs(z)) ? true : false; 1d934: 29 81 ldd r18, Y+1 ; 0x01 1d936: 3a 81 ldd r19, Y+2 ; 0x02 1d938: 3e 83 std Y+6, r19 ; 0x06 1d93a: 2d 83 std Y+5, r18 ; 0x05 1d93c: 37 ff sbrs r19, 7 1d93e: 05 c0 rjmp .+10 ; 0x1d94a 1d940: 31 95 neg r19 1d942: 21 95 neg r18 1d944: 31 09 sbc r19, r1 1d946: 3e 83 std Y+6, r19 ; 0x06 1d948: 2d 83 std Y+5, r18 ; 0x05 1d94a: 8b 01 movw r16, r22 1d94c: 77 ff sbrs r23, 7 1d94e: 03 c0 rjmp .+6 ; 0x1d956 1d950: 11 95 neg r17 1d952: 01 95 neg r16 1d954: 11 09 sbc r17, r1 1d956: f7 fe sbrs r15, 7 1d958: 03 c0 rjmp .+6 ; 0x1d960 1d95a: f1 94 neg r15 1d95c: e1 94 neg r14 1d95e: 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); 1d960: 98 01 movw r18, r16 1d962: d8 01 movw r26, r16 1d964: 0f 94 28 dd call 0x3ba50 ; 0x3ba50 <__mulhisi3> 1d968: 4b 01 movw r8, r22 1d96a: 5c 01 movw r10, r24 1d96c: 2d 81 ldd r18, Y+5 ; 0x05 1d96e: 3e 81 ldd r19, Y+6 ; 0x06 1d970: d9 01 movw r26, r18 1d972: 0f 94 28 dd call 0x3ba50 ; 0x3ba50 <__mulhisi3> 1d976: 86 0e add r8, r22 1d978: 97 1e adc r9, r23 1d97a: a8 1e adc r10, r24 1d97c: b9 1e adc r11, r25 1d97e: 97 01 movw r18, r14 1d980: d7 01 movw r26, r14 1d982: 0f 94 28 dd call 0x3ba50 ; 0x3ba50 <__mulhisi3> 1d986: 68 0d add r22, r8 1d988: 79 1d adc r23, r9 1d98a: 8a 1d adc r24, r10 1d98c: 9b 1d adc r25, r11 1d98e: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 1d992: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 1d996: 20 e0 ldi r18, 0x00 ; 0 1d998: 30 e0 ldi r19, 0x00 ; 0 1d99a: 40 e0 ldi r20, 0x00 ; 0 1d99c: 5f e3 ldi r21, 0x3F ; 63 1d99e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1d9a2: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 1d9a6: 2b 01 movw r4, r22 uint16_t nd = dd; uint16_t cx = dd; uint16_t cy = dd; uint16_t cz = dd; 1d9a8: 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; 1d9aa: 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; 1d9ac: 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; 1d9ae: 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; 1d9b0: 1c 82 std Y+4, r1 ; 0x04 1d9b2: 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; 1d9b4: 31 2c mov r3, r1 1d9b6: 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; 1d9b8: 1a 82 std Y+2, r1 ; 0x02 1d9ba: 19 82 std Y+1, r1 ; 0x01 uint16_t y = 0; uint16_t z = 0; while (nd){ 1d9bc: 61 14 cp r6, r1 1d9be: 71 04 cpc r7, r1 1d9c0: 09 f4 brne .+2 ; 0x1d9c4 1d9c2: 47 c0 rjmp .+142 ; 0x1da52 if (sm4_stop_cb && (*sm4_stop_cb)()) break; 1d9c4: e0 91 87 06 lds r30, 0x0687 ; 0x800687 1d9c8: f0 91 88 06 lds r31, 0x0688 ; 0x800688 1d9cc: 30 97 sbiw r30, 0x00 ; 0 1d9ce: e9 f5 brne .+122 ; 0x1da4a uint8_t sm = 0; //step mask 1d9d0: 80 e0 ldi r24, 0x00 ; 0 if (cx <= dx){ 1d9d2: ec 14 cp r14, r12 1d9d4: fd 04 cpc r15, r13 1d9d6: 40 f0 brcs .+16 ; 0x1d9e8 sm |= 1; cx += dd; 1d9d8: c4 0c add r12, r4 1d9da: d5 1c adc r13, r5 x++; 1d9dc: 89 81 ldd r24, Y+1 ; 0x01 1d9de: 9a 81 ldd r25, Y+2 ; 0x02 1d9e0: 01 96 adiw r24, 0x01 ; 1 1d9e2: 9a 83 std Y+2, r25 ; 0x02 1d9e4: 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; 1d9e6: 81 e0 ldi r24, 0x01 ; 1 cx += dd; x++; } if (cy <= dy){ 1d9e8: 0a 15 cp r16, r10 1d9ea: 1b 05 cpc r17, r11 1d9ec: 30 f0 brcs .+12 ; 0x1d9fa sm |= 2; 1d9ee: 82 60 ori r24, 0x02 ; 2 cy += dd; 1d9f0: a4 0c add r10, r4 1d9f2: b5 1c adc r11, r5 y++; 1d9f4: 9f ef ldi r25, 0xFF ; 255 1d9f6: 29 1a sub r2, r25 1d9f8: 39 0a sbc r3, r25 } if (cz <= dz){ 1d9fa: ed 81 ldd r30, Y+5 ; 0x05 1d9fc: fe 81 ldd r31, Y+6 ; 0x06 1d9fe: e8 15 cp r30, r8 1da00: f9 05 cpc r31, r9 1da02: 48 f0 brcs .+18 ; 0x1da16 sm |= 4; 1da04: 84 60 ori r24, 0x04 ; 4 cz += dd; 1da06: 84 0c add r8, r4 1da08: 95 1c adc r9, r5 z++; 1da0a: 2b 81 ldd r18, Y+3 ; 0x03 1da0c: 3c 81 ldd r19, Y+4 ; 0x04 1da0e: 2f 5f subi r18, 0xFF ; 255 1da10: 3f 4f sbci r19, 0xFF ; 255 1da12: 3c 83 std Y+4, r19 ; 0x04 1da14: 2b 83 std Y+3, r18 ; 0x03 } cx -= dx; 1da16: ce 18 sub r12, r14 1da18: df 08 sbc r13, r15 cy -= dy; 1da1a: a0 1a sub r10, r16 1da1c: b1 0a sbc r11, r17 cz -= dz; 1da1e: ed 81 ldd r30, Y+5 ; 0x05 1da20: fe 81 ldd r31, Y+6 ; 0x06 1da22: 8e 1a sub r8, r30 1da24: 9f 0a sbc r9, r31 void sm4_do_step(uint8_t axes_mask) { #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 1da26: 86 b9 out 0x06, r24 ; 6 cx -= dx; cy -= dy; cz -= dz; sm4_do_step(sm); uint16_t delay = SM4_DEFDELAY; if (sm4_calc_delay_cb) delay = (*sm4_calc_delay_cb)(nd, dd); 1da28: e0 91 83 06 lds r30, 0x0683 ; 0x800683 1da2c: f0 91 84 06 lds r31, 0x0684 ; 0x800684 1da30: 30 97 sbiw r30, 0x00 ; 0 1da32: d1 f1 breq .+116 ; 0x1daa8 1da34: b2 01 movw r22, r4 1da36: c3 01 movw r24, r6 1da38: 19 95 eicall if (delay) delayMicroseconds(delay); 1da3a: 00 97 sbiw r24, 0x00 ; 0 1da3c: 11 f0 breq .+4 ; 0x1da42 1da3e: 0e 94 3c e9 call 0x1d278 ; 0x1d278 nd--; 1da42: f1 e0 ldi r31, 0x01 ; 1 1da44: 6f 1a sub r6, r31 1da46: 71 08 sbc r7, r1 1da48: b9 cf rjmp .-142 ; 0x1d9bc 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; 1da4a: 19 95 eicall 1da4c: 88 23 and r24, r24 1da4e: 09 f4 brne .+2 ; 0x1da52 1da50: bf cf rjmp .-130 ; 0x1d9d0 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) 1da52: e0 91 85 06 lds r30, 0x0685 ; 0x800685 1da56: f0 91 86 06 lds r31, 0x0686 ; 0x800686 1da5a: 30 97 sbiw r30, 0x00 ; 0 1da5c: 41 f0 breq .+16 ; 0x1da6e (*sm4_update_pos_cb)(x, y, z, 0); 1da5e: 30 e0 ldi r19, 0x00 ; 0 1da60: 20 e0 ldi r18, 0x00 ; 0 1da62: 4b 81 ldd r20, Y+3 ; 0x03 1da64: 5c 81 ldd r21, Y+4 ; 0x04 1da66: b1 01 movw r22, r2 1da68: 89 81 ldd r24, Y+1 ; 0x01 1da6a: 9a 81 ldd r25, Y+2 ; 0x02 1da6c: 19 95 eicall 1da6e: 81 e0 ldi r24, 0x01 ; 1 1da70: 67 28 or r6, r7 1da72: 09 f4 brne .+2 ; 0x1da76 1da74: 80 e0 ldi r24, 0x00 ; 0 // u = _micros() - u; return ret; } 1da76: 26 96 adiw r28, 0x06 ; 6 1da78: 0f b6 in r0, 0x3f ; 63 1da7a: f8 94 cli 1da7c: de bf out 0x3e, r29 ; 62 1da7e: 0f be out 0x3f, r0 ; 63 1da80: cd bf out 0x3d, r28 ; 61 1da82: df 91 pop r29 1da84: cf 91 pop r28 1da86: 1f 91 pop r17 1da88: 0f 91 pop r16 1da8a: ff 90 pop r15 1da8c: ef 90 pop r14 1da8e: df 90 pop r13 1da90: cf 90 pop r12 1da92: bf 90 pop r11 1da94: af 90 pop r10 1da96: 9f 90 pop r9 1da98: 8f 90 pop r8 1da9a: 7f 90 pop r7 1da9c: 6f 90 pop r6 1da9e: 5f 90 pop r5 1daa0: 4f 90 pop r4 1daa2: 3f 90 pop r3 1daa4: 2f 90 pop r2 1daa6: 08 95 ret } cx -= dx; cy -= dy; cz -= dz; sm4_do_step(sm); uint16_t delay = SM4_DEFDELAY; 1daa8: 84 ef ldi r24, 0xF4 ; 244 1daaa: 91 e0 ldi r25, 0x01 ; 1 1daac: c8 cf rjmp .-112 ; 0x1da3e 0001daae : } static inline uint8_t spi_txrx(uint8_t tx) { SPDR = tx; 1daae: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))); 1dab0: 0d b4 in r0, 0x2d ; 45 1dab2: 07 fe sbrs r0, 7 1dab4: fd cf rjmp .-6 ; 0x1dab0 return SPDR; 1dab6: 8e b5 in r24, 0x2e ; 46 } 1dab8: 08 95 ret 0001daba : _CS_HIGH(); } uint8_t xflash_rd_status_reg(void) { _CS_LOW(); 1daba: 45 98 cbi 0x08, 5 ; 8 _SPI_TX(_CMD_RD_STATUS_REG); // send command 0x90 1dabc: 85 e0 ldi r24, 0x05 ; 5 1dabe: 0e 94 57 ed call 0x1daae ; 0x1daae uint8_t val = _SPI_RX(); // receive value 1dac2: 8f ef ldi r24, 0xFF ; 255 1dac4: 0e 94 57 ed call 0x1daae ; 0x1daae _CS_HIGH(); 1dac8: 45 9a sbi 0x08, 5 ; 8 ((xflash_mfrid == _MFRID_GD25Q20C) && (xflash_devid == _DEVID_GD25Q20C)); } void xflash_wait_busy(void) { while (xflash_rd_status_reg() & XFLASH_STATUS_BUSY) ; 1daca: 80 fd sbrc r24, 0 1dacc: f6 cf rjmp .-20 ; 0x1daba } 1dace: 08 95 ret 0001dad0 : _CS_HIGH(); return val; } static void xflash_send_cmdaddr(uint8_t cmd, uint32_t addr) { 1dad0: 1f 93 push r17 1dad2: cf 93 push r28 1dad4: df 93 push r29 1dad6: ea 01 movw r28, r20 1dad8: 16 2f mov r17, r22 _SPI_TX(cmd); // send command 0x03 1dada: 0e 94 57 ed call 0x1daae ; 0x1daae _SPI_TX(((uint8_t*)&addr)[2]); // send addr bits 16..23 1dade: 81 2f mov r24, r17 1dae0: 0e 94 57 ed call 0x1daae ; 0x1daae _SPI_TX(((uint8_t*)&addr)[1]); // send addr bits 8..15 1dae4: 8d 2f mov r24, r29 1dae6: 0e 94 57 ed call 0x1daae ; 0x1daae _SPI_TX(((uint8_t*)&addr)[0]); // send addr bits 0..7 1daea: 8c 2f mov r24, r28 } 1daec: df 91 pop r29 1daee: cf 91 pop r28 1daf0: 1f 91 pop r17 static void xflash_send_cmdaddr(uint8_t cmd, uint32_t addr) { _SPI_TX(cmd); // send command 0x03 _SPI_TX(((uint8_t*)&addr)[2]); // send addr bits 16..23 _SPI_TX(((uint8_t*)&addr)[1]); // send addr bits 8..15 _SPI_TX(((uint8_t*)&addr)[0]); // send addr bits 0..7 1daf2: 0c 94 57 ed jmp 0x1daae ; 0x1daae 0001daf6 : _CS_HIGH(); } void xflash_erase(uint8_t cmd, uint32_t addr) { _CS_LOW(); 1daf6: 45 98 cbi 0x08, 5 ; 8 xflash_send_cmdaddr(cmd, addr); 1daf8: 0e 94 68 ed call 0x1dad0 ; 0x1dad0 _CS_HIGH(); 1dafc: 45 9a sbi 0x08, 5 ; 8 } 1dafe: 08 95 ret 0001db00 : *(data++) = _SPI_RX(); _CS_HIGH(); } void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt) { 1db00: ef 92 push r14 1db02: ff 92 push r15 1db04: 0f 93 push r16 1db06: 1f 93 push r17 1db08: cf 93 push r28 1db0a: df 93 push r29 1db0c: 7a 01 movw r14, r20 1db0e: 89 01 movw r16, r18 _CS_LOW(); 1db10: 45 98 cbi 0x08, 5 ; 8 xflash_send_cmdaddr(_CMD_PAGE_PROGRAM, addr); 1db12: ab 01 movw r20, r22 1db14: bc 01 movw r22, r24 1db16: 82 e0 ldi r24, 0x02 ; 2 1db18: 0e 94 68 ed call 0x1dad0 ; 0x1dad0 1db1c: e7 01 movw r28, r14 1db1e: 0e 0d add r16, r14 1db20: 1f 1d adc r17, r15 while (cnt--) // send data 1db22: c0 17 cp r28, r16 1db24: d1 07 cpc r29, r17 1db26: 41 f4 brne .+16 ; 0x1db38 _SPI_TX(*(data++)); _CS_HIGH(); 1db28: 45 9a sbi 0x08, 5 ; 8 } 1db2a: df 91 pop r29 1db2c: cf 91 pop r28 1db2e: 1f 91 pop r17 1db30: 0f 91 pop r16 1db32: ff 90 pop r15 1db34: ef 90 pop r14 1db36: 08 95 ret void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt) { _CS_LOW(); xflash_send_cmdaddr(_CMD_PAGE_PROGRAM, addr); while (cnt--) // send data _SPI_TX(*(data++)); 1db38: 89 91 ld r24, Y+ 1db3a: 0e 94 57 ed call 0x1daae ; 0x1daae 1db3e: f1 cf rjmp .-30 ; 0x1db22 0001db40 : _SPI_TX(((uint8_t*)&addr)[1]); // send addr bits 8..15 _SPI_TX(((uint8_t*)&addr)[0]); // send addr bits 0..7 } void xflash_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt) { 1db40: ef 92 push r14 1db42: ff 92 push r15 1db44: 0f 93 push r16 1db46: 1f 93 push r17 1db48: cf 93 push r28 1db4a: df 93 push r29 1db4c: 7a 01 movw r14, r20 1db4e: 89 01 movw r16, r18 _CS_LOW(); 1db50: 45 98 cbi 0x08, 5 ; 8 xflash_send_cmdaddr(_CMD_RD_DATA, addr); 1db52: ab 01 movw r20, r22 1db54: bc 01 movw r22, r24 1db56: 83 e0 ldi r24, 0x03 ; 3 1db58: 0e 94 68 ed call 0x1dad0 ; 0x1dad0 1db5c: e7 01 movw r28, r14 1db5e: 0e 0d add r16, r14 1db60: 1f 1d adc r17, r15 while (cnt--) // receive data 1db62: c0 17 cp r28, r16 1db64: d1 07 cpc r29, r17 1db66: 41 f4 brne .+16 ; 0x1db78 *(data++) = _SPI_RX(); _CS_HIGH(); 1db68: 45 9a sbi 0x08, 5 ; 8 } 1db6a: df 91 pop r29 1db6c: cf 91 pop r28 1db6e: 1f 91 pop r17 1db70: 0f 91 pop r16 1db72: ff 90 pop r15 1db74: ef 90 pop r14 1db76: 08 95 ret void xflash_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt) { _CS_LOW(); xflash_send_cmdaddr(_CMD_RD_DATA, addr); while (cnt--) // receive data *(data++) = _SPI_RX(); 1db78: 8f ef ldi r24, 0xFF ; 255 1db7a: 0e 94 57 ed call 0x1daae ; 0x1daae 1db7e: 89 93 st Y+, r24 1db80: f0 cf rjmp .-32 ; 0x1db62 0001db82 : #include "asm.h" #include "xflash.h" #include "Marlin.h" // for softReset bool xfdump_check_state(dump_crash_reason* reason) { 1db82: 0f 93 push r16 1db84: 1f 93 push r17 1db86: cf 93 push r28 1db88: df 93 push r29 1db8a: 00 d0 rcall .+0 ; 0x1db8c 1db8c: 1f 92 push r1 1db8e: cd b7 in r28, 0x3d ; 61 1db90: de b7 in r29, 0x3e ; 62 1db92: 8c 01 movw r16, r24 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 1db94: 8c e5 ldi r24, 0x5C ; 92 1db96: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 1db98: 1d bc out 0x2d, r1 ; 45 uint32_t magic; XFLASH_SPI_ENTER(); xflash_rd_data(DUMP_OFFSET + offsetof(dump_t, header.magic), 1db9a: 24 e0 ldi r18, 0x04 ; 4 1db9c: 30 e0 ldi r19, 0x00 ; 0 1db9e: ae 01 movw r20, r28 1dba0: 4f 5f subi r20, 0xFF ; 255 1dba2: 5f 4f sbci r21, 0xFF ; 255 1dba4: 60 e0 ldi r22, 0x00 ; 0 1dba6: 70 ed ldi r23, 0xD0 ; 208 1dba8: 83 e0 ldi r24, 0x03 ; 3 1dbaa: 90 e0 ldi r25, 0x00 ; 0 1dbac: 0e 94 a0 ed call 0x1db40 ; 0x1db40 (uint8_t*)&magic, sizeof(magic)); if (magic != DUMP_MAGIC) 1dbb0: 89 81 ldd r24, Y+1 ; 0x01 1dbb2: 9a 81 ldd r25, Y+2 ; 0x02 1dbb4: ab 81 ldd r26, Y+3 ; 0x03 1dbb6: bc 81 ldd r27, Y+4 ; 0x04 1dbb8: 87 34 cpi r24, 0x47 ; 71 1dbba: 95 45 sbci r25, 0x55 ; 85 1dbbc: a2 45 sbci r26, 0x52 ; 82 1dbbe: b5 45 sbci r27, 0x55 ; 85 1dbc0: 71 f4 brne .+28 ; 0x1dbde return false; if (reason) 1dbc2: 01 15 cp r16, r1 1dbc4: 11 05 cpc r17, r1 1dbc6: 49 f0 breq .+18 ; 0x1dbda { xflash_rd_data(DUMP_OFFSET + offsetof(dump_t, header.crash_reason), 1dbc8: 21 e0 ldi r18, 0x01 ; 1 1dbca: 30 e0 ldi r19, 0x00 ; 0 1dbcc: a8 01 movw r20, r16 1dbce: 65 e0 ldi r22, 0x05 ; 5 1dbd0: 70 ed ldi r23, 0xD0 ; 208 1dbd2: 83 e0 ldi r24, 0x03 ; 3 1dbd4: 90 e0 ldi r25, 0x00 ; 0 1dbd6: 0e 94 a0 ed call 0x1db40 ; 0x1db40 (uint8_t*)reason, sizeof(*reason)); } return true; 1dbda: 81 e0 ldi r24, 0x01 ; 1 1dbdc: 01 c0 rjmp .+2 ; 0x1dbe0 XFLASH_SPI_ENTER(); xflash_rd_data(DUMP_OFFSET + offsetof(dump_t, header.magic), (uint8_t*)&magic, sizeof(magic)); if (magic != DUMP_MAGIC) return false; 1dbde: 80 e0 ldi r24, 0x00 ; 0 { xflash_rd_data(DUMP_OFFSET + offsetof(dump_t, header.crash_reason), (uint8_t*)reason, sizeof(*reason)); } return true; } 1dbe0: 0f 90 pop r0 1dbe2: 0f 90 pop r0 1dbe4: 0f 90 pop r0 1dbe6: 0f 90 pop r0 1dbe8: df 91 pop r29 1dbea: cf 91 pop r28 1dbec: 1f 91 pop r17 1dbee: 0f 91 pop r16 1dbf0: 08 95 ret 0001dbf2 : return 1; } void xflash_enable_wr(void) { _CS_LOW(); 1dbf2: 45 98 cbi 0x08, 5 ; 8 _SPI_TX(_CMD_ENABLE_WR); // send command 0x06 1dbf4: 86 e0 ldi r24, 0x06 ; 6 1dbf6: 0e 94 57 ed call 0x1daae ; 0x1daae _CS_HIGH(); 1dbfa: 45 9a sbi 0x08, 5 ; 8 } 1dbfc: 08 95 ret 0001dbfe : } } static void __attribute__((noinline)) xfdump_dump_core(dump_header_t& hdr, uint32_t addr, uint8_t* buf, uint16_t cnt) { 1dbfe: 4f 92 push r4 1dc00: 5f 92 push r5 1dc02: 6f 92 push r6 1dc04: 7f 92 push r7 1dc06: 8f 92 push r8 1dc08: 9f 92 push r9 1dc0a: af 92 push r10 1dc0c: bf 92 push r11 1dc0e: ef 92 push r14 1dc10: ff 92 push r15 1dc12: 0f 93 push r16 1dc14: 1f 93 push r17 1dc16: cf 93 push r28 1dc18: df 93 push r29 1dc1a: 7c 01 movw r14, r24 1dc1c: 4a 01 movw r8, r20 1dc1e: 5b 01 movw r10, r22 1dc20: e9 01 movw r28, r18 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 1dc22: 8c e5 ldi r24, 0x5C ; 92 1dc24: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 1dc26: 1d bc out 0x2d, r1 ; 45 } static void xfdump_erase() { for(uint32_t addr = DUMP_OFFSET; 1dc28: 41 2c mov r4, r1 1dc2a: 80 ed ldi r24, 0xD0 ; 208 1dc2c: 58 2e mov r5, r24 1dc2e: 83 e0 ldi r24, 0x03 ; 3 1dc30: 68 2e mov r6, r24 1dc32: 71 2c mov r7, r1 addr < DUMP_OFFSET + DUMP_SIZE; addr += 4096) { xflash_enable_wr(); 1dc34: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 _CS_HIGH(); } void xflash_sector_erase(uint32_t addr) { return xflash_erase(_CMD_SECTOR_ERASE, addr); 1dc38: b3 01 movw r22, r6 1dc3a: a2 01 movw r20, r4 1dc3c: 80 e2 ldi r24, 0x20 ; 32 1dc3e: 0e 94 7b ed call 0x1daf6 ; 0x1daf6 xflash_sector_erase(addr); xflash_wait_busy(); 1dc42: 0e 94 5d ed call 0x1daba ; 0x1daba static void xfdump_erase() { for(uint32_t addr = DUMP_OFFSET; addr < DUMP_OFFSET + DUMP_SIZE; addr += 4096) 1dc46: 80 e1 ldi r24, 0x10 ; 16 1dc48: 58 0e add r5, r24 1dc4a: 61 1c adc r6, r1 1dc4c: 71 1c adc r7, r1 static void xfdump_erase() { for(uint32_t addr = DUMP_OFFSET; addr < DUMP_OFFSET + DUMP_SIZE; 1dc4e: 41 14 cp r4, r1 1dc50: 51 04 cpc r5, r1 1dc52: e4 e0 ldi r30, 0x04 ; 4 1dc54: 6e 06 cpc r6, r30 1dc56: 71 04 cpc r7, r1 1dc58: 69 f7 brne .-38 ; 0x1dc34 // start by clearing all sectors (we need all of them in any case) xfdump_erase(); // sample SP/PC hdr.sp = SP; 1dc5a: 8d b7 in r24, 0x3d ; 61 1dc5c: 9e b7 in r25, 0x3e ; 62 1dc5e: f7 01 movw r30, r14 1dc60: 93 87 std Z+11, r25 ; 0x0b 1dc62: 82 87 std Z+10, r24 ; 0x0a "rcall .\n" "pop %A0\n" "pop %B0\n" "pop %C0\n" : "=&r" (ret) ); 1dc64: 00 d0 rcall .+0 ; 0x1dc66 1dc66: 8f 91 pop r24 1dc68: 9f 91 pop r25 1dc6a: af 91 pop r26 hdr.pc = GETPC(); 1dc6c: b0 e0 ldi r27, 0x00 ; 0 1dc6e: 86 83 std Z+6, r24 ; 0x06 1dc70: 97 83 std Z+7, r25 ; 0x07 1dc72: a0 87 std Z+8, r26 ; 0x08 1dc74: b1 87 std Z+9, r27 ; 0x09 // write header static_assert(sizeof(hdr) <= 256, "header is larger than a single page write"); xflash_enable_wr(); 1dc76: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 xflash_page_program(DUMP_OFFSET, (uint8_t*)&hdr, sizeof(hdr)); 1dc7a: 2c e0 ldi r18, 0x0C ; 12 1dc7c: 30 e0 ldi r19, 0x00 ; 0 1dc7e: a7 01 movw r20, r14 1dc80: 60 e0 ldi r22, 0x00 ; 0 1dc82: 70 ed ldi r23, 0xD0 ; 208 1dc84: 83 e0 ldi r24, 0x03 ; 3 1dc86: 90 e0 ldi r25, 0x00 ; 0 1dc88: 0e 94 80 ed call 0x1db00 ; 0x1db00 xflash_wait_busy(); 1dc8c: 0e 94 5d ed call 0x1daba ; 0x1daba void xflash_multipage_program(uint32_t addr, uint8_t* data, uint16_t cnt) { while(cnt) { xflash_enable_wr(); 1dc90: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 _CS_LOW(); 1dc94: 45 98 cbi 0x08, 5 ; 8 xflash_send_cmdaddr(_CMD_PAGE_PROGRAM, addr); 1dc96: b5 01 movw r22, r10 1dc98: a4 01 movw r20, r8 1dc9a: 82 e0 ldi r24, 0x02 ; 2 1dc9c: 0e 94 68 ed call 0x1dad0 ; 0x1dad0 1dca0: fe 01 movw r30, r28 while(1) { // send data _SPI_TX(*(data++)); 1dca2: 21 96 adiw r28, 0x01 ; 1 1dca4: 80 81 ld r24, Z 1dca6: 0e 94 57 ed call 0x1daae ; 0x1daae if(!--cnt || !(++addr & 0xFF)) 1dcaa: 01 50 subi r16, 0x01 ; 1 1dcac: 11 09 sbc r17, r1 1dcae: 41 f0 breq .+16 ; 0x1dcc0 1dcb0: ff ef ldi r31, 0xFF ; 255 1dcb2: 8f 1a sub r8, r31 1dcb4: 9f 0a sbc r9, r31 1dcb6: af 0a sbc r10, r31 1dcb8: bf 0a sbc r11, r31 _CS_LOW(); xflash_send_cmdaddr(_CMD_PAGE_PROGRAM, addr); while(1) { // send data _SPI_TX(*(data++)); 1dcba: fe 01 movw r30, r28 if(!--cnt || !(++addr & 0xFF)) 1dcbc: 81 10 cpse r8, r1 1dcbe: f1 cf rjmp .-30 ; 0x1dca2 { // on a page boundary or end of write _CS_HIGH(); 1dcc0: 45 9a sbi 0x08, 5 ; 8 xflash_wait_busy(); 1dcc2: 0e 94 5d ed call 0x1daba ; 0x1daba _CS_HIGH(); } void xflash_multipage_program(uint32_t addr, uint8_t* data, uint16_t cnt) { while(cnt) 1dcc6: 01 15 cp r16, r1 1dcc8: 11 05 cpc r17, r1 1dcca: 11 f7 brne .-60 ; 0x1dc90 // write data static_assert(sizeof(dump_t::data) <= RAMEND+1, "dump area size insufficient"); xflash_multipage_program(addr, buf, cnt); } 1dccc: df 91 pop r29 1dcce: cf 91 pop r28 1dcd0: 1f 91 pop r17 1dcd2: 0f 91 pop r16 1dcd4: ff 90 pop r15 1dcd6: ef 90 pop r14 1dcd8: bf 90 pop r11 1dcda: af 90 pop r10 1dcdc: 9f 90 pop r9 1dcde: 8f 90 pop r8 1dce0: 7f 90 pop r7 1dce2: 6f 90 pop r6 1dce4: 5f 90 pop r5 1dce6: 4f 90 pop r4 1dce8: 08 95 ret 0001dcea : (uint8_t*)RAMSTART, RAMSIZE); } void xfdump_full_dump_and_reset(dump_crash_reason reason) { 1dcea: cf 93 push r28 1dcec: df 93 push r29 1dcee: cd b7 in r28, 0x3d ; 61 1dcf0: de b7 in r29, 0x3e ; 62 1dcf2: 2c 97 sbiw r28, 0x0c ; 12 1dcf4: 0f b6 in r0, 0x3f ; 63 1dcf6: f8 94 cli 1dcf8: de bf out 0x3e, r29 ; 62 1dcfa: 0f be out 0x3f, r0 ; 63 1dcfc: cd bf out 0x3d, r28 ; 61 dump_header_t buf; buf.magic = DUMP_MAGIC; 1dcfe: 47 e4 ldi r20, 0x47 ; 71 1dd00: 55 e5 ldi r21, 0x55 ; 85 1dd02: 62 e5 ldi r22, 0x52 ; 82 1dd04: 75 e5 ldi r23, 0x55 ; 85 1dd06: 49 83 std Y+1, r20 ; 0x01 1dd08: 5a 83 std Y+2, r21 ; 0x02 1dd0a: 6b 83 std Y+3, r22 ; 0x03 1dd0c: 7c 83 std Y+4, r23 ; 0x04 buf.regs_present = true; 1dd0e: 91 e0 ldi r25, 0x01 ; 1 1dd10: 9d 83 std Y+5, r25 ; 0x05 buf.crash_reason = (uint8_t)reason; 1dd12: 8e 83 std Y+6, r24 ; 0x06 // disable interrupts for a cleaner register dump cli(); 1dd14: f8 94 cli 1dd16: 88 e1 ldi r24, 0x18 ; 24 1dd18: 9d e0 ldi r25, 0x0D ; 13 1dd1a: 0f b6 in r0, 0x3f ; 63 1dd1c: f8 94 cli 1dd1e: a8 95 wdr 1dd20: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1dd24: 0f be out 0x3f, r0 ; 63 1dd26: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> // ensure there's always enough time (with some margin) to dump // dump time on w25x20cl: ~150ms wdt_enable(WDTO_500MS); // write all addressable ranges (this will trash bidirectional registers) xfdump_dump_core(buf, DUMP_OFFSET + offsetof(dump_t, data), 0, RAMEND+1); 1dd2a: 00 e0 ldi r16, 0x00 ; 0 1dd2c: 12 e2 ldi r17, 0x22 ; 34 1dd2e: 30 e0 ldi r19, 0x00 ; 0 1dd30: 20 e0 ldi r18, 0x00 ; 0 1dd32: 40 e0 ldi r20, 0x00 ; 0 1dd34: 51 ed ldi r21, 0xD1 ; 209 1dd36: 63 e0 ldi r22, 0x03 ; 3 1dd38: 70 e0 ldi r23, 0x00 ; 0 1dd3a: ce 01 movw r24, r28 1dd3c: 01 96 adiw r24, 0x01 ; 1 1dd3e: 0e 94 ff ed call 0x1dbfe ; 0x1dbfe // force a reset even sooner softReset(); 1dd42: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 0001dd46 : xflash_multipage_program(addr, buf, cnt); } void xfdump_dump() { 1dd46: 0f 93 push r16 1dd48: 1f 93 push r17 1dd4a: cf 93 push r28 1dd4c: df 93 push r29 1dd4e: cd b7 in r28, 0x3d ; 61 1dd50: de b7 in r29, 0x3e ; 62 1dd52: 2c 97 sbiw r28, 0x0c ; 12 1dd54: 0f b6 in r0, 0x3f ; 63 1dd56: f8 94 cli 1dd58: de bf out 0x3e, r29 ; 62 1dd5a: 0f be out 0x3f, r0 ; 63 1dd5c: cd bf out 0x3d, r28 ; 61 dump_header_t buf; buf.magic = DUMP_MAGIC; 1dd5e: 87 e4 ldi r24, 0x47 ; 71 1dd60: 95 e5 ldi r25, 0x55 ; 85 1dd62: a2 e5 ldi r26, 0x52 ; 82 1dd64: b5 e5 ldi r27, 0x55 ; 85 1dd66: 89 83 std Y+1, r24 ; 0x01 1dd68: 9a 83 std Y+2, r25 ; 0x02 1dd6a: ab 83 std Y+3, r26 ; 0x03 1dd6c: bc 83 std Y+4, r27 ; 0x04 buf.regs_present = false; 1dd6e: 1d 82 std Y+5, r1 ; 0x05 buf.crash_reason = (uint8_t)dump_crash_reason::manual; 1dd70: 1e 82 std Y+6, r1 ; 0x06 // write sram only xfdump_dump_core(buf, DUMP_OFFSET + offsetof(dump_t, data.sram), 1dd72: 00 e0 ldi r16, 0x00 ; 0 1dd74: 10 e2 ldi r17, 0x20 ; 32 1dd76: 20 e0 ldi r18, 0x00 ; 0 1dd78: 32 e0 ldi r19, 0x02 ; 2 1dd7a: 40 e0 ldi r20, 0x00 ; 0 1dd7c: 53 ed ldi r21, 0xD3 ; 211 1dd7e: 63 e0 ldi r22, 0x03 ; 3 1dd80: 70 e0 ldi r23, 0x00 ; 0 1dd82: ce 01 movw r24, r28 1dd84: 01 96 adiw r24, 0x01 ; 1 1dd86: 0e 94 ff ed call 0x1dbfe ; 0x1dbfe (uint8_t*)RAMSTART, RAMSIZE); } 1dd8a: 2c 96 adiw r28, 0x0c ; 12 1dd8c: 0f b6 in r0, 0x3f ; 63 1dd8e: f8 94 cli 1dd90: de bf out 0x3e, r29 ; 62 1dd92: 0f be out 0x3f, r0 ; 63 1dd94: cd bf out 0x3d, r28 ; 61 1dd96: df 91 pop r29 1dd98: cf 91 pop r28 1dd9a: 1f 91 pop r17 1dd9c: 0f 91 pop r16 1dd9e: 08 95 ret 0001dda0 : int xflash_mfrid_devid(void); int8_t xflash_init(void) { 1dda0: cf 93 push r28 _CS_HIGH(); 1dda2: 45 9a sbi 0x08, 5 ; 8 SET_OUTPUT(XFLASH_PIN_CS); 1dda4: 3d 9a sbi 0x07, 5 ; 7 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 1dda6: 8c e5 ldi r24, 0x5C ; 92 1dda8: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 1ddaa: 1d bc out 0x2d, r1 ; 45 _CS_HIGH(); } int xflash_mfrid_devid(void) { _CS_LOW(); 1ddac: 45 98 cbi 0x08, 5 ; 8 _SPI_TX(_CMD_MFRID_DEVID); // send command 0x90 1ddae: 80 e9 ldi r24, 0x90 ; 144 1ddb0: 0e 94 57 ed call 0x1daae ; 0x1daae uint8_t cnt = 3; // 3 address bytes while (cnt--) // send address bytes _SPI_TX(0x00); 1ddb4: 80 e0 ldi r24, 0x00 ; 0 1ddb6: 0e 94 57 ed call 0x1daae ; 0x1daae 1ddba: 80 e0 ldi r24, 0x00 ; 0 1ddbc: 0e 94 57 ed call 0x1daae ; 0x1daae 1ddc0: 80 e0 ldi r24, 0x00 ; 0 1ddc2: 0e 94 57 ed call 0x1daae ; 0x1daae uint8_t xflash_mfrid = _SPI_RX(); // receive mfrid 1ddc6: 8f ef ldi r24, 0xFF ; 255 1ddc8: 0e 94 57 ed call 0x1daae ; 0x1daae 1ddcc: c8 2f mov r28, r24 uint8_t xflash_devid = _SPI_RX(); // receive devid 1ddce: 8f ef ldi r24, 0xFF ; 255 1ddd0: 0e 94 57 ed call 0x1daae ; 0x1daae 1ddd4: 98 2f mov r25, r24 _CS_HIGH(); 1ddd6: 45 9a sbi 0x08, 5 ; 8 return ((xflash_mfrid == _MFRID_W25X20CL) && (xflash_devid == _DEVID_W25X20CL)) || 1ddd8: cf 3e cpi r28, 0xEF ; 239 1ddda: 11 f0 breq .+4 ; 0x1dde0 1dddc: c8 3c cpi r28, 0xC8 ; 200 1ddde: 19 f4 brne .+6 ; 0x1dde6 1dde0: 81 e0 ldi r24, 0x01 ; 1 1dde2: 91 31 cpi r25, 0x11 ; 17 1dde4: 09 f0 breq .+2 ; 0x1dde8 int8_t xflash_init(void) { _CS_HIGH(); SET_OUTPUT(XFLASH_PIN_CS); XFLASH_SPI_ENTER(); if (!xflash_mfrid_devid()) return 0; 1dde6: 80 e0 ldi r24, 0x00 ; 0 return 1; } 1dde8: cf 91 pop r28 1ddea: 08 95 ret 0001ddec : status |= components; eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } void calibration_status_clear(CalibrationStatus components) { 1ddec: cf 93 push r28 1ddee: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1ddf0: 86 ea ldi r24, 0xA6 ; 166 1ddf2: 9c e0 ldi r25, 0x0C ; 12 1ddf4: 0f 94 10 dc call 0x3b820 ; 0x3b820 status &= ~components; 1ddf8: c0 95 com r28 1ddfa: 6c 2f mov r22, r28 1ddfc: 68 23 and r22, r24 1ddfe: 86 ea ldi r24, 0xA6 ; 166 1de00: 9c e0 ldi r25, 0x0C ; 12 eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } 1de02: cf 91 pop r28 1de04: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001de08 : } } } static void lcd_reset_sheet() { 1de08: 1f 93 push r17 1de0a: cf 93 push r28 1de0c: df 93 push r29 1de0e: 00 d0 rcall .+0 ; 0x1de10 1de10: 00 d0 rcall .+0 ; 0x1de12 1de12: 1f 92 push r1 1de14: 1f 92 push r1 1de16: cd b7 in r28, 0x3d ; 61 1de18: de b7 in r29, 0x3e ; 62 SheetName sheetName; eeprom_default_sheet_name(selected_sheet, sheetName); 1de1a: be 01 movw r22, r28 1de1c: 6f 5f subi r22, 0xFF ; 255 1de1e: 7f 4f sbci r23, 0xFF ; 255 1de20: 80 91 e0 03 lds r24, 0x03E0 ; 0x8003e0 1de24: 0e 94 09 76 call 0xec12 ; 0xec12 eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16); 1de28: 80 91 e0 03 lds r24, 0x03E0 ; 0x8003e0 1de2c: 1b e0 ldi r17, 0x0B ; 11 1de2e: 81 9f mul r24, r17 1de30: c0 01 movw r24, r0 1de32: 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); 1de34: 6f ef ldi r22, 0xFF ; 255 1de36: 7f ef ldi r23, 0xFF ; 255 1de38: 80 5b subi r24, 0xB0 ; 176 1de3a: 92 4f sbci r25, 0xF2 ; 242 1de3c: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 eeprom_update_block_notify(sheetName.c,EEPROM_Sheets_base->s[selected_sheet].name,sizeof(Sheet::name)); 1de40: 60 91 e0 03 lds r22, 0x03E0 ; 0x8003e0 1de44: 61 9f mul r22, r17 1de46: b0 01 movw r22, r0 1de48: 11 24 eor r1, r1 1de4a: 67 5b subi r22, 0xB7 ; 183 1de4c: 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); 1de4e: 47 e0 ldi r20, 0x07 ; 7 1de50: 50 e0 ldi r21, 0x00 ; 0 1de52: ce 01 movw r24, r28 1de54: 01 96 adiw r24, 0x01 ; 1 1de56: 0f 94 24 dc call 0x3b848 ; 0x3b848 if (selected_sheet == eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) 1de5a: 81 ea ldi r24, 0xA1 ; 161 1de5c: 9d e0 ldi r25, 0x0D ; 13 1de5e: 0f 94 10 dc call 0x3b820 ; 0x3b820 1de62: 90 91 e0 03 lds r25, 0x03E0 ; 0x8003e0 1de66: 89 13 cpse r24, r25 1de68: 0a c0 rjmp .+20 ; 0x1de7e { eeprom_switch_to_next_sheet(); 1de6a: 0e 94 fb 75 call 0xebf6 ; 0xebf6 if (-1 == eeprom_next_initialized_sheet(0)) 1de6e: 80 e0 ldi r24, 0x00 ; 0 1de70: 0e 94 e7 75 call 0xebce ; 0xebce 1de74: 8f 3f cpi r24, 0xFF ; 255 1de76: 19 f4 brne .+6 ; 0x1de7e calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 1de78: 80 e1 ldi r24, 0x10 ; 16 1de7a: 0e 94 f6 ee call 0x1ddec ; 0x1ddec } menu_back(); 1de7e: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 } 1de82: 28 96 adiw r28, 0x08 ; 8 1de84: 0f b6 in r0, 0x3f ; 63 1de86: f8 94 cli 1de88: de bf out 0x3e, r29 ; 62 1de8a: 0f be out 0x3f, r0 ; 63 1de8c: cd bf out 0x3d, r28 ; 61 1de8e: df 91 pop r29 1de90: cf 91 pop r28 1de92: 1f 91 pop r17 1de94: 08 95 ret 0001de96 : CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); return ((status & components) == components); } void calibration_status_set(CalibrationStatus components) { 1de96: cf 93 push r28 1de98: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1de9a: 86 ea ldi r24, 0xA6 ; 166 1de9c: 9c e0 ldi r25, 0x0C ; 12 1de9e: 0f 94 10 dc call 0x3b820 ; 0x3b820 status |= components; 1dea2: 68 2f mov r22, r24 1dea4: 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); 1dea6: 86 ea ldi r24, 0xA6 ; 166 1dea8: 9c e0 ldi r25, 0x0C ; 12 eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status); } 1deaa: cf 91 pop r28 1deac: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0001deb0 : sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]); } bool calibration_status_get(CalibrationStatus components) { 1deb0: cf 93 push r28 1deb2: c8 2f mov r28, r24 CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2); 1deb4: 86 ea ldi r24, 0xA6 ; 166 1deb6: 9c e0 ldi r25, 0x0C ; 12 1deb8: 0f 94 10 dc call 0x3b820 ; 0x3b820 return ((status & components) == components); 1debc: 98 2f mov r25, r24 1debe: 9c 23 and r25, r28 1dec0: 81 e0 ldi r24, 0x01 ; 1 1dec2: 9c 13 cpse r25, r28 1dec4: 80 e0 ldi r24, 0x00 ; 0 } 1dec6: cf 91 pop r28 1dec8: 08 95 ret 0001deca : //! |>Continue | MSG_CONTINUE //! | Reset | MSG_RESET //! ---------------------- //! @endcode void lcd_first_layer_calibration_reset() { 1deca: af 92 push r10 1decc: bf 92 push r11 1dece: cf 92 push r12 1ded0: df 92 push r13 1ded2: ef 92 push r14 1ded4: ff 92 push r15 1ded6: 0f 93 push r16 1ded8: 1f 93 push r17 1deda: cf 93 push r28 1dedc: df 93 push r29 1dede: 00 d0 rcall .+0 ; 0x1dee0 1dee0: 00 d0 rcall .+0 ; 0x1dee2 1dee2: 1f 92 push r1 1dee4: cd b7 in r28, 0x3d ; 61 1dee6: 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)) || 1dee8: 80 91 a6 03 lds r24, 0x03A6 ; 0x8003a6 1deec: 81 11 cpse r24, r1 1deee: 18 c0 rjmp .+48 ; 0x1df20 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))) || 1def0: 81 ea ldi r24, 0xA1 ; 161 1def2: 9d e0 ldi r25, 0x0D ; 13 1def4: 0f 94 10 dc call 0x3b820 ; 0x3b820 1def8: 18 2f mov r17, r24 1defa: 0e 94 d9 75 call 0xebb2 ; 0xebb2 1defe: 88 23 and r24, r24 1df00: 79 f0 breq .+30 ; 0x1df20 (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) || 1df02: 80 e1 ldi r24, 0x10 ; 16 1df04: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 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))) || 1df08: 88 23 and r24, r24 1df0a: 51 f0 breq .+20 ; 0x1df20 (!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))))) 1df0c: 2b e0 ldi r18, 0x0B ; 11 1df0e: 12 9f mul r17, r18 1df10: c0 01 movw r24, r0 1df12: 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 1df14: 80 5b subi r24, 0xB0 ; 176 1df16: 92 4f sbci r25, 0xF2 ; 242 1df18: 0f 94 1e dc call 0x3b83c ; 0x3b83c } 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)) || 1df1c: 89 2b or r24, r25 1df1e: f1 f4 brne .+60 ; 0x1df5c (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) 1df20: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 1df24: 88 23 and r24, r24 1df26: 71 f0 breq .+28 ; 0x1df44 { eeprom_update_word_notify(reinterpret_cast(&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset), 0xffff); 1df28: 81 ea ldi r24, 0xA1 ; 161 1df2a: 9d e0 ldi r25, 0x0D ; 13 1df2c: 0f 94 10 dc call 0x3b820 ; 0x3b820 1df30: 2b e0 ldi r18, 0x0B ; 11 1df32: 82 9f mul r24, r18 1df34: c0 01 movw r24, r0 1df36: 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); 1df38: 6f ef ldi r22, 0xFF ; 255 1df3a: 7f ef ldi r23, 0xFF ; 255 1df3c: 80 5b subi r24, 0xB0 ; 176 1df3e: 92 4f sbci r25, 0xF2 ; 242 1df40: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 } // 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()); 1df44: 0e 94 95 70 call 0xe12a ; 0xe12a 1df48: 21 e0 ldi r18, 0x01 ; 1 1df4a: 81 11 cpse r24, r1 1df4c: 20 e0 ldi r18, 0x00 ; 0 1df4e: 41 e0 ldi r20, 0x01 ; 1 1df50: 70 e0 ldi r23, 0x00 ; 0 1df52: 60 e0 ldi r22, 0x00 ; 0 1df54: 80 e9 ldi r24, 0x90 ; 144 1df56: 95 ee ldi r25, 0xE5 ; 229 1df58: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 } if (lcd_encoder) { 1df5c: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 1df60: 30 91 70 06 lds r19, 0x0670 ; 0x800670 1df64: 21 15 cp r18, r1 1df66: 31 05 cpc r19, r1 1df68: 59 f0 breq .+22 ; 0x1df80 menuData->reset = lcd_encoder > 0; 1df6a: 81 e0 ldi r24, 0x01 ; 1 1df6c: 12 16 cp r1, r18 1df6e: 13 06 cpc r1, r19 1df70: 0c f0 brlt .+2 ; 0x1df74 1df72: 80 e0 ldi r24, 0x00 ; 0 1df74: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 lcd_encoder = 0; // Reset 1df78: 10 92 70 06 sts 0x0670, r1 ; 0x800670 1df7c: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f } 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)); 1df80: 81 ea ldi r24, 0xA1 ; 161 1df82: 9d e0 ldi r25, 0x0D ; 13 1df84: 0f 94 10 dc call 0x3b820 ; 0x3b820 1df88: 1b e0 ldi r17, 0x0B ; 11 1df8a: 81 9f mul r24, r17 1df8c: b0 01 movw r22, r0 1df8e: 11 24 eor r1, r1 1df90: 67 5b subi r22, 0xB7 ; 183 1df92: 72 4f sbci r23, 0xF2 ; 242 1df94: 47 e0 ldi r20, 0x07 ; 7 1df96: 50 e0 ldi r21, 0x00 ; 0 1df98: ce 01 movw r24, r28 1df9a: 01 96 adiw r24, 0x01 ; 1 1df9c: 7c 01 movw r14, r24 1df9e: 0f 94 00 dc call 0x3b800 ; 0x3b800 lcd_home(); 1dfa2: 0e 94 a4 6e call 0xdd48 ; 0xdd48 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]; 1dfa6: 81 ea ldi r24, 0xA1 ; 161 1dfa8: 9d e0 ldi r25, 0x0D ; 13 1dfaa: 0f 94 10 dc call 0x3b820 ; 0x3b820 1dfae: 81 9f mul r24, r17 1dfb0: c0 01 movw r24, r0 1dfb2: 11 24 eor r1, r1 1dfb4: 80 5b subi r24, 0xB0 ; 176 1dfb6: 92 4f sbci r25, 0xF2 ; 242 1dfb8: 0f 94 1e dc call 0x3b83c ; 0x3b83c 1dfbc: bc 01 movw r22, r24 1dfbe: 99 0f add r25, r25 1dfc0: 88 0b sbc r24, r24 1dfc2: 99 0b sbc r25, r25 1dfc4: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 1dfc8: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 1dfcc: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 1dfd0: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 1dfd4: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 1dfd8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 1dfdc: d6 2e mov r13, r22 1dfde: c7 2e mov r12, r23 1dfe0: b8 2e mov r11, r24 1dfe2: a9 2e mov r10, r25 lcd_printf_P(_T(MSG_SHEET_OFFSET), 1dfe4: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 1dfe8: 0e e3 ldi r16, 0x3E ; 62 1dfea: 10 e2 ldi r17, 0x20 ; 32 1dfec: 81 11 cpse r24, r1 1dfee: 02 c0 rjmp .+4 ; 0x1dff4 1dff0: 00 e2 ldi r16, 0x20 ; 32 1dff2: 1e e3 ldi r17, 0x3E ; 62 1dff4: 8b e0 ldi r24, 0x0B ; 11 1dff6: 9b e3 ldi r25, 0x3B ; 59 1dff8: 0e 94 44 72 call 0xe488 ; 0xe488 1dffc: 1f 92 push r1 1dffe: 0f 93 push r16 1e000: 1f 92 push r1 1e002: 1f 93 push r17 1e004: af 92 push r10 1e006: bf 92 push r11 1e008: cf 92 push r12 1e00a: df 92 push r13 1e00c: ff 92 push r15 1e00e: ef 92 push r14 1e010: 9f 93 push r25 1e012: 8f 93 push r24 1e014: 0e 94 51 6e call 0xdca2 ; 0xdca2 1e018: 0f b6 in r0, 0x3f ; 63 1e01a: f8 94 cli 1e01c: de bf out 0x3e, r29 ; 62 1e01e: 0f be out 0x3f, r0 ; 63 1e020: 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. } 1e022: 27 96 adiw r28, 0x07 ; 7 1e024: 0f b6 in r0, 0x3f ; 63 1e026: f8 94 cli 1e028: de bf out 0x3e, r29 ; 62 1e02a: 0f be out 0x3f, r0 ; 63 1e02c: cd bf out 0x3d, r28 ; 61 1e02e: df 91 pop r29 1e030: cf 91 pop r28 1e032: 1f 91 pop r17 1e034: 0f 91 pop r16 1e036: ff 90 pop r15 1e038: ef 90 pop r14 1e03a: df 90 pop r13 1e03c: cf 90 pop r12 1e03e: bf 90 pop r11 1e040: af 90 pop r10 1e042: 08 95 ret 0001e044 : if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e044: 60 91 e0 03 lds r22, 0x03E0 ; 0x8003e0 1e048: 81 ea ldi r24, 0xA1 ; 161 1e04a: 9d e0 ldi r25, 0x0D ; 13 1e04c: 0f 94 34 dc call 0x3b868 ; 0x3b868 //! @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(); 1e050: 0c 94 65 ef jmp 0x1deca ; 0x1deca 0001e054 : return false; } // Parse a major.minor.revision version number. // Return true if valid. bool parse_version(const char *str, uint16_t version[4]) { 1e054: 0f 93 push r16 1e056: 1f 93 push r17 1e058: 8b 01 movw r16, r22 for(uint8_t i = 0; i < 2; ++i){ str = Number(str, version + i); 1e05a: 0e 94 8f ce call 0x19d1e ; 0x19d1e if (*str != '.') 1e05e: fc 01 movw r30, r24 1e060: 20 81 ld r18, Z 1e062: 2e 32 cpi r18, 0x2E ; 46 1e064: 11 f0 breq .+4 ; 0x1e06a 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 1e066: 80 e0 ldi r24, 0x00 ; 0 1e068: 34 c0 rjmp .+104 ; 0x1e0d2 // 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); 1e06a: b8 01 movw r22, r16 1e06c: 6e 5f subi r22, 0xFE ; 254 1e06e: 7f 4f sbci r23, 0xFF ; 255 1e070: 01 96 adiw r24, 0x01 ; 1 1e072: 0e 94 8f ce call 0x19d1e ; 0x19d1e if (*str != '.') 1e076: fc 01 movw r30, r24 1e078: 20 81 ld r18, Z 1e07a: 2e 32 cpi r18, 0x2E ; 46 1e07c: a1 f7 brne .-24 ; 0x1e066 return false; ++str; } str = Number(str, version + 2); 1e07e: b8 01 movw r22, r16 1e080: 6c 5f subi r22, 0xFC ; 252 1e082: 7f 4f sbci r23, 0xFF ; 255 1e084: 01 96 adiw r24, 0x01 ; 1 1e086: 0e 94 8f ce call 0x19d1e ; 0x19d1e version[3] = FIRMWARE_REVISION_RELEASED; 1e08a: 20 e4 ldi r18, 0x40 ; 64 1e08c: 30 e0 ldi r19, 0x00 ; 0 1e08e: f8 01 movw r30, r16 1e090: 37 83 std Z+7, r19 ; 0x07 1e092: 26 83 std Z+6, r18 ; 0x06 1e094: fc 01 movw r30, r24 1e096: df 01 movw r26, r30 // skip everything else until eol or '-' for(;;){ if(is_whitespace_or_nl_or_eol(*str)){ 1e098: 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'; 1e09a: 89 2f mov r24, r25 1e09c: 8f 7d andi r24, 0xDF ; 223 1e09e: c1 f1 breq .+112 ; 0x1e110 1e0a0: 87 ef ldi r24, 0xF7 ; 247 1e0a2: 89 0f add r24, r25 1e0a4: 82 30 cpi r24, 0x02 ; 2 1e0a6: a0 f1 brcs .+104 ; 0x1e110 1e0a8: 9d 30 cpi r25, 0x0D ; 13 1e0aa: 91 f1 breq .+100 ; 0x1e110 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 == '-'){ 1e0ac: 9d 32 cpi r25, 0x2D ; 45 1e0ae: 99 f7 brne .-26 ; 0x1e096 // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); if (*str++ == '-') { switch(*str){ 1e0b0: 11 96 adiw r26, 0x01 ; 1 1e0b2: 9c 91 ld r25, X 1e0b4: 92 34 cpi r25, 0x42 ; 66 1e0b6: e1 f0 breq .+56 ; 0x1e0f0 1e0b8: 7c f4 brge .+30 ; 0x1e0d8 1e0ba: 91 34 cpi r25, 0x41 ; 65 1e0bc: a1 f6 brne .-88 ; 0x1e066 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); 1e0be: 0a 5f subi r16, 0xFA ; 250 1e0c0: 1f 4f sbci r17, 0xFF ; 255 1e0c2: 28 e0 ldi r18, 0x08 ; 8 1e0c4: 30 e0 ldi r19, 0x00 ; 0 1e0c6: 45 e0 ldi r20, 0x05 ; 5 1e0c8: 6a e3 ldi r22, 0x3A ; 58 1e0ca: 7b e8 ldi r23, 0x8B ; 139 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); 1e0cc: cf 01 movw r24, r30 1e0ce: 0e 94 fc cf call 0x19ff8 ; 0x19ff8 // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); return false; } 1e0d2: 1f 91 pop r17 1e0d4: 0f 91 pop r16 1e0d6: 08 95 ret // SERIAL_ECHO('.'); // SERIAL_ECHO(version[2]); // SERIAL_ECHO('.'); // SERIAL_ECHOLN(version[3]); if (*str++ == '-') { switch(*str){ 1e0d8: 94 34 cpi r25, 0x44 ; 68 1e0da: 91 f0 breq .+36 ; 0x1e100 1e0dc: 92 35 cpi r25, 0x52 ; 82 1e0de: 19 f6 brne .-122 ; 0x1e066 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); 1e0e0: 0a 5f subi r16, 0xFA ; 250 1e0e2: 1f 4f sbci r17, 0xFF ; 255 1e0e4: 20 e2 ldi r18, 0x20 ; 32 1e0e6: 30 e0 ldi r19, 0x00 ; 0 1e0e8: 42 e0 ldi r20, 0x02 ; 2 1e0ea: 6e e2 ldi r22, 0x2E ; 46 1e0ec: 7b e8 ldi r23, 0x8B ; 139 1e0ee: ee cf rjmp .-36 ; 0x1e0cc 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); 1e0f0: 0a 5f subi r16, 0xFA ; 250 1e0f2: 1f 4f sbci r17, 0xFF ; 255 1e0f4: 20 e1 ldi r18, 0x10 ; 16 1e0f6: 30 e0 ldi r19, 0x00 ; 0 1e0f8: 44 e0 ldi r20, 0x04 ; 4 1e0fa: 65 e3 ldi r22, 0x35 ; 53 1e0fc: 7b e8 ldi r23, 0x8B ; 139 1e0fe: e6 cf rjmp .-52 ; 0x1e0cc 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); 1e100: 0a 5f subi r16, 0xFA ; 250 1e102: 1f 4f sbci r17, 0xFF ; 255 1e104: 30 e0 ldi r19, 0x00 ; 0 1e106: 20 e0 ldi r18, 0x00 ; 0 1e108: 43 e0 ldi r20, 0x03 ; 3 1e10a: 61 e3 ldi r22, 0x31 ; 49 1e10c: 7b e8 ldi r23, 0x8B ; 139 1e10e: de cf rjmp .-68 ; 0x1e0cc // 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; 1e110: 81 e0 ldi r24, 0x01 ; 1 1e112: df cf rjmp .-66 ; 0x1e0d2 0001e114 : /// (which would be obviously too late for an improperly sized motor) /// For farm printing, the cooler E-motor is enabled by default. bool UserECoolEnabled(){ // We enable E-cool mode for non-farm prints IFF the experimental menu is visible AND the EEPROM_ECOOL variable has // a value of the universal answer to all problems of the universe return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) 1e114: 84 e0 ldi r24, 0x04 ; 4 1e116: 9d e0 ldi r25, 0x0D ; 13 1e118: 0f 94 10 dc call 0x3b820 ; 0x3b820 && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); 1e11c: 8a 32 cpi r24, 0x2A ; 42 1e11e: 39 f4 brne .+14 ; 0x1e12e 1e120: 8a e2 ldi r24, 0x2A ; 42 1e122: 9d e0 ldi r25, 0x0D ; 13 1e124: 0f 94 10 dc call 0x3b820 ; 0x3b820 1e128: 91 e0 ldi r25, 0x01 ; 1 1e12a: 81 30 cpi r24, 0x01 ; 1 1e12c: 09 f0 breq .+2 ; 0x1e130 1e12e: 90 e0 ldi r25, 0x00 ; 0 } 1e130: 89 2f mov r24, r25 1e132: 08 95 ret 0001e134 : } #endif //PRUSA_SN_SUPPORT void lcd_experimental_menu() { MENU_BEGIN(); 1e134: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1e138: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1e13c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e140: 84 30 cpi r24, 0x04 ; 4 1e142: 70 f5 brcc .+92 ; 0x1e1a0 1e144: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_BACK)); 1e148: 8f e4 ldi r24, 0x4F ; 79 1e14a: 99 e4 ldi r25, 0x49 ; 73 1e14c: 0e 94 44 72 call 0xe488 ; 0xe488 1e150: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa #ifdef EXTRUDER_ALTFAN_DETECT MENU_ITEM_TOGGLE_P(_N("ALTFAN det."), altfanOverride_get()?_T(MSG_OFF):_T(MSG_ON), altfanOverride_toggle);////MSG_MENU_ALTFAN c=18 #endif //EXTRUDER_ALTFAN_DETECT #ifdef TMC2130 MENU_ITEM_TOGGLE_P(_N("E-cool mode"), UserECoolEnabled()?_T(MSG_ON):_T(MSG_OFF), UserECool_toggle);////MSG_MENU_ECOOL c=18 1e154: 0e 94 8a f0 call 0x1e114 ; 0x1e114 1e158: 88 23 and r24, r24 1e15a: f9 f0 breq .+62 ; 0x1e19a 1e15c: 81 e5 ldi r24, 0x51 ; 81 1e15e: 9c e5 ldi r25, 0x5C ; 92 1e160: 0e 94 44 72 call 0xe488 ; 0xe488 1e164: 22 e0 ldi r18, 0x02 ; 2 1e166: 41 ed ldi r20, 0xD1 ; 209 1e168: 50 ef ldi r21, 0xF0 ; 240 1e16a: bc 01 movw r22, r24 1e16c: 82 e5 ldi r24, 0x52 ; 82 1e16e: 9b e6 ldi r25, 0x6B ; 107 1e170: 0f 94 19 d3 call 0x3a632 ; 0x3a632 #ifdef DEBUG_PULLUP_CRASH MENU_ITEM_FUNCTION_P(_N("Test Pullup Crash"), TestPullupCrash); #endif // DEBUG_PULLUP_CRASH #ifdef PRUSA_SN_SUPPORT MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18 1e174: 66 e4 ldi r22, 0x46 ; 70 1e176: 70 ed ldi r23, 0xD0 ; 208 1e178: 8f e3 ldi r24, 0x3F ; 63 1e17a: 9b e6 ldi r25, 0x6B ; 107 1e17c: 0f 94 07 d1 call 0x3a20e ; 0x3a20e #endif //PRUSA_SN_SUPPORT MENU_END(); 1e180: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } #endif //PRUSA_SN_SUPPORT void lcd_experimental_menu() { MENU_BEGIN(); 1e184: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e188: 8f 5f subi r24, 0xFF ; 255 1e18a: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1e18e: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1e192: 8f 5f subi r24, 0xFF ; 255 1e194: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1e198: d1 cf rjmp .-94 ; 0x1e13c #ifdef EXTRUDER_ALTFAN_DETECT MENU_ITEM_TOGGLE_P(_N("ALTFAN det."), altfanOverride_get()?_T(MSG_OFF):_T(MSG_ON), altfanOverride_toggle);////MSG_MENU_ALTFAN c=18 #endif //EXTRUDER_ALTFAN_DETECT #ifdef TMC2130 MENU_ITEM_TOGGLE_P(_N("E-cool mode"), UserECoolEnabled()?_T(MSG_ON):_T(MSG_OFF), UserECool_toggle);////MSG_MENU_ECOOL c=18 1e19a: 8b e4 ldi r24, 0x4B ; 75 1e19c: 9c e5 ldi r25, 0x5C ; 92 1e19e: e0 cf rjmp .-64 ; 0x1e160 #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(); } 1e1a0: 08 95 ret 0001e1a2 : prusa_statistics_update_from_lcd_update(); if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands(); } #ifdef TMC2130 void UserECool_toggle(){ 1e1a2: cf 93 push r28 // this is only called when the experimental menu is visible, thus the first condition for enabling of the ECool mode is met in this place // The condition is intentionally inverted as we are toggling the state (i.e. if it was enabled, we are disabling the feature and vice versa) bool enable = ! UserECoolEnabled(); 1e1a4: 0e 94 8a f0 call 0x1e114 ; 0x1e114 1e1a8: c1 e0 ldi r28, 0x01 ; 1 1e1aa: c8 27 eor r28, r24 eeprom_update_byte_notify((uint8_t *)EEPROM_ECOOL_ENABLE, enable ? EEPROM_ECOOL_MAGIC_NUMBER : EEPROM_EMPTY_VALUE); 1e1ac: 6f ef ldi r22, 0xFF ; 255 1e1ae: 09 f0 breq .+2 ; 0x1e1b2 1e1b0: 6a e2 ldi r22, 0x2A ; 42 1e1b2: 84 e0 ldi r24, 0x04 ; 4 1e1b4: 9d e0 ldi r25, 0x0D ; 13 1e1b6: 0f 94 34 dc call 0x3b868 ; 0x3b868 1 #else 0 #endif ) , enableECool(enableECool) { } 1e1ba: 8c 2f mov r24, r28 1e1bc: 88 0f add r24, r24 // @@TODO I don't like this - disabling the experimental menu shall disable ECool mode, but it will not reinit the TMC // and I don't want to add more code for this experimental feature ... ideally do not reinit the TMC here at all and let the user reset the printer. tmc2130_init(TMCInitParams(enable)); 1e1be: 82 70 andi r24, 0x02 ; 2 } 1e1c0: cf 91 pop r28 eeprom_update_byte_notify((uint8_t *)EEPROM_ECOOL_ENABLE, enable ? EEPROM_ECOOL_MAGIC_NUMBER : EEPROM_EMPTY_VALUE); // @@TODO I don't like this - disabling the experimental menu shall disable ECool mode, but it will not reinit the TMC // and I don't want to add more code for this experimental feature ... ideally do not reinit the TMC here at all and let the user reset the printer. tmc2130_init(TMCInitParams(enable)); 1e1c2: 0d 94 3c 27 jmp 0x24e78 ; 0x24e78 0001e1c6 : eeprom_toggle((uint8_t*)EEPROM_MMU_STEALTH); } #endif //MMU_FORCE_STEALTH_MODE static void lcd_silent_mode_set() { switch (SilentModeMenu) { 1e1c6: 80 91 a2 03 lds r24, 0x03A2 ; 0x8003a2 1e1ca: 81 11 cpse r24, r1 1e1cc: 3c c0 rjmp .+120 ; 0x1e246 #ifdef TMC2130 case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break; 1e1ce: 81 e0 ldi r24, 0x01 ; 1 1e1d0: 80 93 a2 03 sts 0x03A2, r24 ; 0x8003a2 1e1d4: 60 91 a2 03 lds r22, 0x03A2 ; 0x8003a2 1e1d8: 8f ef ldi r24, 0xFF ; 255 1e1da: 9f e0 ldi r25, 0x0F ; 15 1e1dc: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); 1e1e0: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 1e1e4: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 default: SilentModeMenu = SILENT_MODE_POWER; break; // (probably) not needed #endif //TMC2130 } eeprom_update_byte_notify((unsigned char *)EEPROM_SILENT, SilentModeMenu); #ifdef TMC2130 if (blocks_queued()) 1e1e8: 98 17 cp r25, r24 1e1ea: 41 f0 breq .+16 ; 0x1e1fc { lcd_display_message_fullscreen_P(_T(MSG_MODE_CHANGE_IN_PROGRESS)); 1e1ec: 83 ec ldi r24, 0xC3 ; 195 1e1ee: 9a e3 ldi r25, 0x3A ; 58 1e1f0: 0e 94 44 72 call 0xe488 ; 0xe488 1e1f4: 0f 94 c0 20 call 0x24180 ; 0x24180 // Wait until the planner queue is drained and the stepper routine achieves // an idle state. st_synchronize(); 1e1f8: 0f 94 a9 43 call 0x28752 ; 0x28752 } tmc2130_wait_standstill_xy(1000); 1e1fc: 0f 94 0c 88 call 0x31018 ; 0x31018 cli(); 1e200: f8 94 cli tmc2130_mode = (SilentModeMenu != SILENT_MODE_NORMAL)?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL; 1e202: 81 e0 ldi r24, 0x01 ; 1 1e204: 90 91 a2 03 lds r25, 0x03A2 ; 0x8003a2 1e208: 91 11 cpse r25, r1 1e20a: 01 c0 rjmp .+2 ; 0x1e20e 1e20c: 80 e0 ldi r24, 0x00 ; 0 1e20e: 80 93 8b 06 sts 0x068B, r24 ; 0x80068b update_mode_profile(); 1e212: 0f 94 98 64 call 0x2c930 ; 0x2c930 return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); 1e216: 0e 94 8a f0 call 0x1e114 ; 0x1e114 struct TMCInitParams { uint8_t bSuppressFlag : 1; // only relevant on MK3S with PSU_Delta uint8_t enableECool : 1; // experimental support for E-motor cooler operation inline TMCInitParams():bSuppressFlag(0), enableECool(0) { } inline explicit TMCInitParams(bool bSuppressFlag, bool enableECool):bSuppressFlag(bSuppressFlag), enableECool(enableECool) { } 1e21a: 88 0f add r24, r24 } tmc2130_wait_standstill_xy(1000); cli(); tmc2130_mode = (SilentModeMenu != SILENT_MODE_NORMAL)?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL; update_mode_profile(); tmc2130_init(TMCInitParams(false, FarmOrUserECool())); 1e21c: 82 70 andi r24, 0x02 ; 2 1e21e: 0f 94 3c 27 call 0x24e78 ; 0x24e78 // 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(); 1e222: 0f 94 03 44 call 0x28806 ; 0x28806 sei(); 1e226: 78 94 sei #else st_current_init(); #endif //TMC2130 #ifdef TMC2130 if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET) && (SilentModeMenu != SILENT_MODE_NORMAL)) 1e228: 89 e6 ldi r24, 0x69 ; 105 1e22a: 9f e0 ldi r25, 0x0F ; 15 1e22c: 0f 94 10 dc call 0x3b820 ; 0x3b820 1e230: 88 23 and r24, r24 1e232: 61 f0 breq .+24 ; 0x1e24c 1e234: 80 91 a2 03 lds r24, 0x03A2 ; 0x8003a2 1e238: 88 23 and r24, r24 1e23a: 41 f0 breq .+16 ; 0x1e24c menu_submenu(lcd_crash_mode_info2); 1e23c: 60 e0 ldi r22, 0x00 ; 0 1e23e: 89 ef ldi r24, 0xF9 ; 249 1e240: 9f ed ldi r25, 0xDF ; 223 1e242: 0d 94 f7 d2 jmp 0x3a5ee ; 0x3a5ee static void lcd_silent_mode_set() { switch (SilentModeMenu) { #ifdef TMC2130 case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break; case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break; 1e246: 10 92 a2 03 sts 0x03A2, r1 ; 0x8003a2 1e24a: c4 cf rjmp .-120 ; 0x1e1d4 #ifdef TMC2130 if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET) && (SilentModeMenu != SILENT_MODE_NORMAL)) menu_submenu(lcd_crash_mode_info2); #endif //TMC2130 } 1e24c: 08 95 ret 0001e24e : lcd_update(2); } #ifdef TMC2130 void lcd_settings_linearity_correction_menu(void) { 1e24e: df 92 push r13 1e250: ef 92 push r14 1e252: ff 92 push r15 1e254: 0f 93 push r16 1e256: 1f 93 push r17 1e258: cf 93 push r28 1e25a: df 93 push r29 MENU_BEGIN(); 1e25c: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1e260: 10 92 11 05 sts 0x0511, r1 ; 0x800511 1e264: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e268: 84 30 cpi r24, 0x04 ; 4 1e26a: 08 f0 brcs .+2 ; 0x1e26e 1e26c: 66 c0 rjmp .+204 ; 0x1e33a 1e26e: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 1e272: 0f 94 0a d0 call 0x3a014 ; 0x3a014 1e276: 88 23 and r24, r24 1e278: e9 f0 breq .+58 ; 0x1e2b4 1e27a: 08 ef ldi r16, 0xF8 ; 248 1e27c: 14 e0 ldi r17, 0x04 ; 4 1e27e: c7 ef ldi r28, 0xF7 ; 247 1e280: de e0 ldi r29, 0x0E ; 14 #ifdef TMC2130 static void lcd_settings_linearity_correction_menu_save() { for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { if (tmc2130_wave_fac[axis] < TMC2130_WAVE_FAC1000_MIN) { 1e282: f8 01 movw r30, r16 1e284: 80 81 ld r24, Z 1e286: 8e 31 cpi r24, 0x1E ; 30 1e288: 08 f4 brcc .+2 ; 0x1e28c tmc2130_wave_fac[axis] = 0; 1e28a: 10 82 st Z, r1 1e28c: f8 01 movw r30, r16 1e28e: 61 91 ld r22, Z+ 1e290: 8f 01 movw r16, r30 1e292: ce 01 movw r24, r28 1e294: 0f 94 34 dc call 0x3b868 ; 0x3b868 1e298: 21 97 sbiw r28, 0x01 ; 1 MENU_END(); } #ifdef TMC2130 static void lcd_settings_linearity_correction_menu_save() { for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { 1e29a: c3 3f cpi r28, 0xF3 ; 243 1e29c: fe e0 ldi r31, 0x0E ; 14 1e29e: df 07 cpc r29, r31 1e2a0: 81 f7 brne .-32 ; 0x1e282 return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); 1e2a2: 0e 94 8a f0 call 0x1e114 ; 0x1e114 1e2a6: e8 94 clt 1e2a8: d0 f8 bld r13, 0 1e2aa: 80 fb bst r24, 0 1e2ac: d1 f8 bld r13, 1 eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC - axis, tmc2130_wave_fac[axis]); } // Re-init the TMC2130 driver to apply changes, if any tmc2130_init(TMCInitParams(false, FarmOrUserECool())); 1e2ae: 8d 2d mov r24, r13 1e2b0: 0f 94 3c 27 call 0x24e78 ; 0x24e78 { MENU_BEGIN(); ON_MENU_LEAVE( lcd_settings_linearity_correction_menu_save(); ); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 1e2b4: 8a ee ldi r24, 0xEA ; 234 1e2b6: 97 e4 ldi r25, 0x47 ; 71 1e2b8: 0e 94 44 72 call 0xe488 ; 0xe488 1e2bc: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa #ifdef TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_T(MSG_X_CORRECTION), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); 1e2c0: 80 e1 ldi r24, 0x10 ; 16 1e2c2: 93 e4 ldi r25, 0x43 ; 67 1e2c4: 0e 94 44 72 call 0xe488 ; 0xe488 1e2c8: f1 2c mov r15, r1 1e2ca: e1 2c mov r14, r1 1e2cc: 08 ec ldi r16, 0xC8 ; 200 1e2ce: 10 e0 ldi r17, 0x00 ; 0 1e2d0: 2d e1 ldi r18, 0x1D ; 29 1e2d2: 30 e0 ldi r19, 0x00 ; 0 1e2d4: 48 e0 ldi r20, 0x08 ; 8 1e2d6: 68 ef ldi r22, 0xF8 ; 248 1e2d8: 74 e0 ldi r23, 0x04 ; 4 1e2da: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_Y_CORRECTION), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); 1e2de: 84 e0 ldi r24, 0x04 ; 4 1e2e0: 93 e4 ldi r25, 0x43 ; 67 1e2e2: 0e 94 44 72 call 0xe488 ; 0xe488 1e2e6: 2d e1 ldi r18, 0x1D ; 29 1e2e8: 30 e0 ldi r19, 0x00 ; 0 1e2ea: 48 e0 ldi r20, 0x08 ; 8 1e2ec: 69 ef ldi r22, 0xF9 ; 249 1e2ee: 74 e0 ldi r23, 0x04 ; 4 1e2f0: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_Z_CORRECTION), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); 1e2f4: 88 ef ldi r24, 0xF8 ; 248 1e2f6: 92 e4 ldi r25, 0x42 ; 66 1e2f8: 0e 94 44 72 call 0xe488 ; 0xe488 1e2fc: 2d e1 ldi r18, 0x1D ; 29 1e2fe: 30 e0 ldi r19, 0x00 ; 0 1e300: 48 e0 ldi r20, 0x08 ; 8 1e302: 6a ef ldi r22, 0xFA ; 250 1e304: 74 e0 ldi r23, 0x04 ; 4 1e306: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 #endif //TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_T(MSG_EXTRUDER_CORRECTION), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); 1e30a: 8c ee ldi r24, 0xEC ; 236 1e30c: 92 e4 ldi r25, 0x42 ; 66 1e30e: 0e 94 44 72 call 0xe488 ; 0xe488 1e312: 2d e1 ldi r18, 0x1D ; 29 1e314: 30 e0 ldi r19, 0x00 ; 0 1e316: 48 e0 ldi r20, 0x08 ; 8 1e318: 6b ef ldi r22, 0xFB ; 251 1e31a: 74 e0 ldi r23, 0x04 ; 4 1e31c: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_END(); 1e320: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc } #ifdef TMC2130 void lcd_settings_linearity_correction_menu(void) { MENU_BEGIN(); 1e324: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e328: 8f 5f subi r24, 0xFF ; 255 1e32a: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1e32e: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1e332: 8f 5f subi r24, 0xFF ; 255 1e334: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1e338: 95 cf rjmp .-214 ; 0x1e264 MENU_ITEM_EDIT_int3_P(_T(MSG_Y_CORRECTION), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); MENU_ITEM_EDIT_int3_P(_T(MSG_Z_CORRECTION), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); #endif //TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_T(MSG_EXTRUDER_CORRECTION), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); MENU_END(); } 1e33a: df 91 pop r29 1e33c: cf 91 pop r28 1e33e: 1f 91 pop r17 1e340: 0f 91 pop r16 1e342: ff 90 pop r15 1e344: ef 90 pop r14 1e346: df 90 pop r13 1e348: 08 95 ret 0001e34a : } static void lcd_updatestatus(const char *message, bool progmem = false) { if (progmem) strncpy_P(lcd_status_message, message, LCD_WIDTH); 1e34a: 44 e1 ldi r20, 0x14 ; 20 1e34c: 50 e0 ldi r21, 0x00 ; 0 return false; } static void lcd_updatestatus(const char *message, bool progmem = false) { if (progmem) 1e34e: 66 23 and r22, r22 1e350: 89 f0 breq .+34 ; 0x1e374 strncpy_P(lcd_status_message, message, LCD_WIDTH); 1e352: bc 01 movw r22, r24 1e354: 8e e1 ldi r24, 0x1E ; 30 1e356: 95 e0 ldi r25, 0x05 ; 5 1e358: 0f 94 fd d9 call 0x3b3fa ; 0x3b3fa else strncpy(lcd_status_message, message, LCD_WIDTH); lcd_status_message[LCD_WIDTH] = 0; 1e35c: 10 92 32 05 sts 0x0532, r1 ; 0x800532 <_ZL18lcd_status_message.lto_priv.455+0x14> lcd_status_message_idx = 0; // Print message from beginning 1e360: 10 92 1d 05 sts 0x051D, r1 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); 1e364: 8b e1 ldi r24, 0x1B ; 27 1e366: 9b e6 ldi r25, 0x6B ; 107 1e368: 0e 94 13 79 call 0xf226 ; 0xf226 // hack lcd_draw_update to 1, i.e. without clear lcd_draw_update = 1; 1e36c: 81 e0 ldi r24, 0x01 ; 1 1e36e: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } 1e372: 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); 1e374: bc 01 movw r22, r24 1e376: 8e e1 ldi r24, 0x1E ; 30 1e378: 95 e0 ldi r25, 0x05 ; 5 1e37a: 0f 94 90 e2 call 0x3c520 ; 0x3c520 1e37e: ee cf rjmp .-36 ; 0x1e35c 0001e380 : } static bool lcd_message_check(uint8_t priority) { // regular priority check if (priority >= lcd_status_message_level) 1e380: 90 91 d3 03 lds r25, 0x03D3 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 1e384: 89 17 cp r24, r25 1e386: 80 f4 brcc .+32 ; 0x1e3a8 return true; // check if we can override an info message yet if (lcd_status_message_level == LCD_STATUS_INFO) { 1e388: 91 30 cpi r25, 0x01 ; 1 1e38a: 61 f4 brne .+24 ; 0x1e3a4 } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 1e38c: 80 91 33 05 lds r24, 0x0533 ; 0x800533 <_ZL26lcd_status_message_timeout.lto_priv.454> 1e390: 88 23 and r24, r24 1e392: 51 f0 breq .+20 ; 0x1e3a8 1e394: 40 e2 ldi r20, 0x20 ; 32 1e396: 5e e4 ldi r21, 0x4E ; 78 1e398: 60 e0 ldi r22, 0x00 ; 0 1e39a: 70 e0 ldi r23, 0x00 ; 0 1e39c: 83 e3 ldi r24, 0x33 ; 51 1e39e: 95 e0 ldi r25, 0x05 ; 5 1e3a0: 0d 94 0c 2b jmp 0x25618 ; 0x25618 ::expired(unsigned long)> return lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT); } return false; 1e3a4: 80 e0 ldi r24, 0x00 ; 0 1e3a6: 08 95 ret static bool lcd_message_check(uint8_t priority) { // regular priority check if (priority >= lcd_status_message_level) return true; 1e3a8: 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; } 1e3aa: 08 95 ret 0001e3ac : { lcd_setalertstatus_(message, severity, false); } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { 1e3ac: ef 92 push r14 1e3ae: ff 92 push r15 1e3b0: 1f 93 push r17 1e3b2: cf 93 push r28 1e3b4: df 93 push r29 1e3b6: ec 01 movw r28, r24 1e3b8: 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)) { 1e3ba: 86 2f mov r24, r22 1e3bc: 0e 94 c0 f1 call 0x1e380 ; 0x1e380 1e3c0: 88 23 and r24, r24 1e3c2: e9 f0 breq .+58 ; 0x1e3fe bool same = !(progmem? strcmp_P(lcd_status_message, message): 1e3c4: be 01 movw r22, r28 1e3c6: 8e e1 ldi r24, 0x1E ; 30 1e3c8: 95 e0 ldi r25, 0x05 ; 5 1e3ca: 0f 94 be d9 call 0x3b37c ; 0x3b37c 1e3ce: 7c 01 movw r14, r24 strcmp(lcd_status_message, message)); lcd_status_message_timeout.start(); 1e3d0: 83 e3 ldi r24, 0x33 ; 51 1e3d2: 95 e0 ldi r25, 0x05 ; 5 1e3d4: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> lcd_status_message_level = severity; 1e3d8: 10 93 d3 03 sts 0x03D3, r17 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> custom_message_type = CustomMsg::Status; 1e3dc: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 custom_message_state = 0; 1e3e0: 10 92 f6 03 sts 0x03F6, r1 ; 0x8003f6 if (!same) { 1e3e4: ef 28 or r14, r15 1e3e6: 59 f0 breq .+22 ; 0x1e3fe // do not kick the user out of the menus if the message is unchanged lcd_updatestatus(message, progmem); 1e3e8: 61 e0 ldi r22, 0x01 ; 1 1e3ea: ce 01 movw r24, r28 1e3ec: 0e 94 a5 f1 call 0x1e34a ; 0x1e34a } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { lcd_setalertstatus_(message, severity, true); } 1e3f0: df 91 pop r29 1e3f2: cf 91 pop r28 1e3f4: 1f 91 pop r17 1e3f6: ff 90 pop r15 1e3f8: 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(); 1e3fa: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 } void lcd_setalertstatuspgm(const char* message, uint8_t severity) { lcd_setalertstatus_(message, severity, true); } 1e3fe: df 91 pop r29 1e400: cf 91 pop r28 1e402: 1f 91 pop r17 1e404: ff 90 pop r15 1e406: ef 90 pop r14 1e408: 08 95 ret 0001e40a : if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message, true); } void lcd_setstatus_serial(const char* message) { 1e40a: cf 93 push r28 1e40c: df 93 push r29 1e40e: ec 01 movw r28, r24 if (lcd_message_check(LCD_STATUS_NONE)) 1e410: 80 e0 ldi r24, 0x00 ; 0 1e412: 0e 94 c0 f1 call 0x1e380 ; 0x1e380 1e416: 88 23 and r24, r24 1e418: 21 f0 breq .+8 ; 0x1e422 lcd_updatestatus(message); 1e41a: 60 e0 ldi r22, 0x00 ; 0 1e41c: ce 01 movw r24, r28 1e41e: 0e 94 a5 f1 call 0x1e34a ; 0x1e34a SERIAL_ECHOLN(message); 1e422: ce 01 movw r24, r28 } 1e424: df 91 pop r29 1e426: cf 91 pop r28 void lcd_setstatus_serial(const char* message) { if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message); SERIAL_ECHOLN(message); 1e428: 0d 94 f4 d5 jmp 0x3abe8 ; 0x3abe8 0001e42c : void lcd_getstatus(char buf[LCD_WIDTH]) { strncpy(buf, lcd_status_message, LCD_WIDTH); } void lcd_setstatuspgm(const char* message) { 1e42c: cf 93 push r28 1e42e: df 93 push r29 1e430: ec 01 movw r28, r24 if (lcd_message_check(LCD_STATUS_NONE)) 1e432: 80 e0 ldi r24, 0x00 ; 0 1e434: 0e 94 c0 f1 call 0x1e380 ; 0x1e380 1e438: 88 23 and r24, r24 1e43a: 31 f0 breq .+12 ; 0x1e448 lcd_updatestatus(message, true); 1e43c: 61 e0 ldi r22, 0x01 ; 1 1e43e: ce 01 movw r24, r28 } 1e440: df 91 pop r29 1e442: cf 91 pop r28 } void lcd_setstatuspgm(const char* message) { if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message, true); 1e444: 0c 94 a5 f1 jmp 0x1e34a ; 0x1e34a } 1e448: df 91 pop r29 1e44a: cf 91 pop r28 1e44c: 08 95 ret 0001e44e : MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop); MENU_END(); } void lcd_sdcard_menu() { 1e44e: 2f 92 push r2 1e450: 3f 92 push r3 1e452: 4f 92 push r4 1e454: 5f 92 push r5 1e456: 6f 92 push r6 1e458: 7f 92 push r7 1e45a: 8f 92 push r8 1e45c: 9f 92 push r9 1e45e: af 92 push r10 1e460: bf 92 push r11 1e462: cf 92 push r12 1e464: df 92 push r13 1e466: ef 92 push r14 1e468: ff 92 push r15 1e46a: 0f 93 push r16 1e46c: 1f 93 push r17 1e46e: cf 93 push r28 1e470: df 93 push r29 1e472: cd b7 in r28, 0x3d ; 61 1e474: de b7 in r29, 0x3e ; 62 1e476: 2d 97 sbiw r28, 0x0d ; 13 1e478: 0f b6 in r0, 0x3f ; 63 1e47a: f8 94 cli 1e47c: de bf out 0x3e, r29 ; 62 1e47e: 0f be out 0x3f, r0 ; 63 1e480: 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) 1e482: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 1e486: 81 30 cpi r24, 0x01 ; 1 1e488: 31 f1 breq .+76 ; 0x1e4d6 1e48a: 30 f0 brcs .+12 ; 0x1e498 1e48c: 82 30 cpi r24, 0x02 ; 2 1e48e: 09 f4 brne .+2 ; 0x1e492 1e490: 7d c2 rjmp .+1274 ; 0x1e98c { _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. 1e492: 10 92 a7 03 sts 0x03A7, r1 ; 0x8003a7 1e496: fe c0 rjmp .+508 ; 0x1e694 switch(_md->menuState) { case _uninitialized: //Initialize menu data { if (card.presort_flag == true) //used to force resorting if sorting type is changed. 1e498: 80 91 de 14 lds r24, 0x14DE ; 0x8014de 1e49c: 88 23 and r24, r24 1e49e: 49 f0 breq .+18 ; 0x1e4b2 { card.presort_flag = false; 1e4a0: 10 92 de 14 sts 0x14DE, r1 ; 0x8014de lcd_update_enabled = false; 1e4a4: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e card.presort(); 1e4a8: 0f 94 89 7d call 0x2fb12 ; 0x2fb12 lcd_update_enabled = true; 1e4ac: 81 e0 ldi r24, 0x01 ; 1 1e4ae: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e } _md->fileCnt = card.getnrfilenames(); 1e4b2: 0f 94 cb 7a call 0x2f596 ; 0x2f596 1e4b6: 90 93 af 03 sts 0x03AF, r25 ; 0x8003af 1e4ba: 80 93 ae 03 sts 0x03AE, r24 ; 0x8003ae _md->sdSort = farm_mode ? SD_SORT_NONE : eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); 1e4be: 89 e0 ldi r24, 0x09 ; 9 1e4c0: 9f e0 ldi r25, 0x0F ; 15 1e4c2: 0f 94 10 dc call 0x3b820 ; 0x3b820 1e4c6: 80 93 b1 03 sts 0x03B1, r24 ; 0x8003b1 _md->menuState = _standard; 1e4ca: 81 e0 ldi r24, 0x01 ; 1 1e4cc: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 _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. 1e4d0: 8f ef ldi r24, 0xFF ; 255 1e4d2: 80 93 b0 03 sts 0x03B0, r24 ; 0x8003b0 } // 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. 1e4d6: 80 91 b2 03 lds r24, 0x03B2 ; 0x8003b2 1e4da: 81 11 cpse r24, r1 1e4dc: 07 c0 rjmp .+14 ; 0x1e4ec { _md->lcd_scrollTimer.start(); 1e4de: 82 eb ldi r24, 0xB2 ; 178 1e4e0: 93 e0 ldi r25, 0x03 ; 3 1e4e2: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> lcd_draw_update = 1; 1e4e6: 81 e0 ldi r24, 0x01 ; 1 1e4e8: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } 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. 1e4ec: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 1e4f0: 81 11 cpse r24, r1 1e4f2: 21 c0 rjmp .+66 ; 0x1e536 1e4f4: 64 ef ldi r22, 0xF4 ; 244 1e4f6: 71 e0 ldi r23, 0x01 ; 1 1e4f8: 82 eb ldi r24, 0xB2 ; 178 1e4fa: 93 e0 ldi r25, 0x03 ; 3 1e4fc: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 1e500: 88 23 and r24, r24 1e502: a1 f0 breq .+40 ; 0x1e52c 1e504: 80 91 b0 03 lds r24, 0x03B0 ; 0x8003b0 1e508: 8f 3f cpi r24, 0xFF ; 255 1e50a: 81 f0 breq .+32 ; 0x1e52c { _md->menuState = _scrolling; 1e50c: 82 e0 ldi r24, 0x02 ; 2 1e50e: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 _md->offset = 0; 1e512: 10 92 a8 03 sts 0x03A8, r1 ; 0x8003a8 _md->scrollPointer = NULL; 1e516: 10 92 ab 03 sts 0x03AB, r1 ; 0x8003ab 1e51a: 10 92 aa 03 sts 0x03AA, r1 ; 0x8003aa _md->lcd_scrollTimer.start(); 1e51e: 82 eb ldi r24, 0xB2 ; 178 1e520: 93 e0 ldi r25, 0x03 ; 3 1e522: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> lcd_draw_update = 1; //forces last load before switching to scrolling. 1e526: 81 e0 ldi r24, 0x01 ; 1 1e528: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } if (lcd_draw_update == 0 && !lcd_clicked()) 1e52c: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 1e530: 88 23 and r24, r24 1e532: 09 f4 brne .+2 ; 0x1e536 1e534: ab c0 rjmp .+342 ; 0x1e68c 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. 1e536: 8f ef ldi r24, 0xFF ; 255 1e538: 80 93 b0 03 sts 0x03B0, r24 ; 0x8003b0 //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(); 1e53c: 82 eb ldi r24, 0xB2 ; 178 1e53e: 93 e0 ldi r25, 0x03 ; 3 1e540: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> MENU_BEGIN(); 1e544: 0f 94 8a d1 call 0x3a314 ; 0x3a314 1e548: 10 92 11 05 sts 0x0511, r1 ; 0x800511 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); 1e54c: ce 01 movw r24, r28 1e54e: 01 96 adiw r24, 0x01 ; 1 1e550: 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); 1e552: f1 e9 ldi r31, 0x91 ; 145 1e554: 2f 2e mov r2, r31 1e556: f0 e7 ldi r31, 0x70 ; 112 1e558: 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(); 1e55a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e55e: 84 30 cpi r24, 0x04 ; 4 1e560: 08 f0 brcs .+2 ; 0x1e564 1e562: 98 c0 rjmp .+304 ; 0x1e694 1e564: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK)); // i.e. default menu-item / menu-item after card insertion 1e568: 80 91 df 03 lds r24, 0x03DF ; 0x8003df 1e56c: 88 23 and r24, r24 1e56e: 09 f4 brne .+2 ; 0x1e572 1e570: aa c0 rjmp .+340 ; 0x1e6c6 1e572: 8b e3 ldi r24, 0x3B ; 59 1e574: 98 e4 ldi r25, 0x48 ; 72 1e576: 0e 94 44 72 call 0xe488 ; 0xe488 1e57a: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 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;}; 1e57e: 61 e9 ldi r22, 0x91 ; 145 1e580: 74 e1 ldi r23, 0x14 ; 20 1e582: 8a e3 ldi r24, 0x3A ; 58 1e584: 95 e1 ldi r25, 0x15 ; 21 1e586: 0f 94 70 59 call 0x2b2e0 ; 0x2b2e0 card.getWorkDirName(); if (card.filename[0] == '/') 1e58a: 80 91 91 14 lds r24, 0x1491 ; 0x801491 1e58e: 8f 32 cpi r24, 0x2F ; 47 1e590: 09 f0 breq .+2 ; 0x1e594 1e592: 9c c0 rjmp .+312 ; 0x1e6cc { #if SDCARDDETECT == -1 MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); #else if (card.ToshibaFlashAir_isEnabled()) 1e594: 80 91 00 17 lds r24, 0x1700 ; 0x801700 1e598: 88 23 and r24, r24 1e59a: 41 f0 breq .+16 ; 0x1e5ac MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); //show the refresh option if in flashAir mode. 1e59c: 80 e3 ldi r24, 0x30 ; 48 1e59e: 98 e4 ldi r25, 0x48 ; 72 1e5a0: 0e 94 44 72 call 0xe488 ; 0xe488 1e5a4: 67 e8 ldi r22, 0x87 ; 135 1e5a6: 70 ee ldi r23, 0xE0 ; 224 #endif } else MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir. 1e5a8: 0f 94 07 d1 call 0x3a20e ; 0x3a20e for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom. 1e5ac: c0 90 ae 03 lds r12, 0x03AE ; 0x8003ae 1e5b0: d0 90 af 03 lds r13, 0x03AF ; 0x8003af } if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = false; menu_action_sdfile(str_fn); lcd_update_enabled = true; 1e5b4: 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. 1e5b6: 91 e0 ldi r25, 0x01 ; 1 1e5b8: c9 1a sub r12, r25 1e5ba: d1 08 sbc r13, r1 1e5bc: 08 f4 brcc .+2 ; 0x1e5c0 1e5be: d9 c1 rjmp .+946 ; 0x1e972 { if (menu_item == menu_line) //If the file is on the screen. 1e5c0: 80 91 14 05 lds r24, 0x0514 ; 0x800514 1e5c4: 90 91 13 05 lds r25, 0x0513 ; 0x800513 1e5c8: 89 13 cpse r24, r25 1e5ca: cf c1 rjmp .+926 ; 0x1e96a { //load filename to memory. #ifdef SDCARD_SORT_ALPHA card.getfilename_sorted(i, _md->sdSort); 1e5cc: 60 91 b1 03 lds r22, 0x03B1 ; 0x8003b1 1e5d0: c6 01 movw r24, r12 1e5d2: 0f 94 f7 85 call 0x30bee ; 0x30bee #else card.getfilename(i); #endif if (lcd_encoder == menu_item) //If the file is selected. 1e5d6: 80 91 14 05 lds r24, 0x0514 ; 0x800514 1e5da: 90 e0 ldi r25, 0x00 ; 0 1e5dc: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 1e5e0: 30 91 70 06 lds r19, 0x0670 ; 0x800670 1e5e4: 10 91 db 14 lds r17, 0x14DB ; 0x8014db 1e5e8: 82 17 cp r24, r18 1e5ea: 93 07 cpc r25, r19 1e5ec: 51 f4 brne .+20 ; 0x1e602 { _md->selectedFileID = i; 1e5ee: d0 92 ad 03 sts 0x03AD, r13 ; 0x8003ad 1e5f2: c0 92 ac 03 sts 0x03AC, r12 ; 0x8003ac _md->isDir = card.filenameIsDir; 1e5f6: 10 93 a9 03 sts 0x03A9, r17 ; 0x8003a9 _md->row = menu_row; 1e5fa: 40 91 11 05 lds r20, 0x0511 ; 0x800511 1e5fe: 40 93 b0 03 sts 0x03B0, r20 ; 0x8003b0 1e602: 40 91 6d 02 lds r20, 0x026D ; 0x80026d } if (card.filenameIsDir) 1e606: 11 23 and r17, r17 1e608: 09 f4 brne .+2 ; 0x1e60c 1e60a: 65 c0 rjmp .+202 ; 0x1e6d6 #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) 1e60c: 44 23 and r20, r20 1e60e: e9 f0 breq .+58 ; 0x1e64a { lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); 1e610: 40 91 a6 14 lds r20, 0x14A6 ; 0x8014a6 1e614: e1 e9 ldi r30, 0x91 ; 145 1e616: ae 2e mov r10, r30 1e618: e4 e1 ldi r30, 0x14 ; 20 1e61a: be 2e mov r11, r30 1e61c: 44 23 and r20, r20 1e61e: 21 f0 breq .+8 ; 0x1e628 1e620: 76 ea ldi r23, 0xA6 ; 166 1e622: a7 2e mov r10, r23 1e624: 74 e1 ldi r23, 0x14 ; 20 1e626: b7 2e mov r11, r23 1e628: 60 91 11 05 lds r22, 0x0511 ; 0x800511 } 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)?'>':' '); 1e62c: 4e e3 ldi r20, 0x3E ; 62 1e62e: 82 17 cp r24, r18 1e630: 93 07 cpc r25, r19 1e632: 09 f0 breq .+2 ; 0x1e636 1e634: 40 e2 ldi r20, 0x20 ; 32 1e636: 80 e0 ldi r24, 0x00 ; 0 1e638: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_putc(LCD_STR_FOLDER[0]); 1e63c: 85 e8 ldi r24, 0x85 ; 133 1e63e: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_print_pad(longFilename, len); 1e642: 62 e1 ldi r22, 0x12 ; 18 1e644: c5 01 movw r24, r10 1e646: 0e 94 67 70 call 0xe0ce ; 0xe0ce 1e64a: 80 91 14 05 lds r24, 0x0514 ; 0x800514 { 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)) 1e64e: 90 91 12 05 lds r25, 0x0512 ; 0x800512 1e652: 99 23 and r25, r25 1e654: 09 f4 brne .+2 ; 0x1e658 1e656: 89 c1 rjmp .+786 ; 0x1e96a 1e658: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 1e65c: 30 91 70 06 lds r19, 0x0670 ; 0x800670 1e660: 82 17 cp r24, r18 1e662: 13 06 cpc r1, r19 1e664: 09 f0 breq .+2 ; 0x1e668 1e666: 81 c1 rjmp .+770 ; 0x1e96a { lcd_update_enabled = false; 1e668: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e lcd_return_to_status(); } void menu_action_sddirectory(const char* filename) { card.chdir(filename, true); 1e66c: 61 e0 ldi r22, 0x01 ; 1 1e66e: 81 e9 ldi r24, 0x91 ; 145 1e670: 94 e1 ldi r25, 0x14 ; 20 1e672: 0f 94 0b 7f call 0x2fe16 ; 0x2fe16 lcd_encoder = 0; 1e676: 10 92 70 06 sts 0x0670, r1 ; 0x800670 1e67a: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f menu_data_reset(); //Forces reloading of cached variables. 1e67e: 0f 94 ac d1 call 0x3a358 ; 0x3a358 } if (menu_clicked && (lcd_encoder == menu_item)) { lcd_update_enabled = false; menu_action_sdfile(str_fn); lcd_update_enabled = true; 1e682: 00 93 6e 02 sts 0x026E, r16 ; 0x80026e menu_item_ret(); 1e686: 0f 94 70 d0 call 0x3a0e0 ; 0x3a0e0 1e68a: 95 cf rjmp .-214 ; 0x1e5b6 _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()) 1e68c: 0e 94 95 70 call 0xe12a ; 0xe12a 1e690: 81 11 cpse r24, r1 1e692: 51 cf rjmp .-350 ; 0x1e536 _md->menuState = _standard; } } break; default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu. } } 1e694: 2d 96 adiw r28, 0x0d ; 13 1e696: 0f b6 in r0, 0x3f ; 63 1e698: f8 94 cli 1e69a: de bf out 0x3e, r29 ; 62 1e69c: 0f be out 0x3f, r0 ; 63 1e69e: cd bf out 0x3d, r28 ; 61 1e6a0: df 91 pop r29 1e6a2: cf 91 pop r28 1e6a4: 1f 91 pop r17 1e6a6: 0f 91 pop r16 1e6a8: ff 90 pop r15 1e6aa: ef 90 pop r14 1e6ac: df 90 pop r13 1e6ae: cf 90 pop r12 1e6b0: bf 90 pop r11 1e6b2: af 90 pop r10 1e6b4: 9f 90 pop r9 1e6b6: 8f 90 pop r8 1e6b8: 7f 90 pop r7 1e6ba: 6f 90 pop r6 1e6bc: 5f 90 pop r5 1e6be: 4f 90 pop r4 1e6c0: 3f 90 pop r3 1e6c2: 2f 90 pop r2 1e6c4: 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 1e6c6: 8f e4 ldi r24, 0x4F ; 79 1e6c8: 99 e4 ldi r25, 0x49 ; 73 1e6ca: 55 cf rjmp .-342 ; 0x1e576 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. 1e6cc: 61 e9 ldi r22, 0x91 ; 145 1e6ce: 70 ee ldi r23, 0xE0 ; 224 1e6d0: 8e e9 ldi r24, 0x9E ; 158 1e6d2: 99 e8 ldi r25, 0x89 ; 137 1e6d4: 69 cf rjmp .-302 ; 0x1e5a8 menu_item++; } static void menu_item_sdfile(const char* str_fn, char* str_fnl) { if (lcd_draw_update) 1e6d6: 44 23 and r20, r20 1e6d8: d1 f0 breq .+52 ; 0x1e70e { lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl); 1e6da: 40 91 a6 14 lds r20, 0x14A6 ; 0x8014a6 1e6de: 61 e9 ldi r22, 0x91 ; 145 1e6e0: a6 2e mov r10, r22 1e6e2: 64 e1 ldi r22, 0x14 ; 20 1e6e4: b6 2e mov r11, r22 1e6e6: 44 23 and r20, r20 1e6e8: 21 f0 breq .+8 ; 0x1e6f2 1e6ea: 56 ea ldi r21, 0xA6 ; 166 1e6ec: a5 2e mov r10, r21 1e6ee: 54 e1 ldi r21, 0x14 ; 20 1e6f0: b5 2e mov r11, r21 1e6f2: 60 91 11 05 lds r22, 0x0511 ; 0x800511 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)?'>':' '); 1e6f6: 4e e3 ldi r20, 0x3E ; 62 1e6f8: 82 17 cp r24, r18 1e6fa: 93 07 cpc r25, r19 1e6fc: 09 f0 breq .+2 ; 0x1e700 1e6fe: 40 e2 ldi r20, 0x20 ; 32 1e700: 80 e0 ldi r24, 0x00 ; 0 1e702: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_print_pad(longFilename, len); 1e706: 63 e1 ldi r22, 0x13 ; 19 1e708: c5 01 movw r24, r10 1e70a: 0e 94 67 70 call 0xe0ce ; 0xe0ce 1e70e: 80 91 14 05 lds r24, 0x0514 ; 0x800514 { 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)) 1e712: 90 91 12 05 lds r25, 0x0512 ; 0x800512 1e716: 99 23 and r25, r25 1e718: 09 f4 brne .+2 ; 0x1e71c 1e71a: 27 c1 rjmp .+590 ; 0x1e96a 1e71c: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 1e720: 30 91 70 06 lds r19, 0x0670 ; 0x800670 1e724: 82 17 cp r24, r18 1e726: 13 06 cpc r1, r19 1e728: 09 f0 breq .+2 ; 0x1e72c 1e72a: 1f c1 rjmp .+574 ; 0x1e96a { lcd_update_enabled = false; 1e72c: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e return result; } static void menu_action_sdfile(const char* filename) { if(eFilamentAction != FilamentAction::None) return; 1e730: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 1e734: 81 11 cpse r24, r1 1e736: a5 cf rjmp .-182 ; 0x1e682 // 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); 1e738: 61 e9 ldi r22, 0x91 ; 145 1e73a: 74 e1 ldi r23, 0x14 ; 20 1e73c: c7 01 movw r24, r14 1e73e: 0f 94 7b e2 call 0x3c4f6 ; 0x3c4f6 1e742: 47 01 movw r8, r14 1e744: 45 e9 ldi r20, 0x95 ; 149 1e746: a4 2e mov r10, r20 1e748: 4f e0 ldi r20, 0x0F ; 15 1e74a: 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] == '.') { 1e74c: f4 01 movw r30, r8 1e74e: 61 91 ld r22, Z+ 1e750: 4f 01 movw r8, r30 1e752: 66 23 and r22, r22 1e754: 19 f0 breq .+6 ; 0x1e75c 1e756: 6e 32 cpi r22, 0x2E ; 46 1e758: 09 f0 breq .+2 ; 0x1e75c 1e75a: 4b c0 rjmp .+150 ; 0x1e7f2 1e75c: 60 e0 ldi r22, 0x00 ; 0 1e75e: c5 01 movw r24, r10 1e760: 0f 94 34 dc call 0x3b868 ; 0x3b868 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, '.'); 1e764: 6e e2 ldi r22, 0x2E ; 46 1e766: 70 e0 ldi r23, 0x00 ; 0 1e768: c7 01 movw r24, r14 1e76a: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 1e76e: 3c 01 movw r6, r24 if (extension_ptr) { 1e770: 89 2b or r24, r25 1e772: 19 f0 breq .+6 ; 0x1e77a extension_ptr++; // skip the '.' 1e774: 8f ef ldi r24, 0xFF ; 255 1e776: 68 1a sub r6, r24 1e778: 78 0a sbc r7, r24 1e77a: 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); 1e77c: 31 e9 ldi r19, 0x91 ; 145 1e77e: a3 2e mov r10, r19 1e780: 3c e0 ldi r19, 0x0C ; 12 1e782: 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') { 1e784: 61 14 cp r6, r1 1e786: 71 04 cpc r7, r1 1e788: 21 f0 breq .+8 ; 0x1e792 1e78a: f4 01 movw r30, r8 1e78c: 60 81 ld r22, Z 1e78e: 61 11 cpse r22, r1 1e790: 01 c0 rjmp .+2 ; 0x1e794 1e792: 60 e0 ldi r22, 0x00 ; 0 1e794: c5 01 movw r24, r10 1e796: 0f 94 34 dc call 0x3b868 ; 0x3b868 1e79a: ff ef ldi r31, 0xFF ; 255 1e79c: af 1a sub r10, r31 1e79e: bf 0a sbc r11, r31 1e7a0: 2f ef ldi r18, 0xFF ; 255 1e7a2: 82 1a sub r8, r18 1e7a4: 92 0a sbc r9, r18 if (extension_ptr) { extension_ptr++; // skip the '.' } for (uint_least8_t i = 0; i < 3; i++) 1e7a6: 84 e9 ldi r24, 0x94 ; 148 1e7a8: a8 16 cp r10, r24 1e7aa: 8c e0 ldi r24, 0x0C ; 12 1e7ac: b8 06 cpc r11, r24 1e7ae: 51 f7 brne .-44 ; 0x1e784 { workDirParents[level].getFilename(name); } uint8_t CardReader::getWorkDirDepth() { return workDirDepth; 1e7b0: 60 90 2f 16 lds r6, 0x162F ; 0x80162f 1e7b4: 66 2d mov r22, r6 1e7b6: 8a e5 ldi r24, 0x5A ; 90 1e7b8: 9f e0 ldi r25, 0x0F ; 15 1e7ba: 0f 94 34 dc call 0x3b868 ; 0x3b868 1e7be: 8d e8 ldi r24, 0x8D ; 141 1e7c0: 94 e1 ldi r25, 0x14 ; 20 1e7c2: 2a e0 ldi r18, 0x0A ; 10 1e7c4: a2 2e mov r10, r18 1e7c6: 2f e0 ldi r18, 0x0F ; 15 1e7c8: 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++) { 1e7ca: 71 2c mov r7, r1 1e7cc: 4c 01 movw r8, r24 1e7ce: e9 e0 ldi r30, 0x09 ; 9 1e7d0: 8e 0e add r8, r30 1e7d2: 91 1c adc r9, r1 1e7d4: 76 14 cp r7, r6 1e7d6: d1 f0 breq .+52 ; 0x1e80c #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); 1e7d8: 48 e0 ldi r20, 0x08 ; 8 1e7da: 50 e0 ldi r21, 0x00 ; 0 1e7dc: b5 01 movw r22, r10 1e7de: 8e 5a subi r24, 0xAE ; 174 1e7e0: 9f 4f sbci r25, 0xFF ; 255 1e7e2: 0f 94 24 dc call 0x3b848 ; 0x3b848 1e7e6: 73 94 inc r7 1e7e8: f8 e0 ldi r31, 0x08 ; 8 1e7ea: af 0e add r10, r31 1e7ec: b1 1c adc r11, r1 1e7ee: c4 01 movw r24, r8 1e7f0: ed cf rjmp .-38 ; 0x1e7cc if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 1e7f2: c5 01 movw r24, r10 1e7f4: 0f 94 34 dc call 0x3b868 ; 0x3b868 1e7f8: ff ef ldi r31, 0xFF ; 255 1e7fa: af 1a sub r10, r31 1e7fc: 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++) { 1e7fe: 2d e9 ldi r18, 0x9D ; 157 1e800: a2 16 cp r10, r18 1e802: 2f e0 ldi r18, 0x0F ; 15 1e804: b2 06 cpc r11, r18 1e806: 09 f0 breq .+2 ; 0x1e80a 1e808: a1 cf rjmp .-190 ; 0x1e74c 1e80a: ac cf rjmp .-168 ; 0x1e764 /** Menu action functions **/ static bool check_file(const char* filename) { if (farm_mode) return true; card.openFileReadFilteredGcode(filename, true); 1e80c: 61 e0 ldi r22, 0x01 ; 1 1e80e: c7 01 movw r24, r14 1e810: 0f 94 42 80 call 0x30084 ; 0x30084 } uint32_t CardReader::getFileSize() { return filesize; 1e814: 40 90 9c 17 lds r4, 0x179C ; 0x80179c 1e818: 50 90 9d 17 lds r5, 0x179D ; 0x80179d 1e81c: 60 90 9e 17 lds r6, 0x179E ; 0x80179e 1e820: 70 90 9f 17 lds r7, 0x179F ; 0x80179f bool result = false; const uint32_t filesize = card.getFileSize(); uint32_t startPos = 0; const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize); 1e824: 94 2d mov r25, r4 1e826: 85 2d mov r24, r5 1e828: 21 e0 ldi r18, 0x01 ; 1 1e82a: 42 16 cp r4, r18 1e82c: 28 e7 ldi r18, 0x78 ; 120 1e82e: 52 06 cpc r5, r18 1e830: 61 04 cpc r6, r1 1e832: 71 04 cpc r7, r1 1e834: 10 f0 brcs .+4 ; 0x1e83a 1e836: 90 e0 ldi r25, 0x00 ; 0 1e838: 88 e7 ldi r24, 0x78 ; 120 1e83a: a9 2e mov r10, r25 1e83c: b8 2e mov r11, r24 if (filesize > END_FILE_SECTION) { 1e83e: 81 e0 ldi r24, 0x01 ; 1 1e840: 48 16 cp r4, r24 1e842: 88 e7 ldi r24, 0x78 ; 120 1e844: 58 06 cpc r5, r24 1e846: 61 04 cpc r6, r1 1e848: 71 04 cpc r7, r1 1e84a: 08 f4 brcc .+2 ; 0x1e84e 1e84c: 5d c0 rjmp .+186 ; 0x1e908 startPos = filesize - END_FILE_SECTION; 1e84e: 98 e7 ldi r25, 0x78 ; 120 1e850: 59 1a sub r5, r25 1e852: 61 08 sbc r6, r1 1e854: 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);}; 1e856: 40 92 a3 17 sts 0x17A3, r4 ; 0x8017a3 1e85a: 50 92 a4 17 sts 0x17A4, r5 ; 0x8017a4 1e85e: 60 92 a5 17 sts 0x17A5, r6 ; 0x8017a5 1e862: 70 92 a6 17 sts 0x17A6, r7 ; 0x8017a6 1e866: c3 01 movw r24, r6 1e868: b2 01 movw r22, r4 1e86a: 0f 94 93 76 call 0x2ed26 ; 0x2ed26 card.setIndex(startPos); } cmdqueue_reset(); 1e86e: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 cmdqueue_serial_disabled = true; 1e872: 00 93 a4 03 sts 0x03A4, r16 ; 0x8003a4 menu_progressbar_init(bytesToCheck, _T(MSG_CHECKING_FILE)); 1e876: 8d e0 ldi r24, 0x0D ; 13 1e878: 98 e4 ldi r25, 0x48 ; 72 1e87a: 0e 94 44 72 call 0xe488 ; 0xe488 1e87e: bc 01 movw r22, r24 1e880: c5 01 movw r24, r10 1e882: 0f 94 ec cf call 0x39fd8 ; 0x39fd8 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; } 1e886: 80 91 a3 17 lds r24, 0x17A3 ; 0x8017a3 1e88a: 90 91 a4 17 lds r25, 0x17A4 ; 0x8017a4 1e88e: a0 91 a5 17 lds r26, 0x17A5 ; 0x8017a5 1e892: b0 91 a6 17 lds r27, 0x17A6 ; 0x8017a6 while (!card.eof() && !result) { 1e896: 40 91 9c 17 lds r20, 0x179C ; 0x80179c 1e89a: 50 91 9d 17 lds r21, 0x179D ; 0x80179d 1e89e: 60 91 9e 17 lds r22, 0x179E ; 0x80179e 1e8a2: 70 91 9f 17 lds r23, 0x179F ; 0x80179f 1e8a6: 84 17 cp r24, r20 1e8a8: 95 07 cpc r25, r21 1e8aa: a6 07 cpc r26, r22 1e8ac: b7 07 cpc r27, r23 1e8ae: 80 f5 brcc .+96 ; 0x1e910 1e8b0: 11 11 cpse r17, r1 1e8b2: 2e c0 rjmp .+92 ; 0x1e910 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); }; 1e8b4: 20 91 22 17 lds r18, 0x1722 ; 0x801722 1e8b8: 21 11 cpse r18, r1 1e8ba: 03 c0 rjmp .+6 ; 0x1e8c2 1e8bc: 80 e0 ldi r24, 0x00 ; 0 1e8be: 90 e0 ldi r25, 0x00 ; 0 1e8c0: dc 01 movw r26, r24 menu_progressbar_update(card.get_sdpos() - startPos); 1e8c2: 84 19 sub r24, r4 1e8c4: 95 09 sbc r25, r5 1e8c6: 0f 94 bd cf call 0x39f7a ; 0x39f7a card.sdprinting = true; 1e8ca: 00 93 8f 14 sts 0x148F, r16 ; 0x80148f get_command(); 1e8ce: 0e 94 b8 82 call 0x10570 ; 0x10570 #endif // LIN_ADVANCE bool check_commands() { bool end_command_found = false; while (buflen) 1e8d2: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 1e8d6: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 1e8da: 89 2b or r24, r25 1e8dc: a1 f2 breq .-88 ; 0x1e886 { if ((code_seen_P(MSG_M84)) || (code_seen_P(PSTR("M 84")))) end_command_found = true; 1e8de: 8c ed ldi r24, 0xDC ; 220 1e8e0: 9a e6 ldi r25, 0x6A ; 106 1e8e2: 0e 94 be 67 call 0xcf7c ; 0xcf7c 1e8e6: 81 11 cpse r24, r1 1e8e8: 05 c0 rjmp .+10 ; 0x1e8f4 1e8ea: 89 e9 ldi r24, 0x99 ; 153 1e8ec: 99 e8 ldi r25, 0x89 ; 137 1e8ee: 0e 94 be 67 call 0xcf7c ; 0xcf7c 1e8f2: 81 11 cpse r24, r1 1e8f4: 11 e0 ldi r17, 0x01 ; 1 if (!cmdbuffer_front_already_processed) 1e8f6: 80 91 a1 10 lds r24, 0x10A1 ; 0x8010a1 1e8fa: 81 11 cpse r24, r1 1e8fc: 02 c0 rjmp .+4 ; 0x1e902 cmdqueue_pop_front(); 1e8fe: 0e 94 54 76 call 0xeca8 ; 0xeca8 cmdbuffer_front_already_processed = false; 1e902: 10 92 a1 10 sts 0x10A1, r1 ; 0x8010a1 1e906: e5 cf rjmp .-54 ; 0x1e8d2 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; 1e908: 41 2c mov r4, r1 1e90a: 51 2c mov r5, r1 1e90c: 32 01 movw r6, r4 1e90e: af cf rjmp .-162 ; 0x1e86e // with the CMDBUFFER_DEBUG enabled manage_heater(); #endif // CMDBUFFER_DEBUG } menu_progressbar_finish(); 1e910: 0f 94 de cf call 0x39fbc ; 0x39fbc cmdqueue_serial_disabled = false; 1e914: 10 92 a4 03 sts 0x03A4, r1 ; 0x8003a4 card.printingHasFinished(); 1e918: 0f 94 7a 81 call 0x302f4 ; 0x302f4 lcd_setstatuspgm(MSG_WELCOME); 1e91c: 82 e1 ldi r24, 0x12 ; 18 1e91e: 90 e7 ldi r25, 0x70 ; 112 1e920: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 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)) { 1e924: 11 23 and r17, r17 1e926: 91 f0 breq .+36 ; 0x1e94c 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); 1e928: ff 92 push r15 1e92a: ef 92 push r14 1e92c: 3f 92 push r3 1e92e: 2f 92 push r2 1e930: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommand_P(MSG_M24); 1e934: 61 e0 ldi r22, 0x01 ; 1 1e936: 8d e8 ldi r24, 0x8D ; 141 1e938: 90 e7 ldi r25, 0x70 ; 112 1e93a: 0e 94 b8 87 call 0x10f70 ; 0x10f70 1e93e: 0f 90 pop r0 1e940: 0f 90 pop r0 1e942: 0f 90 pop r0 1e944: 0f 90 pop r0 } lcd_return_to_status(); 1e946: 0f 94 82 1f call 0x23f04 ; 0x23f04 1e94a: 9b ce rjmp .-714 ; 0x1e682 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)) { result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false); 1e94c: 8d e1 ldi r24, 0x1D ; 29 1e94e: 98 e4 ldi r25, 0x48 ; 72 1e950: 0e 94 44 72 call 0xe488 ; 0xe488 1e954: 41 e0 ldi r20, 0x01 ; 1 1e956: 60 e0 ldi r22, 0x00 ; 0 1e958: 0f 94 01 50 call 0x2a002 ; 0x2a002 1e95c: 18 2f mov r17, r24 lcd_update_enable(true); 1e95e: 81 e0 ldi r24, 0x01 ; 1 1e960: 0e 94 bd 6e call 0xdd7a ; 0xdd7a } if (result) { 1e964: 11 23 and r17, r17 1e966: 01 f3 breq .-64 ; 0x1e928 1e968: ee cf rjmp .-36 ; 0x1e946 lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char); } void menu_item_dummy(void) { menu_item++; 1e96a: 8f 5f subi r24, 0xFF ; 255 1e96c: 80 93 14 05 sts 0x0514, r24 ; 0x800514 1e970: 22 ce rjmp .-956 ; 0x1e5b6 else MENU_ITEM_SDFILE(card.filename, card.longFilename); } else MENU_ITEM_DUMMY(); //dummy item that just increments the internal menu counters. } MENU_END(); 1e972: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc _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(); 1e976: 80 91 11 05 lds r24, 0x0511 ; 0x800511 1e97a: 8f 5f subi r24, 0xFF ; 255 1e97c: 80 93 11 05 sts 0x0511, r24 ; 0x800511 1e980: 80 91 13 05 lds r24, 0x0513 ; 0x800513 1e984: 8f 5f subi r24, 0xFF ; 255 1e986: 80 93 13 05 sts 0x0513, r24 ; 0x800513 1e98a: e7 cd rjmp .-1074 ; 0x1e55a 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. 1e98c: 80 91 a6 03 lds r24, 0x03A6 ; 0x8003a6 1e990: 11 e0 ldi r17, 0x01 ; 1 1e992: 81 11 cpse r24, r1 1e994: 05 c0 rjmp .+10 ; 0x1e9a0 1e996: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 1e99a: 81 11 cpse r24, r1 1e99c: 01 c0 rjmp .+2 ; 0x1e9a0 1e99e: 10 e0 ldi r17, 0x00 ; 0 if (_md->scrollPointer == NULL) 1e9a0: 80 91 aa 03 lds r24, 0x03AA ; 0x8003aa 1e9a4: 90 91 ab 03 lds r25, 0x03AB ; 0x8003ab 1e9a8: 89 2b or r24, r25 1e9aa: 91 f4 brne .+36 ; 0x1e9d0 { //load filename to memory. #ifdef SDCARD_SORT_ALPHA card.getfilename_sorted(_md->selectedFileID, _md->sdSort); 1e9ac: 60 91 b1 03 lds r22, 0x03B1 ; 0x8003b1 1e9b0: 80 91 ac 03 lds r24, 0x03AC ; 0x8003ac 1e9b4: 90 91 ad 03 lds r25, 0x03AD ; 0x8003ad 1e9b8: 0f 94 f7 85 call 0x30bee ; 0x30bee #else card.getfilename(_md->selectedFileID); #endif _md->scrollPointer = (card.longFilename[0] == '\0') ? card.filename : card.longFilename; 1e9bc: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 1e9c0: 81 11 cpse r24, r1 1e9c2: 46 c0 rjmp .+140 ; 0x1ea50 1e9c4: 81 e9 ldi r24, 0x91 ; 145 1e9c6: 94 e1 ldi r25, 0x14 ; 20 1e9c8: 90 93 ab 03 sts 0x03AB, r25 ; 0x8003ab 1e9cc: 80 93 aa 03 sts 0x03AA, r24 ; 0x8003aa } if (rewindFlag) 1e9d0: 11 11 cpse r17, r1 _md->offset = 0; //redraw once again from the beginning. 1e9d2: 10 92 a8 03 sts 0x03A8, r1 ; 0x8003a8 if (_md->lcd_scrollTimer.expired(300) || rewindFlag) 1e9d6: 6c e2 ldi r22, 0x2C ; 44 1e9d8: 71 e0 ldi r23, 0x01 ; 1 1e9da: 82 eb ldi r24, 0xB2 ; 178 1e9dc: 93 e0 ldi r25, 0x03 ; 3 1e9de: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 1e9e2: 81 11 cpse r24, r1 1e9e4: 03 c0 rjmp .+6 ; 0x1e9ec 1e9e6: 11 23 and r17, r17 1e9e8: 09 f4 brne .+2 ; 0x1e9ec 1e9ea: 54 ce rjmp .-856 ; 0x1e694 { uint8_t len = LCD_WIDTH - ((_md->isDir)? 2 : 1); 1e9ec: 80 91 a9 03 lds r24, 0x03A9 ; 0x8003a9 1e9f0: 02 e1 ldi r16, 0x12 ; 18 1e9f2: 81 11 cpse r24, r1 1e9f4: 01 c0 rjmp .+2 ; 0x1e9f8 1e9f6: 03 e1 ldi r16, 0x13 ; 19 lcd_putc_at(0, _md->row, '>'); 1e9f8: 4e e3 ldi r20, 0x3E ; 62 1e9fa: 60 91 b0 03 lds r22, 0x03B0 ; 0x8003b0 1e9fe: 80 e0 ldi r24, 0x00 ; 0 1ea00: 0e 94 98 6e call 0xdd30 ; 0xdd30 if (_md->isDir) 1ea04: 80 91 a9 03 lds r24, 0x03A9 ; 0x8003a9 1ea08: 88 23 and r24, r24 1ea0a: 19 f0 breq .+6 ; 0x1ea12 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 1ea0c: 85 e8 ldi r24, 0x85 ; 133 1ea0e: 0e 94 27 6f call 0xde4e ; 0xde4e lcd_print(LCD_STR_FOLDER[0]); if( lcd_print_pad(&_md->scrollPointer[_md->offset], len) == 0) 1ea12: 20 91 a8 03 lds r18, 0x03A8 ; 0x8003a8 1ea16: 80 91 aa 03 lds r24, 0x03AA ; 0x8003aa 1ea1a: 90 91 ab 03 lds r25, 0x03AB ; 0x8003ab 1ea1e: 60 2f mov r22, r16 1ea20: 82 0f add r24, r18 1ea22: 91 1d adc r25, r1 1ea24: 0e 94 67 70 call 0xe0ce ; 0xe0ce 1ea28: 81 11 cpse r24, r1 1ea2a: 15 c0 rjmp .+42 ; 0x1ea56 { _md->lcd_scrollTimer.start(); 1ea2c: 82 eb ldi r24, 0xB2 ; 178 1ea2e: 93 e0 ldi r25, 0x03 ; 3 1ea30: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> _md->offset++; 1ea34: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 1ea38: 8f 5f subi r24, 0xFF ; 255 1ea3a: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 } else { // stop at the end of the string _md->lcd_scrollTimer.stop(); } } if (rewindFlag) //go back to sd_menu. 1ea3e: 11 23 and r17, r17 1ea40: 09 f4 brne .+2 ; 0x1ea44 1ea42: 28 ce rjmp .-944 ; 0x1e694 1ea44: 10 92 b2 03 sts 0x03B2, r1 ; 0x8003b2 { _md->lcd_scrollTimer.stop(); //forces redraw in _standard state _md->menuState = _standard; 1ea48: 81 e0 ldi r24, 0x01 ; 1 1ea4a: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 1ea4e: 22 ce rjmp .-956 ; 0x1e694 #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; 1ea50: 86 ea ldi r24, 0xA6 ; 166 1ea52: 94 e1 ldi r25, 0x14 ; 20 1ea54: b9 cf rjmp .-142 ; 0x1e9c8 1ea56: 10 92 b2 03 sts 0x03B2, r1 ; 0x8003b2 1ea5a: f1 cf rjmp .-30 ; 0x1ea3e 0001ea5c : } #endif /* DEBUG_STEPPER_TIMER_MISSED */ static void lcd_colorprint_change() { enquecommand_P(MSG_M600); 1ea5c: 61 e0 ldi r22, 0x01 ; 1 1ea5e: 88 e8 ldi r24, 0x88 ; 136 1ea60: 90 e7 ldi r25, 0x70 ; 112 1ea62: 0e 94 b8 87 call 0x10f70 ; 0x10f70 custom_message_type = CustomMsg::FilamentLoading; //just print status message 1ea66: 82 e0 ldi r24, 0x02 ; 2 1ea68: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); 1ea6c: 83 ed ldi r24, 0xD3 ; 211 1ea6e: 92 e5 ldi r25, 0x52 ; 82 1ea70: 0e 94 44 72 call 0xe488 ; 0xe488 1ea74: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_return_to_status(); 1ea78: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_draw_update = 3; 1ea7c: 83 e0 ldi r24, 0x03 ; 3 1ea7e: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } 1ea82: 08 95 ret 0001ea84 : // hack lcd_draw_update to 1, i.e. without clear lcd_draw_update = 1; } void lcd_setstatus(const char* message) { 1ea84: cf 93 push r28 1ea86: df 93 push r29 1ea88: ec 01 movw r28, r24 if (lcd_message_check(LCD_STATUS_NONE)) 1ea8a: 80 e0 ldi r24, 0x00 ; 0 1ea8c: 0e 94 c0 f1 call 0x1e380 ; 0x1e380 1ea90: 88 23 and r24, r24 1ea92: 31 f0 breq .+12 ; 0x1eaa0 lcd_updatestatus(message); 1ea94: 60 e0 ldi r22, 0x00 ; 0 1ea96: ce 01 movw r24, r28 } 1ea98: df 91 pop r29 1ea9a: cf 91 pop r28 } void lcd_setstatus(const char* message) { if (lcd_message_check(LCD_STATUS_NONE)) lcd_updatestatus(message); 1ea9c: 0c 94 a5 f1 jmp 0x1e34a ; 0x1e34a } 1eaa0: df 91 pop r29 1eaa2: cf 91 pop r28 1eaa4: 08 95 ret 0001eaa6 : 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) { 1eaa6: cf 93 push r28 1eaa8: df 93 push r29 1eaaa: c8 2f mov r28, r24 softReset(); } void UnconditionalStop() { CRITICAL_SECTION_START; 1eaac: 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) { 1eaae: 66 23 and r22, r22 1eab0: d9 f1 breq .+118 ; 0x1eb28 1eab2: f8 94 cli // Disable all heaters and unroll the temperature wait loop stack disable_heater(); 1eab4: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 cancel_heatup = true; 1eab8: 81 e0 ldi r24, 0x01 ; 1 1eaba: 80 93 b4 0d sts 0x0DB4, r24 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> heating_status = HeatingStatus::NO_HEATING; 1eabe: 10 92 e1 03 sts 0x03E1, r1 ; 0x8003e1 // Clear any saved printing state cancel_saved_printing(); 1eac2: 0e 94 45 64 call 0xc88a ; 0xc88a // Abort the planner planner_abort_hard(); 1eac6: 0f 94 b7 c1 call 0x3836e ; 0x3836e // Reset the queue cmdqueue_reset(); 1eaca: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 cmdqueue_serial_disabled = false; 1eace: 10 92 a4 03 sts 0x03A4, r1 ; 0x8003a4 st_reset_timer(); 1ead2: 0f 94 03 44 call 0x28806 ; 0x28806 CRITICAL_SECTION_END; 1ead6: df bf out 0x3f, r29 ; 63 // clear paused state immediately did_pause_print = false; 1ead8: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 print_job_timer.stop(); 1eadc: 0f 94 72 43 call 0x286e4 ; 0x286e4 } else { // Allow lcd_print_stop_finish() to use the heaters when it is safe ConditionalStop(); } if (card.isFileOpen()) { 1eae0: 80 91 22 17 lds r24, 0x1722 ; 0x801722 1eae4: 88 23 and r24, r24 1eae6: 71 f0 breq .+28 ; 0x1eb04 // Reset the sd status card.sdprinting = false; 1eae8: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f lastnr++; } void CardReader::closefile(bool store_location) { file.sync(); 1eaec: 8f e1 ldi r24, 0x1F ; 31 1eaee: 97 e1 ldi r25, 0x17 ; 23 1eaf0: 0f 94 32 59 call 0x2b264 ; 0x2b264 file.close(); 1eaf4: 8f e1 ldi r24, 0x1F ; 31 1eaf6: 97 e1 ldi r25, 0x17 ; 23 1eaf8: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce saving = false; 1eafc: 10 92 8d 14 sts 0x148D, r1 ; 0x80148d logging = false; 1eb00: 10 92 8e 14 sts 0x148E, r1 ; 0x80148e card.closefile(); } SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_CANCEL); 1eb04: 8c ec ldi r24, 0xCC ; 204 1eb06: 9a e6 ldi r25, 0x6A ; 106 1eb08: 0e 94 13 79 call 0xf226 ; 0xf226 #ifdef MESH_BED_LEVELING mbl.active = false; 1eb0c: 10 92 c1 13 sts 0x13C1, r1 ; 0x8013c1 #endif if (interactive) { 1eb10: c1 11 cpse r28, r1 // acknowledged by the user from the LCD: resume processing USB commands again Stopped = false; 1eb12: 10 92 10 05 sts 0x0510, r1 ; 0x800510 } // return to status is required to continue processing in the main loop! lcd_commands_type = LcdCommands::StopPrint; 1eb16: 81 e0 ldi r24, 0x01 ; 1 1eb18: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 } PrinterState SetPrinterState(PrinterState status) { return printer_state = status; 1eb1c: 10 92 b7 0d sts 0x0DB7, r1 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::NotReady); //set printer state to show LCD menu after print has been stopped lcd_return_to_status(); } 1eb20: df 91 pop r29 1eb22: 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(); 1eb24: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 } void ConditionalStop() { CRITICAL_SECTION_START; 1eb28: 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; 1eb2a: 81 e0 ldi r24, 0x01 ; 1 1eb2c: 80 93 b4 0d sts 0x0DB4, r24 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> heating_status = HeatingStatus::NO_HEATING; 1eb30: 10 92 e1 03 sts 0x03E1, r1 ; 0x8003e1 // Clear any saved printing state cancel_saved_printing(); 1eb34: 0e 94 45 64 call 0xc88a ; 0xc88a // Abort the planner planner_abort_hard(); 1eb38: 0f 94 b7 c1 call 0x3836e ; 0x3836e // Reset the queue cmdqueue_reset(); 1eb3c: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 cmdqueue_serial_disabled = false; 1eb40: 10 92 a4 03 sts 0x03A4, r1 ; 0x8003a4 st_reset_timer(); 1eb44: 0f 94 03 44 call 0x28806 ; 0x28806 CRITICAL_SECTION_END; 1eb48: df bf out 0x3f, r29 ; 63 1eb4a: ca cf rjmp .-108 ; 0x1eae0 0001eb4c : } void lcd_print_stop() { print_stop(true); 1eb4c: 60 e0 ldi r22, 0x00 ; 0 1eb4e: 81 e0 ldi r24, 0x01 ; 1 1eb50: 0c 94 53 f5 jmp 0x1eaa6 ; 0x1eaa6 0001eb54 : 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' 1eb54: 41 30 cpi r20, 0x01 ; 1 1eb56: 41 f4 brne .+16 ; 0x1eb68 if (lcd_show_multiscreen_message_cont_cancel_and_wait_P(warning, true, LCD_LEFT_BUTTON_CHOICE) == LCD_MIDDLE_BUTTON_CHOICE) { 1eb58: 40 e0 ldi r20, 0x00 ; 0 1eb5a: 61 e0 ldi r22, 0x01 ; 1 1eb5c: 0f 94 01 50 call 0x2a002 ; 0x2a002 1eb60: 81 30 cpi r24, 0x01 ; 1 1eb62: 41 f4 brne .+16 ; 0x1eb74 lcd_print_stop(); } } else if (check == 2) { // Strict, always stop print lcd_show_fullscreen_message_and_wait_P(strict); lcd_print_stop(); 1eb64: 0c 94 a6 f5 jmp 0x1eb4c ; 0x1eb4c { 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 1eb68: 42 30 cpi r20, 0x02 ; 2 1eb6a: 21 f4 brne .+8 ; 0x1eb74 lcd_show_fullscreen_message_and_wait_P(strict); 1eb6c: cb 01 movw r24, r22 1eb6e: 0f 94 cd 20 call 0x2419a ; 0x2419a 1eb72: f8 cf rjmp .-16 ; 0x1eb64 lcd_print_stop(); } } 1eb74: 08 95 ret 0001eb76 : ,_T(MSG_GCODE_NEWER_FIRMWARE_CANCELLED) ,(uint8_t)oCheckVersion ); } bool filament_presence_check() { 1eb76: 0f 93 push r16 1eb78: 1f 93 push r17 1eb7a: 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)) { 1eb7c: 8c ea ldi r24, 0xAC ; 172 1eb7e: 9c e0 ldi r25, 0x0C ; 12 1eb80: 0f 94 10 dc call 0x3b820 ; 0x3b820 1eb84: 81 11 cpse r24, r1 1eb86: 23 c0 rjmp .+70 ; 0x1ebce goto done; } if (fsensor.isEnabled() && !fsensor.getFilamentPresent()) { 1eb88: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1eb8c: 88 23 and r24, r24 1eb8e: f9 f0 breq .+62 ; 0x1ebce 1eb90: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 1eb94: 81 11 cpse r24, r1 1eb96: 1b c0 rjmp .+54 ; 0x1ebce if (oCheckFilament == ClCheckMode::_None) { 1eb98: c0 91 e6 04 lds r28, 0x04E6 ; 0x8004e6 1eb9c: cc 23 and r28, r28 1eb9e: b9 f0 breq .+46 ; 0x1ebce goto done; } render_M862_warnings( 1eba0: 85 e9 ldi r24, 0x95 ; 149 1eba2: 9a e4 ldi r25, 0x4A ; 74 1eba4: 0e 94 44 72 call 0xe488 ; 0xe488 1eba8: 8c 01 movw r16, r24 1ebaa: 85 e9 ldi r24, 0x95 ; 149 1ebac: 9a e4 ldi r25, 0x4A ; 74 1ebae: 0e 94 44 72 call 0xe488 ; 0xe488 1ebb2: 4c 2f mov r20, r28 1ebb4: b8 01 movw r22, r16 1ebb6: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 _T(MSG_MISSING_FILAMENT) ,_T(MSG_MISSING_FILAMENT) //Identical messages ,(uint8_t)oCheckFilament ); if (lcd_commands_type == LcdCommands::StopPrint) { 1ebba: 81 e0 ldi r24, 0x01 ; 1 1ebbc: 90 91 b3 0d lds r25, 0x0DB3 ; 0x800db3 1ebc0: 91 30 cpi r25, 0x01 ; 1 1ebc2: 09 f4 brne .+2 ; 0x1ebc6 1ebc4: 80 e0 ldi r24, 0x00 ; 0 } } done: return true; } 1ebc6: cf 91 pop r28 1ebc8: 1f 91 pop r17 1ebca: 0f 91 pop r16 1ebcc: 08 95 ret return false; } } done: return true; 1ebce: 81 e0 ldi r24, 0x01 ; 1 1ebd0: fa cf rjmp .-12 ; 0x1ebc6 0001ebd2 : lcd_show_fullscreen_message_and_wait_P(strict); lcd_print_stop(); } } void nozzle_diameter_check(uint16_t nDiameter) { 1ebd2: 1f 93 push r17 1ebd4: cf 93 push r28 1ebd6: df 93 push r29 uint16_t nDiameter_um; if (oCheckMode == ClCheckMode::_None) 1ebd8: 10 91 eb 04 lds r17, 0x04EB ; 0x8004eb 1ebdc: 11 23 and r17, r17 1ebde: f9 f0 breq .+62 ; 0x1ec1e 1ebe0: ec 01 movw r28, r24 return; nDiameter_um = eeprom_read_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM); 1ebe2: 85 ea ldi r24, 0xA5 ; 165 1ebe4: 9d e0 ldi r25, 0x0D ; 13 1ebe6: 0f 94 1e dc call 0x3b83c ; 0x3b83c if (nDiameter == nDiameter_um) 1ebea: 8c 17 cp r24, r28 1ebec: 9d 07 cpc r25, r29 1ebee: b9 f0 breq .+46 ; 0x1ec1e // SERIAL_ECHOPGM("actual : "); // SERIAL_ECHOLN((float)(nDiameter_um/1000.0)); // SERIAL_ECHOPGM("expected: "); // SERIAL_ECHOLN((float)(nDiameter/1000.0)); render_M862_warnings( 1ebf0: 86 e4 ldi r24, 0x46 ; 70 1ebf2: 9a e4 ldi r25, 0x4A ; 74 1ebf4: 0e 94 44 72 call 0xe488 ; 0xe488 1ebf8: ec 01 movw r28, r24 1ebfa: 8b e1 ldi r24, 0x1B ; 27 1ebfc: 9a e4 ldi r25, 0x4A ; 74 1ebfe: 0e 94 44 72 call 0xe488 ; 0xe488 1ec02: 41 2f mov r20, r17 1ec04: be 01 movw r22, r28 1ec06: 0e 94 aa f5 call 0x1eb54 ; 0x1eb54 ,_T(MSG_NOZZLE_DIFFERS_CANCELLED) ,(uint8_t)oCheckMode ); if (!farm_mode) { bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function 1ec0a: 10 92 fb 03 sts 0x03FB, r1 ; 0x8003fb menu_submenu(lcd_hw_setup_menu); 1ec0e: 60 e0 ldi r22, 0x00 ; 0 1ec10: 80 eb ldi r24, 0xB0 ; 176 1ec12: 92 ed ldi r25, 0xD2 ; 210 } } 1ec14: df 91 pop r29 1ec16: cf 91 pop r28 1ec18: 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); 1ec1a: 0d 94 f7 d2 jmp 0x3a5ee ; 0x3a5ee } } 1ec1e: df 91 pop r29 1ec20: cf 91 pop r28 1ec22: 1f 91 pop r17 1ec24: 08 95 ret 0001ec26 : } /// @brief Set print fan speed /// @param speed ranges from 0 to 255 static void lcd_selftest_setfan(const uint8_t speed) { fanSpeed = speed; 1ec26: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = speed; 1ec2a: 80 93 a5 04 sts 0x04A5, r24 ; 0x8004a5 #endif manage_heater(); 1ec2e: 0d 94 34 39 jmp 0x27268 ; 0x27268 0001ec32 : { (void)lcd_selftest(); } bool lcd_selftest() { 1ec32: cf 92 push r12 1ec34: df 92 push r13 1ec36: ef 92 push r14 1ec38: ff 92 push r15 1ec3a: 0f 93 push r16 1ec3c: 1f 93 push r17 1ec3e: cf 93 push r28 1ec40: df 93 push r29 1ec42: 00 d0 rcall .+0 ; 0x1ec44 1ec44: 1f 92 push r1 1ec46: cd b7 in r28, 0x3d ; 61 1ec48: 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(); 1ec4a: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 uint8_t fanSpeedBckp = fanSpeed; 1ec4e: d0 90 e5 03 lds r13, 0x03E5 ; 0x8003e5 fanSpeed = 255; 1ec52: 8f ef ldi r24, 0xFF ; 255 1ec54: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 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)); 1ec58: 82 ec ldi r24, 0xC2 ; 194 1ec5a: e8 2e mov r14, r24 1ec5c: 89 e8 ldi r24, 0x89 ; 137 1ec5e: 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()); 1ec60: 0c eb ldi r16, 0xBC ; 188 1ec62: 19 e8 ldi r17, 0x89 ; 137 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)) { 1ec64: 20 e0 ldi r18, 0x00 ; 0 1ec66: 30 e0 ldi r19, 0x00 ; 0 1ec68: 48 e4 ldi r20, 0x48 ; 72 1ec6a: 52 e4 ldi r21, 0x42 ; 66 1ec6c: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1ec70: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1ec74: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1ec78: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1ec7c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1ec80: 18 16 cp r1, r24 1ec82: 8c f0 brlt .+34 ; 0x1eca6 1ec84: 20 e0 ldi r18, 0x00 ; 0 1ec86: 30 e0 ldi r19, 0x00 ; 0 1ec88: 48 e4 ldi r20, 0x48 ; 72 1ec8a: 52 e4 ldi r21, 0x42 ; 66 1ec8c: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 1ec90: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 1ec94: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 1ec98: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 1ec9c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1eca0: 18 16 cp r1, r24 1eca2: 0c f0 brlt .+2 ; 0x1eca6 1eca4: 42 c0 rjmp .+132 ; 0x1ed2a lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP)); 1eca6: 82 e4 ldi r24, 0x42 ; 66 1eca8: 98 e4 ldi r25, 0x48 ; 72 1ecaa: 0e 94 44 72 call 0xe488 ; 0xe488 1ecae: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]); 1ecb2: 42 e8 ldi r20, 0x82 ; 130 1ecb4: 64 e0 ldi r22, 0x04 ; 4 1ecb6: 80 e0 ldi r24, 0x00 ; 0 1ecb8: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0)); 1ecbc: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 1ecc0: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 1ecc4: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 1ecc8: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 1eccc: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1ecd0: 7f 93 push r23 1ecd2: 6f 93 push r22 1ecd4: ff 92 push r15 1ecd6: ef 92 push r14 1ecd8: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_putc(LCD_STR_DEGREE[0]); 1ecdc: 81 e8 ldi r24, 0x81 ; 129 1ecde: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_putc_at(9, 4, LCD_STR_BEDTEMP[0]); 1ece2: 40 e8 ldi r20, 0x80 ; 128 1ece4: 64 e0 ldi r22, 0x04 ; 4 1ece6: 89 e0 ldi r24, 0x09 ; 9 1ece8: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed()); 1ecec: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 1ecf0: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 1ecf4: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 1ecf8: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 1ecfc: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 1ed00: 7f 93 push r23 1ed02: 6f 93 push r22 1ed04: 1f 93 push r17 1ed06: 0f 93 push r16 1ed08: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_putc(LCD_STR_DEGREE[0]); 1ed0c: 81 e8 ldi r24, 0x81 ; 129 1ed0e: 0e 94 67 6e call 0xdcce ; 0xdcce delay_keep_alive(1000); 1ed12: 88 ee ldi r24, 0xE8 ; 232 1ed14: 93 e0 ldi r25, 0x03 ; 3 1ed16: 0e 94 84 8c call 0x11908 ; 0x11908 serialecho_temperatures(); 1ed1a: 0e 94 f6 76 call 0xedec ; 0xedec 1ed1e: 0f b6 in r0, 0x3f ; 63 1ed20: f8 94 cli 1ed22: de bf out 0x3e, r29 ; 62 1ed24: 0f be out 0x3f, r0 ; 63 1ed26: cd bf out 0x3d, r28 ; 61 1ed28: 9d cf rjmp .-198 ; 0x1ec64 } fanSpeed = fanSpeedBckp; 1ed2a: d0 92 e5 03 sts 0x03E5, r13 ; 0x8003e5 lcd_update_enable(true); 1ed2e: 81 e0 ldi r24, 0x01 ; 1 1ed30: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_detect_IRsensor(); } } #endif lcd_wait_for_cool_down(); lcd_clear(); 1ed34: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_START)); 1ed38: 85 e7 ldi r24, 0x75 ; 117 1ed3a: 98 e4 ldi r25, 0x48 ; 72 1ed3c: 0e 94 44 72 call 0xe488 ; 0xe488 1ed40: ac 01 movw r20, r24 1ed42: 60 e0 ldi r22, 0x00 ; 0 1ed44: 80 e0 ldi r24, 0x00 ; 0 1ed46: 0e 94 8c 6e call 0xdd18 ; 0xdd18 #ifdef TMC2130 FORCE_HIGH_POWER_START; 1ed4a: 81 e0 ldi r24, 0x01 ; 1 1ed4c: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif // TMC2130 FORCE_BL_ON_START; 1ed50: 81 e0 ldi r24, 0x01 ; 1 1ed52: 0e 94 e9 89 call 0x113d2 ; 0x113d2 _delay(2000); 1ed56: 60 ed ldi r22, 0xD0 ; 208 1ed58: 77 e0 ldi r23, 0x07 ; 7 1ed5a: 80 e0 ldi r24, 0x00 ; 0 1ed5c: 90 e0 ldi r25, 0x00 ; 0 1ed5e: 0f 94 2f 28 call 0x2505e ; 0x2505e KEEPALIVE_STATE(IN_HANDLER); 1ed62: 82 e0 ldi r24, 0x02 ; 2 1ed64: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be _progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000); 1ed68: 00 ed ldi r16, 0xD0 ; 208 1ed6a: 17 e0 ldi r17, 0x07 ; 7 1ed6c: 21 e0 ldi r18, 0x01 ; 1 1ed6e: 43 e0 ldi r20, 0x03 ; 3 1ed70: 60 e0 ldi r22, 0x00 ; 0 1ed72: 80 e0 ldi r24, 0x00 ; 0 1ed74: 0e 94 34 db call 0x1b668 ; 0x1b668 1ed78: 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 1ed7a: 83 e0 ldi r24, 0x03 ; 3 1ed7c: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 lcd_selftest_setfan(0); // print fan off 1ed80: 80 e0 ldi r24, 0x00 ; 0 1ed82: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 lcd_selftest_measure_fans(2, 18, 2); 1ed86: 62 e0 ldi r22, 0x02 ; 2 1ed88: 82 e0 ldi r24, 0x02 ; 2 1ed8a: 0f 94 dd a0 call 0x341ba ; 0x341ba setExtruderAutoFanState(0); // hotend fan off 1ed8e: 80 e0 ldi r24, 0x00 ; 0 1ed90: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 if (fan_speed[0] < failThr) { 1ed94: c0 90 c7 03 lds r12, 0x03C7 ; 0x8003c7 1ed98: d0 90 c8 03 lds r13, 0x03C8 ; 0x8003c8 1ed9c: 94 e1 ldi r25, 0x14 ; 20 1ed9e: c9 16 cp r12, r25 1eda0: d1 04 cpc r13, r1 1eda2: 5c f1 brlt .+86 ; 0x1edfa lcd_selftest_error(TestError::ExtruderFan, "", ""); } if (_result) { _progress = lcd_selftest_screen(TestScreen::PrintFan, _progress, 3, true, 2000); 1eda4: 21 e0 ldi r18, 0x01 ; 1 1eda6: 43 e0 ldi r20, 0x03 ; 3 1eda8: 6f 2d mov r22, r15 1edaa: 81 e0 ldi r24, 0x01 ; 1 1edac: 0e 94 34 db call 0x1b668 ; 0x1b668 1edb0: f8 2e mov r15, r24 return FanCheck::SwappedFan; } break; case 1: lcd_selftest_setfan(255); 1edb2: 8f ef ldi r24, 0xFF ; 255 1edb4: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 lcd_selftest_measure_fans(5, 18, 3); 1edb8: 63 e0 ldi r22, 0x03 ; 3 1edba: 85 e0 ldi r24, 0x05 ; 5 1edbc: 0f 94 dd a0 call 0x341ba ; 0x341ba lcd_selftest_setfan(0); 1edc0: 80 e0 ldi r24, 0x00 ; 0 1edc2: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 if (fan_speed[1] < failThr) { 1edc6: 80 91 c9 03 lds r24, 0x03C9 ; 0x8003c9 1edca: 90 91 ca 03 lds r25, 0x03CA ; 0x8003ca 1edce: 84 31 cpi r24, 0x14 ; 20 1edd0: 91 05 cpc r25, r1 1edd2: cc f4 brge .+50 ; 0x1ee06 #else //defined(TACH_1) _result = lcd_selftest_manual_fan_check(1, false); #endif //defined(TACH_1) if (!_result) { lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning 1edd4: 66 ef ldi r22, 0xF6 ; 246 1edd6: 72 e0 ldi r23, 0x02 ; 2 1edd8: 85 e0 ldi r24, 0x05 ; 5 1edda: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 } } if (_swapped_fan) { 1edde: 96 e4 ldi r25, 0x46 ; 70 1ede0: c9 16 cp r12, r25 1ede2: d1 04 cpc r13, r1 1ede4: 9c f4 brge .+38 ; 0x1ee0c { _progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct } else { _progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000); 1ede6: 08 e8 ldi r16, 0x88 ; 136 1ede8: 13 e1 ldi r17, 0x13 ; 19 1edea: 21 e0 ldi r18, 0x01 ; 1 1edec: 43 e0 ldi r20, 0x03 ; 3 1edee: 6f 2d mov r22, r15 1edf0: 8d e0 ldi r24, 0x0D ; 13 1edf2: 0e 94 34 db call 0x1b668 ; 0x1b668 1edf6: e1 2c mov r14, r1 1edf8: 49 c1 rjmp .+658 ; 0x1f08c #else //defined(TACH_0) _result = lcd_selftest_manual_fan_check(0, false); #endif //defined(TACH_0) if (!_result) { lcd_selftest_error(TestError::ExtruderFan, "", ""); 1edfa: 66 ef ldi r22, 0xF6 ; 246 1edfc: 72 e0 ldi r23, 0x02 ; 2 1edfe: 86 e0 ldi r24, 0x06 ; 6 lcd_selftest_error(TestError::PrintFan, "", ""); } } else { // fans are swapped lcd_selftest_error(TestError::SwappedFan, "", ""); 1ee00: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 1ee04: f0 cf rjmp .-32 ; 0x1ede6 lcd_selftest_measure_fans(5, 18, 3); lcd_selftest_setfan(0); if (fan_speed[1] < failThr) { return FanCheck::PrintFan; } if (fan_speed[1] < printFanThr) { 1ee06: 86 34 cpi r24, 0x46 ; 70 1ee08: 91 05 cpc r25, r1 1ee0a: 54 f4 brge .+20 ; 0x1ee20 } } if (_swapped_fan) { //turn on print fan and check that left hotend fan is not spinning _result = lcd_selftest_manual_fan_check(1, true); 1ee0c: 60 e0 ldi r22, 0x00 ; 0 1ee0e: 81 e0 ldi r24, 0x01 ; 1 1ee10: 0f 94 4f a0 call 0x3409e ; 0x3409e if (_result) { 1ee14: 81 11 cpse r24, r1 1ee16: 68 c1 rjmp .+720 ; 0x1f0e8 lcd_selftest_error(TestError::PrintFan, "", ""); } } else { // fans are swapped lcd_selftest_error(TestError::SwappedFan, "", ""); 1ee18: 66 ef ldi r22, 0xF6 ; 246 1ee1a: 72 e0 ldi r23, 0x02 ; 2 1ee1c: 89 e0 ldi r24, 0x09 ; 9 1ee1e: f0 cf rjmp .-32 ; 0x1ee00 { lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning } } if (_swapped_fan) { 1ee20: 86 e4 ldi r24, 0x46 ; 70 1ee22: c8 16 cp r12, r24 1ee24: d1 04 cpc r13, r1 1ee26: 94 f7 brge .-28 ; 0x1ee0c } } if (_result) { _progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000); 1ee28: 00 ed ldi r16, 0xD0 ; 208 1ee2a: 17 e0 ldi r17, 0x07 ; 7 1ee2c: 21 e0 ldi r18, 0x01 ; 1 1ee2e: 43 e0 ldi r20, 0x03 ; 3 1ee30: 6f 2d mov r22, r15 1ee32: 82 e0 ldi r24, 0x02 ; 2 1ee34: 0e 94 34 db call 0x1b668 ; 0x1b668 1ee38: f8 2e mov r15, r24 static bool lcd_selfcheck_endstops() { bool _result = true; if ( 1ee3a: 1c 9b sbis 0x03, 4 ; 3 1ee3c: 18 c0 rjmp .+48 ; 0x1ee6e { #ifndef TMC2130 if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) current_position[0] += 10; if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) current_position[1] += 10; #endif //!TMC2130 if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) current_position[2] += 10; 1ee3e: 1c 9b sbis 0x03, 4 ; 3 1ee40: 16 c0 rjmp .+44 ; 0x1ee6e 1ee42: 20 e0 ldi r18, 0x00 ; 0 1ee44: 30 e0 ldi r19, 0x00 ; 0 1ee46: 40 e2 ldi r20, 0x20 ; 32 1ee48: 51 e4 ldi r21, 0x41 ; 65 1ee4a: 60 91 99 06 lds r22, 0x0699 ; 0x800699 1ee4e: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 1ee52: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 1ee56: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 1ee5a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1ee5e: 60 93 99 06 sts 0x0699, r22 ; 0x800699 1ee62: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 1ee66: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 1ee6a: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c } plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 1ee6e: 60 e0 ldi r22, 0x00 ; 0 1ee70: 70 e0 ldi r23, 0x00 ; 0 1ee72: 84 e3 ldi r24, 0x34 ; 52 1ee74: 92 e4 ldi r25, 0x42 ; 66 1ee76: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1ee7a: 0f 94 a9 43 call 0x28752 ; 0x28752 if ( 1ee7e: 1c 9b sbis 0x03, 4 ; 3 1ee80: 3d c1 rjmp .+634 ; 0x1f0fc ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) || #endif //!TMC2130 ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1)) { _result = false; char _error[4] = ""; 1ee82: 1a 82 std Y+2, r1 ; 0x02 1ee84: 19 82 std Y+1, r1 ; 0x01 1ee86: 1c 82 std Y+4, r1 ; 0x04 1ee88: 1b 82 std Y+3, r1 ; 0x03 #ifndef TMC2130 if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "X"); 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"); 1ee8a: 1c 9b sbis 0x03, 4 ; 3 1ee8c: 06 c0 rjmp .+12 ; 0x1ee9a 1ee8e: 65 ee ldi r22, 0xE5 ; 229 1ee90: 72 e0 ldi r23, 0x02 ; 2 1ee92: ce 01 movw r24, r28 1ee94: 01 96 adiw r24, 0x01 ; 1 1ee96: 0f 94 5c e2 call 0x3c4b8 ; 0x3c4b8 lcd_selftest_error(TestError::Endstops, _error, ""); 1ee9a: be 01 movw r22, r28 1ee9c: 6f 5f subi r22, 0xFF ; 255 1ee9e: 7f 4f sbci r23, 0xFF ; 255 1eea0: 82 e0 ldi r24, 0x02 ; 2 1eea2: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 ((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; 1eea6: 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(); 1eea8: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 1eeac: 81 e0 ldi r24, 0x01 ; 1 1eeae: 0e 94 4f 8a call 0x1149e ; 0x1149e { _progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000); _result = lcd_selfcheck_endstops(); //With TMC2130, only the Z probe is tested. } if (_result) 1eeb2: 11 23 and r17, r17 1eeb4: 09 f4 brne .+2 ; 0x1eeb8 1eeb6: 97 cf rjmp .-210 ; 0x1ede6 { //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); 1eeb8: 00 ed ldi r16, 0xD0 ; 208 1eeba: 17 e0 ldi r17, 0x07 ; 7 1eebc: 21 e0 ldi r18, 0x01 ; 1 1eebe: 43 e0 ldi r20, 0x03 ; 3 1eec0: 6f 2d mov r22, r15 1eec2: 84 e0 ldi r24, 0x04 ; 4 1eec4: 0e 94 34 db call 0x1b668 ; 0x1b668 1eec8: f8 2e mov r15, r24 #ifdef TMC2130 _result = lcd_selfcheck_axis_sg(X_AXIS); 1eeca: 80 e0 ldi r24, 0x00 ; 0 1eecc: 0e 94 ee dd call 0x1bbdc ; 0x1bbdc } if (_result) 1eed0: 88 23 and r24, r24 1eed2: 09 f4 brne .+2 ; 0x1eed6 1eed4: 88 cf rjmp .-240 ; 0x1ede6 { _progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 0); 1eed6: 10 e0 ldi r17, 0x00 ; 0 1eed8: 00 e0 ldi r16, 0x00 ; 0 1eeda: 21 e0 ldi r18, 0x01 ; 1 1eedc: 43 e0 ldi r20, 0x03 ; 3 1eede: 6f 2d mov r22, r15 1eee0: 84 e0 ldi r24, 0x04 ; 4 1eee2: 0e 94 34 db call 0x1b668 ; 0x1b668 } if (_result) { _progress = lcd_selftest_screen(TestScreen::AxisY, _progress, 3, true, 1500); 1eee6: 0c ed ldi r16, 0xDC ; 220 1eee8: 15 e0 ldi r17, 0x05 ; 5 1eeea: 21 e0 ldi r18, 0x01 ; 1 1eeec: 43 e0 ldi r20, 0x03 ; 3 1eeee: 68 2f mov r22, r24 1eef0: 85 e0 ldi r24, 0x05 ; 5 1eef2: 0e 94 34 db call 0x1b668 ; 0x1b668 1eef6: f8 2e mov r15, r24 #ifdef TMC2130 _result = lcd_selfcheck_axis_sg(Y_AXIS); 1eef8: 81 e0 ldi r24, 0x01 ; 1 1eefa: 0e 94 ee dd call 0x1bbdc ; 0x1bbdc #else _result = lcd_selfcheck_axis(Y_AXIS, Y_MAX_POS); #endif // TMC2130 } if (_result) 1eefe: 88 23 and r24, r24 1ef00: 09 f4 brne .+2 ; 0x1ef04 1ef02: 71 cf rjmp .-286 ; 0x1ede6 { _progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 0); 1ef04: 10 e0 ldi r17, 0x00 ; 0 1ef06: 00 e0 ldi r16, 0x00 ; 0 1ef08: 21 e0 ldi r18, 0x01 ; 1 1ef0a: 43 e0 ldi r20, 0x03 ; 3 1ef0c: 6f 2d mov r22, r15 1ef0e: 86 e0 ldi r24, 0x06 ; 6 1ef10: 0e 94 34 db call 0x1b668 ; 0x1b668 1ef14: f8 2e mov r15, r24 if (_result) { #ifdef TMC2130 tmc2130_home_exit(); 1ef16: 0f 94 85 26 call 0x24d0a ; 0x24d0a 1ef1a: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(false); #endif //homeaxis(X_AXIS); //homeaxis(Y_AXIS); current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); 1ef1e: ef e1 ldi r30, 0x1F ; 31 1ef20: f5 ea ldi r31, 0xA5 ; 165 1ef22: 85 91 lpm r24, Z+ 1ef24: 95 91 lpm r25, Z+ 1ef26: a5 91 lpm r26, Z+ 1ef28: b4 91 lpm r27, Z 1ef2a: 80 93 91 06 sts 0x0691, r24 ; 0x800691 1ef2e: 90 93 92 06 sts 0x0692, r25 ; 0x800692 1ef32: a0 93 93 06 sts 0x0693, r26 ; 0x800693 1ef36: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4+1); 1ef3a: e3 e2 ldi r30, 0x23 ; 35 1ef3c: f5 ea ldi r31, 0xA5 ; 165 1ef3e: 65 91 lpm r22, Z+ 1ef40: 75 91 lpm r23, Z+ 1ef42: 85 91 lpm r24, Z+ 1ef44: 94 91 lpm r25, Z #ifdef TMC2130 //current_position[X_AXIS] += 0; current_position[Y_AXIS] += 4; 1ef46: 20 e0 ldi r18, 0x00 ; 0 1ef48: 30 e0 ldi r19, 0x00 ; 0 1ef4a: 40 e8 ldi r20, 0x80 ; 128 1ef4c: 50 e4 ldi r21, 0x40 ; 64 1ef4e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1ef52: 60 93 95 06 sts 0x0695, r22 ; 0x800695 1ef56: 70 93 96 06 sts 0x0696, r23 ; 0x800696 1ef5a: 80 93 97 06 sts 0x0697, r24 ; 0x800697 1ef5e: 90 93 98 06 sts 0x0698, r25 ; 0x800698 #endif //TMC2130 raise_z(10); 1ef62: 60 e0 ldi r22, 0x00 ; 0 1ef64: 70 e0 ldi r23, 0x00 ; 0 1ef66: 80 e2 ldi r24, 0x20 ; 32 1ef68: 91 e4 ldi r25, 0x41 ; 65 1ef6a: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 set_destination_to_current(); 1ef6e: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 _progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500); 1ef72: 0c ed ldi r16, 0xDC ; 220 1ef74: 15 e0 ldi r17, 0x05 ; 5 1ef76: 21 e0 ldi r18, 0x01 ; 1 1ef78: 43 e0 ldi r20, 0x03 ; 3 1ef7a: 6f 2d mov r22, r15 1ef7c: 86 e0 ldi r24, 0x06 ; 6 1ef7e: 0e 94 34 db call 0x1b668 ; 0x1b668 #ifdef TMC2130 homeaxis(Z_AXIS); //In case of failure, the code gets stuck in this function. 1ef82: 50 e0 ldi r21, 0x00 ; 0 1ef84: 40 e0 ldi r20, 0x00 ; 0 1ef86: 61 e0 ldi r22, 0x01 ; 1 1ef88: 82 e0 ldi r24, 0x02 ; 2 1ef8a: 0e 94 03 7a call 0xf406 ; 0xf406 #else _result = lcd_selfcheck_axis(Z_AXIS, Z_MAX_POS); #endif //TMC2130 //raise Z to not damage the bed during and hotend testing raise_z(20); 1ef8e: 60 e0 ldi r22, 0x00 ; 0 1ef90: 70 e0 ldi r23, 0x00 ; 0 1ef92: 80 ea ldi r24, 0xA0 ; 160 1ef94: 91 e4 ldi r25, 0x41 ; 65 1ef96: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 } #ifdef TMC2130 if (_result) { raise_z(10); 1ef9a: 60 e0 ldi r22, 0x00 ; 0 1ef9c: 70 e0 ldi r23, 0x00 ; 0 1ef9e: 80 e2 ldi r24, 0x20 ; 32 1efa0: 91 e4 ldi r25, 0x41 ; 65 1efa2: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 _progress = lcd_selftest_screen(TestScreen::Home, 0, 2, true, 0); 1efa6: 10 e0 ldi r17, 0x00 ; 0 1efa8: 00 e0 ldi r16, 0x00 ; 0 1efaa: 21 e0 ldi r18, 0x01 ; 1 1efac: 42 e0 ldi r20, 0x02 ; 2 1efae: 60 e0 ldi r22, 0x00 ; 0 1efb0: 8e e0 ldi r24, 0x0E ; 14 1efb2: 0e 94 34 db call 0x1b668 ; 0x1b668 bool bres = tmc2130_home_calibrate(X_AXIS); 1efb6: 80 e0 ldi r24, 0x00 ; 0 1efb8: 0f 94 77 23 call 0x246ee ; 0x246ee 1efbc: e8 2e mov r14, r24 _progress = lcd_selftest_screen(TestScreen::Home, 1, 2, true, 0); 1efbe: 21 e0 ldi r18, 0x01 ; 1 1efc0: 42 e0 ldi r20, 0x02 ; 2 1efc2: 61 e0 ldi r22, 0x01 ; 1 1efc4: 8e e0 ldi r24, 0x0E ; 14 1efc6: 0e 94 34 db call 0x1b668 ; 0x1b668 bres &= tmc2130_home_calibrate(Y_AXIS); 1efca: 81 e0 ldi r24, 0x01 ; 1 1efcc: 0f 94 77 23 call 0x246ee ; 0x246ee 1efd0: e8 22 and r14, r24 _progress = lcd_selftest_screen(TestScreen::Home, 2, 2, true, 0); 1efd2: 21 e0 ldi r18, 0x01 ; 1 1efd4: 42 e0 ldi r20, 0x02 ; 2 1efd6: 62 e0 ldi r22, 0x02 ; 2 1efd8: 8e e0 ldi r24, 0x0E ; 14 1efda: 0e 94 34 db call 0x1b668 ; 0x1b668 1efde: f8 2e mov r15, r24 if (bres) 1efe0: ee 20 and r14, r14 1efe2: 09 f4 brne .+2 ; 0x1efe6 1efe4: 00 cf rjmp .-512 ; 0x1ede6 1efe6: 61 e0 ldi r22, 0x01 ; 1 1efe8: 88 ef ldi r24, 0xF8 ; 248 1efea: 9e e0 ldi r25, 0x0E ; 14 1efec: 0f 94 34 dc call 0x3b868 ; 0x3b868 } #endif //TMC2130 if (_result) { _progress = lcd_selftest_screen(TestScreen::Bed, _progress, 3, true, 2000); 1eff0: 00 ed ldi r16, 0xD0 ; 208 1eff2: 17 e0 ldi r17, 0x07 ; 7 1eff4: 21 e0 ldi r18, 0x01 ; 1 1eff6: 43 e0 ldi r20, 0x03 ; 3 1eff8: 6f 2d mov r22, r15 1effa: 87 e0 ldi r24, 0x07 ; 7 1effc: 0e 94 34 db call 0x1b668 ; 0x1b668 1f000: f8 2e mov r15, r24 _result = lcd_selfcheck_check_heater(true); 1f002: 81 e0 ldi r24, 0x01 ; 1 1f004: 0e 94 ce dc call 0x1b99c ; 0x1b99c } if (_result) 1f008: 88 23 and r24, r24 1f00a: 09 f4 brne .+2 ; 0x1f00e 1f00c: ec ce rjmp .-552 ; 0x1ede6 { _progress = lcd_selftest_screen(TestScreen::Hotend, _progress, 3, true, 1000); 1f00e: 08 ee ldi r16, 0xE8 ; 232 1f010: 13 e0 ldi r17, 0x03 ; 3 1f012: 21 e0 ldi r18, 0x01 ; 1 1f014: 43 e0 ldi r20, 0x03 ; 3 1f016: 6f 2d mov r22, r15 1f018: 88 e0 ldi r24, 0x08 ; 8 1f01a: 0e 94 34 db call 0x1b668 ; 0x1b668 1f01e: f8 2e mov r15, r24 _result = lcd_selfcheck_check_heater(false); 1f020: 80 e0 ldi r24, 0x00 ; 0 1f022: 0e 94 ce dc call 0x1b99c ; 0x1b99c 1f026: e8 2e mov r14, r24 } if (_result) 1f028: 88 23 and r24, r24 1f02a: 09 f4 brne .+2 ; 0x1f02e 1f02c: dc ce rjmp .-584 ; 0x1ede6 { _progress = lcd_selftest_screen(TestScreen::HotendOk, _progress, 3, true, 2000); //nozzle ok 1f02e: 00 ed ldi r16, 0xD0 ; 208 1f030: 17 e0 ldi r17, 0x07 ; 7 1f032: 21 e0 ldi r18, 0x01 ; 1 1f034: 43 e0 ldi r20, 0x03 ; 3 1f036: 6f 2d mov r22, r15 1f038: 89 e0 ldi r24, 0x09 ; 9 1f03a: 0e 94 34 db call 0x1b668 ; 0x1b668 } } 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 1f03e: 21 e0 ldi r18, 0x01 ; 1 1f040: 43 e0 ldi r20, 0x03 ; 3 1f042: 68 2f mov r22, r24 1f044: 8a e0 ldi r24, 0x0A ; 10 1f046: 0e 94 34 db call 0x1b668 ; 0x1b668 1f04a: f8 2e mov r15, r24 #ifdef FILAMENT_SENSOR #if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 static bool lcd_selftest_fsensor(void) { fsensor.init(); 1f04c: 0f 94 30 7c call 0x2f860 ; 0x2f860 if (fsensor.isError()) 1f050: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1f054: 83 30 cpi r24, 0x03 ; 3 1f056: 29 f4 brne .+10 ; 0x1f062 { lcd_selftest_error(TestError::WiringFsensor, "", ""); 1f058: 66 ef ldi r22, 0xF6 ; 246 1f05a: 72 e0 ldi r23, 0x02 ; 2 1f05c: 8a e0 ldi r24, 0x0A ; 10 1f05e: 0f 94 62 9f call 0x33ec4 ; 0x33ec4 #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) 1f062: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 1f066: 83 30 cpi r24, 0x03 ; 3 1f068: 09 f4 brne .+2 ; 0x1f06c 1f06a: bd ce rjmp .-646 ; 0x1ede6 { _progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK 1f06c: 00 ed ldi r16, 0xD0 ; 208 1f06e: 17 e0 ldi r17, 0x07 ; 7 1f070: 21 e0 ldi r18, 0x01 ; 1 1f072: 43 e0 ldi r20, 0x03 ; 3 1f074: 6f 2d mov r22, r15 1f076: 8b e0 ldi r24, 0x0B ; 11 1f078: 0e 94 34 db call 0x1b668 ; 0x1b668 } } #endif //FILAMENT_SENSOR if (_result) { _progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct 1f07c: 08 e8 ldi r16, 0x88 ; 136 1f07e: 13 e1 ldi r17, 0x13 ; 19 1f080: 21 e0 ldi r18, 0x01 ; 1 1f082: 43 e0 ldi r20, 0x03 ; 3 1f084: 68 2f mov r22, r24 1f086: 8c e0 ldi r24, 0x0C ; 12 1f088: 0e 94 34 db call 0x1b668 ; 0x1b668 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1f08c: 10 92 d3 03 sts 0x03D3, r1 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> else { _progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000); } lcd_reset_alert_level(); enquecommand_P(MSG_M84); 1f090: 61 e0 ldi r22, 0x01 ; 1 1f092: 8c ed ldi r24, 0xDC ; 220 1f094: 9a e6 ldi r25, 0x6A ; 106 1f096: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_update_enable(true); 1f09a: 81 e0 ldi r24, 0x01 ; 1 1f09c: 0e 94 bd 6e call 0xdd7a ; 0xdd7a if (_result) 1f0a0: ee 20 and r14, r14 1f0a2: 71 f1 breq .+92 ; 0x1f100 { calibration_status_set(CALIBRATION_STATUS_SELFTEST); 1f0a4: 81 e0 ldi r24, 0x01 ; 1 1f0a6: 0e 94 4b ef call 0x1de96 ; 0x1de96 lcd_setstatuspgm(_T(MSG_SELFTEST_OK)); 1f0aa: 87 e6 ldi r24, 0x67 ; 103 1f0ac: 98 e4 ldi r25, 0x48 ; 72 1f0ae: 0e 94 44 72 call 0xe488 ; 0xe488 1f0b2: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_return_to_status(); 1f0b6: 0f 94 82 1f call 0x23f04 ; 0x23f04 else { LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); } #ifdef TMC2130 FORCE_HIGH_POWER_END; 1f0ba: 80 e0 ldi r24, 0x00 ; 0 1f0bc: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif // TMC2130 FORCE_BL_ON_END; 1f0c0: 80 e0 ldi r24, 0x00 ; 0 1f0c2: 0e 94 e9 89 call 0x113d2 ; 0x113d2 KEEPALIVE_STATE(NOT_BUSY); 1f0c6: 81 e0 ldi r24, 0x01 ; 1 1f0c8: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be return(_result); } 1f0cc: 8e 2d mov r24, r14 1f0ce: 0f 90 pop r0 1f0d0: 0f 90 pop r0 1f0d2: 0f 90 pop r0 1f0d4: 0f 90 pop r0 1f0d6: df 91 pop r29 1f0d8: cf 91 pop r28 1f0da: 1f 91 pop r17 1f0dc: 0f 91 pop r16 1f0de: ff 90 pop r15 1f0e0: ef 90 pop r14 1f0e2: df 90 pop r13 1f0e4: cf 90 pop r12 1f0e6: 08 95 ret if (_swapped_fan) { //turn on print fan and check that left hotend fan is not spinning _result = lcd_selftest_manual_fan_check(1, true); if (_result) { //print fan is stil turned on; check that it is spinning _result = lcd_selftest_manual_fan_check(1, false, true); 1f0e8: 61 e0 ldi r22, 0x01 ; 1 1f0ea: 80 e0 ldi r24, 0x00 ; 0 1f0ec: 0f 94 4f a0 call 0x3409e ; 0x3409e if (!_result){ 1f0f0: 81 11 cpse r24, r1 1f0f2: 9a ce rjmp .-716 ; 0x1ee28 lcd_selftest_error(TestError::PrintFan, "", ""); 1f0f4: 66 ef ldi r22, 0xF6 ; 246 1f0f6: 72 e0 ldi r23, 0x02 ; 2 1f0f8: 85 e0 ldi r24, 0x05 ; 5 1f0fa: 82 ce rjmp .-764 ; 0x1ee00 #endif //not defined TMC2130 static bool lcd_selfcheck_endstops() { bool _result = true; 1f0fc: 11 e0 ldi r17, 0x01 ; 1 1f0fe: d4 ce rjmp .-600 ; 0x1eea8 lcd_setstatuspgm(_T(MSG_SELFTEST_OK)); lcd_return_to_status(); } else { LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); 1f100: 8f e1 ldi r24, 0x1F ; 31 1f102: 96 e5 ldi r25, 0x56 ; 86 1f104: 0e 94 44 72 call 0xe488 ; 0xe488 1f108: 62 e0 ldi r22, 0x02 ; 2 1f10a: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac 1f10e: d5 cf rjmp .-86 ; 0x1f0ba 0001f110 : } #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) static void lcd_selftest_v() { (void)lcd_selftest(); 1f110: 0c 94 19 f6 jmp 0x1ec32 ; 0x1ec32 0001f114 : return 0; } bool resume_print_checks() { // reset the lcd status so that a newer error will be shown lcd_return_to_status(); 1f114: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1f118: 10 92 d3 03 sts 0x03D3, r1 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; 1f11c: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 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() 1f120: 81 11 cpse r24, r1 1f122: 32 c0 rjmp .+100 ; 0x1f188 } static bool fan_error_selftest() { #ifdef FANCHECK if (!fans_check_enabled) return 0; 1f124: 80 91 38 02 lds r24, 0x0238 ; 0x800238 1f128: 81 11 cpse r24, r1 1f12a: 02 c0 rjmp .+4 ; 0x1f130 #endif ) { return false; // abort if error persists } return true; 1f12c: 81 e0 ldi r24, 0x01 ; 1 1f12e: 08 95 ret static bool fan_error_selftest() { #ifdef FANCHECK if (!fans_check_enabled) return 0; lcd_selftest_setfan(255); 1f130: 8f ef ldi r24, 0xFF ; 255 1f132: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 setExtruderAutoFanState(3); //force enables the hotend fan 1f136: 83 e0 ldi r24, 0x03 ; 3 1f138: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 #ifdef FAN_SOFT_PWM extruder_autofan_last_check = _millis(); 1f13c: 0f 94 28 2a call 0x25450 ; 0x25450 1f140: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf 1f144: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 1f148: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 1f14c: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 fan_measuring = true; 1f150: 81 e0 ldi r24, 0x01 ; 1 1f152: 80 93 6e 06 sts 0x066E, r24 ; 0x80066e #endif //FAN_SOFT_PWM _delay(1000); //delay_keep_alive would turn off hotend fan, because temerature is too low (maybe) 1f156: 68 ee ldi r22, 0xE8 ; 232 1f158: 73 e0 ldi r23, 0x03 ; 3 1f15a: 80 e0 ldi r24, 0x00 ; 0 1f15c: 90 e0 ldi r25, 0x00 ; 0 1f15e: 0f 94 2f 28 call 0x2505e ; 0x2505e manage_heater(); 1f162: 0f 94 34 39 call 0x27268 ; 0x27268 setExtruderAutoFanState(1); //releases lock on the hotend fan 1f166: 81 e0 ldi r24, 0x01 ; 1 1f168: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 lcd_selftest_setfan(0); 1f16c: 80 e0 ldi r24, 0x00 ; 0 1f16e: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 #ifdef TACH_0 if (fan_speed[0] <= 20) { //hotend fan error 1f172: 80 91 c7 03 lds r24, 0x03C7 ; 0x8003c7 1f176: 90 91 c8 03 lds r25, 0x03C8 ; 0x8003c8 1f17a: 45 97 sbiw r24, 0x15 ; 21 1f17c: 3c f4 brge .+14 ; 0x1f18c LCD_ALERTMESSAGERPGM(MSG_FANCHECK_HOTEND); 1f17e: 62 e0 ldi r22, 0x02 ; 2 1f180: 84 e7 ldi r24, 0x74 ; 116 1f182: 9a e6 ldi r25, 0x6A ; 106 return 1; } #endif #ifdef TACH_1 if (fan_speed[1] <= 20) { //print fan error LCD_ALERTMESSAGERPGM(MSG_FANCHECK_PRINT); 1f184: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac if (get_temp_error() #ifdef FANCHECK || fan_error_selftest() #endif ) { return false; // abort if error persists 1f188: 80 e0 ldi r24, 0x00 ; 0 } return true; } 1f18a: 08 95 ret LCD_ALERTMESSAGERPGM(MSG_FANCHECK_HOTEND); return 1; } #endif #ifdef TACH_1 if (fan_speed[1] <= 20) { //print fan error 1f18c: 80 91 c9 03 lds r24, 0x03C9 ; 0x8003c9 1f190: 90 91 ca 03 lds r25, 0x03CA ; 0x8003ca 1f194: 45 97 sbiw r24, 0x15 ; 21 1f196: 54 f6 brge .-108 ; 0x1f12c LCD_ALERTMESSAGERPGM(MSG_FANCHECK_PRINT); 1f198: 62 e0 ldi r22, 0x02 ; 2 1f19a: 80 e6 ldi r24, 0x60 ; 96 1f19c: 9a e6 ldi r25, 0x6A ; 106 1f19e: f2 cf rjmp .-28 ; 0x1f184 0001f1a0 : //! @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; 1f1a0: 0e 94 8a f8 call 0x1f114 ; 0x1f114 1f1a4: 88 23 and r24, r24 1f1a6: 51 f1 breq .+84 ; 0x1f1fc cmdqueue_serial_disabled = false; 1f1a8: 10 92 a4 03 sts 0x03A4, r1 ; 0x8003a4 lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); 1f1ac: 83 ed ldi r24, 0xD3 ; 211 1f1ae: 92 e5 ldi r25, 0x52 ; 82 1f1b0: 0e 94 44 72 call 0xe488 ; 0xe488 1f1b4: 0e 94 16 f2 call 0x1e42c ; 0x1e42c st_synchronize(); 1f1b8: 0f 94 a9 43 call 0x28752 ; 0x28752 custom_message_type = CustomMsg::Resuming; 1f1bc: 88 e0 ldi r24, 0x08 ; 8 1f1be: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 { #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(); 1f1c2: 0e 94 79 74 call 0xe8f2 ; 0xe8f2 setExtruderAutoFanState(1); 1f1c6: 81 e0 ldi r24, 0x01 ; 1 1f1c8: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 // resume processing USB commands again and restore hotend fan state (in case the print was // stopped due to a thermal error) hotendDefaultAutoFanState(); Stopped = false; 1f1cc: 10 92 10 05 sts 0x0510, r1 ; 0x800510 restore_print_from_ram_and_continue(default_retraction); 1f1d0: 60 e0 ldi r22, 0x00 ; 0 1f1d2: 70 e0 ldi r23, 0x00 ; 0 1f1d4: 80 e8 ldi r24, 0x80 ; 128 1f1d6: 9f e3 ldi r25, 0x3F ; 63 1f1d8: 0e 94 dc 67 call 0xcfb8 ; 0xcfb8 did_pause_print = false; 1f1dc: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 // Resume the print job timer if it was running if (print_job_timer.isPaused()) print_job_timer.start(); 1f1e0: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 1f1e4: 82 30 cpi r24, 0x02 ; 2 1f1e6: 11 f4 brne .+4 ; 0x1f1ec 1f1e8: 0f 94 4e 43 call 0x2869c ; 0x2869c refresh_cmd_timeout(); 1f1ec: 0e 94 5b 66 call 0xccb6 ; 0xccb6 SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_RESUMED); 1f1f0: 89 e8 ldi r24, 0x89 ; 137 1f1f2: 9a e6 ldi r25, 0x6A ; 106 1f1f4: 0e 94 13 79 call 0xf226 ; 0xf226 custom_message_type = CustomMsg::Status; 1f1f8: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 } 1f1fc: 08 95 ret 0001f1fe : //! @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; 1f1fe: 0e 94 8a f8 call 0x1f114 ; 0x1f114 1f202: 88 23 and r24, r24 1f204: 21 f0 breq .+8 ; 0x1f20e // resume the usb host SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_RESUME); 1f206: 8a e9 ldi r24, 0x9A ; 154 1f208: 9a e6 ldi r25, 0x6A ; 106 1f20a: 0c 94 13 79 jmp 0xf226 ; 0xf226 } 1f20e: 08 95 ret 0001f210 : } /// @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) { 1f210: cf 92 push r12 1f212: df 92 push r13 1f214: ef 92 push r14 1f216: ff 92 push r15 1f218: cf 93 push r28 1f21a: 6b 01 movw r12, r22 1f21c: 7c 01 movw r14, r24 custom_message_type = CustomMsg::FilamentLoading; 1f21e: 82 e0 ldi r24, 0x02 ; 2 1f220: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT)); 1f224: 86 e7 ldi r24, 0x76 ; 118 1f226: 92 e5 ldi r25, 0x52 ; 82 1f228: 0e 94 44 72 call 0xe488 ; 0xe488 1f22c: 0e 94 16 f2 call 0x1e42c ; 0x1e42c FSensorBlockRunout fsBlockRunout; 1f230: 0f 94 a5 87 call 0x30f4a ; 0x30f4a current_position[E_AXIS] -= FILAMENT_UNLOAD_FAST_RETRACT_LENGTH; 1f234: 20 e0 ldi r18, 0x00 ; 0 1f236: 30 e0 ldi r19, 0x00 ; 0 1f238: 44 e3 ldi r20, 0x34 ; 52 1f23a: 52 e4 ldi r21, 0x42 ; 66 1f23c: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 1f240: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 1f244: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 1f248: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 1f24c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1f250: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 1f254: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 1f258: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 1f25c: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_FAST_RETRACT_FEEDRATE); 1f260: 6a e0 ldi r22, 0x0A ; 10 1f262: 77 e5 ldi r23, 0x57 ; 87 1f264: 8d ea ldi r24, 0xAD ; 173 1f266: 92 e4 ldi r25, 0x42 ; 66 1f268: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1f26c: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[E_AXIS] -= FILAMENT_UNLOAD_SLOW_RETRACT_LENGTH; 1f270: 20 e0 ldi r18, 0x00 ; 0 1f272: 30 e0 ldi r19, 0x00 ; 0 1f274: 4c e0 ldi r20, 0x0C ; 12 1f276: 52 e4 ldi r21, 0x42 ; 66 1f278: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 1f27c: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 1f280: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 1f284: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 1f288: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 1f28c: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 1f290: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 1f294: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 1f298: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_SLOW_RETRACT_FEEDRATE); 1f29c: 69 e2 ldi r22, 0x29 ; 41 1f29e: 7c e5 ldi r23, 0x5C ; 92 1f2a0: 85 e8 ldi r24, 0x85 ; 133 1f2a2: 91 e4 ldi r25, 0x41 ; 65 1f2a4: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1f2a8: 0f 94 a9 43 call 0x28752 ; 0x28752 // Configurable length, by default it's 0. // only plan the move if the length is set to a non-zero value if (unloadLength) 1f2ac: 20 e0 ldi r18, 0x00 ; 0 1f2ae: 30 e0 ldi r19, 0x00 ; 0 1f2b0: a9 01 movw r20, r18 1f2b2: c7 01 movw r24, r14 1f2b4: b6 01 movw r22, r12 1f2b6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1f2ba: 88 23 and r24, r24 1f2bc: e1 f0 breq .+56 ; 0x1f2f6 { current_position[E_AXIS] += unloadLength; 1f2be: a7 01 movw r20, r14 1f2c0: 96 01 movw r18, r12 1f2c2: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 1f2c6: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 1f2ca: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 1f2ce: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 1f2d2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 1f2d6: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 1f2da: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 1f2de: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 1f2e2: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(FILAMENT_CHANGE_UNLOAD_FEEDRATE); 1f2e6: 60 e0 ldi r22, 0x00 ; 0 1f2e8: 70 e0 ldi r23, 0x00 ; 0 1f2ea: 80 e2 ldi r24, 0x20 ; 32 1f2ec: 91 e4 ldi r25, 0x41 ; 65 1f2ee: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 1f2f2: 0f 94 a9 43 call 0x28752 ; 0x28752 } lcd_display_message_fullscreen_P(_T(MSG_PULL_OUT_FILAMENT)); 1f2f6: 88 e7 ldi r24, 0x78 ; 120 1f2f8: 95 e4 ldi r25, 0x45 ; 69 1f2fa: 0e 94 44 72 call 0xe488 ; 0xe488 1f2fe: 0f 94 c0 20 call 0x24180 ; 0x24180 //disable extruder steppers so filament can be removed disable_e0(); 1f302: 14 9a sbi 0x02, 4 ; 2 _delay(100); 1f304: 64 e6 ldi r22, 0x64 ; 100 1f306: 70 e0 ldi r23, 0x00 ; 0 1f308: 80 e0 ldi r24, 0x00 ; 0 1f30a: 90 e0 ldi r25, 0x00 ; 0 1f30c: 0f 94 2f 28 call 0x2505e ; 0x2505e Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); 1f310: 82 e0 ldi r24, 0x02 ; 2 1f312: 0f 94 c8 4e call 0x29d90 ; 0x29d90 1f316: c3 e3 ldi r28, 0x33 ; 51 uint8_t counterBeep = 0; while (!lcd_clicked() && (counterBeep < 50)) { 1f318: 0e 94 95 70 call 0xe12a ; 0xe12a 1f31c: 81 11 cpse r24, r1 1f31e: 07 c0 rjmp .+14 ; 0x1f32e 1f320: c1 50 subi r28, 0x01 ; 1 1f322: 29 f0 breq .+10 ; 0x1f32e delay_keep_alive(100); 1f324: 84 e6 ldi r24, 0x64 ; 100 1f326: 90 e0 ldi r25, 0x00 ; 0 1f328: 0e 94 84 8c call 0x11908 ; 0x11908 1f32c: f5 cf rjmp .-22 ; 0x1f318 counterBeep++; } st_synchronize(); 1f32e: 0f 94 a9 43 call 0x28752 ; 0x28752 while (lcd_clicked()) delay_keep_alive(100); 1f332: 0e 94 95 70 call 0xe12a ; 0xe12a 1f336: 88 23 and r24, r24 1f338: 29 f0 breq .+10 ; 0x1f344 1f33a: 84 e6 ldi r24, 0x64 ; 100 1f33c: 90 e0 ldi r25, 0x00 ; 0 1f33e: 0e 94 84 8c call 0x11908 ; 0x11908 1f342: f7 cf rjmp .-18 ; 0x1f332 lcd_update_enable(true); 1f344: 81 e0 ldi r24, 0x01 ; 1 1f346: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_setstatuspgm(MSG_WELCOME); 1f34a: 82 e1 ldi r24, 0x12 ; 18 1f34c: 90 e7 ldi r25, 0x70 ; 112 1f34e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = CustomMsg::Status; 1f352: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 clearFilamentAction(); 1f356: 0f 94 6f 21 call 0x242de ; 0x242de } 1f35a: cf 91 pop r28 1f35c: ff 90 pop r15 1f35e: ef 90 pop r14 1f360: df 90 pop r13 1f362: cf 90 pop r12 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 1f364: 0d 94 e9 7b jmp 0x2f7d2 ; 0x2f7d2 0001f368 : //! ---------------------- | ---------------- //! 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) { 1f368: af 92 push r10 1f36a: bf 92 push r11 1f36c: cf 92 push r12 1f36e: df 92 push r13 1f370: ef 92 push r14 1f372: ff 92 push r15 1f374: 0f 93 push r16 1f376: 1f 93 push r17 1f378: cf 93 push r28 1f37a: 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); 1f37c: 88 23 and r24, r24 1f37e: 29 f0 breq .+10 ; 0x1f38a 1f380: 61 e0 ldi r22, 0x01 ; 1 1f382: 8f e5 ldi r24, 0x5F ; 95 1f384: 9f e0 ldi r25, 0x0F ; 15 1f386: 0f 94 34 dc call 0x3b868 ; 0x3b868 FORCE_BL_ON_START; 1f38a: 81 e0 ldi r24, 0x01 ; 1 1f38c: 0e 94 e9 89 call 0x113d2 ; 0x113d2 while (!end) { printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state); 1f390: 83 e4 ldi r24, 0x43 ; 67 1f392: e8 2e mov r14, r24 1f394: 89 e8 ldi r24, 0x89 ; 137 1f396: 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; 1f398: 97 ed ldi r25, 0xD7 ; 215 1f39a: c9 2e mov r12, r25 1f39c: d1 2c mov r13, r1 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 1f39e: 2c e3 ldi r18, 0x3C ; 60 1f3a0: a2 2e mov r10, r18 1f3a2: b1 2c mov r11, r1 1f3a4: 0c 2f mov r16, r28 1f3a6: 10 e0 ldi r17, 0x00 ; 0 1f3a8: 1f 92 push r1 1f3aa: cf 93 push r28 1f3ac: ff 92 push r15 1f3ae: ef 92 push r14 1f3b0: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 switch (state) { 1f3b4: 0f 90 pop r0 1f3b6: 0f 90 pop r0 1f3b8: 0f 90 pop r0 1f3ba: 0f 90 pop r0 1f3bc: cf 30 cpi r28, 0x0F ; 15 1f3be: a0 f7 brcc .-24 ; 0x1f3a8 1f3c0: f8 01 movw r30, r16 1f3c2: 88 27 eor r24, r24 1f3c4: e9 51 subi r30, 0x19 ; 25 1f3c6: f6 40 sbci r31, 0x06 ; 6 1f3c8: 8f 4f sbci r24, 0xFF ; 255 1f3ca: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 1f3ce: f6 f9 bld r31, 6 1f3d0: 46 fa bst r4, 6 1f3d2: 6c fa .word 0xfa6c ; ???? 1f3d4: 78 fa .word 0xfa78 ; ???? 1f3d6: 82 fa bst r8, 2 1f3d8: bc fa .word 0xfabc ; ???? 1f3da: c8 fa .word 0xfac8 ; ???? 1f3dc: e2 fa bst r14, 2 1f3de: f9 fa .word 0xfaf9 ; ???? 1f3e0: f3 fa bst r15, 3 1f3e2: fd fa .word 0xfafd ; ???? 1f3e4: 0b fb .word 0xfb0b ; ???? 1f3e6: 14 fb bst r17, 4 1f3e8: 28 fb .word 0xfb28 ; ???? 1f3ea: 28 fb .word 0xfb28 ; ???? // 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; 1f3ec: 10 92 a8 0d sts 0x0DA8, r1 ; 0x800da8 if( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){ 1f3f0: 8f e5 ldi r24, 0x5F ; 95 1f3f2: 9f e0 ldi r25, 0x0F ; 15 1f3f4: 0f 94 10 dc call 0x3b820 ; 0x3b820 1f3f8: 82 30 cpi r24, 0x02 ; 2 1f3fa: 39 f4 brne .+14 ; 0x1f40a // printer pre-assembled: finish remaining steps lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING)); 1f3fc: 87 e4 ldi r24, 0x47 ; 71 1f3fe: 92 e4 ldi r25, 0x42 ; 66 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)); 1f400: 0e 94 44 72 call 0xe488 ; 0xe488 1f404: 0f 94 cd 20 call 0x2419a ; 0x2419a 1f408: 0f c0 rjmp .+30 ; 0x1f428 // 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); 1f40a: 82 ee ldi r24, 0xE2 ; 226 1f40c: 91 e4 ldi r25, 0x41 ; 65 1f40e: 0e 94 44 72 call 0xe488 ; 0xe488 1f412: 40 e0 ldi r20, 0x00 ; 0 1f414: 60 e0 ldi r22, 0x00 ; 0 1f416: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { 1f41a: 81 11 cpse r24, r1 1f41c: 07 c0 rjmp .+14 ; 0x1f42c 1f41e: 61 e0 ldi r22, 0x01 ; 1 1f420: 8f e5 ldi r24, 0x5F ; 95 1f422: 9f e0 ldi r25, 0x0F ; 15 1f424: 0f 94 34 dc call 0x3b868 ; 0x3b868 state = S::Lay1CalCold; } else { lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS)); state = S::Restore; 1f428: c1 e0 ldi r28, 0x01 ; 1 1f42a: bc cf rjmp .-136 ; 0x1f3a4 1f42c: 60 e0 ldi r22, 0x00 ; 0 1f42e: 8f e5 ldi r24, 0x5F ; 95 1f430: 9f e0 ldi r25, 0x0F ; 15 1f432: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); 1f436: 10 e0 ldi r17, 0x00 ; 0 1f438: 00 e0 ldi r16, 0x00 ; 0 end = true; break; } } FORCE_BL_ON_END; 1f43a: 80 e0 ldi r24, 0x00 ; 0 1f43c: 0e 94 e9 89 call 0x113d2 ; 0x113d2 const char *msg = NULL; printf_P(_N("Wizard end state: %d\n"), (uint8_t)state); 1f440: 1f 93 push r17 1f442: 0f 93 push r16 1f444: 8e e0 ldi r24, 0x0E ; 14 1f446: 9a e6 ldi r25, 0x6A ; 106 1f448: 9f 93 push r25 1f44a: 8f 93 push r24 1f44c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 switch (state) { 1f450: 0f 90 pop r0 1f452: 0f 90 pop r0 1f454: 0f 90 pop r0 1f456: 0f 90 pop r0 1f458: cd 30 cpi r28, 0x0D ; 13 1f45a: 09 f4 brne .+2 ; 0x1f45e 1f45c: ff c0 rjmp .+510 ; 0x1f65c 1f45e: ce 30 cpi r28, 0x0E ; 14 1f460: 09 f4 brne .+2 ; 0x1f464 1f462: 11 c1 rjmp .+546 ; 0x1f686 case S::Run: // user interrupted msg = _T(MSG_WIZARD_QUIT); 1f464: 81 e0 ldi r24, 0x01 ; 1 1f466: 9f e3 ldi r25, 0x3F ; 63 FORCE_BL_ON_END; const char *msg = NULL; printf_P(_N("Wizard end state: %d\n"), (uint8_t)state); switch (state) { 1f468: cc 23 and r28, r28 1f46a: 09 f4 brne .+2 ; 0x1f46e 1f46c: 0e c1 rjmp .+540 ; 0x1f68a break; } if (msg) { lcd_show_fullscreen_message_and_wait_P(msg); } lcd_update_enable(true); 1f46e: 81 e0 ldi r24, 0x01 ; 1 1f470: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 1f474: 82 e0 ldi r24, 0x02 ; 2 } 1f476: cf 91 pop r28 1f478: 1f 91 pop r17 1f47a: 0f 91 pop r16 1f47c: ff 90 pop r15 1f47e: ef 90 pop r14 1f480: df 90 pop r13 1f482: cf 90 pop r12 1f484: bf 90 pop r11 1f486: af 90 pop r10 } if (msg) { lcd_show_fullscreen_message_and_wait_P(msg); } lcd_update_enable(true); lcd_update(2); 1f488: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1f48c: 10 92 d3 03 sts 0x03D3, r1 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 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)) { 1f490: 81 e0 ldi r24, 0x01 ; 1 1f492: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 state = S::Selftest; 1f496: 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)) { 1f498: 88 23 and r24, r24 1f49a: 09 f4 brne .+2 ; 0x1f49e 1f49c: 83 cf rjmp .-250 ; 0x1f3a4 state = S::Selftest; } else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) { 1f49e: 82 e0 ldi r24, 0x02 ; 2 1f4a0: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 // S::Xyz *includes* S::Z so it needs to come before // to avoid repeating Z alignment state = S::Xyz; 1f4a4: 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)) { 1f4a6: 88 23 and r24, r24 1f4a8: 09 f4 brne .+2 ; 0x1f4ac 1f4aa: 7c cf rjmp .-264 ; 0x1f3a4 // 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)) { 1f4ac: 84 e0 ldi r24, 0x04 ; 4 1f4ae: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 state = S::Z; 1f4b2: 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)) { 1f4b4: 88 23 and r24, r24 1f4b6: 09 f4 brne .+2 ; 0x1f4ba 1f4b8: 75 cf rjmp .-278 ; 0x1f3a4 state = S::Z; #ifdef THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) { 1f4ba: 88 e0 ldi r24, 0x08 ; 8 1f4bc: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 state = S::ThermalModel; 1f4c0: c5 e0 ldi r28, 0x05 ; 5 // to avoid repeating Z alignment state = S::Xyz; } else if (!calibration_status_get(CALIBRATION_STATUS_Z)) { state = S::Z; #ifdef THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) { 1f4c2: 88 23 and r24, r24 1f4c4: 09 f4 brne .+2 ; 0x1f4c8 1f4c6: 6e cf rjmp .-292 ; 0x1f3a4 state = S::ThermalModel; #endif //THERMAL_MODEL } else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) { 1f4c8: 80 e1 ldi r24, 0x10 ; 16 1f4ca: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 state = S::IsFil; } else { // all required steps completed, finish successfully state = S::Finish; 1f4ce: cd e0 ldi r28, 0x0D ; 13 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)) { 1f4d0: 81 11 cpse r24, r1 1f4d2: 68 cf rjmp .-304 ; 0x1f3a4 state = S::IsFil; 1f4d4: c6 e0 ldi r28, 0x06 ; 6 1f4d6: 66 cf rjmp .-308 ; 0x1f3a4 // all required steps completed, finish successfully state = S::Finish; } break; case S::Selftest: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_SELFTEST)); 1f4d8: 89 e9 ldi r24, 0x99 ; 153 1f4da: 91 e4 ldi r25, 0x41 ; 65 1f4dc: 0e 94 44 72 call 0xe488 ; 0xe488 1f4e0: 0f 94 cd 20 call 0x2419a ; 0x2419a wizard_event = lcd_selftest(); 1f4e4: 0e 94 19 f6 call 0x1ec32 ; 0x1ec32 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); 1f4e8: 81 11 cpse r24, r1 1f4ea: 9e cf rjmp .-196 ; 0x1f428 } 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); 1f4ec: ce e0 ldi r28, 0x0E ; 14 1f4ee: 5a cf rjmp .-332 ; 0x1f3a4 break; case S::Xyz: lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_XYZ_CAL)); 1f4f0: 8b e5 ldi r24, 0x5B ; 91 1f4f2: 91 e4 ldi r25, 0x41 ; 65 1f4f4: 0e 94 44 72 call 0xe488 ; 0xe488 1f4f8: 0f 94 cd 20 call 0x2419a ; 0x2419a wizard_event = gcode_M45(false, 0); 1f4fc: 80 e0 ldi r24, 0x00 ; 0 1f4fe: 0f 94 99 8d call 0x31b32 ; 0x31b32 1f502: f2 cf rjmp .-28 ; 0x1f4e8 state = (wizard_event ? S::Restore : S::Failed); break; case S::Z: lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_SHIPPING_HELPERS)); 1f504: 83 e3 ldi r24, 0x33 ; 51 1f506: 91 e4 ldi r25, 0x41 ; 65 1f508: 0e 94 44 72 call 0xe488 ; 0xe488 1f50c: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_TEST_PRINT)); 1f510: 85 e0 ldi r24, 0x05 ; 5 1f512: 91 e4 ldi r25, 0x41 ; 65 1f514: 0e 94 44 72 call 0xe488 ; 0xe488 1f518: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_Z_CAL)); 1f51c: 85 ee ldi r24, 0xE5 ; 229 1f51e: 90 e4 ldi r25, 0x40 ; 64 1f520: 0e 94 44 72 call 0xe488 ; 0xe488 1f524: 0f 94 cd 20 call 0x2419a ; 0x2419a wizard_event = gcode_M45(true, 0); 1f528: 81 e0 ldi r24, 0x01 ; 1 1f52a: 0f 94 99 8d call 0x31b32 ; 0x31b32 if (!wizard_event) { 1f52e: 88 23 and r24, r24 1f530: e9 f2 breq .-70 ; 0x1f4ec state = S::Failed; } else { raise_z_above(MIN_Z_FOR_SWAP); 1f532: 60 e0 ldi r22, 0x00 ; 0 1f534: 70 e0 ldi r23, 0x00 ; 0 1f536: 88 ed ldi r24, 0xD8 ; 216 1f538: 91 e4 ldi r25, 0x41 ; 65 1f53a: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 if(!MMU2::mmu2.Enabled()) { 1f53e: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 1f542: 81 30 cpi r24, 0x01 ; 1 1f544: 09 f4 brne .+2 ; 0x1f548 1f546: 70 cf rjmp .-288 ; 0x1f428 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 1f548: d0 92 b6 0d sts 0x0DB6, r13 ; 0x800db6 1f54c: c0 92 b5 0d sts 0x0DB5, r12 ; 0x800db5 //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)); 1f550: 80 ec ldi r24, 0xC0 ; 192 1f552: 90 e4 ldi r25, 0x40 ; 64 1f554: 0e 94 44 72 call 0xe488 ; 0xe488 1f558: 0f 94 c0 20 call 0x24180 ; 0x24180 wait_preheat(); 1f55c: 0e 94 10 e3 call 0x1c620 ; 0x1c620 unload_filament(FILAMENTCHANGE_FINALRETRACT); // unload current filament 1f560: 60 e0 ldi r22, 0x00 ; 0 1f562: 70 e0 ldi r23, 0x00 ; 0 1f564: cb 01 movw r24, r22 1f566: 0e 94 08 f9 call 0x1f210 ; 0x1f210 lcd_wizard_load(); // load filament 1f56a: 0e 94 d2 cf call 0x19fa4 ; 0x19fa4 1f56e: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 1f572: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 1f576: 58 cf rjmp .-336 ; 0x1f428 state = S::Restore; } break; #ifdef THERMAL_MODEL case S::ThermalModel: lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_CAL)); 1f578: 80 e8 ldi r24, 0x80 ; 128 1f57a: 90 e4 ldi r25, 0x40 ; 64 1f57c: 0e 94 44 72 call 0xe488 ; 0xe488 1f580: 0f 94 cd 20 call 0x2419a ; 0x2419a lcd_commands_type = LcdCommands::ThermalModel; 1f584: 85 e0 ldi r24, 0x05 ; 5 1f586: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 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); 1f58a: 05 e0 ldi r16, 0x05 ; 5 1f58c: 10 e0 ldi r17, 0x00 ; 0 1f58e: 55 cf rjmp .-342 ; 0x1f43a 1f590: d0 92 b6 0d sts 0x0DB6, r13 ; 0x800db6 1f594: c0 92 b5 0d sts 0x0DB5, r12 ; 0x800db5 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 1f598: b0 92 72 06 sts 0x0672, r11 ; 0x800672 1f59c: a0 92 71 06 sts 0x0671, r10 ; 0x800671 #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); 1f5a0: 8a e6 ldi r24, 0x6A ; 106 1f5a2: 90 e4 ldi r25, 0x40 ; 64 1f5a4: 0e 94 44 72 call 0xe488 ; 0xe488 1f5a8: 41 e0 ldi r20, 0x01 ; 1 1f5aa: 60 e0 ldi r22, 0x00 ; 0 1f5ac: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { 1f5b0: 88 23 and r24, r24 1f5b2: 09 f1 breq .+66 ; 0x1f5f6 state = S::Lay1CalCold; } else { // MIDDLE_BUTTON_CHOICE if(MMU2::mmu2.Enabled()) state = S::LoadFilCold; 1f5b4: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 else state = S::Preheat; 1f5b8: c7 e0 ldi r28, 0x07 ; 7 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); if (wizard_event == LCD_LEFT_BUTTON_CHOICE) { state = S::Lay1CalCold; } else { // MIDDLE_BUTTON_CHOICE if(MMU2::mmu2.Enabled()) state = S::LoadFilCold; 1f5ba: 81 30 cpi r24, 0x01 ; 1 1f5bc: 09 f0 breq .+2 ; 0x1f5c0 1f5be: f2 ce rjmp .-540 ; 0x1f3a4 1f5c0: c8 e0 ldi r28, 0x08 ; 8 1f5c2: f0 ce rjmp .-544 ; 0x1f3a4 else state = S::Preheat; } break; case S::Preheat: menu_goto(lcd_preheat_menu, 0, true); 1f5c4: 20 e0 ldi r18, 0x00 ; 0 1f5c6: 41 e0 ldi r20, 0x01 ; 1 1f5c8: 70 e0 ldi r23, 0x00 ; 0 1f5ca: 60 e0 ldi r22, 0x00 ; 0 1f5cc: 88 e2 ldi r24, 0x28 ; 40 1f5ce: 9a e3 ldi r25, 0x3A ; 58 1f5d0: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 lcd_show_fullscreen_message_and_wait_P(_T(MSG_SEL_PREHEAT_TEMP)); 1f5d4: 89 e2 ldi r24, 0x29 ; 41 1f5d6: 90 e4 ldi r25, 0x40 ; 64 1f5d8: 0e 94 44 72 call 0xe488 ; 0xe488 1f5dc: 0f 94 cd 20 call 0x2419a ; 0x2419a 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); 1f5e0: 07 e0 ldi r16, 0x07 ; 7 1f5e2: 10 e0 ldi r17, 0x00 ; 0 1f5e4: 2a cf rjmp .-428 ; 0x1f43a 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(); 1f5e6: 0e 94 10 e3 call 0x1c620 ; 0x1c620 lcd_wizard_load(); 1f5ea: 0e 94 d2 cf call 0x19fa4 ; 0x19fa4 state = S::Lay1CalHot; 1f5ee: cb e0 ldi r28, 0x0B ; 11 1f5f0: d9 ce rjmp .-590 ; 0x1f3a4 break; case S::LoadFilCold: lcd_wizard_load(); 1f5f2: 0e 94 d2 cf call 0x19fa4 ; 0x19fa4 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; 1f5f6: ca e0 ldi r28, 0x0A ; 10 1f5f8: d5 ce rjmp .-598 ; 0x1f3a4 case S::LoadFilCold: lcd_wizard_load(); state = S::Lay1CalCold; break; case S::Lay1CalCold: wizard_lay1cal_message(true); 1f5fa: 81 e0 ldi r24, 0x01 ; 1 1f5fc: 0e 94 b4 cf call 0x19f68 ; 0x19f68 menu_goto(lcd_v2_calibration, 0, true); 1f600: 20 e0 ldi r18, 0x00 ; 0 1f602: 41 e0 ldi r20, 0x01 ; 1 1f604: 70 e0 ldi r23, 0x00 ; 0 1f606: 60 e0 ldi r22, 0x00 ; 0 1f608: 80 e9 ldi r24, 0x90 ; 144 1f60a: 95 ee ldi r25, 0xE5 ; 229 1f60c: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 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); 1f610: 0a e0 ldi r16, 0x0A ; 10 1f612: 10 e0 ldi r17, 0x00 ; 0 1f614: 12 cf rjmp .-476 ; 0x1f43a 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); 1f616: 80 e0 ldi r24, 0x00 ; 0 1f618: 0e 94 b4 cf call 0x19f68 ; 0x19f68 lcd_commands_type = LcdCommands::Layer1Cal; 1f61c: 84 e0 ldi r24, 0x04 ; 4 1f61e: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 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); 1f622: 0b e0 ldi r16, 0x0B ; 11 1f624: 10 e0 ldi r17, 0x00 ; 0 1f626: 09 cf rjmp .-494 ; 0x1f43a 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); 1f628: 86 ed ldi r24, 0xD6 ; 214 1f62a: 9f e3 ldi r25, 0x3F ; 63 1f62c: 0e 94 44 72 call 0xe488 ; 0xe488 1f630: 41 e0 ldi r20, 0x01 ; 1 1f632: 60 e0 ldi r22, 0x00 ; 0 1f634: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if (wizard_event == LCD_LEFT_BUTTON_CHOICE) 1f638: 81 11 cpse r24, r1 1f63a: 07 c0 rjmp .+14 ; 0x1f64a { lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED)); 1f63c: 86 ea ldi r24, 0xA6 ; 166 1f63e: 9f e3 ldi r25, 0x3F ; 63 1f640: 0e 94 44 72 call 0xe488 ; 0xe488 1f644: 0f 94 cd 20 call 0x2419a ; 0x2419a 1f648: d6 cf rjmp .-84 ; 0x1f5f6 state = S::Lay1CalCold; } else { lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS)); 1f64a: 80 e4 ldi r24, 0x40 ; 64 1f64c: 9f e3 ldi r25, 0x3F ; 63 1f64e: d8 ce rjmp .-592 ; 0x1f400 1f650: 60 e0 ldi r22, 0x00 ; 0 1f652: 8f e5 ldi r24, 0x5F ; 95 1f654: 9f e0 ldi r25, 0x0F ; 15 1f656: 0f 94 34 dc call 0x3b868 ; 0x3b868 1f65a: ef ce rjmp .-546 ; 0x1f43a msg = _T(MSG_WIZARD_QUIT); break; case S::Finish: // we are successfully finished msg = _T(MSG_WIZARD_DONE); 1f65c: 82 ee ldi r24, 0xE2 ; 226 1f65e: 9e e3 ldi r25, 0x3E ; 62 1f660: 0e 94 44 72 call 0xe488 ; 0xe488 1f664: 8c 01 movw r16, r24 lcd_setalertstatus_(message, severity, true); } void lcd_reset_alert_level() { lcd_status_message_level = 0; 1f666: 10 92 d3 03 sts 0x03D3, r1 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> case S::Finish: // we are successfully finished msg = _T(MSG_WIZARD_DONE); lcd_reset_alert_level(); lcd_setstatuspgm(MSG_WELCOME); 1f66a: 82 e1 ldi r24, 0x12 ; 18 1f66c: 90 e7 ldi r25, 0x70 ; 112 1f66e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_return_to_status(); 1f672: 0f 94 82 1f call 0x23f04 ; 0x23f04 default: // exiting for later re-entry break; } if (msg) { 1f676: 01 15 cp r16, r1 1f678: 11 05 cpc r17, r1 1f67a: 09 f4 brne .+2 ; 0x1f67e 1f67c: f8 ce rjmp .-528 ; 0x1f46e lcd_show_fullscreen_message_and_wait_P(msg); 1f67e: c8 01 movw r24, r16 1f680: 0f 94 cd 20 call 0x2419a ; 0x2419a 1f684: f4 ce rjmp .-536 ; 0x1f46e lcd_return_to_status(); break; case S::Failed: // aborted due to failure msg = _T(MSG_WIZARD_CALIBRATION_FAILED); 1f686: 80 e8 ldi r24, 0x80 ; 128 1f688: 9e e3 ldi r25, 0x3E ; 62 1f68a: 0e 94 44 72 call 0xe488 ; 0xe488 1f68e: 8c 01 movw r16, r24 1f690: f2 cf rjmp .-28 ; 0x1f676 0001f692
: void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { 1f692: cf 93 push r28 1f694: df 93 push r29 1f696: cd b7 in r28, 0x3d ; 61 1f698: de b7 in r29, 0x3e ; 62 1f69a: 67 97 sbiw r28, 0x17 ; 23 1f69c: 0f b6 in r0, 0x3f ; 63 1f69e: f8 94 cli 1f6a0: de bf out 0x3e, r29 ; 62 1f6a2: 0f be out 0x3f, r0 ; 63 1f6a4: cd bf out 0x3d, r28 ; 61 void init() { // this needs to be called before setup() or some functions won't // work there sei(); 1f6a6: 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); 1f6a8: 84 b5 in r24, 0x24 ; 36 1f6aa: 82 60 ori r24, 0x02 ; 2 1f6ac: 84 bd out 0x24, r24 ; 36 sbi(TCCR0A, WGM00); 1f6ae: 84 b5 in r24, 0x24 ; 36 1f6b0: 81 60 ori r24, 0x01 ; 1 1f6b2: 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); 1f6b4: 85 b5 in r24, 0x25 ; 37 1f6b6: 82 60 ori r24, 0x02 ; 2 1f6b8: 85 bd out 0x25, r24 ; 37 sbi(TCCR0B, CS00); 1f6ba: 85 b5 in r24, 0x25 ; 37 1f6bc: 81 60 ori r24, 0x01 ; 1 1f6be: 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); 1f6c0: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> 1f6c4: 81 60 ori r24, 0x01 ; 1 1f6c6: 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; 1f6ca: 10 92 81 00 sts 0x0081, r1 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> // set timer 1 prescale factor to 64 sbi(TCCR1B, CS11); 1f6ce: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> 1f6d2: 82 60 ori r24, 0x02 ; 2 1f6d4: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> #if F_CPU >= 8000000L sbi(TCCR1B, CS10); 1f6d8: 80 91 81 00 lds r24, 0x0081 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> 1f6dc: 81 60 ori r24, 0x01 ; 1 1f6de: 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); 1f6e2: 80 91 80 00 lds r24, 0x0080 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> 1f6e6: 81 60 ori r24, 0x01 ; 1 1f6e8: 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); 1f6ec: 80 91 b1 00 lds r24, 0x00B1 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1> 1f6f0: 84 60 ori r24, 0x04 ; 4 1f6f2: 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); 1f6f6: 80 91 b0 00 lds r24, 0x00B0 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> 1f6fa: 81 60 ori r24, 0x01 ; 1 1f6fc: 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 1f700: 80 91 91 00 lds r24, 0x0091 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> 1f704: 82 60 ori r24, 0x02 ; 2 1f706: 80 93 91 00 sts 0x0091, r24 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> sbi(TCCR3B, CS30); 1f70a: 80 91 91 00 lds r24, 0x0091 ; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091> 1f70e: 81 60 ori r24, 0x01 ; 1 1f710: 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 1f714: 80 91 90 00 lds r24, 0x0090 ; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090> 1f718: 81 60 ori r24, 0x01 ; 1 1f71a: 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 1f71e: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 1f722: 82 60 ori r24, 0x02 ; 2 1f724: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> sbi(TCCR4B, CS40); 1f728: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 1f72c: 81 60 ori r24, 0x01 ; 1 1f72e: 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 1f732: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> 1f736: 81 60 ori r24, 0x01 ; 1 1f738: 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 1f73c: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> 1f740: 82 60 ori r24, 0x02 ; 2 1f742: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> sbi(TCCR5B, CS50); 1f746: 80 91 21 01 lds r24, 0x0121 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> 1f74a: 81 60 ori r24, 0x01 ; 1 1f74c: 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 1f750: 80 91 20 01 lds r24, 0x0120 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> 1f754: 81 60 ori r24, 0x01 ; 1 1f756: 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); 1f75a: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1f75e: 84 60 ori r24, 0x04 ; 4 1f760: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> sbi(ADCSRA, ADPS1); 1f764: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1f768: 82 60 ori r24, 0x02 ; 2 1f76a: 80 93 7a 00 sts 0x007A, r24 ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> sbi(ADCSRA, ADPS0); 1f76e: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1f772: 81 60 ori r24, 0x01 ; 1 1f774: 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); 1f778: 80 91 7a 00 lds r24, 0x007A ; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a> 1f77c: 80 68 ori r24, 0x80 ; 128 1f77e: 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; 1f782: 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) { 1f786: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 1f788: f8 94 cli wdt_reset(); 1f78a: a8 95 wdr MCUSR &= ~_BV(WDRF); 1f78c: 84 b7 in r24, 0x34 ; 52 1f78e: 87 7f andi r24, 0xF7 ; 247 1f790: 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" ); 1f792: 0f b6 in r0, 0x3f ; 63 1f794: f8 94 cli 1f796: a8 95 wdr 1f798: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1f79c: 88 61 ori r24, 0x18 ; 24 1f79e: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1f7a2: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 1f7a6: 0f be out 0x3f, r0 ; 63 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 1f7a8: 9f bf out 0x3f, r25 ; 63 CRITICAL_SECTION_END; } void timer2_init(void) { CRITICAL_SECTION_START; 1f7aa: 9f b7 in r25, 0x3f ; 63 1f7ac: 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 1f7ae: 10 92 b0 00 sts 0x00B0, r1 ; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0> TCCR2B = (4 << CS20); //WGM_2=0, CS_0-2=011 1f7b2: 84 e0 ldi r24, 0x04 ; 4 1f7b4: 80 93 b1 00 sts 0x00B1, r24 ; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1> //mask timer2 interrupts - enable OVF, disable others TIMSK2 |= (1< 1f7bc: 81 60 ori r24, 0x01 ; 1 1f7be: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> TIMSK2 &= ~(1< 1f7c6: 8d 7f andi r24, 0xFD ; 253 1f7c8: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> TIMSK2 &= ~(1< 1f7d0: 8b 7f andi r24, 0xFB ; 251 1f7d2: 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; 1f7d6: 10 92 b3 00 sts 0x00B3, r1 ; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3> CRITICAL_SECTION_END; 1f7da: 9f bf out 0x3f, r25 ; 63 } void backlight_init() { //check for backlight support on lcd SET_INPUT(LCD_BL_PIN); 1f7dc: 6b 98 cbi 0x0d, 3 ; 13 WRITE(LCD_BL_PIN,HIGH); 1f7de: 73 9a sbi 0x0e, 3 ; 14 _delay(10); 1f7e0: 6a e0 ldi r22, 0x0A ; 10 1f7e2: 70 e0 ldi r23, 0x00 ; 0 1f7e4: 80 e0 ldi r24, 0x00 ; 0 1f7e6: 90 e0 ldi r25, 0x00 ; 0 1f7e8: 0f 94 2f 28 call 0x2505e ; 0x2505e backlightSupport = !READ(LCD_BL_PIN); 1f7ec: 9c b1 in r25, 0x0c ; 12 1f7ee: 81 e0 ldi r24, 0x01 ; 1 1f7f0: 29 2f mov r18, r25 1f7f2: 28 70 andi r18, 0x08 ; 8 1f7f4: 93 fd sbrc r25, 3 1f7f6: 80 e0 ldi r24, 0x00 ; 0 1f7f8: 80 93 01 04 sts 0x0401, r24 ; 0x800401 if (!backlightSupport) return; 1f7fc: 21 11 cpse r18, r1 1f7fe: 22 c0 rjmp .+68 ; 0x1f844 //initialize backlight backlightMode = eeprom_init_default_byte((uint8_t *)EEPROM_BACKLIGHT_MODE, BACKLIGHT_MODE_AUTO); 1f800: 62 e0 ldi r22, 0x02 ; 2 1f802: 82 e3 ldi r24, 0x32 ; 50 1f804: 9d e0 ldi r25, 0x0D ; 13 1f806: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1f80a: 80 93 4f 02 sts 0x024F, r24 ; 0x80024f backlightLevel_HIGH = eeprom_init_default_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH, LCD_BACKLIGHT_LEVEL_HIGH); 1f80e: 62 e8 ldi r22, 0x82 ; 130 1f810: 84 e3 ldi r24, 0x34 ; 52 1f812: 9d e0 ldi r25, 0x0D ; 13 1f814: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1f818: 80 93 00 04 sts 0x0400, r24 ; 0x800400 backlightLevel_LOW = eeprom_init_default_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW, LCD_BACKLIGHT_LEVEL_LOW); 1f81c: 62 e3 ldi r22, 0x32 ; 50 1f81e: 83 e3 ldi r24, 0x33 ; 51 1f820: 9d e0 ldi r25, 0x0D ; 13 1f822: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1f826: 80 93 ff 03 sts 0x03FF, r24 ; 0x8003ff backlightTimer_period = eeprom_init_default_word((uint16_t *)EEPROM_BACKLIGHT_TIMEOUT, LCD_BACKLIGHT_TIMEOUT); // in seconds 1f82a: 6f e0 ldi r22, 0x0F ; 15 1f82c: 70 e0 ldi r23, 0x00 ; 0 1f82e: 80 e3 ldi r24, 0x30 ; 48 1f830: 9d e0 ldi r25, 0x0D ; 13 1f832: 0e 94 89 75 call 0xeb12 ; 0xeb12 1f836: 90 93 4e 02 sts 0x024E, r25 ; 0x80024e 1f83a: 80 93 4d 02 sts 0x024D, r24 ; 0x80024d SET_OUTPUT(LCD_BL_PIN); 1f83e: 6b 9a sbi 0x0d, 3 ; 13 backlightTimer_reset(); 1f840: 0e 94 02 8a call 0x11404 ; 0x11404 return 0; } void lcd_init(void) { WRITE(LCD_PINS_ENABLE,LOW); 1f844: 8f 98 cbi 0x11, 7 ; 17 SET_OUTPUT(LCD_PINS_RS); 1f846: 55 9a sbi 0x0a, 5 ; 10 SET_OUTPUT(LCD_PINS_ENABLE); 1f848: 87 9a sbi 0x10, 7 ; 16 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); 1f84a: 85 9a sbi 0x10, 5 ; 16 SET_OUTPUT(LCD_PINS_D5); 1f84c: 9c 9a sbi 0x13, 4 ; 19 SET_OUTPUT(LCD_PINS_D6); 1f84e: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1f852: 80 68 ori r24, 0x80 ; 128 1f854: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> SET_OUTPUT(LCD_PINS_D7); 1f858: 9b 9a sbi 0x13, 3 ; 19 #ifdef LCD_8BIT lcd_displayfunction |= LCD_8BITMODE; #endif lcd_displayfunction |= LCD_2LINE; 1f85a: 80 91 10 04 lds r24, 0x0410 ; 0x800410 <_ZL19lcd_displayfunction.lto_priv.551> 1f85e: 88 60 ori r24, 0x08 ; 8 1f860: 80 93 10 04 sts 0x0410, r24 ; 0x800410 <_ZL19lcd_displayfunction.lto_priv.551> 1f864: 2f ef ldi r18, 0xFF ; 255 1f866: 30 e7 ldi r19, 0x70 ; 112 1f868: 82 e0 ldi r24, 0x02 ; 2 1f86a: 21 50 subi r18, 0x01 ; 1 1f86c: 30 40 sbci r19, 0x00 ; 0 1f86e: 80 40 sbci r24, 0x00 ; 0 1f870: e1 f7 brne .-8 ; 0x1f86a 1f872: 00 c0 rjmp .+0 ; 0x1f874 1f874: 00 00 nop _delay_us(50000); lcd_begin(1); //first time init 1f876: 81 e0 ldi r24, 0x01 ; 1 1f878: 0e 94 e3 6e call 0xddc6 ; 0xddc6 fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream 1f87c: 8b e8 ldi r24, 0x8B ; 139 1f87e: 90 e7 ldi r25, 0x70 ; 112 1f880: 90 93 0b 04 sts 0x040B, r25 ; 0x80040b <_lcdout+0x9> 1f884: 80 93 0a 04 sts 0x040A, r24 ; 0x80040a <_lcdout+0x8> 1f888: 10 92 0d 04 sts 0x040D, r1 ; 0x80040d <_lcdout+0xb> 1f88c: 10 92 0c 04 sts 0x040C, r1 ; 0x80040c <_lcdout+0xa> 1f890: 12 e0 ldi r17, 0x02 ; 2 1f892: 10 93 05 04 sts 0x0405, r17 ; 0x800405 <_lcdout+0x3> 1f896: 10 92 0f 04 sts 0x040F, r1 ; 0x80040f <_lcdout+0xd> 1f89a: 10 92 0e 04 sts 0x040E, r1 ; 0x80040e <_lcdout+0xc> void ultralcd_init() { backlight_init(); lcd_init(); lcd_refresh(); 1f89e: 0e 94 24 6f call 0xde48 ; 0xde48 lcd_longpress_func = menu_lcd_longpress_func; 1f8a2: 85 e4 ldi r24, 0x45 ; 69 1f8a4: 95 ed ldi r25, 0xD5 ; 213 1f8a6: 90 93 17 04 sts 0x0417, r25 ; 0x800417 1f8aa: 80 93 16 04 sts 0x0416, r24 ; 0x800416 lcd_lcdupdate_func = menu_lcd_lcdupdate_func; 1f8ae: 8e e9 ldi r24, 0x9E ; 158 1f8b0: 99 e3 ldi r25, 0x39 ; 57 1f8b2: 90 93 15 04 sts 0x0415, r25 ; 0x800415 1f8b6: 80 93 14 04 sts 0x0414, r24 ; 0x800414 menu_menu = lcd_status_screen; 1f8ba: 88 e0 ldi r24, 0x08 ; 8 1f8bc: 99 e3 ldi r25, 0x39 ; 57 1f8be: 90 93 13 04 sts 0x0413, r25 ; 0x800413 1f8c2: 80 93 12 04 sts 0x0412, r24 ; 0x800412 SET_INPUT(BTN_EN1); 1f8c6: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1f8ca: 8b 7f andi r24, 0xFB ; 251 1f8cc: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> SET_INPUT(BTN_EN2); 1f8d0: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1f8d4: 8d 7f andi r24, 0xFD ; 253 1f8d6: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> WRITE(BTN_EN1, HIGH); 1f8da: 9f b7 in r25, 0x3f ; 63 1f8dc: f8 94 cli 1f8de: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f8e2: 84 60 ori r24, 0x04 ; 4 1f8e4: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f8e8: 9f bf out 0x3f, r25 ; 63 WRITE(BTN_EN2, HIGH); 1f8ea: 9f b7 in r25, 0x3f ; 63 1f8ec: f8 94 cli 1f8ee: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f8f2: 82 60 ori r24, 0x02 ; 2 1f8f4: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f8f8: 9f bf out 0x3f, r25 ; 63 #if BTN_ENC > 0 SET_INPUT(BTN_ENC); 1f8fa: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1f8fe: 8f 7b andi r24, 0xBF ; 191 1f900: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> WRITE(BTN_ENC, HIGH); 1f904: 9f b7 in r25, 0x3f ; 63 1f906: f8 94 cli 1f908: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1f90c: 80 64 ori r24, 0x40 ; 64 1f90e: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1f912: 9f bf out 0x3f, r25 ; 63 #endif #if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) SET_INPUT(SDCARDDETECT); 1f914: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 1f918: 8e 7f andi r24, 0xFE ; 254 1f91a: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> WRITE(SDCARDDETECT, HIGH); 1f91e: 9f b7 in r25, 0x3f ; 63 1f920: f8 94 cli 1f922: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f926: 81 60 ori r24, 0x01 ; 1 1f928: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 1f92c: 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); 1f92e: af e9 ldi r26, 0x9F ; 159 1f930: bf e0 ldi r27, 0x0F ; 15 1f932: 11 97 sbiw r26, 0x01 ; 1 1f934: f1 f7 brne .-4 ; 0x1f932 1f936: 00 c0 rjmp .+0 ; 0x1f938 1f938: 00 00 nop _delay_ms(1); //wait for the pullups to raise the line lcd_oldcardstatus = IS_SD_INSERTED; 1f93a: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 1f93e: 80 95 com r24 1f940: 81 70 andi r24, 0x01 ; 1 1f942: 80 93 11 04 sts 0x0411, r24 ; 0x800411 #endif//(SDCARDDETECT > 0) // Initialise status line strncpy_P(lcd_status_message, MSG_WELCOME, LCD_WIDTH); 1f946: 44 e1 ldi r20, 0x14 ; 20 1f948: 50 e0 ldi r21, 0x00 ; 0 1f94a: 62 e1 ldi r22, 0x12 ; 18 1f94c: 70 e7 ldi r23, 0x70 ; 112 1f94e: 8e e1 ldi r24, 0x1E ; 30 1f950: 95 e0 ldi r25, 0x05 ; 5 1f952: 0f 94 fd d9 call 0x3b3fa ; 0x3b3fa timer2_init(); // enables functional millis ultralcd_init(); spi_init(); 1f956: 0f 94 c2 c2 call 0x38584 ; 0x38584 } void lcd_splash() { lcd_clear(); // clears display and homes screen 1f95a: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_printf_P(PSTR("\n Original Prusa i3\n Prusa Research\n%20.20S"), PSTR(FW_VERSION)); 1f95e: 80 e9 ldi r24, 0x90 ; 144 1f960: 9c e8 ldi r25, 0x8C ; 140 1f962: 9f 93 push r25 1f964: 8f 93 push r24 1f966: 87 e9 ldi r24, 0x97 ; 151 1f968: 9c e8 ldi r25, 0x8C ; 140 1f96a: 9f 93 push r25 1f96c: 8f 93 push r24 1f96e: 0e 94 51 6e call 0xdca2 ; 0xdca2 static void Sound_DoSound_Encoder_Move(void); static void Sound_DoSound_Blind_Alert(void); void Sound_Init(void) { SET_OUTPUT(BEEPER); 1f972: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1f976: 84 60 ori r24, 0x04 ; 4 1f978: 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)); 1f97c: 60 e0 ldi r22, 0x00 ; 0 1f97e: 87 ed ldi r24, 0xD7 ; 215 1f980: 9e e0 ldi r25, 0x0E ; 14 1f982: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1f986: 80 93 dd 04 sts 0x04DD, r24 ; 0x8004dd spi_init(); lcd_splash(); Sound_Init(); // also guarantee "SET_OUTPUT(BEEPER)" selectedSerialPort = eeprom_init_default_byte((uint8_t *)EEPROM_SECOND_SERIAL_ACTIVE, 0); 1f98a: 60 e0 ldi r22, 0x00 ; 0 1f98c: 88 e0 ldi r24, 0x08 ; 8 1f98e: 9f e0 ldi r25, 0x0F ; 15 1f990: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1f994: 80 93 38 05 sts 0x0538, r24 ; 0x800538 MYSERIAL.begin(BAUDRATE); 1f998: 0e 94 7b cd call 0x19af6 ; 0x19af6 fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream 1f99c: 83 ee ldi r24, 0xE3 ; 227 1f99e: 96 e7 ldi r25, 0x76 ; 118 1f9a0: 90 93 05 05 sts 0x0505, r25 ; 0x800505 <_uartout+0x9> 1f9a4: 80 93 04 05 sts 0x0504, r24 ; 0x800504 <_uartout+0x8> 1f9a8: 10 92 07 05 sts 0x0507, r1 ; 0x800507 <_uartout+0xb> 1f9ac: 10 92 06 05 sts 0x0506, r1 ; 0x800506 <_uartout+0xa> 1f9b0: 10 93 ff 04 sts 0x04FF, r17 ; 0x8004ff <_uartout+0x3> 1f9b4: 10 92 09 05 sts 0x0509, r1 ; 0x800509 <_uartout+0xd> 1f9b8: 10 92 08 05 sts 0x0508, r1 ; 0x800508 <_uartout+0xc> stdout = uartout; 1f9bc: 8c ef ldi r24, 0xFC ; 252 1f9be: 94 e0 ldi r25, 0x04 ; 4 1f9c0: 90 93 1c 18 sts 0x181C, r25 ; 0x80181c <__iob+0x3> 1f9c4: 80 93 1b 18 sts 0x181B, r24 ; 0x80181b <__iob+0x2> #ifdef XFLASH bool xflash_success = xflash_init(); 1f9c8: 0e 94 d0 ee call 0x1dda0 ; 0x1dda0 1f9cc: b8 2e mov r11, r24 uint8_t optiboot_status = 1; if (xflash_success) 1f9ce: 0f 90 pop r0 1f9d0: 0f 90 pop r0 1f9d2: 0f 90 pop r0 1f9d4: 0f 90 pop r0 1f9d6: 8e 01 movw r16, r28 1f9d8: 0f 5f subi r16, 0xFF ; 255 1f9da: 1f 4f sbci r17, 0xFF ; 255 fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream stdout = uartout; #ifdef XFLASH bool xflash_success = xflash_init(); uint8_t optiboot_status = 1; 1f9dc: aa 24 eor r10, r10 1f9de: a3 94 inc r10 if (xflash_success) 1f9e0: 88 23 and r24, r24 1f9e2: 09 f4 brne .+2 ; 0x1f9e6 1f9e4: d8 c0 rjmp .+432 ; 0x1fb96 { optiboot_status = optiboot_xflash_enter(); 1f9e6: 0f 94 d0 c2 call 0x385a0 ; 0x385a0 1f9ea: a8 2e mov r10, r24 #define LANGBOOT_BLOCKSIZE 0x1000u #define LANGBOOT_RAMBUFFER 0x0800 void update_sec_lang_from_external_flash() { if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) 1f9ec: 80 91 fc 1f lds r24, 0x1FFC ; 0x801ffc <__bss_end+0x7dd> 1f9f0: 90 91 fd 1f lds r25, 0x1FFD ; 0x801ffd <__bss_end+0x7de> 1f9f4: a0 91 fe 1f lds r26, 0x1FFE ; 0x801ffe <__bss_end+0x7df> 1f9f8: b0 91 ff 1f lds r27, 0x1FFF ; 0x801fff <__bss_end+0x7e0> 1f9fc: 8a 3a cpi r24, 0xAA ; 170 1f9fe: 95 45 sbci r25, 0x55 ; 85 1fa00: aa 4a sbci r26, 0xAA ; 170 1fa02: b5 45 sbci r27, 0x55 ; 85 1fa04: 09 f0 breq .+2 ; 0x1fa08 1fa06: bf c0 rjmp .+382 ; 0x1fb86 1fa08: 80 91 fb 1f lds r24, 0x1FFB ; 0x801ffb <__bss_end+0x7dc> 1fa0c: 87 ff sbrs r24, 7 1fa0e: bb c0 rjmp .+374 ; 0x1fb86 { uint8_t lang = boot_reserved >> 3; 1fa10: 80 90 fa 1f lds r8, 0x1FFA ; 0x801ffa <__bss_end+0x7db> 1fa14: 98 2c mov r9, r8 1fa16: 96 94 lsr r9 1fa18: 96 94 lsr r9 1fa1a: 96 94 lsr r9 uint8_t state = boot_reserved & 0x07; 1fa1c: f8 2d mov r31, r8 1fa1e: f7 70 andi r31, 0x07 ; 7 1fa20: 8f 2e mov r8, r31 return count; } uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset) { if (lang == LANG_ID_PRI) return 0; //primary lang not supported for this function 1fa22: 99 20 and r9, r9 1fa24: 09 f4 brne .+2 ; 0x1fa28 1fa26: af c0 rjmp .+350 ; 0x1fb86 #ifdef XFLASH if (lang == LANG_ID_SEC) 1fa28: 21 e0 ldi r18, 0x01 ; 1 1fa2a: 92 12 cpse r9, r18 1fa2c: 24 c0 rjmp .+72 ; 0x1fa76 { uint16_t ui = _SEC_LANG_TABLE; //table pointer memcpy_P(header, (lang_table_t*)(_SEC_LANG_TABLE), sizeof(lang_table_header_t)); //read table header from progmem 1fa2e: 40 e1 ldi r20, 0x10 ; 16 1fa30: 50 e0 ldi r21, 0x00 ; 0 1fa32: 60 e0 ldi r22, 0x00 ; 0 1fa34: 71 e0 ldi r23, 0x01 ; 1 1fa36: c8 01 movw r24, r16 1fa38: 0f 94 aa d9 call 0x3b354 ; 0x3b354 if (offset) *offset = ui; 1fa3c: 60 e0 ldi r22, 0x00 ; 0 1fa3e: 71 e0 ldi r23, 0x01 ; 1 1fa40: 6b 01 movw r12, r22 1fa42: f1 2c mov r15, r1 1fa44: e1 2c mov r14, r1 lang_table_header_t header; uint32_t src_addr; if (lang_get_header(lang, &header, &src_addr)) 1fa46: 89 81 ldd r24, Y+1 ; 0x01 1fa48: 9a 81 ldd r25, Y+2 ; 0x02 1fa4a: ab 81 ldd r26, Y+3 ; 0x03 1fa4c: bc 81 ldd r27, Y+4 ; 0x04 1fa4e: 85 3a cpi r24, 0xA5 ; 165 1fa50: 9a 45 sbci r25, 0x5A ; 90 1fa52: a4 4b sbci r26, 0xB4 ; 180 1fa54: bb 44 sbci r27, 0x4B ; 75 1fa56: 09 f0 breq .+2 ; 0x1fa5a 1fa58: 96 c0 rjmp .+300 ; 0x1fb86 { lcd_puts_at_P(1,0,PSTR("Language update")); 1fa5a: 45 ec ldi r20, 0xC5 ; 197 1fa5c: 5c e8 ldi r21, 0x8C ; 140 1fa5e: 60 e0 ldi r22, 0x00 ; 0 1fa60: 81 e0 ldi r24, 0x01 ; 1 1fa62: 0e 94 8c 6e call 0xdd18 ; 0xdd18 for (uint8_t i = 0; i < state; i++) 1fa66: 91 2c mov r9, r1 1fa68: 89 14 cp r8, r9 1fa6a: 39 f1 breq .+78 ; 0x1faba } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 1fa6c: 8e e2 ldi r24, 0x2E ; 46 1fa6e: 0e 94 27 6f call 0xde4e ; 0xde4e 1fa72: 93 94 inc r9 1fa74: f9 cf rjmp .-14 ; 0x1fa68 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 1fa76: 8c e5 ldi r24, 0x5C ; 92 1fa78: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 1fa7a: 1d bc out 0x2d, r1 ; 45 return (header->magic == LANG_MAGIC)?1:0; //return 1 if magic valid } XFLASH_SPI_ENTER(); uint32_t addr = LANG_OFFSET; 1fa7c: c1 2c mov r12, r1 1fa7e: d1 2c mov r13, r1 1fa80: 76 01 movw r14, r12 lang--; while (1) { xflash_rd_data(addr, (uint8_t*)(header), sizeof(lang_table_header_t)); //read table header from xflash 1fa82: 20 e1 ldi r18, 0x10 ; 16 1fa84: 30 e0 ldi r19, 0x00 ; 0 1fa86: a8 01 movw r20, r16 1fa88: c7 01 movw r24, r14 1fa8a: b6 01 movw r22, r12 1fa8c: 0e 94 a0 ed call 0x1db40 ; 0x1db40 if (header->magic != LANG_MAGIC) break; //break if not valid 1fa90: 89 81 ldd r24, Y+1 ; 0x01 1fa92: 9a 81 ldd r25, Y+2 ; 0x02 1fa94: ab 81 ldd r26, Y+3 ; 0x03 1fa96: bc 81 ldd r27, Y+4 ; 0x04 1fa98: 85 3a cpi r24, 0xA5 ; 165 1fa9a: 9a 45 sbci r25, 0x5A ; 90 1fa9c: a4 4b sbci r26, 0xB4 ; 180 1fa9e: bb 44 sbci r27, 0x4B ; 75 1faa0: 09 f0 breq .+2 ; 0x1faa4 1faa2: 71 c0 rjmp .+226 ; 0x1fb86 if (offset) *offset = addr; if (--lang == 0) return 1; 1faa4: f2 e0 ldi r31, 0x02 ; 2 1faa6: 9f 16 cp r9, r31 1faa8: c1 f2 breq .-80 ; 0x1fa5a addr += header->size; //calc address of next table 1faaa: 8d 81 ldd r24, Y+5 ; 0x05 1faac: 9e 81 ldd r25, Y+6 ; 0x06 1faae: c8 0e add r12, r24 1fab0: d9 1e adc r13, r25 1fab2: e1 1c adc r14, r1 1fab4: f1 1c adc r15, r1 1fab6: 9a 94 dec r9 1fab8: e4 cf rjmp .-56 ; 0x1fa82 lcd_print('.'); _delay(100); 1faba: 64 e6 ldi r22, 0x64 ; 100 1fabc: 70 e0 ldi r23, 0x00 ; 0 1fabe: 80 e0 ldi r24, 0x00 ; 0 1fac0: 90 e0 ldi r25, 0x00 ; 0 1fac2: 0f 94 2f 28 call 0x2505e ; 0x2505e boot_reserved = (boot_reserved & 0xF8) | ((state + 1) & 0x07); 1fac6: 80 91 fa 1f lds r24, 0x1FFA ; 0x801ffa <__bss_end+0x7db> 1faca: 88 7f andi r24, 0xF8 ; 248 1facc: 91 e0 ldi r25, 0x01 ; 1 1face: 98 0d add r25, r8 1fad0: 97 70 andi r25, 0x07 ; 7 1fad2: 89 2b or r24, r25 1fad4: 80 93 fa 1f sts 0x1FFA, r24 ; 0x801ffa <__bss_end+0x7db> if ((state * LANGBOOT_BLOCKSIZE) < header.size) 1fad8: 91 2c mov r9, r1 1fada: 98 2c mov r9, r8 1fadc: 88 24 eor r8, r8 1fade: 92 94 swap r9 1fae0: 80 ef ldi r24, 0xF0 ; 240 1fae2: 98 22 and r9, r24 1fae4: 8d 81 ldd r24, Y+5 ; 0x05 1fae6: 9e 81 ldd r25, Y+6 ; 0x06 1fae8: 88 16 cp r8, r24 1faea: 99 06 cpc r9, r25 1faec: 08 f0 brcs .+2 ; 0x1faf0 1faee: 46 c0 rjmp .+140 ; 0x1fb7c { cli(); 1faf0: f8 94 cli uint16_t size = header.size - state * LANGBOOT_BLOCKSIZE; 1faf2: 0d 81 ldd r16, Y+5 ; 0x05 1faf4: 1e 81 ldd r17, Y+6 ; 0x06 1faf6: 08 19 sub r16, r8 1faf8: 19 09 sbc r17, r9 if (size > LANGBOOT_BLOCKSIZE) size = LANGBOOT_BLOCKSIZE; 1fafa: 01 30 cpi r16, 0x01 ; 1 1fafc: 20 e1 ldi r18, 0x10 ; 16 1fafe: 12 07 cpc r17, r18 1fb00: 10 f0 brcs .+4 ; 0x1fb06 1fb02: 00 e0 ldi r16, 0x00 ; 0 1fb04: 10 e1 ldi r17, 0x10 ; 16 xflash_rd_data(src_addr + state * LANGBOOT_BLOCKSIZE, (uint8_t*)LANGBOOT_RAMBUFFER, size); 1fb06: c7 01 movw r24, r14 1fb08: b6 01 movw r22, r12 1fb0a: 68 0d add r22, r8 1fb0c: 79 1d adc r23, r9 1fb0e: 81 1d adc r24, r1 1fb10: 91 1d adc r25, r1 1fb12: 98 01 movw r18, r16 1fb14: 40 e0 ldi r20, 0x00 ; 0 1fb16: 58 e0 ldi r21, 0x08 ; 8 1fb18: 0e 94 a0 ed call 0x1db40 ; 0x1db40 } void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) { cli(); 1fb1c: f8 94 cli boot_app_magic = BOOT_APP_MAGIC; 1fb1e: 8a ea ldi r24, 0xAA ; 170 1fb20: 95 e5 ldi r25, 0x55 ; 85 1fb22: dc 01 movw r26, r24 1fb24: 80 93 fc 1f sts 0x1FFC, r24 ; 0x801ffc <__bss_end+0x7dd> 1fb28: 90 93 fd 1f sts 0x1FFD, r25 ; 0x801ffd <__bss_end+0x7de> 1fb2c: a0 93 fe 1f sts 0x1FFE, r26 ; 0x801ffe <__bss_end+0x7df> 1fb30: b0 93 ff 1f sts 0x1FFF, r27 ; 0x801fff <__bss_end+0x7e0> boot_app_flags |= BOOT_APP_FLG_COPY | BOOT_APP_FLG_ERASE; 1fb34: 80 91 fb 1f lds r24, 0x1FFB ; 0x801ffb <__bss_end+0x7dc> 1fb38: 83 60 ori r24, 0x03 ; 3 1fb3a: 80 93 fb 1f sts 0x1FFB, r24 ; 0x801ffb <__bss_end+0x7dc> boot_copy_size = (uint16_t)size; 1fb3e: 10 93 f9 1f sts 0x1FF9, r17 ; 0x801ff9 <__bss_end+0x7da> 1fb42: 00 93 f8 1f sts 0x1FF8, r16 ; 0x801ff8 <__bss_end+0x7d9> boot_src_addr = (uint32_t)rptr; 1fb46: 80 e0 ldi r24, 0x00 ; 0 1fb48: 98 e0 ldi r25, 0x08 ; 8 1fb4a: a0 e0 ldi r26, 0x00 ; 0 1fb4c: b0 e0 ldi r27, 0x00 ; 0 1fb4e: 80 93 f0 1f sts 0x1FF0, r24 ; 0x801ff0 <__bss_end+0x7d1> 1fb52: 90 93 f1 1f sts 0x1FF1, r25 ; 0x801ff1 <__bss_end+0x7d2> 1fb56: a0 93 f2 1f sts 0x1FF2, r26 ; 0x801ff2 <__bss_end+0x7d3> 1fb5a: b0 93 f3 1f sts 0x1FF3, r27 ; 0x801ff3 <__bss_end+0x7d4> if (state == 0) { //TODO - check header integrity } bootapp_ram2flash(LANGBOOT_RAMBUFFER, _SEC_LANG_TABLE + state * LANGBOOT_BLOCKSIZE, size); 1fb5e: c4 01 movw r24, r8 1fb60: 80 50 subi r24, 0x00 ; 0 1fb62: 9f 4f sbci r25, 0xFF ; 255 boot_dst_addr = (uint32_t)fptr; 1fb64: b0 e0 ldi r27, 0x00 ; 0 1fb66: a0 e0 ldi r26, 0x00 ; 0 1fb68: 80 93 f4 1f sts 0x1FF4, r24 ; 0x801ff4 <__bss_end+0x7d5> 1fb6c: 90 93 f5 1f sts 0x1FF5, r25 ; 0x801ff5 <__bss_end+0x7d6> 1fb70: a0 93 f6 1f sts 0x1FF6, r26 ; 0x801ff6 <__bss_end+0x7d7> 1fb74: b0 93 f7 1f sts 0x1FF7, r27 ; 0x801ff7 <__bss_end+0x7d8> for (uint16_t i = 0; i < EEPROM_TOP; i++) { eeprom_update_byte_notify((uint8_t*)i, 0xFF); menu_progressbar_update(i); } menu_progressbar_finish(); softReset(); 1fb78: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 1fb7c: 61 e0 ldi r22, 0x01 ; 1 1fb7e: 8e ef ldi r24, 0xFE ; 254 1fb80: 9f e0 ldi r25, 0x0F ; 15 1fb82: 0f 94 34 dc call 0x3b868 ; 0x3b868 //TODO - check sec lang data integrity eeprom_update_byte_notify((unsigned char *)EEPROM_LANG, LANG_ID_SEC); } } } boot_app_magic = 0; 1fb86: 10 92 fc 1f sts 0x1FFC, r1 ; 0x801ffc <__bss_end+0x7dd> 1fb8a: 10 92 fd 1f sts 0x1FFD, r1 ; 0x801ffd <__bss_end+0x7de> 1fb8e: 10 92 fe 1f sts 0x1FFE, r1 ; 0x801ffe <__bss_end+0x7df> 1fb92: 10 92 ff 1f sts 0x1FFF, r1 ; 0x801fff <__bss_end+0x7e0> return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); 1fb96: 0e 94 8a f0 call 0x1e114 ; 0x1e114 setup_powerhold(); farm_mode_init(); #ifdef TMC2130 if(FarmOrUserECool()) { 1fb9a: 88 23 and r24, r24 1fb9c: 51 f0 breq .+20 ; 0x1fbb2 //increased extruder current (PFW363) currents[E_AXIS].setiRun(TMC2130_CURRENTS_FARM); 1fb9e: 64 e2 ldi r22, 0x24 ; 36 1fba0: 86 e6 ldi r24, 0x66 ; 102 1fba2: 92 e0 ldi r25, 0x02 ; 2 1fba4: 0e 94 9e 67 call 0xcf3c ; 0xcf3c currents[E_AXIS].setiHold(TMC2130_CURRENTS_FARM); 1fba8: 64 e2 ldi r22, 0x24 ; 36 1fbaa: 86 e6 ldi r24, 0x66 ; 102 1fbac: 92 e0 ldi r25, 0x02 ; 2 1fbae: 0e 94 96 67 call 0xcf2c ; 0xcf2c #ifdef PRUSA_SN_SUPPORT //Check for valid SN in EEPROM. Try to retrieve it in case it's invalid. //SN is valid only if it is NULL terminated and starts with "CZPX". { char SN[20]; eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); 1fbb2: 44 e1 ldi r20, 0x14 ; 20 1fbb4: 50 e0 ldi r21, 0x00 ; 0 1fbb6: 65 e1 ldi r22, 0x15 ; 21 1fbb8: 7d e0 ldi r23, 0x0D ; 13 1fbba: c8 01 movw r24, r16 1fbbc: 0f 94 00 dc call 0x3b800 ; 0x3b800 if (SN[19] || strncmp_P(SN, PSTR("CZPX"), 4)) 1fbc0: 8c 89 ldd r24, Y+20 ; 0x14 1fbc2: 81 11 cpse r24, r1 1fbc4: 0a c0 rjmp .+20 ; 0x1fbda 1fbc6: 44 e0 ldi r20, 0x04 ; 4 1fbc8: 50 e0 ldi r21, 0x00 ; 0 1fbca: 67 ec ldi r22, 0xC7 ; 199 1fbcc: 7d e8 ldi r23, 0x8D ; 141 1fbce: c8 01 movw r24, r16 1fbd0: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 1fbd4: 89 2b or r24, r25 1fbd6: 09 f4 brne .+2 ; 0x1fbda 1fbd8: 51 c0 rjmp .+162 ; 0x1fc7c * @return 1 on general failure */ #ifdef PRUSA_SN_SUPPORT static uint8_t get_PRUSA_SN(char* SN) { uint8_t selectedSerialPort_bak = selectedSerialPort; 1fbda: e0 90 38 05 lds r14, 0x0538 ; 0x800538 uint8_t rxIndex; bool SN_valid = false; ShortTimer timeout; 1fbde: 1d 8a std Y+21, r1 ; 0x15 1fbe0: 1f 8a std Y+23, r1 ; 0x17 1fbe2: 1e 8a std Y+22, r1 ; 0x16 selectedSerialPort = 0; 1fbe4: 10 92 38 05 sts 0x0538, r1 ; 0x800538 timeout.start(); 1fbe8: ce 01 movw r24, r28 1fbea: 45 96 adiw r24, 0x15 ; 21 1fbec: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> while (!SN_valid) { rxIndex = 0; _delay(50); 1fbf0: 62 e3 ldi r22, 0x32 ; 50 1fbf2: 70 e0 ldi r23, 0x00 ; 0 1fbf4: 80 e0 ldi r24, 0x00 ; 0 1fbf6: 90 e0 ldi r25, 0x00 ; 0 1fbf8: 0f 94 2f 28 call 0x2505e ; 0x2505e // 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; 1fbfc: 80 91 9a 04 lds r24, 0x049A ; 0x80049a 1fc00: 90 91 9b 04 lds r25, 0x049B ; 0x80049b 1fc04: 90 93 99 04 sts 0x0499, r25 ; 0x800499 1fc08: 80 93 98 04 sts 0x0498, r24 ; 0x800498 MYSERIAL.flush(); //clear RX buffer SERIAL_ECHOLNRPGM(PSTR(";S")); 1fc0c: 8a ed ldi r24, 0xDA ; 218 1fc0e: 9c e8 ldi r25, 0x8C ; 140 1fc10: 0e 94 13 79 call 0xf226 ; 0xf226 1fc14: 68 01 movw r12, r16 selectedSerialPort = 0; timeout.start(); while (!SN_valid) { rxIndex = 0; 1fc16: f1 2c mov r15, r1 _delay(50); MYSERIAL.flush(); //clear RX buffer SERIAL_ECHOLNRPGM(PSTR(";S")); while (rxIndex < 19) 1fc18: 33 e1 ldi r19, 0x13 ; 19 1fc1a: f3 16 cp r15, r19 1fc1c: a1 f0 breq .+40 ; 0x1fc46 { if (timeout.expired(250u)) 1fc1e: 6a ef ldi r22, 0xFA ; 250 1fc20: 70 e0 ldi r23, 0x00 ; 0 1fc22: ce 01 movw r24, r28 1fc24: 45 96 adiw r24, 0x15 ; 21 1fc26: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 1fc2a: 81 11 cpse r24, r1 1fc2c: c1 c0 rjmp .+386 ; 0x1fdb0 goto exit; if (MYSERIAL.available() > 0) 1fc2e: 0e 94 a1 76 call 0xed42 ; 0xed42 1fc32: 18 16 cp r1, r24 1fc34: 19 06 cpc r1, r25 1fc36: 84 f7 brge .-32 ; 0x1fc18 { SN[rxIndex] = MYSERIAL.read(); 1fc38: 0f 94 f8 d5 call 0x3abf0 ; 0x3abf0 1fc3c: d6 01 movw r26, r12 1fc3e: 8d 93 st X+, r24 1fc40: 6d 01 movw r12, r26 rxIndex++; 1fc42: f3 94 inc r15 1fc44: e9 cf rjmp .-46 ; 0x1fc18 } } SN[rxIndex] = 0; 1fc46: 1c 8a std Y+20, r1 ; 0x14 // printf_P(PSTR("SN:%s\n"), SN); SN_valid = (strncmp_P(SN, PSTR("CZPX"), 4) == 0); 1fc48: 44 e0 ldi r20, 0x04 ; 4 1fc4a: 50 e0 ldi r21, 0x00 ; 0 1fc4c: 65 ed ldi r22, 0xD5 ; 213 1fc4e: 7c e8 ldi r23, 0x8C ; 140 1fc50: c8 01 movw r24, r16 1fc52: 0f 94 ef d9 call 0x3b3de ; 0x3b3de ShortTimer timeout; selectedSerialPort = 0; timeout.start(); while (!SN_valid) 1fc56: 89 2b or r24, r25 1fc58: 59 f6 brne .-106 ; 0x1fbf0 1fc5a: 81 e0 ldi r24, 0x01 ; 1 SN[rxIndex] = 0; // printf_P(PSTR("SN:%s\n"), SN); SN_valid = (strncmp_P(SN, PSTR("CZPX"), 4) == 0); } exit: selectedSerialPort = selectedSerialPort_bak; 1fc5c: e0 92 38 05 sts 0x0538, r14 ; 0x800538 { char SN[20]; eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); if (SN[19] || strncmp_P(SN, PSTR("CZPX"), 4)) { if (!get_PRUSA_SN(SN)) 1fc60: 88 23 and r24, r24 1fc62: 09 f4 brne .+2 ; 0x1fc66 1fc64: a7 c0 rjmp .+334 ; 0x1fdb4 #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); 1fc66: 44 e1 ldi r20, 0x14 ; 20 1fc68: 50 e0 ldi r21, 0x00 ; 0 1fc6a: 65 e1 ldi r22, 0x15 ; 21 1fc6c: 7d e0 ldi r23, 0x0D ; 13 1fc6e: c8 01 movw r24, r16 1fc70: 0f 94 24 dc call 0x3b848 ; 0x3b848 { eeprom_update_block_notify(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); puts_P(PSTR("SN updated")); 1fc74: 8c eb ldi r24, 0xBC ; 188 1fc76: 9d e8 ldi r25, 0x8D ; 141 } else puts_P(PSTR("SN update failed")); 1fc78: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 #ifndef XFLASH SERIAL_PROTOCOLLNPGM("start"); #else if ((optiboot_status != 0) || (selectedSerialPort != 0)) 1fc7c: a1 10 cpse r10, r1 1fc7e: 04 c0 rjmp .+8 ; 0x1fc88 1fc80: 80 91 38 05 lds r24, 0x0538 ; 0x800538 1fc84: 88 23 and r24, r24 1fc86: 21 f0 breq .+8 ; 0x1fc90 SERIAL_PROTOCOLLNPGM("start"); 1fc88: 85 ea ldi r24, 0xA5 ; 165 1fc8a: 9d e8 ldi r25, 0x8D ; 141 1fc8c: 0e 94 13 79 call 0xf226 ; 0xf226 #endif SERIAL_ECHO_START; 1fc90: 82 ef ldi r24, 0xF2 ; 242 1fc92: 9a ea ldi r25, 0xAA ; 170 1fc94: 0e 94 e8 76 call 0xedd0 ; 0xedd0 puts_P(PSTR(" " FW_VERSION_FULL "_" FW_COMMIT_HASH)); 1fc98: 8e e8 ldi r24, 0x8E ; 142 1fc9a: 9d e8 ldi r25, 0x8D ; 141 1fc9c: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 // by default the MMU shall remain disabled - PFW-1418 if (eeprom_init_default_byte((uint8_t *)EEPROM_MMU_ENABLED, 0)) { 1fca0: 60 e0 ldi r22, 0x00 ; 0 1fca2: 8c ea ldi r24, 0xAC ; 172 1fca4: 9c e0 ldi r25, 0x0C ; 12 1fca6: 0e 94 a1 75 call 0xeb42 ; 0xeb42 1fcaa: 81 11 cpse r24, r1 MMU2::mmu2.Start(); 1fcac: 0e 94 49 e4 call 0x1c892 ; 0x1c892 } MMU2::mmu2.Status(); 1fcb0: 0f 94 da 75 call 0x2ebb4 ; 0x2ebb4 } void SpoolJoin::initSpoolJoinStatus() { // Useful information to see during bootup SERIAL_ECHOPGM("SpoolJoin is "); 1fcb4: 8d ed ldi r24, 0xDD ; 221 1fcb6: 9c e8 ldi r25, 0x8C ; 140 1fcb8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)EEPROM::Disabled); 1fcbc: 62 e0 ldi r22, 0x02 ; 2 1fcbe: 86 ed ldi r24, 0xD6 ; 214 1fcc0: 9e e0 ldi r25, 0x0E ; 14 1fcc2: 0e 94 a1 75 call 0xeb42 ; 0xeb42 if (status == (uint8_t)EEPROM::Enabled) 1fcc6: 81 30 cpi r24, 0x01 ; 1 1fcc8: 09 f0 breq .+2 ; 0x1fccc 1fcca: 77 c0 rjmp .+238 ; 0x1fdba { SERIAL_ECHOLNRPGM(_O(MSG_ON)); 1fccc: 83 e5 ldi r24, 0x53 ; 83 1fcce: 9c e5 ldi r25, 0x5C ; 92 } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); 1fcd0: 0e 94 13 79 call 0xf226 ; 0xf226 #endif #endif //DEBUG_SEC_LANG // Check startup - does nothing if bootloader sets MCUSR to 0 byte mcu = MCUSR; 1fcd4: f4 b6 in r15, 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); 1fcd6: f0 fe sbrs r15, 0 1fcd8: 04 c0 rjmp .+8 ; 0x1fce2 1fcda: 81 e2 ldi r24, 0x21 ; 33 1fcdc: 9d e6 ldi r25, 0x6D ; 109 1fcde: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 if (mcu & 2) puts_P(MSG_EXTERNAL_RESET); 1fce2: f1 fe sbrs r15, 1 1fce4: 04 c0 rjmp .+8 ; 0x1fcee 1fce6: 81 e1 ldi r24, 0x11 ; 17 1fce8: 9d e6 ldi r25, 0x6D ; 109 1fcea: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 if (mcu & 4) puts_P(MSG_BROWNOUT_RESET); 1fcee: f2 fe sbrs r15, 2 1fcf0: 04 c0 rjmp .+8 ; 0x1fcfa 1fcf2: 80 e0 ldi r24, 0x00 ; 0 1fcf4: 9d e6 ldi r25, 0x6D ; 109 1fcf6: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 if (mcu & 8) puts_P(MSG_WATCHDOG_RESET); 1fcfa: f3 fe sbrs r15, 3 1fcfc: 04 c0 rjmp .+8 ; 0x1fd06 1fcfe: 80 ef ldi r24, 0xF0 ; 240 1fd00: 9c e6 ldi r25, 0x6C ; 108 1fd02: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 if (mcu & 32) puts_P(MSG_SOFTWARE_RESET); 1fd06: f5 fe sbrs r15, 5 1fd08: 04 c0 rjmp .+8 ; 0x1fd12 1fd0a: 80 ee ldi r24, 0xE0 ; 224 1fd0c: 9c e6 ldi r25, 0x6C ; 108 1fd0e: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 MCUSR = 0; 1fd12: 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; 1fd14: 82 ef ldi r24, 0xF2 ; 242 1fd16: 9a ea ldi r25, 0xAA ; 170 1fd18: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(_n(" Last Updated: "));////MSG_CONFIGURATION_VER 1fd1c: 80 ed ldi r24, 0xD0 ; 208 1fd1e: 9c e6 ldi r25, 0x6C ; 108 1fd20: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H); 1fd24: 8a e7 ldi r24, 0x7A ; 122 1fd26: 9d e8 ldi r25, 0x8D ; 141 1fd28: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR 1fd2c: 84 ec ldi r24, 0xC4 ; 196 1fd2e: 9c e6 ldi r25, 0x6C ; 108 1fd30: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR); 1fd34: 82 e7 ldi r24, 0x72 ; 114 1fd36: 9d e8 ldi r25, 0x8D ; 141 1fd38: 0e 94 13 79 call 0xf226 ; 0xf226 #endif #endif SERIAL_ECHO_START; 1fd3c: 82 ef ldi r24, 0xF2 ; 242 1fd3e: 9a ea ldi r25, 0xAA ; 170 1fd40: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(_n(" Free Memory: "));////MSG_FREE_MEMORY 1fd44: 85 eb ldi r24, 0xB5 ; 181 1fd46: 9c e6 ldi r25, 0x6C ; 108 1fd48: 0e 94 e8 76 call 0xedd0 ; 0xedd0 /** Amount of free RAM * \return The number of free bytes. */ int SdFatUtil::FreeRam() { char top; return __brkval ? &top - __brkval : &top - &__bss_end; 1fd4c: 80 91 15 18 lds r24, 0x1815 ; 0x801815 <__brkval> 1fd50: 90 91 16 18 lds r25, 0x1816 ; 0x801816 <__brkval+0x1> 1fd54: 00 97 sbiw r24, 0x00 ; 0 1fd56: a1 f1 breq .+104 ; 0x1fdc0 1fd58: 08 1b sub r16, r24 1fd5a: 19 0b sbc r17, r25 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 1fd5c: b8 01 movw r22, r16 1fd5e: 11 0f add r17, r17 1fd60: 88 0b sbc r24, r24 1fd62: 99 0b sbc r25, r25 1fd64: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_ECHO(freeMemory()); SERIAL_ECHORPGM(_n(" PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES 1fd68: 8e e9 ldi r24, 0x9E ; 158 1fd6a: 9c e6 ldi r25, 0x6C ; 108 1fd6c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); 1fd70: 80 ee ldi r24, 0xE0 ; 224 1fd72: 96 e0 ldi r25, 0x06 ; 6 1fd74: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 #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); 1fd78: 6c e2 ldi r22, 0x2C ; 44 1fd7a: 71 e0 ldi r23, 0x01 ; 1 1fd7c: 8e ee ldi r24, 0xEE ; 238 1fd7e: 9e e0 ldi r25, 0x0E ; 14 1fd80: 0e 94 89 75 call 0xeb12 ; 0xeb12 1fd84: 8c 01 movw r16, r24 uint16_t motherboard = eeprom_init_default_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); 1fd86: 66 e3 ldi r22, 0x36 ; 54 1fd88: 71 e0 ldi r23, 0x01 ; 1 1fd8a: 8c ee ldi r24, 0xEC ; 236 1fd8c: 9e e0 ldi r25, 0x0E ; 14 1fd8e: 0e 94 89 75 call 0xeb12 ; 0xeb12 if (printer_type != PRINTER_TYPE) version_changed |= 0b10; 1fd92: 0c 32 cpi r16, 0x2C ; 44 1fd94: 11 40 sbci r17, 0x01 ; 1 1fd96: 11 f0 breq .+4 ; 0x1fd9c 1fd98: 0d 94 c4 06 jmp 0x20d88 ; 0x20d88 if (motherboard != MOTHERBOARD) version_changed |= 0b01; 1fd9c: 01 e0 ldi r16, 0x01 ; 1 1fd9e: 86 33 cpi r24, 0x36 ; 54 1fda0: 91 40 sbci r25, 0x01 ; 1 1fda2: 09 f4 brne .+2 ; 0x1fda6 1fda4: 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(); 1fda6: 0e 94 4c 93 call 0x12698 ; 0x12698 1fdaa: f8 2e mov r15, r24 1fdac: 0d 94 cc 06 jmp 0x20d98 ; 0x20d98 _delay(50); MYSERIAL.flush(); //clear RX buffer SERIAL_ECHOLNRPGM(PSTR(";S")); while (rxIndex < 19) { if (timeout.expired(250u)) 1fdb0: 80 e0 ldi r24, 0x00 ; 0 1fdb2: 54 cf rjmp .-344 ; 0x1fc5c { eeprom_update_block_notify(SN, (uint8_t*)EEPROM_PRUSA_SN, 20); puts_P(PSTR("SN updated")); } else puts_P(PSTR("SN update failed")); 1fdb4: 8b ea ldi r24, 0xAB ; 171 1fdb6: 9d e8 ldi r25, 0x8D ; 141 1fdb8: 5f cf rjmp .-322 ; 0x1fc78 1fdba: 8d e4 ldi r24, 0x4D ; 77 1fdbc: 9c e5 ldi r25, 0x5C ; 92 1fdbe: 88 cf rjmp .-240 ; 0x1fcd0 1fdc0: 0f 51 subi r16, 0x1F ; 31 1fdc2: 18 41 sbci r17, 0x18 ; 24 1fdc4: cb cf rjmp .-106 ; 0x1fd5c minttemp_raw[0] -= OVERSAMPLENR; #endif } #endif //MINTEMP #ifdef HEATER_0_MAXTEMP maxttemp[0] = HEATER_0_MAXTEMP; 1fdc6: 81 e3 ldi r24, 0x31 ; 49 1fdc8: 91 e0 ldi r25, 0x01 ; 1 1fdca: 90 93 57 02 sts 0x0257, r25 ; 0x800257 <_ZL8maxttemp.lto_priv.472+0x1> 1fdce: 80 93 56 02 sts 0x0256, r24 ; 0x800256 <_ZL8maxttemp.lto_priv.472> while(analog2temp(maxttemp_raw[0], 0) > HEATER_0_MAXTEMP) { 1fdd2: 80 91 a0 04 lds r24, 0x04A0 ; 0x8004a0 <_ZL12maxttemp_raw.lto_priv.465> 1fdd6: 90 91 a1 04 lds r25, 0x04A1 ; 0x8004a1 <_ZL12maxttemp_raw.lto_priv.465+0x1> 1fdda: 0f 94 10 a1 call 0x34220 ; 0x34220 1fdde: 20 e0 ldi r18, 0x00 ; 0 1fde0: 30 e8 ldi r19, 0x80 ; 128 1fde2: 48 e9 ldi r20, 0x98 ; 152 1fde4: 53 e4 ldi r21, 0x43 ; 67 1fde6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1fdea: 18 16 cp r1, r24 1fdec: 54 f4 brge .+20 ; 0x1fe02 #if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP maxttemp_raw[0] -= OVERSAMPLENR; #else maxttemp_raw[0] += OVERSAMPLENR; 1fdee: 80 91 a0 04 lds r24, 0x04A0 ; 0x8004a0 <_ZL12maxttemp_raw.lto_priv.465> 1fdf2: 90 91 a1 04 lds r25, 0x04A1 ; 0x8004a1 <_ZL12maxttemp_raw.lto_priv.465+0x1> 1fdf6: 40 96 adiw r24, 0x10 ; 16 1fdf8: 90 93 a1 04 sts 0x04A1, r25 ; 0x8004a1 <_ZL12maxttemp_raw.lto_priv.465+0x1> 1fdfc: 80 93 a0 04 sts 0x04A0, r24 ; 0x8004a0 <_ZL12maxttemp_raw.lto_priv.465> 1fe00: e8 cf rjmp .-48 ; 0x1fdd2 #endif } #endif //MAXTEMP #ifdef BED_MINTEMP while(analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) { 1fe02: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL16bed_minttemp_raw.lto_priv.473> 1fe06: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL16bed_minttemp_raw.lto_priv.473+0x1> 1fe0a: 0f 94 8e 35 call 0x26b1c ; 0x26b1c 1fe0e: 20 e0 ldi r18, 0x00 ; 0 1fe10: 30 e0 ldi r19, 0x00 ; 0 1fe12: 40 e2 ldi r20, 0x20 ; 32 1fe14: 51 e4 ldi r21, 0x41 ; 65 1fe16: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1fe1a: 87 ff sbrs r24, 7 1fe1c: 0a c0 rjmp .+20 ; 0x1fe32 #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP bed_minttemp_raw += OVERSAMPLENR; #else bed_minttemp_raw -= OVERSAMPLENR; 1fe1e: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL16bed_minttemp_raw.lto_priv.473> 1fe22: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL16bed_minttemp_raw.lto_priv.473+0x1> 1fe26: 40 97 sbiw r24, 0x10 ; 16 1fe28: 90 93 53 02 sts 0x0253, r25 ; 0x800253 <_ZL16bed_minttemp_raw.lto_priv.473+0x1> 1fe2c: 80 93 52 02 sts 0x0252, r24 ; 0x800252 <_ZL16bed_minttemp_raw.lto_priv.473> 1fe30: e8 cf rjmp .-48 ; 0x1fe02 #endif } #endif //BED_MINTEMP #ifdef BED_MAXTEMP while(analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) { 1fe32: 80 91 9e 04 lds r24, 0x049E ; 0x80049e <_ZL16bed_maxttemp_raw.lto_priv.466> 1fe36: 90 91 9f 04 lds r25, 0x049F ; 0x80049f <_ZL16bed_maxttemp_raw.lto_priv.466+0x1> 1fe3a: 0f 94 8e 35 call 0x26b1c ; 0x26b1c 1fe3e: 20 e0 ldi r18, 0x00 ; 0 1fe40: 30 e0 ldi r19, 0x00 ; 0 1fe42: 4a ef ldi r20, 0xFA ; 250 1fe44: 52 e4 ldi r21, 0x42 ; 66 1fe46: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1fe4a: 18 16 cp r1, r24 1fe4c: 54 f4 brge .+20 ; 0x1fe62 #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP bed_maxttemp_raw -= OVERSAMPLENR; #else bed_maxttemp_raw += OVERSAMPLENR; 1fe4e: 80 91 9e 04 lds r24, 0x049E ; 0x80049e <_ZL16bed_maxttemp_raw.lto_priv.466> 1fe52: 90 91 9f 04 lds r25, 0x049F ; 0x80049f <_ZL16bed_maxttemp_raw.lto_priv.466+0x1> 1fe56: 40 96 adiw r24, 0x10 ; 16 1fe58: 90 93 9f 04 sts 0x049F, r25 ; 0x80049f <_ZL16bed_maxttemp_raw.lto_priv.466+0x1> 1fe5c: 80 93 9e 04 sts 0x049E, r24 ; 0x80049e <_ZL16bed_maxttemp_raw.lto_priv.466> 1fe60: e8 cf rjmp .-48 ; 0x1fe32 #endif } #endif //BED_MAXTEMP #ifdef AMBIENT_MINTEMP while(analog2tempAmbient(ambient_minttemp_raw) < AMBIENT_MINTEMP) { 1fe62: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL20ambient_minttemp_raw.lto_priv.464> 1fe66: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL20ambient_minttemp_raw.lto_priv.464+0x1> 1fe6a: 0f 94 f9 34 call 0x269f2 ; 0x269f2 1fe6e: 20 e0 ldi r18, 0x00 ; 0 1fe70: 30 e0 ldi r19, 0x00 ; 0 1fe72: 40 ef ldi r20, 0xF0 ; 240 1fe74: 51 ec ldi r21, 0xC1 ; 193 1fe76: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 1fe7a: 87 ff sbrs r24, 7 1fe7c: 0a c0 rjmp .+20 ; 0x1fe92 #if AMBIENT_RAW_LO_TEMP < AMBIENT_RAW_HI_TEMP ambient_minttemp_raw += OVERSAMPLENR; #else ambient_minttemp_raw -= OVERSAMPLENR; 1fe7e: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL20ambient_minttemp_raw.lto_priv.464> 1fe82: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL20ambient_minttemp_raw.lto_priv.464+0x1> 1fe86: 40 97 sbiw r24, 0x10 ; 16 1fe88: 90 93 51 02 sts 0x0251, r25 ; 0x800251 <_ZL20ambient_minttemp_raw.lto_priv.464+0x1> 1fe8c: 80 93 50 02 sts 0x0250, r24 ; 0x800250 <_ZL20ambient_minttemp_raw.lto_priv.464> 1fe90: e8 cf rjmp .-48 ; 0x1fe62 #endif } #endif //AMBIENT_MINTEMP #ifdef AMBIENT_MAXTEMP while(analog2tempAmbient(ambient_maxttemp_raw) > AMBIENT_MAXTEMP) { 1fe92: 80 91 9c 04 lds r24, 0x049C ; 0x80049c <_ZL20ambient_maxttemp_raw.lto_priv.467> 1fe96: 90 91 9d 04 lds r25, 0x049D ; 0x80049d <_ZL20ambient_maxttemp_raw.lto_priv.467+0x1> 1fe9a: 0f 94 f9 34 call 0x269f2 ; 0x269f2 1fe9e: 20 e0 ldi r18, 0x00 ; 0 1fea0: 30 e0 ldi r19, 0x00 ; 0 1fea2: 40 ea ldi r20, 0xA0 ; 160 1fea4: 52 e4 ldi r21, 0x42 ; 66 1fea6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 1feaa: 18 16 cp r1, r24 1feac: 54 f4 brge .+20 ; 0x1fec2 #if AMBIENT_RAW_LO_TEMP < AMBIENT_RAW_HI_TEMP ambient_maxttemp_raw -= OVERSAMPLENR; #else ambient_maxttemp_raw += OVERSAMPLENR; 1feae: 80 91 9c 04 lds r24, 0x049C ; 0x80049c <_ZL20ambient_maxttemp_raw.lto_priv.467> 1feb2: 90 91 9d 04 lds r25, 0x049D ; 0x80049d <_ZL20ambient_maxttemp_raw.lto_priv.467+0x1> 1feb6: 40 96 adiw r24, 0x10 ; 16 1feb8: 90 93 9d 04 sts 0x049D, r25 ; 0x80049d <_ZL20ambient_maxttemp_raw.lto_priv.467+0x1> 1febc: 80 93 9c 04 sts 0x049C, r24 ; 0x80049c <_ZL20ambient_maxttemp_raw.lto_priv.467> 1fec0: e8 cf rjmp .-48 ; 0x1fe92 #include #include "macros.h" void timer0_init(void) { CRITICAL_SECTION_START; 1fec2: 9f b7 in r25, 0x3f ; 63 1fec4: f8 94 cli TCNT0 = 0; 1fec6: 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; 1fec8: 8f ef ldi r24, 0xFF ; 255 1feca: 88 bd out 0x28, r24 ; 40 // Set fast PWM mode and inverting mode. TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1) | (1 << COM0B0); 1fecc: 83 e3 ldi r24, 0x33 ; 51 1fece: 84 bd out 0x24, r24 ; 36 TCCR0B = (1 << CS01); // CLK/8 prescaling 1fed0: 12 e0 ldi r17, 0x02 ; 2 1fed2: 15 bd out 0x25, r17 ; 37 TIMSK0 |= (1 << TOIE0); // enable timer overflow interrupt 1fed4: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> 1fed8: 81 60 ori r24, 0x01 ; 1 1feda: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e> CRITICAL_SECTION_END; 1fede: 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; 1fee0: 80 e8 ldi r24, 0x80 ; 128 1fee2: 80 93 b4 00 sts 0x00B4, r24 ; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4> ENABLE_SOFT_PWM_INTERRUPT(); 1fee6: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 1feea: 84 60 ori r24, 0x04 ; 4 1feec: 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; 1fef0: 2f b7 in r18, 0x3f ; 63 1fef2: f8 94 cli SET_OUTPUT(BEEPER); 1fef4: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1fef8: 84 60 ori r24, 0x04 ; 4 1fefa: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> WRITE(BEEPER, LOW); 1fefe: 9f b7 in r25, 0x3f ; 63 1ff00: f8 94 cli 1ff02: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1ff06: 8b 7f andi r24, 0xFB ; 251 1ff08: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 1ff0c: 9f bf out 0x3f, r25 ; 63 SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN); 1ff0e: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 1ff12: 80 62 ori r24, 0x20 ; 32 1ff14: 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); 1ff18: 81 e0 ldi r24, 0x01 ; 1 1ff1a: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0> TCCR4B = _BV(WGM43) | _BV(CS42) | _BV(CS40); 1ff1e: 85 e1 ldi r24, 0x15 ; 21 1ff20: 80 93 a1 00 sts 0x00A1, r24 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> OCR4A = 255U; 1ff24: 8f ef ldi r24, 0xFF ; 255 1ff26: 90 e0 ldi r25, 0x00 ; 0 1ff28: 90 93 a9 00 sts 0x00A9, r25 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 1ff2c: 80 93 a8 00 sts 0x00A8, r24 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> OCR4B = 255U; 1ff30: 90 93 ab 00 sts 0x00AB, r25 ; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab> 1ff34: 80 93 aa 00 sts 0x00AA, r24 ; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa> OCR4C = 255U; 1ff38: 90 93 ad 00 sts 0x00AD, r25 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 1ff3c: 80 93 ac 00 sts 0x00AC, r24 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> TIMSK4 = 0; 1ff40: 10 92 72 00 sts 0x0072, r1 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 1ff44: 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")); 1ff46: 8b ee ldi r24, 0xEB ; 235 1ff48: 9c e8 ldi r25, 0x8C ; 140 1ff4a: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff); //disable digital inputs PORTF 1ff4e: 8f e5 ldi r24, 0x5F ; 95 1ff50: 80 93 7e 00 sts 0x007E, r24 ; 0x80007e <__TEXT_REGION_LENGTH__+0x7c207e> DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8); //disable digital inputs PORTK 1ff54: 10 93 7d 00 sts 0x007D, r17 ; 0x80007d <__TEXT_REGION_LENGTH__+0x7c207d> ADMUX |= (1 << REFS0); //use AVCC as reference 1ff58: 80 91 7c 00 lds r24, 0x007C ; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c> 1ff5c: 80 64 ori r24, 0x40 ; 64 1ff5e: 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); 1ff62: 8f e9 ldi r24, 0x9F ; 159 1ff64: 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(); 1ff68: 0e 94 77 8d call 0x11aee ; 0x11aee // initialize temperature timer ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 1ff6c: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 1ff6e: f8 94 cli // CTC TCCRxB &= ~(1< 1ff74: 8f 7e andi r24, 0xEF ; 239 1ff76: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> TCCRxB |= (1< 1ff7e: 88 60 ori r24, 0x08 ; 8 1ff80: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> TCCRxA &= ~(1< 1ff88: 8d 7f andi r24, 0xFD ; 253 1ff8a: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> TCCRxA &= ~(1< 1ff92: 8e 7f andi r24, 0xFE ; 254 1ff94: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> // output mode = 00 (disconnected) TCCRxA &= ~(3< 1ff9c: 8f 73 andi r24, 0x3F ; 63 1ff9e: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> TCCRxA &= ~(3< 1ffa6: 8f 7c andi r24, 0xCF ; 207 1ffa8: 80 93 20 01 sts 0x0120, r24 ; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120> // x/256 prescaler TCCRxB |= (1< 1ffb0: 84 60 ori r24, 0x04 ; 4 1ffb2: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> TCCRxB &= ~(1< 1ffba: 8d 7f andi r24, 0xFD ; 253 1ffbc: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> TCCRxB &= ~(1< 1ffc4: 8e 7f andi r24, 0xFE ; 254 1ffc6: 80 93 21 01 sts 0x0121, r24 ; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121> // reset counter TCNTx = 0; 1ffca: 10 92 25 01 sts 0x0125, r1 ; 0x800125 <__TEXT_REGION_LENGTH__+0x7c2125> 1ffce: 10 92 24 01 sts 0x0124, r1 ; 0x800124 <__TEXT_REGION_LENGTH__+0x7c2124> OCRxA = TEMP_TIM_OCRA_OVF; 1ffd2: 2b ee ldi r18, 0xEB ; 235 1ffd4: 31 e4 ldi r19, 0x41 ; 65 1ffd6: 30 93 29 01 sts 0x0129, r19 ; 0x800129 <__TEXT_REGION_LENGTH__+0x7c2129> 1ffda: 20 93 28 01 sts 0x0128, r18 ; 0x800128 <__TEXT_REGION_LENGTH__+0x7c2128> // clear pending interrupts, enable COMPA TEMP_MGR_INT_FLAG_CLEAR(); 1ffde: d1 9a sbi 0x1a, 1 ; 26 ENABLE_TEMP_MGR_INTERRUPT(); 1ffe0: 80 91 73 00 lds r24, 0x0073 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> 1ffe4: 82 60 ori r24, 0x02 ; 2 1ffe6: 80 93 73 00 sts 0x0073, r24 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 1ffea: 9f bf out 0x3f, r25 ; 63 // SERIAL_ECHOLNPGM("planner_recalculate - 4"); } void plan_init() { block_buffer_head = 0; 1ffec: 10 92 a4 0d sts 0x0DA4, r1 ; 0x800da4 block_buffer_tail = 0; 1fff0: 10 92 a5 0d sts 0x0DA5, r1 ; 0x800da5 memset(position, 0, sizeof(position)); // clear position 1fff4: 80 e1 ldi r24, 0x10 ; 16 1fff6: e2 ea ldi r30, 0xA2 ; 162 1fff8: f6 e0 ldi r31, 0x06 ; 6 1fffa: df 01 movw r26, r30 1fffc: 28 2f mov r18, r24 1fffe: 1d 92 st X+, r1 20000: 2a 95 dec r18 20002: e9 f7 brne .-6 ; 0x1fffe #ifdef LIN_ADVANCE memset(position_float, 0, sizeof(position_float)); // clear position 20004: ec ec ldi r30, 0xCC ; 204 20006: f4 e0 ldi r31, 0x04 ; 4 20008: df 01 movw r26, r30 2000a: 28 2f mov r18, r24 2000c: 1d 92 st X+, r1 2000e: 2a 95 dec r18 20010: e9 f7 brne .-6 ; 0x2000c #endif memset(previous_speed, 0, sizeof(previous_speed)); 20012: ec eb ldi r30, 0xBC ; 188 20014: f4 e0 ldi r31, 0x04 ; 4 20016: df 01 movw r26, r30 20018: 1d 92 st X+, r1 2001a: 8a 95 dec r24 2001c: e9 f7 brne .-6 ; 0x20018 previous_nominal_speed = 0.0; 2001e: 10 92 b8 04 sts 0x04B8, r1 ; 0x8004b8 <_ZL22previous_nominal_speed.lto_priv.490> 20022: 10 92 b9 04 sts 0x04B9, r1 ; 0x8004b9 <_ZL22previous_nominal_speed.lto_priv.490+0x1> 20026: 10 92 ba 04 sts 0x04BA, r1 ; 0x8004ba <_ZL22previous_nominal_speed.lto_priv.490+0x2> 2002a: 10 92 bb 04 sts 0x04BB, r1 ; 0x8004bb <_ZL22previous_nominal_speed.lto_priv.490+0x3> plan_reset_next_e_queue = false; 2002e: 10 92 b7 04 sts 0x04B7, r1 ; 0x8004b7 <_ZL23plan_reset_next_e_queue.lto_priv.488> plan_reset_next_e_sched = false; 20032: 10 92 b6 04 sts 0x04B6, r1 ; 0x8004b6 <_ZL23plan_reset_next_e_sched.lto_priv.489> } void factory_reset() { KEEPALIVE_STATE(PAUSED_FOR_USER); 20036: 84 e0 ldi r24, 0x04 ; 4 20038: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be if (!READ(BTN_ENC)) 2003c: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 20040: 86 fd sbrc r24, 6 20042: ca c0 rjmp .+404 ; 0x201d8 20044: bf ef ldi r27, 0xFF ; 255 20046: e3 ed ldi r30, 0xD3 ; 211 20048: f0 e3 ldi r31, 0x30 ; 48 2004a: b1 50 subi r27, 0x01 ; 1 2004c: e0 40 sbci r30, 0x00 ; 0 2004e: f0 40 sbci r31, 0x00 ; 0 20050: e1 f7 brne .-8 ; 0x2004a 20052: 00 c0 rjmp .+0 ; 0x20054 20054: 00 00 nop { _delay_ms(1000); if (!READ(BTN_ENC)) 20056: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 2005a: 86 fd sbrc r24, 6 2005c: bd c0 rjmp .+378 ; 0x201d8 { lcd_clear(); 2005e: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_P(PSTR("Factory RESET")); 20062: 85 e4 ldi r24, 0x45 ; 69 20064: 9d e8 ldi r25, 0x8D ; 141 20066: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 SET_OUTPUT(BEEPER); 2006a: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 2006e: 84 60 ori r24, 0x04 ; 4 20070: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> if(eSoundMode!=e_SOUND_MODE_SILENT) 20074: 80 91 dd 04 lds r24, 0x04DD ; 0x8004dd 20078: 82 30 cpi r24, 0x02 ; 2 2007a: 41 f0 breq .+16 ; 0x2008c WRITE(BEEPER, HIGH); 2007c: 9f b7 in r25, 0x3f ; 63 2007e: f8 94 cli 20080: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20084: 84 60 ori r24, 0x04 ; 4 20086: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2008a: 9f bf out 0x3f, r25 ; 63 while (!READ(BTN_ENC)); 2008c: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 20090: 86 ff sbrs r24, 6 20092: fc cf rjmp .-8 ; 0x2008c WRITE(BEEPER, LOW); 20094: 9f b7 in r25, 0x3f ; 63 20096: f8 94 cli 20098: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2009c: 8b 7f andi r24, 0xFB ; 251 2009e: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 200a2: 9f bf out 0x3f, r25 ; 63 200a4: 2f ef ldi r18, 0xFF ; 255 200a6: 37 ea ldi r19, 0xA7 ; 167 200a8: 81 e6 ldi r24, 0x61 ; 97 200aa: 21 50 subi r18, 0x01 ; 1 200ac: 30 40 sbci r19, 0x00 ; 0 200ae: 80 40 sbci r24, 0x00 ; 0 200b0: e1 f7 brne .-8 ; 0x200aa 200b2: 00 c0 rjmp .+0 ; 0x200b4 200b4: 00 00 nop PSTR("Language"), PSTR("Statistics"), PSTR("Shipping prep"), PSTR("Service prep"), PSTR("All Data"), }; 200b6: 8b e2 ldi r24, 0x2B ; 43 200b8: 9d e8 ldi r25, 0x8D ; 141 200ba: 9a 83 std Y+2, r25 ; 0x02 200bc: 89 83 std Y+1, r24 ; 0x01 200be: 80 e2 ldi r24, 0x20 ; 32 200c0: 9d e8 ldi r25, 0x8D ; 141 200c2: 9c 83 std Y+4, r25 ; 0x04 200c4: 8b 83 std Y+3, r24 ; 0x03 200c6: 82 e1 ldi r24, 0x12 ; 18 200c8: 9d e8 ldi r25, 0x8D ; 141 200ca: 9e 83 std Y+6, r25 ; 0x06 200cc: 8d 83 std Y+5, r24 ; 0x05 200ce: 85 e0 ldi r24, 0x05 ; 5 200d0: 9d e8 ldi r25, 0x8D ; 141 200d2: 98 87 std Y+8, r25 ; 0x08 200d4: 8f 83 std Y+7, r24 ; 0x07 200d6: 8c ef ldi r24, 0xFC ; 252 200d8: 9c e8 ldi r25, 0x8C ; 140 200da: 9a 87 std Y+10, r25 ; 0x0a 200dc: 89 87 std Y+9, r24 ; 0x09 lcd_clear(); 200de: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_putc_at(0, 0, '>'); 200e2: 4e e3 ldi r20, 0x3E ; 62 200e4: 60 e0 ldi r22, 0x00 ; 0 200e6: 80 e0 ldi r24, 0x00 ; 0 200e8: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_consume_click(); 200ec: 0e 94 90 70 call 0xe120 ; 0xe120 } } char reset_menu() { static int8_t first = 0; char cursor_pos = 0; 200f0: 10 e0 ldi r17, 0x00 ; 0 200f2: d1 2c mov r13, r1 200f4: 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]); 200f6: 80 91 dc 04 lds r24, 0x04DC ; 0x8004dc 200fa: f6 01 movw r30, r12 200fc: e8 0f add r30, r24 200fe: f1 1d adc r31, r1 20100: 87 fd sbrc r24, 7 20102: fa 95 dec r31 20104: ee 0f add r30, r30 20106: ff 1f adc r31, r31 20108: a1 e0 ldi r26, 0x01 ; 1 2010a: b0 e0 ldi r27, 0x00 ; 0 2010c: ac 0f add r26, r28 2010e: bd 1f adc r27, r29 20110: ea 0f add r30, r26 20112: fb 1f adc r31, r27 20114: 40 81 ld r20, Z 20116: 51 81 ldd r21, Z+1 ; 0x01 20118: 6c 2d mov r22, r12 2011a: 81 e0 ldi r24, 0x01 ; 1 2011c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 20120: bf ef ldi r27, 0xFF ; 255 20122: cb 1a sub r12, r27 20124: db 0a sbc r13, r27 lcd_clear(); lcd_putc_at(0, 0, '>'); lcd_consume_click(); while (1) { for (uint_least8_t i = 0; i < 4; i++) { 20126: e4 e0 ldi r30, 0x04 ; 4 20128: ce 16 cp r12, r30 2012a: d1 04 cpc r13, r1 2012c: 21 f7 brne .-56 ; 0x200f6 lcd_puts_at_P(1, i, item[first + i]); } manage_heater(); 2012e: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 20132: 81 e0 ldi r24, 0x01 ; 1 20134: 0e 94 4f 8a call 0x1149e ; 0x1149e if (lcd_encoder) { 20138: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 2013c: 90 91 70 06 lds r25, 0x0670 ; 0x800670 20140: 00 97 sbiw r24, 0x00 ; 0 20142: 71 f1 breq .+92 ; 0x201a0 if (lcd_encoder < 0) { 20144: 97 ff sbrs r25, 7 20146: 12 c0 rjmp .+36 ; 0x2016c cursor_pos--; 20148: 11 50 subi r17, 0x01 ; 1 if (lcd_encoder > 0) { cursor_pos++; } if (cursor_pos > 3) { 2014a: 14 30 cpi r17, 0x04 ; 4 2014c: 0c f4 brge .+2 ; 0x20150 2014e: a6 c0 rjmp .+332 ; 0x2029c cursor_pos = 3; Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 20150: 87 e0 ldi r24, 0x07 ; 7 20152: 0f 94 c8 4e call 0x29d90 ; 0x29d90 if (first < (uint8_t)(sizeof(item) / sizeof(item[0])) - 4) { 20156: 80 91 dc 04 lds r24, 0x04DC ; 0x8004dc 2015a: 18 16 cp r1, r24 2015c: 2c f0 brlt .+10 ; 0x20168 first++; 2015e: 8f 5f subi r24, 0xFF ; 255 20160: 80 93 dc 04 sts 0x04DC, r24 ; 0x8004dc lcd_clear(); 20164: 0e 94 ab 6e call 0xdd56 ; 0xdd56 if (lcd_encoder > 0) { cursor_pos++; } if (cursor_pos > 3) { cursor_pos = 3; 20168: 13 e0 ldi r17, 0x03 ; 3 2016a: 03 c0 rjmp .+6 ; 0x20172 if (lcd_encoder < 0) { cursor_pos--; } if (lcd_encoder > 0) { cursor_pos++; 2016c: 1f 5f subi r17, 0xFF ; 255 } if (cursor_pos > 3) { 2016e: 14 30 cpi r17, 0x04 ; 4 20170: 78 f7 brcc .-34 ; 0x20150 if (first > 0) { first--; lcd_clear(); } } lcd_puts_at_P(0, 0, PSTR(" \n \n \n ")); 20172: 44 ef ldi r20, 0xF4 ; 244 20174: 5c e8 ldi r21, 0x8C ; 140 20176: 60 e0 ldi r22, 0x00 ; 0 20178: 80 e0 ldi r24, 0x00 ; 0 2017a: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(0, cursor_pos); 2017e: 61 2f mov r22, r17 20180: 80 e0 ldi r24, 0x00 ; 0 20182: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_putc('>'); 20186: 8e e3 ldi r24, 0x3E ; 62 20188: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_encoder = 0; 2018c: 10 92 70 06 sts 0x0670, r1 ; 0x800670 20190: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f _delay(100); 20194: 64 e6 ldi r22, 0x64 ; 100 20196: 70 e0 ldi r23, 0x00 ; 0 20198: 80 e0 ldi r24, 0x00 ; 0 2019a: 90 e0 ldi r25, 0x00 ; 0 2019c: 0f 94 2f 28 call 0x2505e ; 0x2505e } if (lcd_clicked()) { 201a0: 0e 94 95 70 call 0xe12a ; 0xe12a 201a4: 88 23 and r24, r24 201a6: 09 f4 brne .+2 ; 0x201aa 201a8: a4 cf rjmp .-184 ; 0x200f2 return(cursor_pos + first); 201aa: 80 91 dc 04 lds r24, 0x04DC ; 0x8004dc 201ae: 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(); 201b0: 0e 94 ab 6e call 0xdd56 ; 0xdd56 Sound_MakeCustom(100,0,false); 201b4: 40 e0 ldi r20, 0x00 ; 0 201b6: 70 e0 ldi r23, 0x00 ; 0 201b8: 60 e0 ldi r22, 0x00 ; 0 201ba: 84 e6 ldi r24, 0x64 ; 100 201bc: 90 e0 ldi r25, 0x00 ; 0 201be: 0f 94 3d 52 call 0x2a47a ; 0x2a47a switch (level) { 201c2: 12 30 cpi r17, 0x02 ; 2 201c4: 09 f4 brne .+2 ; 0x201c8 201c6: a0 c0 rjmp .+320 ; 0x20308 201c8: 08 f0 brcs .+2 ; 0x201cc 201ca: 79 c0 rjmp .+242 ; 0x202be 201cc: 11 23 and r17, r17 201ce: 09 f4 brne .+2 ; 0x201d2 201d0: 93 c0 rjmp .+294 ; 0x202f8 201d2: 11 30 cpi r17, 0x01 ; 1 201d4: 09 f4 brne .+2 ; 0x201d8 201d6: 93 c0 rjmp .+294 ; 0x202fe case 4: _delay_ms(0); break; } } } KEEPALIVE_STATE(IN_HANDLER); 201d8: 82 e0 ldi r24, 0x02 ; 2 201da: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be plan_init(); // Initialize planner; factory_reset(); eeprom_init_default_byte((uint8_t*)EEPROM_SILENT, SILENT_MODE_OFF); 201de: 60 e0 ldi r22, 0x00 ; 0 201e0: 8f ef ldi r24, 0xFF ; 255 201e2: 9f e0 ldi r25, 0x0F ; 15 201e4: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard if uninitialized 201e8: 61 e0 ldi r22, 0x01 ; 1 201ea: 8f e5 ldi r24, 0x5F ; 95 201ec: 9f e0 ldi r25, 0x0F ; 15 201ee: 0e 94 a1 75 call 0xeb42 ; 0xeb42 #ifdef TMC2130 uint8_t silentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); 201f2: 8f ef ldi r24, 0xFF ; 255 201f4: 9f e0 ldi r25, 0x0F ; 15 201f6: 0f 94 10 dc call 0x3b820 ; 0x3b820 201fa: 18 2f mov r17, r24 if (silentMode == 0xff) silentMode = 0; 201fc: 8f 3f cpi r24, 0xFF ; 255 201fe: 09 f4 brne .+2 ; 0x20202 20200: 10 e0 ldi r17, 0x00 ; 0 tmc2130_mode = TMC2130_MODE_NORMAL; 20202: 10 92 8b 06 sts 0x068B, r1 ; 0x80068b tmc2130_sg_stop_on_crash = eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_DET, farm_mode ? false : true); 20206: 61 e0 ldi r22, 0x01 ; 1 20208: 89 e6 ldi r24, 0x69 ; 105 2020a: 9f e0 ldi r25, 0x0F ; 15 2020c: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20210: 91 e0 ldi r25, 0x01 ; 1 20212: 81 11 cpse r24, r1 20214: 01 c0 rjmp .+2 ; 0x20218 20216: 90 e0 ldi r25, 0x00 ; 0 20218: 90 93 5c 02 sts 0x025C, r25 ; 0x80025c if (tmc2130_sg_stop_on_crash) { 2021c: 88 23 and r24, r24 2021e: 09 f4 brne .+2 ; 0x20222 20220: a5 c0 rjmp .+330 ; 0x2036c puts_P(_N("CrashDetect ENABLED!")); 20222: 89 e8 ldi r24, 0x89 ; 137 20224: 9c e6 ldi r25, 0x6C ; 108 } else { puts_P(_N("CrashDetect DISABLED")); 20226: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 } #ifdef TMC2130_LINEARITY_CORRECTION #ifdef TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_wave_fac[X_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC); 2022a: 87 ef ldi r24, 0xF7 ; 247 2022c: 9e e0 ldi r25, 0x0E ; 14 2022e: 0f 94 10 dc call 0x3b820 ; 0x3b820 20232: c8 2e mov r12, r24 20234: 80 93 f8 04 sts 0x04F8, r24 ; 0x8004f8 tmc2130_wave_fac[Y_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Y_FAC); 20238: 86 ef ldi r24, 0xF6 ; 246 2023a: 9e e0 ldi r25, 0x0E ; 14 2023c: 0f 94 10 dc call 0x3b820 ; 0x3b820 20240: d8 2e mov r13, r24 20242: 80 93 f9 04 sts 0x04F9, r24 ; 0x8004f9 tmc2130_wave_fac[Z_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Z_FAC); 20246: 85 ef ldi r24, 0xF5 ; 245 20248: 9e e0 ldi r25, 0x0E ; 14 2024a: 0f 94 10 dc call 0x3b820 ; 0x3b820 2024e: e8 2e mov r14, r24 20250: 80 93 fa 04 sts 0x04FA, r24 ; 0x8004fa #endif //TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_wave_fac[E_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_E_FAC); 20254: 84 ef ldi r24, 0xF4 ; 244 20256: 9e e0 ldi r25, 0x0E ; 14 20258: 0f 94 10 dc call 0x3b820 ; 0x3b820 2025c: 80 93 fb 04 sts 0x04FB, r24 ; 0x8004fb if (tmc2130_wave_fac[X_AXIS] == 0xff) tmc2130_wave_fac[X_AXIS] = 0; 20260: 2f ef ldi r18, 0xFF ; 255 20262: c2 12 cpse r12, r18 20264: 02 c0 rjmp .+4 ; 0x2026a 20266: 10 92 f8 04 sts 0x04F8, r1 ; 0x8004f8 if (tmc2130_wave_fac[Y_AXIS] == 0xff) tmc2130_wave_fac[Y_AXIS] = 0; 2026a: 3f ef ldi r19, 0xFF ; 255 2026c: d3 12 cpse r13, r19 2026e: 02 c0 rjmp .+4 ; 0x20274 20270: 10 92 f9 04 sts 0x04F9, r1 ; 0x8004f9 if (tmc2130_wave_fac[Z_AXIS] == 0xff) tmc2130_wave_fac[Z_AXIS] = 0; 20274: 9f ef ldi r25, 0xFF ; 255 20276: e9 12 cpse r14, r25 20278: 02 c0 rjmp .+4 ; 0x2027e 2027a: 10 92 fa 04 sts 0x04FA, r1 ; 0x8004fa if (tmc2130_wave_fac[E_AXIS] == 0xff) tmc2130_wave_fac[E_AXIS] = 0; 2027e: 8f 3f cpi r24, 0xFF ; 255 20280: 11 f4 brne .+4 ; 0x20286 20282: 10 92 fb 04 sts 0x04FB, r1 ; 0x8004fb #endif //TMC2130_LINEARITY_CORRECTION #ifdef TMC2130_VARIABLE_RESOLUTION tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[X_AXIS]); 20286: 80 91 79 0e lds r24, 0x0E79 ; 0x800e79 2028a: 90 e0 ldi r25, 0x00 ; 0 //printf_P(PSTR("MSLUT[%d]=%08lx\n"), i, val); } uint8_t tmc2130_usteps2mres(uint16_t usteps) { uint8_t mres = 8; while (usteps >>= 1) mres--; 2028c: 28 e0 ldi r18, 0x08 ; 8 2028e: 96 95 lsr r25 20290: 87 95 ror r24 20292: 00 97 sbiw r24, 0x00 ; 0 20294: 09 f4 brne .+2 ; 0x20298 20296: 6d c0 rjmp .+218 ; 0x20372 20298: 21 50 subi r18, 0x01 ; 1 2029a: f9 cf rjmp .-14 ; 0x2028e first++; lcd_clear(); } } if (cursor_pos < 0) { 2029c: 1f 3f cpi r17, 0xFF ; 255 2029e: 09 f0 breq .+2 ; 0x202a2 202a0: 68 cf rjmp .-304 ; 0x20172 cursor_pos = 0; Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 202a2: 87 e0 ldi r24, 0x07 ; 7 202a4: 0f 94 c8 4e call 0x29d90 ; 0x29d90 if (first > 0) { 202a8: 80 91 dc 04 lds r24, 0x04DC ; 0x8004dc 202ac: 18 16 cp r1, r24 202ae: 2c f4 brge .+10 ; 0x202ba first--; 202b0: 81 50 subi r24, 0x01 ; 1 202b2: 80 93 dc 04 sts 0x04DC, r24 ; 0x8004dc lcd_clear(); 202b6: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_clear(); } } if (cursor_pos < 0) { cursor_pos = 0; 202ba: 10 e0 ldi r17, 0x00 ; 0 202bc: 5a cf rjmp .-332 ; 0x20172 // Level input parameter sets depth of reset static void factory_reset(char level) { lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { 202be: 13 30 cpi r17, 0x03 ; 3 202c0: 29 f1 breq .+74 ; 0x2030c 202c2: 14 30 cpi r17, 0x04 ; 4 202c4: 09 f0 breq .+2 ; 0x202c8 202c6: 88 cf rjmp .-240 ; 0x201d8 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) #endif //FILAMENT_SENSOR break; case 4: menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data")); 202c8: 64 e3 ldi r22, 0x34 ; 52 202ca: 7d e8 ldi r23, 0x8D ; 141 202cc: 80 e0 ldi r24, 0x00 ; 0 202ce: 90 e1 ldi r25, 0x10 ; 16 202d0: 0f 94 ec cf call 0x39fd8 ; 0x39fd8 // Erase EEPROM for (uint16_t i = 0; i < EEPROM_TOP; i++) { 202d4: 10 e0 ldi r17, 0x00 ; 0 202d6: 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); 202d8: 6f ef ldi r22, 0xFF ; 255 202da: c8 01 movw r24, r16 202dc: 0f 94 34 dc call 0x3b868 ; 0x3b868 eeprom_update_byte_notify((uint8_t*)i, 0xFF); menu_progressbar_update(i); 202e0: c8 01 movw r24, r16 202e2: 0f 94 bd cf call 0x39f7a ; 0x39f7a break; case 4: menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data")); // Erase EEPROM for (uint16_t i = 0; i < EEPROM_TOP; i++) { 202e6: 0f 5f subi r16, 0xFF ; 255 202e8: 1f 4f sbci r17, 0xFF ; 255 202ea: 01 15 cp r16, r1 202ec: f0 e1 ldi r31, 0x10 ; 16 202ee: 1f 07 cpc r17, r31 202f0: 99 f7 brne .-26 ; 0x202d8 eeprom_update_byte_notify((uint8_t*)i, 0xFF); menu_progressbar_update(i); } menu_progressbar_finish(); 202f2: 0f 94 de cf call 0x39fbc ; 0x39fbc 202f6: 40 cc rjmp .-1920 ; 0x1fb78 lcd_clear(); Sound_MakeCustom(100,0,false); switch (level) { case 0: // Level 0: Language reset lang_reset(); 202f8: 0e 94 c4 70 call 0xe188 ; 0xe188 202fc: 6d cf rjmp .-294 ; 0x201d8 break; case 1: //Level 1: Reset statistics factory_reset_stats(); 202fe: 0e 94 a9 66 call 0xcd52 ; 0xcd52 lcd_menu_statistics(); 20302: 0f 94 ad 3f call 0x27f5a ; 0x27f5a 20306: 68 cf rjmp .-304 ; 0x201d8 break; case 2: // Level 2: Prepare for shipping factory_reset_stats(); 20308: 0e 94 a9 66 call 0xcd52 ; 0xcd52 // FALLTHRU case 3: // Level 3: Preparation after being serviced // Force language selection at the next boot up. lang_reset(); 2030c: 0e 94 c4 70 call 0xe188 ; 0xe188 // Force the wizard in "Follow calibration flow" mode at the next boot up calibration_status_clear(CALIBRATION_FORCE_PREP); 20310: 84 e0 ldi r24, 0x04 ; 4 20312: 0e 94 f6 ee call 0x1ddec ; 0x1ddec 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); 20316: 62 e0 ldi r22, 0x02 ; 2 20318: 8f e5 ldi r24, 0x5F ; 95 2031a: 9f e0 ldi r25, 0x0F ; 15 2031c: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 eeprom_write_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 2); farm_disable(); #ifdef FILAMENT_SENSOR fsensor.setEnabled(true); 20320: 81 e0 ldi r24, 0x01 ; 1 20322: 0e 94 67 74 call 0xe8ce ; 0xe8ce fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 20326: 11 e0 ldi r17, 0x01 ; 1 20328: 10 93 aa 17 sts 0x17AA, r17 ; 0x8017aa if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2032c: 61 e0 ldi r22, 0x01 ; 1 2032e: 87 e0 ldi r24, 0x07 ; 7 20330: 9f e0 ldi r25, 0x0F ; 15 20332: 0f 94 34 dc call 0x3b868 ; 0x3b868 eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state); } } void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) { runoutEnabled = state; 20336: 10 93 ab 17 sts 0x17AB, r17 ; 0x8017ab 2033a: 61 e0 ldi r22, 0x01 ; 1 2033c: 85 ed ldi r24, 0xD5 ; 213 2033e: 9e e0 ldi r25, 0x0E ; 14 20340: 0f 94 34 dc call 0x3b868 ; 0x3b868 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 20344: 10 93 b7 17 sts 0x17B7, r17 ; 0x8017b7 oldPos = pat9125_y; 20348: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 2034c: 90 91 8f 0e lds r25, 0x0E8F ; 0x800e8f 20350: 90 93 b9 17 sts 0x17B9, r25 ; 0x8017b9 20354: 80 93 b8 17 sts 0x17B8, r24 ; 0x8017b8 resetStepCount(); 20358: 0f 94 e1 7b call 0x2f7c2 ; 0x2f7c2 jamErrCnt = 0; 2035c: 10 92 be 17 sts 0x17BE, r1 ; 0x8017be 20360: 61 e0 ldi r22, 0x01 ; 1 20362: 8d ea ldi r24, 0xAD ; 173 20364: 9c e0 ldi r25, 0x0C ; 12 20366: 0f 94 34 dc call 0x3b868 ; 0x3b868 2036a: 36 cf rjmp .-404 ; 0x201d8 tmc2130_sg_stop_on_crash = eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_DET, farm_mode ? false : true); if (tmc2130_sg_stop_on_crash) { puts_P(_N("CrashDetect ENABLED!")); } else { puts_P(_N("CrashDetect DISABLED")); 2036c: 84 e7 ldi r24, 0x74 ; 116 2036e: 9c e6 ldi r25, 0x6C ; 108 20370: 5a cf rjmp .-332 ; 0x20226 if (tmc2130_wave_fac[Z_AXIS] == 0xff) tmc2130_wave_fac[Z_AXIS] = 0; if (tmc2130_wave_fac[E_AXIS] == 0xff) tmc2130_wave_fac[E_AXIS] = 0; #endif //TMC2130_LINEARITY_CORRECTION #ifdef TMC2130_VARIABLE_RESOLUTION tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[X_AXIS]); 20372: 20 93 f4 04 sts 0x04F4, r18 ; 0x8004f4 tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Y_AXIS]); 20376: 80 91 7a 0e lds r24, 0x0E7A ; 0x800e7a 2037a: 90 e0 ldi r25, 0x00 ; 0 2037c: 28 e0 ldi r18, 0x08 ; 8 2037e: 96 95 lsr r25 20380: 87 95 ror r24 20382: 00 97 sbiw r24, 0x00 ; 0 20384: 11 f0 breq .+4 ; 0x2038a 20386: 21 50 subi r18, 0x01 ; 1 20388: fa cf rjmp .-12 ; 0x2037e 2038a: 20 93 f5 04 sts 0x04F5, r18 ; 0x8004f5 tmc2130_mres[Z_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Z_AXIS]); 2038e: 80 91 7b 0e lds r24, 0x0E7B ; 0x800e7b 20392: 90 e0 ldi r25, 0x00 ; 0 20394: 28 e0 ldi r18, 0x08 ; 8 20396: 96 95 lsr r25 20398: 87 95 ror r24 2039a: 00 97 sbiw r24, 0x00 ; 0 2039c: 11 f0 breq .+4 ; 0x203a2 2039e: 21 50 subi r18, 0x01 ; 1 203a0: fa cf rjmp .-12 ; 0x20396 203a2: 20 93 f6 04 sts 0x04F6, r18 ; 0x8004f6 tmc2130_mres[E_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[E_AXIS]); 203a6: 80 91 7c 0e lds r24, 0x0E7C ; 0x800e7c 203aa: 90 e0 ldi r25, 0x00 ; 0 203ac: 28 e0 ldi r18, 0x08 ; 8 203ae: 96 95 lsr r25 203b0: 87 95 ror r24 203b2: 00 97 sbiw r24, 0x00 ; 0 203b4: 11 f0 breq .+4 ; 0x203ba 203b6: 21 50 subi r18, 0x01 ; 1 203b8: fa cf rjmp .-12 ; 0x203ae 203ba: 20 93 f7 04 sts 0x04F7, r18 ; 0x8004f7 return ( eeprom_read_byte((uint8_t *)EEPROM_ECOOL_ENABLE) == EEPROM_ECOOL_MAGIC_NUMBER ) && ( eeprom_read_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY) == 1 ); } bool FarmOrUserECool(){ return farm_mode || UserECoolEnabled(); 203be: 0e 94 8a f0 call 0x1e114 ; 0x1e114 203c2: 88 0f add r24, r24 #endif // LIN_ADVANCE void st_init() { #ifdef TMC2130 tmc2130_init(TMCInitParams(false, FarmOrUserECool())); 203c4: 82 70 andi r24, 0x02 ; 2 203c6: 0f 94 3c 27 call 0x24e78 ; 0x24e78 microstep_init(); //Initialize Microstepping Pins #endif //TMC2130 //Initialize Dir Pins #if defined(X_DIR_PIN) && X_DIR_PIN > -1 SET_OUTPUT(X_DIR_PIN); 203ca: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 203ce: 81 60 ori r24, 0x01 ; 1 203d0: 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); 203d4: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 203d8: 82 60 ori r24, 0x02 ; 2 203da: 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); 203de: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 203e2: 84 60 ori r24, 0x04 ; 4 203e4: 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); 203e8: 80 91 0a 01 lds r24, 0x010A ; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a> 203ec: 80 64 ori r24, 0x40 ; 64 203ee: 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); 203f2: 0f 9a sbi 0x01, 7 ; 1 if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH); 203f4: 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); 203f6: 0e 9a sbi 0x01, 6 ; 1 if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH); 203f8: 16 9a sbi 0x02, 6 ; 2 #endif #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1 SET_OUTPUT(Z_ENABLE_PIN); 203fa: 0d 9a sbi 0x01, 5 ; 1 if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH); 203fc: 15 9a sbi 0x02, 5 ; 2 #endif #if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1) SET_OUTPUT(E0_ENABLE_PIN); 203fe: 0c 9a sbi 0x01, 4 ; 1 if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH); 20400: 14 9a sbi 0x02, 4 ; 2 #endif //endstops and pullups #if defined(X_MIN_PIN) && X_MIN_PIN > -1 SET_INPUT(X_MIN_PIN); 20402: 26 98 cbi 0x04, 6 ; 4 #ifdef ENDSTOPPULLUP_XMIN WRITE(X_MIN_PIN,HIGH); 20404: 2e 9a sbi 0x05, 6 ; 5 #endif #endif #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 SET_INPUT(Y_MIN_PIN); 20406: 25 98 cbi 0x04, 5 ; 4 #ifdef ENDSTOPPULLUP_YMIN WRITE(Y_MIN_PIN,HIGH); 20408: 2d 9a sbi 0x05, 5 ; 5 #endif #endif #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 SET_INPUT(Z_MIN_PIN); 2040a: 24 98 cbi 0x04, 4 ; 4 #ifdef ENDSTOPPULLUP_ZMIN WRITE(Z_MIN_PIN,HIGH); 2040c: 2c 9a sbi 0x05, 4 ; 5 #endif #endif #if defined(X_MAX_PIN) && X_MAX_PIN > -1 SET_INPUT(X_MAX_PIN); 2040e: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 20412: 8b 7f andi r24, 0xFB ; 251 20414: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> #ifdef ENDSTOPPULLUP_XMAX WRITE(X_MAX_PIN,HIGH); 20418: 9f b7 in r25, 0x3f ; 63 2041a: f8 94 cli 2041c: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 20420: 84 60 ori r24, 0x04 ; 4 20422: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 20426: 9f bf out 0x3f, r25 ; 63 #endif #endif #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 SET_INPUT(Y_MAX_PIN); 20428: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 2042c: 8f 77 andi r24, 0x7F ; 127 2042e: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> #ifdef ENDSTOPPULLUP_YMAX WRITE(Y_MAX_PIN,HIGH); 20432: 9f b7 in r25, 0x3f ; 63 20434: f8 94 cli 20436: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 2043a: 80 68 ori r24, 0x80 ; 128 2043c: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 20440: 9f bf out 0x3f, r25 ; 63 #endif #endif #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 SET_INPUT(Z_MAX_PIN); 20442: 09 98 cbi 0x01, 1 ; 1 #ifdef ENDSTOPPULLUP_ZMAX WRITE(Z_MAX_PIN,HIGH); 20444: 11 9a sbi 0x02, 1 ; 2 #endif #endif #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1)) SET_INPUT(TACH_0); 20446: 6e 98 cbi 0x0d, 6 ; 13 #endif //Initialize Step Pins #if defined(X_STEP_PIN) && (X_STEP_PIN > -1) SET_OUTPUT(X_STEP_PIN); 20448: 38 9a sbi 0x07, 0 ; 7 WRITE(X_STEP_PIN,INVERT_X_STEP_PIN); 2044a: 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(); 2044c: 17 9a sbi 0x02, 7 ; 2 2044e: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e 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); 20452: 39 9a sbi 0x07, 1 ; 7 WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN); 20454: 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(); 20456: 16 9a sbi 0x02, 6 ; 2 20458: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f #endif #if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) SET_OUTPUT(Z_STEP_PIN); 2045c: 3a 9a sbi 0x07, 2 ; 7 WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN); 2045e: 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); 20460: 3b 9a sbi 0x07, 3 ; 7 WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN); 20462: 43 98 cbi 0x08, 3 ; 8 disable_e0(); 20464: 14 9a sbi 0x02, 4 ; 2 #endif // waveform generation = 0100 = CTC TCCR1B &= ~(1< 2046a: 8f 7e andi r24, 0xEF ; 239 2046c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> TCCR1B |= (1< 20474: 88 60 ori r24, 0x08 ; 8 20476: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> TCCR1A &= ~(1< 2047e: 8d 7f andi r24, 0xFD ; 253 20480: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> TCCR1A &= ~(1< 20488: 8e 7f andi r24, 0xFE ; 254 2048a: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> // output mode = 00 (disconnected) TCCR1A &= ~(3< 20492: 8f 73 andi r24, 0x3F ; 63 20494: 80 93 80 00 sts 0x0080, r24 ; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080> TCCR1A &= ~(3< 2049c: 8f 7c andi r24, 0xCF ; 207 2049e: 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< 204a6: 88 7f andi r24, 0xF8 ; 248 204a8: 82 60 ori r24, 0x02 ; 2 204aa: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081> // Plan the first interrupt after 8ms from now. OCR1A = 0x4000; 204ae: 80 e0 ldi r24, 0x00 ; 0 204b0: 90 e4 ldi r25, 0x40 ; 64 204b2: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 204b6: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> TCNT1 = 0; 204ba: 10 92 85 00 sts 0x0085, r1 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 204be: 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; 204c2: 10 92 e5 04 sts 0x04E5, r1 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 204c6: 10 92 e4 04 sts 0x04E4, r1 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> nextAdvanceISR = ADV_NEVER; 204ca: 8f ef ldi r24, 0xFF ; 255 204cc: 9f ef ldi r25, 0xFF ; 255 204ce: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 204d2: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> main_Rate = ADV_NEVER; 204d6: 90 93 e1 04 sts 0x04E1, r25 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> 204da: 80 93 e0 04 sts 0x04E0, r24 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> current_adv_steps = 0; 204de: 10 92 df 04 sts 0x04DF, r1 ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 204e2: 10 92 de 04 sts 0x04DE, r1 ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> } bool enable_endstops(bool check) { bool old = check_endstops; check_endstops = check; 204e6: 81 e0 ldi r24, 0x01 ; 1 204e8: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> current_adv_steps = 0; #endif enable_endstops(true); // Start with endstops active. After homing they can be disabled ENABLE_STEPPER_DRIVER_INTERRUPT(); 204ec: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 204f0: 82 60 ori r24, 0x02 ; 2 204f2: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> sei(); 204f6: 78 94 sei #endif //TMC2130 st_init(); // Initialize stepper, this enables interrupts! #ifdef TMC2130 tmc2130_mode = silentMode?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL; 204f8: 81 e0 ldi r24, 0x01 ; 1 204fa: 11 11 cpse r17, r1 204fc: 01 c0 rjmp .+2 ; 0x20500 204fe: 80 e0 ldi r24, 0x00 ; 0 20500: 80 93 8b 06 sts 0x068B, r24 ; 0x80068b update_mode_profile(); 20504: 0f 94 98 64 call 0x2c930 ; 0x2c930 20508: 0e 94 8a f0 call 0x1e114 ; 0x1e114 2050c: 88 0f add r24, r24 tmc2130_init(TMCInitParams(false, FarmOrUserECool() )); 2050e: 82 70 andi r24, 0x02 ; 2 20510: 0f 94 3c 27 call 0x24e78 ; 0x24e78 setup_photpin(); // Reset the machine correction matrix. // It does not make sense to load the correction matrix until the machine is homed. world2machine_reset(); 20514: 0f 94 f1 cd call 0x39be2 ; 0x39be2 // Initialize current_position accounting for software endstops to // avoid unexpected initial shifts on the first move clamp_to_software_endstops(current_position); 20518: 81 e9 ldi r24, 0x91 ; 145 2051a: 96 e0 ldi r25, 0x06 ; 6 2051c: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 plan_set_position_curposXYZE(); 20520: 0f 94 fd be call 0x37dfa ; 0x37dfa // Show the xflash error message now that serial, lcd and encoder are available if (!xflash_success) 20524: b1 10 cpse r11, r1 20526: 08 c0 rjmp .+16 ; 0x20538 } static void xflash_err_msg() { puts_P(_n("XFLASH not responding.")); 20528: 81 ed ldi r24, 0xD1 ; 209 2052a: 9b e6 ldi r25, 0x6B ; 107 2052c: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 lcd_show_fullscreen_message_and_wait_P(_n("External SPI flash\nXFLASH is not res-\nponding. Language\nswitch unavailable.")); 20530: 85 e8 ldi r24, 0x85 ; 133 20532: 9b e6 ldi r25, 0x6B ; 107 20534: 0f 94 cd 20 call 0x2419a ; 0x2419a } #define KILL_PENDING_FLAG 0x42 static void fw_kill_init() { if (eeprom_read_byte((uint8_t*)EEPROM_KILL_PENDING_FLAG) == KILL_PENDING_FLAG) { 20538: 84 e9 ldi r24, 0x94 ; 148 2053a: 9c e0 ldi r25, 0x0C ; 12 2053c: 0f 94 10 dc call 0x3b820 ; 0x3b820 20540: 82 34 cpi r24, 0x42 ; 66 20542: 59 f4 brne .+22 ; 0x2055a 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); 20544: 6f ef ldi r22, 0xFF ; 255 20546: 84 e9 ldi r24, 0x94 ; 148 20548: 9c e0 ldi r25, 0x0C ; 12 2054a: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 // 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); 2054e: 85 e9 ldi r24, 0x95 ; 149 20550: 9c e0 ldi r25, 0x0C ; 12 20552: 0f 94 1e dc call 0x3b83c ; 0x3b83c lcd_show_fullscreen_message_and_wait_P(kill_msg); 20556: 0f 94 cd 20 call 0x2419a ; 0x2419a // report kill() events fw_kill_init(); #ifdef FILAMENT_SENSOR fsensor.init(); 2055a: 0f 94 30 7c call 0x2f860 ; 0x2f860 #endif setup_homepin(); #if defined(Z_AXIS_ALWAYS_ON) enable_z(); 2055e: 15 98 cbi 0x02, 5 ; 2 // The farm monitoring SW may accidentally expect // 2 messages of "printer started" to consider a printer working. prusa_statistics(8); // Enable Toshiba FlashAir SD card / WiFi enahanced card. card.ToshibaFlashAir_enable(eeprom_read_byte((unsigned char*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY) == 1); 20560: 8b eb ldi r24, 0xBB ; 187 20562: 9f e0 ldi r25, 0x0F ; 15 20564: 0f 94 10 dc call 0x3b820 ; 0x3b820 20568: 91 e0 ldi r25, 0x01 ; 1 2056a: 81 30 cpi r24, 0x01 ; 1 2056c: 09 f0 breq .+2 ; 0x20570 2056e: 90 e0 ldi r25, 0x00 ; 0 20570: 90 93 00 17 sts 0x1700, r25 ; 0x801700 // 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(); 20574: 81 e0 ldi r24, 0x01 ; 1 20576: 0f 94 b9 81 call 0x30372 ; 0x30372 #include #include void eeprom_init() { eeprom_init_default_byte((uint8_t*)EEPROM_POWER_COUNT, 0); 2057a: 60 e0 ldi r22, 0x00 ; 0 2057c: 84 e6 ldi r24, 0x64 ; 100 2057e: 9f e0 ldi r25, 0x0F ; 15 20580: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_X, 0); 20584: 60 e0 ldi r22, 0x00 ; 0 20586: 86 e6 ldi r24, 0x66 ; 102 20588: 9f e0 ldi r25, 0x0F ; 15 2058a: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_Y, 0); 2058e: 60 e0 ldi r22, 0x00 ; 0 20590: 88 e6 ldi r24, 0x68 ; 104 20592: 9f e0 ldi r25, 0x0F ; 15 20594: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_FERROR_COUNT, 0); 20598: 60 e0 ldi r22, 0x00 ; 0 2059a: 85 e6 ldi r24, 0x65 ; 101 2059c: 9f e0 ldi r25, 0x0F ; 15 2059e: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_word((uint16_t*)EEPROM_POWER_COUNT_TOT, 0); 205a2: 70 e0 ldi r23, 0x00 ; 0 205a4: 60 e0 ldi r22, 0x00 ; 0 205a6: 8f ef ldi r24, 0xFF ; 255 205a8: 9e e0 ldi r25, 0x0E ; 14 205aa: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT, 0); 205ae: 70 e0 ldi r23, 0x00 ; 0 205b0: 60 e0 ldi r22, 0x00 ; 0 205b2: 85 e0 ldi r24, 0x05 ; 5 205b4: 9f e0 ldi r25, 0x0F ; 15 205b6: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, 0); 205ba: 70 e0 ldi r23, 0x00 ; 0 205bc: 60 e0 ldi r22, 0x00 ; 0 205be: 83 e0 ldi r24, 0x03 ; 3 205c0: 9f e0 ldi r25, 0x0F ; 15 205c2: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, 0); 205c6: 70 e0 ldi r23, 0x00 ; 0 205c8: 60 e0 ldi r22, 0x00 ; 0 205ca: 81 e0 ldi r24, 0x01 ; 1 205cc: 9f e0 ldi r25, 0x0F ; 15 205ce: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word((uint16_t*)EEPROM_MMU_FAIL_TOT, 0); 205d2: 70 e0 ldi r23, 0x00 ; 0 205d4: 60 e0 ldi r22, 0x00 ; 0 205d6: 83 ed ldi r24, 0xD3 ; 211 205d8: 9e e0 ldi r25, 0x0E ; 14 205da: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, 0); 205de: 70 e0 ldi r23, 0x00 ; 0 205e0: 60 e0 ldi r22, 0x00 ; 0 205e2: 80 ed ldi r24, 0xD0 ; 208 205e4: 9e e0 ldi r25, 0x0E ; 14 205e6: 0e 94 89 75 call 0xeb12 ; 0xeb12 eeprom_init_default_byte((uint8_t*)EEPROM_MMU_FAIL, 0); 205ea: 60 e0 ldi r22, 0x00 ; 0 205ec: 82 ed ldi r24, 0xD2 ; 210 205ee: 9e e0 ldi r25, 0x0E ; 14 205f0: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, 0); 205f4: 60 e0 ldi r22, 0x00 ; 0 205f6: 8f ec ldi r24, 0xCF ; 207 205f8: 9e e0 ldi r25, 0x0E ; 14 205fa: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES, 0); 205fe: 88 ea ldi r24, 0xA8 ; 168 20600: 9c e0 ldi r25, 0x0C ; 12 20602: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE) 20606: 81 ea ldi r24, 0xA1 ; 161 20608: 9d e0 ldi r25, 0x0D ; 13 2060a: 0f 94 10 dc call 0x3b820 ; 0x3b820 2060e: 8f 3f cpi r24, 0xFF ; 255 20610: 71 f4 brne .+28 ; 0x2062e if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 20612: 60 e0 ldi r22, 0x00 ; 0 20614: 81 ea ldi r24, 0xA1 ; 161 20616: 9d e0 ldi r25, 0x0D ; 13 20618: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); 2061c: 88 ef ldi r24, 0xF8 ; 248 2061e: 9f e0 ldi r25, 0x0F ; 15 20620: 0f 94 1e dc call 0x3b83c ; 0x3b83c eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep); 20624: bc 01 movw r22, r24 20626: 80 e5 ldi r24, 0x50 ; 80 20628: 9d e0 ldi r25, 0x0D ; 13 2062a: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 2062e: 39 e4 ldi r19, 0x49 ; 73 20630: c3 2e mov r12, r19 20632: 3d e0 ldi r19, 0x0D ; 13 20634: d3 2e mov r13, r19 20636: 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); 20638: be 01 movw r22, r28 2063a: 6f 5f subi r22, 0xFF ; 255 2063c: 7f 4f sbci r23, 0xFF ; 255 2063e: 81 2f mov r24, r17 20640: 0e 94 09 76 call 0xec12 ; 0xec12 eeprom_init_default_block(EEPROM_Sheets_base->s[i].name, (sizeof(Sheet::name)/sizeof(Sheet::name[0])), sheetName.c); 20644: ae 01 movw r20, r28 20646: 4f 5f subi r20, 0xFF ; 255 20648: 5f 4f sbci r21, 0xFF ; 255 2064a: 67 e0 ldi r22, 0x07 ; 7 2064c: 70 e0 ldi r23, 0x00 ; 0 2064e: c6 01 movw r24, r12 20650: 0e 94 6a 75 call 0xead4 ; 0xead4 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++) { 20654: 1f 5f subi r17, 0xFF ; 255 20656: ab e0 ldi r26, 0x0B ; 11 20658: ca 0e add r12, r26 2065a: d1 1c adc r13, r1 2065c: 18 30 cpi r17, 0x08 ; 8 2065e: 61 f7 brne .-40 ; 0x20638 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)))) 20660: 81 ea ldi r24, 0xA1 ; 161 20662: 9d e0 ldi r25, 0x0D ; 13 20664: 0f 94 10 dc call 0x3b820 ; 0x3b820 20668: 0e 94 d9 75 call 0xebb2 ; 0xebb2 2066c: 81 11 cpse r24, r1 2066e: 02 c0 rjmp .+4 ; 0x20674 { eeprom_switch_to_next_sheet(); 20670: 0e 94 fb 75 call 0xebf6 ; 0xebf6 } check_babystep(); 20674: 0e 94 17 79 call 0xf22e ; 0xf22e // initialize custom mendel name in eeprom if (eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_MENDEL_NAME) == EEPROM_EMPTY_VALUE) { 20678: 80 e8 ldi r24, 0x80 ; 128 2067a: 9c e0 ldi r25, 0x0C ; 12 2067c: 0f 94 10 dc call 0x3b820 ; 0x3b820 20680: 8f 3f cpi r24, 0xFF ; 255 20682: 41 f4 brne .+16 ; 0x20694 #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); 20684: 4d e0 ldi r20, 0x0D ; 13 20686: 50 e0 ldi r21, 0x00 ; 0 20688: 60 e8 ldi r22, 0x80 ; 128 2068a: 7c e0 ldi r23, 0x0C ; 12 2068c: 87 ee ldi r24, 0xE7 ; 231 2068e: 92 e0 ldi r25, 0x02 ; 2 20690: 0f 94 24 dc call 0x3b848 ; 0x3b848 #ifdef PINDA_TEMP_COMP eeprom_init_default_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION, 0); #endif //PINDA_TEMP_COMP eeprom_init_default_dword((uint32_t*)EEPROM_JOB_ID, 0); 20694: 85 e0 ldi r24, 0x05 ; 5 20696: 9d e0 ldi r25, 0x0D ; 13 20698: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 eeprom_init_default_dword((uint32_t*)EEPROM_TOTALTIME, 0); 2069c: 8d ee ldi r24, 0xED ; 237 2069e: 9f e0 ldi r25, 0x0F ; 15 206a0: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 eeprom_init_default_dword((uint32_t*)EEPROM_FILAMENTUSED, 0); 206a4: 81 ef ldi r24, 0xF1 ; 241 206a6: 9f e0 ldi r25, 0x0F ; 15 206a8: 0f 94 54 7b call 0x2f6a8 ; 0x2f6a8 eeprom_init_default_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0); 206ac: 60 e0 ldi r22, 0x00 ; 0 206ae: 8e ec ldi r24, 0xCE ; 206 206b0: 9e e0 ldi r25, 0x0E ; 14 206b2: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, 1); 206b6: 61 e0 ldi r22, 0x01 ; 1 206b8: 87 ea ldi r24, 0xA7 ; 167 206ba: 9c e0 ldi r25, 0x0C ; 12 206bc: 0e 94 a1 75 call 0xeb42 ; 0xeb42 putchar('\n'); list_sec_lang_from_external_flash(); #endif //DEBUG_XFLASH // lang_reset(); if (!lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG))) 206c0: 8e ef ldi r24, 0xFE ; 254 206c2: 9f e0 ldi r25, 0x0F ; 15 206c4: 0f 94 10 dc call 0x3b820 ; 0x3b820 206c8: 0e 94 cc 71 call 0xe398 ; 0xe398 206cc: 81 11 cpse r24, r1 206ce: 02 c0 rjmp .+4 ; 0x206d4 lcd_language(); 206d0: 0e 94 0a db call 0x1b614 ; 0x1b614 lang_print_sec_lang(); #endif //DEBUG_SEC_LANG #endif //(LANG_MODE != 0) eeprom_init_default_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); 206d4: 60 e0 ldi r22, 0x00 ; 0 206d6: 8f ea ldi r24, 0xAF ; 175 206d8: 9f e0 ldi r25, 0x0F ; 15 206da: 0e 94 a1 75 call 0xeb42 ; 0xeb42 if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA) == 255) { 206de: 86 ea ldi r24, 0xA6 ; 166 206e0: 9f e0 ldi r25, 0x0F ; 15 206e2: 0f 94 10 dc call 0x3b820 ; 0x3b820 206e6: 8f 3f cpi r24, 0xFF ; 255 206e8: d9 f4 brne .+54 ; 0x20720 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 206ea: 61 e0 ldi r22, 0x01 ; 1 206ec: 86 ea ldi r24, 0xA6 ; 166 206ee: 9f e0 ldi r25, 0x0F ; 15 206f0: 0f 94 34 dc call 0x3b868 ; 0x3b868 206f4: 20 eb ldi r18, 0xB0 ; 176 206f6: c2 2e mov r12, r18 206f8: 2f e0 ldi r18, 0x0F ; 15 206fa: d2 2e mov r13, r18 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 206fc: 70 e0 ldi r23, 0x00 ; 0 206fe: 60 e0 ldi r22, 0x00 ; 0 20700: c6 01 movw r24, r12 20702: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 20706: b2 e0 ldi r27, 0x02 ; 2 20708: cb 0e add r12, r27 2070a: d1 1c adc r13, 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++) { 2070c: ea eb ldi r30, 0xBA ; 186 2070e: ce 16 cp r12, r30 20710: ef e0 ldi r30, 0x0F ; 15 20712: de 06 cpc r13, r30 20714: 99 f7 brne .-26 ; 0x206fc if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 20716: 60 e0 ldi r22, 0x00 ; 0 20718: 8f ea ldi r24, 0xAF ; 175 2071a: 9f e0 ldi r25, 0x0F ; 15 2071c: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); 20720: 60 e0 ldi r22, 0x00 ; 0 20722: 85 ea ldi r24, 0xA5 ; 165 20724: 9f e0 ldi r25, 0x0F ; 15 20726: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0); 2072a: 60 e0 ldi r22, 0x00 ; 0 2072c: 8f e7 ldi r24, 0x7F ; 127 2072e: 9c e0 ldi r25, 0x0C ; 12 20730: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_SD_SORT, 0); 20734: 60 e0 ldi r22, 0x00 ; 0 20736: 89 e0 ldi r24, 0x09 ; 9 20738: 9f e0 ldi r25, 0x0F ; 15 2073a: 0e 94 a1 75 call 0xeb42 ; 0xeb42 } 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); 2073e: 61 e0 ldi r22, 0x01 ; 1 20740: 8c ea ldi r24, 0xAC ; 172 20742: 9d e0 ldi r25, 0x0D ; 13 20744: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_MBL_POINTS_NR, 3); 20748: 63 e0 ldi r22, 0x03 ; 3 2074a: 8b ea ldi r24, 0xAB ; 171 2074c: 9d e0 ldi r25, 0x0D ; 13 2074e: 0e 94 a1 75 call 0xeb42 ; 0xeb42 eeprom_init_default_byte((uint8_t*)EEPROM_MBL_PROBE_NR, 3); 20752: 63 e0 ldi r22, 0x03 ; 3 20754: 8a ea ldi r24, 0xAA ; 170 20756: 9d e0 ldi r25, 0x0D ; 13 20758: 0e 94 a1 75 call 0xeb42 ; 0xeb42 //mbl_mode_init(); mbl_settings_init(); eeprom_init_default_byte((uint8_t*)EEPROM_MMU_STEALTH, 1); 2075c: 61 e0 ldi r22, 0x01 ; 1 2075e: 89 ea ldi r24, 0xA9 ; 169 20760: 9d e0 ldi r25, 0x0D ; 13 20762: 0e 94 a1 75 call 0xeb42 ; 0xeb42 #endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1) #if (defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1)) void setup_fan_interrupt() { //INT7 DDRE &= ~(1 << 7); //input pin 20766: 6f 98 cbi 0x0d, 7 ; 13 PORTE &= ~(1 << 7); //no internal pull-up 20768: 77 98 cbi 0x0e, 7 ; 14 //start with sensing rising edge EICRB &= ~(1 << 6); 2076a: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> 2076e: 8f 7b andi r24, 0xBF ; 191 20770: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> EICRB |= (1 << 7); 20774: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> 20778: 80 68 ori r24, 0x80 ; 128 2077a: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> //enable INT7 interrupt EIMSK |= (1 << 7); 2077e: ef 9a sbi 0x1d, 7 ; 29 #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); 20780: 84 e0 ldi r24, 0x04 ; 4 20782: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be return false; } #ifdef FSENSOR_PROBING bool PAT9125_sensor::probeOtherType() { SET_INPUT(IR_SENSOR_PIN); // input mode 20786: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 2078a: 8e 7f andi r24, 0xFE ; 254 2078c: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> WRITE(IR_SENSOR_PIN, 1); // pullup 20790: 9f b7 in r25, 0x3f ; 63 20792: f8 94 cli 20794: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 20798: 81 60 ori r24, 0x01 ; 1 2079a: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 2079e: 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); 207a0: 8f e8 ldi r24, 0x8F ; 143 207a2: 91 e0 ldi r25, 0x01 ; 1 207a4: 01 97 sbiw r24, 0x01 ; 1 207a6: f1 f7 brne .-4 ; 0x207a4 207a8: 00 c0 rjmp .+0 ; 0x207aa 207aa: 00 00 nop _delay_us(100); // wait for the pullup to pull the line high (might be needed, not really sure. The internal pullups are quite weak and there might be a // long wire attached). bool fsensorDetected = !READ(IR_SENSOR_PIN); 207ac: 90 91 06 01 lds r25, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> WRITE(IR_SENSOR_PIN, 0); // no pullup 207b0: 2f b7 in r18, 0x3f ; 63 207b2: f8 94 cli 207b4: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 207b8: 8e 7f andi r24, 0xFE ; 254 207ba: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 207be: 2f bf out 0x3f, r18 ; 63 } #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) //! @brief try to check if firmware is on right type of printer static void check_if_fw_is_on_right_printer() { if (fsensor.probeOtherType()) { 207c0: 90 fd sbrc r25, 0 207c2: 06 c0 rjmp .+12 ; 0x207d0 lcd_show_fullscreen_message_and_wait_P(_T(MSG_FW_MK3_DETECTED)); 207c4: 84 eb ldi r24, 0xB4 ; 180 207c6: 9a e4 ldi r25, 0x4A ; 74 207c8: 0e 94 44 72 call 0xe488 ; 0xe488 207cc: 0f 94 cd 20 call 0x2419a ; 0x2419a #if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) check_if_fw_is_on_right_printer(); #endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING) } switch (hw_changed) { 207d0: 02 30 cpi r16, 0x02 ; 2 207d2: 81 f0 breq .+32 ; 0x207f4 207d4: 03 30 cpi r16, 0x03 ; 3 207d6: 09 f4 brne .+2 ; 0x207da 207d8: 37 c1 rjmp .+622 ; 0x20a48 207da: 01 30 cpi r16, 0x01 ; 1 207dc: b9 f4 brne .+46 ; 0x2080c //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)); 207de: 86 ee ldi r24, 0xE6 ; 230 207e0: 9c e4 ldi r25, 0x4C ; 76 207e2: 0e 94 44 72 call 0xe488 ; 0xe488 207e6: 0f 94 cd 20 call 0x2419a ; 0x2419a 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); 207ea: 66 e3 ldi r22, 0x36 ; 54 207ec: 71 e0 ldi r23, 0x01 ; 1 207ee: 8c ee ldi r24, 0xEC ; 236 207f0: 9e e0 ldi r25, 0x0E ; 14 207f2: 0a c0 rjmp .+20 ; 0x20808 eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); break; case(0b10): lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_PRINTER)); 207f4: 85 ec ldi r24, 0xC5 ; 197 207f6: 9c e4 ldi r25, 0x4C ; 76 207f8: 0e 94 44 72 call 0xe488 ; 0xe488 207fc: 0f 94 cd 20 call 0x2419a ; 0x2419a 20800: 6c e2 ldi r22, 0x2C ; 44 20802: 71 e0 ldi r23, 0x01 ; 1 20804: 8e ee ldi r24, 0xEE ; 238 20806: 9e e0 ldi r25, 0x0E ; 14 20808: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); break; default: break; //no change, show no message } if (!previous_settings_retrieved) { 2080c: f1 10 cpse r15, r1 2080e: 08 c0 rjmp .+16 ; 0x20820 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 20810: 8e e4 ldi r24, 0x4E ; 78 20812: 9c e4 ldi r25, 0x4C ; 76 20814: 0e 94 44 72 call 0xe488 ; 0xe488 20818: 0f 94 cd 20 call 0x2419a ; 0x2419a Config_StoreSettings(); 2081c: 0e 94 3c 82 call 0x10478 ; 0x10478 } // handle FW and calibration status upgrade bool run_wizard = false; if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) { 20820: 80 e8 ldi r24, 0x80 ; 128 20822: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20826: 88 23 and r24, r24 20828: c9 f0 breq .+50 ; 0x2085c CalibrationStatus calibration_status = 0; if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) { 2082a: 87 ef ldi r24, 0xF7 ; 247 2082c: 9f e0 ldi r25, 0x0F ; 15 2082e: 0f 94 10 dc call 0x3b820 ; 0x3b820 } // handle FW and calibration status upgrade bool run_wizard = false; if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) { CalibrationStatus calibration_status = 0; 20832: 60 e0 ldi r22, 0x00 ; 0 if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) { 20834: 81 30 cpi r24, 0x01 ; 1 20836: 71 f4 brne .+28 ; 0x20854 // 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)) { 20838: 8a e6 ldi r24, 0x6A ; 106 2083a: 9d e8 ldi r25, 0x8D ; 141 2083c: 0e 94 32 d1 call 0x1a264 ; 0x1a264 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); 20840: 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)) { 20842: 88 23 and r24, r24 20844: 39 f0 breq .+14 ; 0x20854 // printer upgraded from FW<3.2.0.4 and requires re-running selftest lcd_show_fullscreen_message_and_wait_P(_T(MSG_FORCE_SELFTEST)); 20846: 8c e0 ldi r24, 0x0C ; 12 20848: 9c e4 ldi r25, 0x4C ; 76 2084a: 0e 94 44 72 call 0xe488 ; 0xe488 2084e: 0f 94 cd 20 call 0x2419a ; 0x2419a calibration_status &= ~CALIBRATION_STATUS_SELFTEST; 20852: 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); 20854: 86 ea ldi r24, 0xA6 ; 166 20856: 9c e0 ldi r25, 0x0C ; 12 20858: 0f 94 34 dc call 0x3b868 ; 0x3b868 } } eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, calibration_status); } if (eeprom_fw_version_older_than_p(FW_VERSION_NR)) { 2085c: 82 e6 ldi r24, 0x62 ; 98 2085e: 9d e8 ldi r25, 0x8D ; 141 20860: 0e 94 32 d1 call 0x1a264 ; 0x1a264 20864: f8 2e mov r15, r24 20866: 88 23 and r24, r24 20868: 31 f0 breq .+12 ; 0x20876 if (!calibration_status_get(CALIBRATION_WIZARD_STEPS)) { 2086a: 8f e1 ldi r24, 0x1F ; 31 2086c: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20870: 91 e0 ldi r25, 0x01 ; 1 20872: f8 2e mov r15, r24 20874: f9 26 eor r15, r25 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; 20876: 10 e0 ldi r17, 0x00 ; 0 20878: 00 e0 ldi r16, 0x00 ; 0 } 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)); 2087a: f8 01 movw r30, r16 2087c: ed 5a subi r30, 0xAD ; 173 2087e: f2 47 sbci r31, 0x72 ; 114 20880: 64 91 lpm r22, Z 20882: c8 01 movw r24, r16 20884: 0f 94 34 dc call 0x3b868 ; 0x3b868 20888: 0f 5f subi r16, 0xFF ; 255 2088a: 1f 4f sbci r17, 0xFF ; 255 return true; } void update_current_firmware_version_to_eeprom() { for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){ 2088c: 0a 30 cpi r16, 0x0A ; 10 2088e: 11 05 cpc r17, r1 20890: a1 f7 brne .-24 ; 0x2087a 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])); 20892: e2 e6 ldi r30, 0x62 ; 98 20894: fd e8 ldi r31, 0x8D ; 141 20896: 65 91 lpm r22, Z+ 20898: 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); 2089a: 8a e0 ldi r24, 0x0A ; 10 2089c: 90 e0 ldi r25, 0x00 ; 0 2089e: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR, (uint16_t)pgm_read_word(&FW_VERSION_NR[1])); 208a2: e4 e6 ldi r30, 0x64 ; 100 208a4: fd e8 ldi r31, 0x8D ; 141 208a6: 65 91 lpm r22, Z+ 208a8: 74 91 lpm r23, Z 208aa: 8c e0 ldi r24, 0x0C ; 12 208ac: 90 e0 ldi r25, 0x00 ; 0 208ae: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, (uint16_t)pgm_read_word(&FW_VERSION_NR[2])); 208b2: e6 e6 ldi r30, 0x66 ; 102 208b4: fd e8 ldi r31, 0x8D ; 141 208b6: 65 91 lpm r22, Z+ 208b8: 74 91 lpm r23, Z 208ba: 8e e0 ldi r24, 0x0E ; 14 208bc: 90 e0 ldi r25, 0x00 ; 0 208be: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 // 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])); 208c2: e8 e6 ldi r30, 0x68 ; 104 208c4: fd e8 ldi r31, 0x8D ; 141 208c6: 65 91 lpm r22, Z+ 208c8: 74 91 lpm r23, Z 208ca: 80 e1 ldi r24, 0x10 ; 16 208cc: 90 e0 ldi r25, 0x00 ; 0 208ce: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 run_wizard = true; } } update_current_firmware_version_to_eeprom(); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) { 208d2: 8f e5 ldi r24, 0x5F ; 95 208d4: 9f e0 ldi r25, 0x0F ; 15 208d6: 0f 94 10 dc call 0x3b820 ; 0x3b820 208da: 88 23 and r24, r24 208dc: 09 f4 brne .+2 ; 0x208e0 208de: c1 c0 rjmp .+386 ; 0x20a62 // first time run of wizard or service prep lcd_wizard(WizState::Run); 208e0: 80 e0 ldi r24, 0x00 ; 0 } else if (run_wizard) { // some wizard steps required by the upgrade checks lcd_wizard(WizState::Restore); 208e2: 0e 94 b4 f9 call 0x1f368 ; 0x1f368 lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_NOT_CAL)); #endif //THERMAL_MODEL } } KEEPALIVE_STATE(IN_PROCESS); 208e6: 83 e0 ldi r24, 0x03 ; 3 208e8: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be #endif //DEBUG_DISABLE_STARTMSGS lcd_update_enable(true); 208ec: 81 e0 ldi r24, 0x01 ; 1 208ee: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 208f2: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_update(2); 208f6: 82 e0 ldi r24, 0x02 ; 2 208f8: 0e 94 3f 6e call 0xdc7e ; 0xdc7e #ifdef TMC2130 tmc2130_home_origin[X_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_X_ORIGIN, 0); 208fc: 60 e0 ldi r22, 0x00 ; 0 208fe: 8e ef ldi r24, 0xFE ; 254 20900: 9e e0 ldi r25, 0x0E ; 14 20902: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20906: 80 93 f2 04 sts 0x04F2, r24 ; 0x8004f2 tmc2130_home_bsteps[X_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_X_BSTEPS, 48); 2090a: 60 e3 ldi r22, 0x30 ; 48 2090c: 8d ef ldi r24, 0xFD ; 253 2090e: 9e e0 ldi r25, 0x0E ; 14 20910: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20914: 80 93 5a 02 sts 0x025A, r24 ; 0x80025a tmc2130_home_fsteps[X_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_X_FSTEPS, 48); 20918: 60 e3 ldi r22, 0x30 ; 48 2091a: 8c ef ldi r24, 0xFC ; 252 2091c: 9e e0 ldi r25, 0x0E ; 14 2091e: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20922: 80 93 58 02 sts 0x0258, r24 ; 0x800258 tmc2130_home_origin[Y_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_Y_ORIGIN, 0); 20926: 60 e0 ldi r22, 0x00 ; 0 20928: 8b ef ldi r24, 0xFB ; 251 2092a: 9e e0 ldi r25, 0x0E ; 14 2092c: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20930: 80 93 f3 04 sts 0x04F3, r24 ; 0x8004f3 tmc2130_home_bsteps[Y_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_Y_BSTEPS, 48); 20934: 60 e3 ldi r22, 0x30 ; 48 20936: 8a ef ldi r24, 0xFA ; 250 20938: 9e e0 ldi r25, 0x0E ; 14 2093a: 0e 94 a1 75 call 0xeb42 ; 0xeb42 2093e: 80 93 5b 02 sts 0x025B, r24 ; 0x80025b tmc2130_home_fsteps[Y_AXIS] = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_Y_FSTEPS, 48); 20942: 60 e3 ldi r22, 0x30 ; 48 20944: 89 ef ldi r24, 0xF9 ; 249 20946: 9e e0 ldi r25, 0x0E ; 14 20948: 0e 94 a1 75 call 0xeb42 ; 0xeb42 2094c: 80 93 59 02 sts 0x0259, r24 ; 0x800259 tmc2130_home_enabled = eeprom_init_default_byte((uint8_t*)EEPROM_TMC2130_HOME_ENABLED, 0); 20950: 60 e0 ldi r22, 0x00 ; 0 20952: 88 ef ldi r24, 0xF8 ; 248 20954: 9e e0 ldi r25, 0x0E ; 14 20956: 0e 94 a1 75 call 0xeb42 ; 0xeb42 2095a: 80 93 f1 04 sts 0x04F1, r24 ; 0x8004f1 static void fw_crash_init() { #ifdef XFLASH_DUMP dump_crash_reason crash_reason; if(xfdump_check_state(&crash_reason)) 2095e: ce 01 movw r24, r28 20960: 01 96 adiw r24, 0x01 ; 1 20962: 0e 94 c1 ed call 0x1db82 ; 0x1db82 20966: 88 23 and r24, r24 20968: 89 f0 breq .+34 ; 0x2098c { // always signal to the host that a dump is available for retrieval puts_P(_N("//action:dump_available")); 2096a: 8c e5 ldi r24, 0x5C ; 92 2096c: 9c e6 ldi r25, 0x6C ; 108 2096e: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 #ifdef EMERGENCY_DUMP if(crash_reason != dump_crash_reason::manual && 20972: 89 81 ldd r24, Y+1 ; 0x01 20974: 88 23 and r24, r24 20976: 51 f0 breq .+20 ; 0x2098c eeprom_read_byte((uint8_t*)EEPROM_FW_CRASH_FLAG) != 0xFF) 20978: 83 e0 ldi r24, 0x03 ; 3 2097a: 9d e0 ldi r25, 0x0D ; 13 2097c: 0f 94 10 dc call 0x3b820 ; 0x3b820 { // always signal to the host that a dump is available for retrieval puts_P(_N("//action:dump_available")); #ifdef EMERGENCY_DUMP if(crash_reason != dump_crash_reason::manual && 20980: 8f 3f cpi r24, 0xFF ; 255 20982: 21 f0 breq .+8 ; 0x2098c eeprom_read_byte((uint8_t*)EEPROM_FW_CRASH_FLAG) != 0xFF) { lcd_show_fullscreen_message_and_wait_P( 20984: 88 ee ldi r24, 0xE8 ; 232 20986: 9b e6 ldi r25, 0x6B ; 107 20988: 0f 94 cd 20 call 0x2419a ; 0x2419a if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2098c: 6f ef ldi r22, 0xFF ; 255 2098e: 83 e0 ldi r24, 0x03 ; 3 20990: 9d e0 ldi r25, 0x0D ; 13 20992: 0f 94 34 dc call 0x3b868 ; 0x3b868 // report crash failures fw_crash_init(); #ifdef UVLO_SUPPORT if (printer_recovering()) { //previous print was terminated by UVLO 20996: 0e 94 13 67 call 0xce26 ; 0xce26 2099a: 88 23 and r24, r24 2099c: d9 f1 breq .+118 ; 0x20a14 manage_heater(); // Update temperatures 2099e: 0f 94 34 39 call 0x27268 ; 0x27268 //Restore printing type saved_printing_type = eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE); 209a2: 8c e8 ldi r24, 0x8C ; 140 209a4: 9f e0 ldi r25, 0x0F ; 15 209a6: 0f 94 10 dc call 0x3b820 ; 0x3b820 209aa: 08 2f mov r16, r24 209ac: 80 93 6a 02 sts 0x026A, r24 ; 0x80026a return current_temperature_bed_raw; }; #endif FORCE_INLINE float degBed() { return current_temperature_bed; 209b0: 80 90 ed 04 lds r8, 0x04ED ; 0x8004ed 209b4: 90 90 ee 04 lds r9, 0x04EE ; 0x8004ee 209b8: a0 90 ef 04 lds r10, 0x04EF ; 0x8004ef 209bc: b0 90 f0 04 lds r11, 0x04F0 ; 0x8004f0 #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER printf_P(_N("Power panic detected!\nCurrent bed temp:%d\nSaved bed temp:%d\n"), (int)degBed(), eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED)); #endif //DEBUG_UVLO_AUTOMATIC_RECOVER uvlo_auto_recovery_ready = (degBed() > ( (float)eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED) - AUTOMATIC_UVLO_BED_TEMP_OFFSET)); 209c0: 8b e8 ldi r24, 0x8B ; 139 209c2: 9f e0 ldi r25, 0x0F ; 15 209c4: 0f 94 10 dc call 0x3b820 ; 0x3b820 209c8: 68 2f mov r22, r24 209ca: 70 e0 ldi r23, 0x00 ; 0 209cc: 90 e0 ldi r25, 0x00 ; 0 209ce: 80 e0 ldi r24, 0x00 ; 0 209d0: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 209d4: 20 e0 ldi r18, 0x00 ; 0 209d6: 30 e0 ldi r19, 0x00 ; 0 209d8: 40 ea ldi r20, 0xA0 ; 160 209da: 50 e4 ldi r21, 0x40 ; 64 209dc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 209e0: 6b 01 movw r12, r22 209e2: 7c 01 movw r14, r24 209e4: 11 e0 ldi r17, 0x01 ; 1 209e6: ac 01 movw r20, r24 209e8: 9b 01 movw r18, r22 209ea: c5 01 movw r24, r10 209ec: b4 01 movw r22, r8 209ee: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 209f2: 18 16 cp r1, r24 209f4: 0c f0 brlt .+2 ; 0x209f8 209f6: 10 e0 ldi r17, 0x00 ; 0 209f8: 10 93 ec 04 sts 0x04EC, r17 ; 0x8004ec <_ZL24uvlo_auto_recovery_ready.lto_priv.533> if (uvlo_auto_recovery_ready){ 209fc: a7 01 movw r20, r14 209fe: 96 01 movw r18, r12 20a00: c5 01 movw r24, r10 20a02: b4 01 movw r22, r8 20a04: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 20a08: 18 16 cp r1, r24 20a0a: 0c f0 brlt .+2 ; 0x20a0e 20a0c: 58 c0 rjmp .+176 ; 0x20abe #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER puts_P(_N("Automatic recovery!")); #endif //DEBUG_UVLO_AUTOMATIC_RECOVER recover_print(1); 20a0e: 81 e0 ldi r24, 0x01 ; 1 } else { #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER puts_P(_N("Normal recovery!")); #endif //DEBUG_UVLO_AUTOMATIC_RECOVER if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { recover_print(0); 20a10: 0f 94 f7 5c call 0x2b9ee ; 0x2b9ee printf_P(_N("UVLO_TINY - end %d\n"), _millis() - time_start); uvlo_drain_reset(); } void setup_uvlo_interrupt() { DDRE &= ~(1 << 4); //input pin 20a14: 6c 98 cbi 0x0d, 4 ; 13 PORTE &= ~(1 << 4); //no internal pull-up 20a16: 74 98 cbi 0x0e, 4 ; 14 // sensing falling edge EICRB |= (1 << 0); 20a18: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> 20a1c: 81 60 ori r24, 0x01 ; 1 20a1e: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> EICRB &= ~(1 << 1); 20a22: 80 91 6a 00 lds r24, 0x006A ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> 20a26: 8d 7f andi r24, 0xFD ; 253 20a28: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7c206a> // enable INT4 interrupt EIMSK |= (1 << 4); 20a2c: ec 9a sbi 0x1d, 4 ; 29 // check if power was lost before we armed the interrupt if(!(PINE & (1 << 4)) && printer_recovering()) 20a2e: 64 99 sbic 0x0c, 4 ; 12 20a30: 57 c0 rjmp .+174 ; 0x20ae0 20a32: 0e 94 13 67 call 0xce26 ; 0xce26 20a36: 88 23 and r24, r24 20a38: 09 f4 brne .+2 ; 0x20a3c 20a3a: 52 c0 rjmp .+164 ; 0x20ae0 { SERIAL_ECHOLNRPGM(MSG_INT4); 20a3c: 8d e5 ldi r24, 0x5D ; 93 20a3e: 9d e8 ldi r25, 0x8D ; 141 20a40: 0e 94 13 79 call 0xf226 ; 0xf226 uvlo_drain_reset(); 20a44: 0f 94 13 60 call 0x2c026 ; 0x2c026 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)); 20a48: 8a e8 ldi r24, 0x8A ; 138 20a4a: 9c e4 ldi r25, 0x4C ; 76 20a4c: 0e 94 44 72 call 0xe488 ; 0xe488 20a50: 0f 94 cd 20 call 0x2419a ; 0x2419a 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); 20a54: 6c e2 ldi r22, 0x2C ; 44 20a56: 71 e0 ldi r23, 0x01 ; 1 20a58: 8e ee ldi r24, 0xEE ; 238 20a5a: 9e e0 ldi r25, 0x0E ; 14 20a5c: 0f 94 6e dc call 0x3b8dc ; 0x3b8dc 20a60: c4 ce rjmp .-632 ; 0x207ea // 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); 20a62: 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) { 20a64: f1 10 cpse r15, r1 20a66: 3d cf rjmp .-390 ; 0x208e2 // some wizard steps required by the upgrade checks lcd_wizard(WizState::Restore); } else { if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) { 20a68: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20a6c: 81 11 cpse r24, r1 20a6e: 07 c0 rjmp .+14 ; 0x20a7e // aborted or missing wizard: show a single warning lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW)); 20a70: 8c e9 ldi r24, 0x9C ; 156 20a72: 9b e4 ldi r25, 0x4B ; 75 // 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)); #ifdef THERMAL_MODEL if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL) && thermal_model_enabled()) lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_NOT_CAL)); 20a74: 0e 94 44 72 call 0xe488 ; 0xe488 20a78: 0f 94 cd 20 call 0x2419a ; 0x2419a 20a7c: 34 cf rjmp .-408 ; 0x208e6 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)) { 20a7e: 84 e0 ldi r24, 0x04 ; 4 20a80: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20a84: 81 11 cpse r24, r1 20a86: 03 c0 rjmp .+6 ; 0x20a8e // wizard reset after service prep lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_Z_CALIBRATION_FLOW)); 20a88: 84 e2 ldi r24, 0x24 ; 36 20a8a: 9b e4 ldi r25, 0x4B ; 75 20a8c: f3 cf rjmp .-26 ; 0x20a74 } else { // warn about other important steps individually if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) 20a8e: 80 e1 ldi r24, 0x10 ; 16 20a90: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20a94: 81 11 cpse r24, r1 20a96: 06 c0 rjmp .+12 ; 0x20aa4 lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET)); 20a98: 8c eb ldi r24, 0xBC ; 188 20a9a: 99 e5 ldi r25, 0x59 ; 89 20a9c: 0e 94 44 72 call 0xe488 ; 0xe488 20aa0: 0f 94 cd 20 call 0x2419a ; 0x2419a #ifdef THERMAL_MODEL if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL) && thermal_model_enabled()) 20aa4: 88 e0 ldi r24, 0x08 ; 8 20aa6: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 20aaa: 81 11 cpse r24, r1 20aac: 1c cf rjmp .-456 ; 0x208e6 20aae: 80 91 1c 05 lds r24, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 20ab2: 88 23 and r24, r24 20ab4: 09 f4 brne .+2 ; 0x20ab8 20ab6: 17 cf rjmp .-466 ; 0x208e6 lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_NOT_CAL)); 20ab8: 80 e0 ldi r24, 0x00 ; 0 20aba: 9b e4 ldi r25, 0x4B ; 75 20abc: db cf rjmp .-74 ; 0x20a74 recover_print(1); } else { #ifdef DEBUG_UVLO_AUTOMATIC_RECOVER puts_P(_N("Normal recovery!")); #endif //DEBUG_UVLO_AUTOMATIC_RECOVER if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { 20abe: 01 30 cpi r16, 0x01 ; 1 20ac0: 11 f4 brne .+4 ; 0x20ac6 recover_print(0); 20ac2: 80 e0 ldi r24, 0x00 ; 0 20ac4: a5 cf rjmp .-182 ; 0x20a10 } else { const uint8_t btn = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_RECOVER_PRINT), false); 20ac6: 8c ed ldi r24, 0xDC ; 220 20ac8: 9a e4 ldi r25, 0x4A ; 74 20aca: 0e 94 44 72 call 0xe488 ; 0xe488 20ace: 41 e0 ldi r20, 0x01 ; 1 20ad0: 60 e0 ldi r22, 0x00 ; 0 20ad2: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if ( btn == LCD_LEFT_BUTTON_CHOICE) { 20ad6: 88 23 and r24, r24 20ad8: a1 f3 breq .-24 ; 0x20ac2 recover_print(0); } else { // LCD_MIDDLE_BUTTON_CHOICE cancel_saved_printing(); 20ada: 0e 94 45 64 call 0xc88a ; 0xc88a 20ade: 9a cf rjmp .-204 ; 0x20a14 ClCheckMode oCheckVersion; ClCheckMode oCheckGcode; ClCheckMode oCheckFilament; void fCheckModeInit() { oCheckMode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)ClCheckMode::_Warn); 20ae0: 61 e0 ldi r22, 0x01 ; 1 20ae2: 88 ea ldi r24, 0xA8 ; 168 20ae4: 9d e0 ldi r25, 0x0D ; 13 20ae6: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20aea: 80 93 eb 04 sts 0x04EB, r24 ; 0x8004eb if (farm_mode) { oCheckMode = ClCheckMode::_Strict; 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); 20aee: 68 e2 ldi r22, 0x28 ; 40 20af0: 87 ea ldi r24, 0xA7 ; 167 20af2: 9d e0 ldi r25, 0x0D ; 13 20af4: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20af8: 80 93 ea 04 sts 0x04EA, r24 ; 0x8004ea eeprom_init_default_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM, EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); 20afc: 60 e9 ldi r22, 0x90 ; 144 20afe: 71 e0 ldi r23, 0x01 ; 1 20b00: 85 ea ldi r24, 0xA5 ; 165 20b02: 9d e0 ldi r25, 0x0D ; 13 20b04: 0e 94 89 75 call 0xeb12 ; 0xeb12 oCheckModel = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODEL, (uint8_t)ClCheckMode::_Warn); 20b08: 61 e0 ldi r22, 0x01 ; 1 20b0a: 84 ea ldi r24, 0xA4 ; 164 20b0c: 9d e0 ldi r25, 0x0D ; 13 20b0e: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20b12: 80 93 e9 04 sts 0x04E9, r24 ; 0x8004e9 oCheckVersion = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_VERSION, (uint8_t)ClCheckMode::_Warn); 20b16: 61 e0 ldi r22, 0x01 ; 1 20b18: 83 ea ldi r24, 0xA3 ; 163 20b1a: 9d e0 ldi r25, 0x0D ; 13 20b1c: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20b20: 80 93 e8 04 sts 0x04E8, r24 ; 0x8004e8 oCheckGcode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_GCODE, (uint8_t)ClCheckMode::_Warn); 20b24: 61 e0 ldi r22, 0x01 ; 1 20b26: 82 ea ldi r24, 0xA2 ; 162 20b28: 9d e0 ldi r25, 0x0D ; 13 20b2a: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20b2e: 80 93 e7 04 sts 0x04E7, r24 ; 0x8004e7 oCheckFilament = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_FILAMENT, (uint8_t)ClCheckMode::_Warn); 20b32: 61 e0 ldi r22, 0x01 ; 1 20b34: 80 e2 ldi r24, 0x20 ; 32 20b36: 9c e0 ldi r25, 0x0C ; 12 20b38: 0e 94 a1 75 call 0xeb42 ; 0xeb42 20b3c: 80 93 e6 04 sts 0x04E6, r24 ; 0x8004e6 // the entire state machine initialized. setup_uvlo_interrupt(); #endif //UVLO_SUPPORT fCheckModeInit(); KEEPALIVE_STATE(NOT_BUSY); 20b40: 81 e0 ldi r24, 0x01 ; 1 20b42: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be : "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" ); 20b46: 88 e1 ldi r24, 0x18 ; 24 20b48: 98 e2 ldi r25, 0x28 ; 40 20b4a: 0f b6 in r0, 0x3f ; 63 20b4c: f8 94 cli 20b4e: a8 95 wdr 20b50: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 20b54: 0f be out 0x3f, r0 ; 63 20b56: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> #ifdef WATCHDOG wdt_enable(WDTO_4S); #ifdef EMERGENCY_HANDLERS WDTCSR |= (1 << WDIE); 20b5a: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 20b5e: 80 64 ori r24, 0x40 ; 64 20b60: 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; 20b64: 85 e0 ldi r24, 0x05 ; 5 20b66: d8 2e mov r13, r24 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); 20b68: 00 e0 ldi r16, 0x00 ; 0 20b6a: 10 e0 ldi r17, 0x00 ; 0 // 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); 20b6c: cc 24 eor r12, r12 20b6e: 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); 20b70: 94 e0 ldi r25, 0x04 ; 4 20b72: b9 2e mov r11, r25 // 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; 20b74: 10 92 ab 0d sts 0x0DAB, r1 ; 0x800dab if(Stopped) { 20b78: 80 91 10 05 lds r24, 0x0510 ; 0x800510 20b7c: 88 23 and r24, r24 20b7e: 09 f4 brne .+2 ; 0x20b82 20b80: c4 c0 rjmp .+392 ; 0x20d0a // 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); 20b82: b0 92 be 02 sts 0x02BE, r11 ; 0x8002be } 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. 20b86: 0e 94 1d 67 call 0xce3a ; 0xce3a 20b8a: 88 23 and r24, r24 20b8c: 09 f4 brne .+2 ; 0x20b90 20b8e: c0 c0 rjmp .+384 ; 0x20d10 20b90: 80 91 6a 02 lds r24, 0x026A ; 0x80026a 20b94: 81 30 cpi r24, 0x01 ; 1 20b96: 09 f0 breq .+2 ; 0x20b9a 20b98: bb c0 rjmp .+374 ; 0x20d10 usb_timer.start(); 20b9a: 8d e0 ldi r24, 0x0D ; 13 20b9c: 95 e0 ldi r25, 0x05 ; 5 20b9e: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> } else #endif { get_command(); 20ba2: 0e 94 b8 82 call 0x10570 ; 0x10570 // 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) 20ba6: 80 91 69 02 lds r24, 0x0269 ; 0x800269 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.553> 20baa: 88 23 and r24, r24 20bac: 89 f0 breq .+34 ; 0x20bd0 return; if(autostart_atmillis.expired(5000)) 20bae: 68 e8 ldi r22, 0x88 ; 136 20bb0: 73 e1 ldi r23, 0x13 ; 19 20bb2: 80 ea ldi r24, 0xA0 ; 160 20bb4: 97 e1 ldi r25, 0x17 ; 23 20bb6: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 20bba: 81 11 cpse r24, r1 20bbc: 09 c0 rjmp .+18 ; 0x20bd0 return; } autostart_stilltocheck = false; 20bbe: 10 92 69 02 sts 0x0269, r1 ; 0x800269 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.553> if(!mounted) 20bc2: 80 91 90 14 lds r24, 0x1490 ; 0x801490 20bc6: 88 23 and r24, r24 20bc8: 09 f4 brne .+2 ; 0x20bcc 20bca: ae c0 rjmp .+348 ; 0x20d28 20bcc: 0f 94 ae 76 call 0x2ed5c ; 0x2ed5c #ifdef SDSUPPORT card.checkautostart(false); #endif if(buflen) 20bd0: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 20bd4: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 20bd8: 89 2b or r24, r25 20bda: 09 f4 brne .+2 ; 0x20bde 20bdc: 61 c0 rjmp .+194 ; 0x20ca0 { cmdbuffer_front_already_processed = false; 20bde: 10 92 a1 10 sts 0x10A1, r1 ; 0x8010a1 #ifdef SDSUPPORT if(card.saving) 20be2: 80 91 8d 14 lds r24, 0x148D ; 0x80148d 20be6: 88 23 and r24, r24 20be8: d1 f1 breq .+116 ; 0x20c5e { // 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) { 20bea: 80 91 91 12 lds r24, 0x1291 ; 0x801291 20bee: 90 91 92 12 lds r25, 0x1292 ; 0x801292 20bf2: dc 01 movw r26, r24 20bf4: a9 55 subi r26, 0x59 ; 89 20bf6: bf 4e sbci r27, 0xEF ; 239 20bf8: 7d 01 movw r14, r26 20bfa: 6d ef ldi r22, 0xFD ; 253 20bfc: 7d e8 ldi r23, 0x8D ; 141 20bfe: cd 01 movw r24, r26 20c00: 0f 94 17 da call 0x3b42e ; 0x3b42e 20c04: 89 2b or r24, r25 20c06: 09 f0 breq .+2 ; 0x20c0a 20c08: 9c c0 rjmp .+312 ; 0x20d42 else SERIAL_PROTOCOLLNPGM("Not SD printing"); } void CardReader::write_command(char *buf) { file.writeError = false; 20c0a: 10 92 1f 17 sts 0x171F, r1 ; 0x80171f /** 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)); 20c0e: f7 01 movw r30, r14 20c10: 01 90 ld r0, Z+ 20c12: 00 20 and r0, r0 20c14: e9 f7 brne .-6 ; 0x20c10 20c16: 31 97 sbiw r30, 0x01 ; 1 20c18: bf 01 movw r22, r30 20c1a: 6e 19 sub r22, r14 20c1c: 7f 09 sbc r23, r15 20c1e: c7 01 movw r24, r14 20c20: 0f 94 57 84 call 0x308ae ; 0x308ae 20c24: 62 e0 ldi r22, 0x02 ; 2 20c26: 70 e0 ldi r23, 0x00 ; 0 20c28: 84 ef ldi r24, 0xF4 ; 244 20c2a: 92 e0 ldi r25, 0x02 ; 2 20c2c: 0f 94 57 84 call 0x308ae ; 0x308ae file.write(buf); //write command file.write("\r\n"); //write line termination if (file.writeError) 20c30: 80 91 1f 17 lds r24, 0x171F ; 0x80171f 20c34: 88 23 and r24, r24 20c36: 41 f0 breq .+16 ; 0x20c48 { SERIAL_ERROR_START; 20c38: 8a ec ldi r24, 0xCA ; 202 20c3a: 9a ea ldi r25, 0xAA ; 170 20c3c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNRPGM(MSG_SD_ERR_WRITE_TO_FILE); 20c40: 89 e2 ldi r24, 0x29 ; 41 20c42: 9d e6 ldi r25, 0x6D ; 109 20c44: 0e 94 13 79 call 0xf226 ; 0xf226 card.write_command(CMDBUFFER_CURRENT_STRING); if(card.logging) 20c48: 80 91 8e 14 lds r24, 0x148E ; 0x80148e 20c4c: 88 23 and r24, r24 20c4e: 09 f4 brne .+2 ; 0x20c52 20c50: 73 c0 rjmp .+230 ; 0x20d38 */ void process_commands() { if (!buflen) return; //empty command 20c52: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 20c56: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 20c5a: 89 2b or r24, r25 20c5c: 11 f0 breq .+4 ; 0x20c62 20c5e: 0e 94 1a 95 call 0x12a34 ; 0x12a34 } #else process_commands(); #endif //SDSUPPORT if (! cmdbuffer_front_already_processed && buflen) 20c62: 80 91 a1 10 lds r24, 0x10A1 ; 0x8010a1 20c66: 81 11 cpse r24, r1 20c68: 19 c0 rjmp .+50 ; 0x20c9c 20c6a: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 20c6e: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 20c72: 89 2b or r24, r25 20c74: 99 f0 breq .+38 ; 0x20c9c { // 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; 20c76: e0 91 91 12 lds r30, 0x1291 ; 0x801291 20c7a: f0 91 92 12 lds r31, 0x1292 ; 0x801292 20c7e: ec 55 subi r30, 0x5C ; 92 20c80: ff 4e sbci r31, 0xEF ; 239 if (*ptr == CMDBUFFER_CURRENT_TYPE_SDCARD) { 20c82: 80 81 ld r24, Z 20c84: 82 30 cpi r24, 0x02 ; 2 20c86: 09 f0 breq .+2 ; 0x20c8a 20c88: 6b c0 rjmp .+214 ; 0x20d60 { // 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(); 20c8a: 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; 20c8c: 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); 20c8e: 81 81 ldd r24, Z+1 ; 0x01 20c90: 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); 20c92: 0f 94 3d 64 call 0x2c87a ; 0x2c87a sei(); 20c96: 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(); 20c98: 0e 94 54 76 call 0xeca8 ; 0xeca8 } host_keepalive(); 20c9c: 0e 94 3f 7f call 0xfe7e ; 0xfe7e } } //check heater every n milliseconds manage_heater(); 20ca0: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(printingIsPaused()); 20ca4: 0e 94 1d 67 call 0xce3a ; 0xce3a 20ca8: 0e 94 4f 8a call 0x1149e ; 0x1149e //=============================functions ============================ //=========================================================================== void checkHitEndstops() { if(endstop_hit) { 20cac: 80 91 0a 05 lds r24, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> 20cb0: 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; 20cb2: 10 92 0a 05 sts 0x050A, r1 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> checkHitEndstops(); lcd_update(0); 20cb6: 80 e0 ldi r24, 0x00 ; 0 20cb8: 0e 94 3f 6e call 0xdc7e ; 0xdc7e #ifdef TMC2130 tmc2130_check_overtemp(); 20cbc: 0f 94 c3 2a call 0x25586 ; 0x25586 if (tmc2130_sg_crash) 20cc0: 80 91 0c 05 lds r24, 0x050C ; 0x80050c 20cc4: 88 23 and r24, r24 20cc6: 79 f0 breq .+30 ; 0x20ce6 { uint8_t crash = tmc2130_sg_crash; tmc2130_sg_crash = 0; 20cc8: 10 92 0c 05 sts 0x050C, r1 ; 0x80050c // crashdet_stop_and_save_print(); switch (crash) 20ccc: 82 30 cpi r24, 0x02 ; 2 20cce: 09 f4 brne .+2 ; 0x20cd2 20cd0: 53 c0 rjmp .+166 ; 0x20d78 20cd2: 83 30 cpi r24, 0x03 ; 3 20cd4: 09 f4 brne .+2 ; 0x20cd8 20cd6: 54 c0 rjmp .+168 ; 0x20d80 20cd8: 81 30 cpi r24, 0x01 ; 1 20cda: 29 f4 brne .+10 ; 0x20ce6 { case 1: enquecommand_P((PSTR("CRASH_DETECTEDX"))); break; 20cdc: 61 e0 ldi r22, 0x01 ; 1 20cde: 8d ee ldi r24, 0xED ; 237 20ce0: 9d e8 ldi r25, 0x8D ; 141 case 2: enquecommand_P((PSTR("CRASH_DETECTEDY"))); break; case 3: enquecommand_P((PSTR("CRASH_DETECTEDXY"))); break; 20ce2: 0e 94 b8 87 call 0x10f70 ; 0x10f70 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) { 20ce6: 80 91 0b 05 lds r24, 0x050B ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> 20cea: 81 11 cpse r24, r1 20cec: 07 c0 rjmp .+14 ; 0x20cfc return; } avoidRecursion = true; 20cee: c0 92 0b 05 sts 0x050B, r12 ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> mmu_loop_inner(true); 20cf2: 81 e0 ldi r24, 0x01 ; 1 20cf4: 0f 94 f6 a6 call 0x34dec ; 0x34dec avoidRecursion = false; 20cf8: 10 92 0b 05 sts 0x050B, r1 ; 0x80050b <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.542> 20cfc: 01 15 cp r16, r1 20cfe: 11 05 cpc r17, r1 20d00: 09 f4 brne .+2 ; 0x20d04 20d02: 38 cf rjmp .-400 ; 0x20b74 20d04: 0e 94 00 00 call 0 ; 0x0 <__vectors> 20d08: 35 cf rjmp .-406 ; 0x20b74 // 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); 20d0a: c0 92 be 02 sts 0x02BE, r12 ; 0x8002be 20d0e: 3b cf rjmp .-394 ; 0x20b86 } 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. 20d10: 60 e1 ldi r22, 0x10 ; 16 20d12: 77 e2 ldi r23, 0x27 ; 39 20d14: 8d e0 ldi r24, 0x0D ; 13 20d16: 95 e0 ldi r25, 0x05 ; 5 20d18: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 20d1c: 88 23 and r24, r24 20d1e: 09 f4 brne .+2 ; 0x20d22 20d20: 40 cf rjmp .-384 ; 0x20ba2 20d22: b0 92 b7 0d sts 0x0DB7, r11 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 20d26: 3d cf rjmp .-390 ; 0x20ba2 return; } autostart_stilltocheck = false; if(!mounted) { mount(); 20d28: 81 e0 ldi r24, 0x01 ; 1 20d2a: 0f 94 b9 81 call 0x30372 ; 0x30372 if(!mounted) //fail 20d2e: 80 91 90 14 lds r24, 0x1490 ; 0x801490 20d32: 81 11 cpse r24, r1 20d34: 4b cf rjmp .-362 ; 0x20bcc 20d36: 4c cf rjmp .-360 ; 0x20bd0 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); 20d38: 81 e5 ldi r24, 0x51 ; 81 20d3a: 9d e6 ldi r25, 0x6D ; 109 } else { card.closefile(); SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED); 20d3c: 0e 94 13 79 call 0xf226 ; 0xf226 20d40: 90 cf rjmp .-224 ; 0x20c62 lastnr++; } void CardReader::closefile(bool store_location) { file.sync(); 20d42: 8f e1 ldi r24, 0x1F ; 31 20d44: 97 e1 ldi r25, 0x17 ; 23 20d46: 0f 94 32 59 call 0x2b264 ; 0x2b264 file.close(); 20d4a: 8f e1 ldi r24, 0x1F ; 31 20d4c: 97 e1 ldi r25, 0x17 ; 23 20d4e: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce saving = false; 20d52: 10 92 8d 14 sts 0x148D, r1 ; 0x80148d logging = false; 20d56: 10 92 8e 14 sts 0x148E, r1 ; 0x80148e 20d5a: 8f e3 ldi r24, 0x3F ; 63 20d5c: 9d e6 ldi r25, 0x6D ; 109 20d5e: ee cf rjmp .-36 ; 0x20d3c // 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){ 20d60: 86 30 cpi r24, 0x06 ; 6 20d62: 09 f0 breq .+2 ; 0x20d66 20d64: 99 cf rjmp .-206 ; 0x20c98 20d66: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 20d6a: 81 11 cpse r24, r1 20d6c: 95 cf rjmp .-214 ; 0x20c98 cli(); 20d6e: f8 94 cli *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED; 20d70: d0 82 st Z, r13 // and one for each command to previous block in the planner queue. planner_add_sd_length(1); 20d72: 81 e0 ldi r24, 0x01 ; 1 20d74: 90 e0 ldi r25, 0x00 ; 0 20d76: 8d cf rjmp .-230 ; 0x20c92 tmc2130_sg_crash = 0; // crashdet_stop_and_save_print(); switch (crash) { case 1: enquecommand_P((PSTR("CRASH_DETECTEDX"))); break; case 2: enquecommand_P((PSTR("CRASH_DETECTEDY"))); break; 20d78: 61 e0 ldi r22, 0x01 ; 1 20d7a: 8d ed ldi r24, 0xDD ; 221 20d7c: 9d e8 ldi r25, 0x8D ; 141 20d7e: b1 cf rjmp .-158 ; 0x20ce2 case 3: enquecommand_P((PSTR("CRASH_DETECTEDXY"))); break; 20d80: 61 e0 ldi r22, 0x01 ; 1 20d82: 8c ec ldi r24, 0xCC ; 204 20d84: 9d e8 ldi r25, 0x8D ; 141 20d86: ad cf rjmp .-166 ; 0x20ce2 { 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; 20d88: 02 e0 ldi r16, 0x02 ; 2 if (motherboard != MOTHERBOARD) version_changed |= 0b01; 20d8a: 86 33 cpi r24, 0x36 ; 54 20d8c: 91 40 sbci r25, 0x01 ; 1 20d8e: 09 f0 breq .+2 ; 0x20d92 20d90: 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(); 20d92: 0e 94 24 82 call 0x10448 ; 0x10448 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; 20d96: f1 2c mov r15, 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; 20d98: 82 ea ldi r24, 0xA2 ; 162 20d9a: 92 ea ldi r25, 0xA2 ; 162 20d9c: a0 e0 ldi r26, 0x00 ; 0 20d9e: b0 e0 ldi r27, 0x00 ; 0 20da0: 80 93 3f 18 sts 0x183F, r24 ; 0x80183f <__bss_end+0x20> 20da4: 90 93 40 18 sts 0x1840, r25 ; 0x801840 <__bss_end+0x21> 20da8: a0 93 41 18 sts 0x1841, r26 ; 0x801841 <__bss_end+0x22> 20dac: b0 93 42 18 sts 0x1842, r27 ; 0x801842 <__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; 20db0: 10 92 b2 04 sts 0x04B2, r1 ; 0x8004b2 <_ZL14iState_sum_min.lto_priv.470> 20db4: 10 92 b3 04 sts 0x04B3, r1 ; 0x8004b3 <_ZL14iState_sum_min.lto_priv.470+0x1> 20db8: 10 92 b4 04 sts 0x04B4, r1 ; 0x8004b4 <_ZL14iState_sum_min.lto_priv.470+0x2> 20dbc: 10 92 b5 04 sts 0x04B5, r1 ; 0x8004b5 <_ZL14iState_sum_min.lto_priv.470+0x3> iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki; 20dc0: 20 91 29 0e lds r18, 0x0E29 ; 0x800e29 20dc4: 30 91 2a 0e lds r19, 0x0E2A ; 0x800e2a 20dc8: 40 91 2b 0e lds r20, 0x0E2B ; 0x800e2b 20dcc: 50 91 2c 0e lds r21, 0x0E2C ; 0x800e2c 20dd0: 60 e0 ldi r22, 0x00 ; 0 20dd2: 70 e0 ldi r23, 0x00 ; 0 20dd4: 8f e7 ldi r24, 0x7F ; 127 20dd6: 93 e4 ldi r25, 0x43 ; 67 20dd8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 20ddc: 60 93 ae 04 sts 0x04AE, r22 ; 0x8004ae <_ZL14iState_sum_max.lto_priv.471> 20de0: 70 93 af 04 sts 0x04AF, r23 ; 0x8004af <_ZL14iState_sum_max.lto_priv.471+0x1> 20de4: 80 93 b0 04 sts 0x04B0, r24 ; 0x8004b0 <_ZL14iState_sum_max.lto_priv.471+0x2> 20de8: 90 93 b1 04 sts 0x04B1, r25 ; 0x8004b1 <_ZL14iState_sum_max.lto_priv.471+0x3> #endif //PIDTEMP #ifdef PIDTEMPBED temp_iState_min_bed = 0.0; 20dec: 10 92 aa 04 sts 0x04AA, r1 ; 0x8004aa <_ZL19temp_iState_min_bed.lto_priv.468> 20df0: 10 92 ab 04 sts 0x04AB, r1 ; 0x8004ab <_ZL19temp_iState_min_bed.lto_priv.468+0x1> 20df4: 10 92 ac 04 sts 0x04AC, r1 ; 0x8004ac <_ZL19temp_iState_min_bed.lto_priv.468+0x2> 20df8: 10 92 ad 04 sts 0x04AD, r1 ; 0x8004ad <_ZL19temp_iState_min_bed.lto_priv.468+0x3> temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi; 20dfc: 20 91 35 0e lds r18, 0x0E35 ; 0x800e35 20e00: 30 91 36 0e lds r19, 0x0E36 ; 0x800e36 20e04: 40 91 37 0e lds r20, 0x0E37 ; 0x800e37 20e08: 50 91 38 0e lds r21, 0x0E38 ; 0x800e38 20e0c: 60 e0 ldi r22, 0x00 ; 0 20e0e: 70 e0 ldi r23, 0x00 ; 0 20e10: 8f e7 ldi r24, 0x7F ; 127 20e12: 93 e4 ldi r25, 0x43 ; 67 20e14: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 20e18: 60 93 a6 04 sts 0x04A6, r22 ; 0x8004a6 <_ZL19temp_iState_max_bed.lto_priv.469> 20e1c: 70 93 a7 04 sts 0x04A7, r23 ; 0x8004a7 <_ZL19temp_iState_max_bed.lto_priv.469+0x1> 20e20: 80 93 a8 04 sts 0x04A8, r24 ; 0x8004a8 <_ZL19temp_iState_max_bed.lto_priv.469+0x2> 20e24: 90 93 a9 04 sts 0x04A9, r25 ; 0x8004a9 <_ZL19temp_iState_max_bed.lto_priv.469+0x3> #endif //PIDTEMPBED } #if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1) SET_OUTPUT(HEATER_0_PIN); 20e28: 6d 9a sbi 0x0d, 5 ; 13 #endif #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1) SET_OUTPUT(HEATER_BED_PIN); 20e2a: 9d 9a sbi 0x13, 5 ; 19 #endif #if defined(FAN_PIN) && (FAN_PIN > -1) SET_OUTPUT(FAN_PIN); 20e2c: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 20e30: 88 60 ori r24, 0x08 ; 8 20e32: 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)); 20e36: 80 91 a5 04 lds r24, 0x04A5 ; 0x8004a5 20e3a: 90 e0 ldi r25, 0x00 ; 0 20e3c: b4 e0 ldi r27, 0x04 ; 4 20e3e: 95 95 asr r25 20e40: 87 95 ror r24 20e42: ba 95 dec r27 20e44: e1 f7 brne .-8 ; 0x20e3e 20e46: 80 93 a4 04 sts 0x04A4, r24 ; 0x8004a4 <_ZL12soft_pwm_fan.lto_priv.462> pinMode(MAX6675_SS, OUTPUT); digitalWrite(MAX6675_SS,1); #endif #ifdef HEATER_0_MINTEMP minttemp[0] = HEATER_0_MINTEMP; 20e4a: 8a e0 ldi r24, 0x0A ; 10 20e4c: 90 e0 ldi r25, 0x00 ; 0 20e4e: 90 93 a3 04 sts 0x04A3, r25 ; 0x8004a3 <_ZL8minttemp.lto_priv.463+0x1> 20e52: 80 93 a2 04 sts 0x04A2, r24 ; 0x8004a2 <_ZL8minttemp.lto_priv.463> while(analog2temp(minttemp_raw[0], 0) < HEATER_0_MINTEMP) { 20e56: 80 91 54 02 lds r24, 0x0254 ; 0x800254 <_ZL12minttemp_raw.lto_priv.474> 20e5a: 90 91 55 02 lds r25, 0x0255 ; 0x800255 <_ZL12minttemp_raw.lto_priv.474+0x1> 20e5e: 0f 94 10 a1 call 0x34220 ; 0x34220 20e62: 20 e0 ldi r18, 0x00 ; 0 20e64: 30 e0 ldi r19, 0x00 ; 0 20e66: 40 e2 ldi r20, 0x20 ; 32 20e68: 51 e4 ldi r21, 0x41 ; 65 20e6a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 20e6e: 87 fd sbrc r24, 7 20e70: 02 c0 rjmp .+4 ; 0x20e76 20e72: 0c 94 e3 fe jmp 0x1fdc6 ; 0x1fdc6 #if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP minttemp_raw[0] += OVERSAMPLENR; #else minttemp_raw[0] -= OVERSAMPLENR; 20e76: 80 91 54 02 lds r24, 0x0254 ; 0x800254 <_ZL12minttemp_raw.lto_priv.474> 20e7a: 90 91 55 02 lds r25, 0x0255 ; 0x800255 <_ZL12minttemp_raw.lto_priv.474+0x1> 20e7e: 40 97 sbiw r24, 0x10 ; 16 20e80: 90 93 55 02 sts 0x0255, r25 ; 0x800255 <_ZL12minttemp_raw.lto_priv.474+0x1> 20e84: 80 93 54 02 sts 0x0254, r24 ; 0x800254 <_ZL12minttemp_raw.lto_priv.474> 20e88: e6 cf rjmp .-52 ; 0x20e56 00020e8a : } } void lcd_print_stop_finish(); void lcd_commands() 20e8a: 2f 92 push r2 20e8c: 3f 92 push r3 20e8e: 4f 92 push r4 20e90: 5f 92 push r5 20e92: 6f 92 push r6 20e94: 7f 92 push r7 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 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) 20eae: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 20eb2: 81 30 cpi r24, 0x01 ; 1 20eb4: 09 f0 breq .+2 ; 0x20eb8 20eb6: 61 c0 rjmp .+194 ; 0x20f7a 20eb8: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 20ebc: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 { if (!blocks_queued() && !homing_flag) 20ec0: 98 13 cpse r25, r24 20ec2: 5b c0 rjmp .+182 ; 0x20f7a 20ec4: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 20ec8: 81 11 cpse r24, r1 20eca: 57 c0 rjmp .+174 ; 0x20f7a { custom_message_type = CustomMsg::Status; 20ecc: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 lcd_setstatuspgm(_T(MSG_PRINT_ABORTED)); 20ed0: 8b e0 ldi r24, 0x0B ; 11 20ed2: 9a e4 ldi r25, 0x4A ; 74 20ed4: 0e 94 44 72 call 0xe488 ; 0xe488 20ed8: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_commands_type = LcdCommands::Idle; 20edc: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 20ee0: 82 e0 ldi r24, 0x02 ; 2 20ee2: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::Idle); lcd_commands_step = 0; 20ee6: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa #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(); 20eea: 0f 94 72 43 call 0x286e4 ; 0x286e4 save_statistics(); 20eee: 0e 94 b7 65 call 0xcb6e ; 0xcb6e // lift Z raise_z(10); 20ef2: 60 e0 ldi r22, 0x00 ; 0 20ef4: 70 e0 ldi r23, 0x00 ; 0 20ef6: 80 e2 ldi r24, 0x20 ; 32 20ef8: 91 e4 ldi r25, 0x41 ; 65 20efa: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 // if axis are homed, move to parking position. if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) { 20efe: 80 91 8e 06 lds r24, 0x068E ; 0x80068e 20f02: 88 23 and r24, r24 20f04: 21 f1 breq .+72 ; 0x20f4e 20f06: 80 91 8f 06 lds r24, 0x068F ; 0x80068f 20f0a: 88 23 and r24, r24 20f0c: 01 f1 breq .+64 ; 0x20f4e current_position[X_AXIS] = X_CANCEL_POS; 20f0e: 80 e0 ldi r24, 0x00 ; 0 20f10: 90 e0 ldi r25, 0x00 ; 0 20f12: a8 e4 ldi r26, 0x48 ; 72 20f14: b2 e4 ldi r27, 0x42 ; 66 20f16: 80 93 91 06 sts 0x0691, r24 ; 0x800691 20f1a: 90 93 92 06 sts 0x0692, r25 ; 0x800692 20f1e: a0 93 93 06 sts 0x0693, r26 ; 0x800693 20f22: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = Y_CANCEL_POS; 20f26: 80 e0 ldi r24, 0x00 ; 0 20f28: 90 e0 ldi r25, 0x00 ; 0 20f2a: ae e3 ldi r26, 0x3E ; 62 20f2c: b3 e4 ldi r27, 0x43 ; 67 20f2e: 80 93 95 06 sts 0x0695, r24 ; 0x800695 20f32: 90 93 96 06 sts 0x0696, r25 ; 0x800696 20f36: a0 93 97 06 sts 0x0697, r26 ; 0x800697 20f3a: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(manual_feedrate[0] / 60); 20f3e: 60 e0 ldi r22, 0x00 ; 0 20f40: 70 e0 ldi r23, 0x00 ; 0 20f42: 84 e3 ldi r24, 0x34 ; 52 20f44: 92 e4 ldi r25, 0x42 ; 66 20f46: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 20f4a: 0f 94 a9 43 call 0x28752 ; 0x28752 temp_error_state.assert = true; } bool get_temp_error() { return temp_error_state.v; 20f4e: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> // 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()) { 20f52: 88 23 and r24, r24 20f54: 09 f4 brne .+2 ; 0x20f58 20f56: c8 c0 rjmp .+400 ; 0x210e8 // time to stop the error beep WRITE(BEEPER, LOW); 20f58: 9f b7 in r25, 0x3f ; 63 20f5a: f8 94 cli 20f5c: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20f60: 8b 7f andi r24, 0xFB ; 251 20f62: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 20f66: 9f bf out 0x3f, r25 ; 63 MMU2::mmu2.unload(); // M702 } } } lcd_cooldown(); //turns off heaters and fan; goes to status screen. 20f68: 0f 94 09 30 call 0x26012 ; 0x26012 finishAndDisableSteppers(); //M84 20f6c: 0e 94 00 82 call 0x10400 ; 0x10400 axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative 20f70: 88 e0 ldi r24, 0x08 ; 8 20f72: 80 93 e3 03 sts 0x03E3, r24 ; 0x8003e3 did_pause_print = false; // Clear pause state in case the print was aborted while paused 20f76: 10 92 e2 03 sts 0x03E2, r1 ; 0x8003e2 lcd_commands_step = 0; lcd_print_stop_finish(); } } if (lcd_commands_type == LcdCommands::LongPause) 20f7a: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 20f7e: 82 30 cpi r24, 0x02 ; 2 20f80: 09 f0 breq .+2 ; 0x20f84 20f82: 6a c0 rjmp .+212 ; 0x21058 20f84: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 20f88: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 { if (!blocks_queued() && !homing_flag) 20f8c: 98 13 cpse r25, r24 20f8e: 64 c0 rjmp .+200 ; 0x21058 20f90: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 20f94: 81 11 cpse r24, r1 20f96: 60 c0 rjmp .+192 ; 0x21058 { if (custom_message_type != CustomMsg::M117) 20f98: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 20f9c: 87 30 cpi r24, 0x07 ; 7 20f9e: 41 f0 breq .+16 ; 0x20fb0 { custom_message_type = CustomMsg::Status; 20fa0: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 lcd_setstatuspgm(_T(MSG_PRINT_PAUSED)); 20fa4: 8c ef ldi r24, 0xFC ; 252 20fa6: 99 e4 ldi r25, 0x49 ; 73 20fa8: 0e 94 44 72 call 0xe488 ; 0xe488 20fac: 0e 94 16 f2 call 0x1e42c ; 0x1e42c } lcd_commands_type = LcdCommands::Idle; 20fb0: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 20fb4: 82 e0 ldi r24, 0x02 ; 2 20fb6: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::Idle); lcd_commands_step = 0; 20fba: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa } #endif //PINDA_THERMISTOR void long_pause() //long pause print { st_synchronize(); 20fbe: 0f 94 a9 43 call 0x28752 ; 0x28752 // Stop heaters heating_status = HeatingStatus::NO_HEATING; 20fc2: 10 92 e1 03 sts 0x03E1, r1 ; 0x8003e1 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 20fc6: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 20fca: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 setTargetHotend(0); // Lift z raise_z(pause_position[Z_AXIS]); 20fce: 60 91 47 02 lds r22, 0x0247 ; 0x800247 <_ZL14pause_position.lto_priv.483+0x8> 20fd2: 70 91 48 02 lds r23, 0x0248 ; 0x800248 <_ZL14pause_position.lto_priv.483+0x9> 20fd6: 80 91 49 02 lds r24, 0x0249 ; 0x800249 <_ZL14pause_position.lto_priv.483+0xa> 20fda: 90 91 4a 02 lds r25, 0x024A ; 0x80024a <_ZL14pause_position.lto_priv.483+0xb> 20fde: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 // Move XY to side if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) { 20fe2: 80 91 8e 06 lds r24, 0x068E ; 0x80068e 20fe6: 88 23 and r24, r24 20fe8: 51 f1 breq .+84 ; 0x2103e 20fea: 80 91 8f 06 lds r24, 0x068F ; 0x80068f 20fee: 88 23 and r24, r24 20ff0: 31 f1 breq .+76 ; 0x2103e current_position[X_AXIS] = pause_position[X_AXIS]; 20ff2: 80 91 3f 02 lds r24, 0x023F ; 0x80023f <_ZL14pause_position.lto_priv.483> 20ff6: 90 91 40 02 lds r25, 0x0240 ; 0x800240 <_ZL14pause_position.lto_priv.483+0x1> 20ffa: a0 91 41 02 lds r26, 0x0241 ; 0x800241 <_ZL14pause_position.lto_priv.483+0x2> 20ffe: b0 91 42 02 lds r27, 0x0242 ; 0x800242 <_ZL14pause_position.lto_priv.483+0x3> 21002: 80 93 91 06 sts 0x0691, r24 ; 0x800691 21006: 90 93 92 06 sts 0x0692, r25 ; 0x800692 2100a: a0 93 93 06 sts 0x0693, r26 ; 0x800693 2100e: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = pause_position[Y_AXIS]; 21012: 80 91 43 02 lds r24, 0x0243 ; 0x800243 <_ZL14pause_position.lto_priv.483+0x4> 21016: 90 91 44 02 lds r25, 0x0244 ; 0x800244 <_ZL14pause_position.lto_priv.483+0x5> 2101a: a0 91 45 02 lds r26, 0x0245 ; 0x800245 <_ZL14pause_position.lto_priv.483+0x6> 2101e: b0 91 46 02 lds r27, 0x0246 ; 0x800246 <_ZL14pause_position.lto_priv.483+0x7> 21022: 80 93 95 06 sts 0x0695, r24 ; 0x800695 21026: 90 93 96 06 sts 0x0696, r25 ; 0x800696 2102a: a0 93 97 06 sts 0x0697, r26 ; 0x800697 2102e: b0 93 98 06 sts 0x0698, r27 ; 0x800698 plan_buffer_line_curposXYZE(50); 21032: 60 e0 ldi r22, 0x00 ; 0 21034: 70 e0 ldi r23, 0x00 ; 0 21036: 88 e4 ldi r24, 0x48 ; 72 21038: 92 e4 ldi r25, 0x42 ; 66 2103a: 0f 94 3d c0 call 0x3807a ; 0x3807a 2103e: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> } // did we come here from a thermal error? if(get_temp_error()) { 21042: 88 23 and r24, r24 21044: 09 f4 brne .+2 ; 0x21048 21046: 7a c0 rjmp .+244 ; 0x2113c // time to stop the error beep WRITE(BEEPER, LOW); 21048: 9f b7 in r25, 0x3f ; 63 2104a: f8 94 cli 2104c: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 21050: 8b 7f andi r24, 0xFB ; 251 21052: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 21056: 9f bf out 0x3f, r25 ; 63 long_pause(); } } if (lcd_commands_type == LcdCommands::Layer1Cal) 21058: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 2105c: 84 30 cpi r24, 0x04 ; 4 2105e: 09 f0 breq .+2 ; 0x21062 21060: a7 c0 rjmp .+334 ; 0x211b0 { const uint16_t nozzle_dia = eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM); 21062: 85 ea ldi r24, 0xA5 ; 165 21064: 9d e0 ldi r25, 0x0D ; 13 21066: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2106a: 30 91 a4 0d lds r19, 0x0DA4 ; 0x800da4 2106e: 20 91 a5 0d lds r18, 0x0DA5 ; 0x800da5 const float extrusion_width = (nozzle_dia + 20)/1000.0f; const float layer_height = 0.2f; if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) 21072: 32 13 cpse r19, r18 21074: 74 c1 rjmp .+744 ; 0x2135e 21076: 20 91 a2 10 lds r18, 0x10A2 ; 0x8010a2 2107a: 30 91 a3 10 lds r19, 0x10A3 ; 0x8010a3 2107e: 23 2b or r18, r19 21080: 09 f0 breq .+2 ; 0x21084 21082: 6d c1 rjmp .+730 ; 0x2135e 21084: c0 91 a8 0d lds r28, 0x0DA8 ; 0x800da8 21088: c1 11 cpse r28, r1 2108a: 69 c1 rjmp .+722 ; 0x2135e { if (lcd_commands_step == 0) 2108c: 20 91 fa 03 lds r18, 0x03FA ; 0x8003fa 21090: 21 11 cpse r18, r1 21092: 57 c0 rjmp .+174 ; 0x21142 lcd_commands_step = 12; 21094: 2c e0 ldi r18, 0x0C ; 12 else lcd_commands_step--; 21096: 20 93 fa 03 sts 0x03FA, r18 ; 0x8003fa } 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; 2109a: 44 96 adiw r24, 0x14 ; 20 2109c: bc 01 movw r22, r24 2109e: 90 e0 ldi r25, 0x00 ; 0 210a0: 80 e0 ldi r24, 0x00 ; 0 210a2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 210a6: 20 e0 ldi r18, 0x00 ; 0 210a8: 30 e0 ldi r19, 0x00 ; 0 210aa: 4a e7 ldi r20, 0x7A ; 122 210ac: 54 e4 ldi r21, 0x44 ; 68 210ae: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 210b2: 4b 01 movw r8, r22 210b4: 5c 01 movw r10, r24 if (lcd_commands_step == 0) lcd_commands_step = 12; else lcd_commands_step--; switch(lcd_commands_step) 210b6: e0 91 fa 03 lds r30, 0x03FA ; 0x8003fa 210ba: e1 50 subi r30, 0x01 ; 1 210bc: ec 30 cpi r30, 0x0C ; 12 210be: 08 f0 brcs .+2 ; 0x210c2 210c0: 77 c0 rjmp .+238 ; 0x211b0 210c2: f0 e0 ldi r31, 0x00 ; 0 210c4: 88 27 eor r24, r24 210c6: e8 59 subi r30, 0x98 ; 152 210c8: f7 4f sbci r31, 0xF7 ; 247 210ca: 8e 4f sbci r24, 0xFE ; 254 210cc: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 210d0: 14 39 cpi r17, 0x94 ; 148 210d2: 3c 39 cpi r19, 0x9C ; 156 210d4: 72 3a cpi r23, 0xA2 ; 162 210d6: 72 3a cpi r23, 0xA2 ; 162 210d8: 72 3a cpi r23, 0xA2 ; 162 210da: 72 3a cpi r23, 0xA2 ; 162 210dc: ca 39 cpi r28, 0x9A ; 154 210de: d8 39 cpi r29, 0x98 ; 152 210e0: 04 3a cpi r16, 0xA4 ; 164 210e2: 9c 3a cpi r25, 0xAC ; 172 210e4: 70 39 cpi r23, 0x90 ; 144 210e6: e0 38 cpi r30, 0x80 ; 128 if(get_temp_error()) { // time to stop the error beep WRITE(BEEPER, LOW); } else { // Turn off the print fan fanSpeed = 0; 210e8: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 { #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(); 210ec: 0e 94 79 74 call 0xe8f2 ; 0xe8f2 setExtruderAutoFanState(1); 210f0: 81 e0 ldi r24, 0x01 ; 1 210f2: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 // restore the auto hotend state hotendDefaultAutoFanState(); if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament() #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 210f6: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 210fa: 81 30 cpi r24, 0x01 ; 1 210fc: 09 f0 breq .+2 ; 0x21100 210fe: 34 cf rjmp .-408 ; 0x20f68 fanSpeed = 0; // restore the auto hotend state hotendDefaultAutoFanState(); if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament() 21100: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 21104: 88 23 and r24, r24 21106: 09 f4 brne .+2 ; 0x2110a 21108: 2f cf rjmp .-418 ; 0x20f68 #ifdef FANCHECK && fan_check_error != EFCE_REPORTED 2110a: 80 91 e4 03 lds r24, 0x03E4 ; 0x8003e4 2110e: 82 30 cpi r24, 0x02 ; 2 21110: 09 f4 brne .+2 ; 0x21114 21112: 2a cf rjmp .-428 ; 0x20f68 #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()) 21114: 0e 94 1d 67 call 0xce3a ; 0xce3a 21118: 81 11 cpse r24, r1 { // Restore temperature saved in ram after pausing print restore_extruder_temperature_from_ram(); 2111a: 0e 94 61 64 call 0xc8c2 ; 0xc8c2 } // 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) { 2111e: 20 91 b5 0d lds r18, 0x0DB5 ; 0x800db5 21122: 30 91 b6 0d lds r19, 0x0DB6 ; 0x800db6 21126: 80 91 6b 02 lds r24, 0x026B ; 0x80026b 2112a: 90 91 6c 02 lds r25, 0x026C ; 0x80026c 2112e: 28 17 cp r18, r24 21130: 39 07 cpc r19, r25 21132: 0c f4 brge .+2 ; 0x21136 21134: 19 cf rjmp .-462 ; 0x20f68 MMU2::mmu2.unload(); // M702 21136: 0f 94 31 ad call 0x35a62 ; 0x35a62 2113a: 16 cf rjmp .-468 ; 0x20f68 } else { // Turn off the print fan fanSpeed = 0; 2113c: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 21140: 8b cf rjmp .-234 ; 0x21058 if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) { if (lcd_commands_step == 0) lcd_commands_step = 12; else lcd_commands_step--; 21142: 21 50 subi r18, 0x01 ; 1 21144: a8 cf rjmp .-176 ; 0x21096 preheat_cmd_3, preheat_cmd_4, zero_extrusion }; lay1cal_common_enqueue_loop(preheat_cmd, sizeof(preheat_cmd)/sizeof(preheat_cmd[0])); 21146: 65 e0 ldi r22, 0x05 ; 5 21148: 8c e8 ldi r24, 0x8C ; 140 2114a: 9a e8 ldi r25, 0x8A ; 138 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]))); 2114c: 0e 94 37 88 call 0x1106e ; 0x1106e 21150: 2f c0 rjmp .+94 ; 0x211b0 //! @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()) 21152: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 21156: 81 30 cpi r24, 0x01 ; 1 21158: 49 f5 brne .+82 ; 0x211ac { case 12: lay1cal_wait_preheat(); break; case 11: extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament); 2115a: d0 91 f9 03 lds r29, 0x03F9 ; 0x8003f9 { enquecommand_P(MSG_M83); 2115e: 61 e0 ldi r22, 0x01 ; 1 21160: 86 e7 ldi r24, 0x76 ; 118 21162: 9b e6 ldi r25, 0x6B ; 107 21164: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("G1Y-3F1000")); 21168: 61 e0 ldi r22, 0x01 ; 1 2116a: 81 e8 ldi r24, 0x81 ; 129 2116c: 9a e8 ldi r25, 0x8A ; 138 2116e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("G1Z0.4")); 21172: 61 e0 ldi r22, 0x01 ; 1 21174: 8a e7 ldi r24, 0x7A ; 122 21176: 9a e8 ldi r25, 0x8A ; 138 21178: 0e 94 b8 87 call 0x10f70 ; 0x10f70 uint8_t currentTool = MMU2::mmu2.get_current_tool(); 2117c: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 if(currentTool == filament ){ 21180: d8 17 cp r29, r24 21182: a1 f0 breq .+40 ; 0x211ac // already have the correct tool loaded - do nothing return false; } else if( currentTool != (uint8_t)MMU2::FILAMENT_UNKNOWN){ 21184: 8f 3f cpi r24, 0xFF ; 255 21186: 29 f0 breq .+10 ; 0x21192 // some other slot is loaded, perform an unload first enquecommand_P(MSG_M702); 21188: 61 e0 ldi r22, 0x01 ; 1 2118a: 81 e7 ldi r24, 0x71 ; 113 2118c: 9b e6 ldi r25, 0x6B ; 107 2118e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 } // perform a toolchange enquecommandf_P(PSTR("T%d"), filament); 21192: 1f 92 push r1 21194: df 93 push r29 21196: 86 e7 ldi r24, 0x76 ; 118 21198: 9a e8 ldi r25, 0x8A ; 138 2119a: 9f 93 push r25 2119c: 8f 93 push r24 2119e: 0e 94 56 88 call 0x110ac ; 0x110ac 211a2: 0f 90 pop r0 211a4: 0f 90 pop r0 211a6: 0f 90 pop r0 211a8: 0f 90 pop r0 return true; 211aa: c1 e0 ldi r28, 0x01 ; 1 211ac: c0 93 f8 03 sts 0x03F8, r28 ; 0x8003f8 break; } } } if (lcd_commands_type == LcdCommands::PidExtruder) { 211b0: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 211b4: 83 30 cpi r24, 0x03 ; 3 211b6: 09 f0 breq .+2 ; 0x211ba 211b8: d2 c0 rjmp .+420 ; 0x2135e if (lcd_commands_step == 0) { 211ba: 90 91 fa 03 lds r25, 0x03FA ; 0x8003fa 211be: 91 11 cpse r25, r1 211c0: 09 c0 rjmp .+18 ; 0x211d4 custom_message_type = CustomMsg::PidCal; 211c2: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 custom_message_state = 1; 211c6: 91 e0 ldi r25, 0x01 ; 1 211c8: 90 93 f6 03 sts 0x03F6, r25 ; 0x8003f6 lcd_draw_update = 3; 211cc: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d lcd_commands_step = 3; 211d0: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa } if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration 211d4: 80 91 fa 03 lds r24, 0x03FA ; 0x8003fa 211d8: 83 30 cpi r24, 0x03 ; 3 211da: 19 f5 brne .+70 ; 0x21222 211dc: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 211e0: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 211e4: 98 13 cpse r25, r24 211e6: 1d c0 rjmp .+58 ; 0x21222 return !pid_tuning_finished; } void preparePidTuning() { // ensure heaters are disabled before we switch off PID management! disable_heater(); 211e8: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 pid_tuning_finished = false; 211ec: 10 92 3e 02 sts 0x023E, r1 ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> 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); 211f0: 80 91 4c 02 lds r24, 0x024C ; 0x80024c <_ZL8pid_temp.lto_priv.443+0x1> 211f4: 8f 93 push r24 211f6: 80 91 4b 02 lds r24, 0x024B ; 0x80024b <_ZL8pid_temp.lto_priv.443> 211fa: 8f 93 push r24 211fc: 81 e2 ldi r24, 0x21 ; 33 211fe: 9b e8 ldi r25, 0x8B ; 139 21200: 9f 93 push r25 21202: 8f 93 push r24 21204: 0e 94 56 88 call 0x110ac ; 0x110ac lcd_setstatuspgm(_T(MSG_PID_RUNNING)); 21208: 81 ef ldi r24, 0xF1 ; 241 2120a: 99 e4 ldi r25, 0x49 ; 73 2120c: 0e 94 44 72 call 0xe488 ; 0xe488 21210: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_commands_step = 2; 21214: 82 e0 ldi r24, 0x02 ; 2 21216: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa 2121a: 0f 90 pop r0 2121c: 0f 90 pop r0 2121e: 0f 90 pop r0 21220: 0f 90 pop r0 } if (lcd_commands_step == 2 && !pidTuningRunning()) { //saving to eeprom 21222: 80 91 fa 03 lds r24, 0x03FA ; 0x8003fa 21226: 82 30 cpi r24, 0x02 ; 2 21228: 09 f0 breq .+2 ; 0x2122c 2122a: 7a c0 rjmp .+244 ; 0x21320 2122c: 80 91 3e 02 lds r24, 0x023E ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> 21230: 88 23 and r24, r24 21232: 09 f4 brne .+2 ; 0x21236 21234: 75 c0 rjmp .+234 ; 0x21320 custom_message_state = 0; 21236: 10 92 f6 03 sts 0x03F6, r1 ; 0x8003f6 lcd_setstatuspgm(_T(MSG_PID_FINISHED)); 2123a: 8d ed ldi r24, 0xDD ; 221 2123c: 99 e4 ldi r25, 0x49 ; 73 2123e: 0e 94 44 72 call 0xe488 ; 0xe488 21242: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 21246: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 2124a: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 setTargetHotend(0); if (_Kp != 0 || _Ki != 0 || _Kd != 0) { 2124e: c0 91 f2 03 lds r28, 0x03F2 ; 0x8003f2 <_Kp> 21252: d0 91 f3 03 lds r29, 0x03F3 ; 0x8003f3 <_Kp+0x1> 21256: 10 91 f4 03 lds r17, 0x03F4 ; 0x8003f4 <_Kp+0x2> 2125a: 00 91 f5 03 lds r16, 0x03F5 ; 0x8003f5 <_Kp+0x3> 2125e: 20 e0 ldi r18, 0x00 ; 0 21260: 30 e0 ldi r19, 0x00 ; 0 21262: a9 01 movw r20, r18 21264: f8 01 movw r30, r16 21266: 6c 2f mov r22, r28 21268: 7d 2f mov r23, r29 2126a: 8f 2f mov r24, r31 2126c: 9e 2f mov r25, r30 2126e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 21272: 81 11 cpse r24, r1 21274: 1f c0 rjmp .+62 ; 0x212b4 21276: 20 e0 ldi r18, 0x00 ; 0 21278: 30 e0 ldi r19, 0x00 ; 0 2127a: a9 01 movw r20, r18 2127c: 60 91 ee 03 lds r22, 0x03EE ; 0x8003ee <_Ki> 21280: 70 91 ef 03 lds r23, 0x03EF ; 0x8003ef <_Ki+0x1> 21284: 80 91 f0 03 lds r24, 0x03F0 ; 0x8003f0 <_Ki+0x2> 21288: 90 91 f1 03 lds r25, 0x03F1 ; 0x8003f1 <_Ki+0x3> 2128c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 21290: 81 11 cpse r24, r1 21292: 10 c0 rjmp .+32 ; 0x212b4 21294: 20 e0 ldi r18, 0x00 ; 0 21296: 30 e0 ldi r19, 0x00 ; 0 21298: a9 01 movw r20, r18 2129a: 60 91 ea 03 lds r22, 0x03EA ; 0x8003ea <_Kd> 2129e: 70 91 eb 03 lds r23, 0x03EB ; 0x8003eb <_Kd+0x1> 212a2: 80 91 ec 03 lds r24, 0x03EC ; 0x8003ec <_Kd+0x2> 212a6: 90 91 ed 03 lds r25, 0x03ED ; 0x8003ed <_Kd+0x3> 212aa: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 212ae: 88 23 and r24, r24 212b0: 09 f4 brne .+2 ; 0x212b4 212b2: 7d c2 rjmp .+1274 ; 0x217ae enquecommandf_P(PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd); 212b4: 80 91 ed 03 lds r24, 0x03ED ; 0x8003ed <_Kd+0x3> 212b8: 8f 93 push r24 212ba: 80 91 ec 03 lds r24, 0x03EC ; 0x8003ec <_Kd+0x2> 212be: 8f 93 push r24 212c0: 80 91 eb 03 lds r24, 0x03EB ; 0x8003eb <_Kd+0x1> 212c4: 8f 93 push r24 212c6: 80 91 ea 03 lds r24, 0x03EA ; 0x8003ea <_Kd> 212ca: 8f 93 push r24 212cc: 80 91 f1 03 lds r24, 0x03F1 ; 0x8003f1 <_Ki+0x3> 212d0: 8f 93 push r24 212d2: 80 91 f0 03 lds r24, 0x03F0 ; 0x8003f0 <_Ki+0x2> 212d6: 8f 93 push r24 212d8: 80 91 ef 03 lds r24, 0x03EF ; 0x8003ef <_Ki+0x1> 212dc: 8f 93 push r24 212de: 80 91 ee 03 lds r24, 0x03EE ; 0x8003ee <_Ki> 212e2: 8f 93 push r24 212e4: 0f 93 push r16 212e6: 1f 93 push r17 212e8: df 93 push r29 212ea: cf 93 push r28 212ec: 8a e0 ldi r24, 0x0A ; 10 212ee: 9b e8 ldi r25, 0x8B ; 139 212f0: 9f 93 push r25 212f2: 8f 93 push r24 212f4: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommand_P(MSG_M500); 212f8: 61 e0 ldi r22, 0x01 ; 1 212fa: 80 e8 ldi r24, 0x80 ; 128 212fc: 9b e6 ldi r25, 0x6B ; 107 212fe: 0e 94 b8 87 call 0x10f70 ; 0x10f70 21302: 8d b7 in r24, 0x3d ; 61 21304: 9e b7 in r25, 0x3e ; 62 21306: 0e 96 adiw r24, 0x0e ; 14 21308: 0f b6 in r0, 0x3f ; 63 2130a: f8 94 cli 2130c: 9e bf out 0x3e, r25 ; 62 2130e: 0f be out 0x3f, r0 ; 63 21310: 8d bf out 0x3d, r24 ; 61 } else { SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM."); } display_time.start(); 21312: 87 ee ldi r24, 0xE7 ; 231 21314: 93 e0 ldi r25, 0x03 ; 3 21316: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> lcd_commands_step = 1; 2131a: 81 e0 ldi r24, 0x01 ; 1 2131c: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa } if ((lcd_commands_step == 1) && display_time.expired(2000)) { //calibration finished message 21320: 80 91 fa 03 lds r24, 0x03FA ; 0x8003fa 21324: 81 30 cpi r24, 0x01 ; 1 21326: d9 f4 brne .+54 ; 0x2135e 21328: 60 ed ldi r22, 0xD0 ; 208 2132a: 77 e0 ldi r23, 0x07 ; 7 2132c: 87 ee ldi r24, 0xE7 ; 231 2132e: 93 e0 ldi r25, 0x03 ; 3 21330: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 21334: 88 23 and r24, r24 21336: 99 f0 breq .+38 ; 0x2135e lcd_setstatuspgm(MSG_WELCOME); 21338: 82 e1 ldi r24, 0x12 ; 18 2133a: 90 e7 ldi r25, 0x70 ; 112 2133c: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = CustomMsg::Status; 21340: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 pid_temp = DEFAULT_PID_TEMP; 21344: 82 ed ldi r24, 0xD2 ; 210 21346: 90 e0 ldi r25, 0x00 ; 0 21348: 90 93 4c 02 sts 0x024C, r25 ; 0x80024c <_ZL8pid_temp.lto_priv.443+0x1> 2134c: 80 93 4b 02 sts 0x024B, r24 ; 0x80024b <_ZL8pid_temp.lto_priv.443> lcd_commands_step = 0; 21350: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa lcd_commands_type = LcdCommands::Idle; 21354: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 21358: 82 e0 ldi r24, 0x02 ; 2 2135a: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::Idle); } } #ifdef THERMAL_MODEL if (lcd_commands_type == LcdCommands::ThermalModel && cmd_buffer_empty()) 2135e: 90 91 b3 0d lds r25, 0x0DB3 ; 0x800db3 21362: 95 30 cpi r25, 0x05 ; 5 21364: 99 f4 brne .+38 ; 0x2138c 21366: 20 91 a2 10 lds r18, 0x10A2 ; 0x8010a2 2136a: 30 91 a3 10 lds r19, 0x10A3 ; 0x8010a3 2136e: 23 2b or r18, r19 21370: 71 f5 brne .+92 ; 0x213ce { switch (lcd_commands_step) 21372: 80 91 fa 03 lds r24, 0x03FA ; 0x8003fa 21376: 82 30 cpi r24, 0x02 ; 2 21378: 09 f4 brne .+2 ; 0x2137c 2137a: 42 c2 rjmp .+1156 ; 0x21800 2137c: 08 f0 brcs .+2 ; 0x21380 2137e: 1c c2 rjmp .+1080 ; 0x217b8 21380: 88 23 and r24, r24 21382: 09 f4 brne .+2 ; 0x21386 21384: 2d c2 rjmp .+1114 ; 0x217e0 21386: 81 30 cpi r24, 0x01 ; 1 21388: 09 f4 brne .+2 ; 0x2138c 2138a: 45 c2 rjmp .+1162 ; 0x21816 break; } } #endif //THERMAL_MODEL if (lcd_commands_type == LcdCommands::NozzleCNG) 2138c: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 21390: 86 30 cpi r24, 0x06 ; 6 21392: e9 f4 brne .+58 ; 0x213ce 21394: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 21398: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 { if (!blocks_queued() && cmd_buffer_empty() && !saved_printing) 2139c: 98 13 cpse r25, r24 2139e: 17 c0 rjmp .+46 ; 0x213ce 213a0: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 213a4: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 213a8: 89 2b or r24, r25 213aa: 89 f4 brne .+34 ; 0x213ce 213ac: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 213b0: 81 11 cpse r24, r1 213b2: 0d c0 rjmp .+26 ; 0x213ce #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) 213b4: 80 91 fa 03 lds r24, 0x03FA ; 0x8003fa 213b8: 81 30 cpi r24, 0x01 ; 1 213ba: 09 f4 brne .+2 ; 0x213be 213bc: 81 c2 rjmp .+1282 ; 0x218c0 213be: 08 f4 brcc .+2 ; 0x213c2 213c0: 44 c2 rjmp .+1160 ; 0x2184a 213c2: 82 30 cpi r24, 0x02 ; 2 213c4: 09 f4 brne .+2 ; 0x213c8 213c6: 63 c2 rjmp .+1222 ; 0x2188e 213c8: 83 30 cpi r24, 0x03 ; 3 213ca: 09 f4 brne .+2 ; 0x213ce 213cc: 42 c2 rjmp .+1156 ; 0x21852 menu_depth = 3; break; } } } } 213ce: df 91 pop r29 213d0: cf 91 pop r28 213d2: 1f 91 pop r17 213d4: 0f 91 pop r16 213d6: ff 90 pop r15 213d8: ef 90 pop r14 213da: df 90 pop r13 213dc: cf 90 pop r12 213de: bf 90 pop r11 213e0: af 90 pop r10 213e2: 9f 90 pop r9 213e4: 8f 90 pop r8 213e6: 7f 90 pop r7 213e8: 6f 90 pop r6 213ea: 5f 90 pop r5 213ec: 4f 90 pop r4 213ee: 3f 90 pop r3 213f0: 2f 90 pop r2 213f2: 08 95 ret break; case 11: extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament); break; case 10: lcd_clear(); 213f4: 0e 94 ab 6e call 0xdd56 ; 0xdd56 menu_depth = 0; 213f8: 10 92 f7 03 sts 0x03F7, r1 ; 0x8003f7 menu_submenu(lcd_babystep_z, true); 213fc: 61 e0 ldi r22, 0x01 ; 1 213fe: 8a e2 ldi r24, 0x2A ; 42 21400: 99 e3 ldi r25, 0x39 ; 57 21402: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee cmd_intro_mmu_9, cmd_intro_mmu_10, cmd_intro_mmu_11, }; if (MMU2::mmu2.Enabled()) 21406: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 2140a: 81 30 cpi r24, 0x01 ; 1 2140c: b9 f4 brne .+46 ; 0x2143c { for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i) 2140e: 80 91 f8 03 lds r24, 0x03F8 ; 0x8003f8 21412: 10 e0 ldi r17, 0x00 ; 0 21414: 81 11 cpse r24, r1 21416: 01 c0 rjmp .+2 ; 0x2141a 21418: 12 e0 ldi r17, 0x02 ; 2 2141a: c1 2f mov r28, r17 2141c: d0 e0 ldi r29, 0x00 ; 0 2141e: cc 0f add r28, r28 21420: dd 1f adc r29, r29 21422: cc 59 subi r28, 0x9C ; 156 21424: d5 47 sbci r29, 0x75 ; 117 { enquecommand_P(static_cast(pgm_read_ptr(&cmd_intro_mmu[i]))); 21426: fe 01 movw r30, r28 21428: 85 91 lpm r24, Z+ 2142a: 94 91 lpm r25, Z 2142c: 61 e0 ldi r22, 0x01 ; 1 2142e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 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) 21432: 1f 5f subi r17, 0xFF ; 255 21434: 22 96 adiw r28, 0x02 ; 2 21436: 19 30 cpi r17, 0x09 ; 9 21438: b1 f7 brne .-20 ; 0x21426 2143a: ba ce rjmp .-652 ; 0x211b0 enquecommand_P(static_cast(pgm_read_ptr(&cmd_intro_mmu[i]))); } } else { enquecommand_P(feedrate_F1080); //fixed velocity for the intro line 2143c: 61 e0 ldi r22, 0x01 ; 1 2143e: 8c e5 ldi r24, 0x5C ; 92 21440: 9a e8 ldi r25, 0x8A ; 138 21442: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommandf_P(extrude_fmt_X, 60.f, count_e(layer_height, extrusion_width * 4.f, 60)); 21446: 20 e0 ldi r18, 0x00 ; 0 21448: 30 e0 ldi r19, 0x00 ; 0 2144a: 40 e8 ldi r20, 0x80 ; 128 2144c: 50 e4 ldi r21, 0x40 ; 64 2144e: c5 01 movw r24, r10 21450: b4 01 movw r22, r8 21452: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 21456: 20 e0 ldi r18, 0x00 ; 0 21458: 30 e0 ldi r19, 0x00 ; 0 2145a: 40 e7 ldi r20, 0x70 ; 112 2145c: 52 e4 ldi r21, 0x42 ; 66 2145e: 0f 94 b8 87 call 0x30f70 ; 0x30f70 21462: 9f 93 push r25 21464: 8f 93 push r24 21466: 7f 93 push r23 21468: 6f 93 push r22 2146a: 82 e4 ldi r24, 0x42 ; 66 2146c: 8f 93 push r24 2146e: 80 e7 ldi r24, 0x70 ; 112 21470: 8f 93 push r24 21472: 1f 92 push r1 21474: 1f 92 push r1 21476: cf e4 ldi r28, 0x4F ; 79 21478: da e8 ldi r29, 0x8A ; 138 2147a: df 93 push r29 2147c: cf 93 push r28 2147e: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_X, 202.5f, count_e(layer_height, extrusion_width * 8.f, 142.5)); 21482: 20 e0 ldi r18, 0x00 ; 0 21484: 30 e0 ldi r19, 0x00 ; 0 21486: 40 e0 ldi r20, 0x00 ; 0 21488: 51 e4 ldi r21, 0x41 ; 65 2148a: c5 01 movw r24, r10 2148c: b4 01 movw r22, r8 2148e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 21492: 20 e0 ldi r18, 0x00 ; 0 21494: 30 e8 ldi r19, 0x80 ; 128 21496: 4e e0 ldi r20, 0x0E ; 14 21498: 53 e4 ldi r21, 0x43 ; 67 2149a: 0f 94 b8 87 call 0x30f70 ; 0x30f70 2149e: 9f 93 push r25 214a0: 8f 93 push r24 214a2: 7f 93 push r23 214a4: 6f 93 push r22 214a6: 83 e4 ldi r24, 0x43 ; 67 214a8: 8f 93 push r24 214aa: 8a e4 ldi r24, 0x4A ; 74 214ac: 8f 93 push r24 214ae: 80 e8 ldi r24, 0x80 ; 128 214b0: 8f 93 push r24 214b2: 1f 92 push r1 214b4: df 93 push r29 214b6: cf 93 push r28 214b8: 0e 94 56 88 call 0x110ac ; 0x110ac 214bc: 8d b7 in r24, 0x3d ; 61 214be: 9e b7 in r25, 0x3e ; 62 214c0: 44 96 adiw r24, 0x14 ; 20 214c2: 0f b6 in r0, 0x3f ; 63 214c4: f8 94 cli 214c6: 9e bf out 0x3e, r25 ; 62 214c8: 0f be out 0x3f, r0 ; 63 214ca: 8d bf out 0x3d, r24 ; 61 214cc: 71 ce rjmp .-798 ; 0x211b0 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]))); 214ce: 66 e0 ldi r22, 0x06 ; 6 214d0: 83 e4 ldi r24, 0x43 ; 67 214d2: 9a e8 ldi r25, 0x8A ; 138 214d4: 3b ce rjmp .-906 ; 0x2114c //! @brief Print meander start void lay1cal_meander_start(float layer_height, float extrusion_width) { #ifndef NEW_FIRST_LAYER_CAL enquecommand_P(PSTR("G1X50Y155")); 214d6: 61 e0 ldi r22, 0x01 ; 1 214d8: 89 e3 ldi r24, 0x39 ; 57 214da: 9a e8 ldi r25, 0x8A ; 138 214dc: 0e 94 b8 87 call 0x10f70 ; 0x10f70 #endif //_NEW_FIRST_LAYER_CAL static const char fmt1[] PROGMEM = "G1Z%.2f"; enquecommandf_P(fmt1, layer_height); 214e0: 8e e3 ldi r24, 0x3E ; 62 214e2: 8f 93 push r24 214e4: 8c e4 ldi r24, 0x4C ; 76 214e6: 8f 93 push r24 214e8: 8c ec ldi r24, 0xCC ; 204 214ea: 8f 93 push r24 214ec: 8d ec ldi r24, 0xCD ; 205 214ee: 8f 93 push r24 214f0: 81 e3 ldi r24, 0x31 ; 49 214f2: 9a e8 ldi r25, 0x8A ; 138 214f4: 9f 93 push r25 214f6: 8f 93 push r24 214f8: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommand_P(feedrate_F1080); 214fc: 61 e0 ldi r22, 0x01 ; 1 214fe: 8c e5 ldi r24, 0x5C ; 92 21500: 9a e8 ldi r25, 0x8A ; 138 21502: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(MSG_G91); //enable relative XYZ 21506: 61 e0 ldi r22, 0x01 ; 1 21508: 8d e6 ldi r24, 0x6D ; 109 2150a: 9b e6 ldi r25, 0x6B ; 107 2150c: 0e 94 b8 87 call 0x10f70 ; 0x10f70 #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)); 21510: 20 e0 ldi r18, 0x00 ; 0 21512: 30 e0 ldi r19, 0x00 ; 0 21514: 40 e8 ldi r20, 0x80 ; 128 21516: 50 e4 ldi r21, 0x40 ; 64 21518: c5 01 movw r24, r10 2151a: b4 01 movw r22, r8 2151c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 21520: 20 e0 ldi r18, 0x00 ; 0 21522: 30 e0 ldi r19, 0x00 ; 0 21524: 48 ec ldi r20, 0xC8 ; 200 21526: 51 e4 ldi r21, 0x41 ; 65 21528: 0f 94 b8 87 call 0x30f70 ; 0x30f70 2152c: 9f 93 push r25 2152e: 8f 93 push r24 21530: 7f 93 push r23 21532: 6f 93 push r22 21534: 01 e4 ldi r16, 0x41 ; 65 21536: 0f 93 push r16 21538: 18 ec ldi r17, 0xC8 ; 200 2153a: 1f 93 push r17 2153c: 1f 92 push r1 2153e: 1f 92 push r1 21540: cf e4 ldi r28, 0x4F ; 79 21542: da e8 ldi r29, 0x8A ; 138 21544: df 93 push r29 21546: cf 93 push r28 21548: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_X, 25.f*invert, count_e(layer_height, extrusion_width * 2.f, 25)); 2154c: a5 01 movw r20, r10 2154e: 94 01 movw r18, r8 21550: c5 01 movw r24, r10 21552: b4 01 movw r22, r8 21554: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 21558: 20 e0 ldi r18, 0x00 ; 0 2155a: 30 e0 ldi r19, 0x00 ; 0 2155c: 48 ec ldi r20, 0xC8 ; 200 2155e: 51 e4 ldi r21, 0x41 ; 65 21560: 0f 94 b8 87 call 0x30f70 ; 0x30f70 21564: 9f 93 push r25 21566: 8f 93 push r24 21568: 7f 93 push r23 2156a: 6f 93 push r22 2156c: 0f 93 push r16 2156e: 1f 93 push r17 21570: 1f 92 push r1 21572: 1f 92 push r1 21574: df 93 push r29 21576: cf 93 push r28 21578: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_X, 100.f*invert, count_e(layer_height, extrusion_width, 100)); 2157c: 20 e0 ldi r18, 0x00 ; 0 2157e: 30 e0 ldi r19, 0x00 ; 0 21580: 48 ec ldi r20, 0xC8 ; 200 21582: 52 e4 ldi r21, 0x42 ; 66 21584: c5 01 movw r24, r10 21586: b4 01 movw r22, r8 21588: 0f 94 b8 87 call 0x30f70 ; 0x30f70 2158c: 9f 93 push r25 2158e: 8f 93 push r24 21590: 7f 93 push r23 21592: 6f 93 push r22 21594: 82 e4 ldi r24, 0x42 ; 66 21596: 8f 93 push r24 21598: 1f 93 push r17 2159a: 1f 92 push r1 2159c: 1f 92 push r1 2159e: df 93 push r29 215a0: cf 93 push r28 215a2: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_Y, -20.f*invert, count_e(layer_height, extrusion_width, 20)); 215a6: 8d b7 in r24, 0x3d ; 61 215a8: 9e b7 in r25, 0x3e ; 62 215aa: 84 96 adiw r24, 0x24 ; 36 215ac: 0f b6 in r0, 0x3f ; 63 215ae: f8 94 cli 215b0: 9e bf out 0x3e, r25 ; 62 215b2: 0f be out 0x3f, r0 ; 63 215b4: 8d bf out 0x3d, r24 ; 61 215b6: 20 e0 ldi r18, 0x00 ; 0 215b8: 30 e0 ldi r19, 0x00 ; 0 215ba: 40 ea ldi r20, 0xA0 ; 160 215bc: 51 e4 ldi r21, 0x41 ; 65 215be: c5 01 movw r24, r10 215c0: b4 01 movw r22, r8 215c2: 0f 94 b8 87 call 0x30f70 ; 0x30f70 215c6: 9f 93 push r25 215c8: 8f 93 push r24 215ca: 7f 93 push r23 215cc: 6f 93 push r22 215ce: 81 ec ldi r24, 0xC1 ; 193 215d0: 8f 93 push r24 215d2: 80 ea ldi r24, 0xA0 ; 160 215d4: 8f 93 push r24 215d6: 1f 92 push r1 215d8: 1f 92 push r1 215da: 84 e2 ldi r24, 0x24 ; 36 215dc: 9a e8 ldi r25, 0x8A ; 138 215de: 9f 93 push r25 215e0: 8f 93 push r24 215e2: 0e 94 56 88 call 0x110ac ; 0x110ac 215e6: 8d b7 in r24, 0x3d ; 61 215e8: 9e b7 in r25, 0x3e ; 62 215ea: 0a 96 adiw r24, 0x0a ; 10 215ec: 0f b6 in r0, 0x3f ; 63 215ee: f8 94 cli 215f0: 9e bf out 0x3e, r25 ; 62 215f2: 0f be out 0x3f, r0 ; 63 215f4: 8d bf out 0x3d, r24 ; 61 215f6: dc cd rjmp .-1096 ; 0x211b0 //! @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); 215f8: 20 e0 ldi r18, 0x00 ; 0 215fa: 30 e0 ldi r19, 0x00 ; 0 215fc: 46 e1 ldi r20, 0x16 ; 22 215fe: 53 e4 ldi r21, 0x43 ; 67 21600: c5 01 movw r24, r10 21602: b4 01 movw r22, r8 21604: 0f 94 b8 87 call 0x30f70 ; 0x30f70 21608: 76 2e mov r7, r22 2160a: 67 2e mov r6, r23 2160c: 58 2e mov r5, r24 2160e: 49 2e mov r4, r25 const float short_extrusion = count_e(layer_height, extrusion_width, short_length); 21610: 20 e0 ldi r18, 0x00 ; 0 21612: 30 e0 ldi r19, 0x00 ; 0 21614: 40 ea ldi r20, 0xA0 ; 160 21616: 51 e4 ldi r21, 0x41 ; 65 21618: c5 01 movw r24, r10 2161a: b4 01 movw r22, r8 2161c: 0f 94 b8 87 call 0x30f70 ; 0x30f70 21620: b6 2e mov r11, r22 21622: a7 2e mov r10, r23 21624: 98 2e mov r9, r24 21626: 89 2e mov r8, r25 21628: c5 e0 ldi r28, 0x05 ; 5 for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir) 2162a: df ef ldi r29, 0xFF ; 255 { enquecommandf_P(extrude_fmt_X, xdir * long_length, long_extrusion); 2162c: 2f e4 ldi r18, 0x4F ; 79 2162e: e2 2e mov r14, r18 21630: 2a e8 ldi r18, 0x8A ; 138 21632: f2 2e mov r15, r18 enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion); 21634: 31 ec ldi r19, 0xC1 ; 193 21636: c3 2e mov r12, r19 21638: 40 ea ldi r20, 0xA0 ; 160 2163a: d4 2e mov r13, r20 2163c: 04 e2 ldi r16, 0x24 ; 36 2163e: 1a e8 ldi r17, 0x8A ; 138 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); 21640: 4f 92 push r4 21642: 5f 92 push r5 21644: 6f 92 push r6 21646: 7f 92 push r7 21648: 6d 2f mov r22, r29 2164a: 0d 2e mov r0, r29 2164c: 00 0c add r0, r0 2164e: 77 0b sbc r23, r23 21650: 88 0b sbc r24, r24 21652: 99 0b sbc r25, r25 21654: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 21658: 20 e0 ldi r18, 0x00 ; 0 2165a: 30 e0 ldi r19, 0x00 ; 0 2165c: 46 e1 ldi r20, 0x16 ; 22 2165e: 53 e4 ldi r21, 0x43 ; 67 21660: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 21664: 9f 93 push r25 21666: 8f 93 push r24 21668: 7f 93 push r23 2166a: 6f 93 push r22 2166c: ff 92 push r15 2166e: ef 92 push r14 21670: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion); 21674: 8f 92 push r8 21676: 9f 92 push r9 21678: af 92 push r10 2167a: bf 92 push r11 2167c: cf 92 push r12 2167e: df 92 push r13 21680: 1f 92 push r1 21682: 1f 92 push r1 21684: 1f 93 push r17 21686: 0f 93 push r16 21688: 0e 94 56 88 call 0x110ac ; 0x110ac 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) 2168c: d1 95 neg r29 2168e: c1 50 subi r28, 0x01 ; 1 21690: 8d b7 in r24, 0x3d ; 61 21692: 9e b7 in r25, 0x3e ; 62 21694: 44 96 adiw r24, 0x14 ; 20 21696: 0f b6 in r0, 0x3f ; 63 21698: f8 94 cli 2169a: 9e bf out 0x3e, r25 ; 62 2169c: 0f be out 0x3f, r0 ; 63 2169e: 8d bf out 0x3d, r24 ; 61 216a0: c1 11 cpse r28, r1 216a2: ce cf rjmp .-100 ; 0x21640 216a4: 85 cd rjmp .-1270 ; 0x211b0 //! @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); 216a6: 23 e4 ldi r18, 0x43 ; 67 216a8: 3d ec ldi r19, 0xCD ; 205 216aa: 4f e2 ldi r20, 0x2F ; 47 216ac: 5d e3 ldi r21, 0x3D ; 61 216ae: c5 01 movw r24, r10 216b0: b4 01 movw r22, r8 216b2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 216b6: 6b 01 movw r12, r22 216b8: 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); 216ba: 20 e0 ldi r18, 0x00 ; 0 216bc: 30 e0 ldi r19, 0x00 ; 0 216be: 40 ea ldi r20, 0xA0 ; 160 216c0: 51 e4 ldi r21, 0x41 ; 65 216c2: c5 01 movw r24, r10 216c4: b4 01 movw r22, r8 216c6: 0f 94 b8 87 call 0x30f70 ; 0x30f70 216ca: 66 2e mov r6, r22 216cc: 57 2e mov r5, r23 216ce: 48 2e mov r4, r24 216d0: 39 2e mov r3, r25 const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing); 216d2: a7 01 movw r20, r14 216d4: 96 01 movw r18, r12 216d6: c5 01 movw r24, r10 216d8: b4 01 movw r22, r8 216da: 0f 94 b8 87 call 0x30f70 ; 0x30f70 216de: 26 2e mov r2, r22 216e0: a7 2e mov r10, r23 216e2: 98 2e mov r9, r24 216e4: 89 2e mov r8, r25 216e6: 84 e0 ldi r24, 0x04 ; 4 216e8: b8 2e mov r11, r24 for (uint8_t i = 0; i < 4; i++) { enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion); 216ea: 90 ea ldi r25, 0xA0 ; 160 216ec: 79 2e mov r7, r25 216ee: 0f e4 ldi r16, 0x4F ; 79 216f0: 1a e8 ldi r17, 0x8A ; 138 enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 216f2: f7 fa bst r15, 7 216f4: f0 94 com r15 216f6: f7 f8 bld r15, 7 216f8: f0 94 com r15 216fa: c4 e2 ldi r28, 0x24 ; 36 216fc: da e8 ldi r29, 0x8A ; 138 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); 216fe: 3f 92 push r3 21700: 4f 92 push r4 21702: 5f 92 push r5 21704: 6f 92 push r6 21706: 91 e4 ldi r25, 0x41 ; 65 21708: 9f 93 push r25 2170a: 7f 92 push r7 2170c: 1f 92 push r1 2170e: 1f 92 push r1 21710: 1f 93 push r17 21712: 0f 93 push r16 21714: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 21718: 8f 92 push r8 2171a: 9f 92 push r9 2171c: af 92 push r10 2171e: 2f 92 push r2 21720: ff 92 push r15 21722: ef 92 push r14 21724: df 92 push r13 21726: cf 92 push r12 21728: df 93 push r29 2172a: cf 93 push r28 2172c: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_X, -square_width*invert, long_extrusion); 21730: 3f 92 push r3 21732: 4f 92 push r4 21734: 5f 92 push r5 21736: 6f 92 push r6 21738: 81 ec ldi r24, 0xC1 ; 193 2173a: 8f 93 push r24 2173c: 7f 92 push r7 2173e: 1f 92 push r1 21740: 1f 92 push r1 21742: 1f 93 push r17 21744: 0f 93 push r16 21746: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion); 2174a: 8f 92 push r8 2174c: 9f 92 push r9 2174e: af 92 push r10 21750: 2f 92 push r2 21752: ff 92 push r15 21754: ef 92 push r14 21756: df 92 push r13 21758: cf 92 push r12 2175a: df 93 push r29 2175c: cf 93 push r28 2175e: 0e 94 56 88 call 0x110ac ; 0x110ac 21762: 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++) 21764: 8d b7 in r24, 0x3d ; 61 21766: 9e b7 in r25, 0x3e ; 62 21768: 88 96 adiw r24, 0x28 ; 40 2176a: 0f b6 in r0, 0x3f ; 63 2176c: f8 94 cli 2176e: 9e bf out 0x3e, r25 ; 62 21770: 0f be out 0x3f, r0 ; 63 21772: 8d bf out 0x3d, r24 ; 61 21774: b1 10 cpse r11, r1 21776: c3 cf rjmp .-122 ; 0x216fe 21778: 1b cd rjmp .-1482 ; 0x211b0 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]))); 2177a: 69 e0 ldi r22, 0x09 ; 9 2177c: 82 e1 ldi r24, 0x12 ; 18 2177e: 9a e8 ldi r25, 0x8A ; 138 21780: e5 cc rjmp .-1590 ; 0x2114c break; case 2: lay1cal_finish(); break; case 1: lcd_setstatuspgm(MSG_WELCOME); 21782: 82 e1 ldi r24, 0x12 ; 18 21784: 90 e7 ldi r25, 0x70 ; 112 21786: 0e 94 16 f2 call 0x1e42c ; 0x1e42c lcd_commands_step = 0; 2178a: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa lcd_commands_type = LcdCommands::Idle; 2178e: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 21792: 82 e0 ldi r24, 0x02 ; 2 21794: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::Idle); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 21798: 8f e5 ldi r24, 0x5F ; 95 2179a: 9f e0 ldi r25, 0x0F ; 15 2179c: 0f 94 10 dc call 0x3b820 ; 0x3b820 217a0: 88 23 and r24, r24 217a2: 09 f4 brne .+2 ; 0x217a6 217a4: dc cd rjmp .-1096 ; 0x2135e lcd_wizard(WizState::RepeatLay1Cal); 217a6: 8c e0 ldi r24, 0x0C ; 12 217a8: 0e 94 b4 f9 call 0x1f368 ; 0x1f368 217ac: 01 cd rjmp .-1534 ; 0x211b0 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."); 217ae: 8a ed ldi r24, 0xDA ; 218 217b0: 9a e8 ldi r25, 0x8A ; 138 217b2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 217b6: ad cd rjmp .-1190 ; 0x21312 } #ifdef THERMAL_MODEL if (lcd_commands_type == LcdCommands::ThermalModel && cmd_buffer_empty()) { switch (lcd_commands_step) 217b8: 84 30 cpi r24, 0x04 ; 4 217ba: a9 f0 breq .+42 ; 0x217e6 217bc: c0 f0 brcs .+48 ; 0x217ee 217be: 85 30 cpi r24, 0x05 ; 5 217c0: 09 f0 breq .+2 ; 0x217c4 217c2: e4 cd rjmp .-1080 ; 0x2138c case 0: lcd_commands_step = 5; [[fallthrough]]; case 5: enquecommand_P(G28W); 217c4: 61 e0 ldi r22, 0x01 ; 1 217c6: 8a e7 ldi r24, 0x7A ; 122 217c8: 9b e6 ldi r25, 0x6B ; 107 217ca: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("G1 X125 Y105 Z1 F8000")); 217ce: 61 e0 ldi r22, 0x01 ; 1 217d0: 84 ec ldi r24, 0xC4 ; 196 217d2: 9a e8 ldi r25, 0x8A ; 138 217d4: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_commands_step = 4; 217d8: 84 e0 ldi r24, 0x04 ; 4 break; case 4: st_synchronize(); lcd_commands_step = 3; 217da: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa 217de: d6 cd rjmp .-1108 ; 0x2138c if (lcd_commands_type == LcdCommands::ThermalModel && cmd_buffer_empty()) { switch (lcd_commands_step) { case 0: lcd_commands_step = 5; 217e0: 90 93 fa 03 sts 0x03FA, r25 ; 0x8003fa 217e4: ef cf rjmp .-34 ; 0x217c4 enquecommand_P(PSTR("G1 X125 Y105 Z1 F8000")); lcd_commands_step = 4; break; case 4: st_synchronize(); 217e6: 0f 94 a9 43 call 0x28752 ; 0x28752 lcd_commands_step = 3; 217ea: 83 e0 ldi r24, 0x03 ; 3 217ec: f6 cf rjmp .-20 ; 0x217da SERIAL_ECHOLNPGM("TM: invalid parameters, cannot enable"); } void thermal_model_set_warn_beep(bool enabled) { thermal_model::warn_beep = enabled; 217ee: 10 92 3d 02 sts 0x023D, r1 ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> break; case 3: thermal_model_set_warn_beep(false); enquecommand_P(PSTR("M310 A F1")); 217f2: 61 e0 ldi r22, 0x01 ; 1 217f4: 8a eb ldi r24, 0xBA ; 186 217f6: 9a e8 ldi r25, 0x8A ; 138 217f8: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_commands_step = 2; 217fc: 82 e0 ldi r24, 0x02 ; 2 217fe: ed cf rjmp .-38 ; 0x217da break; case 2: if (thermal_model_autotune_result()) 21800: 80 91 3c 02 lds r24, 0x023C ; 0x80023c <_ZL26thermal_model_autotune_err.lto_priv.538> 21804: 81 11 cpse r24, r1 21806: 05 c0 rjmp .+10 ; 0x21812 enquecommand_P(MSG_M500); 21808: 61 e0 ldi r22, 0x01 ; 1 2180a: 80 e8 ldi r24, 0x80 ; 128 2180c: 9b e6 ldi r25, 0x6B ; 107 2180e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 lcd_commands_step = 1; 21812: 81 e0 ldi r24, 0x01 ; 1 21814: e2 cf rjmp .-60 ; 0x217da break; case 1: lcd_commands_step = 0; 21816: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa lcd_commands_type = LcdCommands::Idle; 2181a: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 2181e: 92 e0 ldi r25, 0x02 ; 2 21820: 90 93 b7 0d sts 0x0DB7, r25 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 21824: 80 93 3d 02 sts 0x023D, r24 ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> SetPrinterState(PrinterState::Idle); thermal_model_set_warn_beep(true); bool res = thermal_model_autotune_result(); if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) { 21828: 8f e5 ldi r24, 0x5F ; 95 2182a: 9f e0 ldi r25, 0x0F ; 15 2182c: 0f 94 10 dc call 0x3b820 ; 0x3b820 21830: 88 23 and r24, r24 21832: 09 f4 brne .+2 ; 0x21836 21834: cc cd rjmp .-1128 ; 0x213ce // resume the wizard lcd_wizard(res ? WizState::Restore : WizState::Failed); 21836: 80 91 3c 02 lds r24, 0x023C ; 0x80023c <_ZL26thermal_model_autotune_err.lto_priv.538> 2183a: 81 11 cpse r24, r1 2183c: 04 c0 rjmp .+8 ; 0x21846 2183e: 81 e0 ldi r24, 0x01 ; 1 21840: 0e 94 b4 f9 call 0x1f368 ; 0x1f368 21844: a3 cd rjmp .-1210 ; 0x2138c 21846: 8e e0 ldi r24, 0x0E ; 14 21848: fb cf rjmp .-10 ; 0x21840 #endif //THERMAL_MODEL #endif //QUICK_NOZZLE_CHANGE switch(lcd_commands_step) { case 0: lcd_commands_step = 3; 2184a: 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; 2184c: 80 93 fa 03 sts 0x03FA, r24 ; 0x8003fa 21850: be cd rjmp .-1156 ; 0x213ce 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)); 21852: 86 ea ldi r24, 0xA6 ; 166 21854: 99 e4 ldi r25, 0x49 ; 73 21856: 0e 94 44 72 call 0xe488 ; 0xe488 2185a: 0f 94 cd 20 call 0x2419a ; 0x2419a enquecommand_P(G28W); 2185e: 61 e0 ldi r22, 0x01 ; 1 21860: 8a e7 ldi r24, 0x7A ; 122 21862: 9b e6 ldi r25, 0x6B ; 107 21864: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("G1 X125 Z200 F1000")); 21868: 61 e0 ldi r22, 0x01 ; 1 2186a: 87 ea ldi r24, 0xA7 ; 167 2186c: 9a e8 ldi r25, 0x8A ; 138 2186e: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("M109 S280")); 21872: 61 e0 ldi r22, 0x01 ; 1 21874: 8d e9 ldi r24, 0x9D ; 157 21876: 9a e8 ldi r25, 0x8A ; 138 21878: 0e 94 b8 87 call 0x10f70 ; 0x10f70 #ifdef THERMAL_MODEL was_enabled = thermal_model_enabled(); 2187c: 80 91 1c 05 lds r24, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 21880: 80 93 e6 03 sts 0x03E6, r24 ; 0x8003e6 thermal_model_set_enabled(false); 21884: 80 e0 ldi r24, 0x00 ; 0 21886: 0f 94 15 33 call 0x2662a ; 0x2662a } } enquecommand_P(G28W); //home enquecommand_P(PSTR("G1 X125 Z200 F1000")); //move to top center #endif //QUICK_NOZZLE_CHANGE lcd_commands_step = 2; 2188a: 82 e0 ldi r24, 0x02 ; 2 2188c: df cf rjmp .-66 ; 0x2184c break; case 2: enquecommand_P(PSTR("M84 XY")); 2188e: 61 e0 ldi r22, 0x01 ; 1 21890: 86 e9 ldi r24, 0x96 ; 150 21892: 9a e8 ldi r25, 0x8A ; 138 21894: 0e 94 b8 87 call 0x10f70 ; 0x10f70 if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_NOZZLE_CNG_CHANGED), false) == LCD_LEFT_BUTTON_CHOICE) { 21898: 8d e6 ldi r24, 0x6D ; 109 2189a: 99 e4 ldi r25, 0x49 ; 73 2189c: 0e 94 44 72 call 0xe488 ; 0xe488 218a0: 41 e0 ldi r20, 0x01 ; 1 218a2: 60 e0 ldi r22, 0x00 ; 0 218a4: 0f 94 2a 50 call 0x2a054 ; 0x2a054 218a8: 81 11 cpse r24, r1 218aa: 91 cd rjmp .-1246 ; 0x213ce 218ac: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 218b0: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 #ifndef QUICK_NOZZLE_CHANGE setTargetHotend(0); #ifdef THERMAL_MODEL thermal_model_set_enabled(was_enabled); 218b4: 80 91 e6 03 lds r24, 0x03E6 ; 0x8003e6 218b8: 0f 94 15 33 call 0x2662a ; 0x2662a #endif //THERMAL_MODEL #else fanSpeed = 0; //turn off fan #endif //QUICK_NOZZLE_CHANGE lcd_commands_step = 1; 218bc: 81 e0 ldi r24, 0x01 ; 1 218be: c6 cf rjmp .-116 ; 0x2184c } break; case 1: lcd_commands_step = 0; 218c0: 10 92 fa 03 sts 0x03FA, r1 ; 0x8003fa lcd_commands_type = LcdCommands::Idle; 218c4: 10 92 b3 0d sts 0x0DB3, r1 ; 0x800db3 218c8: 82 e0 ldi r24, 0x02 ; 2 218ca: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::Idle); menu_goto(lcd_hw_setup_menu, 2, true); 218ce: 20 e0 ldi r18, 0x00 ; 0 218d0: 41 e0 ldi r20, 0x01 ; 1 218d2: 62 e0 ldi r22, 0x02 ; 2 218d4: 70 e0 ldi r23, 0x00 ; 0 218d6: 80 eb ldi r24, 0xB0 ; 176 218d8: 92 ed ldi r25, 0xD2 ; 210 218da: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 menu_depth = 3; 218de: 83 e0 ldi r24, 0x03 ; 3 218e0: 80 93 f7 03 sts 0x03F7, r24 ; 0x8003f7 218e4: 74 cd rjmp .-1304 ; 0x213ce 000218e6 : && menu_menu != lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); } void menu_lcd_lcdupdate_func(void) { 218e6: 0f 93 push r16 218e8: 1f 93 push r17 #if (SDCARDDETECT > 0) if ((IS_SD_INSERTED != lcd_oldcardstatus)) 218ea: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 218ee: 80 95 com r24 218f0: 81 70 andi r24, 0x01 ; 1 218f2: 90 91 11 04 lds r25, 0x0411 ; 0x800411 218f6: 89 17 cp r24, r25 218f8: a1 f1 breq .+104 ; 0x21962 { if(menu_menu == lcd_sdcard_menu) { 218fa: 80 91 12 04 lds r24, 0x0412 ; 0x800412 218fe: 90 91 13 04 lds r25, 0x0413 ; 0x800413 21902: 87 52 subi r24, 0x27 ; 39 21904: 92 4f sbci r25, 0xF2 ; 242 21906: 11 f4 brne .+4 ; 0x2190c // 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(); 21908: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 } lcd_draw_update = 2; 2190c: 82 e0 ldi r24, 0x02 ; 2 2190e: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d lcd_oldcardstatus = IS_SD_INSERTED; 21912: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 21916: 80 95 com r24 21918: 81 70 andi r24, 0x01 ; 1 2191a: 80 93 11 04 sts 0x0411, r24 ; 0x800411 lcd_refresh(); // to maybe revive the LCD if static electricity killed it. 2191e: 0e 94 24 6f call 0xde48 ; 0xde48 backlight_wake(); 21922: 80 e0 ldi r24, 0x00 ; 0 21924: 0e 94 0d 8a call 0x1141a ; 0x1141a if (lcd_oldcardstatus) 21928: 80 91 11 04 lds r24, 0x0411 ; 0x800411 2192c: 88 23 and r24, r24 2192e: 09 f4 brne .+2 ; 0x21932 21930: 71 c0 rjmp .+226 ; 0x21a14 { if (!card.mounted) 21932: 80 91 90 14 lds r24, 0x1490 ; 0x801490 21936: 81 11 cpse r24, r1 21938: 05 c0 rjmp .+10 ; 0x21944 { card.mount(false); //delay the sorting to the sd menu. Otherwise, removing the SD card while sorting will not menu_back() 2193a: 0f 94 b9 81 call 0x30372 ; 0x30372 card.presort_flag = true; //force sorting of the SD menu 2193e: 81 e0 ldi r24, 0x01 ; 1 21940: 80 93 de 14 sts 0x14DE, r24 ; 0x8014de } LCD_MESSAGERPGM(MSG_WELCOME); 21944: 82 e1 ldi r24, 0x12 ; 18 21946: 90 e7 ldi r25, 0x70 ; 112 21948: 0e 94 16 f2 call 0x1e42c ; 0x1e42c bMain=false; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function 2194c: 10 92 df 03 sts 0x03DF, r1 ; 0x8003df menu_submenu(lcd_sdcard_menu, true); 21950: 61 e0 ldi r22, 0x01 ; 1 21952: 87 e2 ldi r24, 0x27 ; 39 21954: 92 ef ldi r25, 0xF2 ; 242 21956: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee lcd_timeoutToStatus.start(); 2195a: 8a ed ldi r24, 0xDA ; 218 2195c: 93 e0 ldi r25, 0x03 ; 3 2195e: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> card.release(); LCD_MESSAGERPGM(_T(MSG_SD_REMOVED)); } } #endif//CARDINSERTED if (lcd_next_update_millis < _millis()) 21962: 0f 94 28 2a call 0x25450 ; 0x25450 21966: 00 91 d6 03 lds r16, 0x03D6 ; 0x8003d6 2196a: 10 91 d7 03 lds r17, 0x03D7 ; 0x8003d7 2196e: 20 91 d8 03 lds r18, 0x03D8 ; 0x8003d8 21972: 30 91 d9 03 lds r19, 0x03D9 ; 0x8003d9 21976: 06 17 cp r16, r22 21978: 17 07 cpc r17, r23 2197a: 28 07 cpc r18, r24 2197c: 39 07 cpc r19, r25 2197e: e8 f5 brcc .+122 ; 0x219fa { if (lcd_draw_update) { 21980: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 21984: 88 23 and r24, r24 21986: 31 f0 breq .+12 ; 0x21994 lcd_timeoutToStatus.start(); 21988: 8a ed ldi r24, 0xDA ; 218 2198a: 93 e0 ldi r25, 0x03 ; 3 2198c: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> lcd_frame_start(); 21990: 0e 94 2c 6e call 0xdc58 ; 0xdc58 } (*menu_menu)(); 21994: e0 91 12 04 lds r30, 0x0412 ; 0x800412 21998: f0 91 13 04 lds r31, 0x0413 ; 0x800413 2199c: 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)))); 2199e: 80 91 12 04 lds r24, 0x0412 ; 0x800412 219a2: 90 91 13 04 lds r25, 0x0413 ; 0x800413 219a6: 8a 52 subi r24, 0x2A ; 42 219a8: 99 43 sbci r25, 0x39 ; 57 219aa: 09 f4 brne .+2 ; 0x219ae 219ac: 46 c0 rjmp .+140 ; 0x21a3a } static inline bool other_menu_expired() { return (menu_menu != lcd_status_screen 219ae: 80 91 12 04 lds r24, 0x0412 ; 0x800412 219b2: 90 91 13 04 lds r25, 0x0413 ; 0x800413 && menu_menu != lcd_babystep_z && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); 219b6: 29 e3 ldi r18, 0x39 ; 57 219b8: 88 30 cpi r24, 0x08 ; 8 219ba: 92 07 cpc r25, r18 219bc: 09 f0 breq .+2 ; 0x219c0 219be: 5e c0 rjmp .+188 ; 0x21a7c } lcd_clear(); lcd_return_to_status(); lcd_draw_update = 2; } if (lcd_draw_update == 2) lcdui_refresh(); 219c0: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 219c4: 82 30 cpi r24, 0x02 ; 2 219c6: 21 f4 brne .+8 ; 0x219d0 #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 219c8: 0e 94 24 6f call 0xde48 ; 0xde48 lcd_status_message_idx = 0; // Re-draw message from beginning 219cc: 10 92 1d 05 sts 0x051D, r1 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> lcd_clear(); lcd_return_to_status(); lcd_draw_update = 2; } if (lcd_draw_update == 2) lcdui_refresh(); if (lcd_draw_update) lcd_draw_update--; 219d0: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 219d4: 88 23 and r24, r24 219d6: 19 f0 breq .+6 ; 0x219de 219d8: 81 50 subi r24, 0x01 ; 1 219da: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL; 219de: 0f 94 28 2a call 0x25450 ; 0x25450 219e2: 6c 59 subi r22, 0x9C ; 156 219e4: 7f 4f sbci r23, 0xFF ; 255 219e6: 8f 4f sbci r24, 0xFF ; 255 219e8: 9f 4f sbci r25, 0xFF ; 255 219ea: 60 93 d6 03 sts 0x03D6, r22 ; 0x8003d6 219ee: 70 93 d7 03 sts 0x03D7, r23 ; 0x8003d7 219f2: 80 93 d8 03 sts 0x03D8, r24 ; 0x8003d8 219f6: 90 93 d9 03 sts 0x03D9, r25 ; 0x8003d9 } prusa_statistics_update_from_lcd_update(); if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands(); 219fa: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 219fe: 84 30 cpi r24, 0x04 ; 4 21a00: 09 f0 breq .+2 ; 0x21a04 21a02: 53 c0 rjmp .+166 ; 0x21aaa 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) { 21a04: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 21a08: 81 11 cpse r24, r1 21a0a: 4f c0 rjmp .+158 ; 0x21aaa 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(); } 21a0c: 1f 91 pop r17 21a0e: 0f 91 pop r16 21a10: 0d 94 45 07 jmp 0x20e8a ; 0x20e8a presort_flag = true; #endif } void CardReader::release() { sdprinting = false; 21a14: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f mounted = false; 21a18: 10 92 90 14 sts 0x1490, r1 ; 0x801490 SERIAL_ECHO_START; 21a1c: 82 ef ldi r24, 0xF2 ; 242 21a1e: 9a ea ldi r25, 0xAA ; 170 21a20: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED 21a24: 8e e2 ldi r24, 0x2E ; 46 21a26: 9b e6 ldi r25, 0x6B ; 107 21a28: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_timeoutToStatus.start(); } else { card.release(); LCD_MESSAGERPGM(_T(MSG_SD_REMOVED)); 21a2c: 80 e4 ldi r24, 0x40 ; 64 21a2e: 99 e4 ldi r25, 0x49 ; 73 21a30: 0e 94 44 72 call 0xe488 ; 0xe488 21a34: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 21a38: 94 cf rjmp .-216 ; 0x21962 // 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)))); 21a3a: 0e 94 37 67 call 0xce6e ; 0xce6e 21a3e: 81 11 cpse r24, r1 21a40: 0e c0 rjmp .+28 ; 0x21a5e 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) 21a42: e0 91 12 04 lds r30, 0x0412 ; 0x800412 21a46: f0 91 13 04 lds r31, 0x0413 ; 0x800413 21a4a: 30 97 sbiw r30, 0x00 ; 0 21a4c: 39 f5 brne .+78 ; 0x21a9c { menu_leaving = 1; (*menu_menu)(); menu_leaving = 0; } lcd_clear(); 21a4e: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_return_to_status(); 21a52: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_draw_update = 2; 21a56: 82 e0 ldi r24, 0x02 ; 2 21a58: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d 21a5c: b1 cf rjmp .-158 ; 0x219c0 // 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)))); 21a5e: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 21a62: 81 11 cpse r24, r1 21a64: a4 cf rjmp .-184 ; 0x219ae 21a66: 40 e9 ldi r20, 0x90 ; 144 21a68: 5f e5 ldi r21, 0x5F ; 95 21a6a: 61 e0 ldi r22, 0x01 ; 1 21a6c: 70 e0 ldi r23, 0x00 ; 0 21a6e: 8a ed ldi r24, 0xDA ; 218 21a70: 93 e0 ldi r25, 0x03 ; 3 21a72: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 21a76: 81 11 cpse r24, r1 21a78: e4 cf rjmp .-56 ; 0x21a42 21a7a: 99 cf rjmp .-206 ; 0x219ae } static inline bool other_menu_expired() { return (menu_menu != lcd_status_screen && menu_menu != lcd_babystep_z 21a7c: 8a 52 subi r24, 0x2A ; 42 21a7e: 99 43 sbci r25, 0x39 ; 57 21a80: 09 f4 brne .+2 ; 0x21a84 21a82: 9e cf rjmp .-196 ; 0x219c0 && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS)); 21a84: 40 e3 ldi r20, 0x30 ; 48 21a86: 55 e7 ldi r21, 0x75 ; 117 21a88: 60 e0 ldi r22, 0x00 ; 0 21a8a: 70 e0 ldi r23, 0x00 ; 0 21a8c: 8a ed ldi r24, 0xDA ; 218 21a8e: 93 e0 ldi r25, 0x03 ; 3 21a90: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 21a94: 88 23 and r24, r24 21a96: 09 f4 brne .+2 ; 0x21a9a 21a98: 93 cf rjmp .-218 ; 0x219c0 21a9a: d3 cf rjmp .-90 ; 0x21a42 // 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; 21a9c: 81 e0 ldi r24, 0x01 ; 1 21a9e: 80 93 d5 03 sts 0x03D5, r24 ; 0x8003d5 (*menu_menu)(); 21aa2: 19 95 eicall menu_leaving = 0; 21aa4: 10 92 d5 03 sts 0x03D5, r1 ; 0x8003d5 21aa8: d2 cf rjmp .-92 ; 0x21a4e 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(); } 21aaa: 1f 91 pop r17 21aac: 0f 91 pop r16 21aae: 08 95 ret 00021ab0 : menu_goto(lcd_generic_preheat_menu, 0, true); } void lcd_wizard() { bool result = true; if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) { 21ab0: 8f e1 ldi r24, 0x1F ; 31 21ab2: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 21ab6: 81 11 cpse r24, r1 21ab8: 06 c0 rjmp .+12 ; 0x21ac6 // 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); 21aba: 8f e1 ldi r24, 0x1F ; 31 21abc: 0e 94 f6 ee call 0x1ddec ; 0x1ddec lcd_wizard(WizState::Run); 21ac0: 80 e0 ldi r24, 0x00 ; 0 21ac2: 0c 94 b4 f9 jmp 0x1f368 ; 0x1f368 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); 21ac6: 88 e7 ldi r24, 0x78 ; 120 21ac8: 9b e3 ldi r25, 0x3B ; 59 21aca: 0e 94 44 72 call 0xe488 ; 0xe488 21ace: 41 e0 ldi r20, 0x01 ; 1 21ad0: 60 e0 ldi r22, 0x00 ; 0 21ad2: 0f 94 01 50 call 0x2a002 ; 0x2a002 } if (result) { 21ad6: 88 23 and r24, r24 21ad8: 81 f3 breq .-32 ; 0x21aba calibration_status_clear(CALIBRATION_WIZARD_STEPS); lcd_wizard(WizState::Run); } else { lcd_return_to_status(); 21ada: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_update_enable(true); 21ade: 81 e0 ldi r24, 0x01 ; 1 21ae0: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 21ae4: 82 e0 ldi r24, 0x02 ; 2 21ae6: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e 00021aea : if (result == LCD_LEFT_BUTTON_CHOICE) { lcd_mesh_calibration_z(); } } void prompt_steel_sheet_on_bed(bool wantedState) { 21aea: cf 93 push r28 21aec: 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); 21aee: 83 e6 ldi r24, 0x63 ; 99 21af0: 9e e3 ldi r25, 0x3E ; 62 21af2: 0e 94 44 72 call 0xe488 ; 0xe488 21af6: 41 e0 ldi r20, 0x01 ; 1 21af8: 4c 27 eor r20, r28 21afa: 60 e0 ldi r22, 0x00 ; 0 21afc: 0f 94 2a 50 call 0x2a054 ; 0x2a054 21b00: 91 e0 ldi r25, 0x01 ; 1 21b02: 81 11 cpse r24, r1 21b04: 90 e0 ldi r25, 0x00 ; 0 if (sheetIsOnBed != wantedState) { 21b06: c9 17 cp r28, r25 21b08: 59 f0 breq .+22 ; 0x21b20 lcd_show_fullscreen_message_and_wait_P(_T(wantedState ? MSG_PLACE_STEEL_SHEET : MSG_REMOVE_STEEL_SHEET)); 21b0a: 89 e3 ldi r24, 0x39 ; 57 21b0c: 9e e3 ldi r25, 0x3E ; 62 21b0e: cc 23 and r28, r28 21b10: 11 f0 breq .+4 ; 0x21b16 21b12: 85 e9 ldi r24, 0x95 ; 149 21b14: 99 e5 ldi r25, 0x59 ; 89 21b16: 0e 94 44 72 call 0xe488 ; 0xe488 } #endif //STEEL_SHEET } 21b1a: 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)); 21b1c: 0d 94 cd 20 jmp 0x2419a ; 0x2419a } #endif //STEEL_SHEET } 21b20: cf 91 pop r28 21b22: 08 95 ret 00021b24 : } lcd_show_fullscreen_message_and_wait_P( _T(MSG_WIZARD_V2_CAL_2)); } void lcd_z_calibration_prompt(bool allowTimeouting) { 21b24: cf 93 push r28 21b26: c8 2f mov r28, r24 uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_Z_CALIBRATION_PROMPT), allowTimeouting, 0); 21b28: 80 e1 ldi r24, 0x10 ; 16 21b2a: 9e e3 ldi r25, 0x3E ; 62 21b2c: 0e 94 44 72 call 0xe488 ; 0xe488 21b30: 40 e0 ldi r20, 0x00 ; 0 21b32: 6c 2f mov r22, r28 21b34: 0f 94 2a 50 call 0x2a054 ; 0x2a054 if (result == LCD_LEFT_BUTTON_CHOICE) { 21b38: 81 11 cpse r24, r1 21b3a: 03 c0 rjmp .+6 ; 0x21b42 lcd_mesh_calibration_z(); } } 21b3c: 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(); 21b3e: 0c 94 8b cf jmp 0x19f16 ; 0x19f16 } } 21b42: cf 91 pop r28 21b44: 08 95 ret 00021b46 : } eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_PROBE_NR, mbl_z_probe_nr); } static void lcd_mesh_bed_leveling_settings() { 21b46: bf 92 push r11 21b48: cf 92 push r12 21b4a: df 92 push r13 21b4c: ef 92 push r14 21b4e: ff 92 push r15 21b50: 0f 93 push r16 21b52: 1f 93 push r17 21b54: cf 93 push r28 21b56: df 93 push r29 21b58: 00 d0 rcall .+0 ; 0x21b5a 21b5a: 1f 92 push r1 21b5c: cd b7 in r28, 0x3d ; 61 21b5e: de b7 in r29, 0x3e ; 62 bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0); 21b60: 8c ea ldi r24, 0xAC ; 172 21b62: 9d e0 ldi r25, 0x0D ; 13 21b64: 0f 94 10 dc call 0x3b820 ; 0x3b820 21b68: c8 2e mov r12, r24 uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR); 21b6a: 8b ea ldi r24, 0xAB ; 171 21b6c: 9d e0 ldi r25, 0x0D ; 13 21b6e: 0f 94 10 dc call 0x3b820 ; 0x3b820 21b72: f8 2e mov r15, r24 uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR); 21b74: 8a ea ldi r24, 0xAA ; 170 21b76: 9d e0 ldi r25, 0x0D ; 13 21b78: 0f 94 10 dc call 0x3b820 ; 0x3b820 21b7c: 18 2f mov r17, r24 char sToggle[4]; //enough for nxn format MENU_BEGIN(); 21b7e: 0f 94 8a d1 call 0x3a314 ; 0x3a314 21b82: 10 92 11 05 sts 0x0511, r1 ; 0x800511 if (points_nr == 7) { lcd_z_calibration_prompt(true); } ); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); sToggle[0] = points_nr + '0'; 21b86: 80 e3 ldi r24, 0x30 ; 48 21b88: d8 2e mov r13, r24 21b8a: df 0c add r13, r15 sToggle[1] = 'x'; 21b8c: 98 e7 ldi r25, 0x78 ; 120 21b8e: 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'; 21b90: 20 e3 ldi r18, 0x30 ; 48 21b92: e2 2e mov r14, r18 21b94: 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(); 21b96: 80 91 11 05 lds r24, 0x0511 ; 0x800511 21b9a: 84 30 cpi r24, 0x04 ; 4 21b9c: 08 f0 brcs .+2 ; 0x21ba0 21b9e: 56 c0 rjmp .+172 ; 0x21c4c 21ba0: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 21ba4: 0f 94 0a d0 call 0x3a014 ; 0x3a014 21ba8: 88 23 and r24, r24 21baa: 31 f0 breq .+12 ; 0x21bb8 21bac: 87 e0 ldi r24, 0x07 ; 7 21bae: f8 12 cpse r15, r24 21bb0: 03 c0 rjmp .+6 ; 0x21bb8 21bb2: 81 e0 ldi r24, 0x01 ; 1 21bb4: 0f 94 92 0d call 0x21b24 ; 0x21b24 // 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)); 21bb8: 8a ee ldi r24, 0xEA ; 234 21bba: 97 e4 ldi r25, 0x47 ; 71 21bbc: 0e 94 44 72 call 0xe488 ; 0xe488 21bc0: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa sToggle[0] = points_nr + '0'; 21bc4: d9 82 std Y+1, r13 ; 0x01 sToggle[1] = 'x'; 21bc6: ba 82 std Y+2, r11 ; 0x02 sToggle[2] = points_nr + '0'; 21bc8: db 82 std Y+3, r13 ; 0x03 sToggle[3] = 0; 21bca: 1c 82 std Y+4, r1 ; 0x04 MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle); 21bcc: 8e e9 ldi r24, 0x9E ; 158 21bce: 97 e4 ldi r25, 0x47 ; 71 21bd0: 0e 94 44 72 call 0xe488 ; 0xe488 21bd4: 20 e0 ldi r18, 0x00 ; 0 21bd6: 48 e6 ldi r20, 0x68 ; 104 21bd8: 50 ed ldi r21, 0xD0 ; 208 21bda: be 01 movw r22, r28 21bdc: 6f 5f subi r22, 0xFF ; 255 21bde: 7f 4f sbci r23, 0xFF ; 255 21be0: 0f 94 19 d3 call 0x3a632 ; 0x3a632 sToggle[0] = mbl_z_probe_nr + '0'; 21be4: e9 82 std Y+1, r14 ; 0x01 sToggle[1] = 0; 21be6: 1a 82 std Y+2, r1 ; 0x02 MENU_ITEM_TOGGLE(_T(MSG_Z_PROBE_NR), sToggle, mbl_probe_nr_toggle); 21be8: 80 e9 ldi r24, 0x90 ; 144 21bea: 97 e4 ldi r25, 0x47 ; 71 21bec: 0e 94 44 72 call 0xe488 ; 0xe488 21bf0: 20 e0 ldi r18, 0x00 ; 0 21bf2: 49 e5 ldi r20, 0x59 ; 89 21bf4: 50 ed ldi r21, 0xD0 ; 208 21bf6: be 01 movw r22, r28 21bf8: 6f 5f subi r22, 0xFF ; 255 21bfa: 7f 4f sbci r23, 0xFF ; 255 21bfc: 0f 94 19 d3 call 0x3a632 ; 0x3a632 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); 21c00: 87 e0 ldi r24, 0x07 ; 7 21c02: f8 12 cpse r15, r24 21c04: 20 c0 rjmp .+64 ; 0x21c46 21c06: 81 e5 ldi r24, 0x51 ; 81 21c08: 9c e5 ldi r25, 0x5C ; 92 21c0a: c1 10 cpse r12, r1 21c0c: 02 c0 rjmp .+4 ; 0x21c12 21c0e: 8b e4 ldi r24, 0x4B ; 75 21c10: 9c e5 ldi r25, 0x5C ; 92 21c12: 0e 94 44 72 call 0xe488 ; 0xe488 21c16: 8c 01 movw r16, r24 21c18: 8a e7 ldi r24, 0x7A ; 122 21c1a: 97 e4 ldi r25, 0x47 ; 71 21c1c: 0e 94 44 72 call 0xe488 ; 0xe488 21c20: 22 e0 ldi r18, 0x02 ; 2 21c22: 44 e7 ldi r20, 0x74 ; 116 21c24: 50 ed ldi r21, 0xD0 ; 208 21c26: b8 01 movw r22, r16 21c28: 0f 94 19 d3 call 0x3a632 ; 0x3a632 MENU_END(); 21c2c: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc 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(); 21c30: 90 91 11 05 lds r25, 0x0511 ; 0x800511 21c34: 9f 5f subi r25, 0xFF ; 255 21c36: 90 93 11 05 sts 0x0511, r25 ; 0x800511 21c3a: 90 91 13 05 lds r25, 0x0513 ; 0x800513 21c3e: 9f 5f subi r25, 0xFF ; 255 21c40: 90 93 13 05 sts 0x0513, r25 ; 0x800513 21c44: a8 cf rjmp .-176 ; 0x21b96 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); 21c46: 8a e8 ldi r24, 0x8A ; 138 21c48: 97 e4 ldi r25, 0x47 ; 71 21c4a: e3 cf rjmp .-58 ; 0x21c12 MENU_END(); } 21c4c: 0f 90 pop r0 21c4e: 0f 90 pop r0 21c50: 0f 90 pop r0 21c52: 0f 90 pop r0 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: ef 90 pop r14 21c60: df 90 pop r13 21c62: cf 90 pop r12 21c64: bf 90 pop r11 21c66: 08 95 ret 00021c68 : } } return false; // couldn't accomplish the task } void MMU2::ToolChangeCommon(uint8_t slot) { 21c68: 2f 92 push r2 21c6a: 3f 92 push r3 21c6c: 4f 92 push r4 21c6e: 5f 92 push r5 21c70: 6f 92 push r6 21c72: 7f 92 push r7 21c74: 8f 92 push r8 21c76: 9f 92 push r9 21c78: af 92 push r10 21c7a: bf 92 push r11 21c7c: cf 92 push r12 21c7e: df 92 push r13 21c80: ef 92 push r14 21c82: ff 92 push r15 21c84: 0f 93 push r16 21c86: 1f 93 push r17 21c88: cf 93 push r28 21c8a: df 93 push r29 21c8c: cd b7 in r28, 0x3d ; 61 21c8e: de b7 in r29, 0x3e ; 62 21c90: 67 97 sbiw r28, 0x17 ; 23 21c92: 0f b6 in r0, 0x3f ; 63 21c94: f8 94 cli 21c96: de bf out 0x3e, r29 ; 62 21c98: 0f be out 0x3f, r0 ; 63 21c9a: cd bf out 0x3d, r28 ; 61 21c9c: 08 2f mov r16, r24 21c9e: ce 01 movw r24, r28 21ca0: 46 96 adiw r24, 0x16 ; 22 21ca2: 9f 8b std Y+23, r25 ; 0x17 21ca4: 8e 8b std Y+22, r24 ; 0x16 21ca6: 83 e0 ldi r24, 0x03 ; 3 21ca8: f8 2e mov r15, r24 lcd_draw_update = 1; // force redraw } void lcd_clearstatus() { memset(lcd_status_message, 0, sizeof(lcd_status_message)); 21caa: 95 e1 ldi r25, 0x15 ; 21 21cac: 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 21cae: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 tool_change_extruder = slot; 21cb2: 00 93 a1 13 sts 0x13A1, r16 ; 0x8013a1 state = State::Stopped; currentScope = Scope::Stopped; } void ProtocolLogic::ToolChange(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Tool, slot)); 21cb6: 40 2f mov r20, r16 21cb8: 64 e5 ldi r22, 0x54 ; 84 21cba: ce 01 movw r24, r28 21cbc: 01 96 adiw r24, 0x01 ; 1 21cbe: 0f 94 81 c5 call 0x38b02 ; 0x38b02 21cc2: 49 81 ldd r20, Y+1 ; 0x01 21cc4: 5a 81 ldd r21, Y+2 ; 0x02 21cc6: 6b 81 ldd r22, Y+3 ; 0x03 21cc8: 7c 81 ldd r23, Y+4 ; 0x04 21cca: 8d 81 ldd r24, Y+5 ; 0x05 21ccc: 0f 94 46 a5 call 0x34a8c ; 0x34a8c logic.ToolChange(slot); // let the MMU pull the filament out and push a new one in if (manage_response(true, true)) { 21cd0: 61 e0 ldi r22, 0x01 ; 1 21cd2: 81 e0 ldi r24, 0x01 ; 1 21cd4: 0f 94 6a ac call 0x358d4 ; 0x358d4 21cd8: 18 2f mov r17, r24 21cda: 81 11 cpse r24, r1 21cdc: 07 c0 rjmp .+14 ; 0x21cec break; } // otherwise: failed to perform the command - unload first and then let it run again IncrementMMUFails(); 21cde: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 // just in case we stood in an error screen for too long and the hotend got cold ResumeHotendTemp(); 21ce2: 0f 94 08 ac call 0x35810 ; 0x35810 // if the extruder has been parked, it will get unparked once the ToolChange command finishes OK // - so no ResumeUnpark() at this spot UnloadInner(); 21ce6: 0f 94 f8 ac call 0x359f0 ; 0x359f0 21cea: e1 cf rjmp .-62 ; 0x21cae bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 21cec: 0f 94 a9 43 call 0x28752 ; 0x28752 } bool MMU2::VerifyFilamentEnteredPTFE() { planner_synchronize(); if (WhereIsFilament() != FilamentState::AT_FSENSOR) 21cf0: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 21cf4: 81 30 cpi r24, 0x01 ; 1 21cf6: 79 f1 breq .+94 ; 0x21d56 // 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(); 21cf8: 0f 94 f8 ac call 0x359f0 ; 0x359f0 if (retries == 2 && cutter_enabled()) { 21cfc: 92 e0 ldi r25, 0x02 ; 2 21cfe: f9 12 cpse r15, r25 21d00: 09 c0 rjmp .+18 ; 0x21d14 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; 21d02: 8e ec ldi r24, 0xCE ; 206 21d04: 9e e0 ldi r25, 0x0E ; 14 21d06: 0f 94 10 dc call 0x3b820 ; 0x3b820 21d0a: 81 30 cpi r24, 0x01 ; 1 21d0c: 19 f4 brne .+6 ; 0x21d14 CutFilamentInner(slot); // try cutting filament tip at the last attempt 21d0e: 80 2f mov r24, r16 21d10: 0f 94 df ad call 0x35bbe ; 0x35bbe 21d14: 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) { 21d16: f1 10 cpse r15, r1 21d18: ca cf rjmp .-108 ; 0x21cae 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()) { 21d1a: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 21d1e: 88 23 and r24, r24 21d20: 09 f4 brne .+2 ; 0x21d24 21d22: ef c0 rjmp .+478 ; 0x21f02 SetCurrentTool(slot); // filament change is finished SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; } 21d24: 67 96 adiw r28, 0x17 ; 23 21d26: 0f b6 in r0, 0x3f ; 63 21d28: f8 94 cli 21d2a: de bf out 0x3e, r29 ; 62 21d2c: 0f be out 0x3f, r0 ; 63 21d2e: cd bf out 0x3d, r28 ; 61 21d30: df 91 pop r29 21d32: cf 91 pop r28 21d34: 1f 91 pop r17 21d36: 0f 91 pop r16 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: 7f 90 pop r7 21d4a: 6f 90 pop r6 21d4c: 5f 90 pop r5 21d4e: 4f 90 pop r4 21d50: 3f 90 pop r3 21d52: 2f 90 pop r2 21d54: 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(); 21d56: 60 91 96 13 lds r22, 0x1396 ; 0x801396 21d5a: 70 e0 ldi r23, 0x00 ; 0 21d5c: 90 e0 ldi r25, 0x00 ; 0 21d5e: 80 e0 ldi r24, 0x00 ; 0 21d60: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 21d64: 9b 01 movw r18, r22 21d66: ac 01 movw r20, r24 21d68: 66 e6 ldi r22, 0x66 ; 102 21d6a: 76 e6 ldi r23, 0x66 ; 102 21d6c: 8d e9 ldi r24, 0x9D ; 157 21d6e: 92 e4 ldi r25, 0x42 ; 66 21d70: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 21d74: 36 2e mov r3, r22 21d76: 87 2e mov r8, r23 21d78: 98 2e mov r9, r24 21d7a: 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)) 21d7c: 26 2f mov r18, r22 21d7e: 37 2f mov r19, r23 21d80: 48 2f mov r20, r24 21d82: 59 2f mov r21, r25 21d84: 60 e0 ldi r22, 0x00 ; 0 21d86: 70 e0 ldi r23, 0x00 ; 0 21d88: 80 e2 ldi r24, 0x20 ; 32 21d8a: 91 e4 ldi r25, 0x41 ; 65 21d8c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 21d90: 2b 01 movw r4, r22 21d92: 3c 01 movw r6, r24 21d94: ee e1 ldi r30, 0x1E ; 30 21d96: f5 e0 ldi r31, 0x05 ; 5 21d98: 82 2d mov r24, r2 21d9a: 11 92 st Z+, r1 21d9c: 8a 95 dec r24 21d9e: e9 f7 brne .-6 ; 0x21d9a lcd_status_message_idx = 0; 21da0: 10 92 1d 05 sts 0x051D, r1 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> 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); 21da4: 83 2d mov r24, r3 21da6: 98 2d mov r25, r8 21da8: a9 2d mov r26, r9 21daa: be 2d mov r27, r14 21dac: bc 01 movw r22, r24 21dae: 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++) { 21db0: 91 2c mov r9, r1 21db2: 31 2c mov r3, r1 21db4: e1 2c mov r14, r1 extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE); 21db6: 5b 01 movw r10, r22 21db8: 6c 01 movw r12, r24 21dba: d7 fa bst r13, 7 21dbc: d0 94 com r13 21dbe: d7 f8 bld r13, 7 21dc0: d0 94 com r13 21dc2: 20 e0 ldi r18, 0x00 ; 0 21dc4: 30 e0 ldi r19, 0x00 ; 0 21dc6: 48 e4 ldi r20, 0x48 ; 72 21dc8: 52 e4 ldi r21, 0x42 ; 66 21dca: 0f 94 a5 c5 call 0x38b4a ; 0x38b4a 21dce: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 21dd2: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 while (planner_any_moves()) { 21dd6: 98 17 cp r25, r24 21dd8: 09 f4 brne .+2 ; 0x21ddc 21dda: 49 c0 rjmp .+146 ; 0x21e6e filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR); 21ddc: 11 23 and r17, r17 21dde: 31 f0 breq .+12 ; 0x21dec 21de0: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 21de4: 11 e0 ldi r17, 0x01 ; 1 21de6: 81 30 cpi r24, 0x01 ; 1 21de8: 09 f0 breq .+2 ; 0x21dec 21dea: 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); 21dec: 83 e0 ldi r24, 0x03 ; 3 21dee: 0f 94 95 43 call 0x2872a ; 0x2872a 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); 21df2: 20 91 9d 06 lds r18, 0x069D ; 0x80069d 21df6: 30 91 9e 06 lds r19, 0x069E ; 0x80069e 21dfa: 40 91 9f 06 lds r20, 0x069F ; 0x80069f 21dfe: 50 91 a0 06 lds r21, 0x06A0 ; 0x8006a0 21e02: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 21e06: a3 01 movw r20, r6 21e08: 92 01 movw r18, r4 21e0a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 21e0e: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 21e12: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 21e16: 86 2e mov r8, r22 if (dpixel1 - dpixel0) { 21e18: e6 16 cp r14, r22 21e1a: c1 f0 breq .+48 ; 0x21e4c 21e1c: e3 2d mov r30, r3 21e1e: e4 31 cpi r30, 0x14 ; 20 21e20: 08 f0 brcs .+2 ; 0x21e24 21e22: 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); 21e24: 33 24 eor r3, r3 21e26: 33 94 inc r3 21e28: 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] : '-'); 21e2a: 8f ef ldi r24, 0xFF ; 255 21e2c: 11 11 cpse r17, r1 21e2e: 01 c0 rjmp .+2 ; 0x21e32 21e30: 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; 21e32: f0 e0 ldi r31, 0x00 ; 0 21e34: e2 5e subi r30, 0xE2 ; 226 21e36: fa 4f sbci r31, 0xFA ; 250 21e38: 80 83 st Z, r24 lcd_draw_update = 1; // force redraw 21e3a: 91 e0 ldi r25, 0x01 ; 1 21e3c: 90 93 6d 02 sts 0x026D, r25 ; 0x80026d if (!lcd_update_enabled) lcdui_print_status_line(); 21e40: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 21e44: 81 11 cpse r24, r1 21e46: 02 c0 rjmp .+4 ; 0x21e4c 21e48: 0f 94 4f 2b call 0x2569e ; 0x2569e void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 21e4c: 90 e0 ldi r25, 0x00 ; 0 21e4e: 80 e0 ldi r24, 0x00 ; 0 21e50: 0e 94 84 8c call 0x11908 ; 0x11908 } 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); 21e54: e8 2c mov r14, r8 tlur.Progress(filament_inserted); safe_delay_keep_alive(0); if (planner_draining()) { 21e56: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 21e5a: 88 23 and r24, r24 21e5c: 09 f4 brne .+2 ; 0x21e60 21e5e: b7 cf rjmp .-146 ; 0x21dce return false; // power panic or a similar issue happened, bail out fast 21e60: 10 e0 ldi r17, 0x00 ; 0 21e62: 37 c0 rjmp .+110 ; 0x21ed2 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); 21e64: c6 01 movw r24, r12 21e66: b5 01 movw r22, r10 21e68: 99 24 eor r9, r9 21e6a: 93 94 inc r9 21e6c: aa cf rjmp .-172 ; 0x21dc2 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++) { 21e6e: 91 e0 ldi r25, 0x01 ; 1 21e70: 99 12 cpse r9, r25 21e72: f8 cf rjmp .-16 ; 0x21e64 return false; // power panic or a similar issue happened, bail out fast } } } Disable_E0(); 21e74: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 if (!filament_inserted) { 21e78: 11 11 cpse r17, r1 21e7a: 08 c0 rjmp .+16 ; 0x21e8c eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false); mmu2.Status(); } void IncrementLoadFails(){ eeprom_increment_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL); 21e7c: 8f ec ldi r24, 0xCF ; 207 21e7e: 9e e0 ldi r25, 0x0E ; 14 21e80: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT); 21e84: 80 ed ldi r24, 0xD0 ; 208 21e86: 9e e0 ldi r25, 0x0E ; 14 21e88: 0e 94 b3 75 call 0xeb66 ; 0xeb66 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); 21e8c: 44 e1 ldi r20, 0x14 ; 20 21e8e: 50 e0 ldi r21, 0x00 ; 0 21e90: 6e e1 ldi r22, 0x1E ; 30 21e92: 75 e0 ldi r23, 0x05 ; 5 21e94: ce 01 movw r24, r28 21e96: 01 96 adiw r24, 0x01 ; 1 21e98: 0f 94 90 e2 call 0x3c520 ; 0x3c520 21e9c: fe 01 movw r30, r28 21e9e: 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'; 21ea0: 81 91 ld r24, Z+ 21ea2: 87 fd sbrc r24, 7 21ea4: 2c c0 rjmp .+88 ; 0x21efe 21ea6: 80 e3 ldi r24, 0x30 ; 48 21ea8: df 01 movw r26, r30 21eaa: 11 97 sbiw r26, 0x01 ; 1 21eac: 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++) { 21eae: 8e 89 ldd r24, Y+22 ; 0x16 21eb0: 9f 89 ldd r25, Y+23 ; 0x17 21eb2: 8e 17 cp r24, r30 21eb4: 9f 07 cpc r25, r31 21eb6: a1 f7 brne .-24 ; 0x21ea0 // 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; 21eb8: 1d 8a std Y+21, r1 ; 0x15 MMU2_ECHO_MSGLN(buf); 21eba: 82 ef ldi r24, 0xF2 ; 242 21ebc: 9a ea ldi r25, 0xAA ; 170 21ebe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 21ec2: 88 e5 ldi r24, 0x58 ; 88 21ec4: 9e e8 ldi r25, 0x8E ; 142 21ec6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 21eca: ce 01 movw r24, r28 21ecc: 01 96 adiw r24, 0x01 ; 1 21ece: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 SERIAL_ECHOLN(message); } void lcd_reset_status_message_timeout() { lcd_status_message_timeout.start(); 21ed2: 83 e3 ldi r24, 0x33 ; 51 21ed4: 95 e0 ldi r25, 0x05 ; 5 21ed6: 0f 94 cb 2c call 0x25996 ; 0x25996 ::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()) { 21eda: 11 23 and r17, r17 21edc: 09 f4 brne .+2 ; 0x21ee0 21ede: 0c cf rjmp .-488 ; 0x21cf8 // 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 21ee0: 80 2f mov r24, r16 21ee2: 0f 94 f7 87 call 0x30fee ; 0x30fee } } void SpoolJoin::setSlot(uint8_t slot) { currentMMUSlot = slot; 21ee6: 00 93 48 13 sts 0x1348, r16 ; 0x801348 SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; 21eea: 80 91 bd 13 lds r24, 0x13BD ; 0x8013bd 21eee: 90 91 be 13 lds r25, 0x13BE ; 0x8013be 21ef2: 01 96 adiw r24, 0x01 ; 1 21ef4: 90 93 be 13 sts 0x13BE, r25 ; 0x8013be 21ef8: 80 93 bd 13 sts 0x13BD, r24 ; 0x8013bd 21efc: 13 cf rjmp .-474 ; 0x21d24 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'; 21efe: 81 e3 ldi r24, 0x31 ; 49 21f00: d3 cf rjmp .-90 ; 0x21ea8 void SetInAutoRetry(bool iar) { inAutoRetry = iar; } inline void SetPrinterError(ErrorCode ec) { explicitPrinterError = ec; 21f02: 8a e2 ldi r24, 0x2A ; 42 21f04: 90 e8 ldi r25, 0x80 ; 128 21f06: 90 93 4b 13 sts 0x134B, r25 ; 0x80134b 21f0a: 80 93 4a 13 sts 0x134A, r24 ; 0x80134a 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 21f0e: 61 e0 ldi r22, 0x01 ; 1 21f10: 81 e0 ldi r24, 0x01 ; 1 21f12: 0f 94 6a ac call 0x358d4 ; 0x358d4 21f16: c7 ce rjmp .-626 ; 0x21ca6 00021f18 : } ScreenUpdateEnable(); return true; } bool MMU2::load_filament_to_nozzle(uint8_t slot) { 21f18: cf 93 push r28 21f1a: df 93 push r29 21f1c: d8 2f mov r29, r24 if (!WaitForMMUReady()) { 21f1e: 0f 94 78 88 call 0x310f0 ; 0x310f0 21f22: c8 2f mov r28, r24 21f24: 88 23 and r24, r24 21f26: 49 f1 breq .+82 ; 0x21f7a safe_delay_keep_alive(delay); } } void WaitForHotendTargetTempBeep() { waitForHotendTargetTemp(200, [] {}); 21f28: 88 ec ldi r24, 0xC8 ; 200 21f2a: 90 e0 ldi r25, 0x00 ; 0 21f2c: 0f 94 27 c9 call 0x3924e ; 0x3924e (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]> 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); 21f30: 82 e0 ldi r24, 0x02 ; 2 21f32: 0f 94 c8 4e call 0x29d90 ; 0x29d90 void FullScreenMsgTest(uint8_t slot){ FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot); } void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); 21f36: 8f ea ldi r24, 0xAF ; 175 21f38: 9b e5 ldi r25, 0x5B ; 91 21f3a: 0e 94 44 72 call 0xe488 ; 0xe488 21f3e: 6d 2f mov r22, r29 21f40: 0f 94 c3 c4 call 0x38986 ; 0x38986 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 21f44: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 FullScreenMsgLoad(slot); { // used for MMU-menu operation "Load to Nozzle" ReportingRAII rep(CommandInProgress::ToolChange); FSensorBlockRunout blockRunout; 21f48: 0f 94 a5 87 call 0x30f4a ; 0x30f4a if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly 21f4c: 80 91 a0 13 lds r24, 0x13A0 ; 0x8013a0 21f50: 83 36 cpi r24, 0x63 ; 99 21f52: 29 f0 breq .+10 ; 0x21f5e return ss; } void MMU2::filament_ramming() { execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); 21f54: 62 e1 ldi r22, 0x12 ; 18 21f56: 80 e4 ldi r24, 0x40 ; 64 21f58: 96 ea ldi r25, 0xA6 ; 166 21f5a: 0f 94 4f 88 call 0x3109e ; 0x3109e if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly filament_ramming(); } ToolChangeCommon(slot); 21f5e: 8d 2f mov r24, r29 21f60: 0f 94 34 0e call 0x21c68 ; 0x21c68 // Finish loading to the nozzle with finely tuned steps. execute_load_to_nozzle_sequence(); 21f64: 0e 94 d0 ce call 0x19da0 ; 0x19da0 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); 21f68: 83 e0 ldi r24, 0x03 ; 3 21f6a: 0f 94 c8 4e call 0x29d90 ; 0x29d90 #endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) // SERIAL_ECHOLNPGM("FSBlockRunout"); } FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 21f6e: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 21f72: 0f 94 6d 88 call 0x310da ; 0x310da // Finish loading to the nozzle with finely tuned steps. execute_load_to_nozzle_sequence(); MakeSound(Confirm); } ScreenUpdateEnable(); 21f76: 0f 94 c0 c4 call 0x38980 ; 0x38980 return true; } 21f7a: 8c 2f mov r24, r28 21f7c: df 91 pop r29 21f7e: cf 91 pop r28 21f80: 08 95 ret 00021f82 : 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); 21f82: 0f 94 8c 0f call 0x21f18 ; 0x21f18 // Extrude a little bit of filament so the user // can see the color is correct load_filament_final_feed(); 21f86: 0e 94 2b 64 call 0xc856 ; 0xc856 st_synchronize(); 21f8a: 0f 94 a9 43 call 0x28752 ; 0x28752 // Ask user if the extruded color is correct: lcd_return_to_status(); 21f8e: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_load_filament_color_check(); 21f92: 0f 94 53 50 call 0x2a0a6 ; 0x2a0a6 lcd_setstatuspgm(MSG_WELCOME); 21f96: 82 e1 ldi r24, 0x12 ; 18 21f98: 90 e7 ldi r25, 0x70 ; 112 21f9a: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = CustomMsg::Status; 21f9e: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 // Clear the filament action clearFilamentAction(); 21fa2: 0d 94 6f 21 jmp 0x242de ; 0x242de 00021fa6 : SpoolJoin::spooljoin.setSlot(slot); ++toolchange_counter; } bool MMU2::tool_change(uint8_t slot) { 21fa6: cf 93 push r28 21fa8: df 93 push r29 21faa: d8 2f mov r29, r24 if (!WaitForMMUReady()) { 21fac: 0f 94 78 88 call 0x310f0 ; 0x310f0 21fb0: c8 2f mov r28, r24 21fb2: 88 23 and r24, r24 21fb4: b9 f0 breq .+46 ; 0x21fe4 return false; } if (slot != extruder) { 21fb6: 80 91 a0 13 lds r24, 0x13A0 ; 0x8013a0 21fba: 8d 17 cp r24, r29 21fbc: 99 f0 breq .+38 ; 0x21fe4 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(); 21fbe: 0e 94 79 67 call 0xcef2 ; 0xcef2 if (/*FindaDetectsFilament()*/ 21fc2: 81 11 cpse r24, r1 21fc4: 02 c0 rjmp .+4 ; 0x21fca /*!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(); 21fc6: 0f 94 31 ad call 0x35a62 ; 0x35a62 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 21fca: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 // we need to unload manually as well -- but only if FINDA detects filament unload(); } ReportingRAII rep(CommandInProgress::ToolChange); FSensorBlockRunout blockRunout; 21fce: 0f 94 a5 87 call 0x30f4a ; 0x30f4a bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 21fd2: 0f 94 a9 43 call 0x28752 ; 0x28752 planner_synchronize(); ToolChangeCommon(slot); 21fd6: 8d 2f mov r24, r29 21fd8: 0f 94 34 0e call 0x21c68 ; 0x21c68 21fdc: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 21fe0: 0f 94 6d 88 call 0x310da ; 0x310da FSensorBlockRunout blockRunout; planner_synchronize(); ToolChangeCommon(slot); } return true; } 21fe4: 8c 2f mov r24, r28 21fe6: df 91 pop r29 21fe8: cf 91 pop r28 21fea: 08 95 ret 00021fec : /// 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) { 21fec: 1f 93 push r17 21fee: cf 93 push r28 21ff0: df 93 push r29 21ff2: c8 2f mov r28, r24 21ff4: 16 2f mov r17, r22 if (!WaitForMMUReady()) { 21ff6: 0f 94 78 88 call 0x310f0 ; 0x310f0 21ffa: d8 2f mov r29, r24 21ffc: 88 23 and r24, r24 21ffe: 89 f0 breq .+34 ; 0x22022 return false; } FSensorBlockRunout blockRunout; 22000: 0f 94 a5 87 call 0x30f4a ; 0x30f4a switch (code) { 22004: c3 36 cpi r28, 0x63 ; 99 22006: 01 f1 breq .+64 ; 0x22048 22008: c8 37 cpi r28, 0x78 ; 120 2200a: 81 f0 breq .+32 ; 0x2202c 2200c: cf 33 cpi r28, 0x3F ; 63 2200e: 39 f4 brne .+14 ; 0x2201e case '?': { waitForHotendTargetTemp(100, [] {}); 22010: 84 e6 ldi r24, 0x64 ; 100 22012: 90 e0 ldi r25, 0x00 ; 0 22014: 0f 94 27 c9 call 0x3924e ; 0x3924e (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]> load_filament_to_nozzle(slot); 22018: 81 2f mov r24, r17 2201a: 0f 94 8c 0f call 0x21f18 ; 0x21f18 2201e: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 execute_load_to_nozzle_sequence(); } break; } return true; } 22022: 8d 2f mov r24, r29 22024: df 91 pop r29 22026: cf 91 pop r28 22028: 1f 91 pop r17 2202a: 08 95 ret } #ifdef PREVENT_DANGEROUS_EXTRUDE void set_extrude_min_temp(int temp) { extrude_min_temp = temp; 2202c: 10 92 6c 02 sts 0x026C, r1 ; 0x80026c 22030: 10 92 6b 02 sts 0x026B, r1 ; 0x80026b 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); 22034: 81 2f mov r24, r17 22036: 0f 94 d3 0f call 0x21fa6 ; 0x21fa6 2203a: 8f ea ldi r24, 0xAF ; 175 2203c: 90 e0 ldi r25, 0x00 ; 0 2203e: 90 93 6c 02 sts 0x026C, r25 ; 0x80026c 22042: 80 93 6b 02 sts 0x026B, r24 ; 0x80026b 22046: eb cf rjmp .-42 ; 0x2201e thermal_setExtrudeMintemp(EXTRUDE_MINTEMP); } break; case 'c': { waitForHotendTargetTemp(100, [] {}); 22048: 84 e6 ldi r24, 0x64 ; 100 2204a: 90 e0 ldi r25, 0x00 ; 0 2204c: 0f 94 27 c9 call 0x3924e ; 0x3924e (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]> execute_load_to_nozzle_sequence(); 22050: 0e 94 d0 ce call 0x19da0 ; 0x19da0 22054: e4 cf rjmp .-56 ; 0x2201e 00022056 : // Clear the filament action clearFilamentAction(); } static inline void loading_test_wrapper(uint8_t i){ 22056: cf 93 push r28 22058: 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); 2205a: 8a e5 ldi r24, 0x5A ; 90 2205c: 95 e4 ldi r25, 0x45 ; 69 2205e: 0e 94 44 72 call 0xe488 ; 0xe488 22062: 6c 2f mov r22, r28 22064: 0f 94 c3 c4 call 0x38986 ; 0x38986 return true; } bool MMU2::loading_test(uint8_t slot) { FullScreenMsgTest(slot); tool_change(slot); 22068: 8c 2f mov r24, r28 2206a: 0f 94 d3 0f call 0x21fa6 ; 0x21fa6 2206e: 0f 94 a9 43 call 0x28752 ; 0x28752 planner_synchronize(); unload(); 22072: 0f 94 31 ad call 0x35a62 ; 0x35a62 ScreenUpdateEnable(); 22076: 0f 94 c0 c4 call 0x38980 ; 0x38980 MMU2::mmu2.loading_test(i); // Clear the filament action clearFilamentAction(); } 2207a: cf 91 pop r28 static inline void loading_test_wrapper(uint8_t i){ MMU2::mmu2.loading_test(i); // Clear the filament action clearFilamentAction(); 2207c: 0d 94 6f 21 jmp 0x242de ; 0x242de 00022080 : 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(){ 22080: cf 93 push r28 for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ 22082: c0 e0 ldi r28, 0x00 ; 0 22084: 8a e5 ldi r24, 0x5A ; 90 22086: 95 e4 ldi r25, 0x45 ; 69 22088: 0e 94 44 72 call 0xe488 ; 0xe488 2208c: 6c 2f mov r22, r28 2208e: 0f 94 c3 c4 call 0x38986 ; 0x38986 return true; } bool MMU2::loading_test(uint8_t slot) { FullScreenMsgTest(slot); tool_change(slot); 22092: 8c 2f mov r24, r28 22094: 0f 94 d3 0f call 0x21fa6 ; 0x21fa6 22098: 0f 94 a9 43 call 0x28752 ; 0x28752 planner_synchronize(); unload(); 2209c: 0f 94 31 ad call 0x35a62 ; 0x35a62 ScreenUpdateEnable(); 220a0: 0f 94 c0 c4 call 0x38980 ; 0x38980 220a4: cf 5f subi r28, 0xFF ; 255 220a6: c5 30 cpi r28, 0x05 ; 5 220a8: 69 f7 brne .-38 ; 0x22084 MMU2::mmu2.loading_test(i); } // Clear the filament action clearFilamentAction(); } 220aa: cf 91 pop r28 for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){ MMU2::mmu2.loading_test(i); } // Clear the filament action clearFilamentAction(); 220ac: 0d 94 6f 21 jmp 0x242de ; 0x242de 000220b0 : void ProtocolLogic::CutFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot)); } void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) { 220b0: cf 93 push r28 220b2: df 93 push r29 220b4: 00 d0 rcall .+0 ; 0x220b6 220b6: 1f 92 push r1 220b8: 1f 92 push r1 220ba: cd b7 in r28, 0x3d ; 61 220bc: de b7 in r29, 0x3e ; 62 PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode)); 220be: 48 2f mov r20, r24 220c0: 68 e5 ldi r22, 0x58 ; 88 220c2: ce 01 movw r24, r28 220c4: 01 96 adiw r24, 0x01 ; 1 220c6: 0f 94 81 c5 call 0x38b02 ; 0x38b02 220ca: 49 81 ldd r20, Y+1 ; 0x01 220cc: 5a 81 ldd r21, Y+2 ; 0x02 220ce: 6b 81 ldd r22, Y+3 ; 0x03 220d0: 7c 81 ldd r23, Y+4 ; 0x04 220d2: 8d 81 ldd r24, Y+5 ; 0x05 220d4: 0f 94 46 a5 call 0x34a8c ; 0x34a8c } 220d8: 0f 90 pop r0 220da: 0f 90 pop r0 220dc: 0f 90 pop r0 220de: 0f 90 pop r0 220e0: 0f 90 pop r0 220e2: df 91 pop r29 220e4: cf 91 pop r28 220e6: 08 95 ret 000220e8 : break; } } void MMU2::ResetX0() { logic.ResetMMU(); // Send soft reset 220e8: 80 e0 ldi r24, 0x00 ; 0 220ea: 0d 94 58 10 jmp 0x220b0 ; 0x220b0 000220ee : void MMU2::PowerOn() { power_on(); } bool MMU2::ReadRegister(uint8_t address) { 220ee: 1f 93 push r17 220f0: cf 93 push r28 220f2: df 93 push r29 220f4: 00 d0 rcall .+0 ; 0x220f6 220f6: 1f 92 push r1 220f8: 1f 92 push r1 220fa: cd b7 in r28, 0x3d ; 61 220fc: de b7 in r29, 0x3e ; 62 220fe: 18 2f mov r17, r24 if (!WaitForMMUReady()) { 22100: 0f 94 78 88 call 0x310f0 ; 0x310f0 22104: 88 23 and r24, r24 22106: d9 f0 breq .+54 ; 0x2213e void ProtocolLogic::Home(uint8_t mode) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Home, mode)); } void ProtocolLogic::ReadRegister(uint8_t address) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address)); 22108: 41 2f mov r20, r17 2210a: 62 e5 ldi r22, 0x52 ; 82 2210c: ce 01 movw r24, r28 2210e: 01 96 adiw r24, 0x01 ; 1 22110: 0f 94 81 c5 call 0x38b02 ; 0x38b02 22114: 49 81 ldd r20, Y+1 ; 0x01 22116: 5a 81 ldd r21, Y+2 ; 0x02 22118: 6b 81 ldd r22, Y+3 ; 0x03 2211a: 7c 81 ldd r23, Y+4 ; 0x04 2211c: 8d 81 ldd r24, Y+5 ; 0x05 2211e: 0f 94 46 a5 call 0x34a8c ; 0x34a8c 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)); 22122: 60 e0 ldi r22, 0x00 ; 0 22124: 80 e0 ldi r24, 0x00 ; 0 22126: 0f 94 6a ac call 0x358d4 ; 0x358d4 2212a: 88 23 and r24, r24 2212c: 69 f3 breq .-38 ; 0x22108 // Update cached value lastReadRegisterValue = logic.rsp.paramValue; 2212e: 20 91 65 13 lds r18, 0x1365 ; 0x801365 22132: 30 91 66 13 lds r19, 0x1366 ; 0x801366 22136: 30 93 b6 13 sts 0x13B6, r19 ; 0x8013b6 2213a: 20 93 b5 13 sts 0x13B5, r18 ; 0x8013b5 return true; } 2213e: 0f 90 pop r0 22140: 0f 90 pop r0 22142: 0f 90 pop r0 22144: 0f 90 pop r0 22146: 0f 90 pop r0 22148: df 91 pop r29 2214a: cf 91 pop r28 2214c: 1f 91 pop r17 2214e: 08 95 ret 00022150 : waiting_handler(); } set_fan_speed(old_speed); } static uint16_t record(uint16_t samples = REC_BUFFER_SIZE) { 22150: ff 92 push r15 22152: 0f 93 push r16 22154: 1f 93 push r17 22156: cf 93 push r28 22158: df 93 push r29 2215a: 1f 92 push r1 2215c: cd b7 in r28, 0x3d ; 61 2215e: de b7 in r29, 0x3e ; 62 TempMgrGuard temp_mgr_guard; 22160: ce 01 movw r24, r28 22162: 01 96 adiw r24, 0x01 ; 1 22164: 0f 94 76 32 call 0x264ec ; 0x264ec uint16_t pos = 0; 22168: 10 e0 ldi r17, 0x00 ; 0 2216a: 00 e0 ldi r16, 0x00 ; 0 // stop recording for an hard error condition if(temp_error_state.v) return 0; // record a new entry rec_entry& entry = rec_buffer[pos]; 2216c: 85 e0 ldi r24, 0x05 ; 5 2216e: f8 2e mov r15, r24 static uint16_t record(uint16_t samples = REC_BUFFER_SIZE) { TempMgrGuard temp_mgr_guard; uint16_t pos = 0; while(pos < samples) { if(!TEMP_MGR_INT_FLAG_STATE()) { 22170: d1 99 sbic 0x1a, 1 ; 26 22172: 11 c0 rjmp .+34 ; 0x22196 // temperatures not ready yet, just manage heaters while waiting to reduce jitter manage_heater(); 22174: 0f 94 34 39 call 0x27268 ; 0x27268 static uint16_t record(uint16_t samples = REC_BUFFER_SIZE) { TempMgrGuard temp_mgr_guard; uint16_t pos = 0; while(pos < samples) { 22178: 0e 3d cpi r16, 0xDE ; 222 2217a: 11 05 cpc r17, r1 2217c: c9 f7 brne .-14 ; 0x22170 } set_fan_speed(old_speed); } static uint16_t record(uint16_t samples = REC_BUFFER_SIZE) { TempMgrGuard temp_mgr_guard; 2217e: ce 01 movw r24, r28 22180: 01 96 adiw r24, 0x01 ; 1 22182: 0f 94 69 32 call 0x264d2 ; 0x264d2 // it's now safer to give regular serial/lcd updates a shot waiting_handler(); } return pos; } 22186: c8 01 movw r24, r16 22188: 0f 90 pop r0 2218a: df 91 pop r29 2218c: cf 91 pop r28 2218e: 1f 91 pop r17 22190: 0f 91 pop r16 22192: ff 90 pop r15 22194: 08 95 ret if(!TEMP_MGR_INT_FLAG_STATE()) { // temperatures not ready yet, just manage heaters while waiting to reduce jitter manage_heater(); continue; } TEMP_MGR_INT_FLAG_CLEAR(); 22196: d1 9a sbi 0x1a, 1 ; 26 // manually repeat what the regular isr would do if(adc_values_ready != true) continue; 22198: 80 91 1b 05 lds r24, 0x051B ; 0x80051b <_ZL16adc_values_ready.lto_priv.459> 2219c: 88 23 and r24, r24 2219e: 61 f3 breq .-40 ; 0x22178 adc_values_ready = false; 221a0: 10 92 1b 05 sts 0x051B, r1 ; 0x80051b <_ZL16adc_values_ready.lto_priv.459> adc_start_cycle(); 221a4: 0e 94 77 8d call 0x11aee ; 0x11aee temp_mgr_isr(); 221a8: 0f 94 91 36 call 0x26d22 ; 0x26d22 // stop recording for an hard error condition if(temp_error_state.v) 221ac: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 221b0: 81 11 cpse r24, r1 221b2: 1b c0 rjmp .+54 ; 0x221ea return 0; // record a new entry rec_entry& entry = rec_buffer[pos]; 221b4: f0 9e mul r15, r16 221b6: f0 01 movw r30, r0 221b8: f1 9e mul r15, r17 221ba: f0 0d add r31, r0 221bc: 11 24 eor r1, r1 221be: ec 53 subi r30, 0x3C ; 60 221c0: f9 4f sbci r31, 0xF9 ; 249 entry.temp = current_temperature_isr[0]; 221c2: 80 91 16 05 lds r24, 0x0516 ; 0x800516 221c6: 90 91 17 05 lds r25, 0x0517 ; 0x800517 221ca: a0 91 18 05 lds r26, 0x0518 ; 0x800518 221ce: b0 91 19 05 lds r27, 0x0519 ; 0x800519 221d2: 80 83 st Z, r24 221d4: 91 83 std Z+1, r25 ; 0x01 221d6: a2 83 std Z+2, r26 ; 0x02 221d8: b3 83 std Z+3, r27 ; 0x03 entry.pwm = soft_pwm[0]; 221da: 80 91 15 05 lds r24, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 221de: 84 83 std Z+4, r24 ; 0x04 ++pos; 221e0: 0f 5f subi r16, 0xFF ; 255 221e2: 1f 4f sbci r17, 0xFF ; 255 // it's now safer to give regular serial/lcd updates a shot waiting_handler(); 221e4: 0f 94 5c 3b call 0x276b8 ; 0x276b8 221e8: c7 cf rjmp .-114 ; 0x22178 adc_start_cycle(); temp_mgr_isr(); // stop recording for an hard error condition if(temp_error_state.v) return 0; 221ea: 10 e0 ldi r17, 0x00 ; 0 221ec: 00 e0 ldi r16, 0x00 ; 0 221ee: c7 cf rjmp .-114 ; 0x2217e 000221f0 : #endif // TMC2130 static inline bool pgm_is_whitespace(const char *c_addr) { const char c = pgm_read_byte(c_addr); 221f0: fc 01 movw r30, r24 221f2: 94 91 lpm r25, Z return c == ' ' || c == '\t' || c == '\r' || c == '\n'; 221f4: 90 32 cpi r25, 0x20 ; 32 221f6: 49 f0 breq .+18 ; 0x2220a 221f8: 87 ef ldi r24, 0xF7 ; 247 221fa: 89 0f add r24, r25 221fc: 82 30 cpi r24, 0x02 ; 2 221fe: 28 f0 brcs .+10 ; 0x2220a 22200: 81 e0 ldi r24, 0x01 ; 1 22202: 9d 30 cpi r25, 0x0D ; 13 22204: 19 f0 breq .+6 ; 0x2220c 22206: 80 e0 ldi r24, 0x00 ; 0 22208: 08 95 ret 2220a: 81 e0 ldi r24, 0x01 ; 1 } 2220c: 08 95 ret 0002220e : 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; 2220e: 88 3e cpi r24, 0xE8 ; 232 22210: 23 e0 ldi r18, 0x03 ; 3 22212: 92 07 cpc r25, r18 22214: 10 f0 brcs .+4 ; 0x2221a 22216: 87 ee ldi r24, 0xE7 ; 231 22218: 93 e0 ldi r25, 0x03 ; 3 } 2221a: 08 95 ret 0002221c : return 0; } static int uart2_getchar(_UNUSED FILE *stream) { if (rbuf_empty(uart2_ibuf)) return -1; 2221c: 90 91 3b 05 lds r25, 0x053B ; 0x80053b 22220: 80 91 3a 05 lds r24, 0x053A ; 0x80053a 22224: 2f ef ldi r18, 0xFF ; 255 22226: 3f ef ldi r19, 0xFF ; 255 22228: 89 17 cp r24, r25 2222a: 71 f0 breq .+28 ; 0x22248 _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 2222c: e9 2f mov r30, r25 2222e: f0 e0 ldi r31, 0x00 ; 0 22230: e3 5c subi r30, 0xC3 ; 195 22232: fa 4f sbci r31, 0xFA ; 250 22234: 20 81 ld r18, Z 22236: 30 e0 ldi r19, 0x00 ; 0 buf_r++; //increment read index 22238: 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 2223a: 80 91 39 05 lds r24, 0x0539 ; 0x800539 2223e: 98 17 cp r25, r24 22240: 08 f0 brcs .+2 ; 0x22244 22242: 90 e0 ldi r25, 0x00 ; 0 ptr[2] = buf_r; //store read index 22244: 90 93 3b 05 sts 0x053B, r25 ; 0x80053b return rbuf_get(uart2_ibuf); } 22248: c9 01 movw r24, r18 2224a: 08 95 ret 0002224c : uint8_t uart2_ibuf[20] = {0, 0}; FILE _uart2io; static int uart2_putchar(char c, _UNUSED FILE *stream) { while (!uart2_txready); 2224c: 90 91 d0 00 lds r25, 0x00D0 ; 0x8000d0 <__TEXT_REGION_LENGTH__+0x7c20d0> 22250: 95 ff sbrs r25, 5 22252: fc cf rjmp .-8 ; 0x2224c UDR2 = c; // transmit byte 22254: 80 93 d6 00 sts 0x00D6, r24 ; 0x8000d6 <__TEXT_REGION_LENGTH__+0x7c20d6> return 0; } 22258: 90 e0 ldi r25, 0x00 ; 0 2225a: 80 e0 ldi r24, 0x00 ; 0 2225c: 08 95 ret 0002225e : } while (i++ != 255); tmc2130_wr_MSLUTSEL(axis, x[0], x[1], x[2], w[0], w[1], w[2], w[3]); } void bubblesort_uint8(uint8_t* data, uint8_t size, uint8_t* data2) { 2225e: cf 92 push r12 22260: df 92 push r13 22262: ef 92 push r14 22264: ff 92 push r15 22266: 0f 93 push r16 22268: 1f 93 push r17 2226a: cf 93 push r28 2226c: df 93 push r29 2226e: 8c 01 movw r16, r24 22270: ea 01 movw r28, r20 uint8_t changed = 1; while (changed) { changed = 0; for (uint8_t i = 0; i < (size - 1); i++) 22272: 90 e0 ldi r25, 0x00 ; 0 void bubblesort_uint8(uint8_t* data, uint8_t size, uint8_t* data2) { uint8_t changed = 1; while (changed) { changed = 0; 22274: 50 e0 ldi r21, 0x00 ; 0 for (uint8_t i = 0; i < (size - 1); i++) 22276: 61 50 subi r22, 0x01 ; 1 22278: 77 0b sbc r23, r23 2227a: 29 2f mov r18, r25 2227c: 30 e0 ldi r19, 0x00 ; 0 2227e: 26 17 cp r18, r22 22280: 37 07 cpc r19, r23 22282: 2c f0 brlt .+10 ; 0x2228e } void bubblesort_uint8(uint8_t* data, uint8_t size, uint8_t* data2) { uint8_t changed = 1; while (changed) 22284: 55 23 and r21, r21 22286: 19 f1 breq .+70 ; 0x222ce { changed = 0; for (uint8_t i = 0; i < (size - 1); i++) 22288: 90 e0 ldi r25, 0x00 ; 0 void bubblesort_uint8(uint8_t* data, uint8_t size, uint8_t* data2) { uint8_t changed = 1; while (changed) { changed = 0; 2228a: 50 e0 ldi r21, 0x00 ; 0 2228c: f6 cf rjmp .-20 ; 0x2227a for (uint8_t i = 0; i < (size - 1); i++) if (data[i] > data[i+1]) 2228e: 78 01 movw r14, r16 22290: e2 0e add r14, r18 22292: f3 1e adc r15, r19 22294: f7 01 movw r30, r14 22296: 80 81 ld r24, Z 22298: d9 01 movw r26, r18 2229a: 11 96 adiw r26, 0x01 ; 1 2229c: 68 01 movw r12, r16 2229e: ca 0e add r12, r26 222a0: db 1e adc r13, r27 222a2: f6 01 movw r30, r12 222a4: 40 81 ld r20, Z 222a6: 48 17 cp r20, r24 222a8: 80 f4 brcc .+32 ; 0x222ca { uint8_t d = data[i]; data[i] = data[i+1]; 222aa: f7 01 movw r30, r14 222ac: 40 83 st Z, r20 data[i+1] = d; 222ae: f6 01 movw r30, r12 222b0: 80 83 st Z, r24 if (data2) 222b2: 20 97 sbiw r28, 0x00 ; 0 222b4: 49 f0 breq .+18 ; 0x222c8 { d = data2[i]; 222b6: fe 01 movw r30, r28 222b8: e2 0f add r30, r18 222ba: f3 1f adc r31, r19 222bc: 80 81 ld r24, Z data2[i] = data2[i+1]; 222be: ac 0f add r26, r28 222c0: bd 1f adc r27, r29 222c2: 2c 91 ld r18, X 222c4: 20 83 st Z, r18 data2[i+1] = d; 222c6: 8c 93 st X, r24 } changed = 1; 222c8: 51 e0 ldi r21, 0x01 ; 1 { uint8_t changed = 1; while (changed) { changed = 0; for (uint8_t i = 0; i < (size - 1); i++) 222ca: 9f 5f subi r25, 0xFF ; 255 222cc: d6 cf rjmp .-84 ; 0x2227a data2[i+1] = d; } changed = 1; } } } 222ce: df 91 pop r29 222d0: cf 91 pop r28 222d2: 1f 91 pop r17 222d4: 0f 91 pop r16 222d6: ff 90 pop r15 222d8: ef 90 pop r14 222da: df 90 pop r13 222dc: cf 90 pop r12 222de: 08 95 ret 000222e0 : } } inline void tmc2130_cs_high(uint8_t axis) { switch (axis) 222e0: 81 30 cpi r24, 0x01 ; 1 222e2: 41 f0 breq .+16 ; 0x222f4 222e4: 28 f0 brcs .+10 ; 0x222f0 222e6: 82 30 cpi r24, 0x02 ; 2 222e8: 39 f0 breq .+14 ; 0x222f8 222ea: 83 30 cpi r24, 0x03 ; 3 222ec: 71 f0 breq .+28 ; 0x2230a 222ee: 08 95 ret { case X_AXIS: WRITE(X_TMC2130_CS, HIGH); break; 222f0: a0 9a sbi 0x14, 0 ; 20 222f2: 08 95 ret case Y_AXIS: WRITE(Y_TMC2130_CS, HIGH); break; 222f4: a2 9a sbi 0x14, 2 ; 20 222f6: 08 95 ret case Z_AXIS: WRITE(Z_TMC2130_CS, HIGH); break; 222f8: 9f b7 in r25, 0x3f ; 63 222fa: f8 94 cli 222fc: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 22300: 80 62 ori r24, 0x20 ; 32 case E_AXIS: WRITE(E0_TMC2130_CS, HIGH); break; 22302: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 22306: 9f bf out 0x3f, r25 ; 63 } } 22308: 08 95 ret switch (axis) { case X_AXIS: WRITE(X_TMC2130_CS, HIGH); break; case Y_AXIS: WRITE(Y_TMC2130_CS, HIGH); break; case Z_AXIS: WRITE(Z_TMC2130_CS, HIGH); break; case E_AXIS: WRITE(E0_TMC2130_CS, HIGH); break; 2230a: 9f b7 in r25, 0x3f ; 63 2230c: f8 94 cli 2230e: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 22312: 80 61 ori r24, 0x10 ; 16 22314: f6 cf rjmp .-20 ; 0x22302 00022316 : } inline void tmc2130_cs_low(uint8_t axis) { switch (axis) 22316: 81 30 cpi r24, 0x01 ; 1 22318: 41 f0 breq .+16 ; 0x2232a 2231a: 28 f0 brcs .+10 ; 0x22326 2231c: 82 30 cpi r24, 0x02 ; 2 2231e: 39 f0 breq .+14 ; 0x2232e 22320: 83 30 cpi r24, 0x03 ; 3 22322: 71 f0 breq .+28 ; 0x22340 22324: 08 95 ret { case X_AXIS: WRITE(X_TMC2130_CS, LOW); break; 22326: a0 98 cbi 0x14, 0 ; 20 22328: 08 95 ret case Y_AXIS: WRITE(Y_TMC2130_CS, LOW); break; 2232a: a2 98 cbi 0x14, 2 ; 20 2232c: 08 95 ret case Z_AXIS: WRITE(Z_TMC2130_CS, LOW); break; 2232e: 9f b7 in r25, 0x3f ; 63 22330: f8 94 cli 22332: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 22336: 8f 7d andi r24, 0xDF ; 223 case E_AXIS: WRITE(E0_TMC2130_CS, LOW); break; 22338: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 2233c: 9f bf out 0x3f, r25 ; 63 } } 2233e: 08 95 ret switch (axis) { case X_AXIS: WRITE(X_TMC2130_CS, LOW); break; case Y_AXIS: WRITE(Y_TMC2130_CS, LOW); break; case Z_AXIS: WRITE(Z_TMC2130_CS, LOW); break; case E_AXIS: WRITE(E0_TMC2130_CS, LOW); break; 22340: 9f b7 in r25, 0x3f ; 63 22342: f8 94 cli 22344: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 22348: 8f 7e andi r24, 0xEF ; 239 2234a: f6 cf rjmp .-20 ; 0x22338 0002234c : } static inline uint8_t spi_txrx(uint8_t tx) { SPDR = tx; 2234c: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))); 2234e: 0d b4 in r0, 0x2d ; 45 22350: 07 fe sbrs r0, 7 22352: fd cf rjmp .-6 ; 0x2234e return SPDR; 22354: 8e b5 in r24, 0x2e ; 46 } 22356: 08 95 ret 00022358 : #endif temp_meas_ready = true; } static void temp_mgr_pid() { 22358: 2f 92 push r2 2235a: 3f 92 push r3 2235c: 4f 92 push r4 2235e: 5f 92 push r5 22360: 6f 92 push r6 22362: 7f 92 push r7 22364: 8f 92 push r8 22366: 9f 92 push r9 22368: af 92 push r10 2236a: bf 92 push r11 2236c: cf 92 push r12 2236e: df 92 push r13 22370: ef 92 push r14 22372: ff 92 push r15 22374: 0f 93 push r16 22376: 1f 93 push r17 22378: cf 93 push r28 2237a: df 93 push r29 2237c: cd b7 in r28, 0x3d ; 61 2237e: de b7 in r29, 0x3e ; 62 22380: 2e 97 sbiw r28, 0x0e ; 14 22382: 0f b6 in r0, 0x3f ; 63 22384: f8 94 cli 22386: de bf out 0x3e, r29 ; 62 22388: 0f be out 0x3f, r0 ; 63 2238a: 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]); 2238c: 20 90 1d 06 lds r2, 0x061D ; 0x80061d 22390: 30 90 1e 06 lds r3, 0x061E ; 0x80061e 22394: 40 90 16 05 lds r4, 0x0516 ; 0x800516 22398: 50 90 17 05 lds r5, 0x0517 ; 0x800517 2239c: 60 90 18 05 lds r6, 0x0518 ; 0x800518 223a0: 70 90 19 05 lds r7, 0x0519 ; 0x800519 #ifdef PIDTEMP pid_input = current; #ifndef PID_OPENLOOP if(target == 0) { 223a4: 21 14 cp r2, r1 223a6: 31 04 cpc r3, r1 223a8: 39 f4 brne .+14 ; 0x223b8 pid_output = 0; pid_reset[e] = true; 223aa: 81 e0 ldi r24, 0x01 ; 1 223ac: 80 93 f4 05 sts 0x05F4, r24 ; 0x8005f4 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; 223b0: 81 2c mov r8, r1 223b2: 91 2c mov r9, r1 223b4: 54 01 movw r10, r8 223b6: f9 c0 rjmp .+498 ; 0x225aa #ifndef PID_OPENLOOP if(target == 0) { pid_output = 0; pid_reset[e] = true; } else { pid_error[e] = target - pid_input; 223b8: b1 01 movw r22, r2 223ba: 03 2c mov r0, r3 223bc: 00 0c add r0, r0 223be: 88 0b sbc r24, r24 223c0: 99 0b sbc r25, r25 223c2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 223c6: a3 01 movw r20, r6 223c8: 92 01 movw r18, r4 223ca: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 223ce: 6b 01 movw r12, r22 223d0: 7c 01 movw r14, r24 if(pid_reset[e]) { 223d2: 80 91 f4 05 lds r24, 0x05F4 ; 0x8005f4 223d6: 88 23 and r24, r24 223d8: 91 f0 breq .+36 ; 0x223fe iState_sum[e] = 0.0; 223da: 10 92 f0 05 sts 0x05F0, r1 ; 0x8005f0 223de: 10 92 f1 05 sts 0x05F1, r1 ; 0x8005f1 223e2: 10 92 f2 05 sts 0x05F2, r1 ; 0x8005f2 223e6: 10 92 f3 05 sts 0x05F3, r1 ; 0x8005f3 dTerm[e] = 0.0; // 'dState_last[e]' initial setting is not necessary (see end of if-statement) 223ea: 10 92 ec 05 sts 0x05EC, r1 ; 0x8005ec 223ee: 10 92 ed 05 sts 0x05ED, r1 ; 0x8005ed 223f2: 10 92 ee 05 sts 0x05EE, r1 ; 0x8005ee 223f6: 10 92 ef 05 sts 0x05EF, r1 ; 0x8005ef pid_reset[e] = false; 223fa: 10 92 f4 05 sts 0x05F4, r1 ; 0x8005f4 } #ifndef PonM pTerm[e] = cs.Kp * pid_error[e]; 223fe: 20 91 25 0e lds r18, 0x0E25 ; 0x800e25 22402: 30 91 26 0e lds r19, 0x0E26 ; 0x800e26 22406: 40 91 27 0e lds r20, 0x0E27 ; 0x800e27 2240a: 50 91 28 0e lds r21, 0x0E28 ; 0x800e28 2240e: c7 01 movw r24, r14 22410: b6 01 movw r22, r12 22412: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 22416: 69 83 std Y+1, r22 ; 0x01 22418: 7a 83 std Y+2, r23 ; 0x02 2241a: 8b 83 std Y+3, r24 ; 0x03 2241c: 9c 83 std Y+4, r25 ; 0x04 iState_sum[e] += pid_error[e]; 2241e: 20 91 f0 05 lds r18, 0x05F0 ; 0x8005f0 22422: 30 91 f1 05 lds r19, 0x05F1 ; 0x8005f1 22426: 40 91 f2 05 lds r20, 0x05F2 ; 0x8005f2 2242a: 50 91 f3 05 lds r21, 0x05F3 ; 0x8005f3 2242e: c7 01 movw r24, r14 22430: b6 01 movw r22, r12 22432: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 22436: 4b 01 movw r8, r22 22438: 5c 01 movw r10, r24 iState_sum[e] = constrain(iState_sum[e], iState_sum_min[e], iState_sum_max[e]); 2243a: 20 91 b2 04 lds r18, 0x04B2 ; 0x8004b2 <_ZL14iState_sum_min.lto_priv.470> 2243e: 2d 87 std Y+13, r18 ; 0x0d 22440: 30 91 b3 04 lds r19, 0x04B3 ; 0x8004b3 <_ZL14iState_sum_min.lto_priv.470+0x1> 22444: 39 87 std Y+9, r19 ; 0x09 22446: 10 91 b4 04 lds r17, 0x04B4 ; 0x8004b4 <_ZL14iState_sum_min.lto_priv.470+0x2> 2244a: 00 91 b5 04 lds r16, 0x04B5 ; 0x8004b5 <_ZL14iState_sum_min.lto_priv.470+0x3> 2244e: 41 2f mov r20, r17 22450: 50 2f mov r21, r16 22452: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 22456: 87 fd sbrc r24, 7 22458: 17 c0 rjmp .+46 ; 0x22488 2245a: 80 91 ae 04 lds r24, 0x04AE ; 0x8004ae <_ZL14iState_sum_max.lto_priv.471> 2245e: 8d 87 std Y+13, r24 ; 0x0d 22460: 90 91 af 04 lds r25, 0x04AF ; 0x8004af <_ZL14iState_sum_max.lto_priv.471+0x1> 22464: 99 87 std Y+9, r25 ; 0x09 22466: 10 91 b0 04 lds r17, 0x04B0 ; 0x8004b0 <_ZL14iState_sum_max.lto_priv.471+0x2> 2246a: 00 91 b1 04 lds r16, 0x04B1 ; 0x8004b1 <_ZL14iState_sum_max.lto_priv.471+0x3> 2246e: 9c 01 movw r18, r24 22470: 41 2f mov r20, r17 22472: 50 2f mov r21, r16 22474: b4 01 movw r22, r8 22476: c5 01 movw r24, r10 22478: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2247c: 18 16 cp r1, r24 2247e: 24 f0 brlt .+8 ; 0x22488 22480: 8d 86 std Y+13, r8 ; 0x0d 22482: 99 86 std Y+9, r9 ; 0x09 22484: 1a 2d mov r17, r10 22486: 0b 2d mov r16, r11 22488: 8d 85 ldd r24, Y+13 ; 0x0d 2248a: 99 85 ldd r25, Y+9 ; 0x09 2248c: a1 2f mov r26, r17 2248e: b0 2f mov r27, r16 22490: 80 93 f0 05 sts 0x05F0, r24 ; 0x8005f0 22494: 90 93 f1 05 sts 0x05F1, r25 ; 0x8005f1 22498: a0 93 f2 05 sts 0x05F2, r26 ; 0x8005f2 2249c: b0 93 f3 05 sts 0x05F3, r27 ; 0x8005f3 iTerm[e] = cs.Ki * iState_sum[e]; 224a0: 20 91 29 0e lds r18, 0x0E29 ; 0x800e29 224a4: 30 91 2a 0e lds r19, 0x0E2A ; 0x800e2a 224a8: 40 91 2b 0e lds r20, 0x0E2B ; 0x800e2b 224ac: 50 91 2c 0e lds r21, 0x0E2C ; 0x800e2c 224b0: bc 01 movw r22, r24 224b2: 81 2f mov r24, r17 224b4: 90 2f mov r25, r16 224b6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 224ba: 6d 83 std Y+5, r22 ; 0x05 224bc: 7e 83 std Y+6, r23 ; 0x06 224be: 8f 83 std Y+7, r24 ; 0x07 224c0: 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 224c2: 20 91 e8 05 lds r18, 0x05E8 ; 0x8005e8 224c6: 30 91 e9 05 lds r19, 0x05E9 ; 0x8005e9 224ca: 40 91 ea 05 lds r20, 0x05EA ; 0x8005ea 224ce: 50 91 eb 05 lds r21, 0x05EB ; 0x8005eb 224d2: c3 01 movw r24, r6 224d4: b2 01 movw r22, r4 224d6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 224da: 20 91 2d 0e lds r18, 0x0E2D ; 0x800e2d 224de: 30 91 2e 0e lds r19, 0x0E2E ; 0x800e2e 224e2: 40 91 2f 0e lds r20, 0x0E2F ; 0x800e2f 224e6: 50 91 30 0e lds r21, 0x0E30 ; 0x800e30 224ea: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 224ee: 20 ed ldi r18, 0xD0 ; 208 224f0: 3c ec ldi r19, 0xCC ; 204 224f2: 4c e4 ldi r20, 0x4C ; 76 224f4: 5d e3 ldi r21, 0x3D ; 61 224f6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 224fa: 4b 01 movw r8, r22 224fc: 5c 01 movw r10, r24 224fe: 23 e3 ldi r18, 0x33 ; 51 22500: 33 e3 ldi r19, 0x33 ; 51 22502: 43 e7 ldi r20, 0x73 ; 115 22504: 5f e3 ldi r21, 0x3F ; 63 22506: 60 91 ec 05 lds r22, 0x05EC ; 0x8005ec 2250a: 70 91 ed 05 lds r23, 0x05ED ; 0x8005ed 2250e: 80 91 ee 05 lds r24, 0x05EE ; 0x8005ee 22512: 90 91 ef 05 lds r25, 0x05EF ; 0x8005ef 22516: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2251a: 9b 01 movw r18, r22 2251c: ac 01 movw r20, r24 2251e: c5 01 movw r24, r10 22520: b4 01 movw r22, r8 22522: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 22526: 4b 01 movw r8, r22 22528: 5c 01 movw r10, r24 2252a: 80 92 ec 05 sts 0x05EC, r8 ; 0x8005ec 2252e: 90 92 ed 05 sts 0x05ED, r9 ; 0x8005ed 22532: a0 92 ee 05 sts 0x05EE, r10 ; 0x8005ee 22536: b0 92 ef 05 sts 0x05EF, r11 ; 0x8005ef 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) 2253a: 2d 81 ldd r18, Y+5 ; 0x05 2253c: 3e 81 ldd r19, Y+6 ; 0x06 2253e: 4f 81 ldd r20, Y+7 ; 0x07 22540: 58 85 ldd r21, Y+8 ; 0x08 22542: 69 81 ldd r22, Y+1 ; 0x01 22544: 7a 81 ldd r23, Y+2 ; 0x02 22546: 8b 81 ldd r24, Y+3 ; 0x03 22548: 9c 81 ldd r25, Y+4 ; 0x04 2254a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2254e: a5 01 movw r20, r10 22550: 94 01 movw r18, r8 22552: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 22556: 4b 01 movw r8, r22 22558: 5c 01 movw r10, r24 if (pid_output > PID_MAX) { 2255a: 20 e0 ldi r18, 0x00 ; 0 2255c: 30 e0 ldi r19, 0x00 ; 0 2255e: 4f e7 ldi r20, 0x7F ; 127 22560: 53 e4 ldi r21, 0x43 ; 67 22562: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 22566: 20 e0 ldi r18, 0x00 ; 0 22568: 30 e0 ldi r19, 0x00 ; 0 2256a: 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) { 2256c: 18 16 cp r1, r24 2256e: 0c f0 brlt .+2 ; 0x22572 22570: 6d c1 rjmp .+730 ; 0x2284c if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 22572: c7 01 movw r24, r14 22574: b6 01 movw r22, r12 22576: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2257a: 18 16 cp r1, r24 2257c: 84 f4 brge .+32 ; 0x2259e 2257e: a7 01 movw r20, r14 22580: 96 01 movw r18, r12 22582: 6d 85 ldd r22, Y+13 ; 0x0d 22584: 79 85 ldd r23, Y+9 ; 0x09 22586: 81 2f mov r24, r17 22588: 90 2f mov r25, r16 2258a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2258e: 60 93 f0 05 sts 0x05F0, r22 ; 0x8005f0 22592: 70 93 f1 05 sts 0x05F1, r23 ; 0x8005f1 22596: 80 93 f2 05 sts 0x05F2, r24 ; 0x8005f2 2259a: 90 93 f3 05 sts 0x05F3, r25 ; 0x8005f3 pid_output=PID_MAX; 2259e: 81 2c mov r8, r1 225a0: 91 2c mov r9, r1 225a2: 3f e7 ldi r19, 0x7F ; 127 225a4: a3 2e mov r10, r19 225a6: 33 e4 ldi r19, 0x43 ; 67 225a8: 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; 225aa: 40 92 e8 05 sts 0x05E8, r4 ; 0x8005e8 225ae: 50 92 e9 05 sts 0x05E9, r5 ; 0x8005e9 225b2: 60 92 ea 05 sts 0x05EA, r6 ; 0x8005ea 225b6: 70 92 eb 05 sts 0x05EB, r7 ; 0x8005eb pid_output = PID_MAX; } #endif // Check if temperature is within the correct range if((current < maxttemp[e]) && (target != 0)) 225ba: 60 91 56 02 lds r22, 0x0256 ; 0x800256 <_ZL8maxttemp.lto_priv.472> 225be: 70 91 57 02 lds r23, 0x0257 ; 0x800257 <_ZL8maxttemp.lto_priv.472+0x1> 225c2: 07 2e mov r0, r23 225c4: 00 0c add r0, r0 225c6: 88 0b sbc r24, r24 225c8: 99 0b sbc r25, r25 225ca: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 225ce: 9b 01 movw r18, r22 225d0: ac 01 movw r20, r24 225d2: c3 01 movw r24, r6 225d4: b2 01 movw r22, r4 225d6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 225da: 87 ff sbrs r24, 7 225dc: 57 c1 rjmp .+686 ; 0x2288c 225de: 23 28 or r2, r3 225e0: 09 f4 brne .+2 ; 0x225e4 225e2: 54 c1 rjmp .+680 ; 0x2288c soft_pwm[e] = (int)pid_output >> 1; 225e4: c5 01 movw r24, r10 225e6: b4 01 movw r22, r8 225e8: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 225ec: 75 95 asr r23 225ee: 67 95 ror r22 225f0: 60 93 15 05 sts 0x0515, r22 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 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); 225f4: 20 91 16 06 lds r18, 0x0616 ; 0x800616 225f8: 30 91 17 06 lds r19, 0x0617 ; 0x800617 225fc: 3a 83 std Y+2, r19 ; 0x02 225fe: 29 83 std Y+1, r18 ; 0x01 22600: 40 90 18 06 lds r4, 0x0618 ; 0x800618 22604: 50 90 19 06 lds r5, 0x0619 ; 0x800619 22608: 60 90 1a 06 lds r6, 0x061A ; 0x80061a 2260c: 70 90 1b 06 lds r7, 0x061B ; 0x80061b #ifdef PIDTEMPBED pid_input = current; #ifndef PID_OPENLOOP pid_error_bed = target - pid_input; 22610: b9 01 movw r22, r18 22612: 33 0f add r19, r19 22614: 88 0b sbc r24, r24 22616: 99 0b sbc r25, r25 22618: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2261c: a3 01 movw r20, r6 2261e: 92 01 movw r18, r4 22620: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 22624: 6b 01 movw r12, r22 22626: 7c 01 movw r14, r24 pTerm_bed = cs.bedKp * pid_error_bed; 22628: 20 91 31 0e lds r18, 0x0E31 ; 0x800e31 2262c: 30 91 32 0e lds r19, 0x0E32 ; 0x800e32 22630: 40 91 33 0e lds r20, 0x0E33 ; 0x800e33 22634: 50 91 34 0e lds r21, 0x0E34 ; 0x800e34 22638: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2263c: 6d 83 std Y+5, r22 ; 0x05 2263e: 7e 83 std Y+6, r23 ; 0x06 22640: 8f 83 std Y+7, r24 ; 0x07 22642: 98 87 std Y+8, r25 ; 0x08 temp_iState_bed += pid_error_bed; 22644: 20 91 fd 05 lds r18, 0x05FD ; 0x8005fd 22648: 30 91 fe 05 lds r19, 0x05FE ; 0x8005fe 2264c: 40 91 ff 05 lds r20, 0x05FF ; 0x8005ff 22650: 50 91 00 06 lds r21, 0x0600 ; 0x800600 22654: c7 01 movw r24, r14 22656: b6 01 movw r22, r12 22658: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2265c: 5b 01 movw r10, r22 2265e: 8c 01 movw r16, r24 temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); 22660: 30 91 aa 04 lds r19, 0x04AA ; 0x8004aa <_ZL19temp_iState_min_bed.lto_priv.468> 22664: 3e 87 std Y+14, r19 ; 0x0e 22666: 80 91 ab 04 lds r24, 0x04AB ; 0x8004ab <_ZL19temp_iState_min_bed.lto_priv.468+0x1> 2266a: 8d 87 std Y+13, r24 ; 0x0d 2266c: 30 90 ac 04 lds r3, 0x04AC ; 0x8004ac <_ZL19temp_iState_min_bed.lto_priv.468+0x2> 22670: 20 90 ad 04 lds r2, 0x04AD ; 0x8004ad <_ZL19temp_iState_min_bed.lto_priv.468+0x3> 22674: 23 2f mov r18, r19 22676: 38 2f mov r19, r24 22678: 43 2d mov r20, r3 2267a: 52 2d mov r21, r2 2267c: b5 01 movw r22, r10 2267e: c8 01 movw r24, r16 22680: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 22684: 87 fd sbrc r24, 7 22686: 18 c0 rjmp .+48 ; 0x226b8 22688: 90 91 a6 04 lds r25, 0x04A6 ; 0x8004a6 <_ZL19temp_iState_max_bed.lto_priv.469> 2268c: 9e 87 std Y+14, r25 ; 0x0e 2268e: 20 91 a7 04 lds r18, 0x04A7 ; 0x8004a7 <_ZL19temp_iState_max_bed.lto_priv.469+0x1> 22692: 2d 87 std Y+13, r18 ; 0x0d 22694: 30 90 a8 04 lds r3, 0x04A8 ; 0x8004a8 <_ZL19temp_iState_max_bed.lto_priv.469+0x2> 22698: 20 90 a9 04 lds r2, 0x04A9 ; 0x8004a9 <_ZL19temp_iState_max_bed.lto_priv.469+0x3> 2269c: 29 2f mov r18, r25 2269e: 3d 85 ldd r19, Y+13 ; 0x0d 226a0: 43 2d mov r20, r3 226a2: 52 2d mov r21, r2 226a4: b5 01 movw r22, r10 226a6: c8 01 movw r24, r16 226a8: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 226ac: 18 16 cp r1, r24 226ae: 24 f0 brlt .+8 ; 0x226b8 226b0: ae 86 std Y+14, r10 ; 0x0e 226b2: bd 86 std Y+13, r11 ; 0x0d 226b4: 30 2e mov r3, r16 226b6: 21 2e mov r2, r17 226b8: 8e 85 ldd r24, Y+14 ; 0x0e 226ba: 9d 85 ldd r25, Y+13 ; 0x0d 226bc: a3 2d mov r26, r3 226be: b2 2d mov r27, r2 226c0: 80 93 fd 05 sts 0x05FD, r24 ; 0x8005fd 226c4: 90 93 fe 05 sts 0x05FE, r25 ; 0x8005fe 226c8: a0 93 ff 05 sts 0x05FF, r26 ; 0x8005ff 226cc: b0 93 00 06 sts 0x0600, r27 ; 0x800600 iTerm_bed = cs.bedKi * temp_iState_bed; 226d0: 20 91 35 0e lds r18, 0x0E35 ; 0x800e35 226d4: 30 91 36 0e lds r19, 0x0E36 ; 0x800e36 226d8: 40 91 37 0e lds r20, 0x0E37 ; 0x800e37 226dc: 50 91 38 0e lds r21, 0x0E38 ; 0x800e38 226e0: bc 01 movw r22, r24 226e2: 83 2d mov r24, r3 226e4: 92 2d mov r25, r2 226e6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 226ea: 69 87 std Y+9, r22 ; 0x09 226ec: 7a 87 std Y+10, r23 ; 0x0a 226ee: 8b 87 std Y+11, r24 ; 0x0b 226f0: 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); 226f2: 20 91 f9 05 lds r18, 0x05F9 ; 0x8005f9 226f6: 30 91 fa 05 lds r19, 0x05FA ; 0x8005fa 226fa: 40 91 fb 05 lds r20, 0x05FB ; 0x8005fb 226fe: 50 91 fc 05 lds r21, 0x05FC ; 0x8005fc 22702: c3 01 movw r24, r6 22704: b2 01 movw r22, r4 22706: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2270a: 20 91 39 0e lds r18, 0x0E39 ; 0x800e39 2270e: 30 91 3a 0e lds r19, 0x0E3A ; 0x800e3a 22712: 40 91 3b 0e lds r20, 0x0E3B ; 0x800e3b 22716: 50 91 3c 0e lds r21, 0x0E3C ; 0x800e3c 2271a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2271e: 20 ed ldi r18, 0xD0 ; 208 22720: 3c ec ldi r19, 0xCC ; 204 22722: 4c e4 ldi r20, 0x4C ; 76 22724: 5d e3 ldi r21, 0x3D ; 61 22726: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2272a: 4b 01 movw r8, r22 2272c: 5c 01 movw r10, r24 2272e: 23 e3 ldi r18, 0x33 ; 51 22730: 33 e3 ldi r19, 0x33 ; 51 22732: 43 e7 ldi r20, 0x73 ; 115 22734: 5f e3 ldi r21, 0x3F ; 63 22736: 60 91 f5 05 lds r22, 0x05F5 ; 0x8005f5 2273a: 70 91 f6 05 lds r23, 0x05F6 ; 0x8005f6 2273e: 80 91 f7 05 lds r24, 0x05F7 ; 0x8005f7 22742: 90 91 f8 05 lds r25, 0x05F8 ; 0x8005f8 22746: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2274a: 9b 01 movw r18, r22 2274c: ac 01 movw r20, r24 2274e: c5 01 movw r24, r10 22750: b4 01 movw r22, r8 22752: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 22756: 4b 01 movw r8, r22 22758: 5c 01 movw r10, r24 2275a: 80 92 f5 05 sts 0x05F5, r8 ; 0x8005f5 2275e: 90 92 f6 05 sts 0x05F6, r9 ; 0x8005f6 22762: a0 92 f7 05 sts 0x05F7, r10 ; 0x8005f7 22766: b0 92 f8 05 sts 0x05F8, r11 ; 0x8005f8 temp_dState_bed = pid_input; 2276a: 40 92 f9 05 sts 0x05F9, r4 ; 0x8005f9 2276e: 50 92 fa 05 sts 0x05FA, r5 ; 0x8005fa 22772: 60 92 fb 05 sts 0x05FB, r6 ; 0x8005fb 22776: 70 92 fc 05 sts 0x05FC, r7 ; 0x8005fc pid_output = pTerm_bed + iTerm_bed - dTerm_bed; 2277a: 29 85 ldd r18, Y+9 ; 0x09 2277c: 3a 85 ldd r19, Y+10 ; 0x0a 2277e: 4b 85 ldd r20, Y+11 ; 0x0b 22780: 5c 85 ldd r21, Y+12 ; 0x0c 22782: 6d 81 ldd r22, Y+5 ; 0x05 22784: 7e 81 ldd r23, Y+6 ; 0x06 22786: 8f 81 ldd r24, Y+7 ; 0x07 22788: 98 85 ldd r25, Y+8 ; 0x08 2278a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2278e: a5 01 movw r20, r10 22790: 94 01 movw r18, r8 22792: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 22796: 4b 01 movw r8, r22 22798: 5c 01 movw r10, r24 if (pid_output > MAX_BED_POWER) { 2279a: 20 e0 ldi r18, 0x00 ; 0 2279c: 30 e0 ldi r19, 0x00 ; 0 2279e: 4f e7 ldi r20, 0x7F ; 127 227a0: 53 e4 ldi r21, 0x43 ; 67 227a2: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 227a6: 20 e0 ldi r18, 0x00 ; 0 227a8: 30 e0 ldi r19, 0x00 ; 0 227aa: 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) { 227ac: 18 16 cp r1, r24 227ae: 0c f0 brlt .+2 ; 0x227b2 227b0: 70 c0 rjmp .+224 ; 0x22892 if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 227b2: c7 01 movw r24, r14 227b4: b6 01 movw r22, r12 227b6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 227ba: 18 16 cp r1, r24 227bc: 84 f4 brge .+32 ; 0x227de 227be: a7 01 movw r20, r14 227c0: 96 01 movw r18, r12 227c2: 6e 85 ldd r22, Y+14 ; 0x0e 227c4: 7d 85 ldd r23, Y+13 ; 0x0d 227c6: 83 2d mov r24, r3 227c8: 92 2d mov r25, r2 227ca: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 227ce: 60 93 fd 05 sts 0x05FD, r22 ; 0x8005fd 227d2: 70 93 fe 05 sts 0x05FE, r23 ; 0x8005fe 227d6: 80 93 ff 05 sts 0x05FF, r24 ; 0x8005ff 227da: 90 93 00 06 sts 0x0600, r25 ; 0x800600 pid_output=MAX_BED_POWER; 227de: 81 2c mov r8, r1 227e0: 91 2c mov r9, r1 227e2: 9f e7 ldi r25, 0x7F ; 127 227e4: a9 2e mov r10, r25 227e6: 93 e4 ldi r25, 0x43 ; 67 227e8: b9 2e mov r11, r25 #else pid_output = constrain(target, 0, MAX_BED_POWER); #endif //PID_OPENLOOP if(current < BED_MAXTEMP) 227ea: 20 e0 ldi r18, 0x00 ; 0 227ec: 30 e0 ldi r19, 0x00 ; 0 227ee: 4a ef ldi r20, 0xFA ; 250 227f0: 52 e4 ldi r21, 0x42 ; 66 227f2: c3 01 movw r24, r6 227f4: b2 01 movw r22, r4 227f6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 227fa: 87 ff sbrs r24, 7 227fc: 6d c0 rjmp .+218 ; 0x228d8 { soft_pwm_bed = (int)pid_output >> 1; 227fe: c5 01 movw r24, r10 22800: b4 01 movw r22, r8 22802: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 22806: 75 95 asr r23 22808: 67 95 ror r22 2280a: 60 93 1c 06 sts 0x061C, r22 ; 0x80061c soft_pwm_bed = 0; WRITE(HEATER_BED_PIN,LOW); } #endif //BED_LIMIT_SWITCHING if(target==0) 2280e: 89 81 ldd r24, Y+1 ; 0x01 22810: 9a 81 ldd r25, Y+2 ; 0x02 22812: 89 2b or r24, r25 22814: 11 f4 brne .+4 ; 0x2281a { soft_pwm_bed = 0; 22816: 10 92 1c 06 sts 0x061C, r1 ; 0x80061c 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); } 2281a: 2e 96 adiw r28, 0x0e ; 14 2281c: 0f b6 in r0, 0x3f ; 63 2281e: f8 94 cli 22820: de bf out 0x3e, r29 ; 62 22822: 0f be out 0x3f, r0 ; 63 22824: cd bf out 0x3d, r28 ; 61 22826: df 91 pop r29 22828: cf 91 pop r28 2282a: 1f 91 pop r17 2282c: 0f 91 pop r16 2282e: ff 90 pop r15 22830: ef 90 pop r14 22832: df 90 pop r13 22834: cf 90 pop r12 22836: bf 90 pop r11 22838: af 90 pop r10 2283a: 9f 90 pop r9 2283c: 8f 90 pop r8 2283e: 7f 90 pop r7 22840: 6f 90 pop r6 22842: 5f 90 pop r5 22844: 4f 90 pop r4 22846: 3f 90 pop r3 22848: 2f 90 pop r2 2284a: 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) { 2284c: c5 01 movw r24, r10 2284e: b4 01 movw r22, r8 22850: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 22854: 87 ff sbrs r24, 7 22856: a9 ce rjmp .-686 ; 0x225aa if (pid_error[e] < 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration 22858: 20 e0 ldi r18, 0x00 ; 0 2285a: 30 e0 ldi r19, 0x00 ; 0 2285c: a9 01 movw r20, r18 2285e: c7 01 movw r24, r14 22860: b6 01 movw r22, r12 22862: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 22866: 87 ff sbrs r24, 7 22868: a3 cd rjmp .-1210 ; 0x223b0 2286a: a7 01 movw r20, r14 2286c: 96 01 movw r18, r12 2286e: 6d 85 ldd r22, Y+13 ; 0x0d 22870: 79 85 ldd r23, Y+9 ; 0x09 22872: 81 2f mov r24, r17 22874: 90 2f mov r25, r16 22876: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2287a: 60 93 f0 05 sts 0x05F0, r22 ; 0x8005f0 2287e: 70 93 f1 05 sts 0x05F1, r23 ; 0x8005f1 22882: 80 93 f2 05 sts 0x05F2, r24 ; 0x8005f2 22886: 90 93 f3 05 sts 0x05F3, r25 ; 0x8005f3 2288a: 92 cd rjmp .-1244 ; 0x223b0 // 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; 2288c: 10 92 15 05 sts 0x0515, r1 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 22890: b1 ce rjmp .-670 ; 0x225f4 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){ 22892: c5 01 movw r24, r10 22894: b4 01 movw r22, r8 22896: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2289a: 87 ff sbrs r24, 7 2289c: a6 cf rjmp .-180 ; 0x227ea if (pid_error_bed < 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration 2289e: 20 e0 ldi r18, 0x00 ; 0 228a0: 30 e0 ldi r19, 0x00 ; 0 228a2: a9 01 movw r20, r18 228a4: c7 01 movw r24, r14 228a6: b6 01 movw r22, r12 228a8: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 228ac: 87 ff sbrs r24, 7 228ae: 10 c0 rjmp .+32 ; 0x228d0 228b0: a7 01 movw r20, r14 228b2: 96 01 movw r18, r12 228b4: 6e 85 ldd r22, Y+14 ; 0x0e 228b6: 7d 85 ldd r23, Y+13 ; 0x0d 228b8: 83 2d mov r24, r3 228ba: 92 2d mov r25, r2 228bc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 228c0: 60 93 fd 05 sts 0x05FD, r22 ; 0x8005fd 228c4: 70 93 fe 05 sts 0x05FE, r23 ; 0x8005fe 228c8: 80 93 ff 05 sts 0x05FF, r24 ; 0x8005ff 228cc: 90 93 00 06 sts 0x0600, r25 ; 0x800600 pid_output=0; 228d0: 81 2c mov r8, r1 228d2: 91 2c mov r9, r1 228d4: 54 01 movw r10, r8 228d6: 89 cf rjmp .-238 ; 0x227ea { soft_pwm_bed = (int)pid_output >> 1; } else { soft_pwm_bed = 0; 228d8: 10 92 1c 06 sts 0x061C, r1 ; 0x80061c 228dc: 98 cf rjmp .-208 ; 0x2280e 000228de : } static void setIsrTargetTemperatures() { for(uint8_t e=0;e 228e2: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 228e6: 90 93 1e 06 sts 0x061E, r25 ; 0x80061e 228ea: 80 93 1d 06 sts 0x061D, r24 ; 0x80061d target_temperature_bed_isr = target_temperature_bed; 228ee: 80 91 71 06 lds r24, 0x0671 ; 0x800671 228f2: 90 91 72 06 lds r25, 0x0672 ; 0x800672 228f6: 90 93 17 06 sts 0x0617, r25 ; 0x800617 228fa: 80 93 16 06 sts 0x0616, r24 ; 0x800616 } 228fe: 08 95 ret 00022900 : { // 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) 22900: 81 30 cpi r24, 0x01 ; 1 22902: 41 f1 breq .+80 ; 0x22954 22904: 20 f0 brcs .+8 ; 0x2290e 22906: 82 30 cpi r24, 0x02 ; 2 22908: 09 f4 brne .+2 ; 0x2290c 2290a: 45 c0 rjmp .+138 ; 0x22996 2290c: 08 95 ret { case X_AXIS: { enable_x(); 2290e: 17 98 cbi 0x02, 7 ; 2 uint8_t old_x_dir_pin = READ(X_DIR_PIN); 22910: 80 91 09 01 lds r24, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 22914: 81 70 andi r24, 0x01 ; 1 uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction; 22916: 91 e0 ldi r25, 0x01 ; 1 22918: 69 27 eor r22, r25 //setup new step if (new_x_dir_pin != old_x_dir_pin) { 2291a: 86 17 cp r24, r22 2291c: 59 f0 breq .+22 ; 0x22934 WRITE_NC(X_DIR_PIN, new_x_dir_pin); 2291e: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 22922: 66 23 and r22, r22 22924: 89 f0 breq .+34 ; 0x22948 22926: 91 60 ori r25, 0x01 ; 1 22928: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> #endif // busy wait __asm__ __volatile__ ( 2292c: eb e4 ldi r30, 0x4B ; 75 2292e: f0 e0 ldi r31, 0x00 ; 0 22930: 31 97 sbiw r30, 0x01 ; 1 22932: f1 f7 brne .-4 ; 0x22930 delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(X_AXIS); 22934: 91 e0 ldi r25, 0x01 ; 1 22936: 96 b9 out 0x06, r25 ; 6 #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); 22938: 88 23 and r24, r24 2293a: 41 f0 breq .+16 ; 0x2294c 2293c: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 22940: 81 60 ori r24, 0x01 ; 1 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); 22942: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> } break; default: break; } } 22946: 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); 22948: 9e 7f andi r25, 0xFE ; 254 2294a: ee cf rjmp .-36 ; 0x22928 #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); 2294c: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 22950: 8e 7f andi r24, 0xFE ; 254 22952: f7 cf rjmp .-18 ; 0x22942 } break; case Y_AXIS: { enable_y(); 22954: 16 98 cbi 0x02, 6 ; 2 uint8_t old_y_dir_pin = READ(Y_DIR_PIN); 22956: 90 91 09 01 lds r25, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 2295a: 81 e0 ldi r24, 0x01 ; 1 2295c: 29 2f mov r18, r25 2295e: 22 70 andi r18, 0x02 ; 2 22960: 91 ff sbrs r25, 1 22962: 80 e0 ldi r24, 0x00 ; 0 uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction; //setup new step if (new_y_dir_pin != old_y_dir_pin) { 22964: 86 17 cp r24, r22 22966: 59 f0 breq .+22 ; 0x2297e WRITE_NC(Y_DIR_PIN, new_y_dir_pin); 22968: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2296c: 66 23 and r22, r22 2296e: 79 f0 breq .+30 ; 0x2298e 22970: 82 60 ori r24, 0x02 ; 2 22972: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 22976: 8b e4 ldi r24, 0x4B ; 75 22978: 90 e0 ldi r25, 0x00 ; 0 2297a: 01 97 sbiw r24, 0x01 ; 1 2297c: f1 f7 brne .-4 ; 0x2297a delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(Y_AXIS); 2297e: 82 e0 ldi r24, 0x02 ; 2 22980: 86 b9 out 0x06, r24 ; 6 #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); 22982: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 22986: 22 23 and r18, r18 22988: 21 f0 breq .+8 ; 0x22992 2298a: 82 60 ori r24, 0x02 ; 2 2298c: da cf rjmp .-76 ; 0x22942 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); 2298e: 8d 7f andi r24, 0xFD ; 253 22990: f0 cf rjmp .-32 ; 0x22972 #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); 22992: 8d 7f andi r24, 0xFD ; 253 22994: d6 cf rjmp .-84 ; 0x22942 } break; case Z_AXIS: { enable_z(); 22996: 15 98 cbi 0x02, 5 ; 2 uint8_t old_z_dir_pin = READ(Z_DIR_PIN); 22998: 90 91 09 01 lds r25, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> 2299c: 81 e0 ldi r24, 0x01 ; 1 2299e: 29 2f mov r18, r25 229a0: 24 70 andi r18, 0x04 ; 4 229a2: 92 ff sbrs r25, 2 229a4: 80 e0 ldi r24, 0x00 ; 0 uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z; 229a6: 91 e0 ldi r25, 0x01 ; 1 229a8: 69 27 eor r22, r25 //setup new step if (new_z_dir_pin != old_z_dir_pin) { 229aa: 86 17 cp r24, r22 229ac: 59 f0 breq .+22 ; 0x229c4 WRITE_NC(Z_DIR_PIN, new_z_dir_pin); 229ae: 90 91 0b 01 lds r25, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 229b2: 66 23 and r22, r22 229b4: 91 f0 breq .+36 ; 0x229da 229b6: 94 60 ori r25, 0x04 ; 4 229b8: 90 93 0b 01 sts 0x010B, r25 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 229bc: eb e4 ldi r30, 0x4B ; 75 229be: f0 e0 ldi r31, 0x00 ; 0 229c0: 31 97 sbiw r30, 0x01 ; 1 229c2: f1 f7 brne .-4 ; 0x229c0 delayMicroseconds(STEPPER_SET_DIR_DELAY); } //perform step STEP_NC_HI(Z_AXIS); 229c4: 94 e0 ldi r25, 0x04 ; 4 229c6: 96 b9 out 0x06, r25 ; 6 STEPPER_MINIMUM_DELAY; STEP_NC_LO(Z_AXIS); //get old pin state back. if (new_z_dir_pin != old_z_dir_pin) { 229c8: 86 17 cp r24, r22 229ca: 09 f4 brne .+2 ; 0x229ce 229cc: bc cf rjmp .-136 ; 0x22946 WRITE_NC(Z_DIR_PIN, old_z_dir_pin); 229ce: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 229d2: 22 23 and r18, r18 229d4: 21 f0 breq .+8 ; 0x229de 229d6: 84 60 ori r24, 0x04 ; 4 229d8: b4 cf rjmp .-152 ; 0x22942 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); 229da: 9b 7f andi r25, 0xFB ; 251 229dc: ed cf rjmp .-38 ; 0x229b8 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); 229de: 8b 7f andi r24, 0xFB ; 251 229e0: b0 cf rjmp .-160 ; 0x22942 000229e2 : } } static void checkRx(void) { if (selectedSerialPort == 0) { 229e2: 80 91 38 05 lds r24, 0x0538 ; 0x800538 229e6: 81 11 cpse r24, r1 229e8: 25 c0 rjmp .+74 ; 0x22a34 if((M_UCSRxA & (1< 229ee: 87 ff sbrs r24, 7 229f0: 3d c0 rjmp .+122 ; 0x22a6c // Test for a framing error. if (M_UCSRxA & (1< 229f6: 84 ff sbrs r24, 4 229f8: 03 c0 rjmp .+6 ; 0x22a00 // 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); 229fa: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> 229fe: 08 95 ret } else { unsigned char c = M_UDRx; 22a00: 40 91 c6 00 lds r20, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; 22a04: 20 91 98 04 lds r18, 0x0498 ; 0x800498 22a08: 30 91 99 04 lds r19, 0x0499 ; 0x800499 22a0c: c9 01 movw r24, r18 22a0e: 01 96 adiw r24, 0x01 ; 1 22a10: 8f 77 andi r24, 0x7F ; 127 22a12: 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) { 22a14: 60 91 9a 04 lds r22, 0x049A ; 0x80049a 22a18: 70 91 9b 04 lds r23, 0x049B ; 0x80049b 22a1c: 86 17 cp r24, r22 22a1e: 97 07 cpc r25, r23 22a20: 29 f1 breq .+74 ; 0x22a6c // 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; 22a22: 28 5e subi r18, 0xE8 ; 232 22a24: 3b 4f sbci r19, 0xFB ; 251 22a26: f9 01 movw r30, r18 22a28: 40 83 st Z, r20 rx_buffer.head = i; 22a2a: 90 93 99 04 sts 0x0499, r25 ; 0x800499 22a2e: 80 93 98 04 sts 0x0498, r24 ; 0x800498 22a32: 1c c0 rjmp .+56 ; 0x22a6c UDR1 = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } } else { // if(selectedSerialPort == 1) { if((UCSR1A & (1< 22a38: 87 ff sbrs r24, 7 22a3a: 18 c0 rjmp .+48 ; 0x22a6c // Test for a framing error. if (UCSR1A & (1< 22a40: 84 ff sbrs r24, 4 22a42: 03 c0 rjmp .+6 ; 0x22a4a // 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); 22a44: 80 91 ce 00 lds r24, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> 22a48: 08 95 ret } else { unsigned char c = UDR1; 22a4a: 40 91 ce 00 lds r20, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE; 22a4e: 20 91 98 04 lds r18, 0x0498 ; 0x800498 22a52: 30 91 99 04 lds r19, 0x0499 ; 0x800499 22a56: c9 01 movw r24, r18 22a58: 01 96 adiw r24, 0x01 ; 1 22a5a: 8f 77 andi r24, 0x7F ; 127 22a5c: 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) { 22a5e: 60 91 9a 04 lds r22, 0x049A ; 0x80049a 22a62: 70 91 9b 04 lds r23, 0x049B ; 0x80049b 22a66: 68 17 cp r22, r24 22a68: 79 07 cpc r23, r25 22a6a: d9 f6 brne .-74 ; 0x22a22 M_UDRx = c; #endif //DEBUG_DUMP_TO_2ND_SERIAL } } } } 22a6c: 08 95 ret 00022a6e : static void Sound_DoSound_Alert(bool bOnce) { uint8_t nI,nMax; nMax=bOnce?1:3; 22a6e: 23 e0 ldi r18, 0x03 ; 3 22a70: 81 11 cpse r24, r1 22a72: 21 e0 ldi r18, 0x01 ; 1 for(nI=0;nI 22a86: 94 60 ori r25, 0x04 ; 4 22a88: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22a8c: 3f bf out 0x3f, r19 ; 63 22a8e: fb 01 movw r30, r22 22a90: 31 97 sbiw r30, 0x01 ; 1 22a92: f1 f7 brne .-4 ; 0x22a90 delayMicroseconds(200); WRITE(BEEPER,LOW); 22a94: 3f b7 in r19, 0x3f ; 63 22a96: f8 94 cli 22a98: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22a9c: 9b 7f andi r25, 0xFB ; 251 22a9e: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22aa2: 3f bf out 0x3f, r19 ; 63 22aa4: fa 01 movw r30, r20 22aa6: 31 97 sbiw r30, 0x01 ; 1 22aa8: f1 f7 brne .-4 ; 0x22aa6 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); } } 22ab0: 08 95 ret 00022ab2 : delayMicroseconds(75); } } static void Sound_DoSound_Echo(void) { 22ab2: 8a e0 ldi r24, 0x0A ; 10 22ab4: 2b e8 ldi r18, 0x8B ; 139 22ab6: 31 e0 ldi r19, 0x01 ; 1 uint8_t nI; for(nI=0;nI<10;nI++) { WRITE(BEEPER,HIGH); 22ab8: 4f b7 in r20, 0x3f ; 63 22aba: f8 94 cli 22abc: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22ac0: 94 60 ori r25, 0x04 ; 4 22ac2: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22ac6: 4f bf out 0x3f, r20 ; 63 22ac8: f9 01 movw r30, r18 22aca: 31 97 sbiw r30, 0x01 ; 1 22acc: f1 f7 brne .-4 ; 0x22aca delayMicroseconds(100); WRITE(BEEPER,LOW); 22ace: 4f b7 in r20, 0x3f ; 63 22ad0: f8 94 cli 22ad2: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22ad6: 9b 7f andi r25, 0xFB ; 251 22ad8: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 22adc: 4f bf out 0x3f, r20 ; 63 22ade: f9 01 movw r30, r18 22ae0: 31 97 sbiw r30, 0x01 ; 1 22ae2: f1 f7 brne .-4 ; 0x22ae0 22ae4: 81 50 subi r24, 0x01 ; 1 static void Sound_DoSound_Echo(void) { uint8_t nI; for(nI=0;nI<10;nI++) 22ae6: 41 f7 brne .-48 ; 0x22ab8 WRITE(BEEPER,HIGH); delayMicroseconds(100); WRITE(BEEPER,LOW); delayMicroseconds(100); } } 22ae8: 08 95 ret 00022aea : } //! @brief Send host action "pause" void lcd_pause_usb_print() { SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_PAUSE); 22aea: 88 ea ldi r24, 0xA8 ; 168 22aec: 9e e6 ldi r25, 0x6E ; 110 22aee: 0c 94 13 79 jmp 0xf226 ; 0xf226 00022af2 : MENU_END(); } void lcd_set_fan_check() { fans_check_enabled = !fans_check_enabled; 22af2: 60 91 38 02 lds r22, 0x0238 ; 0x800238 22af6: 81 e0 ldi r24, 0x01 ; 1 22af8: 68 27 eor r22, r24 22afa: 60 93 38 02 sts 0x0238, r22 ; 0x800238 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 22afe: 87 e8 ldi r24, 0x87 ; 135 22b00: 9f e0 ldi r25, 0x0F ; 15 22b02: 0f 94 34 dc call 0x3b868 ; 0x3b868 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. 22b06: 80 91 38 02 lds r24, 0x0238 ; 0x800238 22b0a: 81 11 cpse r24, r1 22b0c: 02 c0 rjmp .+4 ; 0x22b12 22b0e: 10 92 e4 03 sts 0x03E4, r1 ; 0x8003e4 #endif //FANCHECK } 22b12: 08 95 ret 00022b14 : * 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) { 22b14: af 92 push r10 22b16: bf 92 push r11 22b18: cf 92 push r12 22b1a: df 92 push r13 22b1c: ef 92 push r14 22b1e: ff 92 push r15 22b20: 0f 93 push r16 22b22: 1f 93 push r17 22b24: cf 93 push r28 22b26: df 93 push r29 22b28: 6c 01 movw r12, r24 const char *msgend = msg; bool multi_screen = false; lcd_frame_start(); 22b2a: 0e 94 2c 6e call 0xdc58 ; 0xdc58 * @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; 22b2e: e6 01 movw r28, r12 bool multi_screen = false; lcd_frame_start(); for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) { 22b30: 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; 22b32: e1 2c mov r14, r1 lcd_frame_start(); for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) { lcd_set_cursor(0, row); 22b34: 6f 2d mov r22, r15 22b36: 80 e0 ldi r24, 0x00 ; 0 22b38: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 // 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) 22b3c: c6 01 movw r24, r12 22b3e: 0f 94 f8 10 call 0x221f0 ; 0x221f0 22b42: 88 23 and r24, r24 22b44: 29 f0 breq .+10 ; 0x22b50 22b46: 8f ef ldi r24, 0xFF ; 255 22b48: c8 1a sub r12, r24 22b4a: d8 0a sbc r13, r24 22b4c: 09 f4 brne .+2 ; 0x22b50 22b4e: 49 c0 rjmp .+146 ; 0x22be2 22b50: c6 01 movw r24, r12 22b52: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> { // End of the message. break; } uint8_t linelen = min(strlen_P(msg), LCD_WIDTH); 22b56: 84 31 cpi r24, 0x14 ; 20 22b58: 91 05 cpc r25, r1 22b5a: 10 f0 brcs .+4 ; 0x22b60 22b5c: 84 e1 ldi r24, 0x14 ; 20 22b5e: 90 e0 ldi r25, 0x00 ; 0 const char *msgend2 = msg + linelen; 22b60: e6 01 movw r28, r12 22b62: c8 0f add r28, r24 22b64: d9 1f adc r29, r25 msgend = msgend2; if (row == 3 && linelen == LCD_WIDTH) { 22b66: e3 e0 ldi r30, 0x03 ; 3 22b68: fe 12 cpse r15, r30 22b6a: 0a c0 rjmp .+20 ; 0x22b80 22b6c: 84 31 cpi r24, 0x14 ; 20 22b6e: 41 f4 brne .+16 ; 0x22b80 // 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; 22b70: fe 01 movw r30, r28 22b72: 84 91 lpm r24, Z 22b74: e1 2c mov r14, r1 if (multi_screen) 22b76: 88 23 and r24, r24 22b78: 19 f0 breq .+6 ; 0x22b80 msgend = (msgend2 -= 2); 22b7a: 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; 22b7c: ee 24 eor r14, r14 22b7e: e3 94 inc r14 if (multi_screen) msgend = (msgend2 -= 2); } if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) { 22b80: fe 01 movw r30, r28 22b82: 84 91 lpm r24, Z 22b84: 88 23 and r24, r24 22b86: 09 f4 brne .+2 ; 0x22b8a 22b88: 40 c0 rjmp .+128 ; 0x22c0a 22b8a: ce 01 movw r24, r28 22b8c: 0f 94 f8 10 call 0x221f0 ; 0x221f0 22b90: 81 11 cpse r24, r1 22b92: 3b c0 rjmp .+118 ; 0x22c0a 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); 22b94: fe 01 movw r30, r28 22b96: 84 91 lpm r24, Z return c == '.' || c == ',' || c == ':'|| c == ';' || c == '?' || c == '!' || c == '/'; 22b98: 92 ed ldi r25, 0xD2 ; 210 22b9a: 98 0f add r25, r24 22b9c: 92 30 cpi r25, 0x02 ; 2 22b9e: a8 f1 brcs .+106 ; 0x22c0a 22ba0: 8c 32 cpi r24, 0x2C ; 44 22ba2: 99 f1 breq .+102 ; 0x22c0a 22ba4: 96 ec ldi r25, 0xC6 ; 198 22ba6: 98 0f add r25, r24 22ba8: 92 30 cpi r25, 0x02 ; 2 22baa: 78 f1 brcs .+94 ; 0x22c0a 22bac: 8f 33 cpi r24, 0x3F ; 63 22bae: 69 f1 breq .+90 ; 0x22c0a 22bb0: 81 32 cpi r24, 0x21 ; 33 22bb2: 59 f1 breq .+86 ; 0x22c0a 22bb4: 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)) 22bb6: c0 16 cp r12, r16 22bb8: d1 06 cpc r13, r17 22bba: 58 f4 brcc .+22 ; 0x22bd2 22bbc: 58 01 movw r10, r16 22bbe: f1 e0 ldi r31, 0x01 ; 1 22bc0: af 1a sub r10, r31 22bc2: b1 08 sbc r11, r1 22bc4: c5 01 movw r24, r10 22bc6: 0f 94 f8 10 call 0x221f0 ; 0x221f0 22bca: 81 11 cpse r24, r1 22bcc: 1d c0 rjmp .+58 ; 0x22c08 -- msgend; 22bce: 85 01 movw r16, r10 22bd0: f2 cf rjmp .-28 ; 0x22bb6 if (msgend == msg) 22bd2: c0 16 cp r12, r16 22bd4: d1 06 cpc r13, r17 22bd6: c9 f0 breq .+50 ; 0x22c0a 22bd8: 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) { 22bda: f3 94 inc r15 22bdc: 84 e0 ldi r24, 0x04 ; 4 22bde: f8 12 cpse r15, r24 22be0: a9 cf rjmp .-174 ; 0x22b34 } lcd_print(c); } } if (multi_screen) { 22be2: ee 20 and r14, r14 22be4: f9 f0 breq .+62 ; 0x22c24 // Display the double down arrow. lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]); 22be6: 48 e8 ldi r20, 0x88 ; 136 22be8: 63 e0 ldi r22, 0x03 ; 3 22bea: 83 e1 ldi r24, 0x13 ; 19 22bec: 0e 94 98 6e call 0xdd30 ; 0xdd30 } return multi_screen ? msgend : NULL; } 22bf0: ce 01 movw r24, r28 22bf2: df 91 pop r29 22bf4: cf 91 pop r28 22bf6: 1f 91 pop r17 22bf8: 0f 91 pop r16 22bfa: ff 90 pop r15 22bfc: ef 90 pop r14 22bfe: df 90 pop r13 22c00: cf 90 pop r12 22c02: bf 90 pop r11 22c04: af 90 pop r10 22c06: 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)) 22c08: 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) { 22c0a: cc 16 cp r12, r28 22c0c: dd 06 cpc r13, r29 22c0e: 28 f7 brcc .-54 ; 0x22bda char c = char(pgm_read_byte(msg)); 22c10: f6 01 movw r30, r12 22c12: 84 91 lpm r24, Z if (c == '\n') { 22c14: 8a 30 cpi r24, 0x0A ; 10 22c16: 09 f3 breq .-62 ; 0x22bda 22c18: 0e 94 27 6f call 0xde4e ; 0xde4e -- msgend; if (msgend == msg) // Found a single long word, which cannot be split. Just cut it. msgend = msgend2; } for (; msg < msgend; ++ msg) { 22c1c: ff ef ldi r31, 0xFF ; 255 22c1e: cf 1a sub r12, r31 22c20: df 0a sbc r13, r31 22c22: f3 cf rjmp .-26 ; 0x22c0a if (multi_screen) { // Display the double down arrow. lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]); } return multi_screen ? msgend : NULL; 22c24: d0 e0 ldi r29, 0x00 ; 0 22c26: c0 e0 ldi r28, 0x00 ; 0 22c28: e3 cf rjmp .-58 ; 0x22bf0 00022c2a : #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){ 22c2a: cf 93 push r28 22c2c: df 93 push r29 22c2e: cd b7 in r28, 0x3d ; 61 22c30: de b7 in r29, 0x3e ; 62 22c32: 2f 97 sbiw r28, 0x0f ; 15 22c34: 0f b6 in r0, 0x3f ; 63 22c36: f8 94 cli 22c38: de bf out 0x3e, r29 ; 62 22c3a: 0f be out 0x3f, r0 ; 63 22c3c: cd bf out 0x3d, r28 ; 61 22c3e: fc 01 movw r30, r24 22c40: de 01 movw r26, r28 22c42: 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; 22c44: 90 e0 ldi r25, 0x00 ; 0 22c46: 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); 22c48: 84 91 lpm r24, Z 22c4a: 41 e0 ldi r20, 0x01 ; 1 22c4c: 49 0f add r20, r25 if( ! b ) 22c4e: 88 23 and r24, r24 22c50: 29 f0 breq .+10 ; 0x22c5c break; dst[i] = b; 22c52: 8d 93 st X+, r24 22c54: 31 96 adiw r30, 0x01 ; 1 22c56: 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 22c58: 4d 30 cpi r20, 0x0D ; 13 22c5a: b1 f7 brne .-20 ; 0x22c48 uint8_t b = pgm_read_byte(ipgmLabel + i); if( ! b ) break; dst[i] = b; } dst[i] = ':'; // append the colon 22c5c: f9 01 movw r30, r18 22c5e: e9 0f add r30, r25 22c60: f1 1d adc r31, r1 22c62: 8a e3 ldi r24, 0x3A ; 58 22c64: 80 83 st Z, r24 ++i; 22c66: 9f 5f subi r25, 0xFF ; 255 22c68: f9 01 movw r30, r18 22c6a: e9 0f add r30, r25 22c6c: f1 1d adc r31, r1 for(; i < dstSize - 1; ++i) // fill the rest with spaces dst[i] = ' '; 22c6e: 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 22c70: 9e 30 cpi r25, 0x0E ; 14 22c72: 19 f0 breq .+6 ; 0x22c7a dst[i] = ' '; 22c74: 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 22c76: 9f 5f subi r25, 0xFF ; 255 22c78: fb cf rjmp .-10 ; 0x22c70 dst[i] = ' '; dst[dstSize-1] = '\0'; // terminate the string properly 22c7a: 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 22c7c: 7f 93 push r23 22c7e: 6f 93 push r22 22c80: 3f 93 push r19 22c82: 2f 93 push r18 22c84: 8d e6 ldi r24, 0x6D ; 109 22c86: 90 ea ldi r25, 0xA0 ; 160 22c88: 9f 93 push r25 22c8a: 8f 93 push r24 22c8c: 0e 94 51 6e call 0xdca2 ; 0xdca2 22c90: 0f 90 pop r0 22c92: 0f 90 pop r0 22c94: 0f 90 pop r0 22c96: 0f 90 pop r0 22c98: 0f 90 pop r0 22c9a: 0f 90 pop r0 } 22c9c: 2f 96 adiw r28, 0x0f ; 15 22c9e: 0f b6 in r0, 0x3f ; 63 22ca0: f8 94 cli 22ca2: de bf out 0x3e, r29 ; 62 22ca4: 0f be out 0x3f, r0 ; 63 22ca6: cd bf out 0x3d, r28 ; 61 22ca8: df 91 pop r29 22caa: cf 91 pop r28 22cac: 08 95 ret 00022cae : //! |Rear side [µm]: | MSG_BED_CORRECTION_REAR //! |Reset | MSG_BED_CORRECTION_RESET //! ---------------------- //! @endcode void lcd_adjust_bed(void) { 22cae: ef 92 push r14 22cb0: ff 92 push r15 22cb2: 0f 93 push r16 22cb4: 1f 93 push r17 _menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]); if (_md->status == 0) 22cb6: 80 91 b4 03 lds r24, 0x03B4 ; 0x8003b4 22cba: 81 11 cpse r24, r1 22cbc: 35 c0 rjmp .+106 ; 0x22d28 { // Menu was entered. if (eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1) 22cbe: 80 ec ldi r24, 0xC0 ; 192 22cc0: 9f e0 ldi r25, 0x0F ; 15 22cc2: 0f 94 10 dc call 0x3b820 ; 0x3b820 22cc6: 81 30 cpi r24, 0x01 ; 1 22cc8: 61 f5 brne .+88 ; 0x22d22 { _md->left = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_LEFT); 22cca: 8f eb ldi r24, 0xBF ; 191 22ccc: 9f e0 ldi r25, 0x0F ; 15 22cce: 0f 94 10 dc call 0x3b820 ; 0x3b820 22cd2: 08 2e mov r0, r24 22cd4: 00 0c add r0, r0 22cd6: 99 0b sbc r25, r25 22cd8: 90 93 b6 03 sts 0x03B6, r25 ; 0x8003b6 22cdc: 80 93 b5 03 sts 0x03B5, r24 ; 0x8003b5 _md->right = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_RIGHT); 22ce0: 8e eb ldi r24, 0xBE ; 190 22ce2: 9f e0 ldi r25, 0x0F ; 15 22ce4: 0f 94 10 dc call 0x3b820 ; 0x3b820 22ce8: 08 2e mov r0, r24 22cea: 00 0c add r0, r0 22cec: 99 0b sbc r25, r25 22cee: 90 93 b8 03 sts 0x03B8, r25 ; 0x8003b8 22cf2: 80 93 b7 03 sts 0x03B7, r24 ; 0x8003b7 _md->front = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_FRONT); 22cf6: 8d eb ldi r24, 0xBD ; 189 22cf8: 9f e0 ldi r25, 0x0F ; 15 22cfa: 0f 94 10 dc call 0x3b820 ; 0x3b820 22cfe: 08 2e mov r0, r24 22d00: 00 0c add r0, r0 22d02: 99 0b sbc r25, r25 22d04: 90 93 ba 03 sts 0x03BA, r25 ; 0x8003ba 22d08: 80 93 b9 03 sts 0x03B9, r24 ; 0x8003b9 _md->rear = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_REAR); 22d0c: 8c eb ldi r24, 0xBC ; 188 22d0e: 9f e0 ldi r25, 0x0F ; 15 22d10: 0f 94 10 dc call 0x3b820 ; 0x3b820 22d14: 08 2e mov r0, r24 22d16: 00 0c add r0, r0 22d18: 99 0b sbc r25, r25 22d1a: 90 93 bc 03 sts 0x03BC, r25 ; 0x8003bc 22d1e: 80 93 bb 03 sts 0x03BB, r24 ; 0x8003bb } _md->status = 1; 22d22: 81 e0 ldi r24, 0x01 ; 1 22d24: 80 93 b4 03 sts 0x03B4, r24 ; 0x8003b4 } MENU_BEGIN(); 22d28: 0f 94 8a d1 call 0x3a314 ; 0x3a314 22d2c: 10 92 11 05 sts 0x0511, r1 ; 0x800511 22d30: 80 91 11 05 lds r24, 0x0511 ; 0x800511 22d34: 84 30 cpi r24, 0x04 ; 4 22d36: 08 f0 brcs .+2 ; 0x22d3a 22d38: 6e c0 rjmp .+220 ; 0x22e16 22d3a: 10 92 14 05 sts 0x0514, r1 ; 0x800514 // leaving menu - this condition must be immediately before MENU_ITEM_BACK_P ON_MENU_LEAVE( 22d3e: 0f 94 0a d0 call 0x3a014 ; 0x3a014 22d42: 88 23 and r24, r24 22d44: e9 f0 breq .+58 ; 0x22d80 22d46: 60 91 b5 03 lds r22, 0x03B5 ; 0x8003b5 22d4a: 8f eb ldi r24, 0xBF ; 191 22d4c: 9f e0 ldi r25, 0x0F ; 15 22d4e: 0f 94 34 dc call 0x3b868 ; 0x3b868 22d52: 60 91 b9 03 lds r22, 0x03B9 ; 0x8003b9 22d56: 8d eb ldi r24, 0xBD ; 189 22d58: 9f e0 ldi r25, 0x0F ; 15 22d5a: 0f 94 34 dc call 0x3b868 ; 0x3b868 22d5e: 60 91 bb 03 lds r22, 0x03BB ; 0x8003bb 22d62: 8c eb ldi r24, 0xBC ; 188 22d64: 9f e0 ldi r25, 0x0F ; 15 22d66: 0f 94 34 dc call 0x3b868 ; 0x3b868 22d6a: 60 91 b7 03 lds r22, 0x03B7 ; 0x8003b7 22d6e: 8e eb ldi r24, 0xBE ; 190 22d70: 9f e0 ldi r25, 0x0F ; 15 22d72: 0f 94 34 dc call 0x3b868 ; 0x3b868 22d76: 61 e0 ldi r22, 0x01 ; 1 22d78: 80 ec ldi r24, 0xC0 ; 192 22d7a: 9f e0 ldi r25, 0x0F ; 15 22d7c: 0f 94 34 dc call 0x3b868 ; 0x3b868 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)); 22d80: 8f e4 ldi r24, 0x4F ; 79 22d82: 99 e4 ldi r25, 0x49 ; 73 22d84: 0e 94 44 72 call 0xe488 ; 0xe488 22d88: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_LEFT), &_md->left, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 22d8c: 8e e0 ldi r24, 0x0E ; 14 22d8e: 91 e5 ldi r25, 0x51 ; 81 22d90: 0e 94 44 72 call 0xe488 ; 0xe488 22d94: f1 2c mov r15, r1 22d96: e1 2c mov r14, r1 22d98: 04 e6 ldi r16, 0x64 ; 100 22d9a: 10 e0 ldi r17, 0x00 ; 0 22d9c: 2c e9 ldi r18, 0x9C ; 156 22d9e: 3f ef ldi r19, 0xFF ; 255 22da0: 40 e1 ldi r20, 0x10 ; 16 22da2: 65 eb ldi r22, 0xB5 ; 181 22da4: 73 e0 ldi r23, 0x03 ; 3 22da6: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_RIGHT), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 22daa: 8d ef ldi r24, 0xFD ; 253 22dac: 90 e5 ldi r25, 0x50 ; 80 22dae: 0e 94 44 72 call 0xe488 ; 0xe488 22db2: 2c e9 ldi r18, 0x9C ; 156 22db4: 3f ef ldi r19, 0xFF ; 255 22db6: 40 e1 ldi r20, 0x10 ; 16 22db8: 67 eb ldi r22, 0xB7 ; 183 22dba: 73 e0 ldi r23, 0x03 ; 3 22dbc: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_FRONT), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 22dc0: 8c ee ldi r24, 0xEC ; 236 22dc2: 90 e5 ldi r25, 0x50 ; 80 22dc4: 0e 94 44 72 call 0xe488 ; 0xe488 22dc8: 2c e9 ldi r18, 0x9C ; 156 22dca: 3f ef ldi r19, 0xFF ; 255 22dcc: 40 e1 ldi r20, 0x10 ; 16 22dce: 69 eb ldi r22, 0xB9 ; 185 22dd0: 73 e0 ldi r23, 0x03 ; 3 22dd2: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_REAR), &_md->rear, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX); 22dd6: 8b ed ldi r24, 0xDB ; 219 22dd8: 90 e5 ldi r25, 0x50 ; 80 22dda: 0e 94 44 72 call 0xe488 ; 0xe488 22dde: 2c e9 ldi r18, 0x9C ; 156 22de0: 3f ef ldi r19, 0xFF ; 255 22de2: 40 e1 ldi r20, 0x10 ; 16 22de4: 6b eb ldi r22, 0xBB ; 187 22de6: 73 e0 ldi r23, 0x03 ; 3 22de8: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_adjust_bed_reset); 22dec: 8f e9 ldi r24, 0x9F ; 159 22dee: 95 e4 ldi r25, 0x45 ; 69 22df0: 0e 94 44 72 call 0xe488 ; 0xe488 22df4: 62 e2 ldi r22, 0x22 ; 34 22df6: 79 e3 ldi r23, 0x39 ; 57 22df8: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_END(); 22dfc: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc _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(); 22e00: 80 91 11 05 lds r24, 0x0511 ; 0x800511 22e04: 8f 5f subi r24, 0xFF ; 255 22e06: 80 93 11 05 sts 0x0511, r24 ; 0x800511 22e0a: 80 91 13 05 lds r24, 0x0513 ; 0x800513 22e0e: 8f 5f subi r24, 0xFF ; 255 22e10: 80 93 13 05 sts 0x0513, r24 ; 0x800513 22e14: 8d cf rjmp .-230 ; 0x22d30 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(); } 22e16: 1f 91 pop r17 22e18: 0f 91 pop r16 22e1a: ff 90 pop r15 22e1c: ef 90 pop r14 22e1e: 08 95 ret 00022e20 : } } #endif //MMU_HAS_CUTTER bool shouldPreheatOnlyNozzle() { uint8_t eeprom_setting = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT); 22e20: 87 ea ldi r24, 0xA7 ; 167 22e22: 9c e0 ldi r25, 0x0C ; 12 22e24: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (eeprom_setting != 0) 22e28: 81 11 cpse r24, r1 22e2a: 05 c0 rjmp .+10 ; 0x22e36 return false; switch(eFilamentAction) { 22e2c: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 22e30: 81 50 subi r24, 0x01 ; 1 22e32: 88 30 cpi r24, 0x08 ; 8 22e34: 10 f0 brcs .+4 ; 0x22e3a #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; 22e36: 80 e0 ldi r24, 0x00 ; 0 22e38: 08 95 ret case FilamentAction::MmuLoad: case FilamentAction::MmuUnLoad: case FilamentAction::MmuLoadingTest: case FilamentAction::MmuEject: case FilamentAction::MmuCut: return true; 22e3a: 81 e0 ldi r24, 0x01 ; 1 default: return false; } } 22e3c: 08 95 ret 00022e3e : } #ifdef MMU_HAS_CUTTER void lcd_cutter_enabled() { if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED)) 22e3e: 8e ec ldi r24, 0xCE ; 206 22e40: 9e e0 ldi r25, 0x0E ; 14 22e42: 0f 94 10 dc call 0x3b820 ; 0x3b820 22e46: 60 e0 ldi r22, 0x00 ; 0 22e48: 81 30 cpi r24, 0x01 ; 1 22e4a: 09 f0 breq .+2 ; 0x22e4e 22e4c: 61 e0 ldi r22, 0x01 ; 1 22e4e: 8e ec ldi r24, 0xCE ; 206 22e50: 9e e0 ldi r25, 0x0E ; 14 22e52: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 00022e56 : } } void SpoolJoin::toggleSpoolJoin() { if (eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Disabled) 22e56: 86 ed ldi r24, 0xD6 ; 214 22e58: 9e e0 ldi r25, 0x0E ; 14 22e5a: 0f 94 10 dc call 0x3b820 ; 0x3b820 22e5e: 61 e0 ldi r22, 0x01 ; 1 22e60: 82 30 cpi r24, 0x02 ; 2 22e62: 09 f0 breq .+2 ; 0x22e66 22e64: 62 e0 ldi r22, 0x02 ; 2 22e66: 86 ed ldi r24, 0xD6 ; 214 22e68: 9e e0 ldi r25, 0x0E ; 14 22e6a: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 00022e6e : } _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(); 22e6e: 0e 94 30 76 call 0xec60 ; 0xec60 _menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]); _md->status = 0; 22e72: 10 92 b4 03 sts 0x03B4, r1 ; 0x8003b4 } 22e76: 08 95 ret 00022e78 : } #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)); 22e78: 8a eb ldi r24, 0xBA ; 186 22e7a: 9f e4 ldi r25, 0x4F ; 79 22e7c: 0e 94 44 72 call 0xe488 ; 0xe488 22e80: 0f 94 8a 15 call 0x22b14 ; 0x22b14 menu_back_if_clicked(); 22e84: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00022e88 : //! | | //! | | //! ---------------------- //! @endcode void lcd_menu_extruder_info() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()") { 22e88: df 92 push r13 22e8a: ef 92 push r14 22e8c: ff 92 push r15 22e8e: 0f 93 push r16 22e90: 1f 93 push r17 22e92: cf 93 push r28 22e94: df 93 push r29 22e96: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 22e9a: 0e 94 a4 6e call 0xdd48 ; 0xdd48 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] ); 22e9e: c7 ec ldi r28, 0xC7 ; 199 22ea0: d3 e0 ldi r29, 0x03 ; 3 22ea2: 8a 81 ldd r24, Y+2 ; 0x02 22ea4: 9b 81 ldd r25, Y+3 ; 0x03 22ea6: 2c e3 ldi r18, 0x3C ; 60 22ea8: f2 2e mov r15, r18 22eaa: f8 9e mul r15, r24 22eac: 80 01 movw r16, r0 22eae: f9 9e mul r15, r25 22eb0: 10 0d add r17, r0 22eb2: 11 24 eor r1, r1 22eb4: 86 e8 ldi r24, 0x86 ; 134 22eb6: 98 e4 ldi r25, 0x48 ; 72 22eb8: 0e 94 44 72 call 0xe488 ; 0xe488 22ebc: e8 2e mov r14, r24 22ebe: d9 2e mov r13, r25 22ec0: 88 81 ld r24, Y 22ec2: 99 81 ldd r25, Y+1 ; 0x01 22ec4: f8 9e mul r15, r24 22ec6: e0 01 movw r28, r0 22ec8: f9 9e mul r15, r25 22eca: d0 0d add r29, r0 22ecc: 11 24 eor r1, r1 22ece: 83 e9 ldi r24, 0x93 ; 147 22ed0: 98 e4 ldi r25, 0x48 ; 72 22ed2: 0e 94 44 72 call 0xe488 ; 0xe488 22ed6: 1f 93 push r17 22ed8: 0f 93 push r16 22eda: df 92 push r13 22edc: ef 92 push r14 22ede: df 93 push r29 22ee0: cf 93 push r28 22ee2: 9f 93 push r25 22ee4: 8f 93 push r24 22ee6: 81 ed ldi r24, 0xD1 ; 209 22ee8: 9f e9 ldi r25, 0x9F ; 159 22eea: 9f 93 push r25 22eec: 8f 93 push r24 22eee: 0e 94 51 6e call 0xdca2 ; 0xdca2 menu_back_if_clicked(); 22ef2: 8d b7 in r24, 0x3d ; 61 22ef4: 9e b7 in r25, 0x3e ; 62 22ef6: 0a 96 adiw r24, 0x0a ; 10 22ef8: 0f b6 in r0, 0x3f ; 63 22efa: f8 94 cli 22efc: 9e bf out 0x3e, r25 ; 62 22efe: 0f be out 0x3f, r0 ; 63 22f00: 8d bf out 0x3d, r24 ; 61 } 22f02: df 91 pop r29 22f04: cf 91 pop r28 22f06: 1f 91 pop r17 22f08: 0f 91 pop r16 22f0a: ff 90 pop r15 22f0c: ef 90 pop r14 22f0e: 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(); 22f10: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00022f14 : //! | PINDA: 000D| MSG_PINDA c=14 //! ---------------------- //! D - Degree sysmbol LCD_STR_DEGREE //! @endcode static void lcd_menu_temperatures() { 22f14: cf 92 push r12 22f16: df 92 push r13 22f18: ef 92 push r14 22f1a: ff 92 push r15 22f1c: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 22f20: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_menu_temperatures_line( _T(MSG_NOZZLE), (int)current_temperature[0] ); 22f24: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 22f28: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 22f2c: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 22f30: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 22f34: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 22f38: 6b 01 movw r12, r22 22f3a: 84 eb ldi r24, 0xB4 ; 180 22f3c: 93 e4 ldi r25, 0x43 ; 67 22f3e: 0e 94 44 72 call 0xe488 ; 0xe488 22f42: b6 01 movw r22, r12 22f44: 0f 94 15 16 call 0x22c2a ; 0x22c2a lcd_menu_temperatures_line( _T(MSG_BED), (int)current_temperature_bed ); 22f48: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 22f4c: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 22f50: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 22f54: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 22f58: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 22f5c: 6b 01 movw r12, r22 22f5e: 89 e9 ldi r24, 0x99 ; 153 22f60: 93 e4 ldi r25, 0x43 ; 67 22f62: 0e 94 44 72 call 0xe488 ; 0xe488 22f66: b6 01 movw r22, r12 22f68: 0f 94 15 16 call 0x22c2a ; 0x22c2a #ifdef AMBIENT_THERMISTOR lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient ); 22f6c: 60 91 55 06 lds r22, 0x0655 ; 0x800655 22f70: 70 91 56 06 lds r23, 0x0656 ; 0x800656 22f74: 80 91 57 06 lds r24, 0x0657 ; 0x800657 22f78: 90 91 58 06 lds r25, 0x0658 ; 0x800658 22f7c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 22f80: 6b 01 movw r12, r22 22f82: 85 e5 ldi r24, 0x55 ; 85 22f84: 9e e4 ldi r25, 0x4E ; 78 22f86: 0e 94 44 72 call 0xe488 ; 0xe488 22f8a: b6 01 movw r22, r12 22f8c: 0f 94 15 16 call 0x22c2a ; 0x22c2a #endif //AMBIENT_THERMISTOR #ifdef PINDA_THERMISTOR lcd_menu_temperatures_line(MSG_PINDA, (int)current_temperature_pinda ); ////MSG_PINDA 22f90: 60 91 97 03 lds r22, 0x0397 ; 0x800397 22f94: 70 91 98 03 lds r23, 0x0398 ; 0x800398 22f98: 80 91 99 03 lds r24, 0x0399 ; 0x800399 22f9c: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 22fa0: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 22fa4: 88 e0 ldi r24, 0x08 ; 8 22fa6: 9a e6 ldi r25, 0x6A ; 106 22fa8: 0f 94 15 16 call 0x22c2a ; 0x22c2a #endif //PINDA_THERMISTOR menu_back_if_clicked(); } 22fac: ff 90 pop r15 22fae: ef 90 pop r14 22fb0: df 90 pop r13 22fb2: 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(); 22fb4: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00022fb8 : //! | Bed: 00.0V | c=12 //! | IR : 00.0V | c=12 optional //! ---------------------- //! @endcode static void lcd_menu_voltages() { 22fb8: cf 92 push r12 22fba: df 92 push r13 22fbc: ef 92 push r14 22fbe: ff 92 push r15 22fc0: 0f 93 push r16 22fc2: 1f 93 push r17 22fc4: cf 93 push r28 22fc6: df 93 push r29 22fc8: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout float volt_pwr = VOLT_DIV_REF * ((float)current_voltage_raw_pwr / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC; 22fcc: 60 91 5b 06 lds r22, 0x065B ; 0x80065b 22fd0: 70 91 5c 06 lds r23, 0x065C ; 0x80065c 22fd4: 07 2e mov r0, r23 22fd6: 00 0c add r0, r0 22fd8: 88 0b sbc r24, r24 22fda: 99 0b sbc r25, r25 22fdc: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 22fe0: 20 e0 ldi r18, 0x00 ; 0 22fe2: 30 ec ldi r19, 0xC0 ; 192 22fe4: 4f e7 ldi r20, 0x7F ; 127 22fe6: 56 e4 ldi r21, 0x46 ; 70 22fe8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 22fec: 20 e0 ldi r18, 0x00 ; 0 22fee: 30 e0 ldi r19, 0x00 ; 0 22ff0: 40 ea ldi r20, 0xA0 ; 160 22ff2: 50 e4 ldi r21, 0x40 ; 64 22ff4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 22ff8: 27 ed ldi r18, 0xD7 ; 215 22ffa: 30 e3 ldi r19, 0x30 ; 48 22ffc: 44 e4 ldi r20, 0x44 ; 68 22ffe: 5e e3 ldi r21, 0x3E ; 62 23000: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 23004: eb 01 movw r28, r22 23006: 18 2f mov r17, r24 23008: 09 2f mov r16, r25 float volt_bed = VOLT_DIV_REF * ((float)current_voltage_raw_bed / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC; 2300a: 60 91 59 06 lds r22, 0x0659 ; 0x800659 2300e: 70 91 5a 06 lds r23, 0x065A ; 0x80065a 23012: 07 2e mov r0, r23 23014: 00 0c add r0, r0 23016: 88 0b sbc r24, r24 23018: 99 0b sbc r25, r25 2301a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2301e: 20 e0 ldi r18, 0x00 ; 0 23020: 30 ec ldi r19, 0xC0 ; 192 23022: 4f e7 ldi r20, 0x7F ; 127 23024: 56 e4 ldi r21, 0x46 ; 70 23026: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2302a: 20 e0 ldi r18, 0x00 ; 0 2302c: 30 e0 ldi r19, 0x00 ; 0 2302e: 40 ea ldi r20, 0xA0 ; 160 23030: 50 e4 ldi r21, 0x40 ; 64 23032: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 23036: 27 ed ldi r18, 0xD7 ; 215 23038: 30 e3 ldi r19, 0x30 ; 48 2303a: 44 e4 ldi r20, 0x44 ; 68 2303c: 5e e3 ldi r21, 0x3E ; 62 2303e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 23042: f6 2e mov r15, r22 23044: e7 2e mov r14, r23 23046: d8 2e mov r13, r24 23048: c9 2e mov r12, r25 lcd_home(); 2304a: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(PSTR(" PWR: %4.1fV\n" " BED: %4.1fV"), volt_pwr, volt_bed); 2304e: cf 92 push r12 23050: df 92 push r13 23052: ef 92 push r14 23054: ff 92 push r15 23056: 0f 93 push r16 23058: 1f 93 push r17 2305a: df 93 push r29 2305c: cf 93 push r28 2305e: 87 e7 ldi r24, 0x77 ; 119 23060: 90 ea ldi r25, 0xA0 ; 160 23062: 9f 93 push r25 23064: 8f 93 push r24 23066: 0e 94 51 6e call 0xdca2 ; 0xdca2 #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) lcd_printf_P(PSTR("\n IR : %3.1fV"), Raw2Voltage(fsensor.getVoltRaw())); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) menu_back_if_clicked(); 2306a: 8d b7 in r24, 0x3d ; 61 2306c: 9e b7 in r25, 0x3e ; 62 2306e: 0a 96 adiw r24, 0x0a ; 10 23070: 0f b6 in r0, 0x3f ; 63 23072: f8 94 cli 23074: 9e bf out 0x3e, r25 ; 62 23076: 0f be out 0x3f, r0 ; 63 23078: 8d bf out 0x3d, r24 ; 61 } 2307a: df 91 pop r29 2307c: cf 91 pop r28 2307e: 1f 91 pop r17 23080: 0f 91 pop r16 23082: ff 90 pop r15 23084: ef 90 pop r14 23086: df 90 pop r13 23088: cf 90 pop r12 lcd_home(); lcd_printf_P(PSTR(" PWR: %4.1fV\n" " BED: %4.1fV"), volt_pwr, volt_bed); #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) lcd_printf_P(PSTR("\n IR : %3.1fV"), Raw2Voltage(fsensor.getVoltRaw())); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG) menu_back_if_clicked(); 2308a: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0002308e : //! | Crash X 000 Y 000| MSG_CRASH c=7 //! ---------------------- //! @endcode //! @todo leptun refactor this piece of code please static void lcd_menu_fails_stats_print() { 2308e: af 92 push r10 23090: bf 92 push r11 23092: cf 92 push r12 23094: df 92 push r13 23096: ef 92 push r14 23098: ff 92 push r15 2309a: 0f 93 push r16 2309c: 1f 93 push r17 2309e: cf 93 push r28 230a0: df 93 push r29 230a2: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout uint8_t power = eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT); 230a6: 84 e6 ldi r24, 0x64 ; 100 230a8: 9f e0 ldi r25, 0x0F ; 15 230aa: 0f 94 10 dc call 0x3b820 ; 0x3b820 230ae: 18 2f mov r17, r24 uint8_t filam = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT); 230b0: 85 e6 ldi r24, 0x65 ; 101 230b2: 9f e0 ldi r25, 0x0F ; 15 230b4: 0f 94 10 dc call 0x3b820 ; 0x3b820 230b8: e8 2e mov r14, r24 uint8_t crashX = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X); 230ba: 86 e6 ldi r24, 0x66 ; 102 230bc: 9f e0 ldi r25, 0x0F ; 15 230be: 0f 94 10 dc call 0x3b820 ; 0x3b820 230c2: b8 2e mov r11, r24 uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y); 230c4: 88 e6 ldi r24, 0x68 ; 104 230c6: 9f e0 ldi r25, 0x0F ; 15 230c8: 0f 94 10 dc call 0x3b820 ; 0x3b820 230cc: a8 2e mov r10, r24 lcd_home(); 230ce: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(failStatsFmt, 230d2: 88 e3 ldi r24, 0x38 ; 56 230d4: 9e e4 ldi r25, 0x4E ; 78 230d6: 0e 94 44 72 call 0xe488 ; 0xe488 230da: d8 2e mov r13, r24 230dc: c9 2e mov r12, r25 230de: 89 e2 ldi r24, 0x29 ; 41 230e0: 9e e4 ldi r25, 0x4E ; 78 230e2: 0e 94 44 72 call 0xe488 ; 0xe488 230e6: 08 2f mov r16, r24 230e8: f9 2e mov r15, r25 230ea: 88 e1 ldi r24, 0x18 ; 24 230ec: 9e e4 ldi r25, 0x4E ; 78 230ee: 0e 94 44 72 call 0xe488 ; 0xe488 230f2: ec 01 movw r28, r24 230f4: 82 e0 ldi r24, 0x02 ; 2 230f6: 9e e4 ldi r25, 0x4E ; 78 230f8: 0e 94 44 72 call 0xe488 ; 0xe488 230fc: 1f 92 push r1 230fe: af 92 push r10 23100: 1f 92 push r1 23102: bf 92 push r11 23104: cf 92 push r12 23106: df 92 push r13 23108: 1f 92 push r1 2310a: ef 92 push r14 2310c: ff 92 push r15 2310e: 0f 93 push r16 23110: 1f 92 push r1 23112: 1f 93 push r17 23114: df 93 push r29 23116: cf 93 push r28 23118: 9f 93 push r25 2311a: 8f 93 push r24 2311c: 88 e3 ldi r24, 0x38 ; 56 2311e: 90 ea ldi r25, 0xA0 ; 160 23120: 9f 93 push r25 23122: 8f 93 push r24 23124: 0e 94 51 6e call 0xdca2 ; 0xdca2 _T(MSG_LAST_PRINT_FAILURES), _T(MSG_POWER_FAILURES), power, _T(MSG_FIL_RUNOUTS), filam, _T(MSG_CRASH), crashX, crashY); menu_back_if_clicked(); 23128: 8d b7 in r24, 0x3d ; 61 2312a: 9e b7 in r25, 0x3e ; 62 2312c: 42 96 adiw r24, 0x12 ; 18 2312e: 0f b6 in r0, 0x3f ; 63 23130: f8 94 cli 23132: 9e bf out 0x3e, r25 ; 62 23134: 0f be out 0x3f, r0 ; 63 23136: 8d bf out 0x3d, r24 ; 61 } 23138: df 91 pop r29 2313a: cf 91 pop r28 2313c: 1f 91 pop r17 2313e: 0f 91 pop r16 23140: ff 90 pop r15 23142: ef 90 pop r14 23144: df 90 pop r13 23146: cf 90 pop r12 23148: bf 90 pop r11 2314a: af 90 pop r10 lcd_printf_P(failStatsFmt, _T(MSG_LAST_PRINT_FAILURES), _T(MSG_POWER_FAILURES), power, _T(MSG_FIL_RUNOUTS), filam, _T(MSG_CRASH), crashX, crashY); menu_back_if_clicked(); 2314c: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00023150 : //! | 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() { 23150: cf 92 push r12 23152: df 92 push r13 23154: ef 92 push r14 23156: ff 92 push r15 23158: 0f 93 push r16 2315a: 1f 93 push r17 2315c: cf 93 push r28 2315e: df 93 push r29 23160: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 23164: 0e 94 a4 6e call 0xdd48 ; 0xdd48 " %-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) )); 23168: 8f ec ldi r24, 0xCF ; 207 2316a: 9e e0 ldi r25, 0x0E ; 14 2316c: 0f 94 10 dc call 0x3b820 ; 0x3b820 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_print() { lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); lcd_printf_P( 23170: 90 e0 ldi r25, 0x00 ; 0 23172: 0f 94 07 11 call 0x2220e ; 0x2220e 23176: d8 2e mov r13, r24 23178: c9 2e mov r12, r25 2317a: 8b eb ldi r24, 0xBB ; 187 2317c: 9d e4 ldi r25, 0x4D ; 77 2317e: 0e 94 44 72 call 0xe488 ; 0xe488 23182: f8 2e mov r15, r24 23184: 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) ), 23186: 82 ed ldi r24, 0xD2 ; 210 23188: 9e e0 ldi r25, 0x0E ; 14 2318a: 0f 94 10 dc call 0x3b820 ; 0x3b820 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu_print() { lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); lcd_printf_P( 2318e: 90 e0 ldi r25, 0x00 ; 0 23190: 0f 94 07 11 call 0x2220e ; 0x2220e 23194: 18 2f mov r17, r24 23196: 09 2f mov r16, r25 23198: 8f ea ldi r24, 0xAF ; 175 2319a: 9d e4 ldi r25, 0x4D ; 77 2319c: 0e 94 44 72 call 0xe488 ; 0xe488 231a0: ec 01 movw r28, r24 231a2: 82 e0 ldi r24, 0x02 ; 2 231a4: 9e e4 ldi r25, 0x4E ; 78 231a6: 0e 94 44 72 call 0xe488 ; 0xe488 231aa: cf 92 push r12 231ac: df 92 push r13 231ae: ef 92 push r14 231b0: ff 92 push r15 231b2: 0f 93 push r16 231b4: 1f 93 push r17 231b6: df 93 push r29 231b8: cf 93 push r28 231ba: 9f 93 push r25 231bc: 8f 93 push r24 231be: 8c ee ldi r24, 0xEC ; 236 231c0: 9f e9 ldi r25, 0x9F ; 159 231c2: 9f 93 push r25 231c4: 8f 93 push r24 231c6: 0e 94 51 6e call 0xdca2 ; 0xdca2 " %-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(); 231ca: 8d b7 in r24, 0x3d ; 61 231cc: 9e b7 in r25, 0x3e ; 62 231ce: 0c 96 adiw r24, 0x0c ; 12 231d0: 0f b6 in r0, 0x3f ; 63 231d2: f8 94 cli 231d4: 9e bf out 0x3e, r25 ; 62 231d6: 0f be out 0x3f, r0 ; 63 231d8: 8d bf out 0x3d, r24 ; 61 } 231da: df 91 pop r29 231dc: cf 91 pop r28 231de: 1f 91 pop r17 231e0: 0f 91 pop r16 231e2: ff 90 pop r15 231e4: ef 90 pop r14 231e6: df 90 pop r13 231e8: 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(); 231ea: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 000231ee : //! | Y: 000 | //! | | //! ---------------------- //! @endcode static void lcd_menu_belt_status() { 231ee: 0f 93 push r16 231f0: 1f 93 push r17 231f2: cf 93 push r28 231f4: df 93 push r29 lcd_home(); 231f6: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(PSTR("%S\n" " X %d\n" " Y %d"), _T(MSG_BELT_STATUS), eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_X)), eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_Y))); 231fa: 8b e5 ldi r24, 0x5B ; 91 231fc: 9f e0 ldi r25, 0x0F ; 15 231fe: 0f 94 1e dc call 0x3b83c ; 0x3b83c 23202: 18 2f mov r17, r24 23204: 09 2f mov r16, r25 23206: 8d e5 ldi r24, 0x5D ; 93 23208: 9f e0 ldi r25, 0x0F ; 15 2320a: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2320e: ec 01 movw r28, r24 23210: 89 e7 ldi r24, 0x79 ; 121 23212: 9e e4 ldi r25, 0x4E ; 78 23214: 0e 94 44 72 call 0xe488 ; 0xe488 23218: 0f 93 push r16 2321a: 1f 93 push r17 2321c: df 93 push r29 2321e: cf 93 push r28 23220: 9f 93 push r25 23222: 8f 93 push r24 23224: 8b e9 ldi r24, 0x9B ; 155 23226: 90 ea ldi r25, 0xA0 ; 160 23228: 9f 93 push r25 2322a: 8f 93 push r24 2322c: 0e 94 51 6e call 0xdca2 ; 0xdca2 menu_back_if_clicked(); 23230: 8d b7 in r24, 0x3d ; 61 23232: 9e b7 in r25, 0x3e ; 62 23234: 08 96 adiw r24, 0x08 ; 8 23236: 0f b6 in r0, 0x3f ; 63 23238: f8 94 cli 2323a: 9e bf out 0x3e, r25 ; 62 2323c: 0f be out 0x3f, r0 ; 63 2323e: 8d bf out 0x3d, r24 ; 61 } 23240: df 91 pop r29 23242: cf 91 pop r28 23244: 1f 91 pop r17 23246: 0f 91 pop r16 //! @endcode static void lcd_menu_belt_status() { lcd_home(); lcd_printf_P(PSTR("%S\n" " X %d\n" " Y %d"), _T(MSG_BELT_STATUS), eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_X)), eeprom_read_word((uint16_t*)(EEPROM_BELTSTATUS_Y))); menu_back_if_clicked(); 23248: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0002324c : //! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15 //! | Crash X:000 Y:000| MSG_CRASH c=7 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_total() { 2324c: 6f 92 push r6 2324e: 7f 92 push r7 23250: 8f 92 push r8 23252: 9f 92 push r9 23254: af 92 push r10 23256: bf 92 push r11 23258: cf 92 push r12 2325a: df 92 push r13 2325c: ef 92 push r14 2325e: ff 92 push r15 23260: 0f 93 push r16 23262: 1f 93 push r17 23264: cf 93 push r28 23266: df 93 push r29 23268: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 2326c: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(failStatsFmt, 23270: 83 e0 ldi r24, 0x03 ; 3 23272: 9f e0 ldi r25, 0x0F ; 15 23274: 0f 94 1e dc call 0x3b83c ; 0x3b83c 23278: 0f 94 07 11 call 0x2220e ; 0x2220e 2327c: 78 2e mov r7, r24 2327e: 69 2e mov r6, r25 23280: 85 e0 ldi r24, 0x05 ; 5 23282: 9f e0 ldi r25, 0x0F ; 15 23284: 0f 94 1e dc call 0x3b83c ; 0x3b83c 23288: 0f 94 07 11 call 0x2220e ; 0x2220e 2328c: 98 2e mov r9, r24 2328e: 89 2e mov r8, r25 23290: 88 e3 ldi r24, 0x38 ; 56 23292: 9e e4 ldi r25, 0x4E ; 78 23294: 0e 94 44 72 call 0xe488 ; 0xe488 23298: b8 2e mov r11, r24 2329a: a9 2e mov r10, r25 2329c: 81 e0 ldi r24, 0x01 ; 1 2329e: 9f e0 ldi r25, 0x0F ; 15 232a0: 0f 94 1e dc call 0x3b83c ; 0x3b83c 232a4: 0f 94 07 11 call 0x2220e ; 0x2220e 232a8: d8 2e mov r13, r24 232aa: c9 2e mov r12, r25 232ac: 89 e2 ldi r24, 0x29 ; 41 232ae: 9e e4 ldi r25, 0x4E ; 78 232b0: 0e 94 44 72 call 0xe488 ; 0xe488 232b4: f8 2e mov r15, r24 232b6: e9 2e mov r14, r25 232b8: 8f ef ldi r24, 0xFF ; 255 232ba: 9e e0 ldi r25, 0x0E ; 14 232bc: 0f 94 1e dc call 0x3b83c ; 0x3b83c 232c0: 0f 94 07 11 call 0x2220e ; 0x2220e 232c4: 18 2f mov r17, r24 232c6: 09 2f mov r16, r25 232c8: 88 e1 ldi r24, 0x18 ; 24 232ca: 9e e4 ldi r25, 0x4E ; 78 232cc: 0e 94 44 72 call 0xe488 ; 0xe488 232d0: ec 01 movw r28, r24 232d2: 81 ef ldi r24, 0xF1 ; 241 232d4: 9d e4 ldi r25, 0x4D ; 77 232d6: 0e 94 44 72 call 0xe488 ; 0xe488 232da: 6f 92 push r6 232dc: 7f 92 push r7 232de: 8f 92 push r8 232e0: 9f 92 push r9 232e2: af 92 push r10 232e4: bf 92 push r11 232e6: cf 92 push r12 232e8: df 92 push r13 232ea: ef 92 push r14 232ec: ff 92 push r15 232ee: 0f 93 push r16 232f0: 1f 93 push r17 232f2: df 93 push r29 232f4: cf 93 push r28 232f6: 9f 93 push r25 232f8: 8f 93 push r24 232fa: 88 e3 ldi r24, 0x38 ; 56 232fc: 90 ea ldi r25, 0xA0 ; 160 232fe: 9f 93 push r25 23300: 8f 93 push r24 23302: 0e 94 51 6e call 0xdca2 ; 0xdca2 _T(MSG_POWER_FAILURES), clamp999( eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) ), _T(MSG_FIL_RUNOUTS), clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) ), _T(MSG_CRASH), clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT) ), clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) )); menu_back_if_clicked(); 23306: 8d b7 in r24, 0x3d ; 61 23308: 9e b7 in r25, 0x3e ; 62 2330a: 42 96 adiw r24, 0x12 ; 18 2330c: 0f b6 in r0, 0x3f ; 63 2330e: f8 94 cli 23310: 9e bf out 0x3e, r25 ; 62 23312: 0f be out 0x3f, r0 ; 63 23314: 8d bf out 0x3d, r24 ; 61 } 23316: df 91 pop r29 23318: cf 91 pop r28 2331a: 1f 91 pop r17 2331c: 0f 91 pop r16 2331e: ff 90 pop r15 23320: ef 90 pop r14 23322: df 90 pop r13 23324: cf 90 pop r12 23326: bf 90 pop r11 23328: af 90 pop r10 2332a: 9f 90 pop r9 2332c: 8f 90 pop r8 2332e: 7f 90 pop r7 23330: 6f 90 pop r6 _T(MSG_POWER_FAILURES), clamp999( eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) ), _T(MSG_FIL_RUNOUTS), clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) ), _T(MSG_CRASH), clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT) ), clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) )); menu_back_if_clicked(); 23332: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00023336 : //! | 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() { 23336: 8f 92 push r8 23338: 9f 92 push r9 2333a: af 92 push r10 2333c: bf 92 push r11 2333e: cf 92 push r12 23340: df 92 push r13 23342: ef 92 push r14 23344: ff 92 push r15 23346: 0f 93 push r16 23348: 1f 93 push r17 2334a: cf 93 push r28 2334c: df 93 push r29 2334e: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout lcd_home(); 23352: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P( 23356: 80 91 bf 13 lds r24, 0x13BF ; 0x8013bf 2335a: 90 91 c0 13 lds r25, 0x13C0 ; 0x8013c0 2335e: 0f 94 07 11 call 0x2220e ; 0x2220e 23362: 98 2e mov r9, r24 23364: 89 2e mov r8, r25 23366: 8c ec ldi r24, 0xCC ; 204 23368: 9d e4 ldi r25, 0x4D ; 77 2336a: 0e 94 44 72 call 0xe488 ; 0xe488 2336e: b8 2e mov r11, r24 23370: a9 2e mov r10, r25 23372: 80 ed ldi r24, 0xD0 ; 208 23374: 9e e0 ldi r25, 0x0E ; 14 23376: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2337a: 0f 94 07 11 call 0x2220e ; 0x2220e 2337e: d8 2e mov r13, r24 23380: c9 2e mov r12, r25 23382: 8b eb ldi r24, 0xBB ; 187 23384: 9d e4 ldi r25, 0x4D ; 77 23386: 0e 94 44 72 call 0xe488 ; 0xe488 2338a: f8 2e mov r15, r24 2338c: e9 2e mov r14, r25 2338e: 83 ed ldi r24, 0xD3 ; 211 23390: 9e e0 ldi r25, 0x0E ; 14 23392: 0f 94 1e dc call 0x3b83c ; 0x3b83c 23396: 0f 94 07 11 call 0x2220e ; 0x2220e 2339a: 18 2f mov r17, r24 2339c: 09 2f mov r16, r25 2339e: 8f ea ldi r24, 0xAF ; 175 233a0: 9d e4 ldi r25, 0x4D ; 77 233a2: 0e 94 44 72 call 0xe488 ; 0xe488 233a6: ec 01 movw r28, r24 233a8: 81 ef ldi r24, 0xF1 ; 241 233aa: 9d e4 ldi r25, 0x4D ; 77 233ac: 0e 94 44 72 call 0xe488 ; 0xe488 233b0: 8f 92 push r8 233b2: 9f 92 push r9 233b4: af 92 push r10 233b6: bf 92 push r11 233b8: cf 92 push r12 233ba: df 92 push r13 233bc: ef 92 push r14 233be: ff 92 push r15 233c0: 0f 93 push r16 233c2: 1f 93 push r17 233c4: df 93 push r29 233c6: cf 93 push r28 233c8: 9f 93 push r25 233ca: 8f 93 push r24 233cc: 8b e0 ldi r24, 0x0B ; 11 233ce: 90 ea ldi r25, 0xA0 ; 160 233d0: 9f 93 push r25 233d2: 8f 93 push r24 233d4: 0e 94 51 6e call 0xdca2 ; 0xdca2 ), _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(); 233d8: 8d b7 in r24, 0x3d ; 61 233da: 9e b7 in r25, 0x3e ; 62 233dc: 40 96 adiw r24, 0x10 ; 16 233de: 0f b6 in r0, 0x3f ; 63 233e0: f8 94 cli 233e2: 9e bf out 0x3e, r25 ; 62 233e4: 0f be out 0x3f, r0 ; 63 233e6: 8d bf out 0x3d, r24 ; 61 } 233e8: df 91 pop r29 233ea: cf 91 pop r28 233ec: 1f 91 pop r17 233ee: 0f 91 pop r16 233f0: ff 90 pop r15 233f2: ef 90 pop r14 233f4: df 90 pop r13 233f6: cf 90 pop r12 233f8: bf 90 pop r11 233fa: af 90 pop r10 233fc: 9f 90 pop r9 233fe: 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(); 23400: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00023404 : //! |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() { 23404: cf 93 push r28 23406: df 93 push r29 lcd_puts_at_P(0, 0, _T(MSG_MEASURED_OFFSET)); 23408: 88 eb ldi r24, 0xB8 ; 184 2340a: 90 e5 ldi r25, 0x50 ; 80 2340c: 0e 94 44 72 call 0xe488 ; 0xe488 23410: ac 01 movw r20, r24 23412: 60 e0 ldi r22, 0x00 ; 0 23414: 80 e0 ldi r24, 0x00 ; 0 23416: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 1, STR_SEPARATOR); 2341a: 49 ee ldi r20, 0xE9 ; 233 2341c: 59 e8 ldi r21, 0x89 ; 137 2341e: 61 e0 ldi r22, 0x01 ; 1 23420: 80 e0 ldi r24, 0x00 ; 0 23422: 0e 94 8c 6e call 0xdd18 ; 0xdd18 for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(0, i + 2); 23426: 62 e0 ldi r22, 0x02 ; 2 23428: 80 e0 ldi r24, 0x00 ; 0 2342a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i))); 2342e: 85 ee ldi r24, 0xE5 ; 229 23430: 9f e0 ldi r25, 0x0F ; 15 23432: 0f 94 18 dc call 0x3b830 ; 0x3b830 23436: 9f 93 push r25 23438: 8f 93 push r24 2343a: 7f 93 push r23 2343c: 6f 93 push r22 2343e: 1f 92 push r1 23440: 88 e5 ldi r24, 0x58 ; 88 23442: 8f 93 push r24 23444: c6 e7 ldi r28, 0x76 ; 118 23446: d2 ea ldi r29, 0xA2 ; 162 23448: df 93 push r29 2344a: cf 93 push r28 2344c: 0e 94 51 6e call 0xdca2 ; 0xdca2 { 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); 23450: 63 e0 ldi r22, 0x03 ; 3 23452: 80 e0 ldi r24, 0x00 ; 0 23454: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i))); 23458: 89 ee ldi r24, 0xE9 ; 233 2345a: 9f e0 ldi r25, 0x0F ; 15 2345c: 0f 94 18 dc call 0x3b830 ; 0x3b830 23460: 9f 93 push r25 23462: 8f 93 push r24 23464: 7f 93 push r23 23466: 6f 93 push r22 23468: 1f 92 push r1 2346a: 89 e5 ldi r24, 0x59 ; 89 2346c: 8f 93 push r24 2346e: df 93 push r29 23470: cf 93 push r28 23472: 0e 94 51 6e call 0xdca2 ; 0xdca2 } menu_back_if_clicked(); 23476: 8d b7 in r24, 0x3d ; 61 23478: 9e b7 in r25, 0x3e ; 62 2347a: 40 96 adiw r24, 0x10 ; 16 2347c: 0f b6 in r0, 0x3f ; 63 2347e: f8 94 cli 23480: 9e bf out 0x3e, r25 ; 62 23482: 0f be out 0x3f, r0 ; 63 23484: 8d bf out 0x3d, r24 ; 61 } 23486: df 91 pop r29 23488: 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(); 2348a: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 0002348e : //! ---------------------- //! 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() { 2348e: cf 92 push r12 23490: df 92 push r13 23492: ef 92 push r14 23494: ff 92 push r15 23496: 0f 93 push r16 23498: 1f 93 push r17 2349a: cf 93 push r28 2349c: df 93 push r29 float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW)); 2349e: 80 e6 ldi r24, 0x60 ; 96 234a0: 9f e0 ldi r25, 0x0F ; 15 234a2: 0f 94 18 dc call 0x3b830 ; 0x3b830 234a6: 6b 01 movw r12, r22 234a8: 7c 01 movw r14, r24 lcd_home(); 234aa: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(_N( 234ae: 8a ea ldi r24, 0xAA ; 170 234b0: 90 e5 ldi r25, 0x50 ; 80 234b2: 0e 94 44 72 call 0xe488 ; 0xe488 234b6: 18 2f mov r17, r24 234b8: 09 2f mov r16, r25 234ba: 8c e9 ldi r24, 0x9C ; 156 234bc: 90 e5 ldi r25, 0x50 ; 80 234be: 0e 94 44 72 call 0xe488 ; 0xe488 234c2: ec 01 movw r28, r24 234c4: 8c e8 ldi r24, 0x8C ; 140 234c6: 90 e5 ldi r25, 0x50 ; 80 234c8: 0e 94 44 72 call 0xe488 ; 0xe488 234cc: 2e e3 ldi r18, 0x3E ; 62 234ce: 2f 93 push r18 234d0: 20 e8 ldi r18, 0x80 ; 128 234d2: 2f 93 push r18 234d4: 1f 92 push r1 234d6: 1f 92 push r1 234d8: 0f 93 push r16 234da: 1f 93 push r17 234dc: 2d e3 ldi r18, 0x3D ; 61 234de: 2f 93 push r18 234e0: 25 ef ldi r18, 0xF5 ; 245 234e2: 2f 93 push r18 234e4: 22 ec ldi r18, 0xC2 ; 194 234e6: 2f 93 push r18 234e8: 20 e9 ldi r18, 0x90 ; 144 234ea: 2f 93 push r18 234ec: df 93 push r29 234ee: cf 93 push r28 234f0: 29 ee ldi r18, 0xE9 ; 233 234f2: 39 e8 ldi r19, 0x89 ; 137 234f4: 3f 93 push r19 234f6: 2f 93 push r18 234f8: 9f 93 push r25 234fa: 8f 93 push r24 234fc: 8c e5 ldi r24, 0x5C ; 92 234fe: 9f e6 ldi r25, 0x6F ; 111 23500: 9f 93 push r25 23502: 8f 93 push r24 23504: 0e 94 51 6e call 0xdca2 ; 0xdca2 _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); 23508: 60 e0 ldi r22, 0x00 ; 0 2350a: 8f e0 ldi r24, 0x0F ; 15 2350c: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 if (angleDiff < 100){ 23510: 8d b7 in r24, 0x3d ; 61 23512: 9e b7 in r25, 0x3e ; 62 23514: 42 96 adiw r24, 0x12 ; 18 23516: 0f b6 in r0, 0x3f ; 63 23518: f8 94 cli 2351a: 9e bf out 0x3e, r25 ; 62 2351c: 0f be out 0x3f, r0 ; 63 2351e: 8d bf out 0x3d, r24 ; 61 23520: 20 e0 ldi r18, 0x00 ; 0 23522: 30 e0 ldi r19, 0x00 ; 0 23524: 48 ec ldi r20, 0xC8 ; 200 23526: 52 e4 ldi r21, 0x42 ; 66 23528: c7 01 movw r24, r14 2352a: b6 01 movw r22, r12 2352c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 23530: 87 ff sbrs r24, 7 23532: 32 c0 rjmp .+100 ; 0x23598 } //@brief Show measured axis skewness float _deg(float rad) { return rad * 180 / M_PI; 23534: 20 e0 ldi r18, 0x00 ; 0 23536: 30 e0 ldi r19, 0x00 ; 0 23538: 44 e3 ldi r20, 0x34 ; 52 2353a: 53 e4 ldi r21, 0x43 ; 67 2353c: c7 01 movw r24, r14 2353e: b6 01 movw r22, r12 23540: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 23544: 2b ed ldi r18, 0xDB ; 219 23546: 3f e0 ldi r19, 0x0F ; 15 23548: 49 e4 ldi r20, 0x49 ; 73 2354a: 50 e4 ldi r21, 0x40 ; 64 2354c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__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)); 23550: 9f 93 push r25 23552: 8f 93 push r24 23554: 7f 93 push r23 23556: 6f 93 push r22 23558: 85 e5 ldi r24, 0x55 ; 85 2355a: 9f e6 ldi r25, 0x6F ; 111 2355c: 9f 93 push r25 2355e: 8f 93 push r24 23560: 0e 94 51 6e call 0xdca2 ; 0xdca2 23564: 0f 90 pop r0 23566: 0f 90 pop r0 23568: 0f 90 pop r0 2356a: 0f 90 pop r0 2356c: 0f 90 pop r0 2356e: 0f 90 pop r0 } else { lcd_puts_P(_T(MSG_NA)); } if (lcd_clicked()) 23570: 0e 94 95 70 call 0xe12a ; 0xe12a 23574: 88 23 and r24, r24 23576: b9 f0 breq .+46 ; 0x235a6 menu_goto(lcd_menu_xyz_offset, 0, true); 23578: 20 e0 ldi r18, 0x00 ; 0 2357a: 41 e0 ldi r20, 0x01 ; 1 2357c: 70 e0 ldi r23, 0x00 ; 0 2357e: 60 e0 ldi r22, 0x00 ; 0 23580: 84 e2 ldi r24, 0x24 ; 36 23582: 99 e3 ldi r25, 0x39 ; 57 } 23584: df 91 pop r29 23586: cf 91 pop r28 23588: 1f 91 pop r17 2358a: 0f 91 pop r16 2358c: ff 90 pop r15 2358e: ef 90 pop r14 23590: df 90 pop r13 23592: 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); 23594: 0d 94 b4 d1 jmp 0x3a368 ; 0x3a368 ); 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)); 23598: 8a e8 ldi r24, 0x8A ; 138 2359a: 97 e4 ldi r25, 0x47 ; 71 2359c: 0e 94 44 72 call 0xe488 ; 0xe488 235a0: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 235a4: e5 cf rjmp .-54 ; 0x23570 } if (lcd_clicked()) menu_goto(lcd_menu_xyz_offset, 0, true); } 235a6: df 91 pop r29 235a8: cf 91 pop r28 235aa: 1f 91 pop r17 235ac: 0f 91 pop r16 235ae: ff 90 pop r15 235b0: ef 90 pop r14 235b2: df 90 pop r13 235b4: cf 90 pop r12 235b6: 08 95 ret 000235b8 : //! |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() { 235b8: 2f 92 push r2 235ba: 3f 92 push r3 235bc: 4f 92 push r4 235be: 5f 92 push r5 235c0: 6f 92 push r6 235c2: 7f 92 push r7 235c4: 8f 92 push r8 235c6: 9f 92 push r9 235c8: af 92 push r10 235ca: bf 92 push r11 235cc: cf 92 push r12 235ce: df 92 push r13 235d0: ef 92 push r14 235d2: ff 92 push r15 235d4: 0f 93 push r16 235d6: 1f 93 push r17 235d8: cf 93 push r28 235da: df 93 push r29 235dc: cd b7 in r28, 0x3d ; 61 235de: de b7 in r29, 0x3e ; 62 235e0: a8 97 sbiw r28, 0x28 ; 40 235e2: 0f b6 in r0, 0x3f ; 63 235e4: f8 94 cli 235e6: de bf out 0x3e, r29 ; 62 235e8: 0f be out 0x3f, r0 ; 63 235ea: 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); 235ec: 48 e0 ldi r20, 0x08 ; 8 235ee: 50 e0 ldi r21, 0x00 ; 0 235f0: 65 ee ldi r22, 0xE5 ; 229 235f2: 7f e0 ldi r23, 0x0F ; 15 235f4: ce 01 movw r24, r28 235f6: 41 96 adiw r24, 0x11 ; 17 235f8: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8); 235fc: 48 e0 ldi r20, 0x08 ; 8 235fe: 50 e0 ldi r21, 0x00 ; 0 23600: 6d ed ldi r22, 0xDD ; 221 23602: 7f e0 ldi r23, 0x0F ; 15 23604: ce 01 movw r24, r28 23606: 09 96 adiw r24, 0x09 ; 9 23608: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); 2360c: 48 e0 ldi r20, 0x08 ; 8 2360e: 50 e0 ldi r21, 0x00 ; 0 23610: 65 ed ldi r22, 0xD5 ; 213 23612: 7f e0 ldi r23, 0x0F ; 15 23614: ce 01 movw r24, r28 23616: 01 96 adiw r24, 0x01 ; 1 23618: 0f 94 00 dc call 0x3b800 ; 0x3b800 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]; 2361c: 8d 84 ldd r8, Y+13 ; 0x0d 2361e: 9e 84 ldd r9, Y+14 ; 0x0e 23620: af 84 ldd r10, Y+15 ; 0x0f 23622: b8 88 ldd r11, Y+16 ; 0x10 23624: ef e1 ldi r30, 0x1F ; 31 23626: f5 ea ldi r31, 0xA5 ; 165 23628: 25 91 lpm r18, Z+ 2362a: 35 91 lpm r19, Z+ 2362c: 45 91 lpm r20, Z+ 2362e: 54 91 lpm r21, Z 23630: cd 80 ldd r12, Y+5 ; 0x05 23632: de 80 ldd r13, Y+6 ; 0x06 23634: ef 80 ldd r14, Y+7 ; 0x07 23636: f8 84 ldd r15, Y+8 ; 0x08 23638: e3 e2 ldi r30, 0x23 ; 35 2363a: f5 ea ldi r31, 0xA5 ; 165 2363c: 85 91 lpm r24, Z+ 2363e: 95 91 lpm r25, Z+ 23640: a5 91 lpm r26, Z+ 23642: b4 91 lpm r27, Z 23644: 8d a3 std Y+37, r24 ; 0x25 23646: 9e a3 std Y+38, r25 ; 0x26 23648: af a3 std Y+39, r26 ; 0x27 2364a: b8 a7 std Y+40, r27 ; 0x28 2364c: 8d 89 ldd r24, Y+21 ; 0x15 2364e: 9e 89 ldd r25, Y+22 ; 0x16 23650: af 89 ldd r26, Y+23 ; 0x17 23652: b8 8d ldd r27, Y+24 ; 0x18 23654: 89 a3 std Y+33, r24 ; 0x21 23656: 9a a3 std Y+34, r25 ; 0x22 23658: ab a3 std Y+35, r26 ; 0x23 2365a: bc a3 std Y+36, r27 ; 0x24 2365c: c5 01 movw r24, r10 2365e: b4 01 movw r22, r8 23660: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 23664: 2b 01 movw r4, r22 23666: 3c 01 movw r6, r24 23668: 2d a1 ldd r18, Y+37 ; 0x25 2366a: 3e a1 ldd r19, Y+38 ; 0x26 2366c: 4f a1 ldd r20, Y+39 ; 0x27 2366e: 58 a5 ldd r21, Y+40 ; 0x28 23670: c7 01 movw r24, r14 23672: b6 01 movw r22, r12 23674: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 23678: 9b 01 movw r18, r22 2367a: ac 01 movw r20, r24 2367c: c3 01 movw r24, r6 2367e: b2 01 movw r22, r4 23680: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 23684: 29 a1 ldd r18, Y+33 ; 0x21 23686: 3a a1 ldd r19, Y+34 ; 0x22 23688: 4b a1 ldd r20, Y+35 ; 0x23 2368a: 5c a1 ldd r21, Y+36 ; 0x24 2368c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 23690: 20 e0 ldi r18, 0x00 ; 0 23692: 30 e0 ldi r19, 0x00 ; 0 23694: 40 e9 ldi r20, 0x90 ; 144 23696: 50 e4 ldi r21, 0x40 ; 64 23698: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2369c: 1b 01 movw r2, r22 2369e: 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]; 236a0: e7 e2 ldi r30, 0x27 ; 39 236a2: f5 ea ldi r31, 0xA5 ; 165 236a4: 25 91 lpm r18, Z+ 236a6: 35 91 lpm r19, Z+ 236a8: 45 91 lpm r20, Z+ 236aa: 54 91 lpm r21, Z 236ac: eb e2 ldi r30, 0x2B ; 43 236ae: f5 ea ldi r31, 0xA5 ; 165 236b0: 45 90 lpm r4, Z+ 236b2: 55 90 lpm r5, Z+ 236b4: 65 90 lpm r6, Z+ 236b6: 74 90 lpm r7, Z 236b8: c5 01 movw r24, r10 236ba: b4 01 movw r22, r8 236bc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 236c0: 4b 01 movw r8, r22 236c2: 5c 01 movw r10, r24 236c4: a3 01 movw r20, r6 236c6: 92 01 movw r18, r4 236c8: c7 01 movw r24, r14 236ca: b6 01 movw r22, r12 236cc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 236d0: 9b 01 movw r18, r22 236d2: ac 01 movw r20, r24 236d4: c5 01 movw r24, r10 236d6: b4 01 movw r22, r8 236d8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 236dc: 29 a1 ldd r18, Y+33 ; 0x21 236de: 3a a1 ldd r19, Y+34 ; 0x22 236e0: 4b a1 ldd r20, Y+35 ; 0x23 236e2: 5c a1 ldd r21, Y+36 ; 0x24 236e4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 236e8: 20 e0 ldi r18, 0x00 ; 0 236ea: 30 e0 ldi r19, 0x00 ; 0 236ec: 40 e9 ldi r20, 0x90 ; 144 236ee: 50 e4 ldi r21, 0x40 ; 64 236f0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 236f4: 6d 8f std Y+29, r22 ; 0x1d 236f6: 7e 8f std Y+30, r23 ; 0x1e 236f8: 8f 8f std Y+31, r24 ; 0x1f 236fa: 98 a3 std Y+32, r25 ; 0x20 float distanceMin[2]; count_xyz_details(distanceMin); lcd_home(); 236fc: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(_N( 23700: 84 e8 ldi r24, 0x84 ; 132 23702: 90 e5 ldi r25, 0x50 ; 80 23704: 0e 94 44 72 call 0xe488 ; 0xe488 23708: d8 2e mov r13, r24 2370a: c9 2e mov r12, r25 2370c: 8d e7 ldi r24, 0x7D ; 125 2370e: 90 e5 ldi r25, 0x50 ; 80 23710: 0e 94 44 72 call 0xe488 ; 0xe488 23714: f8 2e mov r15, r24 23716: e9 2e mov r14, r25 23718: 87 e6 ldi r24, 0x67 ; 103 2371a: 90 e5 ldi r25, 0x50 ; 80 2371c: 0e 94 44 72 call 0xe488 ; 0xe488 23720: cf 92 push r12 23722: df 92 push r13 23724: ef 92 push r14 23726: ff 92 push r15 23728: 29 ee ldi r18, 0xE9 ; 233 2372a: 39 e8 ldi r19, 0x89 ; 137 2372c: 3f 93 push r19 2372e: 2f 93 push r18 23730: 9f 93 push r25 23732: 8f 93 push r24 23734: 87 e4 ldi r24, 0x47 ; 71 23736: 9f e6 ldi r25, 0x6F ; 111 23738: 9f 93 push r25 2373a: 8f 93 push r24 2373c: 0e 94 51 6e call 0xdca2 ; 0xdca2 _T(MSG_LEFT), _T(MSG_RIGHT) ); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(11,2+i); 23740: 62 e0 ldi r22, 0x02 ; 2 23742: 8b e0 ldi r24, 0x0B ; 11 23744: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA)); 23748: 0f b6 in r0, 0x3f ; 63 2374a: f8 94 cli 2374c: de bf out 0x3e, r29 ; 62 2374e: 0f be out 0x3f, r0 ; 63 23750: cd bf out 0x3d, r28 ; 61 23752: 20 e0 ldi r18, 0x00 ; 0 23754: 30 e0 ldi r19, 0x00 ; 0 23756: 48 e4 ldi r20, 0x48 ; 72 23758: 53 e4 ldi r21, 0x43 ; 67 2375a: 62 2d mov r22, r2 2375c: 73 2d mov r23, r3 2375e: 80 2f mov r24, r16 23760: 91 2f mov r25, r17 23762: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 23766: 87 ff sbrs r24, 7 23768: 51 c0 rjmp .+162 ; 0x2380c else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); 2376a: 1f 93 push r17 2376c: 0f 93 push r16 2376e: 3f 92 push r3 23770: 2f 92 push r2 23772: 8f e3 ldi r24, 0x3F ; 63 23774: 9f e6 ldi r25, 0x6F ; 111 23776: 9f 93 push r25 23778: 8f 93 push r24 2377a: 0e 94 51 6e call 0xdca2 ; 0xdca2 2377e: 0f 90 pop r0 23780: 0f 90 pop r0 23782: 0f 90 pop r0 23784: 0f 90 pop r0 23786: 0f 90 pop r0 23788: 0f 90 pop r0 _T(MSG_LEFT), _T(MSG_RIGHT) ); for (uint8_t i = 0; i < 2; i++) { lcd_set_cursor(11,2+i); 2378a: 63 e0 ldi r22, 0x03 ; 3 2378c: 8b e0 ldi r24, 0x0B ; 11 2378e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA)); 23792: 1d 8d ldd r17, Y+29 ; 0x1d 23794: 0e 8d ldd r16, Y+30 ; 0x1e 23796: ff 8c ldd r15, Y+31 ; 0x1f 23798: e8 a0 ldd r14, Y+32 ; 0x20 2379a: 20 e0 ldi r18, 0x00 ; 0 2379c: 30 e0 ldi r19, 0x00 ; 0 2379e: 48 e4 ldi r20, 0x48 ; 72 237a0: 53 e4 ldi r21, 0x43 ; 67 237a2: d8 01 movw r26, r16 237a4: f7 01 movw r30, r14 237a6: 6b 2f mov r22, r27 237a8: 7a 2f mov r23, r26 237aa: 8f 2f mov r24, r31 237ac: 9e 2f mov r25, r30 237ae: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 237b2: 87 fd sbrc r24, 7 237b4: 32 c0 rjmp .+100 ; 0x2381a 237b6: 8a e8 ldi r24, 0x8A ; 138 237b8: 97 e4 ldi r25, 0x47 ; 71 237ba: 0e 94 44 72 call 0xe488 ; 0xe488 237be: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); } if (lcd_clicked()) 237c2: 0e 94 95 70 call 0xe12a ; 0xe12a 237c6: 88 23 and r24, r24 237c8: 41 f0 breq .+16 ; 0x237da menu_goto(lcd_menu_xyz_skew, 0, true); 237ca: 20 e0 ldi r18, 0x00 ; 0 237cc: 41 e0 ldi r20, 0x01 ; 1 237ce: 70 e0 ldi r23, 0x00 ; 0 237d0: 60 e0 ldi r22, 0x00 ; 0 237d2: 8c ef ldi r24, 0xFC ; 252 237d4: 98 e3 ldi r25, 0x38 ; 56 237d6: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 } 237da: a8 96 adiw r28, 0x28 ; 40 237dc: 0f b6 in r0, 0x3f ; 63 237de: f8 94 cli 237e0: de bf out 0x3e, r29 ; 62 237e2: 0f be out 0x3f, r0 ; 63 237e4: cd bf out 0x3d, r28 ; 61 237e6: df 91 pop r29 237e8: cf 91 pop r28 237ea: 1f 91 pop r17 237ec: 0f 91 pop r16 237ee: ff 90 pop r15 237f0: ef 90 pop r14 237f2: df 90 pop r13 237f4: cf 90 pop r12 237f6: bf 90 pop r11 237f8: af 90 pop r10 237fa: 9f 90 pop r9 237fc: 8f 90 pop r8 237fe: 7f 90 pop r7 23800: 6f 90 pop r6 23802: 5f 90 pop r5 23804: 4f 90 pop r4 23806: 3f 90 pop r3 23808: 2f 90 pop r2 2380a: 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)); 2380c: 8a e8 ldi r24, 0x8A ; 138 2380e: 97 e4 ldi r25, 0x47 ; 71 23810: 0e 94 44 72 call 0xe488 ; 0xe488 23814: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 23818: b8 cf rjmp .-144 ; 0x2378a else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]); 2381a: ef 92 push r14 2381c: ff 92 push r15 2381e: 0f 93 push r16 23820: 1f 93 push r17 23822: 8f e3 ldi r24, 0x3F ; 63 23824: 9f e6 ldi r25, 0x6F ; 111 23826: 9f 93 push r25 23828: 8f 93 push r24 2382a: 0e 94 51 6e call 0xdca2 ; 0xdca2 2382e: 0f 90 pop r0 23830: 0f 90 pop r0 23832: 0f 90 pop r0 23834: 0f 90 pop r0 23836: 0f 90 pop r0 23838: 0f 90 pop r0 2383a: c3 cf rjmp .-122 ; 0x237c2 0002383c <_lcd_move(char const*, unsigned char, int, int)>: } } static void _lcd_move(const char *name, uint8_t axis, int min, int max) { 2383c: 2f 92 push r2 2383e: 3f 92 push r3 23840: 4f 92 push r4 23842: 5f 92 push r5 23844: 6f 92 push r6 23846: 7f 92 push r7 23848: 9f 92 push r9 2384a: af 92 push r10 2384c: bf 92 push r11 2384e: cf 92 push r12 23850: df 92 push r13 23852: ef 92 push r14 23854: ff 92 push r15 23856: 0f 93 push r16 23858: 1f 93 push r17 2385a: cf 93 push r28 2385c: df 93 push r29 if (homing_flag || mesh_bed_leveling_flag) 2385e: 70 91 a6 0d lds r23, 0x0DA6 ; 0x800da6 23862: 71 11 cpse r23, r1 23864: 04 c0 rjmp .+8 ; 0x2386e <_lcd_move(char const*, unsigned char, int, int)+0x32> 23866: 70 91 a7 0d lds r23, 0x0DA7 ; 0x800da7 2386a: 77 23 and r23, r23 2386c: 99 f0 breq .+38 ; 0x23894 <_lcd_move(char const*, unsigned char, int, int)+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(); } 2386e: df 91 pop r29 23870: cf 91 pop r28 23872: 1f 91 pop r17 23874: 0f 91 pop r16 23876: ff 90 pop r15 23878: ef 90 pop r14 2387a: df 90 pop r13 2387c: cf 90 pop r12 2387e: bf 90 pop r11 23880: af 90 pop r10 23882: 9f 90 pop r9 23884: 7f 90 pop r7 23886: 6f 90 pop r6 23888: 5f 90 pop r5 2388a: 4f 90 pop r4 2388c: 3f 90 pop r3 2388e: 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(); 23890: 0d 94 52 d4 jmp 0x3a8a4 ; 0x3a8a4 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) 23894: 70 91 a7 03 lds r23, 0x03A7 ; 0x8003a7 23898: 71 11 cpse r23, r1 2389a: 09 c0 rjmp .+18 ; 0x238ae <_lcd_move(char const*, unsigned char, int, int)+0x72> return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 2389c: 70 91 b7 02 lds r23, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> check_endstops = check; 238a0: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> { _md->endstopsEnabledPrevious = enable_endstops(false); 238a4: 70 93 a8 03 sts 0x03A8, r23 ; 0x8003a8 _md->initialized = true; 238a8: 71 e0 ldi r23, 0x01 ; 1 238aa: 70 93 a7 03 sts 0x03A7, r23 ; 0x8003a7 238ae: 19 01 movw r2, r18 238b0: 6a 01 movw r12, r20 238b2: c6 2f mov r28, r22 238b4: d9 2f mov r29, r25 238b6: 98 2e mov r9, r24 } if (lcd_encoder != 0) 238b8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 238bc: 90 91 70 06 lds r25, 0x0670 ; 0x800670 238c0: 89 2b or r24, r25 238c2: 09 f4 brne .+2 ; 0x238c6 <_lcd_move(char const*, unsigned char, int, int)+0x8a> 238c4: 71 c0 rjmp .+226 ; 0x239a8 <_lcd_move(char const*, unsigned char, int, int)+0x16c> { refresh_cmd_timeout(); 238c6: 0e 94 5b 66 call 0xccb6 ; 0xccb6 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; 238ca: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 if (++ next_block_index == BLOCK_BUFFER_SIZE) 238ce: 8f 5f subi r24, 0xFF ; 255 238d0: 80 31 cpi r24, 0x10 ; 16 238d2: 09 f4 brne .+2 ; 0x238d6 <_lcd_move(char const*, unsigned char, int, int)+0x9a> next_block_index = 0; 238d4: 80 e0 ldi r24, 0x00 ; 0 return block_buffer_tail == next_block_index; 238d6: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 if (! planner_queue_full()) 238da: 98 17 cp r25, r24 238dc: 09 f4 brne .+2 ; 0x238e0 <_lcd_move(char const*, unsigned char, int, int)+0xa4> 238de: 64 c0 rjmp .+200 ; 0x239a8 <_lcd_move(char const*, unsigned char, int, int)+0x16c> { current_position[axis] += lcd_encoder; 238e0: 84 e0 ldi r24, 0x04 ; 4 238e2: c8 9f mul r28, r24 238e4: 80 01 movw r16, r0 238e6: 11 24 eor r1, r1 238e8: f8 01 movw r30, r16 238ea: ef 56 subi r30, 0x6F ; 111 238ec: f9 4f sbci r31, 0xF9 ; 249 238ee: 5f 01 movw r10, r30 238f0: 60 91 6f 06 lds r22, 0x066F ; 0x80066f 238f4: 70 91 70 06 lds r23, 0x0670 ; 0x800670 238f8: 07 2e mov r0, r23 238fa: 00 0c add r0, r0 238fc: 88 0b sbc r24, r24 238fe: 99 0b sbc r25, r25 23900: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 23904: f5 01 movw r30, r10 23906: 20 81 ld r18, Z 23908: 31 81 ldd r19, Z+1 ; 0x01 2390a: 42 81 ldd r20, Z+2 ; 0x02 2390c: 53 81 ldd r21, Z+3 ; 0x03 2390e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 23912: 2b 01 movw r4, r22 23914: 3c 01 movw r6, r24 if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; 23916: b6 01 movw r22, r12 23918: dd 0c add r13, r13 2391a: 88 0b sbc r24, r24 2391c: 99 0b sbc r25, r25 2391e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 23922: 6b 01 movw r12, r22 23924: 7c 01 movw r14, r24 23926: ac 01 movw r20, r24 23928: 9b 01 movw r18, r22 2392a: c3 01 movw r24, r6 2392c: b2 01 movw r22, r4 2392e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 23932: f5 01 movw r30, r10 23934: 87 fd sbrc r24, 7 23936: 7d c0 rjmp .+250 ; 0x23a32 <_lcd_move(char const*, unsigned char, int, int)+0x1f6> if (lcd_encoder != 0) { refresh_cmd_timeout(); if (! planner_queue_full()) { current_position[axis] += lcd_encoder; 23938: 40 82 st Z, r4 2393a: 51 82 std Z+1, r5 ; 0x01 2393c: 62 82 std Z+2, r6 ; 0x02 2393e: 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; 23940: b1 01 movw r22, r2 23942: 33 0c add r3, r3 23944: 88 0b sbc r24, r24 23946: 99 0b sbc r25, r25 23948: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2394c: 2b 01 movw r4, r22 2394e: 3c 01 movw r6, r24 23950: c8 01 movw r24, r16 23952: 8f 56 subi r24, 0x6F ; 111 23954: 99 4f sbci r25, 0xF9 ; 249 23956: 7c 01 movw r14, r24 23958: a3 01 movw r20, r6 2395a: 92 01 movw r18, r4 2395c: fc 01 movw r30, r24 2395e: 60 81 ld r22, Z 23960: 71 81 ldd r23, Z+1 ; 0x01 23962: 82 81 ldd r24, Z+2 ; 0x02 23964: 93 81 ldd r25, Z+3 ; 0x03 23966: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2396a: 18 16 cp r1, r24 2396c: 2c f4 brge .+10 ; 0x23978 <_lcd_move(char const*, unsigned char, int, int)+0x13c> 2396e: f7 01 movw r30, r14 23970: 40 82 st Z, r4 23972: 51 82 std Z+1, r5 ; 0x01 23974: 62 82 std Z+2, r6 ; 0x02 23976: 73 82 std Z+3, r7 ; 0x03 lcd_encoder = 0; 23978: 10 92 70 06 sts 0x0670, r1 ; 0x800670 2397c: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 23980: 65 e9 ldi r22, 0x95 ; 149 23982: 76 e0 ldi r23, 0x06 ; 6 23984: 81 e9 ldi r24, 0x91 ; 145 23986: 96 e0 ldi r25, 0x06 ; 6 23988: 0e 94 42 6a call 0xd484 ; 0xd484 plan_buffer_line_curposXYZE(get_feedrate_mm_s(manual_feedrate[axis])); 2398c: f8 01 movw r30, r16 2398e: e9 50 subi r30, 0x09 ; 9 23990: fd 4f sbci r31, 0xFD ; 253 23992: 60 81 ld r22, Z 23994: 71 81 ldd r23, Z+1 ; 0x01 23996: 82 81 ldd r24, Z+2 ; 0x02 23998: 93 81 ldd r25, Z+3 ; 0x03 2399a: 0e 94 5f 66 call 0xccbe ; 0xccbe 2399e: 0f 94 3d c0 call 0x3807a ; 0x3807a lcd_draw_update = 1; 239a2: 81 e0 ldi r24, 0x01 ; 1 239a4: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } } if (lcd_draw_update) 239a8: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 239ac: 88 23 and r24, r24 239ae: 11 f1 breq .+68 ; 0x239f4 <_lcd_move(char const*, unsigned char, int, int)+0x1b8> { lcd_set_cursor(0, 1); 239b0: 61 e0 ldi r22, 0x01 ; 1 239b2: 80 e0 ldi r24, 0x00 ; 0 239b4: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 menu_draw_float31(name, current_position[axis]); 239b8: 84 e0 ldi r24, 0x04 ; 4 239ba: c8 9f mul r28, r24 239bc: f0 01 movw r30, r0 239be: 11 24 eor r1, r1 239c0: ef 56 subi r30, 0x6F ; 111 239c2: f9 4f sbci r31, 0xF9 ; 249 //! 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); 239c4: 83 81 ldd r24, Z+3 ; 0x03 239c6: 8f 93 push r24 239c8: 82 81 ldd r24, Z+2 ; 0x02 239ca: 8f 93 push r24 239cc: 81 81 ldd r24, Z+1 ; 0x01 239ce: 8f 93 push r24 239d0: 80 81 ld r24, Z 239d2: 8f 93 push r24 239d4: df 93 push r29 239d6: 9f 92 push r9 239d8: 8d e5 ldi r24, 0x5D ; 93 239da: 92 ea ldi r25, 0xA2 ; 162 239dc: 9f 93 push r25 239de: 8f 93 push r24 239e0: 0e 94 51 6e call 0xdca2 ; 0xdca2 239e4: ed b7 in r30, 0x3d ; 61 239e6: fe b7 in r31, 0x3e ; 62 239e8: 38 96 adiw r30, 0x08 ; 8 239ea: 0f b6 in r0, 0x3f ; 63 239ec: f8 94 cli 239ee: fe bf out 0x3e, r31 ; 62 239f0: 0f be out 0x3f, r0 ; 63 239f2: ed bf out 0x3d, r30 ; 61 } if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious); 239f4: 80 91 d5 03 lds r24, 0x03D5 ; 0x8003d5 239f8: 81 11 cpse r24, r1 239fa: 04 c0 rjmp .+8 ; 0x23a04 <_lcd_move(char const*, unsigned char, int, int)+0x1c8> 239fc: 80 91 a6 03 lds r24, 0x03A6 ; 0x8003a6 23a00: 88 23 and r24, r24 23a02: 21 f0 breq .+8 ; 0x23a0c <_lcd_move(char const*, unsigned char, int, int)+0x1d0> 23a04: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 23a08: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> menu_back_if_clicked(); } 23a0c: df 91 pop r29 23a0e: cf 91 pop r28 23a10: 1f 91 pop r17 23a12: 0f 91 pop r16 23a14: ff 90 pop r15 23a16: ef 90 pop r14 23a18: df 90 pop r13 23a1a: cf 90 pop r12 23a1c: bf 90 pop r11 23a1e: af 90 pop r10 23a20: 9f 90 pop r9 23a22: 7f 90 pop r7 23a24: 6f 90 pop r6 23a26: 5f 90 pop r5 23a28: 4f 90 pop r4 23a2a: 3f 90 pop r3 23a2c: 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(); 23a2e: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 { refresh_cmd_timeout(); if (! planner_queue_full()) { current_position[axis] += lcd_encoder; if (min_software_endstops && current_position[axis] < min) current_position[axis] = min; 23a32: c0 82 st Z, r12 23a34: d1 82 std Z+1, r13 ; 0x01 23a36: e2 82 std Z+2, r14 ; 0x02 23a38: f3 82 std Z+3, r15 ; 0x03 23a3a: 82 cf rjmp .-252 ; 0x23940 <_lcd_move(char const*, unsigned char, int, int)+0x104> 00023a3c : } 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); 23a3c: 22 ed ldi r18, 0xD2 ; 210 23a3e: 30 e0 ldi r19, 0x00 ; 0 23a40: 50 e0 ldi r21, 0x00 ; 0 23a42: 40 e0 ldi r20, 0x00 ; 0 23a44: 62 e0 ldi r22, 0x02 ; 2 23a46: 87 e8 ldi r24, 0x87 ; 135 23a48: 92 ea ldi r25, 0xA2 ; 162 23a4a: 0d 94 1e 1c jmp 0x2383c ; 0x2383c <_lcd_move(char const*, unsigned char, int, int)> 00023a4e : // the implementation of menu_draw_float31 static void lcd_move_x() { _lcd_move(PSTR("X:"), X_AXIS, X_MIN_POS, X_MAX_POS); } static void lcd_move_y() { _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); 23a4e: 24 ed ldi r18, 0xD4 ; 212 23a50: 30 e0 ldi r19, 0x00 ; 0 23a52: 4c ef ldi r20, 0xFC ; 252 23a54: 5f ef ldi r21, 0xFF ; 255 23a56: 61 e0 ldi r22, 0x01 ; 1 23a58: 84 e8 ldi r24, 0x84 ; 132 23a5a: 92 ea ldi r25, 0xA2 ; 162 23a5c: 0d 94 1e 1c jmp 0x2383c ; 0x2383c <_lcd_move(char const*, unsigned char, int, int)> 00023a60 : } // 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); 23a60: 2f ef ldi r18, 0xFF ; 255 23a62: 30 e0 ldi r19, 0x00 ; 0 23a64: 50 e0 ldi r21, 0x00 ; 0 23a66: 40 e0 ldi r20, 0x00 ; 0 23a68: 60 e0 ldi r22, 0x00 ; 0 23a6a: 81 e8 ldi r24, 0x81 ; 129 23a6c: 92 ea ldi r25, 0xA2 ; 162 23a6e: 0d 94 1e 1c jmp 0x2383c ; 0x2383c <_lcd_move(char const*, unsigned char, int, int)> 00023a72 : //! ---------------------- //! @endcode static void lcd_menu_fails_stats() { MENU_BEGIN(); 23a72: 0f 94 8a d1 call 0x3a314 ; 0x3a314 23a76: 10 92 11 05 sts 0x0511, r1 ; 0x800511 23a7a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23a7e: 84 30 cpi r24, 0x04 ; 4 23a80: 28 f5 brcc .+74 ; 0x23acc 23a82: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 23a86: 8b e3 ldi r24, 0x3B ; 59 23a88: 98 e4 ldi r25, 0x48 ; 72 23a8a: 0e 94 44 72 call 0xe488 ; 0xe488 23a8e: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_print); 23a92: 88 e4 ldi r24, 0x48 ; 72 23a94: 9e e4 ldi r25, 0x4E ; 78 23a96: 0e 94 44 72 call 0xe488 ; 0xe488 23a9a: 6e ef ldi r22, 0xFE ; 254 23a9c: 79 e3 ldi r23, 0x39 ; 57 23a9e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_total); 23aa2: 80 e4 ldi r24, 0x40 ; 64 23aa4: 9e e4 ldi r25, 0x4E ; 78 23aa6: 0e 94 44 72 call 0xe488 ; 0xe488 23aaa: 6a eb ldi r22, 0xBA ; 186 23aac: 79 e3 ldi r23, 0x39 ; 57 23aae: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_END(); 23ab2: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc //! ---------------------- //! @endcode static void lcd_menu_fails_stats() { MENU_BEGIN(); 23ab6: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23aba: 8f 5f subi r24, 0xFF ; 255 23abc: 80 93 11 05 sts 0x0511, r24 ; 0x800511 23ac0: 80 91 13 05 lds r24, 0x0513 ; 0x800513 23ac4: 8f 5f subi r24, 0xFF ; 255 23ac6: 80 93 13 05 sts 0x0513, r24 ; 0x800513 23aca: d7 cf rjmp .-82 ; 0x23a7a MENU_ITEM_BACK_P(_T(MSG_MAIN)); MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_print); MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_total); MENU_END(); } 23acc: 08 95 ret 00023ace : //! | Material changes | MSG_MATERIAL_CHANGES c=18 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu() { MENU_BEGIN(); 23ace: 0f 94 8a d1 call 0x3a314 ; 0x3a314 23ad2: 10 92 11 05 sts 0x0511, r1 ; 0x800511 23ad6: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23ada: 84 30 cpi r24, 0x04 ; 4 23adc: 68 f5 brcc .+90 ; 0x23b38 23ade: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 23ae2: 8b e3 ldi r24, 0x3B ; 59 23ae4: 98 e4 ldi r25, 0x48 ; 72 23ae6: 0e 94 44 72 call 0xe488 ; 0xe488 23aea: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_mmu_print); 23aee: 88 e4 ldi r24, 0x48 ; 72 23af0: 9e e4 ldi r25, 0x4E ; 78 23af2: 0e 94 44 72 call 0xe488 ; 0xe488 23af6: 6c e5 ldi r22, 0x5C ; 92 23af8: 79 e3 ldi r23, 0x39 ; 57 23afa: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_mmu_total); 23afe: 80 e4 ldi r24, 0x40 ; 64 23b00: 9e e4 ldi r25, 0x4E ; 78 23b02: 0e 94 44 72 call 0xe488 ; 0xe488 23b06: 68 e0 ldi r22, 0x08 ; 8 23b08: 7a e3 ldi r23, 0x3A ; 58 23b0a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_MATERIAL_CHANGES), lcd_menu_toolchange_stats_mmu_total); 23b0e: 8e ed ldi r24, 0xDE ; 222 23b10: 9d e4 ldi r25, 0x4D ; 77 23b12: 0e 94 44 72 call 0xe488 ; 0xe488 23b16: 6a ea ldi r22, 0xAA ; 170 23b18: 7a e3 ldi r23, 0x3A ; 58 23b1a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_END(); 23b1e: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc //! | Material changes | MSG_MATERIAL_CHANGES c=18 //! ---------------------- //! @endcode static void lcd_menu_fails_stats_mmu() { MENU_BEGIN(); 23b22: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23b26: 8f 5f subi r24, 0xFF ; 255 23b28: 80 93 11 05 sts 0x0511, r24 ; 0x800511 23b2c: 80 91 13 05 lds r24, 0x0513 ; 0x800513 23b30: 8f 5f subi r24, 0xFF ; 255 23b32: 80 93 13 05 sts 0x0513, r24 ; 0x800513 23b36: cf cf rjmp .-98 ; 0x23ad6 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(); } 23b38: 08 95 ret 00023b3a : setFilamentAction(FilamentAction::None); } /// Reset the menu stack and clear the planned filament action flag static void __attribute__((noinline)) mFilamentResetMenuStack() { menu_back(bFilamentPreheatState ? 1 : 2); 23b3a: 80 91 62 06 lds r24, 0x0662 ; 0x800662 23b3e: 81 11 cpse r24, r1 23b40: 03 c0 rjmp .+6 ; 0x23b48 23b42: 82 e0 ldi r24, 0x02 ; 2 23b44: 0d 94 36 d4 jmp 0x3a86c ; 0x3a86c 23b48: 81 e0 ldi r24, 0x01 ; 1 23b4a: fc cf rjmp .-8 ; 0x23b44 00023b4c : //! | Debug | c=18 //! @endcode //! ---------------------- //! @endcode static void lcd_support_menu() { 23b4c: ef 92 push r14 23b4e: ff 92 push r15 23b50: 0f 93 push r16 23b52: 1f 93 push r17 23b54: cf 93 push r28 23b56: 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) 23b58: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 23b5c: 88 23 and r24, r24 23b5e: 29 f0 breq .+10 ; 0x23b6a 23b60: 90 91 6d 02 lds r25, 0x026D ; 0x80026d 23b64: 92 30 cpi r25, 0x02 ; 2 23b66: 09 f0 breq .+2 ; 0x23b6a 23b68: 80 c1 rjmp .+768 ; 0x23e6a { // Menu was entered or SD card status has changed (plugged in or removed). // Initialize its status. _md->status = 1; 23b6a: 81 e0 ldi r24, 0x01 ; 1 23b6c: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 23b70: 80 91 00 17 lds r24, 0x1700 ; 0x801700 _md->is_flash_air = card.ToshibaFlashAir_isEnabled(); 23b74: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 if (_md->is_flash_air) { 23b78: 88 23 and r24, r24 23b7a: 21 f0 breq .+8 ; 0x23b84 card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed 23b7c: 89 ea ldi r24, 0xA9 ; 169 23b7e: 93 e0 ldi r25, 0x03 ; 3 23b80: 0f 94 c5 86 call 0x30d8a ; 0x30d8a { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; } MENU_BEGIN(); 23b84: 0f 94 8a d1 call 0x3a314 ; 0x3a314 23b88: 10 92 11 05 sts 0x0511, r1 ; 0x800511 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); 23b8c: 8b ed ldi r24, 0xDB ; 219 23b8e: e8 2e mov r14, r24 23b90: 80 ea ldi r24, 0xA0 ; 160 23b92: 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]); 23b94: ca ea ldi r28, 0xAA ; 170 23b96: d0 ea ldi r29, 0xA0 ; 160 23b98: 0d ea ldi r16, 0xAD ; 173 23b9a: 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(); 23b9c: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23ba0: 84 30 cpi r24, 0x04 ; 4 23ba2: 08 f0 brcs .+2 ; 0x23ba6 23ba4: 89 c1 rjmp .+786 ; 0x23eb8 23ba6: 10 92 14 05 sts 0x0514, r1 ; 0x800514 MENU_ITEM_BACK_P(_T(MSG_MAIN)); 23baa: 8b e3 ldi r24, 0x3B ; 59 23bac: 98 e4 ldi r25, 0x48 ; 72 23bae: 0e 94 44 72 call 0xe488 ; 0xe488 23bb2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR("Firmware:")); 23bb6: 8e e3 ldi r24, 0x3E ; 62 23bb8: 91 ea ldi r25, 0xA1 ; 161 23bba: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" " FW_VERSION_FULL)); 23bbe: 81 e3 ldi r24, 0x31 ; 49 23bc0: 91 ea ldi r25, 0xA1 ; 161 23bc2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" Repo:" FW_REPOSITORY)); 23bc6: 83 e2 ldi r24, 0x23 ; 35 23bc8: 91 ea ldi r25, 0xA1 ; 161 23bca: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" Hash:" FW_COMMIT_HASH)); 23bce: 83 e1 ldi r24, 0x13 ; 19 23bd0: 91 ea ldi r25, 0xA1 ; 161 23bd2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(_n("prusa3d.com"));////MSG_PRUSA3D c=18 23bd6: 86 ee ldi r24, 0xE6 ; 230 23bd8: 9e e6 ldi r25, 0x6E ; 110 23bda: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(_n("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=18 23bde: 84 ed ldi r24, 0xD4 ; 212 23be0: 9e e6 ldi r25, 0x6E ; 110 23be2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(_n("help.prusa3d.com"));////MSG_PRUSA3D_HELP c=18 23be6: 83 ec ldi r24, 0xC3 ; 195 23be8: 9e e6 ldi r25, 0x6E ; 110 23bea: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(STR_SEPARATOR); 23bee: 89 ee ldi r24, 0xE9 ; 233 23bf0: 99 e8 ldi r25, 0x89 ; 137 23bf2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE)); 23bf6: 88 e0 ldi r24, 0x08 ; 8 23bf8: 91 ea ldi r25, 0xA1 ; 161 23bfa: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(ELECTRONICS)); 23bfe: 8e ef ldi r24, 0xFE ; 254 23c00: 90 ea ldi r25, 0xA0 ; 160 23c02: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE)); 23c06: 84 ef ldi r24, 0xF4 ; 244 23c08: 90 ea ldi r25, 0xA0 ; 160 23c0a: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(STR_SEPARATOR); 23c0e: 89 ee ldi r24, 0xE9 ; 233 23c10: 99 e8 ldi r25, 0x89 ; 137 23c12: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(_T(MSG_DATE)); 23c16: 85 ee ldi r24, 0xE5 ; 229 23c18: 9e e4 ldi r25, 0x4E ; 78 23c1a: 0e 94 44 72 call 0xe488 ; 0xe488 23c1e: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(SOURCE_DATE_EPOCH)); 23c22: 89 ee ldi r24, 0xE9 ; 233 23c24: 90 ea ldi r25, 0xA0 ; 160 23c26: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 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); 23c2a: 89 ee ldi r24, 0xE9 ; 233 23c2c: 99 e8 ldi r25, 0x89 ; 137 23c2e: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if (MMU2::mmu2.Enabled()) 23c32: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 23c36: 81 30 cpi r24, 0x01 ; 1 23c38: 09 f0 breq .+2 ; 0x23c3c 23c3a: 39 c1 rjmp .+626 ; 0x23eae { MENU_ITEM_BACK_P(_T(MSG_MMU_CONNECTED)); 23c3c: 85 ed ldi r24, 0xD5 ; 213 23c3e: 9e e4 ldi r25, 0x4E ; 78 23c40: 0e 94 44 72 call 0xe488 ; 0xe488 23c44: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" FW:")); ////c=17 23c48: 84 ee ldi r24, 0xE4 ; 228 23c4a: 90 ea ldi r25, 0xA0 ; 160 23c4c: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if (((menu_item - 1) == menu_line) && lcd_draw_update) 23c50: 80 91 14 05 lds r24, 0x0514 ; 0x800514 23c54: 81 50 subi r24, 0x01 ; 1 23c56: 99 0b sbc r25, r25 23c58: 20 91 13 05 lds r18, 0x0513 ; 0x800513 23c5c: 28 17 cp r18, r24 23c5e: 19 06 cpc r1, r25 23c60: 49 f5 brne .+82 ; 0x23cb4 23c62: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 23c66: 88 23 and r24, r24 23c68: 29 f1 breq .+74 ; 0x23cb4 { lcd_set_cursor(6, menu_row); 23c6a: 60 91 11 05 lds r22, 0x0511 ; 0x800511 23c6e: 86 e0 ldi r24, 0x06 ; 6 23c70: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 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) { 23c74: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 23c78: 81 30 cpi r24, 0x01 ; 1 23c7a: 09 f0 breq .+2 ; 0x23c7e 23c7c: 11 c1 rjmp .+546 ; 0x23ea0 23c7e: 80 91 99 13 lds r24, 0x1399 ; 0x801399 23c82: 90 91 9a 13 lds r25, 0x139A ; 0x80139a 23c86: 20 91 9b 13 lds r18, 0x139B ; 0x80139b MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion(); if (mmu_version.major > 0) 23c8a: 88 23 and r24, r24 23c8c: 09 f4 brne .+2 ; 0x23c90 23c8e: 08 c1 rjmp .+528 ; 0x23ea0 lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build); 23c90: 1f 92 push r1 23c92: 2f 93 push r18 23c94: 1f 92 push r1 23c96: 9f 93 push r25 23c98: 1f 92 push r1 23c9a: 8f 93 push r24 23c9c: ff 92 push r15 23c9e: ef 92 push r14 23ca0: 0e 94 51 6e call 0xdca2 ; 0xdca2 23ca4: 8d b7 in r24, 0x3d ; 61 23ca6: 9e b7 in r25, 0x3e ; 62 23ca8: 08 96 adiw r24, 0x08 ; 8 23caa: 0f b6 in r0, 0x3f ; 63 23cac: f8 94 cli 23cae: 9e bf out 0x3e, r25 ; 62 23cb0: 0f be out 0x3f, r0 ; 63 23cb2: 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) { 23cb4: 80 91 a8 03 lds r24, 0x03A8 ; 0x8003a8 23cb8: 88 23 and r24, r24 23cba: 09 f4 brne .+2 ; 0x23cbe 23cbc: 40 c0 rjmp .+128 ; 0x23d3e MENU_ITEM_BACK_P(STR_SEPARATOR); 23cbe: 89 ee ldi r24, 0xE9 ; 233 23cc0: 99 e8 ldi r25, 0x89 ; 137 23cc2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:")); ////MSG_FLASHAIR c=18 23cc6: 8a eb ldi r24, 0xBA ; 186 23cc8: 90 ea ldi r25, 0xA0 ; 160 23cca: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" ")); 23cce: 88 eb ldi r24, 0xB8 ; 184 23cd0: 90 ea ldi r25, 0xA0 ; 160 23cd2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if (((menu_item - 1) == menu_line) && lcd_draw_update) { 23cd6: 80 91 14 05 lds r24, 0x0514 ; 0x800514 23cda: 81 50 subi r24, 0x01 ; 1 23cdc: 99 0b sbc r25, r25 23cde: 20 91 13 05 lds r18, 0x0513 ; 0x800513 23ce2: 28 17 cp r18, r24 23ce4: 19 06 cpc r1, r25 23ce6: 59 f5 brne .+86 ; 0x23d3e 23ce8: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 23cec: 88 23 and r24, r24 23cee: 39 f1 breq .+78 ; 0x23d3e lcd_set_cursor(2, menu_row); 23cf0: 60 91 11 05 lds r22, 0x0511 ; 0x800511 23cf4: 82 e0 ldi r24, 0x02 ; 2 23cf6: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 23cfa: 80 91 ac 03 lds r24, 0x03AC ; 0x8003ac 23cfe: 1f 92 push r1 23d00: 8f 93 push r24 23d02: 80 91 ab 03 lds r24, 0x03AB ; 0x8003ab 23d06: 1f 92 push r1 23d08: 8f 93 push r24 23d0a: 80 91 aa 03 lds r24, 0x03AA ; 0x8003aa 23d0e: 1f 92 push r1 23d10: 8f 93 push r24 23d12: 80 91 a9 03 lds r24, 0x03A9 ; 0x8003a9 23d16: 1f 92 push r1 23d18: 8f 93 push r24 23d1a: df 93 push r29 23d1c: cf 93 push r28 23d1e: 1f 93 push r17 23d20: 0f 93 push r16 23d22: 0f 94 27 db call 0x3b64e ; 0x3b64e ip4_to_str(_md->ip_str, (uint8_t*)(&_md->ip)); lcd_print(_md->ip_str); 23d26: 8d ea ldi r24, 0xAD ; 173 23d28: 93 e0 ldi r25, 0x03 ; 3 23d2a: 0e 94 7f 70 call 0xe0fe ; 0xe0fe 23d2e: 8d b7 in r24, 0x3d ; 61 23d30: 9e b7 in r25, 0x3e ; 62 23d32: 0c 96 adiw r24, 0x0c ; 12 23d34: 0f b6 in r0, 0x3f ; 63 23d36: f8 94 cli 23d38: 9e bf out 0x3e, r25 ; 62 23d3a: 0f be out 0x3f, r0 ; 63 23d3c: 8d bf out 0x3d, r24 ; 61 } } // Show the printer IP address, if it is available. if (IP_address) { 23d3e: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 23d42: 90 91 5e 06 lds r25, 0x065E ; 0x80065e 23d46: a0 91 5f 06 lds r26, 0x065F ; 0x80065f 23d4a: b0 91 60 06 lds r27, 0x0660 ; 0x800660 23d4e: 89 2b or r24, r25 23d50: 8a 2b or r24, r26 23d52: 8b 2b or r24, r27 23d54: 09 f4 brne .+2 ; 0x23d58 23d56: 42 c0 rjmp .+132 ; 0x23ddc MENU_ITEM_BACK_P(STR_SEPARATOR); 23d58: 89 ee ldi r24, 0xE9 ; 233 23d5a: 99 e8 ldi r25, 0x89 ; 137 23d5c: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(_T(MSG_PRINTER_IP)); 23d60: 88 eb ldi r24, 0xB8 ; 184 23d62: 9e e4 ldi r25, 0x4E ; 78 23d64: 0e 94 44 72 call 0xe488 ; 0xe488 23d68: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_BACK_P(PSTR(" ")); 23d6c: 86 eb ldi r24, 0xB6 ; 182 23d6e: 90 ea ldi r25, 0xA0 ; 160 23d70: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa if (((menu_item - 1) == menu_line) && lcd_draw_update) { 23d74: 80 91 14 05 lds r24, 0x0514 ; 0x800514 23d78: 81 50 subi r24, 0x01 ; 1 23d7a: 99 0b sbc r25, r25 23d7c: 20 91 13 05 lds r18, 0x0513 ; 0x800513 23d80: 28 17 cp r18, r24 23d82: 19 06 cpc r1, r25 23d84: 59 f5 brne .+86 ; 0x23ddc 23d86: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 23d8a: 88 23 and r24, r24 23d8c: 39 f1 breq .+78 ; 0x23ddc lcd_set_cursor(2, menu_row); 23d8e: 60 91 11 05 lds r22, 0x0511 ; 0x800511 23d92: 82 e0 ldi r24, 0x02 ; 2 23d94: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 23d98: 80 91 60 06 lds r24, 0x0660 ; 0x800660 23d9c: 1f 92 push r1 23d9e: 8f 93 push r24 23da0: 80 91 5f 06 lds r24, 0x065F ; 0x80065f 23da4: 1f 92 push r1 23da6: 8f 93 push r24 23da8: 80 91 5e 06 lds r24, 0x065E ; 0x80065e 23dac: 1f 92 push r1 23dae: 8f 93 push r24 23db0: 80 91 5d 06 lds r24, 0x065D ; 0x80065d 23db4: 1f 92 push r1 23db6: 8f 93 push r24 23db8: df 93 push r29 23dba: cf 93 push r28 23dbc: 1f 93 push r17 23dbe: 0f 93 push r16 23dc0: 0f 94 27 db call 0x3b64e ; 0x3b64e ip4_to_str(_md->ip_str, (uint8_t*)(&IP_address)); lcd_print(_md->ip_str); 23dc4: 8d ea ldi r24, 0xAD ; 173 23dc6: 93 e0 ldi r25, 0x03 ; 3 23dc8: 0e 94 7f 70 call 0xe0fe ; 0xe0fe 23dcc: 8d b7 in r24, 0x3d ; 61 23dce: 9e b7 in r25, 0x3e ; 62 23dd0: 0c 96 adiw r24, 0x0c ; 12 23dd2: 0f b6 in r0, 0x3f ; 63 23dd4: f8 94 cli 23dd6: 9e bf out 0x3e, r25 ; 62 23dd8: 0f be out 0x3f, r0 ; 63 23dda: 8d bf out 0x3d, r24 ; 61 } } MENU_ITEM_BACK_P(STR_SEPARATOR); 23ddc: 89 ee ldi r24, 0xE9 ; 233 23dde: 99 e8 ldi r25, 0x89 ; 137 23de0: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_SUBMENU_P(_T(MSG_XYZ_DETAILS), lcd_menu_xyz_y_min); 23de4: 85 ea ldi r24, 0xA5 ; 165 23de6: 9e e4 ldi r25, 0x4E ; 78 23de8: 0e 94 44 72 call 0xe488 ; 0xe488 23dec: 62 e8 ldi r22, 0x82 ; 130 23dee: 79 e3 ldi r23, 0x39 ; 57 23df0: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_INFO_EXTRUDER), lcd_menu_extruder_info); 23df4: 85 e9 ldi r24, 0x95 ; 149 23df6: 9e e4 ldi r25, 0x4E ; 78 23df8: 0e 94 44 72 call 0xe488 ; 0xe488 23dfc: 6c e7 ldi r22, 0x7C ; 124 23dfe: 79 e3 ldi r23, 0x39 ; 57 23e00: 0f 94 08 d4 call 0x3a810 ; 0x3a810 MENU_ITEM_SUBMENU_P(_T(MSG_INFO_SENSORS), lcd_menu_show_sensors_state); 23e04: 87 e8 ldi r24, 0x87 ; 135 23e06: 9e e4 ldi r25, 0x4E ; 78 23e08: 0e 94 44 72 call 0xe488 ; 0xe488 23e0c: 60 ee ldi r22, 0xE0 ; 224 23e0e: 73 ee ldi r23, 0xE3 ; 227 23e10: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #ifdef TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_BELT_STATUS), lcd_menu_belt_status); 23e14: 89 e7 ldi r24, 0x79 ; 121 23e16: 9e e4 ldi r25, 0x4E ; 78 23e18: 0e 94 44 72 call 0xe488 ; 0xe488 23e1c: 68 eb ldi r22, 0xB8 ; 184 23e1e: 7a e3 ldi r23, 0x3A ; 58 23e20: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //TMC2130 MENU_ITEM_SUBMENU_P(_T(MSG_MENU_TEMPERATURES), lcd_menu_temperatures); 23e24: 8a e6 ldi r24, 0x6A ; 106 23e26: 9e e4 ldi r25, 0x4E ; 78 23e28: 0e 94 44 72 call 0xe488 ; 0xe488 23e2c: 64 ec ldi r22, 0xC4 ; 196 23e2e: 79 e3 ldi r23, 0x39 ; 57 23e30: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) MENU_ITEM_SUBMENU_P(_T(MSG_MENU_VOLTAGES), lcd_menu_voltages); 23e34: 8f e5 ldi r24, 0x5F ; 95 23e36: 9e e4 ldi r25, 0x4E ; 78 23e38: 0e 94 44 72 call 0xe488 ; 0xe488 23e3c: 66 e8 ldi r22, 0x86 ; 134 23e3e: 7a e3 ldi r23, 0x3A ; 58 23e40: 0f 94 08 d4 call 0x3a810 ; 0x3a810 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN #ifdef MENU_DUMP MENU_ITEM_FUNCTION_P(_n("Dump memory"), lcd_dump_memory); 23e44: 68 ec ldi r22, 0xC8 ; 200 23e46: 79 e3 ldi r23, 0x39 ; 57 23e48: 87 eb ldi r24, 0xB7 ; 183 23e4a: 9e e6 ldi r25, 0x6E ; 110 23e4c: 0f 94 07 d1 call 0x3a20e ; 0x3a20e 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(); 23e50: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; } MENU_BEGIN(); 23e54: 80 91 11 05 lds r24, 0x0511 ; 0x800511 23e58: 8f 5f subi r24, 0xFF ; 255 23e5a: 80 93 11 05 sts 0x0511, r24 ; 0x800511 23e5e: 80 91 13 05 lds r24, 0x0513 ; 0x800513 23e62: 8f 5f subi r24, 0xFF ; 255 23e64: 80 93 13 05 sts 0x0513, r24 ; 0x800513 23e68: 99 ce rjmp .-718 ; 0x23b9c _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) 23e6a: 90 91 a8 03 lds r25, 0x03A8 ; 0x8003a8 23e6e: 99 23 and r25, r25 23e70: 09 f4 brne .+2 ; 0x23e74 23e72: 88 ce rjmp .-752 ; 0x23b84 23e74: 40 91 a9 03 lds r20, 0x03A9 ; 0x8003a9 23e78: 50 91 aa 03 lds r21, 0x03AA ; 0x8003aa 23e7c: 60 91 ab 03 lds r22, 0x03AB ; 0x8003ab 23e80: 70 91 ac 03 lds r23, 0x03AC ; 0x8003ac 23e84: 45 2b or r20, r21 23e86: 46 2b or r20, r22 23e88: 47 2b or r20, r23 23e8a: 09 f0 breq .+2 ; 0x23e8e 23e8c: 7b ce rjmp .-778 ; 0x23b84 23e8e: 8f 5f subi r24, 0xFF ; 255 23e90: 80 31 cpi r24, 0x10 ; 16 23e92: 19 f0 breq .+6 ; 0x23e9a 23e94: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 23e98: 75 ce rjmp .-790 ; 0x23b84 { // Waiting for the FlashAir card to get an IP address from a router. Force an update. _md->status = 0; 23e9a: 10 92 a7 03 sts 0x03A7, r1 ; 0x8003a7 23e9e: 72 ce rjmp .-796 ; 0x23b84 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)); 23ea0: 8b ec ldi r24, 0xCB ; 203 23ea2: 9e e4 ldi r25, 0x4E ; 78 23ea4: 0e 94 44 72 call 0xe488 ; 0xe488 23ea8: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 23eac: 03 cf rjmp .-506 ; 0x23cb4 } } else MENU_ITEM_BACK_P(PSTR("MMU N/A")); 23eae: 8c ec ldi r24, 0xCC ; 204 23eb0: 90 ea ldi r25, 0xA0 ; 160 23eb2: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 23eb6: fe ce rjmp .-516 ; 0x23cb4 #endif //EMERGENCY_HANDLERS MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18 #endif /* DEBUG_BUILD */ MENU_END(); } 23eb8: df 91 pop r29 23eba: cf 91 pop r28 23ebc: 1f 91 pop r17 23ebe: 0f 91 pop r16 23ec0: ff 90 pop r15 23ec2: ef 90 pop r14 23ec4: 08 95 ret 00023ec6 : { 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) { 23ec6: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 23eca: 81 11 cpse r24, r1 23ecc: 19 c0 rjmp .+50 ; 0x23f00 lcd_clear(); 23ece: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_P(_T(MSG_MATERIAL_CHANGES)); /// MSG_MATERIAL_CHANGES c=18 23ed2: 8e ed ldi r24, 0xDE ; 222 23ed4: 9d e4 ldi r25, 0x4D ; 77 23ed6: 0e 94 44 72 call 0xe488 ; 0xe488 23eda: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_putc(':'); 23ede: 8a e3 ldi r24, 0x3A ; 58 23ee0: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_set_cursor(10, 1); 23ee4: 61 e0 ldi r22, 0x01 ; 1 23ee6: 8a e0 ldi r24, 0x0A ; 10 23ee8: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print(eeprom_read_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES)); 23eec: 88 ea ldi r24, 0xA8 ; 168 23eee: 9c e0 ldi r25, 0x0C ; 12 23ef0: 0f 94 18 dc call 0x3b830 ; 0x3b830 void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); else lcd_printNumber(n, base); 23ef4: 4a e0 ldi r20, 0x0A ; 10 23ef6: 0e 94 cc 6f call 0xdf98 ; 0xdf98 _md->initialized = true; 23efa: 81 e0 ldi r24, 0x01 ; 1 23efc: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 } menu_back_if_clicked(); 23f00: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 00023f04 : #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 23f04: 0e 94 24 6f call 0xde48 ; 0xde48 lcd_status_message_idx = 0; // Re-draw message from beginning 23f08: 10 92 1d 05 sts 0x051D, r1 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> } void lcd_return_to_status() { lcdui_refresh(); // to maybe revive the LCD if static electricity killed it. menu_goto(lcd_status_screen, 0, true); 23f0c: 20 e0 ldi r18, 0x00 ; 0 23f0e: 41 e0 ldi r20, 0x01 ; 1 23f10: 70 e0 ldi r23, 0x00 ; 0 23f12: 60 e0 ldi r22, 0x00 ; 0 23f14: 88 e0 ldi r24, 0x08 ; 8 23f16: 99 e3 ldi r25, 0x39 ; 57 23f18: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 menu_depth = 0; 23f1c: 10 92 f7 03 sts 0x03F7, r1 ; 0x8003f7 eFilamentAction = FilamentAction::None; // i.e. non-autoLoad 23f20: 10 92 a5 03 sts 0x03A5, r1 ; 0x8003a5 } 23f24: 08 95 ret 00023f26 : //! | | //! ---------------------- //! @endcode void pid_extruder() { lcd_clear(); 23f26: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_SET_TEMPERATURE)); 23f2a: 8f e1 ldi r24, 0x1F ; 31 23f2c: 91 e5 ldi r25, 0x51 ; 81 23f2e: 0e 94 44 72 call 0xe488 ; 0xe488 23f32: ac 01 movw r20, r24 23f34: 60 e0 ldi r22, 0x00 ; 0 23f36: 80 e0 ldi r24, 0x00 ; 0 23f38: 0e 94 8c 6e call 0xdd18 ; 0xdd18 pid_temp += lcd_encoder; 23f3c: 80 91 4b 02 lds r24, 0x024B ; 0x80024b <_ZL8pid_temp.lto_priv.443> 23f40: 90 91 4c 02 lds r25, 0x024C ; 0x80024c <_ZL8pid_temp.lto_priv.443+0x1> 23f44: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 23f48: 30 91 70 06 lds r19, 0x0670 ; 0x800670 23f4c: 82 0f add r24, r18 23f4e: 93 1f adc r25, r19 if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP; 23f50: 82 33 cpi r24, 0x32 ; 50 23f52: 21 e0 ldi r18, 0x01 ; 1 23f54: 92 07 cpc r25, r18 23f56: 50 f1 brcs .+84 ; 0x23fac 23f58: 81 e3 ldi r24, 0x31 ; 49 23f5a: 91 e0 ldi r25, 0x01 ; 1 else if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP; 23f5c: 90 93 4c 02 sts 0x024C, r25 ; 0x80024c <_ZL8pid_temp.lto_priv.443+0x1> 23f60: 80 93 4b 02 sts 0x024B, r24 ; 0x80024b <_ZL8pid_temp.lto_priv.443> lcd_encoder = 0; 23f64: 10 92 70 06 sts 0x0670, r1 ; 0x800670 23f68: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f lcd_set_cursor(1, 2); 23f6c: 62 e0 ldi r22, 0x02 ; 2 23f6e: 81 e0 ldi r24, 0x01 ; 1 23f70: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%3u"), pid_temp); 23f74: 80 91 4c 02 lds r24, 0x024C ; 0x80024c <_ZL8pid_temp.lto_priv.443+0x1> 23f78: 8f 93 push r24 23f7a: 80 91 4b 02 lds r24, 0x024B ; 0x80024b <_ZL8pid_temp.lto_priv.443> 23f7e: 8f 93 push r24 23f80: 8b e9 ldi r24, 0x9B ; 155 23f82: 92 ea ldi r25, 0xA2 ; 162 23f84: 9f 93 push r25 23f86: 8f 93 push r24 23f88: 0e 94 51 6e call 0xdca2 ; 0xdca2 if (lcd_clicked()) { 23f8c: 0e 94 95 70 call 0xe12a ; 0xe12a 23f90: 0f 90 pop r0 23f92: 0f 90 pop r0 23f94: 0f 90 pop r0 23f96: 0f 90 pop r0 23f98: 88 23 and r24, r24 23f9a: 71 f0 breq .+28 ; 0x23fb8 lcd_commands_type = LcdCommands::PidExtruder; 23f9c: 83 e0 ldi r24, 0x03 ; 3 23f9e: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 lcd_return_to_status(); 23fa2: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_update(2); 23fa6: 82 e0 ldi r24, 0x02 ; 2 23fa8: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e { 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; 23fac: 8a 30 cpi r24, 0x0A ; 10 23fae: 91 05 cpc r25, r1 23fb0: a8 f6 brcc .-86 ; 0x23f5c 23fb2: 8a e0 ldi r24, 0x0A ; 10 23fb4: 90 e0 ldi r25, 0x00 ; 0 23fb6: d2 cf rjmp .-92 ; 0x23f5c lcd_commands_type = LcdCommands::PidExtruder; lcd_return_to_status(); lcd_update(2); } } 23fb8: 08 95 ret 00023fba : } 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){ 23fba: 0f 93 push r16 23fbc: 1f 93 push r17 23fbe: cf 93 push r28 23fc0: df 93 push r29 23fc2: ec 01 movw r28, r24 23fc4: cb 01 movw r24, r22 23fc6: ba 01 movw r22, r20 static const char m1[] PROGMEM = "Please restart"; switch(state){ 23fc8: 4a 81 ldd r20, Y+2 ; 0x02 23fca: 41 30 cpi r20, 0x01 ; 1 23fcc: 29 f0 breq .+10 ; 0x23fd8 23fce: 88 f0 brcs .+34 ; 0x23ff2 23fd0: 42 30 cpi r20, 0x02 ; 2 23fd2: 09 f1 breq .+66 ; 0x24016 23fd4: 43 30 cpi r20, 0x03 ; 3 23fd6: d1 f4 brne .+52 ; 0x2400c 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 ){ 23fd8: 8b 81 ldd r24, Y+3 ; 0x03 23fda: 81 11 cpse r24, r1 23fdc: 25 c0 rjmp .+74 ; 0x24028 state = next_state; // advance to the next state 23fde: 82 e0 ldi r24, 0x02 ; 2 23fe0: 8a 83 std Y+2, r24 ; 0x02 lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL); 23fe2: 63 e0 ldi r22, 0x03 ; 3 23fe4: 84 ed ldi r24, 0xD4 ; 212 23fe6: 9d e9 ldi r25, 0x9D ; 157 23fe8: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too 23fec: 85 e0 ldi r24, 0x05 ; 5 } else { --repeat; 23fee: 8b 83 std Y+3, r24 ; 0x03 23ff0: 0d c0 rjmp .+26 ; 0x2400c //! @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 ){ 23ff2: a9 01 movw r20, r18 23ff4: 98 01 movw r18, r16 23ff6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 23ffa: 18 16 cp r1, r24 23ffc: 3c f4 brge .+14 ; 0x2400c lcd_setalertstatuspgm(m2, LCD_STATUS_CRITICAL); 23ffe: 63 e0 ldi r22, 0x03 ; 3 24000: 88 81 ld r24, Y 24002: 99 81 ldd r25, Y+1 ; 0x01 24004: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac state = States::TempAboveMintemp; 24008: 81 e0 ldi r24, 0x01 ; 1 2400a: 8a 83 std Y+2, r24 ; 0x02 break; case States::ShowPleaseRestart: // displaying "Please restart" substep(m2, States::ShowMintemp); break; } } 2400c: df 91 pop r29 2400e: cf 91 pop r28 24010: 1f 91 pop r17 24012: 0f 91 pop r16 24014: 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 ){ 24016: 8b 81 ldd r24, Y+3 ; 0x03 24018: 81 11 cpse r24, r1 2401a: 06 c0 rjmp .+12 ; 0x24028 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); 2401c: 88 81 ld r24, Y 2401e: 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 24020: 23 e0 ldi r18, 0x03 ; 3 24022: 2a 83 std Y+2, r18 ; 0x02 lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL); 24024: 63 e0 ldi r22, 0x03 ; 3 24026: e0 cf rjmp .-64 ; 0x23fe8 repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too } else { --repeat; 24028: 81 50 subi r24, 0x01 ; 1 2402a: e1 cf rjmp .-62 ; 0x23fee 0002402c : } } static void temp_runaway_stop(bool isPreheat, bool isBed) { 2402c: cf 93 push r28 if(IsStopped() == false) { 2402e: 90 91 10 05 lds r25, 0x0510 ; 0x800510 24032: 91 11 cpse r25, r1 24034: 18 c0 rjmp .+48 ; 0x24066 24036: c6 2f mov r28, r22 if (isPreheat) { 24038: 88 23 and r24, r24 2403a: c9 f0 breq .+50 ; 0x2406e lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL); 2403c: 88 e7 ldi r24, 0x78 ; 120 2403e: 9d e9 ldi r25, 0x9D ; 157 24040: 66 23 and r22, r22 24042: 11 f0 breq .+4 ; 0x24048 24044: 86 e8 ldi r24, 0x86 ; 134 24046: 9d e9 ldi r25, 0x9D ; 157 24048: 63 e0 ldi r22, 0x03 ; 3 2404a: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac SERIAL_ERROR_START; 2404e: 8a ec ldi r24, 0xCA ; 202 24050: 9a ea ldi r25, 0xAA ; 170 24052: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (isBed) { SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)"); 24056: 85 e5 ldi r24, 0x55 ; 85 24058: 9d e9 ldi r25, 0x9D ; 157 { if(IsStopped() == false) { if (isPreheat) { lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL); SERIAL_ERROR_START; if (isBed) { 2405a: c1 11 cpse r28, r1 2405c: 02 c0 rjmp .+4 ; 0x24062 SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)"); } else { SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)"); 2405e: 83 e3 ldi r24, 0x33 ; 51 24060: 9d e9 ldi r25, 0x9D ; 157 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"); 24062: 0e 94 13 79 call 0xf226 ; 0xf226 } } prusa_statistics(0); prusa_statistics(isPreheat? 91 : 90); } ThermalStop(); 24066: 80 e0 ldi r24, 0x00 ; 0 } 24068: cf 91 pop r28 } } prusa_statistics(0); prusa_statistics(isPreheat? 91 : 90); } ThermalStop(); 2406a: 0c 94 44 79 jmp 0xf288 ; 0xf288 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); 2406e: 8f e0 ldi r24, 0x0F ; 15 24070: 9d e9 ldi r25, 0x9D ; 157 24072: 66 23 and r22, r22 24074: 11 f0 breq .+4 ; 0x2407a 24076: 8f e1 ldi r24, 0x1F ; 31 24078: 9d e9 ldi r25, 0x9D ; 157 2407a: 63 e0 ldi r22, 0x03 ; 3 2407c: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac SERIAL_ERROR_START; 24080: 8a ec ldi r24, 0xCA ; 202 24082: 9a ea ldi r25, 0xAA ; 170 24084: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (isBed) { SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY"); 24088: 86 ef ldi r24, 0xF6 ; 246 2408a: 9c e9 ldi r25, 0x9C ; 156 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) { 2408c: c1 11 cpse r28, r1 2408e: e9 cf rjmp .-46 ; 0x24062 SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY"); } else { SERIAL_ERRORLNPGM(" HOTEND THERMAL RUNAWAY"); 24090: 8e ed ldi r24, 0xDE ; 222 24092: 9c e9 ldi r25, 0x9C ; 156 24094: e6 cf rjmp .-52 ; 0x24062 00024096 : static void Sound_DoSound_Prompt(void) { backlight_wake(2); 24096: 82 e0 ldi r24, 0x02 ; 2 24098: 0e 94 0d 8a call 0x1141a ; 0x1141a WRITE(BEEPER,HIGH); 2409c: 9f b7 in r25, 0x3f ; 63 2409e: f8 94 cli 240a0: e2 e0 ldi r30, 0x02 ; 2 240a2: f1 e0 ldi r31, 0x01 ; 1 240a4: 80 81 ld r24, Z 240a6: 84 60 ori r24, 0x04 ; 4 240a8: 80 83 st Z, r24 240aa: 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); 240ac: 2f ef ldi r18, 0xFF ; 255 240ae: 89 e6 ldi r24, 0x69 ; 105 240b0: 98 e1 ldi r25, 0x18 ; 24 240b2: 21 50 subi r18, 0x01 ; 1 240b4: 80 40 sbci r24, 0x00 ; 0 240b6: 90 40 sbci r25, 0x00 ; 0 240b8: e1 f7 brne .-8 ; 0x240b2 240ba: 00 c0 rjmp .+0 ; 0x240bc 240bc: 00 00 nop _delay_ms(500); WRITE(BEEPER,LOW); 240be: 9f b7 in r25, 0x3f ; 63 240c0: f8 94 cli 240c2: 80 81 ld r24, Z 240c4: 8b 7f andi r24, 0xFB ; 251 240c6: 80 83 st Z, r24 240c8: 9f bf out 0x3f, r25 ; 63 } 240ca: 08 95 ret 000240cc : } #endif // not defined TMC2130 static void lcd_print_state(uint8_t state) { switch (state) { 240cc: 81 30 cpi r24, 0x01 ; 1 240ce: 21 f4 brne .+8 ; 0x240d8 case STATE_ON: lcd_puts_P(_N(" 1")); 240d0: 8d e8 ldi r24, 0x8D ; 141 240d2: 9f e6 ldi r25, 0x6F ; 111 break; case STATE_OFF: lcd_puts_P(_N(" 0")); 240d4: 0c 94 63 6e jmp 0xdcc6 ; 0xdcc6 240d8: 89 e8 ldi r24, 0x89 ; 137 240da: 9f e6 ldi r25, 0x6F ; 111 240dc: fb cf rjmp .-10 ; 0x240d4 000240de : //! @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) { 240de: cf 92 push r12 240e0: df 92 push r13 240e2: ef 92 push r14 240e4: ff 92 push r15 240e6: 0f 93 push r16 240e8: 1f 93 push r17 240ea: cf 93 push r28 240ec: df 93 push r29 240ee: d8 2f mov r29, r24 240f0: 6b 01 movw r12, r22 240f2: 7a 01 movw r14, r20 240f4: c2 2f mov r28, r18 lcd_putc_at(0, 3, selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' '); 240f6: 40 e2 ldi r20, 0x20 ; 32 240f8: 81 11 cpse r24, r1 240fa: 01 c0 rjmp .+2 ; 0x240fe 240fc: 4e e3 ldi r20, 0x3E ; 62 240fe: 63 e0 ldi r22, 0x03 ; 3 24100: 80 e0 ldi r24, 0x00 ; 0 24102: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_puts_P(first_choice); 24106: c6 01 movw r24, r12 24108: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_putc_at(second_col, 3, selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 2410c: 40 e2 ldi r20, 0x20 ; 32 2410e: d1 30 cpi r29, 0x01 ; 1 24110: 09 f4 brne .+2 ; 0x24114 24112: 4e e3 ldi r20, 0x3E ; 62 24114: 63 e0 ldi r22, 0x03 ; 3 24116: 8c 2f mov r24, r28 24118: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_puts_P(second_choice); 2411c: c7 01 movw r24, r14 2411e: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 if (third_choice) { 24122: 01 15 cp r16, r1 24124: 11 05 cpc r17, r1 24126: 19 f1 breq .+70 ; 0x2416e 24128: c8 01 movw r24, r16 2412a: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> 2412e: d8 2e mov r13, r24 24130: c7 01 movw r24, r14 24132: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__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; 24136: 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;} 24138: 93 e1 ldi r25, 0x13 ; 19 2413a: 9d 19 sub r25, r13 2413c: 8c 0f add r24, r28 2413e: 89 17 cp r24, r25 24140: 08 f4 brcc .+2 ; 0x24144 24142: 89 2f mov r24, r25 24144: 83 31 cpi r24, 0x13 ; 19 24146: 08 f0 brcs .+2 ; 0x2414a 24148: 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 ? '>': ' '); 2414a: 40 e2 ldi r20, 0x20 ; 32 2414c: d2 30 cpi r29, 0x02 ; 2 2414e: 09 f4 brne .+2 ; 0x24152 24150: 4e e3 ldi r20, 0x3E ; 62 24152: 63 e0 ldi r22, 0x03 ; 3 24154: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_puts_P(third_choice); 24158: c8 01 movw r24, r16 } } 2415a: df 91 pop r29 2415c: cf 91 pop r28 2415e: 1f 91 pop r17 24160: 0f 91 pop r16 24162: ff 90 pop r15 24164: ef 90 pop r14 24166: df 90 pop r13 24168: 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); 2416a: 0c 94 63 6e jmp 0xdcc6 ; 0xdcc6 } } 2416e: df 91 pop r29 24170: cf 91 pop r28 24172: 1f 91 pop r17 24174: 0f 91 pop r16 24176: ff 90 pop r15 24178: ef 90 pop r14 2417a: df 90 pop r13 2417c: cf 90 pop r12 2417e: 08 95 ret 00024180 : return multi_screen ? msgend : NULL; } const char* lcd_display_message_fullscreen_P(const char *msg) { 24180: cf 93 push r28 24182: df 93 push r29 24184: ec 01 movw r28, r24 // Disable update of the screen by the usual lcd_update(0) routine. lcd_update_enable(false); 24186: 80 e0 ldi r24, 0x00 ; 0 24188: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 2418c: 0e 94 ab 6e call 0xdd56 ; 0xdd56 return lcd_display_message_fullscreen_nonBlocking_P(msg); 24190: ce 01 movw r24, r28 } 24192: df 91 pop r29 24194: 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); 24196: 0d 94 8a 15 jmp 0x22b14 ; 0x22b14 0002419a : * * This function is blocking. * @param msg message to be displayed from PROGMEM */ void lcd_show_fullscreen_message_and_wait_P(const char *msg) { 2419a: cf 92 push r12 2419c: df 92 push r13 2419e: ef 92 push r14 241a0: ff 92 push r15 241a2: 0f 93 push r16 241a4: 1f 93 push r17 241a6: cf 93 push r28 241a8: df 93 push r29 241aa: d8 2e mov r13, r24 241ac: 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) 241ae: 01 e0 ldi r16, 0x01 ; 1 241b0: 80 91 6e 02 lds r24, 0x026E ; 0x80026e 241b4: 81 11 cpse r24, r1 241b6: 01 c0 rjmp .+2 ; 0x241ba 241b8: 00 e0 ldi r16, 0x00 ; 0 { lcd_update_enabled = false; 241ba: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e LcdUpdateDisabler lcdUpdateDisabler; const char *msg_next = lcd_display_message_fullscreen_P(msg); 241be: 8d 2d mov r24, r13 241c0: 9c 2d mov r25, r12 241c2: 0f 94 c0 20 call 0x24180 ; 0x24180 241c6: 7c 01 movw r14, r24 bool multi_screen = msg_next != NULL; lcd_consume_click(); 241c8: 0e 94 90 70 call 0xe120 ; 0xe120 KEEPALIVE_STATE(PAUSED_FOR_USER); 241cc: 84 e0 ldi r24, 0x04 ; 4 241ce: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be * @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); 241d2: 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) { 241d4: 20 97 sbiw r28, 0x00 ; 0 241d6: 29 f4 brne .+10 ; 0x241e2 // Display the confirm char. lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]); 241d8: 49 e8 ldi r20, 0x89 ; 137 241da: 63 e0 ldi r22, 0x03 ; 3 241dc: 83 e1 ldi r24, 0x13 ; 19 241de: 0e 94 98 6e call 0xdd30 ; 0xdd30 * @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); 241e2: 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); 241e4: 82 e3 ldi r24, 0x32 ; 50 241e6: 90 e0 ldi r25, 0x00 ; 0 241e8: 0e 94 84 8c call 0x11908 ; 0x11908 if (lcd_clicked()) { 241ec: 0e 94 95 70 call 0xe12a ; 0xe12a 241f0: 88 23 and r24, r24 241f2: 81 f0 breq .+32 ; 0x24214 if (msg_next == NULL) { 241f4: 20 97 sbiw r28, 0x00 ; 0 241f6: 81 f4 brne .+32 ; 0x24218 KEEPALIVE_STATE(IN_HANDLER); 241f8: 82 e0 ldi r24, 0x02 ; 2 241fa: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be } ~LcdUpdateDisabler() { lcd_update_enabled = m_updateEnabled; 241fe: 00 93 6e 02 sts 0x026E, r16 ; 0x80026e if (msg_next == NULL) msg_next = msg; msg_next = lcd_display_message_fullscreen_P(msg_next); } } } 24202: df 91 pop r29 24204: cf 91 pop r28 24206: 1f 91 pop r17 24208: 0f 91 pop r16 2420a: ff 90 pop r15 2420c: ef 90 pop r14 2420e: df 90 pop r13 24210: cf 90 pop r12 24212: 08 95 ret 24214: 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) { 24216: 31 f7 brne .-52 ; 0x241e4 else { break; } } } if (multi_screen) { 24218: e1 14 cp r14, r1 2421a: f1 04 cpc r15, r1 2421c: d9 f2 breq .-74 ; 0x241d4 if (msg_next == NULL) 2421e: 20 97 sbiw r28, 0x00 ; 0 24220: 11 f4 brne .+4 ; 0x24226 msg_next = msg; 24222: cd 2d mov r28, r13 24224: dc 2d mov r29, r12 msg_next = lcd_display_message_fullscreen_P(msg_next); 24226: ce 01 movw r24, r28 24228: 0f 94 c0 20 call 0x24180 ; 0x24180 2422c: ec 01 movw r28, r24 2422e: d2 cf rjmp .-92 ; 0x241d4 00024230 : lcd_show_fullscreen_message_and_wait_P(msg); } } } void lcd_temp_cal_show_result(bool result) { 24230: cf 93 push r28 24232: c8 2f mov r28, r24 custom_message_type = CustomMsg::Status; 24234: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 disable_x(); 24238: 17 9a sbi 0x02, 7 ; 2 2423a: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e disable_y(); 2423e: 16 9a sbi 0x02, 6 ; 2 24240: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f disable_z(); disable_e0(); 24244: 14 9a sbi 0x02, 4 ; 2 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 24246: 10 92 72 06 sts 0x0672, r1 ; 0x800672 2424a: 10 92 71 06 sts 0x0671, r1 ; 0x800671 2424e: 68 2f mov r22, r24 24250: 86 ea ldi r24, 0xA6 ; 166 24252: 9f e0 ldi r25, 0x0F ; 15 24254: 0f 94 34 dc call 0x3b868 ; 0x3b868 24258: 6c 2f mov r22, r28 2425a: 8f ea ldi r24, 0xAF ; 175 2425c: 9f e0 ldi r25, 0x0F ; 15 2425e: 0f 94 34 dc call 0x3b868 ; 0x3b868 // 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) { 24262: cc 23 and r28, r28 24264: 89 f0 breq .+34 ; 0x24288 SERIAL_ECHOLNPGM("PINDA calibration done. Continue with pressing the knob."); 24266: 8a ed ldi r24, 0xDA ; 218 24268: 92 ea ldi r25, 0xA2 ; 162 2426a: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CALIBRATION_DONE)); 2426e: 8d e4 ldi r24, 0x4D ; 77 24270: 91 e5 ldi r25, 0x51 ; 81 } else { SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob."); lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED)); 24272: 0e 94 44 72 call 0xe488 ; 0xe488 24276: 0f 94 cd 20 call 0x2419a ; 0x2419a } lcd_update_enable(true); 2427a: 81 e0 ldi r24, 0x01 ; 1 2427c: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 24280: 82 e0 ldi r24, 0x02 ; 2 } 24282: 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); 24284: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e 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."); 24288: 8f e9 ldi r24, 0x9F ; 159 2428a: 92 ea ldi r25, 0xA2 ; 162 2428c: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED)); 24290: 82 e3 ldi r24, 0x32 ; 50 24292: 91 e5 ldi r25, 0x51 ; 81 24294: ee cf rjmp .-36 ; 0x24272 00024296 : lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS)); } static void lcd_loading_progress_bar(uint16_t loading_time_ms) { 24296: 1f 93 push r17 24298: cf 93 push r28 2429a: 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); 2429c: 64 e6 ldi r22, 0x64 ; 100 2429e: 70 e0 ldi r23, 0x00 ; 0 242a0: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 242a4: 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++) { 242a6: 10 e0 ldi r17, 0x00 ; 0 lcd_putc_at(i, 3, '.'); 242a8: 4e e2 ldi r20, 0x2E ; 46 242aa: 63 e0 ldi r22, 0x03 ; 3 242ac: 81 2f mov r24, r17 242ae: 0e 94 98 6e call 0xdd30 ; 0xdd30 //loading_time_ms/20 delay for (uint_least8_t j = 0; j < 5; j++) { delay_keep_alive(loading_time_ms / 100); 242b2: ce 01 movw r24, r28 242b4: 0e 94 84 8c call 0x11908 ; 0x11908 242b8: ce 01 movw r24, r28 242ba: 0e 94 84 8c call 0x11908 ; 0x11908 242be: ce 01 movw r24, r28 242c0: 0e 94 84 8c call 0x11908 ; 0x11908 242c4: ce 01 movw r24, r28 242c6: 0e 94 84 8c call 0x11908 ; 0x11908 242ca: ce 01 movw r24, r28 242cc: 0e 94 84 8c call 0x11908 ; 0x11908 } static void lcd_loading_progress_bar(uint16_t loading_time_ms) { for (uint_least8_t i = 0; i < LCD_WIDTH; i++) { 242d0: 1f 5f subi r17, 0xFF ; 255 242d2: 14 31 cpi r17, 0x14 ; 20 242d4: 49 f7 brne .-46 ; 0x242a8 //loading_time_ms/20 delay for (uint_least8_t j = 0; j < 5; j++) { delay_keep_alive(loading_time_ms / 100); } } } 242d6: df 91 pop r29 242d8: cf 91 pop r28 242da: 1f 91 pop r17 242dc: 08 95 ret 000242de : } } } static void setFilamentAction(FilamentAction action) { eFilamentAction = action; 242de: 10 92 a5 03 sts 0x03A5, r1 ; 0x8003a5 static void __attribute__((noinline)) clearFilamentAction() { // filament action has been cancelled or completed setFilamentAction(FilamentAction::None); } 242e2: 08 95 ret 000242e4 : bFilamentPreheatState = false; mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); } void lcd_generic_preheat_menu() { 242e4: cf 93 push r28 MENU_BEGIN(); 242e6: 0f 94 8a d1 call 0x3a314 ; 0x3a314 242ea: 10 92 11 05 sts 0x0511, r1 ; 0x800511 242ee: 80 91 11 05 lds r24, 0x0511 ; 0x800511 242f2: 84 30 cpi r24, 0x04 ; 4 242f4: 08 f0 brcs .+2 ; 0x242f8 242f6: a1 c0 rjmp .+322 ; 0x2443a 242f8: 10 92 14 05 sts 0x0514, r1 ; 0x800514 if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 242fc: 8f e5 ldi r24, 0x5F ; 95 242fe: 9f e0 ldi r25, 0x0F ; 15 24300: 0f 94 10 dc call 0x3b820 ; 0x3b820 24304: 81 11 cpse r24, r1 24306: 10 c0 rjmp .+32 ; 0x24328 { ON_MENU_LEAVE( 24308: 0f 94 0a d0 call 0x3a014 ; 0x3a014 2430c: 81 11 cpse r24, r1 2430e: 0f 94 6f 21 call 0x242de ; 0x242de clearFilamentAction(); ); MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN)); 24312: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 24316: 8a 30 cpi r24, 0x0A ; 10 24318: 09 f4 brne .+2 ; 0x2431c 2431a: 8c c0 rjmp .+280 ; 0x24434 2431c: 8b e3 ldi r24, 0x3B ; 59 2431e: 98 e4 ldi r25, 0x48 ; 72 24320: 0e 94 44 72 call 0xe488 ; 0xe488 24324: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa 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(); 24328: 0f 94 10 17 call 0x22e20 ; 0x22e20 2432c: 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); 2432e: 82 e4 ldi r24, 0x42 ; 66 24330: 92 ea ldi r25, 0xA2 ; 162 24332: cc 23 and r28, r28 24334: 11 f0 breq .+4 ; 0x2433a 24336: 81 e5 ldi r24, 0x51 ; 81 24338: 92 ea ldi r25, 0xA2 ; 162 2433a: 68 e3 ldi r22, 0x38 ; 56 2433c: 7a e3 ldi r23, 0x3A ; 58 2433e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 24342: 87 e2 ldi r24, 0x27 ; 39 24344: 92 ea ldi r25, 0xA2 ; 162 24346: cc 23 and r28, r28 24348: 11 f0 breq .+4 ; 0x2434e 2434a: 86 e3 ldi r24, 0x36 ; 54 2434c: 92 ea ldi r25, 0xA2 ; 162 2434e: 6e e2 ldi r22, 0x2E ; 46 24350: 79 e3 ldi r23, 0x39 ; 57 24352: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 24356: 8b e0 ldi r24, 0x0B ; 11 24358: 92 ea ldi r25, 0xA2 ; 162 2435a: cc 23 and r28, r28 2435c: 11 f0 breq .+4 ; 0x24362 2435e: 8b e1 ldi r24, 0x1B ; 27 24360: 92 ea ldi r25, 0xA2 ; 162 24362: 68 ee ldi r22, 0xE8 ; 232 24364: 79 e3 ldi r23, 0x39 ; 57 24366: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 2436a: 8f ee ldi r24, 0xEF ; 239 2436c: 91 ea ldi r25, 0xA1 ; 161 2436e: cc 23 and r28, r28 24370: 11 f0 breq .+4 ; 0x24376 24372: 8f ef ldi r24, 0xFF ; 255 24374: 91 ea ldi r25, 0xA1 ; 161 24376: 68 ef ldi r22, 0xF8 ; 248 24378: 79 e3 ldi r23, 0x39 ; 57 2437a: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 2437e: 84 ed ldi r24, 0xD4 ; 212 24380: 91 ea ldi r25, 0xA1 ; 161 24382: cc 23 and r28, r28 24384: 11 f0 breq .+4 ; 0x2438a 24386: 83 ee ldi r24, 0xE3 ; 227 24388: 91 ea ldi r25, 0xA1 ; 161 2438a: 6e e6 ldi r22, 0x6E ; 110 2438c: 7a e3 ldi r23, 0x3A ; 58 2438e: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 24392: 89 eb ldi r24, 0xB9 ; 185 24394: 91 ea ldi r25, 0xA1 ; 161 24396: cc 23 and r28, r28 24398: 11 f0 breq .+4 ; 0x2439e 2439a: 88 ec ldi r24, 0xC8 ; 200 2439c: 91 ea ldi r25, 0xA1 ; 161 2439e: 60 e9 ldi r22, 0x90 ; 144 243a0: 7a e3 ldi r23, 0x3A ; 58 243a2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 243a6: 8d e9 ldi r24, 0x9D ; 157 243a8: 91 ea ldi r25, 0xA1 ; 161 243aa: cc 23 and r28, r28 243ac: 11 f0 breq .+4 ; 0x243b2 243ae: 8d ea ldi r24, 0xAD ; 173 243b0: 91 ea ldi r25, 0xA1 ; 161 243b2: 66 e5 ldi r22, 0x56 ; 86 243b4: 7a e3 ldi r23, 0x3A ; 58 243b6: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 243ba: 81 e8 ldi r24, 0x81 ; 129 243bc: 91 ea ldi r25, 0xA1 ; 161 243be: cc 23 and r28, r28 243c0: 11 f0 breq .+4 ; 0x243c6 243c2: 81 e9 ldi r24, 0x91 ; 145 243c4: 91 ea ldi r25, 0xA1 ; 161 243c6: 6c e5 ldi r22, 0x5C ; 92 243c8: 7a e3 ldi r23, 0x3A ; 58 243ca: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 243ce: 85 e6 ldi r24, 0x65 ; 101 243d0: 91 ea ldi r25, 0xA1 ; 161 243d2: cc 23 and r28, r28 243d4: 11 f0 breq .+4 ; 0x243da 243d6: 85 e7 ldi r24, 0x75 ; 117 243d8: 91 ea ldi r25, 0xA1 ; 161 243da: 6e ed ldi r22, 0xDE ; 222 243dc: 79 e3 ldi r23, 0x39 ; 57 243de: 0f 94 08 d4 call 0x3a810 ; 0x3a810 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); 243e2: 8a e4 ldi r24, 0x4A ; 74 243e4: 91 ea ldi r25, 0xA1 ; 161 243e6: cc 23 and r28, r28 243e8: 11 f0 breq .+4 ; 0x243ee 243ea: 89 e5 ldi r24, 0x59 ; 89 243ec: 91 ea ldi r25, 0xA1 ; 161 243ee: 66 ec ldi r22, 0xC6 ; 198 243f0: 79 e3 ldi r23, 0x39 ; 57 243f2: 0f 94 08 d4 call 0x3a810 ; 0x3a810 } if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) && eFilamentAction == FilamentAction::Preheat) MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown); 243f6: 8f e5 ldi r24, 0x5F ; 95 243f8: 9f e0 ldi r25, 0x0F ; 15 243fa: 0f 94 10 dc call 0x3b820 ; 0x3b820 243fe: 81 11 cpse r24, r1 24400: 0c c0 rjmp .+24 ; 0x2441a 24402: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 24406: 89 30 cpi r24, 0x09 ; 9 24408: 41 f4 brne .+16 ; 0x2441a 2440a: 8c e7 ldi r24, 0x7C ; 124 2440c: 9f e4 ldi r25, 0x4F ; 79 2440e: 0e 94 44 72 call 0xe488 ; 0xe488 24412: 6a e4 ldi r22, 0x4A ; 74 24414: 7a e3 ldi r23, 0x3A ; 58 24416: 0f 94 07 d1 call 0x3a20e ; 0x3a20e MENU_END(); 2441a: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); } void lcd_generic_preheat_menu() { MENU_BEGIN(); 2441e: 80 91 11 05 lds r24, 0x0511 ; 0x800511 24422: 8f 5f subi r24, 0xFF ; 255 24424: 80 93 11 05 sts 0x0511, r24 ; 0x800511 24428: 80 91 13 05 lds r24, 0x0513 ; 0x800513 2442c: 8f 5f subi r24, 0xFF ; 255 2442e: 80 93 13 05 sts 0x0513, r24 ; 0x800513 24432: 5d cf rjmp .-326 ; 0x242ee 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)); 24434: 8f e4 ldi r24, 0x4F ; 79 24436: 99 e4 ldi r25, 0x49 ; 73 24438: 73 cf rjmp .-282 ; 0x24320 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); MENU_END(); } 2443a: cf 91 pop r28 2443c: 08 95 ret 0002443e : #endif //RESUME_DEBUG //! @brief Show Preheat Menu static void lcd_preheat_menu() { eFilamentAction = FilamentAction::Preheat; 2443e: 89 e0 ldi r24, 0x09 ; 9 24440: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 lcd_generic_preheat_menu(); 24444: 0d 94 72 21 jmp 0x242e4 ; 0x242e4 00024448 : // 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); 24448: 81 e0 ldi r24, 0x01 ; 1 2444a: 0e 94 6e 6e call 0xdcdc ; 0xdcdc if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) { 2444e: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 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; 24452: 90 91 a1 13 lds r25, 0x13A1 ; 0x8013a1 24456: 93 36 cpi r25, 0x63 ; 99 24458: 09 f4 brne .+2 ; 0x2445c 2445a: 9f ef ldi r25, 0xFF ; 255 2445c: 89 13 cpse r24, r25 2445e: 0e c0 rjmp .+28 ; 0x2447c lcd_putc('F'); 24460: 86 e4 ldi r24, 0x46 ; 70 24462: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); 24466: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 2446a: 8f 3f cpi r24, 0xFF ; 255 2446c: 29 f0 breq .+10 ; 0x24478 2446e: 8f 5c subi r24, 0xCF ; 207 24470: 0e 94 67 6e call 0xdcce ; 0xdcce 24474: 83 e0 ldi r24, 0x03 ; 3 24476: 08 95 ret 24478: 8f e3 ldi r24, 0x3F ; 63 2447a: fa cf rjmp .-12 ; 0x24470 chars += 2; } else { lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1'); 2447c: 8f 3f cpi r24, 0xFF ; 255 2447e: 89 f0 breq .+34 ; 0x244a2 24480: 8f 5c subi r24, 0xCF ; 207 24482: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_putc('>'); 24486: 8e e3 ldi r24, 0x3E ; 62 24488: 0e 94 67 6e call 0xdcce ; 0xdcce 2448c: 80 91 a1 13 lds r24, 0x13A1 ; 0x8013a1 24490: 83 36 cpi r24, 0x63 ; 99 24492: 49 f0 breq .+18 ; 0x244a6 lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1'); 24494: 8f 3f cpi r24, 0xFF ; 255 24496: 39 f0 breq .+14 ; 0x244a6 24498: 8f 5c subi r24, 0xCF ; 207 2449a: 0e 94 67 6e call 0xdcce ; 0xdcce chars += 3; 2449e: 84 e0 ldi r24, 0x04 ; 4 } return chars; } 244a0: 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'); 244a2: 8f e3 ldi r24, 0x3F ; 63 244a4: ee cf rjmp .-36 ; 0x24482 lcd_putc('>'); lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1'); 244a6: 8f e3 ldi r24, 0x3F ; 63 244a8: f8 cf rjmp .-16 ; 0x2449a 000244aa : } // 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); 244aa: 5f 93 push r21 244ac: 4f 93 push r20 244ae: 7f 93 push r23 244b0: 6f 93 push r22 244b2: 28 2f mov r18, r24 244b4: 08 2e mov r0, r24 244b6: 00 0c add r0, r0 244b8: 33 0b sbc r19, r19 244ba: 3f 93 push r19 244bc: 8f 93 push r24 244be: 8a e3 ldi r24, 0x3A ; 58 244c0: 9e e6 ldi r25, 0x6E ; 110 244c2: 9f 93 push r25 244c4: 8f 93 push r24 244c6: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_space(9 - chars); 244ca: 2d b7 in r18, 0x3d ; 61 244cc: 3e b7 in r19, 0x3e ; 62 244ce: 28 5f subi r18, 0xF8 ; 248 244d0: 3f 4f sbci r19, 0xFF ; 255 244d2: 0f b6 in r0, 0x3f ; 63 244d4: f8 94 cli 244d6: 3e bf out 0x3e, r19 ; 62 244d8: 0f be out 0x3f, r0 ; 63 244da: 2d bf out 0x3d, r18 ; 61 244dc: 99 e0 ldi r25, 0x09 ; 9 244de: 98 1b sub r25, r24 244e0: 89 2f mov r24, r25 244e2: 0c 94 6e 6e jmp 0xdcdc ; 0xdcdc 000244e6 : default: return false; } } void lcd_print_target_temps_first_line() { 244e6: cf 93 push r28 244e8: df 93 push r29 lcd_home(); 244ea: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0)); 244ee: c0 91 b5 0d lds r28, 0x0DB5 ; 0x800db5 244f2: d0 91 b6 0d lds r29, 0x0DB6 ; 0x800db6 244f6: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 244fa: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 244fe: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 24502: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 24506: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2450a: ae 01 movw r20, r28 2450c: 82 e8 ldi r24, 0x82 ; 130 2450e: 0f 94 55 22 call 0x244aa ; 0x244aa lcd_set_cursor(10, 0); 24512: 60 e0 ldi r22, 0x00 ; 0 24514: 8a e0 ldi r24, 0x0A ; 10 24516: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; 2451a: c0 91 71 06 lds r28, 0x0671 ; 0x800671 2451e: d0 91 72 06 lds r29, 0x0672 ; 0x800672 int targetBedTemp = (int) degTargetBed(); if (targetBedTemp) { 24522: 20 97 sbiw r28, 0x00 ; 0 24524: 81 f0 breq .+32 ; 0x24546 lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp); 24526: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 2452a: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 2452e: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 24532: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 24536: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2453a: ae 01 movw r20, r28 2453c: 80 e8 ldi r24, 0x80 ; 128 } else { lcd_space(10); } } 2453e: df 91 pop r29 24540: 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); 24542: 0d 94 55 22 jmp 0x244aa ; 0x244aa } else { lcd_space(10); 24546: 8a e0 ldi r24, 0x0A ; 10 } } 24548: df 91 pop r29 2454a: 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); 2454c: 0c 94 6e 6e jmp 0xdcdc ; 0xdcdc 00024550 : 24550: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da } } static void mFilamentPrompt() { lcd_timeoutToStatus.stop(); lcd_print_target_temps_first_line(); 24554: 0f 94 73 22 call 0x244e6 ; 0x244e6 lcd_puts_at_P(0,1, _T(MSG_PRESS_KNOB)); 24558: 85 e1 ldi r24, 0x15 ; 21 2455a: 9f e4 ldi r25, 0x4F ; 79 2455c: 0e 94 44 72 call 0xe488 ; 0xe488 24560: ac 01 movw r20, r24 24562: 61 e0 ldi r22, 0x01 ; 1 24564: 80 e0 ldi r24, 0x00 ; 0 24566: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(0,2); 2456a: 62 e0 ldi r22, 0x02 ; 2 2456c: 80 e0 ldi r24, 0x00 ; 0 2456e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 switch(eFilamentAction) { 24572: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 24576: 83 30 cpi r24, 0x03 ; 3 24578: 81 f1 breq .+96 ; 0x245da 2457a: 48 f4 brcc .+18 ; 0x2458e 2457c: 81 30 cpi r24, 0x01 ; 1 2457e: 60 f0 brcs .+24 ; 0x24598 case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::MmuLoad: case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_TO_LOAD_FIL)); 24580: 82 e0 ldi r24, 0x02 ; 2 24582: 9f e4 ldi r25, 0x4F ; 79 break; case FilamentAction::UnLoad: case FilamentAction::MmuUnLoad: lcd_puts_P(_T(MSG_TO_UNLOAD_FIL)); 24584: 0e 94 44 72 call 0xe488 ; 0xe488 24588: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 2458c: 05 c0 rjmp .+10 ; 0x24598 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) { 2458e: 85 30 cpi r24, 0x05 ; 5 24590: 21 f1 breq .+72 ; 0x245da 24592: b0 f3 brcs .-20 ; 0x24580 24594: 88 30 cpi r24, 0x08 ; 8 24596: a1 f3 breq .-24 ; 0x24580 case FilamentAction::Preheat: case FilamentAction::Lay1Cal: break; } if(lcd_clicked() 24598: 0e 94 95 70 call 0xe12a ; 0xe12a #ifdef FILAMENT_SENSOR /// @todo leptun - add this as a specific retest item || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent()) 2459c: 81 11 cpse r24, r1 2459e: 09 c0 rjmp .+18 ; 0x245b2 245a0: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 245a4: 81 50 subi r24, 0x01 ; 1 245a6: 82 30 cpi r24, 0x02 ; 2 245a8: 28 f5 brcc .+74 ; 0x245f4 245aa: 80 91 ad 17 lds r24, 0x17AD ; 0x8017ad 245ae: 88 23 and r24, r24 245b0: 09 f1 breq .+66 ; 0x245f4 #endif //FILAMENT_SENSOR ) { menu_back(bFilamentPreheatState ? 2 : 3); 245b2: 80 91 62 06 lds r24, 0x0662 ; 0x800662 245b6: 81 11 cpse r24, r1 245b8: 13 c0 rjmp .+38 ; 0x245e0 245ba: 83 e0 ldi r24, 0x03 ; 3 245bc: 0f 94 36 d4 call 0x3a86c ; 0x3a86c switch(eFilamentAction) { 245c0: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 245c4: 82 30 cpi r24, 0x02 ; 2 245c6: 71 f0 breq .+28 ; 0x245e4 245c8: 83 30 cpi r24, 0x03 ; 3 245ca: 81 f0 breq .+32 ; 0x245ec 245cc: 81 30 cpi r24, 0x01 ; 1 245ce: 91 f4 brne .+36 ; 0x245f4 case FilamentAction::AutoLoad: // loading no longer cancellable eFilamentAction = FilamentAction::Load; [[fallthrough]]; case FilamentAction::Load: enquecommand_P(MSG_M701); // load filament 245d0: 61 e0 ldi r22, 0x01 ; 1 245d2: 82 ef ldi r24, 0xF2 ; 242 245d4: 9e e6 ldi r25, 0x6E ; 110 break; case FilamentAction::UnLoad: enquecommand_P(MSG_M702); // unload filament 245d6: 0c 94 b8 87 jmp 0x10f70 ; 0x10f70 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)); 245da: 8d ee ldi r24, 0xED ; 237 245dc: 9e e4 ldi r25, 0x4E ; 78 245de: d2 cf rjmp .-92 ; 0x24584 #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); 245e0: 82 e0 ldi r24, 0x02 ; 2 245e2: ec cf rjmp .-40 ; 0x245bc switch(eFilamentAction) { case FilamentAction::AutoLoad: // loading no longer cancellable eFilamentAction = FilamentAction::Load; 245e4: 81 e0 ldi r24, 0x01 ; 1 245e6: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 245ea: f2 cf rjmp .-28 ; 0x245d0 [[fallthrough]]; case FilamentAction::Load: enquecommand_P(MSG_M701); // load filament break; case FilamentAction::UnLoad: enquecommand_P(MSG_M702); // unload filament 245ec: 61 e0 ldi r22, 0x01 ; 1 245ee: 81 e7 ldi r24, 0x71 ; 113 245f0: 9b e6 ldi r25, 0x6B ; 107 245f2: f1 cf rjmp .-30 ; 0x245d6 case FilamentAction::Preheat: case FilamentAction::Lay1Cal: break; } } } 245f4: 08 95 ret 000245f6 <__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) { 245f6: 1f 92 push r1 245f8: 0f 92 push r0 245fa: 0f b6 in r0, 0x3f ; 63 245fc: 0f 92 push r0 245fe: 11 24 eor r1, r1 24600: 0b b6 in r0, 0x3b ; 59 24602: 0f 92 push r0 24604: 2f 93 push r18 24606: 3f 93 push r19 24608: 4f 93 push r20 2460a: 5f 93 push r21 2460c: 6f 93 push r22 2460e: 7f 93 push r23 24610: 8f 93 push r24 24612: 9f 93 push r25 24614: af 93 push r26 24616: bf 93 push r27 24618: ef 93 push r30 2461a: ff 93 push r31 if (rbuf_put(uart2_ibuf, UDR2) < 0) // put received byte to buffer 2461c: 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 24620: 80 91 3a 05 lds r24, 0x053A ; 0x80053a uint8_t buf_r = ptr[2]; //get read index 24624: 90 91 3b 05 lds r25, 0x053B ; 0x80053b _unlock(); //unlock ptr[4 + buf_w] = b; //store byte to buffer 24628: e8 2f mov r30, r24 2462a: f0 e0 ldi r31, 0x00 ; 0 2462c: e3 5c subi r30, 0xC3 ; 195 2462e: fa 4f sbci r31, 0xFA ; 250 24630: 20 83 st Z, r18 buf_w++; //incerment write index 24632: 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 24634: 20 91 39 05 lds r18, 0x0539 ; 0x800539 24638: 82 17 cp r24, r18 2463a: 08 f0 brcs .+2 ; 0x2463e <__vector_51+0x48> 2463c: 80 e0 ldi r24, 0x00 ; 0 if (buf_w == buf_r) return -1; //return -1 to signal buffer full 2463e: 98 13 cpse r25, r24 24640: 17 c0 rjmp .+46 ; 0x24670 <__vector_51+0x7a> { //rx buffer full puts_P(PSTR("USART2 rx Full!!!")); 24642: 88 e9 ldi r24, 0x98 ; 152 24644: 9f e9 ldi r25, 0x9F ; 159 24646: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 } } 2464a: ff 91 pop r31 2464c: ef 91 pop r30 2464e: bf 91 pop r27 24650: af 91 pop r26 24652: 9f 91 pop r25 24654: 8f 91 pop r24 24656: 7f 91 pop r23 24658: 6f 91 pop r22 2465a: 5f 91 pop r21 2465c: 4f 91 pop r20 2465e: 3f 91 pop r19 24660: 2f 91 pop r18 24662: 0f 90 pop r0 24664: 0b be out 0x3b, r0 ; 59 24666: 0f 90 pop r0 24668: 0f be out 0x3f, r0 ; 63 2466a: 0f 90 pop r0 2466c: 1f 90 pop r1 2466e: 18 95 reti ptr[1] = buf_w; //store write index 24670: 80 93 3a 05 sts 0x053A, r24 ; 0x80053a 24674: ea cf rjmp .-44 ; 0x2464a <__vector_51+0x54> 00024676 <__vector_45>: { WRITE(BEEPER, 1); } ISR(TIMER4_OVF_vect) { 24676: 1f 92 push r1 24678: 0f 92 push r0 2467a: 0f b6 in r0, 0x3f ; 63 2467c: 0f 92 push r0 2467e: 11 24 eor r1, r1 24680: 0b b6 in r0, 0x3b ; 59 24682: 0f 92 push r0 24684: 8f 93 push r24 24686: 9f 93 push r25 24688: ef 93 push r30 2468a: ff 93 push r31 WRITE(BEEPER, 0); 2468c: 9f b7 in r25, 0x3f ; 63 2468e: f8 94 cli 24690: e2 e0 ldi r30, 0x02 ; 2 24692: f1 e0 ldi r31, 0x01 ; 1 24694: 80 81 ld r24, Z 24696: 8b 7f andi r24, 0xFB ; 251 24698: 80 83 st Z, r24 2469a: 9f bf out 0x3f, r25 ; 63 } 2469c: ff 91 pop r31 2469e: ef 91 pop r30 246a0: 9f 91 pop r25 246a2: 8f 91 pop r24 246a4: 0f 90 pop r0 246a6: 0b be out 0x3b, r0 ; 59 246a8: 0f 90 pop r0 246aa: 0f be out 0x3f, r0 ; 63 246ac: 0f 90 pop r0 246ae: 1f 90 pop r1 246b0: 18 95 reti 000246b2 <__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) { 246b2: 1f 92 push r1 246b4: 0f 92 push r0 246b6: 0f b6 in r0, 0x3f ; 63 246b8: 0f 92 push r0 246ba: 11 24 eor r1, r1 246bc: 0b b6 in r0, 0x3b ; 59 246be: 0f 92 push r0 246c0: 8f 93 push r24 246c2: 9f 93 push r25 246c4: ef 93 push r30 246c6: ff 93 push r31 WRITE(BEEPER, 1); 246c8: 9f b7 in r25, 0x3f ; 63 246ca: f8 94 cli 246cc: e2 e0 ldi r30, 0x02 ; 2 246ce: f1 e0 ldi r31, 0x01 ; 1 246d0: 80 81 ld r24, Z 246d2: 84 60 ori r24, 0x04 ; 4 246d4: 80 83 st Z, r24 246d6: 9f bf out 0x3f, r25 ; 63 } 246d8: ff 91 pop r31 246da: ef 91 pop r30 246dc: 9f 91 pop r25 246de: 8f 91 pop r24 246e0: 0f 90 pop r0 246e2: 0b be out 0x3b, r0 ; 59 246e4: 0f 90 pop r0 246e6: 0f be out 0x3f, r0 ; 63 246e8: 0f 90 pop r0 246ea: 1f 90 pop r1 246ec: 18 95 reti 000246ee : if (cval) cval[cl] = sum / cnt; return ++cl; } bool tmc2130_home_calibrate(uint8_t axis) { 246ee: 6f 92 push r6 246f0: 7f 92 push r7 246f2: 8f 92 push r8 246f4: 9f 92 push r9 246f6: af 92 push r10 246f8: bf 92 push r11 246fa: df 92 push r13 246fc: ef 92 push r14 246fe: ff 92 push r15 24700: 0f 93 push r16 24702: 1f 93 push r17 24704: cf 93 push r28 24706: df 93 push r29 24708: cd b7 in r28, 0x3d ; 61 2470a: de b7 in r29, 0x3e ; 62 2470c: e0 97 sbiw r28, 0x30 ; 48 2470e: 0f b6 in r0, 0x3f ; 63 24710: f8 94 cli 24712: de bf out 0x3e, r29 ; 62 24714: 0f be out 0x3f, r0 ; 63 24716: cd bf out 0x3d, r28 ; 61 24718: d8 2e mov r13, r24 uint8_t step[16]; uint8_t cnt[16]; uint8_t val[16]; homeaxis(axis, 16, step); 2471a: ae 01 movw r20, r28 2471c: 4f 5f subi r20, 0xFF ; 255 2471e: 5f 4f sbci r21, 0xFF ; 255 24720: 60 e1 ldi r22, 0x10 ; 16 24722: 0e 94 03 7a call 0xf406 ; 0xf406 bubblesort_uint8(step, 16, 0); 24726: 50 e0 ldi r21, 0x00 ; 0 24728: 40 e0 ldi r20, 0x00 ; 0 2472a: 60 e1 ldi r22, 0x10 ; 16 2472c: ce 01 movw r24, r28 2472e: 01 96 adiw r24, 0x01 ; 1 24730: 0f 94 2f 11 call 0x2225e ; 0x2225e puts_P(PSTR("sorted samples:")); 24734: 88 e8 ldi r24, 0x88 ; 136 24736: 9f e9 ldi r25, 0x9F ; 159 24738: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 2473c: 9e 01 movw r18, r28 2473e: 2f 5f subi r18, 0xFF ; 255 24740: 3f 4f sbci r19, 0xFF ; 255 24742: 59 01 movw r10, r18 24744: 10 e0 ldi r17, 0x00 ; 0 24746: 00 e0 ldi r16, 0x00 ; 0 for (uint8_t i = 0; i < 16; i++) printf_P(PSTR(" i=%2d step=%2d\n"), i, step[i]); 24748: 27 e7 ldi r18, 0x77 ; 119 2474a: e2 2e mov r14, r18 2474c: 2f e9 ldi r18, 0x9F ; 159 2474e: f2 2e mov r15, r18 24750: d5 01 movw r26, r10 24752: 8d 91 ld r24, X+ 24754: 5d 01 movw r10, r26 24756: 1f 92 push r1 24758: 8f 93 push r24 2475a: 1f 93 push r17 2475c: 0f 93 push r16 2475e: ff 92 push r15 24760: ef 92 push r14 24762: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 24766: 0f 5f subi r16, 0xFF ; 255 24768: 1f 4f sbci r17, 0xFF ; 255 uint8_t cnt[16]; uint8_t val[16]; homeaxis(axis, 16, step); bubblesort_uint8(step, 16, 0); puts_P(PSTR("sorted samples:")); for (uint8_t i = 0; i < 16; i++) 2476a: 0f 90 pop r0 2476c: 0f 90 pop r0 2476e: 0f 90 pop r0 24770: 0f 90 pop r0 24772: 0f 90 pop r0 24774: 0f 90 pop r0 24776: 00 31 cpi r16, 0x10 ; 16 24778: 11 05 cpc r17, r1 2477a: 51 f7 brne .-44 ; 0x24750 } uint8_t clusterize_uint8(uint8_t* data, uint8_t size, uint8_t* ccnt, uint8_t* cval, uint8_t tol) { uint8_t cnt = 1; uint16_t sum = data[0]; 2477c: 09 81 ldd r16, Y+1 ; 0x01 2477e: 10 e0 ldi r17, 0x00 ; 0 24780: 5e 01 movw r10, r28 24782: b2 e0 ldi r27, 0x02 ; 2 24784: ab 0e add r10, r27 24786: b1 1c adc r11, r1 24788: ee 24 eor r14, r14 2478a: e3 94 inc r14 2478c: f1 2c mov r15, r1 2478e: ec 0e add r14, r28 24790: fd 1e adc r15, r29 24792: e0 e1 ldi r30, 0x10 ; 16 24794: ee 0e add r14, r30 24796: f1 1c adc r15, r1 uint8_t cl = 0; 24798: e0 e0 ldi r30, 0x00 ; 0 } } uint8_t clusterize_uint8(uint8_t* data, uint8_t size, uint8_t* ccnt, uint8_t* cval, uint8_t tol) { uint8_t cnt = 1; 2479a: 21 e0 ldi r18, 0x01 ; 1 uint16_t sum = data[0]; uint8_t cl = 0; for (uint8_t i = 1; i < size; i++) { uint8_t d = data[i]; 2479c: d5 01 movw r26, r10 2479e: 3d 91 ld r19, X+ 247a0: 5d 01 movw r10, r26 uint8_t val = sum / cnt; 247a2: 62 2f mov r22, r18 247a4: 70 e0 ldi r23, 0x00 ; 0 247a6: c8 01 movw r24, r16 247a8: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> uint8_t dif = 0; if (val > d) dif = val - d; 247ac: 46 2f mov r20, r22 247ae: 43 1b sub r20, r19 247b0: 36 17 cp r19, r22 247b2: 10 f0 brcs .+4 ; 0x247b8 else dif = d - val; 247b4: 43 2f mov r20, r19 247b6: 46 1b sub r20, r22 247b8: 83 2f mov r24, r19 247ba: 90 e0 ldi r25, 0x00 ; 0 if (dif <= tol) 247bc: 42 30 cpi r20, 0x02 ; 2 247be: 08 f0 brcs .+2 ; 0x247c2 247c0: 47 c0 rjmp .+142 ; 0x24850 { cnt += 1; 247c2: 2f 5f subi r18, 0xFF ; 255 sum += d; 247c4: 08 0f add r16, r24 247c6: 19 1f adc r17, r25 uint8_t clusterize_uint8(uint8_t* data, uint8_t size, uint8_t* ccnt, uint8_t* cval, uint8_t tol) { uint8_t cnt = 1; uint16_t sum = data[0]; uint8_t cl = 0; for (uint8_t i = 1; i < size; i++) 247c8: ae 14 cp r10, r14 247ca: bf 04 cpc r11, r15 247cc: 39 f7 brne .-50 ; 0x2479c cnt = 1; sum = d; cl += 1; } } if (ccnt) ccnt[cl] = cnt; 247ce: ae 2e mov r10, r30 247d0: b1 2c mov r11, r1 247d2: a1 e1 ldi r26, 0x11 ; 17 247d4: b0 e0 ldi r27, 0x00 ; 0 247d6: ac 0f add r26, r28 247d8: bd 1f adc r27, r29 247da: aa 0d add r26, r10 247dc: bb 1d adc r27, r11 247de: 2c 93 st X, r18 if (cval) cval[cl] = sum / cnt; 247e0: 7e 01 movw r14, r28 247e2: b1 e2 ldi r27, 0x21 ; 33 247e4: eb 0e add r14, r27 247e6: f1 1c adc r15, r1 247e8: ae 0c add r10, r14 247ea: bf 1c adc r11, r15 247ec: 62 2f mov r22, r18 247ee: 70 e0 ldi r23, 0x00 ; 0 247f0: c8 01 movw r24, r16 247f2: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 247f6: d5 01 movw r26, r10 247f8: 6c 93 st X, r22 return ++cl; 247fa: 11 e0 ldi r17, 0x01 ; 1 247fc: 1e 0f add r17, r30 bubblesort_uint8(step, 16, 0); puts_P(PSTR("sorted samples:")); for (uint8_t i = 0; i < 16; i++) printf_P(PSTR(" i=%2d step=%2d\n"), i, step[i]); uint8_t cl = clusterize_uint8(step, 16, cnt, val, 1); puts_P(PSTR("clusters:")); 247fe: 8d e6 ldi r24, 0x6D ; 109 24800: 9f e9 ldi r25, 0x9F ; 159 24802: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 24806: fe 01 movw r30, r28 24808: 71 96 adiw r30, 0x11 ; 17 2480a: 3f 01 movw r6, r30 2480c: 57 01 movw r10, r14 for (uint8_t i = 0; i < cl; i++) printf_P(PSTR(" i=%2d cnt=%2d val=%2d\n"), i, cnt[i], val[i]); 2480e: 85 e5 ldi r24, 0x55 ; 85 24810: 88 2e mov r8, r24 24812: 8f e9 ldi r24, 0x9F ; 159 24814: 98 2e mov r9, r24 puts_P(PSTR("sorted samples:")); for (uint8_t i = 0; i < 16; i++) printf_P(PSTR(" i=%2d step=%2d\n"), i, step[i]); uint8_t cl = clusterize_uint8(step, 16, cnt, val, 1); puts_P(PSTR("clusters:")); for (uint8_t i = 0; i < cl; i++) 24816: 8a 2d mov r24, r10 24818: 8e 19 sub r24, r14 2481a: 81 17 cp r24, r17 2481c: 70 f5 brcc .+92 ; 0x2487a 2481e: c5 01 movw r24, r10 24820: 8e 19 sub r24, r14 24822: 9f 09 sbc r25, r15 printf_P(PSTR(" i=%2d cnt=%2d val=%2d\n"), i, cnt[i], val[i]); 24824: d5 01 movw r26, r10 24826: 3d 91 ld r19, X+ 24828: 5d 01 movw r10, r26 2482a: f3 01 movw r30, r6 2482c: 21 91 ld r18, Z+ 2482e: 3f 01 movw r6, r30 24830: 1f 92 push r1 24832: 3f 93 push r19 24834: 1f 92 push r1 24836: 2f 93 push r18 24838: 9f 93 push r25 2483a: 8f 93 push r24 2483c: 9f 92 push r9 2483e: 8f 92 push r8 24840: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 24844: 0f b6 in r0, 0x3f ; 63 24846: f8 94 cli 24848: de bf out 0x3e, r29 ; 62 2484a: 0f be out 0x3f, r0 ; 63 2484c: cd bf out 0x3d, r28 ; 61 2484e: e3 cf rjmp .-58 ; 0x24816 24850: 4e 2f mov r20, r30 24852: 50 e0 ldi r21, 0x00 ; 0 cnt += 1; sum += d; } else { if (ccnt) ccnt[cl] = cnt; 24854: a1 e1 ldi r26, 0x11 ; 17 24856: b0 e0 ldi r27, 0x00 ; 0 24858: ac 0f add r26, r28 2485a: bd 1f adc r27, r29 2485c: a4 0f add r26, r20 2485e: b5 1f adc r27, r21 24860: ef 5f subi r30, 0xFF ; 255 24862: 2c 93 st X, r18 if (cval) cval[cl] = val; 24864: 21 e2 ldi r18, 0x21 ; 33 24866: 30 e0 ldi r19, 0x00 ; 0 24868: 2c 0f add r18, r28 2486a: 3d 1f adc r19, r29 2486c: 42 0f add r20, r18 2486e: 53 1f adc r21, r19 24870: da 01 movw r26, r20 24872: 6c 93 st X, r22 cnt = 1; sum = d; 24874: 8c 01 movw r16, r24 } else { if (ccnt) ccnt[cl] = cnt; if (cval) cval[cl] = val; cnt = 1; 24876: 21 e0 ldi r18, 0x01 ; 1 24878: a7 cf rjmp .-178 ; 0x247c8 printf_P(PSTR(" i=%2d step=%2d\n"), i, step[i]); uint8_t cl = clusterize_uint8(step, 16, cnt, val, 1); puts_P(PSTR("clusters:")); for (uint8_t i = 0; i < cl; i++) printf_P(PSTR(" i=%2d cnt=%2d val=%2d\n"), i, cnt[i], val[i]); bubblesort_uint8(cnt, cl, val); 2487a: a7 01 movw r20, r14 2487c: 61 2f mov r22, r17 2487e: ce 01 movw r24, r28 24880: 41 96 adiw r24, 0x11 ; 17 24882: 0f 94 2f 11 call 0x2225e ; 0x2225e tmc2130_home_origin[axis] = val[cl-1]; 24886: fe 01 movw r30, r28 24888: e1 0f add r30, r17 2488a: f1 1d adc r31, r1 2488c: 80 a1 ldd r24, Z+32 ; 0x20 2488e: ed 2d mov r30, r13 24890: f0 e0 ldi r31, 0x00 ; 0 24892: ee 50 subi r30, 0x0E ; 14 24894: fb 4f sbci r31, 0xFB ; 251 24896: 80 83 st Z, r24 printf_P(PSTR("result value: %d\n"), tmc2130_home_origin[axis]); 24898: 1f 92 push r1 2489a: 8f 93 push r24 2489c: 83 e4 ldi r24, 0x43 ; 67 2489e: 9f e9 ldi r25, 0x9F ; 159 248a0: 9f 93 push r25 248a2: 8f 93 push r24 248a4: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (axis == X_AXIS) eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_HOME_X_ORIGIN, tmc2130_home_origin[X_AXIS]); 248a8: 0f 90 pop r0 248aa: 0f 90 pop r0 248ac: 0f 90 pop r0 248ae: 0f 90 pop r0 248b0: 60 91 f2 04 lds r22, 0x04F2 ; 0x8004f2 248b4: 8e ef ldi r24, 0xFE ; 254 248b6: 9e e0 ldi r25, 0x0E ; 14 248b8: dd 20 and r13, r13 248ba: 21 f0 breq .+8 ; 0x248c4 248bc: 60 91 f3 04 lds r22, 0x04F3 ; 0x8004f3 248c0: 8b ef ldi r24, 0xFB ; 251 248c2: 9e e0 ldi r25, 0x0E ; 14 248c4: 0f 94 34 dc call 0x3b868 ; 0x3b868 else if (axis == Y_AXIS) eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_HOME_Y_ORIGIN, tmc2130_home_origin[Y_AXIS]); return true; } 248c8: 81 e0 ldi r24, 0x01 ; 1 248ca: e0 96 adiw r28, 0x30 ; 48 248cc: 0f b6 in r0, 0x3f ; 63 248ce: f8 94 cli 248d0: de bf out 0x3e, r29 ; 62 248d2: 0f be out 0x3f, r0 ; 63 248d4: cd bf out 0x3d, r28 ; 61 248d6: df 91 pop r29 248d8: cf 91 pop r28 248da: 1f 91 pop r17 248dc: 0f 91 pop r16 248de: ff 90 pop r15 248e0: ef 90 pop r14 248e2: df 90 pop r13 248e4: bf 90 pop r11 248e6: af 90 pop r10 248e8: 9f 90 pop r9 248ea: 8f 90 pop r8 248ec: 7f 90 pop r7 248ee: 6f 90 pop r6 248f0: 08 95 ret 000248f2 : delayMicroseconds(TMC2130_SET_DIR_DELAY); } void tmc2130_do_step(uint8_t axis) { switch (axis) 248f2: 81 30 cpi r24, 0x01 ; 1 248f4: 49 f0 breq .+18 ; 0x24908 248f6: 28 f0 brcs .+10 ; 0x24902 248f8: 82 30 cpi r24, 0x02 ; 2 248fa: 41 f0 breq .+16 ; 0x2490c 248fc: 83 30 cpi r24, 0x03 ; 3 248fe: 41 f0 breq .+16 ; 0x24910 24900: 08 95 ret { case X_AXIS: _DO_STEP_X; break; 24902: 81 e0 ldi r24, 0x01 ; 1 case Y_AXIS: _DO_STEP_Y; break; case Z_AXIS: _DO_STEP_Z; break; case E_AXIS: _DO_STEP_E; break; 24904: 86 b9 out 0x06, r24 ; 6 } } 24906: 08 95 ret void tmc2130_do_step(uint8_t axis) { switch (axis) { case X_AXIS: _DO_STEP_X; break; case Y_AXIS: _DO_STEP_Y; break; 24908: 82 e0 ldi r24, 0x02 ; 2 2490a: fc cf rjmp .-8 ; 0x24904 case Z_AXIS: _DO_STEP_Z; break; 2490c: 84 e0 ldi r24, 0x04 ; 4 2490e: fa cf rjmp .-12 ; 0x24904 case E_AXIS: _DO_STEP_E; break; 24910: 88 e0 ldi r24, 0x08 ; 8 24912: f8 cf rjmp .-16 ; 0x24904 00024914 : } void tmc2130_set_dir(uint8_t axis, uint8_t dir) { switch (axis) 24914: 81 30 cpi r24, 0x01 ; 1 24916: d1 f0 breq .+52 ; 0x2494c 24918: 48 f0 brcs .+18 ; 0x2492c 2491a: 82 30 cpi r24, 0x02 ; 2 2491c: 21 f1 breq .+72 ; 0x24966 2491e: 83 30 cpi r24, 0x03 ; 3 24920: 79 f1 breq .+94 ; 0x24980 24922: 8b e4 ldi r24, 0x4B ; 75 24924: 90 e0 ldi r25, 0x00 ; 0 24926: 01 97 sbiw r24, 0x01 ; 1 24928: f1 f7 brne .-4 ; 0x24926 case Y_AXIS: _SET_DIR_Y(dir); break; case Z_AXIS: _SET_DIR_Z(dir); break; case E_AXIS: _SET_DIR_E(dir); break; } delayMicroseconds(TMC2130_SET_DIR_DELAY); } 2492a: 08 95 ret void tmc2130_set_dir(uint8_t axis, uint8_t dir) { switch (axis) { case X_AXIS: _SET_DIR_X(dir); break; 2492c: 9f b7 in r25, 0x3f ; 63 2492e: 66 23 and r22, r22 24930: 41 f0 breq .+16 ; 0x24942 24932: f8 94 cli 24934: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24938: 81 60 ori r24, 0x01 ; 1 case Y_AXIS: _SET_DIR_Y(dir); break; case Z_AXIS: _SET_DIR_Z(dir); break; case E_AXIS: _SET_DIR_E(dir); break; 2493a: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2493e: 9f bf out 0x3f, r25 ; 63 24940: f0 cf rjmp .-32 ; 0x24922 void tmc2130_set_dir(uint8_t axis, uint8_t dir) { switch (axis) { case X_AXIS: _SET_DIR_X(dir); break; 24942: f8 94 cli 24944: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24948: 8e 7f andi r24, 0xFE ; 254 2494a: f7 cf rjmp .-18 ; 0x2493a case Y_AXIS: _SET_DIR_Y(dir); break; 2494c: 9f b7 in r25, 0x3f ; 63 2494e: 61 11 cpse r22, r1 24950: 05 c0 rjmp .+10 ; 0x2495c 24952: f8 94 cli 24954: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24958: 82 60 ori r24, 0x02 ; 2 2495a: ef cf rjmp .-34 ; 0x2493a 2495c: f8 94 cli 2495e: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24962: 8d 7f andi r24, 0xFD ; 253 24964: ea cf rjmp .-44 ; 0x2493a case Z_AXIS: _SET_DIR_Z(dir); break; 24966: 9f b7 in r25, 0x3f ; 63 24968: 66 23 and r22, r22 2496a: 29 f0 breq .+10 ; 0x24976 2496c: f8 94 cli 2496e: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24972: 84 60 ori r24, 0x04 ; 4 24974: e2 cf rjmp .-60 ; 0x2493a 24976: f8 94 cli 24978: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2497c: 8b 7f andi r24, 0xFB ; 251 2497e: dd cf rjmp .-70 ; 0x2493a case E_AXIS: _SET_DIR_E(dir); break; 24980: 9f b7 in r25, 0x3f ; 63 24982: 61 11 cpse r22, r1 24984: 05 c0 rjmp .+10 ; 0x24990 24986: f8 94 cli 24988: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2498c: 80 64 ori r24, 0x40 ; 64 2498e: d5 cf rjmp .-86 ; 0x2493a 24990: f8 94 cli 24992: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 24996: 8f 7b andi r24, 0xBF ; 191 24998: d0 cf rjmp .-96 ; 0x2493a 0002499a : tmc2130_cs_high(axis); TMC2130_SPI_LEAVE(); } static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval) { 2499a: cf 92 push r12 2499c: df 92 push r13 2499e: ef 92 push r14 249a0: ff 92 push r15 249a2: 0f 93 push r16 249a4: 1f 93 push r17 249a6: cf 93 push r28 249a8: df 93 push r29 249aa: 18 2f mov r17, r24 249ac: f6 2e mov r15, r22 249ae: ea 01 movw r28, r20 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 249b0: 0c e5 ldi r16, 0x5C ; 92 249b2: 0c bd out 0x2c, r16 ; 44 SPSR = spsr; 249b4: 1d bc out 0x2d, r1 ; 45 //datagram1 - request TMC2130_SPI_ENTER(); tmc2130_cs_low(axis); 249b6: 0f 94 8b 11 call 0x22316 ; 0x22316 TMC2130_SPI_TXRX(addr); // address 249ba: 8f 2d mov r24, r15 249bc: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX(0); // MSB 249c0: 80 e0 ldi r24, 0x00 ; 0 249c2: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX(0); 249c6: 80 e0 ldi r24, 0x00 ; 0 249c8: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX(0); 249cc: 80 e0 ldi r24, 0x00 ; 0 249ce: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX(0); // LSB 249d2: 80 e0 ldi r24, 0x00 ; 0 249d4: 0f 94 a6 11 call 0x2234c ; 0x2234c tmc2130_cs_high(axis); 249d8: 81 2f mov r24, r17 249da: 0f 94 70 11 call 0x222e0 ; 0x222e0 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 249de: 0c bd out 0x2c, r16 ; 44 SPSR = spsr; 249e0: 1d bc out 0x2d, r1 ; 45 TMC2130_SPI_LEAVE(); //datagram2 - response TMC2130_SPI_ENTER(); tmc2130_cs_low(axis); 249e2: 81 2f mov r24, r17 249e4: 0f 94 8b 11 call 0x22316 ; 0x22316 uint8_t stat = TMC2130_SPI_TXRX(0); // status 249e8: 80 e0 ldi r24, 0x00 ; 0 249ea: 0f 94 a6 11 call 0x2234c ; 0x2234c 249ee: 08 2f mov r16, r24 uint32_t val32 = 0; val32 = TMC2130_SPI_TXRX(0); // MSB 249f0: 80 e0 ldi r24, 0x00 ; 0 249f2: 0f 94 a6 11 call 0x2234c ; 0x2234c 249f6: 90 e0 ldi r25, 0x00 ; 0 249f8: b0 e0 ldi r27, 0x00 ; 0 249fa: a0 e0 ldi r26, 0x00 ; 0 val32 = (val32 << 8) | TMC2130_SPI_TXRX(0); 249fc: cc 24 eor r12, r12 249fe: d8 2e mov r13, r24 24a00: e9 2e mov r14, r25 24a02: fa 2e mov r15, r26 24a04: 80 e0 ldi r24, 0x00 ; 0 24a06: 0f 94 a6 11 call 0x2234c ; 0x2234c 24a0a: c8 2a or r12, r24 val32 = (val32 << 8) | TMC2130_SPI_TXRX(0); 24a0c: fe 2c mov r15, r14 24a0e: ed 2c mov r14, r13 24a10: dc 2c mov r13, r12 24a12: cc 24 eor r12, r12 24a14: 80 e0 ldi r24, 0x00 ; 0 24a16: 0f 94 a6 11 call 0x2234c ; 0x2234c 24a1a: c8 2a or r12, r24 val32 = (val32 << 8) | TMC2130_SPI_TXRX(0); // LSB 24a1c: fe 2c mov r15, r14 24a1e: ed 2c mov r14, r13 24a20: dc 2c mov r13, r12 24a22: cc 24 eor r12, r12 24a24: 80 e0 ldi r24, 0x00 ; 0 24a26: 0f 94 a6 11 call 0x2234c ; 0x2234c 24a2a: c8 2a or r12, r24 tmc2130_cs_high(axis); 24a2c: 81 2f mov r24, r17 24a2e: 0f 94 70 11 call 0x222e0 ; 0x222e0 TMC2130_SPI_LEAVE(); if (rval != 0) *rval = val32; 24a32: c8 82 st Y, r12 24a34: d9 82 std Y+1, r13 ; 0x01 24a36: ea 82 std Y+2, r14 ; 0x02 24a38: fb 82 std Y+3, r15 ; 0x03 return stat; } 24a3a: 80 2f mov r24, r16 24a3c: df 91 pop r29 24a3e: cf 91 pop r28 24a40: 1f 91 pop r17 24a42: 0f 91 pop r16 24a44: ff 90 pop r15 24a46: ef 90 pop r14 24a48: df 90 pop r13 24a4a: cf 90 pop r12 24a4c: 08 95 ret 00024a4e : #define TMC2130_SPI_ENTER() spi_setup(TMC2130_SPCR, TMC2130_SPSR) #define TMC2130_SPI_TXRX spi_txrx #define TMC2130_SPI_LEAVE() static void tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval) { 24a4e: ef 92 push r14 24a50: ff 92 push r15 24a52: 0f 93 push r16 24a54: 1f 93 push r17 24a56: cf 93 push r28 24a58: df 93 push r29 24a5a: c8 2f mov r28, r24 24a5c: e6 2e mov r14, r22 24a5e: d2 2f mov r29, r18 24a60: 13 2f mov r17, r19 24a62: 04 2f mov r16, r20 24a64: f5 2e mov r15, r21 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 24a66: 8c e5 ldi r24, 0x5C ; 92 24a68: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 24a6a: 1d bc out 0x2d, r1 ; 45 //datagram1 - request TMC2130_SPI_ENTER(); tmc2130_cs_low(axis); 24a6c: 8c 2f mov r24, r28 24a6e: 0f 94 8b 11 call 0x22316 ; 0x22316 TMC2130_SPI_TXRX(addr); // address 24a72: 8e 2d mov r24, r14 24a74: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX((wval >> 24) & 0xff); // MSB 24a78: 8f 2d mov r24, r15 24a7a: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX((wval >> 16) & 0xff); 24a7e: 80 2f mov r24, r16 24a80: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX((wval >> 8) & 0xff); 24a84: 81 2f mov r24, r17 24a86: 0f 94 a6 11 call 0x2234c ; 0x2234c TMC2130_SPI_TXRX(wval & 0xff); // LSB 24a8a: 8d 2f mov r24, r29 24a8c: 0f 94 a6 11 call 0x2234c ; 0x2234c tmc2130_cs_high(axis); 24a90: 8c 2f mov r24, r28 TMC2130_SPI_LEAVE(); } 24a92: df 91 pop r29 24a94: cf 91 pop r28 24a96: 1f 91 pop r17 24a98: 0f 91 pop r16 24a9a: ff 90 pop r15 24a9c: ef 90 pop r14 TMC2130_SPI_TXRX(addr); // address TMC2130_SPI_TXRX((wval >> 24) & 0xff); // MSB TMC2130_SPI_TXRX((wval >> 16) & 0xff); TMC2130_SPI_TXRX((wval >> 8) & 0xff); TMC2130_SPI_TXRX(wval & 0xff); // LSB tmc2130_cs_high(axis); 24a9e: 0d 94 70 11 jmp 0x222e0 ; 0x222e0 00024aa2 : if (val32 & 0x000f0000) return 0xffff; return val32 & 0xffff; } uint16_t tmc2130_rd_MSCNT(uint8_t axis) { 24aa2: cf 93 push r28 24aa4: df 93 push r29 24aa6: 00 d0 rcall .+0 ; 0x24aa8 24aa8: 1f 92 push r1 24aaa: cd b7 in r28, 0x3d ; 61 24aac: de b7 in r29, 0x3e ; 62 uint32_t val32 = 0; 24aae: 19 82 std Y+1, r1 ; 0x01 24ab0: 1a 82 std Y+2, r1 ; 0x02 24ab2: 1b 82 std Y+3, r1 ; 0x03 24ab4: 1c 82 std Y+4, r1 ; 0x04 tmc2130_rd(axis, TMC2130_REG_MSCNT, &val32); 24ab6: ae 01 movw r20, r28 24ab8: 4f 5f subi r20, 0xFF ; 255 24aba: 5f 4f sbci r21, 0xFF ; 255 24abc: 6a e6 ldi r22, 0x6A ; 106 24abe: 0f 94 cd 24 call 0x2499a ; 0x2499a return val32 & 0x3ff; 24ac2: 89 81 ldd r24, Y+1 ; 0x01 24ac4: 9a 81 ldd r25, Y+2 ; 0x02 } 24ac6: 93 70 andi r25, 0x03 ; 3 24ac8: 0f 90 pop r0 24aca: 0f 90 pop r0 24acc: 0f 90 pop r0 24ace: 0f 90 pop r0 24ad0: df 91 pop r29 24ad2: cf 91 pop r28 24ad4: 08 95 ret 00024ad6 : #endif //DEBUG_TMC_CURRENTS tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, ihold_irun.dw); } void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, const MotorCurrents *curr /* = nullptr */) { 24ad6: ff 92 push r15 24ad8: 0f 93 push r16 24ada: 1f 93 push r17 24adc: cf 93 push r28 24ade: df 93 push r29 24ae0: f8 2e mov r15, r24 24ae2: ea 01 movw r28, r20 // Initialise the chopper configuration ChopConfU chopconf = ChopConfU(currents[axis].getvSense(), mres); 24ae4: e8 2f mov r30, r24 24ae6: f0 e0 ldi r31, 0x00 ; 0 24ae8: 83 e0 ldi r24, 0x03 ; 3 24aea: f8 9e mul r15, r24 24aec: 80 01 movw r16, r0 24aee: 11 24 eor r1, r1 24af0: 03 5a subi r16, 0xA3 ; 163 24af2: 1d 4f sbci r17, 0xFD ; 253 24af4: d8 01 movw r26, r16 24af6: 8c 91 ld r24, X , sync(0) , mres(mres) , intpol(0) , dedge(default_dedge_bit) , diss2g(0) // Short to GND protection is on , reserved(0) {} 24af8: 30 e0 ldi r19, 0x00 ; 0 24afa: 37 7f andi r19, 0xF7 ; 247 24afc: 3f 7e andi r19, 0xEF ; 239 24afe: 3f 7d andi r19, 0xDF ; 223 24b00: 3f 7b andi r19, 0xBF ; 191 24b02: 40 e0 ldi r20, 0x00 ; 0 24b04: 80 fb bst r24, 0 24b06: 41 f9 bld r20, 1 24b08: 43 70 andi r20, 0x03 ; 3 24b0a: 56 2f mov r21, r22 24b0c: 5f 70 andi r21, 0x0F ; 15 24b0e: 50 62 ori r21, 0x20 ; 32 24b10: 5f 7b andi r21, 0xBF ; 191 24b12: 5f 77 andi r21, 0x7F ; 127 #endif #if defined(TMC2130_INTPOL_Z) && (TMC2130_INTPOL_Z == 0) if (axis == Z_AXIS) return 0; #endif return (mres != 0); // intpol to 256 only if microsteps aren't 256 24b14: 81 e0 ldi r24, 0x01 ; 1 24b16: 61 11 cpse r22, r1 24b18: 01 c0 rjmp .+2 ; 0x24b1c 24b1a: 80 e0 ldi r24, 0x00 ; 0 void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, const MotorCurrents *curr /* = nullptr */) { // Initialise the chopper configuration ChopConfU chopconf = ChopConfU(currents[axis].getvSense(), mres); chopconf.s.intpol = getIntpolBit(axis, mres); 24b1c: 80 fb bst r24, 0 24b1e: 54 f9 bld r21, 4 chopconf.s.toff = tmc2130_chopper_config[axis].toff; // toff = 3 (fchop = 27.778kHz) 24b20: bf 01 movw r22, r30 24b22: 66 0f add r22, r22 24b24: 77 1f adc r23, r23 24b26: fb 01 movw r30, r22 24b28: eb 55 subi r30, 0x5B ; 91 24b2a: fd 4f sbci r31, 0xFD ; 253 24b2c: 20 81 ld r18, Z chopconf.s.hstrt = tmc2130_chopper_config[axis].hstr; // initial 4, modified to 5 chopconf.s.hend = tmc2130_chopper_config[axis].hend; // original value = 1 24b2e: 92 2f mov r25, r18 24b30: 99 1f adc r25, r25 24b32: 99 27 eor r25, r25 24b34: 99 1f adc r25, r25 24b36: 81 81 ldd r24, Z+1 ; 0x01 24b38: 87 70 andi r24, 0x07 ; 7 24b3a: 88 0f add r24, r24 24b3c: 89 2b or r24, r25 24b3e: 80 fb bst r24, 0 24b40: 27 f9 bld r18, 7 24b42: 86 95 lsr r24 24b44: 87 70 andi r24, 0x07 ; 7 24b46: 38 7f andi r19, 0xF8 ; 248 24b48: 38 2b or r19, r24 chopconf.s.tbl = tmc2130_chopper_config[axis].tbl; //blanking time, original value = 2 24b4a: 6a 55 subi r22, 0x5A ; 90 24b4c: 7d 4f sbci r23, 0xFD ; 253 24b4e: fb 01 movw r30, r22 24b50: 80 81 ld r24, Z 24b52: 86 95 lsr r24 24b54: 86 95 lsr r24 24b56: 86 95 lsr r24 24b58: 80 fb bst r24, 0 24b5a: 37 f9 bld r19, 7 24b5c: 81 fb bst r24, 1 24b5e: 40 f9 bld r20, 0 tmc2130_wr(axis, TMC2130_REG_CHOPCONF, chopconf.dw); 24b60: 6c ee ldi r22, 0xEC ; 236 24b62: 8f 2d mov r24, r15 24b64: 0f 94 27 25 call 0x24a4e ; 0x24a4e if (curr == nullptr) { 24b68: 20 97 sbiw r28, 0x00 ; 0 24b6a: 09 f4 brne .+2 ; 0x24b6e curr = ¤ts[axis]; 24b6c: e8 01 movw r28, r16 24b6e: 19 81 ldd r17, Y+1 ; 0x01 24b70: 8a 81 ldd r24, Y+2 ; 0x02 24b72: c1 2f mov r28, r17 24b74: 81 17 cp r24, r17 24b76: 08 f4 brcc .+2 ; 0x24b7a 24b78: c8 2f mov r28, r24 static void SetCurrents(const uint8_t axis, const MotorCurrents &curr) { uint8_t iHold = curr.getiHold(); const uint8_t iRun = curr.getiRun(); // Make sure iHold never exceeds iRun at runtime if (curr.iHoldIsClamped()) { 24b7a: 18 17 cp r17, r24 24b7c: 40 f4 brcc .+16 ; 0x24b8e // Let user know firmware modified the value SERIAL_ECHO_START; 24b7e: 82 ef ldi r24, 0xF2 ; 242 24b80: 9a ea ldi r25, 0xAA ; 170 24b82: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("Hold current truncated to Run current")); 24b86: 84 e1 ldi r24, 0x14 ; 20 24b88: 9e e6 ldi r25, 0x6E ; 110 24b8a: 0e 94 13 79 call 0xf226 ; 0xf226 struct S { uint8_t iHold; uint8_t iRun; uint16_t iHoldDelay; constexpr S(uint8_t ih, uint8_t ir) : iHold(ih & 0x1F) 24b8e: 2c 2f mov r18, r28 24b90: 2f 71 andi r18, 0x1F ; 31 , iRun(ir & 0x1F) 24b92: 31 2f mov r19, r17 24b94: 3f 71 andi r19, 0x1F ; 31 IHoldRun ihold_irun(iHold, iRun); #ifdef DEBUG_TMC_CURRENTS printf_P(PSTR("SetCurrents(axis=%u, iHold=%u, iRun=%u, vsense=%u, reg=%08lX)\n"), axis, iHold, iRun, curr.getvSense(), ihold_irun.dw); #endif //DEBUG_TMC_CURRENTS tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, ihold_irun.dw); 24b96: 4f e0 ldi r20, 0x0F ; 15 24b98: 50 e0 ldi r21, 0x00 ; 0 24b9a: 60 e9 ldi r22, 0x90 ; 144 24b9c: 8f 2d mov r24, r15 tmc2130_wr(axis, TMC2130_REG_CHOPCONF, chopconf.dw); if (curr == nullptr) { curr = ¤ts[axis]; } SetCurrents(axis, *curr); } 24b9e: df 91 pop r29 24ba0: cf 91 pop r28 24ba2: 1f 91 pop r17 24ba4: 0f 91 pop r16 24ba6: ff 90 pop r15 IHoldRun ihold_irun(iHold, iRun); #ifdef DEBUG_TMC_CURRENTS printf_P(PSTR("SetCurrents(axis=%u, iHold=%u, iRun=%u, vsense=%u, reg=%08lX)\n"), axis, iHold, iRun, curr.getvSense(), ihold_irun.dw); #endif //DEBUG_TMC_CURRENTS tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, ihold_irun.dw); 24ba8: 0d 94 27 25 jmp 0x24a4e ; 0x24a4e 00024bac : return tmc2130_mres2usteps(tmc2130_mres[axis]); } void tmc2130_set_res(uint8_t axis, uint16_t res) { tmc2130_mres[axis] = tmc2130_usteps2mres(res); 24bac: e8 2f mov r30, r24 24bae: f0 e0 ldi r31, 0x00 ; 0 //printf_P(PSTR("MSLUT[%d]=%08lx\n"), i, val); } uint8_t tmc2130_usteps2mres(uint16_t usteps) { uint8_t mres = 8; while (usteps >>= 1) mres--; 24bb0: 98 e0 ldi r25, 0x08 ; 8 24bb2: 76 95 lsr r23 24bb4: 67 95 ror r22 24bb6: 61 15 cp r22, r1 24bb8: 71 05 cpc r23, r1 24bba: 11 f0 breq .+4 ; 0x24bc0 24bbc: 91 50 subi r25, 0x01 ; 1 24bbe: f9 cf rjmp .-14 ; 0x24bb2 return tmc2130_mres2usteps(tmc2130_mres[axis]); } void tmc2130_set_res(uint8_t axis, uint16_t res) { tmc2130_mres[axis] = tmc2130_usteps2mres(res); 24bc0: ec 50 subi r30, 0x0C ; 12 24bc2: fb 4f sbci r31, 0xFB ; 251 24bc4: 90 83 st Z, r25 // uint32_t u = _micros(); tmc2130_setup_chopper(axis, tmc2130_mres[axis]); 24bc6: 50 e0 ldi r21, 0x00 ; 0 24bc8: 40 e0 ldi r20, 0x00 ; 0 24bca: 69 2f mov r22, r25 24bcc: 0d 94 6b 25 jmp 0x24ad6 ; 0x24ad6 00024bd0 : } return 0; } static void tmc2130_XYZ_reg_init(uint8_t axis) { 24bd0: 0f 93 push r16 24bd2: 1f 93 push r17 24bd4: cf 93 push r28 24bd6: df 93 push r29 24bd8: c8 2f mov r28, r24 tmc2130_setup_chopper(axis, tmc2130_mres[axis]); 24bda: 08 2f mov r16, r24 24bdc: 10 e0 ldi r17, 0x00 ; 0 24bde: f8 01 movw r30, r16 24be0: ec 50 subi r30, 0x0C ; 12 24be2: fb 4f sbci r31, 0xFB ; 251 24be4: 50 e0 ldi r21, 0x00 ; 0 24be6: 40 e0 ldi r20, 0x00 ; 0 24be8: 60 81 ld r22, Z 24bea: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000); 24bee: 20 e0 ldi r18, 0x00 ; 0 24bf0: 30 e0 ldi r19, 0x00 ; 0 24bf2: a9 01 movw r20, r18 24bf4: 61 e9 ldi r22, 0x91 ; 145 24bf6: 8c 2f mov r24, r28 24bf8: 0f 94 27 25 call 0x24a4e ; 0x24a4e const bool isStealth = (tmc2130_mode == TMC2130_MODE_SILENT); 24bfc: d0 91 8b 06 lds r29, 0x068B ; 0x80068b if (axis == Z_AXIS) { 24c00: c2 30 cpi r28, 0x02 ; 2 24c02: e1 f5 brne .+120 ; 0x24c7c #ifdef TMC2130_STEALTH_Z tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr[axis]) << 16) | ((uint32_t)1 << 24)); 24c04: 20 e0 ldi r18, 0x00 ; 0 24c06: 30 e0 ldi r19, 0x00 ; 0 24c08: 44 e0 ldi r20, 0x04 ; 4 24c0a: 51 e0 ldi r21, 0x01 ; 1 24c0c: 6d ee ldi r22, 0xED ; 237 24c0e: 82 e0 ldi r24, 0x02 ; 2 24c10: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, isStealth ? 0 : __tcoolthrs(axis)); 24c14: 24 ef ldi r18, 0xF4 ; 244 24c16: 31 e0 ldi r19, 0x01 ; 1 24c18: 40 e0 ldi r20, 0x00 ; 0 24c1a: 50 e0 ldi r21, 0x00 ; 0 24c1c: d1 30 cpi r29, 0x01 ; 1 24c1e: 19 f4 brne .+6 ; 0x24c26 24c20: 20 e0 ldi r18, 0x00 ; 0 24c22: 30 e0 ldi r19, 0x00 ; 0 24c24: a9 01 movw r20, r18 24c26: 64 e9 ldi r22, 0x94 ; 148 24c28: 82 e0 ldi r24, 0x02 ; 2 24c2a: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_GCONF, isStealth ? TMC2130_GCONF_SILENT : TMC2130_GCONF_DYNAMIC_SGSENS); 24c2e: 24 e8 ldi r18, 0x84 ; 132 24c30: 31 e0 ldi r19, 0x01 ; 1 24c32: 40 e0 ldi r20, 0x00 ; 0 24c34: 50 e0 ldi r21, 0x00 ; 0 24c36: d1 30 cpi r29, 0x01 ; 1 24c38: 21 f4 brne .+8 ; 0x24c42 24c3a: 24 e0 ldi r18, 0x04 ; 4 24c3c: 30 e0 ldi r19, 0x00 ; 0 24c3e: 40 e0 ldi r20, 0x00 ; 0 24c40: 50 e0 ldi r21, 0x00 ; 0 24c42: 60 e8 ldi r22, 0x80 ; 128 24c44: 82 e0 ldi r24, 0x02 ; 2 24c46: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_PWMCONF, pwmconf[axis].dw); 24c4a: 28 ec ldi r18, 0xC8 ; 200 24c4c: 34 e0 ldi r19, 0x04 ; 4 24c4e: 46 e0 ldi r20, 0x06 ; 6 24c50: 50 e0 ldi r21, 0x00 ; 0 24c52: 60 ef ldi r22, 0xF0 ; 240 24c54: 82 e0 ldi r24, 0x02 ; 2 24c56: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, isStealth ? 0 : 0xFFFF0); 24c5a: 20 ef ldi r18, 0xF0 ; 240 24c5c: 3f ef ldi r19, 0xFF ; 255 24c5e: 4f e0 ldi r20, 0x0F ; 15 24c60: 50 e0 ldi r21, 0x00 ; 0 24c62: d1 30 cpi r29, 0x01 ; 1 24c64: 19 f4 brne .+6 ; 0x24c6c 24c66: 20 e0 ldi r18, 0x00 ; 0 24c68: 30 e0 ldi r19, 0x00 ; 0 24c6a: a9 01 movw r20, r18 24c6c: 63 e9 ldi r22, 0x93 ; 147 24c6e: 82 e0 ldi r24, 0x02 ; 2 tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, isStealth ? 0 : __tcoolthrs(axis)); tmc2130_wr(axis, TMC2130_REG_GCONF, isStealth ? TMC2130_GCONF_SILENT : TMC2130_GCONF_SGSENS); tmc2130_wr(axis, TMC2130_REG_PWMCONF, pwmconf[axis].dw); tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS); } } 24c70: df 91 pop r29 24c72: cf 91 pop r28 24c74: 1f 91 pop r17 24c76: 0f 91 pop r16 } else { // X Y tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr[axis]) << 16) | ((uint32_t)1 << 24)); tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, isStealth ? 0 : __tcoolthrs(axis)); tmc2130_wr(axis, TMC2130_REG_GCONF, isStealth ? TMC2130_GCONF_SILENT : TMC2130_GCONF_SGSENS); tmc2130_wr(axis, TMC2130_REG_PWMCONF, pwmconf[axis].dw); tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS); 24c78: 0d 94 27 25 jmp 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, isStealth ? 0 : 0xFFFF0); #else // TMC2130_STEALTH_Z tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); #endif // TMC2130_STEALTH_Z } else { // X Y tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr[axis]) << 16) | ((uint32_t)1 << 24)); 24c7c: f8 01 movw r30, r16 24c7e: e9 5e subi r30, 0xE9 ; 233 24c80: fc 4f sbci r31, 0xFC ; 252 24c82: 20 81 ld r18, Z 24c84: 30 e0 ldi r19, 0x00 ; 0 24c86: 50 e0 ldi r21, 0x00 ; 0 24c88: 40 e0 ldi r20, 0x00 ; 0 24c8a: a9 01 movw r20, r18 24c8c: 33 27 eor r19, r19 24c8e: 22 27 eor r18, r18 24c90: 51 60 ori r21, 0x01 ; 1 24c92: 6d ee ldi r22, 0xED ; 237 24c94: 8c 2f mov r24, r28 24c96: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, isStealth ? 0 : __tcoolthrs(axis)); 24c9a: 20 e0 ldi r18, 0x00 ; 0 24c9c: 30 e0 ldi r19, 0x00 ; 0 24c9e: a9 01 movw r20, r18 24ca0: d1 30 cpi r29, 0x01 ; 1 24ca2: 61 f0 breq .+24 ; 0x24cbc uint16_t __tcoolthrs(uint8_t axis) { switch (axis) { case X_AXIS: return TMC2130_TCOOLTHRS_X; 24ca4: 2e ea ldi r18, 0xAE ; 174 24ca6: 31 e0 ldi r19, 0x01 ; 1 static void tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval); static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval); uint16_t __tcoolthrs(uint8_t axis) { switch (axis) 24ca8: c2 30 cpi r28, 0x02 ; 2 24caa: 30 f0 brcs .+12 ; 0x24cb8 { case X_AXIS: return TMC2130_TCOOLTHRS_X; case Y_AXIS: return TMC2130_TCOOLTHRS_Y; case Z_AXIS: return TMC2130_TCOOLTHRS_Z; 24cac: 24 ef ldi r18, 0xF4 ; 244 24cae: 31 e0 ldi r19, 0x01 ; 1 static void tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval); static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval); uint16_t __tcoolthrs(uint8_t axis) { switch (axis) 24cb0: c2 30 cpi r28, 0x02 ; 2 24cb2: 11 f0 breq .+4 ; 0x24cb8 { case X_AXIS: return TMC2130_TCOOLTHRS_X; case Y_AXIS: return TMC2130_TCOOLTHRS_Y; case Z_AXIS: return TMC2130_TCOOLTHRS_Z; } return 0; 24cb4: 30 e0 ldi r19, 0x00 ; 0 24cb6: 20 e0 ldi r18, 0x00 ; 0 #else // TMC2130_STEALTH_Z tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); #endif // TMC2130_STEALTH_Z } else { // X Y tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr[axis]) << 16) | ((uint32_t)1 << 24)); tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, isStealth ? 0 : __tcoolthrs(axis)); 24cb8: 50 e0 ldi r21, 0x00 ; 0 24cba: 40 e0 ldi r20, 0x00 ; 0 24cbc: 64 e9 ldi r22, 0x94 ; 148 24cbe: 8c 2f mov r24, r28 24cc0: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_GCONF, isStealth ? TMC2130_GCONF_SILENT : TMC2130_GCONF_SGSENS); 24cc4: 20 e8 ldi r18, 0x80 ; 128 24cc6: 31 e0 ldi r19, 0x01 ; 1 24cc8: 40 e0 ldi r20, 0x00 ; 0 24cca: 50 e0 ldi r21, 0x00 ; 0 24ccc: d1 30 cpi r29, 0x01 ; 1 24cce: 21 f4 brne .+8 ; 0x24cd8 24cd0: 24 e0 ldi r18, 0x04 ; 4 24cd2: 30 e0 ldi r19, 0x00 ; 0 24cd4: 40 e0 ldi r20, 0x00 ; 0 24cd6: 50 e0 ldi r21, 0x00 ; 0 24cd8: 60 e8 ldi r22, 0x80 ; 128 24cda: 8c 2f mov r24, r28 24cdc: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_PWMCONF, pwmconf[axis].dw); 24ce0: 00 0f add r16, r16 24ce2: 11 1f adc r17, r17 24ce4: 00 0f add r16, r16 24ce6: 11 1f adc r17, r17 24ce8: f8 01 movw r30, r16 24cea: e9 5f subi r30, 0xF9 ; 249 24cec: fc 4f sbci r31, 0xFC ; 252 24cee: 20 81 ld r18, Z 24cf0: 31 81 ldd r19, Z+1 ; 0x01 24cf2: 42 81 ldd r20, Z+2 ; 0x02 24cf4: 53 81 ldd r21, Z+3 ; 0x03 24cf6: 60 ef ldi r22, 0xF0 ; 240 24cf8: 8c 2f mov r24, r28 24cfa: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS); 24cfe: 20 e0 ldi r18, 0x00 ; 0 24d00: 30 e0 ldi r19, 0x00 ; 0 24d02: a9 01 movw r20, r18 24d04: 63 e9 ldi r22, 0x93 ; 147 24d06: 8c 2f mov r24, r28 24d08: b3 cf rjmp .-154 ; 0x24c70 00024d0a : } #endif //TMC2130_SG_HOMING } void tmc2130_home_exit() { 24d0a: 1f 93 push r17 24d0c: cf 93 push r28 24d0e: df 93 push r29 printf_P(PSTR("tmc2130_home_exit tmc2130_sg_homing_axes_mask=0x%02x\n"), tmc2130_sg_homing_axes_mask); 24d10: 80 91 42 06 lds r24, 0x0642 ; 0x800642 24d14: 1f 92 push r1 24d16: 8f 93 push r24 24d18: 8d e0 ldi r24, 0x0D ; 13 24d1a: 9f e9 ldi r25, 0x9F ; 159 24d1c: 9f 93 push r25 24d1e: 8f 93 push r24 24d20: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 #ifdef TMC2130_SG_HOMING if (tmc2130_sg_homing_axes_mask & (X_AXIS_MASK | Y_AXIS_MASK)) 24d24: 80 91 42 06 lds r24, 0x0642 ; 0x800642 24d28: 83 70 andi r24, 0x03 ; 3 24d2a: 0f 90 pop r0 24d2c: 0f 90 pop r0 24d2e: 0f 90 pop r0 24d30: 0f 90 pop r0 24d32: 11 f0 breq .+4 ; 0x24d38 tmc2130_wait_standstill_xy(1000); 24d34: 0f 94 0c 88 call 0x31018 ; 0x31018 if (tmc2130_sg_homing_axes_mask) 24d38: 10 91 42 06 lds r17, 0x0642 ; 0x800642 24d3c: 11 23 and r17, r17 24d3e: 71 f0 breq .+28 ; 0x24d5c { for (uint8_t axis = X_AXIS, mask = X_AXIS_MASK; axis <= Z_AXIS; axis++, mask <<= 1) //X Y and Z axes 24d40: d1 e0 ldi r29, 0x01 ; 1 24d42: c0 e0 ldi r28, 0x00 ; 0 { if (tmc2130_sg_homing_axes_mask & mask) { 24d44: 81 2f mov r24, r17 24d46: 8d 23 and r24, r29 24d48: 19 f0 breq .+6 ; 0x24d50 tmc2130_XYZ_reg_init(axis); 24d4a: 8c 2f mov r24, r28 24d4c: 0f 94 e8 25 call 0x24bd0 ; 0x24bd0 #ifdef TMC2130_SG_HOMING if (tmc2130_sg_homing_axes_mask & (X_AXIS_MASK | Y_AXIS_MASK)) tmc2130_wait_standstill_xy(1000); if (tmc2130_sg_homing_axes_mask) { for (uint8_t axis = X_AXIS, mask = X_AXIS_MASK; axis <= Z_AXIS; axis++, mask <<= 1) //X Y and Z axes 24d50: cf 5f subi r28, 0xFF ; 255 24d52: dd 0f add r29, r29 24d54: c3 30 cpi r28, 0x03 ; 3 24d56: b1 f7 brne .-20 ; 0x24d44 { if (tmc2130_sg_homing_axes_mask & mask) { tmc2130_XYZ_reg_init(axis); } } tmc2130_sg_homing_axes_mask = 0x00; 24d58: 10 92 42 06 sts 0x0642, r1 ; 0x800642 } tmc2130_sg_crash = false; 24d5c: 10 92 0c 05 sts 0x050C, r1 ; 0x80050c #endif } 24d60: df 91 pop r29 24d62: cf 91 pop r28 24d64: 1f 91 pop r17 24d66: 08 95 ret 00024d68 : } return false; } void tmc2130_home_enter(uint8_t axes_mask) { 24d68: df 92 push r13 24d6a: ef 92 push r14 24d6c: ff 92 push r15 24d6e: 0f 93 push r16 24d70: 1f 93 push r17 24d72: cf 93 push r28 24d74: df 93 push r29 24d76: 00 d0 rcall .+0 ; 0x24d78 24d78: cd b7 in r28, 0x3d ; 61 24d7a: de b7 in r29, 0x3e ; 62 24d7c: d8 2e mov r13, r24 printf_P(PSTR("tmc2130_home_enter(axes_mask=0x%02x)\n"), axes_mask); 24d7e: 1f 92 push r1 24d80: 8f 93 push r24 24d82: 87 ee ldi r24, 0xE7 ; 231 24d84: 9e e9 ldi r25, 0x9E ; 158 24d86: 9f 93 push r25 24d88: 8f 93 push r24 24d8a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 #ifdef TMC2130_SG_HOMING if (axes_mask & (X_AXIS_MASK | Y_AXIS_MASK)) //X or Y 24d8e: 8d 2d mov r24, r13 24d90: 83 70 andi r24, 0x03 ; 3 24d92: 0f 90 pop r0 24d94: 0f 90 pop r0 24d96: 0f 90 pop r0 24d98: 0f 90 pop r0 24d9a: 11 f0 breq .+4 ; 0x24da0 tmc2130_wait_standstill_xy(1000); 24d9c: 0f 94 0c 88 call 0x31018 ; 0x31018 } return false; } void tmc2130_home_enter(uint8_t axes_mask) { 24da0: 10 e0 ldi r17, 0x00 ; 0 24da2: 00 e0 ldi r16, 0x00 ; 0 24da4: ff 24 eor r15, r15 24da6: f3 94 inc r15 24da8: e0 2e mov r14, r16 #ifdef TMC2130_SG_HOMING if (axes_mask & (X_AXIS_MASK | Y_AXIS_MASK)) //X or Y tmc2130_wait_standstill_xy(1000); for (uint8_t axis = X_AXIS, mask = X_AXIS_MASK; axis <= Z_AXIS; axis++, mask <<= 1) //X Y and Z axes { if (axes_mask & mask) 24daa: 8d 2d mov r24, r13 24dac: 8f 21 and r24, r15 24dae: 09 f4 brne .+2 ; 0x24db2 24db0: 46 c0 rjmp .+140 ; 0x24e3e { tmc2130_sg_homing_axes_mask |= mask; 24db2: 80 91 42 06 lds r24, 0x0642 ; 0x800642 24db6: 8f 29 or r24, r15 24db8: 80 93 42 06 sts 0x0642, r24 ; 0x800642 //Configuration to spreadCycle tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_NORMAL); 24dbc: 20 e0 ldi r18, 0x00 ; 0 24dbe: 30 e0 ldi r19, 0x00 ; 0 24dc0: a9 01 movw r20, r18 24dc2: 60 e8 ldi r22, 0x80 ; 128 24dc4: 80 2f mov r24, r16 24dc6: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr_home[axis]) << 16)); 24dca: f8 01 movw r30, r16 24dcc: e9 5e subi r30, 0xE9 ; 233 24dce: fc 4f sbci r31, 0xFC ; 252 24dd0: 20 81 ld r18, Z 24dd2: 30 e0 ldi r19, 0x00 ; 0 24dd4: 50 e0 ldi r21, 0x00 ; 0 24dd6: 40 e0 ldi r20, 0x00 ; 0 24dd8: a9 01 movw r20, r18 24dda: 33 27 eor r19, r19 24ddc: 22 27 eor r18, r18 24dde: 6d ee ldi r22, 0xED ; 237 24de0: 80 2f mov r24, r16 24de2: 0f 94 27 25 call 0x24a4e ; 0x24a4e static void tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval); static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval); uint16_t __tcoolthrs(uint8_t axis) { switch (axis) 24de6: 82 e0 ldi r24, 0x02 ; 2 { case X_AXIS: return TMC2130_TCOOLTHRS_X; case Y_AXIS: return TMC2130_TCOOLTHRS_Y; case Z_AXIS: return TMC2130_TCOOLTHRS_Z; 24de8: 24 ef ldi r18, 0xF4 ; 244 24dea: 31 e0 ldi r19, 0x01 ; 1 static void tmc2130_tx(uint8_t axis, uint8_t addr, uint32_t wval); static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval); uint16_t __tcoolthrs(uint8_t axis) { switch (axis) 24dec: 08 17 cp r16, r24 24dee: 11 f0 breq .+4 ; 0x24df4 { case X_AXIS: return TMC2130_TCOOLTHRS_X; 24df0: 2e ea ldi r18, 0xAE ; 174 24df2: 31 e0 ldi r19, 0x01 ; 1 { tmc2130_sg_homing_axes_mask |= mask; //Configuration to spreadCycle tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_NORMAL); tmc2130_wr(axis, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr_home[axis]) << 16)); tmc2130_wr(axis, TMC2130_REG_TCOOLTHRS, __tcoolthrs(axis)); 24df4: 50 e0 ldi r21, 0x00 ; 0 24df6: 40 e0 ldi r20, 0x00 ; 0 24df8: 64 e9 ldi r22, 0x94 ; 148 24dfa: 8e 2d mov r24, r14 24dfc: 0f 94 27 25 call 0x24a4e ; 0x24a4e iRun >>= 1; } } // PROGMEM initializer inline __attribute__((always_inline)) MotorCurrents(const MotorCurrents &curr_P) { memcpy_P(this, &curr_P, sizeof(*this)); } 24e00: b8 01 movw r22, r16 24e02: 66 0f add r22, r22 24e04: 77 1f adc r23, r23 24e06: 60 0f add r22, r16 24e08: 71 1f adc r23, r17 24e0a: 65 52 subi r22, 0x25 ; 37 24e0c: 71 46 sbci r23, 0x61 ; 97 24e0e: 43 e0 ldi r20, 0x03 ; 3 24e10: 50 e0 ldi r21, 0x00 ; 0 24e12: ce 01 movw r24, r28 24e14: 01 96 adiw r24, 0x01 ; 1 24e16: 0f 94 aa d9 call 0x3b354 ; 0x3b354 MotorCurrents curr(homing_currents_P[axis]); tmc2130_setup_chopper(axis, tmc2130_mres[axis], &curr); 24e1a: ae 01 movw r20, r28 24e1c: 4f 5f subi r20, 0xFF ; 255 24e1e: 5f 4f sbci r21, 0xFF ; 255 24e20: f8 01 movw r30, r16 24e22: ec 50 subi r30, 0x0C ; 12 24e24: fb 4f sbci r31, 0xFB ; 251 24e26: 60 81 ld r22, Z 24e28: 8e 2d mov r24, r14 24e2a: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); //stallguard output DIAG1, DIAG1 = pushpull 24e2e: 20 e8 ldi r18, 0x80 ; 128 24e30: 31 e0 ldi r19, 0x01 ; 1 24e32: 40 e0 ldi r20, 0x00 ; 0 24e34: 50 e0 ldi r21, 0x00 ; 0 24e36: 60 e8 ldi r22, 0x80 ; 128 24e38: 8e 2d mov r24, r14 24e3a: 0f 94 27 25 call 0x24a4e ; 0x24a4e { printf_P(PSTR("tmc2130_home_enter(axes_mask=0x%02x)\n"), axes_mask); #ifdef TMC2130_SG_HOMING if (axes_mask & (X_AXIS_MASK | Y_AXIS_MASK)) //X or Y tmc2130_wait_standstill_xy(1000); for (uint8_t axis = X_AXIS, mask = X_AXIS_MASK; axis <= Z_AXIS; axis++, mask <<= 1) //X Y and Z axes 24e3e: ff 0c add r15, r15 24e40: 0f 5f subi r16, 0xFF ; 255 24e42: 1f 4f sbci r17, 0xFF ; 255 24e44: 03 30 cpi r16, 0x03 ; 3 24e46: 11 05 cpc r17, r1 24e48: 09 f0 breq .+2 ; 0x24e4c 24e4a: ae cf rjmp .-164 ; 0x24da8 tmc2130_setup_chopper(axis, tmc2130_mres[axis], &curr); tmc2130_wr(axis, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); //stallguard output DIAG1, DIAG1 = pushpull } } #endif //TMC2130_SG_HOMING } 24e4c: 0f 90 pop r0 24e4e: 0f 90 pop r0 24e50: 0f 90 pop r0 24e52: df 91 pop r29 24e54: cf 91 pop r28 24e56: 1f 91 pop r17 24e58: 0f 91 pop r16 24e5a: ff 90 pop r15 24e5c: ef 90 pop r14 24e5e: df 90 pop r13 24e60: 08 95 ret 00024e62 : crashdet_stop_and_save_print(); } } void crashdet_use_eeprom_setting() { tmc2130_sg_stop_on_crash = eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET); 24e62: 89 e6 ldi r24, 0x69 ; 105 24e64: 9f e0 ldi r25, 0x0F ; 15 24e66: 0f 94 10 dc call 0x3b820 ; 0x3b820 24e6a: 91 e0 ldi r25, 0x01 ; 1 24e6c: 81 11 cpse r24, r1 24e6e: 01 c0 rjmp .+2 ; 0x24e72 24e70: 90 e0 ldi r25, 0x00 ; 0 24e72: 90 93 5c 02 sts 0x025C, r25 ; 0x80025c } 24e76: 08 95 ret 00024e78 : tmc2130_wr(axis, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS); } } void tmc2130_init(TMCInitParams params) { 24e78: cf 93 push r28 24e7a: c8 2f mov r28, r24 // DBG(_n("tmc2130_init(), mode=%S\n"), tmc2130_mode?_n("STEALTH"):_n("NORMAL")); WRITE(X_TMC2130_CS, HIGH); 24e7c: a0 9a sbi 0x14, 0 ; 20 WRITE(Y_TMC2130_CS, HIGH); 24e7e: a2 9a sbi 0x14, 2 ; 20 WRITE(Z_TMC2130_CS, HIGH); 24e80: 9f b7 in r25, 0x3f ; 63 24e82: f8 94 cli 24e84: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24e88: 80 62 ori r24, 0x20 ; 32 24e8a: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24e8e: 9f bf out 0x3f, r25 ; 63 WRITE(E0_TMC2130_CS, HIGH); 24e90: 9f b7 in r25, 0x3f ; 63 24e92: f8 94 cli 24e94: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24e98: 80 61 ori r24, 0x10 ; 16 24e9a: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24e9e: 9f bf out 0x3f, r25 ; 63 SET_OUTPUT(X_TMC2130_CS); 24ea0: 98 9a sbi 0x13, 0 ; 19 SET_OUTPUT(Y_TMC2130_CS); 24ea2: 9a 9a sbi 0x13, 2 ; 19 SET_OUTPUT(Z_TMC2130_CS); 24ea4: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24ea8: 80 62 ori r24, 0x20 ; 32 24eaa: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_OUTPUT(E0_TMC2130_CS); 24eae: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24eb2: 80 61 ori r24, 0x10 ; 16 24eb4: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_INPUT(X_TMC2130_DIAG); 24eb8: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24ebc: 8b 7f andi r24, 0xFB ; 251 24ebe: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_INPUT(Y_TMC2130_DIAG); 24ec2: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24ec6: 8f 77 andi r24, 0x7F ; 127 24ec8: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_INPUT(Z_TMC2130_DIAG); 24ecc: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24ed0: 8f 7b andi r24, 0xBF ; 191 24ed2: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> SET_INPUT(E0_TMC2130_DIAG); 24ed6: 80 91 07 01 lds r24, 0x0107 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> 24eda: 87 7f andi r24, 0xF7 ; 247 24edc: 80 93 07 01 sts 0x0107, r24 ; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107> WRITE(X_TMC2130_DIAG,HIGH); 24ee0: 9f b7 in r25, 0x3f ; 63 24ee2: f8 94 cli 24ee4: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24ee8: 84 60 ori r24, 0x04 ; 4 24eea: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24eee: 9f bf out 0x3f, r25 ; 63 WRITE(Y_TMC2130_DIAG,HIGH); 24ef0: 9f b7 in r25, 0x3f ; 63 24ef2: f8 94 cli 24ef4: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24ef8: 80 68 ori r24, 0x80 ; 128 24efa: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24efe: 9f bf out 0x3f, r25 ; 63 WRITE(Z_TMC2130_DIAG,HIGH); 24f00: 9f b7 in r25, 0x3f ; 63 24f02: f8 94 cli 24f04: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24f08: 80 64 ori r24, 0x40 ; 64 24f0a: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24f0e: 9f bf out 0x3f, r25 ; 63 WRITE(E0_TMC2130_DIAG,HIGH); 24f10: 9f b7 in r25, 0x3f ; 63 24f12: f8 94 cli 24f14: 80 91 08 01 lds r24, 0x0108 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24f18: 88 60 ori r24, 0x08 ; 8 24f1a: 80 93 08 01 sts 0x0108, r24 ; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108> 24f1e: 9f bf out 0x3f, r25 ; 63 for (uint_least8_t axis = 0; axis < E_AXIS; axis++) // X Y Z axes { tmc2130_XYZ_reg_init(axis); 24f20: 80 e0 ldi r24, 0x00 ; 0 24f22: 0f 94 e8 25 call 0x24bd0 ; 0x24bd0 24f26: 81 e0 ldi r24, 0x01 ; 1 24f28: 0f 94 e8 25 call 0x24bd0 ; 0x24bd0 24f2c: 82 e0 ldi r24, 0x02 ; 2 24f2e: 0f 94 e8 25 call 0x24bd0 ; 0x24bd0 } // E axis tmc2130_setup_chopper(E_AXIS, tmc2130_mres[E_AXIS]); 24f32: 50 e0 ldi r21, 0x00 ; 0 24f34: 40 e0 ldi r20, 0x00 ; 0 24f36: 60 91 f7 04 lds r22, 0x04F7 ; 0x8004f7 24f3a: 83 e0 ldi r24, 0x03 ; 3 24f3c: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 tmc2130_wr(E_AXIS, TMC2130_REG_TPOWERDOWN, 0x00000000); 24f40: 20 e0 ldi r18, 0x00 ; 0 24f42: 30 e0 ldi r19, 0x00 ; 0 24f44: a9 01 movw r20, r18 24f46: 61 e9 ldi r22, 0x91 ; 145 24f48: 83 e0 ldi r24, 0x03 ; 3 24f4a: 0f 94 27 25 call 0x24a4e ; 0x24a4e #ifndef TMC2130_STEALTH_E if( ! params.enableECool ){ 24f4e: c1 fd sbrc r28, 1 24f50: 1d c0 rjmp .+58 ; 0x24f8c tmc2130_wr(E_AXIS, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); 24f52: 20 e8 ldi r18, 0x80 ; 128 24f54: 31 e0 ldi r19, 0x01 ; 1 24f56: 40 e0 ldi r20, 0x00 ; 0 24f58: 50 e0 ldi r21, 0x00 ; 0 24f5a: 60 e8 ldi r22, 0x80 ; 128 24f5c: 83 e0 ldi r24, 0x03 ; 3 24f5e: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(E_AXIS, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS); #endif //TMC2130_STEALTH_E #ifdef TMC2130_LINEARITY_CORRECTION #ifdef TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_set_wave(X_AXIS, 247, tmc2130_wave_fac[X_AXIS]); 24f62: 60 91 f8 04 lds r22, 0x04F8 ; 0x8004f8 24f66: 80 e0 ldi r24, 0x00 ; 0 24f68: 0f 94 80 88 call 0x31100 ; 0x31100 tmc2130_set_wave(Y_AXIS, 247, tmc2130_wave_fac[Y_AXIS]); 24f6c: 60 91 f9 04 lds r22, 0x04F9 ; 0x8004f9 24f70: 81 e0 ldi r24, 0x01 ; 1 24f72: 0f 94 80 88 call 0x31100 ; 0x31100 tmc2130_set_wave(Z_AXIS, 247, tmc2130_wave_fac[Z_AXIS]); 24f76: 60 91 fa 04 lds r22, 0x04FA ; 0x8004fa 24f7a: 82 e0 ldi r24, 0x02 ; 2 24f7c: 0f 94 80 88 call 0x31100 ; 0x31100 #endif //TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_set_wave(E_AXIS, 247, tmc2130_wave_fac[E_AXIS]); 24f80: 60 91 fb 04 lds r22, 0x04FB ; 0x8004fb 24f84: 83 e0 ldi r24, 0x03 ; 3 #ifdef PSU_Delta if(!params.bSuppressFlag) check_force_z(); #endif // PSU_Delta } 24f86: cf 91 pop r28 #ifdef TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_set_wave(X_AXIS, 247, tmc2130_wave_fac[X_AXIS]); tmc2130_set_wave(Y_AXIS, 247, tmc2130_wave_fac[Y_AXIS]); tmc2130_set_wave(Z_AXIS, 247, tmc2130_wave_fac[Z_AXIS]); #endif //TMC2130_LINEARITY_CORRECTION_XYZ tmc2130_set_wave(E_AXIS, 247, tmc2130_wave_fac[E_AXIS]); 24f88: 0d 94 80 88 jmp 0x31100 ; 0x31100 tmc2130_wr(E_AXIS, TMC2130_REG_TPOWERDOWN, 0x00000000); #ifndef TMC2130_STEALTH_E if( ! params.enableECool ){ tmc2130_wr(E_AXIS, TMC2130_REG_GCONF, TMC2130_GCONF_SGSENS); } else { tmc2130_wr(E_AXIS, TMC2130_REG_COOLCONF, (((uint32_t)tmc2130_sg_thr[E_AXIS]) << 16)); 24f8c: 20 e0 ldi r18, 0x00 ; 0 24f8e: 30 e0 ldi r19, 0x00 ; 0 24f90: 43 e0 ldi r20, 0x03 ; 3 24f92: 50 e0 ldi r21, 0x00 ; 0 24f94: 6d ee ldi r22, 0xED ; 237 24f96: 83 e0 ldi r24, 0x03 ; 3 24f98: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(E_AXIS, TMC2130_REG_TCOOLTHRS, 0); 24f9c: 20 e0 ldi r18, 0x00 ; 0 24f9e: 30 e0 ldi r19, 0x00 ; 0 24fa0: a9 01 movw r20, r18 24fa2: 64 e9 ldi r22, 0x94 ; 148 24fa4: 83 e0 ldi r24, 0x03 ; 3 24fa6: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(E_AXIS, TMC2130_REG_GCONF, TMC2130_GCONF_SILENT); 24faa: 24 e0 ldi r18, 0x04 ; 4 24fac: 30 e0 ldi r19, 0x00 ; 0 24fae: 40 e0 ldi r20, 0x00 ; 0 24fb0: 50 e0 ldi r21, 0x00 ; 0 24fb2: 60 e8 ldi r22, 0x80 ; 128 24fb4: 83 e0 ldi r24, 0x03 ; 3 24fb6: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(E_AXIS, TMC2130_REG_PWMCONF, pwmconf_Ecool.dw); 24fba: 2b e2 ldi r18, 0x2B ; 43 24fbc: 34 e5 ldi r19, 0x54 ; 84 24fbe: 42 e0 ldi r20, 0x02 ; 2 24fc0: 50 e0 ldi r21, 0x00 ; 0 24fc2: 60 ef ldi r22, 0xF0 ; 240 24fc4: 83 e0 ldi r24, 0x03 ; 3 24fc6: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_wr(E_AXIS, TMC2130_REG_TPWMTHRS, TMC2130_TPWMTHRS_E); 24fca: 23 e9 ldi r18, 0x93 ; 147 24fcc: 31 e0 ldi r19, 0x01 ; 1 24fce: 40 e0 ldi r20, 0x00 ; 0 24fd0: 50 e0 ldi r21, 0x00 ; 0 24fd2: 63 e9 ldi r22, 0x93 ; 147 24fd4: 83 e0 ldi r24, 0x03 ; 3 24fd6: 0f 94 27 25 call 0x24a4e ; 0x24a4e SERIAL_ECHOLNRPGM(eMotorCurrentScalingEnabled); 24fda: 8b eb ldi r24, 0xBB ; 187 24fdc: 9e e9 ldi r25, 0x9E ; 158 24fde: 0e 94 13 79 call 0xf226 ; 0xf226 24fe2: bf cf rjmp .-130 ; 0x24f62 00024fe4 : , iHold((ir < 32) ? ih : (ih >> 1)) {} inline uint8_t getiRun() const { return iRun; } inline uint8_t getiHold() const { return min(iHold, iRun); } inline uint8_t getOriginaliRun() const { return vSense ? iRun : iRun << 1; } inline uint8_t getOriginaliHold() const { return min(vSense ? iHold : iHold << 1, getOriginaliRun()); } 24fe4: fc 01 movw r30, r24 24fe6: 20 81 ld r18, Z 24fe8: 92 81 ldd r25, Z+2 ; 0x02 24fea: 49 2f mov r20, r25 24fec: 50 e0 ldi r21, 0x00 ; 0 24fee: 21 11 cpse r18, r1 24ff0: 02 c0 rjmp .+4 ; 0x24ff6 24ff2: 44 0f add r20, r20 24ff4: 55 1f adc r21, r21 24ff6: 81 81 ldd r24, Z+1 ; 0x01 , iRun((ir < 32) ? ir : (ir >> 1)) , iHold((ir < 32) ? ih : (ih >> 1)) {} inline uint8_t getiRun() const { return iRun; } inline uint8_t getiHold() const { return min(iHold, iRun); } inline uint8_t getOriginaliRun() const { return vSense ? iRun : iRun << 1; } 24ff8: 21 11 cpse r18, r1 24ffa: 01 c0 rjmp .+2 ; 0x24ffe 24ffc: 88 0f add r24, r24 inline uint8_t getOriginaliHold() const { return min(vSense ? iHold : iHold << 1, getOriginaliRun()); } 24ffe: 84 17 cp r24, r20 25000: 15 06 cpc r1, r21 25002: 31 f0 breq .+12 ; 0x25010 25004: 2c f0 brlt .+10 ; 0x25010 25006: 89 2f mov r24, r25 25008: 21 11 cpse r18, r1 2500a: 02 c0 rjmp .+4 ; 0x25010 2500c: 88 0f add r24, r24 2500e: 08 95 ret 25010: 08 95 ret 00025012 : } unsigned long micros2(void) { unsigned long m; uint8_t oldSREG = SREG, t; 25012: 3f b7 in r19, 0x3f ; 63 cli(); 25014: f8 94 cli m = timer2_overflow_count; 25016: 80 91 3e 06 lds r24, 0x063E ; 0x80063e 2501a: 90 91 3f 06 lds r25, 0x063F ; 0x80063f 2501e: a0 91 40 06 lds r26, 0x0640 ; 0x800640 25022: b0 91 41 06 lds r27, 0x0641 ; 0x800641 #if defined(TCNT2) t = TCNT2; 25026: 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)) 2502a: b8 9b sbis 0x17, 0 ; 23 2502c: 05 c0 rjmp .+10 ; 0x25038 2502e: 2f 3f cpi r18, 0xFF ; 255 25030: 19 f0 breq .+6 ; 0x25038 m++; 25032: 01 96 adiw r24, 0x01 ; 1 25034: a1 1d adc r26, r1 25036: b1 1d adc r27, r1 #else if ((TIFR & _BV(TOV2)) && (t < 255)) m++; #endif SREG = oldSREG; 25038: 3f bf out 0x3f, r19 ; 63 return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); 2503a: ba 2f mov r27, r26 2503c: a9 2f mov r26, r25 2503e: 98 2f mov r25, r24 25040: 88 27 eor r24, r24 25042: bc 01 movw r22, r24 25044: cd 01 movw r24, r26 25046: 62 0f add r22, r18 25048: 71 1d adc r23, r1 2504a: 81 1d adc r24, r1 2504c: 91 1d adc r25, r1 2504e: 42 e0 ldi r20, 0x02 ; 2 25050: 66 0f add r22, r22 25052: 77 1f adc r23, r23 25054: 88 1f adc r24, r24 25056: 99 1f adc r25, r25 25058: 4a 95 dec r20 2505a: d1 f7 brne .-12 ; 0x25050 } 2505c: 08 95 ret 0002505e : void delay2(unsigned long ms) { 2505e: 8f 92 push r8 25060: 9f 92 push r9 25062: af 92 push r10 25064: bf 92 push r11 25066: cf 92 push r12 25068: df 92 push r13 2506a: ef 92 push r14 2506c: ff 92 push r15 2506e: 6b 01 movw r12, r22 25070: 7c 01 movw r14, r24 uint32_t start = micros2(); 25072: 0f 94 09 28 call 0x25012 ; 0x25012 25076: 4b 01 movw r8, r22 25078: 5c 01 movw r10, r24 while (ms > 0) { yield(); while ( ms > 0 && (micros2() - start) >= 1000) 2507a: c1 14 cp r12, r1 2507c: d1 04 cpc r13, r1 2507e: e1 04 cpc r14, r1 25080: f1 04 cpc r15, r1 25082: b9 f0 breq .+46 ; 0x250b2 25084: 0f 94 09 28 call 0x25012 ; 0x25012 25088: 68 19 sub r22, r8 2508a: 79 09 sbc r23, r9 2508c: 8a 09 sbc r24, r10 2508e: 9b 09 sbc r25, r11 25090: 68 3e cpi r22, 0xE8 ; 232 25092: 73 40 sbci r23, 0x03 ; 3 25094: 81 05 cpc r24, r1 25096: 91 05 cpc r25, r1 25098: 80 f3 brcs .-32 ; 0x2507a { ms--; 2509a: 21 e0 ldi r18, 0x01 ; 1 2509c: c2 1a sub r12, r18 2509e: d1 08 sbc r13, r1 250a0: e1 08 sbc r14, r1 250a2: f1 08 sbc r15, r1 start += 1000; 250a4: 88 ee ldi r24, 0xE8 ; 232 250a6: 88 0e add r8, r24 250a8: 83 e0 ldi r24, 0x03 ; 3 250aa: 98 1e adc r9, r24 250ac: a1 1c adc r10, r1 250ae: b1 1c adc r11, r1 250b0: e4 cf rjmp .-56 ; 0x2507a } } } 250b2: ff 90 pop r15 250b4: ef 90 pop r14 250b6: df 90 pop r13 250b8: cf 90 pop r12 250ba: bf 90 pop r11 250bc: af 90 pop r10 250be: 9f 90 pop r9 250c0: 8f 90 pop r8 250c2: 08 95 ret 000250c4 : * @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() { 250c4: ef 92 push r14 250c6: ff 92 push r15 250c8: 0f 93 push r16 250ca: 1f 93 push r17 250cc: cf 93 push r28 250ce: df 93 push r29 250d0: cd b7 in r28, 0x3d ; 61 250d2: de b7 in r29, 0x3e ; 62 250d4: 63 97 sbiw r28, 0x13 ; 19 250d6: 0f b6 in r0, 0x3f ; 63 250d8: f8 94 cli 250da: de bf out 0x3e, r29 ; 62 250dc: 0f be out 0x3f, r0 ; 63 250de: 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) 250e0: 80 91 a7 03 lds r24, 0x03A7 ; 0x8003a7 250e4: 81 11 cpse r24, r1 250e6: 3a c0 rjmp .+116 ; 0x2515c { // Menu was entered. // Initialize its status. _md->status = 1; 250e8: 81 e0 ldi r24, 0x01 ; 1 250ea: 80 93 a7 03 sts 0x03A7, r24 ; 0x8003a7 check_babystep(); 250ee: 0e 94 17 79 call 0xf22e ; 0xf22e if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))){ 250f2: 81 ea ldi r24, 0xA1 ; 161 250f4: 9d e0 ldi r25, 0x0D ; 13 250f6: 0f 94 10 dc call 0x3b820 ; 0x3b820 250fa: 18 2f mov r17, r24 250fc: 0e 94 d9 75 call 0xebb2 ; 0xebb2 25100: 81 11 cpse r24, r1 25102: ee c0 rjmp .+476 ; 0x252e0 _md->babystepMemZ = 0; 25104: 10 92 a9 03 sts 0x03A9, r1 ; 0x8003a9 25108: 10 92 a8 03 sts 0x03A8, r1 ; 0x8003a8 _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)) 2510c: 80 e1 ldi r24, 0x10 ; 16 2510e: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 25112: 81 11 cpse r24, r1 25114: 04 c0 rjmp .+8 ; 0x2511e _md->babystepMemZ = 0; 25116: 10 92 a9 03 sts 0x03A9, r1 ; 0x8003a9 2511a: 10 92 a8 03 sts 0x03A8, r1 ; 0x8003a8 _md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS]; 2511e: 60 91 a8 03 lds r22, 0x03A8 ; 0x8003a8 25122: 70 91 a9 03 lds r23, 0x03A9 ; 0x8003a9 25126: 07 2e mov r0, r23 25128: 00 0c add r0, r0 2512a: 88 0b sbc r24, r24 2512c: 99 0b sbc r25, r25 2512e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 25132: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 25136: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 2513a: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 2513e: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 25142: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 25146: 60 93 aa 03 sts 0x03AA, r22 ; 0x8003aa 2514a: 70 93 ab 03 sts 0x03AB, r23 ; 0x8003ab 2514e: 80 93 ac 03 sts 0x03AC, r24 ; 0x8003ac 25152: 90 93 ad 03 sts 0x03AD, r25 ; 0x8003ad lcd_draw_update = 1; 25156: 81 e0 ldi r24, 0x01 ; 1 25158: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d //SERIAL_ECHO("Z baby step: "); //SERIAL_ECHO(_md->babystepMem[2]); } if (lcd_encoder != 0) 2515c: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 25160: 90 91 70 06 lds r25, 0x0670 ; 0x800670 25164: 00 97 sbiw r24, 0x00 ; 0 25166: f1 f1 breq .+124 ; 0x251e4 { _md->babystepMemZ += lcd_encoder; 25168: 20 91 a8 03 lds r18, 0x03A8 ; 0x8003a8 2516c: 30 91 a9 03 lds r19, 0x03A9 ; 0x8003a9 25170: 28 0f add r18, r24 25172: 39 1f adc r19, r25 25174: 30 93 a9 03 sts 0x03A9, r19 ; 0x8003a9 25178: 20 93 a8 03 sts 0x03A8, r18 ; 0x8003a8 if (_md->babystepMemZ < Z_BABYSTEP_MIN) _md->babystepMemZ = Z_BABYSTEP_MIN; //-3999 -> -9.99 mm 2517c: 21 36 cpi r18, 0x61 ; 97 2517e: 40 ef ldi r20, 0xF0 ; 240 25180: 34 07 cpc r19, r20 25182: 0c f0 brlt .+2 ; 0x25186 25184: ba c0 rjmp .+372 ; 0x252fa 25186: 81 e6 ldi r24, 0x61 ; 97 25188: 90 ef ldi r25, 0xF0 ; 240 2518a: 90 93 a9 03 sts 0x03A9, r25 ; 0x8003a9 2518e: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 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]; 25192: 60 91 a8 03 lds r22, 0x03A8 ; 0x8003a8 25196: 70 91 a9 03 lds r23, 0x03A9 ; 0x8003a9 2519a: 07 2e mov r0, r23 2519c: 00 0c add r0, r0 2519e: 88 0b sbc r24, r24 251a0: 99 0b sbc r25, r25 251a2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 251a6: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 251aa: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 251ae: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 251b2: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 251b6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 251ba: 60 93 aa 03 sts 0x03AA, r22 ; 0x8003aa 251be: 70 93 ab 03 sts 0x03AB, r23 ; 0x8003ab 251c2: 80 93 ac 03 sts 0x03AC, r24 ; 0x8003ac 251c6: 90 93 ad 03 sts 0x03AD, r25 ; 0x8003ad _delay(50); 251ca: 62 e3 ldi r22, 0x32 ; 50 251cc: 70 e0 ldi r23, 0x00 ; 0 251ce: 80 e0 ldi r24, 0x00 ; 0 251d0: 90 e0 ldi r25, 0x00 ; 0 251d2: 0f 94 2f 28 call 0x2505e ; 0x2505e lcd_encoder = 0; 251d6: 10 92 70 06 sts 0x0670, r1 ; 0x800670 251da: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f lcd_draw_update = 1; 251de: 81 e0 ldi r24, 0x01 ; 1 251e0: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } if (lcd_draw_update) 251e4: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 251e8: 88 23 and r24, r24 251ea: c9 f1 breq .+114 ; 0x2525e { SheetFormatBuffer buffer; menu_format_sheet_E(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))], buffer); 251ec: 81 ea ldi r24, 0xA1 ; 161 251ee: 9d e0 ldi r25, 0x0D ; 13 251f0: 0f 94 10 dc call 0x3b820 ; 0x3b820 251f4: 2b e0 ldi r18, 0x0B ; 11 251f6: 82 9f mul r24, r18 251f8: c0 01 movw r24, r0 251fa: 11 24 eor r1, r1 251fc: be 01 movw r22, r28 251fe: 6f 5f subi r22, 0xFF ; 255 25200: 7f 4f sbci r23, 0xFF ; 255 25202: 87 5b subi r24, 0xB7 ; 183 25204: 92 4f sbci r25, 0xF2 ; 242 25206: 0f 94 24 d0 call 0x3a048 ; 0x3a048 lcd_home(); 2520a: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_print(buffer.c); 2520e: ce 01 movw r24, r28 25210: 01 96 adiw r24, 0x01 ; 1 25212: 0e 94 7f 70 call 0xe0fe ; 0xe0fe lcd_set_cursor(0, 1); 25216: 61 e0 ldi r22, 0x01 ; 1 25218: 80 e0 ldi r24, 0x00 ; 0 2521a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 menu_draw_float13(_T(MSG_BABYSTEPPING_Z), _md->babystepMemMMZ); 2521e: 10 91 aa 03 lds r17, 0x03AA ; 0x8003aa 25222: 00 91 ab 03 lds r16, 0x03AB ; 0x8003ab 25226: f0 90 ac 03 lds r15, 0x03AC ; 0x8003ac 2522a: e0 90 ad 03 lds r14, 0x03AD ; 0x8003ad 2522e: 8d ec ldi r24, 0xCD ; 205 25230: 90 e5 ldi r25, 0x50 ; 80 25232: 0e 94 44 72 call 0xe488 ; 0xe488 //! (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); 25236: ef 92 push r14 25238: ff 92 push r15 2523a: 0f 93 push r16 2523c: 1f 93 push r17 2523e: 9f 93 push r25 25240: 8f 93 push r24 25242: 1f 92 push r1 25244: 80 e2 ldi r24, 0x20 ; 32 25246: 8f 93 push r24 25248: 8a e8 ldi r24, 0x8A ; 138 2524a: 92 ea ldi r25, 0xA2 ; 162 2524c: 9f 93 push r25 2524e: 8f 93 push r24 25250: 0e 94 51 6e call 0xdca2 ; 0xdca2 25254: 0f b6 in r0, 0x3f ; 63 25256: f8 94 cli 25258: de bf out 0x3e, r29 ; 62 2525a: 0f be out 0x3f, r0 ; 63 2525c: cd bf out 0x3d, r28 ; 61 } if (LCD_CLICKED || menu_leaving) 2525e: 80 91 a6 03 lds r24, 0x03A6 ; 0x8003a6 25262: 81 11 cpse r24, r1 25264: 04 c0 rjmp .+8 ; 0x2526e 25266: 80 91 d5 03 lds r24, 0x03D5 ; 0x8003d5 2526a: 88 23 and r24, r24 2526c: 51 f1 breq .+84 ; 0x252c2 { // Only update the EEPROM when leaving the menu. uint8_t active_sheet=eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 2526e: 81 ea ldi r24, 0xA1 ; 161 25270: 9d e0 ldi r25, 0x0D ; 13 25272: 0f 94 10 dc call 0x3b820 ; 0x3b820 25276: 9b e0 ldi r25, 0x0B ; 11 25278: 89 9f mul r24, r25 2527a: 80 01 movw r16, r0 2527c: 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); 2527e: 60 91 a8 03 lds r22, 0x03A8 ; 0x8003a8 25282: 70 91 a9 03 lds r23, 0x03A9 ; 0x8003a9 25286: c8 01 movw r24, r16 25288: 80 5b subi r24, 0xB0 ; 176 2528a: 92 4f sbci r25, 0xF2 ; 242 2528c: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 25290: 60 91 71 06 lds r22, 0x0671 ; 0x800671 25294: c8 01 movw r24, r16 25296: 8e 5a subi r24, 0xAE ; 174 25298: 92 4f sbci r25, 0xF2 ; 242 2529a: 0f 94 34 dc call 0x3b868 ; 0x3b868 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); 2529e: 60 91 97 03 lds r22, 0x0397 ; 0x800397 252a2: 70 91 98 03 lds r23, 0x0398 ; 0x800398 252a6: 80 91 99 03 lds r24, 0x0399 ; 0x800399 252aa: 90 91 9a 03 lds r25, 0x039A ; 0x80039a 252ae: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 252b2: c8 01 movw r24, r16 252b4: 8d 5a subi r24, 0xAD ; 173 252b6: 92 4f sbci r25, 0xF2 ; 242 252b8: 0f 94 34 dc call 0x3b868 ; 0x3b868 #endif //PINDA_THERMISTOR calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST); 252bc: 80 e1 ldi r24, 0x10 ; 16 252be: 0e 94 4b ef call 0x1de96 ; 0x1de96 } menu_back_if_clicked(); 252c2: 0f 94 f4 d4 call 0x3a9e8 ; 0x3a9e8 } 252c6: 63 96 adiw r28, 0x13 ; 19 252c8: 0f b6 in r0, 0x3f ; 63 252ca: f8 94 cli 252cc: de bf out 0x3e, r29 ; 62 252ce: 0f be out 0x3f, r0 ; 63 252d0: cd bf out 0x3d, r28 ; 61 252d2: df 91 pop r29 252d4: cf 91 pop r28 252d6: 1f 91 pop r17 252d8: 0f 91 pop r16 252da: ff 90 pop r15 252dc: ef 90 pop r14 252de: 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-> 252e0: 2b e0 ldi r18, 0x0B ; 11 252e2: 12 9f mul r17, r18 252e4: c0 01 movw r24, r0 252e6: 11 24 eor r1, r1 252e8: 80 5b subi r24, 0xB0 ; 176 252ea: 92 4f sbci r25, 0xF2 ; 242 252ec: 0f 94 1e dc call 0x3b83c ; 0x3b83c 252f0: 90 93 a9 03 sts 0x03A9, r25 ; 0x8003a9 252f4: 80 93 a8 03 sts 0x03A8, r24 ; 0x8003a8 252f8: 09 cf rjmp .-494 ; 0x2510c 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 252fa: 12 16 cp r1, r18 252fc: 13 06 cpc r1, r19 252fe: 2c f4 brge .+10 ; 0x2530a 25300: 10 92 a9 03 sts 0x03A9, r1 ; 0x8003a9 25304: 10 92 a8 03 sts 0x03A8, r1 ; 0x8003a8 25308: 44 cf rjmp .-376 ; 0x25192 extern volatile int babystepsTodo[3]; inline void babystepsTodoZadd(int n) { if (n != 0) { CRITICAL_SECTION_START 2530a: 2f b7 in r18, 0x3f ; 63 2530c: f8 94 cli babystepsTodo[Z_AXIS] += n; 2530e: 40 91 6c 06 lds r20, 0x066C ; 0x80066c 25312: 50 91 6d 06 lds r21, 0x066D ; 0x80066d 25316: 84 0f add r24, r20 25318: 95 1f adc r25, r21 2531a: 90 93 6d 06 sts 0x066D, r25 ; 0x80066d 2531e: 80 93 6c 06 sts 0x066C, r24 ; 0x80066c CRITICAL_SECTION_END 25322: 2f bf out 0x3f, r18 ; 63 25324: 36 cf rjmp .-404 ; 0x25192 00025326 : } void lcd_move_e() { if ((int)degHotend0() > extrude_min_temp) 25326: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 2532a: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 2532e: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 25332: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 25336: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2533a: 20 91 6b 02 lds r18, 0x026B ; 0x80026b 2533e: 30 91 6c 02 lds r19, 0x026C ; 0x80026c 25342: 26 17 cp r18, r22 25344: 37 07 cpc r19, r23 25346: 0c f0 brlt .+2 ; 0x2534a 25348: 65 c0 rjmp .+202 ; 0x25414 { if (lcd_encoder != 0) 2534a: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 2534e: 90 91 70 06 lds r25, 0x0670 ; 0x800670 25352: 89 2b or r24, r25 25354: b9 f1 breq .+110 ; 0x253c4 { refresh_cmd_timeout(); 25356: 0e 94 5b 66 call 0xccb6 ; 0xccb6 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; 2535a: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 if (++ next_block_index == BLOCK_BUFFER_SIZE) 2535e: 8f 5f subi r24, 0xFF ; 255 25360: 80 31 cpi r24, 0x10 ; 16 25362: 09 f4 brne .+2 ; 0x25366 next_block_index = 0; 25364: 80 e0 ldi r24, 0x00 ; 0 return block_buffer_tail == next_block_index; 25366: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 if (! planner_queue_full()) 2536a: 98 17 cp r25, r24 2536c: 59 f1 breq .+86 ; 0x253c4 { current_position[E_AXIS] += lcd_encoder; 2536e: 60 91 6f 06 lds r22, 0x066F ; 0x80066f 25372: 70 91 70 06 lds r23, 0x0670 ; 0x800670 25376: 07 2e mov r0, r23 25378: 00 0c add r0, r0 2537a: 88 0b sbc r24, r24 2537c: 99 0b sbc r25, r25 2537e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 25382: 9b 01 movw r18, r22 25384: ac 01 movw r20, r24 25386: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 2538a: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 2538e: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 25392: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 25396: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2539a: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 2539e: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 253a2: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 253a6: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 lcd_encoder = 0; 253aa: 10 92 70 06 sts 0x0670, r1 ; 0x800670 253ae: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f plan_buffer_line_curposXYZE(manual_feedrate[E_AXIS] / 60); 253b2: 65 e5 ldi r22, 0x55 ; 85 253b4: 75 e5 ldi r23, 0x55 ; 85 253b6: 85 ed ldi r24, 0xD5 ; 213 253b8: 9f e3 ldi r25, 0x3F ; 63 253ba: 0f 94 3d c0 call 0x3807a ; 0x3807a lcd_draw_update = 1; 253be: 81 e0 ldi r24, 0x01 ; 1 253c0: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d } } if (lcd_draw_update) 253c4: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 253c8: 88 23 and r24, r24 253ca: 11 f1 breq .+68 ; 0x25410 { lcd_set_cursor(0, 1); 253cc: 61 e0 ldi r22, 0x01 ; 1 253ce: 80 e0 ldi r24, 0x00 ; 0 253d0: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 //! 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); 253d4: 80 91 a0 06 lds r24, 0x06A0 ; 0x8006a0 253d8: 8f 93 push r24 253da: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 253de: 8f 93 push r24 253e0: 80 91 9e 06 lds r24, 0x069E ; 0x80069e 253e4: 8f 93 push r24 253e6: 80 91 9d 06 lds r24, 0x069D ; 0x80069d 253ea: 8f 93 push r24 253ec: 8c e6 ldi r24, 0x6C ; 108 253ee: 92 ea ldi r25, 0xA2 ; 162 253f0: 9f 93 push r25 253f2: 8f 93 push r24 253f4: 8d e5 ldi r24, 0x5D ; 93 253f6: 92 ea ldi r25, 0xA2 ; 162 253f8: 9f 93 push r25 253fa: 8f 93 push r24 253fc: 0e 94 51 6e call 0xdca2 ; 0xdca2 25400: 8d b7 in r24, 0x3d ; 61 25402: 9e b7 in r25, 0x3e ; 62 25404: 08 96 adiw r24, 0x08 ; 8 25406: 0f b6 in r0, 0x3f ; 63 25408: f8 94 cli 2540a: 9e bf out 0x3e, r25 ; 62 2540c: 0f be out 0x3f, r0 ; 63 2540e: 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(); 25410: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 }; } void show_preheat_nozzle_warning() { lcd_clear(); 25414: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_ERROR)); 25418: 8e e5 ldi r24, 0x5E ; 94 2541a: 90 e5 ldi r25, 0x50 ; 80 2541c: 0e 94 44 72 call 0xe488 ; 0xe488 25420: ac 01 movw r20, r24 25422: 60 e0 ldi r22, 0x00 ; 0 25424: 80 e0 ldi r24, 0x00 ; 0 25426: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 2, _T(MSG_PREHEAT_NOZZLE)); 2542a: 88 e4 ldi r24, 0x48 ; 72 2542c: 90 e5 ldi r25, 0x50 ; 80 2542e: 0e 94 44 72 call 0xe488 ; 0xe488 25432: ac 01 movw r20, r24 25434: 62 e0 ldi r22, 0x02 ; 2 25436: 80 e0 ldi r24, 0x00 ; 0 25438: 0e 94 8c 6e call 0xdd18 ; 0xdd18 _delay(2000); 2543c: 60 ed ldi r22, 0xD0 ; 208 2543e: 77 e0 ldi r23, 0x07 ; 7 25440: 80 e0 ldi r24, 0x00 ; 0 25442: 90 e0 ldi r25, 0x00 ; 0 25444: 0f 94 2f 28 call 0x2505e ; 0x2505e lcd_clear(); 25448: 0e 94 ab 6e call 0xdd56 ; 0xdd56 menu_back_if_clicked(); } else { show_preheat_nozzle_warning(); lcd_return_to_status(); 2544c: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 00025450 : } unsigned long millis2(void) { unsigned long m; uint8_t oldSREG = SREG; 25450: 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(); 25452: f8 94 cli m = timer2_millis; 25454: 60 91 3a 06 lds r22, 0x063A ; 0x80063a 25458: 70 91 3b 06 lds r23, 0x063B ; 0x80063b 2545c: 80 91 3c 06 lds r24, 0x063C ; 0x80063c 25460: 90 91 3d 06 lds r25, 0x063D ; 0x80063d SREG = oldSREG; 25464: 2f bf out 0x3f, r18 ; 63 return m; } 25466: 08 95 ret 00025468 : } //! @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); 25468: 20 e0 ldi r18, 0x00 ; 0 2546a: 30 e0 ldi r19, 0x00 ; 0 2546c: 40 e8 ldi r20, 0x80 ; 128 2546e: 5f eb ldi r21, 0xBF ; 191 25470: 60 e0 ldi r22, 0x00 ; 0 25472: 70 e0 ldi r23, 0x00 ; 0 25474: cb 01 movw r24, r22 25476: 0e 94 d7 88 call 0x111ae ; 0x111ae SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED); 2547a: 88 e9 ldi r24, 0x98 ; 152 2547c: 9e e6 ldi r25, 0x6E ; 110 2547e: 0e 94 13 79 call 0xf226 ; 0xf226 // Indicate that the printer is paused did_pause_print = true; 25482: 81 e0 ldi r24, 0x01 ; 1 25484: 80 93 e2 03 sts 0x03E2, r24 ; 0x8003e2 } else return false; } bool Stopwatch::pause() { if (isRunning()) { 25488: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 2548c: 81 30 cpi r24, 0x01 ; 1 2548e: 69 f4 brne .+26 ; 0x254aa state = PAUSED; 25490: 82 e0 ldi r24, 0x02 ; 2 25492: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b stopTimestamp = _millis(); 25496: 0f 94 28 2a call 0x25450 ; 0x25450 2549a: 60 93 51 06 sts 0x0651, r22 ; 0x800651 2549e: 70 93 52 06 sts 0x0652, r23 ; 0x800652 254a2: 80 93 53 06 sts 0x0653, r24 ; 0x800653 254a6: 90 93 54 06 sts 0x0654, r25 ; 0x800654 print_job_timer.pause(); // return to status is required to continue processing in the main loop! lcd_commands_type = LcdCommands::LongPause; 254aa: 82 e0 ldi r24, 0x02 ; 2 254ac: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 lcd_return_to_status(); 254b0: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 000254b4 ::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) 254b4: ff 92 push r15 254b6: 0f 93 push r16 254b8: 1f 93 push r17 254ba: cf 93 push r28 254bc: df 93 push r29 { if (!m_isRunning) return false; 254be: fc 01 movw r30, r24 254c0: f0 80 ld r15, Z 254c2: f1 10 cpse r15, r1 254c4: 08 c0 rjmp .+16 ; 0x254d6 ::expired(unsigned short)+0x22> 254c6: f1 2c mov r15, r1 expired = true; } } if (expired) m_isRunning = false; return expired; } 254c8: 8f 2d mov r24, r15 254ca: df 91 pop r29 254cc: cf 91 pop r28 254ce: 1f 91 pop r17 254d0: 0f 91 pop r16 254d2: ff 90 pop r15 254d4: 08 95 ret 254d6: 8b 01 movw r16, r22 254d8: ec 01 movw r28, r24 template bool Timer::expired(T msPeriod) { if (!m_isRunning) return false; bool expired = false; const T now = _millis(); 254da: 0f 94 28 2a call 0x25450 ; 0x25450 if (m_started <= m_started + msPeriod) 254de: 89 81 ldd r24, Y+1 ; 0x01 254e0: 9a 81 ldd r25, Y+2 ; 0x02 254e2: 08 0f add r16, r24 254e4: 19 1f adc r17, r25 254e6: 08 17 cp r16, r24 254e8: 19 07 cpc r17, r25 254ea: 40 f0 brcs .+16 ; 0x254fc ::expired(unsigned short)+0x48> { if ((now >= m_started + msPeriod) || (now < m_started)) 254ec: 60 17 cp r22, r16 254ee: 71 07 cpc r23, r17 254f0: 18 f4 brcc .+6 ; 0x254f8 ::expired(unsigned short)+0x44> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 254f2: 68 17 cp r22, r24 254f4: 79 07 cpc r23, r25 254f6: 38 f7 brcc .-50 ; 0x254c6 ::expired(unsigned short)+0x12> { expired = true; } } if (expired) m_isRunning = false; 254f8: 18 82 st Y, r1 254fa: e6 cf rjmp .-52 ; 0x254c8 ::expired(unsigned short)+0x14> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 254fc: 60 17 cp r22, r16 254fe: 71 07 cpc r23, r17 25500: c0 f7 brcc .-16 ; 0x254f2 ::expired(unsigned short)+0x3e> 25502: e1 cf rjmp .-62 ; 0x254c6 ::expired(unsigned short)+0x12> 00025504 ::expired_cont(unsigned short)>: } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 25504: fc 01 movw r30, r24 25506: 20 81 ld r18, Z 25508: 21 11 cpse r18, r1 2550a: 0d 94 5a 2a jmp 0x254b4 ; 0x254b4 ::expired(unsigned short)> } 2550e: 81 e0 ldi r24, 0x01 ; 1 25510: 08 95 ret 00025512 ::start()>: /** * @brief Start timer */ template void Timer::start() 25512: cf 93 push r28 25514: df 93 push r29 25516: ec 01 movw r28, r24 { m_started = _millis(); 25518: 0f 94 28 2a call 0x25450 ; 0x25450 2551c: 7a 83 std Y+2, r23 ; 0x02 2551e: 69 83 std Y+1, r22 ; 0x01 m_isRunning = true; 25520: 81 e0 ldi r24, 0x01 ; 1 25522: 88 83 st Y, r24 } 25524: df 91 pop r29 25526: cf 91 pop r28 25528: 08 95 ret 0002552a : TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); } static uint8_t twi_wait(uint8_t status) { 2552a: 1f 93 push r17 2552c: cf 93 push r28 2552e: df 93 push r29 25530: 00 d0 rcall .+0 ; 0x25532 25532: cd b7 in r28, 0x3d ; 61 25534: de b7 in r29, 0x3e ; 62 25536: 18 2f mov r17, r24 ShortTimer timmy; 25538: 19 82 std Y+1, r1 ; 0x01 2553a: 1b 82 std Y+3, r1 ; 0x03 2553c: 1a 82 std Y+2, r1 ; 0x02 timmy.start(); 2553e: ce 01 movw r24, r28 25540: 01 96 adiw r24, 0x01 ; 1 25542: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> while(!(TWCR & _BV(TWINT))) { 25546: 80 91 bc 00 lds r24, 0x00BC ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> 2554a: 87 fd sbrc r24, 7 2554c: 0a c0 rjmp .+20 ; 0x25562 if (timmy.expired(TWI_TIMEOUT_MS)) { 2554e: 6a e0 ldi r22, 0x0A ; 10 25550: 70 e0 ldi r23, 0x00 ; 0 25552: ce 01 movw r24, r28 25554: 01 96 adiw r24, 0x01 ; 1 25556: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 2555a: 88 23 and r24, r24 2555c: a1 f3 breq .-24 ; 0x25546 return 2; 2555e: 82 e0 ldi r24, 0x02 ; 2 25560: 09 c0 rjmp .+18 ; 0x25574 } } if(TW_STATUS != status) 25562: 80 91 b9 00 lds r24, 0x00B9 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> 25566: 88 7f andi r24, 0xF8 ; 248 25568: 18 17 cp r17, r24 2556a: 59 f0 breq .+22 ; 0x25582 } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 2556c: 84 e9 ldi r24, 0x94 ; 148 2556e: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> } } if(TW_STATUS != status) { twi_stop(); return 1; 25572: 81 e0 ldi r24, 0x01 ; 1 } return 0; } 25574: 0f 90 pop r0 25576: 0f 90 pop r0 25578: 0f 90 pop r0 2557a: df 91 pop r29 2557c: cf 91 pop r28 2557e: 1f 91 pop r17 25580: 08 95 ret if(TW_STATUS != status) { twi_stop(); return 1; } return 0; 25582: 80 e0 ldi r24, 0x00 ; 0 25584: f7 cf rjmp .-18 ; 0x25574 00025586 : } return standstill; } void tmc2130_check_overtemp() { 25586: 1f 93 push r17 25588: cf 93 push r28 2558a: df 93 push r29 2558c: 00 d0 rcall .+0 ; 0x2558e 2558e: 1f 92 push r1 25590: cd b7 in r28, 0x3d ; 61 25592: de b7 in r29, 0x3e ; 62 if (tmc2130_overtemp_timer.expired_cont(1000)) 25594: 68 ee ldi r22, 0xE8 ; 232 25596: 73 e0 ldi r23, 0x03 ; 3 25598: 83 e4 ldi r24, 0x43 ; 67 2559a: 96 e0 ldi r25, 0x06 ; 6 2559c: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 255a0: 88 23 and r24, r24 255a2: 91 f1 breq .+100 ; 0x25608 { for (uint_least8_t i = 0; i < 4; i++) 255a4: 10 e0 ldi r17, 0x00 ; 0 { uint32_t drv_status = 0; 255a6: 19 82 std Y+1, r1 ; 0x01 255a8: 1a 82 std Y+2, r1 ; 0x02 255aa: 1b 82 std Y+3, r1 ; 0x03 255ac: 1c 82 std Y+4, r1 ; 0x04 tmc2130_rd(i, TMC2130_REG_DRV_STATUS, &drv_status); 255ae: ae 01 movw r20, r28 255b0: 4f 5f subi r20, 0xFF ; 255 255b2: 5f 4f sbci r21, 0xFF ; 255 255b4: 6f e6 ldi r22, 0x6F ; 111 255b6: 81 2f mov r24, r17 255b8: 0f 94 cd 24 call 0x2499a ; 0x2499a if (drv_status & ((uint32_t)1 << 26)) 255bc: 89 81 ldd r24, Y+1 ; 0x01 255be: 9a 81 ldd r25, Y+2 ; 0x02 255c0: ab 81 ldd r26, Y+3 ; 0x03 255c2: bc 81 ldd r27, Y+4 ; 0x04 255c4: b2 ff sbrs r27, 2 255c6: 19 c0 rjmp .+50 ; 0x255fa { // BIT 26 - over temp prewarning ~120C (+-20C) SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP); 255c8: 80 e0 ldi r24, 0x00 ; 0 255ca: 9e e6 ldi r25, 0x6E ; 110 255cc: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); 255d0: 81 2f mov r24, r17 255d2: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::println(unsigned char b, int base) { print(b, base); println(); 255d6: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_ECHOLN(i); for (uint_least8_t j = 0; j < 4; j++) 255da: 10 e0 ldi r17, 0x00 ; 0 tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000); 255dc: 20 e0 ldi r18, 0x00 ; 0 255de: 30 e0 ldi r19, 0x00 ; 0 255e0: 41 e0 ldi r20, 0x01 ; 1 255e2: 50 e0 ldi r21, 0x00 ; 0 255e4: 6c ee ldi r22, 0xEC ; 236 255e6: 81 2f mov r24, r17 255e8: 0f 94 27 25 call 0x24a4e ; 0x24a4e tmc2130_rd(i, TMC2130_REG_DRV_STATUS, &drv_status); if (drv_status & ((uint32_t)1 << 26)) { // BIT 26 - over temp prewarning ~120C (+-20C) SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP); SERIAL_ECHOLN(i); for (uint_least8_t j = 0; j < 4; j++) 255ec: 1f 5f subi r17, 0xFF ; 255 255ee: 14 30 cpi r17, 0x04 ; 4 255f0: a9 f7 brne .-22 ; 0x255dc tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000); kill(MSG_TMC_OVERTEMP); 255f2: 80 e0 ldi r24, 0x00 ; 0 255f4: 9e e6 ldi r25, 0x6E ; 110 255f6: 0e 94 a2 79 call 0xf344 ; 0xf344 void tmc2130_check_overtemp() { if (tmc2130_overtemp_timer.expired_cont(1000)) { for (uint_least8_t i = 0; i < 4; i++) 255fa: 1f 5f subi r17, 0xFF ; 255 255fc: 14 30 cpi r17, 0x04 ; 4 255fe: 99 f6 brne .-90 ; 0x255a6 tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000); kill(MSG_TMC_OVERTEMP); } } tmc2130_overtemp_timer.start(); 25600: 83 e4 ldi r24, 0x43 ; 67 25602: 96 e0 ldi r25, 0x06 ; 6 25604: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> } } 25608: 0f 90 pop r0 2560a: 0f 90 pop r0 2560c: 0f 90 pop r0 2560e: 0f 90 pop r0 25610: df 91 pop r29 25612: cf 91 pop r28 25614: 1f 91 pop r17 25616: 08 95 ret 00025618 ::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) 25618: 8f 92 push r8 2561a: 9f 92 push r9 2561c: af 92 push r10 2561e: bf 92 push r11 25620: cf 92 push r12 25622: df 92 push r13 25624: ef 92 push r14 25626: ff 92 push r15 25628: 1f 93 push r17 2562a: cf 93 push r28 2562c: df 93 push r29 { if (!m_isRunning) return false; 2562e: fc 01 movw r30, r24 25630: 10 81 ld r17, Z 25632: 11 11 cpse r17, r1 25634: 0e c0 rjmp .+28 ; 0x25652 ::expired(unsigned long)+0x3a> 25636: 10 e0 ldi r17, 0x00 ; 0 expired = true; } } if (expired) m_isRunning = false; return expired; } 25638: 81 2f mov r24, r17 2563a: df 91 pop r29 2563c: cf 91 pop r28 2563e: 1f 91 pop r17 25640: ff 90 pop r15 25642: ef 90 pop r14 25644: df 90 pop r13 25646: cf 90 pop r12 25648: bf 90 pop r11 2564a: af 90 pop r10 2564c: 9f 90 pop r9 2564e: 8f 90 pop r8 25650: 08 95 ret 25652: 6a 01 movw r12, r20 25654: 7b 01 movw r14, r22 25656: ec 01 movw r28, r24 template bool Timer::expired(T msPeriod) { if (!m_isRunning) return false; bool expired = false; const T now = _millis(); 25658: 0f 94 28 2a call 0x25450 ; 0x25450 2565c: 4b 01 movw r8, r22 2565e: 5c 01 movw r10, r24 if (m_started <= m_started + msPeriod) 25660: 89 81 ldd r24, Y+1 ; 0x01 25662: 9a 81 ldd r25, Y+2 ; 0x02 25664: ab 81 ldd r26, Y+3 ; 0x03 25666: bc 81 ldd r27, Y+4 ; 0x04 25668: c8 0e add r12, r24 2566a: d9 1e adc r13, r25 2566c: ea 1e adc r14, r26 2566e: fb 1e adc r15, r27 25670: c8 16 cp r12, r24 25672: d9 06 cpc r13, r25 25674: ea 06 cpc r14, r26 25676: fb 06 cpc r15, r27 25678: 60 f0 brcs .+24 ; 0x25692 ::expired(unsigned long)+0x7a> { if ((now >= m_started + msPeriod) || (now < m_started)) 2567a: 8c 14 cp r8, r12 2567c: 9d 04 cpc r9, r13 2567e: ae 04 cpc r10, r14 25680: bf 04 cpc r11, r15 25682: 28 f4 brcc .+10 ; 0x2568e ::expired(unsigned long)+0x76> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 25684: 88 16 cp r8, r24 25686: 99 06 cpc r9, r25 25688: aa 06 cpc r10, r26 2568a: bb 06 cpc r11, r27 2568c: a0 f6 brcc .-88 ; 0x25636 ::expired(unsigned long)+0x1e> { expired = true; } } if (expired) m_isRunning = false; 2568e: 18 82 st Y, r1 25690: d3 cf rjmp .-90 ; 0x25638 ::expired(unsigned long)+0x20> expired = true; } } else { if ((now >= m_started + msPeriod) && (now < m_started)) 25692: 8c 14 cp r8, r12 25694: 9d 04 cpc r9, r13 25696: ae 04 cpc r10, r14 25698: bf 04 cpc r11, r15 2569a: a0 f7 brcc .-24 ; 0x25684 ::expired(unsigned long)+0x6c> 2569c: cc cf rjmp .-104 ; 0x25636 ::expired(unsigned long)+0x1e> 0002569e : } lcd_space(8 - chars); } //! @Brief Print status line on status screen void lcdui_print_status_line(void) { 2569e: 0f 93 push r16 256a0: 1f 93 push r17 256a2: cf 93 push r28 static uint8_t heating_status_counter; if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating 256a4: 80 91 e1 03 lds r24, 0x03E1 ; 0x8003e1 256a8: 88 23 and r24, r24 256aa: 09 f4 brne .+2 ; 0x256ae 256ac: 4d c0 rjmp .+154 ; 0x25748 heating_status_counter++; 256ae: 80 91 4a 06 lds r24, 0x064A ; 0x80064a 256b2: 8f 5f subi r24, 0xFF ; 255 if (heating_status_counter > 13) { 256b4: 8e 30 cpi r24, 0x0E ; 14 256b6: b0 f4 brcc .+44 ; 0x256e4 //! @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++; 256b8: 80 93 4a 06 sts 0x064A, r24 ; 0x80064a if (heating_status_counter > 13) { heating_status_counter = 0; } lcd_set_cursor(7, 3); 256bc: 63 e0 ldi r22, 0x03 ; 3 256be: 87 e0 ldi r24, 0x07 ; 7 256c0: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_space(13); 256c4: 8d e0 ldi r24, 0x0D ; 13 256c6: 0e 94 6e 6e call 0xdcdc ; 0xdcdc for (uint8_t dots = 0; dots < heating_status_counter; dots++) { 256ca: c0 e0 ldi r28, 0x00 ; 0 256cc: 80 91 4a 06 lds r24, 0x064A ; 0x80064a 256d0: c8 17 cp r28, r24 256d2: 58 f4 brcc .+22 ; 0x256ea lcd_putc_at(7 + dots, 3, '.'); 256d4: 4e e2 ldi r20, 0x2E ; 46 256d6: 63 e0 ldi r22, 0x03 ; 3 256d8: 87 e0 ldi r24, 0x07 ; 7 256da: 8c 0f add r24, r28 256dc: 0e 94 98 6e call 0xdd30 ; 0xdd30 heating_status_counter = 0; } lcd_set_cursor(7, 3); lcd_space(13); for (uint8_t dots = 0; dots < heating_status_counter; dots++) { 256e0: cf 5f subi r28, 0xFF ; 255 256e2: f4 cf rjmp .-24 ; 0x256cc 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; 256e4: 10 92 4a 06 sts 0x064A, r1 ; 0x80064a 256e8: e9 cf rjmp .-46 ; 0x256bc lcd_space(13); for (uint8_t dots = 0; dots < heating_status_counter; dots++) { lcd_putc_at(7 + dots, 3, '.'); } switch (heating_status) { 256ea: 80 91 e1 03 lds r24, 0x03E1 ; 0x8003e1 256ee: 82 30 cpi r24, 0x02 ; 2 256f0: d1 f0 breq .+52 ; 0x25726 256f2: 30 f4 brcc .+12 ; 0x25700 256f4: 81 30 cpi r24, 0x01 ; 1 256f6: 59 f0 breq .+22 ; 0x2570e case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 256f8: cf 91 pop r28 256fa: 1f 91 pop r17 256fc: 0f 91 pop r16 256fe: 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) { 25700: 83 30 cpi r24, 0x03 ; 3 25702: f9 f0 breq .+62 ; 0x25742 25704: 84 30 cpi r24, 0x04 ; 4 25706: c1 f7 brne .-16 ; 0x256f8 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)); 25708: 8c e7 ldi r24, 0x7C ; 124 2570a: 9d e4 ldi r25, 0x4D ; 77 2570c: 0e c0 rjmp .+28 ; 0x2572a 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)); 2570e: 85 ea ldi r24, 0xA5 ; 165 25710: 9d e4 ldi r25, 0x4D ; 77 lcd_print(custom_message_state); // seconds lcd_print(' '); } break; case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); 25712: 0e 94 44 72 call 0xe488 ; 0xe488 25716: ac 01 movw r20, r24 25718: 63 e0 ldi r22, 0x03 ; 3 2571a: 80 e0 ldi r24, 0x00 ; 0 break; } } } 2571c: cf 91 pop r28 2571e: 1f 91 pop r17 25720: 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)); 25722: 0c 94 8c 6e jmp 0xdd18 ; 0xdd18 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)); 25726: 85 e9 ldi r24, 0x95 ; 149 25728: 9d e4 ldi r25, 0x4D ; 77 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)); 2572a: 0e 94 44 72 call 0xe488 ; 0xe488 2572e: ac 01 movw r20, r24 25730: 63 e0 ldi r22, 0x03 ; 3 25732: 80 e0 ldi r24, 0x00 ; 0 25734: 0e 94 8c 6e call 0xdd18 ; 0xdd18 heating_status = HeatingStatus::NO_HEATING; 25738: 10 92 e1 03 sts 0x03E1, r1 ; 0x8003e1 heating_status_counter = 0; 2573c: 10 92 4a 06 sts 0x064A, r1 ; 0x80064a 25740: db cf rjmp .-74 ; 0x256f8 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)); 25742: 87 e8 ldi r24, 0x87 ; 135 25744: 9d e4 ldi r25, 0x4D ; 77 25746: e5 cf rjmp .-54 ; 0x25712 #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) && 25748: 80 91 8f 14 lds r24, 0x148F ; 0x80148f 2574c: 88 23 and r24, r24 2574e: 61 f1 breq .+88 ; 0x257a8 } else if (((IS_SD_PRINTING) #ifdef SHOW_FILENAME_AFTER_FINISH || (GetPrinterState() == PrinterState::SDPrintingFinished) #endif //SHOW_FILENAME_AFTER_FINISH ) && 25750: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 25754: 81 11 cpse r24, r1 25756: 28 c0 rjmp .+80 ; 0x257a8 (custom_message_type == CustomMsg::Status) && 25758: 80 91 d3 03 lds r24, 0x03D3 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> 2575c: 82 30 cpi r24, 0x02 ; 2 2575e: 20 f5 brcc .+72 ; 0x257a8 } template bool Timer::expired_cont(T msPeriod) { return !m_isRunning || expired(msPeriod); 25760: 80 91 33 05 lds r24, 0x0533 ; 0x800533 <_ZL26lcd_status_message_timeout.lto_priv.454> 25764: 81 11 cpse r24, r1 25766: 16 c0 rjmp .+44 ; 0x25794 (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); 25768: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2576c: 88 23 and r24, r24 2576e: 09 f4 brne .+2 ; 0x25772 25770: 35 c0 rjmp .+106 ; 0x257dc 25772: 86 ea ldi r24, 0xA6 ; 166 25774: 94 e1 ldi r25, 0x14 ; 20 if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0) 25776: 20 91 b8 0d lds r18, 0x0DB8 ; 0x800db8 2577a: 64 e1 ldi r22, 0x14 ; 20 2577c: 82 0f add r24, r18 2577e: 91 1d adc r25, r1 25780: 0e 94 67 70 call 0xe0ce ; 0xe0ce 25784: 81 11 cpse r24, r1 25786: 2d c0 rjmp .+90 ; 0x257e2 { scrollstuff++; 25788: 80 91 b8 0d lds r24, 0x0DB8 ; 0x800db8 2578c: 8f 5f subi r24, 0xFF ; 255 2578e: 80 93 b8 0d sts 0x0DB8, r24 ; 0x800db8 25792: b2 cf rjmp .-156 ; 0x256f8 25794: 40 e2 ldi r20, 0x20 ; 32 25796: 5e e4 ldi r21, 0x4E ; 78 25798: 60 e0 ldi r22, 0x00 ; 0 2579a: 70 e0 ldi r23, 0x00 ; 0 2579c: 83 e3 ldi r24, 0x33 ; 51 2579e: 95 e0 ldi r25, 0x05 ; 5 257a0: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 257a4: 81 11 cpse r24, r1 257a6: e0 cf rjmp .-64 ; 0x25768 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) 257a8: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 257ac: 81 11 cpse r24, r1 257ae: 1c c0 rjmp .+56 ; 0x257e8 { return; // Nothing to do, waiting for delay to expire } switch (custom_message_type) { 257b0: e0 91 c3 06 lds r30, 0x06C3 ; 0x8006c3 257b4: ea 30 cpi r30, 0x0A ; 10 257b6: 08 f0 brcs .+2 ; 0x257ba 257b8: 9f cf rjmp .-194 ; 0x256f8 257ba: f0 e0 ldi r31, 0x00 ; 0 257bc: 88 27 eor r24, r24 257be: ec 51 subi r30, 0x1C ; 28 257c0: f4 4d sbci r31, 0xD4 ; 212 257c2: 8e 4f sbci r24, 0xFE ; 254 257c4: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 257c8: 2c 39 cpi r18, 0x9C ; 156 257ca: 90 39 cpi r25, 0x90 ; 144 257cc: 2c 39 cpi r18, 0x9C ; 156 257ce: a4 3a cpi r26, 0xA4 ; 164 257d0: d0 39 cpi r29, 0x90 ; 144 257d2: 1e 3a cpi r17, 0xAE ; 174 257d4: 2c 39 cpi r18, 0x9C ; 156 257d6: 2c 39 cpi r18, 0x9C ; 156 257d8: b0 3a cpi r27, 0xA0 ; 160 257da: 2c 39 cpi r18, 0x9C ; 156 (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); 257dc: 81 e9 ldi r24, 0x91 ; 145 257de: 94 e1 ldi r25, 0x14 ; 20 257e0: ca cf rjmp .-108 ; 0x25776 if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0) { scrollstuff++; } else { scrollstuff = 0; 257e2: 10 92 b8 0d sts 0x0DB8, r1 ; 0x800db8 257e6: 88 cf rjmp .-240 ; 0x256f8 } } else { // Otherwise check for other special events if ( custom_message_type != CustomMsg::Status && lcd_status_message_timeout.running() 257e8: 80 91 33 05 lds r24, 0x0533 ; 0x800533 <_ZL26lcd_status_message_timeout.lto_priv.454> 257ec: 88 23 and r24, r24 257ee: 01 f3 breq .-64 ; 0x257b0 * 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; 257f0: 0f 94 28 2a call 0x25450 ; 0x25450 257f4: 00 91 34 05 lds r16, 0x0534 ; 0x800534 <_ZL26lcd_status_message_timeout.lto_priv.454+0x1> 257f8: 10 91 35 05 lds r17, 0x0535 ; 0x800535 <_ZL26lcd_status_message_timeout.lto_priv.454+0x2> 257fc: 20 91 36 05 lds r18, 0x0536 ; 0x800536 <_ZL26lcd_status_message_timeout.lto_priv.454+0x3> 25800: 30 91 37 05 lds r19, 0x0537 ; 0x800537 <_ZL26lcd_status_message_timeout.lto_priv.454+0x4> 25804: 60 1b sub r22, r16 25806: 71 0b sbc r23, r17 25808: 82 0b sbc r24, r18 2580a: 93 0b sbc r25, r19 && lcd_status_message_timeout.elapsed() < LCD_STATUS_DELAYED_TIMEOUT) 2580c: 60 3a cpi r22, 0xA0 ; 160 2580e: 7f 40 sbci r23, 0x0F ; 15 25810: 81 05 cpc r24, r1 25812: 91 05 cpc r25, r1 25814: 68 f6 brcc .-102 ; 0x257b0 25816: 70 cf rjmp .-288 ; 0x256f8 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); 25818: 63 e0 ldi r22, 0x03 ; 3 2581a: 80 91 1d 05 lds r24, 0x051D ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> 2581e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 const uint8_t padding = lcd_print_pad(&lcd_status_message[lcd_status_message_idx], LCD_WIDTH - lcd_status_message_idx); 25822: 80 91 1d 05 lds r24, 0x051D ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> 25826: c4 e1 ldi r28, 0x14 ; 20 25828: 6c 2f mov r22, r28 2582a: 68 1b sub r22, r24 2582c: 90 e0 ldi r25, 0x00 ; 0 2582e: 82 5e subi r24, 0xE2 ; 226 25830: 9a 4f sbci r25, 0xFA ; 250 25832: 0e 94 67 70 call 0xe0ce ; 0xe0ce lcd_status_message_idx = LCD_WIDTH - padding; 25836: c8 1b sub r28, r24 25838: c0 93 1d 05 sts 0x051D, r28 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> 2583c: 5d cf rjmp .-326 ; 0x256f8 } break; case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status if (custom_message_state > 10) { 2583e: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 25842: 8b 30 cpi r24, 0x0B ; 11 25844: 08 f1 brcs .+66 ; 0x25888 lcd_set_cursor(0, 3); 25846: 63 e0 ldi r22, 0x03 ; 3 25848: 80 e0 ldi r24, 0x00 ; 0 2584a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_space(LCD_WIDTH); 2584e: 84 e1 ldi r24, 0x14 ; 20 25850: 0e 94 6e 6e call 0xdcdc ; 0xdcdc lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO)); 25854: 8c e6 ldi r24, 0x6C ; 108 25856: 9d e4 ldi r25, 0x4D ; 77 25858: 0e 94 44 72 call 0xe488 ; 0xe488 2585c: ac 01 movw r20, r24 2585e: 63 e0 ldi r22, 0x03 ; 3 25860: 80 e0 ldi r24, 0x00 ; 0 25862: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_P(PSTR(" : ")); 25866: 84 ec ldi r24, 0xC4 ; 196 25868: 9f e9 ldi r25, 0x9F ; 159 2586a: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_print(custom_message_state - 10); 2586e: 60 91 f6 03 lds r22, 0x03F6 ; 0x8003f6 25872: 6a 50 subi r22, 0x0A ; 10 25874: 77 0b sbc r23, r23 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); 25876: 07 2e mov r0, r23 25878: 00 0c add r0, r0 2587a: 88 0b sbc r24, r24 2587c: 99 0b sbc r25, r25 case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 2587e: cf 91 pop r28 25880: 1f 91 pop r17 25882: 0f 91 pop r16 25884: 0c 94 31 70 jmp 0xe062 ; 0xe062 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) { 25888: 83 30 cpi r24, 0x03 ; 3 2588a: 31 f4 brne .+12 ; 0x25898 lcd_setstatuspgm(MSG_WELCOME); 2588c: 82 e1 ldi r24, 0x12 ; 18 2588e: 90 e7 ldi r25, 0x70 ; 112 25890: 0e 94 16 f2 call 0x1e42c ; 0x1e42c custom_message_type = CustomMsg::Status; 25894: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 } if (custom_message_state > 3 && custom_message_state <= 10) { 25898: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 2589c: 84 50 subi r24, 0x04 ; 4 2589e: 87 30 cpi r24, 0x07 ; 7 258a0: 08 f0 brcs .+2 ; 0x258a4 258a2: 2a cf rjmp .-428 ; 0x256f8 lcd_set_cursor(0, 3); 258a4: 63 e0 ldi r22, 0x03 ; 3 258a6: 80 e0 ldi r24, 0x00 ; 0 258a8: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_space(19); 258ac: 83 e1 ldi r24, 0x13 ; 19 258ae: 0e 94 6e 6e call 0xdcdc ; 0xdcdc lcd_puts_at_P(0, 3, _T(MSG_HOMEYZ_DONE)); 258b2: 89 e5 ldi r24, 0x59 ; 89 258b4: 9d e4 ldi r25, 0x4D ; 77 258b6: 0e 94 44 72 call 0xe488 ; 0xe488 258ba: ac 01 movw r20, r24 258bc: 63 e0 ldi r22, 0x03 ; 3 258be: 80 e0 ldi r24, 0x00 ; 0 258c0: 0e 94 8c 6e call 0xdd18 ; 0xdd18 custom_message_state--; 258c4: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 258c8: 81 50 subi r24, 0x01 ; 1 258ca: 80 93 f6 03 sts 0x03F6, r24 ; 0x8003f6 258ce: 14 cf rjmp .-472 ; 0x256f8 } } break; case CustomMsg::PidCal: // PID tuning in progress lcd_print_pad(lcd_status_message, LCD_WIDTH); 258d0: 64 e1 ldi r22, 0x14 ; 20 258d2: 8e e1 ldi r24, 0x1E ; 30 258d4: 95 e0 ldi r25, 0x05 ; 5 258d6: 0e 94 67 70 call 0xe0ce ; 0xe0ce if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) { 258da: 20 91 48 06 lds r18, 0x0648 ; 0x800648 258de: 30 91 49 06 lds r19, 0x0649 ; 0x800649 258e2: 80 91 46 06 lds r24, 0x0646 ; 0x800646 258e6: 90 91 47 06 lds r25, 0x0647 ; 0x800647 258ea: 82 17 cp r24, r18 258ec: 93 07 cpc r25, r19 258ee: 0c f4 brge .+2 ; 0x258f2 258f0: 03 cf rjmp .-506 ; 0x256f8 258f2: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 258f6: 88 23 and r24, r24 258f8: 09 f4 brne .+2 ; 0x258fc 258fa: fe ce rjmp .-516 ; 0x256f8 lcd_set_cursor(10, 3); 258fc: 63 e0 ldi r22, 0x03 ; 3 258fe: 8a e0 ldi r24, 0x0A ; 10 25900: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles); 25904: 80 91 47 06 lds r24, 0x0647 ; 0x800647 25908: 8f 93 push r24 2590a: 80 91 46 06 lds r24, 0x0646 ; 0x800646 2590e: 8f 93 push r24 25910: 80 91 49 06 lds r24, 0x0649 ; 0x800649 25914: 8f 93 push r24 25916: 80 91 48 06 lds r24, 0x0648 ; 0x800648 2591a: 8f 93 push r24 2591c: 8b eb ldi r24, 0xBB ; 187 2591e: 9f e9 ldi r25, 0x9F ; 159 } 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); 25920: 9f 93 push r25 25922: 8f 93 push r24 25924: 0e 94 51 6e call 0xdca2 ; 0xdca2 25928: 0f 90 pop r0 2592a: 0f 90 pop r0 2592c: 0f 90 pop r0 2592e: 0f 90 pop r0 25930: 0f 90 pop r0 25932: 0f 90 pop r0 25934: e1 ce rjmp .-574 ; 0x256f8 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); 25936: 63 e0 ldi r22, 0x03 ; 3 25938: 80 e0 ldi r24, 0x00 ; 0 2593a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state); 2593e: c0 91 f6 03 lds r28, 0x03F6 ; 0x8003f6 25942: 81 ec ldi r24, 0xC1 ; 193 25944: 94 e4 ldi r25, 0x44 ; 68 25946: 0e 94 44 72 call 0xe488 ; 0xe488 2594a: 1f 92 push r1 2594c: cf 93 push r28 2594e: 9f 93 push r25 25950: 8f 93 push r24 25952: 8d ea ldi r24, 0xAD ; 173 25954: 9f e9 ldi r25, 0x9F ; 159 25956: e4 cf rjmp .-56 ; 0x25920 break; case CustomMsg::TempCompPreheat: // temp compensation preheat lcd_puts_at_P(0, 3, _T(MSG_PINDA_PREHEAT)); 25958: 89 e4 ldi r24, 0x49 ; 73 2595a: 9d e4 ldi r25, 0x4D ; 77 2595c: 0e 94 44 72 call 0xe488 ; 0xe488 25960: ac 01 movw r20, r24 25962: 63 e0 ldi r22, 0x03 ; 3 25964: 80 e0 ldi r24, 0x00 ; 0 25966: 0e 94 8c 6e call 0xdd18 ; 0xdd18 if (custom_message_state <= PINDA_HEAT_T) { 2596a: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 2596e: 89 37 cpi r24, 0x79 ; 121 25970: 08 f0 brcs .+2 ; 0x25974 25972: c2 ce rjmp .-636 ; 0x256f8 lcd_puts_P(PSTR(": ")); 25974: 8a ea ldi r24, 0xAA ; 170 25976: 9f e9 ldi r25, 0x9F ; 159 25978: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 } void lcd_print(unsigned long n, int base) { if (base == 0) lcd_write(n); 2597c: 80 91 f6 03 lds r24, 0x03F6 ; 0x8003f6 25980: 0e 94 27 6f call 0xde4e ; 0xde4e } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 25984: 80 e2 ldi r24, 0x20 ; 32 case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); break; } } } 25986: cf 91 pop r28 25988: 1f 91 pop r17 2598a: 0f 91 pop r16 2598c: 0c 94 27 6f jmp 0xde4e ; 0xde4e lcd_print(custom_message_state); // seconds lcd_print(' '); } break; case CustomMsg::Resuming: // Resuming lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT)); 25990: 88 e3 ldi r24, 0x38 ; 56 25992: 9d e4 ldi r25, 0x4D ; 77 25994: be ce rjmp .-644 ; 0x25712 00025996 ::start()>: /** * @brief Start timer */ template void Timer::start() 25996: cf 93 push r28 25998: df 93 push r29 2599a: ec 01 movw r28, r24 { m_started = _millis(); 2599c: 0f 94 28 2a call 0x25450 ; 0x25450 259a0: 69 83 std Y+1, r22 ; 0x01 259a2: 7a 83 std Y+2, r23 ; 0x02 259a4: 8b 83 std Y+3, r24 ; 0x03 259a6: 9c 83 std Y+4, r25 ; 0x04 m_isRunning = true; 259a8: 81 e0 ldi r24, 0x01 ; 1 259aa: 88 83 st Y, r24 } 259ac: df 91 pop r29 259ae: cf 91 pop r28 259b0: 08 95 ret 000259b2 : //! 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) { 259b2: cf 92 push r12 259b4: df 92 push r13 259b6: ff 92 push r15 259b8: 0f 93 push r16 259ba: 1f 93 push r17 259bc: cf 93 push r28 259be: df 93 push r29 259c0: cd b7 in r28, 0x3d ; 61 259c2: de b7 in r29, 0x3e ; 62 259c4: 64 97 sbiw r28, 0x14 ; 20 259c6: 0f b6 in r0, 0x3f ; 63 259c8: f8 94 cli 259ca: de bf out 0x3e, r29 ; 62 259cc: 0f be out 0x3f, r0 ; 63 259ce: cd bf out 0x3d, r28 ; 61 259d0: 8c 01 movw r16, r24 259d2: f6 2e mov r15, r22 char msg[LCD_WIDTH]; strcpy_P(msg, PSTR("Err: ")); 259d4: 6e eb ldi r22, 0xBE ; 190 259d6: 7d e9 ldi r23, 0x9D ; 157 259d8: ce 01 movw r24, r28 259da: 01 96 adiw r24, 0x01 ; 1 259dc: 0f 94 c7 d9 call 0x3b38e ; 0x3b38e strcat_P(msg, type); 259e0: b8 01 movw r22, r16 259e2: ce 01 movw r24, r28 259e4: 01 96 adiw r24, 0x01 ; 1 259e6: 0f 94 b3 d9 call 0x3b366 ; 0x3b366 lcd_status_message_timeout.start(); } void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem) { if (lcd_message_check(severity)) { 259ea: 83 e0 ldi r24, 0x03 ; 3 259ec: 0e 94 c0 f1 call 0x1e380 ; 0x1e380 259f0: 88 23 and r24, r24 259f2: e1 f0 breq .+56 ; 0x25a2c bool same = !(progmem? strcmp_P(lcd_status_message, message): strcmp(lcd_status_message, message)); 259f4: be 01 movw r22, r28 259f6: 6f 5f subi r22, 0xFF ; 255 259f8: 7f 4f sbci r23, 0xFF ; 255 259fa: 8e e1 ldi r24, 0x1E ; 30 259fc: 95 e0 ldi r25, 0x05 ; 5 259fe: 0f 94 72 e2 call 0x3c4e4 ; 0x3c4e4 25a02: 6c 01 movw r12, r24 lcd_status_message_timeout.start(); 25a04: 83 e3 ldi r24, 0x33 ; 51 25a06: 95 e0 ldi r25, 0x05 ; 5 25a08: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> lcd_status_message_level = severity; 25a0c: 83 e0 ldi r24, 0x03 ; 3 25a0e: 80 93 d3 03 sts 0x03D3, r24 ; 0x8003d3 <_ZL24lcd_status_message_level.lto_priv.453> custom_message_type = CustomMsg::Status; 25a12: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 custom_message_state = 0; 25a16: 10 92 f6 03 sts 0x03F6, r1 ; 0x8003f6 if (!same) { 25a1a: cd 28 or r12, r13 25a1c: 39 f0 breq .+14 ; 0x25a2c // do not kick the user out of the menus if the message is unchanged lcd_updatestatus(message, progmem); 25a1e: 60 e0 ldi r22, 0x00 ; 0 25a20: ce 01 movw r24, r28 25a22: 01 96 adiw r24, 0x01 ; 1 25a24: 0e 94 a5 f1 call 0x1e34a ; 0x1e34a lcd_return_to_status(); 25a28: 0f 94 82 1f call 0x23f04 ; 0x23f04 lcd_setalertstatus(msg, LCD_STATUS_CRITICAL); SERIAL_ERROR_START; 25a2c: 8a ec ldi r24, 0xCA ; 202 25a2e: 9a ea ldi r25, 0xAA ; 170 25a30: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if(e != EXTRUDERS) { 25a34: 81 e0 ldi r24, 0x01 ; 1 25a36: f8 16 cp r15, r24 25a38: 49 f0 breq .+18 ; 0x25a4c 25a3a: 60 e0 ldi r22, 0x00 ; 0 25a3c: 70 e0 ldi r23, 0x00 ; 0 25a3e: cb 01 movw r24, r22 25a40: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_ERROR((int)e); SERIAL_ERRORPGM(": "); 25a44: 8b eb ldi r24, 0xBB ; 187 25a46: 9d e9 ldi r25, 0x9D ; 157 25a48: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } SERIAL_ERRORPGM("Heaters switched off. "); 25a4c: 84 ea ldi r24, 0xA4 ; 164 25a4e: 9d e9 ldi r25, 0x9D ; 157 25a50: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORRPGM(type); 25a54: c8 01 movw r24, r16 25a56: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNPGM(" triggered!"); 25a5a: 88 e9 ldi r24, 0x98 ; 152 25a5c: 9d e9 ldi r25, 0x9D ; 157 25a5e: 0e 94 13 79 call 0xf226 ; 0xf226 } 25a62: 64 96 adiw r28, 0x14 ; 20 25a64: 0f b6 in r0, 0x3f ; 63 25a66: f8 94 cli 25a68: de bf out 0x3e, r29 ; 62 25a6a: 0f be out 0x3f, r0 ; 63 25a6c: cd bf out 0x3d, r28 ; 61 25a6e: df 91 pop r29 25a70: cf 91 pop r28 25a72: 1f 91 pop r17 25a74: 0f 91 pop r16 25a76: ff 90 pop r15 25a78: df 90 pop r13 25a7a: cf 90 pop r12 25a7c: 08 95 ret 00025a7e <__vector_15>: volatile unsigned long timer2_overflow_count; volatile unsigned long timer2_millis; unsigned char timer2_fract = 0; ISR(TIMER2_OVF_vect) { 25a7e: 1f 92 push r1 25a80: 0f 92 push r0 25a82: 0f b6 in r0, 0x3f ; 63 25a84: 0f 92 push r0 25a86: 11 24 eor r1, r1 25a88: 2f 93 push r18 25a8a: 3f 93 push r19 25a8c: 8f 93 push r24 25a8e: 9f 93 push r25 25a90: af 93 push r26 25a92: 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; 25a94: 80 91 3a 06 lds r24, 0x063A ; 0x80063a 25a98: 90 91 3b 06 lds r25, 0x063B ; 0x80063b 25a9c: a0 91 3c 06 lds r26, 0x063C ; 0x80063c 25aa0: b0 91 3d 06 lds r27, 0x063D ; 0x80063d unsigned char f = timer2_fract; 25aa4: 30 91 39 06 lds r19, 0x0639 ; 0x800639 m += MILLIS_INC; f += FRACT_INC; 25aa8: 23 e0 ldi r18, 0x03 ; 3 25aaa: 23 0f add r18, r19 if (f >= FRACT_MAX) 25aac: 2d 37 cpi r18, 0x7D ; 125 25aae: 58 f5 brcc .+86 ; 0x25b06 <__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; 25ab0: 01 96 adiw r24, 0x01 ; 1 25ab2: a1 1d adc r26, r1 25ab4: b1 1d adc r27, r1 if (f >= FRACT_MAX) { f -= FRACT_MAX; m += 1; } timer2_fract = f; 25ab6: 20 93 39 06 sts 0x0639, r18 ; 0x800639 timer2_millis = m; 25aba: 80 93 3a 06 sts 0x063A, r24 ; 0x80063a 25abe: 90 93 3b 06 sts 0x063B, r25 ; 0x80063b 25ac2: a0 93 3c 06 sts 0x063C, r26 ; 0x80063c 25ac6: b0 93 3d 06 sts 0x063D, r27 ; 0x80063d timer2_overflow_count++; 25aca: 80 91 3e 06 lds r24, 0x063E ; 0x80063e 25ace: 90 91 3f 06 lds r25, 0x063F ; 0x80063f 25ad2: a0 91 40 06 lds r26, 0x0640 ; 0x800640 25ad6: b0 91 41 06 lds r27, 0x0641 ; 0x800641 25ada: 01 96 adiw r24, 0x01 ; 1 25adc: a1 1d adc r26, r1 25ade: b1 1d adc r27, r1 25ae0: 80 93 3e 06 sts 0x063E, r24 ; 0x80063e 25ae4: 90 93 3f 06 sts 0x063F, r25 ; 0x80063f 25ae8: a0 93 40 06 sts 0x0640, r26 ; 0x800640 25aec: b0 93 41 06 sts 0x0641, r27 ; 0x800641 } 25af0: bf 91 pop r27 25af2: af 91 pop r26 25af4: 9f 91 pop r25 25af6: 8f 91 pop r24 25af8: 3f 91 pop r19 25afa: 2f 91 pop r18 25afc: 0f 90 pop r0 25afe: 0f be out 0x3f, r0 ; 63 25b00: 0f 90 pop r0 25b02: 1f 90 pop r1 25b04: 18 95 reti unsigned char f = timer2_fract; m += MILLIS_INC; f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; 25b06: 26 e8 ldi r18, 0x86 ; 134 25b08: 23 0f add r18, r19 m += 1; 25b0a: 02 96 adiw r24, 0x02 ; 2 25b0c: a1 1d adc r26, r1 25b0e: b1 1d adc r27, r1 25b10: d2 cf rjmp .-92 ; 0x25ab6 <__vector_15+0x38> 00025b12 : return pos; } static float cost_fn(uint16_t samples, float* const var, float v, uint8_t fan_pwm, float ambient) { 25b12: 2f 92 push r2 25b14: 3f 92 push r3 25b16: 4f 92 push r4 25b18: 5f 92 push r5 25b1a: 6f 92 push r6 25b1c: 7f 92 push r7 25b1e: 8f 92 push r8 25b20: 9f 92 push r9 25b22: af 92 push r10 25b24: bf 92 push r11 25b26: cf 92 push r12 25b28: df 92 push r13 25b2a: ef 92 push r14 25b2c: ff 92 push r15 25b2e: 0f 93 push r16 25b30: 1f 93 push r17 25b32: cf 93 push r28 25b34: df 93 push r29 25b36: 00 d0 rcall .+0 ; 0x25b38 25b38: 00 d0 rcall .+0 ; 0x25b3a 25b3a: 1f 92 push r1 25b3c: cd b7 in r28, 0x3d ; 61 25b3e: de b7 in r29, 0x3e ; 62 25b40: 9c 83 std Y+4, r25 ; 0x04 25b42: 8b 83 std Y+3, r24 ; 0x03 25b44: 0d 83 std Y+5, r16 ; 0x05 25b46: 26 01 movw r4, r12 25b48: 37 01 movw r6, r14 *var = v; 25b4a: fb 01 movw r30, r22 25b4c: 20 83 st Z, r18 25b4e: 31 83 std Z+1, r19 ; 0x01 25b50: 42 83 std Z+2, r20 ; 0x02 25b52: 53 83 std Z+3, r21 ; 0x03 void model_data::reset(uint8_t heater_pwm _UNUSED, uint8_t fan_pwm _UNUSED, float heater_temp _UNUSED, float ambient_temp _UNUSED) { // pre-compute invariant values C_i = (TEMP_MGR_INTV / C); 25b54: 20 91 e5 12 lds r18, 0x12E5 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 25b58: 30 91 e6 12 lds r19, 0x12E6 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 25b5c: 40 91 e7 12 lds r20, 0x12E7 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 25b60: 50 91 e8 12 lds r21, 0x12E8 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> 25b64: 61 e7 ldi r22, 0x71 ; 113 25b66: 7d e3 ldi r23, 0x3D ; 61 25b68: 8a e8 ldi r24, 0x8A ; 138 25b6a: 9e e3 ldi r25, 0x3E ; 62 25b6c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 25b70: 60 93 3c 13 sts 0x133C, r22 ; 0x80133c <_ZN13thermal_modelL4dataE.lto_priv.402+0x8d> 25b74: 70 93 3d 13 sts 0x133D, r23 ; 0x80133d <_ZN13thermal_modelL4dataE.lto_priv.402+0x8e> 25b78: 80 93 3e 13 sts 0x133E, r24 ; 0x80133e <_ZN13thermal_modelL4dataE.lto_priv.402+0x8f> 25b7c: 90 93 3f 13 sts 0x133F, r25 ; 0x80133f <_ZN13thermal_modelL4dataE.lto_priv.402+0x90> warn_s = warn * TEMP_MGR_INTV; 25b80: 21 e7 ldi r18, 0x71 ; 113 25b82: 3d e3 ldi r19, 0x3D ; 61 25b84: 4a e8 ldi r20, 0x8A ; 138 25b86: 5e e3 ldi r21, 0x3E ; 62 25b88: 60 91 33 13 lds r22, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 25b8c: 70 91 34 13 lds r23, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 25b90: 80 91 35 13 lds r24, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 25b94: 90 91 36 13 lds r25, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> 25b98: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 25b9c: 60 93 40 13 sts 0x1340, r22 ; 0x801340 <_ZN13thermal_modelL4dataE.lto_priv.402+0x91> 25ba0: 70 93 41 13 sts 0x1341, r23 ; 0x801341 <_ZN13thermal_modelL4dataE.lto_priv.402+0x92> 25ba4: 80 93 42 13 sts 0x1342, r24 ; 0x801342 <_ZN13thermal_modelL4dataE.lto_priv.402+0x93> 25ba8: 90 93 43 13 sts 0x1343, r25 ; 0x801343 <_ZN13thermal_modelL4dataE.lto_priv.402+0x94> err_s = err * TEMP_MGR_INTV; 25bac: 21 e7 ldi r18, 0x71 ; 113 25bae: 3d e3 ldi r19, 0x3D ; 61 25bb0: 4a e8 ldi r20, 0x8A ; 138 25bb2: 5e e3 ldi r21, 0x3E ; 62 25bb4: 60 91 37 13 lds r22, 0x1337 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 25bb8: 70 91 38 13 lds r23, 0x1338 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 25bbc: 80 91 39 13 lds r24, 0x1339 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 25bc0: 90 91 3a 13 lds r25, 0x133A ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> 25bc4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 25bc8: 60 93 44 13 sts 0x1344, r22 ; 0x801344 <_ZN13thermal_modelL4dataE.lto_priv.402+0x95> 25bcc: 70 93 45 13 sts 0x1345, r23 ; 0x801345 <_ZN13thermal_modelL4dataE.lto_priv.402+0x96> 25bd0: 80 93 46 13 sts 0x1346, r24 ; 0x801346 <_ZN13thermal_modelL4dataE.lto_priv.402+0x97> 25bd4: 90 93 47 13 sts 0x1347, r25 ; 0x801347 <_ZN13thermal_modelL4dataE.lto_priv.402+0x98> dT_lag_size = L / (uint16_t)(TEMP_MGR_INTV * 1000); 25bd8: 80 91 ed 12 lds r24, 0x12ED ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> 25bdc: 90 91 ee 12 lds r25, 0x12EE ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 25be0: 6e e0 ldi r22, 0x0E ; 14 25be2: 71 e0 ldi r23, 0x01 ; 1 25be4: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 25be8: 60 93 cf 12 sts 0x12CF, r22 ; 0x8012cf <_ZN13thermal_modelL4dataE.lto_priv.402+0x20> 25bec: ef ea ldi r30, 0xAF ; 175 25bee: f2 e1 ldi r31, 0x12 ; 18 // initial values for(uint8_t i = 0; i != THERMAL_MODEL_MAX_LAG_SIZE; ++i) dT_lag_buf[i] = NAN; 25bf0: 80 e0 ldi r24, 0x00 ; 0 25bf2: 90 e0 ldi r25, 0x00 ; 0 25bf4: a0 ec ldi r26, 0xC0 ; 192 25bf6: bf e7 ldi r27, 0x7F ; 127 25bf8: 81 93 st Z+, r24 25bfa: 91 93 st Z+, r25 25bfc: a1 93 st Z+, r26 25bfe: b1 93 st Z+, r27 warn_s = warn * TEMP_MGR_INTV; err_s = err * TEMP_MGR_INTV; dT_lag_size = L / (uint16_t)(TEMP_MGR_INTV * 1000); // initial values for(uint8_t i = 0; i != THERMAL_MODEL_MAX_LAG_SIZE; ++i) 25c00: 22 e1 ldi r18, 0x12 ; 18 25c02: ef 3c cpi r30, 0xCF ; 207 25c04: f2 07 cpc r31, r18 25c06: c1 f7 brne .-16 ; 0x25bf8 dT_lag_buf[i] = NAN; dT_lag_idx = 0; 25c08: 10 92 d0 12 sts 0x12D0, r1 ; 0x8012d0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x21> dT_err_prev = 0; 25c0c: 10 92 d1 12 sts 0x12D1, r1 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 25c10: 10 92 d2 12 sts 0x12D2, r1 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 25c14: 10 92 d3 12 sts 0x12D3, r1 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 25c18: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> T_prev = NAN; 25c1c: 80 93 d5 12 sts 0x12D5, r24 ; 0x8012d5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x26> 25c20: 90 93 d6 12 sts 0x12D6, r25 ; 0x8012d6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x27> 25c24: a0 93 d7 12 sts 0x12D7, r26 ; 0x8012d7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x28> 25c28: b0 93 d8 12 sts 0x12D8, r27 ; 0x8012d8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x29> // clear the initialization flag flag_bits.uninitialized = false; 25c2c: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 25c30: 8e 7f andi r24, 0xFE ; 254 25c32: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 25c36: 84 ec ldi r24, 0xC4 ; 196 25c38: 96 e0 ldi r25, 0x06 ; 6 25c3a: 9f 83 std Y+7, r25 ; 0x07 25c3c: 8e 83 std Y+6, r24 ; 0x06 { *var = v; thermal_model::data.reset(rec_buffer[0].pwm, fan_pwm, rec_buffer[0].temp, ambient); float err = 0; uint16_t cnt = 0; for(uint16_t i = 1; i < samples; ++i) { 25c3e: e1 e0 ldi r30, 0x01 ; 1 25c40: f0 e0 ldi r31, 0x00 ; 0 25c42: fa 83 std Y+2, r31 ; 0x02 25c44: e9 83 std Y+1, r30 ; 0x01 static float cost_fn(uint16_t samples, float* const var, float v, uint8_t fan_pwm, float ambient) { *var = v; thermal_model::data.reset(rec_buffer[0].pwm, fan_pwm, rec_buffer[0].temp, ambient); float err = 0; uint16_t cnt = 0; 25c46: 31 2c mov r3, r1 25c48: 21 2c mov r2, r1 static float cost_fn(uint16_t samples, float* const var, float v, uint8_t fan_pwm, float ambient) { *var = v; thermal_model::data.reset(rec_buffer[0].pwm, fan_pwm, rec_buffer[0].temp, ambient); float err = 0; 25c4a: 81 2c mov r8, r1 25c4c: 91 2c mov r9, r1 25c4e: 54 01 movw r10, r8 uint16_t cnt = 0; for(uint16_t i = 1; i < samples; ++i) { 25c50: 29 81 ldd r18, Y+1 ; 0x01 25c52: 3a 81 ldd r19, Y+2 ; 0x02 25c54: 8b 81 ldd r24, Y+3 ; 0x03 25c56: 9c 81 ldd r25, Y+4 ; 0x04 25c58: 28 17 cp r18, r24 25c5a: 39 07 cpc r19, r25 25c5c: c8 f5 brcc .+114 ; 0x25cd0 thermal_model::data.step(rec_buffer[i].pwm, fan_pwm, rec_buffer[i].temp, ambient); 25c5e: ee 81 ldd r30, Y+6 ; 0x06 25c60: ff 81 ldd r31, Y+7 ; 0x07 25c62: 25 81 ldd r18, Z+5 ; 0x05 25c64: 36 81 ldd r19, Z+6 ; 0x06 25c66: 47 81 ldd r20, Z+7 ; 0x07 25c68: 50 85 ldd r21, Z+8 ; 0x08 25c6a: 83 01 movw r16, r6 25c6c: 72 01 movw r14, r4 25c6e: 6d 81 ldd r22, Y+5 ; 0x05 25c70: 81 85 ldd r24, Z+9 ; 0x09 25c72: 0e 94 ec e5 call 0x1cbd8 ; 0x1cbd8 float err_v = thermal_model::data.dT_err_prev; 25c76: c0 90 d1 12 lds r12, 0x12D1 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 25c7a: d0 90 d2 12 lds r13, 0x12D2 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 25c7e: e0 90 d3 12 lds r14, 0x12D3 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 25c82: f0 90 d4 12 lds r15, 0x12D4 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> if(!isnan(err_v)) { 25c86: a7 01 movw r20, r14 25c88: 96 01 movw r18, r12 25c8a: c7 01 movw r24, r14 25c8c: b6 01 movw r22, r12 25c8e: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 25c92: 81 11 cpse r24, r1 25c94: 11 c0 rjmp .+34 ; 0x25cb8 err += err_v * err_v; 25c96: a7 01 movw r20, r14 25c98: 96 01 movw r18, r12 25c9a: c7 01 movw r24, r14 25c9c: b6 01 movw r22, r12 25c9e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 25ca2: 9b 01 movw r18, r22 25ca4: ac 01 movw r20, r24 25ca6: c5 01 movw r24, r10 25ca8: b4 01 movw r22, r8 25caa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 25cae: 4b 01 movw r8, r22 25cb0: 5c 01 movw r10, r24 ++cnt; 25cb2: ff ef ldi r31, 0xFF ; 255 25cb4: 2f 1a sub r2, r31 25cb6: 3f 0a sbc r3, r31 { *var = v; thermal_model::data.reset(rec_buffer[0].pwm, fan_pwm, rec_buffer[0].temp, ambient); float err = 0; uint16_t cnt = 0; for(uint16_t i = 1; i < samples; ++i) { 25cb8: 29 81 ldd r18, Y+1 ; 0x01 25cba: 3a 81 ldd r19, Y+2 ; 0x02 25cbc: 2f 5f subi r18, 0xFF ; 255 25cbe: 3f 4f sbci r19, 0xFF ; 255 25cc0: 3a 83 std Y+2, r19 ; 0x02 25cc2: 29 83 std Y+1, r18 ; 0x01 25cc4: 8e 81 ldd r24, Y+6 ; 0x06 25cc6: 9f 81 ldd r25, Y+7 ; 0x07 25cc8: 05 96 adiw r24, 0x05 ; 5 25cca: 9f 83 std Y+7, r25 ; 0x07 25ccc: 8e 83 std Y+6, r24 ; 0x06 25cce: c0 cf rjmp .-128 ; 0x25c50 if(!isnan(err_v)) { err += err_v * err_v; ++cnt; } } return cnt ? (err / cnt) : NAN; 25cd0: 60 e0 ldi r22, 0x00 ; 0 25cd2: 70 e0 ldi r23, 0x00 ; 0 25cd4: 80 ec ldi r24, 0xC0 ; 192 25cd6: 9f e7 ldi r25, 0x7F ; 127 25cd8: 21 14 cp r2, r1 25cda: 31 04 cpc r3, r1 25cdc: 59 f0 breq .+22 ; 0x25cf4 25cde: b1 01 movw r22, r2 25ce0: 90 e0 ldi r25, 0x00 ; 0 25ce2: 80 e0 ldi r24, 0x00 ; 0 25ce4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 25ce8: 9b 01 movw r18, r22 25cea: ac 01 movw r20, r24 25cec: c5 01 movw r24, r10 25cee: b4 01 movw r22, r8 25cf0: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> } 25cf4: 27 96 adiw r28, 0x07 ; 7 25cf6: 0f b6 in r0, 0x3f ; 63 25cf8: f8 94 cli 25cfa: de bf out 0x3e, r29 ; 62 25cfc: 0f be out 0x3f, r0 ; 63 25cfe: cd bf out 0x3d, r28 ; 61 25d00: df 91 pop r29 25d02: cf 91 pop r28 25d04: 1f 91 pop r17 25d06: 0f 91 pop r16 25d08: ff 90 pop r15 25d0a: ef 90 pop r14 25d0c: df 90 pop r13 25d0e: cf 90 pop r12 25d10: bf 90 pop r11 25d12: af 90 pop r10 25d14: 9f 90 pop r9 25d16: 8f 90 pop r8 25d18: 7f 90 pop r7 25d1a: 6f 90 pop r6 25d1c: 5f 90 pop r5 25d1e: 4f 90 pop r4 25d20: 3f 90 pop r3 25d22: 2f 90 pop r2 25d24: 08 95 ret 00025d26 : namespace thermal_model_cal { // set current fan speed for both front/backend static __attribute__((noinline)) void set_fan_speed(uint8_t fan_speed) { 25d26: cf 93 push r28 25d28: c8 2f mov r28, r24 // reset the fan measuring state due to missing hysteresis handling on the checking side resetFanCheck(); 25d2a: 0e 94 79 74 call 0xe8f2 ; 0xe8f2 fanSpeed = fan_speed; 25d2e: c0 93 e5 03 sts 0x03E5, r28 ; 0x8003e5 #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = fan_speed; 25d32: c0 93 a5 04 sts 0x04A5, r28 ; 0x8004a5 #endif } 25d36: cf 91 pop r28 25d38: 08 95 ret 00025d3a : thermal_model::data.R[index] = R; thermal_model::setup(); } void thermal_model_report_settings() { 25d3a: cf 92 push r12 25d3c: df 92 push r13 25d3e: ef 92 push r14 25d40: ff 92 push r15 25d42: 0f 93 push r16 25d44: 1f 93 push r17 25d46: cf 93 push r28 25d48: df 93 push r29 SERIAL_ECHO_START; 25d4a: 82 ef ldi r24, 0xF2 ; 242 25d4c: 9a ea ldi r25, 0xAA ; 170 25d4e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNPGM("Thermal Model settings:"); 25d52: 83 e6 ldi r24, 0x63 ; 99 25d54: 9e e9 ldi r25, 0x9E ; 158 25d56: 0e 94 13 79 call 0xf226 ; 0xf226 25d5a: cf ee ldi r28, 0xEF ; 239 25d5c: d2 e1 ldi r29, 0x12 ; 18 25d5e: 10 e0 ldi r17, 0x00 ; 0 25d60: 00 e0 ldi r16, 0x00 ; 0 for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) printf_P(PSTR("%S M310 I%u R%.2f\n"), echomagic, (unsigned)i, (double)thermal_model::data.R[i]); 25d62: 82 ef ldi r24, 0xF2 ; 242 25d64: e8 2e mov r14, r24 25d66: 8a ea ldi r24, 0xAA ; 170 25d68: f8 2e mov r15, r24 25d6a: 9f e4 ldi r25, 0x4F ; 79 25d6c: c9 2e mov r12, r25 25d6e: 9e e9 ldi r25, 0x9E ; 158 25d70: d9 2e mov r13, r25 25d72: 88 81 ld r24, Y 25d74: 99 81 ldd r25, Y+1 ; 0x01 25d76: 2a 81 ldd r18, Y+2 ; 0x02 25d78: 3b 81 ldd r19, Y+3 ; 0x03 25d7a: 24 96 adiw r28, 0x04 ; 4 25d7c: 3f 93 push r19 25d7e: 2f 93 push r18 25d80: 9f 93 push r25 25d82: 8f 93 push r24 25d84: 1f 93 push r17 25d86: 0f 93 push r16 25d88: ff 92 push r15 25d8a: ef 92 push r14 25d8c: df 92 push r13 25d8e: cf 92 push r12 25d90: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 25d94: 0f 5f subi r16, 0xFF ; 255 25d96: 1f 4f sbci r17, 0xFF ; 255 void thermal_model_report_settings() { SERIAL_ECHO_START; SERIAL_ECHOLNPGM("Thermal Model settings:"); for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) 25d98: 8d b7 in r24, 0x3d ; 61 25d9a: 9e b7 in r25, 0x3e ; 62 25d9c: 0a 96 adiw r24, 0x0a ; 10 25d9e: 0f b6 in r0, 0x3f ; 63 25da0: f8 94 cli 25da2: 9e bf out 0x3e, r25 ; 62 25da4: 0f be out 0x3f, r0 ; 63 25da6: 8d bf out 0x3d, r24 ; 61 25da8: 00 31 cpi r16, 0x10 ; 16 25daa: 11 05 cpc r17, r1 25dac: 11 f7 brne .-60 ; 0x25d72 printf_P(PSTR("%S M310 I%u R%.2f\n"), echomagic, (unsigned)i, (double)thermal_model::data.R[i]); printf_P(PSTR("%S M310 P%.2f U%.4f V%.2f C%.2f D%.4f L%u S%u B%u E%.2f W%.2f T%.2f\n"), 25dae: 80 91 32 13 lds r24, 0x1332 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> 25db2: 8f 93 push r24 25db4: 80 91 31 13 lds r24, 0x1331 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 25db8: 8f 93 push r24 25dba: 80 91 30 13 lds r24, 0x1330 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 25dbe: 8f 93 push r24 25dc0: 80 91 2f 13 lds r24, 0x132F ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 25dc4: 8f 93 push r24 25dc6: 80 91 36 13 lds r24, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> 25dca: 8f 93 push r24 25dcc: 80 91 35 13 lds r24, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 25dd0: 8f 93 push r24 25dd2: 80 91 34 13 lds r24, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 25dd6: 8f 93 push r24 25dd8: 80 91 33 13 lds r24, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 25ddc: 8f 93 push r24 25dde: 80 91 3a 13 lds r24, 0x133A ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> 25de2: 8f 93 push r24 25de4: 80 91 39 13 lds r24, 0x1339 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 25de8: 8f 93 push r24 25dea: 80 91 38 13 lds r24, 0x1338 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 25dee: 8f 93 push r24 25df0: 80 91 37 13 lds r24, 0x1337 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 25df4: 8f 93 push r24 25df6: 80 91 3d 02 lds r24, 0x023D ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> 25dfa: 1f 92 push r1 25dfc: 8f 93 push r24 25dfe: 80 91 1c 05 lds r24, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 25e02: 1f 92 push r1 25e04: 8f 93 push r24 25e06: 80 91 ee 12 lds r24, 0x12EE ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 25e0a: 8f 93 push r24 25e0c: 80 91 ed 12 lds r24, 0x12ED ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> 25e10: 8f 93 push r24 25e12: 80 91 ec 12 lds r24, 0x12EC ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> 25e16: 8f 93 push r24 25e18: 80 91 eb 12 lds r24, 0x12EB ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 25e1c: 8f 93 push r24 25e1e: 80 91 ea 12 lds r24, 0x12EA ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 25e22: 8f 93 push r24 25e24: 80 91 e9 12 lds r24, 0x12E9 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 25e28: 8f 93 push r24 25e2a: 80 91 e8 12 lds r24, 0x12E8 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> 25e2e: 8f 93 push r24 25e30: 80 91 e7 12 lds r24, 0x12E7 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 25e34: 8f 93 push r24 25e36: 80 91 e6 12 lds r24, 0x12E6 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 25e3a: 8f 93 push r24 25e3c: 80 91 e5 12 lds r24, 0x12E5 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 25e40: 8f 93 push r24 25e42: 80 91 e4 12 lds r24, 0x12E4 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> 25e46: 8f 93 push r24 25e48: 80 91 e3 12 lds r24, 0x12E3 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 25e4c: 8f 93 push r24 25e4e: 80 91 e2 12 lds r24, 0x12E2 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 25e52: 8f 93 push r24 25e54: 80 91 e1 12 lds r24, 0x12E1 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 25e58: 8f 93 push r24 25e5a: 80 91 e0 12 lds r24, 0x12E0 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> 25e5e: 8f 93 push r24 25e60: 80 91 df 12 lds r24, 0x12DF ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 25e64: 8f 93 push r24 25e66: 80 91 de 12 lds r24, 0x12DE ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 25e6a: 8f 93 push r24 25e6c: 80 91 dd 12 lds r24, 0x12DD ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 25e70: 8f 93 push r24 25e72: 80 91 dc 12 lds r24, 0x12DC ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> 25e76: 8f 93 push r24 25e78: 80 91 db 12 lds r24, 0x12DB ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 25e7c: 8f 93 push r24 25e7e: 80 91 da 12 lds r24, 0x12DA ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 25e82: 8f 93 push r24 25e84: 80 91 d9 12 lds r24, 0x12D9 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 25e88: 8f 93 push r24 25e8a: ff 92 push r15 25e8c: ef 92 push r14 25e8e: 89 e0 ldi r24, 0x09 ; 9 25e90: 9e e9 ldi r25, 0x9E ; 158 25e92: 9f 93 push r25 25e94: 8f 93 push r24 25e96: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 25e9a: 8d b7 in r24, 0x3d ; 61 25e9c: 9e b7 in r25, 0x3e ; 62 25e9e: 8a 96 adiw r24, 0x2a ; 42 25ea0: 0f b6 in r0, 0x3f ; 63 25ea2: f8 94 cli 25ea4: 9e bf out 0x3e, r25 ; 62 25ea6: 0f be out 0x3f, r0 ; 63 25ea8: 8d bf out 0x3d, r24 ; 61 echomagic, (double)thermal_model::data.P, (double)thermal_model::data.U, (double)thermal_model::data.V, (double)thermal_model::data.C, (double)thermal_model::data.fS, (unsigned)thermal_model::data.L, (unsigned)thermal_model::enabled, (unsigned)thermal_model::warn_beep, (double)thermal_model::data.err, (double)thermal_model::data.warn, (double)thermal_model::data.Ta_corr); } 25eaa: df 91 pop r29 25eac: cf 91 pop r28 25eae: 1f 91 pop r17 25eb0: 0f 91 pop r16 25eb2: ff 90 pop r15 25eb4: ef 90 pop r14 25eb6: df 90 pop r13 25eb8: cf 90 pop r12 25eba: 08 95 ret 00025ebc : // set the model lag rounding to the effective sample resolution, ensuring the reported/stored lag // matches the current model constraints (future-proofing for model changes) static void thermal_model_set_lag(uint16_t ms) { static const uint16_t intv_ms = (uint16_t)(TEMP_MGR_INTV * 1000); uint16_t samples = ((ms + intv_ms/2) / intv_ms); 25ebc: 89 57 subi r24, 0x79 ; 121 25ebe: 9f 4f sbci r25, 0xFF ; 255 25ec0: 6e e0 ldi r22, 0x0E ; 14 25ec2: 71 e0 ldi r23, 0x01 ; 1 25ec4: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> // ensure we do not exceed the maximum lag buffer and have at least one lag sample for filtering if(samples < 1) 25ec8: 61 15 cp r22, r1 25eca: 71 05 cpc r23, r1 25ecc: 99 f0 breq .+38 ; 0x25ef4 25ece: 69 30 cpi r22, 0x09 ; 9 25ed0: 71 05 cpc r23, r1 25ed2: 10 f0 brcs .+4 ; 0x25ed8 25ed4: 68 e0 ldi r22, 0x08 ; 8 25ed6: 70 e0 ldi r23, 0x00 ; 0 samples = 1; else if(samples > THERMAL_MODEL_MAX_LAG_SIZE) samples = THERMAL_MODEL_MAX_LAG_SIZE; // round back to ms thermal_model::data.L = samples * intv_ms; 25ed8: 2e e0 ldi r18, 0x0E ; 14 25eda: 31 e0 ldi r19, 0x01 ; 1 25edc: 62 9f mul r22, r18 25ede: c0 01 movw r24, r0 25ee0: 63 9f mul r22, r19 25ee2: 90 0d add r25, r0 25ee4: 72 9f mul r23, r18 25ee6: 90 0d add r25, r0 25ee8: 11 24 eor r1, r1 25eea: 90 93 ee 12 sts 0x12EE, r25 ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 25eee: 80 93 ed 12 sts 0x12ED, r24 ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> } 25ef2: 08 95 ret static const uint16_t intv_ms = (uint16_t)(TEMP_MGR_INTV * 1000); uint16_t samples = ((ms + intv_ms/2) / intv_ms); // ensure we do not exceed the maximum lag buffer and have at least one lag sample for filtering if(samples < 1) samples = 1; 25ef4: 61 e0 ldi r22, 0x01 ; 1 25ef6: 70 e0 ldi r23, 0x00 ; 0 25ef8: ef cf rjmp .-34 ; 0x25ed8 00025efa : if(!calibrated()) enabled = false; reinitialize(); } static bool calibrated() { 25efa: cf 93 push r28 25efc: df 93 push r29 if(!(data.P > 0)) return false; 25efe: 20 e0 ldi r18, 0x00 ; 0 25f00: 30 e0 ldi r19, 0x00 ; 0 25f02: a9 01 movw r20, r18 25f04: 60 91 d9 12 lds r22, 0x12D9 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 25f08: 70 91 da 12 lds r23, 0x12DA ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 25f0c: 80 91 db 12 lds r24, 0x12DB ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 25f10: 90 91 dc 12 lds r25, 0x12DC ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> 25f14: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 25f18: 18 16 cp r1, r24 25f1a: 0c f0 brlt .+2 ; 0x25f1e 25f1c: 54 c0 rjmp .+168 ; 0x25fc6 if(isnan(data.U)) return false; 25f1e: 60 91 dd 12 lds r22, 0x12DD ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 25f22: 70 91 de 12 lds r23, 0x12DE ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 25f26: 80 91 df 12 lds r24, 0x12DF ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 25f2a: 90 91 e0 12 lds r25, 0x12E0 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> 25f2e: 9b 01 movw r18, r22 25f30: ac 01 movw r20, r24 25f32: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 25f36: 81 11 cpse r24, r1 25f38: 46 c0 rjmp .+140 ; 0x25fc6 if(isnan(data.V)) return false; 25f3a: 60 91 e1 12 lds r22, 0x12E1 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 25f3e: 70 91 e2 12 lds r23, 0x12E2 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 25f42: 80 91 e3 12 lds r24, 0x12E3 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 25f46: 90 91 e4 12 lds r25, 0x12E4 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> 25f4a: 9b 01 movw r18, r22 25f4c: ac 01 movw r20, r24 25f4e: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 25f52: 81 11 cpse r24, r1 25f54: 38 c0 rjmp .+112 ; 0x25fc6 if(!(data.C > 0)) return false; 25f56: 20 e0 ldi r18, 0x00 ; 0 25f58: 30 e0 ldi r19, 0x00 ; 0 25f5a: a9 01 movw r20, r18 25f5c: 60 91 e5 12 lds r22, 0x12E5 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 25f60: 70 91 e6 12 lds r23, 0x12E6 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 25f64: 80 91 e7 12 lds r24, 0x12E7 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 25f68: 90 91 e8 12 lds r25, 0x12E8 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> 25f6c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 25f70: 18 16 cp r1, r24 25f72: 4c f5 brge .+82 ; 0x25fc6 if(isnan(data.fS)) return false; 25f74: 60 91 e9 12 lds r22, 0x12E9 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 25f78: 70 91 ea 12 lds r23, 0x12EA ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 25f7c: 80 91 eb 12 lds r24, 0x12EB ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 25f80: 90 91 ec 12 lds r25, 0x12EC ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> 25f84: 9b 01 movw r18, r22 25f86: ac 01 movw r20, r24 25f88: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 25f8c: 81 11 cpse r24, r1 25f8e: 1b c0 rjmp .+54 ; 0x25fc6 if(!(data.L > 0)) return false; 25f90: 80 91 ed 12 lds r24, 0x12ED ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> 25f94: 90 91 ee 12 lds r25, 0x12EE ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 25f98: 89 2b or r24, r25 25f9a: a9 f0 breq .+42 ; 0x25fc6 25f9c: cf ee ldi r28, 0xEF ; 239 25f9e: d2 e1 ldi r29, 0x12 ; 18 if(!(data.Ta_corr != NAN)) return false; for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) { if(!(thermal_model::data.R[i] >= 0)) 25fa0: 69 91 ld r22, Y+ 25fa2: 79 91 ld r23, Y+ 25fa4: 89 91 ld r24, Y+ 25fa6: 99 91 ld r25, Y+ 25fa8: 20 e0 ldi r18, 0x00 ; 0 25faa: 30 e0 ldi r19, 0x00 ; 0 25fac: a9 01 movw r20, r18 25fae: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 25fb2: 87 fd sbrc r24, 7 25fb4: 08 c0 rjmp .+16 ; 0x25fc6 if(isnan(data.V)) return false; if(!(data.C > 0)) return false; if(isnan(data.fS)) return false; if(!(data.L > 0)) return false; if(!(data.Ta_corr != NAN)) return false; for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) { 25fb6: 83 e1 ldi r24, 0x13 ; 19 25fb8: cf 32 cpi r28, 0x2F ; 47 25fba: d8 07 cpc r29, r24 25fbc: 89 f7 brne .-30 ; 0x25fa0 if(!(thermal_model::data.R[i] >= 0)) return false; } if(!(data.warn != NAN)) return false; if(!(data.err != NAN)) return false; return true; 25fbe: 81 e0 ldi r24, 0x01 ; 1 } 25fc0: df 91 pop r29 25fc2: cf 91 pop r28 25fc4: 08 95 ret reinitialize(); } static bool calibrated() { if(!(data.P > 0)) return false; 25fc6: 80 e0 ldi r24, 0x00 ; 0 25fc8: fb cf rjmp .-10 ; 0x25fc0 00025fca : } // verify calibration status and trigger a model reset if valid static void setup() { if(!calibrated()) enabled = false; 25fca: 0f 94 7d 2f call 0x25efa ; 0x25efa 25fce: 81 11 cpse r24, r1 25fd0: 02 c0 rjmp .+4 ; 0x25fd6 25fd2: 10 92 1c 05 sts 0x051C, r1 ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> } // clear error flags and mark as uninitialized static void reinitialize() { data.flags = 1; // shorcut to reset all error flags 25fd6: 81 e0 ldi r24, 0x01 ; 1 25fd8: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> warning_state.assert = false; // explicitly clear assertions 25fdc: 80 91 38 06 lds r24, 0x0638 ; 0x800638 25fe0: 8d 7f andi r24, 0xFD ; 253 25fe2: 80 93 38 06 sts 0x0638, r24 ; 0x800638 // verify calibration status and trigger a model reset if valid static void setup() { if(!calibrated()) enabled = false; reinitialize(); } 25fe6: 08 95 ret 00025fe8 : } ENABLE_TEMP_MGR_INTERRUPT(); } void disable_heater() { 25fe8: cf 93 push r28 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 25fea: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 25fee: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 25ff2: 10 92 72 06 sts 0x0672, r1 ; 0x800672 25ff6: 10 92 71 06 sts 0x0671, r1 ; 0x800671 setTargetHotend(0); setTargetBed(0); ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 25ffa: cf b7 in r28, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 25ffc: f8 94 cli // propagate all values down the chain setIsrTargetTemperatures(); 25ffe: 0f 94 6f 14 call 0x228de ; 0x228de temp_mgr_pid(); 26002: 0f 94 ac 11 call 0x22358 ; 0x22358 // 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); 26006: 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; 26008: 10 92 8c 06 sts 0x068C, r1 ; 0x80068c (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2600c: cf bf out 0x3f, r28 ; 63 #endif } } 2600e: cf 91 pop r28 26010: 08 95 ret 00026012 : /* Menu implementation */ static void lcd_cooldown() { disable_heater(); 26012: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 fanSpeed = 0; 26016: 10 92 e5 03 sts 0x03E5, r1 ; 0x8003e5 lcd_return_to_status(); 2601a: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 0002601e : // 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) { 2601e: 1f 93 push r17 26020: cf 93 push r28 26022: df 93 push r29 26024: c8 2f mov r28, r24 26026: 16 2f mov r17, r22 26028: d4 2f mov r29, r20 // save the original target temperatures for recovery before disabling heaters if(!temp_error_state.error && !saved_printing) { 2602a: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 2602e: 80 fd sbrc r24, 0 26030: 18 c0 rjmp .+48 ; 0x26062 26032: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 26036: 81 11 cpse r24, r1 26038: 14 c0 rjmp .+40 ; 0x26062 saved_bed_temperature = target_temperature_bed; 2603a: 80 91 71 06 lds r24, 0x0671 ; 0x800671 2603e: 80 93 ad 05 sts 0x05AD, r24 ; 0x8005ad saved_extruder_temperature = target_temperature[index]; 26042: e6 2f mov r30, r22 26044: f0 e0 ldi r31, 0x00 ; 0 26046: ee 0f add r30, r30 26048: ff 1f adc r31, r31 2604a: eb 54 subi r30, 0x4B ; 75 2604c: f2 4f sbci r31, 0xF2 ; 242 2604e: 80 81 ld r24, Z 26050: 91 81 ldd r25, Z+1 ; 0x01 26052: 90 93 ac 05 sts 0x05AC, r25 ; 0x8005ac 26056: 80 93 ab 05 sts 0x05AB, r24 ; 0x8005ab saved_fan_speed = fanSpeed; 2605a: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 2605e: 80 93 aa 05 sts 0x05AA, r24 ; 0x8005aa } // keep disabling heaters and keep fans on as long as the condition is asserted disable_heater(); 26062: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 void hotendFanSetFullSpeed() { #ifdef EXTRUDER_ALTFAN_DETECT altfanStatus.altfanOverride = 1; //full speed #endif //EXTRUDER_ALTFAN_DETECT resetFanCheck(); 26066: 0e 94 79 74 call 0xe8f2 ; 0xe8f2 setExtruderAutoFanState(3); 2606a: 83 e0 ldi r24, 0x03 ; 3 2606c: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 SET_OUTPUT(FAN_PIN); 26070: 80 91 01 01 lds r24, 0x0101 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> 26074: 88 60 ori r24, 0x08 ; 8 26076: 80 93 01 01 sts 0x0101, r24 ; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101> #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = 255; 2607a: 8f ef ldi r24, 0xFF ; 255 2607c: 80 93 a5 04 sts 0x04A5, r24 ; 0x8004a5 #else //FAN_SOFT_PWM analogWrite(FAN_PIN, 255); #endif //FAN_SOFT_PWM fanSpeed = 255; 26080: 80 93 e5 03 sts 0x03E5, r24 ; 0x8003e5 hotendFanSetFullSpeed(); // set the initial error source to the highest priority error if(!temp_error_state.error || (uint8_t)type < temp_error_state.type) { 26084: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 26088: 80 ff sbrs r24, 0 2608a: 07 c0 rjmp .+14 ; 0x2609a 2608c: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 26090: 82 95 swap r24 26092: 86 95 lsr r24 26094: 87 70 andi r24, 0x07 ; 7 26096: d8 17 cp r29, r24 26098: c0 f4 brcc .+48 ; 0x260ca temp_error_state.source = (uint8_t)source; 2609a: c3 70 andi r28, 0x03 ; 3 2609c: cc 0f add r28, r28 2609e: cc 0f add r28, r28 260a0: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 260a4: 83 7f andi r24, 0xF3 ; 243 260a6: 8c 2b or r24, r28 260a8: 80 93 1a 05 sts 0x051A, r24 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> temp_error_state.index = index; 260ac: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 260b0: 10 fb bst r17, 0 260b2: 84 f9 bld r24, 4 260b4: 80 93 1a 05 sts 0x051A, r24 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> temp_error_state.type = (uint8_t)type; 260b8: d2 95 swap r29 260ba: dd 0f add r29, r29 260bc: d0 7e andi r29, 0xE0 ; 224 260be: 40 91 1a 05 lds r20, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 260c2: 4f 71 andi r20, 0x1F ; 31 260c4: 4d 2b or r20, r29 260c6: 40 93 1a 05 sts 0x051A, r20 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> } // always set the error state temp_error_state.error = true; 260ca: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 260ce: 81 60 ori r24, 0x01 ; 1 260d0: 80 93 1a 05 sts 0x051A, r24 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> temp_error_state.assert = true; 260d4: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 260d8: 82 60 ori r24, 0x02 ; 2 260da: 80 93 1a 05 sts 0x051A, r24 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> } 260de: df 91 pop r29 260e0: cf 91 pop r28 260e2: 1f 91 pop r17 260e4: 08 95 ret 000260e6 : } void check_min_temp_bed() { #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP if (current_temperature_bed_raw >= bed_minttemp_raw) { 260e6: 20 91 08 06 lds r18, 0x0608 ; 0x800608 260ea: 30 91 09 06 lds r19, 0x0609 ; 0x800609 260ee: 80 91 52 02 lds r24, 0x0252 ; 0x800252 <_ZL16bed_minttemp_raw.lto_priv.473> 260f2: 90 91 53 02 lds r25, 0x0253 ; 0x800253 <_ZL16bed_minttemp_raw.lto_priv.473+0x1> 260f6: 28 17 cp r18, r24 260f8: 39 07 cpc r19, r25 260fa: 2c f0 brlt .+10 ; 0x26106 #else if (current_temperature_bed_raw <= bed_minttemp_raw) { #endif set_temp_error(TempErrorSource::bed, 0, TempErrorType::min); 260fc: 41 e0 ldi r20, 0x01 ; 1 260fe: 60 e0 ldi r22, 0x00 ; 0 26100: 81 e0 ldi r24, 0x01 ; 1 26102: 0d 94 0f 30 jmp 0x2601e ; 0x2601e } } 26106: 08 95 ret 00026108 : 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]) { 26108: 20 91 0a 06 lds r18, 0x060A ; 0x80060a 2610c: 30 91 0b 06 lds r19, 0x060B ; 0x80060b 26110: 80 91 54 02 lds r24, 0x0254 ; 0x800254 <_ZL12minttemp_raw.lto_priv.474> 26114: 90 91 55 02 lds r25, 0x0255 ; 0x800255 <_ZL12minttemp_raw.lto_priv.474+0x1> 26118: 28 17 cp r18, r24 2611a: 39 07 cpc r19, r25 2611c: 2c f0 brlt .+10 ; 0x26128 #else if (current_temperature_raw[0] <= minttemp_raw[0]) { #endif set_temp_error(TempErrorSource::hotend, 0, TempErrorType::min); 2611e: 41 e0 ldi r20, 0x01 ; 1 26120: 60 e0 ldi r22, 0x00 ; 0 26122: 80 e0 ldi r24, 0x00 ; 0 26124: 0d 94 0f 30 jmp 0x2601e ; 0x2601e } } 26128: 08 95 ret 0002612a : 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) { 2612a: 2f 92 push r2 2612c: 3f 92 push r3 2612e: 4f 92 push r4 26130: 5f 92 push r5 26132: 6f 92 push r6 26134: 7f 92 push r7 26136: 8f 92 push r8 26138: 9f 92 push r9 2613a: af 92 push r10 2613c: bf 92 push r11 2613e: cf 92 push r12 26140: df 92 push r13 26142: ef 92 push r14 26144: ff 92 push r15 26146: 0f 93 push r16 26148: 1f 93 push r17 2614a: cf 93 push r28 2614c: df 93 push r29 2614e: cd b7 in r28, 0x3d ; 61 26150: de b7 in r29, 0x3e ; 62 26152: 2c 97 sbiw r28, 0x0c ; 12 26154: 0f b6 in r0, 0x3f ; 63 26156: f8 94 cli 26158: de bf out 0x3e, r29 ; 62 2615a: 0f be out 0x3f, r0 ; 63 2615c: cd bf out 0x3d, r28 ; 61 2615e: 28 2e mov r2, r24 26160: 49 83 std Y+1, r20 ; 0x01 26162: 5a 83 std Y+2, r21 ; 0x02 26164: 6b 83 std Y+3, r22 ; 0x03 26166: 7c 83 std Y+4, r23 ; 0x04 26168: 28 01 movw r4, r16 2616a: 39 01 movw r6, r18 2616c: 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) 2616e: 0f 94 28 2a call 0x25450 ; 0x25450 26172: 02 2d mov r16, r2 26174: 10 e0 ldi r17, 0x00 ; 0 26176: 98 01 movw r18, r16 26178: 22 0f add r18, r18 2617a: 33 1f adc r19, r19 2617c: 22 0f add r18, r18 2617e: 33 1f adc r19, r19 26180: 3c 87 std Y+12, r19 ; 0x0c 26182: 2b 87 std Y+11, r18 ; 0x0b 26184: f9 01 movw r30, r18 26186: e8 53 subi r30, 0x38 ; 56 26188: fa 4f sbci r31, 0xFA ; 250 2618a: 80 80 ld r8, Z 2618c: 91 80 ldd r9, Z+1 ; 0x01 2618e: a2 80 ldd r10, Z+2 ; 0x02 26190: b3 80 ldd r11, Z+3 ; 0x03 26192: 68 19 sub r22, r8 26194: 79 09 sbc r23, r9 26196: 8a 09 sbc r24, r10 26198: 9b 09 sbc r25, r11 2619a: 61 3d cpi r22, 0xD1 ; 209 2619c: 77 40 sbci r23, 0x07 ; 7 2619e: 81 05 cpc r24, r1 261a0: 91 05 cpc r25, r1 261a2: 08 f4 brcc .+2 ; 0x261a6 261a4: ea c0 rjmp .+468 ; 0x2637a { #ifdef TEMP_RUNAWAY_BED_TIMEOUT if (_isbed) 261a6: 33 20 and r3, r3 261a8: 09 f4 brne .+2 ; 0x261ac 261aa: 75 c0 rjmp .+234 ; 0x26296 { __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS; __timeout = TEMP_RUNAWAY_BED_TIMEOUT; 261ac: 88 e6 ldi r24, 0x68 ; 104 261ae: 91 e0 ldi r25, 0x01 ; 1 261b0: 9a 87 std Y+10, r25 ; 0x0a 261b2: 89 87 std Y+9, r24 ; 0x09 { #ifdef TEMP_RUNAWAY_BED_TIMEOUT if (_isbed) { __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS; 261b4: 80 e0 ldi r24, 0x00 ; 0 261b6: 90 e0 ldi r25, 0x00 ; 0 261b8: a0 ea ldi r26, 0xA0 ; 160 261ba: b0 e4 ldi r27, 0x40 ; 64 } #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; 261bc: 8d 83 std Y+5, r24 ; 0x05 261be: 9e 83 std Y+6, r25 ; 0x06 261c0: af 83 std Y+7, r26 ; 0x07 261c2: b8 87 std Y+8, r27 ; 0x08 __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT; } #endif temp_runaway_timer[_heater_id] = _millis(); 261c4: 0f 94 28 2a call 0x25450 ; 0x25450 261c8: eb 85 ldd r30, Y+11 ; 0x0b 261ca: fc 85 ldd r31, Y+12 ; 0x0c 261cc: e8 53 subi r30, 0x38 ; 56 261ce: fa 4f sbci r31, 0xFA ; 250 261d0: 60 83 st Z, r22 261d2: 71 83 std Z+1, r23 ; 0x01 261d4: 82 83 std Z+2, r24 ; 0x02 261d6: 93 83 std Z+3, r25 ; 0x03 if (_output == 0) 261d8: 20 e0 ldi r18, 0x00 ; 0 261da: 30 e0 ldi r19, 0x00 ; 0 261dc: a9 01 movw r20, r18 261de: c7 01 movw r24, r14 261e0: b6 01 movw r22, r12 261e2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 261e6: 81 11 cpse r24, r1 261e8: 07 c0 rjmp .+14 ; 0x261f8 { temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 261ea: f8 01 movw r30, r16 261ec: ee 0f add r30, r30 261ee: ff 1f adc r31, r31 261f0: ec 53 subi r30, 0x3C ; 60 261f2: fa 4f sbci r31, 0xFA ; 250 261f4: 11 82 std Z+1, r1 ; 0x01 261f6: 10 82 st Z, r1 } if (temp_runaway_target[_heater_id] != _target_temperature) 261f8: ab 85 ldd r26, Y+11 ; 0x0b 261fa: bc 85 ldd r27, Y+12 ; 0x0c 261fc: a4 54 subi r26, 0x44 ; 68 261fe: ba 4f sbci r27, 0xFA ; 250 26200: 5d 01 movw r10, r26 26202: 29 81 ldd r18, Y+1 ; 0x01 26204: 3a 81 ldd r19, Y+2 ; 0x02 26206: 4b 81 ldd r20, Y+3 ; 0x03 26208: 5c 81 ldd r21, Y+4 ; 0x04 2620a: 6d 91 ld r22, X+ 2620c: 7d 91 ld r23, X+ 2620e: 8d 91 ld r24, X+ 26210: 9c 91 ld r25, X 26212: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 26216: 88 23 and r24, r24 26218: 09 f4 brne .+2 ; 0x2621c 2621a: 91 c0 rjmp .+290 ; 0x2633e { if (_target_temperature > 0) 2621c: 20 e0 ldi r18, 0x00 ; 0 2621e: 30 e0 ldi r19, 0x00 ; 0 26220: a9 01 movw r20, r18 26222: 69 81 ldd r22, Y+1 ; 0x01 26224: 7a 81 ldd r23, Y+2 ; 0x02 26226: 8b 81 ldd r24, Y+3 ; 0x03 26228: 9c 81 ldd r25, Y+4 ; 0x04 2622a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2622e: f8 01 movw r30, r16 26230: e6 54 subi r30, 0x46 ; 70 26232: fa 4f sbci r31, 0xFA ; 250 26234: 18 16 cp r1, r24 26236: c4 f5 brge .+112 ; 0x262a8 { temp_runaway_status[_heater_id] = TempRunaway_PREHEAT; 26238: 81 e0 ldi r24, 0x01 ; 1 2623a: 80 83 st Z, r24 temp_runaway_target[_heater_id] = _target_temperature; 2623c: 89 81 ldd r24, Y+1 ; 0x01 2623e: 9a 81 ldd r25, Y+2 ; 0x02 26240: ab 81 ldd r26, Y+3 ; 0x03 26242: bc 81 ldd r27, Y+4 ; 0x04 26244: f5 01 movw r30, r10 26246: 80 83 st Z, r24 26248: 91 83 std Z+1, r25 ; 0x01 2624a: a2 83 std Z+2, r26 ; 0x02 2624c: b3 83 std Z+3, r27 ; 0x03 __preheat_start[_heater_id] = _current_temperature; 2624e: eb 85 ldd r30, Y+11 ; 0x0b 26250: fc 85 ldd r31, Y+12 ; 0x0c 26252: ee 54 subi r30, 0x4E ; 78 26254: fa 4f sbci r31, 0xFA ; 250 26256: 40 82 st Z, r4 26258: 51 82 std Z+1, r5 ; 0x01 2625a: 62 82 std Z+2, r6 ; 0x02 2625c: 73 82 std Z+3, r7 ; 0x03 __preheat_counter[_heater_id] = 0; 2625e: f8 01 movw r30, r16 26260: e0 55 subi r30, 0x50 ; 80 26262: fa 4f sbci r31, 0xFA ; 250 26264: 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)) 26266: a3 01 movw r20, r6 26268: 92 01 movw r18, r4 2626a: bc 01 movw r22, r24 2626c: cd 01 movw r24, r26 2626e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26272: 18 16 cp r1, r24 26274: 1c f5 brge .+70 ; 0x262bc { __preheat_counter[_heater_id]++; 26276: f8 01 movw r30, r16 26278: e0 55 subi r30, 0x50 ; 80 2627a: fa 4f sbci r31, 0xFA ; 250 2627c: 80 81 ld r24, Z 2627e: 8f 5f subi r24, 0xFF ; 255 26280: 80 83 st Z, r24 if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes 26282: 31 10 cpse r3, r1 26284: c7 c0 rjmp .+398 ; 0x26414 26286: 89 30 cpi r24, 0x09 ; 9 26288: c8 f0 brcs .+50 ; 0x262bc { __delta=2.0; 2628a: 81 2c mov r8, r1 2628c: 91 2c mov r9, r1 2628e: a1 2c mov r10, r1 26290: 50 e4 ldi r21, 0x40 ; 64 26292: b5 2e mov r11, r21 26294: e8 c0 rjmp .+464 ; 0x26466 #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT; 26296: ad e2 ldi r26, 0x2D ; 45 26298: b0 e0 ldi r27, 0x00 ; 0 2629a: ba 87 std Y+10, r27 ; 0x0a 2629c: a9 87 std Y+9, r26 ; 0x09 } #endif #ifdef TEMP_RUNAWAY_EXTRUDER_TIMEOUT if (!_isbed) { __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS; 2629e: 80 e0 ldi r24, 0x00 ; 0 262a0: 90 e0 ldi r25, 0x00 ; 0 262a2: a0 e7 ldi r26, 0x70 ; 112 262a4: b1 e4 ldi r27, 0x41 ; 65 262a6: 8a cf rjmp .-236 ; 0x261bc __preheat_start[_heater_id] = _current_temperature; __preheat_counter[_heater_id] = 0; } else { temp_runaway_status[_heater_id] = TempRunaway_INACTIVE; 262a8: 10 82 st Z, r1 temp_runaway_target[_heater_id] = _target_temperature; 262aa: 89 81 ldd r24, Y+1 ; 0x01 262ac: 9a 81 ldd r25, Y+2 ; 0x02 262ae: ab 81 ldd r26, Y+3 ; 0x03 262b0: bc 81 ldd r27, Y+4 ; 0x04 262b2: f5 01 movw r30, r10 262b4: 80 83 st Z, r24 262b6: 91 83 std Z+1, r25 ; 0x01 262b8: a2 83 std Z+2, r26 ; 0x02 262ba: 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) 262bc: 2d 81 ldd r18, Y+5 ; 0x05 262be: 3e 81 ldd r19, Y+6 ; 0x06 262c0: 4f 81 ldd r20, Y+7 ; 0x07 262c2: 58 85 ldd r21, Y+8 ; 0x08 262c4: 69 81 ldd r22, Y+1 ; 0x01 262c6: 7a 81 ldd r23, Y+2 ; 0x02 262c8: 8b 81 ldd r24, Y+3 ; 0x03 262ca: 9c 81 ldd r25, Y+4 ; 0x04 262cc: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 262d0: a3 01 movw r20, r6 262d2: 92 01 movw r18, r4 262d4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 262d8: 87 ff sbrs r24, 7 262da: 46 c0 rjmp .+140 ; 0x26368 262dc: f8 01 movw r30, r16 262de: e6 54 subi r30, 0x46 ; 70 262e0: fa 4f sbci r31, 0xFA ; 250 262e2: 80 81 ld r24, Z 262e4: 81 30 cpi r24, 0x01 ; 1 262e6: 49 f4 brne .+18 ; 0x262fa { temp_runaway_status[_heater_id] = TempRunaway_ACTIVE; 262e8: 82 e0 ldi r24, 0x02 ; 2 262ea: 80 83 st Z, r24 temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 262ec: f8 01 movw r30, r16 262ee: ee 0f add r30, r30 262f0: ff 1f adc r31, r31 262f2: ec 53 subi r30, 0x3C ; 60 262f4: fa 4f sbci r31, 0xFA ; 250 262f6: 11 82 std Z+1, r1 ; 0x01 262f8: 10 82 st Z, r1 } if (_output > 0) 262fa: 20 e0 ldi r18, 0x00 ; 0 262fc: 30 e0 ldi r19, 0x00 ; 0 262fe: a9 01 movw r20, r18 26300: c7 01 movw r24, r14 26302: b6 01 movw r22, r12 26304: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26308: 18 16 cp r1, r24 2630a: bc f5 brge .+110 ; 0x2637a if (temp_runaway_check_active) { // we are in range if ((_current_temperature > (_target_temperature - __hysteresis)) && (_current_temperature < (_target_temperature + __hysteresis))) 2630c: 29 81 ldd r18, Y+1 ; 0x01 2630e: 3a 81 ldd r19, Y+2 ; 0x02 26310: 4b 81 ldd r20, Y+3 ; 0x03 26312: 5c 81 ldd r21, Y+4 ; 0x04 26314: 6d 81 ldd r22, Y+5 ; 0x05 26316: 7e 81 ldd r23, Y+6 ; 0x06 26318: 8f 81 ldd r24, Y+7 ; 0x07 2631a: 98 85 ldd r25, Y+8 ; 0x08 2631c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 26320: a3 01 movw r20, r6 26322: 92 01 movw r18, r4 26324: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26328: 18 16 cp r1, r24 2632a: 0c f0 brlt .+2 ; 0x2632e 2632c: 3f c0 rjmp .+126 ; 0x263ac { temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; 2632e: 00 0f add r16, r16 26330: 11 1f adc r17, r17 26332: f8 01 movw r30, r16 26334: ec 53 subi r30, 0x3C ; 60 26336: fa 4f sbci r31, 0xFA ; 250 26338: 11 82 std Z+1, r1 ; 0x01 2633a: 10 82 st Z, r1 2633c: 1e c0 rjmp .+60 ; 0x2637a 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)) 2633e: a3 01 movw r20, r6 26340: 92 01 movw r18, r4 26342: 69 81 ldd r22, Y+1 ; 0x01 26344: 7a 81 ldd r23, Y+2 ; 0x02 26346: 8b 81 ldd r24, Y+3 ; 0x03 26348: 9c 81 ldd r25, Y+4 ; 0x04 2634a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2634e: 18 16 cp r1, r24 26350: 0c f0 brlt .+2 ; 0x26354 26352: b4 cf rjmp .-152 ; 0x262bc 26354: f8 01 movw r30, r16 26356: e6 54 subi r30, 0x46 ; 70 26358: fa 4f sbci r31, 0xFA ; 250 2635a: 80 81 ld r24, Z 2635c: 81 30 cpi r24, 0x01 ; 1 2635e: 09 f0 breq .+2 ; 0x26362 26360: ad cf rjmp .-166 ; 0x262bc 26362: 89 cf rjmp .-238 ; 0x26276 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; 26364: 10 82 st Z, r1 26366: 97 c0 rjmp .+302 ; 0x26496 temp_runaway_status[_heater_id] = TempRunaway_ACTIVE; temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; } if (_output > 0) 26368: 20 e0 ldi r18, 0x00 ; 0 2636a: 30 e0 ldi r19, 0x00 ; 0 2636c: a9 01 movw r20, r18 2636e: c7 01 movw r24, r14 26370: b6 01 movw r22, r12 26372: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26376: 18 16 cp r1, r24 26378: cc f0 brlt .+50 ; 0x263ac } } } } } 2637a: 2c 96 adiw r28, 0x0c ; 12 2637c: 0f b6 in r0, 0x3f ; 63 2637e: f8 94 cli 26380: de bf out 0x3e, r29 ; 62 26382: 0f be out 0x3f, r0 ; 63 26384: cd bf out 0x3d, r28 ; 61 26386: df 91 pop r29 26388: cf 91 pop r28 2638a: 1f 91 pop r17 2638c: 0f 91 pop r16 2638e: ff 90 pop r15 26390: ef 90 pop r14 26392: df 90 pop r13 26394: cf 90 pop r12 26396: bf 90 pop r11 26398: af 90 pop r10 2639a: 9f 90 pop r9 2639c: 8f 90 pop r8 2639e: 7f 90 pop r7 263a0: 6f 90 pop r6 263a2: 5f 90 pop r5 263a4: 4f 90 pop r4 263a6: 3f 90 pop r3 263a8: 2f 90 pop r2 263aa: 08 95 ret temp_runaway_check_active = false; temp_runaway_error_counter[_heater_id] = 0; } else { if (temp_runaway_status[_heater_id] > TempRunaway_PREHEAT) 263ac: f8 01 movw r30, r16 263ae: e6 54 subi r30, 0x46 ; 70 263b0: fa 4f sbci r31, 0xFA ; 250 263b2: 80 81 ld r24, Z 263b4: 82 30 cpi r24, 0x02 ; 2 263b6: 08 f3 brcs .-62 ; 0x2637a { temp_runaway_error_counter[_heater_id]++; 263b8: 00 0f add r16, r16 263ba: 11 1f adc r17, r17 263bc: f8 01 movw r30, r16 263be: ec 53 subi r30, 0x3C ; 60 263c0: fa 4f sbci r31, 0xFA ; 250 263c2: 80 81 ld r24, Z 263c4: 91 81 ldd r25, Z+1 ; 0x01 263c6: 01 96 adiw r24, 0x01 ; 1 263c8: 91 83 std Z+1, r25 ; 0x01 263ca: 80 83 st Z, r24 if (temp_runaway_error_counter[_heater_id] * 2 > __timeout) 263cc: 88 0f add r24, r24 263ce: 99 1f adc r25, r25 263d0: e9 85 ldd r30, Y+9 ; 0x09 263d2: fa 85 ldd r31, Y+10 ; 0x0a 263d4: e8 17 cp r30, r24 263d6: f9 07 cpc r31, r25 263d8: 80 f6 brcc .-96 ; 0x2637a set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::runaway); 263da: 43 e0 ldi r20, 0x03 ; 3 263dc: 62 2d mov r22, r2 263de: 83 2d mov r24, r3 } } } } } 263e0: 2c 96 adiw r28, 0x0c ; 12 263e2: 0f b6 in r0, 0x3f ; 63 263e4: f8 94 cli 263e6: de bf out 0x3e, r29 ; 62 263e8: 0f be out 0x3f, r0 ; 63 263ea: cd bf out 0x3d, r28 ; 61 263ec: df 91 pop r29 263ee: cf 91 pop r28 263f0: 1f 91 pop r17 263f2: 0f 91 pop r16 263f4: ff 90 pop r15 263f6: ef 90 pop r14 263f8: df 90 pop r13 263fa: cf 90 pop r12 263fc: bf 90 pop r11 263fe: af 90 pop r10 26400: 9f 90 pop r9 26402: 8f 90 pop r8 26404: 7f 90 pop r7 26406: 6f 90 pop r6 26408: 5f 90 pop r5 2640a: 4f 90 pop r4 2640c: 3f 90 pop r3 2640e: 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); 26410: 0d 94 0f 30 jmp 0x2601e ; 0x2601e } 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 26414: 81 31 cpi r24, 0x11 ; 17 26416: 08 f4 brcc .+2 ; 0x2641a 26418: 51 cf rjmp .-350 ; 0x262bc { __delta=2.0; if(_isbed) { __delta=3.0; if(_current_temperature>90.0) __delta=2.0; 2641a: 20 e0 ldi r18, 0x00 ; 0 2641c: 30 e0 ldi r19, 0x00 ; 0 2641e: 44 eb ldi r20, 0xB4 ; 180 26420: 52 e4 ldi r21, 0x42 ; 66 26422: c3 01 movw r24, r6 26424: b2 01 movw r22, r4 26426: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes { __delta=2.0; if(_isbed) { __delta=3.0; 2642a: 81 2c mov r8, r1 2642c: 91 2c mov r9, r1 2642e: e0 e4 ldi r30, 0x40 ; 64 26430: ae 2e mov r10, r30 26432: ba 2c mov r11, r10 if(_current_temperature>90.0) __delta=2.0; 26434: 18 16 cp r1, r24 26436: 2c f4 brge .+10 ; 0x26442 26438: 81 2c mov r8, r1 2643a: 91 2c mov r9, r1 2643c: a1 2c mov r10, r1 2643e: 70 e4 ldi r23, 0x40 ; 64 26440: b7 2e mov r11, r23 if(_current_temperature>105.0) __delta=0.6; 26442: 20 e0 ldi r18, 0x00 ; 0 26444: 30 e0 ldi r19, 0x00 ; 0 26446: 42 ed ldi r20, 0xD2 ; 210 26448: 52 e4 ldi r21, 0x42 ; 66 2644a: c3 01 movw r24, r6 2644c: b2 01 movw r22, r4 2644e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26452: 18 16 cp r1, r24 26454: 44 f4 brge .+16 ; 0x26466 26456: 6a e9 ldi r22, 0x9A ; 154 26458: 86 2e mov r8, r22 2645a: 69 e9 ldi r22, 0x99 ; 153 2645c: 96 2e mov r9, r22 2645e: 69 e1 ldi r22, 0x19 ; 25 26460: a6 2e mov r10, r22 26462: 6f e3 ldi r22, 0x3F ; 63 26464: b6 2e mov r11, r22 } if (_current_temperature - __preheat_start[_heater_id] < __delta) { 26466: eb 85 ldd r30, Y+11 ; 0x0b 26468: fc 85 ldd r31, Y+12 ; 0x0c 2646a: ee 54 subi r30, 0x4E ; 78 2646c: fa 4f sbci r31, 0xFA ; 250 2646e: 20 81 ld r18, Z 26470: 31 81 ldd r19, Z+1 ; 0x01 26472: 42 81 ldd r20, Z+2 ; 0x02 26474: 53 81 ldd r21, Z+3 ; 0x03 26476: c3 01 movw r24, r6 26478: b2 01 movw r22, r4 2647a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2647e: a5 01 movw r20, r10 26480: 94 01 movw r18, r8 26482: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 26486: f8 01 movw r30, r16 26488: e2 55 subi r30, 0x52 ; 82 2648a: fa 4f sbci r31, 0xFA ; 250 2648c: 87 ff sbrs r24, 7 2648e: 6a cf rjmp .-300 ; 0x26364 __preheat_errors[_heater_id]++; 26490: 80 81 ld r24, Z 26492: 8f 5f subi r24, 0xFF ; 255 26494: 80 83 st Z, r24 } else { __preheat_errors[_heater_id] = 0; } if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5)) 26496: 80 81 ld r24, Z 26498: 90 e0 ldi r25, 0x00 ; 0 2649a: 31 10 cpse r3, r1 2649c: 04 c0 rjmp .+8 ; 0x264a6 2649e: 06 97 sbiw r24, 0x06 ; 6 264a0: 4c f0 brlt .+18 ; 0x264b4 set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat); 264a2: 80 e0 ldi r24, 0x00 ; 0 264a4: 03 c0 rjmp .+6 ; 0x264ac __preheat_errors[_heater_id]++; } else { __preheat_errors[_heater_id] = 0; } if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5)) 264a6: 04 97 sbiw r24, 0x04 ; 4 264a8: 2c f0 brlt .+10 ; 0x264b4 set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat); 264aa: 81 e0 ldi r24, 0x01 ; 1 264ac: 42 e0 ldi r20, 0x02 ; 2 264ae: 62 2d mov r22, r2 264b0: 0f 94 0f 30 call 0x2601e ; 0x2601e __preheat_start[_heater_id] = _current_temperature; 264b4: 2b 85 ldd r18, Y+11 ; 0x0b 264b6: 3c 85 ldd r19, Y+12 ; 0x0c 264b8: 2e 54 subi r18, 0x4E ; 78 264ba: 3a 4f sbci r19, 0xFA ; 250 264bc: d9 01 movw r26, r18 264be: 4d 92 st X+, r4 264c0: 5d 92 st X+, r5 264c2: 6d 92 st X+, r6 264c4: 7c 92 st X, r7 264c6: 13 97 sbiw r26, 0x03 ; 3 __preheat_counter[_heater_id] = 0; 264c8: f8 01 movw r30, r16 264ca: e0 55 subi r30, 0x50 ; 80 264cc: fa 4f sbci r31, 0xFA ; 250 264ce: 10 82 st Z, r1 264d0: f5 ce rjmp .-534 ; 0x262bc 000264d2 : temp_mgr_state = TEMP_MGR_INTERRUPT_STATE(); DISABLE_TEMP_MGR_INTERRUPT(); } } ~TempMgrGuard() throw() { 264d2: fc 01 movw r30, r24 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 264d4: 9f b7 in r25, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 264d6: f8 94 cli if(temp_mgr_state) ENABLE_TEMP_MGR_INTERRUPT(); 264d8: 80 81 ld r24, Z 264da: 88 23 and r24, r24 264dc: 29 f0 breq .+10 ; 0x264e8 264de: 80 91 73 00 lds r24, 0x0073 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> 264e2: 82 60 ori r24, 0x02 ; 2 264e4: 80 93 73 00 sts 0x0073, r24 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 264e8: 9f bf out 0x3f, r25 ; 63 } } 264ea: 08 95 ret 000264ec : class TempMgrGuard { bool temp_mgr_state; public: TempMgrGuard() { 264ec: dc 01 movw r26, r24 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 264ee: 2f b7 in r18, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 264f0: f8 94 cli temp_mgr_state = TEMP_MGR_INTERRUPT_STATE(); 264f2: e3 e7 ldi r30, 0x73 ; 115 264f4: f0 e0 ldi r31, 0x00 ; 0 264f6: 90 81 ld r25, Z 264f8: 96 95 lsr r25 264fa: 91 70 andi r25, 0x01 ; 1 264fc: 9c 93 st X, r25 DISABLE_TEMP_MGR_INTERRUPT(); 264fe: 80 81 ld r24, Z 26500: 8d 7f andi r24, 0xFD ; 253 26502: 80 83 st Z, r24 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 26504: 2f bf out 0x3f, r18 ; 63 } } 26506: 08 95 ret 00026508 : (double)thermal_model::data.err, (double)thermal_model::data.warn, (double)thermal_model::data.Ta_corr); } void thermal_model_reset_settings() { 26508: cf 93 push r28 2650a: df 93 push r29 2650c: 1f 92 push r1 2650e: cd b7 in r28, 0x3d ; 61 26510: de b7 in r29, 0x3e ; 62 TempMgrGuard temp_mgr_guard; 26512: ce 01 movw r24, r28 26514: 01 96 adiw r24, 0x01 ; 1 26516: 0f 94 76 32 call 0x264ec ; 0x264ec thermal_model::data.P = THERMAL_MODEL_DEF(P); 2651a: 80 e0 ldi r24, 0x00 ; 0 2651c: 90 e0 ldi r25, 0x00 ; 0 2651e: a8 e1 ldi r26, 0x18 ; 24 26520: b2 e4 ldi r27, 0x42 ; 66 26522: 80 93 d9 12 sts 0x12D9, r24 ; 0x8012d9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x2a> 26526: 90 93 da 12 sts 0x12DA, r25 ; 0x8012da <_ZN13thermal_modelL4dataE.lto_priv.402+0x2b> 2652a: a0 93 db 12 sts 0x12DB, r26 ; 0x8012db <_ZN13thermal_modelL4dataE.lto_priv.402+0x2c> 2652e: b0 93 dc 12 sts 0x12DC, r27 ; 0x8012dc <_ZN13thermal_modelL4dataE.lto_priv.402+0x2d> thermal_model::data.U = THERMAL_MODEL_DEF(U); 26532: 10 92 dd 12 sts 0x12DD, r1 ; 0x8012dd <_ZN13thermal_modelL4dataE.lto_priv.402+0x2e> 26536: 10 92 de 12 sts 0x12DE, r1 ; 0x8012de <_ZN13thermal_modelL4dataE.lto_priv.402+0x2f> 2653a: 10 92 df 12 sts 0x12DF, r1 ; 0x8012df <_ZN13thermal_modelL4dataE.lto_priv.402+0x30> 2653e: 10 92 e0 12 sts 0x12E0, r1 ; 0x8012e0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x31> thermal_model::data.V = THERMAL_MODEL_DEF(V); 26542: 80 e0 ldi r24, 0x00 ; 0 26544: 90 e0 ldi r25, 0x00 ; 0 26546: a0 e8 ldi r26, 0x80 ; 128 26548: bf e3 ldi r27, 0x3F ; 63 2654a: 80 93 e1 12 sts 0x12E1, r24 ; 0x8012e1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x32> 2654e: 90 93 e2 12 sts 0x12E2, r25 ; 0x8012e2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x33> 26552: a0 93 e3 12 sts 0x12E3, r26 ; 0x8012e3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x34> 26556: b0 93 e4 12 sts 0x12E4, r27 ; 0x8012e4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x35> thermal_model::data.C = THERMAL_MODEL_DEF(C); 2655a: 8a e9 ldi r24, 0x9A ; 154 2655c: 99 e9 ldi r25, 0x99 ; 153 2655e: a1 e4 ldi r26, 0x41 ; 65 26560: b1 e4 ldi r27, 0x41 ; 65 26562: 80 93 e5 12 sts 0x12E5, r24 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 26566: 90 93 e6 12 sts 0x12E6, r25 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 2656a: a0 93 e7 12 sts 0x12E7, r26 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 2656e: b0 93 e8 12 sts 0x12E8, r27 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> thermal_model::data.fS = THERMAL_MODEL_DEF(fS); 26572: 88 eb ldi r24, 0xB8 ; 184 26574: 9e e1 ldi r25, 0x1E ; 30 26576: a5 e8 ldi r26, 0x85 ; 133 26578: bd e3 ldi r27, 0x3D ; 61 2657a: 80 93 e9 12 sts 0x12E9, r24 ; 0x8012e9 <_ZN13thermal_modelL4dataE.lto_priv.402+0x3a> 2657e: 90 93 ea 12 sts 0x12EA, r25 ; 0x8012ea <_ZN13thermal_modelL4dataE.lto_priv.402+0x3b> 26582: a0 93 eb 12 sts 0x12EB, r26 ; 0x8012eb <_ZN13thermal_modelL4dataE.lto_priv.402+0x3c> 26586: b0 93 ec 12 sts 0x12EC, r27 ; 0x8012ec <_ZN13thermal_modelL4dataE.lto_priv.402+0x3d> thermal_model::data.L = (uint16_t)(THERMAL_MODEL_DEF(LAG) / (TEMP_MGR_INTV * 1000) + 0.5) * (uint16_t)(TEMP_MGR_INTV * 1000); 2658a: 80 e7 ldi r24, 0x70 ; 112 2658c: 98 e0 ldi r25, 0x08 ; 8 2658e: 90 93 ee 12 sts 0x12EE, r25 ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 26592: 80 93 ed 12 sts 0x12ED, r24 ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> 26596: 8b e7 ldi r24, 0x7B ; 123 26598: 9e e9 ldi r25, 0x9E ; 158 2659a: af ee ldi r26, 0xEF ; 239 2659c: b2 e1 ldi r27, 0x12 ; 18 for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) thermal_model::data.R[i] = pgm_read_float(THERMAL_MODEL_R_DEFAULT + i); 2659e: fc 01 movw r30, r24 265a0: 45 91 lpm r20, Z+ 265a2: 55 91 lpm r21, Z+ 265a4: 65 91 lpm r22, Z+ 265a6: 74 91 lpm r23, Z 265a8: 4d 93 st X+, r20 265aa: 5d 93 st X+, r21 265ac: 6d 93 st X+, r22 265ae: 7d 93 st X+, r23 265b0: 04 96 adiw r24, 0x04 ; 4 thermal_model::data.U = THERMAL_MODEL_DEF(U); thermal_model::data.V = THERMAL_MODEL_DEF(V); thermal_model::data.C = THERMAL_MODEL_DEF(C); thermal_model::data.fS = THERMAL_MODEL_DEF(fS); thermal_model::data.L = (uint16_t)(THERMAL_MODEL_DEF(LAG) / (TEMP_MGR_INTV * 1000) + 0.5) * (uint16_t)(TEMP_MGR_INTV * 1000); for(uint8_t i = 0; i != THERMAL_MODEL_R_SIZE; ++i) 265b2: 23 e1 ldi r18, 0x13 ; 19 265b4: af 32 cpi r26, 0x2F ; 47 265b6: b2 07 cpc r27, r18 265b8: 91 f7 brne .-28 ; 0x2659e thermal_model::data.R[i] = pgm_read_float(THERMAL_MODEL_R_DEFAULT + i); thermal_model::data.Ta_corr = THERMAL_MODEL_Ta_corr; 265ba: 80 e0 ldi r24, 0x00 ; 0 265bc: 90 e0 ldi r25, 0x00 ; 0 265be: a0 ee ldi r26, 0xE0 ; 224 265c0: b0 ec ldi r27, 0xC0 ; 192 265c2: 80 93 2f 13 sts 0x132F, r24 ; 0x80132f <_ZN13thermal_modelL4dataE.lto_priv.402+0x80> 265c6: 90 93 30 13 sts 0x1330, r25 ; 0x801330 <_ZN13thermal_modelL4dataE.lto_priv.402+0x81> 265ca: a0 93 31 13 sts 0x1331, r26 ; 0x801331 <_ZN13thermal_modelL4dataE.lto_priv.402+0x82> 265ce: b0 93 32 13 sts 0x1332, r27 ; 0x801332 <_ZN13thermal_modelL4dataE.lto_priv.402+0x83> thermal_model::data.warn = THERMAL_MODEL_DEF(W); 265d2: 8a e9 ldi r24, 0x9A ; 154 265d4: 99 e9 ldi r25, 0x99 ; 153 265d6: a9 e9 ldi r26, 0x99 ; 153 265d8: bf e3 ldi r27, 0x3F ; 63 265da: 80 93 33 13 sts 0x1333, r24 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 265de: 90 93 34 13 sts 0x1334, r25 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 265e2: a0 93 35 13 sts 0x1335, r26 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 265e6: b0 93 36 13 sts 0x1336, r27 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> thermal_model::data.err = THERMAL_MODEL_DEF(E); 265ea: 82 e5 ldi r24, 0x52 ; 82 265ec: 98 eb ldi r25, 0xB8 ; 184 265ee: ae ed ldi r26, 0xDE ; 222 265f0: bf e3 ldi r27, 0x3F ; 63 265f2: 80 93 37 13 sts 0x1337, r24 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 265f6: 90 93 38 13 sts 0x1338, r25 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 265fa: a0 93 39 13 sts 0x1339, r26 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 265fe: b0 93 3a 13 sts 0x133A, r27 ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> thermal_model::warn_beep = true; 26602: 81 e0 ldi r24, 0x01 ; 1 26604: 80 93 3d 02 sts 0x023D, r24 ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> thermal_model::enabled = true; 26608: 80 93 1c 05 sts 0x051C, r24 ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> } // clear error flags and mark as uninitialized static void reinitialize() { data.flags = 1; // shorcut to reset all error flags 2660c: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> warning_state.assert = false; // explicitly clear assertions 26610: 80 91 38 06 lds r24, 0x0638 ; 0x800638 26614: 8d 7f andi r24, 0xFD ; 253 26616: 80 93 38 06 sts 0x0638, r24 ; 0x800638 (double)thermal_model::data.Ta_corr); } void thermal_model_reset_settings() { TempMgrGuard temp_mgr_guard; 2661a: ce 01 movw r24, r28 2661c: 01 96 adiw r24, 0x01 ; 1 2661e: 0f 94 69 32 call 0x264d2 ; 0x264d2 thermal_model::data.warn = THERMAL_MODEL_DEF(W); thermal_model::data.err = THERMAL_MODEL_DEF(E); thermal_model::warn_beep = true; thermal_model::enabled = true; thermal_model::reinitialize(); } 26622: 0f 90 pop r0 26624: df 91 pop r29 26626: cf 91 pop r28 26628: 08 95 ret 0002662a : { return thermal_model::enabled; } void thermal_model_set_enabled(bool enabled) { 2662a: 1f 93 push r17 2662c: cf 93 push r28 2662e: df 93 push r29 26630: 1f 92 push r1 26632: cd b7 in r28, 0x3d ; 61 26634: de b7 in r29, 0x3e ; 62 26636: 18 2f mov r17, r24 // set the enabled flag { TempMgrGuard temp_mgr_guard; 26638: ce 01 movw r24, r28 2663a: 01 96 adiw r24, 0x01 ; 1 2663c: 0f 94 76 32 call 0x264ec ; 0x264ec thermal_model::enabled = enabled; 26640: 10 93 1c 05 sts 0x051C, r17 ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> thermal_model::setup(); 26644: 0f 94 e5 2f call 0x25fca ; 0x25fca void thermal_model_set_enabled(bool enabled) { // set the enabled flag { TempMgrGuard temp_mgr_guard; 26648: ce 01 movw r24, r28 2664a: 01 96 adiw r24, 0x01 ; 1 2664c: 0f 94 69 32 call 0x264d2 ; 0x264d2 thermal_model::enabled = enabled; thermal_model::setup(); } // verify that the model has been enabled if(enabled && !thermal_model::enabled) 26650: 11 23 and r17, r17 26652: 41 f0 breq .+16 ; 0x26664 26654: 80 91 1c 05 lds r24, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 26658: 81 11 cpse r24, r1 2665a: 04 c0 rjmp .+8 ; 0x26664 SERIAL_ECHOLNPGM("TM: invalid parameters, cannot enable"); 2665c: 83 ee ldi r24, 0xE3 ; 227 2665e: 9d e9 ldi r25, 0x9D ; 157 26660: 0e 94 13 79 call 0xf226 ; 0xf226 } 26664: 0f 90 pop r0 26666: df 91 pop r29 26668: cf 91 pop r28 2666a: 1f 91 pop r17 2666c: 08 95 ret 0002666e : #endif } // namespace thermal_model static void thermal_model_reset_enabled(bool enabled) { 2666e: 1f 93 push r17 26670: cf 93 push r28 26672: df 93 push r29 26674: 1f 92 push r1 26676: cd b7 in r28, 0x3d ; 61 26678: de b7 in r29, 0x3e ; 62 2667a: 18 2f mov r17, r24 TempMgrGuard temp_mgr_guard; 2667c: ce 01 movw r24, r28 2667e: 01 96 adiw r24, 0x01 ; 1 26680: 0f 94 76 32 call 0x264ec ; 0x264ec thermal_model::enabled = enabled; 26684: 10 93 1c 05 sts 0x051C, r17 ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> } // clear error flags and mark as uninitialized static void reinitialize() { data.flags = 1; // shorcut to reset all error flags 26688: 81 e0 ldi r24, 0x01 ; 1 2668a: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> warning_state.assert = false; // explicitly clear assertions 2668e: e8 e3 ldi r30, 0x38 ; 56 26690: f6 e0 ldi r31, 0x06 ; 6 26692: 80 81 ld r24, Z 26694: 8d 7f andi r24, 0xFD ; 253 26696: 80 83 st Z, r24 } // namespace thermal_model static void thermal_model_reset_enabled(bool enabled) { TempMgrGuard temp_mgr_guard; 26698: ce 01 movw r24, r28 2669a: 01 96 adiw r24, 0x01 ; 1 2669c: 0f 94 69 32 call 0x264d2 ; 0x264d2 thermal_model::enabled = enabled; thermal_model::reinitialize(); } 266a0: 0f 90 pop r0 266a2: df 91 pop r29 266a4: cf 91 pop r28 266a6: 1f 91 pop r17 266a8: 08 95 ret 000266aa : /* 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() { 266aa: cf 93 push r28 266ac: df 93 push r29 266ae: 1f 92 push r1 266b0: cd b7 in r28, 0x3d ; 61 266b2: de b7 in r29, 0x3e ; 62 TempMgrGuard temp_mgr_guard; 266b4: ce 01 movw r24, r28 266b6: 01 96 adiw r24, 0x01 ; 1 266b8: 0f 94 76 32 call 0x264ec ; 0x264ec } static void setCurrentTemperaturesFromIsr() { for(uint8_t e=0;e 266c0: 90 91 17 05 lds r25, 0x0517 ; 0x800517 266c4: a0 91 18 05 lds r26, 0x0518 ; 0x800518 266c8: b0 91 19 05 lds r27, 0x0519 ; 0x800519 266cc: 80 93 af 0d sts 0x0DAF, r24 ; 0x800daf 266d0: 90 93 b0 0d sts 0x0DB0, r25 ; 0x800db0 266d4: a0 93 b1 0d sts 0x0DB1, r26 ; 0x800db1 266d8: b0 93 b2 0d sts 0x0DB2, r27 ; 0x800db2 current_temperature_bed = current_temperature_bed_isr; 266dc: 80 91 18 06 lds r24, 0x0618 ; 0x800618 266e0: 90 91 19 06 lds r25, 0x0619 ; 0x800619 266e4: a0 91 1a 06 lds r26, 0x061A ; 0x80061a 266e8: b0 91 1b 06 lds r27, 0x061B ; 0x80061b 266ec: 80 93 ed 04 sts 0x04ED, r24 ; 0x8004ed 266f0: 90 93 ee 04 sts 0x04EE, r25 ; 0x8004ee 266f4: a0 93 ef 04 sts 0x04EF, r26 ; 0x8004ef 266f8: b0 93 f0 04 sts 0x04F0, r27 ; 0x8004f0 #ifdef PINDA_THERMISTOR current_temperature_pinda = current_temperature_pinda_isr; 266fc: 80 91 02 06 lds r24, 0x0602 ; 0x800602 26700: 90 91 03 06 lds r25, 0x0603 ; 0x800603 26704: a0 91 04 06 lds r26, 0x0604 ; 0x800604 26708: b0 91 05 06 lds r27, 0x0605 ; 0x800605 2670c: 80 93 97 03 sts 0x0397, r24 ; 0x800397 26710: 90 93 98 03 sts 0x0398, r25 ; 0x800398 26714: a0 93 99 03 sts 0x0399, r26 ; 0x800399 26718: b0 93 9a 03 sts 0x039A, r27 ; 0x80039a #endif #ifdef AMBIENT_THERMISTOR current_temperature_ambient = current_temperature_ambient_isr; 2671c: 80 91 1f 06 lds r24, 0x061F ; 0x80061f 26720: 90 91 20 06 lds r25, 0x0620 ; 0x800620 26724: a0 91 21 06 lds r26, 0x0621 ; 0x800621 26728: b0 91 22 06 lds r27, 0x0622 ; 0x800622 2672c: 80 93 55 06 sts 0x0655, r24 ; 0x800655 26730: 90 93 56 06 sts 0x0656, r25 ; 0x800656 26734: a0 93 57 06 sts 0x0657, r26 ; 0x800657 26738: b0 93 58 06 sts 0x0658, r27 ; 0x800658 This function is blocking: check temp_meas_ready before calling! */ static void updateTemperatures() { TempMgrGuard temp_mgr_guard; setCurrentTemperaturesFromIsr(); if(!temp_error_state.v) { 2673c: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 26740: 81 11 cpse r24, r1 26742: 02 c0 rjmp .+4 ; 0x26748 // refuse to update target temperatures in any error condition! setIsrTargetTemperatures(); 26744: 0f 94 6f 14 call 0x228de ; 0x228de } temp_meas_ready = false; 26748: 10 92 01 06 sts 0x0601, r1 ; 0x800601 - 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() { TempMgrGuard temp_mgr_guard; 2674c: ce 01 movw r24, r28 2674e: 01 96 adiw r24, 0x01 ; 1 26750: 0f 94 69 32 call 0x264d2 ; 0x264d2 if(!temp_error_state.v) { // refuse to update target temperatures in any error condition! setIsrTargetTemperatures(); } temp_meas_ready = false; } 26754: 0f 90 pop r0 26756: df 91 pop r29 26758: cf 91 pop r28 2675a: 08 95 ret 0002675c <__vector_14>: #ifdef SYSTEM_TIMER_2 ISR(TIMER2_COMPB_vect) #else //SYSTEM_TIMER_2 ISR(TIMER0_COMPB_vect) #endif //SYSTEM_TIMER_2 { 2675c: 1f 92 push r1 2675e: 0f 92 push r0 26760: 0f b6 in r0, 0x3f ; 63 26762: 0f 92 push r0 26764: 11 24 eor r1, r1 26766: 0b b6 in r0, 0x3b ; 59 26768: 0f 92 push r0 2676a: ff 92 push r15 2676c: 0f 93 push r16 2676e: 1f 93 push r17 26770: 2f 93 push r18 26772: 3f 93 push r19 26774: 4f 93 push r20 26776: 5f 93 push r21 26778: 6f 93 push r22 2677a: 7f 93 push r23 2677c: 8f 93 push r24 2677e: 9f 93 push r25 26780: af 93 push r26 26782: bf 93 push r27 26784: cf 93 push r28 26786: df 93 push r29 26788: ef 93 push r30 2678a: ff 93 push r31 DISABLE_SOFT_PWM_INTERRUPT(); 2678c: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 26790: 8b 7f andi r24, 0xFB ; 251 26792: 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(); 26796: 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) 26798: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 2679c: 86 fd sbrc r24, 6 2679e: c8 c0 rjmp .+400 ; 0x26930 <__vector_14+0x1d4> { //button is pressed if (buttonBlanking.expired_cont(BUTTON_BLANKING_TIME)) { 267a0: 68 ec ldi r22, 0xC8 ; 200 267a2: 70 e0 ldi r23, 0x00 ; 0 267a4: 8e ed ldi r24, 0xDE ; 222 267a6: 95 e0 ldi r25, 0x05 ; 5 267a8: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 267ac: 88 23 and r24, r24 267ae: b9 f0 breq .+46 ; 0x267de <__vector_14+0x82> buttonBlanking.start(); 267b0: 8e ed ldi r24, 0xDE ; 222 267b2: 95 e0 ldi r25, 0x05 ; 5 267b4: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> safetyTimer.start(); 267b8: 89 ed ldi r24, 0xD9 ; 217 267ba: 95 e0 ldi r25, 0x05 ; 5 267bc: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) 267c0: 80 91 d8 05 lds r24, 0x05D8 ; 0x8005d8 267c4: 81 11 cpse r24, r1 267c6: a5 c0 rjmp .+330 ; 0x26912 <__vector_14+0x1b6> 267c8: 80 91 d7 05 lds r24, 0x05D7 ; 0x8005d7 267cc: 81 11 cpse r24, r1 267ce: a1 c0 rjmp .+322 ; 0x26912 <__vector_14+0x1b6> { longPressTimer.start(); 267d0: 84 ed ldi r24, 0xD4 ; 212 267d2: 95 e0 ldi r25, 0x05 ; 5 267d4: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> lcd_button_pressed = 1; 267d8: 81 e0 ldi r24, 0x01 ; 1 267da: 80 93 d8 05 sts 0x05D8, r24 ; 0x8005d8 -2, 1, -1, 0, }; static uint8_t enc_bits_old = 0; uint8_t enc_bits = 0; if (!READ(BTN_EN1)) enc_bits |= _BV(0); 267de: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 267e2: 82 fb bst r24, 2 267e4: 88 27 eor r24, r24 267e6: 80 f9 bld r24, 0 267e8: 91 e0 ldi r25, 0x01 ; 1 267ea: 89 27 eor r24, r25 if (!READ(BTN_EN2)) enc_bits |= _BV(1); 267ec: 90 91 03 01 lds r25, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 267f0: 91 ff sbrs r25, 1 267f2: 82 60 ori r24, 0x02 ; 2 if (enc_bits != enc_bits_old) 267f4: e0 91 d1 05 lds r30, 0x05D1 ; 0x8005d1 267f8: e8 17 cp r30, r24 267fa: e1 f0 breq .+56 ; 0x26834 <__vector_14+0xd8> { int8_t newDiff = pgm_read_byte(&encrot_table[(enc_bits_old << 2) | enc_bits]); 267fc: 24 e0 ldi r18, 0x04 ; 4 267fe: e2 9f mul r30, r18 26800: f0 01 movw r30, r0 26802: 11 24 eor r1, r1 26804: e8 2b or r30, r24 26806: ec 53 subi r30, 0x3C ; 60 26808: f2 46 sbci r31, 0x62 ; 98 2680a: e4 91 lpm r30, Z lcd_encoder_diff += newDiff; 2680c: 90 91 d0 05 lds r25, 0x05D0 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> 26810: e9 0f add r30, r25 26812: e0 93 d0 05 sts 0x05D0, r30 ; 0x8005d0 <_ZL16lcd_encoder_diff.lto_priv.541> if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { 26816: 0e 2e mov r0, r30 26818: 00 0c add r0, r0 2681a: ff 0b sbc r31, r31 2681c: f7 ff sbrs r31, 7 2681e: 03 c0 rjmp .+6 ; 0x26826 <__vector_14+0xca> 26820: f1 95 neg r31 26822: e1 95 neg r30 26824: f1 09 sbc r31, r1 26826: 34 97 sbiw r30, 0x04 ; 4 26828: 1c f0 brlt .+6 ; 0x26830 <__vector_14+0xd4> lcd_backlight_wake_trigger = true; // flag event, knob rotated 2682a: 91 e0 ldi r25, 0x01 ; 1 2682c: 90 93 d2 05 sts 0x05D2, r25 ; 0x8005d2 <_ZL26lcd_backlight_wake_trigger.lto_priv.540> } enc_bits_old = enc_bits; 26830: 80 93 d1 05 sts 0x05D1, r24 ; 0x8005d1 #ifndef SLOW_PWM_HEATERS /* * standard PWM modulation */ if (pwm_count == 0) 26834: 80 91 a4 02 lds r24, 0x02A4 ; 0x8002a4 26838: 81 11 cpse r24, r1 2683a: 08 c0 rjmp .+16 ; 0x2684c <__vector_14+0xf0> { soft_pwm_0 = soft_pwm[0]; 2683c: 80 91 15 05 lds r24, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 26840: 80 93 e7 05 sts 0x05E7, r24 ; 0x8005e7 if(soft_pwm_0 > 0) 26844: 88 23 and r24, r24 26846: 09 f4 brne .+2 ; 0x2684a <__vector_14+0xee> 26848: 87 c0 rjmp .+270 ; 0x26958 <__vector_14+0x1fc> { WRITE(HEATER_0_PIN,1); 2684a: 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) 2684c: 80 91 a4 02 lds r24, 0x02A4 ; 0x8002a4 26850: 8f 70 andi r24, 0x0F ; 15 26852: a9 f4 brne .+42 ; 0x2687e <__vector_14+0x122> { soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS)); 26854: 80 91 a5 04 lds r24, 0x04A5 ; 0x8004a5 26858: 90 e0 ldi r25, 0x00 ; 0 2685a: 24 e0 ldi r18, 0x04 ; 4 2685c: 95 95 asr r25 2685e: 87 95 ror r24 26860: 2a 95 dec r18 26862: e1 f7 brne .-8 ; 0x2685c <__vector_14+0x100> 26864: 80 93 a4 04 sts 0x04A4, r24 ; 0x8004a4 <_ZL12soft_pwm_fan.lto_priv.462> if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); 26868: 89 2b or r24, r25 2686a: 09 f4 brne .+2 ; 0x2686e <__vector_14+0x112> 2686c: 77 c0 rjmp .+238 ; 0x2695c <__vector_14+0x200> 2686e: 9f b7 in r25, 0x3f ; 63 26870: f8 94 cli 26872: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 26876: 88 60 ori r24, 0x08 ; 8 26878: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2687c: 9f bf out 0x3f, r25 ; 63 } #endif if(soft_pwm_0 < pwm_count) 2687e: 90 91 e7 05 lds r25, 0x05E7 ; 0x8005e7 26882: 80 91 a4 02 lds r24, 0x02A4 ; 0x8002a4 26886: 98 17 cp r25, r24 26888: 08 f4 brcc .+2 ; 0x2688c <__vector_14+0x130> { WRITE(HEATER_0_PIN,0); 2688a: 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); 2688c: 80 91 a4 02 lds r24, 0x02A4 ; 0x8002a4 26890: 8f 70 andi r24, 0x0F ; 15 26892: 90 91 a4 04 lds r25, 0x04A4 ; 0x8004a4 <_ZL12soft_pwm_fan.lto_priv.462> 26896: 98 17 cp r25, r24 26898: 40 f4 brcc .+16 ; 0x268aa <__vector_14+0x14e> 2689a: 9f b7 in r25, 0x3f ; 63 2689c: f8 94 cli 2689e: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 268a2: 87 7f andi r24, 0xF7 ; 247 268a4: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 268a8: 9f bf out 0x3f, r25 ; 63 #endif pwm_count += (1 << SOFT_PWM_SCALE); 268aa: 80 91 a4 02 lds r24, 0x02A4 ; 0x8002a4 268ae: 8f 5f subi r24, 0xFF ; 255 pwm_count &= 0x7f; 268b0: 8f 77 andi r24, 0x7F ; 127 268b2: 80 93 a4 02 sts 0x02A4, r24 ; 0x8002a4 268b6: 10 e0 ldi r17, 0x00 ; 0 268b8: 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 268ba: e8 01 movw r28, r16 268bc: cc 0f add r28, r28 268be: dd 1f adc r29, r29 268c0: c8 59 subi r28, 0x98 ; 152 268c2: d9 4f sbci r29, 0xF9 ; 249 268c4: 88 81 ld r24, Y 268c6: 99 81 ldd r25, Y+1 ; 0x01 if(curTodo>0) 268c8: 18 16 cp r1, r24 268ca: 19 06 cpc r1, r25 268cc: 0c f0 brlt .+2 ; 0x268d0 <__vector_14+0x174> 268ce: 4c c0 rjmp .+152 ; 0x26968 <__vector_14+0x20c> { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 268d0: ff b6 in r15, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 268d2: f8 94 cli babystep(axis,/*fwd*/true); 268d4: 61 e0 ldi r22, 0x01 ; 1 268d6: 80 2f mov r24, r16 268d8: 0f 94 80 14 call 0x22900 ; 0x22900 babystepsTodo[axis]--; //less to do next time 268dc: 88 81 ld r24, Y 268de: 99 81 ldd r25, Y+1 ; 0x01 268e0: 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 268e2: 99 83 std Y+1, r25 ; 0x01 268e4: 88 83 st Y, r24 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 268e6: ff be out 0x3f, r15 ; 63 __asm__ volatile ("" ::: "memory"); 268e8: 0f 5f subi r16, 0xFF ; 255 268ea: 1f 4f sbci r17, 0xFF ; 255 } #endif #ifdef BABYSTEPPING FORCE_INLINE static void applyBabysteps() { for(uint8_t axis=0;axis<3;axis++) 268ec: 03 30 cpi r16, 0x03 ; 3 268ee: 11 05 cpc r17, r1 268f0: 21 f7 brne .-56 ; 0x268ba <__vector_14+0x15e> #ifdef BABYSTEPPING applyBabysteps(); #endif //BABYSTEPPING // Check if a stack overflow happened if (!SdFatUtil::test_stack_integrity()) stack_error(); 268f2: 80 91 3f 18 lds r24, 0x183F ; 0x80183f <__bss_end+0x20> 268f6: 90 91 40 18 lds r25, 0x1840 ; 0x801840 <__bss_end+0x21> 268fa: a0 91 41 18 lds r26, 0x1841 ; 0x801841 <__bss_end+0x22> 268fe: b0 91 42 18 lds r27, 0x1842 ; 0x801842 <__bss_end+0x23> 26902: 82 3a cpi r24, 0xA2 ; 162 26904: 92 4a sbci r25, 0xA2 ; 162 26906: a1 05 cpc r26, r1 26908: b1 05 cpc r27, r1 2690a: d9 f1 breq .+118 ; 0x26982 <__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); 2690c: 81 e0 ldi r24, 0x01 ; 1 2690e: 0e 94 f0 66 call 0xcde0 ; 0xcde0 if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0)) { longPressTimer.start(); lcd_button_pressed = 1; } else if (longPressTimer.expired(LONG_PRESS_TIME)) 26912: 68 ee ldi r22, 0xE8 ; 232 26914: 73 e0 ldi r23, 0x03 ; 3 26916: 84 ed ldi r24, 0xD4 ; 212 26918: 95 e0 ldi r25, 0x05 ; 5 2691a: 0f 94 5a 2a call 0x254b4 ; 0x254b4 ::expired(unsigned short)> 2691e: 88 23 and r24, r24 26920: 09 f4 brne .+2 ; 0x26924 <__vector_14+0x1c8> 26922: 5d cf rjmp .-326 ; 0x267de <__vector_14+0x82> { lcd_long_press_active = 1; 26924: 81 e0 ldi r24, 0x01 ; 1 26926: 80 93 d7 05 sts 0x05D7, r24 ; 0x8005d7 lcd_longpress_trigger = 1; 2692a: 80 93 d3 05 sts 0x05D3, r24 ; 0x8005d3 2692e: 57 cf rjmp .-338 ; 0x267de <__vector_14+0x82> } } } else { //button not pressed if (lcd_button_pressed) 26930: 80 91 d8 05 lds r24, 0x05D8 ; 0x8005d8 26934: 88 23 and r24, r24 26936: 09 f4 brne .+2 ; 0x2693a <__vector_14+0x1de> 26938: 52 cf rjmp .-348 ; 0x267de <__vector_14+0x82> { //button was released lcd_button_pressed = 0; // Reset to prevent double triggering 2693a: 10 92 d8 05 sts 0x05D8, r1 ; 0x8005d8 if (!lcd_long_press_active) 2693e: 80 91 d7 05 lds r24, 0x05D7 ; 0x8005d7 26942: 81 11 cpse r24, r1 26944: 03 c0 rjmp .+6 ; 0x2694c <__vector_14+0x1f0> { //button released before long press gets activated lcd_click_trigger = 1; // This flag is reset when the event is consumed 26946: 81 e0 ldi r24, 0x01 ; 1 26948: 80 93 a6 03 sts 0x03A6, r24 ; 0x8003a6 } lcd_backlight_wake_trigger = true; // flag event, knob pressed 2694c: 81 e0 ldi r24, 0x01 ; 1 2694e: 80 93 d2 05 sts 0x05D2, r24 ; 0x8005d2 <_ZL26lcd_backlight_wake_trigger.lto_priv.540> lcd_long_press_active = 0; 26952: 10 92 d7 05 sts 0x05D7, r1 ; 0x8005d7 26956: 43 cf rjmp .-378 ; 0x267de <__vector_14+0x82> { WRITE(HEATER_0_PIN,1); #ifdef HEATERS_PARALLEL WRITE(HEATER_1_PIN,1); #endif } else WRITE(HEATER_0_PIN,0); 26958: 75 98 cbi 0x0e, 5 ; 14 2695a: 78 cf rjmp .-272 ; 0x2684c <__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); 2695c: 9f b7 in r25, 0x3f ; 63 2695e: f8 94 cli 26960: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 26964: 87 7f andi r24, 0xF7 ; 247 26966: 88 cf rjmp .-240 ; 0x26878 <__vector_14+0x11c> babystep(axis,/*fwd*/true); babystepsTodo[axis]--; //less to do next time } } else if(curTodo<0) 26968: 89 2b or r24, r25 2696a: 09 f4 brne .+2 ; 0x2696e <__vector_14+0x212> 2696c: bd cf rjmp .-134 ; 0x268e8 <__vector_14+0x18c> { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 2696e: ff b6 in r15, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 26970: f8 94 cli babystep(axis,/*fwd*/false); 26972: 60 e0 ldi r22, 0x00 ; 0 26974: 80 2f mov r24, r16 26976: 0f 94 80 14 call 0x22900 ; 0x22900 babystepsTodo[axis]++; //less to do next time 2697a: 88 81 ld r24, Y 2697c: 99 81 ldd r25, Y+1 ; 0x01 2697e: 01 96 adiw r24, 0x01 ; 1 26980: b0 cf rjmp .-160 ; 0x268e2 <__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]) { 26982: 9c b1 in r25, 0x0c ; 12 26984: 80 91 e5 05 lds r24, 0x05E5 ; 0x8005e5 26988: 96 fb bst r25, 6 2698a: 99 27 eor r25, r25 2698c: 90 f9 bld r25, 0 2698e: 98 17 cp r25, r24 26990: 91 f0 breq .+36 ; 0x269b6 <__vector_14+0x25a> if(fan_measuring) fan_edge_counter[0] ++; 26992: 90 91 6e 06 lds r25, 0x066E ; 0x80066e 26996: 99 23 and r25, r25 26998: 51 f0 breq .+20 ; 0x269ae <__vector_14+0x252> 2699a: 20 91 e1 05 lds r18, 0x05E1 ; 0x8005e1 2699e: 30 91 e2 05 lds r19, 0x05E2 ; 0x8005e2 269a2: 2f 5f subi r18, 0xFF ; 255 269a4: 3f 4f sbci r19, 0xFF ; 255 269a6: 30 93 e2 05 sts 0x05E2, r19 ; 0x8005e2 269aa: 20 93 e1 05 sts 0x05E1, r18 ; 0x8005e1 fan_state[0] = !fan_state[0]; 269ae: 91 e0 ldi r25, 0x01 ; 1 269b0: 89 27 eor r24, r25 269b2: 80 93 e5 05 sts 0x05E5, r24 ; 0x8005e5 (void)__s; } static __inline__ void __iCliParam(const uint8_t *__s) { cli(); 269b6: f8 94 cli { DISABLE_SOFT_PWM_INTERRUPT(); NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) { soft_pwm_isr(); } ENABLE_SOFT_PWM_INTERRUPT(); 269b8: 80 91 70 00 lds r24, 0x0070 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> 269bc: 84 60 ori r24, 0x04 ; 4 269be: 80 93 70 00 sts 0x0070, r24 ; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070> } 269c2: ff 91 pop r31 269c4: ef 91 pop r30 269c6: df 91 pop r29 269c8: cf 91 pop r28 269ca: bf 91 pop r27 269cc: af 91 pop r26 269ce: 9f 91 pop r25 269d0: 8f 91 pop r24 269d2: 7f 91 pop r23 269d4: 6f 91 pop r22 269d6: 5f 91 pop r21 269d8: 4f 91 pop r20 269da: 3f 91 pop r19 269dc: 2f 91 pop r18 269de: 1f 91 pop r17 269e0: 0f 91 pop r16 269e2: ff 90 pop r15 269e4: 0f 90 pop r0 269e6: 0b be out 0x3b, r0 ; 59 269e8: 0f 90 pop r0 269ea: 0f be out 0x3f, r0 ; 63 269ec: 0f 90 pop r0 269ee: 1f 90 pop r1 269f0: 18 95 reti 000269f2 : #endif } #ifdef AMBIENT_THERMISTOR static float analog2tempAmbient(int raw) { 269f2: 4f 92 push r4 269f4: 5f 92 push r5 269f6: 6f 92 push r6 269f8: 7f 92 push r7 269fa: af 92 push r10 269fc: bf 92 push r11 269fe: cf 92 push r12 26a00: df 92 push r13 26a02: ef 92 push r14 26a04: ff 92 push r15 26a06: 0f 93 push r16 26a08: 1f 93 push r17 26a0a: cf 93 push r28 26a0c: df 93 push r29 26a0e: 24 e0 ldi r18, 0x04 ; 4 26a10: 30 e0 ldi r19, 0x00 ; 0 26a12: 41 e0 ldi r20, 0x01 ; 1 26a14: 50 e0 ldi r21, 0x00 ; 0 26a16: d9 01 movw r26, r18 26a18: aa 5a subi r26, 0xAA ; 170 26a1a: b3 46 sbci r27, 0x63 ; 99 float celsius = 0; byte i; for (i=1; i raw) 26a1c: fd 01 movw r30, r26 26a1e: 65 91 lpm r22, Z+ 26a20: 74 91 lpm r23, Z 26a22: 86 17 cp r24, r22 26a24: 97 07 cpc r25, r23 26a26: 0c f0 brlt .+2 ; 0x26a2a 26a28: 66 c0 rjmp .+204 ; 0x26af6 { celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]) + 26a2a: 41 50 subi r20, 0x01 ; 1 26a2c: 51 09 sbc r21, r1 26a2e: 44 0f add r20, r20 26a30: 55 1f adc r21, r21 26a32: 44 0f add r20, r20 26a34: 55 1f adc r21, r21 26a36: ea 01 movw r28, r20 26a38: c8 5a subi r28, 0xA8 ; 168 26a3a: d3 46 sbci r29, 0x63 ; 99 26a3c: fe 01 movw r30, r28 26a3e: 05 91 lpm r16, Z+ 26a40: 14 91 lpm r17, Z (raw - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])) * 26a42: 4a 5a subi r20, 0xAA ; 170 26a44: 53 46 sbci r21, 0x63 ; 99 26a46: fa 01 movw r30, r20 26a48: 65 91 lpm r22, Z+ 26a4a: 74 91 lpm r23, Z (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][1]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][1])) / 26a4c: f9 01 movw r30, r18 26a4e: e8 5a subi r30, 0xA8 ; 168 26a50: f3 46 sbci r31, 0x63 ; 99 26a52: e5 90 lpm r14, Z+ 26a54: f4 90 lpm r15, Z 26a56: fe 01 movw r30, r28 26a58: c5 90 lpm r12, Z+ 26a5a: d4 90 lpm r13, Z (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][0]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])); 26a5c: fd 01 movw r30, r26 26a5e: c5 91 lpm r28, Z+ 26a60: d4 91 lpm r29, Z 26a62: fa 01 movw r30, r20 26a64: a5 90 lpm r10, Z+ 26a66: b4 90 lpm r11, Z for (i=1; i raw) { celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])) * 26a68: 86 1b sub r24, r22 26a6a: 97 0b sbc r25, r23 26a6c: bc 01 movw r22, r24 26a6e: 99 0f add r25, r25 26a70: 88 0b sbc r24, r24 26a72: 99 0b sbc r25, r25 26a74: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26a78: 2b 01 movw r4, r22 26a7a: 3c 01 movw r6, r24 (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][1]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][1])) / 26a7c: b7 01 movw r22, r14 26a7e: 6c 19 sub r22, r12 26a80: 7d 09 sbc r23, r13 26a82: 07 2e mov r0, r23 26a84: 00 0c add r0, r0 26a86: 88 0b sbc r24, r24 26a88: 99 0b sbc r25, r25 26a8a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26a8e: 9b 01 movw r18, r22 26a90: ac 01 movw r20, r24 for (i=1; i raw) { celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])) * 26a92: c3 01 movw r24, r6 26a94: b2 01 movw r22, r4 26a96: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 26a9a: 6b 01 movw r12, r22 26a9c: 7c 01 movw r14, r24 (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][1]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][1])) / (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][0]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])); 26a9e: be 01 movw r22, r28 26aa0: 6a 19 sub r22, r10 26aa2: 7b 09 sbc r23, r11 26aa4: 07 2e mov r0, r23 26aa6: 00 0c add r0, r0 26aa8: 88 0b sbc r24, r24 26aaa: 99 0b sbc r25, r25 26aac: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26ab0: 9b 01 movw r18, r22 26ab2: ac 01 movw r20, r24 { if (PGM_RD_W(AMBIENTTEMPTABLE[i][0]) > raw) { celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]) + (raw - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])) * (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][1]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][1])) / 26ab4: c7 01 movw r24, r14 26ab6: b6 01 movw r22, r12 26ab8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 26abc: 6b 01 movw r12, r22 26abe: 7c 01 movw r14, r24 for (i=1; i raw) { celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]) + 26ac0: b8 01 movw r22, r16 26ac2: 11 0f add r17, r17 26ac4: 88 0b sbc r24, r24 26ac6: 99 0b sbc r25, r25 26ac8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26acc: 9b 01 movw r18, r22 26ace: ac 01 movw r20, r24 26ad0: c7 01 movw r24, r14 26ad2: b6 01 movw r22, r12 26ad4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> } } // Overflow: Set to last value in the table if (i == AMBIENTTEMPTABLE_LEN) celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]); return celsius; } 26ad8: df 91 pop r29 26ada: cf 91 pop r28 26adc: 1f 91 pop r17 26ade: 0f 91 pop r16 26ae0: ff 90 pop r15 26ae2: ef 90 pop r14 26ae4: df 90 pop r13 26ae6: cf 90 pop r12 26ae8: bf 90 pop r11 26aea: af 90 pop r10 26aec: 7f 90 pop r7 26aee: 6f 90 pop r6 26af0: 5f 90 pop r5 26af2: 4f 90 pop r4 26af4: 08 95 ret 26af6: 4f 5f subi r20, 0xFF ; 255 26af8: 5f 4f sbci r21, 0xFF ; 255 26afa: 2c 5f subi r18, 0xFC ; 252 26afc: 3f 4f sbci r19, 0xFF ; 255 static float analog2tempAmbient(int raw) { float celsius = 0; byte i; for (i=1; i 26b04: 88 cf rjmp .-240 ; 0x26a16 (float)(PGM_RD_W(AMBIENTTEMPTABLE[i][0]) - PGM_RD_W(AMBIENTTEMPTABLE[i-1][0])); break; } } // Overflow: Set to last value in the table if (i == AMBIENTTEMPTABLE_LEN) celsius = PGM_RD_W(AMBIENTTEMPTABLE[i-1][1]); 26b06: ec ed ldi r30, 0xDC ; 220 26b08: fc e9 ldi r31, 0x9C ; 156 26b0a: 65 91 lpm r22, Z+ 26b0c: 74 91 lpm r23, Z 26b0e: 07 2e mov r0, r23 26b10: 00 0c add r0, r0 26b12: 88 0b sbc r24, r24 26b14: 99 0b sbc r25, r25 26b16: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26b1a: de cf rjmp .-68 ; 0x26ad8 00026b1c : 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) { 26b1c: 4f 92 push r4 26b1e: 5f 92 push r5 26b20: 6f 92 push r6 26b22: 7f 92 push r7 26b24: af 92 push r10 26b26: bf 92 push r11 26b28: cf 92 push r12 26b2a: df 92 push r13 26b2c: ef 92 push r14 26b2e: ff 92 push r15 26b30: 0f 93 push r16 26b32: 1f 93 push r17 26b34: cf 93 push r28 26b36: df 93 push r29 26b38: 24 e0 ldi r18, 0x04 ; 4 26b3a: 30 e0 ldi r19, 0x00 ; 0 26b3c: 41 e0 ldi r20, 0x01 ; 1 26b3e: 50 e0 ldi r21, 0x00 ; 0 26b40: d9 01 movw r26, r18 26b42: ae 59 subi r26, 0x9E ; 158 26b44: b4 46 sbci r27, 0x64 ; 100 float celsius = 0; byte i; for (i=1; i raw) 26b46: fd 01 movw r30, r26 26b48: 65 91 lpm r22, Z+ 26b4a: 74 91 lpm r23, Z 26b4c: 86 17 cp r24, r22 26b4e: 97 07 cpc r25, r23 26b50: 0c f0 brlt .+2 ; 0x26b54 26b52: 80 c0 rjmp .+256 ; 0x26c54 { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + 26b54: 41 50 subi r20, 0x01 ; 1 26b56: 51 09 sbc r21, r1 26b58: 44 0f add r20, r20 26b5a: 55 1f adc r21, r21 26b5c: 44 0f add r20, r20 26b5e: 55 1f adc r21, r21 26b60: 8a 01 movw r16, r20 26b62: 0c 59 subi r16, 0x9C ; 156 26b64: 14 46 sbci r17, 0x64 ; 100 26b66: f8 01 movw r30, r16 26b68: c5 90 lpm r12, Z+ 26b6a: d4 90 lpm r13, Z (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) * 26b6c: 4e 59 subi r20, 0x9E ; 158 26b6e: 54 46 sbci r21, 0x64 ; 100 26b70: fa 01 movw r30, r20 26b72: 65 91 lpm r22, Z+ 26b74: 74 91 lpm r23, Z (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / 26b76: f9 01 movw r30, r18 26b78: ec 59 subi r30, 0x9C ; 156 26b7a: f4 46 sbci r31, 0x64 ; 100 26b7c: c5 91 lpm r28, Z+ 26b7e: d4 91 lpm r29, Z 26b80: f8 01 movw r30, r16 26b82: 05 91 lpm r16, Z+ 26b84: 14 91 lpm r17, Z (float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0])); 26b86: fd 01 movw r30, r26 26b88: e5 90 lpm r14, Z+ 26b8a: f4 90 lpm r15, Z 26b8c: fa 01 movw r30, r20 26b8e: a5 90 lpm r10, Z+ 26b90: 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])) * 26b92: 86 1b sub r24, r22 26b94: 97 0b sbc r25, r23 26b96: bc 01 movw r22, r24 26b98: 99 0f add r25, r25 26b9a: 88 0b sbc r24, r24 26b9c: 99 0b sbc r25, r25 26b9e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26ba2: 2b 01 movw r4, r22 26ba4: 3c 01 movw r6, r24 (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) / 26ba6: be 01 movw r22, r28 26ba8: 60 1b sub r22, r16 26baa: 71 0b sbc r23, r17 26bac: 07 2e mov r0, r23 26bae: 00 0c add r0, r0 26bb0: 88 0b sbc r24, r24 26bb2: 99 0b sbc r25, r25 26bb4: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26bb8: 9b 01 movw r18, r22 26bba: 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])) * 26bbc: c3 01 movw r24, r6 26bbe: b2 01 movw r22, r4 26bc0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 26bc4: 2b 01 movw r4, r22 26bc6: 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])); 26bc8: b7 01 movw r22, r14 26bca: 6a 19 sub r22, r10 26bcc: 7b 09 sbc r23, r11 26bce: 07 2e mov r0, r23 26bd0: 00 0c add r0, r0 26bd2: 88 0b sbc r24, r24 26bd4: 99 0b sbc r25, r25 26bd6: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26bda: 9b 01 movw r18, r22 26bdc: 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])) / 26bde: c3 01 movw r24, r6 26be0: b2 01 movw r22, r4 26be2: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 26be6: 2b 01 movw r4, r22 26be8: 3c 01 movw r6, r24 for (i=1; i raw) { celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) + 26bea: b6 01 movw r22, r12 26bec: dd 0c add r13, r13 26bee: 88 0b sbc r24, r24 26bf0: 99 0b sbc r25, r25 26bf2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26bf6: 9b 01 movw r18, r22 26bf8: ac 01 movw r20, r24 26bfa: c3 01 movw r24, r6 26bfc: b2 01 movw r22, r4 26bfe: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> break; } } // Overflow: Set to last value in the table if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]); 26c02: 6b 01 movw r12, r22 26c04: 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) 26c06: 20 e0 ldi r18, 0x00 ; 0 26c08: 30 e0 ldi r19, 0x00 ; 0 26c0a: 40 e2 ldi r20, 0x20 ; 32 26c0c: 52 e4 ldi r21, 0x42 ; 66 26c0e: c7 01 movw r24, r14 26c10: b6 01 movw r22, r12 26c12: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26c16: 87 fd sbrc r24, 7 26c18: 30 c0 rjmp .+96 ; 0x26c7a 26c1a: 20 e0 ldi r18, 0x00 ; 0 26c1c: 30 e0 ldi r19, 0x00 ; 0 26c1e: 48 e4 ldi r20, 0x48 ; 72 26c20: 52 e4 ldi r21, 0x42 ; 66 26c22: c7 01 movw r24, r14 26c24: b6 01 movw r22, r12 26c26: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 26c2a: 18 16 cp r1, r24 26c2c: 34 f1 brlt .+76 ; 0x26c7a { celsius = celsius + (_first_koef * (celsius - _offset_start)); 26c2e: 20 e0 ldi r18, 0x00 ; 0 26c30: 30 e0 ldi r19, 0x00 ; 0 26c32: 40 e2 ldi r20, 0x20 ; 32 26c34: 52 e4 ldi r21, 0x42 ; 66 26c36: c7 01 movw r24, r14 26c38: b6 01 movw r22, r12 26c3a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 26c3e: 20 e0 ldi r18, 0x00 ; 0 26c40: 30 e0 ldi r19, 0x00 ; 0 26c42: 40 e0 ldi r20, 0x00 ; 0 26c44: 5f e3 ldi r21, 0x3F ; 63 26c46: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 26c4a: 9b 01 movw r18, r22 26c4c: 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; 26c4e: c7 01 movw r24, r14 26c50: b6 01 movw r22, r12 26c52: 43 c0 rjmp .+134 ; 0x26cda 26c54: 4f 5f subi r20, 0xFF ; 255 26c56: 5f 4f sbci r21, 0xFF ; 255 26c58: 2c 5f subi r18, 0xFC ; 252 26c5a: 3f 4f sbci r19, 0xFF ; 255 static float analog2tempBed(int raw) { #ifdef BED_USES_THERMISTOR float celsius = 0; byte i; for (i=1; i 26c62: 6e cf rjmp .-292 ; 0x26b40 break; } } // Overflow: Set to last value in the table if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]); 26c64: e4 e5 ldi r30, 0x54 ; 84 26c66: fc e9 ldi r31, 0x9C ; 156 26c68: 65 91 lpm r22, Z+ 26c6a: 74 91 lpm r23, Z 26c6c: 07 2e mov r0, r23 26c6e: 00 0c add r0, r0 26c70: 88 0b sbc r24, r24 26c72: 99 0b sbc r25, r25 26c74: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26c78: c4 cf rjmp .-120 ; 0x26c02 if (celsius >= _offset_start && celsius <= _offset_center) { celsius = celsius + (_first_koef * (celsius - _offset_start)); } else if (celsius > _offset_center && celsius <= 100) 26c7a: 20 e0 ldi r18, 0x00 ; 0 26c7c: 30 e0 ldi r19, 0x00 ; 0 26c7e: 48 e4 ldi r20, 0x48 ; 72 26c80: 52 e4 ldi r21, 0x42 ; 66 26c82: c7 01 movw r24, r14 26c84: b6 01 movw r22, r12 26c86: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26c8a: 18 16 cp r1, r24 26c8c: dc f5 brge .+118 ; 0x26d04 26c8e: 20 e0 ldi r18, 0x00 ; 0 26c90: 30 e0 ldi r19, 0x00 ; 0 26c92: 48 ec ldi r20, 0xC8 ; 200 26c94: 52 e4 ldi r21, 0x42 ; 66 26c96: c7 01 movw r24, r14 26c98: b6 01 movw r22, r12 26c9a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 26c9e: 18 16 cp r1, r24 26ca0: 8c f1 brlt .+98 ; 0x26d04 { celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ; 26ca2: 20 e0 ldi r18, 0x00 ; 0 26ca4: 30 e0 ldi r19, 0x00 ; 0 26ca6: 40 ea ldi r20, 0xA0 ; 160 26ca8: 50 e4 ldi r21, 0x40 ; 64 26caa: c7 01 movw r24, r14 26cac: b6 01 movw r22, r12 26cae: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 26cb2: 2b 01 movw r4, r22 26cb4: 3c 01 movw r6, r24 26cb6: 20 e0 ldi r18, 0x00 ; 0 26cb8: 30 e0 ldi r19, 0x00 ; 0 26cba: 48 e4 ldi r20, 0x48 ; 72 26cbc: 52 e4 ldi r21, 0x42 ; 66 26cbe: c7 01 movw r24, r14 26cc0: b6 01 movw r22, r12 26cc2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 26cc6: 2d ec ldi r18, 0xCD ; 205 26cc8: 3c ec ldi r19, 0xCC ; 204 26cca: 4c ec ldi r20, 0xCC ; 204 26ccc: 5d e3 ldi r21, 0x3D ; 61 26cce: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 26cd2: 9b 01 movw r18, r22 26cd4: ac 01 movw r20, r24 26cd6: c3 01 movw r24, r6 26cd8: b2 01 movw r22, r4 } else if (celsius > 100) { celsius = celsius + _offset; 26cda: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 26cde: 6b 01 movw r12, r22 26ce0: 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 } 26ce2: c7 01 movw r24, r14 26ce4: b6 01 movw r22, r12 26ce6: df 91 pop r29 26ce8: cf 91 pop r28 26cea: 1f 91 pop r17 26cec: 0f 91 pop r16 26cee: ff 90 pop r15 26cf0: ef 90 pop r14 26cf2: df 90 pop r13 26cf4: cf 90 pop r12 26cf6: bf 90 pop r11 26cf8: af 90 pop r10 26cfa: 7f 90 pop r7 26cfc: 6f 90 pop r6 26cfe: 5f 90 pop r5 26d00: 4f 90 pop r4 26d02: 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) 26d04: 20 e0 ldi r18, 0x00 ; 0 26d06: 30 e0 ldi r19, 0x00 ; 0 26d08: 48 ec ldi r20, 0xC8 ; 200 26d0a: 52 e4 ldi r21, 0x42 ; 66 26d0c: c7 01 movw r24, r14 26d0e: b6 01 movw r22, r12 26d10: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26d14: 18 16 cp r1, r24 26d16: 2c f7 brge .-54 ; 0x26ce2 { celsius = celsius + _offset; 26d18: 20 e0 ldi r18, 0x00 ; 0 26d1a: 30 e0 ldi r19, 0x00 ; 0 26d1c: 40 e2 ldi r20, 0x20 ; 32 26d1e: 51 e4 ldi r21, 0x41 ; 65 26d20: 96 cf rjmp .-212 ; 0x26c4e 00026d22 : } static void check_temp_raw(); static void temp_mgr_isr() { 26d22: 4f 92 push r4 26d24: 5f 92 push r5 26d26: 6f 92 push r6 26d28: 7f 92 push r7 26d2a: af 92 push r10 26d2c: cf 92 push r12 26d2e: df 92 push r13 26d30: ef 92 push r14 26d32: ff 92 push r15 26d34: 0f 93 push r16 26d36: 1f 93 push r17 26d38: cf 93 push r28 26d3a: df 93 push r29 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 26d40: 90 91 0b 06 lds r25, 0x060B ; 0x80060b 26d44: 0f 94 10 a1 call 0x34220 ; 0x34220 26d48: 60 93 16 05 sts 0x0516, r22 ; 0x800516 26d4c: 70 93 17 05 sts 0x0517, r23 ; 0x800517 26d50: 80 93 18 05 sts 0x0518, r24 ; 0x800518 26d54: 90 93 19 05 sts 0x0519, r25 ; 0x800519 current_temperature_bed_isr = analog2tempBed(current_temperature_bed_raw); 26d58: 60 90 08 06 lds r6, 0x0608 ; 0x800608 26d5c: 70 90 09 06 lds r7, 0x0609 ; 0x800609 26d60: c3 01 movw r24, r6 26d62: 0f 94 8e 35 call 0x26b1c ; 0x26b1c 26d66: 6b 01 movw r12, r22 26d68: 7c 01 movw r14, r24 26d6a: c0 92 18 06 sts 0x0618, r12 ; 0x800618 26d6e: d0 92 19 06 sts 0x0619, r13 ; 0x800619 26d72: e0 92 1a 06 sts 0x061A, r14 ; 0x80061a 26d76: f0 92 1b 06 sts 0x061B, r15 ; 0x80061b #ifdef PINDA_THERMISTOR current_temperature_pinda_isr = analog2tempBed(current_temperature_raw_pinda); 26d7a: 80 91 06 06 lds r24, 0x0606 ; 0x800606 26d7e: 90 91 07 06 lds r25, 0x0607 ; 0x800607 26d82: 0f 94 8e 35 call 0x26b1c ; 0x26b1c 26d86: 60 93 02 06 sts 0x0602, r22 ; 0x800602 26d8a: 70 93 03 06 sts 0x0603, r23 ; 0x800603 26d8e: 80 93 04 06 sts 0x0604, r24 ; 0x800604 26d92: 90 93 05 06 sts 0x0605, r25 ; 0x800605 #endif #ifdef AMBIENT_THERMISTOR current_temperature_ambient_isr = analog2tempAmbient(current_temperature_raw_ambient); //thermistor for ambient is NTCG104LH104JT1 (2000) 26d96: c0 91 14 06 lds r28, 0x0614 ; 0x800614 26d9a: d0 91 15 06 lds r29, 0x0615 ; 0x800615 26d9e: ce 01 movw r24, r28 26da0: 0f 94 f9 34 call 0x269f2 ; 0x269f2 26da4: 60 93 1f 06 sts 0x061F, r22 ; 0x80061f 26da8: 70 93 20 06 sts 0x0620, r23 ; 0x800620 26dac: 80 93 21 06 sts 0x0621, r24 ; 0x800621 26db0: 90 93 22 06 sts 0x0622, r25 ; 0x800622 #endif temp_meas_ready = true; 26db4: 81 e0 ldi r24, 0x01 ; 1 26db6: 80 93 01 06 sts 0x0601, r24 ; 0x800601 { // update *_isr temperatures from raw values for PID regulation setIsrTemperaturesFromRawValues(); // clear the error assertion flag before checking again temp_error_state.assert = false; 26dba: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 26dbe: 8d 7f andi r24, 0xFD ; 253 26dc0: 80 93 1a 05 sts 0x051A, r24 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 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]) { 26dc4: 20 91 0a 06 lds r18, 0x060A ; 0x80060a 26dc8: 30 91 0b 06 lds r19, 0x060B ; 0x80060b 26dcc: 80 91 a0 04 lds r24, 0x04A0 ; 0x8004a0 <_ZL12maxttemp_raw.lto_priv.465> 26dd0: 90 91 a1 04 lds r25, 0x04A1 ; 0x8004a1 <_ZL12maxttemp_raw.lto_priv.465+0x1> 26dd4: 82 17 cp r24, r18 26dd6: 93 07 cpc r25, r19 26dd8: 2c f0 brlt .+10 ; 0x26de4 #else if (current_temperature_raw[0] >= maxttemp_raw[0]) { #endif set_temp_error(TempErrorSource::hotend, 0, TempErrorType::max); 26dda: 40 e0 ldi r20, 0x00 ; 0 26ddc: 60 e0 ldi r22, 0x00 ; 0 26dde: 80 e0 ldi r24, 0x00 ; 0 26de0: 0f 94 0f 30 call 0x2601e ; 0x2601e } //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) { 26de4: 80 91 9e 04 lds r24, 0x049E ; 0x80049e <_ZL16bed_maxttemp_raw.lto_priv.466> 26de8: 90 91 9f 04 lds r25, 0x049F ; 0x80049f <_ZL16bed_maxttemp_raw.lto_priv.466+0x1> 26dec: 86 15 cp r24, r6 26dee: 97 05 cpc r25, r7 26df0: 2c f0 brlt .+10 ; 0x26dfc #else if (current_temperature_bed_raw >= bed_maxttemp_raw) { #endif set_temp_error(TempErrorSource::bed, 0, TempErrorType::max); 26df2: 40 e0 ldi r20, 0x00 ; 0 26df4: 60 e0 ldi r22, 0x00 ; 0 26df6: 81 e0 ldi r24, 0x01 ; 1 26df8: 0f 94 0f 30 call 0x2601e ; 0x2601e } #endif //ambient #if defined(AMBIENT_MAXTEMP) && (TEMP_SENSOR_AMBIENT != 0) #if AMBIENT_RAW_LO_TEMP > AMBIENT_RAW_HI_TEMP if (current_temperature_raw_ambient <= ambient_maxttemp_raw) { 26dfc: 80 91 9c 04 lds r24, 0x049C ; 0x80049c <_ZL20ambient_maxttemp_raw.lto_priv.467> 26e00: 90 91 9d 04 lds r25, 0x049D ; 0x80049d <_ZL20ambient_maxttemp_raw.lto_priv.467+0x1> 26e04: 8c 17 cp r24, r28 26e06: 9d 07 cpc r25, r29 26e08: 2c f0 brlt .+10 ; 0x26e14 #else if (current_temperature_raw_ambient >= ambient_maxttemp_raw) { #endif set_temp_error(TempErrorSource::ambient, 0, TempErrorType::max); 26e0a: 40 e0 ldi r20, 0x00 ; 0 26e0c: 60 e0 ldi r22, 0x00 ; 0 26e0e: 82 e0 ldi r24, 0x02 ; 2 26e10: 0f 94 0f 30 call 0x2601e ; 0x2601e #ifdef AMBIENT_MINTEMP void check_min_temp_ambient() { #if AMBIENT_RAW_LO_TEMP > AMBIENT_RAW_HI_TEMP if (current_temperature_raw_ambient >= ambient_minttemp_raw) { 26e14: 80 91 50 02 lds r24, 0x0250 ; 0x800250 <_ZL20ambient_minttemp_raw.lto_priv.464> 26e18: 90 91 51 02 lds r25, 0x0251 ; 0x800251 <_ZL20ambient_minttemp_raw.lto_priv.464+0x1> 26e1c: c8 17 cp r28, r24 26e1e: d9 07 cpc r29, r25 26e20: 2c f0 brlt .+10 ; 0x26e2c #else if (current_temperature_raw_ambient <= ambient_minttemp_raw) { #endif set_temp_error(TempErrorSource::ambient, 0, TempErrorType::min); 26e22: 41 e0 ldi r20, 0x01 ; 1 26e24: 60 e0 ldi r22, 0x00 ; 0 26e26: 82 e0 ldi r24, 0x02 ; 2 26e28: 0f 94 0f 30 call 0x2601e ; 0x2601e #ifdef AMBIENT_MINTEMP // we need to check ambient temperature check_min_temp_ambient(); #endif #if AMBIENT_RAW_LO_TEMP > AMBIENT_RAW_HI_TEMP if(current_temperature_raw_ambient>(OVERSAMPLENR*MINTEMP_MINAMBIENT_RAW)) // thermistor is NTC type 26e2c: c1 3a cpi r28, 0xA1 ; 161 26e2e: de 43 sbci r29, 0x3E ; 62 26e30: 0c f4 brge .+2 ; 0x26e34 26e32: cd c1 rjmp .+922 ; 0x271ce { // 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]) { 26e34: 60 91 a2 04 lds r22, 0x04A2 ; 0x8004a2 <_ZL8minttemp.lto_priv.463> 26e38: 70 91 a3 04 lds r23, 0x04A3 ; 0x8004a3 <_ZL8minttemp.lto_priv.463+0x1> 26e3c: 80 91 1d 06 lds r24, 0x061D ; 0x80061d 26e40: 90 91 1e 06 lds r25, 0x061E ; 0x80061e 26e44: 68 17 cp r22, r24 26e46: 79 07 cpc r23, r25 26e48: 0c f0 brlt .+2 ; 0x26e4c 26e4a: 55 c0 rjmp .+170 ; 0x26ef6 // ~ nozzle heating is on bCheckingOnHeater=bCheckingOnHeater||(current_temperature_isr[active_extruder]>(minttemp[active_extruder]+TEMP_HYSTERESIS)); // for eventually delay cutting 26e4c: c0 91 13 06 lds r28, 0x0613 ; 0x800613 26e50: c1 11 cpse r28, r1 26e52: 18 c0 rjmp .+48 ; 0x26e84 26e54: 6b 5f subi r22, 0xFB ; 251 26e56: 7f 4f sbci r23, 0xFF ; 255 26e58: 07 2e mov r0, r23 26e5a: 00 0c add r0, r0 26e5c: 88 0b sbc r24, r24 26e5e: 99 0b sbc r25, r25 26e60: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26e64: 9b 01 movw r18, r22 26e66: ac 01 movw r20, r24 26e68: c1 e0 ldi r28, 0x01 ; 1 26e6a: 60 91 16 05 lds r22, 0x0516 ; 0x800516 26e6e: 70 91 17 05 lds r23, 0x0517 ; 0x800517 26e72: 80 91 18 05 lds r24, 0x0518 ; 0x800518 26e76: 90 91 19 05 lds r25, 0x0519 ; 0x800519 26e7a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26e7e: 18 16 cp r1, r24 26e80: 0c f0 brlt .+2 ; 0x26e84 26e82: c0 e0 ldi r28, 0x00 ; 0 26e84: c0 93 13 06 sts 0x0613, r28 ; 0x800613 if(oTimer4minTempHeater.expired_cont(HEATER_MINTEMP_DELAY) || bCheckingOnHeater) { 26e88: 68 e9 ldi r22, 0x98 ; 152 26e8a: 7a e3 ldi r23, 0x3A ; 58 26e8c: 80 e1 ldi r24, 0x10 ; 16 26e8e: 96 e0 ldi r25, 0x06 ; 6 26e90: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 26e94: 81 11 cpse r24, r1 26e96: 02 c0 rjmp .+4 ; 0x26e9c 26e98: cc 23 and r28, r28 26e9a: 29 f0 breq .+10 ; 0x26ea6 bCheckingOnHeater=true; // not necessary 26e9c: 81 e0 ldi r24, 0x01 ; 1 26e9e: 80 93 13 06 sts 0x0613, r24 ; 0x800613 check_min_temp_heater0(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active 26ea2: 0f 94 84 30 call 0x26108 ; 0x26108 // ~ nozzle heating is off oTimer4minTempHeater.start(); bCheckingOnHeater=false; } // * bed checking if(target_temperature_bed_isr>BED_MINTEMP) { 26ea6: 80 91 16 06 lds r24, 0x0616 ; 0x800616 26eaa: 90 91 17 06 lds r25, 0x0617 ; 0x800617 26eae: 0b 97 sbiw r24, 0x0b ; 11 26eb0: 4c f1 brlt .+82 ; 0x26f04 // ~ bed heating is on bCheckingOnBed=bCheckingOnBed||(current_temperature_bed_isr>(BED_MINTEMP+TEMP_HYSTERESIS)); // for eventually delay cutting 26eb2: c0 91 0f 06 lds r28, 0x060F ; 0x80060f 26eb6: c1 11 cpse r28, r1 26eb8: 0c c0 rjmp .+24 ; 0x26ed2 26eba: c1 e0 ldi r28, 0x01 ; 1 26ebc: 20 e0 ldi r18, 0x00 ; 0 26ebe: 30 e0 ldi r19, 0x00 ; 0 26ec0: 40 e7 ldi r20, 0x70 ; 112 26ec2: 51 e4 ldi r21, 0x41 ; 65 26ec4: c7 01 movw r24, r14 26ec6: b6 01 movw r22, r12 26ec8: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 26ecc: 18 16 cp r1, r24 26ece: 0c f0 brlt .+2 ; 0x26ed2 26ed0: c0 e0 ldi r28, 0x00 ; 0 26ed2: c0 93 0f 06 sts 0x060F, r28 ; 0x80060f if(oTimer4minTempBed.expired_cont(BED_MINTEMP_DELAY) || bCheckingOnBed) { 26ed6: 60 e5 ldi r22, 0x50 ; 80 26ed8: 73 ec ldi r23, 0xC3 ; 195 26eda: 8c e0 ldi r24, 0x0C ; 12 26edc: 96 e0 ldi r25, 0x06 ; 6 26ede: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 26ee2: 81 11 cpse r24, r1 26ee4: 02 c0 rjmp .+4 ; 0x26eea 26ee6: cc 23 and r28, r28 26ee8: 99 f0 breq .+38 ; 0x26f10 bCheckingOnBed=true; // not necessary 26eea: 81 e0 ldi r24, 0x01 ; 1 26eec: 80 93 0f 06 sts 0x060F, r24 ; 0x80060f #ifdef AMBIENT_THERMISTOR } else { // ambient temperature is standard check_min_temp_heater0(); check_min_temp_bed(); 26ef0: 0f 94 73 30 call 0x260e6 ; 0x260e6 26ef4: 0d c0 rjmp .+26 ; 0x26f10 check_min_temp_heater0(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active } } else { // ~ nozzle heating is off oTimer4minTempHeater.start(); 26ef6: 80 e1 ldi r24, 0x10 ; 16 26ef8: 96 e0 ldi r25, 0x06 ; 6 26efa: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> bCheckingOnHeater=false; 26efe: 10 92 13 06 sts 0x0613, r1 ; 0x800613 26f02: d1 cf rjmp .-94 ; 0x26ea6 check_min_temp_bed(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active } } else { // ~ bed heating is off oTimer4minTempBed.start(); 26f04: 8c e0 ldi r24, 0x0C ; 12 26f06: 96 e0 ldi r25, 0x06 ; 6 26f08: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> bCheckingOnBed=false; 26f0c: 10 92 0f 06 sts 0x060F, r1 ; 0x80060f 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); 26f10: 60 91 15 05 lds r22, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 26f14: 70 e0 ldi r23, 0x00 ; 0 26f16: 90 e0 ldi r25, 0x00 ; 0 26f18: 80 e0 ldi r24, 0x00 ; 0 26f1a: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 26f1e: 6b 01 movw r12, r22 26f20: 7c 01 movw r14, r24 26f22: 40 90 16 05 lds r4, 0x0516 ; 0x800516 26f26: 50 90 17 05 lds r5, 0x0517 ; 0x800517 26f2a: 60 90 18 05 lds r6, 0x0518 ; 0x800518 26f2e: 70 90 19 05 lds r7, 0x0519 ; 0x800519 26f32: 60 91 1d 06 lds r22, 0x061D ; 0x80061d 26f36: 70 91 1e 06 lds r23, 0x061E ; 0x80061e 26f3a: 07 2e mov r0, r23 26f3c: 00 0c add r0, r0 26f3e: 88 0b sbc r24, r24 26f40: 99 0b sbc r25, r25 26f42: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26f46: ab 01 movw r20, r22 26f48: bc 01 movw r22, r24 26f4a: a1 2c mov r10, r1 26f4c: 93 01 movw r18, r6 26f4e: 82 01 movw r16, r4 26f50: 81 e0 ldi r24, 0x01 ; 1 26f52: 0f 94 95 30 call 0x2612a ; 0x2612a #endif #ifdef TEMP_RUNAWAY_BED_HYSTERESIS temp_runaway_check(0, target_temperature_bed_isr, current_temperature_bed_isr, soft_pwm_bed, true); 26f56: 60 91 1c 06 lds r22, 0x061C ; 0x80061c 26f5a: 70 e0 ldi r23, 0x00 ; 0 26f5c: 90 e0 ldi r25, 0x00 ; 0 26f5e: 80 e0 ldi r24, 0x00 ; 0 26f60: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 26f64: 6b 01 movw r12, r22 26f66: 7c 01 movw r14, r24 26f68: 40 90 18 06 lds r4, 0x0618 ; 0x800618 26f6c: 50 90 19 06 lds r5, 0x0619 ; 0x800619 26f70: 60 90 1a 06 lds r6, 0x061A ; 0x80061a 26f74: 70 90 1b 06 lds r7, 0x061B ; 0x80061b 26f78: 60 91 16 06 lds r22, 0x0616 ; 0x800616 26f7c: 70 91 17 06 lds r23, 0x0617 ; 0x800617 26f80: 07 2e mov r0, r23 26f82: 00 0c add r0, r0 26f84: 88 0b sbc r24, r24 26f86: 99 0b sbc r25, r25 26f88: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 26f8c: ab 01 movw r20, r22 26f8e: bc 01 movw r22, r24 26f90: aa 24 eor r10, r10 26f92: a3 94 inc r10 26f94: 93 01 movw r18, r6 26f96: 82 01 movw r16, r4 26f98: 80 e0 ldi r24, 0x00 ; 0 26f9a: 0f 94 95 30 call 0x2612a ; 0x2612a return true; } static void check() { if(!enabled) return; 26f9e: 80 91 1c 05 lds r24, 0x051C ; 0x80051c <_ZN13thermal_modelL7enabledE.lto_priv.458> 26fa2: 88 23 and r24, r24 26fa4: 09 f4 brne .+2 ; 0x26fa8 26fa6: bc c0 rjmp .+376 ; 0x27120 uint8_t heater_pwm = soft_pwm[0]; 26fa8: c0 91 15 05 lds r28, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> uint8_t fan_pwm = soft_pwm_fan; 26fac: d0 91 a4 04 lds r29, 0x04A4 ; 0x8004a4 <_ZL12soft_pwm_fan.lto_priv.462> float heater_temp = current_temperature_isr[0]; 26fb0: 40 90 16 05 lds r4, 0x0516 ; 0x800516 26fb4: 50 90 17 05 lds r5, 0x0517 ; 0x800517 26fb8: 60 90 18 05 lds r6, 0x0518 ; 0x800518 26fbc: 70 90 19 05 lds r7, 0x0519 ; 0x800519 float ambient_temp = current_temperature_ambient_isr; 26fc0: c0 90 1f 06 lds r12, 0x061F ; 0x80061f 26fc4: d0 90 20 06 lds r13, 0x0620 ; 0x800620 26fc8: e0 90 21 06 lds r14, 0x0621 ; 0x800621 26fcc: f0 90 22 06 lds r15, 0x0622 ; 0x800622 // check if a reset is required to seed the model: this needs to be done with valid // ADC values, so we can't do that directly in init() if(data.flag_bits.uninitialized) 26fd0: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 26fd4: 80 ff sbrs r24, 0 26fd6: 72 c0 rjmp .+228 ; 0x270bc void model_data::reset(uint8_t heater_pwm _UNUSED, uint8_t fan_pwm _UNUSED, float heater_temp _UNUSED, float ambient_temp _UNUSED) { // pre-compute invariant values C_i = (TEMP_MGR_INTV / C); 26fd8: 20 91 e5 12 lds r18, 0x12E5 ; 0x8012e5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x36> 26fdc: 30 91 e6 12 lds r19, 0x12E6 ; 0x8012e6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x37> 26fe0: 40 91 e7 12 lds r20, 0x12E7 ; 0x8012e7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x38> 26fe4: 50 91 e8 12 lds r21, 0x12E8 ; 0x8012e8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x39> 26fe8: 61 e7 ldi r22, 0x71 ; 113 26fea: 7d e3 ldi r23, 0x3D ; 61 26fec: 8a e8 ldi r24, 0x8A ; 138 26fee: 9e e3 ldi r25, 0x3E ; 62 26ff0: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 26ff4: 60 93 3c 13 sts 0x133C, r22 ; 0x80133c <_ZN13thermal_modelL4dataE.lto_priv.402+0x8d> 26ff8: 70 93 3d 13 sts 0x133D, r23 ; 0x80133d <_ZN13thermal_modelL4dataE.lto_priv.402+0x8e> 26ffc: 80 93 3e 13 sts 0x133E, r24 ; 0x80133e <_ZN13thermal_modelL4dataE.lto_priv.402+0x8f> 27000: 90 93 3f 13 sts 0x133F, r25 ; 0x80133f <_ZN13thermal_modelL4dataE.lto_priv.402+0x90> warn_s = warn * TEMP_MGR_INTV; 27004: 21 e7 ldi r18, 0x71 ; 113 27006: 3d e3 ldi r19, 0x3D ; 61 27008: 4a e8 ldi r20, 0x8A ; 138 2700a: 5e e3 ldi r21, 0x3E ; 62 2700c: 60 91 33 13 lds r22, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 27010: 70 91 34 13 lds r23, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 27014: 80 91 35 13 lds r24, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 27018: 90 91 36 13 lds r25, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> 2701c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27020: 60 93 40 13 sts 0x1340, r22 ; 0x801340 <_ZN13thermal_modelL4dataE.lto_priv.402+0x91> 27024: 70 93 41 13 sts 0x1341, r23 ; 0x801341 <_ZN13thermal_modelL4dataE.lto_priv.402+0x92> 27028: 80 93 42 13 sts 0x1342, r24 ; 0x801342 <_ZN13thermal_modelL4dataE.lto_priv.402+0x93> 2702c: 90 93 43 13 sts 0x1343, r25 ; 0x801343 <_ZN13thermal_modelL4dataE.lto_priv.402+0x94> err_s = err * TEMP_MGR_INTV; 27030: 21 e7 ldi r18, 0x71 ; 113 27032: 3d e3 ldi r19, 0x3D ; 61 27034: 4a e8 ldi r20, 0x8A ; 138 27036: 5e e3 ldi r21, 0x3E ; 62 27038: 60 91 37 13 lds r22, 0x1337 ; 0x801337 <_ZN13thermal_modelL4dataE.lto_priv.402+0x88> 2703c: 70 91 38 13 lds r23, 0x1338 ; 0x801338 <_ZN13thermal_modelL4dataE.lto_priv.402+0x89> 27040: 80 91 39 13 lds r24, 0x1339 ; 0x801339 <_ZN13thermal_modelL4dataE.lto_priv.402+0x8a> 27044: 90 91 3a 13 lds r25, 0x133A ; 0x80133a <_ZN13thermal_modelL4dataE.lto_priv.402+0x8b> 27048: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2704c: 60 93 44 13 sts 0x1344, r22 ; 0x801344 <_ZN13thermal_modelL4dataE.lto_priv.402+0x95> 27050: 70 93 45 13 sts 0x1345, r23 ; 0x801345 <_ZN13thermal_modelL4dataE.lto_priv.402+0x96> 27054: 80 93 46 13 sts 0x1346, r24 ; 0x801346 <_ZN13thermal_modelL4dataE.lto_priv.402+0x97> 27058: 90 93 47 13 sts 0x1347, r25 ; 0x801347 <_ZN13thermal_modelL4dataE.lto_priv.402+0x98> dT_lag_size = L / (uint16_t)(TEMP_MGR_INTV * 1000); 2705c: 80 91 ed 12 lds r24, 0x12ED ; 0x8012ed <_ZN13thermal_modelL4dataE.lto_priv.402+0x3e> 27060: 90 91 ee 12 lds r25, 0x12EE ; 0x8012ee <_ZN13thermal_modelL4dataE.lto_priv.402+0x3f> 27064: 6e e0 ldi r22, 0x0E ; 14 27066: 71 e0 ldi r23, 0x01 ; 1 27068: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2706c: 60 93 cf 12 sts 0x12CF, r22 ; 0x8012cf <_ZN13thermal_modelL4dataE.lto_priv.402+0x20> 27070: ef ea ldi r30, 0xAF ; 175 27072: f2 e1 ldi r31, 0x12 ; 18 27074: 8f ec ldi r24, 0xCF ; 207 27076: 92 e1 ldi r25, 0x12 ; 18 // initial values for(uint8_t i = 0; i != THERMAL_MODEL_MAX_LAG_SIZE; ++i) dT_lag_buf[i] = NAN; 27078: 40 e0 ldi r20, 0x00 ; 0 2707a: 50 e0 ldi r21, 0x00 ; 0 2707c: 60 ec ldi r22, 0xC0 ; 192 2707e: 7f e7 ldi r23, 0x7F ; 127 27080: 41 93 st Z+, r20 27082: 51 93 st Z+, r21 27084: 61 93 st Z+, r22 27086: 71 93 st Z+, r23 warn_s = warn * TEMP_MGR_INTV; err_s = err * TEMP_MGR_INTV; dT_lag_size = L / (uint16_t)(TEMP_MGR_INTV * 1000); // initial values for(uint8_t i = 0; i != THERMAL_MODEL_MAX_LAG_SIZE; ++i) 27088: 8e 17 cp r24, r30 2708a: 9f 07 cpc r25, r31 2708c: c9 f7 brne .-14 ; 0x27080 dT_lag_buf[i] = NAN; dT_lag_idx = 0; 2708e: 10 92 d0 12 sts 0x12D0, r1 ; 0x8012d0 <_ZN13thermal_modelL4dataE.lto_priv.402+0x21> dT_err_prev = 0; 27092: 10 92 d1 12 sts 0x12D1, r1 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 27096: 10 92 d2 12 sts 0x12D2, r1 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 2709a: 10 92 d3 12 sts 0x12D3, r1 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 2709e: 10 92 d4 12 sts 0x12D4, r1 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> T_prev = NAN; 270a2: 40 93 d5 12 sts 0x12D5, r20 ; 0x8012d5 <_ZN13thermal_modelL4dataE.lto_priv.402+0x26> 270a6: 50 93 d6 12 sts 0x12D6, r21 ; 0x8012d6 <_ZN13thermal_modelL4dataE.lto_priv.402+0x27> 270aa: 60 93 d7 12 sts 0x12D7, r22 ; 0x8012d7 <_ZN13thermal_modelL4dataE.lto_priv.402+0x28> 270ae: 70 93 d8 12 sts 0x12D8, r23 ; 0x8012d8 <_ZN13thermal_modelL4dataE.lto_priv.402+0x29> // clear the initialization flag flag_bits.uninitialized = false; 270b2: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 270b6: 8e 7f andi r24, 0xFE ; 254 270b8: 80 93 3b 13 sts 0x133B, r24 ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> // ADC values, so we can't do that directly in init() if(data.flag_bits.uninitialized) data.reset(heater_pwm, fan_pwm, heater_temp, ambient_temp); // step the model data.step(heater_pwm, fan_pwm, heater_temp, ambient_temp); 270bc: 87 01 movw r16, r14 270be: 76 01 movw r14, r12 270c0: a3 01 movw r20, r6 270c2: 92 01 movw r18, r4 270c4: 6d 2f mov r22, r29 270c6: 8c 2f mov r24, r28 270c8: 0e 94 ec e5 call 0x1cbd8 ; 0x1cbd8 // handle errors if(data.flag_bits.error) 270cc: 80 91 3b 13 lds r24, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 270d0: 81 ff sbrs r24, 1 270d2: 05 c0 rjmp .+10 ; 0x270de set_temp_error(TempErrorSource::hotend, 0, TempErrorType::model); 270d4: 44 e0 ldi r20, 0x04 ; 4 270d6: 60 e0 ldi r22, 0x00 ; 0 270d8: 80 e0 ldi r24, 0x00 ; 0 270da: 0f 94 0f 30 call 0x2601e ; 0x2601e // handle warning conditions as lower-priority but with greater feedback warning_state.assert = data.flag_bits.warning; 270de: 90 91 3b 13 lds r25, 0x133B ; 0x80133b <_ZN13thermal_modelL4dataE.lto_priv.402+0x8c> 270e2: 80 91 38 06 lds r24, 0x0638 ; 0x800638 270e6: 92 fb bst r25, 2 270e8: 81 f9 bld r24, 1 270ea: 80 93 38 06 sts 0x0638, r24 ; 0x800638 if(warning_state.assert) { 270ee: 80 91 38 06 lds r24, 0x0638 ; 0x800638 270f2: 81 ff sbrs r24, 1 270f4: 15 c0 rjmp .+42 ; 0x27120 warning_state.warning = true; 270f6: 80 91 38 06 lds r24, 0x0638 ; 0x800638 270fa: 81 60 ori r24, 0x01 ; 1 270fc: 80 93 38 06 sts 0x0638, r24 ; 0x800638 warning_state.dT_err = thermal_model::data.dT_err_prev; 27100: 80 91 d1 12 lds r24, 0x12D1 ; 0x8012d1 <_ZN13thermal_modelL4dataE.lto_priv.402+0x22> 27104: 90 91 d2 12 lds r25, 0x12D2 ; 0x8012d2 <_ZN13thermal_modelL4dataE.lto_priv.402+0x23> 27108: a0 91 d3 12 lds r26, 0x12D3 ; 0x8012d3 <_ZN13thermal_modelL4dataE.lto_priv.402+0x24> 2710c: b0 91 d4 12 lds r27, 0x12D4 ; 0x8012d4 <_ZN13thermal_modelL4dataE.lto_priv.402+0x25> 27110: 80 93 34 06 sts 0x0634, r24 ; 0x800634 27114: 90 93 35 06 sts 0x0635, r25 ; 0x800635 27118: a0 93 36 06 sts 0x0636, r26 ; 0x800636 2711c: b0 93 37 06 sts 0x0637, r27 ; 0x800637 (int)cur_pwm, (unsigned long)cur_temp_b, (unsigned long)cur_amb_b); } static void log_isr() { if(!log_buf.enabled) return; 27120: 80 91 33 06 lds r24, 0x0633 ; 0x800633 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x10> 27124: 88 23 and r24, r24 27126: 09 f4 brne .+2 ; 0x2712a 27128: 3f c0 rjmp .+126 ; 0x271a8 uint32_t stamp = _millis(); 2712a: 0f 94 28 2a call 0x25450 ; 0x25450 uint8_t delta_ms = stamp - log_buf.entry.stamp - (uint32_t)(TEMP_MGR_INTV * 1000); 2712e: c0 90 23 06 lds r12, 0x0623 ; 0x800623 <_ZN13thermal_modelL7log_bufE.lto_priv.539> 27132: d0 90 24 06 lds r13, 0x0624 ; 0x800624 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x1> 27136: e0 90 25 06 lds r14, 0x0625 ; 0x800625 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x2> 2713a: f0 90 26 06 lds r15, 0x0626 ; 0x800626 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x3> log_buf.entry.stamp = stamp; 2713e: 60 93 23 06 sts 0x0623, r22 ; 0x800623 <_ZN13thermal_modelL7log_bufE.lto_priv.539> 27142: 70 93 24 06 sts 0x0624, r23 ; 0x800624 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x1> 27146: 80 93 25 06 sts 0x0625, r24 ; 0x800625 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x2> 2714a: 90 93 26 06 sts 0x0626, r25 ; 0x800626 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x3> ++log_buf.entry.counter; 2714e: 20 91 28 06 lds r18, 0x0628 ; 0x800628 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x5> 27152: 2f 5f subi r18, 0xFF ; 255 27154: 20 93 28 06 sts 0x0628, r18 ; 0x800628 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x5> static void log_isr() { if(!log_buf.enabled) return; uint32_t stamp = _millis(); uint8_t delta_ms = stamp - log_buf.entry.stamp - (uint32_t)(TEMP_MGR_INTV * 1000); 27158: 6c 19 sub r22, r12 2715a: 6e 50 subi r22, 0x0E ; 14 log_buf.entry.stamp = stamp; ++log_buf.entry.counter; log_buf.entry.delta_ms = delta_ms; 2715c: 60 93 27 06 sts 0x0627, r22 ; 0x800627 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x4> log_buf.entry.cur_pwm = soft_pwm[0]; 27160: 80 91 15 05 lds r24, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 27164: 80 93 29 06 sts 0x0629, r24 ; 0x800629 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x6> log_buf.entry.cur_temp = current_temperature_isr[0]; 27168: 80 91 16 05 lds r24, 0x0516 ; 0x800516 2716c: 90 91 17 05 lds r25, 0x0517 ; 0x800517 27170: a0 91 18 05 lds r26, 0x0518 ; 0x800518 27174: b0 91 19 05 lds r27, 0x0519 ; 0x800519 27178: 80 93 2a 06 sts 0x062A, r24 ; 0x80062a <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x7> 2717c: 90 93 2b 06 sts 0x062B, r25 ; 0x80062b <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x8> 27180: a0 93 2c 06 sts 0x062C, r26 ; 0x80062c <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x9> 27184: b0 93 2d 06 sts 0x062D, r27 ; 0x80062d <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xa> log_buf.entry.cur_amb = current_temperature_ambient_isr; 27188: 80 91 1f 06 lds r24, 0x061F ; 0x80061f 2718c: 90 91 20 06 lds r25, 0x0620 ; 0x800620 27190: a0 91 21 06 lds r26, 0x0621 ; 0x800621 27194: b0 91 22 06 lds r27, 0x0622 ; 0x800622 27198: 80 93 2e 06 sts 0x062E, r24 ; 0x80062e <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xb> 2719c: 90 93 2f 06 sts 0x062F, r25 ; 0x80062f <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xc> 271a0: a0 93 30 06 sts 0x0630, r26 ; 0x800630 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xd> 271a4: b0 93 31 06 sts 0x0631, r27 ; 0x800631 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xe> thermal_model::log_isr(); #endif #endif // PID regulation if (pid_tuning_finished) 271a8: 80 91 3e 02 lds r24, 0x023E ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> 271ac: 88 23 and r24, r24 271ae: 91 f0 breq .+36 ; 0x271d4 temp_mgr_pid(); } 271b0: df 91 pop r29 271b2: cf 91 pop r28 271b4: 1f 91 pop r17 271b6: 0f 91 pop r16 271b8: ff 90 pop r15 271ba: ef 90 pop r14 271bc: df 90 pop r13 271be: cf 90 pop r12 271c0: af 90 pop r10 271c2: 7f 90 pop r7 271c4: 6f 90 pop r6 271c6: 5f 90 pop r5 271c8: 4f 90 pop r4 #endif #endif // PID regulation if (pid_tuning_finished) temp_mgr_pid(); 271ca: 0d 94 ac 11 jmp 0x22358 ; 0x22358 // *** end of 'common' part #ifdef AMBIENT_THERMISTOR } else { // ambient temperature is standard check_min_temp_heater0(); 271ce: 0f 94 84 30 call 0x26108 ; 0x26108 271d2: 8e ce rjmp .-740 ; 0x26ef0 #endif // PID regulation if (pid_tuning_finished) temp_mgr_pid(); } 271d4: df 91 pop r29 271d6: cf 91 pop r28 271d8: 1f 91 pop r17 271da: 0f 91 pop r16 271dc: ff 90 pop r15 271de: ef 90 pop r14 271e0: df 90 pop r13 271e2: cf 90 pop r12 271e4: af 90 pop r10 271e6: 7f 90 pop r7 271e8: 6f 90 pop r6 271ea: 5f 90 pop r5 271ec: 4f 90 pop r4 271ee: 08 95 ret 000271f0 <__vector_47>: ISR(TIMERx_COMPA_vect) { 271f0: 1f 92 push r1 271f2: 0f 92 push r0 271f4: 0f b6 in r0, 0x3f ; 63 271f6: 0f 92 push r0 271f8: 11 24 eor r1, r1 271fa: 0b b6 in r0, 0x3b ; 59 271fc: 0f 92 push r0 271fe: 2f 93 push r18 27200: 3f 93 push r19 27202: 4f 93 push r20 27204: 5f 93 push r21 27206: 6f 93 push r22 27208: 7f 93 push r23 2720a: 8f 93 push r24 2720c: 9f 93 push r25 2720e: af 93 push r26 27210: bf 93 push r27 27212: ef 93 push r30 27214: ff 93 push r31 // immediately schedule a new conversion if(adc_values_ready != true) return; 27216: 80 91 1b 05 lds r24, 0x051B ; 0x80051b <_ZL16adc_values_ready.lto_priv.459> 2721a: 88 23 and r24, r24 2721c: 91 f0 breq .+36 ; 0x27242 <__vector_47+0x52> adc_values_ready = false; 2721e: 10 92 1b 05 sts 0x051B, r1 ; 0x80051b <_ZL16adc_values_ready.lto_priv.459> adc_start_cycle(); 27222: 0e 94 77 8d call 0x11aee ; 0x11aee // run temperature management with interrupts enabled to reduce latency DISABLE_TEMP_MGR_INTERRUPT(); 27226: 80 91 73 00 lds r24, 0x0073 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> 2722a: 8d 7f andi r24, 0xFD ; 253 2722c: 80 93 73 00 sts 0x0073, r24 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> #if !defined(__DOXYGEN__) /* Internal helper functions. */ static __inline__ uint8_t __iSeiRetVal(void) { sei(); 27230: 78 94 sei NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) { temp_mgr_isr(); 27232: 0f 94 91 36 call 0x26d22 ; 0x26d22 (void)__s; } static __inline__ void __iCliParam(const uint8_t *__s) { cli(); 27236: f8 94 cli } ENABLE_TEMP_MGR_INTERRUPT(); 27238: 80 91 73 00 lds r24, 0x0073 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> 2723c: 82 60 ori r24, 0x02 ; 2 2723e: 80 93 73 00 sts 0x0073, r24 ; 0x800073 <__TEXT_REGION_LENGTH__+0x7c2073> } 27242: ff 91 pop r31 27244: ef 91 pop r30 27246: bf 91 pop r27 27248: af 91 pop r26 2724a: 9f 91 pop r25 2724c: 8f 91 pop r24 2724e: 7f 91 pop r23 27250: 6f 91 pop r22 27252: 5f 91 pop r21 27254: 4f 91 pop r20 27256: 3f 91 pop r19 27258: 2f 91 pop r18 2725a: 0f 90 pop r0 2725c: 0b be out 0x3b, r0 ; 59 2725e: 0f 90 pop r0 27260: 0f be out 0x3f, r0 ; 63 27262: 0f 90 pop r0 27264: 1f 90 pop r1 27266: 18 95 reti 00027268 : } void handle_temp_error(); void manage_heater() { 27268: 6f 92 push r6 2726a: 7f 92 push r7 2726c: 8f 92 push r8 2726e: 9f 92 push r9 27270: af 92 push r10 27272: bf 92 push r11 27274: cf 92 push r12 27276: df 92 push r13 27278: ef 92 push r14 2727a: ff 92 push r15 2727c: 0f 93 push r16 2727e: 1f 93 push r17 27280: cf 93 push r28 27282: df 93 push r29 27284: 1f 92 push r1 27286: cd b7 in r28, 0x3d ; 61 27288: de b7 in r29, 0x3e ; 62 #ifdef WATCHDOG wdt_reset(); 2728a: 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) 2728c: 80 91 01 06 lds r24, 0x0601 ; 0x800601 27290: 88 23 and r24, r24 27292: 09 f4 brne .+2 ; 0x27296 27294: bb c0 rjmp .+374 ; 0x2740c return; // syncronize temperatures with isr updateTemperatures(); 27296: 0f 94 55 33 call 0x266aa ; 0x266aa #ifdef THERMAL_MODEL // handle model warnings first, so not to override the error handler if(thermal_model::warning_state.warning) 2729a: 80 91 38 06 lds r24, 0x0638 ; 0x800638 2729e: 80 ff sbrs r24, 0 272a0: 51 c0 rjmp .+162 ; 0x27344 } static void handle_warning() { // update values float warn = data.warn; 272a2: 10 91 33 13 lds r17, 0x1333 ; 0x801333 <_ZN13thermal_modelL4dataE.lto_priv.402+0x84> 272a6: 00 91 34 13 lds r16, 0x1334 ; 0x801334 <_ZN13thermal_modelL4dataE.lto_priv.402+0x85> 272aa: b0 90 35 13 lds r11, 0x1335 ; 0x801335 <_ZN13thermal_modelL4dataE.lto_priv.402+0x86> 272ae: a0 90 36 13 lds r10, 0x1336 ; 0x801336 <_ZN13thermal_modelL4dataE.lto_priv.402+0x87> float dT_err; { TempMgrGuard temp_mgr_guard; 272b2: ce 01 movw r24, r28 272b4: 01 96 adiw r24, 0x01 ; 1 272b6: 0f 94 76 32 call 0x264ec ; 0x264ec dT_err = warning_state.dT_err; 272ba: c0 90 34 06 lds r12, 0x0634 ; 0x800634 272be: d0 90 35 06 lds r13, 0x0635 ; 0x800635 272c2: e0 90 36 06 lds r14, 0x0636 ; 0x800636 272c6: f0 90 37 06 lds r15, 0x0637 ; 0x800637 { // update values float warn = data.warn; float dT_err; { TempMgrGuard temp_mgr_guard; 272ca: ce 01 movw r24, r28 272cc: 01 96 adiw r24, 0x01 ; 1 272ce: 0f 94 69 32 call 0x264d2 ; 0x264d2 dT_err = warning_state.dT_err; } dT_err /= TEMP_MGR_INTV; // per-sample => K/s printf_P(PSTR("TM: error |%f|>%f\n"), (double)dT_err, (double)warn); 272d2: af 92 push r10 272d4: bf 92 push r11 272d6: 0f 93 push r16 272d8: 1f 93 push r17 float dT_err; { TempMgrGuard temp_mgr_guard; dT_err = warning_state.dT_err; } dT_err /= TEMP_MGR_INTV; // per-sample => K/s 272da: 21 e7 ldi r18, 0x71 ; 113 272dc: 3d e3 ldi r19, 0x3D ; 61 272de: 4a e8 ldi r20, 0x8A ; 138 272e0: 5e e3 ldi r21, 0x3E ; 62 272e2: c7 01 movw r24, r14 272e4: b6 01 movw r22, r12 272e6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> printf_P(PSTR("TM: error |%f|>%f\n"), (double)dT_err, (double)warn); 272ea: 9f 93 push r25 272ec: 8f 93 push r24 272ee: 7f 93 push r23 272f0: 6f 93 push r22 272f2: 8f e4 ldi r24, 0x4F ; 79 272f4: 9b e9 ldi r25, 0x9B ; 155 272f6: 9f 93 push r25 272f8: 8f 93 push r24 272fa: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 static bool first = true; if(warning_state.assert) { 272fe: 90 91 38 06 lds r25, 0x0638 ; 0x800638 27302: 0f b6 in r0, 0x3f ; 63 27304: f8 94 cli 27306: de bf out 0x3e, r29 ; 62 27308: 0f be out 0x3f, r0 ; 63 2730a: cd bf out 0x3d, r28 ; 61 2730c: 80 91 3d 02 lds r24, 0x023D ; 0x80023d <_ZN13thermal_modelL9warn_beepE.lto_priv.457> 27310: 91 ff sbrs r25, 1 27312: 93 c0 rjmp .+294 ; 0x2743a if (first) { 27314: 90 91 a3 02 lds r25, 0x02A3 ; 0x8002a3 27318: 99 23 and r25, r25 2731a: 09 f4 brne .+2 ; 0x2731e 2731c: 87 c0 rjmp .+270 ; 0x2742c if(warn_beep) { 2731e: 88 23 and r24, r24 27320: 79 f0 breq .+30 ; 0x27340 lcd_setalertstatuspgm(_T(MSG_THERMAL_ANOMALY), LCD_STATUS_INFO); 27322: 86 e2 ldi r24, 0x26 ; 38 27324: 9d e4 ldi r25, 0x4D ; 77 27326: 0e 94 44 72 call 0xe488 ; 0xe488 2732a: 61 e0 ldi r22, 0x01 ; 1 2732c: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac WRITE(BEEPER, HIGH); 27330: 9f b7 in r25, 0x3f ; 63 27332: f8 94 cli 27334: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 27338: 84 60 ori r24, 0x04 ; 4 2733a: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2733e: 9f bf out 0x3f, r25 ; 63 } first = false; 27340: 10 92 a3 02 sts 0x02A3, r1 ; 0x8002a3 if(thermal_model::warning_state.warning) thermal_model::handle_warning(); #endif // handle temperature errors if(temp_error_state.v) 27344: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 27348: 88 23 and r24, r24 2734a: 89 f0 breq .+34 ; 0x2736e #endif void handle_temp_error() { // relay to the original handler switch((TempErrorType)temp_error_state.type) { 2734c: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 27350: 82 95 swap r24 27352: 86 95 lsr r24 27354: 87 70 andi r24, 0x07 ; 7 27356: 84 30 cpi r24, 0x04 ; 4 27358: 08 f0 brcs .+2 ; 0x2735c 2735a: 82 c0 rjmp .+260 ; 0x27460 2735c: 82 30 cpi r24, 0x02 ; 2 2735e: 08 f0 brcs .+2 ; 0x27362 27360: 1d c1 rjmp .+570 ; 0x2759c 27362: 88 23 and r24, r24 27364: 09 f4 brne .+2 ; 0x27368 27366: f4 c0 rjmp .+488 ; 0x27550 27368: 81 30 cpi r24, 0x01 ; 1 2736a: 09 f4 brne .+2 ; 0x2736e 2736c: 94 c0 rjmp .+296 ; 0x27496 // handle temperature errors if(temp_error_state.v) handle_temp_error(); // periodically check fans checkFans(); 2736e: 0e 94 9a 7f call 0xff34 ; 0xff34 } #ifdef THERMAL_MODEL_DEBUG static void log_usr() { if(!log_buf.enabled) return; 27372: 80 91 33 06 lds r24, 0x0633 ; 0x800633 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x10> 27376: 88 23 and r24, r24 27378: 09 f4 brne .+2 ; 0x2737c 2737a: 48 c0 rjmp .+144 ; 0x2740c uint8_t counter = log_buf.entry.counter; 2737c: 80 91 28 06 lds r24, 0x0628 ; 0x800628 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x5> if (counter == log_buf.serial) return; 27380: 70 90 32 06 lds r7, 0x0632 ; 0x800632 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xf> 27384: 87 15 cp r24, r7 27386: 09 f4 brne .+2 ; 0x2738a 27388: 41 c0 rjmp .+130 ; 0x2740c // avoid strict-aliasing warnings union { float cur_temp; uint32_t cur_temp_b; }; union { float cur_amb; uint32_t cur_amb_b; }; { TempMgrGuard temp_mgr_guard; 2738a: ce 01 movw r24, r28 2738c: 01 96 adiw r24, 0x01 ; 1 2738e: 0f 94 76 32 call 0x264ec ; 0x264ec delta_ms = log_buf.entry.delta_ms; 27392: 00 91 27 06 lds r16, 0x0627 ; 0x800627 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x4> counter = log_buf.entry.counter; 27396: 10 91 28 06 lds r17, 0x0628 ; 0x800628 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x5> cur_pwm = log_buf.entry.cur_pwm; 2739a: 60 90 29 06 lds r6, 0x0629 ; 0x800629 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x6> cur_temp = log_buf.entry.cur_temp; 2739e: c0 90 2a 06 lds r12, 0x062A ; 0x80062a <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x7> 273a2: d0 90 2b 06 lds r13, 0x062B ; 0x80062b <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x8> 273a6: e0 90 2c 06 lds r14, 0x062C ; 0x80062c <_ZN13thermal_modelL7log_bufE.lto_priv.539+0x9> 273aa: f0 90 2d 06 lds r15, 0x062D ; 0x80062d <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xa> cur_amb = log_buf.entry.cur_amb; 273ae: 80 90 2e 06 lds r8, 0x062E ; 0x80062e <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xb> 273b2: 90 90 2f 06 lds r9, 0x062F ; 0x80062f <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xc> 273b6: a0 90 30 06 lds r10, 0x0630 ; 0x800630 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xd> 273ba: b0 90 31 06 lds r11, 0x0631 ; 0x800631 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xe> // avoid strict-aliasing warnings union { float cur_temp; uint32_t cur_temp_b; }; union { float cur_amb; uint32_t cur_amb_b; }; { TempMgrGuard temp_mgr_guard; 273be: ce 01 movw r24, r28 273c0: 01 96 adiw r24, 0x01 ; 1 273c2: 0f 94 69 32 call 0x264d2 ; 0x264d2 cur_temp = log_buf.entry.cur_temp; cur_amb = log_buf.entry.cur_amb; } uint8_t d = counter - log_buf.serial; log_buf.serial = counter; 273c6: 10 93 32 06 sts 0x0632, r17 ; 0x800632 <_ZN13thermal_modelL7log_bufE.lto_priv.539+0xf> printf_P(PSTR("TML %d %d %x %lx %lx\n"), (unsigned)d - 1, (int)delta_ms + 1, 273ca: bf 92 push r11 273cc: af 92 push r10 273ce: 9f 92 push r9 273d0: 8f 92 push r8 273d2: ff 92 push r15 273d4: ef 92 push r14 273d6: df 92 push r13 273d8: cf 92 push r12 273da: 1f 92 push r1 273dc: 6f 92 push r6 273de: 80 2f mov r24, r16 273e0: 00 0f add r16, r16 273e2: 99 0b sbc r25, r25 273e4: 01 96 adiw r24, 0x01 ; 1 273e6: 9f 93 push r25 273e8: 8f 93 push r24 cur_pwm = log_buf.entry.cur_pwm; cur_temp = log_buf.entry.cur_temp; cur_amb = log_buf.entry.cur_amb; } uint8_t d = counter - log_buf.serial; 273ea: 81 2f mov r24, r17 273ec: 87 19 sub r24, r7 log_buf.serial = counter; printf_P(PSTR("TML %d %d %x %lx %lx\n"), (unsigned)d - 1, (int)delta_ms + 1, 273ee: 81 50 subi r24, 0x01 ; 1 273f0: 99 0b sbc r25, r25 273f2: 9f 93 push r25 273f4: 8f 93 push r24 273f6: 82 ed ldi r24, 0xD2 ; 210 273f8: 9a e9 ldi r25, 0x9A ; 154 273fa: 9f 93 push r25 273fc: 8f 93 push r24 273fe: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 27402: 0f b6 in r0, 0x3f ; 63 27404: f8 94 cli 27406: de bf out 0x3e, r29 ; 62 27408: 0f be out 0x3f, r0 ; 63 2740a: cd bf out 0x3d, r28 ; 61 checkFans(); #ifdef THERMAL_MODEL_DEBUG thermal_model::log_usr(); #endif } 2740c: 0f 90 pop r0 2740e: df 91 pop r29 27410: cf 91 pop r28 27412: 1f 91 pop r17 27414: 0f 91 pop r16 27416: ff 90 pop r15 27418: ef 90 pop r14 2741a: df 90 pop r13 2741c: cf 90 pop r12 2741e: bf 90 pop r11 27420: af 90 pop r10 27422: 9f 90 pop r9 27424: 8f 90 pop r8 27426: 7f 90 pop r7 27428: 6f 90 pop r6 2742a: 08 95 ret lcd_setalertstatuspgm(_T(MSG_THERMAL_ANOMALY), LCD_STATUS_INFO); WRITE(BEEPER, HIGH); } first = false; } else { if(warn_beep) TOGGLE(BEEPER); 2742c: 88 23 and r24, r24 2742e: 09 f4 brne .+2 ; 0x27432 27430: 89 cf rjmp .-238 ; 0x27344 27432: 84 e0 ldi r24, 0x04 ; 4 27434: 80 93 00 01 sts 0x0100, r24 ; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100> 27438: 85 cf rjmp .-246 ; 0x27344 } } else { // warning cleared, reset state warning_state.warning = false; 2743a: 90 91 38 06 lds r25, 0x0638 ; 0x800638 2743e: 9e 7f andi r25, 0xFE ; 254 27440: 90 93 38 06 sts 0x0638, r25 ; 0x800638 if(warn_beep) WRITE(BEEPER, LOW); 27444: 88 23 and r24, r24 27446: 41 f0 breq .+16 ; 0x27458 27448: 9f b7 in r25, 0x3f ; 63 2744a: f8 94 cli 2744c: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 27450: 8b 7f andi r24, 0xFB ; 251 27452: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 27456: 9f bf out 0x3f, r25 ; 63 first = true; 27458: 81 e0 ldi r24, 0x01 ; 1 2745a: 80 93 a3 02 sts 0x02A3, r24 ; 0x8002a3 2745e: 72 cf rjmp .-284 ; 0x27344 #endif void handle_temp_error() { // relay to the original handler switch((TempErrorType)temp_error_state.type) { 27460: 84 30 cpi r24, 0x04 ; 4 27462: 09 f0 breq .+2 ; 0x27466 27464: 84 cf rjmp .-248 ; 0x2736e #endif } break; #ifdef THERMAL_MODEL case TempErrorType::model: if(temp_error_state.assert) { 27466: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 2746a: 81 ff sbrs r24, 1 2746c: b4 c0 rjmp .+360 ; 0x275d6 if(IsStopped() == false) { 2746e: 80 91 10 05 lds r24, 0x0510 ; 0x800510 27472: 81 11 cpse r24, r1 27474: 04 c0 rjmp .+8 ; 0x2747e SERIAL_ECHOLNPGM("TM: error triggered!"); 27476: 8a e3 ldi r24, 0x3A ; 58 27478: 9b e9 ldi r25, 0x9B ; 155 2747a: 0e 94 13 79 call 0xf226 ; 0xf226 } ThermalStop(true); 2747e: 81 e0 ldi r24, 0x01 ; 1 27480: 0e 94 44 79 call 0xf288 ; 0xf288 WRITE(BEEPER, HIGH); 27484: 9f b7 in r25, 0x3f ; 63 27486: f8 94 cli 27488: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2748c: 84 60 ori r24, 0x04 ; 4 2748e: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 27492: 9f bf out 0x3f, r25 ; 63 27494: 6c cf rjmp .-296 ; 0x2736e void handle_temp_error() { // relay to the original handler switch((TempErrorType)temp_error_state.type) { case TempErrorType::min: switch((TempErrorSource)temp_error_state.source) { 27496: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 2749a: 86 95 lsr r24 2749c: 86 95 lsr r24 2749e: 83 70 andi r24, 0x03 ; 3 274a0: 81 30 cpi r24, 0x01 ; 1 274a2: d9 f1 breq .+118 ; 0x2751a 274a4: 58 f0 brcs .+22 ; 0x274bc 274a6: 82 30 cpi r24, 0x02 ; 2 274a8: 09 f0 breq .+2 ; 0x274ac 274aa: 61 cf rjmp .-318 ; 0x2736e } ThermalStop(); } static void ambient_min_temp_error(void) { if(IsStopped() == false) { 274ac: 80 91 10 05 lds r24, 0x0510 ; 0x800510 274b0: 81 11 cpse r24, r1 274b2: 14 c0 rjmp .+40 ; 0x274dc temp_error_messagepgm(PSTR("MINTEMP AMB")); 274b4: 61 e0 ldi r22, 0x01 ; 1 274b6: 8c ef ldi r24, 0xFC ; 252 274b8: 9a e9 ldi r25, 0x9A ; 154 274ba: 0e c0 rjmp .+28 ; 0x274d8 // relay to the original handler switch((TempErrorType)temp_error_state.type) { case TempErrorType::min: switch((TempErrorSource)temp_error_state.source) { case TempErrorSource::hotend: if(temp_error_state.assert) { 274bc: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 274c0: 81 ff sbrs r24, 1 274c2: 10 c0 rjmp .+32 ; 0x274e4 min_temp_error(temp_error_state.index); 274c4: 60 91 1a 05 lds r22, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 274c8: 62 95 swap r22 274ca: 61 70 andi r22, 0x01 ; 1 #endif } static void min_temp_error(uint8_t e) { static const char err[] PROGMEM = "MINTEMP"; if(IsStopped() == false) { 274cc: 80 91 10 05 lds r24, 0x0510 ; 0x800510 274d0: 81 11 cpse r24, r1 274d2: 04 c0 rjmp .+8 ; 0x274dc temp_error_messagepgm(err, e); 274d4: 88 ee ldi r24, 0xE8 ; 232 274d6: 9a e9 ldi r25, 0x9A ; 154 274d8: 0f 94 d9 2c call 0x259b2 ; 0x259b2 prusa_statistics(92); } ThermalStop(); 274dc: 80 e0 ldi r24, 0x00 ; 0 274de: 0e 94 44 79 call 0xf288 ; 0xf288 274e2: 45 cf rjmp .-374 ; 0x2736e // 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); 274e4: 60 91 a2 04 lds r22, 0x04A2 ; 0x8004a2 <_ZL8minttemp.lto_priv.463> 274e8: 70 91 a3 04 lds r23, 0x04A3 ; 0x8004a3 <_ZL8minttemp.lto_priv.463+0x1> 274ec: 6b 5f subi r22, 0xFB ; 251 274ee: 7f 4f sbci r23, 0xFF ; 255 274f0: 07 2e mov r0, r23 274f2: 00 0c add r0, r0 274f4: 88 0b sbc r24, r24 274f6: 99 0b sbc r25, r25 274f8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 274fc: 8b 01 movw r16, r22 274fe: 9c 01 movw r18, r24 27500: 40 91 af 0d lds r20, 0x0DAF ; 0x800daf 27504: 50 91 b0 0d lds r21, 0x0DB0 ; 0x800db0 27508: 60 91 b1 0d lds r22, 0x0DB1 ; 0x800db1 2750c: 70 91 b2 0d lds r23, 0x0DB2 ; 0x800db2 27510: 8f e9 ldi r24, 0x9F ; 159 27512: 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); 27514: 0f 94 dd 1f call 0x23fba ; 0x23fba 27518: 2a cf rjmp .-428 ; 0x2736e // 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) { 2751a: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 2751e: 81 ff sbrs r24, 1 27520: 08 c0 rjmp .+16 ; 0x27532 ThermalStop(); } static void bed_min_temp_error(void) { static const char err[] PROGMEM = "MINTEMP BED"; if(IsStopped() == false) { 27522: 80 91 10 05 lds r24, 0x0510 ; 0x800510 27526: 81 11 cpse r24, r1 27528: d9 cf rjmp .-78 ; 0x274dc temp_error_messagepgm(err); 2752a: 61 e0 ldi r22, 0x01 ; 1 2752c: 80 ef ldi r24, 0xF0 ; 240 2752e: 9a e9 ldi r25, 0x9A ; 154 27530: d3 cf rjmp .-90 ; 0x274d8 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); 27532: 40 91 ed 04 lds r20, 0x04ED ; 0x8004ed 27536: 50 91 ee 04 lds r21, 0x04EE ; 0x8004ee 2753a: 60 91 ef 04 lds r22, 0x04EF ; 0x8004ef 2753e: 70 91 f0 04 lds r23, 0x04F0 ; 0x8004f0 27542: 00 e0 ldi r16, 0x00 ; 0 27544: 10 e0 ldi r17, 0x00 ; 0 27546: 20 e7 ldi r18, 0x70 ; 112 27548: 31 e4 ldi r19, 0x41 ; 65 2754a: 8b e9 ldi r24, 0x9B ; 155 2754c: 92 e0 ldi r25, 0x02 ; 2 2754e: e2 cf rjmp .-60 ; 0x27514 break; #endif } break; case TempErrorType::max: switch((TempErrorSource)temp_error_state.source) { 27550: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 27554: 86 95 lsr r24 27556: 86 95 lsr r24 27558: 83 70 andi r24, 0x03 ; 3 2755a: 81 30 cpi r24, 0x01 ; 1 2755c: b9 f0 breq .+46 ; 0x2758c 2755e: 58 f0 brcs .+22 ; 0x27576 27560: 82 30 cpi r24, 0x02 ; 2 27562: 09 f0 breq .+2 ; 0x27566 27564: 04 cf rjmp .-504 ; 0x2736e } #ifdef AMBIENT_THERMISTOR static void ambient_max_temp_error(void) { if(IsStopped() == false) { 27566: 80 91 10 05 lds r24, 0x0510 ; 0x800510 2756a: 81 11 cpse r24, r1 2756c: b7 cf rjmp .-146 ; 0x274dc temp_error_messagepgm(PSTR("MAXTEMP AMB")); 2756e: 61 e0 ldi r22, 0x01 ; 1 27570: 8c e1 ldi r24, 0x1C ; 28 27572: 9b e9 ldi r25, 0x9B ; 155 27574: b1 cf rjmp .-158 ; 0x274d8 } break; case TempErrorType::max: switch((TempErrorSource)temp_error_state.source) { case TempErrorSource::hotend: max_temp_error(temp_error_state.index); 27576: 60 91 1a 05 lds r22, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 2757a: 62 95 swap r22 2757c: 61 70 andi r22, 0x01 ; 1 SERIAL_ERRORLNPGM(" triggered!"); } static void max_temp_error(uint8_t e) { if(IsStopped() == false) { 2757e: 80 91 10 05 lds r24, 0x0510 ; 0x800510 27582: 81 11 cpse r24, r1 27584: ab cf rjmp .-170 ; 0x274dc temp_error_messagepgm(PSTR("MAXTEMP"), e); 27586: 88 e0 ldi r24, 0x08 ; 8 27588: 9b e9 ldi r25, 0x9B ; 155 2758a: a6 cf rjmp .-180 ; 0x274d8 } ThermalStop(); } static void bed_max_temp_error(void) { if(IsStopped() == false) { 2758c: 80 91 10 05 lds r24, 0x0510 ; 0x800510 27590: 81 11 cpse r24, r1 27592: a4 cf rjmp .-184 ; 0x274dc temp_error_messagepgm(PSTR("MAXTEMP BED")); 27594: 61 e0 ldi r22, 0x01 ; 1 27596: 80 e1 ldi r24, 0x10 ; 16 27598: 9b e9 ldi r25, 0x9B ; 155 2759a: 9e cf rjmp .-196 ; 0x274d8 #endif } break; case TempErrorType::preheat: case TempErrorType::runaway: switch((TempErrorSource)temp_error_state.source) { 2759c: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 275a0: 86 95 lsr r24 275a2: 86 95 lsr r24 275a4: 83 70 andi r24, 0x03 ; 3 275a6: 82 30 cpi r24, 0x02 ; 2 275a8: 08 f0 brcs .+2 ; 0x275ac 275aa: e1 ce rjmp .-574 ; 0x2736e case TempErrorSource::hotend: case TempErrorSource::bed: temp_runaway_stop( ((TempErrorType)temp_error_state.type == TempErrorType::preheat), ((TempErrorSource)temp_error_state.source == TempErrorSource::bed)); 275ac: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 275b0: 86 95 lsr r24 275b2: 86 95 lsr r24 275b4: 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), 275b6: 90 91 1a 05 lds r25, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 275ba: 92 95 swap r25 275bc: 96 95 lsr r25 275be: 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( 275c0: 61 e0 ldi r22, 0x01 ; 1 275c2: 81 30 cpi r24, 0x01 ; 1 275c4: 09 f0 breq .+2 ; 0x275c8 275c6: 60 e0 ldi r22, 0x00 ; 0 275c8: 81 e0 ldi r24, 0x01 ; 1 275ca: 92 30 cpi r25, 0x02 ; 2 275cc: 09 f0 breq .+2 ; 0x275d0 275ce: 80 e0 ldi r24, 0x00 ; 0 275d0: 0f 94 16 20 call 0x2402c ; 0x2402c 275d4: cc ce rjmp .-616 ; 0x2736e SERIAL_ECHOLNPGM("TM: error triggered!"); } ThermalStop(true); WRITE(BEEPER, HIGH); } else { temp_error_state.v = 0; 275d6: 10 92 1a 05 sts 0x051A, r1 ; 0x80051a <_ZL16temp_error_state.lto_priv.456> WRITE(BEEPER, LOW); 275da: 9f b7 in r25, 0x3f ; 63 275dc: f8 94 cli 275de: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 275e2: 8b 7f andi r24, 0xFB ; 251 275e4: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 275e8: 9f bf out 0x3f, r25 ; 63 // hotend error was transitory and disappeared, re-enable bed if (!target_temperature_bed) 275ea: 80 91 71 06 lds r24, 0x0671 ; 0x800671 275ee: 90 91 72 06 lds r25, 0x0672 ; 0x800672 275f2: 89 2b or r24, r25 275f4: 39 f4 brne .+14 ; 0x27604 target_temperature_bed = saved_bed_temperature; 275f6: 80 91 ad 05 lds r24, 0x05AD ; 0x8005ad 275fa: 90 e0 ldi r25, 0x00 ; 0 275fc: 90 93 72 06 sts 0x0672, r25 ; 0x800672 27600: 80 93 71 06 sts 0x0671, r24 ; 0x800671 SERIAL_ECHOLNPGM("TM: error cleared"); 27604: 88 e2 ldi r24, 0x28 ; 40 27606: 9b e9 ldi r25, 0x9B ; 155 27608: 0e 94 13 79 call 0xf226 ; 0xf226 2760c: b0 ce rjmp .-672 ; 0x2736e 0002760e : } bool lcd_wait_for_click_delay(uint16_t nDelay) // nDelay :: timeout [s] (0 ~ no timeout) // true ~ clicked, false ~ delayed { 2760e: 4f 92 push r4 27610: 5f 92 push r5 27612: 6f 92 push r6 27614: 7f 92 push r7 27616: 8f 92 push r8 27618: 9f 92 push r9 2761a: af 92 push r10 2761c: bf 92 push r11 2761e: cf 92 push r12 27620: df 92 push r13 27622: ef 92 push r14 27624: ff 92 push r15 27626: 6c 01 movw r12, r24 bool bDelayed; long nTime0 = _millis()/1000; 27628: 0f 94 28 2a call 0x25450 ; 0x25450 2762c: 28 ee ldi r18, 0xE8 ; 232 2762e: 33 e0 ldi r19, 0x03 ; 3 27630: 40 e0 ldi r20, 0x00 ; 0 27632: 50 e0 ldi r21, 0x00 ; 0 27634: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 27638: 29 01 movw r4, r18 2763a: 3a 01 movw r6, r20 lcd_consume_click(); 2763c: 0e 94 90 70 call 0xe120 ; 0xe120 KEEPALIVE_STATE(PAUSED_FOR_USER); 27640: 84 e0 ldi r24, 0x04 ; 4 27642: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be for (;;) { manage_heater(); manage_inactivity(true); bDelayed = ((_millis()/1000-nTime0) > nDelay); 27646: f1 2c mov r15, r1 27648: e1 2c mov r14, r1 bool bDelayed; long nTime0 = _millis()/1000; lcd_consume_click(); KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { manage_heater(); 2764a: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 2764e: 81 e0 ldi r24, 0x01 ; 1 27650: 0e 94 4f 8a call 0x1149e ; 0x1149e bDelayed = ((_millis()/1000-nTime0) > nDelay); 27654: 0f 94 28 2a call 0x25450 ; 0x25450 27658: 28 ee ldi r18, 0xE8 ; 232 2765a: 33 e0 ldi r19, 0x03 ; 3 2765c: 40 e0 ldi r20, 0x00 ; 0 2765e: 50 e0 ldi r21, 0x00 ; 0 27660: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 27664: 49 01 movw r8, r18 27666: 5a 01 movw r10, r20 27668: 84 18 sub r8, r4 2766a: 95 08 sbc r9, r5 2766c: a6 08 sbc r10, r6 2766e: b7 08 sbc r11, r7 bDelayed = (bDelayed && (nDelay != 0)); // 0 ~ no timeout, always waiting for click if (lcd_clicked() || bDelayed) { 27670: 0e 94 95 70 call 0xe12a ; 0xe12a 27674: 81 11 cpse r24, r1 27676: 07 c0 rjmp .+14 ; 0x27686 27678: c8 14 cp r12, r8 2767a: d9 04 cpc r13, r9 2767c: ea 04 cpc r14, r10 2767e: fb 04 cpc r15, r11 27680: 20 f7 brcc .-56 ; 0x2764a 27682: 81 e0 ldi r24, 0x01 ; 1 27684: 07 c0 rjmp .+14 ; 0x27694 KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { manage_heater(); manage_inactivity(true); bDelayed = ((_millis()/1000-nTime0) > nDelay); bDelayed = (bDelayed && (nDelay != 0)); // 0 ~ no timeout, always waiting for click 27686: 81 e0 ldi r24, 0x01 ; 1 27688: c8 14 cp r12, r8 2768a: d9 04 cpc r13, r9 2768c: ea 04 cpc r14, r10 2768e: fb 04 cpc r15, r11 27690: 08 f0 brcs .+2 ; 0x27694 27692: 80 e0 ldi r24, 0x00 ; 0 if (lcd_clicked() || bDelayed) { KEEPALIVE_STATE(IN_HANDLER); 27694: 92 e0 ldi r25, 0x02 ; 2 27696: 90 93 be 02 sts 0x02BE, r25 ; 0x8002be return(!bDelayed); } } } 2769a: 91 e0 ldi r25, 0x01 ; 1 2769c: 89 27 eor r24, r25 2769e: ff 90 pop r15 276a0: ef 90 pop r14 276a2: df 90 pop r13 276a4: cf 90 pop r12 276a6: bf 90 pop r11 276a8: af 90 pop r10 276aa: 9f 90 pop r9 276ac: 8f 90 pop r8 276ae: 7f 90 pop r7 276b0: 6f 90 pop r6 276b2: 5f 90 pop r5 276b4: 4f 90 pop r4 276b6: 08 95 ret 000276b8 : #endif } static void waiting_handler() { manage_heater(); 276b8: 0f 94 34 39 call 0x27268 ; 0x27268 host_keepalive(); 276bc: 0e 94 3f 7f call 0xfe7e ; 0xfe7e host_autoreport(); 276c0: 0e 94 f0 78 call 0xf1e0 ; 0xf1e0 checkFans(); 276c4: 0e 94 9a 7f call 0xff34 ; 0xff34 lcd_update(0); 276c8: 80 e0 ldi r24, 0x00 ; 0 276ca: 0c 94 3f 6e jmp 0xdc7e ; 0xdc7e 000276ce : } } static void __attribute__((noinline)) wait_temp() { while(current_temperature[0] < (target_temperature[0] - TEMP_HYSTERESIS)) { 276ce: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 276d2: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 276d6: 65 50 subi r22, 0x05 ; 5 276d8: 71 09 sbc r23, r1 276da: 07 2e mov r0, r23 276dc: 00 0c add r0, r0 276de: 88 0b sbc r24, r24 276e0: 99 0b sbc r25, r25 276e2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 276e6: 9b 01 movw r18, r22 276e8: ac 01 movw r20, r24 276ea: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 276ee: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 276f2: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 276f6: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 276fa: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 276fe: 87 ff sbrs r24, 7 27700: 07 c0 rjmp .+14 ; 0x27710 if(temp_error_state.v) break; 27702: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 27706: 81 11 cpse r24, r1 27708: 03 c0 rjmp .+6 ; 0x27710 waiting_handler(); 2770a: 0f 94 5c 3b call 0x276b8 ; 0x276b8 2770e: df cf rjmp .-66 ; 0x276ce } } 27710: 08 95 ret 00027712 : checkFans(); lcd_update(0); } static void wait(unsigned ms) { 27712: cf 92 push r12 27714: df 92 push r13 27716: ef 92 push r14 27718: ff 92 push r15 2771a: 7c 01 movw r14, r24 unsigned long mark = _millis() + ms; 2771c: 0f 94 28 2a call 0x25450 ; 0x25450 27720: 9b 01 movw r18, r22 27722: ac 01 movw r20, r24 27724: 2e 0d add r18, r14 27726: 3f 1d adc r19, r15 27728: 41 1d adc r20, r1 2772a: 51 1d adc r21, r1 2772c: 69 01 movw r12, r18 2772e: 7a 01 movw r14, r20 while(_millis() < mark) { 27730: 0f 94 28 2a call 0x25450 ; 0x25450 27734: 6c 15 cp r22, r12 27736: 7d 05 cpc r23, r13 27738: 8e 05 cpc r24, r14 2773a: 9f 05 cpc r25, r15 2773c: 38 f4 brcc .+14 ; 0x2774c if(temp_error_state.v) break; 2773e: 80 91 1a 05 lds r24, 0x051A ; 0x80051a <_ZL16temp_error_state.lto_priv.456> 27742: 81 11 cpse r24, r1 27744: 03 c0 rjmp .+6 ; 0x2774c waiting_handler(); 27746: 0f 94 5c 3b call 0x276b8 ; 0x276b8 2774a: f2 cf rjmp .-28 ; 0x27730 } } 2774c: ff 90 pop r15 2774e: ef 90 pop r14 27750: df 90 pop r13 27752: cf 90 pop r12 27754: 08 95 ret 00027756 : 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; 27756: 20 91 29 0e lds r18, 0x0E29 ; 0x800e29 2775a: 30 91 2a 0e lds r19, 0x0E2A ; 0x800e2a 2775e: 40 91 2b 0e lds r20, 0x0E2B ; 0x800e2b 27762: 50 91 2c 0e lds r21, 0x0E2C ; 0x800e2c 27766: 60 e0 ldi r22, 0x00 ; 0 27768: 70 e0 ldi r23, 0x00 ; 0 2776a: 8f e7 ldi r24, 0x7F ; 127 2776c: 93 e4 ldi r25, 0x43 ; 67 2776e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 27772: 60 93 ae 04 sts 0x04AE, r22 ; 0x8004ae <_ZL14iState_sum_max.lto_priv.471> 27776: 70 93 af 04 sts 0x04AF, r23 ; 0x8004af <_ZL14iState_sum_max.lto_priv.471+0x1> 2777a: 80 93 b0 04 sts 0x04B0, r24 ; 0x8004b0 <_ZL14iState_sum_max.lto_priv.471+0x2> 2777e: 90 93 b1 04 sts 0x04B1, r25 ; 0x8004b1 <_ZL14iState_sum_max.lto_priv.471+0x3> } #endif #ifdef PIDTEMPBED temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi; 27782: 20 91 35 0e lds r18, 0x0E35 ; 0x800e35 27786: 30 91 36 0e lds r19, 0x0E36 ; 0x800e36 2778a: 40 91 37 0e lds r20, 0x0E37 ; 0x800e37 2778e: 50 91 38 0e lds r21, 0x0E38 ; 0x800e38 27792: 60 e0 ldi r22, 0x00 ; 0 27794: 70 e0 ldi r23, 0x00 ; 0 27796: 8f e7 ldi r24, 0x7F ; 127 27798: 93 e4 ldi r25, 0x43 ; 67 2779a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2779e: 60 93 a6 04 sts 0x04A6, r22 ; 0x8004a6 <_ZL19temp_iState_max_bed.lto_priv.469> 277a2: 70 93 a7 04 sts 0x04A7, r23 ; 0x8004a7 <_ZL19temp_iState_max_bed.lto_priv.469+0x1> 277a6: 80 93 a8 04 sts 0x04A8, r24 ; 0x8004a8 <_ZL19temp_iState_max_bed.lto_priv.469+0x2> 277aa: 90 93 a9 04 sts 0x04A9, r25 ; 0x8004a9 <_ZL19temp_iState_max_bed.lto_priv.469+0x3> #endif } 277ae: 08 95 ret 000277b0 : #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) { 277b0: 2f 92 push r2 277b2: 3f 92 push r3 277b4: 4f 92 push r4 277b6: 5f 92 push r5 277b8: 6f 92 push r6 277ba: 7f 92 push r7 277bc: 8f 92 push r8 277be: 9f 92 push r9 277c0: af 92 push r10 277c2: bf 92 push r11 277c4: cf 92 push r12 277c6: df 92 push r13 277c8: ef 92 push r14 277ca: ff 92 push r15 277cc: 0f 93 push r16 277ce: 1f 93 push r17 277d0: cf 93 push r28 277d2: df 93 push r29 277d4: cd b7 in r28, 0x3d ; 61 277d6: de b7 in r29, 0x3e ; 62 277d8: e0 97 sbiw r28, 0x30 ; 48 277da: 0f b6 in r0, 0x3f ; 63 277dc: f8 94 cli 277de: de bf out 0x3e, r29 ; 62 277e0: 0f be out 0x3f, r0 ; 63 277e2: cd bf out 0x3d, r28 ; 61 277e4: 6a 87 std Y+10, r22 ; 0x0a 277e6: 7b 87 std Y+11, r23 ; 0x0b 277e8: 8c 87 std Y+12, r24 ; 0x0c 277ea: 9d 87 std Y+13, r25 ; 0x0d 277ec: 1a 01 movw r2, r20 277ee: 3a a7 std Y+42, r19 ; 0x2a 277f0: 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(); 277f2: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 pid_tuning_finished = false; 277f6: 10 92 3e 02 sts 0x023E, r1 ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> // 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; 277fa: 29 a5 ldd r18, Y+41 ; 0x29 277fc: 3a a5 ldd r19, Y+42 ; 0x2a 277fe: 30 93 47 06 sts 0x0647, r19 ; 0x800647 27802: 20 93 46 06 sts 0x0646, r18 ; 0x800646 float input = 0.0; pid_cycle=0; 27806: 10 92 49 06 sts 0x0649, r1 ; 0x800649 2780a: 10 92 48 06 sts 0x0648, r1 ; 0x800648 bool heating = true; unsigned long temp_millis = _millis(); 2780e: 0f 94 28 2a call 0x25450 ; 0x25450 27812: 6e 83 std Y+6, r22 ; 0x06 27814: 7f 83 std Y+7, r23 ; 0x07 27816: 88 87 std Y+8, r24 ; 0x08 27818: 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 2781a: 37 fe sbrs r3, 7 2781c: ff c0 rjmp .+510 ; 0x27a1c 2781e: 3d e2 ldi r19, 0x2D ; 45 27820: 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(); 27822: 0f 94 28 2a call 0x25450 ; 0x25450 27826: 6c a3 std Y+36, r22 ; 0x24 27828: 7d a3 std Y+37, r23 ; 0x25 2782a: 8e a3 std Y+38, r24 ; 0x26 2782c: 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."); 2782e: 88 ea ldi r24, 0xA8 ; 168 27830: 9a e9 ldi r25, 0x9A ; 154 #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) unsigned long extruder_autofan_last_check = _millis(); #endif if ((extruder >= EXTRUDERS) 27832: 12 14 cp r1, r2 27834: 13 04 cpc r1, r3 27836: 0c f4 brge .+2 ; 0x2783a 27838: 8a c2 rjmp .+1300 ; 0x27d4e pid_tuning_finished = true; pid_cycle = 0; return; } SERIAL_ECHOLNPGM("PID Autotune start"); 2783a: 85 e9 ldi r24, 0x95 ; 149 2783c: 9a e9 ldi r25, 0x9A ; 154 2783e: 0e 94 13 79 call 0xf226 ; 0xf226 27842: 6a 85 ldd r22, Y+10 ; 0x0a 27844: 7b 85 ldd r23, Y+11 ; 0x0b 27846: 8c 85 ldd r24, Y+12 ; 0x0c 27848: 9d 85 ldd r25, Y+13 ; 0x0d 2784a: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> if (extruder<0) { soft_pwm_bed = (MAX_BED_POWER)/2; 2784e: 2f e7 ldi r18, 0x7F ; 127 return; } SERIAL_ECHOLNPGM("PID Autotune start"); if (extruder<0) 27850: 21 14 cp r2, r1 27852: 31 04 cpc r3, r1 27854: 09 f4 brne .+2 ; 0x27858 27856: e5 c0 rjmp .+458 ; 0x27a22 { soft_pwm_bed = (MAX_BED_POWER)/2; 27858: 20 93 1c 06 sts 0x061C, r18 ; 0x80061c bias = d = (MAX_BED_POWER)/2; target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen 2785c: 70 93 72 06 sts 0x0672, r23 ; 0x800672 27860: 60 93 71 06 sts 0x0671, r22 ; 0x800671 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 27864: 8e 81 ldd r24, Y+6 ; 0x06 27866: 9f 81 ldd r25, Y+7 ; 0x07 27868: a8 85 ldd r26, Y+8 ; 0x08 2786a: b9 85 ldd r27, Y+9 ; 0x09 2786c: 8e 87 std Y+14, r24 ; 0x0e 2786e: 9f 87 std Y+15, r25 ; 0x0f 27870: a8 8b std Y+16, r26 ; 0x10 27872: b9 8b std Y+17, r27 ; 0x11 27874: 88 a3 std Y+32, r24 ; 0x20 27876: 99 a3 std Y+33, r25 ; 0x21 27878: aa a3 std Y+34, r26 ; 0x22 2787a: bb a3 std Y+35, r27 ; 0x23 2787c: 1a 8a std Y+18, r1 ; 0x12 2787e: 90 e4 ldi r25, 0x40 ; 64 27880: 9b 8b std Y+19, r25 ; 0x13 27882: ac e1 ldi r26, 0x1C ; 28 27884: ac 8b std Y+20, r26 ; 0x14 27886: b6 e4 ldi r27, 0x46 ; 70 27888: bd 8b std Y+21, r27 ; 0x15 2788a: 1e 8a std Y+22, r1 ; 0x16 2788c: 1f 8a std Y+23, r1 ; 0x17 2788e: 18 8e std Y+24, r1 ; 0x18 27890: 19 8e std Y+25, r1 ; 0x19 27892: 6f e7 ldi r22, 0x7F ; 127 27894: c6 2e mov r12, r22 27896: d1 2c mov r13, r1 27898: e1 2c mov r14, r1 2789a: f1 2c mov r15, r1 2789c: 00 e0 ldi r16, 0x00 ; 0 2789e: 10 e0 ldi r17, 0x00 ; 0 278a0: 18 aa std Y+48, r1 ; 0x30 278a2: 1f a6 std Y+47, r1 ; 0x2f 278a4: 1d 82 std Y+5, r1 ; 0x05 278a6: 2f e7 ldi r18, 0x7F ; 127 278a8: 30 e0 ldi r19, 0x00 ; 0 278aa: 40 e0 ldi r20, 0x00 ; 0 278ac: 50 e0 ldi r21, 0x00 ; 0 278ae: 29 83 std Y+1, r18 ; 0x01 278b0: 3a 83 std Y+2, r19 ; 0x02 278b2: 4b 83 std Y+3, r20 ; 0x03 278b4: 5c 83 std Y+4, r21 ; 0x04 278b6: 1b 8e std Y+27, r1 ; 0x1b 278b8: 1c 8e std Y+28, r1 ; 0x1c 278ba: 1d 8e std Y+29, r1 ; 0x1d 278bc: 1e 8e std Y+30, r1 ; 0x1e 278be: 31 e0 ldi r19, 0x01 ; 1 278c0: 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(); 278c2: a8 95 wdr #endif //WATCHDOG if(temp_meas_ready == true) { // temp sample ready 278c4: 40 91 01 06 lds r20, 0x0601 ; 0x800601 278c8: 48 a7 std Y+40, r20 ; 0x28 278ca: 44 23 and r20, r20 278cc: 09 f4 brne .+2 ; 0x278d0 278ce: 2c c2 rjmp .+1112 ; 0x27d28 updateTemperatures(); 278d0: 0f 94 55 33 call 0x266aa ; 0x266aa input = (extruder<0)?current_temperature_bed:current_temperature[extruder]; 278d4: 21 14 cp r2, r1 278d6: 31 04 cpc r3, r1 278d8: 09 f0 breq .+2 ; 0x278dc 278da: aa c0 rjmp .+340 ; 0x27a30 278dc: 00 91 af 0d lds r16, 0x0DAF ; 0x800daf 278e0: 10 91 b0 0d lds r17, 0x0DB0 ; 0x800db0 278e4: 50 91 b1 0d lds r21, 0x0DB1 ; 0x800db1 278e8: 58 ab std Y+48, r21 ; 0x30 278ea: 80 91 b2 0d lds r24, 0x0DB2 ; 0x800db2 278ee: 8f a7 std Y+47, r24 ; 0x2f max=max(max,input); 278f0: 2e 89 ldd r18, Y+22 ; 0x16 278f2: 3f 89 ldd r19, Y+23 ; 0x17 278f4: 48 8d ldd r20, Y+24 ; 0x18 278f6: 59 8d ldd r21, Y+25 ; 0x19 278f8: b8 01 movw r22, r16 278fa: 88 a9 ldd r24, Y+48 ; 0x30 278fc: 9f a5 ldd r25, Y+47 ; 0x2f 278fe: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 27902: 87 fd sbrc r24, 7 27904: 06 c0 rjmp .+12 ; 0x27912 27906: 0e 8b std Y+22, r16 ; 0x16 27908: 1f 8b std Y+23, r17 ; 0x17 2790a: b8 a9 ldd r27, Y+48 ; 0x30 2790c: b8 8f std Y+24, r27 ; 0x18 2790e: 2f a5 ldd r18, Y+47 ; 0x2f 27910: 29 8f std Y+25, r18 ; 0x19 min=min(min,input); 27912: 2a 89 ldd r18, Y+18 ; 0x12 27914: 3b 89 ldd r19, Y+19 ; 0x13 27916: 4c 89 ldd r20, Y+20 ; 0x14 27918: 5d 89 ldd r21, Y+21 ; 0x15 2791a: b8 01 movw r22, r16 2791c: 88 a9 ldd r24, Y+48 ; 0x30 2791e: 9f a5 ldd r25, Y+47 ; 0x2f 27920: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 27924: 18 16 cp r1, r24 27926: 34 f0 brlt .+12 ; 0x27934 27928: 0a 8b std Y+18, r16 ; 0x12 2792a: 1b 8b std Y+19, r17 ; 0x13 2792c: 38 a9 ldd r19, Y+48 ; 0x30 2792e: 3c 8b std Y+20, r19 ; 0x14 27930: 4f a5 ldd r20, Y+47 ; 0x2f 27932: 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) { 27934: 0f 94 28 2a call 0x25450 ; 0x25450 27938: 2c a1 ldd r18, Y+36 ; 0x24 2793a: 3d a1 ldd r19, Y+37 ; 0x25 2793c: 4e a1 ldd r20, Y+38 ; 0x26 2793e: 5f a1 ldd r21, Y+39 ; 0x27 27940: 62 1b sub r22, r18 27942: 73 0b sbc r23, r19 27944: 84 0b sbc r24, r20 27946: 95 0b sbc r25, r21 27948: 65 3c cpi r22, 0xC5 ; 197 2794a: 79 40 sbci r23, 0x09 ; 9 2794c: 81 05 cpc r24, r1 2794e: 91 05 cpc r25, r1 27950: 40 f0 brcs .+16 ; 0x27962 checkExtruderAutoFans(); 27952: 0e 94 3f 75 call 0xea7e ; 0xea7e extruder_autofan_last_check = _millis(); 27956: 0f 94 28 2a call 0x25450 ; 0x25450 2795a: 6c a3 std Y+36, r22 ; 0x24 2795c: 7d a3 std Y+37, r23 ; 0x25 2795e: 8e a3 std Y+38, r24 ; 0x26 27960: 9f a3 std Y+39, r25 ; 0x27 } #endif if(heating == true && input > temp) { 27962: 4a 8d ldd r20, Y+26 ; 0x1a 27964: 44 23 and r20, r20 27966: 09 f4 brne .+2 ; 0x2796a 27968: 4c c0 rjmp .+152 ; 0x27a02 2796a: 2a 85 ldd r18, Y+10 ; 0x0a 2796c: 3b 85 ldd r19, Y+11 ; 0x0b 2796e: 4c 85 ldd r20, Y+12 ; 0x0c 27970: 5d 85 ldd r21, Y+13 ; 0x0d 27972: b8 01 movw r22, r16 27974: 88 a9 ldd r24, Y+48 ; 0x30 27976: 9f a5 ldd r25, Y+47 ; 0x2f 27978: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2797c: 18 16 cp r1, r24 2797e: 0c f0 brlt .+2 ; 0x27982 27980: d3 c1 rjmp .+934 ; 0x27d28 if(_millis() - t2 > 5000) { 27982: 0f 94 28 2a call 0x25450 ; 0x25450 27986: 2e 85 ldd r18, Y+14 ; 0x0e 27988: 3f 85 ldd r19, Y+15 ; 0x0f 2798a: 48 89 ldd r20, Y+16 ; 0x10 2798c: 59 89 ldd r21, Y+17 ; 0x11 2798e: 62 1b sub r22, r18 27990: 73 0b sbc r23, r19 27992: 84 0b sbc r24, r20 27994: 95 0b sbc r25, r21 27996: 69 38 cpi r22, 0x89 ; 137 27998: 73 41 sbci r23, 0x13 ; 19 2799a: 81 05 cpc r24, r1 2799c: 91 05 cpc r25, r1 2799e: 08 f4 brcc .+2 ; 0x279a2 279a0: c3 c1 rjmp .+902 ; 0x27d28 279a2: d7 01 movw r26, r14 279a4: c6 01 movw r24, r12 279a6: 29 81 ldd r18, Y+1 ; 0x01 279a8: 3a 81 ldd r19, Y+2 ; 0x02 279aa: 4b 81 ldd r20, Y+3 ; 0x03 279ac: 5c 81 ldd r21, Y+4 ; 0x04 279ae: 82 1b sub r24, r18 279b0: 93 0b sbc r25, r19 279b2: a4 0b sbc r26, r20 279b4: b5 0b sbc r27, r21 279b6: b5 95 asr r27 279b8: a7 95 ror r26 279ba: 97 95 ror r25 279bc: 87 95 ror r24 heating=false; if (extruder<0) { 279be: 21 14 cp r2, r1 279c0: 31 04 cpc r3, r1 279c2: 09 f4 brne .+2 ; 0x279c6 279c4: 40 c0 rjmp .+128 ; 0x27a46 soft_pwm_bed = (bias - d) >> 1; 279c6: 80 93 1c 06 sts 0x061C, r24 ; 0x80061c } else soft_pwm[extruder] = (bias - d) >> 1; t1=_millis(); 279ca: 0f 94 28 2a call 0x25450 ; 0x25450 279ce: 6e 83 std Y+6, r22 ; 0x06 279d0: 7f 83 std Y+7, r23 ; 0x07 279d2: 88 87 std Y+8, r24 ; 0x08 279d4: 99 87 std Y+9, r25 ; 0x09 t_high=t1 - t2; 279d6: dc 01 movw r26, r24 279d8: cb 01 movw r24, r22 279da: 2e 85 ldd r18, Y+14 ; 0x0e 279dc: 3f 85 ldd r19, Y+15 ; 0x0f 279de: 48 89 ldd r20, Y+16 ; 0x10 279e0: 59 89 ldd r21, Y+17 ; 0x11 279e2: 82 1b sub r24, r18 279e4: 93 0b sbc r25, r19 279e6: a4 0b sbc r26, r20 279e8: b5 0b sbc r27, r21 279ea: 8b 8f std Y+27, r24 ; 0x1b 279ec: 9c 8f std Y+28, r25 ; 0x1c 279ee: ad 8f std Y+29, r26 ; 0x1d 279f0: be 8f std Y+30, r27 ; 0x1e max=temp; 279f2: 3a 85 ldd r19, Y+10 ; 0x0a 279f4: 3e 8b std Y+22, r19 ; 0x16 279f6: 4b 85 ldd r20, Y+11 ; 0x0b 279f8: 4f 8b std Y+23, r20 ; 0x17 279fa: 5c 85 ldd r21, Y+12 ; 0x0c 279fc: 58 8f std Y+24, r21 ; 0x18 279fe: 8d 85 ldd r24, Y+13 ; 0x0d 27a00: 89 8f std Y+25, r24 ; 0x19 } } if(heating == false && input < temp) { 27a02: 2a 85 ldd r18, Y+10 ; 0x0a 27a04: 3b 85 ldd r19, Y+11 ; 0x0b 27a06: 4c 85 ldd r20, Y+12 ; 0x0c 27a08: 5d 85 ldd r21, Y+13 ; 0x0d 27a0a: b8 01 movw r22, r16 27a0c: 88 a9 ldd r24, Y+48 ; 0x30 27a0e: 9f a5 ldd r25, Y+47 ; 0x2f 27a10: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 27a14: 87 fd sbrc r24, 7 27a16: 1a c0 rjmp .+52 ; 0x27a4c if(_millis() - t1 > 5000) { 27a18: 1a 8e std Y+26, r1 ; 0x1a 27a1a: 86 c1 rjmp .+780 ; 0x27d28 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 27a1c: 4a e0 ldi r20, 0x0A ; 10 27a1e: 4f 8f std Y+31, r20 ; 0x1f 27a20: 00 cf rjmp .-512 ; 0x27822 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; 27a22: 20 93 15 05 sts 0x0515, r18 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> bias = d = (PID_MAX)/2; target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen 27a26: 70 93 b6 0d sts 0x0DB6, r23 ; 0x800db6 27a2a: 60 93 b5 0d sts 0x0DB5, r22 ; 0x800db5 27a2e: 1a cf rjmp .-460 ; 0x27864 wdt_reset(); #endif //WATCHDOG if(temp_meas_ready == true) { // temp sample ready updateTemperatures(); input = (extruder<0)?current_temperature_bed:current_temperature[extruder]; 27a30: 00 91 ed 04 lds r16, 0x04ED ; 0x8004ed 27a34: 10 91 ee 04 lds r17, 0x04EE ; 0x8004ee 27a38: 90 91 ef 04 lds r25, 0x04EF ; 0x8004ef 27a3c: 98 ab std Y+48, r25 ; 0x30 27a3e: a0 91 f0 04 lds r26, 0x04F0 ; 0x8004f0 27a42: af a7 std Y+47, r26 ; 0x2f 27a44: 55 cf rjmp .-342 ; 0x278f0 heating=false; if (extruder<0) { soft_pwm_bed = (bias - d) >> 1; } else soft_pwm[extruder] = (bias - d) >> 1; 27a46: 80 93 15 05 sts 0x0515, r24 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 27a4a: bf cf rjmp .-130 ; 0x279ca t_high=t1 - t2; max=temp; } } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { 27a4c: 0f 94 28 2a call 0x25450 ; 0x25450 27a50: 2e 81 ldd r18, Y+6 ; 0x06 27a52: 3f 81 ldd r19, Y+7 ; 0x07 27a54: 48 85 ldd r20, Y+8 ; 0x08 27a56: 59 85 ldd r21, Y+9 ; 0x09 27a58: 62 1b sub r22, r18 27a5a: 73 0b sbc r23, r19 27a5c: 84 0b sbc r24, r20 27a5e: 95 0b sbc r25, r21 27a60: 69 38 cpi r22, 0x89 ; 137 27a62: 73 41 sbci r23, 0x13 ; 19 27a64: 81 05 cpc r24, r1 27a66: 91 05 cpc r25, r1 27a68: b8 f2 brcs .-82 ; 0x27a18 heating=true; t2=_millis(); 27a6a: 0f 94 28 2a call 0x25450 ; 0x25450 27a6e: 6e 87 std Y+14, r22 ; 0x0e 27a70: 7f 87 std Y+15, r23 ; 0x0f 27a72: 88 8b std Y+16, r24 ; 0x10 27a74: 99 8b std Y+17, r25 ; 0x11 t_low=t2 - t1; if(pid_cycle > 0) { 27a76: 80 91 48 06 lds r24, 0x0648 ; 0x800648 27a7a: 90 91 49 06 lds r25, 0x0649 ; 0x800649 27a7e: 18 16 cp r1, r24 27a80: 19 06 cpc r1, r25 27a82: 0c f0 brlt .+2 ; 0x27a86 27a84: 2c c1 rjmp .+600 ; 0x27cde } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { heating=true; t2=_millis(); t_low=t2 - t1; 27a86: 8e 85 ldd r24, Y+14 ; 0x0e 27a88: 9f 85 ldd r25, Y+15 ; 0x0f 27a8a: a8 89 ldd r26, Y+16 ; 0x10 27a8c: b9 89 ldd r27, Y+17 ; 0x11 27a8e: 2e 81 ldd r18, Y+6 ; 0x06 27a90: 3f 81 ldd r19, Y+7 ; 0x07 27a92: 48 85 ldd r20, Y+8 ; 0x08 27a94: 59 85 ldd r21, Y+9 ; 0x09 27a96: 82 1b sub r24, r18 27a98: 93 0b sbc r25, r19 27a9a: a4 0b sbc r26, r20 27a9c: b5 0b sbc r27, r21 if(pid_cycle > 0) { bias += (d*(t_high - t_low))/(t_low + t_high); 27a9e: 4b 8c ldd r4, Y+27 ; 0x1b 27aa0: 5c 8c ldd r5, Y+28 ; 0x1c 27aa2: 6d 8c ldd r6, Y+29 ; 0x1d 27aa4: 7e 8c ldd r7, Y+30 ; 0x1e 27aa6: 48 0e add r4, r24 27aa8: 59 1e adc r5, r25 27aaa: 6a 1e adc r6, r26 27aac: 7b 1e adc r7, r27 27aae: 2b 8d ldd r18, Y+27 ; 0x1b 27ab0: 3c 8d ldd r19, Y+28 ; 0x1c 27ab2: 4d 8d ldd r20, Y+29 ; 0x1d 27ab4: 5e 8d ldd r21, Y+30 ; 0x1e 27ab6: 28 1b sub r18, r24 27ab8: 39 0b sbc r19, r25 27aba: 4a 0b sbc r20, r26 27abc: 5b 0b sbc r21, r27 27abe: 69 81 ldd r22, Y+1 ; 0x01 27ac0: 7a 81 ldd r23, Y+2 ; 0x02 27ac2: 8b 81 ldd r24, Y+3 ; 0x03 27ac4: 9c 81 ldd r25, Y+4 ; 0x04 27ac6: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 27aca: a3 01 movw r20, r6 27acc: 92 01 movw r18, r4 27ace: 0f 94 01 dd call 0x3ba02 ; 0x3ba02 <__divmodsi4> 27ad2: da 01 movw r26, r20 27ad4: c9 01 movw r24, r18 27ad6: 8c 0d add r24, r12 27ad8: 9d 1d adc r25, r13 27ada: ae 1d adc r26, r14 27adc: bf 1d adc r27, r15 bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20); 27ade: 84 31 cpi r24, 0x14 ; 20 27ae0: 91 05 cpc r25, r1 27ae2: a1 05 cpc r26, r1 27ae4: b1 05 cpc r27, r1 27ae6: 0c f4 brge .+2 ; 0x27aea 27ae8: 3c c1 rjmp .+632 ; 0x27d62 27aea: 6c 01 movw r12, r24 27aec: 7d 01 movw r14, r26 27aee: 3c ee ldi r19, 0xEC ; 236 27af0: c3 16 cp r12, r19 27af2: d1 04 cpc r13, r1 27af4: e1 04 cpc r14, r1 27af6: f1 04 cpc r15, r1 27af8: 2c f0 brlt .+10 ; 0x27b04 27afa: 4b ee ldi r20, 0xEB ; 235 27afc: c4 2e mov r12, r20 27afe: d1 2c mov r13, r1 27b00: e1 2c mov r14, r1 27b02: 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; 27b04: 80 38 cpi r24, 0x80 ; 128 27b06: 91 05 cpc r25, r1 27b08: a1 05 cpc r26, r1 27b0a: b1 05 cpc r27, r1 27b0c: 0c f4 brge .+2 ; 0x27b10 27b0e: 37 c1 rjmp .+622 ; 0x27d7e 27b10: 8e ef ldi r24, 0xFE ; 254 27b12: 90 e0 ldi r25, 0x00 ; 0 27b14: a0 e0 ldi r26, 0x00 ; 0 27b16: b0 e0 ldi r27, 0x00 ; 0 27b18: 8c 19 sub r24, r12 27b1a: 9d 09 sbc r25, r13 27b1c: ae 09 sbc r26, r14 27b1e: bf 09 sbc r27, r15 27b20: 89 83 std Y+1, r24 ; 0x01 27b22: 9a 83 std Y+2, r25 ; 0x02 27b24: ab 83 std Y+3, r26 ; 0x03 27b26: bc 83 std Y+4, r27 ; 0x04 else d = bias; SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); 27b28: 8d e8 ldi r24, 0x8D ; 141 27b2a: 9a e9 ldi r25, 0x9A ; 154 27b2c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27b30: c7 01 movw r24, r14 27b32: b6 01 movw r22, r12 27b34: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d); 27b38: 88 e8 ldi r24, 0x88 ; 136 27b3a: 9a e9 ldi r25, 0x9A ; 154 27b3c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27b40: 69 81 ldd r22, Y+1 ; 0x01 27b42: 7a 81 ldd r23, Y+2 ; 0x02 27b44: 8b 81 ldd r24, Y+3 ; 0x03 27b46: 9c 81 ldd r25, Y+4 ; 0x04 27b48: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min); 27b4c: 81 e8 ldi r24, 0x81 ; 129 27b4e: 9a e9 ldi r25, 0x9A ; 154 27b50: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 27b54: 42 e0 ldi r20, 0x02 ; 2 27b56: 6a 89 ldd r22, Y+18 ; 0x12 27b58: 7b 89 ldd r23, Y+19 ; 0x13 27b5a: 8c 89 ldd r24, Y+20 ; 0x14 27b5c: 9d 89 ldd r25, Y+21 ; 0x15 27b5e: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max); 27b62: 8a e7 ldi r24, 0x7A ; 122 27b64: 9a e9 ldi r25, 0x9A ; 154 27b66: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27b6a: 6e 89 ldd r22, Y+22 ; 0x16 27b6c: 7f 89 ldd r23, Y+23 ; 0x17 27b6e: 88 8d ldd r24, Y+24 ; 0x18 27b70: 99 8d ldd r25, Y+25 ; 0x19 27b72: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 if(pid_cycle > 2) { 27b76: 80 91 48 06 lds r24, 0x0648 ; 0x800648 27b7a: 90 91 49 06 lds r25, 0x0649 ; 0x800649 27b7e: 03 97 sbiw r24, 0x03 ; 3 27b80: 0c f4 brge .+2 ; 0x27b84 27b82: ad c0 rjmp .+346 ; 0x27cde Ku = (4.0*d)/(3.14159*(max-min)/2.0); 27b84: 69 81 ldd r22, Y+1 ; 0x01 27b86: 7a 81 ldd r23, Y+2 ; 0x02 27b88: 8b 81 ldd r24, Y+3 ; 0x03 27b8a: 9c 81 ldd r25, Y+4 ; 0x04 27b8c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 27b90: 20 e0 ldi r18, 0x00 ; 0 27b92: 30 e0 ldi r19, 0x00 ; 0 27b94: 40 e8 ldi r20, 0x80 ; 128 27b96: 50 e4 ldi r21, 0x40 ; 64 27b98: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27b9c: 4b 01 movw r8, r22 27b9e: 5c 01 movw r10, r24 27ba0: 2a 89 ldd r18, Y+18 ; 0x12 27ba2: 3b 89 ldd r19, Y+19 ; 0x13 27ba4: 4c 89 ldd r20, Y+20 ; 0x14 27ba6: 5d 89 ldd r21, Y+21 ; 0x15 27ba8: 6e 89 ldd r22, Y+22 ; 0x16 27baa: 7f 89 ldd r23, Y+23 ; 0x17 27bac: 88 8d ldd r24, Y+24 ; 0x18 27bae: 99 8d ldd r25, Y+25 ; 0x19 27bb0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 27bb4: 20 ed ldi r18, 0xD0 ; 208 27bb6: 3f e0 ldi r19, 0x0F ; 15 27bb8: 49 e4 ldi r20, 0x49 ; 73 27bba: 50 e4 ldi r21, 0x40 ; 64 27bbc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27bc0: 20 e0 ldi r18, 0x00 ; 0 27bc2: 30 e0 ldi r19, 0x00 ; 0 27bc4: 40 e0 ldi r20, 0x00 ; 0 27bc6: 5f e3 ldi r21, 0x3F ; 63 27bc8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27bcc: 9b 01 movw r18, r22 27bce: ac 01 movw r20, r24 27bd0: c5 01 movw r24, r10 27bd2: b4 01 movw r22, r8 27bd4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 27bd8: 4b 01 movw r8, r22 27bda: 5c 01 movw r10, r24 Tu = ((float)(t_low + t_high)/1000.0); 27bdc: c3 01 movw r24, r6 27bde: b2 01 movw r22, r4 27be0: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 27be4: 20 e0 ldi r18, 0x00 ; 0 27be6: 30 e0 ldi r19, 0x00 ; 0 27be8: 4a e7 ldi r20, 0x7A ; 122 27bea: 54 e4 ldi r21, 0x44 ; 68 27bec: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 27bf0: 2b 01 movw r4, r22 27bf2: 3c 01 movw r6, r24 SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku); 27bf4: 84 e7 ldi r24, 0x74 ; 116 27bf6: 9a e9 ldi r25, 0x9A ; 154 27bf8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27bfc: 42 e0 ldi r20, 0x02 ; 2 27bfe: c5 01 movw r24, r10 27c00: b4 01 movw r22, r8 27c02: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu); 27c06: 8e e6 ldi r24, 0x6E ; 110 27c08: 9a e9 ldi r25, 0x9A ; 154 27c0a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27c0e: c3 01 movw r24, r6 27c10: b2 01 movw r22, r4 27c12: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 _Kp = 0.6*Ku; 27c16: 2a e9 ldi r18, 0x9A ; 154 27c18: 39 e9 ldi r19, 0x99 ; 153 27c1a: 49 e1 ldi r20, 0x19 ; 25 27c1c: 5f e3 ldi r21, 0x3F ; 63 27c1e: c5 01 movw r24, r10 27c20: b4 01 movw r22, r8 27c22: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27c26: 4b 01 movw r8, r22 27c28: 5c 01 movw r10, r24 27c2a: 80 92 f2 03 sts 0x03F2, r8 ; 0x8003f2 <_Kp> 27c2e: 90 92 f3 03 sts 0x03F3, r9 ; 0x8003f3 <_Kp+0x1> 27c32: a0 92 f4 03 sts 0x03F4, r10 ; 0x8003f4 <_Kp+0x2> 27c36: b0 92 f5 03 sts 0x03F5, r11 ; 0x8003f5 <_Kp+0x3> _Ki = 2*_Kp/Tu; 27c3a: ac 01 movw r20, r24 27c3c: 9b 01 movw r18, r22 27c3e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 27c42: a3 01 movw r20, r6 27c44: 92 01 movw r18, r4 27c46: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 27c4a: 60 93 ee 03 sts 0x03EE, r22 ; 0x8003ee <_Ki> 27c4e: 70 93 ef 03 sts 0x03EF, r23 ; 0x8003ef <_Ki+0x1> 27c52: 80 93 f0 03 sts 0x03F0, r24 ; 0x8003f0 <_Ki+0x2> 27c56: 90 93 f1 03 sts 0x03F1, r25 ; 0x8003f1 <_Ki+0x3> _Kd = _Kp*Tu/8; 27c5a: a3 01 movw r20, r6 27c5c: 92 01 movw r18, r4 27c5e: c5 01 movw r24, r10 27c60: b4 01 movw r22, r8 27c62: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27c66: 20 e0 ldi r18, 0x00 ; 0 27c68: 30 e0 ldi r19, 0x00 ; 0 27c6a: 40 e0 ldi r20, 0x00 ; 0 27c6c: 5e e3 ldi r21, 0x3E ; 62 27c6e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 27c72: 60 93 ea 03 sts 0x03EA, r22 ; 0x8003ea <_Kd> 27c76: 70 93 eb 03 sts 0x03EB, r23 ; 0x8003eb <_Kd+0x1> 27c7a: 80 93 ec 03 sts 0x03EC, r24 ; 0x8003ec <_Kd+0x2> 27c7e: 90 93 ed 03 sts 0x03ED, r25 ; 0x8003ed <_Kd+0x3> SERIAL_PROTOCOLLNPGM(" Classic PID "); 27c82: 80 e6 ldi r24, 0x60 ; 96 27c84: 9a e9 ldi r25, 0x9A ; 154 27c86: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(_Kp); 27c8a: 8a e5 ldi r24, 0x5A ; 90 27c8c: 9a e9 ldi r25, 0x9A ; 154 27c8e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27c92: 60 91 f2 03 lds r22, 0x03F2 ; 0x8003f2 <_Kp> 27c96: 70 91 f3 03 lds r23, 0x03F3 ; 0x8003f3 <_Kp+0x1> 27c9a: 80 91 f4 03 lds r24, 0x03F4 ; 0x8003f4 <_Kp+0x2> 27c9e: 90 91 f5 03 lds r25, 0x03F5 ; 0x8003f5 <_Kp+0x3> 27ca2: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki); 27ca6: 84 e5 ldi r24, 0x54 ; 84 27ca8: 9a e9 ldi r25, 0x9A ; 154 27caa: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27cae: 60 91 ee 03 lds r22, 0x03EE ; 0x8003ee <_Ki> 27cb2: 70 91 ef 03 lds r23, 0x03EF ; 0x8003ef <_Ki+0x1> 27cb6: 80 91 f0 03 lds r24, 0x03F0 ; 0x8003f0 <_Ki+0x2> 27cba: 90 91 f1 03 lds r25, 0x03F1 ; 0x8003f1 <_Ki+0x3> 27cbe: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd); 27cc2: 8e e4 ldi r24, 0x4E ; 78 27cc4: 9a e9 ldi r25, 0x9A ; 154 27cc6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27cca: 60 91 ea 03 lds r22, 0x03EA ; 0x8003ea <_Kd> 27cce: 70 91 eb 03 lds r23, 0x03EB ; 0x8003eb <_Kd+0x1> 27cd2: 80 91 ec 03 lds r24, 0x03EC ; 0x8003ec <_Kd+0x2> 27cd6: 90 91 ed 03 lds r25, 0x03ED ; 0x8003ed <_Kd+0x3> 27cda: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 27cde: 89 81 ldd r24, Y+1 ; 0x01 27ce0: 9a 81 ldd r25, Y+2 ; 0x02 27ce2: ab 81 ldd r26, Y+3 ; 0x03 27ce4: bc 81 ldd r27, Y+4 ; 0x04 27ce6: 8c 0d add r24, r12 27ce8: 9d 1d adc r25, r13 27cea: ae 1d adc r26, r14 27cec: bf 1d adc r27, r15 27cee: b5 95 asr r27 27cf0: a7 95 ror r26 27cf2: 97 95 ror r25 27cf4: 87 95 ror r24 SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki); SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd); */ } } if (extruder<0) 27cf6: 21 14 cp r2, r1 27cf8: 31 04 cpc r3, r1 27cfa: 09 f4 brne .+2 ; 0x27cfe 27cfc: 45 c0 rjmp .+138 ; 0x27d88 { soft_pwm_bed = (bias + d) >> 1; 27cfe: 80 93 1c 06 sts 0x061C, r24 ; 0x80061c } else soft_pwm[extruder] = (bias + d) >> 1; pid_cycle++; 27d02: 80 91 48 06 lds r24, 0x0648 ; 0x800648 27d06: 90 91 49 06 lds r25, 0x0649 ; 0x800649 27d0a: 01 96 adiw r24, 0x01 ; 1 27d0c: 90 93 49 06 sts 0x0649, r25 ; 0x800649 27d10: 80 93 48 06 sts 0x0648, r24 ; 0x800648 min=temp; 27d14: 3a 85 ldd r19, Y+10 ; 0x0a 27d16: 3a 8b std Y+18, r19 ; 0x12 27d18: 4b 85 ldd r20, Y+11 ; 0x0b 27d1a: 4b 8b std Y+19, r20 ; 0x13 27d1c: 5c 85 ldd r21, Y+12 ; 0x0c 27d1e: 5c 8b std Y+20, r21 ; 0x14 27d20: 8d 85 ldd r24, Y+13 ; 0x0d 27d22: 8d 8b std Y+21, r24 ; 0x15 max=temp; } } if(heating == false && input < temp) { if(_millis() - t1 > 5000) { heating=true; 27d24: 98 a5 ldd r25, Y+40 ; 0x28 27d26: 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)) { 27d28: 20 e0 ldi r18, 0x00 ; 0 27d2a: 30 e0 ldi r19, 0x00 ; 0 27d2c: 40 ea ldi r20, 0xA0 ; 160 27d2e: 51 e4 ldi r21, 0x41 ; 65 27d30: 6a 85 ldd r22, Y+10 ; 0x0a 27d32: 7b 85 ldd r23, Y+11 ; 0x0b 27d34: 8c 85 ldd r24, Y+12 ; 0x0c 27d36: 9d 85 ldd r25, Y+13 ; 0x0d 27d38: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 27d3c: 98 01 movw r18, r16 27d3e: 48 a9 ldd r20, Y+48 ; 0x30 27d40: 5f a5 ldd r21, Y+47 ; 0x2f 27d42: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 27d46: 87 ff sbrs r24, 7 27d48: 22 c0 rjmp .+68 ; 0x27d8e SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); 27d4a: 84 e2 ldi r24, 0x24 ; 36 27d4c: 9a e9 ldi r25, 0x9A ; 154 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"); 27d4e: 0e 94 13 79 call 0xf226 ; 0xf226 pid_tuning_finished = true; 27d52: 81 e0 ldi r24, 0x01 ; 1 27d54: 80 93 3e 02 sts 0x023E, r24 ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> pid_cycle = 0; 27d58: 10 92 49 06 sts 0x0649, r1 ; 0x800649 27d5c: 10 92 48 06 sts 0x0648, r1 ; 0x800648 27d60: 98 c0 rjmp .+304 ; 0x27e92 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); 27d62: 34 e1 ldi r19, 0x14 ; 20 27d64: c3 2e mov r12, r19 27d66: d1 2c mov r13, r1 27d68: e1 2c mov r14, r1 27d6a: f1 2c mov r15, r1 27d6c: 24 e1 ldi r18, 0x14 ; 20 27d6e: 30 e0 ldi r19, 0x00 ; 0 27d70: 40 e0 ldi r20, 0x00 ; 0 27d72: 50 e0 ldi r21, 0x00 ; 0 27d74: 29 83 std Y+1, r18 ; 0x01 27d76: 3a 83 std Y+2, r19 ; 0x02 27d78: 4b 83 std Y+3, r20 ; 0x03 27d7a: 5c 83 std Y+4, r21 ; 0x04 27d7c: d5 ce rjmp .-598 ; 0x27b28 27d7e: c9 82 std Y+1, r12 ; 0x01 27d80: da 82 std Y+2, r13 ; 0x02 27d82: eb 82 std Y+3, r14 ; 0x03 27d84: fc 82 std Y+4, r15 ; 0x04 27d86: d0 ce rjmp .-608 ; 0x27b28 if (extruder<0) { soft_pwm_bed = (bias + d) >> 1; } else soft_pwm[extruder] = (bias + d) >> 1; 27d88: 80 93 15 05 sts 0x0515, r24 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 27d8c: ba cf rjmp .-140 ; 0x27d02 SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); pid_tuning_finished = true; pid_cycle = 0; return; } if(_millis() - temp_millis > 2000) { 27d8e: 0f 94 28 2a call 0x25450 ; 0x25450 27d92: 28 a1 ldd r18, Y+32 ; 0x20 27d94: 39 a1 ldd r19, Y+33 ; 0x21 27d96: 4a a1 ldd r20, Y+34 ; 0x22 27d98: 5b a1 ldd r21, Y+35 ; 0x23 27d9a: 62 1b sub r22, r18 27d9c: 73 0b sbc r23, r19 27d9e: 84 0b sbc r24, r20 27da0: 95 0b sbc r25, r21 27da2: 61 3d cpi r22, 0xD1 ; 209 27da4: 77 40 sbci r23, 0x07 ; 7 27da6: 81 05 cpc r24, r1 27da8: 91 05 cpc r25, r1 27daa: 58 f1 brcs .+86 ; 0x27e02 int p; if (extruder<0){ p=soft_pwm_bed; 27dac: a0 90 1c 06 lds r10, 0x061C ; 0x80061c 27db0: b1 2c mov r11, r1 SERIAL_PROTOCOLPGM("B:"); 27db2: 81 e2 ldi r24, 0x21 ; 33 27db4: 9a e9 ldi r25, 0x9A ; 154 pid_cycle = 0; return; } if(_millis() - temp_millis > 2000) { int p; if (extruder<0){ 27db6: 21 14 cp r2, r1 27db8: 31 04 cpc r3, r1 27dba: 29 f4 brne .+10 ; 0x27dc6 p=soft_pwm_bed; SERIAL_PROTOCOLPGM("B:"); }else{ p=soft_pwm[extruder]; 27dbc: a0 90 15 05 lds r10, 0x0515 ; 0x800515 <_ZL8soft_pwm.lto_priv.461> 27dc0: b1 2c mov r11, r1 SERIAL_PROTOCOLPGM("T:"); 27dc2: 8e e1 ldi r24, 0x1E ; 30 27dc4: 9a e9 ldi r25, 0x9A ; 154 27dc6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 27dca: 42 e0 ldi r20, 0x02 ; 2 27dcc: b8 01 movw r22, r16 27dce: 88 a9 ldd r24, Y+48 ; 0x30 27dd0: 9f a5 ldd r25, Y+47 ; 0x2f 27dd2: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 } SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); 27dd6: 8a e1 ldi r24, 0x1A ; 26 27dd8: 9a e9 ldi r25, 0x9A ; 154 27dda: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_PROTOCOLLN(p); 27dde: c5 01 movw r24, r10 27de0: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 if (safety_check_cycles == 0) { //save ambient temp 27de4: 4d 81 ldd r20, Y+5 ; 0x05 27de6: 44 23 and r20, r20 27de8: 09 f4 brne .+2 ; 0x27dec 27dea: 6c c0 rjmp .+216 ; 0x27ec4 temp_ambient = input; //SERIAL_ECHOPGM("Ambient T: "); //MYSERIAL.println(temp_ambient); safety_check_cycles++; } else if (safety_check_cycles < safety_check_cycles_count) { //delay 27dec: 5f 8d ldd r21, Y+31 ; 0x1f 27dee: 45 17 cp r20, r21 27df0: 70 f5 brcc .+92 ; 0x27e4e safety_check_cycles++; 27df2: 4f 5f subi r20, 0xFF ; 255 27df4: 4d 83 std Y+5, r20 ; 0x05 temp_runaway_stop(false, (extruder<0)); pid_tuning_finished = true; return; } } temp_millis = _millis(); 27df6: 0f 94 28 2a call 0x25450 ; 0x25450 27dfa: 68 a3 std Y+32, r22 ; 0x20 27dfc: 79 a3 std Y+33, r23 ; 0x21 27dfe: 8a a3 std Y+34, r24 ; 0x22 27e00: 9b a3 std Y+35, r25 ; 0x23 } if(((_millis() - t1) + (_millis() - t2)) > (10L*60L*1000L*2L)) { 27e02: 0f 94 28 2a call 0x25450 ; 0x25450 27e06: 4b 01 movw r8, r22 27e08: 5c 01 movw r10, r24 27e0a: 0f 94 28 2a call 0x25450 ; 0x25450 27e0e: 4e 80 ldd r4, Y+6 ; 0x06 27e10: 5f 80 ldd r5, Y+7 ; 0x07 27e12: 68 84 ldd r6, Y+8 ; 0x08 27e14: 79 84 ldd r7, Y+9 ; 0x09 27e16: 2e 85 ldd r18, Y+14 ; 0x0e 27e18: 3f 85 ldd r19, Y+15 ; 0x0f 27e1a: 48 89 ldd r20, Y+16 ; 0x10 27e1c: 59 89 ldd r21, Y+17 ; 0x11 27e1e: 42 0e add r4, r18 27e20: 53 1e adc r5, r19 27e22: 64 1e adc r6, r20 27e24: 75 1e adc r7, r21 27e26: 84 18 sub r8, r4 27e28: 95 08 sbc r9, r5 27e2a: a6 08 sbc r10, r6 27e2c: b7 08 sbc r11, r7 27e2e: 86 0e add r8, r22 27e30: 97 1e adc r9, r23 27e32: a8 1e adc r10, r24 27e34: b9 1e adc r11, r25 27e36: 31 e8 ldi r19, 0x81 ; 129 27e38: 83 16 cp r8, r19 27e3a: 3f e4 ldi r19, 0x4F ; 79 27e3c: 93 06 cpc r9, r19 27e3e: 32 e1 ldi r19, 0x12 ; 18 27e40: a3 06 cpc r10, r19 27e42: b1 04 cpc r11, r1 27e44: 08 f4 brcc .+2 ; 0x27e48 27e46: 47 c0 rjmp .+142 ; 0x27ed6 SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); 27e48: 8d ef ldi r24, 0xFD ; 253 27e4a: 99 e9 ldi r25, 0x99 ; 153 27e4c: 80 cf rjmp .-256 ; 0x27d4e 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 27e4e: 8d 81 ldd r24, Y+5 ; 0x05 27e50: 9f 8d ldd r25, Y+31 ; 0x1f 27e52: 89 13 cpse r24, r25 27e54: d0 cf rjmp .-96 ; 0x27df6 safety_check_cycles++; 27e56: 8f 5f subi r24, 0xFF ; 255 27e58: 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) { 27e5a: 2b a5 ldd r18, Y+43 ; 0x2b 27e5c: 3c a5 ldd r19, Y+44 ; 0x2c 27e5e: 4d a5 ldd r20, Y+45 ; 0x2d 27e60: 5e a5 ldd r21, Y+46 ; 0x2e 27e62: b8 01 movw r22, r16 27e64: 88 a9 ldd r24, Y+48 ; 0x30 27e66: 9f a5 ldd r25, Y+47 ; 0x2f 27e68: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 27e6c: 9f 77 andi r25, 0x7F ; 127 27e6e: 20 e0 ldi r18, 0x00 ; 0 27e70: 30 e0 ldi r19, 0x00 ; 0 27e72: 40 ea ldi r20, 0xA0 ; 160 27e74: 50 e4 ldi r21, 0x40 ; 64 27e76: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 27e7a: 87 ff sbrs r24, 7 27e7c: bc cf rjmp .-136 ; 0x27df6 temp_runaway_stop(false, (extruder<0)); 27e7e: 63 2d mov r22, r3 27e80: 66 1f adc r22, r22 27e82: 66 27 eor r22, r22 27e84: 66 1f adc r22, r22 27e86: 80 e0 ldi r24, 0x00 ; 0 27e88: 0f 94 16 20 call 0x2402c ; 0x2402c pid_tuning_finished = true; 27e8c: 81 e0 ldi r24, 0x01 ; 1 27e8e: 80 93 3e 02 sts 0x023E, r24 ; 0x80023e <_ZL19pid_tuning_finished.lto_priv.460> pid_cycle = 0; return; } lcd_update(0); } } 27e92: e0 96 adiw r28, 0x30 ; 48 27e94: 0f b6 in r0, 0x3f ; 63 27e96: f8 94 cli 27e98: de bf out 0x3e, r29 ; 62 27e9a: 0f be out 0x3f, r0 ; 63 27e9c: cd bf out 0x3d, r28 ; 61 27e9e: df 91 pop r29 27ea0: cf 91 pop r28 27ea2: 1f 91 pop r17 27ea4: 0f 91 pop r16 27ea6: ff 90 pop r15 27ea8: ef 90 pop r14 27eaa: df 90 pop r13 27eac: cf 90 pop r12 27eae: bf 90 pop r11 27eb0: af 90 pop r10 27eb2: 9f 90 pop r9 27eb4: 8f 90 pop r8 27eb6: 7f 90 pop r7 27eb8: 6f 90 pop r6 27eba: 5f 90 pop r5 27ebc: 4f 90 pop r4 27ebe: 3f 90 pop r3 27ec0: 2f 90 pop r2 27ec2: 08 95 ret SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); SERIAL_PROTOCOLLN(p); if (safety_check_cycles == 0) { //save ambient temp temp_ambient = input; 27ec4: 0b a7 std Y+43, r16 ; 0x2b 27ec6: 1c a7 std Y+44, r17 ; 0x2c 27ec8: a8 a9 ldd r26, Y+48 ; 0x30 27eca: ad a7 std Y+45, r26 ; 0x2d 27ecc: bf a5 ldd r27, Y+47 ; 0x2f 27ece: be a7 std Y+46, r27 ; 0x2e //SERIAL_ECHOPGM("Ambient T: "); //MYSERIAL.println(temp_ambient); safety_check_cycles++; 27ed0: 21 e0 ldi r18, 0x01 ; 1 27ed2: 2d 83 std Y+5, r18 ; 0x05 27ed4: 90 cf rjmp .-224 ; 0x27df6 SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); pid_tuning_finished = true; pid_cycle = 0; return; } if(pid_cycle > ncycles) { 27ed6: 80 91 48 06 lds r24, 0x0648 ; 0x800648 27eda: 90 91 49 06 lds r25, 0x0649 ; 0x800649 27ede: 49 a5 ldd r20, Y+41 ; 0x29 27ee0: 5a a5 ldd r21, Y+42 ; 0x2a 27ee2: 48 17 cp r20, r24 27ee4: 59 07 cpc r21, r25 27ee6: 1c f4 brge .+6 ; 0x27eee SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h"); 27ee8: 81 ea ldi r24, 0xA1 ; 161 27eea: 99 e9 ldi r25, 0x99 ; 153 27eec: 30 cf rjmp .-416 ; 0x27d4e pid_tuning_finished = true; pid_cycle = 0; return; } lcd_update(0); 27eee: 80 e0 ldi r24, 0x00 ; 0 27ef0: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 27ef4: e6 cc rjmp .-1588 ; 0x278c2 00027ef6 : startTimestamp = 0; stopTimestamp = 0; accumulator = 0; } uint32_t Stopwatch::duration() { 27ef6: 0f 93 push r16 27ef8: 1f 93 push r17 return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp); 27efa: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 27efe: 81 30 cpi r24, 0x01 ; 1 27f00: 19 f5 brne .+70 ; 0x27f48 27f02: 0f 94 28 2a call 0x25450 ; 0x25450 27f06: 00 91 a6 05 lds r16, 0x05A6 ; 0x8005a6 27f0a: 10 91 a7 05 lds r17, 0x05A7 ; 0x8005a7 27f0e: 20 91 a8 05 lds r18, 0x05A8 ; 0x8005a8 27f12: 30 91 a9 05 lds r19, 0x05A9 ; 0x8005a9 27f16: 60 1b sub r22, r16 27f18: 71 0b sbc r23, r17 27f1a: 82 0b sbc r24, r18 27f1c: 93 0b sbc r25, r19 27f1e: 28 ee ldi r18, 0xE8 ; 232 27f20: 33 e0 ldi r19, 0x03 ; 3 27f22: 40 e0 ldi r20, 0x00 ; 0 27f24: 50 e0 ldi r21, 0x00 ; 0 27f26: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 27f2a: 60 91 a2 05 lds r22, 0x05A2 ; 0x8005a2 27f2e: 70 91 a3 05 lds r23, 0x05A3 ; 0x8005a3 27f32: 80 91 a4 05 lds r24, 0x05A4 ; 0x8005a4 27f36: 90 91 a5 05 lds r25, 0x05A5 ; 0x8005a5 27f3a: 62 0f add r22, r18 27f3c: 73 1f adc r23, r19 27f3e: 84 1f adc r24, r20 27f40: 95 1f adc r25, r21 } 27f42: 1f 91 pop r17 27f44: 0f 91 pop r16 27f46: 08 95 ret stopTimestamp = 0; accumulator = 0; } uint32_t Stopwatch::duration() { return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp); 27f48: 60 91 51 06 lds r22, 0x0651 ; 0x800651 27f4c: 70 91 52 06 lds r23, 0x0652 ; 0x800652 27f50: 80 91 53 06 lds r24, 0x0653 ; 0x800653 27f54: 90 91 54 06 lds r25, 0x0654 ; 0x800654 27f58: d6 cf rjmp .-84 ; 0x27f06 00027f5a : //! |Total print time: | MSG_TOTAL_PRINT_TIME c=19 //! | 00d 00h 00m | //! ---------------------- //! @endcode void lcd_menu_statistics() { 27f5a: 4f 92 push r4 27f5c: 5f 92 push r5 27f5e: 6f 92 push r6 27f60: 7f 92 push r7 27f62: 8f 92 push r8 27f64: 9f 92 push r9 27f66: af 92 push r10 27f68: bf 92 push r11 27f6a: cf 92 push r12 27f6c: df 92 push r13 27f6e: ef 92 push r14 27f70: ff 92 push r15 27f72: 0f 93 push r16 27f74: 1f 93 push r17 27f76: cf 93 push r28 27f78: df 93 push r29 27f7a: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da lcd_timeoutToStatus.stop(); //infinite timeout if (printJobOngoing()) 27f7e: 0e 94 28 67 call 0xce50 ; 0xce50 27f82: 88 23 and r24, r24 27f84: 09 f4 brne .+2 ; 0x27f88 27f86: 6e c0 rjmp .+220 ; 0x28064 { const float _met = ((float)total_filament_used) / (100000.f); 27f88: 60 91 64 06 lds r22, 0x0664 ; 0x800664 27f8c: 70 91 65 06 lds r23, 0x0665 ; 0x800665 27f90: 80 91 66 06 lds r24, 0x0666 ; 0x800666 27f94: 90 91 67 06 lds r25, 0x0667 ; 0x800667 27f98: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 27f9c: 20 e0 ldi r18, 0x00 ; 0 27f9e: 30 e5 ldi r19, 0x50 ; 80 27fa0: 43 ec ldi r20, 0xC3 ; 195 27fa2: 57 e4 ldi r21, 0x47 ; 71 27fa4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 27fa8: 56 2e mov r5, r22 27faa: 47 2e mov r4, r23 27fac: ec 01 movw r28, r24 const uint32_t _t = print_job_timer.duration(); 27fae: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 27fb2: 6b 01 movw r12, r22 27fb4: 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(); 27fb6: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(_N( 27fba: 8b e3 ldi r24, 0x3B ; 59 27fbc: 90 e5 ldi r25, 0x50 ; 80 27fbe: 0e 94 44 72 call 0xe488 ; 0xe488 27fc2: 18 2f mov r17, r24 27fc4: 09 2f mov r16, r25 27fc6: 8b e2 ldi r24, 0x2B ; 43 27fc8: 90 e5 ldi r25, 0x50 ; 80 27fca: 0e 94 44 72 call 0xe488 ; 0xe488 27fce: 78 2e mov r7, r24 27fd0: 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; 27fd2: 8c e3 ldi r24, 0x3C ; 60 27fd4: 88 2e mov r8, r24 27fd6: 91 2c mov r9, r1 27fd8: a1 2c mov r10, r1 27fda: b1 2c mov r11, r1 27fdc: c7 01 movw r24, r14 27fde: b6 01 movw r22, r12 27fe0: a5 01 movw r20, r10 27fe2: 94 01 movw r18, r8 27fe4: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> lcd_home(); lcd_printf_P(_N( 27fe8: 7f 93 push r23 27fea: 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; 27fec: ca 01 movw r24, r20 27fee: b9 01 movw r22, r18 27ff0: a5 01 movw r20, r10 27ff2: 94 01 movw r18, r8 27ff4: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> const uint8_t _s = _t % 60; lcd_home(); lcd_printf_P(_N( 27ff8: 7f 93 push r23 27ffa: 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; 27ffc: c7 01 movw r24, r14 27ffe: b6 01 movw r22, r12 28000: 20 e1 ldi r18, 0x10 ; 16 28002: 3e e0 ldi r19, 0x0E ; 14 28004: 40 e0 ldi r20, 0x00 ; 0 28006: 50 e0 ldi r21, 0x00 ; 0 28008: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> const uint8_t _m = (_t / 60) % 60; const uint8_t _s = _t % 60; lcd_home(); lcd_printf_P(_N( 2800c: 5f 93 push r21 2800e: 4f 93 push r20 28010: 3f 93 push r19 28012: 2f 93 push r18 28014: 0f 93 push r16 28016: 1f 93 push r17 28018: df 93 push r29 2801a: cf 93 push r28 2801c: 4f 92 push r4 2801e: 5f 92 push r5 28020: 6f 92 push r6 28022: 7f 92 push r7 28024: 8b e1 ldi r24, 0x1B ; 27 28026: 9f e6 ldi r25, 0x6F ; 111 28028: 9f 93 push r25 2802a: 8f 93 push r24 2802c: 0e 94 51 6e call 0xdca2 ; 0xdca2 "%S:\n" "%10ldh %02dm %02ds" ), _T(MSG_FILAMENT_USED), _met, _T(MSG_PRINT_TIME), _h, _m, _s); menu_back_if_clicked(); 28030: 8d b7 in r24, 0x3d ; 61 28032: 9e b7 in r25, 0x3e ; 62 28034: 42 96 adiw r24, 0x12 ; 18 28036: 0f b6 in r0, 0x3f ; 63 28038: f8 94 cli 2803a: 9e bf out 0x3e, r25 ; 62 2803c: 0f be out 0x3f, r0 ; 63 2803e: 8d bf out 0x3d, r24 ; 61 ), _T(MSG_TOTAL_FILAMENT), _filament_m, _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes); menu_back_if_clicked(); } } 28040: df 91 pop r29 28042: cf 91 pop r28 28044: 1f 91 pop r17 28046: 0f 91 pop r16 28048: ff 90 pop r15 2804a: ef 90 pop r14 2804c: df 90 pop r13 2804e: cf 90 pop r12 28050: bf 90 pop r11 28052: af 90 pop r10 28054: 9f 90 pop r9 28056: 8f 90 pop r8 28058: 7f 90 pop r7 2805a: 6f 90 pop r6 2805c: 5f 90 pop r5 2805e: 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(); 28060: 0d 94 f4 d4 jmp 0x3a9e8 ; 0x3a9e8 _T(MSG_PRINT_TIME), _h, _m, _s); menu_back_if_clicked(); } else { uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters 28064: 81 ef ldi r24, 0xF1 ; 241 28066: 9f e0 ldi r25, 0x0F ; 15 28068: 0f 94 18 dc call 0x3b830 ; 0x3b830 2806c: 2b 01 movw r4, r22 2806e: 3c 01 movw r6, r24 uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes 28070: 8d ee ldi r24, 0xED ; 237 28072: 9f e0 ldi r25, 0x0F ; 15 28074: 0f 94 18 dc call 0x3b830 ; 0x3b830 28078: 6b 01 movw r12, r22 2807a: 7c 01 movw r14, r24 float _filament_m = (float)_filament/100; _days = (_time / 60) / 24; _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); 2807c: 0e 94 a4 6e call 0xdd48 ; 0xdd48 lcd_printf_P(_N( 28080: 88 e1 ldi r24, 0x18 ; 24 28082: 90 e5 ldi r25, 0x50 ; 80 28084: 0e 94 44 72 call 0xe488 ; 0xe488 28088: 98 2e mov r9, r24 2808a: 89 2e mov r8, r25 2808c: 87 e0 ldi r24, 0x07 ; 7 2808e: 90 e5 ldi r25, 0x50 ; 80 28090: 0e 94 44 72 call 0xe488 ; 0xe488 28094: b8 2e mov r11, r24 28096: 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; 28098: c7 01 movw r24, r14 2809a: b6 01 movw r22, r12 2809c: 2c e3 ldi r18, 0x3C ; 60 2809e: 30 e0 ldi r19, 0x00 ; 0 280a0: 40 e0 ldi r20, 0x00 ; 0 280a2: 50 e0 ldi r21, 0x00 ; 0 280a4: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> lcd_home(); lcd_printf_P(_N( 280a8: 7f 93 push r23 280aa: 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; 280ac: ca 01 movw r24, r20 280ae: b9 01 movw r22, r18 280b0: 28 e1 ldi r18, 0x18 ; 24 280b2: 30 e0 ldi r19, 0x00 ; 0 280b4: 40 e0 ldi r20, 0x00 ; 0 280b6: 50 e0 ldi r21, 0x00 ; 0 280b8: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 280bc: 7f 93 push r23 280be: 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; 280c0: c7 01 movw r24, r14 280c2: b6 01 movw r22, r12 280c4: 20 ea ldi r18, 0xA0 ; 160 280c6: 35 e0 ldi r19, 0x05 ; 5 280c8: 40 e0 ldi r20, 0x00 ; 0 280ca: 50 e0 ldi r21, 0x00 ; 0 280cc: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 280d0: 5f 93 push r21 280d2: 4f 93 push r20 280d4: 3f 93 push r19 280d6: 2f 93 push r18 280d8: 8f 92 push r8 280da: 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; 280dc: c3 01 movw r24, r6 280de: b2 01 movw r22, r4 280e0: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 280e4: 20 e0 ldi r18, 0x00 ; 0 280e6: 30 e0 ldi r19, 0x00 ; 0 280e8: 48 ec ldi r20, 0xC8 ; 200 280ea: 52 e4 ldi r21, 0x42 ; 66 280ec: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> _days = (_time / 60) / 24; _hours = (_time / 60) % 24; _minutes = _time % 60; lcd_home(); lcd_printf_P(_N( 280f0: 9f 93 push r25 280f2: 8f 93 push r24 280f4: 7f 93 push r23 280f6: 6f 93 push r22 280f8: af 92 push r10 280fa: bf 92 push r11 280fc: 87 ef ldi r24, 0xF7 ; 247 280fe: 9e e6 ldi r25, 0x6E ; 110 28100: 9f 93 push r25 28102: 8f 93 push r24 28104: 0e 94 51 6e call 0xdca2 ; 0xdca2 "%S:\n" "%10ldd %02dh %02dm" ), _T(MSG_TOTAL_FILAMENT), _filament_m, _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes); menu_back_if_clicked(); 28108: 8d b7 in r24, 0x3d ; 61 2810a: 9e b7 in r25, 0x3e ; 62 2810c: 42 96 adiw r24, 0x12 ; 18 2810e: 0f b6 in r0, 0x3f ; 63 28110: f8 94 cli 28112: 9e bf out 0x3e, r25 ; 62 28114: 0f be out 0x3f, r0 ; 63 28116: 8d bf out 0x3d, r24 ; 61 28118: 93 cf rjmp .-218 ; 0x28040 0002811a : 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()") { 2811a: cf 92 push r12 2811c: df 92 push r13 2811e: ef 92 push r14 28120: ff 92 push r15 28122: 0f 93 push r16 28124: 1f 93 push r17 28126: cf 93 push r28 28128: df 93 push r29 2812a: 00 d0 rcall .+0 ; 0x2812c 2812c: 00 d0 rcall .+0 ; 0x2812e 2812e: 1f 92 push r1 28130: 1f 92 push r1 28132: cd b7 in r28, 0x3d ; 61 28134: de b7 in r29, 0x3e ; 62 static uint8_t lcd_status_update_delay = 0; #ifdef ULTIPANEL_FEEDMULTIPLY if (lcd_encoder) 28136: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 2813a: 90 91 70 06 lds r25, 0x0670 ; 0x800670 2813e: 00 97 sbiw r24, 0x00 ; 0 28140: e1 f1 breq .+120 ; 0x281ba { const int16_t initial_feedmultiply = feedmultiply; 28142: 20 91 39 02 lds r18, 0x0239 ; 0x800239 28146: 30 91 3a 02 lds r19, 0x023A ; 0x80023a // Dead zone at 100% feedrate if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) || 2814a: 24 36 cpi r18, 0x64 ; 100 2814c: 31 05 cpc r19, r1 2814e: 4c f4 brge .+18 ; 0x28162 28150: ac 01 movw r20, r24 28152: 42 0f add r20, r18 28154: 53 1f adc r21, r19 28156: 45 36 cpi r20, 0x65 ; 101 28158: 51 05 cpc r21, r1 2815a: 6c f4 brge .+26 ; 0x28176 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; 2815c: 82 0f add r24, r18 2815e: 93 1f adc r25, r19 28160: 0c c0 rjmp .+24 ; 0x2817a #ifdef ULTIPANEL_FEEDMULTIPLY if (lcd_encoder) { const int16_t initial_feedmultiply = feedmultiply; // Dead zone at 100% feedrate if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) || 28162: 24 36 cpi r18, 0x64 ; 100 28164: 31 05 cpc r19, r1 28166: 09 f4 brne .+2 ; 0x2816a 28168: 55 c0 rjmp .+170 ; 0x28214 (feedmultiply > 100 && (feedmultiply + lcd_encoder) < 100)) 2816a: ac 01 movw r20, r24 2816c: 42 0f add r20, r18 2816e: 53 1f adc r21, r19 28170: 44 36 cpi r20, 0x64 ; 100 28172: 51 05 cpc r21, r1 28174: 9c f7 brge .-26 ; 0x2815c { feedmultiply = 100; 28176: 84 e6 ldi r24, 0x64 ; 100 28178: 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; 2817a: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a 2817e: 80 93 39 02 sts 0x0239, r24 ; 0x800239 if (initial_feedmultiply != feedmultiply) { 28182: 80 91 39 02 lds r24, 0x0239 ; 0x800239 28186: 90 91 3a 02 lds r25, 0x023A ; 0x80023a 2818a: 82 17 cp r24, r18 2818c: 93 07 cpc r25, r19 2818e: a9 f0 breq .+42 ; 0x281ba feedmultiply = constrain(feedmultiply, 10, 999); 28190: 88 3e cpi r24, 0xE8 ; 232 28192: 53 e0 ldi r21, 0x03 ; 3 28194: 95 07 cpc r25, r21 28196: 14 f0 brlt .+4 ; 0x2819c 28198: 87 ee ldi r24, 0xE7 ; 231 2819a: 93 e0 ldi r25, 0x03 ; 3 2819c: 8a 30 cpi r24, 0x0A ; 10 2819e: 91 05 cpc r25, r1 281a0: 14 f4 brge .+4 ; 0x281a6 281a2: 8a e0 ldi r24, 0x0A ; 10 281a4: 90 e0 ldi r25, 0x00 ; 0 281a6: 90 93 3a 02 sts 0x023A, r25 ; 0x80023a 281aa: 80 93 39 02 sts 0x0239, r24 ; 0x800239 lcd_encoder = 0; // Consume rotation event 281ae: 10 92 70 06 sts 0x0670, r1 ; 0x800670 281b2: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f refresh_saved_feedrate_multiplier_in_ram(); 281b6: 0e 94 7b 64 call 0xc8f6 ; 0xc8f6 } } #endif //ULTIPANEL_FEEDMULTIPLY if (lcd_draw_update) { 281ba: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 281be: 81 11 cpse r24, r1 // Update the status screen immediately lcd_status_update_delay = 0; 281c0: 10 92 50 06 sts 0x0650, r1 ; 0x800650 } if (lcd_status_update_delay) 281c4: 10 91 50 06 lds r17, 0x0650 ; 0x800650 281c8: 11 23 and r17, r17 281ca: 91 f1 breq .+100 ; 0x28230 lcd_status_update_delay--; 281cc: 2f ef ldi r18, 0xFF ; 255 281ce: 21 0f add r18, r17 281d0: 20 93 50 06 sts 0x0650, r18 ; 0x800650 if (lcd_commands_type != LcdCommands::Idle) lcd_commands(); } if (!menu_is_any_block() && lcd_clicked()) { 281d4: 80 91 d4 03 lds r24, 0x03D4 ; 0x8003d4 281d8: 81 11 cpse r24, r1 281da: 0d c0 rjmp .+26 ; 0x281f6 281dc: 0e 94 95 70 call 0xe12a ; 0xe12a 281e0: 88 23 and r24, r24 281e2: 49 f0 breq .+18 ; 0x281f6 menu_depth = 0; //redundant, as already done in lcd_return_to_status(), just to be sure 281e4: 10 92 f7 03 sts 0x03F7, r1 ; 0x8003f7 menu_submenu(lcd_main_menu); 281e8: 60 e0 ldi r22, 0x00 ; 0 281ea: 8d ec ldi r24, 0xCD ; 205 281ec: 95 ed ldi r25, 0xD5 ; 213 281ee: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee lcd_refresh(); // to maybe revive the LCD if static electricity killed it. 281f2: 0e 94 24 6f call 0xde48 ; 0xde48 } } 281f6: 28 96 adiw r28, 0x08 ; 8 281f8: 0f b6 in r0, 0x3f ; 63 281fa: f8 94 cli 281fc: de bf out 0x3e, r29 ; 62 281fe: 0f be out 0x3f, r0 ; 63 28200: cd bf out 0x3d, r28 ; 61 28202: df 91 pop r29 28204: cf 91 pop r28 28206: 1f 91 pop r17 28208: 0f 91 pop r16 2820a: ff 90 pop r15 2820c: ef 90 pop r14 2820e: df 90 pop r13 28210: cf 90 pop r12 28212: 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) { 28214: 8b 30 cpi r24, 0x0B ; 11 28216: 91 05 cpc r25, r1 28218: 1c f0 brlt .+6 ; 0x28220 feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE; 2821a: 86 5a subi r24, 0xA6 ; 166 2821c: 9f 4f sbci r25, 0xFF ; 255 2821e: ad cf rjmp .-166 ; 0x2817a } else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) { 28220: 86 3f cpi r24, 0xF6 ; 246 28222: 4f ef ldi r20, 0xFF ; 255 28224: 94 07 cpc r25, r20 28226: 0c f0 brlt .+2 ; 0x2822a 28228: ac cf rjmp .-168 ; 0x28182 feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE; 2822a: 82 59 subi r24, 0x92 ; 146 2822c: 9f 4f sbci r25, 0xFF ; 255 2822e: a5 cf rjmp .-182 ; 0x2817a 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; 28230: 6a e0 ldi r22, 0x0A ; 10 28232: 60 93 50 06 sts 0x0650, r22 ; 0x800650 ReInitLCD++; 28236: 80 91 4f 06 lds r24, 0x064F ; 0x80064f 2823a: 8f 5f subi r24, 0xFF ; 255 2823c: 80 93 4f 06 sts 0x064F, r24 ; 0x80064f if (ReInitLCD == 30) 28240: 8e 31 cpi r24, 0x1E ; 30 28242: 09 f0 breq .+2 ; 0x28246 28244: 9f c0 rjmp .+318 ; 0x28384 { ReInitLCD = 0 ; 28246: 10 92 4f 06 sts 0x064F, r1 ; 0x80064f #endif //DEBUG_DISABLE_LCD_STATUS_LINE } static void lcdui_refresh(uint8_t clear = true) { clear ? lcd_refresh() : lcd_refresh_noclear(); 2824a: 0e 94 24 6f call 0xde48 ; 0xde48 lcd_status_message_idx = 0; // Re-draw message from beginning 2824e: 10 92 1d 05 sts 0x051D, r1 ; 0x80051d <_ZL22lcd_status_message_idx.lto_priv.450> //! F - feedrate symbol LCD_STR_FEEDRATE //! t - clock symbol LCD_STR_THERMOMETER //! @endcode void lcdui_print_status_screen(void) { lcd_frame_start(); 28252: 0e 94 2c 6e call 0xdc58 ; 0xdc58 lcd_home(); //line 0 28256: 0e 94 a4 6e call 0xdd48 ; 0xdd48 return current_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; 2825a: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 2825e: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 28262: 07 2e mov r0, r23 28264: 00 0c add r0, r0 28266: 88 0b sbc r24, r24 28268: 99 0b sbc r25, r25 2826a: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__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)); 2826e: 20 e0 ldi r18, 0x00 ; 0 28270: 30 e0 ldi r19, 0x00 ; 0 28272: 40 e0 ldi r20, 0x00 ; 0 28274: 5f e3 ldi r21, 0x3F ; 63 28276: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2827a: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2827e: 6b 01 movw r12, r22 28280: 20 e0 ldi r18, 0x00 ; 0 28282: 30 e0 ldi r19, 0x00 ; 0 28284: 40 e0 ldi r20, 0x00 ; 0 28286: 5f e3 ldi r21, 0x3F ; 63 28288: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 2828c: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 28290: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 28294: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 28298: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2829c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 282a0: a6 01 movw r20, r12 282a2: 82 e8 ldi r24, 0x82 ; 130 282a4: 0f 94 55 22 call 0x244aa ; 0x244aa lcd_space(3); //3 spaces 282a8: 83 e0 ldi r24, 0x03 ; 3 282aa: 0e 94 6e 6e call 0xdcdc ; 0xdcdc } // Print Z-coordinate (8 chars total) void lcdui_print_Z_coord(void) { if (custom_message_type == CustomMsg::MeshBedLeveling) 282ae: 80 91 c3 06 lds r24, 0x06C3 ; 0x8006c3 282b2: 81 30 cpi r24, 0x01 ; 1 282b4: 09 f0 breq .+2 ; 0x282b8 282b6: 6e c0 rjmp .+220 ; 0x28394 lcd_puts_P(_N("Z --- ")); 282b8: 8d e4 ldi r24, 0x4D ; 77 282ba: 9e e6 ldi r25, 0x6E ; 110 282bc: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_space(3); //3 spaces //Print Z-coordinate (8 chars total) lcdui_print_Z_coord(); lcd_set_cursor(0, 1); //line 1 282c0: 61 e0 ldi r22, 0x01 ; 1 282c2: 80 e0 ldi r24, 0x00 ; 0 282c4: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 }; FORCE_INLINE float degTargetBed() { return target_temperature_bed; 282c8: 60 91 71 06 lds r22, 0x0671 ; 0x800671 282cc: 70 91 72 06 lds r23, 0x0672 ; 0x800672 282d0: 07 2e mov r0, r23 282d2: 00 0c add r0, r0 282d4: 88 0b sbc r24, r24 282d6: 99 0b sbc r25, r25 282d8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> //Print the Bed temperature (9 chars total) lcdui_print_temp(LCD_STR_BEDTEMP[0], (int)(degBed() + 0.5), (int)(degTargetBed() + 0.5)); 282dc: 20 e0 ldi r18, 0x00 ; 0 282de: 30 e0 ldi r19, 0x00 ; 0 282e0: 40 e0 ldi r20, 0x00 ; 0 282e2: 5f e3 ldi r21, 0x3F ; 63 282e4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 282e8: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 282ec: 6b 01 movw r12, r22 282ee: 20 e0 ldi r18, 0x00 ; 0 282f0: 30 e0 ldi r19, 0x00 ; 0 282f2: 40 e0 ldi r20, 0x00 ; 0 282f4: 5f e3 ldi r21, 0x3F ; 63 282f6: 60 91 ed 04 lds r22, 0x04ED ; 0x8004ed 282fa: 70 91 ee 04 lds r23, 0x04EE ; 0x8004ee 282fe: 80 91 ef 04 lds r24, 0x04EF ; 0x8004ef 28302: 90 91 f0 04 lds r25, 0x04F0 ; 0x8004f0 28306: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2830a: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2830e: a6 01 movw r20, r12 28310: 80 e8 ldi r24, 0x80 ; 128 28312: 0f 94 55 22 call 0x244aa ; 0x244aa lcd_space(3); //3 spaces 28316: 83 e0 ldi r24, 0x03 ; 3 28318: 0e 94 6e 6e call 0xdcdc ; 0xdcdc #endif // PLANNER_DIAGNOSTICS // Print feedrate (8 chars total) void lcdui_print_feedrate(void) { int chars = lcd_printf_P(_N(LCD_STR_FEEDRATE "%3d%%"), feedmultiply); 2831c: 80 91 3a 02 lds r24, 0x023A ; 0x80023a 28320: 8f 93 push r24 28322: 80 91 39 02 lds r24, 0x0239 ; 0x800239 28326: 8f 93 push r24 28328: 86 e5 ldi r24, 0x56 ; 86 2832a: 9e e6 ldi r25, 0x6E ; 110 2832c: 9f 93 push r25 2832e: 8f 93 push r24 28330: 0e 94 51 6e call 0xdca2 ; 0xdca2 lcd_space(8 - chars); 28334: 98 e0 ldi r25, 0x08 ; 8 28336: 98 1b sub r25, r24 28338: 89 2f mov r24, r25 2833a: 0e 94 6e 6e call 0xdcdc ; 0xdcdc #else // PLANNER_DIAGNOSTICS //Print Feedrate (8 chars) lcdui_print_feedrate(); #endif // PLANNER_DIAGNOSTICS lcd_set_cursor(0, 2); //line 2 2833e: 62 e0 ldi r22, 0x02 ; 2 28340: 80 e0 ldi r24, 0x00 ; 0 28342: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 } // 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(" ")); 28346: 0f 90 pop r0 28348: 0f 90 pop r0 2834a: 0f 90 pop r0 2834c: 0f 90 pop r0 2834e: 80 91 0d 05 lds r24, 0x050D ; 0x80050d 28352: e0 90 8f 14 lds r14, 0x148F ; 0x80148f 28356: 81 11 cpse r24, r1 28358: 3e c0 rjmp .+124 ; 0x283d6 2835a: 29 e6 ldi r18, 0x69 ; 105 2835c: c2 2e mov r12, r18 2835e: 2e e6 ldi r18, 0x6E ; 110 28360: d2 2e mov r13, r18 28362: e1 10 cpse r14, r1 28364: 3c c0 rjmp .+120 ; 0x283de 28366: 8d e6 ldi r24, 0x6D ; 109 28368: c8 2e mov r12, r24 2836a: 8e e6 ldi r24, 0x6E ; 110 2836c: d8 2e mov r13, r24 bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 2836e: 0e 94 79 67 call 0xcef2 ; 0xcef2 28372: f8 2e mov r15, r24 28374: 88 23 and r24, r24 28376: e1 f1 breq .+120 ; 0x283f0 28378: 80 91 ae 02 lds r24, 0x02AE ; 0x8002ae 2837c: 8f 3f cpi r24, 0xFF ; 255 2837e: 89 f5 brne .+98 ; 0x283e2 28380: f1 2c mov r15, r1 28382: 36 c0 rjmp .+108 ; 0x283f0 ReInitLCD = 0 ; lcdui_refresh(); } else { if ((ReInitLCD % 10) == 0) 28384: 0f 94 cb dc call 0x3b996 ; 0x3b996 <__divmodqi4> 28388: 91 11 cpse r25, r1 2838a: 63 cf rjmp .-314 ; 0x28252 lcd_begin(1); } void lcd_refresh_noclear(void) { lcd_begin(0); 2838c: 80 e0 ldi r24, 0x00 ; 0 2838e: 0e 94 e3 6e call 0xddc6 ; 0xddc6 28392: 5d cf rjmp .-326 ; 0x2824e 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]?' ':'?'); 28394: 80 91 90 06 lds r24, 0x0690 ; 0x800690 28398: 88 23 and r24, r24 2839a: d9 f0 breq .+54 ; 0x283d2 2839c: 80 e2 ldi r24, 0x20 ; 32 2839e: 1f 92 push r1 283a0: 8f 93 push r24 283a2: 80 91 9c 06 lds r24, 0x069C ; 0x80069c 283a6: 8f 93 push r24 283a8: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 283ac: 8f 93 push r24 283ae: 80 91 9a 06 lds r24, 0x069A ; 0x80069a 283b2: 8f 93 push r24 283b4: 80 91 99 06 lds r24, 0x0699 ; 0x800699 283b8: 8f 93 push r24 283ba: 84 e4 ldi r24, 0x44 ; 68 283bc: 9e e6 ldi r25, 0x6E ; 110 283be: 9f 93 push r25 283c0: 8f 93 push r24 283c2: 0e 94 51 6e call 0xdca2 ; 0xdca2 283c6: 0f b6 in r0, 0x3f ; 63 283c8: f8 94 cli 283ca: de bf out 0x3e, r29 ; 62 283cc: 0f be out 0x3f, r0 ; 63 283ce: cd bf out 0x3d, r28 ; 61 283d0: 77 cf rjmp .-274 ; 0x282c0 283d2: 8f e3 ldi r24, 0x3F ; 63 283d4: e4 cf rjmp .-56 ; 0x2839e } // 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(" ")); 283d6: 91 e7 ldi r25, 0x71 ; 113 283d8: c9 2e mov r12, r25 283da: 9e e6 ldi r25, 0x6E ; 110 283dc: d9 2e mov r13, r25 bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 283de: ee 20 and r14, r14 283e0: 31 f2 breq .-116 ; 0x2836e if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating 283e2: 80 91 e1 03 lds r24, 0x03E1 ; 0x8003e1 // 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)); 283e6: ff 24 eor r15, r15 283e8: f3 94 inc r15 if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating 283ea: 88 23 and r24, r24 283ec: 09 f4 brne .+2 ; 0x283f0 283ee: bb c0 rjmp .+374 ; 0x28566 { const int8_t sheetNR = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); 283f0: 81 ea ldi r24, 0xA1 ; 161 283f2: 9d e0 ldi r25, 0x0D ; 13 283f4: 0f 94 10 dc call 0x3b820 ; 0x3b820 283f8: 08 2f mov r16, r24 const int8_t nextSheet = eeprom_next_initialized_sheet(sheetNR); 283fa: 0e 94 e7 75 call 0xebce ; 0xebce if ((nextSheet >= 0) && (sheetNR != nextSheet)) 283fe: 87 fd sbrc r24, 7 28400: b2 c0 rjmp .+356 ; 0x28566 28402: 08 17 cp r16, r24 28404: 09 f4 brne .+2 ; 0x28408 28406: af c0 rjmp .+350 ; 0x28566 { char sheet[8]; eeprom_read_block(sheet, EEPROM_Sheets_base->s[sheetNR].name, 7); 28408: 9b e0 ldi r25, 0x0B ; 11 2840a: 09 02 muls r16, r25 2840c: b0 01 movw r22, r0 2840e: 11 24 eor r1, r1 28410: 67 5b subi r22, 0xB7 ; 183 28412: 72 4f sbci r23, 0xF2 ; 242 28414: 47 e0 ldi r20, 0x07 ; 7 28416: 50 e0 ldi r21, 0x00 ; 0 28418: 8e 01 movw r16, r28 2841a: 0f 5f subi r16, 0xFF ; 255 2841c: 1f 4f sbci r17, 0xFF ; 255 2841e: c8 01 movw r24, r16 28420: 0f 94 00 dc call 0x3b800 ; 0x3b800 sheet[7] = '\0'; 28424: 18 86 std Y+8, r1 ; 0x08 lcd_printf_P(PSTR("%-7s"),sheet); 28426: 1f 93 push r17 28428: 0f 93 push r16 2842a: 8c ec ldi r24, 0xCC ; 204 2842c: 9f e9 ldi r25, 0x9F ; 159 lcd_print(hostName); // Two characters } else { lcd_printf_P(PSTR("%3S"), src); } lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done()); 2842e: 9f 93 push r25 28430: 8f 93 push r24 28432: 0e 94 51 6e call 0xdca2 ; 0xdca2 28436: 0f 90 pop r0 28438: 0f 90 pop r0 2843a: 0f 90 pop r0 2843c: 0f 90 pop r0 lcd_set_cursor(0, 2); //line 2 //Print SD status (7 chars) lcdui_print_percent_done(); if (MMU2::mmu2.Enabled()) { 2843e: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 28442: 81 30 cpi r24, 0x01 ; 1 28444: 09 f0 breq .+2 ; 0x28448 28446: e9 c0 rjmp .+466 ; 0x2861a // Print extruder status (5 chars) lcd_space(5 - lcdui_print_extruder()); 28448: 0f 94 24 22 call 0x24448 ; 0x24448 2844c: 95 e0 ldi r25, 0x05 ; 5 2844e: 98 1b sub r25, r24 28450: 89 2f mov r24, r25 } else if (farm_mode) { // Print farm number (5 chars) lcdui_print_farm(); } else { lcd_space(5); // 5 spaces 28452: 0e 94 6e 6e call 0xdcdc ; 0xdcdc 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()) { 28456: 0e 94 79 67 call 0xcef2 ; 0xcef2 2845a: 88 23 and r24, r24 2845c: 09 f4 brne .+2 ; 0x28460 2845e: fa c0 rjmp .+500 ; 0x28654 uint16_t print_tc = PRINT_TIME_REMAINING_INIT; // unit: minutes char suff = ' '; char suff_doubt = ' '; #ifdef TMC2130 if (SilentModeMenu != SILENT_MODE_OFF) { 28460: 80 91 a2 03 lds r24, 0x03A2 ; 0x8003a2 28464: 88 23 and r24, r24 28466: 09 f4 brne .+2 ; 0x2846a 28468: da c0 rjmp .+436 ; 0x2861e if (print_time_remaining_silent != PRINT_TIME_REMAINING_INIT) 2846a: c0 90 b5 02 lds r12, 0x02B5 ; 0x8002b5 2846e: d0 90 b6 02 lds r13, 0x02B6 ; 0x8002b6 print_tr = print_time_remaining_silent; //#ifdef CLOCK_INTERVAL_TIME if (print_time_to_change_silent != PRINT_TIME_REMAINING_INIT) 28472: e0 90 b3 02 lds r14, 0x02B3 ; 0x8002b3 28476: f0 90 b4 02 lds r15, 0x02B4 ; 0x8002b4 #ifdef TMC2130 } #endif //TMC2130 //#ifdef CLOCK_INTERVAL_TIME if (clock_interval == CLOCK_INTERVAL_TIME*2) 2847a: 80 91 4e 06 lds r24, 0x064E ; 0x80064e 2847e: 8a 30 cpi r24, 0x0A ; 10 28480: 11 f4 brne .+4 ; 0x28486 clock_interval = 0; 28482: 10 92 4e 06 sts 0x064E, r1 ; 0x80064e clock_interval++; 28486: 80 91 4e 06 lds r24, 0x064E ; 0x80064e 2848a: 8f 5f subi r24, 0xFF ; 255 2848c: 80 93 4e 06 sts 0x064E, r24 ; 0x80064e if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) { 28490: 2f ef ldi r18, 0xFF ; 255 28492: e2 16 cp r14, r18 28494: f2 06 cpc r15, r18 28496: 21 f0 breq .+8 ; 0x284a0 28498: 97 01 movw r18, r14 print_t = print_tc; suff = 'C'; 2849a: 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) { 2849c: 86 30 cpi r24, 0x06 ; 6 2849e: 70 f4 brcc .+28 ; 0x284bc print_t = print_tc; suff = 'C'; } else //#endif //CLOCK_INTERVAL_TIME if (print_tr != PRINT_TIME_REMAINING_INIT) { 284a0: 3f ef ldi r19, 0xFF ; 255 284a2: c3 16 cp r12, r19 284a4: d3 06 cpc r13, r19 284a6: 09 f0 breq .+2 ; 0x284aa 284a8: c3 c0 rjmp .+390 ; 0x28630 print_t = print_tr; suff = 'R'; } else print_t = print_job_timer.duration() / 60; 284aa: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 284ae: 2c e3 ldi r18, 0x3C ; 60 284b0: 30 e0 ldi r19, 0x00 ; 0 284b2: 40 e0 ldi r20, 0x00 ; 0 284b4: 50 e0 ldi r21, 0x00 ; 0 284b6: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__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 = ' '; 284ba: 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)) { 284bc: 40 91 39 02 lds r20, 0x0239 ; 0x800239 284c0: 50 91 3a 02 lds r21, 0x023A ; 0x80023a 284c4: 44 36 cpi r20, 0x64 ; 100 284c6: 51 05 cpc r21, r1 284c8: 09 f4 brne .+2 ; 0x284cc 284ca: b5 c0 rjmp .+362 ; 0x28636 284cc: c2 16 cp r12, r18 284ce: d3 06 cpc r13, r19 284d0: 21 f0 breq .+8 ; 0x284da 284d2: e2 16 cp r14, r18 284d4: f3 06 cpc r15, r19 284d6: 09 f0 breq .+2 ; 0x284da 284d8: ae c0 rjmp .+348 ; 0x28636 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); 284da: a4 e6 ldi r26, 0x64 ; 100 284dc: b0 e0 ldi r27, 0x00 ; 0 284de: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 284e2: 9a 01 movw r18, r20 284e4: 55 0f add r21, r21 284e6: 44 0b sbc r20, r20 284e8: 55 0b sbc r21, r21 284ea: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> suff = 'R'; } else print_t = print_job_timer.duration() / 60; if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc)) { suff_doubt = '?'; 284ee: 4f e3 ldi r20, 0x3F ; 63 284f0: e4 2e mov r14, r20 284f2: 04 2e mov r0, r20 284f4: 00 0c add r0, r0 284f6: ff 08 sbc r15, r15 284f8: e1 2f mov r30, r17 284fa: 01 2e mov r0, r17 284fc: 00 0c add r0, r0 284fe: ff 0b sbc r31, r31 28500: c9 01 movw r24, r18 28502: 6c e3 ldi r22, 0x3C ; 60 28504: 70 e0 ldi r23, 0x00 ; 0 28506: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__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 2850a: 20 37 cpi r18, 0x70 ; 112 2850c: 37 41 sbci r19, 0x17 ; 23 2850e: 08 f0 brcs .+2 ; 0x28512 28510: 94 c0 rjmp .+296 ; 0x2863a chars = lcd_printf_P(_N(LCD_STR_CLOCK "%02u:%02u%c%c"), print_t / 60, print_t % 60, suff, suff_doubt); 28512: ff 92 push r15 28514: 4f 93 push r20 28516: ff 93 push r31 28518: 1f 93 push r17 2851a: 9f 93 push r25 2851c: 8f 93 push r24 2851e: 7f 93 push r23 28520: 6f 93 push r22 28522: 89 e8 ldi r24, 0x89 ; 137 28524: 9e e6 ldi r25, 0x6E ; 110 28526: 9f 93 push r25 28528: 8f 93 push r24 2852a: 0e 94 51 6e call 0xdca2 ; 0xdca2 else //time>=100h chars = lcd_printf_P(_N(LCD_STR_CLOCK "%3uh %c%c"), print_t / 60, suff, suff_doubt); 2852e: 0f b6 in r0, 0x3f ; 63 28530: f8 94 cli 28532: de bf out 0x3e, r29 ; 62 28534: 0f be out 0x3f, r0 ; 63 28536: 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); 28538: 98 e0 ldi r25, 0x08 ; 8 2853a: 98 1b sub r25, r24 2853c: 89 2f mov r24, r25 2853e: 0e 94 6e 6e call 0xdcdc ; 0xdcdc #else //Print time (8chars) lcdui_print_time(); #endif //CMD_DIAGNOSTICS lcd_set_cursor(0, 3); //line 3 28542: 63 e0 ldi r22, 0x03 ; 3 28544: 80 e0 ldi r24, 0x00 ; 0 28546: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 #ifndef DEBUG_DISABLE_LCD_STATUS_LINE lcdui_print_status_line(); 2854a: 0f 94 4f 2b call 0x2569e ; 0x2569e lcdui_print_status_screen(); prusa_statistics_update_from_status_screen(); if (lcd_commands_type != LcdCommands::Idle) 2854e: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 28552: 88 23 and r24, r24 28554: 09 f4 brne .+2 ; 0x28558 28556: 3e ce rjmp .-900 ; 0x281d4 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) { 28558: 80 91 ab 0d lds r24, 0x0DAB ; 0x800dab 2855c: 81 11 cpse r24, r1 2855e: 3a ce rjmp .-908 ; 0x281d4 28560: 0f 94 45 07 call 0x20e8a ; 0x20e8a 28564: 37 ce rjmp .-914 ; 0x281d4 lcd_printf_P(PSTR("%-7s"),sheet); return; //do not also print the percentage } } if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName()) 28566: e1 10 cpse r14, r1 28568: 04 c0 rjmp .+8 ; 0x28572 2856a: 80 91 9c 03 lds r24, 0x039C ; 0x80039c <_ZL9M79_timer.lto_priv.452> 2856e: 81 11 cpse r24, r1 28570: 4a c0 rjmp .+148 ; 0x28606 // Overwrite the name char * hostName = GetHostStatusScreenName(); lcd_space(1); // Blank space lcd_print(hostName); // Two characters } else { lcd_printf_P(PSTR("%3S"), src); 28572: df 92 push r13 28574: cf 92 push r12 28576: 88 ec ldi r24, 0xC8 ; 200 28578: 9f e9 ldi r25, 0x9F ; 159 2857a: 9f 93 push r25 2857c: 8f 93 push r24 2857e: 0e 94 51 6e call 0xdca2 ; 0xdca2 28582: 0f 90 pop r0 28584: 0f 90 pop r0 28586: 0f 90 pop r0 28588: 0f 90 pop r0 uint8_t calc_percent_done() { //in case that we have information from M73 gcode return percentage counted by slicer, else return percentage counted as byte_printed/filesize uint8_t percent_done = 0; #ifdef TMC2130 if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100) 2858a: 80 91 a2 03 lds r24, 0x03A2 ; 0x8003a2 2858e: 81 11 cpse r24, r1 28590: 04 c0 rjmp .+8 ; 0x2859a 28592: 80 91 ae 02 lds r24, 0x02AE ; 0x8002ae 28596: 85 36 cpi r24, 0x65 ; 101 28598: f0 f1 brcs .+124 ; 0x28616 { percent_done = print_percent_done_normal; } else if (print_percent_done_silent <= 100) 2859a: 80 91 ad 02 lds r24, 0x02AD ; 0x8002ad 2859e: 85 36 cpi r24, 0x65 ; 101 285a0: d0 f1 brcs .+116 ; 0x28616 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;}; 285a2: 80 91 22 17 lds r24, 0x1722 ; 0x801722 285a6: 88 23 and r24, r24 285a8: 19 f1 breq .+70 ; 0x285f0 285aa: 80 91 9c 17 lds r24, 0x179C ; 0x80179c 285ae: 90 91 9d 17 lds r25, 0x179D ; 0x80179d 285b2: a0 91 9e 17 lds r26, 0x179E ; 0x80179e 285b6: b0 91 9f 17 lds r27, 0x179F ; 0x80179f 285ba: 00 97 sbiw r24, 0x00 ; 0 285bc: a1 05 cpc r26, r1 285be: b1 05 cpc r27, r1 285c0: b9 f0 breq .+46 ; 0x285f0 285c2: bc 01 movw r22, r24 285c4: cd 01 movw r24, r26 285c6: 6d 59 subi r22, 0x9D ; 157 285c8: 7f 4f sbci r23, 0xFF ; 255 285ca: 8f 4f sbci r24, 0xFF ; 255 285cc: 9f 4f sbci r25, 0xFF ; 255 285ce: 24 e6 ldi r18, 0x64 ; 100 285d0: 30 e0 ldi r19, 0x00 ; 0 285d2: 40 e0 ldi r20, 0x00 ; 0 285d4: 50 e0 ldi r21, 0x00 ; 0 285d6: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 285da: 60 91 a3 17 lds r22, 0x17A3 ; 0x8017a3 285de: 70 91 a4 17 lds r23, 0x17A4 ; 0x8017a4 285e2: 80 91 a5 17 lds r24, 0x17A5 ; 0x8017a5 285e6: 90 91 a6 17 lds r25, 0x17A6 ; 0x8017a6 285ea: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 285ee: 12 2f mov r17, r18 } lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done()); 285f0: 21 2f mov r18, r17 285f2: 30 e0 ldi r19, 0x00 ; 0 285f4: 83 e6 ldi r24, 0x63 ; 99 285f6: 9e e6 ldi r25, 0x6E ; 110 285f8: f1 10 cpse r15, r1 285fa: 02 c0 rjmp .+4 ; 0x28600 285fc: 8d e5 ldi r24, 0x5D ; 93 285fe: 9e e6 ldi r25, 0x6E ; 110 28600: 3f 93 push r19 28602: 2f 93 push r18 28604: 14 cf rjmp .-472 ; 0x2842e if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName()) { // Overwrite the name char * hostName = GetHostStatusScreenName(); lcd_space(1); // Blank space 28606: 81 e0 ldi r24, 0x01 ; 1 28608: 0e 94 6e 6e call 0xdcdc ; 0xdcdc lcd_print(hostName); // Two characters 2860c: 8b e4 ldi r24, 0x4B ; 75 2860e: 96 e0 ldi r25, 0x06 ; 6 28610: 0e 94 7f 70 call 0xe0fe ; 0xe0fe 28614: ba cf rjmp .-140 ; 0x2858a 28616: 18 2f mov r17, r24 28618: eb cf rjmp .-42 ; 0x285f0 lcd_space(5 - lcdui_print_extruder()); } else if (farm_mode) { // Print farm number (5 chars) lcdui_print_farm(); } else { lcd_space(5); // 5 spaces 2861a: 85 e0 ldi r24, 0x05 ; 5 2861c: 1a cf rjmp .-460 ; 0x28452 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) 2861e: c0 90 b1 02 lds r12, 0x02B1 ; 0x8002b1 28622: d0 90 b2 02 lds r13, 0x02B2 ; 0x8002b2 print_tr = print_time_remaining_normal; //#ifdef CLOCK_INTERVAL_TIME if (print_time_to_change_normal != PRINT_TIME_REMAINING_INIT) 28626: e0 90 af 02 lds r14, 0x02AF ; 0x8002af 2862a: f0 90 b0 02 lds r15, 0x02B0 ; 0x8002b0 2862e: 25 cf rjmp .-438 ; 0x2847a 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) { 28630: 96 01 movw r18, r12 print_t = print_tr; suff = 'R'; 28632: 12 e5 ldi r17, 0x52 ; 82 28634: 43 cf rjmp .-378 ; 0x284bc 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 = ' '; 28636: 40 e2 ldi r20, 0x20 ; 32 28638: 5b cf rjmp .-330 ; 0x284f0 } 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); 2863a: ff 92 push r15 2863c: 4f 93 push r20 2863e: ff 93 push r31 28640: 1f 93 push r17 28642: 7f 93 push r23 28644: 6f 93 push r22 28646: 8e e7 ldi r24, 0x7E ; 126 28648: 9e e6 ldi r25, 0x6E ; 110 2864a: 9f 93 push r25 2864c: 8f 93 push r24 2864e: 0e 94 51 6e call 0xdca2 ; 0xdca2 28652: 6d cf rjmp .-294 ; 0x2852e } 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 "--:-- ")); 28654: 85 e7 ldi r24, 0x75 ; 117 28656: 9e e6 ldi r25, 0x6E ; 110 28658: 9f 93 push r25 2865a: 8f 93 push r24 2865c: 0e 94 51 6e call 0xdca2 ; 0xdca2 28660: 0f 90 pop r0 28662: 0f 90 pop r0 28664: 69 cf rjmp .-302 ; 0x28538 00028666 : reset(); if ((accumulator = with_time)) state = RUNNING; } void Stopwatch::reset() { state = STOPPED; 28666: 10 92 9b 03 sts 0x039B, r1 ; 0x80039b startTimestamp = 0; 2866a: 10 92 a6 05 sts 0x05A6, r1 ; 0x8005a6 2866e: 10 92 a7 05 sts 0x05A7, r1 ; 0x8005a7 28672: 10 92 a8 05 sts 0x05A8, r1 ; 0x8005a8 28676: 10 92 a9 05 sts 0x05A9, r1 ; 0x8005a9 stopTimestamp = 0; 2867a: 10 92 51 06 sts 0x0651, r1 ; 0x800651 2867e: 10 92 52 06 sts 0x0652, r1 ; 0x800652 28682: 10 92 53 06 sts 0x0653, r1 ; 0x800653 28686: 10 92 54 06 sts 0x0654, r1 ; 0x800654 accumulator = 0; 2868a: 10 92 a2 05 sts 0x05A2, r1 ; 0x8005a2 2868e: 10 92 a3 05 sts 0x05A3, r1 ; 0x8005a3 28692: 10 92 a4 05 sts 0x05A4, r1 ; 0x8005a4 28696: 10 92 a5 05 sts 0x05A5, r1 ; 0x8005a5 } 2869a: 08 95 ret 0002869c : /** * @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; } 2869c: 80 91 9b 03 lds r24, 0x039B ; 0x80039b } else return false; } bool Stopwatch::start() { if (!isRunning()) { 286a0: 81 30 cpi r24, 0x01 ; 1 286a2: f1 f0 breq .+60 ; 0x286e0 if (isPaused()) accumulator = duration(); 286a4: 82 30 cpi r24, 0x02 ; 2 286a6: c9 f4 brne .+50 ; 0x286da 286a8: 0f 94 7b 3f call 0x27ef6 ; 0x27ef6 286ac: 60 93 a2 05 sts 0x05A2, r22 ; 0x8005a2 286b0: 70 93 a3 05 sts 0x05A3, r23 ; 0x8005a3 286b4: 80 93 a4 05 sts 0x05A4, r24 ; 0x8005a4 286b8: 90 93 a5 05 sts 0x05A5, r25 ; 0x8005a5 else reset(); state = RUNNING; 286bc: 81 e0 ldi r24, 0x01 ; 1 286be: 80 93 9b 03 sts 0x039B, r24 ; 0x80039b startTimestamp = _millis(); 286c2: 0f 94 28 2a call 0x25450 ; 0x25450 286c6: 60 93 a6 05 sts 0x05A6, r22 ; 0x8005a6 286ca: 70 93 a7 05 sts 0x05A7, r23 ; 0x8005a7 286ce: 80 93 a8 05 sts 0x05A8, r24 ; 0x8005a8 286d2: 90 93 a9 05 sts 0x05A9, r25 ; 0x8005a9 286d6: 81 e0 ldi r24, 0x01 ; 1 286d8: 08 95 ret } bool Stopwatch::start() { if (!isRunning()) { if (isPaused()) accumulator = duration(); else reset(); 286da: 0f 94 33 43 call 0x28666 ; 0x28666 286de: ee cf rjmp .-36 ; 0x286bc state = RUNNING; startTimestamp = _millis(); return true; } else return false; 286e0: 80 e0 ldi r24, 0x00 ; 0 } 286e2: 08 95 ret 000286e4 : uint32_t Stopwatch::accumulator; uint32_t Stopwatch::startTimestamp; uint32_t Stopwatch::stopTimestamp; bool Stopwatch::stop() { if (isRunning() || isPaused()) { 286e4: 80 91 9b 03 lds r24, 0x039B ; 0x80039b 286e8: 81 50 subi r24, 0x01 ; 1 286ea: 82 30 cpi r24, 0x02 ; 2 286ec: 70 f4 brcc .+28 ; 0x2870a state = STOPPED; 286ee: 10 92 9b 03 sts 0x039B, r1 ; 0x80039b stopTimestamp = _millis(); 286f2: 0f 94 28 2a call 0x25450 ; 0x25450 286f6: 60 93 51 06 sts 0x0651, r22 ; 0x800651 286fa: 70 93 52 06 sts 0x0652, r23 ; 0x800652 286fe: 80 93 53 06 sts 0x0653, r24 ; 0x800653 28702: 90 93 54 06 sts 0x0654, r25 ; 0x800654 28706: 81 e0 ldi r24, 0x01 ; 1 28708: 08 95 ret return true; } else return false; 2870a: 80 e0 ldi r24, 0x00 ; 0 } 2870c: 08 95 ret 0002870e : } long st_get_position(uint8_t axis) { long count_pos; CRITICAL_SECTION_START; 2870e: 2f b7 in r18, 0x3f ; 63 28710: f8 94 cli count_pos = count_position[axis]; 28712: 94 e0 ldi r25, 0x04 ; 4 28714: 89 9f mul r24, r25 28716: f0 01 movw r30, r0 28718: 11 24 eor r1, r1 2871a: ee 54 subi r30, 0x4E ; 78 2871c: f9 4f sbci r31, 0xF9 ; 249 2871e: 60 81 ld r22, Z 28720: 71 81 ldd r23, Z+1 ; 0x01 28722: 82 81 ldd r24, Z+2 ; 0x02 28724: 93 81 ldd r25, Z+3 ; 0x03 CRITICAL_SECTION_END; 28726: 2f bf out 0x3f, r18 ; 63 return count_pos; } 28728: 08 95 ret 0002872a : y = count_position[Y_AXIS]; CRITICAL_SECTION_END; } float st_get_position_mm(uint8_t axis) { 2872a: cf 93 push r28 2872c: c8 2f mov r28, r24 float steper_position_in_steps = st_get_position(axis); 2872e: 0f 94 87 43 call 0x2870e ; 0x2870e 28732: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> return steper_position_in_steps / cs.axis_steps_per_mm[axis]; 28736: 24 e0 ldi r18, 0x04 ; 4 28738: c2 9f mul r28, r18 2873a: f0 01 movw r30, r0 2873c: 11 24 eor r1, r1 2873e: ef 53 subi r30, 0x3F ; 63 28740: f2 4f sbci r31, 0xF2 ; 242 28742: 20 81 ld r18, Z 28744: 31 81 ldd r19, Z+1 ; 0x01 28746: 42 81 ldd r20, Z+2 ; 0x02 28748: 53 81 ldd r21, Z+3 ; 0x03 2874a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> } 2874e: cf 91 pop r28 28750: 08 95 ret 00028752 : } // Block until all buffered steps are executed void st_synchronize() { 28752: cf 93 push r28 28754: df 93 push r29 28756: 00 d0 rcall .+0 ; 0x28758 28758: 1f 92 push r1 2875a: cd b7 in r28, 0x3d ; 61 2875c: de b7 in r29, 0x3e ; 62 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); 2875e: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 28762: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 while(blocks_queued()) 28766: 98 17 cp r25, r24 28768: 09 f4 brne .+2 ; 0x2876c 2876a: 46 c0 rjmp .+140 ; 0x287f8 { #ifdef TMC2130 manage_heater(); 2876c: 0f 94 34 39 call 0x27268 ; 0x27268 tmc2130_sg_stop_on_crash = eeprom_read_byte((uint8_t*)EEPROM_CRASH_DET); } bool tmc2130_update_sg() { if (tmc2130_sg_measure <= E_AXIS) 28770: 80 91 3b 02 lds r24, 0x023B ; 0x80023b <_ZL18tmc2130_sg_measure.lto_priv.475> 28774: 84 30 cpi r24, 0x04 ; 4 28776: 38 f0 brcs .+14 ; 0x28786 // Vojtech: Don't disable motors inside the planner! if (!tmc2130_update_sg()) { manage_inactivity(true); 28778: 81 e0 ldi r24, 0x01 ; 1 2877a: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 2877e: 80 e0 ldi r24, 0x00 ; 0 28780: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 28784: ec cf rjmp .-40 ; 0x2875e { uint32_t val32 = 0; 28786: 19 82 std Y+1, r1 ; 0x01 28788: 1a 82 std Y+2, r1 ; 0x02 2878a: 1b 82 std Y+3, r1 ; 0x03 2878c: 1c 82 std Y+4, r1 ; 0x04 tmc2130_rd(tmc2130_sg_measure, TMC2130_REG_DRV_STATUS, &val32); 2878e: ae 01 movw r20, r28 28790: 4f 5f subi r20, 0xFF ; 255 28792: 5f 4f sbci r21, 0xFF ; 255 28794: 6f e6 ldi r22, 0x6F ; 111 28796: 0f 94 cd 24 call 0x2499a ; 0x2499a tmc2130_sg_measure_val += (val32 & 0x3ff); 2879a: 89 81 ldd r24, Y+1 ; 0x01 2879c: 9a 81 ldd r25, Y+2 ; 0x02 2879e: ab 81 ldd r26, Y+3 ; 0x03 287a0: bc 81 ldd r27, Y+4 ; 0x04 287a2: 93 70 andi r25, 0x03 ; 3 287a4: aa 27 eor r26, r26 287a6: bb 27 eor r27, r27 287a8: 40 91 cf 03 lds r20, 0x03CF ; 0x8003cf <_ZL22tmc2130_sg_measure_val.lto_priv.476> 287ac: 50 91 d0 03 lds r21, 0x03D0 ; 0x8003d0 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x1> 287b0: 60 91 d1 03 lds r22, 0x03D1 ; 0x8003d1 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x2> 287b4: 70 91 d2 03 lds r23, 0x03D2 ; 0x8003d2 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x3> 287b8: 84 0f add r24, r20 287ba: 95 1f adc r25, r21 287bc: a6 1f adc r26, r22 287be: b7 1f adc r27, r23 287c0: 80 93 cf 03 sts 0x03CF, r24 ; 0x8003cf <_ZL22tmc2130_sg_measure_val.lto_priv.476> 287c4: 90 93 d0 03 sts 0x03D0, r25 ; 0x8003d0 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x1> 287c8: a0 93 d1 03 sts 0x03D1, r26 ; 0x8003d1 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x2> 287cc: b0 93 d2 03 sts 0x03D2, r27 ; 0x8003d2 <_ZL22tmc2130_sg_measure_val.lto_priv.476+0x3> tmc2130_sg_measure_cnt++; 287d0: 80 91 cb 03 lds r24, 0x03CB ; 0x8003cb <_ZL22tmc2130_sg_measure_cnt.lto_priv.477> 287d4: 90 91 cc 03 lds r25, 0x03CC ; 0x8003cc <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x1> 287d8: a0 91 cd 03 lds r26, 0x03CD ; 0x8003cd <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x2> 287dc: b0 91 ce 03 lds r27, 0x03CE ; 0x8003ce <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x3> 287e0: 01 96 adiw r24, 0x01 ; 1 287e2: a1 1d adc r26, r1 287e4: b1 1d adc r27, r1 287e6: 80 93 cb 03 sts 0x03CB, r24 ; 0x8003cb <_ZL22tmc2130_sg_measure_cnt.lto_priv.477> 287ea: 90 93 cc 03 sts 0x03CC, r25 ; 0x8003cc <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x1> 287ee: a0 93 cd 03 sts 0x03CD, r26 ; 0x8003cd <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x2> 287f2: b0 93 ce 03 sts 0x03CE, r27 ; 0x8003ce <_ZL22tmc2130_sg_measure_cnt.lto_priv.477+0x3> 287f6: b3 cf rjmp .-154 ; 0x2875e #else //TMC2130 // Vojtech: Don't disable motors inside the planner! delay_keep_alive(0); #endif //TMC2130 } } 287f8: 0f 90 pop r0 287fa: 0f 90 pop r0 287fc: 0f 90 pop r0 287fe: 0f 90 pop r0 28800: df 91 pop r29 28802: cf 91 pop r28 28804: 08 95 ret 00028806 : void st_reset_timer() { // Clear a possible pending interrupt on OCR1A overflow. TIFR1 |= 1 << OCF1A; 28806: b1 9a sbi 0x16, 1 ; 22 // Reset the counter. TCNT1 = 0; 28808: 10 92 85 00 sts 0x0085, r1 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 2880c: 10 92 84 00 sts 0x0084, r1 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> // Wake up after 1ms from now. OCR1A = 2000; 28810: 80 ed ldi r24, 0xD0 ; 208 28812: 97 e0 ldi r25, 0x07 ; 7 28814: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 28818: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> #ifdef LIN_ADVANCE nextMainISR = 0; 2881c: 10 92 e5 04 sts 0x04E5, r1 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 28820: 10 92 e4 04 sts 0x04E4, r1 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) 28824: 80 91 e2 04 lds r24, 0x04E2 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 28828: 90 91 e3 04 lds r25, 0x04E3 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 2882c: 01 97 sbiw r24, 0x01 ; 1 2882e: 8e 3f cpi r24, 0xFE ; 254 28830: 9f 4f sbci r25, 0xFF ; 255 28832: 20 f4 brcc .+8 ; 0x2883c nextAdvanceISR = 0; 28834: 10 92 e3 04 sts 0x04E3, r1 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 28838: 10 92 e2 04 sts 0x04E2, r1 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> #endif } 2883c: 08 95 ret 0002883e <__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) { 2883e: 1f 92 push r1 28840: 0f 92 push r0 28842: 0f b6 in r0, 0x3f ; 63 28844: 0f 92 push r0 28846: 11 24 eor r1, r1 28848: 0b b6 in r0, 0x3b ; 59 2884a: 0f 92 push r0 2884c: 6f 92 push r6 2884e: 7f 92 push r7 28850: 8f 92 push r8 28852: cf 92 push r12 28854: df 92 push r13 28856: ef 92 push r14 28858: ff 92 push r15 2885a: 0f 93 push r16 2885c: 1f 93 push r17 2885e: 2f 93 push r18 28860: 3f 93 push r19 28862: 4f 93 push r20 28864: 5f 93 push r21 28866: 6f 93 push r22 28868: 7f 93 push r23 2886a: 8f 93 push r24 2886c: 9f 93 push r25 2886e: af 93 push r26 28870: bf 93 push r27 28872: cf 93 push r28 28874: df 93 push r29 28876: ef 93 push r30 28878: ff 93 push r31 } } FORCE_INLINE void advance_isr_scheduler() { // Integrate the final timer value, accounting for scheduling adjustments if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) 2887a: 80 91 e2 04 lds r24, 0x04E2 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 2887e: 90 91 e3 04 lds r25, 0x04E3 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 28882: 9c 01 movw r18, r24 28884: 21 50 subi r18, 0x01 ; 1 28886: 31 09 sbc r19, r1 28888: 2e 3f cpi r18, 0xFE ; 254 2888a: 3f 4f sbci r19, 0xFF ; 255 2888c: 90 f4 brcc .+36 ; 0x288b2 <__vector_17+0x74> { if(nextAdvanceISR > OCR1A) 2888e: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 28892: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 28896: 28 17 cp r18, r24 28898: 39 07 cpc r19, r25 2889a: 08 f0 brcs .+2 ; 0x2889e <__vector_17+0x60> 2889c: f9 c0 rjmp .+498 ; 0x28a90 <__vector_17+0x252> nextAdvanceISR -= OCR1A; 2889e: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 288a2: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 288a6: 82 1b sub r24, r18 288a8: 93 0b sbc r25, r19 288aa: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 288ae: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> else nextAdvanceISR = 0; } if(nextMainISR > OCR1A) 288b2: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 288b6: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 288ba: 80 91 e4 04 lds r24, 0x04E4 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 288be: 90 91 e5 04 lds r25, 0x04E5 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 288c2: 28 17 cp r18, r24 288c4: 39 07 cpc r19, r25 288c6: 08 f0 brcs .+2 ; 0x288ca <__vector_17+0x8c> 288c8: e8 c0 rjmp .+464 ; 0x28a9a <__vector_17+0x25c> nextMainISR -= OCR1A; 288ca: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 288ce: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 288d2: 82 1b sub r24, r18 288d4: 93 0b sbc r25, r19 288d6: 90 93 e5 04 sts 0x04E5, r25 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 288da: 80 93 e4 04 sts 0x04E4, r24 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> else nextMainISR = 0; // Run main stepping ISR if flagged if (!nextMainISR) 288de: 80 91 e4 04 lds r24, 0x04E4 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 288e2: 90 91 e5 04 lds r25, 0x04E5 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 288e6: 89 2b or r24, r25 288e8: 11 f0 breq .+4 ; 0x288ee <__vector_17+0xb0> 288ea: 0d 94 6f 4d jmp 0x29ade ; 0x29ade <__vector_17+0x12a0> 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) 288ee: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 288f2: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 288f6: 30 97 sbiw r30, 0x00 ; 0 288f8: 09 f0 breq .+2 ; 0x288fc <__vector_17+0xbe> 288fa: 87 c1 rjmp .+782 ; 0x28c0a <__vector_17+0x3cc> // 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) { 288fc: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 28900: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 28904: 98 17 cp r25, r24 28906: 09 f4 brne .+2 ; 0x2890a <__vector_17+0xcc> 28908: f9 c1 rjmp .+1010 ; 0x28cfc <__vector_17+0x4be> return(NULL); } block_t *block = &block_buffer[block_buffer_tail]; 2890a: c0 91 a5 0d lds r28, 0x0DA5 ; 0x800da5 2890e: 2c 2f mov r18, r28 28910: 30 e0 ldi r19, 0x00 ; 0 28912: 5e e6 ldi r21, 0x6E ; 110 28914: c5 9f mul r28, r21 28916: e0 01 movw r28, r0 28918: 11 24 eor r1, r1 2891a: cc 53 subi r28, 0x3C ; 60 2891c: d9 4f sbci r29, 0xF9 ; 249 block->busy = true; 2891e: fe 01 movw r30, r28 28920: e9 5b subi r30, 0xB9 ; 185 28922: ff 4f sbci r31, 0xFF ; 255 28924: 41 e0 ldi r20, 0x01 ; 1 28926: 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(); 28928: d0 93 a1 05 sts 0x05A1, r29 ; 0x8005a1 2892c: c0 93 a0 05 sts 0x05A0, r28 ; 0x8005a0 if (current_block != NULL) { 28930: 20 97 sbiw r28, 0x00 ; 0 28932: 09 f4 brne .+2 ; 0x28936 <__vector_17+0xf8> 28934: e3 c1 rjmp .+966 ; 0x28cfc <__vector_17+0x4be> // 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; 28936: 10 92 9c 05 sts 0x059C, r1 ; 0x80059c 2893a: 10 92 9d 05 sts 0x059D, r1 ; 0x80059d 2893e: 10 92 9e 05 sts 0x059E, r1 ; 0x80059e 28942: 10 92 9f 05 sts 0x059F, r1 ; 0x80059f // 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; 28946: 10 92 9b 05 sts 0x059B, r1 ; 0x80059b acc_step_rate = uint16_t(current_block->initial_rate); 2894a: 8a ad ldd r24, Y+58 ; 0x3a 2894c: 9b ad ldd r25, Y+59 ; 0x3b 2894e: 90 93 9a 05 sts 0x059A, r25 ; 0x80059a 28952: 80 93 99 05 sts 0x0599, r24 ; 0x800599 #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; 28956: 81 34 cpi r24, 0x41 ; 65 28958: ec e9 ldi r30, 0x9C ; 156 2895a: 9e 07 cpc r25, r30 2895c: 08 f0 brcs .+2 ; 0x28960 <__vector_17+0x122> 2895e: a2 c0 rjmp .+324 ; 0x28aa4 <__vector_17+0x266> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 28960: 81 32 cpi r24, 0x21 ; 33 28962: fe e4 ldi r31, 0x4E ; 78 28964: 9f 07 cpc r25, r31 28966: 08 f4 brcc .+2 ; 0x2896a <__vector_17+0x12c> 28968: a0 c0 rjmp .+320 ; 0x28aaa <__vector_17+0x26c> step_rate = (step_rate >> 2)&0x3fff; 2896a: 96 95 lsr r25 2896c: 87 95 ror r24 2896e: 96 95 lsr r25 28970: 87 95 ror r24 step_loops = 4; 28972: 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; 28974: 40 93 98 05 sts 0x0598, r20 ; 0x800598 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 28978: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 2897a: 81 15 cp r24, r1 2897c: e8 e0 ldi r30, 0x08 ; 8 2897e: 9e 07 cpc r25, r30 28980: 08 f4 brcc .+2 ; 0x28984 <__vector_17+0x146> 28982: a4 c0 rjmp .+328 ; 0x28acc <__vector_17+0x28e> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 28984: e9 2f mov r30, r25 28986: ff 27 eor r31, r31 28988: ee 0f add r30, r30 2898a: ff 1f adc r31, r31 2898c: ee 0f add r30, r30 2898e: ff 1f adc r31, r31 28990: af 01 movw r20, r30 28992: 4f 55 subi r20, 0x5F ; 95 28994: 5a 46 sbci r21, 0x6A ; 106 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 28996: fa 01 movw r30, r20 28998: 32 96 adiw r30, 0x02 ; 2 2899a: a5 91 lpm r26, Z+ 2899c: b4 91 lpm r27, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 2899e: fa 01 movw r30, r20 289a0: 45 91 lpm r20, Z+ 289a2: 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. ); 289a4: b8 9f mul r27, r24 289a6: b0 01 movw r22, r0 289a8: a8 9f mul r26, r24 289aa: 00 0c add r0, r0 289ac: 61 1d adc r22, r1 289ae: 11 24 eor r1, r1 289b0: 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); 289b2: ca 01 movw r24, r20 289b4: 86 1b sub r24, r22 289b6: 97 0b sbc r25, r23 acceleration_time = calc_timer(acc_step_rate, step_loops); 289b8: 84 36 cpi r24, 0x64 ; 100 289ba: 91 05 cpc r25, r1 289bc: 10 f4 brcc .+4 ; 0x289c2 <__vector_17+0x184> 289be: 84 e6 ldi r24, 0x64 ; 100 289c0: 90 e0 ldi r25, 0x00 ; 0 289c2: b0 e0 ldi r27, 0x00 ; 0 289c4: a0 e0 ldi r26, 0x00 ; 0 289c6: 80 93 94 05 sts 0x0594, r24 ; 0x800594 289ca: 90 93 95 05 sts 0x0595, r25 ; 0x800595 289ce: a0 93 96 05 sts 0x0596, r26 ; 0x800596 289d2: b0 93 97 05 sts 0x0597, r27 ; 0x800597 #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 289d6: 4e e6 ldi r20, 0x6E ; 110 289d8: 42 9f mul r20, r18 289da: c0 01 movw r24, r0 289dc: 43 9f mul r20, r19 289de: 90 0d add r25, r0 289e0: 11 24 eor r1, r1 289e2: 8c 53 subi r24, 0x3C ; 60 289e4: 99 4f sbci r25, 0xF9 ; 249 289e6: fc 01 movw r30, r24 289e8: e4 5b subi r30, 0xB4 ; 180 289ea: ff 4f sbci r31, 0xFF ; 255 289ec: 40 81 ld r20, Z 289ee: 44 23 and r20, r20 289f0: 49 f0 breq .+18 ; 0x28a04 <__vector_17+0x1c6> target_adv_steps = current_block->max_adv_steps; 289f2: 81 5b subi r24, 0xB1 ; 177 289f4: 9f 4f sbci r25, 0xFF ; 255 289f6: fc 01 movw r30, r24 289f8: 80 81 ld r24, Z 289fa: 91 81 ldd r25, Z+1 ; 0x01 289fc: 90 93 93 05 sts 0x0593, r25 ; 0x800593 28a00: 80 93 92 05 sts 0x0592, r24 ; 0x800592 } e_steps = 0; 28a04: 10 92 91 05 sts 0x0591, r1 ; 0x800591 nextAdvanceISR = ADV_NEVER; 28a08: 8f ef ldi r24, 0xFF ; 255 28a0a: 9f ef ldi r25, 0xFF ; 255 28a0c: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 28a10: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> LA_phase = -1; 28a14: 80 93 90 05 sts 0x0590, r24 ; 0x800590 #endif if (current_block->flag & BLOCK_FLAG_E_RESET) { 28a18: 8e e6 ldi r24, 0x6E ; 110 28a1a: 82 9f mul r24, r18 28a1c: f0 01 movw r30, r0 28a1e: 83 9f mul r24, r19 28a20: f0 0d add r31, r0 28a22: 11 24 eor r1, r1 28a24: ec 53 subi r30, 0x3C ; 60 28a26: f9 4f sbci r31, 0xF9 ; 249 28a28: 85 a9 ldd r24, Z+53 ; 0x35 28a2a: 84 ff sbrs r24, 4 28a2c: 08 c0 rjmp .+16 ; 0x28a3e <__vector_17+0x200> count_position[E_AXIS] = 0; 28a2e: 10 92 be 06 sts 0x06BE, r1 ; 0x8006be 28a32: 10 92 bf 06 sts 0x06BF, r1 ; 0x8006bf 28a36: 10 92 c0 06 sts 0x06C0, r1 ; 0x8006c0 28a3a: 10 92 c1 06 sts 0x06C1, r1 ; 0x8006c1 } if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) { 28a3e: 83 ff sbrs r24, 3 28a40: 66 c0 rjmp .+204 ; 0x28b0e <__vector_17+0x2d0> const int16_t value = -(current_block->step_event_count.lo >> 1); 28a42: 8e e6 ldi r24, 0x6E ; 110 28a44: 82 9f mul r24, r18 28a46: f0 01 movw r30, r0 28a48: 83 9f mul r24, r19 28a4a: f0 0d add r31, r0 28a4c: 11 24 eor r1, r1 28a4e: ec 53 subi r30, 0x3C ; 60 28a50: f9 4f sbci r31, 0xF9 ; 249 28a52: 80 89 ldd r24, Z+16 ; 0x10 28a54: 91 89 ldd r25, Z+17 ; 0x11 28a56: 96 95 lsr r25 28a58: 87 95 ror r24 28a5a: 91 95 neg r25 28a5c: 81 95 neg r24 28a5e: 91 09 sbc r25, r1 for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { counter[axis].lo = value; 28a60: 90 93 81 05 sts 0x0581, r25 ; 0x800581 28a64: 80 93 80 05 sts 0x0580, r24 ; 0x800580 28a68: 90 93 85 05 sts 0x0585, r25 ; 0x800585 28a6c: 80 93 84 05 sts 0x0584, r24 ; 0x800584 28a70: 90 93 89 05 sts 0x0589, r25 ; 0x800589 28a74: 80 93 88 05 sts 0x0588, r24 ; 0x800588 28a78: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 28a7c: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].lo != 0; 28a80: 81 e0 ldi r24, 0x01 ; 1 28a82: 24 85 ldd r18, Z+12 ; 0x0c 28a84: 35 85 ldd r19, Z+13 ; 0x0d 28a86: 23 2b or r18, r19 28a88: 09 f0 breq .+2 ; 0x28a8c <__vector_17+0x24e> 28a8a: 82 c0 rjmp .+260 ; 0x28b90 <__vector_17+0x352> 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; 28a8c: 80 e0 ldi r24, 0x00 ; 0 28a8e: 80 c0 rjmp .+256 ; 0x28b90 <__vector_17+0x352> if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER) { if(nextAdvanceISR > OCR1A) nextAdvanceISR -= OCR1A; else nextAdvanceISR = 0; 28a90: 10 92 e3 04 sts 0x04E3, r1 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 28a94: 10 92 e2 04 sts 0x04E2, r1 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 28a98: 0c cf rjmp .-488 ; 0x288b2 <__vector_17+0x74> } if(nextMainISR > OCR1A) nextMainISR -= OCR1A; else nextMainISR = 0; 28a9a: 10 92 e5 04 sts 0x04E5, r1 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 28a9e: 10 92 e4 04 sts 0x04E4, r1 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 28aa2: 1d cf rjmp .-454 ; 0x288de <__vector_17+0xa0> #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; 28aa4: 80 e4 ldi r24, 0x40 ; 64 28aa6: 9c e9 ldi r25, 0x9C ; 156 28aa8: 60 cf rjmp .-320 ; 0x2896a <__vector_17+0x12c> 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 28aaa: 81 31 cpi r24, 0x11 ; 17 28aac: 57 e2 ldi r21, 0x27 ; 39 28aae: 95 07 cpc r25, r21 28ab0: 20 f0 brcs .+8 ; 0x28aba <__vector_17+0x27c> step_rate = (step_rate >> 1)&0x7fff; 28ab2: 96 95 lsr r25 28ab4: 87 95 ror r24 step_loops = 2; 28ab6: 42 e0 ldi r20, 0x02 ; 2 28ab8: 5d cf rjmp .-326 ; 0x28974 <__vector_17+0x136> } else { step_loops = 1; 28aba: 40 93 98 05 sts 0x0598, r20 ; 0x800598 28abe: 80 32 cpi r24, 0x20 ; 32 28ac0: 91 05 cpc r25, r1 28ac2: 08 f0 brcs .+2 ; 0x28ac6 <__vector_17+0x288> 28ac4: 59 cf rjmp .-334 ; 0x28978 <__vector_17+0x13a> 28ac6: 80 e2 ldi r24, 0x20 ; 32 28ac8: 90 e0 ldi r25, 0x00 ; 0 28aca: 56 cf rjmp .-340 ; 0x28978 <__vector_17+0x13a> 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; 28acc: ac 01 movw r20, r24 28ace: 56 95 lsr r21 28ad0: 47 95 ror r20 28ad2: 4c 7f andi r20, 0xFC ; 252 28ad4: 4f 55 subi r20, 0x5F ; 95 28ad6: 5e 46 sbci r21, 0x6E ; 110 timer = (unsigned short)pgm_read_word_near(table_address); 28ad8: fa 01 movw r30, r20 28ada: 65 91 lpm r22, Z+ 28adc: 74 91 lpm r23, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 28ade: fa 01 movw r30, r20 28ae0: 32 96 adiw r30, 0x02 ; 2 28ae2: a5 91 lpm r26, Z+ 28ae4: b4 91 lpm r27, Z 28ae6: ac 01 movw r20, r24 28ae8: 47 70 andi r20, 0x07 ; 7 28aea: 55 27 eor r21, r21 28aec: 4a 9f mul r20, r26 28aee: c0 01 movw r24, r0 28af0: 4b 9f mul r20, r27 28af2: 90 0d add r25, r0 28af4: 5a 9f mul r21, r26 28af6: 90 0d add r25, r0 28af8: 11 24 eor r1, r1 28afa: e3 e0 ldi r30, 0x03 ; 3 28afc: 96 95 lsr r25 28afe: 87 95 ror r24 28b00: ea 95 dec r30 28b02: e1 f7 brne .-8 ; 0x28afc <__vector_17+0x2be> 28b04: ab 01 movw r20, r22 28b06: 48 1b sub r20, r24 28b08: 59 0b sbc r21, r25 28b0a: ca 01 movw r24, r20 28b0c: 55 cf rjmp .-342 ; 0x289b8 <__vector_17+0x17a> } #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); 28b0e: 8e e6 ldi r24, 0x6E ; 110 28b10: 82 9f mul r24, r18 28b12: f0 01 movw r30, r0 28b14: 83 9f mul r24, r19 28b16: f0 0d add r31, r0 28b18: 11 24 eor r1, r1 28b1a: ec 53 subi r30, 0x3C ; 60 28b1c: f9 4f sbci r31, 0xF9 ; 249 28b1e: 80 89 ldd r24, Z+16 ; 0x10 28b20: 91 89 ldd r25, Z+17 ; 0x11 28b22: a2 89 ldd r26, Z+18 ; 0x12 28b24: b3 89 ldd r27, Z+19 ; 0x13 28b26: b6 95 lsr r27 28b28: a7 95 ror r26 28b2a: 97 95 ror r25 28b2c: 87 95 ror r24 28b2e: b0 95 com r27 28b30: a0 95 com r26 28b32: 90 95 com r25 28b34: 81 95 neg r24 28b36: 9f 4f sbci r25, 0xFF ; 255 28b38: af 4f sbci r26, 0xFF ; 255 28b3a: bf 4f sbci r27, 0xFF ; 255 for (uint8_t axis = 0; axis < NUM_AXIS; axis++) { counter[axis].wide = value; 28b3c: 80 93 80 05 sts 0x0580, r24 ; 0x800580 28b40: 90 93 81 05 sts 0x0581, r25 ; 0x800581 28b44: a0 93 82 05 sts 0x0582, r26 ; 0x800582 28b48: b0 93 83 05 sts 0x0583, r27 ; 0x800583 28b4c: 80 93 84 05 sts 0x0584, r24 ; 0x800584 28b50: 90 93 85 05 sts 0x0585, r25 ; 0x800585 28b54: a0 93 86 05 sts 0x0586, r26 ; 0x800586 28b58: b0 93 87 05 sts 0x0587, r27 ; 0x800587 28b5c: 80 93 88 05 sts 0x0588, r24 ; 0x800588 28b60: 90 93 89 05 sts 0x0589, r25 ; 0x800589 28b64: a0 93 8a 05 sts 0x058A, r26 ; 0x80058a 28b68: b0 93 8b 05 sts 0x058B, r27 ; 0x80058b 28b6c: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c 28b70: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 28b74: a0 93 8e 05 sts 0x058E, r26 ; 0x80058e 28b78: b0 93 8f 05 sts 0x058F, r27 ; 0x80058f } #ifdef LIN_ADVANCE e_extruding = current_block->steps[E_AXIS].wide != 0; 28b7c: 81 e0 ldi r24, 0x01 ; 1 28b7e: 44 85 ldd r20, Z+12 ; 0x0c 28b80: 55 85 ldd r21, Z+13 ; 0x0d 28b82: 66 85 ldd r22, Z+14 ; 0x0e 28b84: 77 85 ldd r23, Z+15 ; 0x0f 28b86: 45 2b or r20, r21 28b88: 46 2b or r20, r22 28b8a: 47 2b or r20, r23 28b8c: 09 f4 brne .+2 ; 0x28b90 <__vector_17+0x352> 28b8e: 7e cf rjmp .-260 ; 0x28a8c <__vector_17+0x24e> 28b90: 80 93 7f 05 sts 0x057F, r24 ; 0x80057f #endif } step_events_completed.wide = 0; 28b94: 10 92 7b 05 sts 0x057B, r1 ; 0x80057b 28b98: 10 92 7c 05 sts 0x057C, r1 ; 0x80057c 28b9c: 10 92 7d 05 sts 0x057D, r1 ; 0x80057d 28ba0: 10 92 7e 05 sts 0x057E, r1 ; 0x80057e // Set directions. out_bits = current_block->direction_bits; 28ba4: 88 8d ldd r24, Y+24 ; 0x18 28ba6: 80 93 7a 05 sts 0x057A, r24 ; 0x80057a // 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); 28bae: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 28bb2: 81 60 ori r24, 0x01 ; 1 28bb4: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[X_AXIS]=-1; 28bb8: 8f ef ldi r24, 0xFF ; 255 } else { WRITE_NC(X_DIR_PIN, !INVERT_X_DIR); count_direction[X_AXIS]=1; 28bba: 80 93 97 02 sts 0x0297, r24 ; 0x800297 } if((out_bits & (1< 28bc2: 81 ff sbrs r24, 1 28bc4: 8b c0 rjmp .+278 ; 0x28cdc <__vector_17+0x49e> WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR); 28bc6: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 28bca: 8d 7f andi r24, 0xFD ; 253 28bcc: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Y_AXIS]=-1; 28bd0: 8f ef ldi r24, 0xFF ; 255 } else { WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR); count_direction[Y_AXIS]=1; 28bd2: 80 93 98 02 sts 0x0298, r24 ; 0x800298 } if ((out_bits & (1< 28bda: 82 ff sbrs r24, 2 28bdc: 86 c0 rjmp .+268 ; 0x28cea <__vector_17+0x4ac> WRITE_NC(Z_DIR_PIN,INVERT_Z_DIR); 28bde: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 28be2: 84 60 ori r24, 0x04 ; 4 28be4: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Z_AXIS]=-1; 28be8: 8f ef ldi r24, 0xFF ; 255 } else { // +direction WRITE_NC(Z_DIR_PIN,!INVERT_Z_DIR); count_direction[Z_AXIS]=1; 28bea: 80 93 99 02 sts 0x0299, r24 ; 0x800299 } if ((out_bits & (1 << E_AXIS)) != 0) { // -direction 28bee: 80 91 7a 05 lds r24, 0x057A ; 0x80057a 28bf2: 83 ff sbrs r24, 3 28bf4: 81 c0 rjmp .+258 ; 0x28cf8 <__vector_17+0x4ba> #ifndef LIN_ADVANCE WRITE(E0_DIR_PIN, INVERT_E0_DIR); #endif /* LIN_ADVANCE */ count_direction[E_AXIS] = -1; 28bf6: 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; 28bf8: 80 93 9a 02 sts 0x029A, r24 ; 0x80029a //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) 28bfc: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28c00: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28c04: 30 97 sbiw r30, 0x00 ; 0 28c06: 09 f4 brne .+2 ; 0x28c0a <__vector_17+0x3cc> 28c08: 3d c7 rjmp .+3706 ; 0x29a84 <__vector_17+0x1246> } // Check limit switches. FORCE_INLINE void stepper_check_endstops() { if(check_endstops) 28c0a: 80 91 b7 02 lds r24, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> 28c0e: 50 91 77 05 lds r21, 0x0577 ; 0x800577 28c12: 88 23 and r24, r24 28c14: 09 f4 brne .+2 ; 0x28c18 <__vector_17+0x3da> 28c16: cb c0 rjmp .+406 ; 0x28dae <__vector_17+0x570> { uint8_t _endstop_hit = endstop_hit; 28c18: 20 91 0a 05 lds r18, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> uint8_t _endstop = endstop; 28c1c: 80 91 79 05 lds r24, 0x0579 ; 0x800579 uint8_t _old_endstop = old_endstop; 28c20: 90 91 78 05 lds r25, 0x0578 ; 0x800578 #ifndef COREXY if ((out_bits & (1< #endif { #if ( (defined(X_MIN_PIN) && (X_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); 28c28: 40 91 06 01 lds r20, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> { uint8_t _endstop_hit = endstop_hit; uint8_t _endstop = endstop; uint8_t _old_endstop = old_endstop; #ifndef COREXY if ((out_bits & (1< #endif { #if ( (defined(X_MIN_PIN) && (X_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); 28c30: 42 fd sbrc r20, 2 28c32: 83 c0 rjmp .+262 ; 0x28d3a <__vector_17+0x4fc> 28c34: 81 60 ori r24, 0x01 ; 1 #else // Normal homing SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(X_AXIS)) && (current_block->steps[X_AXIS].wide > 0)) { 28c36: 49 2f mov r20, r25 28c38: 41 70 andi r20, 0x01 ; 1 SET_BIT_TO(_endstop, X_AXIS + 4, (!READ(X_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, X_AXIS + 4, (READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(X_AXIS + 4)) && (current_block->steps[X_AXIS].wide > 0)){ 28c3a: 48 23 and r20, r24 28c3c: b1 f0 breq .+44 ; 0x28c6a <__vector_17+0x42c> 28c3e: c0 80 ld r12, Z 28c40: d1 80 ldd r13, Z+1 ; 0x01 28c42: e2 80 ldd r14, Z+2 ; 0x02 28c44: f3 80 ldd r15, Z+3 ; 0x03 28c46: 1c 14 cp r1, r12 28c48: 1d 04 cpc r1, r13 28c4a: 1e 04 cpc r1, r14 28c4c: 1f 04 cpc r1, r15 28c4e: 6c f4 brge .+26 ; 0x28c6a <__vector_17+0x42c> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(X_AXIS); 28c50: 21 60 ori r18, 0x01 ; 1 step_events_completed.wide = current_block->step_event_count.wide; 28c52: c0 88 ldd r12, Z+16 ; 0x10 28c54: d1 88 ldd r13, Z+17 ; 0x11 28c56: e2 88 ldd r14, Z+18 ; 0x12 28c58: f3 88 ldd r15, Z+19 ; 0x13 28c5a: c0 92 7b 05 sts 0x057B, r12 ; 0x80057b 28c5e: d0 92 7c 05 sts 0x057C, r13 ; 0x80057c 28c62: e0 92 7d 05 sts 0x057D, r14 ; 0x80057d 28c66: f0 92 7e 05 sts 0x057E, r15 ; 0x80057e #endif { #if ( (defined(Y_MIN_PIN) && (Y_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); 28c6a: 40 91 06 01 lds r20, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> } #endif } #ifndef COREXY if ((out_bits & (1< #endif { #if ( (defined(Y_MIN_PIN) && (Y_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); 28c72: 47 fd sbrc r20, 7 28c74: 6c c0 rjmp .+216 ; 0x28d4e <__vector_17+0x510> 28c76: 82 60 ori r24, 0x02 ; 2 #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(Y_AXIS)) && (current_block->steps[Y_AXIS].wide > 0)) { 28c78: 49 2f mov r20, r25 28c7a: 42 70 andi r20, 0x02 ; 2 SET_BIT_TO(_endstop, Y_AXIS + 4, (!READ(Y_TMC2130_DIAG))); #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS + 4, (READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(Y_AXIS + 4)) && (current_block->steps[Y_AXIS].wide > 0)){ 28c7c: 48 23 and r20, r24 28c7e: b1 f0 breq .+44 ; 0x28cac <__vector_17+0x46e> 28c80: c4 80 ldd r12, Z+4 ; 0x04 28c82: d5 80 ldd r13, Z+5 ; 0x05 28c84: e6 80 ldd r14, Z+6 ; 0x06 28c86: f7 80 ldd r15, Z+7 ; 0x07 28c88: 1c 14 cp r1, r12 28c8a: 1d 04 cpc r1, r13 28c8c: 1e 04 cpc r1, r14 28c8e: 1f 04 cpc r1, r15 28c90: 6c f4 brge .+26 ; 0x28cac <__vector_17+0x46e> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Y_AXIS); 28c92: 22 60 ori r18, 0x02 ; 2 step_events_completed.wide = current_block->step_event_count.wide; 28c94: c0 88 ldd r12, Z+16 ; 0x10 28c96: d1 88 ldd r13, Z+17 ; 0x11 28c98: e2 88 ldd r14, Z+18 ; 0x12 28c9a: f3 88 ldd r15, Z+19 ; 0x13 28c9c: c0 92 7b 05 sts 0x057B, r12 ; 0x80057b 28ca0: d0 92 7c 05 sts 0x057C, r13 ; 0x80057c 28ca4: e0 92 7d 05 sts 0x057D, r14 ; 0x80057d 28ca8: f0 92 7e 05 sts 0x057E, r15 ; 0x80057e } #endif } if ((out_bits & (1< { #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT) if (! check_z_endstop) { 28cb0: 51 11 cpse r21, r1 28cb2: 77 c0 rjmp .+238 ; 0x28da2 <__vector_17+0x564> #ifdef TMC2130_SG_HOMING // Stall guard homing turned on #ifdef TMC2130_STEALTH_Z if ((tmc2130_mode == TMC2130_MODE_SILENT) && !(tmc2130_sg_homing_axes_mask & 0x04)) 28cb4: 30 91 8b 06 lds r19, 0x068B ; 0x80068b 28cb8: 31 30 cpi r19, 0x01 ; 1 28cba: 09 f0 breq .+2 ; 0x28cbe <__vector_17+0x480> 28cbc: 52 c0 rjmp .+164 ; 0x28d62 <__vector_17+0x524> 28cbe: 30 91 42 06 lds r19, 0x0642 ; 0x800642 28cc2: 32 fd sbrc r19, 2 28cc4: 4e c0 rjmp .+156 ; 0x28d62 <__vector_17+0x524> SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 28cc6: 1c 9b sbis 0x03, 4 ; 3 28cc8: 52 c0 rjmp .+164 ; 0x28d6e <__vector_17+0x530> else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); 28cca: 84 60 ori r24, 0x04 ; 4 28ccc: 51 c0 rjmp .+162 ; 0x28d70 <__vector_17+0x532> // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY) if((out_bits & (1< 28cd2: 8e 7f andi r24, 0xFE ; 254 28cd4: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[X_AXIS]=1; 28cd8: 81 e0 ldi r24, 0x01 ; 1 28cda: 6f cf rjmp .-290 ; 0x28bba <__vector_17+0x37c> } if((out_bits & (1< 28ce0: 82 60 ori r24, 0x02 ; 2 28ce2: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Y_AXIS]=1; 28ce6: 81 e0 ldi r24, 0x01 ; 1 28ce8: 74 cf rjmp .-280 ; 0x28bd2 <__vector_17+0x394> } if ((out_bits & (1< 28cee: 8b 7f andi r24, 0xFB ; 251 28cf0: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> count_direction[Z_AXIS]=1; 28cf4: 81 e0 ldi r24, 0x01 ; 1 28cf6: 79 cf rjmp .-270 ; 0x28bea <__vector_17+0x3ac> 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; 28cf8: 81 e0 ldi r24, 0x01 ; 1 28cfa: 7e cf rjmp .-260 ; 0x28bf8 <__vector_17+0x3ba> } } else { _NEXT_ISR(2000); // 1kHz. 28cfc: 80 ed ldi r24, 0xD0 ; 208 28cfe: 97 e0 ldi r25, 0x07 ; 7 28d00: 90 93 e5 04 sts 0x04E5, r25 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 28d04: 80 93 e4 04 sts 0x04E4, r24 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 28d08: 90 93 e1 04 sts 0x04E1, r25 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> 28d0c: 80 93 e0 04 sts 0x04E0, r24 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> #ifdef LIN_ADVANCE // reset LA state when there's no block nextAdvanceISR = ADV_NEVER; 28d10: 8f ef ldi r24, 0xFF ; 255 28d12: 9f ef ldi r25, 0xFF ; 255 28d14: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 28d18: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> e_steps = 0; 28d1c: 10 92 91 05 sts 0x0591, r1 ; 0x800591 // incrementally lose pressure to give a chance for // a new LA block to be scheduled and recover if(current_adv_steps) 28d20: 80 91 de 04 lds r24, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 28d24: 90 91 df 04 lds r25, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 28d28: 00 97 sbiw r24, 0x00 ; 0 28d2a: 09 f4 brne .+2 ; 0x28d2e <__vector_17+0x4f0> 28d2c: 67 cf rjmp .-306 ; 0x28bfc <__vector_17+0x3be> --current_adv_steps; 28d2e: 01 97 sbiw r24, 0x01 ; 1 28d30: 90 93 df 04 sts 0x04DF, r25 ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 28d34: 80 93 de 04 sts 0x04DE, r24 ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 28d38: 61 cf rjmp .-318 ; 0x28bfc <__vector_17+0x3be> #endif { #if ( (defined(X_MIN_PIN) && (X_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG))); 28d3a: 8e 7f andi r24, 0xFE ; 254 28d3c: 7c cf rjmp .-264 ; 0x28c36 <__vector_17+0x3f8> #endif } else { // +direction #if ( (defined(X_MAX_PIN) && (X_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS + 4, (!READ(X_TMC2130_DIAG))); 28d3e: 42 fd sbrc r20, 2 28d40: 04 c0 rjmp .+8 ; 0x28d4a <__vector_17+0x50c> 28d42: 80 61 ori r24, 0x10 ; 16 #else // Normal homing SET_BIT_TO(_endstop, X_AXIS + 4, (READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(X_AXIS + 4)) && (current_block->steps[X_AXIS].wide > 0)){ 28d44: 49 2f mov r20, r25 28d46: 40 71 andi r20, 0x10 ; 16 28d48: 78 cf rjmp .-272 ; 0x28c3a <__vector_17+0x3fc> #endif } else { // +direction #if ( (defined(X_MAX_PIN) && (X_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_XMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, X_AXIS + 4, (!READ(X_TMC2130_DIAG))); 28d4a: 8f 7e andi r24, 0xEF ; 239 28d4c: fb cf rjmp .-10 ; 0x28d44 <__vector_17+0x506> #endif { #if ( (defined(Y_MIN_PIN) && (Y_MIN_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMINLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG))); 28d4e: 8d 7f andi r24, 0xFD ; 253 28d50: 93 cf rjmp .-218 ; 0x28c78 <__vector_17+0x43a> #endif } else { // +direction #if ( (defined(Y_MAX_PIN) && (Y_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS + 4, (!READ(Y_TMC2130_DIAG))); 28d52: 47 fd sbrc r20, 7 28d54: 04 c0 rjmp .+8 ; 0x28d5e <__vector_17+0x520> 28d56: 80 62 ori r24, 0x20 ; 32 #else // Normal homing SET_BIT_TO(_endstop, Y_AXIS + 4, (READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING)); #endif if((_endstop & _old_endstop & _BV(Y_AXIS + 4)) && (current_block->steps[Y_AXIS].wide > 0)){ 28d58: 49 2f mov r20, r25 28d5a: 40 72 andi r20, 0x20 ; 32 28d5c: 8f cf rjmp .-226 ; 0x28c7c <__vector_17+0x43e> #endif } else { // +direction #if ( (defined(Y_MAX_PIN) && (Y_MAX_PIN > -1)) || defined(TMC2130_SG_HOMING) ) && !defined(DEBUG_DISABLE_YMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on SET_BIT_TO(_endstop, Y_AXIS + 4, (!READ(Y_TMC2130_DIAG))); 28d5e: 8f 7d andi r24, 0xDF ; 223 28d60: fb cf rjmp .-10 ; 0x28d58 <__vector_17+0x51a> #ifdef TMC2130_STEALTH_Z if ((tmc2130_mode == TMC2130_MODE_SILENT) && !(tmc2130_sg_homing_axes_mask & 0x04)) 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))); 28d62: 1c 99 sbic 0x03, 4 ; 3 28d64: b2 cf rjmp .-156 ; 0x28cca <__vector_17+0x48c> 28d66: 30 91 06 01 lds r19, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 28d6a: 36 ff sbrs r19, 6 28d6c: ae cf rjmp .-164 ; 0x28cca <__vector_17+0x48c> 28d6e: 8b 7f andi r24, 0xFB ; 251 #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING if((_endstop & _old_endstop & _BV(Z_AXIS)) && (current_block->steps[Z_AXIS].wide > 0)) { 28d70: 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)) { 28d72: 98 23 and r25, r24 28d74: b1 f0 breq .+44 ; 0x28da2 <__vector_17+0x564> 28d76: c0 84 ldd r12, Z+8 ; 0x08 28d78: d1 84 ldd r13, Z+9 ; 0x09 28d7a: e2 84 ldd r14, Z+10 ; 0x0a 28d7c: f3 84 ldd r15, Z+11 ; 0x0b 28d7e: 1c 14 cp r1, r12 28d80: 1d 04 cpc r1, r13 28d82: 1e 04 cpc r1, r14 28d84: 1f 04 cpc r1, r15 28d86: 6c f4 brge .+26 ; 0x28da2 <__vector_17+0x564> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Z_AXIS); 28d88: 24 60 ori r18, 0x04 ; 4 step_events_completed.wide = current_block->step_event_count.wide; 28d8a: c0 88 ldd r12, Z+16 ; 0x10 28d8c: d1 88 ldd r13, Z+17 ; 0x11 28d8e: e2 88 ldd r14, Z+18 ; 0x12 28d90: f3 88 ldd r15, Z+19 ; 0x13 28d92: c0 92 7b 05 sts 0x057B, r12 ; 0x80057b 28d96: d0 92 7c 05 sts 0x057C, r13 ; 0x80057c 28d9a: e0 92 7d 05 sts 0x057D, r14 ; 0x80057d 28d9e: f0 92 7e 05 sts 0x057E, r15 ; 0x80057e } #endif } endstop = _endstop; 28da2: 80 93 79 05 sts 0x0579, r24 ; 0x800579 old_endstop = _endstop; //apply current endstop state to the old endstop 28da6: 80 93 78 05 sts 0x0578, r24 ; 0x800578 endstop_hit = _endstop_hit; 28daa: 20 93 0a 05 sts 0x050A, r18 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> } // 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) { 28dae: 55 23 and r21, r21 28db0: 09 f4 brne .+2 ; 0x28db4 <__vector_17+0x576> 28db2: 40 c0 rjmp .+128 ; 0x28e34 <__vector_17+0x5f6> uint8_t _endstop_hit = endstop_hit; 28db4: 20 91 0a 05 lds r18, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> uint8_t _endstop = endstop; 28db8: 80 91 79 05 lds r24, 0x0579 ; 0x800579 uint8_t _old_endstop = old_endstop; 28dbc: 90 91 78 05 lds r25, 0x0578 ; 0x800578 // Check the Z min end-stop no matter what. // Good for searching for the center of an induction target. #ifdef TMC2130_SG_HOMING // Stall guard homing turned on #ifdef TMC2130_STEALTH_Z if ((tmc2130_mode == TMC2130_MODE_SILENT) && !(tmc2130_sg_homing_axes_mask & 0x04)) 28dc0: 30 91 8b 06 lds r19, 0x068B ; 0x80068b 28dc4: 31 30 cpi r19, 0x01 ; 1 28dc6: c9 f4 brne .+50 ; 0x28dfa <__vector_17+0x5bc> 28dc8: 30 91 42 06 lds r19, 0x0642 ; 0x800642 28dcc: 32 fd sbrc r19, 2 28dce: 15 c0 rjmp .+42 ; 0x28dfa <__vector_17+0x5bc> SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); 28dd0: 1c 9b sbis 0x03, 4 ; 3 28dd2: 19 c0 rjmp .+50 ; 0x28e06 <__vector_17+0x5c8> else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG))); 28dd4: 84 60 ori r24, 0x04 ; 4 28dd6: 18 c0 rjmp .+48 ; 0x28e08 <__vector_17+0x5ca> } else { // +direction #if defined(Z_MAX_PIN) && (Z_MAX_PIN > -1) && !defined(DEBUG_DISABLE_ZMAXLIMIT) #ifdef TMC2130_SG_HOMING // Stall guard homing turned on #ifdef TMC2130_STEALTH_Z if ((tmc2130_mode == TMC2130_MODE_SILENT) && !(tmc2130_sg_homing_axes_mask & 0x04)) 28dd8: 30 91 8b 06 lds r19, 0x068B ; 0x80068b 28ddc: 31 30 cpi r19, 0x01 ; 1 28dde: 31 f4 brne .+12 ; 0x28dec <__vector_17+0x5ae> 28de0: 30 91 42 06 lds r19, 0x0642 ; 0x800642 28de4: 32 fd sbrc r19, 2 28de6: 02 c0 rjmp .+4 ; 0x28dec <__vector_17+0x5ae> SET_BIT_TO(_endstop, Z_AXIS + 4, 0); else #endif //TMC2130_STEALTH_Z SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG))); 28de8: 8f 7b andi r24, 0xBF ; 191 28dea: 05 c0 rjmp .+10 ; 0x28df6 <__vector_17+0x5b8> 28dec: 30 91 06 01 lds r19, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 28df0: 36 fd sbrc r19, 6 28df2: fa cf rjmp .-12 ; 0x28de8 <__vector_17+0x5aa> 28df4: 80 64 ori r24, 0x40 ; 64 #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)) { 28df6: 90 74 andi r25, 0x40 ; 64 28df8: bc cf rjmp .-136 ; 0x28d72 <__vector_17+0x534> #ifdef TMC2130_STEALTH_Z if ((tmc2130_mode == TMC2130_MODE_SILENT) && !(tmc2130_sg_homing_axes_mask & 0x04)) 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))); 28dfa: 1c 99 sbic 0x03, 4 ; 3 28dfc: eb cf rjmp .-42 ; 0x28dd4 <__vector_17+0x596> 28dfe: 30 91 06 01 lds r19, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 28e02: 36 ff sbrs r19, 6 28e04: e7 cf rjmp .-50 ; 0x28dd4 <__vector_17+0x596> 28e06: 8b 7f andi r24, 0xFB ; 251 #else SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING)); #endif //TMC2130_SG_HOMING if(_endstop & _old_endstop & _BV(Z_AXIS)) { 28e08: 94 70 andi r25, 0x04 ; 4 28e0a: 98 23 and r25, r24 28e0c: 69 f0 breq .+26 ; 0x28e28 <__vector_17+0x5ea> #ifdef VERBOSE_CHECK_HIT_ENDSTOPS endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; #endif //VERBOSE_CHECK_HIT_ENDSTOPS _endstop_hit |= _BV(Z_AXIS); 28e0e: 24 60 ori r18, 0x04 ; 4 step_events_completed.wide = current_block->step_event_count.wide; 28e10: 40 89 ldd r20, Z+16 ; 0x10 28e12: 51 89 ldd r21, Z+17 ; 0x11 28e14: 62 89 ldd r22, Z+18 ; 0x12 28e16: 73 89 ldd r23, Z+19 ; 0x13 28e18: 40 93 7b 05 sts 0x057B, r20 ; 0x80057b 28e1c: 50 93 7c 05 sts 0x057C, r21 ; 0x80057c 28e20: 60 93 7d 05 sts 0x057D, r22 ; 0x80057d 28e24: 70 93 7e 05 sts 0x057E, r23 ; 0x80057e } endstop = _endstop; 28e28: 80 93 79 05 sts 0x0579, r24 ; 0x800579 old_endstop = _endstop; //apply current endstop state to the old endstop 28e2c: 80 93 78 05 sts 0x0578, r24 ; 0x800578 endstop_hit = _endstop_hit; 28e30: 20 93 0a 05 sts 0x050A, r18 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> stepper_next_block(); if (current_block != NULL) { stepper_check_endstops(); if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) 28e34: 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) 28e36: c0 e0 ldi r28, 0x00 ; 0 MSerial.checkRx(); // Check for serial chars. // Step in X axis counter[X_AXIS].lo += current_block->steps[X_AXIS].lo; if (counter[X_AXIS].lo > 0) { STEP_NC_HI(X_AXIS); 28e38: d1 e0 ldi r29, 0x01 ; 1 #endif //DEBUG_XSTEP_DUP_PIN } // Step in Y axis counter[Y_AXIS].lo += current_block->steps[Y_AXIS].lo; if (counter[Y_AXIS].lo > 0) { STEP_NC_HI(Y_AXIS); 28e3a: 12 e0 ldi r17, 0x02 ; 2 #endif //DEBUG_YSTEP_DUP_PIN } // Step in Z axis counter[Z_AXIS].lo += current_block->steps[Z_AXIS].lo; if (counter[Z_AXIS].lo > 0) { STEP_NC_HI(Z_AXIS); 28e3c: 04 e0 ldi r16, 0x04 ; 4 stepper_next_block(); if (current_block != NULL) { stepper_check_endstops(); if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) 28e3e: 83 ff sbrs r24, 3 28e40: 08 c1 rjmp .+528 ; 0x29052 <__vector_17+0x814> } FORCE_INLINE void stepper_tick_lowres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 28e42: 80 91 98 05 lds r24, 0x0598 ; 0x800598 28e46: c8 17 cp r28, r24 28e48: 08 f0 brcs .+2 ; 0x28e4c <__vector_17+0x60e> 28e4a: 72 c2 rjmp .+1252 ; 0x29330 <__vector_17+0xaf2> MSerial.checkRx(); // Check for serial chars. 28e4c: 0f 94 f1 14 call 0x229e2 ; 0x229e2 // Step in X axis counter[X_AXIS].lo += current_block->steps[X_AXIS].lo; 28e50: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28e54: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28e58: 80 81 ld r24, Z 28e5a: 91 81 ldd r25, Z+1 ; 0x01 28e5c: 20 91 80 05 lds r18, 0x0580 ; 0x800580 28e60: 30 91 81 05 lds r19, 0x0581 ; 0x800581 28e64: 82 0f add r24, r18 28e66: 93 1f adc r25, r19 28e68: 90 93 81 05 sts 0x0581, r25 ; 0x800581 28e6c: 80 93 80 05 sts 0x0580, r24 ; 0x800580 if (counter[X_AXIS].lo > 0) { 28e70: 18 16 cp r1, r24 28e72: 19 06 cpc r1, r25 28e74: 64 f5 brge .+88 ; 0x28ece <__vector_17+0x690> STEP_NC_HI(X_AXIS); 28e76: d6 b9 out 0x06, r29 ; 6 #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; 28e78: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28e7c: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28e80: 80 91 80 05 lds r24, 0x0580 ; 0x800580 28e84: 90 91 81 05 lds r25, 0x0581 ; 0x800581 28e88: 20 89 ldd r18, Z+16 ; 0x10 28e8a: 31 89 ldd r19, Z+17 ; 0x11 28e8c: 82 1b sub r24, r18 28e8e: 93 0b sbc r25, r19 28e90: 90 93 81 05 sts 0x0581, r25 ; 0x800581 28e94: 80 93 80 05 sts 0x0580, r24 ; 0x800580 count_position[X_AXIS]+=count_direction[X_AXIS]; 28e98: 90 91 97 02 lds r25, 0x0297 ; 0x800297 28e9c: 40 91 b2 06 lds r20, 0x06B2 ; 0x8006b2 28ea0: 50 91 b3 06 lds r21, 0x06B3 ; 0x8006b3 28ea4: 60 91 b4 06 lds r22, 0x06B4 ; 0x8006b4 28ea8: 70 91 b5 06 lds r23, 0x06B5 ; 0x8006b5 28eac: 89 2f mov r24, r25 28eae: 99 0f add r25, r25 28eb0: 99 0b sbc r25, r25 28eb2: aa 0b sbc r26, r26 28eb4: bb 0b sbc r27, r27 28eb6: 84 0f add r24, r20 28eb8: 95 1f adc r25, r21 28eba: a6 1f adc r26, r22 28ebc: b7 1f adc r27, r23 28ebe: 80 93 b2 06 sts 0x06B2, r24 ; 0x8006b2 28ec2: 90 93 b3 06 sts 0x06B3, r25 ; 0x8006b3 28ec6: a0 93 b4 06 sts 0x06B4, r26 ; 0x8006b4 28eca: b0 93 b5 06 sts 0x06B5, r27 ; 0x8006b5 #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; 28ece: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28ed2: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28ed6: 84 81 ldd r24, Z+4 ; 0x04 28ed8: 95 81 ldd r25, Z+5 ; 0x05 28eda: 20 91 84 05 lds r18, 0x0584 ; 0x800584 28ede: 30 91 85 05 lds r19, 0x0585 ; 0x800585 28ee2: 82 0f add r24, r18 28ee4: 93 1f adc r25, r19 28ee6: 90 93 85 05 sts 0x0585, r25 ; 0x800585 28eea: 80 93 84 05 sts 0x0584, r24 ; 0x800584 if (counter[Y_AXIS].lo > 0) { 28eee: 18 16 cp r1, r24 28ef0: 19 06 cpc r1, r25 28ef2: 44 f5 brge .+80 ; 0x28f44 <__vector_17+0x706> STEP_NC_HI(Y_AXIS); 28ef4: 16 b9 out 0x06, r17 ; 6 #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; 28ef6: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28efa: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28efe: 20 89 ldd r18, Z+16 ; 0x10 28f00: 31 89 ldd r19, Z+17 ; 0x11 28f02: 82 1b sub r24, r18 28f04: 93 0b sbc r25, r19 28f06: 90 93 85 05 sts 0x0585, r25 ; 0x800585 28f0a: 80 93 84 05 sts 0x0584, r24 ; 0x800584 count_position[Y_AXIS]+=count_direction[Y_AXIS]; 28f0e: 90 91 98 02 lds r25, 0x0298 ; 0x800298 28f12: 40 91 b6 06 lds r20, 0x06B6 ; 0x8006b6 28f16: 50 91 b7 06 lds r21, 0x06B7 ; 0x8006b7 28f1a: 60 91 b8 06 lds r22, 0x06B8 ; 0x8006b8 28f1e: 70 91 b9 06 lds r23, 0x06B9 ; 0x8006b9 28f22: 89 2f mov r24, r25 28f24: 99 0f add r25, r25 28f26: 99 0b sbc r25, r25 28f28: aa 0b sbc r26, r26 28f2a: bb 0b sbc r27, r27 28f2c: 84 0f add r24, r20 28f2e: 95 1f adc r25, r21 28f30: a6 1f adc r26, r22 28f32: b7 1f adc r27, r23 28f34: 80 93 b6 06 sts 0x06B6, r24 ; 0x8006b6 28f38: 90 93 b7 06 sts 0x06B7, r25 ; 0x8006b7 28f3c: a0 93 b8 06 sts 0x06B8, r26 ; 0x8006b8 28f40: b0 93 b9 06 sts 0x06B9, r27 ; 0x8006b9 #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; 28f44: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28f48: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28f4c: 80 85 ldd r24, Z+8 ; 0x08 28f4e: 91 85 ldd r25, Z+9 ; 0x09 28f50: 20 91 88 05 lds r18, 0x0588 ; 0x800588 28f54: 30 91 89 05 lds r19, 0x0589 ; 0x800589 28f58: 82 0f add r24, r18 28f5a: 93 1f adc r25, r19 28f5c: 90 93 89 05 sts 0x0589, r25 ; 0x800589 28f60: 80 93 88 05 sts 0x0588, r24 ; 0x800588 if (counter[Z_AXIS].lo > 0) { 28f64: 18 16 cp r1, r24 28f66: 19 06 cpc r1, r25 28f68: 44 f5 brge .+80 ; 0x28fba <__vector_17+0x77c> STEP_NC_HI(Z_AXIS); 28f6a: 06 b9 out 0x06, r16 ; 6 counter[Z_AXIS].lo -= current_block->step_event_count.lo; 28f6c: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28f70: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28f74: 20 89 ldd r18, Z+16 ; 0x10 28f76: 31 89 ldd r19, Z+17 ; 0x11 28f78: 82 1b sub r24, r18 28f7a: 93 0b sbc r25, r19 28f7c: 90 93 89 05 sts 0x0589, r25 ; 0x800589 28f80: 80 93 88 05 sts 0x0588, r24 ; 0x800588 count_position[Z_AXIS]+=count_direction[Z_AXIS]; 28f84: 90 91 99 02 lds r25, 0x0299 ; 0x800299 28f88: 40 91 ba 06 lds r20, 0x06BA ; 0x8006ba 28f8c: 50 91 bb 06 lds r21, 0x06BB ; 0x8006bb 28f90: 60 91 bc 06 lds r22, 0x06BC ; 0x8006bc 28f94: 70 91 bd 06 lds r23, 0x06BD ; 0x8006bd 28f98: 89 2f mov r24, r25 28f9a: 99 0f add r25, r25 28f9c: 99 0b sbc r25, r25 28f9e: aa 0b sbc r26, r26 28fa0: bb 0b sbc r27, r27 28fa2: 84 0f add r24, r20 28fa4: 95 1f adc r25, r21 28fa6: a6 1f adc r26, r22 28fa8: b7 1f adc r27, r23 28faa: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 28fae: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 28fb2: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 28fb6: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd STEP_NC_LO(Z_AXIS); } // Step in E axis counter[E_AXIS].lo += current_block->steps[E_AXIS].lo; 28fba: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 28fbe: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 28fc2: 80 91 8c 05 lds r24, 0x058C ; 0x80058c 28fc6: 90 91 8d 05 lds r25, 0x058D ; 0x80058d 28fca: 24 85 ldd r18, Z+12 ; 0x0c 28fcc: 35 85 ldd r19, Z+13 ; 0x0d 28fce: 82 0f add r24, r18 28fd0: 93 1f adc r25, r19 28fd2: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 28fd6: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c 28fda: 20 89 ldd r18, Z+16 ; 0x10 28fdc: 31 89 ldd r19, Z+17 ; 0x11 if (counter[E_AXIS].lo > 0) { 28fde: 18 16 cp r1, r24 28fe0: 19 06 cpc r1, r25 28fe2: 44 f5 brge .+80 ; 0x29034 <__vector_17+0x7f6> #ifndef LIN_ADVANCE STEP_NC_HI(E_AXIS); #endif /* LIN_ADVANCE */ counter[E_AXIS].lo -= current_block->step_event_count.lo; 28fe4: 82 1b sub r24, r18 28fe6: 93 0b sbc r25, r19 28fe8: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 28fec: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c count_position[E_AXIS] += count_direction[E_AXIS]; 28ff0: 90 91 9a 02 lds r25, 0x029A ; 0x80029a 28ff4: 40 91 be 06 lds r20, 0x06BE ; 0x8006be 28ff8: 50 91 bf 06 lds r21, 0x06BF ; 0x8006bf 28ffc: 60 91 c0 06 lds r22, 0x06C0 ; 0x8006c0 29000: 70 91 c1 06 lds r23, 0x06C1 ; 0x8006c1 29004: 89 2f mov r24, r25 29006: 99 0f add r25, r25 29008: 99 0b sbc r25, r25 2900a: aa 0b sbc r26, r26 2900c: bb 0b sbc r27, r27 2900e: 84 0f add r24, r20 29010: 95 1f adc r25, r21 29012: a6 1f adc r26, r22 29014: b7 1f adc r27, r23 29016: 80 93 be 06 sts 0x06BE, r24 ; 0x8006be 2901a: 90 93 bf 06 sts 0x06BF, r25 ; 0x8006bf 2901e: a0 93 c0 06 sts 0x06C0, r26 ; 0x8006c0 29022: b0 93 c1 06 sts 0x06C1, r27 ; 0x8006c1 #ifdef LIN_ADVANCE e_steps += count_direction[E_AXIS]; 29026: 90 91 9a 02 lds r25, 0x029A ; 0x80029a 2902a: 80 91 91 05 lds r24, 0x0591 ; 0x800591 2902e: 89 0f add r24, r25 29030: 80 93 91 05 sts 0x0591, r24 ; 0x800591 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) 29034: 80 91 7b 05 lds r24, 0x057B ; 0x80057b 29038: 90 91 7c 05 lds r25, 0x057C ; 0x80057c 2903c: 01 96 adiw r24, 0x01 ; 1 2903e: 90 93 7c 05 sts 0x057C, r25 ; 0x80057c 29042: 80 93 7b 05 sts 0x057B, r24 ; 0x80057b 29046: 82 17 cp r24, r18 29048: 93 07 cpc r25, r19 2904a: 08 f0 brcs .+2 ; 0x2904e <__vector_17+0x810> 2904c: 71 c1 rjmp .+738 ; 0x29330 <__vector_17+0xaf2> } FORCE_INLINE void stepper_tick_lowres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 2904e: cf 5f subi r28, 0xFF ; 255 29050: f8 ce rjmp .-528 ; 0x28e42 <__vector_17+0x604> } } FORCE_INLINE void stepper_tick_highres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 29052: 80 91 98 05 lds r24, 0x0598 ; 0x800598 29056: c8 17 cp r28, r24 29058: 08 f0 brcs .+2 ; 0x2905c <__vector_17+0x81e> 2905a: 6a c1 rjmp .+724 ; 0x29330 <__vector_17+0xaf2> MSerial.checkRx(); // Check for serial chars. 2905c: 0f 94 f1 14 call 0x229e2 ; 0x229e2 // Step in X axis counter[X_AXIS].wide += current_block->steps[X_AXIS].wide; 29060: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 29064: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 29068: 80 81 ld r24, Z 2906a: 91 81 ldd r25, Z+1 ; 0x01 2906c: a2 81 ldd r26, Z+2 ; 0x02 2906e: b3 81 ldd r27, Z+3 ; 0x03 29070: 40 91 80 05 lds r20, 0x0580 ; 0x800580 29074: 50 91 81 05 lds r21, 0x0581 ; 0x800581 29078: 60 91 82 05 lds r22, 0x0582 ; 0x800582 2907c: 70 91 83 05 lds r23, 0x0583 ; 0x800583 29080: 84 0f add r24, r20 29082: 95 1f adc r25, r21 29084: a6 1f adc r26, r22 29086: b7 1f adc r27, r23 29088: 80 93 80 05 sts 0x0580, r24 ; 0x800580 2908c: 90 93 81 05 sts 0x0581, r25 ; 0x800581 29090: a0 93 82 05 sts 0x0582, r26 ; 0x800582 29094: b0 93 83 05 sts 0x0583, r27 ; 0x800583 if (counter[X_AXIS].wide > 0) { 29098: 18 16 cp r1, r24 2909a: 19 06 cpc r1, r25 2909c: 1a 06 cpc r1, r26 2909e: 1b 06 cpc r1, r27 290a0: c4 f5 brge .+112 ; 0x29112 <__vector_17+0x8d4> STEP_NC_HI(X_AXIS); 290a2: d6 b9 out 0x06, r29 ; 6 #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; 290a4: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 290a8: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 290ac: 80 91 80 05 lds r24, 0x0580 ; 0x800580 290b0: 90 91 81 05 lds r25, 0x0581 ; 0x800581 290b4: a0 91 82 05 lds r26, 0x0582 ; 0x800582 290b8: b0 91 83 05 lds r27, 0x0583 ; 0x800583 290bc: 40 89 ldd r20, Z+16 ; 0x10 290be: 51 89 ldd r21, Z+17 ; 0x11 290c0: 62 89 ldd r22, Z+18 ; 0x12 290c2: 73 89 ldd r23, Z+19 ; 0x13 290c4: 84 1b sub r24, r20 290c6: 95 0b sbc r25, r21 290c8: a6 0b sbc r26, r22 290ca: b7 0b sbc r27, r23 290cc: 80 93 80 05 sts 0x0580, r24 ; 0x800580 290d0: 90 93 81 05 sts 0x0581, r25 ; 0x800581 290d4: a0 93 82 05 sts 0x0582, r26 ; 0x800582 290d8: b0 93 83 05 sts 0x0583, r27 ; 0x800583 count_position[X_AXIS]+=count_direction[X_AXIS]; 290dc: 90 91 97 02 lds r25, 0x0297 ; 0x800297 290e0: 40 91 b2 06 lds r20, 0x06B2 ; 0x8006b2 290e4: 50 91 b3 06 lds r21, 0x06B3 ; 0x8006b3 290e8: 60 91 b4 06 lds r22, 0x06B4 ; 0x8006b4 290ec: 70 91 b5 06 lds r23, 0x06B5 ; 0x8006b5 290f0: 89 2f mov r24, r25 290f2: 99 0f add r25, r25 290f4: 99 0b sbc r25, r25 290f6: aa 0b sbc r26, r26 290f8: bb 0b sbc r27, r27 290fa: 84 0f add r24, r20 290fc: 95 1f adc r25, r21 290fe: a6 1f adc r26, r22 29100: b7 1f adc r27, r23 29102: 80 93 b2 06 sts 0x06B2, r24 ; 0x8006b2 29106: 90 93 b3 06 sts 0x06B3, r25 ; 0x8006b3 2910a: a0 93 b4 06 sts 0x06B4, r26 ; 0x8006b4 2910e: b0 93 b5 06 sts 0x06B5, r27 ; 0x8006b5 #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; 29112: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 29116: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 2911a: 84 81 ldd r24, Z+4 ; 0x04 2911c: 95 81 ldd r25, Z+5 ; 0x05 2911e: a6 81 ldd r26, Z+6 ; 0x06 29120: b7 81 ldd r27, Z+7 ; 0x07 29122: 40 91 84 05 lds r20, 0x0584 ; 0x800584 29126: 50 91 85 05 lds r21, 0x0585 ; 0x800585 2912a: 60 91 86 05 lds r22, 0x0586 ; 0x800586 2912e: 70 91 87 05 lds r23, 0x0587 ; 0x800587 29132: 84 0f add r24, r20 29134: 95 1f adc r25, r21 29136: a6 1f adc r26, r22 29138: b7 1f adc r27, r23 2913a: 80 93 84 05 sts 0x0584, r24 ; 0x800584 2913e: 90 93 85 05 sts 0x0585, r25 ; 0x800585 29142: a0 93 86 05 sts 0x0586, r26 ; 0x800586 29146: b0 93 87 05 sts 0x0587, r27 ; 0x800587 if (counter[Y_AXIS].wide > 0) { 2914a: 18 16 cp r1, r24 2914c: 19 06 cpc r1, r25 2914e: 1a 06 cpc r1, r26 29150: 1b 06 cpc r1, r27 29152: 84 f5 brge .+96 ; 0x291b4 <__vector_17+0x976> STEP_NC_HI(Y_AXIS); 29154: 16 b9 out 0x06, r17 ; 6 #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; 29156: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 2915a: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 2915e: 40 89 ldd r20, Z+16 ; 0x10 29160: 51 89 ldd r21, Z+17 ; 0x11 29162: 62 89 ldd r22, Z+18 ; 0x12 29164: 73 89 ldd r23, Z+19 ; 0x13 29166: 84 1b sub r24, r20 29168: 95 0b sbc r25, r21 2916a: a6 0b sbc r26, r22 2916c: b7 0b sbc r27, r23 2916e: 80 93 84 05 sts 0x0584, r24 ; 0x800584 29172: 90 93 85 05 sts 0x0585, r25 ; 0x800585 29176: a0 93 86 05 sts 0x0586, r26 ; 0x800586 2917a: b0 93 87 05 sts 0x0587, r27 ; 0x800587 count_position[Y_AXIS]+=count_direction[Y_AXIS]; 2917e: 90 91 98 02 lds r25, 0x0298 ; 0x800298 29182: 40 91 b6 06 lds r20, 0x06B6 ; 0x8006b6 29186: 50 91 b7 06 lds r21, 0x06B7 ; 0x8006b7 2918a: 60 91 b8 06 lds r22, 0x06B8 ; 0x8006b8 2918e: 70 91 b9 06 lds r23, 0x06B9 ; 0x8006b9 29192: 89 2f mov r24, r25 29194: 99 0f add r25, r25 29196: 99 0b sbc r25, r25 29198: aa 0b sbc r26, r26 2919a: bb 0b sbc r27, r27 2919c: 84 0f add r24, r20 2919e: 95 1f adc r25, r21 291a0: a6 1f adc r26, r22 291a2: b7 1f adc r27, r23 291a4: 80 93 b6 06 sts 0x06B6, r24 ; 0x8006b6 291a8: 90 93 b7 06 sts 0x06B7, r25 ; 0x8006b7 291ac: a0 93 b8 06 sts 0x06B8, r26 ; 0x8006b8 291b0: b0 93 b9 06 sts 0x06B9, r27 ; 0x8006b9 #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; 291b4: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 291b8: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 291bc: 80 85 ldd r24, Z+8 ; 0x08 291be: 91 85 ldd r25, Z+9 ; 0x09 291c0: a2 85 ldd r26, Z+10 ; 0x0a 291c2: b3 85 ldd r27, Z+11 ; 0x0b 291c4: 40 91 88 05 lds r20, 0x0588 ; 0x800588 291c8: 50 91 89 05 lds r21, 0x0589 ; 0x800589 291cc: 60 91 8a 05 lds r22, 0x058A ; 0x80058a 291d0: 70 91 8b 05 lds r23, 0x058B ; 0x80058b 291d4: 84 0f add r24, r20 291d6: 95 1f adc r25, r21 291d8: a6 1f adc r26, r22 291da: b7 1f adc r27, r23 291dc: 80 93 88 05 sts 0x0588, r24 ; 0x800588 291e0: 90 93 89 05 sts 0x0589, r25 ; 0x800589 291e4: a0 93 8a 05 sts 0x058A, r26 ; 0x80058a 291e8: b0 93 8b 05 sts 0x058B, r27 ; 0x80058b if (counter[Z_AXIS].wide > 0) { 291ec: 18 16 cp r1, r24 291ee: 19 06 cpc r1, r25 291f0: 1a 06 cpc r1, r26 291f2: 1b 06 cpc r1, r27 291f4: 84 f5 brge .+96 ; 0x29256 <__vector_17+0xa18> STEP_NC_HI(Z_AXIS); 291f6: 06 b9 out 0x06, r16 ; 6 counter[Z_AXIS].wide -= current_block->step_event_count.wide; 291f8: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 291fc: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 29200: 40 89 ldd r20, Z+16 ; 0x10 29202: 51 89 ldd r21, Z+17 ; 0x11 29204: 62 89 ldd r22, Z+18 ; 0x12 29206: 73 89 ldd r23, Z+19 ; 0x13 29208: 84 1b sub r24, r20 2920a: 95 0b sbc r25, r21 2920c: a6 0b sbc r26, r22 2920e: b7 0b sbc r27, r23 29210: 80 93 88 05 sts 0x0588, r24 ; 0x800588 29214: 90 93 89 05 sts 0x0589, r25 ; 0x800589 29218: a0 93 8a 05 sts 0x058A, r26 ; 0x80058a 2921c: b0 93 8b 05 sts 0x058B, r27 ; 0x80058b count_position[Z_AXIS]+=count_direction[Z_AXIS]; 29220: 90 91 99 02 lds r25, 0x0299 ; 0x800299 29224: 40 91 ba 06 lds r20, 0x06BA ; 0x8006ba 29228: 50 91 bb 06 lds r21, 0x06BB ; 0x8006bb 2922c: 60 91 bc 06 lds r22, 0x06BC ; 0x8006bc 29230: 70 91 bd 06 lds r23, 0x06BD ; 0x8006bd 29234: 89 2f mov r24, r25 29236: 99 0f add r25, r25 29238: 99 0b sbc r25, r25 2923a: aa 0b sbc r26, r26 2923c: bb 0b sbc r27, r27 2923e: 84 0f add r24, r20 29240: 95 1f adc r25, r21 29242: a6 1f adc r26, r22 29244: b7 1f adc r27, r23 29246: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2924a: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2924e: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 29252: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd STEP_NC_LO(Z_AXIS); } // Step in E axis counter[E_AXIS].wide += current_block->steps[E_AXIS].wide; 29256: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 2925a: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 2925e: 80 91 8c 05 lds r24, 0x058C ; 0x80058c 29262: 90 91 8d 05 lds r25, 0x058D ; 0x80058d 29266: a0 91 8e 05 lds r26, 0x058E ; 0x80058e 2926a: b0 91 8f 05 lds r27, 0x058F ; 0x80058f 2926e: 44 85 ldd r20, Z+12 ; 0x0c 29270: 55 85 ldd r21, Z+13 ; 0x0d 29272: 66 85 ldd r22, Z+14 ; 0x0e 29274: 77 85 ldd r23, Z+15 ; 0x0f 29276: 84 0f add r24, r20 29278: 95 1f adc r25, r21 2927a: a6 1f adc r26, r22 2927c: b7 1f adc r27, r23 2927e: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c 29282: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 29286: a0 93 8e 05 sts 0x058E, r26 ; 0x80058e 2928a: b0 93 8f 05 sts 0x058F, r27 ; 0x80058f 2928e: 40 89 ldd r20, Z+16 ; 0x10 29290: 51 89 ldd r21, Z+17 ; 0x11 29292: 62 89 ldd r22, Z+18 ; 0x12 29294: 73 89 ldd r23, Z+19 ; 0x13 if (counter[E_AXIS].wide > 0) { 29296: 18 16 cp r1, r24 29298: 19 06 cpc r1, r25 2929a: 1a 06 cpc r1, r26 2929c: 1b 06 cpc r1, r27 2929e: 74 f5 brge .+92 ; 0x292fc <__vector_17+0xabe> #ifndef LIN_ADVANCE STEP_NC_HI(E_AXIS); #endif /* LIN_ADVANCE */ counter[E_AXIS].wide -= current_block->step_event_count.wide; 292a0: 84 1b sub r24, r20 292a2: 95 0b sbc r25, r21 292a4: a6 0b sbc r26, r22 292a6: b7 0b sbc r27, r23 292a8: 80 93 8c 05 sts 0x058C, r24 ; 0x80058c 292ac: 90 93 8d 05 sts 0x058D, r25 ; 0x80058d 292b0: a0 93 8e 05 sts 0x058E, r26 ; 0x80058e 292b4: b0 93 8f 05 sts 0x058F, r27 ; 0x80058f count_position[E_AXIS] += count_direction[E_AXIS]; 292b8: 90 91 9a 02 lds r25, 0x029A ; 0x80029a 292bc: c0 90 be 06 lds r12, 0x06BE ; 0x8006be 292c0: d0 90 bf 06 lds r13, 0x06BF ; 0x8006bf 292c4: e0 90 c0 06 lds r14, 0x06C0 ; 0x8006c0 292c8: f0 90 c1 06 lds r15, 0x06C1 ; 0x8006c1 292cc: 89 2f mov r24, r25 292ce: 99 0f add r25, r25 292d0: 99 0b sbc r25, r25 292d2: aa 0b sbc r26, r26 292d4: bb 0b sbc r27, r27 292d6: 8c 0d add r24, r12 292d8: 9d 1d adc r25, r13 292da: ae 1d adc r26, r14 292dc: bf 1d adc r27, r15 292de: 80 93 be 06 sts 0x06BE, r24 ; 0x8006be 292e2: 90 93 bf 06 sts 0x06BF, r25 ; 0x8006bf 292e6: a0 93 c0 06 sts 0x06C0, r26 ; 0x8006c0 292ea: b0 93 c1 06 sts 0x06C1, r27 ; 0x8006c1 #ifdef LIN_ADVANCE e_steps += count_direction[E_AXIS]; 292ee: 90 91 9a 02 lds r25, 0x029A ; 0x80029a 292f2: 80 91 91 05 lds r24, 0x0591 ; 0x800591 292f6: 89 0f add r24, r25 292f8: 80 93 91 05 sts 0x0591, r24 ; 0x800591 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) 292fc: 80 91 7b 05 lds r24, 0x057B ; 0x80057b 29300: 90 91 7c 05 lds r25, 0x057C ; 0x80057c 29304: a0 91 7d 05 lds r26, 0x057D ; 0x80057d 29308: b0 91 7e 05 lds r27, 0x057E ; 0x80057e 2930c: 01 96 adiw r24, 0x01 ; 1 2930e: a1 1d adc r26, r1 29310: b1 1d adc r27, r1 29312: 80 93 7b 05 sts 0x057B, r24 ; 0x80057b 29316: 90 93 7c 05 sts 0x057C, r25 ; 0x80057c 2931a: a0 93 7d 05 sts 0x057D, r26 ; 0x80057d 2931e: b0 93 7e 05 sts 0x057E, r27 ; 0x80057e 29322: 84 17 cp r24, r20 29324: 95 07 cpc r25, r21 29326: a6 07 cpc r26, r22 29328: b7 07 cpc r27, r23 2932a: 10 f4 brcc .+4 ; 0x29330 <__vector_17+0xaf2> } } FORCE_INLINE void stepper_tick_highres() { for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves) 2932c: cf 5f subi r28, 0xFF ; 255 2932e: 91 ce rjmp .-734 ; 0x29052 <__vector_17+0x814> else stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 29330: 80 91 91 05 lds r24, 0x0591 ; 0x800591 29334: 88 23 and r24, r24 29336: 39 f0 breq .+14 ; 0x29346 <__vector_17+0xb08> 29338: 87 fd sbrc r24, 7 2933a: ee c0 rjmp .+476 ; 0x29518 <__vector_17+0xcda> 2933c: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 29340: 80 64 ori r24, 0x40 ; 64 29342: 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) { 29346: 40 91 7b 05 lds r20, 0x057B ; 0x80057b 2934a: 50 91 7c 05 lds r21, 0x057C ; 0x80057c 2934e: 60 91 7d 05 lds r22, 0x057D ; 0x80057d 29352: 70 91 7e 05 lds r23, 0x057E ; 0x80057e 29356: c0 91 a0 05 lds r28, 0x05A0 ; 0x8005a0 2935a: d0 91 a1 05 lds r29, 0x05A1 ; 0x8005a1 2935e: 89 8d ldd r24, Y+25 ; 0x19 29360: 9a 8d ldd r25, Y+26 ; 0x1a 29362: ab 8d ldd r26, Y+27 ; 0x1b 29364: bc 8d ldd r27, Y+28 ; 0x1c 29366: 84 17 cp r24, r20 29368: 95 07 cpc r25, r21 2936a: a6 07 cpc r26, r22 2936c: b7 07 cpc r27, r23 2936e: 08 f4 brcc .+2 ; 0x29372 <__vector_17+0xb34> 29370: 34 c1 rjmp .+616 ; 0x295da <__vector_17+0xd9c> // v = t * a -> acc_step_rate = acceleration_time * current_block->acceleration_rate acc_step_rate = MUL24x24R24(acceleration_time, current_block->acceleration_rate); 29372: 40 91 94 05 lds r20, 0x0594 ; 0x800594 29376: 50 91 95 05 lds r21, 0x0595 ; 0x800595 2937a: 60 91 96 05 lds r22, 0x0596 ; 0x800596 2937e: 70 91 97 05 lds r23, 0x0597 ; 0x800597 "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. ); 29382: cc 88 ldd r12, Y+20 ; 0x14 29384: dd 88 ldd r13, Y+21 ; 0x15 29386: ee 88 ldd r14, Y+22 ; 0x16 29388: aa 27 eor r26, r26 2938a: 4d 9d mul r20, r13 2938c: b1 2d mov r27, r1 2938e: 5e 9d mul r21, r14 29390: c0 01 movw r24, r0 29392: 6e 9d mul r22, r14 29394: 90 0d add r25, r0 29396: 6d 9d mul r22, r13 29398: 80 0d add r24, r0 2939a: 91 1d adc r25, r1 2939c: 4e 9d mul r20, r14 2939e: b0 0d add r27, r0 293a0: 81 1d adc r24, r1 293a2: 9a 1f adc r25, r26 293a4: 5d 9d mul r21, r13 293a6: b0 0d add r27, r0 293a8: 81 1d adc r24, r1 293aa: 9a 1f adc r25, r26 293ac: 6c 9d mul r22, r12 293ae: b0 0d add r27, r0 293b0: 81 1d adc r24, r1 293b2: 9a 1f adc r25, r26 293b4: 5c 9d mul r21, r12 293b6: b1 0d add r27, r1 293b8: 8a 1f adc r24, r26 293ba: 9a 1f adc r25, r26 293bc: bb 0f add r27, r27 293be: 8a 1f adc r24, r26 293c0: 9a 1f adc r25, r26 293c2: 11 24 eor r1, r1 acc_step_rate += uint16_t(current_block->initial_rate); 293c4: 2a ad ldd r18, Y+58 ; 0x3a 293c6: 3b ad ldd r19, Y+59 ; 0x3b 293c8: 82 0f add r24, r18 293ca: 93 1f adc r25, r19 293cc: 90 93 9a 05 sts 0x059A, r25 ; 0x80059a 293d0: 80 93 99 05 sts 0x0599, r24 ; 0x800599 // upper limit if(acc_step_rate > uint16_t(current_block->nominal_rate)) 293d4: 2e a9 ldd r18, Y+54 ; 0x36 293d6: 3f a9 ldd r19, Y+55 ; 0x37 293d8: 28 17 cp r18, r24 293da: 39 07 cpc r19, r25 293dc: 20 f4 brcc .+8 ; 0x293e6 <__vector_17+0xba8> acc_step_rate = current_block->nominal_rate; 293de: 30 93 9a 05 sts 0x059A, r19 ; 0x80059a 293e2: 20 93 99 05 sts 0x0599, r18 ; 0x800599 // step_rate to timer interval uint16_t timer = calc_timer(acc_step_rate, step_loops); 293e6: 80 91 99 05 lds r24, 0x0599 ; 0x800599 293ea: 90 91 9a 05 lds r25, 0x059A ; 0x80059a #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; 293ee: 81 34 cpi r24, 0x41 ; 65 293f0: fc e9 ldi r31, 0x9C ; 156 293f2: 9f 07 cpc r25, r31 293f4: 08 f0 brcs .+2 ; 0x293f8 <__vector_17+0xbba> 293f6: 94 c0 rjmp .+296 ; 0x29520 <__vector_17+0xce2> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 293f8: 81 32 cpi r24, 0x21 ; 33 293fa: 2e e4 ldi r18, 0x4E ; 78 293fc: 92 07 cpc r25, r18 293fe: 08 f4 brcc .+2 ; 0x29402 <__vector_17+0xbc4> 29400: 92 c0 rjmp .+292 ; 0x29526 <__vector_17+0xce8> step_rate = (step_rate >> 2)&0x3fff; 29402: 96 95 lsr r25 29404: 87 95 ror r24 29406: 96 95 lsr r25 29408: 87 95 ror r24 step_loops = 4; 2940a: 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; 2940c: 20 93 98 05 sts 0x0598, r18 ; 0x800598 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 29410: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 29412: 81 15 cp r24, r1 29414: f8 e0 ldi r31, 0x08 ; 8 29416: 9f 07 cpc r25, r31 29418: 08 f4 brcc .+2 ; 0x2941c <__vector_17+0xbde> 2941a: 97 c0 rjmp .+302 ; 0x2954a <__vector_17+0xd0c> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 2941c: e9 2f mov r30, r25 2941e: ff 27 eor r31, r31 29420: ee 0f add r30, r30 29422: ff 1f adc r31, r31 29424: ee 0f add r30, r30 29426: ff 1f adc r31, r31 29428: 9f 01 movw r18, r30 2942a: 2f 55 subi r18, 0x5F ; 95 2942c: 3a 46 sbci r19, 0x6A ; 106 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 2942e: f9 01 movw r30, r18 29430: 32 96 adiw r30, 0x02 ; 2 29432: a5 91 lpm r26, Z+ 29434: b4 91 lpm r27, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 29436: f9 01 movw r30, r18 29438: 25 91 lpm r18, Z+ 2943a: 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. ); 2943c: b8 9f mul r27, r24 2943e: f0 01 movw r30, r0 29440: a8 9f mul r26, r24 29442: 00 0c add r0, r0 29444: e1 1d adc r30, r1 29446: 11 24 eor r1, r1 29448: f1 1d adc r31, 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); 2944a: c9 01 movw r24, r18 2944c: 8e 1b sub r24, r30 2944e: 9f 0b sbc r25, r31 29450: 84 36 cpi r24, 0x64 ; 100 29452: 91 05 cpc r25, r1 29454: 10 f4 brcc .+4 ; 0x2945a <__vector_17+0xc1c> 29456: 84 e6 ldi r24, 0x64 ; 100 29458: 90 e0 ldi r25, 0x00 ; 0 _NEXT_ISR(timer); 2945a: 90 93 e5 04 sts 0x04E5, r25 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 2945e: 80 93 e4 04 sts 0x04E4, r24 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 29462: 90 93 e1 04 sts 0x04E1, r25 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> 29466: 80 93 e0 04 sts 0x04E0, r24 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> acceleration_time += timer; 2946a: 48 0f add r20, r24 2946c: 59 1f adc r21, r25 2946e: 61 1d adc r22, r1 29470: 71 1d adc r23, r1 29472: 40 93 94 05 sts 0x0594, r20 ; 0x800594 29476: 50 93 95 05 sts 0x0595, r21 ; 0x800595 2947a: 60 93 96 05 sts 0x0596, r22 ; 0x800596 2947e: 70 93 97 05 sts 0x0597, r23 ; 0x800597 #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 29482: fe 01 movw r30, r28 29484: e4 5b subi r30, 0xB4 ; 180 29486: ff 4f sbci r31, 0xFF ; 255 29488: 80 81 ld r24, Z 2948a: 81 11 cpse r24, r1 2948c: 7d c0 rjmp .+250 ; 0x29588 <__vector_17+0xd4a> 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; 2948e: 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) { 29490: 80 ff sbrs r24, 0 29492: 16 c0 rjmp .+44 ; 0x294c0 <__vector_17+0xc82> LA_phase = -1; 29494: 9f ef ldi r25, 0xFF ; 255 29496: 90 93 90 05 sts 0x0590, r25 ; 0x800590 if (current_adv_steps == target_adv_steps) { 2949a: e0 91 de 04 lds r30, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 2949e: f0 91 df 04 lds r31, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 294a2: 20 91 92 05 lds r18, 0x0592 ; 0x800592 294a6: 30 91 93 05 lds r19, 0x0593 ; 0x800593 294aa: e2 17 cp r30, r18 294ac: f3 07 cpc r31, r19 294ae: 09 f0 breq .+2 ; 0x294b2 <__vector_17+0xc74> 294b0: 24 c2 rjmp .+1096 ; 0x298fa <__vector_17+0x10bc> // nothing to be done in this phase, cancel any pending eisr la_state = 0; nextAdvanceISR = ADV_NEVER; 294b2: 8f ef ldi r24, 0xFF ; 255 294b4: 9f ef ldi r25, 0xFF ; 255 294b6: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 294ba: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 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; 294be: 80 e0 ldi r24, 0x00 ; 0 eISR_Err += current_block->advance_rate; LA_phase = 0; } } } if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) { 294c0: 80 fd sbrc r24, 0 294c2: 07 c0 rjmp .+14 ; 0x294d2 <__vector_17+0xc94> 294c4: 80 91 e2 04 lds r24, 0x04E2 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 294c8: 90 91 e3 04 lds r25, 0x04E3 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 294cc: 01 96 adiw r24, 0x01 ; 1 294ce: 09 f4 brne .+2 ; 0x294d2 <__vector_17+0xc94> 294d0: b2 c2 rjmp .+1380 ; 0x29a36 <__vector_17+0x11f8> // update timers & phase for the next iteration advance_spread(main_Rate); 294d2: e0 91 e0 04 lds r30, 0x04E0 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> 294d6: f0 91 e1 04 lds r31, 0x04E1 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> else return ((uint32_t)0xAAAB * q) >> 17; } FORCE_INLINE void advance_spread(uint16_t timer) { eISR_Err += timer; 294da: 80 91 71 05 lds r24, 0x0571 ; 0x800571 294de: 90 91 72 05 lds r25, 0x0572 ; 0x800572 294e2: a0 91 73 05 lds r26, 0x0573 ; 0x800573 294e6: b0 91 74 05 lds r27, 0x0574 ; 0x800574 294ea: 8e 0f add r24, r30 294ec: 9f 1f adc r25, r31 294ee: a1 1d adc r26, r1 294f0: b1 1d adc r27, r1 uint8_t ticks = 0; while(eISR_Err >= current_block->advance_rate) 294f2: c3 5b subi r28, 0xB3 ; 179 294f4: df 4f sbci r29, 0xFF ; 255 294f6: 08 81 ld r16, Y 294f8: 19 81 ldd r17, Y+1 ; 0x01 294fa: 30 e0 ldi r19, 0x00 ; 0 294fc: 20 e0 ldi r18, 0x00 ; 0 FORCE_INLINE void advance_spread(uint16_t timer) { eISR_Err += timer; uint8_t ticks = 0; 294fe: 60 e0 ldi r22, 0x00 ; 0 while(eISR_Err >= current_block->advance_rate) 29500: 80 17 cp r24, r16 29502: 91 07 cpc r25, r17 29504: a2 07 cpc r26, r18 29506: b3 07 cpc r27, r19 29508: 08 f4 brcc .+2 ; 0x2950c <__vector_17+0xcce> 2950a: 27 c2 rjmp .+1102 ; 0x2995a <__vector_17+0x111c> { ++ticks; 2950c: 6f 5f subi r22, 0xFF ; 255 eISR_Err -= current_block->advance_rate; 2950e: 80 1b sub r24, r16 29510: 91 0b sbc r25, r17 29512: a2 0b sbc r26, r18 29514: b3 0b sbc r27, r19 29516: f4 cf rjmp .-24 ; 0x29500 <__vector_17+0xcc2> else stepper_tick_highres(); #ifdef LIN_ADVANCE if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 29518: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2951c: 8f 7b andi r24, 0xBF ; 191 2951e: 11 cf rjmp .-478 ; 0x29342 <__vector_17+0xb04> #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; 29520: 80 e4 ldi r24, 0x40 ; 64 29522: 9c e9 ldi r25, 0x9C ; 156 29524: 6e cf rjmp .-292 ; 0x29402 <__vector_17+0xbc4> 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 29526: 81 31 cpi r24, 0x11 ; 17 29528: e7 e2 ldi r30, 0x27 ; 39 2952a: 9e 07 cpc r25, r30 2952c: 20 f0 brcs .+8 ; 0x29536 <__vector_17+0xcf8> step_rate = (step_rate >> 1)&0x7fff; 2952e: 96 95 lsr r25 29530: 87 95 ror r24 step_loops = 2; 29532: 22 e0 ldi r18, 0x02 ; 2 29534: 6b cf rjmp .-298 ; 0x2940c <__vector_17+0xbce> } else { step_loops = 1; 29536: 21 e0 ldi r18, 0x01 ; 1 29538: 20 93 98 05 sts 0x0598, r18 ; 0x800598 2953c: 80 32 cpi r24, 0x20 ; 32 2953e: 91 05 cpc r25, r1 29540: 08 f0 brcs .+2 ; 0x29544 <__vector_17+0xd06> 29542: 66 cf rjmp .-308 ; 0x29410 <__vector_17+0xbd2> 29544: 80 e2 ldi r24, 0x20 ; 32 29546: 90 e0 ldi r25, 0x00 ; 0 29548: 63 cf rjmp .-314 ; 0x29410 <__vector_17+0xbd2> 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; 2954a: 9c 01 movw r18, r24 2954c: 36 95 lsr r19 2954e: 27 95 ror r18 29550: 2c 7f andi r18, 0xFC ; 252 29552: 2f 55 subi r18, 0x5F ; 95 29554: 3e 46 sbci r19, 0x6E ; 110 timer = (unsigned short)pgm_read_word_near(table_address); 29556: f9 01 movw r30, r18 29558: a5 91 lpm r26, Z+ 2955a: b4 91 lpm r27, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 2955c: f9 01 movw r30, r18 2955e: 32 96 adiw r30, 0x02 ; 2 29560: 05 91 lpm r16, Z+ 29562: 14 91 lpm r17, Z 29564: 87 70 andi r24, 0x07 ; 7 29566: 99 27 eor r25, r25 29568: 80 9f mul r24, r16 2956a: 90 01 movw r18, r0 2956c: 81 9f mul r24, r17 2956e: 30 0d add r19, r0 29570: 90 9f mul r25, r16 29572: 30 0d add r19, r0 29574: 11 24 eor r1, r1 29576: f3 e0 ldi r31, 0x03 ; 3 29578: 36 95 lsr r19 2957a: 27 95 ror r18 2957c: fa 95 dec r31 2957e: e1 f7 brne .-8 ; 0x29578 <__vector_17+0xd3a> 29580: cd 01 movw r24, r26 29582: 82 1b sub r24, r18 29584: 93 0b sbc r25, r19 29586: 64 cf rjmp .-312 ; 0x29450 <__vector_17+0xc12> 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) { 29588: 40 91 7b 05 lds r20, 0x057B ; 0x80057b 2958c: 50 91 7c 05 lds r21, 0x057C ; 0x80057c 29590: 60 91 7d 05 lds r22, 0x057D ; 0x80057d 29594: 70 91 7e 05 lds r23, 0x057E ; 0x80057e 29598: 80 91 98 05 lds r24, 0x0598 ; 0x800598 2959c: 90 e0 ldi r25, 0x00 ; 0 2959e: b0 e0 ldi r27, 0x00 ; 0 295a0: a0 e0 ldi r26, 0x00 ; 0 295a2: 84 17 cp r24, r20 295a4: 95 07 cpc r25, r21 295a6: a6 07 cpc r26, r22 295a8: b7 07 cpc r27, r23 295aa: 08 f4 brcc .+2 ; 0x295ae <__vector_17+0xd70> 295ac: 70 cf rjmp .-288 ; 0x2948e <__vector_17+0xc50> la_state = ADV_INIT | ADV_ACC_VARY; if (e_extruding && current_adv_steps > target_adv_steps) 295ae: 80 91 7f 05 lds r24, 0x057F ; 0x80057f 295b2: 81 11 cpse r24, r1 295b4: 02 c0 rjmp .+4 ; 0x295ba <__vector_17+0xd7c> _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; 295b6: 83 e0 ldi r24, 0x03 ; 3 295b8: 6b cf rjmp .-298 ; 0x29490 <__vector_17+0xc52> if (e_extruding && current_adv_steps > target_adv_steps) 295ba: 80 91 de 04 lds r24, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 295be: 90 91 df 04 lds r25, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 295c2: 20 91 92 05 lds r18, 0x0592 ; 0x800592 295c6: 30 91 93 05 lds r19, 0x0593 ; 0x800593 295ca: 28 17 cp r18, r24 295cc: 39 07 cpc r19, r25 295ce: 98 f7 brcc .-26 ; 0x295b6 <__vector_17+0xd78> target_adv_steps = current_adv_steps; 295d0: 90 93 93 05 sts 0x0593, r25 ; 0x800593 295d4: 80 93 92 05 sts 0x0592, r24 ; 0x800592 295d8: ee cf rjmp .-36 ; 0x295b6 <__vector_17+0xd78> } } #endif } else if (step_events_completed.wide > current_block->decelerate_after) { 295da: 80 91 7b 05 lds r24, 0x057B ; 0x80057b 295de: 90 91 7c 05 lds r25, 0x057C ; 0x80057c 295e2: a0 91 7d 05 lds r26, 0x057D ; 0x80057d 295e6: b0 91 7e 05 lds r27, 0x057E ; 0x80057e 295ea: 4d 8d ldd r20, Y+29 ; 0x1d 295ec: 5e 8d ldd r21, Y+30 ; 0x1e 295ee: 6f 8d ldd r22, Y+31 ; 0x1f 295f0: 78 a1 ldd r23, Y+32 ; 0x20 295f2: 48 17 cp r20, r24 295f4: 59 07 cpc r21, r25 295f6: 6a 07 cpc r22, r26 295f8: 7b 07 cpc r23, r27 295fa: 08 f0 brcs .+2 ; 0x295fe <__vector_17+0xdc0> 295fc: e3 c0 rjmp .+454 ; 0x297c4 <__vector_17+0xf86> uint16_t step_rate = MUL24x24R24(deceleration_time, current_block->acceleration_rate); 295fe: c0 90 9c 05 lds r12, 0x059C ; 0x80059c 29602: d0 90 9d 05 lds r13, 0x059D ; 0x80059d 29606: e0 90 9e 05 lds r14, 0x059E ; 0x80059e 2960a: f0 90 9f 05 lds r15, 0x059F ; 0x80059f "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. ); 2960e: 6c 88 ldd r6, Y+20 ; 0x14 29610: 7d 88 ldd r7, Y+21 ; 0x15 29612: 8e 88 ldd r8, Y+22 ; 0x16 29614: aa 27 eor r26, r26 29616: c7 9c mul r12, r7 29618: b1 2d mov r27, r1 2961a: d8 9c mul r13, r8 2961c: f0 01 movw r30, r0 2961e: e8 9c mul r14, r8 29620: f0 0d add r31, r0 29622: e7 9c mul r14, r7 29624: e0 0d add r30, r0 29626: f1 1d adc r31, r1 29628: c8 9c mul r12, r8 2962a: b0 0d add r27, r0 2962c: e1 1d adc r30, r1 2962e: fa 1f adc r31, r26 29630: d7 9c mul r13, r7 29632: b0 0d add r27, r0 29634: e1 1d adc r30, r1 29636: fa 1f adc r31, r26 29638: e6 9c mul r14, r6 2963a: b0 0d add r27, r0 2963c: e1 1d adc r30, r1 2963e: fa 1f adc r31, r26 29640: d6 9c mul r13, r6 29642: b1 0d add r27, r1 29644: ea 1f adc r30, r26 29646: fa 1f adc r31, r26 29648: bb 0f add r27, r27 2964a: ea 1f adc r30, r26 2964c: fa 1f adc r31, r26 2964e: 11 24 eor r1, r1 if (step_rate > acc_step_rate) { // Check step_rate stays positive 29650: 20 91 99 05 lds r18, 0x0599 ; 0x800599 29654: 30 91 9a 05 lds r19, 0x059A ; 0x80059a 29658: 8e ad ldd r24, Y+62 ; 0x3e 2965a: 9f ad ldd r25, Y+63 ; 0x3f 2965c: 2e 17 cp r18, r30 2965e: 3f 07 cpc r19, r31 29660: 30 f0 brcs .+12 ; 0x2966e <__vector_17+0xe30> step_rate = uint16_t(current_block->final_rate); } else { step_rate = acc_step_rate - step_rate; // Decelerate from acceleration end point. 29662: 2e 1b sub r18, r30 29664: 3f 0b sbc r19, r31 29666: 82 17 cp r24, r18 29668: 93 07 cpc r25, r19 2966a: 08 f4 brcc .+2 ; 0x2966e <__vector_17+0xe30> 2966c: 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; 2966e: 81 34 cpi r24, 0x41 ; 65 29670: 2c e9 ldi r18, 0x9C ; 156 29672: 92 07 cpc r25, r18 29674: 08 f0 brcs .+2 ; 0x29678 <__vector_17+0xe3a> 29676: 75 c0 rjmp .+234 ; 0x29762 <__vector_17+0xf24> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 29678: 81 32 cpi r24, 0x21 ; 33 2967a: ee e4 ldi r30, 0x4E ; 78 2967c: 9e 07 cpc r25, r30 2967e: 08 f4 brcc .+2 ; 0x29682 <__vector_17+0xe44> 29680: 73 c0 rjmp .+230 ; 0x29768 <__vector_17+0xf2a> step_rate = (step_rate >> 2)&0x3fff; 29682: 96 95 lsr r25 29684: 87 95 ror r24 29686: 96 95 lsr r25 29688: 87 95 ror r24 step_loops = 4; 2968a: 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; 2968c: 20 93 98 05 sts 0x0598, r18 ; 0x800598 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 29690: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 29692: 81 15 cp r24, r1 29694: 28 e0 ldi r18, 0x08 ; 8 29696: 92 07 cpc r25, r18 29698: 08 f4 brcc .+2 ; 0x2969c <__vector_17+0xe5e> 2969a: 78 c0 rjmp .+240 ; 0x2978c <__vector_17+0xf4e> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 2969c: e9 2f mov r30, r25 2969e: ff 27 eor r31, r31 296a0: ee 0f add r30, r30 296a2: ff 1f adc r31, r31 296a4: ee 0f add r30, r30 296a6: ff 1f adc r31, r31 296a8: 9f 01 movw r18, r30 296aa: 2f 55 subi r18, 0x5F ; 95 296ac: 3a 46 sbci r19, 0x6A ; 106 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 296ae: f9 01 movw r30, r18 296b0: 32 96 adiw r30, 0x02 ; 2 296b2: a5 91 lpm r26, Z+ 296b4: b4 91 lpm r27, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 296b6: f9 01 movw r30, r18 296b8: 25 91 lpm r18, Z+ 296ba: 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. ); 296bc: b8 9f mul r27, r24 296be: f0 01 movw r30, r0 296c0: a8 9f mul r26, r24 296c2: 00 0c add r0, r0 296c4: e1 1d adc r30, r1 296c6: 11 24 eor r1, r1 296c8: 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); 296ca: 2e 1b sub r18, r30 296cc: 3f 0b sbc r19, r31 296ce: c9 01 movw r24, r18 296d0: 24 36 cpi r18, 0x64 ; 100 296d2: 31 05 cpc r19, r1 296d4: 10 f4 brcc .+4 ; 0x296da <__vector_17+0xe9c> 296d6: 84 e6 ldi r24, 0x64 ; 100 296d8: 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); 296da: 90 93 e5 04 sts 0x04E5, r25 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 296de: 80 93 e4 04 sts 0x04E4, r24 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 296e2: 90 93 e1 04 sts 0x04E1, r25 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> 296e6: 80 93 e0 04 sts 0x04E0, r24 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> deceleration_time += timer; 296ea: c8 0e add r12, r24 296ec: d9 1e adc r13, r25 296ee: e1 1c adc r14, r1 296f0: f1 1c adc r15, r1 296f2: c0 92 9c 05 sts 0x059C, r12 ; 0x80059c 296f6: d0 92 9d 05 sts 0x059D, r13 ; 0x80059d 296fa: e0 92 9e 05 sts 0x059E, r14 ; 0x80059e 296fe: f0 92 9f 05 sts 0x059F, r15 ; 0x80059f #ifdef LIN_ADVANCE if (current_block->use_advance_lead) { 29702: fe 01 movw r30, r28 29704: e4 5b subi r30, 0xB4 ; 180 29706: ff 4f sbci r31, 0xFF ; 255 29708: 80 81 ld r24, Z 2970a: 88 23 and r24, r24 2970c: 09 f4 brne .+2 ; 0x29710 <__vector_17+0xed2> 2970e: bf ce rjmp .-642 ; 0x2948e <__vector_17+0xc50> if (step_events_completed.wide <= current_block->decelerate_after + step_loops) { 29710: 80 91 7b 05 lds r24, 0x057B ; 0x80057b 29714: 90 91 7c 05 lds r25, 0x057C ; 0x80057c 29718: a0 91 7d 05 lds r26, 0x057D ; 0x80057d 2971c: b0 91 7e 05 lds r27, 0x057E ; 0x80057e 29720: 20 91 98 05 lds r18, 0x0598 ; 0x800598 29724: 42 0f add r20, r18 29726: 51 1d adc r21, r1 29728: 61 1d adc r22, r1 2972a: 71 1d adc r23, r1 2972c: 48 17 cp r20, r24 2972e: 59 07 cpc r21, r25 29730: 6a 07 cpc r22, r26 29732: 7b 07 cpc r23, r27 29734: 08 f4 brcc .+2 ; 0x29738 <__vector_17+0xefa> 29736: ab ce rjmp .-682 ; 0x2948e <__vector_17+0xc50> target_adv_steps = current_block->final_adv_steps; 29738: 35 96 adiw r30, 0x05 ; 5 2973a: 20 81 ld r18, Z 2973c: 31 81 ldd r19, Z+1 ; 0x01 2973e: 30 93 93 05 sts 0x0593, r19 ; 0x800593 29742: 20 93 92 05 sts 0x0592, r18 ; 0x800592 la_state = ADV_INIT | ADV_ACC_VARY; if (e_extruding && current_adv_steps < target_adv_steps) 29746: 80 91 7f 05 lds r24, 0x057F ; 0x80057f 2974a: 88 23 and r24, r24 2974c: 09 f4 brne .+2 ; 0x29750 <__vector_17+0xf12> 2974e: 33 cf rjmp .-410 ; 0x295b6 <__vector_17+0xd78> 29750: 80 91 de 04 lds r24, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29754: 90 91 df 04 lds r25, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29758: 82 17 cp r24, r18 2975a: 93 07 cpc r25, r19 2975c: 08 f0 brcs .+2 ; 0x29760 <__vector_17+0xf22> 2975e: 2b cf rjmp .-426 ; 0x295b6 <__vector_17+0xd78> 29760: 37 cf rjmp .-402 ; 0x295d0 <__vector_17+0xd92> #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; 29762: 80 e4 ldi r24, 0x40 ; 64 29764: 9c e9 ldi r25, 0x9C ; 156 29766: 8d cf rjmp .-230 ; 0x29682 <__vector_17+0xe44> 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 29768: 81 31 cpi r24, 0x11 ; 17 2976a: f7 e2 ldi r31, 0x27 ; 39 2976c: 9f 07 cpc r25, r31 2976e: 20 f0 brcs .+8 ; 0x29778 <__vector_17+0xf3a> step_rate = (step_rate >> 1)&0x7fff; 29770: 96 95 lsr r25 29772: 87 95 ror r24 step_loops = 2; 29774: 22 e0 ldi r18, 0x02 ; 2 29776: 8a cf rjmp .-236 ; 0x2968c <__vector_17+0xe4e> } else { step_loops = 1; 29778: 21 e0 ldi r18, 0x01 ; 1 2977a: 20 93 98 05 sts 0x0598, r18 ; 0x800598 2977e: 80 32 cpi r24, 0x20 ; 32 29780: 91 05 cpc r25, r1 29782: 08 f0 brcs .+2 ; 0x29786 <__vector_17+0xf48> 29784: 85 cf rjmp .-246 ; 0x29690 <__vector_17+0xe52> 29786: 80 e2 ldi r24, 0x20 ; 32 29788: 90 e0 ldi r25, 0x00 ; 0 2978a: 82 cf rjmp .-252 ; 0x29690 <__vector_17+0xe52> 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; 2978c: dc 01 movw r26, r24 2978e: b6 95 lsr r27 29790: a7 95 ror r26 29792: ac 7f andi r26, 0xFC ; 252 29794: af 55 subi r26, 0x5F ; 95 29796: be 46 sbci r27, 0x6E ; 110 timer = (unsigned short)pgm_read_word_near(table_address); 29798: fd 01 movw r30, r26 2979a: 25 91 lpm r18, Z+ 2979c: 34 91 lpm r19, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 2979e: fd 01 movw r30, r26 297a0: 32 96 adiw r30, 0x02 ; 2 297a2: a5 91 lpm r26, Z+ 297a4: b4 91 lpm r27, Z 297a6: 87 70 andi r24, 0x07 ; 7 297a8: 99 27 eor r25, r25 297aa: 8a 9f mul r24, r26 297ac: f0 01 movw r30, r0 297ae: 8b 9f mul r24, r27 297b0: f0 0d add r31, r0 297b2: 9a 9f mul r25, r26 297b4: f0 0d add r31, r0 297b6: 11 24 eor r1, r1 297b8: a3 e0 ldi r26, 0x03 ; 3 297ba: f6 95 lsr r31 297bc: e7 95 ror r30 297be: aa 95 dec r26 297c0: e1 f7 brne .-8 ; 0x297ba <__vector_17+0xf7c> 297c2: 83 cf rjmp .-250 ; 0x296ca <__vector_17+0xe8c> } } #endif } else { if (! step_loops_nominal) { 297c4: 80 91 9b 05 lds r24, 0x059B ; 0x80059b 297c8: 88 23 and r24, r24 297ca: 71 f0 breq .+28 ; 0x297e8 <__vector_17+0xfaa> 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; 297cc: 80 e0 ldi r24, 0x00 ; 0 if (e_extruding) target_adv_steps = current_adv_steps; } #endif } _NEXT_ISR(OCR1A_nominal); 297ce: 20 91 75 05 lds r18, 0x0575 ; 0x800575 297d2: 30 91 76 05 lds r19, 0x0576 ; 0x800576 297d6: 30 93 e5 04 sts 0x04E5, r19 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 297da: 20 93 e4 04 sts 0x04E4, r18 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 297de: 30 93 e1 04 sts 0x04E1, r19 ; 0x8004e1 <_ZL9main_Rate.lto_priv.480+0x1> 297e2: 20 93 e0 04 sts 0x04E0, r18 ; 0x8004e0 <_ZL9main_Rate.lto_priv.480> 297e6: 54 ce rjmp .-856 ; 0x29490 <__vector_17+0xc52> } 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); 297e8: 8e a9 ldd r24, Y+54 ; 0x36 297ea: 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; 297ec: 81 34 cpi r24, 0x41 ; 65 297ee: 4c e9 ldi r20, 0x9C ; 156 297f0: 94 07 cpc r25, r20 297f2: 08 f0 brcs .+2 ; 0x297f6 <__vector_17+0xfb8> 297f4: 4e c0 rjmp .+156 ; 0x29892 <__vector_17+0x1054> if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times 297f6: 81 32 cpi r24, 0x21 ; 33 297f8: 5e e4 ldi r21, 0x4E ; 78 297fa: 95 07 cpc r25, r21 297fc: 08 f4 brcc .+2 ; 0x29800 <__vector_17+0xfc2> 297fe: 4c c0 rjmp .+152 ; 0x29898 <__vector_17+0x105a> step_rate = (step_rate >> 2)&0x3fff; 29800: 96 95 lsr r25 29802: 87 95 ror r24 29804: 96 95 lsr r25 29806: 87 95 ror r24 step_loops = 4; 29808: 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; 2980a: 20 93 98 05 sts 0x0598, r18 ; 0x800598 else { step_loops = 1; } if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); step_rate -= (F_CPU/500000); // Correct for minimal speed 2980e: 80 97 sbiw r24, 0x20 ; 32 if(step_rate >= (8*256)){ // higher step rate 29810: 81 15 cp r24, r1 29812: f8 e0 ldi r31, 0x08 ; 8 29814: 9f 07 cpc r25, r31 29816: 08 f4 brcc .+2 ; 0x2981a <__vector_17+0xfdc> 29818: 51 c0 rjmp .+162 ; 0x298bc <__vector_17+0x107e> unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; 2981a: e9 2f mov r30, r25 2981c: ff 27 eor r31, r31 2981e: ee 0f add r30, r30 29820: ff 1f adc r31, r31 29822: ee 0f add r30, r30 29824: ff 1f adc r31, r31 29826: 9f 01 movw r18, r30 29828: 2f 55 subi r18, 0x5F ; 95 2982a: 3a 46 sbci r19, 0x6A ; 106 unsigned char tmp_step_rate = (step_rate & 0x00ff); uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2); 2982c: f9 01 movw r30, r18 2982e: 32 96 adiw r30, 0x02 ; 2 29830: 65 91 lpm r22, Z+ 29832: 74 91 lpm r23, Z timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain); 29834: f9 01 movw r30, r18 29836: 25 91 lpm r18, Z+ 29838: 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. ); 2983a: 78 9f mul r23, r24 2983c: a0 01 movw r20, r0 2983e: 68 9f mul r22, r24 29840: 00 0c add r0, r0 29842: 41 1d adc r20, r1 29844: 11 24 eor r1, r1 29846: 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); 29848: c9 01 movw r24, r18 2984a: 84 1b sub r24, r20 2984c: 95 0b sbc r25, r21 2984e: 84 36 cpi r24, 0x64 ; 100 29850: 91 05 cpc r25, r1 29852: 10 f4 brcc .+4 ; 0x29858 <__vector_17+0x101a> 29854: 84 e6 ldi r24, 0x64 ; 100 29856: 90 e0 ldi r25, 0x00 ; 0 29858: 90 93 76 05 sts 0x0576, r25 ; 0x800576 2985c: 80 93 75 05 sts 0x0575, r24 ; 0x800575 step_loops_nominal = step_loops; 29860: 80 91 98 05 lds r24, 0x0598 ; 0x800598 29864: 80 93 9b 05 sts 0x059B, r24 ; 0x80059b #ifdef LIN_ADVANCE if(current_block->use_advance_lead) { 29868: fe 01 movw r30, r28 2986a: e4 5b subi r30, 0xB4 ; 180 2986c: ff 4f sbci r31, 0xFF ; 255 2986e: 80 81 ld r24, Z 29870: 88 23 and r24, r24 29872: 09 f4 brne .+2 ; 0x29876 <__vector_17+0x1038> 29874: ab cf rjmp .-170 ; 0x297cc <__vector_17+0xf8e> // 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) 29876: 80 91 7f 05 lds r24, 0x057F ; 0x80057f 2987a: 88 23 and r24, r24 2987c: 41 f0 breq .+16 ; 0x2988e <__vector_17+0x1050> target_adv_steps = current_adv_steps; 2987e: 80 91 de 04 lds r24, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29882: 90 91 df 04 lds r25, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29886: 90 93 93 05 sts 0x0593, r25 ; 0x800593 2988a: 80 93 92 05 sts 0x0592, r24 ; 0x800592 #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; 2988e: 81 e0 ldi r24, 0x01 ; 1 29890: 9e cf rjmp .-196 ; 0x297ce <__vector_17+0xf90> #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; 29892: 80 e4 ldi r24, 0x40 ; 64 29894: 9c e9 ldi r25, 0x9C ; 156 29896: b4 cf rjmp .-152 ; 0x29800 <__vector_17+0xfc2> 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 29898: 81 31 cpi r24, 0x11 ; 17 2989a: e7 e2 ldi r30, 0x27 ; 39 2989c: 9e 07 cpc r25, r30 2989e: 20 f0 brcs .+8 ; 0x298a8 <__vector_17+0x106a> step_rate = (step_rate >> 1)&0x7fff; 298a0: 96 95 lsr r25 298a2: 87 95 ror r24 step_loops = 2; 298a4: 22 e0 ldi r18, 0x02 ; 2 298a6: b1 cf rjmp .-158 ; 0x2980a <__vector_17+0xfcc> } else { step_loops = 1; 298a8: 21 e0 ldi r18, 0x01 ; 1 298aa: 20 93 98 05 sts 0x0598, r18 ; 0x800598 298ae: 80 32 cpi r24, 0x20 ; 32 298b0: 91 05 cpc r25, r1 298b2: 08 f0 brcs .+2 ; 0x298b6 <__vector_17+0x1078> 298b4: ac cf rjmp .-168 ; 0x2980e <__vector_17+0xfd0> 298b6: 80 e2 ldi r24, 0x20 ; 32 298b8: 90 e0 ldi r25, 0x00 ; 0 298ba: a9 cf rjmp .-174 ; 0x2980e <__vector_17+0xfd0> 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; 298bc: 9c 01 movw r18, r24 298be: 36 95 lsr r19 298c0: 27 95 ror r18 298c2: 2c 7f andi r18, 0xFC ; 252 298c4: 2f 55 subi r18, 0x5F ; 95 298c6: 3e 46 sbci r19, 0x6E ; 110 timer = (unsigned short)pgm_read_word_near(table_address); 298c8: f9 01 movw r30, r18 298ca: 45 91 lpm r20, Z+ 298cc: 54 91 lpm r21, Z timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); 298ce: f9 01 movw r30, r18 298d0: 32 96 adiw r30, 0x02 ; 2 298d2: 65 91 lpm r22, Z+ 298d4: 74 91 lpm r23, Z 298d6: 87 70 andi r24, 0x07 ; 7 298d8: 99 27 eor r25, r25 298da: 86 9f mul r24, r22 298dc: 90 01 movw r18, r0 298de: 87 9f mul r24, r23 298e0: 30 0d add r19, r0 298e2: 96 9f mul r25, r22 298e4: 30 0d add r19, r0 298e6: 11 24 eor r1, r1 298e8: a3 e0 ldi r26, 0x03 ; 3 298ea: 36 95 lsr r19 298ec: 27 95 ror r18 298ee: aa 95 dec r26 298f0: e1 f7 brne .-8 ; 0x298ea <__vector_17+0x10ac> 298f2: ca 01 movw r24, r20 298f4: 82 1b sub r24, r18 298f6: 93 0b sbc r25, r19 298f8: aa cf rjmp .-172 ; 0x2984e <__vector_17+0x1010> la_state = 0; nextAdvanceISR = ADV_NEVER; } else { // reset error and iterations per loop for this phase eISR_Err = current_block->advance_rate; 298fa: de 01 movw r26, r28 298fc: a3 5b subi r26, 0xB3 ; 179 298fe: bf 4f sbci r27, 0xFF ; 255 29900: 4d 91 ld r20, X+ 29902: 5c 91 ld r21, X 29904: 11 97 sbiw r26, 0x01 ; 1 29906: 70 e0 ldi r23, 0x00 ; 0 29908: 60 e0 ldi r22, 0x00 ; 0 2990a: 40 93 71 05 sts 0x0571, r20 ; 0x800571 2990e: 50 93 72 05 sts 0x0572, r21 ; 0x800572 29912: 60 93 73 05 sts 0x0573, r22 ; 0x800573 29916: 70 93 74 05 sts 0x0574, r23 ; 0x800574 e_step_loops = current_block->advance_step_loops; 2991a: 16 96 adiw r26, 0x06 ; 6 2991c: 9c 91 ld r25, X 2991e: 90 93 70 05 sts 0x0570, r25 ; 0x800570 if ((la_state & ADV_ACC_VARY) && e_extruding && (current_adv_steps > target_adv_steps)) { 29922: 98 2f mov r25, r24 29924: 92 70 andi r25, 0x02 ; 2 29926: 09 f4 brne .+2 ; 0x2992a <__vector_17+0x10ec> 29928: cb cd rjmp .-1130 ; 0x294c0 <__vector_17+0xc82> 2992a: 90 91 7f 05 lds r25, 0x057F ; 0x80057f 2992e: 99 23 and r25, r25 29930: 09 f4 brne .+2 ; 0x29934 <__vector_17+0x10f6> 29932: c6 cd rjmp .-1140 ; 0x294c0 <__vector_17+0xc82> 29934: 2e 17 cp r18, r30 29936: 3f 07 cpc r19, r31 29938: 08 f0 brcs .+2 ; 0x2993c <__vector_17+0x10fe> 2993a: c2 cd rjmp .-1148 ; 0x294c0 <__vector_17+0xc82> // LA could reverse the direction of extrusion in this phase eISR_Err += current_block->advance_rate; 2993c: 44 0f add r20, r20 2993e: 55 1f adc r21, r21 29940: 66 1f adc r22, r22 29942: 77 1f adc r23, r23 29944: 40 93 71 05 sts 0x0571, r20 ; 0x800571 29948: 50 93 72 05 sts 0x0572, r21 ; 0x800572 2994c: 60 93 73 05 sts 0x0573, r22 ; 0x800573 29950: 70 93 74 05 sts 0x0574, r23 ; 0x800574 LA_phase = 0; 29954: 10 92 90 05 sts 0x0590, r1 ; 0x800590 29958: b3 cd rjmp .-1178 ; 0x294c0 <__vector_17+0xc82> 2995a: 80 93 71 05 sts 0x0571, r24 ; 0x800571 2995e: 90 93 72 05 sts 0x0572, r25 ; 0x800572 29962: a0 93 73 05 sts 0x0573, r26 ; 0x800573 29966: b0 93 74 05 sts 0x0574, r27 ; 0x800574 while(eISR_Err >= current_block->advance_rate) { ++ticks; eISR_Err -= current_block->advance_rate; } if(!ticks) 2996a: 61 11 cpse r22, r1 2996c: 1b c0 rjmp .+54 ; 0x299a4 <__vector_17+0x1166> { eISR_Rate = timer; 2996e: f0 93 6f 05 sts 0x056F, r31 ; 0x80056f 29972: e0 93 6e 05 sts 0x056E, r30 ; 0x80056e nextAdvanceISR = timer; 29976: f0 93 e3 04 sts 0x04E3, r31 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 2997a: e0 93 e2 04 sts 0x04E2, r30 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> } } if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) { // update timers & phase for the next iteration advance_spread(main_Rate); if (LA_phase >= 0) { 2997e: 80 91 90 05 lds r24, 0x0590 ; 0x800590 29982: 87 fd sbrc r24, 7 29984: 58 c0 rjmp .+176 ; 0x29a36 <__vector_17+0x11f8> if (step_loops == e_step_loops) 29986: 80 91 98 05 lds r24, 0x0598 ; 0x800598 2998a: 10 91 70 05 lds r17, 0x0570 ; 0x800570 2998e: 28 81 ld r18, Y 29990: 39 81 ldd r19, Y+1 ; 0x01 29992: 81 13 cpse r24, r17 29994: 35 c0 rjmp .+106 ; 0x29a00 <__vector_17+0x11c2> LA_phase = (current_block->advance_rate < main_Rate); 29996: 81 e0 ldi r24, 0x01 ; 1 29998: 2e 17 cp r18, r30 2999a: 3f 07 cpc r19, r31 2999c: 08 f4 brcc .+2 ; 0x299a0 <__vector_17+0x1162> 2999e: 49 c0 rjmp .+146 ; 0x29a32 <__vector_17+0x11f4> 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); 299a0: 80 e0 ldi r24, 0x00 ; 0 299a2: 47 c0 rjmp .+142 ; 0x29a32 <__vector_17+0x11f4> eISR_Rate = timer; nextAdvanceISR = timer; return; } if (ticks <= 3) 299a4: 64 30 cpi r22, 0x04 ; 4 299a6: 28 f5 brcc .+74 ; 0x299f2 <__vector_17+0x11b4> eISR_Rate = fastdiv(timer, ticks + 1); 299a8: 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); 299aa: 63 30 cpi r22, 0x03 ; 3 299ac: a9 f0 breq .+42 ; 0x299d8 <__vector_17+0x119a> 299ae: 66 95 lsr r22 299b0: af 01 movw r20, r30 299b2: 02 c0 rjmp .+4 ; 0x299b8 <__vector_17+0x117a> 299b4: 56 95 lsr r21 299b6: 47 95 ror r20 299b8: 6a 95 dec r22 299ba: e2 f7 brpl .-8 ; 0x299b4 <__vector_17+0x1176> 299bc: 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); 299be: 70 93 6f 05 sts 0x056F, r23 ; 0x80056f 299c2: 60 93 6e 05 sts 0x056E, r22 ; 0x80056e } nextAdvanceISR = eISR_Rate; 299c6: 80 91 6e 05 lds r24, 0x056E ; 0x80056e 299ca: 90 91 6f 05 lds r25, 0x056F ; 0x80056f 299ce: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 299d2: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 299d6: d3 cf rjmp .-90 ; 0x2997e <__vector_17+0x1140> // @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; 299d8: 9f 01 movw r18, r30 299da: ab ea ldi r26, 0xAB ; 171 299dc: ba ea ldi r27, 0xAA ; 170 299de: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 299e2: 41 e1 ldi r20, 0x11 ; 17 299e4: 96 95 lsr r25 299e6: 87 95 ror r24 299e8: 77 95 ror r23 299ea: 67 95 ror r22 299ec: 4a 95 dec r20 299ee: d1 f7 brne .-12 ; 0x299e4 <__vector_17+0x11a6> 299f0: e6 cf rjmp .-52 ; 0x299be <__vector_17+0x1180> if (ticks <= 3) eISR_Rate = fastdiv(timer, ticks + 1); else { // >4 ticks are still possible on slow moves eISR_Rate = timer / (ticks + 1); 299f2: 70 e0 ldi r23, 0x00 ; 0 299f4: 6f 5f subi r22, 0xFF ; 255 299f6: 7f 4f sbci r23, 0xFF ; 255 299f8: cf 01 movw r24, r30 299fa: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 299fe: df cf rjmp .-66 ; 0x299be <__vector_17+0x1180> #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); 29a00: 83 30 cpi r24, 0x03 ; 3 29a02: 09 f4 brne .+2 ; 0x29a06 <__vector_17+0x11c8> 29a04: cf c0 rjmp .+414 ; 0x29ba4 <__vector_17+0x1366> 29a06: 86 95 lsr r24 29a08: a9 01 movw r20, r18 29a0a: 02 c0 rjmp .+4 ; 0x29a10 <__vector_17+0x11d2> 29a0c: 56 95 lsr r21 29a0e: 47 95 ror r20 29a10: 8a 95 dec r24 29a12: e2 f7 brpl .-8 ; 0x29a0c <__vector_17+0x11ce> 29a14: 13 30 cpi r17, 0x03 ; 3 29a16: 09 f4 brne .+2 ; 0x29a1a <__vector_17+0x11dc> 29a18: d3 c0 rjmp .+422 ; 0x29bc0 <__vector_17+0x1382> 29a1a: 16 95 lsr r17 29a1c: bf 01 movw r22, r30 29a1e: 02 c0 rjmp .+4 ; 0x29a24 <__vector_17+0x11e6> 29a20: 76 95 lsr r23 29a22: 67 95 ror r22 29a24: 1a 95 dec r17 29a26: e2 f7 brpl .-8 ; 0x29a20 <__vector_17+0x11e2> 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); 29a28: 81 e0 ldi r24, 0x01 ; 1 29a2a: 46 17 cp r20, r22 29a2c: 57 07 cpc r21, r23 29a2e: 08 f0 brcs .+2 ; 0x29a32 <__vector_17+0x11f4> 29a30: b7 cf rjmp .-146 ; 0x299a0 <__vector_17+0x1162> 29a32: 80 93 90 05 sts 0x0590, r24 ; 0x800590 } } // 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(); 29a36: 0f 94 f1 14 call 0x229e2 ; 0x229e2 #endif // If current block is finished, reset pointer if (step_events_completed.wide >= current_block->step_event_count.wide) { 29a3a: 40 91 7b 05 lds r20, 0x057B ; 0x80057b 29a3e: 50 91 7c 05 lds r21, 0x057C ; 0x80057c 29a42: 60 91 7d 05 lds r22, 0x057D ; 0x80057d 29a46: 70 91 7e 05 lds r23, 0x057E ; 0x80057e 29a4a: e0 91 a0 05 lds r30, 0x05A0 ; 0x8005a0 29a4e: f0 91 a1 05 lds r31, 0x05A1 ; 0x8005a1 29a52: 80 89 ldd r24, Z+16 ; 0x10 29a54: 91 89 ldd r25, Z+17 ; 0x11 29a56: a2 89 ldd r26, Z+18 ; 0x12 29a58: b3 89 ldd r27, Z+19 ; 0x13 29a5a: 48 17 cp r20, r24 29a5c: 59 07 cpc r21, r25 29a5e: 6a 07 cpc r22, r26 29a60: 7b 07 cpc r23, r27 29a62: 80 f0 brcs .+32 ; 0x29a84 <__vector_17+0x1246> current_block = NULL; 29a64: 10 92 a1 05 sts 0x05A1, r1 ; 0x8005a1 29a68: 10 92 a0 05 sts 0x05A0, r1 ; 0x8005a0 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) { 29a6c: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 29a70: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 29a74: 98 17 cp r25, r24 29a76: 31 f0 breq .+12 ; 0x29a84 <__vector_17+0x1246> block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 29a78: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 29a7c: 8f 5f subi r24, 0xFF ; 255 29a7e: 8f 70 andi r24, 0x0F ; 15 29a80: 80 93 a5 0d sts 0x0DA5, r24 ; 0x800da5 return mask; } void tmc2130_st_isr() { if (tmc2130_mode == TMC2130_MODE_SILENT || tmc2130_sg_stop_on_crash == false || tmc2130_sg_homing_axes_mask != 0) 29a84: 80 91 8b 06 lds r24, 0x068B ; 0x80068b 29a88: 81 30 cpi r24, 0x01 ; 1 29a8a: 49 f1 breq .+82 ; 0x29ade <__vector_17+0x12a0> 29a8c: 80 91 5c 02 lds r24, 0x025C ; 0x80025c 29a90: 88 23 and r24, r24 29a92: 29 f1 breq .+74 ; 0x29ade <__vector_17+0x12a0> 29a94: 80 91 42 06 lds r24, 0x0642 ; 0x800642 29a98: 81 11 cpse r24, r1 29a9a: 21 c0 rjmp .+66 ; 0x29ade <__vector_17+0x12a0> } uint8_t tmc2130_sample_diag() { uint8_t mask = 0; if (!READ(X_TMC2130_DIAG)) mask |= X_AXIS_MASK; 29a9c: 90 91 06 01 lds r25, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 29aa0: 81 e0 ldi r24, 0x01 ; 1 29aa2: 29 2f mov r18, r25 29aa4: 24 70 andi r18, 0x04 ; 4 29aa6: 92 fd sbrc r25, 2 29aa8: 80 e0 ldi r24, 0x00 ; 0 if (!READ(Y_TMC2130_DIAG)) mask |= Y_AXIS_MASK; 29aaa: 90 91 06 01 lds r25, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 29aae: 82 60 ori r24, 0x02 ; 2 29ab0: 97 ff sbrs r25, 7 29ab2: 03 c0 rjmp .+6 ; 0x29aba <__vector_17+0x127c> void tmc2130_st_isr() { if (tmc2130_mode == TMC2130_MODE_SILENT || tmc2130_sg_stop_on_crash == false || tmc2130_sg_homing_axes_mask != 0) return; uint8_t mask = tmc2130_sample_diag(); if (tmc2130_sg_stop_on_crash && mask) { 29ab4: 21 11 cpse r18, r1 29ab6: 13 c0 rjmp .+38 ; 0x29ade <__vector_17+0x12a0> 29ab8: 81 e0 ldi r24, 0x01 ; 1 tmc2130_sg_crash = mask; 29aba: 80 93 0c 05 sts 0x050C, r24 ; 0x80050c tmc2130_sg_stop_on_crash = false; 29abe: 10 92 5c 02 sts 0x025C, r1 ; 0x80025c #ifdef TMC2130 void crashdet_stop_and_save_print() { stop_and_save_print_to_ram(pause_position[Z_AXIS], -default_retraction); //XY - no change, Pause Z LIFT mm up, E -1mm retract 29ac2: 60 91 47 02 lds r22, 0x0247 ; 0x800247 <_ZL14pause_position.lto_priv.483+0x8> 29ac6: 70 91 48 02 lds r23, 0x0248 ; 0x800248 <_ZL14pause_position.lto_priv.483+0x9> 29aca: 80 91 49 02 lds r24, 0x0249 ; 0x800249 <_ZL14pause_position.lto_priv.483+0xa> 29ace: 90 91 4a 02 lds r25, 0x024A ; 0x80024a <_ZL14pause_position.lto_priv.483+0xb> 29ad2: 20 e0 ldi r18, 0x00 ; 0 29ad4: 30 e0 ldi r19, 0x00 ; 0 29ad6: 40 e8 ldi r20, 0x80 ; 128 29ad8: 5f eb ldi r21, 0xBF ; 191 29ada: 0e 94 d7 88 call 0x111ae ; 0x111ae WRITE_NC(LOGIC_ANALYZER_CH0, false); #endif } // Run the next advance isr if triggered bool eisr = !nextAdvanceISR; 29ade: 60 91 e2 04 lds r22, 0x04E2 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 29ae2: 70 91 e3 04 lds r23, 0x04E3 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> if (eisr) 29ae6: 61 15 cp r22, r1 29ae8: 71 05 cpc r23, r1 29aea: 09 f0 breq .+2 ; 0x29aee <__vector_17+0x12b0> 29aec: 46 c0 rjmp .+140 ; 0x29b7a <__vector_17+0x133c> #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) { 29aee: 40 91 de 04 lds r20, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29af2: 50 91 df 04 lds r21, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29af6: 20 91 92 05 lds r18, 0x0592 ; 0x800592 29afa: 30 91 93 05 lds r19, 0x0593 ; 0x800593 29afe: 80 91 91 05 lds r24, 0x0591 ; 0x800591 29b02: 24 17 cp r18, r20 29b04: 35 07 cpc r19, r21 29b06: 08 f0 brcs .+2 ; 0x29b0a <__vector_17+0x12cc> 29b08: 6c c0 rjmp .+216 ; 0x29be2 <__vector_17+0x13a4> // decompression if (e_step_loops != 1) { 29b0a: 90 91 70 05 lds r25, 0x0570 ; 0x800570 29b0e: 91 30 cpi r25, 0x01 ; 1 29b10: 41 f0 breq .+16 ; 0x29b22 <__vector_17+0x12e4> uint16_t d_steps = current_adv_steps - target_adv_steps; 29b12: 42 1b sub r20, r18 29b14: 53 0b sbc r21, r19 if (d_steps < e_step_loops) 29b16: 94 17 cp r25, r20 29b18: 15 06 cpc r1, r21 29b1a: 19 f0 breq .+6 ; 0x29b22 <__vector_17+0x12e4> 29b1c: 10 f0 brcs .+4 ; 0x29b22 <__vector_17+0x12e4> e_step_loops = d_steps; 29b1e: 40 93 70 05 sts 0x0570, r20 ; 0x800570 } e_steps -= e_step_loops; 29b22: 90 91 70 05 lds r25, 0x0570 ; 0x800570 29b26: 89 1b sub r24, r25 29b28: 80 93 91 05 sts 0x0591, r24 ; 0x800591 if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 29b2c: 88 23 and r24, r24 29b2e: 39 f0 breq .+14 ; 0x29b3e <__vector_17+0x1300> 29b30: 87 fd sbrc r24, 7 29b32: 53 c0 rjmp .+166 ; 0x29bda <__vector_17+0x139c> 29b34: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 29b38: 80 64 ori r24, 0x40 ; 64 29b3a: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> current_adv_steps -= e_step_loops; 29b3e: 20 91 70 05 lds r18, 0x0570 ; 0x800570 29b42: 80 91 de 04 lds r24, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29b46: 90 91 df 04 lds r25, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29b4a: 82 1b sub r24, r18 29b4c: 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; 29b4e: 90 93 df 04 sts 0x04DF, r25 ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29b52: 80 93 de 04 sts 0x04DE, r24 ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> } if (current_adv_steps == target_adv_steps) { 29b56: 20 91 de 04 lds r18, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29b5a: 30 91 df 04 lds r19, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29b5e: 80 91 92 05 lds r24, 0x0592 ; 0x800592 29b62: 90 91 93 05 lds r25, 0x0593 ; 0x800593 29b66: 28 17 cp r18, r24 29b68: 39 07 cpc r19, r25 29b6a: 09 f0 breq .+2 ; 0x29b6e <__vector_17+0x1330> 29b6c: 66 c0 rjmp .+204 ; 0x29c3a <__vector_17+0x13fc> // advance steps completed nextAdvanceISR = ADV_NEVER; 29b6e: 8f ef ldi r24, 0xFF ; 255 29b70: 9f ef ldi r25, 0xFF ; 255 } else { // schedule another tick nextAdvanceISR = eISR_Rate; 29b72: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 29b76: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif } // Tick E steps if any if (e_steps && (LA_phase < 0 || LA_phase == eisr)) { 29b7a: 40 91 91 05 lds r20, 0x0591 ; 0x800591 29b7e: 41 11 cpse r20, r1 29b80: 61 c0 rjmp .+194 ; 0x29c44 <__vector_17+0x1406> 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) 29b82: 80 91 e2 04 lds r24, 0x04E2 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> 29b86: 90 91 e3 04 lds r25, 0x04E3 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 29b8a: 20 91 e4 04 lds r18, 0x04E4 ; 0x8004e4 <_ZL11nextMainISR.lto_priv.478> 29b8e: 30 91 e5 04 lds r19, 0x04E5 ; 0x8004e5 <_ZL11nextMainISR.lto_priv.478+0x1> 29b92: 8f 3f cpi r24, 0xFF ; 255 29b94: 98 07 cpc r25, r24 29b96: 09 f0 breq .+2 ; 0x29b9a <__vector_17+0x135c> 29b98: 98 c0 rjmp .+304 ; 0x29cca <__vector_17+0x148c> OCR1A = nextAdvanceISR; else OCR1A = nextMainISR; 29b9a: 30 93 89 00 sts 0x0089, r19 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 29b9e: 20 93 88 00 sts 0x0088, r18 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 29ba2: 9e c0 rjmp .+316 ; 0x29ce0 <__vector_17+0x14a2> // @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; 29ba4: ab ea ldi r26, 0xAB ; 171 29ba6: ba ea ldi r27, 0xAA ; 170 29ba8: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 29bac: ab 01 movw r20, r22 29bae: bc 01 movw r22, r24 29bb0: 31 e1 ldi r19, 0x11 ; 17 29bb2: 76 95 lsr r23 29bb4: 67 95 ror r22 29bb6: 57 95 ror r21 29bb8: 47 95 ror r20 29bba: 3a 95 dec r19 29bbc: d1 f7 brne .-12 ; 0x29bb2 <__vector_17+0x1374> 29bbe: 2a cf rjmp .-428 ; 0x29a14 <__vector_17+0x11d6> 29bc0: 9f 01 movw r18, r30 29bc2: ab ea ldi r26, 0xAB ; 171 29bc4: ba ea ldi r27, 0xAA ; 170 29bc6: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 29bca: 21 e1 ldi r18, 0x11 ; 17 29bcc: 96 95 lsr r25 29bce: 87 95 ror r24 29bd0: 77 95 ror r23 29bd2: 67 95 ror r22 29bd4: 2a 95 dec r18 29bd6: d1 f7 brne .-12 ; 0x29bcc <__vector_17+0x138e> 29bd8: 27 cf rjmp .-434 ; 0x29a28 <__vector_17+0x11ea> 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); 29bda: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 29bde: 8f 7b andi r24, 0xBF ; 191 29be0: ac cf rjmp .-168 ; 0x29b3a <__vector_17+0x12fc> current_adv_steps -= e_step_loops; } else if (current_adv_steps < target_adv_steps) { 29be2: 42 17 cp r20, r18 29be4: 53 07 cpc r21, r19 29be6: 08 f0 brcs .+2 ; 0x29bea <__vector_17+0x13ac> 29be8: b6 cf rjmp .-148 ; 0x29b56 <__vector_17+0x1318> // compression if (e_step_loops != 1) { 29bea: 90 91 70 05 lds r25, 0x0570 ; 0x800570 29bee: 91 30 cpi r25, 0x01 ; 1 29bf0: 41 f0 breq .+16 ; 0x29c02 <__vector_17+0x13c4> uint16_t d_steps = target_adv_steps - current_adv_steps; 29bf2: 24 1b sub r18, r20 29bf4: 35 0b sbc r19, r21 if (d_steps < e_step_loops) 29bf6: 92 17 cp r25, r18 29bf8: 13 06 cpc r1, r19 29bfa: 19 f0 breq .+6 ; 0x29c02 <__vector_17+0x13c4> 29bfc: 10 f0 brcs .+4 ; 0x29c02 <__vector_17+0x13c4> e_step_loops = d_steps; 29bfe: 20 93 70 05 sts 0x0570, r18 ; 0x800570 } e_steps += e_step_loops; 29c02: 90 91 70 05 lds r25, 0x0570 ; 0x800570 29c06: 89 0f add r24, r25 29c08: 80 93 91 05 sts 0x0591, r24 ; 0x800591 if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR); 29c0c: 88 23 and r24, r24 29c0e: 39 f0 breq .+14 ; 0x29c1e <__vector_17+0x13e0> 29c10: 87 fd sbrc r24, 7 29c12: 0f c0 rjmp .+30 ; 0x29c32 <__vector_17+0x13f4> 29c14: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 29c18: 80 64 ori r24, 0x40 ; 64 29c1a: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> current_adv_steps += e_step_loops; 29c1e: 80 91 70 05 lds r24, 0x0570 ; 0x800570 29c22: 20 91 de 04 lds r18, 0x04DE ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> 29c26: 30 91 df 04 lds r19, 0x04DF ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 29c2a: 82 0f add r24, r18 29c2c: 93 2f mov r25, r19 29c2e: 91 1d adc r25, r1 29c30: 8e cf rjmp .-228 ; 0x29b4e <__vector_17+0x1310> 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); 29c32: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 29c36: 8f 7b andi r24, 0xBF ; 191 29c38: f0 cf rjmp .-32 ; 0x29c1a <__vector_17+0x13dc> // advance steps completed nextAdvanceISR = ADV_NEVER; } else { // schedule another tick nextAdvanceISR = eISR_Rate; 29c3a: 80 91 6e 05 lds r24, 0x056E ; 0x80056e 29c3e: 90 91 6f 05 lds r25, 0x056F ; 0x80056f 29c42: 97 cf rjmp .-210 ; 0x29b72 <__vector_17+0x1334> WRITE_NC(LOGIC_ANALYZER_CH1, false); #endif } // Tick E steps if any if (e_steps && (LA_phase < 0 || LA_phase == eisr)) { 29c44: 80 91 90 05 lds r24, 0x0590 ; 0x800590 29c48: 87 fd sbrc r24, 7 29c4a: 0e c0 rjmp .+28 ; 0x29c68 <__vector_17+0x142a> 29c4c: 08 2e mov r0, r24 29c4e: 00 0c add r0, r0 29c50: 99 0b sbc r25, r25 WRITE_NC(LOGIC_ANALYZER_CH0, false); #endif } // Run the next advance isr if triggered bool eisr = !nextAdvanceISR; 29c52: 21 e0 ldi r18, 0x01 ; 1 29c54: 30 e0 ldi r19, 0x00 ; 0 29c56: 61 15 cp r22, r1 29c58: 71 05 cpc r23, r1 29c5a: 11 f0 breq .+4 ; 0x29c60 <__vector_17+0x1422> 29c5c: 30 e0 ldi r19, 0x00 ; 0 29c5e: 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)) { 29c60: 82 17 cp r24, r18 29c62: 93 07 cpc r25, r19 29c64: 09 f0 breq .+2 ; 0x29c68 <__vector_17+0x142a> 29c66: 8d cf rjmp .-230 ; 0x29b82 <__vector_17+0x1344> uint8_t max_ticks = (eisr? e_step_loops: step_loops); 29c68: 20 91 70 05 lds r18, 0x0570 ; 0x800570 29c6c: 67 2b or r22, r23 29c6e: 11 f0 breq .+4 ; 0x29c74 <__vector_17+0x1436> 29c70: 20 91 98 05 lds r18, 0x0598 ; 0x800598 max_ticks = min(abs(e_steps), max_ticks); 29c74: 84 2f mov r24, r20 29c76: 04 2e mov r0, r20 29c78: 00 0c add r0, r0 29c7a: 99 0b sbc r25, r25 29c7c: 97 ff sbrs r25, 7 29c7e: 03 c0 rjmp .+6 ; 0x29c86 <__vector_17+0x1448> 29c80: 91 95 neg r25 29c82: 81 95 neg r24 29c84: 91 09 sbc r25, r1 29c86: 30 e0 ldi r19, 0x00 ; 0 29c88: 28 17 cp r18, r24 29c8a: 39 07 cpc r19, r25 29c8c: 0c f4 brge .+2 ; 0x29c90 <__vector_17+0x1452> 29c8e: c9 01 movw r24, r18 29c90: 47 ff sbrs r20, 7 29c92: 17 c0 rjmp .+46 ; 0x29cc2 <__vector_17+0x1484> 29c94: 61 e0 ldi r22, 0x01 ; 1 29c96: 4f ef ldi r20, 0xFF ; 255 29c98: 5f ef ldi r21, 0xFF ; 255 bool rev = (e_steps < 0); do { STEP_NC_HI(E_AXIS); 29c9a: 78 e0 ldi r23, 0x08 ; 8 29c9c: 76 b9 out 0x06, r23 ; 6 e_steps += (rev? 1: -1); 29c9e: 90 91 91 05 lds r25, 0x0591 ; 0x800591 29ca2: 96 0f add r25, r22 29ca4: 90 93 91 05 sts 0x0591, r25 ; 0x800591 void setJamDetectionEnabled(bool state, bool updateEEPROM = false); bool getJamDetectionEnabled() const { return jamDetection; } void stStep(bool rev) { //from stepper isr stepCount += rev ? -1 : 1; 29ca8: 20 91 ba 17 lds r18, 0x17BA ; 0x8017ba 29cac: 30 91 bb 17 lds r19, 0x17BB ; 0x8017bb 29cb0: 24 0f add r18, r20 29cb2: 35 1f adc r19, r21 29cb4: 30 93 bb 17 sts 0x17BB, r19 ; 0x8017bb 29cb8: 20 93 ba 17 sts 0x17BA, r18 ; 0x8017ba STEP_NC_LO(E_AXIS); #if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) fsensor.stStep(rev); #endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) } while(--max_ticks); 29cbc: 81 50 subi r24, 0x01 ; 1 29cbe: 71 f7 brne .-36 ; 0x29c9c <__vector_17+0x145e> 29cc0: 60 cf rjmp .-320 ; 0x29b82 <__vector_17+0x1344> 29cc2: 6f ef ldi r22, 0xFF ; 255 29cc4: 41 e0 ldi r20, 0x01 ; 1 29cc6: 50 e0 ldi r21, 0x00 ; 0 29cc8: e8 cf rjmp .-48 ; 0x29c9a <__vector_17+0x145c> } // 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) 29cca: ac 01 movw r20, r24 29ccc: 48 5d subi r20, 0xD8 ; 216 29cce: 5f 4f sbci r21, 0xFF ; 255 29cd0: 42 17 cp r20, r18 29cd2: 53 07 cpc r21, r19 29cd4: 08 f0 brcs .+2 ; 0x29cd8 <__vector_17+0x149a> 29cd6: 61 cf rjmp .-318 ; 0x29b9a <__vector_17+0x135c> OCR1A = nextAdvanceISR; 29cd8: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 29cdc: 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) { 29ce0: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> 29ce4: 30 91 89 00 lds r19, 0x0089 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 29ce8: 80 91 84 00 lds r24, 0x0084 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> 29cec: 90 91 85 00 lds r25, 0x0085 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 29cf0: 40 96 adiw r24, 0x10 ; 16 29cf2: 28 17 cp r18, r24 29cf4: 39 07 cpc r19, r25 29cf6: 48 f4 brcc .+18 ; 0x29d0a <__vector_17+0x14cc> // 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; 29cf8: 80 91 84 00 lds r24, 0x0084 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084> 29cfc: 90 91 85 00 lds r25, 0x0085 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085> 29d00: 40 96 adiw r24, 0x10 ; 16 29d02: 90 93 89 00 sts 0x0089, r25 ; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089> 29d06: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088> } } 29d0a: ff 91 pop r31 29d0c: ef 91 pop r30 29d0e: df 91 pop r29 29d10: cf 91 pop r28 29d12: bf 91 pop r27 29d14: af 91 pop r26 29d16: 9f 91 pop r25 29d18: 8f 91 pop r24 29d1a: 7f 91 pop r23 29d1c: 6f 91 pop r22 29d1e: 5f 91 pop r21 29d20: 4f 91 pop r20 29d22: 3f 91 pop r19 29d24: 2f 91 pop r18 29d26: 1f 91 pop r17 29d28: 0f 91 pop r16 29d2a: ff 90 pop r15 29d2c: ef 90 pop r14 29d2e: df 90 pop r13 29d30: cf 90 pop r12 29d32: 8f 90 pop r8 29d34: 7f 90 pop r7 29d36: 6f 90 pop r6 29d38: 0f 90 pop r0 29d3a: 0b be out 0x3b, r0 ; 59 29d3c: 0f 90 pop r0 29d3e: 0f be out 0x3f, r0 ; 63 29d40: 0f 90 pop r0 29d42: 1f 90 pop r1 29d44: 18 95 reti 00029d46 : return old; } bool enable_z_endstop(bool check) { bool old = check_z_endstop; 29d46: 90 91 77 05 lds r25, 0x0577 ; 0x800577 check_z_endstop = check; 29d4a: 80 93 77 05 sts 0x0577, r24 ; 0x800577 CRITICAL_SECTION_START; 29d4e: 2f b7 in r18, 0x3f ; 63 29d50: f8 94 cli endstop_hit &= ~_BV(Z_AXIS); 29d52: 80 91 0a 05 lds r24, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> 29d56: 8b 7f andi r24, 0xFB ; 251 29d58: 80 93 0a 05 sts 0x050A, r24 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> CRITICAL_SECTION_END; 29d5c: 2f bf out 0x3f, r18 ; 63 return old; } 29d5e: 89 2f mov r24, r25 29d60: 08 95 ret 00029d62 : return old; } bool endstop_z_hit_on_purpose() { bool hit = endstop_hit & _BV(Z_AXIS); 29d62: 80 91 0a 05 lds r24, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> CRITICAL_SECTION_START; 29d66: 2f b7 in r18, 0x3f ; 63 29d68: f8 94 cli endstop_hit &= ~_BV(Z_AXIS); 29d6a: 90 91 0a 05 lds r25, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> 29d6e: 9b 7f andi r25, 0xFB ; 251 29d70: 90 93 0a 05 sts 0x050A, r25 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> CRITICAL_SECTION_END; 29d74: 2f bf out 0x3f, r18 ; 63 return hit; } 29d76: 82 fb bst r24, 2 29d78: 88 27 eor r24, r24 29d7a: 80 f9 bld r24, 0 29d7c: 08 95 ret 00029d7e : } } bool endstops_hit_on_purpose() { uint8_t old = endstop_hit; 29d7e: 90 91 0a 05 lds r25, 0x050A ; 0x80050a <_ZL11endstop_hit.lto_priv.482> endstop_hit = 0; 29d82: 10 92 0a 05 sts 0x050A, r1 ; 0x80050a <_ZL11endstop_hit.lto_priv.482> return old; 29d86: 81 e0 ldi r24, 0x01 ; 1 29d88: 91 11 cpse r25, r1 29d8a: 01 c0 rjmp .+2 ; 0x29d8e 29d8c: 80 e0 ldi r24, 0x00 ; 0 } 29d8e: 08 95 ret 00029d90 : } } void Sound_MakeSound(eSOUND_TYPE eSoundType) { switch(eSoundMode) 29d90: 90 91 dd 04 lds r25, 0x04DD ; 0x8004dd 29d94: 91 30 cpi r25, 0x01 ; 1 29d96: a1 f0 breq .+40 ; 0x29dc0 29d98: 28 f0 brcs .+10 ; 0x29da4 29d9a: 92 30 cpi r25, 0x02 ; 2 29d9c: a9 f0 breq .+42 ; 0x29dc8 29d9e: 93 30 cpi r25, 0x03 ; 3 29da0: c1 f0 breq .+48 ; 0x29dd2 29da2: 08 95 ret { case e_SOUND_MODE_LOUD: if(eSoundType==e_SOUND_TYPE_ButtonEcho) 29da4: 81 11 cpse r24, r1 29da6: 02 c0 rjmp .+4 ; 0x29dac 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(); 29da8: 0d 94 59 15 jmp 0x22ab2 ; 0x22ab2 switch(eSoundMode) { case e_SOUND_MODE_LOUD: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 29dac: 82 30 cpi r24, 0x02 ; 2 29dae: 11 f4 brne .+4 ; 0x29db4 break; case e_SOUND_MODE_BLIND: if(eSoundType==e_SOUND_TYPE_ButtonEcho) Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) Sound_DoSound_Prompt(); 29db0: 0d 94 4b 20 jmp 0x24096 ; 0x24096 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) 29db4: 85 30 cpi r24, 0x05 ; 5 29db6: 09 f0 breq .+2 ; 0x29dba 29db8: 50 c0 rjmp .+160 ; 0x29e5a Sound_DoSound_Alert(false); 29dba: 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); 29dbc: 0d 94 37 15 jmp 0x22a6e ; 0x22a6e 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) 29dc0: 88 23 and r24, r24 29dc2: 91 f3 breq .-28 ; 0x29da8 Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 29dc4: 82 30 cpi r24, 0x02 ; 2 29dc6: a1 f3 breq .-24 ; 0x29db0 Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) 29dc8: 85 30 cpi r24, 0x05 ; 5 29dca: 09 f0 breq .+2 ; 0x29dce 29dcc: 46 c0 rjmp .+140 ; 0x29e5a Sound_DoSound_Alert(true); 29dce: 81 e0 ldi r24, 0x01 ; 1 29dd0: f5 cf rjmp .-22 ; 0x29dbc 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) 29dd2: 88 23 and r24, r24 29dd4: 49 f3 breq .-46 ; 0x29da8 Sound_DoSound_Echo(); if(eSoundType==e_SOUND_TYPE_StandardPrompt) 29dd6: 82 30 cpi r24, 0x02 ; 2 29dd8: 59 f3 breq .-42 ; 0x29db0 Sound_DoSound_Prompt(); if(eSoundType==e_SOUND_TYPE_StandardAlert) 29dda: 85 30 cpi r24, 0x05 ; 5 29ddc: 71 f3 breq .-36 ; 0x29dba Sound_DoSound_Alert(false); if(eSoundType==e_SOUND_TYPE_EncoderMove) 29dde: 86 30 cpi r24, 0x06 ; 6 29de0: e1 f4 brne .+56 ; 0x29e1a 29de2: 85 e0 ldi r24, 0x05 ; 5 29de4: 27 e2 ldi r18, 0x27 ; 39 29de6: 31 e0 ldi r19, 0x01 ; 1 { uint8_t nI; for(nI=0;nI<5;nI++) { WRITE(BEEPER,HIGH); 29de8: 4f b7 in r20, 0x3f ; 63 29dea: f8 94 cli 29dec: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29df0: 94 60 ori r25, 0x04 ; 4 29df2: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29df6: 4f bf out 0x3f, r20 ; 63 29df8: f9 01 movw r30, r18 29dfa: 31 97 sbiw r30, 0x01 ; 1 29dfc: f1 f7 brne .-4 ; 0x29dfa delayMicroseconds(75); WRITE(BEEPER,LOW); 29dfe: 4f b7 in r20, 0x3f ; 63 29e00: f8 94 cli 29e02: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e06: 9b 7f andi r25, 0xFB ; 251 29e08: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e0c: 4f bf out 0x3f, r20 ; 63 29e0e: f9 01 movw r30, r18 29e10: 31 97 sbiw r30, 0x01 ; 1 29e12: f1 f7 brne .-4 ; 0x29e10 29e14: 81 50 subi r24, 0x01 ; 1 static void Sound_DoSound_Encoder_Move(void) { uint8_t nI; for(nI=0;nI<5;nI++) 29e16: 41 f7 brne .-48 ; 0x29de8 29e18: 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) 29e1a: 87 30 cpi r24, 0x07 ; 7 29e1c: f1 f4 brne .+60 ; 0x29e5a } } static void Sound_DoSound_Blind_Alert(void) { backlight_wake(1); 29e1e: 81 e0 ldi r24, 0x01 ; 1 29e20: 0e 94 0d 8a call 0x1141a ; 0x1141a 29e24: 84 e1 ldi r24, 0x14 ; 20 29e26: 23 e7 ldi r18, 0x73 ; 115 29e28: 31 e0 ldi r19, 0x01 ; 1 uint8_t nI; for(nI=0; nI<20; nI++) { WRITE(BEEPER,HIGH); 29e2a: 4f b7 in r20, 0x3f ; 63 29e2c: f8 94 cli 29e2e: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e32: 94 60 ori r25, 0x04 ; 4 29e34: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e38: 4f bf out 0x3f, r20 ; 63 29e3a: f9 01 movw r30, r18 29e3c: 31 97 sbiw r30, 0x01 ; 1 29e3e: f1 f7 brne .-4 ; 0x29e3c delayMicroseconds(94); WRITE(BEEPER,LOW); 29e40: 4f b7 in r20, 0x3f ; 63 29e42: f8 94 cli 29e44: 90 91 02 01 lds r25, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e48: 9b 7f andi r25, 0xFB ; 251 29e4a: 90 93 02 01 sts 0x0102, r25 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 29e4e: 4f bf out 0x3f, r20 ; 63 29e50: f9 01 movw r30, r18 29e52: 31 97 sbiw r30, 0x01 ; 1 29e54: f1 f7 brne .-4 ; 0x29e52 29e56: 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++) 29e58: 41 f7 brne .-48 ; 0x29e2a Sound_DoSound_Blind_Alert(); break; default: break; } } 29e5a: 08 95 ret 00029e5c : //! @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 ) { 29e5c: 2f 92 push r2 29e5e: 3f 92 push r3 29e60: 4f 92 push r4 29e62: 5f 92 push r5 29e64: 6f 92 push r6 29e66: 7f 92 push r7 29e68: 8f 92 push r8 29e6a: 9f 92 push r9 29e6c: af 92 push r10 29e6e: bf 92 push r11 29e70: cf 92 push r12 29e72: df 92 push r13 29e74: ef 92 push r14 29e76: ff 92 push r15 29e78: 0f 93 push r16 29e7a: 1f 93 push r17 29e7c: cf 93 push r28 29e7e: df 93 push r29 29e80: 00 d0 rcall .+0 ; 0x29e82 29e82: 00 d0 rcall .+0 ; 0x29e84 29e84: cd b7 in r28, 0x3d ; 61 29e86: de b7 in r29, 0x3e ; 62 29e88: 5c 01 movw r10, r24 29e8a: 6c 83 std Y+4, r22 ; 0x04 29e8c: 34 2e mov r3, r20 29e8e: 3b 83 std Y+3, r19 ; 0x03 29e90: 2a 83 std Y+2, r18 ; 0x02 29e92: 48 01 movw r8, r16 29e94: 2c 2c mov r2, r12 const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL; 29e96: 00 97 sbiw r24, 0x00 ; 0 29e98: 09 f0 breq .+2 ; 0x29e9c 29e9a: 51 c0 rjmp .+162 ; 0x29f3e 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); 29e9c: 87 01 movw r16, r14 29e9e: 22 2d mov r18, r2 29ea0: a4 01 movw r20, r8 29ea2: 6a 81 ldd r22, Y+2 ; 0x02 29ea4: 7b 81 ldd r23, Y+3 ; 0x03 29ea6: 83 2d mov r24, r3 29ea8: 0f 94 6f 20 call 0x240de ; 0x240de 29eac: d1 2c mov r13, r1 29eae: c1 2c mov r12, r1 } // Wait for user confirmation or a timeout. unsigned long previous_millis_cmd = _millis(); 29eb0: 0f 94 28 2a call 0x25450 ; 0x25450 29eb4: 2b 01 movw r4, r22 29eb6: 3c 01 movw r6, r24 lcd_consume_click(); 29eb8: 0e 94 90 70 call 0xe120 ; 0xe120 KEEPALIVE_STATE(PAUSED_FOR_USER); 29ebc: 84 e0 ldi r24, 0x04 ; 4 29ebe: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be 29ec2: de 82 std Y+6, r13 ; 0x06 29ec4: cd 82 std Y+5, r12 ; 0x05 29ec6: 24 e6 ldi r18, 0x64 ; 100 29ec8: 29 83 std Y+1, r18 ; 0x01 for (;;) { for (uint8_t i = 0; i < 100; ++i) { delay_keep_alive(50); 29eca: 82 e3 ldi r24, 0x32 ; 50 29ecc: 90 e0 ldi r25, 0x00 ; 0 29ece: 0e 94 84 8c call 0x11908 ; 0x11908 if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) { 29ed2: 3c 81 ldd r19, Y+4 ; 0x04 29ed4: 31 11 cpse r19, r1 29ed6: 3a c0 rjmp .+116 ; 0x29f4c current_selection = LCD_BUTTON_TIMEOUT; goto exit; } if (lcd_encoder) { 29ed8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 29edc: 90 91 70 06 lds r25, 0x0670 ; 0x800670 29ee0: 00 97 sbiw r24, 0x00 ; 0 29ee2: 09 f0 breq .+2 ; 0x29ee6 29ee4: 42 c0 rjmp .+132 ; 0x29f6a } else { Sound_MakeSound(e_SOUND_TYPE_BlindAlert); break; // turning knob skips waiting loop } } if (lcd_clicked()) { 29ee6: 0e 94 95 70 call 0xe12a ; 0xe12a 29eea: 88 23 and r24, r24 29eec: 09 f4 brne .+2 ; 0x29ef0 29eee: 67 c0 rjmp .+206 ; 0x29fbe if (msg_next == NULL) { 29ef0: 8d 81 ldd r24, Y+5 ; 0x05 29ef2: 9e 81 ldd r25, Y+6 ; 0x06 29ef4: 89 2b or r24, r25 29ef6: 09 f0 breq .+2 ; 0x29efa 29ef8: 5e c0 rjmp .+188 ; 0x29fb6 if (msg_next == NULL) { lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); } } exit: KEEPALIVE_STATE(IN_HANDLER); 29efa: 82 e0 ldi r24, 0x02 ; 2 29efc: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be // 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; 29f00: 91 e0 ldi r25, 0x01 ; 1 29f02: 90 93 6e 02 sts 0x026E, r25 ; 0x80026e lcd_draw_update = 2; 29f06: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d return current_selection; } 29f0a: 83 2d mov r24, r3 29f0c: 26 96 adiw r28, 0x06 ; 6 29f0e: 0f b6 in r0, 0x3f ; 63 29f10: f8 94 cli 29f12: de bf out 0x3e, r29 ; 62 29f14: 0f be out 0x3f, r0 ; 63 29f16: cd bf out 0x3d, r28 ; 61 29f18: df 91 pop r29 29f1a: cf 91 pop r28 29f1c: 1f 91 pop r17 29f1e: 0f 91 pop r16 29f20: ff 90 pop r15 29f22: ef 90 pop r14 29f24: df 90 pop r13 29f26: cf 90 pop r12 29f28: bf 90 pop r11 29f2a: af 90 pop r10 29f2c: 9f 90 pop r9 29f2e: 8f 90 pop r8 29f30: 7f 90 pop r7 29f32: 6f 90 pop r6 29f34: 5f 90 pop r5 29f36: 4f 90 pop r4 29f38: 3f 90 pop r3 29f3a: 2f 90 pop r2 29f3c: 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; 29f3e: 0f 94 c0 20 call 0x24180 ; 0x24180 29f42: 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) { 29f44: 89 2b or r24, r25 29f46: 09 f0 breq .+2 ; 0x29f4a 29f48: b3 cf rjmp .-154 ; 0x29eb0 29f4a: a8 cf rjmp .-176 ; 0x29e9c 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) { 29f4c: 0f 94 28 2a call 0x25450 ; 0x25450 29f50: 64 19 sub r22, r4 29f52: 75 09 sbc r23, r5 29f54: 86 09 sbc r24, r6 29f56: 97 09 sbc r25, r7 29f58: 61 33 cpi r22, 0x31 ; 49 29f5a: 75 47 sbci r23, 0x75 ; 117 29f5c: 81 05 cpc r24, r1 29f5e: 91 05 cpc r25, r1 29f60: 08 f4 brcc .+2 ; 0x29f64 29f62: ba cf rjmp .-140 ; 0x29ed8 current_selection = LCD_BUTTON_TIMEOUT; 29f64: 33 24 eor r3, r3 29f66: 3a 94 dec r3 29f68: c8 cf rjmp .-112 ; 0x29efa goto exit; } if (lcd_encoder) { if (msg_next == NULL) { 29f6a: 2d 81 ldd r18, Y+5 ; 0x05 29f6c: 3e 81 ldd r19, Y+6 ; 0x06 29f6e: 23 2b or r18, r19 29f70: f9 f4 brne .+62 ; 0x29fb0 if (third_choice) { // third_choice is not nullptr, safe to dereference 29f72: e1 14 cp r14, r1 29f74: f1 04 cpc r15, r1 29f76: b1 f0 breq .+44 ; 0x29fa4 if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 29f78: 97 ff sbrs r25, 7 29f7a: 0f c0 rjmp .+30 ; 0x29f9a 29f7c: 31 10 cpse r3, r1 // Rotating knob counter clockwise current_selection--; 29f7e: 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); 29f80: 87 01 movw r16, r14 29f82: 22 2d mov r18, r2 29f84: a4 01 movw r20, r8 29f86: 6a 81 ldd r22, Y+2 ; 0x02 29f88: 7b 81 ldd r23, Y+3 ; 0x03 29f8a: 83 2d mov r24, r3 29f8c: 0f 94 6f 20 call 0x240de ; 0x240de lcd_encoder = 0; 29f90: 10 92 70 06 sts 0x0670, r1 ; 0x800670 29f94: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f 29f98: a6 cf rjmp .-180 ; 0x29ee6 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) { 29f9a: 32 e0 ldi r19, 0x02 ; 2 29f9c: 33 16 cp r3, r19 29f9e: 81 f3 breq .-32 ; 0x29f80 // Rotating knob clockwise current_selection++; 29fa0: 33 94 inc r3 29fa2: ee cf rjmp .-36 ; 0x29f80 } } else { if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 29fa4: 39 2e mov r3, r25 29fa6: 30 94 com r3 29fa8: 33 1c adc r3, r3 29faa: 33 24 eor r3, r3 29fac: 33 1c adc r3, r3 29fae: e8 cf rjmp .-48 ; 0x29f80 } } 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); 29fb0: 87 e0 ldi r24, 0x07 ; 7 29fb2: 0f 94 c8 4e call 0x29d90 ; 0x29d90 goto exit; } else break; } } if (multi_screen) { 29fb6: c1 14 cp r12, r1 29fb8: d1 04 cpc r13, r1 29fba: 79 f4 brne .+30 ; 0x29fda 29fbc: 84 cf rjmp .-248 ; 0x29ec6 29fbe: 99 81 ldd r25, Y+1 ; 0x01 29fc0: 91 50 subi r25, 0x01 ; 1 29fc2: 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) { 29fc4: 91 11 cpse r25, r1 29fc6: 81 cf rjmp .-254 ; 0x29eca goto exit; } else break; } } if (multi_screen) { 29fc8: c1 14 cp r12, r1 29fca: d1 04 cpc r13, r1 29fcc: 61 f0 breq .+24 ; 0x29fe6 if (msg_next == NULL) { 29fce: 2d 81 ldd r18, Y+5 ; 0x05 29fd0: 3e 81 ldd r19, Y+6 ; 0x06 29fd2: 23 2b or r18, r19 29fd4: 11 f4 brne .+4 ; 0x29fda 29fd6: be 82 std Y+6, r11 ; 0x06 29fd8: ad 82 std Y+5, r10 ; 0x05 msg_next = msg; } msg_next = lcd_display_message_fullscreen_P(msg_next); 29fda: 8d 81 ldd r24, Y+5 ; 0x05 29fdc: 9e 81 ldd r25, Y+6 ; 0x06 29fde: 0f 94 c0 20 call 0x24180 ; 0x24180 29fe2: 9e 83 std Y+6, r25 ; 0x06 29fe4: 8d 83 std Y+5, r24 ; 0x05 } if (msg_next == NULL) { 29fe6: 8d 81 ldd r24, Y+5 ; 0x05 29fe8: 9e 81 ldd r25, Y+6 ; 0x06 29fea: 89 2b or r24, r25 29fec: 09 f0 breq .+2 ; 0x29ff0 29fee: 6b cf rjmp .-298 ; 0x29ec6 lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice); 29ff0: 87 01 movw r16, r14 29ff2: 22 2d mov r18, r2 29ff4: a4 01 movw r20, r8 29ff6: 6a 81 ldd r22, Y+2 ; 0x02 29ff8: 7b 81 ldd r23, Y+3 ; 0x03 29ffa: 83 2d mov r24, r3 29ffc: 0f 94 6f 20 call 0x240de ; 0x240de 2a000: 62 cf rjmp .-316 ; 0x29ec6 0002a002 : //! @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) { 2a002: bf 92 push r11 2a004: cf 92 push r12 2a006: df 92 push r13 2a008: ef 92 push r14 2a00a: ff 92 push r15 2a00c: 0f 93 push r16 2a00e: 1f 93 push r17 2a010: cf 93 push r28 2a012: df 93 push r29 2a014: ec 01 movw r28, r24 2a016: d6 2e mov r13, r22 2a018: 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); 2a01a: 8f e6 ldi r24, 0x6F ; 111 2a01c: 9b e3 ldi r25, 0x3B ; 59 2a01e: 0e 94 44 72 call 0xe488 ; 0xe488 2a022: 8c 01 movw r16, r24 2a024: 80 e3 ldi r24, 0x30 ; 48 2a026: 93 e4 ldi r25, 0x43 ; 67 2a028: 0e 94 44 72 call 0xe488 ; 0xe488 2a02c: 2a e0 ldi r18, 0x0A ; 10 2a02e: c2 2e mov r12, r18 2a030: f1 2c mov r15, r1 2a032: e1 2c mov r14, r1 2a034: 9c 01 movw r18, r24 2a036: 4b 2d mov r20, r11 2a038: 6d 2d mov r22, r13 2a03a: ce 01 movw r24, r28 2a03c: 0f 94 2e 4f call 0x29e5c ; 0x29e5c } 2a040: df 91 pop r29 2a042: cf 91 pop r28 2a044: 1f 91 pop r17 2a046: 0f 91 pop r16 2a048: ff 90 pop r15 2a04a: ef 90 pop r14 2a04c: df 90 pop r13 2a04e: cf 90 pop r12 2a050: bf 90 pop r11 2a052: 08 95 ret 0002a054 : //! @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) { 2a054: bf 92 push r11 2a056: cf 92 push r12 2a058: df 92 push r13 2a05a: ef 92 push r14 2a05c: ff 92 push r15 2a05e: 0f 93 push r16 2a060: 1f 93 push r17 2a062: cf 93 push r28 2a064: df 93 push r29 2a066: ec 01 movw r28, r24 2a068: d6 2e mov r13, r22 2a06a: 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); 2a06c: 8b ef ldi r24, 0xFB ; 251 2a06e: 97 e4 ldi r25, 0x47 ; 71 2a070: 0e 94 44 72 call 0xe488 ; 0xe488 2a074: 8c 01 movw r16, r24 2a076: 85 ef ldi r24, 0xF5 ; 245 2a078: 97 e4 ldi r25, 0x47 ; 71 2a07a: 0e 94 44 72 call 0xe488 ; 0xe488 2a07e: 2a e0 ldi r18, 0x0A ; 10 2a080: c2 2e mov r12, r18 2a082: f1 2c mov r15, r1 2a084: e1 2c mov r14, r1 2a086: 9c 01 movw r18, r24 2a088: 4b 2d mov r20, r11 2a08a: 6d 2d mov r22, r13 2a08c: ce 01 movw r24, r28 2a08e: 0f 94 2e 4f call 0x29e5c ; 0x29e5c } 2a092: df 91 pop r29 2a094: cf 91 pop r28 2a096: 1f 91 pop r17 2a098: 0f 91 pop r16 2a09a: ff 90 pop r15 2a09c: ef 90 pop r14 2a09e: df 90 pop r13 2a0a0: cf 90 pop r12 2a0a2: bf 90 pop r11 2a0a4: 08 95 ret 0002a0a6 : _delay(2000); lcd_clear(); } void lcd_load_filament_color_check() { 2a0a6: cf 92 push r12 2a0a8: ef 92 push r14 2a0aa: ff 92 push r15 2a0ac: 0f 93 push r16 2a0ae: 1f 93 push r17 2a0b0: cf 93 push r28 2a0b2: 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); 2a0b4: 85 ef ldi r24, 0xF5 ; 245 2a0b6: 97 e4 ldi r25, 0x47 ; 71 2a0b8: 0e 94 44 72 call 0xe488 ; 0xe488 2a0bc: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> 2a0c0: c8 2e mov r12, r24 2a0c2: 82 eb ldi r24, 0xB2 ; 178 2a0c4: 9f e4 ldi r25, 0x4F ; 79 2a0c6: 0e 94 44 72 call 0xe488 ; 0xe488 2a0ca: 7c 01 movw r14, r24 2a0cc: 8b ef ldi r24, 0xFB ; 251 2a0ce: 97 e4 ldi r25, 0x47 ; 71 2a0d0: 0e 94 44 72 call 0xe488 ; 0xe488 2a0d4: 8c 01 movw r16, r24 2a0d6: 85 ef ldi r24, 0xF5 ; 245 2a0d8: 97 e4 ldi r25, 0x47 ; 71 2a0da: 0e 94 44 72 call 0xe488 ; 0xe488 2a0de: ec 01 movw r28, r24 2a0e0: 87 e8 ldi r24, 0x87 ; 135 2a0e2: 9f e4 ldi r25, 0x4F ; 79 2a0e4: 0e 94 44 72 call 0xe488 ; 0xe488 2a0e8: c3 94 inc r12 2a0ea: c3 94 inc r12 2a0ec: 9e 01 movw r18, r28 2a0ee: 40 e0 ldi r20, 0x00 ; 0 2a0f0: 60 e0 ldi r22, 0x00 ; 0 2a0f2: 0f 94 2e 4f call 0x29e5c ; 0x29e5c while (clean == LCD_MIDDLE_BUTTON_CHOICE) { 2a0f6: 81 30 cpi r24, 0x01 ; 1 2a0f8: 29 f4 brne .+10 ; 0x2a104 load_filament_final_feed(); 2a0fa: 0e 94 2b 64 call 0xc856 ; 0xc856 st_synchronize(); 2a0fe: 0f 94 a9 43 call 0x28752 ; 0x28752 2a102: d8 cf rjmp .-80 ; 0x2a0b4 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) { 2a104: 82 30 cpi r24, 0x02 ; 2 2a106: 61 f4 brne .+24 ; 0x2a120 unload_filament(FILAMENTCHANGE_FINALRETRACT); 2a108: 60 e0 ldi r22, 0x00 ; 0 2a10a: 70 e0 ldi r23, 0x00 ; 0 2a10c: cb 01 movw r24, r22 } } 2a10e: df 91 pop r29 2a110: cf 91 pop r28 2a112: 1f 91 pop r17 2a114: 0f 91 pop r16 2a116: ff 90 pop r15 2a118: ef 90 pop r14 2a11a: 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); 2a11c: 0c 94 08 f9 jmp 0x1f210 ; 0x1f210 } } 2a120: df 91 pop r29 2a122: cf 91 pop r28 2a124: 1f 91 pop r17 2a126: 0f 91 pop r16 2a128: ff 90 pop r15 2a12a: ef 90 pop r14 2a12c: cf 90 pop r12 2a12e: 08 95 ret 0002a130 : static void __attribute__((noinline)) mFilamentResetMenuStack() { menu_back(bFilamentPreheatState ? 1 : 2); } void mFilamentItem(uint16_t nTemp, uint16_t nTempBed) { 2a130: 0f 93 push r16 2a132: 1f 93 push r17 2a134: cf 93 push r28 2a136: df 93 push r29 2a138: 8c 01 movw r16, r24 2a13a: eb 01 movw r28, r22 }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 2a13c: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 2a140: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 setTargetHotend((float)nTemp); if (!shouldPreheatOnlyNozzle()) setTargetBed((float)nTempBed); 2a144: 0f 94 10 17 call 0x22e20 ; 0x22e20 2a148: 81 11 cpse r24, r1 2a14a: 04 c0 rjmp .+8 ; 0x2a154 resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 2a14c: d0 93 72 06 sts 0x0672, r29 ; 0x800672 2a150: c0 93 71 06 sts 0x0671, r28 ; 0x800671 { const FilamentAction action = eFilamentAction; 2a154: c0 91 a5 03 lds r28, 0x03A5 ; 0x8003a5 if (action == FilamentAction::Preheat || action == FilamentAction::Lay1Cal) 2a158: 87 ef ldi r24, 0xF7 ; 247 2a15a: 8c 0f add r24, r28 2a15c: 82 30 cpi r24, 0x02 ; 2 2a15e: f8 f4 brcc .+62 ; 0x2a19e { lcd_return_to_status(); 2a160: 0f 94 82 1f call 0x23f04 ; 0x23f04 if (action == FilamentAction::Lay1Cal) 2a164: ca 30 cpi r28, 0x0A ; 10 2a166: 41 f4 brne .+16 ; 0x2a178 { lcd_commands_type = LcdCommands::Layer1Cal; 2a168: 84 e0 ldi r24, 0x04 ; 4 2a16a: 80 93 b3 0d sts 0x0DB3, r24 ; 0x800db3 } menu_back(); clearFilamentAction(); } } } 2a16e: df 91 pop r29 2a170: cf 91 pop r28 2a172: 1f 91 pop r17 2a174: 0f 91 pop r16 2a176: 08 95 ret { lcd_commands_type = LcdCommands::Layer1Cal; } else { raise_z_above(MIN_Z_FOR_PREHEAT); 2a178: 60 e0 ldi r22, 0x00 ; 0 2a17a: 70 e0 ldi r23, 0x00 ; 0 2a17c: 80 e2 ldi r24, 0x20 ; 32 2a17e: 91 e4 ldi r25, 0x41 ; 65 2a180: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 2a184: 8f e5 ldi r24, 0x5F ; 95 2a186: 9f e0 ldi r25, 0x0F ; 15 2a188: 0f 94 10 dc call 0x3b820 ; 0x3b820 2a18c: 88 23 and r24, r24 2a18e: 79 f3 breq .-34 ; 0x2a16e lcd_wizard(WizState::LoadFilHot); 2a190: 89 e0 ldi r24, 0x09 ; 9 } menu_back(); clearFilamentAction(); } } } 2a192: df 91 pop r29 2a194: cf 91 pop r28 2a196: 1f 91 pop r17 2a198: 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); 2a19a: 0c 94 b4 f9 jmp 0x1f368 ; 0x1f368 2a19e: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da 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) 2a1a2: 80 91 63 06 lds r24, 0x0663 ; 0x800663 2a1a6: 81 11 cpse r24, r1 2a1a8: 12 c0 rjmp .+36 ; 0x2a1ce 2a1aa: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 2a1ae: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 2a1b2: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 2a1b6: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 2a1ba: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2a1be: 60 1b sub r22, r16 2a1c0: 71 0b sbc r23, r17 2a1c2: 6c 5f subi r22, 0xFC ; 252 2a1c4: 7f 4f sbci r23, 0xFF ; 255 2a1c6: 69 30 cpi r22, 0x09 ; 9 2a1c8: 71 05 cpc r23, r1 2a1ca: 08 f0 brcs .+2 ; 0x2a1ce 2a1cc: 60 c0 rjmp .+192 ; 0x2a28e { menu_func_t filamentActionMenu = nullptr; switch (eFilamentAction) 2a1ce: c1 50 subi r28, 0x01 ; 1 2a1d0: c8 30 cpi r28, 0x08 ; 8 2a1d2: 88 f5 brcc .+98 ; 0x2a236 2a1d4: ec 2f mov r30, r28 2a1d6: f0 e0 ldi r31, 0x00 ; 0 2a1d8: 88 27 eor r24, r24 2a1da: ee 50 subi r30, 0x0E ; 14 2a1dc: ff 4a sbci r31, 0xAF ; 175 2a1de: 8e 4f sbci r24, 0xFE ; 254 2a1e0: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 2a1e4: da 39 cpi r29, 0x9A ; 154 2a1e6: da 39 cpi r29, 0x9A ; 154 2a1e8: da 39 cpi r29, 0x9A ; 154 2a1ea: ee 39 cpi r30, 0x9E ; 158 2a1ec: da 3a cpi r29, 0xAA ; 170 2a1ee: d8 3a cpi r29, 0xA8 ; 168 2a1f0: ac 39 cpi r26, 0x9C ; 156 2a1f2: a6 3a cpi r26, 0xA6 ; 166 else if (eFilamentAction == FilamentAction::UnLoad) enquecommand_P(MSG_M702); // unload filament } break; case FilamentAction::MmuLoad: filamentActionMenu = mmu_load_to_nozzle_menu; 2a1f4: ca e1 ldi r28, 0x1A ; 26 2a1f6: d2 ee ldi r29, 0xE2 ; 226 case FilamentAction::Preheat: case FilamentAction::Lay1Cal: // handled earlier break; } if (bFilamentWaitingFlag) { 2a1f8: 80 91 61 06 lds r24, 0x0661 ; 0x800661 2a1fc: 88 23 and r24, r24 2a1fe: 29 f0 breq .+10 ; 0x2a20a Sound_MakeSound(e_SOUND_TYPE_StandardPrompt); 2a200: 82 e0 ldi r24, 0x02 ; 2 2a202: 0f 94 c8 4e call 0x29d90 ; 0x29d90 bFilamentWaitingFlag = false; 2a206: 10 92 61 06 sts 0x0661, r1 ; 0x800661 } if (filamentActionMenu) { 2a20a: 20 97 sbiw r28, 0x00 ; 0 2a20c: 09 f4 brne .+2 ; 0x2a210 2a20e: af cf rjmp .-162 ; 0x2a16e // Reset the menu stack and filament action before entering action menu mFilamentResetMenuStack(); 2a210: 0f 94 9d 1d call 0x23b3a ; 0x23b3a // The menu should clear eFilamentAction when the // 'action' is done menu_submenu(filamentActionMenu, true); 2a214: 61 e0 ldi r22, 0x01 ; 1 2a216: ce 01 movw r24, r28 } menu_back(); clearFilamentAction(); } } } 2a218: df 91 pop r29 2a21a: cf 91 pop r28 2a21c: 1f 91 pop r17 2a21e: 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); 2a220: 0d 94 f7 d2 jmp 0x3a5ee ; 0x3a5ee switch (eFilamentAction) { case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::UnLoad: if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true); 2a224: 80 91 61 06 lds r24, 0x0661 ; 0x800661 2a228: 88 23 and r24, r24 2a22a: 41 f0 breq .+16 ; 0x2a23c 2a22c: 61 e0 ldi r22, 0x01 ; 1 2a22e: 82 e7 ldi r24, 0x72 ; 114 2a230: 99 e3 ldi r25, 0x39 ; 57 2a232: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee // 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; 2a236: d0 e0 ldi r29, 0x00 ; 0 2a238: c0 e0 ldi r28, 0x00 ; 0 2a23a: de cf rjmp .-68 ; 0x2a1f8 case FilamentAction::AutoLoad: case FilamentAction::UnLoad: if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true); else { mFilamentResetMenuStack(); 2a23c: 0f 94 9d 1d call 0x23b3a ; 0x23b3a if (eFilamentAction == FilamentAction::AutoLoad) { 2a240: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 2a244: 82 30 cpi r24, 0x02 ; 2 2a246: 19 f4 brne .+6 ; 0x2a24e // loading no longer cancellable eFilamentAction = FilamentAction::Load; 2a248: 81 e0 ldi r24, 0x01 ; 1 2a24a: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 } if (eFilamentAction == FilamentAction::Load) 2a24e: 80 91 a5 03 lds r24, 0x03A5 ; 0x8003a5 2a252: 81 30 cpi r24, 0x01 ; 1 2a254: 31 f4 brne .+12 ; 0x2a262 enquecommand_P(MSG_M701); // load filament 2a256: 61 e0 ldi r22, 0x01 ; 1 2a258: 82 ef ldi r24, 0xF2 ; 242 2a25a: 9e e6 ldi r25, 0x6E ; 110 else if (eFilamentAction == FilamentAction::UnLoad) enquecommand_P(MSG_M702); // unload filament 2a25c: 0e 94 b8 87 call 0x10f70 ; 0x10f70 2a260: ea cf rjmp .-44 ; 0x2a236 eFilamentAction = FilamentAction::Load; } if (eFilamentAction == FilamentAction::Load) enquecommand_P(MSG_M701); // load filament else if (eFilamentAction == FilamentAction::UnLoad) 2a262: 83 30 cpi r24, 0x03 ; 3 2a264: 41 f7 brne .-48 ; 0x2a236 enquecommand_P(MSG_M702); // unload filament 2a266: 61 e0 ldi r22, 0x01 ; 1 2a268: 81 e7 ldi r24, 0x71 ; 113 2a26a: 9b e6 ldi r25, 0x6B ; 107 2a26c: f7 cf rjmp .-18 ; 0x2a25c break; case FilamentAction::MmuLoad: filamentActionMenu = mmu_load_to_nozzle_menu; break; case FilamentAction::MmuLoadingTest: filamentActionMenu = mmu_loading_test_menu; 2a26e: c4 e9 ldi r28, 0x94 ; 148 2a270: d1 ee ldi r29, 0xE1 ; 225 2a272: c2 cf rjmp .-124 ; 0x2a1f8 break; case FilamentAction::MmuUnLoad: mFilamentResetMenuStack(); 2a274: 0f 94 9d 1d call 0x23b3a ; 0x23b3a MMU2::mmu2.unload(); 2a278: 0f 94 31 ad call 0x35a62 ; 0x35a62 // 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(); 2a27c: 0f 94 6f 21 call 0x242de ; 0x242de 2a280: da cf rjmp .-76 ; 0x2a236 break; case FilamentAction::MmuEject: filamentActionMenu = mmu_fil_eject_menu; 2a282: c2 e1 ldi r28, 0x12 ; 18 2a284: d2 ee ldi r29, 0xE2 ; 226 2a286: b8 cf rjmp .-144 ; 0x2a1f8 break; case FilamentAction::MmuCut: #ifdef MMU_HAS_CUTTER filamentActionMenu = mmu_cut_filament_menu; 2a288: ca e0 ldi r28, 0x0A ; 10 2a28a: d2 ee ldi r29, 0xE2 ; 226 2a28c: b5 cf rjmp .-150 ; 0x2a1f8 menu_submenu(filamentActionMenu, true); } } else // still preheating, continue updating LCD UI { if (!bFilamentWaitingFlag || lcd_draw_update) 2a28e: 80 91 61 06 lds r24, 0x0661 ; 0x800661 2a292: 88 23 and r24, r24 2a294: 21 f0 breq .+8 ; 0x2a29e 2a296: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 2a29a: 88 23 and r24, r24 2a29c: a1 f1 breq .+104 ; 0x2a306 // 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; 2a29e: 81 e0 ldi r24, 0x01 ; 1 2a2a0: 80 93 61 06 sts 0x0661, r24 ; 0x800661 // also force-enable lcd_draw_update (might be 0 when called from outside a menu) lcd_draw_update = 1; 2a2a4: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d lcd_clear(); 2a2a8: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0,3, PSTR(">")); 2a2ac: 48 e4 ldi r20, 0x48 ; 72 2a2ae: 51 ea ldi r21, 0xA1 ; 161 2a2b0: 63 e0 ldi r22, 0x03 ; 3 2a2b2: 80 e0 ldi r24, 0x00 ; 0 2a2b4: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(1, 3, _T(MSG_CANCEL)); 2a2b8: 8f e6 ldi r24, 0x6F ; 111 2a2ba: 9b e3 ldi r25, 0x3B ; 59 2a2bc: 0e 94 44 72 call 0xe488 ; 0xe488 2a2c0: ac 01 movw r20, r24 2a2c2: 63 e0 ldi r22, 0x03 ; 3 2a2c4: 81 e0 ldi r24, 0x01 ; 1 2a2c6: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(0, 1); 2a2ca: 61 e0 ldi r22, 0x01 ; 1 2a2cc: 80 e0 ldi r24, 0x00 ; 0 2a2ce: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 switch (eFilamentAction) 2a2d2: e0 91 a5 03 lds r30, 0x03A5 ; 0x8003a5 2a2d6: e1 50 subi r30, 0x01 ; 1 2a2d8: e8 30 cpi r30, 0x08 ; 8 2a2da: a8 f4 brcc .+42 ; 0x2a306 2a2dc: f0 e0 ldi r31, 0x00 ; 0 2a2de: 88 27 eor r24, r24 2a2e0: eb 58 subi r30, 0x8B ; 139 2a2e2: fe 4a sbci r31, 0xAE ; 174 2a2e4: 8e 4f sbci r24, 0xFE ; 254 2a2e6: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 2a2ea: 4e 39 cpi r20, 0x9E ; 158 2a2ec: 4e 39 cpi r20, 0x9E ; 158 2a2ee: fa 39 cpi r31, 0x9A ; 154 2a2f0: 4e 39 cpi r20, 0x9E ; 158 2a2f2: fa 39 cpi r31, 0x9A ; 154 2a2f4: 4c 3a cpi r20, 0xAC ; 172 2a2f6: aa 39 cpi r26, 0x9A ; 154 2a2f8: 4e 39 cpi r20, 0x9E ; 158 { case FilamentAction::Load: case FilamentAction::AutoLoad: case FilamentAction::MmuLoad: case FilamentAction::MmuLoadingTest: lcd_puts_P(_T(MSG_PREHEATING_TO_LOAD)); 2a2fa: 87 e6 ldi r24, 0x67 ; 103 2a2fc: 9f e4 ldi r25, 0x4F ; 79 break; case FilamentAction::MmuEject: lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT)); break; case FilamentAction::MmuCut: lcd_puts_P(_T(MSG_PREHEATING_TO_CUT)); 2a2fe: 0e 94 44 72 call 0xe488 ; 0xe488 2a302: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 // handled earlier break; } } if (bFilamentWaitingFlag) { 2a306: 80 91 61 06 lds r24, 0x0661 ; 0x800661 2a30a: 81 11 cpse r24, r1 lcd_print_target_temps_first_line(); 2a30c: 0f 94 73 22 call 0x244e6 ; 0x244e6 } if (lcd_clicked()) 2a310: 0e 94 95 70 call 0xe12a ; 0xe12a 2a314: 88 23 and r24, r24 2a316: 09 f4 brne .+2 ; 0x2a31a 2a318: 2a cf rjmp .-428 ; 0x2a16e { // Filament action canceled while preheating bFilamentWaitingFlag = false; 2a31a: 10 92 61 06 sts 0x0661, r1 ; 0x800661 if (!bFilamentPreheatState) 2a31e: 80 91 62 06 lds r24, 0x0662 ; 0x800662 2a322: 81 11 cpse r24, r1 2a324: 0e c0 rjmp .+28 ; 0x2a342 return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 2a326: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 2a32a: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 { setTargetHotend(0); if (!printingIsPaused()) setTargetBed(0); 2a32e: 0e 94 1d 67 call 0xce3a ; 0xce3a 2a332: 81 11 cpse r24, r1 2a334: 04 c0 rjmp .+8 ; 0x2a33e resetPID(0); }; FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; 2a336: 10 92 72 06 sts 0x0672, r1 ; 0x800672 2a33a: 10 92 71 06 sts 0x0671, r1 ; 0x800671 menu_back(); 2a33e: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 } menu_back(); 2a342: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 clearFilamentAction(); } } } 2a346: df 91 pop r29 2a348: cf 91 pop r28 2a34a: 1f 91 pop r17 2a34c: 0f 91 pop r16 setTargetHotend(0); if (!printingIsPaused()) setTargetBed(0); menu_back(); } menu_back(); clearFilamentAction(); 2a34e: 0d 94 6f 21 jmp 0x242de ; 0x242de 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)); 2a352: 80 e5 ldi r24, 0x50 ; 80 2a354: 9f e4 ldi r25, 0x4F ; 79 2a356: d3 cf rjmp .-90 ; 0x2a2fe break; case FilamentAction::MmuEject: lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT)); 2a358: 8a e3 ldi r24, 0x3A ; 58 2a35a: 9f e4 ldi r25, 0x4F ; 79 2a35c: d0 cf rjmp .-96 ; 0x2a2fe break; case FilamentAction::MmuCut: lcd_puts_P(_T(MSG_PREHEATING_TO_CUT)); 2a35e: 86 e2 ldi r24, 0x26 ; 38 2a360: 9f e4 ldi r25, 0x4F ; 79 2a362: cd cf rjmp .-102 ; 0x2a2fe 0002a364 : } } } static void setFilamentAction(FilamentAction action) { eFilamentAction = action; 2a364: 80 93 a5 03 sts 0x03A5, r24 ; 0x8003a5 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) ); 2a368: 40 91 b9 13 lds r20, 0x13B9 ; 0x8013b9 2a36c: 20 91 b5 0d lds r18, 0x0DB5 ; 0x800db5 2a370: 30 91 b6 0d lds r19, 0x0DB6 ; 0x800db6 2a374: 41 30 cpi r20, 0x01 ; 1 2a376: 59 f0 breq .+22 ; 0x2a38e 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() 2a378: 10 92 63 06 sts 0x0663, r1 ; 0x800663 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) { 2a37c: 80 91 6b 02 lds r24, 0x026B ; 0x80026b 2a380: 90 91 6c 02 lds r25, 0x026C ; 0x80026c 2a384: 28 17 cp r18, r24 2a386: 39 07 cpc r19, r25 2a388: 5c f4 brge .+22 ; 0x2a3a0 bFilamentPreheatState = true; mFilamentItem(target_temperature[0], target_temperature_bed); bFilamentSkipPreheat = false; // Reset flag } else { lcd_generic_preheat_menu(); 2a38a: 0d 94 72 21 jmp 0x242e4 ; 0x242e4 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() 2a38e: 90 91 8f 13 lds r25, 0x138F ; 0x80138f 2a392: 91 11 cpse r25, r1 2a394: f1 cf rjmp .-30 ; 0x2a378 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); 2a396: 86 50 subi r24, 0x06 ; 6 2a398: 82 30 cpi r24, 0x02 ; 2 2a39a: 70 f7 brcc .-36 ; 0x2a378 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() 2a39c: 40 93 63 06 sts 0x0663, r20 ; 0x800663 && (action == FilamentAction::MmuCut || action == FilamentAction::MmuEject) ); if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) { bFilamentPreheatState = true; 2a3a0: 81 e0 ldi r24, 0x01 ; 1 2a3a2: 80 93 62 06 sts 0x0662, r24 ; 0x800662 mFilamentItem(target_temperature[0], target_temperature_bed); 2a3a6: 60 91 71 06 lds r22, 0x0671 ; 0x800671 2a3aa: 70 91 72 06 lds r23, 0x0672 ; 0x800672 2a3ae: c9 01 movw r24, r18 2a3b0: 0f 94 98 50 call 0x2a130 ; 0x2a130 bFilamentSkipPreheat = false; // Reset flag 2a3b4: 10 92 63 06 sts 0x0663, r1 ; 0x800663 } else { lcd_generic_preheat_menu(); } } 2a3b8: 08 95 ret 0002a3ba : { preheat_or_continue(FilamentAction::Load); } void lcd_AutoLoadFilament() { preheat_or_continue(FilamentAction::AutoLoad); 2a3ba: 82 e0 ldi r24, 0x02 ; 2 2a3bc: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0002a3c0 : } } static void lcd_LoadFilament() { preheat_or_continue(FilamentAction::Load); 2a3c0: 81 e0 ldi r24, 0x01 ; 1 2a3c2: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0002a3c6 : MENU_END(); } static void lcd_unLoadFilament() { preheat_or_continue(FilamentAction::UnLoad); 2a3c6: 83 e0 ldi r24, 0x03 ; 3 2a3c8: 0d 94 b2 51 jmp 0x2a364 ; 0x2a364 0002a3cc : mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, 0); } static void mFilamentItem_PLA() { bFilamentPreheatState = false; 2a3cc: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PLA_PREHEAT_HOTEND_TEMP, PLA_PREHEAT_HPB_TEMP); 2a3d0: 6c e3 ldi r22, 0x3C ; 60 2a3d2: 70 e0 ldi r23, 0x00 ; 0 2a3d4: 87 ed ldi r24, 0xD7 ; 215 2a3d6: 90 e0 ldi r25, 0x00 ; 0 2a3d8: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a3dc : } static void mFilamentItem_PET() { bFilamentPreheatState = false; 2a3dc: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PET_PREHEAT_HOTEND_TEMP, PET_PREHEAT_HPB_TEMP); 2a3e0: 65 e5 ldi r22, 0x55 ; 85 2a3e2: 70 e0 ldi r23, 0x00 ; 0 2a3e4: 86 ee ldi r24, 0xE6 ; 230 2a3e6: 90 e0 ldi r25, 0x00 ; 0 2a3e8: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a3ec : } static void mFilamentItem_ASA() { bFilamentPreheatState = false; 2a3ec: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(ASA_PREHEAT_HOTEND_TEMP, ASA_PREHEAT_HPB_TEMP); 2a3f0: 69 e6 ldi r22, 0x69 ; 105 2a3f2: 70 e0 ldi r23, 0x00 ; 0 2a3f4: 84 e0 ldi r24, 0x04 ; 4 2a3f6: 91 e0 ldi r25, 0x01 ; 1 2a3f8: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a3fc : } static void mFilamentItem_PC() { bFilamentPreheatState = false; 2a3fc: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP); 2a400: 6e e6 ldi r22, 0x6E ; 110 2a402: 70 e0 ldi r23, 0x00 ; 0 2a404: 83 e1 ldi r24, 0x13 ; 19 2a406: 91 e0 ldi r25, 0x01 ; 1 2a408: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a40c : mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP); } static void mFilamentItem_PVB() { bFilamentPreheatState = false; 2a40c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP); 2a410: 6b e4 ldi r22, 0x4B ; 75 2a412: 70 e0 ldi r23, 0x00 ; 0 2a414: 87 ed ldi r24, 0xD7 ; 215 2a416: 90 e0 ldi r25, 0x00 ; 0 2a418: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a41c : mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP); } static void mFilamentItem_PA() { bFilamentPreheatState = false; 2a41c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP); 2a420: 6a e5 ldi r22, 0x5A ; 90 2a422: 70 e0 ldi r23, 0x00 ; 0 2a424: 83 e1 ldi r24, 0x13 ; 19 2a426: 91 e0 ldi r25, 0x01 ; 1 2a428: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a42c : mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP); } static void mFilamentItem_ABS() { bFilamentPreheatState = false; 2a42c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP); 2a430: 64 e6 ldi r22, 0x64 ; 100 2a432: 70 e0 ldi r23, 0x00 ; 0 2a434: 8f ef ldi r24, 0xFF ; 255 2a436: 90 e0 ldi r25, 0x00 ; 0 2a438: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a43c : mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP); } static void mFilamentItem_HIPS() { bFilamentPreheatState = false; 2a43c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(HIPS_PREHEAT_HOTEND_TEMP, HIPS_PREHEAT_HPB_TEMP); 2a440: 64 e6 ldi r22, 0x64 ; 100 2a442: 70 e0 ldi r23, 0x00 ; 0 2a444: 8c ed ldi r24, 0xDC ; 220 2a446: 90 e0 ldi r25, 0x00 ; 0 2a448: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a44c : } static void mFilamentItem_PP() { bFilamentPreheatState = false; 2a44c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(PP_PREHEAT_HOTEND_TEMP, PP_PREHEAT_HPB_TEMP); 2a450: 64 e6 ldi r22, 0x64 ; 100 2a452: 70 e0 ldi r23, 0x00 ; 0 2a454: 8e ef ldi r24, 0xFE ; 254 2a456: 90 e0 ldi r25, 0x00 ; 0 2a458: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a45c : } static void mFilamentItem_FLEX() { bFilamentPreheatState = false; 2a45c: 10 92 62 06 sts 0x0662, r1 ; 0x800662 mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP); 2a460: 62 e3 ldi r22, 0x32 ; 50 2a462: 70 e0 ldi r23, 0x00 ; 0 2a464: 80 ef ldi r24, 0xF0 ; 240 2a466: 90 e0 ldi r25, 0x00 ; 0 2a468: 0d 94 98 50 jmp 0x2a130 ; 0x2a130 0002a46c : } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 2a46c: 80 e0 ldi r24, 0x00 ; 0 2a46e: 0f 94 c8 4e call 0x29d90 ; 0x29d90 #include "xflash_dump.h" static void lcd_dump_memory() { lcd_beeper_quick_feedback(); xfdump_dump(); 2a472: 0e 94 a3 ee call 0x1dd46 ; 0x1dd46 lcd_return_to_status(); 2a476: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 0002a47a : } 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){ 2a47a: cf 92 push r12 2a47c: df 92 push r13 2a47e: ef 92 push r14 2a480: ff 92 push r15 if (critical || eSoundMode != e_SOUND_MODE_SILENT) { 2a482: 41 11 cpse r20, r1 2a484: 04 c0 rjmp .+8 ; 0x2a48e 2a486: 20 91 dd 04 lds r18, 0x04DD ; 0x8004dd 2a48a: 22 30 cpi r18, 0x02 ; 2 2a48c: d1 f0 breq .+52 ; 0x2a4c2 2a48e: 9b 01 movw r18, r22 2a490: 6c 01 movw r12, r24 2a492: f1 2c mov r15, r1 2a494: e1 2c mov r14, r1 if(!tone_) { 2a496: 67 2b or r22, r23 2a498: c9 f4 brne .+50 ; 0x2a4cc WRITE(BEEPER, HIGH); 2a49a: 9f b7 in r25, 0x3f ; 63 2a49c: f8 94 cli 2a49e: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2a4a2: 84 60 ori r24, 0x04 ; 4 2a4a4: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2a4a8: 9f bf out 0x3f, r25 ; 63 _delay(ms); 2a4aa: c7 01 movw r24, r14 2a4ac: b6 01 movw r22, r12 2a4ae: 0f 94 2f 28 call 0x2505e ; 0x2505e 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); 2a4b2: 9f b7 in r25, 0x3f ; 63 2a4b4: f8 94 cli 2a4b6: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2a4ba: 8b 7f andi r24, 0xFB ; 251 2a4bc: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2a4c0: 9f bf out 0x3f, r25 ; 63 _tone(BEEPER, tone_); _delay(ms); _noTone(BEEPER); } } } 2a4c2: ff 90 pop r15 2a4c4: ef 90 pop r14 2a4c6: df 90 pop r13 2a4c8: cf 90 pop r12 2a4ca: 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); 2a4cc: 22 0f add r18, r18 2a4ce: 33 1f adc r19, r19 2a4d0: 50 e0 ldi r21, 0x00 ; 0 2a4d2: 40 e0 ldi r20, 0x00 ; 0 2a4d4: 60 e0 ldi r22, 0x00 ; 0 2a4d6: 74 e2 ldi r23, 0x24 ; 36 2a4d8: 84 ef ldi r24, 0xF4 ; 244 2a4da: 90 e0 ldi r25, 0x00 ; 0 2a4dc: 0f 94 01 dd call 0x3ba02 ; 0x3ba02 <__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; 2a4e0: 91 e0 ldi r25, 0x01 ; 1 uint32_t pwm_freq = F_CPU / (2 * frequency); if (pwm_freq > UINT16_MAX) { 2a4e2: 21 15 cp r18, r1 2a4e4: 31 05 cpc r19, r1 2a4e6: 81 e0 ldi r24, 0x01 ; 1 2a4e8: 48 07 cpc r20, r24 2a4ea: 51 05 cpc r21, r1 2a4ec: 44 f0 brlt .+16 ; 0x2a4fe pwm_freq /= 64; // Increase prescaler to 64 2a4ee: 86 e0 ldi r24, 0x06 ; 6 2a4f0: 56 95 lsr r21 2a4f2: 47 95 ror r20 2a4f4: 37 95 ror r19 2a4f6: 27 95 ror r18 2a4f8: 8a 95 dec r24 2a4fa: d1 f7 brne .-12 ; 0x2a4f0 prescalarbits = 0b011; 2a4fc: 93 e0 ldi r25, 0x03 ; 3 } uint16_t ocr = pwm_freq - 1; 2a4fe: 21 50 subi r18, 0x01 ; 1 2a500: 31 09 sbc r19, r1 CRITICAL_SECTION_START; 2a502: 4f b7 in r20, 0x3f ; 63 2a504: f8 94 cli // Set calcualted prescaler TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; 2a506: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 2a50a: 88 7f andi r24, 0xF8 ; 248 2a50c: 89 2b or r24, r25 2a50e: 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); 2a512: 60 91 ac 00 lds r22, 0x00AC ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 2a516: 70 91 ad 00 lds r23, 0x00AD ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2a51a: 26 9f mul r18, r22 2a51c: c0 01 movw r24, r0 2a51e: 27 9f mul r18, r23 2a520: 90 0d add r25, r0 2a522: 36 9f mul r19, r22 2a524: 90 0d add r25, r0 2a526: 11 24 eor r1, r1 2a528: 50 91 72 00 lds r21, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2a52c: 6f ef ldi r22, 0xFF ; 255 2a52e: 70 e0 ldi r23, 0x00 ; 0 2a530: 51 ff sbrs r21, 1 2a532: 04 c0 rjmp .+8 ; 0x2a53c 2a534: 60 91 a8 00 lds r22, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 2a538: 70 91 a9 00 lds r23, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2a53c: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2a540: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2a544: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> #endif //EXTRUDER_0_AUTO_FAN_PIN // Set calcualted ocr OCR4A = ocr; 2a548: 30 93 a9 00 sts 0x00A9, r19 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2a54c: 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); 2a550: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2a554: 83 60 ori r24, 0x03 ; 3 2a556: 80 93 72 00 sts 0x0072, r24 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 2a55a: 4f bf out 0x3f, r20 ; 63 WRITE(BEEPER, HIGH); _delay(ms); WRITE(BEEPER, LOW); } else { _tone(BEEPER, tone_); _delay(ms); 2a55c: c7 01 movw r24, r14 2a55e: b6 01 movw r22, r12 2a560: 0f 94 2f 28 call 0x2505e ; 0x2505e } void noTone4(_UNUSED uint8_t _pin) { CRITICAL_SECTION_START; 2a564: 2f b7 in r18, 0x3f ; 63 2a566: f8 94 cli // Revert prescaler to CLK/1024 TCCR4B = (TCCR4B & 0b11111000) | _BV(CS42) | _BV(CS40); 2a568: 80 91 a1 00 lds r24, 0x00A1 ; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1> 2a56c: 88 7f andi r24, 0xF8 ; 248 2a56e: 85 60 ori r24, 0x05 ; 5 2a570: 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); 2a574: 40 91 ac 00 lds r20, 0x00AC ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> 2a578: 50 91 ad 00 lds r21, 0x00AD ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2a57c: 3f ef ldi r19, 0xFF ; 255 2a57e: 34 9f mul r19, r20 2a580: c0 01 movw r24, r0 2a582: 35 9f mul r19, r21 2a584: 90 0d add r25, r0 2a586: 11 24 eor r1, r1 2a588: 30 91 72 00 lds r19, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2a58c: 6f ef ldi r22, 0xFF ; 255 2a58e: 70 e0 ldi r23, 0x00 ; 0 2a590: 31 ff sbrs r19, 1 2a592: 04 c0 rjmp .+8 ; 0x2a59c 2a594: 60 91 a8 00 lds r22, 0x00A8 ; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8> 2a598: 70 91 a9 00 lds r23, 0x00A9 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2a59c: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2a5a0: 70 93 ad 00 sts 0x00AD, r23 ; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad> 2a5a4: 60 93 ac 00 sts 0x00AC, r22 ; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac> #endif //EXTRUDER_0_AUTO_FAN_PIN OCR4A = 255U; 2a5a8: 8f ef ldi r24, 0xFF ; 255 2a5aa: 90 e0 ldi r25, 0x00 ; 0 2a5ac: 90 93 a9 00 sts 0x00A9, r25 ; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9> 2a5b0: 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)); 2a5b4: 80 91 72 00 lds r24, 0x0072 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> 2a5b8: 8c 7f andi r24, 0xFC ; 252 2a5ba: 80 93 72 00 sts 0x0072, r24 ; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072> CRITICAL_SECTION_END; 2a5be: 2f bf out 0x3f, r18 ; 63 2a5c0: 78 cf rjmp .-272 ; 0x2a4b2 0002a5c2 : /// 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() { 2a5c2: cf 93 push r28 #if BEEPER > 0 if (eSoundMode == e_SOUND_MODE_SILENT) return; 2a5c4: c0 91 dd 04 lds r28, 0x04DD ; 0x8004dd 2a5c8: c2 30 cpi r28, 0x02 ; 2 2a5ca: 59 f1 breq .+86 ; 0x2a622 // Handle case where only one beep is needed if (eSoundMode == e_SOUND_MODE_ONCE) { 2a5cc: c1 30 cpi r28, 0x01 ; 1 2a5ce: 69 f4 brne .+26 ; 0x2a5ea if (bFirst) return; 2a5d0: 80 91 6d 05 lds r24, 0x056D ; 0x80056d <_ZL6bFirst.lto_priv.497> 2a5d4: 81 11 cpse r24, r1 2a5d6: 25 c0 rjmp .+74 ; 0x2a622 Sound_MakeCustom(80, 0, false); 2a5d8: 40 e0 ldi r20, 0x00 ; 0 2a5da: 70 e0 ldi r23, 0x00 ; 0 2a5dc: 60 e0 ldi r22, 0x00 ; 0 2a5de: 80 e5 ldi r24, 0x50 ; 80 2a5e0: 90 e0 ldi r25, 0x00 ; 0 2a5e2: 0f 94 3d 52 call 0x2a47a ; 0x2a47a bFirst = true; 2a5e6: c0 93 6d 05 sts 0x056D, r28 ; 0x80056d <_ZL6bFirst.lto_priv.497> } // Handle case where there should be continous beeps if (beep_timer.expired_cont(CONTINOUS_BEEP_PERIOD)) { 2a5ea: 60 ed ldi r22, 0xD0 ; 208 2a5ec: 77 e0 ldi r23, 0x07 ; 7 2a5ee: 8a e6 ldi r24, 0x6A ; 106 2a5f0: 95 e0 ldi r25, 0x05 ; 5 2a5f2: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 2a5f6: 88 23 and r24, r24 2a5f8: a1 f0 breq .+40 ; 0x2a622 beep_timer.start(); 2a5fa: 8a e6 ldi r24, 0x6A ; 106 2a5fc: 95 e0 ldi r25, 0x05 ; 5 2a5fe: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> if (eSoundMode == e_SOUND_MODE_LOUD) { 2a602: 80 91 dd 04 lds r24, 0x04DD ; 0x8004dd 2a606: 81 11 cpse r24, r1 2a608: 08 c0 rjmp .+16 ; 0x2a61a Sound_MakeCustom(80, 0, false); 2a60a: 40 e0 ldi r20, 0x00 ; 0 2a60c: 70 e0 ldi r23, 0x00 ; 0 2a60e: 60 e0 ldi r22, 0x00 ; 0 2a610: 80 e5 ldi r24, 0x50 ; 80 2a612: 90 e0 ldi r25, 0x00 ; 0 // Assist (lower volume sound) Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); } } #endif // BEEPER > 0 } 2a614: 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); 2a616: 0d 94 3d 52 jmp 0x2a47a ; 0x2a47a } else { // Assist (lower volume sound) Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 2a61a: 80 e0 ldi r24, 0x00 ; 0 } } #endif // BEEPER > 0 } 2a61c: 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); 2a61e: 0d 94 c8 4e jmp 0x29d90 ; 0x29d90 } } #endif // BEEPER > 0 } 2a622: cf 91 pop r28 2a624: 08 95 ret 0002a626 : sm4_calc_delay_cb_t sm4_calc_delay_cb = 0; void sm4_set_dir(uint8_t axis, uint8_t dir) { switch (axis) 2a626: 82 30 cpi r24, 0x02 ; 2 2a628: b9 f0 breq .+46 ; 0x2a658 2a62a: 83 30 cpi r24, 0x03 ; 3 2a62c: e9 f0 breq .+58 ; 0x2a668 2a62e: 81 30 cpi r24, 0x01 ; 1 2a630: 59 f0 breq .+22 ; 0x2a648 case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break; 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; #elif ((MOTHERBOARD == BOARD_EINSY_1_0a)) case 0: if (dir == INVERT_X_DIR) PORTL |= 1; else PORTL &= ~1; break; 2a632: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2a636: 61 30 cpi r22, 0x01 ; 1 2a638: 29 f4 brne .+10 ; 0x2a644 2a63a: 81 60 ori r24, 0x01 ; 1 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; 2a63c: 80 93 0b 01 sts 0x010B, r24 ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> #endif } asm("nop"); 2a640: 00 00 nop } 2a642: 08 95 ret case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break; 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; #elif ((MOTHERBOARD == BOARD_EINSY_1_0a)) case 0: if (dir == INVERT_X_DIR) PORTL |= 1; else PORTL &= ~1; break; 2a644: 8e 7f andi r24, 0xFE ; 254 2a646: fa cf rjmp .-12 ; 0x2a63c case 1: if (dir == INVERT_Y_DIR) PORTL |= 2; else PORTL &= ~2; break; 2a648: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2a64c: 61 11 cpse r22, r1 2a64e: 02 c0 rjmp .+4 ; 0x2a654 2a650: 82 60 ori r24, 0x02 ; 2 2a652: f4 cf rjmp .-24 ; 0x2a63c 2a654: 8d 7f andi r24, 0xFD ; 253 2a656: f2 cf rjmp .-28 ; 0x2a63c case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break; 2a658: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2a65c: 61 30 cpi r22, 0x01 ; 1 2a65e: 11 f4 brne .+4 ; 0x2a664 2a660: 84 60 ori r24, 0x04 ; 4 2a662: ec cf rjmp .-40 ; 0x2a63c 2a664: 8b 7f andi r24, 0xFB ; 251 2a666: ea cf rjmp .-44 ; 0x2a63c case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break; 2a668: 80 91 0b 01 lds r24, 0x010B ; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b> 2a66c: 61 11 cpse r22, r1 2a66e: 02 c0 rjmp .+4 ; 0x2a674 2a670: 80 64 ori r24, 0x40 ; 64 2a672: e4 cf rjmp .-56 ; 0x2a63c 2a674: 8f 7b andi r24, 0xBF ; 191 2a676: e2 cf rjmp .-60 ; 0x2a63c 0002a678 : buf[nbyte] = SPDR; } //------------------------------------------------------------------------------ /** SPI send a byte */ static void spiSend(uint8_t b) { SPDR = b; 2a678: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a67a: 0d b4 in r0, 0x2d ; 45 2a67c: 07 fe sbrs r0, 7 2a67e: fd cf rjmp .-6 ; 0x2a67a } 2a680: 08 95 ret 0002a682 : SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; } //------------------------------------------------------------------------------ /** SPI receive a byte */ static uint8_t spiRec() { SPDR = 0XFF; 2a682: 8f ef ldi r24, 0xFF ; 255 2a684: 8e bd out 0x2e, r24 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a686: 0d b4 in r0, 0x2d ; 45 2a688: 07 fe sbrs r0, 7 2a68a: fd cf rjmp .-6 ; 0x2a686 return SPDR; 2a68c: 8e b5 in r24, 0x2e ; 46 } 2a68e: 08 95 ret 0002a690 : } } #endif // SOFTWARE_SPI //------------------------------------------------------------------------------ // send command and return error code. Return zero for OK uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { 2a690: 8f 92 push r8 2a692: 9f 92 push r9 2a694: af 92 push r10 2a696: bf 92 push r11 2a698: ef 92 push r14 2a69a: ff 92 push r15 2a69c: 0f 93 push r16 2a69e: 1f 93 push r17 2a6a0: cf 93 push r28 2a6a2: 7c 01 movw r14, r24 2a6a4: c6 2f mov r28, r22 2a6a6: 49 01 movw r8, r18 2a6a8: 5a 01 movw r10, r20 WRITE(SDSS, 1); } //------------------------------------------------------------------------------ void Sd2Card::chipSelectLow() { #ifndef SOFTWARE_SPI spiInit(spiRate_); 2a6aa: fc 01 movw r30, r24 2a6ac: 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); 2a6ae: 89 2f mov r24, r25 2a6b0: 80 6a ori r24, 0xA0 ; 160 2a6b2: 86 95 lsr r24 2a6b4: 8c bd out 0x2c, r24 ; 44 SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; 2a6b6: 90 fd sbrc r25, 0 2a6b8: 03 c0 rjmp .+6 ; 0x2a6c0 2a6ba: 81 e0 ldi r24, 0x01 ; 1 2a6bc: 96 30 cpi r25, 0x06 ; 6 2a6be: 09 f4 brne .+2 ; 0x2a6c2 2a6c0: 80 e0 ldi r24, 0x00 ; 0 2a6c2: 8d bd out 0x2d, r24 ; 45 //------------------------------------------------------------------------------ void Sd2Card::chipSelectLow() { #ifndef SOFTWARE_SPI spiInit(spiRate_); #endif // SOFTWARE_SPI WRITE(SDSS, 0); 2a6c4: 9f b7 in r25, 0x3f ; 63 2a6c6: f8 94 cli 2a6c8: 80 91 05 01 lds r24, 0x0105 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 2a6cc: 8f 7b andi r24, 0xBF ; 191 2a6ce: 80 93 05 01 sts 0x0105, r24 ; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105> 2a6d2: 9f bf out 0x3f, r25 ; 63 uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { // select card chipSelectLow(); // wait up to 300 ms if busy waitNotBusy(300); 2a6d4: 8c e2 ldi r24, 0x2C ; 44 2a6d6: 91 e0 ldi r25, 0x01 ; 1 2a6d8: 0f 94 bf 75 call 0x2eb7e ; 0x2eb7e // send command spiSend(cmd | 0x40); 2a6dc: 8c 2f mov r24, r28 2a6de: 80 64 ori r24, 0x40 ; 64 2a6e0: 0f 94 3c 53 call 0x2a678 ; 0x2a678 2a6e4: 08 e1 ldi r16, 0x18 ; 24 2a6e6: 10 e0 ldi r17, 0x00 ; 0 // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); 2a6e8: d5 01 movw r26, r10 2a6ea: c4 01 movw r24, r8 2a6ec: 00 2e mov r0, r16 2a6ee: 04 c0 rjmp .+8 ; 0x2a6f8 2a6f0: b6 95 lsr r27 2a6f2: a7 95 ror r26 2a6f4: 97 95 ror r25 2a6f6: 87 95 ror r24 2a6f8: 0a 94 dec r0 2a6fa: d2 f7 brpl .-12 ; 0x2a6f0 2a6fc: 0f 94 3c 53 call 0x2a678 ; 0x2a678 2a700: 08 50 subi r16, 0x08 ; 8 2a702: 11 09 sbc r17, r1 2a704: 08 3f cpi r16, 0xF8 ; 248 2a706: ff ef ldi r31, 0xFF ; 255 2a708: 1f 07 cpc r17, r31 2a70a: 71 f7 brne .-36 ; 0x2a6e8 // send CRC uint8_t crc = 0XFF; if (cmd == CMD0) crc = 0X95; // correct crc for CMD0 with arg 0 2a70c: 85 e9 ldi r24, 0x95 ; 149 2a70e: cc 23 and r28, r28 2a710: 21 f0 breq .+8 ; 0x2a71a if (cmd == CMD8) crc = 0X87; // correct crc for CMD8 with arg 0X1AA 2a712: 87 e8 ldi r24, 0x87 ; 135 2a714: c8 30 cpi r28, 0x08 ; 8 2a716: 09 f0 breq .+2 ; 0x2a71a // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); // send CRC uint8_t crc = 0XFF; 2a718: 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); 2a71a: 0f 94 3c 53 call 0x2a678 ; 0x2a678 // skip stuff byte for stop read if (cmd == CMD12) spiRec(); 2a71e: cc 30 cpi r28, 0x0C ; 12 2a720: 11 f4 brne .+4 ; 0x2a726 2a722: 0f 94 41 53 call 0x2a682 ; 0x2a682 // send argument for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s); // send CRC uint8_t crc = 0XFF; 2a726: 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 */ } 2a728: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a72c: f7 01 movw r30, r14 2a72e: 82 83 std Z+2, r24 ; 0x02 2a730: 87 ff sbrs r24, 7 2a732: 04 c0 rjmp .+8 ; 0x2a73c 2a734: cf 3f cpi r28, 0xFF ; 255 2a736: 11 f0 breq .+4 ; 0x2a73c 2a738: cf 5f subi r28, 0xFF ; 255 2a73a: f6 cf rjmp .-20 ; 0x2a728 return status_; } 2a73c: cf 91 pop r28 2a73e: 1f 91 pop r17 2a740: 0f 91 pop r16 2a742: ff 90 pop r15 2a744: ef 90 pop r14 2a746: bf 90 pop r11 2a748: af 90 pop r10 2a74a: 9f 90 pop r9 2a74c: 8f 90 pop r8 2a74e: 08 95 ret 0002a750 : * \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) { 2a750: 0f 93 push r16 2a752: 1f 93 push r17 2a754: cf 93 push r28 2a756: df 93 push r29 2a758: ec 01 movw r28, r24 2a75a: 89 01 movw r16, r18 // use address if not SDHC card if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; 2a75c: 8b 81 ldd r24, Y+3 ; 0x03 2a75e: 83 30 cpi r24, 0x03 ; 3 2a760: 39 f0 breq .+14 ; 0x2a770 2a762: 89 e0 ldi r24, 0x09 ; 9 2a764: 44 0f add r20, r20 2a766: 55 1f adc r21, r21 2a768: 66 1f adc r22, r22 2a76a: 77 1f adc r23, r23 2a76c: 8a 95 dec r24 2a76e: d1 f7 brne .-12 ; 0x2a764 if (cardCommand(CMD24, blockNumber)) { 2a770: 9a 01 movw r18, r20 2a772: ab 01 movw r20, r22 2a774: 68 e1 ldi r22, 0x18 ; 24 2a776: ce 01 movw r24, r28 2a778: 0f 94 48 53 call 0x2a690 ; 0x2a690 2a77c: 88 23 and r24, r24 2a77e: 19 f0 breq .+6 ; 0x2a786 bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 2a780: 86 e0 ldi r24, 0x06 ; 6 2a782: 88 83 st Y, r24 2a784: 39 c0 rjmp .+114 ; 0x2a7f8 } //------------------------------------------------------------------------------ /** 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; 2a786: 8e ef ldi r24, 0xFE ; 254 2a788: 8e bd out 0x2e, r24 ; 46 2a78a: f8 01 movw r30, r16 2a78c: c8 01 movw r24, r16 2a78e: 9e 5f subi r25, 0xFE ; 254 for (uint16_t i = 0; i < 512; i += 2) { while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a790: 0d b4 in r0, 0x2d ; 45 2a792: 07 fe sbrs r0, 7 2a794: fd cf rjmp .-6 ; 0x2a790 SPDR = buf[i]; 2a796: 20 81 ld r18, Z 2a798: 2e bd out 0x2e, r18 ; 46 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a79a: 0d b4 in r0, 0x2d ; 45 2a79c: 07 fe sbrs r0, 7 2a79e: fd cf rjmp .-6 ; 0x2a79a SPDR = buf[i + 1]; 2a7a0: 21 81 ldd r18, Z+1 ; 0x01 2a7a2: 2e bd out 0x2e, r18 ; 46 2a7a4: 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) { 2a7a6: e8 17 cp r30, r24 2a7a8: f9 07 cpc r31, r25 2a7aa: 91 f7 brne .-28 ; 0x2a790 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 */ } 2a7ac: 0d b4 in r0, 0x2d ; 45 2a7ae: 07 fe sbrs r0, 7 2a7b0: fd cf rjmp .-6 ; 0x2a7ac //------------------------------------------------------------------------------ // 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 2a7b2: 8f ef ldi r24, 0xFF ; 255 2a7b4: 0f 94 3c 53 call 0x2a678 ; 0x2a678 spiSend(0xff); // dummy crc 2a7b8: 8f ef ldi r24, 0xFF ; 255 2a7ba: 0f 94 3c 53 call 0x2a678 ; 0x2a678 status_ = spiRec(); 2a7be: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a7c2: 8a 83 std Y+2, r24 ; 0x02 if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { 2a7c4: 8f 71 andi r24, 0x1F ; 31 2a7c6: 85 30 cpi r24, 0x05 ; 5 2a7c8: 99 f4 brne .+38 ; 0x2a7f0 goto fail; } if (!writeData(DATA_START_BLOCK, src)) goto fail; // wait for flash programming to complete if (!waitNotBusy(SD_WRITE_TIMEOUT)) { 2a7ca: 88 e5 ldi r24, 0x58 ; 88 2a7cc: 92 e0 ldi r25, 0x02 ; 2 2a7ce: 0f 94 bf 75 call 0x2eb7e ; 0x2eb7e 2a7d2: 18 2f mov r17, r24 2a7d4: 87 e1 ldi r24, 0x17 ; 23 2a7d6: 11 23 and r17, r17 2a7d8: a1 f2 breq .-88 ; 0x2a782 error(SD_CARD_ERROR_WRITE_TIMEOUT); goto fail; } // response is r2 so get and check two bytes for nonzero if (cardCommand(CMD13, 0) || spiRec()) { 2a7da: 20 e0 ldi r18, 0x00 ; 0 2a7dc: 30 e0 ldi r19, 0x00 ; 0 2a7de: a9 01 movw r20, r18 2a7e0: 6d e0 ldi r22, 0x0D ; 13 2a7e2: ce 01 movw r24, r28 2a7e4: 0f 94 48 53 call 0x2a690 ; 0x2a690 2a7e8: 88 23 and r24, r24 2a7ea: 51 f0 breq .+20 ; 0x2a800 2a7ec: 86 e1 ldi r24, 0x16 ; 22 2a7ee: c9 cf rjmp .-110 ; 0x2a782 2a7f0: 83 e1 ldi r24, 0x13 ; 19 2a7f2: 88 83 st Y, r24 goto fail; } return true; fail: chipSelectHigh(); 2a7f4: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c } chipSelectHigh(); return true; fail: chipSelectHigh(); 2a7f8: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c return false; 2a7fc: 10 e0 ldi r17, 0x00 ; 0 2a7fe: 06 c0 rjmp .+12 ; 0x2a80c 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()) { 2a800: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a804: 81 11 cpse r24, r1 2a806: f2 cf rjmp .-28 ; 0x2a7ec error(SD_CARD_ERROR_WRITE_PROGRAMMING); goto fail; } chipSelectHigh(); 2a808: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c return true; fail: chipSelectHigh(); return false; } 2a80c: 81 2f mov r24, r17 2a80e: df 91 pop r29 2a810: cf 91 pop r28 2a812: 1f 91 pop r17 2a814: 0f 91 pop r16 2a816: 08 95 ret 0002a818 : fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheFlush() { 2a818: cf 93 push r28 if (cacheDirty_) { 2a81a: 80 91 98 0e lds r24, 0x0E98 ; 0x800e98 } cacheMirrorBlock_ = 0; } cacheDirty_ = 0; } return true; 2a81e: c1 e0 ldi r28, 0x01 ; 1 fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheFlush() { if (cacheDirty_) { 2a820: 88 23 and r24, r24 2a822: a1 f0 breq .+40 ; 0x2a84c if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { 2a824: 40 91 90 0e lds r20, 0x0E90 ; 0x800e90 2a828: 50 91 91 0e lds r21, 0x0E91 ; 0x800e91 2a82c: 60 91 92 0e lds r22, 0x0E92 ; 0x800e92 2a830: 70 91 93 0e lds r23, 0x0E93 ; 0x800e93 2a834: 2c e9 ldi r18, 0x9C ; 156 2a836: 3e e0 ldi r19, 0x0E ; 14 2a838: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 2a83c: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 2a840: 0f 94 a8 53 call 0x2a750 ; 0x2a750 2a844: c8 2f mov r28, r24 2a846: 81 11 cpse r24, r1 2a848: 04 c0 rjmp .+8 ; 0x2a852 cacheDirty_ = 0; } return true; fail: return false; 2a84a: c0 e0 ldi r28, 0x00 ; 0 } 2a84c: 8c 2f mov r24, r28 2a84e: cf 91 pop r28 2a850: 08 95 ret if (cacheDirty_) { if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) { goto fail; } // mirror FAT tables if (cacheMirrorBlock_) { 2a852: 40 91 94 0e lds r20, 0x0E94 ; 0x800e94 2a856: 50 91 95 0e lds r21, 0x0E95 ; 0x800e95 2a85a: 60 91 96 0e lds r22, 0x0E96 ; 0x800e96 2a85e: 70 91 97 0e lds r23, 0x0E97 ; 0x800e97 2a862: 41 15 cp r20, r1 2a864: 51 05 cpc r21, r1 2a866: 61 05 cpc r22, r1 2a868: 71 05 cpc r23, r1 2a86a: 91 f0 breq .+36 ; 0x2a890 if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) { 2a86c: 2c e9 ldi r18, 0x9C ; 156 2a86e: 3e e0 ldi r19, 0x0E ; 14 2a870: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 2a874: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 2a878: 0f 94 a8 53 call 0x2a750 ; 0x2a750 2a87c: 88 23 and r24, r24 2a87e: 29 f3 breq .-54 ; 0x2a84a goto fail; } cacheMirrorBlock_ = 0; 2a880: 10 92 94 0e sts 0x0E94, r1 ; 0x800e94 2a884: 10 92 95 0e sts 0x0E95, r1 ; 0x800e95 2a888: 10 92 96 0e sts 0x0E96, r1 ; 0x800e96 2a88c: 10 92 97 0e sts 0x0E97, r1 ; 0x800e97 } cacheDirty_ = 0; 2a890: 10 92 98 0e sts 0x0E98, r1 ; 0x800e98 2a894: db cf rjmp .-74 ; 0x2a84c 0002a896 : * \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) { 2a896: 2f 92 push r2 2a898: 3f 92 push r3 2a89a: 4f 92 push r4 2a89c: 5f 92 push r5 2a89e: 6f 92 push r6 2a8a0: 7f 92 push r7 2a8a2: 8f 92 push r8 2a8a4: 9f 92 push r9 2a8a6: af 92 push r10 2a8a8: bf 92 push r11 2a8aa: cf 92 push r12 2a8ac: df 92 push r13 2a8ae: ef 92 push r14 2a8b0: ff 92 push r15 2a8b2: 0f 93 push r16 2a8b4: 1f 93 push r17 2a8b6: cf 93 push r28 2a8b8: df 93 push r29 2a8ba: ec 01 movw r28, r24 2a8bc: 2a 01 movw r4, r20 2a8be: 3b 01 movw r6, r22 2a8c0: 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; 2a8c2: 8b 81 ldd r24, Y+3 ; 0x03 2a8c4: 83 30 cpi r24, 0x03 ; 3 2a8c6: 39 f0 breq .+14 ; 0x2a8d6 2a8c8: 69 e0 ldi r22, 0x09 ; 9 2a8ca: 44 0c add r4, r4 2a8cc: 55 1c adc r5, r5 2a8ce: 66 1c adc r6, r6 2a8d0: 77 1c adc r7, r7 2a8d2: 6a 95 dec r22 2a8d4: d1 f7 brne .-12 ; 0x2a8ca retry2: 2a8d6: 43 e0 ldi r20, 0x03 ; 3 2a8d8: 94 2e mov r9, r20 2a8da: 56 01 movw r10, r12 2a8dc: 81 e0 ldi r24, 0x01 ; 1 2a8de: a8 1a sub r10, r24 2a8e0: 8e ef ldi r24, 0xFE ; 254 2a8e2: b8 0a sbc r11, r24 2a8e4: 16 01 movw r2, r12 2a8e6: ee ef ldi r30, 0xFE ; 254 2a8e8: 3e 1a sub r3, r30 2a8ea: 54 e0 ldi r21, 0x04 ; 4 2a8ec: 85 2e mov r8, r21 retryCnt --; 2a8ee: 9a 94 dec r9 if (cardCommand(CMD17, blockNumber)) { 2a8f0: a3 01 movw r20, r6 2a8f2: 92 01 movw r18, r4 2a8f4: 61 e1 ldi r22, 0x11 ; 17 2a8f6: ce 01 movw r24, r28 2a8f8: 0f 94 48 53 call 0x2a690 ; 0x2a690 2a8fc: 88 23 and r24, r24 2a8fe: 79 f0 breq .+30 ; 0x2a91e 2a900: 88 82 st Y, r8 error(SD_CARD_ERROR_CMD17); if (retryCnt > 0) goto retry; 2a902: 99 20 and r9, r9 2a904: 09 f4 brne .+2 ; 0x2a908 2a906: 7a c0 rjmp .+244 ; 0x2a9fc if (retryCnt > 0) goto retry; goto fail; } return true; retry: chipSelectHigh(); 2a908: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c cardCommand(CMD12, 0);//Try sending a stop command, but ignore the result. 2a90c: 20 e0 ldi r18, 0x00 ; 0 2a90e: 30 e0 ldi r19, 0x00 ; 0 2a910: a9 01 movw r20, r18 2a912: 6c e0 ldi r22, 0x0C ; 12 2a914: ce 01 movw r24, r28 2a916: 0f 94 48 53 call 0x2a690 ; 0x2a690 errorCode_ = 0; 2a91a: 18 82 st Y, r1 2a91c: e8 cf rjmp .-48 ; 0x2a8ee #endif //------------------------------------------------------------------------------ bool Sd2Card::readData(uint8_t* dst, uint16_t count) { // wait for start block token uint16_t t0 = _millis(); 2a91e: 0f 94 28 2a call 0x25450 ; 0x25450 2a922: 8b 01 movw r16, r22 while ((status_ = spiRec()) == 0XFF) { 2a924: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a928: 8a 83 std Y+2, r24 ; 0x02 2a92a: 8f 3f cpi r24, 0xFF ; 255 2a92c: 91 f4 brne .+36 ; 0x2a952 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { 2a92e: 0f 94 28 2a call 0x25450 ; 0x25450 2a932: 60 1b sub r22, r16 2a934: 71 0b sbc r23, r17 2a936: 6d 32 cpi r22, 0x2D ; 45 2a938: 71 40 sbci r23, 0x01 ; 1 2a93a: a0 f3 brcs .-24 ; 0x2a924 2a93c: 81 e1 ldi r24, 0x11 ; 17 2a93e: 88 83 st Y, r24 if (flash_air_compatible_) spiSend(0XFF); return true; fail: chipSelectHigh(); 2a940: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c // Toshiba FlashAir Patch. Purge pending status byte. if (flash_air_compatible_) 2a944: 8c 81 ldd r24, Y+4 ; 0x04 2a946: 88 23 and r24, r24 2a948: e1 f2 breq .-72 ; 0x2a902 spiSend(0XFF); 2a94a: 8f ef ldi r24, 0xFF ; 255 2a94c: 0f 94 3c 53 call 0x2a678 ; 0x2a678 2a950: d8 cf rjmp .-80 ; 0x2a902 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto fail; } } if (status_ != DATA_START_BLOCK) { 2a952: 8e 3f cpi r24, 0xFE ; 254 2a954: 11 f0 breq .+4 ; 0x2a95a 2a956: 8f e0 ldi r24, 0x0F ; 15 2a958: f2 cf rjmp .-28 ; 0x2a93e //------------------------------------------------------------------------------ /** 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; 2a95a: 8f ef ldi r24, 0xFF ; 255 2a95c: 8e bd out 0x2e, r24 ; 46 2a95e: d6 01 movw r26, r12 2a960: f6 01 movw r30, r12 for (uint16_t i = 0; i < nbyte; i++) { while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a962: 0d b4 in r0, 0x2d ; 45 2a964: 07 fe sbrs r0, 7 2a966: fd cf rjmp .-6 ; 0x2a962 buf[i] = SPDR; 2a968: 9e b5 in r25, 0x2e ; 46 2a96a: 91 93 st Z+, r25 SPDR = 0XFF; 2a96c: 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++) { 2a96e: ea 15 cp r30, r10 2a970: fb 05 cpc r31, r11 2a972: b9 f7 brne .-18 ; 0x2a962 while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } buf[i] = SPDR; SPDR = 0XFF; } while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ } 2a974: 0d b4 in r0, 0x2d ; 45 2a976: 07 fe sbrs r0, 7 2a978: fd cf rjmp .-6 ; 0x2a974 buf[nbyte] = SPDR; 2a97a: 8e b5 in r24, 0x2e ; 46 2a97c: f5 01 movw r30, r10 2a97e: 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; 2a980: f1 2c mov r15, r1 2a982: 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); 2a984: 8d 91 ld r24, X+ 2a986: ef 2d mov r30, r15 2a988: ff 27 eor r31, r31 2a98a: e8 27 eor r30, r24 2a98c: ee 0f add r30, r30 2a98e: ff 1f adc r31, r31 2a990: e8 56 subi r30, 0x68 ; 104 2a992: f0 47 sbci r31, 0x70 ; 112 2a994: 85 91 lpm r24, Z+ 2a996: 94 91 lpm r25, Z 2a998: fe 2c mov r15, r14 2a99a: ee 24 eor r14, r14 2a99c: e8 26 eor r14, r24 2a99e: 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++) { 2a9a0: 2a 16 cp r2, r26 2a9a2: 3b 06 cpc r3, r27 2a9a4: 79 f7 brne .-34 ; 0x2a984 spiRead(dst, count); #ifdef SD_CHECK_AND_RETRY { uint16_t calcCrc = CRC_CCITT(dst, count); uint16_t recvCrc = spiRec() << 8; 2a9a6: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a9aa: 08 2f mov r16, r24 2a9ac: 10 e0 ldi r17, 0x00 ; 0 2a9ae: 10 2f mov r17, r16 2a9b0: 00 27 eor r16, r16 recvCrc |= spiRec(); 2a9b2: 0f 94 41 53 call 0x2a682 ; 0x2a682 2a9b6: 08 2b or r16, r24 if (calcCrc != recvCrc) 2a9b8: 0e 15 cp r16, r14 2a9ba: 1f 05 cpc r17, r15 2a9bc: 19 f0 breq .+6 ; 0x2a9c4 2a9be: f0 e2 ldi r31, 0x20 ; 32 2a9c0: f8 83 st Y, r31 2a9c2: be cf rjmp .-132 ; 0x2a940 #else // discard CRC spiRec(); spiRec(); #endif chipSelectHigh(); 2a9c4: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c // Toshiba FlashAir Patch. Purge pending status byte. if (flash_air_compatible_) 2a9c8: cc 81 ldd r28, Y+4 ; 0x04 2a9ca: cc 23 and r28, r28 2a9cc: d9 f0 breq .+54 ; 0x2aa04 spiSend(0XFF); 2a9ce: 8f ef ldi r24, 0xFF ; 255 2a9d0: 0f 94 3c 53 call 0x2a678 ; 0x2a678 #endif fail: chipSelectHigh(); return false; } 2a9d4: 8c 2f mov r24, r28 2a9d6: df 91 pop r29 2a9d8: cf 91 pop r28 2a9da: 1f 91 pop r17 2a9dc: 0f 91 pop r16 2a9de: ff 90 pop r15 2a9e0: ef 90 pop r14 2a9e2: df 90 pop r13 2a9e4: cf 90 pop r12 2a9e6: bf 90 pop r11 2a9e8: af 90 pop r10 2a9ea: 9f 90 pop r9 2a9ec: 8f 90 pop r8 2a9ee: 7f 90 pop r7 2a9f0: 6f 90 pop r6 2a9f2: 5f 90 pop r5 2a9f4: 4f 90 pop r4 2a9f6: 3f 90 pop r3 2a9f8: 2f 90 pop r2 2a9fa: 08 95 ret } return readData(dst, 512); #endif fail: chipSelectHigh(); 2a9fc: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c return false; 2aa00: c0 e0 ldi r28, 0x00 ; 0 2aa02: e8 cf rjmp .-48 ; 0x2a9d4 if (!readData(dst, 512)) { if (retryCnt > 0) goto retry; goto fail; } return true; 2aa04: c1 e0 ldi r28, 0x01 ; 1 2aa06: e6 cf rjmp .-52 ; 0x2a9d4 0002aa08 : fail: return false; } //------------------------------------------------------------------------------ bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { 2aa08: cf 92 push r12 2aa0a: df 92 push r13 2aa0c: ef 92 push r14 2aa0e: ff 92 push r15 2aa10: cf 93 push r28 2aa12: 6b 01 movw r12, r22 2aa14: 7c 01 movw r14, r24 2aa16: c4 2f mov r28, r20 if (cacheBlockNumber_ != blockNumber) { 2aa18: 80 91 90 0e lds r24, 0x0E90 ; 0x800e90 2aa1c: 90 91 91 0e lds r25, 0x0E91 ; 0x800e91 2aa20: a0 91 92 0e lds r26, 0x0E92 ; 0x800e92 2aa24: b0 91 93 0e lds r27, 0x0E93 ; 0x800e93 2aa28: 8c 15 cp r24, r12 2aa2a: 9d 05 cpc r25, r13 2aa2c: ae 05 cpc r26, r14 2aa2e: bf 05 cpc r27, r15 2aa30: 01 f1 breq .+64 ; 0x2aa72 if (!cacheFlush()) goto fail; 2aa32: 0f 94 0c 54 call 0x2a818 ; 0x2a818 2aa36: 81 11 cpse r24, r1 2aa38: 08 c0 rjmp .+16 ; 0x2aa4a } if (dirty) cacheDirty_ = true; return true; fail: return false; 2aa3a: c0 e0 ldi r28, 0x00 ; 0 } 2aa3c: 8c 2f mov r24, r28 2aa3e: cf 91 pop r28 2aa40: ff 90 pop r15 2aa42: ef 90 pop r14 2aa44: df 90 pop r13 2aa46: cf 90 pop r12 2aa48: 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; 2aa4a: 2c e9 ldi r18, 0x9C ; 156 2aa4c: 3e e0 ldi r19, 0x0E ; 14 2aa4e: b7 01 movw r22, r14 2aa50: a6 01 movw r20, r12 2aa52: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 2aa56: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 2aa5a: 0f 94 4b 54 call 0x2a896 ; 0x2a896 2aa5e: 88 23 and r24, r24 2aa60: 61 f3 breq .-40 ; 0x2aa3a cacheBlockNumber_ = blockNumber; 2aa62: c0 92 90 0e sts 0x0E90, r12 ; 0x800e90 2aa66: d0 92 91 0e sts 0x0E91, r13 ; 0x800e91 2aa6a: e0 92 92 0e sts 0x0E92, r14 ; 0x800e92 2aa6e: f0 92 93 0e sts 0x0E93, r15 ; 0x800e93 } if (dirty) cacheDirty_ = true; 2aa72: cc 23 and r28, r28 2aa74: 21 f0 breq .+8 ; 0x2aa7e 2aa76: 81 e0 ldi r24, 0x01 ; 1 2aa78: 80 93 98 0e sts 0x0E98, r24 ; 0x800e98 2aa7c: df cf rjmp .-66 ; 0x2aa3c return true; 2aa7e: c1 e0 ldi r28, 0x01 ; 1 2aa80: dd cf rjmp .-70 ; 0x2aa3c 0002aa82 : fail: return false; } //------------------------------------------------------------------------------ // Store a FAT entry bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { 2aa82: 4f 92 push r4 2aa84: 5f 92 push r5 2aa86: 6f 92 push r6 2aa88: 7f 92 push r7 2aa8a: 8f 92 push r8 2aa8c: 9f 92 push r9 2aa8e: af 92 push r10 2aa90: bf 92 push r11 2aa92: cf 92 push r12 2aa94: df 92 push r13 2aa96: ef 92 push r14 2aa98: ff 92 push r15 2aa9a: 0f 93 push r16 2aa9c: 1f 93 push r17 2aa9e: cf 93 push r28 2aaa0: df 93 push r29 2aaa2: ec 01 movw r28, r24 uint32_t lba; // error if reserved cluster if (cluster < 2) goto fail; 2aaa4: 42 30 cpi r20, 0x02 ; 2 2aaa6: 51 05 cpc r21, r1 2aaa8: 61 05 cpc r22, r1 2aaaa: 71 05 cpc r23, r1 2aaac: 90 f4 brcc .+36 ; 0x2aad2 // mirror second FAT if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; return true; fail: return false; 2aaae: 80 e0 ldi r24, 0x00 ; 0 } 2aab0: df 91 pop r29 2aab2: cf 91 pop r28 2aab4: 1f 91 pop r17 2aab6: 0f 91 pop r16 2aab8: ff 90 pop r15 2aaba: ef 90 pop r14 2aabc: df 90 pop r13 2aabe: cf 90 pop r12 2aac0: bf 90 pop r11 2aac2: af 90 pop r10 2aac4: 9f 90 pop r9 2aac6: 8f 90 pop r8 2aac8: 7f 90 pop r7 2aaca: 6f 90 pop r6 2aacc: 5f 90 pop r5 2aace: 4f 90 pop r4 2aad0: 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; 2aad2: 89 85 ldd r24, Y+9 ; 0x09 2aad4: 9a 85 ldd r25, Y+10 ; 0x0a 2aad6: ab 85 ldd r26, Y+11 ; 0x0b 2aad8: bc 85 ldd r27, Y+12 ; 0x0c 2aada: 01 96 adiw r24, 0x01 ; 1 2aadc: a1 1d adc r26, r1 2aade: b1 1d adc r27, r1 2aae0: 84 17 cp r24, r20 2aae2: 95 07 cpc r25, r21 2aae4: a6 07 cpc r26, r22 2aae6: b7 07 cpc r27, r23 2aae8: 10 f3 brcs .-60 ; 0x2aaae tmp = ((cacheBuffer_.data[index] & 0XF0)) | tmp >> 4; } cacheBuffer_.data[index] = tmp; return true; } if (fatType_ == 16) { 2aaea: 8f 89 ldd r24, Y+23 ; 0x17 2aaec: 80 31 cpi r24, 0x10 ; 16 2aaee: c9 f5 brne .+114 ; 0x2ab62 lba = fatStartBlock_ + (cluster >> 8); 2aaf0: 85 2e mov r8, r21 2aaf2: 96 2e mov r9, r22 2aaf4: a7 2e mov r10, r23 2aaf6: bb 24 eor r11, r11 2aaf8: 8b 89 ldd r24, Y+19 ; 0x13 2aafa: 9c 89 ldd r25, Y+20 ; 0x14 2aafc: ad 89 ldd r26, Y+21 ; 0x15 2aafe: be 89 ldd r27, Y+22 ; 0x16 } else if (fatType_ == 32) { lba = fatStartBlock_ + (cluster >> 7); 2ab00: 88 0e add r8, r24 2ab02: 99 1e adc r9, r25 2ab04: aa 1e adc r10, r26 2ab06: bb 1e adc r11, r27 2ab08: 28 01 movw r4, r16 2ab0a: 39 01 movw r6, r18 2ab0c: 6a 01 movw r12, r20 2ab0e: 7b 01 movw r14, r22 } else { goto fail; } if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; 2ab10: 41 e0 ldi r20, 0x01 ; 1 2ab12: c5 01 movw r24, r10 2ab14: b4 01 movw r22, r8 2ab16: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2ab1a: 88 23 and r24, r24 2ab1c: 41 f2 breq .-112 ; 0x2aaae // store entry if (fatType_ == 16) { 2ab1e: 9f 89 ldd r25, Y+23 ; 0x17 2ab20: 90 31 cpi r25, 0x10 ; 16 2ab22: 81 f5 brne .+96 ; 0x2ab84 cacheBuffer_.fat16[cluster & 0XFF] = value; 2ab24: dd 24 eor r13, r13 2ab26: ee 24 eor r14, r14 2ab28: ff 24 eor r15, r15 2ab2a: f6 01 movw r30, r12 2ab2c: ee 0f add r30, r30 2ab2e: ff 1f adc r31, r31 2ab30: e4 56 subi r30, 0x64 ; 100 2ab32: f1 4f sbci r31, 0xF1 ; 241 2ab34: 11 83 std Z+1, r17 ; 0x01 2ab36: 00 83 st Z, r16 } else { cacheBuffer_.fat32[cluster & 0X7F] = value; } // mirror second FAT if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; 2ab38: 9a 89 ldd r25, Y+18 ; 0x12 2ab3a: 92 30 cpi r25, 0x02 ; 2 2ab3c: 08 f4 brcc .+2 ; 0x2ab40 2ab3e: b8 cf rjmp .-144 ; 0x2aab0 2ab40: 4d 81 ldd r20, Y+5 ; 0x05 2ab42: 5e 81 ldd r21, Y+6 ; 0x06 2ab44: 6f 81 ldd r22, Y+7 ; 0x07 2ab46: 78 85 ldd r23, Y+8 ; 0x08 2ab48: 84 0e add r8, r20 2ab4a: 95 1e adc r9, r21 2ab4c: a6 1e adc r10, r22 2ab4e: b7 1e adc r11, r23 2ab50: 80 92 94 0e sts 0x0E94, r8 ; 0x800e94 2ab54: 90 92 95 0e sts 0x0E95, r9 ; 0x800e95 2ab58: a0 92 96 0e sts 0x0E96, r10 ; 0x800e96 2ab5c: b0 92 97 0e sts 0x0E97, r11 ; 0x800e97 2ab60: a7 cf rjmp .-178 ; 0x2aab0 cacheBuffer_.data[index] = tmp; return true; } if (fatType_ == 16) { lba = fatStartBlock_ + (cluster >> 8); } else if (fatType_ == 32) { 2ab62: 80 32 cpi r24, 0x20 ; 32 2ab64: 09 f0 breq .+2 ; 0x2ab68 2ab66: a3 cf rjmp .-186 ; 0x2aaae lba = fatStartBlock_ + (cluster >> 7); 2ab68: 8b 89 ldd r24, Y+19 ; 0x13 2ab6a: 9c 89 ldd r25, Y+20 ; 0x14 2ab6c: ad 89 ldd r26, Y+21 ; 0x15 2ab6e: be 89 ldd r27, Y+22 ; 0x16 2ab70: 4a 01 movw r8, r20 2ab72: 5b 01 movw r10, r22 2ab74: e7 e0 ldi r30, 0x07 ; 7 2ab76: b6 94 lsr r11 2ab78: a7 94 ror r10 2ab7a: 97 94 ror r9 2ab7c: 87 94 ror r8 2ab7e: ea 95 dec r30 2ab80: d1 f7 brne .-12 ; 0x2ab76 2ab82: be cf rjmp .-132 ; 0x2ab00 if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail; // store entry if (fatType_ == 16) { cacheBuffer_.fat16[cluster & 0XFF] = value; } else { cacheBuffer_.fat32[cluster & 0X7F] = value; 2ab84: e8 94 clt 2ab86: c7 f8 bld r12, 7 2ab88: dd 24 eor r13, r13 2ab8a: ee 24 eor r14, r14 2ab8c: ff 24 eor r15, r15 2ab8e: f6 01 movw r30, r12 2ab90: ee 0f add r30, r30 2ab92: ff 1f adc r31, r31 2ab94: ee 0f add r30, r30 2ab96: ff 1f adc r31, r31 2ab98: e4 56 subi r30, 0x64 ; 100 2ab9a: f1 4f sbci r31, 0xF1 ; 241 2ab9c: 40 82 st Z, r4 2ab9e: 51 82 std Z+1, r5 ; 0x01 2aba0: 62 82 std Z+2, r6 ; 0x02 2aba2: 73 82 std Z+3, r7 ; 0x03 2aba4: c9 cf rjmp .-110 ; 0x2ab38 0002aba6 : fail: return false; } //------------------------------------------------------------------------------ // Fetch a FAT entry bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { 2aba6: cf 92 push r12 2aba8: df 92 push r13 2abaa: ef 92 push r14 2abac: ff 92 push r15 2abae: 0f 93 push r16 2abb0: 1f 93 push r17 2abb2: cf 93 push r28 2abb4: df 93 push r29 2abb6: fc 01 movw r30, r24 uint32_t lba; if (cluster > (clusterCount_ + 1)) goto fail; 2abb8: 81 85 ldd r24, Z+9 ; 0x09 2abba: 92 85 ldd r25, Z+10 ; 0x0a 2abbc: a3 85 ldd r26, Z+11 ; 0x0b 2abbe: b4 85 ldd r27, Z+12 ; 0x0c 2abc0: 01 96 adiw r24, 0x01 ; 1 2abc2: a1 1d adc r26, r1 2abc4: b1 1d adc r27, r1 2abc6: 84 17 cp r24, r20 2abc8: 95 07 cpc r25, r21 2abca: a6 07 cpc r26, r22 2abcc: b7 07 cpc r27, r23 2abce: 50 f4 brcc .+20 ; 0x2abe4 *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; } return true; fail: return false; 2abd0: 80 e0 ldi r24, 0x00 ; 0 } 2abd2: df 91 pop r29 2abd4: cf 91 pop r28 2abd6: 1f 91 pop r17 2abd8: 0f 91 pop r16 2abda: ff 90 pop r15 2abdc: ef 90 pop r14 2abde: df 90 pop r13 2abe0: cf 90 pop r12 2abe2: 08 95 ret } tmp |= cacheBuffer_.data[index] << 8; *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; return true; } if (fatType_ == 16) { 2abe4: 87 89 ldd r24, Z+23 ; 0x17 2abe6: 80 31 cpi r24, 0x10 ; 16 2abe8: a9 f5 brne .+106 ; 0x2ac54 lba = fatStartBlock_ + (cluster >> 8); 2abea: bb 27 eor r27, r27 2abec: a7 2f mov r26, r23 2abee: 96 2f mov r25, r22 2abf0: 85 2f mov r24, r21 2abf2: c3 88 ldd r12, Z+19 ; 0x13 2abf4: d4 88 ldd r13, Z+20 ; 0x14 2abf6: e5 88 ldd r14, Z+21 ; 0x15 2abf8: f6 88 ldd r15, Z+22 ; 0x16 } else if (fatType_ == 32) { lba = fatStartBlock_ + (cluster >> 7); 2abfa: 8c 0d add r24, r12 2abfc: 9d 1d adc r25, r13 2abfe: ae 1d adc r26, r14 2ac00: bf 1d adc r27, r15 2ac02: e9 01 movw r28, r18 2ac04: 6a 01 movw r12, r20 2ac06: 7b 01 movw r14, r22 2ac08: 8f 01 movw r16, r30 } else { goto fail; } if (lba != cacheBlockNumber_) { 2ac0a: 40 91 90 0e lds r20, 0x0E90 ; 0x800e90 2ac0e: 50 91 91 0e lds r21, 0x0E91 ; 0x800e91 2ac12: 60 91 92 0e lds r22, 0x0E92 ; 0x800e92 2ac16: 70 91 93 0e lds r23, 0x0E93 ; 0x800e93 2ac1a: 84 17 cp r24, r20 2ac1c: 95 07 cpc r25, r21 2ac1e: a6 07 cpc r26, r22 2ac20: b7 07 cpc r27, r23 2ac22: 49 f5 brne .+82 ; 0x2ac76 if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; } if (fatType_ == 16) { 2ac24: f8 01 movw r30, r16 2ac26: 87 89 ldd r24, Z+23 ; 0x17 2ac28: 80 31 cpi r24, 0x10 ; 16 2ac2a: 69 f5 brne .+90 ; 0x2ac86 *value = cacheBuffer_.fat16[cluster & 0XFF]; 2ac2c: b7 01 movw r22, r14 2ac2e: a6 01 movw r20, r12 2ac30: 55 27 eor r21, r21 2ac32: 66 27 eor r22, r22 2ac34: 77 27 eor r23, r23 2ac36: 44 0f add r20, r20 2ac38: 55 1f adc r21, r21 2ac3a: 44 56 subi r20, 0x64 ; 100 2ac3c: 51 4f sbci r21, 0xF1 ; 241 2ac3e: fa 01 movw r30, r20 2ac40: 80 81 ld r24, Z 2ac42: 91 81 ldd r25, Z+1 ; 0x01 2ac44: b0 e0 ldi r27, 0x00 ; 0 2ac46: a0 e0 ldi r26, 0x00 ; 0 } else { *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; 2ac48: 88 83 st Y, r24 2ac4a: 99 83 std Y+1, r25 ; 0x01 2ac4c: aa 83 std Y+2, r26 ; 0x02 2ac4e: bb 83 std Y+3, r27 ; 0x03 2ac50: 81 e0 ldi r24, 0x01 ; 1 2ac52: bf cf rjmp .-130 ; 0x2abd2 *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; return true; } if (fatType_ == 16) { lba = fatStartBlock_ + (cluster >> 8); } else if (fatType_ == 32) { 2ac54: 80 32 cpi r24, 0x20 ; 32 2ac56: 09 f0 breq .+2 ; 0x2ac5a 2ac58: bb cf rjmp .-138 ; 0x2abd0 lba = fatStartBlock_ + (cluster >> 7); 2ac5a: c3 88 ldd r12, Z+19 ; 0x13 2ac5c: d4 88 ldd r13, Z+20 ; 0x14 2ac5e: e5 88 ldd r14, Z+21 ; 0x15 2ac60: f6 88 ldd r15, Z+22 ; 0x16 2ac62: db 01 movw r26, r22 2ac64: ca 01 movw r24, r20 2ac66: c7 e0 ldi r28, 0x07 ; 7 2ac68: b6 95 lsr r27 2ac6a: a7 95 ror r26 2ac6c: 97 95 ror r25 2ac6e: 87 95 ror r24 2ac70: ca 95 dec r28 2ac72: d1 f7 brne .-12 ; 0x2ac68 2ac74: c2 cf rjmp .-124 ; 0x2abfa } else { goto fail; } if (lba != cacheBlockNumber_) { if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail; 2ac76: 40 e0 ldi r20, 0x00 ; 0 2ac78: bc 01 movw r22, r24 2ac7a: cd 01 movw r24, r26 2ac7c: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2ac80: 81 11 cpse r24, r1 2ac82: d0 cf rjmp .-96 ; 0x2ac24 2ac84: a5 cf rjmp .-182 ; 0x2abd0 } if (fatType_ == 16) { *value = cacheBuffer_.fat16[cluster & 0XFF]; } else { *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK; 2ac86: b7 01 movw r22, r14 2ac88: a6 01 movw r20, r12 2ac8a: 4f 77 andi r20, 0x7F ; 127 2ac8c: 55 27 eor r21, r21 2ac8e: 66 27 eor r22, r22 2ac90: 77 27 eor r23, r23 2ac92: 44 0f add r20, r20 2ac94: 55 1f adc r21, r21 2ac96: 44 0f add r20, r20 2ac98: 55 1f adc r21, r21 2ac9a: 44 56 subi r20, 0x64 ; 100 2ac9c: 51 4f sbci r21, 0xF1 ; 241 2ac9e: fa 01 movw r30, r20 2aca0: 80 81 ld r24, Z 2aca2: 91 81 ldd r25, Z+1 ; 0x01 2aca4: a2 81 ldd r26, Z+2 ; 0x02 2aca6: b3 81 ldd r27, Z+3 ; 0x03 2aca8: bf 70 andi r27, 0x0F ; 15 2acaa: ce cf rjmp .-100 ; 0x2ac48 0002acac : fail: return false; } //------------------------------------------------------------------------------ // return the size in bytes of a cluster chain bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { 2acac: 4f 92 push r4 2acae: 5f 92 push r5 2acb0: 6f 92 push r6 2acb2: 7f 92 push r7 2acb4: af 92 push r10 2acb6: bf 92 push r11 2acb8: cf 92 push r12 2acba: df 92 push r13 2acbc: ef 92 push r14 2acbe: ff 92 push r15 2acc0: 0f 93 push r16 2acc2: 1f 93 push r17 2acc4: cf 93 push r28 2acc6: df 93 push r29 2acc8: 00 d0 rcall .+0 ; 0x2acca 2acca: 1f 92 push r1 2accc: cd b7 in r28, 0x3d ; 61 2acce: de b7 in r29, 0x3e ; 62 2acd0: 8c 01 movw r16, r24 2acd2: 49 83 std Y+1, r20 ; 0x01 2acd4: 5a 83 std Y+2, r21 ; 0x02 2acd6: 6b 83 std Y+3, r22 ; 0x03 2acd8: 7c 83 std Y+4, r23 ; 0x04 2acda: 59 01 movw r10, r18 uint32_t s = 0; 2acdc: c1 2c mov r12, r1 2acde: d1 2c mov r13, r1 2ace0: 76 01 movw r14, r12 do { if (!fatGet(cluster, &cluster)) goto fail; s += 512UL << clusterSizeShift_; 2ace2: 41 2c mov r4, r1 2ace4: 82 e0 ldi r24, 0x02 ; 2 2ace6: 58 2e mov r5, r24 2ace8: 61 2c mov r6, r1 2acea: 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; 2acec: 49 81 ldd r20, Y+1 ; 0x01 2acee: 5a 81 ldd r21, Y+2 ; 0x02 2acf0: 6b 81 ldd r22, Y+3 ; 0x03 2acf2: 7c 81 ldd r23, Y+4 ; 0x04 2acf4: 9e 01 movw r18, r28 2acf6: 2f 5f subi r18, 0xFF ; 255 2acf8: 3f 4f sbci r19, 0xFF ; 255 2acfa: c8 01 movw r24, r16 2acfc: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2ad00: 88 23 and r24, r24 2ad02: 19 f1 breq .+70 ; 0x2ad4a s += 512UL << clusterSizeShift_; 2ad04: f8 01 movw r30, r16 2ad06: 85 85 ldd r24, Z+13 ; 0x0d 2ad08: a3 01 movw r20, r6 2ad0a: 92 01 movw r18, r4 2ad0c: 04 c0 rjmp .+8 ; 0x2ad16 2ad0e: 22 0f add r18, r18 2ad10: 33 1f adc r19, r19 2ad12: 44 1f adc r20, r20 2ad14: 55 1f adc r21, r21 2ad16: 8a 95 dec r24 2ad18: d2 f7 brpl .-12 ; 0x2ad0e 2ad1a: da 01 movw r26, r20 2ad1c: c9 01 movw r24, r18 2ad1e: c8 0e add r12, r24 2ad20: d9 1e adc r13, r25 2ad22: ea 1e adc r14, r26 2ad24: fb 1e adc r15, r27 } while (!isEOC(cluster)); 2ad26: 49 81 ldd r20, Y+1 ; 0x01 2ad28: 5a 81 ldd r21, Y+2 ; 0x02 2ad2a: 6b 81 ldd r22, Y+3 ; 0x03 2ad2c: 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; 2ad2e: 87 89 ldd r24, Z+23 ; 0x17 2ad30: 80 31 cpi r24, 0x10 ; 16 2ad32: f1 f4 brne .+60 ; 0x2ad70 2ad34: 81 e0 ldi r24, 0x01 ; 1 2ad36: 48 3f cpi r20, 0xF8 ; 248 2ad38: 5f 4f sbci r21, 0xFF ; 255 2ad3a: 61 05 cpc r22, r1 2ad3c: 71 05 cpc r23, r1 2ad3e: b0 f2 brcs .-84 ; 0x2acec *size = s; 2ad40: f5 01 movw r30, r10 2ad42: c0 82 st Z, r12 2ad44: d1 82 std Z+1, r13 ; 0x01 2ad46: e2 82 std Z+2, r14 ; 0x02 2ad48: f3 82 std Z+3, r15 ; 0x03 return true; fail: return false; } 2ad4a: 0f 90 pop r0 2ad4c: 0f 90 pop r0 2ad4e: 0f 90 pop r0 2ad50: 0f 90 pop r0 2ad52: df 91 pop r29 2ad54: cf 91 pop r28 2ad56: 1f 91 pop r17 2ad58: 0f 91 pop r16 2ad5a: ff 90 pop r15 2ad5c: ef 90 pop r14 2ad5e: df 90 pop r13 2ad60: cf 90 pop r12 2ad62: bf 90 pop r11 2ad64: af 90 pop r10 2ad66: 7f 90 pop r7 2ad68: 6f 90 pop r6 2ad6a: 5f 90 pop r5 2ad6c: 4f 90 pop r4 2ad6e: 08 95 ret return cluster >= FAT32EOC_MIN; 2ad70: 81 e0 ldi r24, 0x01 ; 1 2ad72: 48 3f cpi r20, 0xF8 ; 248 2ad74: 5f 4f sbci r21, 0xFF ; 255 2ad76: 6f 4f sbci r22, 0xFF ; 255 2ad78: 7f 40 sbci r23, 0x0F ; 15 2ad7a: 08 f4 brcc .+2 ; 0x2ad7e 2ad7c: b7 cf rjmp .-146 ; 0x2acec 2ad7e: e0 cf rjmp .-64 ; 0x2ad40 0002ad80 : * \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) { 2ad80: 0f 93 push r16 2ad82: 1f 93 push r17 2ad84: cf 93 push r28 2ad86: df 93 push r29 // error if file is already open if (isOpen()) goto fail; 2ad88: fc 01 movw r30, r24 2ad8a: 23 81 ldd r18, Z+3 ; 0x03 2ad8c: 22 23 and r18, r18 2ad8e: 31 f0 breq .+12 ; 0x2ad9c dirBlock_ = 0; dirIndex_ = 0; return true; fail: return false; 2ad90: 80 e0 ldi r24, 0x00 ; 0 } 2ad92: df 91 pop r29 2ad94: cf 91 pop r28 2ad96: 1f 91 pop r17 2ad98: 0f 91 pop r16 2ad9a: 08 95 ret 2ad9c: 8b 01 movw r16, r22 2ad9e: ec 01 movw r28, r24 2ada0: fb 01 movw r30, r22 2ada2: 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)) { 2ada4: 80 31 cpi r24, 0x10 ; 16 2ada6: 39 f5 brne .+78 ; 0x2adf6 type_ = FAT_FILE_TYPE_ROOT_FIXED; 2ada8: 82 e0 ldi r24, 0x02 ; 2 2adaa: 8b 83 std Y+3, r24 ; 0x03 firstCluster_ = 0; 2adac: 1d 8a std Y+21, r1 ; 0x15 2adae: 1e 8a std Y+22, r1 ; 0x16 2adb0: 1f 8a std Y+23, r1 ; 0x17 2adb2: 18 8e std Y+24, r1 ; 0x18 fileSize_ = 32 * vol->rootDirEntryCount(); 2adb4: 80 8d ldd r24, Z+24 ; 0x18 2adb6: 91 8d ldd r25, Z+25 ; 0x19 2adb8: b0 e0 ldi r27, 0x00 ; 0 2adba: a0 e0 ldi r26, 0x00 ; 0 2adbc: 25 e0 ldi r18, 0x05 ; 5 2adbe: 88 0f add r24, r24 2adc0: 99 1f adc r25, r25 2adc2: aa 1f adc r26, r26 2adc4: bb 1f adc r27, r27 2adc6: 2a 95 dec r18 2adc8: d1 f7 brne .-12 ; 0x2adbe 2adca: 89 8b std Y+17, r24 ; 0x11 2adcc: 9a 8b std Y+18, r25 ; 0x12 2adce: ab 8b std Y+19, r26 ; 0x13 2add0: 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; 2add2: 1a 8f std Y+26, r17 ; 0x1a 2add4: 09 8f std Y+25, r16 ; 0x19 // read only flags_ = O_READ; 2add6: 81 e0 ldi r24, 0x01 ; 1 2add8: 89 83 std Y+1, r24 ; 0x01 // set to start of file curCluster_ = 0; 2adda: 1c 82 std Y+4, r1 ; 0x04 2addc: 1d 82 std Y+5, r1 ; 0x05 2adde: 1e 82 std Y+6, r1 ; 0x06 2ade0: 1f 82 std Y+7, r1 ; 0x07 curPosition_ = 0; 2ade2: 18 86 std Y+8, r1 ; 0x08 2ade4: 19 86 std Y+9, r1 ; 0x09 2ade6: 1a 86 std Y+10, r1 ; 0x0a 2ade8: 1b 86 std Y+11, r1 ; 0x0b // root has no directory entry dirBlock_ = 0; 2adea: 1c 86 std Y+12, r1 ; 0x0c 2adec: 1d 86 std Y+13, r1 ; 0x0d 2adee: 1e 86 std Y+14, r1 ; 0x0e 2adf0: 1f 86 std Y+15, r1 ; 0x0f dirIndex_ = 0; 2adf2: 18 8a std Y+16, r1 ; 0x10 2adf4: ce cf rjmp .-100 ; 0x2ad92 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) { 2adf6: 80 32 cpi r24, 0x20 ; 32 2adf8: 59 f6 brne .-106 ; 0x2ad90 type_ = FAT_FILE_TYPE_ROOT32; 2adfa: 83 e0 ldi r24, 0x03 ; 3 2adfc: 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_;} 2adfe: 42 8d ldd r20, Z+26 ; 0x1a 2ae00: 53 8d ldd r21, Z+27 ; 0x1b 2ae02: 64 8d ldd r22, Z+28 ; 0x1c 2ae04: 75 8d ldd r23, Z+29 ; 0x1d firstCluster_ = vol->rootDirStart(); 2ae06: 4d 8b std Y+21, r20 ; 0x15 2ae08: 5e 8b std Y+22, r21 ; 0x16 2ae0a: 6f 8b std Y+23, r22 ; 0x17 2ae0c: 78 8f std Y+24, r23 ; 0x18 if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail; 2ae0e: 9e 01 movw r18, r28 2ae10: 2f 5e subi r18, 0xEF ; 239 2ae12: 3f 4f sbci r19, 0xFF ; 255 2ae14: c8 01 movw r24, r16 2ae16: 0f 94 56 56 call 0x2acac ; 0x2acac 2ae1a: 81 11 cpse r24, r1 2ae1c: da cf rjmp .-76 ; 0x2add2 2ae1e: b8 cf rjmp .-144 ; 0x2ad90 0002ae20 : vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; } return true; } bool SdFile::gfComputeNextFileBlock() { 2ae20: cf 92 push r12 2ae22: df 92 push r13 2ae24: ef 92 push r14 2ae26: ff 92 push r15 2ae28: 1f 93 push r17 2ae2a: cf 93 push r28 2ae2c: df 93 push r29 2ae2e: ec 01 movw r28, r24 2ae30: eb 81 ldd r30, Y+3 ; 0x03 // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) return false; 2ae32: e1 11 cpse r30, r1 2ae34: 09 c0 rjmp .+18 ; 0x2ae48 2ae36: 80 e0 ldi r24, 0x00 ; 0 } } gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster; } return true; } 2ae38: df 91 pop r29 2ae3a: cf 91 pop r28 2ae3c: 1f 91 pop r17 2ae3e: ff 90 pop r15 2ae40: ef 90 pop r14 2ae42: df 90 pop r13 2ae44: cf 90 pop r12 2ae46: 08 95 ret return true; } bool SdFile::gfComputeNextFileBlock() { // error if not open or write only if (!isOpen() || !(flags_ & O_READ)) return false; 2ae48: 89 81 ldd r24, Y+1 ; 0x01 2ae4a: 80 ff sbrs r24, 0 2ae4c: f4 cf rjmp .-24 ; 0x2ae36 gfOffset = curPosition_ & 0X1FF; // offset in block 2ae4e: 48 85 ldd r20, Y+8 ; 0x08 2ae50: 59 85 ldd r21, Y+9 ; 0x09 2ae52: 6a 85 ldd r22, Y+10 ; 0x0a 2ae54: 7b 85 ldd r23, Y+11 ; 0x0b 2ae56: 9a 01 movw r18, r20 2ae58: 31 70 andi r19, 0x01 ; 1 2ae5a: 3a a3 std Y+34, r19 ; 0x22 2ae5c: 29 a3 std Y+33, r18 ; 0x21 2ae5e: 89 8d ldd r24, Y+25 ; 0x19 2ae60: 9a 8d ldd r25, Y+26 ; 0x1a 2ae62: 6a 01 movw r12, r20 2ae64: 7b 01 movw r14, r22 2ae66: f9 e0 ldi r31, 0x09 ; 9 2ae68: f6 94 lsr r15 2ae6a: e7 94 ror r14 2ae6c: d7 94 ror r13 2ae6e: c7 94 ror r12 2ae70: fa 95 dec r31 2ae72: d1 f7 brne .-12 ; 0x2ae68 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 2ae74: e2 30 cpi r30, 0x02 ; 2 2ae76: 79 f4 brne .+30 ; 0x2ae96 // 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); 2ae78: fc 01 movw r30, r24 2ae7a: 82 8d ldd r24, Z+26 ; 0x1a 2ae7c: 93 8d ldd r25, Z+27 ; 0x1b 2ae7e: a4 8d ldd r26, Z+28 ; 0x1c 2ae80: b5 8d ldd r27, Z+29 ; 0x1d 2ae82: 8c 0d add r24, r12 2ae84: 9d 1d adc r25, r13 2ae86: ae 1d adc r26, r14 2ae88: bf 1d adc r27, r15 } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return false; } } gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster; 2ae8a: 8d 8f std Y+29, r24 ; 0x1d 2ae8c: 9e 8f std Y+30, r25 ; 0x1e 2ae8e: af 8f std Y+31, r26 ; 0x1f 2ae90: b8 a3 std Y+32, r27 ; 0x20 } return true; 2ae92: 81 e0 ldi r24, 0x01 ; 1 2ae94: d1 cf rjmp .-94 ; 0x2ae38 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);} 2ae96: fc 01 movw r30, r24 2ae98: 14 81 ldd r17, Z+4 ; 0x04 2ae9a: 11 50 subi r17, 0x01 ; 1 2ae9c: 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) { 2ae9e: 23 2b or r18, r19 2aea0: 71 f4 brne .+28 ; 0x2aebe 2aea2: 11 11 cpse r17, r1 2aea4: 0c c0 rjmp .+24 ; 0x2aebe // start of new cluster if (curPosition_ == 0) { 2aea6: 45 2b or r20, r21 2aea8: 46 2b or r20, r22 2aeaa: 47 2b or r20, r23 2aeac: 31 f5 brne .+76 ; 0x2aefa // use first cluster in file curCluster_ = firstCluster_; 2aeae: 8d 89 ldd r24, Y+21 ; 0x15 2aeb0: 9e 89 ldd r25, Y+22 ; 0x16 2aeb2: af 89 ldd r26, Y+23 ; 0x17 2aeb4: b8 8d ldd r27, Y+24 ; 0x18 2aeb6: 8c 83 std Y+4, r24 ; 0x04 2aeb8: 9d 83 std Y+5, r25 ; 0x05 2aeba: ae 83 std Y+6, r26 ; 0x06 2aebc: 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; 2aebe: e9 8d ldd r30, Y+25 ; 0x19 2aec0: fa 8d ldd r31, Y+26 ; 0x1a uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 2aec2: 8c 81 ldd r24, Y+4 ; 0x04 2aec4: 9d 81 ldd r25, Y+5 ; 0x05 2aec6: ae 81 ldd r26, Y+6 ; 0x06 2aec8: bf 81 ldd r27, Y+7 ; 0x07 2aeca: 02 97 sbiw r24, 0x02 ; 2 2aecc: a1 09 sbc r26, r1 2aece: b1 09 sbc r27, r1 2aed0: 25 85 ldd r18, Z+13 ; 0x0d 2aed2: 04 c0 rjmp .+8 ; 0x2aedc 2aed4: 88 0f add r24, r24 2aed6: 99 1f adc r25, r25 2aed8: aa 1f adc r26, r26 2aeda: bb 1f adc r27, r27 2aedc: 2a 95 dec r18 2aede: d2 f7 brpl .-12 ; 0x2aed4 2aee0: 46 85 ldd r20, Z+14 ; 0x0e 2aee2: 57 85 ldd r21, Z+15 ; 0x0f 2aee4: 60 89 ldd r22, Z+16 ; 0x10 2aee6: 71 89 ldd r23, Z+17 ; 0x11 2aee8: 84 0f add r24, r20 2aeea: 95 1f adc r25, r21 2aeec: a6 1f adc r26, r22 2aeee: b7 1f adc r27, r23 2aef0: 81 0f add r24, r17 2aef2: 91 1d adc r25, r1 2aef4: a1 1d adc r26, r1 2aef6: b1 1d adc r27, r1 2aef8: c8 cf rjmp .-112 ; 0x2ae8a if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) return false; 2aefa: 4c 81 ldd r20, Y+4 ; 0x04 2aefc: 5d 81 ldd r21, Y+5 ; 0x05 2aefe: 6e 81 ldd r22, Y+6 ; 0x06 2af00: 7f 81 ldd r23, Y+7 ; 0x07 2af02: 9e 01 movw r18, r28 2af04: 2c 5f subi r18, 0xFC ; 252 2af06: 3f 4f sbci r19, 0xFF ; 255 2af08: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2af0c: 81 11 cpse r24, r1 2af0e: d7 cf rjmp .-82 ; 0x2aebe 2af10: 92 cf rjmp .-220 ; 0x2ae36 0002af12 : * \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) { 2af12: 8f 92 push r8 2af14: 9f 92 push r9 2af16: af 92 push r10 2af18: bf 92 push r11 2af1a: cf 92 push r12 2af1c: df 92 push r13 2af1e: ef 92 push r14 2af20: ff 92 push r15 2af22: 0f 93 push r16 2af24: 1f 93 push r17 2af26: cf 93 push r28 2af28: df 93 push r29 2af2a: ec 01 movw r28, r24 2af2c: 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; 2af2e: 81 11 cpse r24, r1 2af30: 0e c0 rjmp .+28 ; 0x2af4e done: return true; fail: return false; 2af32: 80 e0 ldi r24, 0x00 ; 0 } 2af34: df 91 pop r29 2af36: cf 91 pop r28 2af38: 1f 91 pop r17 2af3a: 0f 91 pop r16 2af3c: ff 90 pop r15 2af3e: ef 90 pop r14 2af40: df 90 pop r13 2af42: cf 90 pop r12 2af44: bf 90 pop r11 2af46: af 90 pop r10 2af48: 9f 90 pop r9 2af4a: 8f 90 pop r8 2af4c: 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; 2af4e: 09 89 ldd r16, Y+17 ; 0x11 2af50: 1a 89 ldd r17, Y+18 ; 0x12 2af52: 2b 89 ldd r18, Y+19 ; 0x13 2af54: 3c 89 ldd r19, Y+20 ; 0x14 2af56: 04 17 cp r16, r20 2af58: 15 07 cpc r17, r21 2af5a: 26 07 cpc r18, r22 2af5c: 37 07 cpc r19, r23 2af5e: 48 f3 brcs .-46 ; 0x2af32 2af60: 4a 01 movw r8, r20 2af62: 5b 01 movw r10, r22 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 2af64: 82 30 cpi r24, 0x02 ; 2 2af66: 31 f4 brne .+12 ; 0x2af74 curPosition_ = pos; 2af68: 88 86 std Y+8, r8 ; 0x08 2af6a: 99 86 std Y+9, r9 ; 0x09 2af6c: aa 86 std Y+10, r10 ; 0x0a 2af6e: bb 86 std Y+11, r11 ; 0x0b if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; } curPosition_ = pos; done: return true; 2af70: 81 e0 ldi r24, 0x01 ; 1 2af72: e0 cf rjmp .-64 ; 0x2af34 if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { curPosition_ = pos; goto done; } if (pos == 0) { 2af74: 81 14 cp r8, r1 2af76: 91 04 cpc r9, r1 2af78: a1 04 cpc r10, r1 2af7a: b1 04 cpc r11, r1 2af7c: 49 f4 brne .+18 ; 0x2af90 // set position to start of file curCluster_ = 0; 2af7e: 1c 82 std Y+4, r1 ; 0x04 2af80: 1d 82 std Y+5, r1 ; 0x05 2af82: 1e 82 std Y+6, r1 ; 0x06 2af84: 1f 82 std Y+7, r1 ; 0x07 curPosition_ = 0; 2af86: 18 86 std Y+8, r1 ; 0x08 2af88: 19 86 std Y+9, r1 ; 0x09 2af8a: 1a 86 std Y+10, r1 ; 0x0a 2af8c: 1b 86 std Y+11, r1 ; 0x0b 2af8e: f0 cf rjmp .-32 ; 0x2af70 goto done; } // calculate cluster index for cur and new position nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); 2af90: 08 85 ldd r16, Y+8 ; 0x08 2af92: 19 85 ldd r17, Y+9 ; 0x09 2af94: 2a 85 ldd r18, Y+10 ; 0x0a 2af96: 3b 85 ldd r19, Y+11 ; 0x0b 2af98: e9 8d ldd r30, Y+25 ; 0x19 2af9a: fa 8d ldd r31, Y+26 ; 0x1a 2af9c: 85 85 ldd r24, Z+13 ; 0x0d 2af9e: 90 e0 ldi r25, 0x00 ; 0 2afa0: 09 96 adiw r24, 0x09 ; 9 2afa2: b9 01 movw r22, r18 2afa4: a8 01 movw r20, r16 2afa6: 41 50 subi r20, 0x01 ; 1 2afa8: 51 09 sbc r21, r1 2afaa: 61 09 sbc r22, r1 2afac: 71 09 sbc r23, r1 2afae: 08 2e mov r0, r24 2afb0: 04 c0 rjmp .+8 ; 0x2afba 2afb2: 76 95 lsr r23 2afb4: 67 95 ror r22 2afb6: 57 95 ror r21 2afb8: 47 95 ror r20 2afba: 0a 94 dec r0 2afbc: d2 f7 brpl .-12 ; 0x2afb2 nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); 2afbe: 75 01 movw r14, r10 2afc0: 64 01 movw r12, r8 2afc2: e1 e0 ldi r30, 0x01 ; 1 2afc4: ce 1a sub r12, r30 2afc6: d1 08 sbc r13, r1 2afc8: e1 08 sbc r14, r1 2afca: f1 08 sbc r15, r1 2afcc: 04 c0 rjmp .+8 ; 0x2afd6 2afce: f6 94 lsr r15 2afd0: e7 94 ror r14 2afd2: d7 94 ror r13 2afd4: c7 94 ror r12 2afd6: 8a 95 dec r24 2afd8: d2 f7 brpl .-12 ; 0x2afce if (nNew < nCur || curPosition_ == 0) { 2afda: c4 16 cp r12, r20 2afdc: d5 06 cpc r13, r21 2afde: e6 06 cpc r14, r22 2afe0: f7 06 cpc r15, r23 2afe2: 20 f0 brcs .+8 ; 0x2afec 2afe4: 01 2b or r16, r17 2afe6: 02 2b or r16, r18 2afe8: 03 2b or r16, r19 2afea: 11 f5 brne .+68 ; 0x2b030 // must follow chain from first cluster curCluster_ = firstCluster_; 2afec: 8d 89 ldd r24, Y+21 ; 0x15 2afee: 9e 89 ldd r25, Y+22 ; 0x16 2aff0: af 89 ldd r26, Y+23 ; 0x17 2aff2: b8 8d ldd r27, Y+24 ; 0x18 2aff4: 8c 83 std Y+4, r24 ; 0x04 2aff6: 9d 83 std Y+5, r25 ; 0x05 2aff8: ae 83 std Y+6, r26 ; 0x06 2affa: bf 83 std Y+7, r27 ; 0x07 } else { // advance from curPosition nNew -= nCur; } while (nNew--) { if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 2affc: 8e 01 movw r16, r28 2affe: 0c 5f subi r16, 0xFC ; 252 2b000: 1f 4f sbci r17, 0xFF ; 255 curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; } while (nNew--) { 2b002: c1 14 cp r12, r1 2b004: d1 04 cpc r13, r1 2b006: e1 04 cpc r14, r1 2b008: f1 04 cpc r15, r1 2b00a: 09 f4 brne .+2 ; 0x2b00e 2b00c: ad cf rjmp .-166 ; 0x2af68 if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 2b00e: 4c 81 ldd r20, Y+4 ; 0x04 2b010: 5d 81 ldd r21, Y+5 ; 0x05 2b012: 6e 81 ldd r22, Y+6 ; 0x06 2b014: 7f 81 ldd r23, Y+7 ; 0x07 2b016: 98 01 movw r18, r16 2b018: 89 8d ldd r24, Y+25 ; 0x19 2b01a: 9a 8d ldd r25, Y+26 ; 0x1a 2b01c: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2b020: 91 e0 ldi r25, 0x01 ; 1 2b022: c9 1a sub r12, r25 2b024: d1 08 sbc r13, r1 2b026: e1 08 sbc r14, r1 2b028: f1 08 sbc r15, r1 2b02a: 81 11 cpse r24, r1 2b02c: ea cf rjmp .-44 ; 0x2b002 2b02e: 81 cf rjmp .-254 ; 0x2af32 if (nNew < nCur || curPosition_ == 0) { // must follow chain from first cluster curCluster_ = firstCluster_; } else { // advance from curPosition nNew -= nCur; 2b030: c4 1a sub r12, r20 2b032: d5 0a sbc r13, r21 2b034: e6 0a sbc r14, r22 2b036: f7 0a sbc r15, r23 2b038: e1 cf rjmp .-62 ; 0x2affc 0002b03a : 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() { 2b03a: 3f 92 push r3 2b03c: 4f 92 push r4 2b03e: 5f 92 push r5 2b040: 6f 92 push r6 2b042: 7f 92 push r7 2b044: 8f 92 push r8 2b046: 9f 92 push r9 2b048: af 92 push r10 2b04a: bf 92 push r11 2b04c: cf 92 push r12 2b04e: df 92 push r13 2b050: ef 92 push r14 2b052: ff 92 push r15 2b054: 0f 93 push r16 2b056: 1f 93 push r17 2b058: cf 93 push r28 2b05a: df 93 push r29 2b05c: cd b7 in r28, 0x3d ; 61 2b05e: de b7 in r29, 0x3e ; 62 2b060: 2c 97 sbiw r28, 0x0c ; 12 2b062: 0f b6 in r0, 0x3f ; 63 2b064: f8 94 cli 2b066: de bf out 0x3e, r29 ; 62 2b068: 0f be out 0x3f, r0 ; 63 2b06a: cd bf out 0x3d, r28 ; 61 2b06c: 5c 01 movw r10, r24 if (!vol_->allocContiguous(1, &curCluster_)) goto fail; 2b06e: dc 01 movw r26, r24 2b070: 59 96 adiw r26, 0x19 ; 25 2b072: 8d 90 ld r8, X+ 2b074: 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; 2b076: f4 01 movw r30, r8 2b078: 81 85 ldd r24, Z+9 ; 0x09 2b07a: 92 85 ldd r25, Z+10 ; 0x0a 2b07c: a3 85 ldd r26, Z+11 ; 0x0b 2b07e: b4 85 ldd r27, Z+12 ; 0x0c 2b080: 9c 01 movw r18, r24 2b082: ad 01 movw r20, r26 2b084: 2f 5f subi r18, 0xFF ; 255 2b086: 3f 4f sbci r19, 0xFF ; 255 2b088: 4f 4f sbci r20, 0xFF ; 255 2b08a: 5f 4f sbci r21, 0xFF ; 255 2b08c: 29 87 std Y+9, r18 ; 0x09 2b08e: 3a 87 std Y+10, r19 ; 0x0a 2b090: 4b 87 std Y+11, r20 ; 0x0b 2b092: 5c 87 std Y+12, r21 ; 0x0c // flag to save place to start next search bool setStart; // set search start cluster if (*curCluster) { 2b094: d5 01 movw r26, r10 2b096: 14 96 adiw r26, 0x04 ; 4 2b098: 4d 90 ld r4, X+ 2b09a: 5d 90 ld r5, X+ 2b09c: 6d 90 ld r6, X+ 2b09e: 7c 90 ld r7, X 2b0a0: 17 97 sbiw r26, 0x07 ; 7 2b0a2: 41 14 cp r4, r1 2b0a4: 51 04 cpc r5, r1 2b0a6: 61 04 cpc r6, r1 2b0a8: 71 04 cpc r7, r1 2b0aa: 09 f4 brne .+2 ; 0x2b0ae 2b0ac: 59 c0 rjmp .+178 ; 0x2b160 // try to make file contiguous bgnCluster = *curCluster + 1; 2b0ae: bf ef ldi r27, 0xFF ; 255 2b0b0: 4b 1a sub r4, r27 2b0b2: 5b 0a sbc r5, r27 2b0b4: 6b 0a sbc r6, r27 2b0b6: 7b 0a sbc r7, r27 // don't save new start location setStart = false; 2b0b8: 31 2c mov r3, r1 // save next search start if one cluster setStart = count == 1; } // end of group endCluster = bgnCluster; 2b0ba: 73 01 movw r14, r6 2b0bc: 62 01 movw r12, r4 // search the FAT for free clusters for (uint32_t n = 0;; n++, endCluster++) { 2b0be: 1d 82 std Y+5, r1 ; 0x05 2b0c0: 1e 82 std Y+6, r1 ; 0x06 2b0c2: 1f 82 std Y+7, r1 ; 0x07 2b0c4: 18 86 std Y+8, r1 ; 0x08 // can't find space checked all clusters if (n >= clusterCount_) goto fail; 2b0c6: f4 01 movw r30, r8 2b0c8: 81 85 ldd r24, Z+9 ; 0x09 2b0ca: 92 85 ldd r25, Z+10 ; 0x0a 2b0cc: a3 85 ldd r26, Z+11 ; 0x0b 2b0ce: b4 85 ldd r27, Z+12 ; 0x0c 2b0d0: 2d 81 ldd r18, Y+5 ; 0x05 2b0d2: 3e 81 ldd r19, Y+6 ; 0x06 2b0d4: 4f 81 ldd r20, Y+7 ; 0x07 2b0d6: 58 85 ldd r21, Y+8 ; 0x08 2b0d8: 28 17 cp r18, r24 2b0da: 39 07 cpc r19, r25 2b0dc: 4a 07 cpc r20, r26 2b0de: 5b 07 cpc r21, r27 2b0e0: 08 f0 brcs .+2 ; 0x2b0e4 2b0e2: 56 c0 rjmp .+172 ; 0x2b190 // past end - start from beginning of FAT if (endCluster > fatEnd) { 2b0e4: 89 85 ldd r24, Y+9 ; 0x09 2b0e6: 9a 85 ldd r25, Y+10 ; 0x0a 2b0e8: ab 85 ldd r26, Y+11 ; 0x0b 2b0ea: bc 85 ldd r27, Y+12 ; 0x0c 2b0ec: 8c 15 cp r24, r12 2b0ee: 9d 05 cpc r25, r13 2b0f0: ae 05 cpc r26, r14 2b0f2: bf 05 cpc r27, r15 2b0f4: 50 f4 brcc .+20 ; 0x2b10a bgnCluster = endCluster = 2; 2b0f6: 82 e0 ldi r24, 0x02 ; 2 2b0f8: c8 2e mov r12, r24 2b0fa: d1 2c mov r13, r1 2b0fc: e1 2c mov r14, r1 2b0fe: f1 2c mov r15, r1 2b100: 92 e0 ldi r25, 0x02 ; 2 2b102: 49 2e mov r4, r25 2b104: 51 2c mov r5, r1 2b106: 61 2c mov r6, r1 2b108: 71 2c mov r7, r1 } uint32_t f; if (!fatGet(endCluster, &f)) goto fail; 2b10a: 9e 01 movw r18, r28 2b10c: 2f 5f subi r18, 0xFF ; 255 2b10e: 3f 4f sbci r19, 0xFF ; 255 2b110: b7 01 movw r22, r14 2b112: a6 01 movw r20, r12 2b114: c4 01 movw r24, r8 2b116: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2b11a: 88 23 and r24, r24 2b11c: c9 f1 breq .+114 ; 0x2b190 if (f != 0) { 2b11e: 89 81 ldd r24, Y+1 ; 0x01 2b120: 9a 81 ldd r25, Y+2 ; 0x02 2b122: ab 81 ldd r26, Y+3 ; 0x03 2b124: bc 81 ldd r27, Y+4 ; 0x04 2b126: 89 2b or r24, r25 2b128: 8a 2b or r24, r26 2b12a: 8b 2b or r24, r27 2b12c: 01 f1 breq .+64 ; 0x2b16e // cluster in use try next cluster as bgnCluster bgnCluster = endCluster + 1; 2b12e: 26 01 movw r4, r12 2b130: 37 01 movw r6, r14 2b132: 9f ef ldi r25, 0xFF ; 255 2b134: 49 1a sub r4, r25 2b136: 59 0a sbc r5, r25 2b138: 69 0a sbc r6, r25 2b13a: 79 0a sbc r7, r25 } // end of group endCluster = bgnCluster; // search the FAT for free clusters for (uint32_t n = 0;; n++, endCluster++) { 2b13c: 2d 81 ldd r18, Y+5 ; 0x05 2b13e: 3e 81 ldd r19, Y+6 ; 0x06 2b140: 4f 81 ldd r20, Y+7 ; 0x07 2b142: 58 85 ldd r21, Y+8 ; 0x08 2b144: 2f 5f subi r18, 0xFF ; 255 2b146: 3f 4f sbci r19, 0xFF ; 255 2b148: 4f 4f sbci r20, 0xFF ; 255 2b14a: 5f 4f sbci r21, 0xFF ; 255 2b14c: 2d 83 std Y+5, r18 ; 0x05 2b14e: 3e 83 std Y+6, r19 ; 0x06 2b150: 4f 83 std Y+7, r20 ; 0x07 2b152: 58 87 std Y+8, r21 ; 0x08 2b154: 3f ef ldi r19, 0xFF ; 255 2b156: c3 1a sub r12, r19 2b158: d3 0a sbc r13, r19 2b15a: e3 0a sbc r14, r19 2b15c: f3 0a sbc r15, r19 2b15e: b3 cf rjmp .-154 ; 0x2b0c6 // don't save new start location setStart = false; } else { // start at likely place for free cluster bgnCluster = allocSearchStart_; 2b160: 40 80 ld r4, Z 2b162: 51 80 ldd r5, Z+1 ; 0x01 2b164: 62 80 ldd r6, Z+2 ; 0x02 2b166: 73 80 ldd r7, Z+3 ; 0x03 // save next search start if one cluster setStart = count == 1; 2b168: 33 24 eor r3, r3 2b16a: 33 94 inc r3 2b16c: a6 cf rjmp .-180 ; 0x2b0ba 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) { 2b16e: c4 14 cp r12, r4 2b170: d5 04 cpc r13, r5 2b172: e6 04 cpc r14, r6 2b174: f7 04 cpc r15, r7 2b176: 11 f7 brne .-60 ; 0x2b13c 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); 2b178: 0f ef ldi r16, 0xFF ; 255 2b17a: 1f ef ldi r17, 0xFF ; 255 2b17c: 2f ef ldi r18, 0xFF ; 255 2b17e: 3f e0 ldi r19, 0x0F ; 15 2b180: b7 01 movw r22, r14 2b182: a6 01 movw r20, r12 2b184: c4 01 movw r24, r8 2b186: 0f 94 41 55 call 0x2aa82 ; 0x2aa82 2b18a: 78 2e mov r7, r24 // done - found space break; } } // mark end of chain if (!fatPutEOC(endCluster)) goto fail; 2b18c: 81 11 cpse r24, r1 2b18e: 1a c0 rjmp .+52 ; 0x2b1c4 flags_ |= F_FILE_DIR_DIRTY; } return true; fail: return false; 2b190: 71 2c mov r7, r1 } 2b192: 87 2d mov r24, r7 2b194: 2c 96 adiw r28, 0x0c ; 12 2b196: 0f b6 in r0, 0x3f ; 63 2b198: f8 94 cli 2b19a: de bf out 0x3e, r29 ; 62 2b19c: 0f be out 0x3f, r0 ; 63 2b19e: cd bf out 0x3d, r28 ; 61 2b1a0: df 91 pop r29 2b1a2: cf 91 pop r28 2b1a4: 1f 91 pop r17 2b1a6: 0f 91 pop r16 2b1a8: ff 90 pop r15 2b1aa: ef 90 pop r14 2b1ac: df 90 pop r13 2b1ae: cf 90 pop r12 2b1b0: bf 90 pop r11 2b1b2: af 90 pop r10 2b1b4: 9f 90 pop r9 2b1b6: 8f 90 pop r8 2b1b8: 7f 90 pop r7 2b1ba: 6f 90 pop r6 2b1bc: 5f 90 pop r5 2b1be: 4f 90 pop r4 2b1c0: 3f 90 pop r3 2b1c2: 08 95 ret // link clusters while (endCluster > bgnCluster) { if (!fatPut(endCluster - 1, endCluster)) goto fail; endCluster--; } if (*curCluster != 0) { 2b1c4: f5 01 movw r30, r10 2b1c6: 44 81 ldd r20, Z+4 ; 0x04 2b1c8: 55 81 ldd r21, Z+5 ; 0x05 2b1ca: 66 81 ldd r22, Z+6 ; 0x06 2b1cc: 77 81 ldd r23, Z+7 ; 0x07 2b1ce: 41 15 cp r20, r1 2b1d0: 51 05 cpc r21, r1 2b1d2: 61 05 cpc r22, r1 2b1d4: 71 05 cpc r23, r1 2b1d6: 39 f0 breq .+14 ; 0x2b1e6 // connect chains if (!fatPut(*curCluster, bgnCluster)) goto fail; 2b1d8: 97 01 movw r18, r14 2b1da: 86 01 movw r16, r12 2b1dc: c4 01 movw r24, r8 2b1de: 0f 94 41 55 call 0x2aa82 ; 0x2aa82 2b1e2: 88 23 and r24, r24 2b1e4: a9 f2 breq .-86 ; 0x2b190 } // return first cluster number to caller *curCluster = bgnCluster; 2b1e6: d5 01 movw r26, r10 2b1e8: 14 96 adiw r26, 0x04 ; 4 2b1ea: cd 92 st X+, r12 2b1ec: dd 92 st X+, r13 2b1ee: ed 92 st X+, r14 2b1f0: fc 92 st X, r15 2b1f2: 17 97 sbiw r26, 0x07 ; 7 // remember possible next free cluster if (setStart) allocSearchStart_ = bgnCluster + 1; 2b1f4: 33 20 and r3, r3 2b1f6: 51 f0 breq .+20 ; 0x2b20c 2b1f8: d7 01 movw r26, r14 2b1fa: c6 01 movw r24, r12 2b1fc: 01 96 adiw r24, 0x01 ; 1 2b1fe: a1 1d adc r26, r1 2b200: b1 1d adc r27, r1 2b202: f4 01 movw r30, r8 2b204: 80 83 st Z, r24 2b206: 91 83 std Z+1, r25 ; 0x01 2b208: a2 83 std Z+2, r26 ; 0x02 2b20a: 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) { 2b20c: f5 01 movw r30, r10 2b20e: 85 89 ldd r24, Z+21 ; 0x15 2b210: 96 89 ldd r25, Z+22 ; 0x16 2b212: a7 89 ldd r26, Z+23 ; 0x17 2b214: b0 8d ldd r27, Z+24 ; 0x18 2b216: 89 2b or r24, r25 2b218: 8a 2b or r24, r26 2b21a: 8b 2b or r24, r27 2b21c: 09 f0 breq .+2 ; 0x2b220 2b21e: b9 cf rjmp .-142 ; 0x2b192 firstCluster_ = curCluster_; 2b220: c5 8a std Z+21, r12 ; 0x15 2b222: d6 8a std Z+22, r13 ; 0x16 2b224: e7 8a std Z+23, r14 ; 0x17 2b226: f0 8e std Z+24, r15 ; 0x18 flags_ |= F_FILE_DIR_DIRTY; 2b228: 81 81 ldd r24, Z+1 ; 0x01 2b22a: 80 68 ori r24, 0x80 ; 128 2b22c: 81 83 std Z+1, r24 ; 0x01 2b22e: b1 cf rjmp .-158 ; 0x2b192 0002b230 : return false; } //------------------------------------------------------------------------------ // cache a file's directory entry // return pointer to cached entry or null for failure dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { 2b230: cf 93 push r28 2b232: df 93 push r29 2b234: ec 01 movw r28, r24 if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail; 2b236: 46 2f mov r20, r22 2b238: 41 70 andi r20, 0x01 ; 1 2b23a: 6c 85 ldd r22, Y+12 ; 0x0c 2b23c: 7d 85 ldd r23, Y+13 ; 0x0d 2b23e: 8e 85 ldd r24, Y+14 ; 0x0e 2b240: 9f 85 ldd r25, Y+15 ; 0x0f 2b242: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2b246: 88 23 and r24, r24 2b248: 51 f0 breq .+20 ; 0x2b25e return vol_->cache()->dir + dirIndex_; 2b24a: 88 89 ldd r24, Y+16 ; 0x10 2b24c: 20 e2 ldi r18, 0x20 ; 32 2b24e: 82 9f mul r24, r18 2b250: c0 01 movw r24, r0 2b252: 11 24 eor r1, r1 2b254: 84 56 subi r24, 0x64 ; 100 2b256: 91 4f sbci r25, 0xF1 ; 241 fail: return 0; } 2b258: df 91 pop r29 2b25a: cf 91 pop r28 2b25c: 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; 2b25e: 90 e0 ldi r25, 0x00 ; 0 2b260: 80 e0 ldi r24, 0x00 ; 0 2b262: fa cf rjmp .-12 ; 0x2b258 0002b264 : * \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() { 2b264: cf 93 push r28 2b266: df 93 push r29 2b268: ec 01 movw r28, r24 // only allow open files and directories if (!isOpen()) goto fail; 2b26a: 8b 81 ldd r24, Y+3 ; 0x03 2b26c: 88 23 and r24, r24 2b26e: 49 f1 breq .+82 ; 0x2b2c2 if (flags_ & F_FILE_DIR_DIRTY) { 2b270: 89 81 ldd r24, Y+1 ; 0x01 2b272: 87 ff sbrs r24, 7 2b274: 22 c0 rjmp .+68 ; 0x2b2ba dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 2b276: 61 e0 ldi r22, 0x01 ; 1 2b278: ce 01 movw r24, r28 2b27a: 0f 94 18 59 call 0x2b230 ; 0x2b230 2b27e: fc 01 movw r30, r24 // check for deleted by another open file object if (!d || d->name[0] == DIR_NAME_DELETED) goto fail; 2b280: 89 2b or r24, r25 2b282: f9 f0 breq .+62 ; 0x2b2c2 2b284: 80 81 ld r24, Z 2b286: 85 3e cpi r24, 0xE5 ; 229 2b288: e1 f0 breq .+56 ; 0x2b2c2 // do not set filesize for dir files if (!isDir()) d->fileSize = fileSize_; 2b28a: 8b 81 ldd r24, Y+3 ; 0x03 2b28c: 82 30 cpi r24, 0x02 ; 2 2b28e: 40 f4 brcc .+16 ; 0x2b2a0 2b290: 89 89 ldd r24, Y+17 ; 0x11 2b292: 9a 89 ldd r25, Y+18 ; 0x12 2b294: ab 89 ldd r26, Y+19 ; 0x13 2b296: bc 89 ldd r27, Y+20 ; 0x14 2b298: 84 8f std Z+28, r24 ; 0x1c 2b29a: 95 8f std Z+29, r25 ; 0x1d 2b29c: a6 8f std Z+30, r26 ; 0x1e 2b29e: b7 8f std Z+31, r27 ; 0x1f // update first cluster fields d->firstClusterLow = firstCluster_ & 0XFFFF; 2b2a0: 8d 89 ldd r24, Y+21 ; 0x15 2b2a2: 9e 89 ldd r25, Y+22 ; 0x16 2b2a4: 93 8f std Z+27, r25 ; 0x1b 2b2a6: 82 8f std Z+26, r24 ; 0x1a d->firstClusterHigh = firstCluster_ >> 16; 2b2a8: 8d 89 ldd r24, Y+21 ; 0x15 2b2aa: 9e 89 ldd r25, Y+22 ; 0x16 2b2ac: af 89 ldd r26, Y+23 ; 0x17 2b2ae: b8 8d ldd r27, Y+24 ; 0x18 2b2b0: b5 8b std Z+21, r27 ; 0x15 2b2b2: 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; 2b2b4: 89 81 ldd r24, Y+1 ; 0x01 2b2b6: 8f 77 andi r24, 0x7F ; 127 2b2b8: 89 83 std Y+1, r24 ; 0x01 return vol_->cacheFlush(); fail: writeError = true; return false; } 2b2ba: df 91 pop r29 2b2bc: cf 91 pop r28 d->lastAccessDate = d->lastWriteDate; } // clear directory dirty flags_ &= ~F_FILE_DIR_DIRTY; } return vol_->cacheFlush(); 2b2be: 0d 94 0c 54 jmp 0x2a818 ; 0x2a818 fail: writeError = true; 2b2c2: 81 e0 ldi r24, 0x01 ; 1 2b2c4: 88 83 st Y, r24 return false; } 2b2c6: 80 e0 ldi r24, 0x00 ; 0 2b2c8: df 91 pop r29 2b2ca: cf 91 pop r28 2b2cc: 08 95 ret 0002b2ce : * * \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() { 2b2ce: cf 93 push r28 2b2d0: df 93 push r29 2b2d2: ec 01 movw r28, r24 bool rtn = sync(); 2b2d4: 0f 94 32 59 call 0x2b264 ; 0x2b264 type_ = FAT_FILE_TYPE_CLOSED; 2b2d8: 1b 82 std Y+3, r1 ; 0x03 return rtn; } 2b2da: df 91 pop r29 2b2dc: cf 91 pop r28 2b2de: 08 95 ret 0002b2e0 : * \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) { 2b2e0: cf 93 push r28 2b2e2: df 93 push r29 2b2e4: eb 01 movw r28, r22 2b2e6: fc 01 movw r30, r24 2b2e8: 23 81 ldd r18, Z+3 ; 0x03 if (!isOpen()) return false; 2b2ea: 21 11 cpse r18, r1 2b2ec: 04 c0 rjmp .+8 ; 0x2b2f6 2b2ee: 80 e0 ldi r24, 0x00 ; 0 if (!p) return false; // format name dirName(*p, name); return true; } 2b2f0: df 91 pop r29 2b2f2: cf 91 pop r28 2b2f4: 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; 2b2f6: 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()) { 2b2f8: 22 30 cpi r18, 0x02 ; 2 2b2fa: 28 f4 brcc .+10 ; 0x2b306 name[0] = '/'; 2b2fc: 8f e2 ldi r24, 0x2F ; 47 2b2fe: 88 83 st Y, r24 name[1] = '\0'; 2b300: 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; 2b302: 81 e0 ldi r24, 0x01 ; 1 2b304: f5 cf rjmp .-22 ; 0x2b2f0 name[0] = '/'; name[1] = '\0'; return true; } // cache entry dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); 2b306: 60 e0 ldi r22, 0x00 ; 0 2b308: 0f 94 18 59 call 0x2b230 ; 0x2b230 if (!p) return false; 2b30c: 00 97 sbiw r24, 0x00 ; 0 2b30e: 79 f3 breq .-34 ; 0x2b2ee 2b310: 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; 2b312: 60 e0 ldi r22, 0x00 ; 0 for (uint8_t i = 0; i < 11; i++) { 2b314: 80 e0 ldi r24, 0x00 ; 0 if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; 2b316: 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; 2b318: 2d 91 ld r18, X+ 2b31a: 20 32 cpi r18, 0x20 ; 32 2b31c: 99 f0 breq .+38 ; 0x2b344 if (i == 8) name[j++] = '.'; 2b31e: 88 30 cpi r24, 0x08 ; 8 2b320: 31 f4 brne .+12 ; 0x2b32e 2b322: 9e 01 movw r18, r28 2b324: 26 0f add r18, r22 2b326: 31 1d adc r19, r1 2b328: f9 01 movw r30, r18 2b32a: 90 83 st Z, r25 2b32c: 6f 5f subi r22, 0xFF ; 255 name[j++] = dir.name[i]; 2b32e: 9e 01 movw r18, r28 2b330: 26 0f add r18, r22 2b332: 31 1d adc r19, r1 2b334: ad 01 movw r20, r26 2b336: 41 50 subi r20, 0x01 ; 1 2b338: 51 09 sbc r21, r1 2b33a: fa 01 movw r30, r20 2b33c: 40 81 ld r20, Z 2b33e: f9 01 movw r30, r18 2b340: 40 83 st Z, r20 2b342: 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++) { 2b344: 8f 5f subi r24, 0xFF ; 255 2b346: 8b 30 cpi r24, 0x0B ; 11 2b348: 39 f7 brne .-50 ; 0x2b318 if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; } name[j] = 0; 2b34a: fe 01 movw r30, r28 2b34c: e6 0f add r30, r22 2b34e: f1 1d adc r31, r1 2b350: 10 82 st Z, r1 2b352: d7 cf rjmp .-82 ; 0x2b302 0002b354 : * 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) { 2b354: 2f 92 push r2 2b356: 3f 92 push r3 2b358: 4f 92 push r4 2b35a: 5f 92 push r5 2b35c: 6f 92 push r6 2b35e: 7f 92 push r7 2b360: 8f 92 push r8 2b362: 9f 92 push r9 2b364: af 92 push r10 2b366: bf 92 push r11 2b368: cf 92 push r12 2b36a: df 92 push r13 2b36c: ef 92 push r14 2b36e: ff 92 push r15 2b370: 0f 93 push r16 2b372: 1f 93 push r17 2b374: cf 93 push r28 2b376: df 93 push r29 2b378: 00 d0 rcall .+0 ; 0x2b37a 2b37a: 1f 92 push r1 2b37c: cd b7 in r28, 0x3d ; 61 2b37e: de b7 in r29, 0x3e ; 62 2b380: 9c 83 std Y+4, r25 ; 0x04 2b382: 8b 83 std Y+3, r24 ; 0x03 2b384: 4b 01 movw r8, r22 2b386: 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; 2b388: dc 01 movw r26, r24 2b38a: 13 96 adiw r26, 0x03 ; 3 2b38c: 8c 91 ld r24, X 2b38e: 81 11 cpse r24, r1 2b390: 19 c0 rjmp .+50 ; 0x2b3c4 toRead -= n; } return nbyte; fail: return -1; 2b392: 8f ef ldi r24, 0xFF ; 255 2b394: 9f ef ldi r25, 0xFF ; 255 } 2b396: 0f 90 pop r0 2b398: 0f 90 pop r0 2b39a: 0f 90 pop r0 2b39c: 0f 90 pop r0 2b39e: df 91 pop r29 2b3a0: cf 91 pop r28 2b3a2: 1f 91 pop r17 2b3a4: 0f 91 pop r16 2b3a6: ff 90 pop r15 2b3a8: ef 90 pop r14 2b3aa: df 90 pop r13 2b3ac: cf 90 pop r12 2b3ae: bf 90 pop r11 2b3b0: af 90 pop r10 2b3b2: 9f 90 pop r9 2b3b4: 8f 90 pop r8 2b3b6: 7f 90 pop r7 2b3b8: 6f 90 pop r6 2b3ba: 5f 90 pop r5 2b3bc: 4f 90 pop r4 2b3be: 3f 90 pop r3 2b3c0: 2f 90 pop r2 2b3c2: 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; 2b3c4: eb 81 ldd r30, Y+3 ; 0x03 2b3c6: fc 81 ldd r31, Y+4 ; 0x04 2b3c8: 81 81 ldd r24, Z+1 ; 0x01 2b3ca: 80 ff sbrs r24, 0 2b3cc: e2 cf rjmp .-60 ; 0x2b392 // max bytes left in file if (nbyte >= (fileSize_ - curPosition_)) { 2b3ce: 01 89 ldd r16, Z+17 ; 0x11 2b3d0: 12 89 ldd r17, Z+18 ; 0x12 2b3d2: 23 89 ldd r18, Z+19 ; 0x13 2b3d4: 34 89 ldd r19, Z+20 ; 0x14 2b3d6: 40 85 ldd r20, Z+8 ; 0x08 2b3d8: 51 85 ldd r21, Z+9 ; 0x09 2b3da: 62 85 ldd r22, Z+10 ; 0x0a 2b3dc: 73 85 ldd r23, Z+11 ; 0x0b 2b3de: c7 01 movw r24, r14 2b3e0: b0 e0 ldi r27, 0x00 ; 0 2b3e2: a0 e0 ldi r26, 0x00 ; 0 2b3e4: 28 01 movw r4, r16 2b3e6: 39 01 movw r6, r18 2b3e8: 44 1a sub r4, r20 2b3ea: 55 0a sbc r5, r21 2b3ec: 66 0a sbc r6, r22 2b3ee: 77 0a sbc r7, r23 2b3f0: 84 15 cp r24, r4 2b3f2: 95 05 cpc r25, r5 2b3f4: a6 05 cpc r26, r6 2b3f6: b7 05 cpc r27, r7 2b3f8: 18 f0 brcs .+6 ; 0x2b400 nbyte = fileSize_ - curPosition_; 2b3fa: 78 01 movw r14, r16 2b3fc: e4 1a sub r14, r20 2b3fe: f5 0a sbc r15, r21 } // amount left to read toRead = nbyte; 2b400: 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; 2b402: 8b 81 ldd r24, Y+3 ; 0x03 2b404: 9c 81 ldd r25, Y+4 ; 0x04 2b406: 04 96 adiw r24, 0x04 ; 4 2b408: 9a 83 std Y+2, r25 ; 0x02 2b40a: 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; 2b40c: 61 2c mov r6, r1 2b40e: 32 e0 ldi r19, 0x02 ; 2 2b410: 73 2e mov r7, r19 if (nbyte >= (fileSize_ - curPosition_)) { nbyte = fileSize_ - curPosition_; } // amount left to read toRead = nbyte; while (toRead > 0) { 2b412: c1 14 cp r12, r1 2b414: d1 04 cpc r13, r1 2b416: 09 f4 brne .+2 ; 0x2b41a 2b418: b7 c0 rjmp .+366 ; 0x2b588 offset = curPosition_ & 0X1FF; // offset in block 2b41a: ab 81 ldd r26, Y+3 ; 0x03 2b41c: bc 81 ldd r27, Y+4 ; 0x04 2b41e: 18 96 adiw r26, 0x08 ; 8 2b420: 4d 91 ld r20, X+ 2b422: 5d 91 ld r21, X+ 2b424: 6d 91 ld r22, X+ 2b426: 7c 91 ld r23, X 2b428: 1b 97 sbiw r26, 0x0b ; 11 2b42a: 5a 01 movw r10, r20 2b42c: b1 e0 ldi r27, 0x01 ; 1 2b42e: bb 22 and r11, r27 2b430: eb 81 ldd r30, Y+3 ; 0x03 2b432: fc 81 ldd r31, Y+4 ; 0x04 2b434: 81 8d ldd r24, Z+25 ; 0x19 2b436: 92 8d ldd r25, Z+26 ; 0x1a 2b438: 1a 01 movw r2, r20 2b43a: 2b 01 movw r4, r22 2b43c: 29 e0 ldi r18, 0x09 ; 9 2b43e: 56 94 lsr r5 2b440: 47 94 ror r4 2b442: 37 94 ror r3 2b444: 27 94 ror r2 2b446: 2a 95 dec r18 2b448: d1 f7 brne .-12 ; 0x2b43e if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { 2b44a: 23 81 ldd r18, Z+3 ; 0x03 2b44c: 22 30 cpi r18, 0x02 ; 2 2b44e: 91 f5 brne .+100 ; 0x2b4b4 block = vol_->rootDirStart() + (curPosition_ >> 9); 2b450: dc 01 movw r26, r24 2b452: 5a 96 adiw r26, 0x1a ; 26 2b454: 6d 91 ld r22, X+ 2b456: 7d 91 ld r23, X+ 2b458: 8d 91 ld r24, X+ 2b45a: 9c 91 ld r25, X 2b45c: 5d 97 sbiw r26, 0x1d ; 29 2b45e: 62 0d add r22, r2 2b460: 73 1d adc r23, r3 2b462: 84 1d adc r24, r4 2b464: 95 1d adc r25, r5 2b466: 83 01 movw r16, r6 2b468: 0a 19 sub r16, r10 2b46a: 1b 09 sbc r17, r11 2b46c: c0 16 cp r12, r16 2b46e: d1 06 cpc r13, r17 2b470: 08 f4 brcc .+2 ; 0x2b474 2b472: 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()) { 2b474: 01 15 cp r16, r1 2b476: b2 e0 ldi r27, 0x02 ; 2 2b478: 1b 07 cpc r17, r27 2b47a: 71 f4 brne .+28 ; 0x2b498 2b47c: 20 91 90 0e lds r18, 0x0E90 ; 0x800e90 2b480: 30 91 91 0e lds r19, 0x0E91 ; 0x800e91 2b484: 40 91 92 0e lds r20, 0x0E92 ; 0x800e92 2b488: 50 91 93 0e lds r21, 0x0E93 ; 0x800e93 2b48c: 62 17 cp r22, r18 2b48e: 73 07 cpc r23, r19 2b490: 84 07 cpc r24, r20 2b492: 95 07 cpc r25, r21 2b494: 09 f0 breq .+2 ; 0x2b498 2b496: 59 c0 rjmp .+178 ; 0x2b54a 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; 2b498: 40 e0 ldi r20, 0x00 ; 0 2b49a: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2b49e: 88 23 and r24, r24 2b4a0: 09 f4 brne .+2 ; 0x2b4a4 2b4a2: 77 cf rjmp .-274 ; 0x2b392 uint8_t* src = vol_->cache()->data + offset; 2b4a4: b5 01 movw r22, r10 2b4a6: 64 56 subi r22, 0x64 ; 100 2b4a8: 71 4f sbci r23, 0xF1 ; 241 memcpy(dst, src, n); 2b4aa: a8 01 movw r20, r16 2b4ac: c4 01 movw r24, r8 2b4ae: 0f 94 39 e2 call 0x3c472 ; 0x3c472 2b4b2: 57 c0 rjmp .+174 ; 0x2b562 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);} 2b4b4: fc 01 movw r30, r24 2b4b6: 14 81 ldd r17, Z+4 ; 0x04 2b4b8: 11 50 subi r17, 0x01 ; 1 2b4ba: 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) { 2b4bc: a1 14 cp r10, r1 2b4be: b1 04 cpc r11, r1 2b4c0: 81 f4 brne .+32 ; 0x2b4e2 2b4c2: 11 11 cpse r17, r1 2b4c4: 0e c0 rjmp .+28 ; 0x2b4e2 // start of new cluster if (curPosition_ == 0) { 2b4c6: 45 2b or r20, r21 2b4c8: 46 2b or r20, r22 2b4ca: 47 2b or r20, r23 2b4cc: 79 f5 brne .+94 ; 0x2b52c // use first cluster in file curCluster_ = firstCluster_; 2b4ce: eb 81 ldd r30, Y+3 ; 0x03 2b4d0: fc 81 ldd r31, Y+4 ; 0x04 2b4d2: 85 89 ldd r24, Z+21 ; 0x15 2b4d4: 96 89 ldd r25, Z+22 ; 0x16 2b4d6: a7 89 ldd r26, Z+23 ; 0x17 2b4d8: b0 8d ldd r27, Z+24 ; 0x18 2b4da: 84 83 std Z+4, r24 ; 0x04 2b4dc: 95 83 std Z+5, r25 ; 0x05 2b4de: a6 83 std Z+6, r26 ; 0x06 2b4e0: 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; 2b4e2: ab 81 ldd r26, Y+3 ; 0x03 2b4e4: bc 81 ldd r27, Y+4 ; 0x04 2b4e6: 59 96 adiw r26, 0x19 ; 25 2b4e8: ed 91 ld r30, X+ 2b4ea: fc 91 ld r31, X 2b4ec: 5a 97 sbiw r26, 0x1a ; 26 uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 2b4ee: 14 96 adiw r26, 0x04 ; 4 2b4f0: 6d 91 ld r22, X+ 2b4f2: 7d 91 ld r23, X+ 2b4f4: 8d 91 ld r24, X+ 2b4f6: 9c 91 ld r25, X 2b4f8: 17 97 sbiw r26, 0x07 ; 7 2b4fa: 62 50 subi r22, 0x02 ; 2 2b4fc: 71 09 sbc r23, r1 2b4fe: 81 09 sbc r24, r1 2b500: 91 09 sbc r25, r1 2b502: 25 85 ldd r18, Z+13 ; 0x0d 2b504: 04 c0 rjmp .+8 ; 0x2b50e 2b506: 66 0f add r22, r22 2b508: 77 1f adc r23, r23 2b50a: 88 1f adc r24, r24 2b50c: 99 1f adc r25, r25 2b50e: 2a 95 dec r18 2b510: d2 f7 brpl .-12 ; 0x2b506 2b512: 26 85 ldd r18, Z+14 ; 0x0e 2b514: 37 85 ldd r19, Z+15 ; 0x0f 2b516: 40 89 ldd r20, Z+16 ; 0x10 2b518: 51 89 ldd r21, Z+17 ; 0x11 2b51a: 62 0f add r22, r18 2b51c: 73 1f adc r23, r19 2b51e: 84 1f adc r24, r20 2b520: 95 1f adc r25, r21 2b522: 61 0f add r22, r17 2b524: 71 1d adc r23, r1 2b526: 81 1d adc r24, r1 2b528: 91 1d adc r25, r1 2b52a: 9d cf rjmp .-198 ; 0x2b466 if (curPosition_ == 0) { // use first cluster in file curCluster_ = firstCluster_; } else { // get next cluster from FAT if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail; 2b52c: ab 81 ldd r26, Y+3 ; 0x03 2b52e: bc 81 ldd r27, Y+4 ; 0x04 2b530: 14 96 adiw r26, 0x04 ; 4 2b532: 4d 91 ld r20, X+ 2b534: 5d 91 ld r21, X+ 2b536: 6d 91 ld r22, X+ 2b538: 7c 91 ld r23, X 2b53a: 17 97 sbiw r26, 0x07 ; 7 2b53c: 29 81 ldd r18, Y+1 ; 0x01 2b53e: 3a 81 ldd r19, Y+2 ; 0x02 2b540: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2b544: 81 11 cpse r24, r1 2b546: cd cf rjmp .-102 ; 0x2b4e2 2b548: 24 cf rjmp .-440 ; 0x2b392 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);} 2b54a: 94 01 movw r18, r8 2b54c: ab 01 movw r20, r22 2b54e: bc 01 movw r22, r24 2b550: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 2b554: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 2b558: 0f 94 4b 54 call 0x2a896 ; 0x2a896 // 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; 2b55c: 88 23 and r24, r24 2b55e: 09 f4 brne .+2 ; 0x2b562 2b560: 18 cf rjmp .-464 ; 0x2b392 // 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; 2b562: 80 0e add r8, r16 2b564: 91 1e adc r9, r17 curPosition_ += n; 2b566: eb 81 ldd r30, Y+3 ; 0x03 2b568: fc 81 ldd r31, Y+4 ; 0x04 2b56a: 80 85 ldd r24, Z+8 ; 0x08 2b56c: 91 85 ldd r25, Z+9 ; 0x09 2b56e: a2 85 ldd r26, Z+10 ; 0x0a 2b570: b3 85 ldd r27, Z+11 ; 0x0b 2b572: 80 0f add r24, r16 2b574: 91 1f adc r25, r17 2b576: a1 1d adc r26, r1 2b578: b1 1d adc r27, r1 2b57a: 80 87 std Z+8, r24 ; 0x08 2b57c: 91 87 std Z+9, r25 ; 0x09 2b57e: a2 87 std Z+10, r26 ; 0x0a 2b580: b3 87 std Z+11, r27 ; 0x0b toRead -= n; 2b582: c0 1a sub r12, r16 2b584: d1 0a sbc r13, r17 2b586: 45 cf rjmp .-374 ; 0x2b412 } return nbyte; 2b588: c7 01 movw r24, r14 2b58a: 05 cf rjmp .-502 ; 0x2b396 0002b58c : * 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) { 2b58c: df 92 push r13 2b58e: ef 92 push r14 2b590: ff 92 push r15 2b592: 0f 93 push r16 2b594: 1f 93 push r17 2b596: cf 93 push r28 2b598: df 93 push r29 2b59a: 8c 01 movw r16, r24 2b59c: eb 01 movw r28, r22 2b59e: 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; 2b5a0: 8d e0 ldi r24, 0x0D ; 13 2b5a2: d8 2e mov r13, r24 { longFilename[0] = '\0'; } while (1) { n = read(dir, sizeof(dir_t)); 2b5a4: 40 e2 ldi r20, 0x20 ; 32 2b5a6: 50 e0 ldi r21, 0x00 ; 0 2b5a8: be 01 movw r22, r28 2b5aa: c8 01 movw r24, r16 2b5ac: 0f 94 aa 59 call 0x2b354 ; 0x2b354 if (n != sizeof(dir_t)) return n == 0 ? 0 : -1; 2b5b0: 80 32 cpi r24, 0x20 ; 32 2b5b2: 91 05 cpc r25, r1 2b5b4: 71 f0 breq .+28 ; 0x2b5d2 2b5b6: 21 e0 ldi r18, 0x01 ; 1 2b5b8: 89 2b or r24, r25 2b5ba: 09 f4 brne .+2 ; 0x2b5be 2b5bc: 20 e0 ldi r18, 0x00 ; 0 2b5be: 82 2f mov r24, r18 2b5c0: 81 95 neg r24 } } // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; } } 2b5c2: df 91 pop r29 2b5c4: cf 91 pop r28 2b5c6: 1f 91 pop r17 2b5c8: 0f 91 pop r16 2b5ca: ff 90 pop r15 2b5cc: ef 90 pop r14 2b5ce: df 90 pop r13 2b5d0: 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; 2b5d2: 28 81 ld r18, Y 2b5d4: 22 23 and r18, r18 2b5d6: 09 f4 brne .+2 ; 0x2b5da 2b5d8: 3f c0 rjmp .+126 ; 0x2b658 // skip empty entries and entry for . and .. if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue; 2b5da: 25 3e cpi r18, 0xE5 ; 229 2b5dc: 19 f3 breq .-58 ; 0x2b5a4 2b5de: 2e 32 cpi r18, 0x2E ; 46 2b5e0: 09 f3 breq .-62 ; 0x2b5a4 //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) 2b5e2: 3b 85 ldd r19, Y+11 ; 0x0b 2b5e4: 3f 73 andi r19, 0x3F ; 63 2b5e6: 3f 30 cpi r19, 0x0F ; 15 2b5e8: 99 f5 brne .+102 ; 0x2b650 2b5ea: e1 14 cp r14, r1 2b5ec: f1 04 cpc r15, r1 2b5ee: 81 f1 breq .+96 ; 0x2b650 { 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) 2b5f0: 4a 8d ldd r20, Y+26 ; 0x1a 2b5f2: 5b 8d ldd r21, Y+27 ; 0x1b 2b5f4: 45 2b or r20, r21 2b5f6: 61 f5 brne .+88 ; 0x2b650 2b5f8: 2f 71 andi r18, 0x1F ; 31 2b5fa: 3f ef ldi r19, 0xFF ; 255 2b5fc: 32 0f add r19, r18 2b5fe: 34 30 cpi r19, 0x04 ; 4 2b600: 38 f5 brcc .+78 ; 0x2b650 { //TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table. n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13; 2b602: 21 50 subi r18, 0x01 ; 1 2b604: 33 0b sbc r19, r19 2b606: d2 9e mul r13, r18 2b608: c0 01 movw r24, r0 2b60a: d3 9e mul r13, r19 2b60c: 90 0d add r25, r0 2b60e: 11 24 eor r1, r1 longFilename[n+0] = VFAT->name1[0]; 2b610: f7 01 movw r30, r14 2b612: e8 0f add r30, r24 2b614: f9 1f adc r31, r25 2b616: 29 81 ldd r18, Y+1 ; 0x01 2b618: 20 83 st Z, r18 longFilename[n+1] = VFAT->name1[1]; 2b61a: 2b 81 ldd r18, Y+3 ; 0x03 2b61c: 21 83 std Z+1, r18 ; 0x01 longFilename[n+2] = VFAT->name1[2]; 2b61e: 2d 81 ldd r18, Y+5 ; 0x05 2b620: 22 83 std Z+2, r18 ; 0x02 longFilename[n+3] = VFAT->name1[3]; 2b622: 2f 81 ldd r18, Y+7 ; 0x07 2b624: 23 83 std Z+3, r18 ; 0x03 longFilename[n+4] = VFAT->name1[4]; 2b626: 29 85 ldd r18, Y+9 ; 0x09 2b628: 24 83 std Z+4, r18 ; 0x04 longFilename[n+5] = VFAT->name2[0]; 2b62a: 2e 85 ldd r18, Y+14 ; 0x0e 2b62c: 25 83 std Z+5, r18 ; 0x05 longFilename[n+6] = VFAT->name2[1]; 2b62e: 28 89 ldd r18, Y+16 ; 0x10 2b630: 26 83 std Z+6, r18 ; 0x06 longFilename[n+7] = VFAT->name2[2]; 2b632: 2a 89 ldd r18, Y+18 ; 0x12 2b634: 27 83 std Z+7, r18 ; 0x07 longFilename[n+8] = VFAT->name2[3]; 2b636: 2c 89 ldd r18, Y+20 ; 0x14 2b638: 20 87 std Z+8, r18 ; 0x08 longFilename[n+9] = VFAT->name2[4]; 2b63a: 2e 89 ldd r18, Y+22 ; 0x16 2b63c: 21 87 std Z+9, r18 ; 0x09 longFilename[n+10] = VFAT->name2[5]; 2b63e: 28 8d ldd r18, Y+24 ; 0x18 2b640: 22 87 std Z+10, r18 ; 0x0a longFilename[n+11] = VFAT->name3[0]; 2b642: 2c 8d ldd r18, Y+28 ; 0x1c 2b644: 23 87 std Z+11, r18 ; 0x0b longFilename[n+12] = VFAT->name3[1]; 2b646: 2e 8d ldd r18, Y+30 ; 0x1e 2b648: 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) 2b64a: 28 81 ld r18, Y 2b64c: 26 fd sbrc r18, 6 longFilename[n+13] = '\0'; 2b64e: 15 86 std Z+13, r1 ; 0x0d } } // return if normal file or subdirectory if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; 2b650: 2b 85 ldd r18, Y+11 ; 0x0b 2b652: 23 fd sbrc r18, 3 2b654: a7 cf rjmp .-178 ; 0x2b5a4 2b656: b5 cf rjmp .-150 ; 0x2b5c2 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; 2b658: 80 e0 ldi r24, 0x00 ; 0 2b65a: b3 cf rjmp .-154 ; 0x2b5c2 0002b65c : return false; } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { 2b65c: 4f 92 push r4 2b65e: 5f 92 push r5 2b660: 6f 92 push r6 2b662: 7f 92 push r7 2b664: af 92 push r10 2b666: bf 92 push r11 2b668: cf 92 push r12 2b66a: df 92 push r13 2b66c: ef 92 push r14 2b66e: ff 92 push r15 2b670: 0f 93 push r16 2b672: 1f 93 push r17 2b674: cf 93 push r28 2b676: df 93 push r29 2b678: 1f 92 push r1 2b67a: cd b7 in r28, 0x3d ; 61 2b67c: de b7 in r29, 0x3e ; 62 2b67e: 8c 01 movw r16, r24 2b680: 7b 01 movw r14, r22 2b682: 5a 01 movw r10, r20 2b684: c2 2e mov r12, r18 bool emptyFound = false; bool fileFound = false; uint8_t index; dir_t* p; vol_ = dirFile->vol_; 2b686: db 01 movw r26, r22 2b688: 59 96 adiw r26, 0x19 ; 25 2b68a: 8d 91 ld r24, X+ 2b68c: 9c 91 ld r25, X 2b68e: f8 01 movw r30, r16 2b690: 92 8f std Z+26, r25 ; 0x1a 2b692: 81 8f std Z+25, r24 ; 0x19 dirFile->rewind(); 2b694: cb 01 movw r24, r22 2b696: 0e 94 c4 76 call 0xed88 ; 0xed88 } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { bool emptyFound = false; 2b69a: 71 2c mov r7, r1 vol_ = dirFile->vol_; dirFile->rewind(); // search for file while (dirFile->curPosition_ < dirFile->fileSize_) { 2b69c: f7 01 movw r30, r14 2b69e: 80 85 ldd r24, Z+8 ; 0x08 2b6a0: 91 85 ldd r25, Z+9 ; 0x09 2b6a2: a2 85 ldd r26, Z+10 ; 0x0a 2b6a4: b3 85 ldd r27, Z+11 ; 0x0b 2b6a6: 41 89 ldd r20, Z+17 ; 0x11 2b6a8: 52 89 ldd r21, Z+18 ; 0x12 2b6aa: 63 89 ldd r22, Z+19 ; 0x13 2b6ac: 74 89 ldd r23, Z+20 ; 0x14 2b6ae: 84 17 cp r24, r20 2b6b0: 95 07 cpc r25, r21 2b6b2: a6 07 cpc r26, r22 2b6b4: b7 07 cpc r27, r23 2b6b6: 08 f0 brcs .+2 ; 0x2b6ba 2b6b8: 52 c0 rjmp .+164 ; 0x2b75e index = 0XF & (dirFile->curPosition_ >> 5); 2b6ba: 55 e0 ldi r21, 0x05 ; 5 2b6bc: b6 95 lsr r27 2b6be: a7 95 ror r26 2b6c0: 97 95 ror r25 2b6c2: 87 95 ror r24 2b6c4: 5a 95 dec r21 2b6c6: d1 f7 brne .-12 ; 0x2b6bc 2b6c8: f8 2f mov r31, r24 2b6ca: ff 70 andi r31, 0x0F ; 15 2b6cc: 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; 2b6ce: d7 01 movw r26, r14 2b6d0: 13 96 adiw r26, 0x03 ; 3 2b6d2: 8c 91 ld r24, X 2b6d4: 82 30 cpi r24, 0x02 ; 2 2b6d6: 10 f4 brcc .+4 ; 0x2b6dc if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; fail: type_ = FAT_FILE_TYPE_CLOSED; return false; 2b6d8: 80 e0 ldi r24, 0x00 ; 0 2b6da: db c0 rjmp .+438 ; 0x2b892 * \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; 2b6dc: 41 e0 ldi r20, 0x01 ; 1 2b6de: 50 e0 ldi r21, 0x00 ; 0 2b6e0: be 01 movw r22, r28 2b6e2: 6f 5f subi r22, 0xFF ; 255 2b6e4: 7f 4f sbci r23, 0xFF ; 255 2b6e6: c7 01 movw r24, r14 2b6e8: 0f 94 aa 59 call 0x2b354 ; 0x2b354 2b6ec: 01 97 sbiw r24, 0x01 ; 1 2b6ee: a1 f7 brne .-24 ; 0x2b6d8 // use read to locate and cache block if (read() < 0) goto fail; // advance to next entry curPosition_ += 31; 2b6f0: f7 01 movw r30, r14 2b6f2: 80 85 ldd r24, Z+8 ; 0x08 2b6f4: 91 85 ldd r25, Z+9 ; 0x09 2b6f6: a2 85 ldd r26, Z+10 ; 0x0a 2b6f8: b3 85 ldd r27, Z+11 ; 0x0b 2b6fa: 4f 96 adiw r24, 0x1f ; 31 2b6fc: a1 1d adc r26, r1 2b6fe: b1 1d adc r27, r1 2b700: 80 87 std Z+8, r24 ; 0x08 2b702: 91 87 std Z+9, r25 ; 0x09 2b704: a2 87 std Z+10, r26 ; 0x0a 2b706: b3 87 std Z+11, r27 ; 0x0b // return pointer to entry return vol_->cache()->dir + i; 2b708: f0 e2 ldi r31, 0x20 ; 32 2b70a: df 9e mul r13, r31 2b70c: b0 01 movw r22, r0 2b70e: 11 24 eor r1, r1 2b710: 64 56 subi r22, 0x64 ; 100 2b712: 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; 2b714: 61 15 cp r22, r1 2b716: 71 05 cpc r23, r1 2b718: f9 f2 breq .-66 ; 0x2b6d8 if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { 2b71a: db 01 movw r26, r22 2b71c: 8c 91 ld r24, X 2b71e: 88 23 and r24, r24 2b720: 41 f0 breq .+16 ; 0x2b732 2b722: 85 3e cpi r24, 0xE5 ; 229 2b724: 09 f0 breq .+2 ; 0x2b728 2b726: 4c c0 rjmp .+152 ; 0x2b7c0 // remember first empty slot if (!emptyFound) { 2b728: 77 20 and r7, r7 2b72a: 29 f0 breq .+10 ; 0x2b736 return false; } //------------------------------------------------------------------------------ // open with filename in dname bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { 2b72c: 77 24 eor r7, r7 2b72e: 73 94 inc r7 2b730: b5 cf rjmp .-150 ; 0x2b69c 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) { 2b732: 71 10 cpse r7, r1 2b734: 0e c0 rjmp .+28 ; 0x2b752 dirBlock_ = dirFile->vol_->cacheBlockNumber(); 2b736: 80 91 90 0e lds r24, 0x0E90 ; 0x800e90 2b73a: 90 91 91 0e lds r25, 0x0E91 ; 0x800e91 2b73e: a0 91 92 0e lds r26, 0x0E92 ; 0x800e92 2b742: b0 91 93 0e lds r27, 0x0E93 ; 0x800e93 2b746: f8 01 movw r30, r16 2b748: 84 87 std Z+12, r24 ; 0x0c 2b74a: 95 87 std Z+13, r25 ; 0x0d 2b74c: a6 87 std Z+14, r26 ; 0x0e 2b74e: b7 87 std Z+15, r27 ; 0x0f dirIndex_ = index; 2b750: d0 8a std Z+16, r13 ; 0x10 emptyFound = true; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; 2b752: db 01 movw r26, r22 2b754: 8c 91 ld r24, X 2b756: 81 11 cpse r24, r1 2b758: e9 cf rjmp .-46 ; 0x2b72c 2b75a: 77 24 eor r7, r7 2b75c: 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; 2b75e: 8c 2d mov r24, r12 2b760: 82 74 andi r24, 0x42 ; 66 2b762: 82 34 cpi r24, 0x42 ; 66 2b764: 09 f0 breq .+2 ; 0x2b768 2b766: b8 cf rjmp .-144 ; 0x2b6d8 if (emptyFound) { 2b768: 77 20 and r7, r7 2b76a: 09 f4 brne .+2 ; 0x2b76e 2b76c: a2 c0 rjmp .+324 ; 0x2b8b2 index = dirIndex_; 2b76e: f8 01 movw r30, r16 2b770: d0 88 ldd r13, Z+16 ; 0x10 p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); 2b772: 61 e0 ldi r22, 0x01 ; 1 2b774: c8 01 movw r24, r16 2b776: 0f 94 18 59 call 0x2b230 ; 0x2b230 if (!p) goto fail; 2b77a: 00 97 sbiw r24, 0x00 ; 0 2b77c: 09 f4 brne .+2 ; 0x2b780 2b77e: ac cf rjmp .-168 ; 0x2b6d8 // use first entry in cluster p = dirFile->vol_->cache()->dir; index = 0; } // initialize as empty file memset(p, 0, sizeof(dir_t)); 2b780: 20 e2 ldi r18, 0x20 ; 32 2b782: dc 01 movw r26, r24 2b784: 1d 92 st X+, r1 2b786: 2a 95 dec r18 2b788: e9 f7 brne .-6 ; 0x2b784 memcpy(p->name, dname, 11); 2b78a: 2b e0 ldi r18, 0x0B ; 11 2b78c: f5 01 movw r30, r10 2b78e: dc 01 movw r26, r24 2b790: 01 90 ld r0, Z+ 2b792: 0d 92 st X+, r0 2b794: 2a 95 dec r18 2b796: e1 f7 brne .-8 ; 0x2b790 if (dateTime_) { // call user date/time function dateTime_(&p->creationDate, &p->creationTime); } else { // use default date/time p->creationDate = FAT_DEFAULT_DATE; 2b798: 21 e2 ldi r18, 0x21 ; 33 2b79a: 38 e2 ldi r19, 0x28 ; 40 2b79c: fc 01 movw r30, r24 2b79e: 31 8b std Z+17, r19 ; 0x11 2b7a0: 20 8b std Z+16, r18 ; 0x10 p->creationTime = FAT_DEFAULT_TIME; 2b7a2: 40 e0 ldi r20, 0x00 ; 0 2b7a4: 58 e0 ldi r21, 0x08 ; 8 2b7a6: 57 87 std Z+15, r21 ; 0x0f 2b7a8: 46 87 std Z+14, r20 ; 0x0e } p->lastAccessDate = p->creationDate; 2b7aa: 33 8b std Z+19, r19 ; 0x13 2b7ac: 22 8b std Z+18, r18 ; 0x12 p->lastWriteDate = p->creationDate; 2b7ae: 31 8f std Z+25, r19 ; 0x19 2b7b0: 20 8f std Z+24, r18 ; 0x18 p->lastWriteTime = p->creationTime; 2b7b2: 57 8b std Z+23, r21 ; 0x17 2b7b4: 46 8b std Z+22, r20 ; 0x16 // write entry to SD if (!dirFile->vol_->cacheFlush()) goto fail; 2b7b6: 0f 94 0c 54 call 0x2a818 ; 0x2a818 2b7ba: 81 11 cpse r24, r1 2b7bc: 09 c0 rjmp .+18 ; 0x2b7d0 2b7be: 8c cf rjmp .-232 ; 0x2b6d8 dirIndex_ = index; emptyFound = true; } // done if no entries follow if (p->name[0] == DIR_NAME_FREE) break; } else if (!memcmp(dname, p->name, 11)) { 2b7c0: 4b e0 ldi r20, 0x0B ; 11 2b7c2: 50 e0 ldi r21, 0x00 ; 0 2b7c4: c5 01 movw r24, r10 2b7c6: 0f 94 2c e2 call 0x3c458 ; 0x3c458 2b7ca: 89 2b or r24, r25 2b7cc: 09 f0 breq .+2 ; 0x2b7d0 2b7ce: 66 cf rjmp .-308 ; 0x2b69c } //------------------------------------------------------------------------------ // 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]; 2b7d0: f0 e2 ldi r31, 0x20 ; 32 2b7d2: df 9e mul r13, r31 2b7d4: d0 01 movw r26, r0 2b7d6: 11 24 eor r1, r1 2b7d8: 9d 01 movw r18, r26 2b7da: 24 56 subi r18, 0x64 ; 100 2b7dc: 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)) { 2b7de: f9 01 movw r30, r18 2b7e0: 83 85 ldd r24, Z+11 ; 0x0b 2b7e2: 81 71 andi r24, 0x11 ; 17 2b7e4: 21 f0 breq .+8 ; 0x2b7ee if (oflag & (O_WRITE | O_TRUNC)) goto fail; 2b7e6: 8c 2d mov r24, r12 2b7e8: 82 71 andi r24, 0x12 ; 18 2b7ea: 09 f0 breq .+2 ; 0x2b7ee 2b7ec: fc c0 rjmp .+504 ; 0x2b9e6 } //------------------------------------------------------------------------------ // 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]; 2b7ee: f8 01 movw r30, r16 2b7f0: 81 8d ldd r24, Z+25 ; 0x19 2b7f2: 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(); 2b7f4: 40 91 90 0e lds r20, 0x0E90 ; 0x800e90 2b7f8: 50 91 91 0e lds r21, 0x0E91 ; 0x800e91 2b7fc: 60 91 92 0e lds r22, 0x0E92 ; 0x800e92 2b800: 70 91 93 0e lds r23, 0x0E93 ; 0x800e93 2b804: 44 87 std Z+12, r20 ; 0x0c 2b806: 55 87 std Z+13, r21 ; 0x0d 2b808: 66 87 std Z+14, r22 ; 0x0e 2b80a: 77 87 std Z+15, r23 ; 0x0f dirIndex_ = dirIndex; 2b80c: d0 8a std Z+16, r13 ; 0x10 // copy first cluster number for directory fields firstCluster_ = (uint32_t)p->firstClusterHigh << 16; 2b80e: fd 01 movw r30, r26 2b810: e4 56 subi r30, 0x64 ; 100 2b812: f1 4f sbci r31, 0xF1 ; 241 2b814: 44 88 ldd r4, Z+20 ; 0x14 2b816: 55 88 ldd r5, Z+21 ; 0x15 2b818: 71 2c mov r7, r1 2b81a: 61 2c mov r6, r1 2b81c: 32 01 movw r6, r4 2b81e: 55 24 eor r5, r5 2b820: 44 24 eor r4, r4 2b822: d8 01 movw r26, r16 2b824: 55 96 adiw r26, 0x15 ; 21 2b826: 4d 92 st X+, r4 2b828: 5d 92 st X+, r5 2b82a: 6d 92 st X+, r6 2b82c: 7c 92 st X, r7 2b82e: 58 97 sbiw r26, 0x18 ; 24 firstCluster_ |= p->firstClusterLow; 2b830: 42 8d ldd r20, Z+26 ; 0x1a 2b832: 53 8d ldd r21, Z+27 ; 0x1b 2b834: 70 e0 ldi r23, 0x00 ; 0 2b836: 60 e0 ldi r22, 0x00 ; 0 2b838: 44 29 or r20, r4 2b83a: 55 29 or r21, r5 2b83c: 66 29 or r22, r6 2b83e: 77 29 or r23, r7 2b840: 55 96 adiw r26, 0x15 ; 21 2b842: 4d 93 st X+, r20 2b844: 5d 93 st X+, r21 2b846: 6d 93 st X+, r22 2b848: 7c 93 st X, r23 2b84a: 58 97 sbiw r26, 0x18 ; 24 2b84c: d9 01 movw r26, r18 2b84e: 1b 96 adiw r26, 0x0b ; 11 2b850: 2c 91 ld r18, X 2b852: 28 71 andi r18, 0x18 ; 24 // make sure it is a normal file or subdirectory if (DIR_IS_FILE(p)) { 2b854: 09 f0 breq .+2 ; 0x2b858 2b856: b9 c0 rjmp .+370 ; 0x2b9ca fileSize_ = p->fileSize; 2b858: 84 8d ldd r24, Z+28 ; 0x1c 2b85a: 95 8d ldd r25, Z+29 ; 0x1d 2b85c: a6 8d ldd r26, Z+30 ; 0x1e 2b85e: b7 8d ldd r27, Z+31 ; 0x1f 2b860: f8 01 movw r30, r16 2b862: 81 8b std Z+17, r24 ; 0x11 2b864: 92 8b std Z+18, r25 ; 0x12 2b866: a3 8b std Z+19, r26 ; 0x13 2b868: b4 8b std Z+20, r27 ; 0x14 type_ = FAT_FILE_TYPE_NORMAL; 2b86a: 81 e0 ldi r24, 0x01 ; 1 2b86c: 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; 2b86e: 8c 2d mov r24, r12 2b870: 8f 70 andi r24, 0x0F ; 15 2b872: f8 01 movw r30, r16 2b874: 81 83 std Z+1, r24 ; 0x01 // set to start of file curCluster_ = 0; 2b876: 14 82 std Z+4, r1 ; 0x04 2b878: 15 82 std Z+5, r1 ; 0x05 2b87a: 16 82 std Z+6, r1 ; 0x06 2b87c: 17 82 std Z+7, r1 ; 0x07 curPosition_ = 0; 2b87e: 10 86 std Z+8, r1 ; 0x08 2b880: 11 86 std Z+9, r1 ; 0x09 2b882: 12 86 std Z+10, r1 ; 0x0a 2b884: 13 86 std Z+11, r1 ; 0x0b if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; 2b886: 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; 2b888: c4 fe sbrs r12, 4 2b88a: 03 c0 rjmp .+6 ; 0x2b892 2b88c: c8 01 movw r24, r16 2b88e: 0f 94 74 77 call 0x2eee8 ; 0x2eee8 // open entry in cache return openCachedEntry(index, oflag); fail: return false; } 2b892: 0f 90 pop r0 2b894: df 91 pop r29 2b896: cf 91 pop r28 2b898: 1f 91 pop r17 2b89a: 0f 91 pop r16 2b89c: ff 90 pop r15 2b89e: ef 90 pop r14 2b8a0: df 90 pop r13 2b8a2: cf 90 pop r12 2b8a4: bf 90 pop r11 2b8a6: af 90 pop r10 2b8a8: 7f 90 pop r7 2b8aa: 6f 90 pop r6 2b8ac: 5f 90 pop r5 2b8ae: 4f 90 pop r4 2b8b0: 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; 2b8b2: d7 01 movw r26, r14 2b8b4: 13 96 adiw r26, 0x03 ; 3 2b8b6: 8c 91 ld r24, X 2b8b8: 13 97 sbiw r26, 0x03 ; 3 2b8ba: 82 30 cpi r24, 0x02 ; 2 2b8bc: 09 f4 brne .+2 ; 0x2b8c0 2b8be: 0c cf rjmp .-488 ; 0x2b6d8 // 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; 2b8c0: 51 96 adiw r26, 0x11 ; 17 2b8c2: 8d 91 ld r24, X+ 2b8c4: 9d 91 ld r25, X+ 2b8c6: 0d 90 ld r0, X+ 2b8c8: bc 91 ld r27, X 2b8ca: a0 2d mov r26, r0 2b8cc: 80 3e cpi r24, 0xE0 ; 224 2b8ce: 9f 4f sbci r25, 0xFF ; 255 2b8d0: af 41 sbci r26, 0x1F ; 31 2b8d2: b1 05 cpc r27, r1 2b8d4: 08 f0 brcs .+2 ; 0x2b8d8 2b8d6: 00 cf rjmp .-512 ; 0x2b6d8 if (!addCluster()) goto fail; 2b8d8: c7 01 movw r24, r14 2b8da: 0f 94 1d 58 call 0x2b03a ; 0x2b03a 2b8de: 88 23 and r24, r24 2b8e0: 09 f4 brne .+2 ; 0x2b8e4 2b8e2: fa ce rjmp .-524 ; 0x2b6d8 if (!vol_->cacheFlush()) goto fail; 2b8e4: 0f 94 0c 54 call 0x2a818 ; 0x2a818 2b8e8: 88 23 and r24, r24 2b8ea: 09 f4 brne .+2 ; 0x2b8ee 2b8ec: f5 ce rjmp .-534 ; 0x2b6d8 block = vol_->clusterStartBlock(curCluster_); 2b8ee: d7 01 movw r26, r14 2b8f0: 59 96 adiw r26, 0x19 ; 25 2b8f2: ed 91 ld r30, X+ 2b8f4: fc 91 ld r31, X 2b8f6: 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_);} 2b8f8: 14 96 adiw r26, 0x04 ; 4 2b8fa: 4d 90 ld r4, X+ 2b8fc: 5d 90 ld r5, X+ 2b8fe: 6d 90 ld r6, X+ 2b900: 7c 90 ld r7, X 2b902: 17 97 sbiw r26, 0x07 ; 7 2b904: b2 e0 ldi r27, 0x02 ; 2 2b906: 4b 1a sub r4, r27 2b908: 51 08 sbc r5, r1 2b90a: 61 08 sbc r6, r1 2b90c: 71 08 sbc r7, r1 2b90e: 85 85 ldd r24, Z+13 ; 0x0d 2b910: 04 c0 rjmp .+8 ; 0x2b91a 2b912: 44 0c add r4, r4 2b914: 55 1c adc r5, r5 2b916: 66 1c adc r6, r6 2b918: 77 1c adc r7, r7 2b91a: 8a 95 dec r24 2b91c: d2 f7 brpl .-12 ; 0x2b912 2b91e: 86 85 ldd r24, Z+14 ; 0x0e 2b920: 97 85 ldd r25, Z+15 ; 0x0f 2b922: a0 89 ldd r26, Z+16 ; 0x10 2b924: b1 89 ldd r27, Z+17 ; 0x11 2b926: 48 0e add r4, r24 2b928: 59 1e adc r5, r25 2b92a: 6a 1e adc r6, r26 2b92c: 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; 2b92e: 81 e0 ldi r24, 0x01 ; 1 2b930: 80 93 98 0e sts 0x0E98, r24 ; 0x800e98 cacheBlockNumber_ = blockNumber; 2b934: 40 92 90 0e sts 0x0E90, r4 ; 0x800e90 2b938: 50 92 91 0e sts 0x0E91, r5 ; 0x800e91 2b93c: 60 92 92 0e sts 0x0E92, r6 ; 0x800e92 2b940: 70 92 93 0e sts 0x0E93, r7 ; 0x800e93 // set cache to first block of cluster vol_->cacheSetBlockNumber(block, true); // zero first block of cluster memset(vol_->cacheBuffer_.data, 0, 512); 2b944: ec e9 ldi r30, 0x9C ; 156 2b946: fe e0 ldi r31, 0x0E ; 14 2b948: 80 e0 ldi r24, 0x00 ; 0 2b94a: 92 e0 ldi r25, 0x02 ; 2 2b94c: df 01 movw r26, r30 2b94e: 9c 01 movw r18, r24 2b950: 1d 92 st X+, r1 2b952: 21 50 subi r18, 0x01 ; 1 2b954: 30 40 sbci r19, 0x00 ; 0 2b956: e1 f7 brne .-8 ; 0x2b950 // zero rest of cluster for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { 2b958: dd 24 eor r13, r13 2b95a: d3 94 inc r13 2b95c: d7 01 movw r26, r14 2b95e: 59 96 adiw r26, 0x19 ; 25 2b960: ed 91 ld r30, X+ 2b962: fc 91 ld r31, X 2b964: 84 81 ldd r24, Z+4 ; 0x04 2b966: d8 16 cp r13, r24 2b968: 98 f4 brcc .+38 ; 0x2b990 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); 2b96a: 2c e9 ldi r18, 0x9C ; 156 2b96c: 3e e0 ldi r19, 0x0E ; 14 2b96e: b3 01 movw r22, r6 2b970: a2 01 movw r20, r4 2b972: 4d 0d add r20, r13 2b974: 51 1d adc r21, r1 2b976: 61 1d adc r22, r1 2b978: 71 1d adc r23, r1 2b97a: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 2b97e: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 2b982: 0f 94 a8 53 call 0x2a750 ; 0x2a750 if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail; 2b986: 88 23 and r24, r24 2b988: 09 f4 brne .+2 ; 0x2b98c 2b98a: a6 ce rjmp .-692 ; 0x2b6d8 // zero first block of cluster memset(vol_->cacheBuffer_.data, 0, 512); // zero rest of cluster for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { 2b98c: d3 94 inc r13 2b98e: e6 cf rjmp .-52 ; 0x2b95c if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail; } // Increase directory file size by cluster size fileSize_ += 512UL << vol_->clusterSizeShift_; 2b990: 25 85 ldd r18, Z+13 ; 0x0d 2b992: 80 e0 ldi r24, 0x00 ; 0 2b994: 92 e0 ldi r25, 0x02 ; 2 2b996: a0 e0 ldi r26, 0x00 ; 0 2b998: b0 e0 ldi r27, 0x00 ; 0 2b99a: 04 c0 rjmp .+8 ; 0x2b9a4 2b99c: 88 0f add r24, r24 2b99e: 99 1f adc r25, r25 2b9a0: aa 1f adc r26, r26 2b9a2: bb 1f adc r27, r27 2b9a4: 2a 95 dec r18 2b9a6: d2 f7 brpl .-12 ; 0x2b99c 2b9a8: f7 01 movw r30, r14 2b9aa: 41 89 ldd r20, Z+17 ; 0x11 2b9ac: 52 89 ldd r21, Z+18 ; 0x12 2b9ae: 63 89 ldd r22, Z+19 ; 0x13 2b9b0: 74 89 ldd r23, Z+20 ; 0x14 2b9b2: 84 0f add r24, r20 2b9b4: 95 1f adc r25, r21 2b9b6: a6 1f adc r26, r22 2b9b8: b7 1f adc r27, r23 2b9ba: 81 8b std Z+17, r24 ; 0x11 2b9bc: 92 8b std Z+18, r25 ; 0x12 2b9be: a3 8b std Z+19, r26 ; 0x13 2b9c0: 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; 2b9c2: 8c e9 ldi r24, 0x9C ; 156 2b9c4: 9e e0 ldi r25, 0x0E ; 14 index = 0; 2b9c6: d1 2c mov r13, r1 2b9c8: db ce rjmp .-586 ; 0x2b780 // 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)) { 2b9ca: 20 31 cpi r18, 0x10 ; 16 2b9cc: 61 f4 brne .+24 ; 0x2b9e6 if (!vol_->chainSize(firstCluster_, &fileSize_)) goto fail; 2b9ce: 98 01 movw r18, r16 2b9d0: 2f 5e subi r18, 0xEF ; 239 2b9d2: 3f 4f sbci r19, 0xFF ; 255 2b9d4: 0f 94 56 56 call 0x2acac ; 0x2acac 2b9d8: 88 23 and r24, r24 2b9da: 29 f0 breq .+10 ; 0x2b9e6 type_ = FAT_FILE_TYPE_SUBDIR; 2b9dc: 84 e0 ldi r24, 0x04 ; 4 2b9de: d8 01 movw r26, r16 2b9e0: 13 96 adiw r26, 0x03 ; 3 2b9e2: 8c 93 st X, r24 2b9e4: 44 cf rjmp .-376 ; 0x2b86e curPosition_ = 0; if ((oflag & O_TRUNC) && !truncate(0)) return false; return oflag & O_AT_END ? seekEnd(0) : true; fail: type_ = FAT_FILE_TYPE_CLOSED; 2b9e6: d8 01 movw r26, r16 2b9e8: 13 96 adiw r26, 0x03 ; 3 2b9ea: 1c 92 st X, r1 2b9ec: 75 ce rjmp .-790 ; 0x2b6d8 0002b9ee : // version of uvlo_() which doesn't overwrite the print state already waiting in EEPROM uvlo_tiny(); } } void recover_print(uint8_t automatic) { 2b9ee: 4f 92 push r4 2b9f0: 5f 92 push r5 2b9f2: 6f 92 push r6 2b9f4: 7f 92 push r7 2b9f6: 8f 92 push r8 2b9f8: 9f 92 push r9 2b9fa: af 92 push r10 2b9fc: bf 92 push r11 2b9fe: cf 92 push r12 2ba00: df 92 push r13 2ba02: ef 92 push r14 2ba04: ff 92 push r15 2ba06: 0f 93 push r16 2ba08: 1f 93 push r17 2ba0a: cf 93 push r28 2ba0c: df 93 push r29 2ba0e: 1f 92 push r1 2ba10: 1f 92 push r1 2ba12: cd b7 in r28, 0x3d ; 61 2ba14: de b7 in r29, 0x3e ; 62 2ba16: a8 2e mov r10, r24 lcd_setstatuspgm(_T(MSG_RECOVERING_PRINT)); 2ba18: 83 e1 ldi r24, 0x13 ; 19 2ba1a: 9d e4 ldi r25, 0x4D ; 77 2ba1c: 0e 94 44 72 call 0xe488 ; 0xe488 2ba20: 0e 94 16 f2 call 0x1e42c ; 0x1e42c gcode_M114(); } bool recover_machine_state_after_power_panic() { // 1) Preset some dummy values for the XY axes current_position[X_AXIS] = 0; 2ba24: 10 92 91 06 sts 0x0691, r1 ; 0x800691 2ba28: 10 92 92 06 sts 0x0692, r1 ; 0x800692 2ba2c: 10 92 93 06 sts 0x0693, r1 ; 0x800693 2ba30: 10 92 94 06 sts 0x0694, r1 ; 0x800694 current_position[Y_AXIS] = 0; 2ba34: 10 92 95 06 sts 0x0695, r1 ; 0x800695 2ba38: 10 92 96 06 sts 0x0696, r1 ; 0x800696 2ba3c: 10 92 97 06 sts 0x0697, r1 ; 0x800697 2ba40: 10 92 98 06 sts 0x0698, r1 ; 0x800698 2ba44: 9e ea ldi r25, 0xAE ; 174 2ba46: e9 2e mov r14, r25 2ba48: 9d e0 ldi r25, 0x0D ; 13 2ba4a: f9 2e mov r15, r25 // 2) Restore the mesh bed leveling offsets, but not the MBL status. // This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case. bool mbl_was_active = false; 2ba4c: d1 2c mov r13, r1 for (int8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) { 2ba4e: c1 2c mov r12, r1 uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1 2ba50: 27 e0 ldi r18, 0x07 ; 7 2ba52: b2 2e mov r11, r18 2ba54: 8c 2d mov r24, r12 2ba56: 6b 2d mov r22, r11 2ba58: 0f 94 cb dc call 0x3b996 ; 0x3b996 <__divmodqi4> 2ba5c: 08 2f mov r16, r24 2ba5e: 99 2e mov r9, r25 uint8_t iy = mesh_point / MESH_NUM_X_POINTS; // Scale the z value to 10u resolution. int16_t v; eeprom_read_block(&v, (void*)(EEPROM_UVLO_MESH_BED_LEVELING_FULL+2*mesh_point), 2); 2ba60: 42 e0 ldi r20, 0x02 ; 2 2ba62: 50 e0 ldi r21, 0x00 ; 0 2ba64: b7 01 movw r22, r14 2ba66: ce 01 movw r24, r28 2ba68: 01 96 adiw r24, 0x01 ; 1 2ba6a: 0f 94 00 dc call 0x3b800 ; 0x3b800 if (v != 0) 2ba6e: 69 81 ldd r22, Y+1 ; 0x01 2ba70: 7a 81 ldd r23, Y+2 ; 0x02 2ba72: 61 15 cp r22, r1 2ba74: 71 05 cpc r23, r1 2ba76: 11 f0 breq .+4 ; 0x2ba7c mbl_was_active = true; 2ba78: dd 24 eor r13, r13 2ba7a: d3 94 inc r13 mbl.z_values[iy][ix] = float(v) * 0.001f; 2ba7c: 2b 2d mov r18, r11 2ba7e: 02 03 mulsu r16, r18 2ba80: 80 01 movw r16, r0 2ba82: 11 24 eor r1, r1 2ba84: 09 0d add r16, r9 2ba86: 11 1d adc r17, r1 2ba88: 97 fc sbrc r9, 7 2ba8a: 1a 95 dec r17 2ba8c: 00 0f add r16, r16 2ba8e: 11 1f adc r17, r17 2ba90: 00 0f add r16, r16 2ba92: 11 1f adc r17, r17 2ba94: 0f 53 subi r16, 0x3F ; 63 2ba96: 1c 4e sbci r17, 0xEC ; 236 2ba98: 07 2e mov r0, r23 2ba9a: 00 0c add r0, r0 2ba9c: 88 0b sbc r24, r24 2ba9e: 99 0b sbc r25, r25 2baa0: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2baa4: 2f e6 ldi r18, 0x6F ; 111 2baa6: 32 e1 ldi r19, 0x12 ; 18 2baa8: 43 e8 ldi r20, 0x83 ; 131 2baaa: 5a e3 ldi r21, 0x3A ; 58 2baac: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2bab0: f8 01 movw r30, r16 2bab2: 61 83 std Z+1, r22 ; 0x01 2bab4: 72 83 std Z+2, r23 ; 0x02 2bab6: 83 83 std Z+3, r24 ; 0x03 2bab8: 94 83 std Z+4, r25 ; 0x04 2baba: f2 e0 ldi r31, 0x02 ; 2 2babc: ef 0e add r14, r31 2babe: f1 1c adc r15, r1 2bac0: c3 94 inc r12 current_position[Y_AXIS] = 0; // 2) Restore the mesh bed leveling offsets, but not the MBL status. // This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case. bool mbl_was_active = false; for (int8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) { 2bac2: 21 e3 ldi r18, 0x31 ; 49 2bac4: c2 12 cpse r12, r18 2bac6: c6 cf rjmp .-116 ; 0x2ba54 mbl.z_values[iy][ix] = float(v) * 0.001f; } // Recover the physical coordinate of the Z axis at the time of the power panic. // The current position after power panic is moved to the next closest 0th full step. current_position[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z)); 2bac8: 8a ed ldi r24, 0xDA ; 218 2baca: 9e e0 ldi r25, 0x0E ; 14 2bacc: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bad0: 60 93 99 06 sts 0x0699, r22 ; 0x800699 2bad4: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 2bad8: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 2badc: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c // Recover last E axis position current_position[E_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E)); 2bae0: 8e e6 ldi r24, 0x6E ; 110 2bae2: 9f e0 ldi r25, 0x0F ; 15 2bae4: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bae8: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 2baec: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 2baf0: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 2baf4: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 // 3) Initialize the logical to physical coordinate system transformation. world2machine_initialize(); 2baf8: 0f 94 8f ce call 0x39d1e ; 0x39d1e // 4) Load the baby stepping value, which is expected to be active at the time of power panic. // The baby stepping value is used to reset the physical Z axis when rehoming the Z axis. babystep_load(); 2bafc: 0f 94 79 c9 call 0x392f2 ; 0x392f2 // 5) Set the physical positions from the logical positions using the world2machine transformation // This is only done to inizialize Z/E axes with physical locations, since X/Y are unknown. clamp_to_software_endstops(current_position); 2bb00: 81 e9 ldi r24, 0x91 ; 145 2bb02: 96 e0 ldi r25, 0x06 ; 6 2bb04: 0e 94 61 6b call 0xd6c2 ; 0xd6c2 set_destination_to_current(); 2bb08: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 plan_set_position_curposXYZE(); 2bb0c: 0f 94 fd be call 0x37dfa ; 0x37dfa SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial "); 2bb10: 85 e8 ldi r24, 0x85 ; 133 2bb12: 9e e8 ldi r25, 0x8E ; 142 2bb14: 0e 94 e8 76 call 0xedd0 ; 0xedd0 saved_printing = false; } void print_world_coordinates() { printf_P(_N("world coordinates: (%.3f, %.3f, %.3f)\n"), current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); 2bb18: 80 91 9c 06 lds r24, 0x069C ; 0x80069c 2bb1c: 8f 93 push r24 2bb1e: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 2bb22: 8f 93 push r24 2bb24: 80 91 9a 06 lds r24, 0x069A ; 0x80069a 2bb28: 8f 93 push r24 2bb2a: 80 91 99 06 lds r24, 0x0699 ; 0x800699 2bb2e: 8f 93 push r24 2bb30: 80 91 98 06 lds r24, 0x0698 ; 0x800698 2bb34: 8f 93 push r24 2bb36: 80 91 97 06 lds r24, 0x0697 ; 0x800697 2bb3a: 8f 93 push r24 2bb3c: 80 91 96 06 lds r24, 0x0696 ; 0x800696 2bb40: 8f 93 push r24 2bb42: 80 91 95 06 lds r24, 0x0695 ; 0x800695 2bb46: 8f 93 push r24 2bb48: 80 91 94 06 lds r24, 0x0694 ; 0x800694 2bb4c: 8f 93 push r24 2bb4e: 80 91 93 06 lds r24, 0x0693 ; 0x800693 2bb52: 8f 93 push r24 2bb54: 80 91 92 06 lds r24, 0x0692 ; 0x800692 2bb58: 8f 93 push r24 2bb5a: 80 91 91 06 lds r24, 0x0691 ; 0x800691 2bb5e: 8f 93 push r24 2bb60: 85 e9 ldi r24, 0x95 ; 149 2bb62: 9d e6 ldi r25, 0x6D ; 109 2bb64: 9f 93 push r25 2bb66: 8f 93 push r24 2bb68: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 print_world_coordinates(); // 6) Power up the Z motors, mark their positions as known. axis_known_position[Z_AXIS] = true; 2bb6c: 81 e0 ldi r24, 0x01 ; 1 2bb6e: 80 93 90 06 sts 0x0690, r24 ; 0x800690 enable_z(); 2bb72: 15 98 cbi 0x02, 5 ; 2 // 7) Recover the target temperatures. target_temperature[active_extruder] = eeprom_read_word((uint16_t*)EEPROM_UVLO_TARGET_HOTEND); 2bb74: 88 ed ldi r24, 0xD8 ; 216 2bb76: 9e e0 ldi r25, 0x0E ; 14 2bb78: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2bb7c: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 2bb80: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 target_temperature_bed = eeprom_read_byte((uint8_t*)EEPROM_UVLO_TARGET_BED); 2bb84: 8b e8 ldi r24, 0x8B ; 139 2bb86: 9f e0 ldi r25, 0x0F ; 15 2bb88: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bb8c: 90 e0 ldi r25, 0x00 ; 0 2bb8e: 90 93 72 06 sts 0x0672, r25 ; 0x800672 2bb92: 80 93 71 06 sts 0x0671, r24 ; 0x800671 // 8) Recover extruder multipilers extruder_multiplier[0] = eeprom_read_float((float*)(EEPROM_EXTRUDER_MULTIPLIER_0)); 2bb96: 88 ee ldi r24, 0xE8 ; 232 2bb98: 9e e0 ldi r25, 0x0E ; 14 2bb9a: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bb9e: 60 93 93 02 sts 0x0293, r22 ; 0x800293 2bba2: 70 93 94 02 sts 0x0294, r23 ; 0x800294 2bba6: 80 93 95 02 sts 0x0295, r24 ; 0x800295 2bbaa: 90 93 96 02 sts 0x0296, r25 ; 0x800296 extrudemultiply = (int)eeprom_read_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY)); 2bbae: 8e ed ldi r24, 0xDE ; 222 2bbb0: 9e e0 ldi r25, 0x0E ; 14 2bbb2: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2bbb6: 90 93 bd 02 sts 0x02BD, r25 ; 0x8002bd 2bbba: 80 93 bc 02 sts 0x02BC, r24 ; 0x8002bc // 9) Recover the saved target eeprom_read_block(saved_start_position, (float *)EEPROM_UVLO_SAVED_START_POSITION, sizeof(saved_start_position)); 2bbbe: 40 e1 ldi r20, 0x10 ; 16 2bbc0: 50 e0 ldi r21, 0x00 ; 0 2bbc2: 67 e3 ldi r22, 0x37 ; 55 2bbc4: 7d e0 ldi r23, 0x0D ; 13 2bbc6: 83 e8 ldi r24, 0x83 ; 131 2bbc8: 92 e0 ldi r25, 0x02 ; 2 2bbca: 0f 94 00 dc call 0x3b800 ; 0x3b800 saved_segment_idx = eeprom_read_word((uint16_t*)EEPROM_UVLO_SAVED_SEGMENT_IDX); 2bbce: 8c e6 ldi r24, 0x6C ; 108 2bbd0: 9f e0 ldi r25, 0x0F ; 15 2bbd2: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2bbd6: 90 93 69 05 sts 0x0569, r25 ; 0x800569 2bbda: 80 93 68 05 sts 0x0568, r24 ; 0x800568 #ifdef LIN_ADVANCE extruder_advance_K = eeprom_read_float((float*)EEPROM_UVLO_LA_K); 2bbde: 8c e2 ldi r24, 0x2C ; 44 2bbe0: 9d e0 ldi r25, 0x0D ; 13 2bbe2: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bbe6: 60 93 64 05 sts 0x0564, r22 ; 0x800564 2bbea: 70 93 65 05 sts 0x0565, r23 ; 0x800565 2bbee: 80 93 66 05 sts 0x0566, r24 ; 0x800566 2bbf2: 90 93 67 05 sts 0x0567, r25 ; 0x800567 #endif #ifdef PREVENT_DANGEROUS_EXTRUDE extrude_min_temp = eeprom_read_word((uint16_t*)EEPROM_UVLO_EXTRUDE_MINTEMP); 2bbf6: 8d e7 ldi r24, 0x7D ; 125 2bbf8: 9c e0 ldi r25, 0x0C ; 12 2bbfa: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2bbfe: 90 93 6c 02 sts 0x026C, r25 ; 0x80026c 2bc02: 80 93 6b 02 sts 0x026B, r24 ; 0x80026b #endif //PREVENT_DANGEROUS_EXTRUDE eeprom_read_block(cs.max_acceleration_mm_per_s2_normal, (uint32_t *)EEPROM_UVLO_ACCELL_MM_S2_NORMAL, sizeof(cs.max_acceleration_mm_per_s2_normal)); 2bc06: 40 e1 ldi r20, 0x10 ; 16 2bc08: 50 e0 ldi r21, 0x00 ; 0 2bc0a: 6d e6 ldi r22, 0x6D ; 109 2bc0c: 7c e0 ldi r23, 0x0C ; 12 2bc0e: 81 ee ldi r24, 0xE1 ; 225 2bc10: 9d e0 ldi r25, 0x0D ; 13 2bc12: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(cs.max_acceleration_mm_per_s2_silent, (uint32_t *)EEPROM_UVLO_ACCELL_MM_S2_SILENT, sizeof(cs.max_acceleration_mm_per_s2_silent)); 2bc16: 40 e1 ldi r20, 0x10 ; 16 2bc18: 50 e0 ldi r21, 0x00 ; 0 2bc1a: 6d e5 ldi r22, 0x5D ; 93 2bc1c: 7c e0 ldi r23, 0x0C ; 12 2bc1e: 89 e6 ldi r24, 0x69 ; 105 2bc20: 9e e0 ldi r25, 0x0E ; 14 2bc22: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(cs.max_feedrate_normal, (float *)EEPROM_UVLO_MAX_FEEDRATE_NORMAL, sizeof(cs.max_feedrate_normal)); 2bc26: 40 e1 ldi r20, 0x10 ; 16 2bc28: 50 e0 ldi r21, 0x00 ; 0 2bc2a: 6d e4 ldi r22, 0x4D ; 77 2bc2c: 7c e0 ldi r23, 0x0C ; 12 2bc2e: 81 ed ldi r24, 0xD1 ; 209 2bc30: 9d e0 ldi r25, 0x0D ; 13 2bc32: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(cs.max_feedrate_silent, (float *)EEPROM_UVLO_MAX_FEEDRATE_SILENT, sizeof(cs.max_feedrate_silent)); 2bc36: 40 e1 ldi r20, 0x10 ; 16 2bc38: 50 e0 ldi r21, 0x00 ; 0 2bc3a: 6d e3 ldi r22, 0x3D ; 61 2bc3c: 7c e0 ldi r23, 0x0C ; 12 2bc3e: 89 e5 ldi r24, 0x59 ; 89 2bc40: 9e e0 ldi r25, 0x0E ; 14 2bc42: 0f 94 00 dc call 0x3b800 ; 0x3b800 cs.minimumfeedrate = eeprom_read_float((float *)EEPROM_UVLO_MIN_FEEDRATE); 2bc46: 89 e3 ldi r24, 0x39 ; 57 2bc48: 9c e0 ldi r25, 0x0C ; 12 2bc4a: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bc4e: 60 93 f9 0d sts 0x0DF9, r22 ; 0x800df9 2bc52: 70 93 fa 0d sts 0x0DFA, r23 ; 0x800dfa 2bc56: 80 93 fb 0d sts 0x0DFB, r24 ; 0x800dfb 2bc5a: 90 93 fc 0d sts 0x0DFC, r25 ; 0x800dfc cs.mintravelfeedrate = eeprom_read_float((float *)EEPROM_UVLO_MIN_TRAVEL_FEEDRATE); 2bc5e: 85 e3 ldi r24, 0x35 ; 53 2bc60: 9c e0 ldi r25, 0x0C ; 12 2bc62: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bc66: 60 93 fd 0d sts 0x0DFD, r22 ; 0x800dfd 2bc6a: 70 93 fe 0d sts 0x0DFE, r23 ; 0x800dfe 2bc6e: 80 93 ff 0d sts 0x0DFF, r24 ; 0x800dff 2bc72: 90 93 00 0e sts 0x0E00, r25 ; 0x800e00 cs.min_segment_time_us = eeprom_read_dword((uint32_t *)EEPROM_UVLO_MIN_SEGMENT_TIME_US); 2bc76: 81 e3 ldi r24, 0x31 ; 49 2bc78: 9c e0 ldi r25, 0x0C ; 12 2bc7a: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bc7e: 60 93 01 0e sts 0x0E01, r22 ; 0x800e01 2bc82: 70 93 02 0e sts 0x0E02, r23 ; 0x800e02 2bc86: 80 93 03 0e sts 0x0E03, r24 ; 0x800e03 2bc8a: 90 93 04 0e sts 0x0E04, r25 ; 0x800e04 eeprom_read_block(cs.max_jerk, (float *)EEPROM_UVLO_MAX_JERK, sizeof(cs.max_jerk)); 2bc8e: 40 e1 ldi r20, 0x10 ; 16 2bc90: 50 e0 ldi r21, 0x00 ; 0 2bc92: 61 e2 ldi r22, 0x21 ; 33 2bc94: 7c e0 ldi r23, 0x0C ; 12 2bc96: 85 e0 ldi r24, 0x05 ; 5 2bc98: 9e e0 ldi r25, 0x0E ; 14 2bc9a: 0f 94 00 dc call 0x3b800 ; 0x3b800 bool mbl_was_active = recover_machine_state_after_power_panic(); // Undo PP Z Lift by setting current Z pos to + Z_PAUSE_LIFT // With first PP or Pause + PP the Z has been already lift. // After a reboot the printer doesn't know the Z height and we have to set its previous value if(eeprom_read_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED) == 1 ) { 2bc9e: 8f e7 ldi r24, 0x7F ; 127 2bca0: 9c e0 ldi r25, 0x0C ; 12 2bca2: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bca6: 0f b6 in r0, 0x3f ; 63 2bca8: f8 94 cli 2bcaa: de bf out 0x3e, r29 ; 62 2bcac: 0f be out 0x3f, r0 ; 63 2bcae: cd bf out 0x3d, r28 ; 61 2bcb0: 81 30 cpi r24, 0x01 ; 1 2bcb2: b1 f4 brne .+44 ; 0x2bce0 current_position[Z_AXIS] += Z_PAUSE_LIFT; 2bcb4: 20 e0 ldi r18, 0x00 ; 0 2bcb6: 30 e0 ldi r19, 0x00 ; 0 2bcb8: 40 ea ldi r20, 0xA0 ; 160 2bcba: 51 e4 ldi r21, 0x41 ; 65 2bcbc: 60 91 99 06 lds r22, 0x0699 ; 0x800699 2bcc0: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 2bcc4: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 2bcc8: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 2bccc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2bcd0: 60 93 99 06 sts 0x0699, r22 ; 0x800699 2bcd4: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 2bcd8: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 2bcdc: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c } // Lift the print head ONCE plus Z_PAUSE_LIFT first to avoid collisions with oozed material with the print, if(eeprom_read_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED) == 0) { 2bce0: 8f e7 ldi r24, 0x7F ; 127 2bce2: 9c e0 ldi r25, 0x0C ; 12 2bce4: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bce8: 81 11 cpse r24, r1 2bcea: 23 c0 rjmp .+70 ; 0x2bd32 enquecommandf_P(PSTR("G1 Z%.3f F800"), current_position[Z_AXIS] + Z_PAUSE_LIFT); 2bcec: 20 e0 ldi r18, 0x00 ; 0 2bcee: 30 e0 ldi r19, 0x00 ; 0 2bcf0: 40 ea ldi r20, 0xA0 ; 160 2bcf2: 51 e4 ldi r21, 0x41 ; 65 2bcf4: 60 91 99 06 lds r22, 0x0699 ; 0x800699 2bcf8: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 2bcfc: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 2bd00: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 2bd04: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2bd08: 9f 93 push r25 2bd0a: 8f 93 push r24 2bd0c: 7f 93 push r23 2bd0e: 6f 93 push r22 2bd10: 8a e8 ldi r24, 0x8A ; 138 2bd12: 9f e8 ldi r25, 0x8F ; 143 2bd14: 9f 93 push r25 2bd16: 8f 93 push r24 2bd18: 0e 94 56 88 call 0x110ac ; 0x110ac 2bd1c: 61 e0 ldi r22, 0x01 ; 1 2bd1e: 8f e7 ldi r24, 0x7F ; 127 2bd20: 9c e0 ldi r25, 0x0C ; 12 2bd22: 0f 94 34 dc call 0x3b868 ; 0x3b868 2bd26: 0f 90 pop r0 2bd28: 0f 90 pop r0 2bd2a: 0f 90 pop r0 2bd2c: 0f 90 pop r0 2bd2e: 0f 90 pop r0 2bd30: 0f 90 pop r0 eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 1); } // Home X and Y axes. Homing just X and Y shall not touch the babystep and the world2machine // transformation status. G28 will not touch Z when MBL is off. enquecommand_P(PSTR("G28 X Y")); 2bd32: 61 e0 ldi r22, 0x01 ; 1 2bd34: 82 e8 ldi r24, 0x82 ; 130 2bd36: 9f e8 ldi r25, 0x8F ; 143 2bd38: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // Set the target bed and nozzle temperatures and wait. enquecommandf_P(PSTR("M104 S%d"), target_temperature[active_extruder]); 2bd3c: 80 91 b6 0d lds r24, 0x0DB6 ; 0x800db6 2bd40: 8f 93 push r24 2bd42: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 2bd46: 8f 93 push r24 2bd48: 89 e7 ldi r24, 0x79 ; 121 2bd4a: 9f e8 ldi r25, 0x8F ; 143 2bd4c: 9f 93 push r25 2bd4e: 8f 93 push r24 2bd50: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(PSTR("M140 S%d"), target_temperature_bed); 2bd54: 80 91 72 06 lds r24, 0x0672 ; 0x800672 2bd58: 8f 93 push r24 2bd5a: 80 91 71 06 lds r24, 0x0671 ; 0x800671 2bd5e: 8f 93 push r24 2bd60: 80 e7 ldi r24, 0x70 ; 112 2bd62: 9f e8 ldi r25, 0x8F ; 143 2bd64: 9f 93 push r25 2bd66: 8f 93 push r24 2bd68: 0e 94 56 88 call 0x110ac ; 0x110ac //No need to wait for hotend heatup while host printing, as print will pause and wait for host. if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_SD) { 2bd6c: 8c e8 ldi r24, 0x8C ; 140 2bd6e: 9f e0 ldi r25, 0x0F ; 15 2bd70: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bd74: 0f b6 in r0, 0x3f ; 63 2bd76: f8 94 cli 2bd78: de bf out 0x3e, r29 ; 62 2bd7a: 0f be out 0x3f, r0 ; 63 2bd7c: cd bf out 0x3d, r28 ; 61 2bd7e: 81 11 cpse r24, r1 2bd80: 10 c0 rjmp .+32 ; 0x2bda2 enquecommandf_P(PSTR("M109 S%d"), target_temperature[active_extruder]); 2bd82: 80 91 b6 0d lds r24, 0x0DB6 ; 0x800db6 2bd86: 8f 93 push r24 2bd88: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 2bd8c: 8f 93 push r24 2bd8e: 87 e6 ldi r24, 0x67 ; 103 2bd90: 9f e8 ldi r25, 0x8F ; 143 2bd92: 9f 93 push r25 2bd94: 8f 93 push r24 2bd96: 0e 94 56 88 call 0x110ac ; 0x110ac 2bd9a: 0f 90 pop r0 2bd9c: 0f 90 pop r0 2bd9e: 0f 90 pop r0 2bda0: 0f 90 pop r0 } enquecommand_P(MSG_M83); //E axis relative mode 2bda2: 61 e0 ldi r22, 0x01 ; 1 2bda4: 86 e7 ldi r24, 0x76 ; 118 2bda6: 9b e6 ldi r25, 0x6B ; 107 2bda8: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // If not automatically recoreverd (long power loss) if(automatic == 0){ 2bdac: a1 10 cpse r10, r1 2bdae: 17 c0 rjmp .+46 ; 0x2bdde //Extrude some filament to stabilize the pressure enquecommand_P(PSTR("G1 E5 F120")); 2bdb0: 61 e0 ldi r22, 0x01 ; 1 2bdb2: 8c e5 ldi r24, 0x5C ; 92 2bdb4: 9f e8 ldi r25, 0x8F ; 143 2bdb6: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // Retract to be consistent with a short pause enquecommandf_P(G1_E_F2700, default_retraction); 2bdba: 8f e3 ldi r24, 0x3F ; 63 2bdbc: 8f 93 push r24 2bdbe: 80 e8 ldi r24, 0x80 ; 128 2bdc0: 8f 93 push r24 2bdc2: 1f 92 push r1 2bdc4: 1f 92 push r1 2bdc6: 80 ef ldi r24, 0xF0 ; 240 2bdc8: 9d e6 ldi r25, 0x6D ; 109 2bdca: 9f 93 push r25 2bdcc: 8f 93 push r24 2bdce: 0e 94 56 88 call 0x110ac ; 0x110ac 2bdd2: 0f 90 pop r0 2bdd4: 0f 90 pop r0 2bdd6: 0f 90 pop r0 2bdd8: 0f 90 pop r0 2bdda: 0f 90 pop r0 2bddc: 0f 90 pop r0 } puts_P(_N("Temperature Restored\n")); 2bdde: 8a ed ldi r24, 0xDA ; 218 2bde0: 9d e6 ldi r25, 0x6D ; 109 2bde2: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 gcode_M114(); 2bde6: 0e 94 df 77 call 0xefbe ; 0xefbe void restore_print_from_eeprom(bool mbl_was_active) { int feedrate_rec; int feedmultiply_rec; uint8_t fan_speed_rec; fan_speed_rec = eeprom_read_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED); 2bdea: 88 e8 ldi r24, 0x88 ; 136 2bdec: 9f e0 ldi r25, 0x0F ; 15 2bdee: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bdf2: 88 2e mov r8, r24 feedrate_rec = eeprom_read_word((uint16_t*)EEPROM_UVLO_FEEDRATE); 2bdf4: 89 e8 ldi r24, 0x89 ; 137 2bdf6: 9f e0 ldi r25, 0x0F ; 15 2bdf8: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2bdfc: 8c 01 movw r16, r24 feedmultiply_rec = eeprom_read_word((uint16_t*)EEPROM_UVLO_FEEDMULTIPLY); 2bdfe: 85 e3 ldi r24, 0x35 ; 53 2be00: 9d e0 ldi r25, 0x0D ; 13 2be02: 0f 94 1e dc call 0x3b83c ; 0x3b83c 2be06: f8 2e mov r15, r24 2be08: e9 2e mov r14, r25 SERIAL_ECHOPGM("Feedrate:"); 2be0a: 82 e5 ldi r24, 0x52 ; 82 2be0c: 9f e8 ldi r25, 0x8F ; 143 2be0e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 2be12: b8 01 movw r22, r16 2be14: 01 2e mov r0, r17 2be16: 00 0c add r0, r0 2be18: 88 0b sbc r24, r24 2be1a: 99 0b sbc r25, r25 2be1c: 0f 94 5f d5 call 0x3aabe ; 0x3aabe MYSERIAL.print(feedrate_rec); SERIAL_ECHOPGM(", feedmultiply:"); 2be20: 82 e4 ldi r24, 0x42 ; 66 2be22: 9f e8 ldi r25, 0x8F ; 143 2be24: 0e 94 e8 76 call 0xedd0 ; 0xedd0 MYSERIAL.println(feedmultiply_rec); 2be28: 8f 2d mov r24, r15 2be2a: 9e 2d mov r25, r14 2be2c: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) 2be30: 80 91 6a 02 lds r24, 0x026A ; 0x80026a 2be34: 81 11 cpse r24, r1 2be36: 02 c0 rjmp .+4 ; 0x2be3c { // M23 restore_file_from_sd(); 2be38: 0e 94 7b 88 call 0x110f6 ; 0x110f6 } // Move to the XY print position in logical coordinates, where the print has been killed, but // without shifting Z along the way. This requires performing the move without mbl. float pos_x = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0)); 2be3c: 8d e9 ldi r24, 0x9D ; 157 2be3e: 9f e0 ldi r25, 0x0F ; 15 2be40: 0f 94 18 dc call 0x3b830 ; 0x3b830 2be44: c6 2e mov r12, r22 2be46: b7 2e mov r11, r23 2be48: a8 2e mov r10, r24 2be4a: 99 2e mov r9, r25 float pos_y = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4)); 2be4c: 81 ea ldi r24, 0xA1 ; 161 2be4e: 9f e0 ldi r25, 0x0F ; 15 2be50: 0f 94 18 dc call 0x3b830 ; 0x3b830 2be54: 76 2e mov r7, r22 2be56: 67 2e mov r6, r23 2be58: 58 2e mov r5, r24 2be5a: 49 2e mov r4, r25 if (pos_x != X_COORD_INVALID) { 2be5c: 20 e0 ldi r18, 0x00 ; 0 2be5e: 30 e0 ldi r19, 0x00 ; 0 2be60: 40 e8 ldi r20, 0x80 ; 128 2be62: 5f eb ldi r21, 0xBF ; 191 2be64: 6c 2d mov r22, r12 2be66: 7b 2d mov r23, r11 2be68: 8a 2d mov r24, r10 2be6a: 99 2d mov r25, r9 2be6c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2be70: 88 23 and r24, r24 2be72: 99 f0 breq .+38 ; 0x2be9a enquecommandf_P(PSTR("G1 X%-.3f Y%-.3f F3000"), pos_x, pos_y); 2be74: 4f 92 push r4 2be76: 5f 92 push r5 2be78: 6f 92 push r6 2be7a: 7f 92 push r7 2be7c: 9f 92 push r9 2be7e: af 92 push r10 2be80: bf 92 push r11 2be82: cf 92 push r12 2be84: 8b e2 ldi r24, 0x2B ; 43 2be86: 9f e8 ldi r25, 0x8F ; 143 2be88: 9f 93 push r25 2be8a: 8f 93 push r24 2be8c: 0e 94 56 88 call 0x110ac ; 0x110ac 2be90: 0f b6 in r0, 0x3f ; 63 2be92: f8 94 cli 2be94: de bf out 0x3e, r29 ; 62 2be96: 0f be out 0x3f, r0 ; 63 2be98: cd bf out 0x3d, r28 ; 61 } // Enable MBL and switch to logical positioning if (mbl_was_active) 2be9a: dd 20 and r13, r13 2be9c: 29 f0 breq .+10 ; 0x2bea8 enquecommand_P(PSTR("PRUSA MBL V1")); 2be9e: 61 e0 ldi r22, 0x01 ; 1 2bea0: 8e e1 ldi r24, 0x1E ; 30 2bea2: 9f e8 ldi r25, 0x8F ; 143 2bea4: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // Move the Z axis down to the print, in logical coordinates. enquecommandf_P(PSTR("G1 Z%-.3f"), eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z))); 2bea8: 8d e8 ldi r24, 0x8D ; 141 2beaa: 9f e0 ldi r25, 0x0F ; 15 2beac: 0f 94 18 dc call 0x3b830 ; 0x3b830 2beb0: 9f 93 push r25 2beb2: 8f 93 push r24 2beb4: 7f 93 push r23 2beb6: 6f 93 push r22 2beb8: 84 e1 ldi r24, 0x14 ; 20 2beba: 9f e8 ldi r25, 0x8F ; 143 2bebc: 9f 93 push r25 2bebe: 8f 93 push r24 2bec0: 0e 94 56 88 call 0x110ac ; 0x110ac // Restore acceleration settings float acceleration = eeprom_read_float((float*)(EEPROM_UVLO_ACCELL)); 2bec4: 81 e1 ldi r24, 0x11 ; 17 2bec6: 9d e0 ldi r25, 0x0D ; 13 2bec8: 0f 94 18 dc call 0x3b830 ; 0x3b830 2becc: d6 2e mov r13, r22 2bece: c7 2e mov r12, r23 2bed0: b8 2e mov r11, r24 2bed2: a9 2e mov r10, r25 float retract_acceleration = eeprom_read_float((float*)(EEPROM_UVLO_RETRACT_ACCELL)); 2bed4: 8d e0 ldi r24, 0x0D ; 13 2bed6: 9d e0 ldi r25, 0x0D ; 13 2bed8: 0f 94 18 dc call 0x3b830 ; 0x3b830 2bedc: 96 2e mov r9, r22 2bede: 77 2e mov r7, r23 2bee0: 68 2e mov r6, r24 2bee2: 59 2e mov r5, r25 float travel_acceleration = eeprom_read_float((float*)(EEPROM_UVLO_TRAVEL_ACCELL)); 2bee4: 89 e0 ldi r24, 0x09 ; 9 2bee6: 9d e0 ldi r25, 0x0D ; 13 2bee8: 0f 94 18 dc call 0x3b830 ; 0x3b830 // accelerations are usually ordinary numbers, no need to keep extensive amount of decimal places enquecommandf_P(PSTR("M204 P%-.1f R%-.1f T%-.1f"), acceleration, retract_acceleration, travel_acceleration); 2beec: 9f 93 push r25 2beee: 8f 93 push r24 2bef0: 7f 93 push r23 2bef2: 6f 93 push r22 2bef4: 5f 92 push r5 2bef6: 6f 92 push r6 2bef8: 7f 92 push r7 2befa: 9f 92 push r9 2befc: af 92 push r10 2befe: bf 92 push r11 2bf00: cf 92 push r12 2bf02: df 92 push r13 2bf04: 8a ef ldi r24, 0xFA ; 250 2bf06: 9e e8 ldi r25, 0x8E ; 142 2bf08: 9f 93 push r25 2bf0a: 8f 93 push r24 2bf0c: 0e 94 56 88 call 0x110ac ; 0x110ac // Unretract. enquecommandf_P(G1_E_F2700, default_retraction); 2bf10: 8f e3 ldi r24, 0x3F ; 63 2bf12: 8f 93 push r24 2bf14: 80 e8 ldi r24, 0x80 ; 128 2bf16: 8f 93 push r24 2bf18: 1f 92 push r1 2bf1a: 1f 92 push r1 2bf1c: 80 ef ldi r24, 0xF0 ; 240 2bf1e: 9d e6 ldi r25, 0x6D ; 109 2bf20: 9f 93 push r25 2bf22: 8f 93 push r24 2bf24: 0e 94 56 88 call 0x110ac ; 0x110ac // Recover final E axis position and mode float pos_e = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E)); 2bf28: 8e e6 ldi r24, 0x6E ; 110 2bf2a: 9f e0 ldi r25, 0x0F ; 15 2bf2c: 0f 94 18 dc call 0x3b830 ; 0x3b830 enquecommandf_P(PSTR("G92 E%-.3f"), pos_e); 2bf30: 9f 93 push r25 2bf32: 8f 93 push r24 2bf34: 7f 93 push r23 2bf36: 6f 93 push r22 2bf38: 8f ee ldi r24, 0xEF ; 239 2bf3a: 9e e8 ldi r25, 0x8E ; 142 2bf3c: 9f 93 push r25 2bf3e: 8f 93 push r24 2bf40: 0e 94 56 88 call 0x110ac ; 0x110ac if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS)) 2bf44: 0f b6 in r0, 0x3f ; 63 2bf46: f8 94 cli 2bf48: de bf out 0x3e, r29 ; 62 2bf4a: 0f be out 0x3f, r0 ; 63 2bf4c: cd bf out 0x3d, r28 ; 61 2bf4e: 82 e7 ldi r24, 0x72 ; 114 2bf50: 9f e0 ldi r25, 0x0F ; 15 2bf52: 0f 94 10 dc call 0x3b820 ; 0x3b820 2bf56: 88 23 and r24, r24 2bf58: 29 f0 breq .+10 ; 0x2bf64 enquecommand_P(PSTR("M82")); //E axis abslute mode 2bf5a: 61 e0 ldi r22, 0x01 ; 1 2bf5c: 8b ee ldi r24, 0xEB ; 235 2bf5e: 9e e8 ldi r25, 0x8E ; 142 2bf60: 0e 94 b8 87 call 0x10f70 ; 0x10f70 // Set the feedrates saved at the power panic. enquecommandf_P(PSTR("G1 F%d"), feedrate_rec); 2bf64: 1f 93 push r17 2bf66: 0f 93 push r16 2bf68: 84 ee ldi r24, 0xE4 ; 228 2bf6a: 9e e8 ldi r25, 0x8E ; 142 2bf6c: 9f 93 push r25 2bf6e: 8f 93 push r24 2bf70: 0e 94 56 88 call 0x110ac ; 0x110ac enquecommandf_P(MSG_M220, feedmultiply_rec); 2bf74: ef 92 push r14 2bf76: ff 92 push r15 2bf78: 8c eb ldi r24, 0xBC ; 188 2bf7a: 9d e6 ldi r25, 0x6D ; 109 2bf7c: 9f 93 push r25 2bf7e: 8f 93 push r24 2bf80: 0e 94 56 88 call 0x110ac ; 0x110ac // Set the fan speed saved at the power panic. enquecommandf_P(PSTR("M106 S%u"), fan_speed_rec); 2bf84: 1f 92 push r1 2bf86: 8f 92 push r8 2bf88: 8b ed ldi r24, 0xDB ; 219 2bf8a: 9e e8 ldi r25, 0x8E ; 142 2bf8c: 9f 93 push r25 2bf8e: 8f 93 push r24 2bf90: 0e 94 56 88 call 0x110ac ; 0x110ac // SD: Position in file, USB: g-code line number uint32_t position = eeprom_read_dword((uint32_t*)(EEPROM_FILE_POSITION)); 2bf94: 81 e9 ldi r24, 0x91 ; 145 2bf96: 9f e0 ldi r25, 0x0F ; 15 2bf98: 0f 94 18 dc call 0x3b830 ; 0x3b830 if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) 2bf9c: 20 91 6a 02 lds r18, 0x026A ; 0x80026a 2bfa0: 0f b6 in r0, 0x3f ; 63 2bfa2: f8 94 cli 2bfa4: de bf out 0x3e, r29 ; 62 2bfa6: 0f be out 0x3f, r0 ; 63 2bfa8: cd bf out 0x3d, r28 ; 61 2bfaa: 21 11 cpse r18, r1 2bfac: 33 c0 rjmp .+102 ; 0x2c014 { // Set a position in the file. enquecommandf_P(PSTR("M26 S%lu"), position); 2bfae: 9f 93 push r25 2bfb0: 8f 93 push r24 2bfb2: 7f 93 push r23 2bfb4: 6f 93 push r22 2bfb6: 82 ed ldi r24, 0xD2 ; 210 2bfb8: 9e e8 ldi r25, 0x8E ; 142 } else if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { // Set line number enquecommandf_P(PSTR("M110 N%lu"), position); 2bfba: 9f 93 push r25 2bfbc: 8f 93 push r24 2bfbe: 0e 94 56 88 call 0x110ac ; 0x110ac 2bfc2: 0f 90 pop r0 2bfc4: 0f 90 pop r0 2bfc6: 0f 90 pop r0 2bfc8: 0f 90 pop r0 2bfca: 0f 90 pop r0 2bfcc: 0f 90 pop r0 } enquecommand_P(PSTR("G4 S0")); 2bfce: 61 e0 ldi r22, 0x01 ; 1 2bfd0: 82 ec ldi r24, 0xC2 ; 194 2bfd2: 9e e8 ldi r25, 0x8E ; 142 2bfd4: 0e 94 b8 87 call 0x10f70 ; 0x10f70 enquecommand_P(PSTR("PRUSA uvlo")); 2bfd8: 61 e0 ldi r22, 0x01 ; 1 2bfda: 87 eb ldi r24, 0xB7 ; 183 2bfdc: 9e e8 ldi r25, 0x8E ; 142 2bfde: 0e 94 b8 87 call 0x10f70 ; 0x10f70 puts_P(_N("Temperature Restored\n")); gcode_M114(); // Restart the print. restore_print_from_eeprom(mbl_was_active); puts_P(_N("Done reading EEPROM\n")); 2bfe2: 85 ec ldi r24, 0xC5 ; 197 2bfe4: 9d e6 ldi r25, 0x6D ; 109 2bfe6: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 gcode_M114(); 2bfea: 0e 94 df 77 call 0xefbe ; 0xefbe } 2bfee: 0f 90 pop r0 2bff0: 0f 90 pop r0 2bff2: df 91 pop r29 2bff4: cf 91 pop r28 2bff6: 1f 91 pop r17 2bff8: 0f 91 pop r16 2bffa: ff 90 pop r15 2bffc: ef 90 pop r14 2bffe: df 90 pop r13 2c000: cf 90 pop r12 2c002: bf 90 pop r11 2c004: af 90 pop r10 2c006: 9f 90 pop r9 2c008: 8f 90 pop r8 2c00a: 7f 90 pop r7 2c00c: 6f 90 pop r6 2c00e: 5f 90 pop r5 2c010: 4f 90 pop r4 2c012: 08 95 ret if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { // Set a position in the file. enquecommandf_P(PSTR("M26 S%lu"), position); } else if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) 2c014: 21 30 cpi r18, 0x01 ; 1 2c016: d9 f6 brne .-74 ; 0x2bfce { // Set line number enquecommandf_P(PSTR("M110 N%lu"), position); 2c018: 9f 93 push r25 2c01a: 8f 93 push r24 2c01c: 7f 93 push r23 2c01e: 6f 93 push r22 2c020: 88 ec ldi r24, 0xC8 ; 200 2c022: 9e e8 ldi r25, 0x8E ; 142 2c024: ca cf rjmp .-108 ; 0x2bfba 0002c026 : 2c026: 88 e1 ldi r24, 0x18 ; 24 2c028: 9e e0 ldi r25, 0x0E ; 14 2c02a: 0f b6 in r0, 0x3f ; 63 2c02c: f8 94 cli 2c02e: a8 95 wdr 2c030: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2c034: 0f be out 0x3f, r0 ; 63 2c036: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> static void restore_print_from_eeprom(bool mbl_was_active); static void uvlo_drain_reset() { // burn all that residual power wdt_enable(WDTO_1S); WRITE(BEEPER,HIGH); 2c03a: 9f b7 in r25, 0x3f ; 63 2c03c: f8 94 cli 2c03e: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2c042: 84 60 ori r24, 0x04 ; 4 2c044: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2c048: 9f bf out 0x3f, r25 ; 63 lcd_clear(); 2c04a: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 1, MSG_POWERPANIC_DETECTED); 2c04e: 4d e5 ldi r20, 0x5D ; 93 2c050: 5d e6 ldi r21, 0x6D ; 109 2c052: 61 e0 ldi r22, 0x01 ; 1 2c054: 80 e0 ldi r24, 0x00 ; 0 2c056: 0e 94 8c 6e call 0xdd18 ; 0xdd18 2c05a: ff cf rjmp .-2 ; 0x2c05a 0002c05c <__vector_5>: SERIAL_ECHOLNRPGM(MSG_INT4); uvlo_drain_reset(); } } ISR(INT4_vect) { 2c05c: 1f 92 push r1 2c05e: 0f 92 push r0 2c060: 0f b6 in r0, 0x3f ; 63 2c062: 0f 92 push r0 2c064: 11 24 eor r1, r1 2c066: 0b b6 in r0, 0x3b ; 59 2c068: 0f 92 push r0 2c06a: 8f 92 push r8 2c06c: 9f 92 push r9 2c06e: af 92 push r10 2c070: bf 92 push r11 2c072: cf 92 push r12 2c074: df 92 push r13 2c076: ef 92 push r14 2c078: ff 92 push r15 2c07a: 0f 93 push r16 2c07c: 1f 93 push r17 2c07e: 2f 93 push r18 2c080: 3f 93 push r19 2c082: 4f 93 push r20 2c084: 5f 93 push r21 2c086: 6f 93 push r22 2c088: 7f 93 push r23 2c08a: 8f 93 push r24 2c08c: 9f 93 push r25 2c08e: af 93 push r26 2c090: bf 93 push r27 2c092: cf 93 push r28 2c094: df 93 push r29 2c096: ef 93 push r30 2c098: ff 93 push r31 EIMSK &= ~(1 << 4); //disable INT4 interrupt to make sure that this code will be executed just once 2c09a: ec 98 cbi 0x1d, 4 ; 29 SERIAL_ECHOLNRPGM(MSG_INT4); 2c09c: 8d e5 ldi r24, 0x5D ; 93 2c09e: 9d e8 ldi r25, 0x8D ; 141 2c0a0: 0e 94 13 79 call 0xf226 ; 0xf226 if (eeprom_read_byte((uint8_t*)EEPROM_UVLO) == PowerPanic::NO_PENDING_RECOVERY) 2c0a4: 85 ea ldi r24, 0xA5 ; 165 2c0a6: 9f e0 ldi r25, 0x0F ; 15 2c0a8: 0f 94 10 dc call 0x3b820 ; 0x3b820 2c0ac: 18 2f mov r17, r24 2c0ae: 81 11 cpse r24, r1 2c0b0: de c2 rjmp .+1468 ; 0x2c66e <__vector_5+0x612> { if(printer_active()) { 2c0b2: 0e 94 79 67 call 0xcef2 ; 0xcef2 2c0b6: 88 23 and r24, r24 2c0b8: 09 f4 brne .+2 ; 0x2c0bc <__vector_5+0x60> 2c0ba: a9 c3 rjmp .+1874 ; 0x2c80e <__vector_5+0x7b2> while(1); } void uvlo_() { unsigned long time_start = _millis(); 2c0bc: 0f 94 28 2a call 0x25450 ; 0x25450 2c0c0: 6b 01 movw r12, r22 2c0c2: 7c 01 movw r14, r24 // True if a print is already saved to RAM const bool print_saved_in_ram = saved_printing && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE); 2c0c4: c0 91 a8 0d lds r28, 0x0DA8 ; 0x800da8 2c0c8: cc 23 and r28, r28 2c0ca: 31 f0 breq .+12 ; 0x2c0d8 <__vector_5+0x7c> 2c0cc: c1 e0 ldi r28, 0x01 ; 1 2c0ce: 80 91 6a 02 lds r24, 0x026A ; 0x80026a 2c0d2: 82 30 cpi r24, 0x02 ; 2 2c0d4: 09 f4 brne .+2 ; 0x2c0d8 <__vector_5+0x7c> 2c0d6: c0 e0 ldi r28, 0x00 ; 0 const bool pos_invalid = mesh_bed_leveling_flag || homing_flag; 2c0d8: d0 91 a7 0d lds r29, 0x0DA7 ; 0x800da7 2c0dc: d1 11 cpse r29, r1 2c0de: 02 c0 rjmp .+4 ; 0x2c0e4 <__vector_5+0x88> 2c0e0: d0 91 a6 0d lds r29, 0x0DA6 ; 0x800da6 // Conserve as much power as soon as possible // Turn off the LCD backlight #ifdef LCD_BL_PIN backlightMode = BACKLIGHT_MODE_DIM; 2c0e4: 10 92 4f 02 sts 0x024F, r1 ; 0x80024f backlightLevel_LOW = 0; 2c0e8: 10 92 ff 03 sts 0x03FF, r1 ; 0x8003ff backlight_update(); 2c0ec: 0e 94 a6 89 call 0x1134c ; 0x1134c #endif //LCD_BL_PIN // Disable X and Y motors to conserve power disable_x(); 2c0f0: 17 9a sbi 0x02, 7 ; 2 2c0f2: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e disable_y(); 2c0f6: 16 9a sbi 0x02, 6 ; 2 2c0f8: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f // Minimise Z and E motor currents (Hold and Run) #ifdef TMC2130 currents[Z_AXIS].setiHold(20); 2c0fc: 64 e1 ldi r22, 0x14 ; 20 2c0fe: 83 e6 ldi r24, 0x63 ; 99 2c100: 92 e0 ldi r25, 0x02 ; 2 2c102: 0e 94 96 67 call 0xcf2c ; 0xcf2c currents[Z_AXIS].setiRun(20); 2c106: 64 e1 ldi r22, 0x14 ; 20 2c108: 83 e6 ldi r24, 0x63 ; 99 2c10a: 92 e0 ldi r25, 0x02 ; 2 2c10c: 0e 94 9e 67 call 0xcf3c ; 0xcf3c tmc2130_setup_chopper(Z_AXIS, tmc2130_mres[Z_AXIS]); 2c110: 50 e0 ldi r21, 0x00 ; 0 2c112: 40 e0 ldi r20, 0x00 ; 0 2c114: 60 91 f6 04 lds r22, 0x04F6 ; 0x8004f6 2c118: 82 e0 ldi r24, 0x02 ; 2 2c11a: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 currents[E_AXIS].setiHold(20); 2c11e: 64 e1 ldi r22, 0x14 ; 20 2c120: 86 e6 ldi r24, 0x66 ; 102 2c122: 92 e0 ldi r25, 0x02 ; 2 2c124: 0e 94 96 67 call 0xcf2c ; 0xcf2c currents[E_AXIS].setiRun(20); 2c128: 64 e1 ldi r22, 0x14 ; 20 2c12a: 86 e6 ldi r24, 0x66 ; 102 2c12c: 92 e0 ldi r25, 0x02 ; 2 2c12e: 0e 94 9e 67 call 0xcf3c ; 0xcf3c tmc2130_setup_chopper(E_AXIS, tmc2130_mres[E_AXIS]); 2c132: 50 e0 ldi r21, 0x00 ; 0 2c134: 40 e0 ldi r20, 0x00 ; 0 2c136: 60 91 f7 04 lds r22, 0x04F7 ; 0x8004f7 2c13a: 83 e0 ldi r24, 0x03 ; 3 2c13c: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 #endif //TMC2130 if (!print_saved_in_ram && !isPartialBackupAvailable) 2c140: c1 11 cpse r28, r1 2c142: 1b c0 rjmp .+54 ; 0x2c17a <__vector_5+0x11e> 2c144: 80 91 a1 06 lds r24, 0x06A1 ; 0x8006a1 2c148: 81 11 cpse r24, r1 2c14a: 17 c0 rjmp .+46 ; 0x2c17a <__vector_5+0x11e> { saved_bed_temperature = target_temperature_bed; 2c14c: 80 91 71 06 lds r24, 0x0671 ; 0x800671 2c150: 80 93 ad 05 sts 0x05AD, r24 ; 0x8005ad saved_extruder_temperature = target_temperature[active_extruder]; 2c154: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 2c158: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 2c15c: 90 93 ac 05 sts 0x05AC, r25 ; 0x8005ac 2c160: 80 93 ab 05 sts 0x05AB, r24 ; 0x8005ab saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; 2c164: 80 91 e3 03 lds r24, 0x03E3 ; 0x8003e3 2c168: 83 fb bst r24, 3 2c16a: 88 27 eor r24, r24 2c16c: 80 f9 bld r24, 0 2c16e: 80 93 63 05 sts 0x0563, r24 ; 0x800563 saved_fan_speed = fanSpeed; 2c172: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 2c176: 80 93 aa 05 sts 0x05AA, r24 ; 0x8005aa } // Stop all heaters before continuing disable_heater(); 2c17a: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 // Fetch data not included in a partial back-up if (!print_saved_in_ram) { 2c17e: c1 11 cpse r28, r1 2c180: 04 c0 rjmp .+8 ; 0x2c18a <__vector_5+0x12e> // Calculate the file position, from which to resume this print. save_print_file_state(); 2c182: 0e 94 d2 64 call 0xc9a4 ; 0xc9a4 // save the global state at planning time save_planner_global_state(); 2c186: 0e 94 88 64 call 0xc910 ; 0xc910 } // From this point on and up to the print recovery, Z should not move during X/Y travels and // should be controlled precisely. Reset the MBL status before planner_abort_hard in order to // get the physical Z for further manipulation. bool mbl_was_active = mbl.active; 2c18a: 00 91 c1 13 lds r16, 0x13C1 ; 0x8013c1 mbl.active = false; 2c18e: 10 92 c1 13 sts 0x13C1, r1 ; 0x8013c1 // After this call, the planner queue is emptied and the current_position is set to a current logical coordinate. // The logical coordinate will likely differ from the machine coordinate if the skew calibration and mesh bed leveling // are in action. planner_abort_hard(); 2c192: 0f 94 b7 c1 call 0x3836e ; 0x3836e // When there is no position already saved, then we must grab whatever the current position is. // This is most likely a position where the printer is in the middle of a G-code move if (!print_saved_in_ram && !isPartialBackupAvailable) 2c196: c1 11 cpse r28, r1 2c198: 1b c0 rjmp .+54 ; 0x2c1d0 <__vector_5+0x174> 2c19a: 80 91 a1 06 lds r24, 0x06A1 ; 0x8006a1 2c19e: 81 11 cpse r24, r1 2c1a0: 17 c0 rjmp .+46 ; 0x2c1d0 <__vector_5+0x174> { memcpy(saved_pos, current_position, sizeof(saved_pos)); 2c1a2: 80 e1 ldi r24, 0x10 ; 16 2c1a4: e1 e9 ldi r30, 0x91 ; 145 2c1a6: f6 e0 ldi r31, 0x06 ; 6 2c1a8: a3 e7 ldi r26, 0x73 ; 115 2c1aa: b2 e0 ldi r27, 0x02 ; 2 2c1ac: 01 90 ld r0, Z+ 2c1ae: 0d 92 st X+, r0 2c1b0: 8a 95 dec r24 2c1b2: e1 f7 brne .-8 ; 0x2c1ac <__vector_5+0x150> if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID; 2c1b4: dd 23 and r29, r29 2c1b6: 61 f0 breq .+24 ; 0x2c1d0 <__vector_5+0x174> 2c1b8: 80 e0 ldi r24, 0x00 ; 0 2c1ba: 90 e0 ldi r25, 0x00 ; 0 2c1bc: a0 e8 ldi r26, 0x80 ; 128 2c1be: bf eb ldi r27, 0xBF ; 191 2c1c0: 80 93 73 02 sts 0x0273, r24 ; 0x800273 2c1c4: 90 93 74 02 sts 0x0274, r25 ; 0x800274 2c1c8: a0 93 75 02 sts 0x0275, r26 ; 0x800275 2c1cc: b0 93 76 02 sts 0x0276, r27 ; 0x800276 } // Store the print logical Z position, which we need to recover (a slight error here would be // recovered on the next Gcode instruction, while a physical location error would not) float logical_z = saved_pos[Z_AXIS]; 2c1d0: 80 90 7b 02 lds r8, 0x027B ; 0x80027b 2c1d4: 90 90 7c 02 lds r9, 0x027C ; 0x80027c 2c1d8: a0 90 7d 02 lds r10, 0x027D ; 0x80027d 2c1dc: b0 90 7e 02 lds r11, 0x027E ; 0x80027e if(mbl_was_active) { 2c1e0: 00 23 and r16, r16 2c1e2: d1 f0 breq .+52 ; 0x2c218 <__vector_5+0x1bc> // Mesh bed leveling was being actively applied to the Z-position. Revert the // mesh bed leveling offset value. logical_z -= mbl.get_z(saved_pos[X_AXIS], saved_pos[Y_AXIS]); 2c1e4: 20 91 77 02 lds r18, 0x0277 ; 0x800277 2c1e8: 30 91 78 02 lds r19, 0x0278 ; 0x800278 2c1ec: 40 91 79 02 lds r20, 0x0279 ; 0x800279 2c1f0: 50 91 7a 02 lds r21, 0x027A ; 0x80027a 2c1f4: 60 91 73 02 lds r22, 0x0273 ; 0x800273 2c1f8: 70 91 74 02 lds r23, 0x0274 ; 0x800274 2c1fc: 80 91 75 02 lds r24, 0x0275 ; 0x800275 2c200: 90 91 76 02 lds r25, 0x0276 ; 0x800276 2c204: 0f 94 a5 a1 call 0x3434a ; 0x3434a 2c208: 9b 01 movw r18, r22 2c20a: ac 01 movw r20, r24 2c20c: c5 01 movw r24, r10 2c20e: b4 01 movw r22, r8 2c210: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2c214: 4b 01 movw r8, r22 2c216: 5c 01 movw r10, r24 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c218: b5 01 movw r22, r10 2c21a: a4 01 movw r20, r8 2c21c: 8d e8 ldi r24, 0x8D ; 141 2c21e: 9f e0 ldi r25, 0x0F ; 15 2c220: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c224: 40 91 7f 02 lds r20, 0x027F ; 0x80027f 2c228: 50 91 80 02 lds r21, 0x0280 ; 0x800280 2c22c: 60 91 81 02 lds r22, 0x0281 ; 0x800281 2c230: 70 91 82 02 lds r23, 0x0282 ; 0x800282 2c234: 8e e6 ldi r24, 0x6E ; 110 2c236: 9f e0 ldi r25, 0x0F ; 15 2c238: 0f 94 46 dc call 0x3b88c ; 0x3b88c } eeprom_update_float_notify((float*)EEPROM_UVLO_CURRENT_POSITION_Z, logical_z); // Store the print E position before we lose track eeprom_update_float_notify((float*)(EEPROM_UVLO_CURRENT_POSITION_E), saved_pos[E_AXIS]); eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_E_ABS, !saved_extruder_relative_mode); 2c23c: 60 91 63 05 lds r22, 0x0563 ; 0x800563 2c240: c1 e0 ldi r28, 0x01 ; 1 2c242: 6c 27 eor r22, r28 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2c244: 82 e7 ldi r24, 0x72 ; 114 2c246: 9f e0 ldi r25, 0x0F ; 15 2c248: 0f 94 34 dc call 0x3b868 ; 0x3b868 // Clean the input command queue, inhibit serial processing using saved_printing cmdqueue_reset(); 2c24c: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 card.sdprinting = false; 2c250: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f saved_printing = true; 2c254: c0 93 a8 0d sts 0x0DA8, r28 ; 0x800da8 // Enable stepper driver interrupt to move Z axis. This should be fine as the planner and // command queues are empty, SD card printing is disabled, usb is inhibited. planner_aborted = false; 2c258: 10 92 ab 0d sts 0x0DAB, r1 ; 0x800dab sei(); 2c25c: 78 94 sei // Retract current_position[E_AXIS] -= default_retraction; 2c25e: 20 e0 ldi r18, 0x00 ; 0 2c260: 30 e0 ldi r19, 0x00 ; 0 2c262: 40 e8 ldi r20, 0x80 ; 128 2c264: 5f e3 ldi r21, 0x3F ; 63 2c266: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 2c26a: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 2c26e: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 2c272: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 2c276: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2c27a: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 2c27e: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 2c282: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 2c286: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_buffer_line_curposXYZE(95); 2c28a: 60 e0 ldi r22, 0x00 ; 0 2c28c: 70 e0 ldi r23, 0x00 ; 0 2c28e: 8e eb ldi r24, 0xBE ; 190 2c290: 92 e4 ldi r25, 0x42 ; 66 2c292: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 2c296: 0f 94 a9 43 call 0x28752 ; 0x28752 disable_e0(); 2c29a: 14 9a sbi 0x02, 4 ; 2 return stat; } uint16_t tmc2130_get_res(uint8_t axis) { return tmc2130_mres2usteps(tmc2130_mres[axis]); 2c29c: 80 91 f6 04 lds r24, 0x04F6 ; 0x8004f6 2c2a0: c0 e0 ldi r28, 0x00 ; 0 2c2a2: d1 e0 ldi r29, 0x01 ; 1 2c2a4: 02 c0 rjmp .+4 ; 0x2c2aa <__vector_5+0x24e> 2c2a6: d6 95 lsr r29 2c2a8: c7 95 ror r28 2c2aa: 8a 95 dec r24 2c2ac: e2 f7 brpl .-8 ; 0x2c2a6 <__vector_5+0x24a> // Read out the current Z motor microstep counter to move the axis up towards // a full step before powering off. NOTE: we need to ensure to schedule more // than "dropsegments" steps in order to move (this is always the case here // due to UVLO_Z_AXIS_SHIFT being used) uint16_t z_res = tmc2130_get_res(Z_AXIS); uint16_t z_microsteps = tmc2130_rd_MSCNT(Z_AXIS); 2c2ae: 82 e0 ldi r24, 0x02 ; 2 2c2b0: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 current_position[Z_AXIS] += float(1024 - z_microsteps) 2c2b4: 60 e0 ldi r22, 0x00 ; 0 2c2b6: 74 e0 ldi r23, 0x04 ; 4 2c2b8: 68 1b sub r22, r24 2c2ba: 79 0b sbc r23, r25 2c2bc: 90 e0 ldi r25, 0x00 ; 0 2c2be: 80 e0 ldi r24, 0x00 ; 0 2c2c0: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2c2c4: 4b 01 movw r8, r22 2c2c6: 5c 01 movw r10, r24 / (z_res * cs.axis_steps_per_mm[Z_AXIS]) 2c2c8: be 01 movw r22, r28 2c2ca: 90 e0 ldi r25, 0x00 ; 0 2c2cc: 80 e0 ldi r24, 0x00 ; 0 2c2ce: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2c2d2: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 2c2d6: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 2c2da: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 2c2de: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 2c2e2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2c2e6: 9b 01 movw r18, r22 2c2e8: ac 01 movw r20, r24 2c2ea: c5 01 movw r24, r10 2c2ec: b4 01 movw r22, r8 2c2ee: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> + UVLO_Z_AXIS_SHIFT; 2c2f2: 2a e0 ldi r18, 0x0A ; 10 2c2f4: 37 ed ldi r19, 0xD7 ; 215 2c2f6: 43 e2 ldi r20, 0x23 ; 35 2c2f8: 5f e3 ldi r21, 0x3F ; 63 2c2fa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> // a full step before powering off. NOTE: we need to ensure to schedule more // than "dropsegments" steps in order to move (this is always the case here // due to UVLO_Z_AXIS_SHIFT being used) uint16_t z_res = tmc2130_get_res(Z_AXIS); uint16_t z_microsteps = tmc2130_rd_MSCNT(Z_AXIS); current_position[Z_AXIS] += float(1024 - z_microsteps) 2c2fe: 20 91 99 06 lds r18, 0x0699 ; 0x800699 2c302: 30 91 9a 06 lds r19, 0x069A ; 0x80069a 2c306: 40 91 9b 06 lds r20, 0x069B ; 0x80069b 2c30a: 50 91 9c 06 lds r21, 0x069C ; 0x80069c 2c30e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2c312: 60 93 99 06 sts 0x0699, r22 ; 0x800699 2c316: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 2c31a: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 2c31e: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c / (z_res * cs.axis_steps_per_mm[Z_AXIS]) + UVLO_Z_AXIS_SHIFT; plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS]/60); 2c322: 65 e5 ldi r22, 0x55 ; 85 2c324: 75 e5 ldi r23, 0x55 ; 85 2c326: 85 e5 ldi r24, 0x55 ; 85 2c328: 91 e4 ldi r25, 0x41 ; 65 2c32a: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 2c32e: 0f 94 a9 43 call 0x28752 ; 0x28752 if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); 2c332: 40 91 5f 05 lds r20, 0x055F ; 0x80055f 2c336: 50 91 60 05 lds r21, 0x0560 ; 0x800560 2c33a: 60 91 61 05 lds r22, 0x0561 ; 0x800561 2c33e: 70 91 62 05 lds r23, 0x0562 ; 0x800562 2c342: 81 e9 ldi r24, 0x91 ; 145 2c344: 9f e0 ldi r25, 0x0F ; 15 2c346: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c34a: ce ea ldi r28, 0xAE ; 174 2c34c: dd e0 ldi r29, 0x0D ; 13 // Store the mesh bed leveling offsets. This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case. for (uint8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) { uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1 uint8_t iy = mesh_point / MESH_NUM_X_POINTS; 2c34e: 97 e0 ldi r25, 0x07 ; 7 2c350: b9 2e mov r11, r25 // Scale the z value to 1u resolution. int16_t v = mbl_was_active ? int16_t(floor(mbl.z_values[iy][ix] * 1000.f + 0.5f)) : 0; 2c352: 70 e0 ldi r23, 0x00 ; 0 2c354: 60 e0 ldi r22, 0x00 ; 0 2c356: 00 23 and r16, r16 2c358: 19 f1 breq .+70 ; 0x2c3a0 <__vector_5+0x344> // Store the mesh bed leveling offsets. This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case. for (uint8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) { uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1 uint8_t iy = mesh_point / MESH_NUM_X_POINTS; 2c35a: 81 2f mov r24, r17 2c35c: 6b 2d mov r22, r11 2c35e: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> // Scale the z value to 1u resolution. int16_t v = mbl_was_active ? int16_t(floor(mbl.z_values[iy][ix] * 1000.f + 0.5f)) : 0; 2c362: b8 9e mul r11, r24 2c364: f0 01 movw r30, r0 2c366: 11 24 eor r1, r1 2c368: e9 0f add r30, r25 2c36a: f1 1d adc r31, r1 2c36c: ee 0f add r30, r30 2c36e: ff 1f adc r31, r31 2c370: ee 0f add r30, r30 2c372: ff 1f adc r31, r31 2c374: ef 53 subi r30, 0x3F ; 63 2c376: fc 4e sbci r31, 0xEC ; 236 2c378: 20 e0 ldi r18, 0x00 ; 0 2c37a: 30 e0 ldi r19, 0x00 ; 0 2c37c: 4a e7 ldi r20, 0x7A ; 122 2c37e: 54 e4 ldi r21, 0x44 ; 68 2c380: 61 81 ldd r22, Z+1 ; 0x01 2c382: 72 81 ldd r23, Z+2 ; 0x02 2c384: 83 81 ldd r24, Z+3 ; 0x03 2c386: 94 81 ldd r25, Z+4 ; 0x04 2c388: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2c38c: 20 e0 ldi r18, 0x00 ; 0 2c38e: 30 e0 ldi r19, 0x00 ; 0 2c390: 40 e0 ldi r20, 0x00 ; 0 2c392: 5f e3 ldi r21, 0x3F ; 63 2c394: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2c398: 0f 94 df de call 0x3bdbe ; 0x3bdbe 2c39c: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2c3a0: ce 01 movw r24, r28 2c3a2: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 // Write the file position. eeprom_update_dword_notify((uint32_t*)(EEPROM_FILE_POSITION), saved_sdpos); // Store the mesh bed leveling offsets. This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case. for (uint8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) 2c3a6: 1f 5f subi r17, 0xFF ; 255 2c3a8: 22 96 adiw r28, 0x02 ; 2 2c3aa: 11 33 cpi r17, 0x31 ; 49 2c3ac: 91 f6 brne .-92 ; 0x2c352 <__vector_5+0x2f6> if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c3ae: 40 91 99 06 lds r20, 0x0699 ; 0x800699 2c3b2: 50 91 9a 06 lds r21, 0x069A ; 0x80069a 2c3b6: 60 91 9b 06 lds r22, 0x069B ; 0x80069b 2c3ba: 70 91 9c 06 lds r23, 0x069C ; 0x80069c 2c3be: 8a ed ldi r24, 0xDA ; 218 2c3c0: 9e e0 ldi r25, 0x0E ; 14 2c3c2: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c3c6: 40 91 73 02 lds r20, 0x0273 ; 0x800273 2c3ca: 50 91 74 02 lds r21, 0x0274 ; 0x800274 2c3ce: 60 91 75 02 lds r22, 0x0275 ; 0x800275 2c3d2: 70 91 76 02 lds r23, 0x0276 ; 0x800276 2c3d6: 8d e9 ldi r24, 0x9D ; 157 2c3d8: 9f e0 ldi r25, 0x0F ; 15 2c3da: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c3de: 40 91 77 02 lds r20, 0x0277 ; 0x800277 2c3e2: 50 91 78 02 lds r21, 0x0278 ; 0x800278 2c3e6: 60 91 79 02 lds r22, 0x0279 ; 0x800279 2c3ea: 70 91 7a 02 lds r23, 0x027A ; 0x80027a 2c3ee: 81 ea ldi r24, 0xA1 ; 161 2c3f0: 9f e0 ldi r25, 0x0F ; 15 2c3f2: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2c3f6: 60 91 5d 05 lds r22, 0x055D ; 0x80055d 2c3fa: 70 91 5e 05 lds r23, 0x055E ; 0x80055e 2c3fe: 89 e8 ldi r24, 0x89 ; 137 2c400: 9f e0 ldi r25, 0x0F ; 15 2c402: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 2c406: 60 91 39 02 lds r22, 0x0239 ; 0x800239 2c40a: 70 91 3a 02 lds r23, 0x023A ; 0x80023a 2c40e: 85 e3 ldi r24, 0x35 ; 53 2c410: 9d e0 ldi r25, 0x0D ; 13 2c412: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 2c416: 60 91 ab 05 lds r22, 0x05AB ; 0x8005ab 2c41a: 70 91 ac 05 lds r23, 0x05AC ; 0x8005ac 2c41e: 88 ed ldi r24, 0xD8 ; 216 2c420: 9e e0 ldi r25, 0x0E ; 14 2c422: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2c426: 60 91 ad 05 lds r22, 0x05AD ; 0x8005ad 2c42a: 8b e8 ldi r24, 0x8B ; 139 2c42c: 9f e0 ldi r25, 0x0F ; 15 2c42e: 0f 94 34 dc call 0x3b868 ; 0x3b868 2c432: 60 91 aa 05 lds r22, 0x05AA ; 0x8005aa 2c436: 88 e8 ldi r24, 0x88 ; 136 2c438: 9f e0 ldi r25, 0x0F ; 15 2c43a: 0f 94 34 dc call 0x3b868 ; 0x3b868 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c43e: 40 91 93 02 lds r20, 0x0293 ; 0x800293 2c442: 50 91 94 02 lds r21, 0x0294 ; 0x800294 2c446: 60 91 95 02 lds r22, 0x0295 ; 0x800295 2c44a: 70 91 96 02 lds r23, 0x0296 ; 0x800296 2c44e: 88 ee ldi r24, 0xE8 ; 232 2c450: 9e e0 ldi r25, 0x0E ; 14 2c452: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2c456: 60 91 bc 02 lds r22, 0x02BC ; 0x8002bc 2c45a: 70 91 bd 02 lds r23, 0x02BD ; 0x8002bd 2c45e: 8e ed ldi r24, 0xDE ; 222 2c460: 9e e0 ldi r25, 0x0E ; 14 2c462: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c466: 40 91 f1 0d lds r20, 0x0DF1 ; 0x800df1 2c46a: 50 91 f2 0d lds r21, 0x0DF2 ; 0x800df2 2c46e: 60 91 f3 0d lds r22, 0x0DF3 ; 0x800df3 2c472: 70 91 f4 0d lds r23, 0x0DF4 ; 0x800df4 2c476: 81 e1 ldi r24, 0x11 ; 17 2c478: 9d e0 ldi r25, 0x0D ; 13 2c47a: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c47e: 40 91 f5 0d lds r20, 0x0DF5 ; 0x800df5 2c482: 50 91 f6 0d lds r21, 0x0DF6 ; 0x800df6 2c486: 60 91 f7 0d lds r22, 0x0DF7 ; 0x800df7 2c48a: 70 91 f8 0d lds r23, 0x0DF8 ; 0x800df8 2c48e: 8d e0 ldi r24, 0x0D ; 13 2c490: 9d e0 ldi r25, 0x0D ; 13 2c492: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c496: 40 91 7d 0e lds r20, 0x0E7D ; 0x800e7d 2c49a: 50 91 7e 0e lds r21, 0x0E7E ; 0x800e7e 2c49e: 60 91 7f 0e lds r22, 0x0E7F ; 0x800e7f 2c4a2: 70 91 80 0e lds r23, 0x0E80 ; 0x800e80 2c4a6: 89 e0 ldi r24, 0x09 ; 9 2c4a8: 9d e0 ldi r25, 0x0D ; 13 2c4aa: 0f 94 46 dc call 0x3b88c ; 0x3b88c #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); 2c4ae: 40 e1 ldi r20, 0x10 ; 16 2c4b0: 50 e0 ldi r21, 0x00 ; 0 2c4b2: 67 e3 ldi r22, 0x37 ; 55 2c4b4: 7d e0 ldi r23, 0x0D ; 13 2c4b6: 83 e8 ldi r24, 0x83 ; 131 2c4b8: 92 e0 ldi r25, 0x02 ; 2 2c4ba: 0f 94 24 dc call 0x3b848 ; 0x3b848 if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2c4be: 60 91 68 05 lds r22, 0x0568 ; 0x800568 2c4c2: 70 91 69 05 lds r23, 0x0569 ; 0x800569 2c4c6: 8c e6 ldi r24, 0x6C ; 108 2c4c8: 9f e0 ldi r25, 0x0F ; 15 2c4ca: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2c4ce: 60 91 6a 02 lds r22, 0x026A ; 0x80026a 2c4d2: 8c e8 ldi r24, 0x8C ; 140 2c4d4: 9f e0 ldi r25, 0x0F ; 15 2c4d6: 0f 94 34 dc call 0x3b868 ; 0x3b868 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c4da: 40 91 64 05 lds r20, 0x0564 ; 0x800564 2c4de: 50 91 65 05 lds r21, 0x0565 ; 0x800565 2c4e2: 60 91 66 05 lds r22, 0x0566 ; 0x800566 2c4e6: 70 91 67 05 lds r23, 0x0567 ; 0x800567 2c4ea: 8c e2 ldi r24, 0x2C ; 44 2c4ec: 9d e0 ldi r25, 0x0D ; 13 2c4ee: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 2c4f2: 60 91 6b 02 lds r22, 0x026B ; 0x80026b 2c4f6: 70 91 6c 02 lds r23, 0x026C ; 0x80026c 2c4fa: 8d e7 ldi r24, 0x7D ; 125 2c4fc: 9c e0 ldi r25, 0x0C ; 12 2c4fe: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 #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); 2c502: 40 e1 ldi r20, 0x10 ; 16 2c504: 50 e0 ldi r21, 0x00 ; 0 2c506: 6d e6 ldi r22, 0x6D ; 109 2c508: 7c e0 ldi r23, 0x0C ; 12 2c50a: 81 ee ldi r24, 0xE1 ; 225 2c50c: 9d e0 ldi r25, 0x0D ; 13 2c50e: 0f 94 24 dc call 0x3b848 ; 0x3b848 2c512: 40 e1 ldi r20, 0x10 ; 16 2c514: 50 e0 ldi r21, 0x00 ; 0 2c516: 6d e5 ldi r22, 0x5D ; 93 2c518: 7c e0 ldi r23, 0x0C ; 12 2c51a: 89 e6 ldi r24, 0x69 ; 105 2c51c: 9e e0 ldi r25, 0x0E ; 14 2c51e: 0f 94 24 dc call 0x3b848 ; 0x3b848 2c522: 40 e1 ldi r20, 0x10 ; 16 2c524: 50 e0 ldi r21, 0x00 ; 0 2c526: 6d e4 ldi r22, 0x4D ; 77 2c528: 7c e0 ldi r23, 0x0C ; 12 2c52a: 81 ed ldi r24, 0xD1 ; 209 2c52c: 9d e0 ldi r25, 0x0D ; 13 2c52e: 0f 94 24 dc call 0x3b848 ; 0x3b848 2c532: 40 e1 ldi r20, 0x10 ; 16 2c534: 50 e0 ldi r21, 0x00 ; 0 2c536: 6d e3 ldi r22, 0x3D ; 61 2c538: 7c e0 ldi r23, 0x0C ; 12 2c53a: 89 e5 ldi r24, 0x59 ; 89 2c53c: 9e e0 ldi r25, 0x0E ; 14 2c53e: 0f 94 24 dc call 0x3b848 ; 0x3b848 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c542: 40 91 f9 0d lds r20, 0x0DF9 ; 0x800df9 2c546: 50 91 fa 0d lds r21, 0x0DFA ; 0x800dfa 2c54a: 60 91 fb 0d lds r22, 0x0DFB ; 0x800dfb 2c54e: 70 91 fc 0d lds r23, 0x0DFC ; 0x800dfc 2c552: 89 e3 ldi r24, 0x39 ; 57 2c554: 9c e0 ldi r25, 0x0C ; 12 2c556: 0f 94 46 dc call 0x3b88c ; 0x3b88c 2c55a: 40 91 fd 0d lds r20, 0x0DFD ; 0x800dfd 2c55e: 50 91 fe 0d lds r21, 0x0DFE ; 0x800dfe 2c562: 60 91 ff 0d lds r22, 0x0DFF ; 0x800dff 2c566: 70 91 00 0e lds r23, 0x0E00 ; 0x800e00 2c56a: 85 e3 ldi r24, 0x35 ; 53 2c56c: 9c e0 ldi r25, 0x0C ; 12 2c56e: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); 2c572: 40 91 01 0e lds r20, 0x0E01 ; 0x800e01 2c576: 50 91 02 0e lds r21, 0x0E02 ; 0x800e02 2c57a: 60 91 03 0e lds r22, 0x0E03 ; 0x800e03 2c57e: 70 91 04 0e lds r23, 0x0E04 ; 0x800e04 2c582: 81 e3 ldi r24, 0x31 ; 49 2c584: 9c e0 ldi r25, 0x0C ; 12 2c586: 0f 94 46 dc call 0x3b88c ; 0x3b88c #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); 2c58a: 40 e1 ldi r20, 0x10 ; 16 2c58c: 50 e0 ldi r21, 0x00 ; 0 2c58e: 61 e2 ldi r22, 0x21 ; 33 2c590: 7c e0 ldi r23, 0x0C ; 12 2c592: 85 e0 ldi r24, 0x05 ; 5 2c594: 9e e0 ldi r25, 0x0E ; 14 2c596: 0f 94 24 dc call 0x3b848 ; 0x3b848 eeprom_update_float_notify((float *)(EEPROM_UVLO_MIN_FEEDRATE), cs.minimumfeedrate); eeprom_update_float_notify((float *)(EEPROM_UVLO_MIN_TRAVEL_FEEDRATE), cs.mintravelfeedrate); eeprom_update_dword_notify((uint32_t *)(EEPROM_UVLO_MIN_SEGMENT_TIME_US), cs.min_segment_time_us); eeprom_update_block_notify(cs.max_jerk, (float *)EEPROM_UVLO_MAX_JERK, sizeof(cs.max_jerk)); // Finally store the "power outage" flag. if (did_pause_print) { 2c59a: 80 91 e2 03 lds r24, 0x03E2 ; 0x8003e2 2c59e: 88 23 and r24, r24 2c5a0: 29 f0 breq .+10 ; 0x2c5ac <__vector_5+0x550> if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2c5a2: 61 e0 ldi r22, 0x01 ; 1 2c5a4: 8f e7 ldi r24, 0x7F ; 127 2c5a6: 9c e0 ldi r25, 0x0C ; 12 2c5a8: 0f 94 34 dc call 0x3b868 ; 0x3b868 2c5ac: 61 e0 ldi r22, 0x01 ; 1 2c5ae: 85 ea ldi r24, 0xA5 ; 165 2c5b0: 9f e0 ldi r25, 0x0F ; 15 2c5b2: 0f 94 34 dc call 0x3b868 ; 0x3b868 } eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::PENDING_RECOVERY); // Increment power failure counter eeprom_increment_byte((uint8_t*)EEPROM_POWER_COUNT); 2c5b6: 84 e6 ldi r24, 0x64 ; 100 2c5b8: 9f e0 ldi r25, 0x0F ; 15 2c5ba: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t*)EEPROM_POWER_COUNT_TOT); 2c5be: 8f ef ldi r24, 0xFF ; 255 2c5c0: 9e e0 ldi r25, 0x0E ; 14 2c5c2: 0e 94 b3 75 call 0xeb66 ; 0xeb66 printf_P(_N("UVLO - end %d\n"), _millis() - time_start); 2c5c6: 0f 94 28 2a call 0x25450 ; 0x25450 2c5ca: dc 01 movw r26, r24 2c5cc: cb 01 movw r24, r22 2c5ce: 8c 19 sub r24, r12 2c5d0: 9d 09 sbc r25, r13 2c5d2: ae 09 sbc r26, r14 2c5d4: bf 09 sbc r27, r15 2c5d6: bf 93 push r27 2c5d8: af 93 push r26 2c5da: 9f 93 push r25 2c5dc: 8f 93 push r24 2c5de: 82 e7 ldi r24, 0x72 ; 114 2c5e0: 9d e6 ldi r25, 0x6D ; 109 2c5e2: 9f 93 push r25 2c5e4: 8f 93 push r24 2c5e6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 WRITE(BEEPER,HIGH); 2c5ea: 9f b7 in r25, 0x3f ; 63 2c5ec: f8 94 cli 2c5ee: 80 91 02 01 lds r24, 0x0102 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2c5f2: 84 60 ori r24, 0x04 ; 4 2c5f4: 80 93 02 01 sts 0x0102, r24 ; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102> 2c5f8: 9f bf out 0x3f, r25 ; 63 // All is set: with all the juice left, try to move extruder away to detach the nozzle completely from the print poweron_z(); 2c5fa: 15 98 cbi 0x02, 5 ; 2 current_position[X_AXIS] = (current_position[X_AXIS] < 0.5f * (X_MIN_POS + X_MAX_POS)) ? X_MIN_POS : X_MAX_POS; 2c5fc: 0f 90 pop r0 2c5fe: 0f 90 pop r0 2c600: 0f 90 pop r0 2c602: 0f 90 pop r0 2c604: 0f 90 pop r0 2c606: 0f 90 pop r0 2c608: 20 e0 ldi r18, 0x00 ; 0 2c60a: 30 e0 ldi r19, 0x00 ; 0 2c60c: 4f ef ldi r20, 0xFF ; 255 2c60e: 52 e4 ldi r21, 0x42 ; 66 2c610: 60 91 91 06 lds r22, 0x0691 ; 0x800691 2c614: 70 91 92 06 lds r23, 0x0692 ; 0x800692 2c618: 80 91 93 06 lds r24, 0x0693 ; 0x800693 2c61c: 90 91 94 06 lds r25, 0x0694 ; 0x800694 2c620: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2c624: 87 fd sbrc r24, 7 2c626: 1f c0 rjmp .+62 ; 0x2c666 <__vector_5+0x60a> 2c628: 80 e0 ldi r24, 0x00 ; 0 2c62a: 90 e0 ldi r25, 0x00 ; 0 2c62c: af e7 ldi r26, 0x7F ; 127 2c62e: b3 e4 ldi r27, 0x43 ; 67 2c630: 80 93 91 06 sts 0x0691, r24 ; 0x800691 2c634: 90 93 92 06 sts 0x0692, r25 ; 0x800692 2c638: a0 93 93 06 sts 0x0693, r26 ; 0x800693 2c63c: b0 93 94 06 sts 0x0694, r27 ; 0x800694 plan_buffer_line_curposXYZE(500); 2c640: 60 e0 ldi r22, 0x00 ; 0 2c642: 70 e0 ldi r23, 0x00 ; 0 2c644: 8a ef ldi r24, 0xFA ; 250 2c646: 93 e4 ldi r25, 0x43 ; 67 2c648: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 2c64c: 0f 94 a9 43 call 0x28752 ; 0x28752 2c650: 88 e1 ldi r24, 0x18 ; 24 2c652: 9e e0 ldi r25, 0x0E ; 14 2c654: 0f b6 in r0, 0x3f ; 63 2c656: f8 94 cli 2c658: a8 95 wdr 2c65a: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2c65e: 0f be out 0x3f, r0 ; 63 2c660: 90 93 60 00 sts 0x0060, r25 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 2c664: ff cf rjmp .-2 ; 0x2c664 <__vector_5+0x608> printf_P(_N("UVLO - end %d\n"), _millis() - time_start); WRITE(BEEPER,HIGH); // All is set: with all the juice left, try to move extruder away to detach the nozzle completely from the print poweron_z(); current_position[X_AXIS] = (current_position[X_AXIS] < 0.5f * (X_MIN_POS + X_MAX_POS)) ? X_MIN_POS : X_MAX_POS; 2c666: 80 e0 ldi r24, 0x00 ; 0 2c668: 90 e0 ldi r25, 0x00 ; 0 2c66a: dc 01 movw r26, r24 2c66c: e1 cf rjmp .-62 ; 0x2c630 <__vector_5+0x5d4> while(1); } static void uvlo_tiny() { unsigned long time_start = _millis(); 2c66e: 0f 94 28 2a call 0x25450 ; 0x25450 2c672: 6b 01 movw r12, r22 2c674: 7c 01 movw r14, r24 // Conserve power as soon as possible. disable_x(); 2c676: 17 9a sbi 0x02, 7 ; 2 2c678: 10 92 8e 06 sts 0x068E, r1 ; 0x80068e disable_y(); 2c67c: 16 9a sbi 0x02, 6 ; 2 2c67e: 10 92 8f 06 sts 0x068F, r1 ; 0x80068f disable_e0(); 2c682: 14 9a sbi 0x02, 4 ; 2 #ifdef TMC2130 currents[Z_AXIS].setiHold(20); 2c684: 64 e1 ldi r22, 0x14 ; 20 2c686: 83 e6 ldi r24, 0x63 ; 99 2c688: 92 e0 ldi r25, 0x02 ; 2 2c68a: 0e 94 96 67 call 0xcf2c ; 0xcf2c currents[Z_AXIS].setiRun(20); 2c68e: 64 e1 ldi r22, 0x14 ; 20 2c690: 83 e6 ldi r24, 0x63 ; 99 2c692: 92 e0 ldi r25, 0x02 ; 2 2c694: 0e 94 9e 67 call 0xcf3c ; 0xcf3c tmc2130_setup_chopper(Z_AXIS, tmc2130_mres[Z_AXIS]); 2c698: 50 e0 ldi r21, 0x00 ; 0 2c69a: 40 e0 ldi r20, 0x00 ; 0 2c69c: 60 91 f6 04 lds r22, 0x04F6 ; 0x8004f6 2c6a0: 82 e0 ldi r24, 0x02 ; 2 2c6a2: 0f 94 6b 25 call 0x24ad6 ; 0x24ad6 #endif //TMC2130 // Stop all heaters disable_heater(); 2c6a6: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 // When power is interrupted on the _first_ recovery an attempt can be made to raise the // extruder, causing the Z position to change. Similarly, when recovering, the Z position is // lowered. In such cases we cannot just save Z, we need to re-align the steppers to a fullstep. // Disable MBL (if not already) to work with physical coordinates. mbl.active = false; 2c6aa: 10 92 c1 13 sts 0x13C1, r1 ; 0x8013c1 planner_abort_hard(); 2c6ae: 0f 94 b7 c1 call 0x3836e ; 0x3836e // Allow for small roundoffs to be ignored if(fabs(current_position[Z_AXIS] - eeprom_read_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z))) >= 1.f/cs.axis_steps_per_mm[Z_AXIS]) 2c6b2: 80 90 99 06 lds r8, 0x0699 ; 0x800699 2c6b6: 90 90 9a 06 lds r9, 0x069A ; 0x80069a 2c6ba: a0 90 9b 06 lds r10, 0x069B ; 0x80069b 2c6be: b0 90 9c 06 lds r11, 0x069C ; 0x80069c 2c6c2: 8a ed ldi r24, 0xDA ; 218 2c6c4: 9e e0 ldi r25, 0x0E ; 14 2c6c6: 0f 94 18 dc call 0x3b830 ; 0x3b830 2c6ca: 9b 01 movw r18, r22 2c6cc: ac 01 movw r20, r24 2c6ce: c5 01 movw r24, r10 2c6d0: b4 01 movw r22, r8 2c6d2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2c6d6: 4b 01 movw r8, r22 2c6d8: 5c 01 movw r10, r24 2c6da: e8 94 clt 2c6dc: b7 f8 bld r11, 7 2c6de: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 2c6e2: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 2c6e6: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 2c6ea: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 2c6ee: 60 e0 ldi r22, 0x00 ; 0 2c6f0: 70 e0 ldi r23, 0x00 ; 0 2c6f2: 80 e8 ldi r24, 0x80 ; 128 2c6f4: 9f e3 ldi r25, 0x3F ; 63 2c6f6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2c6fa: 9b 01 movw r18, r22 2c6fc: ac 01 movw r20, r24 2c6fe: c5 01 movw r24, r10 2c700: b4 01 movw r22, r8 2c702: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2c706: 87 fd sbrc r24, 7 2c708: 61 c0 rjmp .+194 ; 0x2c7cc <__vector_5+0x770> { // Clean the input command queue, inhibit serial processing using saved_printing cmdqueue_reset(); 2c70a: 0e 94 dc 7e call 0xfdb8 ; 0xfdb8 card.sdprinting = false; 2c70e: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f saved_printing = true; 2c712: 81 e0 ldi r24, 0x01 ; 1 2c714: 80 93 a8 0d sts 0x0DA8, r24 ; 0x800da8 // Enable stepper driver interrupt to move Z axis. This should be fine as the planner and // command queues are empty, SD card printing is disabled, usb is inhibited. planner_aborted = false; 2c718: 10 92 ab 0d sts 0x0DAB, r1 ; 0x800dab sei(); 2c71c: 78 94 sei 2c71e: 80 91 f6 04 lds r24, 0x04F6 ; 0x8004f6 2c722: c0 e0 ldi r28, 0x00 ; 0 2c724: d1 e0 ldi r29, 0x01 ; 1 2c726: 02 c0 rjmp .+4 ; 0x2c72c <__vector_5+0x6d0> 2c728: d6 95 lsr r29 2c72a: c7 95 ror r28 2c72c: 8a 95 dec r24 2c72e: e2 f7 brpl .-8 ; 0x2c728 <__vector_5+0x6cc> // The axis was moved: adjust Z as done on a regular UVLO. uint16_t z_res = tmc2130_get_res(Z_AXIS); uint16_t z_microsteps = tmc2130_rd_MSCNT(Z_AXIS); 2c730: 82 e0 ldi r24, 0x02 ; 2 2c732: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 current_position[Z_AXIS] += float(1024 - z_microsteps) 2c736: 60 e0 ldi r22, 0x00 ; 0 2c738: 74 e0 ldi r23, 0x04 ; 4 2c73a: 68 1b sub r22, r24 2c73c: 79 0b sbc r23, r25 2c73e: 90 e0 ldi r25, 0x00 ; 0 2c740: 80 e0 ldi r24, 0x00 ; 0 2c742: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2c746: 4b 01 movw r8, r22 2c748: 5c 01 movw r10, r24 / (z_res * cs.axis_steps_per_mm[Z_AXIS]) 2c74a: be 01 movw r22, r28 2c74c: 90 e0 ldi r25, 0x00 ; 0 2c74e: 80 e0 ldi r24, 0x00 ; 0 2c750: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2c754: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 2c758: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 2c75c: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 2c760: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 2c764: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2c768: 9b 01 movw r18, r22 2c76a: ac 01 movw r20, r24 2c76c: c5 01 movw r24, r10 2c76e: b4 01 movw r22, r8 2c770: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> + UVLO_TINY_Z_AXIS_SHIFT; 2c774: 2a e0 ldi r18, 0x0A ; 10 2c776: 37 ed ldi r19, 0xD7 ; 215 2c778: 43 e2 ldi r20, 0x23 ; 35 2c77a: 5e e3 ldi r21, 0x3E ; 62 2c77c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> sei(); // The axis was moved: adjust Z as done on a regular UVLO. uint16_t z_res = tmc2130_get_res(Z_AXIS); uint16_t z_microsteps = tmc2130_rd_MSCNT(Z_AXIS); current_position[Z_AXIS] += float(1024 - z_microsteps) 2c780: 20 91 99 06 lds r18, 0x0699 ; 0x800699 2c784: 30 91 9a 06 lds r19, 0x069A ; 0x80069a 2c788: 40 91 9b 06 lds r20, 0x069B ; 0x80069b 2c78c: 50 91 9c 06 lds r21, 0x069C ; 0x80069c 2c790: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2c794: 60 93 99 06 sts 0x0699, r22 ; 0x800699 2c798: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 2c79c: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 2c7a0: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c / (z_res * cs.axis_steps_per_mm[Z_AXIS]) + UVLO_TINY_Z_AXIS_SHIFT; plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS]/60); 2c7a4: 65 e5 ldi r22, 0x55 ; 85 2c7a6: 75 e5 ldi r23, 0x55 ; 85 2c7a8: 85 e5 ldi r24, 0x55 ; 85 2c7aa: 91 e4 ldi r25, 0x41 ; 65 2c7ac: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 2c7b0: 0f 94 a9 43 call 0x28752 ; 0x28752 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 2c7b4: 40 91 99 06 lds r20, 0x0699 ; 0x800699 2c7b8: 50 91 9a 06 lds r21, 0x069A ; 0x80069a 2c7bc: 60 91 9b 06 lds r22, 0x069B ; 0x80069b 2c7c0: 70 91 9c 06 lds r23, 0x069C ; 0x80069c 2c7c4: 8a ed ldi r24, 0xDA ; 218 2c7c6: 9e e0 ldi r25, 0x0E ; 14 2c7c8: 0f 94 46 dc call 0x3b88c ; 0x3b88c if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 2c7cc: 62 e0 ldi r22, 0x02 ; 2 2c7ce: 85 ea ldi r24, 0xA5 ; 165 2c7d0: 9f e0 ldi r25, 0x0F ; 15 2c7d2: 0f 94 34 dc call 0x3b868 ; 0x3b868 // Update the the "power outage" flag. eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::PENDING_RECOVERY_RETRY); // Increment power failure counter eeprom_increment_byte((uint8_t*)EEPROM_POWER_COUNT); 2c7d6: 84 e6 ldi r24, 0x64 ; 100 2c7d8: 9f e0 ldi r25, 0x0F ; 15 2c7da: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t*)EEPROM_POWER_COUNT_TOT); 2c7de: 8f ef ldi r24, 0xFF ; 255 2c7e0: 9e e0 ldi r25, 0x0E ; 14 2c7e2: 0e 94 b3 75 call 0xeb66 ; 0xeb66 printf_P(_N("UVLO_TINY - end %d\n"), _millis() - time_start); 2c7e6: 0f 94 28 2a call 0x25450 ; 0x25450 2c7ea: dc 01 movw r26, r24 2c7ec: cb 01 movw r24, r22 2c7ee: 8c 19 sub r24, r12 2c7f0: 9d 09 sbc r25, r13 2c7f2: ae 09 sbc r26, r14 2c7f4: bf 09 sbc r27, r15 2c7f6: bf 93 push r27 2c7f8: af 93 push r26 2c7fa: 9f 93 push r25 2c7fc: 8f 93 push r24 2c7fe: 81 e8 ldi r24, 0x81 ; 129 2c800: 9d e6 ldi r25, 0x6D ; 109 2c802: 9f 93 push r25 2c804: 8f 93 push r24 2c806: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 uvlo_drain_reset(); 2c80a: 0f 94 13 60 call 0x2c026 ; 0x2c026 // There is already a pending recovery waiting. Power outage in this scenario // arrives before we can fully recover the print. In that case call a 'tiny' // version of uvlo_() which doesn't overwrite the print state already waiting in EEPROM uvlo_tiny(); } } 2c80e: ff 91 pop r31 2c810: ef 91 pop r30 2c812: df 91 pop r29 2c814: cf 91 pop r28 2c816: bf 91 pop r27 2c818: af 91 pop r26 2c81a: 9f 91 pop r25 2c81c: 8f 91 pop r24 2c81e: 7f 91 pop r23 2c820: 6f 91 pop r22 2c822: 5f 91 pop r21 2c824: 4f 91 pop r20 2c826: 3f 91 pop r19 2c828: 2f 91 pop r18 2c82a: 1f 91 pop r17 2c82c: 0f 91 pop r16 2c82e: ff 90 pop r15 2c830: ef 90 pop r14 2c832: df 90 pop r13 2c834: cf 90 pop r12 2c836: bf 90 pop r11 2c838: af 90 pop r10 2c83a: 9f 90 pop r9 2c83c: 8f 90 pop r8 2c83e: 0f 90 pop r0 2c840: 0b be out 0x3b, r0 ; 59 2c842: 0f 90 pop r0 2c844: 0f be out 0x3f, r0 ; 63 2c846: 0f 90 pop r0 2c848: 1f 90 pop r1 2c84a: 18 95 reti 0002c84c : } } uint16_t planner_calc_sd_length() { uint8_t _block_buffer_head = block_buffer_head; 2c84c: 60 91 a4 0d lds r22, 0x0DA4 ; 0x800da4 uint8_t _block_buffer_tail = block_buffer_tail; 2c850: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 uint16_t sdlen = 0; 2c854: 30 e0 ldi r19, 0x00 ; 0 2c856: 20 e0 ldi r18, 0x00 ; 0 while (_block_buffer_head != _block_buffer_tail) { sdlen += block_buffer[_block_buffer_tail].sdlen; 2c858: 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) 2c85a: 96 17 cp r25, r22 2c85c: 61 f0 breq .+24 ; 0x2c876 { sdlen += block_buffer[_block_buffer_tail].sdlen; 2c85e: 89 9f mul r24, r25 2c860: f0 01 movw r30, r0 2c862: 11 24 eor r1, r1 2c864: e0 5d subi r30, 0xD0 ; 208 2c866: f8 4f sbci r31, 0xF8 ; 248 2c868: 40 81 ld r20, Z 2c86a: 51 81 ldd r21, Z+1 ; 0x01 2c86c: 24 0f add r18, r20 2c86e: 35 1f adc r19, r21 _block_buffer_tail = (_block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 2c870: 9f 5f subi r25, 0xFF ; 255 2c872: 9f 70 andi r25, 0x0F ; 15 2c874: f2 cf rjmp .-28 ; 0x2c85a } return sdlen; } 2c876: c9 01 movw r24, r18 2c878: 08 95 ret 0002c87a : } #endif /* PLANNER_DIAGNOSTICS */ void planner_add_sd_length(uint16_t sdlen) { if (block_buffer_head != block_buffer_tail) { 2c87a: 30 91 a4 0d lds r19, 0x0DA4 ; 0x800da4 2c87e: 20 91 a5 0d lds r18, 0x0DA5 ; 0x800da5 2c882: 32 17 cp r19, r18 2c884: 91 f0 breq .+36 ; 0x2c8aa // 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; 2c886: e0 91 a4 0d lds r30, 0x0DA4 ; 0x800da4 } // 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) 2c88a: e1 11 cpse r30, r1 2c88c: 01 c0 rjmp .+2 ; 0x2c890 block_index = BLOCK_BUFFER_SIZE; 2c88e: e0 e1 ldi r30, 0x10 ; 16 -- block_index; 2c890: 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; 2c892: 2e e6 ldi r18, 0x6E ; 110 2c894: e2 9f mul r30, r18 2c896: f0 01 movw r30, r0 2c898: 11 24 eor r1, r1 2c89a: e0 5d subi r30, 0xD0 ; 208 2c89c: f8 4f sbci r31, 0xF8 ; 248 2c89e: 20 81 ld r18, Z 2c8a0: 31 81 ldd r19, Z+1 ; 0x01 2c8a2: 82 0f add r24, r18 2c8a4: 93 1f adc r25, r19 2c8a6: 91 83 std Z+1, r25 ; 0x01 2c8a8: 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. } } 2c8aa: 08 95 ret 0002c8ac : } #endif //PREVENT_DANGEROUS_EXTRUDE // Calculate the steps/s^2 acceleration rates, based on the mm/s^s void reset_acceleration_rates() { 2c8ac: 8f 92 push r8 2c8ae: 9f 92 push r9 2c8b0: af 92 push r10 2c8b2: bf 92 push r11 2c8b4: cf 92 push r12 2c8b6: df 92 push r13 2c8b8: ef 92 push r14 2c8ba: ff 92 push r15 2c8bc: 0f 93 push r16 2c8be: 1f 93 push r17 2c8c0: cf 93 push r28 2c8c2: df 93 push r29 2c8c4: c0 91 6f 02 lds r28, 0x026F ; 0x80026f 2c8c8: d0 91 70 02 lds r29, 0x0270 ; 0x800270 2c8cc: 81 ec ldi r24, 0xC1 ; 193 2c8ce: e8 2e mov r14, r24 2c8d0: 8d e0 ldi r24, 0x0D ; 13 2c8d2: f8 2e mov r15, r24 2c8d4: 0d e4 ldi r16, 0x4D ; 77 2c8d6: 15 e0 ldi r17, 0x05 ; 5 2c8d8: 6e 01 movw r12, r28 2c8da: 80 e1 ldi r24, 0x10 ; 16 2c8dc: c8 0e add r12, r24 2c8de: d1 1c adc r13, r1 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]; 2c8e0: 69 91 ld r22, Y+ 2c8e2: 79 91 ld r23, Y+ 2c8e4: 89 91 ld r24, Y+ 2c8e6: 99 91 ld r25, Y+ 2c8e8: f7 01 movw r30, r14 2c8ea: 81 90 ld r8, Z+ 2c8ec: 91 90 ld r9, Z+ 2c8ee: a1 90 ld r10, Z+ 2c8f0: b1 90 ld r11, Z+ 2c8f2: 7f 01 movw r14, r30 2c8f4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2c8f8: a5 01 movw r20, r10 2c8fa: 94 01 movw r18, r8 2c8fc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2c900: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 2c904: f8 01 movw r30, r16 2c906: 61 93 st Z+, r22 2c908: 71 93 st Z+, r23 2c90a: 81 93 st Z+, r24 2c90c: 91 93 st Z+, r25 2c90e: 8f 01 movw r16, r30 #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++) 2c910: cc 15 cp r28, r12 2c912: dd 05 cpc r29, r13 2c914: 29 f7 brne .-54 ; 0x2c8e0 max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * cs.axis_steps_per_mm[i]; } 2c916: df 91 pop r29 2c918: cf 91 pop r28 2c91a: 1f 91 pop r17 2c91c: 0f 91 pop r16 2c91e: ff 90 pop r15 2c920: ef 90 pop r14 2c922: df 90 pop r13 2c924: cf 90 pop r12 2c926: bf 90 pop r11 2c928: af 90 pop r10 2c92a: 9f 90 pop r9 2c92c: 8f 90 pop r8 2c92e: 08 95 ret 0002c930 : #ifdef TMC2130 void update_mode_profile() { if (tmc2130_mode == TMC2130_MODE_NORMAL) 2c930: 80 91 8b 06 lds r24, 0x068B ; 0x80068b 2c934: 81 11 cpse r24, r1 2c936: 0e c0 rjmp .+28 ; 0x2c954 { max_feedrate = cs.max_feedrate_normal; 2c938: 81 ed ldi r24, 0xD1 ; 209 2c93a: 9d e0 ldi r25, 0x0D ; 13 2c93c: 90 93 72 02 sts 0x0272, r25 ; 0x800272 2c940: 80 93 71 02 sts 0x0271, r24 ; 0x800271 max_acceleration_mm_per_s2 = cs.max_acceleration_mm_per_s2_normal; 2c944: 81 ee ldi r24, 0xE1 ; 225 2c946: 9d e0 ldi r25, 0x0D ; 13 } else if (tmc2130_mode == TMC2130_MODE_SILENT) { max_feedrate = cs.max_feedrate_silent; max_acceleration_mm_per_s2 = cs.max_acceleration_mm_per_s2_silent; 2c948: 90 93 70 02 sts 0x0270, r25 ; 0x800270 2c94c: 80 93 6f 02 sts 0x026F, r24 ; 0x80026f } reset_acceleration_rates(); 2c950: 0d 94 56 64 jmp 0x2c8ac ; 0x2c8ac if (tmc2130_mode == TMC2130_MODE_NORMAL) { max_feedrate = cs.max_feedrate_normal; max_acceleration_mm_per_s2 = cs.max_acceleration_mm_per_s2_normal; } else if (tmc2130_mode == TMC2130_MODE_SILENT) 2c954: 81 30 cpi r24, 0x01 ; 1 2c956: e1 f7 brne .-8 ; 0x2c950 { max_feedrate = cs.max_feedrate_silent; 2c958: 89 e5 ldi r24, 0x59 ; 89 2c95a: 9e e0 ldi r25, 0x0E ; 14 2c95c: 90 93 72 02 sts 0x0272, r25 ; 0x800272 2c960: 80 93 71 02 sts 0x0271, r24 ; 0x800271 max_acceleration_mm_per_s2 = cs.max_acceleration_mm_per_s2_silent; 2c964: 89 e6 ldi r24, 0x69 ; 105 2c966: 9e e0 ldi r25, 0x0E ; 14 2c968: ef cf rjmp .-34 ; 0x2c948 0002c96a : } void plan_set_e_position(const float &e) { #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 2c96a: fc 01 movw r30, r24 2c96c: 40 81 ld r20, Z 2c96e: 51 81 ldd r21, Z+1 ; 0x01 2c970: 62 81 ldd r22, Z+2 ; 0x02 2c972: 73 81 ldd r23, Z+3 ; 0x03 2c974: 40 93 d8 04 sts 0x04D8, r20 ; 0x8004d8 2c978: 50 93 d9 04 sts 0x04D9, r21 ; 0x8004d9 2c97c: 60 93 da 04 sts 0x04DA, r22 ; 0x8004da 2c980: 70 93 db 04 sts 0x04DB, r23 ; 0x8004db #endif position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]); 2c984: 20 91 cd 0d lds r18, 0x0DCD ; 0x800dcd 2c988: 30 91 ce 0d lds r19, 0x0DCE ; 0x800dce 2c98c: 40 91 cf 0d lds r20, 0x0DCF ; 0x800dcf 2c990: 50 91 d0 0d lds r21, 0x0DD0 ; 0x800dd0 2c994: 60 81 ld r22, Z 2c996: 71 81 ldd r23, Z+1 ; 0x01 2c998: 82 81 ldd r24, Z+2 ; 0x02 2c99a: 93 81 ldd r25, Z+3 ; 0x03 2c99c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2c9a0: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 2c9a4: e2 ea ldi r30, 0xA2 ; 162 2c9a6: f6 e0 ldi r31, 0x06 ; 6 2c9a8: 64 87 std Z+12, r22 ; 0x0c 2c9aa: 75 87 std Z+13, r23 ; 0x0d 2c9ac: 86 87 std Z+14, r24 ; 0x0e 2c9ae: 97 87 std Z+15, r25 ; 0x0f CRITICAL_SECTION_END; } void st_set_e_position(const long &e) { CRITICAL_SECTION_START; 2c9b0: 8f b7 in r24, 0x3f ; 63 2c9b2: f8 94 cli count_position[E_AXIS] = e; 2c9b4: 44 85 ldd r20, Z+12 ; 0x0c 2c9b6: 55 85 ldd r21, Z+13 ; 0x0d 2c9b8: 66 85 ldd r22, Z+14 ; 0x0e 2c9ba: 77 85 ldd r23, Z+15 ; 0x0f 2c9bc: 40 93 be 06 sts 0x06BE, r20 ; 0x8006be 2c9c0: 50 93 bf 06 sts 0x06BF, r21 ; 0x8006bf 2c9c4: 60 93 c0 06 sts 0x06C0, r22 ; 0x8006c0 2c9c8: 70 93 c1 06 sts 0x06C1, r23 ; 0x8006c1 CRITICAL_SECTION_END; 2c9cc: 8f bf out 0x3f, r24 ; 63 st_set_e_position(position[E_AXIS]); } 2c9ce: 08 95 ret 0002c9d0 : // 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; 2c9d0: fc 01 movw r30, r24 2c9d2: 40 81 ld r20, Z 2c9d4: 51 81 ldd r21, Z+1 ; 0x01 2c9d6: 62 81 ldd r22, Z+2 ; 0x02 2c9d8: 73 81 ldd r23, Z+3 ; 0x03 2c9da: 40 93 d4 04 sts 0x04D4, r20 ; 0x8004d4 2c9de: 50 93 d5 04 sts 0x04D5, r21 ; 0x8004d5 2c9e2: 60 93 d6 04 sts 0x04D6, r22 ; 0x8004d6 2c9e6: 70 93 d7 04 sts 0x04D7, r23 ; 0x8004d7 #endif position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); 2c9ea: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 2c9ee: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 2c9f2: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 2c9f6: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 2c9fa: 60 81 ld r22, Z 2c9fc: 71 81 ldd r23, Z+1 ; 0x01 2c9fe: 82 81 ldd r24, Z+2 ; 0x02 2ca00: 93 81 ldd r25, Z+3 ; 0x03 2ca02: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2ca06: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 2ca0a: 60 93 aa 06 sts 0x06AA, r22 ; 0x8006aa 2ca0e: 70 93 ab 06 sts 0x06AB, r23 ; 0x8006ab 2ca12: 80 93 ac 06 sts 0x06AC, r24 ; 0x8006ac 2ca16: 90 93 ad 06 sts 0x06AD, r25 ; 0x8006ad st_set_position(position); 2ca1a: 0d 94 df 87 jmp 0x30fbe ; 0x30fbe 0002ca1e : * 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) { 2ca1e: 2f 92 push r2 2ca20: 3f 92 push r3 2ca22: 4f 92 push r4 2ca24: 5f 92 push r5 2ca26: 6f 92 push r6 2ca28: 7f 92 push r7 2ca2a: 8f 92 push r8 2ca2c: 9f 92 push r9 2ca2e: af 92 push r10 2ca30: bf 92 push r11 2ca32: cf 92 push r12 2ca34: df 92 push r13 2ca36: ef 92 push r14 2ca38: ff 92 push r15 2ca3a: 0f 93 push r16 2ca3c: 1f 93 push r17 2ca3e: cf 93 push r28 2ca40: df 93 push r29 2ca42: cd b7 in r28, 0x3d ; 61 2ca44: de b7 in r29, 0x3e ; 62 2ca46: c2 54 subi r28, 0x42 ; 66 2ca48: d1 09 sbc r29, r1 2ca4a: 0f b6 in r0, 0x3f ; 63 2ca4c: f8 94 cli 2ca4e: de bf out 0x3e, r29 ; 62 2ca50: 0f be out 0x3f, r0 ; 63 2ca52: cd bf out 0x3d, r28 ; 61 2ca54: 4c 01 movw r8, r24 2ca56: 5b 01 movw r10, r22 2ca58: 6a 01 movw r12, r20 2ca5a: 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) {} 2ca5c: 19 82 std Y+1, r1 ; 0x01 2ca5e: 1c 82 std Y+4, r1 ; 0x04 2ca60: 1c 8e std Y+28, r1 ; 0x1c 2ca62: 1f 8e std Y+31, r1 ; 0x1f uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile *parent = dirFile; SdBaseFile *sub = &dir1; if (!dirFile) goto fail; 2ca64: 67 2b or r22, r23 2ca66: 21 f5 brne .+72 ; 0x2cab0 sub = parent != &dir1 ? &dir1 : &dir2; } return open(parent, dname, oflag); fail: return false; 2ca68: 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; 2ca6a: ce 01 movw r24, r28 2ca6c: 4c 96 adiw r24, 0x1c ; 28 2ca6e: 0e 94 c9 76 call 0xed92 ; 0xed92 2ca72: ce 01 movw r24, r28 2ca74: 01 96 adiw r24, 0x01 ; 1 2ca76: 0e 94 c9 76 call 0xed92 ; 0xed92 } return open(parent, dname, oflag); fail: return false; } 2ca7a: 81 2f mov r24, r17 2ca7c: ce 5b subi r28, 0xBE ; 190 2ca7e: df 4f sbci r29, 0xFF ; 255 2ca80: 0f b6 in r0, 0x3f ; 63 2ca82: f8 94 cli 2ca84: de bf out 0x3e, r29 ; 62 2ca86: 0f be out 0x3f, r0 ; 63 2ca88: cd bf out 0x3d, r28 ; 61 2ca8a: df 91 pop r29 2ca8c: cf 91 pop r28 2ca8e: 1f 91 pop r17 2ca90: 0f 91 pop r16 2ca92: ff 90 pop r15 2ca94: ef 90 pop r14 2ca96: df 90 pop r13 2ca98: cf 90 pop r12 2ca9a: bf 90 pop r11 2ca9c: af 90 pop r10 2ca9e: 9f 90 pop r9 2caa0: 8f 90 pop r8 2caa2: 7f 90 pop r7 2caa4: 6f 90 pop r6 2caa6: 5f 90 pop r5 2caa8: 4f 90 pop r4 2caaa: 3f 90 pop r3 2caac: 2f 90 pop r2 2caae: 08 95 ret SdBaseFile *sub = &dir1; if (!dirFile) goto fail; // error if already open if (isOpen()) goto fail; 2cab0: fc 01 movw r30, r24 2cab2: 83 81 ldd r24, Z+3 ; 0x03 2cab4: 81 11 cpse r24, r1 2cab6: d8 cf rjmp .-80 ; 0x2ca68 if (*path == '/') { 2cab8: fa 01 movw r30, r20 2caba: 80 81 ld r24, Z 2cabc: 8f 32 cpi r24, 0x2F ; 47 2cabe: c1 f4 brne .+48 ; 0x2caf0 2cac0: ca 01 movw r24, r20 2cac2: 6c 01 movw r12, r24 2cac4: 01 96 adiw r24, 0x01 ; 1 while (*path == '/') path++; 2cac6: f6 01 movw r30, r12 2cac8: 20 81 ld r18, Z 2caca: 2f 32 cpi r18, 0x2F ; 47 2cacc: d1 f3 breq .-12 ; 0x2cac2 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; 2cace: f5 01 movw r30, r10 2cad0: 83 81 ldd r24, Z+3 ; 0x03 2cad2: 82 50 subi r24, 0x02 ; 2 if (!dirFile->isRoot()) { 2cad4: 82 30 cpi r24, 0x02 ; 2 2cad6: 60 f0 brcs .+24 ; 0x2caf0 if (!dir2.openRoot(dirFile->vol_)) goto fail; 2cad8: 61 8d ldd r22, Z+25 ; 0x19 2cada: 72 8d ldd r23, Z+26 ; 0x1a 2cadc: ce 01 movw r24, r28 2cade: 4c 96 adiw r24, 0x1c ; 28 2cae0: 0f 94 c0 56 call 0x2ad80 ; 0x2ad80 parent = &dir2; 2cae4: 8e 01 movw r16, r28 2cae6: 04 5e subi r16, 0xE4 ; 228 2cae8: 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; 2caea: 81 11 cpse r24, r1 2caec: 02 c0 rjmp .+4 ; 0x2caf2 2caee: bc cf rjmp .-136 ; 0x2ca68 // error if already open if (isOpen()) goto fail; if (*path == '/') { while (*path == '/') path++; if (!dirFile->isRoot()) { 2caf0: 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; 2caf2: ce 01 movw r24, r28 2caf4: 01 96 adiw r24, 0x01 ; 1 2caf6: 7c 01 movw r14, r24 2caf8: 3c 01 movw r6, r24 2cafa: 2e 01 movw r4, r28 2cafc: 9c e1 ldi r25, 0x1C ; 28 2cafe: 49 0e add r4, r25 2cb00: 51 1c adc r5, r1 2cb02: 23 96 adiw r28, 0x03 ; 3 2cb04: ef ae std Y+63, r14 ; 0x3f 2cb06: 23 97 sbiw r28, 0x03 ; 3 2cb08: 2f 2c mov r2, r15 2cb0a: fe 01 movw r30, r28 2cb0c: f7 96 adiw r30, 0x37 ; 55 2cb0e: cf 01 movw r24, r30 2cb10: 0b 96 adiw r24, 0x0b ; 11 2cb12: 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++] = ' '; 2cb14: 20 e2 ldi r18, 0x20 ; 32 2cb16: 21 93 st Z+, r18 2cb18: e8 17 cp r30, r24 2cb1a: f9 07 cpc r31, r25 2cb1c: d9 f7 brne .-10 ; 0x2cb14 2cb1e: 96 01 movw r18, r12 i = 0; 2cb20: 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 2cb22: 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 != '/') { 2cb24: d9 01 movw r26, r18 2cb26: 8d 91 ld r24, X+ 2cb28: 88 23 and r24, r24 2cb2a: 49 f1 breq .+82 ; 0x2cb7e 2cb2c: 8f 32 cpi r24, 0x2F ; 47 2cb2e: 39 f1 breq .+78 ; 0x2cb7e c = *str++; 2cb30: 28 2f mov r18, r24 if (c == '.') { 2cb32: 8e 32 cpi r24, 0x2E ; 46 2cb34: 39 f4 brne .+14 ; 0x2cb44 if (n == 10) goto fail; // only one dot allowed 2cb36: 6a 30 cpi r22, 0x0A ; 10 2cb38: 09 f4 brne .+2 ; 0x2cb3c 2cb3a: 96 cf rjmp .-212 ; 0x2ca68 n = 10; // max index for full 8.3 name i = 8; // place for extension 2cb3c: 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 2cb3e: 6a e0 ldi r22, 0x0A ; 10 2cb40: 9d 01 movw r18, r26 2cb42: f0 cf rjmp .-32 ; 0x2cb24 2cb44: e8 e9 ldi r30, 0x98 ; 152 2cb46: f1 e9 ldi r31, 0x91 ; 145 //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; 2cb48: 34 91 lpm r19, Z 2cb4a: 33 23 and r19, r19 2cb4c: 21 f0 breq .+8 ; 0x2cb56 2cb4e: 31 96 adiw r30, 0x01 ; 1 2cb50: 83 13 cpse r24, r19 2cb52: fa cf rjmp .-12 ; 0x2cb48 2cb54: 89 cf rjmp .-238 ; 0x2ca68 // check size and only allow ASCII printable characters if (i > n || c < 0X21 || c > 0X7E)goto fail; 2cb56: 69 17 cp r22, r25 2cb58: 08 f4 brcc .+2 ; 0x2cb5c 2cb5a: 86 cf rjmp .-244 ; 0x2ca68 2cb5c: 3f ed ldi r19, 0xDF ; 223 2cb5e: 38 0f add r19, r24 2cb60: 3e 35 cpi r19, 0x5E ; 94 2cb62: 08 f0 brcs .+2 ; 0x2cb66 2cb64: 81 cf rjmp .-254 ; 0x2ca68 // only upper case allowed in 8.3 names - convert lower to upper name[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); 2cb66: 3f e9 ldi r19, 0x9F ; 159 2cb68: 38 0f add r19, r24 2cb6a: 3a 31 cpi r19, 0x1A ; 26 2cb6c: 10 f4 brcc .+4 ; 0x2cb72 2cb6e: 20 ee ldi r18, 0xE0 ; 224 2cb70: 28 0f add r18, r24 2cb72: fa 01 movw r30, r20 2cb74: e9 0f add r30, r25 2cb76: f1 1d adc r31, r1 2cb78: 20 83 st Z, r18 2cb7a: 9f 5f subi r25, 0xFF ; 255 2cb7c: e1 cf rjmp .-62 ; 0x2cb40 if (!dir2.openRoot(dirFile->vol_)) goto fail; parent = &dir2; } } while (1) { if (!make83Name(path, dname, &path)) goto fail; 2cb7e: 8f a9 ldd r24, Y+55 ; 0x37 2cb80: 80 32 cpi r24, 0x20 ; 32 2cb82: 09 f4 brne .+2 ; 0x2cb86 2cb84: 71 cf rjmp .-286 ; 0x2ca68 2cb86: 69 01 movw r12, r18 while (*path == '/') path++; 2cb88: f9 01 movw r30, r18 2cb8a: 80 81 ld r24, Z 2cb8c: 2f 5f subi r18, 0xFF ; 255 2cb8e: 3f 4f sbci r19, 0xFF ; 255 2cb90: 8f 32 cpi r24, 0x2F ; 47 2cb92: c9 f3 breq .-14 ; 0x2cb86 if (!*path) break; 2cb94: 88 23 and r24, r24 2cb96: d9 f0 breq .+54 ; 0x2cbce if (!sub->open(parent, dname, O_READ)) goto fail; 2cb98: 21 e0 ldi r18, 0x01 ; 1 2cb9a: b8 01 movw r22, r16 2cb9c: c7 01 movw r24, r14 2cb9e: 0f 94 2e 5b call 0x2b65c ; 0x2b65c 2cba2: 88 23 and r24, r24 2cba4: 09 f4 brne .+2 ; 0x2cba8 2cba6: 60 cf rjmp .-320 ; 0x2ca68 if (parent != dirFile) parent->close(); 2cba8: 0a 15 cp r16, r10 2cbaa: 1b 05 cpc r17, r11 2cbac: 19 f0 breq .+6 ; 0x2cbb4 2cbae: c8 01 movw r24, r16 2cbb0: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce parent = sub; sub = parent != &dir1 ? &dir1 : &dir2; 2cbb4: 94 2d mov r25, r4 2cbb6: 85 2d mov r24, r5 2cbb8: 6e 14 cp r6, r14 2cbba: 7f 04 cpc r7, r15 2cbbc: 21 f0 breq .+8 ; 0x2cbc6 2cbbe: 23 96 adiw r28, 0x03 ; 3 2cbc0: 9f ad ldd r25, Y+63 ; 0x3f 2cbc2: 23 97 sbiw r28, 0x03 ; 3 2cbc4: 82 2d mov r24, r2 2cbc6: 87 01 movw r16, r14 2cbc8: e9 2e mov r14, r25 2cbca: f8 2e mov r15, r24 2cbcc: 9e cf rjmp .-196 ; 0x2cb0a } return open(parent, dname, oflag); 2cbce: 23 2d mov r18, r3 2cbd0: b8 01 movw r22, r16 2cbd2: c4 01 movw r24, r8 2cbd4: 0f 94 2e 5b call 0x2b65c ; 0x2b65c 2cbd8: 18 2f mov r17, r24 2cbda: 47 cf rjmp .-370 ; 0x2ca6a 0002cbdc : 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){ 2cbdc: 2f 92 push r2 2cbde: 3f 92 push r3 2cbe0: 4f 92 push r4 2cbe2: 5f 92 push r5 2cbe4: 6f 92 push r6 2cbe6: 7f 92 push r7 2cbe8: 8f 92 push r8 2cbea: 9f 92 push r9 2cbec: af 92 push r10 2cbee: bf 92 push r11 2cbf0: cf 92 push r12 2cbf2: df 92 push r13 2cbf4: ef 92 push r14 2cbf6: ff 92 push r15 2cbf8: 0f 93 push r16 2cbfa: 1f 93 push r17 2cbfc: cf 93 push r28 2cbfe: df 93 push r29 2cc00: 00 d0 rcall .+0 ; 0x2cc02 2cc02: 1f 92 push r1 2cc04: 1f 92 push r1 2cc06: cd b7 in r28, 0x3d ; 61 2cc08: de b7 in r29, 0x3e ; 62 2cc0a: 1c 01 movw r2, r24 2cc0c: 2a 01 movw r4, r20 2cc0e: 3b 01 movw r6, r22 2cc10: 00 e2 ldi r16, 0x20 ; 32 2cc12: 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){ 2cc14: 19 82 std Y+1, r1 ; 0x01 2cc16: 99 81 ldd r25, Y+1 ; 0x01 2cc18: 89 2f mov r24, r25 2cc1a: 90 e0 ldi r25, 0x00 ; 0 2cc1c: 9b 83 std Y+3, r25 ; 0x03 2cc1e: 8a 83 std Y+2, r24 ; 0x02 2cc20: 80 17 cp r24, r16 2cc22: 91 07 cpc r25, r17 2cc24: 9c f5 brge .+102 ; 0x2cc8c if (points[j] > points[j + 1]) 2cc26: 88 0f add r24, r24 2cc28: 99 1f adc r25, r25 2cc2a: 88 0f add r24, r24 2cc2c: 99 1f adc r25, r25 2cc2e: 9d 83 std Y+5, r25 ; 0x05 2cc30: 8c 83 std Y+4, r24 ; 0x04 2cc32: 82 0d add r24, r2 2cc34: 93 1d adc r25, r3 2cc36: 9b 83 std Y+3, r25 ; 0x03 2cc38: 8a 83 std Y+2, r24 ; 0x02 2cc3a: fc 01 movw r30, r24 2cc3c: c0 80 ld r12, Z 2cc3e: d1 80 ldd r13, Z+1 ; 0x01 2cc40: e2 80 ldd r14, Z+2 ; 0x02 2cc42: f3 80 ldd r15, Z+3 ; 0x03 2cc44: 8c 81 ldd r24, Y+4 ; 0x04 2cc46: 9d 81 ldd r25, Y+5 ; 0x05 2cc48: 04 96 adiw r24, 0x04 ; 4 2cc4a: 82 0d add r24, r2 2cc4c: 93 1d adc r25, r3 2cc4e: 9d 83 std Y+5, r25 ; 0x05 2cc50: 8c 83 std Y+4, r24 ; 0x04 2cc52: fc 01 movw r30, r24 2cc54: 80 80 ld r8, Z 2cc56: 91 80 ldd r9, Z+1 ; 0x01 2cc58: a2 80 ldd r10, Z+2 ; 0x02 2cc5a: b3 80 ldd r11, Z+3 ; 0x03 2cc5c: a5 01 movw r20, r10 2cc5e: 94 01 movw r18, r8 2cc60: c7 01 movw r24, r14 2cc62: b6 01 movw r22, r12 2cc64: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2cc68: 18 16 cp r1, r24 2cc6a: 64 f4 brge .+24 ; 0x2cc84 SWAP(points[j], points[j + 1]); 2cc6c: ea 81 ldd r30, Y+2 ; 0x02 2cc6e: fb 81 ldd r31, Y+3 ; 0x03 2cc70: 80 82 st Z, r8 2cc72: 91 82 std Z+1, r9 ; 0x01 2cc74: a2 82 std Z+2, r10 ; 0x02 2cc76: b3 82 std Z+3, r11 ; 0x03 2cc78: ec 81 ldd r30, Y+4 ; 0x04 2cc7a: fd 81 ldd r31, Y+5 ; 0x05 2cc7c: c0 82 st Z, r12 2cc7e: d1 82 std Z+1, r13 ; 0x01 2cc80: e2 82 std Z+2, r14 ; 0x02 2cc82: 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){ 2cc84: f9 81 ldd r31, Y+1 ; 0x01 2cc86: ff 5f subi r31, 0xFF ; 255 2cc88: f9 83 std Y+1, r31 ; 0x01 2cc8a: c5 cf rjmp .-118 ; 0x2cc16 2cc8c: 01 50 subi r16, 0x01 ; 1 2cc8e: 11 09 sbc r17, r1 2cc90: 08 f6 brcc .-126 ; 0x2cc14 /// 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]; 2cc92: f1 01 movw r30, r2 2cc94: e0 5c subi r30, 0xC0 ; 192 2cc96: 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); 2cc98: 20 81 ld r18, Z 2cc9a: 31 81 ldd r19, Z+1 ; 0x01 2cc9c: 42 81 ldd r20, Z+2 ; 0x02 2cc9e: 53 81 ldd r21, Z+3 ; 0x03 2cca0: c3 01 movw r24, r6 2cca2: b2 01 movw r22, r4 2cca4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2cca8: 6b 01 movw r12, r22 2ccaa: 7c 01 movw r14, r24 2ccac: 20 e0 ldi r18, 0x00 ; 0 2ccae: 30 e0 ldi r19, 0x00 ; 0 2ccb0: 40 e0 ldi r20, 0x00 ; 0 2ccb2: 5f eb ldi r21, 0xBF ; 191 2ccb4: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2ccb8: 87 fd sbrc r24, 7 2ccba: 10 c0 rjmp .+32 ; 0x2ccdc 2ccbc: 20 e0 ldi r18, 0x00 ; 0 2ccbe: 30 e0 ldi r19, 0x00 ; 0 2ccc0: 40 e0 ldi r20, 0x00 ; 0 2ccc2: 5f e3 ldi r21, 0x3F ; 63 2ccc4: c7 01 movw r24, r14 2ccc6: b6 01 movw r22, r12 2ccc8: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2cccc: 18 16 cp r1, r24 2ccce: 5c f4 brge .+22 ; 0x2cce6 2ccd0: c1 2c mov r12, r1 2ccd2: d1 2c mov r13, r1 2ccd4: e1 2c mov r14, r1 2ccd6: 8f e3 ldi r24, 0x3F ; 63 2ccd8: f8 2e mov r15, r24 2ccda: 05 c0 rjmp .+10 ; 0x2cce6 2ccdc: c1 2c mov r12, r1 2ccde: d1 2c mov r13, r1 2cce0: e1 2c mov r14, r1 2cce2: 9f eb ldi r25, 0xBF ; 191 2cce4: f9 2e mov r15, r25 } 2cce6: c7 01 movw r24, r14 2cce8: b6 01 movw r22, r12 2ccea: 0f 90 pop r0 2ccec: 0f 90 pop r0 2ccee: 0f 90 pop r0 2ccf0: 0f 90 pop r0 2ccf2: 0f 90 pop r0 2ccf4: df 91 pop r29 2ccf6: cf 91 pop r28 2ccf8: 1f 91 pop r17 2ccfa: 0f 91 pop r16 2ccfc: ff 90 pop r15 2ccfe: ef 90 pop r14 2cd00: df 90 pop r13 2cd02: cf 90 pop r12 2cd04: bf 90 pop r11 2cd06: af 90 pop r10 2cd08: 9f 90 pop r9 2cd0a: 8f 90 pop r8 2cd0c: 7f 90 pop r7 2cd0e: 6f 90 pop r6 2cd10: 5f 90 pop r5 2cd12: 4f 90 pop r4 2cd14: 3f 90 pop r3 2cd16: 2f 90 pop r2 2cd18: 08 95 ret 0002cd1a : bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); } void ProtocolLogic::RecordUARTActivity() { lastUARTActivityMs = _millis(); 2cd1a: 0f 94 28 2a call 0x25450 ; 0x25450 2cd1e: 60 93 59 13 sts 0x1359, r22 ; 0x801359 2cd22: 70 93 5a 13 sts 0x135A, r23 ; 0x80135a 2cd26: 80 93 5b 13 sts 0x135B, r24 ; 0x80135b 2cd2a: 90 93 5c 13 sts 0x135C, r25 ; 0x80135c } 2cd2e: 08 95 ret 0002cd30 : } return (uint8_t)ReqMsg().code; } void ProtocolLogic::DecrementRetryAttempts() { if (inAutoRetry && retryAttempts) { 2cd30: 80 91 9f 13 lds r24, 0x139F ; 0x80139f 2cd34: 88 23 and r24, r24 2cd36: 69 f0 breq .+26 ; 0x2cd52 2cd38: 80 91 9e 13 lds r24, 0x139E ; 0x80139e 2cd3c: 88 23 and r24, r24 2cd3e: 49 f0 breq .+18 ; 0x2cd52 SERIAL_ECHOLNPGM("DecrementRetryAttempts"); 2cd40: 89 e7 ldi r24, 0x79 ; 121 2cd42: 9a ea ldi r25, 0xAA ; 170 2cd44: 0e 94 13 79 call 0xf226 ; 0xf226 retryAttempts--; 2cd48: 80 91 9e 13 lds r24, 0x139E ; 0x80139e 2cd4c: 81 50 subi r24, 0x01 ; 1 2cd4e: 80 93 9e 13 sts 0x139E, r24 ; 0x80139e } } 2cd52: 08 95 ret 0002cd54 : MMU2_ECHO_MSGLN(tmp); } strncpy(lastMsg, tmp, rqs); } void ProtocolLogic::LogError(const char *reason_P) { 2cd54: 9f 92 push r9 2cd56: af 92 push r10 2cd58: bf 92 push r11 2cd5a: cf 92 push r12 2cd5c: df 92 push r13 2cd5e: ef 92 push r14 2cd60: ff 92 push r15 2cd62: 0f 93 push r16 2cd64: 1f 93 push r17 2cd66: cf 93 push r28 2cd68: df 93 push r29 2cd6a: cd b7 in r28, 0x3d ; 61 2cd6c: de b7 in r29, 0x3e ; 62 2cd6e: e0 97 sbiw r28, 0x30 ; 48 2cd70: 0f b6 in r0, 0x3f ; 63 2cd72: f8 94 cli 2cd74: de bf out 0x3e, r29 ; 62 2cd76: 0f be out 0x3f, r0 ; 63 2cd78: cd bf out 0x3d, r28 ; 61 2cd7a: 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()]; 2cd7c: e0 90 87 13 lds r14, 0x1387 ; 0x801387 2cd80: fe 01 movw r30, r28 2cd82: 31 96 adiw r30, 0x01 ; 1 2cd84: 21 e0 ldi r18, 0x01 ; 1 2cd86: 30 e0 ldi r19, 0x00 ; 0 2cd88: 5f 01 movw r10, r30 2cd8a: f1 2c mov r15, r1 2cd8c: 40 e1 ldi r20, 0x10 ; 16 2cd8e: c4 2e mov r12, r20 2cd90: d1 2c mov r13, r1 dst[i * 3] = NibbleToChar(b >> 4); dst[i * 3 + 1] = NibbleToChar(b & 0xf); dst[i * 3 + 2] = ' '; 2cd92: 50 e2 ldi r21, 0x20 ; 32 2cd94: 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()]; 2cd96: c7 01 movw r24, r14 2cd98: 82 1b sub r24, r18 2cd9a: 93 0b sbc r25, r19 2cd9c: b6 01 movw r22, r12 2cd9e: 0f 94 ed dc call 0x3b9da ; 0x3b9da <__divmodhi4> 2cda2: dc 01 movw r26, r24 2cda4: bb 27 eor r27, r27 2cda6: a6 5b subi r26, 0xB6 ; 182 2cda8: bc 4e sbci r27, 0xEC ; 236 2cdaa: 9d 96 adiw r26, 0x2d ; 45 2cdac: 8c 91 ld r24, X dst[i * 3] = NibbleToChar(b >> 4); 2cdae: 48 2f mov r20, r24 2cdb0: 50 e0 ldi r21, 0x00 ; 0 2cdb2: 94 e0 ldi r25, 0x04 ; 4 2cdb4: 55 95 asr r21 2cdb6: 47 95 ror r20 2cdb8: 9a 95 dec r25 2cdba: e1 f7 brne .-8 ; 0x2cdb4 lastReceivedBytes[lrb] = c; lrb = (lrb + 1) % lastReceivedBytes.size(); } constexpr char NibbleToChar(uint8_t c) { switch (c) { 2cdbc: 96 ef ldi r25, 0xF6 ; 246 2cdbe: 94 0f add r25, r20 2cdc0: 96 30 cpi r25, 0x06 ; 6 2cdc2: a8 f1 brcs .+106 ; 0x2ce2e case 5: case 6: case 7: case 8: case 9: return c + '0'; 2cdc4: 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); 2cdc6: 40 83 st Z, r20 dst[i * 3 + 1] = NibbleToChar(b & 0xf); 2cdc8: 8f 70 andi r24, 0x0F ; 15 lastReceivedBytes[lrb] = c; lrb = (lrb + 1) % lastReceivedBytes.size(); } constexpr char NibbleToChar(uint8_t c) { switch (c) { 2cdca: 96 ef ldi r25, 0xF6 ; 246 2cdcc: 98 0f add r25, r24 2cdce: 96 30 cpi r25, 0x06 ; 6 2cdd0: 80 f1 brcs .+96 ; 0x2ce32 case 5: case 6: case 7: case 8: case 9: return c + '0'; 2cdd2: 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); 2cdd4: 81 83 std Z+1, r24 ; 0x01 dst[i * 3 + 2] = ' '; 2cdd6: 92 82 std Z+2, r9 ; 0x02 2cdd8: 2f 5f subi r18, 0xFF ; 255 2cdda: 3f 4f sbci r19, 0xFF ; 255 2cddc: 33 96 adiw r30, 0x03 ; 3 return 0; } } void ProtocolLogic::FormatLastReceivedBytes(char *dst) { for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) { 2cdde: 21 31 cpi r18, 0x11 ; 17 2cde0: 31 05 cpc r19, r1 2cde2: c9 f6 brne .-78 ; 0x2cd96 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 2cde4: 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); 2cde6: 82 ef ldi r24, 0xF2 ; 242 2cde8: 9a ea ldi r25, 0xAA ; 170 2cdea: 0e 94 e8 76 call 0xedd0 ; 0xedd0 2cdee: 8c ee ldi r24, 0xEC ; 236 2cdf0: 9a ea ldi r25, 0xAA ; 170 2cdf2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 2cdf6: c8 01 movw r24, r16 2cdf8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOPGM(", last bytes: "); 2cdfc: 84 ea ldi r24, 0xA4 ; 164 2cdfe: 9a ea ldi r25, 0xAA ; 170 2ce00: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(lrb); 2ce04: c5 01 movw r24, r10 2ce06: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 } 2ce0a: e0 96 adiw r28, 0x30 ; 48 2ce0c: 0f b6 in r0, 0x3f ; 63 2ce0e: f8 94 cli 2ce10: de bf out 0x3e, r29 ; 62 2ce12: 0f be out 0x3f, r0 ; 63 2ce14: cd bf out 0x3d, r28 ; 61 2ce16: df 91 pop r29 2ce18: cf 91 pop r28 2ce1a: 1f 91 pop r17 2ce1c: 0f 91 pop r16 2ce1e: ff 90 pop r15 2ce20: ef 90 pop r14 2ce22: df 90 pop r13 2ce24: cf 90 pop r12 2ce26: bf 90 pop r11 2ce28: af 90 pop r10 2ce2a: 9f 90 pop r9 2ce2c: 08 95 ret case 11: case 12: case 13: case 14: case 15: return (c - 10) + 'a'; 2ce2e: 49 5a subi r20, 0xA9 ; 169 2ce30: ca cf rjmp .-108 ; 0x2cdc6 2ce32: 89 5a subi r24, 0xA9 ; 169 2ce34: cf cf rjmp .-98 ; 0x2cdd4 0002ce36 : char lrb[lastReceivedBytes.size()]; FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); } StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) { 2ce36: 9c 01 movw r18, r24 SERIAL_ECHOLNPGM("RSTCommTimeout"); dataTO.Reset(); } bool DropOutFilter::Record(StepStatus ss) { if (occurrences == maxOccurrences) { 2ce38: 90 91 5e 13 lds r25, 0x135E ; 0x80135e 2ce3c: 9a 30 cpi r25, 0x0A ; 10 2ce3e: 11 f4 brne .+4 ; 0x2ce44 cause = ss; 2ce40: 60 93 5d 13 sts 0x135D, r22 ; 0x80135d } --occurrences; 2ce44: 91 50 subi r25, 0x01 ; 1 2ce46: 90 93 5e 13 sts 0x135E, r25 ; 0x80135e FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); } StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) { if (dataTO.Record(ss)) { 2ce4a: 91 11 cpse r25, r1 2ce4c: 0d c0 rjmp .+26 ; 0x2ce68 2ce4e: c9 01 movw r24, r18 LogError(msg_P); 2ce50: 0f 94 aa 66 call 0x2cd54 ; 0x2cd54 SERIAL_ECHOLNPGM("ResetRetryAttempts"); retryAttempts = MAX_RETRIES; } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 2ce54: 85 e9 ldi r24, 0x95 ; 149 2ce56: 9a ea ldi r25, 0xAA ; 170 2ce58: 0e 94 13 79 call 0xf226 ; 0xf226 /// @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; } 2ce5c: 8a e0 ldi r24, 0x0A ; 10 2ce5e: 80 93 5e 13 sts 0x135E, r24 ; 0x80135e 2ce62: 80 91 5d 13 lds r24, 0x135D ; 0x80135d 2ce66: 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 2ce68: 80 e0 ldi r24, 0x00 ; 0 } } 2ce6a: 08 95 ret 0002ce6c : } *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) { 2ce6c: cf 93 push r28 2ce6e: df 93 push r29 2ce70: cd b7 in r28, 0x3d ; 61 2ce72: de b7 in r29, 0x3e ; 62 2ce74: 2e 97 sbiw r28, 0x0e ; 14 2ce76: 0f b6 in r0, 0x3f ; 63 2ce78: f8 94 cli 2ce7a: de bf out 0x3e, r29 ; 62 2ce7c: 0f be out 0x3f, r0 ; 63 2ce7e: cd bf out 0x3d, r28 ; 61 constexpr uint_fast8_t rqs = modules::protocol::Protocol::MaxRequestSize() + 1; char tmp[rqs] = ">"; 2ce80: 2e e3 ldi r18, 0x3E ; 62 2ce82: 30 e0 ldi r19, 0x00 ; 0 2ce84: 3a 83 std Y+2, r19 ; 0x02 2ce86: 29 83 std Y+1, r18 ; 0x01 2ce88: fe 01 movw r30, r28 2ce8a: 33 96 adiw r30, 0x03 ; 3 2ce8c: 2c e0 ldi r18, 0x0C ; 12 2ce8e: df 01 movw r26, r30 2ce90: 1d 92 st X+, r1 2ce92: 2a 95 dec r18 2ce94: e9 f7 brne .-6 ; 0x2ce90 2ce96: de 01 movw r26, r28 2ce98: 12 96 adiw r26, 0x02 ; 2 2ce9a: 48 2f mov r20, r24 2ce9c: fc 01 movw r30, r24 2ce9e: 9d 01 movw r18, r26 static char lastMsg[rqs] = ""; for (uint8_t i = 0; i < size; ++i) { 2cea0: 8e 2f mov r24, r30 2cea2: 84 1b sub r24, r20 2cea4: 86 17 cp r24, r22 2cea6: 40 f4 brcc .+16 ; 0x2ceb8 uint8_t b = txbuff[i]; 2cea8: 81 91 ld r24, Z+ // Check for printable character, including space if (b < 32 || b > 127) { 2ceaa: 90 ee ldi r25, 0xE0 ; 224 2ceac: 98 0f add r25, r24 2ceae: 90 36 cpi r25, 0x60 ; 96 2ceb0: 08 f0 brcs .+2 ; 0x2ceb4 b = '.'; 2ceb2: 8e e2 ldi r24, 0x2E ; 46 } tmp[i + 1] = b; 2ceb4: 8d 93 st X+, r24 2ceb6: f4 cf rjmp .-24 ; 0x2cea0 } tmp[size + 1] = 0; 2ceb8: f9 01 movw r30, r18 2ceba: e6 0f add r30, r22 2cebc: f1 1d adc r31, r1 2cebe: 10 82 st Z, r1 if (!strncmp_P(tmp, PSTR(">S0*c6."), rqs) && !strncmp(lastMsg, tmp, rqs)) { 2cec0: 4e e0 ldi r20, 0x0E ; 14 2cec2: 50 e0 ldi r21, 0x00 ; 0 2cec4: 68 ef ldi r22, 0xF8 ; 248 2cec6: 7a ea ldi r23, 0xAA ; 170 2cec8: ce 01 movw r24, r28 2ceca: 01 96 adiw r24, 0x01 ; 1 2cecc: 0f 94 ef d9 call 0x3b3de ; 0x3b3de 2ced0: 89 2b or r24, r25 2ced2: 59 f4 brne .+22 ; 0x2ceea 2ced4: 4e e0 ldi r20, 0x0E ; 14 2ced6: 50 e0 ldi r21, 0x00 ; 0 2ced8: be 01 movw r22, r28 2ceda: 6f 5f subi r22, 0xFF ; 255 2cedc: 7f 4f sbci r23, 0xFF ; 255 2cede: 81 ea ldi r24, 0xA1 ; 161 2cee0: 92 e1 ldi r25, 0x12 ; 18 2cee2: 0f 94 82 e2 call 0x3c504 ; 0x3c504 2cee6: 89 2b or r24, r25 2cee8: 61 f0 breq .+24 ; 0x2cf02 // 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); 2ceea: 82 ef ldi r24, 0xF2 ; 242 2ceec: 9a ea ldi r25, 0xAA ; 170 2ceee: 0e 94 e8 76 call 0xedd0 ; 0xedd0 2cef2: 8c ee ldi r24, 0xEC ; 236 2cef4: 9a ea ldi r25, 0xAA ; 170 2cef6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 2cefa: ce 01 movw r24, r28 2cefc: 01 96 adiw r24, 0x01 ; 1 2cefe: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 } strncpy(lastMsg, tmp, rqs); 2cf02: 4e e0 ldi r20, 0x0E ; 14 2cf04: 50 e0 ldi r21, 0x00 ; 0 2cf06: be 01 movw r22, r28 2cf08: 6f 5f subi r22, 0xFF ; 255 2cf0a: 7f 4f sbci r23, 0xFF ; 255 2cf0c: 81 ea ldi r24, 0xA1 ; 161 2cf0e: 92 e1 ldi r25, 0x12 ; 18 2cf10: 0f 94 90 e2 call 0x3c520 ; 0x3c520 } 2cf14: 2e 96 adiw r28, 0x0e ; 14 2cf16: 0f b6 in r0, 0x3f ; 63 2cf18: f8 94 cli 2cf1a: de bf out 0x3e, r29 ; 62 2cf1c: 0f be out 0x3f, r0 ; 63 2cf1e: cd bf out 0x3d, r28 ; 61 2cf20: df 91 pop r29 2cf22: cf 91 pop r28 2cf24: 08 95 ret 0002cf26 : return CommunicationTimeout; } return Processing; } void ProtocolLogic::SendMsg(RequestMsg rq) { 2cf26: cf 92 push r12 2cf28: df 92 push r13 2cf2a: ef 92 push r14 2cf2c: ff 92 push r15 2cf2e: 1f 93 push r17 2cf30: cf 93 push r28 2cf32: df 93 push r29 2cf34: cd b7 in r28, 0x3d ; 61 2cf36: de b7 in r29, 0x3e ; 62 2cf38: 62 97 sbiw r28, 0x12 ; 18 2cf3a: 0f b6 in r0, 0x3f ; 63 2cf3c: f8 94 cli 2cf3e: de bf out 0x3e, r29 ; 62 2cf40: 0f be out 0x3f, r0 ; 63 2cf42: cd bf out 0x3d, r28 ; 61 2cf44: 4e 87 std Y+14, r20 ; 0x0e 2cf46: 5f 87 std Y+15, r21 ; 0x0f 2cf48: 68 8b std Y+16, r22 ; 0x10 2cf4a: 79 8b std Y+17, r23 ; 0x11 2cf4c: 8a 8b std Y+18, r24 ; 0x12 } } } uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) { txbuff[0] = (uint8_t)msg.code; 2cf4e: 49 83 std Y+1, r20 ; 0x01 uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1); 2cf50: 85 2f mov r24, r21 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2cf52: 51 11 cpse r21, r1 2cf54: 31 c0 rjmp .+98 ; 0x2cfb8 *dst = '0'; 2cf56: 80 e3 ldi r24, 0x30 ; 48 2cf58: 8a 83 std Y+2, r24 ; 0x02 return 1; 2cf5a: 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); 2cf5c: e1 e0 ldi r30, 0x01 ; 1 2cf5e: e1 0f add r30, r17 2cf60: 81 e0 ldi r24, 0x01 ; 1 2cf62: 90 e0 ldi r25, 0x00 ; 0 2cf64: 8c 0f add r24, r28 2cf66: 9d 1f adc r25, r29 2cf68: 8e 0f add r24, r30 2cf6a: 91 1d adc r25, r1 2cf6c: fc 01 movw r30, r24 2cf6e: 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 2cf70: 9a e2 ldi r25, 0x2A ; 42 2cf72: 90 83 st Z, r25 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2cf74: 81 11 cpse r24, r1 2cf76: 27 c0 rjmp .+78 ; 0x2cfc6 *dst = '0'; 2cf78: 80 e3 ldi r24, 0x30 ; 48 2cf7a: 81 83 std Z+1, r24 ; 0x01 return 1; 2cf7c: 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); 2cf7e: 1e 5f subi r17, 0xFE ; 254 2cf80: 18 0f add r17, r24 txbuff[i] = '\n'; 2cf82: e1 e0 ldi r30, 0x01 ; 1 2cf84: f0 e0 ldi r31, 0x00 ; 0 2cf86: ec 0f add r30, r28 2cf88: fd 1f adc r31, r29 2cf8a: e1 0f add r30, r17 2cf8c: f1 1d adc r31, r1 2cf8e: 8a e0 ldi r24, 0x0A ; 10 2cf90: 80 83 st Z, r24 ++i; 2cf92: 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); 2cf94: fe 01 movw r30, r28 2cf96: 31 96 adiw r30, 0x01 ; 1 2cf98: 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--){ 2cf9a: 6f 01 movw r12, r30 2cf9c: c1 0e add r12, r17 2cf9e: d1 1c adc r13, r1 2cfa0: ec 14 cp r14, r12 2cfa2: fd 04 cpc r15, r13 2cfa4: b1 f0 breq .+44 ; 0x2cfd2 fputc(*buffer, uart2io); 2cfa6: f7 01 movw r30, r14 2cfa8: 81 91 ld r24, Z+ 2cfaa: 7f 01 movw r14, r30 2cfac: 63 e9 ldi r22, 0x93 ; 147 2cfae: 72 e1 ldi r23, 0x12 ; 18 2cfb0: 90 e0 ldi r25, 0x00 ; 0 2cfb2: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 2cfb6: f4 cf rjmp .-24 ; 0x2cfa0 2cfb8: be 01 movw r22, r28 2cfba: 6e 5f subi r22, 0xFE ; 254 2cfbc: 7f 4f sbci r23, 0xFF ; 255 2cfbe: 0f 94 31 c5 call 0x38a62 ; 0x38a62 2cfc2: 18 2f mov r17, r24 2cfc4: cb cf rjmp .-106 ; 0x2cf5c 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); 2cfc6: bf 01 movw r22, r30 2cfc8: 6f 5f subi r22, 0xFF ; 255 2cfca: 7f 4f sbci r23, 0xFF ; 255 2cfcc: 0f 94 31 c5 call 0x38a62 ; 0x38a62 2cfd0: d6 cf rjmp .-84 ; 0x2cf7e LogRequestMsg(txbuff, len); 2cfd2: 61 2f mov r22, r17 2cfd4: ce 01 movw r24, r28 2cfd6: 01 96 adiw r24, 0x01 ; 1 2cfd8: 0f 94 36 67 call 0x2ce6c ; 0x2ce6c RecordUARTActivity(); 2cfdc: 0f 94 8d 66 call 0x2cd1a ; 0x2cd1a } 2cfe0: 62 96 adiw r28, 0x12 ; 18 2cfe2: 0f b6 in r0, 0x3f ; 63 2cfe4: f8 94 cli 2cfe6: de bf out 0x3e, r29 ; 62 2cfe8: 0f be out 0x3f, r0 ; 63 2cfea: cd bf out 0x3d, r28 ; 61 2cfec: df 91 pop r29 2cfee: cf 91 pop r28 2cff0: 1f 91 pop r17 2cff2: ff 90 pop r15 2cff4: ef 90 pop r14 2cff6: df 90 pop r13 2cff8: cf 90 pop r12 2cffa: 08 95 ret 0002cffc : 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) { 2cffc: 8f 92 push r8 2cffe: 9f 92 push r9 2d000: af 92 push r10 2d002: bf 92 push r11 2d004: df 92 push r13 2d006: ef 92 push r14 2d008: ff 92 push r15 2d00a: 0f 93 push r16 2d00c: 1f 93 push r17 2d00e: cf 93 push r28 2d010: df 93 push r29 2d012: cd b7 in r28, 0x3d ; 61 2d014: de b7 in r29, 0x3e ; 62 2d016: 67 97 sbiw r28, 0x17 ; 23 2d018: 0f b6 in r0, 0x3f ; 63 2d01a: f8 94 cli 2d01c: de bf out 0x3e, r29 ; 62 2d01e: 0f be out 0x3f, r0 ; 63 2d020: cd bf out 0x3d, r28 ; 61 2d022: 18 2f mov r17, r24 2d024: 7b 01 movw r14, r22 2d026: d4 2e mov r13, r20 2d028: 07 e5 ldi r16, 0x57 ; 87 2d02a: 0b 8b std Y+19, r16 ; 0x13 2d02c: 8c 8b std Y+20, r24 ; 0x14 2d02e: 7e 8b std Y+22, r23 ; 0x16 2d030: 6d 8b std Y+21, r22 ; 0x15 2d032: ce 01 movw r24, r28 2d034: 43 96 adiw r24, 0x13 ; 19 2d036: 0f 94 5d c5 call 0x38aba ; 0x38aba 2d03a: 8f 8b std Y+23, r24 ; 0x17 2d03c: 0e 87 std Y+14, r16 ; 0x0e 2d03e: 1f 87 std Y+15, r17 ; 0x0f 2d040: f9 8a std Y+17, r15 ; 0x11 2d042: e8 8a std Y+16, r14 ; 0x10 2d044: ce 01 movw r24, r28 2d046: 0e 96 adiw r24, 0x0e ; 14 2d048: 0f 94 5d c5 call 0x38aba ; 0x38aba 2d04c: 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; 2d04e: 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) { 2d050: 11 11 cpse r17, r1 2d052: 27 c0 rjmp .+78 ; 0x2d0a2 *dst = '0'; 2d054: 80 e3 ldi r24, 0x30 ; 48 2d056: 8a 83 std Y+2, r24 ; 0x02 return 1; 2d058: 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); 2d05a: e1 e0 ldi r30, 0x01 ; 1 2d05c: e8 0f add r30, r24 dst[i] = ' '; 2d05e: 21 e0 ldi r18, 0x01 ; 1 2d060: 30 e0 ldi r19, 0x00 ; 0 2d062: 2c 0f add r18, r28 2d064: 3d 1f adc r19, r29 2d066: 2e 0f add r18, r30 2d068: 31 1d adc r19, r1 2d06a: f9 01 movw r30, r18 2d06c: 90 e2 ldi r25, 0x20 ; 32 2d06e: 90 83 st Z, r25 return i + 1; 2d070: 02 e0 ldi r16, 0x02 ; 2 2d072: 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); 2d074: aa 24 eor r10, r10 2d076: a3 94 inc r10 2d078: b1 2c mov r11, r1 2d07a: ac 0e add r10, r28 2d07c: bd 1e adc r11, r29 2d07e: a0 0e add r10, r16 2d080: 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) { 2d082: e1 14 cp r14, r1 2d084: f1 04 cpc r15, r1 2d086: 39 f1 breq .+78 ; 0x2d0d6 *dst = '0'; return 1; } // skip initial zeros uint8_t charsOut = 4; 2d088: 14 e0 ldi r17, 0x04 ; 4 while ((value & topNibbleMask) == 0) { 2d08a: c7 01 movw r24, r14 2d08c: 88 27 eor r24, r24 2d08e: 90 7f andi r25, 0xF0 ; 240 2d090: 89 2b or r24, r25 2d092: 71 f4 brne .+28 ; 0x2d0b0 value <<= 4U; 2d094: 24 e0 ldi r18, 0x04 ; 4 2d096: ee 0c add r14, r14 2d098: ff 1c adc r15, r15 2d09a: 2a 95 dec r18 2d09c: e1 f7 brne .-8 ; 0x2d096 --charsOut; 2d09e: 11 50 subi r17, 0x01 ; 1 2d0a0: f4 cf rjmp .-24 ; 0x2d08a 2d0a2: be 01 movw r22, r28 2d0a4: 6e 5f subi r22, 0xFE ; 254 2d0a6: 7f 4f sbci r23, 0xFF ; 255 2d0a8: 81 2f mov r24, r17 2d0aa: 0f 94 31 c5 call 0x38a62 ; 0x38a62 2d0ae: d5 cf rjmp .-86 ; 0x2d05a *dst = '0'; return 1; } // skip initial zeros uint8_t charsOut = 4; while ((value & topNibbleMask) == 0) { 2d0b0: 45 01 movw r8, r10 value <<= 4U; --charsOut; } for (uint8_t i = 0; i < charsOut; ++i) { 2d0b2: 88 2d mov r24, r8 2d0b4: 8a 19 sub r24, r10 2d0b6: 81 17 cp r24, r17 2d0b8: 90 f4 brcc .+36 ; 0x2d0de uint8_t n = (value & topNibbleMask) >> (8U + 4U); value <<= 4U; *dst = Nibble2Char(n); 2d0ba: 8f 2d mov r24, r15 2d0bc: 82 95 swap r24 2d0be: 8f 70 andi r24, 0x0F ; 15 2d0c0: 94 e0 ldi r25, 0x04 ; 4 2d0c2: ee 0c add r14, r14 2d0c4: ff 1c adc r15, r15 2d0c6: 9a 95 dec r25 2d0c8: e1 f7 brne .-8 ; 0x2d0c2 2d0ca: 0f 94 27 c5 call 0x38a4e ; 0x38a4e 2d0ce: f4 01 movw r30, r8 2d0d0: 81 93 st Z+, r24 2d0d2: 4f 01 movw r8, r30 2d0d4: ee cf rjmp .-36 ; 0x2d0b2 } uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) { constexpr uint16_t topNibbleMask = 0xf000; if (value == 0) { *dst = '0'; 2d0d6: 80 e3 ldi r24, 0x30 ; 48 2d0d8: f5 01 movw r30, r10 2d0da: 80 83 st Z, r24 return 1; 2d0dc: 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); 2d0de: 10 0f add r17, r16 i += AppendCRC(msg.CRC(), txbuff + i); 2d0e0: e1 e0 ldi r30, 0x01 ; 1 2d0e2: f0 e0 ldi r31, 0x00 ; 0 2d0e4: ec 0f add r30, r28 2d0e6: fd 1f adc r31, r29 2d0e8: e1 0f add r30, r17 2d0ea: f1 1d adc r31, r1 2d0ec: 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 2d0ee: 9a e2 ldi r25, 0x2A ; 42 2d0f0: 90 83 st Z, r25 txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { if (value == 0) { 2d0f2: 81 11 cpse r24, r1 2d0f4: 21 c0 rjmp .+66 ; 0x2d138 *dst = '0'; 2d0f6: 80 e3 ldi r24, 0x30 ; 48 2d0f8: 81 83 std Z+1, r24 ; 0x01 return 1; 2d0fa: 81 e0 ldi r24, 0x01 ; 1 2d0fc: 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); 2d0fe: 18 0f add r17, r24 txbuff[i] = '\n'; 2d100: e1 e0 ldi r30, 0x01 ; 1 2d102: f0 e0 ldi r31, 0x00 ; 0 2d104: ec 0f add r30, r28 2d106: fd 1f adc r31, r29 2d108: e1 0f add r30, r17 2d10a: f1 1d adc r31, r1 2d10c: 8a e0 ldi r24, 0x0A ; 10 2d10e: 80 83 st Z, r24 ++i; 2d110: 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); 2d112: 9e 01 movw r18, r28 2d114: 2f 5f subi r18, 0xFF ; 255 2d116: 3f 4f sbci r19, 0xFF ; 255 2d118: 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--){ 2d11a: 59 01 movw r10, r18 2d11c: a1 0e add r10, r17 2d11e: b1 1c adc r11, r1 2d120: ea 14 cp r14, r10 2d122: fb 04 cpc r15, r11 2d124: 79 f0 breq .+30 ; 0x2d144 fputc(*buffer, uart2io); 2d126: f7 01 movw r30, r14 2d128: 81 91 ld r24, Z+ 2d12a: 7f 01 movw r14, r30 2d12c: 63 e9 ldi r22, 0x93 ; 147 2d12e: 72 e1 ldi r23, 0x12 ; 18 2d130: 90 e0 ldi r25, 0x00 ; 0 2d132: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 2d136: f4 cf rjmp .-24 ; 0x2d120 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); 2d138: bf 01 movw r22, r30 2d13a: 6f 5f subi r22, 0xFF ; 255 2d13c: 7f 4f sbci r23, 0xFF ; 255 2d13e: 0f 94 31 c5 call 0x38a62 ; 0x38a62 2d142: dc cf rjmp .-72 ; 0x2d0fc LogRequestMsg(txbuff, len); 2d144: 61 2f mov r22, r17 2d146: ce 01 movw r24, r28 2d148: 01 96 adiw r24, 0x01 ; 1 2d14a: 0f 94 36 67 call 0x2ce6c ; 0x2ce6c RecordUARTActivity(); 2d14e: 0f 94 8d 66 call 0x2cd1a ; 0x2cd1a scopeState = nextState; } void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState) { SendWriteMsg(RequestMsg(RequestMsgCodes::Write, index, value)); scopeState = nextState; 2d152: d0 92 4d 13 sts 0x134D, r13 ; 0x80134d } 2d156: 67 96 adiw r28, 0x17 ; 23 2d158: 0f b6 in r0, 0x3f ; 63 2d15a: f8 94 cli 2d15c: de bf out 0x3e, r29 ; 62 2d15e: 0f be out 0x3f, r0 ; 63 2d160: cd bf out 0x3d, r28 ; 61 2d162: df 91 pop r29 2d164: cf 91 pop r28 2d166: 1f 91 pop r17 2d168: 0f 91 pop r16 2d16a: ff 90 pop r15 2d16c: ef 90 pop r14 2d16e: df 90 pop r13 2d170: bf 90 pop r11 2d172: af 90 pop r10 2d174: 9f 90 pop r9 2d176: 8f 90 pop r8 2d178: 08 95 ret 0002d17a : regIndex = 0; SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() { ++regIndex; 2d17a: 20 91 98 13 lds r18, 0x1398 ; 0x801398 2d17e: 2f 5f subi r18, 0xFF ; 255 2d180: 20 93 98 13 sts 0x1398, r18 ; 0x801398 if (regIndex >= initRegs8Count) { 2d184: 22 30 cpi r18, 0x02 ; 2 2d186: 78 f4 brcc .+30 ; 0x2d1a6 return true; } else { SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); 2d188: 30 e0 ldi r19, 0x00 ; 0 2d18a: f9 01 movw r30, r18 2d18c: ed 56 subi r30, 0x6D ; 109 2d18e: f5 45 sbci r31, 0x55 ; 85 2d190: 84 91 lpm r24, Z 2d192: 2a 56 subi r18, 0x6A ; 106 2d194: 3c 4e sbci r19, 0xEC ; 236 2d196: f9 01 movw r30, r18 2d198: 60 81 ld r22, Z 2d19a: 70 e0 ldi r23, 0x00 ; 0 2d19c: 49 e0 ldi r20, 0x09 ; 9 2d19e: 0f 94 fe 67 call 0x2cffc ; 0x2cffc } return false; 2d1a2: 80 e0 ldi r24, 0x00 ; 0 2d1a4: 08 95 ret } bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() { ++regIndex; if (regIndex >= initRegs8Count) { return true; 2d1a6: 81 e0 ldi r24, 0x01 ; 1 } else { SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } return false; } 2d1a8: 08 95 ret 0002d1aa : } /// 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){ 2d1aa: 2f 92 push r2 2d1ac: 3f 92 push r3 2d1ae: 4f 92 push r4 2d1b0: 5f 92 push r5 2d1b2: 6f 92 push r6 2d1b4: 7f 92 push r7 2d1b6: 8f 92 push r8 2d1b8: 9f 92 push r9 2d1ba: af 92 push r10 2d1bc: bf 92 push r11 2d1be: cf 92 push r12 2d1c0: df 92 push r13 2d1c2: ef 92 push r14 2d1c4: ff 92 push r15 2d1c6: 0f 93 push r16 2d1c8: 1f 93 push r17 2d1ca: cf 93 push r28 2d1cc: df 93 push r29 2d1ce: 00 d0 rcall .+0 ; 0x2d1d0 2d1d0: 1f 92 push r1 2d1d2: 1f 92 push r1 2d1d4: cd b7 in r28, 0x3d ; 61 2d1d6: de b7 in r29, 0x3e ; 62 2d1d8: 2b 01 movw r4, r22 2d1da: 1a 01 movw r2, r20 2d1dc: f1 2c mov r15, r1 2d1de: 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; 2d1e0: 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; 2d1e2: 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; 2d1e4: 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){ 2d1e6: 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); 2d1e8: 66 24 eor r6, r6 2d1ea: 63 94 inc r6 2d1ec: 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){ 2d1ee: 70 e0 ldi r23, 0x00 ; 0 2d1f0: 60 e0 ldi r22, 0x00 ; 0 2d1f2: 97 01 movw r18, r14 2d1f4: 2c 53 subi r18, 0x3C ; 60 2d1f6: 39 4f sbci r19, 0xF9 ; 249 2d1f8: 3a 83 std Y+2, r19 ; 0x02 2d1fa: 29 83 std Y+1, r18 ; 0x01 2d1fc: 86 2e mov r8, r22 2d1fe: c9 80 ldd r12, Y+1 ; 0x01 2d200: da 80 ldd r13, Y+2 ; 0x02 2d202: c6 0e add r12, r22 2d204: d7 1e adc r13, r23 2d206: 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; 2d208: 00 e0 ldi r16, 0x00 ; 0 for (uint8_t i = 0; i < 12; ++i){ 2d20a: 40 e0 ldi r20, 0x00 ; 0 2d20c: 30 e0 ldi r19, 0x00 ; 0 2d20e: 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; 2d210: ae ef ldi r26, 0xFE ; 254 2d212: a4 0f add r26, r20 2d214: 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; 2d216: 44 23 and r20, r20 2d218: 19 f0 breq .+6 ; 0x2d220 2d21a: 4b 30 cpi r20, 0x0B ; 11 2d21c: 09 f0 breq .+2 ; 0x2d220 2d21e: 7d c0 rjmp .+250 ; 0x2d31a 2d220: ae ef ldi r26, 0xFE ; 254 2d222: a2 0f add r26, r18 2d224: a8 30 cpi r26, 0x08 ; 8 2d226: 08 f4 brcc .+2 ; 0x2d22a 2d228: 7a c0 rjmp .+244 ; 0x2d31e 2d22a: 2f 5f subi r18, 0xFF ; 255 2d22c: 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){ 2d22e: 2c 30 cpi r18, 0x0C ; 12 2d230: 31 05 cpc r19, r1 2d232: 89 f7 brne .-30 ; 0x2d216 /// 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){ 2d234: 4f 5f subi r20, 0xFF ; 255 2d236: 20 e2 ldi r18, 0x20 ; 32 2d238: c2 0e add r12, r18 2d23a: d1 1c adc r13, r1 2d23c: 32 96 adiw r30, 0x02 ; 2 2d23e: 4c 30 cpi r20, 0x0C ; 12 2d240: 29 f7 brne .-54 ; 0x2d20c // 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){ 2d242: 3c 81 ldd r19, Y+4 ; 0x04 2d244: 30 17 cp r19, r16 2d246: 18 f4 brcc .+6 ; 0x2d24e 2d248: 0c 83 std Y+4, r16 ; 0x04 2d24a: 5d 83 std Y+5, r21 ; 0x05 2d24c: 18 2d mov r17, r8 2d24e: 6f 5f subi r22, 0xFF ; 255 2d250: 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){ 2d252: 64 31 cpi r22, 0x14 ; 20 2d254: 71 05 cpc r23, r1 2d256: 91 f6 brne .-92 ; 0x2d1fc 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){ 2d258: 5f 5f subi r21, 0xFF ; 255 2d25a: a0 e2 ldi r26, 0x20 ; 32 2d25c: ea 0e add r14, r26 2d25e: f1 1c adc r15, r1 2d260: 54 31 cpi r21, 0x14 ; 20 2d262: 29 f6 brne .-118 ; 0x2d1ee // 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); 2d264: ec 81 ldd r30, Y+4 ; 0x04 2d266: 6e 2f mov r22, r30 2d268: 70 e0 ldi r23, 0x00 ; 0 2d26a: 90 e0 ldi r25, 0x00 ; 0 2d26c: 80 e0 ldi r24, 0x00 ; 0 2d26e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2d272: 23 ec ldi r18, 0xC3 ; 195 2d274: 35 ef ldi r19, 0xF5 ; 245 2d276: 48 ea ldi r20, 0xA8 ; 168 2d278: 5f e3 ldi r21, 0x3F ; 63 2d27a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2d27e: 9f 93 push r25 2d280: 8f 93 push r24 2d282: 7f 93 push r23 2d284: 6f 93 push r22 2d286: fd 81 ldd r31, Y+5 ; 0x05 2d288: 6f 2f mov r22, r31 2d28a: 70 e0 ldi r23, 0x00 ; 0 2d28c: 90 e0 ldi r25, 0x00 ; 0 2d28e: 80 e0 ldi r24, 0x00 ; 0 2d290: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2d294: 20 e0 ldi r18, 0x00 ; 0 2d296: 30 e0 ldi r19, 0x00 ; 0 2d298: 40 eb ldi r20, 0xB0 ; 176 2d29a: 50 e4 ldi r21, 0x40 ; 64 2d29c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2d2a0: 9f 93 push r25 2d2a2: 8f 93 push r24 2d2a4: 7f 93 push r23 2d2a6: 6f 93 push r22 2d2a8: 61 2f mov r22, r17 2d2aa: 70 e0 ldi r23, 0x00 ; 0 2d2ac: 90 e0 ldi r25, 0x00 ; 0 2d2ae: 80 e0 ldi r24, 0x00 ; 0 2d2b0: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2d2b4: 20 e0 ldi r18, 0x00 ; 0 2d2b6: 30 e0 ldi r19, 0x00 ; 0 2d2b8: 40 eb ldi r20, 0xB0 ; 176 2d2ba: 50 e4 ldi r21, 0x40 ; 64 2d2bc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2d2c0: 9f 93 push r25 2d2c2: 8f 93 push r24 2d2c4: 7f 93 push r23 2d2c6: 6f 93 push r22 2d2c8: 80 ee ldi r24, 0xE0 ; 224 2d2ca: 95 ea ldi r25, 0xA5 ; 165 2d2cc: 9f 93 push r25 2d2ce: 8f 93 push r24 2d2d0: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 *pc = max_c; 2d2d4: f2 01 movw r30, r4 2d2d6: 10 83 st Z, r17 *pr = max_r; 2d2d8: 2d 81 ldd r18, Y+5 ; 0x05 2d2da: f1 01 movw r30, r2 2d2dc: 20 83 st Z, r18 2d2de: 0f b6 in r0, 0x3f ; 63 2d2e0: f8 94 cli 2d2e2: de bf out 0x3e, r29 ; 62 2d2e4: 0f be out 0x3f, r0 ; 63 2d2e6: cd bf out 0x3d, r28 ; 61 return max_match; } 2d2e8: 8c 81 ldd r24, Y+4 ; 0x04 2d2ea: 0f 90 pop r0 2d2ec: 0f 90 pop r0 2d2ee: 0f 90 pop r0 2d2f0: 0f 90 pop r0 2d2f2: 0f 90 pop r0 2d2f4: df 91 pop r29 2d2f6: cf 91 pop r28 2d2f8: 1f 91 pop r17 2d2fa: 0f 91 pop r16 2d2fc: ff 90 pop r15 2d2fe: ef 90 pop r14 2d300: df 90 pop r13 2d302: cf 90 pop r12 2d304: bf 90 pop r11 2d306: af 90 pop r10 2d308: 9f 90 pop r9 2d30a: 8f 90 pop r8 2d30c: 7f 90 pop r7 2d30e: 6f 90 pop r6 2d310: 5f 90 pop r5 2d312: 4f 90 pop r4 2d314: 3f 90 pop r3 2d316: 2f 90 pop r2 2d318: 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; 2d31a: 22 23 and r18, r18 2d31c: 11 f0 breq .+4 ; 0x2d322 2d31e: 2b 30 cpi r18, 0x0B ; 11 2d320: 21 f4 brne .+8 ; 0x2d32a 2d322: ab 81 ldd r26, Y+3 ; 0x03 2d324: a8 30 cpi r26, 0x08 ; 8 2d326: 08 f0 brcs .+2 ; 0x2d32a 2d328: 80 cf rjmp .-256 ; 0x2d22a const uint16_t idx = (c + j) + 32 * ((uint16_t)r + i); const bool high_pix = pixels[idx] > thr; 2d32a: 99 24 eor r9, r9 2d32c: 93 94 inc r9 2d32e: d6 01 movw r26, r12 2d330: a2 0f add r26, r18 2d332: b3 1f adc r27, r19 2d334: ac 91 ld r26, X 2d336: a1 31 cpi r26, 0x11 ; 17 2d338: 08 f4 brcc .+2 ; 0x2d33c 2d33a: 91 2c mov r9, r1 const bool high_pat = pattern[i] & (1 << j); 2d33c: a0 80 ld r10, Z 2d33e: b1 80 ldd r11, Z+1 ; 0x01 2d340: d3 01 movw r26, r6 2d342: 02 2e mov r0, r18 2d344: 02 c0 rjmp .+4 ; 0x2d34a 2d346: aa 0f add r26, r26 2d348: bb 1f adc r27, r27 2d34a: 0a 94 dec r0 2d34c: e2 f7 brpl .-8 ; 0x2d346 2d34e: aa 21 and r26, r10 2d350: bb 21 and r27, r11 2d352: bb 24 eor r11, r11 2d354: b3 94 inc r11 2d356: ab 2b or r26, r27 2d358: 09 f4 brne .+2 ; 0x2d35c 2d35a: b1 2c mov r11, r1 if (high_pix == high_pat) 2d35c: 9b 10 cpse r9, r11 2d35e: 65 cf rjmp .-310 ; 0x2d22a match++; 2d360: 0f 5f subi r16, 0xFF ; 255 2d362: 63 cf rjmp .-314 ; 0x2d22a 0002d364 : * \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) { 2d364: 8f 92 push r8 2d366: 9f 92 push r9 2d368: af 92 push r10 2d36a: bf 92 push r11 2d36c: cf 92 push r12 2d36e: df 92 push r13 2d370: ef 92 push r14 2d372: ff 92 push r15 2d374: cf 93 push r28 2d376: df 93 push r29 uint32_t totalBlocks; uint32_t volumeStartBlock = 0; fat32_boot_t* fbs; sdCard_ = dev; 2d378: 2c ef ldi r18, 0xFC ; 252 2d37a: 36 e1 ldi r19, 0x16 ; 22 2d37c: 30 93 9a 0e sts 0x0E9A, r19 ; 0x800e9a 2d380: 20 93 99 0e sts 0x0E99, r18 ; 0x800e99 fatType_ = 0; 2d384: 10 92 18 17 sts 0x1718, r1 ; 0x801718 allocSearchStart_ = 2; 2d388: 42 e0 ldi r20, 0x02 ; 2 2d38a: 50 e0 ldi r21, 0x00 ; 0 2d38c: 60 e0 ldi r22, 0x00 ; 0 2d38e: 70 e0 ldi r23, 0x00 ; 0 2d390: 40 93 01 17 sts 0x1701, r20 ; 0x801701 2d394: 50 93 02 17 sts 0x1702, r21 ; 0x801702 2d398: 60 93 03 17 sts 0x1703, r22 ; 0x801703 2d39c: 70 93 04 17 sts 0x1704, r23 ; 0x801704 cacheDirty_ = 0; // cacheFlush() will write block if true 2d3a0: 10 92 98 0e sts 0x0E98, r1 ; 0x800e98 cacheMirrorBlock_ = 0; 2d3a4: 10 92 94 0e sts 0x0E94, r1 ; 0x800e94 2d3a8: 10 92 95 0e sts 0x0E95, r1 ; 0x800e95 2d3ac: 10 92 96 0e sts 0x0E96, r1 ; 0x800e96 2d3b0: 10 92 97 0e sts 0x0E97, r1 ; 0x800e97 cacheBlockNumber_ = 0XFFFFFFFF; 2d3b4: 4f ef ldi r20, 0xFF ; 255 2d3b6: 5f ef ldi r21, 0xFF ; 255 2d3b8: ba 01 movw r22, r20 2d3ba: 40 93 90 0e sts 0x0E90, r20 ; 0x800e90 2d3be: 50 93 91 0e sts 0x0E91, r21 ; 0x800e91 2d3c2: 60 93 92 0e sts 0x0E92, r22 ; 0x800e92 2d3c6: 70 93 93 0e sts 0x0E93, r23 ; 0x800e93 // if part == 0 assume super floppy with FAT boot sector in block zero // if part > 0 assume mbr volume with partition table if (part) { 2d3ca: 88 23 and r24, r24 2d3cc: 09 f4 brne .+2 ; 0x2d3d0 2d3ce: 70 c0 rjmp .+224 ; 0x2d4b0 if (part > 4)goto fail; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; 2d3d0: 40 e0 ldi r20, 0x00 ; 0 2d3d2: 60 e0 ldi r22, 0x00 ; 0 2d3d4: 70 e0 ldi r23, 0x00 ; 0 2d3d6: cb 01 movw r24, r22 2d3d8: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2d3dc: 81 11 cpse r24, r1 2d3de: 0d c0 rjmp .+26 ; 0x2d3fa fatType_ = 32; } return true; fail: return false; 2d3e0: c0 e0 ldi r28, 0x00 ; 0 } 2d3e2: 8c 2f mov r24, r28 2d3e4: df 91 pop r29 2d3e6: cf 91 pop r28 2d3e8: ff 90 pop r15 2d3ea: ef 90 pop r14 2d3ec: df 90 pop r13 2d3ee: cf 90 pop r12 2d3f0: bf 90 pop r11 2d3f2: af 90 pop r10 2d3f4: 9f 90 pop r9 2d3f6: 8f 90 pop r8 2d3f8: 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 || 2d3fa: 80 91 5a 10 lds r24, 0x105A ; 0x80105a 2d3fe: 8f 77 andi r24, 0x7F ; 127 2d400: 79 f7 brne .-34 ; 0x2d3e0 2d402: 80 91 66 10 lds r24, 0x1066 ; 0x801066 2d406: 90 91 67 10 lds r25, 0x1067 ; 0x801067 2d40a: a0 91 68 10 lds r26, 0x1068 ; 0x801068 2d40e: b0 91 69 10 lds r27, 0x1069 ; 0x801069 2d412: 84 36 cpi r24, 0x64 ; 100 2d414: 91 05 cpc r25, r1 2d416: a1 05 cpc r26, r1 2d418: b1 05 cpc r27, r1 2d41a: 10 f3 brcs .-60 ; 0x2d3e0 p->totalSectors < 100 || p->firstSector == 0) { 2d41c: c0 90 62 10 lds r12, 0x1062 ; 0x801062 2d420: d0 90 63 10 lds r13, 0x1063 ; 0x801063 2d424: e0 90 64 10 lds r14, 0x1064 ; 0x801064 2d428: f0 90 65 10 lds r15, 0x1065 ; 0x801065 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 || 2d42c: c1 14 cp r12, r1 2d42e: d1 04 cpc r13, r1 2d430: e1 04 cpc r14, r1 2d432: f1 04 cpc r15, r1 2d434: a9 f2 breq .-86 ; 0x2d3e0 // not a valid partition goto fail; } volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; 2d436: 40 e0 ldi r20, 0x00 ; 0 2d438: c7 01 movw r24, r14 2d43a: b6 01 movw r22, r12 2d43c: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2d440: c8 2f mov r28, r24 2d442: 88 23 and r24, r24 2d444: 69 f2 breq .-102 ; 0x2d3e0 fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || 2d446: 80 91 a7 0e lds r24, 0x0EA7 ; 0x800ea7 2d44a: 90 91 a8 0e lds r25, 0x0EA8 ; 0x800ea8 2d44e: 81 15 cp r24, r1 2d450: 92 40 sbci r25, 0x02 ; 2 2d452: 31 f6 brne .-116 ; 0x2d3e0 fbs->fatCount == 0 || 2d454: a0 91 ac 0e lds r26, 0x0EAC ; 0x800eac } volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || 2d458: aa 23 and r26, r26 2d45a: 11 f2 breq .-124 ; 0x2d3e0 fbs->fatCount == 0 || fbs->reservedSectorCount == 0 || 2d45c: 60 91 aa 0e lds r22, 0x0EAA ; 0x800eaa 2d460: 70 91 ab 0e lds r23, 0x0EAB ; 0x800eab volumeStartBlock = p->firstSector; } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || fbs->fatCount == 0 || 2d464: 61 15 cp r22, r1 2d466: 71 05 cpc r23, r1 2d468: 09 f4 brne .+2 ; 0x2d46c 2d46a: ba cf rjmp .-140 ; 0x2d3e0 fbs->reservedSectorCount == 0 || fbs->sectorsPerCluster == 0) { 2d46c: 20 91 a9 0e lds r18, 0x0EA9 ; 0x800ea9 } if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail; fbs = &cacheBuffer_.fbs32; if (fbs->bytesPerSector != 512 || fbs->fatCount == 0 || fbs->reservedSectorCount == 0 || 2d470: 22 23 and r18, r18 2d472: 09 f4 brne .+2 ; 0x2d476 2d474: b5 cf rjmp .-150 ; 0x2d3e0 fbs->sectorsPerCluster == 0) { // not valid FAT volume goto fail; } fatCount_ = fbs->fatCount; 2d476: a0 93 13 17 sts 0x1713, r26 ; 0x801713 blocksPerCluster_ = fbs->sectorsPerCluster; 2d47a: 20 93 05 17 sts 0x1705, r18 ; 0x801705 // determine shift that is same as multiply by blocksPerCluster_ clusterSizeShift_ = 0; 2d47e: 90 e0 ldi r25, 0x00 ; 0 2d480: 80 e0 ldi r24, 0x00 ; 0 while (blocksPerCluster_ != (1 << clusterSizeShift_)) { 2d482: 30 e0 ldi r19, 0x00 ; 0 2d484: e1 e0 ldi r30, 0x01 ; 1 2d486: f0 e0 ldi r31, 0x00 ; 0 2d488: d8 2f mov r29, r24 2d48a: af 01 movw r20, r30 2d48c: 08 2e mov r0, r24 2d48e: 02 c0 rjmp .+4 ; 0x2d494 2d490: 44 0f add r20, r20 2d492: 55 1f adc r21, r21 2d494: 0a 94 dec r0 2d496: e2 f7 brpl .-8 ; 0x2d490 2d498: 24 17 cp r18, r20 2d49a: 35 07 cpc r19, r21 2d49c: 69 f0 breq .+26 ; 0x2d4b8 2d49e: 41 e0 ldi r20, 0x01 ; 1 2d4a0: 48 0f add r20, r24 2d4a2: 01 96 adiw r24, 0x01 ; 1 // error if not power of 2 if (clusterSizeShift_++ > 7) goto fail; 2d4a4: 89 30 cpi r24, 0x09 ; 9 2d4a6: 91 05 cpc r25, r1 2d4a8: 79 f7 brne .-34 ; 0x2d488 2d4aa: 40 93 0e 17 sts 0x170E, r20 ; 0x80170e 2d4ae: 98 cf rjmp .-208 ; 0x2d3e0 * 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; 2d4b0: c1 2c mov r12, r1 2d4b2: d1 2c mov r13, r1 2d4b4: 76 01 movw r14, r12 2d4b6: bf cf rjmp .-130 ; 0x2d436 2d4b8: 80 93 0e 17 sts 0x170E, r24 ; 0x80170e clusterSizeShift_ = 0; while (blocksPerCluster_ != (1 << clusterSizeShift_)) { // error if not power of 2 if (clusterSizeShift_++ > 7) goto fail; } blocksPerFat_ = fbs->sectorsPerFat16 ? 2d4bc: 20 91 b2 0e lds r18, 0x0EB2 ; 0x800eb2 2d4c0: 30 91 b3 0e lds r19, 0x0EB3 ; 0x800eb3 2d4c4: 50 e0 ldi r21, 0x00 ; 0 2d4c6: 40 e0 ldi r20, 0x00 ; 0 2d4c8: 21 15 cp r18, r1 2d4ca: 31 05 cpc r19, r1 2d4cc: 41 f4 brne .+16 ; 0x2d4de 2d4ce: 20 91 c0 0e lds r18, 0x0EC0 ; 0x800ec0 2d4d2: 30 91 c1 0e lds r19, 0x0EC1 ; 0x800ec1 2d4d6: 40 91 c2 0e lds r20, 0x0EC2 ; 0x800ec2 2d4da: 50 91 c3 0e lds r21, 0x0EC3 ; 0x800ec3 2d4de: 20 93 06 17 sts 0x1706, r18 ; 0x801706 2d4e2: 30 93 07 17 sts 0x1707, r19 ; 0x801707 2d4e6: 40 93 08 17 sts 0x1708, r20 ; 0x801708 2d4ea: 50 93 09 17 sts 0x1709, r21 ; 0x801709 fbs->sectorsPerFat16 : fbs->sectorsPerFat32; fatStartBlock_ = volumeStartBlock + fbs->reservedSectorCount; 2d4ee: 46 01 movw r8, r12 2d4f0: 57 01 movw r10, r14 2d4f2: 86 0e add r8, r22 2d4f4: 97 1e adc r9, r23 2d4f6: a1 1c adc r10, r1 2d4f8: b1 1c adc r11, r1 2d4fa: 80 92 14 17 sts 0x1714, r8 ; 0x801714 2d4fe: 90 92 15 17 sts 0x1715, r9 ; 0x801715 2d502: a0 92 16 17 sts 0x1716, r10 ; 0x801716 2d506: b0 92 17 17 sts 0x1717, r11 ; 0x801717 // count for FAT16 zero for FAT32 rootDirEntryCount_ = fbs->rootDirEntryCount; 2d50a: e0 91 ad 0e lds r30, 0x0EAD ; 0x800ead 2d50e: f0 91 ae 0e lds r31, 0x0EAE ; 0x800eae 2d512: f0 93 1a 17 sts 0x171A, r31 ; 0x80171a 2d516: e0 93 19 17 sts 0x1719, r30 ; 0x801719 // directory start for FAT16 dataStart for FAT32 rootDirStart_ = fatStartBlock_ + fbs->fatCount * blocksPerFat_; 2d51a: b0 e0 ldi r27, 0x00 ; 0 2d51c: 0f 94 a5 dc call 0x3b94a ; 0x3b94a <__muluhisi3> 2d520: dc 01 movw r26, r24 2d522: cb 01 movw r24, r22 2d524: 88 0d add r24, r8 2d526: 99 1d adc r25, r9 2d528: aa 1d adc r26, r10 2d52a: bb 1d adc r27, r11 2d52c: 80 93 1b 17 sts 0x171B, r24 ; 0x80171b 2d530: 90 93 1c 17 sts 0x171C, r25 ; 0x80171c 2d534: a0 93 1d 17 sts 0x171D, r26 ; 0x80171d 2d538: b0 93 1e 17 sts 0x171E, r27 ; 0x80171e // data start for FAT16 and FAT32 dataStartBlock_ = rootDirStart_ + ((32 * fbs->rootDirEntryCount + 511)/512); 2d53c: 25 e0 ldi r18, 0x05 ; 5 2d53e: ee 0f add r30, r30 2d540: ff 1f adc r31, r31 2d542: 2a 95 dec r18 2d544: e1 f7 brne .-8 ; 0x2d53e 2d546: e1 50 subi r30, 0x01 ; 1 2d548: fe 4f sbci r31, 0xFE ; 254 2d54a: ef 2f mov r30, r31 2d54c: ff 27 eor r31, r31 2d54e: e6 95 lsr r30 2d550: 8e 0f add r24, r30 2d552: 9f 1f adc r25, r31 2d554: a1 1d adc r26, r1 2d556: b1 1d adc r27, r1 2d558: 80 93 0f 17 sts 0x170F, r24 ; 0x80170f 2d55c: 90 93 10 17 sts 0x1710, r25 ; 0x801710 2d560: a0 93 11 17 sts 0x1711, r26 ; 0x801711 2d564: b0 93 12 17 sts 0x1712, r27 ; 0x801712 // total blocks for FAT16 or FAT32 totalBlocks = fbs->totalSectors16 ? 2d568: 80 90 af 0e lds r8, 0x0EAF ; 0x800eaf 2d56c: 90 90 b0 0e lds r9, 0x0EB0 ; 0x800eb0 2d570: b1 2c mov r11, r1 2d572: a1 2c mov r10, r1 2d574: 81 14 cp r8, r1 2d576: 91 04 cpc r9, r1 2d578: 41 f4 brne .+16 ; 0x2d58a 2d57a: 80 90 bc 0e lds r8, 0x0EBC ; 0x800ebc 2d57e: 90 90 bd 0e lds r9, 0x0EBD ; 0x800ebd 2d582: a0 90 be 0e lds r10, 0x0EBE ; 0x800ebe 2d586: b0 90 bf 0e lds r11, 0x0EBF ; 0x800ebf fbs->totalSectors16 : fbs->totalSectors32; // total data blocks clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); 2d58a: c8 1a sub r12, r24 2d58c: d9 0a sbc r13, r25 2d58e: ea 0a sbc r14, r26 2d590: fb 0a sbc r15, r27 2d592: c8 0c add r12, r8 2d594: d9 1c adc r13, r9 2d596: ea 1c adc r14, r10 2d598: fb 1c adc r15, r11 // divide by cluster size to get cluster count clusterCount_ >>= clusterSizeShift_; 2d59a: 04 c0 rjmp .+8 ; 0x2d5a4 2d59c: f6 94 lsr r15 2d59e: e7 94 ror r14 2d5a0: d7 94 ror r13 2d5a2: c7 94 ror r12 2d5a4: da 95 dec r29 2d5a6: d2 f7 brpl .-12 ; 0x2d59c 2d5a8: c0 92 0a 17 sts 0x170A, r12 ; 0x80170a 2d5ac: d0 92 0b 17 sts 0x170B, r13 ; 0x80170b 2d5b0: e0 92 0c 17 sts 0x170C, r14 ; 0x80170c 2d5b4: f0 92 0d 17 sts 0x170D, r15 ; 0x80170d // FAT type is determined by cluster count if (clusterCount_ < 4085) { 2d5b8: 85 ef ldi r24, 0xF5 ; 245 2d5ba: c8 16 cp r12, r24 2d5bc: 8f e0 ldi r24, 0x0F ; 15 2d5be: d8 06 cpc r13, r24 2d5c0: e1 04 cpc r14, r1 2d5c2: f1 04 cpc r15, r1 2d5c4: 20 f4 brcc .+8 ; 0x2d5ce fatType_ = 12; 2d5c6: 8c e0 ldi r24, 0x0C ; 12 2d5c8: 80 93 18 17 sts 0x1718, r24 ; 0x801718 2d5cc: 09 cf rjmp .-494 ; 0x2d3e0 if (!FAT12_SUPPORT) goto fail; } else if (clusterCount_ < 65525) { fatType_ = 16; 2d5ce: 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) { 2d5d0: 25 ef ldi r18, 0xF5 ; 245 2d5d2: c2 16 cp r12, r18 2d5d4: 2f ef ldi r18, 0xFF ; 255 2d5d6: d2 06 cpc r13, r18 2d5d8: e1 04 cpc r14, r1 2d5da: f1 04 cpc r15, r1 2d5dc: 88 f0 brcs .+34 ; 0x2d600 fatType_ = 16; } else { rootDirStart_ = fbs->fat32RootCluster; 2d5de: 80 91 c8 0e lds r24, 0x0EC8 ; 0x800ec8 2d5e2: 90 91 c9 0e lds r25, 0x0EC9 ; 0x800ec9 2d5e6: a0 91 ca 0e lds r26, 0x0ECA ; 0x800eca 2d5ea: b0 91 cb 0e lds r27, 0x0ECB ; 0x800ecb 2d5ee: 80 93 1b 17 sts 0x171B, r24 ; 0x80171b 2d5f2: 90 93 1c 17 sts 0x171C, r25 ; 0x80171c 2d5f6: a0 93 1d 17 sts 0x171D, r26 ; 0x80171d 2d5fa: b0 93 1e 17 sts 0x171E, r27 ; 0x80171e fatType_ = 32; 2d5fe: 80 e2 ldi r24, 0x20 ; 32 2d600: 80 93 18 17 sts 0x1718, r24 ; 0x801718 2d604: ee ce rjmp .-548 ; 0x2d3e2 0002d606 : break; } } void __attribute__((noinline)) MMU2::HelpUnloadToFinda() { extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE); 2d606: 20 e0 ldi r18, 0x00 ; 0 2d608: 30 e0 ldi r19, 0x00 ; 0 2d60a: 40 ea ldi r20, 0xA0 ; 160 2d60c: 52 e4 ldi r21, 0x42 ; 66 2d60e: 60 e0 ldi r22, 0x00 ; 0 2d610: 70 e0 ldi r23, 0x00 ; 0 2d612: 80 ea ldi r24, 0xA0 ; 160 2d614: 92 ec ldi r25, 0xC2 ; 194 2d616: 0d 94 a5 c5 jmp 0x38b4a ; 0x38b4a 0002d61a : void MMU2::Home(uint8_t mode) { logic.Home(mode); } void MMU2::SaveHotendTemp(bool turn_off_nozzle) { if (mmu_print_saved & SavedState::Cooldown) { 2d61a: 90 91 ba 13 lds r25, 0x13BA ; 0x8013ba 2d61e: 91 fd sbrc r25, 1 2d620: 17 c0 rjmp .+46 ; 0x2d650 return; } if (turn_off_nozzle && !(mmu_print_saved & SavedState::CooldownPending)) { 2d622: 88 23 and r24, r24 2d624: a9 f0 breq .+42 ; 0x2d650 2d626: 92 fd sbrc r25, 2 2d628: 13 c0 rjmp .+38 ; 0x2d650 Disable_E0(); 2d62a: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 resume_hotend_temp = thermal_degTargetHotend(); 2d62e: 80 91 b5 0d lds r24, 0x0DB5 ; 0x800db5 2d632: 90 91 b6 0d lds r25, 0x0DB6 ; 0x800db6 2d636: 90 93 af 13 sts 0x13AF, r25 ; 0x8013af 2d63a: 80 93 ae 13 sts 0x13AE, r24 ; 0x8013ae mmu_print_saved |= SavedState::CooldownPending; 2d63e: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 2d642: 84 60 ori r24, 0x04 ; 4 2d644: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba LogEchoEvent_P(PSTR("Heater cooldown pending")); 2d648: 84 e3 ldi r24, 0x34 ; 52 2d64a: 97 ea ldi r25, 0xA7 ; 167 2d64c: 0d 94 c9 c5 jmp 0x38b92 ; 0x38b92 } } 2d650: 08 95 ret 0002d652 : ScreenClear(); } } void MMU2::ResumeUnpark() { if (mmu_print_saved & SavedState::ParkExtruder) { 2d652: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 2d656: 80 ff sbrs r24, 0 2d658: 47 c0 rjmp .+142 ; 0x2d6e8 LogEchoEvent_P(PSTR("Resuming XYZ")); 2d65a: 8c e4 ldi r24, 0x4C ; 76 2d65c: 97 ea ldi r25, 0xA7 ; 167 2d65e: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 // 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)); 2d662: 80 91 a6 13 lds r24, 0x13A6 ; 0x8013a6 2d666: 90 91 a7 13 lds r25, 0x13A7 ; 0x8013a7 2d66a: a0 91 a8 13 lds r26, 0x13A8 ; 0x8013a8 2d66e: b0 91 a9 13 lds r27, 0x13A9 ; 0x8013a9 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; 2d672: 40 91 a2 13 lds r20, 0x13A2 ; 0x8013a2 2d676: 50 91 a3 13 lds r21, 0x13A3 ; 0x8013a3 2d67a: 60 91 a4 13 lds r22, 0x13A4 ; 0x8013a4 2d67e: 70 91 a5 13 lds r23, 0x13A5 ; 0x8013a5 2d682: 40 93 91 06 sts 0x0691, r20 ; 0x800691 2d686: 50 93 92 06 sts 0x0692, r21 ; 0x800692 2d68a: 60 93 93 06 sts 0x0693, r22 ; 0x800693 2d68e: 70 93 94 06 sts 0x0694, r23 ; 0x800694 current_position[Y_AXIS] = ry; 2d692: 80 93 95 06 sts 0x0695, r24 ; 0x800695 2d696: 90 93 96 06 sts 0x0696, r25 ; 0x800696 2d69a: a0 93 97 06 sts 0x0697, r26 ; 0x800697 2d69e: b0 93 98 06 sts 0x0698, r27 ; 0x800698 planner_line_to_current_position_sync(feedRate_mm_s); 2d6a2: 60 e0 ldi r22, 0x00 ; 0 2d6a4: 70 e0 ldi r23, 0x00 ; 0 2d6a6: 88 e4 ldi r24, 0x48 ; 72 2d6a8: 92 e4 ldi r25, 0x42 ; 66 2d6aa: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a } void motion_do_blocking_move_to_z(float z, float feedRate_mm_s) { current_position[Z_AXIS] = z; 2d6ae: 80 91 aa 13 lds r24, 0x13AA ; 0x8013aa 2d6b2: 90 91 ab 13 lds r25, 0x13AB ; 0x8013ab 2d6b6: a0 91 ac 13 lds r26, 0x13AC ; 0x8013ac 2d6ba: b0 91 ad 13 lds r27, 0x13AD ; 0x8013ad 2d6be: 80 93 99 06 sts 0x0699, r24 ; 0x800699 2d6c2: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 2d6c6: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 2d6ca: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c planner_line_to_current_position_sync(feedRate_mm_s); 2d6ce: 60 e0 ldi r22, 0x00 ; 0 2d6d0: 70 e0 ldi r23, 0x00 ; 0 2d6d2: 80 e7 ldi r24, 0x70 ; 112 2d6d4: 91 e4 ldi r25, 0x41 ; 65 2d6d6: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a void clear_print_state_in_ram() { // Set flag to false in order to avoid using // the saved values during power panic isPartialBackupAvailable = false; 2d6da: 10 92 a1 06 sts 0x06A1, r1 ; 0x8006a1 // 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); 2d6de: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 2d6e2: 8e 7f andi r24, 0xFE ; 254 2d6e4: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba } } 2d6e8: 08 95 ret 0002d6ea : mmu_print_saved |= SavedState::CooldownPending; LogEchoEvent_P(PSTR("Heater cooldown pending")); } } void MMU2::SaveAndPark(bool move_axes) { 2d6ea: 0f 93 push r16 2d6ec: 1f 93 push r17 2d6ee: cf 93 push r28 if (mmu_print_saved == SavedState::None) { // First occurrence. Save current position, park print head, disable nozzle heater. 2d6f0: 90 91 ba 13 lds r25, 0x13BA ; 0x8013ba 2d6f4: 91 11 cpse r25, r1 2d6f6: 72 c0 rjmp .+228 ; 0x2d7dc 2d6f8: c8 2f mov r28, r24 LogEchoEvent_P(PSTR("Saving and parking")); 2d6fa: 81 e2 ldi r24, 0x21 ; 33 2d6fc: 97 ea ldi r25, 0xA7 ; 167 2d6fe: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 Disable_E0(); 2d702: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 2d706: 0f 94 a9 43 call 0x28752 ; 0x28752 /// 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; 2d70a: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 2d70e: 81 11 cpse r24, r1 2d710: 02 c0 rjmp .+4 ; 0x2d716 2d712: 0e 94 e1 63 call 0xc7c2 ; 0xc7c2 // 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) { 2d716: cc 23 and r28, r28 2d718: 09 f4 brne .+2 ; 0x2d71c 2d71a: 60 c0 rjmp .+192 ; 0x2d7dc mmu_print_saved |= SavedState::ParkExtruder; 2d71c: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 2d720: 81 60 ori r24, 0x01 ; 1 2d722: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba 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]); 2d726: 80 91 99 06 lds r24, 0x0699 ; 0x800699 2d72a: 90 91 9a 06 lds r25, 0x069A ; 0x80069a 2d72e: a0 91 9b 06 lds r26, 0x069B ; 0x80069b 2d732: b0 91 9c 06 lds r27, 0x069C ; 0x80069c 2d736: 40 91 95 06 lds r20, 0x0695 ; 0x800695 2d73a: 50 91 96 06 lds r21, 0x0696 ; 0x800696 2d73e: 60 91 97 06 lds r22, 0x0697 ; 0x800697 2d742: 70 91 98 06 lds r23, 0x0698 ; 0x800698 resume_position = planner_current_position(); // save current pos 2d746: 00 91 91 06 lds r16, 0x0691 ; 0x800691 2d74a: 10 91 92 06 lds r17, 0x0692 ; 0x800692 2d74e: 20 91 93 06 lds r18, 0x0693 ; 0x800693 2d752: 30 91 94 06 lds r19, 0x0694 ; 0x800694 2d756: 00 93 a2 13 sts 0x13A2, r16 ; 0x8013a2 2d75a: 10 93 a3 13 sts 0x13A3, r17 ; 0x8013a3 2d75e: 20 93 a4 13 sts 0x13A4, r18 ; 0x8013a4 2d762: 30 93 a5 13 sts 0x13A5, r19 ; 0x8013a5 2d766: 40 93 a6 13 sts 0x13A6, r20 ; 0x8013a6 2d76a: 50 93 a7 13 sts 0x13A7, r21 ; 0x8013a7 2d76e: 60 93 a8 13 sts 0x13A8, r22 ; 0x8013a8 2d772: 70 93 a9 13 sts 0x13A9, r23 ; 0x8013a9 2d776: 80 93 aa 13 sts 0x13AA, r24 ; 0x8013aa 2d77a: 90 93 ab 13 sts 0x13AB, r25 ; 0x8013ab 2d77e: a0 93 ac 13 sts 0x13AC, r26 ; 0x8013ac 2d782: b0 93 ad 13 sts 0x13AD, r27 ; 0x8013ad current_position[E_AXIS] += delta; planner_line_to_current_position(feedRate); } float move_raise_z(float delta) { return raise_z(delta); 2d786: 60 e0 ldi r22, 0x00 ; 0 2d788: 70 e0 ldi r23, 0x00 ; 0 2d78a: 80 ea ldi r24, 0xA0 ; 160 2d78c: 91 e4 ldi r25, 0x41 ; 65 2d78e: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 void Disable_E0() { disable_e0(); } bool all_axes_homed() { return axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]; 2d792: 80 91 8e 06 lds r24, 0x068E ; 0x80068e 2d796: 88 23 and r24, r24 2d798: 09 f1 breq .+66 ; 0x2d7dc 2d79a: 80 91 8f 06 lds r24, 0x068F ; 0x80068f 2d79e: 88 23 and r24, r24 2d7a0: e9 f0 breq .+58 ; 0x2d7dc 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; 2d7a2: 80 e0 ldi r24, 0x00 ; 0 2d7a4: 90 e0 ldi r25, 0x00 ; 0 2d7a6: aa ef ldi r26, 0xFA ; 250 2d7a8: b2 e4 ldi r27, 0x42 ; 66 2d7aa: 80 93 91 06 sts 0x0691, r24 ; 0x800691 2d7ae: 90 93 92 06 sts 0x0692, r25 ; 0x800692 2d7b2: a0 93 93 06 sts 0x0693, r26 ; 0x800693 2d7b6: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS; 2d7ba: 10 92 95 06 sts 0x0695, r1 ; 0x800695 2d7be: 10 92 96 06 sts 0x0696, r1 ; 0x800696 2d7c2: 10 92 97 06 sts 0x0697, r1 ; 0x800697 2d7c6: 10 92 98 06 sts 0x0698, r1 ; 0x800698 planner_line_to_current_position_sync(NOZZLE_PARK_XY_FEEDRATE); 2d7ca: 60 e0 ldi r22, 0x00 ; 0 2d7cc: 70 e0 ldi r23, 0x00 ; 0 2d7ce: 88 e4 ldi r24, 0x48 ; 72 2d7d0: 92 e4 ldi r25, 0x42 ; 66 if (all_axes_homed()) { nozzle_park(); } } } } 2d7d2: cf 91 pop r28 2d7d4: 1f 91 pop r17 2d7d6: 0f 91 pop r16 2d7d8: 0d 94 c5 c5 jmp 0x38b8a ; 0x38b8a 2d7dc: cf 91 pop r28 2d7de: 1f 91 pop r17 2d7e0: 0f 91 pop r16 2d7e2: 08 95 ret 0002d7e4 : /// 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){ 2d7e4: 2f 92 push r2 2d7e6: 3f 92 push r3 2d7e8: 4f 92 push r4 2d7ea: 5f 92 push r5 2d7ec: 6f 92 push r6 2d7ee: 7f 92 push r7 2d7f0: 8f 92 push r8 2d7f2: 9f 92 push r9 2d7f4: af 92 push r10 2d7f6: bf 92 push r11 2d7f8: cf 92 push r12 2d7fa: df 92 push r13 2d7fc: ef 92 push r14 2d7fe: ff 92 push r15 2d800: 0f 93 push r16 2d802: 1f 93 push r17 2d804: cf 93 push r28 2d806: df 93 push r29 2d808: cd b7 in r28, 0x3d ; 61 2d80a: de b7 in r29, 0x3e ; 62 2d80c: cd 5b subi r28, 0xBD ; 189 2d80e: d1 40 sbci r29, 0x01 ; 1 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 2d81a: c3 57 subi r28, 0x73 ; 115 2d81c: de 4f sbci r29, 0xFE ; 254 2d81e: 99 83 std Y+1, r25 ; 0x01 2d820: 88 83 st Y, r24 2d822: cd 58 subi r28, 0x8D ; 141 2d824: d1 40 sbci r29, 0x01 ; 1 2d826: c1 57 subi r28, 0x71 ; 113 2d828: de 4f sbci r29, 0xFE ; 254 2d82a: 79 83 std Y+1, r23 ; 0x01 2d82c: 68 83 st Y, r22 2d82e: cf 58 subi r28, 0x8F ; 143 2d830: d1 40 sbci r29, 0x01 ; 1 2d832: ce 56 subi r28, 0x6E ; 110 2d834: de 4f sbci r29, 0xFE ; 254 2d836: 59 83 std Y+1, r21 ; 0x01 2d838: 48 83 st Y, r20 2d83a: c2 59 subi r28, 0x92 ; 146 2d83c: d1 40 sbci r29, 0x01 ; 1 2d83e: 84 e1 ldi r24, 0x14 ; 20 2d840: cf 56 subi r28, 0x6F ; 111 2d842: de 4f sbci r29, 0xFE ; 254 2d844: 88 83 st Y, r24 2d846: c1 59 subi r28, 0x91 ; 145 2d848: 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; 2d84a: ce 56 subi r28, 0x6E ; 110 2d84c: de 4f sbci r29, 0xFE ; 254 2d84e: a8 81 ld r26, Y 2d850: b9 81 ldd r27, Y+1 ; 0x01 2d852: c2 59 subi r28, 0x92 ; 146 2d854: d1 40 sbci r29, 0x01 ; 1 2d856: 8d 91 ld r24, X+ 2d858: 9d 91 ld r25, X+ 2d85a: 0d 90 ld r0, X+ 2d85c: bc 91 ld r27, X 2d85e: a0 2d mov r26, r0 2d860: c6 56 subi r28, 0x66 ; 102 2d862: de 4f sbci r29, 0xFE ; 254 2d864: 88 83 st Y, r24 2d866: 99 83 std Y+1, r25 ; 0x01 2d868: aa 83 std Y+2, r26 ; 0x02 2d86a: bb 83 std Y+3, r27 ; 0x03 2d86c: ca 59 subi r28, 0x9A ; 154 2d86e: d1 40 sbci r29, 0x01 ; 1 2d870: c1 57 subi r28, 0x71 ; 113 2d872: de 4f sbci r29, 0xFE ; 254 2d874: a8 81 ld r26, Y 2d876: b9 81 ldd r27, Y+1 ; 0x01 2d878: cf 58 subi r28, 0x8F ; 143 2d87a: d1 40 sbci r29, 0x01 ; 1 2d87c: 8d 91 ld r24, X+ 2d87e: 9d 91 ld r25, X+ 2d880: 0d 90 ld r0, X+ 2d882: bc 91 ld r27, X 2d884: a0 2d mov r26, r0 2d886: ca 54 subi r28, 0x4A ; 74 2d888: de 4f sbci r29, 0xFE ; 254 2d88a: 88 83 st Y, r24 2d88c: 99 83 std Y+1, r25 ; 0x01 2d88e: aa 83 std Y+2, r26 ; 0x02 2d890: bb 83 std Y+3, r27 ; 0x03 2d892: c6 5b subi r28, 0xB6 ; 182 2d894: d1 40 sbci r29, 0x01 ; 1 2d896: c3 57 subi r28, 0x73 ; 115 2d898: de 4f sbci r29, 0xFE ; 254 2d89a: a8 81 ld r26, Y 2d89c: b9 81 ldd r27, Y+1 ; 0x01 2d89e: cd 58 subi r28, 0x8D ; 141 2d8a0: d1 40 sbci r29, 0x01 ; 1 2d8a2: 8d 91 ld r24, X+ 2d8a4: 9d 91 ld r25, X+ 2d8a6: 0d 90 ld r0, X+ 2d8a8: bc 91 ld r27, X 2d8aa: a0 2d mov r26, r0 2d8ac: c6 54 subi r28, 0x46 ; 70 2d8ae: de 4f sbci r29, 0xFE ; 254 2d8b0: 88 83 st Y, r24 2d8b2: 99 83 std Y+1, r25 ; 0x01 2d8b4: aa 83 std Y+2, r26 ; 0x02 2d8b6: bb 83 std Y+3, r27 ; 0x03 2d8b8: ca 5b subi r28, 0xBA ; 186 2d8ba: d1 40 sbci r29, 0x01 ; 1 2d8bc: fe 01 movw r30, r28 2d8be: e7 5f subi r30, 0xF7 ; 247 2d8c0: fe 4f sbci r31, 0xFE ; 254 2d8c2: c8 55 subi r28, 0x58 ; 88 2d8c4: de 4f sbci r29, 0xFE ; 254 2d8c6: f9 83 std Y+1, r31 ; 0x01 2d8c8: e8 83 st Y, r30 2d8ca: c8 5a subi r28, 0xA8 ; 168 2d8cc: d1 40 sbci r29, 0x01 ; 1 2d8ce: ce 01 movw r24, r28 2d8d0: 8b 57 subi r24, 0x7B ; 123 2d8d2: 9f 4f sbci r25, 0xFF ; 255 2d8d4: ca 55 subi r28, 0x5A ; 90 2d8d6: de 4f sbci r29, 0xFE ; 254 2d8d8: 99 83 std Y+1, r25 ; 0x01 2d8da: 88 83 st Y, r24 2d8dc: c6 5a subi r28, 0xA6 ; 166 2d8de: d1 40 sbci r29, 0x01 ; 1 2d8e0: de 01 movw r26, r28 2d8e2: 11 96 adiw r26, 0x01 ; 1 2d8e4: c8 56 subi r28, 0x68 ; 104 2d8e6: de 4f sbci r29, 0xFE ; 254 2d8e8: b9 83 std Y+1, r27 ; 0x01 2d8ea: a8 83 st Y, r26 2d8ec: c8 59 subi r28, 0x98 ; 152 2d8ee: d1 40 sbci r29, 0x01 ; 1 2d8f0: 31 2c mov r3, r1 2d8f2: 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; 2d8f4: b1 01 movw r22, r2 2d8f6: 03 2c mov r0, r3 2d8f8: 00 0c add r0, r0 2d8fa: 88 0b sbc r24, r24 2d8fc: 99 0b sbc r25, r25 2d8fe: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2d902: 2a e1 ldi r18, 0x1A ; 26 2d904: 38 ef ldi r19, 0xF8 ; 248 2d906: 42 e4 ldi r20, 0x42 ; 66 2d908: 5e e3 ldi r21, 0x3E ; 62 2d90a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2d90e: 6b 01 movw r12, r22 2d910: 7c 01 movw r14, r24 const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z; 2d912: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 2d916: c2 56 subi r28, 0x62 ; 98 2d918: de 4f sbci r29, 0xFE ; 254 2d91a: 68 83 st Y, r22 2d91c: 79 83 std Y+1, r23 ; 0x01 2d91e: 8a 83 std Y+2, r24 ; 0x02 2d920: 9b 83 std Y+3, r25 ; 0x03 2d922: ce 59 subi r28, 0x9E ; 158 2d924: d1 40 sbci r29, 0x01 ; 1 2d926: c7 01 movw r24, r14 2d928: b6 01 movw r22, r12 2d92a: 0f 94 32 de call 0x3bc64 ; 0x3bc64 2d92e: ce 55 subi r28, 0x5E ; 94 2d930: de 4f sbci r29, 0xFE ; 254 2d932: 68 83 st Y, r22 2d934: 79 83 std Y+1, r23 ; 0x01 2d936: 8a 83 std Y+2, r24 ; 0x02 2d938: 9b 83 std Y+3, r25 ; 0x03 2d93a: c2 5a subi r28, 0xA2 ; 162 2d93c: d1 40 sbci r29, 0x01 ; 1 2d93e: 9b 01 movw r18, r22 2d940: ac 01 movw r20, r24 2d942: c6 56 subi r28, 0x66 ; 102 2d944: de 4f sbci r29, 0xFE ; 254 2d946: 68 81 ld r22, Y 2d948: 79 81 ldd r23, Y+1 ; 0x01 2d94a: 8a 81 ldd r24, Y+2 ; 0x02 2d94c: 9b 81 ldd r25, Y+3 ; 0x03 2d94e: ca 59 subi r28, 0x9A ; 154 2d950: d1 40 sbci r29, 0x01 ; 1 2d952: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2d956: c6 54 subi r28, 0x46 ; 70 2d958: de 4f sbci r29, 0xFE ; 254 2d95a: 28 81 ld r18, Y 2d95c: 39 81 ldd r19, Y+1 ; 0x01 2d95e: 4a 81 ldd r20, Y+2 ; 0x02 2d960: 5b 81 ldd r21, Y+3 ; 0x03 2d962: ca 5b subi r28, 0xBA ; 186 2d964: d1 40 sbci r29, 0x01 ; 1 2d966: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2d96a: 6b 01 movw r12, r22 2d96c: 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) 2d96e: 20 e0 ldi r18, 0x00 ; 0 2d970: 30 e0 ldi r19, 0x00 ; 0 2d972: a9 01 movw r20, r18 2d974: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2d978: 18 16 cp r1, r24 2d97a: 0c f0 brlt .+2 ; 0x2d97e 2d97c: 7a c2 rjmp .+1268 ; 0x2de72 // 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; 2d97e: c2 56 subi r28, 0x62 ; 98 2d980: de 4f sbci r29, 0xFE ; 254 2d982: 28 81 ld r18, Y 2d984: 39 81 ldd r19, Y+1 ; 0x01 2d986: 4a 81 ldd r20, Y+2 ; 0x02 2d988: 5b 81 ldd r21, Y+3 ; 0x03 2d98a: ce 59 subi r28, 0x9E ; 158 2d98c: d1 40 sbci r29, 0x01 ; 1 2d98e: c6 56 subi r28, 0x66 ; 102 2d990: de 4f sbci r29, 0xFE ; 254 2d992: 68 81 ld r22, Y 2d994: 79 81 ldd r23, Y+1 ; 0x01 2d996: 8a 81 ldd r24, Y+2 ; 0x02 2d998: 9b 81 ldd r25, Y+3 ; 0x03 2d99a: ca 59 subi r28, 0x9A ; 154 2d99c: d1 40 sbci r29, 0x01 ; 1 2d99e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2d9a2: ca 54 subi r28, 0x4A ; 74 2d9a4: de 4f sbci r29, 0xFE ; 254 2d9a6: 28 81 ld r18, Y 2d9a8: 39 81 ldd r19, Y+1 ; 0x01 2d9aa: 4a 81 ldd r20, Y+2 ; 0x02 2d9ac: 5b 81 ldd r21, Y+3 ; 0x03 2d9ae: c6 5b subi r28, 0xB6 ; 182 2d9b0: d1 40 sbci r29, 0x01 ; 1 2d9b2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2d9b6: 4b 01 movw r8, r22 2d9b8: 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) 2d9ba: 20 e0 ldi r18, 0x00 ; 0 2d9bc: 30 e0 ldi r19, 0x00 ; 0 2d9be: a9 01 movw r20, r18 2d9c0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2d9c4: 18 16 cp r1, r24 2d9c6: 0c f0 brlt .+2 ; 0x2d9ca 2d9c8: 54 c2 rjmp .+1192 ; 0x2de72 2d9ca: 20 e0 ldi r18, 0x00 ; 0 2d9cc: 30 e0 ldi r19, 0x00 ; 0 2d9ce: 48 ef ldi r20, 0xF8 ; 248 2d9d0: 51 e4 ldi r21, 0x41 ; 65 2d9d2: c7 01 movw r24, r14 2d9d4: b6 01 movw r22, r12 2d9d6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2d9da: 87 ff sbrs r24, 7 2d9dc: 4a c2 rjmp .+1172 ; 0x2de72 2d9de: 20 e0 ldi r18, 0x00 ; 0 2d9e0: 30 e0 ldi r19, 0x00 ; 0 2d9e2: 48 ef ldi r20, 0xF8 ; 248 2d9e4: 51 e4 ldi r21, 0x41 ; 65 2d9e6: c5 01 movw r24, r10 2d9e8: b4 01 movw r22, r8 2d9ea: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 2d9ee: 87 ff sbrs r24, 7 2d9f0: 40 c2 rjmp .+1152 ; 0x2de72 return 0; /// calculate weights of nearby points const float wc1 = c - floor(c); 2d9f2: c7 01 movw r24, r14 2d9f4: b6 01 movw r22, r12 2d9f6: 0f 94 df de call 0x3bdbe ; 0x3bdbe 2d9fa: 9b 01 movw r18, r22 2d9fc: ac 01 movw r20, r24 2d9fe: c7 01 movw r24, r14 2da00: b6 01 movw r22, r12 2da02: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2da06: 2b 01 movw r4, r22 2da08: 3c 01 movw r6, r24 const float wr1 = r - floor(r); 2da0a: c5 01 movw r24, r10 2da0c: b4 01 movw r22, r8 2da0e: 0f 94 df de call 0x3bdbe ; 0x3bdbe 2da12: 9b 01 movw r18, r22 2da14: ac 01 movw r20, r24 2da16: c5 01 movw r24, r10 2da18: b4 01 movw r22, r8 2da1a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2da1e: cc 56 subi r28, 0x6C ; 108 2da20: de 4f sbci r29, 0xFE ; 254 2da22: 68 83 st Y, r22 2da24: 79 83 std Y+1, r23 ; 0x01 2da26: 8a 83 std Y+2, r24 ; 0x02 2da28: 9b 83 std Y+3, r25 ; 0x03 2da2a: c4 59 subi r28, 0x94 ; 148 2da2c: d1 40 sbci r29, 0x01 ; 1 const float wc0 = 1 - wc1; 2da2e: a3 01 movw r20, r6 2da30: 92 01 movw r18, r4 2da32: 60 e0 ldi r22, 0x00 ; 0 2da34: 70 e0 ldi r23, 0x00 ; 0 2da36: 80 e8 ldi r24, 0x80 ; 128 2da38: 9f e3 ldi r25, 0x3F ; 63 2da3a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2da3e: c2 55 subi r28, 0x52 ; 82 2da40: de 4f sbci r29, 0xFE ; 254 2da42: 68 83 st Y, r22 2da44: 79 83 std Y+1, r23 ; 0x01 2da46: 8a 83 std Y+2, r24 ; 0x02 2da48: 9b 83 std Y+3, r25 ; 0x03 2da4a: ce 5a subi r28, 0xAE ; 174 2da4c: d1 40 sbci r29, 0x01 ; 1 const float wr0 = 1 - wr1; 2da4e: cc 56 subi r28, 0x6C ; 108 2da50: de 4f sbci r29, 0xFE ; 254 2da52: 28 81 ld r18, Y 2da54: 39 81 ldd r19, Y+1 ; 0x01 2da56: 4a 81 ldd r20, Y+2 ; 0x02 2da58: 5b 81 ldd r21, Y+3 ; 0x03 2da5a: c4 59 subi r28, 0x94 ; 148 2da5c: d1 40 sbci r29, 0x01 ; 1 2da5e: 60 e0 ldi r22, 0x00 ; 0 2da60: 70 e0 ldi r23, 0x00 ; 0 2da62: 80 e8 ldi r24, 0x80 ; 128 2da64: 9f e3 ldi r25, 0x3F ; 63 2da66: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2da6a: ce 54 subi r28, 0x4E ; 78 2da6c: de 4f sbci r29, 0xFE ; 254 2da6e: 68 83 st Y, r22 2da70: 79 83 std Y+1, r23 ; 0x01 2da72: 8a 83 std Y+2, r24 ; 0x02 2da74: 9b 83 std Y+3, r25 ; 0x03 2da76: c2 5b subi r28, 0xB2 ; 178 2da78: 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; 2da7a: c7 01 movw r24, r14 2da7c: b6 01 movw r22, r12 2da7e: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 2da82: 6b 01 movw r12, r22 const uint16_t c1 = c0 + 1; 2da84: fb 01 movw r30, r22 2da86: 31 96 adiw r30, 0x01 ; 1 2da88: c6 55 subi r28, 0x56 ; 86 2da8a: de 4f sbci r29, 0xFE ; 254 2da8c: f9 83 std Y+1, r31 ; 0x01 2da8e: e8 83 st Y, r30 2da90: ca 5a subi r28, 0xAA ; 170 2da92: d1 40 sbci r29, 0x01 ; 1 const uint16_t r0 = r; 2da94: c5 01 movw r24, r10 2da96: b4 01 movw r22, r8 2da98: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> const uint16_t r1 = r0 + 1; const uint16_t idx00 = c0 + 32 * r0; 2da9c: 8b 01 movw r16, r22 2da9e: 95 e0 ldi r25, 0x05 ; 5 2daa0: 00 0f add r16, r16 2daa2: 11 1f adc r17, r17 2daa4: 9a 95 dec r25 2daa6: e1 f7 brne .-8 ; 0x2daa0 const uint16_t idx01 = c0 + 32 * r1; 2daa8: c8 01 movw r24, r16 2daaa: 80 96 adiw r24, 0x20 ; 32 2daac: c4 55 subi r28, 0x54 ; 84 2daae: de 4f sbci r29, 0xFE ; 254 2dab0: 99 83 std Y+1, r25 ; 0x01 2dab2: 88 83 st Y, r24 2dab4: cc 5a subi r28, 0xAC ; 172 2dab6: 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]; 2dab8: f8 01 movw r30, r16 2daba: ec 0d add r30, r12 2dabc: fd 1d adc r31, r13 2dabe: ec 53 subi r30, 0x3C ; 60 2dac0: f9 4f sbci r31, 0xF9 ; 249 2dac2: 60 81 ld r22, Z 2dac4: 70 e0 ldi r23, 0x00 ; 0 2dac6: 90 e0 ldi r25, 0x00 ; 0 2dac8: 80 e0 ldi r24, 0x00 ; 0 2daca: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2dace: 4b 01 movw r8, r22 2dad0: 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; 2dad2: ce 54 subi r28, 0x4E ; 78 2dad4: de 4f sbci r29, 0xFE ; 254 2dad6: 28 81 ld r18, Y 2dad8: 39 81 ldd r19, Y+1 ; 0x01 2dada: 4a 81 ldd r20, Y+2 ; 0x02 2dadc: 5b 81 ldd r21, Y+3 ; 0x03 2dade: c2 5b subi r28, 0xB2 ; 178 2dae0: d1 40 sbci r29, 0x01 ; 1 2dae2: c2 55 subi r28, 0x52 ; 82 2dae4: de 4f sbci r29, 0xFE ; 254 2dae6: 68 81 ld r22, Y 2dae8: 79 81 ldd r23, Y+1 ; 0x01 2daea: 8a 81 ldd r24, Y+2 ; 0x02 2daec: 9b 81 ldd r25, Y+3 ; 0x03 2daee: ce 5a subi r28, 0xAE ; 174 2daf0: d1 40 sbci r29, 0x01 ; 1 2daf2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2daf6: 9b 01 movw r18, r22 2daf8: 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]; 2dafa: c5 01 movw r24, r10 2dafc: b4 01 movw r22, r8 2dafe: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2db02: 4b 01 movw r8, r22 2db04: 5c 01 movw r10, r24 2db06: c4 55 subi r28, 0x54 ; 84 2db08: de 4f sbci r29, 0xFE ; 254 2db0a: e8 81 ld r30, Y 2db0c: f9 81 ldd r31, Y+1 ; 0x01 2db0e: cc 5a subi r28, 0xAC ; 172 2db10: d1 40 sbci r29, 0x01 ; 1 2db12: ec 0d add r30, r12 2db14: fd 1d adc r31, r13 2db16: ec 53 subi r30, 0x3C ; 60 2db18: f9 4f sbci r31, 0xF9 ; 249 2db1a: 60 81 ld r22, Z 2db1c: 70 e0 ldi r23, 0x00 ; 0 2db1e: 90 e0 ldi r25, 0x00 ; 0 2db20: 80 e0 ldi r24, 0x00 ; 0 2db22: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2db26: 6b 01 movw r12, r22 2db28: 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; 2db2a: c2 55 subi r28, 0x52 ; 82 2db2c: de 4f sbci r29, 0xFE ; 254 2db2e: 28 81 ld r18, Y 2db30: 39 81 ldd r19, Y+1 ; 0x01 2db32: 4a 81 ldd r20, Y+2 ; 0x02 2db34: 5b 81 ldd r21, Y+3 ; 0x03 2db36: ce 5a subi r28, 0xAE ; 174 2db38: d1 40 sbci r29, 0x01 ; 1 2db3a: cc 56 subi r28, 0x6C ; 108 2db3c: de 4f sbci r29, 0xFE ; 254 2db3e: 68 81 ld r22, Y 2db40: 79 81 ldd r23, Y+1 ; 0x01 2db42: 8a 81 ldd r24, Y+2 ; 0x02 2db44: 9b 81 ldd r25, Y+3 ; 0x03 2db46: c4 59 subi r28, 0x94 ; 148 2db48: d1 40 sbci r29, 0x01 ; 1 2db4a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2db4e: 9b 01 movw r18, r22 2db50: 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]; 2db52: c7 01 movw r24, r14 2db54: b6 01 movw r22, r12 2db56: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2db5a: 9b 01 movw r18, r22 2db5c: ac 01 movw r20, r24 2db5e: c5 01 movw r24, r10 2db60: b4 01 movw r22, r8 2db62: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2db66: 6b 01 movw r12, r22 2db68: 7c 01 movw r14, r24 2db6a: c6 55 subi r28, 0x56 ; 86 2db6c: de 4f sbci r29, 0xFE ; 254 2db6e: a8 81 ld r26, Y 2db70: b9 81 ldd r27, Y+1 ; 0x01 2db72: ca 5a subi r28, 0xAA ; 170 2db74: d1 40 sbci r29, 0x01 ; 1 2db76: 0a 0f add r16, r26 2db78: 1b 1f adc r17, r27 2db7a: f8 01 movw r30, r16 2db7c: ec 53 subi r30, 0x3C ; 60 2db7e: f9 4f sbci r31, 0xF9 ; 249 2db80: 60 81 ld r22, Z 2db82: 70 e0 ldi r23, 0x00 ; 0 2db84: 90 e0 ldi r25, 0x00 ; 0 2db86: 80 e0 ldi r24, 0x00 ; 0 2db88: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2db8c: 4b 01 movw r8, r22 2db8e: 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; 2db90: ce 54 subi r28, 0x4E ; 78 2db92: de 4f sbci r29, 0xFE ; 254 2db94: 28 81 ld r18, Y 2db96: 39 81 ldd r19, Y+1 ; 0x01 2db98: 4a 81 ldd r20, Y+2 ; 0x02 2db9a: 5b 81 ldd r21, Y+3 ; 0x03 2db9c: c2 5b subi r28, 0xB2 ; 178 2db9e: d1 40 sbci r29, 0x01 ; 1 2dba0: c3 01 movw r24, r6 2dba2: b2 01 movw r22, r4 2dba4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dba8: 9b 01 movw r18, r22 2dbaa: 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]; 2dbac: c5 01 movw r24, r10 2dbae: b4 01 movw r22, r8 2dbb0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dbb4: 9b 01 movw r18, r22 2dbb6: ac 01 movw r20, r24 2dbb8: c7 01 movw r24, r14 2dbba: b6 01 movw r22, r12 2dbbc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2dbc0: 6b 01 movw r12, r22 2dbc2: 7c 01 movw r14, r24 2dbc4: c6 55 subi r28, 0x56 ; 86 2dbc6: de 4f sbci r29, 0xFE ; 254 2dbc8: e8 81 ld r30, Y 2dbca: f9 81 ldd r31, Y+1 ; 0x01 2dbcc: ca 5a subi r28, 0xAA ; 170 2dbce: d1 40 sbci r29, 0x01 ; 1 2dbd0: c4 55 subi r28, 0x54 ; 84 2dbd2: de 4f sbci r29, 0xFE ; 254 2dbd4: 88 81 ld r24, Y 2dbd6: 99 81 ldd r25, Y+1 ; 0x01 2dbd8: cc 5a subi r28, 0xAC ; 172 2dbda: d1 40 sbci r29, 0x01 ; 1 2dbdc: e8 0f add r30, r24 2dbde: f9 1f adc r31, r25 2dbe0: ec 53 subi r30, 0x3C ; 60 2dbe2: f9 4f sbci r31, 0xF9 ; 249 2dbe4: 60 81 ld r22, Z 2dbe6: 70 e0 ldi r23, 0x00 ; 0 2dbe8: 90 e0 ldi r25, 0x00 ; 0 2dbea: 80 e0 ldi r24, 0x00 ; 0 2dbec: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2dbf0: 4b 01 movw r8, r22 2dbf2: 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; 2dbf4: cc 56 subi r28, 0x6C ; 108 2dbf6: de 4f sbci r29, 0xFE ; 254 2dbf8: 28 81 ld r18, Y 2dbfa: 39 81 ldd r19, Y+1 ; 0x01 2dbfc: 4a 81 ldd r20, Y+2 ; 0x02 2dbfe: 5b 81 ldd r21, Y+3 ; 0x03 2dc00: c4 59 subi r28, 0x94 ; 148 2dc02: d1 40 sbci r29, 0x01 ; 1 2dc04: c3 01 movw r24, r6 2dc06: b2 01 movw r22, r4 2dc08: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dc0c: 9b 01 movw r18, r22 2dc0e: 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]; 2dc10: c5 01 movw r24, r10 2dc12: b4 01 movw r22, r8 2dc14: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dc18: 9b 01 movw r18, r22 2dc1a: ac 01 movw r20, r24 2dc1c: c7 01 movw r24, r14 2dc1e: b6 01 movw r22, r12 2dc20: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__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; 2dc24: 20 e0 ldi r18, 0x00 ; 0 2dc26: 30 e0 ldi r19, 0x00 ; 0 2dc28: 40 e0 ldi r20, 0x00 ; 0 2dc2a: 52 e4 ldi r21, 0x42 ; 66 2dc2c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2dc30: 6b 01 movw r12, r22 2dc32: 7c 01 movw r14, r24 // DBG(_n("%f "), point); shifts_x[p] = cos(angle) * height; 2dc34: ac 01 movw r20, r24 2dc36: 9b 01 movw r18, r22 2dc38: ce 55 subi r28, 0x5E ; 94 2dc3a: de 4f sbci r29, 0xFE ; 254 2dc3c: 68 81 ld r22, Y 2dc3e: 79 81 ldd r23, Y+1 ; 0x01 2dc40: 8a 81 ldd r24, Y+2 ; 0x02 2dc42: 9b 81 ldd r25, Y+3 ; 0x03 2dc44: c2 5a subi r28, 0xA2 ; 162 2dc46: d1 40 sbci r29, 0x01 ; 1 2dc48: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dc4c: c8 55 subi r28, 0x58 ; 88 2dc4e: de 4f sbci r29, 0xFE ; 254 2dc50: a8 81 ld r26, Y 2dc52: b9 81 ldd r27, Y+1 ; 0x01 2dc54: c8 5a subi r28, 0xA8 ; 168 2dc56: d1 40 sbci r29, 0x01 ; 1 2dc58: 6d 93 st X+, r22 2dc5a: 7d 93 st X+, r23 2dc5c: 8d 93 st X+, r24 2dc5e: 9d 93 st X+, r25 2dc60: c8 55 subi r28, 0x58 ; 88 2dc62: de 4f sbci r29, 0xFE ; 254 2dc64: b9 83 std Y+1, r27 ; 0x01 2dc66: a8 83 st Y, r26 2dc68: c8 5a subi r28, 0xA8 ; 168 2dc6a: d1 40 sbci r29, 0x01 ; 1 shifts_y[p] = sin(angle) * height; 2dc6c: a7 01 movw r20, r14 2dc6e: 96 01 movw r18, r12 2dc70: c2 56 subi r28, 0x62 ; 98 2dc72: de 4f sbci r29, 0xFE ; 254 2dc74: 68 81 ld r22, Y 2dc76: 79 81 ldd r23, Y+1 ; 0x01 2dc78: 8a 81 ldd r24, Y+2 ; 0x02 2dc7a: 9b 81 ldd r25, Y+3 ; 0x03 2dc7c: ce 59 subi r28, 0x9E ; 158 2dc7e: d1 40 sbci r29, 0x01 ; 1 2dc80: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dc84: ca 55 subi r28, 0x5A ; 90 2dc86: de 4f sbci r29, 0xFE ; 254 2dc88: e8 81 ld r30, Y 2dc8a: f9 81 ldd r31, Y+1 ; 0x01 2dc8c: c6 5a subi r28, 0xA6 ; 166 2dc8e: d1 40 sbci r29, 0x01 ; 1 2dc90: 61 93 st Z+, r22 2dc92: 71 93 st Z+, r23 2dc94: 81 93 st Z+, r24 2dc96: 91 93 st Z+, r25 2dc98: ca 55 subi r28, 0x5A ; 90 2dc9a: de 4f sbci r29, 0xFE ; 254 2dc9c: f9 83 std Y+1, r31 ; 0x01 2dc9e: e8 83 st Y, r30 2dca0: c6 5a subi r28, 0xA6 ; 166 2dca2: d1 40 sbci r29, 0x01 ; 1 shifts_r[p] = height; 2dca4: c8 56 subi r28, 0x68 ; 104 2dca6: de 4f sbci r29, 0xFE ; 254 2dca8: a8 81 ld r26, Y 2dcaa: b9 81 ldd r27, Y+1 ; 0x01 2dcac: c8 59 subi r28, 0x98 ; 152 2dcae: d1 40 sbci r29, 0x01 ; 1 2dcb0: cd 92 st X+, r12 2dcb2: dd 92 st X+, r13 2dcb4: ed 92 st X+, r14 2dcb6: fd 92 st X+, r15 2dcb8: c8 56 subi r28, 0x68 ; 104 2dcba: de 4f sbci r29, 0xFE ; 254 2dcbc: b9 83 std Y+1, r27 ; 0x01 2dcbe: a8 83 st Y, r26 2dcc0: c8 59 subi r28, 0x98 ; 152 2dcc2: d1 40 sbci r29, 0x01 ; 1 2dcc4: bf ef ldi r27, 0xFF ; 255 2dcc6: 2b 1a sub r2, r27 2dcc8: 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){ 2dcca: e1 e2 ldi r30, 0x21 ; 33 2dccc: 2e 16 cp r2, r30 2dcce: 31 04 cpc r3, r1 2dcd0: 09 f0 breq .+2 ; 0x2dcd4 2dcd2: 10 ce rjmp .-992 ; 0x2d8f4 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); 2dcd4: 40 e0 ldi r20, 0x00 ; 0 2dcd6: 50 e0 ldi r21, 0x00 ; 0 2dcd8: 60 e0 ldi r22, 0x00 ; 0 2dcda: 7d e3 ldi r23, 0x3D ; 61 2dcdc: ce 01 movw r24, r28 2dcde: 87 5f subi r24, 0xF7 ; 247 2dce0: 9e 4f sbci r25, 0xFE ; 254 2dce2: 0f 94 ee 65 call 0x2cbdc ; 0x2cbdc 2dce6: 9b 01 movw r18, r22 2dce8: ac 01 movw r20, r24 2dcea: c3 57 subi r28, 0x73 ; 115 2dcec: de 4f sbci r29, 0xFE ; 254 2dcee: a8 81 ld r26, Y 2dcf0: b9 81 ldd r27, Y+1 ; 0x01 2dcf2: cd 58 subi r28, 0x8D ; 141 2dcf4: d1 40 sbci r29, 0x01 ; 1 2dcf6: 6d 91 ld r22, X+ 2dcf8: 7d 91 ld r23, X+ 2dcfa: 8d 91 ld r24, X+ 2dcfc: 9c 91 ld r25, X 2dcfe: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2dd02: c3 57 subi r28, 0x73 ; 115 2dd04: de 4f sbci r29, 0xFE ; 254 2dd06: e8 81 ld r30, Y 2dd08: f9 81 ldd r31, Y+1 ; 0x01 2dd0a: cd 58 subi r28, 0x8D ; 141 2dd0c: d1 40 sbci r29, 0x01 ; 1 2dd0e: 60 83 st Z, r22 2dd10: 71 83 std Z+1, r23 ; 0x01 2dd12: 82 83 std Z+2, r24 ; 0x02 2dd14: 93 83 std Z+3, r25 ; 0x03 y += CLAMP_median(shifts_y, blocks, norm); 2dd16: 40 e0 ldi r20, 0x00 ; 0 2dd18: 50 e0 ldi r21, 0x00 ; 0 2dd1a: 60 e0 ldi r22, 0x00 ; 0 2dd1c: 7d e3 ldi r23, 0x3D ; 61 2dd1e: ce 01 movw r24, r28 2dd20: 8b 57 subi r24, 0x7B ; 123 2dd22: 9f 4f sbci r25, 0xFF ; 255 2dd24: 0f 94 ee 65 call 0x2cbdc ; 0x2cbdc 2dd28: 9b 01 movw r18, r22 2dd2a: ac 01 movw r20, r24 2dd2c: c1 57 subi r28, 0x71 ; 113 2dd2e: de 4f sbci r29, 0xFE ; 254 2dd30: a8 81 ld r26, Y 2dd32: b9 81 ldd r27, Y+1 ; 0x01 2dd34: cf 58 subi r28, 0x8F ; 143 2dd36: d1 40 sbci r29, 0x01 ; 1 2dd38: 6d 91 ld r22, X+ 2dd3a: 7d 91 ld r23, X+ 2dd3c: 8d 91 ld r24, X+ 2dd3e: 9c 91 ld r25, X 2dd40: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2dd44: c1 57 subi r28, 0x71 ; 113 2dd46: de 4f sbci r29, 0xFE ; 254 2dd48: e8 81 ld r30, Y 2dd4a: f9 81 ldd r31, Y+1 ; 0x01 2dd4c: cf 58 subi r28, 0x8F ; 143 2dd4e: d1 40 sbci r29, 0x01 ; 1 2dd50: 60 83 st Z, r22 2dd52: 71 83 std Z+1, r23 ; 0x01 2dd54: 82 83 std Z+2, r24 ; 0x02 2dd56: 93 83 std Z+3, r25 ; 0x03 r += CLAMP_median(shifts_r, blocks, norm * .5f); 2dd58: 40 e0 ldi r20, 0x00 ; 0 2dd5a: 50 e0 ldi r21, 0x00 ; 0 2dd5c: 60 e8 ldi r22, 0x80 ; 128 2dd5e: 7c e3 ldi r23, 0x3C ; 60 2dd60: ce 01 movw r24, r28 2dd62: 01 96 adiw r24, 0x01 ; 1 2dd64: 0f 94 ee 65 call 0x2cbdc ; 0x2cbdc 2dd68: ce 56 subi r28, 0x6E ; 110 2dd6a: de 4f sbci r29, 0xFE ; 254 2dd6c: a8 81 ld r26, Y 2dd6e: b9 81 ldd r27, Y+1 ; 0x01 2dd70: c2 59 subi r28, 0x92 ; 146 2dd72: d1 40 sbci r29, 0x01 ; 1 2dd74: 2d 91 ld r18, X+ 2dd76: 3d 91 ld r19, X+ 2dd78: 4d 91 ld r20, X+ 2dd7a: 5c 91 ld r21, X 2dd7c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2dd80: 16 2f mov r17, r22 2dd82: 07 2f mov r16, r23 2dd84: f8 2e mov r15, r24 2dd86: e9 2e mov r14, r25 r = MAX(2, r); 2dd88: 20 e0 ldi r18, 0x00 ; 0 2dd8a: 30 e0 ldi r19, 0x00 ; 0 2dd8c: 40 e0 ldi r20, 0x00 ; 0 2dd8e: 50 e4 ldi r21, 0x40 ; 64 2dd90: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 2dd94: 18 16 cp r1, r24 2dd96: 2c f0 brlt .+10 ; 0x2dda2 2dd98: 10 e0 ldi r17, 0x00 ; 0 2dd9a: 00 e0 ldi r16, 0x00 ; 0 2dd9c: f1 2c mov r15, r1 2dd9e: 80 e4 ldi r24, 0x40 ; 64 2dda0: e8 2e mov r14, r24 2dda2: a8 01 movw r20, r16 2dda4: 97 01 movw r18, r14 2dda6: 85 2f mov r24, r21 2dda8: 90 2f mov r25, r16 2ddaa: a3 2f mov r26, r19 2ddac: be 2d mov r27, r14 2ddae: ce 56 subi r28, 0x6E ; 110 2ddb0: de 4f sbci r29, 0xFE ; 254 2ddb2: e8 81 ld r30, Y 2ddb4: f9 81 ldd r31, Y+1 ; 0x01 2ddb6: c2 59 subi r28, 0x92 ; 146 2ddb8: d1 40 sbci r29, 0x01 ; 1 2ddba: 80 83 st Z, r24 2ddbc: 91 83 std Z+1, r25 ; 0x01 2ddbe: a2 83 std Z+2, r26 ; 0x02 2ddc0: b3 83 std Z+3, r27 ; 0x03 2ddc2: cf 56 subi r28, 0x6F ; 111 2ddc4: de 4f sbci r29, 0xFE ; 254 2ddc6: f8 81 ld r31, Y 2ddc8: c1 59 subi r28, 0x91 ; 145 2ddca: d1 40 sbci r29, 0x01 ; 1 2ddcc: f1 50 subi r31, 0x01 ; 1 2ddce: cf 56 subi r28, 0x6F ; 111 2ddd0: de 4f sbci r29, 0xFE ; 254 2ddd2: f8 83 st Y, r31 2ddd4: c1 59 subi r28, 0x91 ; 145 2ddd6: 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){ 2ddd8: f1 11 cpse r31, r1 2ddda: 37 cd rjmp .-1426 ; 0x2d84a r = MAX(2, r); } //@size=118 DBG(_n(" [%f, %f][%f] final circle\n"), x, y, r); 2dddc: ef 92 push r14 2ddde: ff 92 push r15 2dde0: 0f 93 push r16 2dde2: 1f 93 push r17 2dde4: c1 57 subi r28, 0x71 ; 113 2dde6: de 4f sbci r29, 0xFE ; 254 2dde8: a8 81 ld r26, Y 2ddea: b9 81 ldd r27, Y+1 ; 0x01 2ddec: cf 58 subi r28, 0x8F ; 143 2ddee: d1 40 sbci r29, 0x01 ; 1 2ddf0: 13 96 adiw r26, 0x03 ; 3 2ddf2: 8c 91 ld r24, X 2ddf4: 13 97 sbiw r26, 0x03 ; 3 2ddf6: 8f 93 push r24 2ddf8: 12 96 adiw r26, 0x02 ; 2 2ddfa: 8c 91 ld r24, X 2ddfc: 12 97 sbiw r26, 0x02 ; 2 2ddfe: 8f 93 push r24 2de00: 11 96 adiw r26, 0x01 ; 1 2de02: 8c 91 ld r24, X 2de04: 11 97 sbiw r26, 0x01 ; 1 2de06: 8f 93 push r24 2de08: 8c 91 ld r24, X 2de0a: 8f 93 push r24 2de0c: c3 57 subi r28, 0x73 ; 115 2de0e: de 4f sbci r29, 0xFE ; 254 2de10: e8 81 ld r30, Y 2de12: f9 81 ldd r31, Y+1 ; 0x01 2de14: cd 58 subi r28, 0x8D ; 141 2de16: d1 40 sbci r29, 0x01 ; 1 2de18: 83 81 ldd r24, Z+3 ; 0x03 2de1a: 8f 93 push r24 2de1c: 82 81 ldd r24, Z+2 ; 0x02 2de1e: 8f 93 push r24 2de20: 81 81 ldd r24, Z+1 ; 0x01 2de22: 8f 93 push r24 2de24: 80 81 ld r24, Z 2de26: 8f 93 push r24 2de28: 84 e0 ldi r24, 0x04 ; 4 2de2a: 96 ea ldi r25, 0xA6 ; 166 2de2c: 9f 93 push r25 2de2e: 8f 93 push r24 2de30: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2de34: 0f b6 in r0, 0x3f ; 63 2de36: f8 94 cli 2de38: de bf out 0x3e, r29 ; 62 2de3a: 0f be out 0x3f, r0 ; 63 2de3c: cd bf out 0x3d, r28 ; 61 } 2de3e: c3 54 subi r28, 0x43 ; 67 2de40: de 4f sbci r29, 0xFE ; 254 2de42: 0f b6 in r0, 0x3f ; 63 2de44: f8 94 cli 2de46: de bf out 0x3e, r29 ; 62 2de48: 0f be out 0x3f, r0 ; 63 2de4a: cd bf out 0x3d, r28 ; 61 2de4c: df 91 pop r29 2de4e: cf 91 pop r28 2de50: 1f 91 pop r17 2de52: 0f 91 pop r16 2de54: ff 90 pop r15 2de56: ef 90 pop r14 2de58: df 90 pop r13 2de5a: cf 90 pop r12 2de5c: bf 90 pop r11 2de5e: af 90 pop r10 2de60: 9f 90 pop r9 2de62: 8f 90 pop r8 2de64: 7f 90 pop r7 2de66: 6f 90 pop r6 2de68: 5f 90 pop r5 2de6a: 4f 90 pop r4 2de6c: 3f 90 pop r3 2de6e: 2f 90 pop r2 2de70: 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; 2de72: 60 e0 ldi r22, 0x00 ; 0 2de74: 70 e0 ldi r23, 0x00 ; 0 2de76: cb 01 movw r24, r22 2de78: d5 ce rjmp .-598 ; 0x2dc24 0002de7a : 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){ 2de7a: ef 92 push r14 2de7c: ff 92 push r15 2de7e: 0f 93 push r16 2de80: 1f 93 push r17 2de82: cf 93 push r28 2de84: df 93 push r29 2de86: 1f 92 push r1 2de88: 1f 92 push r1 2de8a: cd b7 in r28, 0x3d ; 61 2de8c: de b7 in r29, 0x3e ; 62 2de8e: f8 2e mov r15, r24 2de90: e6 2e mov r14, r22 if (steps == 0) return; uint16_t current_delay_us = MAX_DELAY; 2de92: 80 e1 ldi r24, 0x10 ; 16 2de94: 97 e2 ldi r25, 0x27 ; 39 2de96: 9a 83 std Y+2, r25 ; 0x02 2de98: 89 83 std Y+1, r24 ; 0x01 const uint16_t half = steps / 2; 2de9a: 8a 01 movw r16, r20 2de9c: 16 95 lsr r17 2de9e: 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); 2dea0: 8f 2d mov r24, r15 2dea2: 0e 94 d5 eb call 0x1d7aa ; 0x1d7aa while (steps--){ 2dea6: 01 50 subi r16, 0x01 ; 1 2dea8: 11 09 sbc r17, r1 2deaa: 78 f0 brcs .+30 ; 0x2deca accelerate_1_step(axes, acc, delay_us, min_delay_us); 2deac: 28 ec ldi r18, 0xC8 ; 200 2deae: 30 e0 ldi r19, 0x00 ; 0 2deb0: ae 01 movw r20, r28 2deb2: 4f 5f subi r20, 0xFF ; 255 2deb4: 5f 4f sbci r21, 0xFF ; 255 2deb6: 68 ee ldi r22, 0xE8 ; 232 2deb8: 73 e0 ldi r23, 0x03 ; 3 2deba: 8f 2d mov r24, r15 2debc: 0e 94 a6 ea call 0x1d54c ; 0x1d54c update_position_1_step(axes, dir); 2dec0: 6e 2d mov r22, r14 2dec2: 8f 2d mov r24, r15 2dec4: 0e 94 ee eb call 0x1d7dc ; 0x1d7dc 2dec8: ee cf rjmp .-36 ; 0x2dea6 } /// \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); 2deca: 6e 2d mov r22, r14 2decc: 8f 2d mov r24, r15 2dece: 0e 94 d5 eb call 0x1d7aa ; 0x1d7aa 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); } 2ded2: 0f 90 pop r0 2ded4: 0f 90 pop r0 2ded6: df 91 pop r29 2ded8: cf 91 pop r28 2deda: 1f 91 pop r17 2dedc: 0f 91 pop r16 2dede: ff 90 pop r15 2dee0: ef 90 pop r14 2dee2: 08 95 ret 0002dee4 : /// 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) 2dee4: 2f 92 push r2 2dee6: 3f 92 push r3 2dee8: 4f 92 push r4 2deea: 5f 92 push r5 2deec: 6f 92 push r6 2deee: 7f 92 push r7 2def0: 8f 92 push r8 2def2: 9f 92 push r9 2def4: af 92 push r10 2def6: bf 92 push r11 2def8: cf 92 push r12 2defa: df 92 push r13 2defc: ef 92 push r14 2defe: ff 92 push r15 2df00: 0f 93 push r16 2df02: 1f 93 push r17 2df04: cf 93 push r28 2df06: df 93 push r29 2df08: cd b7 in r28, 0x3d ; 61 2df0a: de b7 in r29, 0x3e ; 62 2df0c: 6c 97 sbiw r28, 0x1c ; 28 2df0e: 0f b6 in r0, 0x3f ; 63 2df10: f8 94 cli 2df12: de bf out 0x3e, r29 ; 62 2df14: 0f be out 0x3f, r0 ; 63 2df16: cd bf out 0x3d, r28 ; 61 2df18: 6c 01 movw r12, r24 2df1a: 5b 01 movw r10, r22 2df1c: 4a 01 movw r8, r20 2df1e: 19 01 movw r2, r18 2df20: 18 87 std Y+8, r17 ; 0x08 2df22: 0f 83 std Y+7, r16 ; 0x07 2df24: fa 82 std Y+2, r15 ; 0x02 2df26: 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; 2df28: d7 01 movw r26, r14 2df2a: 8d 91 ld r24, X+ 2df2c: 9c 91 ld r25, X 2df2e: 60 ed ldi r22, 0xD0 ; 208 2df30: 72 e0 ldi r23, 0x02 ; 2 2df32: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2df36: 9c 8f std Y+28, r25 ; 0x1c 2df38: 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); 2df3a: 9f 93 push r25 2df3c: 8f 93 push r24 2df3e: 3f 92 push r3 2df40: 2f 93 push r18 2df42: 1f 92 push r1 2df44: 84 e6 ldi r24, 0x64 ; 100 2df46: 8f 93 push r24 2df48: 9f 92 push r9 2df4a: 8f 92 push r8 2df4c: bf 92 push r11 2df4e: af 92 push r10 2df50: df 92 push r13 2df52: cf 92 push r12 2df54: 82 e8 ldi r24, 0x82 ; 130 2df56: 95 ea ldi r25, 0xA5 ; 165 2df58: 9f 93 push r25 2df5a: 8f 93 push r24 2df5c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2df60: 0f b6 in r0, 0x3f ; 63 2df62: f8 94 cli 2df64: de bf out 0x3e, r29 ; 62 2df66: 0f be out 0x3f, r0 ; 63 2df68: 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; 2df6a: 22 27 eor r18, r18 2df6c: 33 27 eor r19, r19 2df6e: 22 19 sub r18, r2 2df70: 33 09 sbc r19, r3 2df72: 3a 8f std Y+26, r19 ; 0x1a 2df74: 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)); 2df76: c4 01 movw r24, r8 2df78: 99 0c add r9, r9 2df7a: aa 0b sbc r26, r26 2df7c: bb 0b sbc r27, r27 2df7e: 89 87 std Y+9, r24 ; 0x09 2df80: 9a 87 std Y+10, r25 ; 0x0a 2df82: ab 87 std Y+11, r26 ; 0x0b 2df84: 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)); 2df86: 95 01 movw r18, r10 2df88: bb 0c add r11, r11 2df8a: 44 0b sbc r20, r20 2df8c: 55 0b sbc r21, r21 2df8e: 29 8b std Y+17, r18 ; 0x11 2df90: 3a 8b std Y+18, r19 ; 0x12 2df92: 4b 8b std Y+19, r20 ; 0x13 2df94: 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)); 2df96: c6 01 movw r24, r12 2df98: dd 0c add r13, r13 2df9a: aa 0b sbc r26, r26 2df9c: bb 0b sbc r27, r27 2df9e: 8d 8b std Y+21, r24 ; 0x15 2dfa0: 9e 8b std Y+22, r25 ; 0x16 2dfa2: af 8b std Y+23, r26 ; 0x17 2dfa4: b8 8f std Y+24, r27 ; 0x18 // snprintf(text, 10, "%4d", z0); // lcd_print(text); for (; ad < 720; ad++) { if (radius > 0) 2dfa6: 12 14 cp r1, r2 2dfa8: 13 04 cpc r1, r3 2dfaa: 0c f0 brlt .+2 ; 0x2dfae 2dfac: ba c0 rjmp .+372 ; 0x2e122 { dad = dad_max - (ad / k); 2dfae: 8b 8d ldd r24, Y+27 ; 0x1b 2dfb0: 9c 8d ldd r25, Y+28 ; 0x1c 2dfb2: 6c e3 ldi r22, 0x3C ; 60 2dfb4: 70 e0 ldi r23, 0x00 ; 0 2dfb6: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2dfba: 10 e1 ldi r17, 0x10 ; 16 2dfbc: 16 1b sub r17, r22 r = (float)(((uint32_t)ad) * radius) / 720; 2dfbe: 2b 8d ldd r18, Y+27 ; 0x1b 2dfc0: 3c 8d ldd r19, Y+28 ; 0x1c 2dfc2: d1 01 movw r26, r2 } else { dad = dad_max - ((719 - ad) / k); r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; 2dfc4: 0f 94 30 dd call 0x3ba60 ; 0x3ba60 <__usmulhisi3> 2dfc8: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2dfcc: 20 e0 ldi r18, 0x00 ; 0 2dfce: 30 e0 ldi r19, 0x00 ; 0 2dfd0: 44 e3 ldi r20, 0x34 ; 52 2dfd2: 54 e4 ldi r21, 0x44 ; 68 2dfd4: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2dfd8: 6b 01 movw r12, r22 2dfda: 7c 01 movw r14, r24 } ar = radians(ad + rotation); 2dfdc: 6f 81 ldd r22, Y+7 ; 0x07 2dfde: 78 85 ldd r23, Y+8 ; 0x08 2dfe0: eb 8d ldd r30, Y+27 ; 0x1b 2dfe2: fc 8d ldd r31, Y+28 ; 0x1c 2dfe4: 6e 0f add r22, r30 2dfe6: 7f 1f adc r23, r31 2dfe8: 90 e0 ldi r25, 0x00 ; 0 2dfea: 80 e0 ldi r24, 0x00 ; 0 2dfec: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 2dff0: 25 e3 ldi r18, 0x35 ; 53 2dff2: 3a ef ldi r19, 0xFA ; 250 2dff4: 4e e8 ldi r20, 0x8E ; 142 2dff6: 5c e3 ldi r21, 0x3C ; 60 2dff8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2dffc: 4b 01 movw r8, r22 2dffe: 5c 01 movw r10, r24 int x = (int)(cx + (cos(ar) * r)); 2e000: 0f 94 32 de call 0x3bc64 ; 0x3bc64 2e004: 6b 83 std Y+3, r22 ; 0x03 2e006: 7c 83 std Y+4, r23 ; 0x04 2e008: 8d 83 std Y+5, r24 ; 0x05 2e00a: 9e 83 std Y+6, r25 ; 0x06 int y = (int)(cy + (sin(ar) * r)); 2e00c: c5 01 movw r24, r10 2e00e: b4 01 movw r22, r8 2e010: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 2e014: 2b 01 movw r4, r22 2e016: 3c 01 movw r6, r24 int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720)); 2e018: 69 85 ldd r22, Y+9 ; 0x09 2e01a: 7a 85 ldd r23, Y+10 ; 0x0a 2e01c: 8b 85 ldd r24, Y+11 ; 0x0b 2e01e: 9c 85 ldd r25, Y+12 ; 0x0c 2e020: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2e024: 4b 01 movw r8, r22 2e026: 5c 01 movw r10, r24 2e028: 2b 8d ldd r18, Y+27 ; 0x1b 2e02a: 3c 8d ldd r19, Y+28 ; 0x1c 2e02c: a4 e6 ldi r26, 0x64 ; 100 2e02e: b0 e0 ldi r27, 0x00 ; 0 2e030: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 2e034: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2e038: 20 e0 ldi r18, 0x00 ; 0 2e03a: 30 e0 ldi r19, 0x00 ; 0 2e03c: 44 e3 ldi r20, 0x34 ; 52 2e03e: 54 e4 ldi r21, 0x44 ; 68 2e040: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 2e044: 9b 01 movw r18, r22 2e046: ac 01 movw r20, r24 2e048: c5 01 movw r24, r10 2e04a: b4 01 movw r22, r8 2e04c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 2e050: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2e054: 6d 87 std Y+13, r22 ; 0x0d 2e056: 7e 87 std Y+14, r23 ; 0x0e 2e058: 8f 87 std Y+15, r24 ; 0x0f 2e05a: 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)); 2e05c: 69 89 ldd r22, Y+17 ; 0x11 2e05e: 7a 89 ldd r23, Y+18 ; 0x12 2e060: 8b 89 ldd r24, Y+19 ; 0x13 2e062: 9c 89 ldd r25, Y+20 ; 0x14 2e064: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2e068: 4b 01 movw r8, r22 2e06a: 5c 01 movw r10, r24 2e06c: a3 01 movw r20, r6 2e06e: 92 01 movw r18, r4 2e070: c7 01 movw r24, r14 2e072: b6 01 movw r22, r12 2e074: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2e078: 9b 01 movw r18, r22 2e07a: ac 01 movw r20, r24 2e07c: c5 01 movw r24, r10 2e07e: b4 01 movw r22, r8 2e080: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2e084: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2e088: 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)); 2e08a: 6d 89 ldd r22, Y+21 ; 0x15 2e08c: 7e 89 ldd r23, Y+22 ; 0x16 2e08e: 8f 89 ldd r24, Y+23 ; 0x17 2e090: 98 8d ldd r25, Y+24 ; 0x18 2e092: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 2e096: 2b 01 movw r4, r22 2e098: 3c 01 movw r6, r24 2e09a: a7 01 movw r20, r14 2e09c: 96 01 movw r18, r12 2e09e: 6b 81 ldd r22, Y+3 ; 0x03 2e0a0: 7c 81 ldd r23, Y+4 ; 0x04 2e0a2: 8d 81 ldd r24, Y+5 ; 0x05 2e0a4: 9e 81 ldd r25, Y+6 ; 0x06 2e0a6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2e0aa: 9b 01 movw r18, r22 2e0ac: ac 01 movw r20, r24 2e0ae: c3 01 movw r24, r6 2e0b0: b2 01 movw r22, r4 2e0b2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 2e0b6: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2e0ba: 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)) 2e0bc: 01 e0 ldi r16, 0x01 ; 1 2e0be: 20 e4 ldi r18, 0x40 ; 64 2e0c0: 31 e0 ldi r19, 0x01 ; 1 2e0c2: 4d 85 ldd r20, Y+13 ; 0x0d 2e0c4: 5e 85 ldd r21, Y+14 ; 0x0e 2e0c6: b4 01 movw r22, r8 2e0c8: 0e 94 2e ec call 0x1d85c ; 0x1d85c 2e0cc: 21 2f mov r18, r17 2e0ce: 30 e0 ldi r19, 0x00 ; 0 2e0d0: 88 23 and r24, r24 2e0d2: b9 f1 breq .+110 ; 0x2e142 2e0d4: 4b 8d ldd r20, Y+27 ; 0x1b 2e0d6: 5c 8d ldd r21, Y+28 ; 0x1c 2e0d8: 42 0f add r20, r18 2e0da: 53 1f adc r21, r19 { ad += dad + 1; 2e0dc: 4f 5f subi r20, 0xFF ; 255 2e0de: 5f 4f sbci r21, 0xFF ; 255 2e0e0: 5c 8f std Y+28, r21 ; 0x1c 2e0e2: 4b 8f std Y+27, r20 ; 0x1b ret = true; break; } ad += dad; } if (pad) *pad = ad; 2e0e4: eb 8d ldd r30, Y+27 ; 0x1b 2e0e6: fc 8d ldd r31, Y+28 ; 0x1c 2e0e8: a9 81 ldd r26, Y+1 ; 0x01 2e0ea: ba 81 ldd r27, Y+2 ; 0x02 2e0ec: ed 93 st X+, r30 2e0ee: fc 93 st X, r31 // if(ret){ // lcd_set_cursor(0, 4); // lcd_print(" "); // } return ret; } 2e0f0: 6c 96 adiw r28, 0x1c ; 28 2e0f2: 0f b6 in r0, 0x3f ; 63 2e0f4: f8 94 cli 2e0f6: de bf out 0x3e, r29 ; 62 2e0f8: 0f be out 0x3f, r0 ; 63 2e0fa: cd bf out 0x3d, r28 ; 61 2e0fc: df 91 pop r29 2e0fe: cf 91 pop r28 2e100: 1f 91 pop r17 2e102: 0f 91 pop r16 2e104: ff 90 pop r15 2e106: ef 90 pop r14 2e108: df 90 pop r13 2e10a: cf 90 pop r12 2e10c: bf 90 pop r11 2e10e: af 90 pop r10 2e110: 9f 90 pop r9 2e112: 8f 90 pop r8 2e114: 7f 90 pop r7 2e116: 6f 90 pop r6 2e118: 5f 90 pop r5 2e11a: 4f 90 pop r4 2e11c: 3f 90 pop r3 2e11e: 2f 90 pop r2 2e120: 08 95 ret dad = dad_max - (ad / k); r = (float)(((uint32_t)ad) * radius) / 720; } else { dad = dad_max - ((719 - ad) / k); 2e122: 2f ec ldi r18, 0xCF ; 207 2e124: 32 e0 ldi r19, 0x02 ; 2 2e126: ab 8d ldd r26, Y+27 ; 0x1b 2e128: bc 8d ldd r27, Y+28 ; 0x1c 2e12a: 2a 1b sub r18, r26 2e12c: 3b 0b sbc r19, r27 2e12e: c9 01 movw r24, r18 2e130: 6c e3 ldi r22, 0x3C ; 60 2e132: 70 e0 ldi r23, 0x00 ; 0 2e134: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 2e138: 10 e1 ldi r17, 0x10 ; 16 2e13a: 16 1b sub r17, r22 r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720; 2e13c: a9 8d ldd r26, Y+25 ; 0x19 2e13e: ba 8d ldd r27, Y+26 ; 0x1a 2e140: 41 cf rjmp .-382 ; 0x2dfc4 // lcd_set_cursor(0, 4); // char text[10]; // snprintf(text, 10, "%4d", z0); // lcd_print(text); for (; ad < 720; ad++) 2e142: 2f 5f subi r18, 0xFF ; 255 2e144: 3f 4f sbci r19, 0xFF ; 255 2e146: ab 8d ldd r26, Y+27 ; 0x1b 2e148: bc 8d ldd r27, Y+28 ; 0x1c 2e14a: a2 0f add r26, r18 2e14c: b3 1f adc r27, r19 2e14e: bc 8f std Y+28, r27 ; 0x1c 2e150: ab 8f std Y+27, r26 ; 0x1b 2e152: a0 3d cpi r26, 0xD0 ; 208 2e154: b2 40 sbci r27, 0x02 ; 2 2e156: 08 f4 brcc .+2 ; 0x2e15a 2e158: 26 cf rjmp .-436 ; 0x2dfa6 2e15a: c4 cf rjmp .-120 ; 0x2e0e4 0002e15c : 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){ 2e15c: 2f 92 push r2 2e15e: 3f 92 push r3 2e160: 4f 92 push r4 2e162: 5f 92 push r5 2e164: 6f 92 push r6 2e166: 7f 92 push r7 2e168: 8f 92 push r8 2e16a: 9f 92 push r9 2e16c: af 92 push r10 2e16e: bf 92 push r11 2e170: cf 92 push r12 2e172: df 92 push r13 2e174: ef 92 push r14 2e176: ff 92 push r15 2e178: 0f 93 push r16 2e17a: 1f 93 push r17 2e17c: cf 93 push r28 2e17e: df 93 push r29 2e180: cd b7 in r28, 0x3d ; 61 2e182: de b7 in r29, 0x3e ; 62 2e184: ca 55 subi r28, 0x5A ; 90 2e186: d1 09 sbc r29, r1 2e188: 0f b6 in r0, 0x3f ; 63 2e18a: f8 94 cli 2e18c: de bf out 0x3e, r29 ; 62 2e18e: 0f be out 0x3f, r0 ; 63 2e190: cd bf out 0x3d, r28 ; 61 2e192: 63 96 adiw r28, 0x13 ; 19 2e194: 9f af std Y+63, r25 ; 0x3f 2e196: 8e af std Y+62, r24 ; 0x3e 2e198: 63 97 sbiw r28, 0x13 ; 19 2e19a: 8b 01 movw r16, r22 2e19c: 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 2e19e: 7e 01 movw r14, r28 2e1a0: 25 e4 ldi r18, 0x45 ; 69 2e1a2: e2 0e add r14, r18 2e1a4: f1 1c adc r15, r1 2e1a6: 80 e1 ldi r24, 0x10 ; 16 2e1a8: 97 e2 ldi r25, 0x27 ; 39 2e1aa: f7 01 movw r30, r14 2e1ac: 91 83 std Z+1, r25 ; 0x01 2e1ae: 80 83 st Z, r24 int16_t start_z; uint16_t steps_to_go; DBG(_n("Scan countdown: ")); 2e1b0: 8f ec ldi r24, 0xCF ; 207 2e1b2: 95 ea ldi r25, 0xA5 ; 165 2e1b4: 9f 93 push r25 2e1b6: 8f 93 push r24 2e1b8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2e1bc: 24 ec ldi r18, 0xC4 ; 196 2e1be: 36 e0 ldi r19, 0x06 ; 6 2e1c0: 61 96 adiw r28, 0x11 ; 17 2e1c2: 3f af std Y+63, r19 ; 0x3f 2e1c4: 2e af std Y+62, r18 ; 0x3e 2e1c6: 61 97 sbiw r28, 0x11 ; 17 2e1c8: c8 01 movw r24, r16 2e1ca: 80 5e subi r24, 0xE0 ; 224 2e1cc: 93 40 sbci r25, 0x03 ; 3 2e1ce: 2b 96 adiw r28, 0x0b ; 11 2e1d0: 9f af std Y+63, r25 ; 0x3f 2e1d2: 8e af std Y+62, r24 ; 0x3e 2e1d4: 2b 97 sbiw r28, 0x0b ; 11 2e1d6: 0f 90 pop r0 2e1d8: 0f 90 pop r0 2e1da: e0 e4 ldi r30, 0x40 ; 64 2e1dc: f0 e0 ldi r31, 0x00 ; 0 2e1de: 29 96 adiw r28, 0x09 ; 9 2e1e0: ff af std Y+63, r31 ; 0x3f 2e1e2: ee af std Y+62, r30 ; 0x3e 2e1e4: 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); 2e1e6: 63 96 adiw r28, 0x13 ; 19 2e1e8: 2e ad ldd r18, Y+62 ; 0x3e 2e1ea: 3f ad ldd r19, Y+63 ; 0x3f 2e1ec: 63 97 sbiw r28, 0x13 ; 19 2e1ee: 20 5e subi r18, 0xE0 ; 224 2e1f0: 33 40 sbci r19, 0x03 ; 3 2e1f2: 69 96 adiw r28, 0x19 ; 25 2e1f4: 3f af std Y+63, r19 ; 0x3f 2e1f6: 2e af std Y+62, r18 ; 0x3e 2e1f8: 69 97 sbiw r28, 0x19 ; 25 2e1fa: 29 96 adiw r28, 0x09 ; 9 2e1fc: 4e ac ldd r4, Y+62 ; 0x3e 2e1fe: 5f ac ldd r5, Y+63 ; 0x3f 2e200: 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){ 2e202: 31 2c mov r3, r1 go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY); 2e204: 63 96 adiw r28, 0x13 ; 19 2e206: 8e ad ldd r24, Y+62 ; 0x3e 2e208: 9f ad ldd r25, Y+63 ; 0x3f 2e20a: 63 97 sbiw r28, 0x13 ; 19 2e20c: 80 52 subi r24, 0x20 ; 32 2e20e: 9c 4f sbci r25, 0xFC ; 252 2e210: 6b 96 adiw r28, 0x1b ; 27 2e212: 9f af std Y+63, r25 ; 0x3f 2e214: 8e af std Y+62, r24 ; 0x3e 2e216: 6b 97 sbiw r28, 0x1b ; 27 2e218: 60 90 ba 06 lds r6, 0x06BA ; 0x8006ba 2e21c: 70 90 bb 06 lds r7, 0x06BB ; 0x8006bb 2e220: 80 90 bc 06 lds r8, 0x06BC ; 0x8006bc 2e224: 90 90 bd 06 lds r9, 0x06BD ; 0x8006bd 2e228: 6b 96 adiw r28, 0x1b ; 27 2e22a: ae ac ldd r10, Y+62 ; 0x3e 2e22c: bf ac ldd r11, Y+63 ; 0x3f 2e22e: 6b 97 sbiw r28, 0x1b ; 27 2e230: 31 10 cpse r3, r1 2e232: 04 c0 rjmp .+8 ; 0x2e23c 2e234: 69 96 adiw r28, 0x19 ; 25 2e236: ae ac ldd r10, Y+62 ; 0x3e 2e238: bf ac ldd r11, Y+63 ; 0x3f 2e23a: 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; 2e23c: 80 91 b2 06 lds r24, 0x06B2 ; 0x8006b2 2e240: 90 91 b3 06 lds r25, 0x06B3 ; 0x8006b3 2e244: a0 91 b4 06 lds r26, 0x06B4 ; 0x8006b4 2e248: b0 91 b5 06 lds r27, 0x06B5 ; 0x8006b5 2e24c: f5 01 movw r30, r10 2e24e: e8 1b sub r30, r24 2e250: f9 0b sbc r31, r25 2e252: 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) 2e254: 71 f0 breq .+28 ; 0x2e272 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)); 2e256: af 01 movw r20, r30 2e258: f7 ff sbrs r31, 7 2e25a: 04 c0 rjmp .+8 ; 0x2e264 2e25c: 44 27 eor r20, r20 2e25e: 55 27 eor r21, r21 2e260: 4e 1b sub r20, r30 2e262: 5f 0b sbc r21, r31 2e264: 69 2f mov r22, r25 2e266: 66 1f adc r22, r22 2e268: 66 27 eor r22, r22 2e26a: 66 1f adc r22, r22 2e26c: 81 e0 ldi r24, 0x01 ; 1 2e26e: 0f 94 3d 6f call 0x2de7a ; 0x2de7a // DBG(_n("y %d -> %d, "), y, _Y); length = y - _Y; 2e272: 80 91 b6 06 lds r24, 0x06B6 ; 0x8006b6 2e276: 90 91 b7 06 lds r25, 0x06B7 ; 0x8006b7 2e27a: a0 91 b8 06 lds r26, 0x06B8 ; 0x8006b8 2e27e: b0 91 b9 06 lds r27, 0x06B9 ; 0x8006b9 2e282: 2b 96 adiw r28, 0x0b ; 11 2e284: 4e ad ldd r20, Y+62 ; 0x3e 2e286: 5f ad ldd r21, Y+63 ; 0x3f 2e288: 2b 97 sbiw r28, 0x0b ; 11 2e28a: 48 1b sub r20, r24 2e28c: 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)); 2e28e: 57 fd sbrc r21, 7 2e290: b2 c0 rjmp .+356 ; 0x2e3f6 2e292: 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) 2e294: 41 15 cp r20, r1 2e296: 51 05 cpc r21, r1 2e298: 09 f0 breq .+2 ; 0x2e29c 2e29a: ae c0 rjmp .+348 ; 0x2e3f8 // 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; 2e29c: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e2a0: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e2a4: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e2a8: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e2ac: 68 1a sub r6, r24 2e2ae: 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)); 2e2b0: 77 fc sbrc r7, 7 2e2b2: ab c0 rjmp .+342 ; 0x2e40a 2e2b4: 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) 2e2b6: 61 14 cp r6, r1 2e2b8: 71 04 cpc r7, r1 2e2ba: 09 f0 breq .+2 ; 0x2e2be 2e2bc: a7 c0 rjmp .+334 ; 0x2e40c 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); 2e2be: 40 91 ba 06 lds r20, 0x06BA ; 0x8006ba 2e2c2: 50 91 bb 06 lds r21, 0x06BB ; 0x8006bb 2e2c6: 60 91 bc 06 lds r22, 0x06BC ; 0x8006bc 2e2ca: 70 91 bd 06 lds r23, 0x06BD ; 0x8006bd 2e2ce: 00 e0 ldi r16, 0x00 ; 0 2e2d0: 28 ec ldi r18, 0xC8 ; 200 2e2d2: 30 e0 ldi r19, 0x00 ; 0 2e2d4: 2b 96 adiw r28, 0x0b ; 11 2e2d6: 6e ad ldd r22, Y+62 ; 0x3e 2e2d8: 7f ad ldd r23, Y+63 ; 0x3f 2e2da: 2b 97 sbiw r28, 0x0b ; 11 2e2dc: c5 01 movw r24, r10 2e2de: 0e 94 2e ec call 0x1d85c ; 0x1d85c sm4_set_dir(X_AXIS, d); 2e2e2: 63 2d mov r22, r3 2e2e4: 80 e0 ldi r24, 0x00 ; 0 2e2e6: 0f 94 13 53 call 0x2a626 ; 0x2a626 //@size=242 DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive 2e2ea: 5f 92 push r5 2e2ec: 4f 92 push r4 2e2ee: 8b ec ldi r24, 0xCB ; 203 2e2f0: 95 ea ldi r25, 0xA5 ; 165 2e2f2: 9f 93 push r25 2e2f4: 8f 93 push r24 2e2f6: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 lcd_set_cursor(4,3); 2e2fa: 63 e0 ldi r22, 0x03 ; 3 2e2fc: 84 e0 ldi r24, 0x04 ; 4 2e2fe: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12 2e302: 5f 92 push r5 2e304: 4f 92 push r4 2e306: 8c eb ldi r24, 0xBC ; 188 2e308: 95 ea ldi r25, 0xA5 ; 165 2e30a: 9f 93 push r25 2e30c: 8f 93 push r24 2e30e: 0e 94 51 6e call 0xdca2 ; 0xdca2 2e312: 0f b6 in r0, 0x3f ; 63 2e314: f8 94 cli 2e316: de bf out 0x3e, r29 ; 62 2e318: 0f be out 0x3f, r0 ; 63 2e31a: cd bf out 0x3d, r28 ; 61 2e31c: 21 e0 ldi r18, 0x01 ; 1 2e31e: 30 e0 ldi r19, 0x00 ; 0 2e320: 31 10 cpse r3, r1 2e322: 02 c0 rjmp .+4 ; 0x2e328 2e324: 2f ef ldi r18, 0xFF ; 255 2e326: 3f ef ldi r19, 0xFF ; 255 2e328: 40 ec ldi r20, 0xC0 ; 192 2e32a: 42 03 mulsu r20, r18 2e32c: c0 01 movw r24, r0 2e32e: 43 9f mul r20, r19 2e330: 90 0d add r25, r0 2e332: 11 24 eor r1, r1 2e334: 67 96 adiw r28, 0x17 ; 23 2e336: 9f af std Y+63, r25 ; 0x3f 2e338: 8e af std Y+62, r24 ; 0x3e 2e33a: 67 97 sbiw r28, 0x17 ; 23 2e33c: 40 ee ldi r20, 0xE0 ; 224 2e33e: 53 e0 ldi r21, 0x03 ; 3 2e340: 24 9f mul r18, r20 2e342: 40 01 movw r8, r0 2e344: 25 9f mul r18, r21 2e346: 90 0c add r9, r0 2e348: 34 9f mul r19, r20 2e34a: 90 0c add r9, r0 2e34c: 11 24 eor r1, r1 2e34e: 63 96 adiw r28, 0x13 ; 19 2e350: ee ad ldd r30, Y+62 ; 0x3e 2e352: ff ad ldd r31, Y+63 ; 0x3f 2e354: 63 97 sbiw r28, 0x13 ; 19 2e356: 8e 0e add r8, r30 2e358: 9f 1e adc r9, r31 2e35a: 9e 01 movw r18, r28 2e35c: 2f 5f subi r18, 0xFF ; 255 2e35e: 3f 4f sbci r19, 0xFF ; 255 2e360: 2d 96 adiw r28, 0x0d ; 13 2e362: 3f af std Y+63, r19 ; 0x3f 2e364: 2e af std Y+62, r18 ; 0x3e 2e366: 2d 97 sbiw r28, 0x0d ; 13 2e368: 61 96 adiw r28, 0x11 ; 17 2e36a: 8e ad ldd r24, Y+62 ; 0x3e 2e36c: 9f ad ldd r25, Y+63 ; 0x3f 2e36e: 61 97 sbiw r28, 0x11 ; 17 2e370: 2f 96 adiw r28, 0x0f ; 15 2e372: 9f af std Y+63, r25 ; 0x3f 2e374: 8e af std Y+62, r24 ; 0x3e 2e376: 2f 97 sbiw r28, 0x0f ; 15 2e378: 71 2c mov r7, r1 2e37a: 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; 2e37c: e0 e1 ldi r30, 0x10 ; 16 2e37e: f7 e2 ldi r31, 0x27 ; 39 2e380: 27 96 adiw r28, 0x07 ; 7 2e382: ff af std Y+63, r31 ; 0x3f 2e384: ee af std Y+62, r30 ; 0x3e 2e386: 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); 2e388: 80 91 b2 06 lds r24, 0x06B2 ; 0x8006b2 2e38c: 90 91 b3 06 lds r25, 0x06B3 ; 0x8006b3 2e390: a0 91 b4 06 lds r26, 0x06B4 ; 0x8006b4 2e394: b0 91 b5 06 lds r27, 0x06B5 ; 0x8006b5 2e398: 84 01 movw r16, r8 2e39a: 08 1b sub r16, r24 2e39c: 19 0b sbc r17, r25 2e39e: 17 ff sbrs r17, 7 2e3a0: 03 c0 rjmp .+6 ; 0x2e3a8 2e3a2: 11 95 neg r17 2e3a4: 01 95 neg r16 2e3a6: 11 09 sbc r17, r1 const int16_t half_x = length_x / 2; 2e3a8: 98 01 movw r18, r16 2e3aa: 35 95 asr r19 2e3ac: 27 95 ror r18 2e3ae: 65 96 adiw r28, 0x15 ; 21 2e3b0: 3f af std Y+63, r19 ; 0x3f 2e3b2: 2e af std Y+62, r18 ; 0x3e 2e3b4: 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; 2e3b6: 1c 9b sbis 0x03, 4 ; 3 2e3b8: 33 c0 rjmp .+102 ; 0x2e420 2e3ba: 45 e0 ldi r20, 0x05 ; 5 2e3bc: 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); 2e3be: 65 96 adiw r28, 0x15 ; 21 2e3c0: ae ac ldd r10, Y+62 ; 0x3e 2e3c2: bf ac ldd r11, Y+63 ; 0x3f 2e3c4: 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); 2e3c6: 63 2d mov r22, r3 2e3c8: 82 2d mov r24, r2 2e3ca: 0e 94 d5 eb call 0x1d7aa ; 0x1d7aa while (steps--){ 2e3ce: 31 e0 ldi r19, 0x01 ; 1 2e3d0: a3 1a sub r10, r19 2e3d2: b1 08 sbc r11, r1 2e3d4: 40 f1 brcs .+80 ; 0x2e426 accelerate_1_step(axes, acc, delay_us, min_delay_us); 2e3d6: 28 ec ldi r18, 0xC8 ; 200 2e3d8: 30 e0 ldi r19, 0x00 ; 0 2e3da: a7 01 movw r20, r14 2e3dc: 68 ee ldi r22, 0xE8 ; 232 2e3de: 73 e0 ldi r23, 0x03 ; 3 2e3e0: 82 2d mov r24, r2 2e3e2: 0e 94 a6 ea call 0x1d54c ; 0x1d54c update_position_1_step(axes, dir); 2e3e6: 63 2d mov r22, r3 2e3e8: 82 2d mov r24, r2 2e3ea: 0e 94 ee eb call 0x1d7dc ; 0x1d7dc 2e3ee: ef cf rjmp .-34 ; 0x2e3ce 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){ 2e3f0: 33 24 eor r3, r3 2e3f2: 33 94 inc r3 2e3f4: 11 cf rjmp .-478 ; 0x2e218 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)); 2e3f6: 62 e0 ldi r22, 0x02 ; 2 2e3f8: 57 ff sbrs r21, 7 2e3fa: 03 c0 rjmp .+6 ; 0x2e402 2e3fc: 51 95 neg r21 2e3fe: 41 95 neg r20 2e400: 51 09 sbc r21, r1 2e402: 82 e0 ldi r24, 0x02 ; 2 2e404: 0f 94 3d 6f call 0x2de7a ; 0x2de7a 2e408: 49 cf rjmp .-366 ; 0x2e29c // 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)); 2e40a: 64 e0 ldi r22, 0x04 ; 4 2e40c: a3 01 movw r20, r6 2e40e: 77 fe sbrs r7, 7 2e410: 03 c0 rjmp .+6 ; 0x2e418 2e412: 51 95 neg r21 2e414: 41 95 neg r20 2e416: 51 09 sbc r21, r1 2e418: 84 e0 ldi r24, 0x04 ; 4 2e41a: 0f 94 3d 6f call 0x2de7a ; 0x2de7a 2e41e: 4f cf rjmp .-354 ; 0x2e2be 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; 2e420: 22 24 eor r2, r2 2e422: 23 94 inc r2 2e424: cc cf rjmp .-104 ; 0x2e3be 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); 2e426: 65 96 adiw r28, 0x15 ; 21 2e428: ee ad ldd r30, Y+62 ; 0x3e 2e42a: ff ad ldd r31, Y+63 ; 0x3f 2e42c: 65 97 sbiw r28, 0x15 ; 21 2e42e: 0e 1b sub r16, r30 2e430: 1f 0b sbc r17, r31 2e432: 23 96 adiw r28, 0x03 ; 3 2e434: 1f af std Y+63, r17 ; 0x3f 2e436: 0e af std Y+62, r16 ; 0x3e 2e438: 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); 2e43a: 63 2d mov r22, r3 2e43c: 82 2d mov r24, r2 2e43e: 0e 94 d5 eb call 0x1d7aa ; 0x1d7aa while (go_and_stop_1_step(axes, dec, delay_us, steps)){ 2e442: 9e 01 movw r18, r28 2e444: 2f 5b subi r18, 0xBF ; 191 2e446: 3f 4f sbci r19, 0xFF ; 255 2e448: a7 01 movw r20, r14 2e44a: 68 ee ldi r22, 0xE8 ; 232 2e44c: 73 e0 ldi r23, 0x03 ; 3 2e44e: 82 2d mov r24, r2 2e450: 0e 94 4c eb call 0x1d698 ; 0x1d698 2e454: 88 23 and r24, r24 2e456: 29 f0 breq .+10 ; 0x2e462 update_position_1_step(axes, dir); 2e458: 63 2d mov r22, r3 2e45a: 82 2d mov r24, r2 2e45c: 0e 94 ee eb call 0x1d7dc ; 0x1d7dc 2e460: f0 cf rjmp .-32 ; 0x2e442 z_trig = min_z; /// move up to un-trigger (surpress hysteresis) sm4_set_dir(Z_AXIS, Z_PLUS); 2e462: 60 e0 ldi r22, 0x00 ; 0 2e464: 82 e0 ldi r24, 0x02 ; 2 2e466: 0f 94 13 53 call 0x2a626 ; 0x2a626 /// speed up from stop, go half the way current_delay_us = MAX_DELAY; 2e46a: 20 e1 ldi r18, 0x10 ; 16 2e46c: 37 e2 ldi r19, 0x27 ; 39 2e46e: 27 96 adiw r28, 0x07 ; 7 2e470: 3f af std Y+63, r19 ; 0x3f 2e472: 2e af std Y+62, r18 ; 0x3e 2e474: 27 97 sbiw r28, 0x07 ; 7 for (start_z = _Z; _Z < (max_z + start_z) / 2; ++_Z_){ 2e476: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 2e47a: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 2e47e: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 2e482: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd 2e486: 00 5a subi r16, 0xA0 ; 160 2e488: 16 4f sbci r17, 0xF6 ; 246 2e48a: 17 ff sbrs r17, 7 2e48c: 02 c0 rjmp .+4 ; 0x2e492 2e48e: 0f 5f subi r16, 0xFF ; 255 2e490: 1f 4f sbci r17, 0xFF ; 255 2e492: 15 95 asr r17 2e494: 07 95 ror r16 2e496: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e49a: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e49e: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e4a2: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e4a6: 80 17 cp r24, r16 2e4a8: 91 07 cpc r25, r17 2e4aa: f4 f4 brge .+60 ; 0x2e4e8 if (!_PINDA){ 2e4ac: 1c 9b sbis 0x03, 4 ; 3 2e4ae: 1c c0 rjmp .+56 ; 0x2e4e8 break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); 2e4b0: 28 ec ldi r18, 0xC8 ; 200 2e4b2: 30 e0 ldi r19, 0x00 ; 0 2e4b4: a7 01 movw r20, r14 2e4b6: 68 ee ldi r22, 0xE8 ; 232 2e4b8: 73 e0 ldi r23, 0x03 ; 3 2e4ba: 84 e0 ldi r24, 0x04 ; 4 2e4bc: 0e 94 a6 ea call 0x1d54c ; 0x1d54c /// 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_){ 2e4c0: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e4c4: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e4c8: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e4cc: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e4d0: 01 96 adiw r24, 0x01 ; 1 2e4d2: a1 1d adc r26, r1 2e4d4: b1 1d adc r27, r1 2e4d6: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2e4da: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2e4de: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 2e4e2: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd 2e4e6: d7 cf rjmp .-82 ; 0x2e496 break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); } if (_PINDA){ 2e4e8: 1c 9b sbis 0x03, 4 ; 3 2e4ea: 3f c0 rjmp .+126 ; 0x2e56a steps_to_go = MAX(0, max_z - _Z); 2e4ec: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e4f0: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e4f4: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e4f8: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e4fc: e0 e6 ldi r30, 0x60 ; 96 2e4fe: f9 e0 ldi r31, 0x09 ; 9 2e500: e8 1b sub r30, r24 2e502: f9 0b sbc r31, r25 2e504: cf 01 movw r24, r30 2e506: f7 ff sbrs r31, 7 2e508: 02 c0 rjmp .+4 ; 0x2e50e 2e50a: 90 e0 ldi r25, 0x00 ; 0 2e50c: 80 e0 ldi r24, 0x00 ; 0 2e50e: 25 96 adiw r28, 0x05 ; 5 2e510: 9f af std Y+63, r25 ; 0x3f 2e512: 8e af std Y+62, r24 ; 0x3e 2e514: 25 97 sbiw r28, 0x05 ; 5 while (_PINDA && _Z < max_z){ 2e516: 1c 9b sbis 0x03, 4 ; 3 2e518: 28 c0 rjmp .+80 ; 0x2e56a 2e51a: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e51e: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e522: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e526: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e52a: 80 36 cpi r24, 0x60 ; 96 2e52c: 99 40 sbci r25, 0x09 ; 9 2e52e: ec f4 brge .+58 ; 0x2e56a go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go); 2e530: 9e 01 movw r18, r28 2e532: 2d 5b subi r18, 0xBD ; 189 2e534: 3f 4f sbci r19, 0xFF ; 255 2e536: a7 01 movw r20, r14 2e538: 68 ee ldi r22, 0xE8 ; 232 2e53a: 73 e0 ldi r23, 0x03 ; 3 2e53c: 84 e0 ldi r24, 0x04 ; 4 2e53e: 0e 94 4c eb call 0x1d698 ; 0x1d698 ++_Z_; 2e542: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e546: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e54a: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e54e: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e552: 01 96 adiw r24, 0x01 ; 1 2e554: a1 1d adc r26, r1 2e556: b1 1d adc r27, r1 2e558: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2e55c: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2e560: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 2e564: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd 2e568: d6 cf rjmp .-84 ; 0x2e516 /// \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); 2e56a: 60 e0 ldi r22, 0x00 ; 0 2e56c: 84 e0 ldi r24, 0x04 ; 4 2e56e: 0e 94 d5 eb call 0x1d7aa ; 0x1d7aa while (delay_us < MAX_DELAY){ 2e572: f7 01 movw r30, r14 2e574: 20 81 ld r18, Z 2e576: 31 81 ldd r19, Z+1 ; 0x01 2e578: 20 31 cpi r18, 0x10 ; 16 2e57a: f7 e2 ldi r31, 0x27 ; 39 2e57c: 3f 07 cpc r19, r31 2e57e: 58 f4 brcc .+22 ; 0x2e596 accelerate_1_step(axes, -dec, delay_us, delay_us); 2e580: a7 01 movw r20, r14 2e582: 68 e1 ldi r22, 0x18 ; 24 2e584: 7c ef ldi r23, 0xFC ; 252 2e586: 84 e0 ldi r24, 0x04 ; 4 2e588: 0e 94 a6 ea call 0x1d54c ; 0x1d54c update_position_1_step(axes, dir); 2e58c: 60 e0 ldi r22, 0x00 ; 0 2e58e: 84 e0 ldi r24, 0x04 ; 4 2e590: 0e 94 ee eb call 0x1d7dc ; 0x1d7dc 2e594: ee cf rjmp .-36 ; 0x2e572 } } stop_smoothly(Z_AXIS_MASK, Z_PLUS_MASK, Z_ACCEL, current_delay_us); /// move down to trigger sm4_set_dir(Z_AXIS, Z_MINUS); 2e596: 61 e0 ldi r22, 0x01 ; 1 2e598: 82 e0 ldi r24, 0x02 ; 2 2e59a: 0f 94 13 53 call 0x2a626 ; 0x2a626 /// speed up current_delay_us = MAX_DELAY; 2e59e: 20 e1 ldi r18, 0x10 ; 16 2e5a0: 37 e2 ldi r19, 0x27 ; 39 2e5a2: f7 01 movw r30, r14 2e5a4: 31 83 std Z+1, r19 ; 0x01 2e5a6: 20 83 st Z, r18 for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){ 2e5a8: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 2e5ac: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 2e5b0: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 2e5b4: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd 2e5b8: 0c 0d add r16, r12 2e5ba: 1d 1d adc r17, r13 2e5bc: 17 ff sbrs r17, 7 2e5be: 02 c0 rjmp .+4 ; 0x2e5c4 2e5c0: 0f 5f subi r16, 0xFF ; 255 2e5c2: 1f 4f sbci r17, 0xFF ; 255 2e5c4: 15 95 asr r17 2e5c6: 07 95 ror r16 2e5c8: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e5cc: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e5d0: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e5d4: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e5d8: 08 17 cp r16, r24 2e5da: 19 07 cpc r17, r25 2e5dc: 0c f0 brlt .+2 ; 0x2e5e0 2e5de: d9 c0 rjmp .+434 ; 0x2e792 if (_PINDA){ 2e5e0: 1c 9b sbis 0x03, 4 ; 3 2e5e2: bb c0 rjmp .+374 ; 0x2e75a z_trig = _Z; 2e5e4: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 2e5e8: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 2e5ec: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 2e5f0: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd break; } accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY); } /// slow down if (!_PINDA){ 2e5f4: 1c 99 sbic 0x03, 4 ; 3 2e5f6: 28 c0 rjmp .+80 ; 0x2e648 steps_to_go = MAX(0, _Z - min_z); 2e5f8: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e5fc: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e600: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e604: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e608: 8c 19 sub r24, r12 2e60a: 9d 09 sbc r25, r13 2e60c: 97 ff sbrs r25, 7 2e60e: 02 c0 rjmp .+4 ; 0x2e614 2e610: 90 e0 ldi r25, 0x00 ; 0 2e612: 80 e0 ldi r24, 0x00 ; 0 2e614: 25 96 adiw r28, 0x05 ; 5 2e616: 9f af std Y+63, r25 ; 0x3f 2e618: 8e af std Y+62, r24 ; 0x3e 2e61a: 25 97 sbiw r28, 0x05 ; 5 while (!_PINDA && _Z > min_z){ 2e61c: 1c 99 sbic 0x03, 4 ; 3 2e61e: 0c c0 rjmp .+24 ; 0x2e638 2e620: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e624: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e628: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e62c: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e630: c8 16 cp r12, r24 2e632: d9 06 cpc r13, r25 2e634: 0c f4 brge .+2 ; 0x2e638 2e636: af c0 rjmp .+350 ; 0x2e796 go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go); --_Z_; } z_trig = _Z; 2e638: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 2e63c: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 2e640: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 2e644: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd } /// slow down to stop but not lower than min_z while (_Z > min_z && current_delay_us < MAX_DELAY){ 2e648: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e64c: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e650: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e654: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e658: c8 16 cp r12, r24 2e65a: d9 06 cpc r13, r25 2e65c: 3c f4 brge .+14 ; 0x2e66c 2e65e: f7 01 movw r30, r14 2e660: 80 81 ld r24, Z 2e662: 91 81 ldd r25, Z+1 ; 0x01 2e664: 80 31 cpi r24, 0x10 ; 16 2e666: 97 42 sbci r25, 0x27 ; 39 2e668: 08 f4 brcc .+2 ; 0x2e66c 2e66a: b2 c0 rjmp .+356 ; 0x2e7d0 2e66c: 0c 19 sub r16, r12 2e66e: 1d 09 sbc r17, r13 accelerate_1_step(Z_AXIS_MASK, -Z_ACCEL, current_delay_us, Z_MIN_DELAY); --_Z_; } if (d == 0){ 2e670: 31 10 cpse r3, r1 2e672: ca c0 rjmp .+404 ; 0x2e808 line_buffer[c] = (uint16_t)(z_trig - min_z); 2e674: f3 01 movw r30, r6 2e676: ee 0f add r30, r30 2e678: ff 1f adc r31, r31 2e67a: 21 e0 ldi r18, 0x01 ; 1 2e67c: 30 e0 ldi r19, 0x00 ; 0 2e67e: 2c 0f add r18, r28 2e680: 3d 1f adc r19, r29 2e682: e2 0f add r30, r18 2e684: f3 1f adc r31, r19 2e686: 11 83 std Z+1, r17 ; 0x01 2e688: 00 83 st Z, r16 2e68a: ff ef ldi r31, 0xFF ; 255 2e68c: 6f 1a sub r6, r31 2e68e: 7f 0a sbc r7, r31 2e690: 67 96 adiw r28, 0x17 ; 23 2e692: 2e ad ldd r18, Y+62 ; 0x3e 2e694: 3f ad ldd r19, Y+63 ; 0x3f 2e696: 67 97 sbiw r28, 0x17 ; 23 2e698: 82 0e add r8, r18 2e69a: 93 1e adc r9, r19 2e69c: 2d 96 adiw r28, 0x0d ; 13 2e69e: 8e ad ldd r24, Y+62 ; 0x3e 2e6a0: 9f ad ldd r25, Y+63 ; 0x3f 2e6a2: 2d 97 sbiw r28, 0x0d ; 13 2e6a4: 02 97 sbiw r24, 0x02 ; 2 2e6a6: 2d 96 adiw r28, 0x0d ; 13 2e6a8: 9f af std Y+63, r25 ; 0x3f 2e6aa: 8e af std Y+62, r24 ; 0x3e 2e6ac: 2d 97 sbiw r28, 0x0d ; 13 2e6ae: 2f 96 adiw r28, 0x0f ; 15 2e6b0: ee ad ldd r30, Y+62 ; 0x3e 2e6b2: ff ad ldd r31, Y+63 ; 0x3f 2e6b4: 2f 97 sbiw r28, 0x0f ; 15 2e6b6: 31 97 sbiw r30, 0x01 ; 1 2e6b8: 2f 96 adiw r28, 0x0f ; 15 2e6ba: ff af std Y+63, r31 ; 0x3f 2e6bc: ee af std Y+62, r30 ; 0x3e 2e6be: 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 2e6c0: f0 e2 ldi r31, 0x20 ; 32 2e6c2: 6f 16 cp r6, r31 2e6c4: 71 04 cpc r7, r1 2e6c6: 09 f0 breq .+2 ; 0x2e6ca 2e6c8: 59 ce rjmp .-846 ; 0x2e37c 2e6ca: 21 e0 ldi r18, 0x01 ; 1 2e6cc: 42 1a sub r4, r18 2e6ce: 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){ 2e6d0: 31 e0 ldi r19, 0x01 ; 1 2e6d2: 33 12 cpse r3, r19 2e6d4: 8d ce rjmp .-742 ; 0x2e3f0 2e6d6: 61 96 adiw r28, 0x11 ; 17 2e6d8: 8e ad ldd r24, Y+62 ; 0x3e 2e6da: 9f ad ldd r25, Y+63 ; 0x3f 2e6dc: 61 97 sbiw r28, 0x11 ; 17 2e6de: 80 96 adiw r24, 0x20 ; 32 2e6e0: 61 96 adiw r28, 0x11 ; 17 2e6e2: 9f af std Y+63, r25 ; 0x3f 2e6e4: 8e af std Y+62, r24 ; 0x3e 2e6e6: 61 97 sbiw r28, 0x11 ; 17 2e6e8: 2b 96 adiw r28, 0x0b ; 11 2e6ea: ee ad ldd r30, Y+62 ; 0x3e 2e6ec: ff ad ldd r31, Y+63 ; 0x3f 2e6ee: 2b 97 sbiw r28, 0x0b ; 11 2e6f0: e0 5c subi r30, 0xC0 ; 192 2e6f2: ff 4f sbci r31, 0xFF ; 255 2e6f4: 2b 96 adiw r28, 0x0b ; 11 2e6f6: ff af std Y+63, r31 ; 0x3f 2e6f8: ee af std Y+62, r30 ; 0x3e 2e6fa: 2b 97 sbiw r28, 0x0b ; 11 2e6fc: 29 96 adiw r28, 0x09 ; 9 2e6fe: 2e ad ldd r18, Y+62 ; 0x3e 2e700: 3f ad ldd r19, Y+63 ; 0x3f 2e702: 29 97 sbiw r28, 0x09 ; 9 2e704: 22 50 subi r18, 0x02 ; 2 2e706: 31 09 sbc r19, r1 2e708: 29 96 adiw r28, 0x09 ; 9 2e70a: 3f af std Y+63, r19 ; 0x3f 2e70c: 2e af std Y+62, r18 ; 0x3e 2e70e: 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 2e710: 23 2b or r18, r19 2e712: 09 f0 breq .+2 ; 0x2e716 2e714: 72 cd rjmp .-1308 ; 0x2e1fa 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); 2e716: 8a eb ldi r24, 0xBA ; 186 2e718: 95 ea ldi r25, 0xA5 ; 165 2e71a: 9f 93 push r25 2e71c: 8f 93 push r24 2e71e: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2e722: 0f 90 pop r0 2e724: 0f 90 pop r0 } 2e726: c6 5a subi r28, 0xA6 ; 166 2e728: df 4f sbci r29, 0xFF ; 255 2e72a: 0f b6 in r0, 0x3f ; 63 2e72c: f8 94 cli 2e72e: de bf out 0x3e, r29 ; 62 2e730: 0f be out 0x3f, r0 ; 63 2e732: cd bf out 0x3d, r28 ; 61 2e734: df 91 pop r29 2e736: cf 91 pop r28 2e738: 1f 91 pop r17 2e73a: 0f 91 pop r16 2e73c: ff 90 pop r15 2e73e: ef 90 pop r14 2e740: df 90 pop r13 2e742: cf 90 pop r12 2e744: bf 90 pop r11 2e746: af 90 pop r10 2e748: 9f 90 pop r9 2e74a: 8f 90 pop r8 2e74c: 7f 90 pop r7 2e74e: 6f 90 pop r6 2e750: 5f 90 pop r5 2e752: 4f 90 pop r4 2e754: 3f 90 pop r3 2e756: 2f 90 pop r2 2e758: 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); 2e75a: 28 ec ldi r18, 0xC8 ; 200 2e75c: 30 e0 ldi r19, 0x00 ; 0 2e75e: a7 01 movw r20, r14 2e760: 68 ee ldi r22, 0xE8 ; 232 2e762: 73 e0 ldi r23, 0x03 ; 3 2e764: 84 e0 ldi r24, 0x04 ; 4 2e766: 0e 94 a6 ea call 0x1d54c ; 0x1d54c /// 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_){ 2e76a: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e76e: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e772: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e776: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e77a: 01 97 sbiw r24, 0x01 ; 1 2e77c: a1 09 sbc r26, r1 2e77e: b1 09 sbc r27, r1 2e780: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2e784: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2e788: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 2e78c: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd 2e790: 1b cf rjmp .-458 ; 0x2e5c8 2e792: 86 01 movw r16, r12 2e794: 2f cf rjmp .-418 ; 0x2e5f4 } /// 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); 2e796: 9e 01 movw r18, r28 2e798: 2d 5b subi r18, 0xBD ; 189 2e79a: 3f 4f sbci r19, 0xFF ; 255 2e79c: a7 01 movw r20, r14 2e79e: 68 ee ldi r22, 0xE8 ; 232 2e7a0: 73 e0 ldi r23, 0x03 ; 3 2e7a2: 84 e0 ldi r24, 0x04 ; 4 2e7a4: 0e 94 4c eb call 0x1d698 ; 0x1d698 --_Z_; 2e7a8: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e7ac: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e7b0: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e7b4: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e7b8: 01 97 sbiw r24, 0x01 ; 1 2e7ba: a1 09 sbc r26, r1 2e7bc: b1 09 sbc r27, r1 2e7be: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2e7c2: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2e7c6: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 2e7ca: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd 2e7ce: 26 cf rjmp .-436 ; 0x2e61c } 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); 2e7d0: 28 ec ldi r18, 0xC8 ; 200 2e7d2: 30 e0 ldi r19, 0x00 ; 0 2e7d4: a7 01 movw r20, r14 2e7d6: 68 e1 ldi r22, 0x18 ; 24 2e7d8: 7c ef ldi r23, 0xFC ; 252 2e7da: 84 e0 ldi r24, 0x04 ; 4 2e7dc: 0e 94 a6 ea call 0x1d54c ; 0x1d54c --_Z_; 2e7e0: 80 91 ba 06 lds r24, 0x06BA ; 0x8006ba 2e7e4: 90 91 bb 06 lds r25, 0x06BB ; 0x8006bb 2e7e8: a0 91 bc 06 lds r26, 0x06BC ; 0x8006bc 2e7ec: b0 91 bd 06 lds r27, 0x06BD ; 0x8006bd 2e7f0: 01 97 sbiw r24, 0x01 ; 1 2e7f2: a1 09 sbc r26, r1 2e7f4: b1 09 sbc r27, r1 2e7f6: 80 93 ba 06 sts 0x06BA, r24 ; 0x8006ba 2e7fa: 90 93 bb 06 sts 0x06BB, r25 ; 0x8006bb 2e7fe: a0 93 bc 06 sts 0x06BC, r26 ; 0x8006bc 2e802: b0 93 bd 06 sts 0x06BD, r27 ; 0x8006bd 2e806: 20 cf rjmp .-448 ; 0x2e648 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); 2e808: 2d 96 adiw r28, 0x0d ; 13 2e80a: ee ad ldd r30, Y+62 ; 0x3e 2e80c: ff ad ldd r31, Y+63 ; 0x3f 2e80e: 2d 97 sbiw r28, 0x0d ; 13 2e810: 86 ad ldd r24, Z+62 ; 0x3e 2e812: 97 ad ldd r25, Z+63 ; 0x3f 2e814: 01 2e mov r0, r17 2e816: 00 0c add r0, r0 2e818: 22 0b sbc r18, r18 2e81a: 33 0b sbc r19, r19 2e81c: 08 0f add r16, r24 2e81e: 19 1f adc r17, r25 2e820: 21 1d adc r18, r1 2e822: 31 1d adc r19, r1 2e824: 36 95 lsr r19 2e826: 27 95 ror r18 2e828: 17 95 ror r17 2e82a: 07 95 ror r16 2e82c: 0f 3f cpi r16, 0xFF ; 255 2e82e: 11 05 cpc r17, r1 2e830: 21 05 cpc r18, r1 2e832: 31 05 cpc r19, r1 2e834: 29 f0 breq .+10 ; 0x2e840 2e836: 20 f0 brcs .+8 ; 0x2e840 2e838: 0f ef ldi r16, 0xFF ; 255 2e83a: 10 e0 ldi r17, 0x00 ; 0 2e83c: 20 e0 ldi r18, 0x00 ; 0 2e83e: 30 e0 ldi r19, 0x00 ; 0 2e840: 2f 96 adiw r28, 0x0f ; 15 2e842: ee ad ldd r30, Y+62 ; 0x3e 2e844: ff ad ldd r31, Y+63 ; 0x3f 2e846: 2f 97 sbiw r28, 0x0f ; 15 2e848: 07 8f std Z+31, r16 ; 0x1f 2e84a: 1f cf rjmp .-450 ; 0x2e68a 0002e84c : 2e84c: ef 92 push r14 2e84e: ff 92 push r15 2e850: 0f 93 push r16 2e852: 1f 93 push r17 2e854: cf 93 push r28 2e856: df 93 push r29 2e858: cd b7 in r28, 0x3d ; 61 2e85a: de b7 in r29, 0x3e ; 62 2e85c: 2f 97 sbiw r28, 0x0f ; 15 2e85e: 0f b6 in r0, 0x3f ; 63 2e860: f8 94 cli 2e862: de bf out 0x3e, r29 ; 62 2e864: 0f be out 0x3f, r0 ; 63 2e866: cd bf out 0x3d, r28 ; 61 2e868: ef ea ldi r30, 0xAF ; 175 2e86a: f2 e1 ldi r31, 0x12 ; 18 2e86c: 10 a2 std Z+32, r1 ; 0x20 2e86e: 11 a2 std Z+33, r1 ; 0x21 2e870: 12 a2 std Z+34, r1 ; 0x22 2e872: 13 a2 std Z+35, r1 ; 0x23 2e874: 14 a2 std Z+36, r1 ; 0x24 2e876: 15 a2 std Z+37, r1 ; 0x25 2e878: 16 a2 std Z+38, r1 ; 0x26 2e87a: 17 a2 std Z+39, r1 ; 0x27 2e87c: 10 a6 std Z+40, r1 ; 0x28 2e87e: 11 a6 std Z+41, r1 ; 0x29 2e880: 10 92 48 13 sts 0x1348, r1 ; 0x801348 2e884: 0a e4 ldi r16, 0x4A ; 74 2e886: 13 e1 ldi r17, 0x13 ; 19 2e888: ee 24 eor r14, r14 2e88a: e3 94 inc r14 2e88c: f1 2c mov r15, r1 2e88e: d8 01 movw r26, r16 2e890: 11 96 adiw r26, 0x01 ; 1 2e892: fc 92 st X, r15 2e894: ee 92 st -X, r14 2e896: 12 96 adiw r26, 0x02 ; 2 2e898: 1c 92 st X, r1 2e89a: 12 97 sbiw r26, 0x02 ; 2 2e89c: 82 e8 ldi r24, 0x82 ; 130 2e89e: 13 96 adiw r26, 0x03 ; 3 2e8a0: 8c 93 st X, r24 2e8a2: 40 e0 ldi r20, 0x00 ; 0 2e8a4: 60 e0 ldi r22, 0x00 ; 0 2e8a6: 8f e4 ldi r24, 0x4F ; 79 2e8a8: 93 e1 ldi r25, 0x13 ; 19 2e8aa: 0f 94 81 c5 call 0x38b02 ; 0x38b02 2e8ae: 40 e0 ldi r20, 0x00 ; 0 2e8b0: 60 e0 ldi r22, 0x00 ; 0 2e8b2: 84 e5 ldi r24, 0x54 ; 84 2e8b4: 93 e1 ldi r25, 0x13 ; 19 2e8b6: 0f 94 81 c5 call 0x38b02 ; 0x38b02 2e8ba: f8 01 movw r30, r16 2e8bc: 17 86 std Z+15, r1 ; 0x0f 2e8be: 10 8a std Z+16, r1 ; 0x10 2e8c0: 11 8a std Z+17, r1 ; 0x11 2e8c2: 12 8a std Z+18, r1 ; 0x12 2e8c4: 13 8a std Z+19, r1 ; 0x13 2e8c6: 8a e0 ldi r24, 0x0A ; 10 2e8c8: 84 8b std Z+20, r24 ; 0x14 2e8ca: 40 e0 ldi r20, 0x00 ; 0 2e8cc: 60 e0 ldi r22, 0x00 ; 0 2e8ce: ce 01 movw r24, r28 2e8d0: 01 96 adiw r24, 0x01 ; 1 2e8d2: 0f 94 81 c5 call 0x38b02 ; 0x38b02 2e8d6: 85 e0 ldi r24, 0x05 ; 5 2e8d8: fe 01 movw r30, r28 2e8da: 31 96 adiw r30, 0x01 ; 1 2e8dc: de 01 movw r26, r28 2e8de: 16 96 adiw r26, 0x06 ; 6 2e8e0: 01 90 ld r0, Z+ 2e8e2: 0d 92 st X+, r0 2e8e4: 8a 95 dec r24 2e8e6: e1 f7 brne .-8 ; 0x2e8e0 2e8e8: 85 e0 ldi r24, 0x05 ; 5 2e8ea: fe 01 movw r30, r28 2e8ec: 36 96 adiw r30, 0x06 ; 6 2e8ee: af e5 ldi r26, 0x5F ; 95 2e8f0: b3 e1 ldi r27, 0x13 ; 19 2e8f2: 01 90 ld r0, Z+ 2e8f4: 0d 92 st X+, r0 2e8f6: 8a 95 dec r24 2e8f8: e1 f7 brne .-8 ; 0x2e8f2 2e8fa: d8 01 movw r26, r16 2e8fc: 5a 96 adiw r26, 0x1a ; 26 2e8fe: 1c 92 st X, r1 2e900: 5a 97 sbiw r26, 0x1a ; 26 2e902: 5c 96 adiw r26, 0x1c ; 28 2e904: 1c 92 st X, r1 2e906: 1e 92 st -X, r1 2e908: 5b 97 sbiw r26, 0x1b ; 27 2e90a: 8f e5 ldi r24, 0x5F ; 95 2e90c: 93 e1 ldi r25, 0x13 ; 19 2e90e: 0f 94 70 c5 call 0x38ae0 ; 0x38ae0 2e912: f8 01 movw r30, r16 2e914: 81 8f std Z+25, r24 ; 0x19 2e916: 15 8e std Z+29, r1 ; 0x1d 2e918: 16 8e std Z+30, r1 ; 0x1e 2e91a: 40 e0 ldi r20, 0x00 ; 0 2e91c: 60 e0 ldi r22, 0x00 ; 0 2e91e: 89 e6 ldi r24, 0x69 ; 105 2e920: 93 e1 ldi r25, 0x13 ; 19 2e922: 0f 94 81 c5 call 0x38b02 ; 0x38b02 2e926: d8 01 movw r26, r16 2e928: 94 96 adiw r26, 0x24 ; 36 2e92a: 1c 92 st X, r1 2e92c: 40 e0 ldi r20, 0x00 ; 0 2e92e: 60 e0 ldi r22, 0x00 ; 0 2e930: ce 01 movw r24, r28 2e932: 0b 96 adiw r24, 0x0b ; 11 2e934: 0f 94 81 c5 call 0x38b02 ; 0x38b02 2e938: 85 e0 ldi r24, 0x05 ; 5 2e93a: fe 01 movw r30, r28 2e93c: 3b 96 adiw r30, 0x0b ; 11 2e93e: de 01 movw r26, r28 2e940: 11 96 adiw r26, 0x01 ; 1 2e942: 01 90 ld r0, Z+ 2e944: 0d 92 st X+, r0 2e946: 8a 95 dec r24 2e948: e1 f7 brne .-8 ; 0x2e942 2e94a: 85 e0 ldi r24, 0x05 ; 5 2e94c: fe 01 movw r30, r28 2e94e: 31 96 adiw r30, 0x01 ; 1 2e950: af e6 ldi r26, 0x6F ; 111 2e952: b3 e1 ldi r27, 0x13 ; 19 2e954: 01 90 ld r0, Z+ 2e956: 0d 92 st X+, r0 2e958: 8a 95 dec r24 2e95a: e1 f7 brne .-8 ; 0x2e954 2e95c: f8 01 movw r30, r16 2e95e: 12 a6 std Z+42, r1 ; 0x2a 2e960: 14 a6 std Z+44, r1 ; 0x2c 2e962: 13 a6 std Z+43, r1 ; 0x2b 2e964: 8f e6 ldi r24, 0x6F ; 111 2e966: 93 e1 ldi r25, 0x13 ; 19 2e968: 0f 94 70 c5 call 0x38ae0 ; 0x38ae0 2e96c: d8 01 movw r26, r16 2e96e: 99 96 adiw r26, 0x29 ; 41 2e970: 8c 93 st X, r24 2e972: 99 97 sbiw r26, 0x29 ; 41 2e974: dd 96 adiw r26, 0x3d ; 61 2e976: 1c 92 st X, r1 2e978: dd 97 sbiw r26, 0x3d ; 61 2e97a: 89 e4 ldi r24, 0x49 ; 73 2e97c: 93 e1 ldi r25, 0x13 ; 19 2e97e: df 96 adiw r26, 0x3f ; 63 2e980: 9c 93 st X, r25 2e982: 8e 93 st -X, r24 2e984: de 97 sbiw r26, 0x3e ; 62 2e986: f0 92 8b 13 sts 0x138B, r15 ; 0x80138b 2e98a: e0 92 8a 13 sts 0x138A, r14 ; 0x80138a 2e98e: 10 92 8c 13 sts 0x138C, r1 ; 0x80138c 2e992: 1f ef ldi r17, 0xFF ; 255 2e994: 10 93 8d 13 sts 0x138D, r17 ; 0x80138d 2e998: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 2e99c: 80 93 8e 13 sts 0x138E, r24 ; 0x80138e 2e9a0: 10 92 8f 13 sts 0x138F, r1 ; 0x80138f 2e9a4: 10 92 90 13 sts 0x1390, r1 ; 0x801390 2e9a8: 10 92 91 13 sts 0x1391, r1 ; 0x801391 2e9ac: 10 92 93 13 sts 0x1393, r1 ; 0x801393 2e9b0: 10 92 92 13 sts 0x1392, r1 ; 0x801392 2e9b4: 10 92 95 13 sts 0x1395, r1 ; 0x801395 2e9b8: 10 92 94 13 sts 0x1394, r1 ; 0x801394 2e9bc: 10 92 98 13 sts 0x1398, r1 ; 0x801398 2e9c0: 10 92 99 13 sts 0x1399, r1 ; 0x801399 2e9c4: 10 92 9a 13 sts 0x139A, r1 ; 0x80139a 2e9c8: 10 92 9b 13 sts 0x139B, r1 ; 0x80139b 2e9cc: 83 e0 ldi r24, 0x03 ; 3 2e9ce: 80 93 9e 13 sts 0x139E, r24 ; 0x80139e 2e9d2: 10 92 9f 13 sts 0x139F, r1 ; 0x80139f 2e9d6: 85 e1 ldi r24, 0x15 ; 21 2e9d8: 80 93 96 13 sts 0x1396, r24 ; 0x801396 2e9dc: 84 e1 ldi r24, 0x14 ; 20 2e9de: 80 93 97 13 sts 0x1397, r24 ; 0x801397 2e9e2: 83 e6 ldi r24, 0x63 ; 99 2e9e4: 80 93 a0 13 sts 0x13A0, r24 ; 0x8013a0 2e9e8: 80 93 a1 13 sts 0x13A1, r24 ; 0x8013a1 2e9ec: 10 92 a2 13 sts 0x13A2, r1 ; 0x8013a2 2e9f0: 10 92 a3 13 sts 0x13A3, r1 ; 0x8013a3 2e9f4: 10 92 a4 13 sts 0x13A4, r1 ; 0x8013a4 2e9f8: 10 92 a5 13 sts 0x13A5, r1 ; 0x8013a5 2e9fc: 10 92 a6 13 sts 0x13A6, r1 ; 0x8013a6 2ea00: 10 92 a7 13 sts 0x13A7, r1 ; 0x8013a7 2ea04: 10 92 a8 13 sts 0x13A8, r1 ; 0x8013a8 2ea08: 10 92 a9 13 sts 0x13A9, r1 ; 0x8013a9 2ea0c: 10 92 aa 13 sts 0x13AA, r1 ; 0x8013aa 2ea10: 10 92 ab 13 sts 0x13AB, r1 ; 0x8013ab 2ea14: 10 92 ac 13 sts 0x13AC, r1 ; 0x8013ac 2ea18: 10 92 ad 13 sts 0x13AD, r1 ; 0x8013ad 2ea1c: 10 92 af 13 sts 0x13AF, r1 ; 0x8013af 2ea20: 10 92 ae 13 sts 0x13AE, r1 ; 0x8013ae 2ea24: 10 92 b0 13 sts 0x13B0, r1 ; 0x8013b0 2ea28: 8e e2 ldi r24, 0x2E ; 46 2ea2a: 90 e8 ldi r25, 0x80 ; 128 2ea2c: 90 93 b2 13 sts 0x13B2, r25 ; 0x8013b2 2ea30: 80 93 b1 13 sts 0x13B1, r24 ; 0x8013b1 2ea34: 10 93 b3 13 sts 0x13B3, r17 ; 0x8013b3 2ea38: 10 93 b4 13 sts 0x13B4, r17 ; 0x8013b4 2ea3c: 10 92 b6 13 sts 0x13B6, r1 ; 0x8013b6 2ea40: 10 92 b5 13 sts 0x13B5, r1 ; 0x8013b5 2ea44: 10 93 b7 13 sts 0x13B7, r17 ; 0x8013b7 2ea48: 82 e0 ldi r24, 0x02 ; 2 2ea4a: 80 93 b8 13 sts 0x13B8, r24 ; 0x8013b8 2ea4e: 10 92 b9 13 sts 0x13B9, r1 ; 0x8013b9 2ea52: 10 92 ba 13 sts 0x13BA, r1 ; 0x8013ba 2ea56: 10 92 bb 13 sts 0x13BB, r1 ; 0x8013bb 2ea5a: 10 92 bc 13 sts 0x13BC, r1 ; 0x8013bc 2ea5e: 10 92 be 13 sts 0x13BE, r1 ; 0x8013be 2ea62: 10 92 bd 13 sts 0x13BD, r1 ; 0x8013bd 2ea66: 10 92 c0 13 sts 0x13C0, r1 ; 0x8013c0 2ea6a: 10 92 bf 13 sts 0x13BF, r1 ; 0x8013bf 2ea6e: 0f 94 41 8c call 0x31882 ; 0x31882 2ea72: ed e8 ldi r30, 0x8D ; 141 2ea74: f4 e1 ldi r31, 0x14 ; 20 2ea76: 10 92 15 15 sts 0x1515, r1 ; 0x801515 2ea7a: 10 92 18 15 sts 0x1518, r1 ; 0x801518 2ea7e: 10 92 3a 15 sts 0x153A, r1 ; 0x80153a 2ea82: 10 92 3d 15 sts 0x153D, r1 ; 0x80153d 2ea86: 89 e1 ldi r24, 0x19 ; 25 2ea88: 80 93 fc 16 sts 0x16FC, r24 ; 0x8016fc 2ea8c: 10 92 ff 16 sts 0x16FF, r1 ; 0x8016ff 2ea90: 10 92 00 17 sts 0x1700, r1 ; 0x801700 2ea94: 10 92 18 17 sts 0x1718, r1 ; 0x801718 2ea98: 10 92 1f 17 sts 0x171F, r1 ; 0x80171f 2ea9c: 10 92 22 17 sts 0x1722, r1 ; 0x801722 2eaa0: 10 92 a0 17 sts 0x17A0, r1 ; 0x8017a0 2eaa4: 10 92 a2 17 sts 0x17A2, r1 ; 0x8017a2 2eaa8: 10 92 a1 17 sts 0x17A1, r1 ; 0x8017a1 2eaac: 10 92 31 16 sts 0x1631, r1 ; 0x801631 2eab0: 10 92 30 16 sts 0x1630, r1 ; 0x801630 2eab4: 10 92 9c 17 sts 0x179C, r1 ; 0x80179c 2eab8: 10 92 9d 17 sts 0x179D, r1 ; 0x80179d 2eabc: 10 92 9e 17 sts 0x179E, r1 ; 0x80179e 2eac0: 10 92 9f 17 sts 0x179F, r1 ; 0x80179f 2eac4: 10 92 a3 17 sts 0x17A3, r1 ; 0x8017a3 2eac8: 10 92 a4 17 sts 0x17A4, r1 ; 0x8017a4 2eacc: 10 92 a5 17 sts 0x17A5, r1 ; 0x8017a5 2ead0: 10 92 a6 17 sts 0x17A6, r1 ; 0x8017a6 2ead4: 12 82 std Z+2, r1 ; 0x02 2ead6: 13 82 std Z+3, r1 ; 0x03 2ead8: 10 82 st Z, r1 2eada: 11 82 std Z+1, r1 ; 0x01 2eadc: 10 92 2f 16 sts 0x162F, r1 ; 0x80162f 2eae0: 10 92 42 17 sts 0x1742, r1 ; 0x801742 2eae4: ed e5 ldi r30, 0x5D ; 93 2eae6: f5 e1 ldi r31, 0x15 ; 21 2eae8: 82 ed ldi r24, 0xD2 ; 210 2eaea: df 01 movw r26, r30 2eaec: 1d 92 st X+, r1 2eaee: 8a 95 dec r24 2eaf0: e9 f7 brne .-6 ; 0x2eaec 2eaf2: 10 92 de 14 sts 0x14DE, r1 ; 0x8014de 2eaf6: 10 92 dd 14 sts 0x14DD, r1 ; 0x8014dd 2eafa: 10 92 dc 14 sts 0x14DC, r1 ; 0x8014dc 2eafe: 80 ea ldi r24, 0xA0 ; 160 2eb00: 97 e1 ldi r25, 0x17 ; 23 2eb02: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> 2eb06: e6 e8 ldi r30, 0x86 ; 134 2eb08: f4 e1 ldi r31, 0x14 ; 20 2eb0a: 11 82 std Z+1, r1 ; 0x01 2eb0c: 12 82 std Z+2, r1 ; 0x02 2eb0e: 13 82 std Z+3, r1 ; 0x03 2eb10: 14 82 std Z+4, r1 ; 0x04 2eb12: 15 82 std Z+5, r1 ; 0x05 2eb14: 16 82 std Z+6, r1 ; 0x06 2eb16: 10 83 st Z, r17 2eb18: e9 ea ldi r30, 0xA9 ; 169 2eb1a: f7 e1 ldi r31, 0x17 ; 23 2eb1c: 15 82 std Z+5, r1 ; 0x05 2eb1e: 17 82 std Z+7, r1 ; 0x07 2eb20: 16 82 std Z+6, r1 ; 0x06 2eb22: 11 86 std Z+9, r1 ; 0x09 2eb24: 13 86 std Z+11, r1 ; 0x0b 2eb26: 12 86 std Z+10, r1 ; 0x0a 2eb28: 0f 94 28 2a call 0x25450 ; 0x25450 2eb2c: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf 2eb30: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 2eb34: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 2eb38: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 2eb3c: 2f 96 adiw r28, 0x0f ; 15 2eb3e: 0f b6 in r0, 0x3f ; 63 2eb40: f8 94 cli 2eb42: de bf out 0x3e, r29 ; 62 2eb44: 0f be out 0x3f, r0 ; 63 2eb46: cd bf out 0x3d, r28 ; 61 2eb48: df 91 pop r29 2eb4a: cf 91 pop r28 2eb4c: 1f 91 pop r17 2eb4e: 0f 91 pop r16 2eb50: ff 90 pop r15 2eb52: ef 90 pop r14 2eb54: 08 95 ret 0002eb56 : else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 2eb56: 42 e0 ldi r20, 0x02 ; 2 2eb58: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 } void MarlinSerial::println(double n, int digits) { print(n, digits); println(); 2eb5c: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0002eb60 : 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; 2eb60: 80 91 a0 13 lds r24, 0x13A0 ; 0x8013a0 2eb64: 83 36 cpi r24, 0x63 ; 99 2eb66: 09 f4 brne .+2 ; 0x2eb6a 2eb68: 8f ef ldi r24, 0xFF ; 255 } 2eb6a: 08 95 ret 0002eb6c : return 0; } } //------------------------------------------------------------------------------ void Sd2Card::chipSelectHigh() { WRITE(SDSS, 1); 2eb6c: 9f b7 in r25, 0x3f ; 63 2eb6e: f8 94 cli 2eb70: e5 e0 ldi r30, 0x05 ; 5 2eb72: f1 e0 ldi r31, 0x01 ; 1 2eb74: 80 81 ld r24, Z 2eb76: 80 64 ori r24, 0x40 ; 64 2eb78: 80 83 st Z, r24 2eb7a: 9f bf out 0x3f, r25 ; 63 } 2eb7c: 08 95 ret 0002eb7e : spiRate_ = sckRateID; return true; } //------------------------------------------------------------------------------ // wait for card to go not busy bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { 2eb7e: 0f 93 push r16 2eb80: 1f 93 push r17 2eb82: cf 93 push r28 2eb84: df 93 push r29 2eb86: ec 01 movw r28, r24 uint16_t t0 = _millis(); 2eb88: 0f 94 28 2a call 0x25450 ; 0x25450 2eb8c: 8b 01 movw r16, r22 while (spiRec() != 0XFF) { 2eb8e: 0f 94 41 53 call 0x2a682 ; 0x2a682 2eb92: 8f 3f cpi r24, 0xFF ; 255 2eb94: 69 f0 breq .+26 ; 0x2ebb0 if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail; 2eb96: 0f 94 28 2a call 0x25450 ; 0x25450 2eb9a: 60 1b sub r22, r16 2eb9c: 71 0b sbc r23, r17 2eb9e: 6c 17 cp r22, r28 2eba0: 7d 07 cpc r23, r29 2eba2: a8 f3 brcs .-22 ; 0x2eb8e } return true; fail: return false; 2eba4: 80 e0 ldi r24, 0x00 ; 0 } 2eba6: df 91 pop r29 2eba8: cf 91 pop r28 2ebaa: 1f 91 pop r17 2ebac: 0f 91 pop r16 2ebae: 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; 2ebb0: 81 e0 ldi r24, 0x01 ; 1 2ebb2: f9 cf rjmp .-14 ; 0x2eba6 0002ebb4 : , tmcFailures(0) { } void MMU2::Status() { // Useful information to see during bootup and change state SERIAL_ECHOPGM("MMU is "); 2ebb4: 80 e0 ldi r24, 0x00 ; 0 2ebb6: 9b ea ldi r25, 0xAB ; 171 2ebb8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_MMU_ENABLED, 0); 2ebbc: 60 e0 ldi r22, 0x00 ; 0 2ebbe: 8c ea ldi r24, 0xAC ; 172 2ebc0: 9c e0 ldi r25, 0x0C ; 12 2ebc2: 0e 94 a1 75 call 0xeb42 ; 0xeb42 if (status == 1) { 2ebc6: 81 30 cpi r24, 0x01 ; 1 2ebc8: 21 f4 brne .+8 ; 0x2ebd2 SERIAL_ECHOLNRPGM(_O(MSG_ON)); 2ebca: 83 e5 ldi r24, 0x53 ; 83 2ebcc: 9c e5 ldi r25, 0x5C ; 92 } else { SERIAL_ECHOLNRPGM(_O(MSG_OFF)); 2ebce: 0c 94 13 79 jmp 0xf226 ; 0xf226 2ebd2: 8d e4 ldi r24, 0x4D ; 77 2ebd4: 9c e5 ldi r25, 0x5C ; 92 2ebd6: fb cf rjmp .-10 ; 0x2ebce 0002ebd8 : print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 2ebd8: bc 01 movw r22, r24 2ebda: 99 0f add r25, r25 2ebdc: 88 0b sbc r24, r24 2ebde: 99 0b sbc r25, r25 2ebe0: 0f 94 5f d5 call 0x3aabe ; 0x3aabe } void MarlinSerial::println(int n, int base) { print(n, base); println(); 2ebe4: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0002ebe8 : bool cmd_buffer_empty() { return (buflen == 0); } void enquecommand_front(const char *cmd, bool from_progmem) 2ebe8: 0f 93 push r16 2ebea: 1f 93 push r17 2ebec: cf 93 push r28 2ebee: df 93 push r29 2ebf0: ec 01 movw r28, r24 2ebf2: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> 2ebf6: 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) 2ebf8: 80 36 cpi r24, 0x60 ; 96 2ebfa: 91 05 cpc r25, r1 2ebfc: 08 f0 brcs .+2 ; 0x2ec00 2ebfe: 85 c0 rjmp .+266 ; 0x2ed0a return false; // Remove the currently processed command from the queue. if (! cmdbuffer_front_already_processed) { 2ec00: 80 91 a1 10 lds r24, 0x10A1 ; 0x8010a1 2ec04: 81 11 cpse r24, r1 2ec06: 05 c0 rjmp .+10 ; 0x2ec12 cmdqueue_pop_front(); 2ec08: 0e 94 54 76 call 0xeca8 ; 0xeca8 cmdbuffer_front_already_processed = true; 2ec0c: 81 e0 ldi r24, 0x01 ; 1 2ec0e: 80 93 a1 10 sts 0x10A1, r24 ; 0x8010a1 } if (bufindr == bufindw && buflen > 0) 2ec12: 40 91 91 12 lds r20, 0x1291 ; 0x801291 2ec16: 50 91 92 12 lds r21, 0x1292 ; 0x801292 2ec1a: 80 91 9f 10 lds r24, 0x109F ; 0x80109f <_ZL7bufindw.lto_priv.552> 2ec1e: 90 91 a0 10 lds r25, 0x10A0 ; 0x8010a0 <_ZL7bufindw.lto_priv.552+0x1> 2ec22: 48 17 cp r20, r24 2ec24: 59 07 cpc r21, r25 2ec26: 41 f4 brne .+16 ; 0x2ec38 2ec28: 20 91 a2 10 lds r18, 0x10A2 ; 0x8010a2 2ec2c: 30 91 a3 10 lds r19, 0x10A3 ; 0x8010a3 2ec30: 12 16 cp r1, r18 2ec32: 13 06 cpc r1, r19 2ec34: 0c f4 brge .+2 ; 0x2ec38 2ec36: 69 c0 rjmp .+210 ; 0x2ed0a // 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; 2ec38: 20 91 9d 10 lds r18, 0x109D ; 0x80109d 2ec3c: 30 91 9e 10 lds r19, 0x109E ; 0x80109e 2ec40: 12 16 cp r1, r18 2ec42: 13 06 cpc r1, r19 2ec44: 0c f0 brlt .+2 ; 0x2ec48 2ec46: 41 c0 rjmp .+130 ; 0x2ecca 2ec48: 9c 01 movw r18, r24 2ec4a: 2f 59 subi r18, 0x9F ; 159 2ec4c: 3f 4f sbci r19, 0xFF ; 255 if (bufindw < bufindr) { 2ec4e: 84 17 cp r24, r20 2ec50: 95 07 cpc r25, r21 2ec52: e8 f5 brcc .+122 ; 0x2ecce int bufindr_new = bufindr - len_asked - (1 + CMDHDRSIZE); 2ec54: 44 50 subi r20, 0x04 ; 4 2ec56: 51 09 sbc r21, r1 2ec58: 40 1b sub r20, r16 2ec5a: 51 0b sbc r21, r17 // Simple case. There is a contiguous space between the write buffer and the read buffer. if (endw <= bufindr_new) { 2ec5c: 42 17 cp r20, r18 2ec5e: 53 07 cpc r21, r19 2ec60: 0c f4 brge .+2 ; 0x2ec64 2ec62: 53 c0 rjmp .+166 ; 0x2ed0a } } 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); 2ec64: 50 93 92 12 sts 0x1292, r21 ; 0x801292 2ec68: 40 93 91 12 sts 0x1291, r20 ; 0x801291 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; 2ec6c: 80 91 91 12 lds r24, 0x1291 ; 0x801291 2ec70: 90 91 92 12 lds r25, 0x1292 ; 0x801292 2ec74: fc 01 movw r30, r24 2ec76: ec 55 subi r30, 0x5C ; 92 2ec78: ff 4e sbci r31, 0xEF ; 239 2ec7a: 23 e0 ldi r18, 0x03 ; 3 2ec7c: 20 83 st Z, r18 if (from_progmem) strcpy_P(cmdbuffer + bufindr + CMDHDRSIZE, cmd); 2ec7e: be 01 movw r22, r28 2ec80: 89 55 subi r24, 0x59 ; 89 2ec82: 9f 4e sbci r25, 0xEF ; 239 2ec84: 0f 94 c7 d9 call 0x3b38e ; 0x3b38e else strcpy(cmdbuffer + bufindr + CMDHDRSIZE, cmd); ++ buflen; 2ec88: 80 91 a2 10 lds r24, 0x10A2 ; 0x8010a2 2ec8c: 90 91 a3 10 lds r25, 0x10A3 ; 0x8010a3 2ec90: 01 96 adiw r24, 0x01 ; 1 2ec92: 90 93 a3 10 sts 0x10A3, r25 ; 0x8010a3 2ec96: 80 93 a2 10 sts 0x10A2, r24 ; 0x8010a2 SERIAL_ECHO_START; 2ec9a: 82 ef ldi r24, 0xF2 ; 242 2ec9c: 9a ea ldi r25, 0xAA ; 170 2ec9e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(enqueingFront); 2eca2: 83 ed ldi r24, 0xD3 ; 211 2eca4: 9a ea ldi r25, 0xAA ; 170 2eca6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHO(cmdbuffer + bufindr + CMDHDRSIZE); 2ecaa: 80 91 91 12 lds r24, 0x1291 ; 0x801291 2ecae: 90 91 92 12 lds r25, 0x1292 ; 0x801292 } }*/ static FORCE_INLINE void print(const char *str) { write(str); 2ecb2: 89 55 subi r24, 0x59 ; 89 2ecb4: 9f 4e sbci r25, 0xEF ; 239 2ecb6: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHOLNPGM("\""); 2ecba: 81 ed ldi r24, 0xD1 ; 209 2ecbc: 9a ea ldi r25, 0xAA ; 170 SERIAL_ECHOLNRPGM(bufferFull); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } } 2ecbe: df 91 pop r29 2ecc0: cf 91 pop r28 2ecc2: 1f 91 pop r17 2ecc4: 0f 91 pop r16 SERIAL_ECHORPGM(enqueingFront); if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 2ecc6: 0c 94 13 79 jmp 0xf226 ; 0xf226 // 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) 2ecca: 9c 01 movw r18, r24 2eccc: c0 cf rjmp .-128 ; 0x2ec4e bufindr = bufindr_new; return true; } } else { // Otherwise the free space is split between the start and end. if (len_asked + (1 + CMDHDRSIZE) <= bufindr) { 2ecce: c8 01 movw r24, r16 2ecd0: 04 96 adiw r24, 0x04 ; 4 2ecd2: 48 17 cp r20, r24 2ecd4: 59 07 cpc r21, r25 2ecd6: 28 f0 brcs .+10 ; 0x2ece2 // Could fit at the start. bufindr -= len_asked + (1 + CMDHDRSIZE); 2ecd8: 44 50 subi r20, 0x04 ; 4 2ecda: 51 09 sbc r21, r1 2ecdc: 40 1b sub r20, r16 2ecde: 51 0b sbc r21, r17 2ece0: c1 cf rjmp .-126 ; 0x2ec64 return true; } int bufindr_new = sizeof(cmdbuffer) - len_asked - (1 + CMDHDRSIZE); 2ece2: 89 ee ldi r24, 0xE9 ; 233 2ece4: 91 e0 ldi r25, 0x01 ; 1 2ece6: bc 01 movw r22, r24 2ece8: 60 1b sub r22, r16 2ecea: 71 0b sbc r23, r17 2ecec: 8b 01 movw r16, r22 if (endw <= bufindr_new) { 2ecee: 62 17 cp r22, r18 2ecf0: 73 07 cpc r23, r19 2ecf2: 5c f0 brlt .+22 ; 0x2ed0a memset(cmdbuffer, 0, bufindr); 2ecf4: 70 e0 ldi r23, 0x00 ; 0 2ecf6: 60 e0 ldi r22, 0x00 ; 0 2ecf8: 84 ea ldi r24, 0xA4 ; 164 2ecfa: 90 e1 ldi r25, 0x10 ; 16 2ecfc: 0f 94 42 e2 call 0x3c484 ; 0x3c484 bufindr = bufindr_new; 2ed00: 10 93 92 12 sts 0x1292, r17 ; 0x801292 2ed04: 00 93 91 12 sts 0x1291, r16 ; 0x801291 2ed08: b1 cf rjmp .-158 ; 0x2ec6c SERIAL_ECHOLNPGM("\""); #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ } else { SERIAL_ERROR_START; 2ed0a: 8a ec ldi r24, 0xCA ; 202 2ed0c: 9a ea ldi r25, 0xAA ; 170 2ed0e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(enqueingFront); 2ed12: 83 ed ldi r24, 0xD3 ; 211 2ed14: 9a ea ldi r25, 0xAA ; 170 2ed16: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (from_progmem) SERIAL_PROTOCOLRPGM(cmd); 2ed1a: ce 01 movw r24, r28 2ed1c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else SERIAL_ECHO(cmd); SERIAL_ECHOLNRPGM(bufferFull); 2ed20: 83 eb ldi r24, 0xB3 ; 179 2ed22: 9a ea ldi r25, 0xAA ; 170 2ed24: cc cf rjmp .-104 ; 0x2ecbe 0002ed26 : } else { return false; } } bool SdFile::seekSetFilteredGcode(uint32_t pos){ 2ed26: ab 01 movw r20, r22 2ed28: bc 01 movw r22, r24 if(! seekSet(pos) )return false; 2ed2a: 8f e1 ldi r24, 0x1F ; 31 2ed2c: 97 e1 ldi r25, 0x17 ; 23 2ed2e: 0f 94 89 57 call 0x2af12 ; 0x2af12 2ed32: 81 11 cpse r24, r1 2ed34: 02 c0 rjmp .+4 ; 0x2ed3a 2ed36: 80 e0 ldi r24, 0x00 ; 0 2ed38: 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() ) 2ed3a: 8f e1 ldi r24, 0x1F ; 31 2ed3c: 97 e1 ldi r25, 0x17 ; 23 2ed3e: 0f 94 10 57 call 0x2ae20 ; 0x2ae20 2ed42: 88 23 and r24, r24 2ed44: c1 f3 breq .-16 ; 0x2ed36 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; 2ed46: 20 91 40 17 lds r18, 0x1740 ; 0x801740 2ed4a: 30 91 41 17 lds r19, 0x1741 ; 0x801741 2ed4e: 24 56 subi r18, 0x64 ; 100 2ed50: 31 4f sbci r19, 0xF1 ; 241 2ed52: 30 93 3b 17 sts 0x173B, r19 ; 0x80173b 2ed56: 20 93 3a 17 sts 0x173A, r18 ; 0x80173a bool SdFile::seekSetFilteredGcode(uint32_t pos){ if(! seekSet(pos) )return false; if(! gfComputeNextFileBlock() )return false; gfReset(); return true; } 2ed5a: 08 95 ret 0002ed5c : SERIAL_PROTOCOLLNPGM("An error while writing to the SD Card."); } } void CardReader::checkautostart(bool force) 2ed5c: 8f 92 push r8 2ed5e: 9f 92 push r9 2ed60: af 92 push r10 2ed62: bf 92 push r11 2ed64: cf 92 push r12 2ed66: df 92 push r13 2ed68: ef 92 push r14 2ed6a: ff 92 push r15 2ed6c: 0f 93 push r16 2ed6e: 1f 93 push r17 2ed70: cf 93 push r28 2ed72: df 93 push r29 2ed74: cd b7 in r28, 0x3d ; 61 2ed76: de b7 in r29, 0x3e ; 62 2ed78: ee 97 sbiw r28, 0x3e ; 62 2ed7a: 0f b6 in r0, 0x3f ; 63 2ed7c: f8 94 cli 2ed7e: de bf out 0x3e, r29 ; 62 2ed80: 0f be out 0x3f, r0 ; 63 2ed82: cd bf out 0x3d, r28 ; 61 if(!mounted) //fail return; } char autoname[30]; sprintf_P(autoname, PSTR("auto%i.g"), lastnr); 2ed84: 80 91 dd 14 lds r24, 0x14DD ; 0x8014dd 2ed88: 8f 93 push r24 2ed8a: 80 91 dc 14 lds r24, 0x14DC ; 0x8014dc 2ed8e: 8f 93 push r24 2ed90: 8e e6 ldi r24, 0x6E ; 110 2ed92: 9a ea ldi r25, 0xAA ; 170 2ed94: 9f 93 push r25 2ed96: 8f 93 push r24 2ed98: 8e 01 movw r16, r28 2ed9a: 0f 5d subi r16, 0xDF ; 223 2ed9c: 1f 4f sbci r17, 0xFF ; 255 2ed9e: 1f 93 push r17 2eda0: 0f 93 push r16 2eda2: 0f 94 27 db call 0x3b64e ; 0x3b64e 2eda6: 0f 90 pop r0 2eda8: 0f 90 pop r0 2edaa: 0f 90 pop r0 2edac: 0f 90 pop r0 2edae: 0f 90 pop r0 2edb0: 0f 90 pop r0 for(int8_t i=0;i<(int8_t)strlen(autoname);i++) 2edb2: f1 2c mov r15, r1 2edb4: f8 01 movw r30, r16 2edb6: 01 90 ld r0, Z+ 2edb8: 00 20 and r0, r0 2edba: e9 f7 brne .-6 ; 0x2edb6 2edbc: 31 97 sbiw r30, 0x01 ; 1 2edbe: e0 1b sub r30, r16 2edc0: f1 0b sbc r31, r17 2edc2: fe 16 cp r15, r30 2edc4: 84 f4 brge .+32 ; 0x2ede6 autoname[i]=tolower(autoname[i]); 2edc6: 68 01 movw r12, r16 2edc8: cf 0c add r12, r15 2edca: d1 1c adc r13, r1 2edcc: f7 fc sbrc r15, 7 2edce: da 94 dec r13 2edd0: f6 01 movw r30, r12 2edd2: 80 81 ld r24, Z 2edd4: 08 2e mov r0, r24 2edd6: 00 0c add r0, r0 2edd8: 99 0b sbc r25, r25 2edda: 0f 94 24 e2 call 0x3c448 ; 0x3c448 2edde: f6 01 movw r30, r12 2ede0: 80 83 st Z, r24 2ede2: f3 94 inc r15 2ede4: e7 cf rjmp .-50 ; 0x2edb4 dir_t p; root.rewind(); 2ede6: 85 e1 ldi r24, 0x15 ; 21 2ede8: 95 e1 ldi r25, 0x15 ; 21 2edea: 0e 94 c4 76 call 0xed88 ; 0xed88 bool found=false; 2edee: a1 2c mov r10, r1 2edf0: ce 01 movw r24, r28 2edf2: 01 96 adiw r24, 0x01 ; 1 2edf4: 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); 2edf6: 81 e9 ldi r24, 0x91 ; 145 2edf8: c8 2e mov r12, r24 2edfa: 80 e7 ldi r24, 0x70 ; 112 2edfc: 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; 2edfe: 80 91 18 15 lds r24, 0x1518 ; 0x801518 2ee02: 82 30 cpi r24, 0x02 ; 2 2ee04: 08 f4 brcc .+2 ; 0x2ee08 2ee06: 50 c0 rjmp .+160 ; 0x2eea8 2ee08: 80 91 1d 15 lds r24, 0x151D ; 0x80151d 2ee0c: 90 91 1e 15 lds r25, 0x151E ; 0x80151e 2ee10: a0 91 1f 15 lds r26, 0x151F ; 0x80151f 2ee14: b0 91 20 15 lds r27, 0x1520 ; 0x801520 2ee18: 8f 71 andi r24, 0x1F ; 31 2ee1a: 99 27 eor r25, r25 2ee1c: aa 27 eor r26, r26 2ee1e: bb 27 eor r27, r27 2ee20: 89 2b or r24, r25 2ee22: 8a 2b or r24, r26 2ee24: 8b 2b or r24, r27 2ee26: 09 f0 breq .+2 ; 0x2ee2a 2ee28: 3f c0 rjmp .+126 ; 0x2eea8 2ee2a: 50 e0 ldi r21, 0x00 ; 0 2ee2c: 40 e0 ldi r20, 0x00 ; 0 2ee2e: b7 01 movw r22, r14 2ee30: 85 e1 ldi r24, 0x15 ; 21 2ee32: 95 e1 ldi r25, 0x15 ; 21 2ee34: 0f 94 c6 5a call 0x2b58c ; 0x2b58c dir_t p; root.rewind(); bool found=false; while (root.readDir(p, NULL) > 0) 2ee38: 18 16 cp r1, r24 2ee3a: b4 f5 brge .+108 ; 0x2eea8 { for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++) 2ee3c: b1 2c mov r11, r1 2ee3e: f7 01 movw r30, r14 2ee40: 01 90 ld r0, Z+ 2ee42: 00 20 and r0, r0 2ee44: e9 f7 brne .-6 ; 0x2ee40 2ee46: 31 97 sbiw r30, 0x01 ; 1 2ee48: ee 19 sub r30, r14 2ee4a: ff 09 sbc r31, r15 2ee4c: be 16 cp r11, r30 2ee4e: 74 f4 brge .+28 ; 0x2ee6c p.name[i]=tolower(p.name[i]); 2ee50: 47 01 movw r8, r14 2ee52: 8b 0c add r8, r11 2ee54: 91 1c adc r9, r1 2ee56: b7 fc sbrc r11, 7 2ee58: 9a 94 dec r9 2ee5a: f4 01 movw r30, r8 2ee5c: 80 81 ld r24, Z 2ee5e: 90 e0 ldi r25, 0x00 ; 0 2ee60: 0f 94 24 e2 call 0x3c448 ; 0x3c448 2ee64: f4 01 movw r30, r8 2ee66: 80 83 st Z, r24 2ee68: b3 94 inc r11 2ee6a: e9 cf rjmp .-46 ; 0x2ee3e //Serial.print((char*)p.name); //Serial.print(" "); //Serial.println(autoname); if(p.name[9]!='~') //skip safety copies 2ee6c: 8a 85 ldd r24, Y+10 ; 0x0a 2ee6e: 8e 37 cpi r24, 0x7E ; 126 2ee70: 31 f2 breq .-116 ; 0x2edfe if(strncmp((char*)p.name,autoname,5)==0) 2ee72: 45 e0 ldi r20, 0x05 ; 5 2ee74: 50 e0 ldi r21, 0x00 ; 0 2ee76: b8 01 movw r22, r16 2ee78: c7 01 movw r24, r14 2ee7a: 0f 94 82 e2 call 0x3c504 ; 0x3c504 2ee7e: 89 2b or r24, r25 2ee80: 09 f0 breq .+2 ; 0x2ee84 2ee82: bd cf rjmp .-134 ; 0x2edfe { // M23: Select SD file enquecommandf_P(MSG_M23, autoname); 2ee84: 1f 93 push r17 2ee86: 0f 93 push r16 2ee88: df 92 push r13 2ee8a: cf 92 push r12 2ee8c: 0e 94 56 88 call 0x110ac ; 0x110ac // M24: Start/resume SD print enquecommand_P(MSG_M24); 2ee90: 61 e0 ldi r22, 0x01 ; 1 2ee92: 8d e8 ldi r24, 0x8D ; 141 2ee94: 90 e7 ldi r25, 0x70 ; 112 2ee96: 0e 94 b8 87 call 0x10f70 ; 0x10f70 2ee9a: 0f 90 pop r0 2ee9c: 0f 90 pop r0 2ee9e: 0f 90 pop r0 2eea0: 0f 90 pop r0 found=true; 2eea2: aa 24 eor r10, r10 2eea4: a3 94 inc r10 2eea6: ab cf rjmp .-170 ; 0x2edfe } } if(!found) lastnr=-1; 2eea8: 8f ef ldi r24, 0xFF ; 255 2eeaa: 9f ef ldi r25, 0xFF ; 255 // M24: Start/resume SD print enquecommand_P(MSG_M24); found=true; } } if(!found) 2eeac: aa 20 and r10, r10 2eeae: 29 f0 breq .+10 ; 0x2eeba lastnr=-1; else lastnr++; 2eeb0: 80 91 dc 14 lds r24, 0x14DC ; 0x8014dc 2eeb4: 90 91 dd 14 lds r25, 0x14DD ; 0x8014dd 2eeb8: 01 96 adiw r24, 0x01 ; 1 2eeba: 90 93 dd 14 sts 0x14DD, r25 ; 0x8014dd 2eebe: 80 93 dc 14 sts 0x14DC, r24 ; 0x8014dc } 2eec2: ee 96 adiw r28, 0x3e ; 62 2eec4: 0f b6 in r0, 0x3f ; 63 2eec6: f8 94 cli 2eec8: de bf out 0x3e, r29 ; 62 2eeca: 0f be out 0x3f, r0 ; 63 2eecc: cd bf out 0x3d, r28 ; 61 2eece: df 91 pop r29 2eed0: cf 91 pop r28 2eed2: 1f 91 pop r17 2eed4: 0f 91 pop r16 2eed6: ff 90 pop r15 2eed8: ef 90 pop r14 2eeda: df 90 pop r13 2eedc: cf 90 pop r12 2eede: bf 90 pop r11 2eee0: af 90 pop r10 2eee2: 9f 90 pop r9 2eee4: 8f 90 pop r8 2eee6: 08 95 ret 0002eee8 : * \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) { 2eee8: 8f 92 push r8 2eeea: 9f 92 push r9 2eeec: af 92 push r10 2eeee: bf 92 push r11 2eef0: cf 92 push r12 2eef2: df 92 push r13 2eef4: ef 92 push r14 2eef6: ff 92 push r15 2eef8: 0f 93 push r16 2eefa: 1f 93 push r17 2eefc: cf 93 push r28 2eefe: df 93 push r29 2ef00: 00 d0 rcall .+0 ; 0x2ef02 2ef02: 1f 92 push r1 2ef04: cd b7 in r28, 0x3d ; 61 2ef06: de b7 in r29, 0x3e ; 62 2ef08: fc 01 movw r30, r24 uint32_t newPos; // error if not a normal file or read-only if (!isFile() || !(flags_ & O_WRITE)) goto fail; 2ef0a: 83 81 ldd r24, Z+3 ; 0x03 2ef0c: 81 30 cpi r24, 0x01 ; 1 2ef0e: 11 f0 breq .+4 ; 0x2ef14 // set file to correct position return seekSet(newPos); fail: return false; 2ef10: 80 e0 ldi r24, 0x00 ; 0 2ef12: 60 c0 rjmp .+192 ; 0x2efd4 * \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; 2ef14: 81 81 ldd r24, Z+1 ; 0x01 2ef16: 81 ff sbrs r24, 1 2ef18: fb cf rjmp .-10 ; 0x2ef10 // 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; 2ef1a: 81 89 ldd r24, Z+17 ; 0x11 2ef1c: 92 89 ldd r25, Z+18 ; 0x12 2ef1e: a3 89 ldd r26, Z+19 ; 0x13 2ef20: b4 89 ldd r27, Z+20 ; 0x14 2ef22: 89 2b or r24, r25 2ef24: 8a 2b or r24, r26 2ef26: 8b 2b or r24, r27 2ef28: 09 f4 brne .+2 ; 0x2ef2c 2ef2a: 6e c0 rjmp .+220 ; 0x2f008 2ef2c: 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; 2ef2e: 40 e0 ldi r20, 0x00 ; 0 2ef30: 50 e0 ldi r21, 0x00 ; 0 2ef32: ba 01 movw r22, r20 2ef34: cf 01 movw r24, r30 2ef36: 0f 94 89 57 call 0x2af12 ; 0x2af12 2ef3a: 88 23 and r24, r24 2ef3c: 49 f3 breq .-46 ; 0x2ef10 if (length == 0) { // free all clusters if (!vol_->freeChain(firstCluster_)) goto fail; 2ef3e: f7 01 movw r30, r14 2ef40: c1 8c ldd r12, Z+25 ; 0x19 2ef42: d2 8c ldd r13, Z+26 ; 0x1a 2ef44: 85 88 ldd r8, Z+21 ; 0x15 2ef46: 96 88 ldd r9, Z+22 ; 0x16 2ef48: a7 88 ldd r10, Z+23 ; 0x17 2ef4a: 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; 2ef4c: 82 e0 ldi r24, 0x02 ; 2 2ef4e: 90 e0 ldi r25, 0x00 ; 0 2ef50: a0 e0 ldi r26, 0x00 ; 0 2ef52: b0 e0 ldi r27, 0x00 ; 0 2ef54: f6 01 movw r30, r12 2ef56: 80 83 st Z, r24 2ef58: 91 83 std Z+1, r25 ; 0x01 2ef5a: a2 83 std Z+2, r26 ; 0x02 2ef5c: b3 83 std Z+3, r27 ; 0x03 do { if (!fatGet(cluster, &next)) goto fail; 2ef5e: 9e 01 movw r18, r28 2ef60: 2f 5f subi r18, 0xFF ; 255 2ef62: 3f 4f sbci r19, 0xFF ; 255 2ef64: b5 01 movw r22, r10 2ef66: a4 01 movw r20, r8 2ef68: c6 01 movw r24, r12 2ef6a: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 2ef6e: 88 23 and r24, r24 2ef70: 79 f2 breq .-98 ; 0x2ef10 // free cluster if (!fatPut(cluster, 0)) goto fail; 2ef72: 00 e0 ldi r16, 0x00 ; 0 2ef74: 10 e0 ldi r17, 0x00 ; 0 2ef76: 98 01 movw r18, r16 2ef78: b5 01 movw r22, r10 2ef7a: a4 01 movw r20, r8 2ef7c: c6 01 movw r24, r12 2ef7e: 0f 94 41 55 call 0x2aa82 ; 0x2aa82 2ef82: 88 23 and r24, r24 2ef84: 29 f2 breq .-118 ; 0x2ef10 cluster = next; 2ef86: 89 80 ldd r8, Y+1 ; 0x01 2ef88: 9a 80 ldd r9, Y+2 ; 0x02 2ef8a: ab 80 ldd r10, Y+3 ; 0x03 2ef8c: 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; 2ef8e: f6 01 movw r30, r12 2ef90: 87 89 ldd r24, Z+23 ; 0x17 2ef92: 80 31 cpi r24, 0x10 ; 16 2ef94: 81 f5 brne .+96 ; 0x2eff6 2ef96: f8 ef ldi r31, 0xF8 ; 248 2ef98: 8f 16 cp r8, r31 2ef9a: ff ef ldi r31, 0xFF ; 255 2ef9c: 9f 06 cpc r9, r31 2ef9e: a1 04 cpc r10, r1 2efa0: b1 04 cpc r11, r1 2efa2: e8 f2 brcs .-70 ; 0x2ef5e firstCluster_ = 0; 2efa4: f7 01 movw r30, r14 2efa6: 15 8a std Z+21, r1 ; 0x15 2efa8: 16 8a std Z+22, r1 ; 0x16 2efaa: 17 8a std Z+23, r1 ; 0x17 2efac: 10 8e std Z+24, r1 ; 0x18 // current cluster is end of chain if (!vol_->fatPutEOC(curCluster_)) goto fail; } } fileSize_ = length; 2efae: 11 8a std Z+17, r1 ; 0x11 2efb0: 12 8a std Z+18, r1 ; 0x12 2efb2: 13 8a std Z+19, r1 ; 0x13 2efb4: 14 8a std Z+20, r1 ; 0x14 // need to update directory entry flags_ |= F_FILE_DIR_DIRTY; 2efb6: 81 81 ldd r24, Z+1 ; 0x01 2efb8: 80 68 ori r24, 0x80 ; 128 2efba: 81 83 std Z+1, r24 ; 0x01 if (!sync()) goto fail; 2efbc: c7 01 movw r24, r14 2efbe: 0f 94 32 59 call 0x2b264 ; 0x2b264 2efc2: 88 23 and r24, r24 2efc4: 09 f4 brne .+2 ; 0x2efc8 2efc6: a4 cf rjmp .-184 ; 0x2ef10 // set file to correct position return seekSet(newPos); 2efc8: 40 e0 ldi r20, 0x00 ; 0 2efca: 50 e0 ldi r21, 0x00 ; 0 2efcc: ba 01 movw r22, r20 2efce: c7 01 movw r24, r14 2efd0: 0f 94 89 57 call 0x2af12 ; 0x2af12 fail: return false; } 2efd4: 0f 90 pop r0 2efd6: 0f 90 pop r0 2efd8: 0f 90 pop r0 2efda: 0f 90 pop r0 2efdc: df 91 pop r29 2efde: cf 91 pop r28 2efe0: 1f 91 pop r17 2efe2: 0f 91 pop r16 2efe4: ff 90 pop r15 2efe6: ef 90 pop r14 2efe8: df 90 pop r13 2efea: cf 90 pop r12 2efec: bf 90 pop r11 2efee: af 90 pop r10 2eff0: 9f 90 pop r9 2eff2: 8f 90 pop r8 2eff4: 08 95 ret return cluster >= FAT32EOC_MIN; 2eff6: 88 ef ldi r24, 0xF8 ; 248 2eff8: 88 16 cp r8, r24 2effa: 8f ef ldi r24, 0xFF ; 255 2effc: 98 06 cpc r9, r24 2effe: a8 06 cpc r10, r24 2f000: 8f e0 ldi r24, 0x0F ; 15 2f002: b8 06 cpc r11, r24 2f004: 78 f6 brcc .-98 ; 0x2efa4 2f006: ab cf rjmp .-170 ; 0x2ef5e // 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; 2f008: 81 e0 ldi r24, 0x01 ; 1 2f00a: e4 cf rjmp .-56 ; 0x2efd4 0002f00c : +* 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) { 2f00c: 2f 92 push r2 2f00e: 3f 92 push r3 2f010: 4f 92 push r4 2f012: 5f 92 push r5 2f014: 6f 92 push r6 2f016: 7f 92 push r7 2f018: 8f 92 push r8 2f01a: 9f 92 push r9 2f01c: af 92 push r10 2f01e: bf 92 push r11 2f020: cf 92 push r12 2f022: df 92 push r13 2f024: ef 92 push r14 2f026: ff 92 push r15 2f028: 0f 93 push r16 2f02a: 1f 93 push r17 2f02c: cf 93 push r28 2f02e: df 93 push r29 2f030: cd b7 in r28, 0x3d ; 61 2f032: de b7 in r29, 0x3e ; 62 2f034: c6 57 subi r28, 0x76 ; 118 2f036: d1 09 sbc r29, r1 2f038: 0f b6 in r0, 0x3f ; 63 2f03a: f8 94 cli 2f03c: de bf out 0x3e, r29 ; 62 2f03e: 0f be out 0x3f, r0 ; 63 2f040: cd bf out 0x3d, r28 ; 61 2f042: 4c 01 movw r8, r24 2f044: 6b 01 movw r12, r22 2f046: 3a 01 movw r6, r20 2f048: e5 96 adiw r28, 0x35 ; 53 2f04a: 2f af std Y+63, r18 ; 0x3f 2f04c: e5 97 sbiw r28, 0x35 ; 53 2f04e: 50 2e mov r5, r16 cnt++; break; } } } // while readDir } 2f050: 2d b6 in r2, 0x3d ; 61 2f052: 3e b6 in r3, 0x3e ; 62 2f054: 10 2f mov r17, r16 2f056: 11 70 andi r17, 0x01 ; 1 static uint8_t recursionCnt = 0; // RAII incrementer for the recursionCnt class _incrementer { public: _incrementer() {recursionCnt++;} 2f058: 80 91 9b 0e lds r24, 0x0E9B ; 0x800e9b 2f05c: 8f 5f subi r24, 0xFF ; 255 2f05e: 80 93 9b 0e sts 0x0E9B, r24 ; 0x800e9b } 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()) { 2f062: fb 01 movw r30, r22 2f064: 80 85 ldd r24, Z+8 ; 0x08 2f066: 91 85 ldd r25, Z+9 ; 0x09 2f068: a2 85 ldd r26, Z+10 ; 0x0a 2f06a: b3 85 ldd r27, Z+11 ; 0x0b 2f06c: 80 93 a2 14 sts 0x14A2, r24 ; 0x8014a2 2f070: 90 93 a3 14 sts 0x14A3, r25 ; 0x8014a3 2f074: a0 93 a4 14 sts 0x14A4, r26 ; 0x8014a4 2f078: b0 93 a5 14 sts 0x14A5, r27 ; 0x8014a5 _incrementer() {recursionCnt++;} ~_incrementer() {recursionCnt--;} } recursionCntIncrementer; dir_t p; uint8_t cnt = 0; 2f07c: 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); 2f07e: 5e 01 movw r10, r28 2f080: f7 e6 ldi r31, 0x67 ; 103 2f082: af 0e add r10, r31 2f084: 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; 2f086: f6 01 movw r30, r12 2f088: 83 81 ldd r24, Z+3 ; 0x03 2f08a: 82 30 cpi r24, 0x02 ; 2 2f08c: 08 f4 brcc .+2 ; 0x2f090 2f08e: c0 c1 rjmp .+896 ; 0x2f410 2f090: 80 85 ldd r24, Z+8 ; 0x08 2f092: 91 85 ldd r25, Z+9 ; 0x09 2f094: a2 85 ldd r26, Z+10 ; 0x0a 2f096: b3 85 ldd r27, Z+11 ; 0x0b 2f098: 8f 71 andi r24, 0x1F ; 31 2f09a: 99 27 eor r25, r25 2f09c: aa 27 eor r26, r26 2f09e: bb 27 eor r27, r27 2f0a0: 89 2b or r24, r25 2f0a2: 8a 2b or r24, r26 2f0a4: 8b 2b or r24, r27 2f0a6: 09 f0 breq .+2 ; 0x2f0aa 2f0a8: b3 c1 rjmp .+870 ; 0x2f410 //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'; 2f0aa: 10 92 a6 14 sts 0x14A6, r1 ; 0x8014a6 2f0ae: 46 ea ldi r20, 0xA6 ; 166 2f0b0: 54 e1 ldi r21, 0x14 ; 20 2f0b2: be 01 movw r22, r28 2f0b4: 69 5b subi r22, 0xB9 ; 185 2f0b6: 7f 4f sbci r23, 0xFF ; 255 2f0b8: c6 01 movw r24, r12 2f0ba: 0f 94 c6 5a call 0x2b58c ; 0x2b58c } 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()) { 2f0be: 18 16 cp r1, r24 2f0c0: 0c f0 brlt .+2 ; 0x2f0c4 2f0c2: a6 c1 rjmp .+844 ; 0x2f410 if (recursionCnt > MAX_DIR_DEPTH) 2f0c4: 80 91 9b 0e lds r24, 0x0E9B ; 0x800e9b 2f0c8: 87 30 cpi r24, 0x07 ; 7 2f0ca: 08 f0 brcs .+2 ; 0x2f0ce 2f0cc: a1 c1 rjmp .+834 ; 0x2f410 return; uint8_t pn0 = p.name[0]; 2f0ce: 28 96 adiw r28, 0x08 ; 8 2f0d0: 8f ad ldd r24, Y+63 ; 0x3f 2f0d2: 28 97 sbiw r28, 0x08 ; 8 if (pn0 == DIR_NAME_FREE) break; 2f0d4: 88 23 and r24, r24 2f0d6: 09 f4 brne .+2 ; 0x2f0da 2f0d8: 9b c1 rjmp .+822 ; 0x2f410 if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; 2f0da: 85 3e cpi r24, 0xE5 ; 229 2f0dc: 09 f4 brne .+2 ; 0x2f0e0 2f0de: 39 c1 rjmp .+626 ; 0x2f352 2f0e0: 8e 32 cpi r24, 0x2E ; 46 2f0e2: 09 f4 brne .+2 ; 0x2f0e6 2f0e4: 36 c1 rjmp .+620 ; 0x2f352 if (longFilename[0] == '.') continue; 2f0e6: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2f0ea: 8e 32 cpi r24, 0x2E ; 46 2f0ec: 09 f4 brne .+2 ; 0x2f0f0 2f0ee: 31 c1 rjmp .+610 ; 0x2f352 2f0f0: 63 96 adiw r28, 0x13 ; 19 2f0f2: 8f ad ldd r24, Y+63 ; 0x3f 2f0f4: 63 97 sbiw r28, 0x13 ; 19 if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; 2f0f6: 98 2f mov r25, r24 2f0f8: 9a 70 andi r25, 0x0A ; 10 2f0fa: 09 f0 breq .+2 ; 0x2f0fe 2f0fc: 2a c1 rjmp .+596 ; 0x2f352 2f0fe: 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; 2f100: 91 e0 ldi r25, 0x01 ; 1 2f102: 80 31 cpi r24, 0x10 ; 16 2f104: 19 f0 breq .+6 ; 0x2f10c 2f106: 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 2f108: 80 31 cpi r24, 0x10 ; 16 2f10a: 31 f4 brne .+12 ; 0x2f118 2f10c: e5 96 adiw r28, 0x35 ; 53 2f10e: ff ad ldd r31, Y+63 ; 0x3f 2f110: e5 97 sbiw r28, 0x35 ; 53 2f112: ff 23 and r31, r31 2f114: 09 f4 brne .+2 ; 0x2f118 2f116: 94 c0 rjmp .+296 ; 0x2f240 if (lsParams.LFN) puts_P(PSTR("DIR_EXIT")); } else { filenameIsDir = DIR_IS_SUBDIR(&p); 2f118: 90 93 db 14 sts 0x14DB, r25 ; 0x8014db if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; 2f11c: 80 31 cpi r24, 0x10 ; 16 2f11e: 61 f0 breq .+24 ; 0x2f138 2f120: 60 96 adiw r28, 0x10 ; 16 2f122: 8f ad ldd r24, Y+63 ; 0x3f 2f124: 60 97 sbiw r28, 0x10 ; 16 2f126: 87 34 cpi r24, 0x47 ; 71 2f128: 09 f0 breq .+2 ; 0x2f12c 2f12a: 13 c1 rjmp .+550 ; 0x2f352 2f12c: 61 96 adiw r28, 0x11 ; 17 2f12e: 8f ad ldd r24, Y+63 ; 0x3f 2f130: 61 97 sbiw r28, 0x11 ; 17 2f132: 8e 37 cpi r24, 0x7E ; 126 2f134: 09 f4 brne .+2 ; 0x2f138 2f136: 0d c1 rjmp .+538 ; 0x2f352 switch (lsAction) { 2f138: e5 96 adiw r28, 0x35 ; 53 2f13a: ff ad ldd r31, Y+63 ; 0x3f 2f13c: e5 97 sbiw r28, 0x35 ; 53 2f13e: f1 30 cpi r31, 0x01 ; 1 2f140: 09 f4 brne .+2 ; 0x2f144 2f142: 1b c1 rjmp .+566 ; 0x2f37a 2f144: f2 30 cpi r31, 0x02 ; 2 2f146: 09 f4 brne .+2 ; 0x2f14a 2f148: 25 c1 rjmp .+586 ; 0x2f394 case LS_Count: nrFiles++; break; case LS_SerialPrint: createFilename(filename, p); 2f14a: be 01 movw r22, r28 2f14c: 69 5b subi r22, 0xB9 ; 185 2f14e: 7f 4f sbci r23, 0xFF ; 255 2f150: 81 e9 ldi r24, 0x91 ; 145 2f152: 94 e1 ldi r25, 0x14 ; 20 2f154: 0e 94 ae 76 call 0xed5c ; 0xed5c 2f158: c4 01 movw r24, r8 2f15a: 0e 94 ac 87 call 0x10f58 ; 0x10f58 2f15e: 81 e9 ldi r24, 0x91 ; 145 2f160: 94 e1 ldi r25, 0x14 ; 20 2f162: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_PROTOCOL(prepend); SERIAL_PROTOCOL(filename); MYSERIAL.write(' '); 2f166: 80 e2 ldi r24, 0x20 ; 32 2f168: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 2f16c: a7 96 adiw r28, 0x27 ; 39 2f16e: 6c ad ldd r22, Y+60 ; 0x3c 2f170: 7d ad ldd r23, Y+61 ; 0x3d 2f172: 8e ad ldd r24, Y+62 ; 0x3e 2f174: 9f ad ldd r25, Y+63 ; 0x3f 2f176: a7 97 sbiw r28, 0x27 ; 39 2f178: 4a e0 ldi r20, 0x0A ; 10 2f17a: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 SERIAL_PROTOCOL(p.fileSize); if (lsParams.timestamp) 2f17e: 51 fe sbrs r5, 1 2f180: 45 c0 rjmp .+138 ; 0x2f20c { crmodDate = p.lastWriteDate; 2f182: a1 96 adiw r28, 0x21 ; 33 2f184: 2e ad ldd r18, Y+62 ; 0x3e 2f186: 3f ad ldd r19, Y+63 ; 0x3f 2f188: a1 97 sbiw r28, 0x21 ; 33 2f18a: 30 93 a1 14 sts 0x14A1, r19 ; 0x8014a1 2f18e: 20 93 a0 14 sts 0x14A0, r18 ; 0x8014a0 crmodTime = p.lastWriteTime; 2f192: 6f 96 adiw r28, 0x1f ; 31 2f194: 4e ad ldd r20, Y+62 ; 0x3e 2f196: 5f ad ldd r21, Y+63 ; 0x3f 2f198: 6f 97 sbiw r28, 0x1f ; 31 2f19a: 50 93 9f 14 sts 0x149F, r21 ; 0x80149f 2f19e: 40 93 9e 14 sts 0x149E, r20 ; 0x80149e if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){ 2f1a2: 69 96 adiw r28, 0x19 ; 25 2f1a4: 8e ad ldd r24, Y+62 ; 0x3e 2f1a6: 9f ad ldd r25, Y+63 ; 0x3f 2f1a8: 69 97 sbiw r28, 0x19 ; 25 2f1aa: 28 17 cp r18, r24 2f1ac: 39 07 cpc r19, r25 2f1ae: 50 f0 brcs .+20 ; 0x2f1c4 2f1b0: 28 17 cp r18, r24 2f1b2: 39 07 cpc r19, r25 2f1b4: 99 f4 brne .+38 ; 0x2f1dc 2f1b6: 67 96 adiw r28, 0x17 ; 23 2f1b8: 2e ad ldd r18, Y+62 ; 0x3e 2f1ba: 3f ad ldd r19, Y+63 ; 0x3f 2f1bc: 67 97 sbiw r28, 0x17 ; 23 2f1be: 42 17 cp r20, r18 2f1c0: 53 07 cpc r21, r19 2f1c2: 60 f4 brcc .+24 ; 0x2f1dc crmodDate = p.creationDate; 2f1c4: 90 93 a1 14 sts 0x14A1, r25 ; 0x8014a1 2f1c8: 80 93 a0 14 sts 0x14A0, r24 ; 0x8014a0 crmodTime = p.creationTime; 2f1cc: 67 96 adiw r28, 0x17 ; 23 2f1ce: 8e ad ldd r24, Y+62 ; 0x3e 2f1d0: 9f ad ldd r25, Y+63 ; 0x3f 2f1d2: 67 97 sbiw r28, 0x17 ; 23 2f1d4: 90 93 9f 14 sts 0x149F, r25 ; 0x80149f 2f1d8: 80 93 9e 14 sts 0x149E, r24 ; 0x80149e } printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime); 2f1dc: 80 91 a1 14 lds r24, 0x14A1 ; 0x8014a1 2f1e0: 8f 93 push r24 2f1e2: 80 91 a0 14 lds r24, 0x14A0 ; 0x8014a0 2f1e6: 8f 93 push r24 2f1e8: 80 91 9f 14 lds r24, 0x149F ; 0x80149f 2f1ec: 8f 93 push r24 2f1ee: 80 91 9e 14 lds r24, 0x149E ; 0x80149e 2f1f2: 8f 93 push r24 2f1f4: 2b e4 ldi r18, 0x4B ; 75 2f1f6: 3a ea ldi r19, 0xAA ; 170 2f1f8: 3f 93 push r19 2f1fa: 2f 93 push r18 2f1fc: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2f200: 0f 90 pop r0 2f202: 0f 90 pop r0 2f204: 0f 90 pop r0 2f206: 0f 90 pop r0 2f208: 0f 90 pop r0 2f20a: 0f 90 pop r0 } if (lsParams.LFN) 2f20c: 11 23 and r17, r17 2f20e: 99 f0 breq .+38 ; 0x2f236 printf_P(PSTR(" \"%s\""), LONGEST_FILENAME); 2f210: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2f214: 88 23 and r24, r24 2f216: 09 f4 brne .+2 ; 0x2f21a 2f218: ba c0 rjmp .+372 ; 0x2f38e 2f21a: 86 ea ldi r24, 0xA6 ; 166 2f21c: 94 e1 ldi r25, 0x14 ; 20 2f21e: 9f 93 push r25 2f220: 8f 93 push r24 2f222: e5 e4 ldi r30, 0x45 ; 69 2f224: fa ea ldi r31, 0xAA ; 170 2f226: ff 93 push r31 2f228: ef 93 push r30 2f22a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2f22e: 0f 90 pop r0 2f230: 0f 90 pop r0 2f232: 0f 90 pop r0 2f234: 0f 90 pop r0 SERIAL_PROTOCOLLN(); 2f236: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 manage_heater(); 2f23a: 0f 94 34 39 call 0x27268 ; 0x27268 2f23e: 89 c0 rjmp .+274 ; 0x2f352 } lsDive(path, dir, NULL, lsAction, lsParams); // close() is done automatically by destructor of SdFile if (lsParams.LFN) puts_P(PSTR("DIR_EXIT")); 2f240: 2d b7 in r18, 0x3d ; 61 2f242: 3e b7 in r19, 0x3e ; 62 2f244: e7 96 adiw r28, 0x37 ; 55 2f246: 3f af std Y+63, r19 ; 0x3f 2f248: 2e af std Y+62, r18 ; 0x3e 2f24a: 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); 2f24c: be 01 movw r22, r28 2f24e: 69 5b subi r22, 0xB9 ; 185 2f250: 7f 4f sbci r23, 0xFF ; 255 2f252: c5 01 movw r24, r10 2f254: 0e 94 ae 76 call 0xed5c ; 0xed5c // Allocate enough stack space for the full path to a folder, trailing slash, and nul bool prepend_is_empty = (prepend[0] == '\0'); 2f258: f4 01 movw r30, r8 2f25a: 80 81 ld r24, Z int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1; 2f25c: 88 23 and r24, r24 2f25e: 09 f4 brne .+2 ; 0x2f262 2f260: 86 c0 rjmp .+268 ; 0x2f36e 2f262: 01 90 ld r0, Z+ 2f264: 00 20 and r0, r0 2f266: e9 f7 brne .-6 ; 0x2f262 2f268: 31 97 sbiw r30, 0x01 ; 1 2f26a: e8 19 sub r30, r8 2f26c: f9 09 sbc r31, r9 2f26e: d5 01 movw r26, r10 2f270: 0d 90 ld r0, X+ 2f272: 00 20 and r0, r0 2f274: e9 f7 brne .-6 ; 0x2f270 2f276: ea 19 sub r30, r10 2f278: fb 09 sbc r31, r11 char path[len]; 2f27a: ea 0f add r30, r26 2f27c: fb 1f adc r31, r27 2f27e: 31 96 adiw r30, 0x01 ; 1 2f280: 2d b7 in r18, 0x3d ; 61 2f282: 3e b7 in r19, 0x3e ; 62 2f284: 2e 1b sub r18, r30 2f286: 3f 0b sbc r19, r31 2f288: 0f b6 in r0, 0x3f ; 63 2f28a: f8 94 cli 2f28c: 3e bf out 0x3e, r19 ; 62 2f28e: 0f be out 0x3f, r0 ; 63 2f290: 2d bf out 0x3d, r18 ; 61 2f292: ed b7 in r30, 0x3d ; 61 2f294: fe b7 in r31, 0x3e ; 62 2f296: 31 96 adiw r30, 0x01 ; 1 2f298: 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 2f29a: 6b e1 ldi r22, 0x1B ; 27 2f29c: 73 e0 ldi r23, 0x03 ; 3 2f29e: 81 11 cpse r24, r1 2f2a0: b4 01 movw r22, r8 2f2a2: c7 01 movw r24, r14 2f2a4: 0f 94 7b e2 call 0x3c4f6 ; 0x3c4f6 strcat(path, lfilename); // FILENAME_LENGTH-1 characters maximum 2f2a8: b5 01 movw r22, r10 2f2aa: c7 01 movw r24, r14 2f2ac: 0f 94 5c e2 call 0x3c4b8 ; 0x3c4b8 strcat(path, "/"); // 1 character 2f2b0: 6b e1 ldi r22, 0x1B ; 27 2f2b2: 73 e0 ldi r23, 0x03 ; 3 2f2b4: c7 01 movw r24, r14 2f2b6: 0f 94 5c e2 call 0x3c4b8 ; 0x3c4b8 // Serial.print(path); // Get a new directory object using the full path // and dive recursively into it. if (lsParams.LFN) 2f2ba: 11 23 and r17, r17 2f2bc: a9 f0 breq .+42 ; 0x2f2e8 printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename); 2f2be: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2f2c2: 81 11 cpse r24, r1 2f2c4: 57 c0 rjmp .+174 ; 0x2f374 2f2c6: c5 01 movw r24, r10 2f2c8: 9f 93 push r25 2f2ca: 8f 93 push r24 2f2cc: ff 92 push r15 2f2ce: ef 92 push r14 2f2d0: 2a e5 ldi r18, 0x5A ; 90 2f2d2: 3a ea ldi r19, 0xAA ; 170 2f2d4: 3f 93 push r19 2f2d6: 2f 93 push r18 2f2d8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 2f2dc: 0f 90 pop r0 2f2de: 0f 90 pop r0 2f2e0: 0f 90 pop r0 2f2e2: 0f 90 pop r0 2f2e4: 0f 90 pop r0 2f2e6: 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) {} 2f2e8: 1c a2 std Y+36, r1 ; 0x24 2f2ea: 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); 2f2ec: 21 e0 ldi r18, 0x01 ; 1 2f2ee: a5 01 movw r20, r10 2f2f0: b6 01 movw r22, r12 2f2f2: ce 01 movw r24, r28 2f2f4: 84 96 adiw r24, 0x24 ; 36 2f2f6: 0f 94 0f 65 call 0x2ca1e ; 0x2ca1e 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); 2f2fa: 83 e2 ldi r24, 0x23 ; 35 2f2fc: fe 01 movw r30, r28 2f2fe: b4 96 adiw r30, 0x24 ; 36 2f300: de 01 movw r26, r28 2f302: 11 96 adiw r26, 0x01 ; 1 2f304: 01 90 ld r0, Z+ 2f306: 0d 92 st X+, r0 2f308: 8a 95 dec r24 2f30a: e1 f7 brne .-8 ; 0x2f304 2f30c: 10 fb bst r17, 0 2f30e: 50 f8 bld r5, 0 2f310: 05 2d mov r16, r5 2f312: 20 e0 ldi r18, 0x00 ; 0 2f314: 50 e0 ldi r21, 0x00 ; 0 2f316: 40 e0 ldi r20, 0x00 ; 0 2f318: be 01 movw r22, r28 2f31a: 6f 5f subi r22, 0xFF ; 255 2f31c: 7f 4f sbci r23, 0xFF ; 255 2f31e: c7 01 movw r24, r14 2f320: 0f 94 06 78 call 0x2f00c ; 0x2f00c 2f324: ce 01 movw r24, r28 2f326: 01 96 adiw r24, 0x01 ; 1 2f328: 0e 94 c9 76 call 0xed92 ; 0xed92 // close() is done automatically by destructor of SdFile if (lsParams.LFN) 2f32c: 11 23 and r17, r17 2f32e: 21 f0 breq .+8 ; 0x2f338 puts_P(PSTR("DIR_EXIT")); 2f330: 81 e5 ldi r24, 0x51 ; 81 2f332: 9a ea ldi r25, 0xAA ; 170 2f334: 0f 94 f9 da call 0x3b5f2 ; 0x3b5f2 2f338: ce 01 movw r24, r28 2f33a: 84 96 adiw r24, 0x24 ; 36 2f33c: 0e 94 c9 76 call 0xed92 ; 0xed92 2f340: e7 96 adiw r28, 0x37 ; 55 2f342: ee ad ldd r30, Y+62 ; 0x3e 2f344: ff ad ldd r31, Y+63 ; 0x3f 2f346: e7 97 sbiw r28, 0x37 ; 55 2f348: 0f b6 in r0, 0x3f ; 63 2f34a: f8 94 cli 2f34c: fe bf out 0x3e, r31 ; 62 2f34e: 0f be out 0x3f, r0 ; 63 2f350: 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()) { 2f352: f6 01 movw r30, r12 2f354: 80 85 ldd r24, Z+8 ; 0x08 2f356: 91 85 ldd r25, Z+9 ; 0x09 2f358: a2 85 ldd r26, Z+10 ; 0x0a 2f35a: b3 85 ldd r27, Z+11 ; 0x0b 2f35c: 80 93 a2 14 sts 0x14A2, r24 ; 0x8014a2 2f360: 90 93 a3 14 sts 0x14A3, r25 ; 0x8014a3 2f364: a0 93 a4 14 sts 0x14A4, r26 ; 0x8014a4 2f368: b0 93 a5 14 sts 0x14A5, r27 ; 0x8014a5 2f36c: 8c ce rjmp .-744 ; 0x2f086 // 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; 2f36e: e1 e0 ldi r30, 0x01 ; 1 2f370: f0 e0 ldi r31, 0x00 ; 0 2f372: 7d cf rjmp .-262 ; 0x2f26e // 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); 2f374: 86 ea ldi r24, 0xA6 ; 166 2f376: 94 e1 ldi r25, 0x14 ; 20 2f378: a7 cf rjmp .-178 ; 0x2f2c8 else { filenameIsDir = DIR_IS_SUBDIR(&p); if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; switch (lsAction) { case LS_Count: nrFiles++; 2f37a: 80 91 a7 17 lds r24, 0x17A7 ; 0x8017a7 2f37e: 90 91 a8 17 lds r25, 0x17A8 ; 0x8017a8 2f382: 01 96 adiw r24, 0x01 ; 1 2f384: 90 93 a8 17 sts 0x17A8, r25 ; 0x8017a8 2f388: 80 93 a7 17 sts 0x17A7, r24 ; 0x8017a7 2f38c: e2 cf rjmp .-60 ; 0x2f352 } printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime); } if (lsParams.LFN) printf_P(PSTR(" \"%s\""), LONGEST_FILENAME); 2f38e: 81 e9 ldi r24, 0x91 ; 145 2f390: 94 e1 ldi r25, 0x14 ; 20 2f392: 45 cf rjmp .-374 ; 0x2f21e manage_heater(); break; case LS_GetFilename: //SERIAL_ECHOPGM("File: "); createFilename(filename, p); 2f394: be 01 movw r22, r28 2f396: 69 5b subi r22, 0xB9 ; 185 2f398: 7f 4f sbci r23, 0xFF ; 255 2f39a: 81 e9 ldi r24, 0x91 ; 145 2f39c: 94 e1 ldi r25, 0x14 ; 20 2f39e: 0e 94 ae 76 call 0xed5c ; 0xed5c SERIAL_ECHOPGM("Creation date: "); MYSERIAL.println(p.creationDate); SERIAL_ECHOPGM("Access date: "); MYSERIAL.println(p.lastAccessDate); SERIAL_ECHOLNPGM("");*/ crmodDate = p.lastWriteDate; 2f3a2: a1 96 adiw r28, 0x21 ; 33 2f3a4: 2e ad ldd r18, Y+62 ; 0x3e 2f3a6: 3f ad ldd r19, Y+63 ; 0x3f 2f3a8: a1 97 sbiw r28, 0x21 ; 33 2f3aa: 30 93 a1 14 sts 0x14A1, r19 ; 0x8014a1 2f3ae: 20 93 a0 14 sts 0x14A0, r18 ; 0x8014a0 crmodTime = p.lastWriteTime; 2f3b2: 6f 96 adiw r28, 0x1f ; 31 2f3b4: 4e ad ldd r20, Y+62 ; 0x3e 2f3b6: 5f ad ldd r21, Y+63 ; 0x3f 2f3b8: 6f 97 sbiw r28, 0x1f ; 31 2f3ba: 50 93 9f 14 sts 0x149F, r21 ; 0x80149f 2f3be: 40 93 9e 14 sts 0x149E, r20 ; 0x80149e // 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 ) ){ 2f3c2: 69 96 adiw r28, 0x19 ; 25 2f3c4: 8e ad ldd r24, Y+62 ; 0x3e 2f3c6: 9f ad ldd r25, Y+63 ; 0x3f 2f3c8: 69 97 sbiw r28, 0x19 ; 25 2f3ca: 28 17 cp r18, r24 2f3cc: 39 07 cpc r19, r25 2f3ce: 50 f0 brcs .+20 ; 0x2f3e4 2f3d0: 28 17 cp r18, r24 2f3d2: 39 07 cpc r19, r25 2f3d4: 99 f4 brne .+38 ; 0x2f3fc 2f3d6: 67 96 adiw r28, 0x17 ; 23 2f3d8: 2e ad ldd r18, Y+62 ; 0x3e 2f3da: 3f ad ldd r19, Y+63 ; 0x3f 2f3dc: 67 97 sbiw r28, 0x17 ; 23 2f3de: 42 17 cp r20, r18 2f3e0: 53 07 cpc r21, r19 2f3e2: 60 f4 brcc .+24 ; 0x2f3fc crmodDate = p.creationDate; 2f3e4: 90 93 a1 14 sts 0x14A1, r25 ; 0x8014a1 2f3e8: 80 93 a0 14 sts 0x14A0, r24 ; 0x8014a0 crmodTime = p.creationTime; 2f3ec: 67 96 adiw r28, 0x17 ; 23 2f3ee: 8e ad ldd r24, Y+62 ; 0x3e 2f3f0: 9f ad ldd r25, Y+63 ; 0x3f 2f3f2: 67 97 sbiw r28, 0x17 ; 23 2f3f4: 90 93 9f 14 sts 0x149F, r25 ; 0x80149f 2f3f8: 80 93 9e 14 sts 0x149E, r24 ; 0x80149e } //writeDate = p.lastAccessDate; if (match != NULL) { 2f3fc: 61 14 cp r6, r1 2f3fe: 71 04 cpc r7, r1 2f400: 59 f1 breq .+86 ; 0x2f458 if (strcasecmp(match, filename) == 0) return; 2f402: 61 e9 ldi r22, 0x91 ; 145 2f404: 74 e1 ldi r23, 0x14 ; 20 2f406: c3 01 movw r24, r6 2f408: 0f 94 49 e2 call 0x3c492 ; 0x3c492 2f40c: 89 2b or r24, r25 2f40e: 59 f5 brne .+86 ; 0x2f466 // RAII incrementer for the recursionCnt class _incrementer { public: _incrementer() {recursionCnt++;} ~_incrementer() {recursionCnt--;} 2f410: 80 91 9b 0e lds r24, 0x0E9B ; 0x800e9b 2f414: 81 50 subi r24, 0x01 ; 1 2f416: 80 93 9b 0e sts 0x0E9B, r24 ; 0x800e9b cnt++; break; } } } // while readDir } 2f41a: 0f b6 in r0, 0x3f ; 63 2f41c: f8 94 cli 2f41e: 3e be out 0x3e, r3 ; 62 2f420: 0f be out 0x3f, r0 ; 63 2f422: 2d be out 0x3d, r2 ; 61 2f424: ca 58 subi r28, 0x8A ; 138 2f426: df 4f sbci r29, 0xFF ; 255 2f428: 0f b6 in r0, 0x3f ; 63 2f42a: f8 94 cli 2f42c: de bf out 0x3e, r29 ; 62 2f42e: 0f be out 0x3f, r0 ; 63 2f430: cd bf out 0x3d, r28 ; 61 2f432: df 91 pop r29 2f434: cf 91 pop r28 2f436: 1f 91 pop r17 2f438: 0f 91 pop r16 2f43a: ff 90 pop r15 2f43c: ef 90 pop r14 2f43e: df 90 pop r13 2f440: cf 90 pop r12 2f442: bf 90 pop r11 2f444: af 90 pop r10 2f446: 9f 90 pop r9 2f448: 8f 90 pop r8 2f44a: 7f 90 pop r7 2f44c: 6f 90 pop r6 2f44e: 5f 90 pop r5 2f450: 4f 90 pop r4 2f452: 3f 90 pop r3 2f454: 2f 90 pop r2 2f456: 08 95 ret } //writeDate = p.lastAccessDate; if (match != NULL) { if (strcasecmp(match, filename) == 0) return; } else if (cnt == nrFiles) return; 2f458: 80 91 a7 17 lds r24, 0x17A7 ; 0x8017a7 2f45c: 90 91 a8 17 lds r25, 0x17A8 ; 0x8017a8 2f460: 48 16 cp r4, r24 2f462: 19 06 cpc r1, r25 2f464: a9 f2 breq .-86 ; 0x2f410 cnt++; 2f466: 43 94 inc r4 2f468: 74 cf rjmp .-280 ; 0x2f352 0002f46a : } } void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) 2f46a: cf 92 push r12 2f46c: df 92 push r13 2f46e: ef 92 push r14 2f470: ff 92 push r15 2f472: 0f 93 push r16 2f474: cf 93 push r28 2f476: df 93 push r29 2f478: cd b7 in r28, 0x3d ; 61 2f47a: de b7 in r29, 0x3e ; 62 2f47c: a3 97 sbiw r28, 0x23 ; 35 2f47e: 0f b6 in r0, 0x3f ; 63 2f480: f8 94 cli 2f482: de bf out 0x3e, r29 ; 62 2f484: 0f be out 0x3f, r0 ; 63 2f486: cd bf out 0x3d, r28 ; 61 2f488: 6c 01 movw r12, r24 { curDir=&workDir; 2f48a: 88 e3 ldi r24, 0x38 ; 56 2f48c: e8 2e mov r14, r24 2f48e: 85 e1 ldi r24, 0x15 ; 21 2f490: f8 2e mov r15, r24 2f492: 8a e3 ldi r24, 0x3A ; 58 2f494: 95 e1 ldi r25, 0x15 ; 21 2f496: d7 01 movw r26, r14 2f498: 8d 93 st X+, r24 2f49a: 9c 93 st X, r25 nrFiles=nr; 2f49c: 10 92 a8 17 sts 0x17A8, r1 ; 0x8017a8 2f4a0: 10 92 a7 17 sts 0x17A7, r1 ; 0x8017a7 curDir->rewind(); 2f4a4: 0e 94 c4 76 call 0xed88 ; 0xed88 }; struct ls_param { bool LFN : 1; bool timestamp : 1; inline ls_param():LFN(0), timestamp(0) { } 2f4a8: 00 e0 ldi r16, 0x00 ; 0 2f4aa: 0e 7f andi r16, 0xFE ; 254 2f4ac: 0d 7f andi r16, 0xFD ; 253 lsDive("",*curDir,match, LS_GetFilename); 2f4ae: d7 01 movw r26, r14 2f4b0: ed 91 ld r30, X+ 2f4b2: fc 91 ld r31, X 2f4b4: 83 e2 ldi r24, 0x23 ; 35 2f4b6: de 01 movw r26, r28 2f4b8: 11 96 adiw r26, 0x01 ; 1 2f4ba: 01 90 ld r0, Z+ 2f4bc: 0d 92 st X+, r0 2f4be: 8a 95 dec r24 2f4c0: e1 f7 brne .-8 ; 0x2f4ba 2f4c2: 22 e0 ldi r18, 0x02 ; 2 2f4c4: a6 01 movw r20, r12 2f4c6: be 01 movw r22, r28 2f4c8: 6f 5f subi r22, 0xFF ; 255 2f4ca: 7f 4f sbci r23, 0xFF ; 255 2f4cc: 86 ef ldi r24, 0xF6 ; 246 2f4ce: 92 e0 ldi r25, 0x02 ; 2 2f4d0: 0f 94 06 78 call 0x2f00c ; 0x2f00c 2f4d4: ce 01 movw r24, r28 2f4d6: 01 96 adiw r24, 0x01 ; 1 2f4d8: 0e 94 c9 76 call 0xed92 ; 0xed92 } 2f4dc: a3 96 adiw r28, 0x23 ; 35 2f4de: 0f b6 in r0, 0x3f ; 63 2f4e0: f8 94 cli 2f4e2: de bf out 0x3e, r29 ; 62 2f4e4: 0f be out 0x3f, r0 ; 63 2f4e6: cd bf out 0x3d, r28 ; 61 2f4e8: df 91 pop r29 2f4ea: cf 91 pop r28 2f4ec: 0f 91 pop r16 2f4ee: ff 90 pop r15 2f4f0: ef 90 pop r14 2f4f2: df 90 pop r13 2f4f4: cf 90 pop r12 2f4f6: 08 95 ret 0002f4f8 : void CardReader::getfilename_simple(uint16_t entry, const char * const match/*=NULL*/) 2f4f8: ef 92 push r14 2f4fa: ff 92 push r15 2f4fc: 0f 93 push r16 2f4fe: cf 93 push r28 2f500: df 93 push r29 2f502: cd b7 in r28, 0x3d ; 61 2f504: de b7 in r29, 0x3e ; 62 2f506: a3 97 sbiw r28, 0x23 ; 35 2f508: 0f b6 in r0, 0x3f ; 63 2f50a: f8 94 cli 2f50c: de bf out 0x3e, r29 ; 62 2f50e: 0f be out 0x3f, r0 ; 63 2f510: cd bf out 0x3d, r28 ; 61 { curDir = &workDir; 2f512: 28 e3 ldi r18, 0x38 ; 56 2f514: e2 2e mov r14, r18 2f516: 25 e1 ldi r18, 0x15 ; 21 2f518: f2 2e mov r15, r18 2f51a: 2a e3 ldi r18, 0x3A ; 58 2f51c: 35 e1 ldi r19, 0x15 ; 21 2f51e: d7 01 movw r26, r14 2f520: 2d 93 st X+, r18 2f522: 3c 93 st X, r19 nrFiles = 0; 2f524: 10 92 a8 17 sts 0x17A8, r1 ; 0x8017a8 2f528: 10 92 a7 17 sts 0x17A7, r1 ; 0x8017a7 curDir->seekSet((uint32_t)entry << 5); 2f52c: b0 e0 ldi r27, 0x00 ; 0 2f52e: a0 e0 ldi r26, 0x00 ; 0 2f530: ac 01 movw r20, r24 2f532: bd 01 movw r22, r26 2f534: e5 e0 ldi r30, 0x05 ; 5 2f536: 44 0f add r20, r20 2f538: 55 1f adc r21, r21 2f53a: 66 1f adc r22, r22 2f53c: 77 1f adc r23, r23 2f53e: ea 95 dec r30 2f540: d1 f7 brne .-12 ; 0x2f536 2f542: c9 01 movw r24, r18 2f544: 0f 94 89 57 call 0x2af12 ; 0x2af12 2f548: 00 e0 ldi r16, 0x00 ; 0 2f54a: 0e 7f andi r16, 0xFE ; 254 2f54c: 0d 7f andi r16, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 2f54e: d7 01 movw r26, r14 2f550: ed 91 ld r30, X+ 2f552: fc 91 ld r31, X 2f554: 83 e2 ldi r24, 0x23 ; 35 2f556: de 01 movw r26, r28 2f558: 11 96 adiw r26, 0x01 ; 1 2f55a: 01 90 ld r0, Z+ 2f55c: 0d 92 st X+, r0 2f55e: 8a 95 dec r24 2f560: e1 f7 brne .-8 ; 0x2f55a 2f562: 22 e0 ldi r18, 0x02 ; 2 2f564: 50 e0 ldi r21, 0x00 ; 0 2f566: 40 e0 ldi r20, 0x00 ; 0 2f568: be 01 movw r22, r28 2f56a: 6f 5f subi r22, 0xFF ; 255 2f56c: 7f 4f sbci r23, 0xFF ; 255 2f56e: 86 ef ldi r24, 0xF6 ; 246 2f570: 92 e0 ldi r25, 0x02 ; 2 2f572: 0f 94 06 78 call 0x2f00c ; 0x2f00c 2f576: ce 01 movw r24, r28 2f578: 01 96 adiw r24, 0x01 ; 1 2f57a: 0e 94 c9 76 call 0xed92 ; 0xed92 } 2f57e: a3 96 adiw r28, 0x23 ; 35 2f580: 0f b6 in r0, 0x3f ; 63 2f582: f8 94 cli 2f584: de bf out 0x3e, r29 ; 62 2f586: 0f be out 0x3f, r0 ; 63 2f588: cd bf out 0x3d, r28 ; 61 2f58a: df 91 pop r29 2f58c: cf 91 pop r28 2f58e: 0f 91 pop r16 2f590: ff 90 pop r15 2f592: ef 90 pop r14 2f594: 08 95 ret 0002f596 : nrFiles = 1; curDir->seekSet(position); lsDive("", *curDir, match, LS_GetFilename); } uint16_t CardReader::getnrfilenames() 2f596: cf 92 push r12 2f598: df 92 push r13 2f59a: ef 92 push r14 2f59c: ff 92 push r15 2f59e: 0f 93 push r16 2f5a0: cf 93 push r28 2f5a2: df 93 push r29 2f5a4: cd b7 in r28, 0x3d ; 61 2f5a6: de b7 in r29, 0x3e ; 62 2f5a8: a3 97 sbiw r28, 0x23 ; 35 2f5aa: 0f b6 in r0, 0x3f ; 63 2f5ac: f8 94 cli 2f5ae: de bf out 0x3e, r29 ; 62 2f5b0: 0f be out 0x3f, r0 ; 63 2f5b2: cd bf out 0x3d, r28 ; 61 { curDir=&workDir; 2f5b4: 88 e3 ldi r24, 0x38 ; 56 2f5b6: c8 2e mov r12, r24 2f5b8: 85 e1 ldi r24, 0x15 ; 21 2f5ba: d8 2e mov r13, r24 2f5bc: 8a e3 ldi r24, 0x3A ; 58 2f5be: 95 e1 ldi r25, 0x15 ; 21 2f5c0: d6 01 movw r26, r12 2f5c2: 8d 93 st X+, r24 2f5c4: 9c 93 st X, r25 nrFiles=0; 2f5c6: 27 ea ldi r18, 0xA7 ; 167 2f5c8: e2 2e mov r14, r18 2f5ca: 27 e1 ldi r18, 0x17 ; 23 2f5cc: f2 2e mov r15, r18 2f5ce: f7 01 movw r30, r14 2f5d0: 11 82 std Z+1, r1 ; 0x01 2f5d2: 10 82 st Z, r1 curDir->rewind(); 2f5d4: 0e 94 c4 76 call 0xed88 ; 0xed88 2f5d8: 00 e0 ldi r16, 0x00 ; 0 2f5da: 0e 7f andi r16, 0xFE ; 254 2f5dc: 0d 7f andi r16, 0xFD ; 253 lsDive("",*curDir, NULL, LS_Count); 2f5de: d6 01 movw r26, r12 2f5e0: ed 91 ld r30, X+ 2f5e2: fc 91 ld r31, X 2f5e4: 83 e2 ldi r24, 0x23 ; 35 2f5e6: de 01 movw r26, r28 2f5e8: 11 96 adiw r26, 0x01 ; 1 2f5ea: 01 90 ld r0, Z+ 2f5ec: 0d 92 st X+, r0 2f5ee: 8a 95 dec r24 2f5f0: e1 f7 brne .-8 ; 0x2f5ea 2f5f2: 21 e0 ldi r18, 0x01 ; 1 2f5f4: 50 e0 ldi r21, 0x00 ; 0 2f5f6: 40 e0 ldi r20, 0x00 ; 0 2f5f8: be 01 movw r22, r28 2f5fa: 6f 5f subi r22, 0xFF ; 255 2f5fc: 7f 4f sbci r23, 0xFF ; 255 2f5fe: 86 ef ldi r24, 0xF6 ; 246 2f600: 92 e0 ldi r25, 0x02 ; 2 2f602: 0f 94 06 78 call 0x2f00c ; 0x2f00c 2f606: ce 01 movw r24, r28 2f608: 01 96 adiw r24, 0x01 ; 1 2f60a: 0e 94 c9 76 call 0xed92 ; 0xed92 //SERIAL_ECHOLN(nrFiles); return nrFiles; } 2f60e: f7 01 movw r30, r14 2f610: 80 81 ld r24, Z 2f612: 91 81 ldd r25, Z+1 ; 0x01 2f614: a3 96 adiw r28, 0x23 ; 35 2f616: 0f b6 in r0, 0x3f ; 63 2f618: f8 94 cli 2f61a: de bf out 0x3e, r29 ; 62 2f61c: 0f be out 0x3f, r0 ; 63 2f61e: cd bf out 0x3d, r28 ; 61 2f620: df 91 pop r29 2f622: cf 91 pop r28 2f624: 0f 91 pop r16 2f626: ff 90 pop r15 2f628: ef 90 pop r14 2f62a: df 90 pop r13 2f62c: cf 90 pop r12 2f62e: 08 95 ret 0002f630 : file.getFilename(t); else t[0]=0; } void CardReader::printAbsFilenameFast() 2f630: cf 93 push r28 2f632: df 93 push r29 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 2f634: 8f e2 ldi r24, 0x2F ; 47 2f636: 0e 94 cf 76 call 0xed9e ; 0xed9e { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2f63a: c0 e0 ldi r28, 0x00 ; 0 { SERIAL_PROTOCOL(dir_names[i]); 2f63c: d9 e0 ldi r29, 0x09 ; 9 } void CardReader::printAbsFilenameFast() { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2f63e: 80 91 2f 16 lds r24, 0x162F ; 0x80162f 2f642: c8 17 cp r28, r24 2f644: 60 f4 brcc .+24 ; 0x2f65e { SERIAL_PROTOCOL(dir_names[i]); 2f646: cd 9f mul r28, r29 2f648: c0 01 movw r24, r0 2f64a: 11 24 eor r1, r1 2f64c: 81 52 subi r24, 0x21 ; 33 2f64e: 9b 4e sbci r25, 0xEB ; 235 2f650: 0e 94 ac 87 call 0x10f58 ; 0x10f58 2f654: 8f e2 ldi r24, 0x2F ; 47 2f656: 0e 94 cf 76 call 0xed9e ; 0xed9e } void CardReader::printAbsFilenameFast() { SERIAL_PROTOCOL('/'); for (uint8_t i = 0; i < getWorkDirDepth(); i++) 2f65a: cf 5f subi r28, 0xFF ; 255 2f65c: f0 cf rjmp .-32 ; 0x2f63e { SERIAL_PROTOCOL(dir_names[i]); SERIAL_PROTOCOL('/'); } SERIAL_PROTOCOL(LONGEST_FILENAME); 2f65e: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2f662: 81 11 cpse r24, r1 2f664: 06 c0 rjmp .+12 ; 0x2f672 2f666: 81 e9 ldi r24, 0x91 ; 145 2f668: 94 e1 ldi r25, 0x14 ; 20 } 2f66a: df 91 pop r29 2f66c: cf 91 pop r28 2f66e: 0c 94 ac 87 jmp 0x10f58 ; 0x10f58 for (uint8_t i = 0; i < getWorkDirDepth(); i++) { SERIAL_PROTOCOL(dir_names[i]); SERIAL_PROTOCOL('/'); } SERIAL_PROTOCOL(LONGEST_FILENAME); 2f672: 86 ea ldi r24, 0xA6 ; 166 2f674: 94 e1 ldi r25, 0x14 ; 20 2f676: f9 cf rjmp .-14 ; 0x2f66a 0002f678 : 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) { 2f678: cf 92 push r12 2f67a: df 92 push r13 2f67c: ef 92 push r14 2f67e: ff 92 push r15 2f680: 6b 01 movw r12, r22 2f682: 7c 01 movw r14, r24 eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add); 2f684: 88 ea ldi r24, 0xA8 ; 168 2f686: 9c e0 ldi r25, 0x0C ; 12 2f688: 0f 94 18 dc call 0x3b830 ; 0x3b830 2f68c: ab 01 movw r20, r22 2f68e: bc 01 movw r22, r24 2f690: 4c 0d add r20, r12 2f692: 5d 1d adc r21, r13 2f694: 6e 1d adc r22, r14 2f696: 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); 2f698: 88 ea ldi r24, 0xA8 ; 168 2f69a: 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); } 2f69c: ff 90 pop r15 2f69e: ef 90 pop r14 2f6a0: df 90 pop r13 2f6a2: 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); 2f6a4: 0d 94 66 dc jmp 0x3b8cc ; 0x3b8cc 0002f6a8 : return def; } return val; } uint32_t __attribute__((noinline)) eeprom_init_default_dword(uint32_t *__p, uint32_t def) { 2f6a8: cf 93 push r28 2f6aa: df 93 push r29 2f6ac: ec 01 movw r28, r24 uint32_t val = eeprom_read_dword(__p); 2f6ae: 0f 94 18 dc call 0x3b830 ; 0x3b830 if (val == EEPROM_EMPTY_VALUE32) { 2f6b2: 6f 3f cpi r22, 0xFF ; 255 2f6b4: 2f ef ldi r18, 0xFF ; 255 2f6b6: 72 07 cpc r23, r18 2f6b8: 82 07 cpc r24, r18 2f6ba: 92 07 cpc r25, r18 2f6bc: 49 f4 brne .+18 ; 0x2f6d0 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); 2f6be: 40 e0 ldi r20, 0x00 ; 0 2f6c0: 50 e0 ldi r21, 0x00 ; 0 2f6c2: ba 01 movw r22, r20 2f6c4: ce 01 movw r24, r28 2f6c6: 0f 94 66 dc call 0x3b8cc ; 0x3b8cc 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; 2f6ca: 60 e0 ldi r22, 0x00 ; 0 2f6cc: 70 e0 ldi r23, 0x00 ; 0 2f6ce: cb 01 movw r24, r22 } return val; } 2f6d0: df 91 pop r29 2f6d2: cf 91 pop r28 2f6d4: 08 95 ret 0002f6d6 : } // 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; 2f6d6: e7 e2 ldi r30, 0x27 ; 39 2f6d8: f7 e1 ldi r31, 0x17 ; 23 2f6da: 40 81 ld r20, Z 2f6dc: 51 81 ldd r21, Z+1 ; 0x01 2f6de: 62 81 ldd r22, Z+2 ; 0x02 2f6e0: 73 81 ldd r23, Z+3 ; 0x03 2f6e2: 48 0f add r20, r24 2f6e4: 59 1f adc r21, r25 2f6e6: 61 1d adc r22, r1 2f6e8: 71 1d adc r23, r1 2f6ea: 40 83 st Z, r20 2f6ec: 51 83 std Z+1, r21 ; 0x01 2f6ee: 62 83 std Z+2, r22 ; 0x02 2f6f0: 73 83 std Z+3, r23 ; 0x03 } 2f6f2: 08 95 ret 0002f6f4 : // make the rdptr point to a safe location - end of file gfReadPtr = gfBlockBuffBegin() + 512; return -1; } bool SdFile::gfEnsureBlock(){ 2f6f4: 0f 93 push r16 2f6f6: 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_ ){ 2f6f8: 60 91 3c 17 lds r22, 0x173C ; 0x80173c 2f6fc: 70 91 3d 17 lds r23, 0x173D ; 0x80173d 2f700: 80 91 3e 17 lds r24, 0x173E ; 0x80173e 2f704: 90 91 3f 17 lds r25, 0x173F ; 0x80173f 2f708: 00 91 90 0e lds r16, 0x0E90 ; 0x800e90 2f70c: 10 91 91 0e lds r17, 0x0E91 ; 0x800e91 2f710: 20 91 92 0e lds r18, 0x0E92 ; 0x800e92 2f714: 30 91 93 0e lds r19, 0x0E93 ; 0x800e93 2f718: 60 17 cp r22, r16 2f71a: 71 07 cpc r23, r17 2f71c: 82 07 cpc r24, r18 2f71e: 93 07 cpc r25, r19 2f720: 39 f1 breq .+78 ; 0x2f770 if ( ! vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){ 2f722: 40 e0 ldi r20, 0x00 ; 0 2f724: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 2f728: 88 23 and r24, r24 2f72a: f9 f0 breq .+62 ; 0x2f76a return false; } // terminate with a '\n' const uint32_t terminateOfs = fileSize_ - gfOffset; 2f72c: 20 91 40 17 lds r18, 0x1740 ; 0x801740 2f730: 30 91 41 17 lds r19, 0x1741 ; 0x801741 2f734: 40 91 30 17 lds r20, 0x1730 ; 0x801730 2f738: 50 91 31 17 lds r21, 0x1731 ; 0x801731 2f73c: 60 91 32 17 lds r22, 0x1732 ; 0x801732 2f740: 70 91 33 17 lds r23, 0x1733 ; 0x801733 2f744: 42 1b sub r20, r18 2f746: 53 0b sbc r21, r19 2f748: 61 09 sbc r22, r1 2f74a: 71 09 sbc r23, r1 vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; 2f74c: 41 30 cpi r20, 0x01 ; 1 2f74e: 92 e0 ldi r25, 0x02 ; 2 2f750: 59 07 cpc r21, r25 2f752: 61 05 cpc r22, r1 2f754: 71 05 cpc r23, r1 2f756: 20 f0 brcs .+8 ; 0x2f760 2f758: 40 e0 ldi r20, 0x00 ; 0 2f75a: 52 e0 ldi r21, 0x02 ; 2 2f75c: 60 e0 ldi r22, 0x00 ; 0 2f75e: 70 e0 ldi r23, 0x00 ; 0 2f760: 44 56 subi r20, 0x64 ; 100 2f762: 51 4f sbci r21, 0xF1 ; 241 2f764: 9a e0 ldi r25, 0x0A ; 10 2f766: fa 01 movw r30, r20 2f768: 90 83 st Z, r25 } return true; } 2f76a: 1f 91 pop r17 2f76c: 0f 91 pop r16 2f76e: 08 95 ret } // terminate with a '\n' const uint32_t terminateOfs = fileSize_ - gfOffset; vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n'; } return true; 2f770: 81 e0 ldi r24, 0x01 ; 1 2f772: fb cf rjmp .-10 ; 0x2f76a 0002f774 : } static uint8_t twi_start(uint8_t address, uint8_t reg) 2f774: cf 93 push r28 2f776: df 93 push r29 2f778: d8 2f mov r29, r24 { // send start condition TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); 2f77a: 84 ea ldi r24, 0xA4 ; 164 2f77c: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_START)) 2f780: 88 e0 ldi r24, 0x08 ; 8 2f782: 0f 94 95 2a call 0x2552a ; 0x2552a 2f786: 81 11 cpse r24, r1 2f788: 16 c0 rjmp .+44 ; 0x2f7b6 return 1; // send address TWDR = TW_WRITE | (address << 1); 2f78a: 8a ee ldi r24, 0xEA ; 234 2f78c: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2f790: c4 e8 ldi r28, 0x84 ; 132 2f792: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_SLA_ACK)) 2f796: 88 e1 ldi r24, 0x18 ; 24 2f798: 0f 94 95 2a call 0x2552a ; 0x2552a 2f79c: 81 11 cpse r24, r1 2f79e: 0f c0 rjmp .+30 ; 0x2f7be return 2; // send register TWDR = reg; 2f7a0: d0 93 bb 00 sts 0x00BB, r29 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2f7a4: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_DATA_ACK)) 2f7a8: 88 e2 ldi r24, 0x28 ; 40 2f7aa: 0f 94 95 2a call 0x2552a ; 0x2552a 2f7ae: 88 23 and r24, r24 2f7b0: 19 f0 breq .+6 ; 0x2f7b8 return 3; 2f7b2: 83 e0 ldi r24, 0x03 ; 3 2f7b4: 01 c0 rjmp .+2 ; 0x2f7b8 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; 2f7b6: 81 e0 ldi r24, 0x01 ; 1 TWCR = _BV(TWEN) | _BV(TWINT); if(twi_wait(TW_MT_DATA_ACK)) return 3; return 0; } 2f7b8: df 91 pop r29 2f7ba: cf 91 pop r28 2f7bc: 08 95 ret // send address TWDR = TW_WRITE | (address << 1); TWCR = _BV(TWEN) | _BV(TWINT); if(twi_wait(TW_MT_SLA_ACK)) return 2; 2f7be: 82 e0 ldi r24, 0x02 ; 2 2f7c0: fb cf rjmp .-10 ; 0x2f7b8 0002f7c2 : ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; } return ret; } void PAT9125_sensor::resetStepCount() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; } 2f7c2: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 2f7c4: f8 94 cli 2f7c6: 10 92 bb 17 sts 0x17BB, r1 ; 0x8017bb 2f7ca: 10 92 ba 17 sts 0x17BA, r1 ; 0x8017ba (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2f7ce: 8f bf out 0x3f, r24 ; 63 } 2f7d0: 08 95 ret 0002f7d2 : 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); 2f7d2: 87 e6 ldi r24, 0x67 ; 103 2f7d4: 9f e0 ldi r25, 0x0F ; 15 2f7d6: 0f 94 10 dc call 0x3b820 ; 0x3b820 2f7da: 91 e0 ldi r25, 0x01 ; 1 2f7dc: 81 11 cpse r24, r1 2f7de: 01 c0 rjmp .+2 ; 0x2f7e2 2f7e0: 90 e0 ldi r25, 0x00 ; 0 if ((state != State::disabled) != enabled) { 2f7e2: 81 e0 ldi r24, 0x01 ; 1 2f7e4: 20 91 a9 17 lds r18, 0x17A9 ; 0x8017a9 2f7e8: 21 11 cpse r18, r1 2f7ea: 01 c0 rjmp .+2 ; 0x2f7ee 2f7ec: 80 e0 ldi r24, 0x00 ; 0 2f7ee: 98 13 cpse r25, r24 state = enabled ? State::initializing : State::disabled; 2f7f0: 90 93 a9 17 sts 0x17A9, r25 ; 0x8017a9 } autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED); 2f7f4: 87 e0 ldi r24, 0x07 ; 7 2f7f6: 9f e0 ldi r25, 0x0F ; 15 2f7f8: 0f 94 10 dc call 0x3b820 ; 0x3b820 2f7fc: 91 e0 ldi r25, 0x01 ; 1 2f7fe: 81 11 cpse r24, r1 2f800: 01 c0 rjmp .+2 ; 0x2f804 2f802: 90 e0 ldi r25, 0x00 ; 0 2f804: 90 93 aa 17 sts 0x17AA, r25 ; 0x8017aa runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED); 2f808: 85 ed ldi r24, 0xD5 ; 213 2f80a: 9e e0 ldi r25, 0x0E ; 14 2f80c: 0f 94 10 dc call 0x3b820 ; 0x3b820 2f810: 91 e0 ldi r25, 0x01 ; 1 2f812: 81 11 cpse r24, r1 2f814: 01 c0 rjmp .+2 ; 0x2f818 2f816: 90 e0 ldi r25, 0x00 ; 0 2f818: 90 93 ab 17 sts 0x17AB, r25 ; 0x8017ab sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA); 2f81c: 87 e4 ldi r24, 0x47 ; 71 2f81e: 9d e0 ldi r25, 0x0D ; 13 2f820: 0f 94 10 dc call 0x3b820 ; 0x3b820 if (sensorActionOnError == SensorActionOnError::_Undef) { 2f824: 8f 3f cpi r24, 0xFF ; 255 2f826: c9 f0 breq .+50 ; 0x2f85a 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); 2f828: 80 93 b1 17 sts 0x17B1, r24 ; 0x8017b1 } 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)); 2f82c: 8d ea ldi r24, 0xAD ; 173 2f82e: 9c e0 ldi r25, 0x0C ; 12 2f830: 0f 94 10 dc call 0x3b820 ; 0x3b820 2f834: 91 e0 ldi r25, 0x01 ; 1 2f836: 81 11 cpse r24, r1 2f838: 01 c0 rjmp .+2 ; 0x2f83c 2f83a: 90 e0 ldi r25, 0x00 ; 0 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 2f83c: 90 93 b7 17 sts 0x17B7, r25 ; 0x8017b7 oldPos = pat9125_y; 2f840: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 2f844: 90 91 8f 0e lds r25, 0x0E8F ; 0x800e8f 2f848: 90 93 b9 17 sts 0x17B9, r25 ; 0x8017b9 2f84c: 80 93 b8 17 sts 0x17B8, r24 ; 0x8017b8 resetStepCount(); 2f850: 0f 94 e1 7b call 0x2f7c2 ; 0x2f7c2 jamErrCnt = 0; 2f854: 10 92 be 17 sts 0x17BE, r1 ; 0x8017be 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)); } 2f858: 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; 2f85a: 10 92 b1 17 sts 0x17B1, r1 ; 0x8017b1 2f85e: e6 cf rjmp .-52 ; 0x2f82c 0002f860 : #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) { 2f860: 80 91 a9 17 lds r24, 0x17A9 ; 0x8017a9 2f864: 83 30 cpi r24, 0x03 ; 3 2f866: 21 f4 brne .+8 ; 0x2f870 } void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; 2f868: 10 92 a9 17 sts 0x17A9, r1 ; 0x8017a9 filter = 0; 2f86c: 10 92 b5 17 sts 0x17B5, r1 ; 0x8017b5 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 2f870: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 int16_t stepCount; int16_t chunkSteps; uint8_t jamErrCnt; constexpr void calcChunkSteps(float u) { chunkSteps = (int16_t)(1.25 * u); //[mm] 2f874: 20 e0 ldi r18, 0x00 ; 0 2f876: 30 e0 ldi r19, 0x00 ; 0 2f878: 40 ea ldi r20, 0xA0 ; 160 2f87a: 5f e3 ldi r21, 0x3F ; 63 2f87c: 60 91 cd 0d lds r22, 0x0DCD ; 0x800dcd 2f880: 70 91 ce 0d lds r23, 0x0DCE ; 0x800dce 2f884: 80 91 cf 0d lds r24, 0x0DCF ; 0x800dcf 2f888: 90 91 d0 0d lds r25, 0x0DD0 ; 0x800dd0 2f88c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 2f890: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 2f894: 70 93 bd 17 sts 0x17BD, r23 ; 0x8017bd 2f898: 60 93 bc 17 sts 0x17BC, r22 ; 0x8017bc void twi_init(void) { // activate internal pullups for SDA SET_INPUT(SDA_PIN); 2f89c: 51 98 cbi 0x0a, 1 ; 10 WRITE(SDA_PIN, 1); 2f89e: 59 9a sbi 0x0b, 1 ; 11 // start with the SDA pulled low WRITE(SCL_PIN, 0); 2f8a0: 58 98 cbi 0x0b, 0 ; 11 SET_OUTPUT(SCL_PIN); 2f8a2: 50 9a sbi 0x0a, 0 ; 10 2f8a4: 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); 2f8a6: 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); 2f8a8: 95 e0 ldi r25, 0x05 ; 5 2f8aa: 9a 95 dec r25 2f8ac: f1 f7 brne .-4 ; 0x2f8aa 2f8ae: 00 00 nop _delay_us((1000000 / TWI_FREQ) / 2); WRITE(SCL_PIN, 0); 2f8b0: 58 98 cbi 0x0b, 0 ; 11 2f8b2: 95 e0 ldi r25, 0x05 ; 5 2f8b4: 9a 95 dec r25 2f8b6: f1 f7 brne .-4 ; 0x2f8b4 2f8b8: 00 00 nop 2f8ba: 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++) { 2f8bc: a1 f7 brne .-24 ; 0x2f8a6 WRITE(SCL_PIN, 0); _delay_us((1000000 / TWI_FREQ) / 2); } // activate internal pullups for SCL SET_INPUT(SCL_PIN); 2f8be: 50 98 cbi 0x0a, 0 ; 10 WRITE(SCL_PIN, 1); 2f8c0: 58 9a sbi 0x0b, 0 ; 11 // initialize twi prescaler and bit rate TWSR &= ~(_BV(TWPS0) | _BV(TWPS1)); 2f8c2: 80 91 b9 00 lds r24, 0x00B9 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> 2f8c6: 8c 7f andi r24, 0xFC ; 252 2f8c8: 80 93 b9 00 sts 0x00B9, r24 ; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9> TWBR = ((F_CPU / TWI_FREQ) - 16) / 2; 2f8cc: 8c e0 ldi r24, 0x0C ; 12 2f8ce: 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); 2f8d2: 84 ea ldi r24, 0xA4 ; 164 2f8d4: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_START)) 2f8d8: 88 e0 ldi r24, 0x08 ; 8 2f8da: 0f 94 95 2a call 0x2552a ; 0x2552a 2f8de: 81 11 cpse r24, r1 2f8e0: 68 c0 rjmp .+208 ; 0x2f9b2 return 1; // send address TWDR = TW_WRITE | (address << 1); 2f8e2: 8a ee ldi r24, 0xEA ; 234 2f8e4: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 2f8e8: 84 e8 ldi r24, 0x84 ; 132 2f8ea: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_SLA_ACK)) 2f8ee: 88 e1 ldi r24, 0x18 ; 24 2f8f0: 0f 94 95 2a call 0x2552a ; 0x2552a 2f8f4: 81 11 cpse r24, r1 2f8f6: 5d c0 rjmp .+186 ; 0x2f9b2 } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 2f8f8: 84 e9 ldi r24, 0x94 ; 148 2f8fa: 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); 2f8fe: 60 e0 ldi r22, 0x00 ; 0 2f900: 8f e7 ldi r24, 0x7F ; 127 2f902: 0f 94 02 c2 call 0x38404 ; 0x38404 // Verify that the sensor responds with its correct product ID. pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); 2f906: 80 e0 ldi r24, 0x00 ; 0 2f908: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f90c: 80 93 bc 0d sts 0x0DBC, r24 ; 0x800dbc pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2f910: 81 e0 ldi r24, 0x01 ; 1 2f912: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f916: 80 93 bb 0d sts 0x0DBB, r24 ; 0x800dbb if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) 2f91a: 90 91 bc 0d lds r25, 0x0DBC ; 0x800dbc 2f91e: 91 33 cpi r25, 0x31 ; 49 2f920: b9 f5 brne .+110 ; 0x2f990 2f922: 81 39 cpi r24, 0x91 ; 145 2f924: a9 f5 brne .+106 ; 0x2f990 } #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); 2f926: 67 e9 ldi r22, 0x97 ; 151 2f928: 86 e0 ldi r24, 0x06 ; 6 2f92a: 0f 94 02 c2 call 0x38404 ; 0x38404 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); 2f92e: 8f e9 ldi r24, 0x9F ; 159 2f930: 9f e0 ldi r25, 0x0F ; 15 2f932: 01 97 sbiw r24, 0x01 ; 1 2f934: f1 f7 brne .-4 ; 0x2f932 2f936: 00 c0 rjmp .+0 ; 0x2f938 2f938: 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)) 2f93a: 84 e3 ldi r24, 0x34 ; 52 2f93c: 9a ea ldi r25, 0xAA ; 170 2f93e: 0f 94 4a c2 call 0x38494 ; 0x38494 2f942: 88 23 and r24, r24 2f944: b1 f1 breq .+108 ; 0x2f9b2 2f946: 8f e3 ldi r24, 0x3F ; 63 2f948: 9c e9 ldi r25, 0x9C ; 156 2f94a: 01 97 sbiw r24, 0x01 ; 1 2f94c: f1 f7 brne .-4 ; 0x2f94a 2f94e: 00 c0 rjmp .+0 ; 0x2f950 2f950: 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); 2f952: 61 e0 ldi r22, 0x01 ; 1 2f954: 8f e7 ldi r24, 0x7F ; 127 2f956: 0f 94 02 c2 call 0x38404 ; 0x38404 //Write init sequence in bank1. MUST ALREADY BE IN bank1. if (!pat9125_wr_seq(pat9125_init_bank1)) 2f95a: 81 e0 ldi r24, 0x01 ; 1 2f95c: 9a ea ldi r25, 0xAA ; 170 2f95e: 0f 94 4a c2 call 0x38494 ; 0x38494 2f962: 88 23 and r24, r24 2f964: 31 f1 breq .+76 ; 0x2f9b2 return 0; // Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register. pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00); 2f966: 60 e0 ldi r22, 0x00 ; 0 2f968: 8f e7 ldi r24, 0x7F ; 127 2f96a: 0f 94 02 c2 call 0x38404 ; 0x38404 // Enable write protect. pat9125_wr_reg(PAT9125_WP, 0x00); //prevents writing to registers over 0x09 2f96e: 60 e0 ldi r22, 0x00 ; 0 2f970: 89 e0 ldi r24, 0x09 ; 9 2f972: 0f 94 02 c2 call 0x38404 ; 0x38404 pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1); 2f976: 80 e0 ldi r24, 0x00 ; 0 2f978: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f97c: 80 93 bc 0d sts 0x0DBC, r24 ; 0x800dbc pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2f980: 81 e0 ldi r24, 0x01 ; 1 2f982: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f986: 80 93 bb 0d sts 0x0DBB, r24 ; 0x800dbb deinit(); triggerError(); ; // } #ifdef IR_SENSOR_PIN else if (!READ(IR_SENSOR_PIN)) { 2f98a: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 2f98e: 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); 2f990: 80 e0 ldi r24, 0x00 ; 0 2f992: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f996: 80 93 bc 0d sts 0x0DBC, r24 ; 0x800dbc pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2); 2f99a: 81 e0 ldi r24, 0x01 ; 1 2f99c: 0f 94 1d c2 call 0x3843a ; 0x3843a 2f9a0: 80 93 bb 0d sts 0x0DBB, r24 ; 0x800dbb if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91)) 2f9a4: 90 91 bc 0d lds r25, 0x0DBC ; 0x800dbc 2f9a8: 91 33 cpi r25, 0x31 ; 49 2f9aa: 19 f4 brne .+6 ; 0x2f9b2 2f9ac: 81 39 cpi r24, 0x91 ; 145 2f9ae: 09 f4 brne .+2 ; 0x2f9b2 2f9b0: ba cf rjmp .-140 ; 0x2f926 void PAT9125_sensor::deinit() { // puts_P(PSTR("fsensor::deinit()")); ; // state = State::disabled; filter = 0; 2f9b2: 10 92 b5 17 sts 0x17B5, r1 ; 0x8017b5 eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); enquecommand_front_P(MSG_M600); } void Filament_sensor::triggerError() { state = State::error; 2f9b6: 83 e0 ldi r24, 0x03 ; 3 2f9b8: 80 93 a9 17 sts 0x17A9, r24 ; 0x8017a9 #ifdef IR_SENSOR_PIN else if (!READ(IR_SENSOR_PIN)) { ; // MK3 fw on MK3S printer } #endif // IR_SENSOR_PIN } 2f9bc: 08 95 ret 0002f9be : 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() { 2f9be: cf 93 push r28 2f9c0: df 93 push r29 if (jamDetection) { 2f9c2: 80 91 b7 17 lds r24, 0x17B7 ; 0x8017b7 2f9c6: 88 23 and r24, r24 2f9c8: 09 f4 brne .+2 ; 0x2f9cc 2f9ca: 62 c0 rjmp .+196 ; 0x2fa90 setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION)); } int16_t PAT9125_sensor::getStepCount() { int16_t ret; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; } 2f9cc: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 2f9ce: f8 94 cli 2f9d0: c0 91 ba 17 lds r28, 0x17BA ; 0x8017ba 2f9d4: d0 91 bb 17 lds r29, 0x17BB ; 0x8017bb (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 2f9d8: 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 2f9da: ce 01 movw r24, r28 2f9dc: d7 ff sbrs r29, 7 2f9de: 04 c0 rjmp .+8 ; 0x2f9e8 2f9e0: 88 27 eor r24, r24 2f9e2: 99 27 eor r25, r25 2f9e4: 8c 1b sub r24, r28 2f9e6: 9d 0b sbc r25, r29 2f9e8: 20 91 bc 17 lds r18, 0x17BC ; 0x8017bc 2f9ec: 30 91 bd 17 lds r19, 0x17BD ; 0x8017bd 2f9f0: 82 17 cp r24, r18 2f9f2: 93 07 cpc r25, r19 2f9f4: 4c f1 brlt .+82 ; 0x2fa48 resetStepCount(); 2f9f6: 0f 94 e1 7b call 0x2f7c2 ; 0x2f7c2 if (!pat9125_update()) { // get up to date data. reinit on error. 2f9fa: 0f 94 68 c2 call 0x384d0 ; 0x384d0 2f9fe: 81 11 cpse r24, r1 2fa00: 02 c0 rjmp .+4 ; 0x2fa06 init(); // try to reinit. 2fa02: 0f 94 30 7c call 0x2f860 ; 0x2f860 } bool fsDir = (pat9125_y - oldPos) > 0; 2fa06: 20 91 8e 0e lds r18, 0x0E8E ; 0x800e8e 2fa0a: 30 91 8f 0e lds r19, 0x0E8F ; 0x800e8f 2fa0e: 80 91 be 17 lds r24, 0x17BE ; 0x8017be 2fa12: 40 91 b8 17 lds r20, 0x17B8 ; 0x8017b8 2fa16: 50 91 b9 17 lds r21, 0x17B9 ; 0x8017b9 2fa1a: b9 01 movw r22, r18 2fa1c: 64 1b sub r22, r20 2fa1e: 75 0b sbc r23, r21 2fa20: 41 e0 ldi r20, 0x01 ; 1 2fa22: 16 16 cp r1, r22 2fa24: 17 06 cpc r1, r23 2fa26: 0c f0 brlt .+2 ; 0x2fa2a 2fa28: 40 e0 ldi r20, 0x00 ; 0 bool stDir = _stepCount > 0; 2fa2a: 91 e0 ldi r25, 0x01 ; 1 2fa2c: 1c 16 cp r1, r28 2fa2e: 1d 06 cpc r1, r29 2fa30: 0c f0 brlt .+2 ; 0x2fa34 2fa32: 90 e0 ldi r25, 0x00 ; 0 if (fsDir != stDir) { 2fa34: 49 17 cp r20, r25 2fa36: 09 f4 brne .+2 ; 0x2fa3a 2fa38: 63 c0 rjmp .+198 ; 0x2fb00 jamErrCnt++; 2fa3a: 8f 5f subi r24, 0xFF ; 255 } else if (jamErrCnt) { jamErrCnt--; 2fa3c: 80 93 be 17 sts 0x17BE, r24 ; 0x8017be } oldPos = pat9125_y; 2fa40: 30 93 b9 17 sts 0x17B9, r19 ; 0x8017b9 2fa44: 20 93 b8 17 sts 0x17B8, r18 ; 0x8017b8 } if (jamErrCnt > 10) { 2fa48: 80 91 be 17 lds r24, 0x17BE ; 0x8017be 2fa4c: 8b 30 cpi r24, 0x0B ; 11 2fa4e: 00 f1 brcs .+64 ; 0x2fa90 jamErrCnt = 0; 2fa50: 10 92 be 17 sts 0x17BE, r1 ; 0x8017be void PAT9125_sensor::resetStepCount() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; } } void PAT9125_sensor::filJam() { runoutEnabled = false; 2fa54: 10 92 ab 17 sts 0x17AB, r1 ; 0x8017ab autoLoadEnabled = false; 2fa58: 10 92 aa 17 sts 0x17AA, r1 ; 0x8017aa jamDetection = false; 2fa5c: 10 92 b7 17 sts 0x17B7, r1 ; 0x8017b7 stop_and_save_print_to_ram(0, 0); 2fa60: 20 e0 ldi r18, 0x00 ; 0 2fa62: 30 e0 ldi r19, 0x00 ; 0 2fa64: a9 01 movw r20, r18 2fa66: ca 01 movw r24, r20 2fa68: b9 01 movw r22, r18 2fa6a: 0e 94 d7 88 call 0x111ae ; 0x111ae restore_print_from_ram_and_continue(0); 2fa6e: 60 e0 ldi r22, 0x00 ; 0 2fa70: 70 e0 ldi r23, 0x00 ; 0 2fa72: cb 01 movw r24, r22 2fa74: 0e 94 dc 67 call 0xcfb8 ; 0xcfb8 eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT); 2fa78: 85 e6 ldi r24, 0x65 ; 101 2fa7a: 9f e0 ldi r25, 0x0F ; 15 2fa7c: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT); 2fa80: 81 e0 ldi r24, 0x01 ; 1 2fa82: 9f e0 ldi r25, 0x0F ; 15 2fa84: 0e 94 b3 75 call 0xeb66 ; 0xeb66 enquecommand_front_P(MSG_M600); 2fa88: 88 e8 ldi r24, 0x88 ; 136 2fa8a: 90 e7 ldi r25, 0x70 ; 112 2fa8c: 0f 94 f4 75 call 0x2ebe8 ; 0x2ebe8 jamErrCnt = 0; filJam(); } } if (pollingTimer.expired_cont(pollingPeriod)) { 2fa90: 6a e0 ldi r22, 0x0A ; 10 2fa92: 70 e0 ldi r23, 0x00 ; 0 2fa94: 82 eb ldi r24, 0xB2 ; 178 2fa96: 97 e1 ldi r25, 0x17 ; 23 2fa98: 0f 94 82 2a call 0x25504 ; 0x25504 ::expired_cont(unsigned short)> 2fa9c: c8 2f mov r28, r24 2fa9e: 88 23 and r24, r24 2faa0: 39 f1 breq .+78 ; 0x2faf0 pollingTimer.start(); 2faa2: 82 eb ldi r24, 0xB2 ; 178 2faa4: 97 e1 ldi r25, 0x17 ; 23 2faa6: 0f 94 89 2a call 0x25512 ; 0x25512 ::start()> if (!pat9125_update()) { 2faaa: 0f 94 68 c2 call 0x384d0 ; 0x384d0 2faae: 81 11 cpse r24, r1 2fab0: 02 c0 rjmp .+4 ; 0x2fab6 init(); // try to reinit. 2fab2: 0f 94 30 7c call 0x2f860 ; 0x2f860 } bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50); 2fab6: 80 91 ba 0d lds r24, 0x0DBA ; 0x800dba 2faba: 81 31 cpi r24, 0x11 ; 17 2fabc: 30 f0 brcs .+12 ; 0x2faca 2fabe: c1 e0 ldi r28, 0x01 ; 1 2fac0: 80 91 b9 0d lds r24, 0x0DB9 ; 0x800db9 2fac4: 82 33 cpi r24, 0x32 ; 50 2fac6: 08 f4 brcc .+2 ; 0x2faca 2fac8: c0 e0 ldi r28, 0x00 ; 0 2faca: 80 91 b5 17 lds r24, 0x17B5 ; 0x8017b5 if (present != filterFilPresent) { 2face: 20 91 b6 17 lds r18, 0x17B6 ; 0x8017b6 2fad2: 30 e0 ldi r19, 0x00 ; 0 2fad4: c2 17 cp r28, r18 2fad6: 13 06 cpc r1, r19 2fad8: c1 f0 breq .+48 ; 0x2fb0a filter++; 2fada: 8f 5f subi r24, 0xFF ; 255 } else if (filter) { filter--; 2fadc: 80 93 b5 17 sts 0x17B5, r24 ; 0x8017b5 } if (filter >= filterCnt) { 2fae0: 80 91 b5 17 lds r24, 0x17B5 ; 0x8017b5 2fae4: 85 30 cpi r24, 0x05 ; 5 2fae6: 20 f0 brcs .+8 ; 0x2faf0 filter = 0; 2fae8: 10 92 b5 17 sts 0x17B5, r1 ; 0x8017b5 filterFilPresent = present; 2faec: c0 93 b6 17 sts 0x17B6, r28 ; 0x8017b6 } } return (filter == 0); // return stability 2faf0: 81 e0 ldi r24, 0x01 ; 1 2faf2: 90 91 b5 17 lds r25, 0x17B5 ; 0x8017b5 2faf6: 91 11 cpse r25, r1 2faf8: 80 e0 ldi r24, 0x00 ; 0 } 2fafa: df 91 pop r29 2fafc: cf 91 pop r28 2fafe: 08 95 ret } bool fsDir = (pat9125_y - oldPos) > 0; bool stDir = _stepCount > 0; if (fsDir != stDir) { jamErrCnt++; } else if (jamErrCnt) { 2fb00: 88 23 and r24, r24 2fb02: 09 f4 brne .+2 ; 0x2fb06 2fb04: 9d cf rjmp .-198 ; 0x2fa40 jamErrCnt--; 2fb06: 81 50 subi r24, 0x01 ; 1 2fb08: 99 cf rjmp .-206 ; 0x2fa3c } bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50); if (present != filterFilPresent) { filter++; } else if (filter) { 2fb0a: 88 23 and r24, r24 2fb0c: 49 f3 breq .-46 ; 0x2fae0 filter--; 2fb0e: 81 50 subi r24, 0x01 ; 1 2fb10: e5 cf rjmp .-54 ; 0x2fadc 0002fb12 : * 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() { 2fb12: 2f 92 push r2 2fb14: 3f 92 push r3 2fb16: 4f 92 push r4 2fb18: 5f 92 push r5 2fb1a: 6f 92 push r6 2fb1c: 7f 92 push r7 2fb1e: 8f 92 push r8 2fb20: 9f 92 push r9 2fb22: af 92 push r10 2fb24: bf 92 push r11 2fb26: cf 92 push r12 2fb28: df 92 push r13 2fb2a: ef 92 push r14 2fb2c: ff 92 push r15 2fb2e: 0f 93 push r16 2fb30: 1f 93 push r17 2fb32: cf 93 push r28 2fb34: df 93 push r29 2fb36: cd b7 in r28, 0x3d ; 61 2fb38: de b7 in r29, 0x3e ; 62 2fb3a: ed 97 sbiw r28, 0x3d ; 61 2fb3c: 0f b6 in r0, 0x3f ; 63 2fb3e: f8 94 cli 2fb40: de bf out 0x3e, r29 ; 62 2fb42: 0f be out 0x3f, r0 ; 63 2fb44: cd bf out 0x3d, r28 ; 61 KEEPALIVE_STATE(NOT_BUSY); } void CardReader::flush_presort() { sort_count = 0; 2fb46: 10 92 31 16 sts 0x1631, r1 ; 0x801631 2fb4a: 10 92 30 16 sts 0x1630, r1 ; 0x801630 lastSortedFilePosition = 0; 2fb4e: 10 92 fb 16 sts 0x16FB, r1 ; 0x8016fb 2fb52: 10 92 fa 16 sts 0x16FA, r1 ; 0x8016fa */ void CardReader::presort() { // Throw away old sort index flush_presort(); if (IS_SD_INSERTED == false) return; //sorting is not used in farm mode 2fb56: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2fb5a: 80 fd sbrc r24, 0 2fb5c: ef c0 rjmp .+478 ; 0x2fd3c uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); 2fb5e: 89 e0 ldi r24, 0x09 ; 9 2fb60: 9f e0 ldi r25, 0x0F ; 15 2fb62: 0f 94 10 dc call 0x3b820 ; 0x3b820 2fb66: 38 2e mov r3, r24 KEEPALIVE_STATE(IN_HANDLER); 2fb68: 82 e0 ldi r24, 0x02 ; 2 2fb6a: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be // If there are files, sort up to the limit uint16_t fileCnt = getnrfilenames(); 2fb6e: 0f 94 cb 7a call 0x2f596 ; 0x2f596 2fb72: 6c 01 movw r12, r24 if (fileCnt > 0) { 2fb74: 00 97 sbiw r24, 0x00 ; 0 2fb76: 09 f4 brne .+2 ; 0x2fb7a 2fb78: de c0 rjmp .+444 ; 0x2fd36 // Never sort more than the max allowed // If you use folders to organize, 20 may be enough if (fileCnt > SDSORT_LIMIT) { 2fb7a: 85 36 cpi r24, 0x65 ; 101 2fb7c: 91 05 cpc r25, r1 2fb7e: 60 f0 brcs .+24 ; 0x2fb98 if ((sdSort != SD_SORT_NONE) && !farm_mode) { 2fb80: 32 e0 ldi r19, 0x02 ; 2 2fb82: 33 16 cp r3, r19 2fb84: 31 f0 breq .+12 ; 0x2fb92 lcd_show_fullscreen_message_and_wait_P(_T(MSG_FILE_CNT)); 2fb86: 88 ef ldi r24, 0xF8 ; 248 2fb88: 9b e5 ldi r25, 0x5B ; 91 2fb8a: 0e 94 44 72 call 0xe488 ; 0xe488 2fb8e: 0f 94 cd 20 call 0x2419a ; 0x2419a } fileCnt = SDSORT_LIMIT; 2fb92: f4 e6 ldi r31, 0x64 ; 100 2fb94: cf 2e mov r12, r31 2fb96: d1 2c mov r13, r1 } sort_count = fileCnt; 2fb98: d0 92 31 16 sts 0x1631, r13 ; 0x801631 2fb9c: c0 92 30 16 sts 0x1630, r12 ; 0x801630 2fba0: 62 e3 ldi r22, 0x32 ; 50 2fba2: 66 2e mov r6, r22 2fba4: 66 e1 ldi r22, 0x16 ; 22 2fba6: 76 2e mov r7, r22 // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { 2fba8: f1 2c mov r15, r1 2fbaa: e1 2c mov r14, r1 lsDive("", *curDir, match, LS_GetFilename); } void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/) { curDir = &workDir; 2fbac: 7a e3 ldi r23, 0x3A ; 58 2fbae: a7 2e mov r10, r23 2fbb0: 75 e1 ldi r23, 0x15 ; 21 2fbb2: b7 2e mov r11, r23 nrFiles = 1; 2fbb4: 88 24 eor r8, r8 2fbb6: 83 94 inc r8 2fbb8: 91 2c mov r9, r1 sort_count = fileCnt; // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { if (!IS_SD_INSERTED) return; 2fbba: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2fbbe: 80 fd sbrc r24, 0 2fbc0: bd c0 rjmp .+378 ; 0x2fd3c manage_heater(); 2fbc2: 0f 94 34 39 call 0x27268 ; 0x27268 if (i == 0) 2fbc6: e1 14 cp r14, r1 2fbc8: f1 04 cpc r15, r1 2fbca: 09 f0 breq .+2 ; 0x2fbce 2fbcc: d0 c0 rjmp .+416 ; 0x2fd6e getfilename(0); 2fbce: 90 e0 ldi r25, 0x00 ; 0 2fbd0: 80 e0 ldi r24, 0x00 ; 0 2fbd2: 0f 94 35 7a call 0x2f46a ; 0x2f46a else getfilename_next(position); sort_entries[i] = position >> 5; 2fbd6: 80 91 a2 14 lds r24, 0x14A2 ; 0x8014a2 2fbda: 90 91 a3 14 lds r25, 0x14A3 ; 0x8014a3 2fbde: a0 91 a4 14 lds r26, 0x14A4 ; 0x8014a4 2fbe2: b0 91 a5 14 lds r27, 0x14A5 ; 0x8014a5 2fbe6: 55 e0 ldi r21, 0x05 ; 5 2fbe8: b6 95 lsr r27 2fbea: a7 95 ror r26 2fbec: 97 95 ror r25 2fbee: 87 95 ror r24 2fbf0: 5a 95 dec r21 2fbf2: d1 f7 brne .-12 ; 0x2fbe8 2fbf4: f3 01 movw r30, r6 2fbf6: 81 93 st Z+, r24 2fbf8: 91 93 st Z+, r25 2fbfa: 3f 01 movw r6, r30 } sort_count = fileCnt; // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { 2fbfc: ff ef ldi r31, 0xFF ; 255 2fbfe: ef 1a sub r14, r31 2fc00: ff 0a sbc r15, r31 2fc02: ce 14 cp r12, r14 2fc04: df 04 cpc r13, r15 2fc06: c9 f6 brne .-78 ; 0x2fbba else getfilename_next(position); sort_entries[i] = position >> 5; } if ((fileCnt > 1) && (sdSort != SD_SORT_NONE) && !farm_mode) { 2fc08: 21 e0 ldi r18, 0x01 ; 1 2fc0a: e2 16 cp r14, r18 2fc0c: f1 04 cpc r15, r1 2fc0e: 09 f4 brne .+2 ; 0x2fc12 2fc10: 92 c0 rjmp .+292 ; 0x2fd36 2fc12: 32 e0 ldi r19, 0x02 ; 2 2fc14: 33 16 cp r3, r19 2fc16: 09 f4 brne .+2 ; 0x2fc1a 2fc18: 8e c0 rjmp .+284 ; 0x2fd36 #ifdef SORTING_SPEEDTEST LongTimer sortingSpeedtestTimer; sortingSpeedtestTimer.start(); #endif //SORTING_SPEEDTEST lastSortedFilePosition = position >> 5; 2fc1a: 90 93 fb 16 sts 0x16FB, r25 ; 0x8016fb 2fc1e: 80 93 fa 16 sts 0x16FA, r24 ; 0x8016fa #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)); 2fc22: 88 ee ldi r24, 0xE8 ; 232 2fc24: 9b e5 ldi r25, 0x5B ; 91 2fc26: 0e 94 44 72 call 0xe488 ; 0xe488 2fc2a: ee 9c mul r14, r14 2fc2c: 90 01 movw r18, r0 2fc2e: ef 9c mul r14, r15 2fc30: 30 0d add r19, r0 2fc32: 30 0d add r19, r0 2fc34: 11 24 eor r1, r1 2fc36: bc 01 movw r22, r24 2fc38: c9 01 movw r24, r18 2fc3a: 96 95 lsr r25 2fc3c: 87 95 ror r24 2fc3e: 0f 94 ec cf call 0x39fd8 ; 0x39fd8 2fc42: 34 e3 ldi r19, 0x34 ; 52 2fc44: a3 2e mov r10, r19 2fc46: 36 e1 ldi r19, 0x16 ; 22 2fc48: 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; 2fc4a: 91 2c mov r9, r1 2fc4c: 81 2c mov r8, r1 menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES)); for (uint16_t i = 1; i < fileCnt; ++i){ 2fc4e: cc 24 eor r12, r12 2fc50: c3 94 inc r12 2fc52: d1 2c mov r13, r1 // if (!IS_SD_INSERTED) return; menu_progressbar_update(counter); 2fc54: c4 01 movw r24, r8 2fc56: 0f 94 bd cf call 0x39f7a ; 0x39f7a counter += i; 2fc5a: 8c 0c add r8, r12 2fc5c: 9d 1c adc r9, r13 /// pop the position const uint16_t o1 = sort_entries[i]; 2fc5e: f5 01 movw r30, r10 2fc60: 01 90 ld r0, Z+ 2fc62: f0 81 ld r31, Z 2fc64: e0 2d mov r30, r0 2fc66: f9 af std Y+57, r31 ; 0x39 2fc68: e8 af std Y+56, r30 ; 0x38 getfilename_simple(o1); 2fc6a: cf 01 movw r24, r30 2fc6c: 0f 94 7c 7a call 0x2f4f8 ; 0x2f4f8 strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it) 2fc70: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2fc74: 61 e9 ldi r22, 0x91 ; 145 2fc76: 74 e1 ldi r23, 0x14 ; 20 2fc78: 88 23 and r24, r24 2fc7a: 11 f0 breq .+4 ; 0x2fc80 2fc7c: 66 ea ldi r22, 0xA6 ; 166 2fc7e: 74 e1 ldi r23, 0x14 ; 20 2fc80: ce 01 movw r24, r28 2fc82: 01 96 adiw r24, 0x01 ; 1 2fc84: 0f 94 7b e2 call 0x3c4f6 ; 0x3c4f6 crmod_date_bckp = crmodDate; 2fc88: 60 90 a0 14 lds r6, 0x14A0 ; 0x8014a0 2fc8c: 70 90 a1 14 lds r7, 0x14A1 ; 0x8014a1 crmod_time_bckp = crmodTime; 2fc90: 20 91 9e 14 lds r18, 0x149E ; 0x80149e 2fc94: 30 91 9f 14 lds r19, 0x149F ; 0x80149f 2fc98: 3b af std Y+59, r19 ; 0x3b 2fc9a: 2a af std Y+58, r18 ; 0x3a #if HAS_FOLDER_SORTING bool dir1 = filenameIsDir; 2fc9c: 20 90 db 14 lds r2, 0x14DB ; 0x8014db 2fca0: bf aa std Y+55, r11 ; 0x37 2fca2: ae aa std Y+54, r10 ; 0x36 2fca4: 86 01 movw r16, r12 #endif /// find proper place uint16_t j = i; for (; j > 0; --j){ if (!IS_SD_INSERTED) return; 2fca6: 80 91 03 01 lds r24, 0x0103 ; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103> 2fcaa: 80 fd sbrc r24, 0 2fcac: 47 c0 rjmp .+142 ; 0x2fd3c printf_P(PSTR("%2u "), sort_entries[z]); } MYSERIAL.println(); #endif manage_heater(); 2fcae: 0f 94 34 39 call 0x27268 ; 0x27268 const uint16_t o2 = sort_entries[j - 1]; 2fcb2: c8 01 movw r24, r16 2fcb4: 01 97 sbiw r24, 0x01 ; 1 2fcb6: 9d af std Y+61, r25 ; 0x3d 2fcb8: 8c af std Y+60, r24 ; 0x3c 2fcba: ee a9 ldd r30, Y+54 ; 0x36 2fcbc: ff a9 ldd r31, Y+55 ; 0x37 2fcbe: 52 90 ld r5, -Z 2fcc0: 42 90 ld r4, -Z 2fcc2: ff ab std Y+55, r31 ; 0x37 2fcc4: ee ab std Y+54, r30 ; 0x36 getfilename_simple(o2); 2fcc6: c2 01 movw r24, r4 2fcc8: 0f 94 7c 7a call 0x2f4f8 ; 0x2f4f8 char *name2 = LONGEST_FILENAME; // use the string in-place 2fccc: 80 91 a6 14 lds r24, 0x14A6 ; 0x8014a6 2fcd0: 61 e9 ldi r22, 0x91 ; 145 2fcd2: 74 e1 ldi r23, 0x14 ; 20 2fcd4: 88 23 and r24, r24 2fcd6: 11 f0 breq .+4 ; 0x2fcdc 2fcd8: 66 ea ldi r22, 0xA6 ; 166 2fcda: 74 e1 ldi r23, 0x14 ; 20 // Sort the current pair according to settings. if ( 2fcdc: 31 10 cpse r3, r1 2fcde: 8a c0 rjmp .+276 ; 0x2fdf4 2fce0: 80 91 db 14 lds r24, 0x14DB ; 0x8014db 2fce4: 28 12 cpse r2, r24 2fce6: 83 c0 rjmp .+262 ; 0x2fdee #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2fce8: 80 91 a0 14 lds r24, 0x14A0 ; 0x8014a0 2fcec: 90 91 a1 14 lds r25, 0x14A1 ; 0x8014a1 2fcf0: 68 16 cp r6, r24 2fcf2: 79 06 cpc r7, r25 2fcf4: 09 f0 breq .+2 ; 0x2fcf8 2fcf6: 6c c0 rjmp .+216 ; 0x2fdd0 2fcf8: 80 91 9e 14 lds r24, 0x149E ; 0x80149e 2fcfc: 90 91 9f 14 lds r25, 0x149F ; 0x80149f 2fd00: 2a ad ldd r18, Y+58 ; 0x3a 2fd02: 3b ad ldd r19, Y+59 ; 0x3b 2fd04: 82 17 cp r24, r18 2fd06: 93 07 cpc r25, r19 2fd08: 08 f0 brcs .+2 ; 0x2fd0c 2fd0a: 66 c0 rjmp .+204 ; 0x2fdd8 #endif sort_entries[j] = o2; } } /// place the position sort_entries[j] = o1; 2fd0c: 00 0f add r16, r16 2fd0e: 11 1f adc r17, r17 2fd10: f8 01 movw r30, r16 2fd12: ee 5c subi r30, 0xCE ; 206 2fd14: f9 4e sbci r31, 0xE9 ; 233 2fd16: 28 ad ldd r18, Y+56 ; 0x38 2fd18: 39 ad ldd r19, Y+57 ; 0x39 2fd1a: 31 83 std Z+1, r19 ; 0x01 2fd1c: 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){ 2fd1e: 3f ef ldi r19, 0xFF ; 255 2fd20: c3 1a sub r12, r19 2fd22: d3 0a sbc r13, r19 2fd24: 82 e0 ldi r24, 0x02 ; 2 2fd26: a8 0e add r10, r24 2fd28: b1 1c adc r11, r1 2fd2a: ec 14 cp r14, r12 2fd2c: fd 04 cpc r15, r13 2fd2e: 09 f0 breq .+2 ; 0x2fd32 2fd30: 91 cf rjmp .-222 ; 0x2fc54 for (uint16_t z = 0; z < fileCnt; z++) printf_P(PSTR("%2u "), sort_entries[z]); SERIAL_PROTOCOLLN(); #endif menu_progressbar_finish(); 2fd32: 0f 94 de cf call 0x39fbc ; 0x39fbc } } KEEPALIVE_STATE(NOT_BUSY); 2fd36: 81 e0 ldi r24, 0x01 ; 1 2fd38: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be } 2fd3c: ed 96 adiw r28, 0x3d ; 61 2fd3e: 0f b6 in r0, 0x3f ; 63 2fd40: f8 94 cli 2fd42: de bf out 0x3e, r29 ; 62 2fd44: 0f be out 0x3f, r0 ; 63 2fd46: cd bf out 0x3d, r28 ; 61 2fd48: df 91 pop r29 2fd4a: cf 91 pop r28 2fd4c: 1f 91 pop r17 2fd4e: 0f 91 pop r16 2fd50: ff 90 pop r15 2fd52: ef 90 pop r14 2fd54: df 90 pop r13 2fd56: cf 90 pop r12 2fd58: bf 90 pop r11 2fd5a: af 90 pop r10 2fd5c: 9f 90 pop r9 2fd5e: 8f 90 pop r8 2fd60: 7f 90 pop r7 2fd62: 6f 90 pop r6 2fd64: 5f 90 pop r5 2fd66: 4f 90 pop r4 2fd68: 3f 90 pop r3 2fd6a: 2f 90 pop r2 2fd6c: 08 95 ret if (!IS_SD_INSERTED) return; manage_heater(); if (i == 0) getfilename(0); else getfilename_next(position); 2fd6e: 40 91 a2 14 lds r20, 0x14A2 ; 0x8014a2 2fd72: 50 91 a3 14 lds r21, 0x14A3 ; 0x8014a3 2fd76: 60 91 a4 14 lds r22, 0x14A4 ; 0x8014a4 2fd7a: 70 91 a5 14 lds r23, 0x14A5 ; 0x8014a5 lsDive("", *curDir, match, LS_GetFilename); } void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/) { curDir = &workDir; 2fd7e: b0 92 39 15 sts 0x1539, r11 ; 0x801539 2fd82: a0 92 38 15 sts 0x1538, r10 ; 0x801538 nrFiles = 1; 2fd86: 90 92 a8 17 sts 0x17A8, r9 ; 0x8017a8 2fd8a: 80 92 a7 17 sts 0x17A7, r8 ; 0x8017a7 curDir->seekSet(position); 2fd8e: 8a e3 ldi r24, 0x3A ; 58 2fd90: 95 e1 ldi r25, 0x15 ; 21 2fd92: 0f 94 89 57 call 0x2af12 ; 0x2af12 2fd96: 1e 7f andi r17, 0xFE ; 254 2fd98: 1d 7f andi r17, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 2fd9a: e0 91 38 15 lds r30, 0x1538 ; 0x801538 2fd9e: f0 91 39 15 lds r31, 0x1539 ; 0x801539 2fda2: 83 e2 ldi r24, 0x23 ; 35 2fda4: de 01 movw r26, r28 2fda6: 11 96 adiw r26, 0x01 ; 1 2fda8: 01 90 ld r0, Z+ 2fdaa: 0d 92 st X+, r0 2fdac: 8a 95 dec r24 2fdae: e1 f7 brne .-8 ; 0x2fda8 2fdb0: 01 2f mov r16, r17 2fdb2: 22 e0 ldi r18, 0x02 ; 2 2fdb4: 50 e0 ldi r21, 0x00 ; 0 2fdb6: 40 e0 ldi r20, 0x00 ; 0 2fdb8: be 01 movw r22, r28 2fdba: 6f 5f subi r22, 0xFF ; 255 2fdbc: 7f 4f sbci r23, 0xFF ; 255 2fdbe: 86 ef ldi r24, 0xF6 ; 246 2fdc0: 92 e0 ldi r25, 0x02 ; 2 2fdc2: 0f 94 06 78 call 0x2f00c ; 0x2f00c 2fdc6: ce 01 movw r24, r28 2fdc8: 01 96 adiw r24, 0x01 ; 1 2fdca: 0e 94 c9 76 call 0xed92 ; 0xed92 2fdce: 03 cf rjmp .-506 ; 0x2fbd6 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)) 2fdd0: 86 15 cp r24, r6 2fdd2: 97 05 cpc r25, r7 2fdd4: 08 f4 brcc .+2 ; 0x2fdd8 2fdd6: 9a cf rjmp .-204 ; 0x2fd0c break; } else { #ifdef SORTING_DUMP puts_P(PSTR("shift")); #endif sort_entries[j] = o2; 2fdd8: ee a9 ldd r30, Y+54 ; 0x36 2fdda: ff a9 ldd r31, Y+55 ; 0x37 2fddc: 53 82 std Z+3, r5 ; 0x03 2fdde: 42 82 std Z+2, r4 ; 0x02 2fde0: 0c ad ldd r16, Y+60 ; 0x3c 2fde2: 1d ad ldd r17, Y+61 ; 0x3d bool dir1 = filenameIsDir; #endif /// find proper place uint16_t j = i; for (; j > 0; --j){ 2fde4: 01 15 cp r16, r1 2fde6: 11 05 cpc r17, r1 2fde8: 09 f0 breq .+2 ; 0x2fdec 2fdea: 5d cf rjmp .-326 ; 0x2fca6 2fdec: 8f cf rjmp .-226 ; 0x2fd0c 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)) 2fdee: 22 20 and r2, r2 2fdf0: 99 f3 breq .-26 ; 0x2fdd8 2fdf2: 8c cf rjmp .-232 ; 0x2fd0c 2fdf4: 31 e0 ldi r19, 0x01 ; 1 2fdf6: 33 12 cpse r3, r19 2fdf8: ef cf rjmp .-34 ; 0x2fdd8 getfilename_simple(o2); char *name2 = LONGEST_FILENAME; // use the string in-place // Sort the current pair according to settings. if ( 2fdfa: 80 91 db 14 lds r24, 0x14DB ; 0x8014db 2fdfe: 28 12 cpse r2, r24 2fe00: 07 c0 rjmp .+14 ; 0x2fe10 #if HAS_FOLDER_SORTING (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING)) 2fe02: ce 01 movw r24, r28 2fe04: 01 96 adiw r24, 0x01 ; 1 2fe06: 0f 94 49 e2 call 0x3c492 ; 0x3c492 2fe0a: 97 fd sbrc r25, 7 2fe0c: e5 cf rjmp .-54 ; 0x2fdd8 2fe0e: 7e cf rjmp .-260 ; 0x2fd0c 2fe10: 21 10 cpse r2, r1 2fe12: e2 cf rjmp .-60 ; 0x2fdd8 2fe14: 7b cf rjmp .-266 ; 0x2fd0c 0002fe16 : lsDive("",*curDir, NULL, LS_Count); //SERIAL_ECHOLN(nrFiles); return nrFiles; } bool CardReader::chdir(const char * relpath, bool doPresort) 2fe16: cf 92 push r12 2fe18: df 92 push r13 2fe1a: ef 92 push r14 2fe1c: ff 92 push r15 2fe1e: 0f 93 push r16 2fe20: 1f 93 push r17 2fe22: cf 93 push r28 2fe24: df 93 push r29 2fe26: cd b7 in r28, 0x3d ; 61 2fe28: de b7 in r29, 0x3e ; 62 2fe2a: a3 97 sbiw r28, 0x23 ; 35 2fe2c: 0f b6 in r0, 0x3f ; 63 2fe2e: f8 94 cli 2fe30: de bf out 0x3e, r29 ; 62 2fe32: 0f be out 0x3f, r0 ; 63 2fe34: cd bf out 0x3d, r28 ; 61 2fe36: 7c 01 movw r14, r24 2fe38: 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) {} 2fe3a: 19 82 std Y+1, r1 ; 0x01 2fe3c: 1c 82 std Y+4, r1 ; 0x04 { SdFile newfile; SdFile *parent=&root; if(workDir.isOpen()) 2fe3e: 80 91 3d 15 lds r24, 0x153D ; 0x80153d parent=&workDir; 2fe42: 9a e3 ldi r25, 0x3A ; 58 2fe44: c9 2e mov r12, r25 2fe46: 95 e1 ldi r25, 0x15 ; 21 2fe48: d9 2e mov r13, r25 bool CardReader::chdir(const char * relpath, bool doPresort) { SdFile newfile; SdFile *parent=&root; if(workDir.isOpen()) 2fe4a: 81 11 cpse r24, r1 2fe4c: 04 c0 rjmp .+8 ; 0x2fe56 } bool CardReader::chdir(const char * relpath, bool doPresort) { SdFile newfile; SdFile *parent=&root; 2fe4e: 85 e1 ldi r24, 0x15 ; 21 2fe50: c8 2e mov r12, r24 2fe52: 85 e1 ldi r24, 0x15 ; 21 2fe54: 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); 2fe56: 21 e0 ldi r18, 0x01 ; 1 2fe58: a7 01 movw r20, r14 2fe5a: b6 01 movw r22, r12 2fe5c: ce 01 movw r24, r28 2fe5e: 01 96 adiw r24, 0x01 ; 1 2fe60: 0f 94 0f 65 call 0x2ca1e ; 0x2ca1e 2fe64: 18 2f mov r17, r24 if(workDir.isOpen()) parent=&workDir; if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH)) 2fe66: 88 23 and r24, r24 2fe68: 21 f1 breq .+72 ; 0x2feb2 2fe6a: 80 91 2f 16 lds r24, 0x162F ; 0x80162f 2fe6e: 85 30 cpi r24, 0x05 ; 5 2fe70: 00 f5 brcc .+64 ; 0x2feb2 SERIAL_ECHOLN(relpath); return 0; } else { strcpy(dir_names[workDirDepth], relpath); 2fe72: 29 e0 ldi r18, 0x09 ; 9 2fe74: 82 9f mul r24, r18 2fe76: c0 01 movw r24, r0 2fe78: 11 24 eor r1, r1 2fe7a: b7 01 movw r22, r14 2fe7c: 81 52 subi r24, 0x21 ; 33 2fe7e: 9b 4e sbci r25, 0xEB ; 235 2fe80: 0f 94 7b e2 call 0x3c4f6 ; 0x3c4f6 puts(relpath); 2fe84: c7 01 movw r24, r14 2fe86: 0f 94 9f e2 call 0x3c53e ; 0x3c53e if (workDirDepth < MAX_DIR_DEPTH) { 2fe8a: 80 91 2f 16 lds r24, 0x162F ; 0x80162f 2fe8e: 86 30 cpi r24, 0x06 ; 6 2fe90: 80 f1 brcs .+96 ; 0x2fef2 for (uint8_t d = ++workDirDepth; d--;) workDirParents[d+1] = workDirParents[d]; workDirParents[0]=*parent; } workDir=newfile; 2fe92: 83 e2 ldi r24, 0x23 ; 35 2fe94: fe 01 movw r30, r28 2fe96: 31 96 adiw r30, 0x01 ; 1 2fe98: aa e3 ldi r26, 0x3A ; 58 2fe9a: b5 e1 ldi r27, 0x15 ; 21 2fe9c: 01 90 ld r0, Z+ 2fe9e: 0d 92 st X+, r0 2fea0: 8a 95 dec r24 2fea2: e1 f7 brne .-8 ; 0x2fe9c #ifdef SDCARD_SORT_ALPHA if (doPresort) 2fea4: 00 23 and r16, r16 2fea6: 09 f4 brne .+2 ; 0x2feaa 2fea8: 4c c0 rjmp .+152 ; 0x2ff42 presort(); 2feaa: 0f 94 89 7d call 0x2fb12 ; 0x2fb12 else presort_flag = true; #endif return 1; 2feae: 10 2f mov r17, r16 2feb0: 0c c0 rjmp .+24 ; 0x2feca if(workDir.isOpen()) parent=&workDir; if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH)) { SERIAL_ECHO_START; 2feb2: 82 ef ldi r24, 0xF2 ; 242 2feb4: 9a ea ldi r25, 0xAA ; 170 2feb6: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR 2feba: 82 e7 ldi r24, 0x72 ; 114 2febc: 90 e7 ldi r25, 0x70 ; 112 2febe: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(relpath); 2fec2: c7 01 movw r24, r14 2fec4: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 return 0; 2fec8: 10 e0 ldi r17, 0x00 ; 0 2feca: ce 01 movw r24, r28 2fecc: 01 96 adiw r24, 0x01 ; 1 2fece: 0e 94 c9 76 call 0xed92 ; 0xed92 else presort_flag = true; #endif return 1; } } 2fed2: 81 2f mov r24, r17 2fed4: a3 96 adiw r28, 0x23 ; 35 2fed6: 0f b6 in r0, 0x3f ; 63 2fed8: f8 94 cli 2feda: de bf out 0x3e, r29 ; 62 2fedc: 0f be out 0x3f, r0 ; 63 2fede: cd bf out 0x3d, r28 ; 61 2fee0: df 91 pop r29 2fee2: cf 91 pop r28 2fee4: 1f 91 pop r17 2fee6: 0f 91 pop r16 2fee8: ff 90 pop r15 2feea: ef 90 pop r14 2feec: df 90 pop r13 2feee: cf 90 pop r12 2fef0: 08 95 ret { strcpy(dir_names[workDirDepth], relpath); puts(relpath); if (workDirDepth < MAX_DIR_DEPTH) { for (uint8_t d = ++workDirDepth; d--;) 2fef2: 8f 5f subi r24, 0xFF ; 255 2fef4: 80 93 2f 16 sts 0x162F, r24 ; 0x80162f workDirParents[d+1] = workDirParents[d]; 2fef8: 93 e2 ldi r25, 0x23 ; 35 { strcpy(dir_names[workDirDepth], relpath); puts(relpath); if (workDirDepth < MAX_DIR_DEPTH) { for (uint8_t d = ++workDirDepth; d--;) 2fefa: 81 50 subi r24, 0x01 ; 1 2fefc: c8 f0 brcs .+50 ; 0x2ff30 workDirParents[d+1] = workDirParents[d]; 2fefe: 28 2f mov r18, r24 2ff00: 30 e0 ldi r19, 0x00 ; 0 2ff02: a9 01 movw r20, r18 2ff04: 4f 5f subi r20, 0xFF ; 255 2ff06: 5f 4f sbci r21, 0xFF ; 255 2ff08: 94 9f mul r25, r20 2ff0a: d0 01 movw r26, r0 2ff0c: 95 9f mul r25, r21 2ff0e: b0 0d add r27, r0 2ff10: 11 24 eor r1, r1 2ff12: a3 5a subi r26, 0xA3 ; 163 2ff14: ba 4e sbci r27, 0xEA ; 234 2ff16: 92 9f mul r25, r18 2ff18: f0 01 movw r30, r0 2ff1a: 93 9f mul r25, r19 2ff1c: f0 0d add r31, r0 2ff1e: 11 24 eor r1, r1 2ff20: e3 5a subi r30, 0xA3 ; 163 2ff22: fa 4e sbci r31, 0xEA ; 234 2ff24: 29 2f mov r18, r25 2ff26: 01 90 ld r0, Z+ 2ff28: 0d 92 st X+, r0 2ff2a: 2a 95 dec r18 2ff2c: e1 f7 brne .-8 ; 0x2ff26 2ff2e: e5 cf rjmp .-54 ; 0x2fefa workDirParents[0]=*parent; 2ff30: 83 e2 ldi r24, 0x23 ; 35 2ff32: f6 01 movw r30, r12 2ff34: ad e5 ldi r26, 0x5D ; 93 2ff36: b5 e1 ldi r27, 0x15 ; 21 2ff38: 01 90 ld r0, Z+ 2ff3a: 0d 92 st X+, r0 2ff3c: 8a 95 dec r24 2ff3e: e1 f7 brne .-8 ; 0x2ff38 2ff40: a8 cf rjmp .-176 ; 0x2fe92 #ifdef SDCARD_SORT_ALPHA if (doPresort) presort(); else presort_flag = true; 2ff42: 81 e0 ldi r24, 0x01 ; 1 2ff44: 80 93 de 14 sts 0x14DE, r24 ; 0x8014de 2ff48: c0 cf rjmp .-128 ; 0x2feca 0002ff4a : } } void __attribute__((noinline)) CardReader::cdroot(bool doPresort) { workDir=root; 2ff4a: 93 e2 ldi r25, 0x23 ; 35 2ff4c: e5 e1 ldi r30, 0x15 ; 21 2ff4e: f5 e1 ldi r31, 0x15 ; 21 2ff50: aa e3 ldi r26, 0x3A ; 58 2ff52: b5 e1 ldi r27, 0x15 ; 21 2ff54: 01 90 ld r0, Z+ 2ff56: 0d 92 st X+, r0 2ff58: 9a 95 dec r25 2ff5a: e1 f7 brne .-8 ; 0x2ff54 workDirDepth = 0; 2ff5c: 10 92 2f 16 sts 0x162F, r1 ; 0x80162f curDir=&workDir; 2ff60: 2a e3 ldi r18, 0x3A ; 58 2ff62: 35 e1 ldi r19, 0x15 ; 21 2ff64: 30 93 39 15 sts 0x1539, r19 ; 0x801539 2ff68: 20 93 38 15 sts 0x1538, r18 ; 0x801538 #ifdef SDCARD_SORT_ALPHA if (doPresort) 2ff6c: 81 11 cpse r24, r1 presort(); 2ff6e: 0d 94 89 7d jmp 0x2fb12 ; 0x2fb12 else presort_flag = true; 2ff72: 81 e0 ldi r24, 0x01 ; 1 2ff74: 80 93 de 14 sts 0x14DE, r24 ; 0x8014de #endif } 2ff78: 08 95 ret 0002ff7a : * * @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) 2ff7a: 8f 92 push r8 2ff7c: 9f 92 push r9 2ff7e: af 92 push r10 2ff80: bf 92 push r11 2ff82: cf 92 push r12 2ff84: df 92 push r13 2ff86: ef 92 push r14 2ff88: ff 92 push r15 2ff8a: 0f 93 push r16 2ff8c: 1f 93 push r17 2ff8e: cf 93 push r28 2ff90: df 93 push r29 2ff92: cd b7 in r28, 0x3d ; 61 2ff94: de b7 in r29, 0x3e ; 62 2ff96: 2d 97 sbiw r28, 0x0d ; 13 2ff98: 0f b6 in r0, 0x3f ; 63 2ff9a: f8 94 cli 2ff9c: de bf out 0x3e, r29 ; 62 2ff9e: 0f be out 0x3f, r0 ; 63 2ffa0: cd bf out 0x3d, r28 ; 61 { curDir=&root; 2ffa2: 25 e1 ldi r18, 0x15 ; 21 2ffa4: 35 e1 ldi r19, 0x15 ; 21 2ffa6: 30 93 39 15 sts 0x1539, r19 ; 0x801539 2ffaa: 20 93 38 15 sts 0x1538, r18 ; 0x801538 if (!fileName) 2ffae: dc 01 movw r26, r24 2ffb0: ed 91 ld r30, X+ 2ffb2: fc 91 ld r31, X 2ffb4: 30 97 sbiw r30, 0x00 ; 0 2ffb6: a1 f4 brne .+40 ; 0x2ffe0 } else //relative path { curDir = &workDir; } return 1; 2ffb8: 81 e0 ldi r24, 0x01 ; 1 } 2ffba: 2d 96 adiw r28, 0x0d ; 13 2ffbc: 0f b6 in r0, 0x3f ; 63 2ffbe: f8 94 cli 2ffc0: de bf out 0x3e, r29 ; 62 2ffc2: 0f be out 0x3f, r0 ; 63 2ffc4: cd bf out 0x3d, r28 ; 61 2ffc6: df 91 pop r29 2ffc8: cf 91 pop r28 2ffca: 1f 91 pop r17 2ffcc: 0f 91 pop r16 2ffce: ff 90 pop r15 2ffd0: ef 90 pop r14 2ffd2: df 90 pop r13 2ffd4: cf 90 pop r12 2ffd6: bf 90 pop r11 2ffd8: af 90 pop r10 2ffda: 9f 90 pop r9 2ffdc: 8f 90 pop r8 2ffde: 08 95 ret curDir=&root; if (!fileName) return 1; const char *dirname_start, *dirname_end; if (fileName[0] == '/') // absolute path 2ffe0: 20 81 ld r18, Z 2ffe2: 2f 32 cpi r18, 0x2F ; 47 2ffe4: 09 f0 breq .+2 ; 0x2ffe8 2ffe6: 47 c0 rjmp .+142 ; 0x30076 2ffe8: 6c 01 movw r12, r24 { cdroot(false); 2ffea: 80 e0 ldi r24, 0x00 ; 0 2ffec: 0f 94 a5 7f call 0x2ff4a ; 0x2ff4a dirname_start = fileName + 1; 2fff0: f6 01 movw r30, r12 2fff2: 00 81 ld r16, Z 2fff4: 11 81 ldd r17, Z+1 ; 0x01 2fff6: 0f 5f subi r16, 0xFF ; 255 2fff8: 1f 4f sbci r17, 0xFF ; 255 strncpy(subdirname, dirname_start, len); subdirname[len] = 0; if (!chdir(subdirname, false)) return 0; curDir = &workDir; 2fffa: 9a e3 ldi r25, 0x3A ; 58 2fffc: 89 2e mov r8, r25 2fffe: 95 e1 ldi r25, 0x15 ; 21 30000: 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) 30002: d8 01 movw r26, r16 30004: 8c 91 ld r24, X 30006: 88 23 and r24, r24 30008: b9 f2 breq .-82 ; 0x2ffb8 { dirname_end = strchr(dirname_start, '/'); 3000a: 6f e2 ldi r22, 0x2F ; 47 3000c: 70 e0 ldi r23, 0x00 ; 0 3000e: c8 01 movw r24, r16 30010: 0f 94 67 e2 call 0x3c4ce ; 0x3c4ce 30014: 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) 30016: 00 97 sbiw r24, 0x00 ; 0 30018: 51 f1 breq .+84 ; 0x3006e 3001a: 08 17 cp r16, r24 3001c: 19 07 cpc r17, r25 3001e: 38 f5 brcc .+78 ; 0x3006e { 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); 30020: 7c 01 movw r14, r24 30022: e0 1a sub r14, r16 30024: f1 0a sbc r15, r17 30026: bd e0 ldi r27, 0x0D ; 13 30028: eb 16 cp r14, r27 3002a: f1 04 cpc r15, r1 3002c: 18 f0 brcs .+6 ; 0x30034 3002e: 8c e0 ldi r24, 0x0C ; 12 30030: e8 2e mov r14, r24 30032: f1 2c mov r15, r1 strncpy(subdirname, dirname_start, len); 30034: a7 01 movw r20, r14 30036: b8 01 movw r22, r16 30038: ce 01 movw r24, r28 3003a: 01 96 adiw r24, 0x01 ; 1 3003c: 0f 94 90 e2 call 0x3c520 ; 0x3c520 subdirname[len] = 0; 30040: e1 e0 ldi r30, 0x01 ; 1 30042: f0 e0 ldi r31, 0x00 ; 0 30044: ec 0f add r30, r28 30046: fd 1f adc r31, r29 30048: ee 0d add r30, r14 3004a: ff 1d adc r31, r15 3004c: 10 82 st Z, r1 if (!chdir(subdirname, false)) 3004e: 60 e0 ldi r22, 0x00 ; 0 30050: ce 01 movw r24, r28 30052: 01 96 adiw r24, 0x01 ; 1 30054: 0f 94 0b 7f call 0x2fe16 ; 0x2fe16 30058: 88 23 and r24, r24 3005a: 09 f4 brne .+2 ; 0x3005e 3005c: ae cf rjmp .-164 ; 0x2ffba return 0; curDir = &workDir; 3005e: 90 92 39 15 sts 0x1539, r9 ; 0x801539 30062: 80 92 38 15 sts 0x1538, r8 ; 0x801538 dirname_start = dirname_end + 1; 30066: 85 01 movw r16, r10 30068: 0f 5f subi r16, 0xFF ; 255 3006a: 1f 4f sbci r17, 0xFF ; 255 3006c: ca cf rjmp .-108 ; 0x30002 } else // the reminder after all /fsa/fdsa/ is the filename { fileName = dirname_start; 3006e: f6 01 movw r30, r12 30070: 11 83 std Z+1, r17 ; 0x01 30072: 00 83 st Z, r16 30074: a1 cf rjmp .-190 ; 0x2ffb8 } } else //relative path { curDir = &workDir; 30076: 8a e3 ldi r24, 0x3A ; 58 30078: 95 e1 ldi r25, 0x15 ; 21 3007a: 90 93 39 15 sts 0x1539, r25 ; 0x801539 3007e: 80 93 38 15 sts 0x1538, r24 ; 0x801538 30082: 9a cf rjmp .-204 ; 0x2ffb8 00030084 : 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*/){ 30084: bf 92 push r11 30086: cf 92 push r12 30088: df 92 push r13 3008a: ef 92 push r14 3008c: ff 92 push r15 3008e: 0f 93 push r16 30090: 1f 93 push r17 30092: cf 93 push r28 30094: df 93 push r29 30096: 1f 92 push r1 30098: 1f 92 push r1 3009a: cd b7 in r28, 0x3d ; 61 3009c: de b7 in r29, 0x3e ; 62 if(!mounted) 3009e: 20 91 90 14 lds r18, 0x1490 ; 0x801490 300a2: 22 23 and r18, r18 300a4: 09 f4 brne .+2 ; 0x300a8 300a6: ef c0 rjmp .+478 ; 0x30286 300a8: 7c 01 movw r14, r24 return; if(file.isOpen()){ //replacing current file by new file, or subfile call 300aa: 80 91 22 17 lds r24, 0x1722 ; 0x801722 300ae: 88 23 and r24, r24 300b0: 09 f4 brne .+2 ; 0x300b4 300b2: 04 c1 rjmp .+520 ; 0x302bc if(!replace_current){ 300b4: 61 11 cpse r22, r1 300b6: f6 c0 rjmp .+492 ; 0x302a4 if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1){ 300b8: d0 90 42 17 lds r13, 0x1742 ; 0x801742 300bc: dd 20 and r13, r13 300be: 21 f0 breq .+8 ; 0x300c8 // 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); 300c0: 8c ec ldi r24, 0xCC ; 204 300c2: 99 ea ldi r25, 0xA9 ; 169 300c4: 0e 94 a2 79 call 0xf344 ; 0xf344 return; } SERIAL_ECHO_START; 300c8: 82 ef ldi r24, 0xF2 ; 242 300ca: 9a ea ldi r25, 0xAA ; 170 300cc: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(ofSubroutineCallTgt); 300d0: 83 eb ldi r24, 0xB3 ; 179 300d2: 99 ea ldi r25, 0xA9 ; 169 300d4: 0e 94 e8 76 call 0xedd0 ; 0xedd0 300d8: c7 01 movw r24, r14 300da: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHO(name); SERIAL_ECHORPGM(ofParent); 300de: 88 ea ldi r24, 0xA8 ; 168 300e0: 99 ea ldi r25, 0xA9 ; 169 300e2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 //store current filename and position getAbsFilename(filenames[file_subcall_ctr]); 300e6: 00 91 42 17 lds r16, 0x1742 ; 0x801742 300ea: 25 e5 ldi r18, 0x55 ; 85 300ec: 02 9f mul r16, r18 300ee: 80 01 movw r16, r0 300f0: 11 24 eor r1, r1 } void CardReader::getAbsFilename(char *t) { uint8_t cnt=0; *t='/';t++;cnt++; 300f2: 09 5b subi r16, 0xB9 ; 185 300f4: 18 4e sbci r17, 0xE8 ; 232 300f6: 8f e2 ldi r24, 0x2F ; 47 300f8: f8 01 movw r30, r16 300fa: 81 93 st Z+, r24 300fc: 8f 01 movw r16, r30 300fe: cc 24 eor r12, r12 30100: c3 94 inc r12 for(uint8_t i=0;i 3010a: d8 16 cp r13, r24 3010c: b0 f4 brcc .+44 ; 0x3013a { workDirParents[i].getFilename(t); //SDBaseFile.getfilename! 3010e: db 9c mul r13, r11 30110: c0 01 movw r24, r0 30112: 11 24 eor r1, r1 30114: b8 01 movw r22, r16 30116: 83 5a subi r24, 0xA3 ; 163 30118: 9a 4e sbci r25, 0xEA ; 234 3011a: 0f 94 70 59 call 0x2b2e0 ; 0x2b2e0 3011e: c8 01 movw r24, r16 30120: 8c 01 movw r16, r24 30122: 01 96 adiw r24, 0x01 ; 1 while(*t!=0 && cnt< MAXPATHNAMELENGTH) 30124: f8 01 movw r30, r16 30126: 20 81 ld r18, Z 30128: 22 23 and r18, r18 3012a: 29 f0 breq .+10 ; 0x30136 3012c: f4 e5 ldi r31, 0x54 ; 84 3012e: fc 15 cp r31, r12 30130: 10 f0 brcs .+4 ; 0x30136 {t++;cnt++;} //crawl counter forward. 30132: c3 94 inc r12 30134: f5 cf rjmp .-22 ; 0x30120 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) 3013a: 27 e4 ldi r18, 0x47 ; 71 3013c: 2c 15 cp r18, r12 3013e: 08 f4 brcc .+2 ; 0x30142 30140: ae c0 rjmp .+348 ; 0x3029e file.getFilename(t); 30142: b8 01 movw r22, r16 30144: 8f e1 ldi r24, 0x1F ; 31 30146: 97 e1 ldi r25, 0x17 ; 23 30148: 0f 94 70 59 call 0x2b2e0 ; 0x2b2e0 SERIAL_ECHORPGM(ofParent); //store current filename and position getAbsFilename(filenames[file_subcall_ctr]); SERIAL_ECHO(filenames[file_subcall_ctr]); 3014c: 80 91 42 17 lds r24, 0x1742 ; 0x801742 30150: f5 e5 ldi r31, 0x55 ; 85 30152: 8f 9f mul r24, r31 30154: c0 01 movw r24, r0 30156: 11 24 eor r1, r1 30158: 89 5b subi r24, 0xB9 ; 185 3015a: 98 4e sbci r25, 0xE8 ; 232 3015c: 0e 94 ac 87 call 0x10f58 ; 0x10f58 SERIAL_ECHORPGM(ofPos); 30160: 82 ea ldi r24, 0xA2 ; 162 30162: 99 ea ldi r25, 0xA9 ; 169 30164: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 30168: 60 91 a3 17 lds r22, 0x17A3 ; 0x8017a3 3016c: 70 91 a4 17 lds r23, 0x17A4 ; 0x8017a4 30170: 80 91 a5 17 lds r24, 0x17A5 ; 0x8017a5 30174: 90 91 a6 17 lds r25, 0x17A6 ; 0x8017a6 30178: 4a e0 ldi r20, 0x0A ; 10 3017a: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 3017e: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; 30182: 80 91 42 17 lds r24, 0x1742 ; 0x801742 30186: 24 e0 ldi r18, 0x04 ; 4 30188: 82 9f mul r24, r18 3018a: f0 01 movw r30, r0 3018c: 11 24 eor r1, r1 3018e: ed 5b subi r30, 0xBD ; 189 30190: f8 4e sbci r31, 0xE8 ; 232 30192: 40 91 a3 17 lds r20, 0x17A3 ; 0x8017a3 30196: 50 91 a4 17 lds r21, 0x17A4 ; 0x8017a4 3019a: 60 91 a5 17 lds r22, 0x17A5 ; 0x8017a5 3019e: 70 91 a6 17 lds r23, 0x17A6 ; 0x8017a6 301a2: 40 83 st Z, r20 301a4: 51 83 std Z+1, r21 ; 0x01 301a6: 62 83 std Z+2, r22 ; 0x02 301a8: 73 83 std Z+3, r23 ; 0x03 file_subcall_ctr++; 301aa: 8f 5f subi r24, 0xFF ; 255 301ac: 80 93 42 17 sts 0x1742, r24 ; 0x801742 } else { SERIAL_ECHO_START; SERIAL_ECHORPGM(ofNowDoingFile); SERIAL_ECHOLN(name); } file.close(); 301b0: 8f e1 ldi r24, 0x1F ; 31 301b2: 97 e1 ldi r25, 0x17 ; 23 301b4: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce 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; 301b8: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f const char *fname=name; 301bc: fa 82 std Y+2, r15 ; 0x02 301be: e9 82 std Y+1, r14 ; 0x01 if (!diveSubfolder(fname)) 301c0: ce 01 movw r24, r28 301c2: 01 96 adiw r24, 0x01 ; 1 301c4: 0f 94 bd 7f call 0x2ff7a ; 0x2ff7a 301c8: 88 23 and r24, r24 301ca: 09 f4 brne .+2 ; 0x301ce 301cc: 5c c0 rjmp .+184 ; 0x30286 */ 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) ){ 301ce: 49 81 ldd r20, Y+1 ; 0x01 301d0: 5a 81 ldd r21, Y+2 ; 0x02 301d2: 60 91 38 15 lds r22, 0x1538 ; 0x801538 301d6: 70 91 39 15 lds r23, 0x1539 ; 0x801539 301da: 21 e0 ldi r18, 0x01 ; 1 301dc: 8f e1 ldi r24, 0x1F ; 31 301de: 97 e1 ldi r25, 0x17 ; 23 301e0: 0f 94 0f 65 call 0x2ca1e ; 0x2ca1e 301e4: 88 23 and r24, r24 301e6: 09 f4 brne .+2 ; 0x301ea 301e8: 77 c0 rjmp .+238 ; 0x302d8 // compute the block to start with if( ! gfComputeNextFileBlock() ) 301ea: 8f e1 ldi r24, 0x1F ; 31 301ec: 97 e1 ldi r25, 0x17 ; 23 301ee: 0f 94 10 57 call 0x2ae20 ; 0x2ae20 301f2: 88 23 and r24, r24 301f4: 09 f4 brne .+2 ; 0x301f8 301f6: 70 c0 rjmp .+224 ; 0x302d8 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; 301f8: 80 91 40 17 lds r24, 0x1740 ; 0x801740 301fc: 90 91 41 17 lds r25, 0x1741 ; 0x801741 30200: 84 56 subi r24, 0x64 ; 100 30202: 91 4f sbci r25, 0xF1 ; 241 30204: 90 93 3b 17 sts 0x173B, r25 ; 0x80173b 30208: 80 93 3a 17 sts 0x173A, r24 ; 0x80173a return; if (file.openFilteredGcode(curDir, fname)) { getfilename(0, fname); 3020c: 89 81 ldd r24, Y+1 ; 0x01 3020e: 9a 81 ldd r25, Y+2 ; 0x02 30210: 0f 94 35 7a call 0x2f46a ; 0x2f46a filesize = file.fileSize(); 30214: 80 91 30 17 lds r24, 0x1730 ; 0x801730 30218: 90 91 31 17 lds r25, 0x1731 ; 0x801731 3021c: a0 91 32 17 lds r26, 0x1732 ; 0x801732 30220: b0 91 33 17 lds r27, 0x1733 ; 0x801733 30224: 80 93 9c 17 sts 0x179C, r24 ; 0x80179c 30228: 90 93 9d 17 sts 0x179D, r25 ; 0x80179d 3022c: a0 93 9e 17 sts 0x179E, r26 ; 0x80179e 30230: b0 93 9f 17 sts 0x179F, r27 ; 0x80179f SERIAL_PROTOCOLRPGM(ofFileOpened);////MSG_SD_FILE_OPENED 30234: 82 e7 ldi r24, 0x72 ; 114 30236: 99 ea ldi r25, 0xA9 ; 169 30238: 0e 94 e8 76 call 0xedd0 ; 0xedd0 printAbsFilenameFast(); 3023c: 0f 94 18 7b call 0x2f630 ; 0x2f630 SERIAL_PROTOCOLRPGM(ofSize);////MSG_SD_SIZE 30240: 8a e6 ldi r24, 0x6A ; 106 30242: 99 ea ldi r25, 0xA9 ; 169 30244: 0e 94 e8 76 call 0xedd0 ; 0xedd0 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 30248: 60 91 9c 17 lds r22, 0x179C ; 0x80179c 3024c: 70 91 9d 17 lds r23, 0x179D ; 0x80179d 30250: 80 91 9e 17 lds r24, 0x179E ; 0x80179e 30254: 90 91 9f 17 lds r25, 0x179F ; 0x80179f 30258: 4a e0 ldi r20, 0x0A ; 10 3025a: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 } void MarlinSerial::println(unsigned long n, int base) { print(n, base); println(); 3025e: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_PROTOCOLLN(filesize); sdpos = 0; 30262: 10 92 a3 17 sts 0x17A3, r1 ; 0x8017a3 30266: 10 92 a4 17 sts 0x17A4, r1 ; 0x8017a4 3026a: 10 92 a5 17 sts 0x17A5, r1 ; 0x8017a5 3026e: 10 92 a6 17 sts 0x17A6, r1 ; 0x8017a6 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED 30272: 8c e5 ldi r24, 0x5C ; 92 30274: 99 ea ldi r25, 0xA9 ; 169 30276: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_setstatuspgm(ofFileSelected); 3027a: 8c e5 ldi r24, 0x5C ; 92 3027c: 99 ea ldi r25, 0xA9 ; 169 3027e: 0e 94 16 f2 call 0x1e42c ; 0x1e42c scrollstuff = 0; 30282: 10 92 b8 0d sts 0x0DB8, r1 ; 0x800db8 } else { SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLN('.'); } } 30286: 0f 90 pop r0 30288: 0f 90 pop r0 3028a: df 91 pop r29 3028c: cf 91 pop r28 3028e: 1f 91 pop r17 30290: 0f 91 pop r16 30292: ff 90 pop r15 30294: ef 90 pop r14 30296: df 90 pop r13 30298: cf 90 pop r12 3029a: bf 90 pop r11 3029c: 08 95 ret {t++;cnt++;} //crawl counter forward. } if(cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH) file.getFilename(t); else t[0]=0; 3029e: f8 01 movw r30, r16 302a0: 10 82 st Z, r1 302a2: 54 cf rjmp .-344 ; 0x3014c SERIAL_ECHORPGM(ofPos); SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; file_subcall_ctr++; } else { SERIAL_ECHO_START; 302a4: 82 ef ldi r24, 0xF2 ; 242 302a6: 9a ea ldi r25, 0xAA ; 170 302a8: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(ofNowDoingFile); 302ac: 81 e9 ldi r24, 0x91 ; 145 302ae: 99 ea ldi r25, 0xA9 ; 169 302b0: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(name); 302b4: c7 01 movw r24, r14 302b6: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 302ba: 7a cf rjmp .-268 ; 0x301b0 } file.close(); } else { //opening fresh file file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure 302bc: 10 92 42 17 sts 0x1742, r1 ; 0x801742 SERIAL_ECHO_START; 302c0: 82 ef ldi r24, 0xF2 ; 242 302c2: 9a ea ldi r25, 0xAA ; 170 302c4: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(ofNowFreshFile); 302c8: 80 e8 ldi r24, 0x80 ; 128 302ca: 99 ea ldi r25, 0xA9 ; 169 302cc: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(name); 302d0: c7 01 movw r24, r14 302d2: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 302d6: 70 cf rjmp .-288 ; 0x301b8 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED lcd_setstatuspgm(ofFileSelected); scrollstuff = 0; } else { SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); 302d8: 8e e5 ldi r24, 0x5E ; 94 302da: 90 e7 ldi r25, 0x70 ; 112 302dc: 0e 94 e8 76 call 0xedd0 ; 0xedd0 302e0: 89 81 ldd r24, Y+1 ; 0x01 302e2: 9a 81 ldd r25, Y+2 ; 0x02 302e4: 0e 94 ac 87 call 0x10f58 ; 0x10f58 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 302e8: 8e e2 ldi r24, 0x2E ; 46 302ea: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::println(char c, int base) { print(c, base); println(); 302ee: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 302f2: c9 cf rjmp .-110 ; 0x30286 000302f4 : void CardReader::printingHasFinished() { st_synchronize(); 302f4: 0f 94 a9 43 call 0x28752 ; 0x28752 file.close(); 302f8: 8f e1 ldi r24, 0x1F ; 31 302fa: 97 e1 ldi r25, 0x17 ; 23 302fc: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce if(file_subcall_ctr>0) //heading up to a parent file that called current as a procedure. 30300: 80 91 42 17 lds r24, 0x1742 ; 0x801742 30304: 88 23 and r24, r24 30306: 69 f1 breq .+90 ; 0x30362 { file_subcall_ctr--; 30308: 81 50 subi r24, 0x01 ; 1 3030a: 80 93 42 17 sts 0x1742, r24 ; 0x801742 openFileReadFilteredGcode(filenames[file_subcall_ctr],true); 3030e: 25 e5 ldi r18, 0x55 ; 85 30310: 82 9f mul r24, r18 30312: c0 01 movw r24, r0 30314: 11 24 eor r1, r1 30316: 61 e0 ldi r22, 0x01 ; 1 30318: 89 5b subi r24, 0xB9 ; 185 3031a: 98 4e sbci r25, 0xE8 ; 232 3031c: 0f 94 42 80 call 0x30084 ; 0x30084 setIndex(filespos[file_subcall_ctr]); 30320: e0 91 42 17 lds r30, 0x1742 ; 0x801742 30324: 84 e0 ldi r24, 0x04 ; 4 30326: e8 9f mul r30, r24 30328: f0 01 movw r30, r0 3032a: 11 24 eor r1, r1 3032c: ed 5b subi r30, 0xBD ; 189 3032e: f8 4e sbci r31, 0xE8 ; 232 30330: 60 81 ld r22, Z 30332: 71 81 ldd r23, Z+1 ; 0x01 30334: 82 81 ldd r24, Z+2 ; 0x02 30336: 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);}; 30338: 60 93 a3 17 sts 0x17A3, r22 ; 0x8017a3 3033c: 70 93 a4 17 sts 0x17A4, r23 ; 0x8017a4 30340: 80 93 a5 17 sts 0x17A5, r24 ; 0x8017a5 30344: 90 93 a6 17 sts 0x17A6, r25 ; 0x8017a6 30348: 0f 94 93 76 call 0x2ed26 ; 0x2ed26 SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED } void CardReader::startFileprint() { if(mounted) 3034c: 80 91 90 14 lds r24, 0x1490 ; 0x801490 30350: 88 23 and r24, r24 30352: 71 f0 breq .+28 ; 0x30370 { sdprinting = true; 30354: 81 e0 ldi r24, 0x01 ; 1 30356: 80 93 8f 14 sts 0x148F, r24 ; 0x80148f 3035a: 85 e0 ldi r24, 0x05 ; 5 3035c: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> 30360: 08 95 ret setIndex(filespos[file_subcall_ctr]); startFileprint(); } else { sdprinting = false; 30362: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f 30366: 83 e0 ldi r24, 0x03 ; 3 30368: 80 93 b7 0d sts 0x0DB7, r24 ; 0x800db7 <_ZL13printer_state.lto_priv.403> SetPrinterState(PrinterState::SDPrintingFinished); //set printer state to show LCD menu after finished SD print if(SD_FINISHED_STEPPERRELEASE) { finishAndDisableSteppers(); 3036c: 0c 94 00 82 jmp 0x10400 ; 0x10400 autotempShutdown(); #ifdef SDCARD_SORT_ALPHA //presort(); #endif } } 30370: 08 95 ret 00030372 : root.rewind(); lsDive("",root, NULL, LS_SerialPrint, params); } void CardReader::mount(bool doPresort/* = true*/) 30372: cf 92 push r12 30374: df 92 push r13 30376: ef 92 push r14 30378: ff 92 push r15 3037a: 0f 93 push r16 3037c: 1f 93 push r17 3037e: cf 93 push r28 30380: df 93 push r29 30382: 08 2f mov r16, r24 { mounted = false; 30384: 10 92 90 14 sts 0x1490, r1 ; 0x801490 if(root.isOpen()) 30388: 80 91 18 15 lds r24, 0x1518 ; 0x801518 3038c: 88 23 and r24, r24 3038e: 21 f0 breq .+8 ; 0x30398 root.close(); 30390: 85 e1 ldi r24, 0x15 ; 21 30392: 95 e1 ldi r25, 0x15 ; 21 30394: 0f 94 67 59 call 0x2b2ce ; 0x2b2ce * \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; 30398: 10 92 ff 16 sts 0x16FF, r1 ; 0x8016ff 3039c: 10 92 fc 16 sts 0x16FC, r1 ; 0x8016fc // 16-bit init start time allows over a minute uint16_t t0 = (uint16_t)_millis(); 303a0: 0f 94 28 2a call 0x25450 ; 0x25450 303a4: eb 01 movw r28, r22 uint32_t arg; // set pin modes chipSelectHigh(); 303a6: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c SET_OUTPUT(SDSS); 303aa: 80 91 04 01 lds r24, 0x0104 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> 303ae: 80 64 ori r24, 0x40 ; 64 303b0: 80 93 04 01 sts 0x0104, r24 ; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104> SET_INPUT(MISO); 303b4: 23 98 cbi 0x04, 3 ; 4 SET_OUTPUT(MOSI); 303b6: 22 9a sbi 0x04, 2 ; 4 SET_OUTPUT(SCK); 303b8: 21 9a sbi 0x04, 1 ; 4 #ifndef SOFTWARE_SPI // SS must be in output mode even it is not chip select SET_OUTPUT(SS); 303ba: 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); 303bc: 28 9a sbi 0x05, 0 ; 5 #endif // SET_SPI_SS_HIGH // set SCK rate for initialization commands spiRate_ = SPI_SD_INIT_RATE; 303be: 85 e0 ldi r24, 0x05 ; 5 303c0: 80 93 fd 16 sts 0x16FD, r24 ; 0x8016fd * 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); 303c4: 82 e5 ldi r24, 0x52 ; 82 303c6: 8c bd out 0x2c, r24 ; 44 SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X; 303c8: 1d bc out 0x2d, r1 ; 45 303ca: 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); 303cc: 8f ef ldi r24, 0xFF ; 255 303ce: 0f 94 3c 53 call 0x2a678 ; 0x2a678 303d2: 11 50 subi r17, 0x01 ; 1 303d4: d9 f7 brne .-10 ; 0x303cc WRITE(MISO, 1); // temporarily enable the MISO line pullup 303d6: 2b 9a sbi 0x05, 3 ; 5 // command to go idle in SPI mode while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { 303d8: 20 e0 ldi r18, 0x00 ; 0 303da: 30 e0 ldi r19, 0x00 ; 0 303dc: a9 01 movw r20, r18 303de: 60 e0 ldi r22, 0x00 ; 0 303e0: 8c ef ldi r24, 0xFC ; 252 303e2: 96 e1 ldi r25, 0x16 ; 22 303e4: 0f 94 48 53 call 0x2a690 ; 0x2a690 303e8: 80 93 fe 16 sts 0x16FE, r24 ; 0x8016fe 303ec: 81 30 cpi r24, 0x01 ; 1 303ee: 61 f0 breq .+24 ; 0x30408 if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) { 303f0: 0f 94 28 2a call 0x25450 ; 0x25450 303f4: 6c 1b sub r22, r28 303f6: 7d 0b sbc r23, r29 303f8: 61 3d cpi r22, 0xD1 ; 209 303fa: 77 40 sbci r23, 0x07 ; 7 303fc: 68 f3 brcs .-38 ; 0x303d8 WRITE(MISO, 0); // disable the MISO line pullup 303fe: 2b 98 cbi 0x05, 3 ; 5 30400: 81 e0 ldi r24, 0x01 ; 1 30402: 80 93 fc 16 sts 0x16FC, r24 ; 0x8016fc 30406: 22 c0 rjmp .+68 ; 0x3044c error(SD_CARD_ERROR_CMD0); goto fail; } } WRITE(MISO, 0); // disable the MISO line pullup 30408: 2b 98 cbi 0x05, 3 ; 5 // send 0xFF until 0xFF received to give card some clock cycles t0 = (uint16_t)_millis(); 3040a: 0f 94 28 2a call 0x25450 ; 0x25450 3040e: eb 01 movw r28, r22 SERIAL_ECHOLNRPGM(PSTR("Sending 0xFF")); 30410: 8f e4 ldi r24, 0x4F ; 79 30412: 99 ea ldi r25, 0xA9 ; 169 30414: 0e 94 13 79 call 0xf226 ; 0xf226 spiSend(0XFF); 30418: 8f ef ldi r24, 0xFF ; 255 3041a: 0f 94 3c 53 call 0x2a678 ; 0x2a678 while ((status_ = spiRec()) != 0xFF) 3041e: 0f 94 41 53 call 0x2a682 ; 0x2a682 30422: 80 93 fe 16 sts 0x16FE, r24 ; 0x8016fe 30426: 8f 3f cpi r24, 0xFF ; 255 30428: 59 f1 breq .+86 ; 0x30480 { spiSend(0XFF); 3042a: 8f ef ldi r24, 0xFF ; 255 3042c: 0f 94 3c 53 call 0x2a678 ; 0x2a678 if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT) 30430: 0f 94 28 2a call 0x25450 ; 0x25450 30434: 6c 1b sub r22, r28 30436: 7d 0b sbc r23, r29 30438: 62 32 cpi r22, 0x22 ; 34 3043a: 71 05 cpc r23, r1 3043c: 80 f3 brcs .-32 ; 0x3041e 3043e: 82 e0 ldi r24, 0x02 ; 2 30440: 80 93 fc 16 sts 0x16FC, r24 ; 0x8016fc { error(SD_CARD_ERROR_CMD8); SERIAL_ECHOLNRPGM(PSTR("No 0xFF received")); 30444: 8e e3 ldi r24, 0x3E ; 62 30446: 99 ea ldi r25, 0xA9 ; 169 30448: 0e 94 13 79 call 0xf226 ; 0xf226 #else // SOFTWARE_SPI return true; #endif // SOFTWARE_SPI fail: chipSelectHigh(); 3044c: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c #else if (!card.init(SPI_FULL_SPEED) ) #endif { SERIAL_ECHO_START; 30450: 82 ef ldi r24, 0xF2 ; 242 30452: 9a ea ldi r25, 0xAA ; 170 30454: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL 30458: 81 e5 ldi r24, 0x51 ; 81 3045a: 90 e7 ldi r25, 0x70 ; 112 } else { mounted = true; SERIAL_ECHO_START; SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK 3045c: 0e 94 13 79 call 0xf226 ; 0xf226 } if (mounted) 30460: 80 91 90 14 lds r24, 0x1490 ; 0x801490 30464: 88 23 and r24, r24 30466: 09 f4 brne .+2 ; 0x3046a 30468: 9a c0 rjmp .+308 ; 0x3059e { cdroot(doPresort); 3046a: 80 2f mov r24, r16 } } 3046c: df 91 pop r29 3046e: cf 91 pop r28 30470: 1f 91 pop r17 30472: 0f 91 pop r16 30474: ff 90 pop r15 30476: ef 90 pop r14 30478: df 90 pop r13 3047a: cf 90 pop r12 SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK } if (mounted) { cdroot(doPresort); 3047c: 0d 94 a5 7f jmp 0x2ff4a ; 0x2ff4a goto fail; } } // check SD version if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { 30480: 2a ea ldi r18, 0xAA ; 170 30482: 31 e0 ldi r19, 0x01 ; 1 30484: 40 e0 ldi r20, 0x00 ; 0 30486: 50 e0 ldi r21, 0x00 ; 0 30488: 68 e0 ldi r22, 0x08 ; 8 3048a: 8c ef ldi r24, 0xFC ; 252 3048c: 96 e1 ldi r25, 0x16 ; 22 3048e: 0f 94 48 53 call 0x2a690 ; 0x2a690 30492: 82 ff sbrs r24, 2 30494: 2b c0 rjmp .+86 ; 0x304ec 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;} 30496: 81 e0 ldi r24, 0x01 ; 1 30498: 80 93 ff 16 sts 0x16FF, r24 ; 0x8016ff goto fail; } type(SD_CARD_TYPE_SD2); } // initialize card and send host supports SDHC if SD2 arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; 3049c: 80 91 ff 16 lds r24, 0x16FF ; 0x8016ff 304a0: c1 2c mov r12, r1 304a2: d1 2c mov r13, r1 304a4: 76 01 movw r14, r12 304a6: 82 30 cpi r24, 0x02 ; 2 304a8: 29 f4 brne .+10 ; 0x304b4 304aa: c1 2c mov r12, r1 304ac: d1 2c mov r13, r1 304ae: e1 2c mov r14, r1 304b0: 80 e4 ldi r24, 0x40 ; 64 304b2: 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); 304b4: 20 e0 ldi r18, 0x00 ; 0 304b6: 30 e0 ldi r19, 0x00 ; 0 304b8: a9 01 movw r20, r18 304ba: 67 e3 ldi r22, 0x37 ; 55 304bc: 8c ef ldi r24, 0xFC ; 252 304be: 96 e1 ldi r25, 0x16 ; 22 304c0: 0f 94 48 53 call 0x2a690 ; 0x2a690 return cardCommand(cmd, arg); 304c4: a7 01 movw r20, r14 304c6: 96 01 movw r18, r12 304c8: 69 e2 ldi r22, 0x29 ; 41 304ca: 8c ef ldi r24, 0xFC ; 252 304cc: 96 e1 ldi r25, 0x16 ; 22 304ce: 0f 94 48 53 call 0x2a690 ; 0x2a690 while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { 304d2: 80 93 fe 16 sts 0x16FE, r24 ; 0x8016fe 304d6: 88 23 and r24, r24 304d8: b1 f0 breq .+44 ; 0x30506 // check for timeout if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) { 304da: 0f 94 28 2a call 0x25450 ; 0x25450 304de: 6c 1b sub r22, r28 304e0: 7d 0b sbc r23, r29 304e2: 61 3d cpi r22, 0xD1 ; 209 304e4: 77 40 sbci r23, 0x07 ; 7 304e6: 30 f3 brcs .-52 ; 0x304b4 bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 304e8: 8a e0 ldi r24, 0x0A ; 10 304ea: 8b cf rjmp .-234 ; 0x30402 goto fail; } } // check SD version if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { 304ec: 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(); 304ee: 0f 94 41 53 call 0x2a682 ; 0x2a682 304f2: 80 93 fe 16 sts 0x16FE, r24 ; 0x8016fe 304f6: 11 50 subi r17, 0x01 ; 1 304f8: d1 f7 brne .-12 ; 0x304ee if (status_ != 0XAA) { 304fa: 8a 3a cpi r24, 0xAA ; 170 304fc: 11 f0 breq .+4 ; 0x30502 304fe: 82 e0 ldi r24, 0x02 ; 2 30500: 80 cf rjmp .-256 ; 0x30402 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;} 30502: 82 e0 ldi r24, 0x02 ; 2 30504: c9 cf rjmp .-110 ; 0x30498 error(SD_CARD_ERROR_ACMD41); goto fail; } } // if SD2 read OCR register to check for SDHC card if (type() == SD_CARD_TYPE_SD2) { 30506: 80 91 ff 16 lds r24, 0x16FF ; 0x8016ff 3050a: 82 30 cpi r24, 0x02 ; 2 3050c: d1 f4 brne .+52 ; 0x30542 if (cardCommand(CMD58, 0)) { 3050e: 20 e0 ldi r18, 0x00 ; 0 30510: 30 e0 ldi r19, 0x00 ; 0 30512: a9 01 movw r20, r18 30514: 6a e3 ldi r22, 0x3A ; 58 30516: 8c ef ldi r24, 0xFC ; 252 30518: 96 e1 ldi r25, 0x16 ; 22 3051a: 0f 94 48 53 call 0x2a690 ; 0x2a690 3051e: 88 23 and r24, r24 30520: 11 f0 breq .+4 ; 0x30526 bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 30522: 88 e0 ldi r24, 0x08 ; 8 30524: 6e cf rjmp .-292 ; 0x30402 error(SD_CARD_ERROR_CMD58); goto fail; } if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC); 30526: 0f 94 41 53 call 0x2a682 ; 0x2a682 3052a: 80 7c andi r24, 0xC0 ; 192 3052c: 80 3c cpi r24, 0xC0 ; 192 3052e: 19 f4 brne .+6 ; 0x30536 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;} 30530: 83 e0 ldi r24, 0x03 ; 3 30532: 80 93 ff 16 sts 0x16FF, r24 ; 0x8016ff // discard rest of ocr - contains allowed voltage range for (uint8_t i = 0; i < 3; i++) spiRec(); 30536: 0f 94 41 53 call 0x2a682 ; 0x2a682 3053a: 0f 94 41 53 call 0x2a682 ; 0x2a682 3053e: 0f 94 41 53 call 0x2a682 ; 0x2a682 } chipSelectHigh(); 30542: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c bool Sd2Card::setSckRate(uint8_t sckRateID) { if (sckRateID > 6) { error(SD_CARD_ERROR_SCK_RATE); return false; } spiRate_ = sckRateID; 30546: 10 92 fd 16 sts 0x16FD, r1 ; 0x8016fd * \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);} 3054a: 81 e0 ldi r24, 0x01 ; 1 3054c: 0f 94 b2 69 call 0x2d364 ; 0x2d364 30550: 81 11 cpse r24, r1 30552: 0c c0 rjmp .+24 ; 0x3056c 30554: 80 e0 ldi r24, 0x00 ; 0 30556: 0f 94 b2 69 call 0x2d364 ; 0x2d364 #endif { SERIAL_ECHO_START; SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL } else if (!volume.init(&card)) 3055a: 81 11 cpse r24, r1 3055c: 07 c0 rjmp .+14 ; 0x3056c { SERIAL_ERROR_START; 3055e: 8a ec ldi r24, 0xCA ; 202 30560: 9a ea ldi r25, 0xAA ; 170 30562: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNRPGM(_n("volume.init failed"));////MSG_SD_VOL_INIT_FAIL 30566: 8e e3 ldi r24, 0x3E ; 62 30568: 90 e7 ldi r25, 0x70 ; 112 3056a: 78 cf rjmp .-272 ; 0x3045c } else if (!root.openRoot(&volume)) 3056c: 61 e0 ldi r22, 0x01 ; 1 3056e: 77 e1 ldi r23, 0x17 ; 23 30570: 85 e1 ldi r24, 0x15 ; 21 30572: 95 e1 ldi r25, 0x15 ; 21 30574: 0f 94 c0 56 call 0x2ad80 ; 0x2ad80 30578: 81 11 cpse r24, r1 3057a: 07 c0 rjmp .+14 ; 0x3058a { SERIAL_ERROR_START; 3057c: 8a ec ldi r24, 0xCA ; 202 3057e: 9a ea ldi r25, 0xAA ; 170 30580: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ERRORLNRPGM(_n("openRoot failed"));////MSG_SD_OPENROOT_FAIL 30584: 8e e2 ldi r24, 0x2E ; 46 30586: 90 e7 ldi r25, 0x70 ; 112 30588: 69 cf rjmp .-302 ; 0x3045c } else { mounted = true; 3058a: 81 e0 ldi r24, 0x01 ; 1 3058c: 80 93 90 14 sts 0x1490, r24 ; 0x801490 SERIAL_ECHO_START; 30590: 82 ef ldi r24, 0xF2 ; 242 30592: 9a ea ldi r25, 0xAA ; 170 30594: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK 30598: 83 e2 ldi r24, 0x23 ; 35 3059a: 90 e7 ldi r25, 0x70 ; 112 3059c: 5f cf rjmp .-322 ; 0x3045c if (mounted) { cdroot(doPresort); } } 3059e: df 91 pop r29 305a0: cf 91 pop r28 305a2: 1f 91 pop r17 305a4: 0f 91 pop r16 305a6: ff 90 pop r15 305a8: ef 90 pop r14 305aa: df 90 pop r13 305ac: cf 90 pop r12 305ae: 08 95 ret 000305b0 : ms = 0; } } } static void wait_for_heater(long codenum, uint8_t extruder) { 305b0: 4f 92 push r4 305b2: 5f 92 push r5 305b4: 6f 92 push r6 305b6: 7f 92 push r7 305b8: 8f 92 push r8 305ba: 9f 92 push r9 305bc: af 92 push r10 305be: bf 92 push r11 305c0: cf 92 push r12 305c2: df 92 push r13 305c4: ef 92 push r14 305c6: ff 92 push r15 305c8: 4b 01 movw r8, r22 305ca: 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]; 305cc: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 305d0: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 305d4: 07 2e mov r0, r23 305d6: 00 0c add r0, r0 305d8: 88 0b sbc r24, r24 305da: 99 0b sbc r25, r25 305dc: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> if (!degTargetHotend(extruder)) 305e0: 20 e0 ldi r18, 0x00 ; 0 305e2: 30 e0 ldi r19, 0x00 ; 0 305e4: a9 01 movw r20, r18 305e6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 305ea: 88 23 and r24, r24 305ec: d1 f0 breq .+52 ; 0x30622 #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; 305ee: 10 92 b4 0d sts 0x0DB4, r1 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> if (!degTargetHotend(extruder)) return; #ifdef TEMP_RESIDENCY_TIME long residencyStart; residencyStart = -1; 305f2: cc 24 eor r12, r12 305f4: ca 94 dec r12 305f6: dc 2c mov r13, r12 305f8: 76 01 movw r14, r12 #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); if (residencyStart > -1) { codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL; 305fa: 98 ee ldi r25, 0xE8 ; 232 305fc: 49 2e mov r4, r25 305fe: 93 e0 ldi r25, 0x03 ; 3 30600: 59 2e mov r5, r25 30602: 61 2c mov r6, r1 30604: 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) || 30606: 80 91 b4 0d lds r24, 0x0DB4 ; 0x800db4 <_ZL13cancel_heatup.lto_priv.410> 3060a: 81 11 cpse r24, r1 3060c: 0a c0 rjmp .+20 ; 0x30622 3060e: 2f ef ldi r18, 0xFF ; 255 30610: c2 16 cp r12, r18 30612: d2 06 cpc r13, r18 30614: e2 06 cpc r14, r18 30616: f2 06 cpc r15, r18 30618: 89 f4 brne .+34 ; 0x3063c (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) { 3061a: 80 91 b3 0d lds r24, 0x0DB3 ; 0x800db3 3061e: 82 30 cpi r24, 0x02 ; 2 30620: b9 f4 brne .+46 ; 0x30650 { residencyStart = _millis(); } #endif //TEMP_RESIDENCY_TIME } } 30622: ff 90 pop r15 30624: ef 90 pop r14 30626: df 90 pop r13 30628: cf 90 pop r12 3062a: bf 90 pop r11 3062c: af 90 pop r10 3062e: 9f 90 pop r9 30630: 8f 90 pop r8 30632: 7f 90 pop r7 30634: 6f 90 pop r6 30636: 5f 90 pop r5 30638: 4f 90 pop r4 3063a: 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) || 3063c: f7 fc sbrc r15, 7 3063e: f1 cf rjmp .-30 ; 0x30622 (residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) { 30640: 0f 94 28 2a call 0x25450 ; 0x25450 30644: 6c 19 sub r22, r12 30646: 7d 09 sbc r23, r13 30648: 68 3b cpi r22, 0xB8 ; 184 3064a: 7b 40 sbci r23, 0x0B ; 11 3064c: 30 f3 brcs .-52 ; 0x3061a 3064e: e9 cf rjmp .-46 ; 0x30622 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) 30650: 0f 94 28 2a call 0x25450 ; 0x25450 30654: 68 19 sub r22, r8 30656: 79 09 sbc r23, r9 30658: 8a 09 sbc r24, r10 3065a: 9b 09 sbc r25, r11 3065c: 69 3e cpi r22, 0xE9 ; 233 3065e: 73 40 sbci r23, 0x03 ; 3 30660: 81 05 cpc r24, r1 30662: 91 05 cpc r25, r1 30664: f0 f1 brcs .+124 ; 0x306e2 { //Print Temp Reading and remaining time every 1 second while heating up/cooling down if (!farm_mode) { SERIAL_PROTOCOLPGM("T:"); 30666: 8b e3 ldi r24, 0x3B ; 59 30668: 99 ea ldi r25, 0xA9 ; 169 3066a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 3066e: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 30672: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 30676: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 3067a: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 3067e: 41 e0 ldi r20, 0x01 ; 1 30680: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 SERIAL_PROTOCOL_F(degHotend(extruder), 1); SERIAL_PROTOCOLPGM(" E:"); 30684: 87 e3 ldi r24, 0x37 ; 55 30686: 99 ea ldi r25, 0xA9 ; 169 30688: 0e 94 e8 76 call 0xedd0 ; 0xedd0 3068c: 60 e0 ldi r22, 0x00 ; 0 3068e: 70 e0 ldi r23, 0x00 ; 0 30690: cb 01 movw r24, r22 30692: 0f 94 5f d5 call 0x3aabe ; 0x3aabe SERIAL_PROTOCOL((int)extruder); #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); 30696: 83 e3 ldi r24, 0x33 ; 51 30698: 99 ea ldi r25, 0xA9 ; 169 3069a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 if (residencyStart > -1) 3069e: f7 fc sbrc r15, 7 306a0: 52 c0 rjmp .+164 ; 0x30746 { codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL; 306a2: 0f 94 28 2a call 0x25450 ; 0x25450 306a6: 46 01 movw r8, r12 306a8: 57 01 movw r10, r14 306aa: 58 eb ldi r21, 0xB8 ; 184 306ac: 85 0e add r8, r21 306ae: 5b e0 ldi r21, 0x0B ; 11 306b0: 95 1e adc r9, r21 306b2: a1 1c adc r10, r1 306b4: b1 1c adc r11, r1 306b6: a5 01 movw r20, r10 306b8: 94 01 movw r18, r8 306ba: 26 1b sub r18, r22 306bc: 37 0b sbc r19, r23 306be: 48 0b sbc r20, r24 306c0: 59 0b sbc r21, r25 306c2: ca 01 movw r24, r20 306c4: b9 01 movw r22, r18 306c6: a3 01 movw r20, r6 306c8: 92 01 movw r18, r4 306ca: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 306ce: ca 01 movw r24, r20 306d0: b9 01 movw r22, r18 306d2: 0f 94 5f d5 call 0x3aabe ; 0x3aabe } void MarlinSerial::println(char c, int base) { print(c, base); println(); 306d6: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 } } #else SERIAL_PROTOCOLLN(); #endif codenum = _millis(); 306da: 0f 94 28 2a call 0x25450 ; 0x25450 306de: 4b 01 movw r8, r22 306e0: 5c 01 movw r10, r24 } delay_keep_alive(0); //do not disable steppers 306e2: 90 e0 ldi r25, 0x00 ; 0 306e4: 80 e0 ldi r24, 0x00 ; 0 306e6: 0e 94 84 8c call 0x11908 ; 0x11908 #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))) || 306ea: 3f ef ldi r19, 0xFF ; 255 306ec: c3 16 cp r12, r19 306ee: d3 06 cpc r13, r19 306f0: e3 06 cpc r14, r19 306f2: f3 06 cpc r15, r19 306f4: 09 f0 breq .+2 ; 0x306f8 306f6: 46 c0 rjmp .+140 ; 0x30784 } 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))) || 306f8: 80 91 ae 0d lds r24, 0x0DAE ; 0x800dae <_ZL16target_direction.lto_priv.534> 306fc: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 30700: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 30704: 88 23 and r24, r24 30706: 19 f1 breq .+70 ; 0x3074e 30708: 07 2e mov r0, r23 3070a: 00 0c add r0, r0 3070c: 88 0b sbc r24, r24 3070e: 99 0b sbc r25, r25 30710: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 30714: 20 e0 ldi r18, 0x00 ; 0 30716: 30 e0 ldi r19, 0x00 ; 0 30718: 40 e8 ldi r20, 0x80 ; 128 3071a: 5f e3 ldi r21, 0x3F ; 63 3071c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 30720: 9b 01 movw r18, r22 30722: ac 01 movw r20, r24 30724: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 30728: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 3072c: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 30730: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 30734: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 30738: 87 fd sbrc r24, 7 3073a: 65 cf rjmp .-310 ; 0x30606 (residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) || (residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS)) { residencyStart = _millis(); 3073c: 0f 94 28 2a call 0x25450 ; 0x25450 30740: 6b 01 movw r12, r22 30742: 7c 01 movw r14, r24 30744: 60 cf rjmp .-320 ; 0x30606 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 30746: 8f e3 ldi r24, 0x3F ; 63 30748: 0e 94 cf 76 call 0xed9e ; 0xed9e 3074c: c4 cf rjmp .-120 ; 0x306d6 3074e: 07 2e mov r0, r23 30750: 00 0c add r0, r0 30752: 88 0b sbc r24, r24 30754: 99 0b sbc r25, r25 30756: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__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))) || 3075a: 20 e0 ldi r18, 0x00 ; 0 3075c: 30 e0 ldi r19, 0x00 ; 0 3075e: 40 e8 ldi r20, 0x80 ; 128 30760: 5f e3 ldi r21, 0x3F ; 63 30762: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 30766: 9b 01 movw r18, r22 30768: ac 01 movw r20, r24 3076a: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 3076e: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 30772: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 30776: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 3077a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 3077e: 18 16 cp r1, r24 30780: ec f6 brge .-70 ; 0x3073c 30782: 41 cf rjmp .-382 ; 0x30606 30784: f7 fc sbrc r15, 7 30786: 3f cf rjmp .-386 ; 0x30606 30788: 60 91 b5 0d lds r22, 0x0DB5 ; 0x800db5 3078c: 70 91 b6 0d lds r23, 0x0DB6 ; 0x800db6 30790: 07 2e mov r0, r23 30792: 00 0c add r0, r0 30794: 88 0b sbc r24, r24 30796: 99 0b sbc r25, r25 30798: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 3079c: 9b 01 movw r18, r22 3079e: ac 01 movw r20, r24 (residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS)) 307a0: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 307a4: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 307a8: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 307ac: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 307b0: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 307b4: 9f 77 andi r25, 0x7F ; 127 307b6: 20 e0 ldi r18, 0x00 ; 0 307b8: 30 e0 ldi r19, 0x00 ; 0 307ba: 40 ea ldi r20, 0xA0 ; 160 307bc: 50 e4 ldi r21, 0x40 ; 64 307be: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 307c2: 18 16 cp r1, r24 307c4: 0c f0 brlt .+2 ; 0x307c8 307c6: 1f cf rjmp .-450 ; 0x30606 307c8: b9 cf rjmp .-142 ; 0x3073c 000307ca : // 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) { 307ca: 1f 93 push r17 307cc: cf 93 push r28 307ce: df 93 push r29 307d0: ec 01 movw r28, r24 307d2: 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()) { 307d4: 80 91 8c 13 lds r24, 0x138C ; 0x80138c 307d8: 83 30 cpi r24, 0x03 ; 3 307da: 09 f4 brne .+2 ; 0x307de 307dc: 4e c0 rjmp .+156 ; 0x3087a 307de: 8c 31 cpi r24, 0x1C ; 28 307e0: 09 f4 brne .+2 ; 0x307e4 307e2: 52 c0 rjmp .+164 ; 0x30888 break; default: break; } if (ec != lastErrorCode) { // deduplicate: only report changes in error codes into the log 307e4: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 307e8: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 307ec: 8c 17 cp r24, r28 307ee: 9d 07 cpc r25, r29 307f0: 79 f1 breq .+94 ; 0x30850 lastErrorCode = ec; 307f2: d0 93 b2 13 sts 0x13B2, r29 ; 0x8013b2 307f6: c0 93 b1 13 sts 0x13B1, r28 ; 0x8013b1 lastErrorSource = res; 307fa: 10 93 b3 13 sts 0x13B3, r17 ; 0x8013b3 LogErrorEvent_P(_O(PrusaErrorTitle(PrusaErrorCodeIndex(ec)))); 307fe: ce 01 movw r24, r28 30800: 0f 94 e0 c5 call 0x38bc0 ; 0x38bc0 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); 30804: e8 2f mov r30, r24 30806: f0 e0 ldi r31, 0x00 ; 0 30808: ee 0f add r30, r30 3080a: ff 1f adc r31, r31 3080c: e9 59 subi r30, 0x99 ; 153 3080e: f7 45 sbci r31, 0x57 ; 87 30810: 85 91 lpm r24, Z+ 30812: 94 91 lpm r25, Z 30814: 02 96 adiw r24, 0x02 ; 2 30816: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 if (ec != ErrorCode::OK && ec != ErrorCode::FILAMENT_EJECTED && ec != ErrorCode::FILAMENT_CHANGE) { 3081a: c1 30 cpi r28, 0x01 ; 1 3081c: d1 05 cpc r29, r1 3081e: c1 f0 breq .+48 ; 0x30850 30820: cc 30 cpi r28, 0x0C ; 12 30822: 80 e8 ldi r24, 0x80 ; 128 30824: d8 07 cpc r29, r24 30826: a1 f0 breq .+40 ; 0x30850 30828: c9 32 cpi r28, 0x29 ; 41 3082a: 80 e8 ldi r24, 0x80 ; 128 3082c: d8 07 cpc r29, r24 3082e: 81 f0 breq .+32 ; 0x30850 IncrementMMUFails(); 30830: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 | (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 30834: ce 01 movw r24, r28 30836: 88 27 eor r24, r24 30838: 9e 77 andi r25, 0x7E ; 126 3083a: 89 2b or r24, r25 3083c: 49 f0 breq .+18 ; 0x30850 /// Set toolchange counter to zero inline void ClearToolChangeCounter() { toolchange_counter = 0; }; inline uint16_t TMCFailures() const { return tmcFailures; } inline void IncrementTMCFailures() { ++tmcFailures; } 3083e: 80 91 bf 13 lds r24, 0x13BF ; 0x8013bf 30842: 90 91 c0 13 lds r25, 0x13C0 ; 0x8013c0 30846: 01 96 adiw r24, 0x01 ; 1 30848: 90 93 c0 13 sts 0x13C0, r25 ; 0x8013c0 3084c: 80 93 bf 13 sts 0x13BF, r24 ; 0x8013bf return true; } } bool MMU2::RetryIfPossible(ErrorCode ec) { if (logic.RetryAttempts()) { 30850: 80 91 9e 13 lds r24, 0x139E ; 0x80139e 30854: 88 23 and r24, r24 30856: d9 f0 breq .+54 ; 0x3088e return Buttons::NoButton; } void SetButtonResponse(ButtonOperations rsp) { buttonSelectedOperation = rsp; 30858: 11 e0 ldi r17, 0x01 ; 1 3085a: 10 93 ad 0d sts 0x0DAD, r17 ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> SetButtonResponse(ButtonOperations::Retry); // check, that Retry is actually allowed on that operation if (ButtonAvailable(ec) != Buttons::NoButton) { 3085e: ce 01 movw r24, r28 30860: 0f 94 6b c8 call 0x390d6 ; 0x390d6 30864: 8f 3f cpi r24, 0xFF ; 255 30866: 99 f0 breq .+38 ; 0x3088e void ResetCommunicationTimeoutAttempts(); constexpr bool InAutoRetry() const { return inAutoRetry; } void SetInAutoRetry(bool iar) { inAutoRetry = iar; 30868: 10 93 9f 13 sts 0x139F, r17 ; 0x80139f logic.SetInAutoRetry(true); SERIAL_ECHOLNPGM("RetryButtonPressed"); 3086c: 84 e5 ldi r24, 0x54 ; 84 3086e: 98 ea ldi r25, 0xA8 ; 168 && mmu2Magic[2] == 'U' && mmu2Magic[3] == '2' && mmu2Magic[4] == ':' && strlen_constexpr(mmu2Magic) == 5, "MMU2 logging prefix mismatch, must be updated at various spots"); } 30870: df 91 pop r29 30872: cf 91 pop r28 30874: 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"); 30876: 0c 94 13 79 jmp 0xf226 ; 0xf226 // 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; 3087a: 10 92 bc 13 sts 0x13BC, r1 ; 0x8013bc float move_raise_z(float delta) { return raise_z(delta); } void planner_abort_queued_moves() { planner_abort_hard(); 3087e: 0f 94 b7 c1 call 0x3836e ; 0x3836e // 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; 30882: 10 92 ab 0d sts 0x0DAB, r1 ; 0x800dab 30886: ae cf rjmp .-164 ; 0x307e4 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; 30888: 10 92 bb 13 sts 0x13BB, r1 ; 0x8013bb 3088c: f8 cf rjmp .-16 ; 0x3087e 3088e: 10 92 9f 13 sts 0x139F, r1 ; 0x80139f bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { if (putErrorScreenToSleep) return; 30892: 80 91 ac 0d lds r24, 0x0DAC ; 0x800dac <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.498> 30896: 81 11 cpse r24, r1 30898: 06 c0 rjmp .+12 ; 0x308a6 3089a: 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"); } 3089c: df 91 pop r29 3089e: cf 91 pop r28 308a0: 1f 91 pop r17 308a2: 0d 94 31 c7 jmp 0x38e62 ; 0x38e62 308a6: df 91 pop r29 308a8: cf 91 pop r28 308aa: 1f 91 pop r17 308ac: 08 95 ret 000308ae : * \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) { 308ae: 2f 92 push r2 308b0: 3f 92 push r3 308b2: 4f 92 push r4 308b4: 5f 92 push r5 308b6: 6f 92 push r6 308b8: 7f 92 push r7 308ba: 8f 92 push r8 308bc: 9f 92 push r9 308be: af 92 push r10 308c0: bf 92 push r11 308c2: cf 92 push r12 308c4: df 92 push r13 308c6: ef 92 push r14 308c8: ff 92 push r15 308ca: 0f 93 push r16 308cc: 1f 93 push r17 308ce: cf 93 push r28 308d0: df 93 push r29 308d2: 00 d0 rcall .+0 ; 0x308d4 308d4: 1f 92 push r1 308d6: cd b7 in r28, 0x3d ; 61 308d8: de b7 in r29, 0x3e ; 62 308da: 5c 01 movw r10, r24 308dc: 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; 308de: 80 91 22 17 lds r24, 0x1722 ; 0x801722 308e2: 81 30 cpi r24, 0x01 ; 1 308e4: 09 f0 breq .+2 ; 0x308e8 308e6: de c0 rjmp .+444 ; 0x30aa4 308e8: 80 91 20 17 lds r24, 0x1720 ; 0x801720 308ec: 81 ff sbrs r24, 1 308ee: da c0 rjmp .+436 ; 0x30aa4 // seek to end of file if append flag if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { 308f0: 82 fd sbrc r24, 2 308f2: bc c0 rjmp .+376 ; 0x30a6c * \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) { 308f4: 74 01 movw r14, r8 curCluster_ = next; } } } // max space in block uint16_t n = 512 - blockOffset; 308f6: 21 2c mov r2, r1 308f8: 32 e0 ldi r19, 0x02 ; 2 308fa: 33 2e mov r3, r19 308fc: 00 91 27 17 lds r16, 0x1727 ; 0x801727 30900: 10 91 28 17 lds r17, 0x1728 ; 0x801728 30904: 20 91 29 17 lds r18, 0x1729 ; 0x801729 30908: 30 91 2a 17 lds r19, 0x172A ; 0x80172a // seek to end of file if append flag if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { if (!seekEnd()) goto fail; } while (nToWrite > 0) { 3090c: e1 14 cp r14, r1 3090e: f1 04 cpc r15, r1 30910: 09 f4 brne .+2 ; 0x30914 30912: 30 c1 rjmp .+608 ; 0x30b74 uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); 30914: 80 91 38 17 lds r24, 0x1738 ; 0x801738 30918: 90 91 39 17 lds r25, 0x1739 ; 0x801739 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);} 3091c: dc 01 movw r26, r24 3091e: 14 96 adiw r26, 0x04 ; 4 30920: 7c 90 ld r7, X 30922: 7a 94 dec r7 30924: b9 01 movw r22, r18 30926: a8 01 movw r20, r16 30928: 29 e0 ldi r18, 0x09 ; 9 3092a: 76 95 lsr r23 3092c: 67 95 ror r22 3092e: 57 95 ror r21 30930: 47 95 ror r20 30932: 2a 95 dec r18 30934: d1 f7 brne .-12 ; 0x3092a 30936: 74 22 and r7, r20 uint16_t blockOffset = curPosition_ & 0X1FF; 30938: 11 70 andi r17, 0x01 ; 1 if (blockOfCluster == 0 && blockOffset == 0) { 3093a: 71 10 cpse r7, r1 3093c: 25 c0 rjmp .+74 ; 0x30988 3093e: 01 15 cp r16, r1 30940: 11 05 cpc r17, r1 30942: 11 f5 brne .+68 ; 0x30988 30944: 40 91 23 17 lds r20, 0x1723 ; 0x801723 30948: 50 91 24 17 lds r21, 0x1724 ; 0x801724 3094c: 60 91 25 17 lds r22, 0x1725 ; 0x801725 30950: 70 91 26 17 lds r23, 0x1726 ; 0x801726 // start of new cluster if (curCluster_ == 0) { 30954: 41 15 cp r20, r1 30956: 51 05 cpc r21, r1 30958: 61 05 cpc r22, r1 3095a: 71 05 cpc r23, r1 3095c: 09 f0 breq .+2 ; 0x30960 3095e: a8 c0 rjmp .+336 ; 0x30ab0 if (firstCluster_ == 0) { 30960: 80 91 34 17 lds r24, 0x1734 ; 0x801734 30964: 90 91 35 17 lds r25, 0x1735 ; 0x801735 30968: a0 91 36 17 lds r26, 0x1736 ; 0x801736 3096c: b0 91 37 17 lds r27, 0x1737 ; 0x801737 30970: 00 97 sbiw r24, 0x00 ; 0 30972: a1 05 cpc r26, r1 30974: b1 05 cpc r27, r1 30976: 09 f0 breq .+2 ; 0x3097a 30978: b4 c0 rjmp .+360 ; 0x30ae2 } 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; 3097a: 8f e1 ldi r24, 0x1F ; 31 3097c: 97 e1 ldi r25, 0x17 ; 23 3097e: 0f 94 1d 58 call 0x2b03a ; 0x2b03a 30982: 88 23 and r24, r24 30984: 09 f4 brne .+2 ; 0x30988 30986: 8e c0 rjmp .+284 ; 0x30aa4 curCluster_ = next; } } } // max space in block uint16_t n = 512 - blockOffset; 30988: c1 01 movw r24, r2 3098a: 80 1b sub r24, r16 3098c: 91 0b sbc r25, r17 3098e: 67 01 movw r12, r14 30990: 8e 15 cp r24, r14 30992: 9f 05 cpc r25, r15 30994: 08 f4 brcc .+2 ; 0x30998 30996: 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; 30998: e0 91 38 17 lds r30, 0x1738 ; 0x801738 3099c: f0 91 39 17 lds r31, 0x1739 ; 0x801739 uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);} 309a0: 80 91 23 17 lds r24, 0x1723 ; 0x801723 309a4: 90 91 24 17 lds r25, 0x1724 ; 0x801724 309a8: a0 91 25 17 lds r26, 0x1725 ; 0x801725 309ac: b0 91 26 17 lds r27, 0x1726 ; 0x801726 309b0: 02 97 sbiw r24, 0x02 ; 2 309b2: a1 09 sbc r26, r1 309b4: b1 09 sbc r27, r1 309b6: 25 85 ldd r18, Z+13 ; 0x0d 309b8: 04 c0 rjmp .+8 ; 0x309c2 309ba: 88 0f add r24, r24 309bc: 99 1f adc r25, r25 309be: aa 1f adc r26, r26 309c0: bb 1f adc r27, r27 309c2: 2a 95 dec r18 309c4: d2 f7 brpl .-12 ; 0x309ba 309c6: 46 85 ldd r20, Z+14 ; 0x0e 309c8: 57 85 ldd r21, Z+15 ; 0x0f 309ca: 60 89 ldd r22, Z+16 ; 0x10 309cc: 71 89 ldd r23, Z+17 ; 0x11 309ce: 84 0f add r24, r20 309d0: 95 1f adc r25, r21 309d2: a6 1f adc r26, r22 309d4: b7 1f adc r27, r23 309d6: 9c 01 movw r18, r24 309d8: ad 01 movw r20, r26 309da: 27 0d add r18, r7 309dc: 31 1d adc r19, r1 309de: 41 1d adc r20, r1 309e0: 51 1d adc r21, r1 309e2: 29 01 movw r4, r18 309e4: 3a 01 movw r6, r20 if (n == 512) { 309e6: c1 14 cp r12, r1 309e8: 32 e0 ldi r19, 0x02 ; 2 309ea: d3 06 cpc r13, r19 309ec: 09 f0 breq .+2 ; 0x309f0 309ee: 8a c0 rjmp .+276 ; 0x30b04 // full block - don't need to use cache if (vol_->cacheBlockNumber() == block) { 309f0: 80 91 90 0e lds r24, 0x0E90 ; 0x800e90 309f4: 90 91 91 0e lds r25, 0x0E91 ; 0x800e91 309f8: a0 91 92 0e lds r26, 0x0E92 ; 0x800e92 309fc: b0 91 93 0e lds r27, 0x0E93 ; 0x800e93 30a00: 48 16 cp r4, r24 30a02: 59 06 cpc r5, r25 30a04: 6a 06 cpc r6, r26 30a06: 7b 06 cpc r7, r27 30a08: 69 f4 brne .+26 ; 0x30a24 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; 30a0a: 10 92 98 0e sts 0x0E98, r1 ; 0x800e98 cacheBlockNumber_ = blockNumber; 30a0e: 8f ef ldi r24, 0xFF ; 255 30a10: 9f ef ldi r25, 0xFF ; 255 30a12: dc 01 movw r26, r24 30a14: 80 93 90 0e sts 0x0E90, r24 ; 0x800e90 30a18: 90 93 91 0e sts 0x0E91, r25 ; 0x800e91 30a1c: a0 93 92 0e sts 0x0E92, r26 ; 0x800e92 30a20: b0 93 93 0e sts 0x0E93, r27 ; 0x800e93 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); 30a24: 95 01 movw r18, r10 30a26: b3 01 movw r22, r6 30a28: a2 01 movw r20, r4 30a2a: 80 91 99 0e lds r24, 0x0E99 ; 0x800e99 30a2e: 90 91 9a 0e lds r25, 0x0E9A ; 0x800e9a 30a32: 0f 94 a8 53 call 0x2a750 ; 0x2a750 // invalidate cache if block is in cache vol_->cacheSetBlockNumber(0XFFFFFFFF, false); } if (!vol_->writeBlock(block, src)) goto fail; 30a36: 88 23 and r24, r24 30a38: a9 f1 breq .+106 ; 0x30aa4 if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail; } uint8_t* dst = vol_->cache()->data + blockOffset; memcpy(dst, src, n); } curPosition_ += n; 30a3a: 80 91 27 17 lds r24, 0x1727 ; 0x801727 30a3e: 90 91 28 17 lds r25, 0x1728 ; 0x801728 30a42: a0 91 29 17 lds r26, 0x1729 ; 0x801729 30a46: b0 91 2a 17 lds r27, 0x172A ; 0x80172a 30a4a: 8c 0d add r24, r12 30a4c: 9d 1d adc r25, r13 30a4e: a1 1d adc r26, r1 30a50: b1 1d adc r27, r1 30a52: 80 93 27 17 sts 0x1727, r24 ; 0x801727 30a56: 90 93 28 17 sts 0x1728, r25 ; 0x801728 30a5a: a0 93 29 17 sts 0x1729, r26 ; 0x801729 30a5e: b0 93 2a 17 sts 0x172A, r27 ; 0x80172a src += n; 30a62: ac 0c add r10, r12 30a64: bd 1c adc r11, r13 nToWrite -= n; 30a66: ec 18 sub r14, r12 30a68: fd 08 sbc r15, r13 30a6a: 48 cf rjmp .-368 ; 0x308fc // 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_) { 30a6c: 40 91 30 17 lds r20, 0x1730 ; 0x801730 30a70: 50 91 31 17 lds r21, 0x1731 ; 0x801731 30a74: 60 91 32 17 lds r22, 0x1732 ; 0x801732 30a78: 70 91 33 17 lds r23, 0x1733 ; 0x801733 30a7c: 80 91 27 17 lds r24, 0x1727 ; 0x801727 30a80: 90 91 28 17 lds r25, 0x1728 ; 0x801728 30a84: a0 91 29 17 lds r26, 0x1729 ; 0x801729 30a88: b0 91 2a 17 lds r27, 0x172A ; 0x80172a 30a8c: 48 17 cp r20, r24 30a8e: 59 07 cpc r21, r25 30a90: 6a 07 cpc r22, r26 30a92: 7b 07 cpc r23, r27 30a94: 09 f4 brne .+2 ; 0x30a98 30a96: 2e cf rjmp .-420 ; 0x308f4 } /** 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);} 30a98: 8f e1 ldi r24, 0x1F ; 31 30a9a: 97 e1 ldi r25, 0x17 ; 23 30a9c: 0f 94 89 57 call 0x2af12 ; 0x2af12 if (!seekEnd()) goto fail; 30aa0: 81 11 cpse r24, r1 30aa2: 28 cf rjmp .-432 ; 0x308f4 } return nbyte; fail: // return for write error writeError = true; 30aa4: 81 e0 ldi r24, 0x01 ; 1 30aa6: 80 93 1f 17 sts 0x171F, r24 ; 0x80171f return -1; 30aaa: 8f ef ldi r24, 0xFF ; 255 30aac: 9f ef ldi r25, 0xFF ; 255 30aae: 81 c0 rjmp .+258 ; 0x30bb2 } else { curCluster_ = firstCluster_; } } else { uint32_t next; if (!vol_->fatGet(curCluster_, &next)) goto fail; 30ab0: 9e 01 movw r18, r28 30ab2: 2f 5f subi r18, 0xFF ; 255 30ab4: 3f 4f sbci r19, 0xFF ; 255 30ab6: 0f 94 d3 55 call 0x2aba6 ; 0x2aba6 30aba: 88 23 and r24, r24 30abc: 99 f3 breq .-26 ; 0x30aa4 if (vol_->isEOC(next)) { 30abe: 89 81 ldd r24, Y+1 ; 0x01 30ac0: 9a 81 ldd r25, Y+2 ; 0x02 30ac2: ab 81 ldd r26, Y+3 ; 0x03 30ac4: 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; 30ac6: e0 91 38 17 lds r30, 0x1738 ; 0x801738 30aca: f0 91 39 17 lds r31, 0x1739 ; 0x801739 30ace: 27 89 ldd r18, Z+23 ; 0x17 30ad0: 20 31 cpi r18, 0x10 ; 16 30ad2: 81 f4 brne .+32 ; 0x30af4 30ad4: 88 3f cpi r24, 0xF8 ; 248 30ad6: ef ef ldi r30, 0xFF ; 255 30ad8: 9e 07 cpc r25, r30 30ada: a1 05 cpc r26, r1 30adc: b1 05 cpc r27, r1 30ade: 08 f0 brcs .+2 ; 0x30ae2 30ae0: 4c cf rjmp .-360 ; 0x3097a // add cluster if at end of chain if (!addCluster()) goto fail; } else { curCluster_ = next; 30ae2: 80 93 23 17 sts 0x1723, r24 ; 0x801723 30ae6: 90 93 24 17 sts 0x1724, r25 ; 0x801724 30aea: a0 93 25 17 sts 0x1725, r26 ; 0x801725 30aee: b0 93 26 17 sts 0x1726, r27 ; 0x801726 30af2: 4a cf rjmp .-364 ; 0x30988 return cluster >= FAT32EOC_MIN; 30af4: 88 3f cpi r24, 0xF8 ; 248 30af6: ff ef ldi r31, 0xFF ; 255 30af8: 9f 07 cpc r25, r31 30afa: af 07 cpc r26, r31 30afc: ff e0 ldi r31, 0x0F ; 15 30afe: bf 07 cpc r27, r31 30b00: 80 f3 brcs .-32 ; 0x30ae2 30b02: 3b cf rjmp .-394 ; 0x3097a // invalidate cache if block is in cache vol_->cacheSetBlockNumber(0XFFFFFFFF, false); } if (!vol_->writeBlock(block, src)) goto fail; } else { if (blockOffset == 0 && curPosition_ >= fileSize_) { 30b04: 01 15 cp r16, r1 30b06: 11 05 cpc r17, r1 30b08: 69 f5 brne .+90 ; 0x30b64 30b0a: 40 91 27 17 lds r20, 0x1727 ; 0x801727 30b0e: 50 91 28 17 lds r21, 0x1728 ; 0x801728 30b12: 60 91 29 17 lds r22, 0x1729 ; 0x801729 30b16: 70 91 2a 17 lds r23, 0x172A ; 0x80172a 30b1a: 80 91 30 17 lds r24, 0x1730 ; 0x801730 30b1e: 90 91 31 17 lds r25, 0x1731 ; 0x801731 30b22: a0 91 32 17 lds r26, 0x1732 ; 0x801732 30b26: b0 91 33 17 lds r27, 0x1733 ; 0x801733 30b2a: 48 17 cp r20, r24 30b2c: 59 07 cpc r21, r25 30b2e: 6a 07 cpc r22, r26 30b30: 7b 07 cpc r23, r27 30b32: c0 f0 brcs .+48 ; 0x30b64 // start of new block don't need to read into cache if (!vol_->cacheFlush()) goto fail; 30b34: 0f 94 0c 54 call 0x2a818 ; 0x2a818 30b38: 88 23 and r24, r24 30b3a: 09 f4 brne .+2 ; 0x30b3e 30b3c: b3 cf rjmp .-154 ; 0x30aa4 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; 30b3e: 81 e0 ldi r24, 0x01 ; 1 30b40: 80 93 98 0e sts 0x0E98, r24 ; 0x800e98 cacheBlockNumber_ = blockNumber; 30b44: 40 92 90 0e sts 0x0E90, r4 ; 0x800e90 30b48: 50 92 91 0e sts 0x0E91, r5 ; 0x800e91 30b4c: 60 92 92 0e sts 0x0E92, r6 ; 0x800e92 30b50: 70 92 93 0e sts 0x0E93, r7 ; 0x800e93 } 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); 30b54: a6 01 movw r20, r12 30b56: b5 01 movw r22, r10 30b58: c8 01 movw r24, r16 30b5a: 84 56 subi r24, 0x64 ; 100 30b5c: 91 4f sbci r25, 0xF1 ; 241 30b5e: 0f 94 39 e2 call 0x3c472 ; 0x3c472 30b62: 6b cf rjmp .-298 ; 0x30a3a 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; 30b64: 41 e0 ldi r20, 0x01 ; 1 30b66: c3 01 movw r24, r6 30b68: b2 01 movw r22, r4 30b6a: 0f 94 04 55 call 0x2aa08 ; 0x2aa08 30b6e: 81 11 cpse r24, r1 30b70: f1 cf rjmp .-30 ; 0x30b54 30b72: 98 cf rjmp .-208 ; 0x30aa4 } curPosition_ += n; src += n; nToWrite -= n; } if (curPosition_ > fileSize_) { 30b74: 80 91 30 17 lds r24, 0x1730 ; 0x801730 30b78: 90 91 31 17 lds r25, 0x1731 ; 0x801731 30b7c: a0 91 32 17 lds r26, 0x1732 ; 0x801732 30b80: b0 91 33 17 lds r27, 0x1733 ; 0x801733 30b84: 80 17 cp r24, r16 30b86: 91 07 cpc r25, r17 30b88: a2 07 cpc r26, r18 30b8a: b3 07 cpc r27, r19 30b8c: 68 f4 brcc .+26 ; 0x30ba8 30b8e: 80 91 20 17 lds r24, 0x1720 ; 0x801720 // update fileSize and insure sync will update dir entry fileSize_ = curPosition_; 30b92: 00 93 30 17 sts 0x1730, r16 ; 0x801730 30b96: 10 93 31 17 sts 0x1731, r17 ; 0x801731 30b9a: 20 93 32 17 sts 0x1732, r18 ; 0x801732 30b9e: 30 93 33 17 sts 0x1733, r19 ; 0x801733 flags_ |= F_FILE_DIR_DIRTY; 30ba2: 80 68 ori r24, 0x80 ; 128 30ba4: 80 93 20 17 sts 0x1720, r24 ; 0x801720 } else if (dateTime_ && nbyte) { // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & O_SYNC) { 30ba8: 80 91 20 17 lds r24, 0x1720 ; 0x801720 30bac: 83 fd sbrc r24, 3 30bae: 18 c0 rjmp .+48 ; 0x30be0 if (!sync()) goto fail; } return nbyte; 30bb0: c4 01 movw r24, r8 fail: // return for write error writeError = true; return -1; } 30bb2: 0f 90 pop r0 30bb4: 0f 90 pop r0 30bb6: 0f 90 pop r0 30bb8: 0f 90 pop r0 30bba: df 91 pop r29 30bbc: cf 91 pop r28 30bbe: 1f 91 pop r17 30bc0: 0f 91 pop r16 30bc2: ff 90 pop r15 30bc4: ef 90 pop r14 30bc6: df 90 pop r13 30bc8: cf 90 pop r12 30bca: bf 90 pop r11 30bcc: af 90 pop r10 30bce: 9f 90 pop r9 30bd0: 8f 90 pop r8 30bd2: 7f 90 pop r7 30bd4: 6f 90 pop r6 30bd6: 5f 90 pop r5 30bd8: 4f 90 pop r4 30bda: 3f 90 pop r3 30bdc: 2f 90 pop r2 30bde: 08 95 ret // insure sync will update modified date and time flags_ |= F_FILE_DIR_DIRTY; } if (flags_ & O_SYNC) { if (!sync()) goto fail; 30be0: 8f e1 ldi r24, 0x1F ; 31 30be2: 97 e1 ldi r25, 0x17 ; 23 30be4: 0f 94 32 59 call 0x2b264 ; 0x2b264 30be8: 81 11 cpse r24, r1 30bea: e2 cf rjmp .-60 ; 0x30bb0 30bec: 5b cf rjmp .-330 ; 0x30aa4 00030bee : #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) { 30bee: 0f 93 push r16 30bf0: cf 93 push r28 30bf2: df 93 push r29 30bf4: cd b7 in r28, 0x3d ; 61 30bf6: de b7 in r29, 0x3e ; 62 30bf8: a3 97 sbiw r28, 0x23 ; 35 30bfa: 0f b6 in r0, 0x3f ; 63 30bfc: f8 94 cli 30bfe: de bf out 0x3e, r29 ; 62 30c00: 0f be out 0x3f, r0 ; 63 30c02: cd bf out 0x3d, r28 ; 61 if (nr < sort_count) 30c04: 20 91 30 16 lds r18, 0x1630 ; 0x801630 30c08: 30 91 31 16 lds r19, 0x1631 ; 0x801631 30c0c: 82 17 cp r24, r18 30c0e: 93 07 cpc r25, r19 30c10: d8 f4 brcc .+54 ; 0x30c48 getfilename_simple(sort_entries[(sdSort == SD_SORT_ALPHA) ? (sort_count - nr - 1) : nr]); 30c12: 61 30 cpi r22, 0x01 ; 1 30c14: 31 f4 brne .+12 ; 0x30c22 30c16: 21 50 subi r18, 0x01 ; 1 30c18: 31 09 sbc r19, r1 30c1a: a9 01 movw r20, r18 30c1c: 48 1b sub r20, r24 30c1e: 59 0b sbc r21, r25 30c20: ca 01 movw r24, r20 30c22: 88 0f add r24, r24 30c24: 99 1f adc r25, r25 30c26: fc 01 movw r30, r24 30c28: ee 5c subi r30, 0xCE ; 206 30c2a: f9 4e sbci r31, 0xE9 ; 233 30c2c: 80 81 ld r24, Z 30c2e: 91 81 ldd r25, Z+1 ; 0x01 30c30: 0f 94 7c 7a call 0x2f4f8 ; 0x2f4f8 else getfilename_afterMaxSorting(nr); } 30c34: a3 96 adiw r28, 0x23 ; 35 30c36: 0f b6 in r0, 0x3f ; 63 30c38: f8 94 cli 30c3a: de bf out 0x3e, r29 ; 62 30c3c: 0f be out 0x3f, r0 ; 63 30c3e: cd bf out 0x3d, r28 ; 61 30c40: df 91 pop r29 30c42: cf 91 pop r28 30c44: 0f 91 pop r16 30c46: 08 95 ret void CardReader::getfilename_afterMaxSorting(uint16_t entry, const char * const match/*=NULL*/) { curDir = &workDir; 30c48: 4a e3 ldi r20, 0x3A ; 58 30c4a: 55 e1 ldi r21, 0x15 ; 21 30c4c: 50 93 39 15 sts 0x1539, r21 ; 0x801539 30c50: 40 93 38 15 sts 0x1538, r20 ; 0x801538 nrFiles = entry - sort_count + 1; 30c54: 82 1b sub r24, r18 30c56: 93 0b sbc r25, r19 30c58: 01 96 adiw r24, 0x01 ; 1 30c5a: 90 93 a8 17 sts 0x17A8, r25 ; 0x8017a8 30c5e: 80 93 a7 17 sts 0x17A7, r24 ; 0x8017a7 curDir->seekSet(lastSortedFilePosition << 5); 30c62: 40 91 fa 16 lds r20, 0x16FA ; 0x8016fa 30c66: 50 91 fb 16 lds r21, 0x16FB ; 0x8016fb 30c6a: 85 e0 ldi r24, 0x05 ; 5 30c6c: 44 0f add r20, r20 30c6e: 55 1f adc r21, r21 30c70: 8a 95 dec r24 30c72: e1 f7 brne .-8 ; 0x30c6c 30c74: 70 e0 ldi r23, 0x00 ; 0 30c76: 60 e0 ldi r22, 0x00 ; 0 30c78: 8a e3 ldi r24, 0x3A ; 58 30c7a: 95 e1 ldi r25, 0x15 ; 21 30c7c: 0f 94 89 57 call 0x2af12 ; 0x2af12 }; struct ls_param { bool LFN : 1; bool timestamp : 1; inline ls_param():LFN(0), timestamp(0) { } 30c80: 00 e0 ldi r16, 0x00 ; 0 30c82: 0e 7f andi r16, 0xFE ; 254 30c84: 0d 7f andi r16, 0xFD ; 253 lsDive("", *curDir, match, LS_GetFilename); 30c86: e0 91 38 15 lds r30, 0x1538 ; 0x801538 30c8a: f0 91 39 15 lds r31, 0x1539 ; 0x801539 30c8e: 83 e2 ldi r24, 0x23 ; 35 30c90: de 01 movw r26, r28 30c92: 11 96 adiw r26, 0x01 ; 1 30c94: 01 90 ld r0, Z+ 30c96: 0d 92 st X+, r0 30c98: 8a 95 dec r24 30c9a: e1 f7 brne .-8 ; 0x30c94 30c9c: 22 e0 ldi r18, 0x02 ; 2 30c9e: 50 e0 ldi r21, 0x00 ; 0 30ca0: 40 e0 ldi r20, 0x00 ; 0 30ca2: be 01 movw r22, r28 30ca4: 6f 5f subi r22, 0xFF ; 255 30ca6: 7f 4f sbci r23, 0xFF ; 255 30ca8: 86 ef ldi r24, 0xF6 ; 246 30caa: 92 e0 ldi r25, 0x02 ; 2 30cac: 0f 94 06 78 call 0x2f00c ; 0x2f00c 30cb0: ce 01 movw r24, r28 30cb2: 01 96 adiw r24, 0x01 ; 1 30cb4: 0e 94 c9 76 call 0xed92 ; 0xed92 30cb8: bd cf rjmp .-134 ; 0x30c34 00030cba : SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLN('.'); } } void CardReader::openFileWrite(const char* name) 30cba: 0f 93 push r16 30cbc: 1f 93 push r17 30cbe: cf 93 push r28 30cc0: df 93 push r29 30cc2: 1f 92 push r1 30cc4: 1f 92 push r1 30cc6: cd b7 in r28, 0x3d ; 61 30cc8: de b7 in r29, 0x3e ; 62 { if(!mounted) 30cca: 20 91 90 14 lds r18, 0x1490 ; 0x801490 30cce: 22 23 and r18, r18 30cd0: 69 f1 breq .+90 ; 0x30d2c 30cd2: 8c 01 movw r16, r24 return; if(file.isOpen()){ //replacing current file by new file, or subfile call 30cd4: 80 91 22 17 lds r24, 0x1722 ; 0x801722 30cd8: 88 23 and r24, r24 30cda: 79 f1 breq .+94 ; 0x30d3a SERIAL_ECHOLN(sdpos); filespos[file_subcall_ctr]=sdpos; file_subcall_ctr++; file.close(); #else SERIAL_ECHOLNPGM("File already opened"); 30cdc: 8b e7 ldi r24, 0x7B ; 123 30cde: 97 ea ldi r25, 0xA7 ; 167 30ce0: 0e 94 13 79 call 0xf226 ; 0xf226 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; 30ce4: 10 92 8f 14 sts 0x148F, r1 ; 0x80148f const char *fname=name; 30ce8: 1a 83 std Y+2, r17 ; 0x02 30cea: 09 83 std Y+1, r16 ; 0x01 if (!diveSubfolder(fname)) 30cec: ce 01 movw r24, r28 30cee: 01 96 adiw r24, 0x01 ; 1 30cf0: 0f 94 bd 7f call 0x2ff7a ; 0x2ff7a 30cf4: 88 23 and r24, r24 30cf6: d1 f0 breq .+52 ; 0x30d2c return; //write if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)){ 30cf8: 49 81 ldd r20, Y+1 ; 0x01 30cfa: 5a 81 ldd r21, Y+2 ; 0x02 30cfc: 60 91 38 15 lds r22, 0x1538 ; 0x801538 30d00: 70 91 39 15 lds r23, 0x1539 ; 0x801539 30d04: 26 e5 ldi r18, 0x56 ; 86 30d06: 8f e1 ldi r24, 0x1F ; 31 30d08: 97 e1 ldi r25, 0x17 ; 23 30d0a: 0f 94 0f 65 call 0x2ca1e ; 0x2ca1e 30d0e: 81 11 cpse r24, r1 30d10: 22 c0 rjmp .+68 ; 0x30d56 SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL); 30d12: 8e e5 ldi r24, 0x5E ; 94 30d14: 90 e7 ldi r25, 0x70 ; 112 30d16: 0e 94 e8 76 call 0xedd0 ; 0xedd0 30d1a: 89 81 ldd r24, Y+1 ; 0x01 30d1c: 9a 81 ldd r25, Y+2 ; 0x02 30d1e: 0e 94 ac 87 call 0x10f58 ; 0x10f58 30d22: 8e e2 ldi r24, 0x2E ; 46 30d24: 0e 94 cf 76 call 0xed9e ; 0xed9e } void MarlinSerial::println(char c, int base) { print(c, base); println(); 30d28: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED lcd_setstatuspgm(ofFileSelected); scrollstuff = 0; } } 30d2c: 0f 90 pop r0 30d2e: 0f 90 pop r0 30d30: df 91 pop r29 30d32: cf 91 pop r28 30d34: 1f 91 pop r17 30d36: 0f 91 pop r16 30d38: 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 30d3a: 10 92 42 17 sts 0x1742, r1 ; 0x801742 SERIAL_ECHO_START; 30d3e: 82 ef ldi r24, 0xF2 ; 242 30d40: 9a ea ldi r25, 0xAA ; 170 30d42: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHORPGM(ofNowFreshFile); 30d46: 80 e8 ldi r24, 0x80 ; 128 30d48: 99 ea ldi r25, 0xA9 ; 169 30d4a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN(name); 30d4e: c8 01 movw r24, r16 30d50: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 30d54: c7 cf rjmp .-114 ; 0x30ce4 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; 30d56: 81 e0 ldi r24, 0x01 ; 1 30d58: 80 93 8d 14 sts 0x148D, r24 ; 0x80148d getfilename(0, fname); 30d5c: 89 81 ldd r24, Y+1 ; 0x01 30d5e: 9a 81 ldd r25, Y+2 ; 0x02 30d60: 0f 94 35 7a call 0x2f46a ; 0x2f46a SERIAL_PROTOCOLRPGM(ofWritingToFile);////MSG_SD_WRITE_TO_FILE 30d64: 89 e6 ldi r24, 0x69 ; 105 30d66: 97 ea ldi r25, 0xA7 ; 167 30d68: 0e 94 e8 76 call 0xedd0 ; 0xedd0 printAbsFilenameFast(); 30d6c: 0f 94 18 7b call 0x2f630 ; 0x2f630 SERIAL_PROTOCOLLN(); 30d70: 0f 94 f1 d5 call 0x3abe2 ; 0x3abe2 SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED 30d74: 8c e5 ldi r24, 0x5C ; 92 30d76: 99 ea ldi r25, 0xA9 ; 169 30d78: 0e 94 13 79 call 0xf226 ; 0xf226 lcd_setstatuspgm(ofFileSelected); 30d7c: 8c e5 ldi r24, 0x5C ; 92 30d7e: 99 ea ldi r25, 0xA9 ; 169 30d80: 0e 94 16 f2 call 0x1e42c ; 0x1e42c scrollstuff = 0; 30d84: 10 92 b8 0d sts 0x0DB8, r1 ; 0x800db8 30d88: d1 cf rjmp .-94 ; 0x30d2c 00030d8a : //presort(); #endif } } bool CardReader::ToshibaFlashAir_GetIP(uint8_t *ip) 30d8a: 0f 93 push r16 30d8c: 1f 93 push r17 30d8e: cf 93 push r28 30d90: df 93 push r29 30d92: ec 01 movw r28, r24 { memset(ip, 0, 4); 30d94: 84 e0 ldi r24, 0x04 ; 4 30d96: fe 01 movw r30, r28 30d98: 11 92 st Z+, r1 30d9a: 8a 95 dec r24 30d9c: e9 f7 brne .-6 ; 0x30d98 /** 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 30d9e: 23 e0 ldi r18, 0x03 ; 3 30da0: 30 ea ldi r19, 0xA0 ; 160 30da2: 4a e0 ldi r20, 0x0A ; 10 30da4: 50 e9 ldi r21, 0x90 ; 144 30da6: 60 e3 ldi r22, 0x30 ; 48 30da8: 8c ef ldi r24, 0xFC ; 252 30daa: 96 e1 ldi r25, 0x16 ; 22 30dac: 0f 94 48 53 call 0x2a690 ; 0x2a690 30db0: 88 23 and r24, r24 30db2: 91 f0 breq .+36 ; 0x30dd8 30db4: 23 e0 ldi r18, 0x03 ; 3 30db6: 30 ea ldi r19, 0xA0 ; 160 30db8: 4a e0 ldi r20, 0x0A ; 10 30dba: 50 e9 ldi r21, 0x90 ; 144 30dbc: 61 e1 ldi r22, 0x11 ; 17 30dbe: 8c ef ldi r24, 0xFC ; 252 30dc0: 96 e1 ldi r25, 0x16 ; 22 30dc2: 0f 94 48 53 call 0x2a690 ; 0x2a690 30dc6: 88 23 and r24, r24 30dc8: 39 f0 breq .+14 ; 0x30dd8 bool eraseSingleBlockEnable(); /** * Set SD error code. * \param[in] code value for error code. */ void error(uint8_t code) {errorCode_ = code;} 30dca: 80 e8 ldi r24, 0x80 ; 128 30dcc: 80 93 fc 16 sts 0x16FC, r24 ; 0x8016fc chipSelectHigh(); spiSend(0xFF); // dummy clock to force FlashAir finish the command. return true; fail: chipSelectHigh(); 30dd0: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c return false; 30dd4: 80 e0 ldi r24, 0x00 ; 0 30dd6: 2f c0 rjmp .+94 ; 0x30e36 //------------------------------------------------------------------------------ /** 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(); 30dd8: 0f 94 28 2a call 0x25450 ; 0x25450 30ddc: 8b 01 movw r16, r22 while ((status_ = spiRec()) == 0XFF) { 30dde: 0f 94 41 53 call 0x2a682 ; 0x2a682 30de2: 80 93 fe 16 sts 0x16FE, r24 ; 0x8016fe 30de6: 8f 3f cpi r24, 0xFF ; 255 30de8: 69 f4 brne .+26 ; 0x30e04 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { 30dea: 0f 94 28 2a call 0x25450 ; 0x25450 30dee: 60 1b sub r22, r16 30df0: 71 0b sbc r23, r17 30df2: 6d 32 cpi r22, 0x2D ; 45 30df4: 71 40 sbci r23, 0x01 ; 1 30df6: 98 f3 brcs .-26 ; 0x30dde 30df8: 81 e1 ldi r24, 0x11 ; 17 30dfa: 80 93 fc 16 sts 0x16FC, r24 ; 0x8016fc goto fail; } return true; fail: chipSelectHigh(); 30dfe: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c 30e02: e6 cf rjmp .-52 ; 0x30dd0 if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto fail; } } if (status_ != DATA_START_BLOCK) { 30e04: 8e 3f cpi r24, 0xFE ; 254 30e06: 11 f0 breq .+4 ; 0x30e0c 30e08: 8f e0 ldi r24, 0x0F ; 15 30e0a: f7 cf rjmp .-18 ; 0x30dfa 30e0c: 8e 01 movw r16, r28 30e0e: 0c 5f subi r16, 0xFC ; 252 30e10: 1f 4f sbci r17, 0xFF ; 255 goto fail; } // receive data for (i = 0; i < count; ++i) { dst[i] = spiRec(); 30e12: 0f 94 41 53 call 0x2a682 ; 0x2a682 30e16: 89 93 st Y+, r24 if (!waitStartBlock()) { goto fail; } // receive data for (i = 0; i < count; ++i) { 30e18: c0 17 cp r28, r16 30e1a: d1 07 cpc r29, r17 30e1c: d1 f7 brne .-12 ; 0x30e12 30e1e: ce ef ldi r28, 0xFE ; 254 30e20: d1 e0 ldi r29, 0x01 ; 1 dst[i] = spiRec(); } // skip dummy bytes and 16-bit crc. for (; i < 514; ++i) { spiRec(); 30e22: 0f 94 41 53 call 0x2a682 ; 0x2a682 30e26: 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) { 30e28: e1 f7 brne .-8 ; 0x30e22 spiRec(); } chipSelectHigh(); 30e2a: 0f 94 b6 75 call 0x2eb6c ; 0x2eb6c spiSend(0xFF); // dummy clock to force FlashAir finish the command. 30e2e: 8f ef ldi r24, 0xFF ; 255 30e30: 0f 94 3c 53 call 0x2a678 ; 0x2a678 30e34: 81 e0 ldi r24, 0x01 ; 1 return card.readExtMemory(1, 1, 0x400+0x150, 4, ip); } 30e36: df 91 pop r29 30e38: cf 91 pop r28 30e3a: 1f 91 pop r17 30e3c: 0f 91 pop r16 30e3e: 08 95 ret 00030e40 : } 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) 30e40: 8f 92 push r8 30e42: 9f 92 push r9 30e44: af 92 push r10 30e46: bf 92 push r11 30e48: cf 92 push r12 30e4a: df 92 push r13 30e4c: ef 92 push r14 30e4e: ff 92 push r15 30e50: 0f 93 push r16 30e52: 1f 93 push r17 30e54: cf 93 push r28 30e56: df 93 push r29 30e58: 1f 92 push r1 30e5a: cd b7 in r28, 0x3d ; 61 30e5c: de b7 in r29, 0x3e ; 62 30e5e: 6b 01 movw r12, r22 30e60: 7c 01 movw r14, r24 30e62: 49 01 movw r8, r18 30e64: 5a 01 movw r10, r20 { #if defined(DEBUG_DCODE6) || defined(DEBUG_DCODES) || defined(XFLASH_DUMP) if(type == dcode_mem_t::xflash) 30e66: 03 30 cpi r16, 0x03 ; 3 30e68: 19 f4 brne .+6 ; 0x30e70 SPSR = 0x00; } static inline void spi_setup(uint8_t spcr, uint8_t spsr) { SPCR = spcr; 30e6a: 8c e5 ldi r24, 0x5C ; 92 30e6c: 8c bd out 0x2c, r24 ; 44 SPSR = spsr; 30e6e: 1d bc out 0x2d, r1 ; 45 XFLASH_SPI_ENTER(); #endif while (count) 30e70: 81 14 cp r8, r1 30e72: 91 04 cpc r9, r1 30e74: a1 04 cpc r10, r1 30e76: b1 04 cpc r11, r1 30e78: 09 f4 brne .+2 ; 0x30e7c 30e7a: 59 c0 rjmp .+178 ; 0x30f2e #endif void print_hex_word(daddr_t val) { #if DADDR_SIZE > 16 print_hex_byte((val >> 16) & 0xFF); 30e7c: 8e 2d mov r24, r14 30e7e: 0e 94 49 76 call 0xec92 ; 0xec92 #endif print_hex_byte((val >> 8) & 0xFF); 30e82: 8d 2d mov r24, r13 30e84: 0e 94 49 76 call 0xec92 ; 0xec92 print_hex_byte(val & 0xFF); 30e88: 8c 2d mov r24, r12 30e8a: 0e 94 49 76 call 0xec92 ; 0xec92 XFLASH_SPI_ENTER(); #endif while (count) { print_hex_word(address); putchar(' '); 30e8e: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> 30e92: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> 30e96: 80 e2 ldi r24, 0x20 ; 32 30e98: 90 e0 ldi r25, 0x00 ; 0 30e9a: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 uint8_t count_line = countperline; 30e9e: 10 e1 ldi r17, 0x10 ; 16 while (count && count_line) { uint8_t data = 0; 30ea0: 19 82 std Y+1, r1 ; 0x01 switch (type) 30ea2: 01 30 cpi r16, 0x01 ; 1 30ea4: b1 f1 breq .+108 ; 0x30f12 30ea6: 88 f1 brcs .+98 ; 0x30f0a 30ea8: 03 30 cpi r16, 0x03 ; 3 30eaa: b9 f1 breq .+110 ; 0x30f1a case dcode_mem_t::xflash: xflash_rd_data(address, &data, 1); break; #else case dcode_mem_t::xflash: break; #endif } ++address; 30eac: 8f ef ldi r24, 0xFF ; 255 30eae: c8 1a sub r12, r24 30eb0: d8 0a sbc r13, r24 30eb2: e8 0a sbc r14, r24 30eb4: f8 0a sbc r15, r24 putchar(' '); 30eb6: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> 30eba: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> 30ebe: 80 e2 ldi r24, 0x20 ; 32 30ec0: 90 e0 ldi r25, 0x00 ; 0 30ec2: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 print_hex_byte(data); 30ec6: 89 81 ldd r24, Y+1 ; 0x01 30ec8: 0e 94 49 76 call 0xec92 ; 0xec92 count_line--; 30ecc: 11 50 subi r17, 0x01 ; 1 count--; 30ece: 81 e0 ldi r24, 0x01 ; 1 30ed0: 88 1a sub r8, r24 30ed2: 91 08 sbc r9, r1 30ed4: a1 08 sbc r10, r1 30ed6: b1 08 sbc r11, 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)) 30ed8: 0f b6 in r0, 0x3f ; 63 30eda: 07 fe sbrs r0, 7 30edc: 06 c0 rjmp .+12 ; 0x30eea 30ede: c4 01 movw r24, r8 30ee0: 9f 71 andi r25, 0x1F ; 31 30ee2: 89 2b or r24, r25 30ee4: 11 f4 brne .+4 ; 0x30eea manage_heater(); 30ee6: 0f 94 34 39 call 0x27268 ; 0x27268 while (count) { print_hex_word(address); putchar(' '); uint8_t count_line = countperline; while (count && count_line) 30eea: 81 14 cp r8, r1 30eec: 91 04 cpc r9, r1 30eee: a1 04 cpc r10, r1 30ef0: b1 04 cpc r11, r1 30ef2: 11 f0 breq .+4 ; 0x30ef8 30ef4: 11 11 cpse r17, r1 30ef6: d4 cf rjmp .-88 ; 0x30ea0 // 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'); 30ef8: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> 30efc: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> 30f00: 8a e0 ldi r24, 0x0A ; 10 30f02: 90 e0 ldi r25, 0x00 ; 0 30f04: 0f 94 78 da call 0x3b4f0 ; 0x3b4f0 30f08: b3 cf rjmp .-154 ; 0x30e70 while (count && count_line) { uint8_t data = 0; switch (type) { case dcode_mem_t::sram: data = *((uint8_t*)address); break; 30f0a: f6 01 movw r30, r12 30f0c: 80 81 ld r24, Z case dcode_mem_t::eeprom: data = eeprom_read_byte((uint8_t*)address); break; 30f0e: 89 83 std Y+1, r24 ; 0x01 30f10: cd cf rjmp .-102 ; 0x30eac 30f12: c6 01 movw r24, r12 30f14: 0f 94 10 dc call 0x3b820 ; 0x3b820 30f18: fa cf rjmp .-12 ; 0x30f0e case dcode_mem_t::progmem: break; #if defined(DEBUG_DCODE6) || defined(DEBUG_DCODES) || defined(XFLASH_DUMP) case dcode_mem_t::xflash: xflash_rd_data(address, &data, 1); break; 30f1a: 21 e0 ldi r18, 0x01 ; 1 30f1c: 30 e0 ldi r19, 0x00 ; 0 30f1e: ae 01 movw r20, r28 30f20: 4f 5f subi r20, 0xFF ; 255 30f22: 5f 4f sbci r21, 0xFF ; 255 30f24: c7 01 movw r24, r14 30f26: b6 01 movw r22, r12 30f28: 0e 94 a0 ed call 0x1db40 ; 0x1db40 30f2c: bf cf rjmp .-130 ; 0x30eac if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192)) manage_heater(); } putchar('\n'); } } 30f2e: 0f 90 pop r0 30f30: df 91 pop r29 30f32: cf 91 pop r28 30f34: 1f 91 pop r17 30f36: 0f 91 pop r16 30f38: ff 90 pop r15 30f3a: ef 90 pop r14 30f3c: df 90 pop r13 30f3e: cf 90 pop r12 30f40: bf 90 pop r11 30f42: af 90 pop r10 30f44: 9f 90 pop r9 30f46: 8f 90 pop r8 30f48: 08 95 ret 00030f4a : #include "planner.h" #include "temperature.h" #include "ultralcd.h" #ifdef FILAMENT_SENSOR FSensorBlockRunout::FSensorBlockRunout() { 30f4a: cf 93 push r28 30f4c: 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; 30f4e: c9 ea ldi r28, 0xA9 ; 169 30f50: d7 e1 ldi r29, 0x17 ; 23 30f52: 1a 82 std Y+2, r1 ; 0x02 fsensor.deinit(); } } void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) { autoLoadEnabled = state; 30f54: 19 82 std Y+1, r1 ; 0x01 return fsensorDetected; } #endif void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) { jamDetection = state; 30f56: 1e 86 std Y+14, r1 ; 0x0e oldPos = pat9125_y; 30f58: 80 91 8e 0e lds r24, 0x0E8E ; 0x800e8e 30f5c: 90 91 8f 0e lds r25, 0x0E8F ; 0x800e8f 30f60: 98 8b std Y+16, r25 ; 0x10 30f62: 8f 87 std Y+15, r24 ; 0x0f resetStepCount(); 30f64: 0f 94 e1 7b call 0x2f7c2 ; 0x2f7c2 jamErrCnt = 0; 30f68: 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"); } 30f6a: df 91 pop r29 30f6c: cf 91 pop r28 30f6e: 08 95 ret 00030f70 : //! //! @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) 30f70: cf 92 push r12 30f72: df 92 push r13 30f74: ef 92 push r14 30f76: ff 92 push r15 30f78: 69 01 movw r12, r18 30f7a: 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); 30f7c: 2d ec ldi r18, 0xCD ; 205 30f7e: 3c ec ldi r19, 0xCC ; 204 30f80: 4c e4 ldi r20, 0x4C ; 76 30f82: 5e e3 ldi r21, 0x3E ; 62 30f84: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 30f88: 2d ec ldi r18, 0xCD ; 205 30f8a: 3c ec ldi r19, 0xCC ; 204 30f8c: 4c e4 ldi r20, 0x4C ; 76 30f8e: 5e e3 ldi r21, 0x3E ; 62 30f90: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 30f94: 2d ef ldi r18, 0xFD ; 253 30f96: 3d ea ldi r19, 0xAD ; 173 30f98: 40 e0 ldi r20, 0x00 ; 0 30f9a: 5d e3 ldi r21, 0x3D ; 61 30f9c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 30fa0: a7 01 movw r20, r14 30fa2: 96 01 movw r18, r12 30fa4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 30fa8: 24 e2 ldi r18, 0x24 ; 36 30faa: 30 ef ldi r19, 0xF0 ; 240 30fac: 49 e1 ldi r20, 0x19 ; 25 30fae: 50 e4 ldi r21, 0x40 ; 64 30fb0: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> } 30fb4: ff 90 pop r15 30fb6: ef 90 pop r14 30fb8: df 90 pop r13 30fba: cf 90 pop r12 30fbc: 08 95 ret 00030fbe : } } void st_set_position(const long *pos) { CRITICAL_SECTION_START; 30fbe: 9f b7 in r25, 0x3f ; 63 30fc0: 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)); 30fc2: 80 e1 ldi r24, 0x10 ; 16 30fc4: e2 ea ldi r30, 0xA2 ; 162 30fc6: f6 e0 ldi r31, 0x06 ; 6 30fc8: a2 eb ldi r26, 0xB2 ; 178 30fca: b6 e0 ldi r27, 0x06 ; 6 30fcc: 01 90 ld r0, Z+ 30fce: 0d 92 st X+, r0 30fd0: 8a 95 dec r24 30fd2: e1 f7 brne .-8 ; 0x30fcc CRITICAL_SECTION_END; 30fd4: 9f bf out 0x3f, r25 ; 63 } 30fd6: 08 95 ret 00030fd8 : #include "sound.h" namespace MMU2 { void BeginReport(CommandInProgress /*cip*/, ProgressCode ec) { custom_message_type = CustomMsg::MMUProgress; 30fd8: 89 e0 ldi r24, 0x09 ; 9 30fda: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 }; 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])) 30fde: e1 e9 ldi r30, 0x91 ; 145 30fe0: f7 ea ldi r31, 0xA7 ; 167 30fe2: 85 91 lpm r24, Z+ 30fe4: 94 91 lpm r25, Z lcd_setstatuspgm( _T(ProgressCodeToText(ec)) ); 30fe6: 0e 94 44 72 call 0xe488 ; 0xe488 30fea: 0c 94 16 f2 jmp 0x1e42c ; 0x1e42c 00030fee : 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){ 30fee: cf 93 push r28 30ff0: c8 2f mov r28, r24 extruder = ex; 30ff2: 80 93 a0 13 sts 0x13A0, r24 ; 0x8013a0 MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); 30ff6: 82 ef ldi r24, 0xF2 ; 242 30ff8: 9a ea ldi r25, 0xAA ; 170 30ffa: 0e 94 e8 76 call 0xedd0 ; 0xedd0 30ffe: 83 e6 ldi r24, 0x63 ; 99 31000: 97 ea ldi r25, 0xA7 ; 167 31002: 0e 94 e8 76 call 0xedd0 ; 0xedd0 31006: 89 e5 ldi r24, 0x59 ; 89 31008: 97 ea ldi r25, 0xA7 ; 167 3100a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN((int)ex); 3100e: 8c 2f mov r24, r28 31010: 90 e0 ldi r25, 0x00 ; 0 } 31012: cf 91 pop r28 } void MMU2::SetCurrentTool(uint8_t ex){ extruder = ex; MMU2_ECHO_MSGRPGM(PSTR("MMU2tool=")); SERIAL_ECHOLN((int)ex); 31014: 0d 94 ec 75 jmp 0x2ebd8 ; 0x2ebd8 00031018 : tmc2130_sg_measure = 0xff; return tmc2130_sg_measure_val / tmc2130_sg_measure_cnt; } bool tmc2130_wait_standstill_xy(int timeout) 31018: 0f 93 push r16 3101a: 1f 93 push r17 3101c: cf 93 push r28 3101e: df 93 push r29 31020: 00 d0 rcall .+0 ; 0x31022 31022: 00 d0 rcall .+0 ; 0x31024 31024: 1f 92 push r1 31026: 1f 92 push r1 31028: cd b7 in r28, 0x3d ; 61 3102a: de b7 in r29, 0x3e ; 62 3102c: 08 ee ldi r16, 0xE8 ; 232 3102e: 13 e0 ldi r17, 0x03 ; 3 { // DBG(_n("tmc2130_wait_standstill_xy(timeout=%d)\n"), timeout); bool standstill = false; while (!standstill && (timeout > 0)) { uint32_t drv_status_x = 0; 31030: 1d 82 std Y+5, r1 ; 0x05 31032: 1e 82 std Y+6, r1 ; 0x06 31034: 1f 82 std Y+7, r1 ; 0x07 31036: 18 86 std Y+8, r1 ; 0x08 uint32_t drv_status_y = 0; 31038: 19 82 std Y+1, r1 ; 0x01 3103a: 1a 82 std Y+2, r1 ; 0x02 3103c: 1b 82 std Y+3, r1 ; 0x03 3103e: 1c 82 std Y+4, r1 ; 0x04 tmc2130_rd(X_AXIS, TMC2130_REG_DRV_STATUS, &drv_status_x); 31040: ae 01 movw r20, r28 31042: 4b 5f subi r20, 0xFB ; 251 31044: 5f 4f sbci r21, 0xFF ; 255 31046: 6f e6 ldi r22, 0x6F ; 111 31048: 80 e0 ldi r24, 0x00 ; 0 3104a: 0f 94 cd 24 call 0x2499a ; 0x2499a tmc2130_rd(Y_AXIS, TMC2130_REG_DRV_STATUS, &drv_status_y); 3104e: ae 01 movw r20, r28 31050: 4f 5f subi r20, 0xFF ; 255 31052: 5f 4f sbci r21, 0xFF ; 255 31054: 6f e6 ldi r22, 0x6F ; 111 31056: 81 e0 ldi r24, 0x01 ; 1 31058: 0f 94 cd 24 call 0x2499a ; 0x2499a // DBG(_n("\tdrv_status_x=0x%08x drv_status_x=0x%08x\n"), drv_status_x, drv_status_y); standstill = (drv_status_x & 0x80000000) && (drv_status_y & 0x80000000); 3105c: 8d 81 ldd r24, Y+5 ; 0x05 3105e: 9e 81 ldd r25, Y+6 ; 0x06 31060: af 81 ldd r26, Y+7 ; 0x07 31062: b8 85 ldd r27, Y+8 ; 0x08 31064: b7 fd sbrc r27, 7 31066: 07 c0 rjmp .+14 ; 0x31076 tmc2130_check_overtemp(); 31068: 0f 94 c3 2a call 0x25586 ; 0x25586 3106c: 01 50 subi r16, 0x01 ; 1 3106e: 11 09 sbc r17, r1 bool tmc2130_wait_standstill_xy(int timeout) { // DBG(_n("tmc2130_wait_standstill_xy(timeout=%d)\n"), timeout); bool standstill = false; while (!standstill && (timeout > 0)) 31070: f9 f6 brne .-66 ; 0x31030 31072: 80 e0 ldi r24, 0x00 ; 0 31074: 09 c0 rjmp .+18 ; 0x31088 uint32_t drv_status_x = 0; uint32_t drv_status_y = 0; tmc2130_rd(X_AXIS, TMC2130_REG_DRV_STATUS, &drv_status_x); tmc2130_rd(Y_AXIS, TMC2130_REG_DRV_STATUS, &drv_status_y); // DBG(_n("\tdrv_status_x=0x%08x drv_status_x=0x%08x\n"), drv_status_x, drv_status_y); standstill = (drv_status_x & 0x80000000) && (drv_status_y & 0x80000000); 31076: 89 81 ldd r24, Y+1 ; 0x01 31078: 9a 81 ldd r25, Y+2 ; 0x02 3107a: ab 81 ldd r26, Y+3 ; 0x03 3107c: bc 81 ldd r27, Y+4 ; 0x04 3107e: b7 ff sbrs r27, 7 31080: f3 cf rjmp .-26 ; 0x31068 tmc2130_check_overtemp(); 31082: 0f 94 c3 2a call 0x25586 ; 0x25586 31086: 81 e0 ldi r24, 0x01 ; 1 timeout--; } return standstill; } 31088: 28 96 adiw r28, 0x08 ; 8 3108a: 0f b6 in r0, 0x3f ; 63 3108c: f8 94 cli 3108e: de bf out 0x3e, r29 ; 62 31090: 0f be out 0x3f, r0 ; 63 31092: cd bf out 0x3d, r28 ; 61 31094: df 91 pop r29 31096: cf 91 pop r28 31098: 1f 91 pop r17 3109a: 0f 91 pop r16 3109c: 08 95 ret 0003109e : 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) { 3109e: 1f 93 push r17 310a0: cf 93 push r28 310a2: df 93 push r29 310a4: ec 01 movw r28, r24 310a6: 16 2f mov r17, r22 bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 310a8: 0f 94 a9 43 call 0x28752 ; 0x28752 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))); 310ac: fe 01 movw r30, r28 310ae: 34 96 adiw r30, 0x04 ; 4 310b0: 25 91 lpm r18, Z+ 310b2: 35 91 lpm r19, Z+ 310b4: 45 91 lpm r20, Z+ 310b6: 54 91 lpm r21, Z 310b8: fe 01 movw r30, r28 310ba: 65 91 lpm r22, Z+ 310bc: 75 91 lpm r23, Z+ 310be: 85 91 lpm r24, Z+ 310c0: 94 91 lpm r25, Z 310c2: 0f 94 a5 c5 call 0x38b4a ; 0x38b4a step++; 310c6: 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) { 310c8: 11 50 subi r17, 0x01 ; 1 310ca: 81 f7 brne .-32 ; 0x310ac 310cc: 0f 94 a9 43 call 0x28752 ; 0x28752 // 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(); } 310d0: df 91 pop r29 310d2: cf 91 pop r28 310d4: 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(); 310d6: 0d 94 a3 c5 jmp 0x38b46 ; 0x38b46 000310da : } void EndReport(CommandInProgress /*cip*/, ProgressCode /*ec*/) { // clear the status msg line - let the printed filename get visible again if (!printJobOngoing()) { 310da: 0e 94 28 67 call 0xce50 ; 0xce50 310de: 81 11 cpse r24, r1 310e0: 04 c0 rjmp .+8 ; 0x310ea lcd_setstatuspgm(MSG_WELCOME); 310e2: 82 e1 ldi r24, 0x12 ; 18 310e4: 90 e7 ldi r25, 0x70 ; 112 310e6: 0e 94 16 f2 call 0x1e42c ; 0x1e42c } custom_message_type = CustomMsg::Status; 310ea: 10 92 c3 06 sts 0x06C3, r1 ; 0x8006c3 } 310ee: 08 95 ret 000310f0 : EndReport(cip, ProgressCode::OK); } }; bool MMU2::WaitForMMUReady() { switch (State()) { 310f0: 80 91 b9 13 lds r24, 0x13B9 ; 0x8013b9 310f4: 88 23 and r24, r24 310f6: 11 f0 breq .+4 ; 0x310fc 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; 310f8: 81 e0 ldi r24, 0x01 ; 1 310fa: 08 95 ret }; bool MMU2::WaitForMMUReady() { switch (State()) { case xState::Stopped: return false; 310fc: 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; } } 310fe: 08 95 ret 00031100 : } tmc2130_setup_chopper(axis, tmc2130_mres[axis]); tmc2130_set_pwr(axis, pwr); } void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000) 31100: 2f 92 push r2 31102: 3f 92 push r3 31104: 4f 92 push r4 31106: 5f 92 push r5 31108: 6f 92 push r6 3110a: 7f 92 push r7 3110c: 8f 92 push r8 3110e: 9f 92 push r9 31110: af 92 push r10 31112: bf 92 push r11 31114: cf 92 push r12 31116: df 92 push r13 31118: ef 92 push r14 3111a: ff 92 push r15 3111c: 0f 93 push r16 3111e: 1f 93 push r17 31120: cf 93 push r28 31122: df 93 push r29 31124: cd b7 in r28, 0x3d ; 61 31126: de b7 in r29, 0x3e ; 62 31128: 2d 97 sbiw r28, 0x0d ; 13 3112a: 0f b6 in r0, 0x3f ; 63 3112c: f8 94 cli 3112e: de bf out 0x3e, r29 ; 62 31130: 0f be out 0x3f, r0 ; 63 31132: cd bf out 0x3d, r28 ; 61 31134: e8 2e mov r14, r24 // TMC2130 wave compression algorithm // optimized for minimal memory requirements // printf_P(PSTR("tmc2130_set_wave %d %d\n"), axis, fac1000); if (fac1000 < TMC2130_WAVE_FAC1000_MIN) fac1000 = 0; if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; float fac = 0; 31136: 41 2c mov r4, r1 31138: 51 2c mov r5, r1 3113a: 32 01 movw r6, r4 void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000) { // TMC2130 wave compression algorithm // optimized for minimal memory requirements // printf_P(PSTR("tmc2130_set_wave %d %d\n"), axis, fac1000); if (fac1000 < TMC2130_WAVE_FAC1000_MIN) fac1000 = 0; 3113c: 6e 31 cpi r22, 0x1E ; 30 3113e: 90 f0 brcs .+36 ; 0x31164 if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; float fac = 0; if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor 31140: 69 3c cpi r22, 0xC9 ; 201 31142: 08 f0 brcs .+2 ; 0x31146 31144: 68 ec ldi r22, 0xC8 ; 200 31146: 70 e0 ldi r23, 0x00 ; 0 31148: 68 51 subi r22, 0x18 ; 24 3114a: 7c 4f sbci r23, 0xFC ; 252 3114c: 90 e0 ldi r25, 0x00 ; 0 3114e: 80 e0 ldi r24, 0x00 ; 0 31150: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 31154: 20 e0 ldi r18, 0x00 ; 0 31156: 30 e0 ldi r19, 0x00 ; 0 31158: 4a e7 ldi r20, 0x7A ; 122 3115a: 54 e4 ldi r21, 0x44 ; 68 3115c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 31160: 2b 01 movw r4, r22 31162: 3c 01 movw r6, r24 // printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA int8_t d0 = 0; //delta0 int8_t d1 = 1; //delta1 uint8_t w[4] = {1,1,1,1}; //W bits (MSLUTSEL) 31164: 80 91 bf 02 lds r24, 0x02BF ; 0x8002bf 31168: 90 91 c0 02 lds r25, 0x02C0 ; 0x8002c0 3116c: a0 91 c1 02 lds r26, 0x02C1 ; 0x8002c1 31170: b0 91 c2 02 lds r27, 0x02C2 ; 0x8002c2 31174: 89 83 std Y+1, r24 ; 0x01 31176: 9a 83 std Y+2, r25 ; 0x02 31178: ab 83 std Y+3, r26 ; 0x03 3117a: bc 83 std Y+4, r27 ; 0x04 uint8_t x[3] = {255,255,255}; //X segment bounds (MSLUTSEL) 3117c: 80 91 c3 02 lds r24, 0x02C3 ; 0x8002c3 31180: 90 91 c4 02 lds r25, 0x02C4 ; 0x8002c4 31184: a0 91 c5 02 lds r26, 0x02C5 ; 0x8002c5 31188: 8d 83 std Y+5, r24 ; 0x05 3118a: 9e 83 std Y+6, r25 ; 0x06 3118c: af 83 std Y+7, r26 ; 0x07 void tmc2130_wr_MSLUTSTART(uint8_t axis, uint8_t start_sin, uint8_t start_sin90) { uint32_t val = 0; val |= (uint32_t)start_sin; val |= ((uint32_t)start_sin90) << 16; tmc2130_wr(axis, TMC2130_REG_MSLUTSTART, val); 3118e: 20 e0 ldi r18, 0x00 ; 0 31190: 30 e0 ldi r19, 0x00 ; 0 31192: 47 ef ldi r20, 0xF7 ; 247 31194: 50 e0 ldi r21, 0x00 ; 0 31196: 69 ee ldi r22, 0xE9 ; 233 31198: 8e 2d mov r24, r14 3119a: 0f 94 27 25 call 0x24a4e ; 0x24a4e uint8_t x[3] = {255,255,255}; //X segment bounds (MSLUTSEL) uint8_t s = 0; //current segment int8_t b; //encoded bit value int8_t dA; //delta value uint8_t i = 0; //microstep index uint32_t reg = 0; //tmc2130 register 3119e: 81 2c mov r8, r1 311a0: 91 2c mov r9, r1 311a2: 54 01 movw r10, r8 uint8_t w[4] = {1,1,1,1}; //W bits (MSLUTSEL) uint8_t x[3] = {255,255,255}; //X segment bounds (MSLUTSEL) uint8_t s = 0; //current segment int8_t b; //encoded bit value int8_t dA; //delta value uint8_t i = 0; //microstep index 311a4: f1 2c mov r15, r1 uint8_t va = 0; //previous vA int8_t d0 = 0; //delta0 int8_t d1 = 1; //delta1 uint8_t w[4] = {1,1,1,1}; //W bits (MSLUTSEL) uint8_t x[3] = {255,255,255}; //X segment bounds (MSLUTSEL) uint8_t s = 0; //current segment 311a6: 10 e0 ldi r17, 0x00 ; 0 if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor // printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA int8_t d0 = 0; //delta0 int8_t d1 = 1; //delta1 311a8: 01 e0 ldi r16, 0x01 ; 1 float fac = 0; if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor // printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA int8_t d0 = 0; //delta0 311aa: d1 2c mov r13, r1 if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; float fac = 0; if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor // printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA 311ac: 19 86 std Y+9, r1 ; 0x09 uint8_t i = 0; //microstep index uint32_t reg = 0; //tmc2130 register tmc2130_wr_MSLUTSTART(axis, 0, amp); do { if ((i & 0x1f) == 0) 311ae: 2f 2c mov r2, r15 311b0: 31 2c mov r3, r1 311b2: 8f 2d mov r24, r15 311b4: 8f 71 andi r24, 0x1F ; 31 311b6: 88 87 std Y+8, r24 ; 0x08 311b8: 81 11 cpse r24, r1 311ba: 03 c0 rjmp .+6 ; 0x311c2 reg = 0; 311bc: 81 2c mov r8, r1 311be: 91 2c mov r9, r1 311c0: 54 01 movw r10, r8 311c2: b1 01 movw r22, r2 311c4: 03 2c mov r0, r3 311c6: 00 0c add r0, r0 311c8: 88 0b sbc r24, r24 311ca: 99 0b sbc r25, r25 311cc: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 311d0: 2b ed ldi r18, 0xDB ; 219 311d2: 3f e0 ldi r19, 0x0F ; 15 311d4: 49 ec ldi r20, 0xC9 ; 201 311d6: 50 e4 ldi r21, 0x40 ; 64 311d8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 311dc: 6a 87 std Y+10, r22 ; 0x0a 311de: 7b 87 std Y+11, r23 ; 0x0b 311e0: 8c 87 std Y+12, r24 ; 0x0c 311e2: 9d 87 std Y+13, r25 ; 0x0d // calculate value if (fac == 0) // default TMC wave 311e4: 20 e0 ldi r18, 0x00 ; 0 311e6: 30 e0 ldi r19, 0x00 ; 0 311e8: a9 01 movw r20, r18 311ea: c3 01 movw r24, r6 311ec: b2 01 movw r22, r4 311ee: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 311f2: 81 11 cpse r24, r1 311f4: 4d c0 rjmp .+154 ; 0x31290 vA = (uint8_t)((amp+1) * sin((2*PI*i + PI)/1024) + 0.5) - 1; 311f6: 2b ed ldi r18, 0xDB ; 219 311f8: 3f e0 ldi r19, 0x0F ; 15 311fa: 49 e4 ldi r20, 0x49 ; 73 311fc: 50 e4 ldi r21, 0x40 ; 64 311fe: 6a 85 ldd r22, Y+10 ; 0x0a 31200: 7b 85 ldd r23, Y+11 ; 0x0b 31202: 8c 85 ldd r24, Y+12 ; 0x0c 31204: 9d 85 ldd r25, Y+13 ; 0x0d 31206: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3120a: 20 e0 ldi r18, 0x00 ; 0 3120c: 30 e0 ldi r19, 0x00 ; 0 3120e: 40 e8 ldi r20, 0x80 ; 128 31210: 5a e3 ldi r21, 0x3A ; 58 31212: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31216: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 3121a: 20 e0 ldi r18, 0x00 ; 0 3121c: 30 e0 ldi r19, 0x00 ; 0 3121e: 48 e7 ldi r20, 0x78 ; 120 31220: 53 e4 ldi r21, 0x43 ; 67 31222: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31226: 20 e0 ldi r18, 0x00 ; 0 31228: 30 e0 ldi r19, 0x00 ; 0 3122a: 40 e0 ldi r20, 0x00 ; 0 3122c: 5f e3 ldi r21, 0x3F ; 63 3122e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31232: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 31236: cc 24 eor r12, r12 31238: ca 94 dec r12 3123a: c6 0e add r12, r22 else // corrected wave vA = (uint8_t)(amp * pow(sin(2*PI*i/1024), fac) + 0.5); dA = vA - va; // calculate delta 3123c: 8c 2d mov r24, r12 3123e: 99 85 ldd r25, Y+9 ; 0x09 31240: 89 1b sub r24, r25 va = vA; b = -1; if (dA == d0) b = 0; //delta == delta0 => bit=0 31242: 8d 15 cp r24, r13 31244: f9 f0 breq .+62 ; 0x31284 else if (dA == d1) b = 1; //delta == delta1 => bit=1 31246: 80 17 cp r24, r16 31248: 09 f4 brne .+2 ; 0x3124c 3124a: 71 c0 rjmp .+226 ; 0x3132e else { if (dA < d0) // delta < delta0 => switch wbit down 3124c: 8d 15 cp r24, r13 3124e: 0c f0 brlt .+2 ; 0x31252 31250: 53 c0 rjmp .+166 ; 0x312f8 { //printf("dn\n"); b = 0; switch (dA) 31252: 88 23 and r24, r24 31254: e9 f1 breq .+122 ; 0x312d0 31256: 81 30 cpi r24, 0x01 ; 1 31258: 09 f4 brne .+2 ; 0x3125c 3125a: 44 c0 rjmp .+136 ; 0x312e4 3125c: 8f 3f cpi r24, 0xFF ; 255 3125e: 09 f0 breq .+2 ; 0x31262 31260: 81 c0 rjmp .+258 ; 0x31364 { case -1: d0 = -1; d1 = 0; w[s+1] = 0; break; 31262: e2 e0 ldi r30, 0x02 ; 2 31264: f0 e0 ldi r31, 0x00 ; 0 31266: ec 0f add r30, r28 31268: fd 1f adc r31, r29 3126a: e1 0f add r30, r17 3126c: f1 1d adc r31, r1 3126e: 10 82 st Z, r1 31270: 00 e0 ldi r16, 0x00 ; 0 case 0: d0 = 0; d1 = 1; w[s+1] = 1; break; case 1: d0 = 1; d1 = 2; w[s+1] = 2; break; default: b = -1; break; } if (b >= 0) { x[s] = i; s++; } 31272: e5 e0 ldi r30, 0x05 ; 5 31274: f0 e0 ldi r31, 0x00 ; 0 31276: ec 0f add r30, r28 31278: fd 1f adc r31, r29 3127a: e1 0f add r30, r17 3127c: f1 1d adc r31, r1 3127e: f0 82 st Z, r15 31280: 1f 5f subi r17, 0xFF ; 255 31282: d8 2e mov r13, r24 } if (b >= 0) { x[s] = i; s++; } } } if (b < 0) break; // delta out of range (<-1 or >3) if (s > 3) break; // segment out of range (> 3) 31284: 14 30 cpi r17, 0x04 ; 4 31286: 08 f4 brcc .+2 ; 0x3128a 31288: 56 c0 rjmp .+172 ; 0x31336 3128a: 6c c0 rjmp .+216 ; 0x31364 if ((i & 31) == 31) tmc2130_wr_MSLUT(axis, (uint8_t)(i >> 5), reg); else reg >>= 1; // printf("%3d\t%3d\t%2d\t%2d\t%2d\t%2d %08x\n", i, vA, dA, b, w[s], s, reg); } while (i++ != 255); 3128c: f8 2e mov r15, r24 3128e: 8f cf rjmp .-226 ; 0x311ae reg = 0; // calculate value if (fac == 0) // default TMC wave vA = (uint8_t)((amp+1) * sin((2*PI*i + PI)/1024) + 0.5) - 1; else // corrected wave vA = (uint8_t)(amp * pow(sin(2*PI*i/1024), fac) + 0.5); 31290: 20 e0 ldi r18, 0x00 ; 0 31292: 30 e0 ldi r19, 0x00 ; 0 31294: 40 e8 ldi r20, 0x80 ; 128 31296: 5a e3 ldi r21, 0x3A ; 58 31298: 6a 85 ldd r22, Y+10 ; 0x0a 3129a: 7b 85 ldd r23, Y+11 ; 0x0b 3129c: 8c 85 ldd r24, Y+12 ; 0x0c 3129e: 9d 85 ldd r25, Y+13 ; 0x0d 312a0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 312a4: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 312a8: a3 01 movw r20, r6 312aa: 92 01 movw r18, r4 312ac: 0f 94 a8 e0 call 0x3c150 ; 0x3c150 312b0: 20 e0 ldi r18, 0x00 ; 0 312b2: 30 e0 ldi r19, 0x00 ; 0 312b4: 47 e7 ldi r20, 0x77 ; 119 312b6: 53 e4 ldi r21, 0x43 ; 67 312b8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 312bc: 20 e0 ldi r18, 0x00 ; 0 312be: 30 e0 ldi r19, 0x00 ; 0 312c0: 40 e0 ldi r20, 0x00 ; 0 312c2: 5f e3 ldi r21, 0x3F ; 63 312c4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 312c8: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 312cc: c6 2e mov r12, r22 312ce: b6 cf rjmp .-148 ; 0x3123c //printf("dn\n"); b = 0; switch (dA) { case -1: d0 = -1; d1 = 0; w[s+1] = 0; break; case 0: d0 = 0; d1 = 1; w[s+1] = 1; break; 312d0: e2 e0 ldi r30, 0x02 ; 2 312d2: f0 e0 ldi r31, 0x00 ; 0 312d4: ec 0f add r30, r28 312d6: fd 1f adc r31, r29 312d8: e1 0f add r30, r17 312da: f1 1d adc r31, r1 312dc: 91 e0 ldi r25, 0x01 ; 1 312de: 90 83 st Z, r25 312e0: 01 e0 ldi r16, 0x01 ; 1 312e2: c7 cf rjmp .-114 ; 0x31272 case 1: d0 = 1; d1 = 2; w[s+1] = 2; break; 312e4: e2 e0 ldi r30, 0x02 ; 2 312e6: f0 e0 ldi r31, 0x00 ; 0 312e8: ec 0f add r30, r28 312ea: fd 1f adc r31, r29 312ec: e1 0f add r30, r17 312ee: f1 1d adc r31, r1 312f0: 92 e0 ldi r25, 0x02 ; 2 312f2: 90 83 st Z, r25 312f4: 02 e0 ldi r16, 0x02 ; 2 312f6: bd cf rjmp .-134 ; 0x31272 default: b = -1; break; } if (b >= 0) { x[s] = i; s++; } } else if (dA > d1) // delta > delta0 => switch wbit up 312f8: 08 17 cp r16, r24 312fa: a4 f5 brge .+104 ; 0x31364 { //printf("up\n"); b = 1; switch (dA) 312fc: 82 30 cpi r24, 0x02 ; 2 312fe: 09 f4 brne .+2 ; 0x31302 31300: 80 c0 rjmp .+256 ; 0x31402 31302: 83 30 cpi r24, 0x03 ; 3 31304: 09 f4 brne .+2 ; 0x31308 31306: 88 c0 rjmp .+272 ; 0x31418 31308: 81 30 cpi r24, 0x01 ; 1 3130a: 61 f5 brne .+88 ; 0x31364 { case 1: d0 = 0; d1 = 1; w[s+1] = 1; break; 3130c: e2 e0 ldi r30, 0x02 ; 2 3130e: f0 e0 ldi r31, 0x00 ; 0 31310: ec 0f add r30, r28 31312: fd 1f adc r31, r29 31314: e1 0f add r30, r17 31316: f1 1d adc r31, r1 31318: 80 83 st Z, r24 3131a: 01 e0 ldi r16, 0x01 ; 1 3131c: d1 2c mov r13, r1 case 2: d0 = 1; d1 = 2; w[s+1] = 2; break; case 3: d0 = 2; d1 = 3; w[s+1] = 3; break; default: b = -1; break; } if (b >= 0) { x[s] = i; s++; } 3131e: e5 e0 ldi r30, 0x05 ; 5 31320: f0 e0 ldi r31, 0x00 ; 0 31322: ec 0f add r30, r28 31324: fd 1f adc r31, r29 31326: e1 0f add r30, r17 31328: f1 1d adc r31, r1 3132a: f0 82 st Z, r15 3132c: 1f 5f subi r17, 0xFF ; 255 } } if (b < 0) break; // delta out of range (<-1 or >3) if (s > 3) break; // segment out of range (> 3) 3132e: 14 30 cpi r17, 0x04 ; 4 31330: c8 f4 brcc .+50 ; 0x31364 //printf("%d\n", vA); if (b == 1) reg |= 0x80000000; 31332: 68 94 set 31334: b7 f8 bld r11, 7 if ((i & 31) == 31) 31336: 88 85 ldd r24, Y+8 ; 0x08 31338: 8f 31 cpi r24, 0x1F ; 31 3133a: 09 f0 breq .+2 ; 0x3133e 3133c: 78 c0 rjmp .+240 ; 0x3142e tmc2130_wr_MSLUT(axis, (uint8_t)(i >> 5), reg); 3133e: b1 01 movw r22, r2 31340: e5 e0 ldi r30, 0x05 ; 5 31342: 75 95 asr r23 31344: 67 95 ror r22 31346: ea 95 dec r30 31348: e1 f7 brne .-8 ; 0x31342 //printf_P(PSTR("MSLUTSEL=%08lx (x1=%d x2=%d x3=%d w0=%d w1=%d w2=%d w3=%d)\n"), val, x1, x2, x3, w0, w1, w2, w3); } void tmc2130_wr_MSLUT(uint8_t axis, uint8_t i, uint32_t val) { tmc2130_wr(axis, TMC2130_REG_MSLUT0 + (i & 7), val); 3134a: 60 5a subi r22, 0xA0 ; 160 3134c: 60 68 ori r22, 0x80 ; 128 3134e: a5 01 movw r20, r10 31350: 94 01 movw r18, r8 31352: 8e 2d mov r24, r14 31354: 0f 94 27 25 call 0x24a4e ; 0x24a4e if ((i & 31) == 31) tmc2130_wr_MSLUT(axis, (uint8_t)(i >> 5), reg); else reg >>= 1; // printf("%3d\t%3d\t%2d\t%2d\t%2d\t%2d %08x\n", i, vA, dA, b, w[s], s, reg); } while (i++ != 255); 31358: 81 e0 ldi r24, 0x01 ; 1 3135a: 8f 0d add r24, r15 if (fac == 0) // default TMC wave vA = (uint8_t)((amp+1) * sin((2*PI*i + PI)/1024) + 0.5) - 1; else // corrected wave vA = (uint8_t)(amp * pow(sin(2*PI*i/1024), fac) + 0.5); dA = vA - va; // calculate delta va = vA; 3135c: c9 86 std Y+9, r12 ; 0x09 if ((i & 31) == 31) tmc2130_wr_MSLUT(axis, (uint8_t)(i >> 5), reg); else reg >>= 1; // printf("%3d\t%3d\t%2d\t%2d\t%2d\t%2d %08x\n", i, vA, dA, b, w[s], s, reg); } while (i++ != 255); 3135e: 9f ef ldi r25, 0xFF ; 255 31360: f9 12 cpse r15, r25 31362: 94 cf rjmp .-216 ; 0x3128c void tmc2130_wr_MSLUTSEL(uint8_t axis, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3) { uint32_t val = 0; val |= ((uint32_t)w0); val |= ((uint32_t)w1) << 2; 31364: 2a 81 ldd r18, Y+2 ; 0x02 31366: 30 e0 ldi r19, 0x00 ; 0 31368: 50 e0 ldi r21, 0x00 ; 0 3136a: 40 e0 ldi r20, 0x00 ; 0 3136c: 82 e0 ldi r24, 0x02 ; 2 3136e: 22 0f add r18, r18 31370: 33 1f adc r19, r19 31372: 44 1f adc r20, r20 31374: 55 1f adc r21, r21 31376: 8a 95 dec r24 31378: d1 f7 brne .-12 ; 0x3136e val |= ((uint32_t)w2) << 4; 3137a: 8b 80 ldd r8, Y+3 ; 0x03 3137c: 91 2c mov r9, r1 3137e: b1 2c mov r11, r1 31380: a1 2c mov r10, r1 31382: 94 e0 ldi r25, 0x04 ; 4 31384: 88 0c add r8, r8 31386: 99 1c adc r9, r9 31388: aa 1c adc r10, r10 3138a: bb 1c adc r11, r11 3138c: 9a 95 dec r25 3138e: d1 f7 brne .-12 ; 0x31384 31390: 82 2a or r8, r18 31392: 93 2a or r9, r19 31394: a4 2a or r10, r20 31396: b5 2a or r11, r21 } void tmc2130_wr_MSLUTSEL(uint8_t axis, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3) { uint32_t val = 0; val |= ((uint32_t)w0); 31398: 89 81 ldd r24, Y+1 ; 0x01 val |= ((uint32_t)w1) << 2; val |= ((uint32_t)w2) << 4; 3139a: 88 2a or r8, r24 val |= ((uint32_t)w3) << 6; 3139c: 8c 81 ldd r24, Y+4 ; 0x04 3139e: 90 e0 ldi r25, 0x00 ; 0 313a0: b0 e0 ldi r27, 0x00 ; 0 313a2: a0 e0 ldi r26, 0x00 ; 0 313a4: 9c 01 movw r18, r24 313a6: ad 01 movw r20, r26 313a8: 66 e0 ldi r22, 0x06 ; 6 313aa: 22 0f add r18, r18 313ac: 33 1f adc r19, r19 313ae: 44 1f adc r20, r20 313b0: 55 1f adc r21, r21 313b2: 6a 95 dec r22 313b4: d1 f7 brne .-12 ; 0x313aa 313b6: 28 29 or r18, r8 313b8: 39 29 or r19, r9 313ba: 4a 29 or r20, r10 313bc: 5b 29 or r21, r11 val |= ((uint32_t)x1) << 8; 313be: 8d 81 ldd r24, Y+5 ; 0x05 313c0: 38 2b or r19, r24 val |= ((uint32_t)x2) << 16; 313c2: 8e 81 ldd r24, Y+6 ; 0x06 313c4: 48 2b or r20, r24 val |= ((uint32_t)x3) << 24; 313c6: 8f 81 ldd r24, Y+7 ; 0x07 313c8: 58 2b or r21, r24 tmc2130_wr(axis, TMC2130_REG_MSLUTSEL, val); 313ca: 68 ee ldi r22, 0xE8 ; 232 313cc: 8e 2d mov r24, r14 else reg >>= 1; // printf("%3d\t%3d\t%2d\t%2d\t%2d\t%2d %08x\n", i, vA, dA, b, w[s], s, reg); } while (i++ != 255); tmc2130_wr_MSLUTSEL(axis, x[0], x[1], x[2], w[0], w[1], w[2], w[3]); } 313ce: 2d 96 adiw r28, 0x0d ; 13 313d0: 0f b6 in r0, 0x3f ; 63 313d2: f8 94 cli 313d4: de bf out 0x3e, r29 ; 62 313d6: 0f be out 0x3f, r0 ; 63 313d8: cd bf out 0x3d, r28 ; 61 313da: df 91 pop r29 313dc: cf 91 pop r28 313de: 1f 91 pop r17 313e0: 0f 91 pop r16 313e2: ff 90 pop r15 313e4: ef 90 pop r14 313e6: df 90 pop r13 313e8: cf 90 pop r12 313ea: bf 90 pop r11 313ec: af 90 pop r10 313ee: 9f 90 pop r9 313f0: 8f 90 pop r8 313f2: 7f 90 pop r7 313f4: 6f 90 pop r6 313f6: 5f 90 pop r5 313f8: 4f 90 pop r4 313fa: 3f 90 pop r3 313fc: 2f 90 pop r2 val |= ((uint32_t)w2) << 4; val |= ((uint32_t)w3) << 6; val |= ((uint32_t)x1) << 8; val |= ((uint32_t)x2) << 16; val |= ((uint32_t)x3) << 24; tmc2130_wr(axis, TMC2130_REG_MSLUTSEL, val); 313fe: 0d 94 27 25 jmp 0x24a4e ; 0x24a4e //printf("up\n"); b = 1; switch (dA) { case 1: d0 = 0; d1 = 1; w[s+1] = 1; break; case 2: d0 = 1; d1 = 2; w[s+1] = 2; break; 31402: e2 e0 ldi r30, 0x02 ; 2 31404: f0 e0 ldi r31, 0x00 ; 0 31406: ec 0f add r30, r28 31408: fd 1f adc r31, r29 3140a: e1 0f add r30, r17 3140c: f1 1d adc r31, r1 3140e: 80 83 st Z, r24 31410: 02 e0 ldi r16, 0x02 ; 2 31412: dd 24 eor r13, r13 31414: d3 94 inc r13 31416: 83 cf rjmp .-250 ; 0x3131e case 3: d0 = 2; d1 = 3; w[s+1] = 3; break; 31418: e2 e0 ldi r30, 0x02 ; 2 3141a: f0 e0 ldi r31, 0x00 ; 0 3141c: ec 0f add r30, r28 3141e: fd 1f adc r31, r29 31420: e1 0f add r30, r17 31422: f1 1d adc r31, r1 31424: 80 83 st Z, r24 31426: 03 e0 ldi r16, 0x03 ; 3 31428: f2 e0 ldi r31, 0x02 ; 2 3142a: df 2e mov r13, r31 3142c: 78 cf rjmp .-272 ; 0x3131e //printf("%d\n", vA); if (b == 1) reg |= 0x80000000; if ((i & 31) == 31) tmc2130_wr_MSLUT(axis, (uint8_t)(i >> 5), reg); else reg >>= 1; 3142e: b6 94 lsr r11 31430: a7 94 ror r10 31432: 97 94 ror r9 31434: 87 94 ror r8 31436: 90 cf rjmp .-224 ; 0x31358 00031438 : { previous_millis_cmd.start(); } #ifdef FWRETRACT void retract(bool retracting, bool swapretract = false) { 31438: 8f 92 push r8 3143a: 9f 92 push r9 3143c: af 92 push r10 3143e: bf 92 push r11 31440: cf 92 push r12 31442: df 92 push r13 31444: ef 92 push r14 31446: ff 92 push r15 31448: 90 91 8d 06 lds r25, 0x068D ; 0x80068d // 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]) { 3144c: 88 23 and r24, r24 3144e: 09 f4 brne .+2 ; 0x31452 31450: 9d c0 rjmp .+314 ; 0x3158c 31452: 91 11 cpse r25, r1 31454: 92 c0 rjmp .+292 ; 0x3157a st_synchronize(); 31456: 0f 94 a9 43 call 0x28752 ; 0x28752 set_destination_to_current(); 3145a: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 current_position[E_AXIS]+=(swapretract?retract_length_swap:cs.retract_length)*float(extrudemultiply)*0.01f; 3145e: 60 91 bc 02 lds r22, 0x02BC ; 0x8002bc 31462: 70 91 bd 02 lds r23, 0x02BD ; 0x8002bd 31466: 07 2e mov r0, r23 31468: 00 0c add r0, r0 3146a: 88 0b sbc r24, r24 3146c: 99 0b sbc r25, r25 3146e: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 31472: 20 91 40 0e lds r18, 0x0E40 ; 0x800e40 31476: 30 91 41 0e lds r19, 0x0E41 ; 0x800e41 3147a: 40 91 42 0e lds r20, 0x0E42 ; 0x800e42 3147e: 50 91 43 0e lds r21, 0x0E43 ; 0x800e43 31482: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31486: 2a e0 ldi r18, 0x0A ; 10 31488: 37 ed ldi r19, 0xD7 ; 215 3148a: 43 e2 ldi r20, 0x23 ; 35 3148c: 5c e3 ldi r21, 0x3C ; 60 3148e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31492: 20 91 9d 06 lds r18, 0x069D ; 0x80069d 31496: 30 91 9e 06 lds r19, 0x069E ; 0x80069e 3149a: 40 91 9f 06 lds r20, 0x069F ; 0x80069f 3149e: 50 91 a0 06 lds r21, 0x06A0 ; 0x8006a0 314a2: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 314a6: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 314aa: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 314ae: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 314b2: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_set_e_position(current_position[E_AXIS]); 314b6: 8d e9 ldi r24, 0x9D ; 157 314b8: 96 e0 ldi r25, 0x06 ; 6 314ba: 0f 94 b5 64 call 0x2c96a ; 0x2c96a float oldFeedrate = feedrate; 314be: c0 90 b8 02 lds r12, 0x02B8 ; 0x8002b8 314c2: d0 90 b9 02 lds r13, 0x02B9 ; 0x8002b9 314c6: e0 90 ba 02 lds r14, 0x02BA ; 0x8002ba 314ca: f0 90 bb 02 lds r15, 0x02BB ; 0x8002bb feedrate=cs.retract_feedrate*60; 314ce: 20 e0 ldi r18, 0x00 ; 0 314d0: 30 e0 ldi r19, 0x00 ; 0 314d2: 40 e7 ldi r20, 0x70 ; 112 314d4: 52 e4 ldi r21, 0x42 ; 66 314d6: 60 91 44 0e lds r22, 0x0E44 ; 0x800e44 314da: 70 91 45 0e lds r23, 0x0E45 ; 0x800e45 314de: 80 91 46 0e lds r24, 0x0E46 ; 0x800e46 314e2: 90 91 47 0e lds r25, 0x0E47 ; 0x800e47 314e6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 314ea: 60 93 b8 02 sts 0x02B8, r22 ; 0x8002b8 314ee: 70 93 b9 02 sts 0x02B9, r23 ; 0x8002b9 314f2: 80 93 ba 02 sts 0x02BA, r24 ; 0x8002ba 314f6: 90 93 bb 02 sts 0x02BB, r25 ; 0x8002bb retracted[active_extruder]=true; 314fa: 81 e0 ldi r24, 0x01 ; 1 314fc: 80 93 8d 06 sts 0x068D, r24 ; 0x80068d prepare_move(); 31500: 90 e0 ldi r25, 0x00 ; 0 31502: 80 e0 ldi r24, 0x00 ; 0 31504: 0e 94 a0 6b call 0xd740 ; 0xd740 if(cs.retract_zlift) { 31508: 20 e0 ldi r18, 0x00 ; 0 3150a: 30 e0 ldi r19, 0x00 ; 0 3150c: a9 01 movw r20, r18 3150e: 60 91 48 0e lds r22, 0x0E48 ; 0x800e48 31512: 70 91 49 0e lds r23, 0x0E49 ; 0x800e49 31516: 80 91 4a 0e lds r24, 0x0E4A ; 0x800e4a 3151a: 90 91 4b 0e lds r25, 0x0E4B ; 0x800e4b 3151e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 31522: 88 23 and r24, r24 31524: 11 f1 breq .+68 ; 0x3156a st_synchronize(); 31526: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[Z_AXIS]-=cs.retract_zlift; 3152a: 20 91 48 0e lds r18, 0x0E48 ; 0x800e48 3152e: 30 91 49 0e lds r19, 0x0E49 ; 0x800e49 31532: 40 91 4a 0e lds r20, 0x0E4A ; 0x800e4a 31536: 50 91 4b 0e lds r21, 0x0E4B ; 0x800e4b 3153a: 60 91 99 06 lds r22, 0x0699 ; 0x800699 3153e: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 31542: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 31546: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 3154a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3154e: 60 93 99 06 sts 0x0699, r22 ; 0x800699 31552: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 31556: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 3155a: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c plan_set_position_curposXYZE(); 3155e: 0f 94 fd be call 0x37dfa ; 0x37dfa prepare_move(); 31562: 90 e0 ldi r25, 0x00 ; 0 31564: 80 e0 ldi r24, 0x00 ; 0 31566: 0e 94 a0 6b call 0xd740 ; 0xd740 } feedrate = oldFeedrate; 3156a: c0 92 b8 02 sts 0x02B8, r12 ; 0x8002b8 3156e: d0 92 b9 02 sts 0x02B9, r13 ; 0x8002b9 31572: e0 92 ba 02 sts 0x02BA, r14 ; 0x8002ba 31576: f0 92 bb 02 sts 0x02BB, r15 ; 0x8002bb plan_set_e_position(current_position[E_AXIS]); retracted[active_extruder]=false; prepare_move(); feedrate = oldFeedrate; } } //retract 3157a: ff 90 pop r15 3157c: ef 90 pop r14 3157e: df 90 pop r13 31580: cf 90 pop r12 31582: bf 90 pop r11 31584: af 90 pop r10 31586: 9f 90 pop r9 31588: 8f 90 pop r8 3158a: 08 95 ret current_position[Z_AXIS]-=cs.retract_zlift; plan_set_position_curposXYZE(); prepare_move(); } feedrate = oldFeedrate; } else if(!retracting && retracted[active_extruder]) { 3158c: 99 23 and r25, r25 3158e: a9 f3 breq .-22 ; 0x3157a st_synchronize(); 31590: 0f 94 a9 43 call 0x28752 ; 0x28752 set_destination_to_current(); 31594: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 float oldFeedrate = feedrate; 31598: 80 90 b8 02 lds r8, 0x02B8 ; 0x8002b8 3159c: 90 90 b9 02 lds r9, 0x02B9 ; 0x8002b9 315a0: a0 90 ba 02 lds r10, 0x02BA ; 0x8002ba 315a4: b0 90 bb 02 lds r11, 0x02BB ; 0x8002bb feedrate=cs.retract_recover_feedrate*60; 315a8: 20 e0 ldi r18, 0x00 ; 0 315aa: 30 e0 ldi r19, 0x00 ; 0 315ac: 40 e7 ldi r20, 0x70 ; 112 315ae: 52 e4 ldi r21, 0x42 ; 66 315b0: 60 91 50 0e lds r22, 0x0E50 ; 0x800e50 315b4: 70 91 51 0e lds r23, 0x0E51 ; 0x800e51 315b8: 80 91 52 0e lds r24, 0x0E52 ; 0x800e52 315bc: 90 91 53 0e lds r25, 0x0E53 ; 0x800e53 315c0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 315c4: 60 93 b8 02 sts 0x02B8, r22 ; 0x8002b8 315c8: 70 93 b9 02 sts 0x02B9, r23 ; 0x8002b9 315cc: 80 93 ba 02 sts 0x02BA, r24 ; 0x8002ba 315d0: 90 93 bb 02 sts 0x02BB, r25 ; 0x8002bb if(cs.retract_zlift) { 315d4: c0 90 48 0e lds r12, 0x0E48 ; 0x800e48 315d8: d0 90 49 0e lds r13, 0x0E49 ; 0x800e49 315dc: e0 90 4a 0e lds r14, 0x0E4A ; 0x800e4a 315e0: f0 90 4b 0e lds r15, 0x0E4B ; 0x800e4b 315e4: 20 e0 ldi r18, 0x00 ; 0 315e6: 30 e0 ldi r19, 0x00 ; 0 315e8: a9 01 movw r20, r18 315ea: c7 01 movw r24, r14 315ec: b6 01 movw r22, r12 315ee: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 315f2: 88 23 and r24, r24 315f4: e1 f0 breq .+56 ; 0x3162e current_position[Z_AXIS]+=cs.retract_zlift; 315f6: a7 01 movw r20, r14 315f8: 96 01 movw r18, r12 315fa: 60 91 99 06 lds r22, 0x0699 ; 0x800699 315fe: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 31602: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 31606: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 3160a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3160e: 60 93 99 06 sts 0x0699, r22 ; 0x800699 31612: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 31616: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 3161a: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c plan_set_position_curposXYZE(); 3161e: 0f 94 fd be call 0x37dfa ; 0x37dfa prepare_move(); 31622: 90 e0 ldi r25, 0x00 ; 0 31624: 80 e0 ldi r24, 0x00 ; 0 31626: 0e 94 a0 6b call 0xd740 ; 0xd740 st_synchronize(); 3162a: 0f 94 a9 43 call 0x28752 ; 0x28752 } current_position[E_AXIS]-=(swapretract?(retract_length_swap+retract_recover_length_swap):(cs.retract_length+cs.retract_recover_length))*float(extrudemultiply)*0.01f; 3162e: 20 91 4c 0e lds r18, 0x0E4C ; 0x800e4c 31632: 30 91 4d 0e lds r19, 0x0E4D ; 0x800e4d 31636: 40 91 4e 0e lds r20, 0x0E4E ; 0x800e4e 3163a: 50 91 4f 0e lds r21, 0x0E4F ; 0x800e4f 3163e: 60 91 40 0e lds r22, 0x0E40 ; 0x800e40 31642: 70 91 41 0e lds r23, 0x0E41 ; 0x800e41 31646: 80 91 42 0e lds r24, 0x0E42 ; 0x800e42 3164a: 90 91 43 0e lds r25, 0x0E43 ; 0x800e43 3164e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31652: 6b 01 movw r12, r22 31654: 7c 01 movw r14, r24 31656: 60 91 bc 02 lds r22, 0x02BC ; 0x8002bc 3165a: 70 91 bd 02 lds r23, 0x02BD ; 0x8002bd 3165e: 07 2e mov r0, r23 31660: 00 0c add r0, r0 31662: 88 0b sbc r24, r24 31664: 99 0b sbc r25, r25 31666: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 3166a: 9b 01 movw r18, r22 3166c: ac 01 movw r20, r24 3166e: c7 01 movw r24, r14 31670: b6 01 movw r22, r12 31672: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31676: 2a e0 ldi r18, 0x0A ; 10 31678: 37 ed ldi r19, 0xD7 ; 215 3167a: 43 e2 ldi r20, 0x23 ; 35 3167c: 5c e3 ldi r21, 0x3C ; 60 3167e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 31682: 9b 01 movw r18, r22 31684: ac 01 movw r20, r24 31686: 60 91 9d 06 lds r22, 0x069D ; 0x80069d 3168a: 70 91 9e 06 lds r23, 0x069E ; 0x80069e 3168e: 80 91 9f 06 lds r24, 0x069F ; 0x80069f 31692: 90 91 a0 06 lds r25, 0x06A0 ; 0x8006a0 31696: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3169a: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 3169e: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 316a2: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 316a6: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 plan_set_e_position(current_position[E_AXIS]); 316aa: 8d e9 ldi r24, 0x9D ; 157 316ac: 96 e0 ldi r25, 0x06 ; 6 316ae: 0f 94 b5 64 call 0x2c96a ; 0x2c96a retracted[active_extruder]=false; 316b2: 10 92 8d 06 sts 0x068D, r1 ; 0x80068d prepare_move(); 316b6: 90 e0 ldi r25, 0x00 ; 0 316b8: 80 e0 ldi r24, 0x00 ; 0 316ba: 0e 94 a0 6b call 0xd740 ; 0xd740 feedrate = oldFeedrate; 316be: 80 92 b8 02 sts 0x02B8, r8 ; 0x8002b8 316c2: 90 92 b9 02 sts 0x02B9, r9 ; 0x8002b9 316c6: a0 92 ba 02 sts 0x02BA, r10 ; 0x8002ba 316ca: b0 92 bb 02 sts 0x02BB, r11 ; 0x8002bb 316ce: 55 cf rjmp .-342 ; 0x3157a 000316d0 : case Z_AXIS: _DO_STEP_Z; break; case E_AXIS: _DO_STEP_E; break; } } void tmc2130_do_steps(uint8_t axis, uint16_t steps, uint8_t dir, uint16_t delay_us) 316d0: ef 92 push r14 316d2: ff 92 push r15 316d4: 0f 93 push r16 316d6: 1f 93 push r17 316d8: cf 93 push r28 316da: c8 2f mov r28, r24 316dc: 8b 01 movw r16, r22 uint8_t tmc2130_get_dir(uint8_t axis) { switch (axis) { case X_AXIS: return _GET_DIR_X; case Y_AXIS: return _GET_DIR_Y; 316de: 80 91 09 01 lds r24, 0x0109 ; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109> return 0; } uint8_t tmc2130_get_dir(uint8_t axis) { switch (axis) 316e2: c1 30 cpi r28, 0x01 ; 1 316e4: b9 f0 breq .+46 ; 0x31714 316e6: c2 30 cpi r28, 0x02 ; 2 316e8: c1 f0 breq .+48 ; 0x3171a { case X_AXIS: return _GET_DIR_X; case Y_AXIS: return _GET_DIR_Y; 316ea: 81 70 andi r24, 0x01 ; 1 } } void tmc2130_do_steps(uint8_t axis, uint16_t steps, uint8_t dir, uint16_t delay_us) { if (tmc2130_get_dir(axis) != dir) 316ec: 48 17 cp r20, r24 316ee: 21 f0 breq .+8 ; 0x316f8 tmc2130_set_dir(axis, dir); 316f0: 64 2f mov r22, r20 316f2: 8c 2f mov r24, r28 316f4: 0f 94 8a 24 call 0x24914 ; 0x24914 316f8: 8b e9 ldi r24, 0x9B ; 155 316fa: e8 2e mov r14, r24 316fc: 8f e0 ldi r24, 0x0F ; 15 316fe: f8 2e mov r15, r24 while (steps--) 31700: 01 50 subi r16, 0x01 ; 1 31702: 11 09 sbc r17, r1 31704: 70 f0 brcs .+28 ; 0x31722 { tmc2130_do_step(axis); 31706: 8c 2f mov r24, r28 31708: 0f 94 79 24 call 0x248f2 ; 0x248f2 3170c: c7 01 movw r24, r14 3170e: 01 97 sbiw r24, 0x01 ; 1 31710: f1 f7 brne .-4 ; 0x3170e 31712: f6 cf rjmp .-20 ; 0x31700 uint8_t tmc2130_get_dir(uint8_t axis) { switch (axis) { case X_AXIS: return _GET_DIR_X; case Y_AXIS: return _GET_DIR_Y; 31714: 86 95 lsr r24 31716: 8c 27 eor r24, r28 31718: e8 cf rjmp .-48 ; 0x316ea case Z_AXIS: return _GET_DIR_Z; 3171a: 82 fb bst r24, 2 3171c: 88 27 eor r24, r24 3171e: 80 f9 bld r24, 0 31720: e5 cf rjmp .-54 ; 0x316ec while (steps--) { tmc2130_do_step(axis); delayMicroseconds(delay_us); } } 31722: cf 91 pop r28 31724: 1f 91 pop r17 31726: 0f 91 pop r16 31728: ff 90 pop r15 3172a: ef 90 pop r14 3172c: 08 95 ret 0003172e : void tmc2130_goto_step(uint8_t axis, uint8_t step, uint8_t dir, uint16_t delay_us, uint16_t microstep_resolution) 3172e: 8f 92 push r8 31730: 9f 92 push r9 31732: af 92 push r10 31734: bf 92 push r11 31736: cf 92 push r12 31738: df 92 push r13 3173a: ef 92 push r14 3173c: ff 92 push r15 3173e: 0f 93 push r16 31740: 1f 93 push r17 31742: cf 93 push r28 31744: c8 2f mov r28, r24 31746: 8a 01 movw r16, r20 { printf_P(PSTR("tmc2130_goto_step %d %d %d %d \n"), axis, step, dir, delay_us, microstep_resolution); 31748: c6 2e mov r12, r22 3174a: d1 2c mov r13, r1 3174c: 1f 93 push r17 3174e: 4f 93 push r20 31750: 83 e0 ldi r24, 0x03 ; 3 31752: 8f 93 push r24 31754: 88 ee ldi r24, 0xE8 ; 232 31756: 8f 93 push r24 31758: 1f 92 push r1 3175a: 82 e0 ldi r24, 0x02 ; 2 3175c: 8f 93 push r24 3175e: 1f 92 push r1 31760: 6f 93 push r22 31762: 1f 92 push r1 31764: cf 93 push r28 31766: 80 e2 ldi r24, 0x20 ; 32 31768: 96 ea ldi r25, 0xA6 ; 166 3176a: 9f 93 push r25 3176c: 8f 93 push r24 3176e: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 31772: 8d b7 in r24, 0x3d ; 61 31774: 9e b7 in r25, 0x3e ; 62 31776: 0c 96 adiw r24, 0x0c ; 12 31778: 0f b6 in r0, 0x3f ; 63 3177a: f8 94 cli 3177c: 9e bf out 0x3e, r25 ; 62 3177e: 0f be out 0x3f, r0 ; 63 31780: 8d bf out 0x3d, r24 ; 61 31782: 90 e0 ldi r25, 0x00 ; 0 31784: 80 e0 ldi r24, 0x00 ; 0 uint8_t shift; for (shift = 0; shift < 8; shift++) if (microstep_resolution == (256u >> shift)) break; 31786: 40 e0 ldi r20, 0x00 ; 0 31788: 51 e0 ldi r21, 0x01 ; 1 3178a: 28 2f mov r18, r24 3178c: ba 01 movw r22, r20 3178e: 08 2e mov r0, r24 31790: 02 c0 rjmp .+4 ; 0x31796 31792: 76 95 lsr r23 31794: 67 95 ror r22 31796: 0a 94 dec r0 31798: e2 f7 brpl .-8 ; 0x31792 3179a: 06 17 cp r16, r22 3179c: 17 07 cpc r17, r23 3179e: 29 f0 breq .+10 ; 0x317aa 317a0: 01 96 adiw r24, 0x01 ; 1 317a2: 88 30 cpi r24, 0x08 ; 8 317a4: 91 05 cpc r25, r1 317a6: 89 f7 brne .-30 ; 0x3178a 317a8: 28 e0 ldi r18, 0x08 ; 8 uint16_t cnt = 4 * (1 << (8 - shift)); 317aa: e2 2e mov r14, r18 317ac: f1 2c mov r15, r1 317ae: 88 e0 ldi r24, 0x08 ; 8 317b0: 90 e0 ldi r25, 0x00 ; 0 317b2: 8e 19 sub r24, r14 317b4: 9f 09 sbc r25, r15 317b6: 24 e0 ldi r18, 0x04 ; 4 317b8: 30 e0 ldi r19, 0x00 ; 0 317ba: 59 01 movw r10, r18 317bc: 02 c0 rjmp .+4 ; 0x317c2 317be: aa 0c add r10, r10 317c0: bb 1c adc r11, r11 317c2: 8a 95 dec r24 317c4: e2 f7 brpl .-8 ; 0x317be uint16_t mscnt = tmc2130_rd_MSCNT(axis); 317c6: 8c 2f mov r24, r28 317c8: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 317cc: 9c 01 movw r18, r24 317ce: 90 e0 ldi r25, 0x00 ; 0 317d0: c4 30 cpi r28, 0x04 ; 4 317d2: 28 f4 brcc .+10 ; 0x317de 317d4: ec 2f mov r30, r28 317d6: f0 e0 ldi r31, 0x00 ; 0 317d8: e3 5e subi r30, 0xE3 ; 227 317da: fc 4f sbci r31, 0xFC ; 252 317dc: 90 81 ld r25, Z if (dir == 2) { dir = tmc2130_get_inv(axis)?0:1; int steps = (int)step - (int)(mscnt >> shift); 317de: 0e 2c mov r0, r14 317e0: 02 c0 rjmp .+4 ; 0x317e6 317e2: 36 95 lsr r19 317e4: 27 95 ror r18 317e6: 0a 94 dec r0 317e8: e2 f7 brpl .-8 ; 0x317e2 317ea: 86 01 movw r16, r12 317ec: 02 1b sub r16, r18 317ee: 13 0b sbc r17, r19 if (steps > static_cast(cnt / 2)) 317f0: 95 01 movw r18, r10 317f2: 36 95 lsr r19 317f4: 27 95 ror r18 { dir ^= 1; 317f6: 61 e0 ldi r22, 0x01 ; 1 uint16_t mscnt = tmc2130_rd_MSCNT(axis); if (dir == 2) { dir = tmc2130_get_inv(axis)?0:1; int steps = (int)step - (int)(mscnt >> shift); if (steps > static_cast(cnt / 2)) 317f8: 20 17 cp r18, r16 317fa: 31 07 cpc r19, r17 317fc: 74 f1 brlt .+92 ; 0x3185a uint8_t shift; for (shift = 0; shift < 8; shift++) if (microstep_resolution == (256u >> shift)) break; uint16_t cnt = 4 * (1 << (8 - shift)); uint16_t mscnt = tmc2130_rd_MSCNT(axis); if (dir == 2) { dir = tmc2130_get_inv(axis)?0:1; 317fe: 91 11 cpse r25, r1 31800: 60 e0 ldi r22, 0x00 ; 0 if (steps > static_cast(cnt / 2)) { dir ^= 1; steps = cnt - steps; // This can create a negative step value } if (steps < 0) 31802: 17 ff sbrs r17, 7 31804: 05 c0 rjmp .+10 ; 0x31810 { dir ^= 1; 31806: 81 e0 ldi r24, 0x01 ; 1 31808: 68 27 eor r22, r24 steps = -steps; 3180a: 11 95 neg r17 3180c: 01 95 neg r16 3180e: 11 09 sbc r17, r1 } cnt = steps; } tmc2130_set_dir(axis, dir); 31810: 8c 2f mov r24, r28 31812: 0f 94 8a 24 call 0x24914 ; 0x24914 mscnt = tmc2130_rd_MSCNT(axis); 31816: 8c 2f mov r24, r28 31818: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 3181c: b1 2c mov r11, r1 3181e: a1 2c mov r10, r1 31820: 2b e9 ldi r18, 0x9B ; 155 31822: 82 2e mov r8, r18 31824: 2f e0 ldi r18, 0x0F ; 15 31826: 92 2e mov r9, r18 while ((cnt--) && ((mscnt >> shift) != step)) 31828: 0a 15 cp r16, r10 3182a: 1b 05 cpc r17, r11 3182c: f1 f0 breq .+60 ; 0x3186a 3182e: 2f ef ldi r18, 0xFF ; 255 31830: a2 1a sub r10, r18 31832: b2 0a sbc r11, r18 31834: 0e 2c mov r0, r14 31836: 02 c0 rjmp .+4 ; 0x3183c 31838: 96 95 lsr r25 3183a: 87 95 ror r24 3183c: 0a 94 dec r0 3183e: e2 f7 brpl .-8 ; 0x31838 31840: 8c 15 cp r24, r12 31842: 9d 05 cpc r25, r13 31844: 91 f0 breq .+36 ; 0x3186a { tmc2130_do_step(axis); 31846: 8c 2f mov r24, r28 31848: 0f 94 79 24 call 0x248f2 ; 0x248f2 3184c: c4 01 movw r24, r8 3184e: 01 97 sbiw r24, 0x01 ; 1 31850: f1 f7 brne .-4 ; 0x3184e delayMicroseconds(delay_us); mscnt = tmc2130_rd_MSCNT(axis); 31852: 8c 2f mov r24, r28 31854: 0f 94 51 25 call 0x24aa2 ; 0x24aa2 31858: e7 cf rjmp .-50 ; 0x31828 { dir = tmc2130_get_inv(axis)?0:1; int steps = (int)step - (int)(mscnt >> shift); if (steps > static_cast(cnt / 2)) { dir ^= 1; 3185a: 91 11 cpse r25, r1 3185c: 01 c0 rjmp .+2 ; 0x31860 3185e: 60 e0 ldi r22, 0x00 ; 0 steps = cnt - steps; // This can create a negative step value 31860: c5 01 movw r24, r10 31862: 80 1b sub r24, r16 31864: 91 0b sbc r25, r17 31866: 8c 01 movw r16, r24 31868: cc cf rjmp .-104 ; 0x31802 { tmc2130_do_step(axis); delayMicroseconds(delay_us); mscnt = tmc2130_rd_MSCNT(axis); } } 3186a: cf 91 pop r28 3186c: 1f 91 pop r17 3186e: 0f 91 pop r16 31870: ff 90 pop r15 31872: ef 90 pop r14 31874: df 90 pop r13 31876: cf 90 pop r12 31878: bf 90 pop r11 3187a: af 90 pop r10 3187c: 9f 90 pop r9 3187e: 8f 90 pop r8 31880: 08 95 ret 00031882 : #ifdef MESH_BED_LEVELING mesh_bed_leveling mbl; void mesh_bed_leveling::reset() { active = 0; 31882: 10 92 c1 13 sts 0x13C1, r1 ; 0x8013c1 memset(z_values, 0, sizeof(z_values)); 31886: e2 ec ldi r30, 0xC2 ; 194 31888: f3 e1 ldi r31, 0x13 ; 19 3188a: 84 ec ldi r24, 0xC4 ; 196 3188c: df 01 movw r26, r30 3188e: 1d 92 st X+, r1 31890: 8a 95 dec r24 31892: e9 f7 brne .-6 ; 0x3188e } 31894: 08 95 ret 00031896 : 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 31896: 2f 92 push r2 31898: 3f 92 push r3 3189a: 4f 92 push r4 3189c: 5f 92 push r5 3189e: 6f 92 push r6 318a0: 7f 92 push r7 318a2: 8f 92 push r8 318a4: 9f 92 push r9 318a6: af 92 push r10 318a8: bf 92 push r11 318aa: cf 92 push r12 318ac: df 92 push r13 318ae: ef 92 push r14 318b0: ff 92 push r15 318b2: 0f 93 push r16 318b4: 1f 93 push r17 318b6: cf 93 push r28 318b8: df 93 push r29 318ba: 00 d0 rcall .+0 ; 0x318bc 318bc: 1f 92 push r1 318be: cd b7 in r28, 0x3d ; 61 318c0: de b7 in r29, 0x3e ; 62 318c2: 4b 01 movw r8, r22 318c4: 5c 01 movw r10, r24 318c6: 04 2f mov r16, r20 verbosity_level #endif //SUPPORT_VERBOSITY ) { bool high_deviation_occured = false; bedPWMDisabled = 1; 318c8: 81 e0 ldi r24, 0x01 ; 1 318ca: 80 93 8c 06 sts 0x068C, r24 ; 0x80068c #ifdef TMC2130 bool bHighPowerForced = false; if (tmc2130_mode == TMC2130_MODE_SILENT) 318ce: 80 91 8b 06 lds r24, 0x068B ; 0x80068b ) { bool high_deviation_occured = false; bedPWMDisabled = 1; #ifdef TMC2130 bool bHighPowerForced = false; 318d2: 10 e0 ldi r17, 0x00 ; 0 if (tmc2130_mode == TMC2130_MODE_SILENT) 318d4: 81 30 cpi r24, 0x01 ; 1 318d6: 19 f4 brne .+6 ; 0x318de { FORCE_HIGH_POWER_START; 318d8: 0e 94 48 66 call 0xcc90 ; 0xcc90 bHighPowerForced = true; 318dc: 11 e0 ldi r17, 0x01 ; 1 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 318de: 20 91 b7 02 lds r18, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> 318e2: 2a 83 std Y+2, r18 ; 0x02 check_endstops = check; 318e4: 81 e0 ldi r24, 0x01 ; 1 318e6: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> //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); 318ea: 80 e0 ldi r24, 0x00 ; 0 318ec: 0f 94 a3 4e call 0x29d46 ; 0x29d46 318f0: 89 83 std Y+1, r24 ; 0x01 float z = 0.f; endstop_z_hit_on_purpose(); 318f2: 0f 94 b1 4e call 0x29d62 ; 0x29d62 // move down until you find the bed current_position[Z_AXIS] = minimum_z; 318f6: 80 92 99 06 sts 0x0699, r8 ; 0x800699 318fa: 90 92 9a 06 sts 0x069A, r9 ; 0x80069a 318fe: a0 92 9b 06 sts 0x069B, r10 ; 0x80069b 31902: b0 92 9c 06 sts 0x069C, r11 ; 0x80069c go_to_current(homing_feedrate[Z_AXIS]/60); 31906: 65 e5 ldi r22, 0x55 ; 85 31908: 75 e5 ldi r23, 0x55 ; 85 3190a: 85 e5 ldi r24, 0x55 ; 85 3190c: 91 e4 ldi r25, 0x41 ; 65 3190e: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // 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(); 31912: 0f 94 1e cc call 0x3983c ; 0x3983c if (! endstop_z_hit_on_purpose()) 31916: 0f 94 b1 4e call 0x29d62 ; 0x29d62 3191a: 8c 83 std Y+4, r24 ; 0x04 3191c: 88 23 and r24, r24 3191e: 09 f4 brne .+2 ; 0x31922 31920: f9 c0 rjmp .+498 ; 0x31b14 { //printf_P(PSTR("endstop not hit 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]); goto error; } #ifdef TMC2130 if (!READ(Z_TMC2130_DIAG)) 31922: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 31926: 86 ff sbrs r24, 6 31928: f5 c0 rjmp .+490 ; 0x31b14 { //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) 3192a: 1b 82 std Y+3, r1 ; 0x03 #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; 3192c: c1 2c mov r12, r1 3192e: d1 2c mov r13, r1 31930: 76 01 movw r14, r12 #ifdef SUPPORT_VERBOSITY verbosity_level #endif //SUPPORT_VERBOSITY ) { bool high_deviation_occured = false; 31932: 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) 31934: 8b 81 ldd r24, Y+3 ; 0x03 31936: 80 17 cp r24, r16 31938: 08 f0 brcs .+2 ; 0x3193c 3193a: a8 c0 rjmp .+336 ; 0x31a8c { current_position[Z_AXIS] += high_deviation_occured ? 0.5 : 0.2; 3193c: 60 91 99 06 lds r22, 0x0699 ; 0x800699 31940: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 31944: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 31948: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 3194c: 20 e0 ldi r18, 0x00 ; 0 3194e: 30 e0 ldi r19, 0x00 ; 0 31950: 40 e0 ldi r20, 0x00 ; 0 31952: 5f e3 ldi r21, 0x3F ; 63 31954: 31 10 cpse r3, r1 31956: 04 c0 rjmp .+8 ; 0x31960 31958: 2d ec ldi r18, 0xCD ; 205 3195a: 3c ec ldi r19, 0xCC ; 204 3195c: 4c e4 ldi r20, 0x4C ; 76 3195e: 5e e3 ldi r21, 0x3E ; 62 31960: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31964: 2b 01 movw r4, r22 31966: 3c 01 movw r6, r24 31968: 40 92 99 06 sts 0x0699, r4 ; 0x800699 3196c: 50 92 9a 06 sts 0x069A, r5 ; 0x80069a 31970: 60 92 9b 06 sts 0x069B, r6 ; 0x80069b 31974: 70 92 9c 06 sts 0x069C, r7 ; 0x80069c float z_bckp = current_position[Z_AXIS]; go_to_current(homing_feedrate[Z_AXIS]/60); 31978: 65 e5 ldi r22, 0x55 ; 85 3197a: 75 e5 ldi r23, 0x55 ; 85 3197c: 85 e5 ldi r24, 0x55 ; 85 3197e: 91 e4 ldi r25, 0x41 ; 65 31980: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // Move back down slowly to find bed. current_position[Z_AXIS] = minimum_z; 31984: 80 92 99 06 sts 0x0699, r8 ; 0x800699 31988: 90 92 9a 06 sts 0x069A, r9 ; 0x80069a 3198c: a0 92 9b 06 sts 0x069B, r10 ; 0x80069b 31990: b0 92 9c 06 sts 0x069C, r11 ; 0x80069c //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)); 31994: 65 e5 ldi r22, 0x55 ; 85 31996: 75 e5 ldi r23, 0x55 ; 85 31998: 85 e5 ldi r24, 0x55 ; 85 3199a: 90 e4 ldi r25, 0x40 ; 64 3199c: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // 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(); 319a0: 0f 94 1e cc call 0x3983c ; 0x3983c //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) { 319a4: a3 01 movw r20, r6 319a6: 92 01 movw r18, r4 319a8: 60 91 99 06 lds r22, 0x0699 ; 0x800699 319ac: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 319b0: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 319b4: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 319b8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 319bc: 9f 77 andi r25, 0x7F ; 127 319be: 2d ec ldi r18, 0xCD ; 205 319c0: 3c ec ldi r19, 0xCC ; 204 319c2: 4c ec ldi r20, 0xCC ; 204 319c4: 5c e3 ldi r21, 0x3C ; 60 319c6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 319ca: 87 ff sbrs r24, 7 319cc: 16 c0 rjmp .+44 ; 0x319fa //printf_P(PSTR("PINDA triggered immediately, move Z higher and repeat measurement\n")); raise_z(0.5); 319ce: 60 e0 ldi r22, 0x00 ; 0 319d0: 70 e0 ldi r23, 0x00 ; 0 319d2: 80 e0 ldi r24, 0x00 ; 0 319d4: 9f e3 ldi r25, 0x3F ; 63 319d6: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 current_position[Z_AXIS] = minimum_z; 319da: 80 92 99 06 sts 0x0699, r8 ; 0x800699 319de: 90 92 9a 06 sts 0x069A, r9 ; 0x80069a 319e2: a0 92 9b 06 sts 0x069B, r10 ; 0x80069b 319e6: b0 92 9c 06 sts 0x069C, r11 ; 0x80069c go_to_current(homing_feedrate[Z_AXIS]/(4*60)); 319ea: 65 e5 ldi r22, 0x55 ; 85 319ec: 75 e5 ldi r23, 0x55 ; 85 319ee: 85 e5 ldi r24, 0x55 ; 85 319f0: 90 e4 ldi r25, 0x40 ; 64 319f2: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // 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(); 319f6: 0f 94 1e cc call 0x3983c ; 0x3983c } if (!endstop_z_hit_on_purpose()) 319fa: 0f 94 b1 4e call 0x29d62 ; 0x29d62 319fe: 28 2e mov r2, r24 31a00: 88 23 and r24, r24 31a02: 09 f4 brne .+2 ; 0x31a06 31a04: 87 c0 rjmp .+270 ; 0x31b14 { //printf_P(PSTR("i = %d, endstop not hit 2, current_pos[Z]: %f \n"), i, current_position[Z_AXIS]); goto error; } #ifdef TMC2130 if (!READ(Z_TMC2130_DIAG)) { 31a06: 80 91 06 01 lds r24, 0x0106 ; 0x800106 <__TEXT_REGION_LENGTH__+0x7c2106> 31a0a: 86 ff sbrs r24, 6 31a0c: 83 c0 rjmp .+262 ; 0x31b14 31a0e: 40 90 99 06 lds r4, 0x0699 ; 0x800699 31a12: 50 90 9a 06 lds r5, 0x069A ; 0x80069a 31a16: 60 90 9b 06 lds r6, 0x069B ; 0x80069b 31a1a: 70 90 9c 06 lds r7, 0x069C ; 0x80069c } #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; 31a1e: 2b 81 ldd r18, Y+3 ; 0x03 31a20: 22 23 and r18, r18 31a22: d9 f0 breq .+54 ; 0x31a5a 31a24: 62 2f mov r22, r18 31a26: 70 e0 ldi r23, 0x00 ; 0 31a28: 90 e0 ldi r25, 0x00 ; 0 31a2a: 80 e0 ldi r24, 0x00 ; 0 31a2c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 31a30: 9b 01 movw r18, r22 31a32: ac 01 movw r20, r24 31a34: c7 01 movw r24, r14 31a36: b6 01 movw r22, r12 31a38: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 31a3c: 9b 01 movw r18, r22 31a3e: ac 01 movw r20, r24 31a40: c3 01 movw r24, r6 31a42: b2 01 movw r22, r4 31a44: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 31a48: 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 31a4a: 2d ec ldi r18, 0xCD ; 205 31a4c: 3c ec ldi r19, 0xCC ; 204 31a4e: 4c e4 ldi r20, 0x4C ; 76 31a50: 5d e3 ldi r21, 0x3D ; 61 31a52: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 31a56: 18 16 cp r1, r24 31a58: 64 f0 brlt .+24 ; 0x31a72 #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]; 31a5a: a3 01 movw r20, r6 31a5c: 92 01 movw r18, r4 31a5e: c7 01 movw r24, r14 31a60: b6 01 movw r22, r12 31a62: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31a66: 6b 01 movw r12, r22 31a68: 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) 31a6a: 2b 81 ldd r18, Y+3 ; 0x03 31a6c: 2f 5f subi r18, 0xFF ; 255 31a6e: 2b 83 std Y+3, r18 ; 0x03 31a70: 61 cf rjmp .-318 ; 0x31934 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 31a72: 31 10 cpse r3, r1 31a74: 4f c0 rjmp .+158 ; 0x31b14 //printf_P(PSTR("high dev. first occurence\n")); delay_keep_alive(500); //damping 31a76: 84 ef ldi r24, 0xF4 ; 244 31a78: 91 e0 ldi r25, 0x01 ; 1 31a7a: 0e 94 84 8c call 0x11908 ; 0x11908 //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; 31a7e: 32 2c mov r3, r2 i = -1; 31a80: 8f ef ldi r24, 0xFF ; 255 31a82: 8b 83 std Y+3, r24 ; 0x03 z = 0; 31a84: c1 2c mov r12, r1 31a86: d1 2c mov r13, r1 31a88: 76 01 movw r14, r12 31a8a: ef cf rjmp .-34 ; 0x31a6a } } //printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]); } current_position[Z_AXIS] = z; if (n_iter > 1) 31a8c: 02 30 cpi r16, 0x02 ; 2 31a8e: 68 f5 brcc .+90 ; 0x31aea goto error; } } //printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]); } current_position[Z_AXIS] = z; 31a90: c0 92 99 06 sts 0x0699, r12 ; 0x800699 31a94: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 31a98: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 31a9c: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c 31aa0: 8a 81 ldd r24, Y+2 ; 0x02 31aa2: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> if (n_iter > 1) current_position[Z_AXIS] /= float(n_iter); enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 31aa6: 89 81 ldd r24, Y+1 ; 0x01 31aa8: 0f 94 a3 4e call 0x29d46 ; 0x29d46 // SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 3"); #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; 31aac: 11 23 and r17, r17 31aae: 19 f0 breq .+6 ; 0x31ab6 31ab0: 80 e0 ldi r24, 0x00 ; 0 31ab2: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif bedPWMDisabled = 0; 31ab6: 10 92 8c 06 sts 0x068C, r1 ; 0x80068c #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; #endif bedPWMDisabled = 0; return false; } 31aba: 8c 81 ldd r24, Y+4 ; 0x04 31abc: 0f 90 pop r0 31abe: 0f 90 pop r0 31ac0: 0f 90 pop r0 31ac2: 0f 90 pop r0 31ac4: df 91 pop r29 31ac6: cf 91 pop r28 31ac8: 1f 91 pop r17 31aca: 0f 91 pop r16 31acc: ff 90 pop r15 31ace: ef 90 pop r14 31ad0: df 90 pop r13 31ad2: cf 90 pop r12 31ad4: bf 90 pop r11 31ad6: af 90 pop r10 31ad8: 9f 90 pop r9 31ada: 8f 90 pop r8 31adc: 7f 90 pop r7 31ade: 6f 90 pop r6 31ae0: 5f 90 pop r5 31ae2: 4f 90 pop r4 31ae4: 3f 90 pop r3 31ae6: 2f 90 pop r2 31ae8: 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); 31aea: 60 2f mov r22, r16 31aec: 70 e0 ldi r23, 0x00 ; 0 31aee: 90 e0 ldi r25, 0x00 ; 0 31af0: 80 e0 ldi r24, 0x00 ; 0 31af2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 31af6: 9b 01 movw r18, r22 31af8: ac 01 movw r20, r24 31afa: c7 01 movw r24, r14 31afc: b6 01 movw r22, r12 31afe: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 31b02: 60 93 99 06 sts 0x0699, r22 ; 0x800699 31b06: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 31b0a: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 31b0e: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c 31b12: c6 cf rjmp .-116 ; 0x31aa0 31b14: 2a 81 ldd r18, Y+2 ; 0x02 31b16: 20 93 b7 02 sts 0x02B7, r18 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> return true; error: // SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 4"); enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 31b1a: 89 81 ldd r24, Y+1 ; 0x01 31b1c: 0f 94 a3 4e call 0x29d46 ; 0x29d46 #ifdef TMC2130 if (bHighPowerForced) FORCE_HIGH_POWER_END; 31b20: 11 23 and r17, r17 31b22: 19 f0 breq .+6 ; 0x31b2a 31b24: 80 e0 ldi r24, 0x00 ; 0 31b26: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif bedPWMDisabled = 0; 31b2a: 10 92 8c 06 sts 0x068C, r1 ; 0x80068c return false; 31b2e: 1c 82 std Y+4, r1 ; 0x04 31b30: c4 cf rjmp .-120 ; 0x31aba 00031b32 : //! @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) 31b32: 2f 92 push r2 31b34: 3f 92 push r3 31b36: 4f 92 push r4 31b38: 5f 92 push r5 31b3a: 6f 92 push r6 31b3c: 7f 92 push r7 31b3e: 8f 92 push r8 31b40: 9f 92 push r9 31b42: af 92 push r10 31b44: bf 92 push r11 31b46: cf 92 push r12 31b48: df 92 push r13 31b4a: ef 92 push r14 31b4c: ff 92 push r15 31b4e: 0f 93 push r16 31b50: 1f 93 push r17 31b52: cf 93 push r28 31b54: df 93 push r29 31b56: cd b7 in r28, 0x3d ; 61 31b58: de b7 in r29, 0x3e ; 62 31b5a: ce 5c subi r28, 0xCE ; 206 31b5c: d1 09 sbc r29, r1 31b5e: 0f b6 in r0, 0x3f ; 63 31b60: f8 94 cli 31b62: de bf out 0x3e, r29 ; 62 31b64: 0f be out 0x3f, r0 ; 63 31b66: cd bf out 0x3d, r28 ; 61 31b68: 18 2f mov r17, r24 { bool final_result = false; #ifdef TMC2130 FORCE_HIGH_POWER_START; 31b6a: 81 e0 ldi r24, 0x01 ; 1 31b6c: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif // TMC2130 FORCE_BL_ON_START; 31b70: 81 e0 ldi r24, 0x01 ; 1 31b72: 0e 94 e9 89 call 0x113d2 ; 0x113d2 // Only Z calibration? if (!onlyZ) 31b76: 11 11 cpse r17, r1 31b78: 04 c0 rjmp .+8 ; 0x31b82 { disable_heater(); 31b7a: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 eeprom_adjust_bed_reset(); //reset bed level correction 31b7e: 0e 94 30 76 call 0xec60 ; 0xec60 } // Disable the default update procedure of the display. We will do a modal dialog. lcd_update_enable(false); 31b82: 80 e0 ldi r24, 0x00 ; 0 31b84: 0e 94 bd 6e call 0xdd7a ; 0xdd7a // Let the planner use the uncorrected coordinates. mbl.reset(); 31b88: 0f 94 41 8c call 0x31882 ; 0x31882 // 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(); 31b8c: 0f 94 2a ce call 0x39c54 ; 0x39c54 babystepLoadZ = 0; } void babystep_reset() { babystepLoadZ = 0; 31b90: 10 92 8a 06 sts 0x068A, r1 ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 31b94: 10 92 89 06 sts 0x0689, r1 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> // 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)); 31b98: ee e8 ldi r30, 0x8E ; 142 31b9a: f6 e0 ldi r31, 0x06 ; 6 31b9c: 83 e0 ldi r24, 0x03 ; 3 31b9e: df 01 movw r26, r30 31ba0: 1d 92 st X+, r1 31ba2: 8a 95 dec r24 31ba4: e9 f7 brne .-6 ; 0x31ba0 // Home in the XY plane. //set_destination_to_current(); int l_feedmultiply = setup_for_endstop_move(); 31ba6: 81 e0 ldi r24, 0x01 ; 1 31ba8: 0e 94 80 66 call 0xcd00 ; 0xcd00 31bac: c7 55 subi r28, 0x57 ; 87 31bae: df 4f sbci r29, 0xFF ; 255 31bb0: 99 83 std Y+1, r25 ; 0x01 31bb2: 88 83 st Y, r24 31bb4: c9 5a subi r28, 0xA9 ; 169 31bb6: d0 40 sbci r29, 0x00 ; 0 lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME)); 31bb8: 83 e8 ldi r24, 0x83 ; 131 31bba: 9b e5 ldi r25, 0x5B ; 91 31bbc: 0e 94 44 72 call 0xe488 ; 0xe488 31bc0: 0f 94 c0 20 call 0x24180 ; 0x24180 raise_z_above(MESH_HOME_Z_SEARCH); 31bc4: 60 e0 ldi r22, 0x00 ; 0 31bc6: 70 e0 ldi r23, 0x00 ; 0 31bc8: 80 ea ldi r24, 0xA0 ; 160 31bca: 90 e4 ldi r25, 0x40 ; 64 31bcc: 0e 94 f8 6d call 0xdbf0 ; 0xdbf0 } /**/ void home_xy() { set_destination_to_current(); 31bd0: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 homeaxis(X_AXIS); 31bd4: 50 e0 ldi r21, 0x00 ; 0 31bd6: 40 e0 ldi r20, 0x00 ; 0 31bd8: 61 e0 ldi r22, 0x01 ; 1 31bda: 80 e0 ldi r24, 0x00 ; 0 31bdc: 0e 94 03 7a call 0xf406 ; 0xf406 homeaxis(Y_AXIS); 31be0: 50 e0 ldi r21, 0x00 ; 0 31be2: 40 e0 ldi r20, 0x00 ; 0 31be4: 61 e0 ldi r22, 0x01 ; 1 31be6: 81 e0 ldi r24, 0x01 ; 1 31be8: 0e 94 03 7a call 0xf406 ; 0xf406 plan_set_position_curposXYZE(); 31bec: 0f 94 fd be call 0x37dfa ; 0x37dfa endstops_hit_on_purpose(); 31bf0: 0f 94 bf 4e call 0x29d7e ; 0x29d7e 31bf4: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> 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; 31bf8: 20 e0 ldi r18, 0x00 ; 0 31bfa: 30 e0 ldi r19, 0x00 ; 0 31bfc: 40 ea ldi r20, 0xA0 ; 160 31bfe: 50 e4 ldi r21, 0x40 ; 64 31c00: 60 91 91 06 lds r22, 0x0691 ; 0x800691 31c04: 70 91 92 06 lds r23, 0x0692 ; 0x800692 31c08: 80 91 93 06 lds r24, 0x0693 ; 0x800693 31c0c: 90 91 94 06 lds r25, 0x0694 ; 0x800694 31c10: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31c14: 60 93 91 06 sts 0x0691, r22 ; 0x800691 31c18: 70 93 92 06 sts 0x0692, r23 ; 0x800692 31c1c: 80 93 93 06 sts 0x0693, r24 ; 0x800693 31c20: 90 93 94 06 sts 0x0694, r25 ; 0x800694 current_position[Y_AXIS] += 5; 31c24: 20 e0 ldi r18, 0x00 ; 0 31c26: 30 e0 ldi r19, 0x00 ; 0 31c28: 40 ea ldi r20, 0xA0 ; 160 31c2a: 50 e4 ldi r21, 0x40 ; 64 31c2c: 60 91 95 06 lds r22, 0x0695 ; 0x800695 31c30: 70 91 96 06 lds r23, 0x0696 ; 0x800696 31c34: 80 91 97 06 lds r24, 0x0697 ; 0x800697 31c38: 90 91 98 06 lds r25, 0x0698 ; 0x800698 31c3c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 31c40: 60 93 95 06 sts 0x0695, r22 ; 0x800695 31c44: 70 93 96 06 sts 0x0696, r23 ; 0x800696 31c48: 80 93 97 06 sts 0x0697, r24 ; 0x800697 31c4c: 90 93 98 06 sts 0x0698, r25 ; 0x800698 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 31c50: 60 e0 ldi r22, 0x00 ; 0 31c52: 70 e0 ldi r23, 0x00 ; 0 31c54: 80 ea ldi r24, 0xA0 ; 160 31c56: 91 e4 ldi r25, 0x41 ; 65 31c58: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 31c5c: 0f 94 a9 43 call 0x28752 ; 0x28752 // Let the user move the Z axes up to the end stoppers. #ifdef TMC2130 if (calibrate_z_auto()) 31c60: 0e 94 d6 72 call 0xe5ac ; 0xe5ac 31c64: e5 96 adiw r28, 0x35 ; 53 31c66: 8f af std Y+63, r24 ; 0x3f 31c68: e5 97 sbiw r28, 0x35 ; 53 31c6a: 81 11 cpse r24, r1 31c6c: 04 c0 rjmp .+8 ; 0x31c76 //! @param verbosity_level //! @retval true Succeeded //! @retval false Failed bool gcode_M45(bool onlyZ, int8_t verbosity_level) { bool final_result = false; 31c6e: e5 96 adiw r28, 0x35 ; 53 31c70: 1f ae std Y+63, r1 ; 0x3f 31c72: e5 97 sbiw r28, 0x35 ; 53 31c74: 74 c4 rjmp .+2280 ; 0x3255e { #else //TMC2130 if (lcd_calibrate_z_end_stop_manual(onlyZ)) { #endif //TMC2130 lcd_show_fullscreen_message_and_wait_P(_T(MSG_CONFIRM_NOZZLE_CLEAN)); 31c76: 87 e4 ldi r24, 0x47 ; 71 31c78: 9b e5 ldi r25, 0x5B ; 91 31c7a: 0e 94 44 72 call 0xe488 ; 0xe488 31c7e: 0f 94 cd 20 call 0x2419a ; 0x2419a if(onlyZ){ 31c82: 11 23 and r17, r17 31c84: 09 f4 brne .+2 ; 0x31c88 31c86: 46 c4 rjmp .+2188 ; 0x32514 prompt_steel_sheet_on_bed(true); 31c88: 81 e0 ldi r24, 0x01 ; 1 31c8a: 0f 94 75 0d call 0x21aea ; 0x21aea lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1)); 31c8e: 85 e1 ldi r24, 0x15 ; 21 31c90: 9b e5 ldi r25, 0x5B ; 91 31c92: 0e 94 44 72 call 0xe488 ; 0xe488 31c96: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_puts_at_P(0,3,_n("1/9")); 31c9a: 4e e0 ldi r20, 0x0E ; 14 31c9c: 50 e7 ldi r21, 0x70 ; 112 }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")); 31c9e: 63 e0 ldi r22, 0x03 ; 3 31ca0: 80 e0 ldi r24, 0x00 ; 0 31ca2: 0e 94 8c 6e call 0xdd18 ; 0xdd18 } refresh_cmd_timeout(); 31ca6: 0e 94 5b 66 call 0xccb6 ; 0xccb6 if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { lcd_wait_for_cool_down(); } #endif //STEEL_SHEET if(!onlyZ) 31caa: 11 11 cpse r17, r1 31cac: 1b c0 rjmp .+54 ; 0x31ce4 { KEEPALIVE_STATE(PAUSED_FOR_USER); 31cae: 84 e0 ldi r24, 0x04 ; 4 31cb0: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be prompt_steel_sheet_on_bed(false); 31cb4: 80 e0 ldi r24, 0x00 ; 0 31cb6: 0f 94 75 0d call 0x21aea ; 0x21aea lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER)); 31cba: 8b e5 ldi r24, 0x5B ; 91 31cbc: 9a e5 ldi r25, 0x5A ; 90 31cbe: 0e 94 44 72 call 0xe488 ; 0xe488 31cc2: 0f 94 cd 20 call 0x2419a ; 0x2419a KEEPALIVE_STATE(IN_HANDLER); 31cc6: 82 e0 ldi r24, 0x02 ; 2 31cc8: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1)); 31ccc: 83 ef ldi r24, 0xF3 ; 243 31cce: 9a e5 ldi r25, 0x5A ; 90 31cd0: 0e 94 44 72 call 0xe488 ; 0xe488 31cd4: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_puts_at_P(0,3,_n("1/4")); 31cd8: 46 e0 ldi r20, 0x06 ; 6 31cda: 50 e7 ldi r21, 0x70 ; 112 31cdc: 63 e0 ldi r22, 0x03 ; 3 31cde: 80 e0 ldi r24, 0x00 ; 0 31ce0: 0e 94 8c 6e call 0xdd18 ; 0xdd18 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 31ce4: 00 91 b7 02 lds r16, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> check_endstops = check; 31ce8: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> } bool endstops_enabled = enable_endstops(false); raise_z(-1); 31cec: 60 e0 ldi r22, 0x00 ; 0 31cee: 70 e0 ldi r23, 0x00 ; 0 31cf0: 80 e8 ldi r24, 0x80 ; 128 31cf2: 9f eb ldi r25, 0xBF ; 191 31cf4: 0e 94 79 6d call 0xdaf2 ; 0xdaf2 // Move the print head close to the bed. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 31cf8: c1 2c mov r12, r1 31cfa: d1 2c mov r13, r1 31cfc: b0 ea ldi r27, 0xA0 ; 160 31cfe: eb 2e mov r14, r27 31d00: b0 e4 ldi r27, 0x40 ; 64 31d02: fb 2e mov r15, r27 31d04: c0 92 99 06 sts 0x0699, r12 ; 0x800699 31d08: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 31d0c: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 31d10: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c 31d14: 81 e0 ldi r24, 0x01 ; 1 31d16: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> enable_endstops(true); #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); 31d1a: 84 e0 ldi r24, 0x04 ; 4 31d1c: 0f 94 b4 26 call 0x24d68 ; 0x24d68 #endif //TMC2130 plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 31d20: 60 e0 ldi r22, 0x00 ; 0 31d22: 70 e0 ldi r23, 0x00 ; 0 31d24: 80 ea ldi r24, 0xA0 ; 160 31d26: 91 e4 ldi r25, 0x41 ; 65 31d28: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 31d2c: 0f 94 a9 43 call 0x28752 ; 0x28752 #ifdef TMC2130 tmc2130_home_exit(); 31d30: 0f 94 85 26 call 0x24d0a ; 0x24d0a 31d34: 00 93 b7 02 sts 0x02B7, r16 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #endif //TMC2130 enable_endstops(endstops_enabled); if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) && 31d38: 82 e0 ldi r24, 0x02 ; 2 31d3a: 0f 94 95 43 call 0x2872a ; 0x2872a 31d3e: 2d ec ldi r18, 0xCD ; 205 31d40: 3c ec ldi r19, 0xCC ; 204 31d42: 44 ea ldi r20, 0xA4 ; 164 31d44: 50 e4 ldi r21, 0x40 ; 64 31d46: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 31d4a: 18 16 cp r1, r24 31d4c: 0c f4 brge .+2 ; 0x31d50 31d4e: eb c3 rjmp .+2006 ; 0x32526 (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD))) 31d50: 82 e0 ldi r24, 0x02 ; 2 31d52: 0f 94 95 43 call 0x2872a ; 0x2872a #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)) && 31d56: 23 e3 ldi r18, 0x33 ; 51 31d58: 33 e3 ldi r19, 0x33 ; 51 31d5a: 4b e9 ldi r20, 0x9B ; 155 31d5c: 50 e4 ldi r21, 0x40 ; 64 31d5e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 31d62: 87 fd sbrc r24, 7 31d64: e0 c3 rjmp .+1984 ; 0x32526 (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD))) { if (onlyZ) 31d66: 11 11 cpse r17, r1 31d68: e3 c3 rjmp .+1990 ; 0x32530 } } else { // Reset the baby step value and the baby step applied flag. calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST); 31d6a: 80 e1 ldi r24, 0x10 ; 16 31d6c: 0e 94 f6 ee call 0x1ddec ; 0x1ddec eeprom_update_word_notify(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); 31d70: 81 ea ldi r24, 0xA1 ; 161 31d72: 9d e0 ldi r25, 0x0D ; 13 31d74: 0f 94 10 dc call 0x3b820 ; 0x3b820 31d78: bb e0 ldi r27, 0x0B ; 11 31d7a: 8b 9f mul r24, r27 31d7c: c0 01 movw r24, r0 31d7e: 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); 31d80: 70 e0 ldi r23, 0x00 ; 0 31d82: 60 e0 ldi r22, 0x00 ; 0 31d84: 80 5b subi r24, 0xB0 ; 176 31d86: 92 4f sbci r25, 0xF2 ; 242 31d88: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 } 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(); 31d8c: 0e 94 5b 66 call 0xccb6 ; 0xccb6 // 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); 31d90: e2 ec ldi r30, 0xC2 ; 194 31d92: f3 e1 ldi r31, 0x13 ; 19 31d94: 84 ec ldi r24, 0xC4 ; 196 31d96: df 01 movw r26, r30 31d98: 1d 92 st X+, r1 31d9a: 8a 95 dec r24 31d9c: e9 f7 brne .-6 ; 0x31d98 { #else //NEW_XYZCAL while (iteration < 3) { #endif //NEW_XYZCAL SERIAL_ECHOPGM("Iteration: "); 31d9e: 84 e4 ldi r24, 0x44 ; 68 31da0: 95 ea ldi r25, 0xA5 ; 165 31da2: 0e 94 e8 76 call 0xedd0 ; 0xedd0 MYSERIAL.println(int(iteration + 1)); 31da6: 81 e0 ldi r24, 0x01 ; 1 31da8: 90 e0 ldi r25, 0x00 ; 0 31daa: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 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)); 31dae: 83 ef ldi r24, 0xF3 ; 243 31db0: 9a e5 ldi r25, 0x5A ; 90 31db2: 0e 94 44 72 call 0xe488 ; 0xe488 31db6: 0f 94 c0 20 call 0x24180 ; 0x24180 #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; 31dba: c0 92 99 06 sts 0x0699, r12 ; 0x800699 31dbe: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 31dc2: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 31dc6: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c 31dca: b2 e0 ldi r27, 0x02 ; 2 31dcc: e1 96 adiw r28, 0x31 ; 49 31dce: bf af std Y+63, r27 ; 0x3f 31dd0: e1 97 sbiw r28, 0x31 ; 49 31dd2: 2f e1 ldi r18, 0x1F ; 31 31dd4: 35 ea ldi r19, 0xA5 ; 165 31dd6: cd 56 subi r28, 0x6D ; 109 31dd8: df 4f sbci r29, 0xFF ; 255 31dda: 39 83 std Y+1, r19 ; 0x01 31ddc: 28 83 st Y, r18 31dde: c3 59 subi r28, 0x93 ; 147 31de0: d0 40 sbci r29, 0x00 ; 0 31de2: 41 ec ldi r20, 0xC1 ; 193 31de4: 53 e1 ldi r21, 0x13 ; 19 31de6: cf 56 subi r28, 0x6F ; 111 31de8: df 4f sbci r29, 0xFF ; 255 31dea: 59 83 std Y+1, r21 ; 0x01 31dec: 48 83 st Y, r20 31dee: c1 59 subi r28, 0x91 ; 145 31df0: d0 40 sbci r29, 0x00 ; 0 31df2: a0 96 adiw r28, 0x20 ; 32 31df4: 5f af std Y+63, r21 ; 0x3f 31df6: 4e af std Y+62, r20 ; 0x3e 31df8: a0 97 sbiw r28, 0x20 ; 32 31dfa: e0 96 adiw r28, 0x30 ; 48 31dfc: 3f af std Y+63, r19 ; 0x3f 31dfe: 2e af std Y+62, r18 ; 0x3e 31e00: 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; 31e02: a7 96 adiw r28, 0x27 ; 39 31e04: 1f ae std Y+63, r1 ; 0x3f 31e06: a7 97 sbiw r28, 0x27 ; 39 for (int k = 0; k < 4; ++k) { 31e08: 31 2c mov r3, r1 31e0a: 21 2c mov r2, r1 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 31e0c: 0e 94 5b 66 call 0xccb6 ; 0xccb6 #ifdef MESH_BED_CALIBRATION_SHOW_LCD lcd_set_cursor(0, 3); 31e10: 63 e0 ldi r22, 0x03 ; 3 31e12: 80 e0 ldi r24, 0x00 ; 0 31e14: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%d/4"),(k+1)); 31e18: bf ef ldi r27, 0xFF ; 255 31e1a: 2b 1a sub r2, r27 31e1c: 3b 0a sbc r3, r27 31e1e: 3f 92 push r3 31e20: 2f 92 push r2 31e22: ef e3 ldi r30, 0x3F ; 63 31e24: f5 ea ldi r31, 0xA5 ; 165 31e26: ff 93 push r31 31e28: ef 93 push r30 31e2a: 0e 94 51 6e call 0xdca2 ; 0xdca2 } #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); 31e2e: 65 e5 ldi r22, 0x55 ; 85 31e30: 75 e5 ldi r23, 0x55 ; 85 31e32: 85 e5 ldi r24, 0x55 ; 85 31e34: 91 e4 ldi r25, 0x41 ; 65 31e36: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a 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); 31e3a: e0 96 adiw r28, 0x30 ; 48 31e3c: ee ad ldd r30, Y+62 ; 0x3e 31e3e: ff ad ldd r31, Y+63 ; 0x3f 31e40: e0 97 sbiw r28, 0x30 ; 48 31e42: 85 91 lpm r24, Z+ 31e44: 95 91 lpm r25, Z+ 31e46: a5 91 lpm r26, Z+ 31e48: b4 91 lpm r27, Z 31e4a: 80 93 91 06 sts 0x0691, r24 ; 0x800691 31e4e: 90 93 92 06 sts 0x0692, r25 ; 0x800692 31e52: a0 93 93 06 sts 0x0693, r26 ; 0x800693 31e56: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + k * 2 + 1); 31e5a: e0 96 adiw r28, 0x30 ; 48 31e5c: ee ad ldd r30, Y+62 ; 0x3e 31e5e: ff ad ldd r31, Y+63 ; 0x3f 31e60: e0 97 sbiw r28, 0x30 ; 48 31e62: 34 96 adiw r30, 0x04 ; 4 31e64: 85 91 lpm r24, Z+ 31e66: 95 91 lpm r25, Z+ 31e68: a5 91 lpm r26, Z+ 31e6a: b4 91 lpm r27, Z 31e6c: 80 93 95 06 sts 0x0695, r24 ; 0x800695 31e70: 90 93 96 06 sts 0x0696, r25 ; 0x800696 31e74: a0 93 97 06 sts 0x0697, r26 ; 0x800697 31e78: b0 93 98 06 sts 0x0698, r27 ; 0x800698 MYSERIAL.print(current_position[Z_AXIS], 5); SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY go_to_current(homing_feedrate[X_AXIS] / 60.f); 31e7c: 60 e0 ldi r22, 0x00 ; 0 31e7e: 70 e0 ldi r23, 0x00 ; 0 31e80: 88 e4 ldi r24, 0x48 ; 72 31e82: 92 e4 ldi r25, 0x42 ; 66 31e84: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a return pos * 0.01f; } void xyzcal_measure_enter(void) { DBG(_n("xyzcal_measure_enter\n")); 31e88: 44 ea ldi r20, 0xA4 ; 164 31e8a: 53 ea ldi r21, 0xA3 ; 163 31e8c: 5f 93 push r21 31e8e: 4f 93 push r20 31e90: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 lcd_puts_at_P(4,3,PSTR("Measure center ")); ////MSG_MEASURE_CENTER c=16 31e94: 43 e9 ldi r20, 0x93 ; 147 31e96: 53 ea ldi r21, 0xA3 ; 163 31e98: 63 e0 ldi r22, 0x03 ; 3 31e9a: 84 e0 ldi r24, 0x04 ; 4 31e9c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 // disable heaters and stop motion before we initialize sm4 disable_heater(); 31ea0: 0f 94 f4 2f call 0x25fe8 ; 0x25fe8 st_synchronize(); 31ea4: 0f 94 a9 43 call 0x28752 ; 0x28752 // disable incompatible interrupts DISABLE_STEPPER_DRIVER_INTERRUPT(); 31ea8: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 31eac: 8d 7f andi r24, 0xFD ; 253 31eae: 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" ); 31eb2: 0f b6 in r0, 0x3f ; 63 31eb4: f8 94 cli 31eb6: a8 95 wdr 31eb8: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 31ebc: 88 61 ori r24, 0x18 ; 24 31ebe: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 31ec2: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 31ec6: 0f be out 0x3f, r0 ; 63 #ifdef WATCHDOG wdt_disable(); #endif //WATCHDOG // setup internal callbacks sm4_stop_cb = 0; 31ec8: 10 92 88 06 sts 0x0688, r1 ; 0x800688 31ecc: 10 92 87 06 sts 0x0687, r1 ; 0x800687 sm4_update_pos_cb = xyzcal_update_pos; 31ed0: 8c e1 ldi r24, 0x1C ; 28 31ed2: 9e ec ldi r25, 0xCE ; 206 31ed4: 90 93 86 06 sts 0x0686, r25 ; 0x800686 31ed8: 80 93 85 06 sts 0x0685, r24 ; 0x800685 sm4_calc_delay_cb = xyzcal_calc_delay; 31edc: a7 e1 ldi r26, 0x17 ; 23 31ede: be ec ldi r27, 0xCE ; 206 31ee0: b0 93 84 06 sts 0x0684, r27 ; 0x800684 31ee4: a0 93 83 06 sts 0x0683, r26 ; 0x800683 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]); 31ee8: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 31eec: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 31ef0: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 31ef4: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd 31ef8: 40 91 b6 06 lds r20, 0x06B6 ; 0x8006b6 31efc: 50 91 b7 06 lds r21, 0x06B7 ; 0x8006b7 31f00: 60 91 b8 06 lds r22, 0x06B8 ; 0x8006b8 31f04: 70 91 b9 06 lds r23, 0x06B9 ; 0x8006b9 31f08: 80 91 b2 06 lds r24, 0x06B2 ; 0x8006b2 31f0c: 90 91 b3 06 lds r25, 0x06B3 ; 0x8006b3 31f10: a0 91 b4 06 lds r26, 0x06B4 ; 0x8006b4 31f14: b0 91 b5 06 lds r27, 0x06B5 ; 0x8006b5 31f18: 3f 93 push r19 31f1a: 2f 93 push r18 31f1c: 1f 93 push r17 31f1e: 0f 93 push r16 31f20: 7f 93 push r23 31f22: 6f 93 push r22 31f24: 5f 93 push r21 31f26: 4f 93 push r20 31f28: bf 93 push r27 31f2a: af 93 push r26 31f2c: 9f 93 push r25 31f2e: 8f 93 push r24 31f30: e3 e4 ldi r30, 0x43 ; 67 31f32: f4 ea ldi r31, 0xA4 ; 164 31f34: ff 93 push r31 31f36: ef 93 push r30 31f38: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 int16_t x0 = _X; 31f3c: 40 90 b2 06 lds r4, 0x06B2 ; 0x8006b2 31f40: 50 90 b3 06 lds r5, 0x06B3 ; 0x8006b3 31f44: 60 90 b4 06 lds r6, 0x06B4 ; 0x8006b4 31f48: 70 90 b5 06 lds r7, 0x06B5 ; 0x8006b5 31f4c: b4 2c mov r11, r4 31f4e: a5 2c mov r10, r5 int16_t y0 = _Y; 31f50: 80 91 b6 06 lds r24, 0x06B6 ; 0x8006b6 31f54: 90 91 b7 06 lds r25, 0x06B7 ; 0x8006b7 31f58: a0 91 b8 06 lds r26, 0x06B8 ; 0x8006b8 31f5c: b0 91 b9 06 lds r27, 0x06B9 ; 0x8006b9 31f60: a6 96 adiw r28, 0x26 ; 38 31f62: 8c af std Y+60, r24 ; 0x3c 31f64: 9d af std Y+61, r25 ; 0x3d 31f66: ae af std Y+62, r26 ; 0x3e 31f68: bf af std Y+63, r27 ; 0x3f 31f6a: a6 97 sbiw r28, 0x26 ; 38 31f6c: a3 96 adiw r28, 0x23 ; 35 31f6e: 9f ac ldd r9, Y+63 ; 0x3f 31f70: a3 97 sbiw r28, 0x23 ; 35 31f72: a4 96 adiw r28, 0x24 ; 36 31f74: 8f ac ldd r8, Y+63 ; 0x3f 31f76: a4 97 sbiw r28, 0x24 ; 36 int16_t z = _Z; 31f78: c0 90 ba 06 lds r12, 0x06BA ; 0x8006ba 31f7c: d0 90 bb 06 lds r13, 0x06BB ; 0x8006bb 31f80: e0 90 bc 06 lds r14, 0x06BC ; 0x8006bc 31f84: f0 90 bd 06 lds r15, 0x06BD ; 0x8006bd 31f88: 0f b6 in r0, 0x3f ; 63 31f8a: f8 94 cli 31f8c: de bf out 0x3e, r29 ; 62 31f8e: 0f be out 0x3f, r0 ; 63 31f90: cd bf out 0x3d, r28 ; 61 // int16_t min_z = -6000; // int16_t dz = 100; while (z > -2300) { //-6mm + 0.25mm 31f92: b5 e0 ldi r27, 0x05 ; 5 31f94: cb 16 cp r12, r27 31f96: b7 ef ldi r27, 0xF7 ; 247 31f98: db 06 cpc r13, r27 31f9a: 0c f4 brge .+2 ; 0x31f9e 31f9c: 40 c3 rjmp .+1664 ; 0x3261e } 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; 31f9e: 1a 82 std Y+2, r1 ; 0x02 31fa0: 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); 31fa2: 1f 92 push r1 31fa4: 1f 92 push r1 31fa6: e3 e0 ldi r30, 0x03 ; 3 31fa8: ef 93 push r30 31faa: f4 e8 ldi r31, 0x84 ; 132 31fac: ff 93 push r31 31fae: 1f 92 push r1 31fb0: 24 e6 ldi r18, 0x64 ; 100 31fb2: 2f 93 push r18 31fb4: df 92 push r13 31fb6: cf 92 push r12 31fb8: 8f 92 push r8 31fba: 9f 92 push r9 31fbc: af 92 push r10 31fbe: bf 92 push r11 31fc0: 4a eb ldi r20, 0xBA ; 186 31fc2: 53 ea ldi r21, 0xA3 ; 163 31fc4: 5f 93 push r21 31fc6: 4f 93 push r20 31fc8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (!ret && (ad < 720)) 31fcc: 0f b6 in r0, 0x3f ; 63 31fce: f8 94 cli 31fd0: de bf out 0x3e, r29 ; 62 31fd2: 0f be out 0x3f, r0 ; 63 31fd4: cd bf out 0x3d, r28 ; 61 31fd6: 89 81 ldd r24, Y+1 ; 0x01 31fd8: 9a 81 ldd r25, Y+2 ; 0x02 31fda: 80 3d cpi r24, 0xD0 ; 208 31fdc: 92 40 sbci r25, 0x02 ; 2 31fde: 08 f4 brcc .+2 ; 0x31fe2 31fe0: e9 c2 rjmp .+1490 ; 0x325b4 if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0) ad += 0; if (!ret && (ad < 1440)) 31fe2: 89 81 ldd r24, Y+1 ; 0x01 31fe4: 9a 81 ldd r25, Y+2 ; 0x02 31fe6: 80 3a cpi r24, 0xA0 ; 160 31fe8: 95 40 sbci r25, 0x05 ; 5 31fea: 10 f0 brcs .+4 ; 0x31ff0 31fec: 0d 94 e4 9e jmp 0x33dc8 ; 0x33dc8 if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0) 31ff0: 9e 01 movw r18, r28 31ff2: 2f 5f subi r18, 0xFF ; 255 31ff4: 3f 4f sbci r19, 0xFF ; 255 31ff6: 79 01 movw r14, r18 31ff8: 10 e0 ldi r17, 0x00 ; 0 31ffa: 00 e0 ldi r16, 0x00 ; 0 31ffc: 2c e7 ldi r18, 0x7C ; 124 31ffe: 3c ef ldi r19, 0xFC ; 252 32000: a6 01 movw r20, r12 32002: 44 56 subi r20, 0x64 ; 100 32004: 51 09 sbc r21, r1 32006: 69 2d mov r22, r9 32008: 78 2d mov r23, r8 3200a: 8b 2d mov r24, r11 3200c: 9a 2d mov r25, r10 3200e: 0f 94 72 6f call 0x2dee4 ; 0x2dee4 32012: 88 23 and r24, r24 32014: 11 f4 brne .+4 ; 0x3201a 32016: 0d 94 e4 9e jmp 0x33dc8 ; 0x33dc8 ad += 720; 3201a: 89 81 ldd r24, Y+1 ; 0x01 3201c: 9a 81 ldd r25, Y+2 ; 0x02 3201e: 80 53 subi r24, 0x30 ; 48 32020: 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); 32022: c0 90 ba 06 lds r12, 0x06BA ; 0x8006ba 32026: d0 90 bb 06 lds r13, 0x06BB ; 0x8006bb 3202a: e0 90 bc 06 lds r14, 0x06BC ; 0x8006bc 3202e: f0 90 bd 06 lds r15, 0x06BD ; 0x8006bd 32032: 00 91 b6 06 lds r16, 0x06B6 ; 0x8006b6 32036: 10 91 b7 06 lds r17, 0x06B7 ; 0x8006b7 3203a: 20 91 b8 06 lds r18, 0x06B8 ; 0x8006b8 3203e: 30 91 b9 06 lds r19, 0x06B9 ; 0x8006b9 32042: 40 91 b2 06 lds r20, 0x06B2 ; 0x8006b2 32046: 50 91 b3 06 lds r21, 0x06B3 ; 0x8006b3 3204a: 60 91 b4 06 lds r22, 0x06B4 ; 0x8006b4 3204e: 70 91 b5 06 lds r23, 0x06B5 ; 0x8006b5 32052: 9f 93 push r25 32054: 8f 93 push r24 32056: df 92 push r13 32058: cf 92 push r12 3205a: 1f 93 push r17 3205c: 0f 93 push r16 3205e: 5f 93 push r21 32060: 4f 93 push r20 32062: 8f e1 ldi r24, 0x1F ; 31 32064: 94 ea ldi r25, 0xA4 ; 164 32066: 9f 93 push r25 32068: 8f 93 push r24 3206a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 /// 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); 3206e: 40 91 ba 06 lds r20, 0x06BA ; 0x8006ba 32072: 50 91 bb 06 lds r21, 0x06BB ; 0x8006bb 32076: 60 91 bc 06 lds r22, 0x06BC ; 0x8006bc 3207a: 70 91 bd 06 lds r23, 0x06BD ; 0x8006bd 3207e: 48 54 subi r20, 0x48 ; 72 32080: 51 09 sbc r21, r1 32082: 00 e0 ldi r16, 0x00 ; 0 32084: 28 ec ldi r18, 0xC8 ; 200 32086: 30 e0 ldi r19, 0x00 ; 0 32088: a3 96 adiw r28, 0x23 ; 35 3208a: 6f ad ldd r22, Y+63 ; 0x3f 3208c: a3 97 sbiw r28, 0x23 ; 35 3208e: a4 96 adiw r28, 0x24 ; 36 32090: 7f ad ldd r23, Y+63 ; 0x3f 32092: a4 97 sbiw r28, 0x24 ; 36 32094: c2 01 movw r24, r4 32096: 0e 94 2e ec call 0x1d85c ; 0x1d85c /// 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; 3209a: 20 91 b2 06 lds r18, 0x06B2 ; 0x8006b2 3209e: 30 91 b3 06 lds r19, 0x06B3 ; 0x8006b3 320a2: 40 91 b4 06 lds r20, 0x06B4 ; 0x8006b4 320a6: 50 91 b5 06 lds r21, 0x06B5 ; 0x8006b5 320aa: 6e 96 adiw r28, 0x1e ; 30 320ac: 2c af std Y+60, r18 ; 0x3c 320ae: 3d af std Y+61, r19 ; 0x3d 320b0: 4e af std Y+62, r20 ; 0x3e 320b2: 5f af std Y+63, r21 ; 0x3f 320b4: 6e 97 sbiw r28, 0x1e ; 30 int16_t y = _Y; 320b6: 80 91 b6 06 lds r24, 0x06B6 ; 0x8006b6 320ba: 90 91 b7 06 lds r25, 0x06B7 ; 0x8006b7 320be: a0 91 b8 06 lds r26, 0x06B8 ; 0x8006b8 320c2: b0 91 b9 06 lds r27, 0x06B9 ; 0x8006b9 320c6: ae 96 adiw r28, 0x2e ; 46 320c8: 8c af std Y+60, r24 ; 0x3c 320ca: 9d af std Y+61, r25 ; 0x3d 320cc: ae af std Y+62, r26 ; 0x3e 320ce: bf af std Y+63, r27 ; 0x3f 320d0: ae 97 sbiw r28, 0x2e ; 46 const int16_t z = _Z; 320d2: 20 91 ba 06 lds r18, 0x06BA ; 0x8006ba 320d6: 30 91 bb 06 lds r19, 0x06BB ; 0x8006bb 320da: 40 91 bc 06 lds r20, 0x06BC ; 0x8006bc 320de: 50 91 bd 06 lds r21, 0x06BD ; 0x8006bd 320e2: e9 96 adiw r28, 0x39 ; 57 320e4: 2c af std Y+60, r18 ; 0x3c 320e6: 3d af std Y+61, r19 ; 0x3d 320e8: 4e af std Y+62, r20 ; 0x3e 320ea: 5f af std Y+63, r21 ; 0x3f 320ec: e9 97 sbiw r28, 0x39 ; 57 320ee: a4 ec ldi r26, 0xC4 ; 196 320f0: ba e0 ldi r27, 0x0A ; 10 320f2: 0f b6 in r0, 0x3f ; 63 320f4: f8 94 cli 320f6: de bf out 0x3e, r29 ; 62 320f8: 0f be out 0x3f, r0 ; 63 320fa: cd bf out 0x3d, r28 ; 61 320fc: 90 e0 ldi r25, 0x00 ; 0 320fe: 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)); 32100: fc 01 movw r30, r24 32102: e6 54 subi r30, 0x46 ; 70 32104: fb 45 sbci r31, 0x5B ; 91 32106: 25 91 lpm r18, Z+ 32108: 34 91 lpm r19, Z 3210a: 2d 93 st X+, r18 3210c: 3d 93 st X+, r19 pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i)); 3210e: fc 01 movw r30, r24 32110: ee 55 subi r30, 0x5E ; 94 32112: fb 45 sbci r31, 0x5B ; 91 32114: 25 91 lpm r18, Z+ 32116: 34 91 lpm r19, Z 32118: 57 96 adiw r26, 0x17 ; 23 3211a: 3c 93 st X, r19 3211c: 2e 93 st -X, r18 3211e: 56 97 sbiw r26, 0x16 ; 22 32120: 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++){ 32122: 88 31 cpi r24, 0x18 ; 24 32124: 91 05 cpc r25, r1 32126: 61 f7 brne .-40 ; 0x32100 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); 32128: e7 96 adiw r28, 0x37 ; 55 3212a: 4e ad ldd r20, Y+62 ; 0x3e 3212c: 5f ad ldd r21, Y+63 ; 0x3f 3212e: e7 97 sbiw r28, 0x37 ; 55 32130: ac 96 adiw r28, 0x2c ; 44 32132: 6e ad ldd r22, Y+62 ; 0x3e 32134: 7f ad ldd r23, Y+63 ; 0x3f 32136: ac 97 sbiw r28, 0x2c ; 44 32138: 6c 96 adiw r28, 0x1c ; 28 3213a: 8e ad ldd r24, Y+62 ; 0x3e 3213c: 9f ad ldd r25, Y+63 ; 0x3f 3213e: 6c 97 sbiw r28, 0x1c ; 28 32140: 0f 94 ae 70 call 0x2e15c ; 0x2e15c 32144: 24 ec ldi r18, 0xC4 ; 196 32146: 36 e0 ldi r19, 0x06 ; 6 32148: a4 96 adiw r28, 0x24 ; 36 3214a: 3f af std Y+63, r19 ; 0x3f 3214c: 2e af std Y+62, r18 ; 0x3e 3214e: a4 97 sbiw r28, 0x24 ; 36 32150: 79 01 movw r14, r18 32152: f0 e2 ldi r31, 0x20 ; 32 32154: 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]); 32156: a5 e6 ldi r26, 0x65 ; 101 32158: ca 2e mov r12, r26 3215a: a4 ea ldi r26, 0xA4 ; 164 3215c: da 2e mov r13, r26 } DBG(endl); 3215e: 0a eb ldi r16, 0xBA ; 186 32160: 15 ea ldi r17, 0xA5 ; 165 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); 32162: 57 01 movw r10, r14 32164: e0 e2 ldi r30, 0x20 ; 32 32166: 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]); 32168: d5 01 movw r26, r10 3216a: 8d 91 ld r24, X+ 3216c: 5d 01 movw r10, r26 3216e: 1f 92 push r1 32170: 8f 93 push r24 32172: df 92 push r13 32174: cf 92 push r12 32176: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 3217a: 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){ 3217c: 0f 90 pop r0 3217e: 0f 90 pop r0 32180: 0f 90 pop r0 32182: 0f 90 pop r0 32184: 81 10 cpse r8, r1 32186: f0 cf rjmp .-32 ; 0x32168 DBG(_n("%02x"), matrix_32x32[idx_y + x]); } DBG(endl); 32188: 1f 93 push r17 3218a: 0f 93 push r16 3218c: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 32190: 9a 94 dec r9 32192: b0 e2 ldi r27, 0x20 ; 32 32194: eb 0e add r14, r27 32196: 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){ 32198: 0f 90 pop r0 3219a: 0f 90 pop r0 3219c: 91 10 cpse r9, r1 3219e: e1 cf rjmp .-62 ; 0x32162 for (uint8_t x = 0; x < 32; ++x){ DBG(_n("%02x"), matrix_32x32[idx_y + x]); } DBG(endl); } DBG(endl); 321a0: 1f 93 push r17 321a2: 0f 93 push r16 321a4: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 321a8: 64 ec ldi r22, 0xC4 ; 196 321aa: 7a e0 ldi r23, 0x0A ; 10 321ac: 0f 90 pop r0 321ae: 0f 90 pop r0 321b0: e4 ec ldi r30, 0xC4 ; 196 321b2: 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; 321b4: 90 e0 ldi r25, 0x00 ; 0 321b6: 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; 321b8: 50 e0 ldi r21, 0x00 ; 0 321ba: 40 e0 ldi r20, 0x00 ; 0 int16_t maxs = 0; for (int16_t i = 0; i < 32*32;++i){ if (matrix32[i] == 0) { 321bc: 21 91 ld r18, Z+ 321be: 21 11 cpse r18, r1 321c0: 6d c4 rjmp .+2266 ; 0x32a9c ++mins; 321c2: 4f 5f subi r20, 0xFF ; 255 321c4: 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){ 321c6: 6e 17 cp r22, r30 321c8: 7f 07 cpc r23, r31 321ca: c1 f7 brne .-16 ; 0x321bc ++maxs; } } const int16_t rest = 1024 - mins - maxs; if (mins + maxs > threshold_total 321cc: 9a 01 movw r18, r20 321ce: 28 0f add r18, r24 321d0: 39 1f adc r19, r25 321d2: 25 38 cpi r18, 0x85 ; 133 321d4: 33 40 sbci r19, 0x03 ; 3 321d6: a4 f0 brlt .+40 ; 0x32200 && mins > threshold_extreme 321d8: 43 33 cpi r20, 0x33 ; 51 321da: 51 05 cpc r21, r1 321dc: 8c f0 brlt .+34 ; 0x32200 && maxs > threshold_extreme 321de: 83 33 cpi r24, 0x33 ; 51 321e0: 91 05 cpc r25, r1 321e2: 74 f0 brlt .+28 ; 0x32200 ++mins; } else if (matrix32[i] == 0xFF){ ++maxs; } } const int16_t rest = 1024 - mins - maxs; 321e4: 20 e0 ldi r18, 0x00 ; 0 321e6: 34 e0 ldi r19, 0x04 ; 4 321e8: 24 1b sub r18, r20 321ea: 35 0b sbc r19, r21 321ec: 28 1b sub r18, r24 321ee: 39 0b sbc r19, r25 if (mins + maxs > threshold_total && mins > threshold_extreme && maxs > threshold_extreme && mins > rest 321f0: 24 17 cp r18, r20 321f2: 35 07 cpc r19, r21 321f4: 2c f4 brge .+10 ; 0x32200 } 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; 321f6: 1d ef ldi r17, 0xFD ; 253 if (mins + maxs > threshold_total && mins > threshold_extreme && maxs > threshold_extreme && mins > rest && maxs > rest) 321f8: 28 17 cp r18, r24 321fa: 39 07 cpc r19, r25 321fc: 0c f4 brge .+2 ; 0x32200 321fe: 3f c2 rjmp .+1150 ; 0x3267e } /// 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; 32200: 66 96 adiw r28, 0x16 ; 22 32202: 1f ae std Y+63, r1 ; 0x3f 32204: 66 97 sbiw r28, 0x16 ; 22 uint8_t r08 = 0; 32206: 62 96 adiw r28, 0x12 ; 18 32208: 1f ae std Y+63, r1 ; 0x3f 3220a: 62 97 sbiw r28, 0x12 ; 18 uint8_t match08 = 0; uint8_t c10 = 0; 3220c: 22 96 adiw r28, 0x02 ; 2 3220e: 1f ae std Y+63, r1 ; 0x3f 32210: 22 97 sbiw r28, 0x02 ; 2 uint8_t r10 = 0; 32212: 19 82 std Y+1, r1 ; 0x01 32214: ae 01 movw r20, r28 32216: 4f 5a subi r20, 0xAF ; 175 32218: 5f 4f sbci r21, 0xFF ; 255 3221a: be 01 movw r22, r28 3221c: 6b 5a subi r22, 0xAB ; 171 3221e: 7f 4f sbci r23, 0xFF ; 255 32220: 84 ec ldi r24, 0xC4 ; 196 32222: 9a e0 ldi r25, 0x0A ; 10 32224: 0f 94 d5 68 call 0x2d1aa ; 0x2d1aa 32228: 08 2f mov r16, r24 3222a: ae 01 movw r20, r28 3222c: 4f 5f subi r20, 0xFF ; 255 3222e: 5f 4f sbci r21, 0xFF ; 255 32230: be 01 movw r22, r28 32232: 6f 5b subi r22, 0xBF ; 191 32234: 7f 4f sbci r23, 0xFF ; 255 32236: 8c ed ldi r24, 0xDC ; 220 32238: 9a e0 ldi r25, 0x0A ; 10 3223a: 0f 94 d5 68 call 0x2d1aa ; 0x2d1aa 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; 3223e: 66 96 adiw r28, 0x16 ; 22 32240: 6f ad ldd r22, Y+63 ; 0x3f 32242: 66 97 sbiw r28, 0x16 ; 22 row = r08; 32244: 62 96 adiw r28, 0x12 ; 18 32246: 1f ad ldd r17, Y+63 ; 0x3f 32248: 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){ 3224a: 80 17 cp r24, r16 3224c: 28 f0 brcs .+10 ; 0x32258 col = c08; row = r08; return match08; } col = c10; 3224e: 22 96 adiw r28, 0x02 ; 2 32250: 6f ad ldd r22, Y+63 ; 0x3f 32252: 22 97 sbiw r28, 0x02 ; 2 row = r10; 32254: 19 81 ldd r17, Y+1 ; 0x01 32256: 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){ 32258: 08 35 cpi r16, 0x58 ; 88 3225a: 08 f4 brcc .+2 ; 0x3225e 3225c: 24 c4 rjmp .+2120 ; 0x32aa6 /// find precise circle /// move to the center of the pattern (+5.5) float xf = uc + 5.5f; 3225e: 70 e0 ldi r23, 0x00 ; 0 32260: 90 e0 ldi r25, 0x00 ; 0 32262: 80 e0 ldi r24, 0x00 ; 0 32264: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 32268: 20 e0 ldi r18, 0x00 ; 0 3226a: 30 e0 ldi r19, 0x00 ; 0 3226c: 40 eb ldi r20, 0xB0 ; 176 3226e: 50 e4 ldi r21, 0x40 ; 64 32270: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32274: 2b 01 movw r4, r22 32276: 3c 01 movw r6, r24 32278: 65 96 adiw r28, 0x15 ; 21 3227a: 4c ae std Y+60, r4 ; 0x3c 3227c: 5d ae std Y+61, r5 ; 0x3d 3227e: 6e ae std Y+62, r6 ; 0x3e 32280: 7f ae std Y+63, r7 ; 0x3f 32282: 65 97 sbiw r28, 0x15 ; 21 float yf = ur + 5.5f; 32284: 61 2f mov r22, r17 32286: 70 e0 ldi r23, 0x00 ; 0 32288: 90 e0 ldi r25, 0x00 ; 0 3228a: 80 e0 ldi r24, 0x00 ; 0 3228c: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 32290: 20 e0 ldi r18, 0x00 ; 0 32292: 30 e0 ldi r19, 0x00 ; 0 32294: 40 eb ldi r20, 0xB0 ; 176 32296: 50 e4 ldi r21, 0x40 ; 64 32298: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3229c: 4b 01 movw r8, r22 3229e: 5c 01 movw r10, r24 322a0: 25 96 adiw r28, 0x05 ; 5 322a2: 8c ae std Y+60, r8 ; 0x3c 322a4: 9d ae std Y+61, r9 ; 0x3d 322a6: ae ae std Y+62, r10 ; 0x3e 322a8: bf ae std Y+63, r11 ; 0x3f 322aa: 25 97 sbiw r28, 0x05 ; 5 float radius = 4.5f; ///< default radius 322ac: 20 e0 ldi r18, 0x00 ; 0 322ae: 30 e0 ldi r19, 0x00 ; 0 322b0: 40 e9 ldi r20, 0x90 ; 144 322b2: 50 e4 ldi r21, 0x40 ; 64 322b4: 29 83 std Y+1, r18 ; 0x01 322b6: 3a 83 std Y+2, r19 ; 0x02 322b8: 4b 83 std Y+3, r20 ; 0x03 322ba: 5c 83 std Y+4, r21 ; 0x04 constexpr const uint8_t iterations = 20; dynamic_circle(matrix32, xf, yf, radius, iterations); 322bc: ae 01 movw r20, r28 322be: 4f 5f subi r20, 0xFF ; 255 322c0: 5f 4f sbci r21, 0xFF ; 255 322c2: be 01 movw r22, r28 322c4: 6f 5b subi r22, 0xBF ; 191 322c6: 7f 4f sbci r23, 0xFF ; 255 322c8: ce 01 movw r24, r28 322ca: 8f 5a subi r24, 0xAF ; 175 322cc: 9f 4f sbci r25, 0xFF ; 255 322ce: 0f 94 f2 6b call 0x2d7e4 ; 0x2d7e4 if (fabs(xf - (uc + 5.5f)) > 3 || fabs(yf - (ur + 5.5f)) > 3 || fabs(radius - 5) > 3){ 322d2: a3 01 movw r20, r6 322d4: 92 01 movw r18, r4 322d6: 65 96 adiw r28, 0x15 ; 21 322d8: 6c ad ldd r22, Y+60 ; 0x3c 322da: 7d ad ldd r23, Y+61 ; 0x3d 322dc: 8e ad ldd r24, Y+62 ; 0x3e 322de: 9f ad ldd r25, Y+63 ; 0x3f 322e0: 65 97 sbiw r28, 0x15 ; 21 322e2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 322e6: 6b 01 movw r12, r22 322e8: 7c 01 movw r14, r24 322ea: 9f 77 andi r25, 0x7F ; 127 322ec: 20 e0 ldi r18, 0x00 ; 0 322ee: 30 e0 ldi r19, 0x00 ; 0 322f0: 40 e4 ldi r20, 0x40 ; 64 322f2: 50 e4 ldi r21, 0x40 ; 64 322f4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 322f8: 18 16 cp r1, r24 322fa: 34 f1 brlt .+76 ; 0x32348 322fc: a5 01 movw r20, r10 322fe: 94 01 movw r18, r8 32300: 25 96 adiw r28, 0x05 ; 5 32302: 6c ad ldd r22, Y+60 ; 0x3c 32304: 7d ad ldd r23, Y+61 ; 0x3d 32306: 8e ad ldd r24, Y+62 ; 0x3e 32308: 9f ad ldd r25, Y+63 ; 0x3f 3230a: 25 97 sbiw r28, 0x05 ; 5 3230c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 32310: 9f 77 andi r25, 0x7F ; 127 32312: 20 e0 ldi r18, 0x00 ; 0 32314: 30 e0 ldi r19, 0x00 ; 0 32316: 40 e4 ldi r20, 0x40 ; 64 32318: 50 e4 ldi r21, 0x40 ; 64 3231a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 3231e: 18 16 cp r1, r24 32320: 9c f0 brlt .+38 ; 0x32348 32322: 20 e0 ldi r18, 0x00 ; 0 32324: 30 e0 ldi r19, 0x00 ; 0 32326: 40 ea ldi r20, 0xA0 ; 160 32328: 50 e4 ldi r21, 0x40 ; 64 3232a: 69 81 ldd r22, Y+1 ; 0x01 3232c: 7a 81 ldd r23, Y+2 ; 0x02 3232e: 8b 81 ldd r24, Y+3 ; 0x03 32330: 9c 81 ldd r25, Y+4 ; 0x04 32332: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 32336: 9f 77 andi r25, 0x7F ; 127 32338: 20 e0 ldi r18, 0x00 ; 0 3233a: 30 e0 ldi r19, 0x00 ; 0 3233c: 40 e4 ldi r20, 0x40 ; 64 3233e: 50 e4 ldi r21, 0x40 ; 64 32340: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 32344: 18 16 cp r1, r24 32346: bc f5 brge .+110 ; 0x323b6 //@size=88 DBG(_n(" [%f %f][%f] mm divergence\n"), xf - (uc + 5.5f), yf - (ur + 5.5f), radius - 5); 32348: 20 e0 ldi r18, 0x00 ; 0 3234a: 30 e0 ldi r19, 0x00 ; 0 3234c: 40 ea ldi r20, 0xA0 ; 160 3234e: 50 e4 ldi r21, 0x40 ; 64 32350: 69 81 ldd r22, Y+1 ; 0x01 32352: 7a 81 ldd r23, Y+2 ; 0x02 32354: 8b 81 ldd r24, Y+3 ; 0x03 32356: 9c 81 ldd r25, Y+4 ; 0x04 32358: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3235c: 9f 93 push r25 3235e: 8f 93 push r24 32360: 7f 93 push r23 32362: 6f 93 push r22 32364: a5 01 movw r20, r10 32366: 94 01 movw r18, r8 32368: 25 96 adiw r28, 0x05 ; 5 3236a: 6c ad ldd r22, Y+60 ; 0x3c 3236c: 7d ad ldd r23, Y+61 ; 0x3d 3236e: 8e ad ldd r24, Y+62 ; 0x3e 32370: 9f ad ldd r25, Y+63 ; 0x3f 32372: 25 97 sbiw r28, 0x05 ; 5 32374: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 32378: 9f 93 push r25 3237a: 8f 93 push r24 3237c: 7f 93 push r23 3237e: 6f 93 push r22 32380: ff 92 push r15 32382: ef 92 push r14 32384: df 92 push r13 32386: cf 92 push r12 32388: 86 e8 ldi r24, 0x86 ; 134 3238a: 94 ea ldi r25, 0xA4 ; 164 3238c: 9f 93 push r25 3238e: 8f 93 push r24 32390: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 /// dynamic algorithm diverged, use original position instead xf = uc + 5.5f; 32394: 65 96 adiw r28, 0x15 ; 21 32396: 4c ae std Y+60, r4 ; 0x3c 32398: 5d ae std Y+61, r5 ; 0x3d 3239a: 6e ae std Y+62, r6 ; 0x3e 3239c: 7f ae std Y+63, r7 ; 0x3f 3239e: 65 97 sbiw r28, 0x15 ; 21 yf = ur + 5.5f; 323a0: 25 96 adiw r28, 0x05 ; 5 323a2: 8c ae std Y+60, r8 ; 0x3c 323a4: 9d ae std Y+61, r9 ; 0x3d 323a6: ae ae std Y+62, r10 ; 0x3e 323a8: bf ae std Y+63, r11 ; 0x3f 323aa: 25 97 sbiw r28, 0x05 ; 5 323ac: 0f b6 in r0, 0x3f ; 63 323ae: f8 94 cli 323b0: de bf out 0x3e, r29 ; 62 323b2: 0f be out 0x3f, r0 ; 63 323b4: cd bf out 0x3d, r28 ; 61 } /// move to the center of area and convert to position xf = (float)x + (xf - 15.5f) * 64; 323b6: 20 e0 ldi r18, 0x00 ; 0 323b8: 30 e0 ldi r19, 0x00 ; 0 323ba: 48 e7 ldi r20, 0x78 ; 120 323bc: 51 e4 ldi r21, 0x41 ; 65 323be: 65 96 adiw r28, 0x15 ; 21 323c0: 6c ad ldd r22, Y+60 ; 0x3c 323c2: 7d ad ldd r23, Y+61 ; 0x3d 323c4: 8e ad ldd r24, Y+62 ; 0x3e 323c6: 9f ad ldd r25, Y+63 ; 0x3f 323c8: 65 97 sbiw r28, 0x15 ; 21 323ca: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 323ce: 20 e0 ldi r18, 0x00 ; 0 323d0: 30 e0 ldi r19, 0x00 ; 0 323d2: 40 e8 ldi r20, 0x80 ; 128 323d4: 52 e4 ldi r21, 0x42 ; 66 323d6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 323da: 6b 01 movw r12, r22 323dc: 7c 01 movw r14, r24 323de: 6c 96 adiw r28, 0x1c ; 28 323e0: ae ad ldd r26, Y+62 ; 0x3e 323e2: bf ad ldd r27, Y+63 ; 0x3f 323e4: 6c 97 sbiw r28, 0x1c ; 28 323e6: bd 01 movw r22, r26 323e8: bb 0f add r27, r27 323ea: 88 0b sbc r24, r24 323ec: 99 0b sbc r25, r25 323ee: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 323f2: 9b 01 movw r18, r22 323f4: ac 01 movw r20, r24 323f6: c7 01 movw r24, r14 323f8: b6 01 movw r22, r12 323fa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 323fe: 6b 01 movw r12, r22 32400: 7c 01 movw r14, r24 32402: 65 96 adiw r28, 0x15 ; 21 32404: cc ae std Y+60, r12 ; 0x3c 32406: dd ae std Y+61, r13 ; 0x3d 32408: ee ae std Y+62, r14 ; 0x3e 3240a: ff ae std Y+63, r15 ; 0x3f 3240c: 65 97 sbiw r28, 0x15 ; 21 yf = (float)y + (yf - 15.5f) * 64; 3240e: 20 e0 ldi r18, 0x00 ; 0 32410: 30 e0 ldi r19, 0x00 ; 0 32412: 48 e7 ldi r20, 0x78 ; 120 32414: 51 e4 ldi r21, 0x41 ; 65 32416: 25 96 adiw r28, 0x05 ; 5 32418: 6c ad ldd r22, Y+60 ; 0x3c 3241a: 7d ad ldd r23, Y+61 ; 0x3d 3241c: 8e ad ldd r24, Y+62 ; 0x3e 3241e: 9f ad ldd r25, Y+63 ; 0x3f 32420: 25 97 sbiw r28, 0x05 ; 5 32422: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 32426: 20 e0 ldi r18, 0x00 ; 0 32428: 30 e0 ldi r19, 0x00 ; 0 3242a: 40 e8 ldi r20, 0x80 ; 128 3242c: 52 e4 ldi r21, 0x42 ; 66 3242e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32432: 4b 01 movw r8, r22 32434: 5c 01 movw r10, r24 32436: ac 96 adiw r28, 0x2c ; 44 32438: ee ad ldd r30, Y+62 ; 0x3e 3243a: ff ad ldd r31, Y+63 ; 0x3f 3243c: ac 97 sbiw r28, 0x2c ; 44 3243e: bf 01 movw r22, r30 32440: ff 0f add r31, r31 32442: 88 0b sbc r24, r24 32444: 99 0b sbc r25, r25 32446: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 3244a: 9b 01 movw r18, r22 3244c: ac 01 movw r20, r24 3244e: c5 01 movw r24, r10 32450: b4 01 movw r22, r8 32452: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32456: 25 96 adiw r28, 0x05 ; 5 32458: 6c af std Y+60, r22 ; 0x3c 3245a: 7d af std Y+61, r23 ; 0x3d 3245c: 8e af std Y+62, r24 ; 0x3e 3245e: 9f af std Y+63, r25 ; 0x3f 32460: 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; 32462: 2a e0 ldi r18, 0x0A ; 10 32464: 37 ed ldi r19, 0xD7 ; 215 32466: 43 e2 ldi r20, 0x23 ; 35 32468: 5c e3 ldi r21, 0x3C ; 60 3246a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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)); 3246e: 9f 93 push r25 32470: 8f 93 push r24 32472: 7f 93 push r23 32474: 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; 32476: 2a e0 ldi r18, 0x0A ; 10 32478: 37 ed ldi r19, 0xD7 ; 215 3247a: 43 e2 ldi r20, 0x23 ; 35 3247c: 5c e3 ldi r21, 0x3C ; 60 3247e: c7 01 movw r24, r14 32480: b6 01 movw r22, r12 32482: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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)); 32486: 9f 93 push r25 32488: 8f 93 push r24 3248a: 7f 93 push r23 3248c: 6f 93 push r22 3248e: 8a e6 ldi r24, 0x6A ; 106 32490: 94 ea ldi r25, 0xA4 ; 164 32492: 9f 93 push r25 32494: 8f 93 push r24 32496: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 uint16_t round_to_u16(float f){ return (uint16_t)(f + .5f); } int16_t round_to_i16(float f){ return (int16_t)(f + .5f); 3249a: 20 e0 ldi r18, 0x00 ; 0 3249c: 30 e0 ldi r19, 0x00 ; 0 3249e: 40 e0 ldi r20, 0x00 ; 0 324a0: 5f e3 ldi r21, 0x3F ; 63 324a2: 25 96 adiw r28, 0x05 ; 5 324a4: 6c ad ldd r22, Y+60 ; 0x3c 324a6: 7d ad ldd r23, Y+61 ; 0x3d 324a8: 8e ad ldd r24, Y+62 ; 0x3e 324aa: 9f ad ldd r25, Y+63 ; 0x3f 324ac: 25 97 sbiw r28, 0x05 ; 5 324ae: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 324b2: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 324b6: 6b 01 movw r12, r22 324b8: 20 e0 ldi r18, 0x00 ; 0 324ba: 30 e0 ldi r19, 0x00 ; 0 324bc: 40 e0 ldi r20, 0x00 ; 0 324be: 5f e3 ldi r21, 0x3F ; 63 324c0: 65 96 adiw r28, 0x15 ; 21 324c2: 6c ad ldd r22, Y+60 ; 0x3c 324c4: 7d ad ldd r23, Y+61 ; 0x3d 324c6: 8e ad ldd r24, Y+62 ; 0x3e 324c8: 9f ad ldd r25, Y+63 ; 0x3f 324ca: 65 97 sbiw r28, 0x15 ; 21 324cc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 324d0: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 324d4: 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); 324d6: 00 e0 ldi r16, 0x00 ; 0 324d8: 28 ec ldi r18, 0xC8 ; 200 324da: 30 e0 ldi r19, 0x00 ; 0 324dc: e7 96 adiw r28, 0x37 ; 55 324de: 4e ad ldd r20, Y+62 ; 0x3e 324e0: 5f ad ldd r21, Y+63 ; 0x3f 324e2: e7 97 sbiw r28, 0x37 ; 55 324e4: b6 01 movw r22, r12 324e6: 0e 94 2e ec call 0x1d85c ; 0x1d85c 324ea: 0f b6 in r0, 0x3f ; 63 324ec: f8 94 cli 324ee: de bf out 0x3e, r29 ; 62 324f0: 0f be out 0x3f, r0 ; 63 324f2: cd bf out 0x3d, r28 ; 61 ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND; 324f4: 10 e0 ldi r17, 0x00 ; 0 324f6: 84 ea ldi r24, 0xA4 ; 164 324f8: 9d e0 ldi r25, 0x0D ; 13 } /// wipe buffer for (uint16_t i = 0; i < sizeof(block_t)*BLOCK_BUFFER_SIZE; i++) matrix32[i] = 0; 324fa: a4 96 adiw r28, 0x24 ; 36 324fc: ae ad ldd r26, Y+62 ; 0x3e 324fe: bf ad ldd r27, Y+63 ; 0x3f 32500: a4 97 sbiw r28, 0x24 ; 36 32502: 1d 92 st X+, r1 32504: a4 96 adiw r28, 0x24 ; 36 32506: bf af std Y+63, r27 ; 0x3f 32508: ae af std Y+62, r26 ; 0x3e 3250a: 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++) 3250c: 8a 17 cp r24, r26 3250e: 9b 07 cpc r25, r27 32510: a1 f7 brne .-24 ; 0x324fa 32512: b5 c0 rjmp .+362 ; 0x3267e 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)); 32514: 83 ef ldi r24, 0xF3 ; 243 32516: 9a e5 ldi r25, 0x5A ; 90 32518: 0e 94 44 72 call 0xe488 ; 0xe488 3251c: 0f 94 c0 20 call 0x24180 ; 0x24180 lcd_puts_at_P(0,3,_n("1/4")); 32520: 4a e0 ldi r20, 0x0A ; 10 32522: 50 e7 ldi r21, 0x70 ; 112 32524: bc cb rjmp .-2184 ; 0x31c9e } } } else { lcd_show_fullscreen_message_and_wait_P(PSTR("Calibration failed! Check the axes and run again.")); 32526: 80 e5 ldi r24, 0x50 ; 80 32528: 95 ea ldi r25, 0xA5 ; 165 // 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); 3252a: 0f 94 cd 20 call 0x2419a ; 0x2419a 3252e: 9f cb rjmp .-2242 ; 0x31c6e 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); 32530: c7 55 subi r28, 0x57 ; 87 32532: df 4f sbci r29, 0xFF ; 255 32534: 88 81 ld r24, Y 32536: 99 81 ldd r25, Y+1 ; 0x01 32538: c9 5a subi r28, 0xA9 ; 169 3253a: d0 40 sbci r29, 0x00 ; 0 3253c: 0e 94 66 66 call 0xcccc ; 0xcccc // Z only calibration. // Load the machine correction matrix world2machine_initialize(); 32540: 0f 94 8f ce call 0x39d1e ; 0x39d1e // and correct the current_position to match the transformed coordinate system. world2machine_update_current(); 32544: 0f 94 2d cc call 0x3985a ; 0x3985a //FIXME bool result = sample_mesh_and_store_reference(); 32548: 0f 94 3c ca call 0x39478 ; 0x39478 3254c: e5 96 adiw r28, 0x35 ; 53 3254e: 8f af std Y+63, r24 ; 0x3f 32550: e5 97 sbiw r28, 0x35 ; 53 if (result) 32552: 88 23 and r24, r24 32554: 09 f4 brne .+2 ; 0x32558 32556: 8b cb rjmp .-2282 ; 0x31c6e { calibration_status_set(CALIBRATION_STATUS_Z); 32558: 84 e0 ldi r24, 0x04 ; 4 3255a: 0e 94 4b ef call 0x1de96 ; 0x1de96 } else { // Timeouted. } lcd_update_enable(true); 3255e: 81 e0 ldi r24, 0x01 ; 1 32560: 0e 94 bd 6e call 0xdd7a ; 0xdd7a #ifdef TMC2130 FORCE_HIGH_POWER_END; 32564: 80 e0 ldi r24, 0x00 ; 0 32566: 0e 94 48 66 call 0xcc90 ; 0xcc90 #endif // TMC2130 FORCE_BL_ON_END; 3256a: 80 e0 ldi r24, 0x00 ; 0 3256c: 0e 94 e9 89 call 0x113d2 ; 0x113d2 return final_result; } 32570: e5 96 adiw r28, 0x35 ; 53 32572: 8f ad ldd r24, Y+63 ; 0x3f 32574: e5 97 sbiw r28, 0x35 ; 53 32576: c2 53 subi r28, 0x32 ; 50 32578: df 4f sbci r29, 0xFF ; 255 3257a: 0f b6 in r0, 0x3f ; 63 3257c: f8 94 cli 3257e: de bf out 0x3e, r29 ; 62 32580: 0f be out 0x3f, r0 ; 63 32582: cd bf out 0x3d, r28 ; 61 32584: df 91 pop r29 32586: cf 91 pop r28 32588: 1f 91 pop r17 3258a: 0f 91 pop r16 3258c: ff 90 pop r15 3258e: ef 90 pop r14 32590: df 90 pop r13 32592: cf 90 pop r12 32594: bf 90 pop r11 32596: af 90 pop r10 32598: 9f 90 pop r9 3259a: 8f 90 pop r8 3259c: 7f 90 pop r7 3259e: 6f 90 pop r6 325a0: 5f 90 pop r5 325a2: 4f 90 pop r4 325a4: 3f 90 pop r3 325a6: 2f 90 pop r2 325a8: 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) { 325aa: e1 e0 ldi r30, 0x01 ; 1 325ac: e1 96 adiw r28, 0x31 ; 49 325ae: ef af std Y+63, r30 ; 0x3f 325b0: e1 97 sbiw r28, 0x31 ; 49 325b2: 0f cc rjmp .-2018 ; 0x31dd2 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) 325b4: fe 01 movw r30, r28 325b6: 31 96 adiw r30, 0x01 ; 1 325b8: 7f 01 movw r14, r30 325ba: 10 e0 ldi r17, 0x00 ; 0 325bc: 00 e0 ldi r16, 0x00 ; 0 325be: 24 e8 ldi r18, 0x84 ; 132 325c0: 33 e0 ldi r19, 0x03 ; 3 325c2: a6 01 movw r20, r12 325c4: 69 2d mov r22, r9 325c6: 78 2d mov r23, r8 325c8: 8b 2d mov r24, r11 325ca: 9a 2d mov r25, r10 325cc: 0f 94 72 6f call 0x2dee4 ; 0x2dee4 ad += 0; if (!ret && (ad < 1440)) 325d0: 88 23 and r24, r24 325d2: 09 f4 brne .+2 ; 0x325d6 325d4: 06 cd rjmp .-1524 ; 0x31fe2 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; 325d6: 89 81 ldd r24, Y+1 ; 0x01 325d8: 9a 81 ldd r25, Y+2 ; 0x02 325da: 23 cd rjmp .-1466 ; 0x32022 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)) 325dc: 89 81 ldd r24, Y+1 ; 0x01 325de: 9a 81 ldd r25, Y+2 ; 0x02 325e0: 80 34 cpi r24, 0x40 ; 64 325e2: 9b 40 sbci r25, 0x0B ; 11 325e4: b8 f4 brcc .+46 ; 0x32614 if ((ret = xyzcal_spiral2(cx, cy, z0 - 3*dz, dz, -radius, 180, delay_us, check_pinda, &ad)) != 0) 325e6: ce 01 movw r24, r28 325e8: 01 96 adiw r24, 0x01 ; 1 325ea: 7c 01 movw r14, r24 325ec: 04 eb ldi r16, 0xB4 ; 180 325ee: 10 e0 ldi r17, 0x00 ; 0 325f0: 2c e7 ldi r18, 0x7C ; 124 325f2: 3c ef ldi r19, 0xFC ; 252 325f4: a6 01 movw r20, r12 325f6: 4c 52 subi r20, 0x2C ; 44 325f8: 51 40 sbci r21, 0x01 ; 1 325fa: 69 2d mov r22, r9 325fc: 78 2d mov r23, r8 325fe: 8b 2d mov r24, r11 32600: 9a 2d mov r25, r10 32602: 0f 94 72 6f call 0x2dee4 ; 0x2dee4 32606: 88 23 and r24, r24 32608: 29 f0 breq .+10 ; 0x32614 ad += 2160; 3260a: 89 81 ldd r24, Y+1 ; 0x01 3260c: 9a 81 ldd r25, Y+2 ; 0x02 3260e: 80 59 subi r24, 0x90 ; 144 32610: 97 4f sbci r25, 0xF7 ; 247 32612: 07 cd rjmp .-1522 ; 0x32022 /// 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; 32614: 90 e9 ldi r25, 0x90 ; 144 32616: c9 1a sub r12, r25 32618: 91 e0 ldi r25, 0x01 ; 1 3261a: d9 0a sbc r13, r25 3261c: ba cc rjmp .-1676 ; 0x31f92 } //@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]); 3261e: 00 91 ba 06 lds r16, 0x06BA ; 0x8006ba 32622: 10 91 bb 06 lds r17, 0x06BB ; 0x8006bb 32626: 20 91 bc 06 lds r18, 0x06BC ; 0x8006bc 3262a: 30 91 bd 06 lds r19, 0x06BD ; 0x8006bd 3262e: 40 91 b6 06 lds r20, 0x06B6 ; 0x8006b6 32632: 50 91 b7 06 lds r21, 0x06B7 ; 0x8006b7 32636: 60 91 b8 06 lds r22, 0x06B8 ; 0x8006b8 3263a: 70 91 b9 06 lds r23, 0x06B9 ; 0x8006b9 3263e: 80 91 b2 06 lds r24, 0x06B2 ; 0x8006b2 32642: 90 91 b3 06 lds r25, 0x06B3 ; 0x8006b3 32646: a0 91 b4 06 lds r26, 0x06B4 ; 0x8006b4 3264a: b0 91 b5 06 lds r27, 0x06B5 ; 0x8006b5 3264e: 3f 93 push r19 32650: 2f 93 push r18 32652: 1f 93 push r17 32654: 0f 93 push r16 32656: 7f 93 push r23 32658: 6f 93 push r22 3265a: 5f 93 push r21 3265c: 4f 93 push r20 3265e: bf 93 push r27 32660: af 93 push r26 32662: 9f 93 push r25 32664: 8f 93 push r24 32666: 82 ef ldi r24, 0xF2 ; 242 32668: 93 ea ldi r25, 0xA3 ; 163 3266a: 9f 93 push r25 3266c: 8f 93 push r24 3266e: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 32672: 0f b6 in r0, 0x3f ; 63 32674: f8 94 cli 32676: de bf out 0x3e, r29 ; 62 32678: 0f be out 0x3f, r0 ; 63 3267a: 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; 3267c: 1f ef ldi r17, 0xFF ; 255 sm4_calc_delay_cb = xyzcal_calc_delay; } void xyzcal_measure_leave(void) { DBG(_n("xyzcal_measure_leave\n")); 3267e: 82 ed ldi r24, 0xD2 ; 210 32680: 94 ea ldi r25, 0xA4 ; 164 32682: 9f 93 push r25 32684: 8f 93 push r24 32686: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 lcd_set_cursor(4,3); 3268a: 63 e0 ldi r22, 0x03 ; 3 3268c: 84 e0 ldi r24, 0x04 ; 4 3268e: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_space(16); 32692: 80 e1 ldi r24, 0x10 ; 16 32694: 0e 94 6e 6e call 0xdcdc ; 0xdcdc // resync planner position from counters (changed by xyzcal_update_pos) planner_reset_position(); 32698: 0f 94 70 c0 call 0x380e0 ; 0x380e0 : "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" ); 3269c: 88 e1 ldi r24, 0x18 ; 24 3269e: 98 e2 ldi r25, 0x28 ; 40 326a0: 0f b6 in r0, 0x3f ; 63 326a2: f8 94 cli 326a4: a8 95 wdr 326a6: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 326aa: 0f be out 0x3f, r0 ; 63 326ac: 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); 326b0: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 326b4: 80 64 ori r24, 0x40 ; 64 326b6: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> #endif //EMERGENCY_HANDLERS #endif //WATCHDOG ENABLE_STEPPER_DRIVER_INTERRUPT(); 326ba: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 326be: 82 60 ori r24, 0x02 ; 2 326c0: 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){ 326c4: 0f 90 pop r0 326c6: 0f 90 pop r0 326c8: 1d 3f cpi r17, 0xFD ; 253 326ca: 09 f4 brne .+2 ; 0x326ce 326cc: ee c1 rjmp .+988 ; 0x32aaa 326ce: 1f 3f cpi r17, 0xFF ; 255 326d0: 11 f4 brne .+4 ; 0x326d6 326d2: 0d 94 a0 9e jmp 0x33d40 ; 0x33d40 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); 326d6: 20 e0 ldi r18, 0x00 ; 0 326d8: 30 e0 ldi r19, 0x00 ; 0 326da: a9 01 movw r20, r18 326dc: a0 96 adiw r28, 0x20 ; 32 326de: ee ad ldd r30, Y+62 ; 0x3e 326e0: ff ad ldd r31, Y+63 ; 0x3f 326e2: a0 97 sbiw r28, 0x20 ; 32 326e4: 61 81 ldd r22, Z+1 ; 0x01 326e6: 72 81 ldd r23, Z+2 ; 0x02 326e8: 83 81 ldd r24, Z+3 ; 0x03 326ea: 94 81 ldd r25, Z+4 ; 0x04 326ec: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> pt[0] += (current_position[X_AXIS]/(iteration + 1)); //count average 326f0: 20 91 91 06 lds r18, 0x0691 ; 0x800691 326f4: 30 91 92 06 lds r19, 0x0692 ; 0x800692 326f8: 40 91 93 06 lds r20, 0x0693 ; 0x800693 326fc: 50 91 94 06 lds r21, 0x0694 ; 0x800694 32700: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32704: a0 96 adiw r28, 0x20 ; 32 32706: ae ad ldd r26, Y+62 ; 0x3e 32708: bf ad ldd r27, Y+63 ; 0x3f 3270a: a0 97 sbiw r28, 0x20 ; 32 3270c: 11 96 adiw r26, 0x01 ; 1 3270e: 6d 93 st X+, r22 32710: 7d 93 st X+, r23 32712: 8d 93 st X+, r24 32714: 9c 93 st X, r25 32716: 14 97 sbiw r26, 0x04 ; 4 pt[1] = (pt[1] * iteration) / (iteration + 1); pt[1] += (current_position[Y_AXIS] / (iteration + 1)); 32718: c0 90 95 06 lds r12, 0x0695 ; 0x800695 3271c: d0 90 96 06 lds r13, 0x0696 ; 0x800696 32720: e0 90 97 06 lds r14, 0x0697 ; 0x800697 32724: f0 90 98 06 lds r15, 0x0698 ; 0x800698 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); 32728: 20 e0 ldi r18, 0x00 ; 0 3272a: 30 e0 ldi r19, 0x00 ; 0 3272c: a9 01 movw r20, r18 3272e: 15 96 adiw r26, 0x05 ; 5 32730: 6d 91 ld r22, X+ 32732: 7d 91 ld r23, X+ 32734: 8d 91 ld r24, X+ 32736: 9c 91 ld r25, X 32738: 18 97 sbiw r26, 0x08 ; 8 3273a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> pt[1] += (current_position[Y_AXIS] / (iteration + 1)); 3273e: a7 01 movw r20, r14 32740: 96 01 movw r18, r12 32742: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32746: a0 96 adiw r28, 0x20 ; 32 32748: ee ad ldd r30, Y+62 ; 0x3e 3274a: ff ad ldd r31, Y+63 ; 0x3f 3274c: a0 97 sbiw r28, 0x20 ; 32 3274e: 65 83 std Z+5, r22 ; 0x05 32750: 76 83 std Z+6, r23 ; 0x06 32752: 87 83 std Z+7, r24 ; 0x07 32754: 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) 32756: 20 e0 ldi r18, 0x00 ; 0 32758: 30 e0 ldi r19, 0x00 ; 0 3275a: 40 e8 ldi r20, 0x80 ; 128 3275c: 50 ec ldi r21, 0xC0 ; 192 3275e: c7 01 movw r24, r14 32760: b6 01 movw r22, r12 32762: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 32766: 87 ff sbrs r24, 7 32768: 0c c0 rjmp .+24 ; 0x32782 current_position[Y_AXIS] = Y_MIN_POS; 3276a: 80 e0 ldi r24, 0x00 ; 0 3276c: 90 e0 ldi r25, 0x00 ; 0 3276e: a0 e8 ldi r26, 0x80 ; 128 32770: b0 ec ldi r27, 0xC0 ; 192 32772: 80 93 95 06 sts 0x0695, r24 ; 0x800695 32776: 90 93 96 06 sts 0x0696, r25 ; 0x800696 3277a: a0 93 97 06 sts 0x0697, r26 ; 0x800697 3277e: b0 93 98 06 sts 0x0698, r27 ; 0x800698 // 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; 32782: 20 e0 ldi r18, 0x00 ; 0 32784: 30 e0 ldi r19, 0x00 ; 0 32786: 40 e4 ldi r20, 0x40 ; 64 32788: 50 e4 ldi r21, 0x40 ; 64 3278a: 60 91 99 06 lds r22, 0x0699 ; 0x800699 3278e: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 32792: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 32796: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 3279a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3279e: 60 93 99 06 sts 0x0699, r22 ; 0x800699 327a2: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 327a6: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 327aa: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c 327ae: e0 96 adiw r28, 0x30 ; 48 327b0: 2e ad ldd r18, Y+62 ; 0x3e 327b2: 3f ad ldd r19, Y+63 ; 0x3f 327b4: e0 97 sbiw r28, 0x30 ; 48 327b6: 28 5f subi r18, 0xF8 ; 248 327b8: 3f 4f sbci r19, 0xFF ; 255 327ba: e0 96 adiw r28, 0x30 ; 48 327bc: 3f af std Y+63, r19 ; 0x3f 327be: 2e af std Y+62, r18 ; 0x3e 327c0: e0 97 sbiw r28, 0x30 ; 48 327c2: a0 96 adiw r28, 0x20 ; 32 327c4: 4e ad ldd r20, Y+62 ; 0x3e 327c6: 5f ad ldd r21, Y+63 ; 0x3f 327c8: a0 97 sbiw r28, 0x20 ; 32 327ca: 48 5f subi r20, 0xF8 ; 248 327cc: 5f 4f sbci r21, 0xFF ; 255 327ce: a0 96 adiw r28, 0x20 ; 32 327d0: 5f af std Y+63, r21 ; 0x3f 327d2: 4e af std Y+62, r20 ; 0x3e 327d4: 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) { 327d6: 54 e0 ldi r21, 0x04 ; 4 327d8: 25 16 cp r2, r21 327da: 31 04 cpc r3, r1 327dc: 09 f0 breq .+2 ; 0x327e0 327de: 16 cb rjmp .-2516 ; 0x31e0c go_to_current(homing_feedrate[X_AXIS] / 60.f); delay_keep_alive(3000); } #endif // SUPPORT_VERBOSITY } if (!retry) 327e0: a7 96 adiw r28, 0x27 ; 39 327e2: 6f ad ldd r22, Y+63 ; 0x3f 327e4: a7 97 sbiw r28, 0x27 ; 39 327e6: 66 23 and r22, r22 327e8: 31 f0 breq .+12 ; 0x327f6 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) { 327ea: e1 96 adiw r28, 0x31 ; 49 327ec: 8f ad ldd r24, Y+63 ; 0x3f 327ee: e1 97 sbiw r28, 0x31 ; 49 327f0: 81 30 cpi r24, 0x01 ; 1 327f2: 09 f0 breq .+2 ; 0x327f6 327f4: da ce rjmp .-588 ; 0x325aa #endif // SUPPORT_VERBOSITY } if (!retry) break; } DBG(_n("All 4 calibration points found.\n")); 327f6: 85 ee ldi r24, 0xE5 ; 229 327f8: 9f e6 ldi r25, 0x6F ; 111 327fa: 9f 93 push r25 327fc: 8f 93 push r24 327fe: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity 32802: 90 e0 ldi r25, 0x00 ; 0 32804: 80 e0 ldi r24, 0x00 ; 0 32806: 0e 94 84 8c call 0x11908 ; 0x11908 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) { 3280a: 0f 90 pop r0 3280c: 0f 90 pop r0 3280e: 20 e0 ldi r18, 0x00 ; 0 32810: 30 e0 ldi r19, 0x00 ; 0 32812: 40 e9 ldi r20, 0x90 ; 144 32814: 50 ec ldi r21, 0xC0 ; 192 32816: 60 91 c6 13 lds r22, 0x13C6 ; 0x8013c6 3281a: 70 91 c7 13 lds r23, 0x13C7 ; 0x8013c7 3281e: 80 91 c8 13 lds r24, 0x13C8 ; 0x8013c8 32822: 90 91 c9 13 lds r25, 0x13C9 ; 0x8013c9 32826: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 3282a: 87 ff sbrs r24, 7 3282c: 45 c1 rjmp .+650 ; 0x32ab8 too_far_mask |= 1 << 1; //front center point is out of reach SERIAL_ECHOLNPGM(""); 3282e: 8e e1 ldi r24, 0x1E ; 30 32830: 95 ea ldi r25, 0xA5 ; 165 32832: 0e 94 13 79 call 0xf226 ; 0xf226 SERIAL_ECHOPGM("WARNING: Front point not reachable. Y coordinate:"); 32836: 8c ee ldi r24, 0xEC ; 236 32838: 94 ea ldi r25, 0xA4 ; 164 3283a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 else printNumber(n, base); } void MarlinSerial::print(double n, int digits) { printFloat(n, digits); 3283e: 60 91 c6 13 lds r22, 0x13C6 ; 0x8013c6 32842: 70 91 c7 13 lds r23, 0x13C7 ; 0x8013c7 32846: 80 91 c8 13 lds r24, 0x13C8 ; 0x8013c8 3284a: 90 91 c9 13 lds r25, 0x13C9 ; 0x8013c9 3284e: 42 e0 ldi r20, 0x02 ; 2 32850: 0f 94 7b d5 call 0x3aaf6 ; 0x3aaf6 MYSERIAL.print(pts[1]); SERIAL_ECHOPGM(" < "); 32854: 88 ee ldi r24, 0xE8 ; 232 32856: 94 ea ldi r25, 0xA4 ; 164 32858: 0e 94 e8 76 call 0xedd0 ; 0xedd0 MYSERIAL.println(Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); 3285c: 60 e0 ldi r22, 0x00 ; 0 3285e: 70 e0 ldi r23, 0x00 ; 0 32860: 80 e9 ldi r24, 0x90 ; 144 32862: 90 ec ldi r25, 0xC0 ; 192 32864: 0f 94 ab 75 call 0x2eb56 ; 0x2eb56 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 32868: 92 e0 ldi r25, 0x02 ; 2 3286a: af 96 adiw r28, 0x2f ; 47 3286c: 9f af std Y+63, r25 ; 0x3f 3286e: 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; 32870: 10 92 f2 13 sts 0x13F2, r1 ; 0x8013f2 32874: 10 92 f3 13 sts 0x13F3, r1 ; 0x8013f3 32878: 10 92 f4 13 sts 0x13F4, r1 ; 0x8013f4 3287c: 10 92 f5 13 sts 0x13F5, r1 ; 0x8013f5 cntr[1] = 0.f; 32880: 10 92 f6 13 sts 0x13F6, r1 ; 0x8013f6 32884: 10 92 f7 13 sts 0x13F7, r1 ; 0x8013f7 32888: 10 92 f8 13 sts 0x13F8, r1 ; 0x8013f8 3288c: 10 92 f9 13 sts 0x13F9, r1 ; 0x8013f9 32890: a4 e6 ldi r26, 0x64 ; 100 32892: e6 96 adiw r28, 0x36 ; 54 32894: af af std Y+63, r26 ; 0x3f 32896: 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; 32898: a2 96 adiw r28, 0x22 ; 34 3289a: 1c ae std Y+60, r1 ; 0x3c 3289c: 1d ae std Y+61, r1 ; 0x3d 3289e: 1e ae std Y+62, r1 ; 0x3e 328a0: 1f ae std Y+63, r1 ; 0x3f 328a2: 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; 328a4: a6 96 adiw r28, 0x26 ; 38 328a6: 1c ae std Y+60, r1 ; 0x3c 328a8: 1d ae std Y+61, r1 ; 0x3d 328aa: 1e ae std Y+62, r1 ; 0x3e 328ac: 1f ae std Y+63, r1 ; 0x3f 328ae: 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 }; 328b0: fe 01 movw r30, r28 328b2: 31 96 adiw r30, 0x01 ; 1 328b4: 68 96 adiw r28, 0x18 ; 24 328b6: ff af std Y+63, r31 ; 0x3f 328b8: ee af std Y+62, r30 ; 0x3e 328ba: 68 97 sbiw r28, 0x18 ; 24 float b[4] = { 0.f }; 328bc: 9e 01 movw r18, r28 328be: 2f 5b subi r18, 0xBF ; 191 328c0: 3f 4f sbci r19, 0xFF ; 255 328c2: 6a 96 adiw r28, 0x1a ; 26 328c4: 3f af std Y+63, r19 ; 0x3f 328c6: 2e af std Y+62, r18 ; 0x3e 328c8: 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; 328ca: a6 96 adiw r28, 0x26 ; 38 328cc: 6c ad ldd r22, Y+60 ; 0x3c 328ce: 7d ad ldd r23, Y+61 ; 0x3d 328d0: 8e ad ldd r24, Y+62 ; 0x3e 328d2: 9f ad ldd r25, Y+63 ; 0x3f 328d4: a6 97 sbiw r28, 0x26 ; 38 328d6: 0f 94 32 de call 0x3bc64 ; 0x3bc64 328da: 6e 96 adiw r28, 0x1e ; 30 328dc: 6c af std Y+60, r22 ; 0x3c 328de: 7d af std Y+61, r23 ; 0x3d 328e0: 8e af std Y+62, r24 ; 0x3e 328e2: 9f af std Y+63, r25 ; 0x3f 328e4: 6e 97 sbiw r28, 0x1e ; 30 float s1 = sin(a1) * MACHINE_AXIS_SCALE_X; 328e6: a6 96 adiw r28, 0x26 ; 38 328e8: 6c ad ldd r22, Y+60 ; 0x3c 328ea: 7d ad ldd r23, Y+61 ; 0x3d 328ec: 8e ad ldd r24, Y+62 ; 0x3e 328ee: 9f ad ldd r25, Y+63 ; 0x3f 328f0: a6 97 sbiw r28, 0x26 ; 38 328f2: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 328f6: cb 57 subi r28, 0x7B ; 123 328f8: df 4f sbci r29, 0xFF ; 255 328fa: 68 83 st Y, r22 328fc: 79 83 std Y+1, r23 ; 0x01 328fe: 8a 83 std Y+2, r24 ; 0x02 32900: 9b 83 std Y+3, r25 ; 0x03 32902: c5 58 subi r28, 0x85 ; 133 32904: d0 40 sbci r29, 0x00 ; 0 float c2 = cos(a2) * MACHINE_AXIS_SCALE_Y; 32906: a2 96 adiw r28, 0x22 ; 34 32908: 6c ad ldd r22, Y+60 ; 0x3c 3290a: 7d ad ldd r23, Y+61 ; 0x3d 3290c: 8e ad ldd r24, Y+62 ; 0x3e 3290e: 9f ad ldd r25, Y+63 ; 0x3f 32910: a2 97 sbiw r28, 0x22 ; 34 32912: 0f 94 32 de call 0x3bc64 ; 0x3bc64 32916: c7 57 subi r28, 0x77 ; 119 32918: df 4f sbci r29, 0xFF ; 255 3291a: 68 83 st Y, r22 3291c: 79 83 std Y+1, r23 ; 0x01 3291e: 8a 83 std Y+2, r24 ; 0x02 32920: 9b 83 std Y+3, r25 ; 0x03 32922: c9 58 subi r28, 0x89 ; 137 32924: d0 40 sbci r29, 0x00 ; 0 float s2 = sin(a2) * MACHINE_AXIS_SCALE_Y; 32926: a2 96 adiw r28, 0x22 ; 34 32928: 6c ad ldd r22, Y+60 ; 0x3c 3292a: 7d ad ldd r23, Y+61 ; 0x3d 3292c: 8e ad ldd r24, Y+62 ; 0x3e 3292e: 9f ad ldd r25, Y+63 ; 0x3f 32930: a2 97 sbiw r28, 0x22 ; 34 32932: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 32936: cb 56 subi r28, 0x6B ; 107 32938: df 4f sbci r29, 0xFF ; 255 3293a: 68 83 st Y, r22 3293c: 79 83 std Y+1, r23 ; 0x01 3293e: 8a 83 std Y+2, r24 ; 0x02 32940: 9b 83 std Y+3, r25 ; 0x03 32942: c5 59 subi r28, 0x95 ; 149 32944: d0 40 sbci r29, 0x00 ; 0 // Prepare the Normal equation for the Gauss-Newton method. float A[4][4] = { 0.f }; 32946: 68 96 adiw r28, 0x18 ; 24 32948: ae ad ldd r26, Y+62 ; 0x3e 3294a: bf ad ldd r27, Y+63 ; 0x3f 3294c: 68 97 sbiw r28, 0x18 ; 24 3294e: e0 e4 ldi r30, 0x40 ; 64 32950: 1d 92 st X+, r1 32952: ea 95 dec r30 32954: e9 f7 brne .-6 ; 0x32950 float b[4] = { 0.f }; 32956: 80 e1 ldi r24, 0x10 ; 16 32958: 6a 96 adiw r28, 0x1a ; 26 3295a: ae ad ldd r26, Y+62 ; 0x3e 3295c: bf ad ldd r27, Y+63 ; 0x3f 3295e: 6a 97 sbiw r28, 0x1a ; 26 32960: 1d 92 st X+, r1 32962: 8a 95 dec r24 32964: e9 f7 brne .-6 ; 0x32960 float acc; delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity 32966: 90 e0 ldi r25, 0x00 ; 0 32968: 80 e0 ldi r24, 0x00 ; 0 3296a: 0e 94 84 8c call 0x11908 ; 0x11908 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); 3296e: 20 91 f2 13 lds r18, 0x13F2 ; 0x8013f2 32972: 30 91 f3 13 lds r19, 0x13F3 ; 0x8013f3 32976: 40 91 f4 13 lds r20, 0x13F4 ; 0x8013f4 3297a: 50 91 f5 13 lds r21, 0x13F5 ; 0x8013f5 3297e: c5 55 subi r28, 0x55 ; 85 32980: df 4f sbci r29, 0xFF ; 255 32982: 28 83 st Y, r18 32984: 39 83 std Y+1, r19 ; 0x01 32986: 4a 83 std Y+2, r20 ; 0x02 32988: 5b 83 std Y+3, r21 ; 0x03 3298a: cb 5a subi r28, 0xAB ; 171 3298c: 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); 3298e: 80 91 f6 13 lds r24, 0x13F6 ; 0x8013f6 32992: 90 91 f7 13 lds r25, 0x13F7 ; 0x8013f7 32996: a0 91 f8 13 lds r26, 0x13F8 ; 0x8013f8 3299a: b0 91 f9 13 lds r27, 0x13F9 ; 0x8013f9 3299e: c1 55 subi r28, 0x51 ; 81 329a0: df 4f sbci r29, 0xFF ; 255 329a2: 88 83 st Y, r24 329a4: 99 83 std Y+1, r25 ; 0x01 329a6: aa 83 std Y+2, r26 ; 0x02 329a8: bb 83 std Y+3, r27 ; 0x03 329aa: cf 5a subi r28, 0xAF ; 175 329ac: d0 40 sbci r29, 0x00 ; 0 329ae: de 01 movw r26, r28 329b0: af 5b subi r26, 0xBF ; 191 329b2: bf 4f sbci r27, 0xFF ; 255 329b4: c7 56 subi r28, 0x67 ; 103 329b6: df 4f sbci r29, 0xFF ; 255 329b8: b9 83 std Y+1, r27 ; 0x01 329ba: a8 83 st Y, r26 329bc: c9 59 subi r28, 0x99 ; 153 329be: d0 40 sbci r29, 0x00 ; 0 329c0: fe 01 movw r30, r28 329c2: 31 96 adiw r30, 0x01 ; 1 329c4: ac 96 adiw r28, 0x2c ; 44 329c6: ff af std Y+63, r31 ; 0x3f 329c8: ee af std Y+62, r30 ; 0x3e 329ca: 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) { 329cc: 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])); 329ce: cb 56 subi r28, 0x6B ; 107 329d0: df 4f sbci r29, 0xFF ; 255 329d2: 28 81 ld r18, Y 329d4: 39 81 ldd r19, Y+1 ; 0x01 329d6: 4a 81 ldd r20, Y+2 ; 0x02 329d8: 5b 81 ldd r21, Y+3 ; 0x03 329da: c5 59 subi r28, 0x95 ; 149 329dc: d0 40 sbci r29, 0x00 ; 0 329de: 50 58 subi r21, 0x80 ; 128 329e0: ed 96 adiw r28, 0x3d ; 61 329e2: 2c af std Y+60, r18 ; 0x3c 329e4: 3d af std Y+61, r19 ; 0x3d 329e6: 4e af std Y+62, r20 ; 0x3e 329e8: 5f af std Y+63, r21 ; 0x3f 329ea: 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])); 329ec: c7 57 subi r28, 0x77 ; 119 329ee: df 4f sbci r29, 0xFF ; 255 329f0: 88 81 ld r24, Y 329f2: 99 81 ldd r25, Y+1 ; 0x01 329f4: aa 81 ldd r26, Y+2 ; 0x02 329f6: bb 81 ldd r27, Y+3 ; 0x03 329f8: c9 58 subi r28, 0x89 ; 137 329fa: d0 40 sbci r29, 0x00 ; 0 329fc: b0 58 subi r27, 0x80 ; 128 329fe: c3 58 subi r28, 0x83 ; 131 32a00: df 4f sbci r29, 0xFF ; 255 32a02: 88 83 st Y, r24 32a04: 99 83 std Y+1, r25 ; 0x01 32a06: aa 83 std Y+2, r26 ; 0x02 32a08: bb 83 std Y+3, r27 ; 0x03 32a0a: cd 57 subi r28, 0x7D ; 125 32a0c: 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]) : 32a0e: cb 57 subi r28, 0x7B ; 123 32a10: df 4f sbci r29, 0xFF ; 255 32a12: 28 81 ld r18, Y 32a14: 39 81 ldd r19, Y+1 ; 0x01 32a16: 4a 81 ldd r20, Y+2 ; 0x02 32a18: 5b 81 ldd r21, Y+3 ; 0x03 32a1a: c5 58 subi r28, 0x85 ; 133 32a1c: d0 40 sbci r29, 0x00 ; 0 32a1e: 50 58 subi r21, 0x80 ; 128 32a20: cf 57 subi r28, 0x7F ; 127 32a22: df 4f sbci r29, 0xFF ; 255 32a24: 28 83 st Y, r18 32a26: 39 83 std Y+1, r19 ; 0x01 32a28: 4a 83 std Y+2, r20 ; 0x02 32a2a: 5b 83 std Y+3, r21 ; 0x03 32a2c: c1 58 subi r28, 0x81 ; 129 32a2e: 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) { 32a30: ac 96 adiw r28, 0x2c ; 44 32a32: 2e ac ldd r2, Y+62 ; 0x3e 32a34: 3f ac ldd r3, Y+63 ; 0x3f 32a36: ac 97 sbiw r28, 0x2c ; 44 for (uint8_t c = 0; c < 4; ++c) { 32a38: 10 e0 ldi r17, 0x00 ; 0 32a3a: 61 ec ldi r22, 0xC1 ; 193 32a3c: 46 2e mov r4, r22 32a3e: 63 e1 ldi r22, 0x13 ; 19 32a40: 56 2e mov r5, r22 32a42: 74 e0 ldi r23, 0x04 ; 4 32a44: 77 2e mov r7, r23 acc = 0; 32a46: c1 2c mov r12, r1 32a48: d1 2c mov r13, r1 32a4a: 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) { 32a4c: 01 30 cpi r16, 0x01 ; 1 32a4e: 11 f4 brne .+4 ; 0x32a54 32a50: 0d 94 54 9f jmp 0x33ea8 ; 0x33ea8 32a54: 11 30 cpi r17, 0x01 ; 1 32a56: 11 f4 brne .+4 ; 0x32a5c 32a58: 0d 94 06 9f jmp 0x33e0c ; 0x33e0c float a = (r == 0) ? 1.f : 32a5c: 00 23 and r16, r16 32a5e: 11 f4 brne .+4 ; 0x32a64 32a60: 0d 94 46 9f jmp 0x33e8c ; 0x33e8c ((r == 2) ? (-s1 * measured_pts[2 * i]) : 32a64: 02 30 cpi r16, 0x02 ; 2 32a66: 61 f5 brne .+88 ; 0x32ac0 32a68: d2 01 movw r26, r4 32a6a: 11 96 adiw r26, 0x01 ; 1 32a6c: 2d 91 ld r18, X+ 32a6e: 3d 91 ld r19, X+ 32a70: 4d 91 ld r20, X+ 32a72: 5c 91 ld r21, X 32a74: 14 97 sbiw r26, 0x04 ; 4 32a76: cf 57 subi r28, 0x7F ; 127 32a78: df 4f sbci r29, 0xFF ; 255 32a7a: 68 81 ld r22, Y 32a7c: 79 81 ldd r23, Y+1 ; 0x01 32a7e: 8a 81 ldd r24, Y+2 ; 0x02 32a80: 9b 81 ldd r25, Y+3 ; 0x03 32a82: c1 58 subi r28, 0x81 ; 129 32a84: d0 40 sbci r29, 0x00 ; 0 32a86: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32a8a: 4b 01 movw r8, r22 32a8c: 5c 01 movw r10, r24 (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : 32a8e: 11 11 cpse r17, r1 32a90: 25 c0 rjmp .+74 ; 0x32adc 32a92: 60 e0 ldi r22, 0x00 ; 0 32a94: 70 e0 ldi r23, 0x00 ; 0 32a96: 80 e8 ldi r24, 0x80 ; 128 32a98: 9f e3 ldi r25, 0x3F ; 63 32a9a: 35 c0 rjmp .+106 ; 0x32b06 int16_t maxs = 0; for (int16_t i = 0; i < 32*32;++i){ if (matrix32[i] == 0) { ++mins; } else if (matrix32[i] == 0xFF){ 32a9c: 2f 3f cpi r18, 0xFF ; 255 32a9e: 09 f0 breq .+2 ; 0x32aa2 32aa0: 92 cb rjmp .-2268 ; 0x321c6 ++maxs; 32aa2: 01 96 adiw r24, 0x01 ; 1 32aa4: 90 cb rjmp .-2272 ; 0x321c6 /// 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; 32aa6: 1f ef ldi r17, 0xFF ; 255 32aa8: 26 cd rjmp .-1460 ; 0x324f6 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; 32aaa: e5 96 adiw r28, 0x35 ; 53 32aac: bf ad ldd r27, Y+63 ; 0x3f 32aae: e5 97 sbiw r28, 0x35 ; 53 32ab0: a7 96 adiw r28, 0x27 ; 39 32ab2: bf af std Y+63, r27 ; 0x3f 32ab4: a7 97 sbiw r28, 0x27 ; 39 32ab6: 0f ce rjmp .-994 ; 0x326d6 // 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; 32ab8: af 96 adiw r28, 0x2f ; 47 32aba: 1f ae std Y+63, r1 ; 0x3f 32abc: af 97 sbiw r28, 0x2f ; 47 32abe: d8 ce rjmp .-592 ; 0x32870 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]) : 32ac0: f2 01 movw r30, r4 32ac2: 25 81 ldd r18, Z+5 ; 0x05 32ac4: 36 81 ldd r19, Z+6 ; 0x06 32ac6: 47 81 ldd r20, Z+7 ; 0x07 32ac8: 50 85 ldd r21, Z+8 ; 0x08 32aca: c3 58 subi r28, 0x83 ; 131 32acc: df 4f sbci r29, 0xFF ; 255 32ace: 68 81 ld r22, Y 32ad0: 79 81 ldd r23, Y+1 ; 0x01 32ad2: 8a 81 ldd r24, Y+2 ; 0x02 32ad4: 9b 81 ldd r25, Y+3 ; 0x03 32ad6: cd 57 subi r28, 0x7D ; 125 32ad8: d0 40 sbci r29, 0x00 ; 0 32ada: d5 cf rjmp .-86 ; 0x32a86 (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : ((c == 2) ? (-s1 * measured_pts[2 * i]) : 32adc: 12 30 cpi r17, 0x02 ; 2 32ade: 11 f0 breq .+4 ; 0x32ae4 32ae0: 0d 94 47 9e jmp 0x33c8e ; 0x33c8e 32ae4: d2 01 movw r26, r4 32ae6: 11 96 adiw r26, 0x01 ; 1 32ae8: 2d 91 ld r18, X+ 32aea: 3d 91 ld r19, X+ 32aec: 4d 91 ld r20, X+ 32aee: 5c 91 ld r21, X 32af0: 14 97 sbiw r26, 0x04 ; 4 32af2: cf 57 subi r28, 0x7F ; 127 32af4: df 4f sbci r29, 0xFF ; 255 32af6: 68 81 ld r22, Y 32af8: 79 81 ldd r23, Y+1 ; 0x01 32afa: 8a 81 ldd r24, Y+2 ; 0x02 32afc: 9b 81 ldd r25, Y+3 ; 0x03 32afe: c1 58 subi r28, 0x81 ; 129 32b00: d0 40 sbci r29, 0x00 ; 0 32b02: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> (-c2 * measured_pts[2 * i + 1])); float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += a * b * w; 32b06: 9b 01 movw r18, r22 32b08: ac 01 movw r20, r24 32b0a: c5 01 movw r24, r10 32b0c: b4 01 movw r22, r8 32b0e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32b12: 9b 01 movw r18, r22 32b14: ac 01 movw r20, r24 32b16: c7 01 movw r24, r14 32b18: b6 01 movw r22, r12 32b1a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32b1e: 6b 01 movw r12, r22 32b20: 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) { 32b22: 01 11 cpse r16, r1 32b24: 0d 94 5e 9f jmp 0x33ebc ; 0x33ebc 32b28: 7a 94 dec r7 32b2a: f8 e0 ldi r31, 0x08 ; 8 32b2c: 4f 0e add r4, r31 32b2e: 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) { 32b30: 71 10 cpse r7, r1 32b32: 8c cf rjmp .-232 ; 0x32a4c (-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; 32b34: d1 01 movw r26, r2 32b36: cd 92 st X+, r12 32b38: dd 92 st X+, r13 32b3a: ed 92 st X+, r14 32b3c: fd 92 st X+, r15 32b3e: 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) { 32b40: 1f 5f subi r17, 0xFF ; 255 32b42: 14 30 cpi r17, 0x04 ; 4 32b44: 09 f0 breq .+2 ; 0x32b48 32b46: 79 cf rjmp .-270 ; 0x32a3a 32b48: 3f e1 ldi r19, 0x1F ; 31 32b4a: 23 2e mov r2, r19 32b4c: 35 ea ldi r19, 0xA5 ; 165 32b4e: 33 2e mov r3, r19 32b50: e1 ec ldi r30, 0xC1 ; 193 32b52: f3 e1 ldi r31, 0x13 ; 19 32b54: a8 96 adiw r28, 0x28 ; 40 32b56: ff af std Y+63, r31 ; 0x3f 32b58: ee af std Y+62, r30 ; 0x3e 32b5a: a8 97 sbiw r28, 0x28 ; 40 } } A[r][c] = acc; } // J^T times f(x) acc = 0.f; 32b5c: c3 57 subi r28, 0x73 ; 115 32b5e: df 4f sbci r29, 0xFF ; 255 32b60: 18 82 st Y, r1 32b62: cd 58 subi r28, 0x8D ; 141 32b64: d0 40 sbci r29, 0x00 ; 0 32b66: c3 56 subi r28, 0x63 ; 99 32b68: df 4f sbci r29, 0xFF ; 255 32b6a: 18 82 st Y, r1 32b6c: cd 59 subi r28, 0x9D ; 157 32b6e: d0 40 sbci r29, 0x00 ; 0 32b70: cf 55 subi r28, 0x5F ; 95 32b72: df 4f sbci r29, 0xFF ; 255 32b74: 18 82 st Y, r1 32b76: c1 5a subi r28, 0xA1 ; 161 32b78: d0 40 sbci r29, 0x00 ; 0 32b7a: 10 e0 ldi r17, 0x00 ; 0 32b7c: a8 96 adiw r28, 0x28 ; 40 32b7e: ae ad ldd r26, Y+62 ; 0x3e 32b80: bf ad ldd r27, Y+63 ; 0x3f 32b82: a8 97 sbiw r28, 0x28 ; 40 32b84: 11 96 adiw r26, 0x01 ; 1 32b86: 2d 91 ld r18, X+ 32b88: 3d 91 ld r19, X+ 32b8a: 4d 91 ld r20, X+ 32b8c: 5c 91 ld r21, X 32b8e: 14 97 sbiw r26, 0x04 ; 4 32b90: e4 96 adiw r28, 0x34 ; 52 32b92: 2c af std Y+60, r18 ; 0x3c 32b94: 3d af std Y+61, r19 ; 0x3d 32b96: 4e af std Y+62, r20 ; 0x3e 32b98: 5f af std Y+63, r21 ; 0x3f 32b9a: e4 97 sbiw r28, 0x34 ; 52 32b9c: 15 96 adiw r26, 0x05 ; 5 32b9e: 4d 90 ld r4, X+ 32ba0: 5d 90 ld r5, X+ 32ba2: 6d 90 ld r6, X+ 32ba4: 7c 90 ld r7, X 32ba6: 18 97 sbiw r26, 0x08 ; 8 for (uint8_t i = 0; i < npts; ++i) { { float j = (r == 0) ? 1.f : 32ba8: 00 23 and r16, r16 32baa: 11 f4 brne .+4 ; 0x32bb0 32bac: 0d 94 7a 9e jmp 0x33cf4 ; 0x33cf4 ((r == 1) ? 0.f : 32bb0: 81 2c mov r8, r1 32bb2: 91 2c mov r9, r1 32bb4: 54 01 movw r10, r8 32bb6: 01 30 cpi r16, 0x01 ; 1 32bb8: 81 f0 breq .+32 ; 0x32bda ((r == 2) ? (-s1 * measured_pts[2 * i]) : 32bba: 02 30 cpi r16, 0x02 ; 2 32bbc: 11 f0 breq .+4 ; 0x32bc2 32bbe: 0d 94 6e 9e jmp 0x33cdc ; 0x33cdc 32bc2: cf 57 subi r28, 0x7F ; 127 32bc4: df 4f sbci r29, 0xFF ; 255 32bc6: 68 81 ld r22, Y 32bc8: 79 81 ldd r23, Y+1 ; 0x01 32bca: 8a 81 ldd r24, Y+2 ; 0x02 32bcc: 9b 81 ldd r25, Y+3 ; 0x03 32bce: c1 58 subi r28, 0x81 ; 129 32bd0: d0 40 sbci r29, 0x00 ; 0 32bd2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32bd6: 4b 01 movw r8, r22 32bd8: 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); 32bda: e4 96 adiw r28, 0x34 ; 52 32bdc: 2c ad ldd r18, Y+60 ; 0x3c 32bde: 3d ad ldd r19, Y+61 ; 0x3d 32be0: 4e ad ldd r20, Y+62 ; 0x3e 32be2: 5f ad ldd r21, Y+63 ; 0x3f 32be4: e4 97 sbiw r28, 0x34 ; 52 32be6: 6e 96 adiw r28, 0x1e ; 30 32be8: 6c ad ldd r22, Y+60 ; 0x3c 32bea: 7d ad ldd r23, Y+61 ; 0x3d 32bec: 8e ad ldd r24, Y+62 ; 0x3e 32bee: 9f ad ldd r25, Y+63 ; 0x3f 32bf0: 6e 97 sbiw r28, 0x1e ; 30 32bf2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32bf6: 6b 01 movw r12, r22 32bf8: 7c 01 movw r14, r24 32bfa: f1 01 movw r30, r2 32bfc: 25 91 lpm r18, Z+ 32bfe: 35 91 lpm r19, Z+ 32c00: 45 91 lpm r20, Z+ 32c02: 54 91 lpm r21, Z 32c04: cb 55 subi r28, 0x5B ; 91 32c06: df 4f sbci r29, 0xFF ; 255 32c08: 28 83 st Y, r18 32c0a: 39 83 std Y+1, r19 ; 0x01 32c0c: 4a 83 std Y+2, r20 ; 0x02 32c0e: 5b 83 std Y+3, r21 ; 0x03 32c10: c5 5a subi r28, 0xA5 ; 165 32c12: d0 40 sbci r29, 0x00 ; 0 32c14: a3 01 movw r20, r6 32c16: 92 01 movw r18, r4 32c18: cb 56 subi r28, 0x6B ; 107 32c1a: df 4f sbci r29, 0xFF ; 255 32c1c: 68 81 ld r22, Y 32c1e: 79 81 ldd r23, Y+1 ; 0x01 32c20: 8a 81 ldd r24, Y+2 ; 0x02 32c22: 9b 81 ldd r25, Y+3 ; 0x03 32c24: c5 59 subi r28, 0x95 ; 149 32c26: d0 40 sbci r29, 0x00 ; 0 32c28: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32c2c: 9b 01 movw r18, r22 32c2e: ac 01 movw r20, r24 32c30: c7 01 movw r24, r14 32c32: b6 01 movw r22, r12 32c34: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 32c38: c5 55 subi r28, 0x55 ; 85 32c3a: df 4f sbci r29, 0xFF ; 255 32c3c: 28 81 ld r18, Y 32c3e: 39 81 ldd r19, Y+1 ; 0x01 32c40: 4a 81 ldd r20, Y+2 ; 0x02 32c42: 5b 81 ldd r21, Y+3 ; 0x03 32c44: cb 5a subi r28, 0xAB ; 171 32c46: d0 40 sbci r29, 0x00 ; 0 32c48: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32c4c: cb 55 subi r28, 0x5B ; 91 32c4e: df 4f sbci r29, 0xFF ; 255 32c50: 28 81 ld r18, Y 32c52: 39 81 ldd r19, Y+1 ; 0x01 32c54: 4a 81 ldd r20, Y+2 ; 0x02 32c56: 5b 81 ldd r21, Y+3 ; 0x03 32c58: c5 5a subi r28, 0xA5 ; 165 32c5a: d0 40 sbci r29, 0x00 ; 0 32c5c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += j * fx * w; 32c60: a5 01 movw r20, r10 32c62: 94 01 movw r18, r8 32c64: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32c68: c3 57 subi r28, 0x73 ; 115 32c6a: df 4f sbci r29, 0xFF ; 255 32c6c: 28 81 ld r18, Y 32c6e: cd 58 subi r28, 0x8D ; 141 32c70: d0 40 sbci r29, 0x00 ; 0 32c72: c3 56 subi r28, 0x63 ; 99 32c74: df 4f sbci r29, 0xFF ; 255 32c76: 38 81 ld r19, Y 32c78: cd 59 subi r28, 0x9D ; 157 32c7a: d0 40 sbci r29, 0x00 ; 0 32c7c: cf 55 subi r28, 0x5F ; 95 32c7e: df 4f sbci r29, 0xFF ; 255 32c80: 48 81 ld r20, Y 32c82: c1 5a subi r28, 0xA1 ; 161 32c84: d0 40 sbci r29, 0x00 ; 0 32c86: 51 2f mov r21, r17 32c88: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32c8c: c3 57 subi r28, 0x73 ; 115 32c8e: df 4f sbci r29, 0xFF ; 255 32c90: 68 83 st Y, r22 32c92: 79 83 std Y+1, r23 ; 0x01 32c94: 8a 83 std Y+2, r24 ; 0x02 32c96: 9b 83 std Y+3, r25 ; 0x03 32c98: cd 58 subi r28, 0x8D ; 141 32c9a: d0 40 sbci r29, 0x00 ; 0 } { float j = (r == 0) ? 0.f : 32c9c: 00 23 and r16, r16 32c9e: 11 f4 brne .+4 ; 0x32ca4 32ca0: 0d 94 82 9e jmp 0x33d04 ; 0x33d04 ((r == 1) ? 1.f : 32ca4: 01 30 cpi r16, 0x01 ; 1 32ca6: 11 f4 brne .+4 ; 0x32cac 32ca8: 0d 94 87 9e jmp 0x33d0e ; 0x33d0e ((r == 2) ? ( c1 * measured_pts[2 * i]) : 32cac: 02 30 cpi r16, 0x02 ; 2 32cae: 61 f0 breq .+24 ; 0x32cc8 32cb0: a3 01 movw r20, r6 32cb2: 92 01 movw r18, r4 32cb4: ed 96 adiw r28, 0x3d ; 61 32cb6: 6c ad ldd r22, Y+60 ; 0x3c 32cb8: 7d ad ldd r23, Y+61 ; 0x3d 32cba: 8e ad ldd r24, Y+62 ; 0x3e 32cbc: 9f ad ldd r25, Y+63 ; 0x3f 32cbe: ed 97 sbiw r28, 0x3d ; 61 32cc0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32cc4: 6b 01 movw r12, r22 32cc6: 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); 32cc8: f1 01 movw r30, r2 32cca: 34 96 adiw r30, 0x04 ; 4 32ccc: 85 90 lpm r8, Z+ 32cce: 95 90 lpm r9, Z+ 32cd0: a5 90 lpm r10, Z+ 32cd2: b4 90 lpm r11, Z 32cd4: e4 96 adiw r28, 0x34 ; 52 32cd6: 2c ad ldd r18, Y+60 ; 0x3c 32cd8: 3d ad ldd r19, Y+61 ; 0x3d 32cda: 4e ad ldd r20, Y+62 ; 0x3e 32cdc: 5f ad ldd r21, Y+63 ; 0x3f 32cde: e4 97 sbiw r28, 0x34 ; 52 32ce0: cb 57 subi r28, 0x7B ; 123 32ce2: df 4f sbci r29, 0xFF ; 255 32ce4: 68 81 ld r22, Y 32ce6: 79 81 ldd r23, Y+1 ; 0x01 32ce8: 8a 81 ldd r24, Y+2 ; 0x02 32cea: 9b 81 ldd r25, Y+3 ; 0x03 32cec: c5 58 subi r28, 0x85 ; 133 32cee: d0 40 sbci r29, 0x00 ; 0 32cf0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32cf4: e4 96 adiw r28, 0x34 ; 52 32cf6: 6c af std Y+60, r22 ; 0x3c 32cf8: 7d af std Y+61, r23 ; 0x3d 32cfa: 8e af std Y+62, r24 ; 0x3e 32cfc: 9f af std Y+63, r25 ; 0x3f 32cfe: e4 97 sbiw r28, 0x34 ; 52 32d00: a3 01 movw r20, r6 32d02: 92 01 movw r18, r4 32d04: c7 57 subi r28, 0x77 ; 119 32d06: df 4f sbci r29, 0xFF ; 255 32d08: 68 81 ld r22, Y 32d0a: 79 81 ldd r23, Y+1 ; 0x01 32d0c: 8a 81 ldd r24, Y+2 ; 0x02 32d0e: 9b 81 ldd r25, Y+3 ; 0x03 32d10: c9 58 subi r28, 0x89 ; 137 32d12: d0 40 sbci r29, 0x00 ; 0 32d14: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32d18: 9b 01 movw r18, r22 32d1a: ac 01 movw r20, r24 32d1c: e4 96 adiw r28, 0x34 ; 52 32d1e: 6c ad ldd r22, Y+60 ; 0x3c 32d20: 7d ad ldd r23, Y+61 ; 0x3d 32d22: 8e ad ldd r24, Y+62 ; 0x3e 32d24: 9f ad ldd r25, Y+63 ; 0x3f 32d26: e4 97 sbiw r28, 0x34 ; 52 32d28: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32d2c: c1 55 subi r28, 0x51 ; 81 32d2e: df 4f sbci r29, 0xFF ; 255 32d30: 28 81 ld r18, Y 32d32: 39 81 ldd r19, Y+1 ; 0x01 32d34: 4a 81 ldd r20, Y+2 ; 0x02 32d36: 5b 81 ldd r21, Y+3 ; 0x03 32d38: cf 5a subi r28, 0xAF ; 175 32d3a: d0 40 sbci r29, 0x00 ; 0 32d3c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32d40: a5 01 movw r20, r10 32d42: 94 01 movw r18, r8 32d44: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += j * fy * w; 32d48: a7 01 movw r20, r14 32d4a: 96 01 movw r18, r12 32d4c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32d50: c3 57 subi r28, 0x73 ; 115 32d52: df 4f sbci r29, 0xFF ; 255 32d54: 28 81 ld r18, Y 32d56: 39 81 ldd r19, Y+1 ; 0x01 32d58: 4a 81 ldd r20, Y+2 ; 0x02 32d5a: 5b 81 ldd r21, Y+3 ; 0x03 32d5c: cd 58 subi r28, 0x8D ; 141 32d5e: d0 40 sbci r29, 0x00 ; 0 32d60: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 32d64: c3 57 subi r28, 0x73 ; 115 32d66: df 4f sbci r29, 0xFF ; 255 32d68: 68 83 st Y, r22 32d6a: cd 58 subi r28, 0x8D ; 141 32d6c: d0 40 sbci r29, 0x00 ; 0 32d6e: c3 56 subi r28, 0x63 ; 99 32d70: df 4f sbci r29, 0xFF ; 255 32d72: 78 83 st Y, r23 32d74: cd 59 subi r28, 0x9D ; 157 32d76: d0 40 sbci r29, 0x00 ; 0 32d78: cf 55 subi r28, 0x5F ; 95 32d7a: df 4f sbci r29, 0xFF ; 255 32d7c: 88 83 st Y, r24 32d7e: c1 5a subi r28, 0xA1 ; 161 32d80: d0 40 sbci r29, 0x00 ; 0 32d82: 19 2f mov r17, r25 32d84: a8 96 adiw r28, 0x28 ; 40 32d86: 4e ad ldd r20, Y+62 ; 0x3e 32d88: 5f ad ldd r21, Y+63 ; 0x3f 32d8a: a8 97 sbiw r28, 0x28 ; 40 32d8c: 48 5f subi r20, 0xF8 ; 248 32d8e: 5f 4f sbci r21, 0xFF ; 255 32d90: a8 96 adiw r28, 0x28 ; 40 32d92: 5f af std Y+63, r21 ; 0x3f 32d94: 4e af std Y+62, r20 ; 0x3e 32d96: a8 97 sbiw r28, 0x28 ; 40 32d98: 58 e0 ldi r21, 0x08 ; 8 32d9a: 25 0e add r2, r21 32d9c: 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) { 32d9e: a1 ee ldi r26, 0xE1 ; 225 32da0: b3 e1 ldi r27, 0x13 ; 19 32da2: a8 96 adiw r28, 0x28 ; 40 32da4: ee ad ldd r30, Y+62 ; 0x3e 32da6: ff ad ldd r31, Y+63 ; 0x3f 32da8: a8 97 sbiw r28, 0x28 ; 40 32daa: ae 17 cp r26, r30 32dac: bf 07 cpc r27, r31 32dae: 09 f0 breq .+2 ; 0x32db2 32db0: e5 ce rjmp .-566 ; 0x32b7c 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; 32db2: 90 58 subi r25, 0x80 ; 128 32db4: c7 56 subi r28, 0x67 ; 103 32db6: df 4f sbci r29, 0xFF ; 255 32db8: a8 81 ld r26, Y 32dba: b9 81 ldd r27, Y+1 ; 0x01 32dbc: c9 59 subi r28, 0x99 ; 153 32dbe: d0 40 sbci r29, 0x00 ; 0 32dc0: 6d 93 st X+, r22 32dc2: 7d 93 st X+, r23 32dc4: 8d 93 st X+, r24 32dc6: 9d 93 st X+, r25 32dc8: c7 56 subi r28, 0x67 ; 103 32dca: df 4f sbci r29, 0xFF ; 255 32dcc: b9 83 std Y+1, r27 ; 0x01 32dce: a8 83 st Y, r26 32dd0: c9 59 subi r28, 0x99 ; 153 32dd2: 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) { 32dd4: 0f 5f subi r16, 0xFF ; 255 32dd6: ac 96 adiw r28, 0x2c ; 44 32dd8: ee ad ldd r30, Y+62 ; 0x3e 32dda: ff ad ldd r31, Y+63 ; 0x3f 32ddc: ac 97 sbiw r28, 0x2c ; 44 32dde: 70 96 adiw r30, 0x10 ; 16 32de0: ac 96 adiw r28, 0x2c ; 44 32de2: ff af std Y+63, r31 ; 0x3f 32de4: ee af std Y+62, r30 ; 0x3e 32de6: ac 97 sbiw r28, 0x2c ; 44 32de8: 04 30 cpi r16, 0x04 ; 4 32dea: 09 f0 breq .+2 ; 0x32dee 32dec: 21 ce rjmp .-958 ; 0x32a30 } // 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]; 32dee: 25 96 adiw r28, 0x05 ; 5 32df0: 2c ad ldd r18, Y+60 ; 0x3c 32df2: 3d ad ldd r19, Y+61 ; 0x3d 32df4: 4e ad ldd r20, Y+62 ; 0x3e 32df6: 5f ad ldd r21, Y+63 ; 0x3f 32df8: 25 97 sbiw r28, 0x05 ; 5 32dfa: ae 96 adiw r28, 0x2e ; 46 32dfc: 2c af std Y+60, r18 ; 0x3c 32dfe: 3d af std Y+61, r19 ; 0x3d 32e00: 4e af std Y+62, r20 ; 0x3e 32e02: 5f af std Y+63, r21 ; 0x3f 32e04: ae 97 sbiw r28, 0x2e ; 46 32e06: 8d 81 ldd r24, Y+5 ; 0x05 32e08: 9e 81 ldd r25, Y+6 ; 0x06 32e0a: af 81 ldd r26, Y+7 ; 0x07 32e0c: b8 85 ldd r27, Y+8 ; 0x08 32e0e: e4 96 adiw r28, 0x34 ; 52 32e10: 8c af std Y+60, r24 ; 0x3c 32e12: 9d af std Y+61, r25 ; 0x3d 32e14: ae af std Y+62, r26 ; 0x3e 32e16: bf af std Y+63, r27 ; 0x3f 32e18: e4 97 sbiw r28, 0x34 ; 52 32e1a: 29 85 ldd r18, Y+9 ; 0x09 32e1c: 3a 85 ldd r19, Y+10 ; 0x0a 32e1e: 4b 85 ldd r20, Y+11 ; 0x0b 32e20: 5c 85 ldd r21, Y+12 ; 0x0c 32e22: ed 96 adiw r28, 0x3d ; 61 32e24: 2c af std Y+60, r18 ; 0x3c 32e26: 3d af std Y+61, r19 ; 0x3d 32e28: 4e af std Y+62, r20 ; 0x3e 32e2a: 5f af std Y+63, r21 ; 0x3f 32e2c: ed 97 sbiw r28, 0x3d ; 61 32e2e: 8d 85 ldd r24, Y+13 ; 0x0d 32e30: 9e 85 ldd r25, Y+14 ; 0x0e 32e32: af 85 ldd r26, Y+15 ; 0x0f 32e34: b8 89 ldd r27, Y+16 ; 0x10 32e36: c3 58 subi r28, 0x83 ; 131 32e38: df 4f sbci r29, 0xFF ; 255 32e3a: 88 83 st Y, r24 32e3c: 99 83 std Y+1, r25 ; 0x01 32e3e: aa 83 std Y+2, r26 ; 0x02 32e40: bb 83 std Y+3, r27 ; 0x03 32e42: cd 57 subi r28, 0x7D ; 125 32e44: d0 40 sbci r29, 0x00 ; 0 32e46: 29 81 ldd r18, Y+1 ; 0x01 32e48: 3a 81 ldd r19, Y+2 ; 0x02 32e4a: 4b 81 ldd r20, Y+3 ; 0x03 32e4c: 5c 81 ldd r21, Y+4 ; 0x04 32e4e: cf 57 subi r28, 0x7F ; 127 32e50: df 4f sbci r29, 0xFF ; 255 32e52: 28 83 st Y, r18 32e54: 39 83 std Y+1, r19 ; 0x01 32e56: 4a 83 std Y+2, r20 ; 0x02 32e58: 5b 83 std Y+3, r21 ; 0x03 32e5a: c1 58 subi r28, 0x81 ; 129 32e5c: 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]; 32e5e: 29 96 adiw r28, 0x09 ; 9 32e60: 8c ad ldd r24, Y+60 ; 0x3c 32e62: 9d ad ldd r25, Y+61 ; 0x3d 32e64: ae ad ldd r26, Y+62 ; 0x3e 32e66: bf ad ldd r27, Y+63 ; 0x3f 32e68: 29 97 sbiw r28, 0x09 ; 9 32e6a: cb 57 subi r28, 0x7B ; 123 32e6c: df 4f sbci r29, 0xFF ; 255 32e6e: 88 83 st Y, r24 32e70: 99 83 std Y+1, r25 ; 0x01 32e72: aa 83 std Y+2, r26 ; 0x02 32e74: bb 83 std Y+3, r27 ; 0x03 32e76: c5 58 subi r28, 0x85 ; 133 32e78: d0 40 sbci r29, 0x00 ; 0 32e7a: 29 89 ldd r18, Y+17 ; 0x11 32e7c: 3a 89 ldd r19, Y+18 ; 0x12 32e7e: 4b 89 ldd r20, Y+19 ; 0x13 32e80: 5c 89 ldd r21, Y+20 ; 0x14 32e82: c7 57 subi r28, 0x77 ; 119 32e84: df 4f sbci r29, 0xFF ; 255 32e86: 28 83 st Y, r18 32e88: 39 83 std Y+1, r19 ; 0x01 32e8a: 4a 83 std Y+2, r20 ; 0x02 32e8c: 5b 83 std Y+3, r21 ; 0x03 32e8e: c9 58 subi r28, 0x89 ; 137 32e90: d0 40 sbci r29, 0x00 ; 0 32e92: 89 8d ldd r24, Y+25 ; 0x19 32e94: 9a 8d ldd r25, Y+26 ; 0x1a 32e96: ab 8d ldd r26, Y+27 ; 0x1b 32e98: bc 8d ldd r27, Y+28 ; 0x1c 32e9a: cb 56 subi r28, 0x6B ; 107 32e9c: df 4f sbci r29, 0xFF ; 255 32e9e: 88 83 st Y, r24 32ea0: 99 83 std Y+1, r25 ; 0x01 32ea2: aa 83 std Y+2, r26 ; 0x02 32ea4: bb 83 std Y+3, r27 ; 0x03 32ea6: c5 59 subi r28, 0x95 ; 149 32ea8: d0 40 sbci r29, 0x00 ; 0 32eaa: 2d 8d ldd r18, Y+29 ; 0x1d 32eac: 3e 8d ldd r19, Y+30 ; 0x1e 32eae: 4f 8d ldd r20, Y+31 ; 0x1f 32eb0: 58 a1 ldd r21, Y+32 ; 0x20 32eb2: c7 56 subi r28, 0x67 ; 103 32eb4: df 4f sbci r29, 0xFF ; 255 32eb6: 28 83 st Y, r18 32eb8: 39 83 std Y+1, r19 ; 0x01 32eba: 4a 83 std Y+2, r20 ; 0x02 32ebc: 5b 83 std Y+3, r21 ; 0x03 32ebe: c9 59 subi r28, 0x99 ; 153 32ec0: d0 40 sbci r29, 0x00 ; 0 32ec2: 8d 89 ldd r24, Y+21 ; 0x15 32ec4: 9e 89 ldd r25, Y+22 ; 0x16 32ec6: af 89 ldd r26, Y+23 ; 0x17 32ec8: b8 8d ldd r27, Y+24 ; 0x18 32eca: c3 57 subi r28, 0x73 ; 115 32ecc: df 4f sbci r29, 0xFF ; 255 32ece: 88 83 st Y, r24 32ed0: 99 83 std Y+1, r25 ; 0x01 32ed2: aa 83 std Y+2, r26 ; 0x02 32ed4: bb 83 std Y+3, r27 ; 0x03 32ed6: cd 58 subi r28, 0x8D ; 141 32ed8: 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]; 32eda: 2d 96 adiw r28, 0x0d ; 13 32edc: 2c ad ldd r18, Y+60 ; 0x3c 32ede: 3d ad ldd r19, Y+61 ; 0x3d 32ee0: 4e ad ldd r20, Y+62 ; 0x3e 32ee2: 5f ad ldd r21, Y+63 ; 0x3f 32ee4: 2d 97 sbiw r28, 0x0d ; 13 32ee6: c3 56 subi r28, 0x63 ; 99 32ee8: df 4f sbci r29, 0xFF ; 255 32eea: 28 83 st Y, r18 32eec: 39 83 std Y+1, r19 ; 0x01 32eee: 4a 83 std Y+2, r20 ; 0x02 32ef0: 5b 83 std Y+3, r21 ; 0x03 32ef2: cd 59 subi r28, 0x9D ; 157 32ef4: d0 40 sbci r29, 0x00 ; 0 32ef6: 89 a1 ldd r24, Y+33 ; 0x21 32ef8: 9a a1 ldd r25, Y+34 ; 0x22 32efa: ab a1 ldd r26, Y+35 ; 0x23 32efc: bc a1 ldd r27, Y+36 ; 0x24 32efe: cf 55 subi r28, 0x5F ; 95 32f00: df 4f sbci r29, 0xFF ; 255 32f02: 88 83 st Y, r24 32f04: 99 83 std Y+1, r25 ; 0x01 32f06: aa 83 std Y+2, r26 ; 0x02 32f08: bb 83 std Y+3, r27 ; 0x03 32f0a: c1 5a subi r28, 0xA1 ; 161 32f0c: d0 40 sbci r29, 0x00 ; 0 32f0e: 2d a1 ldd r18, Y+37 ; 0x25 32f10: 3e a1 ldd r19, Y+38 ; 0x26 32f12: 4f a1 ldd r20, Y+39 ; 0x27 32f14: 58 a5 ldd r21, Y+40 ; 0x28 32f16: cb 55 subi r28, 0x5B ; 91 32f18: df 4f sbci r29, 0xFF ; 255 32f1a: 28 83 st Y, r18 32f1c: 39 83 std Y+1, r19 ; 0x01 32f1e: 4a 83 std Y+2, r20 ; 0x02 32f20: 5b 83 std Y+3, r21 ; 0x03 32f22: c5 5a subi r28, 0xA5 ; 165 32f24: d0 40 sbci r29, 0x00 ; 0 32f26: 8d a5 ldd r24, Y+45 ; 0x2d 32f28: 9e a5 ldd r25, Y+46 ; 0x2e 32f2a: af a5 ldd r26, Y+47 ; 0x2f 32f2c: b8 a9 ldd r27, Y+48 ; 0x30 32f2e: cd 54 subi r28, 0x4D ; 77 32f30: df 4f sbci r29, 0xFF ; 255 32f32: 88 83 st Y, r24 32f34: 99 83 std Y+1, r25 ; 0x01 32f36: aa 83 std Y+2, r26 ; 0x02 32f38: bb 83 std Y+3, r27 ; 0x03 32f3a: c3 5b subi r28, 0xB3 ; 179 32f3c: d0 40 sbci r29, 0x00 ; 0 32f3e: 29 a5 ldd r18, Y+41 ; 0x29 32f40: 3a a5 ldd r19, Y+42 ; 0x2a 32f42: 4b a5 ldd r20, Y+43 ; 0x2b 32f44: 5c a5 ldd r21, Y+44 ; 0x2c 32f46: c9 54 subi r28, 0x49 ; 73 32f48: df 4f sbci r29, 0xFF ; 255 32f4a: 28 83 st Y, r18 32f4c: 39 83 std Y+1, r19 ; 0x01 32f4e: 4a 83 std Y+2, r20 ; 0x02 32f50: 5b 83 std Y+3, r21 ; 0x03 32f52: c7 5b subi r28, 0xB7 ; 183 32f54: 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]; 32f56: 61 96 adiw r28, 0x11 ; 17 32f58: 8c ad ldd r24, Y+60 ; 0x3c 32f5a: 9d ad ldd r25, Y+61 ; 0x3d 32f5c: ae ad ldd r26, Y+62 ; 0x3e 32f5e: bf ad ldd r27, Y+63 ; 0x3f 32f60: 61 97 sbiw r28, 0x11 ; 17 32f62: c5 54 subi r28, 0x45 ; 69 32f64: df 4f sbci r29, 0xFF ; 255 32f66: 88 83 st Y, r24 32f68: 99 83 std Y+1, r25 ; 0x01 32f6a: aa 83 std Y+2, r26 ; 0x02 32f6c: bb 83 std Y+3, r27 ; 0x03 32f6e: cb 5b subi r28, 0xBB ; 187 32f70: d0 40 sbci r29, 0x00 ; 0 32f72: 29 a9 ldd r18, Y+49 ; 0x31 32f74: 3a a9 ldd r19, Y+50 ; 0x32 32f76: 4b a9 ldd r20, Y+51 ; 0x33 32f78: 5c a9 ldd r21, Y+52 ; 0x34 32f7a: c1 54 subi r28, 0x41 ; 65 32f7c: df 4f sbci r29, 0xFF ; 255 32f7e: 28 83 st Y, r18 32f80: 39 83 std Y+1, r19 ; 0x01 32f82: 4a 83 std Y+2, r20 ; 0x02 32f84: 5b 83 std Y+3, r21 ; 0x03 32f86: cf 5b subi r28, 0xBF ; 191 32f88: d0 40 sbci r29, 0x00 ; 0 32f8a: 8d a9 ldd r24, Y+53 ; 0x35 32f8c: 9e a9 ldd r25, Y+54 ; 0x36 32f8e: af a9 ldd r26, Y+55 ; 0x37 32f90: b8 ad ldd r27, Y+56 ; 0x38 32f92: cd 53 subi r28, 0x3D ; 61 32f94: df 4f sbci r29, 0xFF ; 255 32f96: 88 83 st Y, r24 32f98: 99 83 std Y+1, r25 ; 0x01 32f9a: aa 83 std Y+2, r26 ; 0x02 32f9c: bb 83 std Y+3, r27 ; 0x03 32f9e: c3 5c subi r28, 0xC3 ; 195 32fa0: d0 40 sbci r29, 0x00 ; 0 32fa2: 29 ad ldd r18, Y+57 ; 0x39 32fa4: 3a ad ldd r19, Y+58 ; 0x3a 32fa6: 4b ad ldd r20, Y+59 ; 0x3b 32fa8: 5c ad ldd r21, Y+60 ; 0x3c 32faa: c9 53 subi r28, 0x39 ; 57 32fac: df 4f sbci r29, 0xFF ; 255 32fae: 28 83 st Y, r18 32fb0: 39 83 std Y+1, r19 ; 0x01 32fb2: 4a 83 std Y+2, r20 ; 0x02 32fb4: 5b 83 std Y+3, r21 ; 0x03 32fb6: c7 5c subi r28, 0xC7 ; 199 32fb8: d0 40 sbci r29, 0x00 ; 0 32fba: 21 96 adiw r28, 0x01 ; 1 32fbc: 8c ad ldd r24, Y+60 ; 0x3c 32fbe: 9d ad ldd r25, Y+61 ; 0x3d 32fc0: ae ad ldd r26, Y+62 ; 0x3e 32fc2: bf ad ldd r27, Y+63 ; 0x3f 32fc4: 21 97 sbiw r28, 0x01 ; 1 32fc6: c5 53 subi r28, 0x35 ; 53 32fc8: df 4f sbci r29, 0xFF ; 255 32fca: 88 83 st Y, r24 32fcc: 99 83 std Y+1, r25 ; 0x01 32fce: aa 83 std Y+2, r26 ; 0x02 32fd0: bb 83 std Y+3, r27 ; 0x03 32fd2: cb 5c subi r28, 0xCB ; 203 32fd4: d0 40 sbci r29, 0x00 ; 0 32fd6: 14 e6 ldi r17, 0x64 ; 100 } b[r] = -acc; } // Solve for h by a Gauss iteration method. float h[4] = { 0.f }; 32fd8: c1 2c mov r12, r1 32fda: d1 2c mov r13, r1 32fdc: 76 01 movw r14, r12 32fde: 46 01 movw r8, r12 32fe0: 57 01 movw r10, r14 32fe2: 26 01 movw r4, r12 32fe4: 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]; 32fe6: a3 01 movw r20, r6 32fe8: 92 01 movw r18, r4 32fea: e4 96 adiw r28, 0x34 ; 52 32fec: 6c ad ldd r22, Y+60 ; 0x3c 32fee: 7d ad ldd r23, Y+61 ; 0x3d 32ff0: 8e ad ldd r24, Y+62 ; 0x3e 32ff2: 9f ad ldd r25, Y+63 ; 0x3f 32ff4: e4 97 sbiw r28, 0x34 ; 52 32ff6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 32ffa: 9b 01 movw r18, r22 32ffc: ac 01 movw r20, r24 32ffe: ae 96 adiw r28, 0x2e ; 46 33000: 6c ad ldd r22, Y+60 ; 0x3c 33002: 7d ad ldd r23, Y+61 ; 0x3d 33004: 8e ad ldd r24, Y+62 ; 0x3e 33006: 9f ad ldd r25, Y+63 ; 0x3f 33008: ae 97 sbiw r28, 0x2e ; 46 3300a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3300e: 2b 01 movw r4, r22 33010: 3c 01 movw r6, r24 33012: a5 01 movw r20, r10 33014: 94 01 movw r18, r8 33016: ed 96 adiw r28, 0x3d ; 61 33018: 6c ad ldd r22, Y+60 ; 0x3c 3301a: 7d ad ldd r23, Y+61 ; 0x3d 3301c: 8e ad ldd r24, Y+62 ; 0x3e 3301e: 9f ad ldd r25, Y+63 ; 0x3f 33020: ed 97 sbiw r28, 0x3d ; 61 33022: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33026: 9b 01 movw r18, r22 33028: ac 01 movw r20, r24 3302a: c3 01 movw r24, r6 3302c: b2 01 movw r22, r4 3302e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 33032: 2b 01 movw r4, r22 33034: 3c 01 movw r6, r24 33036: a7 01 movw r20, r14 33038: 96 01 movw r18, r12 3303a: c3 58 subi r28, 0x83 ; 131 3303c: df 4f sbci r29, 0xFF ; 255 3303e: 68 81 ld r22, Y 33040: 79 81 ldd r23, Y+1 ; 0x01 33042: 8a 81 ldd r24, Y+2 ; 0x02 33044: 9b 81 ldd r25, Y+3 ; 0x03 33046: cd 57 subi r28, 0x7D ; 125 33048: d0 40 sbci r29, 0x00 ; 0 3304a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3304e: 9b 01 movw r18, r22 33050: ac 01 movw r20, r24 33052: c3 01 movw r24, r6 33054: b2 01 movw r22, r4 33056: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3305a: cf 57 subi r28, 0x7F ; 127 3305c: df 4f sbci r29, 0xFF ; 255 3305e: 28 81 ld r18, Y 33060: 39 81 ldd r19, Y+1 ; 0x01 33062: 4a 81 ldd r20, Y+2 ; 0x02 33064: 5b 81 ldd r21, Y+3 ; 0x03 33066: c1 58 subi r28, 0x81 ; 129 33068: d0 40 sbci r29, 0x00 ; 0 3306a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3306e: 6e 96 adiw r28, 0x1e ; 30 33070: 6c af std Y+60, r22 ; 0x3c 33072: 7d af std Y+61, r23 ; 0x3d 33074: 8e af std Y+62, r24 ; 0x3e 33076: 9f af std Y+63, r25 ; 0x3f 33078: 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]; 3307a: c7 57 subi r28, 0x77 ; 119 3307c: df 4f sbci r29, 0xFF ; 255 3307e: 28 81 ld r18, Y 33080: 39 81 ldd r19, Y+1 ; 0x01 33082: 4a 81 ldd r20, Y+2 ; 0x02 33084: 5b 81 ldd r21, Y+3 ; 0x03 33086: c9 58 subi r28, 0x89 ; 137 33088: d0 40 sbci r29, 0x00 ; 0 3308a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3308e: 9b 01 movw r18, r22 33090: ac 01 movw r20, r24 33092: cb 57 subi r28, 0x7B ; 123 33094: df 4f sbci r29, 0xFF ; 255 33096: 68 81 ld r22, Y 33098: 79 81 ldd r23, Y+1 ; 0x01 3309a: 8a 81 ldd r24, Y+2 ; 0x02 3309c: 9b 81 ldd r25, Y+3 ; 0x03 3309e: c5 58 subi r28, 0x85 ; 133 330a0: d0 40 sbci r29, 0x00 ; 0 330a2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 330a6: 2b 01 movw r4, r22 330a8: 3c 01 movw r6, r24 330aa: a5 01 movw r20, r10 330ac: 94 01 movw r18, r8 330ae: cb 56 subi r28, 0x6B ; 107 330b0: df 4f sbci r29, 0xFF ; 255 330b2: 68 81 ld r22, Y 330b4: 79 81 ldd r23, Y+1 ; 0x01 330b6: 8a 81 ldd r24, Y+2 ; 0x02 330b8: 9b 81 ldd r25, Y+3 ; 0x03 330ba: c5 59 subi r28, 0x95 ; 149 330bc: d0 40 sbci r29, 0x00 ; 0 330be: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 330c2: 9b 01 movw r18, r22 330c4: ac 01 movw r20, r24 330c6: c3 01 movw r24, r6 330c8: b2 01 movw r22, r4 330ca: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 330ce: 4b 01 movw r8, r22 330d0: 5c 01 movw r10, r24 330d2: a7 01 movw r20, r14 330d4: 96 01 movw r18, r12 330d6: c7 56 subi r28, 0x67 ; 103 330d8: df 4f sbci r29, 0xFF ; 255 330da: 68 81 ld r22, Y 330dc: 79 81 ldd r23, Y+1 ; 0x01 330de: 8a 81 ldd r24, Y+2 ; 0x02 330e0: 9b 81 ldd r25, Y+3 ; 0x03 330e2: c9 59 subi r28, 0x99 ; 153 330e4: d0 40 sbci r29, 0x00 ; 0 330e6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 330ea: 9b 01 movw r18, r22 330ec: ac 01 movw r20, r24 330ee: c5 01 movw r24, r10 330f0: b4 01 movw r22, r8 330f2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 330f6: c3 57 subi r28, 0x73 ; 115 330f8: df 4f sbci r29, 0xFF ; 255 330fa: 28 81 ld r18, Y 330fc: 39 81 ldd r19, Y+1 ; 0x01 330fe: 4a 81 ldd r20, Y+2 ; 0x02 33100: 5b 81 ldd r21, Y+3 ; 0x03 33102: cd 58 subi r28, 0x8D ; 141 33104: d0 40 sbci r29, 0x00 ; 0 33106: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3310a: 2b 01 movw r4, r22 3310c: 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]; 3310e: cf 55 subi r28, 0x5F ; 95 33110: df 4f sbci r29, 0xFF ; 255 33112: 28 81 ld r18, Y 33114: 39 81 ldd r19, Y+1 ; 0x01 33116: 4a 81 ldd r20, Y+2 ; 0x02 33118: 5b 81 ldd r21, Y+3 ; 0x03 3311a: c1 5a subi r28, 0xA1 ; 161 3311c: d0 40 sbci r29, 0x00 ; 0 3311e: 6e 96 adiw r28, 0x1e ; 30 33120: 6c ad ldd r22, Y+60 ; 0x3c 33122: 7d ad ldd r23, Y+61 ; 0x3d 33124: 8e ad ldd r24, Y+62 ; 0x3e 33126: 9f ad ldd r25, Y+63 ; 0x3f 33128: 6e 97 sbiw r28, 0x1e ; 30 3312a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3312e: 9b 01 movw r18, r22 33130: ac 01 movw r20, r24 33132: c3 56 subi r28, 0x63 ; 99 33134: df 4f sbci r29, 0xFF ; 255 33136: 68 81 ld r22, Y 33138: 79 81 ldd r23, Y+1 ; 0x01 3313a: 8a 81 ldd r24, Y+2 ; 0x02 3313c: 9b 81 ldd r25, Y+3 ; 0x03 3313e: cd 59 subi r28, 0x9D ; 157 33140: d0 40 sbci r29, 0x00 ; 0 33142: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 33146: 4b 01 movw r8, r22 33148: 5c 01 movw r10, r24 3314a: cb 55 subi r28, 0x5B ; 91 3314c: df 4f sbci r29, 0xFF ; 255 3314e: 28 81 ld r18, Y 33150: 39 81 ldd r19, Y+1 ; 0x01 33152: 4a 81 ldd r20, Y+2 ; 0x02 33154: 5b 81 ldd r21, Y+3 ; 0x03 33156: c5 5a subi r28, 0xA5 ; 165 33158: d0 40 sbci r29, 0x00 ; 0 3315a: c3 01 movw r24, r6 3315c: b2 01 movw r22, r4 3315e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33162: 9b 01 movw r18, r22 33164: ac 01 movw r20, r24 33166: c5 01 movw r24, r10 33168: b4 01 movw r22, r8 3316a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3316e: 4b 01 movw r8, r22 33170: 5c 01 movw r10, r24 33172: a7 01 movw r20, r14 33174: 96 01 movw r18, r12 33176: cd 54 subi r28, 0x4D ; 77 33178: df 4f sbci r29, 0xFF ; 255 3317a: 68 81 ld r22, Y 3317c: 79 81 ldd r23, Y+1 ; 0x01 3317e: 8a 81 ldd r24, Y+2 ; 0x02 33180: 9b 81 ldd r25, Y+3 ; 0x03 33182: c3 5b subi r28, 0xB3 ; 179 33184: d0 40 sbci r29, 0x00 ; 0 33186: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3318a: 9b 01 movw r18, r22 3318c: ac 01 movw r20, r24 3318e: c5 01 movw r24, r10 33190: b4 01 movw r22, r8 33192: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 33196: c9 54 subi r28, 0x49 ; 73 33198: df 4f sbci r29, 0xFF ; 255 3319a: 28 81 ld r18, Y 3319c: 39 81 ldd r19, Y+1 ; 0x01 3319e: 4a 81 ldd r20, Y+2 ; 0x02 331a0: 5b 81 ldd r21, Y+3 ; 0x03 331a2: c7 5b subi r28, 0xB7 ; 183 331a4: d0 40 sbci r29, 0x00 ; 0 331a6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 331aa: 4b 01 movw r8, r22 331ac: 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]; 331ae: c1 54 subi r28, 0x41 ; 65 331b0: df 4f sbci r29, 0xFF ; 255 331b2: 28 81 ld r18, Y 331b4: 39 81 ldd r19, Y+1 ; 0x01 331b6: 4a 81 ldd r20, Y+2 ; 0x02 331b8: 5b 81 ldd r21, Y+3 ; 0x03 331ba: cf 5b subi r28, 0xBF ; 191 331bc: d0 40 sbci r29, 0x00 ; 0 331be: 6e 96 adiw r28, 0x1e ; 30 331c0: 6c ad ldd r22, Y+60 ; 0x3c 331c2: 7d ad ldd r23, Y+61 ; 0x3d 331c4: 8e ad ldd r24, Y+62 ; 0x3e 331c6: 9f ad ldd r25, Y+63 ; 0x3f 331c8: 6e 97 sbiw r28, 0x1e ; 30 331ca: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 331ce: 9b 01 movw r18, r22 331d0: ac 01 movw r20, r24 331d2: c5 54 subi r28, 0x45 ; 69 331d4: df 4f sbci r29, 0xFF ; 255 331d6: 68 81 ld r22, Y 331d8: 79 81 ldd r23, Y+1 ; 0x01 331da: 8a 81 ldd r24, Y+2 ; 0x02 331dc: 9b 81 ldd r25, Y+3 ; 0x03 331de: cb 5b subi r28, 0xBB ; 187 331e0: d0 40 sbci r29, 0x00 ; 0 331e2: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 331e6: 6b 01 movw r12, r22 331e8: 7c 01 movw r14, r24 331ea: cd 53 subi r28, 0x3D ; 61 331ec: df 4f sbci r29, 0xFF ; 255 331ee: 28 81 ld r18, Y 331f0: 39 81 ldd r19, Y+1 ; 0x01 331f2: 4a 81 ldd r20, Y+2 ; 0x02 331f4: 5b 81 ldd r21, Y+3 ; 0x03 331f6: c3 5c subi r28, 0xC3 ; 195 331f8: d0 40 sbci r29, 0x00 ; 0 331fa: c3 01 movw r24, r6 331fc: b2 01 movw r22, r4 331fe: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33202: 9b 01 movw r18, r22 33204: ac 01 movw r20, r24 33206: c7 01 movw r24, r14 33208: b6 01 movw r22, r12 3320a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3320e: 6b 01 movw r12, r22 33210: 7c 01 movw r14, r24 33212: c9 53 subi r28, 0x39 ; 57 33214: df 4f sbci r29, 0xFF ; 255 33216: 28 81 ld r18, Y 33218: 39 81 ldd r19, Y+1 ; 0x01 3321a: 4a 81 ldd r20, Y+2 ; 0x02 3321c: 5b 81 ldd r21, Y+3 ; 0x03 3321e: c7 5c subi r28, 0xC7 ; 199 33220: d0 40 sbci r29, 0x00 ; 0 33222: c5 01 movw r24, r10 33224: b4 01 movw r22, r8 33226: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3322a: 9b 01 movw r18, r22 3322c: ac 01 movw r20, r24 3322e: c7 01 movw r24, r14 33230: b6 01 movw r22, r12 33232: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 33236: c5 53 subi r28, 0x35 ; 53 33238: df 4f sbci r29, 0xFF ; 255 3323a: 28 81 ld r18, Y 3323c: 39 81 ldd r19, Y+1 ; 0x01 3323e: 4a 81 ldd r20, Y+2 ; 0x02 33240: 5b 81 ldd r21, Y+3 ; 0x03 33242: cb 5c subi r28, 0xCB ; 203 33244: d0 40 sbci r29, 0x00 ; 0 33246: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3324a: 6b 01 movw r12, r22 3324c: 7c 01 movw r14, r24 3324e: 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) { 33250: 09 f0 breq .+2 ; 0x33254 33252: c9 ce rjmp .-622 ; 0x32fe6 // 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]; 33254: 6e 96 adiw r28, 0x1e ; 30 33256: 2c ad ldd r18, Y+60 ; 0x3c 33258: 3d ad ldd r19, Y+61 ; 0x3d 3325a: 4e ad ldd r20, Y+62 ; 0x3e 3325c: 5f ad ldd r21, Y+63 ; 0x3f 3325e: 6e 97 sbiw r28, 0x1e ; 30 33260: c5 55 subi r28, 0x55 ; 85 33262: df 4f sbci r29, 0xFF ; 255 33264: 68 81 ld r22, Y 33266: 79 81 ldd r23, Y+1 ; 0x01 33268: 8a 81 ldd r24, Y+2 ; 0x02 3326a: 9b 81 ldd r25, Y+3 ; 0x03 3326c: cb 5a subi r28, 0xAB ; 171 3326e: d0 40 sbci r29, 0x00 ; 0 33270: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33274: 60 93 f2 13 sts 0x13F2, r22 ; 0x8013f2 33278: 70 93 f3 13 sts 0x13F3, r23 ; 0x8013f3 3327c: 80 93 f4 13 sts 0x13F4, r24 ; 0x8013f4 33280: 90 93 f5 13 sts 0x13F5, r25 ; 0x8013f5 cntr[1] += h[1]; 33284: a3 01 movw r20, r6 33286: 92 01 movw r18, r4 33288: c1 55 subi r28, 0x51 ; 81 3328a: df 4f sbci r29, 0xFF ; 255 3328c: 68 81 ld r22, Y 3328e: 79 81 ldd r23, Y+1 ; 0x01 33290: 8a 81 ldd r24, Y+2 ; 0x02 33292: 9b 81 ldd r25, Y+3 ; 0x03 33294: cf 5a subi r28, 0xAF ; 175 33296: d0 40 sbci r29, 0x00 ; 0 33298: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3329c: 60 93 f6 13 sts 0x13F6, r22 ; 0x8013f6 332a0: 70 93 f7 13 sts 0x13F7, r23 ; 0x8013f7 332a4: 80 93 f8 13 sts 0x13F8, r24 ; 0x8013f8 332a8: 90 93 f9 13 sts 0x13F9, r25 ; 0x8013f9 a1 += h[2]; 332ac: a5 01 movw r20, r10 332ae: 94 01 movw r18, r8 332b0: a6 96 adiw r28, 0x26 ; 38 332b2: 6c ad ldd r22, Y+60 ; 0x3c 332b4: 7d ad ldd r23, Y+61 ; 0x3d 332b6: 8e ad ldd r24, Y+62 ; 0x3e 332b8: 9f ad ldd r25, Y+63 ; 0x3f 332ba: a6 97 sbiw r28, 0x26 ; 38 332bc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 332c0: a6 96 adiw r28, 0x26 ; 38 332c2: 6c af std Y+60, r22 ; 0x3c 332c4: 7d af std Y+61, r23 ; 0x3d 332c6: 8e af std Y+62, r24 ; 0x3e 332c8: 9f af std Y+63, r25 ; 0x3f 332ca: a6 97 sbiw r28, 0x26 ; 38 a2 += h[3]; 332cc: a7 01 movw r20, r14 332ce: 96 01 movw r18, r12 332d0: a2 96 adiw r28, 0x22 ; 34 332d2: 6c ad ldd r22, Y+60 ; 0x3c 332d4: 7d ad ldd r23, Y+61 ; 0x3d 332d6: 8e ad ldd r24, Y+62 ; 0x3e 332d8: 9f ad ldd r25, Y+63 ; 0x3f 332da: a2 97 sbiw r28, 0x22 ; 34 332dc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 332e0: a2 96 adiw r28, 0x22 ; 34 332e2: 6c af std Y+60, r22 ; 0x3c 332e4: 7d af std Y+61, r23 ; 0x3d 332e6: 8e af std Y+62, r24 ; 0x3e 332e8: 9f af std Y+63, r25 ; 0x3f 332ea: a2 97 sbiw r28, 0x22 ; 34 332ec: e6 96 adiw r28, 0x36 ; 54 332ee: 9f ad ldd r25, Y+63 ; 0x3f 332f0: e6 97 sbiw r28, 0x36 ; 54 332f2: 91 50 subi r25, 0x01 ; 1 332f4: e6 96 adiw r28, 0x36 ; 54 332f6: 9f af std Y+63, r25 ; 0x3f 332f8: 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) { 332fa: 91 11 cpse r25, r1 332fc: e6 ca rjmp .-2612 ; 0x328ca SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY } vec_x[0] = cos(a1) * MACHINE_AXIS_SCALE_X; 332fe: a6 96 adiw r28, 0x26 ; 38 33300: 6c ad ldd r22, Y+60 ; 0x3c 33302: 7d ad ldd r23, Y+61 ; 0x3d 33304: 8e ad ldd r24, Y+62 ; 0x3e 33306: 9f ad ldd r25, Y+63 ; 0x3f 33308: a6 97 sbiw r28, 0x26 ; 38 3330a: 0f 94 32 de call 0x3bc64 ; 0x3bc64 3330e: 60 93 e2 13 sts 0x13E2, r22 ; 0x8013e2 33312: 70 93 e3 13 sts 0x13E3, r23 ; 0x8013e3 33316: 80 93 e4 13 sts 0x13E4, r24 ; 0x8013e4 3331a: 90 93 e5 13 sts 0x13E5, r25 ; 0x8013e5 vec_x[1] = sin(a1) * MACHINE_AXIS_SCALE_X; 3331e: a6 96 adiw r28, 0x26 ; 38 33320: 6c ad ldd r22, Y+60 ; 0x3c 33322: 7d ad ldd r23, Y+61 ; 0x3d 33324: 8e ad ldd r24, Y+62 ; 0x3e 33326: 9f ad ldd r25, Y+63 ; 0x3f 33328: a6 97 sbiw r28, 0x26 ; 38 3332a: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 3332e: 60 93 e6 13 sts 0x13E6, r22 ; 0x8013e6 33332: 70 93 e7 13 sts 0x13E7, r23 ; 0x8013e7 33336: 80 93 e8 13 sts 0x13E8, r24 ; 0x8013e8 3333a: 90 93 e9 13 sts 0x13E9, r25 ; 0x8013e9 vec_y[0] = -sin(a2) * MACHINE_AXIS_SCALE_Y; 3333e: a2 96 adiw r28, 0x22 ; 34 33340: 6c ad ldd r22, Y+60 ; 0x3c 33342: 7d ad ldd r23, Y+61 ; 0x3d 33344: 8e ad ldd r24, Y+62 ; 0x3e 33346: 9f ad ldd r25, Y+63 ; 0x3f 33348: a2 97 sbiw r28, 0x22 ; 34 3334a: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 3334e: 90 58 subi r25, 0x80 ; 128 33350: 60 93 ea 13 sts 0x13EA, r22 ; 0x8013ea 33354: 70 93 eb 13 sts 0x13EB, r23 ; 0x8013eb 33358: 80 93 ec 13 sts 0x13EC, r24 ; 0x8013ec 3335c: 90 93 ed 13 sts 0x13ED, r25 ; 0x8013ed vec_y[1] = cos(a2) * MACHINE_AXIS_SCALE_Y; 33360: a2 96 adiw r28, 0x22 ; 34 33362: 6c ad ldd r22, Y+60 ; 0x3c 33364: 7d ad ldd r23, Y+61 ; 0x3d 33366: 8e ad ldd r24, Y+62 ; 0x3e 33368: 9f ad ldd r25, Y+63 ; 0x3f 3336a: a2 97 sbiw r28, 0x22 ; 34 3336c: 0f 94 32 de call 0x3bc64 ; 0x3bc64 33370: 60 93 ee 13 sts 0x13EE, r22 ; 0x8013ee 33374: 70 93 ef 13 sts 0x13EF, r23 ; 0x8013ef 33378: 80 93 f0 13 sts 0x13F0, r24 ; 0x8013f0 3337c: 90 93 f1 13 sts 0x13F1, r25 ; 0x8013f1 BedSkewOffsetDetectionResultType result = BED_SKEW_OFFSET_DETECTION_PERFECT; { angleDiff = fabs(a2 - a1); 33380: a6 96 adiw r28, 0x26 ; 38 33382: 2c ad ldd r18, Y+60 ; 0x3c 33384: 3d ad ldd r19, Y+61 ; 0x3d 33386: 4e ad ldd r20, Y+62 ; 0x3e 33388: 5f ad ldd r21, Y+63 ; 0x3f 3338a: a6 97 sbiw r28, 0x26 ; 38 3338c: a2 96 adiw r28, 0x22 ; 34 3338e: 6c ad ldd r22, Y+60 ; 0x3c 33390: 7d ad ldd r23, Y+61 ; 0x3d 33392: 8e ad ldd r24, Y+62 ; 0x3e 33394: 9f ad ldd r25, Y+63 ; 0x3f 33396: a2 97 sbiw r28, 0x22 ; 34 33398: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3339c: 4b 01 movw r8, r22 3339e: 5c 01 movw r10, r24 333a0: 7c 01 movw r14, r24 333a2: 6b 01 movw r12, r22 333a4: e8 94 clt 333a6: f7 f8 bld r15, 7 /// XY skew and Y-bed skew DBG(_n("Measured skews: %f %f\n"), degrees(a2 - a1), degrees(a2)); 333a8: 21 ee ldi r18, 0xE1 ; 225 333aa: 3e e2 ldi r19, 0x2E ; 46 333ac: 45 e6 ldi r20, 0x65 ; 101 333ae: 52 e4 ldi r21, 0x42 ; 66 333b0: a2 96 adiw r28, 0x22 ; 34 333b2: 6c ad ldd r22, Y+60 ; 0x3c 333b4: 7d ad ldd r23, Y+61 ; 0x3d 333b6: 8e ad ldd r24, Y+62 ; 0x3e 333b8: 9f ad ldd r25, Y+63 ; 0x3f 333ba: a2 97 sbiw r28, 0x22 ; 34 333bc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 333c0: 9f 93 push r25 333c2: 8f 93 push r24 333c4: 7f 93 push r23 333c6: 6f 93 push r22 333c8: 21 ee ldi r18, 0xE1 ; 225 333ca: 3e e2 ldi r19, 0x2E ; 46 333cc: 45 e6 ldi r20, 0x65 ; 101 333ce: 52 e4 ldi r21, 0x42 ; 66 333d0: c5 01 movw r24, r10 333d2: b4 01 movw r22, r8 333d4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 333d8: 9f 93 push r25 333da: 8f 93 push r24 333dc: 7f 93 push r23 333de: 6f 93 push r22 333e0: 81 e9 ldi r24, 0x91 ; 145 333e2: 9f e6 ldi r25, 0x6F ; 111 333e4: 9f 93 push r25 333e6: 8f 93 push r24 333e8: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 if (previous_value != value) { eeprom_float_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_float(dst, value); 333ec: b7 01 movw r22, r14 333ee: a6 01 movw r20, r12 333f0: 80 e6 ldi r24, 0x60 ; 96 333f2: 9f e0 ldi r25, 0x0F ; 15 333f4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 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) 333f8: 0f b6 in r0, 0x3f ; 63 333fa: f8 94 cli 333fc: de bf out 0x3e, r29 ; 62 333fe: 0f be out 0x3f, r0 ; 63 33400: cd bf out 0x3d, r28 ; 61 33402: 2f e1 ldi r18, 0x1F ; 31 33404: 32 e4 ldi r19, 0x42 ; 66 33406: 49 e0 ldi r20, 0x09 ; 9 33408: 5b e3 ldi r21, 0x3B ; 59 3340a: c7 01 movw r24, r14 3340c: b6 01 movw r22, r12 3340e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__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; 33412: 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) 33414: 18 16 cp r1, r24 33416: 64 f4 brge .+24 ; 0x33430 result = (angleDiff > bed_skew_angle_extreme) ? 33418: 25 e3 ldi r18, 0x35 ; 53 3341a: 3a ef ldi r19, 0xFA ; 250 3341c: 4e e8 ldi r20, 0x8E ; 142 3341e: 5b e3 ldi r21, 0x3B ; 59 33420: c7 01 movw r24, r14 33422: b6 01 movw r22, r12 33424: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 33428: 12 e0 ldi r17, 0x02 ; 2 3342a: 18 16 cp r1, r24 3342c: 0c f0 brlt .+2 ; 0x33430 3342e: 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 || 33430: 25 e3 ldi r18, 0x35 ; 53 33432: 3a ef ldi r19, 0xFA ; 250 33434: 4e e8 ldi r20, 0x8E ; 142 33436: 5b e3 ldi r21, 0x3B ; 59 33438: a6 96 adiw r28, 0x26 ; 38 3343a: 6c ad ldd r22, Y+60 ; 0x3c 3343c: 7d ad ldd r23, Y+61 ; 0x3d 3343e: 8e ad ldd r24, Y+62 ; 0x3e 33440: 9f ad ldd r25, Y+63 ; 0x3f 33442: a6 97 sbiw r28, 0x26 ; 38 33444: 9f 77 andi r25, 0x7F ; 127 33446: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 3344a: 18 16 cp r1, r24 3344c: 0c f4 brge .+2 ; 0x33450 3344e: 67 c4 rjmp .+2254 ; 0x33d1e 33450: 25 e3 ldi r18, 0x35 ; 53 33452: 3a ef ldi r19, 0xFA ; 250 33454: 4e e8 ldi r20, 0x8E ; 142 33456: 5b e3 ldi r21, 0x3B ; 59 33458: a2 96 adiw r28, 0x22 ; 34 3345a: 6c ad ldd r22, Y+60 ; 0x3c 3345c: 7d ad ldd r23, Y+61 ; 0x3d 3345e: 8e ad ldd r24, Y+62 ; 0x3e 33460: 9f ad ldd r25, Y+63 ; 0x3f 33462: a2 97 sbiw r28, 0x22 ; 34 33464: 9f 77 andi r25, 0x7F ; 127 33466: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 3346a: 18 16 cp r1, r24 3346c: 0c f4 brge .+2 ; 0x33470 3346e: 57 c4 rjmp .+2222 ; 0x33d1e 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]; 33470: 20 91 e2 13 lds r18, 0x13E2 ; 0x8013e2 33474: 30 91 e3 13 lds r19, 0x13E3 ; 0x8013e3 33478: 40 91 e4 13 lds r20, 0x13E4 ; 0x8013e4 3347c: 50 91 e5 13 lds r21, 0x13E5 ; 0x8013e5 33480: ae 96 adiw r28, 0x2e ; 46 33482: 2c af std Y+60, r18 ; 0x3c 33484: 3d af std Y+61, r19 ; 0x3d 33486: 4e af std Y+62, r20 ; 0x3e 33488: 5f af std Y+63, r21 ; 0x3f 3348a: ae 97 sbiw r28, 0x2e ; 46 3348c: 80 91 ea 13 lds r24, 0x13EA ; 0x8013ea 33490: 90 91 eb 13 lds r25, 0x13EB ; 0x8013eb 33494: a0 91 ec 13 lds r26, 0x13EC ; 0x8013ec 33498: b0 91 ed 13 lds r27, 0x13ED ; 0x8013ed 3349c: e9 96 adiw r28, 0x39 ; 57 3349e: 8c af std Y+60, r24 ; 0x3c 334a0: 9d af std Y+61, r25 ; 0x3d 334a2: ae af std Y+62, r26 ; 0x3e 334a4: bf af std Y+63, r27 ; 0x3f 334a6: e9 97 sbiw r28, 0x39 ; 57 334a8: 20 91 f2 13 lds r18, 0x13F2 ; 0x8013f2 334ac: 30 91 f3 13 lds r19, 0x13F3 ; 0x8013f3 334b0: 40 91 f4 13 lds r20, 0x13F4 ; 0x8013f4 334b4: 50 91 f5 13 lds r21, 0x13F5 ; 0x8013f5 334b8: e4 96 adiw r28, 0x34 ; 52 334ba: 2c af std Y+60, r18 ; 0x3c 334bc: 3d af std Y+61, r19 ; 0x3d 334be: 4e af std Y+62, r20 ; 0x3e 334c0: 5f af std Y+63, r21 ; 0x3f 334c2: 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]; 334c4: 80 91 e6 13 lds r24, 0x13E6 ; 0x8013e6 334c8: 90 91 e7 13 lds r25, 0x13E7 ; 0x8013e7 334cc: a0 91 e8 13 lds r26, 0x13E8 ; 0x8013e8 334d0: b0 91 e9 13 lds r27, 0x13E9 ; 0x8013e9 334d4: ed 96 adiw r28, 0x3d ; 61 334d6: 8c af std Y+60, r24 ; 0x3c 334d8: 9d af std Y+61, r25 ; 0x3d 334da: ae af std Y+62, r26 ; 0x3e 334dc: bf af std Y+63, r27 ; 0x3f 334de: ed 97 sbiw r28, 0x3d ; 61 334e0: 20 91 ee 13 lds r18, 0x13EE ; 0x8013ee 334e4: 30 91 ef 13 lds r19, 0x13EF ; 0x8013ef 334e8: 40 91 f0 13 lds r20, 0x13F0 ; 0x8013f0 334ec: 50 91 f1 13 lds r21, 0x13F1 ; 0x8013f1 334f0: c3 58 subi r28, 0x83 ; 131 334f2: df 4f sbci r29, 0xFF ; 255 334f4: 28 83 st Y, r18 334f6: 39 83 std Y+1, r19 ; 0x01 334f8: 4a 83 std Y+2, r20 ; 0x02 334fa: 5b 83 std Y+3, r21 ; 0x03 334fc: cd 57 subi r28, 0x7D ; 125 334fe: d0 40 sbci r29, 0x00 ; 0 33500: 80 91 f6 13 lds r24, 0x13F6 ; 0x8013f6 33504: 90 91 f7 13 lds r25, 0x13F7 ; 0x8013f7 33508: a0 91 f8 13 lds r26, 0x13F8 ; 0x8013f8 3350c: b0 91 f9 13 lds r27, 0x13F9 ; 0x8013f9 33510: cf 57 subi r28, 0x7F ; 127 33512: df 4f sbci r29, 0xFF ; 255 33514: 88 83 st Y, r24 33516: 99 83 std Y+1, r25 ; 0x01 33518: aa 83 std Y+2, r26 ; 0x02 3351a: bb 83 std Y+3, r27 ; 0x03 3351c: c1 58 subi r28, 0x81 ; 129 3351e: d0 40 sbci r29, 0x00 ; 0 33520: af e1 ldi r26, 0x1F ; 31 33522: b5 ea ldi r27, 0xA5 ; 165 33524: 6c 96 adiw r28, 0x1c ; 28 33526: bf af std Y+63, r27 ; 0x3f 33528: ae af std Y+62, r26 ; 0x3e 3352a: 6c 97 sbiw r28, 0x1c ; 28 3352c: 81 ec ldi r24, 0xC1 ; 193 3352e: 28 2e mov r2, r24 33530: 83 e1 ldi r24, 0x13 ; 19 33532: 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]; 33534: f1 01 movw r30, r2 33536: c1 80 ldd r12, Z+1 ; 0x01 33538: d2 80 ldd r13, Z+2 ; 0x02 3353a: e3 80 ldd r14, Z+3 ; 0x03 3353c: f4 80 ldd r15, Z+4 ; 0x04 3353e: 45 80 ldd r4, Z+5 ; 0x05 33540: 56 80 ldd r5, Z+6 ; 0x06 33542: 67 80 ldd r6, Z+7 ; 0x07 33544: 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; 33546: 6c 96 adiw r28, 0x1c ; 28 33548: ee ad ldd r30, Y+62 ; 0x3e 3354a: ff ad ldd r31, Y+63 ; 0x3f 3354c: 6c 97 sbiw r28, 0x1c ; 28 3354e: 25 91 lpm r18, Z+ 33550: 35 91 lpm r19, Z+ 33552: 45 91 lpm r20, Z+ 33554: 54 91 lpm r21, Z 33556: cb 57 subi r28, 0x7B ; 123 33558: df 4f sbci r29, 0xFF ; 255 3355a: 28 83 st Y, r18 3355c: 39 83 std Y+1, r19 ; 0x01 3355e: 4a 83 std Y+2, r20 ; 0x02 33560: 5b 83 std Y+3, r21 ; 0x03 33562: c5 58 subi r28, 0x85 ; 133 33564: d0 40 sbci r29, 0x00 ; 0 float errY = pgm_read_float(true_pts + i * 2 + 1) - y; 33566: 6c 96 adiw r28, 0x1c ; 28 33568: ee ad ldd r30, Y+62 ; 0x3e 3356a: ff ad ldd r31, Y+63 ; 0x3f 3356c: 6c 97 sbiw r28, 0x1c ; 28 3356e: 34 96 adiw r30, 0x04 ; 4 33570: 85 90 lpm r8, Z+ 33572: 95 90 lpm r9, Z+ 33574: a5 90 lpm r10, Z+ 33576: 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]; 33578: ed 96 adiw r28, 0x3d ; 61 3357a: 2c ad ldd r18, Y+60 ; 0x3c 3357c: 3d ad ldd r19, Y+61 ; 0x3d 3357e: 4e ad ldd r20, Y+62 ; 0x3e 33580: 5f ad ldd r21, Y+63 ; 0x3f 33582: ed 97 sbiw r28, 0x3d ; 61 33584: c7 01 movw r24, r14 33586: b6 01 movw r22, r12 33588: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3358c: c7 57 subi r28, 0x77 ; 119 3358e: df 4f sbci r29, 0xFF ; 255 33590: 68 83 st Y, r22 33592: 79 83 std Y+1, r23 ; 0x01 33594: 8a 83 std Y+2, r24 ; 0x02 33596: 9b 83 std Y+3, r25 ; 0x03 33598: c9 58 subi r28, 0x89 ; 137 3359a: d0 40 sbci r29, 0x00 ; 0 3359c: c3 58 subi r28, 0x83 ; 131 3359e: df 4f sbci r29, 0xFF ; 255 335a0: 28 81 ld r18, Y 335a2: 39 81 ldd r19, Y+1 ; 0x01 335a4: 4a 81 ldd r20, Y+2 ; 0x02 335a6: 5b 81 ldd r21, Y+3 ; 0x03 335a8: cd 57 subi r28, 0x7D ; 125 335aa: d0 40 sbci r29, 0x00 ; 0 335ac: c3 01 movw r24, r6 335ae: b2 01 movw r22, r4 335b0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 335b4: 9b 01 movw r18, r22 335b6: ac 01 movw r20, r24 335b8: c7 57 subi r28, 0x77 ; 119 335ba: df 4f sbci r29, 0xFF ; 255 335bc: 68 81 ld r22, Y 335be: 79 81 ldd r23, Y+1 ; 0x01 335c0: 8a 81 ldd r24, Y+2 ; 0x02 335c2: 9b 81 ldd r25, Y+3 ; 0x03 335c4: c9 58 subi r28, 0x89 ; 137 335c6: d0 40 sbci r29, 0x00 ; 0 335c8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 335cc: cf 57 subi r28, 0x7F ; 127 335ce: df 4f sbci r29, 0xFF ; 255 335d0: 28 81 ld r18, Y 335d2: 39 81 ldd r19, Y+1 ; 0x01 335d4: 4a 81 ldd r20, Y+2 ; 0x02 335d6: 5b 81 ldd r21, Y+3 ; 0x03 335d8: c1 58 subi r28, 0x81 ; 129 335da: d0 40 sbci r29, 0x00 ; 0 335dc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 335e0: 9b 01 movw r18, r22 335e2: 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; 335e4: c5 01 movw r24, r10 335e6: b4 01 movw r22, r8 335e8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 335ec: 4b 01 movw r8, r22 335ee: 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]; 335f0: a7 01 movw r20, r14 335f2: 96 01 movw r18, r12 335f4: ae 96 adiw r28, 0x2e ; 46 335f6: 6c ad ldd r22, Y+60 ; 0x3c 335f8: 7d ad ldd r23, Y+61 ; 0x3d 335fa: 8e ad ldd r24, Y+62 ; 0x3e 335fc: 9f ad ldd r25, Y+63 ; 0x3f 335fe: ae 97 sbiw r28, 0x2e ; 46 33600: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33604: 6b 01 movw r12, r22 33606: 7c 01 movw r14, r24 33608: a3 01 movw r20, r6 3360a: 92 01 movw r18, r4 3360c: e9 96 adiw r28, 0x39 ; 57 3360e: 6c ad ldd r22, Y+60 ; 0x3c 33610: 7d ad ldd r23, Y+61 ; 0x3d 33612: 8e ad ldd r24, Y+62 ; 0x3e 33614: 9f ad ldd r25, Y+63 ; 0x3f 33616: e9 97 sbiw r28, 0x39 ; 57 33618: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3361c: 9b 01 movw r18, r22 3361e: ac 01 movw r20, r24 33620: c7 01 movw r24, r14 33622: b6 01 movw r22, r12 33624: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33628: e4 96 adiw r28, 0x34 ; 52 3362a: 2c ad ldd r18, Y+60 ; 0x3c 3362c: 3d ad ldd r19, Y+61 ; 0x3d 3362e: 4e ad ldd r20, Y+62 ; 0x3e 33630: 5f ad ldd r21, Y+63 ; 0x3f 33632: e4 97 sbiw r28, 0x34 ; 52 33634: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33638: 9b 01 movw r18, r22 3363a: 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; 3363c: cb 57 subi r28, 0x7B ; 123 3363e: df 4f sbci r29, 0xFF ; 255 33640: 68 81 ld r22, Y 33642: 79 81 ldd r23, Y+1 ; 0x01 33644: 8a 81 ldd r24, Y+2 ; 0x02 33646: 9b 81 ldd r25, Y+3 ; 0x03 33648: c5 58 subi r28, 0x85 ; 133 3364a: d0 40 sbci r29, 0x00 ; 0 3364c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> float errY = pgm_read_float(true_pts + i * 2 + 1) - y; float err = hypot(errX, errY); 33650: a5 01 movw r20, r10 33652: 94 01 movw r18, r8 33654: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 } 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) { 33658: 2d ec ldi r18, 0xCD ; 205 3365a: 3c ec ldi r19, 0xCC ; 204 3365c: 4c e4 ldi r20, 0x4C ; 76 3365e: 5f e3 ldi r21, 0x3F ; 63 33660: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 33664: 18 16 cp r1, r24 33666: 0c f4 brge .+2 ; 0x3366a result = BED_SKEW_OFFSET_DETECTION_FITTING_FAILED; 33668: 1e ef ldi r17, 0xFE ; 254 3366a: 38 e0 ldi r19, 0x08 ; 8 3366c: 23 0e add r2, r19 3366e: 31 1c adc r3, r1 33670: 6c 96 adiw r28, 0x1c ; 28 33672: 4e ad ldd r20, Y+62 ; 0x3e 33674: 5f ad ldd r21, Y+63 ; 0x3f 33676: 6c 97 sbiw r28, 0x1c ; 28 33678: 48 5f subi r20, 0xF8 ; 248 3367a: 5f 4f sbci r21, 0xFF ; 255 3367c: 6c 96 adiw r28, 0x1c ; 28 3367e: 5f af std Y+63, r21 ; 0x3f 33680: 4e af std Y+62, r20 ; 0x3e 33682: 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) { 33684: a8 96 adiw r28, 0x28 ; 40 33686: 8e ad ldd r24, Y+62 ; 0x3e 33688: 9f ad ldd r25, Y+63 ; 0x3f 3368a: a8 97 sbiw r28, 0x28 ; 40 3368c: 82 15 cp r24, r2 3368e: 93 05 cpc r25, r3 33690: 09 f0 breq .+2 ; 0x33694 33692: 50 cf rjmp .-352 ; 0x33534 MYSERIAL.println(BED_CALIBRATION_POINT_OFFSET_MAX_EUCLIDIAN); SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY if (result == BED_SKEW_OFFSET_DETECTION_PERFECT) { 33694: 11 11 cpse r17, r1 33696: 62 c1 rjmp .+708 ; 0x3395c #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); 33698: a2 96 adiw r28, 0x22 ; 34 3369a: 2c ad ldd r18, Y+60 ; 0x3c 3369c: 3d ad ldd r19, Y+61 ; 0x3d 3369e: 4e ad ldd r20, Y+62 ; 0x3e 336a0: 5f ad ldd r21, Y+63 ; 0x3f 336a2: a2 97 sbiw r28, 0x22 ; 34 336a4: a6 96 adiw r28, 0x26 ; 38 336a6: 6c ad ldd r22, Y+60 ; 0x3c 336a8: 7d ad ldd r23, Y+61 ; 0x3d 336aa: 8e ad ldd r24, Y+62 ; 0x3e 336ac: 9f ad ldd r25, Y+63 ; 0x3f 336ae: a6 97 sbiw r28, 0x26 ; 38 336b0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 336b4: 20 e0 ldi r18, 0x00 ; 0 336b6: 30 e0 ldi r19, 0x00 ; 0 336b8: 40 e0 ldi r20, 0x00 ; 0 336ba: 5f e3 ldi r21, 0x3F ; 63 336bc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 336c0: 6b 01 movw r12, r22 336c2: 7c 01 movw r14, r24 vec_x[0] = cos(a1) * MACHINE_AXIS_SCALE_X; 336c4: 0f 94 32 de call 0x3bc64 ; 0x3bc64 336c8: a2 96 adiw r28, 0x22 ; 34 336ca: 6c af std Y+60, r22 ; 0x3c 336cc: 7d af std Y+61, r23 ; 0x3d 336ce: 8e af std Y+62, r24 ; 0x3e 336d0: 9f af std Y+63, r25 ; 0x3f 336d2: a2 97 sbiw r28, 0x22 ; 34 336d4: 60 93 e2 13 sts 0x13E2, r22 ; 0x8013e2 336d8: 70 93 e3 13 sts 0x13E3, r23 ; 0x8013e3 336dc: 80 93 e4 13 sts 0x13E4, r24 ; 0x8013e4 336e0: 90 93 e5 13 sts 0x13E5, r25 ; 0x8013e5 vec_x[1] = sin(a1) * MACHINE_AXIS_SCALE_X; 336e4: c7 01 movw r24, r14 336e6: b6 01 movw r22, r12 336e8: 0f 94 f8 e0 call 0x3c1f0 ; 0x3c1f0 336ec: a6 96 adiw r28, 0x26 ; 38 336ee: 6c af std Y+60, r22 ; 0x3c 336f0: 7d af std Y+61, r23 ; 0x3d 336f2: 8e af std Y+62, r24 ; 0x3e 336f4: 9f af std Y+63, r25 ; 0x3f 336f6: a6 97 sbiw r28, 0x26 ; 38 336f8: 60 93 e6 13 sts 0x13E6, r22 ; 0x8013e6 336fc: 70 93 e7 13 sts 0x13E7, r23 ; 0x8013e7 33700: 80 93 e8 13 sts 0x13E8, r24 ; 0x8013e8 33704: 90 93 e9 13 sts 0x13E9, r25 ; 0x8013e9 vec_y[0] = -sin(a1) * MACHINE_AXIS_SCALE_Y; 33708: 9b 01 movw r18, r22 3370a: ac 01 movw r20, r24 3370c: 50 58 subi r21, 0x80 ; 128 3370e: aa 96 adiw r28, 0x2a ; 42 33710: 2c af std Y+60, r18 ; 0x3c 33712: 3d af std Y+61, r19 ; 0x3d 33714: 4e af std Y+62, r20 ; 0x3e 33716: 5f af std Y+63, r21 ; 0x3f 33718: aa 97 sbiw r28, 0x2a ; 42 3371a: 20 93 ea 13 sts 0x13EA, r18 ; 0x8013ea 3371e: 30 93 eb 13 sts 0x13EB, r19 ; 0x8013eb 33722: 40 93 ec 13 sts 0x13EC, r20 ; 0x8013ec 33726: 50 93 ed 13 sts 0x13ED, r21 ; 0x8013ed vec_y[1] = cos(a1) * MACHINE_AXIS_SCALE_Y; 3372a: a2 96 adiw r28, 0x22 ; 34 3372c: 8c ad ldd r24, Y+60 ; 0x3c 3372e: 9d ad ldd r25, Y+61 ; 0x3d 33730: ae ad ldd r26, Y+62 ; 0x3e 33732: bf ad ldd r27, Y+63 ; 0x3f 33734: a2 97 sbiw r28, 0x22 ; 34 33736: 80 93 ee 13 sts 0x13EE, r24 ; 0x8013ee 3373a: 90 93 ef 13 sts 0x13EF, r25 ; 0x8013ef 3373e: a0 93 f0 13 sts 0x13F0, r26 ; 0x8013f0 33742: b0 93 f1 13 sts 0x13F1, r27 ; 0x8013f1 // Refresh the offset. cntr[0] = 0.f; 33746: 10 92 f2 13 sts 0x13F2, r1 ; 0x8013f2 3374a: 10 92 f3 13 sts 0x13F3, r1 ; 0x8013f3 3374e: 10 92 f4 13 sts 0x13F4, r1 ; 0x8013f4 33752: 10 92 f5 13 sts 0x13F5, r1 ; 0x8013f5 cntr[1] = 0.f; 33756: 10 92 f6 13 sts 0x13F6, r1 ; 0x8013f6 3375a: 10 92 f7 13 sts 0x13F7, r1 ; 0x8013f7 3375e: 10 92 f8 13 sts 0x13F8, r1 ; 0x8013f8 33762: 10 92 f9 13 sts 0x13F9, r1 ; 0x8013f9 float wx = 0.f; 33766: 41 2c mov r4, r1 33768: 51 2c mov r5, r1 3376a: 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]; 3376c: cf 56 subi r28, 0x6F ; 111 3376e: df 4f sbci r29, 0xFF ; 255 33770: a8 81 ld r26, Y 33772: b9 81 ldd r27, Y+1 ; 0x01 33774: c1 59 subi r28, 0x91 ; 145 33776: d0 40 sbci r29, 0x00 ; 0 33778: 11 96 adiw r26, 0x01 ; 1 3377a: 8d 90 ld r8, X+ 3377c: 9d 90 ld r9, X+ 3377e: ad 90 ld r10, X+ 33780: bc 90 ld r11, X 33782: 14 97 sbiw r26, 0x04 ; 4 33784: 15 96 adiw r26, 0x05 ; 5 33786: 2d 91 ld r18, X+ 33788: 3d 91 ld r19, X+ 3378a: 4d 91 ld r20, X+ 3378c: 5c 91 ld r21, X 3378e: 18 97 sbiw r26, 0x08 ; 8 33790: 6e 96 adiw r28, 0x1e ; 30 33792: 2c af std Y+60, r18 ; 0x3c 33794: 3d af std Y+61, r19 ; 0x3d 33796: 4e af std Y+62, r20 ; 0x3e 33798: 5f af std Y+63, r21 ; 0x3f 3379a: 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); 3379c: cd 56 subi r28, 0x6D ; 109 3379e: df 4f sbci r29, 0xFF ; 255 337a0: e8 81 ld r30, Y 337a2: f9 81 ldd r31, Y+1 ; 0x01 337a4: c3 59 subi r28, 0x93 ; 147 337a6: d0 40 sbci r29, 0x00 ; 0 337a8: c5 90 lpm r12, Z+ 337aa: d5 90 lpm r13, Z+ 337ac: e5 90 lpm r14, Z+ 337ae: 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]; 337b0: a5 01 movw r20, r10 337b2: 94 01 movw r18, r8 337b4: a2 96 adiw r28, 0x22 ; 34 337b6: 6c ad ldd r22, Y+60 ; 0x3c 337b8: 7d ad ldd r23, Y+61 ; 0x3d 337ba: 8e ad ldd r24, Y+62 ; 0x3e 337bc: 9f ad ldd r25, Y+63 ; 0x3f 337be: a2 97 sbiw r28, 0x22 ; 34 337c0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 337c4: ae 96 adiw r28, 0x2e ; 46 337c6: 6c af std Y+60, r22 ; 0x3c 337c8: 7d af std Y+61, r23 ; 0x3d 337ca: 8e af std Y+62, r24 ; 0x3e 337cc: 9f af std Y+63, r25 ; 0x3f 337ce: ae 97 sbiw r28, 0x2e ; 46 337d0: 6e 96 adiw r28, 0x1e ; 30 337d2: 2c ad ldd r18, Y+60 ; 0x3c 337d4: 3d ad ldd r19, Y+61 ; 0x3d 337d6: 4e ad ldd r20, Y+62 ; 0x3e 337d8: 5f ad ldd r21, Y+63 ; 0x3f 337da: 6e 97 sbiw r28, 0x1e ; 30 337dc: aa 96 adiw r28, 0x2a ; 42 337de: 6c ad ldd r22, Y+60 ; 0x3c 337e0: 7d ad ldd r23, Y+61 ; 0x3d 337e2: 8e ad ldd r24, Y+62 ; 0x3e 337e4: 9f ad ldd r25, Y+63 ; 0x3f 337e6: aa 97 sbiw r28, 0x2a ; 42 337e8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 337ec: 9b 01 movw r18, r22 337ee: ac 01 movw r20, r24 337f0: ae 96 adiw r28, 0x2e ; 46 337f2: 6c ad ldd r22, Y+60 ; 0x3c 337f4: 7d ad ldd r23, Y+61 ; 0x3d 337f6: 8e ad ldd r24, Y+62 ; 0x3e 337f8: 9f ad ldd r25, Y+63 ; 0x3f 337fa: ae 97 sbiw r28, 0x2e ; 46 337fc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33800: 9b 01 movw r18, r22 33802: 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); 33804: c7 01 movw r24, r14 33806: b6 01 movw r22, r12 33808: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3380c: 20 91 f2 13 lds r18, 0x13F2 ; 0x8013f2 33810: 30 91 f3 13 lds r19, 0x13F3 ; 0x8013f3 33814: 40 91 f4 13 lds r20, 0x13F4 ; 0x8013f4 33818: 50 91 f5 13 lds r21, 0x13F5 ; 0x8013f5 3381c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33820: 6b 01 movw r12, r22 33822: 7c 01 movw r14, r24 33824: c0 92 f2 13 sts 0x13F2, r12 ; 0x8013f2 33828: d0 92 f3 13 sts 0x13F3, r13 ; 0x8013f3 3382c: e0 92 f4 13 sts 0x13F4, r14 ; 0x8013f4 33830: f0 92 f5 13 sts 0x13F5, r15 ; 0x8013f5 wx += w; 33834: 20 e0 ldi r18, 0x00 ; 0 33836: 30 e0 ldi r19, 0x00 ; 0 33838: 40 e8 ldi r20, 0x80 ; 128 3383a: 5f e3 ldi r21, 0x3F ; 63 3383c: c3 01 movw r24, r6 3383e: b2 01 movw r22, r4 33840: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33844: 2b 01 movw r4, r22 33846: 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); 33848: cd 56 subi r28, 0x6D ; 109 3384a: df 4f sbci r29, 0xFF ; 255 3384c: e8 81 ld r30, Y 3384e: f9 81 ldd r31, Y+1 ; 0x01 33850: c3 59 subi r28, 0x93 ; 147 33852: d0 40 sbci r29, 0x00 ; 0 33854: 34 96 adiw r30, 0x04 ; 4 33856: 25 91 lpm r18, Z+ 33858: 35 91 lpm r19, Z+ 3385a: 45 91 lpm r20, Z+ 3385c: 54 91 lpm r21, Z 3385e: ae 96 adiw r28, 0x2e ; 46 33860: 2c af std Y+60, r18 ; 0x3c 33862: 3d af std Y+61, r19 ; 0x3d 33864: 4e af std Y+62, r20 ; 0x3e 33866: 5f af std Y+63, r21 ; 0x3f 33868: 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]; 3386a: a5 01 movw r20, r10 3386c: 94 01 movw r18, r8 3386e: a6 96 adiw r28, 0x26 ; 38 33870: 6c ad ldd r22, Y+60 ; 0x3c 33872: 7d ad ldd r23, Y+61 ; 0x3d 33874: 8e ad ldd r24, Y+62 ; 0x3e 33876: 9f ad ldd r25, Y+63 ; 0x3f 33878: a6 97 sbiw r28, 0x26 ; 38 3387a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3387e: 4b 01 movw r8, r22 33880: 5c 01 movw r10, r24 33882: 6e 96 adiw r28, 0x1e ; 30 33884: 2c ad ldd r18, Y+60 ; 0x3c 33886: 3d ad ldd r19, Y+61 ; 0x3d 33888: 4e ad ldd r20, Y+62 ; 0x3e 3388a: 5f ad ldd r21, Y+63 ; 0x3f 3388c: 6e 97 sbiw r28, 0x1e ; 30 3388e: a2 96 adiw r28, 0x22 ; 34 33890: 6c ad ldd r22, Y+60 ; 0x3c 33892: 7d ad ldd r23, Y+61 ; 0x3d 33894: 8e ad ldd r24, Y+62 ; 0x3e 33896: 9f ad ldd r25, Y+63 ; 0x3f 33898: a2 97 sbiw r28, 0x22 ; 34 3389a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3389e: 9b 01 movw r18, r22 338a0: ac 01 movw r20, r24 338a2: c5 01 movw r24, r10 338a4: b4 01 movw r22, r8 338a6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 338aa: 9b 01 movw r18, r22 338ac: 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); 338ae: ae 96 adiw r28, 0x2e ; 46 338b0: 6c ad ldd r22, Y+60 ; 0x3c 338b2: 7d ad ldd r23, Y+61 ; 0x3d 338b4: 8e ad ldd r24, Y+62 ; 0x3e 338b6: 9f ad ldd r25, Y+63 ; 0x3f 338b8: ae 97 sbiw r28, 0x2e ; 46 338ba: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 338be: 20 91 f6 13 lds r18, 0x13F6 ; 0x8013f6 338c2: 30 91 f7 13 lds r19, 0x13F7 ; 0x8013f7 338c6: 40 91 f8 13 lds r20, 0x13F8 ; 0x8013f8 338ca: 50 91 f9 13 lds r21, 0x13F9 ; 0x8013f9 338ce: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 338d2: 4b 01 movw r8, r22 338d4: 5c 01 movw r10, r24 338d6: 80 92 f6 13 sts 0x13F6, r8 ; 0x8013f6 338da: 90 92 f7 13 sts 0x13F7, r9 ; 0x8013f7 338de: a0 92 f8 13 sts 0x13F8, r10 ; 0x8013f8 338e2: b0 92 f9 13 sts 0x13F9, r11 ; 0x8013f9 338e6: cf 56 subi r28, 0x6F ; 111 338e8: df 4f sbci r29, 0xFF ; 255 338ea: 48 81 ld r20, Y 338ec: 59 81 ldd r21, Y+1 ; 0x01 338ee: c1 59 subi r28, 0x91 ; 145 338f0: d0 40 sbci r29, 0x00 ; 0 338f2: 48 5f subi r20, 0xF8 ; 248 338f4: 5f 4f sbci r21, 0xFF ; 255 338f6: cf 56 subi r28, 0x6F ; 111 338f8: df 4f sbci r29, 0xFF ; 255 338fa: 59 83 std Y+1, r21 ; 0x01 338fc: 48 83 st Y, r20 338fe: c1 59 subi r28, 0x91 ; 145 33900: d0 40 sbci r29, 0x00 ; 0 33902: cd 56 subi r28, 0x6D ; 109 33904: df 4f sbci r29, 0xFF ; 255 33906: 88 81 ld r24, Y 33908: 99 81 ldd r25, Y+1 ; 0x01 3390a: c3 59 subi r28, 0x93 ; 147 3390c: d0 40 sbci r29, 0x00 ; 0 3390e: 08 96 adiw r24, 0x08 ; 8 33910: cd 56 subi r28, 0x6D ; 109 33912: df 4f sbci r29, 0xFF ; 255 33914: 99 83 std Y+1, r25 ; 0x01 33916: 88 83 st Y, r24 33918: c3 59 subi r28, 0x93 ; 147 3391a: 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) { 3391c: 24 16 cp r2, r20 3391e: 35 06 cpc r3, r21 33920: 09 f0 breq .+2 ; 0x33924 33922: 24 cf rjmp .-440 ; 0x3376c SERIAL_ECHOLNPGM(""); } #endif // SUPPORT_VERBOSITY } cntr[0] /= wx; 33924: a3 01 movw r20, r6 33926: 92 01 movw r18, r4 33928: c7 01 movw r24, r14 3392a: b6 01 movw r22, r12 3392c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 33930: 60 93 f2 13 sts 0x13F2, r22 ; 0x8013f2 33934: 70 93 f3 13 sts 0x13F3, r23 ; 0x8013f3 33938: 80 93 f4 13 sts 0x13F4, r24 ; 0x8013f4 3393c: 90 93 f5 13 sts 0x13F5, r25 ; 0x8013f5 cntr[1] /= wy; 33940: a3 01 movw r20, r6 33942: 92 01 movw r18, r4 33944: c5 01 movw r24, r10 33946: b4 01 movw r22, r8 33948: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3394c: 60 93 f6 13 sts 0x13F6, r22 ; 0x8013f6 33950: 70 93 f7 13 sts 0x13F7, r23 ; 0x8013f7 33954: 80 93 f8 13 sts 0x13F8, r24 ; 0x8013f8 33958: 90 93 f9 13 sts 0x13F9, r25 ; 0x8013f9 #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]; 3395c: 40 90 e2 13 lds r4, 0x13E2 ; 0x8013e2 33960: 50 90 e3 13 lds r5, 0x13E3 ; 0x8013e3 33964: 60 90 e4 13 lds r6, 0x13E4 ; 0x8013e4 33968: 70 90 e5 13 lds r7, 0x13E5 ; 0x8013e5 3396c: c0 90 ee 13 lds r12, 0x13EE ; 0x8013ee 33970: d0 90 ef 13 lds r13, 0x13EF ; 0x8013ef 33974: e0 90 f0 13 lds r14, 0x13F0 ; 0x8013f0 33978: f0 90 f1 13 lds r15, 0x13F1 ; 0x8013f1 3397c: 20 91 e6 13 lds r18, 0x13E6 ; 0x8013e6 33980: 30 91 e7 13 lds r19, 0x13E7 ; 0x8013e7 33984: 40 91 e8 13 lds r20, 0x13E8 ; 0x8013e8 33988: 50 91 e9 13 lds r21, 0x13E9 ; 0x8013e9 3398c: a2 96 adiw r28, 0x22 ; 34 3398e: 2c af std Y+60, r18 ; 0x3c 33990: 3d af std Y+61, r19 ; 0x3d 33992: 4e af std Y+62, r20 ; 0x3e 33994: 5f af std Y+63, r21 ; 0x3f 33996: a2 97 sbiw r28, 0x22 ; 34 33998: 80 91 ea 13 lds r24, 0x13EA ; 0x8013ea 3399c: 90 91 eb 13 lds r25, 0x13EB ; 0x8013eb 339a0: a0 91 ec 13 lds r26, 0x13EC ; 0x8013ec 339a4: b0 91 ed 13 lds r27, 0x13ED ; 0x8013ed 339a8: a6 96 adiw r28, 0x26 ; 38 339aa: 8c af std Y+60, r24 ; 0x3c 339ac: 9d af std Y+61, r25 ; 0x3d 339ae: ae af std Y+62, r26 ; 0x3e 339b0: bf af std Y+63, r27 ; 0x3f 339b2: a6 97 sbiw r28, 0x26 ; 38 339b4: a7 01 movw r20, r14 339b6: 96 01 movw r18, r12 339b8: c3 01 movw r24, r6 339ba: b2 01 movw r22, r4 339bc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 339c0: 4b 01 movw r8, r22 339c2: 5c 01 movw r10, r24 339c4: a6 96 adiw r28, 0x26 ; 38 339c6: 2c ad ldd r18, Y+60 ; 0x3c 339c8: 3d ad ldd r19, Y+61 ; 0x3d 339ca: 4e ad ldd r20, Y+62 ; 0x3e 339cc: 5f ad ldd r21, Y+63 ; 0x3f 339ce: a6 97 sbiw r28, 0x26 ; 38 339d0: a2 96 adiw r28, 0x22 ; 34 339d2: 6c ad ldd r22, Y+60 ; 0x3c 339d4: 7d ad ldd r23, Y+61 ; 0x3d 339d6: 8e ad ldd r24, Y+62 ; 0x3e 339d8: 9f ad ldd r25, Y+63 ; 0x3f 339da: a2 97 sbiw r28, 0x22 ; 34 339dc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 339e0: 9b 01 movw r18, r22 339e2: ac 01 movw r20, r24 339e4: c5 01 movw r24, r10 339e6: b4 01 movw r22, r8 339e8: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 339ec: 4b 01 movw r8, r22 339ee: 5c 01 movw r10, r24 float Ainv[2][2] = { { vec_y[1] / d, -vec_y[0] / d }, 339f0: ac 01 movw r20, r24 339f2: 9b 01 movw r18, r22 339f4: c7 01 movw r24, r14 339f6: b6 01 movw r22, r12 339f8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 339fc: 6b 01 movw r12, r22 339fe: 7c 01 movw r14, r24 33a00: a6 96 adiw r28, 0x26 ; 38 33a02: 6c ad ldd r22, Y+60 ; 0x3c 33a04: 7d ad ldd r23, Y+61 ; 0x3d 33a06: 8e ad ldd r24, Y+62 ; 0x3e 33a08: 9f ad ldd r25, Y+63 ; 0x3f 33a0a: a6 97 sbiw r28, 0x26 ; 38 33a0c: 90 58 subi r25, 0x80 ; 128 33a0e: a5 01 movw r20, r10 33a10: 94 01 movw r18, r8 33a12: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 33a16: a6 96 adiw r28, 0x26 ; 38 33a18: 6c af std Y+60, r22 ; 0x3c 33a1a: 7d af std Y+61, r23 ; 0x3d 33a1c: 8e af std Y+62, r24 ; 0x3e 33a1e: 9f af std Y+63, r25 ; 0x3f 33a20: a6 97 sbiw r28, 0x26 ; 38 { -vec_x[1] / d, vec_x[0] / d } 33a22: a2 96 adiw r28, 0x22 ; 34 33a24: 6c ad ldd r22, Y+60 ; 0x3c 33a26: 7d ad ldd r23, Y+61 ; 0x3d 33a28: 8e ad ldd r24, Y+62 ; 0x3e 33a2a: 9f ad ldd r25, Y+63 ; 0x3f 33a2c: a2 97 sbiw r28, 0x22 ; 34 33a2e: 90 58 subi r25, 0x80 ; 128 33a30: a5 01 movw r20, r10 33a32: 94 01 movw r18, r8 33a34: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 33a38: aa 96 adiw r28, 0x2a ; 42 33a3a: 6c af std Y+60, r22 ; 0x3c 33a3c: 7d af std Y+61, r23 ; 0x3d 33a3e: 8e af std Y+62, r24 ; 0x3e 33a40: 9f af std Y+63, r25 ; 0x3f 33a42: aa 97 sbiw r28, 0x2a ; 42 33a44: a5 01 movw r20, r10 33a46: 94 01 movw r18, r8 33a48: c3 01 movw r24, r6 33a4a: b2 01 movw r22, r4 33a4c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 33a50: 4b 01 movw r8, r22 33a52: 5c 01 movw r10, r24 }; float cntrInv[2] = { -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1], 33a54: 40 90 f2 13 lds r4, 0x13F2 ; 0x8013f2 33a58: 50 90 f3 13 lds r5, 0x13F3 ; 0x8013f3 33a5c: 60 90 f4 13 lds r6, 0x13F4 ; 0x8013f4 33a60: 70 90 f5 13 lds r7, 0x13F5 ; 0x8013f5 33a64: 20 91 f6 13 lds r18, 0x13F6 ; 0x8013f6 33a68: 30 91 f7 13 lds r19, 0x13F7 ; 0x8013f7 33a6c: 40 91 f8 13 lds r20, 0x13F8 ; 0x8013f8 33a70: 50 91 f9 13 lds r21, 0x13F9 ; 0x8013f9 33a74: a2 96 adiw r28, 0x22 ; 34 33a76: 2c af std Y+60, r18 ; 0x3c 33a78: 3d af std Y+61, r19 ; 0x3d 33a7a: 4e af std Y+62, r20 ; 0x3e 33a7c: 5f af std Y+63, r21 ; 0x3f 33a7e: a2 97 sbiw r28, 0x22 ; 34 -Ainv[1][0] * cntr[0] - Ainv[1][1] * cntr[1] }; vec_x[0] = Ainv[0][0]; 33a80: c0 92 e2 13 sts 0x13E2, r12 ; 0x8013e2 33a84: d0 92 e3 13 sts 0x13E3, r13 ; 0x8013e3 33a88: e0 92 e4 13 sts 0x13E4, r14 ; 0x8013e4 33a8c: f0 92 e5 13 sts 0x13E5, r15 ; 0x8013e5 vec_x[1] = Ainv[1][0]; 33a90: aa 96 adiw r28, 0x2a ; 42 33a92: 8c ad ldd r24, Y+60 ; 0x3c 33a94: 9d ad ldd r25, Y+61 ; 0x3d 33a96: ae ad ldd r26, Y+62 ; 0x3e 33a98: bf ad ldd r27, Y+63 ; 0x3f 33a9a: aa 97 sbiw r28, 0x2a ; 42 33a9c: 80 93 e6 13 sts 0x13E6, r24 ; 0x8013e6 33aa0: 90 93 e7 13 sts 0x13E7, r25 ; 0x8013e7 33aa4: a0 93 e8 13 sts 0x13E8, r26 ; 0x8013e8 33aa8: b0 93 e9 13 sts 0x13E9, r27 ; 0x8013e9 vec_y[0] = Ainv[0][1]; 33aac: a6 96 adiw r28, 0x26 ; 38 33aae: 2c ad ldd r18, Y+60 ; 0x3c 33ab0: 3d ad ldd r19, Y+61 ; 0x3d 33ab2: 4e ad ldd r20, Y+62 ; 0x3e 33ab4: 5f ad ldd r21, Y+63 ; 0x3f 33ab6: a6 97 sbiw r28, 0x26 ; 38 33ab8: 20 93 ea 13 sts 0x13EA, r18 ; 0x8013ea 33abc: 30 93 eb 13 sts 0x13EB, r19 ; 0x8013eb 33ac0: 40 93 ec 13 sts 0x13EC, r20 ; 0x8013ec 33ac4: 50 93 ed 13 sts 0x13ED, r21 ; 0x8013ed vec_y[1] = Ainv[1][1]; 33ac8: 80 92 ee 13 sts 0x13EE, r8 ; 0x8013ee 33acc: 90 92 ef 13 sts 0x13EF, r9 ; 0x8013ef 33ad0: a0 92 f0 13 sts 0x13F0, r10 ; 0x8013f0 33ad4: b0 92 f1 13 sts 0x13F1, r11 ; 0x8013f1 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], 33ad8: c7 01 movw r24, r14 33ada: b6 01 movw r22, r12 33adc: 90 58 subi r25, 0x80 ; 128 33ade: a3 01 movw r20, r6 33ae0: 92 01 movw r18, r4 33ae2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33ae6: 6b 01 movw r12, r22 33ae8: 7c 01 movw r14, r24 33aea: a2 96 adiw r28, 0x22 ; 34 33aec: 2c ad ldd r18, Y+60 ; 0x3c 33aee: 3d ad ldd r19, Y+61 ; 0x3d 33af0: 4e ad ldd r20, Y+62 ; 0x3e 33af2: 5f ad ldd r21, Y+63 ; 0x3f 33af4: a2 97 sbiw r28, 0x22 ; 34 33af6: a6 96 adiw r28, 0x26 ; 38 33af8: 6c ad ldd r22, Y+60 ; 0x3c 33afa: 7d ad ldd r23, Y+61 ; 0x3d 33afc: 8e ad ldd r24, Y+62 ; 0x3e 33afe: 9f ad ldd r25, Y+63 ; 0x3f 33b00: a6 97 sbiw r28, 0x26 ; 38 33b02: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33b06: 9b 01 movw r18, r22 33b08: ac 01 movw r20, r24 33b0a: c7 01 movw r24, r14 33b0c: b6 01 movw r22, r12 33b0e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__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]; 33b12: 60 93 f2 13 sts 0x13F2, r22 ; 0x8013f2 33b16: 70 93 f3 13 sts 0x13F3, r23 ; 0x8013f3 33b1a: 80 93 f4 13 sts 0x13F4, r24 ; 0x8013f4 33b1e: 90 93 f5 13 sts 0x13F5, r25 ; 0x8013f5 { 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] 33b22: aa 96 adiw r28, 0x2a ; 42 33b24: 6c ad ldd r22, Y+60 ; 0x3c 33b26: 7d ad ldd r23, Y+61 ; 0x3d 33b28: 8e ad ldd r24, Y+62 ; 0x3e 33b2a: 9f ad ldd r25, Y+63 ; 0x3f 33b2c: aa 97 sbiw r28, 0x2a ; 42 33b2e: 90 58 subi r25, 0x80 ; 128 33b30: a3 01 movw r20, r6 33b32: 92 01 movw r18, r4 33b34: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33b38: 6b 01 movw r12, r22 33b3a: 7c 01 movw r14, r24 33b3c: a2 96 adiw r28, 0x22 ; 34 33b3e: 2c ad ldd r18, Y+60 ; 0x3c 33b40: 3d ad ldd r19, Y+61 ; 0x3d 33b42: 4e ad ldd r20, Y+62 ; 0x3e 33b44: 5f ad ldd r21, Y+63 ; 0x3f 33b46: a2 97 sbiw r28, 0x22 ; 34 33b48: c5 01 movw r24, r10 33b4a: b4 01 movw r22, r8 33b4c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33b50: 9b 01 movw r18, r22 33b52: ac 01 movw r20, r24 33b54: c7 01 movw r24, r14 33b56: b6 01 movw r22, r12 33b58: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__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]; 33b5c: 60 93 f6 13 sts 0x13F6, r22 ; 0x8013f6 33b60: 70 93 f7 13 sts 0x13F7, r23 ; 0x8013f7 33b64: 80 93 f8 13 sts 0x13F8, r24 ; 0x8013f8 33b68: 90 93 f9 13 sts 0x13F9, r25 ; 0x8013f9 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 33b6c: 90 e0 ldi r25, 0x00 ; 0 33b6e: 80 e0 ldi r24, 0x00 ; 0 33b70: 0e 94 84 8c call 0x11908 ; 0x11908 if (result >= 0) { 33b74: 17 fd sbrc r17, 7 33b76: d5 c0 rjmp .+426 ; 0x33d22 DBG(_n("Calibration success.\n")); 33b78: 8f ec ldi r24, 0xCF ; 207 33b7a: 9f e6 ldi r25, 0x6F ; 111 33b7c: 9f 93 push r25 33b7e: 8f 93 push r24 33b80: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 world2machine_update(vec_x, vec_y, cntr); 33b84: 42 ef ldi r20, 0xF2 ; 242 33b86: 53 e1 ldi r21, 0x13 ; 19 33b88: 6a ee ldi r22, 0xEA ; 234 33b8a: 73 e1 ldi r23, 0x13 ; 19 33b8c: 82 ee ldi r24, 0xE2 ; 226 33b8e: 93 e1 ldi r25, 0x13 ; 19 33b90: 0f 94 a8 cc call 0x39950 ; 0x39950 #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); 33b94: 48 e0 ldi r20, 0x08 ; 8 33b96: 50 e0 ldi r21, 0x00 ; 0 33b98: 65 ee ldi r22, 0xE5 ; 229 33b9a: 7f e0 ldi r23, 0x0F ; 15 33b9c: 82 ef ldi r24, 0xF2 ; 242 33b9e: 93 e1 ldi r25, 0x13 ; 19 33ba0: 0f 94 24 dc call 0x3b848 ; 0x3b848 33ba4: 48 e0 ldi r20, 0x08 ; 8 33ba6: 50 e0 ldi r21, 0x00 ; 0 33ba8: 6d ed ldi r22, 0xDD ; 221 33baa: 7f e0 ldi r23, 0x0F ; 15 33bac: 82 ee ldi r24, 0xE2 ; 226 33bae: 93 e1 ldi r25, 0x13 ; 19 33bb0: 0f 94 24 dc call 0x3b848 ; 0x3b848 33bb4: 48 e0 ldi r20, 0x08 ; 8 33bb6: 50 e0 ldi r21, 0x00 ; 0 33bb8: 65 ed ldi r22, 0xD5 ; 213 33bba: 7f e0 ldi r23, 0x0F ; 15 33bbc: 8a ee ldi r24, 0xEA ; 234 33bbe: 93 e1 ldi r25, 0x13 ; 19 33bc0: 0f 94 24 dc call 0x3b848 ; 0x3b848 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(); 33bc4: 0f 94 2d cc call 0x3985a ; 0x3985a } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ DBG(_n("Fitting failed => calibration failed.\n")); 33bc8: 0f 90 pop r0 33bca: 0f 90 pop r0 BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); clean_up_after_endstop_move(l_feedmultiply); 33bcc: c7 55 subi r28, 0x57 ; 87 33bce: df 4f sbci r29, 0xFF ; 255 33bd0: 88 81 ld r24, Y 33bd2: 99 81 ldd r25, Y+1 ; 0x01 33bd4: c9 5a subi r28, 0xA9 ; 169 33bd6: d0 40 sbci r29, 0x00 ; 0 33bd8: 0e 94 66 66 call 0xcccc ; 0xcccc // Print head up. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 33bdc: 80 e0 ldi r24, 0x00 ; 0 33bde: 90 e0 ldi r25, 0x00 ; 0 33be0: a0 ea ldi r26, 0xA0 ; 160 33be2: b0 e4 ldi r27, 0x40 ; 64 33be4: 80 93 99 06 sts 0x0699, r24 ; 0x800699 33be8: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 33bec: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 33bf0: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40); 33bf4: 60 e0 ldi r22, 0x00 ; 0 33bf6: 70 e0 ldi r23, 0x00 ; 0 33bf8: 80 ea ldi r24, 0xA0 ; 160 33bfa: 91 e4 ldi r25, 0x41 ; 65 33bfc: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 33c00: 0f 94 a9 43 call 0x28752 ; 0x28752 //#ifndef NEW_XYZCAL if (result >= 0) 33c04: 17 fd sbrc r17, 7 33c06: 22 c0 rjmp .+68 ; 0x33c4c 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; 33c08: 10 92 99 06 sts 0x0699, r1 ; 0x800699 33c0c: 10 92 9a 06 sts 0x069A, r1 ; 0x80069a 33c10: 10 92 9b 06 sts 0x069B, r1 ; 0x80069b 33c14: 10 92 9c 06 sts 0x069C, r1 ; 0x80069c destination[Z_AXIS] = 150.F; 33c18: 80 e0 ldi r24, 0x00 ; 0 33c1a: 90 e0 ldi r25, 0x00 ; 0 33c1c: a6 e1 ldi r26, 0x16 ; 22 33c1e: b3 e4 ldi r27, 0x43 ; 67 33c20: 80 93 7b 06 sts 0x067B, r24 ; 0x80067b 33c24: 90 93 7c 06 sts 0x067C, r25 ; 0x80067c 33c28: a0 93 7d 06 sts 0x067D, r26 ; 0x80067d 33c2c: b0 93 7e 06 sts 0x067E, r27 ; 0x80067e plan_buffer_line_destinationXYZE(homing_feedrate[Z_AXIS] / 60); 33c30: 65 e5 ldi r22, 0x55 ; 85 33c32: 75 e5 ldi r23, 0x55 ; 85 33c34: 85 e5 ldi r24, 0x55 ; 85 33c36: 91 e4 ldi r25, 0x41 ; 65 33c38: 0f 94 0a c0 call 0x38014 ; 0x38014 lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET)); 33c3c: 85 e9 ldi r24, 0x95 ; 149 33c3e: 99 e5 ldi r25, 0x59 ; 89 33c40: 0e 94 44 72 call 0xe488 ; 0xe488 33c44: 0f 94 cd 20 call 0x2419a ; 0x2419a // 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()) 33c48: 0f 94 3c ca call 0x39478 ; 0x39478 st_synchronize(); // if (result >= 0) babystep_apply(); #endif //HEATBED_V2 } //#endif //NEW_XYZCAL lcd_update_enable(true); 33c4c: 81 e0 ldi r24, 0x01 ; 1 33c4e: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_update(2); 33c52: 82 e0 ldi r24, 0x02 ; 2 33c54: 0e 94 3f 6e call 0xdc7e ; 0xdc7e 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)); 33c58: 86 e5 ldi r24, 0x56 ; 86 33c5a: 99 e5 ldi r25, 0x59 ; 89 } 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) { 33c5c: 1f 3f cpi r17, 0xFF ; 255 33c5e: 99 f0 breq .+38 ; 0x33c86 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) { 33c60: 1e 3f cpi r17, 0xFE ; 254 33c62: 09 f0 breq .+2 ; 0x33c66 33c64: 73 c0 rjmp .+230 ; 0x33d4c if (point_too_far_mask == 0) 33c66: af 96 adiw r28, 0x2f ; 47 33c68: 4f ad ldd r20, Y+63 ; 0x3f 33c6a: af 97 sbiw r28, 0x2f ; 47 msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); 33c6c: 81 e2 ldi r24, 0x21 ; 33 33c6e: 99 e5 ldi r25, 0x59 ; 89 { 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) 33c70: 44 23 and r20, r20 33c72: 49 f0 breq .+18 ; 0x33c86 msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); else if (point_too_far_mask == 2 || point_too_far_mask == 7) 33c74: af 96 adiw r28, 0x2f ; 47 33c76: 5f ad ldd r21, Y+63 ; 0x3f 33c78: 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); 33c7a: 8f ed ldi r24, 0xDF ; 223 33c7c: 98 e5 ldi r25, 0x58 ; 88 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) 33c7e: 52 30 cpi r21, 0x02 ; 2 33c80: 11 f0 breq .+4 ; 0x33c86 // 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); 33c82: 88 e9 ldi r24, 0x98 ; 152 33c84: 98 e5 ldi r25, 0x58 ; 88 33c86: 0e 94 44 72 call 0xe488 ; 0xe488 33c8a: 0d 94 95 92 jmp 0x3252a ; 0x3252a (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]) : 33c8e: f2 01 movw r30, r4 33c90: 25 81 ldd r18, Z+5 ; 0x05 33c92: 36 81 ldd r19, Z+6 ; 0x06 33c94: 47 81 ldd r20, Z+7 ; 0x07 33c96: 50 85 ldd r21, Z+8 ; 0x08 33c98: c3 58 subi r28, 0x83 ; 131 33c9a: df 4f sbci r29, 0xFF ; 255 33c9c: 68 81 ld r22, Y 33c9e: 79 81 ldd r23, Y+1 ; 0x01 33ca0: 8a 81 ldd r24, Y+2 ; 0x02 33ca2: 9b 81 ldd r25, Y+3 ; 0x03 33ca4: cd 57 subi r28, 0x7D ; 125 33ca6: d0 40 sbci r29, 0x00 ; 0 33ca8: 0d 94 81 95 jmp 0x32b02 ; 0x32b02 // 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]) : 33cac: f2 01 movw r30, r4 33cae: 25 81 ldd r18, Z+5 ; 0x05 33cb0: 36 81 ldd r19, Z+6 ; 0x06 33cb2: 47 81 ldd r20, Z+7 ; 0x07 33cb4: 50 85 ldd r21, Z+8 ; 0x08 33cb6: ed 96 adiw r28, 0x3d ; 61 33cb8: 6c ad ldd r22, Y+60 ; 0x3c 33cba: 7d ad ldd r23, Y+61 ; 0x3d 33cbc: 8e ad ldd r24, Y+62 ; 0x3e 33cbe: 9f ad ldd r25, Y+63 ; 0x3f 33cc0: ed 97 sbiw r28, 0x3d ; 61 33cc2: b8 c0 rjmp .+368 ; 0x33e34 (-s2 * measured_pts[2 * i + 1])); float b = (c == 1) ? 1.f : ((c == 2) ? ( c1 * measured_pts[2 * i]) : 33cc4: f2 01 movw r30, r4 33cc6: 25 81 ldd r18, Z+5 ; 0x05 33cc8: 36 81 ldd r19, Z+6 ; 0x06 33cca: 47 81 ldd r20, Z+7 ; 0x07 33ccc: 50 85 ldd r21, Z+8 ; 0x08 33cce: ed 96 adiw r28, 0x3d ; 61 33cd0: 6c ad ldd r22, Y+60 ; 0x3c 33cd2: 7d ad ldd r23, Y+61 ; 0x3d 33cd4: 8e ad ldd r24, Y+62 ; 0x3e 33cd6: 9f ad ldd r25, Y+63 ; 0x3f 33cd8: ed 97 sbiw r28, 0x3d ; 61 33cda: c6 c0 rjmp .+396 ; 0x33e68 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]) : 33cdc: a3 01 movw r20, r6 33cde: 92 01 movw r18, r4 33ce0: c3 58 subi r28, 0x83 ; 131 33ce2: df 4f sbci r29, 0xFF ; 255 33ce4: 68 81 ld r22, Y 33ce6: 79 81 ldd r23, Y+1 ; 0x01 33ce8: 8a 81 ldd r24, Y+2 ; 0x02 33cea: 9b 81 ldd r25, Y+3 ; 0x03 33cec: cd 57 subi r28, 0x7D ; 125 33cee: d0 40 sbci r29, 0x00 ; 0 33cf0: 0d 94 e9 95 jmp 0x32bd2 ; 0x32bd2 // J^T times f(x) acc = 0.f; for (uint8_t i = 0; i < npts; ++i) { { float j = (r == 0) ? 1.f : 33cf4: 81 2c mov r8, r1 33cf6: 91 2c mov r9, r1 33cf8: 20 e8 ldi r18, 0x80 ; 128 33cfa: a2 2e mov r10, r18 33cfc: 2f e3 ldi r18, 0x3F ; 63 33cfe: b2 2e mov r11, r18 33d00: 0d 94 ed 95 jmp 0x32bda ; 0x32bda float w = point_weight_x(i, measured_pts[2 * i + 1]); acc += j * fx * w; } { float j = (r == 0) ? 0.f : 33d04: c1 2c mov r12, r1 33d06: d1 2c mov r13, r1 33d08: 76 01 movw r14, r12 33d0a: 0d 94 64 96 jmp 0x32cc8 ; 0x32cc8 ((r == 1) ? 1.f : 33d0e: c1 2c mov r12, r1 33d10: d1 2c mov r13, r1 33d12: 90 e8 ldi r25, 0x80 ; 128 33d14: e9 2e mov r14, r25 33d16: 9f e3 ldi r25, 0x3F ; 63 33d18: f9 2e mov r15, r25 33d1a: 0d 94 64 96 jmp 0x32cc8 ; 0x32cc8 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; 33d1e: 12 e0 ldi r17, 0x02 ; 2 33d20: a7 cb rjmp .-2226 ; 0x33470 } } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ 33d22: 1e 3f cpi r17, 0xFE ; 254 33d24: 89 f4 brne .+34 ; 0x33d48 33d26: af 96 adiw r28, 0x2f ; 47 33d28: 3f ad ldd r19, Y+63 ; 0x3f 33d2a: af 97 sbiw r28, 0x2f ; 47 33d2c: 32 30 cpi r19, 0x02 ; 2 33d2e: 09 f0 breq .+2 ; 0x33d32 33d30: 4d cf rjmp .-358 ; 0x33bcc DBG(_n("Fitting failed => calibration failed.\n")); 33d32: 88 ea ldi r24, 0xA8 ; 168 33d34: 9f e6 ldi r25, 0x6F ; 111 33d36: 9f 93 push r25 33d38: 8f 93 push r24 33d3a: 0f 94 d2 da call 0x3b5a4 ; 0x3b5a4 33d3e: 44 cf rjmp .-376 ; 0x33bc8 // 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; 33d40: af 96 adiw r28, 0x2f ; 47 33d42: 1f ae std Y+63, r1 ; 0x3f 33d44: af 97 sbiw r28, 0x2f ; 47 33d46: 42 cf rjmp .-380 ; 0x33bcc } } #endif // SUPPORT_VERBOSITY return result; } if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){ 33d48: 1f ef ldi r17, 0xFF ; 255 33d4a: 40 cf rjmp .-384 ; 0x33bcc 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) { 33d4c: af 96 adiw r28, 0x2f ; 47 33d4e: 6f ad ldd r22, Y+63 ; 0x3f 33d50: af 97 sbiw r28, 0x2f ; 47 33d52: 61 11 cpse r22, r1 33d54: 13 c0 rjmp .+38 ; 0x33d7c 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); 33d56: 8d e7 ldi r24, 0x7D ; 125 33d58: 97 e5 ldi r25, 0x57 ; 87 // 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) { 33d5a: 11 30 cpi r17, 0x01 ; 1 33d5c: 51 f0 breq .+20 ; 0x33d72 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); 33d5e: 8a e3 ldi r24, 0x3A ; 58 33d60: 97 e5 ldi r25, 0x57 ; 87 // 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) { 33d62: 12 30 cpi r17, 0x02 ; 2 33d64: 31 f0 breq .+12 ; 0x33d72 default: // should not happen msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED); 33d66: 81 e2 ldi r24, 0x21 ; 33 33d68: 99 e5 ldi r25, 0x59 ; 89 // 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) { 33d6a: 11 11 cpse r17, r1 33d6c: 02 c0 rjmp .+4 ; 0x33d72 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); 33d6e: 82 ec ldi r24, 0xC2 ; 194 33d70: 97 e5 ldi r25, 0x57 ; 87 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); 33d72: 0e 94 44 72 call 0xe488 ; 0xe488 break; } lcd_show_fullscreen_message_and_wait_P(msg); 33d76: 0f 94 cd 20 call 0x2419a ; 0x2419a 33d7a: 0d c0 rjmp .+26 ; 0x33d96 // 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) 33d7c: af 96 adiw r28, 0x2f ; 47 33d7e: 8f ad ldd r24, Y+63 ; 0x3f 33d80: af 97 sbiw r28, 0x2f ; 47 33d82: 82 30 cpi r24, 0x02 ; 2 33d84: f1 f4 brne .+60 ; 0x33dc2 // Only the center point or all the three front points. msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR); 33d86: 81 e5 ldi r24, 0x51 ; 81 33d88: 98 e5 ldi r25, 0x58 ; 88 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); 33d8a: 0e 94 44 72 call 0xe488 ; 0xe488 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); 33d8e: 0f 94 cd 20 call 0x2419a ; 0x2419a } if (point_too_far_mask == 0 || result > 0) { 33d92: 11 16 cp r1, r17 33d94: 04 f3 brlt .-64 ; 0x33d56 //#endif //NEW_XYZCAL lcd_update_enable(true); lcd_update(2); lcd_bed_calibration_show_result(result, point_too_far_mask); if (result >= 0) 33d96: 1f 3f cpi r17, 0xFF ; 255 33d98: 11 f4 brne .+4 ; 0x33d9e 33d9a: 0d 94 37 8e jmp 0x31c6e ; 0x31c6e { // 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); 33d9e: 86 e0 ldi r24, 0x06 ; 6 33da0: 0e 94 4b ef call 0x1de96 ; 0x1de96 if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) 33da4: 8f e5 ldi r24, 0x5F ; 95 33da6: 9f e0 ldi r25, 0x0F ; 15 33da8: 0f 94 10 dc call 0x3b820 ; 0x3b820 33dac: 81 11 cpse r24, r1 33dae: 0d 94 af 92 jmp 0x3255e ; 0x3255e lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET)); 33db2: 8c eb ldi r24, 0xBC ; 188 33db4: 99 e5 ldi r25, 0x59 ; 89 33db6: 0e 94 44 72 call 0xe488 ; 0xe488 33dba: 0f 94 cd 20 call 0x2419a ; 0x2419a 33dbe: 0d 94 af 92 jmp 0x3255e ; 0x3255e 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); 33dc2: 85 e0 ldi r24, 0x05 ; 5 33dc4: 98 e5 ldi r25, 0x58 ; 88 33dc6: e1 cf rjmp .-62 ; 0x33d8a 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)) 33dc8: 89 81 ldd r24, Y+1 ; 0x01 33dca: 9a 81 ldd r25, Y+2 ; 0x02 33dcc: 80 37 cpi r24, 0x70 ; 112 33dce: 98 40 sbci r25, 0x08 ; 8 33dd0: 10 f0 brcs .+4 ; 0x33dd6 33dd2: 0d 94 ee 92 jmp 0x325dc ; 0x325dc if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0) 33dd6: ae 01 movw r20, r28 33dd8: 4f 5f subi r20, 0xFF ; 255 33dda: 5f 4f sbci r21, 0xFF ; 255 33ddc: 7a 01 movw r14, r20 33dde: 04 eb ldi r16, 0xB4 ; 180 33de0: 10 e0 ldi r17, 0x00 ; 0 33de2: 24 e8 ldi r18, 0x84 ; 132 33de4: 33 e0 ldi r19, 0x03 ; 3 33de6: a6 01 movw r20, r12 33de8: 48 5c subi r20, 0xC8 ; 200 33dea: 51 09 sbc r21, r1 33dec: 69 2d mov r22, r9 33dee: 78 2d mov r23, r8 33df0: 8b 2d mov r24, r11 33df2: 9a 2d mov r25, r10 33df4: 0f 94 72 6f call 0x2dee4 ; 0x2dee4 33df8: 88 23 and r24, r24 33dfa: 11 f4 brne .+4 ; 0x33e00 33dfc: 0d 94 ee 92 jmp 0x325dc ; 0x325dc ad += 1440; 33e00: 89 81 ldd r24, Y+1 ; 0x01 33e02: 9a 81 ldd r25, Y+2 ; 0x02 33e04: 80 56 subi r24, 0x60 ; 96 33e06: 9a 4f sbci r25, 0xFA ; 250 33e08: 0d 94 11 90 jmp 0x32022 ; 0x32022 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) { 33e0c: 00 23 and r16, r16 33e0e: 11 f4 brne .+4 ; 0x33e14 33e10: 0d 94 94 95 jmp 0x32b28 ; 0x32b28 float a = (r == 1) ? 1.f : ((r == 2) ? ( c1 * measured_pts[2 * i]) : 33e14: 02 30 cpi r16, 0x02 ; 2 33e16: 09 f0 breq .+2 ; 0x33e1a 33e18: 49 cf rjmp .-366 ; 0x33cac 33e1a: d2 01 movw r26, r4 33e1c: 11 96 adiw r26, 0x01 ; 1 33e1e: 2d 91 ld r18, X+ 33e20: 3d 91 ld r19, X+ 33e22: 4d 91 ld r20, X+ 33e24: 5c 91 ld r21, X 33e26: 14 97 sbiw r26, 0x04 ; 4 33e28: 6e 96 adiw r28, 0x1e ; 30 33e2a: 6c ad ldd r22, Y+60 ; 0x3c 33e2c: 7d ad ldd r23, Y+61 ; 0x3d 33e2e: 8e ad ldd r24, Y+62 ; 0x3e 33e30: 9f ad ldd r25, Y+63 ; 0x3f 33e32: 6e 97 sbiw r28, 0x1e ; 30 33e34: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33e38: 4b 01 movw r8, r22 33e3a: 5c 01 movw r10, r24 (-s2 * measured_pts[2 * i + 1])); float b = (c == 1) ? 1.f : 33e3c: 60 e0 ldi r22, 0x00 ; 0 33e3e: 70 e0 ldi r23, 0x00 ; 0 33e40: 80 e8 ldi r24, 0x80 ; 128 33e42: 9f e3 ldi r25, 0x3F ; 63 33e44: 11 30 cpi r17, 0x01 ; 1 33e46: 91 f0 breq .+36 ; 0x33e6c ((c == 2) ? ( c1 * measured_pts[2 * i]) : 33e48: 12 30 cpi r17, 0x02 ; 2 33e4a: 09 f0 breq .+2 ; 0x33e4e 33e4c: 3b cf rjmp .-394 ; 0x33cc4 33e4e: d2 01 movw r26, r4 33e50: 11 96 adiw r26, 0x01 ; 1 33e52: 2d 91 ld r18, X+ 33e54: 3d 91 ld r19, X+ 33e56: 4d 91 ld r20, X+ 33e58: 5c 91 ld r21, X 33e5a: 14 97 sbiw r26, 0x04 ; 4 33e5c: 6e 96 adiw r28, 0x1e ; 30 33e5e: 6c ad ldd r22, Y+60 ; 0x3c 33e60: 7d ad ldd r23, Y+61 ; 0x3d 33e62: 8e ad ldd r24, Y+62 ; 0x3e 33e64: 9f ad ldd r25, Y+63 ; 0x3f 33e66: 6e 97 sbiw r28, 0x1e ; 30 33e68: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> (-s2 * measured_pts[2 * i + 1])); float w = point_weight_y(i, measured_pts[2 * i + 1]); acc += a * b * w; 33e6c: 9b 01 movw r18, r22 33e6e: ac 01 movw r20, r24 33e70: c5 01 movw r24, r10 33e72: b4 01 movw r22, r8 33e74: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 33e78: 9b 01 movw r18, r22 33e7a: ac 01 movw r20, r24 33e7c: c7 01 movw r24, r14 33e7e: b6 01 movw r22, r12 33e80: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 33e84: 6b 01 movw r12, r22 33e86: 7c 01 movw r14, r24 33e88: 0d 94 94 95 jmp 0x32b28 ; 0x32b28 // 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 : 33e8c: 81 2c mov r8, r1 33e8e: 91 2c mov r9, r1 33e90: 50 e8 ldi r21, 0x80 ; 128 33e92: a5 2e mov r10, r21 33e94: 5f e3 ldi r21, 0x3F ; 63 33e96: b5 2e mov r11, r21 ((r == 2) ? (-s1 * measured_pts[2 * i]) : (-c2 * measured_pts[2 * i + 1])); float b = (c == 0) ? 1.f : 33e98: 11 11 cpse r17, r1 33e9a: 0d 94 6e 95 jmp 0x32adc ; 0x32adc ((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; 33e9e: 20 e0 ldi r18, 0x00 ; 0 33ea0: 30 e0 ldi r19, 0x00 ; 0 33ea2: 40 e8 ldi r20, 0x80 ; 128 33ea4: 5f e3 ldi r21, 0x3F ; 63 33ea6: ea cf rjmp .-44 ; 0x33e7c // 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 : 33ea8: 81 2c mov r8, r1 33eaa: 91 2c mov r9, r1 33eac: 40 e8 ldi r20, 0x80 ; 128 33eae: a4 2e mov r10, r20 33eb0: 4f e3 ldi r20, 0x3F ; 63 33eb2: 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) { 33eb4: 11 11 cpse r17, r1 33eb6: c2 cf rjmp .-124 ; 0x33e3c 33eb8: 0d 94 94 95 jmp 0x32b28 ; 0x32b28 33ebc: 11 11 cpse r17, r1 33ebe: aa cf rjmp .-172 ; 0x33e14 33ec0: 0d 94 94 95 jmp 0x32b28 ; 0x32b28 00033ec4 : manage_heater(); manage_inactivity(true); return _stepresult; } static void lcd_selftest_error(TestError testError, const char *_error_1, const char *_error_2) 33ec4: 1f 93 push r17 33ec6: cf 93 push r28 33ec8: df 93 push r29 33eca: 18 2f mov r17, r24 33ecc: eb 01 movw r28, r22 33ece: 80 e0 ldi r24, 0x00 ; 0 33ed0: 0f 94 c8 4e call 0x29d90 ; 0x29d90 { lcd_beeper_quick_feedback(); FORCE_BL_ON_END; 33ed4: 80 e0 ldi r24, 0x00 ; 0 33ed6: 0e 94 e9 89 call 0x113d2 ; 0x113d2 target_temperature[0] = 0; 33eda: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 33ede: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 target_temperature_bed = 0; 33ee2: 10 92 72 06 sts 0x0672, r1 ; 0x800672 33ee6: 10 92 71 06 sts 0x0671, r1 ; 0x800671 manage_heater(); 33eea: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 33eee: 80 e0 ldi r24, 0x00 ; 0 33ef0: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_clear(); 33ef4: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_ERROR)); 33ef8: 88 e2 ldi r24, 0x28 ; 40 33efa: 97 e5 ldi r25, 0x57 ; 87 33efc: 0e 94 44 72 call 0xe488 ; 0xe488 33f00: ac 01 movw r20, r24 33f02: 60 e0 ldi r22, 0x00 ; 0 33f04: 80 e0 ldi r24, 0x00 ; 0 33f06: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 1, _T(MSG_SELFTEST_PLEASECHECK)); 33f0a: 88 e1 ldi r24, 0x18 ; 24 33f0c: 97 e5 ldi r25, 0x57 ; 87 33f0e: 0e 94 44 72 call 0xe488 ; 0xe488 33f12: ac 01 movw r20, r24 33f14: 61 e0 ldi r22, 0x01 ; 1 33f16: 80 e0 ldi r24, 0x00 ; 0 33f18: 0e 94 8c 6e call 0xdd18 ; 0xdd18 switch (testError) 33f1c: 11 50 subi r17, 0x01 ; 1 33f1e: 1a 30 cpi r17, 0x0A ; 10 33f20: 90 f4 brcc .+36 ; 0x33f46 33f22: e1 2f mov r30, r17 33f24: f0 e0 ldi r31, 0x00 ; 0 33f26: 88 27 eor r24, r24 33f28: e7 56 subi r30, 0x67 ; 103 33f2a: f0 46 sbci r31, 0x60 ; 96 33f2c: 8e 4f sbci r24, 0xFE ; 254 33f2e: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 33f32: 12 39 cpi r17, 0x92 ; 146 33f34: 0e 39 cpi r16, 0x9E ; 158 33f36: 40 3a cpi r20, 0xA0 ; 160 33f38: 42 3a cpi r20, 0xA2 ; 162 33f3a: 7a 3a cpi r23, 0xAA ; 170 33f3c: 3a 3a cpi r19, 0xAA ; 170 33f3e: 4e 3a cpi r20, 0xAE ; 174 33f40: 8e 39 cpi r24, 0x9E ; 158 33f42: 9a 3a cpi r25, 0xAA ; 170 33f44: d2 39 cpi r29, 0x92 ; 146 { case TestError::Heater: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HEATERTHERMISTOR)); 33f46: 84 e0 ldi r24, 0x04 ; 4 33f48: 97 e5 ldi r25, 0x57 ; 87 33f4a: 0e 94 44 72 call 0xe488 ; 0xe488 33f4e: ac 01 movw r20, r24 33f50: 62 e0 ldi r22, 0x02 ; 2 33f52: 80 e0 ldi r24, 0x00 ; 0 33f54: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_NOTCONNECTED)); 33f58: 84 ef ldi r24, 0xF4 ; 244 33f5a: 96 e5 ldi r25, 0x56 ; 86 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)); 33f5c: 0e 94 44 72 call 0xe488 ; 0xe488 33f60: ac 01 movw r20, r24 33f62: 63 e0 ldi r22, 0x03 ; 3 33f64: 80 e0 ldi r24, 0x00 ; 0 33f66: 0e 94 8c 6e call 0xdd18 ; 0xdd18 33f6a: 45 c0 rjmp .+138 ; 0x33ff6 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)); 33f6c: 87 ee ldi r24, 0xE7 ; 231 33f6e: 96 e5 ldi r25, 0x56 ; 86 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)); 33f70: 0e 94 44 72 call 0xe488 ; 0xe488 33f74: ac 01 movw r20, r24 33f76: 62 e0 ldi r22, 0x02 ; 2 33f78: 80 e0 ldi r24, 0x00 ; 0 33f7a: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); 33f7e: 88 ed ldi r24, 0xD8 ; 216 33f80: 96 e5 ldi r25, 0x56 ; 86 33f82: ec cf rjmp .-40 ; 0x33f5c 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)); 33f84: 8d ec ldi r24, 0xCD ; 205 33f86: 96 e5 ldi r25, 0x56 ; 86 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)); 33f88: 0e 94 44 72 call 0xe488 ; 0xe488 33f8c: ac 01 movw r20, r24 33f8e: 62 e0 ldi r22, 0x02 ; 2 33f90: 80 e0 ldi r24, 0x00 ; 0 33f92: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR)); 33f96: 88 ed ldi r24, 0xD8 ; 216 33f98: 96 e5 ldi r25, 0x56 ; 86 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)); 33f9a: 0e 94 44 72 call 0xe488 ; 0xe488 33f9e: ac 01 movw r20, r24 33fa0: 63 e0 ldi r22, 0x03 ; 3 33fa2: 80 e0 ldi r24, 0x00 ; 0 33fa4: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(18, 3); 33fa8: 63 e0 ldi r22, 0x03 ; 3 33faa: 82 e1 ldi r24, 0x12 ; 18 33fac: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print(_error_1); 33fb0: ce 01 movw r24, r28 33fb2: 1f c0 rjmp .+62 ; 0x33ff2 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)); 33fb4: 85 ec ldi r24, 0xC5 ; 197 33fb6: 96 e5 ldi r25, 0x56 ; 86 33fb8: 0e 94 44 72 call 0xe488 ; 0xe488 33fbc: ac 01 movw r20, r24 33fbe: 62 e0 ldi r22, 0x02 ; 2 33fc0: 80 e0 ldi r24, 0x00 ; 0 33fc2: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(18, 2); 33fc6: 62 e0 ldi r22, 0x02 ; 2 33fc8: 82 e1 ldi r24, 0x12 ; 18 33fca: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print(_error_1); 33fce: ce 01 movw r24, r28 33fd0: 0e 94 7f 70 call 0xe0fe ; 0xe0fe lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_ENDSTOP)); 33fd4: 8b eb ldi r24, 0xBB ; 187 33fd6: 96 e5 ldi r25, 0x56 ; 86 33fd8: 0e 94 44 72 call 0xe488 ; 0xe488 33fdc: ac 01 movw r20, r24 33fde: 63 e0 ldi r22, 0x03 ; 3 33fe0: 80 e0 ldi r24, 0x00 ; 0 33fe2: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_set_cursor(18, 3); 33fe6: 63 e0 ldi r22, 0x03 ; 3 33fe8: 82 e1 ldi r24, 0x12 ; 18 33fea: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print(_error_2); 33fee: 86 ef ldi r24, 0xF6 ; 246 33ff0: 92 e0 ldi r25, 0x02 ; 2 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); 33ff2: 0e 94 7f 70 call 0xe0fe ; 0xe0fe lcd_set_cursor(0, 3); lcd_printf_P(_T(MSG_SELFTEST_FS_LEVEL),_error_1); break; } _delay(1000); 33ff6: 68 ee ldi r22, 0xE8 ; 232 33ff8: 73 e0 ldi r23, 0x03 ; 3 33ffa: 80 e0 ldi r24, 0x00 ; 0 33ffc: 90 e0 ldi r25, 0x00 ; 0 33ffe: 0f 94 2f 28 call 0x2505e ; 0x2505e 34002: 80 e0 ldi r24, 0x00 ; 0 34004: 0f 94 c8 4e call 0x29d90 ; 0x29d90 lcd_beeper_quick_feedback(); do { _delay(100); 34008: 64 e6 ldi r22, 0x64 ; 100 3400a: 70 e0 ldi r23, 0x00 ; 0 3400c: 80 e0 ldi r24, 0x00 ; 0 3400e: 90 e0 ldi r25, 0x00 ; 0 34010: 0f 94 2f 28 call 0x2505e ; 0x2505e manage_heater(); 34014: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(); 34018: 80 e0 ldi r24, 0x00 ; 0 3401a: 0e 94 4f 8a call 0x1149e ; 0x1149e } while (!lcd_clicked()); 3401e: 0e 94 95 70 call 0xe12a ; 0xe12a 34022: 88 23 and r24, r24 34024: 89 f3 breq .-30 ; 0x34008 LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); 34026: 8f e1 ldi r24, 0x1F ; 31 34028: 96 e5 ldi r25, 0x56 ; 86 3402a: 0e 94 44 72 call 0xe488 ; 0xe488 3402e: 62 e0 ldi r22, 0x02 ; 2 34030: 0e 94 d6 f1 call 0x1e3ac ; 0x1e3ac lcd_return_to_status(); } 34034: df 91 pop r29 34036: cf 91 pop r28 34038: 1f 91 pop r17 manage_heater(); manage_inactivity(); } while (!lcd_clicked()); LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED)); lcd_return_to_status(); 3403a: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 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)); 3403e: 89 ea ldi r24, 0xA9 ; 169 34040: 96 e5 ldi r25, 0x56 ; 86 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)); 34042: 0e 94 44 72 call 0xe488 ; 0xe488 34046: ac 01 movw r20, r24 34048: 62 e0 ldi r22, 0x02 ; 2 3404a: 80 e0 ldi r24, 0x00 ; 0 3404c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR)); 34050: 85 ec ldi r24, 0xC5 ; 197 34052: 96 e5 ldi r25, 0x56 ; 86 34054: a2 cf rjmp .-188 ; 0x33f9a 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)); 34056: 86 e9 ldi r24, 0x96 ; 150 34058: 96 e5 ldi r25, 0x56 ; 86 3405a: 96 cf rjmp .-212 ; 0x33f88 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)); 3405c: 83 e8 ldi r24, 0x83 ; 131 3405e: 96 e5 ldi r25, 0x56 ; 86 34060: 93 cf rjmp .-218 ; 0x33f88 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)); 34062: 84 e7 ldi r24, 0x74 ; 116 34064: 96 e5 ldi r25, 0x56 ; 86 34066: ed cf rjmp .-38 ; 0x34042 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)); 34068: 86 e6 ldi r24, 0x66 ; 102 3406a: 96 e5 ldi r25, 0x56 ; 86 3406c: 0e 94 44 72 call 0xe488 ; 0xe488 34070: ac 01 movw r20, r24 34072: 62 e0 ldi r22, 0x02 ; 2 34074: 80 e0 ldi r24, 0x00 ; 0 34076: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_AXIS)); 3407a: 8f e5 ldi r24, 0x5F ; 95 3407c: 96 e5 ldi r25, 0x56 ; 86 3407e: 8d cf rjmp .-230 ; 0x33f9a lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::SwappedFan: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS)); 34080: 8d e4 ldi r24, 0x4D ; 77 34082: 96 e5 ldi r25, 0x56 ; 86 34084: 0e 94 44 72 call 0xe488 ; 0xe488 34088: ac 01 movw r20, r24 3408a: 62 e0 ldi r22, 0x02 ; 2 3408c: 80 e0 ldi r24, 0x00 ; 0 3408e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED)); 34092: 83 e4 ldi r24, 0x43 ; 67 34094: 96 e5 ldi r25, 0x56 ; 86 34096: 81 cf rjmp .-254 ; 0x33f9a lcd_set_cursor(18, 3); lcd_print(_error_1); break; case TestError::WiringFsensor: lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR)); 34098: 81 e3 ldi r24, 0x31 ; 49 3409a: 96 e5 ldi r25, 0x56 ; 86 3409c: 69 cf rjmp .-302 ; 0x33f70 0003409e : 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, 3409e: 1f 93 push r17 340a0: cf 93 push r28 340a2: df 93 push r29 340a4: c8 2f mov r28, r24 340a6: d6 2f mov r29, r22 const bool _default) { bool _result = check_opposite; lcd_clear(); 340a8: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_FAN)); 340ac: 84 e1 ldi r24, 0x14 ; 20 340ae: 96 e5 ldi r25, 0x56 ; 86 340b0: 0e 94 44 72 call 0xe488 ; 0xe488 340b4: ac 01 movw r20, r24 340b6: 60 e0 ldi r22, 0x00 ; 0 340b8: 80 e0 ldi r24, 0x00 ; 0 340ba: 0e 94 8c 6e call 0xdd18 ; 0xdd18 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)); 340be: 83 e8 ldi r24, 0x83 ; 131 340c0: 96 e5 ldi r25, 0x56 ; 86 340c2: c1 11 cpse r28, r1 340c4: 02 c0 rjmp .+4 ; 0x340ca 340c6: 86 e9 ldi r24, 0x96 ; 150 340c8: 96 e5 ldi r25, 0x56 ; 86 340ca: 0e 94 44 72 call 0xe488 ; 0xe488 340ce: ac 01 movw r20, r24 340d0: 61 e0 ldi r22, 0x01 ; 1 340d2: 80 e0 ldi r24, 0x00 ; 0 340d4: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_selftest_setfan(255); 340d8: 8f ef ldi r24, 0xFF ; 255 340da: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 break; } _delay(500); 340de: 64 ef ldi r22, 0xF4 ; 244 340e0: 71 e0 ldi r23, 0x01 ; 1 340e2: 80 e0 ldi r24, 0x00 ; 0 340e4: 90 e0 ldi r25, 0x00 ; 0 340e6: 0f 94 2f 28 call 0x2505e ; 0x2505e lcd_puts_at_P(1, 2, _T(MSG_SELFTEST_FAN_YES)); 340ea: 89 e0 ldi r24, 0x09 ; 9 340ec: 96 e5 ldi r25, 0x56 ; 86 340ee: 0e 94 44 72 call 0xe488 ; 0xe488 340f2: ac 01 movw r20, r24 340f4: 62 e0 ldi r22, 0x02 ; 2 340f6: 81 e0 ldi r24, 0x01 ; 1 340f8: 0e 94 8c 6e call 0xdd18 ; 0xdd18 lcd_putc_at(0, 3, '>'); 340fc: 4e e3 ldi r20, 0x3E ; 62 340fe: 63 e0 ldi r22, 0x03 ; 3 34100: 80 e0 ldi r24, 0x00 ; 0 34102: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_puts_P(_T(MSG_SELFTEST_FAN_NO)); 34106: 8a ef ldi r24, 0xFA ; 250 34108: 95 e5 ldi r25, 0x55 ; 85 3410a: 0e 94 44 72 call 0xe488 ; 0xe488 3410e: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_encoder = _default; 34112: 6d 2f mov r22, r29 34114: 70 e0 ldi r23, 0x00 ; 0 34116: 70 93 70 06 sts 0x0670, r23 ; 0x800670 3411a: 60 93 6f 06 sts 0x066F, r22 ; 0x80066f KEEPALIVE_STATE(PAUSED_FOR_USER); 3411e: 84 e0 ldi r24, 0x04 ; 4 34120: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be lcd_consume_click(); 34124: 0e 94 90 70 call 0xe120 ; 0xe120 34128: dc 2f mov r29, r28 do { if (lcd_encoder) { if (lcd_encoder < 0) { _result = !check_opposite; 3412a: 11 e0 ldi r17, 0x01 ; 1 3412c: 1c 27 eor r17, r28 KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_consume_click(); do { if (lcd_encoder) { 3412e: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 34132: 90 91 70 06 lds r25, 0x0670 ; 0x800670 34136: 00 97 sbiw r24, 0x00 ; 0 34138: 19 f1 breq .+70 ; 0x34180 if (lcd_encoder < 0) { 3413a: 97 ff sbrs r25, 7 3413c: 0b c0 rjmp .+22 ; 0x34154 _result = !check_opposite; 3413e: d1 2f mov r29, r17 lcd_putc_at(0, 2, '>'); 34140: 4e e3 ldi r20, 0x3E ; 62 34142: 62 e0 ldi r22, 0x02 ; 2 34144: 80 e0 ldi r24, 0x00 ; 0 34146: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_putc_at(0, 3, ' '); 3414a: 40 e2 ldi r20, 0x20 ; 32 3414c: 63 e0 ldi r22, 0x03 ; 3 3414e: 80 e0 ldi r24, 0x00 ; 0 34150: 0e 94 98 6e call 0xdd30 ; 0xdd30 } if (lcd_encoder > 0) { 34154: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 34158: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3415c: 18 16 cp r1, r24 3415e: 19 06 cpc r1, r25 34160: 5c f4 brge .+22 ; 0x34178 _result = check_opposite; lcd_putc_at(0, 2, ' '); 34162: 40 e2 ldi r20, 0x20 ; 32 34164: 62 e0 ldi r22, 0x02 ; 2 34166: 80 e0 ldi r24, 0x00 ; 0 34168: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_putc_at(0, 3, '>'); 3416c: 4e e3 ldi r20, 0x3E ; 62 3416e: 63 e0 ldi r22, 0x03 ; 3 34170: 80 e0 ldi r24, 0x00 ; 0 34172: 0e 94 98 6e call 0xdd30 ; 0xdd30 34176: dc 2f mov r29, r28 } lcd_encoder = 0; 34178: 10 92 70 06 sts 0x0670, r1 ; 0x800670 3417c: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f } manage_heater(); 34180: 0f 94 34 39 call 0x27268 ; 0x27268 manage_inactivity(true); 34184: 81 e0 ldi r24, 0x01 ; 1 34186: 0e 94 4f 8a call 0x1149e ; 0x1149e _delay(100); 3418a: 64 e6 ldi r22, 0x64 ; 100 3418c: 70 e0 ldi r23, 0x00 ; 0 3418e: 80 e0 ldi r24, 0x00 ; 0 34190: 90 e0 ldi r25, 0x00 ; 0 34192: 0f 94 2f 28 call 0x2505e ; 0x2505e } while (!lcd_clicked()); 34196: 0e 94 95 70 call 0xe12a ; 0xe12a 3419a: 88 23 and r24, r24 3419c: 41 f2 breq .-112 ; 0x3412e KEEPALIVE_STATE(IN_HANDLER); 3419e: 82 e0 ldi r24, 0x02 ; 2 341a0: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be setExtruderAutoFanState(0); // Turn off hotend fan 341a4: 80 e0 ldi r24, 0x00 ; 0 341a6: 0e 94 f3 74 call 0xe9e6 ; 0xe9e6 lcd_selftest_setfan(0); // Turn off print fan 341aa: 80 e0 ldi r24, 0x00 ; 0 341ac: 0e 94 13 f6 call 0x1ec26 ; 0x1ec26 return _result; } 341b0: 8d 2f mov r24, r29 341b2: df 91 pop r29 341b4: cf 91 pop r28 341b6: 1f 91 pop r17 341b8: 08 95 ret 000341ba : #ifdef FANCHECK // Wait for the specified number of seconds while displaying some single-character indicator on the // screen coordinate col/row, then perform fan measurement static void lcd_selftest_measure_fans(uint8_t delay, uint8_t col, uint8_t row) { 341ba: cf 93 push r28 341bc: df 93 push r29 341be: c8 2f mov r28, r24 341c0: d6 2f mov r29, r22 // spin-up delay static char symbols[] = {'-', '|'}; static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000); while(delay--) { 341c2: c1 50 subi r28, 0x01 ; 1 341c4: 98 f0 brcs .+38 ; 0x341ec for(uint8_t i = 0; i != sizeof(symbols); ++i) { lcd_putc_at(col, row, symbols[i]); 341c6: 4d e2 ldi r20, 0x2D ; 45 341c8: 6d 2f mov r22, r29 341ca: 82 e1 ldi r24, 0x12 ; 18 341cc: 0e 94 98 6e call 0xdd30 ; 0xdd30 delay_keep_alive(1000 / sizeof(symbols)); 341d0: 84 ef ldi r24, 0xF4 ; 244 341d2: 91 e0 ldi r25, 0x01 ; 1 341d4: 0e 94 84 8c call 0x11908 ; 0x11908 // 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]); 341d8: 4c e7 ldi r20, 0x7C ; 124 341da: 6d 2f mov r22, r29 341dc: 82 e1 ldi r24, 0x12 ; 18 341de: 0e 94 98 6e call 0xdd30 ; 0xdd30 delay_keep_alive(1000 / sizeof(symbols)); 341e2: 84 ef ldi r24, 0xF4 ; 244 341e4: 91 e0 ldi r25, 0x01 ; 1 341e6: 0e 94 84 8c call 0x11908 ; 0x11908 341ea: eb cf rjmp .-42 ; 0x341c2 } } #ifdef FANCHECK extruder_autofan_last_check = _millis(); 341ec: 0f 94 28 2a call 0x25450 ; 0x25450 341f0: 60 93 bf 17 sts 0x17BF, r22 ; 0x8017bf 341f4: 70 93 c0 17 sts 0x17C0, r23 ; 0x8017c0 341f8: 80 93 c1 17 sts 0x17C1, r24 ; 0x8017c1 341fc: 90 93 c2 17 sts 0x17C2, r25 ; 0x8017c2 #endif fan_measuring = true; 34200: 81 e0 ldi r24, 0x01 ; 1 34202: 80 93 6e 06 sts 0x066E, r24 ; 0x80066e while(fan_measuring) { 34206: 80 91 6e 06 lds r24, 0x066E ; 0x80066e 3420a: 88 23 and r24, r24 3420c: 29 f0 breq .+10 ; 0x34218 delay_keep_alive(100); 3420e: 84 e6 ldi r24, 0x64 ; 100 34210: 90 e0 ldi r25, 0x00 ; 0 34212: 0e 94 84 8c call 0x11908 ; 0x11908 34216: f7 cf rjmp .-18 ; 0x34206 } gcode_M123(); } 34218: df 91 pop r29 3421a: cf 91 pop r28 fan_measuring = true; while(fan_measuring) { delay_keep_alive(100); } gcode_M123(); 3421c: 0c 94 1c 66 jmp 0xcc38 ; 0xcc38 00034220 : } #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) { 34220: 4f 92 push r4 34222: 5f 92 push r5 34224: 6f 92 push r6 34226: 7f 92 push r7 34228: af 92 push r10 3422a: bf 92 push r11 3422c: cf 92 push r12 3422e: df 92 push r13 34230: ef 92 push r14 34232: ff 92 push r15 34234: 0f 93 push r16 34236: 1f 93 push r17 34238: cf 93 push r28 3423a: df 93 push r29 3423c: 24 e0 ldi r18, 0x04 ; 4 3423e: 30 e0 ldi r19, 0x00 ; 0 34240: 41 e0 ldi r20, 0x01 ; 1 34242: 50 e0 ldi r21, 0x00 ; 0 34244: d9 01 movw r26, r18 34246: ad 5e subi r26, 0xED ; 237 34248: bc 45 sbci r27, 0x5C ; 92 uint8_t i; short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]); for (i=1; i raw) 3424a: fd 01 movw r30, r26 3424c: 65 91 lpm r22, Z+ 3424e: 74 91 lpm r23, Z 34250: 86 17 cp r24, r22 34252: 97 07 cpc r25, r23 34254: 0c f0 brlt .+2 ; 0x34258 34256: 66 c0 rjmp .+204 ; 0x34324 { celsius = PGM_RD_W((*tt)[i-1][1]) + 34258: 41 50 subi r20, 0x01 ; 1 3425a: 51 09 sbc r21, r1 3425c: 44 0f add r20, r20 3425e: 55 1f adc r21, r21 34260: 44 0f add r20, r20 34262: 55 1f adc r21, r21 34264: ea 01 movw r28, r20 34266: cb 5e subi r28, 0xEB ; 235 34268: dc 45 sbci r29, 0x5C ; 92 3426a: fe 01 movw r30, r28 3426c: 05 91 lpm r16, Z+ 3426e: 14 91 lpm r17, Z (raw - PGM_RD_W((*tt)[i-1][0])) * 34270: 4d 5e subi r20, 0xED ; 237 34272: 5c 45 sbci r21, 0x5C ; 92 34274: fa 01 movw r30, r20 34276: 65 91 lpm r22, Z+ 34278: 74 91 lpm r23, Z (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / 3427a: f9 01 movw r30, r18 3427c: eb 5e subi r30, 0xEB ; 235 3427e: fc 45 sbci r31, 0x5C ; 92 34280: e5 90 lpm r14, Z+ 34282: f4 90 lpm r15, Z 34284: fe 01 movw r30, r28 34286: c5 90 lpm r12, Z+ 34288: d4 90 lpm r13, Z (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])); 3428a: fd 01 movw r30, r26 3428c: c5 91 lpm r28, Z+ 3428e: d4 91 lpm r29, Z 34290: fa 01 movw r30, r20 34292: a5 90 lpm r10, Z+ 34294: 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])) * 34296: 86 1b sub r24, r22 34298: 97 0b sbc r25, r23 3429a: bc 01 movw r22, r24 3429c: 99 0f add r25, r25 3429e: 88 0b sbc r24, r24 342a0: 99 0b sbc r25, r25 342a2: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 342a6: 2b 01 movw r4, r22 342a8: 3c 01 movw r6, r24 (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) / 342aa: b7 01 movw r22, r14 342ac: 6c 19 sub r22, r12 342ae: 7d 09 sbc r23, r13 342b0: 07 2e mov r0, r23 342b2: 00 0c add r0, r0 342b4: 88 0b sbc r24, r24 342b6: 99 0b sbc r25, r25 342b8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 342bc: 9b 01 movw r18, r22 342be: 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])) * 342c0: c3 01 movw r24, r6 342c2: b2 01 movw r22, r4 342c4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 342c8: 6b 01 movw r12, r22 342ca: 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])); 342cc: be 01 movw r22, r28 342ce: 6a 19 sub r22, r10 342d0: 7b 09 sbc r23, r11 342d2: 07 2e mov r0, r23 342d4: 00 0c add r0, r0 342d6: 88 0b sbc r24, r24 342d8: 99 0b sbc r25, r25 342da: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 342de: 9b 01 movw r18, r22 342e0: 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])) / 342e2: c7 01 movw r24, r14 342e4: b6 01 movw r22, r12 342e6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 342ea: 6b 01 movw r12, r22 342ec: 7c 01 movw r14, r24 for (i=1; i raw) { celsius = PGM_RD_W((*tt)[i-1][1]) + 342ee: b8 01 movw r22, r16 342f0: 11 0f add r17, r17 342f2: 88 0b sbc r24, r24 342f4: 99 0b sbc r25, r25 342f6: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 342fa: 9b 01 movw r18, r22 342fc: ac 01 movw r20, r24 342fe: c7 01 movw r24, r14 34300: b6 01 movw r22, r12 34302: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__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; } 34306: df 91 pop r29 34308: cf 91 pop r28 3430a: 1f 91 pop r17 3430c: 0f 91 pop r16 3430e: ff 90 pop r15 34310: ef 90 pop r14 34312: df 90 pop r13 34314: cf 90 pop r12 34316: bf 90 pop r11 34318: af 90 pop r10 3431a: 7f 90 pop r7 3431c: 6f 90 pop r6 3431e: 5f 90 pop r5 34320: 4f 90 pop r4 34322: 08 95 ret 34324: 4f 5f subi r20, 0xFF ; 255 34326: 5f 4f sbci r21, 0xFF ; 255 34328: 2c 5f subi r18, 0xFC ; 252 3432a: 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 34332: 88 cf rjmp .-240 ; 0x34244 break; } } // Overflow: Set to last value in the table if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]); 34334: e1 e9 ldi r30, 0x91 ; 145 34336: f3 ea ldi r31, 0xA3 ; 163 34338: 65 91 lpm r22, Z+ 3433a: 74 91 lpm r23, Z 3433c: 07 2e mov r0, r23 3433e: 00 0c add r0, r0 34340: 88 0b sbc r24, r24 34342: 99 0b sbc r25, r25 34344: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 34348: de cf rjmp .-68 ; 0x34306 0003434a : float mesh_bed_leveling::get_z(float x, float y) { 3434a: 2f 92 push r2 3434c: 3f 92 push r3 3434e: 4f 92 push r4 34350: 5f 92 push r5 34352: 6f 92 push r6 34354: 7f 92 push r7 34356: 8f 92 push r8 34358: 9f 92 push r9 3435a: af 92 push r10 3435c: bf 92 push r11 3435e: cf 92 push r12 34360: df 92 push r13 34362: ef 92 push r14 34364: ff 92 push r15 34366: 0f 93 push r16 34368: 1f 93 push r17 3436a: cf 93 push r28 3436c: df 93 push r29 3436e: 00 d0 rcall .+0 ; 0x34370 34370: 00 d0 rcall .+0 ; 0x34372 34372: 00 d0 rcall .+0 ; 0x34374 34374: 1f 92 push r1 34376: cd b7 in r28, 0x3d ; 61 34378: de b7 in r29, 0x3e ; 62 3437a: 2b 01 movw r4, r22 3437c: 3c 01 movw r6, r24 3437e: 49 01 movw r8, r18 34380: 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)); 34382: 20 e0 ldi r18, 0x00 ; 0 34384: 30 e0 ldi r19, 0x00 ; 0 34386: 40 ec ldi r20, 0xC0 ; 192 34388: 51 e4 ldi r21, 0x41 ; 65 3438a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3438e: 20 e0 ldi r18, 0x00 ; 0 34390: 30 e0 ldi r19, 0x00 ; 0 34392: 48 e0 ldi r20, 0x08 ; 8 34394: 52 e4 ldi r21, 0x42 ; 66 34396: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3439a: 6b 01 movw r12, r22 3439c: 7c 01 movw r14, r24 3439e: 0f 94 df de call 0x3bdbe ; 0x3bdbe 343a2: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> if (i < 0) { i = 0; 343a6: 31 2c mov r3, r1 343a8: 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) { 343aa: 77 fd sbrc r23, 7 343ac: 1e c0 rjmp .+60 ; 0x343ea 343ae: 1b 01 movw r2, r22 343b0: 66 30 cpi r22, 0x06 ; 6 343b2: 71 05 cpc r23, r1 343b4: 1c f0 brlt .+6 ; 0x343bc 343b6: 45 e0 ldi r20, 0x05 ; 5 343b8: 24 2e mov r2, r20 343ba: 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; } 343bc: 82 2d mov r24, r2 343be: 0f 94 29 ca call 0x39452 ; 0x39452 343c2: 20 e0 ldi r18, 0x00 ; 0 343c4: 30 e0 ldi r19, 0x00 ; 0 343c6: 48 eb ldi r20, 0xB8 ; 184 343c8: 51 e4 ldi r21, 0x41 ; 65 343ca: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 343ce: 9b 01 movw r18, r22 343d0: 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; 343d2: c3 01 movw r24, r6 343d4: b2 01 movw r22, r4 343d6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 343da: 20 e0 ldi r18, 0x00 ; 0 343dc: 30 e0 ldi r19, 0x00 ; 0 343de: 48 e0 ldi r20, 0x08 ; 8 343e0: 52 e4 ldi r21, 0x42 ; 66 343e2: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 343e6: 6b 01 movw r12, r22 343e8: 7c 01 movw r14, r24 } j = int(floor((y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density)); 343ea: 20 e0 ldi r18, 0x00 ; 0 343ec: 30 e0 ldi r19, 0x00 ; 0 343ee: 40 ec ldi r20, 0xC0 ; 192 343f0: 50 e4 ldi r21, 0x40 ; 64 343f2: c5 01 movw r24, r10 343f4: b4 01 movw r22, r8 343f6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 343fa: 20 e0 ldi r18, 0x00 ; 0 343fc: 30 e0 ldi r19, 0x00 ; 0 343fe: 48 e0 ldi r20, 0x08 ; 8 34400: 52 e4 ldi r21, 0x42 ; 66 34402: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 34406: 69 83 std Y+1, r22 ; 0x01 34408: 7a 83 std Y+2, r23 ; 0x02 3440a: 8b 83 std Y+3, r24 ; 0x03 3440c: 9c 83 std Y+4, r25 ; 0x04 3440e: 0f 94 df de call 0x3bdbe ; 0x3bdbe 34412: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> if (j < 0) { 34416: 77 fd sbrc r23, 7 34418: da c0 rjmp .+436 ; 0x345ce 3441a: 7a 87 std Y+10, r23 ; 0x0a 3441c: 69 87 std Y+9, r22 ; 0x09 3441e: 66 30 cpi r22, 0x06 ; 6 34420: 71 05 cpc r23, r1 34422: 24 f0 brlt .+8 ; 0x3442c 34424: e5 e0 ldi r30, 0x05 ; 5 34426: f0 e0 ldi r31, 0x00 ; 0 34428: fa 87 std Y+10, r31 ; 0x0a 3442a: e9 87 std Y+9, r30 ; 0x09 static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; } 3442c: 89 85 ldd r24, Y+9 ; 0x09 3442e: 0f 94 29 ca call 0x39452 ; 0x39452 34432: 20 e0 ldi r18, 0x00 ; 0 34434: 30 e0 ldi r19, 0x00 ; 0 34436: 40 ea ldi r20, 0xA0 ; 160 34438: 50 e4 ldi r21, 0x40 ; 64 3443a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3443e: 9b 01 movw r18, r22 34440: 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; 34442: c5 01 movw r24, r10 34444: b4 01 movw r22, r8 34446: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3444a: 20 e0 ldi r18, 0x00 ; 0 3444c: 30 e0 ldi r19, 0x00 ; 0 3444e: 48 e0 ldi r20, 0x08 ; 8 34450: 52 e4 ldi r21, 0x42 ; 66 34452: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 34456: 69 83 std Y+1, r22 ; 0x01 34458: 7a 83 std Y+2, r23 ; 0x02 3445a: 8b 83 std Y+3, r24 ; 0x03 3445c: 9c 83 std Y+4, r25 ; 0x04 } float si = 1.f-s; 3445e: a7 01 movw r20, r14 34460: 96 01 movw r18, r12 34462: 60 e0 ldi r22, 0x00 ; 0 34464: 70 e0 ldi r23, 0x00 ; 0 34466: 80 e8 ldi r24, 0x80 ; 128 34468: 9f e3 ldi r25, 0x3F ; 63 3446a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3446e: 2b 01 movw r4, r22 34470: 3c 01 movw r6, r24 float z0 = si * z_values[j ][i] + s * z_values[j ][i+1]; 34472: 91 01 movw r18, r2 34474: 2f 5f subi r18, 0xFF ; 255 34476: 3f 4f sbci r19, 0xFF ; 255 34478: 3e 83 std Y+6, r19 ; 0x06 3447a: 2d 83 std Y+5, r18 ; 0x05 float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1]; 3447c: 89 85 ldd r24, Y+9 ; 0x09 3447e: 9a 85 ldd r25, Y+10 ; 0x0a 34480: 01 96 adiw r24, 0x01 ; 1 34482: 98 87 std Y+8, r25 ; 0x08 34484: 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]; 34486: 27 e0 ldi r18, 0x07 ; 7 34488: e9 85 ldd r30, Y+9 ; 0x09 3448a: fa 85 ldd r31, Y+10 ; 0x0a 3448c: 2e 9f mul r18, r30 3448e: 80 01 movw r16, r0 34490: 2f 9f mul r18, r31 34492: 10 0d add r17, r0 34494: 11 24 eor r1, r1 34496: f8 01 movw r30, r16 34498: e2 0d add r30, r2 3449a: f3 1d adc r31, r3 3449c: ee 0f add r30, r30 3449e: ff 1f adc r31, r31 344a0: ee 0f add r30, r30 344a2: ff 1f adc r31, r31 344a4: ef 53 subi r30, 0x3F ; 63 344a6: fc 4e sbci r31, 0xEC ; 236 344a8: 21 81 ldd r18, Z+1 ; 0x01 344aa: 32 81 ldd r19, Z+2 ; 0x02 344ac: 43 81 ldd r20, Z+3 ; 0x03 344ae: 54 81 ldd r21, Z+4 ; 0x04 344b0: c3 01 movw r24, r6 344b2: b2 01 movw r22, r4 344b4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 344b8: 4b 01 movw r8, r22 344ba: 5c 01 movw r10, r24 344bc: ed 81 ldd r30, Y+5 ; 0x05 344be: fe 81 ldd r31, Y+6 ; 0x06 344c0: e0 0f add r30, r16 344c2: f1 1f adc r31, r17 344c4: ee 0f add r30, r30 344c6: ff 1f adc r31, r31 344c8: ee 0f add r30, r30 344ca: ff 1f adc r31, r31 344cc: ef 53 subi r30, 0x3F ; 63 344ce: fc 4e sbci r31, 0xEC ; 236 344d0: 21 81 ldd r18, Z+1 ; 0x01 344d2: 32 81 ldd r19, Z+2 ; 0x02 344d4: 43 81 ldd r20, Z+3 ; 0x03 344d6: 54 81 ldd r21, Z+4 ; 0x04 344d8: c7 01 movw r24, r14 344da: b6 01 movw r22, r12 344dc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 344e0: 9b 01 movw r18, r22 344e2: ac 01 movw r20, r24 344e4: c5 01 movw r24, r10 344e6: b4 01 movw r22, r8 344e8: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 344ec: 4b 01 movw r8, r22 344ee: 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; 344f0: 29 81 ldd r18, Y+1 ; 0x01 344f2: 3a 81 ldd r19, Y+2 ; 0x02 344f4: 4b 81 ldd r20, Y+3 ; 0x03 344f6: 5c 81 ldd r21, Y+4 ; 0x04 344f8: 60 e0 ldi r22, 0x00 ; 0 344fa: 70 e0 ldi r23, 0x00 ; 0 344fc: 80 e8 ldi r24, 0x80 ; 128 344fe: 9f e3 ldi r25, 0x3F ; 63 34500: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 34504: 9b 01 movw r18, r22 34506: ac 01 movw r20, r24 34508: c5 01 movw r24, r10 3450a: b4 01 movw r22, r8 3450c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34510: 4b 01 movw r8, r22 34512: 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]; 34514: 27 e0 ldi r18, 0x07 ; 7 34516: ef 81 ldd r30, Y+7 ; 0x07 34518: f8 85 ldd r31, Y+8 ; 0x08 3451a: 2e 9f mul r18, r30 3451c: c0 01 movw r24, r0 3451e: 2f 9f mul r18, r31 34520: 90 0d add r25, r0 34522: 11 24 eor r1, r1 34524: 9a 87 std Y+10, r25 ; 0x0a 34526: 89 87 std Y+9, r24 ; 0x09 34528: fc 01 movw r30, r24 3452a: e2 0d add r30, r2 3452c: f3 1d adc r31, r3 3452e: ee 0f add r30, r30 34530: ff 1f adc r31, r31 34532: ee 0f add r30, r30 34534: ff 1f adc r31, r31 34536: ef 53 subi r30, 0x3F ; 63 34538: fc 4e sbci r31, 0xEC ; 236 3453a: 21 81 ldd r18, Z+1 ; 0x01 3453c: 32 81 ldd r19, Z+2 ; 0x02 3453e: 43 81 ldd r20, Z+3 ; 0x03 34540: 54 81 ldd r21, Z+4 ; 0x04 34542: c3 01 movw r24, r6 34544: b2 01 movw r22, r4 34546: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3454a: 2b 01 movw r4, r22 3454c: 3c 01 movw r6, r24 3454e: 89 85 ldd r24, Y+9 ; 0x09 34550: 9a 85 ldd r25, Y+10 ; 0x0a 34552: ed 81 ldd r30, Y+5 ; 0x05 34554: fe 81 ldd r31, Y+6 ; 0x06 34556: 8e 0f add r24, r30 34558: 9f 1f adc r25, r31 3455a: 88 0f add r24, r24 3455c: 99 1f adc r25, r25 3455e: 88 0f add r24, r24 34560: 99 1f adc r25, r25 34562: 8f 53 subi r24, 0x3F ; 63 34564: 9c 4e sbci r25, 0xEC ; 236 34566: fc 01 movw r30, r24 34568: 21 81 ldd r18, Z+1 ; 0x01 3456a: 32 81 ldd r19, Z+2 ; 0x02 3456c: 43 81 ldd r20, Z+3 ; 0x03 3456e: 54 81 ldd r21, Z+4 ; 0x04 34570: c7 01 movw r24, r14 34572: b6 01 movw r22, r12 34574: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34578: 9b 01 movw r18, r22 3457a: ac 01 movw r20, r24 3457c: c3 01 movw r24, r6 3457e: b2 01 movw r22, r4 34580: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> return (1.f-t) * z0 + t * z1; 34584: 29 81 ldd r18, Y+1 ; 0x01 34586: 3a 81 ldd r19, Y+2 ; 0x02 34588: 4b 81 ldd r20, Y+3 ; 0x03 3458a: 5c 81 ldd r21, Y+4 ; 0x04 3458c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34590: 9b 01 movw r18, r22 34592: ac 01 movw r20, r24 34594: c5 01 movw r24, r10 34596: b4 01 movw r22, r8 34598: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> } 3459c: 2a 96 adiw r28, 0x0a ; 10 3459e: 0f b6 in r0, 0x3f ; 63 345a0: f8 94 cli 345a2: de bf out 0x3e, r29 ; 62 345a4: 0f be out 0x3f, r0 ; 63 345a6: cd bf out 0x3d, r28 ; 61 345a8: df 91 pop r29 345aa: cf 91 pop r28 345ac: 1f 91 pop r17 345ae: 0f 91 pop r16 345b0: ff 90 pop r15 345b2: ef 90 pop r14 345b4: df 90 pop r13 345b6: cf 90 pop r12 345b8: bf 90 pop r11 345ba: af 90 pop r10 345bc: 9f 90 pop r9 345be: 8f 90 pop r8 345c0: 7f 90 pop r7 345c2: 6f 90 pop r6 345c4: 5f 90 pop r5 345c6: 4f 90 pop r4 345c8: 3f 90 pop r3 345ca: 2f 90 pop r2 345cc: 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; 345ce: 1a 86 std Y+10, r1 ; 0x0a 345d0: 19 86 std Y+9, r1 ; 0x09 345d2: 45 cf rjmp .-374 ; 0x3445e 000345d4 : 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() 345d4: 2f 92 push r2 345d6: 3f 92 push r3 345d8: 4f 92 push r4 345da: 5f 92 push r5 345dc: 6f 92 push r6 345de: 7f 92 push r7 345e0: 8f 92 push r8 345e2: 9f 92 push r9 345e4: af 92 push r10 345e6: bf 92 push r11 345e8: cf 92 push r12 345ea: df 92 push r13 345ec: ef 92 push r14 345ee: ff 92 push r15 345f0: 0f 93 push r16 345f2: 1f 93 push r17 345f4: cf 93 push r28 345f6: df 93 push r29 345f8: 00 d0 rcall .+0 ; 0x345fa 345fa: 00 d0 rcall .+0 ; 0x345fc 345fc: 00 d0 rcall .+0 ; 0x345fe 345fe: cd b7 in r28, 0x3d ; 61 34600: de b7 in r29, 0x3e ; 62 34602: 01 ec ldi r16, 0xC1 ; 193 34604: 13 e1 ldi r17, 0x13 ; 19 34606: 1f 83 std Y+7, r17 ; 0x07 34608: 0e 83 std Y+6, r16 ; 0x06 3460a: 2e 80 ldd r2, Y+6 ; 0x06 3460c: 3f 80 ldd r3, Y+7 ; 0x07 3460e: 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])) 34610: f1 01 movw r30, r2 34612: 61 81 ldd r22, Z+1 ; 0x01 34614: 72 81 ldd r23, Z+2 ; 0x02 34616: 83 81 ldd r24, Z+3 ; 0x03 34618: 94 81 ldd r25, Z+4 ; 0x04 3461a: 9b 01 movw r18, r22 3461c: ac 01 movw r20, r24 3461e: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 34622: 88 23 and r24, r24 34624: 09 f4 brne .+2 ; 0x34628 34626: 7c c0 rjmp .+248 ; 0x34720 mesh_bed_leveling() { reset(); } void reset(); static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; } 34628: 89 81 ldd r24, Y+1 ; 0x01 3462a: 0f 94 29 ca call 0x39452 ; 0x39452 3462e: 20 e0 ldi r18, 0x00 ; 0 34630: 30 e0 ldi r19, 0x00 ; 0 34632: 48 eb ldi r20, 0xB8 ; 184 34634: 51 e4 ldi r21, 0x41 ; 65 34636: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3463a: 6b 01 movw r12, r22 3463c: 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)) + 3463e: 20 e0 ldi r18, 0x00 ; 0 34640: 30 e0 ldi r19, 0x00 ; 0 34642: 4c ef ldi r20, 0xFC ; 252 34644: 52 e4 ldi r21, 0x42 ; 66 34646: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3464a: 2b 01 movw r4, r22 3464c: 3c 01 movw r6, r24 3464e: 20 e0 ldi r18, 0x00 ; 0 34650: 30 e0 ldi r19, 0x00 ; 0 34652: 44 e6 ldi r20, 0x64 ; 100 34654: 53 e4 ldi r21, 0x43 ; 67 34656: c7 01 movw r24, r14 34658: b6 01 movw r22, r12 3465a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3465e: 4b 01 movw r8, r22 34660: 5c 01 movw r10, r24 z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + 34662: 20 e0 ldi r18, 0x00 ; 0 34664: 30 e0 ldi r19, 0x00 ; 0 34666: 40 ec ldi r20, 0xC0 ; 192 34668: 51 e4 ldi r21, 0x41 ; 65 3466a: c7 01 movw r24, r14 3466c: b6 01 movw r22, r12 3466e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 34672: 6b 01 movw r12, r22 34674: 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)) + 34676: ee 81 ldd r30, Y+6 ; 0x06 34678: ff 81 ldd r31, Y+7 ; 0x07 3467a: 21 81 ldd r18, Z+1 ; 0x01 3467c: 32 81 ldd r19, Z+2 ; 0x02 3467e: 43 81 ldd r20, Z+3 ; 0x03 34680: 54 81 ldd r21, Z+4 ; 0x04 34682: c3 01 movw r24, r6 34684: b2 01 movw r22, r4 34686: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3468a: a5 01 movw r20, r10 3468c: 94 01 movw r18, r8 3468e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34692: 20 e0 ldi r18, 0x00 ; 0 34694: 30 e9 ldi r19, 0x90 ; 144 34696: 42 ea ldi r20, 0xA2 ; 162 34698: 56 e4 ldi r21, 0x46 ; 70 3469a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3469e: 6a 83 std Y+2, r22 ; 0x02 346a0: 7b 83 std Y+3, r23 ; 0x03 346a2: 8c 83 std Y+4, r24 ; 0x04 346a4: 9d 83 std Y+5, r25 ; 0x05 z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) + 346a6: ee 81 ldd r30, Y+6 ; 0x06 346a8: ff 81 ldd r31, Y+7 ; 0x07 346aa: 25 85 ldd r18, Z+13 ; 0x0d 346ac: 36 85 ldd r19, Z+14 ; 0x0e 346ae: 47 85 ldd r20, Z+15 ; 0x0f 346b0: 50 89 ldd r21, Z+16 ; 0x10 346b2: c7 01 movw r24, r14 346b4: b6 01 movw r22, r12 346b6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 346ba: a5 01 movw r20, r10 346bc: 94 01 movw r18, r8 346be: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 346c2: 20 e0 ldi r18, 0x00 ; 0 346c4: 30 e9 ldi r19, 0x90 ; 144 346c6: 42 e2 ldi r20, 0x22 ; 34 346c8: 56 ec ldi r21, 0xC6 ; 198 346ca: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 346ce: 9b 01 movw r18, r22 346d0: 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)) + 346d2: 6a 81 ldd r22, Y+2 ; 0x02 346d4: 7b 81 ldd r23, Y+3 ; 0x03 346d6: 8c 81 ldd r24, Y+4 ; 0x04 346d8: 9d 81 ldd r25, Y+5 ; 0x05 346da: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 346de: 4b 01 movw r8, r22 346e0: 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)); 346e2: ee 81 ldd r30, Y+6 ; 0x06 346e4: ff 81 ldd r31, Y+7 ; 0x07 346e6: 21 8d ldd r18, Z+25 ; 0x19 346e8: 32 8d ldd r19, Z+26 ; 0x1a 346ea: 43 8d ldd r20, Z+27 ; 0x1b 346ec: 54 8d ldd r21, Z+28 ; 0x1c 346ee: c7 01 movw r24, r14 346f0: b6 01 movw r22, r12 346f2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 346f6: a3 01 movw r20, r6 346f8: 92 01 movw r18, r4 346fa: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 346fe: 20 e0 ldi r18, 0x00 ; 0 34700: 30 e9 ldi r19, 0x90 ; 144 34702: 42 ea ldi r20, 0xA2 ; 162 34704: 56 e4 ldi r21, 0x46 ; 70 34706: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 3470a: 9b 01 movw r18, r22 3470c: 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)) + 3470e: c5 01 movw r24, r10 34710: b4 01 movw r22, r8 34712: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__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] = 34716: f1 01 movw r30, r2 34718: 61 83 std Z+1, r22 ; 0x01 3471a: 72 83 std Z+2, r23 ; 0x02 3471c: 83 83 std Z+3, r24 ; 0x03 3471e: 94 83 std Z+4, r25 ; 0x04 34720: f4 e0 ldi r31, 0x04 ; 4 34722: 2f 0e add r2, r31 34724: 31 1c adc r3, r1 34726: 29 81 ldd r18, Y+1 ; 0x01 34728: 2f 5f subi r18, 0xFF ; 255 3472a: 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) { 3472c: 27 30 cpi r18, 0x07 ; 7 3472e: 09 f0 breq .+2 ; 0x34732 34730: 6f cf rjmp .-290 ; 0x34610 34732: 8e 81 ldd r24, Y+6 ; 0x06 34734: 9f 81 ldd r25, Y+7 ; 0x07 34736: 4c 96 adiw r24, 0x1c ; 28 34738: 9f 83 std Y+7, r25 ; 0x07 3473a: 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) { 3473c: 85 58 subi r24, 0x85 ; 133 3473e: 94 41 sbci r25, 0x14 ; 20 34740: 09 f0 breq .+2 ; 0x34744 34742: 63 cf rjmp .-314 ; 0x3460a 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() 34744: 19 87 std Y+9, r17 ; 0x09 34746: 08 87 std Y+8, r16 ; 0x08 34748: f1 e0 ldi r31, 0x01 ; 1 3474a: 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)) + 3474c: c8 01 movw r24, r16 3474e: 8b 5a subi r24, 0xAB ; 171 34750: 9f 4f sbci r25, 0xFF ; 255 34752: 9f 83 std Y+7, r25 ; 0x07 34754: 8e 83 std Y+6, r24 ; 0x06 z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1)); 34756: 18 01 movw r2, r16 34758: 99 ea ldi r25, 0xA9 ; 169 3475a: 29 0e add r2, r25 3475c: 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])) 3475e: e8 85 ldd r30, Y+8 ; 0x08 34760: f9 85 ldd r31, Y+9 ; 0x09 34762: 65 8d ldd r22, Z+29 ; 0x1d 34764: 76 8d ldd r23, Z+30 ; 0x1e 34766: 87 8d ldd r24, Z+31 ; 0x1f 34768: 90 a1 ldd r25, Z+32 ; 0x20 3476a: 9b 01 movw r18, r22 3476c: ac 01 movw r20, r24 3476e: 0f 94 46 e1 call 0x3c28c ; 0x3c28c <__unordsf2> 34772: 88 23 and r24, r24 34774: 09 f4 brne .+2 ; 0x34778 34776: 79 c0 rjmp .+242 ; 0x3486a static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; } 34778: 89 81 ldd r24, Y+1 ; 0x01 3477a: 0f 94 29 ca call 0x39452 ; 0x39452 3477e: 20 e0 ldi r18, 0x00 ; 0 34780: 30 e0 ldi r19, 0x00 ; 0 34782: 40 ea ldi r20, 0xA0 ; 160 34784: 50 e4 ldi r21, 0x40 ; 64 34786: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3478a: 6b 01 movw r12, r22 3478c: 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)) + 3478e: 20 e0 ldi r18, 0x00 ; 0 34790: 30 e0 ldi r19, 0x00 ; 0 34792: 48 ed ldi r20, 0xD8 ; 216 34794: 52 e4 ldi r21, 0x42 ; 66 34796: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3479a: 2b 01 movw r4, r22 3479c: 3c 01 movw r6, r24 3479e: 20 e0 ldi r18, 0x00 ; 0 347a0: 30 e0 ldi r19, 0x00 ; 0 347a2: 42 e5 ldi r20, 0x52 ; 82 347a4: 53 e4 ldi r21, 0x43 ; 67 347a6: c7 01 movw r24, r14 347a8: b6 01 movw r22, r12 347aa: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 347ae: 4b 01 movw r8, r22 347b0: 5c 01 movw r10, r24 z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + 347b2: 20 e0 ldi r18, 0x00 ; 0 347b4: 30 e0 ldi r19, 0x00 ; 0 347b6: 40 ec ldi r20, 0xC0 ; 192 347b8: 50 e4 ldi r21, 0x40 ; 64 347ba: c7 01 movw r24, r14 347bc: b6 01 movw r22, r12 347be: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 347c2: 6b 01 movw r12, r22 347c4: 7c 01 movw r14, r24 347c6: ee 81 ldd r30, Y+6 ; 0x06 347c8: ff 81 ldd r31, Y+7 ; 0x07 347ca: 20 81 ld r18, Z 347cc: 31 81 ldd r19, Z+1 ; 0x01 347ce: 42 81 ldd r20, Z+2 ; 0x02 347d0: 53 81 ldd r21, Z+3 ; 0x03 347d2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 347d6: a5 01 movw r20, r10 347d8: 94 01 movw r18, r8 347da: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 347de: 20 e0 ldi r18, 0x00 ; 0 347e0: 30 e9 ldi r19, 0x90 ; 144 347e2: 42 e2 ldi r20, 0x22 ; 34 347e4: 56 ec ldi r21, 0xC6 ; 198 347e6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 347ea: 6a 83 std Y+2, r22 ; 0x02 347ec: 7b 83 std Y+3, r23 ; 0x03 347ee: 8c 83 std Y+4, r24 ; 0x04 347f0: 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)) + 347f2: f8 01 movw r30, r16 347f4: 21 81 ldd r18, Z+1 ; 0x01 347f6: 32 81 ldd r19, Z+2 ; 0x02 347f8: 43 81 ldd r20, Z+3 ; 0x03 347fa: 54 81 ldd r21, Z+4 ; 0x04 347fc: c3 01 movw r24, r6 347fe: b2 01 movw r22, r4 34800: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34804: a5 01 movw r20, r10 34806: 94 01 movw r18, r8 34808: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3480c: 20 e0 ldi r18, 0x00 ; 0 3480e: 30 e9 ldi r19, 0x90 ; 144 34810: 42 ea ldi r20, 0xA2 ; 162 34812: 56 e4 ldi r21, 0x46 ; 70 34814: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 34818: 9b 01 movw r18, r22 3481a: ac 01 movw r20, r24 3481c: 6a 81 ldd r22, Y+2 ; 0x02 3481e: 7b 81 ldd r23, Y+3 ; 0x03 34820: 8c 81 ldd r24, Y+4 ; 0x04 34822: 9d 81 ldd r25, Y+5 ; 0x05 34824: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 34828: 4b 01 movw r8, r22 3482a: 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)); 3482c: f1 01 movw r30, r2 3482e: 20 81 ld r18, Z 34830: 31 81 ldd r19, Z+1 ; 0x01 34832: 42 81 ldd r20, Z+2 ; 0x02 34834: 53 81 ldd r21, Z+3 ; 0x03 34836: c7 01 movw r24, r14 34838: b6 01 movw r22, r12 3483a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3483e: a3 01 movw r20, r6 34840: 92 01 movw r18, r4 34842: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 34846: 20 e0 ldi r18, 0x00 ; 0 34848: 30 e9 ldi r19, 0x90 ; 144 3484a: 42 ea ldi r20, 0xA2 ; 162 3484c: 56 e4 ldi r21, 0x46 ; 70 3484e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 34852: 9b 01 movw r18, r22 34854: 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)) + 34856: c5 01 movw r24, r10 34858: b4 01 movw r22, r8 3485a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__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] = 3485e: e8 85 ldd r30, Y+8 ; 0x08 34860: f9 85 ldd r31, Y+9 ; 0x09 34862: 65 8f std Z+29, r22 ; 0x1d 34864: 76 8f std Z+30, r23 ; 0x1e 34866: 87 8f std Z+31, r24 ; 0x1f 34868: 90 a3 std Z+32, r25 ; 0x20 3486a: 88 85 ldd r24, Y+8 ; 0x08 3486c: 99 85 ldd r25, Y+9 ; 0x09 3486e: 4c 96 adiw r24, 0x1c ; 28 34870: 99 87 std Y+9, r25 ; 0x09 34872: 88 87 std Y+8, r24 ; 0x08 34874: 99 81 ldd r25, Y+1 ; 0x01 34876: 9f 5f subi r25, 0xFF ; 255 34878: 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) { 3487a: 96 30 cpi r25, 0x06 ; 6 3487c: 09 f0 breq .+2 ; 0x34880 3487e: 6f cf rjmp .-290 ; 0x3475e 34880: 0c 5f subi r16, 0xFC ; 252 34882: 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) { 34884: e3 e1 ldi r30, 0x13 ; 19 34886: 0d 3d cpi r16, 0xDD ; 221 34888: 1e 07 cpc r17, r30 3488a: 09 f0 breq .+2 ; 0x3488e 3488c: 5b cf rjmp .-330 ; 0x34744 z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) + z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1)); } } } } 3488e: 29 96 adiw r28, 0x09 ; 9 34890: 0f b6 in r0, 0x3f ; 63 34892: f8 94 cli 34894: de bf out 0x3e, r29 ; 62 34896: 0f be out 0x3f, r0 ; 63 34898: cd bf out 0x3d, r28 ; 61 3489a: df 91 pop r29 3489c: cf 91 pop r28 3489e: 1f 91 pop r17 348a0: 0f 91 pop r16 348a2: ff 90 pop r15 348a4: ef 90 pop r14 348a6: df 90 pop r13 348a8: cf 90 pop r12 348aa: bf 90 pop r11 348ac: af 90 pop r10 348ae: 9f 90 pop r9 348b0: 8f 90 pop r8 348b2: 7f 90 pop r7 348b4: 6f 90 pop r6 348b6: 5f 90 pop r5 348b8: 4f 90 pop r4 348ba: 3f 90 pop r3 348bc: 2f 90 pop r2 348be: 08 95 ret 000348c0 : 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) { 348c0: 1f 93 push r17 348c2: cf 93 push r28 348c4: df 93 push r29 348c6: 00 d0 rcall .+0 ; 0x348c8 348c8: 1f 92 push r1 348ca: 1f 92 push r1 348cc: cd b7 in r28, 0x3d ; 61 348ce: de b7 in r29, 0x3e ; 62 348d0: 16 2f mov r17, r22 SendMsg(RequestMsg(RequestMsgCodes::Read, index)); 348d2: 48 2f mov r20, r24 348d4: 62 e5 ldi r22, 0x52 ; 82 348d6: ce 01 movw r24, r28 348d8: 01 96 adiw r24, 0x01 ; 1 348da: 0f 94 81 c5 call 0x38b02 ; 0x38b02 348de: 49 81 ldd r20, Y+1 ; 0x01 348e0: 5a 81 ldd r21, Y+2 ; 0x02 348e2: 6b 81 ldd r22, Y+3 ; 0x03 348e4: 7c 81 ldd r23, Y+4 ; 0x04 348e6: 8d 81 ldd r24, Y+5 ; 0x05 348e8: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 scopeState = nextState; 348ec: 10 93 4d 13 sts 0x134D, r17 ; 0x80134d } 348f0: 0f 90 pop r0 348f2: 0f 90 pop r0 348f4: 0f 90 pop r0 348f6: 0f 90 pop r0 348f8: 0f 90 pop r0 348fa: df 91 pop r29 348fc: cf 91 pop r28 348fe: 1f 91 pop r17 34900: 08 95 ret 00034902 : SendMsg(RequestMsg(RequestMsgCodes::Query, 0)); scopeState = ScopeState::QuerySent; } void ProtocolLogic::StartReading8bitRegisters() { regIndex = 0; 34902: 10 92 98 13 sts 0x1398, r1 ; 0x801398 SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); 34906: e0 e9 ldi r30, 0x90 ; 144 34908: fa ea ldi r31, 0xAA ; 170 3490a: 84 91 lpm r24, Z 3490c: 67 e0 ldi r22, 0x07 ; 7 3490e: 0d 94 60 a4 jmp 0x348c0 ; 0x348c0 00034912 : regIndex = 0; SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); } ProtocolLogic::ScopeState __attribute__((noinline)) ProtocolLogic::ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd) { regs16[regIndex] = rsp.paramValue; 34912: e0 91 98 13 lds r30, 0x1398 ; 0x801398 34916: ae 2f mov r26, r30 34918: b0 e0 ldi r27, 0x00 ; 0 3491a: aa 0f add r26, r26 3491c: bb 1f adc r27, r27 3491e: ae 56 subi r26, 0x6E ; 110 34920: bc 4e sbci r27, 0xEC ; 236 34922: 20 91 65 13 lds r18, 0x1365 ; 0x801365 34926: 30 91 66 13 lds r19, 0x1366 ; 0x801366 3492a: 2d 93 st X+, r18 3492c: 3c 93 st X, r19 ++regIndex; 3492e: ef 5f subi r30, 0xFF ; 255 34930: e0 93 98 13 sts 0x1398, r30 ; 0x801398 if (regIndex >= regs16Count) { 34934: e2 30 cpi r30, 0x02 ; 2 34936: 40 f4 brcc .+16 ; 0x34948 return stateAtEnd; } else { SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); 34938: f0 e0 ldi r31, 0x00 ; 0 3493a: e9 58 subi r30, 0x89 ; 137 3493c: f5 45 sbci r31, 0x55 ; 85 3493e: 84 91 lpm r24, Z 34940: 68 e0 ldi r22, 0x08 ; 8 34942: 0f 94 60 a4 call 0x348c0 ; 0x348c0 } return ScopeState::Reading16bitRegisters; 34946: 88 e0 ldi r24, 0x08 ; 8 } 34948: 08 95 ret 0003494a : regIndex = 0; SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); } void ProtocolLogic::ProcessRead8bitRegister() { regs8[regIndex] = rsp.paramValue; 3494a: e0 91 98 13 lds r30, 0x1398 ; 0x801398 3494e: ae 2f mov r26, r30 34950: b0 e0 ldi r27, 0x00 ; 0 34952: a1 57 subi r26, 0x71 ; 113 34954: bc 4e sbci r27, 0xEC ; 236 34956: 80 91 65 13 lds r24, 0x1365 ; 0x801365 3495a: 8c 93 st X, r24 ++regIndex; 3495c: ef 5f subi r30, 0xFF ; 255 3495e: e0 93 98 13 sts 0x1398, r30 ; 0x801398 if (regIndex >= regs8Count) { 34962: e3 30 cpi r30, 0x03 ; 3 34964: 40 f0 brcs .+16 ; 0x34976 SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters); } } void ProtocolLogic::StartReading16bitRegisters() { regIndex = 0; 34966: 10 92 98 13 sts 0x1398, r1 ; 0x801398 SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters); 3496a: e7 e7 ldi r30, 0x77 ; 119 3496c: fa ea ldi r31, 0xAA ; 170 3496e: 84 91 lpm r24, Z 34970: 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); 34972: 0d 94 60 a4 jmp 0x348c0 ; 0x348c0 34976: f0 e0 ldi r31, 0x00 ; 0 34978: e0 57 subi r30, 0x70 ; 112 3497a: f5 45 sbci r31, 0x55 ; 85 3497c: 84 91 lpm r24, Z 3497e: 67 e0 ldi r22, 0x07 ; 7 34980: f8 cf rjmp .-16 ; 0x34972 00034982 : if (!ExpectsResponse()) { ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } bool ProtocolLogic::ActivatePlannedRequest() { 34982: cf 93 push r28 34984: df 93 push r29 34986: 00 d0 rcall .+0 ; 0x34988 34988: 00 d0 rcall .+0 ; 0x3498a 3498a: 00 d0 rcall .+0 ; 0x3498c 3498c: 1f 92 push r1 3498e: cd b7 in r28, 0x3d ; 61 34990: de b7 in r29, 0x3e ; 62 switch (plannedRq.code) { 34992: 80 91 54 13 lds r24, 0x1354 ; 0x801354 34996: 82 34 cpi r24, 0x42 ; 66 34998: 09 f4 brne .+2 ; 0x3499c 3499a: 46 c0 rjmp .+140 ; 0x34a28 3499c: b8 f5 brcc .+110 ; 0x34a0c 3499e: 88 23 and r24, r24 349a0: 09 f4 brne .+2 ; 0x349a4 349a2: 72 c0 rjmp .+228 ; 0x34a88 plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::unknown: return false; default: // commands currentScope = Scope::Command; 349a4: 84 e0 ldi r24, 0x04 ; 4 349a6: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c 349aa: 85 e0 ldi r24, 0x05 ; 5 349ac: e4 e5 ldi r30, 0x54 ; 84 349ae: f3 e1 ldi r31, 0x13 ; 19 349b0: de 01 movw r26, r28 349b2: 16 96 adiw r26, 0x06 ; 6 349b4: 01 90 ld r0, Z+ 349b6: 0d 92 st X+, r0 349b8: 8a 95 dec r24 349ba: e1 f7 brne .-8 ; 0x349b4 StepStatus StoppedStep() { return Processing; } StepStatus ProcessCommandQueryResponse(); inline void SetRequestMsg(RequestMsg msg) { rq = msg; 349bc: 85 e0 ldi r24, 0x05 ; 5 349be: fe 01 movw r30, r28 349c0: 36 96 adiw r30, 0x06 ; 6 349c2: af e4 ldi r26, 0x4F ; 79 349c4: b3 e1 ldi r27, 0x13 ; 19 349c6: 01 90 ld r0, Z+ 349c8: 0d 92 st X+, r0 349ca: 8a 95 dec r24 349cc: e1 f7 brne .-8 ; 0x349c6 SetRequestMsg(plannedRq); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); 349ce: 40 e0 ldi r20, 0x00 ; 0 349d0: 60 e0 ldi r22, 0x00 ; 0 349d2: ce 01 movw r24, r28 349d4: 01 96 adiw r24, 0x01 ; 1 349d6: 0f 94 81 c5 call 0x38b02 ; 0x38b02 349da: 85 e0 ldi r24, 0x05 ; 5 349dc: fe 01 movw r30, r28 349de: 31 96 adiw r30, 0x01 ; 1 349e0: a4 e5 ldi r26, 0x54 ; 84 349e2: b3 e1 ldi r27, 0x13 ; 19 349e4: 01 90 ld r0, Z+ 349e6: 0d 92 st X+, r0 349e8: 8a 95 dec r24 349ea: e1 f7 brne .-8 ; 0x349e4 void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; } void ProtocolLogic::CommandRestart() { scopeState = ScopeState::CommandSent; 349ec: 85 e0 ldi r24, 0x05 ; 5 349ee: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d SendMsg(rq); 349f2: 40 91 4f 13 lds r20, 0x134F ; 0x80134f 349f6: 50 91 50 13 lds r21, 0x1350 ; 0x801350 349fa: 60 91 51 13 lds r22, 0x1351 ; 0x801351 349fe: 70 91 52 13 lds r23, 0x1352 ; 0x801352 34a02: 80 91 53 13 lds r24, 0x1353 ; 0x801353 34a06: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 34a0a: 2e c0 rjmp .+92 ; 0x34a68 ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } bool ProtocolLogic::ActivatePlannedRequest() { switch (plannedRq.code) { 34a0c: 82 35 cpi r24, 0x52 ; 82 34a0e: b1 f1 breq .+108 ; 0x34a7c 34a10: 87 35 cpi r24, 0x57 ; 87 34a12: 41 f6 brne .-112 ; 0x349a4 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); 34a14: 60 91 56 13 lds r22, 0x1356 ; 0x801356 34a18: 70 91 57 13 lds r23, 0x1357 ; 0x801357 34a1c: 4c e0 ldi r20, 0x0C ; 12 34a1e: 80 91 55 13 lds r24, 0x1355 ; 0x801355 34a22: 0f 94 fe 67 call 0x2cffc ; 0x2cffc 34a26: 11 c0 rjmp .+34 ; 0x34a4a SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament())); scopeState = ScopeState::FilamentSensorStateSent; } void ProtocolLogic::SendButton(uint8_t btn) { SendMsg(RequestMsg(RequestMsgCodes::Button, btn)); 34a28: 40 91 55 13 lds r20, 0x1355 ; 0x801355 34a2c: 62 e4 ldi r22, 0x42 ; 66 34a2e: ce 01 movw r24, r28 34a30: 01 96 adiw r24, 0x01 ; 1 34a32: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34a36: 49 81 ldd r20, Y+1 ; 0x01 34a38: 5a 81 ldd r21, Y+2 ; 0x02 34a3a: 6b 81 ldd r22, Y+3 ; 0x03 34a3c: 7c 81 ldd r23, Y+4 ; 0x04 34a3e: 8d 81 ldd r24, Y+5 ; 0x05 34a40: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 scopeState = ScopeState::ButtonSent; 34a44: 8a e0 ldi r24, 0x0A ; 10 34a46: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d 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); 34a4a: 40 e0 ldi r20, 0x00 ; 0 34a4c: 60 e0 ldi r22, 0x00 ; 0 34a4e: ce 01 movw r24, r28 34a50: 01 96 adiw r24, 0x01 ; 1 34a52: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34a56: 85 e0 ldi r24, 0x05 ; 5 34a58: fe 01 movw r30, r28 34a5a: 31 96 adiw r30, 0x01 ; 1 34a5c: a4 e5 ldi r26, 0x54 ; 84 34a5e: b3 e1 ldi r27, 0x13 ; 19 34a60: 01 90 ld r0, Z+ 34a62: 0d 92 st X+, r0 34a64: 8a 95 dec r24 34a66: e1 f7 brne .-8 ; 0x34a60 default: // commands currentScope = Scope::Command; SetRequestMsg(plannedRq); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); CommandRestart(); return true; 34a68: 81 e0 ldi r24, 0x01 ; 1 } } 34a6a: 2a 96 adiw r28, 0x0a ; 10 34a6c: 0f b6 in r0, 0x3f ; 63 34a6e: f8 94 cli 34a70: de bf out 0x3e, r29 ; 62 34a72: 0f be out 0x3f, r0 ; 63 34a74: cd bf out 0x3d, r28 ; 61 34a76: df 91 pop r29 34a78: cf 91 pop r28 34a7a: 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); 34a7c: 6b e0 ldi r22, 0x0B ; 11 34a7e: 80 91 55 13 lds r24, 0x1355 ; 0x801355 34a82: 0f 94 60 a4 call 0x348c0 ; 0x348c0 34a86: e1 cf rjmp .-62 ; 0x34a4a case RequestMsgCodes::Write: SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent); plannedRq = RequestMsg(RequestMsgCodes::unknown, 0); return true; case RequestMsgCodes::unknown: return false; 34a88: 80 e0 ldi r24, 0x00 ; 0 34a8a: ef cf rjmp .-34 ; 0x34a6a 00034a8c : void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data)); } void ProtocolLogic::PlanGenericRequest(RequestMsg rq) { 34a8c: cf 93 push r28 34a8e: df 93 push r29 34a90: 00 d0 rcall .+0 ; 0x34a92 34a92: 1f 92 push r1 34a94: 1f 92 push r1 34a96: cd b7 in r28, 0x3d ; 61 34a98: de b7 in r29, 0x3e ; 62 34a9a: 49 83 std Y+1, r20 ; 0x01 34a9c: 5a 83 std Y+2, r21 ; 0x02 34a9e: 6b 83 std Y+3, r22 ; 0x03 34aa0: 7c 83 std Y+4, r23 ; 0x04 34aa2: 8d 83 std Y+5, r24 ; 0x05 plannedRq = rq; 34aa4: 85 e0 ldi r24, 0x05 ; 5 34aa6: fe 01 movw r30, r28 34aa8: 31 96 adiw r30, 0x01 ; 1 34aaa: a4 e5 ldi r26, 0x54 ; 84 34aac: b3 e1 ldi r27, 0x13 ; 19 34aae: 01 90 ld r0, Z+ 34ab0: 0d 92 st X+, r0 34ab2: 8a 95 dec r24 34ab4: e1 f7 brne .-8 ; 0x34aae if (!ExpectsResponse()) { 34ab6: 80 91 4d 13 lds r24, 0x134D ; 0x80134d 34aba: 87 ff sbrs r24, 7 34abc: 09 c0 rjmp .+18 ; 0x34ad0 ActivatePlannedRequest(); } // otherwise wait for an empty window to activate the request } 34abe: 0f 90 pop r0 34ac0: 0f 90 pop r0 34ac2: 0f 90 pop r0 34ac4: 0f 90 pop r0 34ac6: 0f 90 pop r0 34ac8: df 91 pop r29 34aca: cf 91 pop r28 } void ProtocolLogic::PlanGenericRequest(RequestMsg rq) { plannedRq = rq; if (!ExpectsResponse()) { ActivatePlannedRequest(); 34acc: 0d 94 c1 a4 jmp 0x34982 ; 0x34982 } // otherwise wait for an empty window to activate the request } 34ad0: 0f 90 pop r0 34ad2: 0f 90 pop r0 34ad4: 0f 90 pop r0 34ad6: 0f 90 pop r0 34ad8: 0f 90 pop r0 34ada: df 91 pop r29 34adc: cf 91 pop r28 34ade: 08 95 ret 00034ae0 : void ProtocolLogic::SendButton(uint8_t btn) { SendMsg(RequestMsg(RequestMsgCodes::Button, btn)); scopeState = ScopeState::ButtonSent; } void ProtocolLogic::SendVersion(uint8_t stage) { 34ae0: 1f 93 push r17 34ae2: cf 93 push r28 34ae4: df 93 push r29 34ae6: 00 d0 rcall .+0 ; 0x34ae8 34ae8: 1f 92 push r1 34aea: 1f 92 push r1 34aec: cd b7 in r28, 0x3d ; 61 34aee: de b7 in r29, 0x3e ; 62 34af0: 18 2f mov r17, r24 SendMsg(RequestMsg(RequestMsgCodes::Version, stage)); 34af2: 48 2f mov r20, r24 34af4: 63 e5 ldi r22, 0x53 ; 83 34af6: ce 01 movw r24, r28 34af8: 01 96 adiw r24, 0x01 ; 1 34afa: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34afe: 49 81 ldd r20, Y+1 ; 0x01 34b00: 5a 81 ldd r21, Y+2 ; 0x02 34b02: 6b 81 ldd r22, Y+3 ; 0x03 34b04: 7c 81 ldd r23, Y+4 ; 0x04 34b06: 8d 81 ldd r24, Y+5 ; 0x05 34b08: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage); 34b0c: 10 93 4d 13 sts 0x134D, r17 ; 0x80134d } 34b10: 0f 90 pop r0 34b12: 0f 90 pop r0 34b14: 0f 90 pop r0 34b16: 0f 90 pop r0 34b18: 0f 90 pop r0 34b1a: df 91 pop r29 34b1c: cf 91 pop r28 34b1e: 1f 91 pop r17 34b20: 08 95 ret 00034b22 : if (fs != lastFSensor) { SendAndUpdateFilamentSensor(); } } void ProtocolLogic::SendQuery() { 34b22: cf 93 push r28 34b24: df 93 push r29 34b26: 00 d0 rcall .+0 ; 0x34b28 34b28: 1f 92 push r1 34b2a: 1f 92 push r1 34b2c: cd b7 in r28, 0x3d ; 61 34b2e: de b7 in r29, 0x3e ; 62 SendMsg(RequestMsg(RequestMsgCodes::Query, 0)); 34b30: 40 e0 ldi r20, 0x00 ; 0 34b32: 61 e5 ldi r22, 0x51 ; 81 34b34: ce 01 movw r24, r28 34b36: 01 96 adiw r24, 0x01 ; 1 34b38: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34b3c: 49 81 ldd r20, Y+1 ; 0x01 34b3e: 5a 81 ldd r21, Y+2 ; 0x02 34b40: 6b 81 ldd r22, Y+3 ; 0x03 34b42: 7c 81 ldd r23, Y+4 ; 0x04 34b44: 8d 81 ldd r24, Y+5 ; 0x05 34b46: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 scopeState = ScopeState::QuerySent; 34b4a: 84 e0 ldi r24, 0x04 ; 4 34b4c: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d } 34b50: 0f 90 pop r0 34b52: 0f 90 pop r0 34b54: 0f 90 pop r0 34b56: 0f 90 pop r0 34b58: 0f 90 pop r0 34b5a: df 91 pop r29 34b5c: cf 91 pop r28 34b5e: 08 95 ret 00034b60 : SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); } return false; } void ProtocolLogic::SendAndUpdateFilamentSensor() { 34b60: cf 93 push r28 34b62: df 93 push r29 34b64: 00 d0 rcall .+0 ; 0x34b66 34b66: 1f 92 push r1 34b68: 1f 92 push r1 34b6a: cd b7 in r28, 0x3d ; 61 34b6c: de b7 in r29, 0x3e ; 62 SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament())); 34b6e: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 34b72: 80 93 8e 13 sts 0x138E, r24 ; 0x80138e 34b76: 48 2f mov r20, r24 34b78: 66 e6 ldi r22, 0x66 ; 102 34b7a: ce 01 movw r24, r28 34b7c: 01 96 adiw r24, 0x01 ; 1 34b7e: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34b82: 49 81 ldd r20, Y+1 ; 0x01 34b84: 5a 81 ldd r21, Y+2 ; 0x02 34b86: 6b 81 ldd r22, Y+3 ; 0x03 34b88: 7c 81 ldd r23, Y+4 ; 0x04 34b8a: 8d 81 ldd r24, Y+5 ; 0x05 34b8c: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 scopeState = ScopeState::FilamentSensorStateSent; 34b90: 86 e0 ldi r24, 0x06 ; 6 34b92: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d } 34b96: 0f 90 pop r0 34b98: 0f 90 pop r0 34b9a: 0f 90 pop r0 34b9c: 0f 90 pop r0 34b9e: 0f 90 pop r0 34ba0: df 91 pop r29 34ba2: cf 91 pop r28 34ba4: 08 95 ret 00034ba6 : CheckAndReportAsyncEvents(); } return Processing; } StepStatus ProtocolLogic::ProcessCommandQueryResponse() { 34ba6: cf 93 push r28 34ba8: df 93 push r29 34baa: 00 d0 rcall .+0 ; 0x34bac 34bac: 1f 92 push r1 34bae: 1f 92 push r1 34bb0: cd b7 in r28, 0x3d ; 61 34bb2: de b7 in r29, 0x3e ; 62 switch (rsp.paramCode) { 34bb4: 80 91 64 13 lds r24, 0x1364 ; 0x801364 34bb8: 85 34 cpi r24, 0x45 ; 69 34bba: f1 f0 breq .+60 ; 0x34bf8 34bbc: 20 f4 brcc .+8 ; 0x34bc6 34bbe: 82 34 cpi r24, 0x42 ; 66 34bc0: 51 f1 breq .+84 ; 0x34c16 } else { // got response to some other command - the originally issued command was interrupted! return Interrupted; } default: return ProtocolError; 34bc2: 85 e0 ldi r24, 0x05 ; 5 34bc4: 11 c0 rjmp .+34 ; 0x34be8 } return Processing; } StepStatus ProtocolLogic::ProcessCommandQueryResponse() { switch (rsp.paramCode) { 34bc6: 86 34 cpi r24, 0x46 ; 70 34bc8: 71 f1 breq .+92 ; 0x34c26 34bca: 80 35 cpi r24, 0x50 ; 80 34bcc: d1 f7 brne .-12 ; 0x34bc2 case ResponseMsgParamCodes::Processing: progressCode = static_cast(rsp.paramValue); 34bce: 80 91 65 13 lds r24, 0x1365 ; 0x801365 34bd2: 80 93 8c 13 sts 0x138C, r24 ; 0x80138c errorCode = ErrorCode::OK; 34bd6: 81 e0 ldi r24, 0x01 ; 1 34bd8: 90 e0 ldi r25, 0x00 ; 0 34bda: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 34bde: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly 34be2: 0f 94 b0 a5 call 0x34b60 ; 0x34b60 return Processing; 34be6: 80 e0 ldi r24, 0x00 ; 0 return Interrupted; } default: return ProtocolError; } } 34be8: 0f 90 pop r0 34bea: 0f 90 pop r0 34bec: 0f 90 pop r0 34bee: 0f 90 pop r0 34bf0: 0f 90 pop r0 34bf2: df 91 pop r29 34bf4: cf 91 pop r28 34bf6: 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; 34bf8: 8c e0 ldi r24, 0x0C ; 12 34bfa: 80 93 8c 13 sts 0x138C, r24 ; 0x80138c errorCode = static_cast(rsp.paramValue); 34bfe: 80 91 65 13 lds r24, 0x1365 ; 0x801365 34c02: 90 91 66 13 lds r25, 0x1366 ; 0x801366 34c06: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 34c0a: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a // 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(); 34c0e: 0f 94 b0 a5 call 0x34b60 ; 0x34b60 return CommandError; 34c12: 87 e0 ldi r24, 0x07 ; 7 34c14: e9 cf rjmp .-46 ; 0x34be8 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); 34c16: 80 91 65 13 lds r24, 0x1365 ; 0x801365 34c1a: 80 93 8d 13 sts 0x138D, r24 ; 0x80138d SendAndUpdateFilamentSensor(); 34c1e: 0f 94 b0 a5 call 0x34b60 ; 0x34b60 return ButtonPushed; 34c22: 8b e0 ldi r24, 0x0B ; 11 34c24: e1 cf rjmp .-62 ; 0x34be8 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) { 34c26: 90 91 4f 13 lds r25, 0x134F ; 0x80134f 34c2a: 80 91 5f 13 lds r24, 0x135F ; 0x80135f 34c2e: 98 13 cpse r25, r24 34c30: 22 c0 rjmp .+68 ; 0x34c76 34c32: 90 91 50 13 lds r25, 0x1350 ; 0x801350 34c36: 80 91 60 13 lds r24, 0x1360 ; 0x801360 34c3a: 98 13 cpse r25, r24 34c3c: 1c c0 rjmp .+56 ; 0x34c76 progressCode = ProgressCode::OK; 34c3e: 10 92 8c 13 sts 0x138C, r1 ; 0x80138c errorCode = ErrorCode::OK; 34c42: 81 e0 ldi r24, 0x01 ; 1 34c44: 90 e0 ldi r25, 0x00 ; 0 34c46: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 34c4a: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a scopeState = ScopeState::Ready; 34c4e: 82 e8 ldi r24, 0x82 ; 130 34c50: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d rq = RequestMsg(RequestMsgCodes::unknown, 0); // clear the successfully finished request 34c54: 40 e0 ldi r20, 0x00 ; 0 34c56: 60 e0 ldi r22, 0x00 ; 0 34c58: ce 01 movw r24, r28 34c5a: 01 96 adiw r24, 0x01 ; 1 34c5c: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34c60: 85 e0 ldi r24, 0x05 ; 5 34c62: fe 01 movw r30, r28 34c64: 31 96 adiw r30, 0x01 ; 1 34c66: af e4 ldi r26, 0x4F ; 79 34c68: b3 e1 ldi r27, 0x13 ; 19 34c6a: 01 90 ld r0, Z+ 34c6c: 0d 92 st X+, r0 34c6e: 8a 95 dec r24 34c70: e1 f7 brne .-8 ; 0x34c6a 34c72: 82 e0 ldi r24, 0x02 ; 2 34c74: b9 cf rjmp .-142 ; 0x34be8 return Finished; } else { // got response to some other command - the originally issued command was interrupted! return Interrupted; 34c76: 83 e0 ldi r24, 0x03 ; 3 34c78: b7 cf rjmp .-146 ; 0x34be8 00034c7a : mmu_print_saved &= ~(SavedState::ParkExtruder); } } void MMU2::CheckUserInput() { 34c7a: 1f 93 push r17 34c7c: cf 93 push r28 34c7e: df 93 push r29 34c80: 00 d0 rcall .+0 ; 0x34c82 34c82: 1f 92 push r1 34c84: 1f 92 push r1 34c86: cd b7 in r28, 0x3d ; 61 34c88: de b7 in r29, 0x3e ; 62 const char *PrusaErrorButtonMore() { return MSG_BTN_MORE; } Buttons ButtonPressed(ErrorCode ec) { if (buttonSelectedOperation == ButtonOperations::NoOperation) { 34c8a: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 34c8e: 81 11 cpse r24, r1 34c90: 2a c0 rjmp .+84 ; 0x34ce6 auto btn = ButtonPressed(lastErrorCode); // Was a button pressed on the MMU itself instead of the LCD? if (btn == Buttons::NoButton && lastButton != Buttons::NoButton) { 34c92: 10 91 b4 13 lds r17, 0x13B4 ; 0x8013b4 34c96: 1f 3f cpi r17, 0xFF ; 255 34c98: 91 f5 brne .+100 ; 0x34cfe btn = lastButton; lastButton = Buttons::NoButton; // Clear it. } if (mmu2.MMULastErrorSource() == ErrorSourcePrinter && btn != Buttons::NoButton) { 34c9a: 80 91 b3 13 lds r24, 0x13B3 ; 0x8013b3 34c9e: 81 11 cpse r24, r1 34ca0: 60 c0 rjmp .+192 ; 0x34d62 34ca2: 1f 3f cpi r17, 0xFF ; 255 34ca4: b9 f0 breq .+46 ; 0x34cd4 inline void SetPrinterError(ErrorCode ec) { explicitPrinterError = ec; } inline void ClearPrinterError() { explicitPrinterError = ErrorCode::OK; 34ca6: 81 e0 ldi r24, 0x01 ; 1 34ca8: 90 e0 ldi r25, 0x00 ; 0 34caa: 90 93 4b 13 sts 0x134B, r25 ; 0x80134b 34cae: 80 93 4a 13 sts 0x134A, r24 ; 0x80134a } } void ClearPrinterError() { logic.ClearPrinterError(); lastErrorCode = ErrorCode::OK; 34cb2: 90 93 b2 13 sts 0x13B2, r25 ; 0x8013b2 34cb6: 80 93 b1 13 sts 0x13B1, r24 ; 0x8013b1 lastErrorSource = ErrorSource::ErrorSourceNone; 34cba: 8f ef ldi r24, 0xFF ; 255 34cbc: 80 93 b3 13 sts 0x13B3, r24 ; 0x8013b3 // 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) { 34cc0: 13 30 cpi r17, 0x03 ; 3 34cc2: 09 f4 brne .+2 ; 0x34cc6 34cc4: 82 c0 rjmp .+260 ; 0x34dca 34cc6: f8 f0 brcs .+62 ; 0x34d06 34cc8: 16 30 cpi r17, 0x06 ; 6 34cca: 08 f4 brcc .+2 ; 0x34cce 34ccc: 7b c0 rjmp .+246 ; 0x34dc4 34cce: 17 30 cpi r17, 0x07 ; 7 34cd0: 09 f4 brne .+2 ; 0x34cd4 34cd2: 7e c0 rjmp .+252 ; 0x34dd0 // @@TODO not sure if we shall handle this high level operation at this spot break; default: break; } } 34cd4: 0f 90 pop r0 34cd6: 0f 90 pop r0 34cd8: 0f 90 pop r0 34cda: 0f 90 pop r0 34cdc: 0f 90 pop r0 34cde: df 91 pop r29 34ce0: cf 91 pop r28 34ce2: 1f 91 pop r17 34ce4: 08 95 ret return Buttons::NoButton; // no button } const auto result = ButtonAvailable(ec); 34ce6: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 34cea: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 34cee: 0f 94 6b c8 call 0x390d6 ; 0x390d6 34cf2: 18 2f mov r17, r24 buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation 34cf4: 10 92 ad 0d sts 0x0DAD, r1 ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 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) { 34cf8: 8f 3f cpi r24, 0xFF ; 255 34cfa: 79 f6 brne .-98 ; 0x34c9a 34cfc: ca cf rjmp .-108 ; 0x34c92 btn = lastButton; lastButton = Buttons::NoButton; // Clear it. 34cfe: 8f ef ldi r24, 0xFF ; 255 34d00: 80 93 b4 13 sts 0x13B4, r24 ; 0x8013b4 34d04: ca cf rjmp .-108 ; 0x34c9a switch (btn) { case Buttons::Left: case Buttons::Middle: case Buttons::Right: SERIAL_ECHOPGM("CheckUserInput-btnLMR "); 34d06: 88 ec ldi r24, 0xC8 ; 200 34d08: 98 ea ldi r25, 0xA8 ; 168 34d0a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLN((int)buttons_to_uint8t(btn)); 34d0e: 81 2f mov r24, r17 34d10: 90 e0 ldi r25, 0x00 ; 0 34d12: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else... 34d16: 0f 94 08 ac call 0x35810 ; 0x35810 if (mmu2.MMULastErrorSource() == ErrorSourceMMU) { 34d1a: 80 91 b3 13 lds r24, 0x13B3 ; 0x8013b3 34d1e: 81 30 cpi r24, 0x01 ; 1 34d20: 89 f4 brne .+34 ; 0x34d44 ScreenUpdateEnable(); return true; } void MMU2::Button(uint8_t index) { LogEchoEvent_P(PSTR("Button")); 34d22: 81 ec ldi r24, 0xC1 ; 193 34d24: 98 ea ldi r25, 0xA8 ; 168 34d26: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode)); } void ProtocolLogic::Button(uint8_t index) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Button, index)); 34d2a: 41 2f mov r20, r17 34d2c: 62 e4 ldi r22, 0x42 ; 66 34d2e: ce 01 movw r24, r28 34d30: 01 96 adiw r24, 0x01 ; 1 34d32: 0f 94 81 c5 call 0x38b02 ; 0x38b02 34d36: 49 81 ldd r20, Y+1 ; 0x01 34d38: 5a 81 ldd r21, Y+2 ; 0x02 34d3a: 6b 81 ldd r22, Y+3 ; 0x03 34d3c: 7c 81 ldd r23, Y+4 ; 0x04 34d3e: 8d 81 ldd r24, Y+5 ; 0x05 34d40: 0f 94 46 a5 call 0x34a8c ; 0x34a8c } // 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) { 34d44: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 34d48: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 34d4c: 84 30 cpi r24, 0x04 ; 4 34d4e: 20 e8 ldi r18, 0x80 ; 128 34d50: 92 07 cpc r25, r18 34d52: 21 f0 breq .+8 ; 0x34d5c 34d54: 89 30 cpi r24, 0x09 ; 9 34d56: 90 48 sbci r25, 0x80 ; 128 34d58: 09 f0 breq .+2 ; 0x34d5c 34d5a: bc cf rjmp .-136 ; 0x34cd4 case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF: case ErrorCode::FSENSOR_TOO_EARLY: HelpUnloadToFinda(); 34d5c: 0f 94 03 6b call 0x2d606 ; 0x2d606 34d60: b9 cf rjmp .-142 ; 0x34cd4 // 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) { 34d62: 19 30 cpi r17, 0x09 ; 9 34d64: 08 f0 brcs .+2 ; 0x34d68 34d66: b6 cf rjmp .-148 ; 0x34cd4 34d68: e1 2f mov r30, r17 34d6a: f0 e0 ldi r31, 0x00 ; 0 34d6c: 88 27 eor r24, r24 34d6e: e4 54 subi r30, 0x44 ; 68 34d70: f9 45 sbci r31, 0x59 ; 89 34d72: 8e 4f sbci r24, 0xFE ; 254 34d74: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 34d78: b0 39 cpi r27, 0x90 ; 144 34d7a: b0 39 cpi r27, 0x90 ; 144 34d7c: b0 39 cpi r27, 0x90 ; 144 34d7e: 8c 3a cpi r24, 0xAC ; 172 34d80: bc 3a cpi r27, 0xAC ; 172 34d82: bc 3a cpi r27, 0xAC ; 172 34d84: 54 3a cpi r21, 0xA4 ; 164 34d86: e6 38 cpi r30, 0x86 ; 134 34d88: ac 3a cpi r26, 0xAC ; 172 logic.Stop(); mmu2Serial.close(); } void MMU2::Tune() { switch (lastErrorCode) { 34d8a: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 34d8e: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 34d92: 87 38 cpi r24, 0x87 ; 135 34d94: 20 e8 ldi r18, 0x80 ; 128 34d96: 92 07 cpc r25, r18 34d98: 21 f0 breq .+8 ; 0x34da2 34d9a: 87 30 cpi r24, 0x07 ; 7 34d9c: 91 48 sbci r25, 0x81 ; 129 34d9e: 09 f0 breq .+2 ; 0x34da2 34da0: 99 cf rjmp .-206 ; 0x34cd4 // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 34da2: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 34da6: 84 30 cpi r24, 0x04 ; 4 34da8: 21 f4 brne .+8 ; 0x34db2 ); MENU_END(); } void tuneIdlerStallguardThreshold() { if ((CommandInProgress)mmu2.GetCommandInProgress() != NoCommand) 34daa: 80 91 4f 13 lds r24, 0x134F ; 0x80134f 34dae: 81 11 cpse r24, r1 34db0: 91 cf rjmp .-222 ; 0x34cd4 // homing fails during toolchange. // To save the print, make the Tune button unresponsive for now. return; } putErrorScreenToSleep = true; 34db2: 81 e0 ldi r24, 0x01 ; 1 34db4: 80 93 ac 0d sts 0x0DAC, r24 ; 0x800dac <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.498> menu_submenu(tuneIdlerStallguardThresholdMenu); 34db8: 60 e0 ldi r22, 0x00 ; 0 34dba: 88 e4 ldi r24, 0x48 ; 72 34dbc: 9a e3 ldi r25, 0x3A ; 58 34dbe: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee 34dc2: 88 cf rjmp .-240 ; 0x34cd4 } /// @brief Queue a button operation which the printer can act upon /// @param btn Button operation inline void SetPrinterButtonOperation(Buttons btn) { printerButtonOperation = btn; 34dc4: 10 93 b7 13 sts 0x13B7, r17 ; 0x8013b7 34dc8: 85 cf rjmp .-246 ; 0x34cd4 void MMU2::ResetX42() { logic.ResetMMU(42); } void MMU2::TriggerResetPin() { reset(); 34dca: 0f 94 8e c5 call 0x38b1c ; 0x38b1c 34dce: 82 cf rjmp .-252 ; 0x34cd4 StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 34dd0: 10 92 b9 13 sts 0x13B9, r1 ; 0x8013b9 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 34dd4: 10 92 67 13 sts 0x1367, r1 ; 0x801367 currentScope = Scope::Stopped; 34dd8: 10 92 4c 13 sts 0x134C, r1 ; 0x80134c if (previous_value != value) { eeprom_byte_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_byte(dst, value); 34ddc: 60 e0 ldi r22, 0x00 ; 0 34dde: 8c ea ldi r24, 0xAC ; 172 34de0: 9c e0 ldi r25, 0x0C ; 12 34de2: 0f 94 34 dc call 0x3b868 ; 0x3b868 } /// Disables MMU in EEPROM void DisableMMUInSettings() { eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false); mmu2.Status(); 34de6: 0f 94 da 75 call 0x2ebb4 ; 0x2ebb4 34dea: 74 cf rjmp .-280 ; 0x34cd4 00034dec : avoidRecursion = true; mmu_loop_inner(true); avoidRecursion = false; } void __attribute__((noinline)) MMU2::mmu_loop_inner(bool reportErrors) { 34dec: 4f 92 push r4 34dee: 5f 92 push r5 34df0: 6f 92 push r6 34df2: 7f 92 push r7 34df4: 8f 92 push r8 34df6: 9f 92 push r9 34df8: af 92 push r10 34dfa: bf 92 push r11 34dfc: cf 92 push r12 34dfe: df 92 push r13 34e00: ef 92 push r14 34e02: ff 92 push r15 34e04: 0f 93 push r16 34e06: 1f 93 push r17 34e08: cf 93 push r28 34e0a: df 93 push r29 34e0c: cd b7 in r28, 0x3d ; 61 34e0e: de b7 in r29, 0x3e ; 62 34e10: a0 97 sbiw r28, 0x20 ; 32 34e12: 0f b6 in r0, 0x3f ; 63 34e14: f8 94 cli 34e16: de bf out 0x3e, r29 ; 62 34e18: 0f be out 0x3f, r0 ; 63 34e1a: cd bf out 0x3d, r28 ; 61 34e1c: 08 2f mov r16, r24 } } StepStatus MMU2::LogicStep(bool reportErrors) { // Process any buttons before proceeding with another MMU Query CheckUserInput(); 34e1e: 0f 94 3d a6 call 0x34c7a ; 0x34c7a DelayedRestartRestart(); return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError); } StepStatus ProtocolLogic::Step() { if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately 34e22: 80 91 4d 13 lds r24, 0x134D ; 0x80134d 34e26: 87 fd sbrc r24, 7 ActivatePlannedRequest(); 34e28: 0f 94 c1 a4 call 0x34982 ; 0x34982 34e2c: 90 91 4d 13 lds r25, 0x134D ; 0x80134d } return Processing; } StepStatus ProtocolLogic::ScopeStep() { if (!ExpectsResponse()) { 34e30: 97 ff sbrs r25, 7 34e32: 7d c0 rjmp .+250 ; 0x34f2e // we are waiting for something switch (currentScope) { 34e34: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 34e38: 82 30 cpi r24, 0x02 ; 2 34e3a: b1 f0 breq .+44 ; 0x34e68 34e3c: 08 f4 brcc .+2 ; 0x34e40 34e3e: 75 c0 rjmp .+234 ; 0x34f2a 34e40: 83 30 cpi r24, 0x03 ; 3 34e42: e1 f1 breq .+120 ; 0x34ebc 34e44: 84 30 cpi r24, 0x04 ; 4 34e46: 09 f4 brne .+2 ; 0x34e4a 34e48: 54 c0 rjmp .+168 ; 0x34ef2 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 34e4a: 0f 94 c1 a4 call 0x34982 ; 0x34982 34e4e: 81 11 cpse r24, r1 34e50: 6b c3 rjmp .+1750 ; 0x35528 // and we have just received a response to a Q0 message about a command progress return ProcessCommandQueryResponse(); } void ProtocolLogic::SwitchToIdle() { state = State::Running; 34e52: 82 e0 ldi r24, 0x02 ; 2 34e54: 80 93 67 13 sts 0x1367, r24 ; 0x801367 currentScope = Scope::Idle; 34e58: 83 e0 ldi r24, 0x03 ; 3 34e5a: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 34e5e: 82 e8 ldi r24, 0x82 ; 130 34e60: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d // 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()) { 34e64: 12 e0 ldi r17, 0x02 ; 2 34e66: db c2 rjmp .+1462 ; 0x3541e IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 34e68: 0f 94 28 2a call 0x25450 ; 0x25450 34e6c: ab 01 movw r20, r22 34e6e: bc 01 movw r22, r24 34e70: 80 91 59 13 lds r24, 0x1359 ; 0x801359 34e74: 90 91 5a 13 lds r25, 0x135A ; 0x80135a 34e78: a0 91 5b 13 lds r26, 0x135B ; 0x80135b 34e7c: b0 91 5c 13 lds r27, 0x135C ; 0x80135c 34e80: 88 51 subi r24, 0x18 ; 24 34e82: 9c 4f sbci r25, 0xFC ; 252 34e84: af 4f sbci r26, 0xFF ; 255 34e86: 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 34e88: 48 17 cp r20, r24 34e8a: 59 07 cpc r21, r25 34e8c: 6a 07 cpc r22, r26 34e8e: 7b 07 cpc r23, r27 34e90: 08 f4 brcc .+2 ; 0x34e94 34e92: 4b c0 rjmp .+150 ; 0x34f2a void MMU2Serial::close() { // @@TODO - probably turn off the UART } int MMU2Serial::read() { return fgetc(uart2io); 34e94: 83 e9 ldi r24, 0x93 ; 147 34e96: 92 e1 ldi r25, 0x12 ; 18 34e98: 0f 94 3c da call 0x3b478 ; 0x3b478 while (uart->read() != -1) 34e9c: 01 96 adiw r24, 0x01 ; 1 34e9e: d1 f7 brne .-12 ; 0x34e94 initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 34ea0: 81 e0 ldi r24, 0x01 ; 1 34ea2: 80 93 67 13 sts 0x1367, r24 ; 0x801367 currentScope = Scope::StartSeq; 34ea6: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c rqState = RequestStates::Code; } /// resets the internal response decoding state (typically after an error) void ResetResponseDecoder() { rspState = ResponseStates::RequestCode; 34eaa: 10 92 6e 13 sts 0x136E, r1 ; 0x80136e LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 34eae: 86 e0 ldi r24, 0x06 ; 6 34eb0: 80 93 4e 13 sts 0x134E, r24 ; 0x80134e SendVersion(0); 34eb4: 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); 34eb6: 0f 94 70 a5 call 0x34ae0 ; 0x34ae0 34eba: 37 c0 rjmp .+110 ; 0x34f2a } return Processing; } StepStatus ProtocolLogic::IdleWait() { if (scopeState == ScopeState::Ready) { // check timeout 34ebc: 92 38 cpi r25, 0x82 ; 130 34ebe: 29 f6 brne .-118 ; 0x34e4a IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 34ec0: 0f 94 28 2a call 0x25450 ; 0x25450 34ec4: ab 01 movw r20, r22 34ec6: bc 01 movw r22, r24 34ec8: 80 91 59 13 lds r24, 0x1359 ; 0x801359 34ecc: 90 91 5a 13 lds r25, 0x135A ; 0x80135a 34ed0: a0 91 5b 13 lds r26, 0x135B ; 0x80135b 34ed4: b0 91 5c 13 lds r27, 0x135C ; 0x80135c 34ed8: 88 51 subi r24, 0x18 ; 24 34eda: 9c 4f sbci r25, 0xFC ; 252 34edc: af 4f sbci r26, 0xFF ; 255 34ede: bf 4f sbci r27, 0xFF ; 255 return Processing; } StepStatus ProtocolLogic::IdleWait() { if (scopeState == ScopeState::Ready) { // check timeout if (Elapsed(heartBeatPeriod)) { 34ee0: 48 17 cp r20, r24 34ee2: 59 07 cpc r21, r25 34ee4: 6a 07 cpc r22, r26 34ee6: 7b 07 cpc r23, r27 34ee8: 08 f4 brcc .+2 ; 0x34eec 34eea: af cf rjmp .-162 ; 0x34e4a void ProtocolLogic::SwitchFromStartToIdle() { state = State::Running; currentScope = Scope::Idle; IdleRestart(); SendQuery(); // force sending Q0 immediately 34eec: 0f 94 91 a5 call 0x34b22 ; 0x34b22 34ef0: 1c c0 rjmp .+56 ; 0x34f2a } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 34ef2: 0f 94 28 2a call 0x25450 ; 0x25450 34ef6: ab 01 movw r20, r22 34ef8: bc 01 movw r22, r24 34efa: 80 91 59 13 lds r24, 0x1359 ; 0x801359 34efe: 90 91 5a 13 lds r25, 0x135A ; 0x80135a 34f02: a0 91 5b 13 lds r26, 0x135B ; 0x80135b 34f06: b0 91 5c 13 lds r27, 0x135C ; 0x80135c 34f0a: 88 51 subi r24, 0x18 ; 24 34f0c: 9c 4f sbci r25, 0xFC ; 252 34f0e: af 4f sbci r26, 0xFF ; 255 34f10: bf 4f sbci r27, 0xFF ; 255 } return Processing; } StepStatus ProtocolLogic::CommandWait() { if (Elapsed(heartBeatPeriod)) { 34f12: 48 17 cp r20, r24 34f14: 59 07 cpc r21, r25 34f16: 6a 07 cpc r22, r26 34f18: 7b 07 cpc r23, r27 34f1a: 40 f7 brcc .-48 ; 0x34eec }; 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(); 34f1c: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 if (fs != lastFSensor) { 34f20: 90 91 8e 13 lds r25, 0x138E ; 0x80138e 34f24: 89 13 cpse r24, r25 SendAndUpdateFilamentSensor(); 34f26: 0f 94 b0 a5 call 0x34b60 ; 0x34b60 // 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; 34f2a: 10 e0 ldi r17, 0x00 ; 0 34f2c: 78 c2 rjmp .+1264 ; 0x3541e StepStatus ProtocolLogic::ExpectingMessage() { int bytesConsumed = 0; int c = -1; OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;) 34f2e: a1 2c mov r10, r1 return State::SomethingElse; } }; StepStatus ProtocolLogic::ExpectingMessage() { int bytesConsumed = 0; 34f30: d1 2c mov r13, r1 34f32: 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; 34f34: 99 24 eor r9, r9 34f36: 93 94 inc r9 responseMsg.paramCode = (ResponseMsgParamCodes)c; responseMsg.paramValue = 0; return DecodeStatus::NeedMoreData; default: responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; 34f38: 55 e0 ldi r21, 0x05 ; 5 34f3a: b5 2e mov r11, r21 case 'E': case 'F': case 'A': case 'R': case 'B': rspState = ResponseStates::ParamValue; 34f3c: 63 e0 ldi r22, 0x03 ; 3 34f3e: 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; 34f40: 74 e0 ldi r23, 0x04 ; 4 34f42: 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; 34f44: e2 e0 ldi r30, 0x02 ; 2 34f46: 6e 2e mov r6, r30 34f48: 66 c0 rjmp .+204 ; 0x35016 ++i; return i; } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { 34f4a: 23 30 cpi r18, 0x03 ; 3 34f4c: 09 f4 brne .+2 ; 0x34f50 34f4e: e0 c0 rjmp .+448 ; 0x35110 34f50: 24 30 cpi r18, 0x04 ; 4 34f52: 09 f0 breq .+2 ; 0x34f56 34f54: 83 c0 rjmp .+262 ; 0x3505c } 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'); 34f56: 20 ed ldi r18, 0xD0 ; 208 34f58: 28 0f add r18, r24 34f5a: 2a 30 cpi r18, 0x0A ; 10 34f5c: 08 f4 brcc .+2 ; 0x34f60 34f5e: f8 c0 rjmp .+496 ; 0x35150 34f60: 2f e9 ldi r18, 0x9F ; 159 34f62: 28 0f add r18, r24 34f64: 26 30 cpi r18, 0x06 ; 6 34f66: 08 f4 brcc .+2 ; 0x34f6a 34f68: f3 c0 rjmp .+486 ; 0x35150 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 34f6a: 8a 30 cpi r24, 0x0A ; 10 34f6c: 09 f0 breq .+2 ; 0x34f70 34f6e: fa c0 rjmp .+500 ; 0x35164 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()) { 34f70: 40 90 73 13 lds r4, 0x1373 ; 0x801373 34f74: 8f e6 ldi r24, 0x6F ; 111 34f76: 93 e1 ldi r25, 0x13 ; 19 34f78: 0f 94 70 c5 call 0x38ae0 ; 0x38ae0 34f7c: 48 12 cpse r4, r24 34f7e: b8 c0 rjmp .+368 ; 0x350f0 // CRC mismatch responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; return DecodeStatus::Error; } else { rspState = ResponseStates::RequestCode; 34f80: 10 92 6e 13 sts 0x136E, r1 ; 0x80136e /// @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; } 34f84: 88 e0 ldi r24, 0x08 ; 8 34f86: ef e6 ldi r30, 0x6F ; 111 34f88: f3 e1 ldi r31, 0x13 ; 19 34f8a: de 01 movw r26, r28 34f8c: 51 96 adiw r26, 0x11 ; 17 34f8e: 01 90 ld r0, Z+ 34f90: 0d 92 st X+, r0 34f92: 8a 95 dec r24 34f94: e1 f7 brne .-8 ; 0x34f8e 34f96: 88 e0 ldi r24, 0x08 ; 8 34f98: fe 01 movw r30, r28 34f9a: 71 96 adiw r30, 0x11 ; 17 34f9c: de 01 movw r26, r28 34f9e: 59 96 adiw r26, 0x19 ; 25 34fa0: 01 90 ld r0, Z+ 34fa2: 0d 92 st X+, r0 34fa4: 8a 95 dec r24 34fa6: e1 f7 brne .-8 ; 0x34fa0 while ((c = uart->read()) >= 0) { ++bytesConsumed; RecordReceivedByte(c); switch (protocol.DecodeResponse(c)) { case DecodeStatus::MessageCompleted: rsp = protocol.GetResponseMsg(); 34fa8: 88 e0 ldi r24, 0x08 ; 8 34faa: fe 01 movw r30, r28 34fac: 79 96 adiw r30, 0x19 ; 25 34fae: af e5 ldi r26, 0x5F ; 95 34fb0: b3 e1 ldi r27, 0x13 ; 19 34fb2: 01 90 ld r0, Z+ 34fb4: 0d 92 st X+, r0 34fb6: 8a 95 dec r24 34fb8: e1 f7 brne .-8 ; 0x34fb2 } dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly } void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) { *dst++ = '<'; 34fba: 8c e3 ldi r24, 0x3C ; 60 34fbc: 89 83 std Y+1, r24 ; 0x01 34fbe: fe 01 movw r30, r28 34fc0: 32 96 adiw r30, 0x02 ; 2 34fc2: a7 e7 ldi r26, 0x77 ; 119 34fc4: b3 e1 ldi r27, 0x13 ; 19 for (uint8_t i = 0; i < lrb; ++i) { 34fc6: 20 e0 ldi r18, 0x00 ; 0 34fc8: cf 01 movw r24, r30 34fca: 52 16 cp r5, r18 34fcc: 09 f4 brne .+2 ; 0x34fd0 34fce: cd c0 rjmp .+410 ; 0x3516a uint8_t b = lastReceivedBytes[i]; 34fd0: 3d 91 ld r19, X+ // Check for printable character, including space if (b < 32 || b > 127) { 34fd2: 40 ee ldi r20, 0xE0 ; 224 34fd4: 43 0f add r20, r19 34fd6: 40 36 cpi r20, 0x60 ; 96 34fd8: 08 f0 brcs .+2 ; 0x34fdc b = '.'; 34fda: 3e e2 ldi r19, 0x2E ; 46 } *dst++ = b; 34fdc: 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) { 34fde: 2f 5f subi r18, 0xFF ; 255 34fe0: f4 cf rjmp .-24 ; 0x34fca } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 34fe2: 8e 34 cpi r24, 0x4E ; 78 34fe4: 08 f0 brcs .+2 ; 0x34fe8 34fe6: 56 c0 rjmp .+172 ; 0x35094 34fe8: 8b 34 cpi r24, 0x4B ; 75 34fea: 08 f0 brcs .+2 ; 0x34fee 34fec: 46 c0 rjmp .+140 ; 0x3507a 34fee: 82 34 cpi r24, 0x42 ; 66 34ff0: 09 f4 brne .+2 ; 0x34ff4 34ff2: 43 c0 rjmp .+134 ; 0x3507a 34ff4: e0 f5 brcc .+120 ; 0x3506e 34ff6: 8a 30 cpi r24, 0x0A ; 10 34ff8: 59 f0 breq .+22 ; 0x35010 34ffa: 8d 30 cpi r24, 0x0D ; 13 34ffc: 49 f0 breq .+18 ; 0x35010 } else if (IsCRCSeparator(c)) { rspState = ResponseStates::CRC; return DecodeStatus::NeedMoreData; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; rspState = ResponseStates::Error; 34ffe: b0 92 6e 13 sts 0x136E, r11 ; 0x80136e 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') { 35002: a1 10 cpse r10, r1 35004: 05 c1 rjmp .+522 ; 0x35210 35006: 1f 36 cpi r17, 0x6F ; 111 35008: 09 f0 breq .+2 ; 0x3500c 3500a: fc c3 rjmp .+2040 ; 0x35804 ++ok; 3500c: aa 24 eor r10, r10 3500e: 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; 35010: 4f ef ldi r20, 0xFF ; 255 35012: c4 1a sub r12, r20 35014: d4 0a sbc r13, r20 35016: 83 e9 ldi r24, 0x93 ; 147 35018: 92 e1 ldi r25, 0x12 ; 18 3501a: 0f 94 3c da call 0x3b478 ; 0x3b478 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) { 3501e: 97 fd sbrc r25, 7 35020: 00 c1 rjmp .+512 ; 0x35222 ++bytesConsumed; RecordReceivedByte(c); 35022: 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]; 35024: 20 91 87 13 lds r18, 0x1387 ; 0x801387 35028: 30 e0 ldi r19, 0x00 ; 0 void ProtocolLogic::RecordUARTActivity() { lastUARTActivityMs = _millis(); } void ProtocolLogic::RecordReceivedByte(uint8_t c) { lastReceivedBytes[lrb] = c; 3502a: f9 01 movw r30, r18 3502c: e6 5b subi r30, 0xB6 ; 182 3502e: fc 4e sbci r31, 0xEC ; 236 35030: 85 a7 std Z+45, r24 ; 0x2d lrb = (lrb + 1) % lastReceivedBytes.size(); 35032: 79 01 movw r14, r18 35034: ef ef ldi r30, 0xFF ; 255 35036: ee 1a sub r14, r30 35038: fe 0a sbc r15, r30 3503a: ff e0 ldi r31, 0x0F ; 15 3503c: ef 22 and r14, r31 3503e: ff 24 eor r15, r15 35040: 5e 2c mov r5, r14 35042: e0 92 87 13 sts 0x1387, r14 ; 0x801387 ++i; return i; } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { 35046: 20 91 6e 13 lds r18, 0x136E ; 0x80136e 3504a: 22 30 cpi r18, 0x02 ; 2 3504c: 09 f4 brne .+2 ; 0x35050 3504e: 48 c0 rjmp .+144 ; 0x350e0 35050: 08 f0 brcs .+2 ; 0x35054 35052: 7b cf rjmp .-266 ; 0x34f4a 35054: 22 23 and r18, r18 35056: 29 f2 breq .-118 ; 0x34fe2 35058: 21 30 cpi r18, 0x01 ; 1 3505a: 51 f1 breq .+84 ; 0x350b0 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 3505c: 1a 30 cpi r17, 0x0A ; 10 3505e: 09 f4 brne .+2 ; 0x35062 35060: 8f cf rjmp .-226 ; 0x34f80 35062: 1d 30 cpi r17, 0x0D ; 13 35064: 09 f4 brne .+2 ; 0x35068 35066: 8c cf rjmp .-232 ; 0x34f80 default: //case error: if (IsNewLine(c)) { rspState = ResponseStates::RequestCode; return DecodeStatus::MessageCompleted; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; 35068: 10 92 74 13 sts 0x1374, r1 ; 0x801374 3506c: ca cf rjmp .-108 ; 0x35002 } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 3506e: 85 34 cpi r24, 0x45 ; 69 35070: 30 f2 brcs .-116 ; 0x34ffe 35072: 87 34 cpi r24, 0x47 ; 71 35074: 10 f0 brcs .+4 ; 0x3507a 35076: 88 34 cpi r24, 0x48 ; 72 35078: 11 f6 brne .-124 ; 0x34ffe case 'K': case 'F': case 'f': case 'H': case 'R': responseMsg.request.code = (RequestMsgCodes)c; 3507a: 80 93 6f 13 sts 0x136F, r24 ; 0x80136f responseMsg.request.value = 0; 3507e: 10 92 70 13 sts 0x1370, r1 ; 0x801370 responseMsg.request.value2 = 0; 35082: 10 92 72 13 sts 0x1372, r1 ; 0x801372 35086: 10 92 71 13 sts 0x1371, r1 ; 0x801371 responseMsg.request.crc8 = 0; 3508a: 10 92 73 13 sts 0x1373, r1 ; 0x801373 rspState = ResponseStates::RequestValue; 3508e: 90 92 6e 13 sts 0x136E, r9 ; 0x80136e 35092: be cf rjmp .-132 ; 0x35010 } DecodeStatus Protocol::DecodeResponse(uint8_t c) { switch (rspState) { case ResponseStates::RequestCode: switch (c) { 35094: 89 35 cpi r24, 0x59 ; 89 35096: 40 f4 brcc .+16 ; 0x350a8 35098: 87 35 cpi r24, 0x57 ; 87 3509a: 78 f7 brcc .-34 ; 0x3507a 3509c: 20 eb ldi r18, 0xB0 ; 176 3509e: 28 0f add r18, r24 350a0: 26 30 cpi r18, 0x06 ; 6 350a2: 08 f0 brcs .+2 ; 0x350a6 350a4: ac cf rjmp .-168 ; 0x34ffe 350a6: e9 cf rjmp .-46 ; 0x3507a 350a8: 86 36 cpi r24, 0x66 ; 102 350aa: 09 f0 breq .+2 ; 0x350ae 350ac: a8 cf rjmp .-176 ; 0x34ffe 350ae: e5 cf rjmp .-54 ; 0x3507a } 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'); 350b0: 20 ed ldi r18, 0xD0 ; 208 350b2: 28 0f add r18, r24 350b4: 2a 30 cpi r18, 0x0A ; 10 350b6: 50 f0 brcs .+20 ; 0x350cc 350b8: 2f e9 ldi r18, 0x9F ; 159 350ba: 28 0f add r18, r24 350bc: 26 30 cpi r18, 0x06 ; 6 350be: 30 f0 brcs .+12 ; 0x350cc case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; responseMsg.request.value += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (c == ' ') { 350c0: 80 32 cpi r24, 0x20 ; 32 350c2: 09 f0 breq .+2 ; 0x350c6 350c4: 9c cf rjmp .-200 ; 0x34ffe rspState = ResponseStates::ParamCode; 350c6: 60 92 6e 13 sts 0x136E, r6 ; 0x80136e 350ca: a2 cf rjmp .-188 ; 0x35010 return DecodeStatus::Error; } case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; responseMsg.request.value += Char2Nibble(c); 350cc: 0f 94 4f c5 call 0x38a9e ; 0x38a9e rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::RequestValue: if (IsHexDigit(c)) { responseMsg.request.value <<= 4U; 350d0: 90 91 70 13 lds r25, 0x1370 ; 0x801370 350d4: 92 95 swap r25 350d6: 90 7f andi r25, 0xF0 ; 240 responseMsg.request.value += Char2Nibble(c); 350d8: 89 0f add r24, r25 350da: 80 93 70 13 sts 0x1370, r24 ; 0x801370 350de: 98 cf rjmp .-208 ; 0x35010 } else { rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamCode: switch (c) { 350e0: 87 34 cpi r24, 0x47 ; 71 350e2: 48 f4 brcc .+18 ; 0x350f6 350e4: 85 34 cpi r24, 0x45 ; 69 350e6: 58 f4 brcc .+22 ; 0x350fe 350e8: 2f eb ldi r18, 0xBF ; 191 350ea: 28 0f add r18, r24 350ec: 22 30 cpi r18, 0x02 ; 2 350ee: 38 f0 brcs .+14 ; 0x350fe return DecodeStatus::NeedMoreData; } else if (IsCRCSeparator(c)) { rspState = ResponseStates::CRC; return DecodeStatus::NeedMoreData; } else { responseMsg.paramCode = ResponseMsgParamCodes::unknown; 350f0: 10 92 74 13 sts 0x1374, r1 ; 0x801374 350f4: 84 cf rjmp .-248 ; 0x34ffe } else { rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamCode: switch (c) { 350f6: 80 35 cpi r24, 0x50 ; 80 350f8: 11 f0 breq .+4 ; 0x350fe 350fa: 82 35 cpi r24, 0x52 ; 82 350fc: c9 f7 brne .-14 ; 0x350f0 case 'E': case 'F': case 'A': case 'R': case 'B': rspState = ResponseStates::ParamValue; 350fe: 80 92 6e 13 sts 0x136E, r8 ; 0x80136e responseMsg.paramCode = (ResponseMsgParamCodes)c; 35102: 80 93 74 13 sts 0x1374, r24 ; 0x801374 responseMsg.paramValue = 0; 35106: 10 92 76 13 sts 0x1376, r1 ; 0x801376 3510a: 10 92 75 13 sts 0x1375, r1 ; 0x801375 3510e: 80 cf rjmp .-256 ; 0x35010 35110: 20 ed ldi r18, 0xD0 ; 208 35112: 28 0f add r18, r24 35114: 2a 30 cpi r18, 0x0A ; 10 35116: 48 f0 brcs .+18 ; 0x3512a 35118: 2f e9 ldi r18, 0x9F ; 159 3511a: 28 0f add r18, r24 3511c: 26 30 cpi r18, 0x06 ; 6 3511e: 28 f0 brcs .+10 ; 0x3512a case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; responseMsg.paramValue += Char2Nibble(c); return DecodeStatus::NeedMoreData; } else if (IsCRCSeparator(c)) { 35120: 8a 32 cpi r24, 0x2A ; 42 35122: 31 f7 brne .-52 ; 0x350f0 rspState = ResponseStates::CRC; 35124: 70 92 6e 13 sts 0x136E, r7 ; 0x80136e 35128: 73 cf rjmp .-282 ; 0x35010 return DecodeStatus::Error; } case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; responseMsg.paramValue += Char2Nibble(c); 3512a: 0f 94 4f c5 call 0x38a9e ; 0x38a9e rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::ParamValue: if (IsHexDigit(c)) { responseMsg.paramValue <<= 4U; 3512e: 20 91 75 13 lds r18, 0x1375 ; 0x801375 35132: 30 91 76 13 lds r19, 0x1376 ; 0x801376 35136: 44 e0 ldi r20, 0x04 ; 4 35138: 22 0f add r18, r18 3513a: 33 1f adc r19, r19 3513c: 4a 95 dec r20 3513e: e1 f7 brne .-8 ; 0x35138 responseMsg.paramValue += Char2Nibble(c); 35140: 82 0f add r24, r18 35142: 93 2f mov r25, r19 35144: 91 1d adc r25, r1 35146: 90 93 76 13 sts 0x1376, r25 ; 0x801376 3514a: 80 93 75 13 sts 0x1375, r24 ; 0x801375 3514e: 60 cf rjmp .-320 ; 0x35010 return DecodeStatus::Error; } case ResponseStates::CRC: if (IsHexDigit(c)) { responseMsg.request.crc8 <<= 4U; responseMsg.request.crc8 += Char2Nibble(c); 35150: 0f 94 4f c5 call 0x38a9e ; 0x38a9e rspState = ResponseStates::Error; return DecodeStatus::Error; } case ResponseStates::CRC: if (IsHexDigit(c)) { responseMsg.request.crc8 <<= 4U; 35154: 90 91 73 13 lds r25, 0x1373 ; 0x801373 35158: 92 95 swap r25 3515a: 90 7f andi r25, 0xF0 ; 240 responseMsg.request.crc8 += Char2Nibble(c); 3515c: 89 0f add r24, r25 3515e: 80 93 73 13 sts 0x1373, r24 ; 0x801373 35162: 56 cf rjmp .-340 ; 0x35010 ResponseStates rspState; ResponseMsg responseMsg; static constexpr bool IsNewLine(uint8_t c) { return c == '\n' || c == '\r'; 35164: 8d 30 cpi r24, 0x0D ; 13 35166: 21 f6 brne .-120 ; 0x350f0 35168: 03 cf rjmp .-506 ; 0x34f70 if (b < 32 || b > 127) { b = '.'; } *dst++ = b; } *dst = 0; // terminate properly 3516a: e8 0e add r14, r24 3516c: f9 1e adc r15, r25 3516e: f7 01 movw r30, r14 35170: 10 82 st Z, r1 lrb = 0; // reset the input buffer index in case of a clean message 35172: 10 92 87 13 sts 0x1387, r1 ; 0x801387 } void ProtocolLogic::LogResponse() { char lrb[lastReceivedBytes.size()]; FormatLastResponseMsgAndClearLRB(lrb); MMU2_ECHO_MSGLN(lrb); 35176: 82 ef ldi r24, 0xF2 ; 242 35178: 9a ea ldi r25, 0xAA ; 170 3517a: 0e 94 e8 76 call 0xedd0 ; 0xedd0 3517e: 8c ee ldi r24, 0xEC ; 236 35180: 9a ea ldi r25, 0xAA ; 170 35182: 0e 94 e8 76 call 0xedd0 ; 0xedd0 35186: ce 01 movw r24, r28 35188: 01 96 adiw r24, 0x01 ; 1 3518a: 0f 94 f4 d5 call 0x3abe8 ; 0x3abe8 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 3518e: 0f 94 8d 66 call 0x2cd1a ; 0x2cd1a if (auto expmsg = ExpectingMessage(); expmsg != MessageReady) { // this whole statement takes 12B return expmsg; } // process message switch (currentScope) { 35192: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 35196: 81 30 cpi r24, 0x01 ; 1 35198: 09 f4 brne .+2 ; 0x3519c 3519a: 74 c0 rjmp .+232 ; 0x35284 3519c: 08 f4 brcc .+2 ; 0x351a0 3519e: c5 ce rjmp .-630 ; 0x34f2a 351a0: 83 30 cpi r24, 0x03 ; 3 351a2: 09 f4 brne .+2 ; 0x351a6 351a4: d1 c0 rjmp .+418 ; 0x35348 351a6: 84 30 cpi r24, 0x04 ; 4 351a8: 09 f0 breq .+2 ; 0x351ac 351aa: 4f ce rjmp .-866 ; 0x34e4a return ProtocolError; } } StepStatus ProtocolLogic::CommandStep() { switch (scopeState) { 351ac: 80 91 4d 13 lds r24, 0x134D ; 0x80134d 351b0: 86 30 cpi r24, 0x06 ; 6 351b2: 09 f4 brne .+2 ; 0x351b6 351b4: 6c c1 rjmp .+728 ; 0x3548e 351b6: 08 f0 brcs .+2 ; 0x351ba 351b8: 93 c1 rjmp .+806 ; 0x354e0 351ba: 84 30 cpi r24, 0x04 ; 4 351bc: 09 f4 brne .+2 ; 0x351c0 351be: 09 c1 rjmp .+530 ; 0x353d2 351c0: 85 30 cpi r24, 0x05 ; 5 351c2: 09 f0 breq .+2 ; 0x351c6 351c4: cc c0 rjmp .+408 ; 0x3535e case ScopeState::CommandSent: { switch (rsp.paramCode) { // the response should be either accepted or rejected 351c6: 80 91 64 13 lds r24, 0x1364 ; 0x801364 351ca: 81 34 cpi r24, 0x41 ; 65 351cc: 09 f4 brne .+2 ; 0x351d0 351ce: 96 c1 rjmp .+812 ; 0x354fc 351d0: 82 35 cpi r24, 0x52 ; 82 351d2: 09 f0 breq .+2 ; 0x351d6 351d4: c4 c0 rjmp .+392 ; 0x3535e errorCode = ErrorCode::RUNNING; scopeState = ScopeState::Wait; break; case ResponseMsgParamCodes::Rejected: // rejected - should normally not happen, but report the error up progressCode = ProgressCode::OK; 351d6: 10 92 8c 13 sts 0x138C, r1 ; 0x80138c errorCode = ErrorCode::PROTOCOL_ERROR; 351da: 8d e2 ldi r24, 0x2D ; 45 351dc: 90 e8 ldi r25, 0x80 ; 128 351de: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 351e2: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a } 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")); 351e6: 81 e3 ldi r24, 0x31 ; 49 351e8: 98 ea ldi r25, 0xA8 ; 168 351ea: 0f 94 aa 66 call 0x2cd54 ; 0x2cd54 void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; } void ProtocolLogic::CommandRestart() { scopeState = ScopeState::CommandSent; 351ee: 85 e0 ldi r24, 0x05 ; 5 351f0: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d SendMsg(rq); 351f4: 40 91 4f 13 lds r20, 0x134F ; 0x80134f 351f8: 50 91 50 13 lds r21, 0x1350 ; 0x801350 351fc: 60 91 51 13 lds r22, 0x1351 ; 0x801351 35200: 70 91 52 13 lds r23, 0x1352 ; 0x801352 35204: 80 91 53 13 lds r24, 0x1353 ; 0x801353 35208: 0f 94 93 67 call 0x2cf26 ; 0x2cf26 3520c: 16 e0 ldi r17, 0x06 ; 6 3520e: 07 c1 rjmp .+526 ; 0x3541e 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') { 35210: 1b 36 cpi r17, 0x6B ; 107 35212: 09 f0 breq .+2 ; 0x35216 35214: f7 c2 rjmp .+1518 ; 0x35804 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")); 35216: 82 e1 ldi r24, 0x12 ; 18 35218: 98 ea ldi r25, 0xA8 ; 168 3521a: 0f 94 aa 66 call 0x2cd54 ; 0x2cd54 3521e: 18 e0 ldi r17, 0x08 ; 8 35220: fe c0 rjmp .+508 ; 0x3541e default: RecordUARTActivity(); // something has happened on the UART, update the timeout record return ProtocolError; } } if (bytesConsumed != 0) { 35222: cd 28 or r12, r13 35224: 19 f0 breq .+6 ; 0x3522c RecordUARTActivity(); // something has happened on the UART, update the timeout record 35226: 0f 94 8d 66 call 0x2cd1a ; 0x2cd1a 3522a: 7f ce rjmp .-770 ; 0x34f2a IdleRestart(); SendQuery(); // force sending Q0 immediately } bool ProtocolLogic::Elapsed(uint32_t timeout) const { return _millis() >= (lastUARTActivityMs + timeout); 3522c: 0f 94 28 2a call 0x25450 ; 0x25450 35230: ab 01 movw r20, r22 35232: bc 01 movw r22, r24 35234: 80 91 59 13 lds r24, 0x1359 ; 0x801359 35238: 90 91 5a 13 lds r25, 0x135A ; 0x80135a 3523c: a0 91 5b 13 lds r26, 0x135B ; 0x80135b 35240: b0 91 5c 13 lds r27, 0x135C ; 0x80135c 35244: 80 53 subi r24, 0x30 ; 48 35246: 98 4f sbci r25, 0xF8 ; 248 35248: af 4f sbci r26, 0xFF ; 255 3524a: 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) { 3524c: 48 17 cp r20, r24 3524e: 59 07 cpc r21, r25 35250: 6a 07 cpc r22, r26 35252: 7b 07 cpc r23, r27 35254: 08 f4 brcc .+2 ; 0x35258 35256: 69 ce rjmp .-814 ; 0x34f2a 35258: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 3525c: 88 23 and r24, r24 3525e: 09 f4 brne .+2 ; 0x35262 35260: 64 ce rjmp .-824 ; 0x34f2a rqState = RequestStates::Code; } /// resets the internal response decoding state (typically after an error) void ResetResponseDecoder() { rspState = ResponseStates::RequestCode; 35262: 10 92 6e 13 sts 0x136E, r1 ; 0x80136e initRegs8[0] = extraLoadDistance; initRegs8[1] = pulleySlowFeedrate; } void ProtocolLogic::Start() { state = State::InitSequence; 35266: 81 e0 ldi r24, 0x01 ; 1 35268: 80 93 67 13 sts 0x1367, r24 ; 0x801367 currentScope = Scope::StartSeq; 3526c: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c LogRequestMsg(txbuff, len); RecordUARTActivity(); } void ProtocolLogic::StartSeqRestart() { retries = maxRetries; 35270: 86 e0 ldi r24, 0x06 ; 6 35272: 80 93 4e 13 sts 0x134E, r24 ; 0x80134e SendVersion(0); 35276: 80 e0 ldi r24, 0x00 ; 0 35278: 0f 94 70 a5 call 0x34ae0 ; 0x34ae0 StepStatus ProtocolLogic::HandleCommunicationTimeout() { uart->flush(); // clear the output buffer protocol.ResetResponseDecoder(); Start(); return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); 3527c: 64 e0 ldi r22, 0x04 ; 4 3527e: 8a ee ldi r24, 0xEA ; 234 35280: 97 ea ldi r25, 0xA7 ; 167 35282: 79 c0 rjmp .+242 ; 0x35376 return Finished; } StepStatus ProtocolLogic::StartSeqStep() { // solve initial handshake switch (scopeState) { 35284: 10 91 4d 13 lds r17, 0x134D ; 0x80134d 35288: 13 30 cpi r17, 0x03 ; 3 3528a: b1 f1 breq .+108 ; 0x352f8 3528c: 60 f0 brcs .+24 ; 0x352a6 3528e: 16 30 cpi r17, 0x06 ; 6 35290: 09 f4 brne .+2 ; 0x35294 35292: 50 c0 rjmp .+160 ; 0x35334 35294: 19 30 cpi r17, 0x09 ; 9 35296: 09 f0 breq .+2 ; 0x3529a 35298: be cf rjmp .-132 ; 0x35216 // Start General Interrogation after line up - initial parametrization is started StartWritingInitRegisters(); } return Processing; case ScopeState::WritingInitRegisters: if (ProcessWritingInitRegister()) { 3529a: 0f 94 bd 68 call 0x2d17a ; 0x2d17a 3529e: 88 23 and r24, r24 352a0: 09 f4 brne .+2 ; 0x352a4 352a2: 43 ce rjmp .-890 ; 0x34f2a 352a4: 40 ce rjmp .-896 ; 0x34f26 void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; } StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) { if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) { 352a6: 80 91 5f 13 lds r24, 0x135F ; 0x80135f 352aa: 83 35 cpi r24, 0x53 ; 83 352ac: 21 f4 brne .+8 ; 0x352b6 352ae: 80 91 60 13 lds r24, 0x1360 ; 0x801360 352b2: 18 17 cp r17, r24 352b4: 11 f0 breq .+4 ; 0x352ba mmuFwVersion[stage] = rsp.paramValue; if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) { if (--retries == 0) { return VersionMismatch; } else { SendVersion(stage); 352b6: 81 2f mov r24, r17 352b8: fe cd rjmp .-1028 ; 0x34eb6 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; 352ba: 80 91 65 13 lds r24, 0x1365 ; 0x801365 352be: e1 2f mov r30, r17 352c0: f0 e0 ldi r31, 0x00 ; 0 352c2: df 01 movw r26, r30 352c4: a7 56 subi r26, 0x67 ; 103 352c6: bc 4e sbci r27, 0xEC ; 236 352c8: 8c 93 st X, r24 if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) { 352ca: e1 5f subi r30, 0xF1 ; 241 352cc: f7 45 sbci r31, 0x57 ; 87 352ce: e4 91 lpm r30, Z 352d0: 8e 17 cp r24, r30 352d2: 41 f0 breq .+16 ; 0x352e4 if (--retries == 0) { 352d4: 80 91 4e 13 lds r24, 0x134E ; 0x80134e 352d8: 81 50 subi r24, 0x01 ; 1 352da: 80 93 4e 13 sts 0x134E, r24 ; 0x80134e 352de: 81 11 cpse r24, r1 352e0: ea cf rjmp .-44 ; 0x352b6 352e2: 99 cf rjmp .-206 ; 0x35216 SERIAL_ECHOLNPGM("ResetRetryAttempts"); retryAttempts = MAX_RETRIES; } void ProtocolLogic::ResetCommunicationTimeoutAttempts() { SERIAL_ECHOLNPGM("RSTCommTimeout"); 352e4: 85 e9 ldi r24, 0x95 ; 149 352e6: 9a ea ldi r25, 0xAA ; 170 352e8: 0e 94 13 79 call 0xf226 ; 0xf226 /// @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; } 352ec: 8a e0 ldi r24, 0x0A ; 10 352ee: 80 93 5e 13 sts 0x135E, r24 ; 0x80135e } else { SendVersion(stage); } } else { ResetCommunicationTimeoutAttempts(); // got a meaningful response from the MMU, stop data layer timeout tracking SendVersion(stage + 1); 352f2: 81 e0 ldi r24, 0x01 ; 1 352f4: 81 0f add r24, r17 352f6: df cd rjmp .-1090 ; 0x34eb6 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) { 352f8: 80 91 5f 13 lds r24, 0x135F ; 0x80135f 352fc: 83 35 cpi r24, 0x53 ; 83 352fe: 21 f4 brne .+8 ; 0x35308 35300: 80 91 60 13 lds r24, 0x1360 ; 0x801360 35304: 83 30 cpi r24, 0x03 ; 3 35306: 11 f0 breq .+4 ; 0x3530c // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0? SendVersion(3); 35308: 83 e0 ldi r24, 0x03 ; 3 3530a: d5 cd rjmp .-1110 ; 0x34eb6 } else { mmuFwVersionBuild = rsp.paramValue; // just register the build number 3530c: 80 91 65 13 lds r24, 0x1365 ; 0x801365 35310: 90 91 66 13 lds r25, 0x1366 ; 0x801366 35314: 90 93 9d 13 sts 0x139D, r25 ; 0x80139d 35318: 80 93 9c 13 sts 0x139C, r24 ; 0x80139c } return ScopeState::Reading16bitRegisters; } void ProtocolLogic::StartWritingInitRegisters() { regIndex = 0; 3531c: 10 92 98 13 sts 0x1398, r1 ; 0x801398 SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters); 35320: e3 e9 ldi r30, 0x93 ; 147 35322: fa ea ldi r31, 0xAA ; 170 35324: 84 91 lpm r24, Z 35326: 60 91 96 13 lds r22, 0x1396 ; 0x801396 3532a: 70 e0 ldi r23, 0x00 ; 0 3532c: 49 e0 ldi r20, 0x09 ; 9 3532e: 0f 94 fe 67 call 0x2cffc ; 0x2cffc 35332: fb cd rjmp .-1034 ; 0x34f2a currentScope = Scope::Idle; IdleRestart(); } void ProtocolLogic::SwitchFromStartToIdle() { state = State::Running; 35334: 82 e0 ldi r24, 0x02 ; 2 35336: 80 93 67 13 sts 0x1367, r24 ; 0x801367 currentScope = Scope::Idle; 3533a: 83 e0 ldi r24, 0x03 ; 3 3533c: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 35340: 82 e8 ldi r24, 0x82 ; 130 35342: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d 35346: d2 cd rjmp .-1116 ; 0x34eec } return Finished; } StepStatus ProtocolLogic::IdleStep() { switch (scopeState) { 35348: 80 91 4d 13 lds r24, 0x134D ; 0x80134d 3534c: 88 30 cpi r24, 0x08 ; 8 3534e: 09 f4 brne .+2 ; 0x35352 35350: b7 c0 rjmp .+366 ; 0x354c0 35352: a8 f4 brcc .+42 ; 0x3537e 35354: 84 30 cpi r24, 0x04 ; 4 35356: d9 f0 breq .+54 ; 0x3538e 35358: 87 30 cpi r24, 0x07 ; 7 3535a: 09 f4 brne .+2 ; 0x3535e 3535c: ae c0 rjmp .+348 ; 0x354ba return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); } StepStatus ProtocolLogic::HandleProtocolError() { uart->flush(); // clear the output buffer state = State::InitSequence; 3535e: 81 e0 ldi r24, 0x01 ; 1 35360: 80 93 67 13 sts 0x1367, r24 ; 0x801367 currentScope = Scope::DelayedRestart; 35364: 82 e0 ldi r24, 0x02 ; 2 35366: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c retries = maxRetries; SendVersion(0); } void ProtocolLogic::DelayedRestartRestart() { scopeState = ScopeState::RecoveringProtocolError; 3536a: 83 e8 ldi r24, 0x83 ; 131 3536c: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d StepStatus ProtocolLogic::HandleProtocolError() { uart->flush(); // clear the output buffer state = State::InitSequence; currentScope = Scope::DelayedRestart; DelayedRestartRestart(); return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError); 35370: 65 e0 ldi r22, 0x05 ; 5 35372: 80 e0 ldi r24, 0x00 ; 0 35374: 98 ea ldi r25, 0xA8 ; 168 StepStatus ProtocolLogic::HandleCommunicationTimeout() { uart->flush(); // clear the output buffer protocol.ResetResponseDecoder(); Start(); return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); 35376: 0f 94 1b 67 call 0x2ce36 ; 0x2ce36 3537a: 18 2f mov r17, r24 3537c: 50 c0 rjmp .+160 ; 0x3541e } return Finished; } StepStatus ProtocolLogic::IdleStep() { switch (scopeState) { 3537e: 8a 30 cpi r24, 0x0A ; 10 35380: 09 f4 brne .+2 ; 0x35384 35382: a7 c0 rjmp .+334 ; 0x354d2 35384: 60 f3 brcs .-40 ; 0x3535e 35386: 8d 30 cpi r24, 0x0D ; 13 35388: 08 f4 brcc .+2 ; 0x3538c 3538a: 5f cd rjmp .-1346 ; 0x34e4a 3538c: e8 cf rjmp .-48 ; 0x3535e 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) { 3538e: 80 91 5f 13 lds r24, 0x135F ; 0x80135f 35392: 8e 34 cpi r24, 0x4E ; 78 35394: 60 f5 brcc .+88 ; 0x353ee 35396: 8b 34 cpi r24, 0x4B ; 75 35398: 10 f4 brcc .+4 ; 0x3539e 3539a: 85 34 cpi r24, 0x45 ; 69 3539c: 01 f7 brne .-64 ; 0x3535e case RequestMsgCodes::Eject: case RequestMsgCodes::Load: case RequestMsgCodes::Mode: case RequestMsgCodes::Tool: case RequestMsgCodes::Unload: if (rsp.paramCode != ResponseMsgParamCodes::Finished) { 3539e: 80 91 64 13 lds r24, 0x1364 ; 0x801364 353a2: 86 34 cpi r24, 0x46 ; 70 353a4: 09 f4 brne .+2 ; 0x353a8 353a6: 73 c0 rjmp .+230 ; 0x3548e return true; } } StepStatus ProtocolLogic::SwitchFromIdleToCommand() { currentScope = Scope::Command; 353a8: 84 e0 ldi r24, 0x04 ; 4 353aa: 80 93 4c 13 sts 0x134C, r24 ; 0x80134c 353ae: 85 e0 ldi r24, 0x05 ; 5 353b0: ef e5 ldi r30, 0x5F ; 95 353b2: f3 e1 ldi r31, 0x13 ; 19 353b4: de 01 movw r26, r28 353b6: 11 96 adiw r26, 0x01 ; 1 353b8: 01 90 ld r0, Z+ 353ba: 0d 92 st X+, r0 353bc: 8a 95 dec r24 353be: e1 f7 brne .-8 ; 0x353b8 StepStatus StoppedStep() { return Processing; } StepStatus ProcessCommandQueryResponse(); inline void SetRequestMsg(RequestMsg msg) { rq = msg; 353c0: 85 e0 ldi r24, 0x05 ; 5 353c2: fe 01 movw r30, r28 353c4: 31 96 adiw r30, 0x01 ; 1 353c6: af e4 ldi r26, 0x4F ; 79 353c8: b3 e1 ldi r27, 0x13 ; 19 353ca: 01 90 ld r0, Z+ 353cc: 0d 92 st X+, r0 353ce: 8a 95 dec r24 353d0: e1 f7 brne .-8 ; 0x353ca default: return ProtocolError; } } break; case ScopeState::QuerySent: return ProcessCommandQueryResponse(); 353d2: 0f 94 d3 a5 call 0x34ba6 ; 0x34ba6 353d6: 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) { 353d8: 85 30 cpi r24, 0x05 ; 5 353da: 09 f2 breq .-126 ; 0x3535e 353dc: 08 f0 brcs .+2 ; 0x353e0 353de: 9c c0 rjmp .+312 ; 0x35518 353e0: 82 30 cpi r24, 0x02 ; 2 353e2: 09 f4 brne .+2 ; 0x353e6 353e4: 32 cd rjmp .-1436 ; 0x34e4a 353e6: 84 30 cpi r24, 0x04 ; 4 353e8: 09 f4 brne .+2 ; 0x353ec 353ea: 3b cf rjmp .-394 ; 0x35262 353ec: 18 c0 rjmp .+48 ; 0x3541e 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) { 353ee: 84 35 cpi r24, 0x54 ; 84 353f0: 08 f4 brcc .+2 ; 0x353f4 353f2: b5 cf rjmp .-150 ; 0x3535e 353f4: 86 35 cpi r24, 0x56 ; 86 353f6: 98 f2 brcs .-90 ; 0x3539e 353f8: 88 35 cpi r24, 0x58 ; 88 353fa: 09 f0 breq .+2 ; 0x353fe 353fc: b0 cf rjmp .-160 ; 0x3535e 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) { 353fe: 80 91 64 13 lds r24, 0x1364 ; 0x801364 35402: 86 34 cpi r24, 0x46 ; 70 35404: 89 f1 breq .+98 ; 0x35468 35406: 80 35 cpi r24, 0x50 ; 80 35408: c1 f1 breq .+112 ; 0x3547a 3540a: 82 34 cpi r24, 0x42 ; 66 3540c: 09 f0 breq .+2 ; 0x35410 3540e: 42 c0 rjmp .+132 ; 0x35494 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); 35410: 80 91 65 13 lds r24, 0x1365 ; 0x801365 35414: 80 93 8d 13 sts 0x138D, r24 ; 0x80138d StartReading8bitRegisters(); 35418: 0f 94 81 a4 call 0x34902 ; 0x34902 return ButtonPushed; 3541c: 1b e0 ldi r17, 0x0B ; 11 3541e: 80 91 4a 13 lds r24, 0x134A ; 0x80134a 35422: 90 91 4b 13 lds r25, 0x134B ; 0x80134b break; default: break; } // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; 35426: 81 30 cpi r24, 0x01 ; 1 35428: 91 05 cpc r25, r1 3542a: 09 f0 breq .+2 ; 0x3542e 3542c: ee c1 rjmp .+988 ; 0x3580a const StepStatus ss = logic.Step(); switch (ss) { 3542e: 12 30 cpi r17, 0x02 ; 2 35430: 09 f4 brne .+2 ; 0x35434 35432: 90 c0 rjmp .+288 ; 0x35554 35434: 08 f0 brcs .+2 ; 0x35438 35436: 7d c0 rjmp .+250 ; 0x35532 35438: 11 23 and r17, r17 3543a: 09 f4 brne .+2 ; 0x3543e 3543c: 18 c1 rjmp .+560 ; 0x3566e case Interrupted: // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { 3543e: 00 23 and r16, r16 35440: 09 f4 brne .+2 ; 0x35444 35442: e4 c0 rjmp .+456 ; 0x3560c switch (ss) { 35444: 17 30 cpi r17, 0x07 ; 7 35446: 09 f4 brne .+2 ; 0x3544a 35448: c4 c1 rjmp .+904 ; 0x357d2 3544a: 08 f0 brcs .+2 ; 0x3544e 3544c: b8 c1 rjmp .+880 ; 0x357be 3544e: 14 30 cpi r17, 0x04 ; 4 35450: 09 f4 brne .+2 ; 0x35454 35452: c7 c1 rjmp .+910 ; 0x357e2 35454: 15 30 cpi r17, 0x05 ; 5 35456: 09 f0 breq .+2 ; 0x3545a 35458: d9 c0 rjmp .+434 ; 0x3560c state = xState::Connecting; ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter); break; case ProtocolError: state = xState::Connecting; 3545a: 82 e0 ldi r24, 0x02 ; 2 3545c: 80 93 b9 13 sts 0x13B9, r24 ; 0x8013b9 ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); 35460: 60 e0 ldi r22, 0x00 ; 0 35462: 8d e2 ldi r24, 0x2D ; 45 35464: 90 e8 ldi r25, 0x80 ; 128 35466: ba c1 rjmp .+884 ; 0x357dc // 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) { 35468: 80 91 4f 13 lds r24, 0x134F ; 0x80134f 3546c: 88 23 and r24, r24 3546e: 29 f0 breq .+10 ; 0x3547a scopeState = ScopeState::CommandSent; SendMsg(rq); } void ProtocolLogic::IdleRestart() { scopeState = ScopeState::Ready; 35470: 82 e8 ldi r24, 0x82 ; 130 35472: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d 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; 35476: 13 e0 ldi r17, 0x03 ; 3 35478: d2 cf rjmp .-92 ; 0x3541e } [[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); 3547a: 80 91 65 13 lds r24, 0x1365 ; 0x801365 3547e: 80 93 8c 13 sts 0x138C, r24 ; 0x80138c errorCode = ErrorCode::OK; 35482: 81 e0 ldi r24, 0x01 ; 1 35484: 90 e0 ldi r25, 0x00 ; 0 35486: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 3548a: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a } } break; case ScopeState::QuerySent: return ProcessCommandQueryResponse(); case ScopeState::FilamentSensorStateSent: StartReading8bitRegisters(); 3548e: 0f 94 81 a4 call 0x34902 ; 0x34902 35492: 4b cd rjmp .-1386 ; 0x34f2a // 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; 35494: 8c e0 ldi r24, 0x0C ; 12 35496: 80 93 8c 13 sts 0x138C, r24 ; 0x80138c errorCode = static_cast(rsp.paramValue); 3549a: 80 91 65 13 lds r24, 0x1365 ; 0x801365 3549e: 90 91 66 13 lds r25, 0x1366 ; 0x801366 354a2: 90 93 8b 13 sts 0x138B, r25 ; 0x80138b 354a6: 80 93 8a 13 sts 0x138A, r24 ; 0x80138a StartReading8bitRegisters(); // continue Idle state without restarting the communication 354aa: 0f 94 81 a4 call 0x34902 ; 0x34902 // @@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")); 354ae: 83 e2 ldi r24, 0x23 ; 35 354b0: 98 ea ldi r25, 0xA8 ; 168 354b2: 0f 94 aa 66 call 0x2cd54 ; 0x2cd54 354b6: 17 e0 ldi r17, 0x07 ; 7 354b8: b2 cf rjmp .-156 ; 0x3541e return ProtocolError; } StartReading8bitRegisters(); return Processing; case ScopeState::Reading8bitRegisters: ProcessRead8bitRegister(); 354ba: 0f 94 a5 a4 call 0x3494a ; 0x3494a 354be: 35 cd rjmp .-1430 ; 0x34f2a return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Ready); 354c0: 82 e8 ldi r24, 0x82 ; 130 354c2: 0f 94 89 a4 call 0x34912 ; 0x34912 354c6: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d return scopeState == ScopeState::Ready ? Finished : Processing; 354ca: 82 38 cpi r24, 0x82 ; 130 354cc: 09 f0 breq .+2 ; 0x354d0 354ce: 2d cd rjmp .-1446 ; 0x34f2a 354d0: bc cc rjmp .-1672 ; 0x34e4a case ScopeState::ButtonSent: if (rsp.paramCode == ResponseMsgParamCodes::Accepted) { 354d2: 80 91 64 13 lds r24, 0x1364 ; 0x801364 354d6: 81 34 cpi r24, 0x41 ; 65 354d8: d1 f6 brne .-76 ; 0x3548e // Button was accepted, decrement the retry. DecrementRetryAttempts(); 354da: 0f 94 98 66 call 0x2cd30 ; 0x2cd30 354de: d7 cf rjmp .-82 ; 0x3548e return ProtocolError; } } StepStatus ProtocolLogic::CommandStep() { switch (scopeState) { 354e0: 88 30 cpi r24, 0x08 ; 8 354e2: b1 f0 breq .+44 ; 0x35510 354e4: 50 f3 brcs .-44 ; 0x354ba 354e6: 8a 30 cpi r24, 0x0A ; 10 354e8: 09 f0 breq .+2 ; 0x354ec 354ea: 39 cf rjmp .-398 ; 0x3535e return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Wait); return Processing; case ScopeState::ButtonSent: if (rsp.paramCode == ResponseMsgParamCodes::Accepted) { 354ec: 80 91 64 13 lds r24, 0x1364 ; 0x801364 354f0: 81 34 cpi r24, 0x41 ; 65 354f2: 09 f0 breq .+2 ; 0x354f6 354f4: 18 cd rjmp .-1488 ; 0x34f26 // Button was accepted, decrement the retry. DecrementRetryAttempts(); 354f6: 0f 94 98 66 call 0x2cd30 ; 0x2cd30 354fa: 15 cd rjmp .-1494 ; 0x34f26 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; 354fc: 10 92 8c 13 sts 0x138C, r1 ; 0x80138c errorCode = ErrorCode::RUNNING; 35500: 10 92 8b 13 sts 0x138B, r1 ; 0x80138b 35504: 10 92 8a 13 sts 0x138A, r1 ; 0x80138a scopeState = ScopeState::Wait; 35508: 81 e8 ldi r24, 0x81 ; 129 return Processing; case ScopeState::Reading8bitRegisters: ProcessRead8bitRegister(); return Processing; case ScopeState::Reading16bitRegisters: scopeState = ProcessRead16bitRegister(ScopeState::Wait); 3550a: 80 93 4d 13 sts 0x134D, r24 ; 0x80134d 3550e: 0d cd rjmp .-1510 ; 0x34f2a 35510: 81 e8 ldi r24, 0x81 ; 129 35512: 0f 94 89 a4 call 0x34912 ; 0x34912 35516: f9 cf rjmp .-14 ; 0x3550a StepStatus ProtocolLogic::Step() { if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately ActivatePlannedRequest(); } auto currentStatus = ScopeStep(); switch (currentStatus) { 35518: 87 30 cpi r24, 0x07 ; 7 3551a: 49 f2 breq .-110 ; 0x354ae 3551c: 08 f4 brcc .+2 ; 0x35520 3551e: 63 ce rjmp .-826 ; 0x351e6 35520: 88 30 cpi r24, 0x08 ; 8 35522: 09 f4 brne .+2 ; 0x35526 35524: 78 ce rjmp .-784 ; 0x35216 35526: 7b cf rjmp .-266 ; 0x3541e // 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()) { 35528: 80 91 4d 13 lds r24, 0x134D ; 0x80134d 3552c: 87 fd sbrc r24, 7 3552e: 9a cc rjmp .-1740 ; 0x34e64 35530: fc cc rjmp .-1544 ; 0x34f2a StepStatus MMU2::LogicStep(bool reportErrors) { // Process any buttons before proceeding with another MMU Query CheckUserInput(); const StepStatus ss = logic.Step(); switch (ss) { 35532: 13 30 cpi r17, 0x03 ; 3 35534: 09 f4 brne .+2 ; 0x35538 35536: 6a c0 rjmp .+212 ; 0x3560c 35538: 1b 30 cpi r17, 0x0B ; 11 3553a: 09 f0 breq .+2 ; 0x3553e 3553c: 80 cf rjmp .-256 ; 0x3543e case Processing: OnMMUProgressMsg(logic.Progress()); break; case ButtonPushed: lastButton = logic.Button(); 3553e: 80 91 8d 13 lds r24, 0x138D ; 0x80138d 35542: 80 93 b4 13 sts 0x13B4, r24 ; 0x8013b4 LogEchoEvent_P(PSTR("MMU Button pushed")); 35546: 82 e4 ldi r24, 0x42 ; 66 35548: 98 ea ldi r25, 0xA8 ; 168 3554a: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 CheckUserInput(); // Process the button immediately 3554e: 0f 94 3d a6 call 0x34c7a ; 0x34c7a 35552: 5c c0 rjmp .+184 ; 0x3560c CheckErrorScreenUserInput(); } void MMU2::CheckFINDARunout() { // Check for FINDA filament runout if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors 35554: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 35558: 81 11 cpse r24, r1 3555a: 58 c0 rjmp .+176 ; 0x3560c 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() 3555c: 0e 94 28 67 call 0xce50 ; 0xce50 && mcode_in_progress != 600 && !saved_printing && !mesh_bed_leveling_flag && !homing_flag && e_active(); 35560: 88 23 and r24, r24 35562: 09 f4 brne .+2 ; 0x35566 35564: 53 c0 rjmp .+166 ; 0x3560c } // Currently only used in one place, allowed to be inlined bool check_fsensor() { return printJobOngoing() && mcode_in_progress != 600 35566: 80 91 a9 0d lds r24, 0x0DA9 ; 0x800da9 <_ZL17mcode_in_progress.lto_priv.532> 3556a: 90 91 aa 0d lds r25, 0x0DAA ; 0x800daa <_ZL17mcode_in_progress.lto_priv.532+0x1> 3556e: 88 35 cpi r24, 0x58 ; 88 35570: 92 40 sbci r25, 0x02 ; 2 35572: 09 f4 brne .+2 ; 0x35576 35574: 4b c0 rjmp .+150 ; 0x3560c && !saved_printing 35576: 80 91 a8 0d lds r24, 0x0DA8 ; 0x800da8 3557a: 81 11 cpse r24, r1 3557c: 47 c0 rjmp .+142 ; 0x3560c && !mesh_bed_leveling_flag 3557e: 80 91 a7 0d lds r24, 0x0DA7 ; 0x800da7 35582: 81 11 cpse r24, r1 35584: 43 c0 rjmp .+134 ; 0x3560c && !homing_flag 35586: 80 91 a6 0d lds r24, 0x0DA6 ; 0x800da6 3558a: 81 11 cpse r24, r1 3558c: 3f c0 rjmp .+126 ; 0x3560c bool e_active() { unsigned char e_active = 0; block_t *block; if(block_buffer_tail != block_buffer_head) 3558e: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 35592: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 35596: 98 17 cp r25, r24 35598: c9 f1 breq .+114 ; 0x3560c { uint8_t block_index = block_buffer_tail; 3559a: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 } #endif bool e_active() { unsigned char e_active = 0; 3559e: 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++; 355a0: 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) 355a2: 30 91 a4 0d lds r19, 0x0DA4 ; 0x800da4 355a6: 38 17 cp r19, r24 355a8: 89 f0 breq .+34 ; 0x355cc { block = &block_buffer[block_index]; if(block->steps[E_AXIS].wide != 0) e_active++; 355aa: 28 9f mul r18, r24 355ac: f0 01 movw r30, r0 355ae: 11 24 eor r1, r1 355b0: ec 53 subi r30, 0x3C ; 60 355b2: f9 4f sbci r31, 0xF9 ; 249 355b4: 44 85 ldd r20, Z+12 ; 0x0c 355b6: 55 85 ldd r21, Z+13 ; 0x0d 355b8: 66 85 ldd r22, Z+14 ; 0x0e 355ba: 77 85 ldd r23, Z+15 ; 0x0f 355bc: 45 2b or r20, r21 355be: 46 2b or r20, r22 355c0: 47 2b or r20, r23 355c2: 09 f0 breq .+2 ; 0x355c6 355c4: 9f 5f subi r25, 0xFF ; 255 block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); 355c6: 8f 5f subi r24, 0xFF ; 255 355c8: 8f 70 andi r24, 0x0F ; 15 355ca: eb cf rjmp .-42 ; 0x355a2 && e_active(); 355cc: 99 23 and r25, r25 355ce: f1 f0 breq .+60 ; 0x3560c SERIAL_ECHOLNPGM("FINDA filament runout!"); 355d0: 83 ed ldi r24, 0xD3 ; 211 355d2: 97 ea ldi r25, 0xA7 ; 167 355d4: 0e 94 13 79 call 0xf226 ; 0xf226 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); 355d8: 20 e0 ldi r18, 0x00 ; 0 355da: 30 e0 ldi r19, 0x00 ; 0 355dc: a9 01 movw r20, r18 355de: ca 01 movw r24, r20 355e0: b9 01 movw r22, r18 355e2: 0e 94 d7 88 call 0x111ae ; 0x111ae marlin_stop_and_save_print_to_ram(); restore_print_from_ram_and_continue(0); 355e6: 60 e0 ldi r22, 0x00 ; 0 355e8: 70 e0 ldi r23, 0x00 ; 0 355ea: cb 01 movw r24, r22 355ec: 0e 94 dc 67 call 0xcfb8 ; 0xcfb8 } } bool SpoolJoin::isSpoolJoinEnabled() { if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) { 355f0: 86 ed ldi r24, 0xD6 ; 214 355f2: 9e e0 ldi r25, 0x0E ; 14 355f4: 0f 94 10 dc call 0x3b820 ; 0x3b820 355f8: 81 30 cpi r24, 0x01 ; 1 355fa: 21 f4 brne .+8 ; 0x35604 if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=? 355fc: 0f 94 b0 75 call 0x2eb60 ; 0x2eb60 35600: 8f 3f cpi r24, 0xFF ; 255 35602: 91 f5 brne .+100 ; 0x35668 enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command } else { enquecommand_front_P(MSG_M600); // save print and run M600 command 35604: 88 e8 ldi r24, 0x88 ; 136 35606: 90 e7 ldi r25, 0x70 ; 112 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 35608: 0f 94 f4 75 call 0x2ebe8 ; 0x2ebe8 break; } } } if (logic.Running()) { 3560c: 80 91 67 13 lds r24, 0x1367 ; 0x801367 35610: 82 30 cpi r24, 0x02 ; 2 35612: 19 f4 brne .+6 ; 0x3561a state = xState::Active; 35614: 81 e0 ldi r24, 0x01 ; 1 35616: 80 93 b9 13 sts 0x13B9, r24 ; 0x8013b9 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 3561a: 10 93 b8 13 sts 0x13B8, r17 ; 0x8013b8 // 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) { 3561e: 80 91 c2 06 lds r24, 0x06C2 ; 0x8006c2 <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.492> 35622: 88 23 and r24, r24 35624: 51 f0 breq .+20 ; 0x3563a bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { if (putErrorScreenToSleep) return; 35626: 80 91 ac 0d lds r24, 0x0DAC ; 0x800dac <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.498> 3562a: 81 11 cpse r24, r1 3562c: 06 c0 rjmp .+12 ; 0x3563a 3562e: 80 91 b1 13 lds r24, 0x13B1 ; 0x8013b1 35632: 90 91 b2 13 lds r25, 0x13B2 ; 0x8013b2 35636: 0f 94 31 c7 call 0x38e62 ; 0x38e62 CheckErrorScreenUserInput(); } 3563a: a0 96 adiw r28, 0x20 ; 32 3563c: 0f b6 in r0, 0x3f ; 63 3563e: f8 94 cli 35640: de bf out 0x3e, r29 ; 62 35642: 0f be out 0x3f, r0 ; 63 35644: cd bf out 0x3d, r28 ; 61 35646: df 91 pop r29 35648: cf 91 pop r28 3564a: 1f 91 pop r17 3564c: 0f 91 pop r16 3564e: ff 90 pop r15 35650: ef 90 pop r14 35652: df 90 pop r13 35654: cf 90 pop r12 35656: bf 90 pop r11 35658: af 90 pop r10 3565a: 9f 90 pop r9 3565c: 8f 90 pop r8 3565e: 7f 90 pop r7 35660: 6f 90 pop r6 35662: 5f 90 pop r5 35664: 4f 90 pop r4 35666: 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 35668: 89 ec ldi r24, 0xC9 ; 201 3566a: 97 ea ldi r25, 0xA7 ; 167 3566c: cd cf rjmp .-102 ; 0x35608 3566e: 00 91 8c 13 lds r16, 0x138C ; 0x80138c ReportProgressHook((CommandInProgress)logic.CommandInProgress(), pc); LogEchoEvent_P(_O(ProgressCodeToText(pc))); } void MMU2::OnMMUProgressMsg(ProgressCode pc) { if (pc != lastProgressCode) { 35672: 80 91 b0 13 lds r24, 0x13B0 ; 0x8013b0 35676: 08 17 cp r16, r24 35678: 09 f4 brne .+2 ; 0x3567c 3567a: 49 c0 rjmp .+146 ; 0x3570e // special handling of explicit printer errors return IsPrinterError() ? StepStatus::PrinterError : currentStatus; } uint8_t ProtocolLogic::CommandInProgress() const { if (currentScope != Scope::Command) { 3567c: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 35680: 84 30 cpi r24, 0x04 ; 4 35682: b9 f4 brne .+46 ; 0x356b2 break; } } void ReportProgressHook(CommandInProgress cip, ProgressCode ec) { if (cip != CommandInProgress::NoCommand) { 35684: 80 91 4f 13 lds r24, 0x134F ; 0x80134f 35688: 88 23 and r24, r24 3568a: 99 f0 breq .+38 ; 0x356b2 custom_message_type = CustomMsg::MMUProgress; 3568c: 89 e0 ldi r24, 0x09 ; 9 3568e: 80 93 c3 06 sts 0x06C3, r24 ; 0x8006c3 : static_cast(pgm_read_ptr(&progressTexts[0])); 35692: ef e8 ldi r30, 0x8F ; 143 35694: f7 ea ldi r31, 0xA7 ; 167 }; 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])) 35696: 0e 31 cpi r16, 0x1E ; 30 35698: 30 f4 brcc .+12 ; 0x356a6 3569a: e0 2f mov r30, r16 3569c: f0 e0 ldi r31, 0x00 ; 0 3569e: ee 0f add r30, r30 356a0: ff 1f adc r31, r31 356a2: e1 57 subi r30, 0x71 ; 113 356a4: f8 45 sbci r31, 0x58 ; 88 : static_cast(pgm_read_ptr(&progressTexts[0])); 356a6: 85 91 lpm r24, Z+ 356a8: 94 91 lpm r25, Z lcd_setstatuspgm( _T(ProgressCodeToText(ec)) ); 356aa: 0e 94 44 72 call 0xe488 ; 0xe488 356ae: 0e 94 16 f2 call 0x1e42c ; 0x1e42c 356b2: ef e8 ldi r30, 0x8F ; 143 356b4: f7 ea ldi r31, 0xA7 ; 167 }; 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])) 356b6: 0e 31 cpi r16, 0x1E ; 30 356b8: 30 f4 brcc .+12 ; 0x356c6 356ba: e0 2f mov r30, r16 356bc: f0 e0 ldi r31, 0x00 ; 0 356be: ee 0f add r30, r30 356c0: ff 1f adc r31, r31 356c2: e1 57 subi r30, 0x71 ; 113 356c4: f8 45 sbci r31, 0x58 ; 88 : static_cast(pgm_read_ptr(&progressTexts[0])); 356c6: 85 91 lpm r24, Z+ 356c8: 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))); 356ca: 02 96 adiw r24, 0x02 ; 2 356cc: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 } } void MMU2::OnMMUProgressMsgChanged(ProgressCode pc) { ReportProgress(pc); lastProgressCode = pc; 356d0: 00 93 b0 13 sts 0x13B0, r16 ; 0x8013b0 switch (pc) { 356d4: 03 30 cpi r16, 0x03 ; 3 356d6: 49 f0 breq .+18 ; 0x356ea 356d8: 0c 31 cpi r16, 0x1C ; 28 356da: 09 f0 breq .+2 ; 0x356de 356dc: 97 cf rjmp .-210 ; 0x3560c bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 356de: 0f 94 a9 43 call 0x28752 ; 0x28752 } break; case ProgressCode::FeedingToFSensor: // prepare for the movement of the E-motor planner_synchronize(); loadFilamentStarted = true; 356e2: 81 e0 ldi r24, 0x01 ; 1 356e4: 80 93 bb 13 sts 0x13BB, r24 ; 0x8013bb 356e8: 91 cf rjmp .-222 ; 0x3560c 356ea: 80 91 4c 13 lds r24, 0x134C ; 0x80134c 356ee: 84 30 cpi r24, 0x04 ; 4 356f0: 31 f4 brne .+12 ; 0x356fe ReportProgress(pc); lastProgressCode = pc; switch (pc) { case ProgressCode::UnloadingToFinda: if ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::UnloadFilament || ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::ToolChange)) { 356f2: 80 91 4f 13 lds r24, 0x134F ; 0x80134f 356f6: 84 55 subi r24, 0x54 ; 84 356f8: 82 30 cpi r24, 0x02 ; 2 356fa: 08 f4 brcc .+2 ; 0x356fe 356fc: 87 cf rjmp .-242 ; 0x3560c 356fe: 0f 94 a9 43 call 0x28752 ; 0x28752 // 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; 35702: 81 e0 ldi r24, 0x01 ; 1 35704: 80 93 bc 13 sts 0x13BC, r24 ; 0x8013bc 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(); 35708: 0f 94 03 6b call 0x2d606 ; 0x2d606 3570c: 7f cf rjmp .-258 ; 0x3560c 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) { 3570e: 03 30 cpi r16, 0x03 ; 3 35710: 71 f1 breq .+92 ; 0x3576e 35712: 0c 31 cpi r16, 0x1C ; 28 35714: 09 f0 breq .+2 ; 0x35718 35716: 7a cf rjmp .-268 ; 0x3560c unloadFilamentStarted = false; } } break; case ProgressCode::FeedingToFSensor: if (loadFilamentStarted) { 35718: 80 91 bb 13 lds r24, 0x13BB ; 0x8013bb 3571c: 88 23 and r24, r24 3571e: 09 f4 brne .+2 ; 0x35722 35720: 75 cf rjmp .-278 ; 0x3560c switch (WhereIsFilament()) { 35722: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 35726: 88 23 and r24, r24 35728: b1 f1 breq .+108 ; 0x35796 3572a: 81 30 cpi r24, 0x01 ; 1 3572c: 09 f0 breq .+2 ; 0x35730 3572e: 6e cf rjmp .-292 ; 0x3560c case FilamentState::AT_FSENSOR: // fsensor triggered, finish FeedingToExtruder state loadFilamentStarted = false; 35730: 10 92 bb 13 sts 0x13BB, r1 ; 0x8013bb float move_raise_z(float delta) { return raise_z(delta); } void planner_abort_queued_moves() { planner_abort_hard(); 35734: 0f 94 b7 c1 call 0x3836e ; 0x3836e // 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; 35738: 10 92 ab 0d sts 0x0DAB, r1 ; 0x800dab planner_abort_queued_moves(); { extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate()); 3573c: 60 91 97 13 lds r22, 0x1397 ; 0x801397 35740: 70 e0 ldi r23, 0x00 ; 0 35742: 90 e0 ldi r25, 0x00 ; 0 35744: 80 e0 ldi r24, 0x00 ; 0 35746: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 3574a: 6b 01 movw r12, r22 3574c: 7c 01 movw r14, r24 3574e: 60 91 96 13 lds r22, 0x1396 ; 0x801396 35752: 70 e0 ldi r23, 0x00 ; 0 35754: 6e 5f subi r22, 0xFE ; 254 35756: 7f 4f sbci r23, 0xFF ; 255 35758: 07 2e mov r0, r23 3575a: 00 0c add r0, r0 3575c: 88 0b sbc r24, r24 3575e: 99 0b sbc r25, r25 35760: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 35764: a7 01 movw r20, r14 35766: 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()); 35768: 0f 94 a5 c5 call 0x38b4a ; 0x38b4a 3576c: 4f cf rjmp .-354 ; 0x3560c } 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 3576e: 80 91 bc 13 lds r24, 0x13BC ; 0x8013bc 35772: 88 23 and r24, r24 35774: 09 f4 brne .+2 ; 0x35778 35776: 4a cf rjmp .-364 ; 0x3560c 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); 35778: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 3577c: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 35780: 98 13 cpse r25, r24 35782: 44 cf rjmp .-376 ; 0x3560c switch (WhereIsFilament()) { 35784: 0f 94 d9 c5 call 0x38bb2 ; 0x38bb2 35788: 81 50 subi r24, 0x01 ; 1 3578a: 83 30 cpi r24, 0x03 ; 3 3578c: 08 f4 brcc .+2 ; 0x35790 3578e: bc cf rjmp .-136 ; 0x35708 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; 35790: 10 92 bc 13 sts 0x13BC, r1 ; 0x8013bc 35794: 3b cf rjmp .-394 ; 0x3560c 35796: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 3579a: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 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 3579e: 98 13 cpse r25, r24 357a0: 35 cf rjmp .-406 ; 0x3560c // 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()); 357a2: 60 91 97 13 lds r22, 0x1397 ; 0x801397 357a6: 70 e0 ldi r23, 0x00 ; 0 357a8: 90 e0 ldi r25, 0x00 ; 0 357aa: 80 e0 ldi r24, 0x00 ; 0 357ac: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 357b0: 9b 01 movw r18, r22 357b2: ac 01 movw r20, r24 357b4: 60 e0 ldi r22, 0x00 ; 0 357b6: 70 e0 ldi r23, 0x00 ; 0 357b8: 8f ea ldi r24, 0xAF ; 175 357ba: 93 e4 ldi r25, 0x43 ; 67 357bc: d5 cf rjmp .-86 ; 0x35768 // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { switch (ss) { 357be: 18 30 cpi r17, 0x08 ; 8 357c0: b9 f0 breq .+46 ; 0x357f0 357c2: 19 30 cpi r17, 0x09 ; 9 357c4: 09 f0 breq .+2 ; 0x357c8 357c6: 22 cf rjmp .-444 ; 0x3560c StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); break; case PrinterError: ReportError(logic.PrinterError(), ErrorSourcePrinter); 357c8: 60 e0 ldi r22, 0x00 ; 0 357ca: 0f 94 e5 83 call 0x307ca ; 0x307ca 357ce: 19 e0 ldi r17, 0x09 ; 9 357d0: 1d cf rjmp .-454 ; 0x3560c default: if (reportErrors) { switch (ss) { case CommandError: ReportError(logic.Error(), ErrorSourceMMU); 357d2: 61 e0 ldi r22, 0x01 ; 1 357d4: 80 91 8a 13 lds r24, 0x138A ; 0x80138a 357d8: 90 91 8b 13 lds r25, 0x138B ; 0x80138b ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); break; case VersionMismatch: StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); 357dc: 0f 94 e5 83 call 0x307ca ; 0x307ca 357e0: 15 cf rjmp .-470 ; 0x3560c case CommandError: ReportError(logic.Error(), ErrorSourceMMU); break; case CommunicationTimeout: state = xState::Connecting; 357e2: 82 e0 ldi r24, 0x02 ; 2 357e4: 80 93 b9 13 sts 0x13B9, r24 ; 0x8013b9 ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter); 357e8: 60 e0 ldi r22, 0x00 ; 0 357ea: 8e e2 ldi r24, 0x2E ; 46 357ec: 90 e8 ldi r25, 0x80 ; 128 357ee: f6 cf rjmp .-20 ; 0x357dc StopKeepPowered(); PowerOff(); } void MMU2::StopKeepPowered() { state = xState::Stopped; 357f0: 10 92 b9 13 sts 0x13B9, r1 ; 0x8013b9 protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this StartSeqRestart(); } void ProtocolLogic::Stop() { state = State::Stopped; 357f4: 10 92 67 13 sts 0x1367, r1 ; 0x801367 currentScope = Scope::Stopped; 357f8: 10 92 4c 13 sts 0x134C, r1 ; 0x80134c ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter); break; case VersionMismatch: StopKeepPowered(); ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter); 357fc: 60 e0 ldi r22, 0x00 ; 0 357fe: 8c e2 ldi r24, 0x2C ; 44 35800: 90 e8 ldi r25, 0x80 ; 128 35802: ec cf rjmp .-40 ; 0x357dc break; } } [[fallthrough]]; // otherwise default: RecordUARTActivity(); // something has happened on the UART, update the timeout record 35804: 0f 94 8d 66 call 0x2cd1a ; 0x2cd1a 35808: aa cd rjmp .-1196 ; 0x3535e case Interrupted: // can be silently handed over to a higher layer, no processing necessary at this spot break; default: if (reportErrors) { 3580a: 00 23 and r16, r16 3580c: 01 f3 breq .-64 ; 0x357ce 3580e: dc cf rjmp .-72 ; 0x357c8 00035810 : } } } void MMU2::ResumeHotendTemp() { if ((mmu_print_saved & SavedState::CooldownPending)) { 35810: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 35814: 82 ff sbrs r24, 2 35816: 07 c0 rjmp .+14 ; 0x35826 // Clear the "pending" flag if we haven't cooled yet. mmu_print_saved &= ~(SavedState::CooldownPending); 35818: 8b 7f andi r24, 0xFB ; 251 3581a: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba LogEchoEvent_P(PSTR("Cooldown flag cleared")); 3581e: 8d e1 ldi r24, 0x1D ; 29 35820: 99 ea ldi r25, 0xA9 ; 169 35822: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 } if ((mmu_print_saved & SavedState::Cooldown) && resume_hotend_temp) { 35826: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 3582a: 81 ff sbrs r24, 1 3582c: 52 c0 rjmp .+164 ; 0x358d2 3582e: 80 91 ae 13 lds r24, 0x13AE ; 0x8013ae 35832: 90 91 af 13 lds r25, 0x13AF ; 0x8013af 35836: 89 2b or r24, r25 35838: 09 f4 brne .+2 ; 0x3583c 3583a: 4b c0 rjmp .+150 ; 0x358d2 LogEchoEvent_P(PSTR("Resuming Temp")); 3583c: 8f e0 ldi r24, 0x0F ; 15 3583e: 99 ea ldi r25, 0xA9 ; 169 35840: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 // @@TODO MMU2_ECHO_MSGRPGM(PSTR("Restoring hotend temperature ")); SERIAL_ECHOLN(resume_hotend_temp); 35844: 80 91 ae 13 lds r24, 0x13AE ; 0x8013ae 35848: 90 91 af 13 lds r25, 0x13AF ; 0x8013af 3584c: 0f 94 ec 75 call 0x2ebd8 ; 0x2ebd8 mmu_print_saved &= ~(SavedState::Cooldown); 35850: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 35854: 8d 7f andi r24, 0xFD ; 253 35856: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba return target_temperature_bed; }; // Doesn't save FLASH when FORCE_INLINE removed. FORCE_INLINE void setTargetHotend(const float &celsius) { target_temperature[0] = celsius; 3585a: 80 91 ae 13 lds r24, 0x13AE ; 0x8013ae 3585e: 90 91 af 13 lds r25, 0x13AF ; 0x8013af 35862: 90 93 b6 0d sts 0x0DB6, r25 ; 0x800db6 35866: 80 93 b5 0d sts 0x0DB5, r24 ; 0x800db5 void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); } void FullScreenMsgRestoringTemperature(){ lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP)); 3586a: 82 ec ldi r24, 0xC2 ; 194 3586c: 9b e5 ldi r25, 0x5B ; 91 3586e: 0e 94 44 72 call 0xe488 ; 0xe488 35872: 0f 94 c0 20 call 0x24180 ; 0x24180 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)); 35876: 4f ed ldi r20, 0xDF ; 223 35878: 58 ea ldi r21, 0xA8 ; 168 3587a: 62 e0 ldi r22, 0x02 ; 2 3587c: 80 e0 ldi r24, 0x00 ; 0 3587e: 0e 94 8c 6e call 0xdd18 ; 0xdd18 int16_t thermal_degTargetHotend() { return degTargetHotend(0); } int16_t thermal_degHotend() { return degHotend(0); 35882: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 35886: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 3588a: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 3588e: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 35892: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> namespace MMU2 { template void waitForHotendTargetTemp(uint16_t delay, F f) { while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) { 35896: 20 91 b5 0d lds r18, 0x0DB5 ; 0x800db5 3589a: 30 91 b6 0d lds r19, 0x0DB6 ; 0x800db6 3589e: c9 01 movw r24, r18 358a0: 86 1b sub r24, r22 358a2: 97 0b sbc r25, r23 358a4: 06 97 sbiw r24, 0x06 ; 6 358a6: 6c f0 brlt .+26 ; 0x358c2 void marlin_manage_heater() { manage_heater(); } void marlin_manage_inactivity(bool ignore_stepper_queue) { manage_inactivity(ignore_stepper_queue); 358a8: 81 e0 ldi r24, 0x01 ; 1 358aa: 0e 94 4f 8a call 0x1149e ; 0x1149e 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); 358ae: 80 e0 ldi r24, 0x00 ; 0 358b0: 0f 94 f6 a6 call 0x34dec ; 0x34dec ReportErrorHookDynamicRender(); 358b4: 0f 94 ea c4 call 0x389d4 ; 0x389d4 void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 358b8: 84 e6 ldi r24, 0x64 ; 100 358ba: 90 e0 ldi r25, 0x00 ; 0 358bc: 0e 94 84 8c call 0x11908 ; 0x11908 358c0: e0 cf rjmp .-64 ; 0x35882 }); ScreenUpdateEnable(); // temporary hack to stop this locking the printer... 358c2: 0f 94 c0 c4 call 0x38980 ; 0x38980 LogEchoEvent_P(PSTR("Hotend temperature reached")); 358c6: 84 ef ldi r24, 0xF4 ; 244 358c8: 98 ea ldi r25, 0xA8 ; 168 358ca: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 void ScreenUpdateEnable(){ lcd_update_enable(true); } void ScreenClear(){ lcd_clear(); 358ce: 0c 94 ab 6e jmp 0xdd56 ; 0xdd56 ScreenClear(); } } 358d2: 08 95 ret 000358d4 : /// 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) { 358d4: 0f 93 push r16 358d6: 1f 93 push r17 358d8: cf 93 push r28 358da: df 93 push r29 358dc: 00 d0 rcall .+0 ; 0x358de 358de: 1f 92 push r1 358e0: 1f 92 push r1 358e2: cd b7 in r28, 0x3d ; 61 358e4: de b7 in r29, 0x3e ; 62 358e6: 18 2f mov r17, r24 358e8: 06 2f mov r16, r22 mmu_print_saved = SavedState::None; 358ea: 10 92 ba 13 sts 0x13BA, r1 ; 0x8013ba MARLIN_KEEPALIVE_STATE_IN_PROCESS; 358ee: 83 e0 ldi r24, 0x03 ; 3 358f0: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be LongTimer nozzleTimeout; 358f4: 19 82 std Y+1, r1 ; 0x01 358f6: 1a 82 std Y+2, r1 ; 0x02 358f8: 1b 82 std Y+3, r1 ; 0x03 358fa: 1c 82 std Y+4, r1 ; 0x04 358fc: 1d 82 std Y+5, r1 ; 0x05 358fe: 90 e0 ldi r25, 0x00 ; 0 35900: 80 e0 ldi r24, 0x00 ; 0 35902: 0e 94 84 8c call 0x11908 ; 0x11908 // - 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) { 35906: 90 91 ba 13 lds r25, 0x13BA ; 0x8013ba 3590a: 89 81 ldd r24, Y+1 ; 0x01 3590c: 92 ff sbrs r25, 2 3590e: 37 c0 rjmp .+110 ; 0x3597e if (!nozzleTimeout.running()) { 35910: 81 11 cpse r24, r1 35912: 1e c0 rjmp .+60 ; 0x35950 nozzleTimeout.start(); 35914: ce 01 movw r24, r28 35916: 01 96 adiw r24, 0x01 ; 1 35918: 0f 94 cb 2c call 0x25996 ; 0x25996 ::start()> LogEchoEvent_P(PSTR("Cooling Timeout started")); 3591c: 89 e0 ldi r24, 0x09 ; 9 3591e: 97 ea ldi r25, 0xA7 ; 167 thermal_setTargetHotend(0); LogEchoEvent_P(PSTR("Heater cooldown")); } } else if (nozzleTimeout.running()) { nozzleTimeout.stop(); LogEchoEvent_P(PSTR("Cooling timer stopped")); 35920: 0f 94 c9 c5 call 0x38b92 ; 0x38b92 } switch (logicStepLastStatus) { 35924: e0 91 b8 13 lds r30, 0x13B8 ; 0x8013b8 35928: e2 50 subi r30, 0x02 ; 2 3592a: ea 30 cpi r30, 0x0A ; 10 3592c: 40 f7 brcc .-48 ; 0x358fe 3592e: f0 e0 ldi r31, 0x00 ; 0 35930: 88 27 eor r24, r24 35932: e2 56 subi r30, 0x62 ; 98 35934: f3 45 sbci r31, 0x53 ; 83 35936: 8e 4f sbci r24, 0xFE ; 254 35938: 0d 94 20 dd jmp 0x3ba40 ; 0x3ba40 <__tablejump2__> 3593c: c2 39 cpi r28, 0x92 ; 146 3593e: 98 3a cpi r25, 0xA8 ; 168 35940: dc 3a cpi r29, 0xAC ; 172 35942: dc 3a cpi r29, 0xAC ; 172 35944: 18 3a cpi r17, 0xA8 ; 168 35946: dc 3a cpi r29, 0xAC ; 172 35948: 1c 3a cpi r17, 0xAC ; 172 3594a: 94 39 cpi r25, 0x94 ; 148 3594c: 0c 39 cpi r16, 0x9C ; 156 3594e: dc 3a cpi r29, 0xAC ; 172 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. 35950: 40 e4 ldi r20, 0x40 ; 64 35952: 57 e7 ldi r21, 0x77 ; 119 35954: 6b e1 ldi r22, 0x1B ; 27 35956: 70 e0 ldi r23, 0x00 ; 0 35958: ce 01 movw r24, r28 3595a: 01 96 adiw r24, 0x01 ; 1 3595c: 0f 94 0c 2b call 0x25618 ; 0x25618 ::expired(unsigned long)> 35960: 88 23 and r24, r24 35962: 01 f3 breq .-64 ; 0x35924 mmu_print_saved &= ~(SavedState::CooldownPending); 35964: 80 91 ba 13 lds r24, 0x13BA ; 0x8013ba 35968: 8b 7f andi r24, 0xFB ; 251 mmu_print_saved |= SavedState::Cooldown; 3596a: 82 60 ori r24, 0x02 ; 2 3596c: 80 93 ba 13 sts 0x13BA, r24 ; 0x8013ba 35970: 10 92 b6 0d sts 0x0DB6, r1 ; 0x800db6 35974: 10 92 b5 0d sts 0x0DB5, r1 ; 0x800db5 thermal_setTargetHotend(0); LogEchoEvent_P(PSTR("Heater cooldown")); 35978: 89 ef ldi r24, 0xF9 ; 249 3597a: 96 ea ldi r25, 0xA6 ; 166 3597c: d1 cf rjmp .-94 ; 0x35920 } } else if (nozzleTimeout.running()) { 3597e: 88 23 and r24, r24 35980: 89 f2 breq .-94 ; 0x35924 35982: 19 82 std Y+1, r1 ; 0x01 nozzleTimeout.stop(); LogEchoEvent_P(PSTR("Cooling timer stopped")); 35984: 83 ee ldi r24, 0xE3 ; 227 35986: 96 ea ldi r25, 0xA6 ; 166 35988: cb cf rjmp .-106 ; 0x35920 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(); 3598a: 0f 94 08 ac call 0x35810 ; 0x35810 ResumeUnpark(); // We can now travel back to the tower or wherever we were when we saved. 3598e: 0f 94 29 6b call 0x2d652 ; 0x2d652 if (!TuneMenuEntered()) { 35992: 80 91 ac 0d lds r24, 0x0DAC ; 0x800dac <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.498> 35996: 81 11 cpse r24, r1 35998: 07 c0 rjmp .+14 ; 0x359a8 retryAttempts--; } } void ProtocolLogic::ResetRetryAttempts() { SERIAL_ECHOLNPGM("ResetRetryAttempts"); 3599a: 80 ed ldi r24, 0xD0 ; 208 3599c: 96 ea ldi r25, 0xA6 ; 166 3599e: 0e 94 13 79 call 0xf226 ; 0xf226 retryAttempts = MAX_RETRIES; 359a2: 83 e0 ldi r24, 0x03 ; 3 359a4: 80 93 9e 13 sts 0x139E, r24 ; 0x80139e bool planner_draining() { return planner_aborted; } void planner_synchronize() { st_synchronize(); 359a8: 0f 94 a9 43 call 0x28752 ; 0x28752 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; 359ac: 81 e0 ldi r24, 0x01 ; 1 case Processing: // wait for the MMU to respond default: break; } } } 359ae: 0f 90 pop r0 359b0: 0f 90 pop r0 359b2: 0f 90 pop r0 359b4: 0f 90 pop r0 359b6: 0f 90 pop r0 359b8: df 91 pop r29 359ba: cf 91 pop r28 359bc: 1f 91 pop r17 359be: 0f 91 pop r16 359c0: 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(); 359c2: 0f 94 3d a6 call 0x34c7a ; 0x34c7a 359c6: f2 cf rjmp .-28 ; 0x359ac break; case CommandError: case CommunicationTimeout: case ProtocolError: case ButtonPushed: if (!logic.InAutoRetry()) { 359c8: 80 91 9f 13 lds r24, 0x139F ; 0x80139f 359cc: 81 11 cpse r24, r1 359ce: 97 cf rjmp .-210 ; 0x358fe // Don't proceed to the park/save if we are doing an autoretry. SaveAndPark(move_axes); 359d0: 81 2f mov r24, r17 359d2: 0f 94 75 6b call 0x2d6ea ; 0x2d6ea SaveHotendTemp(turn_off_nozzle); 359d6: 80 2f mov r24, r16 359d8: 0f 94 0d 6b call 0x2d61a ; 0x2d61a CheckUserInput(); 359dc: 0f 94 3d a6 call 0x34c7a ; 0x34c7a 359e0: 8e cf rjmp .-228 ; 0x358fe } 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(); 359e2: 0f 94 08 ac call 0x35810 ; 0x35810 ResumeUnpark(); 359e6: 0f 94 29 6b call 0x2d652 ; 0x2d652 359ea: 89 cf rjmp .-238 ; 0x358fe } planner_synchronize(); return true; case Interrupted: // now what :D ... big bad ... ramming, unload, retry the whole command originally issued return false; 359ec: 80 e0 ldi r24, 0x00 ; 0 359ee: df cf rjmp .-66 ; 0x359ae 000359f0 : } // true, true); -- Comment: how is it possible for a filament type set to fail? return true; } void MMU2::UnloadInner() { 359f0: cf 93 push r28 359f2: df 93 push r29 359f4: 00 d0 rcall .+0 ; 0x359f6 359f6: 1f 92 push r1 359f8: 1f 92 push r1 359fa: cd b7 in r28, 0x3d ; 61 359fc: de b7 in r29, 0x3e ; 62 FSensorBlockRunout blockRunout; 359fe: 0f 94 a5 87 call 0x30f4a ; 0x30f4a return ss; } void MMU2::filament_ramming() { execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); 35a02: 62 e1 ldi r22, 0x12 ; 18 35a04: 80 e4 ldi r24, 0x40 ; 64 35a06: 96 ea ldi r25, 0xA6 ; 166 35a08: 0f 94 4f 88 call 0x3109e ; 0x3109e 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(); 35a0c: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 void ProtocolLogic::Statistics() { PlanGenericRequest(RequestMsg(RequestMsgCodes::Version, 3)); } void ProtocolLogic::UnloadFilament() { PlanGenericRequest(RequestMsg(RequestMsgCodes::Unload, 0)); 35a10: 40 e0 ldi r20, 0x00 ; 0 35a12: 65 e5 ldi r22, 0x55 ; 85 35a14: ce 01 movw r24, r28 35a16: 01 96 adiw r24, 0x01 ; 1 35a18: 0f 94 81 c5 call 0x38b02 ; 0x38b02 35a1c: 49 81 ldd r20, Y+1 ; 0x01 35a1e: 5a 81 ldd r21, Y+2 ; 0x02 35a20: 6b 81 ldd r22, Y+3 ; 0x03 35a22: 7c 81 ldd r23, Y+4 ; 0x04 35a24: 8d 81 ldd r24, Y+5 ; 0x05 35a26: 0f 94 46 a5 call 0x34a8c ; 0x34a8c logic.UnloadFilament(); if (manage_response(false, true)) { 35a2a: 61 e0 ldi r22, 0x01 ; 1 35a2c: 80 e0 ldi r24, 0x00 ; 0 35a2e: 0f 94 6a ac call 0x358d4 ; 0x358d4 35a32: 81 11 cpse r24, r1 35a34: 03 c0 rjmp .+6 ; 0x35a3c break; } IncrementMMUFails(); 35a36: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 35a3a: e8 cf rjmp .-48 ; 0x35a0c 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); 35a3c: 83 e0 ldi r24, 0x03 ; 3 35a3e: 0f 94 c8 4e call 0x29d90 ; 0x29d90 } MakeSound(Confirm); // no active tool SetCurrentTool(MMU2_NO_TOOL); 35a42: 83 e6 ldi r24, 0x63 ; 99 35a44: 0f 94 f7 87 call 0x30fee ; 0x30fee tool_change_extruder = MMU2_NO_TOOL; 35a48: 83 e6 ldi r24, 0x63 ; 99 35a4a: 80 93 a1 13 sts 0x13A1, r24 ; 0x8013a1 FSensorBlockRunout::~FSensorBlockRunout() { fsensor.settings_init(); // restore filament runout state. 35a4e: 0f 94 e9 7b call 0x2f7d2 ; 0x2f7d2 } 35a52: 0f 90 pop r0 35a54: 0f 90 pop r0 35a56: 0f 90 pop r0 35a58: 0f 90 pop r0 35a5a: 0f 90 pop r0 35a5c: df 91 pop r29 35a5e: cf 91 pop r28 35a60: 08 95 ret 00035a62 : bool MMU2::unload() { 35a62: cf 93 push r28 if (!WaitForMMUReady()) { 35a64: 0f 94 78 88 call 0x310f0 ; 0x310f0 35a68: c8 2f mov r28, r24 35a6a: 88 23 and r24, r24 35a6c: 79 f0 breq .+30 ; 0x35a8c safe_delay_keep_alive(delay); } } void WaitForHotendTargetTempBeep() { waitForHotendTargetTemp(200, [] {}); 35a6e: 88 ec ldi r24, 0xC8 ; 200 35a70: 90 e0 ldi r25, 0x00 ; 0 35a72: 0f 94 27 c9 call 0x3924e ; 0x3924e (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]> 35a76: 82 e0 ldi r24, 0x02 ; 2 35a78: 0f 94 c8 4e call 0x29d90 ; 0x29d90 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 35a7c: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 WaitForHotendTargetTempBeep(); { ReportingRAII rep(CommandInProgress::UnloadFilament); UnloadInner(); 35a80: 0f 94 f8 ac call 0x359f0 ; 0x359f0 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 35a84: 0f 94 6d 88 call 0x310da ; 0x310da { ReportingRAII rep(CommandInProgress::UnloadFilament); UnloadInner(); } ScreenUpdateEnable(); 35a88: 0f 94 c0 c4 call 0x38980 ; 0x38980 return true; } 35a8c: 8c 2f mov r24, r28 35a8e: cf 91 pop r28 35a90: 08 95 ret 00035a92 : unload(); ScreenUpdateEnable(); return true; } bool MMU2::load_filament(uint8_t slot) { 35a92: 0f 93 push r16 35a94: 1f 93 push r17 35a96: cf 93 push r28 35a98: df 93 push r29 35a9a: 00 d0 rcall .+0 ; 0x35a9c 35a9c: 1f 92 push r1 35a9e: 1f 92 push r1 35aa0: cd b7 in r28, 0x3d ; 61 35aa2: de b7 in r29, 0x3e ; 62 35aa4: 08 2f mov r16, r24 if (!WaitForMMUReady()) { 35aa6: 0f 94 78 88 call 0x310f0 ; 0x310f0 35aaa: 18 2f mov r17, r24 35aac: 88 23 and r24, r24 35aae: 49 f1 breq .+82 ; 0x35b02 void FullScreenMsgTest(uint8_t slot){ FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot); } void FullScreenMsgLoad(uint8_t slot){ FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot); 35ab0: 8f ea ldi r24, 0xAF ; 175 35ab2: 9b e5 ldi r25, 0x5B ; 91 35ab4: 0e 94 44 72 call 0xe488 ; 0xe488 35ab8: 60 2f mov r22, r16 35aba: 0f 94 c3 c4 call 0x38986 ; 0x38986 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 35abe: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 FullScreenMsgLoad(slot); { ReportingRAII rep(CommandInProgress::LoadFilament); for (;;) { Disable_E0(); 35ac2: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 } void ProtocolLogic::LoadFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Load, slot)); 35ac6: 40 2f mov r20, r16 35ac8: 6c e4 ldi r22, 0x4C ; 76 35aca: ce 01 movw r24, r28 35acc: 01 96 adiw r24, 0x01 ; 1 35ace: 0f 94 81 c5 call 0x38b02 ; 0x38b02 35ad2: 49 81 ldd r20, Y+1 ; 0x01 35ad4: 5a 81 ldd r21, Y+2 ; 0x02 35ad6: 6b 81 ldd r22, Y+3 ; 0x03 35ad8: 7c 81 ldd r23, Y+4 ; 0x04 35ada: 8d 81 ldd r24, Y+5 ; 0x05 35adc: 0f 94 46 a5 call 0x34a8c ; 0x34a8c logic.LoadFilament(slot); if (manage_response(false, false)) { 35ae0: 60 e0 ldi r22, 0x00 ; 0 35ae2: 80 e0 ldi r24, 0x00 ; 0 35ae4: 0f 94 6a ac call 0x358d4 ; 0x358d4 35ae8: 18 2f mov r17, r24 35aea: 81 11 cpse r24, r1 35aec: 03 c0 rjmp .+6 ; 0x35af4 break; } IncrementMMUFails(); 35aee: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 35af2: e7 cf rjmp .-50 ; 0x35ac2 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); 35af4: 83 e0 ldi r24, 0x03 ; 3 35af6: 0f 94 c8 4e call 0x29d90 ; 0x29d90 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 35afa: 0f 94 6d 88 call 0x310da ; 0x310da } IncrementMMUFails(); } MakeSound(SoundType::Confirm); } ScreenUpdateEnable(); 35afe: 0f 94 c0 c4 call 0x38980 ; 0x38980 return true; } 35b02: 81 2f mov r24, r17 35b04: 0f 90 pop r0 35b06: 0f 90 pop r0 35b08: 0f 90 pop r0 35b0a: 0f 90 pop r0 35b0c: 0f 90 pop r0 35b0e: df 91 pop r29 35b10: cf 91 pop r28 35b12: 1f 91 pop r17 35b14: 0f 91 pop r16 35b16: 08 95 ret 00035b18 : } ScreenUpdateEnable(); return true; } bool MMU2::eject_filament(uint8_t slot, bool enableFullScreenMsg /* = true */) { 35b18: ff 92 push r15 35b1a: 0f 93 push r16 35b1c: 1f 93 push r17 35b1e: cf 93 push r28 35b20: df 93 push r29 35b22: 00 d0 rcall .+0 ; 0x35b24 35b24: 1f 92 push r1 35b26: 1f 92 push r1 35b28: cd b7 in r28, 0x3d ; 61 35b2a: de b7 in r29, 0x3e ; 62 35b2c: 08 2f mov r16, r24 35b2e: f6 2e mov r15, r22 if (!WaitForMMUReady()) { 35b30: 0f 94 78 88 call 0x310f0 ; 0x310f0 35b34: 18 2f mov r17, r24 35b36: 88 23 and r24, r24 35b38: b1 f1 breq .+108 ; 0x35ba6 return false; } if (enableFullScreenMsg) { 35b3a: ff 20 and r15, r15 35b3c: 39 f0 breq .+14 ; 0x35b4c void FullScreenMsgCut(uint8_t slot){ FullScreenMsg(_T(MSG_CUT_FILAMENT), slot); } void FullScreenMsgEject(uint8_t slot){ FullScreenMsg(_T(MSG_EJECT_FROM_MMU), slot); 35b3e: 8e e9 ldi r24, 0x9E ; 158 35b40: 9b e5 ldi r25, 0x5B ; 91 35b42: 0e 94 44 72 call 0xe488 ; 0xe488 35b46: 60 2f mov r22, r16 35b48: 0f 94 c3 c4 call 0x38986 ; 0x38986 FullScreenMsgEject(slot); } { if (FindaDetectsFilament()) { 35b4c: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 35b50: 81 11 cpse r24, r1 unload(); 35b52: 0f 94 31 ad call 0x35a62 ; 0x35a62 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 35b56: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 unload(); } ReportingRAII rep(CommandInProgress::EjectFilament); for (;;) { Disable_E0(); 35b5a: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 } void ProtocolLogic::EjectFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Eject, slot)); 35b5e: 40 2f mov r20, r16 35b60: 65 e4 ldi r22, 0x45 ; 69 35b62: ce 01 movw r24, r28 35b64: 01 96 adiw r24, 0x01 ; 1 35b66: 0f 94 81 c5 call 0x38b02 ; 0x38b02 35b6a: 49 81 ldd r20, Y+1 ; 0x01 35b6c: 5a 81 ldd r21, Y+2 ; 0x02 35b6e: 6b 81 ldd r22, Y+3 ; 0x03 35b70: 7c 81 ldd r23, Y+4 ; 0x04 35b72: 8d 81 ldd r24, Y+5 ; 0x05 35b74: 0f 94 46 a5 call 0x34a8c ; 0x34a8c logic.EjectFilament(slot); if (manage_response(false, true)) { 35b78: 61 e0 ldi r22, 0x01 ; 1 35b7a: 80 e0 ldi r24, 0x00 ; 0 35b7c: 0f 94 6a ac call 0x358d4 ; 0x358d4 35b80: 18 2f mov r17, r24 35b82: 81 11 cpse r24, r1 35b84: 03 c0 rjmp .+6 ; 0x35b8c break; } IncrementMMUFails(); 35b86: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 35b8a: e7 cf rjmp .-50 ; 0x35b5a } SetCurrentTool(MMU2_NO_TOOL); 35b8c: 83 e6 ldi r24, 0x63 ; 99 35b8e: 0f 94 f7 87 call 0x30fee ; 0x30fee tool_change_extruder = MMU2_NO_TOOL; 35b92: 83 e6 ldi r24, 0x63 ; 99 35b94: 80 93 a1 13 sts 0x13A1, r24 ; 0x8013a1 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); 35b98: 83 e0 ldi r24, 0x03 ; 3 35b9a: 0f 94 c8 4e call 0x29d90 ; 0x29d90 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 35b9e: 0f 94 6d 88 call 0x310da ; 0x310da } SetCurrentTool(MMU2_NO_TOOL); tool_change_extruder = MMU2_NO_TOOL; MakeSound(Confirm); } ScreenUpdateEnable(); 35ba2: 0f 94 c0 c4 call 0x38980 ; 0x38980 return true; } 35ba6: 81 2f mov r24, r17 35ba8: 0f 90 pop r0 35baa: 0f 90 pop r0 35bac: 0f 90 pop r0 35bae: 0f 90 pop r0 35bb0: 0f 90 pop r0 35bb2: df 91 pop r29 35bb4: cf 91 pop r28 35bb6: 1f 91 pop r17 35bb8: 0f 91 pop r16 35bba: ff 90 pop r15 35bbc: 08 95 ret 00035bbe : ScreenUpdateEnable(); return true; } void MMU2::CutFilamentInner(uint8_t slot) { 35bbe: 1f 93 push r17 35bc0: cf 93 push r28 35bc2: df 93 push r29 35bc4: 00 d0 rcall .+0 ; 0x35bc6 35bc6: 1f 92 push r1 35bc8: 1f 92 push r1 35bca: cd b7 in r28, 0x3d ; 61 35bcc: de b7 in r29, 0x3e ; 62 35bce: 18 2f mov r17, r24 for (;;) { Disable_E0(); 35bd0: 0f 94 a3 c5 call 0x38b46 ; 0x38b46 } void ProtocolLogic::CutFilament(uint8_t slot) { PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot)); 35bd4: 41 2f mov r20, r17 35bd6: 6b e4 ldi r22, 0x4B ; 75 35bd8: ce 01 movw r24, r28 35bda: 01 96 adiw r24, 0x01 ; 1 35bdc: 0f 94 81 c5 call 0x38b02 ; 0x38b02 35be0: 49 81 ldd r20, Y+1 ; 0x01 35be2: 5a 81 ldd r21, Y+2 ; 0x02 35be4: 6b 81 ldd r22, Y+3 ; 0x03 35be6: 7c 81 ldd r23, Y+4 ; 0x04 35be8: 8d 81 ldd r24, Y+5 ; 0x05 35bea: 0f 94 46 a5 call 0x34a8c ; 0x34a8c logic.CutFilament(slot); if (manage_response(false, true)) { 35bee: 61 e0 ldi r22, 0x01 ; 1 35bf0: 80 e0 ldi r24, 0x00 ; 0 35bf2: 0f 94 6a ac call 0x358d4 ; 0x358d4 35bf6: 81 11 cpse r24, r1 35bf8: 03 c0 rjmp .+6 ; 0x35c00 break; } IncrementMMUFails(); 35bfa: 0f 94 e2 c4 call 0x389c4 ; 0x389c4 35bfe: e8 cf rjmp .-48 ; 0x35bd0 } } 35c00: 0f 90 pop r0 35c02: 0f 90 pop r0 35c04: 0f 90 pop r0 35c06: 0f 90 pop r0 35c08: 0f 90 pop r0 35c0a: df 91 pop r29 35c0c: cf 91 pop r28 35c0e: 1f 91 pop r17 35c10: 08 95 ret 00035c12 : bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) { 35c12: cf 93 push r28 35c14: c8 2f mov r28, r24 lcd_print(' '); lcd_print(slot + 1); } void FullScreenMsgCut(uint8_t slot){ FullScreenMsg(_T(MSG_CUT_FILAMENT), slot); 35c16: 8f e8 ldi r24, 0x8F ; 143 35c18: 9b e5 ldi r25, 0x5B ; 91 35c1a: 0e 94 44 72 call 0xe488 ; 0xe488 35c1e: 6c 2f mov r22, r28 35c20: 0f 94 c3 c4 call 0x38986 ; 0x38986 if (enableFullScreenMsg) { FullScreenMsgCut(slot); } { if (FindaDetectsFilament()) { 35c24: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 35c28: 81 11 cpse r24, r1 unload(); 35c2a: 0f 94 31 ad call 0x35a62 ; 0x35a62 struct ReportingRAII { CommandInProgress cip; explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); 35c2e: 0f 94 ec 87 call 0x30fd8 ; 0x30fd8 if (FindaDetectsFilament()) { unload(); } ReportingRAII rep(CommandInProgress::CutFilament); CutFilamentInner(slot); 35c32: 8c 2f mov r24, r28 35c34: 0f 94 df ad call 0x35bbe ; 0x35bbe SetCurrentTool(MMU2_NO_TOOL); 35c38: 83 e6 ldi r24, 0x63 ; 99 35c3a: 0f 94 f7 87 call 0x30fee ; 0x30fee tool_change_extruder = MMU2_NO_TOOL; 35c3e: 83 e6 ldi r24, 0x63 ; 99 35c40: 80 93 a1 13 sts 0x13A1, r24 ; 0x8013a1 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); 35c44: 83 e0 ldi r24, 0x03 ; 3 35c46: 0f 94 c8 4e call 0x29d90 ; 0x29d90 explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip) : cip(cip) { BeginReport(cip, ProgressCode::EngagingIdler); } inline __attribute__((always_inline)) ~ReportingRAII() { EndReport(cip, ProgressCode::OK); 35c4a: 0f 94 6d 88 call 0x310da ; 0x310da CutFilamentInner(slot); SetCurrentTool(MMU2_NO_TOOL); tool_change_extruder = MMU2_NO_TOOL; MakeSound(SoundType::Confirm); } ScreenUpdateEnable(); 35c4e: 0f 94 c0 c4 call 0x38980 ; 0x38980 return true; } 35c52: 81 e0 ldi r24, 0x01 ; 1 35c54: cf 91 pop r28 35c56: 08 95 ret 00035c58 : ch = UDR0; return ch; } static void putch(char ch) { while (!(UCSR0A & _BV(UDRE0))); 35c58: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> 35c5c: 95 ff sbrs r25, 5 35c5e: fc cf rjmp .-8 ; 0x35c58 UDR0 = ch; 35c60: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> } 35c64: 08 95 ret 00035c66 : #define RECV_READY ((UCSR0A & _BV(RXC0)) != 0) static uint8_t getch(void) { uint8_t ch; while(! RECV_READY) ; 35c66: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> 35c6a: 87 ff sbrs r24, 7 35c6c: fc cf rjmp .-8 ; 0x35c66 if (!(UCSR0A & _BV(FE0))) { 35c6e: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> 35c72: 84 fd sbrc r24, 4 35c74: 01 c0 rjmp .+2 ; 0x35c78 * expects to be talking to the application, and DON'T reset the * watchdog. This should cause the bootloader to abort and run * the application "soon", if it keeps happening. (Note that we * don't care that an invalid char is returned...) */ wdt_reset(); 35c76: a8 95 wdr } ch = UDR0; 35c78: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> return ch; } 35c7c: 08 95 ret 00035c7e : /// 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; 35c7e: 86 27 eor r24, r22 35c80: 98 e0 ldi r25, 0x08 ; 8 for (uint8_t i = 0; i < 8; i++) { if ((data & 0x80U) != 0) { data <<= 1U; data ^= 0x07U; 35c82: 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) { 35c84: 38 2f mov r19, r24 35c86: 88 0f add r24, r24 35c88: 37 fd sbrc r19, 7 data <<= 1U; data ^= 0x07U; 35c8a: 82 27 eor r24, r18 35c8c: 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++) { 35c8e: d1 f7 brne .-12 ; 0x35c84 } else { data <<= 1U; } } return data; } 35c90: 08 95 ret 00035c92 : // 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) { 35c92: 2f 92 push r2 35c94: 3f 92 push r3 35c96: 4f 92 push r4 35c98: 5f 92 push r5 35c9a: 6f 92 push r6 35c9c: 7f 92 push r7 35c9e: 8f 92 push r8 35ca0: 9f 92 push r9 35ca2: af 92 push r10 35ca4: bf 92 push r11 35ca6: cf 92 push r12 35ca8: df 92 push r13 35caa: ef 92 push r14 35cac: ff 92 push r15 35cae: 0f 93 push r16 35cb0: 1f 93 push r17 35cb2: cf 93 push r28 35cb4: df 93 push r29 35cb6: cd b7 in r28, 0x3d ; 61 35cb8: de b7 in r29, 0x3e ; 62 35cba: a1 97 sbiw r28, 0x21 ; 33 35cbc: 0f b6 in r0, 0x3f ; 63 35cbe: f8 94 cli 35cc0: de bf out 0x3e, r29 ; 62 35cc2: 0f be out 0x3f, r0 ; 63 35cc4: cd bf out 0x3d, r28 ; 61 35cc6: 1c 01 movw r2, r24 35cc8: 48 01 movw r8, r16 35cca: 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) 35ccc: fc 01 movw r30, r24 35cce: e8 5b subi r30, 0xB8 ; 184 35cd0: ff 4f sbci r31, 0xFF ; 255 35cd2: c0 80 ld r12, Z 35cd4: d1 80 ldd r13, Z+1 ; 0x01 35cd6: e2 80 ldd r14, Z+2 ; 0x02 35cd8: f3 80 ldd r15, Z+3 ; 0x03 35cda: 9a 01 movw r18, r20 35cdc: ab 01 movw r20, r22 35cde: c7 01 movw r24, r14 35ce0: b6 01 movw r22, r12 35ce2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 35ce6: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 35cea: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 35cee: 8b 01 movw r16, r22 35cf0: 8d 83 std Y+5, r24 ; 0x05 35cf2: 99 83 std Y+1, r25 ; 0x01 uint32_t final_rate = ceil(exit_speed * block->speed_factor); // (step/min) 35cf4: a5 01 movw r20, r10 35cf6: 94 01 movw r18, r8 35cf8: c7 01 movw r24, r14 35cfa: b6 01 movw r22, r12 35cfc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 35d00: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 35d04: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 35d08: 36 2f mov r19, r22 35d0a: 27 2f mov r18, r23 35d0c: a8 01 movw r20, r16 35d0e: 6d 81 ldd r22, Y+5 ; 0x05 35d10: 79 81 ldd r23, Y+1 ; 0x01 35d12: 48 37 cpi r20, 0x78 ; 120 35d14: 51 05 cpc r21, r1 35d16: 61 05 cpc r22, r1 35d18: 71 05 cpc r23, r1 35d1a: 20 f4 brcc .+8 ; 0x35d24 35d1c: 48 e7 ldi r20, 0x78 ; 120 35d1e: 50 e0 ldi r21, 0x00 ; 0 35d20: 60 e0 ldi r22, 0x00 ; 0 35d22: 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) 35d24: d1 01 movw r26, r2 35d26: d6 96 adiw r26, 0x36 ; 54 35d28: 8d 90 ld r8, X+ 35d2a: 9d 90 ld r9, X+ 35d2c: ad 90 ld r10, X+ 35d2e: bc 90 ld r11, X 35d30: d9 97 sbiw r26, 0x39 ; 57 35d32: 8f 8a std Y+23, r8 ; 0x17 35d34: 98 8e std Y+24, r9 ; 0x18 35d36: a9 8e std Y+25, r10 ; 0x19 35d38: ba 8e std Y+26, r11 ; 0x1a 35d3a: 48 15 cp r20, r8 35d3c: 59 05 cpc r21, r9 35d3e: 6a 05 cpc r22, r10 35d40: 7b 05 cpc r23, r11 35d42: 20 f4 brcc .+8 ; 0x35d4c 35d44: 4f 8b std Y+23, r20 ; 0x17 35d46: 58 8f std Y+24, r21 ; 0x18 35d48: 69 8f std Y+25, r22 ; 0x19 35d4a: 7a 8f std Y+26, r23 ; 0x1a 35d4c: 43 2f mov r20, r19 35d4e: 52 2f mov r21, r18 35d50: bc 01 movw r22, r24 35d52: 48 37 cpi r20, 0x78 ; 120 35d54: 51 05 cpc r21, r1 35d56: 61 05 cpc r22, r1 35d58: 71 05 cpc r23, r1 35d5a: 20 f4 brcc .+8 ; 0x35d64 35d5c: 48 e7 ldi r20, 0x78 ; 120 35d5e: 50 e0 ldi r21, 0x00 ; 0 35d60: 60 e0 ldi r22, 0x00 ; 0 35d62: 70 e0 ldi r23, 0x00 ; 0 35d64: 18 2d mov r17, r8 35d66: 09 2d mov r16, r9 35d68: a9 a2 std Y+33, r10 ; 0x21 35d6a: b8 a2 std Y+32, r11 ; 0x20 35d6c: 48 15 cp r20, r8 35d6e: 59 05 cpc r21, r9 35d70: 6a 05 cpc r22, r10 35d72: 7b 05 cpc r23, r11 35d74: 20 f4 brcc .+8 ; 0x35d7e 35d76: 14 2f mov r17, r20 35d78: 05 2f mov r16, r21 35d7a: 69 a3 std Y+33, r22 ; 0x21 35d7c: 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; 35d7e: f1 01 movw r30, r2 35d80: ee 5b subi r30, 0xBE ; 190 35d82: ff 4f sbci r31, 0xFF ; 255 35d84: c0 80 ld r12, Z 35d86: d1 80 ldd r13, Z+1 ; 0x01 35d88: e2 80 ldd r14, Z+2 ; 0x02 35d8a: f3 80 ldd r15, Z+3 ; 0x03 35d8c: cd 82 std Y+5, r12 ; 0x05 35d8e: de 82 std Y+6, r13 ; 0x06 35d90: ef 82 std Y+7, r14 ; 0x07 35d92: f8 86 std Y+8, r15 ; 0x08 if (acceleration == 0) 35d94: cd 28 or r12, r13 35d96: ce 28 or r12, r14 35d98: cf 28 or r12, r15 35d9a: 41 f4 brne .+16 ; 0x35dac // Don't allow zero acceleration. acceleration = 1; 35d9c: c1 2c mov r12, r1 35d9e: d1 2c mov r13, r1 35da0: 76 01 movw r14, r12 35da2: c3 94 inc r12 35da4: cd 82 std Y+5, r12 ; 0x05 35da6: de 82 std Y+6, r13 ; 0x06 35da8: ef 82 std Y+7, r14 ; 0x07 35daa: 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; 35dac: 2f 89 ldd r18, Y+23 ; 0x17 35dae: 38 8d ldd r19, Y+24 ; 0x18 35db0: 49 8d ldd r20, Y+25 ; 0x19 35db2: 5a 8d ldd r21, Y+26 ; 0x1a 35db4: b9 01 movw r22, r18 35db6: ca 01 movw r24, r20 35db8: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 35dbc: 6d 87 std Y+13, r22 ; 0x0d 35dbe: 7e 87 std Y+14, r23 ; 0x0e 35dc0: 8f 87 std Y+15, r24 ; 0x0f 35dc2: 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; 35dc4: a5 01 movw r20, r10 35dc6: 94 01 movw r18, r8 35dc8: c5 01 movw r24, r10 35dca: b4 01 movw r22, r8 35dcc: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 35dd0: 2b 01 movw r4, r22 35dd2: 3c 01 movw r6, r24 uint32_t final_rate_sqr = final_rate*final_rate; 35dd4: 21 2f mov r18, r17 35dd6: 30 2f mov r19, r16 35dd8: 49 a1 ldd r20, Y+33 ; 0x21 35dda: 58 a1 ldd r21, Y+32 ; 0x20 35ddc: 61 2f mov r22, r17 35dde: 70 2f mov r23, r16 35de0: ca 01 movw r24, r20 35de2: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 35de6: 69 8b std Y+17, r22 ; 0x11 35de8: 7a 8b std Y+18, r23 ; 0x12 35dea: 8b 8b std Y+19, r24 ; 0x13 35dec: 9c 8b std Y+20, r25 ; 0x14 uint32_t acceleration_x2 = acceleration << 1; 35dee: cd 80 ldd r12, Y+5 ; 0x05 35df0: de 80 ldd r13, Y+6 ; 0x06 35df2: ef 80 ldd r14, Y+7 ; 0x07 35df4: f8 84 ldd r15, Y+8 ; 0x08 35df6: cc 0c add r12, r12 35df8: dd 1c adc r13, r13 35dfa: ee 1c adc r14, r14 35dfc: ff 1c adc r15, r15 35dfe: c9 86 std Y+9, r12 ; 0x09 35e00: da 86 std Y+10, r13 ; 0x0a 35e02: eb 86 std Y+11, r14 ; 0x0b 35e04: 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; 35e06: c3 01 movw r24, r6 35e08: b2 01 movw r22, r4 35e0a: 61 50 subi r22, 0x01 ; 1 35e0c: 71 09 sbc r23, r1 35e0e: 81 09 sbc r24, r1 35e10: 91 09 sbc r25, r1 35e12: cd 84 ldd r12, Y+13 ; 0x0d 35e14: de 84 ldd r13, Y+14 ; 0x0e 35e16: ef 84 ldd r14, Y+15 ; 0x0f 35e18: f8 88 ldd r15, Y+16 ; 0x10 35e1a: 6c 19 sub r22, r12 35e1c: 7d 09 sbc r23, r13 35e1e: 8e 09 sbc r24, r14 35e20: 9f 09 sbc r25, r15 35e22: c9 84 ldd r12, Y+9 ; 0x09 35e24: da 84 ldd r13, Y+10 ; 0x0a 35e26: eb 84 ldd r14, Y+11 ; 0x0b 35e28: fc 84 ldd r15, Y+12 ; 0x0c 35e2a: 6c 0d add r22, r12 35e2c: 7d 1d adc r23, r13 35e2e: 8e 1d adc r24, r14 35e30: 9f 1d adc r25, r15 35e32: a7 01 movw r20, r14 35e34: 96 01 movw r18, r12 35e36: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 35e3a: 69 01 movw r12, r18 35e3c: 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; 35e3e: c3 01 movw r24, r6 35e40: b2 01 movw r22, r4 35e42: 29 89 ldd r18, Y+17 ; 0x11 35e44: 3a 89 ldd r19, Y+18 ; 0x12 35e46: 4b 89 ldd r20, Y+19 ; 0x13 35e48: 5c 89 ldd r21, Y+20 ; 0x14 35e4a: 62 1b sub r22, r18 35e4c: 73 0b sbc r23, r19 35e4e: 84 0b sbc r24, r20 35e50: 95 0b sbc r25, r21 35e52: 29 85 ldd r18, Y+9 ; 0x09 35e54: 3a 85 ldd r19, Y+10 ; 0x0a 35e56: 4b 85 ldd r20, Y+11 ; 0x0b 35e58: 5c 85 ldd r21, Y+12 ; 0x0c 35e5a: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 35e5e: 29 01 movw r4, r18 35e60: 3a 01 movw r6, r20 uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; 35e62: d7 01 movw r26, r14 35e64: c6 01 movw r24, r12 35e66: 84 0d add r24, r4 35e68: 95 1d adc r25, r5 35e6a: a6 1d adc r26, r6 35e6c: b7 1d adc r27, r7 35e6e: 8c 8f std Y+28, r24 ; 0x1c 35e70: 9d 8f std Y+29, r25 ; 0x1d 35e72: ae 8f std Y+30, r26 ; 0x1e 35e74: 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) { 35e76: f1 01 movw r30, r2 35e78: e4 5b subi r30, 0xB4 ; 180 35e7a: ff 4f sbci r31, 0xFF ; 255 35e7c: 90 81 ld r25, Z 35e7e: 9b 8f std Y+27, r25 ; 0x1b 35e80: 99 23 and r25, r25 35e82: 09 f4 brne .+2 ; 0x35e86 35e84: 8d c0 rjmp .+282 ; 0x35fa0 final_adv_steps = final_rate * block->adv_comp; 35e86: 61 2f mov r22, r17 35e88: 70 2f mov r23, r16 35e8a: 89 a1 ldd r24, Y+33 ; 0x21 35e8c: 98 a1 ldd r25, Y+32 ; 0x20 35e8e: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 35e92: f1 01 movw r30, r2 35e94: ec 5a subi r30, 0xAC ; 172 35e96: ff 4f sbci r31, 0xFF ; 255 35e98: 20 81 ld r18, Z 35e9a: 31 81 ldd r19, Z+1 ; 0x01 35e9c: 42 81 ldd r20, Z+2 ; 0x02 35e9e: 53 81 ldd r21, Z+3 ; 0x03 35ea0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 35ea4: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 35ea8: 6d 8b std Y+21, r22 ; 0x15 35eaa: 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) { 35eac: d1 01 movw r26, r2 35eae: 50 96 adiw r26, 0x10 ; 16 35eb0: 2d 91 ld r18, X+ 35eb2: 3d 91 ld r19, X+ 35eb4: 4d 91 ld r20, X+ 35eb6: 5c 91 ld r21, X 35eb8: 53 97 sbiw r26, 0x13 ; 19 35eba: 29 83 std Y+1, r18 ; 0x01 35ebc: 3a 83 std Y+2, r19 ; 0x02 35ebe: 4b 83 std Y+3, r20 ; 0x03 35ec0: 5c 83 std Y+4, r21 ; 0x04 35ec2: 8c 8d ldd r24, Y+28 ; 0x1c 35ec4: 9d 8d ldd r25, Y+29 ; 0x1d 35ec6: ae 8d ldd r26, Y+30 ; 0x1e 35ec8: bf 8d ldd r27, Y+31 ; 0x1f 35eca: 82 17 cp r24, r18 35ecc: 93 07 cpc r25, r19 35ece: a4 07 cpc r26, r20 35ed0: b5 07 cpc r27, r21 35ed2: 08 f0 brcs .+2 ; 0x35ed6 35ed4: 68 c0 rjmp .+208 ; 0x35fa6 plateau_steps = block->step_event_count.wide - accel_decel_steps; 35ed6: 29 01 movw r4, r18 35ed8: 3a 01 movw r6, r20 35eda: 48 1a sub r4, r24 35edc: 59 0a sbc r5, r25 35ede: 6a 0a sbc r6, r26 35ee0: 7b 0a sbc r7, r27 #ifdef LIN_ADVANCE if (block->use_advance_lead) 35ee2: 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; 35ee4: 40 e0 ldi r20, 0x00 ; 0 35ee6: 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) 35ee8: 99 23 and r25, r25 35eea: 89 f0 breq .+34 ; 0x35f0e max_adv_steps = block->nominal_rate * block->adv_comp; 35eec: c5 01 movw r24, r10 35eee: b4 01 movw r22, r8 35ef0: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 35ef4: f1 01 movw r30, r2 35ef6: ec 5a subi r30, 0xAC ; 172 35ef8: ff 4f sbci r31, 0xFF ; 255 35efa: 20 81 ld r18, Z 35efc: 31 81 ldd r19, Z+1 ; 0x01 35efe: 42 81 ldd r20, Z+2 ; 0x02 35f00: 53 81 ldd r21, Z+3 ; 0x03 35f02: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 35f06: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 35f0a: 46 2f mov r20, r22 35f0c: 87 2f mov r24, r23 } } #endif } CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section 35f0e: 3f b7 in r19, 0x3f ; 63 35f10: 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. 35f12: f1 01 movw r30, r2 35f14: e9 5b subi r30, 0xB9 ; 185 35f16: ff 4f sbci r31, 0xFF ; 255 35f18: 20 81 ld r18, Z 35f1a: 21 11 cpse r18, r1 35f1c: 27 c0 rjmp .+78 ; 0x35f6c block->accelerate_until = accelerate_steps; 35f1e: d1 01 movw r26, r2 35f20: 59 96 adiw r26, 0x19 ; 25 35f22: cd 92 st X+, r12 35f24: dd 92 st X+, r13 35f26: ed 92 st X+, r14 35f28: fc 92 st X, r15 35f2a: 5c 97 sbiw r26, 0x1c ; 28 block->decelerate_after = accelerate_steps+plateau_steps; 35f2c: c4 0c add r12, r4 35f2e: d5 1c adc r13, r5 35f30: e6 1c adc r14, r6 35f32: f7 1c adc r15, r7 35f34: f1 01 movw r30, r2 35f36: c5 8e std Z+29, r12 ; 0x1d 35f38: d6 8e std Z+30, r13 ; 0x1e 35f3a: e7 8e std Z+31, r14 ; 0x1f 35f3c: f0 a2 std Z+32, r15 ; 0x20 block->initial_rate = initial_rate; 35f3e: cf 88 ldd r12, Y+23 ; 0x17 35f40: c2 ae std Z+58, r12 ; 0x3a 35f42: d8 8c ldd r13, Y+24 ; 0x18 35f44: d3 ae std Z+59, r13 ; 0x3b 35f46: e9 8c ldd r14, Y+25 ; 0x19 35f48: e4 ae std Z+60, r14 ; 0x3c 35f4a: fa 8c ldd r15, Y+26 ; 0x1a 35f4c: f5 ae std Z+61, r15 ; 0x3d block->final_rate = final_rate; 35f4e: fe 96 adiw r30, 0x3e ; 62 35f50: 10 83 st Z, r17 35f52: 01 83 std Z+1, r16 ; 0x01 35f54: c9 a0 ldd r12, Y+33 ; 0x21 35f56: c2 82 std Z+2, r12 ; 0x02 35f58: d8 a0 ldd r13, Y+32 ; 0x20 35f5a: d3 82 std Z+3, r13 ; 0x03 #ifdef LIN_ADVANCE block->final_adv_steps = final_adv_steps; 35f5c: 73 96 adiw r30, 0x13 ; 19 35f5e: ed 88 ldd r14, Y+21 ; 0x15 35f60: e0 82 st Z, r14 35f62: fe 88 ldd r15, Y+22 ; 0x16 35f64: f1 82 std Z+1, r15 ; 0x01 block->max_adv_steps = max_adv_steps; 35f66: 32 97 sbiw r30, 0x02 ; 2 35f68: 40 83 st Z, r20 35f6a: 81 83 std Z+1, r24 ; 0x01 #endif } CRITICAL_SECTION_END; 35f6c: 3f bf out 0x3f, r19 ; 63 } 35f6e: a1 96 adiw r28, 0x21 ; 33 35f70: 0f b6 in r0, 0x3f ; 63 35f72: f8 94 cli 35f74: de bf out 0x3e, r29 ; 62 35f76: 0f be out 0x3f, r0 ; 63 35f78: cd bf out 0x3d, r28 ; 61 35f7a: df 91 pop r29 35f7c: cf 91 pop r28 35f7e: 1f 91 pop r17 35f80: 0f 91 pop r16 35f82: ff 90 pop r15 35f84: ef 90 pop r14 35f86: df 90 pop r13 35f88: cf 90 pop r12 35f8a: bf 90 pop r11 35f8c: af 90 pop r10 35f8e: 9f 90 pop r9 35f90: 8f 90 pop r8 35f92: 7f 90 pop r7 35f94: 6f 90 pop r6 35f96: 5f 90 pop r5 35f98: 4f 90 pop r4 35f9a: 3f 90 pop r3 35f9c: 2f 90 pop r2 35f9e: 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; 35fa0: 1d 8a std Y+21, r1 ; 0x15 35fa2: 1e 8a std Y+22, r1 ; 0x16 35fa4: 83 cf rjmp .-250 ; 0x35eac #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; 35fa6: 2d 81 ldd r18, Y+5 ; 0x05 35fa8: 3e 81 ldd r19, Y+6 ; 0x06 35faa: 4f 81 ldd r20, Y+7 ; 0x07 35fac: 58 85 ldd r21, Y+8 ; 0x08 35fae: 82 e0 ldi r24, 0x02 ; 2 35fb0: 22 0f add r18, r18 35fb2: 33 1f adc r19, r19 35fb4: 44 1f adc r20, r20 35fb6: 55 1f adc r21, r21 35fb8: 8a 95 dec r24 35fba: d1 f7 brne .-12 ; 0x35fb0 35fbc: 89 81 ldd r24, Y+1 ; 0x01 35fbe: 9a 81 ldd r25, Y+2 ; 0x02 35fc0: ab 81 ldd r26, Y+3 ; 0x03 35fc2: bc 81 ldd r27, Y+4 ; 0x04 35fc4: 81 70 andi r24, 0x01 ; 1 35fc6: 99 27 eor r25, r25 35fc8: aa 27 eor r26, r26 35fca: bb 27 eor r27, r27 35fcc: 8d 83 std Y+5, r24 ; 0x05 35fce: 9e 83 std Y+6, r25 ; 0x06 35fd0: af 83 std Y+7, r26 ; 0x07 35fd2: b8 87 std Y+8, r27 ; 0x08 35fd4: 89 80 ldd r8, Y+1 ; 0x01 35fd6: 9a 80 ldd r9, Y+2 ; 0x02 35fd8: ab 80 ldd r10, Y+3 ; 0x03 35fda: bc 80 ldd r11, Y+4 ; 0x04 35fdc: b6 94 lsr r11 35fde: a7 94 ror r10 35fe0: 97 94 ror r9 35fe2: 87 94 ror r8 // Avoid negative numbers if (final_rate_sqr >= initial_rate_sqr) { 35fe4: cd 84 ldd r12, Y+13 ; 0x0d 35fe6: de 84 ldd r13, Y+14 ; 0x0e 35fe8: ef 84 ldd r14, Y+15 ; 0x0f 35fea: f8 88 ldd r15, Y+16 ; 0x10 35fec: 89 89 ldd r24, Y+17 ; 0x11 35fee: 9a 89 ldd r25, Y+18 ; 0x12 35ff0: ab 89 ldd r26, Y+19 ; 0x13 35ff2: bc 89 ldd r27, Y+20 ; 0x14 35ff4: 8c 15 cp r24, r12 35ff6: 9d 05 cpc r25, r13 35ff8: ae 05 cpc r26, r14 35ffa: bf 05 cpc r27, r15 35ffc: 08 f4 brcc .+2 ; 0x36000 35ffe: 6f c0 rjmp .+222 ; 0x360de // 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; 36000: 6c 01 movw r12, r24 36002: 7d 01 movw r14, r26 36004: 91 e0 ldi r25, 0x01 ; 1 36006: c9 1a sub r12, r25 36008: d1 08 sbc r13, r1 3600a: e1 08 sbc r14, r1 3600c: f1 08 sbc r15, r1 3600e: 8d 85 ldd r24, Y+13 ; 0x0d 36010: 9e 85 ldd r25, Y+14 ; 0x0e 36012: af 85 ldd r26, Y+15 ; 0x0f 36014: b8 89 ldd r27, Y+16 ; 0x10 36016: c8 1a sub r12, r24 36018: d9 0a sbc r13, r25 3601a: ea 0a sbc r14, r26 3601c: fb 0a sbc r15, r27 3601e: c7 01 movw r24, r14 36020: b6 01 movw r22, r12 36022: 62 0f add r22, r18 36024: 73 1f adc r23, r19 36026: 84 1f adc r24, r20 36028: 95 1f adc r25, r21 if (block->step_event_count.wide & 1) 3602a: cd 80 ldd r12, Y+5 ; 0x05 3602c: de 80 ldd r13, Y+6 ; 0x06 3602e: ef 80 ldd r14, Y+7 ; 0x07 36030: f8 84 ldd r15, Y+8 ; 0x08 36032: cd 28 or r12, r13 36034: ce 28 or r12, r14 36036: cf 28 or r12, r15 36038: 41 f0 breq .+16 ; 0x3604a accelerate_steps += acceleration_x2; 3603a: c9 84 ldd r12, Y+9 ; 0x09 3603c: da 84 ldd r13, Y+10 ; 0x0a 3603e: eb 84 ldd r14, Y+11 ; 0x0b 36040: fc 84 ldd r15, Y+12 ; 0x0c 36042: 6c 0d add r22, r12 36044: 7d 1d adc r23, r13 36046: 8e 1d adc r24, r14 36048: 9f 1d adc r25, r15 accelerate_steps /= acceleration_x4; 3604a: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 3604e: 75 01 movw r14, r10 36050: 64 01 movw r12, r8 36052: c2 0e add r12, r18 36054: d3 1e adc r13, r19 36056: e4 1e adc r14, r20 36058: f5 1e adc r15, r21 3605a: 29 81 ldd r18, Y+1 ; 0x01 3605c: 3a 81 ldd r19, Y+2 ; 0x02 3605e: 4b 81 ldd r20, Y+3 ; 0x03 36060: 5c 81 ldd r21, Y+4 ; 0x04 36062: 2c 15 cp r18, r12 36064: 3d 05 cpc r19, r13 36066: 4e 05 cpc r20, r14 36068: 5f 05 cpc r21, r15 3606a: 10 f4 brcc .+4 ; 0x36070 3606c: 69 01 movw r12, r18 3606e: 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) { 36070: 2b 8d ldd r18, Y+27 ; 0x1b 36072: 22 23 and r18, r18 36074: 09 f4 brne .+2 ; 0x36078 36076: 69 c0 rjmp .+210 ; 0x3614a if(!accelerate_steps || !decelerate_steps) { 36078: c1 14 cp r12, r1 3607a: d1 04 cpc r13, r1 3607c: e1 04 cpc r14, r1 3607e: f1 04 cpc r15, r1 36080: 09 f4 brne .+2 ; 0x36084 36082: 66 c0 rjmp .+204 ; 0x36150 // 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; 36084: 4d 89 ldd r20, Y+21 ; 0x15 36086: 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) { 36088: 41 14 cp r4, r1 3608a: 51 04 cpc r5, r1 3608c: 61 04 cpc r6, r1 3608e: 71 04 cpc r7, r1 36090: 09 f4 brne .+2 ; 0x36094 36092: 3d cf rjmp .-390 ; 0x35f0e // 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); 36094: a7 01 movw r20, r14 36096: 96 01 movw r18, r12 36098: 69 85 ldd r22, Y+9 ; 0x09 3609a: 7a 85 ldd r23, Y+10 ; 0x0a 3609c: 8b 85 ldd r24, Y+11 ; 0x0b 3609e: 9c 85 ldd r25, Y+12 ; 0x0c 360a0: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 360a4: 2d 85 ldd r18, Y+13 ; 0x0d 360a6: 3e 85 ldd r19, Y+14 ; 0x0e 360a8: 4f 85 ldd r20, Y+15 ; 0x0f 360aa: 58 89 ldd r21, Y+16 ; 0x10 360ac: 62 0f add r22, r18 360ae: 73 1f adc r23, r19 360b0: 84 1f adc r24, r20 360b2: 95 1f adc r25, r21 360b4: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 360b8: 0f 94 06 e1 call 0x3c20c ; 0x3c20c max_adv_steps = max_rate * block->adv_comp; 360bc: f1 01 movw r30, r2 360be: ec 5a subi r30, 0xAC ; 172 360c0: ff 4f sbci r31, 0xFF ; 255 360c2: 20 81 ld r18, Z 360c4: 31 81 ldd r19, Z+1 ; 0x01 360c6: 42 81 ldd r20, Z+2 ; 0x02 360c8: 53 81 ldd r21, Z+3 ; 0x03 360ca: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 360ce: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 360d2: 46 2f mov r20, r22 360d4: 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; 360d6: 41 2c mov r4, r1 360d8: 51 2c mov r5, r1 360da: 32 01 movw r6, r4 360dc: 18 cf rjmp .-464 ; 0x35f0e 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; 360de: 6d 85 ldd r22, Y+13 ; 0x0d 360e0: 7e 85 ldd r23, Y+14 ; 0x0e 360e2: 8f 85 ldd r24, Y+15 ; 0x0f 360e4: 98 89 ldd r25, Y+16 ; 0x10 360e6: c9 88 ldd r12, Y+17 ; 0x11 360e8: da 88 ldd r13, Y+18 ; 0x12 360ea: eb 88 ldd r14, Y+19 ; 0x13 360ec: fc 88 ldd r15, Y+20 ; 0x14 360ee: 6c 19 sub r22, r12 360f0: 7d 09 sbc r23, r13 360f2: 8e 09 sbc r24, r14 360f4: 9f 09 sbc r25, r15 if (block->step_event_count.wide & 1) 360f6: cd 80 ldd r12, Y+5 ; 0x05 360f8: de 80 ldd r13, Y+6 ; 0x06 360fa: ef 80 ldd r14, Y+7 ; 0x07 360fc: f8 84 ldd r15, Y+8 ; 0x08 360fe: cd 28 or r12, r13 36100: ce 28 or r12, r14 36102: cf 28 or r12, r15 36104: 41 f0 breq .+16 ; 0x36116 decelerate_steps += acceleration_x2; 36106: c9 84 ldd r12, Y+9 ; 0x09 36108: da 84 ldd r13, Y+10 ; 0x0a 3610a: eb 84 ldd r14, Y+11 ; 0x0b 3610c: fc 84 ldd r15, Y+12 ; 0x0c 3610e: 6c 0d add r22, r12 36110: 7d 1d adc r23, r13 36112: 8e 1d adc r24, r14 36114: 9f 1d adc r25, r15 decelerate_steps /= acceleration_x4; 36116: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> decelerate_steps += (block->step_event_count.wide >> 1); 3611a: 82 0e add r8, r18 3611c: 93 1e adc r9, r19 3611e: a4 1e adc r10, r20 36120: b5 1e adc r11, r21 36122: 49 80 ldd r4, Y+1 ; 0x01 36124: 5a 80 ldd r5, Y+2 ; 0x02 36126: 6b 80 ldd r6, Y+3 ; 0x03 36128: 7c 80 ldd r7, Y+4 ; 0x04 3612a: 84 14 cp r8, r4 3612c: 95 04 cpc r9, r5 3612e: a6 04 cpc r10, r6 36130: b7 04 cpc r11, r7 36132: 10 f4 brcc .+4 ; 0x36138 36134: 24 01 movw r4, r8 36136: 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; 36138: c9 80 ldd r12, Y+1 ; 0x01 3613a: da 80 ldd r13, Y+2 ; 0x02 3613c: eb 80 ldd r14, Y+3 ; 0x03 3613e: fc 80 ldd r15, Y+4 ; 0x04 36140: c4 18 sub r12, r4 36142: d5 08 sbc r13, r5 36144: e6 08 sbc r14, r6 36146: f7 08 sbc r15, r7 36148: 93 cf rjmp .-218 ; 0x36070 // 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; 3614a: 40 e0 ldi r20, 0x00 ; 0 3614c: 80 e0 ldi r24, 0x00 ; 0 3614e: c3 cf rjmp .-122 ; 0x360d6 #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; 36150: 4d 89 ldd r20, Y+21 ; 0x15 36152: 8e 89 ldd r24, Y+22 ; 0x16 36154: c0 cf rjmp .-128 ; 0x360d6 00036156 : while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; } static void verifySpace() { if (getch() != CRC_EOP) { 36156: 0f 94 33 ae call 0x35c66 ; 0x35c66 3615a: 80 32 cpi r24, 0x20 ; 32 3615c: 29 f0 breq .+10 ; 0x36168 putch(STK_FAILED); 3615e: 81 e1 ldi r24, 0x11 ; 17 36160: 0f 94 2c ae call 0x35c58 ; 0x35c58 softReset(); 36164: 0e 94 e4 66 call 0xcdc8 ; 0xcdc8 } putch(STK_INSYNC); 36168: 84 e1 ldi r24, 0x14 ; 20 3616a: 0d 94 2c ae jmp 0x35c58 ; 0x35c58 0003616e : } static void getNch(uint8_t count) { 3616e: cf 93 push r28 36170: c8 2f mov r28, r24 do getch(); while (--count); 36172: 0f 94 33 ae call 0x35c66 ; 0x35c66 36176: c1 50 subi r28, 0x01 ; 1 36178: e1 f7 brne .-8 ; 0x36172 verifySpace(); } 3617a: cf 91 pop r28 putch(STK_INSYNC); } static void getNch(uint8_t count) { do getch(); while (--count); verifySpace(); 3617c: 0d 94 ab b0 jmp 0x36156 ; 0x36156 00036180 : /// @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) { 36180: 0f 93 push r16 36182: 1f 93 push r17 36184: cf 93 push r28 36186: df 93 push r29 36188: eb 01 movw r28, r22 3618a: 14 2f mov r17, r20 3618c: 05 2f mov r16, r21 lcd_putc(chr); 3618e: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_puts_P(str); 36192: ce 01 movw r24, r28 36194: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 lcd_putc(':'); 36198: 8a e3 ldi r24, 0x3A ; 58 3619a: 0e 94 67 6e call 0xdcce ; 0xdcce 3619e: ce 01 movw r24, r28 361a0: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> // Padding to compensate variable string length const uint8_t len = strlen_P(str); lcd_space((LCD_WIDTH - 4) - (2 + len)); 361a4: 9e e0 ldi r25, 0x0E ; 14 361a6: 98 1b sub r25, r24 361a8: 89 2f mov r24, r25 361aa: 0e 94 6e 6e call 0xdcdc ; 0xdcdc // Right adjusted value lcd_printf_P(PSTR("%4d"), val); 361ae: 0f 93 push r16 361b0: 1f 93 push r17 361b2: 8f e0 ldi r24, 0x0F ; 15 361b4: 9b ea ldi r25, 0xAB ; 171 361b6: 9f 93 push r25 361b8: 8f 93 push r24 361ba: 0e 94 51 6e call 0xdca2 ; 0xdca2 361be: 0f 90 pop r0 361c0: 0f 90 pop r0 361c2: 0f 90 pop r0 361c4: 0f 90 pop r0 } 361c6: df 91 pop r29 361c8: cf 91 pop r28 361ca: 1f 91 pop r17 361cc: 0f 91 pop r16 361ce: 08 95 ret 000361d0 : // 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) { 361d0: 2f 92 push r2 361d2: 3f 92 push r3 361d4: 4f 92 push r4 361d6: 5f 92 push r5 361d8: 6f 92 push r6 361da: 7f 92 push r7 361dc: 8f 92 push r8 361de: 9f 92 push r9 361e0: af 92 push r10 361e2: bf 92 push r11 361e4: cf 92 push r12 361e6: df 92 push r13 361e8: ef 92 push r14 361ea: ff 92 push r15 361ec: 0f 93 push r16 361ee: 1f 93 push r17 361f0: cf 93 push r28 361f2: df 93 push r29 361f4: cd b7 in r28, 0x3d ; 61 361f6: de b7 in r29, 0x3e ; 62 361f8: c5 58 subi r28, 0x85 ; 133 361fa: d1 09 sbc r29, r1 361fc: 0f b6 in r0, 0x3f ; 63 361fe: f8 94 cli 36200: de bf out 0x3e, r29 ; 62 36202: 0f be out 0x3f, r0 ; 63 36204: cd bf out 0x3d, r28 ; 61 36206: 69 a3 std Y+33, r22 ; 0x21 36208: 7a a3 std Y+34, r23 ; 0x22 3620a: 8b a3 std Y+35, r24 ; 0x23 3620c: 9c a3 std Y+36, r25 ; 0x24 3620e: 2d a3 std Y+37, r18 ; 0x25 36210: 3e a3 std Y+38, r19 ; 0x26 36212: 4f a3 std Y+39, r20 ; 0x27 36214: 58 a7 std Y+40, r21 ; 0x28 36216: a8 96 adiw r28, 0x28 ; 40 36218: ec ae std Y+60, r14 ; 0x3c 3621a: fd ae std Y+61, r15 ; 0x3d 3621c: 0e af std Y+62, r16 ; 0x3e 3621e: 1f af std Y+63, r17 ; 0x3f 36220: a8 97 sbiw r28, 0x28 ; 40 36222: aa 96 adiw r28, 0x2a ; 42 36224: df ae std Y+63, r13 ; 0x3f 36226: ce ae std Y+62, r12 ; 0x3e 36228: aa 97 sbiw r28, 0x2a ; 42 3622a: 89 aa std Y+49, r8 ; 0x31 3622c: 99 ae std Y+57, r9 ; 0x39 3622e: ad ae std Y+61, r10 ; 0x3d 36230: bd aa std Y+53, r11 ; 0x35 36232: c5 56 subi r28, 0x65 ; 101 36234: df 4f sbci r29, 0xFF ; 255 36236: 08 81 ld r16, Y 36238: 19 81 ldd r17, Y+1 ; 0x01 3623a: cb 59 subi r28, 0x9B ; 155 3623c: 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); 3623e: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 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) 36242: 8f 5f subi r24, 0xFF ; 255 36244: a1 96 adiw r28, 0x21 ; 33 36246: 8f af std Y+63, r24 ; 0x3f 36248: a1 97 sbiw r28, 0x21 ; 33 3624a: 80 31 cpi r24, 0x10 ; 16 3624c: 19 f4 brne .+6 ; 0x36254 block_index = 0; 3624e: a1 96 adiw r28, 0x21 ; 33 36250: 1f ae std Y+63, r1 ; 0x3f 36252: a1 97 sbiw r28, 0x21 ; 33 // 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) { 36254: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 36258: a1 96 adiw r28, 0x21 ; 33 3625a: 2f ad ldd r18, Y+63 ; 0x3f 3625c: a1 97 sbiw r28, 0x21 ; 33 3625e: 82 13 cpse r24, r18 36260: 0f c0 rjmp .+30 ; 0x36280 do { manage_heater(); 36262: 0f 94 34 39 call 0x27268 ; 0x27268 // Vojtech: Don't disable motors inside the planner! manage_inactivity(false); 36266: 80 e0 ldi r24, 0x00 ; 0 36268: 0e 94 4f 8a call 0x1149e ; 0x1149e lcd_update(0); 3626c: 80 e0 ldi r24, 0x00 ; 0 3626e: 0e 94 3f 6e call 0xdc7e ; 0xdc7e } while (block_buffer_tail == next_buffer_head); 36272: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 36276: a1 96 adiw r28, 0x21 ; 33 36278: 3f ad ldd r19, Y+63 ; 0x3f 3627a: a1 97 sbiw r28, 0x21 ; 33 3627c: 83 17 cp r24, r19 3627e: 89 f3 breq .-30 ; 0x36262 } #ifdef PLANNER_DIAGNOSTICS planner_update_queue_min_counter(); #endif /* PLANNER_DIAGNOSTICS */ if(planner_aborted) { 36280: 40 91 ab 0d lds r20, 0x0DAB ; 0x800dab 36284: a2 96 adiw r28, 0x22 ; 34 36286: 4f af std Y+63, r20 ; 0x3f 36288: a2 97 sbiw r28, 0x22 ; 34 3628a: 44 23 and r20, r20 3628c: 11 f1 breq .+68 ; 0x362d2 // avoid planning the block early if aborted SERIAL_ECHO_START; 3628e: 82 ef ldi r24, 0xF2 ; 242 36290: 9a ea ldi r25, 0xAA ; 170 36292: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n("Move aborted")); 36296: 86 ed ldi r24, 0xD6 ; 214 36298: 90 e7 ldi r25, 0x70 ; 112 3629a: 0e 94 13 79 call 0xf226 ; 0xf226 // 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(); } 3629e: cb 57 subi r28, 0x7B ; 123 362a0: df 4f sbci r29, 0xFF ; 255 362a2: 0f b6 in r0, 0x3f ; 63 362a4: f8 94 cli 362a6: de bf out 0x3e, r29 ; 62 362a8: 0f be out 0x3f, r0 ; 63 362aa: cd bf out 0x3d, r28 ; 61 362ac: df 91 pop r29 362ae: cf 91 pop r28 362b0: 1f 91 pop r17 362b2: 0f 91 pop r16 362b4: ff 90 pop r15 362b6: ef 90 pop r14 362b8: df 90 pop r13 362ba: cf 90 pop r12 362bc: bf 90 pop r11 362be: af 90 pop r10 362c0: 9f 90 pop r9 362c2: 8f 90 pop r8 362c4: 7f 90 pop r7 362c6: 6f 90 pop r6 362c8: 5f 90 pop r5 362ca: 4f 90 pop r4 362cc: 3f 90 pop r3 362ce: 2f 90 pop r2 362d0: 08 95 ret SERIAL_ECHOLNRPGM(_n("Move aborted")); return; } // Prepare to set up new block block_t *block = &block_buffer[block_buffer_head]; 362d2: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 362d6: 29 2e mov r2, r25 362d8: 31 2c mov r3, r1 362da: 8e e6 ldi r24, 0x6E ; 110 362dc: 98 9f mul r25, r24 362de: d0 01 movw r26, r0 362e0: 11 24 eor r1, r1 362e2: a4 96 adiw r28, 0x24 ; 36 362e4: bf af std Y+63, r27 ; 0x3f 362e6: ae af std Y+62, r26 ; 0x3e 362e8: a4 97 sbiw r28, 0x24 ; 36 // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) block->busy = false; 362ea: cd 01 movw r24, r26 362ec: 8c 53 subi r24, 0x3C ; 60 362ee: 99 4f sbci r25, 0xF9 ; 249 362f0: fc 01 movw r30, r24 362f2: e9 5b subi r30, 0xB9 ; 185 362f4: ff 4f sbci r31, 0xFF ; 255 362f6: 10 82 st Z, r1 // Set sdlen for calculating sd position block->sdlen = 0; 362f8: 84 59 subi r24, 0x94 ; 148 362fa: 9f 4f sbci r25, 0xFF ; 255 362fc: fc 01 movw r30, r24 362fe: 11 82 std Z+1, r1 ; 0x01 36300: 10 82 st Z, r1 // Save original start position of the move if (gcode_start_position) 36302: 01 15 cp r16, r1 36304: 11 05 cpc r17, r1 36306: 11 f4 brne .+4 ; 0x3630c 36308: 0d 94 dc bb jmp 0x377b8 ; 0x377b8 memcpy(block->gcode_start_position, gcode_start_position, sizeof(block_t::gcode_start_position)); 3630c: 80 e1 ldi r24, 0x10 ; 16 3630e: f8 01 movw r30, r16 36310: a4 5e subi r26, 0xE4 ; 228 36312: b8 4f sbci r27, 0xF8 ; 248 else memcpy(block->gcode_start_position, current_position, sizeof(block_t::gcode_start_position)); 36314: 01 90 ld r0, Z+ 36316: 0d 92 st X+, r0 36318: 8a 95 dec r24 3631a: e1 f7 brne .-8 ; 0x36314 // Save the index of this segment (when a single G0/1/2/3 command plans multiple segments) block->segment_idx = segment_idx; 3631c: 8e e6 ldi r24, 0x6E ; 110 3631e: 82 9d mul r24, r2 36320: 80 01 movw r16, r0 36322: 83 9d mul r24, r3 36324: 10 0d add r17, r0 36326: 11 24 eor r1, r1 36328: 0c 53 subi r16, 0x3C ; 60 3632a: 19 4f sbci r17, 0xF9 ; 249 3632c: f8 01 movw r30, r16 3632e: e8 59 subi r30, 0x98 ; 152 36330: ff 4f sbci r31, 0xFF ; 255 36332: c3 56 subi r28, 0x63 ; 99 36334: df 4f sbci r29, 0xFF ; 255 36336: 88 81 ld r24, Y 36338: 99 81 ldd r25, Y+1 ; 0x01 3633a: cd 59 subi r28, 0x9D ; 157 3633c: d0 40 sbci r29, 0x00 ; 0 3633e: 91 83 std Z+1, r25 ; 0x01 36340: 80 83 st Z, r24 // Save the global feedrate at scheduling time block->gcode_feedrate = feedrate; 36342: 06 59 subi r16, 0x96 ; 150 36344: 1f 4f sbci r17, 0xFF ; 255 36346: 60 91 b8 02 lds r22, 0x02B8 ; 0x8002b8 3634a: 70 91 b9 02 lds r23, 0x02B9 ; 0x8002b9 3634e: 80 91 ba 02 lds r24, 0x02BA ; 0x8002ba 36352: 90 91 bb 02 lds r25, 0x02BB ; 0x8002bb 36356: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 3635a: d8 01 movw r26, r16 3635c: 6d 93 st X+, r22 3635e: 7c 93 st X, r23 // Reset the starting E position when requested if (plan_reset_next_e_queue) 36360: 80 91 b7 04 lds r24, 0x04B7 ; 0x8004b7 <_ZL23plan_reset_next_e_queue.lto_priv.488> 36364: 88 23 and r24, r24 36366: a9 f0 breq .+42 ; 0x36392 { position[E_AXIS] = 0; 36368: 10 92 ae 06 sts 0x06AE, r1 ; 0x8006ae 3636c: 10 92 af 06 sts 0x06AF, r1 ; 0x8006af 36370: 10 92 b0 06 sts 0x06B0, r1 ; 0x8006b0 36374: 10 92 b1 06 sts 0x06B1, r1 ; 0x8006b1 #ifdef LIN_ADVANCE position_float[E_AXIS] = 0; 36378: 10 92 d8 04 sts 0x04D8, r1 ; 0x8004d8 3637c: 10 92 d9 04 sts 0x04D9, r1 ; 0x8004d9 36380: 10 92 da 04 sts 0x04DA, r1 ; 0x8004da 36384: 10 92 db 04 sts 0x04DB, r1 ; 0x8004db #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; 36388: 10 92 b7 04 sts 0x04B7, r1 ; 0x8004b7 <_ZL23plan_reset_next_e_queue.lto_priv.488> plan_reset_next_e_sched = true; 3638c: 81 e0 ldi r24, 0x01 ; 1 3638e: 80 93 b6 04 sts 0x04B6, r24 ; 0x8004b6 <_ZL23plan_reset_next_e_sched.lto_priv.489> } // Apply the machine correction matrix. world2machine(x, y); 36392: be 01 movw r22, r28 36394: 6b 5d subi r22, 0xDB ; 219 36396: 7f 4f sbci r23, 0xFF ; 255 36398: ce 01 movw r24, r28 3639a: 81 96 adiw r24, 0x21 ; 33 3639c: 0e 94 9a 69 call 0xd334 ; 0xd334 // 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]); 363a0: c9 a0 ldd r12, Y+33 ; 0x21 363a2: da a0 ldd r13, Y+34 ; 0x22 363a4: eb a0 ldd r14, Y+35 ; 0x23 363a6: fc a0 ldd r15, Y+36 ; 0x24 363a8: 20 91 c1 0d lds r18, 0x0DC1 ; 0x800dc1 363ac: 30 91 c2 0d lds r19, 0x0DC2 ; 0x800dc2 363b0: 40 91 c3 0d lds r20, 0x0DC3 ; 0x800dc3 363b4: 50 91 c4 0d lds r21, 0x0DC4 ; 0x800dc4 363b8: c7 01 movw r24, r14 363ba: b6 01 movw r22, r12 363bc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 363c0: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 363c4: c2 58 subi r28, 0x82 ; 130 363c6: df 4f sbci r29, 0xFF ; 255 363c8: 68 83 st Y, r22 363ca: 79 83 std Y+1, r23 ; 0x01 363cc: 8a 83 std Y+2, r24 ; 0x02 363ce: 9b 83 std Y+3, r25 ; 0x03 363d0: ce 57 subi r28, 0x7E ; 126 363d2: d0 40 sbci r29, 0x00 ; 0 target[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); 363d4: 8d a0 ldd r8, Y+37 ; 0x25 363d6: 9e a0 ldd r9, Y+38 ; 0x26 363d8: af a0 ldd r10, Y+39 ; 0x27 363da: b8 a4 ldd r11, Y+40 ; 0x28 363dc: 20 91 c5 0d lds r18, 0x0DC5 ; 0x800dc5 363e0: 30 91 c6 0d lds r19, 0x0DC6 ; 0x800dc6 363e4: 40 91 c7 0d lds r20, 0x0DC7 ; 0x800dc7 363e8: 50 91 c8 0d lds r21, 0x0DC8 ; 0x800dc8 363ec: c5 01 movw r24, r10 363ee: b4 01 movw r22, r8 363f0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 363f4: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 363f8: ce 57 subi r28, 0x7E ; 126 363fa: df 4f sbci r29, 0xFF ; 255 363fc: 68 83 st Y, r22 363fe: 79 83 std Y+1, r23 ; 0x01 36400: 8a 83 std Y+2, r24 ; 0x02 36402: 9b 83 std Y+3, r25 ; 0x03 36404: c2 58 subi r28, 0x82 ; 130 36406: d0 40 sbci r29, 0x00 ; 0 #ifdef MESH_BED_LEVELING if (mbl.active){ 36408: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 3640c: 88 23 and r24, r24 3640e: 11 f4 brne .+4 ; 0x36414 36410: 0d 94 e3 bb jmp 0x377c6 ; 0x377c6 target[Z_AXIS] = lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]); 36414: a5 01 movw r20, r10 36416: 94 01 movw r18, r8 36418: c7 01 movw r24, r14 3641a: b6 01 movw r22, r12 3641c: 0f 94 a5 a1 call 0x3434a ; 0x3434a 36420: a8 96 adiw r28, 0x28 ; 40 36422: 2c ad ldd r18, Y+60 ; 0x3c 36424: 3d ad ldd r19, Y+61 ; 0x3d 36426: 4e ad ldd r20, Y+62 ; 0x3e 36428: 5f ad ldd r21, Y+63 ; 0x3f 3642a: a8 97 sbiw r28, 0x28 ; 40 3642c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 36430: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 36434: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 36438: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 3643c: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc }else{ target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]); 36440: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36444: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 36448: e6 96 adiw r28, 0x36 ; 54 3644a: 6c af std Y+60, r22 ; 0x3c 3644c: 7d af std Y+61, r23 ; 0x3d 3644e: 8e af std Y+62, r24 ; 0x3e 36450: 9f af std Y+63, r25 ; 0x3f 36452: e6 97 sbiw r28, 0x36 ; 54 } #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]); 36454: aa 96 adiw r28, 0x2a ; 42 36456: ee ad ldd r30, Y+62 ; 0x3e 36458: ff ad ldd r31, Y+63 ; 0x3f 3645a: aa 97 sbiw r28, 0x2a ; 42 3645c: 80 80 ld r8, Z 3645e: 91 80 ldd r9, Z+1 ; 0x01 36460: a2 80 ldd r10, Z+2 ; 0x02 36462: b3 80 ldd r11, Z+3 ; 0x03 36464: 20 91 cd 0d lds r18, 0x0DCD ; 0x800dcd 36468: 30 91 ce 0d lds r19, 0x0DCE ; 0x800dce 3646c: 40 91 cf 0d lds r20, 0x0DCF ; 0x800dcf 36470: 50 91 d0 0d lds r21, 0x0DD0 ; 0x800dd0 36474: c5 01 movw r24, r10 36476: b4 01 movw r22, r8 36478: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3647c: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 36480: ae 96 adiw r28, 0x2e ; 46 36482: 6c af std Y+60, r22 ; 0x3c 36484: 7d af std Y+61, r23 ; 0x3d 36486: 8e af std Y+62, r24 ; 0x3e 36488: 9f af std Y+63, r25 ; 0x3f 3648a: ae 97 sbiw r28, 0x2e ; 46 // 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]; 3648c: 80 91 ae 06 lds r24, 0x06AE ; 0x8006ae 36490: 90 91 af 06 lds r25, 0x06AF ; 0x8006af 36494: a0 91 b0 06 lds r26, 0x06B0 ; 0x8006b0 36498: b0 91 b1 06 lds r27, 0x06B1 ; 0x8006b1 3649c: ae 96 adiw r28, 0x2e ; 46 3649e: 4c ac ldd r4, Y+60 ; 0x3c 364a0: 5d ac ldd r5, Y+61 ; 0x3d 364a2: 6e ac ldd r6, Y+62 ; 0x3e 364a4: 7f ac ldd r7, Y+63 ; 0x3f 364a6: ae 97 sbiw r28, 0x2e ; 46 364a8: 48 1a sub r4, r24 364aa: 59 0a sbc r5, r25 364ac: 6a 0a sbc r6, r26 364ae: 7b 0a sbc r7, r27 int32_t dx = target[X_AXIS] - position[X_AXIS]; 364b0: 80 91 a2 06 lds r24, 0x06A2 ; 0x8006a2 364b4: 90 91 a3 06 lds r25, 0x06A3 ; 0x8006a3 364b8: a0 91 a4 06 lds r26, 0x06A4 ; 0x8006a4 364bc: b0 91 a5 06 lds r27, 0x06A5 ; 0x8006a5 364c0: c2 58 subi r28, 0x82 ; 130 364c2: df 4f sbci r29, 0xFF ; 255 364c4: c8 80 ld r12, Y 364c6: d9 80 ldd r13, Y+1 ; 0x01 364c8: ea 80 ldd r14, Y+2 ; 0x02 364ca: fb 80 ldd r15, Y+3 ; 0x03 364cc: ce 57 subi r28, 0x7E ; 126 364ce: d0 40 sbci r29, 0x00 ; 0 364d0: c8 1a sub r12, r24 364d2: d9 0a sbc r13, r25 364d4: ea 0a sbc r14, r26 364d6: fb 0a sbc r15, r27 int32_t dy = target[Y_AXIS] - position[Y_AXIS]; 364d8: 80 91 a6 06 lds r24, 0x06A6 ; 0x8006a6 364dc: 90 91 a7 06 lds r25, 0x06A7 ; 0x8006a7 364e0: a0 91 a8 06 lds r26, 0x06A8 ; 0x8006a8 364e4: b0 91 a9 06 lds r27, 0x06A9 ; 0x8006a9 364e8: ce 57 subi r28, 0x7E ; 126 364ea: df 4f sbci r29, 0xFF ; 255 364ec: 28 81 ld r18, Y 364ee: 39 81 ldd r19, Y+1 ; 0x01 364f0: 4a 81 ldd r20, Y+2 ; 0x02 364f2: 5b 81 ldd r21, Y+3 ; 0x03 364f4: c2 58 subi r28, 0x82 ; 130 364f6: d0 40 sbci r29, 0x00 ; 0 364f8: 28 1b sub r18, r24 364fa: 39 0b sbc r19, r25 364fc: 4a 0b sbc r20, r26 364fe: 5b 0b sbc r21, r27 36500: 29 a7 std Y+41, r18 ; 0x29 36502: 3a a7 std Y+42, r19 ; 0x2a 36504: 4b a7 std Y+43, r20 ; 0x2b 36506: 5c a7 std Y+44, r21 ; 0x2c int32_t dz = target[Z_AXIS] - position[Z_AXIS]; 36508: 80 91 aa 06 lds r24, 0x06AA ; 0x8006aa 3650c: 90 91 ab 06 lds r25, 0x06AB ; 0x8006ab 36510: a0 91 ac 06 lds r26, 0x06AC ; 0x8006ac 36514: b0 91 ad 06 lds r27, 0x06AD ; 0x8006ad 36518: e6 96 adiw r28, 0x36 ; 54 3651a: 2c ad ldd r18, Y+60 ; 0x3c 3651c: 3d ad ldd r19, Y+61 ; 0x3d 3651e: 4e ad ldd r20, Y+62 ; 0x3e 36520: 5f ad ldd r21, Y+63 ; 0x3f 36522: e6 97 sbiw r28, 0x36 ; 54 36524: 28 1b sub r18, r24 36526: 39 0b sbc r19, r25 36528: 4a 0b sbc r20, r26 3652a: 5b 0b sbc r21, r27 3652c: 2d a7 std Y+45, r18 ; 0x2d 3652e: 3e a7 std Y+46, r19 ; 0x2e 36530: 4f a7 std Y+47, r20 ; 0x2f 36532: 58 ab std Y+48, r21 ; 0x30 #ifdef PREVENT_DANGEROUS_EXTRUDE if(de) 36534: 41 14 cp r4, r1 36536: 51 04 cpc r5, r1 36538: 61 04 cpc r6, r1 3653a: 71 04 cpc r7, r1 3653c: 09 f4 brne .+2 ; 0x36540 3653e: 80 c0 rjmp .+256 ; 0x36640 { if((int)degHotend(active_extruder) 36544: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 36548: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 3654c: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 36550: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 36554: 20 91 6b 02 lds r18, 0x026B ; 0x80026b 36558: 30 91 6c 02 lds r19, 0x026C ; 0x80026c 3655c: 62 17 cp r22, r18 3655e: 73 07 cpc r23, r19 36560: 0c f5 brge .+66 ; 0x365a4 { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part 36562: ae 96 adiw r28, 0x2e ; 46 36564: 8c ad ldd r24, Y+60 ; 0x3c 36566: 9d ad ldd r25, Y+61 ; 0x3d 36568: ae ad ldd r26, Y+62 ; 0x3e 3656a: bf ad ldd r27, Y+63 ; 0x3f 3656c: ae 97 sbiw r28, 0x2e ; 46 3656e: 80 93 ae 06 sts 0x06AE, r24 ; 0x8006ae 36572: 90 93 af 06 sts 0x06AF, r25 ; 0x8006af 36576: a0 93 b0 06 sts 0x06B0, r26 ; 0x8006b0 3657a: b0 93 b1 06 sts 0x06B1, r27 ; 0x8006b1 #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 3657e: 80 92 d8 04 sts 0x04D8, r8 ; 0x8004d8 36582: 90 92 d9 04 sts 0x04D9, r9 ; 0x8004d9 36586: a0 92 da 04 sts 0x04DA, r10 ; 0x8004da 3658a: b0 92 db 04 sts 0x04DB, r11 ; 0x8004db #endif de = 0; // no difference SERIAL_ECHO_START; 3658e: 82 ef ldi r24, 0xF2 ; 242 36590: 9a ea ldi r25, 0xAA ; 170 36592: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP 36596: 8c eb ldi r24, 0xBC ; 188 36598: 90 e7 ldi r25, 0x70 ; 112 3659a: 0e 94 13 79 call 0xf226 ; 0xf226 { 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 3659e: 41 2c mov r4, r1 365a0: 51 2c mov r5, r1 365a2: 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) 365a4: c3 01 movw r24, r6 365a6: b2 01 movw r22, r4 365a8: 77 fe sbrs r7, 7 365aa: 07 c0 rjmp .+14 ; 0x365ba 365ac: 66 27 eor r22, r22 365ae: 77 27 eor r23, r23 365b0: cb 01 movw r24, r22 365b2: 64 19 sub r22, r4 365b4: 75 09 sbc r23, r5 365b6: 86 09 sbc r24, r6 365b8: 97 09 sbc r25, r7 365ba: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 365be: 4b 01 movw r8, r22 365c0: 5c 01 movw r10, r24 365c2: 20 e0 ldi r18, 0x00 ; 0 365c4: 30 ec ldi r19, 0xC0 ; 192 365c6: 4b ee ldi r20, 0xEB ; 235 365c8: 53 e4 ldi r21, 0x43 ; 67 365ca: 60 91 cd 0d lds r22, 0x0DCD ; 0x800dcd 365ce: 70 91 ce 0d lds r23, 0x0DCE ; 0x800dce 365d2: 80 91 cf 0d lds r24, 0x0DCF ; 0x800dcf 365d6: 90 91 d0 0d lds r25, 0x0DD0 ; 0x800dd0 365da: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 365de: 9b 01 movw r18, r22 365e0: ac 01 movw r20, r24 365e2: c5 01 movw r24, r10 365e4: b4 01 movw r22, r8 365e6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 365ea: 18 16 cp r1, r24 365ec: 4c f5 brge .+82 ; 0x36640 { position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part 365ee: ae 96 adiw r28, 0x2e ; 46 365f0: 2c ad ldd r18, Y+60 ; 0x3c 365f2: 3d ad ldd r19, Y+61 ; 0x3d 365f4: 4e ad ldd r20, Y+62 ; 0x3e 365f6: 5f ad ldd r21, Y+63 ; 0x3f 365f8: ae 97 sbiw r28, 0x2e ; 46 365fa: 20 93 ae 06 sts 0x06AE, r18 ; 0x8006ae 365fe: 30 93 af 06 sts 0x06AF, r19 ; 0x8006af 36602: 40 93 b0 06 sts 0x06B0, r20 ; 0x8006b0 36606: 50 93 b1 06 sts 0x06B1, r21 ; 0x8006b1 #ifdef LIN_ADVANCE position_float[E_AXIS] = e; 3660a: aa 96 adiw r28, 0x2a ; 42 3660c: ee ad ldd r30, Y+62 ; 0x3e 3660e: ff ad ldd r31, Y+63 ; 0x3f 36610: aa 97 sbiw r28, 0x2a ; 42 36612: 80 81 ld r24, Z 36614: 91 81 ldd r25, Z+1 ; 0x01 36616: a2 81 ldd r26, Z+2 ; 0x02 36618: b3 81 ldd r27, Z+3 ; 0x03 3661a: 80 93 d8 04 sts 0x04D8, r24 ; 0x8004d8 3661e: 90 93 d9 04 sts 0x04D9, r25 ; 0x8004d9 36622: a0 93 da 04 sts 0x04DA, r26 ; 0x8004da 36626: b0 93 db 04 sts 0x04DB, r27 ; 0x8004db #endif de = 0; // no difference SERIAL_ECHO_START; 3662a: 82 ef ldi r24, 0xF2 ; 242 3662c: 9a ea ldi r25, 0xAA ; 170 3662e: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP 36632: 8e e9 ldi r24, 0x9E ; 158 36634: 90 e7 ldi r25, 0x70 ; 112 36636: 0e 94 13 79 call 0xf226 ; 0xf226 { 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 3663a: 41 2c mov r4, r1 3663c: 51 2c mov r5, r1 3663e: 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); 36640: 8e e6 ldi r24, 0x6E ; 110 36642: 82 9d mul r24, r2 36644: f0 01 movw r30, r0 36646: 83 9d mul r24, r3 36648: f0 0d add r31, r0 3664a: 11 24 eor r1, r1 3664c: ec 53 subi r30, 0x3C ; 60 3664e: f9 4f sbci r31, 0xF9 ; 249 36650: d7 01 movw r26, r14 36652: c6 01 movw r24, r12 36654: f7 fe sbrs r15, 7 36656: 07 c0 rjmp .+14 ; 0x36666 36658: 88 27 eor r24, r24 3665a: 99 27 eor r25, r25 3665c: dc 01 movw r26, r24 3665e: 8c 19 sub r24, r12 36660: 9d 09 sbc r25, r13 36662: ae 09 sbc r26, r14 36664: bf 09 sbc r27, r15 36666: 80 83 st Z, r24 36668: 91 83 std Z+1, r25 ; 0x01 3666a: a2 83 std Z+2, r26 ; 0x02 3666c: b3 83 std Z+3, r27 ; 0x03 block->steps[Y_AXIS].wide = labs(dy); 3666e: 8e e6 ldi r24, 0x6E ; 110 36670: 82 9d mul r24, r2 36672: f0 01 movw r30, r0 36674: 83 9d mul r24, r3 36676: f0 0d add r31, r0 36678: 11 24 eor r1, r1 3667a: ec 53 subi r30, 0x3C ; 60 3667c: f9 4f sbci r31, 0xF9 ; 249 3667e: 89 a5 ldd r24, Y+41 ; 0x29 36680: 9a a5 ldd r25, Y+42 ; 0x2a 36682: ab a5 ldd r26, Y+43 ; 0x2b 36684: bc a5 ldd r27, Y+44 ; 0x2c 36686: b7 ff sbrs r27, 7 36688: 07 c0 rjmp .+14 ; 0x36698 3668a: b0 95 com r27 3668c: a0 95 com r26 3668e: 90 95 com r25 36690: 81 95 neg r24 36692: 9f 4f sbci r25, 0xFF ; 255 36694: af 4f sbci r26, 0xFF ; 255 36696: bf 4f sbci r27, 0xFF ; 255 36698: 84 83 std Z+4, r24 ; 0x04 3669a: 95 83 std Z+5, r25 ; 0x05 3669c: a6 83 std Z+6, r26 ; 0x06 3669e: 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); 366a0: 8e e6 ldi r24, 0x6E ; 110 366a2: 82 9d mul r24, r2 366a4: f0 01 movw r30, r0 366a6: 83 9d mul r24, r3 366a8: f0 0d add r31, r0 366aa: 11 24 eor r1, r1 366ac: ec 53 subi r30, 0x3C ; 60 366ae: f9 4f sbci r31, 0xF9 ; 249 366b0: 8d a5 ldd r24, Y+45 ; 0x2d 366b2: 9e a5 ldd r25, Y+46 ; 0x2e 366b4: af a5 ldd r26, Y+47 ; 0x2f 366b6: b8 a9 ldd r27, Y+48 ; 0x30 366b8: b7 ff sbrs r27, 7 366ba: 07 c0 rjmp .+14 ; 0x366ca 366bc: b0 95 com r27 366be: a0 95 com r26 366c0: 90 95 com r25 366c2: 81 95 neg r24 366c4: 9f 4f sbci r25, 0xFF ; 255 366c6: af 4f sbci r26, 0xFF ; 255 366c8: bf 4f sbci r27, 0xFF ; 255 366ca: 80 87 std Z+8, r24 ; 0x08 366cc: 91 87 std Z+9, r25 ; 0x09 366ce: a2 87 std Z+10, r26 ; 0x0a 366d0: b3 87 std Z+11, r27 ; 0x0b block->steps[E_AXIS].wide = labs(de); 366d2: b3 01 movw r22, r6 366d4: a2 01 movw r20, r4 366d6: 77 fe sbrs r7, 7 366d8: 07 c0 rjmp .+14 ; 0x366e8 366da: 44 27 eor r20, r20 366dc: 55 27 eor r21, r21 366de: ba 01 movw r22, r20 366e0: 44 19 sub r20, r4 366e2: 55 09 sbc r21, r5 366e4: 66 09 sbc r22, r6 366e6: 77 09 sbc r23, r7 366e8: 8e e6 ldi r24, 0x6E ; 110 366ea: 82 9d mul r24, r2 366ec: f0 01 movw r30, r0 366ee: 83 9d mul r24, r3 366f0: f0 0d add r31, r0 366f2: 11 24 eor r1, r1 366f4: ec 53 subi r30, 0x3C ; 60 366f6: f9 4f sbci r31, 0xF9 ; 249 366f8: 44 87 std Z+12, r20 ; 0x0c 366fa: 55 87 std Z+13, r21 ; 0x0d 366fc: 66 87 std Z+14, r22 ; 0x0e 366fe: 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))); 36700: 00 81 ld r16, Z 36702: 11 81 ldd r17, Z+1 ; 0x01 36704: 22 81 ldd r18, Z+2 ; 0x02 36706: 33 81 ldd r19, Z+3 ; 0x03 36708: 84 81 ldd r24, Z+4 ; 0x04 3670a: 95 81 ldd r25, Z+5 ; 0x05 3670c: a6 81 ldd r26, Z+6 ; 0x06 3670e: b7 81 ldd r27, Z+7 ; 0x07 36710: 80 17 cp r24, r16 36712: 91 07 cpc r25, r17 36714: a2 07 cpc r26, r18 36716: b3 07 cpc r27, r19 36718: 14 f4 brge .+4 ; 0x3671e 3671a: d9 01 movw r26, r18 3671c: c8 01 movw r24, r16 3671e: ee e6 ldi r30, 0x6E ; 110 36720: be 2e mov r11, r30 36722: b2 9c mul r11, r2 36724: f0 01 movw r30, r0 36726: b3 9c mul r11, r3 36728: f0 0d add r31, r0 3672a: 11 24 eor r1, r1 3672c: ec 53 subi r30, 0x3C ; 60 3672e: f9 4f sbci r31, 0xF9 ; 249 36730: 80 84 ldd r8, Z+8 ; 0x08 36732: 91 84 ldd r9, Z+9 ; 0x09 36734: a2 84 ldd r10, Z+10 ; 0x0a 36736: b3 84 ldd r11, Z+11 ; 0x0b 36738: 88 15 cp r24, r8 3673a: 99 05 cpc r25, r9 3673c: aa 05 cpc r26, r10 3673e: bb 05 cpc r27, r11 36740: 14 f4 brge .+4 ; 0x36746 36742: d5 01 movw r26, r10 36744: c4 01 movw r24, r8 36746: 84 17 cp r24, r20 36748: 95 07 cpc r25, r21 3674a: a6 07 cpc r26, r22 3674c: b7 07 cpc r27, r23 3674e: 14 f4 brge .+4 ; 0x36754 36750: db 01 movw r26, r22 36752: ca 01 movw r24, r20 36754: 4e e6 ldi r20, 0x6E ; 110 36756: 42 9d mul r20, r2 36758: f0 01 movw r30, r0 3675a: 43 9d mul r20, r3 3675c: f0 0d add r31, r0 3675e: 11 24 eor r1, r1 36760: ec 53 subi r30, 0x3C ; 60 36762: f9 4f sbci r31, 0xF9 ; 249 36764: 80 8b std Z+16, r24 ; 0x10 36766: 91 8b std Z+17, r25 ; 0x11 36768: a2 8b std Z+18, r26 ; 0x12 3676a: b3 8b std Z+19, r27 ; 0x13 // Bail if this is a zero-length block if (block->step_event_count.wide <= dropsegments) 3676c: 06 97 sbiw r24, 0x06 ; 6 3676e: a1 05 cpc r26, r1 36770: b1 05 cpc r27, r1 36772: 0c f4 brge .+2 ; 0x36776 36774: 94 cd rjmp .-1240 ; 0x3629e planner_update_queue_min_counter(); #endif /* PLANNER_DIAGNOSTICS */ return; } block->fan_speed = fanSpeed; 36776: 80 91 e5 03 lds r24, 0x03E5 ; 0x8003e5 3677a: df 01 movw r26, r30 3677c: aa 5b subi r26, 0xBA ; 186 3677e: bf 4f sbci r27, 0xFF ; 255 36780: 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); 36782: f7 fe sbrs r15, 7 36784: 02 c0 rjmp .+4 ; 0x3678a 36786: 0d 94 f3 bb jmp 0x377e6 ; 0x377e6 } block->fan_speed = fanSpeed; // Compute direction bits for this block block->direction_bits = 0; 3678a: 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); 3678c: 89 a5 ldd r24, Y+41 ; 0x29 3678e: 9a a5 ldd r25, Y+42 ; 0x2a 36790: ab a5 ldd r26, Y+43 ; 0x2b 36792: bc a5 ldd r27, Y+44 ; 0x2c 36794: b7 ff sbrs r27, 7 36796: 0b c0 rjmp .+22 ; 0x367ae 36798: 8e e6 ldi r24, 0x6E ; 110 3679a: 82 9d mul r24, r2 3679c: f0 01 movw r30, r0 3679e: 83 9d mul r24, r3 367a0: f0 0d add r31, r0 367a2: 11 24 eor r1, r1 367a4: ec 53 subi r30, 0x3C ; 60 367a6: f9 4f sbci r31, 0xF9 ; 249 367a8: 80 8d ldd r24, Z+24 ; 0x18 367aa: 82 60 ori r24, 0x02 ; 2 367ac: 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); 367ae: 8d a5 ldd r24, Y+45 ; 0x2d 367b0: 9e a5 ldd r25, Y+46 ; 0x2e 367b2: af a5 ldd r26, Y+47 ; 0x2f 367b4: b8 a9 ldd r27, Y+48 ; 0x30 367b6: b7 ff sbrs r27, 7 367b8: 0b c0 rjmp .+22 ; 0x367d0 367ba: 8e e6 ldi r24, 0x6E ; 110 367bc: 82 9d mul r24, r2 367be: f0 01 movw r30, r0 367c0: 83 9d mul r24, r3 367c2: f0 0d add r31, r0 367c4: 11 24 eor r1, r1 367c6: ec 53 subi r30, 0x3C ; 60 367c8: f9 4f sbci r31, 0xF9 ; 249 367ca: 80 8d ldd r24, Z+24 ; 0x18 367cc: 84 60 ori r24, 0x04 ; 4 367ce: 80 8f std Z+24, r24 ; 0x18 if (de < 0) block->direction_bits |= _BV(E_AXIS); 367d0: 77 fe sbrs r7, 7 367d2: 0b c0 rjmp .+22 ; 0x367ea 367d4: 8e e6 ldi r24, 0x6E ; 110 367d6: 82 9d mul r24, r2 367d8: f0 01 movw r30, r0 367da: 83 9d mul r24, r3 367dc: f0 0d add r31, r0 367de: 11 24 eor r1, r1 367e0: ec 53 subi r30, 0x3C ; 60 367e2: f9 4f sbci r31, 0xF9 ; 249 367e4: 80 8d ldd r24, Z+24 ; 0x18 367e6: 88 60 ori r24, 0x08 ; 8 367e8: 80 8f std Z+24, r24 ; 0x18 { enable_x(); enable_y(); } #else if(block->steps[X_AXIS].wide != 0) enable_x(); 367ea: 01 2b or r16, r17 367ec: 02 2b or r16, r18 367ee: 03 2b or r16, r19 367f0: 09 f0 breq .+2 ; 0x367f4 367f2: 17 98 cbi 0x02, 7 ; 2 if(block->steps[Y_AXIS].wide != 0) enable_y(); 367f4: 8e e6 ldi r24, 0x6E ; 110 367f6: 82 9d mul r24, r2 367f8: f0 01 movw r30, r0 367fa: 83 9d mul r24, r3 367fc: f0 0d add r31, r0 367fe: 11 24 eor r1, r1 36800: ec 53 subi r30, 0x3C ; 60 36802: f9 4f sbci r31, 0xF9 ; 249 36804: 84 81 ldd r24, Z+4 ; 0x04 36806: 95 81 ldd r25, Z+5 ; 0x05 36808: a6 81 ldd r26, Z+6 ; 0x06 3680a: b7 81 ldd r27, Z+7 ; 0x07 3680c: 89 2b or r24, r25 3680e: 8a 2b or r24, r26 36810: 8b 2b or r24, r27 36812: 09 f0 breq .+2 ; 0x36816 36814: 16 98 cbi 0x02, 6 ; 2 #endif if(block->steps[Z_AXIS].wide != 0) enable_z(); 36816: 8e e6 ldi r24, 0x6E ; 110 36818: 82 9d mul r24, r2 3681a: f0 01 movw r30, r0 3681c: 83 9d mul r24, r3 3681e: f0 0d add r31, r0 36820: 11 24 eor r1, r1 36822: ec 53 subi r30, 0x3C ; 60 36824: f9 4f sbci r31, 0xF9 ; 249 36826: 80 85 ldd r24, Z+8 ; 0x08 36828: 91 85 ldd r25, Z+9 ; 0x09 3682a: a2 85 ldd r26, Z+10 ; 0x0a 3682c: b3 85 ldd r27, Z+11 ; 0x0b 3682e: 89 2b or r24, r25 36830: 8a 2b or r24, r26 36832: 8b 2b or r24, r27 36834: 09 f0 breq .+2 ; 0x36838 36836: 15 98 cbi 0x02, 5 ; 2 if(block->steps[E_AXIS].wide != 0) enable_e0(); 36838: 8e e6 ldi r24, 0x6E ; 110 3683a: 82 9d mul r24, r2 3683c: f0 01 movw r30, r0 3683e: 83 9d mul r24, r3 36840: f0 0d add r31, r0 36842: 11 24 eor r1, r1 36844: ec 53 subi r30, 0x3C ; 60 36846: f9 4f sbci r31, 0xF9 ; 249 36848: 84 85 ldd r24, Z+12 ; 0x0c 3684a: 95 85 ldd r25, Z+13 ; 0x0d 3684c: a6 85 ldd r26, Z+14 ; 0x0e 3684e: b7 85 ldd r27, Z+15 ; 0x0f 36850: 89 2b or r24, r25 36852: 8a 2b or r24, r26 36854: 8b 2b or r24, r27 36856: 09 f0 breq .+2 ; 0x3685a 36858: 14 98 cbi 0x02, 4 ; 2 if (block->steps[E_AXIS].wide == 0) 3685a: 8e e6 ldi r24, 0x6E ; 110 3685c: 82 9d mul r24, r2 3685e: f0 01 movw r30, r0 36860: 83 9d mul r24, r3 36862: f0 0d add r31, r0 36864: 11 24 eor r1, r1 36866: ec 53 subi r30, 0x3C ; 60 36868: f9 4f sbci r31, 0xF9 ; 249 3686a: 24 85 ldd r18, Z+12 ; 0x0c 3686c: 35 85 ldd r19, Z+13 ; 0x0d 3686e: 46 85 ldd r20, Z+14 ; 0x0e 36870: 57 85 ldd r21, Z+15 ; 0x0f 36872: 2a 96 adiw r28, 0x0a ; 10 36874: 2c af std Y+60, r18 ; 0x3c 36876: 3d af std Y+61, r19 ; 0x3d 36878: 4e af std Y+62, r20 ; 0x3e 3687a: 5f af std Y+63, r21 ; 0x3f 3687c: 2a 97 sbiw r28, 0x0a ; 10 3687e: 23 2b or r18, r19 36880: 24 2b or r18, r20 36882: 25 2b or r18, r21 36884: 09 f0 breq .+2 ; 0x36888 36886: b3 c7 rjmp .+3942 ; 0x377ee { if(feed_rate 3688c: b0 90 fe 0d lds r11, 0x0DFE ; 0x800dfe 36890: 00 91 ff 0d lds r16, 0x0DFF ; 0x800dff 36894: 10 91 00 0e lds r17, 0x0E00 ; 0x800e00 } else { if(feed_rate 368a8: 18 16 cp r1, r24 368aa: 24 f4 brge .+8 ; 0x368b4 368ac: a9 aa std Y+49, r10 ; 0x31 368ae: b9 ae std Y+57, r11 ; 0x39 368b0: 0d af std Y+61, r16 ; 0x3d 368b2: 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]; 368b4: c7 01 movw r24, r14 368b6: b6 01 movw r22, r12 368b8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 368bc: 20 91 c1 0d lds r18, 0x0DC1 ; 0x800dc1 368c0: 30 91 c2 0d lds r19, 0x0DC2 ; 0x800dc2 368c4: 40 91 c3 0d lds r20, 0x0DC3 ; 0x800dc3 368c8: 50 91 c4 0d lds r21, 0x0DC4 ; 0x800dc4 368cc: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 368d0: 4b 01 movw r8, r22 368d2: 5c 01 movw r10, r24 368d4: 89 82 std Y+1, r8 ; 0x01 368d6: 9a 82 std Y+2, r9 ; 0x02 368d8: ab 82 std Y+3, r10 ; 0x03 368da: bc 82 std Y+4, r11 ; 0x04 delta_mm[Y_AXIS] = dy / cs.axis_steps_per_mm[Y_AXIS]; 368dc: 69 a5 ldd r22, Y+41 ; 0x29 368de: 7a a5 ldd r23, Y+42 ; 0x2a 368e0: 8b a5 ldd r24, Y+43 ; 0x2b 368e2: 9c a5 ldd r25, Y+44 ; 0x2c 368e4: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 368e8: 20 91 c5 0d lds r18, 0x0DC5 ; 0x800dc5 368ec: 30 91 c6 0d lds r19, 0x0DC6 ; 0x800dc6 368f0: 40 91 c7 0d lds r20, 0x0DC7 ; 0x800dc7 368f4: 50 91 c8 0d lds r21, 0x0DC8 ; 0x800dc8 368f8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 368fc: 6b 01 movw r12, r22 368fe: 7c 01 movw r14, r24 36900: cd 82 std Y+5, r12 ; 0x05 36902: de 82 std Y+6, r13 ; 0x06 36904: ef 82 std Y+7, r14 ; 0x07 36906: 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]; 36908: 6d a5 ldd r22, Y+45 ; 0x2d 3690a: 7e a5 ldd r23, Y+46 ; 0x2e 3690c: 8f a5 ldd r24, Y+47 ; 0x2f 3690e: 98 a9 ldd r25, Y+48 ; 0x30 36910: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 36914: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 36918: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 3691c: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 36920: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 36924: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36928: 22 96 adiw r28, 0x02 ; 2 3692a: 6c af std Y+60, r22 ; 0x3c 3692c: 7d af std Y+61, r23 ; 0x3d 3692e: 8e af std Y+62, r24 ; 0x3e 36930: 9f af std Y+63, r25 ; 0x3f 36932: 22 97 sbiw r28, 0x02 ; 2 36934: 69 87 std Y+9, r22 ; 0x09 36936: 7a 87 std Y+10, r23 ; 0x0a 36938: 8b 87 std Y+11, r24 ; 0x0b 3693a: 9c 87 std Y+12, r25 ; 0x0c delta_mm[E_AXIS] = de / cs.axis_steps_per_mm[E_AXIS]; 3693c: c3 01 movw r24, r6 3693e: b2 01 movw r22, r4 36940: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 36944: 20 91 cd 0d lds r18, 0x0DCD ; 0x800dcd 36948: 30 91 ce 0d lds r19, 0x0DCE ; 0x800dce 3694c: 40 91 cf 0d lds r20, 0x0DCF ; 0x800dcf 36950: 50 91 d0 0d lds r21, 0x0DD0 ; 0x800dd0 36954: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36958: 26 96 adiw r28, 0x06 ; 6 3695a: 6c af std Y+60, r22 ; 0x3c 3695c: 7d af std Y+61, r23 ; 0x3d 3695e: 8e af std Y+62, r24 ; 0x3e 36960: 9f af std Y+63, r25 ; 0x3f 36962: 26 97 sbiw r28, 0x06 ; 6 36964: 6d 87 std Y+13, r22 ; 0x0d 36966: 7e 87 std Y+14, r23 ; 0x0e 36968: 8f 87 std Y+15, r24 ; 0x0f 3696a: 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 ) 3696c: 8e e6 ldi r24, 0x6E ; 110 3696e: 82 9d mul r24, r2 36970: f0 01 movw r30, r0 36972: 83 9d mul r24, r3 36974: f0 0d add r31, r0 36976: 11 24 eor r1, r1 36978: ec 53 subi r30, 0x3C ; 60 3697a: f9 4f sbci r31, 0xF9 ; 249 3697c: 80 81 ld r24, Z 3697e: 91 81 ldd r25, Z+1 ; 0x01 36980: a2 81 ldd r26, Z+2 ; 0x02 36982: b3 81 ldd r27, Z+3 ; 0x03 36984: 2e 96 adiw r28, 0x0e ; 14 36986: 8c af std Y+60, r24 ; 0x3c 36988: 9d af std Y+61, r25 ; 0x3d 3698a: ae af std Y+62, r26 ; 0x3e 3698c: bf af std Y+63, r27 ; 0x3f 3698e: 2e 97 sbiw r28, 0x0e ; 14 36990: 06 97 sbiw r24, 0x06 ; 6 36992: a1 05 cpc r26, r1 36994: b1 05 cpc r27, r1 36996: 0c f0 brlt .+2 ; 0x3699a 36998: 33 c7 rjmp .+3686 ; 0x37800 3699a: 84 81 ldd r24, Z+4 ; 0x04 3699c: 95 81 ldd r25, Z+5 ; 0x05 3699e: a6 81 ldd r26, Z+6 ; 0x06 369a0: b7 81 ldd r27, Z+7 ; 0x07 369a2: 06 97 sbiw r24, 0x06 ; 6 369a4: a1 05 cpc r26, r1 369a6: b1 05 cpc r27, r1 369a8: 0c f0 brlt .+2 ; 0x369ac 369aa: 2a c7 rjmp .+3668 ; 0x37800 369ac: 80 85 ldd r24, Z+8 ; 0x08 369ae: 91 85 ldd r25, Z+9 ; 0x09 369b0: a2 85 ldd r26, Z+10 ; 0x0a 369b2: b3 85 ldd r27, Z+11 ; 0x0b 369b4: 06 97 sbiw r24, 0x06 ; 6 369b6: a1 05 cpc r26, r1 369b8: b1 05 cpc r27, r1 369ba: 0c f0 brlt .+2 ; 0x369be 369bc: 21 c7 rjmp .+3650 ; 0x37800 { block->millimeters = fabs(delta_mm[E_AXIS]); 369be: 26 96 adiw r28, 0x06 ; 6 369c0: 8c ad ldd r24, Y+60 ; 0x3c 369c2: 9d ad ldd r25, Y+61 ; 0x3d 369c4: ae ad ldd r26, Y+62 ; 0x3e 369c6: bf ad ldd r27, Y+63 ; 0x3f 369c8: 26 97 sbiw r28, 0x06 ; 6 369ca: bf 77 andi r27, 0x7F ; 127 369cc: 85 a7 std Z+45, r24 ; 0x2d 369ce: 96 a7 std Z+46, r25 ; 0x2e 369d0: a7 a7 std Z+47, r26 ; 0x2f 369d2: 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 369d4: 8e e6 ldi r24, 0x6E ; 110 369d6: 82 9d mul r24, r2 369d8: f0 01 movw r30, r0 369da: 83 9d mul r24, r3 369dc: f0 0d add r31, r0 369de: 11 24 eor r1, r1 369e0: ec 53 subi r30, 0x3C ; 60 369e2: f9 4f sbci r31, 0xF9 ; 249 369e4: 45 a4 ldd r4, Z+45 ; 0x2d 369e6: 56 a4 ldd r5, Z+46 ; 0x2e 369e8: 67 a4 ldd r6, Z+47 ; 0x2f 369ea: 70 a8 ldd r7, Z+48 ; 0x30 369ec: a3 01 movw r20, r6 369ee: 92 01 movw r18, r4 369f0: 60 e0 ldi r22, 0x00 ; 0 369f2: 70 e0 ldi r23, 0x00 ; 0 369f4: 80 e8 ldi r24, 0x80 ; 128 369f6: 9f e3 ldi r25, 0x3F ; 63 369f8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> // Calculate speed in mm/second for each axis. No divide by zero due to previous checks. float inverse_second = feed_rate * inverse_millimeters; 369fc: 29 a9 ldd r18, Y+49 ; 0x31 369fe: 39 ad ldd r19, Y+57 ; 0x39 36a00: 4d ad ldd r20, Y+61 ; 0x3d 36a02: 5d a9 ldd r21, Y+53 ; 0x35 36a04: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36a08: 6b 01 movw r12, r22 36a0a: 7c 01 movw r14, r24 } //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); 36a0c: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 36a10: 90 91 a5 0d lds r25, 0x0DA5 ; 0x800da5 36a14: 89 1b sub r24, r25 36a16: 8f 70 andi r24, 0x0F ; 15 36a18: 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)) { 36a1a: 82 50 subi r24, 0x02 ; 2 36a1c: 86 30 cpi r24, 0x06 ; 6 36a1e: 08 f0 brcs .+2 ; 0x36a22 36a20: 40 c0 rjmp .+128 ; 0x36aa2 // segment time in micro seconds unsigned long segment_time = lround(1000000.0/inverse_second); 36a22: a7 01 movw r20, r14 36a24: 96 01 movw r18, r12 36a26: 60 e0 ldi r22, 0x00 ; 0 36a28: 74 e2 ldi r23, 0x24 ; 36 36a2a: 84 e7 ldi r24, 0x74 ; 116 36a2c: 99 e4 ldi r25, 0x49 ; 73 36a2e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36a32: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 36a36: 4b 01 movw r8, r22 36a38: 5c 01 movw r10, r24 if (segment_time < cs.min_segment_time_us) 36a3a: 80 91 01 0e lds r24, 0x0E01 ; 0x800e01 36a3e: 90 91 02 0e lds r25, 0x0E02 ; 0x800e02 36a42: a0 91 03 0e lds r26, 0x0E03 ; 0x800e03 36a46: b0 91 04 0e lds r27, 0x0E04 ; 0x800e04 36a4a: 88 16 cp r8, r24 36a4c: 99 06 cpc r9, r25 36a4e: aa 06 cpc r10, r26 36a50: bb 06 cpc r11, r27 36a52: 38 f5 brcc .+78 ; 0x36aa2 // 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)); 36a54: bc 01 movw r22, r24 36a56: cd 01 movw r24, r26 36a58: 68 19 sub r22, r8 36a5a: 79 09 sbc r23, r9 36a5c: 8a 09 sbc r24, r10 36a5e: 9b 09 sbc r25, r11 36a60: 66 0f add r22, r22 36a62: 77 1f adc r23, r23 36a64: 88 1f adc r24, r24 36a66: 99 1f adc r25, r25 36a68: ad ad ldd r26, Y+61 ; 0x3d 36a6a: 2a 2f mov r18, r26 36a6c: 30 e0 ldi r19, 0x00 ; 0 36a6e: 50 e0 ldi r21, 0x00 ; 0 36a70: 40 e0 ldi r20, 0x00 ; 0 36a72: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 36a76: ca 01 movw r24, r20 36a78: b9 01 movw r22, r18 36a7a: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 36a7e: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 36a82: 68 0d add r22, r8 36a84: 79 1d adc r23, r9 36a86: 8a 1d adc r24, r10 36a88: 9b 1d adc r25, r11 36a8a: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 36a8e: 9b 01 movw r18, r22 36a90: ac 01 movw r20, r24 36a92: 60 e0 ldi r22, 0x00 ; 0 36a94: 74 e2 ldi r23, 0x24 ; 36 36a96: 84 e7 ldi r24, 0x74 ; 116 36a98: 99 e4 ldi r25, 0x49 ; 73 36a9a: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36a9e: 6b 01 movw r12, r22 36aa0: 7c 01 movw r14, r24 } #endif // SLOWDOWN block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0 36aa2: a3 01 movw r20, r6 36aa4: 92 01 movw r18, r4 36aa6: c7 01 movw r24, r14 36aa8: b6 01 movw r22, r12 36aaa: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36aae: 6d ab std Y+53, r22 ; 0x35 36ab0: 7e ab std Y+54, r23 ; 0x36 36ab2: 8f ab std Y+55, r24 ; 0x37 36ab4: 98 af std Y+56, r25 ; 0x38 36ab6: 8e e6 ldi r24, 0x6E ; 110 36ab8: 82 9d mul r24, r2 36aba: 80 01 movw r16, r0 36abc: 83 9d mul r24, r3 36abe: 10 0d add r17, r0 36ac0: 11 24 eor r1, r1 36ac2: 0c 53 subi r16, 0x3C ; 60 36ac4: 19 4f sbci r17, 0xF9 ; 249 36ac6: 2d a9 ldd r18, Y+53 ; 0x35 36ac8: 3e a9 ldd r19, Y+54 ; 0x36 36aca: 4f a9 ldd r20, Y+55 ; 0x37 36acc: 58 ad ldd r21, Y+56 ; 0x38 36ace: d8 01 movw r26, r16 36ad0: 91 96 adiw r26, 0x21 ; 33 36ad2: 2d 93 st X+, r18 36ad4: 3d 93 st X+, r19 36ad6: 4d 93 st X+, r20 36ad8: 5c 93 st X, r21 36ada: 94 97 sbiw r26, 0x24 ; 36 block->nominal_rate = ceil(block->step_event_count.wide * inverse_second); // (step/sec) Always > 0 36adc: 50 96 adiw r26, 0x10 ; 16 36ade: 6d 91 ld r22, X+ 36ae0: 7d 91 ld r23, X+ 36ae2: 8d 91 ld r24, X+ 36ae4: 9c 91 ld r25, X 36ae6: 53 97 sbiw r26, 0x13 ; 19 36ae8: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 36aec: 69 af std Y+57, r22 ; 0x39 36aee: 7a af std Y+58, r23 ; 0x3a 36af0: 8b af std Y+59, r24 ; 0x3b 36af2: 9c af std Y+60, r25 ; 0x3c 36af4: 9b 01 movw r18, r22 36af6: ac 01 movw r20, r24 36af8: c7 01 movw r24, r14 36afa: b6 01 movw r22, r12 36afc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36b00: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 36b04: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 36b08: 62 96 adiw r28, 0x12 ; 18 36b0a: 6c af std Y+60, r22 ; 0x3c 36b0c: 7d af std Y+61, r23 ; 0x3d 36b0e: 8e af std Y+62, r24 ; 0x3e 36b10: 9f af std Y+63, r25 ; 0x3f 36b12: 62 97 sbiw r28, 0x12 ; 18 36b14: f8 01 movw r30, r16 36b16: 66 ab std Z+54, r22 ; 0x36 36b18: 77 ab std Z+55, r23 ; 0x37 36b1a: 80 af std Z+56, r24 ; 0x38 36b1c: 91 af std Z+57, r25 ; 0x39 36b1e: 9e 01 movw r18, r28 36b20: 2f 5f subi r18, 0xFF ; 255 36b22: 3f 4f sbci r19, 0xFF ; 255 36b24: 6c 96 adiw r28, 0x1c ; 28 36b26: 3f af std Y+63, r19 ; 0x3f 36b28: 2e af std Y+62, r18 ; 0x3e 36b2a: 6c 97 sbiw r28, 0x1c ; 28 36b2c: ae 01 movw r20, r28 36b2e: 4f 5e subi r20, 0xEF ; 239 36b30: 5f 4f sbci r21, 0xFF ; 255 36b32: a0 96 adiw r28, 0x20 ; 32 36b34: 5f af std Y+63, r21 ; 0x3f 36b36: 4e af std Y+62, r20 ; 0x3e 36b38: a0 97 sbiw r28, 0x20 ; 32 36b3a: 80 91 71 02 lds r24, 0x0271 ; 0x800271 36b3e: 90 91 72 02 lds r25, 0x0272 ; 0x800272 36b42: 9a ab std Y+50, r25 ; 0x32 36b44: 89 ab std Y+49, r24 ; 0x31 36b46: 40 96 adiw r24, 0x10 ; 16 36b48: 6e 96 adiw r28, 0x1e ; 30 36b4a: 9f af std Y+63, r25 ; 0x3f 36b4c: 8e af std Y+62, r24 ; 0x3e 36b4e: 6e 97 sbiw r28, 0x1e ; 30 float current_speed[4]; float speed_factor = 1.0; //factor <=1 do decrease speed for(int i=0; i < 4; i++) { current_speed[i] = delta_mm[i] * inverse_second; if(fabs(current_speed[i]) > max_feedrate[i]) 36b50: 68 96 adiw r28, 0x18 ; 24 36b52: 5f af std Y+63, r21 ; 0x3f 36b54: 4e af std Y+62, r20 ; 0x3e 36b56: 68 97 sbiw r28, 0x18 ; 24 block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0 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 36b58: 19 a6 std Y+41, r1 ; 0x29 36b5a: 1d a6 std Y+45, r1 ; 0x2d 36b5c: 00 e8 ldi r16, 0x80 ; 128 36b5e: 1f e3 ldi r17, 0x3F ; 63 for(int i=0; i < 4; i++) { current_speed[i] = delta_mm[i] * inverse_second; 36b60: 6c 96 adiw r28, 0x1c ; 28 36b62: ae ad ldd r26, Y+62 ; 0x3e 36b64: bf ad ldd r27, Y+63 ; 0x3f 36b66: 6c 97 sbiw r28, 0x1c ; 28 36b68: 2d 91 ld r18, X+ 36b6a: 3d 91 ld r19, X+ 36b6c: 4d 91 ld r20, X+ 36b6e: 5d 91 ld r21, X+ 36b70: 6c 96 adiw r28, 0x1c ; 28 36b72: bf af std Y+63, r27 ; 0x3f 36b74: ae af std Y+62, r26 ; 0x3e 36b76: 6c 97 sbiw r28, 0x1c ; 28 36b78: c7 01 movw r24, r14 36b7a: b6 01 movw r22, r12 36b7c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36b80: 68 96 adiw r28, 0x18 ; 24 36b82: ee ad ldd r30, Y+62 ; 0x3e 36b84: ff ad ldd r31, Y+63 ; 0x3f 36b86: 68 97 sbiw r28, 0x18 ; 24 36b88: 61 93 st Z+, r22 36b8a: 71 93 st Z+, r23 36b8c: 81 93 st Z+, r24 36b8e: 91 93 st Z+, r25 36b90: 68 96 adiw r28, 0x18 ; 24 36b92: ff af std Y+63, r31 ; 0x3f 36b94: ee af std Y+62, r30 ; 0x3e 36b96: 68 97 sbiw r28, 0x18 ; 24 if(fabs(current_speed[i]) > max_feedrate[i]) 36b98: 4b 01 movw r8, r22 36b9a: 5c 01 movw r10, r24 36b9c: e8 94 clt 36b9e: b7 f8 bld r11, 7 36ba0: a9 a9 ldd r26, Y+49 ; 0x31 36ba2: ba a9 ldd r27, Y+50 ; 0x32 36ba4: 2d 91 ld r18, X+ 36ba6: 3d 91 ld r19, X+ 36ba8: 4d 91 ld r20, X+ 36baa: 5d 91 ld r21, X+ 36bac: ba ab std Y+50, r27 ; 0x32 36bae: a9 ab std Y+49, r26 ; 0x31 36bb0: 66 96 adiw r28, 0x16 ; 22 36bb2: 2c af std Y+60, r18 ; 0x3c 36bb4: 3d af std Y+61, r19 ; 0x3d 36bb6: 4e af std Y+62, r20 ; 0x3e 36bb8: 5f af std Y+63, r21 ; 0x3f 36bba: 66 97 sbiw r28, 0x16 ; 22 36bbc: c5 01 movw r24, r10 36bbe: b4 01 movw r22, r8 36bc0: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 36bc4: 18 16 cp r1, r24 36bc6: b4 f4 brge .+44 ; 0x36bf4 { speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); 36bc8: a5 01 movw r20, r10 36bca: 94 01 movw r18, r8 36bcc: 66 96 adiw r28, 0x16 ; 22 36bce: 6c ad ldd r22, Y+60 ; 0x3c 36bd0: 7d ad ldd r23, Y+61 ; 0x3d 36bd2: 8e ad ldd r24, Y+62 ; 0x3e 36bd4: 9f ad ldd r25, Y+63 ; 0x3f 36bd6: 66 97 sbiw r28, 0x16 ; 22 36bd8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36bdc: 4b 01 movw r8, r22 36bde: 5c 01 movw r10, r24 36be0: 29 a5 ldd r18, Y+41 ; 0x29 36be2: 3d a5 ldd r19, Y+45 ; 0x2d 36be4: a8 01 movw r20, r16 36be6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 36bea: 18 16 cp r1, r24 36bec: 1c f0 brlt .+6 ; 0x36bf4 36bee: 89 a6 std Y+41, r8 ; 0x29 36bf0: 9d a6 std Y+45, r9 ; 0x2d 36bf2: 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++) 36bf4: 6e 96 adiw r28, 0x1e ; 30 36bf6: ee ad ldd r30, Y+62 ; 0x3e 36bf8: ff ad ldd r31, Y+63 ; 0x3f 36bfa: 6e 97 sbiw r28, 0x1e ; 30 36bfc: 29 a9 ldd r18, Y+49 ; 0x31 36bfe: 3a a9 ldd r19, Y+50 ; 0x32 36c00: e2 17 cp r30, r18 36c02: f3 07 cpc r31, r19 36c04: 09 f0 breq .+2 ; 0x36c08 36c06: ac cf rjmp .-168 ; 0x36b60 speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); } } // Correct the speed if( speed_factor < 1.0) 36c08: 20 e0 ldi r18, 0x00 ; 0 36c0a: 30 e0 ldi r19, 0x00 ; 0 36c0c: 40 e8 ldi r20, 0x80 ; 128 36c0e: 5f e3 ldi r21, 0x3F ; 63 36c10: 69 a5 ldd r22, Y+41 ; 0x29 36c12: 7d a5 ldd r23, Y+45 ; 0x2d 36c14: c8 01 movw r24, r16 36c16: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 36c1a: 87 ff sbrs r24, 7 36c1c: 50 c0 rjmp .+160 ; 0x36cbe 36c1e: a0 96 adiw r28, 0x20 ; 32 36c20: ae ac ldd r10, Y+62 ; 0x3e 36c22: bf ac ldd r11, Y+63 ; 0x3f 36c24: a0 97 sbiw r28, 0x20 ; 32 36c26: 30 e1 ldi r19, 0x10 ; 16 36c28: a3 0e add r10, r19 36c2a: b1 1c adc r11, r1 36c2c: a0 96 adiw r28, 0x20 ; 32 36c2e: ce ac ldd r12, Y+62 ; 0x3e 36c30: df ac ldd r13, Y+63 ; 0x3f 36c32: a0 97 sbiw r28, 0x20 ; 32 { for(unsigned char i=0; i < 4; i++) { current_speed[i] *= speed_factor; 36c34: d6 01 movw r26, r12 36c36: 6d 91 ld r22, X+ 36c38: 7d 91 ld r23, X+ 36c3a: 8d 91 ld r24, X+ 36c3c: 9d 91 ld r25, X+ 36c3e: 6d 01 movw r12, r26 36c40: 7d 01 movw r14, r26 36c42: b4 e0 ldi r27, 0x04 ; 4 36c44: eb 1a sub r14, r27 36c46: f1 08 sbc r15, r1 36c48: 29 a5 ldd r18, Y+41 ; 0x29 36c4a: 3d a5 ldd r19, Y+45 ; 0x2d 36c4c: a8 01 movw r20, r16 36c4e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36c52: f7 01 movw r30, r14 36c54: 60 83 st Z, r22 36c56: 71 83 std Z+1, r23 ; 0x01 36c58: 82 83 std Z+2, r24 ; 0x02 36c5a: 93 83 std Z+3, r25 ; 0x03 } // Correct the speed if( speed_factor < 1.0) { for(unsigned char i=0; i < 4; i++) 36c5c: ac 14 cp r10, r12 36c5e: bd 04 cpc r11, r13 36c60: 49 f7 brne .-46 ; 0x36c34 { current_speed[i] *= speed_factor; } block->nominal_speed *= speed_factor; 36c62: 2e e6 ldi r18, 0x6E ; 110 36c64: 22 9d mul r18, r2 36c66: c0 01 movw r24, r0 36c68: 23 9d mul r18, r3 36c6a: 90 0d add r25, r0 36c6c: 11 24 eor r1, r1 36c6e: 9c 01 movw r18, r24 36c70: 2c 53 subi r18, 0x3C ; 60 36c72: 39 4f sbci r19, 0xF9 ; 249 36c74: 79 01 movw r14, r18 36c76: 29 a5 ldd r18, Y+41 ; 0x29 36c78: 3d a5 ldd r19, Y+45 ; 0x2d 36c7a: a8 01 movw r20, r16 36c7c: 6d a9 ldd r22, Y+53 ; 0x35 36c7e: 7e a9 ldd r23, Y+54 ; 0x36 36c80: 8f a9 ldd r24, Y+55 ; 0x37 36c82: 98 ad ldd r25, Y+56 ; 0x38 36c84: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36c88: d7 01 movw r26, r14 36c8a: 91 96 adiw r26, 0x21 ; 33 36c8c: 6d 93 st X+, r22 36c8e: 7d 93 st X+, r23 36c90: 8d 93 st X+, r24 36c92: 9c 93 st X, r25 36c94: 94 97 sbiw r26, 0x24 ; 36 block->nominal_rate *= speed_factor; 36c96: 62 96 adiw r28, 0x12 ; 18 36c98: 6c ad ldd r22, Y+60 ; 0x3c 36c9a: 7d ad ldd r23, Y+61 ; 0x3d 36c9c: 8e ad ldd r24, Y+62 ; 0x3e 36c9e: 9f ad ldd r25, Y+63 ; 0x3f 36ca0: 62 97 sbiw r28, 0x12 ; 18 36ca2: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 36ca6: 29 a5 ldd r18, Y+41 ; 0x29 36ca8: 3d a5 ldd r19, Y+45 ; 0x2d 36caa: a8 01 movw r20, r16 36cac: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36cb0: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 36cb4: f7 01 movw r30, r14 36cb6: 66 ab std Z+54, r22 ; 0x36 36cb8: 77 ab std Z+55, r23 ; 0x37 36cba: 80 af std Z+56, r24 ; 0x38 36cbc: 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; 36cbe: a3 01 movw r20, r6 36cc0: 92 01 movw r18, r4 36cc2: 69 ad ldd r22, Y+57 ; 0x39 36cc4: 7a ad ldd r23, Y+58 ; 0x3a 36cc6: 8b ad ldd r24, Y+59 ; 0x3b 36cc8: 9c ad ldd r25, Y+60 ; 0x3c 36cca: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36cce: 69 a7 std Y+41, r22 ; 0x29 36cd0: 7a a7 std Y+42, r23 ; 0x2a 36cd2: 8b a7 std Y+43, r24 ; 0x2b 36cd4: 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) 36cd6: 2e 96 adiw r28, 0x0e ; 14 36cd8: 2c ad ldd r18, Y+60 ; 0x3c 36cda: 3d ad ldd r19, Y+61 ; 0x3d 36cdc: 4e ad ldd r20, Y+62 ; 0x3e 36cde: 5f ad ldd r21, Y+63 ; 0x3f 36ce0: 2e 97 sbiw r28, 0x0e ; 14 36ce2: 23 2b or r18, r19 36ce4: 24 2b or r18, r20 36ce6: 25 2b or r18, r21 36ce8: 09 f0 breq .+2 ; 0x36cec 36cea: b9 c5 rjmp .+2930 ; 0x3785e 36cec: 8e e6 ldi r24, 0x6E ; 110 36cee: 82 9d mul r24, r2 36cf0: 80 01 movw r16, r0 36cf2: 83 9d mul r24, r3 36cf4: 10 0d add r17, r0 36cf6: 11 24 eor r1, r1 36cf8: 0c 53 subi r16, 0x3C ; 60 36cfa: 19 4f sbci r17, 0xF9 ; 249 36cfc: f8 01 movw r30, r16 36cfe: 84 81 ldd r24, Z+4 ; 0x04 36d00: 95 81 ldd r25, Z+5 ; 0x05 36d02: a6 81 ldd r26, Z+6 ; 0x06 36d04: b7 81 ldd r27, Z+7 ; 0x07 36d06: 89 2b or r24, r25 36d08: 8a 2b or r24, r26 36d0a: 8b 2b or r24, r27 36d0c: 09 f0 breq .+2 ; 0x36d10 36d0e: a7 c5 rjmp .+2894 ; 0x3785e 36d10: 80 85 ldd r24, Z+8 ; 0x08 36d12: 91 85 ldd r25, Z+9 ; 0x09 36d14: a2 85 ldd r26, Z+10 ; 0x0a 36d16: b3 85 ldd r27, Z+11 ; 0x0b 36d18: 89 2b or r24, r25 36d1a: 8a 2b or r24, r26 36d1c: 8b 2b or r24, r27 36d1e: 09 f0 breq .+2 ; 0x36d22 36d20: 9e c5 rjmp .+2876 ; 0x3785e { accel = ceil(cs.retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 36d22: 20 91 f5 0d lds r18, 0x0DF5 ; 0x800df5 36d26: 30 91 f6 0d lds r19, 0x0DF6 ; 0x800df6 36d2a: 40 91 f7 0d lds r20, 0x0DF7 ; 0x800df7 36d2e: 50 91 f8 0d lds r21, 0x0DF8 ; 0x800df8 36d32: 69 a5 ldd r22, Y+41 ; 0x29 36d34: 7a a5 ldd r23, Y+42 ; 0x2a 36d36: 8b a5 ldd r24, Y+43 ; 0x2b 36d38: 9c a5 ldd r25, Y+44 ; 0x2c 36d3a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36d3e: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 36d42: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 36d46: 2b 01 movw r4, r22 36d48: 3c 01 movw r6, r24 #ifdef LIN_ADVANCE block->use_advance_lead = false; 36d4a: f8 01 movw r30, r16 36d4c: e4 5b subi r30, 0xB4 ; 180 36d4e: ff 4f sbci r31, 0xFF ; 255 36d50: 10 82 st Z, r1 block->nominal_speed *= speed_factor; block->nominal_rate *= speed_factor; } #ifdef LIN_ADVANCE float e_D_ratio = 0; 36d52: 6a 96 adiw r28, 0x1a ; 26 36d54: 1c ae std Y+60, r1 ; 0x3c 36d56: 1d ae std Y+61, r1 ; 0x3d 36d58: 1e ae std Y+62, r1 ; 0x3e 36d5a: 1f ae std Y+63, r1 ; 0x3f 36d5c: 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; 36d5e: 8e e6 ldi r24, 0x6E ; 110 36d60: 82 9d mul r24, r2 36d62: 80 01 movw r16, r0 36d64: 83 9d mul r24, r3 36d66: 10 0d add r17, r0 36d68: 11 24 eor r1, r1 36d6a: 0c 53 subi r16, 0x3C ; 60 36d6c: 19 4f sbci r17, 0xF9 ; 249 36d6e: f8 01 movw r30, r16 36d70: ee 5b subi r30, 0xBE ; 190 36d72: ff 4f sbci r31, 0xFF ; 255 36d74: 40 82 st Z, r4 36d76: 51 82 std Z+1, r5 ; 0x01 36d78: 62 82 std Z+2, r6 ; 0x02 36d7a: 73 82 std Z+3, r7 ; 0x03 block->acceleration = accel / steps_per_mm; 36d7c: c3 01 movw r24, r6 36d7e: b2 01 movw r22, r4 36d80: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 36d84: 6b 01 movw r12, r22 36d86: 7c 01 movw r14, r24 36d88: 29 a5 ldd r18, Y+41 ; 0x29 36d8a: 3a a5 ldd r19, Y+42 ; 0x2a 36d8c: 4b a5 ldd r20, Y+43 ; 0x2b 36d8e: 5c a5 ldd r21, Y+44 ; 0x2c 36d90: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36d94: e2 96 adiw r28, 0x32 ; 50 36d96: 6c af std Y+60, r22 ; 0x3c 36d98: 7d af std Y+61, r23 ; 0x3d 36d9a: 8e af std Y+62, r24 ; 0x3e 36d9c: 9f af std Y+63, r25 ; 0x3f 36d9e: e2 97 sbiw r28, 0x32 ; 50 36da0: f8 01 movw r30, r16 36da2: 61 ab std Z+49, r22 ; 0x31 36da4: 72 ab std Z+50, r23 ; 0x32 36da6: 83 ab std Z+51, r24 ; 0x33 36da8: 94 ab std Z+52, r25 ; 0x34 block->acceleration_rate = (uint32_t)(accel * (float(1UL << 24) / ((F_CPU) / 8.0f))); 36daa: 2d eb ldi r18, 0xBD ; 189 36dac: 37 e3 ldi r19, 0x37 ; 55 36dae: 46 e0 ldi r20, 0x06 ; 6 36db0: 51 e4 ldi r21, 0x41 ; 65 36db2: c7 01 movw r24, r14 36db4: b6 01 movw r22, r12 36db6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36dba: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 36dbe: d8 01 movw r26, r16 36dc0: 54 96 adiw r26, 0x14 ; 20 36dc2: 6d 93 st X+, r22 36dc4: 7d 93 st X+, r23 36dc6: 8d 93 st X+, r24 36dc8: 9c 93 st X, r25 36dca: 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; 36dcc: 91 96 adiw r26, 0x21 ; 33 36dce: bc 91 ld r27, X 36dd0: 27 96 adiw r28, 0x07 ; 7 36dd2: bf af std Y+63, r27 ; 0x3f 36dd4: 27 97 sbiw r28, 0x07 ; 7 36dd6: f8 01 movw r30, r16 36dd8: f2 a1 ldd r31, Z+34 ; 0x22 36dda: 2b 96 adiw r28, 0x0b ; 11 36ddc: ff af std Y+63, r31 ; 0x3f 36dde: 2b 97 sbiw r28, 0x0b ; 11 36de0: d8 01 movw r26, r16 36de2: 93 96 adiw r26, 0x23 ; 35 36de4: bc 91 ld r27, X 36de6: 2f 96 adiw r28, 0x0f ; 15 36de8: bf af std Y+63, r27 ; 0x3f 36dea: 2f 97 sbiw r28, 0x0f ; 15 36dec: f8 01 movw r30, r16 36dee: f4 a1 ldd r31, Z+36 ; 0x24 36df0: 63 96 adiw r28, 0x13 ; 19 36df2: ff af std Y+63, r31 ; 0x3f 36df4: 63 97 sbiw r28, 0x13 ; 19 36df6: 25 e0 ldi r18, 0x05 ; 5 36df8: 3e e0 ldi r19, 0x0E ; 14 36dfa: ee 96 adiw r28, 0x3e ; 62 36dfc: 3f af std Y+63, r19 ; 0x3f 36dfe: 2e af std Y+62, r18 ; 0x3e 36e00: ee 97 sbiw r28, 0x3e ; 62 36e02: a0 96 adiw r28, 0x20 ; 32 36e04: 4e ac ldd r4, Y+62 ; 0x3e 36e06: 5f ac ldd r5, Y+63 ; 0x3f 36e08: a0 97 sbiw r28, 0x20 ; 32 36e0a: 30 e1 ldi r19, 0x10 ; 16 36e0c: 43 0e add r4, r19 36e0e: 51 1c adc r5, r1 36e10: 05 e0 ldi r16, 0x05 ; 5 36e12: 1e e0 ldi r17, 0x0E ; 14 36e14: a0 96 adiw r28, 0x20 ; 32 36e16: 6e ac ldd r6, Y+62 ; 0x3e 36e18: 7f ac ldd r7, Y+63 ; 0x3f 36e1a: a0 97 sbiw r28, 0x20 ; 32 36e1c: 27 96 adiw r28, 0x07 ; 7 36e1e: 4f ad ldd r20, Y+63 ; 0x3f 36e20: 27 97 sbiw r28, 0x07 ; 7 36e22: 49 a7 std Y+41, r20 ; 0x29 36e24: 2b 96 adiw r28, 0x0b ; 11 36e26: 5f ad ldd r21, Y+63 ; 0x3f 36e28: 2b 97 sbiw r28, 0x0b ; 11 36e2a: 5d a7 std Y+45, r21 ; 0x2d 36e2c: b9 ab std Y+49, r27 ; 0x31 36e2e: f9 af std Y+57, r31 ; 0x39 bool limited = false; 36e30: 1d aa std Y+53, r1 ; 0x35 for (uint8_t axis = 0; axis < 4; ++ axis) { float jerk = fabs(current_speed[axis]); 36e32: d3 01 movw r26, r6 36e34: 8d 90 ld r8, X+ 36e36: 9d 90 ld r9, X+ 36e38: ad 90 ld r10, X+ 36e3a: bd 90 ld r11, X+ 36e3c: 3d 01 movw r6, r26 36e3e: e8 94 clt 36e40: b7 f8 bld r11, 7 if (jerk > cs.max_jerk[axis]) { 36e42: f8 01 movw r30, r16 36e44: c1 90 ld r12, Z+ 36e46: d1 90 ld r13, Z+ 36e48: e1 90 ld r14, Z+ 36e4a: f1 90 ld r15, Z+ 36e4c: 8f 01 movw r16, r30 36e4e: a5 01 movw r20, r10 36e50: 94 01 movw r18, r8 36e52: c7 01 movw r24, r14 36e54: b6 01 movw r22, r12 36e56: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 36e5a: 87 ff sbrs r24, 7 36e5c: 3a c0 rjmp .+116 ; 0x36ed2 // The actual jerk is lower, if it has been limited by the XY jerk. if (limited) { 36e5e: fd a9 ldd r31, Y+53 ; 0x35 36e60: ff 23 and r31, r31 36e62: 09 f4 brne .+2 ; 0x36e66 36e64: 7e c6 rjmp .+3324 ; 0x37b62 // 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; 36e66: 29 a5 ldd r18, Y+41 ; 0x29 36e68: 3d a5 ldd r19, Y+45 ; 0x2d 36e6a: 49 a9 ldd r20, Y+49 ; 0x31 36e6c: 59 ad ldd r21, Y+57 ; 0x39 36e6e: c5 01 movw r24, r10 36e70: b4 01 movw r22, r8 36e72: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36e76: 4b 01 movw r8, r22 36e78: 5c 01 movw r10, r24 float mjerk = cs.max_jerk[axis] * block->nominal_speed; 36e7a: a7 01 movw r20, r14 36e7c: 96 01 movw r18, r12 36e7e: 27 96 adiw r28, 0x07 ; 7 36e80: 6f ad ldd r22, Y+63 ; 0x3f 36e82: 27 97 sbiw r28, 0x07 ; 7 36e84: 2b 96 adiw r28, 0x0b ; 11 36e86: 7f ad ldd r23, Y+63 ; 0x3f 36e88: 2b 97 sbiw r28, 0x0b ; 11 36e8a: 2f 96 adiw r28, 0x0f ; 15 36e8c: 8f ad ldd r24, Y+63 ; 0x3f 36e8e: 2f 97 sbiw r28, 0x0f ; 15 36e90: 63 96 adiw r28, 0x13 ; 19 36e92: 9f ad ldd r25, Y+63 ; 0x3f 36e94: 63 97 sbiw r28, 0x13 ; 19 36e96: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36e9a: 6b 01 movw r12, r22 36e9c: 7c 01 movw r14, r24 if (jerk > mjerk) { 36e9e: ac 01 movw r20, r24 36ea0: 9b 01 movw r18, r22 36ea2: c5 01 movw r24, r10 36ea4: b4 01 movw r22, r8 36ea6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 36eaa: 18 16 cp r1, r24 36eac: 94 f4 brge .+36 ; 0x36ed2 safe_speed *= mjerk / jerk; 36eae: a5 01 movw r20, r10 36eb0: 94 01 movw r18, r8 36eb2: c7 01 movw r24, r14 36eb4: b6 01 movw r22, r12 36eb6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36eba: 9b 01 movw r18, r22 36ebc: ac 01 movw r20, r24 36ebe: 69 a5 ldd r22, Y+41 ; 0x29 36ec0: 7d a5 ldd r23, Y+45 ; 0x2d 36ec2: 89 a9 ldd r24, Y+49 ; 0x31 36ec4: 99 ad ldd r25, Y+57 ; 0x39 36ec6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 36eca: 69 a7 std Y+41, r22 ; 0x29 36ecc: 7d a7 std Y+45, r23 ; 0x2d 36ece: 89 ab std Y+49, r24 ; 0x31 36ed0: 99 af std Y+57, r25 ; 0x39 // 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) { 36ed2: 46 14 cp r4, r6 36ed4: 57 04 cpc r5, r7 36ed6: 09 f0 breq .+2 ; 0x36eda 36ed8: ac cf rjmp .-168 ; 0x36e32 } } } // Reset the block flag. block->flag = 0; 36eda: 8e e6 ldi r24, 0x6E ; 110 36edc: 82 9d mul r24, r2 36ede: f0 01 movw r30, r0 36ee0: 83 9d mul r24, r3 36ee2: f0 0d add r31, r0 36ee4: 11 24 eor r1, r1 36ee6: ec 53 subi r30, 0x3C ; 60 36ee8: f9 4f sbci r31, 0xF9 ; 249 36eea: 15 aa std Z+53, r1 ; 0x35 if (plan_reset_next_e_sched) 36eec: 80 91 b6 04 lds r24, 0x04B6 ; 0x8004b6 <_ZL23plan_reset_next_e_sched.lto_priv.489> 36ef0: 88 23 and r24, r24 36ef2: 21 f0 breq .+8 ; 0x36efc { // finally propagate a pending reset block->flag |= BLOCK_FLAG_E_RESET; 36ef4: 80 e1 ldi r24, 0x10 ; 16 36ef6: 85 ab std Z+53, r24 ; 0x35 plan_reset_next_e_sched = false; 36ef8: 10 92 b6 04 sts 0x04B6, r1 ; 0x8004b6 <_ZL23plan_reset_next_e_sched.lto_priv.489> 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) { 36efc: 3d ad ldd r19, Y+61 ; 0x3d 36efe: 32 30 cpi r19, 0x02 ; 2 36f00: 08 f4 brcc .+2 ; 0x36f04 36f02: 8f c6 rjmp .+3358 ; 0x37c22 36f04: 40 91 b8 04 lds r20, 0x04B8 ; 0x8004b8 <_ZL22previous_nominal_speed.lto_priv.490> 36f08: 6b 96 adiw r28, 0x1b ; 27 36f0a: 4f af std Y+63, r20 ; 0x3f 36f0c: 6b 97 sbiw r28, 0x1b ; 27 36f0e: 50 91 b9 04 lds r21, 0x04B9 ; 0x8004b9 <_ZL22previous_nominal_speed.lto_priv.490+0x1> 36f12: 6d 96 adiw r28, 0x1d ; 29 36f14: 5f af std Y+63, r21 ; 0x3f 36f16: 6d 97 sbiw r28, 0x1d ; 29 36f18: 00 91 ba 04 lds r16, 0x04BA ; 0x8004ba <_ZL22previous_nominal_speed.lto_priv.490+0x2> 36f1c: 10 91 bb 04 lds r17, 0x04BB ; 0x8004bb <_ZL22previous_nominal_speed.lto_priv.490+0x3> 36f20: 27 e1 ldi r18, 0x17 ; 23 36f22: 37 eb ldi r19, 0xB7 ; 183 36f24: 41 ed ldi r20, 0xD1 ; 209 36f26: 58 e3 ldi r21, 0x38 ; 56 36f28: 6b 96 adiw r28, 0x1b ; 27 36f2a: 6f ad ldd r22, Y+63 ; 0x3f 36f2c: 6b 97 sbiw r28, 0x1b ; 27 36f2e: 6d 96 adiw r28, 0x1d ; 29 36f30: 7f ad ldd r23, Y+63 ; 0x3f 36f32: 6d 97 sbiw r28, 0x1d ; 29 36f34: c8 01 movw r24, r16 36f36: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 36f3a: 18 16 cp r1, r24 36f3c: 0c f0 brlt .+2 ; 0x36f40 36f3e: 71 c6 rjmp .+3298 ; 0x37c22 // 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); 36f40: 6b 96 adiw r28, 0x1b ; 27 36f42: 2f ad ldd r18, Y+63 ; 0x3f 36f44: 6b 97 sbiw r28, 0x1b ; 27 36f46: 6d 96 adiw r28, 0x1d ; 29 36f48: 3f ad ldd r19, Y+63 ; 0x3f 36f4a: 6d 97 sbiw r28, 0x1d ; 29 36f4c: a8 01 movw r20, r16 36f4e: 27 96 adiw r28, 0x07 ; 7 36f50: 6f ad ldd r22, Y+63 ; 0x3f 36f52: 27 97 sbiw r28, 0x07 ; 7 36f54: 2b 96 adiw r28, 0x0b ; 11 36f56: 7f ad ldd r23, Y+63 ; 0x3f 36f58: 2b 97 sbiw r28, 0x0b ; 11 36f5a: 2f 96 adiw r28, 0x0f ; 15 36f5c: 8f ad ldd r24, Y+63 ; 0x3f 36f5e: 2f 97 sbiw r28, 0x0f ; 15 36f60: 63 96 adiw r28, 0x13 ; 19 36f62: 9f ad ldd r25, Y+63 ; 0x3f 36f64: 63 97 sbiw r28, 0x13 ; 19 36f66: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 36f6a: 87 ff sbrs r24, 7 36f6c: 01 c6 rjmp .+3074 ; 0x37b70 36f6e: 6b 96 adiw r28, 0x1b ; 27 36f70: 2f ad ldd r18, Y+63 ; 0x3f 36f72: 6b 97 sbiw r28, 0x1b ; 27 36f74: 6d 96 adiw r28, 0x1d ; 29 36f76: 3f ad ldd r19, Y+63 ; 0x3f 36f78: 6d 97 sbiw r28, 0x1d ; 29 36f7a: a8 01 movw r20, r16 36f7c: 27 96 adiw r28, 0x07 ; 7 36f7e: 6f ad ldd r22, Y+63 ; 0x3f 36f80: 27 97 sbiw r28, 0x07 ; 7 36f82: 2b 96 adiw r28, 0x0b ; 11 36f84: 7f ad ldd r23, Y+63 ; 0x3f 36f86: 2b 97 sbiw r28, 0x0b ; 11 36f88: 2f 96 adiw r28, 0x0f ; 15 36f8a: 8f ad ldd r24, Y+63 ; 0x3f 36f8c: 2f 97 sbiw r28, 0x0f ; 15 36f8e: 63 96 adiw r28, 0x13 ; 19 36f90: 9f ad ldd r25, Y+63 ; 0x3f 36f92: 63 97 sbiw r28, 0x13 ; 19 36f94: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 36f98: ec 96 adiw r28, 0x3c ; 60 36f9a: 6c af std Y+60, r22 ; 0x3c 36f9c: 7d af std Y+61, r23 ; 0x3d 36f9e: 8e af std Y+62, r24 ; 0x3e 36fa0: 9f af std Y+63, r25 ; 0x3f 36fa2: ec 97 sbiw r28, 0x3c ; 60 // 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; 36fa4: 27 96 adiw r28, 0x07 ; 7 36fa6: 8f ad ldd r24, Y+63 ; 0x3f 36fa8: 27 97 sbiw r28, 0x07 ; 7 36faa: 8d af std Y+61, r24 ; 0x3d 36fac: 2b 96 adiw r28, 0x0b ; 11 36fae: 9f ad ldd r25, Y+63 ; 0x3f 36fb0: 2b 97 sbiw r28, 0x0b ; 11 36fb2: 9d ab std Y+53, r25 ; 0x35 36fb4: 2f 96 adiw r28, 0x0f ; 15 36fb6: af ad ldd r26, Y+63 ; 0x3f 36fb8: 2f 97 sbiw r28, 0x0f ; 15 36fba: ae af std Y+62, r26 ; 0x3e 36fbc: 63 96 adiw r28, 0x13 ; 19 36fbe: bf ad ldd r27, Y+63 ; 0x3f 36fc0: 63 97 sbiw r28, 0x13 ; 19 36fc2: 23 96 adiw r28, 0x03 ; 3 36fc4: bf af std Y+63, r27 ; 0x3f 36fc6: 23 97 sbiw r28, 0x03 ; 3 36fc8: 2c eb ldi r18, 0xBC ; 188 36fca: 34 e0 ldi r19, 0x04 ; 4 36fcc: e8 96 adiw r28, 0x38 ; 56 36fce: 3f af std Y+63, r19 ; 0x3f 36fd0: 2e af std Y+62, r18 ; 0x3e 36fd2: e8 97 sbiw r28, 0x38 ; 56 // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. float v_factor = 1.f; 36fd4: 41 2c mov r4, r1 36fd6: 51 2c mov r5, r1 36fd8: 30 e8 ldi r19, 0x80 ; 128 36fda: 63 2e mov r6, r19 36fdc: 3f e3 ldi r19, 0x3F ; 63 36fde: 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]; 36fe0: e8 96 adiw r28, 0x38 ; 56 36fe2: ae ad ldd r26, Y+62 ; 0x3e 36fe4: bf ad ldd r27, Y+63 ; 0x3f 36fe6: e8 97 sbiw r28, 0x38 ; 56 36fe8: 8d 90 ld r8, X+ 36fea: 9d 90 ld r9, X+ 36fec: ad 90 ld r10, X+ 36fee: bd 90 ld r11, X+ 36ff0: e8 96 adiw r28, 0x38 ; 56 36ff2: bf af std Y+63, r27 ; 0x3f 36ff4: ae af std Y+62, r26 ; 0x3e 36ff6: e8 97 sbiw r28, 0x38 ; 56 float v_entry = current_speed [axis]; 36ff8: a0 96 adiw r28, 0x20 ; 32 36ffa: ee ad ldd r30, Y+62 ; 0x3e 36ffc: ff ad ldd r31, Y+63 ; 0x3f 36ffe: a0 97 sbiw r28, 0x20 ; 32 37000: c1 90 ld r12, Z+ 37002: d1 90 ld r13, Z+ 37004: e1 90 ld r14, Z+ 37006: f1 90 ld r15, Z+ 37008: a0 96 adiw r28, 0x20 ; 32 3700a: ff af std Y+63, r31 ; 0x3f 3700c: ee af std Y+62, r30 ; 0x3e 3700e: a0 97 sbiw r28, 0x20 ; 32 if (prev_speed_larger) 37010: 6b 96 adiw r28, 0x1b ; 27 37012: 2f ad ldd r18, Y+63 ; 0x3f 37014: 6b 97 sbiw r28, 0x1b ; 27 37016: 6d 96 adiw r28, 0x1d ; 29 37018: 3f ad ldd r19, Y+63 ; 0x3f 3701a: 6d 97 sbiw r28, 0x1d ; 29 3701c: a8 01 movw r20, r16 3701e: 27 96 adiw r28, 0x07 ; 7 37020: 6f ad ldd r22, Y+63 ; 0x3f 37022: 27 97 sbiw r28, 0x07 ; 7 37024: 2b 96 adiw r28, 0x0b ; 11 37026: 7f ad ldd r23, Y+63 ; 0x3f 37028: 2b 97 sbiw r28, 0x0b ; 11 3702a: 2f 96 adiw r28, 0x0f ; 15 3702c: 8f ad ldd r24, Y+63 ; 0x3f 3702e: 2f 97 sbiw r28, 0x0f ; 15 37030: 63 96 adiw r28, 0x13 ; 19 37032: 9f ad ldd r25, Y+63 ; 0x3f 37034: 63 97 sbiw r28, 0x13 ; 19 37036: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 3703a: 87 ff sbrs r24, 7 3703c: 0c c0 rjmp .+24 ; 0x37056 v_exit *= smaller_speed_factor; 3703e: ec 96 adiw r28, 0x3c ; 60 37040: 2c ad ldd r18, Y+60 ; 0x3c 37042: 3d ad ldd r19, Y+61 ; 0x3d 37044: 4e ad ldd r20, Y+62 ; 0x3e 37046: 5f ad ldd r21, Y+63 ; 0x3f 37048: ec 97 sbiw r28, 0x3c ; 60 3704a: c5 01 movw r24, r10 3704c: b4 01 movw r22, r8 3704e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37052: 4b 01 movw r8, r22 37054: 5c 01 movw r10, r24 if (limited) { 37056: a2 96 adiw r28, 0x22 ; 34 37058: ff ad ldd r31, Y+63 ; 0x3f 3705a: a2 97 sbiw r28, 0x22 ; 34 3705c: ff 23 and r31, r31 3705e: 81 f0 breq .+32 ; 0x37080 v_exit *= v_factor; 37060: a3 01 movw r20, r6 37062: 92 01 movw r18, r4 37064: c5 01 movw r24, r10 37066: b4 01 movw r22, r8 37068: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3706c: 4b 01 movw r8, r22 3706e: 5c 01 movw r10, r24 v_entry *= v_factor; 37070: a3 01 movw r20, r6 37072: 92 01 movw r18, r4 37074: c7 01 movw r24, r14 37076: b6 01 movw r22, r12 37078: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3707c: 6b 01 movw r12, r22 3707e: 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) ? 37080: a7 01 movw r20, r14 37082: 96 01 movw r18, r12 37084: c5 01 movw r24, r10 37086: b4 01 movw r22, r8 37088: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> ((v_entry > 0.f || v_exit < 0.f) ? 3708c: 20 e0 ldi r18, 0x00 ; 0 3708e: 30 e0 ldi r19, 0x00 ; 0 37090: 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) ? 37092: 18 16 cp r1, r24 37094: 0c f0 brlt .+2 ; 0x37098 37096: a3 c5 rjmp .+2886 ; 0x37bde ((v_entry > 0.f || v_exit < 0.f) ? 37098: c7 01 movw r24, r14 3709a: b6 01 movw r22, r12 3709c: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 370a0: 18 16 cp r1, r24 370a2: 4c f0 brlt .+18 ; 0x370b6 370a4: 20 e0 ldi r18, 0x00 ; 0 370a6: 30 e0 ldi r19, 0x00 ; 0 370a8: a9 01 movw r20, r18 370aa: c5 01 movw r24, r10 370ac: b4 01 movw r22, r8 370ae: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 370b2: 87 ff sbrs r24, 7 370b4: 85 c5 rjmp .+2826 ; 0x37bc0 370b6: a7 01 movw r20, r14 370b8: 96 01 movw r18, r12 370ba: c5 01 movw r24, r10 370bc: 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) ? 370be: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 370c2: 6b 01 movw r12, r22 370c4: 7c 01 movw r14, r24 // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); if (jerk > cs.max_jerk[axis]) { 370c6: ee 96 adiw r28, 0x3e ; 62 370c8: ae ad ldd r26, Y+62 ; 0x3e 370ca: bf ad ldd r27, Y+63 ; 0x3f 370cc: ee 97 sbiw r28, 0x3e ; 62 370ce: 8d 90 ld r8, X+ 370d0: 9d 90 ld r9, X+ 370d2: ad 90 ld r10, X+ 370d4: bd 90 ld r11, X+ 370d6: ee 96 adiw r28, 0x3e ; 62 370d8: bf af std Y+63, r27 ; 0x3f 370da: ae af std Y+62, r26 ; 0x3e 370dc: ee 97 sbiw r28, 0x3e ; 62 370de: a5 01 movw r20, r10 370e0: 94 01 movw r18, r8 370e2: c7 01 movw r24, r14 370e4: b6 01 movw r22, r12 370e6: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 370ea: 18 16 cp r1, r24 370ec: 94 f4 brge .+36 ; 0x37112 v_factor *= cs.max_jerk[axis] / jerk; 370ee: a7 01 movw r20, r14 370f0: 96 01 movw r18, r12 370f2: c5 01 movw r24, r10 370f4: b4 01 movw r22, r8 370f6: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 370fa: 9b 01 movw r18, r22 370fc: ac 01 movw r20, r24 370fe: c3 01 movw r24, r6 37100: b2 01 movw r22, r4 37102: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37106: 2b 01 movw r4, r22 37108: 3c 01 movw r6, r24 limited = true; 3710a: b1 e0 ldi r27, 0x01 ; 1 3710c: a2 96 adiw r28, 0x22 ; 34 3710e: bf af std Y+63, r27 ; 0x3f 37110: a2 97 sbiw r28, 0x22 ; 34 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) { 37112: ec ec ldi r30, 0xCC ; 204 37114: f4 e0 ldi r31, 0x04 ; 4 37116: e8 96 adiw r28, 0x38 ; 56 37118: 2e ad ldd r18, Y+62 ; 0x3e 3711a: 3f ad ldd r19, Y+63 ; 0x3f 3711c: e8 97 sbiw r28, 0x38 ; 56 3711e: e2 17 cp r30, r18 37120: f3 07 cpc r31, r19 37122: 09 f0 breq .+2 ; 0x37126 37124: 5d cf rjmp .-326 ; 0x36fe0 if (jerk > cs.max_jerk[axis]) { v_factor *= cs.max_jerk[axis] / jerk; limited = true; } } if (limited) 37126: a2 96 adiw r28, 0x22 ; 34 37128: 3f ad ldd r19, Y+63 ; 0x3f 3712a: a2 97 sbiw r28, 0x22 ; 34 3712c: 33 23 and r19, r19 3712e: 81 f0 breq .+32 ; 0x37150 vmax_junction *= v_factor; 37130: a3 01 movw r20, r6 37132: 92 01 movw r18, r4 37134: 6d ad ldd r22, Y+61 ; 0x3d 37136: 7d a9 ldd r23, Y+53 ; 0x35 37138: 8e ad ldd r24, Y+62 ; 0x3e 3713a: 23 96 adiw r28, 0x03 ; 3 3713c: 9f ad ldd r25, Y+63 ; 0x3f 3713e: 23 97 sbiw r28, 0x03 ; 3 37140: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37144: 6d af std Y+61, r22 ; 0x3d 37146: 7d ab std Y+53, r23 ; 0x35 37148: 8e af std Y+62, r24 ; 0x3e 3714a: 23 96 adiw r28, 0x03 ; 3 3714c: 9f af std Y+63, r25 ; 0x3f 3714e: 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; 37150: 24 ea ldi r18, 0xA4 ; 164 37152: 30 e7 ldi r19, 0x70 ; 112 37154: 4d e7 ldi r20, 0x7D ; 125 37156: 5f e3 ldi r21, 0x3F ; 63 37158: 6d ad ldd r22, Y+61 ; 0x3d 3715a: 7d a9 ldd r23, Y+53 ; 0x35 3715c: 8e ad ldd r24, Y+62 ; 0x3e 3715e: 23 96 adiw r28, 0x03 ; 3 37160: 9f ad ldd r25, Y+63 ; 0x3f 37162: 23 97 sbiw r28, 0x03 ; 3 37164: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37168: 6b 01 movw r12, r22 3716a: 7c 01 movw r14, r24 if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) { 3716c: ac 01 movw r20, r24 3716e: 9b 01 movw r18, r22 37170: 60 91 0f 18 lds r22, 0x180F ; 0x80180f 37174: 70 91 10 18 lds r23, 0x1810 ; 0x801810 37178: 80 91 11 18 lds r24, 0x1811 ; 0x801811 3717c: 90 91 12 18 lds r25, 0x1812 ; 0x801812 37180: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37184: 18 16 cp r1, r24 37186: fc f4 brge .+62 ; 0x371c6 37188: 29 a5 ldd r18, Y+41 ; 0x29 3718a: 3d a5 ldd r19, Y+45 ; 0x2d 3718c: 49 a9 ldd r20, Y+49 ; 0x31 3718e: 59 ad ldd r21, Y+57 ; 0x39 37190: c7 01 movw r24, r14 37192: b6 01 movw r22, r12 37194: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37198: 87 ff sbrs r24, 7 3719a: 15 c0 rjmp .+42 ; 0x371c6 // 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; 3719c: 8e e6 ldi r24, 0x6E ; 110 3719e: 82 9d mul r24, r2 371a0: f0 01 movw r30, r0 371a2: 83 9d mul r24, r3 371a4: f0 0d add r31, r0 371a6: 11 24 eor r1, r1 371a8: ec 53 subi r30, 0x3C ; 60 371aa: f9 4f sbci r31, 0xF9 ; 249 371ac: 85 a9 ldd r24, Z+53 ; 0x35 371ae: 84 60 ori r24, 0x04 ; 4 371b0: 85 ab std Z+53, r24 ; 0x35 371b2: 49 a5 ldd r20, Y+41 ; 0x29 371b4: 4d af std Y+61, r20 ; 0x3d 371b6: 5d a5 ldd r21, Y+45 ; 0x2d 371b8: 5d ab std Y+53, r21 ; 0x35 371ba: 89 a9 ldd r24, Y+49 ; 0x31 371bc: 8e af std Y+62, r24 ; 0x3e 371be: 99 ad ldd r25, Y+57 ; 0x39 371c0: 23 96 adiw r28, 0x03 ; 3 371c2: 9f af std Y+63, r25 ; 0x3f 371c4: 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; 371c6: 8e e6 ldi r24, 0x6E ; 110 371c8: 82 9d mul r24, r2 371ca: 80 01 movw r16, r0 371cc: 83 9d mul r24, r3 371ce: 10 0d add r17, r0 371d0: 11 24 eor r1, r1 371d2: 0c 53 subi r16, 0x3C ; 60 371d4: 19 4f sbci r17, 0xF9 ; 249 371d6: 8d ad ldd r24, Y+61 ; 0x3d 371d8: 9d a9 ldd r25, Y+53 ; 0x35 371da: ae ad ldd r26, Y+62 ; 0x3e 371dc: 23 96 adiw r28, 0x03 ; 3 371de: bf ad ldd r27, Y+63 ; 0x3f 371e0: 23 97 sbiw r28, 0x03 ; 3 371e2: f8 01 movw r30, r16 371e4: 81 a7 std Z+41, r24 ; 0x29 371e6: 92 a7 std Z+42, r25 ; 0x2a 371e8: a3 a7 std Z+43, r26 ; 0x2b 371ea: 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); 371ec: 29 a5 ldd r18, Y+41 ; 0x29 371ee: 3d a5 ldd r19, Y+45 ; 0x2d 371f0: 49 a9 ldd r20, Y+49 ; 0x31 371f2: 59 ad ldd r21, Y+57 ; 0x39 371f4: 69 a5 ldd r22, Y+41 ; 0x29 371f6: 7d a5 ldd r23, Y+45 ; 0x2d 371f8: 89 a9 ldd r24, Y+49 ; 0x31 371fa: 99 ad ldd r25, Y+57 ; 0x39 371fc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37200: 6b 01 movw r12, r22 37202: 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); 37204: e2 96 adiw r28, 0x32 ; 50 37206: 6c ad ldd r22, Y+60 ; 0x3c 37208: 7d ad ldd r23, Y+61 ; 0x3d 3720a: 8e ad ldd r24, Y+62 ; 0x3e 3720c: 9f ad ldd r25, Y+63 ; 0x3f 3720e: e2 97 sbiw r28, 0x32 ; 50 37210: 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); 37212: 9b 01 movw r18, r22 37214: ac 01 movw r20, r24 37216: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3721a: d8 01 movw r26, r16 3721c: 9d 96 adiw r26, 0x2d ; 45 3721e: 2d 91 ld r18, X+ 37220: 3d 91 ld r19, X+ 37222: 4d 91 ld r20, X+ 37224: 5c 91 ld r21, X 37226: d0 97 sbiw r26, 0x30 ; 48 37228: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3722c: 9b 01 movw r18, r22 3722e: ac 01 movw r20, r24 37230: c7 01 movw r24, r14 37232: b6 01 movw r22, r12 37234: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 37238: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 3723c: d6 2e mov r13, r22 3723e: e7 2e mov r14, r23 37240: 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); 37242: 2d ad ldd r18, Y+61 ; 0x3d 37244: 3d a9 ldd r19, Y+53 ; 0x35 37246: 4e ad ldd r20, Y+62 ; 0x3e 37248: 23 96 adiw r28, 0x03 ; 3 3724a: 5f ad ldd r21, Y+63 ; 0x3f 3724c: 23 97 sbiw r28, 0x03 ; 3 3724e: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37252: 18 16 cp r1, r24 37254: 34 f0 brlt .+12 ; 0x37262 37256: dd ae std Y+61, r13 ; 0x3d 37258: ed aa std Y+53, r14 ; 0x35 3725a: 0e af std Y+62, r16 ; 0x3e 3725c: 23 96 adiw r28, 0x03 ; 3 3725e: 1f af std Y+63, r17 ; 0x3f 37260: 23 97 sbiw r28, 0x03 ; 3 37262: 8e e6 ldi r24, 0x6E ; 110 37264: 82 9d mul r24, r2 37266: f0 01 movw r30, r0 37268: 83 9d mul r24, r3 3726a: f0 0d add r31, r0 3726c: 11 24 eor r1, r1 3726e: ec 53 subi r30, 0x3C ; 60 37270: f9 4f sbci r31, 0xF9 ; 249 37272: 8d ad ldd r24, Y+61 ; 0x3d 37274: 9d a9 ldd r25, Y+53 ; 0x35 37276: ae ad ldd r26, Y+62 ; 0x3e 37278: 23 96 adiw r28, 0x03 ; 3 3727a: bf ad ldd r27, Y+63 ; 0x3f 3727c: 23 97 sbiw r28, 0x03 ; 3 3727e: 85 a3 std Z+37, r24 ; 0x25 37280: 96 a3 std Z+38, r25 ; 0x26 37282: a7 a3 std Z+39, r26 ; 0x27 37284: 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; 37286: f5 a8 ldd r15, Z+53 ; 0x35 37288: 2d 2d mov r18, r13 3728a: 3e 2d mov r19, r14 3728c: a8 01 movw r20, r16 3728e: 27 96 adiw r28, 0x07 ; 7 37290: 6f ad ldd r22, Y+63 ; 0x3f 37292: 27 97 sbiw r28, 0x07 ; 7 37294: 2b 96 adiw r28, 0x0b ; 11 37296: 7f ad ldd r23, Y+63 ; 0x3f 37298: 2b 97 sbiw r28, 0x0b ; 11 3729a: 2f 96 adiw r28, 0x0f ; 15 3729c: 8f ad ldd r24, Y+63 ; 0x3f 3729e: 2f 97 sbiw r28, 0x0f ; 15 372a0: 63 96 adiw r28, 0x13 ; 19 372a2: 9f ad ldd r25, Y+63 ; 0x3f 372a4: 63 97 sbiw r28, 0x13 ; 19 372a6: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 372aa: 18 16 cp r1, r24 372ac: 0c f4 brge .+2 ; 0x372b0 372ae: cf c4 rjmp .+2462 ; 0x37c4e 372b0: 83 e0 ldi r24, 0x03 ; 3 372b2: 9e e6 ldi r25, 0x6E ; 110 372b4: 92 9d mul r25, r2 372b6: 80 01 movw r16, r0 372b8: 93 9d mul r25, r3 372ba: 10 0d add r17, r0 372bc: 11 24 eor r1, r1 372be: 0c 53 subi r16, 0x3C ; 60 372c0: 19 4f sbci r17, 0xF9 ; 249 372c2: f8 2a or r15, r24 372c4: f8 01 movw r30, r16 372c6: 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[] 372c8: 80 e1 ldi r24, 0x10 ; 16 372ca: fe 01 movw r30, r28 372cc: 71 96 adiw r30, 0x11 ; 17 372ce: ac eb ldi r26, 0xBC ; 188 372d0: b4 e0 ldi r27, 0x04 ; 4 372d2: 01 90 ld r0, Z+ 372d4: 0d 92 st X+, r0 372d6: 8a 95 dec r24 372d8: e1 f7 brne .-8 ; 0x372d2 previous_nominal_speed = block->nominal_speed; 372da: 27 96 adiw r28, 0x07 ; 7 372dc: 8f ad ldd r24, Y+63 ; 0x3f 372de: 27 97 sbiw r28, 0x07 ; 7 372e0: 2b 96 adiw r28, 0x0b ; 11 372e2: 9f ad ldd r25, Y+63 ; 0x3f 372e4: 2b 97 sbiw r28, 0x0b ; 11 372e6: 2f 96 adiw r28, 0x0f ; 15 372e8: af ad ldd r26, Y+63 ; 0x3f 372ea: 2f 97 sbiw r28, 0x0f ; 15 372ec: 63 96 adiw r28, 0x13 ; 19 372ee: bf ad ldd r27, Y+63 ; 0x3f 372f0: 63 97 sbiw r28, 0x13 ; 19 372f2: 80 93 b8 04 sts 0x04B8, r24 ; 0x8004b8 <_ZL22previous_nominal_speed.lto_priv.490> 372f6: 90 93 b9 04 sts 0x04B9, r25 ; 0x8004b9 <_ZL22previous_nominal_speed.lto_priv.490+0x1> 372fa: a0 93 ba 04 sts 0x04BA, r26 ; 0x8004ba <_ZL22previous_nominal_speed.lto_priv.490+0x2> 372fe: b0 93 bb 04 sts 0x04BB, r27 ; 0x8004bb <_ZL22previous_nominal_speed.lto_priv.490+0x3> previous_safe_speed = safe_speed; 37302: 89 a5 ldd r24, Y+41 ; 0x29 37304: 9d a5 ldd r25, Y+45 ; 0x2d 37306: a9 a9 ldd r26, Y+49 ; 0x31 37308: b9 ad ldd r27, Y+57 ; 0x39 3730a: 80 93 0f 18 sts 0x180F, r24 ; 0x80180f 3730e: 90 93 10 18 sts 0x1810, r25 ; 0x801810 37312: a0 93 11 18 sts 0x1811, r26 ; 0x801811 37316: b0 93 12 18 sts 0x1812, r27 ; 0x801812 // 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; 3731a: d8 01 movw r26, r16 3731c: d6 96 adiw r26, 0x36 ; 54 3731e: 6d 91 ld r22, X+ 37320: 7d 91 ld r23, X+ 37322: 8d 91 ld r24, X+ 37324: 9c 91 ld r25, X 37326: d9 97 sbiw r26, 0x39 ; 57 37328: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 3732c: 27 96 adiw r28, 0x07 ; 7 3732e: 2f ad ldd r18, Y+63 ; 0x3f 37330: 27 97 sbiw r28, 0x07 ; 7 37332: 2b 96 adiw r28, 0x0b ; 11 37334: 3f ad ldd r19, Y+63 ; 0x3f 37336: 2b 97 sbiw r28, 0x0b ; 11 37338: 2f 96 adiw r28, 0x0f ; 15 3733a: 4f ad ldd r20, Y+63 ; 0x3f 3733c: 2f 97 sbiw r28, 0x0f ; 15 3733e: 63 96 adiw r28, 0x13 ; 19 37340: 5f ad ldd r21, Y+63 ; 0x3f 37342: 63 97 sbiw r28, 0x13 ; 19 37344: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37348: 2b 01 movw r4, r22 3734a: 3c 01 movw r6, r24 3734c: f8 01 movw r30, r16 3734e: e8 5b subi r30, 0xB8 ; 184 37350: ff 4f sbci r31, 0xFF ; 255 37352: 40 82 st Z, r4 37354: 51 82 std Z+1, r5 ; 0x01 37356: 62 82 std Z+2, r6 ; 0x02 37358: 73 82 std Z+3, r7 ; 0x03 #ifdef LIN_ADVANCE if (block->use_advance_lead) { 3735a: 34 96 adiw r30, 0x04 ; 4 3735c: 80 81 ld r24, Z 3735e: 88 23 and r24, r24 37360: 09 f4 brne .+2 ; 0x37364 37362: 89 c0 rjmp .+274 ; 0x37476 // 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)) 37364: 20 91 64 05 lds r18, 0x0564 ; 0x800564 37368: 30 91 65 05 lds r19, 0x0565 ; 0x800565 3736c: 40 91 66 05 lds r20, 0x0566 ; 0x800566 37370: 50 91 67 05 lds r21, 0x0567 ; 0x800567 37374: 6a 96 adiw r28, 0x1a ; 26 37376: 6c ad ldd r22, Y+60 ; 0x3c 37378: 7d ad ldd r23, Y+61 ; 0x3d 3737a: 8e ad ldd r24, Y+62 ; 0x3e 3737c: 9f ad ldd r25, Y+63 ; 0x3f 3737e: 6a 97 sbiw r28, 0x1a ; 26 37380: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37384: 4b 01 movw r8, r22 37386: 5c 01 movw r10, r24 37388: c0 90 cd 0d lds r12, 0x0DCD ; 0x800dcd 3738c: d0 90 ce 0d lds r13, 0x0DCE ; 0x800dce 37390: e0 90 cf 0d lds r14, 0x0DCF ; 0x800dcf 37394: f0 90 d0 0d lds r15, 0x0DD0 ; 0x800dd0 block->adv_comp = adv_comp / block->speed_factor; // step/(step/min) 37398: 0c 5a subi r16, 0xAC ; 172 3739a: 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)) 3739c: a7 01 movw r20, r14 3739e: 96 01 movw r18, r12 373a0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> block->adv_comp = adv_comp / block->speed_factor; // step/(step/min) 373a4: a3 01 movw r20, r6 373a6: 92 01 movw r18, r4 373a8: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 373ac: f8 01 movw r30, r16 373ae: 60 83 st Z, r22 373b0: 71 83 std Z+1, r23 ; 0x01 373b2: 82 83 std Z+2, r24 ; 0x02 373b4: 93 83 std Z+3, r25 ; 0x03 float advance_speed; if (e_D_ratio > 0) 373b6: 20 e0 ldi r18, 0x00 ; 0 373b8: 30 e0 ldi r19, 0x00 ; 0 373ba: a9 01 movw r20, r18 373bc: 6a 96 adiw r28, 0x1a ; 26 373be: 6c ad ldd r22, Y+60 ; 0x3c 373c0: 7d ad ldd r23, Y+61 ; 0x3d 373c2: 8e ad ldd r24, Y+62 ; 0x3e 373c4: 9f ad ldd r25, Y+63 ; 0x3f 373c6: 6a 97 sbiw r28, 0x1a ; 26 373c8: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 373cc: 18 16 cp r1, r24 373ce: 0c f0 brlt .+2 ; 0x373d2 373d0: 40 c4 rjmp .+2176 ; 0x37c52 advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_mm[E_AXIS]); 373d2: a5 01 movw r20, r10 373d4: 94 01 movw r18, r8 373d6: e2 96 adiw r28, 0x32 ; 50 373d8: 6c ad ldd r22, Y+60 ; 0x3c 373da: 7d ad ldd r23, Y+61 ; 0x3d 373dc: 8e ad ldd r24, Y+62 ; 0x3e 373de: 9f ad ldd r25, Y+63 ; 0x3f 373e0: e2 97 sbiw r28, 0x32 ; 50 373e2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 373e6: a7 01 movw r20, r14 373e8: 96 01 movw r18, r12 else advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_mm[E_AXIS]; 373ea: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 373ee: 6b 01 movw r12, r22 373f0: 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; 373f2: 20 e0 ldi r18, 0x00 ; 0 373f4: 30 e4 ldi r19, 0x40 ; 64 373f6: 4c e1 ldi r20, 0x1C ; 28 373f8: 57 e4 ldi r21, 0x47 ; 71 373fa: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 373fe: 18 16 cp r1, r24 37400: 3c f4 brge .+14 ; 0x37410 37402: c1 2c mov r12, r1 37404: 20 e4 ldi r18, 0x40 ; 64 37406: d2 2e mov r13, r18 37408: 2c e1 ldi r18, 0x1C ; 28 3740a: e2 2e mov r14, r18 3740c: 27 e4 ldi r18, 0x47 ; 71 3740e: f2 2e mov r15, r18 float advance_rate = (F_CPU / 8.0) / advance_speed; 37410: a7 01 movw r20, r14 37412: 96 01 movw r18, r12 37414: 60 e0 ldi r22, 0x00 ; 0 37416: 74 e2 ldi r23, 0x24 ; 36 37418: 84 ef ldi r24, 0xF4 ; 244 3741a: 99 e4 ldi r25, 0x49 ; 73 3741c: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37420: 4b 01 movw r8, r22 37422: 5c 01 movw r10, r24 if (advance_speed > 20000) { 37424: 20 e0 ldi r18, 0x00 ; 0 37426: 30 e4 ldi r19, 0x40 ; 64 37428: 4c e9 ldi r20, 0x9C ; 156 3742a: 56 e4 ldi r21, 0x46 ; 70 3742c: c7 01 movw r24, r14 3742e: b6 01 movw r22, r12 37430: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37434: 18 16 cp r1, r24 37436: 0c f0 brlt .+2 ; 0x3743a 37438: 17 c4 rjmp .+2094 ; 0x37c68 block->advance_rate = advance_rate * 4; 3743a: 8e e6 ldi r24, 0x6E ; 110 3743c: 82 9d mul r24, r2 3743e: 80 01 movw r16, r0 37440: 83 9d mul r24, r3 37442: 10 0d add r17, r0 37444: 11 24 eor r1, r1 37446: 0c 53 subi r16, 0x3C ; 60 37448: 19 4f sbci r17, 0xF9 ; 249 3744a: 78 01 movw r14, r16 3744c: fd e4 ldi r31, 0x4D ; 77 3744e: ef 0e add r14, r31 37450: f1 1c adc r15, r1 37452: 20 e0 ldi r18, 0x00 ; 0 37454: 30 e0 ldi r19, 0x00 ; 0 37456: 40 e8 ldi r20, 0x80 ; 128 37458: 50 e4 ldi r21, 0x40 ; 64 3745a: c5 01 movw r24, r10 3745c: b4 01 movw r22, r8 3745e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37462: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37466: d7 01 movw r26, r14 37468: 6d 93 st X+, r22 3746a: 7c 93 st X, r23 block->advance_step_loops = 4; 3746c: f8 01 movw r30, r16 3746e: ed 5a subi r30, 0xAD ; 173 37470: ff 4f sbci r31, 0xFF ; 255 37472: 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; 37474: 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); 37476: 09 a5 ldd r16, Y+41 ; 0x29 37478: 1d a5 ldd r17, Y+45 ; 0x2d 3747a: 29 a9 ldd r18, Y+49 ; 0x31 3747c: 39 ad ldd r19, Y+57 ; 0x39 3747e: 4d ad ldd r20, Y+61 ; 0x3d 37480: 5d a9 ldd r21, Y+53 ; 0x35 37482: 6e ad ldd r22, Y+62 ; 0x3e 37484: 23 96 adiw r28, 0x03 ; 3 37486: 7f ad ldd r23, Y+63 ; 0x3f 37488: 23 97 sbiw r28, 0x03 ; 3 3748a: a4 96 adiw r28, 0x24 ; 36 3748c: 8e ad ldd r24, Y+62 ; 0x3e 3748e: 9f ad ldd r25, Y+63 ; 0x3f 37490: a4 97 sbiw r28, 0x24 ; 36 37492: 8c 53 subi r24, 0x3C ; 60 37494: 99 4f sbci r25, 0xF9 ; 249 37496: 0f 94 49 ae call 0x35c92 ; 0x35c92 if (block->step_event_count.wide <= 32767) 3749a: 8e e6 ldi r24, 0x6E ; 110 3749c: 82 9d mul r24, r2 3749e: f0 01 movw r30, r0 374a0: 83 9d mul r24, r3 374a2: f0 0d add r31, r0 374a4: 11 24 eor r1, r1 374a6: ec 53 subi r30, 0x3C ; 60 374a8: f9 4f sbci r31, 0xF9 ; 249 374aa: 80 89 ldd r24, Z+16 ; 0x10 374ac: 91 89 ldd r25, Z+17 ; 0x11 374ae: a2 89 ldd r26, Z+18 ; 0x12 374b0: b3 89 ldd r27, Z+19 ; 0x13 374b2: 81 15 cp r24, r1 374b4: 90 48 sbci r25, 0x80 ; 128 374b6: a1 05 cpc r26, r1 374b8: b1 05 cpc r27, r1 374ba: 18 f4 brcc .+6 ; 0x374c2 block->flag |= BLOCK_FLAG_DDA_LOWRES; 374bc: 85 a9 ldd r24, Z+53 ; 0x35 374be: 88 60 ori r24, 0x08 ; 8 374c0: 85 ab std Z+53, r24 ; 0x35 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { 374c2: 8f b7 in r24, 0x3f ; 63 return 1; } static __inline__ uint8_t __iCliRetVal(void) { cli(); 374c4: 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; 374c6: 90 91 ab 0d lds r25, 0x0DAB ; 0x800dab 374ca: 91 11 cpse r25, r1 374cc: 93 c4 rjmp .+2342 ; 0x37df4 block_buffer_head = next_buffer_head; 374ce: a1 96 adiw r28, 0x21 ; 33 374d0: 3f ad ldd r19, Y+63 ; 0x3f 374d2: a1 97 sbiw r28, 0x21 ; 33 374d4: 30 93 a4 0d sts 0x0DA4, r19 ; 0x800da4 (void)__s; } static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 374d8: 8f bf out 0x3f, r24 ; 63 } // Update position memcpy(position, target, sizeof(target)); // position[] = target[] 374da: c2 58 subi r28, 0x82 ; 130 374dc: df 4f sbci r29, 0xFF ; 255 374de: 88 81 ld r24, Y 374e0: 99 81 ldd r25, Y+1 ; 0x01 374e2: aa 81 ldd r26, Y+2 ; 0x02 374e4: bb 81 ldd r27, Y+3 ; 0x03 374e6: ce 57 subi r28, 0x7E ; 126 374e8: d0 40 sbci r29, 0x00 ; 0 374ea: 80 93 a2 06 sts 0x06A2, r24 ; 0x8006a2 374ee: 90 93 a3 06 sts 0x06A3, r25 ; 0x8006a3 374f2: a0 93 a4 06 sts 0x06A4, r26 ; 0x8006a4 374f6: b0 93 a5 06 sts 0x06A5, r27 ; 0x8006a5 374fa: ce 57 subi r28, 0x7E ; 126 374fc: df 4f sbci r29, 0xFF ; 255 374fe: 28 81 ld r18, Y 37500: 39 81 ldd r19, Y+1 ; 0x01 37502: 4a 81 ldd r20, Y+2 ; 0x02 37504: 5b 81 ldd r21, Y+3 ; 0x03 37506: c2 58 subi r28, 0x82 ; 130 37508: d0 40 sbci r29, 0x00 ; 0 3750a: 20 93 a6 06 sts 0x06A6, r18 ; 0x8006a6 3750e: 30 93 a7 06 sts 0x06A7, r19 ; 0x8006a7 37512: 40 93 a8 06 sts 0x06A8, r20 ; 0x8006a8 37516: 50 93 a9 06 sts 0x06A9, r21 ; 0x8006a9 3751a: e6 96 adiw r28, 0x36 ; 54 3751c: 8c ad ldd r24, Y+60 ; 0x3c 3751e: 9d ad ldd r25, Y+61 ; 0x3d 37520: ae ad ldd r26, Y+62 ; 0x3e 37522: bf ad ldd r27, Y+63 ; 0x3f 37524: e6 97 sbiw r28, 0x36 ; 54 37526: 80 93 aa 06 sts 0x06AA, r24 ; 0x8006aa 3752a: 90 93 ab 06 sts 0x06AB, r25 ; 0x8006ab 3752e: a0 93 ac 06 sts 0x06AC, r26 ; 0x8006ac 37532: b0 93 ad 06 sts 0x06AD, r27 ; 0x8006ad 37536: ae 96 adiw r28, 0x2e ; 46 37538: 2c ad ldd r18, Y+60 ; 0x3c 3753a: 3d ad ldd r19, Y+61 ; 0x3d 3753c: 4e ad ldd r20, Y+62 ; 0x3e 3753e: 5f ad ldd r21, Y+63 ; 0x3f 37540: ae 97 sbiw r28, 0x2e ; 46 37542: 20 93 ae 06 sts 0x06AE, r18 ; 0x8006ae 37546: 30 93 af 06 sts 0x06AF, r19 ; 0x8006af 3754a: 40 93 b0 06 sts 0x06B0, r20 ; 0x8006b0 3754e: 50 93 b1 06 sts 0x06B1, r21 ; 0x8006b1 #ifdef LIN_ADVANCE position_float[X_AXIS] = x; 37552: 89 a1 ldd r24, Y+33 ; 0x21 37554: 9a a1 ldd r25, Y+34 ; 0x22 37556: ab a1 ldd r26, Y+35 ; 0x23 37558: bc a1 ldd r27, Y+36 ; 0x24 3755a: 80 93 cc 04 sts 0x04CC, r24 ; 0x8004cc 3755e: 90 93 cd 04 sts 0x04CD, r25 ; 0x8004cd 37562: a0 93 ce 04 sts 0x04CE, r26 ; 0x8004ce 37566: b0 93 cf 04 sts 0x04CF, r27 ; 0x8004cf position_float[Y_AXIS] = y; 3756a: 8d a1 ldd r24, Y+37 ; 0x25 3756c: 9e a1 ldd r25, Y+38 ; 0x26 3756e: af a1 ldd r26, Y+39 ; 0x27 37570: b8 a5 ldd r27, Y+40 ; 0x28 37572: 80 93 d0 04 sts 0x04D0, r24 ; 0x8004d0 37576: 90 93 d1 04 sts 0x04D1, r25 ; 0x8004d1 3757a: a0 93 d2 04 sts 0x04D2, r26 ; 0x8004d2 3757e: b0 93 d3 04 sts 0x04D3, r27 ; 0x8004d3 position_float[Z_AXIS] = z; 37582: a8 96 adiw r28, 0x28 ; 40 37584: 8c ad ldd r24, Y+60 ; 0x3c 37586: 9d ad ldd r25, Y+61 ; 0x3d 37588: ae ad ldd r26, Y+62 ; 0x3e 3758a: bf ad ldd r27, Y+63 ; 0x3f 3758c: a8 97 sbiw r28, 0x28 ; 40 3758e: 80 93 d4 04 sts 0x04D4, r24 ; 0x8004d4 37592: 90 93 d5 04 sts 0x04D5, r25 ; 0x8004d5 37596: a0 93 d6 04 sts 0x04D6, r26 ; 0x8004d6 3759a: b0 93 d7 04 sts 0x04D7, r27 ; 0x8004d7 position_float[E_AXIS] = e; 3759e: aa 96 adiw r28, 0x2a ; 42 375a0: ee ad ldd r30, Y+62 ; 0x3e 375a2: ff ad ldd r31, Y+63 ; 0x3f 375a4: aa 97 sbiw r28, 0x2a ; 42 375a6: 80 81 ld r24, Z 375a8: 91 81 ldd r25, Z+1 ; 0x01 375aa: a2 81 ldd r26, Z+2 ; 0x02 375ac: b3 81 ldd r27, Z+3 ; 0x03 375ae: 80 93 d8 04 sts 0x04D8, r24 ; 0x8004d8 375b2: 90 93 d9 04 sts 0x04D9, r25 ; 0x8004d9 375b6: a0 93 da 04 sts 0x04DA, r26 ; 0x8004da 375ba: b0 93 db 04 sts 0x04DB, r27 ; 0x8004db 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; 375be: f0 90 a5 0d lds r15, 0x0DA5 ; 0x800da5 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); 375c2: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 375c6: 8f 19 sub r24, r15 375c8: 8f 70 andi r24, 0x0F ; 15 if (n_blocks >= 3) { 375ca: 83 30 cpi r24, 0x03 ; 3 375cc: 40 f1 brcs .+80 ; 0x3761e // Initialize the last tripple of blocks. block_index = prev_block_index(block_buffer_head); 375ce: 10 91 a4 0d lds r17, 0x0DA4 ; 0x800da4 } // 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) 375d2: 11 11 cpse r17, r1 375d4: 01 c0 rjmp .+2 ; 0x375d8 block_index = BLOCK_BUFFER_SIZE; 375d6: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 375d8: 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; 375da: fe e6 ldi r31, 0x6E ; 110 375dc: 1f 9f mul r17, r31 375de: c0 01 movw r24, r0 375e0: 11 24 eor r1, r1 375e2: 9c 01 movw r18, r24 375e4: 2c 53 subi r18, 0x3C ; 60 375e6: 39 4f sbci r19, 0xF9 ; 249 375e8: 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) 375ea: 11 11 cpse r17, r1 375ec: 01 c0 rjmp .+2 ; 0x375f0 block_index = BLOCK_BUFFER_SIZE; 375ee: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 375f0: 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)); 375f2: 3e e6 ldi r19, 0x6E ; 110 375f4: 13 9f mul r17, r19 375f6: c0 01 movw r24, r0 375f8: 11 24 eor r1, r1 375fa: ac 01 movw r20, r24 375fc: 4c 53 subi r20, 0x3C ; 60 375fe: 59 4f sbci r21, 0xF9 ; 249 37600: 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)); 37602: 9e e6 ldi r25, 0x6E ; 110 37604: 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) { 37606: f1 16 cp r15, r17 37608: 69 f0 breq .+26 ; 0x37624 if (current->flag & BLOCK_FLAG_START_FROM_FULL_HALT) { 3760a: d6 01 movw r26, r12 3760c: d5 96 adiw r26, 0x35 ; 53 3760e: 0c 91 ld r16, X 37610: 02 ff sbrs r16, 2 37612: 7e c3 rjmp .+1788 ; 0x37d10 // 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); 37614: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 37618: 81 1b sub r24, r17 3761a: 8f 70 andi r24, 0x0F ; 15 3761c: f1 2e mov r15, r17 } // SERIAL_ECHOLNPGM("planner_recalculate - 2"); // Forward pass and recalculate the trapezoids. if (n_blocks >= 2) { 3761e: 82 30 cpi r24, 0x02 ; 2 37620: 08 f4 brcc .+2 ; 0x37624 37622: a3 c0 rjmp .+326 ; 0x3776a // 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; 37624: 3e e6 ldi r19, 0x6E ; 110 37626: f3 9e mul r15, r19 37628: c0 01 movw r24, r0 3762a: 11 24 eor r1, r1 3762c: ac 01 movw r20, r24 3762e: 4c 53 subi r20, 0x3C ; 60 37630: 59 4f sbci r21, 0xF9 ; 249 37632: 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) 37634: f3 94 inc r15 37636: 50 e1 ldi r21, 0x10 ; 16 37638: f5 12 cpse r15, r21 3763a: 01 c0 rjmp .+2 ; 0x3763e block_index = 0; 3763c: 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)); 3763e: ae e6 ldi r26, 0x6E ; 110 37640: fa 9e mul r15, r26 37642: c0 01 movw r24, r0 37644: 11 24 eor r1, r1 37646: fc 01 movw r30, r24 37648: ec 53 subi r30, 0x3C ; 60 3764a: f9 4f sbci r31, 0xF9 ; 249 3764c: 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)); 3764e: 8e e6 ldi r24, 0x6E ; 110 37650: 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) { 37652: d5 01 movw r26, r10 37654: d5 96 adiw r26, 0x35 ; 53 37656: 8c 91 ld r24, X 37658: d5 97 sbiw r26, 0x35 ; 53 3765a: 81 fd sbrc r24, 1 3765c: 5a c0 rjmp .+180 ; 0x37712 3765e: 95 96 adiw r26, 0x25 ; 37 37660: 4d 90 ld r4, X+ 37662: 5d 90 ld r5, X+ 37664: 6d 90 ld r6, X+ 37666: 7c 90 ld r7, X 37668: 98 97 sbiw r26, 0x28 ; 40 3766a: f6 01 movw r30, r12 3766c: 95 a0 ldd r9, Z+37 ; 0x25 3766e: e6 a0 ldd r14, Z+38 ; 0x26 37670: 07 a1 ldd r16, Z+39 ; 0x27 37672: 10 a5 ldd r17, Z+40 ; 0x28 37674: 29 2d mov r18, r9 37676: 3e 2d mov r19, r14 37678: a8 01 movw r20, r16 3767a: c3 01 movw r24, r6 3767c: b2 01 movw r22, r4 3767e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37682: 87 ff sbrs r24, 7 37684: 46 c0 rjmp .+140 ; 0x37712 // 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); 37686: a3 01 movw r20, r6 37688: 92 01 movw r18, r4 3768a: c3 01 movw r24, r6 3768c: b2 01 movw r22, r4 3768e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37692: 2b 01 movw r4, r22 37694: 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)); 37696: d5 01 movw r26, r10 37698: d1 96 adiw r26, 0x31 ; 49 3769a: 6d 91 ld r22, X+ 3769c: 7d 91 ld r23, X+ 3769e: 8d 91 ld r24, X+ 376a0: 9c 91 ld r25, X 376a2: d4 97 sbiw r26, 0x34 ; 52 376a4: 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); 376a6: 9b 01 movw r18, r22 376a8: ac 01 movw r20, r24 376aa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 376ae: f5 01 movw r30, r10 376b0: 25 a5 ldd r18, Z+45 ; 0x2d 376b2: 36 a5 ldd r19, Z+46 ; 0x2e 376b4: 47 a5 ldd r20, Z+47 ; 0x2f 376b6: 50 a9 ldd r21, Z+48 ; 0x30 376b8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 376bc: 9b 01 movw r18, r22 376be: ac 01 movw r20, r24 376c0: c3 01 movw r24, r6 376c2: b2 01 movw r22, r4 376c4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 376c8: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 376cc: 2b 01 movw r4, r22 376ce: 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)); 376d0: 9b 01 movw r18, r22 376d2: ac 01 movw r20, r24 376d4: 69 2d mov r22, r9 376d6: 7e 2d mov r23, r14 376d8: c8 01 movw r24, r16 376da: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 376de: 87 ff sbrs r24, 7 376e0: 03 c0 rjmp .+6 ; 0x376e8 376e2: 49 2c mov r4, r9 376e4: 5e 2c mov r5, r14 376e6: 38 01 movw r6, r16 // Check for junction speed change if (current->entry_speed != entry_speed) { 376e8: 92 01 movw r18, r4 376ea: a3 01 movw r20, r6 376ec: 69 2d mov r22, r9 376ee: 7e 2d mov r23, r14 376f0: c8 01 movw r24, r16 376f2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 376f6: 88 23 and r24, r24 376f8: 61 f0 breq .+24 ; 0x37712 376fa: d6 01 movw r26, r12 376fc: d5 96 adiw r26, 0x35 ; 53 376fe: 2c 91 ld r18, X current->entry_speed = entry_speed; 37700: c2 01 movw r24, r4 37702: d3 01 movw r26, r6 37704: f6 01 movw r30, r12 37706: 85 a3 std Z+37, r24 ; 0x25 37708: 96 a3 std Z+38, r25 ; 0x26 3770a: a7 a3 std Z+39, r26 ; 0x27 3770c: b0 a7 std Z+40, r27 ; 0x28 current->flag |= BLOCK_FLAG_RECALCULATE; 3770e: 21 60 ori r18, 0x01 ; 1 37710: 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) { 37712: d5 01 movw r26, r10 37714: d5 96 adiw r26, 0x35 ; 53 37716: 8c 91 ld r24, X 37718: d5 97 sbiw r26, 0x35 ; 53 3771a: f6 01 movw r30, r12 3771c: 95 a9 ldd r25, Z+53 ; 0x35 3771e: 89 2b or r24, r25 37720: 80 ff sbrs r24, 0 37722: 14 c0 rjmp .+40 ; 0x3774c // NOTE: Entry and exit factors always > 0 by all previous logic operations. calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); 37724: 05 a1 ldd r16, Z+37 ; 0x25 37726: 16 a1 ldd r17, Z+38 ; 0x26 37728: 27 a1 ldd r18, Z+39 ; 0x27 3772a: 30 a5 ldd r19, Z+40 ; 0x28 3772c: 95 96 adiw r26, 0x25 ; 37 3772e: 4d 91 ld r20, X+ 37730: 5d 91 ld r21, X+ 37732: 6d 91 ld r22, X+ 37734: 7c 91 ld r23, X 37736: 98 97 sbiw r26, 0x28 ; 40 37738: c5 01 movw r24, r10 3773a: 0f 94 49 ae call 0x35c92 ; 0x35c92 // Reset current only to ensure next trapezoid is computed. prev->flag &= ~BLOCK_FLAG_RECALCULATE; 3773e: d5 01 movw r26, r10 37740: d5 96 adiw r26, 0x35 ; 53 37742: 8c 91 ld r24, X 37744: d5 97 sbiw r26, 0x35 ; 53 37746: 8e 7f andi r24, 0xFE ; 254 37748: d5 96 adiw r26, 0x35 ; 53 3774a: 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) 3774c: f3 94 inc r15 3774e: b0 e1 ldi r27, 0x10 ; 16 37750: fb 12 cpse r15, r27 37752: 01 c0 rjmp .+2 ; 0x37756 block_index = 0; 37754: 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)); 37756: f8 9c mul r15, r8 37758: c0 01 movw r24, r0 3775a: 11 24 eor r1, r1 3775c: 8c 53 subi r24, 0x3C ; 60 3775e: 99 4f sbci r25, 0xF9 ; 249 } while (block_index != block_buffer_head); 37760: 20 91 a4 0d lds r18, 0x0DA4 ; 0x800da4 // 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; 37764: 56 01 movw r10, r12 current = block_buffer + (block_index = next_block_index(block_index)); } while (block_index != block_buffer_head); 37766: f2 12 cpse r15, r18 37768: 43 c3 rjmp .+1670 ; 0x37df0 } // 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); 3776a: 80 91 a4 0d lds r24, 0x0DA4 ; 0x800da4 } // 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) 3776e: 81 11 cpse r24, r1 37770: 01 c0 rjmp .+2 ; 0x37774 block_index = BLOCK_BUFFER_SIZE; 37772: 80 e1 ldi r24, 0x10 ; 16 -- block_index; 37774: 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); 37776: ee e6 ldi r30, 0x6E ; 110 37778: 8e 9f mul r24, r30 3777a: c0 01 movw r24, r0 3777c: 11 24 eor r1, r1 3777e: 9c 01 movw r18, r24 37780: 2c 53 subi r18, 0x3C ; 60 37782: 39 4f sbci r19, 0xF9 ; 249 37784: 79 01 movw r14, r18 calculate_trapezoid_for_block(current, current->entry_speed, safe_final_speed); 37786: d9 01 movw r26, r18 37788: 95 96 adiw r26, 0x25 ; 37 3778a: 4d 91 ld r20, X+ 3778c: 5d 91 ld r21, X+ 3778e: 6d 91 ld r22, X+ 37790: 7c 91 ld r23, X 37792: 98 97 sbiw r26, 0x28 ; 40 37794: 09 a5 ldd r16, Y+41 ; 0x29 37796: 1d a5 ldd r17, Y+45 ; 0x2d 37798: 29 a9 ldd r18, Y+49 ; 0x31 3779a: 39 ad ldd r19, Y+57 ; 0x39 3779c: c7 01 movw r24, r14 3779e: 0f 94 49 ae call 0x35c92 ; 0x35c92 current->flag &= ~BLOCK_FLAG_RECALCULATE; 377a2: f7 01 movw r30, r14 377a4: 85 a9 ldd r24, Z+53 ; 0x35 377a6: 8e 7f andi r24, 0xFE ; 254 377a8: 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(); 377aa: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 377ae: 82 60 ori r24, 0x02 ; 2 377b0: 80 93 6f 00 sts 0x006F, r24 ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 377b4: 0d 94 4f b1 jmp 0x3629e ; 0x3629e // 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)); 377b8: a4 5e subi r26, 0xE4 ; 228 377ba: b8 4f sbci r27, 0xF8 ; 248 377bc: 80 e1 ldi r24, 0x10 ; 16 377be: e1 e9 ldi r30, 0x91 ; 145 377c0: f6 e0 ldi r31, 0x06 ; 6 377c2: 0d 94 8a b1 jmp 0x36314 ; 0x36314 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]); 377c6: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 377ca: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 377ce: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 377d2: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 377d6: a8 96 adiw r28, 0x28 ; 40 377d8: 6c ad ldd r22, Y+60 ; 0x3c 377da: 7d ad ldd r23, Y+61 ; 0x3d 377dc: 8e ad ldd r24, Y+62 ; 0x3e 377de: 9f ad ldd r25, Y+63 ; 0x3f 377e0: a8 97 sbiw r28, 0x28 ; 40 377e2: 0d 94 20 b2 jmp 0x36440 ; 0x36440 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); 377e6: 81 e0 ldi r24, 0x01 ; 1 377e8: 80 8f std Z+24, r24 ; 0x18 377ea: 0d 94 c6 b3 jmp 0x3678c ; 0x3678c { if(feed_rate 377f2: b0 90 fa 0d lds r11, 0x0DFA ; 0x800dfa 377f6: 00 91 fb 0d lds r16, 0x0DFB ; 0x800dfb 377fa: 10 91 fc 0d lds r17, 0x0DFC ; 0x800dfc 377fe: 4c c8 rjmp .-3944 ; 0x36898 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])); 37800: c5 01 movw r24, r10 37802: b4 01 movw r22, r8 37804: 0f 94 d9 d6 call 0x3adb2 ; 0x3adb2 37808: 4b 01 movw r8, r22 3780a: 5c 01 movw r10, r24 3780c: c7 01 movw r24, r14 3780e: b6 01 movw r22, r12 37810: 0f 94 d9 d6 call 0x3adb2 ; 0x3adb2 37814: 9b 01 movw r18, r22 37816: ac 01 movw r20, r24 37818: c5 01 movw r24, r10 3781a: b4 01 movw r22, r8 3781c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 37820: 6b 01 movw r12, r22 37822: 7c 01 movw r14, r24 37824: 22 96 adiw r28, 0x02 ; 2 37826: 6c ad ldd r22, Y+60 ; 0x3c 37828: 7d ad ldd r23, Y+61 ; 0x3d 3782a: 8e ad ldd r24, Y+62 ; 0x3e 3782c: 9f ad ldd r25, Y+63 ; 0x3f 3782e: 22 97 sbiw r28, 0x02 ; 2 37830: 0f 94 d9 d6 call 0x3adb2 ; 0x3adb2 37834: 9b 01 movw r18, r22 37836: ac 01 movw r20, r24 37838: c7 01 movw r24, r14 3783a: b6 01 movw r22, r12 3783c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 37840: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 37844: 2e e6 ldi r18, 0x6E ; 110 37846: 22 9d mul r18, r2 37848: f0 01 movw r30, r0 3784a: 23 9d mul r18, r3 3784c: f0 0d add r31, r0 3784e: 11 24 eor r1, r1 37850: ec 53 subi r30, 0x3C ; 60 37852: f9 4f sbci r31, 0xF9 ; 249 37854: 65 a7 std Z+45, r22 ; 0x2d 37856: 76 a7 std Z+46, r23 ; 0x2e 37858: 87 a7 std Z+47, r24 ; 0x2f 3785a: 90 ab std Z+48, r25 ; 0x30 3785c: bb c8 rjmp .-3722 ; 0x369d4 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 3785e: 2a 96 adiw r28, 0x0a ; 10 37860: 2c ad ldd r18, Y+60 ; 0x3c 37862: 3d ad ldd r19, Y+61 ; 0x3d 37864: 4e ad ldd r20, Y+62 ; 0x3e 37866: 5f ad ldd r21, Y+63 ; 0x3f 37868: 2a 97 sbiw r28, 0x0a ; 10 3786a: 23 2b or r18, r19 3786c: 24 2b or r18, r20 3786e: 25 2b or r18, r21 37870: 09 f4 brne .+2 ; 0x37874 37872: 0e c1 rjmp .+540 ; 0x37a90 37874: 60 91 f1 0d lds r22, 0x0DF1 ; 0x800df1 37878: 70 91 f2 0d lds r23, 0x0DF2 ; 0x800df2 3787c: 80 91 f3 0d lds r24, 0x0DF3 ; 0x800df3 37880: 90 91 f4 0d lds r25, 0x0DF4 ; 0x800df4 37884: 29 a5 ldd r18, Y+41 ; 0x29 37886: 3a a5 ldd r19, Y+42 ; 0x2a 37888: 4b a5 ldd r20, Y+43 ; 0x2b 3788a: 5c a5 ldd r21, Y+44 ; 0x2c 3788c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37890: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 37894: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37898: 2b 01 movw r4, r22 3789a: 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 3789c: 80 91 64 05 lds r24, 0x0564 ; 0x800564 378a0: 90 91 65 05 lds r25, 0x0565 ; 0x800565 378a4: a0 91 66 05 lds r26, 0x0566 ; 0x800566 378a8: b0 91 67 05 lds r27, 0x0567 ; 0x800567 378ac: 8d a7 std Y+45, r24 ; 0x2d 378ae: 9e a7 std Y+46, r25 ; 0x2e 378b0: af a7 std Y+47, r26 ; 0x2f 378b2: b8 ab std Y+48, r27 ; 0x30 && delta_mm[E_AXIS] >= 0 && fabs(delta_mm[Z_AXIS]) < 0.5; 378b4: 20 e0 ldi r18, 0x00 ; 0 378b6: 30 e0 ldi r19, 0x00 ; 0 378b8: a9 01 movw r20, r18 378ba: bc 01 movw r22, r24 378bc: cd 01 movw r24, r26 378be: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 378c2: 18 16 cp r1, r24 378c4: 0c f0 brlt .+2 ; 0x378c8 378c6: ed c0 rjmp .+474 ; 0x37aa2 * 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 378c8: 20 e0 ldi r18, 0x00 ; 0 378ca: 30 e0 ldi r19, 0x00 ; 0 378cc: a9 01 movw r20, r18 378ce: 26 96 adiw r28, 0x06 ; 6 378d0: 6c ad ldd r22, Y+60 ; 0x3c 378d2: 7d ad ldd r23, Y+61 ; 0x3d 378d4: 8e ad ldd r24, Y+62 ; 0x3e 378d6: 9f ad ldd r25, Y+63 ; 0x3f 378d8: 26 97 sbiw r28, 0x06 ; 6 378da: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 378de: 87 fd sbrc r24, 7 378e0: e0 c0 rjmp .+448 ; 0x37aa2 && fabs(delta_mm[Z_AXIS]) < 0.5; 378e2: 22 96 adiw r28, 0x02 ; 2 378e4: 6c ad ldd r22, Y+60 ; 0x3c 378e6: 7d ad ldd r23, Y+61 ; 0x3d 378e8: 8e ad ldd r24, Y+62 ; 0x3e 378ea: 9f ad ldd r25, Y+63 ; 0x3f 378ec: 22 97 sbiw r28, 0x02 ; 2 378ee: 9f 77 andi r25, 0x7F ; 127 378f0: 20 e0 ldi r18, 0x00 ; 0 378f2: 30 e0 ldi r19, 0x00 ; 0 378f4: 40 e0 ldi r20, 0x00 ; 0 378f6: 5f e3 ldi r21, 0x3F ; 63 378f8: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 378fc: 87 ff sbrs r24, 7 378fe: d1 c0 rjmp .+418 ; 0x37aa2 * * 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 37900: 8e e6 ldi r24, 0x6E ; 110 37902: 82 9d mul r24, r2 37904: 80 01 movw r16, r0 37906: 83 9d mul r24, r3 37908: 10 0d add r17, r0 3790a: 11 24 eor r1, r1 3790c: 00 5f subi r16, 0xF0 ; 240 3790e: 18 4f sbci r17, 0xF8 ; 248 37910: 81 e0 ldi r24, 0x01 ; 1 37912: d8 01 movw r26, r16 37914: 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]) 37916: 20 91 cc 04 lds r18, 0x04CC ; 0x8004cc 3791a: 30 91 cd 04 lds r19, 0x04CD ; 0x8004cd 3791e: 40 91 ce 04 lds r20, 0x04CE ; 0x8004ce 37922: 50 91 cf 04 lds r21, 0x04CF ; 0x8004cf 37926: 69 a1 ldd r22, Y+33 ; 0x21 37928: 7a a1 ldd r23, Y+34 ; 0x22 3792a: 8b a1 ldd r24, Y+35 ; 0x23 3792c: 9c a1 ldd r25, Y+36 ; 0x24 3792e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 37932: 69 ab std Y+49, r22 ; 0x31 37934: 7a ab std Y+50, r23 ; 0x32 37936: 8b ab std Y+51, r24 ; 0x33 37938: 9c ab std Y+52, r25 ; 0x34 + sq(y - position_float[Y_AXIS]) 3793a: 20 91 d0 04 lds r18, 0x04D0 ; 0x8004d0 3793e: 30 91 d1 04 lds r19, 0x04D1 ; 0x8004d1 37942: 40 91 d2 04 lds r20, 0x04D2 ; 0x8004d2 37946: 50 91 d3 04 lds r21, 0x04D3 ; 0x8004d3 3794a: 6d a1 ldd r22, Y+37 ; 0x25 3794c: 7e a1 ldd r23, Y+38 ; 0x26 3794e: 8f a1 ldd r24, Y+39 ; 0x27 37950: 98 a5 ldd r25, Y+40 ; 0x28 37952: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 37956: 4b 01 movw r8, r22 37958: 5c 01 movw r10, r24 + sq(z - position_float[Z_AXIS])); 3795a: 20 91 d4 04 lds r18, 0x04D4 ; 0x8004d4 3795e: 30 91 d5 04 lds r19, 0x04D5 ; 0x8004d5 37962: 40 91 d6 04 lds r20, 0x04D6 ; 0x8004d6 37966: 50 91 d7 04 lds r21, 0x04D7 ; 0x8004d7 3796a: a8 96 adiw r28, 0x28 ; 40 3796c: 6c ad ldd r22, Y+60 ; 0x3c 3796e: 7d ad ldd r23, Y+61 ; 0x3d 37970: 8e ad ldd r24, Y+62 ; 0x3e 37972: 9f ad ldd r25, Y+63 ; 0x3f 37974: a8 97 sbiw r28, 0x28 ; 40 37976: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3797a: 6b 01 movw r12, r22 3797c: 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]) 3797e: 29 a9 ldd r18, Y+49 ; 0x31 37980: 3a a9 ldd r19, Y+50 ; 0x32 37982: 4b a9 ldd r20, Y+51 ; 0x33 37984: 5c a9 ldd r21, Y+52 ; 0x34 37986: ca 01 movw r24, r20 37988: b9 01 movw r22, r18 3798a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3798e: 69 ab std Y+49, r22 ; 0x31 37990: 7a ab std Y+50, r23 ; 0x32 37992: 8b ab std Y+51, r24 ; 0x33 37994: 9c ab std Y+52, r25 ; 0x34 + sq(y - position_float[Y_AXIS]) 37996: a5 01 movw r20, r10 37998: 94 01 movw r18, r8 3799a: c5 01 movw r24, r10 3799c: b4 01 movw r22, r8 3799e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 379a2: 9b 01 movw r18, r22 379a4: ac 01 movw r20, r24 379a6: 69 a9 ldd r22, Y+49 ; 0x31 379a8: 7a a9 ldd r23, Y+50 ; 0x32 379aa: 8b a9 ldd r24, Y+51 ; 0x33 379ac: 9c a9 ldd r25, Y+52 ; 0x34 379ae: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 379b2: 4b 01 movw r8, r22 379b4: 5c 01 movw r10, r24 + sq(z - position_float[Z_AXIS])); 379b6: a7 01 movw r20, r14 379b8: 96 01 movw r18, r12 379ba: c7 01 movw r24, r14 379bc: b6 01 movw r22, r12 379be: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 379c2: 9b 01 movw r18, r22 379c4: ac 01 movw r20, r24 379c6: c5 01 movw r24, r10 379c8: b4 01 movw r22, r8 379ca: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__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]) 379ce: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 379d2: 6b 01 movw r12, r22 379d4: 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]); 379d6: 20 91 d8 04 lds r18, 0x04D8 ; 0x8004d8 379da: 30 91 d9 04 lds r19, 0x04D9 ; 0x8004d9 379de: 40 91 da 04 lds r20, 0x04DA ; 0x8004da 379e2: 50 91 db 04 lds r21, 0x04DB ; 0x8004db 379e6: aa 96 adiw r28, 0x2a ; 42 379e8: ee ad ldd r30, Y+62 ; 0x3e 379ea: ff ad ldd r31, Y+63 ; 0x3f 379ec: aa 97 sbiw r28, 0x2a ; 42 379ee: 60 81 ld r22, Z 379f0: 71 81 ldd r23, Z+1 ; 0x01 379f2: 82 81 ldd r24, Z+2 ; 0x02 379f4: 93 81 ldd r25, Z+3 ; 0x03 379f6: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__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; 379fa: a7 01 movw r20, r14 379fc: 96 01 movw r18, r12 379fe: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37a02: 6a 96 adiw r28, 0x1a ; 26 37a04: 6c af std Y+60, r22 ; 0x3c 37a06: 7d af std Y+61, r23 ; 0x3d 37a08: 8e af std Y+62, r24 ; 0x3e 37a0a: 9f af std Y+63, r25 ; 0x3f 37a0c: 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) 37a0e: 20 e0 ldi r18, 0x00 ; 0 37a10: 30 e0 ldi r19, 0x00 ; 0 37a12: 40 e4 ldi r20, 0x40 ; 64 37a14: 50 e4 ldi r21, 0x40 ; 64 37a16: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37a1a: 18 16 cp r1, r24 37a1c: 0c f4 brge .+2 ; 0x37a20 37a1e: 9e c0 rjmp .+316 ; 0x37b5c block->use_advance_lead = false; else if (e_D_ratio > 0) { 37a20: 20 e0 ldi r18, 0x00 ; 0 37a22: 30 e0 ldi r19, 0x00 ; 0 37a24: a9 01 movw r20, r18 37a26: 6a 96 adiw r28, 0x1a ; 26 37a28: 6c ad ldd r22, Y+60 ; 0x3c 37a2a: 7d ad ldd r23, Y+61 ; 0x3d 37a2c: 8e ad ldd r24, Y+62 ; 0x3e 37a2e: 9f ad ldd r25, Y+63 ; 0x3f 37a30: 6a 97 sbiw r28, 0x1a ; 26 37a32: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37a36: 18 16 cp r1, r24 37a38: 0c f0 brlt .+2 ; 0x37a3c 37a3a: 42 c0 rjmp .+132 ; 0x37ac0 const uint32_t max_accel_steps_per_s2 = ceil(cs.max_jerk[E_AXIS] / (extruder_advance_K * e_D_ratio) * steps_per_mm); 37a3c: 6a 96 adiw r28, 0x1a ; 26 37a3e: 2c ad ldd r18, Y+60 ; 0x3c 37a40: 3d ad ldd r19, Y+61 ; 0x3d 37a42: 4e ad ldd r20, Y+62 ; 0x3e 37a44: 5f ad ldd r21, Y+63 ; 0x3f 37a46: 6a 97 sbiw r28, 0x1a ; 26 37a48: 6d a5 ldd r22, Y+45 ; 0x2d 37a4a: 7e a5 ldd r23, Y+46 ; 0x2e 37a4c: 8f a5 ldd r24, Y+47 ; 0x2f 37a4e: 98 a9 ldd r25, Y+48 ; 0x30 37a50: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37a54: 9b 01 movw r18, r22 37a56: ac 01 movw r20, r24 37a58: 60 91 11 0e lds r22, 0x0E11 ; 0x800e11 37a5c: 70 91 12 0e lds r23, 0x0E12 ; 0x800e12 37a60: 80 91 13 0e lds r24, 0x0E13 ; 0x800e13 37a64: 90 91 14 0e lds r25, 0x0E14 ; 0x800e14 37a68: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37a6c: 29 a5 ldd r18, Y+41 ; 0x29 37a6e: 3a a5 ldd r19, Y+42 ; 0x2a 37a70: 4b a5 ldd r20, Y+43 ; 0x2b 37a72: 5c a5 ldd r21, Y+44 ; 0x2c 37a74: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37a78: 0f 94 16 de call 0x3bc2c ; 0x3bc2c 37a7c: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37a80: 64 15 cp r22, r4 37a82: 75 05 cpc r23, r5 37a84: 86 05 cpc r24, r6 37a86: 97 05 cpc r25, r7 37a88: d8 f4 brcc .+54 ; 0x37ac0 37a8a: 2b 01 movw r4, r22 37a8c: 3c 01 movw r6, r24 37a8e: 18 c0 rjmp .+48 ; 0x37ac0 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 37a90: 60 91 7d 0e lds r22, 0x0E7D ; 0x800e7d 37a94: 70 91 7e 0e lds r23, 0x0E7E ; 0x800e7e 37a98: 80 91 7f 0e lds r24, 0x0E7F ; 0x800e7f 37a9c: 90 91 80 0e lds r25, 0x0E80 ; 0x800e80 37aa0: f1 ce rjmp .-542 ; 0x37884 * * 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 37aa2: 8e e6 ldi r24, 0x6E ; 110 37aa4: 82 9d mul r24, r2 37aa6: f0 01 movw r30, r0 37aa8: 83 9d mul r24, r3 37aaa: f0 0d add r31, r0 37aac: 11 24 eor r1, r1 37aae: e0 5f subi r30, 0xF0 ; 240 37ab0: f8 4f sbci r31, 0xF8 ; 248 37ab2: 10 82 st Z, r1 block->nominal_speed *= speed_factor; block->nominal_rate *= speed_factor; } #ifdef LIN_ADVANCE float e_D_ratio = 0; 37ab4: 6a 96 adiw r28, 0x1a ; 26 37ab6: 1c ae std Y+60, r1 ; 0x3c 37ab8: 1d ae std Y+61, r1 ; 0x3d 37aba: 1e ae std Y+62, r1 ; 0x3e 37abc: 1f ae std Y+63, r1 ; 0x3f 37abe: 6a 97 sbiw r28, 0x1a ; 26 37ac0: 10 e0 ldi r17, 0x00 ; 0 37ac2: 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) 37ac4: a4 96 adiw r28, 0x24 ; 36 37ac6: ee ad ldd r30, Y+62 ; 0x3e 37ac8: ff ad ldd r31, Y+63 ; 0x3f 37aca: a4 97 sbiw r28, 0x24 ; 36 37acc: e0 0f add r30, r16 37ace: f1 1f adc r31, r17 37ad0: ec 53 subi r30, 0x3C ; 60 37ad2: f9 4f sbci r31, 0xF9 ; 249 37ad4: c0 80 ld r12, Z 37ad6: d1 80 ldd r13, Z+1 ; 0x01 37ad8: e2 80 ldd r14, Z+2 ; 0x02 37ada: f3 80 ldd r15, Z+3 ; 0x03 37adc: c1 14 cp r12, r1 37ade: d1 04 cpc r13, r1 37ae0: e1 04 cpc r14, r1 37ae2: f1 04 cpc r15, r1 37ae4: a1 f1 breq .+104 ; 0x37b4e 37ae6: f8 01 movw r30, r16 37ae8: e3 5b subi r30, 0xB3 ; 179 37aea: fa 4f sbci r31, 0xFA ; 250 37aec: 60 81 ld r22, Z 37aee: 71 81 ldd r23, Z+1 ; 0x01 37af0: 82 81 ldd r24, Z+2 ; 0x02 37af2: 93 81 ldd r25, Z+3 ; 0x03 37af4: 64 15 cp r22, r4 37af6: 75 05 cpc r23, r5 37af8: 86 05 cpc r24, r6 37afa: 97 05 cpc r25, r7 37afc: 40 f5 brcc .+80 ; 0x37b4e { const float max_possible = float(max_acceleration_steps_per_s2[axis]) * float(block->step_event_count.wide) / float(block->steps[axis].wide); 37afe: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 37b02: 29 ad ldd r18, Y+57 ; 0x39 37b04: 3a ad ldd r19, Y+58 ; 0x3a 37b06: 4b ad ldd r20, Y+59 ; 0x3b 37b08: 5c ad ldd r21, Y+60 ; 0x3c 37b0a: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37b0e: 4b 01 movw r8, r22 37b10: 5c 01 movw r10, r24 37b12: c7 01 movw r24, r14 37b14: b6 01 movw r22, r12 37b16: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 37b1a: 9b 01 movw r18, r22 37b1c: ac 01 movw r20, r24 37b1e: c5 01 movw r24, r10 37b20: b4 01 movw r22, r8 37b22: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37b26: 6b 01 movw r12, r22 37b28: 7c 01 movw r14, r24 if (max_possible < accel) accel = max_possible; 37b2a: c3 01 movw r24, r6 37b2c: b2 01 movw r22, r4 37b2e: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 37b32: 9b 01 movw r18, r22 37b34: ac 01 movw r20, r24 37b36: c7 01 movw r24, r14 37b38: b6 01 movw r22, r12 37b3a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37b3e: 87 ff sbrs r24, 7 37b40: 06 c0 rjmp .+12 ; 0x37b4e 37b42: c7 01 movw r24, r14 37b44: b6 01 movw r22, r12 37b46: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37b4a: 2b 01 movw r4, r22 37b4c: 3c 01 movw r6, r24 37b4e: 0c 5f subi r16, 0xFC ; 252 37b50: 1f 4f sbci r17, 0xFF ; 255 } } #endif // Limit acceleration per axis for (uint8_t axis = 0; axis < NUM_AXIS; axis++) 37b52: 00 31 cpi r16, 0x10 ; 16 37b54: 11 05 cpc r17, r1 37b56: 09 f0 breq .+2 ; 0x37b5a 37b58: b5 cf rjmp .-150 ; 0x37ac4 37b5a: 01 c9 rjmp .-3582 ; 0x36d5e // 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; 37b5c: d8 01 movw r26, r16 37b5e: 1c 92 st X, r1 37b60: af cf rjmp .-162 ; 0x37ac0 if (jerk > mjerk) { safe_speed *= mjerk / jerk; limited = true; } } else { safe_speed = cs.max_jerk[axis]; 37b62: c9 a6 std Y+41, r12 ; 0x29 37b64: dd a6 std Y+45, r13 ; 0x2d 37b66: e9 aa std Y+49, r14 ; 0x31 37b68: f9 ae std Y+57, r15 ; 0x39 limited = true; 37b6a: 21 e0 ldi r18, 0x01 ; 1 37b6c: 2d ab std Y+53, r18 ; 0x35 37b6e: b1 c9 rjmp .-3230 ; 0x36ed2 // 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); 37b70: 27 96 adiw r28, 0x07 ; 7 37b72: 2f ad ldd r18, Y+63 ; 0x3f 37b74: 27 97 sbiw r28, 0x07 ; 7 37b76: 2b 96 adiw r28, 0x0b ; 11 37b78: 3f ad ldd r19, Y+63 ; 0x3f 37b7a: 2b 97 sbiw r28, 0x0b ; 11 37b7c: 2f 96 adiw r28, 0x0f ; 15 37b7e: 4f ad ldd r20, Y+63 ; 0x3f 37b80: 2f 97 sbiw r28, 0x0f ; 15 37b82: 63 96 adiw r28, 0x13 ; 19 37b84: 5f ad ldd r21, Y+63 ; 0x3f 37b86: 63 97 sbiw r28, 0x13 ; 19 37b88: 6b 96 adiw r28, 0x1b ; 27 37b8a: 6f ad ldd r22, Y+63 ; 0x3f 37b8c: 6b 97 sbiw r28, 0x1b ; 27 37b8e: 6d 96 adiw r28, 0x1d ; 29 37b90: 7f ad ldd r23, Y+63 ; 0x3f 37b92: 6d 97 sbiw r28, 0x1d ; 29 37b94: c8 01 movw r24, r16 37b96: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 37b9a: ec 96 adiw r28, 0x3c ; 60 37b9c: 6c af std Y+60, r22 ; 0x3c 37b9e: 7d af std Y+61, r23 ; 0x3d 37ba0: 8e af std Y+62, r24 ; 0x3e 37ba2: 9f af std Y+63, r25 ; 0x3f 37ba4: ec 97 sbiw r28, 0x3c ; 60 // 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; 37ba6: 6b 96 adiw r28, 0x1b ; 27 37ba8: ef ad ldd r30, Y+63 ; 0x3f 37baa: 6b 97 sbiw r28, 0x1b ; 27 37bac: ed af std Y+61, r30 ; 0x3d 37bae: 6d 96 adiw r28, 0x1d ; 29 37bb0: ff ad ldd r31, Y+63 ; 0x3f 37bb2: 6d 97 sbiw r28, 0x1d ; 29 37bb4: fd ab std Y+53, r31 ; 0x35 37bb6: 0e af std Y+62, r16 ; 0x3e 37bb8: 23 96 adiw r28, 0x03 ; 3 37bba: 1f af std Y+63, r17 ; 0x3f 37bbc: 23 97 sbiw r28, 0x03 ; 3 37bbe: 04 ca rjmp .-3064 ; 0x36fc8 (v_exit > v_entry) ? ((v_entry > 0.f || v_exit < 0.f) ? // coasting (v_exit - v_entry) : // axis reversal max(v_exit, - v_entry)) : 37bc0: f7 fa bst r15, 7 37bc2: f0 94 com r15 37bc4: f7 f8 bld r15, 7 37bc6: f0 94 com r15 37bc8: a5 01 movw r20, r10 37bca: 94 01 movw r18, r8 37bcc: c7 01 movw r24, r14 37bce: b6 01 movw r22, r12 37bd0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37bd4: 87 ff sbrs r24, 7 37bd6: 77 ca rjmp .-2834 ; 0x370c6 // v_exit <= v_entry ((v_entry < 0.f || v_exit > 0.f) ? // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); 37bd8: 75 01 movw r14, r10 37bda: 64 01 movw r12, r8 37bdc: 74 ca rjmp .-2840 ; 0x370c6 // coasting (v_exit - v_entry) : // axis reversal max(v_exit, - v_entry)) : // v_exit <= v_entry ((v_entry < 0.f || v_exit > 0.f) ? 37bde: c7 01 movw r24, r14 37be0: b6 01 movw r22, r12 37be2: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37be6: 87 fd sbrc r24, 7 37be8: 09 c0 rjmp .+18 ; 0x37bfc 37bea: 20 e0 ldi r18, 0x00 ; 0 37bec: 30 e0 ldi r19, 0x00 ; 0 37bee: a9 01 movw r20, r18 37bf0: c5 01 movw r24, r10 37bf2: b4 01 movw r22, r8 37bf4: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37bf8: 18 16 cp r1, r24 37bfa: 2c f4 brge .+10 ; 0x37c06 37bfc: a5 01 movw r20, r10 37bfe: 94 01 movw r18, r8 37c00: c7 01 movw r24, r14 37c02: b6 01 movw r22, r12 37c04: 5c ca rjmp .-2888 ; 0x370be // coasting (v_entry - v_exit) : // axis reversal max(- v_exit, v_entry)); 37c06: b7 fa bst r11, 7 37c08: b0 94 com r11 37c0a: b7 f8 bld r11, 7 37c0c: b0 94 com r11 37c0e: a7 01 movw r20, r14 37c10: 96 01 movw r18, r12 37c12: c5 01 movw r24, r10 37c14: b4 01 movw r22, r8 37c16: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37c1a: 18 16 cp r1, r24 37c1c: 0c f0 brlt .+2 ; 0x37c20 37c1e: 53 ca rjmp .-2906 ; 0x370c6 37c20: db cf rjmp .-74 ; 0x37bd8 // 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; 37c22: 8e e6 ldi r24, 0x6E ; 110 37c24: 82 9d mul r24, r2 37c26: f0 01 movw r30, r0 37c28: 83 9d mul r24, r3 37c2a: f0 0d add r31, r0 37c2c: 11 24 eor r1, r1 37c2e: ec 53 subi r30, 0x3C ; 60 37c30: f9 4f sbci r31, 0xF9 ; 249 37c32: 85 a9 ldd r24, Z+53 ; 0x35 37c34: 84 60 ori r24, 0x04 ; 4 37c36: 85 ab std Z+53, r24 ; 0x35 37c38: a9 a5 ldd r26, Y+41 ; 0x29 37c3a: ad af std Y+61, r26 ; 0x3d 37c3c: bd a5 ldd r27, Y+45 ; 0x2d 37c3e: bd ab std Y+53, r27 ; 0x35 37c40: e9 a9 ldd r30, Y+49 ; 0x31 37c42: ee af std Y+62, r30 ; 0x3e 37c44: f9 ad ldd r31, Y+57 ; 0x39 37c46: 23 96 adiw r28, 0x03 ; 3 37c48: ff af std Y+63, r31 ; 0x3f 37c4a: 23 97 sbiw r28, 0x03 ; 3 37c4c: bc ca rjmp .-2696 ; 0x371c6 // 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; 37c4e: 81 e0 ldi r24, 0x01 ; 1 37c50: 30 cb rjmp .-2464 ; 0x372b2 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]; 37c52: 20 91 11 0e lds r18, 0x0E11 ; 0x800e11 37c56: 30 91 12 0e lds r19, 0x0E12 ; 0x800e12 37c5a: 40 91 13 0e lds r20, 0x0E13 ; 0x800e13 37c5e: 50 91 14 0e lds r21, 0x0E14 ; 0x800e14 37c62: c7 01 movw r24, r14 37c64: b6 01 movw r22, r12 37c66: c1 cb rjmp .-2174 ; 0x373ea 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) { 37c68: 20 e0 ldi r18, 0x00 ; 0 37c6a: 30 e4 ldi r19, 0x40 ; 64 37c6c: 4c e1 ldi r20, 0x1C ; 28 37c6e: 56 e4 ldi r21, 0x46 ; 70 37c70: c7 01 movw r24, r14 37c72: b6 01 movw r22, r12 37c74: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 37c78: 18 16 cp r1, r24 37c7a: d4 f4 brge .+52 ; 0x37cb0 block->advance_rate = advance_rate * 2; 37c7c: 8e e6 ldi r24, 0x6E ; 110 37c7e: 82 9d mul r24, r2 37c80: 80 01 movw r16, r0 37c82: 83 9d mul r24, r3 37c84: 10 0d add r17, r0 37c86: 11 24 eor r1, r1 37c88: 0c 53 subi r16, 0x3C ; 60 37c8a: 19 4f sbci r17, 0xF9 ; 249 37c8c: 78 01 movw r14, r16 37c8e: bd e4 ldi r27, 0x4D ; 77 37c90: eb 0e add r14, r27 37c92: f1 1c adc r15, r1 37c94: a5 01 movw r20, r10 37c96: 94 01 movw r18, r8 37c98: c5 01 movw r24, r10 37c9a: b4 01 movw r22, r8 37c9c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 37ca0: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37ca4: f7 01 movw r30, r14 37ca6: 71 83 std Z+1, r23 ; 0x01 37ca8: 60 83 st Z, r22 block->advance_step_loops = 2; 37caa: 36 96 adiw r30, 0x06 ; 6 37cac: 82 e0 ldi r24, 0x02 ; 2 37cae: e2 cb rjmp .-2108 ; 0x37474 } else { // never overflow the internal accumulator with very low rates if (advance_rate < UINT16_MAX) 37cb0: 20 e0 ldi r18, 0x00 ; 0 37cb2: 3f ef ldi r19, 0xFF ; 255 37cb4: 4f e7 ldi r20, 0x7F ; 127 37cb6: 57 e4 ldi r21, 0x47 ; 71 37cb8: c5 01 movw r24, r10 37cba: b4 01 movw r22, r8 37cbc: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37cc0: 87 ff sbrs r24, 7 37cc2: 19 c0 rjmp .+50 ; 0x37cf6 block->advance_rate = advance_rate; 37cc4: 8e e6 ldi r24, 0x6E ; 110 37cc6: 82 9d mul r24, r2 37cc8: 80 01 movw r16, r0 37cca: 83 9d mul r24, r3 37ccc: 10 0d add r17, r0 37cce: 11 24 eor r1, r1 37cd0: 0f 5e subi r16, 0xEF ; 239 37cd2: 18 4f sbci r17, 0xF8 ; 248 37cd4: c5 01 movw r24, r10 37cd6: b4 01 movw r22, r8 37cd8: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 37cdc: d8 01 movw r26, r16 37cde: 6d 93 st X+, r22 37ce0: 7c 93 st X, r23 else block->advance_rate = UINT16_MAX; block->advance_step_loops = 1; 37ce2: 8e e6 ldi r24, 0x6E ; 110 37ce4: 82 9d mul r24, r2 37ce6: f0 01 movw r30, r0 37ce8: 83 9d mul r24, r3 37cea: f0 0d add r31, r0 37cec: 11 24 eor r1, r1 37cee: e9 5e subi r30, 0xE9 ; 233 37cf0: f8 4f sbci r31, 0xF8 ; 248 37cf2: 81 e0 ldi r24, 0x01 ; 1 37cf4: bf cb rjmp .-2178 ; 0x37474 { // 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; 37cf6: 8e e6 ldi r24, 0x6E ; 110 37cf8: 82 9d mul r24, r2 37cfa: f0 01 movw r30, r0 37cfc: 83 9d mul r24, r3 37cfe: f0 0d add r31, r0 37d00: 11 24 eor r1, r1 37d02: ef 5e subi r30, 0xEF ; 239 37d04: f8 4f sbci r31, 0xF8 ; 248 37d06: 8f ef ldi r24, 0xFF ; 255 37d08: 9f ef ldi r25, 0xFF ; 255 37d0a: 91 83 std Z+1, r25 ; 0x01 37d0c: 80 83 st Z, r24 37d0e: e9 cf rjmp .-46 ; 0x37ce2 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) { 37d10: f6 01 movw r30, r12 37d12: 71 a4 ldd r7, Z+41 ; 0x29 37d14: 82 a4 ldd r8, Z+42 ; 0x2a 37d16: 93 a4 ldd r9, Z+43 ; 0x2b 37d18: e4 a4 ldd r14, Z+44 ; 0x2c 37d1a: 27 2d mov r18, r7 37d1c: 38 2d mov r19, r8 37d1e: 49 2d mov r20, r9 37d20: 5e 2d mov r21, r14 37d22: 65 a1 ldd r22, Z+37 ; 0x25 37d24: 76 a1 ldd r23, Z+38 ; 0x26 37d26: 87 a1 ldd r24, Z+39 ; 0x27 37d28: 90 a5 ldd r25, Z+40 ; 0x28 37d2a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37d2e: 88 23 and r24, r24 37d30: 09 f4 brne .+2 ; 0x37d34 37d32: 51 c0 rjmp .+162 ; 0x37dd6 // 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) ? 37d34: 01 fd sbrc r16, 1 37d36: 44 c0 rjmp .+136 ; 0x37dc0 37d38: d5 01 movw r26, r10 37d3a: 95 96 adiw r26, 0x25 ; 37 37d3c: 2d 90 ld r2, X+ 37d3e: 3d 90 ld r3, X+ 37d40: 4d 90 ld r4, X+ 37d42: 5c 90 ld r5, X 37d44: 98 97 sbiw r26, 0x28 ; 40 37d46: a2 01 movw r20, r4 37d48: 91 01 movw r18, r2 37d4a: 67 2d mov r22, r7 37d4c: 78 2d mov r23, r8 37d4e: 89 2d mov r24, r9 37d50: 9e 2d mov r25, r14 37d52: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37d56: 18 16 cp r1, r24 37d58: 9c f5 brge .+102 ; 0x37dc0 // 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); 37d5a: a2 01 movw r20, r4 37d5c: 91 01 movw r18, r2 37d5e: c2 01 movw r24, r4 37d60: b1 01 movw r22, r2 37d62: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37d66: 1b 01 movw r2, r22 37d68: 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)); 37d6a: f6 01 movw r30, r12 37d6c: 61 a9 ldd r22, Z+49 ; 0x31 37d6e: 72 a9 ldd r23, Z+50 ; 0x32 37d70: 83 a9 ldd r24, Z+51 ; 0x33 37d72: 94 a9 ldd r25, Z+52 ; 0x34 37d74: 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); 37d76: 9b 01 movw r18, r22 37d78: ac 01 movw r20, r24 37d7a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 37d7e: d6 01 movw r26, r12 37d80: 9d 96 adiw r26, 0x2d ; 45 37d82: 2d 91 ld r18, X+ 37d84: 3d 91 ld r19, X+ 37d86: 4d 91 ld r20, X+ 37d88: 5c 91 ld r21, X 37d8a: d0 97 sbiw r26, 0x30 ; 48 37d8c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37d90: 9b 01 movw r18, r22 37d92: ac 01 movw r20, r24 37d94: c2 01 movw r24, r4 37d96: b1 01 movw r22, r2 37d98: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 37d9c: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 37da0: 2b 01 movw r4, r22 37da2: 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)); 37da4: 9b 01 movw r18, r22 37da6: ac 01 movw r20, r24 37da8: 67 2d mov r22, r7 37daa: 78 2d mov r23, r8 37dac: 89 2d mov r24, r9 37dae: 9e 2d mov r25, r14 37db0: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 37db4: 87 fd sbrc r24, 7 37db6: 04 c0 rjmp .+8 ; 0x37dc0 37db8: 74 2c mov r7, r4 37dba: 85 2c mov r8, r5 37dbc: 9a 2c mov r9, r10 37dbe: 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) ? 37dc0: 87 2d mov r24, r7 37dc2: 98 2d mov r25, r8 37dc4: a9 2d mov r26, r9 37dc6: be 2d mov r27, r14 37dc8: f6 01 movw r30, r12 37dca: 85 a3 std Z+37, r24 ; 0x25 37dcc: 96 a3 std Z+38, r25 ; 0x26 37dce: a7 a3 std Z+39, r26 ; 0x27 37dd0: 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; 37dd2: 01 60 ori r16, 0x01 ; 1 37dd4: 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) 37dd6: 11 11 cpse r17, r1 37dd8: 01 c0 rjmp .+2 ; 0x37ddc block_index = BLOCK_BUFFER_SIZE; 37dda: 10 e1 ldi r17, 0x10 ; 16 -- block_index; 37ddc: 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)); 37dde: 16 9d mul r17, r6 37de0: c0 01 movw r24, r0 37de2: 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; 37de4: 56 01 movw r10, r12 current = block_buffer + (block_index = prev_block_index(block_index)); 37de6: 9c 01 movw r18, r24 37de8: 2c 53 subi r18, 0x3C ; 60 37dea: 39 4f sbci r19, 0xF9 ; 249 37dec: 69 01 movw r12, r18 37dee: 0b cc rjmp .-2026 ; 0x37606 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)); 37df0: 6c 01 movw r12, r24 37df2: 2f cc rjmp .-1954 ; 0x37652 37df4: 8f bf out 0x3f, r24 ; 63 __asm__ volatile ("" ::: "memory"); 37df6: 0d 94 4f b1 jmp 0x3629e ; 0x3629e 00037dfa : 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(){ 37dfa: 4f 92 push r4 37dfc: 5f 92 push r5 37dfe: 6f 92 push r6 37e00: 7f 92 push r7 37e02: 8f 92 push r8 37e04: 9f 92 push r9 37e06: af 92 push r10 37e08: bf 92 push r11 37e0a: cf 92 push r12 37e0c: df 92 push r13 37e0e: ef 92 push r14 37e10: ff 92 push r15 37e12: cf 93 push r28 37e14: df 93 push r29 37e16: cd b7 in r28, 0x3d ; 61 37e18: de b7 in r29, 0x3e ; 62 37e1a: 2c 97 sbiw r28, 0x0c ; 12 37e1c: 0f b6 in r0, 0x3f ; 63 37e1e: f8 94 cli 37e20: de bf out 0x3e, r29 ; 62 37e22: 0f be out 0x3f, r0 ; 63 37e24: 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]); 37e26: c0 90 99 06 lds r12, 0x0699 ; 0x800699 37e2a: d0 90 9a 06 lds r13, 0x069A ; 0x80069a 37e2e: e0 90 9b 06 lds r14, 0x069B ; 0x80069b 37e32: f0 90 9c 06 lds r15, 0x069C ; 0x80069c 37e36: 80 91 95 06 lds r24, 0x0695 ; 0x800695 37e3a: 90 91 96 06 lds r25, 0x0696 ; 0x800696 37e3e: a0 91 97 06 lds r26, 0x0697 ; 0x800697 37e42: b0 91 98 06 lds r27, 0x0698 ; 0x800698 37e46: 40 91 91 06 lds r20, 0x0691 ; 0x800691 37e4a: 50 91 92 06 lds r21, 0x0692 ; 0x800692 37e4e: 60 91 93 06 lds r22, 0x0693 ; 0x800693 37e52: 70 91 94 06 lds r23, 0x0694 ; 0x800694 37e56: 4d 83 std Y+5, r20 ; 0x05 37e58: 5e 83 std Y+6, r21 ; 0x06 37e5a: 6f 83 std Y+7, r22 ; 0x07 37e5c: 78 87 std Y+8, r23 ; 0x08 37e5e: 89 83 std Y+1, r24 ; 0x01 37e60: 9a 83 std Y+2, r25 ; 0x02 37e62: ab 83 std Y+3, r26 ; 0x03 37e64: 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); 37e66: be 01 movw r22, r28 37e68: 6f 5f subi r22, 0xFF ; 255 37e6a: 7f 4f sbci r23, 0xFF ; 255 37e6c: ce 01 movw r24, r28 37e6e: 05 96 adiw r24, 0x05 ; 5 37e70: 0e 94 9a 69 call 0xd334 ; 0xd334 position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]); 37e74: 4d 80 ldd r4, Y+5 ; 0x05 37e76: 5e 80 ldd r5, Y+6 ; 0x06 37e78: 6f 80 ldd r6, Y+7 ; 0x07 37e7a: 78 84 ldd r7, Y+8 ; 0x08 37e7c: 20 91 c1 0d lds r18, 0x0DC1 ; 0x800dc1 37e80: 30 91 c2 0d lds r19, 0x0DC2 ; 0x800dc2 37e84: 40 91 c3 0d lds r20, 0x0DC3 ; 0x800dc3 37e88: 50 91 c4 0d lds r21, 0x0DC4 ; 0x800dc4 37e8c: c3 01 movw r24, r6 37e8e: b2 01 movw r22, r4 37e90: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37e94: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 37e98: 60 93 a2 06 sts 0x06A2, r22 ; 0x8006a2 37e9c: 70 93 a3 06 sts 0x06A3, r23 ; 0x8006a3 37ea0: 80 93 a4 06 sts 0x06A4, r24 ; 0x8006a4 37ea4: 90 93 a5 06 sts 0x06A5, r25 ; 0x8006a5 position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]); 37ea8: 89 80 ldd r8, Y+1 ; 0x01 37eaa: 9a 80 ldd r9, Y+2 ; 0x02 37eac: ab 80 ldd r10, Y+3 ; 0x03 37eae: bc 80 ldd r11, Y+4 ; 0x04 37eb0: 20 91 c5 0d lds r18, 0x0DC5 ; 0x800dc5 37eb4: 30 91 c6 0d lds r19, 0x0DC6 ; 0x800dc6 37eb8: 40 91 c7 0d lds r20, 0x0DC7 ; 0x800dc7 37ebc: 50 91 c8 0d lds r21, 0x0DC8 ; 0x800dc8 37ec0: c5 01 movw r24, r10 37ec2: b4 01 movw r22, r8 37ec4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37ec8: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 37ecc: 60 93 a6 06 sts 0x06A6, r22 ; 0x8006a6 37ed0: 70 93 a7 06 sts 0x06A7, r23 ; 0x8006a7 37ed4: 80 93 a8 06 sts 0x06A8, r24 ; 0x8006a8 37ed8: 90 93 a9 06 sts 0x06A9, r25 ; 0x8006a9 #ifdef MESH_BED_LEVELING position[Z_AXIS] = mbl.active ? 37edc: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 37ee0: 88 23 and r24, r24 37ee2: 09 f4 brne .+2 ; 0x37ee6 37ee4: 8c c0 rjmp .+280 ; 0x37ffe lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) : 37ee6: a5 01 movw r20, r10 37ee8: 94 01 movw r18, r8 37eea: c3 01 movw r24, r6 37eec: b2 01 movw r22, r4 37eee: 0f 94 a5 a1 call 0x3434a ; 0x3434a 37ef2: 9b 01 movw r18, r22 37ef4: ac 01 movw r20, r24 37ef6: c7 01 movw r24, r14 37ef8: b6 01 movw r22, r12 37efa: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 37efe: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 37f02: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 37f06: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 37f0a: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc lround(z*cs.axis_steps_per_mm[Z_AXIS]); 37f0e: 0f 94 dd d6 call 0x3adba ; 0x3adba <__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 ? 37f12: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 37f16: 60 93 aa 06 sts 0x06AA, r22 ; 0x8006aa 37f1a: 70 93 ab 06 sts 0x06AB, r23 ; 0x8006ab 37f1e: 80 93 ac 06 sts 0x06AC, r24 ; 0x8006ac 37f22: 90 93 ad 06 sts 0x06AD, r25 ; 0x8006ad 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]); 37f26: 80 91 9d 06 lds r24, 0x069D ; 0x80069d 37f2a: 90 91 9e 06 lds r25, 0x069E ; 0x80069e 37f2e: a0 91 9f 06 lds r26, 0x069F ; 0x80069f 37f32: b0 91 a0 06 lds r27, 0x06A0 ; 0x8006a0 37f36: 89 87 std Y+9, r24 ; 0x09 37f38: 9a 87 std Y+10, r25 ; 0x0a 37f3a: ab 87 std Y+11, r26 ; 0x0b 37f3c: bc 87 std Y+12, r27 ; 0x0c 37f3e: 20 91 cd 0d lds r18, 0x0DCD ; 0x800dcd 37f42: 30 91 ce 0d lds r19, 0x0DCE ; 0x800dce 37f46: 40 91 cf 0d lds r20, 0x0DCF ; 0x800dcf 37f4a: 50 91 d0 0d lds r21, 0x0DD0 ; 0x800dd0 37f4e: bc 01 movw r22, r24 37f50: cd 01 movw r24, r26 37f52: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 37f56: 0f 94 75 e0 call 0x3c0ea ; 0x3c0ea 37f5a: 60 93 ae 06 sts 0x06AE, r22 ; 0x8006ae 37f5e: 70 93 af 06 sts 0x06AF, r23 ; 0x8006af 37f62: 80 93 b0 06 sts 0x06B0, r24 ; 0x8006b0 37f66: 90 93 b1 06 sts 0x06B1, r25 ; 0x8006b1 #ifdef LIN_ADVANCE position_float[X_AXIS] = x; 37f6a: 40 92 cc 04 sts 0x04CC, r4 ; 0x8004cc 37f6e: 50 92 cd 04 sts 0x04CD, r5 ; 0x8004cd 37f72: 60 92 ce 04 sts 0x04CE, r6 ; 0x8004ce 37f76: 70 92 cf 04 sts 0x04CF, r7 ; 0x8004cf position_float[Y_AXIS] = y; 37f7a: 80 92 d0 04 sts 0x04D0, r8 ; 0x8004d0 37f7e: 90 92 d1 04 sts 0x04D1, r9 ; 0x8004d1 37f82: a0 92 d2 04 sts 0x04D2, r10 ; 0x8004d2 37f86: b0 92 d3 04 sts 0x04D3, r11 ; 0x8004d3 position_float[Z_AXIS] = z; 37f8a: c0 92 d4 04 sts 0x04D4, r12 ; 0x8004d4 37f8e: d0 92 d5 04 sts 0x04D5, r13 ; 0x8004d5 37f92: e0 92 d6 04 sts 0x04D6, r14 ; 0x8004d6 37f96: f0 92 d7 04 sts 0x04D7, r15 ; 0x8004d7 position_float[E_AXIS] = e; 37f9a: 89 85 ldd r24, Y+9 ; 0x09 37f9c: 9a 85 ldd r25, Y+10 ; 0x0a 37f9e: ab 85 ldd r26, Y+11 ; 0x0b 37fa0: bc 85 ldd r27, Y+12 ; 0x0c 37fa2: 80 93 d8 04 sts 0x04D8, r24 ; 0x8004d8 37fa6: 90 93 d9 04 sts 0x04D9, r25 ; 0x8004d9 37faa: a0 93 da 04 sts 0x04DA, r26 ; 0x8004da 37fae: b0 93 db 04 sts 0x04DB, r27 ; 0x8004db #endif st_set_position(position); 37fb2: 0f 94 df 87 call 0x30fbe ; 0x30fbe previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. 37fb6: 10 92 b8 04 sts 0x04B8, r1 ; 0x8004b8 <_ZL22previous_nominal_speed.lto_priv.490> 37fba: 10 92 b9 04 sts 0x04B9, r1 ; 0x8004b9 <_ZL22previous_nominal_speed.lto_priv.490+0x1> 37fbe: 10 92 ba 04 sts 0x04BA, r1 ; 0x8004ba <_ZL22previous_nominal_speed.lto_priv.490+0x2> 37fc2: 10 92 bb 04 sts 0x04BB, r1 ; 0x8004bb <_ZL22previous_nominal_speed.lto_priv.490+0x3> memset(previous_speed, 0, sizeof(previous_speed)); 37fc6: ec eb ldi r30, 0xBC ; 188 37fc8: f4 e0 ldi r31, 0x04 ; 4 37fca: 80 e1 ldi r24, 0x10 ; 16 37fcc: df 01 movw r26, r30 37fce: 1d 92 st X+, r1 37fd0: 8a 95 dec r24 37fd2: e9 f7 brne .-6 ; 0x37fce 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]); } 37fd4: 2c 96 adiw r28, 0x0c ; 12 37fd6: 0f b6 in r0, 0x3f ; 63 37fd8: f8 94 cli 37fda: de bf out 0x3e, r29 ; 62 37fdc: 0f be out 0x3f, r0 ; 63 37fde: cd bf out 0x3d, r28 ; 61 37fe0: df 91 pop r29 37fe2: cf 91 pop r28 37fe4: ff 90 pop r15 37fe6: ef 90 pop r14 37fe8: df 90 pop r13 37fea: cf 90 pop r12 37fec: bf 90 pop r11 37fee: af 90 pop r10 37ff0: 9f 90 pop r9 37ff2: 8f 90 pop r8 37ff4: 7f 90 pop r7 37ff6: 6f 90 pop r6 37ff8: 5f 90 pop r5 37ffa: 4f 90 pop r4 37ffc: 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]); 37ffe: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 38002: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 38006: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 3800a: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 3800e: c7 01 movw r24, r14 38010: b6 01 movw r22, r12 38012: 7d cf rjmp .-262 ; 0x37f0e 00038014 : 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) { 38014: 8f 92 push r8 38016: 9f 92 push r9 38018: af 92 push r10 3801a: bf 92 push r11 3801c: cf 92 push r12 3801e: df 92 push r13 38020: ef 92 push r14 38022: ff 92 push r15 38024: 0f 93 push r16 38026: 1f 93 push r17 38028: 4b 01 movw r8, r22 3802a: 5c 01 movw r10, r24 plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate); 3802c: e3 e7 ldi r30, 0x73 ; 115 3802e: f6 e0 ldi r31, 0x06 ; 6 38030: e0 84 ldd r14, Z+8 ; 0x08 38032: f1 84 ldd r15, Z+9 ; 0x09 38034: 02 85 ldd r16, Z+10 ; 0x0a 38036: 13 85 ldd r17, Z+11 ; 0x0b 38038: 24 81 ldd r18, Z+4 ; 0x04 3803a: 35 81 ldd r19, Z+5 ; 0x05 3803c: 46 81 ldd r20, Z+6 ; 0x06 3803e: 57 81 ldd r21, Z+7 ; 0x07 38040: 60 81 ld r22, Z 38042: 71 81 ldd r23, Z+1 ; 0x01 38044: 82 81 ldd r24, Z+2 ; 0x02 38046: 93 81 ldd r25, Z+3 ; 0x03 38048: 1f 92 push r1 3804a: 1f 92 push r1 3804c: 1f 92 push r1 3804e: 1f 92 push r1 38050: ef e7 ldi r30, 0x7F ; 127 38052: ce 2e mov r12, r30 38054: e6 e0 ldi r30, 0x06 ; 6 38056: de 2e mov r13, r30 38058: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 3805c: 0f 90 pop r0 3805e: 0f 90 pop r0 38060: 0f 90 pop r0 38062: 0f 90 pop r0 } 38064: 1f 91 pop r17 38066: 0f 91 pop r16 38068: ff 90 pop r15 3806a: ef 90 pop r14 3806c: df 90 pop r13 3806e: cf 90 pop r12 38070: bf 90 pop r11 38072: af 90 pop r10 38074: 9f 90 pop r9 38076: 8f 90 pop r8 38078: 08 95 ret 0003807a : // Reset position sync requests plan_reset_next_e_queue = false; plan_reset_next_e_sched = false; } void plan_buffer_line_curposXYZE(float feed_rate) { 3807a: 8f 92 push r8 3807c: 9f 92 push r9 3807e: af 92 push r10 38080: bf 92 push r11 38082: cf 92 push r12 38084: df 92 push r13 38086: ef 92 push r14 38088: ff 92 push r15 3808a: 0f 93 push r16 3808c: 1f 93 push r17 3808e: 4b 01 movw r8, r22 38090: 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); 38092: e1 e9 ldi r30, 0x91 ; 145 38094: f6 e0 ldi r31, 0x06 ; 6 38096: e0 84 ldd r14, Z+8 ; 0x08 38098: f1 84 ldd r15, Z+9 ; 0x09 3809a: 02 85 ldd r16, Z+10 ; 0x0a 3809c: 13 85 ldd r17, Z+11 ; 0x0b 3809e: 24 81 ldd r18, Z+4 ; 0x04 380a0: 35 81 ldd r19, Z+5 ; 0x05 380a2: 46 81 ldd r20, Z+6 ; 0x06 380a4: 57 81 ldd r21, Z+7 ; 0x07 380a6: 60 81 ld r22, Z 380a8: 71 81 ldd r23, Z+1 ; 0x01 380aa: 82 81 ldd r24, Z+2 ; 0x02 380ac: 93 81 ldd r25, Z+3 ; 0x03 380ae: 1f 92 push r1 380b0: 1f 92 push r1 380b2: 1f 92 push r1 380b4: 1f 92 push r1 380b6: ed e9 ldi r30, 0x9D ; 157 380b8: ce 2e mov r12, r30 380ba: e6 e0 ldi r30, 0x06 ; 6 380bc: de 2e mov r13, r30 380be: 0f 94 e8 b0 call 0x361d0 ; 0x361d0 380c2: 0f 90 pop r0 380c4: 0f 90 pop r0 380c6: 0f 90 pop r0 380c8: 0f 90 pop r0 } 380ca: 1f 91 pop r17 380cc: 0f 91 pop r16 380ce: ff 90 pop r15 380d0: ef 90 pop r14 380d2: df 90 pop r13 380d4: cf 90 pop r12 380d6: bf 90 pop r11 380d8: af 90 pop r10 380da: 9f 90 pop r9 380dc: 8f 90 pop r8 380de: 08 95 ret 000380e0 : #endif /* PLANNER_DIAGNOSTICS */ extern volatile uint32_t step_events_completed; // The number of step events executed in the current block void planner_reset_position() { 380e0: 4f 92 push r4 380e2: 5f 92 push r5 380e4: 6f 92 push r6 380e6: 7f 92 push r7 380e8: 8f 92 push r8 380ea: 9f 92 push r9 380ec: af 92 push r10 380ee: bf 92 push r11 380f0: cf 92 push r12 380f2: df 92 push r13 380f4: ef 92 push r14 380f6: ff 92 push r15 380f8: cf 93 push r28 // First update the planner's current position in the physical motor steps. position[X_AXIS] = st_get_position(X_AXIS); 380fa: 80 e0 ldi r24, 0x00 ; 0 380fc: 0f 94 87 43 call 0x2870e ; 0x2870e 38100: 60 93 a2 06 sts 0x06A2, r22 ; 0x8006a2 38104: 70 93 a3 06 sts 0x06A3, r23 ; 0x8006a3 38108: 80 93 a4 06 sts 0x06A4, r24 ; 0x8006a4 3810c: 90 93 a5 06 sts 0x06A5, r25 ; 0x8006a5 position[Y_AXIS] = st_get_position(Y_AXIS); 38110: 81 e0 ldi r24, 0x01 ; 1 38112: 0f 94 87 43 call 0x2870e ; 0x2870e 38116: 60 93 a6 06 sts 0x06A6, r22 ; 0x8006a6 3811a: 70 93 a7 06 sts 0x06A7, r23 ; 0x8006a7 3811e: 80 93 a8 06 sts 0x06A8, r24 ; 0x8006a8 38122: 90 93 a9 06 sts 0x06A9, r25 ; 0x8006a9 position[Z_AXIS] = st_get_position(Z_AXIS); 38126: 82 e0 ldi r24, 0x02 ; 2 38128: 0f 94 87 43 call 0x2870e ; 0x2870e 3812c: 60 93 aa 06 sts 0x06AA, r22 ; 0x8006aa 38130: 70 93 ab 06 sts 0x06AB, r23 ; 0x8006ab 38134: 80 93 ac 06 sts 0x06AC, r24 ; 0x8006ac 38138: 90 93 ad 06 sts 0x06AD, r25 ; 0x8006ad position[E_AXIS] = st_get_position(E_AXIS); 3813c: 83 e0 ldi r24, 0x03 ; 3 3813e: 0f 94 87 43 call 0x2870e ; 0x2870e 38142: 60 93 ae 06 sts 0x06AE, r22 ; 0x8006ae 38146: 70 93 af 06 sts 0x06AF, r23 ; 0x8006af 3814a: 80 93 b0 06 sts 0x06B0, r24 ; 0x8006b0 3814e: 90 93 b1 06 sts 0x06B1, r25 ; 0x8006b1 // Second update the current position of the front end. current_position[X_AXIS] = st_get_position_mm(X_AXIS); 38152: 80 e0 ldi r24, 0x00 ; 0 38154: 0f 94 95 43 call 0x2872a ; 0x2872a 38158: 60 93 91 06 sts 0x0691, r22 ; 0x800691 3815c: 70 93 92 06 sts 0x0692, r23 ; 0x800692 38160: 80 93 93 06 sts 0x0693, r24 ; 0x800693 38164: 90 93 94 06 sts 0x0694, r25 ; 0x800694 current_position[Y_AXIS] = st_get_position_mm(Y_AXIS); 38168: 81 e0 ldi r24, 0x01 ; 1 3816a: 0f 94 95 43 call 0x2872a ; 0x2872a 3816e: 60 93 95 06 sts 0x0695, r22 ; 0x800695 38172: 70 93 96 06 sts 0x0696, r23 ; 0x800696 38176: 80 93 97 06 sts 0x0697, r24 ; 0x800697 3817a: 90 93 98 06 sts 0x0698, r25 ; 0x800698 current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); 3817e: 82 e0 ldi r24, 0x02 ; 2 38180: 0f 94 95 43 call 0x2872a ; 0x2872a 38184: 60 93 99 06 sts 0x0699, r22 ; 0x800699 38188: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 3818c: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 38190: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c current_position[E_AXIS] = st_get_position_mm(E_AXIS); 38194: 83 e0 ldi r24, 0x03 ; 3 38196: 0f 94 95 43 call 0x2872a ; 0x2872a 3819a: 60 93 9d 06 sts 0x069D, r22 ; 0x80069d 3819e: 70 93 9e 06 sts 0x069E, r23 ; 0x80069e 381a2: 80 93 9f 06 sts 0x069F, r24 ; 0x80069f 381a6: 90 93 a0 06 sts 0x06A0, r25 ; 0x8006a0 // Apply the mesh bed leveling correction to the Z axis. #ifdef MESH_BED_LEVELING if (mbl.active) { 381aa: 80 91 c1 13 lds r24, 0x13C1 ; 0x8013c1 381ae: 88 23 and r24, r24 381b0: 31 f1 breq .+76 ; 0x381fe #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]); 381b2: 20 91 95 06 lds r18, 0x0695 ; 0x800695 381b6: 30 91 96 06 lds r19, 0x0696 ; 0x800696 381ba: 40 91 97 06 lds r20, 0x0697 ; 0x800697 381be: 50 91 98 06 lds r21, 0x0698 ; 0x800698 381c2: 60 91 91 06 lds r22, 0x0691 ; 0x800691 381c6: 70 91 92 06 lds r23, 0x0692 ; 0x800692 381ca: 80 91 93 06 lds r24, 0x0693 ; 0x800693 381ce: 90 91 94 06 lds r25, 0x0694 ; 0x800694 381d2: 0f 94 a5 a1 call 0x3434a ; 0x3434a 381d6: 9b 01 movw r18, r22 381d8: ac 01 movw r20, r24 381da: 60 91 99 06 lds r22, 0x0699 ; 0x800699 381de: 70 91 9a 06 lds r23, 0x069A ; 0x80069a 381e2: 80 91 9b 06 lds r24, 0x069B ; 0x80069b 381e6: 90 91 9c 06 lds r25, 0x069C ; 0x80069c 381ea: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 381ee: 60 93 99 06 sts 0x0699, r22 ; 0x800699 381f2: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 381f6: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 381fa: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c } } inline void machine2world(float &x, float &y) { if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) { 381fe: c0 91 0e 18 lds r28, 0x180E ; 0x80180e 38202: cc 23 and r28, r28 38204: 09 f4 brne .+2 ; 0x38208 38206: 9a c0 rjmp .+308 ; 0x3833c // No correction. } else { if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) { 38208: c0 ff sbrs r28, 0 3820a: 34 c0 rjmp .+104 ; 0x38274 // Then add the offset. x -= world2machine_shift[0]; 3820c: 20 91 06 18 lds r18, 0x1806 ; 0x801806 38210: 30 91 07 18 lds r19, 0x1807 ; 0x801807 38214: 40 91 08 18 lds r20, 0x1808 ; 0x801808 38218: 50 91 09 18 lds r21, 0x1809 ; 0x801809 3821c: 60 91 91 06 lds r22, 0x0691 ; 0x800691 38220: 70 91 92 06 lds r23, 0x0692 ; 0x800692 38224: 80 91 93 06 lds r24, 0x0693 ; 0x800693 38228: 90 91 94 06 lds r25, 0x0694 ; 0x800694 3822c: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 38230: 60 93 91 06 sts 0x0691, r22 ; 0x800691 38234: 70 93 92 06 sts 0x0692, r23 ; 0x800692 38238: 80 93 93 06 sts 0x0693, r24 ; 0x800693 3823c: 90 93 94 06 sts 0x0694, r25 ; 0x800694 y -= world2machine_shift[1]; 38240: 20 91 0a 18 lds r18, 0x180A ; 0x80180a 38244: 30 91 0b 18 lds r19, 0x180B ; 0x80180b 38248: 40 91 0c 18 lds r20, 0x180C ; 0x80180c 3824c: 50 91 0d 18 lds r21, 0x180D ; 0x80180d 38250: 60 91 95 06 lds r22, 0x0695 ; 0x800695 38254: 70 91 96 06 lds r23, 0x0696 ; 0x800696 38258: 80 91 97 06 lds r24, 0x0697 ; 0x800697 3825c: 90 91 98 06 lds r25, 0x0698 ; 0x800698 38260: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 38264: 60 93 95 06 sts 0x0695, r22 ; 0x800695 38268: 70 93 96 06 sts 0x0696, r23 ; 0x800696 3826c: 80 93 97 06 sts 0x0697, r24 ; 0x800697 38270: 90 93 98 06 sts 0x0698, r25 ; 0x800698 } if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) { 38274: c1 ff sbrs r28, 1 38276: 62 c0 rjmp .+196 ; 0x3833c // Firs the skew & rotation correction. float out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y; 38278: 80 90 91 06 lds r8, 0x0691 ; 0x800691 3827c: 90 90 92 06 lds r9, 0x0692 ; 0x800692 38280: a0 90 93 06 lds r10, 0x0693 ; 0x800693 38284: b0 90 94 06 lds r11, 0x0694 ; 0x800694 38288: c0 90 95 06 lds r12, 0x0695 ; 0x800695 3828c: d0 90 96 06 lds r13, 0x0696 ; 0x800696 38290: e0 90 97 06 lds r14, 0x0697 ; 0x800697 38294: f0 90 98 06 lds r15, 0x0698 ; 0x800698 float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; 38298: 20 91 fe 17 lds r18, 0x17FE ; 0x8017fe 3829c: 30 91 ff 17 lds r19, 0x17FF ; 0x8017ff 382a0: 40 91 00 18 lds r20, 0x1800 ; 0x801800 382a4: 50 91 01 18 lds r21, 0x1801 ; 0x801801 382a8: c5 01 movw r24, r10 382aa: b4 01 movw r22, r8 382ac: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 382b0: 2b 01 movw r4, r22 382b2: 3c 01 movw r6, r24 382b4: 20 91 02 18 lds r18, 0x1802 ; 0x801802 382b8: 30 91 03 18 lds r19, 0x1803 ; 0x801803 382bc: 40 91 04 18 lds r20, 0x1804 ; 0x801804 382c0: 50 91 05 18 lds r21, 0x1805 ; 0x801805 382c4: c7 01 movw r24, r14 382c6: b6 01 movw r22, r12 382c8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 382cc: 9b 01 movw r18, r22 382ce: ac 01 movw r20, r24 382d0: c3 01 movw r24, r6 382d2: b2 01 movw r22, r4 382d4: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 382d8: 2b 01 movw r4, r22 382da: 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; 382dc: 20 91 f6 17 lds r18, 0x17F6 ; 0x8017f6 382e0: 30 91 f7 17 lds r19, 0x17F7 ; 0x8017f7 382e4: 40 91 f8 17 lds r20, 0x17F8 ; 0x8017f8 382e8: 50 91 f9 17 lds r21, 0x17F9 ; 0x8017f9 382ec: c5 01 movw r24, r10 382ee: b4 01 movw r22, r8 382f0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 382f4: 4b 01 movw r8, r22 382f6: 5c 01 movw r10, r24 382f8: 20 91 fa 17 lds r18, 0x17FA ; 0x8017fa 382fc: 30 91 fb 17 lds r19, 0x17FB ; 0x8017fb 38300: 40 91 fc 17 lds r20, 0x17FC ; 0x8017fc 38304: 50 91 fd 17 lds r21, 0x17FD ; 0x8017fd 38308: c7 01 movw r24, r14 3830a: b6 01 movw r22, r12 3830c: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 38310: 9b 01 movw r18, r22 38312: ac 01 movw r20, r24 38314: c5 01 movw r24, r10 38316: b4 01 movw r22, r8 38318: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y; x = out_x; 3831c: 60 93 91 06 sts 0x0691, r22 ; 0x800691 38320: 70 93 92 06 sts 0x0692, r23 ; 0x800692 38324: 80 93 93 06 sts 0x0693, r24 ; 0x800693 38328: 90 93 94 06 sts 0x0694, r25 ; 0x800694 y = out_y; 3832c: 40 92 95 06 sts 0x0695, r4 ; 0x800695 38330: 50 92 96 06 sts 0x0696, r5 ; 0x800696 38334: 60 92 97 06 sts 0x0697, r6 ; 0x800697 38338: 70 92 98 06 sts 0x0698, r7 ; 0x800698 } #endif // Apply inverse world correction matrix. machine2world(current_position[X_AXIS], current_position[Y_AXIS]); set_destination_to_current(); 3833c: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 #ifdef LIN_ADVANCE memcpy(position_float, current_position, sizeof(position_float)); 38340: 80 e1 ldi r24, 0x10 ; 16 38342: e1 e9 ldi r30, 0x91 ; 145 38344: f6 e0 ldi r31, 0x06 ; 6 38346: ac ec ldi r26, 0xCC ; 204 38348: b4 e0 ldi r27, 0x04 ; 4 3834a: 01 90 ld r0, Z+ 3834c: 0d 92 st X+, r0 3834e: 8a 95 dec r24 38350: e1 f7 brne .-8 ; 0x3834a #endif } 38352: cf 91 pop r28 38354: ff 90 pop r15 38356: ef 90 pop r14 38358: df 90 pop r13 3835a: cf 90 pop r12 3835c: bf 90 pop r11 3835e: af 90 pop r10 38360: 9f 90 pop r9 38362: 8f 90 pop r8 38364: 7f 90 pop r7 38366: 6f 90 pop r6 38368: 5f 90 pop r5 3836a: 4f 90 pop r4 3836c: 08 95 ret 0003836e : void planner_abort_hard() { // Abort the stepper routine and flush the planner queue. DISABLE_STEPPER_DRIVER_INTERRUPT(); 3836e: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 38372: 8d 7f andi r24, 0xFD ; 253 38374: 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(); 38378: 0f 94 70 c0 call 0x380e0 ; 0x380e0 // Relay to planner wait routine that the current line shall be canceled. planner_aborted = true; 3837c: 81 e0 ldi r24, 0x01 ; 1 3837e: 80 93 ab 0d sts 0x0DAB, r24 ; 0x800dab } void quickStop() { DISABLE_STEPPER_DRIVER_INTERRUPT(); 38382: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 38386: 8d 7f andi r24, 0xFD ; 253 38388: 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); 3838c: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 38390: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 while (blocks_queued()) plan_discard_current_block(); 38394: 98 17 cp r25, r24 38396: 69 f0 breq .+26 ; 0x383b2 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) { 38398: 90 91 a4 0d lds r25, 0x0DA4 ; 0x800da4 3839c: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 383a0: 98 17 cp r25, r24 383a2: a1 f3 breq .-24 ; 0x3838c block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); 383a4: 80 91 a5 0d lds r24, 0x0DA5 ; 0x800da5 383a8: 8f 5f subi r24, 0xFF ; 255 383aa: 8f 70 andi r24, 0x0F ; 15 383ac: 80 93 a5 0d sts 0x0DA5, r24 ; 0x800da5 383b0: ed cf rjmp .-38 ; 0x3838c current_block = NULL; 383b2: 10 92 a1 05 sts 0x05A1, r1 ; 0x8005a1 383b6: 10 92 a0 05 sts 0x05A0, r1 ; 0x8005a0 #ifdef LIN_ADVANCE nextAdvanceISR = ADV_NEVER; 383ba: 8f ef ldi r24, 0xFF ; 255 383bc: 9f ef ldi r25, 0xFF ; 255 383be: 90 93 e3 04 sts 0x04E3, r25 ; 0x8004e3 <_ZL14nextAdvanceISR.lto_priv.479+0x1> 383c2: 80 93 e2 04 sts 0x04E2, r24 ; 0x8004e2 <_ZL14nextAdvanceISR.lto_priv.479> current_adv_steps = 0; 383c6: 10 92 df 04 sts 0x04DF, r1 ; 0x8004df <_ZL17current_adv_steps.lto_priv.481+0x1> 383ca: 10 92 de 04 sts 0x04DE, r1 ; 0x8004de <_ZL17current_adv_steps.lto_priv.481> #endif st_reset_timer(); 383ce: 0f 94 03 44 call 0x28806 ; 0x28806 ENABLE_STEPPER_DRIVER_INTERRUPT(); 383d2: 80 91 6f 00 lds r24, 0x006F ; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f> 383d6: 82 60 ori r24, 0x02 ; 2 383d8: 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; 383dc: 10 92 b8 04 sts 0x04B8, r1 ; 0x8004b8 <_ZL22previous_nominal_speed.lto_priv.490> 383e0: 10 92 b9 04 sts 0x04B9, r1 ; 0x8004b9 <_ZL22previous_nominal_speed.lto_priv.490+0x1> 383e4: 10 92 ba 04 sts 0x04BA, r1 ; 0x8004ba <_ZL22previous_nominal_speed.lto_priv.490+0x2> 383e8: 10 92 bb 04 sts 0x04BB, r1 ; 0x8004bb <_ZL22previous_nominal_speed.lto_priv.490+0x3> memset(previous_speed, 0, sizeof(previous_speed)); 383ec: ec eb ldi r30, 0xBC ; 188 383ee: f4 e0 ldi r31, 0x04 ; 4 383f0: 80 e1 ldi r24, 0x10 ; 16 383f2: df 01 movw r26, r30 383f4: 1d 92 st X+, r1 383f6: 8a 95 dec r24 383f8: e9 f7 brne .-6 ; 0x383f4 // Reset position sync requests plan_reset_next_e_queue = false; 383fa: 10 92 b7 04 sts 0x04B7, r1 ; 0x8004b7 <_ZL23plan_reset_next_e_queue.lto_priv.488> plan_reset_next_e_sched = false; 383fe: 10 92 b6 04 sts 0x04B6, r1 ; 0x8004b6 <_ZL23plan_reset_next_e_sched.lto_priv.489> } 38402: 08 95 ret 00038404 : pat9125_PID2 = 0xff; return 0; } static void pat9125_wr_reg(uint8_t addr, uint8_t data) { 38404: cf 93 push r28 38406: c6 2f mov r28, r22 } uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data) { if(twi_start(address, reg)) 38408: 0f 94 ba 7b call 0x2f774 ; 0x2f774 3840c: 81 11 cpse r24, r1 3840e: 0f c0 rjmp .+30 ; 0x3842e return 1; // send data TWDR = data; 38410: c0 93 bb 00 sts 0x00BB, r28 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 38414: 84 e8 ldi r24, 0x84 ; 132 38416: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MT_DATA_ACK)) 3841a: 88 e2 ldi r24, 0x28 ; 40 3841c: 0f 94 95 2a call 0x2552a ; 0x2552a 38420: 81 11 cpse r24, r1 38422: 05 c0 rjmp .+10 ; 0x3842e } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 38424: 84 e9 ldi r24, 0x94 ; 148 38426: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> error: pat9125_PID1 = 0xff; pat9125_PID2 = 0xff; return; } 3842a: cf 91 pop r28 3842c: 08 95 ret goto error; #endif return; error: pat9125_PID1 = 0xff; 3842e: 8f ef ldi r24, 0xFF ; 255 38430: 80 93 bc 0d sts 0x0DBC, r24 ; 0x800dbc pat9125_PID2 = 0xff; 38434: 80 93 bb 0d sts 0x0DBB, r24 ; 0x800dbb 38438: f8 cf rjmp .-16 ; 0x3842a 0003843a : } return 0; } static uint8_t pat9125_rd_reg(uint8_t addr) { 3843a: cf 93 push r28 } uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data) { if(twi_start(address, reg)) 3843c: 0f 94 ba 7b call 0x2f774 ; 0x2f774 38440: 81 11 cpse r24, r1 38442: 21 c0 rjmp .+66 ; 0x38486 return 1; // repeat start TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA); 38444: 84 ea ldi r24, 0xA4 ; 164 38446: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_REP_START)) 3844a: 80 e1 ldi r24, 0x10 ; 16 3844c: 0f 94 95 2a call 0x2552a ; 0x2552a 38450: 81 11 cpse r24, r1 38452: 19 c0 rjmp .+50 ; 0x38486 return 2; // start receiving TWDR = TW_READ | (address << 1); 38454: 8b ee ldi r24, 0xEB ; 235 38456: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> TWCR = _BV(TWEN) | _BV(TWINT); 3845a: c4 e8 ldi r28, 0x84 ; 132 3845c: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MR_SLA_ACK)) 38460: 80 e4 ldi r24, 0x40 ; 64 38462: 0f 94 95 2a call 0x2552a ; 0x2552a 38466: 81 11 cpse r24, r1 38468: 0e c0 rjmp .+28 ; 0x38486 return 3; // receive data TWCR = _BV(TWEN) | _BV(TWINT); 3846a: c0 93 bc 00 sts 0x00BC, r28 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> if(twi_wait(TW_MR_DATA_NACK)) 3846e: 88 e5 ldi r24, 0x58 ; 88 38470: 0f 94 95 2a call 0x2552a ; 0x2552a 38474: 81 11 cpse r24, r1 38476: 07 c0 rjmp .+14 ; 0x38486 return 4; *data = TWDR; 38478: 80 91 bb 00 lds r24, 0x00BB ; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb> } static void twi_stop() { TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO); 3847c: 94 e9 ldi r25, 0x94 ; 148 3847e: 90 93 bc 00 sts 0x00BC, r25 ; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc> error: pat9125_PID1 = 0xff; pat9125_PID2 = 0xff; return 0; } 38482: cf 91 pop r28 38484: 08 95 ret goto error; #endif return data; error: pat9125_PID1 = 0xff; 38486: 8f ef ldi r24, 0xFF ; 255 38488: 80 93 bc 0d sts 0x0DBC, r24 ; 0x800dbc pat9125_PID2 = 0xff; 3848c: 80 93 bb 0d sts 0x0DBB, r24 ; 0x800dbb return 0; 38490: 80 e0 ldi r24, 0x00 ; 0 38492: f7 cf rjmp .-18 ; 0x38482 00038494 : pat9125_wr_reg(addr, data); return pat9125_rd_reg(addr) == data; } static uint8_t pat9125_wr_seq(const uint8_t* seq) { 38494: 0f 93 push r16 38496: 1f 93 push r17 38498: cf 93 push r28 3849a: df 93 push r29 3849c: 8c 01 movw r16, r24 for (;;) { const uint8_t addr = pgm_read_byte(seq++); 3849e: f8 01 movw r30, r16 384a0: d4 91 lpm r29, Z if (addr == 0xff) 384a2: df 3f cpi r29, 0xFF ; 255 384a4: 99 f0 breq .+38 ; 0x384cc break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) 384a6: 31 96 adiw r30, 0x01 ; 1 384a8: c4 91 lpm r28, Z return; } static uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data) { pat9125_wr_reg(addr, data); 384aa: 6c 2f mov r22, r28 384ac: 8d 2f mov r24, r29 384ae: 0f 94 02 c2 call 0x38404 ; 0x38404 return pat9125_rd_reg(addr) == data; 384b2: 8d 2f mov r24, r29 384b4: 0f 94 1d c2 call 0x3843a ; 0x3843a { for (;;) { const uint8_t addr = pgm_read_byte(seq++); if (addr == 0xff) break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) 384b8: 0e 5f subi r16, 0xFE ; 254 384ba: 1f 4f sbci r17, 0xFF ; 255 384bc: c8 17 cp r28, r24 384be: 79 f3 breq .-34 ; 0x3849e // Verification of the register write failed. return 0; 384c0: 80 e0 ldi r24, 0x00 ; 0 } return 1; } 384c2: df 91 pop r29 384c4: cf 91 pop r28 384c6: 1f 91 pop r17 384c8: 0f 91 pop r16 384ca: 08 95 ret break; if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++))) // Verification of the register write failed. return 0; } return 1; 384cc: 81 e0 ldi r24, 0x01 ; 1 384ce: f9 cf rjmp .-14 ; 0x384c2 000384d0 : return 1; } uint8_t pat9125_update(void) { 384d0: cf 93 push r28 384d2: df 93 push r29 if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91)) 384d4: 80 91 bc 0d lds r24, 0x0DBC ; 0x800dbc 384d8: 81 33 cpi r24, 0x31 ; 49 384da: 21 f0 breq .+8 ; 0x384e4 pat9125_x += iDX; pat9125_y += iDY; } return 1; } return 0; 384dc: 80 e0 ldi r24, 0x00 ; 0 } 384de: df 91 pop r29 384e0: cf 91 pop r28 384e2: 08 95 ret return 1; } uint8_t pat9125_update(void) { if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91)) 384e4: 80 91 bb 0d lds r24, 0x0DBB ; 0x800dbb 384e8: 81 39 cpi r24, 0x91 ; 145 384ea: c1 f7 brne .-16 ; 0x384dc { uint8_t ucMotion = pat9125_rd_reg(PAT9125_MOTION); 384ec: 82 e0 ldi r24, 0x02 ; 2 384ee: 0f 94 1d c2 call 0x3843a ; 0x3843a 384f2: c8 2f mov r28, r24 pat9125_b = pat9125_rd_reg(PAT9125_FRAME); 384f4: 87 e1 ldi r24, 0x17 ; 23 384f6: 0f 94 1d c2 call 0x3843a ; 0x3843a 384fa: 80 93 b9 0d sts 0x0DB9, r24 ; 0x800db9 pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER); 384fe: 84 e1 ldi r24, 0x14 ; 20 38500: 0f 94 1d c2 call 0x3843a ; 0x3843a 38504: 80 93 ba 0d sts 0x0DBA, r24 ; 0x800dba if (pat9125_PID1 == 0xff) return 0; 38508: 80 91 bc 0d lds r24, 0x0DBC ; 0x800dbc 3850c: 8f 3f cpi r24, 0xFF ; 255 3850e: 31 f3 breq .-52 ; 0x384dc if (ucMotion & 0x80) 38510: c7 ff sbrs r28, 7 38512: 36 c0 rjmp .+108 ; 0x38580 { uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL); 38514: 83 e0 ldi r24, 0x03 ; 3 38516: 0f 94 1d c2 call 0x3843a ; 0x3843a 3851a: d8 2f mov r29, r24 uint16_t ucYL = pat9125_rd_reg(PAT9125_DELTA_YL); 3851c: 84 e0 ldi r24, 0x04 ; 4 3851e: 0f 94 1d c2 call 0x3843a ; 0x3843a 38522: c8 2f mov r28, r24 uint16_t ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH); 38524: 82 e1 ldi r24, 0x12 ; 18 38526: 0f 94 1d c2 call 0x3843a ; 0x3843a if (pat9125_PID1 == 0xff) return 0; 3852a: 90 91 bc 0d lds r25, 0x0DBC ; 0x800dbc 3852e: 9f 3f cpi r25, 0xFF ; 255 38530: a9 f2 breq .-86 ; 0x384dc 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); 38532: 90 e0 ldi r25, 0x00 ; 0 if (pat9125_PID1 == 0xff) return 0; int16_t iDX = ucXL | ((ucXYH << 4) & 0xf00); 38534: 9c 01 movw r18, r24 38536: 44 e0 ldi r20, 0x04 ; 4 38538: 22 0f add r18, r18 3853a: 33 1f adc r19, r19 3853c: 4a 95 dec r20 3853e: e1 f7 brne .-8 ; 0x38538 38540: 22 27 eor r18, r18 38542: 3f 70 andi r19, 0x0F ; 15 38544: 2d 2b or r18, r29 int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00); 38546: 98 2f mov r25, r24 38548: 88 27 eor r24, r24 3854a: 88 27 eor r24, r24 3854c: 9f 70 andi r25, 0x0F ; 15 3854e: 8c 2b or r24, r28 if (iDX & 0x800) iDX -= 4096; 38550: 33 fd sbrc r19, 3 38552: 30 51 subi r19, 0x10 ; 16 if (iDY & 0x800) iDY -= 4096; 38554: 93 fd sbrc r25, 3 38556: 90 51 subi r25, 0x10 ; 16 pat9125_x += iDX; 38558: 40 91 95 03 lds r20, 0x0395 ; 0x800395 3855c: 50 91 96 03 lds r21, 0x0396 ; 0x800396 38560: 24 0f add r18, r20 38562: 35 1f adc r19, r21 38564: 30 93 96 03 sts 0x0396, r19 ; 0x800396 38568: 20 93 95 03 sts 0x0395, r18 ; 0x800395 pat9125_y += iDY; 3856c: 20 91 8e 0e lds r18, 0x0E8E ; 0x800e8e 38570: 30 91 8f 0e lds r19, 0x0E8F ; 0x800e8f 38574: 82 0f add r24, r18 38576: 93 1f adc r25, r19 38578: 90 93 8f 0e sts 0x0E8F, r25 ; 0x800e8f 3857c: 80 93 8e 0e sts 0x0E8E, r24 ; 0x800e8e } return 1; 38580: 81 e0 ldi r24, 0x01 ; 1 38582: ad cf rjmp .-166 ; 0x384de 00038584 : extern "C" { #endif //defined(__cplusplus) static inline void spi_init() { DDRB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO)); 38584: 84 b1 in r24, 0x04 ; 4 38586: 81 7f andi r24, 0xF1 ; 241 38588: 84 b9 out 0x04, r24 ; 4 DDRB |= (1 << DD_SS) | (1 << DD_SCK) | (1 << DD_MOSI); 3858a: 84 b1 in r24, 0x04 ; 4 3858c: 87 60 ori r24, 0x07 ; 7 3858e: 84 b9 out 0x04, r24 ; 4 PORTB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO)); 38590: 85 b1 in r24, 0x05 ; 5 38592: 81 7f andi r24, 0xF1 ; 241 38594: 85 b9 out 0x05, r24 ; 5 PORTB |= (1 << DD_SS); 38596: 28 9a sbi 0x05, 0 ; 5 SPCR = SPI_SPCR(0, 0, 0, 1, 0); //SPE=1, MSTR=1 (0x50) 38598: 80 e5 ldi r24, 0x50 ; 80 3859a: 8c bd out 0x2c, r24 ; 44 SPSR = 0x00; 3859c: 1d bc out 0x2d, r1 ; 45 } 3859e: 08 95 ret 000385a0 : //! @brief Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory. //! @return 1 if "start\n" was not sent. Optiboot was skipped //! @return 0 if "start\n" was sent. Optiboot ran normally. No need to send "start\n" in setup() uint8_t optiboot_xflash_enter() { 385a0: 2f 92 push r2 385a2: 3f 92 push r3 385a4: 4f 92 push r4 385a6: 5f 92 push r5 385a8: 6f 92 push r6 385aa: 7f 92 push r7 385ac: 8f 92 push r8 385ae: 9f 92 push r9 385b0: af 92 push r10 385b2: bf 92 push r11 385b4: cf 92 push r12 385b6: df 92 push r13 385b8: ef 92 push r14 385ba: ff 92 push r15 385bc: 0f 93 push r16 385be: 1f 93 push r17 385c0: cf 93 push r28 385c2: df 93 push r29 385c4: cd b7 in r28, 0x3d ; 61 385c6: de b7 in r29, 0x3e ; 62 385c8: c6 50 subi r28, 0x06 ; 6 385ca: d1 40 sbci r29, 0x01 ; 1 385cc: 0f b6 in r0, 0x3f ; 63 385ce: f8 94 cli 385d0: de bf out 0x3e, r29 ; 62 385d2: 0f be out 0x3f, r0 ; 63 385d4: cd bf out 0x3d, r28 ; 61 // Make sure to check boot_app_magic as well. Since these bootapp flags are located right in the middle of the stack, // they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set, // but rather test 33 bits for the correct value before exiting optiboot early. if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) return 1; 385d6: 80 91 fc 1f lds r24, 0x1FFC ; 0x801ffc <__bss_end+0x7dd> 385da: 90 91 fd 1f lds r25, 0x1FFD ; 0x801ffd <__bss_end+0x7de> 385de: a0 91 fe 1f lds r26, 0x1FFE ; 0x801ffe <__bss_end+0x7df> 385e2: b0 91 ff 1f lds r27, 0x1FFF ; 0x801fff <__bss_end+0x7e0> 385e6: 8a 3a cpi r24, 0xAA ; 170 385e8: 95 45 sbci r25, 0x55 ; 85 385ea: aa 4a sbci r26, 0xAA ; 170 385ec: b5 45 sbci r27, 0x55 ; 85 385ee: 21 f4 brne .+8 ; 0x385f8 385f0: 80 91 fb 1f lds r24, 0x1FFB ; 0x801ffb <__bss_end+0x7dc> 385f4: 87 fd sbrc r24, 7 385f6: c2 c1 rjmp .+900 ; 0x3897c uint8_t pages_erased = 0; // Handshake sequence: Initialize the serial line, flush serial line, send magic, receive magic. // If the magic is not received on time, or it is not received correctly, continue to the application. { wdt_reset(); 385f8: a8 95 wdr const char *ptr = entry_magic_send; const char *end = strlen_P(entry_magic_send) + ptr; const uint8_t selectedSerialPort_bak = selectedSerialPort; 385fa: d0 90 38 05 lds r13, 0x0538 ; 0x800538 // Flush the serial line. while (RECV_READY) { 385fe: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0> 38602: 87 ff sbrs r24, 7 38604: 04 c0 rjmp .+8 ; 0x3860e wdt_reset(); 38606: a8 95 wdr // Dummy register read (discard) (void)(*(char *)UDR0); 38608: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> 3860c: f8 cf rjmp .-16 ; 0x385fe } selectedSerialPort = 0; //switch to Serial0 3860e: 10 92 38 05 sts 0x0538, r1 ; 0x800538 // 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; 38612: 00 91 9a 04 lds r16, 0x049A ; 0x80049a 38616: 10 91 9b 04 lds r17, 0x049B ; 0x80049b 3861a: 10 93 99 04 sts 0x0499, r17 ; 0x800499 3861e: 00 93 98 04 sts 0x0498, r16 ; 0x800498 38622: 51 e9 ldi r21, 0x91 ; 145 38624: e5 2e mov r14, r21 38626: 5c ea ldi r21, 0xAC ; 172 38628: f5 2e mov r15, r21 3862a: 67 e9 ldi r22, 0x97 ; 151 3862c: a6 2e mov r10, r22 3862e: 6c ea ldi r22, 0xAC ; 172 38630: b6 2e mov r11, r22 MYSERIAL.flush(); //clear RX buffer int SerialHead = rx_buffer.head; // Send the initial magic string. while (ptr != end) putch(pgm_read_byte(ptr ++)); 38632: f7 01 movw r30, r14 38634: 84 91 lpm r24, Z 38636: 0f 94 2c ae call 0x35c58 ; 0x35c58 3863a: ff ef ldi r31, 0xFF ; 255 3863c: ef 1a sub r14, r31 3863e: ff 0a sbc r15, r31 } selectedSerialPort = 0; //switch to Serial0 MYSERIAL.flush(); //clear RX buffer int SerialHead = rx_buffer.head; // Send the initial magic string. while (ptr != end) 38640: ae 14 cp r10, r14 38642: bf 04 cpc r11, r15 38644: b1 f7 brne .-20 ; 0x38632 putch(pgm_read_byte(ptr ++)); wdt_reset(); 38646: a8 95 wdr 38648: 8f e0 ldi r24, 0x0F ; 15 3864a: 90 e0 ldi r25, 0x00 ; 0 return 0; } } ch = rx_buffer.buffer[SerialHead]; SerialHead = (unsigned int)(SerialHead + 1) % RX_BUFFER_SIZE; if (pgm_read_byte(ptr ++) != ch) 3864c: 20 e9 ldi r18, 0x90 ; 144 3864e: 3c ea ldi r19, 0xAC ; 172 MYSERIAL.flush(); //clear RX buffer int SerialHead = rx_buffer.head; // Send the initial magic string. while (ptr != end) putch(pgm_read_byte(ptr ++)); wdt_reset(); 38650: 40 e8 ldi r20, 0x80 ; 128 38652: 54 e8 ldi r21, 0x84 ; 132 38654: 6e e1 ldi r22, 0x1E ; 30 38656: 70 e0 ldi r23, 0x00 ; 0 // thus the compiler is allowed to remove the check from the cycle // i.e. rx_buffer.head == SerialHead would not be checked at all! // With the volatile keyword the compiler generates exactly the same code as without it with only one difference: // the last brne instruction jumps onto the (*rx_head == SerialHead) check and NOT onto the wdr instruction bypassing the check. volatile int *rx_head = &rx_buffer.head; while (*rx_head == SerialHead) { 38658: e0 91 98 04 lds r30, 0x0498 ; 0x800498 3865c: f0 91 99 04 lds r31, 0x0499 ; 0x800499 38660: e0 17 cp r30, r16 38662: f1 07 cpc r31, r17 38664: 19 f5 brne .+70 ; 0x386ac wdt_reset(); 38666: a8 95 wdr 38668: 41 50 subi r20, 0x01 ; 1 3866a: 51 09 sbc r21, r1 3866c: 61 09 sbc r22, r1 3866e: 71 09 sbc r23, r1 if ( --boot_timer == 0) { 38670: 99 f7 brne .-26 ; 0x38658 ch = rx_buffer.buffer[SerialHead]; SerialHead = (unsigned int)(SerialHead + 1) % RX_BUFFER_SIZE; if (pgm_read_byte(ptr ++) != ch) { // Magic was not received correctly, continue with the application selectedSerialPort = selectedSerialPort_bak; //revert Serial setting 38672: d0 92 38 05 sts 0x0538, r13 ; 0x800538 return 0; 38676: 80 e0 ldi r24, 0x00 ; 0 // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); } putch(STK_OK); } } 38678: ca 5f subi r28, 0xFA ; 250 3867a: de 4f sbci r29, 0xFE ; 254 3867c: 0f b6 in r0, 0x3f ; 63 3867e: f8 94 cli 38680: de bf out 0x3e, r29 ; 62 38682: 0f be out 0x3f, r0 ; 63 38684: cd bf out 0x3d, r28 ; 61 38686: df 91 pop r29 38688: cf 91 pop r28 3868a: 1f 91 pop r17 3868c: 0f 91 pop r16 3868e: ff 90 pop r15 38690: ef 90 pop r14 38692: df 90 pop r13 38694: cf 90 pop r12 38696: bf 90 pop r11 38698: af 90 pop r10 3869a: 9f 90 pop r9 3869c: 8f 90 pop r8 3869e: 7f 90 pop r7 386a0: 6f 90 pop r6 386a2: 5f 90 pop r5 386a4: 4f 90 pop r4 386a6: 3f 90 pop r3 386a8: 2f 90 pop r2 386aa: 08 95 ret // Timeout expired, continue with the application. selectedSerialPort = selectedSerialPort_bak; //revert Serial setting return 0; } } ch = rx_buffer.buffer[SerialHead]; 386ac: f8 01 movw r30, r16 386ae: e8 5e subi r30, 0xE8 ; 232 386b0: fb 4f sbci r31, 0xFB ; 251 386b2: 40 81 ld r20, Z SerialHead = (unsigned int)(SerialHead + 1) % RX_BUFFER_SIZE; 386b4: 0f 5f subi r16, 0xFF ; 255 386b6: 1f 4f sbci r17, 0xFF ; 255 386b8: 0f 77 andi r16, 0x7F ; 127 386ba: 11 27 eor r17, r17 if (pgm_read_byte(ptr ++) != ch) 386bc: f9 01 movw r30, r18 386be: e8 1b sub r30, r24 386c0: f9 0b sbc r31, r25 386c2: e4 91 lpm r30, Z 386c4: 4e 13 cpse r20, r30 386c6: d5 cf rjmp .-86 ; 0x38672 { // Magic was not received correctly, continue with the application selectedSerialPort = selectedSerialPort_bak; //revert Serial setting return 0; } wdt_reset(); 386c8: a8 95 wdr 386ca: 01 97 sbiw r24, 0x01 ; 1 wdt_reset(); // Wait for two seconds until a magic string (constant entry_magic) is received // from the serial line. ptr = entry_magic_receive; end = strlen_P(entry_magic_receive) + ptr; while (ptr != end) { 386cc: 09 f0 breq .+2 ; 0x386d0 386ce: c0 cf rjmp .-128 ; 0x38650 selectedSerialPort = selectedSerialPort_bak; //revert Serial setting return 0; } wdt_reset(); } cbi(UCSR0B, RXCIE0); //disable the MarlinSerial0 interrupt 386d0: 80 91 c1 00 lds r24, 0x00C1 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 386d4: 8f 77 andi r24, 0x7F ; 127 386d6: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1> 386da: 03 e7 ldi r16, 0x73 ; 115 386dc: 1c ea ldi r17, 0xAC ; 172 // Send the cfm magic string. ptr = entry_magic_cfm; end = strlen_P(entry_magic_cfm) + ptr; while (ptr != end) putch(pgm_read_byte(ptr ++)); 386de: f8 01 movw r30, r16 386e0: 84 91 lpm r24, Z 386e2: 0f 94 2c ae call 0x35c58 ; 0x35c58 386e6: 0f 5f subi r16, 0xFF ; 255 386e8: 1f 4f sbci r17, 0xFF ; 255 } cbi(UCSR0B, RXCIE0); //disable the MarlinSerial0 interrupt // Send the cfm magic string. ptr = entry_magic_cfm; end = strlen_P(entry_magic_cfm) + ptr; while (ptr != end) 386ea: fc ea ldi r31, 0xAC ; 172 386ec: 00 38 cpi r16, 0x80 ; 128 386ee: 1f 07 cpc r17, r31 386f0: b1 f7 brne .-20 ; 0x386de putch(pgm_read_byte(ptr ++)); } spi_init(); 386f2: 0f 94 c2 c2 call 0x38584 ; 0x38584 xflash_init(); 386f6: 0e 94 d0 ee call 0x1dda0 ; 0x1dda0 "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" ); 386fa: 0f b6 in r0, 0x3f ; 63 386fc: f8 94 cli 386fe: a8 95 wdr 38700: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 38704: 88 61 ori r24, 0x18 ; 24 38706: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 3870a: 10 92 60 00 sts 0x0060, r1 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 3870e: 0f be out 0x3f, r0 ; 63 wdt_disable(); lcd_clear(); 38710: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 1, PSTR(" Upgrading xflash\n Do not disconnect!")); 38714: 4d e4 ldi r20, 0x4D ; 77 38716: 5c ea ldi r21, 0xAC ; 172 38718: 61 e0 ldi r22, 0x01 ; 1 3871a: 80 e0 ldi r24, 0x00 ; 0 3871c: 0e 94 8c 6e call 0xdd18 ; 0xdd18 boot_app_magic = 0; //disable the bootapp if a watchdog reset is going to be used 38720: 10 92 fc 1f sts 0x1FFC, r1 ; 0x801ffc <__bss_end+0x7dd> 38724: 10 92 fd 1f sts 0x1FFD, r1 ; 0x801ffd <__bss_end+0x7de> 38728: 10 92 fe 1f sts 0x1FFE, r1 ; 0x801ffe <__bss_end+0x7df> 3872c: 10 92 ff 1f sts 0x1FFF, r1 ; 0x801fff <__bss_end+0x7e0> pagelen_t length; // Use the planner's queue for the receive / transmit buffers. // uint8_t *buff = (uint8_t*)block_buffer; uint8_t buff[260]; // bitmap of pages to be written. Bit is set to 1 if the page has already been erased. uint8_t pages_erased = 0; 38730: cb 5f subi r28, 0xFB ; 251 38732: de 4f sbci r29, 0xFE ; 254 38734: 18 82 st Y, r1 38736: c5 50 subi r28, 0x05 ; 5 38738: d1 40 sbci r29, 0x01 ; 1 // they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set, // but rather test 33 bits for the correct value before exiting optiboot early. if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) return 1; uint8_t ch; uint8_t rampz = 0; uint16_t address = 0; 3873a: 10 e0 ldi r17, 0x00 ; 0 3873c: 00 e0 ldi r16, 0x00 ; 0 // Make sure to check boot_app_magic as well. Since these bootapp flags are located right in the middle of the stack, // they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set, // but rather test 33 bits for the correct value before exiting optiboot early. if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) return 1; uint8_t ch; uint8_t rampz = 0; 3873e: f1 2c mov r15, r1 length |= getch(); // Read the destination type. It should always be 'F' as flash. It is not checked. (void)getch(); verifySpace(); xflash_wait_busy(); xflash_rd_data(addr, buff, length); 38740: ae 01 movw r20, r28 38742: 4f 5f subi r20, 0xFF ; 255 38744: 5f 4f sbci r21, 0xFF ; 255 38746: 3a 01 movw r6, r20 boot_app_magic = 0; //disable the bootapp if a watchdog reset is going to be used /* Forever loop: exits by causing WDT reset */ for (;;) { /* get character from UART */ ch = getch(); 38748: 0f 94 33 ae call 0x35c66 ; 0x35c66 if(ch == STK_GET_PARAMETER) { 3874c: 81 34 cpi r24, 0x41 ; 65 3874e: a9 f4 brne .+42 ; 0x3877a unsigned char which = getch(); 38750: 0f 94 33 ae call 0x35c66 ; 0x35c66 38754: e8 2e mov r14, r24 verifySpace(); 38756: 0f 94 ab b0 call 0x36156 ; 0x36156 /* * Send optiboot version as "SW version" * Note that the references to memory are optimized away. */ if (which == STK_SW_MINOR) { 3875a: 52 e8 ldi r21, 0x82 ; 130 putch(optiboot_version & 0xFF); 3875c: 82 e0 ldi r24, 0x02 ; 2 verifySpace(); /* * Send optiboot version as "SW version" * Note that the references to memory are optimized away. */ if (which == STK_SW_MINOR) { 3875e: e5 16 cp r14, r21 38760: 21 f0 breq .+8 ; 0x3876a putch(optiboot_version & 0xFF); } else if (which == STK_SW_MAJOR) { 38762: 81 e8 ldi r24, 0x81 ; 129 38764: e8 12 cpse r14, r24 38766: 07 c0 rjmp .+14 ; 0x38776 putch(optiboot_version >> 8); 38768: 86 e0 ldi r24, 0x06 ; 6 3876a: 0f 94 2c ae call 0x35c58 ; 0x35c58 } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); } putch(STK_OK); 3876e: 80 e1 ldi r24, 0x10 ; 16 38770: 0f 94 2c ae call 0x35c58 ; 0x35c58 38774: e9 cf rjmp .-46 ; 0x38748 } else { /* * GET PARAMETER returns a generic 0x03 reply for * other parameters - enough to keep Avrdude happy */ putch(0x03); 38776: 83 e0 ldi r24, 0x03 ; 3 38778: f8 cf rjmp .-16 ; 0x3876a } } else if(ch == STK_SET_DEVICE) { 3877a: 82 34 cpi r24, 0x42 ; 66 3877c: 21 f4 brne .+8 ; 0x38786 // SET DEVICE is ignored getNch(20); 3877e: 84 e1 ldi r24, 0x14 ; 20 } else if(ch == STK_SET_DEVICE_EXT) { // SET DEVICE EXT is ignored getNch(5); 38780: 0f 94 b7 b0 call 0x3616e ; 0x3616e 38784: f4 cf rjmp .-24 ; 0x3876e } else if(ch == STK_SET_DEVICE) { // SET DEVICE is ignored getNch(20); } else if(ch == STK_SET_DEVICE_EXT) { 38786: 85 34 cpi r24, 0x45 ; 69 38788: 11 f4 brne .+4 ; 0x3878e // SET DEVICE EXT is ignored getNch(5); 3878a: 85 e0 ldi r24, 0x05 ; 5 3878c: f9 cf rjmp .-14 ; 0x38780 } else if(ch == STK_LOAD_ADDRESS) { 3878e: 85 35 cpi r24, 0x55 ; 85 38790: c9 f4 brne .+50 ; 0x387c4 // LOAD ADDRESS uint16_t newAddress; // Workaround for the infamous ';' bug in the Prusa3D usb to serial converter. // Send the binary data by nibbles to avoid transmitting the ';' character. newAddress = getch(); 38792: 0f 94 33 ae call 0x35c66 ; 0x35c66 38796: 08 2f mov r16, r24 newAddress |= getch(); 38798: 0f 94 33 ae call 0x35c66 ; 0x35c66 3879c: 08 2b or r16, r24 3879e: 10 e0 ldi r17, 0x00 ; 0 newAddress |= (((uint16_t)getch()) << 8); 387a0: 0f 94 33 ae call 0x35c66 ; 0x35c66 387a4: 18 2b or r17, r24 newAddress |= (((uint16_t)getch()) << 8); 387a6: 0f 94 33 ae call 0x35c66 ; 0x35c66 387aa: 18 2b or r17, r24 // Transfer top bit to LSB in rampz if (newAddress & 0x8000) 387ac: 17 ff sbrs r17, 7 387ae: 07 c0 rjmp .+14 ; 0x387be rampz |= 0x01; 387b0: 68 94 set 387b2: f0 f8 bld r15, 0 else rampz &= 0xFE; newAddress += newAddress; // Convert from word address to byte address 387b4: 00 0f add r16, r16 387b6: 11 1f adc r17, r17 wdt_enable(WATCHDOG_SOFT_RESET_VALUE); verifySpace(); } else { // This covers the response to commands like STK_ENTER_PROGMODE verifySpace(); 387b8: 0f 94 ab b0 call 0x36156 ; 0x36156 387bc: d8 cf rjmp .-80 ; 0x3876e newAddress |= (((uint16_t)getch()) << 8); // Transfer top bit to LSB in rampz if (newAddress & 0x8000) rampz |= 0x01; else rampz &= 0xFE; 387be: e8 94 clt 387c0: f0 f8 bld r15, 0 387c2: f8 cf rjmp .-16 ; 0x387b4 newAddress += newAddress; // Convert from word address to byte address address = newAddress; verifySpace(); } else if(ch == STK_UNIVERSAL) { 387c4: 86 35 cpi r24, 0x56 ; 86 387c6: a1 f4 brne .+40 ; 0x387f0 // LOAD_EXTENDED_ADDRESS is needed in STK_UNIVERSAL for addressing more than 128kB if ( AVR_OP_LOAD_EXT_ADDR == getch() ) { 387c8: 0f 94 33 ae call 0x35c66 ; 0x35c66 387cc: 8d 34 cpi r24, 0x4D ; 77 387ce: 71 f4 brne .+28 ; 0x387ec // get address getch(); // get '0' 387d0: 0f 94 33 ae call 0x35c66 ; 0x35c66 rampz = (rampz & 0x01) | ((getch() << 1) & 0xff); // get address and put it in rampz 387d4: 0f 94 33 ae call 0x35c66 ; 0x35c66 387d8: 9f 2d mov r25, r15 387da: 91 70 andi r25, 0x01 ; 1 387dc: f9 2e mov r15, r25 387de: 88 0f add r24, r24 387e0: f8 2a or r15, r24 getNch(1); // get last '0' 387e2: 81 e0 ldi r24, 0x01 ; 1 // response putch(0x00); } else { // everything else is ignored getNch(3); 387e4: 0f 94 b7 b0 call 0x3616e ; 0x3616e putch(0x00); 387e8: 80 e0 ldi r24, 0x00 ; 0 387ea: bf cf rjmp .-130 ; 0x3876a // response putch(0x00); } else { // everything else is ignored getNch(3); 387ec: 83 e0 ldi r24, 0x03 ; 3 387ee: fa cf rjmp .-12 ; 0x387e4 putch(0x00); } } /* Write memory, length is big endian and is in bytes */ else if(ch == STK_PROG_PAGE) { 387f0: 84 36 cpi r24, 0x64 ; 100 387f2: 09 f0 breq .+2 ; 0x387f6 387f4: 77 c0 rjmp .+238 ; 0x388e4 uint8_t desttype; uint8_t *bufPtr; pagelen_t savelength; // Read the page length, with the length transferred each nibble separately to work around // the Prusa's USB to serial infamous semicolon issue. length = ((pagelen_t)getch()) << 8; 387f6: 0f 94 33 ae call 0x35c66 ; 0x35c66 387fa: b8 2e mov r11, r24 length |= ((pagelen_t)getch()) << 8; 387fc: 0f 94 33 ae call 0x35c66 ; 0x35c66 38800: c8 2e mov r12, r24 length |= getch(); 38802: 0f 94 33 ae call 0x35c66 ; 0x35c66 38806: e8 2e mov r14, r24 length |= getch(); 38808: 0f 94 33 ae call 0x35c66 ; 0x35c66 uint8_t *bufPtr; pagelen_t savelength; // Read the page length, with the length transferred each nibble separately to work around // the Prusa's USB to serial infamous semicolon issue. length = ((pagelen_t)getch()) << 8; length |= ((pagelen_t)getch()) << 8; 3880c: d1 2c mov r13, r1 3880e: dc 2c mov r13, r12 38810: cc 24 eor r12, r12 38812: db 28 or r13, r11 length |= getch(); length |= getch(); 38814: 8e 29 or r24, r14 38816: c8 2a or r12, r24 savelength = length; // Read the destination type. It should always be 'F' as flash. desttype = getch(); 38818: 0f 94 33 ae call 0x35c66 ; 0x35c66 3881c: 58 2e mov r5, r24 3881e: fe 01 movw r30, r28 38820: 31 96 adiw r30, 0x01 ; 1 38822: 5f 01 movw r10, r30 38824: 46 01 movw r8, r12 38826: 8e 0e add r8, r30 38828: 9f 1e adc r9, r31 3882a: ee 2e mov r14, r30 3882c: ca 5f subi r28, 0xFA ; 250 3882e: de 4f sbci r29, 0xFE ; 254 38830: b8 82 st Y, r11 38832: c6 50 subi r28, 0x06 ; 6 38834: d1 40 sbci r29, 0x01 ; 1 // read a page worth of contents bufPtr = buff; do *bufPtr++ = getch(); 38836: 0f 94 33 ae call 0x35c66 ; 0x35c66 3883a: f5 01 movw r30, r10 3883c: 81 93 st Z+, r24 3883e: 5f 01 movw r10, r30 while (--length); 38840: 8e 16 cp r8, r30 38842: 9f 06 cpc r9, r31 38844: c1 f7 brne .-16 ; 0x38836 // Read command terminator, start reply verifySpace(); 38846: 0f 94 ab b0 call 0x36156 ; 0x36156 if (desttype == 'E') { 3884a: f5 e4 ldi r31, 0x45 ; 69 3884c: 5f 12 cpse r5, r31 3884e: 01 c0 rjmp .+2 ; 0x38852 38850: ff cf rjmp .-2 ; 0x38850 while (1) ; // Error: wait for WDT } else { uint32_t addr = (((uint32_t)rampz) << 16) | address; 38852: 18 01 movw r2, r16 38854: 51 2c mov r5, r1 38856: 4f 2c mov r4, r15 // During a single bootloader run, only erase a 64kB block once. // An 8bit bitmask 'pages_erased' covers 512kB of FLASH memory. if ((address == 0) && (pages_erased & (1 << (addr >> 16))) == 0) { 38858: 01 15 cp r16, r1 3885a: 11 05 cpc r17, r1 3885c: 61 f5 brne .+88 ; 0x388b6 3885e: 42 01 movw r8, r4 38860: aa 24 eor r10, r10 38862: bb 24 eor r11, r11 38864: cb 5f subi r28, 0xFB ; 251 38866: de 4f sbci r29, 0xFE ; 254 38868: 28 81 ld r18, Y 3886a: c5 50 subi r28, 0x05 ; 5 3886c: d1 40 sbci r29, 0x01 ; 1 3886e: 82 2f mov r24, r18 38870: 90 e0 ldi r25, 0x00 ; 0 38872: 08 2c mov r0, r8 38874: 02 c0 rjmp .+4 ; 0x3887a 38876: 95 95 asr r25 38878: 87 95 ror r24 3887a: 0a 94 dec r0 3887c: e2 f7 brpl .-8 ; 0x38876 3887e: 80 fd sbrc r24, 0 38880: 1a c0 rjmp .+52 ; 0x388b6 xflash_wait_busy(); 38882: 0e 94 5d ed call 0x1daba ; 0x1daba xflash_enable_wr(); 38886: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 return xflash_erase(_CMD_BLOCK32_ERASE, addr); } void xflash_block64_erase(uint32_t addr) { return xflash_erase(_CMD_BLOCK64_ERASE, addr); 3888a: b2 01 movw r22, r4 3888c: a8 01 movw r20, r16 3888e: 88 ed ldi r24, 0xD8 ; 216 38890: 0e 94 7b ed call 0x1daf6 ; 0x1daf6 xflash_block64_erase(addr); pages_erased |= (1 << (addr >> 16)); 38894: 81 e0 ldi r24, 0x01 ; 1 38896: 90 e0 ldi r25, 0x00 ; 0 38898: 01 c0 rjmp .+2 ; 0x3889c 3889a: 88 0f add r24, r24 3889c: 8a 94 dec r8 3889e: ea f7 brpl .-6 ; 0x3889a 388a0: cb 5f subi r28, 0xFB ; 251 388a2: de 4f sbci r29, 0xFE ; 254 388a4: 48 81 ld r20, Y 388a6: c5 50 subi r28, 0x05 ; 5 388a8: d1 40 sbci r29, 0x01 ; 1 388aa: 48 2b or r20, r24 388ac: cb 5f subi r28, 0xFB ; 251 388ae: de 4f sbci r29, 0xFE ; 254 388b0: 48 83 st Y, r20 388b2: c5 50 subi r28, 0x05 ; 5 388b4: d1 40 sbci r29, 0x01 ; 1 } xflash_wait_busy(); 388b6: 0e 94 5d ed call 0x1daba ; 0x1daba xflash_enable_wr(); 388ba: 0e 94 f9 ed call 0x1dbf2 ; 0x1dbf2 xflash_page_program(addr, buff, savelength); 388be: 96 01 movw r18, r12 388c0: 4e 2d mov r20, r14 388c2: ca 5f subi r28, 0xFA ; 250 388c4: de 4f sbci r29, 0xFE ; 254 388c6: 58 81 ld r21, Y 388c8: c6 50 subi r28, 0x06 ; 6 388ca: d1 40 sbci r29, 0x01 ; 1 388cc: c2 01 movw r24, r4 388ce: b1 01 movw r22, r2 388d0: 0e 94 80 ed call 0x1db00 ; 0x1db00 xflash_wait_busy(); 388d4: 0e 94 5d ed call 0x1daba ; 0x1daba _CS_HIGH(); } void xflash_disable_wr(void) { _CS_LOW(); 388d8: 45 98 cbi 0x08, 5 ; 8 _SPI_TX(_CMD_DISABLE_WR); // send command 0x04 388da: 84 e0 ldi r24, 0x04 ; 4 388dc: 0e 94 57 ed call 0x1daae ; 0x1daae _CS_HIGH(); 388e0: 45 9a sbi 0x08, 5 ; 8 388e2: 45 cf rjmp .-374 ; 0x3876e xflash_disable_wr(); } } /* Read memory block mode, length is big endian. */ else if(ch == STK_READ_PAGE) { 388e4: 84 37 cpi r24, 0x74 ; 116 388e6: 81 f5 brne .+96 ; 0x38948 uint32_t addr = (((uint32_t)rampz) << 16) | address; 388e8: b1 2c mov r11, r1 388ea: af 2c mov r10, r15 pagelen_t i; // Read the page length, with the length transferred each nibble separately to work around // the Prusa's USB to serial infamous semicolon issue. length = ((pagelen_t)getch()) << 8; 388ec: 0f 94 33 ae call 0x35c66 ; 0x35c66 388f0: d8 2e mov r13, r24 length |= ((pagelen_t)getch()) << 8; 388f2: 0f 94 33 ae call 0x35c66 ; 0x35c66 388f6: c8 2e mov r12, r24 length |= getch(); 388f8: 0f 94 33 ae call 0x35c66 ; 0x35c66 388fc: e8 2e mov r14, r24 length |= getch(); 388fe: 0f 94 33 ae call 0x35c66 ; 0x35c66 uint32_t addr = (((uint32_t)rampz) << 16) | address; pagelen_t i; // Read the page length, with the length transferred each nibble separately to work around // the Prusa's USB to serial infamous semicolon issue. length = ((pagelen_t)getch()) << 8; length |= ((pagelen_t)getch()) << 8; 38902: 2c 2d mov r18, r12 38904: 30 e0 ldi r19, 0x00 ; 0 38906: 32 2f mov r19, r18 38908: 22 27 eor r18, r18 3890a: f9 01 movw r30, r18 3890c: fd 29 or r31, r13 3890e: 6f 01 movw r12, r30 length |= getch(); length |= getch(); 38910: 8e 29 or r24, r14 38912: c8 2a or r12, r24 // Read the destination type. It should always be 'F' as flash. It is not checked. (void)getch(); 38914: 0f 94 33 ae call 0x35c66 ; 0x35c66 verifySpace(); 38918: 0f 94 ab b0 call 0x36156 ; 0x36156 xflash_wait_busy(); 3891c: 0e 94 5d ed call 0x1daba ; 0x1daba xflash_rd_data(addr, buff, length); 38920: 96 01 movw r18, r12 38922: a3 01 movw r20, r6 38924: c5 01 movw r24, r10 38926: b8 01 movw r22, r16 38928: 0e 94 a0 ed call 0x1db40 ; 0x1db40 3892c: 53 01 movw r10, r6 for (i = 0; i < length; ++ i) 3892e: c5 01 movw r24, r10 38930: 86 19 sub r24, r6 38932: 97 09 sbc r25, r7 38934: 8c 15 cp r24, r12 38936: 9d 05 cpc r25, r13 38938: 08 f0 brcs .+2 ; 0x3893c 3893a: 19 cf rjmp .-462 ; 0x3876e putch(buff[i]); 3893c: f5 01 movw r30, r10 3893e: 81 91 ld r24, Z+ 38940: 5f 01 movw r10, r30 38942: 0f 94 2c ae call 0x35c58 ; 0x35c58 38946: f3 cf rjmp .-26 ; 0x3892e } /* Get device signature bytes */ else if(ch == STK_READ_SIGN) { 38948: 85 37 cpi r24, 0x75 ; 117 3894a: 51 f4 brne .+20 ; 0x38960 // READ SIGN - return what Avrdude wants to hear verifySpace(); 3894c: 0f 94 ab b0 call 0x36156 ; 0x36156 putch(XFLASH_SIGNATURE_0); 38950: 8e e1 ldi r24, 0x1E ; 30 38952: 0f 94 2c ae call 0x35c58 ; 0x35c58 putch(XFLASH_SIGNATURE_1); 38956: 88 e9 ldi r24, 0x98 ; 152 38958: 0f 94 2c ae call 0x35c58 ; 0x35c58 putch(XFLASH_SIGNATURE_2); 3895c: 81 e0 ldi r24, 0x01 ; 1 3895e: 05 cf rjmp .-502 ; 0x3876a } else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */ 38960: 81 35 cpi r24, 0x51 ; 81 38962: 09 f0 breq .+2 ; 0x38966 38964: 29 cf rjmp .-430 ; 0x387b8 : "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" ); 38966: f8 e1 ldi r31, 0x18 ; 24 38968: 28 e0 ldi r18, 0x08 ; 8 3896a: 0f b6 in r0, 0x3f ; 63 3896c: f8 94 cli 3896e: a8 95 wdr 38970: f0 93 60 00 sts 0x0060, r31 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 38974: 0f be out 0x3f, r0 ; 63 38976: 20 93 60 00 sts 0x0060, r18 ; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060> 3897a: 1e cf rjmp .-452 ; 0x387b8 uint8_t optiboot_xflash_enter() { // Make sure to check boot_app_magic as well. Since these bootapp flags are located right in the middle of the stack, // they can be unintentionally changed. As a workaround to the language upload problem, do not only check for one bit if it's set, // but rather test 33 bits for the correct value before exiting optiboot early. if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) return 1; 3897c: 81 e0 ldi r24, 0x01 ; 1 3897e: 7c ce rjmp .-776 ; 0x38678 00038980 : void FullScreenMsgRestoringTemperature(){ lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP)); } void ScreenUpdateEnable(){ lcd_update_enable(true); 38980: 81 e0 ldi r24, 0x01 ; 1 38982: 0c 94 bd 6e jmp 0xdd7a ; 0xdd7a 00038986 : void MakeSound(SoundType s){ Sound_MakeSound( (eSOUND_TYPE)s); } static void FullScreenMsg(const char *pgmS, uint8_t slot){ 38986: 0f 93 push r16 38988: 1f 93 push r17 3898a: cf 93 push r28 3898c: 8c 01 movw r16, r24 3898e: c6 2f mov r28, r22 lcd_update_enable(false); 38990: 80 e0 ldi r24, 0x00 ; 0 38992: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 38996: 0e 94 ab 6e call 0xdd56 ; 0xdd56 lcd_puts_at_P(0, 1, pgmS); 3899a: a8 01 movw r20, r16 3899c: 61 e0 ldi r22, 0x01 ; 1 3899e: 80 e0 ldi r24, 0x00 ; 0 389a0: 0e 94 8c 6e call 0xdd18 ; 0xdd18 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 389a4: 80 e2 ldi r24, 0x20 ; 32 389a6: 0e 94 27 6f call 0xde4e ; 0xde4e lcd_print(' '); lcd_print(slot + 1); 389aa: 6c 2f mov r22, r28 389ac: 70 e0 ldi r23, 0x00 ; 0 389ae: 6f 5f subi r22, 0xFF ; 255 389b0: 7f 4f sbci r23, 0xFF ; 255 lcd_print((unsigned long) b, base); } void lcd_print(int n, int base) { lcd_print((long) n, base); 389b2: 07 2e mov r0, r23 389b4: 00 0c add r0, r0 389b6: 88 0b sbc r24, r24 389b8: 99 0b sbc r25, r25 } 389ba: cf 91 pop r28 389bc: 1f 91 pop r17 389be: 0f 91 pop r16 389c0: 0c 94 31 70 jmp 0xe062 ; 0xe062 000389c4 : 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); 389c4: 82 ed ldi r24, 0xD2 ; 210 389c6: 9e e0 ldi r25, 0x0E ; 14 389c8: 0e 94 c0 75 call 0xeb80 ; 0xeb80 eeprom_increment_word((uint16_t *)EEPROM_MMU_FAIL_TOT); 389cc: 83 ed ldi r24, 0xD3 ; 211 389ce: 9e e0 ldi r25, 0x0E ; 14 389d0: 0c 94 b3 75 jmp 0xeb66 ; 0xeb66 000389d4 : inline bool Running() const { return state == State::Running; } inline bool FindaPressed() const { return regs8[0]; 389d4: 41 e0 ldi r20, 0x01 ; 1 389d6: 80 91 8f 13 lds r24, 0x138F ; 0x80138f 389da: 81 11 cpse r24, r1 389dc: 01 c0 rjmp .+2 ; 0x389e0 389de: 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'); 389e0: 40 5d subi r20, 0xD0 ; 208 389e2: 62 e0 ldi r22, 0x02 ; 2 389e4: 83 e0 ldi r24, 0x03 ; 3 389e6: 0e 94 98 6e call 0xdd30 ; 0xdd30 class PAT9125_sensor: public Filament_sensor { public: void init(); void deinit(); bool update(); bool getFilamentPresent() const { return filterFilPresent; } 389ea: 41 e0 ldi r20, 0x01 ; 1 389ec: 80 91 b6 17 lds r24, 0x17B6 ; 0x8017b6 389f0: 81 11 cpse r24, r1 389f2: 01 c0 rjmp .+2 ; 0x389f6 389f4: 40 e0 ldi r20, 0x00 ; 0 lcd_putc_at(8, 2, fsensor.getFilamentPresent() + '0'); 389f6: 40 5d subi r20, 0xD0 ; 208 389f8: 62 e0 ldi r22, 0x02 ; 2 389fa: 88 e0 ldi r24, 0x08 ; 8 389fc: 0e 94 98 6e call 0xdd30 ; 0xdd30 // print active/changing filament slot lcd_set_cursor(10, 2); 38a00: 62 e0 ldi r22, 0x02 ; 2 38a02: 8a e0 ldi r24, 0x0A ; 10 38a04: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcdui_print_extruder(); 38a08: 0f 94 24 22 call 0x24448 ; 0x24448 // Print active extruder temperature lcd_set_cursor(16, 2); 38a0c: 62 e0 ldi r22, 0x02 ; 2 38a0e: 80 e1 ldi r24, 0x10 ; 16 38a10: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%3d"), (int)(degHotend(0) + 0.5)); 38a14: 20 e0 ldi r18, 0x00 ; 0 38a16: 30 e0 ldi r19, 0x00 ; 0 38a18: 40 e0 ldi r20, 0x00 ; 0 38a1a: 5f e3 ldi r21, 0x3F ; 63 38a1c: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 38a20: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 38a24: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 38a28: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 38a2c: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 38a30: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> 38a34: 7f 93 push r23 38a36: 6f 93 push r22 38a38: 8b e3 ldi r24, 0x3B ; 59 38a3a: 9b ea ldi r25, 0xAB ; 171 38a3c: 9f 93 push r25 38a3e: 8f 93 push r24 38a40: 0e 94 51 6e call 0xdca2 ; 0xdca2 38a44: 0f 90 pop r0 38a46: 0f 90 pop r0 38a48: 0f 90 pop r0 38a4a: 0f 90 pop r0 } 38a4c: 08 95 ret 00038a4e : return 0; } } static constexpr uint8_t Nibble2Char(uint8_t n) { switch (n) { 38a4e: 8a 30 cpi r24, 0x0A ; 10 38a50: 20 f0 brcs .+8 ; 0x38a5a 38a52: 80 31 cpi r24, 0x10 ; 16 38a54: 20 f4 brcc .+8 ; 0x38a5e case 0xb: case 0xc: case 0xd: case 0xe: case 0xf: return n - 10 + 'a'; 38a56: 89 5a subi r24, 0xA9 ; 169 38a58: 08 95 ret case 5: case 6: case 7: case 8: case 9: return n + '0'; 38a5a: 80 5d subi r24, 0xD0 ; 208 38a5c: 08 95 ret case 0xd: case 0xe: case 0xf: return n - 10 + 'a'; default: return 0; 38a5e: 80 e0 ldi r24, 0x00 ; 0 } } 38a60: 08 95 ret 00038a62 : i += AppendCRC(rsp.CRC(), txbuff + i); txbuff[i] = '\n'; return i + 1; } uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) { 38a62: 0f 93 push r16 38a64: 1f 93 push r17 38a66: cf 93 push r28 38a68: df 93 push r29 38a6a: 08 2f mov r16, r24 38a6c: eb 01 movw r28, r22 if (value == 0) { *dst = '0'; return 1; } uint8_t v = value >> 4U; 38a6e: 90 e0 ldi r25, 0x00 ; 0 38a70: 24 e0 ldi r18, 0x04 ; 4 38a72: 95 95 asr r25 38a74: 87 95 ror r24 38a76: 2a 95 dec r18 38a78: e1 f7 brne .-8 ; 0x38a72 uint8_t charsOut = 1; 38a7a: 11 e0 ldi r17, 0x01 ; 1 if (v != 0) { // skip the first '0' if any 38a7c: 00 97 sbiw r24, 0x00 ; 0 38a7e: 21 f0 breq .+8 ; 0x38a88 *dst = Nibble2Char(v); 38a80: 0f 94 27 c5 call 0x38a4e ; 0x38a4e 38a84: 89 93 st Y+, r24 ++dst; charsOut = 2; 38a86: 12 e0 ldi r17, 0x02 ; 2 } v = value & 0xfU; *dst = Nibble2Char(v); 38a88: 80 2f mov r24, r16 38a8a: 8f 70 andi r24, 0x0F ; 15 38a8c: 0f 94 27 c5 call 0x38a4e ; 0x38a4e 38a90: 88 83 st Y, r24 return charsOut; } 38a92: 81 2f mov r24, r17 38a94: df 91 pop r29 38a96: cf 91 pop r28 38a98: 1f 91 pop r17 38a9a: 0f 91 pop r16 38a9c: 08 95 ret 00038a9e : } 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) { 38a9e: 80 33 cpi r24, 0x30 ; 48 38aa0: 30 f0 brcs .+12 ; 0x38aae 38aa2: 8a 33 cpi r24, 0x3A ; 58 38aa4: 30 f0 brcs .+12 ; 0x38ab2 38aa6: 9f e9 ldi r25, 0x9F ; 159 38aa8: 98 0f add r25, r24 38aaa: 96 30 cpi r25, 0x06 ; 6 38aac: 20 f0 brcs .+8 ; 0x38ab6 case 'd': case 'e': case 'f': return c - 'a' + 10; default: return 0; 38aae: 80 e0 ldi r24, 0x00 ; 0 } } 38ab0: 08 95 ret case '5': case '6': case '7': case '8': case '9': return c - '0'; 38ab2: 80 53 subi r24, 0x30 ; 48 38ab4: 08 95 ret case 'b': case 'c': case 'd': case 'e': case 'f': return c - 'a' + 10; 38ab6: 87 55 subi r24, 0x57 ; 87 38ab8: 08 95 ret 00038aba : /// 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 { 38aba: cf 93 push r28 38abc: df 93 push r29 38abe: ec 01 movw r28, r24 uint8_t crc = 0; crc = modules::crc::CRC8::CCITT_updateCX(0, (uint8_t)code); 38ac0: 68 81 ld r22, Y 38ac2: 80 e0 ldi r24, 0x00 ; 0 38ac4: 0f 94 3f ae call 0x35c7e ; 0x35c7e crc = modules::crc::CRC8::CCITT_updateCX(crc, value); 38ac8: 69 81 ldd r22, Y+1 ; 0x01 38aca: 0f 94 3f ae call 0x35c7e ; 0x35c7e crc = modules::crc::CRC8::CCITT_updateW(crc, value2); 38ace: 6a 81 ldd r22, Y+2 ; 0x02 38ad0: 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]); 38ad2: 0f 94 3f ae call 0x35c7e ; 0x35c7e 38ad6: 6c 2f mov r22, r28 return crc; } 38ad8: df 91 pop r29 38ada: cf 91 pop r28 38adc: 0d 94 3f ae jmp 0x35c7e ; 0x35c7e 00038ae0 : 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 { 38ae0: cf 93 push r28 38ae2: df 93 push r29 38ae4: ec 01 movw r28, r24 uint8_t crc = request.ComputeCRC8(); 38ae6: 0f 94 5d c5 call 0x38aba ; 0x38aba crc = modules::crc::CRC8::CCITT_updateCX(crc, (uint8_t)paramCode); 38aea: 6d 81 ldd r22, Y+5 ; 0x05 38aec: 0f 94 3f ae call 0x35c7e ; 0x35c7e crc = modules::crc::CRC8::CCITT_updateW(crc, paramValue); 38af0: 6e 81 ldd r22, Y+6 ; 0x06 38af2: cf 81 ldd r28, Y+7 ; 0x07 38af4: 0f 94 3f ae call 0x35c7e ; 0x35c7e 38af8: 6c 2f mov r22, r28 return crc; } 38afa: df 91 pop r29 38afc: cf 91 pop r28 38afe: 0d 94 3f ae jmp 0x35c7e ; 0x35c7e 00038b02 : return crc; } /// @param code of the request message /// @param value of the request message inline constexpr RequestMsg(RequestMsgCodes code, uint8_t value) 38b02: cf 93 push r28 38b04: df 93 push r29 38b06: ec 01 movw r28, r24 : code(code) , value(value) , value2(0) , crc8(ComputeCRC8()) { 38b08: 68 83 st Y, r22 38b0a: 49 83 std Y+1, r20 ; 0x01 38b0c: 1b 82 std Y+3, r1 ; 0x03 38b0e: 1a 82 std Y+2, r1 ; 0x02 38b10: 0f 94 5d c5 call 0x38aba ; 0x38aba 38b14: 8c 83 std Y+4, r24 ; 0x04 } 38b16: df 91 pop r29 38b18: cf 91 pop r28 38b1a: 08 95 ret 00038b1c : void power_off() { } void reset() { #ifdef MMU_HWRESET // HW - pulse reset pin WRITE(MMU_RST_PIN, 0); 38b1c: 9f b7 in r25, 0x3f ; 63 38b1e: f8 94 cli 38b20: e5 e0 ldi r30, 0x05 ; 5 38b22: f1 e0 ldi r31, 0x01 ; 1 38b24: 80 81 ld r24, Z 38b26: 8f 7d andi r24, 0xDF ; 223 38b28: 80 83 st Z, r24 38b2a: 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); 38b2c: 8f e8 ldi r24, 0x8F ; 143 38b2e: 91 e0 ldi r25, 0x01 ; 1 38b30: 01 97 sbiw r24, 0x01 ; 1 38b32: f1 f7 brne .-4 ; 0x38b30 38b34: 00 c0 rjmp .+0 ; 0x38b36 38b36: 00 00 nop _delay_us(100); WRITE(MMU_RST_PIN, 1); 38b38: 9f b7 in r25, 0x3f ; 63 38b3a: f8 94 cli 38b3c: 80 81 ld r24, Z 38b3e: 80 62 ori r24, 0x20 ; 32 38b40: 80 83 st Z, r24 38b42: 9f bf out 0x3f, r25 ; 63 #else mmu2.Reset(MMU2::Software); // @@TODO needs to be redesigned, this power implementation shall not know anything about the MMU itself #endif // otherwise HW reset is not available } 38b44: 08 95 ret 00038b46 : void Enable_E0() { enable_e0(); } void Disable_E0() { disable_e0(); 38b46: 14 9a sbi 0x02, 4 ; 2 } 38b48: 08 95 ret 00038b4a : 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) { 38b4a: cf 92 push r12 38b4c: df 92 push r13 38b4e: ef 92 push r14 38b50: ff 92 push r15 38b52: cf 93 push r28 38b54: df 93 push r29 38b56: 69 01 movw r12, r18 38b58: 7a 01 movw r14, r20 current_position[E_AXIS] += delta; 38b5a: c1 e9 ldi r28, 0x91 ; 145 38b5c: d6 e0 ldi r29, 0x06 ; 6 38b5e: 9b 01 movw r18, r22 38b60: ac 01 movw r20, r24 38b62: 6c 85 ldd r22, Y+12 ; 0x0c 38b64: 7d 85 ldd r23, Y+13 ; 0x0d 38b66: 8e 85 ldd r24, Y+14 ; 0x0e 38b68: 9f 85 ldd r25, Y+15 ; 0x0f 38b6a: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 38b6e: 6c 87 std Y+12, r22 ; 0x0c 38b70: 7d 87 std Y+13, r23 ; 0x0d 38b72: 8e 87 std Y+14, r24 ; 0x0e 38b74: 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); 38b76: c7 01 movw r24, r14 38b78: b6 01 movw r22, r12 } void extruder_move(float delta, float feedRate) { current_position[E_AXIS] += delta; planner_line_to_current_position(feedRate); } 38b7a: df 91 pop r29 38b7c: cf 91 pop r28 38b7e: ff 90 pop r15 38b80: ef 90 pop r14 38b82: df 90 pop r13 38b84: 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); 38b86: 0d 94 3d c0 jmp 0x3807a ; 0x3807a 00038b8a : st_synchronize(); } static inline void go_to_current(float fr) { plan_buffer_line_curposXYZE(fr); 38b8a: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 38b8e: 0d 94 a9 43 jmp 0x28752 ; 0x28752 00038b92 : #include "mmu2_log.h" namespace MMU2 { void LogErrorEvent_P(const char *msg){ 38b92: cf 93 push r28 38b94: df 93 push r29 38b96: ec 01 movw r28, r24 SERIAL_ECHO_START; //!@todo Decide MMU errors on serial line 38b98: 82 ef ldi r24, 0xF2 ; 242 38b9a: 9a ea ldi r25, 0xAA ; 170 38b9c: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_MMU2(); 38ba0: 85 e3 ldi r24, 0x35 ; 53 38ba2: 9b ea ldi r25, 0xAB ; 171 38ba4: 0e 94 e8 76 call 0xedd0 ; 0xedd0 SERIAL_ECHOLNRPGM(msg); 38ba8: ce 01 movw r24, r28 } 38baa: df 91 pop r29 38bac: 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); 38bae: 0c 94 13 79 jmp 0xf226 ; 0xf226 00038bb2 : #include "Filament_sensor.h" namespace MMU2 { FilamentState WhereIsFilament(){ return fsensor.getFilamentPresent() ? FilamentState::AT_FSENSOR : FilamentState::NOT_PRESENT; 38bb2: 81 e0 ldi r24, 0x01 ; 1 38bb4: 90 91 b6 17 lds r25, 0x17B6 ; 0x8017b6 38bb8: 91 11 cpse r25, r1 38bba: 01 c0 rjmp .+2 ; 0x38bbe 38bbc: 80 e0 ldi r24, 0x00 ; 0 } 38bbe: 08 95 ret 00038bc0 : constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38bc0: 89 32 cpi r24, 0x29 ; 41 38bc2: 20 e8 ldi r18, 0x80 ; 128 38bc4: 92 07 cpc r25, r18 38bc6: 09 f4 brne .+2 ; 0x38bca 38bc8: 97 c0 rjmp .+302 ; 0x38cf8 38bca: 08 f0 brcs .+2 ; 0x38bce 38bcc: 48 c0 rjmp .+144 ; 0x38c5e 38bce: 86 30 cpi r24, 0x06 ; 6 38bd0: 60 e8 ldi r22, 0x80 ; 128 38bd2: 96 07 cpc r25, r22 38bd4: 09 f4 brne .+2 ; 0x38bd8 38bd6: 9a c0 rjmp .+308 ; 0x38d0c 38bd8: 30 f5 brcc .+76 ; 0x38c26 38bda: 83 30 cpi r24, 0x03 ; 3 38bdc: 40 e8 ldi r20, 0x80 ; 128 38bde: 94 07 cpc r25, r20 38be0: 09 f4 brne .+2 ; 0x38be4 38be2: 80 c0 rjmp .+256 ; 0x38ce4 38be4: a8 f4 brcc .+42 ; 0x38c10 38be6: 81 30 cpi r24, 0x01 ; 1 38be8: 20 e8 ldi r18, 0x80 ; 128 38bea: 92 07 cpc r25, r18 38bec: 09 f4 brne .+2 ; 0x38bf0 38bee: 17 c1 rjmp .+558 ; 0x38e1e 38bf0: 82 30 cpi r24, 0x02 ; 2 38bf2: 40 e8 ldi r20, 0x80 ; 128 38bf4: 94 07 cpc r25, r20 38bf6: 09 f4 brne .+2 ; 0x38bfa 38bf8: 73 c0 rjmp .+230 ; 0x38ce0 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); 38bfa: 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)) { 38bfc: 86 ff sbrs r24, 6 38bfe: 8e c0 rjmp .+284 ; 0x38d1c 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); 38c00: 22 27 eor r18, r18 38c02: 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) { 38c04: 21 15 cp r18, r1 38c06: 32 4c sbci r19, 0xC2 ; 194 38c08: 09 f0 breq .+2 ; 0x38c0c 38c0a: 9e c0 rjmp .+316 ; 0x38d48 return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED); 38c0c: 8e e1 ldi r24, 0x1E ; 30 38c0e: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38c10: 84 30 cpi r24, 0x04 ; 4 38c12: 60 e8 ldi r22, 0x80 ; 128 38c14: 96 07 cpc r25, r22 38c16: 09 f4 brne .+2 ; 0x38c1a 38c18: 67 c0 rjmp .+206 ; 0x38ce8 38c1a: 85 30 cpi r24, 0x05 ; 5 38c1c: 20 e8 ldi r18, 0x80 ; 128 38c1e: 92 07 cpc r25, r18 38c20: 61 f7 brne .-40 ; 0x38bfa 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); 38c22: 84 e2 ldi r24, 0x24 ; 36 38c24: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38c26: 8a 30 cpi r24, 0x0A ; 10 38c28: 40 e8 ldi r20, 0x80 ; 128 38c2a: 94 07 cpc r25, r20 38c2c: 09 f4 brne .+2 ; 0x38c30 38c2e: 5e c0 rjmp .+188 ; 0x38cec 38c30: 58 f4 brcc .+22 ; 0x38c48 38c32: 88 30 cpi r24, 0x08 ; 8 38c34: 20 e8 ldi r18, 0x80 ; 128 38c36: 92 07 cpc r25, r18 38c38: 09 f4 brne .+2 ; 0x38c3c 38c3a: 6e c0 rjmp .+220 ; 0x38d18 38c3c: 89 30 cpi r24, 0x09 ; 9 38c3e: 40 e8 ldi r20, 0x80 ; 128 38c40: 94 07 cpc r25, r20 38c42: d9 f6 brne .-74 ; 0x38bfa 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); 38c44: 85 e0 ldi r24, 0x05 ; 5 38c46: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38c48: 8c 30 cpi r24, 0x0C ; 12 38c4a: 60 e8 ldi r22, 0x80 ; 128 38c4c: 96 07 cpc r25, r22 38c4e: 09 f4 brne .+2 ; 0x38c52 38c50: 51 c0 rjmp .+162 ; 0x38cf4 38c52: 8d 30 cpi r24, 0x0D ; 13 38c54: 20 e8 ldi r18, 0x80 ; 128 38c56: 92 07 cpc r25, r18 38c58: 81 f6 brne .-96 ; 0x38bfa 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); 38c5a: 81 e2 ldi r24, 0x21 ; 33 38c5c: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38c5e: 8f 32 cpi r24, 0x2F ; 47 38c60: 40 e8 ldi r20, 0x80 ; 128 38c62: 94 07 cpc r25, r20 38c64: 09 f4 brne .+2 ; 0x38c68 38c66: 56 c0 rjmp .+172 ; 0x38d14 38c68: e0 f4 brcc .+56 ; 0x38ca2 38c6a: 8c 32 cpi r24, 0x2C ; 44 38c6c: 20 e8 ldi r18, 0x80 ; 128 38c6e: 92 07 cpc r25, r18 38c70: 09 f4 brne .+2 ; 0x38c74 38c72: 4e c0 rjmp .+156 ; 0x38d10 38c74: 58 f4 brcc .+22 ; 0x38c8c 38c76: 8a 32 cpi r24, 0x2A ; 42 38c78: 60 e8 ldi r22, 0x80 ; 128 38c7a: 96 07 cpc r25, r22 38c7c: c9 f1 breq .+114 ; 0x38cf0 38c7e: 8b 32 cpi r24, 0x2B ; 43 38c80: 20 e8 ldi r18, 0x80 ; 128 38c82: 92 07 cpc r25, r18 38c84: 09 f0 breq .+2 ; 0x38c88 38c86: b9 cf rjmp .-142 ; 0x38bfa 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); 38c88: 86 e2 ldi r24, 0x26 ; 38 38c8a: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38c8c: 8d 32 cpi r24, 0x2D ; 45 38c8e: 40 e8 ldi r20, 0x80 ; 128 38c90: 94 07 cpc r25, r20 38c92: d1 f1 breq .+116 ; 0x38d08 38c94: 8e 32 cpi r24, 0x2E ; 46 38c96: 60 e8 ldi r22, 0x80 ; 128 38c98: 96 07 cpc r25, r22 38c9a: 09 f0 breq .+2 ; 0x38c9e 38c9c: ae cf rjmp .-164 ; 0x38bfa 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); 38c9e: 82 e2 ldi r24, 0x22 ; 34 38ca0: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38ca2: 87 38 cpi r24, 0x87 ; 135 38ca4: 20 e8 ldi r18, 0x80 ; 128 38ca6: 92 07 cpc r25, r18 38ca8: 49 f1 breq .+82 ; 0x38cfc 38caa: 58 f4 brcc .+22 ; 0x38cc2 38cac: 87 34 cpi r24, 0x47 ; 71 38cae: 60 e8 ldi r22, 0x80 ; 128 38cb0: 96 07 cpc r25, r22 38cb2: 29 f0 breq .+10 ; 0x38cbe 38cb4: 8b 34 cpi r24, 0x4B ; 75 38cb6: 20 e8 ldi r18, 0x80 ; 128 38cb8: 92 07 cpc r25, r18 38cba: 09 f0 breq .+2 ; 0x38cbe 38cbc: 9e cf rjmp .-196 ; 0x38bfa 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); 38cbe: 84 e0 ldi r24, 0x04 ; 4 38cc0: 08 95 ret constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) { return (uint16_t)ec & (uint16_t)mask; } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { 38cc2: 87 30 cpi r24, 0x07 ; 7 38cc4: 41 e8 ldi r20, 0x81 ; 129 38cc6: 94 07 cpc r25, r20 38cc8: d9 f0 breq .+54 ; 0x38d00 38cca: 8b 30 cpi r24, 0x0B ; 11 38ccc: 61 e8 ldi r22, 0x81 ; 129 38cce: 96 07 cpc r25, r22 38cd0: c9 f0 breq .+50 ; 0x38d04 38cd2: 8b 38 cpi r24, 0x8B ; 139 38cd4: 20 e8 ldi r18, 0x80 ; 128 38cd6: 92 07 cpc r25, r18 38cd8: 09 f0 breq .+2 ; 0x38cdc 38cda: 8f cf rjmp .-226 ; 0x38bfa 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); 38cdc: 89 e0 ldi r24, 0x09 ; 9 38cde: 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); 38ce0: 81 e0 ldi r24, 0x01 ; 1 38ce2: 08 95 ret case ErrorCode::FSENSOR_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER); 38ce4: 82 e0 ldi r24, 0x02 ; 2 38ce6: 08 95 ret case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF: return FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK); 38ce8: 83 e0 ldi r24, 0x03 ; 3 38cea: 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); 38cec: 86 e0 ldi r24, 0x06 ; 6 38cee: 08 95 ret case ErrorCode::LOAD_TO_EXTRUDER_FAILED: return FindErrorIndex(ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED); 38cf0: 87 e0 ldi r24, 0x07 ; 7 38cf2: 08 95 ret case ErrorCode::FILAMENT_EJECTED: return FindErrorIndex(ERR_SYSTEM_FILAMENT_EJECTED); 38cf4: 8a e2 ldi r24, 0x2A ; 42 38cf6: 08 95 ret case ErrorCode::FILAMENT_CHANGE: return FindErrorIndex(ERR_SYSTEM_FILAMENT_CHANGE); 38cf8: 8b e2 ldi r24, 0x2B ; 43 38cfa: 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); 38cfc: 88 e0 ldi r24, 0x08 ; 8 38cfe: 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); 38d00: 8a e0 ldi r24, 0x0A ; 10 38d02: 08 95 ret case ErrorCode::MOVE_IDLER_FAILED: return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE); 38d04: 8b e0 ldi r24, 0x0B ; 11 38d06: 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); 38d08: 83 e2 ldi r24, 0x23 ; 35 38d0a: 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); 38d0c: 85 e2 ldi r24, 0x25 ; 37 38d0e: 08 95 ret case ErrorCode::QUEUE_FULL: return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL); case ErrorCode::VERSION_MISMATCH: return FindErrorIndex(ERR_SYSTEM_FW_UPDATE_NEEDED); 38d10: 87 e2 ldi r24, 0x27 ; 39 38d12: 08 95 ret case ErrorCode::INTERNAL: return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR); 38d14: 88 e2 ldi r24, 0x28 ; 40 38d16: 08 95 ret case ErrorCode::FINDA_VS_EEPROM_DISREPANCY: return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY); 38d18: 89 e2 ldi r24, 0x29 ; 41 38d1a: 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)) { 38d1c: 87 ff sbrs r24, 7 38d1e: 07 c0 rjmp .+14 ; 0x38d2e 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); 38d20: 22 27 eor r18, r18 38d22: 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) { 38d24: 21 15 cp r18, r1 38d26: 32 4c sbci r19, 0xC2 ; 194 38d28: a1 f5 brne .+104 ; 0x38d92 return FindErrorIndex(ERR_ELECTRICAL_MMU_SELECTOR_SELFTEST_FAILED); 38d2a: 8f e1 ldi r24, 0x1F ; 31 38d2c: 08 95 ret } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { 38d2e: 22 27 eor r18, r18 38d30: 31 70 andi r19, 0x01 ; 1 38d32: 90 ff sbrs r25, 0 38d34: 52 c0 rjmp .+164 ; 0x38dda 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); 38d36: ac 01 movw r20, r24 38d38: 44 27 eor r20, r20 38d3a: 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) { 38d3c: 41 15 cp r20, r1 38d3e: 52 4c sbci r21, 0xC2 ; 194 38d40: 09 f0 breq .+2 ; 0x38d44 38d42: 4b c0 rjmp .+150 ; 0x38dda return FindErrorIndex(ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED); 38d44: 80 e2 ldi r24, 0x20 ; 32 38d46: 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; 38d48: 9c 01 movw r18, r24 38d4a: 22 27 eor r18, r18 38d4c: 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)) { 38d4e: 23 2b or r18, r19 38d50: 09 f0 breq .+2 ; 0x38d54 38d52: 67 c0 rjmp .+206 ; 0x38e22 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; 38d54: 9c 01 movw r18, r24 38d56: 22 27 eor r18, r18 38d58: 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)) { 38d5a: 23 2b or r18, r19 38d5c: 09 f0 breq .+2 ; 0x38d60 38d5e: 63 c0 rjmp .+198 ; 0x38e26 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; 38d60: 9c 01 movw r18, r24 38d62: 22 27 eor r18, r18 38d64: 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)) { 38d66: 23 2b or r18, r19 38d68: 09 f0 breq .+2 ; 0x38d6c 38d6a: 5f c0 rjmp .+190 ; 0x38e2a 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; 38d6c: 9c 01 movw r18, r24 38d6e: 22 27 eor r18, r18 38d70: 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)) { 38d72: 23 2b or r18, r19 38d74: 09 f0 breq .+2 ; 0x38d78 38d76: 5b c0 rjmp .+182 ; 0x38e2e 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; 38d78: 9c 01 movw r18, r24 38d7a: 22 27 eor r18, r18 38d7c: 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)) { 38d7e: 23 2b or r18, r19 38d80: 09 f0 breq .+2 ; 0x38d84 38d82: 57 c0 rjmp .+174 ; 0x38e32 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; 38d84: 88 27 eor r24, r24 38d86: 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)) { 38d88: 89 2b or r24, r25 38d8a: 09 f4 brne .+2 ; 0x38d8e 38d8c: 68 c0 rjmp .+208 ; 0x38e5e return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR); 38d8e: 8f e0 ldi r24, 0x0F ; 15 38d90: 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; 38d92: 9c 01 movw r18, r24 38d94: 22 27 eor r18, r18 38d96: 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)) { 38d98: 23 2b or r18, r19 38d9a: 09 f0 breq .+2 ; 0x38d9e 38d9c: 4c c0 rjmp .+152 ; 0x38e36 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; 38d9e: 9c 01 movw r18, r24 38da0: 22 27 eor r18, r18 38da2: 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)) { 38da4: 23 2b or r18, r19 38da6: 09 f0 breq .+2 ; 0x38daa 38da8: 48 c0 rjmp .+144 ; 0x38e3a 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; 38daa: 9c 01 movw r18, r24 38dac: 22 27 eor r18, r18 38dae: 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)) { 38db0: 23 2b or r18, r19 38db2: 09 f0 breq .+2 ; 0x38db6 38db4: 44 c0 rjmp .+136 ; 0x38e3e 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; 38db6: 9c 01 movw r18, r24 38db8: 22 27 eor r18, r18 38dba: 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)) { 38dbc: 23 2b or r18, r19 38dbe: 09 f0 breq .+2 ; 0x38dc2 38dc0: 40 c0 rjmp .+128 ; 0x38e42 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; 38dc2: 9c 01 movw r18, r24 38dc4: 22 27 eor r18, r18 38dc6: 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)) { 38dc8: 23 2b or r18, r19 38dca: e9 f5 brne .+122 ; 0x38e46 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; 38dcc: 88 27 eor r24, r24 38dce: 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)) { 38dd0: 89 2b or r24, r25 38dd2: 09 f4 brne .+2 ; 0x38dd6 38dd4: 44 c0 rjmp .+136 ; 0x38e5e return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR); 38dd6: 80 e1 ldi r24, 0x10 ; 16 38dd8: 08 95 ret } } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) { 38dda: 23 2b or r18, r19 38ddc: 09 f4 brne .+2 ; 0x38de0 38dde: 3f c0 rjmp .+126 ; 0x38e5e 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; 38de0: 9c 01 movw r18, r24 38de2: 22 27 eor r18, r18 38de4: 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)) { 38de6: 23 2b or r18, r19 38de8: 81 f5 brne .+96 ; 0x38e4a 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; 38dea: 9c 01 movw r18, r24 38dec: 22 27 eor r18, r18 38dee: 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)) { 38df0: 23 2b or r18, r19 38df2: 69 f5 brne .+90 ; 0x38e4e 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; 38df4: 9c 01 movw r18, r24 38df6: 22 27 eor r18, r18 38df8: 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)) { 38dfa: 23 2b or r18, r19 38dfc: 51 f5 brne .+84 ; 0x38e52 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; 38dfe: 9c 01 movw r18, r24 38e00: 22 27 eor r18, r18 38e02: 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)) { 38e04: 23 2b or r18, r19 38e06: 39 f5 brne .+78 ; 0x38e56 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; 38e08: 9c 01 movw r18, r24 38e0a: 22 27 eor r18, r18 38e0c: 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)) { 38e0e: 23 2b or r18, r19 38e10: 21 f5 brne .+72 ; 0x38e5a 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; 38e12: 88 27 eor r24, r24 38e14: 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)) { 38e16: 89 2b or r24, r25 38e18: 11 f1 breq .+68 ; 0x38e5e return FindErrorIndex(ERR_TEMPERATURE_TMC_IDLER_OVERHEAT_ERROR); 38e1a: 81 e1 ldi r24, 0x11 ; 17 38e1c: 08 95 ret } uint8_t PrusaErrorCodeIndex(ErrorCode ec) { switch (ec) { case ErrorCode::FINDA_DIDNT_SWITCH_ON: return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER); 38e1e: 80 e0 ldi r24, 0x00 ; 0 38e20: 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); 38e22: 82 e1 ldi r24, 0x12 ; 18 38e24: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET); 38e26: 85 e1 ldi r24, 0x15 ; 21 38e28: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR); 38e2a: 88 e1 ldi r24, 0x18 ; 24 38e2c: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED); 38e2e: 8b e1 ldi r24, 0x1B ; 27 38e30: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT); 38e32: 8c e0 ldi r24, 0x0C ; 12 38e34: 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); 38e36: 83 e1 ldi r24, 0x13 ; 19 38e38: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET); 38e3a: 86 e1 ldi r24, 0x16 ; 22 38e3c: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR); 38e3e: 89 e1 ldi r24, 0x19 ; 25 38e40: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED); 38e42: 8c e1 ldi r24, 0x1C ; 28 38e44: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT); 38e46: 8d e0 ldi r24, 0x0D ; 13 38e48: 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); 38e4a: 84 e1 ldi r24, 0x14 ; 20 38e4c: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_RESET)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET); 38e4e: 87 e1 ldi r24, 0x17 ; 23 38e50: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR); 38e52: 8a e1 ldi r24, 0x1A ; 26 38e54: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) { return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED); 38e56: 8d e1 ldi r24, 0x1D ; 29 38e58: 08 95 ret } if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) { return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT); 38e5a: 8e e0 ldi r24, 0x0E ; 14 38e5c: 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); 38e5e: 8c e2 ldi r24, 0x2C ; 44 } 38e60: 08 95 ret 00038e62 : bool TuneMenuEntered() { return putErrorScreenToSleep; } void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) { 38e62: cf 92 push r12 38e64: df 92 push r13 38e66: ef 92 push r14 38e68: ff 92 push r15 38e6a: 0f 93 push r16 38e6c: 1f 93 push r17 38e6e: cf 93 push r28 38e70: df 93 push r29 if (putErrorScreenToSleep) return; if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && mmu2.MMULastErrorSource() == MMU2::ErrorSourceMMU) { 38e72: 20 91 8a 13 lds r18, 0x138A ; 0x80138a 38e76: 30 91 8b 13 lds r19, 0x138B ; 0x80138b 38e7a: 21 30 cpi r18, 0x01 ; 1 38e7c: 31 05 cpc r19, r1 38e7e: 39 f4 brne .+14 ; 0x38e8e 38e80: 20 91 b3 13 lds r18, 0x13B3 ; 0x8013b3 38e84: 21 30 cpi r18, 0x01 ; 1 38e86: 19 f4 brne .+6 ; 0x38e8e // 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; 38e88: 22 e0 ldi r18, 0x02 ; 2 38e8a: 20 93 f5 17 sts 0x17F5, r18 ; 0x8017f5 } const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec); 38e8e: 0f 94 e0 c5 call 0x38bc0 ; 0x38bc0 38e92: d8 2f mov r29, r24 switch ((uint8_t)ReportErrorHookState) { 38e94: 80 91 f5 17 lds r24, 0x17F5 ; 0x8017f5 38e98: 81 30 cpi r24, 0x01 ; 1 38e9a: 09 f4 brne .+2 ; 0x38e9e 38e9c: 64 c0 rjmp .+200 ; 0x38f66 38e9e: 60 f0 brcs .+24 ; 0x38eb8 38ea0: 82 30 cpi r24, 0x02 ; 2 38ea2: 09 f4 brne .+2 ; 0x38ea6 38ea4: f4 c0 rjmp .+488 ; 0x3908e ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN; break; default: break; } } 38ea6: df 91 pop r29 38ea8: cf 91 pop r28 38eaa: 1f 91 pop r17 38eac: 0f 91 pop r16 38eae: ff 90 pop r15 38eb0: ef 90 pop r14 38eb2: df 90 pop r13 38eb4: cf 90 pop r12 38eb6: 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); 38eb8: 84 e0 ldi r24, 0x04 ; 4 38eba: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be 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); 38ebe: 0d 2f mov r16, r29 38ec0: 10 e0 ldi r17, 0x00 ; 0 38ec2: f8 01 movw r30, r16 38ec4: e1 56 subi r30, 0x61 ; 97 38ec6: f4 45 sbci r31, 0x54 ; 84 38ec8: 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); 38eca: fc 2e mov r15, r28 38ecc: f2 94 swap r15 38ece: 6f e0 ldi r22, 0x0F ; 15 38ed0: f6 22 and r15, r22 const uint8_t button_op_middle = BUTTON_OP_MIDDLE(button_operation); 38ed2: 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); 38ed4: 80 e0 ldi r24, 0x00 ; 0 38ed6: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_clear(); 38eda: 0e 94 ab 6e call 0xdd56 ; 0xdd56 // 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); 38ede: 00 0f add r16, r16 38ee0: 11 1f adc r17, r17 38ee2: f8 01 movw r30, r16 38ee4: e4 53 subi r30, 0x34 ; 52 38ee6: f4 45 sbci r31, 0x54 ; 84 38ee8: c5 90 lpm r12, Z+ 38eea: d4 90 lpm r13, Z } const char *PrusaErrorTitle(uint8_t i) { return (const char *)pgm_read_ptr(errorTitles + i); 38eec: 09 59 subi r16, 0x99 ; 153 38eee: 17 45 sbci r17, 0x57 ; 87 38ef0: f8 01 movw r30, r16 38ef2: 85 91 lpm r24, Z+ 38ef4: 94 91 lpm r25, Z // Print title and header lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) ); 38ef6: 0e 94 44 72 call 0xe488 ; 0xe488 38efa: df 92 push r13 38efc: cf 92 push r12 38efe: 9f 93 push r25 38f00: 8f 93 push r24 38f02: 88 e3 ldi r24, 0x38 ; 56 38f04: 9c ea ldi r25, 0xAC ; 172 38f06: 9f 93 push r25 38f08: 8f 93 push r24 38f0a: 0e 94 51 6e call 0xdca2 ; 0xdca2 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)); 38f0e: 4f ed ldi r20, 0xDF ; 223 38f10: 58 ea ldi r21, 0xA8 ; 168 38f12: 62 e0 ldi r22, 0x02 ; 2 38f14: 80 e0 ldi r24, 0x00 ; 0 38f16: 0e 94 8c 6e call 0xdd18 ; 0xdd18 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()); 38f1a: 0f 90 pop r0 38f1c: 0f 90 pop r0 38f1e: 0f 90 pop r0 38f20: 0f 90 pop r0 38f22: 0f 90 pop r0 38f24: 0f 90 pop r0 38f26: f1 10 cpse r15, r1 38f28: c6 c0 rjmp .+396 ; 0x390b6 38f2a: 10 e0 ldi r17, 0x00 ; 0 38f2c: 00 e0 ldi r16, 0x00 ; 0 38f2e: 42 e1 ldi r20, 0x12 ; 18 38f30: e4 2e mov r14, r20 38f32: 5c e9 ldi r21, 0x9C ; 156 38f34: c5 2e mov r12, r21 38f36: 50 e7 ldi r21, 0x70 ; 112 38f38: 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); 38f3a: ec 2f mov r30, r28 38f3c: f0 e0 ldi r31, 0x00 ; 0 38f3e: ee 0f add r30, r30 38f40: ff 1f adc r31, r31 38f42: ec 5d subi r30, 0xDC ; 220 38f44: f3 45 sbci r31, 0x53 ; 83 38f46: 85 91 lpm r24, Z+ 38f48: 94 91 lpm r25, Z 38f4a: 0e 94 44 72 call 0xe488 ; 0xe488 38f4e: bc 01 movw r22, r24 38f50: 81 e0 ldi r24, 0x01 ; 1 38f52: f1 10 cpse r15, r1 38f54: 01 c0 rjmp .+2 ; 0x38f58 38f56: 80 e0 ldi r24, 0x00 ; 0 38f58: 2e 2d mov r18, r14 38f5a: a6 01 movw r20, r12 38f5c: 0f 94 6f 20 call 0x240de ; 0x240de switch ((uint8_t)ReportErrorHookState) { case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN: KEEPALIVE_STATE(PAUSED_FOR_USER); ReportErrorHookStaticRender(ei); ReportErrorHookState = ReportErrorHookStates::MONITOR_SELECTION; 38f60: 81 e0 ldi r24, 0x01 ; 1 38f62: 80 93 f5 17 sts 0x17F5, r24 ; 0x8017f5 [[fallthrough]]; case (uint8_t)ReportErrorHookStates::MONITOR_SELECTION: is_mmu_error_monitor_active = true; 38f66: 81 e0 ldi r24, 0x01 ; 1 38f68: 80 93 c2 06 sts 0x06C2, r24 ; 0x8006c2 <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.492> ReportErrorHookDynamicRender(); // Render dynamic characters 38f6c: 0f 94 ea c4 call 0x389d4 ; 0x389d4 sound_wait_for_user(); 38f70: 0f 94 e1 52 call 0x2a5c2 ; 0x2a5c2 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); 38f74: 0d 2f mov r16, r29 38f76: 10 e0 ldi r17, 0x00 ; 0 38f78: f8 01 movw r30, r16 38f7a: e1 56 subi r30, 0x61 ; 97 38f7c: f4 45 sbci r31, 0x54 ; 84 38f7e: 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); 38f80: dc 2f mov r29, r28 38f82: d2 95 swap r29 38f84: 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; 38f86: 80 91 ed 17 lds r24, 0x17ED ; 0x8017ed 38f8a: 81 11 cpse r24, r1 38f8c: 09 c0 rjmp .+18 ; 0x38fa0 38f8e: 81 e0 ldi r24, 0x01 ; 1 38f90: d1 11 cpse r29, r1 38f92: 01 c0 rjmp .+2 ; 0x38f96 38f94: 80 e0 ldi r24, 0x00 ; 0 38f96: 80 93 ec 17 sts 0x17EC, r24 ; 0x8017ec 38f9a: 81 e0 ldi r24, 0x01 ; 1 38f9c: 80 93 ed 17 sts 0x17ED, r24 ; 0x8017ed static int8_t choice_selected = -1; if (reset_button_selection) { 38fa0: 80 91 eb 17 lds r24, 0x17EB ; 0x8017eb 38fa4: 88 23 and r24, r24 38fa6: 41 f0 breq .+16 ; 0x38fb8 // 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; 38fa8: 81 e0 ldi r24, 0x01 ; 1 38faa: d1 11 cpse r29, r1 38fac: 01 c0 rjmp .+2 ; 0x38fb0 38fae: 80 e0 ldi r24, 0x00 ; 0 38fb0: 80 93 ec 17 sts 0x17EC, r24 ; 0x8017ec choice_selected = -1; reset_button_selection = 0; 38fb4: 10 92 eb 17 sts 0x17EB, r1 ; 0x8017eb } // Check if knob was rotated if (lcd_encoder) { 38fb8: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 38fbc: 30 91 70 06 lds r19, 0x0670 ; 0x800670 38fc0: 21 15 cp r18, r1 38fc2: 31 05 cpc r19, r1 38fc4: b9 f1 breq .+110 ; 0x39034 38fc6: 80 91 ec 17 lds r24, 0x17EC ; 0x8017ec if (two_choices == false) { // third_choice is not nullptr, safe to dereference 38fca: dd 23 and r29, r29 38fcc: 61 f0 breq .+24 ; 0x38fe6 if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 38fce: 37 ff sbrs r19, 7 38fd0: 06 c0 rjmp .+12 ; 0x38fde 38fd2: 88 23 and r24, r24 38fd4: 69 f0 breq .+26 ; 0x38ff0 // Rotating knob counter clockwise current_selection--; 38fd6: 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; 38fd8: 80 93 ec 17 sts 0x17EC, r24 ; 0x8017ec 38fdc: 09 c0 rjmp .+18 ; 0x38ff0 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) { 38fde: 82 30 cpi r24, 0x02 ; 2 38fe0: 39 f0 breq .+14 ; 0x38ff0 // Rotating knob clockwise current_selection++; 38fe2: 8f 5f subi r24, 0xFF ; 255 38fe4: f9 cf rjmp .-14 ; 0x38fd8 } } else { if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) { 38fe6: 37 ff sbrs r19, 7 38fe8: 41 c0 rjmp .+130 ; 0x3906c 38fea: 81 11 cpse r24, r1 // Rotating knob counter clockwise current_selection = LCD_LEFT_BUTTON_CHOICE; 38fec: 10 92 ec 17 sts 0x17EC, r1 ; 0x8017ec //! ---------------------- //! |>(left) >(mid) | //! ---------------------- //! @endcode // lcd_putc_at(0, 3, current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' '); 38ff0: 80 91 ec 17 lds r24, 0x17EC ; 0x8017ec 38ff4: 4e e3 ldi r20, 0x3E ; 62 38ff6: 81 11 cpse r24, r1 38ff8: 40 e2 ldi r20, 0x20 ; 32 38ffa: 63 e0 ldi r22, 0x03 ; 3 38ffc: 80 e0 ldi r24, 0x00 ; 0 38ffe: 0e 94 98 6e call 0xdd30 ; 0xdd30 39002: 80 91 ec 17 lds r24, 0x17EC ; 0x8017ec if (two_choices == false) 39006: dd 23 and r29, r29 39008: b1 f1 breq .+108 ; 0x39076 { lcd_putc_at(9, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 3900a: 4e e3 ldi r20, 0x3E ; 62 3900c: 81 30 cpi r24, 0x01 ; 1 3900e: 09 f0 breq .+2 ; 0x39012 39010: 40 e2 ldi r20, 0x20 ; 32 39012: 63 e0 ldi r22, 0x03 ; 3 39014: 89 e0 ldi r24, 0x09 ; 9 39016: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' '); 3901a: 80 91 ec 17 lds r24, 0x17EC ; 0x8017ec 3901e: 82 30 cpi r24, 0x02 ; 2 39020: 61 f5 brne .+88 ; 0x3907a } else { // More button for two button screen lcd_putc_at(18, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' '); 39022: 4e e3 ldi r20, 0x3E ; 62 39024: 63 e0 ldi r22, 0x03 ; 3 39026: 82 e1 ldi r24, 0x12 ; 18 39028: 0e 94 98 6e call 0xdd30 ; 0xdd30 } // Consume rotation event lcd_encoder = 0; 3902c: 10 92 70 06 sts 0x0670, r1 ; 0x800670 39030: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f } // Check if knob was clicked and consume the event if (lcd_clicked()) { 39034: 0e 94 95 70 call 0xe12a ; 0xe12a 39038: 88 23 and r24, r24 3903a: 09 f4 brne .+2 ; 0x3903e 3903c: 34 cf rjmp .-408 ; 0x38ea6 choice_selected = current_selection; 3903e: 80 91 ec 17 lds r24, 0x17EC ; 0x8017ec } else { // continue monitoring return ret; } if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE) // Two choices and middle button selected 39042: d1 11 cpse r29, r1 39044: 1c c0 rjmp .+56 ; 0x3907e 39046: 81 30 cpi r24, 0x01 ; 1 39048: 89 f5 brne .+98 ; 0x390ac 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); 3904a: f8 01 movw r30, r16 3904c: ee 0f add r30, r30 3904e: ff 1f adc r31, r31 39050: eb 5b subi r30, 0xBB ; 187 39052: f4 45 sbci r31, 0x54 ; 84 39054: 85 91 lpm r24, Z+ 39056: 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))); 39058: 0e 94 44 72 call 0xe488 ; 0xe488 3905c: 0f 94 cd 20 call 0x2419a ; 0x2419a SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 39060: 81 e0 ldi r24, 0x01 ; 1 39062: 80 93 eb 17 sts 0x17EB, r24 ; 0x8017eb 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; 39066: 10 92 f5 17 sts 0x17F5, r1 ; 0x8017f5 3906a: 1d cf rjmp .-454 ; 0x38ea6 } } 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) { 3906c: 81 30 cpi r24, 0x01 ; 1 3906e: 09 f4 brne .+2 ; 0x39072 39070: bf cf rjmp .-130 ; 0x38ff0 // Rotating knob clockwise current_selection = LCD_MIDDLE_BUTTON_CHOICE; 39072: 81 e0 ldi r24, 0x01 ; 1 39074: b1 cf rjmp .-158 ; 0x38fd8 { 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 ? '>': ' '); 39076: 81 30 cpi r24, 0x01 ; 1 39078: a1 f2 breq .-88 ; 0x39022 3907a: 40 e2 ldi r20, 0x20 ; 32 3907c: d3 cf rjmp .-90 ; 0x39024 // 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 3907e: 82 30 cpi r24, 0x02 ; 2 39080: 21 f3 breq .-56 ; 0x3904a { // 'More' show error description lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei))); ret = 1; } else if(choice_selected == LCD_MIDDLE_BUTTON_CHOICE) { 39082: 81 30 cpi r24, 0x01 ; 1 39084: 99 f4 brne .+38 ; 0x390ac return Buttons::NoButton; } void SetButtonResponse(ButtonOperations rsp) { buttonSelectedOperation = rsp; 39086: d0 93 ad 0d sts 0x0DAD, r29 ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 3908a: 80 93 eb 17 sts 0x17EB, r24 ; 0x8017eb // More button selected, change state ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN; break; case 2: // Exit error screen and enable lcd updates lcd_update_enable(true); 3908e: 81 e0 ldi r24, 0x01 ; 1 39090: 0e 94 bd 6e call 0xdd7a ; 0xdd7a lcd_return_to_status(); 39094: 0f 94 82 1f call 0x23f04 ; 0x23f04 39098: 10 92 6a 05 sts 0x056A, r1 ; 0x80056a <_ZL10beep_timer.lto_priv.496> /// @brief Resets the global state of sound_wait_for_user() void sound_wait_for_user_reset() { beep_timer.stop(); bFirst = false; 3909c: 10 92 6d 05 sts 0x056D, r1 ; 0x80056d <_ZL6bFirst.lto_priv.497> sound_wait_for_user_reset(); // Reset the state in case a new error is reported is_mmu_error_monitor_active = false; 390a0: 10 92 c2 06 sts 0x06C2, r1 ; 0x8006c2 <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.492> KEEPALIVE_STATE(IN_HANDLER); 390a4: 82 e0 ldi r24, 0x02 ; 2 390a6: 80 93 be 02 sts 0x02BE, r24 ; 0x8002be 390aa: dd cf rjmp .-70 ; 0x39066 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); 390ac: cf 70 andi r28, 0x0F ; 15 390ae: c0 93 ad 0d sts 0x0DAD, r28 ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> SetButtonResponse((ButtonOperations)button_op_middle); ret = 2; } // Next MMU error screen should reset the choice selection reset_button_selection = 1; 390b2: 81 e0 ldi r24, 0x01 ; 1 390b4: ea cf rjmp .-44 ; 0x3908a 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); 390b6: ef 2d mov r30, r15 390b8: f0 e0 ldi r31, 0x00 ; 0 390ba: ee 0f add r30, r30 390bc: ff 1f adc r31, r31 390be: ec 5d subi r30, 0xDC ; 220 390c0: f3 45 sbci r31, 0x53 ; 83 390c2: 85 91 lpm r24, Z+ 390c4: 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()); 390c6: 0e 94 44 72 call 0xe488 ; 0xe488 390ca: 6c 01 movw r12, r24 390cc: 0c e9 ldi r16, 0x9C ; 156 390ce: 10 e7 ldi r17, 0x70 ; 112 390d0: 99 e0 ldi r25, 0x09 ; 9 390d2: e9 2e mov r14, r25 390d4: 32 cf rjmp .-412 ; 0x38f3a 000390d6 : buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation return result; } Buttons ButtonAvailable(ErrorCode ec) { uint8_t ei = PrusaErrorCodeIndex(ec); 390d6: 0f 94 e0 c5 call 0x38bc0 ; 0x38bc0 // 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); 390da: e8 2f mov r30, r24 390dc: f0 e0 ldi r31, 0x00 ; 0 390de: ee 0f add r30, r30 390e0: ff 1f adc r31, r31 390e2: e4 53 subi r30, 0x34 ; 52 390e4: f4 45 sbci r31, 0x54 ; 84 390e6: 25 91 lpm r18, Z+ 390e8: 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) ) { 390ea: 23 33 cpi r18, 0x33 ; 51 390ec: 81 e0 ldi r24, 0x01 ; 1 390ee: 38 07 cpc r19, r24 390f0: 08 f0 brcs .+2 ; 0x390f4 390f2: 41 c0 rjmp .+130 ; 0x39176 390f4: 2d 32 cpi r18, 0x2D ; 45 390f6: 81 e0 ldi r24, 0x01 ; 1 390f8: 38 07 cpc r19, r24 390fa: 78 f5 brcc .+94 ; 0x3915a 390fc: 2e 37 cpi r18, 0x7E ; 126 390fe: 31 05 cpc r19, r1 39100: 09 f4 brne .+2 ; 0x39104 39102: 83 c0 rjmp .+262 ; 0x3920a 39104: f0 f4 brcc .+60 ; 0x39142 39106: 2c 36 cpi r18, 0x6C ; 108 39108: 31 05 cpc r19, r1 3910a: 09 f4 brne .+2 ; 0x3910e 3910c: 85 c0 rjmp .+266 ; 0x39218 3910e: 30 f4 brcc .+12 ; 0x3911c 39110: 25 36 cpi r18, 0x65 ; 101 39112: 31 05 cpc r19, r1 39114: 08 f0 brcs .+2 ; 0x39118 39116: 79 c0 rjmp .+242 ; 0x3920a default: break; } return Buttons::NoButton; 39118: 8f ef ldi r24, 0xFF ; 255 3911a: 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) ) { 3911c: 24 37 cpi r18, 0x74 ; 116 3911e: 31 05 cpc r19, r1 39120: 09 f4 brne .+2 ; 0x39124 39122: 73 c0 rjmp .+230 ; 0x3920a 39124: 2d 37 cpi r18, 0x7D ; 125 39126: 31 05 cpc r19, r1 39128: 19 f0 breq .+6 ; 0x39130 3912a: 23 37 cpi r18, 0x73 ; 115 3912c: 31 05 cpc r19, r1 3912e: a1 f7 brne .-24 ; 0x39118 break; } break; case ERR_MECHANICAL_SELECTOR_CANNOT_HOME: case ERR_MECHANICAL_IDLER_CANNOT_HOME: switch (buttonSelectedOperation) { 39130: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 39134: 81 30 cpi r24, 0x01 ; 1 39136: 09 f4 brne .+2 ; 0x3913a 39138: 6d c0 rjmp .+218 ; 0x39214 3913a: 87 30 cpi r24, 0x07 ; 7 3913c: 69 f7 brne .-38 ; 0x39118 // may be allow move selector right and left in the future case ButtonOperations::Tune: // Tune Stallguard threshold return Buttons::TuneMMU; 3913e: 88 e0 ldi r24, 0x08 ; 8 39140: 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) ) { 39142: 23 3d cpi r18, 0xD3 ; 211 39144: 31 05 cpc r19, r1 39146: 09 f4 brne .+2 ; 0x3914a 39148: 6e c0 rjmp .+220 ; 0x39226 3914a: 50 f4 brcc .+20 ; 0x39160 3914c: 29 3c cpi r18, 0xC9 ; 201 3914e: 31 05 cpc r19, r1 39150: 09 f4 brne .+2 ; 0x39154 39152: 69 c0 rjmp .+210 ; 0x39226 39154: 2a 3c cpi r18, 0xCA ; 202 39156: 31 05 cpc r19, r1 39158: f9 f6 brne .-66 ; 0x39118 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) { 3915a: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 3915e: 67 c0 rjmp .+206 ; 0x3922e // 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) ) { 39160: 2d 3d cpi r18, 0xDD ; 221 39162: 31 05 cpc r19, r1 39164: 09 f4 brne .+2 ; 0x39168 39166: 5f c0 rjmp .+190 ; 0x39226 39168: 2e 3d cpi r18, 0xDE ; 222 3916a: 31 05 cpc r19, r1 3916c: b1 f3 breq .-20 ; 0x3915a 3916e: 24 3d cpi r18, 0xD4 ; 212 39170: 31 05 cpc r19, r1 39172: 91 f6 brne .-92 ; 0x39118 39174: f2 cf rjmp .-28 ; 0x3915a 39176: 25 3f cpi r18, 0xF5 ; 245 39178: 81 e0 ldi r24, 0x01 ; 1 3917a: 38 07 cpc r19, r24 3917c: 09 f4 brne .+2 ; 0x39180 3917e: 5c c0 rjmp .+184 ; 0x39238 39180: f8 f4 brcc .+62 ; 0x391c0 39182: 26 34 cpi r18, 0x46 ; 70 39184: 81 e0 ldi r24, 0x01 ; 1 39186: 38 07 cpc r19, r24 39188: 58 f4 brcc .+22 ; 0x391a0 3918a: 21 34 cpi r18, 0x41 ; 65 3918c: 81 e0 ldi r24, 0x01 ; 1 3918e: 38 07 cpc r19, r24 39190: 20 f7 brcc .-56 ; 0x3915a 39192: 27 53 subi r18, 0x37 ; 55 39194: 31 40 sbci r19, 0x01 ; 1 39196: 25 30 cpi r18, 0x05 ; 5 39198: 31 05 cpc r19, r1 3919a: 08 f0 brcs .+2 ; 0x3919e 3919c: bd cf rjmp .-134 ; 0x39118 3919e: dd cf rjmp .-70 ; 0x3915a 391a0: 21 59 subi r18, 0x91 ; 145 391a2: 31 40 sbci r19, 0x01 ; 1 391a4: 22 30 cpi r18, 0x02 ; 2 391a6: 31 05 cpc r19, r1 391a8: 08 f0 brcs .+2 ; 0x391ac 391aa: b6 cf rjmp .-148 ; 0x39118 } break; case ERR_CONNECT_MMU_NOT_RESPONDING: case ERR_CONNECT_COMMUNICATION_ERROR: case ERR_SYSTEM_FW_UPDATE_NEEDED: switch (buttonSelectedOperation) { 391ac: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 391b0: 83 30 cpi r24, 0x03 ; 3 391b2: 09 f4 brne .+2 ; 0x391b6 391b4: 3f c0 rjmp .+126 ; 0x39234 391b6: 89 30 cpi r24, 0x09 ; 9 391b8: 09 f0 breq .+2 ; 0x391bc 391ba: ae cf rjmp .-164 ; 0x39118 case ButtonOperations::DisableMMU: // "Disable" return Buttons::DisableMMU; 391bc: 87 e0 ldi r24, 0x07 ; 7 391be: 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) ) { 391c0: 29 3f cpi r18, 0xF9 ; 249 391c2: 81 e0 ldi r24, 0x01 ; 1 391c4: 38 07 cpc r19, r24 391c6: 49 f2 breq .-110 ; 0x3915a 391c8: 70 f4 brcc .+28 ; 0x391e6 391ca: 27 3f cpi r18, 0xF7 ; 247 391cc: 81 e0 ldi r24, 0x01 ; 1 391ce: 38 07 cpc r19, r24 391d0: 21 f2 breq .-120 ; 0x3915a 391d2: 60 f7 brcc .-40 ; 0x391ac break; } break; case ERR_SYSTEM_INVALID_TOOL: switch (buttonSelectedOperation) { 391d4: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 391d8: 83 30 cpi r24, 0x03 ; 3 391da: 61 f1 breq .+88 ; 0x39234 391dc: 88 30 cpi r24, 0x08 ; 8 391de: 09 f0 breq .+2 ; 0x391e2 391e0: 9b cf rjmp .-202 ; 0x39118 case ButtonOperations::StopPrint: // "Stop print" return Buttons::StopPrint; 391e2: 86 e0 ldi r24, 0x06 ; 6 391e4: 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) ) { 391e6: 2b 3f cpi r18, 0xFB ; 251 391e8: 81 e0 ldi r24, 0x01 ; 1 391ea: 38 07 cpc r19, r24 391ec: a9 f0 breq .+42 ; 0x39218 391ee: 68 f0 brcs .+26 ; 0x3920a 391f0: 2c 3f cpi r18, 0xFC ; 252 391f2: 31 40 sbci r19, 0x01 ; 1 391f4: 09 f0 breq .+2 ; 0x391f8 391f6: 90 cf rjmp .-224 ; 0x39118 default: break; } break; case ERR_SYSTEM_FILAMENT_CHANGE: switch (buttonSelectedOperation) { 391f8: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 391fc: 85 30 cpi r24, 0x05 ; 5 391fe: 89 f0 breq .+34 ; 0x39222 39200: 86 30 cpi r24, 0x06 ; 6 39202: 09 f0 breq .+2 ; 0x39206 39204: 89 cf rjmp .-238 ; 0x39118 case ButtonOperations::Load: return Buttons::Load; case ButtonOperations::Eject: return Buttons::Eject; 39206: 85 e0 ldi r24, 0x05 ; 5 39208: 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) { 3920a: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 3920e: 81 30 cpi r24, 0x01 ; 1 39210: 09 f0 breq .+2 ; 0x39214 39212: 82 cf rjmp .-252 ; 0x39118 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; 39214: 81 e0 ldi r24, 0x01 ; 1 39216: 08 95 ret break; } break; case ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED: case ERR_SYSTEM_FILAMENT_EJECTED: switch (buttonSelectedOperation) { 39218: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 3921c: 82 30 cpi r24, 0x02 ; 2 3921e: d1 f3 breq .-12 ; 0x39214 39220: 7b cf rjmp .-266 ; 0x39118 } break; case ERR_SYSTEM_FILAMENT_CHANGE: switch (buttonSelectedOperation) { case ButtonOperations::Load: return Buttons::Load; 39222: 84 e0 ldi r24, 0x04 ; 4 39224: 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) { 39226: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 3922a: 82 30 cpi r24, 0x02 ; 2 3922c: 61 f0 breq .+24 ; 0x39246 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) { 3922e: 83 30 cpi r24, 0x03 ; 3 39230: 09 f0 breq .+2 ; 0x39234 39232: 72 cf rjmp .-284 ; 0x39118 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; 39234: 83 e0 ldi r24, 0x03 ; 3 default: break; } return Buttons::NoButton; } 39236: 08 95 ret default: break; } break; case ERR_SYSTEM_FILAMENT_ALREADY_LOADED: switch (buttonSelectedOperation) { 39238: 80 91 ad 0d lds r24, 0x0DAD ; 0x800dad <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.495> 3923c: 82 30 cpi r24, 0x02 ; 2 3923e: 29 f0 breq .+10 ; 0x3924a 39240: 84 30 cpi r24, 0x04 ; 4 39242: 09 f0 breq .+2 ; 0x39246 39244: 69 cf rjmp .-302 ; 0x39118 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; 39246: 82 e0 ldi r24, 0x02 ; 2 39248: 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; 3924a: 80 e0 ldi r24, 0x00 ; 0 3924c: 08 95 ret 0003924e (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]>: #endif namespace MMU2 { template void waitForHotendTargetTemp(uint16_t delay, F f) { 3924e: cf 93 push r28 39250: df 93 push r29 39252: ec 01 movw r28, r24 int16_t thermal_degTargetHotend() { return degTargetHotend(0); } int16_t thermal_degHotend() { return degHotend(0); 39254: 60 91 af 0d lds r22, 0x0DAF ; 0x800daf 39258: 70 91 b0 0d lds r23, 0x0DB0 ; 0x800db0 3925c: 80 91 b1 0d lds r24, 0x0DB1 ; 0x800db1 39260: 90 91 b2 0d lds r25, 0x0DB2 ; 0x800db2 39264: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) { 39268: 20 91 b5 0d lds r18, 0x0DB5 ; 0x800db5 3926c: 30 91 b6 0d lds r19, 0x0DB6 ; 0x800db6 39270: c9 01 movw r24, r18 39272: 86 1b sub r24, r22 39274: 97 0b sbc r25, r23 39276: 06 97 sbiw r24, 0x06 ; 6 39278: 24 f0 brlt .+8 ; 0x39282 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]+0x34> void thermal_setTargetHotend(int16_t t) { setTargetHotend(t); } void safe_delay_keep_alive(uint16_t t) { delay_keep_alive(t); 3927a: ce 01 movw r24, r28 3927c: 0e 94 84 8c call 0x11908 ; 0x11908 39280: e9 cf rjmp .-46 ; 0x39254 (unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.385]+0x6> f(); safe_delay_keep_alive(delay); } } 39282: df 91 pop r29 39284: cf 91 pop r28 39286: 08 95 ret 00039288 : } //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) { 39288: cf 93 push r28 3928a: df 93 push r29 3928c: 00 d0 rcall .+0 ; 0x3928e 3928e: 00 d0 rcall .+0 ; 0x39290 39290: 1f 92 push r1 39292: cd b7 in r28, 0x3d ; 61 39294: 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)) 39296: 87 30 cpi r24, 0x07 ; 7 39298: 50 f5 brcc .+84 ; 0x392ee 3929a: 67 30 cpi r22, 0x07 ; 7 3929c: 40 f5 brcc .+80 ; 0x392ee return false; uint8_t valid_points_mask[7] = { 3929e: 97 e0 ldi r25, 0x07 ; 7 392a0: e6 ec ldi r30, 0xC6 ; 198 392a2: f2 e0 ldi r31, 0x02 ; 2 392a4: de 01 movw r26, r28 392a6: 11 96 adiw r26, 0x01 ; 1 392a8: 01 90 ld r0, Z+ 392aa: 0d 92 st X+, r0 392ac: 9a 95 dec r25 392ae: e1 f7 brne .-8 ; 0x392a8 0b1110111,//2 0b1111111,//1 0b1111111,//0 //[0,0] }; return (valid_points_mask[6 - iy] & (1 << (6 - ix))); 392b0: 46 e0 ldi r20, 0x06 ; 6 392b2: 50 e0 ldi r21, 0x00 ; 0 392b4: fa 01 movw r30, r20 392b6: e6 1b sub r30, r22 392b8: f1 09 sbc r31, r1 392ba: 21 e0 ldi r18, 0x01 ; 1 392bc: 30 e0 ldi r19, 0x00 ; 0 392be: 2c 0f add r18, r28 392c0: 3d 1f adc r19, r29 392c2: e2 0f add r30, r18 392c4: f3 1f adc r31, r19 392c6: 20 81 ld r18, Z 392c8: 30 e0 ldi r19, 0x00 ; 0 392ca: 48 1b sub r20, r24 392cc: 51 09 sbc r21, r1 392ce: c9 01 movw r24, r18 392d0: 02 c0 rjmp .+4 ; 0x392d6 392d2: 95 95 asr r25 392d4: 87 95 ror r24 392d6: 4a 95 dec r20 392d8: e2 f7 brpl .-8 ; 0x392d2 392da: 81 70 andi r24, 0x01 ; 1 } 392dc: 27 96 adiw r28, 0x07 ; 7 392de: 0f b6 in r0, 0x3f ; 63 392e0: f8 94 cli 392e2: de bf out 0x3e, r29 ; 62 392e4: 0f be out 0x3f, r0 ; 63 392e6: cd bf out 0x3d, r28 ; 61 392e8: df 91 pop r29 392ea: cf 91 pop r28 392ec: 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; 392ee: 80 e0 ldi r24, 0x00 ; 0 392f0: f5 cf rjmp .-22 ; 0x392dc 000392f2 : // Number of baby steps applied static int babystepLoadZ = 0; void babystep_load() { babystepLoadZ = 0; 392f2: 10 92 8a 06 sts 0x068A, r1 ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 392f6: 10 92 89 06 sts 0x0689, r1 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> // Apply Z height correction aka baby stepping before mesh bed leveling gets activated. if (calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) 392fa: 80 e1 ldi r24, 0x10 ; 16 392fc: 0e 94 58 ef call 0x1deb0 ; 0x1deb0 39300: 88 23 and r24, r24 39302: 91 f0 breq .+36 ; 0x39328 { check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0 39304: 0e 94 17 79 call 0xf22e ; 0xf22e // 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))); 39308: 81 ea ldi r24, 0xA1 ; 161 3930a: 9d e0 ldi r25, 0x0D ; 13 3930c: 0f 94 10 dc call 0x3b820 ; 0x3b820 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-> 39310: 2b e0 ldi r18, 0x0B ; 11 39312: 82 9f mul r24, r18 39314: c0 01 movw r24, r0 39316: 11 24 eor r1, r1 39318: 80 5b subi r24, 0xB0 ; 176 3931a: 92 4f sbci r25, 0xF2 ; 242 3931c: 0f 94 1e dc call 0x3b83c ; 0x3b83c 39320: 90 93 8a 06 sts 0x068A, r25 ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 39324: 80 93 89 06 sts 0x0689, r24 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> SERIAL_ECHO("correction: "); SERIAL_ECHO(float(babystepLoadZ) / float(axis_steps_per_mm[Z_AXIS])); SERIAL_ECHOLN(""); #endif } } 39328: 08 95 ret 0003932a : #endif //NEW_XYZCAL // Shift a Z axis by a given delta. // To replace loading of the babystep correction. static void shift_z(float delta) { 3932a: 0f 93 push r16 3932c: 1f 93 push r17 3932e: cf 93 push r28 39330: df 93 push r29 39332: 00 d0 rcall .+0 ; 0x39334 39334: 1f 92 push r1 39336: cd b7 in r28, 0x3d ; 61 39338: de b7 in r29, 0x3e ; 62 3933a: 9b 01 movw r18, r22 3933c: ac 01 movw r20, r24 const float curpos_z = current_position[Z_AXIS]; 3933e: 01 e9 ldi r16, 0x91 ; 145 39340: 16 e0 ldi r17, 0x06 ; 6 39342: f8 01 movw r30, r16 39344: 60 85 ldd r22, Z+8 ; 0x08 39346: 71 85 ldd r23, Z+9 ; 0x09 39348: 82 85 ldd r24, Z+10 ; 0x0a 3934a: 93 85 ldd r25, Z+11 ; 0x0b 3934c: 69 83 std Y+1, r22 ; 0x01 3934e: 7a 83 std Y+2, r23 ; 0x02 39350: 8b 83 std Y+3, r24 ; 0x03 39352: 9c 83 std Y+4, r25 ; 0x04 current_position[Z_AXIS] -= delta; 39354: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 39358: f8 01 movw r30, r16 3935a: 60 87 std Z+8, r22 ; 0x08 3935c: 71 87 std Z+9, r23 ; 0x09 3935e: 82 87 std Z+10, r24 ; 0x0a 39360: 93 87 std Z+11, r25 ; 0x0b plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60); 39362: 65 e5 ldi r22, 0x55 ; 85 39364: 75 e5 ldi r23, 0x55 ; 85 39366: 85 e5 ldi r24, 0x55 ; 85 39368: 91 e4 ldi r25, 0x41 ; 65 3936a: 0f 94 3d c0 call 0x3807a ; 0x3807a st_synchronize(); 3936e: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[Z_AXIS] = curpos_z; 39372: 89 81 ldd r24, Y+1 ; 0x01 39374: 9a 81 ldd r25, Y+2 ; 0x02 39376: ab 81 ldd r26, Y+3 ; 0x03 39378: bc 81 ldd r27, Y+4 ; 0x04 3937a: f8 01 movw r30, r16 3937c: 80 87 std Z+8, r24 ; 0x08 3937e: 91 87 std Z+9, r25 ; 0x09 39380: a2 87 std Z+10, r26 ; 0x0a 39382: b3 87 std Z+11, r27 ; 0x0b plan_set_z_position(curpos_z); 39384: ce 01 movw r24, r28 39386: 01 96 adiw r24, 0x01 ; 1 39388: 0f 94 e8 64 call 0x2c9d0 ; 0x2c9d0 } 3938c: 0f 90 pop r0 3938e: 0f 90 pop r0 39390: 0f 90 pop r0 39392: 0f 90 pop r0 39394: df 91 pop r29 39396: cf 91 pop r28 39398: 1f 91 pop r17 3939a: 0f 91 pop r16 3939c: 08 95 ret 0003939e : 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])); 3939e: 60 91 89 06 lds r22, 0x0689 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> 393a2: 70 91 8a 06 lds r23, 0x068A ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 393a6: 07 2e mov r0, r23 393a8: 00 0c add r0, r0 393aa: 88 0b sbc r24, r24 393ac: 99 0b sbc r25, r25 393ae: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 393b2: 20 91 c9 0d lds r18, 0x0DC9 ; 0x800dc9 393b6: 30 91 ca 0d lds r19, 0x0DCA ; 0x800dca 393ba: 40 91 cb 0d lds r20, 0x0DCB ; 0x800dcb 393be: 50 91 cc 0d lds r21, 0x0DCC ; 0x800dcc 393c2: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 393c6: 0f 94 95 c9 call 0x3932a ; 0x3932a babystepLoadZ = 0; 393ca: 10 92 8a 06 sts 0x068A, r1 ; 0x80068a <_ZL13babystepLoadZ.lto_priv.499+0x1> 393ce: 10 92 89 06 sts 0x0689, r1 ; 0x800689 <_ZL13babystepLoadZ.lto_priv.499> } 393d2: 08 95 ret 000393d4 : return sampled; } void go_home_with_z_lift() { 393d4: cf 93 push r28 393d6: df 93 push r29 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 393d8: 0e 94 5b 66 call 0xccb6 ; 0xccb6 // Go home. // First move up to a safe height. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 393dc: c1 e9 ldi r28, 0x91 ; 145 393de: d6 e0 ldi r29, 0x06 ; 6 393e0: 80 e0 ldi r24, 0x00 ; 0 393e2: 90 e0 ldi r25, 0x00 ; 0 393e4: a0 ea ldi r26, 0xA0 ; 160 393e6: b0 e4 ldi r27, 0x40 ; 64 393e8: 88 87 std Y+8, r24 ; 0x08 393ea: 99 87 std Y+9, r25 ; 0x09 393ec: aa 87 std Y+10, r26 ; 0x0a 393ee: bb 87 std Y+11, r27 ; 0x0b go_to_current(homing_feedrate[Z_AXIS] / 60); 393f0: 65 e5 ldi r22, 0x55 ; 85 393f2: 75 e5 ldi r23, 0x55 ; 85 393f4: 85 e5 ldi r24, 0x55 ; 85 393f6: 91 e4 ldi r25, 0x41 ; 65 393f8: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // Second move to XY [0, 0]. current_position[X_AXIS] = X_MIN_POS + 0.2; 393fc: 8d ec ldi r24, 0xCD ; 205 393fe: 9c ec ldi r25, 0xCC ; 204 39400: ac e4 ldi r26, 0x4C ; 76 39402: be e3 ldi r27, 0x3E ; 62 39404: 88 83 st Y, r24 39406: 99 83 std Y+1, r25 ; 0x01 39408: aa 83 std Y+2, r26 ; 0x02 3940a: bb 83 std Y+3, r27 ; 0x03 current_position[Y_AXIS] = Y_MIN_POS + 0.2; 3940c: 83 e3 ldi r24, 0x33 ; 51 3940e: 93 e3 ldi r25, 0x33 ; 51 39410: a3 e7 ldi r26, 0x73 ; 115 39412: b0 ec ldi r27, 0xC0 ; 192 39414: 8c 83 std Y+4, r24 ; 0x04 39416: 9d 83 std Y+5, r25 ; 0x05 39418: ae 83 std Y+6, r26 ; 0x06 3941a: bf 83 std Y+7, r27 ; 0x07 // Clamp to the physical coordinates. world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 3941c: 65 e9 ldi r22, 0x95 ; 149 3941e: 76 e0 ldi r23, 0x06 ; 6 39420: ce 01 movw r24, r28 39422: 0e 94 42 6a call 0xd484 ; 0xd484 go_to_current((3 * homing_feedrate[X_AXIS]) / 60); 39426: 60 e0 ldi r22, 0x00 ; 0 39428: 70 e0 ldi r23, 0x00 ; 0 3942a: 86 e1 ldi r24, 0x16 ; 22 3942c: 93 e4 ldi r25, 0x43 ; 67 3942e: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a // Third move up to a safe height. current_position[Z_AXIS] = Z_MIN_POS; 39432: 8a e9 ldi r24, 0x9A ; 154 39434: 99 e9 ldi r25, 0x99 ; 153 39436: a9 e1 ldi r26, 0x19 ; 25 39438: be e3 ldi r27, 0x3E ; 62 3943a: 88 87 std Y+8, r24 ; 0x08 3943c: 99 87 std Y+9, r25 ; 0x09 3943e: aa 87 std Y+10, r26 ; 0x0a 39440: bb 87 std Y+11, r27 ; 0x0b go_to_current(homing_feedrate[Z_AXIS] / 60); 39442: 65 e5 ldi r22, 0x55 ; 85 39444: 75 e5 ldi r23, 0x55 ; 85 39446: 85 e5 ldi r24, 0x55 ; 85 39448: 91 e4 ldi r25, 0x41 ; 65 } 3944a: df 91 pop r29 3944c: 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); 3944e: 0d 94 c5 c5 jmp 0x38b8a ; 0x38b8a 00039452 : #define MESH_BED_CALIBRATION_SHOW_LCD float __attribute__((noinline)) BED_X(const uint8_t col) { return ((float)col * x_mesh_density + BED_X0); 39452: 68 2f mov r22, r24 39454: 70 e0 ldi r23, 0x00 ; 0 39456: 90 e0 ldi r25, 0x00 ; 0 39458: 80 e0 ldi r24, 0x00 ; 0 3945a: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 3945e: 20 e0 ldi r18, 0x00 ; 0 39460: 30 e0 ldi r19, 0x00 ; 0 39462: 48 e0 ldi r20, 0x08 ; 8 39464: 52 e4 ldi r21, 0x42 ; 66 39466: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3946a: 20 e0 ldi r18, 0x00 ; 0 3946c: 30 e0 ldi r19, 0x00 ; 0 3946e: 40 e8 ldi r20, 0x80 ; 128 39470: 5f e3 ldi r21, 0x3F ; 63 39472: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> } 39476: 08 95 ret 00039478 : // 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() { 39478: 2f 92 push r2 3947a: 3f 92 push r3 3947c: 4f 92 push r4 3947e: 5f 92 push r5 39480: 6f 92 push r6 39482: 7f 92 push r7 39484: 8f 92 push r8 39486: 9f 92 push r9 39488: af 92 push r10 3948a: bf 92 push r11 3948c: cf 92 push r12 3948e: df 92 push r13 39490: ef 92 push r14 39492: ff 92 push r15 39494: 0f 93 push r16 39496: 1f 93 push r17 39498: cf 93 push r28 3949a: df 93 push r29 3949c: 00 d0 rcall .+0 ; 0x3949e 3949e: 00 d0 rcall .+0 ; 0x394a0 394a0: cd b7 in r28, 0x3d ; 61 394a2: de b7 in r29, 0x3e ; 62 bool result = false; #ifdef TMC2130 tmc2130_home_enter(Z_AXIS_MASK); 394a4: 84 e0 ldi r24, 0x04 ; 4 394a6: 0f 94 b4 26 call 0x24d68 ; 0x24d68 return hit; } bool enable_endstops(bool check) { bool old = check_endstops; 394aa: 80 91 b7 02 lds r24, 0x02B7 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> 394ae: 8c 83 std Y+4, r24 ; 0x04 check_endstops = check; 394b0: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #endif bool endstops_enabled = enable_endstops(false); bool endstop_z_enabled = enable_z_endstop(false); 394b4: 80 e0 ldi r24, 0x00 ; 0 394b6: 0f 94 a3 4e call 0x29d46 ; 0x29d46 394ba: 8b 83 std Y+3, r24 ; 0x03 // Don't let the manage_inactivity() function remove power from the motors. refresh_cmd_timeout(); 394bc: 0e 94 5b 66 call 0xccb6 ; 0xccb6 #ifdef MESH_BED_CALIBRATION_SHOW_LCD lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1)); 394c0: 85 e1 ldi r24, 0x15 ; 21 394c2: 9b e5 ldi r25, 0x5B ; 91 394c4: 0e 94 44 72 call 0xe488 ; 0xe488 394c8: 0f 94 c0 20 call 0x24180 ; 0x24180 // display "point xx of yy" lcd_puts_at_P(0,3,_n("1/9")); 394cc: 48 e9 ldi r20, 0x98 ; 152 394ce: 50 e7 ldi r21, 0x70 ; 112 394d0: 63 e0 ldi r22, 0x03 ; 3 394d2: 80 e0 ldi r24, 0x00 ; 0 394d4: 0e 94 8c 6e call 0xdd18 ; 0xdd18 394d8: 81 e0 ldi r24, 0x01 ; 1 394da: 80 93 b7 02 sts 0x02B7, r24 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> // 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; 394de: 80 e0 ldi r24, 0x00 ; 0 394e0: 90 e0 ldi r25, 0x00 ; 0 394e2: a0 ea ldi r26, 0xA0 ; 160 394e4: b0 e4 ldi r27, 0x40 ; 64 394e6: 80 93 99 06 sts 0x0699, r24 ; 0x800699 394ea: 90 93 9a 06 sts 0x069A, r25 ; 0x80069a 394ee: a0 93 9b 06 sts 0x069B, r26 ; 0x80069b 394f2: b0 93 9c 06 sts 0x069C, r27 ; 0x80069c go_to_current(homing_feedrate[Z_AXIS]/60); 394f6: 65 e5 ldi r22, 0x55 ; 85 394f8: 75 e5 ldi r23, 0x55 ; 85 394fa: 85 e5 ldi r24, 0x55 ; 85 394fc: 91 e4 ldi r25, 0x41 ; 65 394fe: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a #ifdef TMC2130 check_Z_crash(); 39502: 0e 94 c9 79 call 0xf392 ; 0xf392 39506: 10 92 b7 02 sts 0x02B7, r1 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> #endif enable_endstops(false); // Move XY to first point current_position[X_AXIS] = BED_X0; 3950a: 80 e0 ldi r24, 0x00 ; 0 3950c: 90 e0 ldi r25, 0x00 ; 0 3950e: a0 e8 ldi r26, 0x80 ; 128 39510: bf e3 ldi r27, 0x3F ; 63 39512: 80 93 91 06 sts 0x0691, r24 ; 0x800691 39516: 90 93 92 06 sts 0x0692, r25 ; 0x800692 3951a: a0 93 93 06 sts 0x0693, r26 ; 0x800693 3951e: b0 93 94 06 sts 0x0694, r27 ; 0x800694 current_position[Y_AXIS] = BED_Y0; 39522: 80 93 95 06 sts 0x0695, r24 ; 0x800695 39526: 90 93 96 06 sts 0x0696, r25 ; 0x800696 3952a: a0 93 97 06 sts 0x0697, r26 ; 0x800697 3952e: b0 93 98 06 sts 0x0698, r27 ; 0x800698 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 39532: 65 e9 ldi r22, 0x95 ; 149 39534: 76 e0 ldi r23, 0x06 ; 6 39536: 81 e9 ldi r24, 0x91 ; 145 39538: 96 e0 ldi r25, 0x06 ; 6 3953a: 0e 94 42 6a call 0xd484 ; 0xd484 go_to_current(homing_feedrate[X_AXIS]/60); 3953e: 60 e0 ldi r22, 0x00 ; 0 39540: 70 e0 ldi r23, 0x00 ; 0 39542: 88 e4 ldi r24, 0x48 ; 72 39544: 92 e4 ldi r25, 0x42 ; 66 39546: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a set_destination_to_current(); 3954a: 0e 94 d2 67 call 0xcfa4 ; 0xcfa4 homeaxis(Z_AXIS); 3954e: 50 e0 ldi r21, 0x00 ; 0 39550: 40 e0 ldi r20, 0x00 ; 0 39552: 61 e0 ldi r22, 0x01 ; 1 39554: 82 e0 ldi r24, 0x02 ; 2 39556: 0e 94 03 7a call 0xf406 ; 0xf406 if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um 3955a: 43 e0 ldi r20, 0x03 ; 3 3955c: 60 e0 ldi r22, 0x00 ; 0 3955e: 70 e0 ldi r23, 0x00 ; 0 39560: 80 e2 ldi r24, 0x20 ; 32 39562: 91 ec ldi r25, 0xC1 ; 193 39564: 0f 94 4b 8c call 0x31896 ; 0x31896 39568: 81 11 cpse r24, r1 3956a: 06 c0 rjmp .+12 ; 0x39578 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)); 3956c: 89 ec ldi r24, 0xC9 ; 201 3956e: 93 e6 ldi r25, 0x63 ; 99 39570: 0e 94 44 72 call 0xe488 ; 0xe488 39574: 0e 94 a2 79 call 0xf344 ; 0xf344 float get_z(float x, float y); void set_z(uint8_t ix, uint8_t iy, float z) { z_values[iy][ix] = z; } 39578: 80 91 99 06 lds r24, 0x0699 ; 0x800699 3957c: 90 91 9a 06 lds r25, 0x069A ; 0x80069a 39580: a0 91 9b 06 lds r26, 0x069B ; 0x80069b 39584: b0 91 9c 06 lds r27, 0x069C ; 0x80069c 39588: 80 93 c2 13 sts 0x13C2, r24 ; 0x8013c2 3958c: 90 93 c3 13 sts 0x13C3, r25 ; 0x8013c3 39590: a0 93 c4 13 sts 0x13C4, r26 ; 0x8013c4 39594: b0 93 c5 13 sts 0x13C5, r27 ; 0x8013c5 39598: e2 e0 ldi r30, 0x02 ; 2 3959a: f0 e0 ldi r31, 0x00 ; 0 3959c: fa 83 std Y+2, r31 ; 0x02 3959e: 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; 395a0: c1 2c mov r12, r1 395a2: d1 2c mov r13, r1 395a4: 30 ea ldi r19, 0xA0 ; 160 395a6: e3 2e mov r14, r19 395a8: 30 e4 ldi r19, 0x40 ; 64 395aa: f3 2e mov r15, r19 go_to_current(homing_feedrate[Z_AXIS]/60); uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS; 395ac: 43 e0 ldi r20, 0x03 ; 3 395ae: 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 395b0: 52 e0 ldi r21, 0x02 ; 2 395b2: 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); 395b4: 00 e3 ldi r16, 0x30 ; 48 395b6: 1b ea ldi r17, 0xAB ; 171 395b8: 67 e0 ldi r22, 0x07 ; 7 395ba: 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(); 395bc: 0e 94 5b 66 call 0xccb6 ; 0xccb6 // Print the decrasing ID of the measurement point. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; 395c0: c0 92 99 06 sts 0x0699, r12 ; 0x800699 395c4: d0 92 9a 06 sts 0x069A, r13 ; 0x80069a 395c8: e0 92 9b 06 sts 0x069B, r14 ; 0x80069b 395cc: f0 92 9c 06 sts 0x069C, r15 ; 0x80069c go_to_current(homing_feedrate[Z_AXIS]/60); 395d0: 65 e5 ldi r22, 0x55 ; 85 395d2: 75 e5 ldi r23, 0x55 ; 85 395d4: 85 e5 ldi r24, 0x55 ; 85 395d6: 91 e4 ldi r25, 0x41 ; 65 395d8: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS; 395dc: 29 81 ldd r18, Y+1 ; 0x01 395de: 21 50 subi r18, 0x01 ; 1 395e0: 82 2f mov r24, r18 395e2: 6b 2d mov r22, r11 395e4: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 395e8: 89 2e mov r8, r25 uint8_t iy = mesh_point / MESH_MEAS_NUM_X_POINTS; 395ea: 82 2f mov r24, r18 395ec: 0f 94 cb dc call 0x3b996 ; 0x3b996 <__divmodqi4> 395f0: 78 2e mov r7, r24 if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag 395f2: 80 ff sbrs r24, 0 395f4: 03 c0 rjmp .+6 ; 0x395fc 395f6: f9 2d mov r31, r9 395f8: f8 19 sub r31, r8 395fa: 8f 2e mov r8, r31 current_position[X_AXIS] = BED_X(ix * 3); 395fc: 88 2d mov r24, r8 395fe: 88 0f add r24, r24 39600: 88 0d add r24, r8 39602: 0f 94 29 ca call 0x39452 ; 0x39452 39606: 60 93 91 06 sts 0x0691, r22 ; 0x800691 3960a: 70 93 92 06 sts 0x0692, r23 ; 0x800692 3960e: 80 93 93 06 sts 0x0693, r24 ; 0x800693 39612: 90 93 94 06 sts 0x0694, r25 ; 0x800694 current_position[Y_AXIS] = BED_Y(iy * 3); 39616: 87 2d mov r24, r7 39618: 88 0f add r24, r24 3961a: 87 0d add r24, r7 3961c: 0f 94 29 ca call 0x39452 ; 0x39452 39620: 60 93 95 06 sts 0x0695, r22 ; 0x800695 39624: 70 93 96 06 sts 0x0696, r23 ; 0x800696 39628: 80 93 97 06 sts 0x0697, r24 ; 0x800697 3962c: 90 93 98 06 sts 0x0698, r25 ; 0x800698 world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]); 39630: 65 e9 ldi r22, 0x95 ; 149 39632: 76 e0 ldi r23, 0x06 ; 6 39634: 81 e9 ldi r24, 0x91 ; 145 39636: 96 e0 ldi r25, 0x06 ; 6 39638: 0e 94 42 6a call 0xd484 ; 0xd484 go_to_current(homing_feedrate[X_AXIS]/60); 3963c: 60 e0 ldi r22, 0x00 ; 0 3963e: 70 e0 ldi r23, 0x00 ; 0 39640: 88 e4 ldi r24, 0x48 ; 72 39642: 92 e4 ldi r25, 0x42 ; 66 39644: 0f 94 c5 c5 call 0x38b8a ; 0x38b8a #ifdef MESH_BED_CALIBRATION_SHOW_LCD // display "point xx of yy" lcd_set_cursor(0, 3); 39648: 63 e0 ldi r22, 0x03 ; 3 3964a: 80 e0 ldi r24, 0x00 ; 0 3964c: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_printf_P(PSTR("%d/9"),mesh_point+1); 39650: 8a 81 ldd r24, Y+2 ; 0x02 39652: 8f 93 push r24 39654: 99 81 ldd r25, Y+1 ; 0x01 39656: 9f 93 push r25 39658: 1f 93 push r17 3965a: 0f 93 push r16 3965c: 0e 94 51 6e call 0xdca2 ; 0xdca2 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */ if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um 39660: 43 e0 ldi r20, 0x03 ; 3 39662: 60 e0 ldi r22, 0x00 ; 0 39664: 70 e0 ldi r23, 0x00 ; 0 39666: 80 e2 ldi r24, 0x20 ; 32 39668: 91 ec ldi r25, 0xC1 ; 193 3966a: 0f 94 4b 8c call 0x31896 ; 0x31896 3966e: 58 2e mov r5, r24 39670: 0f 90 pop r0 39672: 0f 90 pop r0 39674: 0f 90 pop r0 39676: 0f 90 pop r0 39678: 88 23 and r24, r24 3967a: 09 f4 brne .+2 ; 0x3967e 3967c: 77 cf rjmp .-274 ; 0x3956c 3967e: a7 9c mul r10, r7 39680: f0 01 movw r30, r0 39682: 11 24 eor r1, r1 39684: e8 0d add r30, r8 39686: f1 1d adc r31, r1 39688: ee 0f add r30, r30 3968a: ff 1f adc r31, r31 3968c: ee 0f add r30, r30 3968e: ff 1f adc r31, r31 39690: ef 53 subi r30, 0x3F ; 63 39692: fc 4e sbci r31, 0xEC ; 236 39694: 80 91 99 06 lds r24, 0x0699 ; 0x800699 39698: 90 91 9a 06 lds r25, 0x069A ; 0x80069a 3969c: a0 91 9b 06 lds r26, 0x069B ; 0x80069b 396a0: b0 91 9c 06 lds r27, 0x069C ; 0x80069c 396a4: 81 83 std Z+1, r24 ; 0x01 396a6: 92 83 std Z+2, r25 ; 0x02 396a8: a3 83 std Z+3, r26 ; 0x03 396aa: b4 83 std Z+4, r27 ; 0x04 396ac: e9 81 ldd r30, Y+1 ; 0x01 396ae: fa 81 ldd r31, Y+2 ; 0x02 396b0: 31 96 adiw r30, 0x01 ; 1 396b2: fa 83 std Y+2, r31 ; 0x02 396b4: 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) { 396b6: 3a 97 sbiw r30, 0x0a ; 10 396b8: 09 f0 breq .+2 ; 0x396bc 396ba: 80 cf rjmp .-256 ; 0x395bc mbl.set_z(ix, iy, current_position[Z_AXIS]); } { // Verify the span of the Z values. float zmin = mbl.z_values[0][0]; 396bc: 60 90 c2 13 lds r6, 0x13C2 ; 0x8013c2 396c0: 70 90 c3 13 lds r7, 0x13C3 ; 0x8013c3 396c4: 80 90 c4 13 lds r8, 0x13C4 ; 0x8013c4 396c8: 90 90 c5 13 lds r9, 0x13C5 ; 0x8013c5 float zmax = zmin; 396cc: 46 2c mov r4, r6 396ce: a7 2c mov r10, r7 396d0: b8 2c mov r11, r8 396d2: 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]; 396d4: 1e 82 std Y+6, r1 ; 0x06 396d6: 1d 82 std Y+5, r1 ; 0x05 396d8: 01 ec ldi r16, 0xC1 ; 193 396da: 13 e1 ldi r17, 0x13 ; 19 396dc: 8d 81 ldd r24, Y+5 ; 0x05 396de: 9e 81 ldd r25, Y+6 ; 0x06 396e0: 8e 53 subi r24, 0x3E ; 62 396e2: 9c 4e sbci r25, 0xEC ; 236 396e4: 9a 83 std Y+2, r25 ; 0x02 396e6: 89 83 std Y+1, r24 ; 0x01 396e8: 93 e0 ldi r25, 0x03 ; 3 396ea: 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]); 396ec: e9 81 ldd r30, Y+1 ; 0x01 396ee: fa 81 ldd r31, Y+2 ; 0x02 396f0: c1 90 ld r12, Z+ 396f2: d1 90 ld r13, Z+ 396f4: e1 90 ld r14, Z+ 396f6: f1 90 ld r15, Z+ 396f8: fa 83 std Y+2, r31 ; 0x02 396fa: e9 83 std Y+1, r30 ; 0x01 396fc: 93 01 movw r18, r6 396fe: a4 01 movw r20, r8 39700: c7 01 movw r24, r14 39702: b6 01 movw r22, r12 39704: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 39708: 18 16 cp r1, r24 3970a: 14 f0 brlt .+4 ; 0x39710 3970c: 36 01 movw r6, r12 3970e: 47 01 movw r8, r14 zmax = max(zmax, mbl.z_values[j][i]); 39710: 24 2d mov r18, r4 39712: 3a 2d mov r19, r10 39714: 4b 2d mov r20, r11 39716: 52 2d mov r21, r2 39718: c7 01 movw r24, r14 3971a: b6 01 movw r22, r12 3971c: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39720: 87 fd sbrc r24, 7 39722: 04 c0 rjmp .+8 ; 0x3972c 39724: 4c 2c mov r4, r12 39726: ad 2c mov r10, r13 39728: be 2c mov r11, r14 3972a: 2f 2c mov r2, r15 3972c: 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) { 3972e: 31 10 cpse r3, r1 39730: dd cf rjmp .-70 ; 0x396ec 39732: 8d 81 ldd r24, Y+5 ; 0x05 39734: 9e 81 ldd r25, Y+6 ; 0x06 39736: 4c 96 adiw r24, 0x1c ; 28 39738: 9e 83 std Y+6, r25 ; 0x06 3973a: 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) 3973c: 84 35 cpi r24, 0x54 ; 84 3973e: 91 05 cpc r25, r1 39740: 59 f6 brne .-106 ; 0x396d8 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) { 39742: 93 01 movw r18, r6 39744: a4 01 movw r20, r8 39746: 64 2d mov r22, r4 39748: 7a 2d mov r23, r10 3974a: 8b 2d mov r24, r11 3974c: 92 2d mov r25, r2 3974e: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 39752: 20 e0 ldi r18, 0x00 ; 0 39754: 30 e0 ldi r19, 0x00 ; 0 39756: 40 e4 ldi r20, 0x40 ; 64 39758: 50 e4 ldi r21, 0x40 ; 64 3975a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 3975e: 18 16 cp r1, r24 39760: 3c f5 brge .+78 ; 0x397b0 // 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!"); 39762: 83 e1 ldi r24, 0x13 ; 19 39764: 9b ea ldi r25, 0xAB ; 171 39766: 0e 94 13 79 call 0xf226 ; 0xf226 // 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; 3976a: 51 2c mov r5, r1 3976c: fc 81 ldd r31, Y+4 ; 0x04 3976e: f0 93 b7 02 sts 0x02B7, r31 ; 0x8002b7 <_ZL14check_endstops.lto_priv.404> go_home_with_z_lift(); result = true; end: enable_endstops(endstops_enabled); enable_z_endstop(endstop_z_enabled); 39772: 8b 81 ldd r24, Y+3 ; 0x03 39774: 0f 94 a3 4e call 0x29d46 ; 0x29d46 #ifdef TMC2130 tmc2130_home_exit(); 39778: 0f 94 85 26 call 0x24d0a ; 0x24d0a #endif return result; } 3977c: 85 2d mov r24, r5 3977e: 26 96 adiw r28, 0x06 ; 6 39780: 0f b6 in r0, 0x3f ; 63 39782: f8 94 cli 39784: de bf out 0x3e, r29 ; 62 39786: 0f be out 0x3f, r0 ; 63 39788: cd bf out 0x3d, r28 ; 61 3978a: df 91 pop r29 3978c: cf 91 pop r28 3978e: 1f 91 pop r17 39790: 0f 91 pop r16 39792: ff 90 pop r15 39794: ef 90 pop r14 39796: df 90 pop r13 39798: cf 90 pop r12 3979a: bf 90 pop r11 3979c: af 90 pop r10 3979e: 9f 90 pop r9 397a0: 8f 90 pop r8 397a2: 7f 90 pop r7 397a4: 6f 90 pop r6 397a6: 5f 90 pop r5 397a8: 4f 90 pop r4 397aa: 3f 90 pop r3 397ac: 2f 90 pop r2 397ae: 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) 397b0: 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; 397b2: 85 ec ldi r24, 0xC5 ; 197 397b4: e8 2e mov r14, r24 397b6: 8f e0 ldi r24, 0x0F ; 15 397b8: f8 2e mov r15, r24 397ba: 68 01 movw r12, r16 for (int8_t j = 0; j < 3; ++ j) for (int8_t i = 0; i < 3; ++ i) { 397bc: 1d 82 std Y+5, r1 ; 0x05 if (i == 0 && j == 0) 397be: 9d 81 ldd r25, Y+5 ; 0x05 397c0: 91 11 cpse r25, r1 397c2: 03 c0 rjmp .+6 ; 0x397ca 397c4: e9 81 ldd r30, Y+1 ; 0x01 397c6: ee 23 and r30, r30 397c8: 29 f1 breq .+74 ; 0x39814 continue; float dif = mbl.z_values[j][i] - mbl.z_values[0][0]; 397ca: 20 91 c2 13 lds r18, 0x13C2 ; 0x8013c2 397ce: 30 91 c3 13 lds r19, 0x13C3 ; 0x8013c3 397d2: 40 91 c4 13 lds r20, 0x13C4 ; 0x8013c4 397d6: 50 91 c5 13 lds r21, 0x13C5 ; 0x8013c5 397da: f6 01 movw r30, r12 397dc: 61 81 ldd r22, Z+1 ; 0x01 397de: 72 81 ldd r23, Z+2 ; 0x02 397e0: 83 81 ldd r24, Z+3 ; 0x03 397e2: 94 81 ldd r25, Z+4 ; 0x04 397e4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> int16_t dif_quantized = int16_t(floor(dif * 100.f + 0.5f)); 397e8: 20 e0 ldi r18, 0x00 ; 0 397ea: 30 e0 ldi r19, 0x00 ; 0 397ec: 48 ec ldi r20, 0xC8 ; 200 397ee: 52 e4 ldi r21, 0x42 ; 66 397f0: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 397f4: 20 e0 ldi r18, 0x00 ; 0 397f6: 30 e0 ldi r19, 0x00 ; 0 397f8: 40 e0 ldi r20, 0x00 ; 0 397fa: 5f e3 ldi r21, 0x3F ; 63 397fc: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 39800: 0f 94 df de call 0x3bdbe ; 0x3bdbe 39804: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> if (previous_value != value) { eeprom_word_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_word(dst, value); 39808: c7 01 movw r24, r14 3980a: 0f 94 52 dc call 0x3b8a4 ; 0x3b8a4 SERIAL_ECHOPGM(", read: "); MYSERIAL.print(dif2, 5); SERIAL_ECHOLNPGM(""); } #endif addr += 2; 3980e: f2 e0 ldi r31, 0x02 ; 2 39810: ef 0e add r14, r31 39812: f1 1c adc r15, r1 39814: 84 e0 ldi r24, 0x04 ; 4 39816: c8 0e add r12, r24 39818: d1 1c adc r13, r1 3981a: 9d 81 ldd r25, Y+5 ; 0x05 3981c: 9f 5f subi r25, 0xFF ; 255 3981e: 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) { 39820: 93 30 cpi r25, 0x03 ; 3 39822: 69 f6 brne .-102 ; 0x397be 39824: 04 5e subi r16, 0xE4 ; 228 39826: 1f 4f sbci r17, 0xFF ; 255 39828: e9 81 ldd r30, Y+1 ; 0x01 3982a: ef 5f subi r30, 0xFF ; 255 3982c: 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) 3982e: e3 30 cpi r30, 0x03 ; 3 39830: 21 f6 brne .-120 ; 0x397ba #endif addr += 2; } } mbl.reset(); 39832: 0f 94 41 8c call 0x31882 ; 0x31882 go_home_with_z_lift(); 39836: 0f 94 ea c9 call 0x393d4 ; 0x393d4 3983a: 98 cf rjmp .-208 ; 0x3976c 0003983c : plan_set_position_curposXYZE(); } static inline void update_current_position_z() { current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); 3983c: 82 e0 ldi r24, 0x02 ; 2 3983e: 0f 94 95 43 call 0x2872a ; 0x2872a 39842: 60 93 99 06 sts 0x0699, r22 ; 0x800699 39846: 70 93 9a 06 sts 0x069A, r23 ; 0x80069a 3984a: 80 93 9b 06 sts 0x069B, r24 ; 0x80069b 3984e: 90 93 9c 06 sts 0x069C, r25 ; 0x80069c plan_set_z_position(current_position[Z_AXIS]); 39852: 89 e9 ldi r24, 0x99 ; 153 39854: 96 e0 ldi r25, 0x06 ; 6 39856: 0d 94 e8 64 jmp 0x2c9d0 ; 0x2c9d0 0003985a : * 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() { 3985a: 4f 92 push r4 3985c: 5f 92 push r5 3985e: 6f 92 push r6 39860: 7f 92 push r7 39862: 8f 92 push r8 39864: 9f 92 push r9 39866: af 92 push r10 39868: bf 92 push r11 3986a: cf 92 push r12 3986c: df 92 push r13 3986e: ef 92 push r14 39870: ff 92 push r15 39872: 0f 93 push r16 39874: 1f 93 push r17 39876: cf 93 push r28 39878: df 93 push r29 float x = current_position[X_AXIS] - world2machine_shift[0]; 3987a: 01 e9 ldi r16, 0x91 ; 145 3987c: 16 e0 ldi r17, 0x06 ; 6 3987e: c6 e0 ldi r28, 0x06 ; 6 39880: d8 e1 ldi r29, 0x18 ; 24 39882: 28 81 ld r18, Y 39884: 39 81 ldd r19, Y+1 ; 0x01 39886: 4a 81 ldd r20, Y+2 ; 0x02 39888: 5b 81 ldd r21, Y+3 ; 0x03 3988a: f8 01 movw r30, r16 3988c: 60 81 ld r22, Z 3988e: 71 81 ldd r23, Z+1 ; 0x01 39890: 82 81 ldd r24, Z+2 ; 0x02 39892: 93 81 ldd r25, Z+3 ; 0x03 39894: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 39898: 4b 01 movw r8, r22 3989a: 5c 01 movw r10, r24 float y = current_position[Y_AXIS] - world2machine_shift[1]; 3989c: 2c 81 ldd r18, Y+4 ; 0x04 3989e: 3d 81 ldd r19, Y+5 ; 0x05 398a0: 4e 81 ldd r20, Y+6 ; 0x06 398a2: 5f 81 ldd r21, Y+7 ; 0x07 398a4: f8 01 movw r30, r16 398a6: 64 81 ldd r22, Z+4 ; 0x04 398a8: 75 81 ldd r23, Z+5 ; 0x05 398aa: 86 81 ldd r24, Z+6 ; 0x06 398ac: 97 81 ldd r25, Z+7 ; 0x07 398ae: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 398b2: 6b 01 movw r12, r22 398b4: 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; 398b6: c6 ef ldi r28, 0xF6 ; 246 398b8: d7 e1 ldi r29, 0x17 ; 23 398ba: 28 81 ld r18, Y 398bc: 39 81 ldd r19, Y+1 ; 0x01 398be: 4a 81 ldd r20, Y+2 ; 0x02 398c0: 5b 81 ldd r21, Y+3 ; 0x03 398c2: c5 01 movw r24, r10 398c4: b4 01 movw r22, r8 398c6: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 398ca: 2b 01 movw r4, r22 398cc: 3c 01 movw r6, r24 398ce: 2c 81 ldd r18, Y+4 ; 0x04 398d0: 3d 81 ldd r19, Y+5 ; 0x05 398d2: 4e 81 ldd r20, Y+6 ; 0x06 398d4: 5f 81 ldd r21, Y+7 ; 0x07 398d6: c7 01 movw r24, r14 398d8: b6 01 movw r22, r12 398da: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 398de: 9b 01 movw r18, r22 398e0: ac 01 movw r20, r24 398e2: c3 01 movw r24, r6 398e4: b2 01 movw r22, r4 398e6: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 398ea: f8 01 movw r30, r16 398ec: 60 83 st Z, r22 398ee: 71 83 std Z+1, r23 ; 0x01 398f0: 82 83 std Z+2, r24 ; 0x02 398f2: 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; 398f4: 28 85 ldd r18, Y+8 ; 0x08 398f6: 39 85 ldd r19, Y+9 ; 0x09 398f8: 4a 85 ldd r20, Y+10 ; 0x0a 398fa: 5b 85 ldd r21, Y+11 ; 0x0b 398fc: c5 01 movw r24, r10 398fe: b4 01 movw r22, r8 39900: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39904: 4b 01 movw r8, r22 39906: 5c 01 movw r10, r24 39908: 2c 85 ldd r18, Y+12 ; 0x0c 3990a: 3d 85 ldd r19, Y+13 ; 0x0d 3990c: 4e 85 ldd r20, Y+14 ; 0x0e 3990e: 5f 85 ldd r21, Y+15 ; 0x0f 39910: c7 01 movw r24, r14 39912: b6 01 movw r22, r12 39914: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39918: 9b 01 movw r18, r22 3991a: ac 01 movw r20, r24 3991c: c5 01 movw r24, r10 3991e: b4 01 movw r22, r8 39920: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 39924: f8 01 movw r30, r16 39926: 64 83 std Z+4, r22 ; 0x04 39928: 75 83 std Z+5, r23 ; 0x05 3992a: 86 83 std Z+6, r24 ; 0x06 3992c: 97 83 std Z+7, r25 ; 0x07 } 3992e: df 91 pop r29 39930: cf 91 pop r28 39932: 1f 91 pop r17 39934: 0f 91 pop r16 39936: ff 90 pop r15 39938: ef 90 pop r14 3993a: df 90 pop r13 3993c: cf 90 pop r12 3993e: bf 90 pop r11 39940: af 90 pop r10 39942: 9f 90 pop r9 39944: 8f 90 pop r8 39946: 7f 90 pop r7 39948: 6f 90 pop r6 3994a: 5f 90 pop r5 3994c: 4f 90 pop r4 3994e: 08 95 ret 00039950 : } return false; } static void world2machine_update(const float vec_x[2], const float vec_y[2], const float cntr[2]) { 39950: 4f 92 push r4 39952: 5f 92 push r5 39954: 6f 92 push r6 39956: 7f 92 push r7 39958: 8f 92 push r8 3995a: 9f 92 push r9 3995c: af 92 push r10 3995e: bf 92 push r11 39960: cf 92 push r12 39962: df 92 push r13 39964: ef 92 push r14 39966: ff 92 push r15 39968: 0f 93 push r16 3996a: 1f 93 push r17 3996c: cf 93 push r28 3996e: df 93 push r29 39970: 00 d0 rcall .+0 ; 0x39972 39972: 00 d0 rcall .+0 ; 0x39974 39974: 1f 92 push r1 39976: 1f 92 push r1 39978: cd b7 in r28, 0x3d ; 61 3997a: de b7 in r29, 0x3e ; 62 world2machine_rotation_and_skew[0][0] = vec_x[0]; 3997c: dc 01 movw r26, r24 3997e: cd 90 ld r12, X+ 39980: dd 90 ld r13, X+ 39982: ed 90 ld r14, X+ 39984: fc 90 ld r15, X 39986: 13 97 sbiw r26, 0x03 ; 3 39988: c0 92 db 17 sts 0x17DB, r12 ; 0x8017db 3998c: d0 92 dc 17 sts 0x17DC, r13 ; 0x8017dc 39990: e0 92 dd 17 sts 0x17DD, r14 ; 0x8017dd 39994: f0 92 de 17 sts 0x17DE, r15 ; 0x8017de world2machine_rotation_and_skew[1][0] = vec_x[1]; 39998: 14 96 adiw r26, 0x04 ; 4 3999a: 0d 91 ld r16, X+ 3999c: 1d 91 ld r17, X+ 3999e: 2d 91 ld r18, X+ 399a0: 3c 91 ld r19, X 399a2: 17 97 sbiw r26, 0x07 ; 7 399a4: 09 83 std Y+1, r16 ; 0x01 399a6: 1a 83 std Y+2, r17 ; 0x02 399a8: 2b 83 std Y+3, r18 ; 0x03 399aa: 3c 83 std Y+4, r19 ; 0x04 399ac: 00 93 e3 17 sts 0x17E3, r16 ; 0x8017e3 399b0: 10 93 e4 17 sts 0x17E4, r17 ; 0x8017e4 399b4: 20 93 e5 17 sts 0x17E5, r18 ; 0x8017e5 399b8: 30 93 e6 17 sts 0x17E6, r19 ; 0x8017e6 world2machine_rotation_and_skew[0][1] = vec_y[0]; 399bc: db 01 movw r26, r22 399be: 0d 91 ld r16, X+ 399c0: 1d 91 ld r17, X+ 399c2: 2d 91 ld r18, X+ 399c4: 3c 91 ld r19, X 399c6: 13 97 sbiw r26, 0x03 ; 3 399c8: 0d 83 std Y+5, r16 ; 0x05 399ca: 1e 83 std Y+6, r17 ; 0x06 399cc: 2f 83 std Y+7, r18 ; 0x07 399ce: 38 87 std Y+8, r19 ; 0x08 399d0: 00 93 df 17 sts 0x17DF, r16 ; 0x8017df 399d4: 10 93 e0 17 sts 0x17E0, r17 ; 0x8017e0 399d8: 20 93 e1 17 sts 0x17E1, r18 ; 0x8017e1 399dc: 30 93 e2 17 sts 0x17E2, r19 ; 0x8017e2 world2machine_rotation_and_skew[1][1] = vec_y[1]; 399e0: 14 96 adiw r26, 0x04 ; 4 399e2: 4d 90 ld r4, X+ 399e4: 5d 90 ld r5, X+ 399e6: 6d 90 ld r6, X+ 399e8: 7c 90 ld r7, X 399ea: 17 97 sbiw r26, 0x07 ; 7 399ec: 40 92 e7 17 sts 0x17E7, r4 ; 0x8017e7 399f0: 50 92 e8 17 sts 0x17E8, r5 ; 0x8017e8 399f4: 60 92 e9 17 sts 0x17E9, r6 ; 0x8017e9 399f8: 70 92 ea 17 sts 0x17EA, r7 ; 0x8017ea world2machine_shift[0] = cntr[0]; 399fc: fa 01 movw r30, r20 399fe: 60 81 ld r22, Z 39a00: 71 81 ldd r23, Z+1 ; 0x01 39a02: 82 81 ldd r24, Z+2 ; 0x02 39a04: 93 81 ldd r25, Z+3 ; 0x03 39a06: 60 93 06 18 sts 0x1806, r22 ; 0x801806 39a0a: 70 93 07 18 sts 0x1807, r23 ; 0x801807 39a0e: 80 93 08 18 sts 0x1808, r24 ; 0x801808 39a12: 90 93 09 18 sts 0x1809, r25 ; 0x801809 world2machine_shift[1] = cntr[1]; 39a16: 84 80 ldd r8, Z+4 ; 0x04 39a18: 95 80 ldd r9, Z+5 ; 0x05 39a1a: a6 80 ldd r10, Z+6 ; 0x06 39a1c: b7 80 ldd r11, Z+7 ; 0x07 39a1e: 80 92 0a 18 sts 0x180A, r8 ; 0x80180a 39a22: 90 92 0b 18 sts 0x180B, r9 ; 0x80180b 39a26: a0 92 0c 18 sts 0x180C, r10 ; 0x80180c 39a2a: b0 92 0d 18 sts 0x180D, r11 ; 0x80180d // No correction. world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE; if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f) 39a2e: 20 e0 ldi r18, 0x00 ; 0 39a30: 30 e0 ldi r19, 0x00 ; 0 39a32: a9 01 movw r20, r18 39a34: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39a38: 81 11 cpse r24, r1 39a3a: aa c0 rjmp .+340 ; 0x39b90 39a3c: 20 e0 ldi r18, 0x00 ; 0 39a3e: 30 e0 ldi r19, 0x00 ; 0 39a40: a9 01 movw r20, r18 39a42: c5 01 movw r24, r10 39a44: b4 01 movw r22, r8 39a46: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39a4a: 81 11 cpse r24, r1 39a4c: a1 c0 rjmp .+322 ; 0x39b90 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; 39a4e: 10 92 0e 18 sts 0x180E, r1 ; 0x80180e 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 || 39a52: 20 e0 ldi r18, 0x00 ; 0 39a54: 30 e0 ldi r19, 0x00 ; 0 39a56: 40 e8 ldi r20, 0x80 ; 128 39a58: 5f e3 ldi r21, 0x3F ; 63 39a5a: c7 01 movw r24, r14 39a5c: b6 01 movw r22, r12 39a5e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39a62: 81 11 cpse r24, r1 39a64: 21 c0 rjmp .+66 ; 0x39aa8 39a66: 20 e0 ldi r18, 0x00 ; 0 39a68: 30 e0 ldi r19, 0x00 ; 0 39a6a: a9 01 movw r20, r18 39a6c: 6d 81 ldd r22, Y+5 ; 0x05 39a6e: 7e 81 ldd r23, Y+6 ; 0x06 39a70: 8f 81 ldd r24, Y+7 ; 0x07 39a72: 98 85 ldd r25, Y+8 ; 0x08 39a74: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39a78: 81 11 cpse r24, r1 39a7a: 16 c0 rjmp .+44 ; 0x39aa8 39a7c: 20 e0 ldi r18, 0x00 ; 0 39a7e: 30 e0 ldi r19, 0x00 ; 0 39a80: a9 01 movw r20, r18 39a82: 69 81 ldd r22, Y+1 ; 0x01 39a84: 7a 81 ldd r23, Y+2 ; 0x02 39a86: 8b 81 ldd r24, Y+3 ; 0x03 39a88: 9c 81 ldd r25, Y+4 ; 0x04 39a8a: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39a8e: 81 11 cpse r24, r1 39a90: 0b c0 rjmp .+22 ; 0x39aa8 world2machine_rotation_and_skew[1][0] != 0.f || world2machine_rotation_and_skew[1][1] != 1.f) { 39a92: 20 e0 ldi r18, 0x00 ; 0 39a94: 30 e0 ldi r19, 0x00 ; 0 39a96: 40 e8 ldi r20, 0x80 ; 128 39a98: 5f e3 ldi r21, 0x3F ; 63 39a9a: c3 01 movw r24, r6 39a9c: b2 01 movw r22, r4 39a9e: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39aa2: 88 23 and r24, r24 39aa4: 09 f4 brne .+2 ; 0x39aa8 39aa6: 78 c0 rjmp .+240 ; 0x39b98 // Rotation & skew correction. world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SKEW; 39aa8: 80 91 0e 18 lds r24, 0x180E ; 0x80180e 39aac: 82 60 ori r24, 0x02 ; 2 39aae: 80 93 0e 18 sts 0x180E, r24 ; 0x80180e // 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]; 39ab2: a3 01 movw r20, r6 39ab4: 92 01 movw r18, r4 39ab6: c7 01 movw r24, r14 39ab8: b6 01 movw r22, r12 39aba: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39abe: 4b 01 movw r8, r22 39ac0: 5c 01 movw r10, r24 39ac2: 2d 81 ldd r18, Y+5 ; 0x05 39ac4: 3e 81 ldd r19, Y+6 ; 0x06 39ac6: 4f 81 ldd r20, Y+7 ; 0x07 39ac8: 58 85 ldd r21, Y+8 ; 0x08 39aca: 69 81 ldd r22, Y+1 ; 0x01 39acc: 7a 81 ldd r23, Y+2 ; 0x02 39ace: 8b 81 ldd r24, Y+3 ; 0x03 39ad0: 9c 81 ldd r25, Y+4 ; 0x04 39ad2: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39ad6: 9b 01 movw r18, r22 39ad8: ac 01 movw r20, r24 39ada: c5 01 movw r24, r10 39adc: b4 01 movw r22, r8 39ade: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 39ae2: 4b 01 movw r8, r22 39ae4: 5c 01 movw r10, r24 world2machine_rotation_and_skew_inv[0][0] = world2machine_rotation_and_skew[1][1] / d; 39ae6: ac 01 movw r20, r24 39ae8: 9b 01 movw r18, r22 39aea: c3 01 movw r24, r6 39aec: b2 01 movw r22, r4 39aee: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 39af2: 60 93 f6 17 sts 0x17F6, r22 ; 0x8017f6 39af6: 70 93 f7 17 sts 0x17F7, r23 ; 0x8017f7 39afa: 80 93 f8 17 sts 0x17F8, r24 ; 0x8017f8 39afe: 90 93 f9 17 sts 0x17F9, r25 ; 0x8017f9 world2machine_rotation_and_skew_inv[0][1] = -world2machine_rotation_and_skew[0][1] / d; 39b02: 6d 81 ldd r22, Y+5 ; 0x05 39b04: 7e 81 ldd r23, Y+6 ; 0x06 39b06: 8f 81 ldd r24, Y+7 ; 0x07 39b08: 98 85 ldd r25, Y+8 ; 0x08 39b0a: 90 58 subi r25, 0x80 ; 128 39b0c: a5 01 movw r20, r10 39b0e: 94 01 movw r18, r8 39b10: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 39b14: 60 93 fa 17 sts 0x17FA, r22 ; 0x8017fa 39b18: 70 93 fb 17 sts 0x17FB, r23 ; 0x8017fb 39b1c: 80 93 fc 17 sts 0x17FC, r24 ; 0x8017fc 39b20: 90 93 fd 17 sts 0x17FD, r25 ; 0x8017fd world2machine_rotation_and_skew_inv[1][0] = -world2machine_rotation_and_skew[1][0] / d; 39b24: 69 81 ldd r22, Y+1 ; 0x01 39b26: 7a 81 ldd r23, Y+2 ; 0x02 39b28: 8b 81 ldd r24, Y+3 ; 0x03 39b2a: 9c 81 ldd r25, Y+4 ; 0x04 39b2c: 90 58 subi r25, 0x80 ; 128 39b2e: a5 01 movw r20, r10 39b30: 94 01 movw r18, r8 39b32: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 39b36: 60 93 fe 17 sts 0x17FE, r22 ; 0x8017fe 39b3a: 70 93 ff 17 sts 0x17FF, r23 ; 0x8017ff 39b3e: 80 93 00 18 sts 0x1800, r24 ; 0x801800 39b42: 90 93 01 18 sts 0x1801, r25 ; 0x801801 world2machine_rotation_and_skew_inv[1][1] = world2machine_rotation_and_skew[0][0] / d; 39b46: a5 01 movw r20, r10 39b48: 94 01 movw r18, r8 39b4a: c7 01 movw r24, r14 39b4c: b6 01 movw r22, r12 39b4e: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__divsf3> 39b52: 60 93 02 18 sts 0x1802, r22 ; 0x801802 39b56: 70 93 03 18 sts 0x1803, r23 ; 0x801803 39b5a: 80 93 04 18 sts 0x1804, r24 ; 0x801804 39b5e: 90 93 05 18 sts 0x1805, r25 ; 0x801805 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; } } 39b62: 28 96 adiw r28, 0x08 ; 8 39b64: 0f b6 in r0, 0x3f ; 63 39b66: f8 94 cli 39b68: de bf out 0x3e, r29 ; 62 39b6a: 0f be out 0x3f, r0 ; 63 39b6c: cd bf out 0x3d, r28 ; 61 39b6e: df 91 pop r29 39b70: cf 91 pop r28 39b72: 1f 91 pop r17 39b74: 0f 91 pop r16 39b76: ff 90 pop r15 39b78: ef 90 pop r14 39b7a: df 90 pop r13 39b7c: cf 90 pop r12 39b7e: bf 90 pop r11 39b80: af 90 pop r10 39b82: 9f 90 pop r9 39b84: 8f 90 pop r8 39b86: 7f 90 pop r7 39b88: 6f 90 pop r6 39b8a: 5f 90 pop r5 39b8c: 4f 90 pop r4 39b8e: 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; 39b90: 81 e0 ldi r24, 0x01 ; 1 39b92: 80 93 0e 18 sts 0x180E, r24 ; 0x80180e 39b96: 5d cf rjmp .-326 ; 0x39a52 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; 39b98: 80 e0 ldi r24, 0x00 ; 0 39b9a: 90 e0 ldi r25, 0x00 ; 0 39b9c: a0 e8 ldi r26, 0x80 ; 128 39b9e: bf e3 ldi r27, 0x3F ; 63 39ba0: 80 93 f6 17 sts 0x17F6, r24 ; 0x8017f6 39ba4: 90 93 f7 17 sts 0x17F7, r25 ; 0x8017f7 39ba8: a0 93 f8 17 sts 0x17F8, r26 ; 0x8017f8 39bac: b0 93 f9 17 sts 0x17F9, r27 ; 0x8017f9 world2machine_rotation_and_skew_inv[0][1] = 0.f; 39bb0: 10 92 fa 17 sts 0x17FA, r1 ; 0x8017fa 39bb4: 10 92 fb 17 sts 0x17FB, r1 ; 0x8017fb 39bb8: 10 92 fc 17 sts 0x17FC, r1 ; 0x8017fc 39bbc: 10 92 fd 17 sts 0x17FD, r1 ; 0x8017fd world2machine_rotation_and_skew_inv[1][0] = 0.f; 39bc0: 10 92 fe 17 sts 0x17FE, r1 ; 0x8017fe 39bc4: 10 92 ff 17 sts 0x17FF, r1 ; 0x8017ff 39bc8: 10 92 00 18 sts 0x1800, r1 ; 0x801800 39bcc: 10 92 01 18 sts 0x1801, r1 ; 0x801801 world2machine_rotation_and_skew_inv[1][1] = 1.f; 39bd0: 80 93 02 18 sts 0x1802, r24 ; 0x801802 39bd4: 90 93 03 18 sts 0x1803, r25 ; 0x801803 39bd8: a0 93 04 18 sts 0x1804, r26 ; 0x801804 39bdc: b0 93 05 18 sts 0x1805, r27 ; 0x801805 39be0: c0 cf rjmp .-128 ; 0x39b62 00039be2 : * * 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() { 39be2: cf 93 push r28 39be4: df 93 push r29 39be6: cd b7 in r28, 0x3d ; 61 39be8: de b7 in r29, 0x3e ; 62 39bea: 68 97 sbiw r28, 0x18 ; 24 39bec: 0f b6 in r0, 0x3f ; 63 39bee: f8 94 cli 39bf0: de bf out 0x3e, r29 ; 62 39bf2: 0f be out 0x3f, r0 ; 63 39bf4: cd bf out 0x3d, r28 ; 61 const float vx[] = { 1.f, 0.f }; 39bf6: 80 e0 ldi r24, 0x00 ; 0 39bf8: 90 e0 ldi r25, 0x00 ; 0 39bfa: a0 e8 ldi r26, 0x80 ; 128 39bfc: bf e3 ldi r27, 0x3F ; 63 39bfe: 89 83 std Y+1, r24 ; 0x01 39c00: 9a 83 std Y+2, r25 ; 0x02 39c02: ab 83 std Y+3, r26 ; 0x03 39c04: bc 83 std Y+4, r27 ; 0x04 39c06: 1d 82 std Y+5, r1 ; 0x05 39c08: 1e 82 std Y+6, r1 ; 0x06 39c0a: 1f 82 std Y+7, r1 ; 0x07 39c0c: 18 86 std Y+8, r1 ; 0x08 const float vy[] = { 0.f, 1.f }; 39c0e: 19 86 std Y+9, r1 ; 0x09 39c10: 1a 86 std Y+10, r1 ; 0x0a 39c12: 1b 86 std Y+11, r1 ; 0x0b 39c14: 1c 86 std Y+12, r1 ; 0x0c 39c16: 8d 87 std Y+13, r24 ; 0x0d 39c18: 9e 87 std Y+14, r25 ; 0x0e 39c1a: af 87 std Y+15, r26 ; 0x0f 39c1c: b8 8b std Y+16, r27 ; 0x10 const float cntr[] = { 0.f, 0.f }; 39c1e: 19 8a std Y+17, r1 ; 0x11 39c20: 1a 8a std Y+18, r1 ; 0x12 39c22: 1b 8a std Y+19, r1 ; 0x13 39c24: 1c 8a std Y+20, r1 ; 0x14 39c26: 1d 8a std Y+21, r1 ; 0x15 39c28: 1e 8a std Y+22, r1 ; 0x16 39c2a: 1f 8a std Y+23, r1 ; 0x17 39c2c: 18 8e std Y+24, r1 ; 0x18 world2machine_update(vx, vy, cntr); 39c2e: ae 01 movw r20, r28 39c30: 4f 5e subi r20, 0xEF ; 239 39c32: 5f 4f sbci r21, 0xFF ; 255 39c34: be 01 movw r22, r28 39c36: 67 5f subi r22, 0xF7 ; 247 39c38: 7f 4f sbci r23, 0xFF ; 255 39c3a: ce 01 movw r24, r28 39c3c: 01 96 adiw r24, 0x01 ; 1 39c3e: 0f 94 a8 cc call 0x39950 ; 0x39950 } 39c42: 68 96 adiw r28, 0x18 ; 24 39c44: 0f b6 in r0, 0x3f ; 63 39c46: f8 94 cli 39c48: de bf out 0x3e, r29 ; 62 39c4a: 0f be out 0x3f, r0 ; 63 39c4c: cd bf out 0x3d, r28 ; 61 39c4e: df 91 pop r29 39c50: cf 91 pop r28 39c52: 08 95 ret 00039c54 : * * 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) { 39c54: 80 91 0e 18 lds r24, 0x180E ; 0x80180e 39c58: 88 23 and r24, r24 39c5a: d1 f0 breq .+52 ; 0x39c90 world2machine_reset(); 39c5c: 0f 94 f1 cd call 0x39be2 ; 0x39be2 st_synchronize(); 39c60: 0f 94 a9 43 call 0x28752 ; 0x28752 current_position[X_AXIS] = st_get_position_mm(X_AXIS); 39c64: 80 e0 ldi r24, 0x00 ; 0 39c66: 0f 94 95 43 call 0x2872a ; 0x2872a 39c6a: 60 93 91 06 sts 0x0691, r22 ; 0x800691 39c6e: 70 93 92 06 sts 0x0692, r23 ; 0x800692 39c72: 80 93 93 06 sts 0x0693, r24 ; 0x800693 39c76: 90 93 94 06 sts 0x0694, r25 ; 0x800694 current_position[Y_AXIS] = st_get_position_mm(Y_AXIS); 39c7a: 81 e0 ldi r24, 0x01 ; 1 39c7c: 0f 94 95 43 call 0x2872a ; 0x2872a 39c80: 60 93 95 06 sts 0x0695, r22 ; 0x800695 39c84: 70 93 96 06 sts 0x0696, r23 ; 0x800696 39c88: 80 93 97 06 sts 0x0697, r24 ; 0x800697 39c8c: 90 93 98 06 sts 0x0698, r25 ; 0x800698 } } 39c90: 08 95 ret 00039c92 : if (previous_value != value) { eeprom_dword_notify(dst, previous_value, value, false); } } #endif //DEBUG_EEPROM_CHANGES eeprom_update_dword(dst, value); 39c92: 4f ef ldi r20, 0xFF ; 255 39c94: 5f ef ldi r21, 0xFF ; 255 39c96: ba 01 movw r22, r20 39c98: 85 ee ldi r24, 0xE5 ; 229 39c9a: 9f e0 ldi r25, 0x0F ; 15 39c9c: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39ca0: 4f ef ldi r20, 0xFF ; 255 39ca2: 5f ef ldi r21, 0xFF ; 255 39ca4: ba 01 movw r22, r20 39ca6: 89 ee ldi r24, 0xE9 ; 233 39ca8: 9f e0 ldi r25, 0x0F ; 15 39caa: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39cae: 4f ef ldi r20, 0xFF ; 255 39cb0: 5f ef ldi r21, 0xFF ; 255 39cb2: ba 01 movw r22, r20 39cb4: 8d ed ldi r24, 0xDD ; 221 39cb6: 9f e0 ldi r25, 0x0F ; 15 39cb8: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39cbc: 4f ef ldi r20, 0xFF ; 255 39cbe: 5f ef ldi r21, 0xFF ; 255 39cc0: ba 01 movw r22, r20 39cc2: 81 ee ldi r24, 0xE1 ; 225 39cc4: 9f e0 ldi r25, 0x0F ; 15 39cc6: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39cca: 4f ef ldi r20, 0xFF ; 255 39ccc: 5f ef ldi r21, 0xFF ; 255 39cce: ba 01 movw r22, r20 39cd0: 85 ed ldi r24, 0xD5 ; 213 39cd2: 9f e0 ldi r25, 0x0F ; 15 39cd4: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39cd8: 4f ef ldi r20, 0xFF ; 255 39cda: 5f ef ldi r21, 0xFF ; 255 39cdc: ba 01 movw r22, r20 39cde: 89 ed ldi r24, 0xD9 ; 217 39ce0: 9f e0 ldi r25, 0x0F ; 15 39ce2: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39ce6: 4f ef ldi r20, 0xFF ; 255 39ce8: 5f ef ldi r21, 0xFF ; 255 39cea: ba 01 movw r22, r20 39cec: 85 ec ldi r24, 0xC5 ; 197 39cee: 9f e0 ldi r25, 0x0F ; 15 39cf0: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39cf4: 4f ef ldi r20, 0xFF ; 255 39cf6: 5f ef ldi r21, 0xFF ; 255 39cf8: ba 01 movw r22, r20 39cfa: 89 ec ldi r24, 0xC9 ; 201 39cfc: 9f e0 ldi r25, 0x0F ; 15 39cfe: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39d02: 4f ef ldi r20, 0xFF ; 255 39d04: 5f ef ldi r21, 0xFF ; 255 39d06: ba 01 movw r22, r20 39d08: 8d ec ldi r24, 0xCD ; 205 39d0a: 9f e0 ldi r25, 0x0F ; 15 39d0c: 0f 94 46 dc call 0x3b88c ; 0x3b88c 39d10: 4f ef ldi r20, 0xFF ; 255 39d12: 5f ef ldi r21, 0xFF ; 255 39d14: ba 01 movw r22, r20 39d16: 81 ed ldi r24, 0xD1 ; 209 39d18: 9f e0 ldi r25, 0x0F ; 15 39d1a: 0d 94 46 dc jmp 0x3b88c ; 0x3b88c 00039d1e : /** * @brief Read and apply validated calibration data from EEPROM */ void world2machine_initialize() { 39d1e: 4f 92 push r4 39d20: 5f 92 push r5 39d22: 6f 92 push r6 39d24: 7f 92 push r7 39d26: 8f 92 push r8 39d28: 9f 92 push r9 39d2a: af 92 push r10 39d2c: bf 92 push r11 39d2e: cf 92 push r12 39d30: df 92 push r13 39d32: ef 92 push r14 39d34: ff 92 push r15 39d36: 1f 93 push r17 39d38: cf 93 push r28 39d3a: df 93 push r29 39d3c: cd b7 in r28, 0x3d ; 61 39d3e: de b7 in r29, 0x3e ; 62 39d40: a8 97 sbiw r28, 0x28 ; 40 39d42: 0f b6 in r0, 0x3f ; 63 39d44: f8 94 cli 39d46: de bf out 0x3e, r29 ; 62 39d48: 0f be out 0x3f, r0 ; 63 39d4a: 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); 39d4c: 48 e0 ldi r20, 0x08 ; 8 39d4e: 50 e0 ldi r21, 0x00 ; 0 39d50: 6d ed ldi r22, 0xDD ; 221 39d52: 7f e0 ldi r23, 0x0F ; 15 39d54: ce 01 movw r24, r28 39d56: 01 96 adiw r24, 0x01 ; 1 39d58: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8); 39d5c: 48 e0 ldi r20, 0x08 ; 8 39d5e: 50 e0 ldi r21, 0x00 ; 0 39d60: 65 ed ldi r22, 0xD5 ; 213 39d62: 7f e0 ldi r23, 0x0F ; 15 39d64: ce 01 movw r24, r28 39d66: 09 96 adiw r24, 0x09 ; 9 39d68: 0f 94 00 dc call 0x3b800 ; 0x3b800 eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8); 39d6c: 48 e0 ldi r20, 0x08 ; 8 39d6e: 50 e0 ldi r21, 0x00 ; 0 39d70: 65 ee ldi r22, 0xE5 ; 229 39d72: 7f e0 ldi r23, 0x0F ; 15 39d74: ce 01 movw r24, r28 39d76: 41 96 adiw r24, 0x11 ; 17 39d78: 0f 94 00 dc call 0x3b800 ; 0x3b800 } static inline bool vec_undef(const float v[2]) { const uint32_t *vx = (const uint32_t*)v; return vx[0] == 0xFFFFFFFF || vx[1] == 0xFFFFFFFF; 39d7c: 89 89 ldd r24, Y+17 ; 0x11 39d7e: 9a 89 ldd r25, Y+18 ; 0x12 39d80: ab 89 ldd r26, Y+19 ; 0x13 39d82: bc 89 ldd r27, Y+20 ; 0x14 39d84: 89 a3 std Y+33, r24 ; 0x21 39d86: 9a a3 std Y+34, r25 ; 0x22 39d88: ab a3 std Y+35, r26 ; 0x23 39d8a: bc a3 std Y+36, r27 ; 0x24 39d8c: 8f 3f cpi r24, 0xFF ; 255 39d8e: 9f 4f sbci r25, 0xFF ; 255 39d90: af 4f sbci r26, 0xFF ; 255 39d92: bf 4f sbci r27, 0xFF ; 255 39d94: 09 f4 brne .+2 ; 0x39d98 39d96: b1 c0 rjmp .+354 ; 0x39efa 39d98: 8d 89 ldd r24, Y+21 ; 0x15 39d9a: 9e 89 ldd r25, Y+22 ; 0x16 39d9c: af 89 ldd r26, Y+23 ; 0x17 39d9e: b8 8d ldd r27, Y+24 ; 0x18 39da0: 8d a3 std Y+37, r24 ; 0x25 39da2: 9e a3 std Y+38, r25 ; 0x26 39da4: af a3 std Y+39, r26 ; 0x27 39da6: b8 a7 std Y+40, r27 ; 0x28 39da8: 8f 3f cpi r24, 0xFF ; 255 39daa: 9f 4f sbci r25, 0xFF ; 255 39dac: af 4f sbci r26, 0xFF ; 255 39dae: bf 4f sbci r27, 0xFF ; 255 39db0: 09 f4 brne .+2 ; 0x39db4 39db2: a3 c0 rjmp .+326 ; 0x39efa 39db4: 89 80 ldd r8, Y+1 ; 0x01 39db6: 9a 80 ldd r9, Y+2 ; 0x02 39db8: ab 80 ldd r10, Y+3 ; 0x03 39dba: bc 80 ldd r11, Y+4 ; 0x04 39dbc: 8f ef ldi r24, 0xFF ; 255 39dbe: 88 16 cp r8, r24 39dc0: 98 06 cpc r9, r24 39dc2: a8 06 cpc r10, r24 39dc4: b8 06 cpc r11, r24 39dc6: 09 f4 brne .+2 ; 0x39dca 39dc8: 98 c0 rjmp .+304 ; 0x39efa 39dca: 8d 81 ldd r24, Y+5 ; 0x05 39dcc: 9e 81 ldd r25, Y+6 ; 0x06 39dce: af 81 ldd r26, Y+7 ; 0x07 39dd0: b8 85 ldd r27, Y+8 ; 0x08 39dd2: 89 8f std Y+25, r24 ; 0x19 39dd4: 9a 8f std Y+26, r25 ; 0x1a 39dd6: ab 8f std Y+27, r26 ; 0x1b 39dd8: bc 8f std Y+28, r27 ; 0x1c 39dda: 8f 3f cpi r24, 0xFF ; 255 39ddc: 9f 4f sbci r25, 0xFF ; 255 39dde: af 4f sbci r26, 0xFF ; 255 39de0: bf 4f sbci r27, 0xFF ; 255 39de2: 09 f4 brne .+2 ; 0x39de6 39de4: 8a c0 rjmp .+276 ; 0x39efa 39de6: c9 84 ldd r12, Y+9 ; 0x09 39de8: da 84 ldd r13, Y+10 ; 0x0a 39dea: eb 84 ldd r14, Y+11 ; 0x0b 39dec: fc 84 ldd r15, Y+12 ; 0x0c 39dee: 8f ef ldi r24, 0xFF ; 255 39df0: c8 16 cp r12, r24 39df2: d8 06 cpc r13, r24 39df4: e8 06 cpc r14, r24 39df6: f8 06 cpc r15, r24 39df8: 09 f4 brne .+2 ; 0x39dfc 39dfa: 7f c0 rjmp .+254 ; 0x39efa 39dfc: 8d 85 ldd r24, Y+13 ; 0x0d 39dfe: 9e 85 ldd r25, Y+14 ; 0x0e 39e00: af 85 ldd r26, Y+15 ; 0x0f 39e02: b8 89 ldd r27, Y+16 ; 0x10 39e04: 8d 8f std Y+29, r24 ; 0x1d 39e06: 9e 8f std Y+30, r25 ; 0x1e 39e08: af 8f std Y+31, r26 ; 0x1f 39e0a: b8 a3 std Y+32, r27 ; 0x20 39e0c: 8f 3f cpi r24, 0xFF ; 255 39e0e: 9f 4f sbci r25, 0xFF ; 255 39e10: af 4f sbci r26, 0xFF ; 255 39e12: bf 4f sbci r27, 0xFF ; 255 39e14: 09 f4 brne .+2 ; 0x39e18 39e16: 71 c0 rjmp .+226 ; 0x39efa reset = true; } else { // Length of the vec_x shall be close to unity. float l = hypot(vec_x[0], vec_x[1]); 39e18: 29 8d ldd r18, Y+25 ; 0x19 39e1a: 3a 8d ldd r19, Y+26 ; 0x1a 39e1c: 4b 8d ldd r20, Y+27 ; 0x1b 39e1e: 5c 8d ldd r21, Y+28 ; 0x1c 39e20: c5 01 movw r24, r10 39e22: b4 01 movw r22, r8 39e24: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 39e28: 2b 01 movw r4, r22 39e2a: 3c 01 movw r6, r24 if (l < 0.9 || l > 1.1) 39e2c: 26 e6 ldi r18, 0x66 ; 102 39e2e: 36 e6 ldi r19, 0x66 ; 102 39e30: 46 e6 ldi r20, 0x66 ; 102 39e32: 5f e3 ldi r21, 0x3F ; 63 39e34: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__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; 39e38: 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) 39e3a: 87 fd sbrc r24, 7 39e3c: 0b c0 rjmp .+22 ; 0x39e54 39e3e: 2d ec ldi r18, 0xCD ; 205 39e40: 3c ec ldi r19, 0xCC ; 204 39e42: 4c e8 ldi r20, 0x8C ; 140 39e44: 5f e3 ldi r21, 0x3F ; 63 39e46: c3 01 movw r24, r6 39e48: b2 01 movw r22, r4 39e4a: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 39e4e: 18 16 cp r1, r24 39e50: 0c f0 brlt .+2 ; 0x39e54 39e52: 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]); 39e54: 2d 8d ldd r18, Y+29 ; 0x1d 39e56: 3e 8d ldd r19, Y+30 ; 0x1e 39e58: 4f 8d ldd r20, Y+31 ; 0x1f 39e5a: 58 a1 ldd r21, Y+32 ; 0x20 39e5c: c7 01 movw r24, r14 39e5e: b6 01 movw r22, r12 39e60: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 39e64: 2b 01 movw r4, r22 39e66: 3c 01 movw r6, r24 if (l < 0.9 || l > 1.1) 39e68: 26 e6 ldi r18, 0x66 ; 102 39e6a: 36 e6 ldi r19, 0x66 ; 102 39e6c: 46 e6 ldi r20, 0x66 ; 102 39e6e: 5f e3 ldi r21, 0x3F ; 63 39e70: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 39e74: 87 fd sbrc r24, 7 39e76: 7f c0 rjmp .+254 ; 0x39f76 39e78: 2d ec ldi r18, 0xCD ; 205 39e7a: 3c ec ldi r19, 0xCC ; 204 39e7c: 4c e8 ldi r20, 0x8C ; 140 39e7e: 5f e3 ldi r21, 0x3F ; 63 39e80: c3 01 movw r24, r6 39e82: b2 01 movw r22, r4 39e84: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 39e88: 18 16 cp r1, r24 39e8a: 0c f4 brge .+2 ; 0x39e8e 39e8c: 74 c0 rjmp .+232 ; 0x39f76 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]); 39e8e: 2d a1 ldd r18, Y+37 ; 0x25 39e90: 3e a1 ldd r19, Y+38 ; 0x26 39e92: 4f a1 ldd r20, Y+39 ; 0x27 39e94: 58 a5 ldd r21, Y+40 ; 0x28 39e96: 69 a1 ldd r22, Y+33 ; 0x21 39e98: 7a a1 ldd r23, Y+34 ; 0x22 39e9a: 8b a1 ldd r24, Y+35 ; 0x23 39e9c: 9c a1 ldd r25, Y+36 ; 0x24 39e9e: 0f 94 d4 df call 0x3bfa8 ; 0x3bfa8 if (l > 15.f) 39ea2: 20 e0 ldi r18, 0x00 ; 0 39ea4: 30 e0 ldi r19, 0x00 ; 0 39ea6: 40 e7 ldi r20, 0x70 ; 112 39ea8: 51 e4 ldi r21, 0x41 ; 65 39eaa: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 39eae: 18 16 cp r1, r24 39eb0: 0c f4 brge .+2 ; 0x39eb4 #if 0 SERIAL_ECHOLNPGM("Zero point correction:"); MYSERIAL.println(l); SERIAL_ECHOLNPGM("Invalid bed correction matrix. Shift out of range."); #endif reset = true; 39eb2: 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]; 39eb4: a5 01 movw r20, r10 39eb6: 94 01 movw r18, r8 39eb8: c7 01 movw r24, r14 39eba: b6 01 movw r22, r12 39ebc: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39ec0: 6b 01 movw r12, r22 39ec2: 7c 01 movw r14, r24 39ec4: 2d 8d ldd r18, Y+29 ; 0x1d 39ec6: 3e 8d ldd r19, Y+30 ; 0x1e 39ec8: 4f 8d ldd r20, Y+31 ; 0x1f 39eca: 58 a1 ldd r21, Y+32 ; 0x20 39ecc: 69 8d ldd r22, Y+25 ; 0x19 39ece: 7a 8d ldd r23, Y+26 ; 0x1a 39ed0: 8b 8d ldd r24, Y+27 ; 0x1b 39ed2: 9c 8d ldd r25, Y+28 ; 0x1c 39ed4: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 39ed8: 9b 01 movw r18, r22 39eda: ac 01 movw r20, r24 39edc: c7 01 movw r24, r14 39ede: b6 01 movw r22, r12 39ee0: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> if (fabs(l) > 0.1f) 39ee4: 9f 77 andi r25, 0x7F ; 127 39ee6: 2d ec ldi r18, 0xCD ; 205 39ee8: 3c ec ldi r19, 0xCC ; 204 39eea: 4c ec ldi r20, 0xCC ; 204 39eec: 5d e3 ldi r21, 0x3D ; 61 39eee: 0f 94 c1 df call 0x3bf82 ; 0x3bf82 <__gesf2> 39ef2: 18 16 cp r1, r24 39ef4: 14 f0 brlt .+4 ; 0x39efa #endif reset = true; } } if (reset) 39ef6: 11 23 and r17, r17 39ef8: f1 f0 breq .+60 ; 0x39f36 { #if 0 SERIAL_ECHOLNPGM("Invalid bed correction matrix. Resetting to identity."); #endif reset_bed_offset_and_skew(); 39efa: 0f 94 49 ce call 0x39c92 ; 0x39c92 * @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; 39efe: 80 e0 ldi r24, 0x00 ; 0 39f00: 90 e0 ldi r25, 0x00 ; 0 39f02: a0 e8 ldi r26, 0x80 ; 128 39f04: bf e3 ldi r27, 0x3F ; 63 39f06: 89 83 std Y+1, r24 ; 0x01 39f08: 9a 83 std Y+2, r25 ; 0x02 39f0a: ab 83 std Y+3, r26 ; 0x03 39f0c: bc 83 std Y+4, r27 ; 0x04 vec_x[1] = 0.f; 39f0e: 1d 82 std Y+5, r1 ; 0x05 39f10: 1e 82 std Y+6, r1 ; 0x06 39f12: 1f 82 std Y+7, r1 ; 0x07 39f14: 18 86 std Y+8, r1 ; 0x08 vec_y[0] = 0.f; 39f16: 19 86 std Y+9, r1 ; 0x09 39f18: 1a 86 std Y+10, r1 ; 0x0a 39f1a: 1b 86 std Y+11, r1 ; 0x0b 39f1c: 1c 86 std Y+12, r1 ; 0x0c vec_y[1] = 1.f; 39f1e: 8d 87 std Y+13, r24 ; 0x0d 39f20: 9e 87 std Y+14, r25 ; 0x0e 39f22: af 87 std Y+15, r26 ; 0x0f 39f24: b8 8b std Y+16, r27 ; 0x10 cntr[0] = 0.f; 39f26: 19 8a std Y+17, r1 ; 0x11 39f28: 1a 8a std Y+18, r1 ; 0x12 39f2a: 1b 8a std Y+19, r1 ; 0x13 39f2c: 1c 8a std Y+20, r1 ; 0x14 #ifdef DEFAULT_Y_OFFSET cntr[1] = DEFAULT_Y_OFFSET; #else cntr[1] = 0.f; 39f2e: 1d 8a std Y+21, r1 ; 0x15 39f30: 1e 8a std Y+22, r1 ; 0x16 39f32: 1f 8a std Y+23, r1 ; 0x17 39f34: 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); 39f36: ae 01 movw r20, r28 39f38: 4f 5e subi r20, 0xEF ; 239 39f3a: 5f 4f sbci r21, 0xFF ; 255 39f3c: be 01 movw r22, r28 39f3e: 67 5f subi r22, 0xF7 ; 247 39f40: 7f 4f sbci r23, 0xFF ; 255 39f42: ce 01 movw r24, r28 39f44: 01 96 adiw r24, 0x01 ; 1 39f46: 0f 94 a8 cc call 0x39950 ; 0x39950 MYSERIAL.print(world2machine_shift[0], 5); SERIAL_ECHOPGM(", "); MYSERIAL.print(world2machine_shift[1], 5); SERIAL_ECHOLNPGM(""); #endif } 39f4a: a8 96 adiw r28, 0x28 ; 40 39f4c: 0f b6 in r0, 0x3f ; 63 39f4e: f8 94 cli 39f50: de bf out 0x3e, r29 ; 62 39f52: 0f be out 0x3f, r0 ; 63 39f54: cd bf out 0x3d, r28 ; 61 39f56: df 91 pop r29 39f58: cf 91 pop r28 39f5a: 1f 91 pop r17 39f5c: ff 90 pop r15 39f5e: ef 90 pop r14 39f60: df 90 pop r13 39f62: cf 90 pop r12 39f64: bf 90 pop r11 39f66: af 90 pop r10 39f68: 9f 90 pop r9 39f6a: 8f 90 pop r8 39f6c: 7f 90 pop r7 39f6e: 6f 90 pop r6 39f70: 5f 90 pop r5 39f72: 4f 90 pop r4 39f74: 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; 39f76: 11 e0 ldi r17, 0x01 ; 1 39f78: 8a cf rjmp .-236 ; 0x39e8e 00039f7a : lcd_print_pad_P(title, LCD_WIDTH); lcd_set_cursor(0, 2); } void menu_progressbar_update(uint16_t newVal) { 39f7a: cf 93 push r28 uint8_t newCnt = (newVal * LCD_WIDTH) / progressbar_total; 39f7c: 24 e1 ldi r18, 0x14 ; 20 39f7e: ac 01 movw r20, r24 39f80: 24 9f mul r18, r20 39f82: c0 01 movw r24, r0 39f84: 25 9f mul r18, r21 39f86: 90 0d add r25, r0 39f88: 11 24 eor r1, r1 39f8a: 60 91 d9 17 lds r22, 0x17D9 ; 0x8017d9 39f8e: 70 91 da 17 lds r23, 0x17DA ; 0x8017da 39f92: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 39f96: c6 2f mov r28, r22 39f98: 65 31 cpi r22, 0x15 ; 21 39f9a: 08 f0 brcs .+2 ; 0x39f9e 39f9c: c4 e1 ldi r28, 0x14 ; 20 if (newCnt > LCD_WIDTH) newCnt = LCD_WIDTH; while (newCnt > progressbar_block_count) 39f9e: 80 91 d8 17 lds r24, 0x17D8 ; 0x8017d8 39fa2: 8c 17 cp r24, r28 39fa4: 48 f4 brcc .+18 ; 0x39fb8 } void lcd_print(long n, int base) { if (base == 0) lcd_write(n); 39fa6: 8f ef ldi r24, 0xFF ; 255 39fa8: 0e 94 27 6f call 0xde4e ; 0xde4e { lcd_print(LCD_STR_SOLID_BLOCK[0]); progressbar_block_count++; 39fac: 80 91 d8 17 lds r24, 0x17D8 ; 0x8017d8 39fb0: 8f 5f subi r24, 0xFF ; 255 39fb2: 80 93 d8 17 sts 0x17D8, r24 ; 0x8017d8 39fb6: f3 cf rjmp .-26 ; 0x39f9e } } 39fb8: cf 91 pop r28 39fba: 08 95 ret 00039fbc : void menu_progressbar_finish(void) { progressbar_total = 1; 39fbc: 81 e0 ldi r24, 0x01 ; 1 39fbe: 90 e0 ldi r25, 0x00 ; 0 39fc0: 90 93 da 17 sts 0x17DA, r25 ; 0x8017da 39fc4: 80 93 d9 17 sts 0x17D9, r24 ; 0x8017d9 menu_progressbar_update(1); 39fc8: 0f 94 bd cf call 0x39f7a ; 0x39f7a _delay(300); 39fcc: 6c e2 ldi r22, 0x2C ; 44 39fce: 71 e0 ldi r23, 0x01 ; 1 39fd0: 80 e0 ldi r24, 0x00 ; 0 39fd2: 90 e0 ldi r25, 0x00 ; 0 39fd4: 0d 94 2f 28 jmp 0x2505e ; 0x2505e 00039fd8 : } static uint8_t progressbar_block_count = 0; static uint16_t progressbar_total = 0; void menu_progressbar_init(uint16_t total, const char* title) { 39fd8: 0f 93 push r16 39fda: 1f 93 push r17 39fdc: cf 93 push r28 39fde: df 93 push r29 39fe0: 8c 01 movw r16, r24 39fe2: eb 01 movw r28, r22 lcd_clear(); 39fe4: 0e 94 ab 6e call 0xdd56 ; 0xdd56 progressbar_block_count = 0; 39fe8: 10 92 d8 17 sts 0x17D8, r1 ; 0x8017d8 progressbar_total = total; 39fec: 10 93 da 17 sts 0x17DA, r17 ; 0x8017da 39ff0: 00 93 d9 17 sts 0x17D9, r16 ; 0x8017d9 lcd_set_cursor(0, 1); 39ff4: 61 e0 ldi r22, 0x01 ; 1 39ff6: 80 e0 ldi r24, 0x00 ; 0 39ff8: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 lcd_print_pad_P(title, LCD_WIDTH); 39ffc: 64 e1 ldi r22, 0x14 ; 20 39ffe: ce 01 movw r24, r28 3a000: 0e 94 4d 70 call 0xe09a ; 0xe09a lcd_set_cursor(0, 2); 3a004: 62 e0 ldi r22, 0x02 ; 2 3a006: 80 e0 ldi r24, 0x00 ; 0 } 3a008: df 91 pop r29 3a00a: cf 91 pop r28 3a00c: 1f 91 pop r17 3a00e: 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); 3a010: 0c 94 78 6e jmp 0xdcf0 ; 0xdcf0 0003a014 : } menu_item++; } bool __attribute__((noinline)) menu_item_leave(){ return ((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving; 3a014: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a018: 90 91 13 05 lds r25, 0x0513 ; 0x800513 3a01c: 89 13 cpse r24, r25 3a01e: 0b c0 rjmp .+22 ; 0x3a036 3a020: 90 91 12 05 lds r25, 0x0512 ; 0x800512 3a024: 99 23 and r25, r25 3a026: 39 f0 breq .+14 ; 0x3a036 3a028: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 3a02c: 30 91 70 06 lds r19, 0x0670 ; 0x800670 3a030: 82 17 cp r24, r18 3a032: 13 06 cpc r1, r19 3a034: 39 f0 breq .+14 ; 0x3a044 3a036: 81 e0 ldi r24, 0x01 ; 1 3a038: 90 91 d5 03 lds r25, 0x03D5 ; 0x8003d5 3a03c: 91 11 cpse r25, r1 3a03e: 03 c0 rjmp .+6 ; 0x3a046 3a040: 80 e0 ldi r24, 0x00 ; 0 3a042: 08 95 ret 3a044: 81 e0 ldi r24, 0x01 ; 1 } 3a046: 08 95 ret 0003a048 : //! @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) { 3a048: 0f 93 push r16 3a04a: 1f 93 push r17 3a04c: cf 93 push r28 3a04e: df 93 push r29 3a050: 8c 01 movw r16, r24 3a052: eb 01 movw r28, r22 uint_least8_t index = sprintf_P(buffer.c, PSTR("%.10S "), _T(MSG_SHEET)); 3a054: 8b e0 ldi r24, 0x0B ; 11 3a056: 9d e4 ldi r25, 0x4D ; 77 3a058: 0e 94 44 72 call 0xe488 ; 0xe488 3a05c: 9f 93 push r25 3a05e: 8f 93 push r24 3a060: 88 e0 ldi r24, 0x08 ; 8 3a062: 9b ea ldi r25, 0xAB ; 171 3a064: 9f 93 push r25 3a066: 8f 93 push r24 3a068: df 93 push r29 3a06a: cf 93 push r28 3a06c: 0f 94 27 db call 0x3b64e ; 0x3b64e eeprom_read_block(&(buffer.c[index]), sheet_E.name, 7); 3a070: c8 0f add r28, r24 3a072: d1 1d adc r29, r1 3a074: 47 e0 ldi r20, 0x07 ; 7 3a076: 50 e0 ldi r21, 0x00 ; 0 3a078: b8 01 movw r22, r16 3a07a: ce 01 movw r24, r28 3a07c: 0f 94 00 dc call 0x3b800 ; 0x3b800 //index += 7; buffer.c[index + 7] = '\0'; 3a080: 1f 82 std Y+7, r1 ; 0x07 3a082: 0f 90 pop r0 3a084: 0f 90 pop r0 3a086: 0f 90 pop r0 3a088: 0f 90 pop r0 3a08a: 0f 90 pop r0 3a08c: 0f 90 pop r0 } 3a08e: df 91 pop r29 3a090: cf 91 pop r28 3a092: 1f 91 pop r17 3a094: 0f 91 pop r16 3a096: 08 95 ret 0003a098 : 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)?'>':' '; 3a098: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a09c: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a0a0: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a0a4: 28 17 cp r18, r24 3a0a6: 19 06 cpc r1, r25 3a0a8: 11 f0 breq .+4 ; 0x3a0ae 3a0aa: 80 e2 ldi r24, 0x20 ; 32 3a0ac: 08 95 ret 3a0ae: 8e e3 ldi r24, 0x3E ; 62 } 3a0b0: 08 95 ret 0003a0b2 : static void menu_draw_item_puts_P(char type_char, const char* str) { 3a0b2: 0f 93 push r16 3a0b4: 1f 93 push r17 3a0b6: cf 93 push r28 3a0b8: c8 2f mov r28, r24 3a0ba: 8b 01 movw r16, r22 lcd_putc_at(0, menu_row, menu_selection_mark()); 3a0bc: 0f 94 4c d0 call 0x3a098 ; 0x3a098 3a0c0: 48 2f mov r20, r24 3a0c2: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a0c6: 80 e0 ldi r24, 0x00 ; 0 3a0c8: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_print_pad_P(str, LCD_WIDTH - 2); 3a0cc: 62 e1 ldi r22, 0x12 ; 18 3a0ce: c8 01 movw r24, r16 3a0d0: 0e 94 4d 70 call 0xe09a ; 0xe09a lcd_putc(type_char); 3a0d4: 8c 2f mov r24, r28 } 3a0d6: cf 91 pop r28 3a0d8: 1f 91 pop r17 3a0da: 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); 3a0dc: 0c 94 67 6e jmp 0xdcce ; 0xdcce 0003a0e0 : } } void menu_item_ret(void) { lcd_draw_update = 2; 3a0e0: 82 e0 ldi r24, 0x02 ; 2 3a0e2: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d menu_item++; 3a0e6: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a0ea: 8f 5f subi r24, 0xFF ; 255 3a0ec: 80 93 14 05 sts 0x0514, r24 ; 0x800514 //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 3a0f0: 84 e0 ldi r24, 0x04 ; 4 3a0f2: 80 93 11 05 sts 0x0511, r24 ; 0x800511 menu_line = 0; // prevent subsequent menu items from rendering at all in the current MENU_BEGIN() for loop cycle 3a0f6: 10 92 13 05 sts 0x0513, r1 ; 0x800513 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 3a0fa: 10 92 12 05 sts 0x0512, r1 ; 0x800512 } 3a0fe: 08 95 ret 0003a100 : } menu_item++; } void menu_item_gcode_P(const char* str, const char* str_gcode) { 3a100: cf 93 push r28 3a102: df 93 push r29 if (menu_item == menu_line) 3a104: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a108: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a10c: 32 13 cpse r19, r18 3a10e: 20 c0 rjmp .+64 ; 0x3a150 3a110: eb 01 movw r28, r22 3a112: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); 3a114: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a118: 88 23 and r24, r24 3a11a: 19 f0 breq .+6 ; 0x3a122 3a11c: 80 e2 ldi r24, 0x20 ; 32 3a11e: 0f 94 59 d0 call 0x3a0b2 ; 0x3a0b2 if (menu_clicked && (lcd_encoder == menu_item)) 3a122: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a126: 88 23 and r24, r24 3a128: 99 f0 breq .+38 ; 0x3a150 3a12a: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a12e: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a132: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a136: 28 17 cp r18, r24 3a138: 19 06 cpc r1, r25 3a13a: 51 f4 brne .+20 ; 0x3a150 { if (str_gcode) enquecommand_P(str_gcode); 3a13c: 20 97 sbiw r28, 0x00 ; 0 3a13e: 21 f0 breq .+8 ; 0x3a148 3a140: 61 e0 ldi r22, 0x01 ; 1 3a142: ce 01 movw r24, r28 3a144: 0e 94 b8 87 call 0x10f70 ; 0x10f70 menu_item_ret(); return; } } menu_item++; } 3a148: df 91 pop r29 3a14a: 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(); 3a14c: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; 3a150: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a154: 8f 5f subi r24, 0xFF ; 255 3a156: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a15a: df 91 pop r29 3a15c: cf 91 pop r28 3a15e: 08 95 ret 0003a160 : //! @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) { 3a160: ef 92 push r14 3a162: ff 92 push r15 3a164: 0f 93 push r16 3a166: 1f 93 push r17 3a168: cf 93 push r28 3a16a: df 93 push r29 if (menu_item == menu_line) 3a16c: 70 91 14 05 lds r23, 0x0514 ; 0x800514 3a170: 30 91 13 05 lds r19, 0x0513 ; 0x800513 3a174: 73 13 cpse r23, r19 3a176: 3f c0 rjmp .+126 ; 0x3a1f6 3a178: 12 2f mov r17, r18 3a17a: ea 01 movw r28, r20 3a17c: 06 2f mov r16, r22 3a17e: 7c 01 movw r14, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number); 3a180: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a184: 88 23 and r24, r24 3a186: d1 f0 breq .+52 ; 0x3a1bc } 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()); 3a188: 0f 94 4c d0 call 0x3a098 ; 0x3a098 3a18c: 48 2f mov r20, r24 3a18e: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a192: 80 e0 ldi r24, 0x00 ; 0 3a194: 0e 94 98 6e call 0xdd30 ; 0xdd30 uint8_t len = lcd_print_pad_P(str, max_strlen); 3a198: 61 e1 ldi r22, 0x11 ; 17 3a19a: c7 01 movw r24, r14 3a19c: 0e 94 4d 70 call 0xe09a ; 0xe09a lcd_putc_at((max_strlen - len) + 2, menu_row, num); 3a1a0: 40 2f mov r20, r16 3a1a2: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a1a6: 93 e1 ldi r25, 0x13 ; 19 3a1a8: 98 1b sub r25, r24 3a1aa: 89 2f mov r24, r25 3a1ac: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char); 3a1b0: 40 e2 ldi r20, 0x20 ; 32 3a1b2: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a1b6: 83 e1 ldi r24, 0x13 ; 19 3a1b8: 0e 94 98 6e call 0xdd30 ; 0xdd30 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)) 3a1bc: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a1c0: 88 23 and r24, r24 3a1c2: c9 f0 breq .+50 ; 0x3a1f6 3a1c4: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a1c8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a1cc: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a1d0: 28 17 cp r18, r24 3a1d2: 19 06 cpc r1, r25 3a1d4: 81 f4 brne .+32 ; 0x3a1f6 { lcd_update_enabled = 0; 3a1d6: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e if (func) func(fn_par); 3a1da: 81 2f mov r24, r17 3a1dc: fe 01 movw r30, r28 3a1de: 19 95 eicall lcd_update_enabled = 1; 3a1e0: 81 e0 ldi r24, 0x01 ; 1 3a1e2: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e menu_item_ret(); return; } } menu_item++; } 3a1e6: df 91 pop r29 3a1e8: cf 91 pop r28 3a1ea: 1f 91 pop r17 3a1ec: 0f 91 pop r16 3a1ee: ff 90 pop r15 3a1f0: 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(); 3a1f2: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; 3a1f6: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a1fa: 8f 5f subi r24, 0xFF ; 255 3a1fc: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a200: df 91 pop r29 3a202: cf 91 pop r28 3a204: 1f 91 pop r17 3a206: 0f 91 pop r16 3a208: ff 90 pop r15 3a20a: ef 90 pop r14 3a20c: 08 95 ret 0003a20e : 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) { 3a20e: cf 93 push r28 3a210: df 93 push r29 if (menu_item == menu_line) 3a212: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a216: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a21a: 32 13 cpse r19, r18 3a21c: 21 c0 rjmp .+66 ; 0x3a260 3a21e: eb 01 movw r28, r22 3a220: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); 3a222: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a226: 88 23 and r24, r24 3a228: 19 f0 breq .+6 ; 0x3a230 3a22a: 80 e2 ldi r24, 0x20 ; 32 3a22c: 0f 94 59 d0 call 0x3a0b2 ; 0x3a0b2 if (menu_clicked && (lcd_encoder == menu_item)) 3a230: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a234: 88 23 and r24, r24 3a236: a1 f0 breq .+40 ; 0x3a260 3a238: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a23c: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a240: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a244: 28 17 cp r18, r24 3a246: 19 06 cpc r1, r25 3a248: 59 f4 brne .+22 ; 0x3a260 { lcd_update_enabled = 0; 3a24a: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e if (func) func(); 3a24e: fe 01 movw r30, r28 3a250: 19 95 eicall lcd_update_enabled = 1; 3a252: 81 e0 ldi r24, 0x01 ; 1 3a254: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e menu_item_ret(); return; } } menu_item++; } 3a258: df 91 pop r29 3a25a: 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(); 3a25c: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; 3a260: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a264: 8f 5f subi r24, 0xFF ; 255 3a266: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a26a: df 91 pop r29 3a26c: cf 91 pop r28 3a26e: 08 95 ret 0003a270 : menu_item++; } uint8_t menu_item_text_P(const char* str) { if (menu_item == menu_line) 3a270: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a274: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a278: 32 13 cpse r19, r18 3a27a: 19 c0 rjmp .+50 ; 0x3a2ae 3a27c: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(' ', str); 3a27e: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a282: 88 23 and r24, r24 3a284: 19 f0 breq .+6 ; 0x3a28c 3a286: 80 e2 ldi r24, 0x20 ; 32 3a288: 0f 94 59 d0 call 0x3a0b2 ; 0x3a0b2 if (menu_clicked && (lcd_encoder == menu_item)) 3a28c: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a290: 88 23 and r24, r24 3a292: 69 f0 breq .+26 ; 0x3a2ae 3a294: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a298: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a29c: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a2a0: 28 17 cp r18, r24 3a2a2: 19 06 cpc r1, r25 3a2a4: 21 f4 brne .+8 ; 0x3a2ae { menu_item_ret(); 3a2a6: 0f 94 70 d0 call 0x3a0e0 ; 0x3a0e0 return 1; 3a2aa: 81 e0 ldi r24, 0x01 ; 1 3a2ac: 08 95 ret } } menu_item++; 3a2ae: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a2b2: 8f 5f subi r24, 0xFF ; 255 3a2b4: 80 93 14 05 sts 0x0514, r24 ; 0x800514 return 0; 3a2b8: 80 e0 ldi r24, 0x00 ; 0 } 3a2ba: 08 95 ret 0003a2bc : menu_clicked = lcd_clicked(); // Consume click event } void menu_end(void) { if (menu_row >= LCD_HEIGHT) 3a2bc: 80 91 11 05 lds r24, 0x0511 ; 0x800511 3a2c0: 84 30 cpi r24, 0x04 ; 4 3a2c2: 38 f5 brcc .+78 ; 0x3a312 { // Early abort if the menu was clicked. The current menu might have changed because of the click event return; } if (lcd_encoder >= menu_item) 3a2c4: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a2c8: 90 e0 ldi r25, 0x00 ; 0 3a2ca: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 3a2ce: 30 91 70 06 lds r19, 0x0670 ; 0x800670 3a2d2: 28 17 cp r18, r24 3a2d4: 39 07 cpc r19, r25 3a2d6: 44 f0 brlt .+16 ; 0x3a2e8 { lcd_encoder = menu_item - 1; 3a2d8: 01 97 sbiw r24, 0x01 ; 1 3a2da: 90 93 70 06 sts 0x0670, r25 ; 0x800670 3a2de: 80 93 6f 06 sts 0x066F, r24 ; 0x80066f Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 3a2e2: 87 e0 ldi r24, 0x07 ; 7 3a2e4: 0f 94 c8 4e call 0x29d90 ; 0x29d90 } if (((uint8_t)lcd_encoder) >= menu_top + LCD_HEIGHT) 3a2e8: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a2ec: 20 91 a3 03 lds r18, 0x03A3 ; 0x8003a3 3a2f0: 30 e0 ldi r19, 0x00 ; 0 3a2f2: 2d 5f subi r18, 0xFD ; 253 3a2f4: 3f 4f sbci r19, 0xFF ; 255 3a2f6: 82 17 cp r24, r18 3a2f8: 13 06 cpc r1, r19 3a2fa: 59 f0 breq .+22 ; 0x3a312 3a2fc: 54 f0 brlt .+20 ; 0x3a312 { menu_top = lcd_encoder - LCD_HEIGHT + 1; 3a2fe: 9d ef ldi r25, 0xFD ; 253 3a300: 98 0f add r25, r24 3a302: 90 93 a3 03 sts 0x03A3, r25 ; 0x8003a3 menu_line = menu_top - 1; 3a306: 84 50 subi r24, 0x04 ; 4 3a308: 80 93 13 05 sts 0x0513, r24 ; 0x800513 menu_row = -1; 3a30c: 8f ef ldi r24, 0xFF ; 255 3a30e: 80 93 11 05 sts 0x0511, r24 ; 0x800511 } } 3a312: 08 95 ret 0003a314 : CRITICAL_SECTION_END; } void menu_start(void) { if (lcd_encoder < 0) 3a314: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a318: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a31c: 97 ff sbrs r25, 7 3a31e: 07 c0 rjmp .+14 ; 0x3a32e { lcd_encoder = 0; 3a320: 10 92 70 06 sts 0x0670, r1 ; 0x800670 3a324: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f Sound_MakeSound(e_SOUND_TYPE_BlindAlert); 3a328: 87 e0 ldi r24, 0x07 ; 7 3a32a: 0f 94 c8 4e call 0x29d90 ; 0x29d90 } if (lcd_encoder < menu_top) 3a32e: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a332: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a336: 20 91 a3 03 lds r18, 0x03A3 ; 0x8003a3 3a33a: 28 17 cp r18, r24 3a33c: 19 06 cpc r1, r25 3a33e: 19 f0 breq .+6 ; 0x3a346 3a340: 14 f0 brlt .+4 ; 0x3a346 menu_top = lcd_encoder; 3a342: 80 93 a3 03 sts 0x03A3, r24 ; 0x8003a3 menu_line = menu_top; 3a346: 80 91 a3 03 lds r24, 0x03A3 ; 0x8003a3 3a34a: 80 93 13 05 sts 0x0513, r24 ; 0x800513 menu_clicked = lcd_clicked(); // Consume click event 3a34e: 0e 94 95 70 call 0xe12a ; 0xe12a 3a352: 80 93 12 05 sts 0x0512, r24 ; 0x800512 } 3a356: 08 95 ret 0003a358 : 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)); 3a358: e7 ea ldi r30, 0xA7 ; 167 3a35a: f3 e0 ldi r31, 0x03 ; 3 3a35c: 80 e2 ldi r24, 0x20 ; 32 3a35e: df 01 movw r26, r30 3a360: 1d 92 st X+, r1 3a362: 8a 95 dec r24 3a364: e9 f7 brne .-6 ; 0x3a360 } 3a366: 08 95 ret 0003a368 : void menu_goto(menu_func_t menu, const int16_t encoder, bool reset_menu_state, const bool feedback) { 3a368: cf 93 push r28 CRITICAL_SECTION_START; 3a36a: 3f b7 in r19, 0x3f ; 63 3a36c: f8 94 cli if (menu_menu != menu) 3a36e: e0 91 12 04 lds r30, 0x0412 ; 0x800412 3a372: f0 91 13 04 lds r31, 0x0413 ; 0x800413 3a376: e8 17 cp r30, r24 3a378: f9 07 cpc r31, r25 3a37a: c9 f0 breq .+50 ; 0x3a3ae 3a37c: c4 2f mov r28, r20 { menu_menu = menu; 3a37e: 90 93 13 04 sts 0x0413, r25 ; 0x800413 3a382: 80 93 12 04 sts 0x0412, r24 ; 0x800412 lcd_encoder = encoder; 3a386: 70 93 70 06 sts 0x0670, r23 ; 0x800670 3a38a: 60 93 6f 06 sts 0x066F, r22 ; 0x80066f menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support 3a38e: 10 92 a3 03 sts 0x03A3, r1 ; 0x8003a3 lcd_draw_update = 2; // Full LCD re-draw 3a392: 82 e0 ldi r24, 0x02 ; 2 3a394: 80 93 6d 02 sts 0x026D, r24 ; 0x80026d CRITICAL_SECTION_END; 3a398: 3f bf out 0x3f, r19 ; 63 if (feedback) lcd_beeper_quick_feedback(); 3a39a: 22 23 and r18, r18 3a39c: 19 f0 breq .+6 ; 0x3a3a4 } return clicked; } void lcd_beeper_quick_feedback(void) { Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); 3a39e: 80 e0 ldi r24, 0x00 ; 0 3a3a0: 0f 94 c8 4e call 0x29d90 ; 0x29d90 if (reset_menu_state) menu_data_reset(); 3a3a4: cc 23 and r28, r28 3a3a6: 21 f0 breq .+8 ; 0x3a3b0 } else CRITICAL_SECTION_END; } 3a3a8: 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(); 3a3aa: 0d 94 ac d1 jmp 0x3a358 ; 0x3a358 } else CRITICAL_SECTION_END; 3a3ae: 3f bf out 0x3f, r19 ; 63 } 3a3b0: cf 91 pop r28 3a3b2: 08 95 ret 0003a3b4 : 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) { 3a3b4: 7f 92 push r7 3a3b6: 8f 92 push r8 3a3b8: 9f 92 push r9 3a3ba: af 92 push r10 3a3bc: bf 92 push r11 3a3be: cf 92 push r12 3a3c0: df 92 push r13 3a3c2: ef 92 push r14 3a3c4: ff 92 push r15 3a3c6: 0f 93 push r16 3a3c8: 1f 93 push r17 3a3ca: cf 93 push r28 3a3cc: df 93 push r29 menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (menu_item == menu_line) 3a3ce: e0 91 14 05 lds r30, 0x0514 ; 0x800514 3a3d2: 50 91 13 05 lds r21, 0x0513 ; 0x800513 3a3d6: e5 13 cpse r30, r21 3a3d8: 73 c0 rjmp .+230 ; 0x3a4c0 { int16_t cur_val = (pbits == 8 ? *((uint8_t*)pval) : *((int16_t*)pval)); 3a3da: fb 01 movw r30, r22 3a3dc: 48 30 cpi r20, 0x08 ; 8 3a3de: 09 f0 breq .+2 ; 0x3a3e2 3a3e0: 6c c0 rjmp .+216 ; 0x3a4ba 3a3e2: c0 81 ld r28, Z 3a3e4: d0 e0 ldi r29, 0x00 ; 0 3a3e6: 49 01 movw r8, r18 3a3e8: 74 2e mov r7, r20 3a3ea: 6b 01 movw r12, r22 3a3ec: 5c 01 movw r10, r24 if (lcd_draw_update) 3a3ee: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a3f2: 88 23 and r24, r24 3a3f4: 59 f0 breq .+22 ; 0x3a40c { lcd_set_cursor(0, menu_row); 3a3f6: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a3fa: 80 e0 ldi r24, 0x00 ; 0 3a3fc: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 menu_draw_P(menu_selection_mark(), str, cur_val); 3a400: 0f 94 4c d0 call 0x3a098 ; 0x3a098 3a404: ae 01 movw r20, r28 3a406: b5 01 movw r22, r10 3a408: 0f 94 c0 b0 call 0x36180 ; 0x36180 } if (menu_clicked && (lcd_encoder == menu_item)) 3a40c: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a410: 88 23 and r24, r24 3a412: 09 f4 brne .+2 ; 0x3a416 3a414: 55 c0 rjmp .+170 ; 0x3a4c0 3a416: 90 91 14 05 lds r25, 0x0514 ; 0x800514 3a41a: 20 91 6f 06 lds r18, 0x066F ; 0x80066f 3a41e: 30 91 70 06 lds r19, 0x0670 ; 0x800670 3a422: 92 17 cp r25, r18 3a424: 13 06 cpc r1, r19 3a426: 09 f0 breq .+2 ; 0x3a42a 3a428: 4b c0 rjmp .+150 ; 0x3a4c0 } } void menu_submenu_no_reset(menu_func_t submenu, const bool feedback) { if (menu_depth < MENU_DEPTH_MAX) 3a42a: 80 91 f7 03 lds r24, 0x03F7 ; 0x8003f7 3a42e: 87 30 cpi r24, 0x07 ; 7 3a430: d8 f4 brcc .+54 ; 0x3a468 { menu_stack[menu_depth].menu = menu_menu; 3a432: 28 2f mov r18, r24 3a434: 30 e0 ldi r19, 0x00 ; 0 3a436: f9 01 movw r30, r18 3a438: ee 0f add r30, r30 3a43a: ff 1f adc r31, r31 3a43c: e2 0f add r30, r18 3a43e: f3 1f adc r31, r19 3a440: ed 53 subi r30, 0x3D ; 61 3a442: f8 4e sbci r31, 0xE8 ; 232 3a444: 20 91 12 04 lds r18, 0x0412 ; 0x800412 3a448: 30 91 13 04 lds r19, 0x0413 ; 0x800413 3a44c: 31 83 std Z+1, r19 ; 0x01 3a44e: 20 83 st Z, r18 menu_stack[menu_depth++].position = lcd_encoder; 3a450: 8f 5f subi r24, 0xFF ; 255 3a452: 80 93 f7 03 sts 0x03F7, r24 ; 0x8003f7 3a456: 92 83 std Z+2, r25 ; 0x02 menu_goto(submenu, 0, false, feedback); 3a458: 20 e0 ldi r18, 0x00 ; 0 3a45a: 40 e0 ldi r20, 0x00 ; 0 3a45c: 70 e0 ldi r23, 0x00 ; 0 3a45e: 60 e0 ldi r22, 0x00 ; 0 3a460: 82 e6 ldi r24, 0x62 ; 98 3a462: 9a e3 ldi r25, 0x3A ; 58 3a464: 0f 94 b4 d1 call 0x3a368 ; 0x3a368 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; 3a468: b0 92 a8 03 sts 0x03A8, r11 ; 0x8003a8 3a46c: a0 92 a7 03 sts 0x03A7, r10 ; 0x8003a7 _md->editValuePtr = pval; 3a470: d0 92 ab 03 sts 0x03AB, r13 ; 0x8003ab 3a474: c0 92 aa 03 sts 0x03AA, r12 ; 0x8003aa _md->editValueBits = pbits; 3a478: 70 92 a9 03 sts 0x03A9, r7 ; 0x8003a9 _md->currentValue = cur_val; 3a47c: d0 93 ad 03 sts 0x03AD, r29 ; 0x8003ad 3a480: c0 93 ac 03 sts 0x03AC, r28 ; 0x8003ac _md->minEditValue = min_val; 3a484: 90 92 af 03 sts 0x03AF, r9 ; 0x8003af 3a488: 80 92 ae 03 sts 0x03AE, r8 ; 0x8003ae _md->maxEditValue = max_val; 3a48c: 10 93 b1 03 sts 0x03B1, r17 ; 0x8003b1 3a490: 00 93 b0 03 sts 0x03B0, r16 ; 0x8003b0 _md->minJumpValue = jmp_val; 3a494: f0 92 b3 03 sts 0x03B3, r15 ; 0x8003b3 3a498: e0 92 b2 03 sts 0x03B2, r14 ; 0x8003b2 menu_item_ret(); return; } } menu_item++; } 3a49c: df 91 pop r29 3a49e: cf 91 pop r28 3a4a0: 1f 91 pop r17 3a4a2: 0f 91 pop r16 3a4a4: ff 90 pop r15 3a4a6: ef 90 pop r14 3a4a8: df 90 pop r13 3a4aa: cf 90 pop r12 3a4ac: bf 90 pop r11 3a4ae: af 90 pop r10 3a4b0: 9f 90 pop r9 3a4b2: 8f 90 pop r8 3a4b4: 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(); 3a4b6: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 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)); 3a4ba: c0 81 ld r28, Z 3a4bc: d1 81 ldd r29, Z+1 ; 0x01 3a4be: 93 cf rjmp .-218 ; 0x3a3e6 _md->minJumpValue = jmp_val; menu_item_ret(); return; } } menu_item++; 3a4c0: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a4c4: 8f 5f subi r24, 0xFF ; 255 3a4c6: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a4ca: df 91 pop r29 3a4cc: cf 91 pop r28 3a4ce: 1f 91 pop r17 3a4d0: 0f 91 pop r16 3a4d2: ff 90 pop r15 3a4d4: ef 90 pop r14 3a4d6: df 90 pop r13 3a4d8: cf 90 pop r12 3a4da: bf 90 pop r11 3a4dc: af 90 pop r10 3a4de: 9f 90 pop r9 3a4e0: 8f 90 pop r8 3a4e2: 7f 90 pop r7 3a4e4: 08 95 ret 0003a4e6 <_menu_edit_P()>: } static void _menu_edit_P() { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (lcd_draw_update) 3a4e6: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a4ea: 88 23 and r24, r24 3a4ec: 09 f4 brne .+2 ; 0x3a4f0 <_menu_edit_P()+0xa> 3a4ee: 52 c0 rjmp .+164 ; 0x3a594 <_menu_edit_P()+0xae> { // handle initial value jumping if (_md->minJumpValue && lcd_encoder) { 3a4f0: 20 91 b2 03 lds r18, 0x03B2 ; 0x8003b2 3a4f4: 30 91 b3 03 lds r19, 0x03B3 ; 0x8003b3 3a4f8: 80 91 ae 03 lds r24, 0x03AE ; 0x8003ae 3a4fc: 90 91 af 03 lds r25, 0x03AF ; 0x8003af 3a500: 21 15 cp r18, r1 3a502: 31 05 cpc r19, r1 3a504: d9 f0 breq .+54 ; 0x3a53c <_menu_edit_P()+0x56> 3a506: 40 91 6f 06 lds r20, 0x066F ; 0x80066f 3a50a: 50 91 70 06 lds r21, 0x0670 ; 0x800670 3a50e: 41 15 cp r20, r1 3a510: 51 05 cpc r21, r1 3a512: a1 f0 breq .+40 ; 0x3a53c <_menu_edit_P()+0x56> if (lcd_encoder > 0 && _md->currentValue == _md->minEditValue) { 3a514: 7c f0 brlt .+30 ; 0x3a534 <_menu_edit_P()+0x4e> 3a516: 40 91 ac 03 lds r20, 0x03AC ; 0x8003ac 3a51a: 50 91 ad 03 lds r21, 0x03AD ; 0x8003ad 3a51e: 48 17 cp r20, r24 3a520: 59 07 cpc r21, r25 3a522: 41 f4 brne .+16 ; 0x3a534 <_menu_edit_P()+0x4e> _md->currentValue = _md->minJumpValue; 3a524: 30 93 ad 03 sts 0x03AD, r19 ; 0x8003ad 3a528: 20 93 ac 03 sts 0x03AC, r18 ; 0x8003ac lcd_encoder = 0; 3a52c: 10 92 70 06 sts 0x0670, r1 ; 0x800670 3a530: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f } // disable after first use and/or if the initial value is not minEditValue _md->minJumpValue = 0; 3a534: 10 92 b3 03 sts 0x03B3, r1 ; 0x8003b3 3a538: 10 92 b2 03 sts 0x03B2, r1 ; 0x8003b2 } _md->currentValue += lcd_encoder; 3a53c: 20 91 ac 03 lds r18, 0x03AC ; 0x8003ac 3a540: 30 91 ad 03 lds r19, 0x03AD ; 0x8003ad 3a544: 40 91 6f 06 lds r20, 0x066F ; 0x80066f 3a548: 50 91 70 06 lds r21, 0x0670 ; 0x800670 3a54c: 24 0f add r18, r20 3a54e: 35 1f adc r19, r21 lcd_encoder = 0; // Consume knob rotation event 3a550: 10 92 70 06 sts 0x0670, r1 ; 0x800670 3a554: 10 92 6f 06 sts 0x066F, r1 ; 0x80066f // Constrain the value in case it's outside the allowed limits _md->currentValue = constrain(_md->currentValue, _md->minEditValue, _md->maxEditValue); 3a558: 28 17 cp r18, r24 3a55a: 39 07 cpc r19, r25 3a55c: 44 f0 brlt .+16 ; 0x3a56e <_menu_edit_P()+0x88> 3a55e: 80 91 b0 03 lds r24, 0x03B0 ; 0x8003b0 3a562: 90 91 b1 03 lds r25, 0x03B1 ; 0x8003b1 3a566: 28 17 cp r18, r24 3a568: 39 07 cpc r19, r25 3a56a: 0c f4 brge .+2 ; 0x3a56e <_menu_edit_P()+0x88> 3a56c: c9 01 movw r24, r18 3a56e: 90 93 ad 03 sts 0x03AD, r25 ; 0x8003ad 3a572: 80 93 ac 03 sts 0x03AC, r24 ; 0x8003ac lcd_set_cursor(0, 1); 3a576: 61 e0 ldi r22, 0x01 ; 1 3a578: 80 e0 ldi r24, 0x00 ; 0 3a57a: 0e 94 78 6e call 0xdcf0 ; 0xdcf0 menu_draw_P(' ', _md->editLabel, _md->currentValue); 3a57e: 40 91 ac 03 lds r20, 0x03AC ; 0x8003ac 3a582: 50 91 ad 03 lds r21, 0x03AD ; 0x8003ad 3a586: 60 91 a7 03 lds r22, 0x03A7 ; 0x8003a7 3a58a: 70 91 a8 03 lds r23, 0x03A8 ; 0x8003a8 3a58e: 80 e2 ldi r24, 0x20 ; 32 3a590: 0f 94 c0 b0 call 0x36180 ; 0x36180 } if (lcd_clicked()) 3a594: 0e 94 95 70 call 0xe12a ; 0xe12a 3a598: 88 23 and r24, r24 3a59a: 41 f1 breq .+80 ; 0x3a5ec <_menu_edit_P()+0x106> 3a59c: e0 91 aa 03 lds r30, 0x03AA ; 0x8003aa 3a5a0: f0 91 ab 03 lds r31, 0x03AB ; 0x8003ab 3a5a4: 80 91 ac 03 lds r24, 0x03AC ; 0x8003ac 3a5a8: 90 91 ad 03 lds r25, 0x03AD ; 0x8003ad { if (_md->editValueBits == 8) 3a5ac: 20 91 a9 03 lds r18, 0x03A9 ; 0x8003a9 *((uint8_t*)(_md->editValuePtr)) = _md->currentValue; 3a5b0: 80 83 st Z, r24 lcd_set_cursor(0, 1); menu_draw_P(' ', _md->editLabel, _md->currentValue); } if (lcd_clicked()) { if (_md->editValueBits == 8) 3a5b2: 28 30 cpi r18, 0x08 ; 8 3a5b4: c9 f4 brne .+50 ; 0x3a5e8 <_menu_edit_P()+0x102> menu_back(1); } void menu_back_no_reset(void) { if (menu_depth > 0) 3a5b6: 80 91 f7 03 lds r24, 0x03F7 ; 0x8003f7 3a5ba: 88 23 and r24, r24 3a5bc: b9 f0 breq .+46 ; 0x3a5ec <_menu_edit_P()+0x106> { menu_depth--; 3a5be: 81 50 subi r24, 0x01 ; 1 3a5c0: 80 93 f7 03 sts 0x03F7, r24 ; 0x8003f7 menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, false); 3a5c4: 90 e0 ldi r25, 0x00 ; 0 3a5c6: fc 01 movw r30, r24 3a5c8: ee 0f add r30, r30 3a5ca: ff 1f adc r31, r31 3a5cc: e8 0f add r30, r24 3a5ce: f9 1f adc r31, r25 3a5d0: ed 53 subi r30, 0x3D ; 61 3a5d2: f8 4e sbci r31, 0xE8 ; 232 3a5d4: 62 81 ldd r22, Z+2 ; 0x02 3a5d6: 06 2e mov r0, r22 3a5d8: 00 0c add r0, r0 3a5da: 77 0b sbc r23, r23 3a5dc: 20 e0 ldi r18, 0x00 ; 0 3a5de: 40 e0 ldi r20, 0x00 ; 0 3a5e0: 80 81 ld r24, Z 3a5e2: 91 81 ldd r25, Z+1 ; 0x01 3a5e4: 0d 94 b4 d1 jmp 0x3a368 ; 0x3a368 if (lcd_clicked()) { if (_md->editValueBits == 8) *((uint8_t*)(_md->editValuePtr)) = _md->currentValue; else *((int16_t*)(_md->editValuePtr)) = _md->currentValue; 3a5e8: 91 83 std Z+1, r25 ; 0x01 3a5ea: e5 cf rjmp .-54 ; 0x3a5b6 <_menu_edit_P()+0xd0> menu_back_no_reset(); } } 3a5ec: 08 95 ret 0003a5ee : if (lcd_clicked()) menu_back(); } void menu_submenu(menu_func_t submenu, const bool feedback) { 3a5ee: dc 01 movw r26, r24 3a5f0: 26 2f mov r18, r22 if (menu_depth < MENU_DEPTH_MAX) 3a5f2: 90 91 f7 03 lds r25, 0x03F7 ; 0x8003f7 3a5f6: 97 30 cpi r25, 0x07 ; 7 3a5f8: d8 f4 brcc .+54 ; 0x3a630 { menu_stack[menu_depth].menu = menu_menu; 3a5fa: 49 2f mov r20, r25 3a5fc: 50 e0 ldi r21, 0x00 ; 0 3a5fe: fa 01 movw r30, r20 3a600: ee 0f add r30, r30 3a602: ff 1f adc r31, r31 3a604: e4 0f add r30, r20 3a606: f5 1f adc r31, r21 3a608: ed 53 subi r30, 0x3D ; 61 3a60a: f8 4e sbci r31, 0xE8 ; 232 3a60c: 40 91 12 04 lds r20, 0x0412 ; 0x800412 3a610: 50 91 13 04 lds r21, 0x0413 ; 0x800413 3a614: 51 83 std Z+1, r21 ; 0x01 3a616: 40 83 st Z, r20 menu_stack[menu_depth++].position = lcd_encoder; 3a618: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a61c: 9f 5f subi r25, 0xFF ; 255 3a61e: 90 93 f7 03 sts 0x03F7, r25 ; 0x8003f7 3a622: 82 83 std Z+2, r24 ; 0x02 menu_goto(submenu, 0, true, feedback); 3a624: 41 e0 ldi r20, 0x01 ; 1 3a626: 70 e0 ldi r23, 0x00 ; 0 3a628: 60 e0 ldi r22, 0x00 ; 0 3a62a: cd 01 movw r24, r26 3a62c: 0d 94 b4 d1 jmp 0x3a368 ; 0x3a368 } } 3a630: 08 95 ret 0003a632 : } menu_item++; } void menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings) { 3a632: 8f 92 push r8 3a634: 9f 92 push r9 3a636: af 92 push r10 3a638: bf 92 push r11 3a63a: cf 92 push r12 3a63c: df 92 push r13 3a63e: ef 92 push r14 3a640: ff 92 push r15 3a642: 0f 93 push r16 3a644: 1f 93 push r17 3a646: cf 93 push r28 3a648: df 93 push r29 if (menu_item == menu_line) 3a64a: e0 91 14 05 lds r30, 0x0514 ; 0x800514 3a64e: 30 91 13 05 lds r19, 0x0513 ; 0x800513 3a652: e3 13 cpse r30, r19 3a654: 73 c0 rjmp .+230 ; 0x3a73c 3a656: c2 2f mov r28, r18 3a658: 6a 01 movw r12, r20 3a65a: 7b 01 movw r14, r22 3a65c: 5c 01 movw r10, r24 { if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>')); 3a65e: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a662: 88 23 and r24, r24 3a664: a1 f1 breq .+104 ; 0x3a6ce 3a666: 0f 94 4c d0 call 0x3a098 ; 0x3a098 3a66a: 01 e0 ldi r16, 0x01 ; 1 3a66c: 8e 33 cpi r24, 0x3E ; 62 3a66e: 09 f0 breq .+2 ; 0x3a672 3a670: 00 e0 ldi r16, 0x00 ; 0 3a672: 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; 3a674: 80 2f mov r24, r16 3a676: 82 70 andi r24, 0x02 ; 2 3a678: 88 2e mov r8, r24 const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' '; 3a67a: e1 14 cp r14, r1 3a67c: f1 04 cpc r15, r1 3a67e: 09 f4 brne .+2 ; 0x3a682 3a680: 6f c0 rjmp .+222 ; 0x3a760 3a682: e7 01 movw r28, r14 3a684: 90 e2 ldi r25, 0x20 ; 32 3a686: 99 2e mov r9, r25 if (toggle == NULL) toggle = _T(MSG_NA); uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle)); 3a688: 88 20 and r8, r8 3a68a: 09 f4 brne .+2 ; 0x3a68e 3a68c: 41 c0 rjmp .+130 ; 0x3a710 3a68e: ce 01 movw r24, r28 3a690: 0f 94 ce d9 call 0x3b39c ; 0x3b39c <__strlen_P> 3a694: 14 e0 ldi r17, 0x04 ; 4 3a696: 18 0f add r17, r24 lcd_putc_at(0, menu_row, (settings & 0x01) ? '>' : ' '); 3a698: 4e e3 ldi r20, 0x3E ; 62 3a69a: 00 ff sbrs r16, 0 3a69c: 40 e2 ldi r20, 0x20 ; 32 3a69e: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a6a2: 80 e0 ldi r24, 0x00 ; 0 3a6a4: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_print_pad_P(str, LCD_WIDTH - len); 3a6a8: 64 e1 ldi r22, 0x14 ; 20 3a6aa: 61 1b sub r22, r17 3a6ac: c5 01 movw r24, r10 3a6ae: 0e 94 4d 70 call 0xe09a ; 0xe09a lcd_putc('['); 3a6b2: 8b e5 ldi r24, 0x5B ; 91 3a6b4: 0e 94 67 6e call 0xdcce ; 0xdcce if (is_progmem) { lcd_puts_P(toggle); 3a6b8: 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) 3a6ba: 88 20 and r8, r8 3a6bc: 89 f1 breq .+98 ; 0x3a720 { lcd_puts_P(toggle); 3a6be: 0e 94 63 6e call 0xdcc6 ; 0xdcc6 } else { lcd_print(toggle); } lcd_putc(']'); 3a6c2: 8d e5 ldi r24, 0x5D ; 93 3a6c4: 0e 94 67 6e call 0xdcce ; 0xdcce lcd_putc(eol); 3a6c8: 89 2d mov r24, r9 3a6ca: 0e 94 67 6e call 0xdcce ; 0xdcce 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)) 3a6ce: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a6d2: 88 23 and r24, r24 3a6d4: 99 f1 breq .+102 ; 0x3a73c 3a6d6: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a6da: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a6de: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a6e2: 28 17 cp r18, r24 3a6e4: 19 06 cpc r1, r25 3a6e6: 51 f5 brne .+84 ; 0x3a73c { if (toggle == NULL) // print N/A warning message 3a6e8: ef 28 or r14, r15 3a6ea: e9 f4 brne .+58 ; 0x3a726 { menu_submenu(func); 3a6ec: 60 e0 ldi r22, 0x00 ; 0 3a6ee: c6 01 movw r24, r12 3a6f0: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee menu_item_ret(); return; } } menu_item++; } 3a6f4: df 91 pop r29 3a6f6: cf 91 pop r28 3a6f8: 1f 91 pop r17 3a6fa: 0f 91 pop r16 3a6fc: ff 90 pop r15 3a6fe: ef 90 pop r14 3a700: df 90 pop r13 3a702: cf 90 pop r12 3a704: bf 90 pop r11 3a706: af 90 pop r10 3a708: 9f 90 pop r9 3a70a: 8f 90 pop r8 { lcd_update_enabled = 0; if (func) func(); lcd_update_enabled = 1; } menu_item_ret(); 3a70c: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 //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)); 3a710: fe 01 movw r30, r28 3a712: 01 90 ld r0, Z+ 3a714: 00 20 and r0, r0 3a716: e9 f7 brne .-6 ; 0x3a712 3a718: ec 1b sub r30, r28 3a71a: 13 e0 ldi r17, 0x03 ; 3 3a71c: 1e 0f add r17, r30 3a71e: bc cf rjmp .-136 ; 0x3a698 lcd_putc('['); if (is_progmem) { lcd_puts_P(toggle); } else { lcd_print(toggle); 3a720: 0e 94 7f 70 call 0xe0fe ; 0xe0fe 3a724: ce cf rjmp .-100 ; 0x3a6c2 { menu_submenu(func); } else // do the actual toggling { lcd_update_enabled = 0; 3a726: 10 92 6e 02 sts 0x026E, r1 ; 0x80026e if (func) func(); 3a72a: c1 14 cp r12, r1 3a72c: d1 04 cpc r13, r1 3a72e: 11 f0 breq .+4 ; 0x3a734 3a730: f6 01 movw r30, r12 3a732: 19 95 eicall lcd_update_enabled = 1; 3a734: 81 e0 ldi r24, 0x01 ; 1 3a736: 80 93 6e 02 sts 0x026E, r24 ; 0x80026e 3a73a: dc cf rjmp .-72 ; 0x3a6f4 } menu_item_ret(); return; } } menu_item++; 3a73c: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a740: 8f 5f subi r24, 0xFF ; 255 3a742: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a746: df 91 pop r29 3a748: cf 91 pop r28 3a74a: 1f 91 pop r17 3a74c: 0f 91 pop r16 3a74e: ff 90 pop r15 3a750: ef 90 pop r14 3a752: df 90 pop r13 3a754: cf 90 pop r12 3a756: bf 90 pop r11 3a758: af 90 pop r10 3a75a: 9f 90 pop r9 3a75c: 8f 90 pop r8 3a75e: 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); 3a760: 8a e8 ldi r24, 0x8A ; 138 3a762: 97 e4 ldi r25, 0x47 ; 71 3a764: 0e 94 44 72 call 0xe488 ; 0xe488 3a768: 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] : ' '; 3a76a: 8e e7 ldi r24, 0x7E ; 126 3a76c: 98 2e mov r9, r24 3a76e: 8c cf rjmp .-232 ; 0x3a688 0003a770 : } menu_item++; } void menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu) { 3a770: 0f 93 push r16 3a772: 1f 93 push r17 3a774: cf 93 push r28 3a776: df 93 push r29 3a778: cd b7 in r28, 0x3d ; 61 3a77a: de b7 in r29, 0x3e ; 62 3a77c: 63 97 sbiw r28, 0x13 ; 19 3a77e: 0f b6 in r0, 0x3f ; 63 3a780: f8 94 cli 3a782: de bf out 0x3e, r29 ; 62 3a784: 0f be out 0x3f, r0 ; 63 3a786: cd bf out 0x3d, r28 ; 61 if (menu_item == menu_line) 3a788: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a78c: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a790: 32 13 cpse r19, r18 3a792: 38 c0 rjmp .+112 ; 0x3a804 3a794: 8b 01 movw r16, r22 { if (lcd_draw_update) menu_draw_item_puts_E(LCD_STR_ARROW_RIGHT[0], sheet); 3a796: 20 91 6d 02 lds r18, 0x026D ; 0x80026d 3a79a: 22 23 and r18, r18 3a79c: a9 f0 breq .+42 ; 0x3a7c8 static void menu_draw_item_puts_E(char type_char, const Sheet &sheet) { SheetFormatBuffer buffer; menu_format_sheet_E(sheet, buffer); 3a79e: be 01 movw r22, r28 3a7a0: 6f 5f subi r22, 0xFF ; 255 3a7a2: 7f 4f sbci r23, 0xFF ; 255 3a7a4: 0f 94 24 d0 call 0x3a048 ; 0x3a048 lcd_putc_at(0, menu_row, menu_selection_mark()); 3a7a8: 0f 94 4c d0 call 0x3a098 ; 0x3a098 3a7ac: 48 2f mov r20, r24 3a7ae: 60 91 11 05 lds r22, 0x0511 ; 0x800511 3a7b2: 80 e0 ldi r24, 0x00 ; 0 3a7b4: 0e 94 98 6e call 0xdd30 ; 0xdd30 lcd_print_pad(buffer.c, LCD_WIDTH - 2); 3a7b8: 62 e1 ldi r22, 0x12 ; 18 3a7ba: ce 01 movw r24, r28 3a7bc: 01 96 adiw r24, 0x01 ; 1 3a7be: 0e 94 67 70 call 0xe0ce ; 0xe0ce lcd_putc(type_char); 3a7c2: 8e e7 ldi r24, 0x7E ; 126 3a7c4: 0e 94 67 6e call 0xdcce ; 0xdcce 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)) 3a7c8: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a7cc: 88 23 and r24, r24 3a7ce: d1 f0 breq .+52 ; 0x3a804 3a7d0: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a7d4: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a7d8: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a7dc: 28 17 cp r18, r24 3a7de: 19 06 cpc r1, r25 3a7e0: 89 f4 brne .+34 ; 0x3a804 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); 3a7e2: 60 e0 ldi r22, 0x00 ; 0 3a7e4: c8 01 movw r24, r16 3a7e6: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee menu_item_ret(); 3a7ea: 0f 94 70 d0 call 0x3a0e0 ; 0x3a0e0 menu_item_ret(); return; } } menu_item++; } 3a7ee: 63 96 adiw r28, 0x13 ; 19 3a7f0: 0f b6 in r0, 0x3f ; 63 3a7f2: f8 94 cli 3a7f4: de bf out 0x3e, r29 ; 62 3a7f6: 0f be out 0x3f, r0 ; 63 3a7f8: cd bf out 0x3d, r28 ; 61 3a7fa: df 91 pop r29 3a7fc: cf 91 pop r28 3a7fe: 1f 91 pop r17 3a800: 0f 91 pop r16 3a802: 08 95 ret menu_submenu(submenu); menu_item_ret(); return; } } menu_item++; 3a804: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a808: 8f 5f subi r24, 0xFF ; 255 3a80a: 80 93 14 05 sts 0x0514, r24 ; 0x800514 3a80e: ef cf rjmp .-34 ; 0x3a7ee 0003a810 : menu_item++; return 0; } void menu_item_submenu_P(const char* str, menu_func_t submenu) { 3a810: cf 93 push r28 3a812: df 93 push r29 if (menu_item == menu_line) 3a814: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a818: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a81c: 32 13 cpse r19, r18 3a81e: 1e c0 rjmp .+60 ; 0x3a85c 3a820: eb 01 movw r28, r22 3a822: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str); 3a824: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a828: 88 23 and r24, r24 3a82a: 19 f0 breq .+6 ; 0x3a832 3a82c: 8e e7 ldi r24, 0x7E ; 126 3a82e: 0f 94 59 d0 call 0x3a0b2 ; 0x3a0b2 if (menu_clicked && (lcd_encoder == menu_item)) 3a832: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a836: 88 23 and r24, r24 3a838: 89 f0 breq .+34 ; 0x3a85c 3a83a: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a83e: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a842: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a846: 28 17 cp r18, r24 3a848: 19 06 cpc r1, r25 3a84a: 41 f4 brne .+16 ; 0x3a85c { menu_submenu(submenu); 3a84c: 60 e0 ldi r22, 0x00 ; 0 3a84e: ce 01 movw r24, r28 3a850: 0f 94 f7 d2 call 0x3a5ee ; 0x3a5ee menu_item_ret(); return; } } menu_item++; } 3a854: df 91 pop r29 3a856: 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(); 3a858: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; 3a85c: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a860: 8f 5f subi r24, 0xFF ; 255 3a862: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a866: df 91 pop r29 3a868: cf 91 pop r28 3a86a: 08 95 ret 0003a86c : menu_row = -1; } } void menu_back(uint8_t nLevel) { 3a86c: 98 2f mov r25, r24 menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0); 3a86e: 80 91 f7 03 lds r24, 0x03F7 ; 0x8003f7 3a872: 98 17 cp r25, r24 3a874: a8 f4 brcc .+42 ; 0x3a8a0 3a876: 89 1b sub r24, r25 3a878: 80 93 f7 03 sts 0x03F7, r24 ; 0x8003f7 menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true); 3a87c: 90 e0 ldi r25, 0x00 ; 0 3a87e: fc 01 movw r30, r24 3a880: ee 0f add r30, r30 3a882: ff 1f adc r31, r31 3a884: e8 0f add r30, r24 3a886: f9 1f adc r31, r25 3a888: ed 53 subi r30, 0x3D ; 61 3a88a: f8 4e sbci r31, 0xE8 ; 232 3a88c: 62 81 ldd r22, Z+2 ; 0x02 3a88e: 06 2e mov r0, r22 3a890: 00 0c add r0, r0 3a892: 77 0b sbc r23, r23 3a894: 20 e0 ldi r18, 0x00 ; 0 3a896: 41 e0 ldi r20, 0x01 ; 1 3a898: 80 81 ld r24, Z 3a89a: 91 81 ldd r25, Z+1 ; 0x01 3a89c: 0d 94 b4 d1 jmp 0x3a368 ; 0x3a368 } } void menu_back(uint8_t nLevel) { menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0); 3a8a0: 80 e0 ldi r24, 0x00 ; 0 3a8a2: ea cf rjmp .-44 ; 0x3a878 0003a8a4 : menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true); } void menu_back(void) { menu_back(1); 3a8a4: 81 e0 ldi r24, 0x01 ; 1 3a8a6: 0d 94 36 d4 jmp 0x3a86c ; 0x3a86c 0003a8aa : menu_item++; } void menu_item_back_P(const char* str) { if (menu_item == menu_line) 3a8aa: 30 91 14 05 lds r19, 0x0514 ; 0x800514 3a8ae: 20 91 13 05 lds r18, 0x0513 ; 0x800513 3a8b2: 32 13 cpse r19, r18 3a8b4: 19 c0 rjmp .+50 ; 0x3a8e8 3a8b6: bc 01 movw r22, r24 { if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_UPLEVEL[0], str); 3a8b8: 80 91 6d 02 lds r24, 0x026D ; 0x80026d 3a8bc: 88 23 and r24, r24 3a8be: 19 f0 breq .+6 ; 0x3a8c6 3a8c0: 83 e8 ldi r24, 0x83 ; 131 3a8c2: 0f 94 59 d0 call 0x3a0b2 ; 0x3a0b2 if (menu_clicked && (lcd_encoder == menu_item)) 3a8c6: 80 91 12 05 lds r24, 0x0512 ; 0x800512 3a8ca: 88 23 and r24, r24 3a8cc: 69 f0 breq .+26 ; 0x3a8e8 3a8ce: 20 91 14 05 lds r18, 0x0514 ; 0x800514 3a8d2: 80 91 6f 06 lds r24, 0x066F ; 0x80066f 3a8d6: 90 91 70 06 lds r25, 0x0670 ; 0x800670 3a8da: 28 17 cp r18, r24 3a8dc: 19 06 cpc r1, r25 3a8de: 21 f4 brne .+8 ; 0x3a8e8 { menu_back(); 3a8e0: 0f 94 52 d4 call 0x3a8a4 ; 0x3a8a4 menu_item_ret(); 3a8e4: 0d 94 70 d0 jmp 0x3a0e0 ; 0x3a0e0 return; } } menu_item++; 3a8e8: 80 91 14 05 lds r24, 0x0514 ; 0x800514 3a8ec: 8f 5f subi r24, 0xFF ; 255 3a8ee: 80 93 14 05 sts 0x0514, r24 ; 0x800514 } 3a8f2: 08 95 ret 0003a8f4 : }; 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() { 3a8f4: ef 92 push r14 3a8f6: ff 92 push r15 3a8f8: 0f 93 push r16 3a8fa: 1f 93 push r17 3a8fc: cf 93 push r28 3a8fe: df 93 push r29 3a900: 10 92 da 03 sts 0x03DA, r1 ; 0x8003da 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) 3a904: 80 91 b4 03 lds r24, 0x03B4 ; 0x8003b4 3a908: 81 11 cpse r24, r1 3a90a: 23 c0 rjmp .+70 ; 0x3a952 { _md->status = 1; // Menu entered for the first time 3a90c: 81 e0 ldi r24, 0x01 ; 1 3a90e: 80 93 b4 03 sts 0x03B4, r24 ; 0x8003b4 // Fetch the TuneItem from PROGMEM const uint8_t offset = (mmu2.MMUCurrentErrorCode() == ErrorCode::HOMING_IDLER_FAILED) ? 1 : 0; 3a912: 81 e0 ldi r24, 0x01 ; 1 3a914: 90 e0 ldi r25, 0x00 ; 0 3a916: 20 91 8a 13 lds r18, 0x138A ; 0x80138a 3a91a: 30 91 8b 13 lds r19, 0x138B ; 0x80138b 3a91e: 27 30 cpi r18, 0x07 ; 7 3a920: 31 48 sbci r19, 0x81 ; 129 3a922: 11 f0 breq .+4 ; 0x3a928 3a924: 90 e0 ldi r25, 0x00 ; 0 3a926: 80 e0 ldi r24, 0x00 ; 0 memcpy_P(&(_md->item), &TuneItems[offset], sizeof(TuneItem)); 3a928: bc 01 movw r22, r24 3a92a: 66 0f add r22, r22 3a92c: 77 1f adc r23, r23 3a92e: 68 0f add r22, r24 3a930: 79 1f adc r23, r25 3a932: 61 5c subi r22, 0xC1 ; 193 3a934: 74 45 sbci r23, 0x54 ; 84 3a936: 43 e0 ldi r20, 0x03 ; 3 3a938: 50 e0 ldi r21, 0x00 ; 0 3a93a: 86 eb ldi r24, 0xB6 ; 182 3a93c: 93 e0 ldi r25, 0x03 ; 3 3a93e: 0f 94 aa d9 call 0x3b354 ; 0x3b354 // Fetch the value which is currently in MMU EEPROM mmu2.ReadRegister(_md->item.address); 3a942: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 3a946: 0f 94 77 10 call 0x220ee ; 0x220ee _md->currentValue = mmu2.GetLastReadRegisterValue(); 3a94a: 80 91 b5 13 lds r24, 0x13B5 ; 0x8013b5 3a94e: 80 93 b5 03 sts 0x03B5, r24 ; 0x8003b5 } MENU_BEGIN(); 3a952: 0f 94 8a d1 call 0x3a314 ; 0x3a314 3a956: 10 92 11 05 sts 0x0511, r1 ; 0x800511 3a95a: 80 91 11 05 lds r24, 0x0511 ; 0x800511 3a95e: 84 30 cpi r24, 0x04 ; 4 3a960: e0 f5 brcc .+120 ; 0x3a9da 3a962: 10 92 14 05 sts 0x0514, r1 ; 0x800514 ON_MENU_LEAVE( 3a966: 0f 94 0a d0 call 0x3a014 ; 0x3a014 3a96a: 88 23 and r24, r24 3a96c: 89 f0 breq .+34 ; 0x3a990 3a96e: 60 91 b5 03 lds r22, 0x03B5 ; 0x8003b5 3a972: 70 e0 ldi r23, 0x00 ; 0 3a974: 80 91 b6 03 lds r24, 0x03B6 ; 0x8003b6 3a978: 0e 94 fd e8 call 0x1d1fa ; 0x1d1fa 3a97c: 10 92 ac 0d sts 0x0DAC, r1 ; 0x800dac <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.498> &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); } 3a980: df 91 pop r29 3a982: cf 91 pop r28 3a984: 1f 91 pop r17 3a986: 0f 91 pop r16 3a988: ff 90 pop r15 3a98a: ef 90 pop r14 mmu2.ReadRegister(_md->item.address); _md->currentValue = mmu2.GetLastReadRegisterValue(); } MENU_BEGIN(); ON_MENU_LEAVE( 3a98c: 0d 94 82 1f jmp 0x23f04 ; 0x23f04 mmu2.WriteRegister(_md->item.address, (uint16_t)_md->currentValue); putErrorScreenToSleep = false; lcd_return_to_status(); return; ); MENU_ITEM_BACK_P(_T(MSG_DONE)); 3a990: 8a e2 ldi r24, 0x2A ; 42 3a992: 94 e6 ldi r25, 0x64 ; 100 3a994: 0e 94 44 72 call 0xe488 ; 0xe488 3a998: 0f 94 55 d4 call 0x3a8aa ; 0x3a8aa MENU_ITEM_EDIT_int3_P( 3a99c: 00 91 b8 03 lds r16, 0x03B8 ; 0x8003b8 3a9a0: 10 e0 ldi r17, 0x00 ; 0 3a9a2: c0 91 b7 03 lds r28, 0x03B7 ; 0x8003b7 3a9a6: d0 e0 ldi r29, 0x00 ; 0 3a9a8: 8c e1 ldi r24, 0x1C ; 28 3a9aa: 94 e6 ldi r25, 0x64 ; 100 3a9ac: 0e 94 44 72 call 0xe488 ; 0xe488 3a9b0: f1 2c mov r15, r1 3a9b2: e1 2c mov r14, r1 3a9b4: 9e 01 movw r18, r28 3a9b6: 48 e0 ldi r20, 0x08 ; 8 3a9b8: 65 eb ldi r22, 0xB5 ; 181 3a9ba: 73 e0 ldi r23, 0x03 ; 3 3a9bc: 0f 94 da d1 call 0x3a3b4 ; 0x3a3b4 _T(MSG_MMU_SENSITIVITY), &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); 3a9c0: 0f 94 5e d1 call 0x3a2bc ; 0x3a2bc // Fetch the value which is currently in MMU EEPROM mmu2.ReadRegister(_md->item.address); _md->currentValue = mmu2.GetLastReadRegisterValue(); } MENU_BEGIN(); 3a9c4: 80 91 11 05 lds r24, 0x0511 ; 0x800511 3a9c8: 8f 5f subi r24, 0xFF ; 255 3a9ca: 80 93 11 05 sts 0x0511, r24 ; 0x800511 3a9ce: 80 91 13 05 lds r24, 0x0513 ; 0x800513 3a9d2: 8f 5f subi r24, 0xFF ; 255 3a9d4: 80 93 13 05 sts 0x0513, r24 ; 0x800513 3a9d8: c0 cf rjmp .-128 ; 0x3a95a &_md->currentValue, _md->item.minValue, _md->item.maxValue ); MENU_END(); } 3a9da: df 91 pop r29 3a9dc: cf 91 pop r28 3a9de: 1f 91 pop r17 3a9e0: 0f 91 pop r16 3a9e2: ff 90 pop r15 3a9e4: ef 90 pop r14 3a9e6: 08 95 ret 0003a9e8 : } } void menu_back_if_clicked(void) { if (lcd_clicked()) 3a9e8: 0e 94 95 70 call 0xe12a ; 0xe12a 3a9ec: 81 11 cpse r24, r1 menu_back(); 3a9ee: 0d 94 52 d4 jmp 0x3a8a4 ; 0x3a8a4 } 3a9f2: 08 95 ret 0003a9f4 : } // Private Methods ///////////////////////////////////////////////////////////// void MarlinSerial::printNumber(unsigned long n, uint8_t base) { 3a9f4: 8f 92 push r8 3a9f6: 9f 92 push r9 3a9f8: af 92 push r10 3a9fa: bf 92 push r11 3a9fc: ef 92 push r14 3a9fe: ff 92 push r15 3aa00: 0f 93 push r16 3aa02: 1f 93 push r17 3aa04: cf 93 push r28 3aa06: df 93 push r29 3aa08: cd b7 in r28, 0x3d ; 61 3aa0a: de b7 in r29, 0x3e ; 62 3aa0c: a0 97 sbiw r28, 0x20 ; 32 3aa0e: 0f b6 in r0, 0x3f ; 63 3aa10: f8 94 cli 3aa12: de bf out 0x3e, r29 ; 62 3aa14: 0f be out 0x3f, r0 ; 63 3aa16: cd bf out 0x3d, r28 ; 61 unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars. uint8_t i = 0; if (n == 0) { 3aa18: 61 15 cp r22, r1 3aa1a: 71 05 cpc r23, r1 3aa1c: 81 05 cpc r24, r1 3aa1e: 91 05 cpc r25, r1 3aa20: 99 f4 brne .+38 ; 0x3aa48 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3aa22: 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)); } 3aa24: a0 96 adiw r28, 0x20 ; 32 3aa26: 0f b6 in r0, 0x3f ; 63 3aa28: f8 94 cli 3aa2a: de bf out 0x3e, r29 ; 62 3aa2c: 0f be out 0x3f, r0 ; 63 3aa2e: cd bf out 0x3d, r28 ; 61 3aa30: df 91 pop r29 3aa32: cf 91 pop r28 3aa34: 1f 91 pop r17 3aa36: 0f 91 pop r16 3aa38: ff 90 pop r15 3aa3a: ef 90 pop r14 3aa3c: bf 90 pop r11 3aa3e: af 90 pop r10 3aa40: 9f 90 pop r9 3aa42: 8f 90 pop r8 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3aa44: 0c 94 cf 76 jmp 0xed9e ; 0xed9e // 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; 3aa48: 00 e0 ldi r16, 0x00 ; 0 print('0'); return; } while (n > 0) { buf[i++] = n % base; 3aa4a: 84 2e mov r8, r20 3aa4c: 91 2c mov r9, r1 3aa4e: b1 2c mov r11, r1 3aa50: a1 2c mov r10, r1 3aa52: 9e 01 movw r18, r28 3aa54: 2f 5f subi r18, 0xFF ; 255 3aa56: 3f 4f sbci r19, 0xFF ; 255 3aa58: 79 01 movw r14, r18 3aa5a: a5 01 movw r20, r10 3aa5c: 94 01 movw r18, r8 3aa5e: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 3aa62: f7 01 movw r30, r14 3aa64: e0 0f add r30, r16 3aa66: f1 1d adc r31, r1 3aa68: 60 83 st Z, r22 n /= base; 3aa6a: b9 01 movw r22, r18 3aa6c: ca 01 movw r24, r20 print('0'); return; } while (n > 0) { buf[i++] = n % base; 3aa6e: 0f 5f subi r16, 0xFF ; 255 if (n == 0) { print('0'); return; } while (n > 0) { 3aa70: 61 15 cp r22, r1 3aa72: 71 05 cpc r23, r1 3aa74: 81 05 cpc r24, r1 3aa76: 91 05 cpc r25, r1 3aa78: 81 f7 brne .-32 ; 0x3aa5a 3aa7a: 0e 0d add r16, r14 3aa7c: 1f 2d mov r17, r15 3aa7e: 11 1d adc r17, r1 buf[i++] = n % base; n /= base; } for (; i > 0; i--) 3aa80: e0 16 cp r14, r16 3aa82: f1 06 cpc r15, r17 3aa84: 59 f0 breq .+22 ; 0x3aa9c print((char) (buf[i - 1] < 10 ? 3aa86: f8 01 movw r30, r16 3aa88: 82 91 ld r24, -Z 3aa8a: 8f 01 movw r16, r30 3aa8c: 8a 30 cpi r24, 0x0A ; 10 3aa8e: 20 f4 brcc .+8 ; 0x3aa98 '0' + buf[i - 1] : 3aa90: 80 5d subi r24, 0xD0 ; 208 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3aa92: 0e 94 cf 76 call 0xed9e ; 0xed9e 3aa96: f4 cf rjmp .-24 ; 0x3aa80 } for (; i > 0; i--) print((char) (buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); 3aa98: 89 5c subi r24, 0xC9 ; 201 3aa9a: fb cf rjmp .-10 ; 0x3aa92 } 3aa9c: a0 96 adiw r28, 0x20 ; 32 3aa9e: 0f b6 in r0, 0x3f ; 63 3aaa0: f8 94 cli 3aaa2: de bf out 0x3e, r29 ; 62 3aaa4: 0f be out 0x3f, r0 ; 63 3aaa6: cd bf out 0x3d, r28 ; 61 3aaa8: df 91 pop r29 3aaaa: cf 91 pop r28 3aaac: 1f 91 pop r17 3aaae: 0f 91 pop r16 3aab0: ff 90 pop r15 3aab2: ef 90 pop r14 3aab4: bf 90 pop r11 3aab6: af 90 pop r10 3aab8: 9f 90 pop r9 3aaba: 8f 90 pop r8 3aabc: 08 95 ret 0003aabe : void MarlinSerial::print(unsigned int n, int base) { print((unsigned long) n, base); } void MarlinSerial::print(long n, int base) 3aabe: cf 92 push r12 3aac0: df 92 push r13 3aac2: ef 92 push r14 3aac4: ff 92 push r15 3aac6: 6b 01 movw r12, r22 3aac8: 7c 01 movw r14, r24 { if (base == 0) { write(n); } else if (base == 10) { if (n < 0) { 3aaca: f7 fe sbrs r15, 7 3aacc: 0b c0 rjmp .+22 ; 0x3aae4 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3aace: 8d e2 ldi r24, 0x2D ; 45 3aad0: 0e 94 cf 76 call 0xed9e ; 0xed9e } else if (base == 10) { if (n < 0) { print('-'); n = -n; 3aad4: f0 94 com r15 3aad6: e0 94 com r14 3aad8: d0 94 com r13 3aada: c0 94 com r12 3aadc: c1 1c adc r12, r1 3aade: d1 1c adc r13, r1 3aae0: e1 1c adc r14, r1 3aae2: f1 1c adc r15, r1 } printNumber(n, 10); 3aae4: 4a e0 ldi r20, 0x0A ; 10 3aae6: c7 01 movw r24, r14 3aae8: b6 01 movw r22, r12 } else { printNumber(n, base); } } 3aaea: ff 90 pop r15 3aaec: ef 90 pop r14 3aaee: df 90 pop r13 3aaf0: cf 90 pop r12 } else if (base == 10) { if (n < 0) { print('-'); n = -n; } printNumber(n, 10); 3aaf2: 0d 94 fa d4 jmp 0x3a9f4 ; 0x3a9f4 0003aaf6 : '0' + buf[i - 1] : 'A' + buf[i - 1] - 10)); } void MarlinSerial::printFloat(double number, uint8_t digits) { 3aaf6: 8f 92 push r8 3aaf8: 9f 92 push r9 3aafa: af 92 push r10 3aafc: bf 92 push r11 3aafe: cf 92 push r12 3ab00: df 92 push r13 3ab02: ef 92 push r14 3ab04: ff 92 push r15 3ab06: cf 93 push r28 3ab08: 6b 01 movw r12, r22 3ab0a: 7c 01 movw r14, r24 3ab0c: b4 2e mov r11, r20 // Handle negative numbers if (number < 0.0) 3ab0e: 20 e0 ldi r18, 0x00 ; 0 3ab10: 30 e0 ldi r19, 0x00 ; 0 3ab12: a9 01 movw r20, r18 3ab14: 0f 94 2d de call 0x3bc5a ; 0x3bc5a <__cmpsf2> 3ab18: 87 ff sbrs r24, 7 3ab1a: 07 c0 rjmp .+14 ; 0x3ab2a } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3ab1c: 8d e2 ldi r24, 0x2D ; 45 3ab1e: 0e 94 cf 76 call 0xed9e ; 0xed9e { // Handle negative numbers if (number < 0.0) { print('-'); number = -number; 3ab22: f7 fa bst r15, 7 3ab24: f0 94 com r15 3ab26: f7 f8 bld r15, 7 3ab28: 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; 3ab38: 20 e0 ldi r18, 0x00 ; 0 3ab3a: 30 e0 ldi r19, 0x00 ; 0 3ab3c: 40 e2 ldi r20, 0x20 ; 32 3ab3e: 51 e4 ldi r21, 0x41 ; 65 3ab40: 0f 94 37 de call 0x3bc6e ; 0x3bc6e <__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; 3ab48: 9b 01 movw r18, r22 3ab4a: ac 01 movw r20, r24 3ab4c: c7 01 movw r24, r14 3ab4e: b6 01 movw r22, r12 3ab50: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3ab54: 6b 01 movw r12, r22 3ab56: 7c 01 movw r14, r24 // Extract the integer part of the number and print it unsigned long int_part = (unsigned long)number; 3ab58: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 3ab5c: 4b 01 movw r8, r22 3ab5e: 5c 01 movw r10, r24 } void MarlinSerial::print(unsigned long n, int base) { if (base == 0) write(n); else printNumber(n, base); 3ab60: 4a e0 ldi r20, 0x0A ; 10 3ab62: 0f 94 fa d4 call 0x3a9f4 ; 0x3a9f4 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) 3ab66: cc 23 and r28, r28 3ab68: 91 f1 breq .+100 ; 0x3abce 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; 3ab6a: c5 01 movw r24, r10 3ab6c: b4 01 movw r22, r8 3ab6e: 0f 94 9c d6 call 0x3ad38 ; 0x3ad38 <__floatunsisf> 3ab72: 9b 01 movw r18, r22 3ab74: ac 01 movw r20, r24 3ab76: c7 01 movw r24, r14 3ab78: b6 01 movw r22, r12 3ab7a: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3ab7e: 6b 01 movw r12, r22 3ab80: 7c 01 movw r14, r24 } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3ab82: 8e e2 ldi r24, 0x2E ; 46 3ab84: 0e 94 cf 76 call 0xed9e ; 0xed9e // 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) 3ab88: c1 50 subi r28, 0x01 ; 1 3ab8a: 08 f1 brcs .+66 ; 0x3abce { remainder *= 10.0; 3ab8c: 20 e0 ldi r18, 0x00 ; 0 3ab8e: 30 e0 ldi r19, 0x00 ; 0 3ab90: 40 e2 ldi r20, 0x20 ; 32 3ab92: 51 e4 ldi r21, 0x41 ; 65 3ab94: c7 01 movw r24, r14 3ab96: b6 01 movw r22, r12 3ab98: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3ab9c: 4b 01 movw r8, r22 3ab9e: 5c 01 movw r10, r24 int toPrint = int(remainder); 3aba0: 0f 94 a9 de call 0x3bd52 ; 0x3bd52 <__fixsfsi> print((unsigned long) b, base); } void MarlinSerial::print(int n, int base) { print((long) n, base); 3aba4: 6b 01 movw r12, r22 3aba6: 77 0f add r23, r23 3aba8: ee 08 sbc r14, r14 3abaa: ff 08 sbc r15, r15 3abac: c7 01 movw r24, r14 3abae: b6 01 movw r22, r12 3abb0: 0f 94 5f d5 call 0x3aabe ; 0x3aabe while (digits-- > 0) { remainder *= 10.0; int toPrint = int(remainder); print(toPrint); remainder -= toPrint; 3abb4: c7 01 movw r24, r14 3abb6: b6 01 movw r22, r12 3abb8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 3abbc: 9b 01 movw r18, r22 3abbe: ac 01 movw r20, r24 3abc0: c5 01 movw r24, r10 3abc2: b4 01 movw r22, r8 3abc4: 0f 94 37 dd call 0x3ba6e ; 0x3ba6e <__subsf3> 3abc8: 6b 01 movw r12, r22 3abca: 7c 01 movw r14, r24 3abcc: dd cf rjmp .-70 ; 0x3ab88 } } 3abce: cf 91 pop r28 3abd0: ff 90 pop r15 3abd2: ef 90 pop r14 3abd4: df 90 pop r13 3abd6: cf 90 pop r12 3abd8: bf 90 pop r11 3abda: af 90 pop r10 3abdc: 9f 90 pop r9 3abde: 8f 90 pop r8 3abe0: 08 95 ret 0003abe2 : } void MarlinSerial::print(long n, int base) { if (base == 0) { write(n); 3abe2: 8a e0 ldi r24, 0x0A ; 10 3abe4: 0c 94 cf 76 jmp 0xed9e ; 0xed9e 0003abe8 : 3abe8: 0e 94 ac 87 call 0x10f58 ; 0x10f58 }*/ void MarlinSerial::println(const char c[]) { print(c); println(); 3abec: 0d 94 f1 d5 jmp 0x3abe2 ; 0x3abe2 0003abf0 : } 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) { 3abf0: 20 91 9a 04 lds r18, 0x049A ; 0x80049a 3abf4: 30 91 9b 04 lds r19, 0x049B ; 0x80049b 3abf8: 80 91 98 04 lds r24, 0x0498 ; 0x800498 3abfc: 90 91 99 04 lds r25, 0x0499 ; 0x800499 3ac00: 82 17 cp r24, r18 3ac02: 93 07 cpc r25, r19 3ac04: 71 f0 breq .+28 ; 0x3ac22 return -1; } else { unsigned char c = rx_buffer.buffer[rx_buffer.tail]; 3ac06: f9 01 movw r30, r18 3ac08: e8 5e subi r30, 0xE8 ; 232 3ac0a: fb 4f sbci r31, 0xFB ; 251 3ac0c: 80 81 ld r24, Z rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE; 3ac0e: 2f 5f subi r18, 0xFF ; 255 3ac10: 3f 4f sbci r19, 0xFF ; 255 3ac12: 2f 77 andi r18, 0x7F ; 127 3ac14: 33 27 eor r19, r19 3ac16: 30 93 9b 04 sts 0x049B, r19 ; 0x80049b 3ac1a: 20 93 9a 04 sts 0x049A, r18 ; 0x80049a return c; 3ac1e: 90 e0 ldi r25, 0x00 ; 0 3ac20: 08 95 ret 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) { return -1; 3ac22: 8f ef ldi r24, 0xFF ; 255 3ac24: 9f ef ldi r25, 0xFF ; 255 } else { unsigned char c = rx_buffer.buffer[rx_buffer.tail]; rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE; return c; } } 3ac26: 08 95 ret 0003ac28 <__vector_36>: #endif //DEBUG_DUMP_TO_2ND_SERIAL } } ISR(USART1_RX_vect) { 3ac28: 1f 92 push r1 3ac2a: 0f 92 push r0 3ac2c: 0f b6 in r0, 0x3f ; 63 3ac2e: 0f 92 push r0 3ac30: 11 24 eor r1, r1 3ac32: 0b b6 in r0, 0x3b ; 59 3ac34: 0f 92 push r0 3ac36: 2f 93 push r18 3ac38: 3f 93 push r19 3ac3a: 4f 93 push r20 3ac3c: 6f 93 push r22 3ac3e: 7f 93 push r23 3ac40: 8f 93 push r24 3ac42: 9f 93 push r25 3ac44: ef 93 push r30 3ac46: ff 93 push r31 // Test for a framing error. if (UCSR1A & (1< 3ac4c: 84 ff sbrs r24, 4 3ac4e: 12 c0 rjmp .+36 ; 0x3ac74 <__vector_36+0x4c> { // Characters received with the framing errors will be ignored. // Dummy register read (discard) (void)(*(char *)UDR1); 3ac50: 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 } } 3ac54: ff 91 pop r31 3ac56: ef 91 pop r30 3ac58: 9f 91 pop r25 3ac5a: 8f 91 pop r24 3ac5c: 7f 91 pop r23 3ac5e: 6f 91 pop r22 3ac60: 4f 91 pop r20 3ac62: 3f 91 pop r19 3ac64: 2f 91 pop r18 3ac66: 0f 90 pop r0 3ac68: 0b be out 0x3b, r0 ; 59 3ac6a: 0f 90 pop r0 3ac6c: 0f be out 0x3f, r0 ; 63 3ac6e: 0f 90 pop r0 3ac70: 1f 90 pop r1 3ac72: 18 95 reti (void)(*(char *)UDR1); } else { // Read the input register. unsigned char c = UDR1; 3ac74: 40 91 ce 00 lds r20, 0x00CE ; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce> if (selectedSerialPort == 1) 3ac78: 80 91 38 05 lds r24, 0x0538 ; 0x800538 3ac7c: 81 30 cpi r24, 0x01 ; 1 3ac7e: 51 f7 brne .-44 ; 0x3ac54 <__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; 3ac80: 20 91 98 04 lds r18, 0x0498 ; 0x800498 3ac84: 30 91 99 04 lds r19, 0x0499 ; 0x800499 3ac88: c9 01 movw r24, r18 3ac8a: 01 96 adiw r24, 0x01 ; 1 3ac8c: 8f 77 andi r24, 0x7F ; 127 3ac8e: 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) { 3ac90: 60 91 9a 04 lds r22, 0x049A ; 0x80049a 3ac94: 70 91 9b 04 lds r23, 0x049B ; 0x80049b 3ac98: 86 17 cp r24, r22 3ac9a: 97 07 cpc r25, r23 3ac9c: d9 f2 breq .-74 ; 0x3ac54 <__vector_36+0x2c> rx_buffer.buffer[rx_buffer.head] = c; 3ac9e: 28 5e subi r18, 0xE8 ; 232 3aca0: 3b 4f sbci r19, 0xFB ; 251 3aca2: f9 01 movw r30, r18 3aca4: 40 83 st Z, r20 rx_buffer.head = i; 3aca6: 90 93 99 04 sts 0x0499, r25 ; 0x800499 3acaa: 80 93 98 04 sts 0x0498, r24 ; 0x800498 3acae: d2 cf rjmp .-92 ; 0x3ac54 <__vector_36+0x2c> 0003acb0 <__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) { 3acb0: 1f 92 push r1 3acb2: 0f 92 push r0 3acb4: 0f b6 in r0, 0x3f ; 63 3acb6: 0f 92 push r0 3acb8: 11 24 eor r1, r1 3acba: 0b b6 in r0, 0x3b ; 59 3acbc: 0f 92 push r0 3acbe: 2f 93 push r18 3acc0: 3f 93 push r19 3acc2: 4f 93 push r20 3acc4: 6f 93 push r22 3acc6: 7f 93 push r23 3acc8: 8f 93 push r24 3acca: 9f 93 push r25 3accc: ef 93 push r30 3acce: ff 93 push r31 // Test for a framing error. if (M_UCSRxA & (1< 3acd4: 84 ff sbrs r24, 4 3acd6: 12 c0 rjmp .+36 ; 0x3acfc <__vector_25+0x4c> { // Characters received with the framing errors will be ignored. // Dummy register read (discard) (void)(*(char *)M_UDRx); 3acd8: 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 } } 3acdc: ff 91 pop r31 3acde: ef 91 pop r30 3ace0: 9f 91 pop r25 3ace2: 8f 91 pop r24 3ace4: 7f 91 pop r23 3ace6: 6f 91 pop r22 3ace8: 4f 91 pop r20 3acea: 3f 91 pop r19 3acec: 2f 91 pop r18 3acee: 0f 90 pop r0 3acf0: 0b be out 0x3b, r0 ; 59 3acf2: 0f 90 pop r0 3acf4: 0f be out 0x3f, r0 ; 63 3acf6: 0f 90 pop r0 3acf8: 1f 90 pop r1 3acfa: 18 95 reti (void)(*(char *)M_UDRx); } else { // Read the input register. unsigned char c = M_UDRx; 3acfc: 40 91 c6 00 lds r20, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6> if (selectedSerialPort == 0) 3ad00: 80 91 38 05 lds r24, 0x0538 ; 0x800538 3ad04: 81 11 cpse r24, r1 3ad06: ea cf rjmp .-44 ; 0x3acdc <__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; 3ad08: 20 91 98 04 lds r18, 0x0498 ; 0x800498 3ad0c: 30 91 99 04 lds r19, 0x0499 ; 0x800499 3ad10: c9 01 movw r24, r18 3ad12: 01 96 adiw r24, 0x01 ; 1 3ad14: 8f 77 andi r24, 0x7F ; 127 3ad16: 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) { 3ad18: 60 91 9a 04 lds r22, 0x049A ; 0x80049a 3ad1c: 70 91 9b 04 lds r23, 0x049B ; 0x80049b 3ad20: 86 17 cp r24, r22 3ad22: 97 07 cpc r25, r23 3ad24: d9 f2 breq .-74 ; 0x3acdc <__vector_25+0x2c> rx_buffer.buffer[rx_buffer.head] = c; 3ad26: 28 5e subi r18, 0xE8 ; 232 3ad28: 3b 4f sbci r19, 0xFB ; 251 3ad2a: f9 01 movw r30, r18 3ad2c: 40 83 st Z, r20 rx_buffer.head = i; 3ad2e: 90 93 99 04 sts 0x0499, r25 ; 0x800499 3ad32: 80 93 98 04 sts 0x0498, r24 ; 0x800498 3ad36: d2 cf rjmp .-92 ; 0x3acdc <__vector_25+0x2c> 0003ad38 <__floatunsisf>: 3ad38: e8 94 clt 3ad3a: 09 c0 rjmp .+18 ; 0x3ad4e <__floatsisf+0x12> 0003ad3c <__floatsisf>: 3ad3c: 97 fb bst r25, 7 3ad3e: 3e f4 brtc .+14 ; 0x3ad4e <__floatsisf+0x12> 3ad40: 90 95 com r25 3ad42: 80 95 com r24 3ad44: 70 95 com r23 3ad46: 61 95 neg r22 3ad48: 7f 4f sbci r23, 0xFF ; 255 3ad4a: 8f 4f sbci r24, 0xFF ; 255 3ad4c: 9f 4f sbci r25, 0xFF ; 255 3ad4e: 99 23 and r25, r25 3ad50: a9 f0 breq .+42 ; 0x3ad7c <__floatsisf+0x40> 3ad52: f9 2f mov r31, r25 3ad54: 96 e9 ldi r25, 0x96 ; 150 3ad56: bb 27 eor r27, r27 3ad58: 93 95 inc r25 3ad5a: f6 95 lsr r31 3ad5c: 87 95 ror r24 3ad5e: 77 95 ror r23 3ad60: 67 95 ror r22 3ad62: b7 95 ror r27 3ad64: f1 11 cpse r31, r1 3ad66: f8 cf rjmp .-16 ; 0x3ad58 <__floatsisf+0x1c> 3ad68: fa f4 brpl .+62 ; 0x3ada8 <__floatsisf+0x6c> 3ad6a: bb 0f add r27, r27 3ad6c: 11 f4 brne .+4 ; 0x3ad72 <__floatsisf+0x36> 3ad6e: 60 ff sbrs r22, 0 3ad70: 1b c0 rjmp .+54 ; 0x3ada8 <__floatsisf+0x6c> 3ad72: 6f 5f subi r22, 0xFF ; 255 3ad74: 7f 4f sbci r23, 0xFF ; 255 3ad76: 8f 4f sbci r24, 0xFF ; 255 3ad78: 9f 4f sbci r25, 0xFF ; 255 3ad7a: 16 c0 rjmp .+44 ; 0x3ada8 <__floatsisf+0x6c> 3ad7c: 88 23 and r24, r24 3ad7e: 11 f0 breq .+4 ; 0x3ad84 <__floatsisf+0x48> 3ad80: 96 e9 ldi r25, 0x96 ; 150 3ad82: 11 c0 rjmp .+34 ; 0x3ada6 <__floatsisf+0x6a> 3ad84: 77 23 and r23, r23 3ad86: 21 f0 breq .+8 ; 0x3ad90 <__floatsisf+0x54> 3ad88: 9e e8 ldi r25, 0x8E ; 142 3ad8a: 87 2f mov r24, r23 3ad8c: 76 2f mov r23, r22 3ad8e: 05 c0 rjmp .+10 ; 0x3ad9a <__floatsisf+0x5e> 3ad90: 66 23 and r22, r22 3ad92: 71 f0 breq .+28 ; 0x3adb0 <__floatsisf+0x74> 3ad94: 96 e8 ldi r25, 0x86 ; 134 3ad96: 86 2f mov r24, r22 3ad98: 70 e0 ldi r23, 0x00 ; 0 3ad9a: 60 e0 ldi r22, 0x00 ; 0 3ad9c: 2a f0 brmi .+10 ; 0x3ada8 <__floatsisf+0x6c> 3ad9e: 9a 95 dec r25 3ada0: 66 0f add r22, r22 3ada2: 77 1f adc r23, r23 3ada4: 88 1f adc r24, r24 3ada6: da f7 brpl .-10 ; 0x3ad9e <__floatsisf+0x62> 3ada8: 88 0f add r24, r24 3adaa: 96 95 lsr r25 3adac: 87 95 ror r24 3adae: 97 f9 bld r25, 7 3adb0: 08 95 ret 0003adb2 : 3adb2: 9b 01 movw r18, r22 3adb4: ac 01 movw r20, r24 3adb6: 0d 94 dd d6 jmp 0x3adba ; 0x3adba <__mulsf3> 0003adba <__mulsf3>: 3adba: 0f 94 f0 d6 call 0x3ade0 ; 0x3ade0 <__mulsf3x> 3adbe: 0d 94 61 d7 jmp 0x3aec2 ; 0x3aec2 <__fp_round> 3adc2: 0f 94 53 d7 call 0x3aea6 ; 0x3aea6 <__fp_pscA> 3adc6: 38 f0 brcs .+14 ; 0x3add6 <__mulsf3+0x1c> 3adc8: 0f 94 5a d7 call 0x3aeb4 ; 0x3aeb4 <__fp_pscB> 3adcc: 20 f0 brcs .+8 ; 0x3add6 <__mulsf3+0x1c> 3adce: 95 23 and r25, r21 3add0: 11 f0 breq .+4 ; 0x3add6 <__mulsf3+0x1c> 3add2: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3add6: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3adda: 11 24 eor r1, r1 3addc: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 0003ade0 <__mulsf3x>: 3ade0: 0f 94 72 d7 call 0x3aee4 ; 0x3aee4 <__fp_split3> 3ade4: 70 f3 brcs .-36 ; 0x3adc2 <__mulsf3+0x8> 0003ade6 <__mulsf3_pse>: 3ade6: 95 9f mul r25, r21 3ade8: c1 f3 breq .-16 ; 0x3adda <__mulsf3+0x20> 3adea: 95 0f add r25, r21 3adec: 50 e0 ldi r21, 0x00 ; 0 3adee: 55 1f adc r21, r21 3adf0: 62 9f mul r22, r18 3adf2: f0 01 movw r30, r0 3adf4: 72 9f mul r23, r18 3adf6: bb 27 eor r27, r27 3adf8: f0 0d add r31, r0 3adfa: b1 1d adc r27, r1 3adfc: 63 9f mul r22, r19 3adfe: aa 27 eor r26, r26 3ae00: f0 0d add r31, r0 3ae02: b1 1d adc r27, r1 3ae04: aa 1f adc r26, r26 3ae06: 64 9f mul r22, r20 3ae08: 66 27 eor r22, r22 3ae0a: b0 0d add r27, r0 3ae0c: a1 1d adc r26, r1 3ae0e: 66 1f adc r22, r22 3ae10: 82 9f mul r24, r18 3ae12: 22 27 eor r18, r18 3ae14: b0 0d add r27, r0 3ae16: a1 1d adc r26, r1 3ae18: 62 1f adc r22, r18 3ae1a: 73 9f mul r23, r19 3ae1c: b0 0d add r27, r0 3ae1e: a1 1d adc r26, r1 3ae20: 62 1f adc r22, r18 3ae22: 83 9f mul r24, r19 3ae24: a0 0d add r26, r0 3ae26: 61 1d adc r22, r1 3ae28: 22 1f adc r18, r18 3ae2a: 74 9f mul r23, r20 3ae2c: 33 27 eor r19, r19 3ae2e: a0 0d add r26, r0 3ae30: 61 1d adc r22, r1 3ae32: 23 1f adc r18, r19 3ae34: 84 9f mul r24, r20 3ae36: 60 0d add r22, r0 3ae38: 21 1d adc r18, r1 3ae3a: 82 2f mov r24, r18 3ae3c: 76 2f mov r23, r22 3ae3e: 6a 2f mov r22, r26 3ae40: 11 24 eor r1, r1 3ae42: 9f 57 subi r25, 0x7F ; 127 3ae44: 50 40 sbci r21, 0x00 ; 0 3ae46: 9a f0 brmi .+38 ; 0x3ae6e <__mulsf3_pse+0x88> 3ae48: f1 f0 breq .+60 ; 0x3ae86 <__mulsf3_pse+0xa0> 3ae4a: 88 23 and r24, r24 3ae4c: 4a f0 brmi .+18 ; 0x3ae60 <__mulsf3_pse+0x7a> 3ae4e: ee 0f add r30, r30 3ae50: ff 1f adc r31, r31 3ae52: bb 1f adc r27, r27 3ae54: 66 1f adc r22, r22 3ae56: 77 1f adc r23, r23 3ae58: 88 1f adc r24, r24 3ae5a: 91 50 subi r25, 0x01 ; 1 3ae5c: 50 40 sbci r21, 0x00 ; 0 3ae5e: a9 f7 brne .-22 ; 0x3ae4a <__mulsf3_pse+0x64> 3ae60: 9e 3f cpi r25, 0xFE ; 254 3ae62: 51 05 cpc r21, r1 3ae64: 80 f0 brcs .+32 ; 0x3ae86 <__mulsf3_pse+0xa0> 3ae66: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3ae6a: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3ae6e: 5f 3f cpi r21, 0xFF ; 255 3ae70: e4 f3 brlt .-8 ; 0x3ae6a <__mulsf3_pse+0x84> 3ae72: 98 3e cpi r25, 0xE8 ; 232 3ae74: d4 f3 brlt .-12 ; 0x3ae6a <__mulsf3_pse+0x84> 3ae76: 86 95 lsr r24 3ae78: 77 95 ror r23 3ae7a: 67 95 ror r22 3ae7c: b7 95 ror r27 3ae7e: f7 95 ror r31 3ae80: e7 95 ror r30 3ae82: 9f 5f subi r25, 0xFF ; 255 3ae84: c1 f7 brne .-16 ; 0x3ae76 <__mulsf3_pse+0x90> 3ae86: fe 2b or r31, r30 3ae88: 88 0f add r24, r24 3ae8a: 91 1d adc r25, r1 3ae8c: 96 95 lsr r25 3ae8e: 87 95 ror r24 3ae90: 97 f9 bld r25, 7 3ae92: 08 95 ret 0003ae94 <__fp_inf>: 3ae94: 97 f9 bld r25, 7 3ae96: 9f 67 ori r25, 0x7F ; 127 3ae98: 80 e8 ldi r24, 0x80 ; 128 3ae9a: 70 e0 ldi r23, 0x00 ; 0 3ae9c: 60 e0 ldi r22, 0x00 ; 0 3ae9e: 08 95 ret 0003aea0 <__fp_nan>: 3aea0: 9f ef ldi r25, 0xFF ; 255 3aea2: 80 ec ldi r24, 0xC0 ; 192 3aea4: 08 95 ret 0003aea6 <__fp_pscA>: 3aea6: 00 24 eor r0, r0 3aea8: 0a 94 dec r0 3aeaa: 16 16 cp r1, r22 3aeac: 17 06 cpc r1, r23 3aeae: 18 06 cpc r1, r24 3aeb0: 09 06 cpc r0, r25 3aeb2: 08 95 ret 0003aeb4 <__fp_pscB>: 3aeb4: 00 24 eor r0, r0 3aeb6: 0a 94 dec r0 3aeb8: 12 16 cp r1, r18 3aeba: 13 06 cpc r1, r19 3aebc: 14 06 cpc r1, r20 3aebe: 05 06 cpc r0, r21 3aec0: 08 95 ret 0003aec2 <__fp_round>: 3aec2: 09 2e mov r0, r25 3aec4: 03 94 inc r0 3aec6: 00 0c add r0, r0 3aec8: 11 f4 brne .+4 ; 0x3aece <__fp_round+0xc> 3aeca: 88 23 and r24, r24 3aecc: 52 f0 brmi .+20 ; 0x3aee2 <__fp_round+0x20> 3aece: bb 0f add r27, r27 3aed0: 40 f4 brcc .+16 ; 0x3aee2 <__fp_round+0x20> 3aed2: bf 2b or r27, r31 3aed4: 11 f4 brne .+4 ; 0x3aeda <__fp_round+0x18> 3aed6: 60 ff sbrs r22, 0 3aed8: 04 c0 rjmp .+8 ; 0x3aee2 <__fp_round+0x20> 3aeda: 6f 5f subi r22, 0xFF ; 255 3aedc: 7f 4f sbci r23, 0xFF ; 255 3aede: 8f 4f sbci r24, 0xFF ; 255 3aee0: 9f 4f sbci r25, 0xFF ; 255 3aee2: 08 95 ret 0003aee4 <__fp_split3>: 3aee4: 57 fd sbrc r21, 7 3aee6: 90 58 subi r25, 0x80 ; 128 3aee8: 44 0f add r20, r20 3aeea: 55 1f adc r21, r21 3aeec: 59 f0 breq .+22 ; 0x3af04 <__fp_splitA+0x10> 3aeee: 5f 3f cpi r21, 0xFF ; 255 3aef0: 71 f0 breq .+28 ; 0x3af0e <__fp_splitA+0x1a> 3aef2: 47 95 ror r20 0003aef4 <__fp_splitA>: 3aef4: 88 0f add r24, r24 3aef6: 97 fb bst r25, 7 3aef8: 99 1f adc r25, r25 3aefa: 61 f0 breq .+24 ; 0x3af14 <__fp_splitA+0x20> 3aefc: 9f 3f cpi r25, 0xFF ; 255 3aefe: 79 f0 breq .+30 ; 0x3af1e <__fp_splitA+0x2a> 3af00: 87 95 ror r24 3af02: 08 95 ret 3af04: 12 16 cp r1, r18 3af06: 13 06 cpc r1, r19 3af08: 14 06 cpc r1, r20 3af0a: 55 1f adc r21, r21 3af0c: f2 cf rjmp .-28 ; 0x3aef2 <__fp_split3+0xe> 3af0e: 46 95 lsr r20 3af10: f1 df rcall .-30 ; 0x3aef4 <__fp_splitA> 3af12: 08 c0 rjmp .+16 ; 0x3af24 <__fp_splitA+0x30> 3af14: 16 16 cp r1, r22 3af16: 17 06 cpc r1, r23 3af18: 18 06 cpc r1, r24 3af1a: 99 1f adc r25, r25 3af1c: f1 cf rjmp .-30 ; 0x3af00 <__fp_splitA+0xc> 3af1e: 86 95 lsr r24 3af20: 71 05 cpc r23, r1 3af22: 61 05 cpc r22, r1 3af24: 08 94 sec 3af26: 08 95 ret 0003af28 <__fp_zero>: 3af28: e8 94 clt 0003af2a <__fp_szero>: 3af2a: bb 27 eor r27, r27 3af2c: 66 27 eor r22, r22 3af2e: 77 27 eor r23, r23 3af30: cb 01 movw r24, r22 3af32: 97 f9 bld r25, 7 3af34: 08 95 ret 0003af36 : 3af36: 3f 92 push r3 3af38: 4f 92 push r4 3af3a: 5f 92 push r5 3af3c: 6f 92 push r6 3af3e: 7f 92 push r7 3af40: 8f 92 push r8 3af42: 9f 92 push r9 3af44: af 92 push r10 3af46: bf 92 push r11 3af48: cf 92 push r12 3af4a: df 92 push r13 3af4c: ef 92 push r14 3af4e: ff 92 push r15 3af50: 0f 93 push r16 3af52: 1f 93 push r17 3af54: cf 93 push r28 3af56: df 93 push r29 3af58: 5c 01 movw r10, r24 3af5a: 6b 01 movw r12, r22 3af5c: 7a 01 movw r14, r20 3af5e: 61 15 cp r22, r1 3af60: 71 05 cpc r23, r1 3af62: 19 f0 breq .+6 ; 0x3af6a 3af64: fb 01 movw r30, r22 3af66: 91 83 std Z+1, r25 ; 0x01 3af68: 80 83 st Z, r24 3af6a: e1 14 cp r14, r1 3af6c: f1 04 cpc r15, r1 3af6e: 51 f0 breq .+20 ; 0x3af84 3af70: c7 01 movw r24, r14 3af72: 02 97 sbiw r24, 0x02 ; 2 3af74: 83 97 sbiw r24, 0x23 ; 35 3af76: 30 f0 brcs .+12 ; 0x3af84 3af78: 40 e0 ldi r20, 0x00 ; 0 3af7a: 30 e0 ldi r19, 0x00 ; 0 3af7c: 20 e0 ldi r18, 0x00 ; 0 3af7e: 90 e0 ldi r25, 0x00 ; 0 3af80: 6b c0 rjmp .+214 ; 0x3b058 3af82: 5e 01 movw r10, r28 3af84: e5 01 movw r28, r10 3af86: 21 96 adiw r28, 0x01 ; 1 3af88: f5 01 movw r30, r10 3af8a: 10 81 ld r17, Z 3af8c: 81 2f mov r24, r17 3af8e: 90 e0 ldi r25, 0x00 ; 0 3af90: 0f 94 a1 d9 call 0x3b342 ; 0x3b342 3af94: 89 2b or r24, r25 3af96: a9 f7 brne .-22 ; 0x3af82 3af98: 1d 32 cpi r17, 0x2D ; 45 3af9a: 01 f5 brne .+64 ; 0x3afdc 3af9c: 21 96 adiw r28, 0x01 ; 1 3af9e: f5 01 movw r30, r10 3afa0: 11 81 ldd r17, Z+1 ; 0x01 3afa2: 01 e0 ldi r16, 0x01 ; 1 3afa4: e1 14 cp r14, r1 3afa6: f1 04 cpc r15, r1 3afa8: 09 f4 brne .+2 ; 0x3afac 3afaa: e6 c0 rjmp .+460 ; 0x3b178 3afac: f0 e1 ldi r31, 0x10 ; 16 3afae: ef 16 cp r14, r31 3afb0: f1 04 cpc r15, r1 3afb2: 09 f0 breq .+2 ; 0x3afb6 3afb4: 88 c0 rjmp .+272 ; 0x3b0c6 3afb6: 10 33 cpi r17, 0x30 ; 48 3afb8: 59 f4 brne .+22 ; 0x3afd0 3afba: 88 81 ld r24, Y 3afbc: 8f 7d andi r24, 0xDF ; 223 3afbe: 88 35 cpi r24, 0x58 ; 88 3afc0: 09 f0 breq .+2 ; 0x3afc4 3afc2: 7c c0 rjmp .+248 ; 0x3b0bc 3afc4: 19 81 ldd r17, Y+1 ; 0x01 3afc6: 22 96 adiw r28, 0x02 ; 2 3afc8: 02 60 ori r16, 0x02 ; 2 3afca: f0 e1 ldi r31, 0x10 ; 16 3afcc: ef 2e mov r14, r31 3afce: f1 2c mov r15, r1 3afd0: 81 2c mov r8, r1 3afd2: 91 2c mov r9, r1 3afd4: a1 2c mov r10, r1 3afd6: 88 e0 ldi r24, 0x08 ; 8 3afd8: b8 2e mov r11, r24 3afda: 92 c0 rjmp .+292 ; 0x3b100 3afdc: 1b 32 cpi r17, 0x2B ; 43 3afde: 21 f4 brne .+8 ; 0x3afe8 3afe0: e5 01 movw r28, r10 3afe2: 22 96 adiw r28, 0x02 ; 2 3afe4: f5 01 movw r30, r10 3afe6: 11 81 ldd r17, Z+1 ; 0x01 3afe8: 00 e0 ldi r16, 0x00 ; 0 3afea: dc cf rjmp .-72 ; 0x3afa4 3afec: ea e0 ldi r30, 0x0A ; 10 3afee: ee 16 cp r14, r30 3aff0: f1 04 cpc r15, r1 3aff2: 09 f4 brne .+2 ; 0x3aff6 3aff4: c7 c0 rjmp .+398 ; 0x3b184 3aff6: f0 e1 ldi r31, 0x10 ; 16 3aff8: ef 16 cp r14, r31 3affa: f1 04 cpc r15, r1 3affc: 09 f0 breq .+2 ; 0x3b000 3affe: 73 c0 rjmp .+230 ; 0x3b0e6 3b000: e7 cf rjmp .-50 ; 0x3afd0 3b002: 78 e0 ldi r23, 0x08 ; 8 3b004: e7 2e mov r14, r23 3b006: f1 2c mov r15, r1 3b008: 81 2c mov r8, r1 3b00a: 91 2c mov r9, r1 3b00c: a1 2c mov r10, r1 3b00e: 60 e1 ldi r22, 0x10 ; 16 3b010: b6 2e mov r11, r22 3b012: 76 c0 rjmp .+236 ; 0x3b100 3b014: 21 e0 ldi r18, 0x01 ; 1 3b016: ad c0 rjmp .+346 ; 0x3b172 3b018: 30 2f mov r19, r16 3b01a: 31 70 andi r19, 0x01 ; 1 3b01c: c1 14 cp r12, r1 3b01e: d1 04 cpc r13, r1 3b020: 31 f0 breq .+12 ; 0x3b02e 3b022: 22 23 and r18, r18 3b024: 71 f1 breq .+92 ; 0x3b082 3b026: 21 97 sbiw r28, 0x01 ; 1 3b028: f6 01 movw r30, r12 3b02a: d1 83 std Z+1, r29 ; 0x01 3b02c: c0 83 st Z, r28 3b02e: 27 ff sbrs r18, 7 3b030: 2e c0 rjmp .+92 ; 0x3b08e 3b032: 60 e0 ldi r22, 0x00 ; 0 3b034: 70 e0 ldi r23, 0x00 ; 0 3b036: 80 e0 ldi r24, 0x00 ; 0 3b038: 90 e8 ldi r25, 0x80 ; 128 3b03a: 31 11 cpse r19, r1 3b03c: 04 c0 rjmp .+8 ; 0x3b046 3b03e: 6f ef ldi r22, 0xFF ; 255 3b040: 7f ef ldi r23, 0xFF ; 255 3b042: 8f ef ldi r24, 0xFF ; 255 3b044: 9f e7 ldi r25, 0x7F ; 127 3b046: 22 e2 ldi r18, 0x22 ; 34 3b048: 30 e0 ldi r19, 0x00 ; 0 3b04a: 30 93 14 18 sts 0x1814, r19 ; 0x801814 3b04e: 20 93 13 18 sts 0x1813, r18 ; 0x801813 3b052: 46 2f mov r20, r22 3b054: 37 2f mov r19, r23 3b056: 28 2f mov r18, r24 3b058: 64 2f mov r22, r20 3b05a: 73 2f mov r23, r19 3b05c: 82 2f mov r24, r18 3b05e: df 91 pop r29 3b060: cf 91 pop r28 3b062: 1f 91 pop r17 3b064: 0f 91 pop r16 3b066: ff 90 pop r15 3b068: ef 90 pop r14 3b06a: df 90 pop r13 3b06c: cf 90 pop r12 3b06e: bf 90 pop r11 3b070: af 90 pop r10 3b072: 9f 90 pop r9 3b074: 8f 90 pop r8 3b076: 7f 90 pop r7 3b078: 6f 90 pop r6 3b07a: 5f 90 pop r5 3b07c: 4f 90 pop r4 3b07e: 3f 90 pop r3 3b080: 08 95 ret 3b082: 01 ff sbrs r16, 1 3b084: 04 c0 rjmp .+8 ; 0x3b08e 3b086: 22 97 sbiw r28, 0x02 ; 2 3b088: f6 01 movw r30, r12 3b08a: d1 83 std Z+1, r29 ; 0x01 3b08c: c0 83 st Z, r28 3b08e: 33 23 and r19, r19 3b090: 41 f0 breq .+16 ; 0x3b0a2 3b092: 90 95 com r25 3b094: 80 95 com r24 3b096: 70 95 com r23 3b098: 61 95 neg r22 3b09a: 7f 4f sbci r23, 0xFF ; 255 3b09c: 8f 4f sbci r24, 0xFF ; 255 3b09e: 9f 4f sbci r25, 0xFF ; 255 3b0a0: d8 cf rjmp .-80 ; 0x3b052 3b0a2: 97 ff sbrs r25, 7 3b0a4: d6 cf rjmp .-84 ; 0x3b052 3b0a6: 82 e2 ldi r24, 0x22 ; 34 3b0a8: 90 e0 ldi r25, 0x00 ; 0 3b0aa: 90 93 14 18 sts 0x1814, r25 ; 0x801814 3b0ae: 80 93 13 18 sts 0x1813, r24 ; 0x801813 3b0b2: 6f ef ldi r22, 0xFF ; 255 3b0b4: 7f ef ldi r23, 0xFF ; 255 3b0b6: 8f ef ldi r24, 0xFF ; 255 3b0b8: 9f e7 ldi r25, 0x7F ; 127 3b0ba: cb cf rjmp .-106 ; 0x3b052 3b0bc: 10 e3 ldi r17, 0x30 ; 48 3b0be: e1 14 cp r14, r1 3b0c0: f1 04 cpc r15, r1 3b0c2: 09 f4 brne .+2 ; 0x3b0c6 3b0c4: 9e cf rjmp .-196 ; 0x3b002 3b0c6: 28 e0 ldi r18, 0x08 ; 8 3b0c8: e2 16 cp r14, r18 3b0ca: f1 04 cpc r15, r1 3b0cc: 09 f4 brne .+2 ; 0x3b0d0 3b0ce: 9c cf rjmp .-200 ; 0x3b008 3b0d0: 0c f0 brlt .+2 ; 0x3b0d4 3b0d2: 8c cf rjmp .-232 ; 0x3afec 3b0d4: 81 2c mov r8, r1 3b0d6: 91 2c mov r9, r1 3b0d8: a1 2c mov r10, r1 3b0da: e0 e4 ldi r30, 0x40 ; 64 3b0dc: be 2e mov r11, r30 3b0de: 82 e0 ldi r24, 0x02 ; 2 3b0e0: e8 16 cp r14, r24 3b0e2: f1 04 cpc r15, r1 3b0e4: 69 f0 breq .+26 ; 0x3b100 3b0e6: 60 e0 ldi r22, 0x00 ; 0 3b0e8: 70 e0 ldi r23, 0x00 ; 0 3b0ea: 80 e0 ldi r24, 0x00 ; 0 3b0ec: 90 e8 ldi r25, 0x80 ; 128 3b0ee: 97 01 movw r18, r14 3b0f0: 0f 2c mov r0, r15 3b0f2: 00 0c add r0, r0 3b0f4: 44 0b sbc r20, r20 3b0f6: 55 0b sbc r21, r21 3b0f8: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 3b0fc: 49 01 movw r8, r18 3b0fe: 5a 01 movw r10, r20 3b100: 20 e0 ldi r18, 0x00 ; 0 3b102: 60 e0 ldi r22, 0x00 ; 0 3b104: 70 e0 ldi r23, 0x00 ; 0 3b106: cb 01 movw r24, r22 3b108: 27 01 movw r4, r14 3b10a: 0f 2c mov r0, r15 3b10c: 00 0c add r0, r0 3b10e: 66 08 sbc r6, r6 3b110: 77 08 sbc r7, r7 3b112: fe 01 movw r30, r28 3b114: 50 ed ldi r21, 0xD0 ; 208 3b116: 35 2e mov r3, r21 3b118: 31 0e add r3, r17 3b11a: 39 e0 ldi r19, 0x09 ; 9 3b11c: 33 15 cp r19, r3 3b11e: 70 f4 brcc .+28 ; 0x3b13c 3b120: 3f eb ldi r19, 0xBF ; 191 3b122: 31 0f add r19, r17 3b124: 49 ec ldi r20, 0xC9 ; 201 3b126: 34 2e mov r3, r20 3b128: 3a 31 cpi r19, 0x1A ; 26 3b12a: 38 f0 brcs .+14 ; 0x3b13a 3b12c: 3f e9 ldi r19, 0x9F ; 159 3b12e: 31 0f add r19, r17 3b130: 3a 31 cpi r19, 0x1A ; 26 3b132: 08 f0 brcs .+2 ; 0x3b136 3b134: 71 cf rjmp .-286 ; 0x3b018 3b136: 39 ea ldi r19, 0xA9 ; 169 3b138: 33 2e mov r3, r19 3b13a: 31 0e add r3, r17 3b13c: 3e 14 cp r3, r14 3b13e: 1f 04 cpc r1, r15 3b140: 0c f0 brlt .+2 ; 0x3b144 3b142: 6a cf rjmp .-300 ; 0x3b018 3b144: 27 fd sbrc r18, 7 3b146: 15 c0 rjmp .+42 ; 0x3b172 3b148: 86 16 cp r8, r22 3b14a: 97 06 cpc r9, r23 3b14c: a8 06 cpc r10, r24 3b14e: b9 06 cpc r11, r25 3b150: 78 f0 brcs .+30 ; 0x3b170 3b152: a3 01 movw r20, r6 3b154: 92 01 movw r18, r4 3b156: 0f 94 73 dc call 0x3b8e6 ; 0x3b8e6 <__mulsi3> 3b15a: 63 0d add r22, r3 3b15c: 71 1d adc r23, r1 3b15e: 81 1d adc r24, r1 3b160: 91 1d adc r25, r1 3b162: 61 30 cpi r22, 0x01 ; 1 3b164: 71 05 cpc r23, r1 3b166: 81 05 cpc r24, r1 3b168: 20 e8 ldi r18, 0x80 ; 128 3b16a: 92 07 cpc r25, r18 3b16c: 08 f4 brcc .+2 ; 0x3b170 3b16e: 52 cf rjmp .-348 ; 0x3b014 3b170: 2f ef ldi r18, 0xFF ; 255 3b172: 21 96 adiw r28, 0x01 ; 1 3b174: 10 81 ld r17, Z 3b176: cd cf rjmp .-102 ; 0x3b112 3b178: 10 33 cpi r17, 0x30 ; 48 3b17a: 09 f4 brne .+2 ; 0x3b17e 3b17c: 1e cf rjmp .-452 ; 0x3afba 3b17e: 2a e0 ldi r18, 0x0A ; 10 3b180: e2 2e mov r14, r18 3b182: f1 2c mov r15, r1 3b184: 9c ec ldi r25, 0xCC ; 204 3b186: 89 2e mov r8, r25 3b188: 98 2c mov r9, r8 3b18a: a8 2c mov r10, r8 3b18c: 9c e0 ldi r25, 0x0C ; 12 3b18e: b9 2e mov r11, r25 3b190: b7 cf rjmp .-146 ; 0x3b100 0003b192 <__ftoa_engine>: 3b192: 28 30 cpi r18, 0x08 ; 8 3b194: 08 f0 brcs .+2 ; 0x3b198 <__ftoa_engine+0x6> 3b196: 27 e0 ldi r18, 0x07 ; 7 3b198: 33 27 eor r19, r19 3b19a: da 01 movw r26, r20 3b19c: 99 0f add r25, r25 3b19e: 31 1d adc r19, r1 3b1a0: 87 fd sbrc r24, 7 3b1a2: 91 60 ori r25, 0x01 ; 1 3b1a4: 00 96 adiw r24, 0x00 ; 0 3b1a6: 61 05 cpc r22, r1 3b1a8: 71 05 cpc r23, r1 3b1aa: 39 f4 brne .+14 ; 0x3b1ba <__ftoa_engine+0x28> 3b1ac: 32 60 ori r19, 0x02 ; 2 3b1ae: 2e 5f subi r18, 0xFE ; 254 3b1b0: 3d 93 st X+, r19 3b1b2: 30 e3 ldi r19, 0x30 ; 48 3b1b4: 2a 95 dec r18 3b1b6: e1 f7 brne .-8 ; 0x3b1b0 <__ftoa_engine+0x1e> 3b1b8: 08 95 ret 3b1ba: 9f 3f cpi r25, 0xFF ; 255 3b1bc: 30 f0 brcs .+12 ; 0x3b1ca <__ftoa_engine+0x38> 3b1be: 80 38 cpi r24, 0x80 ; 128 3b1c0: 71 05 cpc r23, r1 3b1c2: 61 05 cpc r22, r1 3b1c4: 09 f0 breq .+2 ; 0x3b1c8 <__ftoa_engine+0x36> 3b1c6: 3c 5f subi r19, 0xFC ; 252 3b1c8: 3c 5f subi r19, 0xFC ; 252 3b1ca: 3d 93 st X+, r19 3b1cc: 91 30 cpi r25, 0x01 ; 1 3b1ce: 08 f0 brcs .+2 ; 0x3b1d2 <__ftoa_engine+0x40> 3b1d0: 80 68 ori r24, 0x80 ; 128 3b1d2: 91 1d adc r25, r1 3b1d4: df 93 push r29 3b1d6: cf 93 push r28 3b1d8: 1f 93 push r17 3b1da: 0f 93 push r16 3b1dc: ff 92 push r15 3b1de: ef 92 push r14 3b1e0: 19 2f mov r17, r25 3b1e2: 98 7f andi r25, 0xF8 ; 248 3b1e4: 96 95 lsr r25 3b1e6: e9 2f mov r30, r25 3b1e8: 96 95 lsr r25 3b1ea: 96 95 lsr r25 3b1ec: e9 0f add r30, r25 3b1ee: ff 27 eor r31, r31 3b1f0: e2 5c subi r30, 0xC2 ; 194 3b1f2: f9 48 sbci r31, 0x89 ; 137 3b1f4: 99 27 eor r25, r25 3b1f6: 33 27 eor r19, r19 3b1f8: ee 24 eor r14, r14 3b1fa: ff 24 eor r15, r15 3b1fc: a7 01 movw r20, r14 3b1fe: e7 01 movw r28, r14 3b200: 05 90 lpm r0, Z+ 3b202: 08 94 sec 3b204: 07 94 ror r0 3b206: 28 f4 brcc .+10 ; 0x3b212 <__ftoa_engine+0x80> 3b208: 36 0f add r19, r22 3b20a: e7 1e adc r14, r23 3b20c: f8 1e adc r15, r24 3b20e: 49 1f adc r20, r25 3b210: 51 1d adc r21, r1 3b212: 66 0f add r22, r22 3b214: 77 1f adc r23, r23 3b216: 88 1f adc r24, r24 3b218: 99 1f adc r25, r25 3b21a: 06 94 lsr r0 3b21c: a1 f7 brne .-24 ; 0x3b206 <__ftoa_engine+0x74> 3b21e: 05 90 lpm r0, Z+ 3b220: 07 94 ror r0 3b222: 28 f4 brcc .+10 ; 0x3b22e <__ftoa_engine+0x9c> 3b224: e7 0e add r14, r23 3b226: f8 1e adc r15, r24 3b228: 49 1f adc r20, r25 3b22a: 56 1f adc r21, r22 3b22c: c1 1d adc r28, r1 3b22e: 77 0f add r23, r23 3b230: 88 1f adc r24, r24 3b232: 99 1f adc r25, r25 3b234: 66 1f adc r22, r22 3b236: 06 94 lsr r0 3b238: a1 f7 brne .-24 ; 0x3b222 <__ftoa_engine+0x90> 3b23a: 05 90 lpm r0, Z+ 3b23c: 07 94 ror r0 3b23e: 28 f4 brcc .+10 ; 0x3b24a <__ftoa_engine+0xb8> 3b240: f8 0e add r15, r24 3b242: 49 1f adc r20, r25 3b244: 56 1f adc r21, r22 3b246: c7 1f adc r28, r23 3b248: d1 1d adc r29, r1 3b24a: 88 0f add r24, r24 3b24c: 99 1f adc r25, r25 3b24e: 66 1f adc r22, r22 3b250: 77 1f adc r23, r23 3b252: 06 94 lsr r0 3b254: a1 f7 brne .-24 ; 0x3b23e <__ftoa_engine+0xac> 3b256: 05 90 lpm r0, Z+ 3b258: 07 94 ror r0 3b25a: 20 f4 brcc .+8 ; 0x3b264 <__ftoa_engine+0xd2> 3b25c: 49 0f add r20, r25 3b25e: 56 1f adc r21, r22 3b260: c7 1f adc r28, r23 3b262: d8 1f adc r29, r24 3b264: 99 0f add r25, r25 3b266: 66 1f adc r22, r22 3b268: 77 1f adc r23, r23 3b26a: 88 1f adc r24, r24 3b26c: 06 94 lsr r0 3b26e: a9 f7 brne .-22 ; 0x3b25a <__ftoa_engine+0xc8> 3b270: 84 91 lpm r24, Z 3b272: 10 95 com r17 3b274: 17 70 andi r17, 0x07 ; 7 3b276: 41 f0 breq .+16 ; 0x3b288 <__ftoa_engine+0xf6> 3b278: d6 95 lsr r29 3b27a: c7 95 ror r28 3b27c: 57 95 ror r21 3b27e: 47 95 ror r20 3b280: f7 94 ror r15 3b282: e7 94 ror r14 3b284: 1a 95 dec r17 3b286: c1 f7 brne .-16 ; 0x3b278 <__ftoa_engine+0xe6> 3b288: e4 ee ldi r30, 0xE4 ; 228 3b28a: f5 e7 ldi r31, 0x75 ; 117 3b28c: 68 94 set 3b28e: 15 90 lpm r1, Z+ 3b290: 15 91 lpm r17, Z+ 3b292: 35 91 lpm r19, Z+ 3b294: 65 91 lpm r22, Z+ 3b296: 95 91 lpm r25, Z+ 3b298: 05 90 lpm r0, Z+ 3b29a: 7f e2 ldi r23, 0x2F ; 47 3b29c: 73 95 inc r23 3b29e: e1 18 sub r14, r1 3b2a0: f1 0a sbc r15, r17 3b2a2: 43 0b sbc r20, r19 3b2a4: 56 0b sbc r21, r22 3b2a6: c9 0b sbc r28, r25 3b2a8: d0 09 sbc r29, r0 3b2aa: c0 f7 brcc .-16 ; 0x3b29c <__ftoa_engine+0x10a> 3b2ac: e1 0c add r14, r1 3b2ae: f1 1e adc r15, r17 3b2b0: 43 1f adc r20, r19 3b2b2: 56 1f adc r21, r22 3b2b4: c9 1f adc r28, r25 3b2b6: d0 1d adc r29, r0 3b2b8: 7e f4 brtc .+30 ; 0x3b2d8 <__ftoa_engine+0x146> 3b2ba: 70 33 cpi r23, 0x30 ; 48 3b2bc: 11 f4 brne .+4 ; 0x3b2c2 <__ftoa_engine+0x130> 3b2be: 8a 95 dec r24 3b2c0: e6 cf rjmp .-52 ; 0x3b28e <__ftoa_engine+0xfc> 3b2c2: e8 94 clt 3b2c4: 01 50 subi r16, 0x01 ; 1 3b2c6: 30 f0 brcs .+12 ; 0x3b2d4 <__ftoa_engine+0x142> 3b2c8: 08 0f add r16, r24 3b2ca: 0a f4 brpl .+2 ; 0x3b2ce <__ftoa_engine+0x13c> 3b2cc: 00 27 eor r16, r16 3b2ce: 02 17 cp r16, r18 3b2d0: 08 f4 brcc .+2 ; 0x3b2d4 <__ftoa_engine+0x142> 3b2d2: 20 2f mov r18, r16 3b2d4: 23 95 inc r18 3b2d6: 02 2f mov r16, r18 3b2d8: 7a 33 cpi r23, 0x3A ; 58 3b2da: 28 f0 brcs .+10 ; 0x3b2e6 <__ftoa_engine+0x154> 3b2dc: 79 e3 ldi r23, 0x39 ; 57 3b2de: 7d 93 st X+, r23 3b2e0: 2a 95 dec r18 3b2e2: e9 f7 brne .-6 ; 0x3b2de <__ftoa_engine+0x14c> 3b2e4: 10 c0 rjmp .+32 ; 0x3b306 <__ftoa_engine+0x174> 3b2e6: 7d 93 st X+, r23 3b2e8: 2a 95 dec r18 3b2ea: 89 f6 brne .-94 ; 0x3b28e <__ftoa_engine+0xfc> 3b2ec: 06 94 lsr r0 3b2ee: 97 95 ror r25 3b2f0: 67 95 ror r22 3b2f2: 37 95 ror r19 3b2f4: 17 95 ror r17 3b2f6: 17 94 ror r1 3b2f8: e1 18 sub r14, r1 3b2fa: f1 0a sbc r15, r17 3b2fc: 43 0b sbc r20, r19 3b2fe: 56 0b sbc r21, r22 3b300: c9 0b sbc r28, r25 3b302: d0 09 sbc r29, r0 3b304: 98 f0 brcs .+38 ; 0x3b32c <__ftoa_engine+0x19a> 3b306: 23 95 inc r18 3b308: 7e 91 ld r23, -X 3b30a: 73 95 inc r23 3b30c: 7a 33 cpi r23, 0x3A ; 58 3b30e: 08 f0 brcs .+2 ; 0x3b312 <__ftoa_engine+0x180> 3b310: 70 e3 ldi r23, 0x30 ; 48 3b312: 7c 93 st X, r23 3b314: 20 13 cpse r18, r16 3b316: b8 f7 brcc .-18 ; 0x3b306 <__ftoa_engine+0x174> 3b318: 7e 91 ld r23, -X 3b31a: 70 61 ori r23, 0x10 ; 16 3b31c: 7d 93 st X+, r23 3b31e: 30 f0 brcs .+12 ; 0x3b32c <__ftoa_engine+0x19a> 3b320: 83 95 inc r24 3b322: 71 e3 ldi r23, 0x31 ; 49 3b324: 7d 93 st X+, r23 3b326: 70 e3 ldi r23, 0x30 ; 48 3b328: 2a 95 dec r18 3b32a: e1 f7 brne .-8 ; 0x3b324 <__ftoa_engine+0x192> 3b32c: 11 24 eor r1, r1 3b32e: ef 90 pop r14 3b330: ff 90 pop r15 3b332: 0f 91 pop r16 3b334: 1f 91 pop r17 3b336: cf 91 pop r28 3b338: df 91 pop r29 3b33a: 99 27 eor r25, r25 3b33c: 87 fd sbrc r24, 7 3b33e: 90 95 com r25 3b340: 08 95 ret 0003b342 : 3b342: 91 11 cpse r25, r1 3b344: 0d 94 fd db jmp 0x3b7fa ; 0x3b7fa <__ctype_isfalse> 3b348: 80 32 cpi r24, 0x20 ; 32 3b34a: 19 f0 breq .+6 ; 0x3b352 3b34c: 89 50 subi r24, 0x09 ; 9 3b34e: 85 50 subi r24, 0x05 ; 5 3b350: c8 f7 brcc .-14 ; 0x3b344 3b352: 08 95 ret 0003b354 : 3b354: fb 01 movw r30, r22 3b356: dc 01 movw r26, r24 3b358: 02 c0 rjmp .+4 ; 0x3b35e 3b35a: 05 90 lpm r0, Z+ 3b35c: 0d 92 st X+, r0 3b35e: 41 50 subi r20, 0x01 ; 1 3b360: 50 40 sbci r21, 0x00 ; 0 3b362: d8 f7 brcc .-10 ; 0x3b35a 3b364: 08 95 ret 0003b366 : 3b366: fb 01 movw r30, r22 3b368: dc 01 movw r26, r24 3b36a: 0d 90 ld r0, X+ 3b36c: 00 20 and r0, r0 3b36e: e9 f7 brne .-6 ; 0x3b36a 3b370: 11 97 sbiw r26, 0x01 ; 1 3b372: 05 90 lpm r0, Z+ 3b374: 0d 92 st X+, r0 3b376: 00 20 and r0, r0 3b378: e1 f7 brne .-8 ; 0x3b372 3b37a: 08 95 ret 0003b37c : 3b37c: fb 01 movw r30, r22 3b37e: dc 01 movw r26, r24 3b380: 8d 91 ld r24, X+ 3b382: 05 90 lpm r0, Z+ 3b384: 80 19 sub r24, r0 3b386: 01 10 cpse r0, r1 3b388: d9 f3 breq .-10 ; 0x3b380 3b38a: 99 0b sbc r25, r25 3b38c: 08 95 ret 0003b38e : 3b38e: fb 01 movw r30, r22 3b390: dc 01 movw r26, r24 3b392: 05 90 lpm r0, Z+ 3b394: 0d 92 st X+, r0 3b396: 00 20 and r0, r0 3b398: e1 f7 brne .-8 ; 0x3b392 3b39a: 08 95 ret 0003b39c <__strlen_P>: 3b39c: fc 01 movw r30, r24 3b39e: 05 90 lpm r0, Z+ 3b3a0: 00 20 and r0, r0 3b3a2: e9 f7 brne .-6 ; 0x3b39e <__strlen_P+0x2> 3b3a4: 80 95 com r24 3b3a6: 90 95 com r25 3b3a8: 8e 0f add r24, r30 3b3aa: 9f 1f adc r25, r31 3b3ac: 08 95 ret 0003b3ae : 3b3ae: fb 01 movw r30, r22 3b3b0: dc 01 movw r26, r24 3b3b2: 41 50 subi r20, 0x01 ; 1 3b3b4: 50 40 sbci r21, 0x00 ; 0 3b3b6: 88 f0 brcs .+34 ; 0x3b3da 3b3b8: 8d 91 ld r24, X+ 3b3ba: 81 34 cpi r24, 0x41 ; 65 3b3bc: 1c f0 brlt .+6 ; 0x3b3c4 3b3be: 8b 35 cpi r24, 0x5B ; 91 3b3c0: 0c f4 brge .+2 ; 0x3b3c4 3b3c2: 80 5e subi r24, 0xE0 ; 224 3b3c4: 65 91 lpm r22, Z+ 3b3c6: 61 34 cpi r22, 0x41 ; 65 3b3c8: 1c f0 brlt .+6 ; 0x3b3d0 3b3ca: 6b 35 cpi r22, 0x5B ; 91 3b3cc: 0c f4 brge .+2 ; 0x3b3d0 3b3ce: 60 5e subi r22, 0xE0 ; 224 3b3d0: 86 1b sub r24, r22 3b3d2: 61 11 cpse r22, r1 3b3d4: 71 f3 breq .-36 ; 0x3b3b2 3b3d6: 99 0b sbc r25, r25 3b3d8: 08 95 ret 3b3da: 88 1b sub r24, r24 3b3dc: fc cf rjmp .-8 ; 0x3b3d6 0003b3de : 3b3de: fb 01 movw r30, r22 3b3e0: dc 01 movw r26, r24 3b3e2: 41 50 subi r20, 0x01 ; 1 3b3e4: 50 40 sbci r21, 0x00 ; 0 3b3e6: 30 f0 brcs .+12 ; 0x3b3f4 3b3e8: 8d 91 ld r24, X+ 3b3ea: 05 90 lpm r0, Z+ 3b3ec: 80 19 sub r24, r0 3b3ee: 19 f4 brne .+6 ; 0x3b3f6 3b3f0: 00 20 and r0, r0 3b3f2: b9 f7 brne .-18 ; 0x3b3e2 3b3f4: 88 1b sub r24, r24 3b3f6: 99 0b sbc r25, r25 3b3f8: 08 95 ret 0003b3fa : 3b3fa: fb 01 movw r30, r22 3b3fc: dc 01 movw r26, r24 3b3fe: 41 50 subi r20, 0x01 ; 1 3b400: 50 40 sbci r21, 0x00 ; 0 3b402: 48 f0 brcs .+18 ; 0x3b416 3b404: 05 90 lpm r0, Z+ 3b406: 0d 92 st X+, r0 3b408: 00 20 and r0, r0 3b40a: c9 f7 brne .-14 ; 0x3b3fe 3b40c: 01 c0 rjmp .+2 ; 0x3b410 3b40e: 1d 92 st X+, r1 3b410: 41 50 subi r20, 0x01 ; 1 3b412: 50 40 sbci r21, 0x00 ; 0 3b414: e0 f7 brcc .-8 ; 0x3b40e 3b416: 08 95 ret 0003b418 : 3b418: fc 01 movw r30, r24 3b41a: 05 90 lpm r0, Z+ 3b41c: 61 50 subi r22, 0x01 ; 1 3b41e: 70 40 sbci r23, 0x00 ; 0 3b420: 01 10 cpse r0, r1 3b422: d8 f7 brcc .-10 ; 0x3b41a 3b424: 80 95 com r24 3b426: 90 95 com r25 3b428: 8e 0f add r24, r30 3b42a: 9f 1f adc r25, r31 3b42c: 08 95 ret 0003b42e : 3b42e: fb 01 movw r30, r22 3b430: 55 91 lpm r21, Z+ 3b432: 55 23 and r21, r21 3b434: a9 f0 breq .+42 ; 0x3b460 3b436: bf 01 movw r22, r30 3b438: dc 01 movw r26, r24 3b43a: 4d 91 ld r20, X+ 3b43c: 45 17 cp r20, r21 3b43e: 41 11 cpse r20, r1 3b440: e1 f7 brne .-8 ; 0x3b43a 3b442: 59 f4 brne .+22 ; 0x3b45a 3b444: cd 01 movw r24, r26 3b446: 05 90 lpm r0, Z+ 3b448: 00 20 and r0, r0 3b44a: 49 f0 breq .+18 ; 0x3b45e 3b44c: 4d 91 ld r20, X+ 3b44e: 40 15 cp r20, r0 3b450: 41 11 cpse r20, r1 3b452: c9 f3 breq .-14 ; 0x3b446 3b454: fb 01 movw r30, r22 3b456: 41 11 cpse r20, r1 3b458: ef cf rjmp .-34 ; 0x3b438 3b45a: 81 e0 ldi r24, 0x01 ; 1 3b45c: 90 e0 ldi r25, 0x00 ; 0 3b45e: 01 97 sbiw r24, 0x01 ; 1 3b460: 08 95 ret 0003b462 : 3b462: fc 01 movw r30, r24 3b464: 61 50 subi r22, 0x01 ; 1 3b466: 70 40 sbci r23, 0x00 ; 0 3b468: 01 90 ld r0, Z+ 3b46a: 01 10 cpse r0, r1 3b46c: d8 f7 brcc .-10 ; 0x3b464 3b46e: 80 95 com r24 3b470: 90 95 com r25 3b472: 8e 0f add r24, r30 3b474: 9f 1f adc r25, r31 3b476: 08 95 ret 0003b478 : 3b478: cf 93 push r28 3b47a: df 93 push r29 3b47c: ec 01 movw r28, r24 3b47e: 2b 81 ldd r18, Y+3 ; 0x03 3b480: 20 ff sbrs r18, 0 3b482: 1a c0 rjmp .+52 ; 0x3b4b8 3b484: 26 ff sbrs r18, 6 3b486: 0c c0 rjmp .+24 ; 0x3b4a0 3b488: 2f 7b andi r18, 0xBF ; 191 3b48a: 2b 83 std Y+3, r18 ; 0x03 3b48c: 8e 81 ldd r24, Y+6 ; 0x06 3b48e: 9f 81 ldd r25, Y+7 ; 0x07 3b490: 01 96 adiw r24, 0x01 ; 1 3b492: 9f 83 std Y+7, r25 ; 0x07 3b494: 8e 83 std Y+6, r24 ; 0x06 3b496: 8a 81 ldd r24, Y+2 ; 0x02 3b498: 90 e0 ldi r25, 0x00 ; 0 3b49a: df 91 pop r29 3b49c: cf 91 pop r28 3b49e: 08 95 ret 3b4a0: 22 ff sbrs r18, 2 3b4a2: 18 c0 rjmp .+48 ; 0x3b4d4 3b4a4: e8 81 ld r30, Y 3b4a6: f9 81 ldd r31, Y+1 ; 0x01 3b4a8: 80 81 ld r24, Z 3b4aa: 08 2e mov r0, r24 3b4ac: 00 0c add r0, r0 3b4ae: 99 0b sbc r25, r25 3b4b0: 00 97 sbiw r24, 0x00 ; 0 3b4b2: 29 f4 brne .+10 ; 0x3b4be 3b4b4: 20 62 ori r18, 0x20 ; 32 3b4b6: 2b 83 std Y+3, r18 ; 0x03 3b4b8: 8f ef ldi r24, 0xFF ; 255 3b4ba: 9f ef ldi r25, 0xFF ; 255 3b4bc: ee cf rjmp .-36 ; 0x3b49a 3b4be: 31 96 adiw r30, 0x01 ; 1 3b4c0: f9 83 std Y+1, r31 ; 0x01 3b4c2: e8 83 st Y, r30 3b4c4: 2e 81 ldd r18, Y+6 ; 0x06 3b4c6: 3f 81 ldd r19, Y+7 ; 0x07 3b4c8: 2f 5f subi r18, 0xFF ; 255 3b4ca: 3f 4f sbci r19, 0xFF ; 255 3b4cc: 3f 83 std Y+7, r19 ; 0x07 3b4ce: 2e 83 std Y+6, r18 ; 0x06 3b4d0: 99 27 eor r25, r25 3b4d2: e3 cf rjmp .-58 ; 0x3b49a 3b4d4: ea 85 ldd r30, Y+10 ; 0x0a 3b4d6: fb 85 ldd r31, Y+11 ; 0x0b 3b4d8: 19 95 eicall 3b4da: 97 ff sbrs r25, 7 3b4dc: f3 cf rjmp .-26 ; 0x3b4c4 3b4de: 2b 81 ldd r18, Y+3 ; 0x03 3b4e0: 01 96 adiw r24, 0x01 ; 1 3b4e2: 21 f0 breq .+8 ; 0x3b4ec 3b4e4: 80 e2 ldi r24, 0x20 ; 32 3b4e6: 82 2b or r24, r18 3b4e8: 8b 83 std Y+3, r24 ; 0x03 3b4ea: e6 cf rjmp .-52 ; 0x3b4b8 3b4ec: 80 e1 ldi r24, 0x10 ; 16 3b4ee: fb cf rjmp .-10 ; 0x3b4e6 0003b4f0 : 3b4f0: 0f 93 push r16 3b4f2: 1f 93 push r17 3b4f4: cf 93 push r28 3b4f6: df 93 push r29 3b4f8: 18 2f mov r17, r24 3b4fa: 09 2f mov r16, r25 3b4fc: eb 01 movw r28, r22 3b4fe: 8b 81 ldd r24, Y+3 ; 0x03 3b500: 81 fd sbrc r24, 1 3b502: 09 c0 rjmp .+18 ; 0x3b516 3b504: 1f ef ldi r17, 0xFF ; 255 3b506: 0f ef ldi r16, 0xFF ; 255 3b508: 81 2f mov r24, r17 3b50a: 90 2f mov r25, r16 3b50c: df 91 pop r29 3b50e: cf 91 pop r28 3b510: 1f 91 pop r17 3b512: 0f 91 pop r16 3b514: 08 95 ret 3b516: 82 ff sbrs r24, 2 3b518: 14 c0 rjmp .+40 ; 0x3b542 3b51a: 2e 81 ldd r18, Y+6 ; 0x06 3b51c: 3f 81 ldd r19, Y+7 ; 0x07 3b51e: 8c 81 ldd r24, Y+4 ; 0x04 3b520: 9d 81 ldd r25, Y+5 ; 0x05 3b522: 28 17 cp r18, r24 3b524: 39 07 cpc r19, r25 3b526: 3c f4 brge .+14 ; 0x3b536 3b528: e8 81 ld r30, Y 3b52a: f9 81 ldd r31, Y+1 ; 0x01 3b52c: cf 01 movw r24, r30 3b52e: 01 96 adiw r24, 0x01 ; 1 3b530: 99 83 std Y+1, r25 ; 0x01 3b532: 88 83 st Y, r24 3b534: 10 83 st Z, r17 3b536: 8e 81 ldd r24, Y+6 ; 0x06 3b538: 9f 81 ldd r25, Y+7 ; 0x07 3b53a: 01 96 adiw r24, 0x01 ; 1 3b53c: 9f 83 std Y+7, r25 ; 0x07 3b53e: 8e 83 std Y+6, r24 ; 0x06 3b540: e3 cf rjmp .-58 ; 0x3b508 3b542: e8 85 ldd r30, Y+8 ; 0x08 3b544: f9 85 ldd r31, Y+9 ; 0x09 3b546: 81 2f mov r24, r17 3b548: 19 95 eicall 3b54a: 89 2b or r24, r25 3b54c: a1 f3 breq .-24 ; 0x3b536 3b54e: da cf rjmp .-76 ; 0x3b504 0003b550 : 3b550: ef 92 push r14 3b552: ff 92 push r15 3b554: 0f 93 push r16 3b556: 1f 93 push r17 3b558: cf 93 push r28 3b55a: df 93 push r29 3b55c: 8c 01 movw r16, r24 3b55e: 7b 01 movw r14, r22 3b560: db 01 movw r26, r22 3b562: 13 96 adiw r26, 0x03 ; 3 3b564: 8c 91 ld r24, X 3b566: d0 e0 ldi r29, 0x00 ; 0 3b568: c0 e0 ldi r28, 0x00 ; 0 3b56a: 81 fd sbrc r24, 1 3b56c: 0f c0 rjmp .+30 ; 0x3b58c 3b56e: cf ef ldi r28, 0xFF ; 255 3b570: df ef ldi r29, 0xFF ; 255 3b572: 10 c0 rjmp .+32 ; 0x3b594 3b574: d7 01 movw r26, r14 3b576: 18 96 adiw r26, 0x08 ; 8 3b578: ed 91 ld r30, X+ 3b57a: fc 91 ld r31, X 3b57c: b7 01 movw r22, r14 3b57e: 19 95 eicall 3b580: 89 2b or r24, r25 3b582: 11 f0 breq .+4 ; 0x3b588 3b584: cf ef ldi r28, 0xFF ; 255 3b586: df ef ldi r29, 0xFF ; 255 3b588: 0f 5f subi r16, 0xFF ; 255 3b58a: 1f 4f sbci r17, 0xFF ; 255 3b58c: f8 01 movw r30, r16 3b58e: 84 91 lpm r24, Z 3b590: 81 11 cpse r24, r1 3b592: f0 cf rjmp .-32 ; 0x3b574 3b594: ce 01 movw r24, r28 3b596: df 91 pop r29 3b598: cf 91 pop r28 3b59a: 1f 91 pop r17 3b59c: 0f 91 pop r16 3b59e: ff 90 pop r15 3b5a0: ef 90 pop r14 3b5a2: 08 95 ret 0003b5a4 : 3b5a4: 0f 93 push r16 3b5a6: 1f 93 push r17 3b5a8: cf 93 push r28 3b5aa: df 93 push r29 3b5ac: cd b7 in r28, 0x3d ; 61 3b5ae: de b7 in r29, 0x3e ; 62 3b5b0: ae 01 movw r20, r28 3b5b2: 48 5f subi r20, 0xF8 ; 248 3b5b4: 5f 4f sbci r21, 0xFF ; 255 3b5b6: da 01 movw r26, r20 3b5b8: 6d 91 ld r22, X+ 3b5ba: 7d 91 ld r23, X+ 3b5bc: ad 01 movw r20, r26 3b5be: 09 e1 ldi r16, 0x19 ; 25 3b5c0: 18 e1 ldi r17, 0x18 ; 24 3b5c2: f8 01 movw r30, r16 3b5c4: 82 81 ldd r24, Z+2 ; 0x02 3b5c6: 93 81 ldd r25, Z+3 ; 0x03 3b5c8: dc 01 movw r26, r24 3b5ca: 13 96 adiw r26, 0x03 ; 3 3b5cc: 2c 91 ld r18, X 3b5ce: 13 97 sbiw r26, 0x03 ; 3 3b5d0: 28 60 ori r18, 0x08 ; 8 3b5d2: 13 96 adiw r26, 0x03 ; 3 3b5d4: 2c 93 st X, r18 3b5d6: 0e 94 81 56 call 0xad02 ; 0xad02 3b5da: d8 01 movw r26, r16 3b5dc: 12 96 adiw r26, 0x02 ; 2 3b5de: ed 91 ld r30, X+ 3b5e0: fc 91 ld r31, X 3b5e2: 23 81 ldd r18, Z+3 ; 0x03 3b5e4: 27 7f andi r18, 0xF7 ; 247 3b5e6: 23 83 std Z+3, r18 ; 0x03 3b5e8: df 91 pop r29 3b5ea: cf 91 pop r28 3b5ec: 1f 91 pop r17 3b5ee: 0f 91 pop r16 3b5f0: 08 95 ret 0003b5f2 : 3b5f2: 0f 93 push r16 3b5f4: 1f 93 push r17 3b5f6: cf 93 push r28 3b5f8: df 93 push r29 3b5fa: 8c 01 movw r16, r24 3b5fc: e0 91 1b 18 lds r30, 0x181B ; 0x80181b <__iob+0x2> 3b600: f0 91 1c 18 lds r31, 0x181C ; 0x80181c <__iob+0x3> 3b604: 83 81 ldd r24, Z+3 ; 0x03 3b606: d0 e0 ldi r29, 0x00 ; 0 3b608: c0 e0 ldi r28, 0x00 ; 0 3b60a: 81 fd sbrc r24, 1 3b60c: 0a c0 rjmp .+20 ; 0x3b622 3b60e: cf ef ldi r28, 0xFF ; 255 3b610: df ef ldi r29, 0xFF ; 255 3b612: 17 c0 rjmp .+46 ; 0x3b642 3b614: 19 95 eicall 3b616: 89 2b or r24, r25 3b618: 11 f0 breq .+4 ; 0x3b61e 3b61a: cf ef ldi r28, 0xFF ; 255 3b61c: df ef ldi r29, 0xFF ; 255 3b61e: 0f 5f subi r16, 0xFF ; 255 3b620: 1f 4f sbci r17, 0xFF ; 255 3b622: f8 01 movw r30, r16 3b624: 84 91 lpm r24, Z 3b626: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> 3b62a: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> 3b62e: db 01 movw r26, r22 3b630: 18 96 adiw r26, 0x08 ; 8 3b632: ed 91 ld r30, X+ 3b634: fc 91 ld r31, X 3b636: 81 11 cpse r24, r1 3b638: ed cf rjmp .-38 ; 0x3b614 3b63a: 8a e0 ldi r24, 0x0A ; 10 3b63c: 19 95 eicall 3b63e: 89 2b or r24, r25 3b640: 31 f7 brne .-52 ; 0x3b60e 3b642: ce 01 movw r24, r28 3b644: df 91 pop r29 3b646: cf 91 pop r28 3b648: 1f 91 pop r17 3b64a: 0f 91 pop r16 3b64c: 08 95 ret 0003b64e : 3b64e: 0f 93 push r16 3b650: 1f 93 push r17 3b652: cf 93 push r28 3b654: df 93 push r29 3b656: cd b7 in r28, 0x3d ; 61 3b658: de b7 in r29, 0x3e ; 62 3b65a: 2e 97 sbiw r28, 0x0e ; 14 3b65c: 0f b6 in r0, 0x3f ; 63 3b65e: f8 94 cli 3b660: de bf out 0x3e, r29 ; 62 3b662: 0f be out 0x3f, r0 ; 63 3b664: cd bf out 0x3d, r28 ; 61 3b666: 0e 89 ldd r16, Y+22 ; 0x16 3b668: 1f 89 ldd r17, Y+23 ; 0x17 3b66a: 8e e0 ldi r24, 0x0E ; 14 3b66c: 8c 83 std Y+4, r24 ; 0x04 3b66e: 1a 83 std Y+2, r17 ; 0x02 3b670: 09 83 std Y+1, r16 ; 0x01 3b672: 8f ef ldi r24, 0xFF ; 255 3b674: 9f e7 ldi r25, 0x7F ; 127 3b676: 9e 83 std Y+6, r25 ; 0x06 3b678: 8d 83 std Y+5, r24 ; 0x05 3b67a: ae 01 movw r20, r28 3b67c: 46 5e subi r20, 0xE6 ; 230 3b67e: 5f 4f sbci r21, 0xFF ; 255 3b680: 68 8d ldd r22, Y+24 ; 0x18 3b682: 79 8d ldd r23, Y+25 ; 0x19 3b684: ce 01 movw r24, r28 3b686: 01 96 adiw r24, 0x01 ; 1 3b688: 0e 94 81 56 call 0xad02 ; 0xad02 3b68c: 2f 81 ldd r18, Y+7 ; 0x07 3b68e: 38 85 ldd r19, Y+8 ; 0x08 3b690: 02 0f add r16, r18 3b692: 13 1f adc r17, r19 3b694: f8 01 movw r30, r16 3b696: 10 82 st Z, r1 3b698: 2e 96 adiw r28, 0x0e ; 14 3b69a: 0f b6 in r0, 0x3f ; 63 3b69c: f8 94 cli 3b69e: de bf out 0x3e, r29 ; 62 3b6a0: 0f be out 0x3f, r0 ; 63 3b6a2: cd bf out 0x3d, r28 ; 61 3b6a4: df 91 pop r29 3b6a6: cf 91 pop r28 3b6a8: 1f 91 pop r17 3b6aa: 0f 91 pop r16 3b6ac: 08 95 ret 0003b6ae : 3b6ae: cf 93 push r28 3b6b0: df 93 push r29 3b6b2: ec 01 movw r28, r24 3b6b4: 8b 81 ldd r24, Y+3 ; 0x03 3b6b6: 88 60 ori r24, 0x08 ; 8 3b6b8: 8b 83 std Y+3, r24 ; 0x03 3b6ba: ce 01 movw r24, r28 3b6bc: 0e 94 81 56 call 0xad02 ; 0xad02 3b6c0: 2b 81 ldd r18, Y+3 ; 0x03 3b6c2: 27 7f andi r18, 0xF7 ; 247 3b6c4: 2b 83 std Y+3, r18 ; 0x03 3b6c6: df 91 pop r29 3b6c8: cf 91 pop r28 3b6ca: 08 95 ret 0003b6cc : 3b6cc: 0f 93 push r16 3b6ce: 1f 93 push r17 3b6d0: cf 93 push r28 3b6d2: df 93 push r29 3b6d4: cd b7 in r28, 0x3d ; 61 3b6d6: de b7 in r29, 0x3e ; 62 3b6d8: 2e 97 sbiw r28, 0x0e ; 14 3b6da: 0f b6 in r0, 0x3f ; 63 3b6dc: f8 94 cli 3b6de: de bf out 0x3e, r29 ; 62 3b6e0: 0f be out 0x3f, r0 ; 63 3b6e2: cd bf out 0x3d, r28 ; 61 3b6e4: 8c 01 movw r16, r24 3b6e6: fa 01 movw r30, r20 3b6e8: 8e e0 ldi r24, 0x0E ; 14 3b6ea: 8c 83 std Y+4, r24 ; 0x04 3b6ec: 1a 83 std Y+2, r17 ; 0x02 3b6ee: 09 83 std Y+1, r16 ; 0x01 3b6f0: 77 ff sbrs r23, 7 3b6f2: 02 c0 rjmp .+4 ; 0x3b6f8 3b6f4: 60 e0 ldi r22, 0x00 ; 0 3b6f6: 70 e8 ldi r23, 0x80 ; 128 3b6f8: 61 50 subi r22, 0x01 ; 1 3b6fa: 71 09 sbc r23, r1 3b6fc: 7e 83 std Y+6, r23 ; 0x06 3b6fe: 6d 83 std Y+5, r22 ; 0x05 3b700: a9 01 movw r20, r18 3b702: bf 01 movw r22, r30 3b704: ce 01 movw r24, r28 3b706: 01 96 adiw r24, 0x01 ; 1 3b708: 0e 94 81 56 call 0xad02 ; 0xad02 3b70c: 4d 81 ldd r20, Y+5 ; 0x05 3b70e: 5e 81 ldd r21, Y+6 ; 0x06 3b710: 57 fd sbrc r21, 7 3b712: 0a c0 rjmp .+20 ; 0x3b728 3b714: 2f 81 ldd r18, Y+7 ; 0x07 3b716: 38 85 ldd r19, Y+8 ; 0x08 3b718: 42 17 cp r20, r18 3b71a: 53 07 cpc r21, r19 3b71c: 0c f4 brge .+2 ; 0x3b720 3b71e: 9a 01 movw r18, r20 3b720: 02 0f add r16, r18 3b722: 13 1f adc r17, r19 3b724: f8 01 movw r30, r16 3b726: 10 82 st Z, r1 3b728: 2e 96 adiw r28, 0x0e ; 14 3b72a: 0f b6 in r0, 0x3f ; 63 3b72c: f8 94 cli 3b72e: de bf out 0x3e, r29 ; 62 3b730: 0f be out 0x3f, r0 ; 63 3b732: cd bf out 0x3d, r28 ; 61 3b734: df 91 pop r29 3b736: cf 91 pop r28 3b738: 1f 91 pop r17 3b73a: 0f 91 pop r16 3b73c: 08 95 ret 0003b73e <__ultoa_invert>: 3b73e: fa 01 movw r30, r20 3b740: aa 27 eor r26, r26 3b742: 28 30 cpi r18, 0x08 ; 8 3b744: 51 f1 breq .+84 ; 0x3b79a <__ultoa_invert+0x5c> 3b746: 20 31 cpi r18, 0x10 ; 16 3b748: 81 f1 breq .+96 ; 0x3b7aa <__ultoa_invert+0x6c> 3b74a: e8 94 clt 3b74c: 6f 93 push r22 3b74e: 6e 7f andi r22, 0xFE ; 254 3b750: 6e 5f subi r22, 0xFE ; 254 3b752: 7f 4f sbci r23, 0xFF ; 255 3b754: 8f 4f sbci r24, 0xFF ; 255 3b756: 9f 4f sbci r25, 0xFF ; 255 3b758: af 4f sbci r26, 0xFF ; 255 3b75a: b1 e0 ldi r27, 0x01 ; 1 3b75c: 3e d0 rcall .+124 ; 0x3b7da <__ultoa_invert+0x9c> 3b75e: b4 e0 ldi r27, 0x04 ; 4 3b760: 3c d0 rcall .+120 ; 0x3b7da <__ultoa_invert+0x9c> 3b762: 67 0f add r22, r23 3b764: 78 1f adc r23, r24 3b766: 89 1f adc r24, r25 3b768: 9a 1f adc r25, r26 3b76a: a1 1d adc r26, r1 3b76c: 68 0f add r22, r24 3b76e: 79 1f adc r23, r25 3b770: 8a 1f adc r24, r26 3b772: 91 1d adc r25, r1 3b774: a1 1d adc r26, r1 3b776: 6a 0f add r22, r26 3b778: 71 1d adc r23, r1 3b77a: 81 1d adc r24, r1 3b77c: 91 1d adc r25, r1 3b77e: a1 1d adc r26, r1 3b780: 20 d0 rcall .+64 ; 0x3b7c2 <__ultoa_invert+0x84> 3b782: 09 f4 brne .+2 ; 0x3b786 <__ultoa_invert+0x48> 3b784: 68 94 set 3b786: 3f 91 pop r19 3b788: 2a e0 ldi r18, 0x0A ; 10 3b78a: 26 9f mul r18, r22 3b78c: 11 24 eor r1, r1 3b78e: 30 19 sub r19, r0 3b790: 30 5d subi r19, 0xD0 ; 208 3b792: 31 93 st Z+, r19 3b794: de f6 brtc .-74 ; 0x3b74c <__ultoa_invert+0xe> 3b796: cf 01 movw r24, r30 3b798: 08 95 ret 3b79a: 46 2f mov r20, r22 3b79c: 47 70 andi r20, 0x07 ; 7 3b79e: 40 5d subi r20, 0xD0 ; 208 3b7a0: 41 93 st Z+, r20 3b7a2: b3 e0 ldi r27, 0x03 ; 3 3b7a4: 0f d0 rcall .+30 ; 0x3b7c4 <__ultoa_invert+0x86> 3b7a6: c9 f7 brne .-14 ; 0x3b79a <__ultoa_invert+0x5c> 3b7a8: f6 cf rjmp .-20 ; 0x3b796 <__ultoa_invert+0x58> 3b7aa: 46 2f mov r20, r22 3b7ac: 4f 70 andi r20, 0x0F ; 15 3b7ae: 40 5d subi r20, 0xD0 ; 208 3b7b0: 4a 33 cpi r20, 0x3A ; 58 3b7b2: 18 f0 brcs .+6 ; 0x3b7ba <__ultoa_invert+0x7c> 3b7b4: 49 5d subi r20, 0xD9 ; 217 3b7b6: 31 fd sbrc r19, 1 3b7b8: 40 52 subi r20, 0x20 ; 32 3b7ba: 41 93 st Z+, r20 3b7bc: 02 d0 rcall .+4 ; 0x3b7c2 <__ultoa_invert+0x84> 3b7be: a9 f7 brne .-22 ; 0x3b7aa <__ultoa_invert+0x6c> 3b7c0: ea cf rjmp .-44 ; 0x3b796 <__ultoa_invert+0x58> 3b7c2: b4 e0 ldi r27, 0x04 ; 4 3b7c4: a6 95 lsr r26 3b7c6: 97 95 ror r25 3b7c8: 87 95 ror r24 3b7ca: 77 95 ror r23 3b7cc: 67 95 ror r22 3b7ce: ba 95 dec r27 3b7d0: c9 f7 brne .-14 ; 0x3b7c4 <__ultoa_invert+0x86> 3b7d2: 00 97 sbiw r24, 0x00 ; 0 3b7d4: 61 05 cpc r22, r1 3b7d6: 71 05 cpc r23, r1 3b7d8: 08 95 ret 3b7da: 9b 01 movw r18, r22 3b7dc: ac 01 movw r20, r24 3b7de: 0a 2e mov r0, r26 3b7e0: 06 94 lsr r0 3b7e2: 57 95 ror r21 3b7e4: 47 95 ror r20 3b7e6: 37 95 ror r19 3b7e8: 27 95 ror r18 3b7ea: ba 95 dec r27 3b7ec: c9 f7 brne .-14 ; 0x3b7e0 <__ultoa_invert+0xa2> 3b7ee: 62 0f add r22, r18 3b7f0: 73 1f adc r23, r19 3b7f2: 84 1f adc r24, r20 3b7f4: 95 1f adc r25, r21 3b7f6: a0 1d adc r26, r0 3b7f8: 08 95 ret 0003b7fa <__ctype_isfalse>: 3b7fa: 99 27 eor r25, r25 3b7fc: 88 27 eor r24, r24 0003b7fe <__ctype_istrue>: 3b7fe: 08 95 ret 0003b800 : 3b800: dc 01 movw r26, r24 3b802: cb 01 movw r24, r22 0003b804 : 3b804: fc 01 movw r30, r24 3b806: f9 99 sbic 0x1f, 1 ; 31 3b808: fe cf rjmp .-4 ; 0x3b806 3b80a: 06 c0 rjmp .+12 ; 0x3b818 3b80c: f2 bd out 0x22, r31 ; 34 3b80e: e1 bd out 0x21, r30 ; 33 3b810: f8 9a sbi 0x1f, 0 ; 31 3b812: 31 96 adiw r30, 0x01 ; 1 3b814: 00 b4 in r0, 0x20 ; 32 3b816: 0d 92 st X+, r0 3b818: 41 50 subi r20, 0x01 ; 1 3b81a: 50 40 sbci r21, 0x00 ; 0 3b81c: b8 f7 brcc .-18 ; 0x3b80c 3b81e: 08 95 ret 0003b820 : 3b820: f9 99 sbic 0x1f, 1 ; 31 3b822: fe cf rjmp .-4 ; 0x3b820 3b824: 92 bd out 0x22, r25 ; 34 3b826: 81 bd out 0x21, r24 ; 33 3b828: f8 9a sbi 0x1f, 0 ; 31 3b82a: 99 27 eor r25, r25 3b82c: 80 b5 in r24, 0x20 ; 32 3b82e: 08 95 ret 0003b830 : 3b830: a6 e1 ldi r26, 0x16 ; 22 3b832: b0 e0 ldi r27, 0x00 ; 0 3b834: 44 e0 ldi r20, 0x04 ; 4 3b836: 50 e0 ldi r21, 0x00 ; 0 3b838: 0d 94 02 dc jmp 0x3b804 ; 0x3b804 0003b83c : 3b83c: a8 e1 ldi r26, 0x18 ; 24 3b83e: b0 e0 ldi r27, 0x00 ; 0 3b840: 42 e0 ldi r20, 0x02 ; 2 3b842: 50 e0 ldi r21, 0x00 ; 0 3b844: 0d 94 02 dc jmp 0x3b804 ; 0x3b804 0003b848 : 3b848: dc 01 movw r26, r24 3b84a: a4 0f add r26, r20 3b84c: b5 1f adc r27, r21 3b84e: 41 50 subi r20, 0x01 ; 1 3b850: 50 40 sbci r21, 0x00 ; 0 3b852: 48 f0 brcs .+18 ; 0x3b866 3b854: cb 01 movw r24, r22 3b856: 84 0f add r24, r20 3b858: 95 1f adc r25, r21 3b85a: 2e 91 ld r18, -X 3b85c: 0f 94 35 dc call 0x3b86a ; 0x3b86a 3b860: 41 50 subi r20, 0x01 ; 1 3b862: 50 40 sbci r21, 0x00 ; 0 3b864: d0 f7 brcc .-12 ; 0x3b85a 3b866: 08 95 ret 0003b868 : 3b868: 26 2f mov r18, r22 0003b86a : 3b86a: f9 99 sbic 0x1f, 1 ; 31 3b86c: fe cf rjmp .-4 ; 0x3b86a 3b86e: 92 bd out 0x22, r25 ; 34 3b870: 81 bd out 0x21, r24 ; 33 3b872: f8 9a sbi 0x1f, 0 ; 31 3b874: 01 97 sbiw r24, 0x01 ; 1 3b876: 00 b4 in r0, 0x20 ; 32 3b878: 02 16 cp r0, r18 3b87a: 39 f0 breq .+14 ; 0x3b88a 3b87c: 1f ba out 0x1f, r1 ; 31 3b87e: 20 bd out 0x20, r18 ; 32 3b880: 0f b6 in r0, 0x3f ; 63 3b882: f8 94 cli 3b884: fa 9a sbi 0x1f, 2 ; 31 3b886: f9 9a sbi 0x1f, 1 ; 31 3b888: 0f be out 0x3f, r0 ; 63 3b88a: 08 95 ret 0003b88c : 3b88c: 03 96 adiw r24, 0x03 ; 3 3b88e: 27 2f mov r18, r23 3b890: 0f 94 35 dc call 0x3b86a ; 0x3b86a 3b894: 0f 94 34 dc call 0x3b868 ; 0x3b868 3b898: 25 2f mov r18, r21 3b89a: 0f 94 35 dc call 0x3b86a ; 0x3b86a 3b89e: 24 2f mov r18, r20 3b8a0: 0d 94 35 dc jmp 0x3b86a ; 0x3b86a 0003b8a4 : 3b8a4: 01 96 adiw r24, 0x01 ; 1 3b8a6: 27 2f mov r18, r23 3b8a8: 0f 94 35 dc call 0x3b86a ; 0x3b86a 3b8ac: 0d 94 34 dc jmp 0x3b868 ; 0x3b868 0003b8b0 : 3b8b0: 26 2f mov r18, r22 0003b8b2 : 3b8b2: f9 99 sbic 0x1f, 1 ; 31 3b8b4: fe cf rjmp .-4 ; 0x3b8b2 3b8b6: 1f ba out 0x1f, r1 ; 31 3b8b8: 92 bd out 0x22, r25 ; 34 3b8ba: 81 bd out 0x21, r24 ; 33 3b8bc: 20 bd out 0x20, r18 ; 32 3b8be: 0f b6 in r0, 0x3f ; 63 3b8c0: f8 94 cli 3b8c2: fa 9a sbi 0x1f, 2 ; 31 3b8c4: f9 9a sbi 0x1f, 1 ; 31 3b8c6: 0f be out 0x3f, r0 ; 63 3b8c8: 01 96 adiw r24, 0x01 ; 1 3b8ca: 08 95 ret 0003b8cc : 3b8cc: 24 2f mov r18, r20 3b8ce: 0f 94 59 dc call 0x3b8b2 ; 0x3b8b2 3b8d2: 25 2f mov r18, r21 3b8d4: 0f 94 59 dc call 0x3b8b2 ; 0x3b8b2 3b8d8: 0d 94 6e dc jmp 0x3b8dc ; 0x3b8dc 0003b8dc : 3b8dc: 0f 94 58 dc call 0x3b8b0 ; 0x3b8b0 3b8e0: 27 2f mov r18, r23 3b8e2: 0d 94 59 dc jmp 0x3b8b2 ; 0x3b8b2 0003b8e6 <__mulsi3>: 3b8e6: db 01 movw r26, r22 3b8e8: 8f 93 push r24 3b8ea: 9f 93 push r25 3b8ec: 0f 94 a5 dc call 0x3b94a ; 0x3b94a <__muluhisi3> 3b8f0: bf 91 pop r27 3b8f2: af 91 pop r26 3b8f4: a2 9f mul r26, r18 3b8f6: 80 0d add r24, r0 3b8f8: 91 1d adc r25, r1 3b8fa: a3 9f mul r26, r19 3b8fc: 90 0d add r25, r0 3b8fe: b2 9f mul r27, r18 3b900: 90 0d add r25, r0 3b902: 11 24 eor r1, r1 3b904: 08 95 ret 0003b906 <__udivmodsi4>: 3b906: a1 e2 ldi r26, 0x21 ; 33 3b908: 1a 2e mov r1, r26 3b90a: aa 1b sub r26, r26 3b90c: bb 1b sub r27, r27 3b90e: fd 01 movw r30, r26 3b910: 0d c0 rjmp .+26 ; 0x3b92c <__udivmodsi4_ep> 0003b912 <__udivmodsi4_loop>: 3b912: aa 1f adc r26, r26 3b914: bb 1f adc r27, r27 3b916: ee 1f adc r30, r30 3b918: ff 1f adc r31, r31 3b91a: a2 17 cp r26, r18 3b91c: b3 07 cpc r27, r19 3b91e: e4 07 cpc r30, r20 3b920: f5 07 cpc r31, r21 3b922: 20 f0 brcs .+8 ; 0x3b92c <__udivmodsi4_ep> 3b924: a2 1b sub r26, r18 3b926: b3 0b sbc r27, r19 3b928: e4 0b sbc r30, r20 3b92a: f5 0b sbc r31, r21 0003b92c <__udivmodsi4_ep>: 3b92c: 66 1f adc r22, r22 3b92e: 77 1f adc r23, r23 3b930: 88 1f adc r24, r24 3b932: 99 1f adc r25, r25 3b934: 1a 94 dec r1 3b936: 69 f7 brne .-38 ; 0x3b912 <__udivmodsi4_loop> 3b938: 60 95 com r22 3b93a: 70 95 com r23 3b93c: 80 95 com r24 3b93e: 90 95 com r25 3b940: 9b 01 movw r18, r22 3b942: ac 01 movw r20, r24 3b944: bd 01 movw r22, r26 3b946: cf 01 movw r24, r30 3b948: 08 95 ret 0003b94a <__muluhisi3>: 3b94a: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 3b94e: a5 9f mul r26, r21 3b950: 90 0d add r25, r0 3b952: b4 9f mul r27, r20 3b954: 90 0d add r25, r0 3b956: a4 9f mul r26, r20 3b958: 80 0d add r24, r0 3b95a: 91 1d adc r25, r1 3b95c: 11 24 eor r1, r1 3b95e: 08 95 ret 0003b960 <__umulhisi3>: 3b960: a2 9f mul r26, r18 3b962: b0 01 movw r22, r0 3b964: b3 9f mul r27, r19 3b966: c0 01 movw r24, r0 3b968: a3 9f mul r26, r19 3b96a: 70 0d add r23, r0 3b96c: 81 1d adc r24, r1 3b96e: 11 24 eor r1, r1 3b970: 91 1d adc r25, r1 3b972: b2 9f mul r27, r18 3b974: 70 0d add r23, r0 3b976: 81 1d adc r24, r1 3b978: 11 24 eor r1, r1 3b97a: 91 1d adc r25, r1 3b97c: 08 95 ret 0003b97e <__udivmodqi4>: 3b97e: 99 1b sub r25, r25 3b980: 79 e0 ldi r23, 0x09 ; 9 3b982: 04 c0 rjmp .+8 ; 0x3b98c <__udivmodqi4_ep> 0003b984 <__udivmodqi4_loop>: 3b984: 99 1f adc r25, r25 3b986: 96 17 cp r25, r22 3b988: 08 f0 brcs .+2 ; 0x3b98c <__udivmodqi4_ep> 3b98a: 96 1b sub r25, r22 0003b98c <__udivmodqi4_ep>: 3b98c: 88 1f adc r24, r24 3b98e: 7a 95 dec r23 3b990: c9 f7 brne .-14 ; 0x3b984 <__udivmodqi4_loop> 3b992: 80 95 com r24 3b994: 08 95 ret 0003b996 <__divmodqi4>: 3b996: 87 fb bst r24, 7 3b998: 08 2e mov r0, r24 3b99a: 06 26 eor r0, r22 3b99c: 87 fd sbrc r24, 7 3b99e: 81 95 neg r24 3b9a0: 67 fd sbrc r22, 7 3b9a2: 61 95 neg r22 3b9a4: 0f 94 bf dc call 0x3b97e ; 0x3b97e <__udivmodqi4> 3b9a8: 0e f4 brtc .+2 ; 0x3b9ac <__divmodqi4_1> 3b9aa: 91 95 neg r25 0003b9ac <__divmodqi4_1>: 3b9ac: 07 fc sbrc r0, 7 3b9ae: 81 95 neg r24 0003b9b0 <__divmodqi4_exit>: 3b9b0: 08 95 ret 0003b9b2 <__udivmodhi4>: 3b9b2: aa 1b sub r26, r26 3b9b4: bb 1b sub r27, r27 3b9b6: 51 e1 ldi r21, 0x11 ; 17 3b9b8: 07 c0 rjmp .+14 ; 0x3b9c8 <__udivmodhi4_ep> 0003b9ba <__udivmodhi4_loop>: 3b9ba: aa 1f adc r26, r26 3b9bc: bb 1f adc r27, r27 3b9be: a6 17 cp r26, r22 3b9c0: b7 07 cpc r27, r23 3b9c2: 10 f0 brcs .+4 ; 0x3b9c8 <__udivmodhi4_ep> 3b9c4: a6 1b sub r26, r22 3b9c6: b7 0b sbc r27, r23 0003b9c8 <__udivmodhi4_ep>: 3b9c8: 88 1f adc r24, r24 3b9ca: 99 1f adc r25, r25 3b9cc: 5a 95 dec r21 3b9ce: a9 f7 brne .-22 ; 0x3b9ba <__udivmodhi4_loop> 3b9d0: 80 95 com r24 3b9d2: 90 95 com r25 3b9d4: bc 01 movw r22, r24 3b9d6: cd 01 movw r24, r26 3b9d8: 08 95 ret 0003b9da <__divmodhi4>: 3b9da: 97 fb bst r25, 7 3b9dc: 07 2e mov r0, r23 3b9de: 16 f4 brtc .+4 ; 0x3b9e4 <__divmodhi4+0xa> 3b9e0: 00 94 com r0 3b9e2: 07 d0 rcall .+14 ; 0x3b9f2 <__divmodhi4_neg1> 3b9e4: 77 fd sbrc r23, 7 3b9e6: 09 d0 rcall .+18 ; 0x3b9fa <__divmodhi4_neg2> 3b9e8: 0f 94 d9 dc call 0x3b9b2 ; 0x3b9b2 <__udivmodhi4> 3b9ec: 07 fc sbrc r0, 7 3b9ee: 05 d0 rcall .+10 ; 0x3b9fa <__divmodhi4_neg2> 3b9f0: 3e f4 brtc .+14 ; 0x3ba00 <__divmodhi4_exit> 0003b9f2 <__divmodhi4_neg1>: 3b9f2: 90 95 com r25 3b9f4: 81 95 neg r24 3b9f6: 9f 4f sbci r25, 0xFF ; 255 3b9f8: 08 95 ret 0003b9fa <__divmodhi4_neg2>: 3b9fa: 70 95 com r23 3b9fc: 61 95 neg r22 3b9fe: 7f 4f sbci r23, 0xFF ; 255 0003ba00 <__divmodhi4_exit>: 3ba00: 08 95 ret 0003ba02 <__divmodsi4>: 3ba02: 05 2e mov r0, r21 3ba04: 97 fb bst r25, 7 3ba06: 1e f4 brtc .+6 ; 0x3ba0e <__divmodsi4+0xc> 3ba08: 00 94 com r0 3ba0a: 0f 94 18 dd call 0x3ba30 ; 0x3ba30 <__negsi2> 3ba0e: 57 fd sbrc r21, 7 3ba10: 07 d0 rcall .+14 ; 0x3ba20 <__divmodsi4_neg2> 3ba12: 0f 94 83 dc call 0x3b906 ; 0x3b906 <__udivmodsi4> 3ba16: 07 fc sbrc r0, 7 3ba18: 03 d0 rcall .+6 ; 0x3ba20 <__divmodsi4_neg2> 3ba1a: 4e f4 brtc .+18 ; 0x3ba2e <__divmodsi4_exit> 3ba1c: 0d 94 18 dd jmp 0x3ba30 ; 0x3ba30 <__negsi2> 0003ba20 <__divmodsi4_neg2>: 3ba20: 50 95 com r21 3ba22: 40 95 com r20 3ba24: 30 95 com r19 3ba26: 21 95 neg r18 3ba28: 3f 4f sbci r19, 0xFF ; 255 3ba2a: 4f 4f sbci r20, 0xFF ; 255 3ba2c: 5f 4f sbci r21, 0xFF ; 255 0003ba2e <__divmodsi4_exit>: 3ba2e: 08 95 ret 0003ba30 <__negsi2>: 3ba30: 90 95 com r25 3ba32: 80 95 com r24 3ba34: 70 95 com r23 3ba36: 61 95 neg r22 3ba38: 7f 4f sbci r23, 0xFF ; 255 3ba3a: 8f 4f sbci r24, 0xFF ; 255 3ba3c: 9f 4f sbci r25, 0xFF ; 255 3ba3e: 08 95 ret 0003ba40 <__tablejump2__>: 3ba40: ee 0f add r30, r30 3ba42: ff 1f adc r31, r31 3ba44: 88 1f adc r24, r24 3ba46: 8b bf out 0x3b, r24 ; 59 3ba48: 07 90 elpm r0, Z+ 3ba4a: f6 91 elpm r31, Z 3ba4c: e0 2d mov r30, r0 3ba4e: 19 94 eijmp 0003ba50 <__mulhisi3>: 3ba50: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 3ba54: 33 23 and r19, r19 3ba56: 12 f4 brpl .+4 ; 0x3ba5c <__mulhisi3+0xc> 3ba58: 8a 1b sub r24, r26 3ba5a: 9b 0b sbc r25, r27 3ba5c: 0d 94 32 dd jmp 0x3ba64 ; 0x3ba64 <__usmulhisi3_tail> 0003ba60 <__usmulhisi3>: 3ba60: 0f 94 b0 dc call 0x3b960 ; 0x3b960 <__umulhisi3> 0003ba64 <__usmulhisi3_tail>: 3ba64: b7 ff sbrs r27, 7 3ba66: 08 95 ret 3ba68: 82 1b sub r24, r18 3ba6a: 93 0b sbc r25, r19 3ba6c: 08 95 ret 0003ba6e <__subsf3>: 3ba6e: 50 58 subi r21, 0x80 ; 128 0003ba70 <__addsf3>: 3ba70: bb 27 eor r27, r27 3ba72: aa 27 eor r26, r26 3ba74: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3ba78: 0d 94 61 d7 jmp 0x3aec2 ; 0x3aec2 <__fp_round> 3ba7c: 0f 94 53 d7 call 0x3aea6 ; 0x3aea6 <__fp_pscA> 3ba80: 38 f0 brcs .+14 ; 0x3ba90 <__addsf3+0x20> 3ba82: 0f 94 5a d7 call 0x3aeb4 ; 0x3aeb4 <__fp_pscB> 3ba86: 20 f0 brcs .+8 ; 0x3ba90 <__addsf3+0x20> 3ba88: 39 f4 brne .+14 ; 0x3ba98 <__addsf3+0x28> 3ba8a: 9f 3f cpi r25, 0xFF ; 255 3ba8c: 19 f4 brne .+6 ; 0x3ba94 <__addsf3+0x24> 3ba8e: 26 f4 brtc .+8 ; 0x3ba98 <__addsf3+0x28> 3ba90: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3ba94: 0e f4 brtc .+2 ; 0x3ba98 <__addsf3+0x28> 3ba96: e0 95 com r30 3ba98: e7 fb bst r30, 7 3ba9a: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 0003ba9e <__addsf3x>: 3ba9e: e9 2f mov r30, r25 3baa0: 0f 94 72 d7 call 0x3aee4 ; 0x3aee4 <__fp_split3> 3baa4: 58 f3 brcs .-42 ; 0x3ba7c <__addsf3+0xc> 3baa6: ba 17 cp r27, r26 3baa8: 62 07 cpc r22, r18 3baaa: 73 07 cpc r23, r19 3baac: 84 07 cpc r24, r20 3baae: 95 07 cpc r25, r21 3bab0: 20 f0 brcs .+8 ; 0x3baba <__addsf3x+0x1c> 3bab2: 79 f4 brne .+30 ; 0x3bad2 <__addsf3x+0x34> 3bab4: a6 f5 brtc .+104 ; 0x3bb1e <__addsf3x+0x80> 3bab6: 0d 94 94 d7 jmp 0x3af28 ; 0x3af28 <__fp_zero> 3baba: 0e f4 brtc .+2 ; 0x3babe <__addsf3x+0x20> 3babc: e0 95 com r30 3babe: 0b 2e mov r0, r27 3bac0: ba 2f mov r27, r26 3bac2: a0 2d mov r26, r0 3bac4: 0b 01 movw r0, r22 3bac6: b9 01 movw r22, r18 3bac8: 90 01 movw r18, r0 3baca: 0c 01 movw r0, r24 3bacc: ca 01 movw r24, r20 3bace: a0 01 movw r20, r0 3bad0: 11 24 eor r1, r1 3bad2: ff 27 eor r31, r31 3bad4: 59 1b sub r21, r25 3bad6: 99 f0 breq .+38 ; 0x3bafe <__addsf3x+0x60> 3bad8: 59 3f cpi r21, 0xF9 ; 249 3bada: 50 f4 brcc .+20 ; 0x3baf0 <__addsf3x+0x52> 3badc: 50 3e cpi r21, 0xE0 ; 224 3bade: 68 f1 brcs .+90 ; 0x3bb3a <__addsf3x+0x9c> 3bae0: 1a 16 cp r1, r26 3bae2: f0 40 sbci r31, 0x00 ; 0 3bae4: a2 2f mov r26, r18 3bae6: 23 2f mov r18, r19 3bae8: 34 2f mov r19, r20 3baea: 44 27 eor r20, r20 3baec: 58 5f subi r21, 0xF8 ; 248 3baee: f3 cf rjmp .-26 ; 0x3bad6 <__addsf3x+0x38> 3baf0: 46 95 lsr r20 3baf2: 37 95 ror r19 3baf4: 27 95 ror r18 3baf6: a7 95 ror r26 3baf8: f0 40 sbci r31, 0x00 ; 0 3bafa: 53 95 inc r21 3bafc: c9 f7 brne .-14 ; 0x3baf0 <__addsf3x+0x52> 3bafe: 7e f4 brtc .+30 ; 0x3bb1e <__addsf3x+0x80> 3bb00: 1f 16 cp r1, r31 3bb02: ba 0b sbc r27, r26 3bb04: 62 0b sbc r22, r18 3bb06: 73 0b sbc r23, r19 3bb08: 84 0b sbc r24, r20 3bb0a: ba f0 brmi .+46 ; 0x3bb3a <__addsf3x+0x9c> 3bb0c: 91 50 subi r25, 0x01 ; 1 3bb0e: a1 f0 breq .+40 ; 0x3bb38 <__addsf3x+0x9a> 3bb10: ff 0f add r31, r31 3bb12: bb 1f adc r27, r27 3bb14: 66 1f adc r22, r22 3bb16: 77 1f adc r23, r23 3bb18: 88 1f adc r24, r24 3bb1a: c2 f7 brpl .-16 ; 0x3bb0c <__addsf3x+0x6e> 3bb1c: 0e c0 rjmp .+28 ; 0x3bb3a <__addsf3x+0x9c> 3bb1e: ba 0f add r27, r26 3bb20: 62 1f adc r22, r18 3bb22: 73 1f adc r23, r19 3bb24: 84 1f adc r24, r20 3bb26: 48 f4 brcc .+18 ; 0x3bb3a <__addsf3x+0x9c> 3bb28: 87 95 ror r24 3bb2a: 77 95 ror r23 3bb2c: 67 95 ror r22 3bb2e: b7 95 ror r27 3bb30: f7 95 ror r31 3bb32: 9e 3f cpi r25, 0xFE ; 254 3bb34: 08 f0 brcs .+2 ; 0x3bb38 <__addsf3x+0x9a> 3bb36: b0 cf rjmp .-160 ; 0x3ba98 <__addsf3+0x28> 3bb38: 93 95 inc r25 3bb3a: 88 0f add r24, r24 3bb3c: 08 f0 brcs .+2 ; 0x3bb40 <__addsf3x+0xa2> 3bb3e: 99 27 eor r25, r25 3bb40: ee 0f add r30, r30 3bb42: 97 95 ror r25 3bb44: 87 95 ror r24 3bb46: 08 95 ret 3bb48: 0f 94 53 d7 call 0x3aea6 ; 0x3aea6 <__fp_pscA> 3bb4c: 60 f0 brcs .+24 ; 0x3bb66 <__addsf3x+0xc8> 3bb4e: 80 e8 ldi r24, 0x80 ; 128 3bb50: 91 e0 ldi r25, 0x01 ; 1 3bb52: 09 f4 brne .+2 ; 0x3bb56 <__addsf3x+0xb8> 3bb54: 9e ef ldi r25, 0xFE ; 254 3bb56: 0f 94 5a d7 call 0x3aeb4 ; 0x3aeb4 <__fp_pscB> 3bb5a: 28 f0 brcs .+10 ; 0x3bb66 <__addsf3x+0xc8> 3bb5c: 40 e8 ldi r20, 0x80 ; 128 3bb5e: 51 e0 ldi r21, 0x01 ; 1 3bb60: 71 f4 brne .+28 ; 0x3bb7e 3bb62: 5e ef ldi r21, 0xFE ; 254 3bb64: 0c c0 rjmp .+24 ; 0x3bb7e 3bb66: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3bb6a: 0d 94 94 d7 jmp 0x3af28 ; 0x3af28 <__fp_zero> 0003bb6e : 3bb6e: e9 2f mov r30, r25 3bb70: e0 78 andi r30, 0x80 ; 128 3bb72: 0f 94 72 d7 call 0x3aee4 ; 0x3aee4 <__fp_split3> 3bb76: 40 f3 brcs .-48 ; 0x3bb48 <__addsf3x+0xaa> 3bb78: 09 2e mov r0, r25 3bb7a: 05 2a or r0, r21 3bb7c: b1 f3 breq .-20 ; 0x3bb6a <__addsf3x+0xcc> 3bb7e: 26 17 cp r18, r22 3bb80: 37 07 cpc r19, r23 3bb82: 48 07 cpc r20, r24 3bb84: 59 07 cpc r21, r25 3bb86: 38 f0 brcs .+14 ; 0x3bb96 3bb88: 0e 2e mov r0, r30 3bb8a: 07 f8 bld r0, 7 3bb8c: e0 25 eor r30, r0 3bb8e: 69 f0 breq .+26 ; 0x3bbaa 3bb90: e0 25 eor r30, r0 3bb92: e0 64 ori r30, 0x40 ; 64 3bb94: 0a c0 rjmp .+20 ; 0x3bbaa 3bb96: ef 63 ori r30, 0x3F ; 63 3bb98: 07 f8 bld r0, 7 3bb9a: 00 94 com r0 3bb9c: 07 fa bst r0, 7 3bb9e: db 01 movw r26, r22 3bba0: b9 01 movw r22, r18 3bba2: 9d 01 movw r18, r26 3bba4: dc 01 movw r26, r24 3bba6: ca 01 movw r24, r20 3bba8: ad 01 movw r20, r26 3bbaa: ef 93 push r30 3bbac: 0f 94 4e de call 0x3bc9c ; 0x3bc9c <__divsf3_pse> 3bbb0: 0f 94 61 d7 call 0x3aec2 ; 0x3aec2 <__fp_round> 3bbb4: 0f 94 e7 dd call 0x3bbce ; 0x3bbce 3bbb8: 5f 91 pop r21 3bbba: 55 23 and r21, r21 3bbbc: 39 f0 breq .+14 ; 0x3bbcc 3bbbe: 2b ed ldi r18, 0xDB ; 219 3bbc0: 3f e0 ldi r19, 0x0F ; 15 3bbc2: 49 e4 ldi r20, 0x49 ; 73 3bbc4: 50 fd sbrc r21, 0 3bbc6: 49 ec ldi r20, 0xC9 ; 201 3bbc8: 0d 94 38 dd jmp 0x3ba70 ; 0x3ba70 <__addsf3> 3bbcc: 08 95 ret 0003bbce : 3bbce: df 93 push r29 3bbd0: dd 27 eor r29, r29 3bbd2: b9 2f mov r27, r25 3bbd4: bf 77 andi r27, 0x7F ; 127 3bbd6: 40 e8 ldi r20, 0x80 ; 128 3bbd8: 5f e3 ldi r21, 0x3F ; 63 3bbda: 16 16 cp r1, r22 3bbdc: 17 06 cpc r1, r23 3bbde: 48 07 cpc r20, r24 3bbe0: 5b 07 cpc r21, r27 3bbe2: 18 f4 brcc .+6 ; 0x3bbea 3bbe4: d9 2f mov r29, r25 3bbe6: 0f 94 33 e0 call 0x3c066 ; 0x3c066 3bbea: 9f 93 push r25 3bbec: 8f 93 push r24 3bbee: 7f 93 push r23 3bbf0: 6f 93 push r22 3bbf2: 0f 94 d9 d6 call 0x3adb2 ; 0x3adb2 3bbf6: e3 ee ldi r30, 0xE3 ; 227 3bbf8: f0 e7 ldi r31, 0x70 ; 112 3bbfa: 0f 94 43 df call 0x3be86 ; 0x3be86 <__fp_powser> 3bbfe: 0f 94 61 d7 call 0x3aec2 ; 0x3aec2 <__fp_round> 3bc02: 2f 91 pop r18 3bc04: 3f 91 pop r19 3bc06: 4f 91 pop r20 3bc08: 5f 91 pop r21 3bc0a: 0f 94 f0 d6 call 0x3ade0 ; 0x3ade0 <__mulsf3x> 3bc0e: dd 23 and r29, r29 3bc10: 51 f0 breq .+20 ; 0x3bc26 3bc12: 90 58 subi r25, 0x80 ; 128 3bc14: a2 ea ldi r26, 0xA2 ; 162 3bc16: 2a ed ldi r18, 0xDA ; 218 3bc18: 3f e0 ldi r19, 0x0F ; 15 3bc1a: 49 ec ldi r20, 0xC9 ; 201 3bc1c: 5f e3 ldi r21, 0x3F ; 63 3bc1e: d0 78 andi r29, 0x80 ; 128 3bc20: 5d 27 eor r21, r29 3bc22: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3bc26: df 91 pop r29 3bc28: 0d 94 61 d7 jmp 0x3aec2 ; 0x3aec2 <__fp_round> 0003bc2c : 3bc2c: 0f 94 a9 df call 0x3bf52 ; 0x3bf52 <__fp_trunc> 3bc30: 90 f0 brcs .+36 ; 0x3bc56 3bc32: 9f 37 cpi r25, 0x7F ; 127 3bc34: 48 f4 brcc .+18 ; 0x3bc48 3bc36: 91 11 cpse r25, r1 3bc38: 16 f4 brtc .+4 ; 0x3bc3e 3bc3a: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3bc3e: 60 e0 ldi r22, 0x00 ; 0 3bc40: 70 e0 ldi r23, 0x00 ; 0 3bc42: 80 e8 ldi r24, 0x80 ; 128 3bc44: 9f e3 ldi r25, 0x3F ; 63 3bc46: 08 95 ret 3bc48: 26 f0 brts .+8 ; 0x3bc52 3bc4a: 1b 16 cp r1, r27 3bc4c: 61 1d adc r22, r1 3bc4e: 71 1d adc r23, r1 3bc50: 81 1d adc r24, r1 3bc52: 0d 94 1a df jmp 0x3be34 ; 0x3be34 <__fp_mintl> 3bc56: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 0003bc5a <__cmpsf2>: 3bc5a: 0f 94 f6 de call 0x3bdec ; 0x3bdec <__fp_cmp> 3bc5e: 08 f4 brcc .+2 ; 0x3bc62 <__cmpsf2+0x8> 3bc60: 81 e0 ldi r24, 0x01 ; 1 3bc62: 08 95 ret 0003bc64 : 3bc64: 0f 94 6c df call 0x3bed8 ; 0x3bed8 <__fp_rempio2> 3bc68: e3 95 inc r30 3bc6a: 0d 94 95 df jmp 0x3bf2a ; 0x3bf2a <__fp_sinus> 0003bc6e <__divsf3>: 3bc6e: 0f 94 4b de call 0x3bc96 ; 0x3bc96 <__divsf3x> 3bc72: 0d 94 61 d7 jmp 0x3aec2 ; 0x3aec2 <__fp_round> 3bc76: 0f 94 5a d7 call 0x3aeb4 ; 0x3aeb4 <__fp_pscB> 3bc7a: 58 f0 brcs .+22 ; 0x3bc92 <__divsf3+0x24> 3bc7c: 0f 94 53 d7 call 0x3aea6 ; 0x3aea6 <__fp_pscA> 3bc80: 40 f0 brcs .+16 ; 0x3bc92 <__divsf3+0x24> 3bc82: 29 f4 brne .+10 ; 0x3bc8e <__divsf3+0x20> 3bc84: 5f 3f cpi r21, 0xFF ; 255 3bc86: 29 f0 breq .+10 ; 0x3bc92 <__divsf3+0x24> 3bc88: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3bc8c: 51 11 cpse r21, r1 3bc8e: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3bc92: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 0003bc96 <__divsf3x>: 3bc96: 0f 94 72 d7 call 0x3aee4 ; 0x3aee4 <__fp_split3> 3bc9a: 68 f3 brcs .-38 ; 0x3bc76 <__divsf3+0x8> 0003bc9c <__divsf3_pse>: 3bc9c: 99 23 and r25, r25 3bc9e: b1 f3 breq .-20 ; 0x3bc8c <__divsf3+0x1e> 3bca0: 55 23 and r21, r21 3bca2: 91 f3 breq .-28 ; 0x3bc88 <__divsf3+0x1a> 3bca4: 95 1b sub r25, r21 3bca6: 55 0b sbc r21, r21 3bca8: bb 27 eor r27, r27 3bcaa: aa 27 eor r26, r26 3bcac: 62 17 cp r22, r18 3bcae: 73 07 cpc r23, r19 3bcb0: 84 07 cpc r24, r20 3bcb2: 38 f0 brcs .+14 ; 0x3bcc2 <__divsf3_pse+0x26> 3bcb4: 9f 5f subi r25, 0xFF ; 255 3bcb6: 5f 4f sbci r21, 0xFF ; 255 3bcb8: 22 0f add r18, r18 3bcba: 33 1f adc r19, r19 3bcbc: 44 1f adc r20, r20 3bcbe: aa 1f adc r26, r26 3bcc0: a9 f3 breq .-22 ; 0x3bcac <__divsf3_pse+0x10> 3bcc2: 35 d0 rcall .+106 ; 0x3bd2e <__divsf3_pse+0x92> 3bcc4: 0e 2e mov r0, r30 3bcc6: 3a f0 brmi .+14 ; 0x3bcd6 <__divsf3_pse+0x3a> 3bcc8: e0 e8 ldi r30, 0x80 ; 128 3bcca: 32 d0 rcall .+100 ; 0x3bd30 <__divsf3_pse+0x94> 3bccc: 91 50 subi r25, 0x01 ; 1 3bcce: 50 40 sbci r21, 0x00 ; 0 3bcd0: e6 95 lsr r30 3bcd2: 00 1c adc r0, r0 3bcd4: ca f7 brpl .-14 ; 0x3bcc8 <__divsf3_pse+0x2c> 3bcd6: 2b d0 rcall .+86 ; 0x3bd2e <__divsf3_pse+0x92> 3bcd8: fe 2f mov r31, r30 3bcda: 29 d0 rcall .+82 ; 0x3bd2e <__divsf3_pse+0x92> 3bcdc: 66 0f add r22, r22 3bcde: 77 1f adc r23, r23 3bce0: 88 1f adc r24, r24 3bce2: bb 1f adc r27, r27 3bce4: 26 17 cp r18, r22 3bce6: 37 07 cpc r19, r23 3bce8: 48 07 cpc r20, r24 3bcea: ab 07 cpc r26, r27 3bcec: b0 e8 ldi r27, 0x80 ; 128 3bcee: 09 f0 breq .+2 ; 0x3bcf2 <__divsf3_pse+0x56> 3bcf0: bb 0b sbc r27, r27 3bcf2: 80 2d mov r24, r0 3bcf4: bf 01 movw r22, r30 3bcf6: ff 27 eor r31, r31 3bcf8: 93 58 subi r25, 0x83 ; 131 3bcfa: 5f 4f sbci r21, 0xFF ; 255 3bcfc: 3a f0 brmi .+14 ; 0x3bd0c <__divsf3_pse+0x70> 3bcfe: 9e 3f cpi r25, 0xFE ; 254 3bd00: 51 05 cpc r21, r1 3bd02: 78 f0 brcs .+30 ; 0x3bd22 <__divsf3_pse+0x86> 3bd04: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3bd08: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3bd0c: 5f 3f cpi r21, 0xFF ; 255 3bd0e: e4 f3 brlt .-8 ; 0x3bd08 <__divsf3_pse+0x6c> 3bd10: 98 3e cpi r25, 0xE8 ; 232 3bd12: d4 f3 brlt .-12 ; 0x3bd08 <__divsf3_pse+0x6c> 3bd14: 86 95 lsr r24 3bd16: 77 95 ror r23 3bd18: 67 95 ror r22 3bd1a: b7 95 ror r27 3bd1c: f7 95 ror r31 3bd1e: 9f 5f subi r25, 0xFF ; 255 3bd20: c9 f7 brne .-14 ; 0x3bd14 <__divsf3_pse+0x78> 3bd22: 88 0f add r24, r24 3bd24: 91 1d adc r25, r1 3bd26: 96 95 lsr r25 3bd28: 87 95 ror r24 3bd2a: 97 f9 bld r25, 7 3bd2c: 08 95 ret 3bd2e: e1 e0 ldi r30, 0x01 ; 1 3bd30: 66 0f add r22, r22 3bd32: 77 1f adc r23, r23 3bd34: 88 1f adc r24, r24 3bd36: bb 1f adc r27, r27 3bd38: 62 17 cp r22, r18 3bd3a: 73 07 cpc r23, r19 3bd3c: 84 07 cpc r24, r20 3bd3e: ba 07 cpc r27, r26 3bd40: 20 f0 brcs .+8 ; 0x3bd4a <__divsf3_pse+0xae> 3bd42: 62 1b sub r22, r18 3bd44: 73 0b sbc r23, r19 3bd46: 84 0b sbc r24, r20 3bd48: ba 0b sbc r27, r26 3bd4a: ee 1f adc r30, r30 3bd4c: 88 f7 brcc .-30 ; 0x3bd30 <__divsf3_pse+0x94> 3bd4e: e0 95 com r30 3bd50: 08 95 ret 0003bd52 <__fixsfsi>: 3bd52: 0f 94 b0 de call 0x3bd60 ; 0x3bd60 <__fixunssfsi> 3bd56: 68 94 set 3bd58: b1 11 cpse r27, r1 3bd5a: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3bd5e: 08 95 ret 0003bd60 <__fixunssfsi>: 3bd60: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3bd64: 88 f0 brcs .+34 ; 0x3bd88 <__fixunssfsi+0x28> 3bd66: 9f 57 subi r25, 0x7F ; 127 3bd68: 98 f0 brcs .+38 ; 0x3bd90 <__fixunssfsi+0x30> 3bd6a: b9 2f mov r27, r25 3bd6c: 99 27 eor r25, r25 3bd6e: b7 51 subi r27, 0x17 ; 23 3bd70: b0 f0 brcs .+44 ; 0x3bd9e <__fixunssfsi+0x3e> 3bd72: e1 f0 breq .+56 ; 0x3bdac <__fixunssfsi+0x4c> 3bd74: 66 0f add r22, r22 3bd76: 77 1f adc r23, r23 3bd78: 88 1f adc r24, r24 3bd7a: 99 1f adc r25, r25 3bd7c: 1a f0 brmi .+6 ; 0x3bd84 <__fixunssfsi+0x24> 3bd7e: ba 95 dec r27 3bd80: c9 f7 brne .-14 ; 0x3bd74 <__fixunssfsi+0x14> 3bd82: 14 c0 rjmp .+40 ; 0x3bdac <__fixunssfsi+0x4c> 3bd84: b1 30 cpi r27, 0x01 ; 1 3bd86: 91 f0 breq .+36 ; 0x3bdac <__fixunssfsi+0x4c> 3bd88: 0f 94 94 d7 call 0x3af28 ; 0x3af28 <__fp_zero> 3bd8c: b1 e0 ldi r27, 0x01 ; 1 3bd8e: 08 95 ret 3bd90: 0d 94 94 d7 jmp 0x3af28 ; 0x3af28 <__fp_zero> 3bd94: 67 2f mov r22, r23 3bd96: 78 2f mov r23, r24 3bd98: 88 27 eor r24, r24 3bd9a: b8 5f subi r27, 0xF8 ; 248 3bd9c: 39 f0 breq .+14 ; 0x3bdac <__fixunssfsi+0x4c> 3bd9e: b9 3f cpi r27, 0xF9 ; 249 3bda0: cc f3 brlt .-14 ; 0x3bd94 <__fixunssfsi+0x34> 3bda2: 86 95 lsr r24 3bda4: 77 95 ror r23 3bda6: 67 95 ror r22 3bda8: b3 95 inc r27 3bdaa: d9 f7 brne .-10 ; 0x3bda2 <__fixunssfsi+0x42> 3bdac: 3e f4 brtc .+14 ; 0x3bdbc <__fixunssfsi+0x5c> 3bdae: 90 95 com r25 3bdb0: 80 95 com r24 3bdb2: 70 95 com r23 3bdb4: 61 95 neg r22 3bdb6: 7f 4f sbci r23, 0xFF ; 255 3bdb8: 8f 4f sbci r24, 0xFF ; 255 3bdba: 9f 4f sbci r25, 0xFF ; 255 3bdbc: 08 95 ret 0003bdbe : 3bdbe: 0f 94 a9 df call 0x3bf52 ; 0x3bf52 <__fp_trunc> 3bdc2: 90 f0 brcs .+36 ; 0x3bde8 3bdc4: 9f 37 cpi r25, 0x7F ; 127 3bdc6: 48 f4 brcc .+18 ; 0x3bdda 3bdc8: 91 11 cpse r25, r1 3bdca: 16 f0 brts .+4 ; 0x3bdd0 3bdcc: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3bdd0: 60 e0 ldi r22, 0x00 ; 0 3bdd2: 70 e0 ldi r23, 0x00 ; 0 3bdd4: 80 e8 ldi r24, 0x80 ; 128 3bdd6: 9f eb ldi r25, 0xBF ; 191 3bdd8: 08 95 ret 3bdda: 26 f4 brtc .+8 ; 0x3bde4 3bddc: 1b 16 cp r1, r27 3bdde: 61 1d adc r22, r1 3bde0: 71 1d adc r23, r1 3bde2: 81 1d adc r24, r1 3bde4: 0d 94 1a df jmp 0x3be34 ; 0x3be34 <__fp_mintl> 3bde8: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 0003bdec <__fp_cmp>: 3bdec: 99 0f add r25, r25 3bdee: 00 08 sbc r0, r0 3bdf0: 55 0f add r21, r21 3bdf2: aa 0b sbc r26, r26 3bdf4: e0 e8 ldi r30, 0x80 ; 128 3bdf6: fe ef ldi r31, 0xFE ; 254 3bdf8: 16 16 cp r1, r22 3bdfa: 17 06 cpc r1, r23 3bdfc: e8 07 cpc r30, r24 3bdfe: f9 07 cpc r31, r25 3be00: c0 f0 brcs .+48 ; 0x3be32 <__fp_cmp+0x46> 3be02: 12 16 cp r1, r18 3be04: 13 06 cpc r1, r19 3be06: e4 07 cpc r30, r20 3be08: f5 07 cpc r31, r21 3be0a: 98 f0 brcs .+38 ; 0x3be32 <__fp_cmp+0x46> 3be0c: 62 1b sub r22, r18 3be0e: 73 0b sbc r23, r19 3be10: 84 0b sbc r24, r20 3be12: 95 0b sbc r25, r21 3be14: 39 f4 brne .+14 ; 0x3be24 <__fp_cmp+0x38> 3be16: 0a 26 eor r0, r26 3be18: 61 f0 breq .+24 ; 0x3be32 <__fp_cmp+0x46> 3be1a: 23 2b or r18, r19 3be1c: 24 2b or r18, r20 3be1e: 25 2b or r18, r21 3be20: 21 f4 brne .+8 ; 0x3be2a <__fp_cmp+0x3e> 3be22: 08 95 ret 3be24: 0a 26 eor r0, r26 3be26: 09 f4 brne .+2 ; 0x3be2a <__fp_cmp+0x3e> 3be28: a1 40 sbci r26, 0x01 ; 1 3be2a: a6 95 lsr r26 3be2c: 8f ef ldi r24, 0xFF ; 255 3be2e: 81 1d adc r24, r1 3be30: 81 1d adc r24, r1 3be32: 08 95 ret 0003be34 <__fp_mintl>: 3be34: 88 23 and r24, r24 3be36: 71 f4 brne .+28 ; 0x3be54 <__fp_mintl+0x20> 3be38: 77 23 and r23, r23 3be3a: 21 f0 breq .+8 ; 0x3be44 <__fp_mintl+0x10> 3be3c: 98 50 subi r25, 0x08 ; 8 3be3e: 87 2b or r24, r23 3be40: 76 2f mov r23, r22 3be42: 07 c0 rjmp .+14 ; 0x3be52 <__fp_mintl+0x1e> 3be44: 66 23 and r22, r22 3be46: 11 f4 brne .+4 ; 0x3be4c <__fp_mintl+0x18> 3be48: 99 27 eor r25, r25 3be4a: 0d c0 rjmp .+26 ; 0x3be66 <__fp_mintl+0x32> 3be4c: 90 51 subi r25, 0x10 ; 16 3be4e: 86 2b or r24, r22 3be50: 70 e0 ldi r23, 0x00 ; 0 3be52: 60 e0 ldi r22, 0x00 ; 0 3be54: 2a f0 brmi .+10 ; 0x3be60 <__fp_mintl+0x2c> 3be56: 9a 95 dec r25 3be58: 66 0f add r22, r22 3be5a: 77 1f adc r23, r23 3be5c: 88 1f adc r24, r24 3be5e: da f7 brpl .-10 ; 0x3be56 <__fp_mintl+0x22> 3be60: 88 0f add r24, r24 3be62: 96 95 lsr r25 3be64: 87 95 ror r24 3be66: 97 f9 bld r25, 7 3be68: 08 95 ret 0003be6a <__fp_mpack>: 3be6a: 9f 3f cpi r25, 0xFF ; 255 3be6c: 31 f0 breq .+12 ; 0x3be7a <__fp_mpack_finite+0xc> 0003be6e <__fp_mpack_finite>: 3be6e: 91 50 subi r25, 0x01 ; 1 3be70: 20 f4 brcc .+8 ; 0x3be7a <__fp_mpack_finite+0xc> 3be72: 87 95 ror r24 3be74: 77 95 ror r23 3be76: 67 95 ror r22 3be78: b7 95 ror r27 3be7a: 88 0f add r24, r24 3be7c: 91 1d adc r25, r1 3be7e: 96 95 lsr r25 3be80: 87 95 ror r24 3be82: 97 f9 bld r25, 7 3be84: 08 95 ret 0003be86 <__fp_powser>: 3be86: df 93 push r29 3be88: cf 93 push r28 3be8a: 1f 93 push r17 3be8c: 0f 93 push r16 3be8e: ff 92 push r15 3be90: ef 92 push r14 3be92: df 92 push r13 3be94: 7b 01 movw r14, r22 3be96: 8c 01 movw r16, r24 3be98: 68 94 set 3be9a: 06 c0 rjmp .+12 ; 0x3bea8 <__fp_powser+0x22> 3be9c: da 2e mov r13, r26 3be9e: ef 01 movw r28, r30 3bea0: 0f 94 f0 d6 call 0x3ade0 ; 0x3ade0 <__mulsf3x> 3bea4: fe 01 movw r30, r28 3bea6: e8 94 clt 3bea8: a5 91 lpm r26, Z+ 3beaa: 25 91 lpm r18, Z+ 3beac: 35 91 lpm r19, Z+ 3beae: 45 91 lpm r20, Z+ 3beb0: 55 91 lpm r21, Z+ 3beb2: a6 f3 brts .-24 ; 0x3be9c <__fp_powser+0x16> 3beb4: ef 01 movw r28, r30 3beb6: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3beba: fe 01 movw r30, r28 3bebc: 97 01 movw r18, r14 3bebe: a8 01 movw r20, r16 3bec0: da 94 dec r13 3bec2: 69 f7 brne .-38 ; 0x3be9e <__fp_powser+0x18> 3bec4: df 90 pop r13 3bec6: ef 90 pop r14 3bec8: ff 90 pop r15 3beca: 0f 91 pop r16 3becc: 1f 91 pop r17 3bece: cf 91 pop r28 3bed0: df 91 pop r29 3bed2: 08 95 ret 3bed4: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 0003bed8 <__fp_rempio2>: 3bed8: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3bedc: d8 f3 brcs .-10 ; 0x3bed4 <__fp_powser+0x4e> 3bede: e8 94 clt 3bee0: e0 e0 ldi r30, 0x00 ; 0 3bee2: bb 27 eor r27, r27 3bee4: 9f 57 subi r25, 0x7F ; 127 3bee6: f0 f0 brcs .+60 ; 0x3bf24 <__fp_rempio2+0x4c> 3bee8: 2a ed ldi r18, 0xDA ; 218 3beea: 3f e0 ldi r19, 0x0F ; 15 3beec: 49 ec ldi r20, 0xC9 ; 201 3beee: 06 c0 rjmp .+12 ; 0x3befc <__fp_rempio2+0x24> 3bef0: ee 0f add r30, r30 3bef2: bb 0f add r27, r27 3bef4: 66 1f adc r22, r22 3bef6: 77 1f adc r23, r23 3bef8: 88 1f adc r24, r24 3befa: 28 f0 brcs .+10 ; 0x3bf06 <__fp_rempio2+0x2e> 3befc: b2 3a cpi r27, 0xA2 ; 162 3befe: 62 07 cpc r22, r18 3bf00: 73 07 cpc r23, r19 3bf02: 84 07 cpc r24, r20 3bf04: 28 f0 brcs .+10 ; 0x3bf10 <__fp_rempio2+0x38> 3bf06: b2 5a subi r27, 0xA2 ; 162 3bf08: 62 0b sbc r22, r18 3bf0a: 73 0b sbc r23, r19 3bf0c: 84 0b sbc r24, r20 3bf0e: e3 95 inc r30 3bf10: 9a 95 dec r25 3bf12: 72 f7 brpl .-36 ; 0x3bef0 <__fp_rempio2+0x18> 3bf14: 80 38 cpi r24, 0x80 ; 128 3bf16: 30 f4 brcc .+12 ; 0x3bf24 <__fp_rempio2+0x4c> 3bf18: 9a 95 dec r25 3bf1a: bb 0f add r27, r27 3bf1c: 66 1f adc r22, r22 3bf1e: 77 1f adc r23, r23 3bf20: 88 1f adc r24, r24 3bf22: d2 f7 brpl .-12 ; 0x3bf18 <__fp_rempio2+0x40> 3bf24: 90 48 sbci r25, 0x80 ; 128 3bf26: 0d 94 37 df jmp 0x3be6e ; 0x3be6e <__fp_mpack_finite> 0003bf2a <__fp_sinus>: 3bf2a: ef 93 push r30 3bf2c: e0 ff sbrs r30, 0 3bf2e: 07 c0 rjmp .+14 ; 0x3bf3e <__fp_sinus+0x14> 3bf30: a2 ea ldi r26, 0xA2 ; 162 3bf32: 2a ed ldi r18, 0xDA ; 218 3bf34: 3f e0 ldi r19, 0x0F ; 15 3bf36: 49 ec ldi r20, 0xC9 ; 201 3bf38: 5f eb ldi r21, 0xBF ; 191 3bf3a: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3bf3e: 0f 94 61 d7 call 0x3aec2 ; 0x3aec2 <__fp_round> 3bf42: 0f 90 pop r0 3bf44: 03 94 inc r0 3bf46: 01 fc sbrc r0, 1 3bf48: 90 58 subi r25, 0x80 ; 128 3bf4a: e0 e1 ldi r30, 0x10 ; 16 3bf4c: f1 e7 ldi r31, 0x71 ; 113 3bf4e: 0d 94 8c e1 jmp 0x3c318 ; 0x3c318 <__fp_powsodd> 0003bf52 <__fp_trunc>: 3bf52: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3bf56: a0 f0 brcs .+40 ; 0x3bf80 <__fp_trunc+0x2e> 3bf58: be e7 ldi r27, 0x7E ; 126 3bf5a: b9 17 cp r27, r25 3bf5c: 88 f4 brcc .+34 ; 0x3bf80 <__fp_trunc+0x2e> 3bf5e: bb 27 eor r27, r27 3bf60: 9f 38 cpi r25, 0x8F ; 143 3bf62: 60 f4 brcc .+24 ; 0x3bf7c <__fp_trunc+0x2a> 3bf64: 16 16 cp r1, r22 3bf66: b1 1d adc r27, r1 3bf68: 67 2f mov r22, r23 3bf6a: 78 2f mov r23, r24 3bf6c: 88 27 eor r24, r24 3bf6e: 98 5f subi r25, 0xF8 ; 248 3bf70: f7 cf rjmp .-18 ; 0x3bf60 <__fp_trunc+0xe> 3bf72: 86 95 lsr r24 3bf74: 77 95 ror r23 3bf76: 67 95 ror r22 3bf78: b1 1d adc r27, r1 3bf7a: 93 95 inc r25 3bf7c: 96 39 cpi r25, 0x96 ; 150 3bf7e: c8 f3 brcs .-14 ; 0x3bf72 <__fp_trunc+0x20> 3bf80: 08 95 ret 0003bf82 <__gesf2>: 3bf82: 0f 94 f6 de call 0x3bdec ; 0x3bdec <__fp_cmp> 3bf86: 08 f4 brcc .+2 ; 0x3bf8a <__gesf2+0x8> 3bf88: 8f ef ldi r24, 0xFF ; 255 3bf8a: 08 95 ret 3bf8c: 0f 94 53 d7 call 0x3aea6 ; 0x3aea6 <__fp_pscA> 3bf90: 29 f0 breq .+10 ; 0x3bf9c <__gesf2+0x1a> 3bf92: 0f 94 5a d7 call 0x3aeb4 ; 0x3aeb4 <__fp_pscB> 3bf96: 11 f0 breq .+4 ; 0x3bf9c <__gesf2+0x1a> 3bf98: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3bf9c: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3bfa0: b9 01 movw r22, r18 3bfa2: ca 01 movw r24, r20 3bfa4: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 0003bfa8 : 3bfa8: 9f 77 andi r25, 0x7F ; 127 3bfaa: 5f 77 andi r21, 0x7F ; 127 3bfac: 0f 94 72 d7 call 0x3aee4 ; 0x3aee4 <__fp_split3> 3bfb0: 68 f3 brcs .-38 ; 0x3bf8c <__gesf2+0xa> 3bfb2: 99 23 and r25, r25 3bfb4: a9 f3 breq .-22 ; 0x3bfa0 <__gesf2+0x1e> 3bfb6: 55 23 and r21, r21 3bfb8: a9 f3 breq .-22 ; 0x3bfa4 <__gesf2+0x22> 3bfba: ff 27 eor r31, r31 3bfbc: 95 17 cp r25, r21 3bfbe: 58 f4 brcc .+22 ; 0x3bfd6 3bfc0: e5 2f mov r30, r21 3bfc2: e9 1b sub r30, r25 3bfc4: ed 30 cpi r30, 0x0D ; 13 3bfc6: 60 f7 brcc .-40 ; 0x3bfa0 <__gesf2+0x1e> 3bfc8: 5e 3b cpi r21, 0xBE ; 190 3bfca: 10 f0 brcs .+4 ; 0x3bfd0 3bfcc: f1 e4 ldi r31, 0x41 ; 65 3bfce: 1c c0 rjmp .+56 ; 0x3c008 3bfd0: 90 34 cpi r25, 0x40 ; 64 3bfd2: e0 f4 brcc .+56 ; 0x3c00c 3bfd4: 0a c0 rjmp .+20 ; 0x3bfea 3bfd6: e9 2f mov r30, r25 3bfd8: e5 1b sub r30, r21 3bfda: ed 30 cpi r30, 0x0D ; 13 3bfdc: 18 f7 brcc .-58 ; 0x3bfa4 <__gesf2+0x22> 3bfde: 9e 3b cpi r25, 0xBE ; 190 3bfe0: 10 f0 brcs .+4 ; 0x3bfe6 3bfe2: f1 e4 ldi r31, 0x41 ; 65 3bfe4: 11 c0 rjmp .+34 ; 0x3c008 3bfe6: 50 34 cpi r21, 0x40 ; 64 3bfe8: 88 f4 brcc .+34 ; 0x3c00c 3bfea: f9 ea ldi r31, 0xA9 ; 169 3bfec: 88 23 and r24, r24 3bfee: 2a f0 brmi .+10 ; 0x3bffa 3bff0: 9a 95 dec r25 3bff2: 66 0f add r22, r22 3bff4: 77 1f adc r23, r23 3bff6: 88 1f adc r24, r24 3bff8: da f7 brpl .-10 ; 0x3bff0 3bffa: 44 23 and r20, r20 3bffc: 2a f0 brmi .+10 ; 0x3c008 3bffe: 5a 95 dec r21 3c000: 22 0f add r18, r18 3c002: 33 1f adc r19, r19 3c004: 44 1f adc r20, r20 3c006: da f7 brpl .-10 ; 0x3bffe 3c008: 9f 1b sub r25, r31 3c00a: 5f 1b sub r21, r31 3c00c: ff 93 push r31 3c00e: 1f 93 push r17 3c010: 0f 93 push r16 3c012: ff 92 push r15 3c014: ef 92 push r14 3c016: 79 01 movw r14, r18 3c018: 8a 01 movw r16, r20 3c01a: bb 27 eor r27, r27 3c01c: ab 2f mov r26, r27 3c01e: 9b 01 movw r18, r22 3c020: ac 01 movw r20, r24 3c022: 0f 94 f3 d6 call 0x3ade6 ; 0x3ade6 <__mulsf3_pse> 3c026: 97 01 movw r18, r14 3c028: a8 01 movw r20, r16 3c02a: bf 93 push r27 3c02c: 7b 01 movw r14, r22 3c02e: 8c 01 movw r16, r24 3c030: aa 27 eor r26, r26 3c032: ba 2f mov r27, r26 3c034: b9 01 movw r22, r18 3c036: ca 01 movw r24, r20 3c038: 0f 94 f3 d6 call 0x3ade6 ; 0x3ade6 <__mulsf3_pse> 3c03c: af 91 pop r26 3c03e: 97 01 movw r18, r14 3c040: a8 01 movw r20, r16 3c042: ef 90 pop r14 3c044: ff 90 pop r15 3c046: 0f 91 pop r16 3c048: 1f 91 pop r17 3c04a: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3c04e: 0f 94 61 d7 call 0x3aec2 ; 0x3aec2 <__fp_round> 3c052: 0f 94 06 e1 call 0x3c20c ; 0x3c20c 3c056: 4f 91 pop r20 3c058: 40 ff sbrs r20, 0 3c05a: 08 95 ret 3c05c: 55 27 eor r21, r21 3c05e: 47 fd sbrc r20, 7 3c060: 50 95 com r21 3c062: 0d 94 3f e0 jmp 0x3c07e ; 0x3c07e 0003c066 : 3c066: 9b 01 movw r18, r22 3c068: ac 01 movw r20, r24 3c06a: 60 e0 ldi r22, 0x00 ; 0 3c06c: 70 e0 ldi r23, 0x00 ; 0 3c06e: 80 e8 ldi r24, 0x80 ; 128 3c070: 9f e3 ldi r25, 0x3F ; 63 3c072: 0d 94 37 de jmp 0x3bc6e ; 0x3bc6e <__divsf3> 3c076: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3c07a: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 0003c07e : 3c07e: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3c082: d8 f3 brcs .-10 ; 0x3c07a 3c084: 99 23 and r25, r25 3c086: c9 f3 breq .-14 ; 0x3c07a 3c088: 94 0f add r25, r20 3c08a: 51 1d adc r21, r1 3c08c: a3 f3 brvs .-24 ; 0x3c076 3c08e: 91 50 subi r25, 0x01 ; 1 3c090: 50 40 sbci r21, 0x00 ; 0 3c092: 94 f0 brlt .+36 ; 0x3c0b8 3c094: 59 f0 breq .+22 ; 0x3c0ac 3c096: 88 23 and r24, r24 3c098: 32 f0 brmi .+12 ; 0x3c0a6 3c09a: 66 0f add r22, r22 3c09c: 77 1f adc r23, r23 3c09e: 88 1f adc r24, r24 3c0a0: 91 50 subi r25, 0x01 ; 1 3c0a2: 50 40 sbci r21, 0x00 ; 0 3c0a4: c1 f7 brne .-16 ; 0x3c096 3c0a6: 9e 3f cpi r25, 0xFE ; 254 3c0a8: 51 05 cpc r21, r1 3c0aa: 2c f7 brge .-54 ; 0x3c076 3c0ac: 88 0f add r24, r24 3c0ae: 91 1d adc r25, r1 3c0b0: 96 95 lsr r25 3c0b2: 87 95 ror r24 3c0b4: 97 f9 bld r25, 7 3c0b6: 08 95 ret 3c0b8: 5f 3f cpi r21, 0xFF ; 255 3c0ba: ac f0 brlt .+42 ; 0x3c0e6 3c0bc: 98 3e cpi r25, 0xE8 ; 232 3c0be: 9c f0 brlt .+38 ; 0x3c0e6 3c0c0: bb 27 eor r27, r27 3c0c2: 86 95 lsr r24 3c0c4: 77 95 ror r23 3c0c6: 67 95 ror r22 3c0c8: b7 95 ror r27 3c0ca: 08 f4 brcc .+2 ; 0x3c0ce 3c0cc: b1 60 ori r27, 0x01 ; 1 3c0ce: 93 95 inc r25 3c0d0: c1 f7 brne .-16 ; 0x3c0c2 3c0d2: bb 0f add r27, r27 3c0d4: 58 f7 brcc .-42 ; 0x3c0ac 3c0d6: 11 f4 brne .+4 ; 0x3c0dc 3c0d8: 60 ff sbrs r22, 0 3c0da: e8 cf rjmp .-48 ; 0x3c0ac 3c0dc: 6f 5f subi r22, 0xFF ; 255 3c0de: 7f 4f sbci r23, 0xFF ; 255 3c0e0: 8f 4f sbci r24, 0xFF ; 255 3c0e2: 9f 4f sbci r25, 0xFF ; 255 3c0e4: e3 cf rjmp .-58 ; 0x3c0ac 3c0e6: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 0003c0ea : 3c0ea: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3c0ee: 58 f1 brcs .+86 ; 0x3c146 3c0f0: 9e 57 subi r25, 0x7E ; 126 3c0f2: 60 f1 brcs .+88 ; 0x3c14c 3c0f4: 98 51 subi r25, 0x18 ; 24 3c0f6: a0 f0 brcs .+40 ; 0x3c120 3c0f8: e9 f0 breq .+58 ; 0x3c134 3c0fa: 98 30 cpi r25, 0x08 ; 8 3c0fc: 20 f5 brcc .+72 ; 0x3c146 3c0fe: 09 2e mov r0, r25 3c100: 99 27 eor r25, r25 3c102: 66 0f add r22, r22 3c104: 77 1f adc r23, r23 3c106: 88 1f adc r24, r24 3c108: 99 1f adc r25, r25 3c10a: 0a 94 dec r0 3c10c: d1 f7 brne .-12 ; 0x3c102 3c10e: 12 c0 rjmp .+36 ; 0x3c134 3c110: 06 2e mov r0, r22 3c112: 67 2f mov r22, r23 3c114: 78 2f mov r23, r24 3c116: 88 27 eor r24, r24 3c118: 98 5f subi r25, 0xF8 ; 248 3c11a: 11 f4 brne .+4 ; 0x3c120 3c11c: 00 0c add r0, r0 3c11e: 07 c0 rjmp .+14 ; 0x3c12e 3c120: 99 3f cpi r25, 0xF9 ; 249 3c122: b4 f3 brlt .-20 ; 0x3c110 3c124: 86 95 lsr r24 3c126: 77 95 ror r23 3c128: 67 95 ror r22 3c12a: 93 95 inc r25 3c12c: d9 f7 brne .-10 ; 0x3c124 3c12e: 61 1d adc r22, r1 3c130: 71 1d adc r23, r1 3c132: 81 1d adc r24, r1 3c134: 3e f4 brtc .+14 ; 0x3c144 3c136: 90 95 com r25 3c138: 80 95 com r24 3c13a: 70 95 com r23 3c13c: 61 95 neg r22 3c13e: 7f 4f sbci r23, 0xFF ; 255 3c140: 8f 4f sbci r24, 0xFF ; 255 3c142: 9f 4f sbci r25, 0xFF ; 255 3c144: 08 95 ret 3c146: 68 94 set 3c148: 0d 94 95 d7 jmp 0x3af2a ; 0x3af2a <__fp_szero> 3c14c: 0d 94 94 d7 jmp 0x3af28 ; 0x3af28 <__fp_zero> 0003c150 : 3c150: fa 01 movw r30, r20 3c152: ee 0f add r30, r30 3c154: ff 1f adc r31, r31 3c156: 30 96 adiw r30, 0x00 ; 0 3c158: 21 05 cpc r18, r1 3c15a: 31 05 cpc r19, r1 3c15c: a1 f1 breq .+104 ; 0x3c1c6 3c15e: 61 15 cp r22, r1 3c160: 71 05 cpc r23, r1 3c162: 61 f4 brne .+24 ; 0x3c17c 3c164: 80 38 cpi r24, 0x80 ; 128 3c166: bf e3 ldi r27, 0x3F ; 63 3c168: 9b 07 cpc r25, r27 3c16a: 49 f1 breq .+82 ; 0x3c1be 3c16c: 68 94 set 3c16e: 90 38 cpi r25, 0x80 ; 128 3c170: 81 05 cpc r24, r1 3c172: 61 f0 breq .+24 ; 0x3c18c 3c174: 80 38 cpi r24, 0x80 ; 128 3c176: bf ef ldi r27, 0xFF ; 255 3c178: 9b 07 cpc r25, r27 3c17a: 41 f0 breq .+16 ; 0x3c18c 3c17c: 99 23 and r25, r25 3c17e: 4a f5 brpl .+82 ; 0x3c1d2 3c180: ff 3f cpi r31, 0xFF ; 255 3c182: e1 05 cpc r30, r1 3c184: 31 05 cpc r19, r1 3c186: 21 05 cpc r18, r1 3c188: 19 f1 breq .+70 ; 0x3c1d0 3c18a: e8 94 clt 3c18c: 08 94 sec 3c18e: e7 95 ror r30 3c190: d9 01 movw r26, r18 3c192: aa 23 and r26, r26 3c194: 29 f4 brne .+10 ; 0x3c1a0 3c196: ab 2f mov r26, r27 3c198: be 2f mov r27, r30 3c19a: f8 5f subi r31, 0xF8 ; 248 3c19c: d0 f3 brcs .-12 ; 0x3c192 3c19e: 10 c0 rjmp .+32 ; 0x3c1c0 3c1a0: ff 5f subi r31, 0xFF ; 255 3c1a2: 70 f4 brcc .+28 ; 0x3c1c0 3c1a4: a6 95 lsr r26 3c1a6: e0 f7 brcc .-8 ; 0x3c1a0 3c1a8: f7 39 cpi r31, 0x97 ; 151 3c1aa: 50 f0 brcs .+20 ; 0x3c1c0 3c1ac: 19 f0 breq .+6 ; 0x3c1b4 3c1ae: ff 3a cpi r31, 0xAF ; 175 3c1b0: 38 f4 brcc .+14 ; 0x3c1c0 3c1b2: 9f 77 andi r25, 0x7F ; 127 3c1b4: 9f 93 push r25 3c1b6: 0d d0 rcall .+26 ; 0x3c1d2 3c1b8: 0f 90 pop r0 3c1ba: 07 fc sbrc r0, 7 3c1bc: 90 58 subi r25, 0x80 ; 128 3c1be: 08 95 ret 3c1c0: 46 f0 brts .+16 ; 0x3c1d2 3c1c2: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3c1c6: 60 e0 ldi r22, 0x00 ; 0 3c1c8: 70 e0 ldi r23, 0x00 ; 0 3c1ca: 80 e8 ldi r24, 0x80 ; 128 3c1cc: 9f e3 ldi r25, 0x3F ; 63 3c1ce: 08 95 ret 3c1d0: 4f e7 ldi r20, 0x7F ; 127 3c1d2: 9f 77 andi r25, 0x7F ; 127 3c1d4: 5f 93 push r21 3c1d6: 4f 93 push r20 3c1d8: 3f 93 push r19 3c1da: 2f 93 push r18 3c1dc: 0f 94 a8 e1 call 0x3c350 ; 0x3c350 3c1e0: 2f 91 pop r18 3c1e2: 3f 91 pop r19 3c1e4: 4f 91 pop r20 3c1e6: 5f 91 pop r21 3c1e8: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3c1ec: 0d 94 53 e1 jmp 0x3c2a6 ; 0x3c2a6 0003c1f0 : 3c1f0: 9f 93 push r25 3c1f2: 0f 94 6c df call 0x3bed8 ; 0x3bed8 <__fp_rempio2> 3c1f6: 0f 90 pop r0 3c1f8: 07 fc sbrc r0, 7 3c1fa: ee 5f subi r30, 0xFE ; 254 3c1fc: 0d 94 95 df jmp 0x3bf2a ; 0x3bf2a <__fp_sinus> 3c200: 19 f4 brne .+6 ; 0x3c208 3c202: 16 f4 brtc .+4 ; 0x3c208 3c204: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3c208: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 0003c20c : 3c20c: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3c210: b8 f3 brcs .-18 ; 0x3c200 3c212: 99 23 and r25, r25 3c214: c9 f3 breq .-14 ; 0x3c208 3c216: b6 f3 brts .-20 ; 0x3c204 3c218: 9f 57 subi r25, 0x7F ; 127 3c21a: 55 0b sbc r21, r21 3c21c: 87 ff sbrs r24, 7 3c21e: 0f 94 85 e1 call 0x3c30a ; 0x3c30a <__fp_norm2> 3c222: 00 24 eor r0, r0 3c224: a0 e6 ldi r26, 0x60 ; 96 3c226: 40 ea ldi r20, 0xA0 ; 160 3c228: 90 01 movw r18, r0 3c22a: 80 58 subi r24, 0x80 ; 128 3c22c: 56 95 lsr r21 3c22e: 97 95 ror r25 3c230: 28 f4 brcc .+10 ; 0x3c23c 3c232: 80 5c subi r24, 0xC0 ; 192 3c234: 66 0f add r22, r22 3c236: 77 1f adc r23, r23 3c238: 88 1f adc r24, r24 3c23a: 20 f0 brcs .+8 ; 0x3c244 3c23c: 26 17 cp r18, r22 3c23e: 37 07 cpc r19, r23 3c240: 48 07 cpc r20, r24 3c242: 30 f4 brcc .+12 ; 0x3c250 3c244: 62 1b sub r22, r18 3c246: 73 0b sbc r23, r19 3c248: 84 0b sbc r24, r20 3c24a: 20 29 or r18, r0 3c24c: 31 29 or r19, r1 3c24e: 4a 2b or r20, r26 3c250: a6 95 lsr r26 3c252: 17 94 ror r1 3c254: 07 94 ror r0 3c256: 20 25 eor r18, r0 3c258: 31 25 eor r19, r1 3c25a: 4a 27 eor r20, r26 3c25c: 58 f7 brcc .-42 ; 0x3c234 3c25e: 66 0f add r22, r22 3c260: 77 1f adc r23, r23 3c262: 88 1f adc r24, r24 3c264: 20 f0 brcs .+8 ; 0x3c26e 3c266: 26 17 cp r18, r22 3c268: 37 07 cpc r19, r23 3c26a: 48 07 cpc r20, r24 3c26c: 30 f4 brcc .+12 ; 0x3c27a 3c26e: 62 0b sbc r22, r18 3c270: 73 0b sbc r23, r19 3c272: 84 0b sbc r24, r20 3c274: 20 0d add r18, r0 3c276: 31 1d adc r19, r1 3c278: 41 1d adc r20, r1 3c27a: a0 95 com r26 3c27c: 81 f7 brne .-32 ; 0x3c25e 3c27e: b9 01 movw r22, r18 3c280: 84 2f mov r24, r20 3c282: 91 58 subi r25, 0x81 ; 129 3c284: 88 0f add r24, r24 3c286: 96 95 lsr r25 3c288: 87 95 ror r24 3c28a: 08 95 ret 0003c28c <__unordsf2>: 3c28c: 0f 94 f6 de call 0x3bdec ; 0x3bdec <__fp_cmp> 3c290: 88 0b sbc r24, r24 3c292: 99 0b sbc r25, r25 3c294: 08 95 ret 3c296: 29 f4 brne .+10 ; 0x3c2a2 <__unordsf2+0x16> 3c298: 16 f0 brts .+4 ; 0x3c29e <__unordsf2+0x12> 3c29a: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 3c29e: 0d 94 94 d7 jmp 0x3af28 ; 0x3af28 <__fp_zero> 3c2a2: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 0003c2a6 : 3c2a6: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3c2aa: a8 f3 brcs .-22 ; 0x3c296 <__unordsf2+0xa> 3c2ac: 96 38 cpi r25, 0x86 ; 134 3c2ae: a0 f7 brcc .-24 ; 0x3c298 <__unordsf2+0xc> 3c2b0: 07 f8 bld r0, 7 3c2b2: 0f 92 push r0 3c2b4: e8 94 clt 3c2b6: 2b e3 ldi r18, 0x3B ; 59 3c2b8: 3a ea ldi r19, 0xAA ; 170 3c2ba: 48 eb ldi r20, 0xB8 ; 184 3c2bc: 5f e7 ldi r21, 0x7F ; 127 3c2be: 0f 94 f3 d6 call 0x3ade6 ; 0x3ade6 <__mulsf3_pse> 3c2c2: 0f 92 push r0 3c2c4: 0f 92 push r0 3c2c6: 0f 92 push r0 3c2c8: 4d b7 in r20, 0x3d ; 61 3c2ca: 5e b7 in r21, 0x3e ; 62 3c2cc: 0f 92 push r0 3c2ce: 0f 94 f0 e1 call 0x3c3e0 ; 0x3c3e0 3c2d2: ee e2 ldi r30, 0x2E ; 46 3c2d4: f1 e7 ldi r31, 0x71 ; 113 3c2d6: 0f 94 43 df call 0x3be86 ; 0x3be86 <__fp_powser> 3c2da: 4f 91 pop r20 3c2dc: 5f 91 pop r21 3c2de: ef 91 pop r30 3c2e0: ff 91 pop r31 3c2e2: e5 95 asr r30 3c2e4: ee 1f adc r30, r30 3c2e6: ff 1f adc r31, r31 3c2e8: 49 f0 breq .+18 ; 0x3c2fc 3c2ea: fe 57 subi r31, 0x7E ; 126 3c2ec: e0 68 ori r30, 0x80 ; 128 3c2ee: 44 27 eor r20, r20 3c2f0: ee 0f add r30, r30 3c2f2: 44 1f adc r20, r20 3c2f4: fa 95 dec r31 3c2f6: e1 f7 brne .-8 ; 0x3c2f0 3c2f8: 41 95 neg r20 3c2fa: 55 0b sbc r21, r21 3c2fc: 0f 94 3f e0 call 0x3c07e ; 0x3c07e 3c300: 0f 90 pop r0 3c302: 07 fe sbrs r0, 7 3c304: 0d 94 33 e0 jmp 0x3c066 ; 0x3c066 3c308: 08 95 ret 0003c30a <__fp_norm2>: 3c30a: 91 50 subi r25, 0x01 ; 1 3c30c: 50 40 sbci r21, 0x00 ; 0 3c30e: 66 0f add r22, r22 3c310: 77 1f adc r23, r23 3c312: 88 1f adc r24, r24 3c314: d2 f7 brpl .-12 ; 0x3c30a <__fp_norm2> 3c316: 08 95 ret 0003c318 <__fp_powsodd>: 3c318: 9f 93 push r25 3c31a: 8f 93 push r24 3c31c: 7f 93 push r23 3c31e: 6f 93 push r22 3c320: ff 93 push r31 3c322: ef 93 push r30 3c324: 9b 01 movw r18, r22 3c326: ac 01 movw r20, r24 3c328: 0f 94 dd d6 call 0x3adba ; 0x3adba <__mulsf3> 3c32c: ef 91 pop r30 3c32e: ff 91 pop r31 3c330: 0f 94 43 df call 0x3be86 ; 0x3be86 <__fp_powser> 3c334: 2f 91 pop r18 3c336: 3f 91 pop r19 3c338: 4f 91 pop r20 3c33a: 5f 91 pop r21 3c33c: 0d 94 dd d6 jmp 0x3adba ; 0x3adba <__mulsf3> 3c340: 16 f0 brts .+4 ; 0x3c346 <__fp_powsodd+0x2e> 3c342: 0d 94 35 df jmp 0x3be6a ; 0x3be6a <__fp_mpack> 3c346: 0d 94 50 d7 jmp 0x3aea0 ; 0x3aea0 <__fp_nan> 3c34a: 68 94 set 3c34c: 0d 94 4a d7 jmp 0x3ae94 ; 0x3ae94 <__fp_inf> 0003c350 : 3c350: 0f 94 7a d7 call 0x3aef4 ; 0x3aef4 <__fp_splitA> 3c354: a8 f3 brcs .-22 ; 0x3c340 <__fp_powsodd+0x28> 3c356: 99 23 and r25, r25 3c358: c1 f3 breq .-16 ; 0x3c34a <__fp_powsodd+0x32> 3c35a: ae f3 brts .-22 ; 0x3c346 <__fp_powsodd+0x2e> 3c35c: df 93 push r29 3c35e: cf 93 push r28 3c360: 1f 93 push r17 3c362: 0f 93 push r16 3c364: ff 92 push r15 3c366: c9 2f mov r28, r25 3c368: dd 27 eor r29, r29 3c36a: 88 23 and r24, r24 3c36c: 2a f0 brmi .+10 ; 0x3c378 3c36e: 21 97 sbiw r28, 0x01 ; 1 3c370: 66 0f add r22, r22 3c372: 77 1f adc r23, r23 3c374: 88 1f adc r24, r24 3c376: da f7 brpl .-10 ; 0x3c36e 3c378: 20 e0 ldi r18, 0x00 ; 0 3c37a: 30 e0 ldi r19, 0x00 ; 0 3c37c: 40 e8 ldi r20, 0x80 ; 128 3c37e: 5f eb ldi r21, 0xBF ; 191 3c380: 9f e3 ldi r25, 0x3F ; 63 3c382: 88 39 cpi r24, 0x98 ; 152 3c384: 20 f0 brcs .+8 ; 0x3c38e 3c386: 80 3e cpi r24, 0xE0 ; 224 3c388: 38 f0 brcs .+14 ; 0x3c398 3c38a: 21 96 adiw r28, 0x01 ; 1 3c38c: 8f 77 andi r24, 0x7F ; 127 3c38e: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3c392: e6 e5 ldi r30, 0x56 ; 86 3c394: f1 e7 ldi r31, 0x71 ; 113 3c396: 04 c0 rjmp .+8 ; 0x3c3a0 3c398: 0f 94 38 dd call 0x3ba70 ; 0x3ba70 <__addsf3> 3c39c: e3 e8 ldi r30, 0x83 ; 131 3c39e: f1 e7 ldi r31, 0x71 ; 113 3c3a0: 0f 94 43 df call 0x3be86 ; 0x3be86 <__fp_powser> 3c3a4: 8b 01 movw r16, r22 3c3a6: be 01 movw r22, r28 3c3a8: ec 01 movw r28, r24 3c3aa: fb 2e mov r15, r27 3c3ac: 6f 57 subi r22, 0x7F ; 127 3c3ae: 71 09 sbc r23, r1 3c3b0: 75 95 asr r23 3c3b2: 77 1f adc r23, r23 3c3b4: 88 0b sbc r24, r24 3c3b6: 99 0b sbc r25, r25 3c3b8: 0f 94 9e d6 call 0x3ad3c ; 0x3ad3c <__floatsisf> 3c3bc: 28 e1 ldi r18, 0x18 ; 24 3c3be: 32 e7 ldi r19, 0x72 ; 114 3c3c0: 41 e3 ldi r20, 0x31 ; 49 3c3c2: 5f e3 ldi r21, 0x3F ; 63 3c3c4: 0f 94 f0 d6 call 0x3ade0 ; 0x3ade0 <__mulsf3x> 3c3c8: af 2d mov r26, r15 3c3ca: 98 01 movw r18, r16 3c3cc: ae 01 movw r20, r28 3c3ce: ff 90 pop r15 3c3d0: 0f 91 pop r16 3c3d2: 1f 91 pop r17 3c3d4: cf 91 pop r28 3c3d6: df 91 pop r29 3c3d8: 0f 94 4f dd call 0x3ba9e ; 0x3ba9e <__addsf3x> 3c3dc: 0d 94 61 d7 jmp 0x3aec2 ; 0x3aec2 <__fp_round> 0003c3e0 : 3c3e0: fa 01 movw r30, r20 3c3e2: dc 01 movw r26, r24 3c3e4: aa 0f add r26, r26 3c3e6: bb 1f adc r27, r27 3c3e8: 9b 01 movw r18, r22 3c3ea: ac 01 movw r20, r24 3c3ec: bf 57 subi r27, 0x7F ; 127 3c3ee: 28 f4 brcc .+10 ; 0x3c3fa 3c3f0: 22 27 eor r18, r18 3c3f2: 33 27 eor r19, r19 3c3f4: 44 27 eor r20, r20 3c3f6: 50 78 andi r21, 0x80 ; 128 3c3f8: 20 c0 rjmp .+64 ; 0x3c43a 3c3fa: b7 51 subi r27, 0x17 ; 23 3c3fc: 90 f4 brcc .+36 ; 0x3c422 3c3fe: ab 2f mov r26, r27 3c400: 00 24 eor r0, r0 3c402: 46 95 lsr r20 3c404: 37 95 ror r19 3c406: 27 95 ror r18 3c408: 01 1c adc r0, r1 3c40a: a3 95 inc r26 3c40c: d2 f3 brmi .-12 ; 0x3c402 3c40e: 00 20 and r0, r0 3c410: 71 f0 breq .+28 ; 0x3c42e 3c412: 22 0f add r18, r18 3c414: 33 1f adc r19, r19 3c416: 44 1f adc r20, r20 3c418: b3 95 inc r27 3c41a: da f3 brmi .-10 ; 0x3c412 3c41c: 0e d0 rcall .+28 ; 0x3c43a 3c41e: 0d 94 37 dd jmp 0x3ba6e ; 0x3ba6e <__subsf3> 3c422: 61 30 cpi r22, 0x01 ; 1 3c424: 71 05 cpc r23, r1 3c426: a0 e8 ldi r26, 0x80 ; 128 3c428: 8a 07 cpc r24, r26 3c42a: b9 46 sbci r27, 0x69 ; 105 3c42c: 30 f4 brcc .+12 ; 0x3c43a 3c42e: 9b 01 movw r18, r22 3c430: ac 01 movw r20, r24 3c432: 66 27 eor r22, r22 3c434: 77 27 eor r23, r23 3c436: 88 27 eor r24, r24 3c438: 90 78 andi r25, 0x80 ; 128 3c43a: 30 96 adiw r30, 0x00 ; 0 3c43c: 21 f0 breq .+8 ; 0x3c446 3c43e: 20 83 st Z, r18 3c440: 31 83 std Z+1, r19 ; 0x01 3c442: 42 83 std Z+2, r20 ; 0x02 3c444: 53 83 std Z+3, r21 ; 0x03 3c446: 08 95 ret 0003c448 : 3c448: 91 11 cpse r25, r1 3c44a: 08 95 ret 3c44c: 81 54 subi r24, 0x41 ; 65 3c44e: 8a 51 subi r24, 0x1A ; 26 3c450: 08 f4 brcc .+2 ; 0x3c454 3c452: 80 5e subi r24, 0xE0 ; 224 3c454: 85 5a subi r24, 0xA5 ; 165 3c456: 08 95 ret 0003c458 : 3c458: fb 01 movw r30, r22 3c45a: dc 01 movw r26, r24 3c45c: 04 c0 rjmp .+8 ; 0x3c466 3c45e: 8d 91 ld r24, X+ 3c460: 01 90 ld r0, Z+ 3c462: 80 19 sub r24, r0 3c464: 21 f4 brne .+8 ; 0x3c46e 3c466: 41 50 subi r20, 0x01 ; 1 3c468: 50 40 sbci r21, 0x00 ; 0 3c46a: c8 f7 brcc .-14 ; 0x3c45e 3c46c: 88 1b sub r24, r24 3c46e: 99 0b sbc r25, r25 3c470: 08 95 ret 0003c472 : 3c472: fb 01 movw r30, r22 3c474: dc 01 movw r26, r24 3c476: 02 c0 rjmp .+4 ; 0x3c47c 3c478: 01 90 ld r0, Z+ 3c47a: 0d 92 st X+, r0 3c47c: 41 50 subi r20, 0x01 ; 1 3c47e: 50 40 sbci r21, 0x00 ; 0 3c480: d8 f7 brcc .-10 ; 0x3c478 3c482: 08 95 ret 0003c484 : 3c484: dc 01 movw r26, r24 3c486: 01 c0 rjmp .+2 ; 0x3c48a 3c488: 6d 93 st X+, r22 3c48a: 41 50 subi r20, 0x01 ; 1 3c48c: 50 40 sbci r21, 0x00 ; 0 3c48e: e0 f7 brcc .-8 ; 0x3c488 3c490: 08 95 ret 0003c492 : 3c492: fb 01 movw r30, r22 3c494: dc 01 movw r26, r24 3c496: 8d 91 ld r24, X+ 3c498: 81 34 cpi r24, 0x41 ; 65 3c49a: 1c f0 brlt .+6 ; 0x3c4a2 3c49c: 8b 35 cpi r24, 0x5B ; 91 3c49e: 0c f4 brge .+2 ; 0x3c4a2 3c4a0: 80 5e subi r24, 0xE0 ; 224 3c4a2: 61 91 ld r22, Z+ 3c4a4: 61 34 cpi r22, 0x41 ; 65 3c4a6: 1c f0 brlt .+6 ; 0x3c4ae 3c4a8: 6b 35 cpi r22, 0x5B ; 91 3c4aa: 0c f4 brge .+2 ; 0x3c4ae 3c4ac: 60 5e subi r22, 0xE0 ; 224 3c4ae: 86 1b sub r24, r22 3c4b0: 61 11 cpse r22, r1 3c4b2: 89 f3 breq .-30 ; 0x3c496 3c4b4: 99 0b sbc r25, r25 3c4b6: 08 95 ret 0003c4b8 : 3c4b8: fb 01 movw r30, r22 3c4ba: dc 01 movw r26, r24 3c4bc: 0d 90 ld r0, X+ 3c4be: 00 20 and r0, r0 3c4c0: e9 f7 brne .-6 ; 0x3c4bc 3c4c2: 11 97 sbiw r26, 0x01 ; 1 3c4c4: 01 90 ld r0, Z+ 3c4c6: 0d 92 st X+, r0 3c4c8: 00 20 and r0, r0 3c4ca: e1 f7 brne .-8 ; 0x3c4c4 3c4cc: 08 95 ret 0003c4ce : 3c4ce: fc 01 movw r30, r24 3c4d0: 81 91 ld r24, Z+ 3c4d2: 86 17 cp r24, r22 3c4d4: 21 f0 breq .+8 ; 0x3c4de 3c4d6: 88 23 and r24, r24 3c4d8: d9 f7 brne .-10 ; 0x3c4d0 3c4da: 99 27 eor r25, r25 3c4dc: 08 95 ret 3c4de: 31 97 sbiw r30, 0x01 ; 1 3c4e0: cf 01 movw r24, r30 3c4e2: 08 95 ret 0003c4e4 : 3c4e4: fb 01 movw r30, r22 3c4e6: dc 01 movw r26, r24 3c4e8: 8d 91 ld r24, X+ 3c4ea: 01 90 ld r0, Z+ 3c4ec: 80 19 sub r24, r0 3c4ee: 01 10 cpse r0, r1 3c4f0: d9 f3 breq .-10 ; 0x3c4e8 3c4f2: 99 0b sbc r25, r25 3c4f4: 08 95 ret 0003c4f6 : 3c4f6: fb 01 movw r30, r22 3c4f8: dc 01 movw r26, r24 3c4fa: 01 90 ld r0, Z+ 3c4fc: 0d 92 st X+, r0 3c4fe: 00 20 and r0, r0 3c500: e1 f7 brne .-8 ; 0x3c4fa 3c502: 08 95 ret 0003c504 : 3c504: fb 01 movw r30, r22 3c506: dc 01 movw r26, r24 3c508: 41 50 subi r20, 0x01 ; 1 3c50a: 50 40 sbci r21, 0x00 ; 0 3c50c: 30 f0 brcs .+12 ; 0x3c51a 3c50e: 8d 91 ld r24, X+ 3c510: 01 90 ld r0, Z+ 3c512: 80 19 sub r24, r0 3c514: 19 f4 brne .+6 ; 0x3c51c 3c516: 00 20 and r0, r0 3c518: b9 f7 brne .-18 ; 0x3c508 3c51a: 88 1b sub r24, r24 3c51c: 99 0b sbc r25, r25 3c51e: 08 95 ret 0003c520 : 3c520: fb 01 movw r30, r22 3c522: dc 01 movw r26, r24 3c524: 41 50 subi r20, 0x01 ; 1 3c526: 50 40 sbci r21, 0x00 ; 0 3c528: 48 f0 brcs .+18 ; 0x3c53c 3c52a: 01 90 ld r0, Z+ 3c52c: 0d 92 st X+, r0 3c52e: 00 20 and r0, r0 3c530: c9 f7 brne .-14 ; 0x3c524 3c532: 01 c0 rjmp .+2 ; 0x3c536 3c534: 1d 92 st X+, r1 3c536: 41 50 subi r20, 0x01 ; 1 3c538: 50 40 sbci r21, 0x00 ; 0 3c53a: e0 f7 brcc .-8 ; 0x3c534 3c53c: 08 95 ret 0003c53e : 3c53e: 0f 93 push r16 3c540: 1f 93 push r17 3c542: cf 93 push r28 3c544: df 93 push r29 3c546: e0 91 1b 18 lds r30, 0x181B ; 0x80181b <__iob+0x2> 3c54a: f0 91 1c 18 lds r31, 0x181C ; 0x80181c <__iob+0x3> 3c54e: 23 81 ldd r18, Z+3 ; 0x03 3c550: ec 01 movw r28, r24 3c552: 10 e0 ldi r17, 0x00 ; 0 3c554: 00 e0 ldi r16, 0x00 ; 0 3c556: 21 fd sbrc r18, 1 3c558: 08 c0 rjmp .+16 ; 0x3c56a 3c55a: 0f ef ldi r16, 0xFF ; 255 3c55c: 1f ef ldi r17, 0xFF ; 255 3c55e: 14 c0 rjmp .+40 ; 0x3c588 3c560: 19 95 eicall 3c562: 89 2b or r24, r25 3c564: 11 f0 breq .+4 ; 0x3c56a 3c566: 0f ef ldi r16, 0xFF ; 255 3c568: 1f ef ldi r17, 0xFF ; 255 3c56a: 89 91 ld r24, Y+ 3c56c: 60 91 1b 18 lds r22, 0x181B ; 0x80181b <__iob+0x2> 3c570: 70 91 1c 18 lds r23, 0x181C ; 0x80181c <__iob+0x3> 3c574: db 01 movw r26, r22 3c576: 18 96 adiw r26, 0x08 ; 8 3c578: ed 91 ld r30, X+ 3c57a: fc 91 ld r31, X 3c57c: 81 11 cpse r24, r1 3c57e: f0 cf rjmp .-32 ; 0x3c560 3c580: 8a e0 ldi r24, 0x0A ; 10 3c582: 19 95 eicall 3c584: 89 2b or r24, r25 3c586: 49 f7 brne .-46 ; 0x3c55a 3c588: c8 01 movw r24, r16 3c58a: df 91 pop r29 3c58c: cf 91 pop r28 3c58e: 1f 91 pop r17 3c590: 0f 91 pop r16 3c592: 08 95 ret 0003c594 <__do_global_dtors>: 3c594: 16 e5 ldi r17, 0x56 ; 86 3c596: cd e4 ldi r28, 0x4D ; 77 3c598: d6 e5 ldi r29, 0x56 ; 86 3c59a: 00 e0 ldi r16, 0x00 ; 0 3c59c: 06 c0 rjmp .+12 ; 0x3c5aa <__do_global_dtors+0x16> 3c59e: 80 2f mov r24, r16 3c5a0: fe 01 movw r30, r28 3c5a2: 0f 94 20 dd call 0x3ba40 ; 0x3ba40 <__tablejump2__> 3c5a6: 21 96 adiw r28, 0x01 ; 1 3c5a8: 01 1d adc r16, r1 3c5aa: ce 34 cpi r28, 0x4E ; 78 3c5ac: d1 07 cpc r29, r17 3c5ae: 80 e0 ldi r24, 0x00 ; 0 3c5b0: 08 07 cpc r16, r24 3c5b2: a9 f7 brne .-22 ; 0x3c59e <__do_global_dtors+0xa> 3c5b4: f8 94 cli 0003c5b6 <__stop_program>: 3c5b6: ff cf rjmp .-2 ; 0x3c5b6 <__stop_program>